Есть типовое название книжек, в первую очередь -- учебных пособий. "Современный Х". Например, "Современная палеонтология" или "Современные методы управления самокатом". Когда видишь такие заголовки, начинаешь думать -- а насколько современные-то?
Первая проблема. До учебных пособий информация доходит с опозданием. Поэтому если книжка о чём-то современном, то это, скорее всего, уже устаревшее.
Вторая проблема -- по названию непонятно, насколько современной считал информацию автор. Надо книжку взять, открыть, посмотреть год издания. Но год издания -- лишь косвенный признак. Это может быть 15-е издание. Можно посмотреть предисловие и пометку к номеру издания. Например, издание 15-е, исправленное и дополненное. Но насколько осовременил автор издание, непонятно. Можно ориентироваться на дату первого издания, но вычислить её не так-то просто.
Третья проблема, на самом деле, главная. Слово "современный" ничего не добавляет к смыслу названия. Если авторы делают учебное пособие, то они по крайней мере собираются выдавать актуальный материал, а не исторический. Если же они намеренно выдают исторический материал, то это уже относится к области истории, и вот как раз такое надо помечать, например, "Развитие методов управления самокатами с XV по XVIII век".
В общем, если пишете учебник, то уберите слово "современный" из названия. Действительно современные вещи рассказывают на конференциях и в научных статьях. И только потом превращают в учебники.
Я починил постинг картинок на телегра.ф (при помощи стороннего хостинга), так что надеюсь наделать обзоров на всё, на что не наделал.
Симулятор тракториста и симулятор бомжа мы уже видели. Теперь у нас симулятор работы отдела ОТК. С конвейера сходит кукла, надо проверить, что она не проклятая. Удивительно, что при ошибке директор завода сразу тебе говорит, что ты ошибся. Если он и так знает, какие куклы плохие, то зачем нужен ОТК? И почему все остальные операции на заводе происходят без участия человека?
Симуляторы бывают разной степени реалистичности. Например, в аркадных симулятор реалистичность ставится на второй план, главное -- увлекательный геймплей. В учебных симуляторах увлекательность не нужна вообще, главное -- точное соответствие реальности.
Здесь мы видим что-то вроде третьей категории симуляторов. Геймплей не слишком аркадный, но реалистичность... отсутствует. Потому что это фантастический симулятор. Часть кукол будут иметь понятные дефекты типа отсутствия ноги (как она вообще стоит на конвейере?). Но часть дефектов... будут носить мистический характер. Когда кукла всё время за вами следит и сама ходит -- это ещё ладно. Но как вам такой дефект? При перевороте куклы экран становится чёрно-белым. Отлавливать такие уникальные дефекты сложновато, если не знать о них заранее. А каждый пропущенный дефект -- это штраф.
Игра короткая, состоит всего из пяти рабочих дней. И это хорошо, что она короткая, потому что если бы дней было 10, 100 -- играть было бы скучновато. Нас пытаются развлечь, каждый день добавляя новые правила для проверки кукол и новые задания, но всё-таки монотонная работа -- это не увлекательно. Есть другой полюс -- медитативность. Но чтобы монотонная работа стала медитативной -- нужно делать геймплей совершенно иначе.
Не весь геймплей состоит из проверки кукол. На заводе всё время что-то происходит, а кроме вас заняться проблемами больше некому. Благодаря различным неполадкам оборудования вы сможете попасть в служебные помещения завода и даже в подвал, который в 1000 раз больше, чем сборочный цех. А кто живёт в подвале... Скажем так, разработчикам действительно удалось сделать хоррор без скримеров и погонь, как они и обещали. Но из-за этого он получился недостаточно страшный.
Мало кто знает, но у этой игры есть продолжение, и оно называется MiSide.
Записываю, какой тренд я наблюдаю в мемах в последние месяцы (приблизительно с ноября 2024).
Появляются картинки из детских книжек, на картинках изображены животные, которые сидят за столом и пьют чай, или спят в кроватках, укрытые одеялом, или сидят перед камином, в общем, живут в своё удовольствие в сказочных домиках. И, конечно, у этих картинок есть подпись.
Как правило, подпись агрессивная и сообщает о том, что ничто не помешает зверюшке отдыхать. Вот примеры подписей: "Как же всё похуй" "Всеобъемлюще поебать" "Let me relax, i'll exist later"
Естественно, такие картинки играют на контрасте, потому что жёсткая надпись не сочетается со сказочной картинкой. И тем не менее... что стало причиной появления этих разных, но сходных по смыслу картинок? Наличие английской надписи не является строгим доказательством, но намекает, что это может быть общемировой тенденцией...
Гит позволяет указать при локальных коммитах любой емейл (там отдельно указывается ник автора и его емейл). Этот емейл никак не проверяется. Но если вы хотите, чтобы гитхаб считал коммиты вашими, то должен быть указан емейл из списка подтверждённых емейлов на аккаунте.
Честно говоря, не знаю... если какой-то перец укажет ваш емейл и начнёт орудовать на гитхабе, приплюсуют его к вашей статистике или нет. Может, ему откажут в пушах/PR? Но что я знаю точно, что если вы укажете не тот емейл при локальных коммитах, а потом сделаете пуш, то на главной странице вы ваши коммиты не увидите, они будут видны только в списке коммитов конкретного репозитория.
Моя проблема оказалась в том, что в одном из проектов у меня был указан не просто не тот емейл. У меня был указан вообще не емейл. В качестве емейла стояла просто строка zHz00. Почему -- загадка. Теперь у меня написано на главной, что коммитов я не делал, а в списке репозитория указано, что их делал некий zHz00, но не тот, который я. Добавить такую строку в качестве своего емейла на аккаунте я, конечно, не могу. Задним числом поменять емейлы коммитов, скорее всего, тоже.
Если вы знаете, как исправить эту ситуацию, сообщите, пожалуйста.
Меня тут спросили, какой мой любимый трек в Caves of Qud. А я не знаю. Какой нелюбимый -- вспомнил (Golgotha). А любимый? Стал переслушивать. И вот что понял.
Музыка в CoQ звучит на фоне постоянно. Поэтому события, в которых ты участвуешь, привязываются к музыке. Когда её слушаешь -- получаешь вьетнамские флешбеки. CoQ -- сложная игра, поэтому под каждый трек у меня была какая-нибудь жесть. Даже под мирные треки деревень я испытывал проблемы, например, пытался что-то нароллить у торговца, а оно не роллилось.
В общем, не для расслабления эта музыка. А для размышлений о тщете всего сущего.
Я уже не раз писал про curses, но зачем вообще мне понадобилась эта библиотека? Для нетерпеливых сразу ссылка: github.com/zHz00/KGBC
Я играю в Kittens Game, там у меня цивилизация котят, у них разные фабрики-заводы-газеты-параходы, и всё это надо строить. При этом следующая постройка стоит на 15% больше предыдущей. А иногда не на 15%. Есть ещё один нюанс: некоторые ресурсы, из которых собирают постройки, имеют "ёмкость". Допустим, уран имеет ёмкость 10000. Если следующий ускоритель стоит 11000, то хоть ты тресни, ты его не построишь, потому что не сможешь накопить 11000 урана. Сначала надо поднять ёмкость урана на 1000, для чего надо построить новый реактор. Он не требует урана, но он требует титана. И стоит на 15% больше предыдущего реактора. Есть ли у меня достаточная ёмкость титана, чтобы построить следующий реактор? Вопрос.
(читать дальше) Передо мной постоянно возникало две задачи: 1. Узнать, сколько ещё я могу собрать зданий заданного типа до тех пор, пока не упрусь в предел ёмкости по какому-нибудь ресурсу. А постройки обычно строятся не из одного ресурса, а из нескольких, поэтому упереться я могу в один ресурс, а могу в другой. В процессе игры блокирующий ресурс может меняться. 2. Узнать, сколько всего мне понадобится ресурсов, чтобы собрать все здания от текущего до последнего. Если не хватает, то сколько я могу собрать зданий с текущими ресурсами?
Сначала я использовал эксель. Но каждый раз делать таблицу под новую постройку утомительно. Сделать же таблицы под все постройки -- это долго, потому что построек несколько десятков.
Мне пришла идея сделать универсальную программу, которая считает все эти постройки и выдаёт мне то, что надо. Вопрос был -- на чём это написать? Конечно, на питоне. Но на питоне можно написать по-разному. -- Графическое приложение на wxWidgets (нужно учить wxWidgets) -- Текстовое приложение на curses (нужно учить curses) -- Веб приложение на flask+AJAX (нужно разбираться с какими-то веб-технологиями)
Ну и я выбрал текстовое приложение на curses. Было ли это ошибкой? Не знаю. Знакомые веб-программисты топили за веб-вариант. По понятным причинам. Но я далёк от веба. И не хочу к нему приближаться.
Так или иначе, приблуду я сделал, и постоянно ей пользуюсь. Показываю приблуду и вам.
Итак, первое, что у меня есть -- это защита от спойлеров:
При каждом старте вам будет выдаваться предупреждение о том, что программу надо выключить. Чтобы его закрыть, надо нажать F4, а не что-нибудь ещё. Предупреждение можно отключить, и это запоминается, но чтобы его отключить, надо нажать F7. Надо было сделать, чтобы программа закрывалась при нажатии любой клавиши, кроме F4 и F7, но это было бы слишком злобно.
Далее отображается список построек. Я замазал большинство из них, чтобы не было спойлеров больше, чем на несколько часов игры (если вы запустите программу, то, конечно, там ничего замазано не будет):
Как видно, в программе есть несколько вкладок с постройками, и тут видна только первая. Это, конечно, замороченная система, когда надо нажимать буквы с контролом или альтом, чтобы выбрать постройку. Но вообще-то работает мышка (и на практике я пользуюсь только ей).
В игре есть развитая система скидок, поэтому увеличение стоимости следующей постройки может быть не 15%, а значительно меньше. Но эти скидки могут распространяться только на конкретную постройку или на группу построек. Для того, чтобы назначить скидки, надо выбрать вкладку Workshop. Тут, конечно, тоже всё замазано:
Скидки сохраняются в настроечном файле, поэтому их не надо выставлять каждый раз.
Ну ладно, кликнули мы по постройке или нажали клавишу, дальше что? Дальше -- таблица. Вот пример:
Таблицу можно вращать в обе стороны с тремя разными скоростями. И вращать её можно до самых 1.7e+308, потом будете видеть только inf и overflow. В верхней строке будет отображаться информация о включённых скидках. Тут, например, мы имеем скидку 1% к основанию показательной функции.
Чтобы посчитать общее число ресурсов, нужно выделить несколько построек. Для этого используется система, похожая на выделение нортон коммандера. Есть вторая система, использующая квадратные скобки. Их можно комбинировать. После выделения в нижней строке увидим сумму:
После того, как я написал эту программу, играть стало значительно приятнее. Есть и минусы. В KG некоторые ресурсы первичные, а некоторые производные. Моя программа не показывает пересчёт производных ресурсов в первичные. Сделать такую функцию не так-то просто! Дело в том, что преобразование идёт с определённым коэффициентом, и для различных производных ресурсов коэффициент тоже получается различным, зависящим от нескольких факторов. Может быть, сделаю это в будущем.
Программа тестирована на python 3.8 (windows 7 x64, windows 8 x32) а также на python 3.11 (Debian 12, MX Linux 23.4).
P.S. А ещё я составил детальное описание того, как работает каждая скидка. Я не уверен, что программой воспользуется хотя бы один человек, кроме меня, а уж справку вообще никто не прочтёт. И тем не менее, я это сделал.
В Перекрёстке подхожу к кассе самообслуживания. Кура не считывается по штрих-коду -- не реагирует. Ищу кнопку "ввести номер", а её нет! Замялся.
Подходит кассир, тычет в правый нижний угол, где никакой кнопки нет. Открывается окно ввода штрих-кода! (лайфхак!)
Начинаю вводить и вижу, что не только сам штрих-код затёрт, но и последние цифры видны плоховато. Пытаюсь угадать, на что похожи ошмётки цифр. С трепетом ввожу последнюю и... "Куриное филе, 892 г".
Кассир кричит ура, я кричу ура, все танцуют.
А дома я стал изучать чек и упаковку. В магазине я опасался, что получу сообщение "товар не найден", но опасаться надо было не этого. Я заметил, что в чеке указана масса 892 грамма, а на упаковке 852 грамма. Я обсчитал себя на 40 грамм, но почему это стало возможным?
Оказалось, что последние цифры штрих-кода были похожи на 892, что я и ввёл. Но на самом деле это были 852. Я посмотрел другие сохранившиеся упаковки -- для весового товара действительно последние цифры совпадают с массой в граммах. Ничего не зашифровано. Но.
Вообще-то, есть ещё контрольная цифра. Последняя. То есть, вес идёт не в последних цифрах, а в предпоследних, допустим, 00892X. И цифра должна быть правильная.
Я нашёл в интернете онлайн-проверку штрих-кодов и стал подбирать контрольную цифру для обоих весов. Она была разная.
Тут два варианта. Либо я случайно угадал последнюю цифру (шанс чего 10%), либо в Перекрёстке контрольную цифру не проверяют...
Вообще, это надо в пост про curses, и я туда добавлю, но сейчас там никто не прочитает.
В винде мы привыкли, что можно определить любое сочетание клавиш. В графическом режиме линукса, по-видимому, тоже. Но если мы работаем в терминале, то всё не так. Я много поел говна, пока разбирался с сочетаниями с альтом, с хоум-эндом, с задержкой после нажатия эскейпа (а в винде всё тоже самое работает без проблем, тоже в терминале).
Но когда я решил провести углублённое тестирование, то обнаружил ещё две вещи.
1. Tab невозможно отличить от Ctrl+i. Потому что они оба возвращают один код. (это поведение присутствует и в винде, как выяснилось) 2. Ctrl+M невозможно получить. Потому что когда нажимаешь Ctrl+M, в программе получаешь Ctrl+J. То же самое происходит и при нажатии Enter (поэтому различить Ctrl+J и Enter невозможно тоже).
В некоторых терминалах поведение отличается. Там нажатие энтера генерирует Ctrl+M. Тогда не получится сгенерировать Ctrl+J, поскольку его нажатие будет генерировать Ctrl+M. Такое поведение связано с различием управляющих кодов CR/LF. И если в настройках терминала стоит одно, то во всех трёх случаях будет генерироваться Ctrl+J, а если другое -- Ctrl+M.
Есть очень окольные способы настроить такое под себя. Но если я пишу программу для терминала, которая должна более-менее работать в любом линуксе, то надо отказаться от Ctrl+J, Ctrl+M, Ctrl+i, Tab, а ещё, желательно, от Ctrl+H, который легко путается с Backspace. Но вот именно настройка управляющего кода бэкспейса в эмуляторах терминалов всегда расположена на видном месте.
Распространение файлов в запароленных архивах часто бывало в 2000-е и в 2010-е годы. Но иногда встречается и сейчас.
Сайт не может или не хочет хостить файлы сам, поэтому выкладывает их на файл-хостинг (которые сейчас тоже стали редки). Рядом со ссылкой на скачивание публикуется пароль, часто состоящий из имени сайта. Я не знаю, зачем так делали и делают. Видимо, смысл в том, чтобы человек, получивший ссылку через иной источник или наткнувшийся на файл просто на хостинге, не мог им воспользоваться. Но зачем ставить такое ограничение -- вопрос.
Потому что этим файлом не сможете воспользоваться вы сами, найдя его на диске через год. А там может быть что-то важное. Ну и попробуй вспомнить, что откуда ты качал и какой там пароль.
В таких случаях надо действовать с упреждением.
1. Сразу распаковываем. 2. Оригинальный файл удаляем, чтобы не мозолил глаза. 3. Если оригинальный файл должен сохраниться, вписываем пароль в имя файла.
В детстве, если у кого-нибудь случался понос, бабушка всегда выдвигала предположения насчёт того, почему так произошло. "Ой, наверное от творога" (творог ели каждый день, понос только у одного человека).
Сейчас тоже хочется затеять детектив и понять причину. Но это очень редко имеет смысл делать.
1. Даже если вычислить виновника, польза будет только если осталась ещё такая же еда. Её можно будет выбросить. 2. Вычислить виновника сложнее, чем кажется. Очень часто после подозрительных продуктов ничего не бывает. Ну, живот поурчит. А когда происходит отравление, то оказывается, что подозрительных продуктов нет. Вот как такое возможно?
Папин друг, специалист по алкоголю, принёс железку, чтобы я её попробовал включить. Это оказалось непросто, но бутылку я получил.
Железка предназначена для показа экрана ведроида на телевизоре (мониторе). К телевизору подключается через хдми, а к смартфону через вай-фай. Но есть нюанс. Каждый следующий этап подключения шёл при помощи страданий.
1. Сначала коробочка стартует в режиме точки доступа. Можно подключиться к ней со смартфона. Но по указанному айпишнику подключения нет. Чтобы подключение сработало, надо выключить мобильные данные, оставить только вай-фай. (видимо, проблемы с роутингом) 2. Возможности сразу начать расшаривать экран нет. Сначала надо подключить коробочку к какому-нибудь роутеру, который находится в вашей собственности. Почему нельзя было сразу сделать передачу, раз уже есть и точка доступа, и локальная сеть -- я не знаю. 3. Чтобы подключить коробочку к роутеру, надо зайти в её веб-морду (см. п.1). Эта веб-морда нужна ТОЛЬКО для того, чтобы указать, как подключиться к роутеру. При этом она видит далеко не все окружающие сети. А ещё она не поддерживает работу с "нешироковещательным ssid". 4. Получив координаты роутера, коробочка перезагружается в режиме вай-фай-клиента и подключается к роутеру (если получится). Больше вы в веб-морду коробочки не попадёте, пока не выключите роутер. Тогда она снова перейдёт в режим точки доступа. (хотя в интернете пишут, что есть варианты коробочки, который после подключения к роутеру показывают совсем другую веб-морду) 5. Если всё сделано правильно, на телевизоре появится информация, что есть соединение с роутером. Можно начинать подключать смартфон. 6. Смартфон должен быть подключён к тому же роутеру через вай-фай. 7. В каждом смартфоне пункт меню, отвечающий за расшаривание скрина, расположен в своём месте. Его предстоит отыскать. На одном смартфоне расшаривание называлось Smart Screen Sharing и располагалось в Bluetooth & Devices. На другом там было пусто, но зато в одном из соседних разделов была опция "Трансляция" (русский перевод). И это было то, что нужно. 8. Как бы этот пункт ни назывался, надо в нём выбрать ваше вай-фай подключение, потом будет какой-то поиск устройств -- и коробочка отобразится в списке. Кликаете её и вуаля -- трансляция пошла. Но почему-то в очень низком разрешении.
***
В аниме встречается такое выражение -- asa-meshi-mae, буквально "ещё до завтрака". Оно употребляется, чтобы описать слишком слабого соперника. Например, к главному герою приходит какой-нибудь хер и пытается вызвать того на поединок. ГГ отвечает -- я таких слабаков как ты раскатываю по стенке ещё до завтрака! То ли имеется в виду, что ГГ, который не позавтракал, находится ещё не в форме, и всё равно может справиться. То ли имеется ввиду, что мелюзги так много, что она успевает вклиниться в короткий промежуток времени между под'ёмом и завтраком.
Так или иначе, сейчас я завтракаю поздно, и коробочку мне действительно принесли до завтрака. Возился я с ней больше получаса, и всё это время не мог поесть. А когда я её победил, то понял, что asa-meshi-mae это далеко не так просто, как показывают в аниме.
И тем не менее. Что мне эти ваши коробочки! Я их настраиваю ещё до завтрака!
Я сталкивался с этим в нескольких областях. В кулинарии. В замешивании эпоксидки.
Ты должен смешать компоненты. Мешаешь. Мешаешь. Вроде всё замешал. А потом оказывается, что замешал плохо. Присутствуют неравномерности. В кулинарии -- заметные на вкус, когда одна часть котлеты, к примеру, имеет один вкус, а другая -- другой.
Поэтому: 1. Мешать надо дольше. Если кажется, что уже всё хорошо, нужно помешать ещё немного. А лучше -- столько же, сколько уже мешал. 2. Компоненты взаимодействуют друг с другом, поэтому быстро перемешать не получится. Лучше сделать перерыв 5 минут, а потом ещё помешать. 3. Нужно уделять внимание труднодоступным местам, типа внутренних углов ёмкости. Очень может быть, что там не ступала нога человека.
Давать определения жанру "рогалик" -- тема неблагодарная. Сейчас слово "рогалик" или "роглайт" лепят на все игры, где есть хотя бы небольшой элемент рогаликовости. Мода такая, наверное.
Один из ключевых признаков рогаликов -- "смерть навсегда" (permadeath). Умер -- начинай с левел1. Это было бы очень скучно, если бы мир игры был одинаков при каждом прохождении. Но мир генерируется заново, поэтому смерть, как правило, обогащает опыт, а не приводит к стагнации.
В современных рогаликах отношение к "смерти навсегда" стало мягче. Например, и Cogmind, и Caves of Qud предлагают режимы с чекпоинтами. Прости господи, тот же нетхак имеет режим исследования, дающий бесконечные жизни и позволяющий отказаться от удаления сейв-файла.
Да, это как бы "неспортивно", и на доску почёта в таком режиме не попадёшь. Но такие режимы весьма полезны, если вы хотите чему-то научиться.
С этими режимами связана одна иллюзия, ради которой я и пишу этот текст. Кажется, что чекпоинты значительно снижают сложность игры. Ну, потому что умер, воскрес -- и погнал дальше. В следующий раз тебе повезёт -- не умрёшь.
Это не так. Кажется, что смерть в рогалике случайна. Такая смерть действительно встречается. Но очень часто смерть является следствием неправильной стратегии, незнания, непонимания геймплея и множества других факторов, которые не являются случайными.
Да, вас откатывает назад на 100, на 1000 ходов. Но сможете ли вы за оставшееся время устранить ту причину, по которой вы умерли? Сможете ли вы её понять?
Если да -- то вы пройдёте дальше. Если нет -- то вы имеете все шансы сложиться от того же самого моба на том же самом месте.
Вот и получается, что сохранения полезны только против настоящей случайной смерти. Чтобы они были полезны в остальных случаях, нужно, чтобы игрок не просто повторял одно и то же место, а уделял внимание анализу и придумывал пути решения.
Такой игрок будет растить свой навык, и очень скоро чекпоинты будут ему не нужны.
В первую очередь, про вкус алкоголя. Я, возможно, про что-то из этого писал, но тут я собираю всё в одном месте.
1. Вкус зависит от степени АО. Чем больше АО, тем слабее он чувствуется. 2. Вкус зависит от температуры. Один и тот же напиток может быть невкусным, когда тёплый, и вкусным, когда холодный. И наоборот. 3. Вкус зависит от номера глотка. При первом глотке вкус один. При втором язык привыкает к части вкуса и что-то отходит на второй план. Это может как улучшить, так и ухудшить ощущения. 4. Вкус зависит от того, что пили-ели до этого. Поэтому профессиональные дегустаторы полощут рот водой. Но мы не профессиональные дегустаторы, поэтому так делать не будем.
Бухгалтер 1991 года, а Частушки 1992. Я не верю, что это случайность. Но... почему авторы так сделали? В частушках есть ещё несколько проигрышей. Возможно, они взяты из каких-то других песен. Но я их не знаю.
Иногда начальство или родственники спрашивают: "Ты сделал Х?"
А ты нихуя не сделал. Ну и что тут можно ответить? "Нет".
Но я почему-то всегда отвечаю "Нет... ещё". Почему-то мне кажется, что это "ещё" как-то исправляет ситуацию. Типа, "уже делаю" или "почти сделал". Но на самом деле это "ещё" ничего не означает. А кроме того, звучит некрасиво.
Что это звучит плохо, я понял, когда услышал то же самое от сестры (я так и не понял, кто у кого научился).
Надо избавляться от этой привычки. Не сделал -- значит не сделал.
Когда некоторые безответственные личности рассказывали про СССР 2.0 я ожидал разного, но не этого.
Что происходит с ценами на алкоголь?
Смешно, конечно, рассуждать о таком, ведь в СССР ассортимент был сильно ограничен. Я же для примера напишу про текилу Ольмека, серебряная, 0.7 л.
Зайдём в Перекрёсток. Со скидкой -- 2189 р. (при пред'явлении карты) Зайдём в Ароматный мир. 2190 р. Зайдём в КиБ. Какая там цена? 2189 р.
Я не проверял ВСЕ наименования, но посмотрел ещё несколько. Всё то же самое. Где-то со скидкой, где-то без, но итоговая цена различается в пределах 10 рублей.
Может, конечно, это перед новым годом вышло распоряжение, чтобы всё было одинаково? Надо было месяц назад сравнивать, но тогда я ещё не приступил к закупкам.