Цель заброшена
Автор не отписывался в цели 1 год 7 месяцев 8 дней
Дневник цели

Последние 2.5 недели впал в депрессивный период, потому что жизнь говно, мы говно, всё говно, индустрия говно, геймдев тоже говно (Starfield вышел и обозвался AAA проектом, ога), и исправит это и очистит планету от человечества только пламя атомного огня.
Так вот, допилил сервис заметок в первом приближении, даже осилил Markdown-редактор. Страдал в основном из-за него, и собственно это очень яркое олицетворение того, что не так с этим блядским IT, будь он проклят.
Писать самому эту хрень явно не вариант (долго и муторно), поэтому решено было взять готовую библиотеку. Оказалось их, поддерживающих Markdown и WISYWIG одновременно (ну и относительно живых ещё) - не так-то и много. Сначала пытался воткнуть Milkdown, но эта сука умеет компилироваться только в ES2020-модули, что для меня решительно не подходило (хотя сейчас я понимаю, что в принципе запилить обертку над ними можно), потому что у меня свой менеджер зависимостей, и он нормально понимает мой формат, и ES5/AMD стиль, но настроить компилятор TypeScript (гори он в аду) в Milkdown в ES5/AMD я тоже не смог.
Пришлось смотреть в сторону чего-то более распространённого, что поддерживает Markdown хотя бы плагином. Вариантов с WISYWIG осталось 2 - CKEditor и TinyMCE. Обе штуки я помню ещё из лихих нулевых, наверно, и, казалось бы, вполне себе устоявшиеся вещи, да и WYSIWYG-редактирование в вебе существует уже лет... Ну 17 точно, думаю даже больше.
Так вот, обе они по-умолчанию превратились в платный SaaS, хорошо хоть сами либы остались под лицензиями типа MIT и GPL, так что можно выкачать и работать. TinyMCE мне нравится больше, но у него какая-то кривая поддержка Markdown, так что пришлось ковырять CKEditor и...
Эта сука скомпилированной весит 1.5 мегабайта. 1.5 мегабайта. При этом она не поддерживает кастомизацию интерфейса, темы (и сделать из "черный текст + белый фон" наоборот было тем ещё приключением), но при этом вообще никак не задает стили именно текста редактора, и половину своих фич при работе с Markdown (да, окей, в нём нет например определения цвета текста и бэкграунда, или отступов, но совершенно распространённая и нормальная практика реализовывать это html'ем).
Я ради интереса залез и посмотрел размер WYSIWYG-редактора, который я писал около 11 лет назад для другого проекта. Он чутка сложнее в плане интерфейса, потому что он больше в типографию (то есть там можно строго регулировать любые параметры текста), но он весит 34 килобайта и у него тупо больше фич. Ну ладно, это не считая GUI-фреймворка, он там тоже самописный, размером 21 килобайт, давайте ещё приплюсуем некий "core.js" размером 10 килобайт, в котором уже даже не помню что, но наверно что-то нужное. Итого - 65 килобайт нескомпилированного кода против 1.5 мегабайт скомпилированного. Пиздец.
Делать нечего, уже воткнул. И воткнул себе в задачи в icelog (это как backlog, только ещё "дальше") взять исходники CKEditor и выкинуть из него 90% кода, которые там нахуй не нужны, и сделать нормальный WYSIWYG редактор для Markdown. Но давайте будем честны, посмотрите на дату этой записи в этой цели, и прикиньте, когда я доковыряюсь до CKEditor - после выхода на пенсию или после смерти (которая надеюсь настанет раньше)? То-то. Придется жить с тем, что есть, потому что реальность такова, и больше никакова.
В любом случае у меня теперь есть место где рефлексировать и куда разбирать все свои несколько тысяч закладок и заметок в хроме, разных соц сетях, в телефоне и evernote. Ну че народ, погнали нахуй, ебаный в рот!
Сегодня буду выкатывать новую инфраструктуру в прод.


Так это, ProseMirror же вроде поддерживает markdown (https://prosemirror.net/examples/markdown/)? Или по другим критериям не подходит?

Path Seeker, есть еще обертка с более дружелюбным API, называется TipTap, но он markdown не поддерживает и надо колхозить (https://tiptap.dev/guide/output#not-an-option-markdown).
~~Или можно вообще взять react-markdown, если у тебя UI на реакте и не нужна кастомизация~~ (зачеркнуто). У них походу нет WYSIWYG

Хоть и сегодня пятница, все вокруг палятся, но ковырял свой проектик дальше:
- Закрыл задачку "Sort highlights by length and apply only then" - это чтобы при подсветке заданных пользователем подстрок сначала подсвечивались самые длинные, чтобы не происходило коллизий (типа если есть 2 правила подсветки: "текст" и "т", подсвечивался сначала "текст", а потом уже буквы "т" в остальных словах).
- Учитывая что микросервисов на бэке уже 9 штук и я их постоянно перезапускаю туда-сюда, решил добавить микросервис "balancer", который слушает всех и коннектится ко всем, но нихрена сам не делает. Ну то есть схема простая, каждый микросервис при соединении выдает о себе информацию (команды, которые он выполняет, события, какие команды ему нужны от других микросервисов), а так же запрашивает остальных и хранит информацию обо всех известных, этот "balancer" собирает инфу и выдает вновь прибывшим куда им стучаться и зачем. Короче это эдакий решала, который всех разруливает. Очень удобно, написал эту штуку (длиной в 4 строчки) еще лет 5 назад.
- Ковырял дальше страницу с заметками в пространствах. Она теперь открывается, соединяется с бэком, запрашивает данные и так далее - осталось только
(ога, всего лишь)создавать и изменять заметки, да и всё. - Для страницы с заметками я придумал совершенно другой интерфейс, нежели у меня есть в инфопотоках, и есть ощущение, что эта идея и в инфопотоках зайдет. Но посмотрим, и надо сначала её потестить в заметках.

Короче вчера я немного впал в депресняк что мир говно, я говно, жизнь говно и мы все умрем (хотя мы правда все умрем). Но сегодня выплыл, и поэтому поработал (на самом деле я и вчера чуть поковырял):
- Поковырял страницу с пространствами заметок, чтобы описание занимало не больше 3х строк (там хитрый JS код с, опять же, реактивностью, Mutation Observer и вот это всё, хотя мать вашу, это настолько очевидный запрос, что уже лет 10 как пора бы его воткнуть в стандарт CSS
, но там занимаются всякой херней). - Поправил баг с массовым удалением элементов в инфопотоках, там глючило немного, но теперь нет.
- Чуть поправил мобильную верстку, ибо с её наличием стал намного больше пользоваться мобильниками и планшетами, так что откровенные косяки стали бросаться в глаза. Завтра будет плотный тест, так как еду чилить у бассейна (угу, аж 5й раз за лето, так что не завидуйте). Ещё стали напрягать необновления данных на мобилках, поэтому видимо и это придется в beta-релизе поковырять.
- Перековырял микросервисы грабберов - сделал центральный менеджер, который сам решает кому отправить запрос в зависимости от региона в БД или переданных данных. Заодно подшаманил основную библиотеку фреймворков, так что она стала более гибкая (теперь можно настроить распределение нагрузки и даже запросить выполнение команды сразу от нескольких микросервисов). В продакт пока не выкладывал, ибо много чего может пойти по Пэ, лучше это делать с запасом времени на тестирование.
- Перековырял код mnc_ilearn (это короче очень крутой модуль интерактивных уроков из моего стартапа MnCreator, с которым я сейчас
(до сих пор, бл)пытаюсь получить ВНЖ в ЕС) - в основном подтянул его под свежие стандарты JS (let, const, ()=>{}, async/await, вот это всё), но вызовы UI-библиотек пока не трогал, просто потому что там надо переходить на шаблоны, и верстка спустя столько лет начала глючить, надо будет что-то поменять, но уже пора спать, поэтому отложу.

- Вчера на удивление быстро накидал
почтивесь бэкенд для сервиса заметок. Много думал над структурой, пришел к тому, что у меня будут "пространства", в которых уже будут заметки, ссылки между ними, папки, теги и так далее(и в бэке не накидал я нихрена кроме самих пространств и заметок). - Ещё думал над интеграцией ИИ, тыкал в Llama 2 70b с квантованием, всё равно очень уж она медленная даже с моей видюхой (4080), и вся в память не влезает (правда мне не дает использовать больше ~10 гигов видеопамяти из 16, даже вылетает с ошибкой аллокации, но даже в 16 она не влезет), поэтому нужно что-то облачное и профессиональное. Заодно потыкал ещё версии на 7b и 13b без квантований (самые "умные"), и всё-таки они тупые)))
- Прикинул на тему шаблонов для пространств, навскидку их будет около 5-6, но надо смотреть в процессе. Первый (ежедневник) пойдет точно не в beta-релизе.
- Сегодня поковырял фронт, полностью сделал роутинг, страницу с пространствами, storage (эта главная штука которая обеспечивает реактивность и взаимодействие с бэкендом).
- Потыкал ещё в визуальные Markdown-редакторы, ну такое себе. Но пилить сейчас своё решение с нуля это вообще не вариант, поэтому придется идти на уступки и использовать готовую библиотеку.
В общем не самый продуктивный день, но двигаюсь потихоньку...
UPD: А, ещё из прикольного, я хочу добавить сбор данных с YouTube, чтобы получать уведомления о новых видео на избранных каналах и в сам ютуб больше никогда не заходить. У них есть публичное API, но знаете прикол? Прикол, что ни по URL канала (например https://www.youtube.com/@Zofferro , обязательно подпишитесь, крутой чел), ни по юзернейму нельзя узнать ID канала, который нужен для получения остальных данных. Его вообще почти никак не получить, кроме как парсить страницу или знать заранее (даже в поиске через API не гарантируется, что нужный канал найдется). Реально ебанутые сидят в этот гугле, просто жесть.


Freeland, не, основная идея в том чтобы пользователь мог получать контент без регистрации на ресурсах, безо всяких реклам, рекомендаций, подписок, браузерных уведомлений, трекеров, "а почитайте/посмотрите ещё" и так далее. Поэтому с моей стороны для того, чтобы моему пользователю (у меня и регистрация только по логинам, без СМС и емейлов) выдавать новости об обновлениях, я у него прошу только ссылку и ничего больше.
Да слушай, я скорее всего возьму headless-браузер (puppeteer или selenium какой-нибудь) и буду ходить на страницу чтобы оттуда вытащить ID (он там есть), а дальше уже RSS читать. Сначала думал парсить HTML полностью, но ты меня с RSS спас))) Ну и может Наталья что подскажет, раз говорит что тоже с таким сталкивалась.

