Про OutWiker и Rust

Про OutWiker и Rust

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

Потом я немного увлекся и решил попробовать написать на Rust самую базовую часть OutWiker, которая отвечает за загрузку дерева заметок, их хранение и обработку внутренних событий. Почти неделю я занимался тем, что перекладывал ссылки из одного контейнера в другой, чтобы borrow checker был доволен, и при этом архитектура была более-менее сносная. Пока процесс выстраивания архитектуры продолжается.

Скорее всего этот код никуда не пойдет, я к этой задумке отношусь как прокачке скилла, но в фоне держу в уме возможность того, что все получится настолько удачно, что когда-нибудь я начну постепенно переписывать OutWiker на Rust.

Вообще, программирование на Rust напоминает собирание пазла, когда сначала ничего не компилируется, но потом поменяешь в паре мест способы передачи ссылок, и внезапно все ошибки пропадают, а программа не только начинает компилироваться, но еще и работает.

Коротко о прочитанных недавно книгах

Дочитал на днях две книжки, которые читал параллельно.

Первая — художественная. Книга Эдуарда Веркина «Сорока на виселице» — это хорошая твердая научная фантастика. Читается как что-то сюрреалистическое с ненадежными рассказчиками, у которых свои взгляды на происходящее, но иногда нет даже уверенности, что это самое происходящее происходило. Книга о том, насколько далеко можно зайти в научных экспериментах без ожидаемых результатов, и где заканчивается наука и начинается что-то другое. По книге разбросано много интересных НФ-идей, которые иногда упоминаются вскользь. Книга странная, но мне понравилась.

Про книгу «Глубокое обучение» надеюсь как-нибудь напишу отдельный пост. Если коротко, это скорее теоретическая книга про разные архитектуры нейронных сетей: обычные многослойные, сверточные, рекуррентные, порождающие. Описываются различные методы их обучения. При этом в книге достаточно много математики, которую иногда при поверхностном чтении можно пропустить, авторы все равно объяснят идею каждой архитектуры сети. В книге есть несколько примеров кода с использованием TensorFlow и Keras, но это не учебник по этим библиотекам. Идеи описаны достаточно тяжелые, но при этом язык написания книги — замечательный с добавлением шуток и цитат из художественных или не очень книг, которые можно прицепить к рассматриваемой теме. Книга писалась в 2017 году, еще до появления ChatGPT, и это надо учитывать. Даже сами авторы пишут, что по нейронным сетям появляется огромное количество научных публикаций, предлагающие новые подходы к построению различных архитектур сетей. В конце книги приводятся ссылки на чуть меньше 600 публикаций.

Про книгу Влада Хононова «Изучаем DDD — предметно-ориентированное проектирование»

Книгу Влада Хононова «Изучаем DDD — предметно-ориентированное проектирование» в первый раз я прочитал уже относительно давно — осенью прошлого года. Тогда же я собирался написать этот пост, и даже начал писать черновик, но что-то пошло не так и я переключился на другие посты и проекты. Через пару месяцев я решил все-таки дописать обзор этой книги, но предварительно решил еще раз освежить прочитанное и написать немного заметок в свою базу заметок. В итоге слишком увлекся, заметок понаписал много, книгу по сути перечитал еще раз, а пост написал только сейчас. Зато он получился более подробный, и надеюсь более понятный, потому что тема, о которой в книге идет речь, достаточно тяжелая и без привязки к конкретным задачам может показаться слишком абстрактной.

Про технику проектирования программных систем DDD (Domain-Driven Design) я слышал давно и разное, но не было хорошего понимания того, что это такое. Поэтому захотелось почитать какую-нибудь книжку, где были бы последовательно описаны основные идеи этого подхода, чтобы можно было бы понять, имеет ли смысл такой подход использовать в своих задачах.

Читать далее ‘Про книгу Влада Хононова «Изучаем DDD — предметно-ориентированное проектирование»’ »

Как я писал книгу про Python

Полтора года назад я начал писать книгу про Python. Когда-то я писал посты о том, как продвигаются дела с этой книгой. Потом долгое время в блоге я эту тему как-то игнорировал, хотя в Телеграме про нее писал периодически и процесс написания продолжался. И вот, наконец, книга под названием «Python для инженерных задач» вышла. Сразу оставлю ссылку на сайт издательства, где можно прочитать оглавление и заказать ее. Книга получилась большая, больше, чем предполагалась изначально. На сайте написано, что она состоит из 416 страниц, но в реальности она содержит около 670 страниц.

Представитель издательства уже написал пост об этой книга на Хабре, а здесь я напишу о работе над этой книгой со своей стороны.

Читать далее ‘Как я писал книгу про Python’ »

Про генерацию кода искусственным интеллектом

Про генерацию кода искусственным интеллектом

Понадобилось мне для OutWiker сделать новый контрол для выбора цвета. Это должен быть выпадающий список (в простонародье — ComboBox), который вместо текста отображал бы прямоугольники разных цветов. Я очень не люблю делать свои контролы, но в какую сторону копать было понятно. Решил эту задачу переложить на братьев наших меньших (а в перспективе — больших), то есть на искусственный интеллект, и попросить его сгенерировать код.

