{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "M9K blog",
    "_rss_description": "Заметки обо всём: devops, lifestyle, культура.",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.m9k.space\/",
    "feed_url": "https:\/\/blog.m9k.space\/json\/",
    "icon": "https:\/\/blog.m9k.space\/pictures\/userpic\/userpic@2x.jpg?1769095194",
    "authors": [
        {
            "name": "M",
            "url": "https:\/\/blog.m9k.space\/",
            "avatar": "https:\/\/blog.m9k.space\/pictures\/userpic\/userpic@2x.jpg?1769095194"
        }
    ],
    "items": [
        {
            "id": "258",
            "url": "https:\/\/blog.m9k.space\/all\/stan\/",
            "title": "Стан",
            "content_html": "<p>Шёл сегодня к станции, никого не трогал, думал о чём-то своём, продумывал лирику для Suno. Даже при использовании LLM  без вычитки человеком — никуда. Заклинило на сербском <i>стан<\/i> — квартира.<\/p>\n<p>В русском тоже есть стан. Военный стан, казачий стан, стан разбойников. А ещё Казахстан, Узбекистан, Афганистан и целая география прочих «-станов».<\/p>\n<p>Неужели всё это как-то связано или просто созвучие?<\/p>\n<p>Быстрогуглинг показал: да, связано. Причём настолько давно, что тогда ещё ни сербов, ни русских, ни персов в привычном нам понимании не существовало.<\/p>\n<p>У всей этой истории общий праиндоевропейский корень <i>*steh₂-<\/i> — «стоять».<\/p>\n<p>От него славянский «стан» — место, где остановились, расположились, обосновались. У сербов это постепенно превратилось в квартиру. У персов <i>-stān<\/i> стало обозначать место, область, страну. А потом этот суффикс разошёлся по географическим названиям, в том числе тюркским.<\/p>\n<p>Английское <i>stand<\/i>, немецкое <i>stehen<\/i>, латинское <i>stāre<\/i> — всё оттуда же.<\/p>\n<p>У серба стан — квартира, у перса — целая страна, у русского — место, где расположились лагерем. Масштабы разные, а смысл примерно один: пришёл, остановился, обосновался. Одна простая мысль — прошла разными дорогами сквозь тысячу лет.<\/p>\n<p>И ведь никто ни с кем не договаривался. Просто языки разошлись каждый своей дорогой, а древний корень остался.<\/p>\n<p>Пока всё это выяснял, дошел до перрона. Который на <i>станции<\/i>. А «станция» пришла к нам через латинское <i>statio<\/i>, тоже от того самого корня.<\/p>\n",
            "summary": "Шёл сегодня к станции, никого не трогал, думал о чём-то своём, продумывал лирику для Suno. Даже при использовании LLM без вычитки человеком — никуда...",
            "date_published": "2026-10-17T14:03:00+07:00",
            "date_modified": "2026-10-17T14:03:44+07:00",
            "tags": [
                "лингвистика",
                "наблюдения"
            ],
            "_date_published_rfc2822": "Sat, 17 Oct 2026 14:03:00 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "258",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "257",
            "url": "https:\/\/blog.m9k.space\/all\/fogwalk-2\/",
            "title": "Fogwalk",
            "content_html": "<p>Никогда не понимал концепции Threads — метовского ответа масковскому Твиттеру. В условиях <i>RU-сегмента<\/i> это выглядит как поле для диссов из эпохи «расцвета русского рэпа»: кто больше и громче накинет с лопаты, тот и соберёт аудиторию. <i>По крайней мере<\/i>, в том алгоритмическом пузыре, который подсовывает мне смежный IG.<\/p>\n<p>Но сегодня случилось чудо — в рекомендации завезли годноту. Собственно, <a href=\"https:\/\/bigdevwhale.github.io\/stillcraft\/apps\/fogwalk\/\">сабж<\/a> — Fogwalk.<\/p>\n<p>Концепт простой: взять идею дополненной реальности Pokémon GO, выпилить покемонов, прикрутить механику «тумана войны» из RPG\/стратегий середины 2000-х (здравствуй, Oblivion, привет HoMM 3), упаковать всё это в приложение на базе OSM и добавить геймификацию прогулок.<\/p>\n<p>Сверху накидывается философская мысль о том, в каком микроскопическом пространстве мы живём в повседневности, хотя мир вокруг огромен. Carpe diem, фигли.<\/p>\n<p>Судя по репе разработчика, fullstack web developer + LLM запилили годноту. Прошёлся по окрестной срани, чутка докинулся дофамином.<\/p>\n",
            "summary": "Никогда не понимал концепции Threads — метовского ответа масковскому Твиттеру. В условиях RU-сегмента это выглядит как поле для диссов из эпохи «расцвета русского рэпа»",
            "date_published": "2026-10-15T13:35:38+07:00",
            "date_modified": "2026-10-15T13:36:01+07:00",
            "tags": [
                "Fogwalk",
                "игры"
            ],
            "_date_published_rfc2822": "Thu, 15 Oct 2026 13:35:38 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "257",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "255",
            "url": "https:\/\/blog.m9k.space\/all\/suno-dva-vystrela-v-saraevo\/",
            "title": "Suno. «Два выстрела в Сараево».",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Saraevo-nakanune-buri.jpg\" width=\"1000\" height=\"1000\" alt=\"\" \/>\n<\/div>\n<p>Подписан на <a href=\"https:\/\/t.me\/stalagnull\">канал <\/a> историка Софии Широгоровой  и периодически залипаю на посты.  Пусть местами оптика рассмотрения вопросов вызывает скепсис — обзоры тематической литературы вызывают интерес. Да и стиль изложения — для публичного истпопа, да в публичном поле, да на темы, которые по <i>понятным<\/i> причинам в RU-сегменте сети вызывают брожение говн — забейте интереса ради сочетание фамилии и ЖЖ (<s>бггг,оно ещё живое<\/s>) в поисковик  — просто приятен и как минимум вызывает доверие источниками.<\/p>\n<p>Забавным экспериментом скинул один из постов в LLM и получил вполне себе лирику Sabaton — style, которую и не грех закинуть в Suno.<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"235\" href=\"https:\/\/blog.m9k.space\/audio\/Dva-vystrela-v-Saraevo.mp3\">Dva-vystrela-v-Saraevo.mp3<\/a><\/div>\n<\/div>\n<p>Лирика:<\/p>\n<blockquote>\n<p>Июнь. Сараево. Жара.<br \/>\nИмперия ещё жива.<br \/>\nИ не подозревает свет,<br \/>\nЧто прежней жизни больше нет.<\/p>\n<p>Шесть заговорщиков у моста,<br \/>\nА смелость кончилась с утра.<br \/>\nОдин застыл, другой дрожал,<br \/>\nА третий бросил — не попал.<\/p>\n<p>И яд не яд, и речка мелка́,<br \/>\nСмерть отказа́ла — вот дела́!<br \/>\nЭрцге́рцог е́дет на приём,<br \/>\nА мы с тобою кофе пьём.<\/p>\n<p>Гаврило, мальчик, девятнадцать,<br \/>\nТы так мечтал героем стать.<br \/>\nНо так легко в чужую вечность<br \/>\nДва пистолетных выстрела послать.<\/p>\n<p>Два выстрела в Сараево —<br \/>\nИ целый век пошёл ко дну.<br \/>\nХотели выстрелить в империю,<br \/>\nА разбудили мировую войну.<\/p>\n<p>Два выстрела — две жизни,<br \/>\nА следом миллионы могил.<br \/>\nХотели трон имперский смять,<br \/>\nА миру выпало сгорать.<\/p>\n<p>Гаврило пьёт остывший кофе,<br \/>\nПровален план, окончен день.<br \/>\nА рядом кортеж на повороте<br \/>\nВдруг замирает, словно тень.<\/p>\n<p>Неверный поворот — мгновенье,<br \/>\nВодитель пятится назад.<br \/>\nИ вот уже одно решенье<br \/>\nИ мир шагает прямо в ад.<\/p>\n<p>Он вышел. Выстрел. Тишина.<br \/>\nСофия падает без слов.<br \/>\nИ начинается война —<br \/>\nПока лишь в головах послов.<\/p>\n<p>Два выстрела в Сараево —<br \/>\nИ целый век пошёл ко дну.<br \/>\nХотели выстрелить в империю,<br \/>\nА разбудили мировую войну.<\/p>\n<p>Два выстрела — две жизни,<br \/>\nА следом миллионы могил.<br \/>\nХотели трон имперский смять,<br \/>\nА миру выпало сгорать.<\/p>\n<p>А дальше — ноты, ультиматум,<br \/>\nИ август в траурном дыму.<br \/>\nВчера мальчишки шли к экзаменам,<br \/>\nСегодня — в землю и во тьму.<\/p>\n<p>Гаврило гаснет за решёткой,<br \/>\nЕвропа гибнет на полях.<br \/>\nИ кто-то с картой и указкой<br \/>\nРисует стрелки на костях.<\/p>\n<p>Ни честь держав, ни злая месть<br \/>\nНе стоят жизни тех, кто есть.<br \/>\nВедь каждый павший на войне<br \/>\nБыл целым миром на земле.<\/p>\n<p>Два выстрела в Сараево —<br \/>\nИ целый век пошёл ко дну.<br \/>\nХотели выстрелить в империю,<br \/>\nА разбудили мировую войну.<\/p>\n<p>Два выстрела. Две жизни.<br \/>\nМиллионы сломанных судеб.<br \/>\nИ снова кто-то обещает:<br \/>\nПоследней эта бойня станет.<\/p>\n<p>Июнь. Сараево. Жара.<br \/>\nОстывший кофе. Тишина.<br \/>\nВсего два выстрела с утра —<br \/>\nИ мир сгорит дотла.<\/p>\n<\/blockquote>\n",
            "summary": "Подписан на канал историка Софии Широгоровой и периодически залипаю на посты. Пусть местами оптика рассмотрения вопросов вызывает скепсис — обзоры тематической литературы вызывают интерес",
            "date_published": "2026-10-14T23:36:11+07:00",
            "date_modified": "2026-10-14T22:47:23+07:00",
            "tags": [
                "Suno",
                "музыка",
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/Saraevo-nakanune-buri.jpg",
            "_date_published_rfc2822": "Wed, 14 Oct 2026 23:36:11 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "255",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/Saraevo-nakanune-buri.jpg"
                ]
            }
        },
        {
            "id": "256",
            "url": "https:\/\/blog.m9k.space\/all\/vecherniy-selfhosted-2-5d-parallaks-v-brauzere\/",
            "title": "Вечерний selfhosted. 2.5D — параллакс в браузере.",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/izobrazhenie-2.png\" width=\"655\" height=\"931\" alt=\"\" \/>\n<\/div>\n<p>Владение несколькими IG-аккаунтами, из которых только один реально активный-активный, позволяет выйти из информационного алгоритмического пузыря. Наткнулся на <a href=\"https:\/\/bio.fojcikdominik.com\">Web-дизайнера<\/a>, делающего прикольные сайты — визитки. С точки зрения прикладного использования <s>человека, познавшего grep и cat<\/s>, это понятное дело, специфический изюм — сайт должен быть про быстроту поиска информации — в этом отношение условный tsukumo, вывалившийся прямиком из нулевых отправит в ноудаун все нынешние модные-и-красивые дизайнерские сайты, но иногда можно поиграться и в красивости.<\/p>\n<p>Внимание привлёк <a href=\"https:\/\/lab.revelium.studio\/milkmaid\">Milkmaid<\/a><br \/>\nЦитирую:<\/p>\n<p class=\"loud\">Эффект строится из фотографии и карты глубины — изображения в оттенках серого, где яркость задаёт условное расстояние до камеры. Для новых фотографий карту оценивает нейросеть по одному кадру.<\/p>\n<p class=\"loud\">Фотография преобразуется в облако цветных точек. Каждая точка получает цвет исходного пикселя, положение по горизонтали и вертикали и смещение в глубину. При необходимости создаются дополнительные слои с небольшим отступом. Они добавляют плотность облаку, но не восстанавливают скрытые части объектов.<\/p>\n<p class=\"loud\">При повороте сцены ближние и дальние точки смещаются на экране по-разному. Этот параллакс создаёт ощущение объёма. У краёв изображения прозрачность точек постепенно уменьшается, поэтому фотография мягко растворяется в фоне.<\/p>\n<p class=\"loud\">Движение рассчитывается как система частиц: у каждой точки есть исходное положение и скорость. Виртуальная пружина возвращает её на место, затухание гасит колебания, а вихревое поле и воздействие курсора отклоняют от исходной позиции. Кнопка сборки убирает рассеивание, после чего облако восстанавливает изображение.<\/p>\n<p class=\"loud\">Python заранее готовит фотографию и карту глубины. Отрисовка и движение частиц выполняются на видеочипе устройства через WebGL 2. Получается интерактивная 2.5D-сцена: небольшой поворот выглядит объёмно, но посмотреть за предметы или увидеть их обратную сторону нельзя.<\/p>\n<p><a href=\"https:\/\/particle.m9k.space\/\">Selfhost demo в стилистике<\/a><\/p>\n",
            "summary": "Владение несколькими IG-аккаунтами, из которых только один реально активный-активный, позволяет выйти из информационного алгоритмического пузыря",
            "date_published": "2026-10-14T23:27:01+07:00",
            "date_modified": "2026-10-14T23:27:17+07:00",
            "tags": [
                "llm",
                "selfhosted",
                "нейрогенерация",
                "системное администрирование"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/izobrazhenie-2.png",
            "_date_published_rfc2822": "Wed, 14 Oct 2026 23:27:01 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "256",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/izobrazhenie-2.png"
                ]
            }
        },
        {
            "id": "254",
            "url": "https:\/\/blog.m9k.space\/all\/vechernyaya-neyrogeneraciya\/",
            "title": "Вечерняя нейрогенерация",
            "content_html": "<p>После очередного грустного рабочего понедельника (как ноне говорят в мемчиках, «батрачка»), между обработкой давно просроченных фотосетов с воркшопов, залип на генератор изображений ChatGPT. На старте пользования я его избегал, ибо работал он не слишком быстро — и картинки генерил не самые интересные. Но — в мире моделей T2I всё меняется очень быстро. Плюс, сам процесс — это возможность хоть немного приблизиться к тому чувству, которые ощущают <i>действительно<\/i> творческие люди — это какой-никакой, но путь к дофамину, эндорфину и прочей сложной химии мозга.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1453\" data-ratio=\"0.80055096418733\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Glamurnaya-diva-na-stancii-metro.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Glamurnaya-puteshestvennica-v-aeroportu_1.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Goticheskiy-vampirskiy-portret-pri-svechah_1.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zhemchuzhnaya-muza-nad-Nyu-Yorkom_1.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zabroshennoe-koleso-obozreniya-v-snezhnoy-mozaike.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zabroshenny-gorod-v-zimnem-tumane.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zabroshenny-gorod-pod-dozhdyom.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zabroshenny-karyer-na-rassvete.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zerkalny-sad-v-osennih-sumerkah.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Zimniy-Belgrad-v-snezhnom-fonare.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Izobrazhenie-ChatGPT-12-okt.-2026-g.,-22_25_47.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Mayak-nad-biryuzovym-morem.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Modny-obraz-na-platforme-Seula.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Neonovaya-geroinya-pod-golograficheskim-ekranom_1.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Neonovaya-koroleva-nuara_1.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Odinokiy-put-skvoz-zatoplenny-gorod.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Serbskiy-poezd-na-zakate-v-gorah.jpg\" width=\"1453\" height=\"1815\" alt=\"\" \/>\n<\/div>\n<\/div>\n",
            "summary": "После очередного грустного рабочего понедельника (как ноне говорят в мемчиках, «батрачка»), между обработкой давно просроченных фотосетов с воркшопов, залип на генератор изображений ChatGPT",
            "date_published": "2026-10-12T22:51:39+07:00",
            "date_modified": "2026-10-12T22:51:36+07:00",
            "tags": [
                "ChatGPT",
                "llm",
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/Glamurnaya-diva-na-stancii-metro.jpg",
            "_date_published_rfc2822": "Mon, 12 Oct 2026 22:51:39 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "254",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/Glamurnaya-diva-na-stancii-metro.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Glamurnaya-puteshestvennica-v-aeroportu_1.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Goticheskiy-vampirskiy-portret-pri-svechah_1.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zhemchuzhnaya-muza-nad-Nyu-Yorkom_1.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zabroshennoe-koleso-obozreniya-v-snezhnoy-mozaike.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zabroshenny-gorod-v-zimnem-tumane.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zabroshenny-gorod-pod-dozhdyom.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zabroshenny-karyer-na-rassvete.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zerkalny-sad-v-osennih-sumerkah.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Zimniy-Belgrad-v-snezhnom-fonare.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Izobrazhenie-ChatGPT-12-okt.-2026-g.,-22_25_47.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Mayak-nad-biryuzovym-morem.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Modny-obraz-na-platforme-Seula.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Neonovaya-geroinya-pod-golograficheskim-ekranom_1.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Neonovaya-koroleva-nuara_1.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Odinokiy-put-skvoz-zatoplenny-gorod.jpg",
                    "https:\/\/blog.m9k.space\/pictures\/Serbskiy-poezd-na-zakate-v-gorah.jpg"
                ]
            }
        },
        {
            "id": "253",
            "url": "https:\/\/blog.m9k.space\/all\/suno-mirna-no\/",
            "title": "Suno. «Мирна ноћ».",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Lunny-park-u-panelnogo-doma.jpg\" width=\"1254\" height=\"1254\" alt=\"\" \/>\n<\/div>\n<p>И ещё один нейроэксперимент, на этот раз с перекрёстной валидацией текста LLM — ибо проверить корректность текста по причинам незнания целевого языка я не могу. Вероятно (~99.9%) для носителя языка будет звучать неестественно ( с учётом того, что Suno может пропеть <i>практически всё<\/i>, не взирая на ударения), но с музыкальной точки зрения звучит приятно, и даже с нотками оригинала (который, опять же, использовать в насквозь коммерческом продукте) — нельзя. Обложка трека — интерпретация реальной <a href=\"https:\/\/lychee.m9k.space\/gallery\/7lZeqwAYFEG13NwX2kiONcVn\/8lktNBDxb5PTrZ7HmjGjl8Pm?page=1\">фотографии <\/a> by me.<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"231\" href=\"https:\/\/blog.m9k.space\/audio\/Mirna-no.mp3\">Mirna-no.mp3<\/a><\/div>\n<\/div>\n<blockquote>\n<p>Кро́вови дрхте под те́ретом да́на,<br \/>\nНе́бески па́стир о́блаке на́паса.<br \/>\nГрад за́сипа ноћ са́чмом све́тала,<br \/>\nАл’ ноћ је ја́ча — све јој при́пада.<\/p>\n<p>О́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<br \/>\nО́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<\/p>\n<p>Че́кала сам то вре́ме, и вре́ме је сти́гло,<br \/>\nО́ни што су ћу́тали, сад ди́жу глас.<br \/>\nКо не́ма шта да че́ка, се́да у се́дло,<br \/>\nНи́ко их не мо́же сти́ћи, не мо́же сти́ћи.<\/p>\n<p>А о́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<br \/>\nО́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<\/p>\n<p>Ко́мшије до́лазе — чу́ју то́пот ко́пита,<br \/>\nНе да им да за́спе, ре́мети им сан.<br \/>\nКо не́ма шта да че́ка, кре́ће на пут,<br \/>\nО́ни што су спа́сени — о́ни што су спа́сени.<\/p>\n<p>А о́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<br \/>\nО́нима што ле́жу — спо́којан сан,<br \/>\nМи́рна ноћ.<\/p>\n<\/blockquote>\n",
            "summary": "И ещё один нейроэксперимент, на этот раз с перекрёстной валидацией текста LLM — ибо проверить корректность текста по причинам незнания целевого языка я не могу",
            "date_published": "2026-10-11T23:54:13+07:00",
            "date_modified": "2026-10-11T23:59:21+07:00",
            "tags": [
                "Suno",
                "кино",
                "Мирна ноћ",
                "музыка",
                "нейрогенерация",
                "сербский",
                "Спокойная ночь",
                "Цой"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/Lunny-park-u-panelnogo-doma.jpg",
            "_date_published_rfc2822": "Sun, 11 Oct 2026 23:54:13 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "253",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/Lunny-park-u-panelnogo-doma.jpg"
                ]
            }
        },
        {
            "id": "252",
            "url": "https:\/\/blog.m9k.space\/all\/suno-belgrad-pyat-dvadcat-chetyre\/",
            "title": "Suno. «Белград, 05:24».",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/Tumanny-rassvet-nad-starym-gorodom.jpg\" width=\"1024\" height=\"1024\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"368\" href=\"https:\/\/blog.m9k.space\/audio\/Belgrad,-05_24.mp3\">Belgrad,-05_24.mp3<\/a><\/div>\n<\/div>\n<p>В мае 2024 года я впервые оказался в Белграде. Ранний прилёт, рассвет над крылом самолёта, почти пустые улицы, троллейбусные провода и архитектура, в которой смешались несколько эпох. Первое впечатление оказалось странным: город совершенно незнакомый, но при этом подозрительно узнаваемый. Кириллица, обшарпанные фасады, роскошная лепнина, кондиционеры на балконах, граффити и афиши русскоязычных музыкантов.<\/p>\n<p>В тот раз я поселился на Светогорска и буквально сразу после заселения отправился изучать город. Прогулка по центру довольно быстро привела меня к разрушенному зданию Генштаба. В результате осталось несколько десятков фотографий и немало впечатлений.<\/p>\n<p><a href=\"https:\/\/blog.m9k.space\/all\/suno-ne-po-propiske\/\">Предыдущий<\/a> трек о Белграде были LLM-переработкой моих же собственных дневниковых текстов. Здесь же цепочка другая: <b>Image → Text → Sound<\/b>. После небольшой корректуры получился <b>«Белград, 05:24»<\/b>  — холодный, немного ироничный рассказ о городе, в котором знакомые буквы складываются в чужие слова.<\/p>\n<p>Воистину странное время: умный и хитрый статанализатор научился вполне убедительно выражать эмоции.<\/p>\n<p>Контекст метафор:<\/p>\n<p>05:24 — время первого снимка, скормленного LLM. Никакой нумерологии, просто удачно получилось.<\/p>\n<p>Светогорска и семь названий. Одна из исходных фотографий — табличка с историческими именами улицы. Два белых голубя, Светогорская, Битольская, Жоржа Клемансо, снова Светогорская, Лоле Рибара и опять Светогорская. Семь периодов, несколько политических эпох и одна улица, которая никуда не делась.<\/p>\n<p>Генштаб. Комплекс зданий Генерального штаба Югославии пострадал во время бомбардировок НАТО в 1999 году. Я фотографировал его утром 8 мая 2024-го, спустя ровно четверть века после одного из ударов по комплексу. Совпадение дат обнаружил анализ LLM<\/p>\n<p>«МЫ ЕСТЬ!» — не абстрактный экзистенциальный лозунг, а реальная афиша концертного фильма Ромы Либерова, попавшая в кадр. Среди участников — Noize MC.<\/p>\n<p>Лирика:<\/p>\n<blockquote>\n<p>Восьмое мая.<br \/>\nПять двадцать четыре.<br \/>\nДоброе утро, Белград.<\/p>\n<p>Рассвет разливается тонкой полоской,<br \/>\nКрыло самолёта разрезало тьму.<br \/>\nИ город встречает улыбкой неброской,<br \/>\nКак будто давно я знакома ему.<\/p>\n<p>Здесь утро встречает клубками проводов,<br \/>\nБалконами, пылью, рекламой аптек.<br \/>\nИ город, похоже, к приезду готов:<br \/>\nОн видел таких уже тысячу лет.<\/p>\n<p>Кириллица смотрит со старых домов,<br \/>\nЗнакомые буквы — чужие названья.<br \/>\nИ город из сотни забытых миров<br \/>\nМне выдал прописку без права свиданья.<\/p>\n<p>А улицы помнят чужие порядки,<br \/>\nИ время застряло в бетонных стенах.<br \/>\nЗдесь прошлое вечно играет в прятки,<br \/>\nНо прячется плохо в соседних дворах.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nРассвет на чужой стороне.<br \/>\nЯ снова одна в этом мире,<br \/>\nКоторый знаком почему-то мне.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nИ май отражается в стекле.<br \/>\nМы прежде друг друга не знали,<br \/>\nНо виделись будто во сне.<\/p>\n<p>Здесь улица семь раз меняла названье,<br \/>\nДва белых голубя, Лоле Рибар.<br \/>\nУ каждого века своё оправданье,<br \/>\nУ каждого времени — новый кошмар.<\/p>\n<p>На старом подъезде фамилии в ряд,<br \/>\nЗдесь русский и сербский почти побратимы.<br \/>\nЗнакомые буквы со мной говорят,<br \/>\nНо мы друг для друга непереводимы.<\/p>\n<p>Роскошная лепни́на, ржавый балкон,<br \/>\nИ плющ забирается выше антенны.<br \/>\nИстория пишет очередной закон,<br \/>\nА стены не ждут никакой перемены.<\/p>\n<p>И если мне скажут: «Начни всё сначала»,<br \/>\nЯ спрошу у таблички на старой стене:<br \/>\n«Скажите, вам легче от новых названий?»<br \/>\nОна промолчит, как положено ей.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nРассвет на чужой стороне.<br \/>\nЯ снова одна в этом мире,<br \/>\nКоторый знаком почему-то мне.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nИ май отражается в стекле.<br \/>\nМы прежде друг друга не знали,<br \/>\nНо виделись будто во сне.<\/p>\n<p>Восьмое мая. Утро серого цвета,<br \/>\nРазбитый Генштаб неподвижно стоит.<br \/>\nДвадцать пять лет. Не случилось ответа,<br \/>\nА город молчит — но бетон говорит.<\/p>\n<p>На стенах — «МЫ ЕСТЬ!», чуть подальше — ругательства,<br \/>\nА рядом афиши, футбол и металл.<br \/>\nЗдесь каждое новое доказательство,<br \/>\nЧто мир до конца ничего не понял —<br \/>\nИ не узнал.<\/p>\n<p>На башнях бетонных кондиционеры,<br \/>\nМашины, деревья, обычная жизнь.<br \/>\nИ все революции, лозунги, меры<br \/>\nСмешались в короткое слово «держись».<\/p>\n<p>Здесь не обещают счастливого завтра,<br \/>\nНе просят забыть и не учат прощать.<br \/>\nИ город, уставший от собственной правды,<br \/>\nНе просит остаться, не велит уезжать.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nРассвет на чужой стороне.<br \/>\nЯ больше не гостья в этом мире —<br \/>\nОн странно похож на меня во сне.<\/p>\n<p>Белград, пять двадцать четыре,<br \/>\nМой рейс растворился во мгле.<br \/>\nМы столько всего пережили,<br \/>\nЧтоб просто остаться на этой земле.<\/p>\n<p>Восьмое мая.<br \/>\nПять двадцать четыре.<br \/>\nЗнакомые буквы.<br \/>\nЧужие слова.<\/p>\n<p>Мы есть.<\/p>\n<\/blockquote>\n",
            "summary": "В мае 2024 года я впервые оказался в Белграде. Ранний прилёт, рассвет над крылом самолёта, почти пустые улицы, троллейбусные провода и архитектура, в которой смешались несколько эпох",
            "date_published": "2026-10-11T23:08:09+07:00",
            "date_modified": "2026-10-12T07:01:41+07:00",
            "tags": [
                "Suno",
                "Белград",
                "Београд",
                "музыка",
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/Tumanny-rassvet-nad-starym-gorodom.jpg",
            "_date_published_rfc2822": "Sun, 11 Oct 2026 23:08:09 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "252",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/Tumanny-rassvet-nad-starym-gorodom.jpg"
                ]
            }
        },
        {
            "id": "251",
            "url": "https:\/\/blog.m9k.space\/all\/monitoring-relizov-github\/",
            "title": "Мониторинг релизов GitHub",
            "content_html": "<p>Очередной небольшой эксперимент с вайбкодингом — Bash-скрипт для отслеживания новых релизов в GitHub-репозиториях.<\/p>\n<p>Раз в сутки проверяет заданный список проектов через GitHub API и отправляет уведомления в Telegram: версия, ссылка и краткий список изменений.<\/p>\n<p>Поддерживает SOCKS5-прокси, хранит историю обработанных релизов, умеет работать в режиме dry-run. Конфигурация — JSON и .env. Зависимости — Bash, curl и jq.<\/p>\n<p>Сейчас используется для мониторинга Lychee, Firefly III и Memos.<\/p>\n<p>Никаких постоянно работающих сервисов: обычный скрипт, запускаемый через cron.<\/p>\n<p><a href=\"https:\/\/egit.m9k.space\/m9k\/github-release-monitor\">Репа<\/a><\/p>\n",
            "summary": "Очередной небольшой эксперимент с вайбкодингом — Bash-скрипт для отслеживания новых релизов в GitHub-репозиториях...",
            "date_published": "2026-10-11T21:58:38+07:00",
            "date_modified": "2026-10-11T21:58:35+07:00",
            "tags": [
                "github",
                "linux",
                "opensource",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Sun, 11 Oct 2026 21:58:38 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "251",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "250",
            "url": "https:\/\/blog.m9k.space\/all\/migraciya-lychee-6-7-v-docker-lxc\/",
            "title": "Миграция Lychee 6 -> 7 в Docker (LXC)",
            "content_html": "<p>Развлекался намедни обновлением Lychee с миграцией с базового LXC-контейнера Debian 12 -> Debian 13<br \/>\nИсходно: <b>Lychee 6.10.3<\/b> в Debian 12 LXC. База — MariaDB 10.<br \/>\nДанные приложения находились в:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/lychee\/conf\n\/lychee\/uploads\n\/lychee\/sym\n\/lychee\/pictures\n\/lychee\/db<\/code><\/pre><p>Цель: обновить приложение и MariaDB  10->11<br \/>\nВ Lychee 7 изменилась структура каталогов внутри контейнера (см. <a href=\"https:\/\/lycheeorg.dev\/docs\/administration\/upgrade\/\">Update Guide<\/a>))<\/p>\n<p>Новая схема:<\/p>\n<pre class=\"e2-text-code\"><code class=\"yaml\">volumes:\n  - .\/lychee\/uploads:\/app\/public\/uploads\n  - .\/lychee\/logs:\/app\/storage\/logs\n  - .\/lychee\/tmp:\/app\/storage\/tmp\n  - .\/lychee\/storage\/app:\/app\/storage\/app<\/code><\/pre><p>База смонтирована в локальную директорию, но т. к. хочу поднять версию базы, делаем миграцию через дамп.<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">docker exec lychee_db \\\n  mysqldump \\\n  -u root \\\n  -p&#039;PASSWORD&#039; \\\n  --single-transaction \\\n  lychee &gt; \/lychee\/lychee.sql<\/code><\/pre><p>Переносим всё другой сервер, восстанавливаем.<\/p>\n<h2>APP_KEY<\/h2>\n<p>В Lychee 7 обязателен `APP_KEY`. Без него контейнер завершается с ошибкой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ERROR: APP_KEY is not set<\/code><\/pre><p>Ключ можно сгенерировать:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">echo &quot;base64:$(openssl rand -base64 32)&quot;<\/code><\/pre><p>и передать контейнеру:<\/p>\n<pre class=\"e2-text-code\"><code class=\"yaml\">environment:\n  APP_KEY: &quot;base64:...&quot;<\/code><\/pre><h2>Восстановление базы<\/h2>\n<pre class=\"e2-text-code\"><code class=\"bash\">docker compose up -d lychee_db<\/code><\/pre><p>Восстанавливаем дамм.<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">docker exec -i lychee_db \\\n  mariadb \\\n  -u root \\\n  -p&#039;PASSWORD&#039; \\\n  lychee &lt;lychee.sql<\/code><\/pre><p>В MariaDB 11 используется клиент `mariadb`, а не старое имя `mysql`.<\/p>\n<h2>Пересчёт статистики<\/h2>\n<p>После успешного запуска Lychee 7 стоит пересчитать размеры альбомов и thumbnails<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">docker exec -it lychee php artisan lychee:recompute-album-sizes<\/code><\/pre><p>и статистику альбомов:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">docker exec -it lychee php artisan lychee:recompute-album-stats<\/code><\/pre><h2>Reverse proxy<\/h2>\n<p>После миграции при работе через Nginx возникала плавающая 502, причём выглядела она интересно — на одном и том же ПК веб-морда могла открывать в одном браузере, и не открывать в другом. В логах:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">upstream sent too big header while reading response header from upstream<\/code><\/pre><p>Проблема решилась увеличением proxy buffers:<\/p>\n<!-- Lychee Photo Album Embed v1.0.0 --><link rel=\"stylesheet\" href=\"https:\/\/lychee.m9k.space\/embed\/lychee-embed.css?v=1.0.0\">\n<script src=\"https:\/\/lychee.m9k.space\/embed\/lychee-embed.js?v=1.0.0\"><\/script>\n\n<div\n    data-lychee-embed\n    data-api-url=\"https:\/\/lychee.m9k.space\"\n    data-mode=\"album\"\n    data-album-id=\"Nym-osIiRs6lKn48wlXW9-zt\"\n    data-layout=\"square\"\n    data-spacing=\"8\"\n    data-target-row-height=\"200\"\n    data-target-column-width=\"200\"\n    data-max-photos=\"12\"\n    data-sort-order=\"asc\"\n    data-header-placement=\"none\"\n><\/div>",
            "summary": "Развлекался намедни обновлением Lychee с миграцией с базового LXC-контейнера Debian 12 -> Debian 13",
            "date_published": "2026-10-04T11:49:58+07:00",
            "date_modified": "2026-10-04T11:53:24+07:00",
            "tags": [
                "linux",
                "Lychee",
                "системное администрирование",
                "фотография"
            ],
            "_date_published_rfc2822": "Sun, 04 Oct 2026 11:49:58 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "250",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "249",
            "url": "https:\/\/blog.m9k.space\/all\/vremya-kotoroe-techyot-bystro\/",
            "title": "Время, которое течёт быстро",
            "content_html": "<p>В продолжение <a href=\"https:\/\/blog.m9k.space\/all\/midjourney-2\/\">заметки<\/a>.  Как быстро растут  <s>чужие дети <\/s> нейросети.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/compare.jpg\" width=\"2048\" height=\"1024\" alt=\"\" \/>\n<\/div>\n",
            "summary": "В продолжение заметки. Как быстро растут чужие дети нейросети",
            "date_published": "2026-09-27T22:07:31+07:00",
            "date_modified": "2026-09-27T22:08:04+07:00",
            "tags": [
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/compare.jpg",
            "_date_published_rfc2822": "Sun, 27 Sep 2026 22:07:31 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "249",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/compare.jpg"
                ]
            }
        },
        {
            "id": "248",
            "url": "https:\/\/blog.m9k.space\/all\/egeya-hroniki-obnovleniya\/",
            "title": "Эгея. Хроники обновления.",
            "content_html": "<p>Когда-то, в далёкие времена ковида и окончательного огосударствления ВК, посетила меня идея поднять свой бложик на Aegea. Поднимал его я на актуальном тогда Proxmox 5, ещё ого-го как живом CentOS 7 в LXC. Внутри была, страшно сказать, MariaDB 5 и несвежий апачик. Утекло с тех лет много воды: контейнер несколько раз менял хостовый Proxmox, но внутрянку я не трогал.<\/p>\n<p>И тут зачесались руки привести историческую инфраструктуру в CI-ный вид: плейбук там, плейбук тут.<\/p>\n<p>База — Debian 13, обновление с миграцией на свежую версию движка, потому что с 2020 года Aegea я обновлял всего один раз.<\/p>\n<p>Вообще, это заметка должна была быть одой LLM и <s>нытьём<\/s> на тему того, что нейросети заменят админодевопсов нафиг.<\/p>\n<p>И, в общем и целом, я был в восторге. Написав некоторую длинную портянку текста о том, что, как и почему, я получил длинный плейбук, который, без шуток, выполнился с первого захода. И это с учётом того, что исходный сервер настраивал админ с сильно меньшим пониманием жизни и профессии.<\/p>\n<p>Отрефлексировать я это отрефлексировал тем, что ТЗ было составлено с кучей ограничений, которые человек без опыта ковыряния во всём этом просто не сформулировал бы. Машине скормили хороший запрос — машина выдала хороший результат. Плейбук был запущен, и через пару минут я получил рабочий блог.<\/p>\n<p>Но рефлексия не удалась.<\/p>\n<p>При попытке загрузить картинку в новый пост ловлю: «не удалось зарегистрировать загруженный файл».<br \/>\nВ nginx access log:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">POST \/@ajax\/file-upload\/?entity=note&amp;entity-id=247 HTTP\/1.1&quot; 200<\/code><\/pre><p>При этом в \/var\/www\/blog\/pictures появлялись временные файлы:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">-rw------- 1 www-data www-data 0 upload-XXXXXX<\/code><\/pre><p>Очевидное: место, права, лимиты на аплоад php, просто загрузку — проверил. PHP корректно получал файл:<br \/>\nДвижок в фришной версии обфусцирован, разбираться в коде — неблагодарное дело — мы холопоадмины, наше дело логи читать. Достаём BFG.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">strace -ff $(ps aux | awk &#039;\/php-fpm: pool www\/ &amp;&amp; !\/awk\/ {printf &quot;-p %s &quot;, $2}&#039;) -o \/tmp\/egeya-upload.strace<\/code><\/pre><p>Проблема раз:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">rename(&quot;\/tmp\/phpXXXX&quot;, &quot;\/var\/www\/blog\/pictures\/upload-XXXX&quot;) = -1 EXDEV<\/code><\/pre><p>Ошибка:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">EXDEV (Invalid cross-device link)<\/code><\/pre><p>означает попытку `rename()` между разными файловыми системами.<\/p>\n<p>Смотрю на вывод df -T в исходной системе, и в target — и понимаю, что Debian (не)смог. \/tmp теперь не реальный каталог, а временная фс tmpfs в памяти<\/p>\n<p>Схема проблемы:<br \/>\n\/tmp<br \/>\n|<br \/>\n| tmpfs<br \/>\n|<br \/>\nX  rename()<br \/>\n|<br \/>\n\/var\/www\/blog\/pictures<br \/>\n|<br \/>\n| root filesystem<\/p>\n<p>PHP создавал временный upload-файл в \/tmp.<br \/>\nЭгея использовала move_uploaded_file(), который внутри PHP может выполнить быстрый rename().<br \/>\nНо rename(), как оказалось, между разными файловыми системами невозможен.<br \/>\nБахнул отдельный временный каталог на той же файловой системе, где и бложик.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">mkdir -p \/var\/www\/blog\/tmp\nchown www-data:www-data \/var\/www\/blog\/tmp\nchmod 700 \/var\/www\/blog\/tmp<\/code><\/pre><p>В PHP-FPM :<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">upload_tmp_dir = \/var\/www\/blog\/tmp<\/code><\/pre><p>После перезапуска:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">systemctl restart php8.2-fpm<\/code><\/pre><p>цепочка стала:<br \/>\n\/var\/www\/blog\/tmp\/phpXXXX<br \/>\n|<br \/>\n| rename()<br \/>\nv<br \/>\n\/var\/www\/blog\/pictures\/upload-XXXX<br \/>\nОшибка EXDEV исчезла — но аплоад не заработал.<br \/>\nДостаём BFG второй раз.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">strace -ff $(ps aux | awk &#039;\/php-fpm: pool www\/ &amp;&amp; !\/awk\/ {printf &quot;-p %s &quot;, $2}&#039;) -o \/tmp\/egeya-upload.strace<\/code><\/pre><p>Видим, что Эгея хочет поделиться тайнами мироздания в лог, но не может. Чиним и это.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">touch \/var\/www\/blog\/user\/logs\/main.log<\/code><\/pre><p>Повторяем аплоад. В логе:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Process image: Done\nRegister upload: &lt;, , add, Array&gt;\nAjax file upload: couldn’t register upload<\/code><\/pre><p>Явно не по фэншую, не хватает параметров. Смотрим консоль отладки. Должны быть entity и entity-id<br \/>\nСмотрим в nginx. Конфиг нагенерила LLM по мотивам того, что было в сети — и он был рабочий...формально.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">location \/ {\n    log_not_found off;\n    try_files $uri $uri\/ \/index.php?go=$uri;\n}<\/code><\/pre><p>Запрос \/@ajax\/file-upload\/?entity=note&entity-id=247 после try_files превращался в \/index.php?go=\/@ajax\/file-upload\/. Параметры говорили «Мұнда параметрлер жоқ қой, иттер»<br \/>\nМеняем чудо-LLM на рабочее:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">location \/ {\n    log_not_found off;\n    rewrite ^(.*)$ \/index.php?go=$1 last;\n}<\/code><\/pre><p>Смысл изменения:<br \/>\ntry_files при внутреннем перенаправлении формирует новый URI и может потерять исходную строку параметров.<br \/>\nrewrite ... last выполняет внутренний rewrite с сохранением исходных GET-параметров. Рестартуем Nginx.<\/p>\n<p>Бинго!<\/p>\n",
            "summary": "Когда-то, в далёкие времена ковида и окончательного огосударствления ВК, посетила меня идея поднять свой бложик на Aegea",
            "date_published": "2026-09-25T23:22:24+07:00",
            "date_modified": "2026-09-26T09:43:00+07:00",
            "tags": [
                "Aegea",
                "Debian 13",
                "системное администрирование",
                "Эгея"
            ],
            "_date_published_rfc2822": "Fri, 25 Sep 2026 23:22:24 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "248",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "247",
            "url": "https:\/\/blog.m9k.space\/all\/socialochka\/",
            "title": "Социалочка",
            "content_html": "<p>Намедни закинул обрезанную версию обзора на <a href=\"https:\/\/blog.m9k.space\/all\/cost-of-hope-recenziya\/\">Cost of Hope <\/a> в профильное хранилище дядюшки Габена. Мой поток сознания не то, чтобы сильно уникален и не единичен даже для <i>cyrillic<\/i> сегмента — на основной проект всего 107k+ отзывов, на DLC — под две.<\/p>\n<p>И тем необычнее в рамках <i>понятных грустных обстоятельств и реалий<\/i> года 2026 видеть на почте:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/social.png\" width=\"723\" height=\"114\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/social2.png\" width=\"604\" height=\"261\" alt=\"\" \/>\n<\/div>\n<p>Стоит ребятам отдать должное — следят за комьюнити, даже в известных обстоятельствах. Пусть даже и ответ логичный «мы делаем то, что делаем, потому что продаётся».<br \/>\nДякую, приємно.<\/p>\n",
            "summary": "Намедни закинул обрезанную версию обзора на Cost of Hope в профильное хранилище дядюшки Габена. Мой поток сознания не то, чтобы сильно уникален и не единичен даже для cyrillic сегмента — на основной проект...",
            "date_published": "2026-09-25T22:46:22+07:00",
            "date_modified": "2026-09-25T22:46:09+07:00",
            "tags": [
                "Cost of Hope",
                "memory",
                "stalker 2",
                "игры"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/social.png",
            "_date_published_rfc2822": "Fri, 25 Sep 2026 22:46:22 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "247",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/social.png",
                    "https:\/\/blog.m9k.space\/pictures\/social2.png"
                ]
            }
        },
        {
            "id": "245",
            "url": "https:\/\/blog.m9k.space\/all\/suno-ne-po-gostu\/",
            "title": "Suno. «Не по ГОСТу».",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-23-sent.-2026-g.,-13_41_14.jpg\" width=\"1254\" height=\"1254\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Чутка про жизнь.<\/div>\n<\/div>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"216\" href=\"https:\/\/blog.m9k.space\/audio\/Ne-po-GOSTu.mp3\">Ne-po-GOSTu.mp3<\/a><\/div>\n<\/div>\n<p class=\"cut\">Лирика<\/p>\n<blockquote>\n<p>Мне тридцать с лишним. Всё нормально.<br \/>\nЕсть отпуск, пропуск и пароль.<br \/>\nИ даже кризис экзистенциальный<br \/>\nТеперь записан как рабочий сбой.<\/p>\n<p>С утра упал продакшен, вечером — мораль,<br \/>\nЯ снова поднимаю то, что рухнуло вчера.<br \/>\nКоллега снова прошлое торжественно достал<br \/>\nИ объясняет молодым, как правильно тогда.<\/p>\n<p>Он помнит вкус пломбира, пионерский звонкий хор,<br \/>\nХотя застал Союз примерно несколько минут.<br \/>\nЕму уютно думать: раньше был другой простор,<br \/>\nГде правильные люди правильнее живут.<\/p>\n<p>А я чиню систему, где опять потерян час,<br \/>\nГде будущее требует исправить каждый раз.<br \/>\nА если я опять не прохожу контроль —<br \/>\nБыть может, я играю просто не свою роль.<\/p>\n<p>Мне говорят: «Пора уже серьёзней выбирать:<br \/>\nСемья, машина, дети — всё положено иметь».<br \/>\nНо если это взрослость — научиться выбирать<br \/>\nИз списка только то, что полагается иметь?<\/p>\n<p>Я не по ГОСТу, не по плану,<br \/>\nНе по семейному уставу.<br \/>\nМне говорят: «Ты станешь взрослой».<br \/>\nЯ взрослой стала. Что мне стало?<\/p>\n<p>Я не по ГОСТу, не по плану,<br \/>\nНе помещаюсь в ваш чертёж.<br \/>\nМне говорят: «Когда-нибудь ты<br \/>\nДо нашей истины дойдёшь».<\/p>\n<p>Я столько лет училась всё упавшее чинить:<br \/>\nПроцессы, базы, сервисы — проверить и поднять.<br \/>\nНо непонятно, как себя обратно подключить,<br \/>\nКогда нигде не пишут, что сломалось и опять.<\/p>\n<p>Вокруг давно размечен обязательный маршрут:<br \/>\nРабота, дом, машина, дети — правильный этап.<br \/>\nИ люди точно знают, как приличные живут,<br \/>\nИ каждый шаг заранее прописан в roadmap.<\/p>\n<p>А я смотрю на город — бесконечный хоровод:<br \/>\nРабота, дом, покупки — неизменный оборот.<br \/>\nНо где-нибудь найдётся правильный поворот —<br \/>\nТуда, где на табличке крупно: «Аэропорт».<\/p>\n<p>Я не по ГОСТу, не по плану,<br \/>\nНе по семейному уставу.<br \/>\nМне говорят: «Ты станешь взрослой».<br \/>\nЯ взрослой стала. Что мне стало?<\/p>\n<p>Я не по ГОСТу, не по плану,<br \/>\nНе помещаюсь в ваш чертёж.<br \/>\nМне говорят: «Когда-нибудь ты<br \/>\nДо нашей истины дойдёшь».<\/p>\n<p>В аэропорту я становлюсь чуть-чуть живей:<br \/>\nЗдесь никому нет дела до отсутствия детей.<br \/>\nЗдесь не спросят, почему не куплена квартира,<br \/>\nИ не потребуют любить руины старого мира.<\/p>\n<p>Сдаю багаж, прохожу контроль,<br \/>\nОставив на досмотре социальную роль.<br \/>\nИ нелюбимый город уменьшается в окне,<br \/>\nИ первый раз за месяцы спокойнее во мне.<\/p>\n<p>Там внизу остались «надо», «принято», «пора»,<br \/>\nРазговоры, как прилично человеку тридцать плюс.<br \/>\nА облака не знают ни начальства, ни двора,<br \/>\nНи почему от правильного будущего грусть.<\/p>\n<p>В иллюминаторе — оранжевая нить.<br \/>\nЯ не решила, как мне дальше, где мне жить.<br \/>\nНо на минуту между облаком и тьмой<br \/>\nМне хорошо от права просто быть собой.<\/p>\n<p>Но самолёт садится.<br \/>\nТак заведено.<br \/>\nИ город возникает<br \/>\nЗа мокрым стеклом.<\/p>\n<p>Я знаю, как всё чинят.<br \/>\nКак сервисы поднять.<br \/>\nНо как мне дальше жить —<br \/>\nНегде прочитать.<\/p>\n<p>Я не по ГОСТу, не по плану,<br \/>\nНе помещаюсь в ваш чертёж.<br \/>\nМне говорят: «Когда-нибудь ты<br \/>\nДо нашей истины дойдёшь».<\/p>\n<p>Но если ваша жизнь нормальна,<br \/>\nА всё другое — ерунда,<br \/>\nЗачем мне легче ненормальной<br \/>\nНа высоте, чем здесь всегда?<\/p>\n<p>Мне тридцать с лишним. Всё нормально.<br \/>\nЕсть отпуск, пропуск и пароль.<br \/>\nИ только кризис экзистенциальный<br \/>\nНе закрывается как сбой.<\/p>\n<\/blockquote>\n",
            "summary": "Мне тридцать с лишним. Всё нормально. Есть отпуск, пропуск и пароль",
            "date_published": "2026-09-23T13:49:52+07:00",
            "date_modified": "2026-10-01T17:04:59+07:00",
            "tags": [
                "Suno",
                "музыка",
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-23-sent.-2026-g.,-13_41_14.jpg",
            "_date_published_rfc2822": "Wed, 23 Sep 2026 13:49:52 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "245",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-23-sent.-2026-g.,-13_41_14.jpg"
                ]
            }
        },
        {
            "id": "244",
            "url": "https:\/\/blog.m9k.space\/all\/sozdanie-polzovateley-v-debian-i-astra-linux\/",
            "title": "Создание пользователей в Debian и Astra Linux",
            "content_html": "<p>Cкрипт для создания локальных пользователей с настройкой passwordless sudo.<br \/>\nОпределяет дистрибутив через \/etc\/os-release. Для Astra Linux дополнительно выполняет pdpl-user -l 0:63 -i 63.<br \/>\nПроверяет наличие утилит, не пересоздаёт существующих пользователей и не изменяет их пароли. Конфигурация sudo проверяется через visudo. Поддерживает повторный запуск.<br \/>\nЗапуск:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.\/create-users.sh user1 user2 user3<\/code><\/pre><p><a href=\"https:\/\/egit.m9k.space\/m9k\/blog_data\/src\/branch\/main\/scripts\/Base\/debian-astra-create-passwordless-user.sh\">скрипт<\/a><\/p>\n",
            "summary": "Cкрипт для создания локальных пользователей с настройкой passwordless sudo",
            "date_published": "2026-09-23T09:51:16+07:00",
            "date_modified": "2026-09-27T21:33:31+07:00",
            "tags": [
                "Astra",
                "debian",
                "linux",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Wed, 23 Sep 2026 09:51:16 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "244",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "243",
            "url": "https:\/\/blog.m9k.space\/all\/cost-of-hope-recenziya\/",
            "title": "Cost of Hope",
            "content_html": "<p>Я отдал GSC деньги за ванильный STALKER 2 (предзаказ!), прошёл его на релизе и, несмотря на весь цирк с A-Life, странную мотивацию Скифа; персонажей, которые периодически разговаривали и действовали как люди с очень специфическими повреждениями лобной доли, в целом остался доволен. Где-то кринжевал, где-то матерился, где-то даже сопереживал Бродяге. А Припять дала совершенно роскошное ощущение узнавания.<\/p>\n<p>И дело не в том, что «ой, панельки, ржавчина, СССР». Я живу примерно в такой же постсоветской срани и прекрасно знаю, как она выглядит. Какая плитка бывает в коридоре. Какого цвета красят нижнюю половину стены. Как рядом существуют дверь из восьмидесятых, китайский автомат из двухтысячных и табличка «Двор образцового содержания» образца 1971 года. Как труба идёт не там, где красиво, а там, где сантехник смог её провести, местами переходя в неевклидово пространство. Как бетонный забор, административное здание, подстанция и двор образуют пространство, которое никто не проектировал для эффектного скриншота.<br \/>\n.cut<br \/>\nВанильный STALKER 2 местами попадал в это ощущение почти физически. Он выглядел не как тематический парк «Восточная Европа после апокалипсиса», а как знакомое пространство, в которое зачем-то добавили Зону.<\/p>\n<p>Cost of Hope это ощущение для меня практически уничтожил.<\/p>\n<p>Главная проблема дополнения даже не в плохом сюжете, не в Мавке, не в Зулусе, не в монорельсе, не в мозге в банке и не в затопленных подвалах НИИЧАЗа. Проблема в том, что поменялся сам договор между игрой и игроком. В хорошем STALKER мир существует сам по себе, а ты в нём временно находишься. В Cost of Hope мир слишком часто существует исключительно для того, чтобы через тридцать секунд развлечь тебя следующим аттракционом.<\/p>\n<p>Вот дверь. За ней бой. Вот коридор. В конце катсцена. Вот ЧАЭС. Разумеется, там будет локальный Call of Duty с бесконечными пачками вооружённых болванчиков. Вот лаборатория. Конечно, в ней должен быть пространственный пазл. Вот огромная установка. Надо по ней полазить. Вот мозг в колбе. Надо устроить вокруг него финальную арену. Вот мутанты. Их тоже кинем в перестрелку, потому что вдруг игрок на двадцать секунд останется без «контента».<\/p>\n<p>Особенно смешно это выглядит на фоне того, как GSC два года чинила ванильную игру от синдрома «я повернулся, а в десяти метрах за спиной материализовалась новая жизнь». Они буквально два года приводили A-Life к состоянию, когда игрок меньше замечает спавнер. И после этого в Cost of Hope устраивают на ЧАЭС ту же болезнь в пятикратном масштабе, только уже намеренно.<\/p>\n<p>Первое исследование ЧАЭС ещё работает. Потому что некоторое время игра просто позволяет тебе там находиться. Огромные промышленные сооружения, территория, которая долго была недоступна, само ощущение места. Ничего особенного даже делать не нужно. ЧАЭС сама по себе уже событие.<\/p>\n<p>А потом начинается война группировок, и всё быстро превращается в карту для многопользовательского шутера. Болванчики бегут туда, болванчики бегут сюда, дикий респавн, стрельба , для веселья ещё и мутантов подсыпали.<\/p>\n<p>И чем больше людей игра запихивает на ЧАЭС, тем меньше становится сама ЧАЭС. Если там одновременно вполне нормально функционируют небольшие армии, это уже не запретное сердце Зоны. Это просто горячий район с плохой транспортной доступностью.<\/p>\n<p>Железный лес при этом замечательный. Именно поэтому дополнение особенно раздражает: оно периодически показывает, что всё ещё умеет быть STALKER. Открытые пространства, реальные или хотя бы правдоподобные промышленные объекты, места, в которых география первична, а геймплей к ней приспосабливается.<\/p>\n<p>Потом начинается Лиманск, и я попадаю в сон собаки про нуарный НИИ «Радиоволна».<\/p>\n<p>Я понимаю, почему его любят. Там красиво. Туман. Свет. Мрачные силуэты. Странные интерьеры. Всё очень атмосферно, если атмосфера для вас — это количество атмосферных (простите за тавтологию) объектов на квадратный метр.<\/p>\n<p>Но старый STALKER был сильнее именно тогда, когда сначала показывал что-то абсолютно обыденное. НИИ должен сначала выглядеть местом, где в 1985 году сидела бухгалтерия, курил инженер Коля, а на втором этаже висел стенд по технике безопасности. И уже потом ты узнаёшь, что в подвале кто-то пытался свернуть человеческое сознание в трубочку.<\/p>\n<p>В Cost of Hope некоторые места с порога кричат: «Смотрите, какая у нас загадочная хоррор-локация». После этого они перестают быть загадочными примерно через пять минут.<\/p>\n<p>Отдельный привет истории с монорельсом, соединяющим лаборатории. Мы лазили по этим лабораториям двадцать лет. X18, X16, X-что-то-там. Мы читали документы, таскали папки, встречались с учёными, военными, сталкерами, бывшими сотрудниками исследовательских программ. И никто никогда не считал нужным упомянуть, что под Зоной, оказывается, существует секретное метро стратегического масштаба.<\/p>\n<p>Это не расширение лора. Это реткон из категории «сейчас мы добавим что-нибудь очень большое, потому что большое значит важное».<\/p>\n<p>Причём чем дольше об этом думаешь, тем смешнее становится. Подземная сеть на километры — это не «тайный тоннель». Это проходка, вентиляция, дренаж, энергоснабжение, депо, ремонт, бетон, вывоз грунта, геологи, строители, техника, годы работ и тысячи людей. В какой-то момент сама инфраструктура становится более грандиозным секретным проектом, чем лаборатории, которые она якобы должна незаметно соединять.<\/p>\n<p>Но сценарий просто кладёт этот факт перед тобой и идёт дальше. Прими, пожалуйста. Следующая сцена уже загружается.<\/p>\n<p>Старая серия была умнее именно потому, что многое не объясняла. Мы знали, что лаборатории связаны. Оборудование перемещалось. Документы ходили между объектами. Люди работали в рамках общей программы. Этого было достаточно.<\/p>\n<p>Не каждую дырку в лоре обязательно заливать бетоном.<\/p>\n<p>Иногда вопрос «а как именно всё это было связано?» намного интереснее ответа «там был секретный монорельс».<\/p>\n<p>С нарративом в целом та же болезнь: игра постоянно повышает ставки, совершенно не заботясь о том, повысился ли мой интерес.<\/p>\n<p>Ванильный STALKER 2 тоже был «голливудским». Скиф временами пустой ГГ, мотивация почти анекдотическая; крупные персонажи любят внезапно совершать эффектные поступки вместо разумных. Но история хотя бы имела хребет. Скиф приехал по конкретной причине, оказался втянут в более крупный конфликт и постепенно понял, насколько глубоко в него залез.<\/p>\n<p>Cost of Hope выглядит как кипиш ради кипиша.<\/p>\n<p>Скиф встречает людей, которых знает от силы пять минут, и почти сразу готов ради них лезть в ад. Через некоторое время он уже решает судьбу Долга и Свободы, участвует в гражданской войне, раскапывает очередной пласт секретных программ и спасает персонажей, к которым игра ещё не успела дать мне возможность хоть что-нибудь почувствовать.<\/p>\n<p>Особенно хорошо это видно в лагере в Железном лесу. Игра очень хочет трагедии. Вот «пипл, знакомьтесь, сталкер».Вот карты. Вот сцена. Вот погибшие. Вот серьёзные лица. Пожалуйста, испытывайте эмоции.<\/p>\n<p>А я смотрю на это и думаю: кто все эти люди?<\/p>\n<p>В лагере новичков SoC 2007 года персонажи состояли из трёх полигонов, двух анимаций и одного набора лиц. Но я туда возвращался. Там сидели люди. Кто-то играл на гитаре. Стоял Волк. Был Петруха. Был костёр. Через несколько часов это становилось местом. Игра не включала трагическую музыку, чтобы объяснить мне, что место важно.<\/p>\n<p>Cost of Hope почему-то уверена, что эмоциональную связь можно заменить постановкой.<\/p>\n<p>Мавка и Зулус существуют примерно по тому же принципу. Они яркие, хорошо выглядят, неплохо озвучены и совершенно разваливаются, если попытаться воспринимать их как живых людей, а не механизмы для запуска нужных сценаристу событий.<\/p>\n<p>В нормальной драме персонаж обладает характером, поэтому принимает решение, из которого возникает событие. Здесь слишком часто сначала существует событие, а потом сценарист быстро подкручивает персонажа так, чтобы тот сделал необходимую глупость.<\/p>\n<p>Нужна эскалация — вот вам эскалация. Нужен фанатизм — сейчас будет фанатизм. Нужна жестокость — человек, который пять минут назад выглядел относительно адекватным, внезапно включит режим сюжетного психопата.<\/p>\n<p>Потом игрок зачем-то должен сам собирать из этих кусков цельную психологию.<\/p>\n<p>Наёмников дополнение сливает ещё смешнее. В Железном лесу и Лиманске они почти боги. Организованные, профессиональные, опасные, знающие территорию. Игра долго убеждает тебя, что это действительно серьёзный противник.<\/p>\n<p>Потом приходит лаборатория с мозгом в банке.<\/p>\n<p>И эти элитные убийцы начинают выбегать пачками, получать очередь и освобождать место для следующей пачки. В этот момент они перестают быть наёмниками и становятся расходным материалом encounter designer’а.<\/p>\n<p>Нет более надёжного способа уничтожить угрозу врага, чем заставить игрока убить его сорок раз подряд.<\/p>\n<p>То же самое происходит с мутантами. Первая встреча с кровососом на Агропроме в 2007 году обеспечивала несколько кирпичей не потому, что кровосос обладал искусственным интеллектом уровня DeepMind. Игра просто правильно его подавала. Подземелье, темнота, звуки, неизвестность.<\/p>\n<p>В STALKER 2 кровососа выкатывают примерно через пятнадцать минут после начала. Ну ладно. Фансервис. Ребята, вы купили STALKER — держите кровососа. В Cost of Hope мутанты на ЧАЭС уже окончательно превращаются в специю для боя. Людей недостаточно? Добавим монстра.<\/p>\n<p>Кровосос проходит прекрасный путь от таинственной твари до фирменного маскота, которого можно кинуть в encounter table между снайпером и очередным отрядом NPC.<\/p>\n<p>Подвалы НИИЧАЗа стали для меня главным хоррором дополнения, только не в том смысле, в каком хотелось бы авторам. На последней сложности я умер там около десяти раз и в итоге открыл прохождение.<\/p>\n<p>Это не «сложный момент».<\/p>\n<p>Это провал левел-дизайна.<\/p>\n<p>Когда я умираю, потому что неправильно оценил противника, плохо подготовился или не понял правило аномалии — прекрасно. Я чему-то учусь внутри игры.<\/p>\n<p>Когда после очередной смерти я думаю: «Так, а в какой именно точке дизайнер предполагает, что я должен всплыть и на какую железку запрыгнуть?» — я больше не играю Скифом. Я занимаюсь обратной инженерией маршрута — а это хватает и на работе.<\/p>\n<p>И если для прохождения обязательного линейного участка мне проще посмотреть видео, чтобы понять намерение автора, то автор облажался. Тут даже спорить особенно не о чем.<\/p>\n<p>Гигантомания в НИИЧАЗ и лабораториях выглядит примерно так же. Огромные помещения, огромные установки, многоэтажные конструкции, пространственные головоломки, прыжки по балкам.<\/p>\n<p>Где-то из 1998 года машет рукой Lambda Core. Если это отсылка к Half-Life, то спасибо, конечно. Я понял — я его застал на релизе.<\/p>\n<p>В Half-Life подобные вещи работали, потому что вся Black Mesa была построена на этом художественном языке. Гордон всю игру лазил по лифтам, механизмам, трубам, реакторам и конвейерам. Lambda Core был кульминацией того, чему игра его до этого учила.<\/p>\n<p>В STALKER я хочу войти в лабораторию и подумать: «Что здесь, чёрт возьми, делали?»<\/p>\n<p>В Cost of Hope я захожу в помещение и думаю: «Ага, здесь сейчас будет платформинг».<\/p>\n<p>Или: «Вот это арена».<br \/>\nИли: «По этим балкам мне явно придётся идти».<br \/>\nКак только я начинаю видеть намерение левел-дизайнера раньше самого места, погружение заканчивается.<\/p>\n<p>Колбы с мутантами формально вообще не противоречат лору. Тайные эксперименты были всегда. Но опять же важна подача. В старых лабораториях было ощущение, что здесь когда-то происходило что-то страшное и теперь ты ходишь по последствиям.<\/p>\n<p>Cost of Hope временами устраивает экспозицию.<\/p>\n<p>Вот мутант.<br \/>\nВот ещё мутант.<br \/>\nВот большой мозг.<br \/>\nВот очень большая научная штука.<br \/>\nПолучается не заброшенная советская лаборатория, а очередной Resident Evil facility.<br \/>\nВроде бы слова те же, а язык уже другой.<\/p>\n<p>Даже визуально DLC для меня местами теряет ту самую постсоветскую достоверность ванили. Базовая игра долго разрабатывалась ещё до 2022 года и унаследовала очень характерную историческую мешанину советского, русского, украинского. Именно мешанину, потому что реальное пространства так и выглядят.<\/p>\n<p>В Cost of Hope местами появляется ощущение, что исторический объект начали художественно переписывать в соответствии с очевидной и понятной печальной повесткой дня текущего. Проблема в том, что ЧАЭС и Припять — это материальные объекты Украинской ССР. Они неизбежно содержат смесь СССР, УССР, русского, украинского, советской ведомственной типографики, эмблем, канцелярии и конкретного исторического мусора. И видя очередную «небезпеку» на объекте, который всем своим видом отсылает сильно в другому историческому периоду — погружение ломается.<\/p>\n<p>Если этот слой слишком аккуратно причесать, объект перестаёт выглядеть найденным. Он начинает выглядеть нарисованным.<\/p>\n<p>И для человека из постсоветской среды эта фальшь заметна намного сильнее, чем, вероятно, для рецензента, который видит просто «old Eastern European industrial building».<\/p>\n<p>В итоге с жанром у дополнения тоже получается довольно смешно.<\/p>\n<p>Как хоррор Cost of Hope проигрывает множеству современных инди, которым не нужны огромные бюджеты, чтобы заставить игрока бояться коридора.<\/p>\n<p>Как экшен он временами напоминает какой-то польский шутер про американских морпехов: всё взрывается, все куда-то бегут, враги идут пачками, вокруг происходит Очень Важная Битва.<\/p>\n<p>Как immersive exploration он сам себе постоянно мешает скриптами.<\/p>\n<p>Как нарратив он требует принимать слишком много новых допущений и слишком быстро привязываться к людям, которых игрок почти не знает.<\/p>\n<p>Зато красивые экстерьеры у него действительно красивые.<\/p>\n<p>Вот на них всё и держится.<\/p>\n<p>Поэтому я плохо понимаю тот масштаб восторга, который вызвало дополнение у рецензентов\/игрожуров. Видимо, мы просто хотим от STALKER совершенно разных вещей.<\/p>\n<p>Если для человека хороший STALKER — это больше событий, больше катсцен, больше необычных механик, больше сюжетных поворотов, больше боёв и меньше пустого пространства, Cost of Hope действительно может показаться прекрасным развитием формулы.<\/p>\n<p>Для меня STALKER работает ровно наоборот.<\/p>\n<p>Ты идёшь десять минут, и ничего не происходит.<br \/>\nПотом ещё пять.<br \/>\nВдалеке кто-то стреляет.<br \/>\nТы решаешь туда не ходить.<br \/>\nПотом заходишь в пустое здание.<br \/>\nСлышишь непонятный звук.<br \/>\nИ вот это уже событие.<\/p>\n<p>Современный AAA-дизайнер посмотрит на первые пятнадцать минут и скажет: «Надо улучшить pacing».<\/p>\n<p>Нет.<br \/>\nЭто и был pacing.<\/p>\n<p>Я заплатил за дополнение к игре, которая при всех своих недостатках давала мне иллюзию враждебного мира, существующего независимо от моего присутствия.<\/p>\n<p>А получил аттракцион.<br \/>\nПричём не лучший аттракцион.<\/p>\n<p>С посредственным нарративом, местами посредственным геймдизайном, гигантоманией, ретконами, тирными вставками, аренными боями, пространственными головоломками из прошлой эпохи и режиссурой, которая постоянно пытается сообщить мне, что вот сейчас, пожалуйста, надо испытать сильную эмоцию.<\/p>\n<p>Cost of Hope лучше всего работает там, где у дизайнеров меньше свободы и есть реальный прототип, который приходится уважать.<\/p>\n<p>Как только дверь закрывается и разработчики остаются один на один со своей фантазией, я слишком часто перестаю видеть Зону.<\/p>\n<p>Я вижу уровень.<\/p>\n<p>Для STALKER это, пожалуй, худшее, что можно сказать.<br \/>\n.cutend<\/p>\n",
            "summary": "Я отдал GSC деньги за ванильный STALKER 2 (предзаказ!), прошёл его на релизе и, несмотря на весь цирк с A-Life, странную мотивацию Скифа; персонажей, которые периодически разговаривали и действовали как...",
            "date_published": "2026-09-23T09:09:32+07:00",
            "date_modified": "2026-09-25T13:22:37+07:00",
            "tags": [
                "Cost of Hope",
                "stalker 2",
                "рецензия"
            ],
            "_date_published_rfc2822": "Wed, 23 Sep 2026 09:09:32 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "243",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "242",
            "url": "https:\/\/blog.m9k.space\/all\/git-prevraschaem-vlozhenny-repozitoriy-v-obychnuyu-direktoriyu\/",
            "title": "Git: превращаем вложенный репозиторий в обычную директорию",
            "content_html": "<p>Если скопировать один Git-проект внутрь другого и выполнить commit, Git сохранит вложенный проект как gitlink (режим 160000). В GitLab вместо содержимого директории будет отображаться ссылка на commit:<br \/>\ninit-server @ 957c7776<br \/>\nПростое удаление вложенного .git не поможет: ссылка уже записана в индексе родительского репозитория.<br \/>\nРешение:<\/p>\n<ol start=\"1\">\n<li>Удаляем gitlink из индекса, сохраняя файлы на диске:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">git rm --cached init-server<\/code><\/pre><ol start=\"2\">\n<li>Удаляем метаданные вложенного репозитория, если они ещё существуют:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">rm -rf init-server\/.git<\/code><\/pre><ol start=\"3\">\n<li>Добавляем содержимое как обычные файлы:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">git add -A init-server\/<\/code><\/pre><ol start=\"4\">\n<li>Проверяем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">git ls-files --stage init-server<\/code><\/pre><p>Вместо записи с режимом 160000 должны появиться отдельные файлы с режимами 100644 или 100755.<\/p>\n<ol start=\"5\">\n<li>Фиксируем изменения:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">git commit -m &quot;Convert init-server to regular directory&quot;\ngit push<\/code><\/pre>",
            "summary": "Если скопировать один Git-проект внутрь другого и выполнить commit, Git сохранит вложенный проект как gitlink...",
            "date_published": "2026-09-21T10:52:38+07:00",
            "date_modified": "2026-09-21T10:52:23+07:00",
            "tags": [
                "git",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Mon, 21 Sep 2026 10:52:38 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "242",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "241",
            "url": "https:\/\/blog.m9k.space\/all\/suno-chuzhoe-svoyo\/",
            "title": "Suno. «Чужое своё».",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-20-sent.-2026-g.,-16_35_38.jpg\" width=\"1254\" height=\"1254\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Продолжение темы городов — далёких и близких<\/div>\n<\/div>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"229\" href=\"https:\/\/blog.m9k.space\/audio\/Chuzhoe-svoyo.mp3\">Chuzhoe-svoyo.mp3<\/a><\/div>\n<\/div>\n<p class=\"cut\">Лирика<\/p>\n<blockquote>\n<p>Мне было пять.<br \/>\nПервый раз — за границу.<br \/>\nХотя какая граница,<br \/>\nкогда тебе пять?<\/p>\n<p>Я потом сюда ездил десятки раз —<br \/>\nСамолётом, поездом, летом, зимой.<br \/>\nИ однажды заметил: знакомый пейзаж<br \/>\nСтановится дальше от слова «чужой».<br \/>\nЗдесь «выше» — до гор, а «ниже» — от них,<br \/>\nИ город читается без указаний.<br \/>\nЯ к этой системе давно уж привык,<br \/>\nБез карт и подсказок, без лишних названий.<\/p>\n<p>Я не местный — и спорить об этом нелепо,<br \/>\nНо туристом назвать себя тоже смешно.<br \/>\nЯ смотрю на проспекты, на крыши, на небо —<br \/>\nИ всё это знакомо до странности, но<br \/>\nЗдесь другая реальность могла бы сложиться,<br \/>\nДругой адрес, привычки, работа и дом.<br \/>\nЯ не знаю, каким бы я стал в этой жизни,<br \/>\nНо порой узнаю себя в городе том.<\/p>\n<p>Алматы — чужое, где вижу своё,<br \/>\nКак жизнь, что могла бы достаться мне.<br \/>\nДругой поворот, пара улиц, район —<br \/>\nИ, может быть, я бы остался в нём.<br \/>\nГде горы висят на краю облаков,<br \/>\nГде город знаком, хоть и мне не дан.<br \/>\nЯ будто читаю историю сна,<br \/>\nГде жизнь незнакомая слишком родна.<\/p>\n<p>Я знаю язык на смешном бытовом:<br \/>\n«Дүке́н», «кіта́п», «су́» — и ещё с деся́ток.<br \/>\nА «балмұзда́қ» запо́мнил ещё пацано́м.<br \/>\nВедь мороженое понятно на языке любом.<br \/>\n«Как мне на Абая?» — спросили опять.<br \/>\n«До Космонавтов, направо, кварталов на пять».<br \/>\n«До Байтурсы́нова», — тут же поправлю себя.<br \/>\nЯ старого имени не застал никогда.<\/p>\n<p>Но оба названия помню на равных,<br \/>\nКак будто знакомы мне с детства давно.<br \/>\nИ странно: чужой город стал настолько понятным,<br \/>\nЧто два его имени слились в одно.<\/p>\n<p>Здесь Пушкин и Аба́й, здесь Гоголь и Досты́к —<br \/>\nК соседству этих улиц я давно уже привык.<br \/>\nУ каждого названия свой голос и свой след,<br \/>\nНо между ними спора на городской карте нет.<\/p>\n<p>Алматы — чужое, где вижу своё,<br \/>\nКак жизнь, что могла бы достаться мне.<br \/>\nДругой поворот, пара улиц, район —<br \/>\nИ, может быть, я бы остался в нём.<br \/>\nГде горы висят на краю облаков,<br \/>\nГде город знаком, хоть и мне не дан.<br \/>\nЯ будто читаю историю сна,<br \/>\nГде жизнь незнакомая слишком родна.<\/p>\n<p>А ночами мне снятся не улицы даже.<\/p>\n<p>Меде́у — ступени теряются в утренней мгле.<br \/>\nШымбұла́қ — и кажется, будто я больше не на земле.<br \/>\nКөк-Жайла́у — тропа растворяется в облаках,<br \/>\nА Алматы́ остаётся внизу, в огнях.<\/p>\n<p>И смешно:<br \/>\nво сне я не думаю,<br \/>\nчей это город,<br \/>\nчья это земля,<br \/>\nчей язык на вывеске.<\/p>\n<p>Я просто знаю дорогу.<\/p>\n<p>И если бы жизнь повернула иначе<br \/>\nДругой самолёт, другой двор, другой класс<br \/>\nЯ б горы считал просто частью пейзажа<br \/>\nНе вскидывал голову каждый раз.<br \/>\nЯ мог бы всю неделю спешить на работу,<br \/>\nРугаться на пробки, решать все дела.<br \/>\nА в горы с друзьями уехать в субботу,<br \/>\nПодальше от шума, асфальта, тепла.<\/p>\n<p>Мог бы знать этот город не лучше — иначе:<br \/>\nПо рабочим маршрутам, по будням, дождям.<br \/>\nНе искать в нём чудес, не ловить каждый миг,<br \/>\nА с рождения просто считать, что привык.<\/p>\n<p>Алматы — чужое, где вижу своё,<br \/>\nКак жизнь, что прошла в параллельной строке.<br \/>\nДругой поворот, пара улиц, район —<br \/>\nИ, может быть, я бы остался в нём.<\/p>\n<p>Мне было пять.<br \/>\nПервый город за границей.<\/p>\n<p>Наверное, поэтому<br \/>\nя так и не научился<br \/>\nсчитать его заграницей.<\/p>\n<\/blockquote>\n",
            "summary": "Мне было пять. Первый раз — за границу. Хотя какая граница,",
            "date_published": "2026-09-20T16:44:18+07:00",
            "date_modified": "2026-09-25T13:38:40+07:00",
            "tags": [
                "Suno",
                "музыка",
                "нейрогенерация"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-20-sent.-2026-g.,-16_35_38.jpg",
            "_date_published_rfc2822": "Sun, 20 Sep 2026 16:44:18 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "241",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/ChatGPT-Image-20-sent.-2026-g.,-16_35_38.jpg"
                ]
            }
        },
        {
            "id": "240",
            "url": "https:\/\/blog.m9k.space\/all\/rootless-podman-vnutri-proxmox-lxc-problema-uid-gid-mapping\/",
            "title": "Rootless Podman внутри Proxmox LXC: проблема UID\/GID mapping",
            "content_html": "<p>При запуске File Browser через rootless Podman образ скачивался, но распаковка завершалась ошибкой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">potentially insufficient UIDs or GIDs available in user namespace (requested 65534:65534)<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">lchown \/home: invalid argument<\/code><\/pre><p>Причина: пользователю podman выделено только 50 000 subordinate UID\/GID. Образ содержит файлы с UID\/GID 65534, которые не помещаются в доступный диапазон.<\/p>\n<p>Механизм<\/p>\n<p>Используются два уровня отображения идентификаторов:<br \/>\nPodman: UID\/GID образа → UID\/GID внутри Debian LXC.<br \/>\nLXC: UID\/GID Debian → UID\/GID хоста Proxmox.<\/p>\n<p>Настройки Podman определяются файлами \/etc\/subuid и \/etc\/subgid. Внешний mapping LXC задаётся через lxc.idmap.<\/p>\n<p>Исходная конфигурация Proxmox:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">root:100000:65536<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">deploy:165536:65536<\/code><\/pre><p>Непривилегированному LXC доступны 65 536 идентификаторов. Расширить диапазон непрерывно нельзя: следующие идентификаторы уже выделены пользователю deploy.<\/p>\n<p>Решение:<\/p>\n<p>Выделить свободный диапазон на Proxmox и добавить его в \/etc\/subuid и \/etc\/subgid хоста:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">root:231072:15536<\/code><\/pre><p>В конфигурации LXC сохранить исходное отображение и добавить новое:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">lxc.idmap = u 0 100000 65536<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">lxc.idmap = g 0 100000 65536<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">lxc.idmap = u 65536 231072 15536<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">lxc.idmap = g 65536 231072 15536<\/code><\/pre><p>Внутри LXC контейнера дополнить существующий диапазон пользователя podman:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">podman:10000:50000<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">podman:65536:15536<\/code><\/pre><p>Настроить аналогично UID и GID, предварительно проверив отсутствие пересечений с другими диапазонами. После остановки приложений перезапустить LXC и выполнить:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">podman system migrate<\/code><\/pre><p>Изменение mapping не переносит владельцев существующих файлов автоматически.<\/p>\n",
            "summary": "При запуске File Browser через rootless Podman образ скачивался, но распаковка завершалась ошибкой",
            "date_published": "2026-09-19T14:29:49+07:00",
            "date_modified": "2026-09-21T09:58:16+07:00",
            "tags": [
                "mapping",
                "podman",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Sat, 19 Sep 2026 14:29:49 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "240",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "239",
            "url": "https:\/\/blog.m9k.space\/all\/proxmox-7-vklyuchenie-docker-i-podman-v-lxc\/",
            "title": "Proxmox 7: включение Docker и Podman в LXC",
            "content_html": "<p>Для запуска Docker или Podman внутри LXC-контейнера необходимо активировать дополнительные возможности: nesting, keyctl и fuse.<\/p>\n<p>Скрипт запрашивает ID контейнера, проверяет наличие конфигурации, создаёт резервную копию с меткой времени и включает необходимые параметры. Остальные настройки features сохраняются.<\/p>\n<p>Запускать от root на хосте Proxmox.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\n\nread -rp &quot;Введите ID контейнера (CTID): &quot; CTID\n\nif [[ ! &quot;$CTID&quot; =~ ^[0-9]+$ || ! -f &quot;\/etc\/pve\/lxc\/${CTID}.conf&quot; ]]; then\n    echo &quot;Ошибка: некорректный CTID или конфигурация не найдена&quot;\n    exit 1\nfi\n\nCONF=&quot;\/etc\/pve\/lxc\/${CTID}.conf&quot;\nBACKUP_DIR=&quot;\/root\/lxc-config-backups&quot;\n\nmkdir -p &quot;$BACKUP_DIR&quot; &amp;&amp;\ncp &quot;$CONF&quot; &quot;$BACKUP_DIR\/${CTID}.conf.$(date +%Y%m%d_%H%M%S).bak&quot; &amp;&amp;\npct set &quot;$CTID&quot; --features &quot;$(awk -F, &#039;\/^features:\/{sub(\/^features:[[:space:]]*\/, &quot;&quot;); for(i=1;i&lt;=NF;i++) if($i !~ \/^(nesting|keyctl|fuse)=\/) printf &quot;%s,&quot;, $i} END{print &quot;nesting=1,keyctl=1,fuse=1&quot;}&#039; &quot;$CONF&quot;)&quot; &amp;&amp;\npct config &quot;$CTID&quot; | grep &#039;^features:&#039;<\/code><\/pre><p>Пример выполнения:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Введите ID контейнера (CTID): 177\nfeatures: fuse=1,keyctl=1,nesting=1<\/code><\/pre><p>Резервная копия конфигурации сохраняется в \/root\/lxc-config-backups\/.<\/p>\n<p>После изменения параметров необходимо полностью остановить и запустить контейнер:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">pct stop 177 &amp;&amp; pct start 177<\/code><\/pre><p>Update:<br \/>\nЕщё одна ошибка:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Failed to open() \/dev\/net\/tun: No such file or directory\nFailed to set up tap device in namespace<\/code><\/pre><p>Чиним:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\nset -euo pipefail\n\nCTID=178\nCONF=&quot;\/etc\/pve\/lxc\/${CTID}.conf&quot;\nBACKUP=&quot;${CONF}.$(date +%Y%m%d%H%M%S).bkp&quot;\n\nmodprobe tun\ntest -c \/dev\/net\/tun\n\ncp -a &quot;$CONF&quot; &quot;$BACKUP&quot;\n\nRULES=(\n    &quot;lxc.cgroup2.devices.allow: c 10:200 rwm&quot;\n    &quot;lxc.mount.entry: \/dev\/net\/tun dev\/net\/tun none bind,create=file&quot;\n)\n\nfor rule in &quot;${RULES[@]}&quot;; do\n    grep -Fqx -- &quot;$rule&quot; &quot;$CONF&quot; || printf &#039;%s\\n&#039; &quot;$rule&quot; &gt;&gt; &quot;$CONF&quot;\ndone\n\necho &quot;Backup: $BACKUP&quot;\necho &quot;Configuration:&quot;\ngrep -E &#039;^lxc\\.(cgroup2\\.devices\\.allow|mount\\.entry):&#039; &quot;$CONF&quot;<\/code><\/pre>",
            "summary": "Для запуска Docker или Podman внутри LXC-контейнера необходимо активировать дополнительные возможности",
            "date_published": "2026-09-19T10:20:57+07:00",
            "date_modified": "2026-09-19T21:20:16+07:00",
            "tags": [
                "docker",
                "linux",
                "lxc",
                "podman",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Sat, 19 Sep 2026 10:20:57 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "239",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "238",
            "url": "https:\/\/blog.m9k.space\/all\/prettymaps-2\/",
            "title": "Prettymaps в Docker: генератор картографических постеров",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.m9k.space\/pictures\/akademgorodok.png\" width=\"1000\" height=\"1045\" alt=\"\" \/>\n<\/div>\n<p>Поигрался с либой <a href=\"https:\/\/github.com\/marceloprates\/prettymaps\">PrettyMaps<\/a>, которая умеет строить из OSM прикольные постеры.<\/p>\n<p>Собрал контейнер, который позволяет сделать карту.<\/p>\n<p>Сборка без прокси:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DOCKER_BUILDKIT=1 docker build -t prettymaps-docker-test .<\/code><\/pre><p>Сборка с SOCKS5-прокси:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DOCKER_BUILDKIT=1 docker build --network=host --build-arg PROXY_SOCKS5=$PROXY_IP:$PROXY_PORT -t prettymaps-docker-test .<\/code><\/pre><p>Запуск:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">docker run --rm \\\n  -v &quot;$(pwd)&quot;:\/work \\\n  -e LAT=54.8482742 \\\n  -e LON=83.0973263 \\\n  -e RADIUS_M=1500 \\\n  -e TITLE=&quot;Академгородок&quot; \\\n  -e OUTPUT_NAME=akadem_coords \\\n  prettymaps-docker-test<\/code><\/pre><p><a href=\"https:\/\/egit.m9k.space\/m9k\/blog_data\/src\/commit\/a8d511f0464360c4696015f1373bf0d49415df00\/PrettyMaps\">Файлы <\/a><\/p>\n",
            "summary": "Поигрался с либой PrettyMaps, которая умеет строить из OSM прикольные постеры",
            "date_published": "2026-09-18T19:57:51+07:00",
            "date_modified": "2026-09-27T20:43:59+07:00",
            "tags": [
                "prettymaps",
                "python",
                "Карты",
                "постер",
                "системное администрирование"
            ],
            "image": "https:\/\/blog.m9k.space\/pictures\/akademgorodok.png",
            "_date_published_rfc2822": "Fri, 18 Sep 2026 19:57:51 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "238",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.m9k.space\/pictures\/akademgorodok.png"
                ]
            }
        }
    ],
    "_e2_version": 4199,
    "_e2_ua_string": "Aegea 11.5 (v4199)"
}