<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Блог Майка</title>
    <link>https://myke.blog/ua/</link>
    <description>Особистий блог про технології, програмування та життя.</description>
    <language>uk</language>
    <atom:link href="https://myke.blog/ua/rss.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Невчасні вечері в Португалії</title>
        <link>https://myke.blog/ua/posts/untimely-dinners-in-portugal</link>
        <guid>https://myke.blog/ua/posts/untimely-dinners-in-portugal</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Португальська — цікава мова. Як і у нас, у ній є окремі дієслова &quot;обідати&quot; та &quot;вечеряти&quot;. &quot;Almoçar&quot; і &quot;jantar&quot; відповідно.</p>
<p>У невеликих містечках Португалії більшість ресторанів і <em>ташек</em> зачинені між цими прийомами їжі. Але припустімо, що якийсь заклад напіввідчинений, а ви не знаєте, про що попросити, щоб поїсти десь у цей проміжок — скажімо, о шостій вечора, приблизно за півтори години до того, як заклад офіційно відчиниться на <em>jantar</em>.</p>
<p>І тут є хитрість: вам треба ретельно уникати прохань про ранню вечерю, <em>jantar</em>. Якщо попросите, ризикуєте, що вас приймуть за <em>bife</em> (біфштекс). Так називають дуже блідих іноземців (зазвичай англійців), які не знають, що треба користуватися сонцезахисним кремом, і добряче просмажуються на сонці.</p>
<p>Натомість обов’язково скажіть, що хочете <em>almoçar</em>, натякаючи тим самим, що ви так тяжко працювали, що навіть не встигли вчасно пообідати. Співчутливі португальці часто запропонують вам щось поїсти, навіть якщо в них перерва.</p>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Керування музичною колекцією за допомогою ШІ</title>
        <link>https://myke.blog/ua/posts/claude-music-collection</link>
        <guid>https://myke.blog/ua/posts/claude-music-collection</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Я почав збирати музику щойно дізнався про новий модний формат MP3 у 90-х. Потім я все це втратив через стримінгові сервіси — мабуть, я досі міг би відновити колекцію, але для цього довелося б перебирати старі резервні копії. Та й більшість музики була піратською, що суперечить моїм нинішнім поглядам на те, як має бути влаштований світ (як і користування Spotify, бо артистам там дістаються копійки). Тож я вирішив зібрати музичну колекцію заново, офіційно купуючи музику на сайтах на кшталт <a href="https://bandcamp.com">bandcamp</a>.</p>
<p>І постало питання, як усе це впорядкувати.</p>
<p>Але і тоді, і зараз найгірше в музичній колекції — підтримувати в ній лад: гарні назви файлів і папок, правильне сортування, обкладинки альбомів і все таке. Колись у мене вистачало енергії редагувати метадані вручну (та що там, я ще пам’ятаю, як сам переганяв свої CD в MP3). Але зараз мені надто ліньки займатися цією фігнею.</p>
<p>На сцену виходить Claude Code (але те саме можна зробити за допомогою gemini, opencode, claude desktop із якимось MCP тощо).</p>
<h1>Налаштування</h1>
<p>Я зберігаю свою музичну колекцію в <code>~/Sync/Music/</code> зі строгою структурою каталогів: <code>Artist/YEAR - Album Title/</code>. Ця папка автоматично синхронізується за допомогою <a href="https://syncthing.net/">syncthing</a> з моїм домашнім сервером, звідки я можу стримити музику куди завгодно. За комп’ютером я слухаю її через плеєр <a href="https://github.com/mierak/rmpc">rmpc</a>, бо я такий крутий, що мене задовольнить лише термінальний плеєр.</p>
<p>У дорозі я слухаю музику зі свого <a href="https://www.navidrome.org/">Navidrome</a>, але, чесно кажучи, здебільшого слухаю її під час роботи.</p>
<p>Щоб підтримувати порядок, я створив у музичному каталозі файл <code>CLAUDE.md</code> із правилами організації та процедурами імпорту (ну, насправді я сказав Claude, чого хочу, а він створив для мене файл, який я потім відредагував).</p>
<p>Потім я попросив його навести лад і реорганізувати мою колекцію. На це пішло приблизно 10 хвилин, включно з пошуком інформації про альбоми та виконавців в інтернеті. Наприклад, в одному альбомі всі треки були відсортовані за абеткою, тож я попросив розставити їх відповідно до порядку на самому альбомі. Результат — ідеальна структура папок <code>ARTIST / YEAR - ALBUM</code> з обкладинками альбомів (хоча в якийсь момент він і спробував <em>згенерувати</em> обкладинку замість того, щоб знайти її в інтернеті).</p>
<p>У будь-якому разі це дуже гарний приклад використання ШІ для нудного завдання, не пов’язаного з програмуванням. Трохи технічних подробиць:</p>
<h1>Процес імпорту</h1>
<p>Завантаживши новий альбом, я можу виконати:</p>
<pre class="language-bash"><code class="language-bash">claude <span class="token parameter variable">-p</span> <span class="token string">"import ~/Downloads/album.zip"</span></code></pre>
<p>Файл CLAUDE.md дає Claude такі вказівки:</p>
<ul>
<li>Розпакувати zip-файл</li>
<li>Перевірити правильність метаданих і за потреби виправити їх</li>
<li>Знайти рік випуску</li>
<li>Створити належну структуру каталогів у моєму каталозі Music</li>
<li>Перемістити файли у впорядковане розташування</li>
<li>Оновити базу даних MPD, щоб нова музика одразу з’явилася в плеєрі</li>
</ul>
<p>Погляньте, який охайний імпорт:</p>
<img src="/media/claude-music-import.png" alt="Знімок екрана, на якому Claude Code імпортує альбом до музичної бібліотеки">
<p>Ось файл <a href="/media/music_collection_claude.md">CLAUDE.md</a>, який я використовую, якщо захочете спробувати самі.</p>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Новий словник санскриту</title>
        <link>https://myke.blog/ua/posts/new-sanskrit-dictionary</link>
        <guid>https://myke.blog/ua/posts/new-sanskrit-dictionary</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Очевидно, що найважчу (набагато, набагато, дуже набагато важчу) частину роботи було зроблено деякий час тому, коли чудові люди з Кельнського університету в Німеччині оцифрували й опублікували <a href="https://www.sanskrit-lexicon.uni-koeln.de/">Кельнські цифрові словники санскриту</a>. Вони навіть виклали всі 36 чи більше словників онлайн, щоб будь-хто міг ними користуватися (до того ж у різних форматах).</p>
