Есть у меня маленькая написанная на Delphi утилита, которая, используя TNetHTTPClient POST-запросом, забирает с сайта заказчика справочники для тестирования нашей системы. Попытался я скачать новый справочник, а утилита вместо JSON'а с данными выдала мне ошибку "ENetHTTPCertificateException: Server Certificate Invalid or not present":
Я попробовал зайти на страницу сервиса браузером и получил сообщение "Сервер не может подтвердить связь с доменом заказчик.by. Срок действия его сертификата безопасности истек 33 дня назад.". Оказалось, что при его переводе с HTTP на HTTPS, что-то у них пошло не так...
Язык программирования самого высокого уровня содержит всего несколько команд для управления программистами
Показаны сообщения с ярлыком советы. Показать все сообщения
Показаны сообщения с ярлыком советы. Показать все сообщения
07 мая 2024
20 марта 2024
Задержка выполнения запроса в PostgreSQL
Обычно у меня спрашивают: "Как ускорить SQL-запрос?". Но недавно мой коллега сказал: "Для тестов с PostgreSQL мне необходимо замедлить мои запросы". Сразу я решил сам написать функцию, которая будет тормозить его запросы. Но в подобных ситуациях не спешите сразу хвататься за реализацию первой идеи. Всегда помните о богатой, иногда извращенной, фантазии разработчиков PostgreSQL. Оказывается, в PostgreSQL есть функция аналогичная функции Sleep из Win32 API, которая приостанавливает выполнение текущего потока программы на некоторое время.
11 марта 2024
Уменьшение размера виртуального диска Oracle VM VirtualBox
На одном из используемых мной компьютеров на жестком диске стало катастрофически не хватать места. Причиной этого были невероятно распухшие динамически распределяемые образы дисков виртуальных машин под управлением Oracle VM VirtualBox. При этом некоторые виртуальные машины использовали только 20-30% от выделенного им места. На них установлены различные версии СУБД, которые съедают много дискового пространства при заливке дампов в тестовые базы данных, но не отдают его обратно при удалении этих баз. Сначала я думал создать новые виртуальные машины, установить на них программное обеспечение и перелить нужные базы... Но мне стало лень делать столько работы, и я стал искать, как заставить VirtualBox вернуть неиспользуемое место операционной системе. Оказалось – это сделать очень просто.
27 ноября 2023
Ошибка ".exe is not a valid Win32 application" на старых версиях Windows
На прошлой неделе мне сказали, что 32-х битное консольное приложение, написанное на Delphi 11, не запускается под Windows 2003. Я не поверил. Поставил на виртуалку Delphi 11.3, сделал тестовое 32-х битное консольное приложение с одной строкой кода "Writeln('It works!')", попросил админа поднять древнюю виртуалку с Windows Server 2003, запустил на ней свое тестовое приложение и получил ошибку "temp.exe is not a valid Win32 application":
Как так? Ведь разработка десктопных приложений – это же конек Delphi!
17 апреля 2023
Конвертация данных при изменении типа столбца таблицы PostgreSQL
Изменение типа данных столбца таблицы в PostgreSQL делается с использованием команды ALTER TABLE в комбинации с ALTER COLUMN. Согласно документации эта операция "будет успешна, только если все существующие значения в столбце могут быть неявно приведены к новому типу". Но это не совсем верно. Например, мешают еще связанные с этим столбцом ограничения DEFAULT и CHECK, или несовместимость типов данных. Тип VARCHAR(4) можно легко сменить на CHAR(4) или наоборот, а попытка сменить на INTEGER приведет к ошибке. И эта ошибка будет даже для пустой таблицы.
04 апреля 2023
PostgreSQL. Корректировка следующего значения полей SMALLSERIAL, SERIAL и BIGSERIAL
У PostgreSQL, как и у многих других СУБД, есть возможность создавать в таблицах автоинкрементные столбцы. Для этого предназначены типы данных SMALLSERIAL, SERIAL и BIGSERIAL. К сожалению, авторы PostgreSQL не сделали никаких ограничений на прямую запись в столбцы этих типов. С одной стороны – это удобно. В таблицу можно записать данные, у которых уже есть значения для этого столбца. Но с другой стороны – это большая проблема. Такие действия могут привести к дублированию или к ошибке, когда позже при обычной вставке новой записи в таблицу СУБД попытается заполнить поле автоматически. Для сравнения, можно привести как продуманно это реализовано в MS SQL Server. Что бы записать значение в столбец, помеченный как IDENTITY, нужно это разрешить специальной командой "SET IDENTITY_INSERT": вызываем "SET IDENTITY_INSERT имя_таблицы ON", вставляем нужные записи и вызываем "SET IDENTITY_INSERT имя_таблицы OFF". При этом СУБД сама скорректирует текущее значение счетчика на максимальное значение столбца. Для PostgreSQL эту корректировку надо произвести вручную.
29 марта 2023
MS SQL Server. Управление контекстом безопасности подключения к связанным серверам
Механизм связанных серверов MS SQL Server позволяет реализовать распределенные базы данных, которые работают с данными в других базах данных. "Связаться" можно с любым источником данных, для которого существует возможность подключения к нему с использованием OLE DB. Есть два шага обеспечения безопасности при подключении к удаленной базе данных связанного сервера:
- сопоставить имена пользователей локального сервера MS SQL Server с именами пользователей удаленного сервера;
- указать, как связанный сервер должен обрабатывать подключение пользователей, имена которых не сопоставлены.
12 сентября 2022
Проблема с цветом контролов в дизайнере VCL-форм Delphi 11.2
При одном из первых запусков Delphi 11.2 Alexandria меня ждал неприятный сюрприз – изменение цвета контрола не работает в design-time. Например, бросаем на форму memo, меняем его свойство Color с clWindow на clRed и никого эффекта – цвет memo не изменился. Запускаем проект и видим memo красного цвета. Значит в run-time подобной проблемы нет.
И это оказывается не баг! Причина такого поведения дизайнера форм – постоянное желание разработчиков RAD Studio улучить поддержку High DPI.
И это оказывается не баг! Причина такого поведения дизайнера форм – постоянное желание разработчиков RAD Studio улучить поддержку High DPI.
21 октября 2021
FireDAC vs UniDAC. Получение значения первичного ключа новой строки
Два года тому назад я писал о получении в программе значения первичного ключа, который сгенерирован СУБД при добавлении новой строки в таблицу. Мои примеры вызова INSERT с модификатором RETURNING (или OUTPUT в случае MS SQL Server) были с использованием библиотеки для доступа к базам данных UniDAC. Давайте посмотрим, как реализована эта возможность в библиотеке FireDAC, которая уже много лет входит в поставку Delphi и C++Builder.
15 октября 2021
Запуск Delphi и C++Builder без Welcome Page
Страница приветствия в Delphi и C++Builder 11 Alexandria стала более удобной. Но все равно ее наличие при загрузке IDE нравится не всем программистам. Есть, как минимум, два способа запустить Delphi и C++Builder без страницы приветствия.
22 сентября 2021
MS SQL Server. Получение из файловой системы списка папок и файлов
Иногда работа с базами данных подкидывает не стандартные задачи. Например, недавно мне в скрипте MS SQL Server понадобилось получить из файловой системы список папок и файлов. Мои попытки сделать это через объект Scripting.FileSystemObject потерпели неудачу. Его метод GetFolder по имени папки возвращает объект Folder, у которого есть свойства SubFolders/Files содержащее списки вложенных папок и файлов. Но проблема в том, что эти списки – это коллекции, элементы которых в VBA можно перебрать в цикле "For Each File in Folder.Files", а из скрипта T-SQL к их элементам можно обратиться только по имени папки/файла (exec sp_OAMethod @objItems, N'Item("FileName.txt")', @objItem out). То есть для получения списка папок и файлов объект Scripting.FileSystemObject не подходит. Поиск в интернете позволил мне сформулировать 4 различные способа решения этой задачи.
08 сентября 2021
Фиксим "There is insufficient system memory in resource pool 'internal' to run this query" при запуске MS SQL Server
Вчера MS SQL Server преподнес мне сюрприз. При создании новой базы данных он выдал ошибку "There is insufficient system memory in resource pool 'internal' to run this query" и "умер" – сервис SQL Server не запускался, а в ERRORLOG сыпались ошибки:
Msg 701, Level 17, State 130, Server XYZ, Line 1 There is insufficient system memory in resource pool 'internal' to run this query.
24 августа 2021
Работа с любыми структурами данных через DB-Aware контролы
DB-Aware контролы в Delphi значительно упрощают жизнь разработчикам GUI-программ работающих с базами данных. Они многое делают сами без написания кода – отображают данные, позволяют пользователям их модифицировать и сохраняют изменения в базу данных. Но, что делать, если данные хранятся не в базе данных, а в массиве, списке, объекте или какой-нибудь другой структуре? Можно воспользоваться "memory table" – потомком TDataSet, который хранит данные в памяти. Скопировать в него данные, отобразить, обработать и скопировать обратно. Вариантов таких "memory table" много: TClientDataSet, TFDMemTable из FireDAC, TkbmMemTable, TVirtualTable из UniDAC, TMemTableEh из EhLib... Но есть способ решить этот вопрос проще, без копирования данных туда-сюда.
19 августа 2021
Разделение по диагонали ячейки MS Excel с двумя значениями
Существует много способов разнообразить внешний вид таблицы в MS Excel. Например, иногда таблица может стать более наглядной, если в одной ячейке разместить сразу два значения, разделив ее по диагонали на две части. Одним из вариантов использования такой ячейки является шапка таблицы, в ячейке которой сразу два заголовка – для строк и для столбцов.
11 августа 2021
Использование нескольких шрифтов и цветов в одной ячейке MS Excel одновременно
Каждое слово или буква в ячейке MS Excel может иметь свой шрифт, стиль шрифта, цвет и размер. Это позволяет сделать таблицу более наглядной и удобочитаемой. Для подобного форматирования ячейки достаточно перевести ее в режим редактирования нажатием клавиши F2 или двойным кликом левой кнопки мыши, выделить нужный участок текста и поменять параметры его шрифта. Как это сделать программным способом?
03 августа 2021
Как снять защиту книги MS Excel не зная пароль?
MS Excel позволяет защитить структуру книги паролем, что запретит другим пользователям манипуляции с ее листами. Не зная пароль нельзя добавлять, перемещать, удалять, скрывать и переименовывать листы, а также просматривать скрытые ранее листы. Звучит красиво. Но защита книги очень ненадежна и ее легко можно снять тем же способом, как я снимал защиту с листа MS Excel.
28 июля 2021
Как определить реальную версию Windows?
WinAPI – это огромный монстр с неисчислимым количеством функций, которые запросто могут дублировать функционал друг друга. Это позволяет решить одну задачу различными способами. Так и для определения версии установленной на компьютере операционной системы существует несколько путей. Давайте посмотрим на сколько они эффективны.
24 июня 2021
Двойная подпись файла сертификатами SHA-1 и SHA-256
В 2016-м году Microsoft отказалась от сертификатов X.509 с использованием алгоритма криптографического хеширования SHA-1. Основанием для этого было то, что SHA-1 – это устаревший алгоритм, который специалисты по безопасности считают небезопасным. Старые версии Windows не только не попали под эти ограничения, но и работают только с сертификатами SHA-1 (Windows 2000 SP4, Windows XP SP3, Windows Vista SP2, Windows Server 2003 SP2, Windows Server 2008 SP2). Таким образом, если вы допускаете использование вашей программы на этих устаревших операционных системах, то вы должны подписать ее двумя алгоритмами – и SHA-1 и SHA-256.
18 июня 2021
Oracle. Строковая функция REVERSE
Недавно я перевел запрос с MS SQLServer на Oracle. Мне говорят: "не работает". Начал проверять. Оказалось, что если запрос по частям добавить в скрипт, то при его запуске получим ошибку "идентификатор 'REVERSE' должен быть объявлен".
Проблема в том, что у MS SQLServer есть стандартная строковая функция REVERSE, которая возвращает строковое значение, где символы переставлены в обратном порядке справа налево, а у Oracle ее нет. Но SQL-запрос с вызовом функции REVERSE в Oracle работает... и работает корректно!
31 мая 2021
Встраиваем Microsoft Edge. Управление всплывающими окнами
В интернет-браузере клик по ссылке с атрибутом "target="_blank"", или клик по ссылке левой кнопкой мыши с нажатой на клавиатуре клавишей ctrl или shift инициируют создание в интернет-браузере новой вкладки или нового окна. В WebView2 нет встроенной поддержки вкладок, поэтому в этой ситуации всегда открывается новое окно браузера. Например, в программе на Delphi первый клик по ссылке в TEdgeBrowser откроет окно браузера, второй клик в этом окне откроет второе окно и так до бесконечности. Самое плохое то, что эти новые окна мы уже не контролируем. Они живут своей жизнью даже после закрытия программы.
На скриншоте в логе программы видно, что открытие первой ссылки программа перехватила, а открытие второй ссылки, которое инициировано в окне браузера, программа не видит.
Подписаться на:
Сообщения (Atom)