<?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>Swami Dhyan Nataraj</title>
  <link>https://nataraj.dreamwidth.org/</link>
  <description>Swami Dhyan Nataraj - Dreamwidth Studios</description>
  <lastBuildDate>Wed, 10 Jul 2024 06:18:11 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>nataraj</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/12569540/750757</url>
    <title>Swami Dhyan Nataraj</title>
    <link>https://nataraj.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/996540.html</guid>
  <pubDate>Wed, 10 Jul 2024 06:18:11 GMT</pubDate>
  <title>Python и Свободное ПО</title>
  <link>https://nataraj.dreamwidth.org/996540.html</link>
  <description>&lt;p&gt;В Новосибирске я прочитал студентам лекцию об истории Свободного ПО и о том чем Свободное ПО отличается от Opensource. До этого слушал Столлмана и все такое.&lt;/p&gt;

&lt;p&gt;С темой различия все интересно: дьявол кроется в деталях: СПО и OpenSource очень похожи по форме, но заметно отличаются по целеполаганию. СПО это поделиться своей страстью к программированию со всем миром, OpenSource это про то чтобы достичь успеха через публикацию исходников: публиковать исходники это модно, мы свои тоже опубликуем, продвинем свой продукт, заработаем бабла.&lt;/p&gt;

&lt;p&gt;Далее там шел список косвенных признаков по которым можно определить относится ли продукт к СПО или к OpenSource, но сейчас не об этом.&lt;/p&gt;

&lt;p&gt;По результатам этого всего, мне стало более понятно почему мне так не нравиться python. Python это практически целиком про OpenSource, и почти не про Свободное ПО. Python создан для того чтобы быстро добиваться успеха: личного -- не очень длинный туториал, и ты уже питон-программист, иди работай, и корпоративного -- нанял горсть таких программистов и они тебе всё написали... Но python -- это не про страсть к программированию. Это poor man язык программирования. Если ты богат внутри как программист, на python&apos;е ты не задержишься. Весь design питона сделан в интересах неофита, на нем красиво и страстно не напишешь. Я не помню ни одного человека который бы был бы высококлассным инженером и писал бы при этом на питоне. Ну нету...&lt;/p&gt;

&lt;p&gt;Верно и обратное, если вы хотите действительно глубоко погрузиться в профессию, бегите с python&apos;а. Он очень сильно калечит способность правильно думать. Не надо вам этого...&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=996540&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://nataraj.dreamwidth.org/996540.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>28</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/996224.html</guid>
  <pubDate>Fri, 10 May 2024 08:18:22 GMT</pubDate>
  <title>Демократия как власть фейрис</title>
  <link>https://nataraj.dreamwidth.org/996224.html</link>
  <description>&lt;p&gt;Лежит у меня сейчас на столе детская книжка &quot;Knights of the Round Table&quot;. Заказал я ее на амазоне в каком-то далеком году, экспериментируя тогда с амазоновскими рекомендациями. Книжка вопреки моим ожиданиями оказалось галимым пейпербэком который не особо хочется держать в руках. Ну и совсем-совсем детской. На эту тему она много лет простояла на полке. И вот в рамках избавления от лишнего я задумал оставить ее в книгообмене, а перед этим все-таки прочитать. 100 страниц крупным шрифтом — ерунда...&lt;/p&gt;

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

&lt;p&gt;Что показали эти несколько страниц: Мерлин, кем бы он ни был, явный деятель из мира фейрис. Он магический, и тема украденного/отданного ребенка это явная фейрис-стори. Господа рыцари явные болваны: появляется во вспышке света камень с мечом и надписью, они и поверили и давай этот меч оттуда тягать... Ни на секунду не задумавшись за чей счет и в чьих интересах проводится этот банкет.
Таким образом можно явно сказать, что Артур — явная креатура фейрис, через него они проводят все интересы и как следствие весьма вероятно все что делал Артур так или иначе было в сделано в интересах фейрис.&lt;/p&gt;

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

&lt;p&gt;И, надо сказать, это многое объясняет. Если в каждом пункте где хочется сказать &quot;чего это они такие странные&quot;, пояснить &quot;фейрис, это все фейрис&quot;, все сразу становится на свои места. Кто умеет такие вещи считывать, посмотрите, насколько точное попадание...&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=996224&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://nataraj.dreamwidth.org/996224.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/996069.html</guid>
  <pubDate>Thu, 09 May 2024 12:06:09 GMT</pubDate>
  <title>Как форкнуть процесс в соседний виртуальный терминал</title>
  <link>https://nataraj.dreamwidth.org/996069.html</link>
  <description>&lt;p&gt;Я люблю работать в консоли. Люблю автоматизацию скриптами. И если надо что-то массово параллельно обработать, то запустить все это в разных окнах tmux&apos;а или screen&apos;а, и любоваться процессом. И вот чего мне не хватало, так это возможности в каком-нибудь сложном скрипте наделать дочерних процессов и разложить их по разным окнам tmux&apos;а. Кажется что естественная хотелка, а вот как сделать -- не понятно. И вот дошли руки разобраться как же такой фокус делается&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Переносим процесс в другую консоль&lt;/h1&gt;

&lt;p&gt;Для начала рассмотрим более простую задачу: как вообще в принципе перенести процесс из одной консоли в другую. В древние времена эта задача решалась ручной перепривязкой потоков ввода-вывода процесса к другому tty или каким-то подобным образом. В современном линуксе для этого есть утилита &lt;a href=&quot;https://github.com/nelhage/reptyr&quot;&gt;reptyr&lt;/a&gt; которая автоматически стырит для вас процесс из соседнего терминала и привяжет его к текущему. &lt;/p&gt;

