auto в Си и Си++

Из-за дикой перегруженности фичами мне никогда не нравился язык Си++. До увлечения игрой «Гопник-2» никогда на нём не программировал, но нужда заставила. Тянет с ней повозиться, а она написана на смеси Си и Си++, правда с упором на Си.

Несмотря на неприязнь к Си++, всё-таки не могу не отметить, что местами на нём программировать куда проще, чем на Си. К сожалению, для того чтобы использовать реально полезные вещи, — нормальные строки или управление памятью, пришлось бы в игре многое переписать, но какие-то мелочи выручают и без переписывания кода.

Одна из таких мелочей — ключевое слово auto. Оно есть и в Си, но значение у него совершенно другое, в современном коде, как будто бы, его использовать негде.

В Си++ оно означает автоматический вывод типа, вместо его явного указания. Клёвая штука, позволяет делать например такое (пример из кода «Гопника-2»):

auto old_mode = set_tty_special_mode();
// тут какой-то код
restore_tty_mode(old_mode);

Фишка тут в том, что у set_tty_special_mode и restore_tty_mode две реализации — под «Виндоуз» своя. Эти две реализации работают с разными типами, под «Виндоуз» там DWORD, в остальных случаях — структура termios.

В Си было бы что-то вроде:

#ifdef __MINGW32__
#typedef DWORD terminal_mode
#else
#typedef struct termios terminal_mode
#endif

terminal_mode old_mode = set_tty_special_mode();
// тут какой-то код
restore_tty_mode(old_mode);

А в Си++ можно просто поставить auto и обойтись без шаблонного кода. Очень хочется иметь такую клёвую примочку и в Си.

4 комментария

Самокатное

Два дня ездил на работу и с работы на арендованном самокате, — учитывая пробки и погоду, так быстрее и приятнее. Был неприятно поражён разнообразием зон ограничения скорости — на небольшом участке она может прыгать туда-сюда несколько раз.

Я так понял, это некая забота о пешеходах, не зря же на карте арендного приложения в этих местах расположены «пешеходные зоны». Беда в том, что тот, кто их вводил, сам, похоже, на самокате не ездит. Так как скорость арендованных самокатов сильно зарезана, я всегда езжу с ручкой «газа» открытой до упора. Не знаю никого, кто бы делал иначе — ровный «газ» держать просто бессмысленно.

В таком положении резкое увеличение скорости при выезде из пешеходной зоны может быть просто опасным — ты этого совсем не ожидаешь, а звуковой сигнал, который подаёт самокат, не всегда даёт достаточно времени, чтобы скинуть скорость.

Пока я ни в кого не врезался и надеюсь избегать этого и в будущем, но очень неприятно, что приходится ехать по этим зонам в постоянном напряжении.

13 комментариев

Неубиваемые вещи

На закрытом форуме «Вастрика» два года назад появился очень полезный тред «Неубиваемые вещи», где люди рассказывают про всякие штуки, которые служат годами без особого ущерба. При этом важно, чтобы эти штуки можно было купить, то есть сделанное собственными руками или старинное не подходят.

Я этот тред как-то упустил, но недавно он снова всплыл и я его проштудировал целиком. Хотя большинство предметов там мне неактуально, кое-что всё-таки себе выписал. Буду постепенно покупать и тестировать.

Черная прямоугольная разделочная доска с ручкой и четырьмя латунными заклепками на светлом деревянном столе.
Купили две такие доски, только вторая побольше, они проходят как сервировочные, но мы их используем как разделочные

Первым номером купил две доски Epicurean для кухни, — у нас как раз не осталось ни одной годной, хорошая развалилась в посудомойке, а на остальные без слёз не глянешь, пора менять.

Доски Epicurean делаются из того же материала, что покрытие скейтпарков, лёгкий, прочный, посудомойка ему нипочём.

Жена очень хвалит, я тоже очень доволен приобретением, пользуемся уже две недели, можем рекомендовать к покупке!

5 комментариев

Бархат

Переписываюсь со вчерашнего с одной мастерской в Кирове, — хочу заказать у них бескаркасное кресло в детскую. Дочка сдружилась с соседской девочкой, они нередко ходят к друг другу в гости, надо организовать какой-то пространство, где можно плюхнуться и поиграть.

