<?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://vak.dreamwidth.org/</link>
  <description>Пятнадцать байтов на стек от конца - Dreamwidth Studios</description>
  <lastBuildDate>Thu, 28 Aug 2025 07:11:04 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>vak</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/10859949/2601916</url>
    <title>Пятнадцать байтов на стек от конца</title>
    <link>https://vak.dreamwidth.org/</link>
    <width>50</width>
    <height>47</height>
  </image>

<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1433826.html</guid>
  <pubDate>Thu, 28 Aug 2025 07:11:04 GMT</pubDate>
  <title>IP-XACT</title>
  <link>https://vak.dreamwidth.org/1433826.html</link>
  <description>В электронной индустрии, для единообразия компонентов от разных разработчиков, народ придумал специальный формат XML, называется &lt;a href=&quot;https://en.wikipedia.org/wiki/IP-XACT&quot;&gt;IP-XACT&lt;/a&gt;. Файлы в таком формате обычно описывают всякие процессоры, контроллеры, интерфейсы и другие цифровые блоки, особенно в системах на кристалле и FPGA-проектах. Стандарт поддерживается всеми основными САПР для проектирования цифровых систем (Cadence, Synopsys, Mentor Graphics).&lt;br /&gt;&lt;br /&gt;Официальная документация: &lt;a href=&quot;https://www.accellera.org/images/downloads/standards/ip-xact/IPXACT-2022_user_guide.pdf&quot;&gt;IPXACT-2022_user_guide.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для удобства я с помощью Грока наваял пару полезных скриптов на Питоне:&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/ipxact/show_registers.py&quot;&gt;show_registers.py&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/ipxact/remove_registers.py&quot;&gt;remove_registers.py &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1433826&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://vak.dreamwidth.org/1433826.html</comments>
  <category>python</category>
  <category>электроника</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1432426.html</guid>
  <pubDate>Fri, 22 Aug 2025 00:05:42 GMT</pubDate>
  <title>Сколько в человеке протеинов?</title>
  <link>https://vak.dreamwidth.org/1432426.html</link>
  <description>Ответ на настоящее время: 20421 штука.&lt;br /&gt;&lt;br /&gt;Вот скрипт на Питоне, который извлекает из базы UniProt/SwissProt полный список известных протеинов человеческого организма: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/bio/extract_human_swissprot_proteins.py&quot;&gt;extract_human_swissprot_proteins.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Результат записывается в файл &lt;a href=&quot;https://gist.github.com/sergev/2f27c348147bdef7c388b97da4fabfa8&quot;&gt;human_swissprot_proteins.tsv&lt;/a&gt;. Для каждого протеина указывается идентификатор, описание и название гена. К примеру, отыщем всё, связанное с инсулином:&lt;br /&gt;&lt;blockquote&gt;$ grep -i insulin human_swissprot_proteins.tsv &lt;br /&gt;F8WCM5	Insulin, isoform 2	INS-IGF2&lt;br /&gt;O00425	Insulin-like growth factor 2 mRNA-binding protein 3	IGF2BP3&lt;br /&gt;O14654	Insulin receptor substrate 4	IRS4&lt;br /&gt;O15503	Insulin-induced gene 1 protein	INSIG1&lt;br /&gt;P01308	Insulin	INS&lt;br /&gt;P01344	Insulin-like growth factor 2	IGF2&lt;br /&gt;P05019	Insulin-like growth factor 1	IGF1&lt;br /&gt;P06213	Insulin receptor	INSR&lt;br /&gt;P08069	Insulin-like growth factor 1 receptor	IGF1R&lt;br /&gt;P08833	Insulin-like growth factor-binding protein 1	IGFBP1&lt;br /&gt;P09565	Putative insulin-like growth factor 2-associated protein	N/A&lt;br /&gt;P14616	Insulin receptor-related protein	INSRR&lt;br /&gt;P14735	Insulin-degrading enzyme	IDE&lt;br /&gt;P17936	Insulin-like growth factor-binding protein 3	IGFBP3&lt;br /&gt;P18065	Insulin-like growth factor-binding protein 2	IGFBP2&lt;br /&gt;P22692	Insulin-like growth factor-binding protein 4	IGFBP4&lt;br /&gt;P24592	Insulin-like growth factor-binding protein 6	IGFBP6&lt;br /&gt;P24593	Insulin-like growth factor-binding protein 5	IGFBP5&lt;br /&gt;P35568	Insulin receptor substrate 1	IRS1&lt;br /&gt;P35858	Insulin-like growth factor-binding protein complex acid labile subunit	IGFALS&lt;br /&gt;P51460	Insulin-like 3	INSL3&lt;br /&gt;P61371	Insulin gene enhancer protein ISL-1	ISL1&lt;br /&gt;Q01101	Insulinoma-associated protein 1	INSM1&lt;br /&gt;Q14641	Early placenta insulin-like peptide	INSL4&lt;br /&gt;Q16270	Insulin-like growth factor-binding protein 7	IGFBP7&lt;br /&gt;Q6B9Z1	Insulin growth factor-like family member 4	IGFL4&lt;br /&gt;Q6U949	Putative insulin-like growth factor 2 antisense gene protein	IGF2-AS&lt;br /&gt;Q6UW32	Insulin growth factor-like family member 1	IGFL1&lt;br /&gt;Q6UWQ7	Insulin growth factor-like family member 2	IGFL2&lt;br /&gt;Q6UXB1	Insulin growth factor-like family member 3	IGFL3&lt;br /&gt;Q86XT9	Insulin-like growth factor-binding protein 3 receptor	TMEM219&lt;br /&gt;Q8TDV5	Glucose-dependent insulinotropic receptor	GPR119&lt;br /&gt;Q8WX77	Insulin-like growth factor-binding protein-like 1	IGFBPL1&lt;br /&gt;Q96A47	Insulin gene enhancer protein ISL-2	ISL2&lt;br /&gt;Q96T92	Insulinoma-associated protein 2	INSM2&lt;br /&gt;Q9NZI8	Insulin-like growth factor 2 mRNA-binding protein 1	IGF2BP1&lt;br /&gt;Q9Y4H2	Insulin receptor substrate 2	IRS2&lt;br /&gt;Q9Y581	Insulin-like peptide INSL6	INSL6&lt;br /&gt;Q9Y5Q6	Insulin-like peptide INSL5	INSL5&lt;br /&gt;Q9Y5U4	Insulin-induced gene 2 protein	INSIG2&lt;br /&gt;Q9Y6M1	Insulin-like growth factor 2 mRNA-binding protein 2	IGF2BP2&lt;br /&gt;&lt;/blockquote&gt;А вот скрипт, показывающий структуру указанного протеина: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/bio/get_protein_sequence.py&quot;&gt;get_protein_sequence.py&lt;/a&gt;. Опробуем на инсулине:&lt;blockquote&gt;$ python3 get_protein_sequence.py P01308&lt;br /&gt;Fetching protein sequence for UniProt accession: P01308&lt;br /&gt;UniProt data retrieved for P01308: Insulin&lt;br /&gt;Saved sequence to protein_sequences.fasta&lt;br /&gt;&lt;br /&gt;$ cat protein_sequences.fasta&lt;br /&gt;&amp;gt;P01308 | Insulin | UniProt Protein Sequence&lt;br /&gt;MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN&lt;/blockquote&gt;Каждая буква обозначает аминокислоту:&lt;ul&gt;&lt;li&gt;A - Аланин&lt;/li&gt;&lt;li&gt;C - Цистеин&lt;/li&gt;&lt;li&gt;D - Аспарагиновая кислота&lt;/li&gt;&lt;li&gt;E - Глутаминовая кислота&lt;/li&gt;&lt;li&gt;F - Фенилаланин&lt;/li&gt;&lt;li&gt;G - Глицин&lt;/li&gt;&lt;li&gt;H - Гистидин&lt;/li&gt;&lt;li&gt;I - Изолейцин&lt;/li&gt;&lt;li&gt;K - Лизин&lt;/li&gt;&lt;li&gt;L - Лейцин&lt;/li&gt;&lt;li&gt;M - Метионин&lt;/li&gt;&lt;li&gt;N - Аспарагин&lt;/li&gt;&lt;li&gt;P - Пролин&lt;/li&gt;&lt;li&gt;Q - Глутамин&lt;/li&gt;&lt;li&gt;R - Аргинин&lt;/li&gt;&lt;li&gt;S - Серин&lt;/li&gt;&lt;li&gt;T - Треонин&lt;/li&gt;&lt;li&gt;V - Валин&lt;/li&gt;&lt;li&gt;W - Триптофан&lt;/li&gt;&lt;li&gt;Y - Тирозин&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1432426&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://vak.dreamwidth.org/1432426.html</comments>
  <category>наука</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1417516.html</guid>
  <pubDate>Mon, 14 Jul 2025 19:31:58 GMT</pubDate>
  <title>Шрифты сделай сам</title>
  <link>https://vak.dreamwidth.org/1417516.html</link>
  <description>В Питоне образовалась качественная поддержка для разработки современных шрифтов.&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/gftools/&quot;&gt;pypi.org/project/gftools/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/fonttools/fonttools&quot;&gt;github.com/fonttools/fonttools&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;К примеру, вот как выглядят исходники буквы A в шрифте TikTokSans: &lt;a href=&quot;https://github.com/tiktok/TikTokSans/blob/main/sources/TikTokSans.glyphspackage/glyphs/A_.glyph&quot;&gt;A_.glyph&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1417516&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://vak.dreamwidth.org/1417516.html</comments>
  <category>python</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1416980.html</guid>
  <pubDate>Sun, 13 Jul 2025 21:08:43 GMT</pubDate>
  <title>Odnaždy, v stud́onuü zimńuü poru</title>
  <link>https://vak.dreamwidth.org/1416980.html</link>
  <description>Пробуем &lt;a href=&quot;https://vak.dreamwidth.org/1416768.html&quot;&gt;латинскую кодировку &lt;/a&gt;для русского языка. Вот &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/russian-to-latin.py&quot;&gt;скрипт&lt;/a&gt;, перекодирующий произвольный текст.&lt;br /&gt;&lt;br /&gt;Odnaždy, v stud́onu&amp;uuml; zimńu&amp;uuml; poru&lt;br /&gt;&amp;Auml; iz ĺesu vy&amp;scaron;el; byl siĺnyj moroz.&lt;br /&gt;Gĺažu, podnima&amp;euml;tśa ḿedĺenno v goru&lt;br /&gt;Lo&amp;scaron;adka, v́ezuşa&amp;auml; hvorostu voz.&lt;br /&gt;I &amp;scaron;estvu&amp;auml; važno, v spokojstvii činnom,&lt;br /&gt;Lo&amp;scaron;adku v́ed́ot pod uzdcy mužičok&lt;br /&gt;V boĺ&amp;scaron;ih sapogah, v polu&amp;scaron;ubḱe ovčinnom,&lt;br /&gt;V boĺ&amp;scaron;ih rukavicah&amp;hellip; a sam s nogotok!&lt;br /&gt;&amp;laquo;Zdorovo, parnişe!&amp;raquo; &amp;mdash; Stupaj śeb́e mimo! &amp;mdash;&lt;br /&gt;&amp;laquo;Už boĺno ty groźen, kak &amp;auml; pogĺažu!&lt;br /&gt;Otkuda drovi&amp;scaron;ki?&amp;raquo; &amp;mdash; Iz ĺesu, v́estimo;&lt;br /&gt;Ot́ec, sly&amp;scaron;i&amp;scaron;, rubit, a &amp;auml; otvožu.&lt;br /&gt;(V ĺesu razdavalśa topor drovośeka.) &amp;mdash;&lt;br /&gt;&amp;laquo;A čto, u otca-to boĺ&amp;scaron;a&amp;auml; śem&amp;auml;?&amp;raquo;&lt;br /&gt;&amp;mdash; Śem&amp;auml;-to boĺ&amp;scaron;a&amp;auml;, da dva čelov́eka&lt;br /&gt;Vśego mužikov-to: ot́ec moj da &amp;auml;&amp;hellip;&amp;mdash;&lt;br /&gt;&amp;laquo;Tak von ono čto! A kak zvat́ t́eb́a?&amp;raquo; &amp;mdash; Vlasom.&amp;mdash;&lt;br /&gt;&amp;laquo;A koj t́eb́e godik?&amp;raquo; &amp;mdash; &amp;Scaron;estoj minoval&amp;hellip;&lt;br /&gt;Nu, ḿortva&amp;auml;! &amp;mdash; kriknul maĺutočka basom,&lt;br /&gt;Rvanul pod uzdcy i bystŕej za&amp;scaron;agal.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1416980&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://vak.dreamwidth.org/1416980.html</comments>
  <category>python</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>32</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1416443.html</guid>
  <pubDate>Thu, 10 Jul 2025 19:30:06 GMT</pubDate>
  <title>Корутины в Питоне</title>
  <link>https://vak.dreamwidth.org/1416443.html</link>
  <description>В языке Python с некоторого момента появились сопрограммы (&lt;a href=&quot;https://en.wikipedia.org/wiki/Coroutine&quot;&gt;coroutines&lt;/a&gt;), реализованные ключевыми словами async и await. Эта фича очень удобна для симуляции всяких процессов. В качестве примера забацаем &lt;a href=&quot;https://en.wikipedia.org/wiki/Dining_philosophers_problem&quot;&gt;классических обедающих философов&lt;/a&gt;.&lt;br /&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Dining_philosophers_diagram.jpg/250px-Dining_philosophers_diagram.jpg&quot; width=&quot;250&quot; height=&quot;259&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;Пять чуваков сидят за круглым столом, перед каждым тарелка. Между тарелками лежат вилки. Каждый философ некоторое время размышляет, после чего желает подкрепиться. Для еды ему нужны обе вилки, левая и правая. Если вилки заняты соседями, приходится ждать когда они освободятся.&lt;br /&gt;&lt;br /&gt;Вот код на Питоне: &lt;div&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://vak.dreamwidth.org/1416443.html#cutid1&quot;&gt;dining_philosophers.py&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/div&gt;Результат:&lt;br /&gt; &lt;a href=&quot;https://vak.dreamwidth.org/file/1716464.jpg&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/640x640/1716464.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1416443&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://vak.dreamwidth.org/1416443.html</comments>
  <category>программистское</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1416140.html</guid>
  <pubDate>Thu, 10 Jul 2025 18:10:32 GMT</pubDate>
  <title>Amaranth HDL</title>
  <link>https://vak.dreamwidth.org/1416140.html</link>
  <description>Товарищи взялись заменить Verilog на Python. Проект называется &lt;a href=&quot;https://amaranth-lang.org/docs/amaranth/latest/intro.html&quot;&gt;Amaranth&lt;/a&gt;. Есть отдельный &lt;a href=&quot;https://amaranth-lang.org/docs/amaranth/latest/simulator.html&quot;&gt;симулятор&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Проект на Гитхабе: &lt;a href=&quot;https://github.com/amaranth-lang/amaranth/tree/main&quot;&gt;amaranth-lang/amaranth&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Есть несколько реализаций процессора RISC-V на Amaranth.&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/bieganski/mtkcpu&quot; style=&quot;&quot;&gt;bieganski/mtkcpu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/GuzTech/misato&quot;&gt;GuzTech/misato&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/minerva-cpu/minerva&quot;&gt;minerva-cpu/minerva&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/cbiffle/hapenny&quot;&gt;cbiffle/hapenny&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1416140&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://vak.dreamwidth.org/1416140.html</comments>
  <category>электроника</category>
  <category>python</category>
  <category>verilog</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1407929.html</guid>
  <pubDate>Thu, 19 Jun 2025 00:11:04 GMT</pubDate>
  <title>Textual</title>
  <link>https://vak.dreamwidth.org/1407929.html</link>
  <description>Оказывается, на Питоне можно писать навороченные интерфейсы в текстовом режиме. Типа такого:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/charles-001/dolphie&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/800x800/1694284.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Больше примеров: &lt;a href=&quot;https://textual.textualize.io/widget_gallery/&quot;&gt;textual.textualize.io/widget_gallery/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Проект на Гитхабе: &lt;a href=&quot;https://github.com/Textualize/textual&quot;&gt;Textualize/textual&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1407929&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://vak.dreamwidth.org/1407929.html</comments>
  <category>python</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1404523.html</guid>
  <pubDate>Tue, 10 Jun 2025 23:37:20 GMT</pubDate>
  <title>Quine–McCluskey algorithm</title>
  <link>https://vak.dreamwidth.org/1404523.html</link>
  <description>На днях обсуждали со &lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://spamsink.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://spamsink.dreamwidth.org/&apos;&gt;&lt;b&gt;spamsink&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; минимизацию булевских функций. Тема из далёкого студенчества. Задачка нетривиальная, но давно и глубоко проработанная. Озадачил нею Грока, получил два решения:&lt;br /&gt;&lt;br /&gt;на Питоне: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/minimize-boolean-function.py&quot;&gt;minimize-boolean-function.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;на Rust: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/rust/minimize-boolean-function.rs&quot;&gt;minimize-boolean-function.rs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Функция с 8 переменными вычисляется на Rust за шесть секунд:&lt;blockquote&gt;&lt;pre&gt;
$ rustc minimize-boolean-function.rs&lt;br /&gt;&lt;br /&gt;$ /usr/bin/time ./minimize-boolean-function &lt;br /&gt;&lt;br /&gt;Truth table: 0000000000X10000000000000000000000000000000000000000000000000000010X010X010X010X010X010X010X010X010X010X010X010X010X010X010X010X00000000001X0000000000000000000000000000000000001X1X1X1X1X1X1X1X0000000000000000000000000000000000000000000000000000000000000000&lt;br /&gt;8-variable result: ~ABH + ~B~C~DE~FG + A~BCD&lt;br /&gt;        6.26 real         6.22 user         0.03 sys&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1404523&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://vak.dreamwidth.org/1404523.html</comments>
  <category>программистское</category>
  <category>python</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1398961.html</guid>
  <pubDate>Sat, 31 May 2025 21:08:36 GMT</pubDate>
  <title>Питон не питонирует</title>
  <link>https://vak.dreamwidth.org/1398961.html</link>
  <description>Решил подписаться на линуксный журнал, а у них ошибка выскакивает. Питон не тот язык, на котором следует писать надёжные системы. Заметьте: production код выполняется из каталога &lt;tt&gt;/home/odoo/src&lt;tt&gt;.&lt;blockquote&gt;&lt;pre&gt;
RPC_ERROR&lt;br /&gt;Odoo Server Error&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/http.py&amp;quot;, line 1803, in _serve_db&lt;br /&gt;    return service_model.retrying(self._serve_ir_http, self.env)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/service/model.py&amp;quot;, line 152, in retrying&lt;br /&gt;    result = func()&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/http.py&amp;quot;, line 1831, in _serve_ir_http&lt;br /&gt;    response = self.dispatcher.dispatch(rule.endpoint, args)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/http.py&amp;quot;, line 2035, in dispatch&lt;br /&gt;    result = self.request.registry[&apos;ir.http&apos;]._dispatch(endpoint)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/website/models/ir_http.py&amp;quot;, line 235, in _dispatch&lt;br /&gt;    response = super()._dispatch(endpoint)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/addons/base/models/ir_http.py&amp;quot;, line 221, in _dispatch&lt;br /&gt;    result = endpoint(**request.params)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/http.py&amp;quot;, line 772, in route_wrapper&lt;br /&gt;    result = endpoint(self, *args, **params_ok)&lt;br /&gt;  File &amp;quot;/home/odoo/src/enterprise/17.0/website_sale_account_taxcloud/controllers/main.py&amp;quot;, line 48, in shop_payment_transaction&lt;br /&gt;    return super().shop_payment_transaction(order_id, access_token, **kwargs)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/odoo/http.py&amp;quot;, line 772, in route_wrapper&lt;br /&gt;    result = endpoint(self, *args, **params_ok)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/website_sale/controllers/main.py&amp;quot;, line 2089, in shop_payment_transaction&lt;br /&gt;    return tx_sudo._get_processing_values()&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/payment/models/payment_transaction.py&amp;quot;, line 466, in _get_processing_values&lt;br /&gt;    processing_values.update(self._get_specific_processing_values(processing_values))&lt;br /&gt;  File &amp;quot;/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py&amp;quot;, line 24, in _get_specific_processing_values&lt;br /&gt;    res = super()._get_specific_processing_values(processing_values)&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py&amp;quot;, line 36, in _get_specific_processing_values&lt;br /&gt;    intent = self._stripe_create_intent()&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py&amp;quot;, line 90, in _stripe_create_intent&lt;br /&gt;    payload=self._stripe_prepare_payment_intent_payload(),&lt;br /&gt;  File &amp;quot;/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py&amp;quot;, line 73, in _stripe_prepare_payment_intent_payload&lt;br /&gt;    **super()._stripe_prepare_payment_intent_payload(**kwargs),&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py&amp;quot;, line 176, in _stripe_prepare_payment_intent_payload&lt;br /&gt;    payment_intent_payload.update(**self._stripe_prepare_mandate_options())&lt;br /&gt;  File &amp;quot;/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py&amp;quot;, line 206, in _stripe_prepare_mandate_options&lt;br /&gt;    mandate_values = self._get_mandate_values()&lt;br /&gt;  File &amp;quot;/home/odoo/src/enterprise/17.0/sale_subscription/models/payment_transaction.py&amp;quot;, line 53, in _get_mandate_values&lt;br /&gt;    start_datetime = max(&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;strong&gt;TypeError: &apos;&amp;gt;&apos; not supported between instances of &apos;datetime.datetime&apos; and &apos;bool&apos;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above server error caused the following client error:&lt;br /&gt;RPC_ERROR: Odoo Server Error&lt;br /&gt;    RPC_ERROR&lt;br /&gt;        at makeErrorFromResponse (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4739:163)&lt;br /&gt;        at XMLHttpRequest.&amp;lt;anonymous&amp;gt; (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4743:13)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1398961&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://vak.dreamwidth.org/1398961.html</comments>
  <category>программистское</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>39</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1340640.html</guid>
  <pubDate>Fri, 07 Feb 2025 04:54:42 GMT</pubDate>
  <title>Как установить Питон2</title>
  <link>https://vak.dreamwidth.org/1340640.html</link>
  <description>Я понимаю, что второй Питон это низзя, ужас-ужас и дурной тон, но что делать, если очень хочется? 😀&lt;br /&gt;На линуксе делаем:&lt;blockquote&gt;&lt;pre&gt;sudo apt install readline-dev libssl-dev
curl -fsSL https://pyenv.run | bash
~/.pyenv/bin/pyenv install 2.7
&lt;/pre&gt;&lt;/blockquote&gt;На маке ещё проще:&lt;blockquote&gt;&lt;pre&gt;brew install pyenv
~/.pyenv/bin/pyenv install 2.7
&lt;/pre&gt;&lt;/blockquote&gt;После чего питон можно вызывать командой:&lt;blockquote&gt;&lt;pre&gt;
$ ~/.pyenv/versions/2.7.18/bin/python2
Python 2.7.18 (default, Feb  6 2025, 20:48:01) 
[GCC 13.3.0] on linux2
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; _&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1340640&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://vak.dreamwidth.org/1340640.html</comments>
  <category>программистское</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1304030.html</guid>
  <pubDate>Tue, 26 Nov 2024 20:48:34 GMT</pubDate>
  <title>JAX: библиотека для матричных вычислений</title>
  <link>https://vak.dreamwidth.org/1304030.html</link>
  <description>Самому мне редко приходится гонять такие вещи, но штука полезная. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;&lt;a href=&quot;https://github.com/jax-ml/jax&quot;&gt;JAX is a Python library for accelerator-oriented array computation and program transformation, designed for high-performance numerical computing and large-scale machine learning&lt;/a&gt;&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Вокруг JAX формируется некая экосистема: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;&lt;a href=&quot;https://github.com/google/flax&quot;&gt;Flax: A neural network library and ecosystem for JAX designed for flexibility&lt;/a&gt;&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;a href=&quot;https://docs.kidger.site/equinox/&quot;&gt;Equinox is your one-stop JAX library, for everything you need that isn&apos;t already in core JAX&lt;/a&gt;&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1304030&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://vak.dreamwidth.org/1304030.html</comments>
  <category>python</category>
  <category>программистское</category>
  <category>искусственный интеллект</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1183977.html</guid>
  <pubDate>Sat, 24 Feb 2024 05:33:41 GMT</pubDate>
  <title>Patchwork</title>
  <link>https://vak.dreamwidth.org/1183977.html</link>
  <description>Лена вяжет и шьёт плед из большого количества разноцветных кусочков. Но подобрать вручную &amp;quot;случайный&amp;quot; узор оказалось непросто. Пришлось сбацать &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/bgi/rug2.py&quot;&gt;скрипт на Питоне&lt;/a&gt;. Примерно такое получается.&lt;br /&gt;&lt;a href=&quot;https://vak.dreamwidth.org/file/1399805.png&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/320x320/1399805.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1183977&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://vak.dreamwidth.org/1183977.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1143939.html</guid>
  <pubDate>Fri, 22 Dec 2023 07:48:11 GMT</pubDate>
  <title>Переходим с BGI на PyGame</title>
  <link>https://vak.dreamwidth.org/1143939.html</link>
  <description>По BGI необязательно &lt;a href=&quot;https://vak.dreamwidth.org/1143226.html&quot;&gt;тосковать&lt;/a&gt;. Всё-таки в 21-м веке живём. Нынче есть более развитая библиотечка &lt;a href=&quot;https://realpython.com/pygame-a-primer/&quot;&gt;PyGame&lt;/a&gt;. Умеет всё то же самое и многое другое. Для пробы, я переиначил демонстрашку &amp;quot;калейдоскоп&amp;quot;, написанную Гвидо Гонзато для BGI (изначально на Си, позже на Питоне) на библиотеку PyGame. &lt;br /&gt;&lt;a href=&quot;https://vak.dreamwidth.org/file/1310084.png&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/320x320/1310084.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Вот как было и как стало:&lt;ul&gt;&lt;li&gt;Изначальный код на Си: &lt;a href=&quot;https://github.com/sergev/SDL_bgi/blob/main/demo/kaleido.c&quot;&gt;kaleido.c&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Код на Питоне для BGI: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/bgi/kaleido.py&quot;&gt;bgi/kaleido.py&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Код для PyGame: &lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/pygame/kaleido.py&quot;&gt;pygame/kaleido.py&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1143939&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://vak.dreamwidth.org/1143939.html</comments>
  <category>познавательное</category>
  <category>python</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1056812.html</guid>
  <pubDate>Wed, 26 Jul 2023 20:23:53 GMT</pubDate>
  <title>Датчик ИКЕЯ для домашнего конструктора</title>
  <link>https://vak.dreamwidth.org/1056812.html</link>
  <description>Народ обнаружил, что к икейскому датчику качества воздуха VINDRIKTNING можно подпаяться и добавить интеллекта. Подключаем Raspberry Pico или ESP32 и имеем массу удовольствия.&lt;br /&gt;&lt;br /&gt;&quot;&lt;a href=&quot;https://www.raspberrypi.com/news/hacking-ikea/&quot;&gt;Hacking IKEA&lt;/a&gt;&quot;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://vak.dreamwidth.org/file/1105397.jpg&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/640x640/1105397.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/RsOykiq8foc&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1056812&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://vak.dreamwidth.org/1056812.html</comments>
  <category>видео</category>
  <category>python</category>
  <category>электроника</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/1044377.html</guid>
  <pubDate>Wed, 28 Jun 2023 21:11:27 GMT</pubDate>
  <title>&apos;free&apos; для мака</title>
  <link>https://vak.dreamwidth.org/1044377.html</link>
  <description>Сляпал на скорую руку скриптик для мака, аналогичный линуксовому &apos;free&apos;. Показывает состояние памяти. Всего несколько строк на Питоне:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/sergev/vak-opensource/blob/master/languages/python/free.py&quot;&gt;github.com/sergev/vak-opensource/blob/master/languages/python/free.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вот так работает:&lt;blockquote&gt;&lt;pre&gt;
$ free&lt;br /&gt;     Mbytes:  total        used        free      active    inactive   available&lt;br /&gt;Mem:          32768        7377       17776        5854        4855       24504&lt;br /&gt;Swap:             0           0           0&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=1044377&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://vak.dreamwidth.org/1044377.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://vak.dreamwidth.org/908091.html</guid>
  <pubDate>Fri, 29 Jul 2022 21:09:29 GMT</pubDate>
  <title>10 полезных скриптов на Питоне</title>
  <link>https://vak.dreamwidth.org/908091.html</link>
  <description>(Статья мне показалась интересной, решил перепостить: &lt;a href=&quot;https://python.plainenglish.io/10-python-scripts-to-automate-everyday-problems-f4f0783b1b9e&quot;&gt;10 Python Scripts to Automate Everyday Problems&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&amp;quot;Устали выполнять повторяющиеся задачи каждый день? Тогда зачем делать это вручную, если вы можете автоматизировать их с помощью вашего любимого языка программирования. В этой статье я представляю вам 10 скриптов Python для автоматизации ваших повседневных проблем и задач.&amp;quot;&lt;br /&gt;&lt;h1&gt;Fetch IMDB&lt;/h1&gt;You probably use IMDB for getting your best movie for a weekend but do you know you can scrap data from IMDB with Python. This automation script will let you automate the IMDb data scraping in a Pythonic way. Below I coded the standard function you can use.&lt;br /&gt;    &lt;ul&gt;&lt;li&gt;You can use it for your IMDB Project&lt;/li&gt;&lt;li&gt;Scrap and Analyze Movies Data&lt;/li&gt;&lt;li&gt;Finding the Best movie for your Weekend&lt;/li&gt;&lt;li&gt;And much more&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;pre&gt;
# IMDB&lt;br /&gt;# pip install imdbpy&lt;br /&gt;&lt;br /&gt;import imdb&lt;br /&gt;ia = imdb.IMDb()&lt;br /&gt;&lt;br /&gt;# Search for a movie.&lt;br /&gt;search_result = ia.search_movie(&apos;The Matrix&apos;)&lt;br /&gt;&lt;br /&gt;# Get the ID of the movie.&lt;br /&gt;movie_id = search_result[0].movieID&lt;br /&gt;&lt;br /&gt;# Get the movie from ID&lt;br /&gt;movie = ia.get_movie(movie_id)&lt;br /&gt;&lt;br /&gt;# Get Rating of movie&lt;br /&gt;rating = movie[&apos;rating&apos;]&lt;br /&gt;&lt;br /&gt;# Get Plot of movie&lt;br /&gt;plot = movie[&apos;plot&apos;]&lt;br /&gt;&lt;br /&gt;# Get Genre of movie&lt;br /&gt;genre = movie[&apos;genres&apos;]&lt;br /&gt;&lt;br /&gt;# Get Box office of movie&lt;br /&gt;box_office = movie[&apos;box office&apos;]&lt;br /&gt;&lt;br /&gt;# Get Cast of movie&lt;br /&gt;cast = movie[&apos;cast&apos;]&lt;br /&gt;&lt;br /&gt;# Get Director of movie&lt;br /&gt;director = movie[&apos;director&apos;]&lt;br /&gt;&lt;br /&gt;# Get Writer of movie&lt;br /&gt;writer = movie[&apos;writer&apos;]&lt;br /&gt;&lt;br /&gt;# Search for a person.&lt;br /&gt;search_result = ia.search_person(&apos;Keanu Reeves&apos;)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://vak.dreamwidth.org/908091.html#cutid1&quot;&gt;+9&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=908091&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://vak.dreamwidth.org/908091.html</comments>
  <category>познавательное</category>
  <category>программистское</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/734309.html</guid>
  <pubDate>Mon, 12 Apr 2021 17:44:28 GMT</pubDate>
  <title>Черепашья графика на Питоне</title>
  <link>https://vak.dreamwidth.org/734309.html</link>
  <description>Простое и понятное введение в &amp;quot;черепашью графику&amp;quot; на языке Питон. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://gvard.github.io/py/turtle/&quot;&gt;http://gvard.github.io/py/turtle/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/3/3d/Turtle-animation.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=734309&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://vak.dreamwidth.org/734309.html</comments>
  <category>python</category>
  <category>программистское</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/678598.html</guid>
  <pubDate>Thu, 01 Oct 2020 21:24:12 GMT</pubDate>
  <title>Лисп поверх Питона</title>
  <link>https://vak.dreamwidth.org/678598.html</link>
  <description>Питон нынче присутствует везде, даже на самых крохотных линуксных девайсах. Но если вы скучаете по функциональщине, вот вам простой Лисп поверх Питона. Называется Hy:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.hylang.org/en/stable/whyhy.html&quot;&gt;https://docs.hylang.org/en/stable/whyhy.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Устанавливается командой:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
pip3 install --user hy&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Вызывается как &amp;quot;hy&amp;quot;. Такой себе вполне Лисп, с полным доступом к функциям и библиотекам Питона, и обратно. Поддерживает макросы, питоновские классы и модули. Можно делать автономные скрипты. Пример вычисления чисел Фибоначчи:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
(defn fib [n]&lt;br /&gt;  (if (&amp;lt; n 2)&lt;br /&gt;    n&lt;br /&gt;    (+ (fib (- n 1)) (fib (- n 2)))))&lt;br /&gt;(print (fib 30))&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Напечатает:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
832040&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=678598&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://vak.dreamwidth.org/678598.html</comments>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>11</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/658210.html</guid>
  <pubDate>Mon, 27 Jul 2020 07:56:59 GMT</pubDate>
  <title>pytest</title>
  <link>https://vak.dreamwidth.org/658210.html</link>
  <description>Любишь кодить - люби и тестировать. Фундаментальность программистского образования в СССР нивелировалась полным отсутствием представления об организации процесса тестирования, и вообще обеспечения качества программного продукта. Ни в курчатнике, где мы делали операционную систему Демос, ни в ИТМиВТ, с которым мы активно сотрудничали и где разрабатывали штатные ОС и компиляторы для БЭСМ и Эльбрус, не было соответствующей практики наработки тестов и организации регулярного тестирования. А жаль.&lt;br /&gt;&lt;br /&gt;С опытом я прихожу к мысли, что современные методики типа &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot;&gt;TDD&lt;/a&gt; представляют основу практики программирования. Впрочем, про TDD я напишу позже, а сейчас я веду к тому, что &lt;tt&gt;pytest&lt;/tt&gt; представляет собой первейший инструмент всякого Питон-программиста. Мне лично доводится использовать &lt;tt&gt;pytest&lt;/tt&gt; по работе и я нахожу его весьма полезным.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.pytest.org/en/stable/&quot;&gt;Pytest&lt;/a&gt; представляет собой утилиту, которая вызывается из командной строки и запускает набор тестов Вашей программы. Для этого pytest сканирует присутствующие папки и файлы в них, находит файлы с именами &lt;tt&gt;test_*.py&lt;/tt&gt;, а в них определения процедур с именами вида &lt;tt&gt;test_xxx()&lt;/tt&gt;, и вызывает эти процедуры. На экран выдаётся информация о пройденных тестах. По умолчанию печатается имя файла и дальше точка для каждого успешного теста или F для неуспешного. Скажем, у меня есть файл &lt;tt&gt;test_demo.py&lt;/tt&gt; и в нём десять тестов. Будет выдано следующее:&lt;blockquote&gt;&lt;pre&gt;
$ pytest&lt;br /&gt;======================== test session starts =========================&lt;br /&gt;platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1&lt;br /&gt;rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo&lt;br /&gt;collected 10 items                                                   &lt;br /&gt;&lt;br /&gt;test_demo.py ..........                                        [100%]&lt;br /&gt;&lt;br /&gt;========================= 10 passed in 0.03s ========================&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Если добавить флаг -v, будут выдаваться имена тестов, по одному в строке:&lt;blockquote&gt;&lt;pre&gt;
$ pytest -v&lt;br /&gt;======================== test session starts =========================&lt;br /&gt;platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- /usr/local/opt/python@3.8/bin/python3.8&lt;br /&gt;cachedir: .pytest_cache&lt;br /&gt;rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo&lt;br /&gt;collected 10 items                                                   &lt;br /&gt;&lt;br /&gt;test_demo.py::test_fact_0 PASSED                               [ 10%]&lt;br /&gt;test_demo.py::test_fact_1 PASSED                               [ 20%]&lt;br /&gt;test_demo.py::test_fact_2 PASSED                               [ 30%]&lt;br /&gt;test_demo.py::test_fact_3 PASSED                               [ 40%]&lt;br /&gt;test_demo.py::test_fact_10 PASSED                              [ 50%]&lt;br /&gt;test_demo.py::test_fact_20 PASSED                              [ 60%]&lt;br /&gt;test_demo.py::test_fact_30 PASSED                              [ 70%]&lt;br /&gt;test_demo.py::test_fact_40 PASSED                              [ 80%]&lt;br /&gt;test_demo.py::test_fact_50 PASSED                              [ 90%]&lt;br /&gt;test_demo.py::test_fact_minus1 PASSED                          [100%]&lt;br /&gt;&lt;br /&gt;========================= 10 passed in 0.03s ========================&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Процедуры тестов содержат операторы &lt;tt&gt;assert&lt;/tt&gt;, проверяющие результат выполнения Вашей программы. Если результат совпадает - тест считается успешным:&lt;blockquote&gt;&lt;pre&gt;
def test_fact_3():&lt;br /&gt;    assert demo.factorial(3) == 6&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Если в одном из тестов обнаружена ошибка, она выдаётся в виде:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;
============================== FAILURES ==============================&lt;br /&gt;____________________________ test_fact_3 _____________________________&lt;br /&gt;&lt;br /&gt;    def test_fact_3():&lt;br /&gt;&amp;gt;       assert demo.factorial(3) == 7&lt;br /&gt;E       assert 6 == 7&lt;br /&gt;E         +6&lt;br /&gt;E         -7&lt;br /&gt;&lt;br /&gt;test_demo.py:24: AssertionError&lt;br /&gt;====================== short test summary info =======================&lt;br /&gt;FAILED test_demo.py::test_fact_3 - assert 6 == 7&lt;br /&gt;==================== 1 failed, 9 passed in 0.06s =====================&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Да, я не упомянул: устанавливается pytest командой &amp;quot;&lt;tt&gt;pip install pytest&lt;/tt&gt;&amp;quot;. А если добавить к нему ещё и &amp;quot;&lt;tt&gt;pip3 install pytest-xdist&lt;/tt&gt;&amp;quot;, то у &lt;tt&gt;pytest&lt;/tt&gt; появится флаг &amp;quot;&lt;tt&gt;-nauto&lt;/tt&gt;&amp;quot;, запускающий тесты впараллель на всех доступных процессорах компьютера. Это заметно ускоряет процесс. К примеру у меня на работе в одном из проектов имеется больше 600 тестов, и полный прогон (на одном процессоре) занимает около 15 минут. С флагом же &amp;quot;&lt;tt&gt;-nauto&lt;/tt&gt;&amp;quot; задействуется 16 процессоров моего MacBook Pro, и тестирование ускоряется до 5 минут.&lt;br /&gt;&lt;br /&gt;Это базовый минимум. Но в &lt;tt&gt;pytest&lt;/tt&gt; есть куча полезных фич, помогающих в разработке тестов. Рекомендую книжку, где все возможности подробно описаны: &amp;quot;&lt;a href=&quot;https://www.amazon.com/Python-Testing-pytest-Effective-Scalable/dp/1680502409/&quot;&gt;Python Testing with pytest&lt;/a&gt;&amp;quot;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.amazon.com/Python-Testing-pytest-Effective-Scalable/dp/1680502409/&quot;&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/487517.jpg&quot; width=&quot;406&quot; height=&quot;500&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Пример проекта с &lt;tt&gt;pytest&lt;/tt&gt; смотрите на Гитхабе: &lt;a href=&quot;https://github.com/sergev/Pytest-Actions-Demo&quot;&gt;https://github.com/sergev/Pytest-Actions-Demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=658210&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://vak.dreamwidth.org/658210.html</comments>
  <category>python</category>
  <category>познавательное</category>
  <lj:security>public</lj:security>
  <lj:reply-count>21</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://vak.dreamwidth.org/657802.html</guid>
  <pubDate>Sat, 25 Jul 2020 19:58:03 GMT</pubDate>
  <title>Скелет для Питона</title>
  <link>https://vak.dreamwidth.org/657802.html</link>
  <description>Если вы собираетесь начать разрабатывать программу на языке Питон - вот заготовка, с которой можно стартовать: &lt;a href=&quot;https://github.com/sergev/Pytest-Actions-Demo&quot;&gt;https://github.com/sergev/Pytest-Actions-Demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Клонируете проект к себе и наполняете содержанием. В заготовке задействованы автоматическая проверка кода утилитой &lt;a href=&quot;https://flake8.pycqa.org/en/latest/&quot;&gt;flake8&lt;/a&gt; и тестирование посредством &lt;a href=&quot;https://realpython.com/pytest-python-testing/&quot;&gt;pytest&lt;/a&gt;. Автоматизация выполнена через сервис &lt;a href=&quot;https://docs.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions&quot;&gt;Github Actions&lt;/a&gt;. Скрипт &lt;a href=&quot;https://github.com/sergev/Pytest-Actions-Demo/blob/master/.github/workflows/pytest.yml&quot;&gt;.github/workflows/pytest.yml&lt;/a&gt; содержит задание для Actions запускать flake8 и pytest каждый раз, когда приходит очередное изменение. Причём тестируются заданные версии Питона, а именно 2.7 и 3.8.&lt;br /&gt;&lt;br /&gt;Конечно, всегда лучше запускать flake8 и pytest локально, перед отправкой изменений в Github. Но удобно, что результаты тестирования копятся на сервере и всегда доступны для просмотра (&lt;a href=&quot;https://github.com/sergev/Pytest-Actions-Demo/actions?query=workflow%3A%22Python+package%22&quot;&gt;здесь&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Профессиональная разработка софта отличается от любительских поделок как раз этим: организацией процесса с целью отслеживания качества кода. Автоматическое тестирование - первая, минимальная фаза. Про Pytest я напишу позже, это отдельная тема.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://vak.dreamwidth.org/file/487280.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;  Есть аналогичная заготовка для Питона с автоматизацией, но для Битбакета: &lt;a href=&quot;https://vak.dreamwidth.org/658470.html&quot;&gt;https://vak.dreamwidth.org/658470.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=vak&amp;ditemid=657802&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://vak.dreamwidth.org/657802.html</comments>
  <category>компьютерное</category>
  <category>познавательное</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
</channel>
</rss>
