<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2011-04-07:738732</id>
  <title>Журнал Витуса</title>
  <subtitle>vitus_wagner</subtitle>
  <author>
    <name>vitus_wagner</name>
  </author>
  <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom"/>
  <updated>2025-12-09T06:06:35Z</updated>
  <dw:journal username="vitus_wagner" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2522267</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2522267.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2522267"/>
    <title>На распутье</title>
    <published>2025-12-09T06:00:20Z</published>
    <updated>2025-12-09T06:06:35Z</updated>
    <category term="open source"/>
    <category term="компьютерное"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">&lt;p&gt;Захотел вот написать пару небольших программок с полноэкраннм текстовым интерфейсом.
И задумался, а какой инструментарий для этого выбрать.&lt;/p&gt;

&lt;p&gt;В принципе, интерфейс задуман достаточно простой. Его можно как в прошлом веке на чистом curses написать.
И, пожалуй, это будет быстрее, чем изучать современные фреймворки.&lt;/p&gt;

&lt;p&gt;Но может быть стоит посмотреть на что-то более современное?&lt;/p&gt;

&lt;p&gt;Пока рассматриваю два варианта &lt;a href="https://urwid.org/"&gt;urwid&lt;/a&gt; и &lt;a href="https://github.com/willmcgugan/textual"&gt;textual&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Первый кажется более обозримым, но как-то набор виджетов совершенно непривычный. Я всё-таки в CUA парадигме воспитан и диалоговые окна мыслю в терминах комобоксов, строк ввода и тому подобное и неизменных размеров.
А там скроллируемые виджеты-контейнеры (что, конечно при ограниченном разрешении текстовых экранов может быть полезно, если не злоупотреблять). &lt;/p&gt;

&lt;p&gt;Второй - более развесистый, есть например готовый tree widget. Но за красоту платить придется, и платить в первую очередь местом на экране. Ну что такое текстовая кнопка в три строки размером? Даже в Turbo Vision две было.&lt;/p&gt;

&lt;p&gt;X-Post to &lt;a href="https://vitus-wagner.livejournal.com/1720721.html"&gt;LJ&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2522267" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2521398</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2521398.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2521398"/>
    <title>Прежде чем что-нибудь сделать, посмотри, не сделал ли это кто-нибудь уже</title>
    <published>2025-12-03T06:50:45Z</published>
    <updated>2025-12-03T06:53:52Z</updated>
    <category term="python"/>
    <category term="lj"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">&lt;p&gt;Тут нашел очень полезный инструмент &lt;a href="https://github.com/techgaun/active-forks"&gt;поиск активных форков на github&lt;/a&gt; и с его помощью выяснил, что нашелся добрый человек &lt;a href="https://github.com/timmc"&gt;Тим МакКормак&lt;/a&gt;, который не поленился портировать &lt;a href="https://github.com/timmc/ljdump"&gt;ljdump&lt;/a&gt; на третий питон.&lt;/p&gt;

&lt;p&gt;Ура, у меня опять резервно копируется ЖЖ и Dreamwidth.  C февраля не копировались. Надо что ли это еженедельно в крон поставить, чтобы само делалось. А то я это как-то раньше руками запускал, и довольно нерегулярно.&lt;/p&gt;

&lt;p&gt;А поиска-то нормального по ЖЖ нет, а по локальной копии - очень даже.&lt;/p&gt;

&lt;p&gt;Естественно, я эти изменения втянул в &lt;a href="https://github.com/vbwagner/ljdump"&gt;свой форк&lt;/a&gt;,&lt;/p&gt;

&lt;p&gt;Надо что-ли его отблагодарить и сделать ему пулл-реквест с задержками для обхода анти-бот политики ЖЖ.&lt;/p&gt;

&lt;p&gt;X-Post to &lt;a href="https://vitus-wagner.livejournal.com/1720231.html"&gt;LJ&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2521398" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2482899</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2482899.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2482899"/>
    <title>Проекты</title>
    <published>2025-04-23T14:25:54Z</published>
    <updated>2025-04-23T14:25:54Z</updated>
    <category term="python"/>
    <category term="криптография"/>
    <category term="qemu"/>
    <category term="open source"/>
    <category term="ctypescrypto"/>
    <dw:security>public</dw:security>
    <dw:reply-count>12</dw:reply-count>
    <content type="html">&lt;p&gt;Вот есть у меня сейчас несколько опенсурсных проектов, которыми может быть стоит заняться, пока не устроился на фулл-тайм работу&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;переписать &lt;a href="https://github.com/gost-engine/engine"&gt;gost-engine&lt;/a&gt; на новый, появившийся в openssl 3.x интерфейс &lt;a href="https://docs.openssl.org/master/man7/provider/"&gt;провайдеров&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Если уж взялся, за провайдеров то покопаться в &lt;a href="https://github.com/latchset/pkcs11-provider"&gt;pkcs11 провайдере&lt;/a&gt; - вдруг там можно малой кровью допилить до поддержки гостовских алгоритмов. Правда плату за это надо требовать с Aktiv, потому что играться я буду с ruToken. А они вряд ли так сильно заинтересованы в этом.&lt;/li&gt;
