{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом gopnik",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/gopnik\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/gopnik\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "137632",
            "url": "https:\/\/bolknote.ru\/all\/pristup-gopnikomanii\/",
            "title": "Приступ «гопникомании»",
            "content_html": "<p>Постоянные читатели могут помнить, что я являюсь поклонником <a href=\"https:\/\/bolknote.ru\/all\/2410\/\">двух текстовых квестов «Гопник»,<\/a> написанных неизвестными авторами в нулевых. Я очень плохо отношусь к этой субкультуре, тем не менее эти квесты почему-то запали мне в душу. Поэтому я иногда возвращаюсь к этой теме и даже потихоньку пилю <a href=\"https:\/\/github.com\/bolknote\/gopnik2\/\">форк второй части<\/a>, правя в нём ошибки, кое-что рефакторя и иногда добавляя в игру что-то новое.<\/p>\n<p>Исходный код оригинальной игры, по всей видимости, канул в лету, но мне когда-то повезло наткнуться на <a href=\"https:\/\/gamedev.ru\/flame\/forum\/?id=138845\">неоконченный порт<\/a> этой игры под Линукс. С тех пор я ей иногда занимаюсь.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2025.10.03@2x.webp\" width=\"1000\" height=\"500\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Заставка оригинальной игры, взятая из текстового файла описания<\/div>\n<\/div>\n<p>Недавно в мой репозиторий пришёл некий активный гражданин и навёл там суеты, за что я ему благодарен. В частности, он подчеркнул кое-какие изъяны в балансе, плюс оказалось, что в процессе перевода кода с сишного <tt>printf<\/tt> на модуль Си++ <tt>fmt<\/tt>, я поломал буферизацию в Винде, которую когда-то <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-buferizaciya\/\">чинил<\/a> простым макросом.<\/p>\n<p>Слава нейросетям, всё это удалось довольно быстро исправить. В жизни я постоянно ворчу на вайб-кодинг и хоть правка исходников этой игры, казалось бы, один из успешных примеров вайб-кодинга, на деле мне всё время приходилось смотреть что мне там предложила нейросеть и направлять её в нужную сторону. Нередко она решала проблему неправильно, либо внешне всё исправлялось, но исправление вносило баг в другие части кода.<\/p>\n<p>Тем не менее, как мне кажется, с нейросетью я делал исправления куда быстрее, чем это вышло бы у меня без неё. Кстати, очень здорово выручают тесты — если попросить нейросеть написать тест, а потом добиться чтобы он заработал (или хотя бы не сломался), то участие человека требуется минимальное.<\/p>\n<p>Зачесались руки что-нибудь добавить в игру, но всё спотыкается о моё плохое знание языка гопников, когда-то, как мне кажется, я довольно умело ему подражал, но те времена прошли. Когда я пытаюсь придумать фразы на гопническом, получается как-то слишком стерильно, не знаю что с этим делать. Нейросети не помогают — встроенная мораль не позволяет им ругаться.<\/p>\n",
            "date_published": "2025-10-03T14:05:04+05:00",
            "date_modified": "2025-10-03T11:59:05+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "ИИ"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 03 Oct 2025 14:05:04 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "137632",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "132666",
            "url": "https:\/\/bolknote.ru\/all\/nakrylo-gopnikom-2\/",
            "title": "Накрыло «Гопником-2»",
            "content_html": "<p>Что-то мой закрывшийся, было, гештальт опять открылся — думал, что меня этот старинный текстовый квест уже не интересует, ан нет, вчера что-то совершенно не спалось, я снова расчехлил игру «Гопник-2» и играл в неё до поздней ночи.<\/p>\n<p>Пока играл, нашёл и поправил несколько незначительных багов, всё какая-то польза. Судя по всему, меня опять потихоньку засасывает эта игра, что даже неплохо, — руки чесались что-нибудь попрограммировать, но так, чтобы много времени на это не уходило. Правка небольших багов — самое оно.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2024.11.12@2x.webp\" width=\"1000\" height=\"410\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Меня позвали на «стрелку» в игре «Гопник-2», если бы не шокер, я бы не выжил<\/div>\n<\/div>\n",
            "date_published": "2024-11-12T10:57:32+05:00",
            "date_modified": "2024-11-12T11:08:04+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 12 Nov 2024 10:57:32 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "132666",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119455",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-ubral-printf\/",
            "title": "«Гопник-2»: убрал printf",
            "content_html": "<p>Закончил <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-chto-novogo\/\">убирать функцию<\/a> <tt>printf<\/tt>, сегодня вколотил последний гвоздь в крышку её гроба. Я почему-то наивно полагал, что на этом моя работа по избавлению от <tt>char *<\/tt> будет окончена, но не учёл, что в коде довольно много (больше 150) других мест, где ещё используется этот тип.<\/p>\n<p>В процессе замены встретилось вот такое. Загадка, всё ли хорошо в следующем коде?<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">std::cout &lt;&lt; fmt::format(&quot; {}(+{})&quot;, main_hero-&gt;inv[i].name, main_hero-&gt;inv[i].armo)<\/code><\/pre><p>Мой компилятор считает, что всё, но сборка на «Гитхабе» падает с ошибкой «<i>Binding packed field error<\/i>».<\/p>\n<p>Получается, я по неведомой причине не могу обратиться по ссылке на поле внутри упакованной структуры (<tt>fmt::format<\/tt> принимает параметры по ссылке).<\/p>\n<p>Структуру я пакую, чтобы нивелировать различия на бинарном уровне между компиляторами, — так как я её сохраняю и восстанавливаю как есть. В общем, от упаковки не отказаться, пришлось присвоить значения промежуточным переменным:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">const auto name = main_hero-&gt;inv[i].name;\r\nconst auto armo = main_hero-&gt;inv[i].armo;\r\n\r\nstd::cout &lt;&lt; fmt::format(&quot; {}(+{})&quot;, name, armo);<\/code><\/pre><p>Выглядит, как костыль, но самое главное — почему один компилятор требует промежуточные переменные, а другой умеет и без них?<\/p>\n<p>Я бы понял, если бы «Гитхаб» собирал мне бинарники для какой-то экзотической архитектуры, где есть какие-то особенности адресации, но тут такого ведь и в помине нет.<\/p>\n",
            "date_published": "2023-05-19T22:36:48+05:00",
            "date_modified": "2023-05-19T22:36:41+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "программирование",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 19 May 2023 22:36:48 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119455",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119398",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-chto-novogo\/",
            "title": "«Гопник-2»: что нового?",
            "content_html": "<p>Можно подумать, что я совсем забросил заниматься игрой «<a href=\"https:\/\/github.com\/bolknote\/gopnik2\">Гопник-2<\/a>», про которую ещё недавно так много писал, но это не так. Просто ничего особо интересного я там пока не делаю, — в основном довольно механически заменяю сишные строки (<tt>char *<\/tt>) на сиплюсплюсный класс <tt>std::string<\/tt>.<\/p>\n<p>Недавно <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-kontribyutory\/\">появившиеся контрибьюторы<\/a> добавили мне в проект библиотеку <tt>fmt<\/tt>, что упростило работу, — во-первых, теперь не приходится костылить собственные обёртки, чтобы чем-то заменить сишную функцию форматирования <tt>printf<\/tt>, а во-вторых, из-за гибкости <tt>fmt<\/tt> можно оставлять какие-то места почти нетронутыми, если сходу не удаётся перевести их на новые рельсы. Удобно.<\/p>\n<p>Осталось примерно 260 замен, не так много, было около 400 или около того.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.05.16@2x.jpg\" width=\"1000\" height=\"178\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Тесты прошли успешно<\/div>\n<\/div>\n<p>Ещё ребята постарались добавить мне тесты. Я ещё не смотрел, но планирую ознакомиться с тем как это делает. Так как на Си++ я раньше не писал, но совершенно без понятия как они тут выглядят, любопытно.<\/p>\n",
            "date_published": "2023-05-16T23:06:18+05:00",
            "date_modified": "2023-05-16T23:05:52+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 16 May 2023 23:06:18 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119398",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119254",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-kontribyutory\/",
            "title": "«Гопник-2»: контрибьюторы",
            "content_html": "<p>Фантастика! У меня на проекте буквально за эти выходные появилось ещё два контрибьютора.<\/p>\n<p><i>deadem<\/i> перевёл проект на сборку <i>cmake<\/i>, принёс библиотеку форматирования <i>fmt<\/i> и приделал к нему <i>CI<\/i> «Гитхаба», теперь сборка идёт прямо там. <i>kartaris<\/i> убрал <i>fmt<\/i> в зависимости, принёс менеджер пакетов <i>conan<\/i> и дописал код для использования в нём <i>fmt<\/i>.<\/p>\n<p>Это для меня новый интересный опыт — у меня не было возможности поработать на «Гитхабе» с контрибьюторами, да и само по себе приятно, что к проекту подключились новые люди и затащили в него достаточно сложные штуки.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.05.10@2x.jpg\" width=\"1000\" height=\"622\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Активность по контрибьюторам в проекте на «Гитхабе»<\/div>\n<\/div>\n",
            "date_published": "2023-05-10T10:59:47+05:00",
            "date_modified": "2023-05-10T13:01:58+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 10 May 2023 10:59:47 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119254",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118684",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-perehod-na-normalny-si-11\/",
            "title": "«Гопник-2»: переход на нормальный Си++11",
            "content_html": "<p>Как я <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-raznye-mingw\/\">писал прежде<\/a>, когда я адаптировал «Гопника-2» для запуска под «Виндоузом», столкнулся с тем, что не все тамошние компиляторы игру собирали. Не хватало двух функций — <tt>strdup<\/tt> и <tt>_fileno<\/tt>. Проблема решилось переключением компилятора на стандарт <tt>gnu++11<\/tt>, но меня это беспокоило — вдруг найдётся компилятор, который его не поддерживает.<\/p>\n<p>Тут у нас в Татарстане выдались длинные выходные, — в праздник «Ураза-байрам» у нас выходной, я решил этим воспользоваться и поковырять эту тему подробнее.<\/p>\n<p>Вызов <tt>_fileno<\/tt> у меня использовался для получения номера дескриптора входного потока, так что тут всё решилось просто, — для этого есть специальная константа <tt>STDIN_FILENO<\/tt>. А вот с <tt>strdup<\/tt> пришлось повозиться.<\/p>\n<p>Сначала я, разумеется, сделал свою реализацию — там всего-то три строки и заменил все вызовы на неё. Но мне показалось, что это слишком простое решение. А когда я программирую для души, мне хочется либо чему-то поучиться, либо сделать всё позамороченнее.<\/p>\n<p>Первым делом пошёл на поклон к «ЧатГПТ», спросил совета. Советы не заработали, но дали направление мысли.<\/p>\n<p>Первая мысль была забахать макрос, который заменял бы собой <tt>strdup<\/tt> в проблемном компиляторе, а остальные не трогал. Тут надо сказать, что под «Виндой» далеко не во всех наборах утилит компиляторы не содержат функцию <tt>strdup<\/tt>, например в <tt>msys2<\/tt> она есть.<\/p>\n<p>Мне хотелось как-то отличать между собой обычный <tt>mingw<\/tt> без <tt>strdup<\/tt> от того, который внутри <tt>msys2<\/tt>. «ЧатГПТ» тут не помог, хоть и подсунул несколько макросов на пробу, которых в действительности не существует.<\/p>\n<p>Пришлось пошарить по исходникам. Оказалось, есть ряд макросов, которые присутствуют в <tt>msys2<\/tt>, но отсутствуют в <tt>msys<\/tt>. Из них я выбрал <tt> __MINGW64_VERSION_MAJOR<\/tt>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">#if defined(__MINGW32__) &amp;&amp; !defined(__MINGW64_VERSION_MAJOR)\r\n#define strdup(s) (__extension__({ const char* __s = (s); size_t __l = strlen(__s) + 1; char* __d = (char*)malloc(__l);\\\r\n__d ? (char*)memcpy(__d, __s, __l) : nullptr; }))\r\n#endif<\/code><\/pre><p>Тут используется расширение, которое позволяет писать многострочные макросы. Хотя этот вариант мне и нравится, но опять используется не нормальный Си++, а расширение компилятора.<\/p>\n<p>Вторая мысль, на которую меня навела нейросеть — использовать слабые символы языка Си++. Это совершенно новая для меня штука, поэтому нужно небольшое пояснение. Прежде всего для меня же, чтобы я в будущем не забыл что это вообще такое.<\/p>\n<p>Если упрощать, то символы — это экспортируемые именованные сущности. Те, что какой-то модуль может отдать во внешнее пользование. Если символ «сильный», то его имя никто не может занять, такой код просто не соберётся — компилятор скажет, что существует два символа с одним именем, а если он «слабый», то его можно заменить.<\/p>\n<p>Слабые символы используются для библиотек, чтобы пользователь мог заменить некоторые сущности, если они его не устраивают.<\/p>\n<p>Если перевернуть ситуацию, и считать мой код библиотекой, а тот код, где должна быть определена <tt>strdup<\/tt> основным, то всё должно получиться.<\/p>\n<p>«ЧатГПТ», к сожалению, помочь не смог, — сначала подсовывал нерабочий код, а потом зациклился в своих советах. Поэтому пришлось разбираться самостоятельно.<\/p>\n<p>Всё оказалось не так уж и сложно. Сначала в заголовочном файле определяем прототип функции:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">#ifdef __MINGW32__\r\nchar *strdup(const char *s1);\r\n#endif<\/code><\/pre><p>Я его спрятал под условие, чтобы мой редактор перестал ругаться на избыточное определение, но всё работает и без этого.<\/p>\n<p>Потом в самом коде создаём слабый символ для <tt>strdup<\/tt>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">#ifdef __MINGW32__\r\n#pragma weak my_strdup\r\nchar *strdup(const char *src) {\r\n    size_t len = strlen(src) + 1;\r\n    char *s = (char *) malloc(len);\r\n    return s == nullptr ? nullptr : (char *) memcpy(s, src, len);\r\n}\r\n#endif<\/code><\/pre><p>Слабый символ я определяю через директиву <tt>#pragma weak<\/tt>, у которой надо указать имя слабого символа, причём оно должно отличаться от имени функции. Я пока не до конца понял зачем это нужно делать, но без этого не работает.<\/p>\n<p>Кстати, <tt>#pragma weak<\/tt> тоже расширение, но оно легко заменяется на атрибут <tt>weak<\/tt>, надо только будет изучить его синтаксис, я не успел этого сделать.<\/p>\n<p>На имя <tt>my_strdup<\/tt> у меня ругается редактор — говорит, что слабый символ нигде не определён, поэтому я опять же засунул всё это в условную компиляцию.<\/p>\n<p>В выходные, как всегда, есть куча дел, кроме хобби, поэтому до конца я разобраться не успел и буду рад, если кто-то из читателей прояснит это место. Если нет, поищу на досуге информацию в интернете.<\/p>\n<p><i>Дополнено<\/i>: в итоге все ситуации я побороть не смог и откатился на самое простое решение со своей собственной реализацией <tt>strdup<\/tt>.<\/p>\n",
            "date_published": "2023-04-24T00:35:01+05:00",
            "date_modified": "2023-05-03T23:58:44+05:00",
            "tags": [
                "cpp",
                "gopnik",
                "игра «Гопник-2»",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Mon, 24 Apr 2023 00:35:01 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118684",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118628",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-novosti\/",
            "title": "«Гопник-2»: новости",
            "content_html": "<p>Может показаться, что после <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-versiya-1-24\/\">релиза<\/a> «Гопника-2» я игрой больше не занимался, так как ничего про неё не пишу.<\/p>\n<p>Как можно догадаться по этой заметке, это не так. За последнее время я исправил несколько незначительных багов и реализовал кое-что из своих планов.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.04.21@2x.jpg\" width=\"1000\" height=\"426\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Новая штука в игре — шокер, можно бить противника током<\/div>\n<\/div>\n<p>Я долго не понимал как во внутреннем АПИ игры формируются прайс-листы, но теперь разобрался и сделал, как и планировал, на новой станции «Чёрная речка» ларёк. В нём можно покрепиться семечками и шавермой (мы же в Питере), а так же купить батарейки для шокера — нового игрового предмета.<\/p>\n<p>Шокер может вывалиться из одного из неигровых персонажей и немного оживляет бои, а то они очень уж скучные.<\/p>\n<p>Думаю добавить в ларёк ещё пару предметов, а так же новую локацию. Так как пока не уверен стоит ли её добавлять, не буду писать какую. После всех добавлений выпущу следующий релиз.<\/p>\n<p>В общем, игру потихоньку развиваю, хоть фантазия мало-помалу и иссякает. Попытался найти какие-то материалы по субкультуры гопников, чтобы вдохновиться, но если честно, по этой теме найти что-то стоящее непросто.<\/p>\n",
            "date_published": "2023-04-21T20:57:37+05:00",
            "date_modified": "2023-04-21T20:57:33+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 21 Apr 2023 20:57:37 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118628",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118461",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-versiya-1-24\/",
            "title": "«Гопник-2»: версия 1.24",
            "content_html": "<p>У меня тут небольшая веха в игре «Гопник-2» — вышел первый релиз, который я считаю стабильным. По этому поводу я даже собрал бинарники под все основные платформы. Для тех, кто не боится качать запускаемые файлы из интернета, <a href=\"https:\/\/github.com\/bolknote\/gopnik2\/releases\/tag\/1.24\">выложил<\/a> их на странице релиза.<\/p>\n<p>Там универсальный бинарник под МакОС и статически собранные файлы под 64-битные «Виндоуз» и «Линукс». Ссылка для скачивания выше, а ниже скриншот, в нём ссылки не работают.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.04.17.1@2x.jpg\" width=\"1000\" height=\"557\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2023-04-17T22:40:33+05:00",
            "date_modified": "2023-04-17T22:40:27+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Mon, 17 Apr 2023 22:40:33 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118461",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118386",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-teper-android\/",
            "title": "«Гопник-2»: теперь «Андроид»",
            "content_html": "<p>В полку не совсем обычных платформ, где я попробовал собрать «Гопника-2», прибыло. В этот раз, пока обедал, листал экраны на смартфоне и взгляд упал на терминал <i>Termux<\/i>, который я когда-то ставил, чтобы иметь возможность зайти экстренно куда-нибудь по работе.<\/p>\n<p>Решил попробовать скомпилируется ли. В принципе проблем почти не возникло. Всё необходимое поставил командой <tt>pkg install make clang git<\/tt>, после чего выписал проект и поправил путь до заголовочного файла — в «Андроиде» он находится в другом месте.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.04.14.1@2x.jpg\" width=\"1000\" height=\"1127\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Так выглядит запущенный «Гопник-2», запущенный в терминале <i>Termux<\/i> под «Андроидом»<\/div>\n<\/div>\n<p>Правки в репозиторий внёс, теперь всё будет собираться ещё и под «Андроид». Проверять в будущем я не буду, вряд ли кто-то будет собирать для себя, но проверить было интересно.<\/p>\n",
            "date_published": "2023-04-14T15:59:57+05:00",
            "date_modified": "2023-04-14T17:30:23+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 14 Apr 2023 15:59:57 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118386",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118351",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-fan-klub\/",
            "title": "«Гопник-2»: фан-клуб",
            "content_html": "<p>Тем временем, у игры «Гопник-2», с которой я вожусь почти каждый день в последнее время, отрос небольшой фан-клуб. Самый заметный его участник, <i>bairog<\/i>, прошёл всю игру вдоль и поперёк, завёл мне десяток багов, которые я постепенно исправил и даже начал писать игре <a href=\"https:\/\/github.com\/bolknote\/gopnik2\/issues\/11\">краткое описание<\/a>. За что ему огромное спасибо!<\/p>\n<p>Когда будет готово, надо будет это должным образом оформить, снабдить скриншотами и перенести в вики проекта.<\/p>\n<p>В принципе уже почти всё готово, но кое-что хочется ещё дописать — <a href=\"https:\/\/bolknote.ru\/all\/gopnik-komanda-run\/\">пресловутый ларёк<\/a>, сохранение перед выходом, работу с несколькими сохранениями. Остальное, вроде, всё уже дописано и поправлено.<\/p>\n<p>Надо бы поторопиться, а то бесплатная лицензия на среду разработки кончится в начале мая, не так много времени осталось, дальше разрабатывать будет сложнее.<\/p>\n",
            "date_published": "2023-04-13T23:27:09+05:00",
            "date_modified": "2023-04-14T16:09:55+05:00",
            "tags": [
                "gopnik",
                "gopnik2 game",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 13 Apr 2023 23:27:09 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118351",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118045",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-raznye-mingw\/",
            "title": "«Гопник-2»: разные mingw",
            "content_html": "<p>Надо по-быстрому дописать посты про портирования игры на «Виндоуз», пока свежо в памяти. Так что продолжу.<\/p>\n<p>Сильнее всего меня удивило в процессе, что поведение <tt>mingw<\/tt>, — инструментария для компиляции приложений под «Виндоуз», различается под разными операционными системами.<\/p>\n<p>Поскольку мне не хотелось заморачиваться с установкой софта на виртуальную машину, я развернул <tt>mingw<\/tt> у себя под «Маком» и внёс правки, чтобы всё благополучно компилировалось именно на этой ОС.<\/p>\n<p>Запустив получившееся на первой попавшейся виндовой виртуалке, я успокоился. Но <a href=\"https:\/\/github.com\/bolknote\/gopnik2\/issues\/4\">оказалось<\/a> этого недостаточно — под самой «Виндоуз» приложение не собиралось!<\/p>\n<p>Во-первых, под «Виндой» отсутствовала функция <tt>strdup<\/tt>, интернет ничего не подсказал, но я случайно решил эту проблему, установив стандарт языка в <i>GNU C++11<\/i>: <tt>-std=gnu++11<\/tt>.<\/p>\n<p>Во-вторых, почему отсутствовали-то ряд важных констант. Cледуя совету на «Стековерфлоу», я просто определил их нужными значениями.<\/p>\n<p>В-третьих, функцию <tt>usleep<\/tt> пришлось заменить на <tt>Sleep<\/tt> из <tt>windows.h<\/tt>.<\/p>\n<p>После этих правок игра начала собираться под «Виндой» тоже.<\/p>\n<p>Недавно прочитал в одной из статей на Хабре, что «язык Си++ достаточно сложен, чтобы позволить нам писать на нём просто», как же это верно! Неожиданно много времени занимает борьба с какими-то вещами, которые, как мне кажется, должны просто работать.<\/p>\n",
            "date_published": "2023-04-08T17:51:32+05:00",
            "date_modified": "2023-04-14T16:10:36+05:00",
            "tags": [
                "cpp",
                "gopnik",
                "игра «Гопник-2»",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sat, 08 Apr 2023 17:51:32 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118045",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118032",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-na-haiku\/",
            "title": "«Гопник-2» на Haiku",
            "content_html": "<p>В 2000-е у меня был друг, который фанател от «<i>BeOS<\/i>». Послушать его, так это лучшая система на Земле, где всё сразу продумано, нет родовых травм и легаси. Судя по деталям, которыми он сыпал в своих рассказах, во многом так и было, — многие вещи, которые бесили в других операционках, там были сделаны на удивление хорошо.<\/p>\n<p>К сожалению, компания, которая её писала, приказала долго жить, передала исходный код сообществу, которое до сих пор потихоньку пилит его уже под новым именем — <i>Haiku<\/i>.<\/p>\n<p>А мне тут что-то до того понравилось водружать «Гопника» на всё новые и новые операционные системы, что я решил пока не останавливаться, и, порывшись в памяти, вспомнил про <i>BeOS<\/i>, установил себе на виртуалку <i>Haiku<\/i> и попробовать собрать игру.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.04.07.1@2x.jpg\" width=\"1000\" height=\"625\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Гопник-2», запущенный под <i>Haiku<\/i> (наследницей <i>BeOS<\/i>), собралось без правок, но с приключениями<\/div>\n<\/div>\n<p>Сразу у меня это сделать не получилось, но по ошибкам я догадался, что не хватает кое-каких библиотек. Полдня я пытался найти ответ в интернете или при помощи <i>GPT<\/i>, а потом обратился к живым людям в профильные чаты. За несколько итераций решение нашлось.<\/p>\n<p>Вот как выглядит рецепт компиляции и запуска:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">pkgman install gcc make haiku_devel\r\ngit clone https:\/\/github.com\/bolknote\/gopnik2.git\r\ncd gopnik2\r\nmake\r\n.\/gop2<\/code><\/pre><p>Нужные мне библиотеки лежали, как оказалось, в пакете <tt>haiku_devel<\/tt>, сложно было догадаться, хорошо, что нашлись те, кто смог подсказать.<\/p>\n",
            "date_published": "2023-04-07T20:02:01+05:00",
            "date_modified": "2023-04-14T16:10:48+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 07 Apr 2023 20:02:01 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118032",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118020",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-utf-8\/",
            "title": "«Гопник-2»: UTF-8",
            "content_html": "<p>Продолжаю писать про портирование «Гопника-2» под «Виндоуз», ибо там ещё есть о чём рассказать.<\/p>\n<p>Я уже очень давно не работаю под этой операционной системой, поэтому некоторые обычные, возможно, для многих вещи для меня являются открытием. Когда я начинал процесс портирования игры под эту платформу, я был уверен, что столкнусь в трудностями совершенно в других частях кода. Одной из неожиданностей была плохая работа «Виндоуз» с кодировкой ЮТФ-8.<\/p>\n<p>Если вывод в консоль <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-adaptaciya-pod-windows\/\">удалось победить<\/a> сравнительно легко, то со вводом возникли проблемы — вызов <tt>SetConsoleCP(CP_UTF8)<\/tt>, который должен был помочь, не помог. В интернете пишут, что он, по всей видимости, не реализован — просто не делает ничего.<\/p>\n<p>Если с латинскими буквами проблем не возникает, они кодируются одним байтом, это ничем не отличается от того как программы до этого работали десятилетиями, а вот с русскими буквами беда — для них требуется два байта и в таком виде Виндоуз их не понимает.<\/p>\n<p>Рекомендуемый специалистами способ — переключить консоль в режим ввода кодировки ЮТФ-16, а потом перекодировать полученную строку в нужную кодировку. «Виндозу» ЮТФ-16 родная, поэтому проблем вообще никаких не возникает.<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">#ifdef __MINGW32__\n        int wlen = 100;\n        int save = _setmode(_fileno(stdin), _O_U16TEXT);\n        wchar_t *wstr = (wchar_t *) malloc(wlen * sizeof(wchar_t));\n        fgetws(wstr, wlen, stdin);\n\n        int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, 0, 0, 0, 0);\n        user_name = (char *) malloc(len);\n        WideCharToMultiByte(CP_UTF8, 0, wstr, -1, user_name, len, 0, 0);\n        _setmode(_fileno(stdin), save);\n\n        free(wstr);\n#endif<\/code><\/pre><p>Мне, к счастью, ввод русских букв нужен только в одном месте — там где игрок вводит своё имя. Я убрал используемую там функцию <tt>fgets<\/tt> под условную компиляцию и вставил кусок, который выше. С таким исправлением всё заработало, как ожидается.<\/p>\n",
            "date_published": "2023-04-07T13:33:31+05:00",
            "date_modified": "2024-01-28T00:08:38+05:00",
            "tags": [
                "gopnik",
                "utf8",
                "игра «Гопник-2»",
                "программирование",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 07 Apr 2023 13:33:31 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118020",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}