&lt;p&gt;Предположим у вас есть программа:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    #!/usr/bin/perl

    print &quot;My PID is $$\n&quot;; # print current process PID;
    sleep 10;

    while(1){
      print ++$i, &quot;\n&quot;;
      sleep 1;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Эта программа выводит в консоль свой PID, и через некоторое время начинает в той же консоли считать секунды.&lt;/p&gt;

&lt;p&gt;Если запустить эту программу в одной консоли, а в соседней консоли выполнить команду &lt;/p&gt;

&lt;p&gt;&lt;code&gt;reptyr [PID-number]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;где &lt;code&gt;PID-number&lt;/code&gt; номер процесса который напечатала наша тестовая программа в самом начале, то выполнение программы в исходной консоли прекратиться, а в новой продолжиться как ни в чем ни бывало.&lt;/p&gt;

&lt;p&gt;Достаточно просто.&lt;/p&gt;

&lt;h1&gt;Перенос дочернего процесса в другую консоль&lt;/h1&gt;

&lt;p&gt;Однако если вы попробуете проделать тот же самый фокус не с отдельно работающей программой, а с дочерним процессом &lt;code&gt;reptyr&lt;/code&gt; на вас наругается:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    [-] Process 739989 (test2.pl) shares 739990&apos;s process group. Unable to attach.
    (This most commonly means that 739990 has sub-processes).
    Unable to attach to pid 739990: Invalid argument
&lt;/code&gt;&lt;/pre&gt;

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

&lt;pre&gt;&lt;code&gt;    #!/usr/bin/perl

    use POSIX;

    $pid = fork();
    if ($pid)
    {
      # parent process
      print &quot;Child PID is $pid\n&quot;;
      sleep 10;
      while (1) {print &quot;.\n&quot;; sleep 1};
    } else
    {
      # child process
      (setpgid($$,$$) != -1)           || die &quot;Can&apos;t set own group: $!&quot;;
      sleep 10;
      while (1) {print ++$i,&quot;\n&quot;; sleep 1};
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Эта программа выводит на экран &lt;code&gt;PID&lt;/code&gt; порожденного дочернего процесса, после чего спустя десять секунд, родительский процесс начинает выводить на экран точки с частотой один раз в секунду, а дочерний процесс начинает эти секунды вслух считать. Если не предпринимать никаких действий выводы обоих процессов будут смешаны в одной консоли, в которой их запустили. &lt;/p&gt;

&lt;p&gt;Однако если в соседнем терминале запустить&lt;/p&gt;

&lt;p&gt;&lt;code&gt;reptyr [child-PID-number]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;где &lt;code&gt;child-PID-number&lt;/code&gt; -- &lt;code&gt;PID&lt;/code&gt; дочернего процесса напечатанный нашей программой, то в результате вывод дочернего процесса (цифры) переедет в новую консоль, а вывод родительского процесса (точки) останется в той консоли в которой его изначально запустили. &lt;/p&gt;

&lt;p&gt;Чего собственно говоря и хотелось добиться.&lt;/p&gt;

&lt;h1&gt;Материалы для раздумий&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Статья в которой подробно объясняется материал групп и сессий: &lt;a href=&quot;https://blog.nelhage.com/2011/02/changing-ctty/&quot;&gt;https://blog.nelhage.com/2011/02/changing-ctty/&lt;/a&gt; Понимание этого материала помогло таки найти финальное решение&lt;/li&gt;
&lt;li&gt;Мои попытки выспросить нужное решение на linux.org.ru: &lt;a href=&quot;https://www.linux.org.ru/forum/development/17555795&quot;&gt;https://www.linux.org.ru/forum/development/17555795&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Заметка на stackoverflow написанная по результатм: &lt;a href=&quot;https://stackoverflow.com/questions/78428371/how-to-fork-process-into-another-virtual-terminal/78428372&quot;&gt;https://stackoverflow.com/questions/78428371/how-to-fork-process-into-another-virtual-terminal/78428372&lt;/a&gt;&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=nataraj&amp;ditemid=996069&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://nataraj.dreamwidth.org/996069.html</comments>
  <category>linux</category>
  <category>dev</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/995584.html</guid>
  <pubDate>Tue, 02 Apr 2024 04:49:41 GMT</pubDate>
  <title>Третьим будешь?</title>
  <link>https://nataraj.dreamwidth.org/995584.html</link>
  <description>&lt;p&gt;Московские товарищи, которых интересует массаж живота (в первую очередь самомассаж).&lt;/p&gt;

&lt;p&gt;Нам нужен третий!&lt;/p&gt;

&lt;p&gt;Цель: научиться разминать всё там в животе, для здоровья пищеварения и всеобщего здоровья организма. Учиться этому сильно удобнее втроем, когда пробуешь не только на себе, но и на товарище. Поэтому нам нужен третий.&lt;/p&gt;

&lt;p&gt;Где и когда: в предстоящую субботу ближе к утру в Железнодорожном.&lt;/p&gt;

&lt;p&gt;Междусобойчик &quot;для своих&quot;, денег не беру.&lt;/p&gt;

&lt;p&gt;P.S. Ролевикам может быть особенно интересно из-за пересечения тусовок.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=995584&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://nataraj.dreamwidth.org/995584.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/995415.html</guid>
  <pubDate>Mon, 01 Jan 2024 10:37:08 GMT</pubDate>
  <title>В коммунизм через потребительские сообщества</title>
  <link>https://nataraj.dreamwidth.org/995415.html</link>
  <description>&lt;p&gt;Сошлась в голове очередная мозайка. Могу этим поделиться.&lt;/p&gt;

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

&lt;p&gt;Давайте для начала посмотрим на то как формировались два предыдущих строя.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Возникло земледение, технологии развились до того уровня, что появились излишки которые можно сохранять и перемещать. Появились ушлые люди, которые решили, а давайте эти излишки будут нашими. Как они будут нашими? А мы будем контроллировать рабочую силу (силой грубой физической) и они сами нам будут отдавать излишки. Кажется что полная фигня, но тут выяснилось, что это офигительно повышает эффективность, потому что если ты контролируешь достаточно рабочей силы, то способен реализовывать большие инфраструктурные проекты сильно повышающие эффективность производства. Поэтому эта форма отношений постепенно  захватила мир, потому что те кто в государстве (а так появилось именно государство), те рулили. А те кто нет, тех захватывали другие государства.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Прогресс неудержимо рос, производство становилось все более высокотехнологичным, и роль средств производства в процессе производства всё возрастала. И тут другие ушные люди сказали, а мы тоже хотим излишков. Но как? А мы будем контролировать средства производства (без них вы ничего не произведете) а от того что произведете с ними, часть произведенного будет наша. Товарищи из п.1 были сильно не рады этому заходу, но тут выяснилось, что такой подход дает феноменальную гибкость и адаптивность, которую ни одно государство развить не может, и гибкость приводила к очень большой эффективности. И в результате серии буржуазных революций капиталисты сильно потеснили государство (но не уничтожили, оно является базой для их функционирования, но заметно снизили роль)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Маленькое отступление. Походу ошибка Ленина была в том, что он собирался средствами государства контролировать капиталистов. Но это движение назад, так не работает. Нужно двигаться вперед. Оно по логике развития событий должно как-то вырасти из капитализма, при этом за счет роста технологического прогресса.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Наши дни. Технологической прогресс вырос настолько, что тот факт, что ты что-то производишь, вообще никого не удивляет и не радует. Производится столько что не всё может быть потреблено. А произведенное, но не потребленное не является благами, а является расходованием ценных ресурсов на производство мусора. А ушлые товарищи они хотят именно блага. Т.е. произведенное и потребленное. Именно акт потребления (не будем тут делать разницу между покупкой и потреблением) заставляет потребителя поделится своей личной долей в общественном производстве, которую можно потратить на очередную яхту. Критичной точкой тут является именно момент потребления, и смотрите, сейчас всякая сволочь стремится повлиять на то как я потребляю. Их очень интересует как я это делаю, и как на меня можно повлиять, чтобы я это делал в их интересах. Начиная с репостов-розыгрышей публикуемыми мелкими частниками во вконтакте и заканчивая мощными системами рекламной аналитики гугла-яндекса-фейсбука.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Смотря на это все, я всё недоумевал. А где тут эффективность? Да, оно позволяет лучше заниматься добровольным отъемом денежных средств у населения (о айфоны, вы идеал!!! Джобс -- гений), но не повышает эффективность общества в целом. Скорее наоборот понижает.&lt;/p&gt;

&lt;p&gt;Но это похоже не финальная стадия развития. Фишка в том, что точка потребления находится на стороне потребителя. Ему её гораздо проще контролировать, чем скажем трудящемуся контролировать средства производства. Вероятно, желающие контролировать свое потребление, будут организовываться в потребительские сообщества, чтобы не допустить ушлых товарищей до этой своей интимной точки. И вот в этом месте как раз наблюдается та самая эффективность. Люди входящие в такие сообщества будут бочаге, свободнее и здоровее чем те кто не входит. Более того, сформировавшись такие сообщества начнут заниматься производством для внутреннего потребления. И поскольку у этого производства будет не капиталистическая цель, средства производства могут вполне оставаться под контролем тех кто ими трудится, или под контролем всего сообщества, которое будет совместно получать выгоду от этого производства. Т.е. практически коммунизм, в некоторой его форме.&lt;/p&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=nataraj&amp;ditemid=995415&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://nataraj.dreamwidth.org/995415.html</comments>
  <category>размышления</category>
  <category>марксизм</category>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/995204.html</guid>
  <pubDate>Fri, 01 Dec 2023 13:23:01 GMT</pubDate>
  <link>https://nataraj.dreamwidth.org/995204.html</link>
  <description>&lt;p&gt;DW&apos;шный енжин RSS не сумел распарсить одну из записей ленты постгрессовых блогов, и как он это любит, вывалил raw-html вывод на эту тему... Один фразмент привел меня в глубокую задумчивость:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;img alt=&quot;😂&quot; class=&quot;wp-smiley c1&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f602.png&quot; /&amp;gt;
&lt;/code&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=995204&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://nataraj.dreamwidth.org/995204.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>15</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/994942.html</guid>
  <pubDate>Sat, 21 Oct 2023 17:27:35 GMT</pubDate>
  <title>Из не вошедшего</title>
  <link>https://nataraj.dreamwidth.org/994942.html</link>
  <description>&quot;-- ... тут обнаружился &quot;Отдел урегулирования убытков&quot; которого у нас нету в плане автоматизации, его автоматизировать не надо?&lt;br /&gt;-- Нет, его автоматизировать не надо... Этим ребятам автоматизация не нужна, им своих автоматов хватает&quot;.&lt;br /&gt;&lt;br /&gt;Пусть будет записано буковками...&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=994942&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://nataraj.dreamwidth.org/994942.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/994659.html</guid>
  <pubDate>Sun, 09 Jul 2023 11:50:58 GMT</pubDate>
  <title>Выпустил релиз игры Goblin Camp v0.23</title>
  <link>https://nataraj.dreamwidth.org/994659.html</link>
  <description>&lt;p&gt;Goblin Camp — попытка создать опенсорсный клон игры Dwarf Fortress. Смысл игры в управлении поселением Гоблинов (или в оригинале Гномов), при этом управления косвенного, в игре не предусмотрено прямого управления Гоблинами/Гномами, можно лишь ставить задачи в общем виде, а вот как подопечные поведут себя в результате — вопрос мастерства организации...&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23&quot;&gt;https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Изначально Goblin Camp написал некто Ilkka Halila, в 2010, повозился с ней годик и забросил. Мне как любителю Dwarf Fortress, Rim World и прочих симуляторов колоний с непрямым управлением, постоянно хотелось запустить в них руки, но сильно останавливала закрытость кода. Возможность писать моды есть, но тратить свое время на разбирательство в закрытом коде, я считаю неуважением к человечеству, поэтому стараюсь избегать к этого… И вот я в какой-то момент таки нашел ту программу в которую запустить руки не зазорно.&lt;/p&gt;

&lt;p&gt;На тот момент Gobln Camp была давно заброшена и категорически не собиралась на современных дистрибутивах. Пришлось приложить не нулевое количество усилий, чтобы оно заработало и задышало.&lt;/p&gt;

&lt;p&gt;Этот релиз закрывает проблему с работой графических тайлов. Оригинальная версия от Ilkka Halila использовала библиотеку SDL версии 1, а сейчас доступна только SDL2. Пришлось разбираться и переделывать.&lt;/p&gt;

&lt;p&gt;Кроме того, есть у меня подозрение, что графические тайлы там вообще никогда толком не работали: они не целиком загружались. Там были существенные проблемы с вычислением координат мышки и смещения при перетаскивании.&lt;/p&gt;

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

&lt;p&gt;Плюс современная библиотека libtcod (которая лежит в основе движка игры) на этот старый код выдает кучу deprecation-warning’ов. Начал их постепенно зачищать…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blog.nataraj.ru/static/media/C7881498-B8BD-96DE-B468-557D7F6C2039.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.nataraj.ru/~/It/%D0%92%D1%8B%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BB%20%D1%80%D0%B5%D0%BB%D0%B8%D0%B7%20%D0%B8%D0%B3%D1%80%D1%8B%20Goblin%20Camp%20v0.23&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=nataraj&amp;ditemid=994659&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://nataraj.dreamwidth.org/994659.html</comments>
  <category>dev</category>
  <category>it</category>
  <category>c++</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/994413.html</guid>
  <pubDate>Sat, 01 Apr 2023 11:35:50 GMT</pubDate>
  <title>Еще один веселый способ выстрелить себе в ногу</title>
  <link>https://nataraj.dreamwidth.org/994413.html</link>
  <description>&lt;p&gt;Сижу, переделываю код. Есть необходимость отучить постгрес запускать разные сервисные процессы. Решил по случаю переделать это по уму...&lt;/p&gt;

&lt;p&gt;Переделываю кусок, запускаю, проверяю, переделываю, проверяю и тут падает оконная система... Вся.&lt;/p&gt;

&lt;p&gt;Логинюсь обратно, восстанавливаю рабочий контекст, перехожу к проверке и оконная система падает снова.&lt;/p&gt;

&lt;p&gt;Я, матерсь, выключаю компьютер, включаю компьютер, возвращаюсь к прерванной мысли, и оконная система падает снова.&lt;/p&gt;

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

&lt;p&gt;Пока еду, до меня начинает доходить...&lt;/p&gt;

&lt;p&gt;Там для порождения сервисных процессов есть спец. фабрика, которая в качестве результата возвращает pid нового процесса. Для оторванных процессов я стал возвращать -1.&lt;/p&gt;

&lt;p&gt;Видимо по какой-то своей внутренней логике, она после запуска сразу посылала одному из процессов какой-то сигнал (имеет право).
А в линуксе процесс с номером -1 — это корневой процесс (скажите sudo pkill -9 -1, только не на подакшене, плиз)&lt;/p&gt;

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

&lt;p&gt;PS: и да, оконная система падала по нажатию Ctrl+C. Нажимаешь Ctrl+С в консоле и исчезает всё включая консоль!&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=nataraj&amp;ditemid=994413&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://nataraj.dreamwidth.org/994413.html</comments>
  <category>dev</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/994285.html</guid>
  <pubDate>Thu, 28 Jul 2022 20:16:26 GMT</pubDate>
  <title>Призовая игра с встраиванием питона</title>
  <link>https://nataraj.dreamwidth.org/994285.html</link>
  <description>&lt;p&gt;Я не возьмусь определять что мне более отвратительно libboost или python. Но право скажу собранные вместе в boost::python они производят на свет субстанцию непревзойденного свойства.&lt;/p&gt;

&lt;pre&gt;
 #include &amp;lt;boost/python.hpp&amp;gt;
 #include &amp;lt;stdio.h&amp;gt;

int main()
{
  Py_InitializeEx(0);

  boost::python::object modMath = boost::python::import(&quot;math&quot;);
  boost::python::object cosFunc = modMath.attr(&quot;cos&quot;);

  Py_Finalize();
}
&lt;/pre&gt;

&lt;p&gt;С 2.7м питоном работает нормально, с третьем падает с невнятной ошибкой при отработке хуков при выходе...&lt;/p&gt;

&lt;p&gt;Историю с локализацией места проблемы в портируемой программе с последующим вынесением в приведенный standalone, я опущу из-за малосодержательности и нецензурности... Скажу только, что gdb плюс правильно выбранные места для breakpoint&apos;ов рулят.&lt;/p&gt;

&lt;p&gt;Далее в процессе плясок вокруг этого примера вдруг обнаруживаю что  вот так не падает:&lt;/p&gt;

&lt;pre&gt;
int main()
{
  Py_InitializeEx(0);
  {
    boost::python::object modMath = boost::python::import(&quot;math&quot;);
    boost::python::object cosFunc = modMath.attr(&quot;cos&quot;);
  }
  Py_Finalize();
}
&lt;/pre&gt;

&lt;p&gt;Ага! думаю я. Оно позвало деструктор до финалайза а не после и все перестало падать... Надо сделать так же!&lt;/p&gt;

&lt;p&gt;Но вот проблема... аналог переменной cosFunc в портируемой программе глобальная... Создается пустая, а потом после инициалайза заполняется. Можно было бы раскинуть мозгами, как запихнуть туда указатель вместо самого объекта, и сказать ему в нужный момент delete. Но менять весь остальной код очень не хотелось...&lt;/p&gt;

&lt;p&gt;А нельзя ли так, чтобы для сложного объекта вызвался деструктор а сам объект опять заполнить пустым значением?&lt;/p&gt;

&lt;p&gt;Оказывается можно:&lt;/p&gt;

&lt;pre&gt;
int main()
{
  Py_InitializeEx(0);
  boost::python::object cosFunc;
  {
    boost::python::object modMath  = boost::python::import(&quot;math&quot;);
    cosFunc = modMath.attr(&quot;cos&quot;);
  }
  cosFunc = boost::python::object();
  Py_Finalize();
}
&lt;/pre&gt;

&lt;p&gt;оно заменяет сложное значение &lt;code&gt;cosFunc&lt;/code&gt; тривиальным, при этом для заменяемого значения вызывается деструктор.&lt;/p&gt;

&lt;p&gt;И вот так -- тоже не падает...&lt;/p&gt;

&lt;p&gt;P.S. Отдельно доставила рекомендация документации на 1.55 boost::python просто не вызывать &lt;code&gt;Py_Finalize()&lt;/code&gt;, типа не надо вам это.&lt;/p&gt;

&lt;p&gt;P.P.S. Пришел к мысли что сам питон не падает только потому что и так ползает. And you should not boost it.&lt;/p&gt;

&lt;p&gt;P.P.P.S. Честно говоря не верил, что осилю с этим разобраться. Без знания, что буста, что питона... Ан нет, получилось...&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=994285&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://nataraj.dreamwidth.org/994285.html</comments>
  <category>извращения</category>
  <category>it</category>
  <category>dev</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/993942.html</guid>
  <pubDate>Sun, 24 Jul 2022 20:32:48 GMT</pubDate>
  <title>Телеграмм головного мозга</title>
  <link>https://nataraj.dreamwidth.org/993942.html</link>
  <description>&lt;p&gt;У человека заведшего себе телеграмм в мозгу происходят неизбежные (но надеюсь что обратимые) изменения. Если коротко, он начинает считать что все остальные должны тоже установить телеграмм и с ним в этом телеграмме общаться. Он сильно недоумевает, если ему попытаться объяснить что это не так. И даже обижается. О такой вещи, как приватность он не знает вовсе.&lt;/p&gt;

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

&lt;p&gt;Примеры:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Мне по работе таки стало жестко необходимо читать несколько групповых чатов. Один раз, не этот самый, думаю я и регистрирую телеграм на один из своих публично известных номеров. И тут, внимание, о том что я завел телеграмм автоматически узнают все у кого этот номер был в записной книжке, и начали мне писать радостные восклицания. Повлиять на этот процесс я не мог никак. Приватность? Нет, не слышали! Отдельно доставляет что остальные пользователи сливали мой номер вместе со списком остальных контактов третьим лицам. С моей точки зрения это действие является явно не этичным, и очень расстраивает, что такие вещи стали нормой. Я проклял телеграмм, поставил этот аккаунт на удаление, и завел другой аккаунт на номер который никто не знает.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;В этом аккаунте у меня установлена иконка, явным образом указывающая что телеграмм является нежелательным средством связи, а вместо имени указаны предпочитаемые контакты. Но отдельных товарищей из знающих этот аккаунт, это факт не останавливает, они все равно пытаются использовать этот способ связи, и обижаются если объяснять им что этого не надо делать. Мораль — единственный способ обеспечить приватность — полная секретность. Как только контакт становиться известен, телеграммные пользователи туда начинают ломиться как зомби.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Для настройки бридж-бота мне понадобился аккаунт заведенный на корпоративный номер (бридж корпоративный, контроль должен быть у компании а не у меня). Посовещавшись завели его на рабочий телефон одного из админов. Теперь мне время от времени на этот аккаунт приходят сообщения адресованные ему. И это не остановить никак... ВООБЩЕ НИКАК. Нет возможности сказать &quot;меня нету&quot;. Завел аккаунт, вышел в онлайн, ты есть, ты ОБЯЗАН общаться.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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=nataraj&amp;ditemid=993942&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://nataraj.dreamwidth.org/993942.html</comments>
  <category>мир несовершенен</category>
  <category>наблюдения</category>
  <lj:security>public</lj:security>
  <lj:reply-count>37</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/993763.html</guid>
  <pubDate>Sun, 24 Jul 2022 14:37:56 GMT</pubDate>
  <title>Этот ваш python течет...</title>
  <link>https://nataraj.dreamwidth.org/993763.html</link>
  <description>&lt;pre&gt;#include &amp;lt;Python.h&amp;gt;

int main()
{
  Py_Initialize();
  Py_Finalize();
}&lt;/pre&gt;

&lt;p&gt;Собрать с санитайзером ASan, хоть со вторым, хоть с третьим питоном&lt;/p&gt;

&lt;p&gt;&lt;code&gt;clang-11  test.c  -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lpython2.7&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;clang-11  test.c  -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Результат один: кучка мемори ликов. В 2.7 побольше, в 3.9 небольшая...&lt;/p&gt;

&lt;p&gt;А если под полезной нагрузкой, так их вообще на много экранов...&lt;/p&gt;

&lt;p&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=nataraj&amp;ditemid=993763&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://nataraj.dreamwidth.org/993763.html</comments>
  <category>dev</category>
  <category>it</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/993336.html</guid>
  <pubDate>Tue, 19 Jul 2022 14:59:36 GMT</pubDate>
  <title>Полное удвоение разнядности</title>
  <link>https://nataraj.dreamwidth.org/993336.html</link>
  <description>&lt;p&gt;&lt;s&gt;Ну все... &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;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://vitus-wagner.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://vitus-wagner.dreamwidth.org/&apos;&gt;&lt;b&gt;vitus_wagner&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, ликуйте!&lt;/s&gt;&lt;/p&gt;

&lt;p&gt;У меня таки не осталось осмысленных хост-машин с архитектурой i386. Извел последнюю....&lt;/p&gt;

&lt;p&gt;Этой зимой благополучно издох Енот, который был аппаратно 32х битный. &lt;/p&gt;

&lt;p&gt;Под первые выстрелы спецоперации он был благополучно заменен на 64х битного Вомбата. И на вновь обретенной системе мной была опробована процедура crossgrade&apos;инга, перевода системы с i386 на amd64. Глючная как моя жизнь. Нет. corssgrade&apos;инг глючнее, и это говорит о многом.&lt;/p&gt;

&lt;p&gt;Теперь я на своем отпуске-больничном, таки проапгрейдил все контейнеры с домашнего сервера и перекинул их на того самого новообретенного Вомбата. И вот теперь получил возможность безопасно crossgrade&apos;нуть домашний сервер. Который аппаратно был amd64 давно, но когда я его сетапил, 64битный линукс глючил безбожно и не показывал важный тогда для некоторых сайтов флеш...&lt;/p&gt;

&lt;p&gt;Кроссгрейдинг прошел успешно. Торренты водружены на место. Как работает бэкап -- узнаем ночью...&lt;/p&gt;

&lt;p&gt;Так что теперь у меня все актуальные хосты 64битные, есть достаточно 32х битных контейнеров, но это исправимо. И все контейнеры обновлены как минимум до buster. Такой свежести моя инфраструктура давно не знала :-)&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=993336&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://nataraj.dreamwidth.org/993336.html</comments>
  <category>it</category>
  <category>debian</category>
  <category>извращения</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/993185.html</guid>
  <pubDate>Sat, 09 Jul 2022 15:18:37 GMT</pubDate>
  <title>И обросло питонами</title>
  <link>https://nataraj.dreamwidth.org/993185.html</link>
  <description>&lt;p&gt;Пока болею, причесываю свою серверную инфрастуктуру. &lt;/p&gt;

&lt;p&gt;Старый svn контейнер со времен минимум squeeze (не выбразывать же) переехал на хетзнер. Там проблем с пробросом нужных портов нету. Зато важен размер контейнера, поэтому задался вопросом, почему он такой толстый... Ну те то чтобы Толстый, но заметно толще вновь созданных. В поцессе исследования обнаружил там питоны 2.7, 3, 3.4, 3.5, 3.7, 3.9. Ну или какие-то следы от них. 
Перла обнаружено только два: 5.28 и 5.32 (ну или опять же какие-то следы от них).&lt;/p&gt;

&lt;p&gt;Буду изучать вопрос поиска и удаления obsolete packages. Авось поможет :-)&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=993185&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://nataraj.dreamwidth.org/993185.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/992927.html</guid>
  <pubDate>Wed, 06 Jul 2022 13:44:32 GMT</pubDate>
  <title>СЯУ How to git ignore</title>
  <link>https://nataraj.dreamwidth.org/992927.html</link>
  <description>&lt;p&gt;&lt;strong&gt;TL;TR:&lt;/strong&gt; это про &lt;code&gt;.git/info/exclude&lt;/code&gt;, если знаете, то можно пропускать.           &lt;/p&gt;

