-
Автоматически создавать на сервере энд поинты для CRUD операций над бизнес-объектами.
Автоматически создавать на клиенте UI для работы с данными (форма просмотра и диалоговое окно в терминах Гедымина).
13 февр. 2022 г.
Текущее состояние gdmn-nxt
28 янв. 2022 г.
Зависание nodejs при запуске через окно терминала Windows
-
Отключить режим Quick edit в окне Properties терминала (см. скриншот ниже)
Использовать другой терминал (например, git bash)
Запускать nodejs через Task Scheduler операционной системы.
26 янв. 2022 г.
Шрифт MS Sans Serif для кирилической кодировки Win-1251
20 янв. 2022 г.
Ровно в следующий четверг, 27 января, нам исполняется 28 лет! Традиционный боулинг, как обычно, в 19:00 в клубе Мэдисон. В ЧЕТВЕРГ! Будем рады видеть всех наших сотрудников! Как действующих, так и бывших.
🎳
Различие в поведении finally между Delphi и Javascript
Пришлось потратить пару дней в поисках трудновыявимой ошибки. Все дело в том, что finally работает в Delphi и NodeJS по-разному. Будьте осторожны.
Например, в Делфи, код в секции finally выполнится ПЕРЕД окончанием выполнения функции:
В Javascript, код в секции finally (даже не смотря на наличие await) выполнится уже ПОСЛЕ того как результат функции будет передан получателю.
Теперь представим такую ситуацию. На веб сервер посылается сначала запрос на изменение данных, а после его выполнения запрос на получение (перечитывание) данных. Если мы будем делать commit транзакции в секции finally, то возможна такая ситуация, когда первый запрос уже завершится и вернет результат на клиента, который, в свою очередь, выполнит второй запрос к серверу, а транзакция все еще будет не подтверждена. В этом случае клиент получит старые данные, не соответствующие тому, что находится в базе данных.
Выход в данном случае или комитить транзакцию до секции finally, или использовать мьютекс на несколько обработчиков, который не даст прочитать данные, пока не запишется транзакция, которая меняла эти данные.
31 дек. 2021 г.
14 дек. 2021 г.
За будущее беларуского софта можно не волноваться
Хочется поделиться потрясающими и воодушевляющими впечатлениями от участия в качестве ментора в открытом IT хакатоне минской школы Stembridge. Наша компания была инициатором и спонсором данного мероприятия, но вся организационная часть лежала на Stembridge. В том числе и выбор задания. Надо сказать, что первый раз увидев поставленную задачу – "E-PROFILE" – решение на тему "Как в электронном виде наглядно и удобно собирать портфолио достижений каждого ученика от 1 до 11 класса?" – у меня возникли сомнения насколько такая, по сути, прикладная задача, будет интересна ученикам 8-11 классов. Все мы привыкли к олимпиадным задачам, как к хитрым и абстрактным головоломкам, редко пересекающимся с повседневной жизнью. Тем более, что предложенные подвопросы к основной задаче:
- Формат ввода и хранения данных (простота и доступность с разных устройств и разных форматов)
- Качество данных (достоверность, актуальность) • Безопасность и доступ к данным (разные уровни доступа)
- Визуальное оформление: панели, отчеты и т.д.
- Интеграция с внешней базой данных
Больше напоминали технические требования из взрослого тендера на разработку промышленной системы. Смогут ли дети понять, что такое реляционные структуры данных и спроектировать конкретные сущности (таблицы) из задания? Какой инструментарий выберут для прототипирования пользовательского интерфейса? На какой платформе будут создавать программный код и смогут ли показать работающее решение (прототип), если на кодирование после обсуждения останется максимум 4-5 часов?
Сомнений было много. Мне досталась команда номер 4. Две девочки, три мальчика. После вводной части началась работа по командам и тут меня ждал настоящий, в хорошем смысле, шок. После небольшого пятиминутного наставления, ребята работали полностью самостоятельно. Школьники 10-го класса смогли полностью уяснить суть задачи, понять какие данные им нужны, где их брать и как хранить, набросать эскизы интерфейса на графическом планшете и даже создать работающий прототип с фронтальной частью на React и бэк-эндом на Node. И это все менее чем за 5 часов!
Начинается защита проектов (всего в хакатоне принимало участие три десятка ребят, разбитых на 6 команд). И тут меня ждет продолжение приятного удивления. Во-первых, каждая из команд довела свое решение до конца. Не было брошенной на полпути или недоделанной работы. Во-вторых, все шесть программ были разными, каждая со своими уникальными неповторяющимися решениями. В-третьих, каждая команда представила по итогу грамотную техническую презентацию. Приятно было видеть, что ребята не тушуются перед камерой и микрофоном и способны связно и доступно представлять технические детали своей работы, а также отвечать на вопросы экспертов.
После достаточно длительного совещания жюри (реально трудно было выбрать победителя – абсолютно все работы были хороши и достойны), были объявлены команды, занявшие первое, второе и, команда, где мне пришлось немного побыть ментором -- третье место.
Вне зависимости от занятого места каждый из участников остался в выигрыше получив ценный опыт, а я получил уверенность, что за будущее беларуского софта можно не волноваться. Новое поколение уже на подходе!
PS: чуть позже мы разместим здесь видео с хакатона.
30 нояб. 2021 г.
Открытый хакатон 11 декабря для учащихся 8-11 классов
-
Формат ввода и хранения данных (простота и доступность с разных устройств и разных форматов)
Качество данных (достоверность, актуальность) Безопасность и доступ к данным (разные уровни доступа)
Визуальное оформление: панели, отчеты и т.д.
Интеграция с базами данных
26 нояб. 2021 г.
Конфигурация небольшого сервера для базы данных Гедымина
На днях один клиент обратился с просьбой порекомендовать конфигурацию сервера под базу данных размером в районе 50 Гб и количеством одновременных подключений 25+. Думаю такая рекомендация может быть интересна и другим нашим клиентам, а также как исторический материал, который через некоторое время позволит сравнить цены и оценить скорость развития вычислительной техники.
Курс доллара на момент написания где-то в районе 2.5 руб за 1 USD.
- Память. Ставьте 256 ГБ самой быстрой DDR4, которую будет поддерживать материнская плата. Это на вырост. Если 256 Гб дорого, то никак не меньше 128 Гб. Планка на 32 Гб стоит сейчас где-то в районе 400 руб.
- Процессор AMD Ryzen 9 5900X (12 ядер, ~1500 руб) или 5950X (16 ядер, ~2200 руб).
- 4 планки NVME по 1 Tb. Что-нибудь вроде SSD Samsung 980 Pro 1TB (по 550 руб за штуку). Из них собрать два зеркала RAID 1. Одно использовать для размещения операционной системы, темп каталога и папки с архивами бд, а второе -- для размещения рабочего файла базы данных.
- Материнская плата с поддержкой всего вышеперечисленного (в т.ч. PCI Express 4.0). Сеть желательно 10 Gbit Ethernet до центрального свитча. Видео встроенное в материнскую плату или самое простое. Монитор можно б/у-шный тоже самый простой.
- Корпус можно самый обычный брать. Блока питания на 600 W хватит вполне.
- Надежный бесперебойник.
На вскидку, суммарная стоимость будет:8 * 400 + 1500 + 550 * 4 + 600 + 300 + 400 = 8200, округленно -- 9000 руб.Этой техники хватит без проблем, по производительности, на 5 ближайших лет.
22 мая 2021 г.
Смена хостинга для нашего сайта
Пока мы осваиваемся на новом хостинге могут наблюдаться небольшие перебои в работе сайта. Если при обращении к сайту возникает ошибка, очистите сохраненные cookies. Для этого откройте меню, кликнув по пиктограммке слева от имени сайта в адресной строке браузера и вызовите соответствующую команду.
https:// версия сайта тоже доступна, но пока не сделана основной. Надо еще поискать по коду все ссылки на незащищенный протокол и поменять их.
Если заметите ошибки в работе сайта, будем признательны обратной связи на адрес support[at]gsbelarus.com.
28 апр. 2021 г.
Охота на утечки памяти
В отладочную версию gedemin.exe и новейшую версию класса TCreator добавлено расширенное логирование:
- Транзакции. Логируется старт и завершение транзакции. Показывается количествоактивных транзакций в данный момент времени.
- IBSQL. Логируется выполнение запроса. Для SELECT запросов логируется закрытие. Показывается количество открытых на чтение запросов.
- Designer. Логируется создание и удаление объекта. Показывается количество объектов в памяти.
- TCreator. Логируется создание и удаление экземпляра класса. Показывается количество TCreator в памяти.
Обратите внимание, что в Гедымине скрипт-функции внутри диалогового окна зашитого в платформу выполняются в рамках отдельного модуля и внутри него будет идти свой отсчет экземпляров TCreator.
27 апр. 2021 г.
NB! Об использовании TCreator и других VB классов
Важное предварительное замечание: отладчик Гедымина вносит существенные искажения в исходный код скрипт-функций из-за чего сборка мусора может работать не так, как ожидает этого программист, и не так, как она будет работать в режиме без отладочной информации. Всегда проверяйте код в режиме без отладки перед передачей в промышленную эксплуатацию.
Особенности классов VBScript
- Событие Terminate вызывается только в процессе удаления из памяти последнего экземпляра данного класса.
- Наличие кольцевых ссылок, в т.ч. цепочек кольцевых зависимостей любой длины, приведет к тому, что ни один из экземпляров не будет удален сборщиком мусора и останется в памяти до конца работы программы.
Как мы столкнулись с проблемой неудаления объектов из памяти
В одной из задач с помощью TCreator создавалось модальное окно, которое оставалось на экране в течение всей рабочей смены. Оператор взаимодействаовал с окном сотни раз вызывая различные функции приложения. В процессе выполнения каждой функции выделялись ресуры (транзакции, запросы к базе данных и т.п.). Ресурсы не удалялись по завершении функции, так как локальный TCreator не уничтожался сборщиком мусора из-за наличия TCreator в месте создания модального окна. В конце концов исчерпывалась доступная оперативная память и приложение завершалось с ошибкой.
Возникает вопрос, как бороться с вышеуказанной частной ситуацией и как правильно работать с классами VBScript, чтобы максимально обезопасить себя от утечек памяти?
Использовать Designer.CreateObject -- Designer.DestroyObject
В описанном выше примере программист изначально понимает, что созданный экземпляр TCreator будет существовать до закрытия модального окна, а значит будет удерживать все последующие TCreator. В данном случае можно предложить решение с выделением и уничтожением ресурсов напрямую через глобальный объект Designer.
Создать копию класса TCreator
Вы автор подсистемы на платформе Гедымин. Код протестирован на корректную работу с ресурсами. Но, как обезопасить себя от ситуации, когда другая подсистема создаст долгоживущий TCreator и заблокирует все ваши механизмы очистки памяти?
Следует создать полную копию класса TCreator в рамках своей подсистемы и использовать ее для выделения ресурсов.
А надо ли каждый раз выделять-уничтожать ресуры?
В указанном выше приложении сотни раз за рабочую смену выделялись и уничтожались одни и те же ресурсы -- транзакции и запросы к базе данных. Одно из решений -- пул ресурсов. Нужные объекты создаются единожды и привязываются к окну (у нас есть соответствующее свойство Objects у формы). Остается только стартовать/комитить транзакции в нужных местах и выполнять/закрывать запросы к базе данных, без уничтожения самих объектов.
Альтернативный вариант в случае с экранной формой -- не создавать объекты для пула из программного кода, а просто разместить соответствующие компоненты на форме и обращаться к ним через метод GetComponent.
Принудительно уничтожить ресурсы в TCreator
В крайнем случае, ресуры выделенные через TCreator можно уничтожить принудительно, вызвав метод DestroyAllObjects. Теперь, даже если сборщик мусора не сможет удалить экземпляр TCreator, то в памяти останется только он, но не связанные с ним ресурсы.
Уничтожать TCreator как можно раньше
Стандартная практика -- TCreator уничтожается по завершении функции или процедуры. Если код процедуры или функции объемный и ресурсы нужны только в одной его части, то рекомендуется уничтожать экземпляр TCreator вручную, присваивая переменной значение Nothing.