Короче внезапно я дополз до альфа-релиза своей никому не нужной штуковины. Имеем RSS-читалку и парсилку сайтов, которая работает сверхбыстро, умеет сливать несколько потоков данных в один канал (ну и иметь сколько угодно каналов), а так же хитро фильтровать данные по куче параметров. Всего несколько лет разработки и около 15 тысяч строк кода. Такими темпами я помру раньше, чем закончу весь проект.
Звучит конечно невпечатляюще, но на самом деле там под капотом:
- На фронте самописный модульный реактивный фреймворк с роутером, собственным шаблонизатором (да, я недолюбливаю даже React, чего уж о styled components говорить), локализацией и UI-библиотекой (модальные окна, dropdown-меню, панели, табы, списки, таблицы, бейджи).
- На бэке самописный микросервисный распределенный фреймворк (одно время он даже нормально работал с серверами между ЕС и закрытым интранетом Китая (уж не спрашивайте "как?"))
- Реактивно оно до той степени, что в несколько строк кода можно полностью синхронизировать данные на сервере и клиенте (прилетела новая новость - и сразу же оказалась в списке. Удалил её в браузере на компе - в открытом браузере на телефоне она тоже пропала). Это я пока не включал полностью (кроме получения новых данных), так как реально это мало где нужно.
Говна я с парсингом поел достаточно, конечно. Особый пламенный "привет" владельцам сайтов, которые додумались засунуть машино-читаемые RSS-ленты под (барабанная дробь) капчу типа гугла или CloudFlare (Смарт тоже этим грешит), но там теперь ужасно хитрая схема как данные попадают в БД и показываются пользователям. Да и сервис умеет смотреть на сайтик и искать в нём ленты самостоятельно, что прикольно и удобно
Багов - навалом, новых нужных фич - ещё больше. Выложил в скриншотах что было сделано по задачам на альфу и что я запланировал на бету. В ближайшие дни фокусируюсь на двух вещах: создать скелет сервиса Spaces, дабы перенести все свои заметки изо всех мест типа телефонов и Evernote в одно (своё) место, часть целей со смарта тоже, начать разбирать закладки в браузере и прикрутить туда AI (Llama 2 хороша), который будет помогать мне рефлексировать, ибо тем для рефлексии - вагон и тележка. А второе - это допилить распределение запросов по нескольким микросервисам, так как например гребаный 4PDA не хочет выдавать данные на мой немецкий IP, но нормально выдает на российский, а запросы распределяются автоматом и этих особенностей не учитывают.
Ещё из прикольных новостей - я выиграл билет на WebSummit, и там нихреновая стартап-движуха. Кажется, вселенная мне что-то подсказывает или просто дала пинок под зад