<p>Єдина проблема наданого ними вебінтерфейсу полягала в тому, що він, на мій смак, трохи... занадто академічний. До того ж він шукає лише в одному словнику за раз і тільки точні збіги.</p>
<p>Було зрозуміло, що вдосконалення інтерфейсу принесе велику користь дослідникам і студентам, і я хотів зробити кілька покращень:</p>
<ul>
<li>Дозволити користувачам вводити текст за допомогою IAST (латинської транскрипції) або деванагарі, адже програма сама здатна їх розрізнити</li>
<li>Уможливити пошук у будь-якій кількості словників одночасно</li>
<li>Додати нечіткий пошук (щоб можна було знаходити приблизні збіги та схожі слова)</li>
<li>Додати повнотекстовий пошук за статтями (а не лише за словами), фактично створивши найбільший двосторонній словник</li>
</ul>
<p>Коротше кажучи, я нарешті це зробив і запустив <a href="https://sanskrit.myke.blog">sanskrit.myke.blog</a> з усім переліченим вище. Сподіваюся, вам сподобається ним користуватися!</p>
<h2>Трохи технічних подробиць для ґіків</h2>
<p>Коли я раніше створював версію з графічним інтерфейсом, то написав мігратор, який переніс усі статті в базу даних SQLite, що постачалася разом зі словником. Здавалося, це має сенс і з погляду швидкодії, і з погляду зручності пошуку. Отримана програма не повільна, але й не надто швидка. Мені це не подобалося.</p>
<p>Цього разу я ще трохи подумав, і з’явилася цілком очевидна ідея: база даних потрібна лише тоді, коли збираєшся в неї записувати. Словник цим не займається, він читає, тож якщо я хотів зробити його швидким, мені потрібна була лише добра структура даних, яка перебуває в оперативній пам’яті й чекає на запити читання.</p>
<p>У результаті вебверсія не лише набагато швидша (якщо не враховувати час передачі мережею), а й займає лише невелику частку початкової кодової бази. І я знаю, що можна ще підвищити продуктивність, додавши додаткові індекси, — зроблю це наступного разу, коли з’явиться натхнення.</p>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Основи інтерактивної розробки на Clojure</title>
        <link>https://myke.blog/ua/posts/clojure-interactive-development-101</link>
        <guid>https://myke.blog/ua/posts/clojure-interactive-development-101</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Знову пролунало запитання: я пишу код у REPL і бачу результати, але це не дуже зручно. Тож я вирішив написати невеликий вступ про те, як зручно займатися інтерактивною розробкою (також відомою як розробка з використанням REPL).</p>
