![]() |
Показать все 3 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Сказ о том, как я мессенджер писал (https://hlfx.ru/forum/showthread.php?threadid=6144)
Сказ о том, как я мессенджер писал
Расскажу историю о мессенджере, который ещё в разработке и даже не в стадии пре-альфа. Прошёл уже почти год с начала разработки. Сначала это казалось "ой, чат, да легко!". Потом я сделал анонс разработки в нашем городском сообществе айтишников и пара человек сказали "я разрабатывал мессенджеры, больше не буду, ну его нафиг!". В тот момент я не придал этому значения. Подумал "ну не осилили, бывает, у меня точно получится".
В общем изначально не было никакой концепции и цели. Мы играли с друзьями в геншин и стримили друг другу свои экраны, параллельно общались голосом, скидывали в группу промокоды и гайды по игре. В конце 2024 года в РФ начали блокировать дискорд. Мы с друзьями перешли в телеграм, но по сравнению с дискордом это жутко неудобно. Видеострим отдельно, войсчат отдельно. Иногда бывают конфликты звука у видео и войсчата, особенно когда у тебя на втором мониторе запущен твой же стрим и он с задержкой до 12 секунд тебе же воспроизводится. Стримить прямо через телегу или через OBS - разница небольшая. Всяко хуже, чем дискорд. Нет адаптивного баланса "ущерб качества в угоду скорости". Если у тебя монитор
1080, то оно ни за что тебе не будет стримить 360.
3 января я проснулся с жуткого бодуна с мыслью, что мне это надоело и именно я должен создать достойную замену. Заварил крепкий кофе, запустил ChatGPT и начал один за другим формулировать запросы, пока не получил более-менее адекватный результат. Нужно отметить, что нейронки это как малые дети. Они эрудированные, но всегда нужно за ними приглядывать и направлять в нужное русло. Они так и ждут, чтобы по-детски напакостить там, где это совсем неуместно, но им весело. Естественно, нужно очень внимательно вычитывать код, который они дают. После нескольких итераций они начинают бредогенерацию и тогда уже размывается граница. Ты учишь нейронку писать код, а не она тебя. Ты указываешь ей на ошибки. ChatGPT первый по бредогенерации, у него память как у рыбки - 3 секунды. GigsChat от сбера уже получше, но тоже тупит. Он очень хорош в python, но не знает некоторых нюансов, которые приходится ему объяснять и иногда даже упорно доказывать, что надо именно так и никак иначе. Иногда он уверяет, что различия в версиях flask незначительные, но моём случае они оказались фатальными. В случае с Си он иногда даже не знает, что нужно вместо параметра компиляции -wsl указать параметр --что-то-там. Суть одна, а буквы разные. На таких нюансах потрачено очень много нервных клеток, потому что код ТОЧНО рабочий, но он не компилируется. Спас DeepSeek, который сразу сказал "дружище, у тебя тут параметр компилятора надо вот такой, а не этот". После чего я эту претензию скинул в гигачат и он сказал спасибо китайскому коллеге подсказку.
Дипсик появился примерно одновременно с гигачатом или чуть позже, но миллиарды китайских мощностей дают о себе знать. Ещё не было задачи по программированию на любом ЯП, с которой он бы не справился. В 90% случаев он выдаёт полностью рабочий код. Иногда нужно что-то уточнить, например версии используемых зависимостей и тогда он тебе даст полный код с исправлениями. Иногда это жутко бесит. Ты не просишь показывать код, но он начинает писать 2000 строк кода. К счастью, там есть кнопка стоп. Любые трейсбэки и прочие выхлопы из консоли он сразу понимает и выдаёт новую версию кода. И, кстати, я могу забыть о проекте на неделю, но потом захожу в чат, пишу добавь такой функционал и он переписывает код недельной давности, хотя заявляет, что не запоминает предыдущие диалоги. Когда лимит чата по количеству символов заканчивается, нужно начать новый чат и он уже знает что было в предыдущем. Вообще у всех нейросетей одинаковая болезнь. Почему-то они в первую очередь дают код твоих хотелок на питоне, наверное потому что это проще или потому что питон до сих пор в топ-3, и я их прекрасно понимаю. Если питон перевести на русский, по сути ничего не изменится. Это не будет как 1С - визуал васик, переведённый промтом. Это была присказка, переходим к сказке.
Базовые принципы мессенджера:
1. Кроссплатформенность. Чтобы работало даже на советской мясорубке.
2. Скорость передачи данных.
3. Безопасность (шифрование, хэширование).
4. Сохранение всего в базу данных. Возможна настройка чёрной дыры при необходимости.
5. Пользовательский интерфейс на QT5.
Остальное - свистоперделки и функции, которые к чату как бы и не имеют отношение. Войсчаты, видеостримы, смайлы, стикеры, аттачи. Ирония в том, что именно это "остальное" - и есть цель проекта, а текстовый чат просто как база. Переходим к истории проекта.
За год было несколько сотен версий проекта, но из них сохранились только около 30 версий и из них стабильно рабочие только штук 5. Сначала я писал на pyqt5. Не было никакой архитектуры проекта, не было совсем никакого понимания об устройстве современных мессенджеров. Я просто сказал нейронке "используем это, напиши мне мессенджер с базой данных MySQL, pyqt5, кроссплатформенно". Получил первый код, почти работает. Сообщения пишутся в базу данных, но клиенты не видят новые сообщения без перезапуска чата. ЧатГПТ подсказал импользовать QTimer для автообновления окна чата и списка пользователей каждый 3000 миллисекунд (обычное значение, если чаще - огромная нагрузка на БД, реже - большие задержки). Работает. Теперь надо решить проблему с автофокусом на поле ввода сообщения и сделать автопрокрутку окна чата всегда вниз к последнему сообщению, но так чтобы можно было скроллить вверх. В этом и проблема, скроллить не получается, чат намертво прилип к днищу. Зато сообщения приходят клиентам. Стоит напомнить, что тогда как таковой архитектуры проекта не было. В качестве сервера выступала БД, но вот ведь непонятка! Сервер есть, а архитектура вроде бы p2p. Разберёмся позже, ставим на паузу.
Следующая задача - список пользователей чата. Нужно показывать всех зарегистрированных и выделять тех, кто сейчас онлайн. По какой-то причине все были онлайн, хотя на самом деле только один. QTimer поднасрал. Как оказалось, он вообще поднасрал в весь код даже там, где его присутствие по определению не предполагалось. Причём он в отдельном классе, но как будто работает глобально. Наверное баг.
В общем мне надоела непонятка и я начал изучать код. Действительно база данных это центр вселенной, но сам чат это p2p, который работает по никому неизвестным законам физики. Это чат Шрёдингера, он одновременно работает и не работает. Решил пересмотреть концепцию.Обратился к нейронке и она сказала, что все современные мессенджеры типа телеги и дискорда используют именно клиент-сервер. Выдираю волосы из всяких мест, сую в нейронку свой недокод и говорю "сделай жёстко клиент-сервер". Вы думаете до этого были проблемы? Это был ясли-сад!
Клиент-сервер предполагает чёткое разделение прав и кода. Нельзя сообщать клиенту методы подключения к БД, он же может взломать. В итоге теперь мы работаем с БД только через сервер. для этого что нужно? Праааааавильно, API. И тут мы сталкиваемся с огромной кучей проблем. Первое, что приходит в голову любому питонщику, который работал с сетью - FastAPI, Django, Flask. По идее для данных целей нет других простых вариантов, альтенатива - писать свой фреймворк. А это огромная жопа, если кто понимает. Вот здесь приходит понимание почему во все проекты пихают килотонные фреймворки ради двух инклудов! Ды так быстрее на конвейере патамушта!
FastAPI мне сразу не понравился из-за дебильного синтаксиса и непонятности: оно мне указывает на файл или на процесс? Джанго - слишком попсово и из-за этого явно слишком тяжёлая библиотека для моего проекта и там много лишнего. Остаётся Flask. Натерпелся я с ним очень много, о чём говорил ранее. Но он работает. Мне только не понравилось как именно он работает, не понравились методы дебага и детализация выхлопа. Вроде бы всмотришь и тут русским английским написано, но нифига непонятно.
Далее я углубился в отрисовку смайлов и аттачей. Со смайлами всё легко. Подкинул libpng и оно тебе рисует картинки из папки, а они в свою очередь занесены в словарь. Просто и работает, но хочу, чтобы смайл сразу был доступен, как только картинка появляется в папке. Сделать можно, но идею оставил на потом, так как это уже свистоперделки. С аттачами "веселее". Я пока ещё новичок и почему-то аттач добавляется как ссылка на локальный файл, записывается информация о нём в БД, но сам файл не прикрепляется. Будто нужно слямзить файл прямо с компа другого клиента. Не стал разбираться, оставил на попозже.
Надоел этот ад с питоном. Да, работает, пишется и читается легко, но есть огромное НО и даже не одно. Интерпретатор медленнее, чем бинарный код примерно в 10 тысяч раз. Для такого проекта в общем незаметно, но всё же. Если там тысячи пользователей и миллионы запросов к БД, это уже бутылочное горлышко. На линуксе он работает нативно, потому что там половина системы на питоне, а на винде попробуй запусти, к тому же теперь там ввели виртуальные окружения venv для каждого проекта. Ну ладно, создал, установил в проект все зависимости. А как запускать на винде? Ей же эксешник нужен. Ладно, на серьёзных ссях написал лаунчер, который запускает питоновский main.py. 20 строк тупо чтобы сказать винде какой файл надо запустить. Дичь полная.
Решил на чисты си перенести, пообщался с нейронкой. Сервак запустился прям с полпинка без правок. Одна компиляция и готово. Потом при добавлении функционала конечно были проблемы с API и особенностями чистого си (нет под него нужных фреймворков, все гомосеки на сишарпы и кресты делают библы). Но основные проблемы были с клиентом, а сервак как работал, так и работает. Прожевал, проглотил, подумал... Выпил храброй воды и решил, что пора на кресты переходить.
Кресты ненавижу... Вот эти void std::hirdimpirdim > %@#$#@$#@$ return 0; Пересилил себя и с нуля перенёс всё на кресты. И знаете? Взлетело прям сразу! Наверное потому что под кресты больше всего нужных библиотек. Текстовый чат, БД. Потом создал отдельное приложение на крестах для видео-аудио и объединил кодовые базы. Мультимедиа пока на заглушках, но по крайней мере ничего уже готового не поломалося. Текст пишется в БД, юзеры видят друг друга, видно сколько онлайн.
На данный момент работает только текст в групповом чате. Сломалось обновление окна чата (не показывает старые сообщения), нет смайлов, нет аттачей, мультимедия только на заглушках.
Что предстоит сделать:
1. Вернуть хэширование паролей в БД (вроде bcrypt должно подойти)
2. Видеострим
3. Видеозвонки
4. Аудиочаты (групповые и приватные)
5. Приватные текстовые чаты.
6. Мультисервер.
7. Права доступа, разделение на админов и юзверей и тд.
8. Сквозное шифрование трафика.
И что-то ещё я наверное забыл, пока всё это писал. Ну в целом начать да закончить.
__________________
На презентации Internet Explorer 9 парализованный мальчик встал и вышел... о_О
В новом амароке файловый менеджер превратили в фейловый... © slux
С днем рождения. 
Спасибо!
Денёк другой отдохну, созреют новые идеи и буду дальше кодить. Никогда бы не подумал, что мне это будет интересно, а теперь ни дня не могу жить без этого. Каждый раз новый результат и новая победа. И когда ты это сделал, появляется странное ощущение, что нужно продолжать идти вперёд, но все идеи уже полностью вышли из мозга и тебе остаётся только наслаждаться тем, что уже получилось.
Форум работает очень плохо, раза с 15-го загрузился с горем пополам. И тут нет вины хозяина форума. Я знаю кто виноват.
__________________
На презентации Internet Explorer 9 парализованный мальчик встал и вышел... о_О
В новом амароке файловый менеджер превратили в фейловый... © slux
| Временная зона GMT. Текущее время 20:24. | Показать все 3 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024