Начал с Copilot. Результат меня прям очень впечатлил. Первоначальный запрос был такой:

«Напиши код компонента на Python с использованием библиотеки wxPython, который использует wx.adv.OwnerDrawnComboBox, чтобы выбирать цвет с помощью выпадающего списка. Каждый элемент выпадающего списка должен отображаться в виде прямоугольника своего цвета. Напиши код приложения, который этот компонент использует.»

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

«Пусть теперь нулевой элемент будет обозначать «цвет по умолчанию» и выводиться текстом, а последний элемент списка — «Выбрать цвет» и тоже выводиться текстом.»

Удивительно, но он сделал именно то, что я имел в виду. В процессе общения поправили некоторые мелочи, и оно заработало.

После этого мне стало интересно сравнить результат с другими нейронками. Начал с Яндекс GPT 4. Результат получился унылый. Работающего контрола от него я так и не добился. В выпадающем списке цветные прямоугольники он не смог нарисовать (хотя честно пытался, но все время что-то было не то).

Попробовал после этого нейронку от Сбера — GigaChat. С ним пришлось помучиться подольше, чем с Copilot, — приходилось часто указывать конкретные строки, где ИИ был не прав, и что там должно быть. Но в итоге контрол начал делать то, что от него требуется, хотя некоторые оформительские моменты придется за ним все-таки править руками. А на дополнительной хотелке нейронка ушла в бесконечный цикл и начала писать без передыху по три одинаковые строчки, которые к делу вообще не относятся. В другой раз по этому же запросу у нее перепутались код и комментарии к нему. Ну ладно, с бонусом она не справилась, но в целом тоже молодец.

Еще я на днях локально себе поставил опенсорсную нейронку Llama 3 (запускал через ollama). Код, который она генерила, тоже с ходу не заработал. Но еще у меня и комп для нее слабоват. Сначала ИИ отвечал относительно шустро, но если надо было исправить ошибку, то он начинал думать минут 10, и результат совсем не впечатлял. В общем, у меня не хватило терпения заставить эту нейронку написать рабочий код.

PS. Если кому интересно, то вот код, который в итоге получился у Copilot. Для получения этого кода понадобилось 7 запросов. И код, который получился у GigaChat . Сколько понадобилось запросов для получения этого кода не знаю, потому что история не сохранилась.

Для запуска этих исходников нужна библиотека wxPython.

Local-first-приложения

Local-first-приложения

Попалась мне недавно статья 2019 года с названием Local-first software. В этой статье авторы предлагают идеологию построения софта, которая меня сильно зацепила.

Сейчас у нас есть две крайности при выборе архитектуры софта. С одной стороны, имеются «старомодные» оффлайновые приложения, в которых все данные для работы хранятся у пользователя на компьютере. Для работы с такими приложениями не требуется постоянное подключение к интернету, если что-то случится с компанией, которая производила такой софт, то никто не мешает продолжать пользоваться последней доступной версией софта. В таких приложениях пользователь полностью владеет теми данными, которые он создает в этих приложениях. В то же время у полностью оффлайновых приложений есть проблемы с синхронизацией данных между устройствами, и почти всегда в таких приложениях невозможно организовать одновременную совместную работу над одним и тем же документом нескольким пользователям.

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

Читать далее ‘Local-first-приложения’ »

Узнал про еще один алгоритм глобальной оптимизации

Узнал про еще один алгоритм глобальной оптимизации

Один из моих интересов — это алгоритмы глобальной оптимизации. Классика — это генетический алгоритм, алгоритм имитации отжига и алгоритм роя частиц. Есть еще большое количество алгоритмов, в названии которых упоминается какая-нибудь живность. В своей диссертации для оптимизации я использовал кроме генетического алгоритма еще алгоритм роя пчел (не путайте с роем частиц, их постоянно все путают). Еще часто упоминается алгоритм муравьев (в основном для поиска пути), попадалось упоминание алгоритма кукушки (cuckoo search algorithm).

И вот еще недавно прочитал статью, где для оптимизации использовали алгоритм хаотичных воробьев (chaos sparrow search algorithm). Название уже интригует. Причем если почитать описание этого алгоритма, то там разворачивается прям блокбастерная история, напрашивающаяся на экранизацию. Среди роя воробьев выделяются воробьи-исследователи (explorers), последователи (followers) и мстители (vigilantes), и каждый из них перемещается по своему алгоритму. Дальше, чтобы не спойлерить, чем все это закончится, читайте описание алгоритма.

Даже захотелось попробовать реализовать такой алгоритм. Тем более, что у меня есть заброшенный проект на Rust с библиотекой подобных алгоритмов.

А еще у нас на кафедре должен появиться новый предмет про алгоритмы искусственного интеллекта в задачах оптимизации. Впервые его должны читать через несколько лет студентам, которые поступали к нам в этом году, и есть ненулевая вероятность, что вести его придется мне, по крайней мере я участвовал в составлении учебной программы. Добавлю себе в заметки еще алгоритм воробьев-хаотиков (гугл предлагает перевод «воробьи хаоса», что звучит еще более пугающе), вдруг пригодится.

