Как стать автором
Поиск
Написать публикацию
Обновить

Новости «LumanBox»: масштабирование, open source, осмысление опыта ведения индивидуальной базы знаний

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров2.4K
Всего голосов 5: ↑4 и ↓1+3
Комментарии21

Комментарии 21

Первые 3 пункта проблем - это проблема с твоим выбором скина. Он не адаптирован под HiDPI. Напомню, что у тебя здесь VCL и скин сам устанавливает правила отрисовки, а он у тебя не предназначен для HiDPI. В свежих версиях, в списках скинов для VCL есть специальные, адаптированные версии скинов.

Ну а 4ый пункт - это не баг.

P.S.

Я бы рекомендовал, переделать программу под фреймворк FMX, который, кстати, с HiDPI работает прекрасно, потому что рисует не через WinAPI, который позволит собирать под Линукс и Мак (и мобильные устройства). Правда времени на это уйдет не мало. Но чем раньше - тем лучше.

К сожалению, у меня есть честно купленная Delphi 10, и переходить на новую пиратскую версию как то рука не поднимается.

Про FMX читал много негативных отзывов, мол сырая технология. Даже в VCL полно косяков, а в FMX их пишут вообще не счесть. И самое главное - Ehlib не поддерживает FMX и не собирается :-(

Ну так ведь есть CE версия среды. Т.е. бесплатная, не коммерческая. Бери и ставь, сейчас CE - Delphi 11. Разница с твоей версией - небо и земля.

FMX - давно не сырой. Уже несколько лет как прекрасный кроссплатформенный фреймворк. У меня на нём уже пара десятков проектов, не считая подобных твоим открытых проектов. А EhLib - для чего тебе конкретно? Это ведь не MUST HAVE для Делфи, а обычный набор компонент. Более того, в FMX я за все эти десятки проектов вообще не нуждался в сторонних компонентах, потому что возможности у FMX не сравнимы с VCL. Любые кастомные контролы, таблицы, поля в таблицах и прочее. Всё делается на ходу штатными средствами (не как в VCL)

А на какой версии Delphi / FMX ты работаешь? Которая выдает стабильные приложения.

10.4 и выше. Конкретно я работаю в д11. В д12 много правок fmx. Как выйдет CE перейду туда

Спасибо, интересная задумка и реализация. Попробую протестировать. Как вариант развития экспорт в виде майдмап -)

А Вы реально, на практике используете майдмап? Не могли бы на примере хотя бы одном продемонтировать для чего они нужны?

Скажите, а вы разрабатываете новые версии так, чтобы при обновлении имеющиеся в БД таблицы/данные тоже как-то сконвертировались? Какой предусмотрен механизм установки обновлений?

При обновлении структуры данных, само собой, обновление происходит автоматически.
Изменение делается через соотв. json-объекты, типа таких:

Пример JSON изменения структуры данных
[
    {
        "TABLE": "note",
        "FIELD": "telegram_message_id",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "source",
        "FIELD": "telegram_message_id",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "keyword",
        "FIELD": "note",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "keyword_name",
        "FIELD": "note",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "tmp_left_keyword",
        "FIELD": "def",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "tmp_right_keyword",
        "FIELD": "def",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "tmp_left_keyword",
        "FIELD": "interest_count",
        "TYPE": "integer"
    },
    {
        "TABLE": "tmp_right_keyword",
        "FIELD": "interest_count",
        "TYPE": "integer"
    },
    {
        "TABLE": "tmp_left_keyword",
        "FIELD": "class_name_before",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "tmp_right_keyword",
        "FIELD": "class_name_before",
        "TYPE": "TEXT"
    },
    {
        "TABLE": "tmp_left_keyword",
        "FIELD": "source_cnt",
        "TYPE": "integer"
    },
    {
        "TABLE": "tmp_right_keyword",
        "FIELD": "source_cnt",
        "TYPE": "integer"
    },
    {
        "TABLE": "tmp_KW_Analyze_MayBe",
        "FIELD": "note_cnt",
        "TYPE": "integer"
    },
    {
        "TABLE": "source_keyword",
        "FIELD": "keyword_name_id",
        "TYPE": "integer"
    },
    {
        "TABLE": "source",
        "FIELD": "date_time_update",
        "TYPE": "datetime"
    },
    {
        "TABLE": "keyword",
        "FIELD": "all_use_count",
        "TYPE": "integer"
    }

]

Далее в Delphi:

Проверка адекватности структуры данных (часть кода)
procedure TDM.struct_add_new_fields;
var
  ch_str_:ansistring;
  JsonArray: TJSONArray;
  ArrayElement: TJSonValue;
  RowValue: TJSonValue;
  RowItem: TJSonValue;
  table_name_,field_name_,field_type_:string;
  fdq_:TFdquery;