&lt;p&gt;С постгресом у меня была вечная проблема: я пытаюсь таки перейти на разработку в vim&apos;е (с переменным успехом, но последовательно движусь). Для того чтобы в vim&apos;е переходить по имени функции к месту ее определения нужно созать tags-файлы при помощи утилиты ctags. Все хорошо, но потом эти tags файлы в огромном количестве болтаются в выводе &lt;code&gt;git status&lt;/code&gt;. А если добаивть их в &lt;code&gt;.gitignore&lt;/code&gt; то надо постоянно следить за этой незакоммиченной правкой (в апстрим ее никто не возьмет)&lt;/p&gt;

&lt;p&gt;И вот мне это окончательно надоело и я пошел гуглить. Выяснилось, что есть еще локальный гитигнор, который называется &lt;code&gt;.git/info/exclude&lt;/code&gt;. Работает абсолютно идентично, но в remote не попадает.&lt;/p&gt;

&lt;p&gt;Добавил туда &lt;code&gt;tags&lt;/code&gt;, и теперь доволен как слон... :-)&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=992927&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://nataraj.dreamwidth.org/992927.html</comments>
  <category>dev</category>
  <category>it</category>
  <category>git</category>
  <category>сяу</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/992328.html</guid>
  <pubDate>Sun, 03 Jul 2022 19:34:27 GMT</pubDate>
  <title>perl redo: Век живы, век учись</title>
  <link>https://nataraj.dreamwidth.org/992328.html</link>
  <description>Читая книжку по внутренностям perl&apos;а открыл для себя оператор `redo` который позволяет повторить выполнение блока кода. В случае если этот блок -- тело цикла, то цикл на следующую итерацию при этом не переходит:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
