<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Журнал Витуса</title>
  <link>https://vitus-wagner.dreamwidth.org/</link>
  <description>Журнал Витуса - Dreamwidth Studios</description>
  <lastBuildDate>Tue, 09 Dec 2025 06:00:20 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>vitus_wagner</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/5240702/738732</url>
    <title>Журнал Витуса</title>
    <link>https://vitus-wagner.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2522267.html</guid>
  <pubDate>Tue, 09 Dec 2025 06:00:20 GMT</pubDate>
  <title>На распутье</title>
  <link>https://vitus-wagner.dreamwidth.org/2522267.html</link>
  <description>&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=&quot;https://urwid.org/&quot;&gt;urwid&lt;/a&gt; и &lt;a href=&quot;https://github.com/willmcgugan/textual&quot;&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=&quot;https://vitus-wagner.livejournal.com/1720721.html&quot;&gt;LJ&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2522267&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2522267.html</comments>
  <category>компьютерное</category>
  <category>python</category>
  <category>open source</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2521398.html</guid>
  <pubDate>Wed, 03 Dec 2025 06:50:45 GMT</pubDate>
  <title>Прежде чем что-нибудь сделать, посмотри, не сделал ли это кто-нибудь уже</title>
  <link>https://vitus-wagner.dreamwidth.org/2521398.html</link>
  <description>&lt;p&gt;Тут нашел очень полезный инструмент &lt;a href=&quot;https://github.com/techgaun/active-forks&quot;&gt;поиск активных форков на github&lt;/a&gt; и с его помощью выяснил, что нашелся добрый человек &lt;a href=&quot;https://github.com/timmc&quot;&gt;Тим МакКормак&lt;/a&gt;, который не поленился портировать &lt;a href=&quot;https://github.com/timmc/ljdump&quot;&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=&quot;https://github.com/vbwagner/ljdump&quot;&gt;свой форк&lt;/a&gt;,&lt;/p&gt;

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

&lt;p&gt;X-Post to &lt;a href=&quot;https://vitus-wagner.livejournal.com/1720231.html&quot;&gt;LJ&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2521398&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2521398.html</comments>
  <category>open source</category>
  <category>lj</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2482899.html</guid>
  <pubDate>Wed, 23 Apr 2025 14:25:54 GMT</pubDate>
  <title>Проекты</title>
  <link>https://vitus-wagner.dreamwidth.org/2482899.html</link>
  <description>&lt;p&gt;Вот есть у меня сейчас несколько опенсурсных проектов, которыми может быть стоит заняться, пока не устроился на фулл-тайм работу&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;переписать &lt;a href=&quot;https://github.com/gost-engine/engine&quot;&gt;gost-engine&lt;/a&gt; на новый, появившийся в openssl 3.x интерфейс &lt;a href=&quot;https://docs.openssl.org/master/man7/provider/&quot;&gt;провайдеров&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Если уж взялся, за провайдеров то покопаться в &lt;a href=&quot;https://github.com/latchset/pkcs11-provider&quot;&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=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://beldmit.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/silk/identity/user.png&apos; alt=&apos;[personal profile] &apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;https://beldmit.dreamwidth.org/&apos;&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=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://irenedragon.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/silk/identity/user.png&apos; alt=&apos;[personal profile] &apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;https://irenedragon.dreamwidth.org/&apos;&gt;&lt;b&gt;irenedragon&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; попытаться привлечь).&lt;/li&gt;