<p>Одразу про головне: <em>нам майже ніколи не потрібно нічого вводити в REPL</em>. Єдиний виняток — команди з файлу <code>user.clj</code>, як-от <code>(start)</code> чи <code>(reload)</code>, але це окрема тема. Ми ніколи не вводимо в REPL щось таке:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token keyword">defn</span> add-two <span class="token punctuation">[</span>n<span class="token punctuation">]</span>
 <span class="token punctuation">(</span><span class="token keyword">+</span> n <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
<p>Ба більше, ми навіть цього не вводимо в REPL:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token function">add-two</span> <span class="token number">3</span><span class="token punctuation">)</span></code></pre>
<p>То що ж ми робимо? Проблема в тому, що інтерактивну розробку за своєю природою важко пояснити, не показавши, тож, гадаю, скористаюся знімками екрана. Я використовуватиму Emacs CIDER як середовище розробки, але того самого можна досягти у VS Code з Calva, vim тощо. Щодо IntelliJ IDEA я не зовсім упевнений, тож тут не допоможу.</p>
<p>Почнімо.</p>
<h1>Що таке структурне редагування?</h1>
<p>Ще одна річ перед тим, як справді почати.</p>
<p>Головна відмінність LISP від «звичайних» мов — знаменита гомоіконічність. Тобто код записано з використанням власних структур даних мови (переважно списків). Один із наслідків цього — дуже чіткі межі між кожним виразом LISP, або s-виразом (s-exp). Дужки.</p>
<p>Це має дуже практичний наслідок. Коли у вас є щось таке (уявімо, що <code>|</code> — це курсор), редактор легко може визначити, що він стоїть одразу після s-виразу <code>(+ 2 3)</code> і всередині s-виразу <code>(inc ...)</code>.</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token keyword">inc</span> <span class="token punctuation">(</span><span class="token keyword">+</span> <span class="token number">2</span> <span class="token number">3</span><span class="token punctuation">)</span>|<span class="token punctuation">)</span></code></pre>
<p>Редактору надзвичайно просто це з’ясувати. У Python для цього довелося б рахувати пробіли, тож це складніше завдання. У будь-якому LISP це просто: важливе лише розташування дужок.</p>
<p>Гаразд, тепер починається найцікавіше.</p>
<h1>Правильний спосіб керувати REPL</h1>
<p>Як я сказав вище, ми більше ніколи не вводитимемо текст у REPL (крім команд з <code>user.clj</code>). Але все одно розроблятимемо інтерактивно.</p>
<p>Коли маємо вираз <code>(+ 2 3)</code>, у CIDER ми поставимо курсор одразу після нього:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token keyword">+</span> <span class="token number">2</span> <span class="token number">3</span><span class="token punctuation">)</span>|</code></pre>
<p>І виконаємо команду <code>M-x cider-eval-last-sexp RET</code> (у VS Code з Calva це буде <code>ctrl+alt+enter</code> для <code>Evaluate to cursor</code>), і ось що отримаємо:</p>
<img src="/media/clojure-101/eval-sexp-01.png">
<p>Це найважливіша частина. Редактор відправив s-вираз у REPL, отримав результат обчислення і показав його нам просто поруч із s-виразом. Вітаю, це третина всього, що потрібно знати, щоб почати інтерактивну розробку.</p>
<p>Отже, ми не вводили вираз у REPL, а обчислили s-вираз безпосередньо з файлу з кодом. Оце так.</p>
<p>Тепер розгляньмо реальний приклад налагодження (ну, напівреальний). Припустімо, маємо функцію:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token keyword">defn</span> authorized? <span class="token punctuation">[</span>handler<span class="token punctuation">]</span>
    <span class="token punctuation">(</span><span class="token keyword">fn</span> <span class="token punctuation">[</span>request<span class="token punctuation">]</span>
      <span class="token punctuation">(</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">some-authrorization-logic</span> request<span class="token punctuation">)</span>
        <span class="token string">"You are authorized"</span>
        <span class="token string">"You are NOT authorized"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
<p>Як бачите, це іграшкова функція проміжного шару, яка отримує запит, пропускає його через невідому нам логіку авторизації і повертає рядок залежно від результату. І ця функція не працює.</p>
<p>У «звичайних» мовах для її налагодження знадобився б інструмент на кшталт Postman, постійне перезавантаження застосунку й проходження через проміжний шар. Але не кложуристам — у нас є інтерактивна розробка. Скористаймося єдиним прийомом, який ми вже вивчили: обчисленням останнього s-виразу.</p>
<p>Насамперед ми хочемо захопити запит, який спричиняє помилку, щоб не запускати Postman знову і знову. Це досить просто, наприклад так:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token keyword">defn</span> authorized? <span class="token punctuation">[</span>handler<span class="token punctuation">]</span>
    <span class="token punctuation">(</span><span class="token keyword">fn</span> <span class="token punctuation">[</span>request<span class="token punctuation">]</span>
      <span class="token punctuation">(</span><span class="token keyword">def</span> request request<span class="token punctuation">)</span>
      <span class="token punctuation">(</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">some-authrorization-logic</span> request<span class="token punctuation">)</span>
        <span class="token string">"You are authorized"</span>
        <span class="token string">"You are NOT authorized"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
<p>Зверніть увагу на вставлений def, яким ми визначили глобальну змінну request. Це потужний механізм налагодження, але краще для цього використовувати інструмент на кшталт <a href="https://github.com/AbhinavOmprakash/snitch">snitch</a>. Так чи інакше, ми виконали запит один раз і тепер маємо його в поточному просторі імен. Як його перевірити?</p>
<p>Поставивши курсор одразу після слова <code>request</code> і виконавши єдину поки що відому нам команду для обчислення s-виразу перед курсором (а найменший s-вираз — це одне слово):</p>
<img src="/media/clojure-101/eval-request.png">
<p>Ось і наш запит. Тепер можна ізолювати частину, яку ми налагоджуємо, знову використавши ту саму команду, але цього разу для s-виразу <code>(some-authrorization-logic request)</code>:</p>
<img src="/media/clojure-101/eval-request-2.png">
<p>Ага, щось не так із методом. Поекспериментуймо ще: той самий прийом, але тепер можна спростити аргумент, звівши запит до мапи з одним ключем, бо ми підозрюємо, що лише він і цікавить цю функцію:</p>
<img src="/media/clojure-101/eval-request-3.png">
<p>Хм, delete теж не спрацював. Спробуймо POST:</p>
<img src="/media/clojure-101/eval-request-4.png">
<p>Бінго, ми з’ясували, у чому була проблема в цьому дурнуватому прикладі, використавши один прийом інтерактивної розробки. Ми жодного разу не перезапускали застосунок, нам не довелося робити другий мережевий запит (дуже зручно, коли робиш це просто в продакшені), і все ж ми з’ясували причину проблеми.</p>
<p>Ось чому це називається інтерактивною розробкою, а не розробкою з використанням REPL: спробуйте повторити це в REPL.</p>
<h1>Ще два прийоми</h1>
<p>Отже, ми вивчили один прийом — обчислення виразу перед курсором, але для більш-менш вільної роботи потрібні ще принаймні два. Я не робитиму знімків для кожного, а просто розповім про них.</p>
<p>До речі, поки я це писав, помітив, що в CIDER є щонайменше 20 команд, які починаються з <code>cider-eval-</code>, а я використовую лише чотири чи п’ять.</p>
<img src="/media/clojure-101/cider-eval-list.png">
<h2>Обчислити форму верхнього рівня, у якій ми перебуваємо</h2>
<p>У CIDER це робиться командою <code>M-x cider-eval-defun-at-point RET</code>. Аналогічну команду VS Code, а також інші приклади й відео на цю тему можна знайти у статті <a href="https://calva.io/eval-tips">eval tips</a> на сайті Calva.</p>
<img src="/media/clojure-101/eval-defun.png">
<p>Як бачите, хоча курсор стоїть десь усередині вкладеної форми, обчислюється вся функція. Це допомагає, коли ви змінюєте код і хочете перевірити нове визначення, не виходячи з функції.</p>
<h2>Обчислити весь файл</h2>
<p>Найочевидніша команда: відредагуйте що завгодно, а потім відправте весь файл у REPL, щоб оновити стан запущеної програми. У CIDER це <code>M-x cider-eval-buffer RET</code>, у Calva — щось там, що можна знайти за посиланням вище.</p>
<h1>Підсумок</h1>
<p>Сподіваюся, мені вдалося показати вам, наскільки зручною може бути інтерактивна розробка. Ми обчислюємо вирази глибоко всередині функцій, з якими працюємо, підставляючи параметри, щоб швидко знаходити й виправляти помилки (навіть у продакшені за допомогою nREPL).</p>
<p>Дуже важливо попрощатися зі звичкою жити в циклі редагування-компіляція-перезапуск і перейти до блаженного циклу Clojure: запустити програму один раз, а потім навчати її робити те, що вам потрібно.</p>
<h1>Бонусна порада</h1>
<ul>
<li><a href="https://github.com/AbhinavOmprakash/snitch">snitch</a></li>
<li><a href="https://github.com/tonsky/clj-reload">clj-reload</a></li>
</ul>
<p>Ці два інструменти буквально створені одне для одного. <code>snitch</code> дозволяє інструментувати будь-які змінні, що проходять через функцію, простою заміною одного символу, тож після хоча б одного виклику <code>add-two</code> змінна <code>n</code> буде доступна в глобальній області видимості:</p>
<pre class="language-clojure"><code class="language-clojure"><span class="token comment">;; note the asterix after defn</span>
<span class="token punctuation">(</span><span class="token function">defn*</span> add-two <span class="token punctuation">[</span>n<span class="token punctuation">]</span>
 <span class="token punctuation">(</span><span class="token keyword">+</span> n <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token punctuation">(</span><span class="token function">add-two</span> <span class="token number">5</span><span class="token punctuation">)</span>

n <span class="token comment">;; => 5</span></code></pre>
<p>А виконання <code>(reload)</code> з <code>clj-reload</code> усе прибере й видалить усі змінні, інструментовані під час експериментів зі <code>snitch</code>, знову очистивши простори імен.</p>
]]></description>
        <category>TECH</category>
      </item>
    
      <item>
        <title>Генерал часів холодної війни Ейтор Алмендра про запобігання комуністичному перевороту в Португалії</title>
        <link>https://myke.blog/ua/posts/interview-general-almendra</link>
        <guid>https://myke.blog/ua/posts/interview-general-almendra</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>На час інтерв’ю генералу-ветерану Ейтору Гамілтону Алмендрі було 92 роки, але за його жвавістю та ясною пам’яттю цього ніколи не скажеш. Для мене було великою честю мати змогу донести деякі з його історій до ширшої аудиторії.</p>
]]></description>
        <category>VIDEO</category>
      </item>
    
      <item>
        <title>Корисні ідіоти: Ларс фон Трієр</title>
        <link>https://myke.blog/ua/posts/useful-idiot-lars-von-trier</link>
        <guid>https://myke.blog/ua/posts/useful-idiot-lars-von-trier</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Сьогодні поглянемо на <a href="https://www.instagram.com/p/CwQF70VMWS3/">допис в інстаграмі</a> відомого данського режисера Ларса фон Трієра:</p>
<img src="/media/lars-post.png" alt="Допис Ларса фон Трієра в інстаграмі: Пану Зеленському та пану Путіну і не в останню чергу пані Фредеріксен (яка вчора, наче по вуха закохана, позувала в кабіні однієї з найстрашніших машин для вбивства нашого часу, усміхаючись на весь рот): ЖИТТЯ РОСІЯН ТАКОЖ МАЮТЬ ЗНАЧЕННЯ!">
<p>У дописі написано:</p>
<blockquote>
<p>До речі:
Пану Зеленському та пану Путіну і не в останню чергу пані Фредеріксен (яка вчора, наче по вуха закохана, позувала в кабіні однієї з найстрашніших машин для вбивства нашого часу, усміхаючись на весь рот):</p>
<p>«ЖИТТЯ РОСІЯН ТАКОЖ МАЮТЬ ЗНАЧЕННЯ!»</p>
<p>З найкращими побажаннями, Ларс</p>
</blockquote>
<p>Цікава думка, пане фон Трієр. Отже, коли росіяни бомблять наші міста, ми не повинні захищатися, бо маємо піклуватися про життя росіян.</p>
<p>А як щодо надзвичайно простого способу захистити життя росіян: забратися з України?</p>
<p>Це не провина жертви, що нападник дістав поранення під час нападу. Це <em>здобуток</em> жертви.</p>
<p>Тож якщо ви хочете захистити життя росіян, допоможіть нам зупинити війну, а не підтримуйте своїм впливом їхню агресію.</p>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Про російські військові традиції</title>
        <link>https://myke.blog/ua/posts/war-crimes</link>
        <guid>https://myke.blog/ua/posts/war-crimes</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Користувач Mastodon @kravietz@agora.echelon.pt написав невеликий <a href="https://agora.echelon.pl/objects/5ee2533d-a0be-4e30-b797-5546341dd5d9">допис</a> про поведінку російської армії під час Афганської війни 1979–1989 років, процитувавши солдатські спогади<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> і зауваживши, що в їхній поведінці нічого не змінилося і сьогодні вони діють так само:</p>
<blockquote>
<p>У селі один із сержантів, не приховуючи хвилювання, зауважив, що «молодички хороші». Слова сержанта, наче іскра, запалили всіх інших, а тоді він скинув шинель і рушив до однієї з жінок: — Греби, хлопці! На очах аксакалів і дітей наші інтернаціоналісти чинили з жінками що хотіли. Зґвалтування тривало дві години. Діти тулилися в кутку, кричали й верещали, намагаючись хоч якось допомогти матерям. Старі, тремтячи, молили свого Бога про милість і порятунок. Потім сержант скомандував: «Вогонь!» — і першим застрелив жінку, яку щойно зґвалтував. Швидко добили й усіх інших. Потім злили пальне з бака бойової машини піхоти, облили ним мертві тіла, накрили їх одягом, ганчір’ям і навіть убогими дерев’яними меблями та підпалили. Полум’я спалахнуло всередині глиняної хати...</p>
</blockquote>
<p>Мене не дивує, що за якихось тридцять років нічого не змінилося, бо нічого не змінювалося сотні років. Порівняймо свіжу цитату вище з цією цитатою стовпа російської літератури Льва Толстого<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>, який описує війну середини дев’ятнадцятого століття:</p>
<blockquote>
<p>Зруйнований аул<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup> був тим самим, у якому Хаджі-Мурат ночував перед тим, як перейти до росіян. Садо з родиною залишив аул із наближенням російського загону, а повернувшись, знайшов свою саклю<sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup> у руїнах: дах обвалився, двері та стовпи, що підтримували навіс, згоріли, а всередині було брудно. Його сина, гарного ясноокого хлопчика, який з таким захопленням дивився на Хаджі-Мурата, привезли мертвим до мечеті на коні, накритому буркою; його вдарили багнетом у спину. Поважна жінка, яка прислуговувала Хаджі-Муратові, коли той був у домі, тепер стояла над тілом сина з роздертою спереду сорочкою, оголеними зів’ялими грудьми й розпущеним волоссям, дряпала собі обличчя до крові й безупинно голосила. Садо, взявши кайло й лопату, пішов із родичами копати могилу синові. Старий дід сидів біля стіни зруйнованої саклі, стругав палицю й незворушно дивився перед собою. Він щойно повернувся з пасіки. Обидві копиці сіна там згоріли, абрикосові й вишневі дерева, які він посадив і виплекав, були поламані й обпалені, а ще гірше — згоріли всі вулики й бджоли. Голосіння жінок і малих дітей, які плакали разом із матерями, змішувалося з муканням голодної худоби, для якої не було корму. Старші діти замість того, щоб гратися, перелякано стежили за дорослими. Джерело було забруднене, очевидно навмисно, так що водою не можна було користуватися. Мечеть була забруднена так само, і мулла з помічниками її очищали. Про ненависть до росіян ніхто не говорив. Почуття, яке переживали всі чеченці, від наймолодшого до найстаршого, було сильнішим за ненависть. Це була не ненависть, бо вони не вважали цих російських псів людьми, а така відраза, огида й нерозуміння безглуздої жорстокості цих істот, що бажання їх винищити — як винищують щурів, отруйних павуків чи вовків — було таким самим природним інстинктом, як інстинкт самозбереження.</p>
</blockquote>
<p>Росіяни мають рацію, коли стверджують, що вони — країна давніх традицій. Я цілком певен, що цю традицію можна простежити ще глибше в минуле, можливо, аж до Золотої Орди.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p><a href="http://afghan-war-soldiers.ru/">Солдати Афганської війни (російською мовою)</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p><a href="https://mthoyibi.files.wordpress.com/2011/03/hadji-murad_leo-tolstoy.pdf"><em>Хаджі-Мурат</em></a> Льва Толстого, розділ XVII <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p>село <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p>дім <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Про маленькі пропагандистські хитрощі</title>
        <link>https://myke.blog/ua/posts/propaganda-tricks-1</link>
        <guid>https://myke.blog/ua/posts/propaganda-tricks-1</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<h2>Натхнення</h2>
<p>Сьогодні я мав коротку <a href="https://fosstodon.org/@yogthos@lemmy.ml/110672976582947303">дискусію</a> у Mastodon, яка почалася з цього допису:</p>
<img src="/media/yogthos-toot.png" alt="Дописи @yogthos: Канадська програма «допомоги» підготувала ґрунт для приватизації землі після постмайданного перевороту">
<p>Оскільки це був камінь у бік України, я мусив долучитися.</p>
<p>Але цей допис і цей блог не про Україну, а про мислення, тож погляньмо на це під трохи іншим кутом. Для цього нам не потрібно ставати на чийсь бік у безпосередній дискусії про Україну, канадську допомогу чи власність на землю. Натомість це пояснить прийом, який пропагандисти в усьому світі використовують настільки часто, що він, мабуть, один із найстаріших і найуживаніших. А ще один із найефективніших.</p>
<p>Якщо ще раз прочитати допис і запитати себе, про що він, відповідь очевидна: про вплив якоїсь канадської програми допомоги на приватизацію землі в Україні. Особисто я гадки не маю, про яку програму допомоги він говорить. Але річ не в цьому. І цей «toot» (так називають дописи в Mastodon) теж не про це.</p>
<h2>Відволікання уваги</h2>
<p>Розумієте, згадка про канадську програму допомоги відволікає увагу. Як скаже вам будь-який ілюзіоніст, щоб виконати трюк, треба відвернути увагу глядачів туди, де насправді нічого не відбувається, поки ви робите свою справу зовсім в іншому місці.</p>
<p>Відверто кажучи, більшості людей байдуже до канадської допомоги Україні й навіть до її впливу на власність на українську землю. Але навіть якщо їм не байдуже, вони або погодяться, або не погодяться з цим, а це означатиме, що їхню увагу відвернули.</p>
<h2>Трюк</h2>
<p>Справжній трюк, на який автор хоче, щоб ви просто не звернули уваги й тому прийняли без критичної оцінки, міститься в слові <em><strong>переворот</strong></em>.</p>
<p>Розумієте, позитивну політичну подію ми не називаємо переворотом.</p>
<blockquote>
<p><strong>переворот</strong> — раптове рішуче застосування сили в політиці, особливо насильницьке повалення або зміна чинного уряду невеликою групою (<a href="https://www.merriam-webster.com/dictionary/coup">Merriam-Webster</a>)</p>
</blockquote>
<p>Раптове<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>, рішуче, насильницьке повалення невеликою групою людей<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>. До того ж, вочевидь, насильницьке. Є ще й емоційне забарвлення цього слова. Переворот — це щось сплановане за зачиненими дверима й здійснене жорстокими людьми в палацах. Це те, що відбувається в країнах, які ви не хотіли б відвідати навіть у найкращі часи.</p>
<p>Отже, поки автор допису відволікає вашу увагу, нібито говорячи про канадську допомогу, він насправді непомітно підсовує вам дуже емоційно забарвлений і негативний опис подій в Україні. Одним коротким словом. Непогано.</p>
<p>Ви, звісно, маєте повне право погоджуватися чи не погоджуватися з його описом, але якщо хочете мислити критично, вам потрібно <em>помітити</em> його й запитати себе: стривайте, а я справді погоджуюся, що це був переворот, а не революція, мирний протест, демократичний протест, акт прямої демократії народу?</p>
<p>Можливо, вам доведеться дещо почитати, а можливо, вам просто нецікаво. Але якщо ви це помітили — вас не обдурили.</p>
<p>Як я вже казав, цей прийом надзвичайно ефективний і часто використовується як у друкованих текстах, так і під час промов та дебатів. Тепер ви про нього знаєте.</p>
<h2>ОНОВЛЕННЯ</h2>
<p>Після того як я опублікував цей допис і отримав кілька коментарів, мені вдалося знайти ще кращий приклад того самого трюку від того самого автора.</p>
<img src="/media/alleged.png" alt="Допис @yogthos на Lemmy: американські медіа приховують ізраїльські воєнні злочини в Дженіні">
<p>Цей приклад навіть кращий за перший, тому я мусив оновити допис. Погляньте, що тут відбувається:</p>
<blockquote>
<p>Існує очевидний подвійний стандарт між медійною істерикою навколо ймовірних російських звірств в Україні та мовчанням щодо безчинств ізраїльських військ і поселенців на окупованому Західному березі.</p>
</blockquote>
<p>Зупиніться на мить і спробуйте самі визначити, де відволікання уваги, а де трюк.</p>
<p>Отже, відволікання уваги — це вся частина про подвійні стандарти медіа, а трюк, як завжди, у деталях. Поки ви думаєте про Ізраїль і свою позицію щодо того, що там відбувається, автор непомітно підсовує два дуже емоційно забарвлені слова: <strong>істерика</strong> та <strong>ймовірні</strong>.</p>
<p>Спритно, еге ж? Якби це не була пропаганда, я б майже захоплювався хитрістю та елегантністю. Отже, реакцію медіа на найбільшу війну з часів Другої світової з буквально тисячами й тисячами задокументованих воєнних злочинів названо «істерикою», а самі злочини — «імовірними», недоведеними, можливо, й неіснуючими.</p>
<p>Як я вже казав, ваша думка з цього приводу — ваша справа. Але заради критичного мислення ви маєте помічати ці слова, які вам підсовують, поки вашу увагу відвернуто.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Євромайдан тривав 3 місяці й 1 день. Чи вважається це раптовим? <a href="https://en.wikipedia.org/wiki/Euromaidan">Вікіпедія</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Ця група людей здається вам невеликою і жорстокою? Пів мільйона українців співають гімн під час революції 2013 року <a href="https://www.youtube.com/watch?v=RTHpSnrKEeA">YouTube</a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Миттєва офлайн-пошта на Mac із goimapnotify, mbsync і mu</title>
        <link>https://myke.blog/ua/posts/push-offline-emails-mbsync</link>
        <guid>https://myke.blog/ua/posts/push-offline-emails-mbsync</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<h1>Вступ</h1>
<p>Сьогодні я витратив кілька годин на те, щоб листи надходили до моєї офлайн-скриньки щойно вони з’являються на сервері, причому для кожного з моїх поштових акаунтів.</p>
<h2>Інструменти</h2>
<p>Припускаю, що ви вже налаштували свій улюблений інструмент для роботи з офлайн-поштою (mu, notmuch тощо), а ваші листи синхронізуються за допомогою чогось на кшталт mbsync (isync). Тобто основи у вас уже є і ви готові до складніших речей.</p>
<p>Якщо ні, ось кілька чудових статей, які допоможуть почати різними способами:</p>
<ul>
<li><a href="https://macowners.club/posts/email-emacs-mu4e-macos/">Налаштування пошти в Emacs із Mu4e на macOS</a></li>
<li><a href="https://michal.sapka.me/2023/notmuch/">Керування поштою за допомогою notmuch та Emacs</a></li>
</ul>
<h2>Поштові скриньки</h2>
<p>Для цього посібника припустімо, що у вас є файл <code>.mbsyncrc</code> з двома налаштованими скриньками: робочою та особистою. Це означає, що ви можете отримати всю пошту із сервера командою <code>mbsync -a</code> або окремо синхронізувати робочу чи особисту скриньку командами <code>mbsync work</code> і <code>mbsync private</code>.</p>
<p>Зараз ви або запускаєте синхронізацію вручну, або, що ймовірніше, маєте щось на кшталт служби homebrew для isync, яка перевіряє пошту кожні кілька хвилин.</p>
<p>Ми зробимо цей процес таким же безшовним, як на смартфонах: нові листи з’являтимуться у скриньці, щойно надійдуть на сервер.</p>
<h2>Встановлення</h2>
<p>Спочатку встановімо <a href="https://gitlab.com/shackra/goimapnotify">goimapnotify</a>. Його немає в brew, і для нього потрібно встановити golang, тож:</p>
<ol>
<li><code>brew install golang</code></li>
<li><code>go install gitlab.com/shackra/goimapnotify@latest</code></li>
<li>Додайте цільову папку для встановлених через go програм до <code>PATH</code>. Зазвичай це <code>~/go/bin</code>, тож додайте це до <code>.zshrc</code>:</li>
</ol>
<pre class="language-sh"><code class="language-sh"><span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">PATH</span></span><span class="token operator">=</span><span class="token environment constant">$HOME</span>/go/bin:<span class="token environment constant">$PATH</span></code></pre>
<p>Гаразд, легка частина позаду. Тепер створімо файли конфігурації.</p>
<h2>Конфігурація</h2>
<p>З якоїсь невідомої причини <code>goimapnotify</code> вважає, що його конфігураційні файли повинні мати розширення <code>.conf</code>, хоча їхній вміст — звичайний json. Ми не будемо дотримуватися цієї дивної схеми й створимо два файли конфігурації json: <code>work.json</code> і <code>private.json</code>.</p>
<p>Припустімо, що ваша робоча пошта на Gmail, а особиста — на Protonmail (як і має бути, бажано з власним доменом, щоб за бажання можна було перейти до іншого провайдера).</p>
<h3>work.json</h3>
<p>Найпростіша версія <code>work.json</code> для Gmail виглядала б так:</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
    <span class="token property">"host"</span><span class="token operator">:</span> <span class="token string">"imap.gmail.com"</span><span class="token punctuation">,</span>
    <span class="token property">"port"</span><span class="token operator">:</span> <span class="token number">993</span><span class="token punctuation">,</span>
    <span class="token property">"tls"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    <span class="token property">"username"</span><span class="token operator">:</span> "your.work.email@gmail.com`<span class="token punctuation">,</span>
    <span class="token property">"password"</span><span class="token operator">:</span> <span class="token string">"YOUR_PASSWORD"</span><span class="token punctuation">,</span>
    <span class="token property">"onNewMail"</span><span class="token operator">:</span> <span class="token string">"mbsync work"</span><span class="token punctuation">,</span>
    <span class="token property">"onNewMailPost"</span><span class="token operator">:</span> <span class="token string">"mu index --lazy-check"</span><span class="token punctuation">,</span>
    <span class="token property">"boxes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"INBOX"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token property">"wait"</span><span class="token operator">:</span> <span class="token number">1</span>
<span class="token punctuation">}</span></code></pre>
<p>У цьому файлі ми вказуємо <code>goimapnotify</code> під’єднатися до робочої скриньки Gmail і чекати нових повідомлень. Щойно надходить новий лист, ми чекаємо <code>wait</code> 1 секунду, а потім запускаємо команду <code>onNewMail</code> — <code>mbsync work</code>. Вона звичайним чином завантажує нові повідомлення.</p>
<p>Після цього ми запускаємо команду <code>onNewMailPost</code>, щоб проіндексувати нові листи.</p>
<p>Якщо хочете зробити це безпечнішим, замість прямого зберігання пароля можна отримувати його за допомогою команди на кшталт <code>pass</code> або <code>op</code> (1Password CLI):</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
    <span class="token property">"host"</span><span class="token operator">:</span> <span class="token string">"imap.gmail.com"</span><span class="token punctuation">,</span>
    <span class="token property">"port"</span><span class="token operator">:</span> <span class="token number">993</span><span class="token punctuation">,</span>
    <span class="token property">"tls"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    <span class="token property">"username"</span><span class="token operator">:</span> "your.work.email@gmail.com`<span class="token punctuation">,</span>
    <span class="token property">"passwordCmd"</span><span class="token operator">:</span> <span class="token string">"pass email/work"</span><span class="token punctuation">,</span> <span class="token comment">// [!code focus]</span>
    <span class="token property">"onNewMail"</span><span class="token operator">:</span> <span class="token string">"mbsync work"</span><span class="token punctuation">,</span>
    <span class="token property">"onNewMailPost"</span><span class="token operator">:</span> <span class="token string">"mu index --lazy-check"</span><span class="token punctuation">,</span>
    <span class="token property">"boxes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"INBOX"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token property">"wait"</span><span class="token operator">:</span> <span class="token number">1</span>
<span class="token punctuation">}</span></code></pre>
<p>Замість пароля ми задаємо <code>passwordCmd</code>, щоб отримати пароль із <a href="https://www.passwordstore.org/">pass</a>. Те саме можна зробити з іменем користувача, замінивши <code>username</code> на <code>usernameCmd</code>, і навіть із сервером, замінивши <code>host</code> на <code>hostCmd</code>. Для найбільш параноїдальних.</p>
<h3>private.json</h3>
<p>Для Protonmail потрібно налаштувати <a href="https://proton.me/mail/bridge">Protonmail Bridge</a>, тож конфігурація виглядатиме так:</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
    <span class="token property">"host"</span><span class="token operator">:</span> <span class="token string">"127.0.0.1"</span><span class="token punctuation">,</span>
    <span class="token property">"port"</span><span class="token operator">:</span> <span class="token number">1143</span><span class="token punctuation">,</span>
    <span class="token property">"tls"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
    <span class="token property">"username"</span><span class="token operator">:</span> <span class="token string">"your.private.email@proton.me"</span><span class="token punctuation">,</span>
    <span class="token property">"passwordCmd"</span><span class="token operator">:</span> <span class="token string">"pass email/private"</span><span class="token punctuation">,</span>
    <span class="token property">"onNewMail"</span><span class="token operator">:</span> <span class="token string">"mbsync private"</span><span class="token punctuation">,</span>
    <span class="token property">"onNewMailPost"</span><span class="token operator">:</span> <span class="token string">"mu index --lazy-check"</span><span class="token punctuation">,</span>
    <span class="token property">"boxes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"INBOX"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token property">"wait"</span><span class="token operator">:</span> <span class="token number">10</span>
<span class="token punctuation">}</span></code></pre>
<p>Тепер усе готово до перевірки. Покладіть ці два файли конфігурації будь-де, наприклад у <code>~/.config/goimapnotify/</code>, і перевірте інтеграцію робочої пошти командою:</p>
<pre class="language-sh"><code class="language-sh">goimapnotify <span class="token parameter variable">-conf</span> ~/.config/goimapnotify/work.json <span class="token parameter variable">-debug</span></code></pre>
<p>Параметр <code>-debug</code> забезпечить достатньо повідомлень журналу, щоб зрозуміти, чи все працює.</p>
<p>Тепер достатньо надіслати листа на робочу адресу й стежити за журналом. Якщо все гаразд, після появи листа у скриньці Gmail ви отримаєте повідомлення в журналі, потім спрацюють <code>mbsync</code> і <code>mu</code>, а лист буде доступний у вашому улюбленому офлайн-поштовому клієнті.</p>
<h2>Запуск під час входу</h2>
<p>Якщо все працює, ви готові до останнього кроку — налаштувати запуск усього цього під час входу. У MacOS для цього потрібно використовувати <code>launchd</code>, а возитися з файлами plist — завжди морока. Якщо знадобиться налагодження, скористайтеся чимось зручним, наприклад <a href="https://soma-zone.com/LaunchControl/">LaunchControl</a>: я використовував безкоштовну версію. Є також дуже зручний онлайн-генератор plist <a href="https://launched.zerowidth.com/">launched.</a>. Я його не використовував, але він точно може стати у пригоді.</p>
<p>Для роботи створіть файл <code>com.example.workemail.plist</code> і покладіть його в <code>~/Library/LaunchAgents</code>:</p>
<pre class="language-xml"><code class="language-xml"><span class="token prolog">&lt;?xml version="1.0" encoding="UTF-8"?></span>
<span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">plist</span> <span class="token name">PUBLIC</span> <span class="token string">"-//Apple//DTD PLIST 1.0//EN"</span> <span class="token string">"http://www.apple.com/DTDs/PropertyList-1.0.dtd"</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>plist</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dict</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>Label<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>com.example.workemail.plist<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>ProgramArguments<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>array</span><span class="token punctuation">></span></span>
         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>/Users/USERNAME/go/bin/goimapnotify<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>-conf<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>/Users/USERNAME/.config/goimapnotify/work.json<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>array</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>KeepAlive<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>true</span><span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>RunAtLoad<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>true</span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>StandardErrorPath<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>/Users/USERNAME/Library/Logs/CheckMailBlaster.err<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>StandardOutPath<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>/Users/USERNAME/Library/Logs/CheckMailBlaster.log<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>EnvironmentVariables<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dict</span><span class="token punctuation">></span></span>
           <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key</span><span class="token punctuation">></span></span>PATH<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>key</span><span class="token punctuation">></span></span>
           <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">></span></span>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dict</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dict</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>plist</span><span class="token punctuation">></span></span></code></pre>
