О5 25
Опять заболел — вчера ночью почувствовал, что начинает болеть горло, но несмотря на шаманство с фурацилином, всё равно свалился в болезнь. На работе очень многие болеют, друзья тоже пишут, что регулярно заболевают. Что за зараза такая ходит — непонятно.
Мы в эти выходные с дочкой остались вдвоём — жена уехала на конференцию. Тяжеловато в болезнь делать всё по дому, гулять с собакой, укладывать дочку спать, не знаю как люди в старости справляются. По моим представлениям старость примерно так и выглядит — как будто у тебя перманентная слабость на фоне болезни.
Дочь пообещала заботиться — принести стакан воды и нашлёпать бутербродов, если будет совсем плохо. Но пока до таких крайних мер не дошло.
Сегодня она в первый раз пойдёт в «Дашку», — это очень известная в Казани детская
Обидно заболевать к выходным,
«Гопник-2» на Haiku
К сожалению, компания, которая её писала, приказала долго жить, передала исходный код сообществу, которое до сих пор потихоньку пилит его уже под новым именем — Haiku.
А мне тут
Сразу у меня это сделать не получилось, но по ошибкам я догадался, что не хватает
Вот как выглядит рецепт компиляции и запуска:
pkgman install gcc make haiku_devel
git clone https://github.com/bolknote/gopnik2.git
cd gopnik2
make
./gop2Нужные мне библиотеки лежали, как оказалось, в пакете haiku_devel, сложно было догадаться, хорошо, что нашлись те, кто смог подсказать.
«Гопник-2»: UTF-8
Продолжаю писать про портирование
Я уже очень давно не работаю под этой операционной системой, поэтому некоторые обычные, возможно, для многих вещи для меня являются открытием. Когда я начинал процесс портирования игры под эту платформу, я был уверен, что столкнусь в трудностями совершенно в других частях кода. Одной из неожиданностей была плохая работа «Виндоуз» с кодировкой
Если вывод в консоль удалось победить сравнительно легко, то со вводом возникли проблемы — вызов SetConsoleCP(CP_UTF8), который должен был помочь, не помог. В интернете пишут, что он, по всей видимости, не реализован — просто не делает ничего.
Если с латинскими буквами проблем не возникает, они кодируются одним байтом, это ничем не отличается от того как программы до этого работали десятилетиями, а вот с русскими буквами беда — для них требуется два байта и в таком виде Виндоуз их не понимает.
Рекомендуемый специалистами способ — переключить консоль в режим ввода кодировки
#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Мне, к счастью, ввод русских букв нужен только в одном месте — там где игрок вводит своё имя. Я убрал используемую там функцию fgets под условную компиляцию и вставил кусок, который выше. С таким исправлением всё заработало, как ожидается.
Ориентирование на местности
А вот, кстати, в старом диафильме знание, которое меня выручило
В какой стороне света находится дорога я знал, — смотрел перед поездкой карту, у меня она неплохо оседает в памяти.
История смотрелась бы выигрышнее, если бы у меня тогда сел смартфон, но нет, с зарядом было всё в порядке.
Программист отдыхает
Удивительный факт: если художник выходит на пленэр, чтобы порисовать для души, все
Думаю, проблема в том, что в восприятии большинства, программист — это
На самом деле это не так. Тут, как и во многих профессиях, есть рутина, а есть творчество, хотя первого так много, что большинство программистов всю жизнь занимаются только рутиной.
Мне кажется, что домашний проектик, — важная часть душевного равновесия.
Ну и вообще, что странного в том, чтобы вне работы от души поковыряться в том, в чём ты спец? Автомеханик, восстанавливающий
Не блог
Кажется слово «блог» сейчас плотно захвачено теми, кто делает контент. Когда говоришь, что у тебя есть блог, в среднем люди ожидают, что ты попадаешь
Я об этом давно задумался, но окончательно понял что с этим делать, когда один знакомый, заглянув ко мне на сайт, в изумлении воскликнул: «а зачем ты написал про стельки?».
Тогда я понял, что слово «блог» использовать нельзя. У меня не блог и я не блогер — слишком много на эти слова сейчас наверчено новых смыслов. Это у меня «сайт» или «дневник». Дневник, кстати, я веду с 1989 года, в следующем году будет 35 лет.
Дополнено: в комментариях прекрасный пример того, как человек не понимает почему он ко мне пришёл, а я его не развлекаю.
Опять аллергия
Весна в этом году чудо, как хороша — очень тепло для апреля, птички поют, травка пробивается, снега почти не видно. К сожалению, с момента переезда в Казань я стал аллергиком и каждую весну мучаюсь — пытаюсь подобрать препарат, который будет действовать на меня в этом сезоне.
Не знаю что у меня за аллергия такая странная, несколько лет назад обращался к дорогущему аллергологу, ничего не прояснилось, но каждый сезон одно и то же — иду в аптеку и по одному перебираю препараты. В этом году начал с «Эриуса», пока мимо — не работает.
К счастью, есть супрастин, который действует всегда, к несчастью, от него я туплю и очень хочется спать. До обеда я
«Всё вокруг колхозное, всё вокруг моё…»
Около двадцати лет назад, когда я совладел «Казанским порталом», мы задумали его прорекламировать, разместив адрес на билбордах нашего города. Тогда это было свежо — никто так ещё не делал.
Выбрали простую подачу — два сочных цвета, купили хороший, толстый натяжной материал, чтобы всё напечатать. Каждую неделю или две, не помню точно, мы меняли дислокацию нашей рекламы — так создавалось впечатление, что ей завешан весь город.
Через некоторое время наша реклама исчезла — её просто не оказалось на том месте, где она должна висеть. Наверное мы потом заказали другую, не помню, да и неважно, интересно другое.
Через некоторое время нашу рекламу горожане снова увидели, но уже без нашего участия,— на крыше домика
Двадцать лет прошло, ничего не меняется. В обед я люблю ходить по остаткам старой Казани, а это как раз частный сектор, в основном, то тут, то там видишь кирпичи, укрытые чужими баннерами,
ChatGPT-4 vs. Chat X-Colleagues
Раз у меня нарисовалась задача, где я довольно мелко плаваю, было бы логично протестировать на нём возможности
Я сегодня уже рассказывал о своём опыте в Си и Си++. Результаты там, можно прямо сказать, не ошеломляющие, но на этом экспериментировать я не бросил. У меня родилась ещё одна идея.
У программ на Си и Си++ часто есть так называемый «сборочный файл», это инструкции на специальном языке, описывающие последовательность компиляции сложных программ.
В проекте
Хорошо, но недостаточно, чтобы дописать секцию mingw, где у меня бы переопределялись флаги компилятора и его название. С задачей я справился, но решение мне не нравилось.
В итоге, я провёл следующий эксперимент: открыл два чата: бывших коллег (несмотря на то, что я уже одиннадцать лет не работаю в «Яндексе», мы достаточно интенсивно общаемся) и
Люди выиграли с огромным перевесом: нейросеть уносила иногда в неведомые дали, она видела ошибки там, где их нет и не замечала мест с явно неправильно написанными кодом. В итоге, мне удалось наводящими вопросами вывести её на правильное решение, но хорошим результатом это не назвать.
Вывод такой: программистов
«Гопник-2»: буферизация
Как я писал уже сегодня, мне пришлось вчера выключить буферизацию вывода, так как текст визуально «застревал» на экране. Добавление fflush проблему решало, но не будешь же выставлять этот вызов везде, где есть вывод, это несколько сотен мест.
В общем, вчера я сделал попроще, а сегодня пришла в голову более удачная идея обернуть printf в макрос:
// включаем буферизацию вывода
setvbuf(stdout, nullptr, _IOFBF, 1000);
// делаем макрос со сбросом буфера
#define PRINTF(...) { printf (__VA_ARGS__); fflush(stdout); }Работает просто отлично, вывод текста стал выглядеть комфортно.
«Гопник-2»: адаптация под Windows
В итоге, вчерашняя мысль адаптировать
Несмотря на то, что «Чат» у меня последней, четвёртой версии, всё равно, даже на простых примерах он допускает совершенно детские ошибки, — не подключает нужные заголовочные файлы (мы программировали на Си), упускает важные части.
На скриншоте у меня как раз такой пример — он не скомпилируется
Вот как в итоге стал выглядеть этот кусок после нескольких уточняющих вопросов и гуглежа:
#ifdef __MINGW32__
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
if (echo) {
mode &= ~ENABLE_ECHO_INPUT;
} else {
mode |= ENABLE_ECHO_INPUT;
}
SetConsoleMode(hStdin, mode);
int ch = _getch();
if (ch == 0x03) // Ctrl+C
{
printf("Ctrl+C hit, exiting...\n");
gracefulexit();
}
return ch;
#endifКак бы то ни было, с помощью нейросетей
#ifdef __MINGW32__
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
setvbuf(stdout, nullptr, _IONBF, 0);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(handle, &mode);
SetConsoleMode(handle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
#endifПришлось полностью выключить буферизацию, чтобы нормально отрабатывал printf с
Насколько я понял то, что написано в интернете, у консоли Виндоуз до сих пор большие проблемы с кодировкой
Из заметных багов — игра падает при попытке загрузки сохранения и совсем не работает ввод русских букв. Второе мне нужно только одном месте (где запрашивается ввод имени игрока), так что есть надежда это починить. Остальное как будто работает.
Гепатит в таблетках
Век живи, век учись, дураком помрёшь.
Подумал, что это ошибка, но решил погуглить. Оказывается, гепатит — это воспалительный процесс в печени, не обязательно вирусной этиологии. От лекарственных средств может развиться токсический гепатит, но вообще там много видов.
В общем, новый, увлекательный мир гепатитов. Не дай бог
«Гопник-2»: попробовал под Windows
В моём иррациональном увлечении дописыванием «
Стало интересно посмотреть — соберётся ли игра под Виндоуз. В конце концов она консольная, чего бы ей не заработать?
Раньше я таким не занимался, но из виндового прошлого я помню, что способы есть. Простых нагуглилось два — среда cygwin и набор инструментов mingw.
Через cygwin всё скомпилировалось и запустилось вообще без проблем, но у такого решения есть фатальный недостаток — собирать приходится в виртуальной машине с Виндоузом.
Набор mingw выглядит с этой точки зрения интереснее — есть и под мой «Мак», но там нет совместимости с «посикс», поэтому часть работы с терминалом не собралась, — проблемы с функциями tcsetattr и tcgetattr. Меня теперь так и подмывает отложить в сторону все планы и попробовать затащить игру ещё и Виндоуз, переписав эти два места.
Кстати, надо не забыть попробовать это сделать через ChatGPT. Я уже делал с ним несколько «подходов к снаряду», но каждый раз опыт был не очень. Например, пытался разобраться с тем как работать io_uring, рабочий пример так и не удалось получить. Но сейчас вышла новая версия, можно попробовать ещё раз.
Переходим все на Brainfuck
Меня тут атакуют время от времени алармистки настроенные программисты, с вопросом что дальше делать, — ведь их всех скоро заменит ChatGPT. Так вас же ещё
Лично я услышал Грефа, и вот уже шесть лет как переписываю все свои проекты на язык «Брейнфак». Это минималистичный язык, состоящий из шести операторов, при этом он полный по Тьюрингу.
Прелесть его в том, что он плохо токенизируется — у него совершенно другая структура, поэтому генеративные нейросети не умеют писать на нём программы. Даже хвалённая четвёртая версия ChatGPT, которая вышла недавно, не умеет на нём и двух знаков связать.
Коллеги, если мы успеем тайно переписать все свои проекты на «Брейнфак» в ближайшее время, то для поддержания всех переписанных на него проектов, понадобятся живые программисты! У нас будет работа! Никого не уволят! Так победим!
«Гопник-2»: итог выходных
Человек предполагает, а череда неконтролируемых случайностей располагает. Я думал, что все выходные буду тихонечко пилить список запланированных изменений в игре, а на деле пришлось править совсем другое.
Без особой надежды на успех, я закидываю игру своим друзьям и знакомым, и хотя фанклуб игры не обогатился новыми членами, тем не менее небольшую пользу эту принесло — оказалось, что предыдущий автор недостаточно аккуратно ставит атрибуты консоли и в некоторых случаях не возвращает их обратно.
Например, у одной моей подруги, которой я прислал «Гопника», программа «Терминал»
Кстати, я не знал какой у неё «Макбук» — на процессоре «Интела» или «Эпла», поэтому пришлось научиться делать так называемые «универсальные бинарники».
Это несложно: компилируем программу дважды, сначала — под «интел» (-target x86_64), потом — под «эпл» (-target arm64-apple-macos11), после чего собираем оба бинарника в один:
lipo gop2-x86 gop2-arm -create -output gop2-universalНо это всё не беда, а так, развлечение на полчаса, проблема, над которой я просидел часть субботы, хуже — в моём коде не работало сохранение и восстановление инвентаря.
Автор первой попытки портирования игры из ДОСа в Линукс
В общем, нашёл нужную структуру, написал код, который работает с ней без затей, — сохраняет и восстанавливает как есть, вместе с указателями на строки, которые потом обрабатываются дополнительно.
fread(&inv_amount, sizeof(inv_amount), 1, load_file);
inv = (inventory *) malloc(sizeof(inventory) * inv_amount);
fread(inv, sizeof(inventory), inv_amount, load_file);
for (int i = 0; i < inv_amount; i++) {
size_t len;
fread(&len, sizeof(len), 1, load_file);
inv[i].name = (char *) malloc(sizeof(char) * len);
fread(inv[i].name, sizeof(char), len, load_file);
}Эти указатели — по сути мусор, но один файл игры занимает сотни байт, а у меня нет всего времени Вселенной, чтобы экономить на спичках.
В общем, из задуманного не сделал ничего, зато поправил некоторые вещи поважнее.
Цирк кошек Куклачёва
В позднем СССР, наверное, нельзя было найти ребёнка, который не знал бы цирк кошек Куклачёва, — его постоянно показывали по телевизору. Поэтому в детстве у меня была мечта, без надежды на осуществление, — попасть хоть раз на представление этого цирка.
Без надежды, потому что Куклачёв был настоящей звездой, выступал в Москве и крупных городах, куда я в детстве не ездил, а в мой родной маленький Лениногорск он приезжать бы не стал.
Сейчас тот самый Куклачёв уже не выступает, дело продолжает его сын, тем не менее, фамилия Куклачёвых до вчерашнего дня мне казалась цирковым брендом, показателем качества.
Нельзя сказать, что та детская мечта во мне осталась, но когда куклачёвский цирк приехал в Казань, я решил показать дрессированных кошек дочке, да и самому посмотреть — не всколыхнёт ли во мне
Выступление всколыхнуло, но не ностальгию, а другое чувство — испанского стыда. До антракта кошки на сцене были для мебели — почти статично
Не знаю чему тут было смеяться, но мне симпатизировать криминалу совсем не хочется, я уже
Очень отрадно, что дочку это тоже не веселило, — она хотя и смотрела внимательно, но высматривала, в основном, кошек и собак на сцене, а не как один заслуженный артист бьёт лестницей по яйцам другому. Впрочем, в зале многие смеялись.
К счастью, после антракта формат сменился, — на передний план вышли дрессированные животные, так что я почти смирился, что заплатил за это дерьмо 2000 рублей за билет.
Дочке представление понравилось. Счастливое время детство — даже не замечаешь
Артак-спартак
В прошлом году у нас в городе построили второй
Дома написал небольшую программу на «Пайтоне», чтобы раскодировать, получилась надпись «ARTAKSPARTAK». Явно
Интернет тоже ясности не принёс, может
str = '01000001010100100101010001000001010010110101\
0011010100000100000101010010010101000100000101001011'
from textwrap import wrap
print(''.join(chr(int(x, 2)) for x in wrap(str, 8)))
«Гопник»: команда «run»
У меня тут дописывание второй части «Гопника» превратилось их хобби в серьёзный геймдев прям! На трекере завели уж два бага и, пока дочка смотрела на проекторе еженедельный мультик, поправил оба.
Помимо багов, которые я одной рукой добавляю, а другой исправляю, немного совершенствую и саму игру. Даже на самом простом уровне она, похоже, чересчур сложная, поэтому я портировал в неё команду «run» из предыдущей части — там она помогала сбежать, если в драке пришлось слишком туго.
У меня «run» появляется только на простом уровне и сбежать удаётся не всегда, — шансы начинаются с 50% и постепенно растут до 75 с ростом удачи (в игре есть такой параметр). Сбежать не получится, если сломана нога, а если сбежать во время стрелки, упадёт понтовость, когда она падает до нуля, братва перестаёт за тебя впрягаться в драках.
В ближайших планах небольшие усовершенствования:
- если не удалось сбежать, надо научиться пропускать ход в драке с противником;
- в файл сохранения в данный момент не записывается состояние ремонтируемой станции;
- надо, наконец, добавить ларёк со всякой снедью.
Есть чем заняться в ближайшие выходные, у меня, вроде, образовалось свободное время.
Два вида таксистов
Таксисты делятся на два вида: одни после фразы «вот здесь, пожалуйста» тут же останавливаются, как вкопанные, вторые проезжают ещё несколько метров. Никак не получается подгадать момент, чтобы выйти там, где хочется.
Интерфейс «умного» сиденья для унитаза
Кажется я неплохо умею включать «режим интерфейсного идиота», — пригождается, когда пытаешься найти огрехи программных продуктов, которые мы выпускаем. Мне он так нравится, что я иногда большую часть времени смотрю на любые интерфейсы из этого режима.
Тем не менее, я довольно быстро разбираюсь и в запутанных, нелогичных интерфейсах, если переключаю мозги на «повышенные обороты».
Но иногда мне попадаются задачки, которые мне не по зубам. С одной из них я сталкиваюсь почти каждый день дома — это режимы биде «умного» сиденья «AM·PM» для унитаза.
На нём есть рычажок, который включает один из двух режимов — помыть попу или место рядом, второй режим, очевидно, для женщин. Я никак не могу запомнить где какой. Значки, которые там нарисованы, только всё запутывают, как их трактовать — непонятно, то есть понятно, что варианта два, но они подходят к каждому из них.