Мастерская предложила несколько материалов на выбор — велюр, шенилл или рогожка, и пока я разбирался что это за названия, понял, что не люблю касаться бархата и всего, что на него похоже. Велюр и шенилл, насколько я понимаю, как раз на ощупь, как бархат.

Все эти материалы моментально впитывают воду, руки становятся сухие, от этого мне очень дискомфортно. Ненавижу это чувство пересушенных кончиков пальцев.

7 комментариев

Агриппина Сергеевна Миронова (Макридина)

Не так давно на меня вышла четвероюродная сестра, — нашла меня «Вконтакте». Мы с ней прежде знакомы не были, она меня разыскала по случаю, из интереса к поиску информации о своих предках, — начала искать по фамилиям и вышла на мои заметки.

Позже она дала контакт своей бабушки, с которой мы тоже списались, — в свои 75 бабушка бодро пользуется «Телеграмом».

С ней мы довольно долго говорили о прошлом, она многих из моих предков застала в живых, поэтому очень интересно было узнать какие-то подробности их жизни.

К сожалению, как это обычно и бывает, все воспоминания очень фрагментарны. Выкладывать их как есть мне не очень хотелось, а собрать из них связный рассказ не получалось.

Три пожилые женщины стоят на фоне кустарника: центральная держит два стакана, слева — чайник, справа — бутылку; все одеты в повседневную одежду, выражения лиц спокойные.
В центре моя прабабушка — Агриппина Сергеевна Миронова (бабушка Груня или Груша)

А куда мы идём в 2023-м году, когда нам нужен текст, который мы не можем написать из-за лени или отсутствия таланта? Разумеется к ChatGPT! Закинул в диалог разрозненные цитаты и попросил собрать из них связный текст в «народном» стиле.

После обработки получилось вот такое эссе о семье Макридиных. К этой семье принадлежала моя прабабушка Груня (1895—1968). Она на фотографии в центре снимка.

Когда-то давно, в далекой деревне жила замечательная семья Макридиных. У деда Сергия было много земли и пасека, где они выращивали лён, пшеницу, рожь и ячмень. Они были известны своим умением выращивать урожай и даже экспортировать его за границу.

У Макридиных было своеобразное правило: у них не было постоянных работников, так как в роду было много мужчин, которые помогали на полях. Они нанимали работников только во время срочных работ, таких как посев и уборка. Для этого они приглашали всех желающих мужчин, хорошо их кормили, и тех, кто первым закончит есть, брали на работу. Работников кормили три раза в день и даже платили за их труд. Те, кто не попадал в число нанятых, умоляли Сергия дать им возможность поработать бесплатно, лишь бы трижды хорошо поесть.

Макридины были известны своей мудростью, скромностью и терпением. Они не были многословными, но всегда проявляли доброту и заботу о ближних. Даже воспитание детей было особенным — наказание заключалось в строгом взгляде или просто в том, что не разговаривали с непослушными детьми.

Особенно замечательно было видеть старших Макридиных на праздниках. Они собирались вместе, сидели на печке, и молодые родственники наблюдали, как они красиво пели и плясали под своё пение. Брат Груни, по имени Тимофей Миронов, был особенно талантливым певцом и танцором. Он и его брат Григорий были непревзойденными мастерами русских народных плясок. Их танцы были так великолепны, что даже профессиональные артисты не могли сравниться с ними.

Тимофей был не только талантливым артистом, но и предпринимателем. Он собирал ветошь за копейки и продавал ее на рынке. Он также разводил кур и продавал свежие яйца. Тимофей был известен как мастер торговли и всегда с улыбкой обслуживал своих клиентов.

Учитывая исходный материал, вышло очень хорошо. Надо будет ещё помучать ChatGPT подсказками, поперебирать стили, вполне возможно удастся сделать ещё лучше.

Дополнено: родственные связи в тексте не вычитывал, вполне может быть, что при трансформации текста истина в этом месте пострадала.

Оставить комментарий

Минимально интеллигентный человек

