vitus_wagner: My photo 2005 (Default)

Вот есть у меня сейчас несколько опенсурсных проектов, которыми может быть стоит заняться, пока не устроился на фулл-тайм работу

  1. переписать gost-engine на новый, появившийся в openssl 3.x интерфейс провайдеров.
  2. Если уж взялся, за провайдеров то покопаться в pkcs11 провайдере - вдруг там можно малой кровью допилить до поддержки гостовских алгоритмов. Правда плату за это надо требовать с Aktiv, потому что играться я буду с ruToken. А они вряд ли так сильно заинтересованы в этом.
  3. Посмотреть что у нас в Postgres с провайдерским интерфейсом openssl и может чего на коммитфест залить на предмет и алгоритмов, и токенов на клиенте. В 18 версию уже не успею, так хоть в 19.
  4. По-моему в собственно утилите openssl явно не хватает ключиков для работы с ключами и, особенно, сертификатами на токенах. Но не уверен что пропихнуть соответствующий патчик будет легко даже с помощью [personal profile] beldmit.
  5. Написать упрощенный CA для маленьких интранетов. Который будет ориентирован на генерацию ключа вместе с сертификатом, потому что и для внутрикорпоративных сайтов, и для openvpn это основной юз-кейс, когда администратор CA и администратор сайта/VPN - одно лицо. А то что CA.pl, что easy-rsa требуют два движения для получения сертифката - сначала создать ключ и заявку, а потом на заявку выписать сертификат. А здесь основное должен быть даже не код, а лежащий максимально близко к коду, чуть ли не в виде встроенного хелпа учебник по правильному обращению с сертифкатами и ключами. (надо [personal profile] irenedragon попытаться привлечь).
  6. Вспомнить про ctypescrypto и переписать ее под 3-е версии и python, и openssl (возможно пригодится для юнит-тестов на провайдеры. А возможно, для юнит-тестов на провайдеры надо портануть ctypescrypto на Platypus )
  7. Написать аналог calcurse но с бэкэндом пригодным для синрхронизации vdirsyncer. Под этот проект я даже когда-то репозиторий завел.
  8. Была у меня еще идея про линуксовый management interface для openvpn Правда из-за отсутствия у меня теперь необходимости ходить в конторскую openvpn оно как-то менее актуально стало.
  9. vws тоже надо бы переписать с нуля под третий питон и девятый qemu. Но может стоит подождать пока 12-й qemu выйдет.
vitus_wagner: My photo 2005 (Default)

Встретил в питоновском коде вот такую констркуцию

    def __init__(self, version: str) -> None:
        self._version = str(version)

Что бы это значило? Если мы на этапе type checking отсекаем все что не str, зачем нам явным образом преобразовывать значение в строку?

Или это на случай если код будет запущен без предварительной статической проверки на типы?

vitus_wagner: My photo 2005 (Default)

А вы знаете, сколько реализаций алгоритма SHA 256 нужно иметь в системе, чтобы заработал ansible?

  • python. У него есть hashlib в стандартной библиотке
  • openssh- надо. А он хочет libcrypto от openssl.
  • paramiko- надо, а она хочет python3-cryptography (слава богу устроила версия в которой еще не было Rust)
  • ... и python-nacl (вот зачем одному и тому же пакету и то, и другое одновременно?).
  • А еще python3-cryptodome

Я уже, кажется со счету сбился.

vitus_wagner: My photo 2005 (Default)

вот тут [personal profile] nataraj в очередной раз ругает Python. Но по-моему зря ругает. К сожалению это общее правило. Ежели нечто у нас практически полезное, оно не может быть концептуально чистым. Его задача get things done, а не научить людей правильно мыслить. Нельзя вырезать узор на дереве инструментом, который не позволяет порезаться.

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

Вот у нас есть такие инструменты как pylint и perlcritic, которые находят разнообразные стилистические и не только погрешности. Я вообще взял себе за правило не коммитить питоновский код, не проходящий pylint и шелловский код, не проходящий shellcheck, Потому что если проанализируешь все ворнинги этих инструментов и некоторые потключаешь управляющим комментарием в конкретном месте кода, будешь по крайней мере уверен что код делает то, что ты имел в виду.

Но для целей (само)обучения нужен инструмент более высокого уровня. Который будет тыкать в нос "вот у тебя 80% кода написано в объектной парадигме, а здесь ты почему-то используешь чисто процедурное решение". То есть отслеживать применение известных парадигм и выдавать предупреждение где происходит переключение с одной на другую. Наверное, с помощью нынешних LLM такое уже можно написать.