Начал писать книжку про Python

А расскажу-ка я вам об одной авантюре, в которую недавно ввязался. Ну, может это и не совсем авантюра, но по крайней мере дело, которое требует к себе особого внимания. Если совсем коротко, то несколько месяцев назад я начал писать книгу про Python.

Как-то так случилось, что весной (кажется) мне написал представитель одного издательства, которое выпускает программерские книжки (Олег, если Вы это читаете, то привет Вам) с вопросом, не хочу ли я написать книжку. А я как раз в это время готовил материал и одновременно вел занятия со студентами по основам Python. С мыслью «а почему бы и нет» я взялся за это дело. Так что, я уже несколько месяцев пытаюсь складывать буквы в слова. Кроме букв иногда даже попадаются странные закорючки.

Ориентируюсь на наших студентов, которые учатся не на программистов, но с расчетом на то, что Python они будут использовать для инженерных задач и обработки данных. Поэтому в книге не будет ничего про веб-программирование, глубоко копать ООП тоже не будем (никакого множественного наследования и метаклассов), но при этом надо будет поподробнее рассказать про библиотеки Numpy, SciPy, Matplotlib и Pandas. При этом подразумевается, что студенты уже имеют представление о том, что такое программирование, переменные и циклы, и, возможно, даже поверхностно знают C.

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

Книга Алекса Сюя «System Design»

На днях дочитал книгу Алекса Сюя «System Design. Подготовка к сложному интервью». Эта книга меня заинтересовала тем, что в ней описаны подходы к проектированию архитектуры сложных веб-сервисов со стороны бэкенда. Книга построена в формате интервью на собеседовании при приеме на работу, когда кандидата просят нарисовать, как бы он выстраивал структуру какого-нибудь сервиса, если бы он начинал проектировать ее с нуля. Во всех примерах речь идет о высоконагруженных сервисах с миллионами пользователей.

На самом деле от формата интервью в книге только постановка задачи, где кандидат в диалоге с интервьюером обсуждают подробности будущей системы, кандидат выпытывает у интервьюера, какая ожидается нагрузка, какой объем данных предоставляется пользователю, после чего делает расчеты требуемого объема хранения данных и сколько ожидается запросов в секунду. Потом эти цифры нигде не используются, интервьюер уходит со сцены, а кандидат начинает свой монолог о том, как он видит структуру системы.

Кандидату в этой книге предстоит построить такие высоконагруженные системы, как поискового робота, систему сокращения URL-адресов, систему для отправки уведомлений пользователям (push-уведомления, SMS-уведомления, через почту и т.п.), ленту новостей блога, чаты, систему автозаполнения поисковых запросов, а в завершение ему предлагается нарисовать архитектуру будущих конкурентов для Youtube и Google Drive. Есть еще несколько глав, где требуется спроектировать один из компонентов таких систем — хранилище типа «ключ-значение», ограничитель трафика и распределенный генератор уникальных идентификаторов.

Читать далее ‘Книга Алекса Сюя «System Design»’ »

Книга Тиаго Антао «Сверхбыстрый Python»

Недавно дочитал книгу Тиаго Антао, которая в русскоязычном варианте называется «Сверхбыстрый Python», а в оригинале более скромно — «Fast Python». Ее подзаголовок — «Эффективные техники для работы с большими наборами данных». Сразу скажу, что книга мне очень понравилась и я ее всячески рекомендую тем, кто занимается обработкой данных или большими вычислениями с использованием Python.

Как известно, Python обладает репутацией медленного языка, и к сожалению, заслуженно. Его главное преимущество — это удобство работы. Но иногда требуется скорость, которую чистый Python обеспечить не может, а переписывать всю программу на C / C++ / Rust не хочется. К счастью, для таких случаев в Python есть обходные пути, позволяющие вроде бы писать на языке Python (или его подобии), но при этом значительно повысить скорость расчета или обработки данных. Тут надо оговориться, что книга посвящена приемам и библиотекам, работающим с реализацией CPython, не затрагивая другие реализации Python, такие как PyPy, IronPython, JPython и др.

По сути эта книга является сборником приемов, позволяющих подойти с разных сторон к решению задач оптимизации работы скриптов на Python. В основном внимание сосредоточено не на сложные математические вычисления, а на обработку больших данных. Каждая глава посвящена своей теме: асинхронное и многопроцессное программирование, использованию таких инструментов как Cython (не путайте с CPython) и Numba для компиляции скрипта в более низкоуровневый код, использованию видеокарт и распределенных вычислений. И везде на очень простых примерах, как правило не превышающих страницу, автор показывает основные идеи, используя разные библиотеки, и сравнивая между собой разные решения одной и то же задачи по скорости выполнения.

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

Далее я коротко пробегусь по главам книги и расскажу о чем они.

Читать далее ‘Книга Тиаго Антао «Сверхбыстрый Python»’ »