Смотрел тут недавно шуточную сценку «Вступительные экзамены в театральное училище» (1980 год) с Яковлевым, Мироновым и Этушем. Не знаю с какой радости мне её порекомендовал «Ютуб», но рекомендация была верная — зацепило.

В самом начале Миронов рассказывает вступление, цитата оттуда:

…и, значит, для того, чтобы поступить в это театральное училище, нужно прочесть прозу, басню и стихотворение. И действительно, ну в голову не придёт человеку, проходя мимо архитектурного института или бауманского института, увидя тот чудовищный перечень предметов, наук, — ну зайду, попытаю счастья, а вдруг!..

А естественно, так сказать, минимально интеллигентный человек одно стихотворение, одну прозу и одну басню, естественно, знает.

Мне всегда хотелось считать себя хотя бы минимально интеллигентным человеком, но увы мне. Из стихов я знаю «Лиличку!» Маяковского, но ни басни, ни какого завялящего куска прозы на память рассказать не смогу. Тест провален!

4 комментария

«Гопник-2»: версия 1.24

У меня тут небольшая веха в игре «Гопник-2» — вышел первый релиз, который я считаю стабильным. По этому поводу я даже собрал бинарники под все основные платформы. Для тех, кто не боится качать запускаемые файлы из интернета, выложил их на странице релиза.

Там универсальный бинарник под МакОС и статически собранные файлы под 64-битные «Виндоуз» и «Линукс». Ссылка для скачивания выше, а ниже скриншот, в нём ссылки не работают.

Релиз 1.24: исправлен баг с «Чёрной речкой», герой не может драться при побеге, сборка под Android; доступны бинарники для Linux, macOS, Windows и исходники.

Оставить комментарий

Поддельные деньги

Как я уже писал, в субботу ездили с друзьями походить с металлоискателем и самое интересное что нашлось — поддельный полтинник и оттиск советского рубля 1920-х годов. Оттиск у меня в прошлый раз сфотографировать нормально не получилось, да и полтинник был без чистки.

В выходные всё почистил, смазал вазелиновым маслом, чтобы блестело и сфотографировал на подоконнике, пока было утреннее солнце. Кажется вышло достаточно контрастно. Внизу ещё пририсовал инвертированную и увеличенную часть оттиска, где угадывается фраза «РСФСР пролетар…».

Четыре старые монеты на бежевом фоне: 50 копеек 1922 г. со звездой, 20 копеек 1921 г., потертая без надписей и крупная корродированная.
Поддельный полтинник, настоящие 20 копеек, оттиск советского рубля 20-х годов

Рядом положил 20 копеек 1921 года, чтобы было наглядно видно отличие по цвету серебряной и поддельной монеты. Интересно, когда её изготовили, она была похожа на серебряную-то? Потому что сейчас разница очевидна. Ещё непонятно что это за металл. Может какой-то алюминиевый сплав? Если алюминий натереть, то он вполне может сойти за серебро.

Со всех сторон очень любопытная находка, конечно. Надо бы ещё как-нибудь туда наведаться, может ещё что поддельное подниму.

Оставить комментарий

Конный спорт

Как я уже неоднократно писал, дочка и жена — фанаты лошадей. Обе уже несколько лет занимаются конным спортом. Занимаются для души, но несколько месяцев назад тренер решил дал дочке возможность выступить. Выступление прошло без особого старания и, как следствие, успеха.

Еву это неожиданно подстегнуло к занятиям, и сегодня, на втором своём выступлении, она заняла второе место. Говорит, что это лучший день в её жизни.

Девочка в шлеме и желтых сапогах сидит на черном пони, рядом стоит женщина в шлеме; на заднем плане — манеж, зрители и городские здания.
Тренер даёт последние инструкции перед выступлением

Выступила без малейшего волнения, но очень сильно нервничала на вручении, — настолько, что не дождавшись своей фамилии, убежала плакать, думая, что ей ничего не досталось.

Похоже конный спорт из лёгкого увлечения перерос во что-то куда более важное.

Жена, кстати, глядя на дочку, сегодня тоже решила выступить, тоже второе место. У неё всё наоборот — перед выступлением сильно переживала, а про награду даже и не думала, так что медаль стала приятной неожиданностью.

2 комментария

Поддельное серебро