Написал я такой "план на завтра" неделю назад и потерялся на неделю - вполне в моем духе. Короче действительно потерялся, очень большие завалы и срочно нужно было доделать другой проектик.
Сегодня чутка перековырял интерфейсы фильтров и подсветок, чтобы у них не кнопки редактирования и удаления были (сначала думал их по ховеру показывать только), а можно было просто тыкнуть на элемент в списке, открывается форма редактирования, а там ещё кнопочка "удалить" плюсом к "сохранить". Интерфейс стал посвободнее, UX хз, стало и чуть лучше - можно тыкать на элемент в списке и даже отдельную ему вьюху теперь сделать со статистикой типа или что-нибудь такое - и чуть хуже - удаление требует на 1 тык больше, но это редкая (по моему опыту) операция.
Ну и запилил базу под sources, завтра надо подобавлять новые методы в psl_endpoint (эдакий файрволл перед микросервисами, чтобы клиенты не наприсылали всякой дичи) и начать их реализовывать. Начнём, конечно же, с создания - которое весьма хитрое.



Хм, наткнулся (ну как наткнулся, мой GTD-сервис мне её подкинул))) ) на статью про строки и подумалось замерить скорость текущего шаблонизатора. Вообще он построен по другому принципу, а именно генерирует стрелочную функцию, которая возвращает строку-шаблон с вставками, но мб делать через .join('') будет быстрее, а меняем всего 3 строчки.
Кто-то скажет что я занимаюсь экономией на спичках, и будет правUPD: не стал далеко ходить, протестил на шаблоне input'а, на котором у меня строятся все формы, взял оригинальный скомпилированный и слегка модифицировал его под массив (не полностью, но для подтверждения гипотезы сойдет). В итоге шаблон быстрее где-то в 10 раз)
UPD2: вспомнил про оптимизации со стороны V8 и подумал, что скорее всего реально вызывается всё это чудо (первое так точно) всего один раз из-за одинаковых параметров, ну и добавил рандом. Тогда результат уехал всего лишь в 2 раза, но всё равно в пользу шаблонов.