&lt;li&gt;Вспомнить про &lt;a href=&quot;https://github.com/vbwagner/ctypescrypto&quot;&gt;ctypescrypto&lt;/a&gt; и переписать ее под 3-е версии и python, и openssl (возможно пригодится для юнит-тестов на провайдеры. А возможно, для юнит-тестов на провайдеры надо портануть ctypescrypto на &lt;a href=&quot;https://metacpan.org/pod/FFI::Platypus&quot;&gt;Platypus&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;Написать аналог &lt;a href=&quot;https://calcurse.org&quot;&gt;calcurse&lt;/a&gt; но с бэкэндом пригодным для синрхронизации &lt;a href=&quot;https://github.com/pimutils/vdirsyncer&quot;&gt;vdirsyncer&lt;/a&gt;. Под этот проект я даже когда-то &lt;a href=&quot;https://www.wagner.pp.ru/fossil/vcal/index&quot;&gt;репозиторий&lt;/a&gt; завел.&lt;/li&gt;
&lt;li&gt;Была у меня еще идея про &lt;a href=&quot;https://www.wagner.pp.ru/fossil/ovpnctl/index&quot;&gt;линуксовый management interface для openvpn&lt;/a&gt; Правда из-за отсутствия у меня теперь необходимости ходить в конторскую openvpn оно как-то менее актуально стало.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wagner.pp.ru/fossil/vws/index&quot;&gt;vws&lt;/a&gt; тоже надо бы переписать с нуля под третий питон и девятый qemu. Но может стоит подождать пока 12-й qemu выйдет.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2482899&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2482899.html</comments>
  <category>open source</category>
  <category>ctypescrypto</category>
  <category>qemu</category>
  <category>криптография</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2472353.html</guid>
  <pubDate>Fri, 28 Feb 2025 05:55:49 GMT</pubDate>
  <link>https://vitus-wagner.dreamwidth.org/2472353.html</link>
  <description>&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2472353&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2472353.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2460729.html</guid>
  <pubDate>Mon, 09 Dec 2024 15:06:19 GMT</pubDate>
  <title>И еще про ансибля (... ... ..  откликнулось эхо)</title>
  <link>https://vitus-wagner.dreamwidth.org/2460729.html</link>
  <description>&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2460729&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2460729.html</comments>
  <category>python</category>
  <category>open source</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2442077.html</guid>
  <pubDate>Wed, 10 Jul 2024 07:25:45 GMT</pubDate>
  <title>Paradigm Linter</title>
  <link>https://vitus-wagner.dreamwidth.org/2442077.html</link>
  <description>&lt;p&gt;&lt;a href=&quot;https://nataraj.dreamwidth.org/996540.html&quot;&gt;вот тут&lt;/a&gt; &lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://nataraj.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/silk/identity/user.png&apos; alt=&apos;[personal profile] &apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;https://nataraj.dreamwidth.org/&apos;&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;Но для целей (само)обучения нужен инструмент более высокого уровня. Который будет тыкать в нос
&quot;вот у тебя 80% кода написано в объектной парадигме, а здесь ты почему-то используешь чисто процедурное решение&quot;. То есть отслеживать применение известных парадигм и выдавать предупреждение где происходит переключение с одной на другую. Наверное, с помощью нынешних LLM такое уже можно написать.&lt;/p&gt;