Недаром я на неделе торопился с ремонтом металлоискателя, — сегодня впервые в этом году выехал покопать. Один из друзей прикупил недавно участок за городом, вот в ту стороны мы и съездили.

Очень урожайный выезд, много находок, но всего интереснее из них две. Первая — советский полтинник, который должен был быть серебряным. Давно хотел такой поднять, сбылось желание, только этот замечателен ещё и тем, что он оказался поддельным.

Я его ещё сильно не ковырял, но похоже, что он из железа и чем-то покрыт, — по краям немного крошится, будто заржавел. Надо будет завтра попробовать положить его в кислоту, посмотреть что будет.

Старая потёртая монета с неразборчивым рельефным изображением на лицевой стороне, лежащая на светло-коричневой текстурированной поверхности.
Монета явно поддельная — сильно коррозировалась, да и весит слишком мало

Вторая находка интересно тем, что родственна первой, да и нашлась рядом — оттиск аверса советского серебряного рубля. Получился явно не очень, видимо поэтому и выбросили. Сфотографировать не выходит — буквы можно разглядеть только с сильным боковым светом, если придумаю как всё закрепить так, чтобы можно было что-то прочитать, выложу отдельным постом.

Смотрите что получается — в земле недалеко друг от друга валяются поддельные 50 копеек и оттиск рубля. Непонятно в точности как они туда попали, но интереснее всего, разумеется, думать, что там жил фальшивомонетчик, который в советские годы пытался подделывать монеты.

3 комментария

«Гопник-2»: теперь «Андроид»

В полку не совсем обычных платформ, где я попробовал собрать «Гопника-2», прибыло. В этот раз, пока обедал, листал экраны на смартфоне и взгляд упал на терминал Termux, который я когда-то ставил, чтобы иметь возможность зайти экстренно куда-нибудь по работе.

Решил попробовать скомпилируется ли. В принципе проблем почти не возникло. Всё необходимое поставил командой pkg install make clang git, после чего выписал проект и поправил путь до заголовочного файла — в «Андроиде» он находится в другом месте.

Скриншот текстовой RPG: игрок «bolk» в Купчине, уровень 0, здоровье 35/35, точность 30%, пива и бабла нет; начал битву с Гопником 1 уровня, ударил на 33 урона, враг промахался.
Так выглядит запущенный «Гопник-2», запущенный в терминале Termux под «Андроидом»

Правки в репозиторий внёс, теперь всё будет собираться ещё и под «Андроид». Проверять в будущем я не буду, вряд ли кто-то будет собирать для себя, но проверить было интересно.

4 комментария

Отломались уши

Читатели, которые тут давно, помнят, что я люблю на досуге помахать металлоискателем — есть у меня такое хобби. Для пользы я с ним участвую в военно-поисковом отряде, а для души иногда напрашиваюсь к друзьям и знакомым в огороды, поискать какую-нибудь старину.

У всех металлоискателей есть слабое место — «уши» катушки. На боковые нагрузки они не рассчитаны и при неловком движении их легко отломить.

Чёрная круглая катушка металлоискателя Minelab CTX II с красными элементами и кабелем, лежащая на плитке с серо-белым орнаментом.
На катушке лежит напечатанные на 3д-принтере новые «уши» с площадкой под клей

В прошлом году я провалился одной ногой в болото и в момент падения опёрся на рукоятку металлоискателя. Крепления катушки моей туши не выдержали и отломились оба. Но так как сезон кончался, я с этим ничего не сделал.

В этом сезоне я глянул было на цены на новые катушки,.. но они и раньше-то немало стоили, а сейчас и вовсе стали стоить в среднюю зарплату. Решил искать более дешёвые варианты.

Оказалось, что на «Авито» существует целая индустрия — люди в промышленных масштабах печатают площадки для усиления «ушей» катушек. У меня усиливать уже нечего, но мне кажется, что сама по себе эта штуковина будет держать всё вместе вместо сломанных «ушей».

Приклеил вчера всё на эпоксидку, сегодня ещё хочу залить оставшиеся кое-где щели суперклеем и завтра попробую опробовать в боевых условиях.

8 комментариев

«Гопник-2»: фан-клуб