<p>Замініть <code>USERNAME</code> на своє ім’я користувача.</p>
<p>Найскладніше, на що пішла добра година налагодження, — зрозуміти, що запущеному процесу потрібно передати змінну <code>PATH</code>, оскільки він не має доступу до загальносистемної. Поки я цього не зробив, <code>goimapnotify</code> запускався і нормально під’єднувався, але щойно надходив новий лист, я отримував помилку на етапі <code>mbsync</code>.</p>
<p>Отже, як я вже сказав, на налагодження цього простого файлу пішло дві години, тож скажіть дякую і створіть подібний файл для особистої пошти, наприклад <code>com.example.privateemail.plist</code>, у тому самому каталозі.</p>
<p>Тепер залишилося лише запустити:</p>
<pre class="language-sh"><code class="language-sh">launchctl load ~/Library/LaunchAgents/com.example.workemail.plist
launchctl load ~/Library/LaunchAgents/com.example.privateemail.plist</code></pre>
<p>Переконайтеся, що вони працюють, за допомогою</p>
<pre class="language-sh"><code class="language-sh">launchctl list <span class="token operator">|</span> <span class="token function">grep</span> com.example</code></pre>
<p>Або, ще краще, скористайтеся <code>LaunchControl</code> для спостереження за їхнім станом. Якщо все вдалося, служби запускатимуться щойно ви ввійдете в систему, а пошта миттєво з’являтиметься у вашій скриньці.</p>
<p>Зауважте, що синхронізація почнеться лише з появою нового листа: якщо комп’ютер був вимкнений усю ніч і ви його вмикаєте, синхронізація не почнеться до першого нового листа того дня. Щоб цього уникнути, можна створити подібний plist, який запускається один раз і виконує</p>
<pre class="language-sh"><code class="language-sh">mbsync <span class="token parameter variable">-a</span></code></pre>
<p>Залишаю це як вправу для читача.</p>
]]></description>
        <category>TECH</category>
      </item>
    
      <item>
        <title>Ілон Маск і магія назв</title>
        <link>https://myke.blog/ua/posts/elon-musk-and-the-magic-of-names</link>
        <guid>https://myke.blog/ua/posts/elon-musk-and-the-magic-of-names</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Учора сталася дивна річ. Ви, мабуть, це бачили:</p>