Видимо, тут нужен подход, подобный тому, который использует perlcritic - учебник, и в сообщениях программы линтера ссылки на конкретные разделы этого учебника, в которых достаточно пространно объяснено почему так не надо делать.

vitus_wagner: My photo 2005 (Default)

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

 # формируем в переменной cmd длинную команду с параметрами в виде списка
 logging.notice("Executing " + shlex.join(cmd))
 process = await asyncio.create_subprocess_exec(*cmd,
   stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Красоты захотелось. А вот в Debian oldstable не работает нифига. Потому что там python 3.7.3, а join в модуле shlex появился в 3.8. Пришлось там shlex.join заменить на " ".join, благо ничего страшного от кривого квотинга в логе не будет.

Ладно, доконфигурят коллеги новые ARM-ы не будет там уже oldstable.

vitus_wagner: My photo 2005 (Default)

Вышел новый питон. А в нем добавили pattern matching в стиле ML-ей, эрланга и Rust-а. Интересно, будет ли оно пользоваться популярностью, и если да - как скоро.

До сих пор как-то по-моему python развивался в противоположном направлении и высокоумные теоретические конструкции вроде lambda в нем норовили объявить deprecated. А тут вот полноценный pattern matching.

В остальном как-то ничего особо принципиально нового там не видно. Эх, избавиться бы поскорее от дистрибутивов с 3.2 и 3.4, чтобы можно было писать без огляднки на то что "вот это поддерижвается только с 3.5, а это - только с 3.8".

Кстати, у меня вот тут вчера на сервере опять запрос сертификтов с let's encrypt сломался. Потому что это было первое обновление сертификатов после апгрейда на bullseye. И acme_tiny вдруг внезапно обнаружила что просто "python" в системе больше нет. А догататься поискать python2 или python3 (оно вообще-то и с тем и с тем умеет) - шебанги у нас не настолько умны. Там тоже паттерн-матчинг нужен чтобы перебирать несколько вариантов интерпретатора (это я на днях наблюдал как jenkins java ищет на слейве. Не нашел что характерно, пришлось туда руками лезть и ставить).

Пришлось поставить на сервер специальный пакет python-is-python3. С ним сертифкаты обновились.

vitus_wagner: My photo 2005 (Default)

Имеется элементарная задачка - есть список шаблонов. Надо получить список файлов, удоволетворяющих любому из них.

У меня почему-то получается монструозная конструкция:

from glob import glob
from itertools import chain
chain(*[glob(x) for x in patterns])

Так то оно еще ничего выглядит, но когда там Inline список из десятка шаблонов, а все это в аргументе for... Неужели никак попроще нельзя?

Upd Приз моих симпатий получает двухуровневый comprehension:

import glob
{f for p in patterns for f in glob.glob(p)}

А фигурные скобки - это чтобы избежать дублирования, ежели получится что один и тот же файл удовлетворяет нескольим шаблонам. В результате будет set, ну и какая разница, for можно и по set гонять.

vitus_wagner: My photo 2005 (Default)

Задачку, запощенную вчера сумел решить только [personal profile] slobin.

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

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

vitus_wagner: My photo 2005 (Default)

Однако, насколько питон лучше С. В случае C-шных модулей мне приходится требовать от разработчиков, чтобы не пользовались фичами языка, появившимис позднее стандарта C-99, то есть 20 лет назад. А в случае python наиболее древняя версия, совместимость с которой требуется - 3.2.3, вышедшая всего 8 c половиной лет назад

vitus_wagner: My photo 2005 (Default)

На слешдоте пищут Python overtakes Java.

Хочется нарисовать картинку в стиле традиционной медицинской эмблемы "Тёща ест мороженное", только вместо вазочки для мороженного - кофейная чашечка.

vitus_wagner: My photo 2005 (Default)

Интересно, а до 3.14.15 нумерация дойдет? Он же всё-таки пи-тон.

vitus_wagner: My photo 2005 (Default)
Наконец довел скрипт, про который я писал еще дые недели назад до состояния, что не стыдно выложить на github. Всё не мог собраться и дописать туда поддержку djvu. Поддержку мэппинга имен авторов в каноническую форму и запуска скрипта с cwd не совпадающей с корнем электронной библиотеки пока не делал.
vitus_wagner: My photo 2005 (Default)

Написал себе новый скрипт для сортировки электронных книг. Уже не на shell через xmlstarlet, а на python с использованием xml.etree. Etree гораздо более требователен к валидности xml, поэтому на некоторые книги, особенно происходящие с Самиздата оно злобно ругалось, пришлось их немного руками править.

Что самое забавное, при корректной работе с namespace началась еще и чехарда с epub-ами. Выяснилось что имеющиеся у меня epub-ы используют аж три версии Doublin Core:

  1. http://purl.org/dc/elements/1.1/
  2. http://purl.org/dc/elements/1.0/
  3. http://purl.org/metadata/dublin_core

Вообще-то я все это затеял, чтобы хранить fb2 не зазипованными, как раньше (и как они скачиваются и с флибусты, и с самлиба), а распакованными, чтобы было удобнее их синхронизировать с электронной книгой. Почему-то epub раззиповывать эта железяка умеет, а .fb2.zip - в два приема - сначала раззиповывает и выкидывает меня в главное меню, потом опять ищи по иерархии директорий то место, куда она его распаковала.

Правда моя малая библиотека (которая ранее синхронизировалась со смартфоном) в таком виде не лезет в 4 гига. Надо либо не копировать на электронную книгу pdf и djvu, их все равно читать с ее экрана неудобно, либо проредить fb2. А то там у меня полно вещей, которые я начал читать, а они не пошли.

С другой стороны, наоборот, хочется приделать раскладывалку по каталогам по именам авторов и к pdf и djvu тоже. Правда, там будет общая засада с epub - имена авторов в метаинформации этих форматов, пишут как попало, и надо как-то объяснить скрипту, что "Первушин Антон Иванович" это

<last-name>Первушин</last-name>
<first-name>Антон</first-name>
<middle-name>Иванович</middle-name>
а вот Ursula leGuin это
<first-name>Ursula</first-name> 
<last-name>leGuin</last-name>

Причем, естественно, варианты с разным порядком частей имени встречаются во всех языках, на которых я читаю.

vitus_wagner: My photo 2005 (Default)
Имеем вот такой файлик:
# -*- encoding: utf-8 -*-
from __future__ import print_function

class Callme:
    def __init__(self, arg):
        if arg:
            self.__call__ = self.foo
        else:
            self.__call__ = self.bar
    def foo(self):
        print("foo")
    def bar(self):
        print("bar")
    

x = Callme(True)
x()
y = Callme(False)
y()     


Запускаем
python3 call.py
Traceback (most recent call last):
  File "caller.py", line 17, in 
    x()
TypeError: 'Callme' object is not callable


python3 call.py
foo
bar


Что я делаю не так?
Я, конечно могу обмануть питон, объявив
def __call__(self, *args):
     return self.action(*args)

а в конструкторе присваивать self.action. Но как-то оно странно. Всю жизнь думал что в питоне все логично, и если можно методы присваивать, то любые можно.

О, оказывается можно присвоить self.__class__.__caller__. Тогдавсе работает.
И меня в принципе устраивает. Поскольку тот объект, которому я хочу менять поведение при вызове в программе
в любом случае ровно один.
vitus_wagner: My photo 2005 (Default)
Выяснил что в стандартной библиотеке питона модуль collections, а в нем функция namedtuple. Позволяющая генерировать наборы данных с именованными полями и нулевым оверхедом. Более того named tuples - hashable, т.е. могут использоваться в качестве индекстов dict или элементов множества. И их очень удобно создавать из списков, dictionaries и тому подобных конструкций.

Теперь хочу реализацию операций реляционной алгебры над set of named tuples.
vitus_wagner: My photo 2005 (Default)
Долгое время я для работы с адресной книжкой в формате vcard пользоватлся самописным питоновским (Python2 only) скриптом. Который использовал свой собственный vcard-parser (зато понимат vcard2.0, как его генерят старые кнопочные телефоны), не умел объединять контакты и все такое прочее.

Потом, с появлением radicale и vdirsyncer перешел на khard, который использует модуль vobject. Выяснилось, правда, что унаследованные еще от Ericsson R320 контакты из записной книжки в нем обрабатываются не очень хорошо, но это вопрос однократного преобразования формата.

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

Удобно редактировать контакт в виде развесистого yaml файла с кучей подсказок.

Что неудобно

1. Полное отстуствие средств работы с фото. (кстати, патчик на гитхабе давно висит.
2. Отсутствие экспорта в формате vcard. То есть отредактировать исходную vcard можно, а выдать на stdout нельзя. Зато можно имя файла получить.
3. Отсутствие импорта. Нельзя повесить khard в качестве mailcap-обработчика на text/x-vcard с тем чтобы приложенные к письмам подиписи импортировать в записную книжку или то же самое сделать с переданными по блютус с чьего-то телефона визитными карточками.
4. Недопортировано на python3. Ошибки вида TypeError: __str__ returns bytes object периодически вылетают.
Впрочем не буду кидать в автора камень. У самого в ctypescrypto с этим сложности.
5. Не умеет работать с внешними адресными книгами. Ладно, черт с ним, я согласен прописать в конфиг.
Но нужно тогда добавить возможность по умолчанию не искать по некоторым книгам. Хотя я бы предпочел возможность просто указать в командной строке имя файла/директории

Вот думаю - то ли пофиксить и заслать pull-реквест, то ли свой скрипт починить.

У моего скрипта было еще то преимущество, что он работал с записной книжкой в одном файле, а не по файлику на контакт. А именно такую книжку умеет читать claws-mail. Впрочем vdirsyncer одно в другое легко преобразует.
vitus_wagner: My photo 2005 (Default)
Поразвлекался еще тут немного с не самым мейнстримным календарным софтом - vCalendar plugin к claws-mail
и calcurse.

Задача, которую хочется решить - это обеспечить нормальную синхронизацию между андродидным календарем и десктопным с использованием своего caldav сервера (в качестве которог у меня radicale).

То есть получается следуюая картина:

Есть vdirsyncer, который синхронизирует локальный ics-файл с сервером, есть андроидные устройства на которых тоже все впорядке.

vCalendar plugin умеет импортировать ics. И даже автоматически его обновалять. В режиме чтения все нормально.
Но вот создавать новые события он будет не в импортированном календаре а в своем собственном (они выглядят в дереве папок как две соседние папки внутри vCalendar).

Он умеет экспортировать свой календарь в .ics-файл. Но в другой. И даже вызывать указанную программу после экспорта. И при этом:

1. Делает его нечитаемым для питоновского модуля vobject, на базе котрого сделан radicale. Путем добавления туда некоторых полей с датой 0000000T000000 на которые питон весьма обоснованно ругается "не бывает нулевого месяца".
2. экспортирует не только новые события но и те, которые были эксполртированы.
3. Таймзону ставит GMT.

Следовательно, если я хочу обратно засинхронизировать события, измененные в claws-mail в radicale, мне нужно
0. Перед разбором средствами модуля vobject удалить поля с некорректной датой.
1. Выцепить из экспортированного файла новые события
2. Поменять им временную зону на ту, которую использует radicale
3. Скопировать их в тот календарь, который синхронизирует vdirsyncer.

В принципе все это на питоне через тот же vobject делается в два экрана. Но может быть лучше взять исходники плагина и поправить. (хотя это -то придется делать на C++).

Что касается calcurse, то при всех его симпатичных свойствах он использует собственный формат хранения, а не ics. И при повтороном импорте изменившегося ics-файла дублирует события - отфильтровать по uid не догадыватеся.
Зато его можно повесить обработчиком mime-тип text/calendar в текстовый почтовый клиент вроде mutt.
Но только если этот клиент у вас единственный и ни с чем синхронизировать его вы не хотите. Или по крайней мере все остальные календари будут read-only.

Возникает мысль взять питоновские модули curses и написать программму с интерфейсмо в точности как у calcurse, но использующую в качестве backend-хранилища ics-файл, синхронизируемый vdirsyncer-ом.
vitus_wagner: My photo 2005 (Default)
https://pypi.org/project/fstrans/

В основном ради того, чтобы научитсья пользоваться setuptools. Хотя сам модуль в общем вполне практически полезный. Для себя делал. Базовую идею я придумал еще во времена Communiware, где картинки хранились на диске, а текст в базе данных, и требовалось сделать чтобы картинкам можно было сделать rollback. Тогда соответствующий код, конечно же был на перле написан, а не на питоне.

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

И таки да, test suite запускается штатными средствами setuptools. В distutis, когда я там делал поддержку запуска test suite для ctypsecrypto, все руками приходилось делать.

P.S. Надо бы найти время и переписать setup от ctypsecrypto на setuptools, а заодно окончательно починить там работу с бинарными данными в 3-м питоне.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

May 2025

S M T W T F S
    1 2 3
4 56 7 8 9 10
11 12 131415 1617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 12:16 am
Powered by Dreamwidth Studios