&lt;p&gt;Видимо, тут нужен подход, подобный тому, который использует perlcritic - учебник, и в сообщениях программы линтера ссылки на конкретные разделы этого учебника, в которых достаточно пространно объяснено почему так не надо делать.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2442077&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2442077.html</comments>
  <category>python</category>
  <category>компьютерное</category>
  <category>образование</category>
  <lj:security>public</lj:security>
  <lj:reply-count>21</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2358044.html</guid>
  <pubDate>Thu, 26 Jan 2023 12:29:45 GMT</pubDate>
  <title>Змейско-пиявское</title>
  <link>https://vitus-wagner.dreamwidth.org/2358044.html</link>
  <description>&lt;p&gt;Вчера ухитрился написать программу, несовместимую с python 3.7. И ведь было бы что важнное. А всео-то был вот такой код&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; # формируем в переменной cmd длинную команду с параметрами в виде списка
 logging.notice(&quot;Executing &quot; + 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 заменить на &quot; &quot;.join, благо ничего страшного от кривого квотинга в логе не будет.&lt;/p&gt;

&lt;p&gt;Ладно, доконфигурят коллеги новые ARM-ы не будет там уже oldstable.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2358044&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2358044.html</comments>
  <category>компьютерное</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2278192.html</guid>
  <pubDate>Sun, 10 Oct 2021 07:38:29 GMT</pubDate>
  <title>Python 3.10</title>
  <link>https://vitus-wagner.dreamwidth.org/2278192.html</link>
  <description>&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, чтобы можно было писать без огляднки на то что &quot;вот это поддерижвается только с 3.5, а это - только с 3.8&quot;.&lt;/p&gt;

&lt;p&gt;Кстати, у меня вот тут вчера на сервере опять запрос сертификтов с let&apos;s encrypt сломался. Потому что это было первое обновление сертификатов после апгрейда на bullseye. И acme_tiny вдруг внезапно обнаружила что просто &quot;python&quot; в системе больше нет. А догататься поискать 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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2278192&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2278192.html</comments>
  <category>компьютерное</category>
  <category>debian</category>
  <category>open source</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>21</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2233062.html</guid>
  <pubDate>Wed, 17 Feb 2021 07:30:28 GMT</pubDate>
  <title>List flattiening in python</title>
  <link>https://vitus-wagner.dreamwidth.org/2233062.html</link>
  <description>&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2233062&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2233062.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>27</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2223545.html</guid>
  <pubDate>Tue, 12 Jan 2021 07:20:58 GMT</pubDate>
  <title>Отгадка</title>
  <link>https://vitus-wagner.dreamwidth.org/2223545.html</link>
  <description>&lt;p&gt;Задачку, &lt;a href=&quot;https://vitus-wagner.dreamwidth.org/2222224.html&quot;&gt;запощенную вчера&lt;/a&gt; сумел решить только &lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://slobin.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/silk/identity/user.png&apos; alt=&apos;[personal profile] &apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;https://slobin.dreamwidth.org/&apos;&gt;&lt;b&gt;slobin&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;

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

&lt;p&gt;Всем, искавшим тайный смысл в цвете шерсти кошки Варьки присваивается звание почетного гражданина г. Вращенцы.
(у кого его еще не было).&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2223545&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2223545.html</comments>
  <category>python</category>
  <category>open source</category>
  <category>криптография</category>
  <lj:security>public</lj:security>
  <lj:reply-count>11</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2205556.html</guid>
  <pubDate>Wed, 18 Nov 2020 08:43:33 GMT</pubDate>
  <title>Python vs C</title>
  <link>https://vitus-wagner.dreamwidth.org/2205556.html</link>
  <description>&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2205556&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2205556.html</comments>
  <category>python</category>
  <category>компьютерное</category>
  <lj:security>public</lj:security>
  <lj:reply-count>15</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2203163.html</guid>
  <pubDate>Thu, 12 Nov 2020 19:40:35 GMT</pubDate>
  <title>Новое рабочее место Гвидо</title>
  <link>https://vitus-wagner.dreamwidth.org/2203163.html</link>
  <description>&lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2020/11/12/python-creator-guido-van-rossum-joins-microsoft/&quot;&gt;Хорошо, что не Гугль&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2203163&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2203163.html</comments>
  <category>windows</category>
  <category>python</category>
  <category>open source</category>
  <lj:security>public</lj:security>
  <lj:reply-count>23</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2201611.html</guid>
  <pubDate>Fri, 06 Nov 2020 14:03:26 GMT</pubDate>
  <title>Python и Java</title>
  <link>https://vitus-wagner.dreamwidth.org/2201611.html</link>
  <description>&lt;p&gt;На слешдоте пищут &lt;a href=&quot;https://developers.slashdot.org/story/20/11/06/039234/python-overtakes-java-to-become-the-second-most-popular-programming-language&quot;&gt;Python overtakes Java&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Хочется нарисовать картинку в стиле традиционной медицинской эмблемы &quot;Тёща ест мороженное&quot;, только вместо вазочки для мороженного - кофейная чашечка.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2201611&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2201611.html</comments>
  <category>python</category>
  <category>непричесанные ассоциации</category>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2192733.html</guid>
  <pubDate>Tue, 06 Oct 2020 11:50:19 GMT</pubDate>
  <title>Вышел питон 3.9.0</title>
  <link>https://vitus-wagner.dreamwidth.org/2192733.html</link>
  <description>&lt;p&gt;Интересно, а до 3.14.15  нумерация дойдет?
Он же всё-таки пи-тон.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2192733&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2192733.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>16</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2175108.html</guid>
  <pubDate>Mon, 13 Jul 2020 09:12:50 GMT</pubDate>
  <title>Электронно-библиотечное-2</title>
  <link>https://vitus-wagner.dreamwidth.org/2175108.html</link>
  <description>Наконец довел скрипт, про который я писал еще &lt;a href=&quot;https://vitus-wagner.dreamwidth.org/2171185.html&quot;&gt;дые недели назад&lt;/a&gt; до состояния, что не стыдно выложить на &lt;a href=&quot;https://github.com/vbwagner/booksort&quot;&gt;github&lt;/a&gt;.

Всё не мог собраться и дописать туда поддержку djvu. Поддержку мэппинга имен авторов в каноническую форму и запуска скрипта с cwd не совпадающей с корнем электронной библиотеки пока не делал.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2175108&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2175108.html</comments>
  <category>python</category>
  <category>fb2</category>
  <category>open source</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2171185.html</guid>
  <pubDate>Tue, 30 Jun 2020 07:36:33 GMT</pubDate>
  <title>Электронно-библиотечное</title>
  <link>https://vitus-wagner.dreamwidth.org/2171185.html</link>
  <description>&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 - имена авторов в метаинформации этих форматов, пишут как попало, и 
надо как-то объяснить скрипту, что &quot;Первушин Антон Иванович&quot; это 
&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2171185&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2171185.html</comments>
  <category>компьютерное</category>
  <category>python</category>
  <category>fb2</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2159845.html</guid>
  <pubDate>Wed, 22 Apr 2020 20:09:12 GMT</pubDate>
  <title>Вот почему оно так?</title>
  <link>https://vitus-wagner.dreamwidth.org/2159845.html</link>
  <description>Имеем вот такой файлик:&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(&quot;foo&quot;)
    def bar(self):
        print(&quot;bar&quot;)
    

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 &quot;caller.py&quot;, line 17, in &lt;module&gt;
    x()
TypeError: &apos;Callme&apos; 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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2159845&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2159845.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>15</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2129491.html</guid>
  <pubDate>Sun, 05 Jan 2020 18:44:19 GMT</pubDate>
  <title>Питонистическое.</title>
  <link>https://vitus-wagner.dreamwidth.org/2129491.html</link>
  <description>Выяснил что в стандартной библиотеке питона модуль 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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2129491&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2129491.html</comments>
  <category>компьютерное</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>37</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2127386.html</guid>
  <pubDate>Tue, 24 Dec 2019 13:09:03 GMT</pubDate>
  <title>Чем мне не нравится khard</title>
  <link>https://vitus-wagner.dreamwidth.org/2127386.html</link>
  <description>Долгое время я для работы с адресной книжкой в формате vcard пользоватлся самописным питоновским (Python2 only) скриптом. Который использовал свой собственный vcard-parser (зато понимат vcard2.0, как его генерят старые кнопочные телефоны), не умел объединять контакты и все такое прочее.&lt;br /&gt;&lt;br /&gt;Потом, с появлением radicale и vdirsyncer перешел на &lt;a href=&quot;https://github.com/scheibler/khard&quot;&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=&quot;https://github.com/scheibler/khard/issues/107#issuecomment-312125519&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2127386&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2127386.html</comments>
  <category>open source</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>16</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2127183.html</guid>
  <pubDate>Mon, 23 Dec 2019 10:17:48 GMT</pubDate>
  <title>Все врут календари.</title>
  <link>https://vitus-wagner.dreamwidth.org/2127183.html</link>
  <description>Поразвлекался еще тут немного с не самым мейнстримным календарным софтом - 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 на которые питон весьма обоснованно ругается &quot;не бывает нулевого месяца&quot;.&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2127183&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2127183.html</comments>
  <category>python</category>
  <category>open source</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2113551.html</guid>
  <pubDate>Thu, 31 Oct 2019 06:42:53 GMT</pubDate>
  <title>Гвидо ван Россум уходит на пенсию</title>
  <link>https://vitus-wagner.dreamwidth.org/2113551.html</link>
  <description>&lt;a href=&quot;https://blog.dropbox.com/topics/company/thank-you--guido&quot;&gt;https://blog.dropbox.com/topics/company/thank-you--guido&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2113551&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2113551.html</comments>
  <category>python</category>
  <category>open source</category>
  <category>компьютерное</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2111073.html</guid>
  <pubDate>Mon, 21 Oct 2019 11:05:45 GMT</pubDate>
  <title>Выложил модуль fstrans на pypi.</title>
  <link>https://vitus-wagner.dreamwidth.org/2111073.html</link>
  <description>&lt;a href=&quot;https://pypi.org/project/fstrans/&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2111073&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2111073.html</comments>
  <category>open source</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2103478.html</guid>
  <pubDate>Mon, 16 Sep 2019 07:14:08 GMT</pubDate>
  <title>Inter SCM-ное</title>
  <link>https://vitus-wagner.dreamwidth.org/2103478.html</link>
  <description>Выяснил сегодня, что в fossil появилась возможность автоматического миррора в git-репозитории.&lt;br /&gt;Ну то есть возможность экспорта и реэкспорта там была столько. сколько я этот инструмент использую.&lt;br /&gt;&lt;br /&gt;А вот теперь в версси 2.9 Ричард Хипп прикрутил туда более автоматическую миррорилку и сам миррорит код fossil &lt;a href=&quot;https://github.com/drhsqlite/fossil-mirror&quot;&gt;на гитхаб&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Подумал и сделал гитхаб миррор &lt;a href=&quot;https://github.com/vbwagner/vws&quot;&gt;vws&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь думаю &lt;br /&gt;а) а не сделать ли фоссиловские мастер-репозитории для &lt;a href=&quot;https://github.com/vbwagner/dyngo&quot;&gt;dyngo&lt;/a&gt; и &lt;a href=&quot;https://github.com/vbwagner/ctypescrypto&quot;&gt;ctypescrypto&lt;/a&gt; у которых сейчас на гитхабе мастер-репозиторий.&lt;br /&gt;б) а не сделать ли на гитхабе клоны фоссиловских репозиториев моей фантастики&lt;br /&gt;в) а не оживить ли гит-репозитории в &lt;a href=&quot;https://www.wagner.pp.ru/gitweb/?a=project_list;pf=fiction&quot;&gt;https://wagner.pp.ru/git/fiction&lt;/a&gt;, приделав туда автопуш из соответствующих фоссиловских репозиториев, где идет работа.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2103478&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2103478.html</comments>
  <category>ctypescrypto</category>
  <category>qemu</category>
  <category>open source</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2103012.html</guid>
  <pubDate>Thu, 12 Sep 2019 09:02:34 GMT</pubDate>
  <title>Dyngo</title>
  <link>https://vitus-wagner.dreamwidth.org/2103012.html</link>
  <description>Зачем-то взял и написал &lt;a href=&quot;https://github.com/vbwagner/dyngo&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2103012&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2103012.html</comments>
  <category>debian</category>
  <category>open source</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vitus-wagner.dreamwidth.org/2101841.html</guid>
  <pubDate>Fri, 06 Sep 2019 10:48:19 GMT</pubDate>
  <title>Радикальное</title>
  <link>https://vitus-wagner.dreamwidth.org/2101841.html</link>
  <description>При апгрейде wagner.pp.ru на Debian 10 больше всего сил и нервов сьел маленький radicale, у которого всех данных-то 150 кб телефонной книги и 15 кб календарных событий.&lt;br /&gt;&lt;br /&gt;Потому что:&lt;br /&gt;1. Из конфигурации убрали префикс URL для работы за reverse proxy. И блин хоть бы написали&lt;br /&gt;&quot;вместо base-prefix используйет http-заголовгок X-Script-Name&quot;. &lt;br /&gt;2. Переехали с python2 на python3. А в модуле vobjects при работе в python3 была бага. (которую я уже зарепортил) из-за которой при попытке сериализовать честно распарсенную vcard оно выдавало&lt;br /&gt;Failed to store item &apos;4c393f45-ae9b-4e32-9720-33118152246c.vcf&apos; in collection &apos;vitus/2b6f78b0-270c-b45d-6e18-3238dad34b44&apos;: a bytes-like object is required, not &apos;str&apos;&lt;br /&gt;Стэк-трасса конечно никуда не показывалась и догадаться в чем дело было довольно непросто.В конце концов выяснилось что последовательность&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;import vobject&lt;br /&gt;vcard=vobject.readOne(&quot;&quot;&quot;....&quot;&quot;&quot;)&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=vitus_wagner&amp;ditemid=2101841&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://vitus-wagner.dreamwidth.org/2101841.html</comments>
  <category>debian</category>
  <category>ctypescrypto</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
</channel>
</rss>