begin
  ch_str_:=GetStrFromAppResource('change_struct_new_fields');
  lcb.log(ch_str_);
  fdq_:=tFdquery.Create(nil);
  fdq_.Connection:=sqlc;
  JsonArray := TJSonObject.ParseJSONValue(ch_str_) as TJSONArray;
  for ArrayElement in JsonArray do begin
     ArrayElement.TryGetValue('TABLE', table_name_);
     ArrayElement.TryGetValue('FIELD', field_name_);
     ArrayElement.TryGetValue('TYPE', field_type_);
     fdq_.SQL.Text:='PRAGMA table_info('''+table_name_+''')';
     fdq_.Open();
     if fdq_.RecordCount>0 then begin
       if not fdq_.Locate('name',field_name_,[loCaseInsensitive]) then begin
         lcb.log('Нет поля '+field_name_+' в таблице '+table_name_+', добавляем SQL-запросом!');
         fdq_.SQL.Text:='ALTER TABLE '+table_name_+' ADD COLUMN '+field_name_+' '+field_type_+';';
         lcb.log(fdq_.SQL.Text);
         fdq_.ExecSQL;
       end;
     end;
     fdq_.Close;
  end;
  fdq_.Free;
  JsonArray.Free;
end;

Спасибо. Этот момент стал ясен. Но мне хотелось бы еще узнать 2 сходных момента, которые я имел в виду в моем предыдущем вопросе.

1.Помимо конвертации структуры БД под формат новой версии происходит ли еще необходимая конвертация данных в таблицах? Например, в первой своей статье вы писали, что вложения к заметкам у вас хранились внутри БД. А в нынешней третьей пишете, что вложения стали храниться отдельно в заданном каталоге. Если у пользователь начал наполнять БД в первой версии программы, то при первом открытии БД уже этой новой версией вложения к заметкам будут автоматически перенесены в их новое место хранения?

2.Если человек начал заполнять БД в приложении версии 1.0 (условно). То при переходе к использованию версии 1.2, минуя 1.1, обновление БД пройдет нормально? У вас к сожалению на сайте lumanbox.ru и на github номер версии программы не указан.

1) конечно же происходит. Относительно места хранения заметок. К сожалению, SQLite очень плохо показал себя в плане хранения файлов. Если их хранить в базе более 100 суммарным объемом более 1ГБ, база начинает дико тормозить даже на индексированных текстовых выборках. Потому я программе добавил возможность в настройках изменить место хранения:

Интерфейс смены места хранения фалов
Интерфейс смены места хранения фалов

Особенность в том, что мы сейчас вдвоем с моим коллегой активно пользуемся программой. И вручную править структуру дважды у меня нет возможности - ее правит встроенный в программу механизм.

2) нормально. Да, нумерации версий программы пока нет. Но, думаю, стоит уже вводить.

Спасибо, Сергей @korvint. Я конечно и так практически не сомневался в этих моментах. Уважающий себя разработчик должен был это предусмотреть, прежде чем выпускать программу в свет. Но на всякий пожарный решил уточнить :)

И хорошо бы еще на том же гитхабе историю изменения версий добавить, чтобы было видно, какие ошибки исправлены или новшества добавлены.

Хорошее предложение, именно так и буду делать в дальнейшем в файле Readme.MD

Извиняюсь, что забыл сразу написать. Спасибо вам за вложенный труд в вашу разработку, которой вы делитесь, и статьи. Прочитал с интересом. Тоже вот хочу перевести свои заметки в какой-то более удобный формат. Ну и метод ZettelKasten надо попробовать поосваивать, сравнить со своим нынешним подходом и оценить полезность для себя.

Откровенно впечатлён. Именно то, что я искал!
Коль проект опенсорсный, подумайте, пожалуйста, чтобы портировать его под Linux. Там даже удобная IDE есть под Pascal https://www.lazarus-ide.org/

Спасибо за оценку моего труда.

К сожалению, я использую библиотеки, которых нет в Lazarus.

Сейчас я учусь на fullstack-developer, и планирую клиентскую часть переписать на React, который будет запускаться на любой платформе, где можно развернуть React App. Удивительно, но современные SCSS и React дают на порядок больше возможностей в построении интерфейсов, нежели классические IDE такие как Delphi или Visaul Studio.

Это вы просто не пробовали FMX в Delphi

Очень много о нем негативных отзывов. К примеру, EhLib под FMX даже не стали портировать свои библиотеки. Ибо глюкало.

Это не актуально. Не говоря уже о том, что FMX ни капли не совместим с VCL и портировать что-то просто так не получится.

Там совершенно другая концепция. Во всем. От канвы, до представлений контролов.

Года 4 назад было действительно плохо, а сейчас у меня множество открытых проектов и коммерческих.

Вот пример, и в репозиториях рядом ещё примеры

https://github.com/HemulGM/ChatGPT

Умоляю, не делайте этого! Пожалуйста, не переносите платформу на React! Сделайте что угодно, только не спускайте проект в унитаз современного говнокодинга, там итак уже канализационные трубы не выдерживают — столько всего забилось.

К сожалению, я не силён в Delphi и не смогу подсказать решение. Если бы проект был на Си, то там есть универсальное кроссплатформенное решение для построения интерфейсов GTK+.

Наверняка что-то можно предпринять чтобы найти решение. Пожалуйста, постарайтесь, но только не плодите очередное чудовище Франкенштейна!

Ещё раз спасибо за проект. Это действительно то, что я ждал годами!

Да, на Delphi можно всю логику оставить и перенести на универсальный фреймворк, FMX. Заведется на Linux (любой, где есть gtk или его либы), MacOS, Windows (начиная с вин7), Android (с 6 версии) и iOS (не помню какие версии).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий