28 октября 2019

Delphi & PostgreSQL. Фиксим "character with byte sequence 0xcc 0x81 in encoding "UTF8" has no equivalent in encoding "WIN1251""

В логах моей программы появилась странная ошибка:
25.10.2019 10:01:24.523 Thread #5: character with byte sequence 0xcc 0x81 in encoding "UTF8" has no equivalent in encoding "WIN1251"
Первой мыслью было, что Elasticsearch не принял данные, которые я ему передал REST-запросом. Но запустив программу под отладкой я получил эту ошибку при открытии запроса к БД PostgreSQL:
Project XYZ.exe raised exception class EPgError with message 'character with byte sequence 0xcc 0x81 in encoding "UTF8" has no equivalent in encoding "WIN1251"'
Посмотрев в БД данные, я сначала из-за у-умлаут грешил на слово "Zürich". Но сохранив текст в двух вариантах в файл (UTF8 и ANSI) и сравнив их, я увидел, что разница была в "Дадаи́зм" и "Дадаи?зм". Таким образом врагом WIN1251 объявляю букву "и" с ударением!

Враг назначен, т.е. найден, теперь будем решать, что с ним делать.

24 октября 2019

PostgreSQL и часовой пояс


    Заметил, что у меня в базе данных на PostgreSQL, все поля, которые заполняются по умолчанию текущим временем (DEFAULT LOCALTIMESTAMP), отстают от реального времени на 10 часов. В 19:45 запрос
select localtimestamp, current_timestamp
вернул
"11.10.2019 9:45:56" "2019-10-11 09:45:56.884309-07"

20 октября 2019

"ё"... "е"... какая мне разница? Программа должна найти!

 Буква "ё" совсем не важна... Завтра похолодает и мы все передохнем от жары...

    Иногда я завидую англоязычным программистам. Например, на клавиатуре им не надо переключать раскладку. А ещё у них нет буквы "Ё"! Буква "Ё" - это очень своенравная особа. Она обязательна только в собственных именах, а в остальных случаях употребление "Ё" или "Е" определяется выбором автора текста. Но при этом пользователя, который ищет по тексту, не заботит, что написал автор - "Ё" или "Е". А какая ему разница? Программа должна найти!

15 октября 2019

Получение в программе значения первичного ключа после INSERT

    Часто бывает, что после добавления строки в таблицу необходимо получить сгенерированное в СУБД значение первичного ключа. Например, это необходимо для последующей вставки detail-данных. Самый "оригинальный" способ, что я видел: стартуем транзакцию, вызываем INSERT, делаем запрос "select MAX(ID) from table", вставляем detail-данные, коммитим... Но мы пойдем другим путем – без дополнительных запросов к базе данных. Мы воспользуемся вызовом оператора INSERT с модификатором RETURNING. Вопрос только в том, как получить в программе значение из RETURNING?

11 октября 2019

Требуется уборщик со знанием Borland Delphi

Я знал, что Беларусь – это ИТ-страна, но не думал, что на столько. Уже на вакансию уборщика офисных помещений в туристическом агентстве среди ключевых навыков называют: знание BPWin и Borland Delphi!

09 октября 2019

Работа с файлами формата MS Excel в программе под Linux

    Продолжая тему обработки файлов формата MS Excel в программах на Delphi, поговорим об их обработке в программе под Linux. Такую возможность программистам на Delphi предоставляет библиотека TMS FlexCel. Она позволяет работать с файлами формата MS Excel под всеми операционными системами, под которые Delphi умеет создавать исполняемый файл: Windows, Linux, Android и iOS.

04 октября 2019

Правильный обход матрицы

    В статье Романа Кунина "Оптимизация кода: память" рассмотрены две функции на C++, которые суммируют элементы матрицы. Они практически одинаковы, только первая функция обходит элементы матрицы по строкам, а вторая по столбцам. Проведем подобный тест на Delphi 7 и Delphi 10.3.2.
    В отличии от оригинального теста, в котором суммируют элементы матрицы я предлагаю еще измерить скорость заполнения матрицы.