28 авг. 2016 г.
Только до 9 сентября Embarcadero раздает Delphi 10.1 Starter Edition бесплатно. Не триал и не демо версия, а полностью рабочий продукт с серийным номером.
Labels:
Delphi
8 авг. 2016 г.
Байдарки 2016
Добавили Нарочанку и Вилию в нашу походную коллекцию.
В этом году нам повезло с погодой. Немного дождя в первый день и замечательная солнечная погода во второй и третий.
Традиционное фото на память.
И не менее традиционные благодарности агентству Вольны Вецер за прекрасную организацию.
В этом году нам повезло с погодой. Немного дождя в первый день и замечательная солнечная погода во второй и третий.
Традиционное фото на память.
И не менее традиционные благодарности агентству Вольны Вецер за прекрасную организацию.
2 авг. 2016 г.
GS.MulDiv
Для правильного округления введена функция MulDiv, которая доступна из макросов и из FastReport4. Теперь, вместо кода:
'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = round(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate) / 1000 + 1/100000, 3)
пишем:
'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = GS.MulDiv(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate), 1, 1000, 1, 3)
Labels:
полезное,
программирование,
documentation,
vbscript
3 июл. 2016 г.
GetNumeral, GetCurrNumeral
С копейками, без копеек, числом, строкой, с полным названием, с кратким названием... Число функций для преобразования дошло до пяти и каждую надо трижды прописать: для макросов, для фаст репорта 2, для фаст репорта 4. Пришло время навести порядок. Встречайте две универсальные функции для преобразования числа в числительное:
Функции доступны в макросах и четвертом фаст репорте.
Labels:
документация
15 июн. 2016 г.
Чем хороши радикальные изменения законодательства -- в офис наведываются давние и очень давние пользователи наших программ. На днях заглянул Евгений Александрович Кучерявенко, один из первых покупателей, пользователь Анжелики, а затем и Гедымина с 1996 года!
Стараниями Евгения Александровича все хозяйства Ивановского района систему полной автоматизации учета с/х предприятия, включая животноводство и растениеводство.
8 июн. 2016 г.
Несколько простых правил одновременной работы над проектом в гит
-
Как можно чаще выполнять git pull для загрузки себе изменений, произведенных другими разработчиками.
При работе в отдельной ветви, из которой позже изменения будут переданы в основную, регулярно выполнять git fetch, затем git merge master.
При возникновении конфликтов принимаем чужие изменения (Accept theirs -- в Tortoise Git) и вносим в них свои правки.
Если автоматический merge не прошел из-за конфликта, то, после его разрешения, на комите, будет показан список измененных файлов как нами, так и другими разработчиками. Если мы работаем с Tortoise Git ни в коем случае нельзя снимать галки с файлов (даже если лично мы их не меняли), иначе изменения других людей пропадут и в репозиторий запишется файл в том состоянии, в котором он был у нас на диске до merge.
Labels:
Git
7 июн. 2016 г.
Ветви Cash & Check
Две ветви добавлены в репозиторий gedemin-apps для текущей разработки проектов POSitive:Cash и POSitive:Check. Здесь будут находиться новейшие версии. После тестирования изменения будут скидываться в ветку master из которой у нас сейчас еженочно формируются дистрибутивы.
Посмотреть какие ветки присутствуют локально на компьютере:
git branch
Добавить и переключиться на локальную ветку cash, связать ее с веткой в центральном репозитории:
git checkout -b cash --track origin/cash
Переключиться на ветку master:
git checkout master
Переключиться на ветку cash:
git checkout cash
Получить изменения с сервера в локальную базу данных. Файлы изменены не будут!
git fetch
Применить полученные изменения из удаленной ветки к локальным файлам в текущей ветке:
git merge
Два предыдущих действия одной командой:
git pull
Если ругнется, что локальная ветка не привязана к ветке в удаленном репозитории, то:
git branch --set-upstream-to=origin/cash cash
После чего делаем pull.
Мы в ветке cash. Принимаем изменения из ветки master:
git merge master
ВАЖНО! При возникновении конфликтов принять изменения другой стороны и внести свои коррективы.
Изменили некоторые файлы. Сохраняем изменения в локальном хранилище:
git commit -a -m "some changes were made"
Отправляем изменения в центральный репозиторий:
git push
После того, как изменения в ветке cash протестированы, отправляем их в ветку master:
git checkout master
git merge cash
git commit -a -m "New cash version"
git push
Labels:
исходный код,
Git
14 мая 2016 г.
True UTF-8 encoding
XML файл в кодировке UTF-8 можно сформировать используя только ASCII и кодируя все национальные символы через � последовательности. Дешево и сердито. Например, такой подход предложен здесь.
Но, если мы хотим, чтобы XML файл красиво отображался в текстовом редакторе, системе контроля версий и т.п., надо сохранить его в настоящей кодировке UTF-8. Для этого мы добавили в платформу функции WIN1251ToUTF8 и UTF8ToWIN1251, которые принимают на вход два потока и перекодируют данные между ними. В дополнение к ним идут функции ReplaceXMLTags и ExpandXMLTags.
Пример использования см. здесь.
Labels:
полезное,
documentation,
vbscript,
XML
12 мая 2016 г.
Деноминация 2016. Технические аспекты
Мы подготовили инструкцию для наших клиентов по деноминированию базы данных. Технически нет возможности хранить в рамках одной базы данных суммы в старых и новых рублях. Поэтому в определенный момент времени база должна быть деноминирована, т.е. с помощью специальной утилиты все денежные значения в базе данных должны быть разделены на 10 000. С этого момента, все суммы, вне зависимости от периода времени к которому они относятся, будут храниться в деноминированных рублях.
В отличие от конкурирующих решений наш подход сохраняет всю историю, весь документооборот предприятия до 1 июля.
Первая проблема, которая возникает, это возможная потеря точности. Платформа использует тип Currency, который позволяет обрабатывать денежные величины с точностью до 4-го знака после запятой. После деноминации 0.0001 в новых деньгах будет соответствовать 1-му старому рублю. Все что меньше рубля потеряется (округлится по правилам математического округления). Хотя 1 неденоминированный рубль очень маленькая величина (коробок спичек сейчас стоит 400 рублей) можно представить базу данных, где мелкий товар учитывается поштучно и цена единицы содержит копейки -- пуговицы, швейные иголки, болты, гайки и т.п. Мы рекомендуем в таком случае провести на 30 июня 2016 г. переоценку товара, округлив учетные цены до целых рублей.
Вторая проблема -- округление до целого числа в скрипт-функциях и отчетных формах через вызов функций Round, Int, Fix, CLng, CInt или обращение к полю через свойство AsInteger. Мы внесем исправления в типовые прикладные решения, но решить задачу в общем случае, анализируя программный код и автоматически заменяя вызовы функций нам не представляется возможным. Единственный путь -- заранее создать копию рабочей базы данных, деноминировать ее и затем тестировать на ней все режимы работы и устранять выявленные проблемы.
Третья проблема заключается в том, что бухгалтерия предприятия до 20 июля производит закрытие июня и второго квартала. При этом вносятся и/или корректируются документы прошлых периодов, закрываются транзитные счета, выполняется трансформация баланса, рассчитываются промежуточные показатели и налоги. Согласно методическим разъяснениям налоговые декларации за июнь подаются в неденоминированных рублях.
Мы видим такое решение данной проблемы: предприятие продолжает после 1 июля вести учет в неденоминированных рублях при этом, непосредственно в печатных формах товарных накладных, денежные величины делятся на 10 000; суммы, поступающие из системы банк-клиент умножаются на 10 000, соответственно, суммы, уходящие в банк-клиент, делятся на 10 000; входящие накладные умножаются на 10 000 и т.д. После того, как налоговые декларации будут сданы можно будет проводить деноминацию базы данных и переходить на учет в деноминированных рублях.
Малое предприятие, при надлежащей подготовке в июне месяце, вполне может выполнить закрытие в самых первых числах июля и, таким образом, избежать промежуточного периода учета в старых и новых рублях.
Деноминация базы данных производится с помощью отдельной утилиты dnmn.exe, которая предоставляется клиентам на абонентском обслуживании. Мы обработали несколько десятков баз данных и сформировали список полей для деноминации. Если на вашем предприятии используются частные решения, то перед запуском процесса следует добавить нужные поля в список деноминируемых.
Labels:
база данных,
утилиты
9 мая 2016 г.
Прямой доступ к DBF файлам
Устав бороться с "тормозами" и ошибками стандартных ODBC драйверов для доступа к DBF файлам мы включили компонент TDBF в исходный код Гедымина. Пример использования можно посмотреть тут.
Точных замеров и сравнений не проводили, но "на глаз" переход на встроенный компонент ускорил у одного из наших клиентов обработку больших массивов данных раза в три.
Labels:
база данных,
оптимизация,
полезное,
производительность
26 апр. 2016 г.
Сохранить имя пользователя и пароль в Git
При работе с приватными репозиториями github, при выполнении операция pull/push git будет постоянно запрашивать имя пользователя и пароль. Заставить систему запомнить введенные один раз значения можно следующим образом:
1. Переходим в окно командной строки, в папку с исходниками
2. Выполняем:
git config credential.helper store
git pull
Username: type your username
Password: type your password
При последующих операциях имя пользователя и пароль вводить уже не надо.
Labels:
Git
24 апр. 2016 г.
Задание на неделю #1. Firebird 3
На этой неделе произошло событие, которого мы с нетерпением ждали шесть долгих лет -- вышла третья версия сервера Firebird. В двух словах предыстория такова: Interbase, от которого в 2000-м году отпочковался Firebird, был задуман в те времена, когда многопроцессорные системы с десятками гигабайт оперативной памяти встречались разве что в фантастических рассказах. Когда же научно-технический прогресс догнал и перегнал самые смелые фантазии, именно внутренняя архитектура сервера стала основным тормозом. По сути, в многопользовательском сценарии у системного администратора было два выбора: или использовать оперативную память для кэширования данных, но тогда запросы из всех подключений будут выполняться только на одном процессоре/ядре (архитектура SuperServer), или задействовать все процессоры/ядра, но тогда не будет общего кэша и скорость будет зависеть от производительности дисковой подсистемы (архитектура Classic). Тот случай, когда хрен редьки не слаще.
Изменения в архитектуре SuperServer движка Firebird 3 теперь позволяют последнему выполнять запросы сетевых клиентов параллельно на разных процессорах/ядрах, при доступе к общему кэшу, что теоретически делает SuperServer выбором по умолчанию при развертывании системы на предприятии. Как оно получится на практике -- зависит от надежности тройки. В начале 2000-х мы перевели всех клиентов с SuperServer на Classic по двум причинам: падение процесса SuperServer означает обрыв всех коннектов и потерю данных во всех открытых транзакциях у сетевых пользователей; выполнение тяжелого запроса одним из клиентов практически парализует работу всех остальных.
У одного нашего клиента база данных имеет размер 50 Гб, количество одновременных подключений 50-60, на сервере 128 Гб оперативной памяти и 20 физических ядер. План: использовать SuperServer, установить кэш размером 50 Гб и выделить под буфер сортировки 32 Гб. Учитывая, что дисковая подсистема построена на RAID контроллере с 2 Гб энергонезависимой памяти, теоретически, это позволит вообще исключить прямое обращение к дискам. Т.е. производительность сервера базы данных будет определяться процессором, памятью и скоростью обмена с RAID контроллером.
Напомним, что именно производительность дисковой подсистемы всегда возглавляла список факторов, влияющих на общую производительность СУБД. Мы ожидаем ускорения выполнения запросов минимум на порядок. О достигнутых результатах напишем в этом блоге.
Практически все нововведения из третьей версии найдут применение в Гедымине:
-
Передача НУЛЛ значений по сети битовой маской.
Сейчас каждое поле с НУЛЛ значением занимает при передаче 4 байта + длина поля. Например, в таблице с бухгалтерскими проводками у нас десятки полей-аналитических признаков, которые могут быть не заполнены. Экономия может достигать нескольких сотен байт на каждую запись.
Возможность увеличить TCP буфер до 32 Кб и применить компрессию данных при передаче.
В интернете есть свидетельства о том, что скорость возрастает десятикратно при подключении по сетям с большой латентностью. Например, к серверу в удаленном офисе по VPN каналу.
Шифрование файла базы данных. Теперь злоумышленник не сможет получить доступ к конфиденциальной информации просто переписав файл на сервер с чистой установкой Firebird и известным паролем к учетной записи SYSDBA.
Window функции в SQL запросах позволяют объединять вместе данные и агрегатные значения по заданным группам этих данных. До Firebird 3 такую задачу можно было решить либо подзапросами (крайне медленно, так как подзапрос будет выполняться для каждой записи), либо выполнением в цикле отдельных запросов для каждой группы и объединением их результатов в единый набор данных с помощью EXECUTE BLOCK или STORED PROCEDURE, либо алгоритмической обработкой на клиенте (например, внутри Fast Report при построении отчета).
“Linger” Database Closure for Superserver -- период времени, в течение которого сервер сохраняет в памяти все ресурсы, после закрытия последнего подключения к базе данных -- позволит ускорить загрузку пакета пространств имен, так как переподключение к базе данных выполняется после каждого ПИ, содержащего метаданные.
DDL триггеры позволят отказаться от выполнения процедуры at_p_sync при старте системы для синхронизации информации о структуре базы данных с содержимым AT_ таблиц.
Другие изменения и улучшения, на которых мы подробнее остановимся в следующих выпусках.
Labels:
безопасность,
идеи,
Firebird,
SQL,
Weekly
Подписаться на:
Сообщения (Atom)

