Архив по категории ‘программизм’.

Книга про Python. Отчет за декабрь

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

Читать далее ‘Книга про Python. Отчет за декабрь’ »

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

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

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

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

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

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

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

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

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

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

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

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

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

Книга про Python. Прогресс написания за ноябрь

Закончился ноябрь, надо подвести месячный итог написания книги про Python.

За этот месяц написал три с половиной главы:

  • про исключения — 21 страница;
  • про запись и чтение файлов, и тут же про двоичные строки — 24 страницы.
  • про работу с файловой системой (модули os.path, shutil и pathlib) — 25 страниц.
  • часть главы про обработку параметров командной строки — пока это скромные 6 страниц.

Итого, за месяц написал 76 страниц. Это очень много для этих глав. Изначально на исключения я закладывал 10 страниц, и все, что касается работы с файлами должно было занимать 20 страниц.

Всего на сегодняшний день написано 402 страницы. Потом во время вычитки придется все это сокращать раза в два.

По планам в декабре хочу написать главы про регулярные выражения и unit-тесты. После этого, наконец, можно будет перейти к описанию библиотек NumPy, Matplotlib и Pandas.

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

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

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

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

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

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

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

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

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

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

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

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

Прогресс с написанием книги про Python

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

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

А еще на графике можно заметить явно выделяющиеся участки. Первый — с начала и до 2 августа — там я пытался войти в ритм, пытался понять, в каком стиле писать, и там были самые скучные главу — общие слова про язык, базовые типы и Python как калькулятор. В это время график был неровный и дерганный. Второй участок — со 2 по 12 августа был полностью горизонтальный, потому что начался отпуск и я с друзьями уехал в поездку по Пермскому краю. По возвращению график стал заметно быстрее расти — это я из поездки вернулся, но отпуск на работе еще продолжался. Ну и с начала сентября пока растет тем же темпом, но скорее всего сейчас должен немного замедлиться, потому что часть времени сейчас уходит на подготовку к занятиям со студентами (и еще внезапно аспирантами). А так для себя я решил, что если за неделю я продвигаюсь на 15 страниц, то это нормально.

Переписал еще одну статью про Matplotlib

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

Новую версию по сути переписанной заново статьи вы можете прочитать по ссылке — Как рисовать графики в разных окнах.

Все статьи про рисование графиков в Python с помощью библиотеки Matplotlib можно увидеть по ссылке — Использование библиотеки Matplotlib.

OutWiker, Flatpak и WebKitGTK

OutWiker, Flatpak и WebKitGTK

Этот пост можно считать продолжением предыдущего, в котором я рассказывал о работе OutWiker в виде flatpak-пакета под Linux. В том посте я обещал рассказать о том, почему OutWiker до сих пор собиралась со старой версией runtime, а если быть более корректным, со старыми версиями org.gnome.Platform и org.gnome.Sdk, и как на днях эта проблема внезапно решилась, благодаря чему следующие версии OutWiker уже будут собираться со свежими версиями этих библиотек.

Чтобы понять, в чем заключается проблема, я нарисовал схему зависимостей OutWiker от библиотек, которую сейчас подробно опишу:

Читать далее ‘OutWiker, Flatpak и WebKitGTK’ »

Flatpak. Решение проблемы с долгим запуском приложений

Flatpak. Решение проблемы с долгим запуском приложений

Если вы читаете меня в Телеграм-канале (а если нет, то это повод начать), то уже читали пост о том, что после недавнего крупного обновления Manjaro Linux (на основе Arch Linux) у меня сломался OutWiker — возникли проблемы flatpak-пакетом, и даже из исходников его еле удалось запустить. Если еще не читали, то вот ссылки на начало и продолжение (в один пост не уместилось). Теперь я начинаю разгребать последствия.

Читать далее ‘Flatpak. Решение проблемы с долгим запуском приложений’ »

Еще одно обновление статей про Matplotlib

Обновил и во многом дополнил очередную статью из серии статей про использование библиотеки Matplotlib, предназначенной для построения графиков на Python.

В этот раз обновлению подверглась статья Создание интерфейса средствами библиотеки Matplotlib, в которой рассказывается о том, как в окно с графиком можно добавить элементы управления (виджеты). В Matplotlib их не так много: кнопка, поле ввода, два вида ползунков, переключатели (radio buttons) и флажки (check buttons), но для многих задач этого будет достаточно, чтобы обойтись только библиотекой Matplotlib без сторонних библиотек для создания GUI.

Кстати, про внедрение графиков Matplotlib в интерфейс программы, написанной на wxPython у меня тоже была статья.