my $i=0;
foreach (1,2,3)
{
  print $_,&amp;quot;\n&amp;quot;;
  $i++;
  redo if $i&amp;lt;2;
}
&lt;/pre&gt;&lt;br /&gt;печатает &lt;br /&gt;&lt;pre&gt;
1
1
2
3
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PS так, постойте... В DW был же маркдаун... Куда делася? Не вижу как включить...&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=992328&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://nataraj.dreamwidth.org/992328.html</comments>
  <category>сяу</category>
  <category>perl</category>
  <category>dev</category>
  <category>it</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/992240.html</guid>
  <pubDate>Wed, 02 Mar 2022 08:42:42 GMT</pubDate>
  <title>Как я со всем этим справляюсь</title>
  <link>https://nataraj.dreamwidth.org/992240.html</link>
  <description>&quot;Хуже катастрофы, может быть только паника вызванная катастрофой&quot; (с) псевдоцитата...&lt;br /&gt;&lt;br /&gt;Так вот, что мне помогает не сойти с ума и не впасть в панику.&lt;br /&gt;&lt;br /&gt;1. Маятники. (в общем случае центрирующая техника)&lt;br /&gt;&lt;br /&gt;2. Медитация на высший порядок. (Слово дхарма имеет много смыслов. Одно из них порядок или закон, в том числе и высший. Если установить контакт с источником этой дхармы, многое становиться легче. Этакое структурирование сверху)&lt;br /&gt;&lt;br /&gt;3. Найти то что действительно реально ценно. Любимая женщина, дети, родители. То ради чего следует быть в адеквате, и ориентируясь именно на эти ценности делать все остальное. Именно личные ценности, не глобальные.&lt;br /&gt;&lt;br /&gt;Это то что позволило стабилизороваться. Но далее что с этой стабильностью делать, при этом так чтобы ее не растратить:&lt;br /&gt;&lt;br /&gt;4. Изолиовал себя от чужой паники. Во вконтакте есть кнопка не &quot;показывать неделю&quot;. Очень рекомендую применять ко всем высказываниям по теме, вне зависимости от того в какую строну вас это высказывание триггерит. В случае личного общения разговоры об ЭТОМ либо просить свернуть, либо прерывать вообще всю коммуникацию, если люди не говорить об этом не способны.&lt;br /&gt;&lt;br /&gt;5. Занялся решением практических вопросов которые могут возникнуть в новой надвигающейся реальности. Без паники. В моем случае это оказалось сделать полный бэкап виртуальных серверов которые у меня в германии, и еще купил БУшный сервер для работы тут (благо это было и так запланировано). Что могу — делаю. Что не могу — на то воля аллаха...&lt;br /&gt;&lt;br /&gt;6. Помню, что я не могу ничего поменять. Все что происходит, уже на самом деле произошло, надо просто дождаться пока эта информация до меня доедет. Понимаю, что я не могу помочь всем. Поэтому только близким. Остальные успокоительные слова по остаточному принципу. Но что я точно не делаю, не гружу других своей паникой.&lt;br /&gt;&lt;br /&gt;И вообще берегите силы нервы и здоровье. Катаклизмы рано или поздно заканчиваются и силы после них понадобятся очень сильно. Не сливайте их сейчас попусту...&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.nataraj.ru/~/GeneralPurposeBlog/Как%20я%20со%20всем%20этим%20&quot;&gt;https://blog.nataraj.ru/~/GeneralPurposeBlog/Как%20я%20со%20всем%20этим%20&lt;/a&gt;справляюсь&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=992240&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://nataraj.dreamwidth.org/992240.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/991834.html</guid>
  <pubDate>Wed, 02 Mar 2022 08:34:58 GMT</pubDate>
  <title>Правила безопасности при работе с большими системами</title>
  <link>https://nataraj.dreamwidth.org/991834.html</link>
  <description>Написано во воконтакте 25 февраля сего года&lt;br /&gt;&lt;br /&gt;Если большая система пришла в движение, единственное что можно сделать, это не стоять у нее на пути. Это самая оптимальная стратегия.&lt;br /&gt;&lt;br /&gt;Не пытаться остановить и не пытаться влиться. Попытка присоединиться к движухе дает очень мощные переживания от сопричастности, но по сути ничего не меняет, силы пришедшие в движение на много порядков больше чем отдельный человек, а приложить штормовой волной о волнорез может запросто…&lt;br /&gt;&lt;br /&gt;Поэтому если вы не на службе у одной из систем, самое лучшее что можно сделать, это отойти в сторону и позаботиться в первую очередь о себе, о своем здоровье и рассудке, при возможности об окружающих.&lt;br /&gt;&lt;br /&gt;“Все побежали и я побежал”, наихудшая стратегия. Когда отношения выясняют боги, человеку лучше сидеть в укрытии…&lt;br /&gt;&lt;br /&gt;Буря рано или поздно утихнет и понадобиться много времени и сил чтобы восстановить разрушения, и заново выстраивать жизнь на земном человеческом уровне. Берегите силы, себя и окружающих.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.nataraj.ru/~/GeneralPurposeBlog/Правила%20безопасности%20при%20работе%20с%20большими%20&quot;&gt;https://blog.nataraj.ru/~/GeneralPurposeBlog/Правила%20безопасности%20при%20работе%20с%20большими%20&lt;/a&gt;системами&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=991834&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://nataraj.dreamwidth.org/991834.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/991646.html</guid>
  <pubDate>Sun, 27 Feb 2022 17:15:01 GMT</pubDate>
  <title>Как написать мне сообщение в Matrix</title>
  <link>https://nataraj.dreamwidth.org/991646.html</link>
  <description>У меня уже достаточно давно была инструкция, следуя который пользователь со средней подготовкой мог бы подключиться к матриксу и найти меня. Инструкция была во Вконтакте, так как именно там обитает большенство интересных мне пользователей со средней подготовкой. Поэтому упомянать ее в каких либо приличных местах было стыдно. &lt;br /&gt;&lt;br /&gt;Теперь я эту инструкцию обновил, добавив недостающих скриншотов, и скоировал в место более подобающее:  &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.nataraj.ru/~/It/Как%20написать%20мне%20сообщение%20в%20Matrix&quot;&gt;https://blog.nataraj.ru/~/It/Как%20написать%20мне%20сообщение%20в%20Matrix&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;По ходу дела отмечу, что ходовые испытания показали, что мало-компьютерные люди вполе осваивают Element, и уверенно им пользуются. Так же в нем в боевом режиме живут чаты разных сообществ, в виде вполне годным к использованию. При не очень великих усилиях в Matrix можно импортировать IRC и прочие чаты. (Да, IRC жив и отдельных местах процеветает).&lt;br /&gt;&lt;br /&gt;Кроме того, некоторое время внезапно проверил Matrix на надежность: перегрузил виртуалку дополнительной нагрузкой настолько что сервер матрикса перестал справляться с потоком входящих сообщений. Сообразил я что происходит примерно через пол дня, и для решения проблемы купил на хостинге еще процессора. Какое-то время оно интенсивно перемаловало все то, что ждало очереди на push. И все сообщения, которые мне отправляли люди -- дошли. Что меня несказанно порадовало...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Посему призываю всех кто понимает зачем нужны децентрализованные системы как минимум попробовать, получить личное впечатление.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=991646&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://nataraj.dreamwidth.org/991646.html</comments>
  <category>дыбр</category>
  <category>it</category>
  <category>инструкции</category>
  <category>matrix</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/991400.html</guid>
  <pubDate>Sat, 19 Feb 2022 16:50:12 GMT</pubDate>
  <title>Использование MIDI совместно с PulseAudio</title>
  <link>https://nataraj.dreamwidth.org/991400.html</link>
  <description>Попытался заняться сольфеджио, благо поступило предложение об обучении от которого невозможно отказаться.&lt;br /&gt;&lt;br /&gt;Для занятий стал подключать к ноутбуку оказавшуюся под рукой MIDI клавиатуру. Долго разбирался. Особенно с учетом того, что большинство примеров в сети либо про Jack либо про ALSA, а мне менять PulseAudio на что-то еще, совершенно не уперлось. Хочется так, чтобы воткнул – и заработало. Разобрался. Узнал много нового. Вынес мозг народу в рассылке опенсорсного MIDI-синтезатора.&lt;br /&gt;&lt;br /&gt;В результате, чтобы труд не пропал зря, да и тупо чтобы не забыть написал статью в Debian Wiki: &lt;a href=&quot;https://wiki.debian.org/PulseAudioMidi&quot;&gt;https://wiki.debian.org/PulseAudioMidi&lt;/a&gt; и еще подредактировал Wiki FluidSynth: &lt;a href=&quot;https://github.com/FluidSynth/fluidsynth/wiki/ExampleCommandLines&quot;&gt;https://github.com/FluidSynth/fluidsynth/wiki/ExampleCommandLines&lt;/a&gt; потому как рабочего примера для работы с драйвером ASLA напрямую не сыскать.&lt;br /&gt;&lt;br /&gt;Оригинал: &lt;a href=&quot;https://blog.nataraj.ru/~/It/Использование%20MIDI%20совместно%20с%20PulseAudio&quot;&gt;https://blog.nataraj.ru/~/It/Использование%20MIDI%20совместно%20с%20PulseAudio&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=991400&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://nataraj.dreamwidth.org/991400.html</comments>
  <category>it</category>
  <category>дыбр</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/991085.html</guid>
  <pubDate>Tue, 14 Sep 2021 21:10:53 GMT</pubDate>
  <title>Structure Aware Fuzzing: синтаксическое дерево</title>
  <link>https://nataraj.dreamwidth.org/991085.html</link>
  <description>Краткое содержание предыдущих серий:&lt;br /&gt;&lt;br /&gt;Fuzzing -- метод тестирования когда в программу на вход подаются случайные данные.&lt;br /&gt;&lt;br /&gt;Structure Aware Fuzzing -- данные остаются все так же случайные, но все-таки синтаксически или структурно верные. Нужно чтобы проникнуть глубже синтаксического анализатора.&lt;br /&gt;&lt;br /&gt;LibBlobStamper -- библиотека которую я пишу, которая позволяет на основании псевдо случайных данных выдаваемых фаззером, воспроизводимо генерировать синтаксически корректные данные. &lt;a href=&quot;https://github.com/postgrespro/libblobstamper&quot;&gt;https://github.com/postgrespro/libblobstamper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вот сегодня у меня новое достижение. Я таки сумел сгенерировать данные под парсер синтаксических деревьев:&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;