Тем временем, у игры «Гопник-2», с которой я вожусь почти каждый день в последнее время, отрос небольшой фан-клуб. Самый заметный его участник, bairog, прошёл всю игру вдоль и поперёк, завёл мне десяток багов, которые я постепенно исправил и даже начал писать игре краткое описание. За что ему огромное спасибо!

Когда будет готово, надо будет это должным образом оформить, снабдить скриншотами и перенести в вики проекта.

В принципе уже почти всё готово, но кое-что хочется ещё дописать — пресловутый ларёк, сохранение перед выходом, работу с несколькими сохранениями. Остальное, вроде, всё уже дописано и поправлено.

Надо бы поторопиться, а то бесплатная лицензия на среду разработки кончится в начале мая, не так много времени осталось, дальше разрабатывать будет сложнее.

Оставить комментарий

Инфляция восклицательных знаков

Не могу отделаться от мысли, что за время моей жизни произошла инфляция восклицательных знаков. Помню, в школе нас учили, что три восклицательных знака, это какая-то истерика, исступление, высшая степень эмоций. Больше просто не ставят.

Действительно, не помню чтобы в классической русской литературе где-то видел больше трёх восклицательных, да и три-то редкость.

Сейчас эти три восклицательных знака — на каждом заборе, я и сам нередко ставлю их пяток, а то и больше подряд. В трёх как-то тесно, невыразительно. Добралась инфляция и до восклицательных знаков!

Синяя табличка с жёлтым текстом: «ВНИМАНИЕ! Автомобили НЕ ПАРКОВАТЬ! Возможен сход снега и льда с крыши. ТСЖ ответственности за повреждения не несёт!!!
ТСЖ в исступлении сообщает…

1 комментарий

Программируем с GPT

Мне всё-таки кажется, что в интернете достаточно примеров как замечательно нейросети справляются с программированием, надо восстанавливать баланс. Свежий пример из моей практики.

Нужно было переписать вот такой код с «Пайтона» на «Си++»:

{72: 65, 80: 66}.get(value, 0)

Что тут происходит? Если value равно 72, вернуть 65, если 80, то 66, иначе ноль. Нужно мне это, если вкратце, для преобразования виндовых кодов в линуксовые.

Так как Си++ я не знаю, описал на Пайтоне — так быстрее и проще показать, что код мне нужен компактный — хочется не городить switch, а добавлять новое правило как можно проще.

Вот что мне сгенерировал ChatGPT-4:

int value = 72;
std::map<int, int> mymap = {{72, 65}, {80, 66}};
int result = mymap.count(value) ? mymap[value] : 0;

После консультации с живыми людьми, выяснилось, что плохо тут примерно всё.

Во-первых, вместо map надо использовать unordered_map, сложность поиска по первой структуре логарифмическая, по второй — константная в среднем.
Во-вторых, в этом коде надо использовать find, а не count, так как find остановится после первого совпадения (что нам и надо), а count — нет, продолжая тратить ресурсы.
В-третьих, map создаётся в этом примере каждый раз вместо одного. Хороший программист так это не оставит.

В итоге, код стал выглядеть следующим образом:

const static std::unordered_map<int, int> win2lin = {{72, 65}, {80, 66}};

auto it = win2lin.find(_getch());
ch = it == win2lin.end() ? 0 : it->second;

10 комментариев

Плитка в хрущёвках

Я часто бывают в «хрущёвках» — в некоторых из них у меня живут друзья, куда-то я попадаю по случаю. Каждый раз удивляюсь разнообразию и выдумке с которой выложена плитка на площадках. Иногда попадаются очень нетривиальные по исполнению узоры Причём, даже в одном подъезде могут встретиться разные варианты.

Вид сверху на тротуарную плитку в шахматном порядке из белых и коричневых прямоугольных блоков с видимыми швами и следами износа.
Плитка на этаже одной из «хрущёвок», самый скучный вариант, но только такой у меня есть под рукой

Всегда было интересно как так получилось. Вряд ли к проекту каждой новой партии домов кто-то каждый раз придумывал новый рисунок. Может строителям в этом случае давали карт-бланш на самовыражение?

