<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блоги: заметки с тегом gopnik</title>
<link>https://blogengine.me/blogs/tags/gopnik/</link>
<description>Автоматически собираемая лента заметок, написанных в блогах на Эгее</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079e)</generator>

<itunes:subtitle>Автоматически собираемая лента заметок, написанных в блогах на Эгее</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Приступ «гопникомании»</title>
<guid isPermaLink="false">137632</guid>
<link>https://bolknote.ru/all/pristup-gopnikomanii/</link>
<pubDate>Fri, 03 Oct 2025 14:05:04 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/pristup-gopnikomanii/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Постоянные читатели могут помнить, что я являюсь поклонником &lt;a href="https://bolknote.ru/all/2410/"&gt;двух текстовых квестов «Гопник»,&lt;/a&gt; написанных неизвестными авторами в нулевых. Я очень плохо отношусь к этой субкультуре, тем не менее эти квесты почему-то запали мне в душу. Поэтому я иногда возвращаюсь к этой теме и даже потихоньку пилю &lt;a href="https://github.com/bolknote/gopnik2/"&gt;форк второй части&lt;/a&gt;, правя в нём ошибки, кое-что рефакторя и иногда добавляя в игру что-то новое.&lt;/p&gt;
&lt;p&gt;Исходный код оригинальной игры, по всей видимости, канул в лету, но мне когда-то повезло наткнуться на &lt;a href="https://gamedev.ru/flame/forum/?id=138845"&gt;неоконченный порт&lt;/a&gt; этой игры под Линукс. С тех пор я ей иногда занимаюсь.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2025.10.03@2x.webp" width="1000" height="500" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Заставка оригинальной игры, взятая из текстового файла описания&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Недавно в мой репозиторий пришёл некий активный гражданин и навёл там суеты, за что я ему благодарен. В частности, он подчеркнул кое-какие изъяны в балансе, плюс оказалось, что в процессе перевода кода с сишного &lt;tt&gt;printf&lt;/tt&gt; на модуль Си++ &lt;tt&gt;fmt&lt;/tt&gt;, я поломал буферизацию в Винде, которую когда-то &lt;a href="https://bolknote.ru/all/gopnik-2-buferizaciya/"&gt;чинил&lt;/a&gt; простым макросом.&lt;/p&gt;
&lt;p&gt;Слава нейросетям, всё это удалось довольно быстро исправить. В жизни я постоянно ворчу на вайб-кодинг и хоть правка исходников этой игры, казалось бы, один из успешных примеров вайб-кодинга, на деле мне всё время приходилось смотреть что мне там предложила нейросеть и направлять её в нужную сторону. Нередко она решала проблему неправильно, либо внешне всё исправлялось, но исправление вносило баг в другие части кода.&lt;/p&gt;
&lt;p&gt;Тем не менее, как мне кажется, с нейросетью я делал исправления куда быстрее, чем это вышло бы у меня без неё. Кстати, очень здорово выручают тесты — если попросить нейросеть написать тест, а потом добиться чтобы он заработал (или хотя бы не сломался), то участие человека требуется минимальное.&lt;/p&gt;
&lt;p&gt;Зачесались руки что-нибудь добавить в игру, но всё спотыкается о моё плохое знание языка гопников, когда-то, как мне кажется, я довольно умело ему подражал, но те времена прошли. Когда я пытаюсь придумать фразы на гопническом, получается как-то слишком стерильно, не знаю что с этим делать. Нейросети не помогают — встроенная мораль не позволяет им ругаться.&lt;/p&gt;
</description>
</item>