((((231 + 108) ^ ((39 - 156) ^ (((116 * 109) - (100 ^ (47 + 78))) / (206 / 166)))) ^ ((((253 - 125) + (171 * 215)) + (183 - (((162 / 178) - 23) - (199 + 10)))) - (192 * 61))) + (((((1 / 161) ^ 167) / (189 / 52)) * ((178 + 110) / ((((225 / 16) * 237) - 95) - 28))) * (((84 - 88) * (226 + 29)) - 180)))
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Там все пока что еще максимально сыро, много что прибито гвоздями и даже в основной код не затащено t/320-galley-recursion-experiments.cpp. Но работает, блин!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=991085&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://nataraj.dreamwidth.org/991085.html</comments>
  <category>fuzzing</category>
  <category>it</category>
  <category>dev</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/990959.html</guid>
  <pubDate>Wed, 01 Sep 2021 08:49:45 GMT</pubDate>
  <link>https://nataraj.dreamwidth.org/990959.html</link>
  <description>Вот скажите, &quot;день знания&quot; и &quot;день знаний&quot; это одно и то же или это все-таки разные вещи?&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=990959&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://nataraj.dreamwidth.org/990959.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/990465.html</guid>
  <pubDate>Mon, 21 Jun 2021 07:24:06 GMT</pubDate>
  <title>mediawiki: блокирование спамовых IP-адресов на уровне веб-сервера nginx</title>
  <link>https://nataraj.dreamwidth.org/990465.html</link>
  <description>Опубликовал еще один сервисный скрипт для медиавики:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/ban_spam_ip&quot;&gt;https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/ban_spam_ip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Скрипт получает список IP адресов с сервиса www.stopforumspam.com, преобразует его в формат пригодный для nginx&apos;ного плагина geo, после чего можно на уровне конфига nginx принимать решене о том как поступать с пользователями пришедшими с этих адресов: блокировать, перенапраяь на read-only версию сайта и т.п.&lt;br /&gt;&lt;br /&gt;Более подробно смотри README.md&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=990465&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://nataraj.dreamwidth.org/990465.html</comments>
  <category>it</category>
  <category>mediawiki</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/990294.html</guid>
  <pubDate>Fri, 18 Jun 2021 07:33:06 GMT</pubDate>
  <title>mediawiki: дайждест правок и удаление пустых пользователей</title>
  <link>https://nataraj.dreamwidth.org/990294.html</link>
  <description>Опубликовал скрипт который умеет для истанса mediawiki во-первых присылать дайджест новых изменений со времени последнего запуска, а во-вторых удалять пользователей которые были созданы, но не создали ни одной правки (частый случай для спам-ботов единожды прорвавшихся сквозь каптчу).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/changes_notifier&quot;&gt;https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/changes_notifier&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Запуск скрипта надо прописать в /etc/crontab с правильно настроенным MAILTO&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=990294&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://nataraj.dreamwidth.org/990294.html</comments>
  <category>mediawiki</category>
  <category>it</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://nataraj.dreamwidth.org/990194.html</guid>
  <pubDate>Sun, 02 May 2021 20:05:12 GMT</pubDate>
  <title>Рабочие заметки тестера по-жизни</title>
  <link>https://nataraj.dreamwidth.org/990194.html</link>
  <description>Решил я инициализировать std::vector&lt;std::string&gt; массивом из без малого 40000 слов. Ну захотелось так...&lt;br /&gt;Собираться все это безобразие g++-8 решило аж полторы минуты, или clang-11 за 40 секунд.&lt;/std::string&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=nataraj&amp;ditemid=990194&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://nataraj.dreamwidth.org/990194.html</comments>
  <category>dev</category>
  <category>it</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