Сегодня тоже потерян день из-за сраного посольства.
Вощем-то перераскидал файлы локализации чтобы стало более-менее адекватно, повыпиливал лишний код из модуля касательно форм и их стилей (ибо они теперь встроены в psl_ui.modals), перепроверил всю работу со стримами (создание, редактирование, удаление, server-side events) и всё прекрасно работает. Так что перехожу к следующей большой части, которая вообще не сделана и является новой относительно предыдущей версии потоков - управление источниками. Завтра расскажу что к чему.
Ещё поковырял сегодня роутинг. Оказалось роутинг в самом простом варианте ("hashchange") это типа 50 строк кода, из которых значащих реально типа 15, остальное всякие импорты-экспорты и пробелы (не комментарии же). В таком виде для клиента оно сгодится, но не сгодится для моей приложухи, как минимум нужно добавить параметры ко всему этому великолепию (т.е. всякие "/item/:id" или, хм, может "/item/{{id}}"? psl_templates то у меня уже есть, там можно как-то разбор делать...) - а на эту тему надо посмотреть на практику - как их выделяют во всяких next / react / express и так далее; А так же мне нужна более глубокая и правильная интеграция с компонентами страниц, чтобы например при переходе с одного урла на другой, за которые отвечает одна и та же страница (типа item_id у меня разные) - она не убивалась и создавалась заново, а хитро перерисовывалась.

День сегодня совершенно по пизде, спасибо российскому посольству в Лиссабоне. Но не будем о мудаках.
Ударненько сегодня забурился в код, наговнякал этот самый psl_ui.modals.prompt , который выводил модальное окно с формой в один инпут, умеет валидировать ввод и отправляет его в коллбек (сначала хотел сохранить родной браузеровский prompt api, только через await, но подумал над сценариями и так не получилось) и далее много магии одновременно. Вынес менюху в отдельный модуль, правильно его прицепил везде, поправил ещё пачку багов, почти доделал даже редактирование названия потока, ибо думал что там ща нужно будет снова ковыряться со всякими соединениями и сторэджами, а оказалось (вспомнил, точнее), что моя магия продолжает работать, и строчка `model.name = new_name` магическим образом сама решает все вопросы с сервером, а как вопросы решены (а пока не решены везде крутится загрузка) - реактивно и точечно обновляет названия в DOMе (потому что от модели зависят вьюшки, и каждая вьюшка знает где и как она использует данные модели), даже на других страницах с этого же домена и без (пока) воркеров. Реакт обосрался бы от зависти.
Задача на завтра - доделать редактирование имени (там просто всякие файлы локализации пока не там, где надо) и поковырять роутер. Мне он просто уже нужен на другом проекте для клиента.