<img src="/media/musks-tweet-2.png" alt="Твіт Ілона Маска про російське вторгнення в Україну">
<p>Я не збираюся зосереджуватися на всіх причинах, чому не варто було це публікувати. Гадаю, лайна на вентилятор накидають і без моїх п’яти копійок. У дусі цього блогу мене більше цікавлять питання, пов’язані з мисленням і знанням. І одне з них очевидне.</p>
<h1>Звідки ми знаємо, що справді знаємо те, що, як нам здається, ми знаємо?</h1>
<p>Ого, оце приголомшливий приклад вдало сформульованого питання.</p>
<p>Визнаю, я тут використовую Ілона Маска як кричущий приклад людини, яка публічно говорить про речі, в яких нічогісінько не тямить. Але всі ми часом цим грішимо. Навіть якщо не публічно.</p>
<p>Але продовжимо використовувати його як приклад. Під його думкою про Крим має бути якесь підґрунтя: зрештою, він упевнено заявляє, що:</p>
<blockquote>
<p>Крим формально є частиною Росії, як і був із 1783 року (до помилки Хрущова).</p>
</blockquote>
<p>І тут криється пастка, в яку потрапить більшість людей. Вони намагатимуться перевірити це твердження, читатимуть статтю у Вікіпедії про <a href="https://en.wikipedia.org/wiki/Crimea">Крим</a>, намагатимуться з’ясувати, чи справді він формально був частиною Росії. Читатимуть і сперечатимуться про те, як було завойовано Кримське ханство і чи хотів Крим бути частиною Росії.</p>
<p>І зовсім не помітять слона в кімнаті. «Росії», про яку він говорить, не існує. І не існує вже понад століття.</p>
<h2>Стривайте, що?</h2>
<p>Ця думка давно не давала мені спокою, можливо, років 10 чи навіть 20, і я ніяк не міг її точно сформулювати. Поки не зміг.</p>
<p>Для мене як українця це було начебто очевидним<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> на інтуїтивному рівні. Але до сьогодні я не бачив у цьому того, чим воно було, — найгеніальнішого витвору російської пропаганди.</p>
<h3>Уся справа в назві</h3>
<p>Давним-давно була країна під назвою «Росія». Ну, можливо, така країна й була, тепер уже важко сказати після стількох переписувань історії. Але точно була країна під назвою <a href="https://en.wikipedia.org/wiki/Russian_Empire"><em>Російська імперія</em></a>, і ми можемо точно сказати, коли вона з’явилася.</p>
<p>Сам термін і всю ідеологію придумав український<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup> вчений <a href="https://en.wikipedia.org/wiki/Theophan_Prokopovich">Феофан Прокопович</a>, дуже освічений чоловік без жодного морального компаса. Після того як Петро I спробував знищити <a href="https://en.wikipedia.org/wiki/National_University_of_Kyiv-Mohyla_Academy">Києво-Могилянську академію</a>, єдиний справжній університет у тогочасному регіоні, він призначив Феофана на якусь важливу посаду в Санкт-Петербурзі. Там той і придумав усю концепцію Російської <em>імперії</em>, дотримуючись доброї європейської традиції проголошувати себе <em>Третім Римом</em><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>.</p>
<p>Так чи інакше, у 1721 році він перейменував Московське царство на Російську <strong>імперію</strong>, і саме тоді ця країна офіційно виникла. А на Заході цю країну зазвичай називали <strong>Росією</strong>. Це важливо.</p>
<p>До Першої світової війни це була досить велика країна. Як і каже Ілон Маск, Крим формально входив до її складу. Як і інші гарні місця, наприклад Польща, Фінляндія та всі країни Балтії.</p>
<p>Аж доки вона не перестала існувати.</p>
<h3>«Велика Жовтнева революція»</h3>
<p>Треба розуміти, що я розповідаю все це якомога швидше, щоб ви не занудьгували. Ми вже майже дійшли.</p>
<p>У 1917 році, після низки революцій, спричинених жахливим рішенням взяти участь у Великій війні, нарешті, здавалося, визначився явний переможець революції — партія більшовиків, яка згодом стала комуністичною партією.</p>
<p>І вони не хотіли мати нічого спільного з колишнім імперським минулим. Вони перейменували країну на <a href="https://en.wikipedia.org/wiki/Soviet_Union"><em>Союз Радянських Соціалістичних Республік</em></a>, також відомий як <em>Радянський Союз</em>. І це була країна, в якій я народився.</p>
<p>Деяким пощастило відокремитися рано, коли ця державна потвора лише формувалася, — наприклад Фінляндії. Інші спробували, але не змогли, як-от Україна<sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup>.</p>
<p>Але навіть ті, кому це не вдалося, не були частиною Росії. Вони були частиною Радянського Союзу. Багатонаціонального. Багатокультурного. Вони називали себе «радянським народом». Не «росіянами».</p>
<p>СРСР був страшною країною зі страшною ідеологією, і нам усім пощастило, що він не пережив холодної війни. Але до останніх років у тієї країни були принципи. Я не згоден із її ідеологією, але вона в неї була. Я не згоден із майбутнім, яке вона хотіла побудувати для людства, але вона дивилася в <em>майбутнє</em>.</p>
<p>Та країна воювала у Другій світовій і ще купі інших воєн. Та країна була однією з держав-засновниць Організації Об’єднаних Націй і постійним членом Ради Безпеки ООН.</p>
<p>Аж доки не перестала існувати в 1991 році.</p>
<h3>Диявольська робота</h3>
<blockquote>
<p>Найхитріша витівка диявола — переконати людей, що його не існує.  -- Шарль Бодлер</p>
</blockquote>
<p>Сучасна Росія схожа на нього, але вона намагається переконати світ (і себе), що якимось дивом є тією самою країною, що й СРСР та Російська імперія. Уся ідея <em>рашизму</em> полягає в намаганні повернути минуле, а не побудувати світлішу версію майбутнього (навіть якщо вона й не всім іншим здавалася світлішою, як у випадку СРСР).</p>
<p>І це не перший випадок чогось подібного в диктатурі. Муссоліні звертався до італійців як до <em>римлян</em> і наполягав, що його Італія якимось дивом є тією самою країною, що й Римська імперія.</p>
<p>Тож казати, що Крим був частиною Росії і його слід залишити Росії, — це все одно що казати, ніби Греція була частиною Римської імперії і її слід залишити Італії.</p>
<p><strong>І єдина причина, чому це не звучить абсурдно, полягає в тому, що за радянських часів ми й далі називали цю країну «Росією».</strong></p>
<h2>Повертаючись до початкового питання</h2>
<p>То звідки ми знаємо, що справді знаємо те, що, як нам здається, ми знаємо? Боюся, це питання настільки велике, що в есе його не охопити. Але є кілька прийомів, які ми можемо використати:</p>
<h3>Шукайте альтернативні погляди й альтернативні джерела</h3>
<p>І під поглядом я маю на увазі не лише «думку», а й інші ракурси, з яких можна подивитися на предмет. Бо якщо тема бодай трохи суперечлива (а більшість цікавих тем саме такі) і ви скористалися лише одним джерелом, то ви за визначенням почули лише одну сторону історії.</p>
<h3>Ставте під сумнів основи</h3>
<p>Спробуйте поставити під сумнів найфундаментальніші складові питання. Як у випадку з твітом Маска: фундаментальним було не те, чи є Крим частиною Росії, а те, чи взагалі існує «Росія», про яку він говорить.</p>
<p>Сподіваюся, вам сподобалася ця подорож.</p>
<hr>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Якщо щось здається «очевидним», це вірна ознака того, що майже всі інші бачать це інакше <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Доля — стерво <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p>Почитайте про <em>translatio imperii</em>, але почитайте щось хороше <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p>Почитайте про <em>Українську Народну Республіку</em> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></description>
        <category>GENERAL</category>
      </item>
    
      <item>
        <title>Навіщо писати?</title>
        <link>https://myke.blog/ua/posts/why-write</link>
        <guid>https://myke.blog/ua/posts/why-write</guid>
        <pubDate>Tue, 03 Nov 2026 21:02:21 GMT</pubDate>
        <description><![CDATA[<p>Письмо — це інструмент. І, як будь-який добрий інструмент, його можна використовувати для багатьох речей. Ділитися інформацією. Розповідати історії. Передавати повідомлення. Впливати на людей, щоб вони зробили потрібний вам вибір. Усі ці способи використання давно були мені зрозумілі й цілком очевидні.</p>
<p>Але був іще один особливий спосіб, про який я довго розмірковував.</p>
<h1>Письмо допомагає думати.</h1>
<p>Кілька днів тому я летів із Лісабона до Кракова — це була перша частина моєї подорожі додому, в Україну (чому я туди їду під час війни — окрема історія).</p>
<p>Просто перед злетом я натрапив на есе <a href="http://paulgraham.com">Пола Ґрема</a>, яке за іронією долі називається <a href="http://www.paulgraham.com/essay.html"><em>Епоха есе</em></a>. Як часто буває з блискучими людьми, він точно висловив те, що я давно відчував.</p>
<p>Раджу прочитати його оригінальний текст: він чудово описав історію та сутність написання есе. Але я наведу одну цитату:</p>
<blockquote>
<p>У справжньому есе ви пишете для себе. Ви думаєте вголос.</p>
</blockquote>
<blockquote>
<p>Але не зовсім. Так само як запрошення гостей змушує вас прибрати у квартирі, написання тексту, який читатимуть інші, змушує вас добре обмірковувати свої думки.</p>
</blockquote>
<p>І це справді знайшло в мені відгук. Я давно знав, що письмо допомагає мені думати. Навіть іноді жартував, що треба сісти й написати про щось, аби дізнатися, що ти про це насправді думаєш.</p>
<p>Але прочитавши Ґрема, я побачив дві зміни:</p>
<ol>
<li>Такий спосіб писати тепер мав назву. Есе.</li>
<li>Я отримав вагому причину публікувати написане.</li>
</ol>
<p>І ось ви тут. Читаєте.</p>
<p>Дякую, що дали мені причину розібрати свій безлад!</p>
]]></description>
        <category>GENERAL</category>
      </item>
    
  </channel>
</rss>