<item>
<title>Накрыло «Гопником-2»</title>
<guid isPermaLink="false">132666</guid>
<link>https://bolknote.ru/all/nakrylo-gopnikom-2/</link>
<pubDate>Tue, 12 Nov 2024 10:57:32 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/nakrylo-gopnikom-2/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Что-то мой закрывшийся, было, гештальт опять открылся — думал, что меня этот старинный текстовый квест уже не интересует, ан нет, вчера что-то совершенно не спалось, я снова расчехлил игру «Гопник-2» и играл в неё до поздней ночи.&lt;/p&gt;
&lt;p&gt;Пока играл, нашёл и поправил несколько незначительных багов, всё какая-то польза. Судя по всему, меня опять потихоньку засасывает эта игра, что даже неплохо, — руки чесались что-нибудь попрограммировать, но так, чтобы много времени на это не уходило. Правка небольших багов — самое оно.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2024.11.12@2x.webp" width="1000" height="410" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Меня позвали на «стрелку» в игре «Гопник-2», если бы не шокер, я бы не выжил&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>«Гопник-2»: убрал printf</title>
<guid isPermaLink="false">119455</guid>
<link>https://bolknote.ru/all/gopnik-2-ubral-printf/</link>
<pubDate>Fri, 19 May 2023 22:36:48 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-ubral-printf/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Закончил &lt;a href="https://bolknote.ru/all/gopnik-2-chto-novogo/"&gt;убирать функцию&lt;/a&gt; &lt;tt&gt;printf&lt;/tt&gt;, сегодня вколотил последний гвоздь в крышку её гроба. Я почему-то наивно полагал, что на этом моя работа по избавлению от &lt;tt&gt;char *&lt;/tt&gt; будет окончена, но не учёл, что в коде довольно много (больше 150) других мест, где ещё используется этот тип.&lt;/p&gt;
&lt;p&gt;В процессе замены встретилось вот такое. Загадка, всё ли хорошо в следующем коде?&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;std::cout &amp;lt;&amp;lt; fmt::format(&amp;quot; {}(+{})&amp;quot;, main_hero-&amp;gt;inv[i].name, main_hero-&amp;gt;inv[i].armo)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Мой компилятор считает, что всё, но сборка на «Гитхабе» падает с ошибкой «&lt;i&gt;Binding packed field error&lt;/i&gt;».&lt;/p&gt;
&lt;p&gt;Получается, я по неведомой причине не могу обратиться по ссылке на поле внутри упакованной структуры (&lt;tt&gt;fmt::format&lt;/tt&gt; принимает параметры по ссылке).&lt;/p&gt;
&lt;p&gt;Структуру я пакую, чтобы нивелировать различия на бинарном уровне между компиляторами, — так как я её сохраняю и восстанавливаю как есть. В общем, от упаковки не отказаться, пришлось присвоить значения промежуточным переменным:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;const auto name = main_hero-&amp;gt;inv[i].name;
const auto armo = main_hero-&amp;gt;inv[i].armo;