&lt;li&gt;Посмотреть что у нас в Postgres с провайдерским интерфейсом openssl и может чего на коммитфест залить на предмет и алгоритмов, и токенов на клиенте. В 18 версию уже не успею, так хоть в 19.&lt;/li&gt;
&lt;li&gt;По-моему в собственно утилите openssl явно не хватает ключиков для работы с ключами и, особенно, сертификатами на токенах. Но не уверен что пропихнуть соответствующий патчик будет легко даже с помощью &lt;span style='white-space: nowrap;'&gt;&lt;a href='https://beldmit.dreamwidth.org/profile'&gt;&lt;img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='https://beldmit.dreamwidth.org/'&gt;&lt;b&gt;beldmit&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Написать упрощенный CA для маленьких интранетов. Который будет ориентирован на генерацию ключа вместе с сертификатом, потому что и для внутрикорпоративных сайтов, и для openvpn это основной юз-кейс, когда администратор CA и администратор сайта/VPN - одно лицо. А то что CA.pl, что easy-rsa требуют два движения для получения сертифката - сначала создать ключ и заявку, а потом на заявку выписать сертификат. А здесь основное должен быть даже не код, а лежащий максимально близко к коду, чуть ли не в виде встроенного хелпа учебник по правильному обращению с сертифкатами и ключами. (надо &lt;span style='white-space: nowrap;'&gt;&lt;a href='https://irenedragon.dreamwidth.org/profile'&gt;&lt;img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='https://irenedragon.dreamwidth.org/'&gt;&lt;b&gt;irenedragon&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; попытаться привлечь).&lt;/li&gt;
&lt;li&gt;Вспомнить про &lt;a href="https://github.com/vbwagner/ctypescrypto"&gt;ctypescrypto&lt;/a&gt; и переписать ее под 3-е версии и python, и openssl (возможно пригодится для юнит-тестов на провайдеры. А возможно, для юнит-тестов на провайдеры надо портануть ctypescrypto на &lt;a href="https://metacpan.org/pod/FFI::Platypus"&gt;Platypus&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;Написать аналог &lt;a href="https://calcurse.org"&gt;calcurse&lt;/a&gt; но с бэкэндом пригодным для синрхронизации &lt;a href="https://github.com/pimutils/vdirsyncer"&gt;vdirsyncer&lt;/a&gt;. Под этот проект я даже когда-то &lt;a href="https://www.wagner.pp.ru/fossil/vcal/index"&gt;репозиторий&lt;/a&gt; завел.&lt;/li&gt;
&lt;li&gt;Была у меня еще идея про &lt;a href="https://www.wagner.pp.ru/fossil/ovpnctl/index"&gt;линуксовый management interface для openvpn&lt;/a&gt; Правда из-за отсутствия у меня теперь необходимости ходить в конторскую openvpn оно как-то менее актуально стало.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wagner.pp.ru/fossil/vws/index"&gt;vws&lt;/a&gt; тоже надо бы переписать с нуля под третий питон и девятый qemu. Но может стоит подождать пока 12-й qemu выйдет.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2482899" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2472353</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2472353.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2472353"/>
    <title>vitus_wagner @ 2025-02-28T08:53:00</title>
    <published>2025-02-28T05:55:49Z</published>
    <updated>2025-02-28T05:55:49Z</updated>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>12</dw:reply-count>
    <content type="html">&lt;p&gt;Встретил в питоновском коде вот такую констркуцию&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    def __init__(self, version: str) -&amp;gt; None:
        self._version = str(version)
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;Или это на случай если код будет запущен без предварительной статической проверки на типы?&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2472353" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2460729</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2460729.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2460729"/>
    <title>И еще про ансибля (... ... ..  откликнулось эхо)</title>
    <published>2024-12-09T15:06:19Z</published>
    <updated>2024-12-09T15:13:50Z</updated>
    <category term="python"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>8</dw:reply-count>
    <content type="html">&lt;p&gt;А вы знаете, сколько реализаций алгоритма SHA 256 нужно иметь в системе, чтобы заработал ansible?&lt;/p&gt;

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

&lt;p&gt;Я уже, кажется со счету сбился.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2460729" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2442077</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2442077.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2442077"/>
    <title>Paradigm Linter</title>
    <published>2024-07-10T07:25:45Z</published>
    <updated>2024-07-10T07:27:30Z</updated>
    <category term="компьютерное"/>
    <category term="образование"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>21</dw:reply-count>
    <content type="html">&lt;p&gt;&lt;a href="https://nataraj.dreamwidth.org/996540.html"&gt;вот тут&lt;/a&gt; &lt;span style='white-space: nowrap;'&gt;&lt;a href='https://nataraj.dreamwidth.org/profile'&gt;&lt;img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='https://nataraj.dreamwidth.org/'&gt;&lt;b&gt;nataraj&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; в очередной раз ругает Python. Но по-моему зря ругает. К сожалению это общее правило. Ежели нечто у нас практически полезное, оно не может быть концептуально чистым. Его задача get things done, а не научить людей правильно мыслить. Нельзя вырезать узор на дереве инструментом, который не позволяет порезаться.&lt;/p&gt;

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

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

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

&lt;p&gt;Видимо, тут нужен подход, подобный тому, который использует perlcritic - учебник, и в сообщениях программы линтера ссылки на конкретные разделы этого учебника, в которых достаточно пространно объяснено почему так не надо делать.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2442077" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2358044</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2358044.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2358044"/>
    <title>Змейско-пиявское</title>
    <published>2023-01-26T12:29:45Z</published>
    <updated>2023-01-26T12:33:12Z</updated>
    <category term="компьютерное"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Вчера ухитрился написать программу, несовместимую с python 3.7. И ведь было бы что важнное. А всео-то был вот такой код&lt;/p&gt;

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

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

&lt;p&gt;Ладно, доконфигурят коллеги новые ARM-ы не будет там уже oldstable.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2358044" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2278192</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2278192.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2278192"/>
    <title>Python 3.10</title>
    <published>2021-10-10T07:38:29Z</published>
    <updated>2021-10-10T09:39:05Z</updated>
    <category term="компьютерное"/>
    <category term="open source"/>
    <category term="python"/>
    <category term="debian"/>
    <dw:security>public</dw:security>
    <dw:reply-count>21</dw:reply-count>
    <content type="html">&lt;p&gt;Вышел новый питон. А в нем добавили pattern matching в стиле ML-ей, эрланга и Rust-а.
Интересно, будет ли оно пользоваться популярностью, и если да - как скоро.&lt;/p&gt;

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

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

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

&lt;p&gt;Пришлось поставить на сервер специальный пакет python-is-python3. С ним сертифкаты обновились.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2278192" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2233062</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2233062.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2233062"/>
    <title>List flattiening in python</title>
    <published>2021-02-17T07:30:28Z</published>
    <updated>2021-02-17T13:24:25Z</updated>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>27</dw:reply-count>
    <content type="html">&lt;p&gt;Имеется элементарная задачка - есть список шаблонов. Надо получить список файлов, удоволетворяющих любому из них.&lt;/p&gt;

&lt;p&gt;У меня почему-то получается монструозная конструкция:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from glob import glob
from itertools import chain
chain(*[glob(x) for x in patterns])
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;&lt;strong&gt;Upd&lt;/strong&gt; Приз моих симпатий получает двухуровневый comprehension:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import glob
{f for p in patterns for f in glob.glob(p)}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;А фигурные скобки - это чтобы избежать дублирования, ежели получится что один и тот же файл удовлетворяет нескольим шаблонам. В результате будет set, ну и какая разница, for можно и по set гонять.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2233062" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2223545</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2223545.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2223545"/>
    <title>Отгадка</title>
    <published>2021-01-12T07:20:58Z</published>
    <updated>2021-01-12T08:14:38Z</updated>
    <category term="open source"/>
    <category term="python"/>
    <category term="криптография"/>
    <dw:security>public</dw:security>
    <dw:reply-count>11</dw:reply-count>
    <content type="html">&lt;p&gt;Задачку, &lt;a href="https://vitus-wagner.dreamwidth.org/2222224.html"&gt;запощенную вчера&lt;/a&gt; сумел решить только &lt;span style='white-space: nowrap;'&gt;&lt;a href='https://slobin.dreamwidth.org/profile'&gt;&lt;img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='https://slobin.dreamwidth.org/'&gt;&lt;b&gt;slobin&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;В картинке содержался стеганографический текст, упакованный туда с помощью программы &lt;a href="https://pypi.org/project/stepic/"&gt;stepic&lt;/a&gt;.
В процессе переписки в stepic-е был выявлен &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=979864"&gt;баг&lt;/a&gt;, который, впрочем, имеет простой воркэраунд.&lt;/p&gt;

&lt;p&gt;Всем, искавшим тайный смысл в цвете шерсти кошки Варьки присваивается звание почетного гражданина г. Вращенцы.
(у кого его еще не было).&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2223545" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2205556</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2205556.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2205556"/>
    <title>Python vs C</title>
    <published>2020-11-18T08:43:33Z</published>
    <updated>2020-11-18T08:50:19Z</updated>
    <category term="компьютерное"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>15</dw:reply-count>
    <content type="html">&lt;p&gt;Однако, насколько питон лучше С. В случае C-шных модулей мне приходится требовать от разработчиков, чтобы не пользовались фичами языка, появившимис позднее стандарта C-99, то есть 20 лет назад. А в случае python наиболее древняя версия, совместимость с которой требуется  - 3.2.3, вышедшая всего 8 c половиной лет назад&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2205556" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2203163</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2203163.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2203163"/>
    <title>Новое рабочее место Гвидо</title>
    <published>2020-11-12T19:40:35Z</published>
    <updated>2020-11-12T19:40:35Z</updated>
    <category term="python"/>
    <category term="windows"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>23</dw:reply-count>
    <content type="html">&lt;p&gt;&lt;a href="https://techcrunch.com/2020/11/12/python-creator-guido-van-rossum-joins-microsoft/"&gt;Хорошо, что не Гугль&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2203163" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2201611</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2201611.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2201611"/>
    <title>Python и Java</title>
    <published>2020-11-06T14:03:26Z</published>
    <updated>2020-11-06T14:03:26Z</updated>
    <category term="непричесанные ассоциации"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>14</dw:reply-count>
    <content type="html">&lt;p&gt;На слешдоте пищут &lt;a href="https://developers.slashdot.org/story/20/11/06/039234/python-overtakes-java-to-become-the-second-most-popular-programming-language"&gt;Python overtakes Java&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Хочется нарисовать картинку в стиле традиционной медицинской эмблемы "Тёща ест мороженное", только вместо вазочки для мороженного - кофейная чашечка.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2201611" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2192733</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2192733.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2192733"/>
    <title>Вышел питон 3.9.0</title>
    <published>2020-10-06T11:50:19Z</published>
    <updated>2020-10-06T11:50:19Z</updated>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>16</dw:reply-count>
    <content type="html">&lt;p&gt;Интересно, а до 3.14.15  нумерация дойдет?
Он же всё-таки пи-тон.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2192733" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2175108</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2175108.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2175108"/>
    <title>Электронно-библиотечное-2</title>
    <published>2020-07-13T09:12:50Z</published>
    <updated>2020-07-13T09:12:50Z</updated>
    <category term="fb2"/>
    <category term="python"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>4</dw:reply-count>
    <content type="html">Наконец довел скрипт, про который я писал еще &lt;a href="https://vitus-wagner.dreamwidth.org/2171185.html"&gt;дые недели назад&lt;/a&gt; до состояния, что не стыдно выложить на &lt;a href="https://github.com/vbwagner/booksort"&gt;github&lt;/a&gt;.

Всё не мог собраться и дописать туда поддержку djvu. Поддержку мэппинга имен авторов в каноническую форму и запуска скрипта с cwd не совпадающей с корнем электронной библиотеки пока не делал.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2175108" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2171185</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2171185.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2171185"/>
    <title>Электронно-библиотечное</title>
    <published>2020-06-30T07:36:33Z</published>
    <updated>2020-06-30T07:37:04Z</updated>
    <category term="компьютерное"/>
    <category term="fb2"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">&lt;p&gt;Написал себе новый скрипт для сортировки электронных книг. Уже не на shell через xmlstarlet, а на python с использованием xml.etree. Etree гораздо более требователен к валидности xml, поэтому на некоторые книги, особенно происходящие с Самиздата оно злобно ругалось, пришлось их немного руками править.
&lt;p&gt;
Что самое забавное, при корректной работе с namespace началась еще и чехарда с epub-ами. Выяснилось что имеющиеся у меня epub-ы используют аж три версии Doublin Core:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;http://purl.org/dc/elements/1.1/
&lt;li&gt;http://purl.org/dc/elements/1.0/
&lt;li&gt;http://purl.org/metadata/dublin_core
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Вообще-то я все это затеял, чтобы хранить fb2 не зазипованными, как раньше (и как они скачиваются и с флибусты, и с самлиба), а распакованными, чтобы было удобнее их синхронизировать с электронной книгой. Почему-то epub раззиповывать эта железяка умеет, а .fb2.zip - в два приема - сначала раззиповывает и выкидывает меня в главное меню, потом опять ищи по иерархии директорий то место, куда она его распаковала.
&lt;/p&gt;
&lt;p&gt;Правда моя малая библиотека (которая ранее синхронизировалась со смартфоном) в таком виде не лезет в 4 гига. Надо либо не копировать на электронную книгу pdf и djvu, их все равно читать с ее экрана неудобно, либо проредить fb2. А то там у меня полно вещей, которые я начал читать, а они не пошли.
&lt;/p&gt;
&lt;p&gt;С другой стороны, наоборот, хочется приделать раскладывалку по каталогам по именам авторов и к pdf и djvu тоже. Правда, там будет общая засада с epub - имена авторов в метаинформации этих форматов, пишут как попало, и 
надо как-то объяснить скрипту, что "Первушин Антон Иванович" это 
&lt;pre&gt;
&amp;lt;last-name&amp;gt;Первушин&amp;lt;/last-name&amp;gt;
&amp;lt;first-name&amp;gt;Антон&amp;lt;/first-name&amp;gt;
&amp;lt;middle-name&amp;gt;Иванович&amp;lt;/middle-name&amp;gt;&lt;/pre&gt;
а вот Ursula leGuin это 
&lt;pre&gt;&amp;lt;first-name&amp;gt;Ursula&amp;lt/first-name&amp;gt; 
&amp;lt;last-name&amp;gt;leGuin&amp;lt;/last-name&amp;gt;&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;
Причем, естественно, варианты с разным порядком частей имени встречаются во всех языках, на которых я читаю.
&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2171185" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2159845</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2159845.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2159845"/>
    <title>Вот почему оно так?</title>
    <published>2020-04-22T20:09:12Z</published>
    <updated>2020-04-23T06:04:23Z</updated>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>15</dw:reply-count>
    <content type="html">Имеем вот такой файлик:&lt;br /&gt;&lt;pre&gt;
# -*- 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()     
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Запускаем &lt;br /&gt;&lt;pre&gt;
python3 call.py
Traceback (most recent call last):
  File "caller.py", line 17, in &lt;module&gt;
    x()
TypeError: 'Callme' object is not callable
&lt;/module&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
python3 call.py
foo
bar
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Что я делаю не так?&lt;br /&gt;Я, конечно могу обмануть питон, объявив&lt;br /&gt;&lt;pre&gt;
def __call__(self, *args):
     return self.action(*args)
&lt;/pre&gt;&lt;br /&gt;а в конструкторе присваивать self.action. Но как-то оно странно. Всю жизнь думал что в питоне все логично, и если можно методы присваивать, то любые можно.&lt;br /&gt;&lt;br /&gt;О, оказывается можно присвоить &lt;tt&gt;self.__class__.__caller__.&lt;/tt&gt; Тогдавсе работает.&lt;br /&gt;И меня в принципе устраивает. Поскольку тот объект, которому я хочу менять поведение при вызове в программе&lt;br /&gt;в любом случае ровно один.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2159845" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2129491</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2129491.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2129491"/>
    <title>Питонистическое.</title>
    <published>2020-01-05T18:44:19Z</published>
    <updated>2020-01-05T18:44:19Z</updated>
    <category term="компьютерное"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>37</dw:reply-count>
    <content type="html">Выяснил что в стандартной библиотеке питона модуль collections, а в нем функция namedtuple. Позволяющая генерировать наборы данных с именованными полями и нулевым оверхедом. Более того named tuples - hashable, т.е. могут использоваться в качестве индекстов dict или элементов множества. И их очень удобно создавать из списков, dictionaries и тому подобных конструкций. &lt;br /&gt;&lt;br /&gt;Теперь хочу реализацию операций реляционной алгебры над set of named tuples.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2129491" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2127386</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2127386.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2127386"/>
    <title>Чем мне не нравится khard</title>
    <published>2019-12-24T13:09:03Z</published>
    <updated>2019-12-24T13:38:22Z</updated>
    <category term="python"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>16</dw:reply-count>
    <content type="html">Долгое время я для работы с адресной книжкой в формате vcard пользоватлся самописным питоновским (Python2 only) скриптом. Который использовал свой собственный vcard-parser (зато понимат vcard2.0, как его генерят старые кнопочные телефоны), не умел объединять контакты и все такое прочее.&lt;br /&gt;&lt;br /&gt;Потом, с появлением radicale и vdirsyncer перешел на &lt;a href="https://github.com/scheibler/khard"&gt;khard&lt;/a&gt;, который использует модуль vobject. Выяснилось, правда, что унаследованные еще от Ericsson R320 контакты из записной книжки в нем обрабатываются не очень хорошо, но это вопрос однократного преобразования формата.&lt;br /&gt;&lt;br /&gt;Что там приятно - в ряде операций где нужно выбрать один контакт, а заданный поисковый критерий возвращает несколько, удобно сделано меню выбора нужного.&lt;br /&gt;&lt;br /&gt;Удобно редактировать контакт в виде развесистого yaml файла с кучей подсказок.&lt;br /&gt;&lt;br /&gt;Что неудобно&lt;br /&gt;&lt;br /&gt;1. Полное отстуствие средств работы с фото. (кстати, &lt;a href="https://github.com/scheibler/khard/issues/107#issuecomment-312125519"&gt;патчик&lt;/a&gt; на гитхабе давно висит.&lt;br /&gt;2. Отсутствие экспорта в формате vcard. То есть отредактировать исходную vcard можно, а выдать на stdout нельзя. Зато можно имя файла получить.&lt;br /&gt;3. Отсутствие импорта. Нельзя повесить khard в качестве mailcap-обработчика на text/x-vcard с тем чтобы приложенные к письмам подиписи импортировать в записную книжку или то же самое сделать с переданными по блютус  с чьего-то телефона визитными карточками.&lt;br /&gt;4. Недопортировано на python3. Ошибки вида TypeError: __str__ returns bytes object периодически вылетают.&lt;br /&gt;Впрочем не буду кидать в автора камень. У самого в ctypescrypto с этим сложности.&lt;br /&gt;5. Не умеет работать с внешними адресными книгами. Ладно, черт с ним, я  согласен прописать в конфиг. &lt;br /&gt;Но нужно тогда добавить возможность по умолчанию не искать по некоторым книгам. Хотя я бы предпочел возможность просто указать в командной строке имя файла/директории&lt;br /&gt;&lt;br /&gt;Вот думаю - то ли пофиксить и заслать pull-реквест, то ли свой скрипт починить.&lt;br /&gt;&lt;br /&gt;У моего скрипта было еще то преимущество, что он работал с записной книжкой в одном файле, а не по файлику на контакт. А именно такую книжку умеет читать claws-mail. Впрочем vdirsyncer одно в другое легко преобразует.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2127386" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2127183</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2127183.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2127183"/>
    <title>Все врут календари.</title>
    <published>2019-12-23T10:17:48Z</published>
    <updated>2019-12-23T10:17:48Z</updated>
    <category term="open source"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Поразвлекался еще тут немного с не самым мейнстримным календарным софтом - vCalendar plugin к claws-mail&lt;br /&gt;и calcurse.&lt;br /&gt;&lt;br /&gt;Задача, которую хочется решить - это обеспечить нормальную синхронизацию между андродидным календарем и десктопным с использованием своего caldav сервера (в качестве которог у меня radicale).&lt;br /&gt;&lt;br /&gt;То есть получается следуюая картина:&lt;br /&gt;&lt;br /&gt;Есть vdirsyncer, который синхронизирует локальный ics-файл с сервером, есть андроидные устройства на которых тоже все впорядке.&lt;br /&gt;&lt;br /&gt;vCalendar plugin умеет импортировать ics. И даже автоматически его обновалять. В режиме чтения все нормально.&lt;br /&gt;Но вот создавать  новые события он будет не в импортированном календаре а в своем собственном (они выглядят в дереве папок как две соседние папки внутри vCalendar).&lt;br /&gt;&lt;br /&gt;Он умеет экспортировать свой календарь в .ics-файл. Но в другой. И даже вызывать указанную программу после экспорта. И при этом:&lt;br /&gt;&lt;br /&gt;1. Делает его нечитаемым для питоновского модуля vobject, на базе котрого сделан radicale. Путем добавления туда  некоторых полей с датой 0000000T000000 на которые питон весьма обоснованно ругается "не бывает нулевого месяца".&lt;br /&gt;2. экспортирует не только новые события но и те, которые были эксполртированы.&lt;br /&gt;3. Таймзону ставит GMT.&lt;br /&gt;&lt;br /&gt;Следовательно, если я хочу обратно засинхронизировать события, измененные в claws-mail в radicale, мне нужно&lt;br /&gt;0. Перед разбором средствами модуля vobject удалить поля с некорректной датой.&lt;br /&gt;1. Выцепить из экспортированного файла новые события&lt;br /&gt;2. Поменять им временную зону на ту, которую использует radicale&lt;br /&gt;3. Скопировать их в тот календарь, который синхронизирует vdirsyncer.&lt;br /&gt;&lt;br /&gt;В принципе все это на питоне через тот же vobject делается в два экрана. Но может быть лучше взять исходники плагина и поправить. (хотя это -то придется делать на C++).&lt;br /&gt;&lt;br /&gt;Что касается calcurse, то при всех его симпатичных свойствах он использует собственный формат хранения, а не ics. И при повтороном импорте изменившегося ics-файла дублирует события - отфильтровать по uid не догадыватеся.&lt;br /&gt;Зато его можно повесить обработчиком mime-тип text/calendar в текстовый почтовый клиент вроде mutt.  &lt;br /&gt;Но только если этот клиент у вас единственный и ни с чем синхронизировать его вы не хотите. Или по крайней мере все остальные календари будут read-only. &lt;br /&gt;&lt;br /&gt;Возникает мысль взять питоновские модули curses и написать программму с интерфейсмо в точности как у calcurse, но использующую в качестве backend-хранилища ics-файл, синхронизируемый vdirsyncer-ом.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2127183" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2113551</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2113551.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2113551"/>
    <title>Гвидо ван Россум уходит на пенсию</title>
    <published>2019-10-31T06:42:53Z</published>
    <updated>2019-10-31T06:42:53Z</updated>
    <category term="open source"/>
    <category term="компьютерное"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">&lt;a href="https://blog.dropbox.com/topics/company/thank-you--guido"&gt;https://blog.dropbox.com/topics/company/thank-you--guido&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2113551" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2111073</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2111073.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2111073"/>
    <title>Выложил модуль fstrans на pypi.</title>
    <published>2019-10-21T11:05:45Z</published>
    <updated>2019-10-21T11:05:45Z</updated>
    <category term="open source"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>10</dw:reply-count>
    <content type="html">&lt;a href="https://pypi.org/project/fstrans/"&gt;https://pypi.org/project/fstrans/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В основном ради того, чтобы научитсья пользоваться setuptools. Хотя сам модуль в общем вполне практически полезный. Для себя делал. Базовую идею я придумал еще во времена Communiware, где картинки хранились на диске, а текст в базе данных, и требовалось сделать чтобы  картинкам можно было сделать rollback. Тогда соответствующий код, конечно же был на перле написан, а не на питоне.&lt;br /&gt;&lt;br /&gt;Сейчас использую этот модуль для работы с репозиториями пакетов. Поэтому оно умеет не только коммиты-роллбэки но и сериализацию доступа к дереву файлов.&lt;br /&gt;&lt;br /&gt;И таки да, test suite запускается штатными средствами setuptools. В distutis, когда я там делал поддержку запуска test suite для ctypsecrypto, все руками приходилось делать.&lt;br /&gt;&lt;br /&gt;P.S. Надо бы найти время и переписать setup от ctypsecrypto на setuptools, а заодно окончательно починить там работу с бинарными данными в 3-м питоне.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2111073" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2103478</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2103478.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2103478"/>
    <title>Inter SCM-ное</title>
    <published>2019-09-16T07:14:08Z</published>
    <updated>2019-09-16T07:14:08Z</updated>
    <category term="python"/>
    <category term="open source"/>
    <category term="qemu"/>
    <category term="ctypescrypto"/>
    <dw:security>public</dw:security>
    <dw:reply-count>4</dw:reply-count>
    <content type="html">Выяснил сегодня, что в fossil появилась возможность автоматического миррора в git-репозитории.&lt;br /&gt;Ну то есть возможность экспорта и реэкспорта там была столько. сколько я этот инструмент использую.&lt;br /&gt;&lt;br /&gt;А вот теперь в версси 2.9 Ричард Хипп прикрутил туда более автоматическую миррорилку и сам миррорит код fossil &lt;a href="https://github.com/drhsqlite/fossil-mirror"&gt;на гитхаб&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Подумал и сделал гитхаб миррор &lt;a href="https://github.com/vbwagner/vws"&gt;vws&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь думаю &lt;br /&gt;а) а не сделать ли фоссиловские мастер-репозитории для &lt;a href="https://github.com/vbwagner/dyngo"&gt;dyngo&lt;/a&gt; и &lt;a href="https://github.com/vbwagner/ctypescrypto"&gt;ctypescrypto&lt;/a&gt; у которых сейчас на гитхабе мастер-репозиторий.&lt;br /&gt;б) а не сделать ли на гитхабе клоны фоссиловских репозиториев моей фантастики&lt;br /&gt;в) а не оживить ли гит-репозитории в &lt;a href="https://www.wagner.pp.ru/gitweb/?a=project_list;pf=fiction"&gt;https://wagner.pp.ru/git/fiction&lt;/a&gt;, приделав туда автопуш из соответствующих фоссиловских репозиториев, где идет работа.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2103478" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2103012</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2103012.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2103012"/>
    <title>Dyngo</title>
    <published>2019-09-12T09:02:34Z</published>
    <updated>2019-10-15T10:17:38Z</updated>
    <category term="debian"/>
    <category term="python"/>
    <category term="open source"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Зачем-то взял и написал &lt;a href="https://github.com/vbwagner/dyngo"&gt;dyndns клиента&lt;/a&gt;, который умеет одновременно ходить к разным dyndns-серверам.&lt;br /&gt;&lt;br /&gt;В смысле - смотрим из каких сетей у нас сейчас есть IP-адреса и если этим сетям прописаны разные dns-сервера, апдейтим адреса на всех. Собственно понятно зачем мне это нужно - чтобы при подключении ноутбука к конторской сетке что через VPN, что через wifi в офисе, ему бы выдавалось имя в dns (пусть в моем, который вообще-то для виртуалок). А то по ssh ходить неудобно - не через avahi же имя ssh-хоста резолвить.&lt;br /&gt;&lt;br /&gt;Написано на python3 без ГМО, холестирина, лямбды и регулярных выражений.&lt;br /&gt;&lt;br /&gt;Надо бы еще собраться в пакет завернуть, а то по всем ноутбукам это раскидывать...&lt;br /&gt;&lt;br /&gt;И еще есть мысль закоммитить туда же dyndns-скрипт который работает через nsupdate. У меня такой есть, но он не на том языке написан (и вообще не помню кто его оригинальный автор, и откуда я его надыбал). А то скрипт который работает с dnsmasq я уже закоммитил.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2103012" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:738732:2101841</id>
    <link rel="alternate" type="text/html" href="https://vitus-wagner.dreamwidth.org/2101841.html"/>
    <link rel="self" type="text/xml" href="https://vitus-wagner.dreamwidth.org/data/atom/?itemid=2101841"/>
    <title>Радикальное</title>
    <published>2019-09-06T10:48:19Z</published>
    <updated>2019-09-06T10:48:19Z</updated>
    <category term="ctypescrypto"/>
    <category term="debian"/>
    <category term="python"/>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">При апгрейде wagner.pp.ru на Debian 10 больше всего сил и нервов сьел маленький radicale, у которого всех данных-то 150 кб телефонной книги и 15 кб календарных событий.&lt;br /&gt;&lt;br /&gt;Потому что:&lt;br /&gt;1. Из конфигурации убрали префикс URL для работы за reverse proxy. И блин хоть бы написали&lt;br /&gt;"вместо base-prefix используйет http-заголовгок X-Script-Name". &lt;br /&gt;2. Переехали с python2 на python3. А в модуле vobjects при работе в python3 была бага. (которую я уже зарепортил) из-за которой при попытке сериализовать честно распарсенную vcard оно выдавало&lt;br /&gt;Failed to store item '4c393f45-ae9b-4e32-9720-33118152246c.vcf' in collection 'vitus/2b6f78b0-270c-b45d-6e18-3238dad34b44': a bytes-like object is required, not 'str'&lt;br /&gt;Стэк-трасса конечно никуда не показывалась и догадаться в чем дело было довольно непросто.В конце концов выяснилось что последовательность&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;import vobject&lt;br /&gt;vcard=vobject.readOne("""....""")&lt;br /&gt;vcard.serialize()&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;эту ошибку прекрасно воспроизводит. &lt;br /&gt;3. После того как эта проблема решилась, началась фигня с фотографиями. Пришлось довольно долго возиться. прежде чем я понял, что &lt;tt&gt;PHOTO;TYPE=JPEG;ENCODING=BASE64&lt;/tt&gt; оно понимать перестало. Ему теперь надо &lt;tt&gt;PHOTO;TYPE=JPEG;ENCODING=B&lt;/tt&gt; (и версия VCARD тут абсолютно ни на что не влияет). Кстати &lt;tt&gt;PHOTO:data:image/jpeg;base64,....&lt;/tt&gt; оно тоже не понимает, хотя в спецификации на VCARD 3.0 это предусмотрено.&lt;br /&gt;&lt;br /&gt;А вот оказывается, что жить без синхронизируемых с сервером адресной книжки и календаря я уже отвык. И не столько я, сколько мой телефон, который при попытке отключить синхронизацию вообще перестал показывать контакты.&lt;br /&gt;&lt;br /&gt;В общем, я чувствую, что после того как python 2 официально объявят deprecated борьба с кодировками во всех библиотеках для python 3 предстоит куда более суровая чем 20 лет назад в tcl и несколько позже в perl.&lt;br /&gt;&lt;br /&gt;Мне вот тут на этой неделе в ctypescrypto баг зарепортили что в python3 оно не умеет работать с бинарными данными в CMS. (Ох, ну когда ж я тесты на этот самый CMS напишу? Судя по багрепортам на гитхабе, CMS это основное для чего народ ctypescrypto использует).&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2101841" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