Наверное так, да. Моя теория — на строительстве сильно экономили, плитку брали какую найдётся, а так как проект на все случаи не нарисуешь, так что строителям говорили класть так, как им нравится.

Оставить комментарий

Лингвистическая физиогномика

Как известно, наш речевой аппарат всё детство привыкает правильно произносить звуки тех языков, на которых мы говорим. В одной из научно-популярных книг я встречал упоминание, что этот процесс продолжается лет до 11.

После этого всё, якобы, «твердеет» и новые звуки, в среднем, будут вызывать у нас трудности — на их правильное произнесение придётся затрачивать усилия всю жизнь.

В этой связи меня давно мучает вопрос, — не видно ли на лицах последствий этих процессов? Ну, знаете, нельзя ли по фотографии сказать, что вот эта бабушка всю жизнь «окала», поэтому у неё губы куриной гузкой, а этот дедушка — «акал», поэтому у него рот выглядит шире?

Черно-белое фото пожилого мужчины с белой бородой в тёмном пальто и шляпе, стоящего перед кустарником с ягодами.
Мой прапрадед Никанор Иванович Литвинов (9 авг 1881 — 22 окт 1975). Он окал? Акал? Может как-то ещё необычно говорил?

Возможно это должно откладываться в постановке губ, в каких-то морщинах особенных. Пытался найти какие-нибудь работы по этой теме, но что-то нет ничего. То ли никто не занимался, то ли плохо ищу. В принципе, скормить набор данных с лицами представителей разных диалектов сейчас не так сложно.

Знаю, что то ли две, то ли три заметки из моего дневника превратились в дипломные работы, может и эту кто-то возьмёт как тему.

5 комментариев

36,2°

У людей какая-то странная реакция на пониженную температуру, не могу её понять. То ли большинство людей при пониженной температуре чувствует себя нормально, то ли её у них просто не бывает.

У меня сейчас 36,2, что на фоне болезни для меня не редкость. Ощущения, как всегда, отвратительные — слабость, бросает в жар, голова болит. Но кому скажи «36,2», никакого понимания в глазах, один даже спросил — «выздоравливаешь, значит»?

Да откуда? Даже не близко!

Оставить комментарий

То, что тебя не убивает, то — дверь

Недавно зашиб немного нашу собаку, открывая дверь в дочкину комнату. Несмотря на то, что я и стучал, и дверь открывал довольно медленно, ей всё равно досталось, — она с той стороны лежала вплотную. Сразу вспомнился отрывок из «Маугли»:

…даже собака, которой далеко до дикого волка, её прапрадеда, может проснуться от крепкого сна, когда колесо телеги слегка коснётся её бока, и отпрыгнуть в сторону невредимой, прежде чем это колесо наедет на неё.

Наша собака, по всей видимости, слишком далеко ушла от дикого волка.

Оставить комментарий

«Гопник-2»: разные mingw

Надо по-быстрому дописать посты про портирования игры на «Виндоуз», пока свежо в памяти. Так что продолжу.

Сильнее всего меня удивило в процессе, что поведение mingw, — инструментария для компиляции приложений под «Виндоуз», различается под разными операционными системами.

Поскольку мне не хотелось заморачиваться с установкой софта на виртуальную машину, я развернул mingw у себя под «Маком» и внёс правки, чтобы всё благополучно компилировалось именно на этой ОС.

Запустив получившееся на первой попавшейся виндовой виртуалке, я успокоился. Но оказалось этого недостаточно — под самой «Виндоуз» приложение не собиралось!

Во-первых, под «Виндой» отсутствовала функция strdup, интернет ничего не подсказал, но я случайно решил эту проблему, установив стандарт языка в GNU C++11: -std=gnu++11.

Во-вторых, почему отсутствовали-то ряд важных констант. Cледуя совету на «Стековерфлоу», я просто определил их нужными значениями.

В-третьих, функцию usleep пришлось заменить на Sleep из windows.h.

После этих правок игра начала собираться под «Виндой» тоже.

Недавно прочитал в одной из статей на Хабре, что «язык Си++ достаточно сложен, чтобы позволить нам писать на нём просто», как же это верно! Неожиданно много времени занимает борьба с какими-то вещами, которые, как мне кажется, должны просто работать.

10 комментариев