std::cout &amp;lt;&amp;lt; fmt::format(&amp;quot; {}(+{})&amp;quot;, name, armo);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Выглядит, как костыль, но самое главное — почему один компилятор требует промежуточные переменные, а другой умеет и без них?&lt;/p&gt;
&lt;p&gt;Я бы понял, если бы «Гитхаб» собирал мне бинарники для какой-то экзотической архитектуры, где есть какие-то особенности адресации, но тут такого ведь и в помине нет.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: что нового?</title>
<guid isPermaLink="false">119398</guid>
<link>https://bolknote.ru/all/gopnik-2-chto-novogo/</link>
<pubDate>Tue, 16 May 2023 23:06:18 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-chto-novogo/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Можно подумать, что я совсем забросил заниматься игрой «&lt;a href="https://github.com/bolknote/gopnik2"&gt;Гопник-2&lt;/a&gt;», про которую ещё недавно так много писал, но это не так. Просто ничего особо интересного я там пока не делаю, — в основном довольно механически заменяю сишные строки (&lt;tt&gt;char *&lt;/tt&gt;) на сиплюсплюсный класс &lt;tt&gt;std::string&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Недавно &lt;a href="https://bolknote.ru/all/gopnik-2-kontribyutory/"&gt;появившиеся контрибьюторы&lt;/a&gt; добавили мне в проект библиотеку &lt;tt&gt;fmt&lt;/tt&gt;, что упростило работу, — во-первых, теперь не приходится костылить собственные обёртки, чтобы чем-то заменить сишную функцию форматирования &lt;tt&gt;printf&lt;/tt&gt;, а во-вторых, из-за гибкости &lt;tt&gt;fmt&lt;/tt&gt; можно оставлять какие-то места почти нетронутыми, если сходу не удаётся перевести их на новые рельсы. Удобно.&lt;/p&gt;
&lt;p&gt;Осталось примерно 260 замен, не так много, было около 400 или около того.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.05.16@2x.jpg" width="1000" height="178" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Тесты прошли успешно&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ещё ребята постарались добавить мне тесты. Я ещё не смотрел, но планирую ознакомиться с тем как это делает. Так как на Си++ я раньше не писал, но совершенно без понятия как они тут выглядят, любопытно.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: контрибьюторы</title>
<guid isPermaLink="false">119254</guid>
<link>https://bolknote.ru/all/gopnik-2-kontribyutory/</link>
<pubDate>Wed, 10 May 2023 10:59:47 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-kontribyutory/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Фантастика! У меня на проекте буквально за эти выходные появилось ещё два контрибьютора.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;deadem&lt;/i&gt; перевёл проект на сборку &lt;i&gt;cmake&lt;/i&gt;, принёс библиотеку форматирования &lt;i&gt;fmt&lt;/i&gt; и приделал к нему &lt;i&gt;CI&lt;/i&gt; «Гитхаба», теперь сборка идёт прямо там. &lt;i&gt;kartaris&lt;/i&gt; убрал &lt;i&gt;fmt&lt;/i&gt; в зависимости, принёс менеджер пакетов &lt;i&gt;conan&lt;/i&gt; и дописал код для использования в нём &lt;i&gt;fmt&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Это для меня новый интересный опыт — у меня не было возможности поработать на «Гитхабе» с контрибьюторами, да и само по себе приятно, что к проекту подключились новые люди и затащили в него достаточно сложные штуки.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.05.10@2x.jpg" width="1000" height="622" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Активность по контрибьюторам в проекте на «Гитхабе»&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>«Гопник-2»: переход на нормальный Си++11</title>
<guid isPermaLink="false">118684</guid>
<link>https://bolknote.ru/all/gopnik-2-perehod-na-normalny-si-11/</link>
<pubDate>Mon, 24 Apr 2023 00:35:01 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-perehod-na-normalny-si-11/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Как я &lt;a href="https://bolknote.ru/all/gopnik-2-raznye-mingw/"&gt;писал прежде&lt;/a&gt;, когда я адаптировал «Гопника-2» для запуска под «Виндоузом», столкнулся с тем, что не все тамошние компиляторы игру собирали. Не хватало двух функций — &lt;tt&gt;strdup&lt;/tt&gt; и &lt;tt&gt;_fileno&lt;/tt&gt;. Проблема решилось переключением компилятора на стандарт &lt;tt&gt;gnu++11&lt;/tt&gt;, но меня это беспокоило — вдруг найдётся компилятор, который его не поддерживает.&lt;/p&gt;
&lt;p&gt;Тут у нас в Татарстане выдались длинные выходные, — в праздник «Ураза-байрам» у нас выходной, я решил этим воспользоваться и поковырять эту тему подробнее.&lt;/p&gt;
&lt;p&gt;Вызов &lt;tt&gt;_fileno&lt;/tt&gt; у меня использовался для получения номера дескриптора входного потока, так что тут всё решилось просто, — для этого есть специальная константа &lt;tt&gt;STDIN_FILENO&lt;/tt&gt;. А вот с &lt;tt&gt;strdup&lt;/tt&gt; пришлось повозиться.&lt;/p&gt;
&lt;p&gt;Сначала я, разумеется, сделал свою реализацию — там всего-то три строки и заменил все вызовы на неё. Но мне показалось, что это слишком простое решение. А когда я программирую для души, мне хочется либо чему-то поучиться, либо сделать всё позамороченнее.&lt;/p&gt;
&lt;p&gt;Первым делом пошёл на поклон к «ЧатГПТ», спросил совета. Советы не заработали, но дали направление мысли.&lt;/p&gt;
&lt;p&gt;Первая мысль была забахать макрос, который заменял бы собой &lt;tt&gt;strdup&lt;/tt&gt; в проблемном компиляторе, а остальные не трогал. Тут надо сказать, что под «Виндой» далеко не во всех наборах утилит компиляторы не содержат функцию &lt;tt&gt;strdup&lt;/tt&gt;, например в &lt;tt&gt;msys2&lt;/tt&gt; она есть.&lt;/p&gt;
&lt;p&gt;Мне хотелось как-то отличать между собой обычный &lt;tt&gt;mingw&lt;/tt&gt; без &lt;tt&gt;strdup&lt;/tt&gt; от того, который внутри &lt;tt&gt;msys2&lt;/tt&gt;. «ЧатГПТ» тут не помог, хоть и подсунул несколько макросов на пробу, которых в действительности не существует.&lt;/p&gt;
&lt;p&gt;Пришлось пошарить по исходникам. Оказалось, есть ряд макросов, которые присутствуют в &lt;tt&gt;msys2&lt;/tt&gt;, но отсутствуют в &lt;tt&gt;msys&lt;/tt&gt;. Из них я выбрал &lt;tt&gt; __MINGW64_VERSION_MAJOR&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;#if defined(__MINGW32__) &amp;amp;&amp;amp; !defined(__MINGW64_VERSION_MAJOR)
#define strdup(s) (__extension__({ const char* __s = (s); size_t __l = strlen(__s) + 1; char* __d = (char*)malloc(__l);\
__d ? (char*)memcpy(__d, __s, __l) : nullptr; }))
#endif&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Тут используется расширение, которое позволяет писать многострочные макросы. Хотя этот вариант мне и нравится, но опять используется не нормальный Си++, а расширение компилятора.&lt;/p&gt;
&lt;p&gt;Вторая мысль, на которую меня навела нейросеть — использовать слабые символы языка Си++. Это совершенно новая для меня штука, поэтому нужно небольшое пояснение. Прежде всего для меня же, чтобы я в будущем не забыл что это вообще такое.&lt;/p&gt;
&lt;p&gt;Если упрощать, то символы — это экспортируемые именованные сущности. Те, что какой-то модуль может отдать во внешнее пользование. Если символ «сильный», то его имя никто не может занять, такой код просто не соберётся — компилятор скажет, что существует два символа с одним именем, а если он «слабый», то его можно заменить.&lt;/p&gt;
&lt;p&gt;Слабые символы используются для библиотек, чтобы пользователь мог заменить некоторые сущности, если они его не устраивают.&lt;/p&gt;
&lt;p&gt;Если перевернуть ситуацию, и считать мой код библиотекой, а тот код, где должна быть определена &lt;tt&gt;strdup&lt;/tt&gt; основным, то всё должно получиться.&lt;/p&gt;
&lt;p&gt;«ЧатГПТ», к сожалению, помочь не смог, — сначала подсовывал нерабочий код, а потом зациклился в своих советах. Поэтому пришлось разбираться самостоятельно.&lt;/p&gt;
&lt;p&gt;Всё оказалось не так уж и сложно. Сначала в заголовочном файле определяем прототип функции:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;#ifdef __MINGW32__
char *strdup(const char *s1);
#endif&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Я его спрятал под условие, чтобы мой редактор перестал ругаться на избыточное определение, но всё работает и без этого.&lt;/p&gt;
&lt;p&gt;Потом в самом коде создаём слабый символ для &lt;tt&gt;strdup&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;#ifdef __MINGW32__
#pragma weak my_strdup
char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = (char *) malloc(len);
    return s == nullptr ? nullptr : (char *) memcpy(s, src, len);
}
#endif&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Слабый символ я определяю через директиву &lt;tt&gt;#pragma weak&lt;/tt&gt;, у которой надо указать имя слабого символа, причём оно должно отличаться от имени функции. Я пока не до конца понял зачем это нужно делать, но без этого не работает.&lt;/p&gt;
&lt;p&gt;Кстати, &lt;tt&gt;#pragma weak&lt;/tt&gt; тоже расширение, но оно легко заменяется на атрибут &lt;tt&gt;weak&lt;/tt&gt;, надо только будет изучить его синтаксис, я не успел этого сделать.&lt;/p&gt;
&lt;p&gt;На имя &lt;tt&gt;my_strdup&lt;/tt&gt; у меня ругается редактор — говорит, что слабый символ нигде не определён, поэтому я опять же засунул всё это в условную компиляцию.&lt;/p&gt;
&lt;p&gt;В выходные, как всегда, есть куча дел, кроме хобби, поэтому до конца я разобраться не успел и буду рад, если кто-то из читателей прояснит это место. Если нет, поищу на досуге информацию в интернете.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Дополнено&lt;/i&gt;: в итоге все ситуации я побороть не смог и откатился на самое простое решение со своей собственной реализацией &lt;tt&gt;strdup&lt;/tt&gt;.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: новости</title>
<guid isPermaLink="false">118628</guid>
<link>https://bolknote.ru/all/gopnik-2-novosti/</link>
<pubDate>Fri, 21 Apr 2023 20:57:37 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-novosti/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Может показаться, что после &lt;a href="https://bolknote.ru/all/gopnik-2-versiya-1-24/"&gt;релиза&lt;/a&gt; «Гопника-2» я игрой больше не занимался, так как ничего про неё не пишу.&lt;/p&gt;
&lt;p&gt;Как можно догадаться по этой заметке, это не так. За последнее время я исправил несколько незначительных багов и реализовал кое-что из своих планов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.04.21@2x.jpg" width="1000" height="426" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Новая штука в игре — шокер, можно бить противника током&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Я долго не понимал как во внутреннем АПИ игры формируются прайс-листы, но теперь разобрался и сделал, как и планировал, на новой станции «Чёрная речка» ларёк. В нём можно покрепиться семечками и шавермой (мы же в Питере), а так же купить батарейки для шокера — нового игрового предмета.&lt;/p&gt;
&lt;p&gt;Шокер может вывалиться из одного из неигровых персонажей и немного оживляет бои, а то они очень уж скучные.&lt;/p&gt;
&lt;p&gt;Думаю добавить в ларёк ещё пару предметов, а так же новую локацию. Так как пока не уверен стоит ли её добавлять, не буду писать какую. После всех добавлений выпущу следующий релиз.&lt;/p&gt;
&lt;p&gt;В общем, игру потихоньку развиваю, хоть фантазия мало-помалу и иссякает. Попытался найти какие-то материалы по субкультуры гопников, чтобы вдохновиться, но если честно, по этой теме найти что-то стоящее непросто.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: версия 1.24</title>
<guid isPermaLink="false">118461</guid>
<link>https://bolknote.ru/all/gopnik-2-versiya-1-24/</link>
<pubDate>Mon, 17 Apr 2023 22:40:33 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-versiya-1-24/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;У меня тут небольшая веха в игре «Гопник-2» — вышел первый релиз, который я считаю стабильным. По этому поводу я даже собрал бинарники под все основные платформы. Для тех, кто не боится качать запускаемые файлы из интернета, &lt;a href="https://github.com/bolknote/gopnik2/releases/tag/1.24"&gt;выложил&lt;/a&gt; их на странице релиза.&lt;/p&gt;
&lt;p&gt;Там универсальный бинарник под МакОС и статически собранные файлы под 64-битные «Виндоуз» и «Линукс». Ссылка для скачивания выше, а ниже скриншот, в нём ссылки не работают.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.04.17.1@2x.jpg" width="1000" height="557" alt="" /&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>«Гопник-2»: теперь «Андроид»</title>
<guid isPermaLink="false">118386</guid>
<link>https://bolknote.ru/all/gopnik-2-teper-android/</link>
<pubDate>Fri, 14 Apr 2023 15:59:57 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-teper-android/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;В полку не совсем обычных платформ, где я попробовал собрать «Гопника-2», прибыло. В этот раз, пока обедал, листал экраны на смартфоне и взгляд упал на терминал &lt;i&gt;Termux&lt;/i&gt;, который я когда-то ставил, чтобы иметь возможность зайти экстренно куда-нибудь по работе.&lt;/p&gt;
&lt;p&gt;Решил попробовать скомпилируется ли. В принципе проблем почти не возникло. Всё необходимое поставил командой &lt;tt&gt;pkg install make clang git&lt;/tt&gt;, после чего выписал проект и поправил путь до заголовочного файла — в «Андроиде» он находится в другом месте.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.04.14.1@2x.jpg" width="1000" height="1127" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Так выглядит запущенный «Гопник-2», запущенный в терминале &lt;i&gt;Termux&lt;/i&gt; под «Андроидом»&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Правки в репозиторий внёс, теперь всё будет собираться ещё и под «Андроид». Проверять в будущем я не буду, вряд ли кто-то будет собирать для себя, но проверить было интересно.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: фан-клуб</title>
<guid isPermaLink="false">118351</guid>
<link>https://bolknote.ru/all/gopnik-2-fan-klub/</link>
<pubDate>Thu, 13 Apr 2023 23:27:09 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-fan-klub/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Тем временем, у игры «Гопник-2», с которой я вожусь почти каждый день в последнее время, отрос небольшой фан-клуб. Самый заметный его участник, &lt;i&gt;bairog&lt;/i&gt;, прошёл всю игру вдоль и поперёк, завёл мне десяток багов, которые я постепенно исправил и даже начал писать игре &lt;a href="https://github.com/bolknote/gopnik2/issues/11"&gt;краткое описание&lt;/a&gt;. За что ему огромное спасибо!&lt;/p&gt;
&lt;p&gt;Когда будет готово, надо будет это должным образом оформить, снабдить скриншотами и перенести в вики проекта.&lt;/p&gt;
&lt;p&gt;В принципе уже почти всё готово, но кое-что хочется ещё дописать — &lt;a href="https://bolknote.ru/all/gopnik-komanda-run/"&gt;пресловутый ларёк&lt;/a&gt;, сохранение перед выходом, работу с несколькими сохранениями. Остальное, вроде, всё уже дописано и поправлено.&lt;/p&gt;
&lt;p&gt;Надо бы поторопиться, а то бесплатная лицензия на среду разработки кончится в начале мая, не так много времени осталось, дальше разрабатывать будет сложнее.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: разные mingw</title>
<guid isPermaLink="false">118045</guid>
<link>https://bolknote.ru/all/gopnik-2-raznye-mingw/</link>
<pubDate>Sat, 08 Apr 2023 17:51:32 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-raznye-mingw/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Надо по-быстрому дописать посты про портирования игры на «Виндоуз», пока свежо в памяти. Так что продолжу.&lt;/p&gt;
&lt;p&gt;Сильнее всего меня удивило в процессе, что поведение &lt;tt&gt;mingw&lt;/tt&gt;, — инструментария для компиляции приложений под «Виндоуз», различается под разными операционными системами.&lt;/p&gt;
&lt;p&gt;Поскольку мне не хотелось заморачиваться с установкой софта на виртуальную машину, я развернул &lt;tt&gt;mingw&lt;/tt&gt; у себя под «Маком» и внёс правки, чтобы всё благополучно компилировалось именно на этой ОС.&lt;/p&gt;
&lt;p&gt;Запустив получившееся на первой попавшейся виндовой виртуалке, я успокоился. Но &lt;a href="https://github.com/bolknote/gopnik2/issues/4"&gt;оказалось&lt;/a&gt; этого недостаточно — под самой «Виндоуз» приложение не собиралось!&lt;/p&gt;
&lt;p&gt;Во-первых, под «Виндой» отсутствовала функция &lt;tt&gt;strdup&lt;/tt&gt;, интернет ничего не подсказал, но я случайно решил эту проблему, установив стандарт языка в &lt;i&gt;GNU C++11&lt;/i&gt;: &lt;tt&gt;-std=gnu++11&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Во-вторых, почему отсутствовали-то ряд важных констант. Cледуя совету на «Стековерфлоу», я просто определил их нужными значениями.&lt;/p&gt;
&lt;p&gt;В-третьих, функцию &lt;tt&gt;usleep&lt;/tt&gt; пришлось заменить на &lt;tt&gt;Sleep&lt;/tt&gt; из &lt;tt&gt;windows.h&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;После этих правок игра начала собираться под «Виндой» тоже.&lt;/p&gt;
&lt;p&gt;Недавно прочитал в одной из статей на Хабре, что «язык Си++ достаточно сложен, чтобы позволить нам писать на нём просто», как же это верно! Неожиданно много времени занимает борьба с какими-то вещами, которые, как мне кажется, должны просто работать.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2» на Haiku</title>
<guid isPermaLink="false">118032</guid>
<link>https://bolknote.ru/all/gopnik-2-na-haiku/</link>
<pubDate>Fri, 07 Apr 2023 20:02:01 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-na-haiku/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;В 2000-е у меня был друг, который фанател от «&lt;i&gt;BeOS&lt;/i&gt;». Послушать его, так это лучшая система на Земле, где всё сразу продумано, нет родовых травм и легаси. Судя по деталям, которыми он сыпал в своих рассказах, во многом так и было, — многие вещи, которые бесили в других операционках, там были сделаны на удивление хорошо.&lt;/p&gt;
&lt;p&gt;К сожалению, компания, которая её писала, приказала долго жить, передала исходный код сообществу, которое до сих пор потихоньку пилит его уже под новым именем — &lt;i&gt;Haiku&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;А мне тут что-то до того понравилось водружать «Гопника» на всё новые и новые операционные системы, что я решил пока не останавливаться, и, порывшись в памяти, вспомнил про &lt;i&gt;BeOS&lt;/i&gt;, установил себе на виртуалку &lt;i&gt;Haiku&lt;/i&gt; и попробовать собрать игру.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.04.07.1@2x.jpg" width="1000" height="625" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;«Гопник-2», запущенный под &lt;i&gt;Haiku&lt;/i&gt; (наследницей &lt;i&gt;BeOS&lt;/i&gt;), собралось без правок, но с приключениями&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Сразу у меня это сделать не получилось, но по ошибкам я догадался, что не хватает кое-каких библиотек. Полдня я пытался найти ответ в интернете или при помощи &lt;i&gt;GPT&lt;/i&gt;, а потом обратился к живым людям в профильные чаты. За несколько итераций решение нашлось.&lt;/p&gt;
&lt;p&gt;Вот как выглядит рецепт компиляции и запуска:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;pkgman install gcc make haiku_devel
git clone https://github.com/bolknote/gopnik2.git
cd gopnik2
make
./gop2&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Нужные мне библиотеки лежали, как оказалось, в пакете &lt;tt&gt;haiku_devel&lt;/tt&gt;, сложно было догадаться, хорошо, что нашлись те, кто смог подсказать.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: UTF-8</title>
<guid isPermaLink="false">118020</guid>
<link>https://bolknote.ru/all/gopnik-2-utf-8/</link>
<pubDate>Fri, 07 Apr 2023 13:33:31 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-utf-8/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Продолжаю писать про портирование «Гопника-2» под «Виндоуз», ибо там ещё есть о чём рассказать.&lt;/p&gt;
&lt;p&gt;Я уже очень давно не работаю под этой операционной системой, поэтому некоторые обычные, возможно, для многих вещи для меня являются открытием. Когда я начинал процесс портирования игры под эту платформу, я был уверен, что столкнусь в трудностями совершенно в других частях кода. Одной из неожиданностей была плохая работа «Виндоуз» с кодировкой ЮТФ-8.&lt;/p&gt;
&lt;p&gt;Если вывод в консоль &lt;a href="https://bolknote.ru/all/gopnik-2-adaptaciya-pod-windows/"&gt;удалось победить&lt;/a&gt; сравнительно легко, то со вводом возникли проблемы — вызов &lt;tt&gt;SetConsoleCP(CP_UTF8)&lt;/tt&gt;, который должен был помочь, не помог. В интернете пишут, что он, по всей видимости, не реализован — просто не делает ничего.&lt;/p&gt;
&lt;p&gt;Если с латинскими буквами проблем не возникает, они кодируются одним байтом, это ничем не отличается от того как программы до этого работали десятилетиями, а вот с русскими буквами беда — для них требуется два байта и в таком виде Виндоуз их не понимает.&lt;/p&gt;
&lt;p&gt;Рекомендуемый специалистами способ — переключить консоль в режим ввода кодировки ЮТФ-16, а потом перекодировать полученную строку в нужную кодировку. «Виндозу» ЮТФ-16 родная, поэтому проблем вообще никаких не возникает.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;#ifdef __MINGW32__
        int wlen = 100;
        int save = _setmode(_fileno(stdin), _O_U16TEXT);
        wchar_t *wstr = (wchar_t *) malloc(wlen * sizeof(wchar_t));
        fgetws(wstr, wlen, stdin);

        int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, 0, 0, 0, 0);
        user_name = (char *) malloc(len);
        WideCharToMultiByte(CP_UTF8, 0, wstr, -1, user_name, len, 0, 0);
        _setmode(_fileno(stdin), save);

        free(wstr);
#endif&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Мне, к счастью, ввод русских букв нужен только в одном месте — там где игрок вводит своё имя. Я убрал используемую там функцию &lt;tt&gt;fgets&lt;/tt&gt; под условную компиляцию и вставил кусок, который выше. С таким исправлением всё заработало, как ожидается.&lt;/p&gt;
</description>
</item>


</channel>
</rss>