-
Куда впадает Волга?
Когда меня спрашивают, куда впадает Волга, я спрашиваю в ответ: куда впадает Янцзы? Начинается кудахтанье и хлопанье крыльями, мол, не наша река. А что значит “не наша”? Расстояние на глобусе между Волгой и Янцзы — пятнадцать сантиметров. Не вижу причины, по которой нельзя его чуть-чуть повернуть. Или что: “наши” реки учить надо, а “чужие” не надо? Странная логика: в географии таких терминов нет.
Разницы между Волгой и Янцзы я не вижу. Есть и другие реки, и все они куда-то впадают. Незнание отдельной реки ни о чем не говорит.
Чтобы вам не гуглить: Янцзы впадает в Южное китайское море. Я узнал это случайно из туристического справочника, когда ездил в Китай. Просто запомнилось.
-
Самокаты
Напомните, откуда взялось мнение, что можно встать на самокат и поехать куда хочешь? Ничего, что прокатный самокат весит под 20 килограммов, а человек на нем — в среднем 60? Суммарная масса 80 кг разгоняется до 20-30 км в час, что опасно для всех: и самокатчика, и тех, кто рядом.
Самокату, как и любому транспорту, нужна инфраструктура. Поезжай по велодорожке или ступай в особое место в парке, где тусуются самокатчики. Нет велодорожек? Увы, ты пролетаешь. Пиши в управу, голосуй на госуслугах и так далее. Но почему надо ездить по тротуару? Это место для пешеходов. Не решайте свои проблемы за счет других.
То, что самокатчики сбивают друг друга как кегли, меня не волнует. Может быть, потеряв несколько зубов, они поймут, что не нужно опережать поток движения в три раза. Но они очень опасны для детей. Скажем, идет ребенок, а сзади его обгоняет самокатчик. Ребенок увидел бабочку, рванулся вбок — и чуть не попал под 80 кило на огромной скорости.
Та же самая ситуация с доставщиками. Как-то раз я подслушал их разговор, и тезисы примерно следующие. Если ездить по проезжей части, нужно соблюдать ПДД для легких мотоциклов (самый правый ряд и правая сторона). Соблюдая правила, курьер не успеет доставить заказ. Вдобавок менты устраивают засады, штрафуют, задерживают под разными предлогами, чтобы добиться взятки. Поэтому проще ездить по тротуарам.
Вот и получается, что обеим сторонам — доставщикам и ментам — удобней, когда курьеров выдавливают с дороги на тротуар. Это проще, чем действительно следить за безопасностью. В оправдание курьеров можно сказать, что по тротуарам он стали ездить очень медленно. Хватило всего пары случаев самосуда, чтобы курьеры все поняли.
Любой электротранспорт на тротуаре можно обозначить так: решение личных проблем за счет других. Нет велодорожек? Ничего, поеду между детьми. Не успеваю доставить заказ? Ничего, срежу через парк. Причины в каждом случае одинаковы: нет инфраструктуры, нет желания ее развивать, личиное безразличие к окружающим и ноль эмпатии.
-
О материализации
Когда говорят о кэшировании, для меня это тревожный знак. Да, я понимаю, что порой оно необходимо. Однако у меня возникает вопрос: понимает ли тот, кто говорит о кэшировании, весь набор проблем, что оно несет?
Напомню, что проблем с кэшем довольно много. Когда-то его нужно сбрасывать, когда-то — прогревать. Кэш должен быть транзакционным: если кто-то взялся его обновлять, другие клиенты должны ждать. Сюда же — проблема сериализации и походы в сеть.
Вместо сериализации я предпочитаю материализацию. Термин я взял из Постгреса, но его можно применить и к другим системам.
В Постгресе материализация работает так. Предположим, есть тяжелый запрос: много джоинов и сложных условий. Из него делают мат-вьюху и сбрасывают ее в таблицу по расписанию. Выборка из готовой таблицы быстрее на порядки. Важно, что эта таблица доступна всегда. Даже если мы не обновим вьюху, то все равно получим данные. Обновление вешают на крон или событие.
Другой пример: есть апишка, которая возвращает список отделений фирмы. Отделения появляются редко, поэтому ходить за ними в базу нет смысла. Проще выгрузить отделения в json-файл и раздавать его Nginx-ом. Задача выгрузки тоже ставится на крон.
Еще пример материализации — мой блог. Он устроен на Jekyll — генераторе статичных сайтов. При запуске Jekyll обходит md-файлы и производи файлы html. Далее они раздаются как статика; нет обращения к базе, Редису или очереди задач. Задачу обновления сайта — или материализации — обычно ставят на гит-хук или Github action, но я запускаю ее вручную. Таким образом собранный сайт есть всегда, пусть и с отставанием.
И еще пример: скажем, есть у вас в фирме тормозная CRM. Ее апишка держит не более полутора запросов в секунду и огорчает всех клиентов. Тут же находится обезьянка, которая предлагает Редис. А решение простое: реплицировать базу данных CRM в другую базу (частично или полностью). В реплицированной базе завести мат-вьюхи, которые собирают нужные проекции; вьюхи обновляются по крону. Даже если CRM отвалится, у вас будет копия базы, и что-то вы покажете. Может быть, данные будут не самые свежие, но это лучше, чем вечный спиннер или “попробуйте еще раз”.
Идея материализации в том, что данные есть всегда, и показать их очень легко. В идеале — прочитать файл или плоскую таблицу. Нет такого, что данные собираются по трем микросервисам, а потом еще обрабатываются. Наоборот — все готово, нужно только показать.
И есть фоновая задача, которая готовит данные: лезет в сервисы, очереди и другие малоприятные места. Эта задача отвечает за то, чтобы данные были актуальны. Если она отвалится, мы покажем устаревшие данные, что почти всегда лучше, чем свалиться с ошибкой.
Не всегда материализация полезна; возможно, она не решит какие-то из ваших задач. Но лично я рассматриваю ее как более разумный шаг по сравнению с кэшированием. Иногда материализация оказывается очень и очень в тему.
-
Сайты образовательных заведений
Поговорим о явлении под названием “сайты образовательных заведений”. Не знаю, обращали вы внимание или нет, но эти сайты довольно меметичны и представляют вещь в себе. Каждый раз, посещая их, я закусываю щеку, чтобы не рассмеяться.
Итак, сайты учебных заведений строятся по одному и тому же паттерну. Прежде всего это главная страница, за которой более-менее следят. На ней все современное: контент появляется из пустоты, верстка идет этажами (слоями), везде карточки с фотографиями из фотостоков. В большинстве случаев используется Реакт, а не jQuery. Видно, что работу поручили грамотному, современному фронтендеру.
Следует, однако, понимать, что эта страница — ширма, прикрывающая срам. Стоит кликнуть на сайт кафедры или факультета, как вы улетите на поддомен. Там крутится ублюдочная CMS на PHP вроде Вордпресса или Джумлы. Ее мажорная версия отстает на пять-шесть единиц. Возникает ощущение, что вернулся в нулевые. Макет делится строго на шапку, контент и сайдбар. В сайдбаре — опрос “Как вам новая версия сайта?” (новая, блин). Поиск не работает и выдает заглушку Апача, потому что не установлен модуль.
Содержимое не уступает технической части. Все данные устарели; актуальные данные выкладывают в виде сканов. Прочитайте это предложение еще раз: данные выкладывают в виде сканов. С подписью ректора, между прочим! Официально заапрувленный контент. Чтобы найти расписание занятий или учебную программу, нужно скачать скан на 10 мегабайт, сделанный на убитом железе. Далее просмотреть десять страниц, чтобы найти нужную информацию.
На сайте нет ни одной формы. Чтобы отправить заявление, качаешь вордовский файл, заполняешь и шлешь на почту. Имя файла примерно такое:
zajavka_na_dopolnitelnye_kursi_2026_(2)_final.docx.rarПосле скачивания пять минут тратишь на то, чтобы распаковать rar.
Заведует сайтом админ Валера, который то в отпуске, то на пересдаче сессии, то в пьяном загуле. Сайт может лежать месяцами, прежде чем это вообще заметят.
Посещая сайты университетов, я обращаю внимание не на главную, а на поддомены факультетов. Именно их состояние говорит о том, насколько в заведении следят за бардаком. Главная страница, где фрондендер подключил Реакт, увы, не отвечает на этот вопрос — ровно как ни на один другой.
-
AirPods Pro 3
Недавно купил уши AirPods Pro 3. Было бы странно писать на них обзор, потому что в сети их тысячи. Ограничусь лишь одним фактом.
В ушах классное шумоподавление, и покупать их следует только их-за этого. Ощущения трудно передать словами: надел — и словно провалился в другой мир. Не слышно кипящего чайника и льющейся воды. Совершенно пропадает шум машин с улицы. Испытал в поезде и даже самолете, и это просто поразительно: гул самолета становится едва слышным, словно жужжание насекомого.
Поэтому покупку я рассматриваю только с позиции подавления шума. AirPods — это такие электронные беруши, которые полностью устраняют шум. Подойдет тем, кто не любит громких звуков и предпочитает тишину.
Пару раз я даже спал в них, и это был замечательно. Разве что девайс великоват, так что со временем я откатился на обычные затычки.
Может быть, это личное, но я не люблю громких звуков: когда кто-то громко говорит или музыка играет выше адекватного уровня. Особенно этим страдают бары: зашел — а тем ревет магнитофон. Как мне разговаривать с друзьями? Склоняться через весь стол и кричать в ухо? Спасибо, мне такого отдыха не нужно.
Другой случай — каток. Зимой мы всей семьей ездим на крытый каток и катаемся по часу. Одна беда — иногда попадаем на “диджей-сеанс”. Это когда какой-то уродец врубает музыку так громко, что раскалывается голова. В таких случаях я ношу с собой затычки, а вот теперь мне помогут уши.
Испытать это чувство — погружение в полную тишину — я бы посоветовал каждому. Оно напоминает, как редко вокруг нас бывает беззвучие. Знаете выражение — звенящая тишина? Оно происходит из того факта, что мы постоянно что-то слышим, и когда звуки пропадают, мозг начинает судорожно их улавливать. С AirPods привыкаешь к тому, что абсолютная тишина — это нормально.
Само собой, не следует носить их за рулем и при ходьбе по улице: повышается риск несчастного случая. Надевайте их только за рабочим местом.
С подключением по блютузу все по-прежнему: полная задница. Если достать уши, и рядом несколько яблочных устройств, они станут подключаться к каждому и прерывать звук. Все это без какой-либо системы и понимания. Чтобы не трепать родственникам нервы, отключил на их устройствах блютуз.
Но повторюсь, подавление шума — это нечто, по крайней мере для меня. Удивительное открытие.
-
Рассказ "Никита и медведь"
Это было в Чите, когда мне стукнуло пятнадцать или около. Летними вечерами я и несколько ребят собирались в условленном месте. Обычно мы курили сигареты и пили пиво – то и другое дешевые, максимально низкого качества. В то время купить табак и алкоголь несовершеннолетним не представляло труда: магазины никто не проверял, а предупреждения на дверях были фикцией.
Под курево и алкоголь шли беседы: сплетни, душевные разговоры и похвальба всех мастей. Мы не были бунтарями или несчастными подростками: по большей части мы притворялись, играли роль. Ребята происходили из хороших семей, посещали школу и хорошо учились. У всех были карманные деньги. Редко кто приходил домой после полуночи, чтобы не ссориться с родителями (телефонов тогда не было, только пейджеры).
Такие темы, как тяжелые наркотики, уход из дома или бродяжничество, были для нас табу. Как-то раз мы столкнулись с настоящим бездомным подростком, и это было жутко: все равно что встретить африканского аборигена-людоеда. Его неразвитость и бедная речь сочетались с резкими, воровскими повадками, когда разговор шел о каких-то грошах. После общения с ним мы были подавлены настоящей, а не показной проблемой. Потребляя сигареты и пиво, мы делали это по-детски, оставаясь цивилизованными детьми, пусть даже с дурью в голове.
Со временем в нашей компании появился новый участник. Звали его Никита, а уж фамилию я не вспомню. Никита был старше нас лет на пять, высокий и здоровый, с бородой. Вся его наружность говорила, что он – первый парень на деревне. Характер не уступал внешности: он говорил быстро и громко, много смеялся, на каждый случай знал анекдот. Он театрально играл голосом, отчего шутка, пусть даже не смешная, усиливалась многократно.
Мир Никиты был эгоцентричным. В центре, как столп, был Никита, а остальные участники вращались вокруг него. Когда Никита приходил, вопрос о том, чем заняться, решался сам собой. Все рассаживались как малые дети, а Никита восседал в центре и рассказывал истории – разумеется, о себе.
Рассказывал Никита много и красочно. О том, как путешествовал автостопом. О том, как был ударником в группе (в рюкзаке у него были барабанные палочки, и он эффектно крутил их пальцами). Как занимался рестлингом, где и с кем пил. Как прятался в поезде от милиции, тусил с байкерами, укладывал в постель замужних женщин и многое другое. В каждой истории на него, казалось, ополчился весь белый свет: милиционеры, гопники, ревнивые мужья – но Никита неизменно выходил сухим из воды.
Шли дни. Новый гость часто посещал наши встречи. На тот момент мне не казалось странным, что Никита был в нашей компании. Однако совсем скоро, буквально через год, сама идея об этом стала неприятной. Предположим, хотя бы часть из рассказанного была правдой. Разве стал бы человек, бывавший в таких ситуациях, просиживать штаны с малолетками? Как-то не вяжется: милиция, байкеры, женщины, а слушатели – пятнадцатилетние сопляки.
Много позже, когда я повзрослел и стал разбираться в типажах, стало ясно: у Никиты были проблемы со сверстниками и, судя по всему, сверстницами. Не смотря на обилие женщин в его рассказах, нашего героя никогда не видели с девушкой – хотя, казалось бы, от желающих не должно быть отбоя. Недостаток внимания Никита компенсировал тем, что понизил уровень аудитории – другими словами, предпочел нас.
В какой-то момент Никита решил, что уже достаточно прогрел публику, и она готова для финальной – ультимативной! – истории. Дождавшись дня, когда пришли все, герой уселся в центр, закурил и, как Пушкин, поведал ее свету.
Начиналась история весьма невинно: Никита опять с кем-то пил. Сменив то и другое место, компания оказалась в ночном зоопарке – один из участников работал в нем сторожем. На мой взгляд, зоопарк и вправду подходит для распития алкоголя. Территория огорожена и, так сказать, близка к природе. А тот факт, что рядом спит лев или тигр, приятно щекочет нервы.
Сюжет истории закручивался с несвойственной даже Никите лихвой. Перепившись сверх всякой меры, компания пошла смотреть на зверей. К тому времени наступило утро. Никита потерял сознание, и заботливые товарищи воспользовались этим, чтобы пошутить. Никиту втащили в вольер с медведицей, решив, что ему будет забавно проснуться рядом с ней, и ушли.
Пробуждение Никиты было кульминацией рассказа. Трудно выразить всю театральность, что он вложил в речь, жесты, мимику. Передать его старания может лишь картина Перова “Охотники на привале”: тот же взгляд, глаза на выкате, растопыренные пальцы, изображающие зверя. Все взгляды прикованы к рассказчику, и у него абсолютная власть над аудиторией. Никита вещал:
“Просыпаюсь я такой, короче, башка болит, перед глазами круги. На каких-то, короче, досках, все мокрое. И какая-то туша передо мной в шубе. Кто это и что это – не понимаю. Тут я привстал и присмотрелся, а это, сука, медведь! Огромный как диван, рядом лежит, чуть ли не обнимает. Наверное, думал, что я мертвый. Тут он увидел, что я очнулся, и морду ко мне придвинул. Я такой как заору! Встать не могу, тело не слушается. Стал его ногами отпихивать и все ору! А он, короче, тоже заревет да как полоснет меня когтями по животу! Продрал майку и весь живот! Пошла кровь, чую – из меня кишки вываливаются! Кругом чьи-то крики, топот. Сторож вбежал в вольер, отбил меня от медведя, выволок наружу. Из живота кровища, сука, льет как из крана. Помираю! Потащили они меня в машину и отвезли в больницу. Там я и пролежал три месяца, пока лечили живот.”
Закончив историю, рассказчик сплюнул, закурил очередную сигарету – за час он выкуривал больше, чем мы за день – и приготовился ждать наших отзывов. А мы, обалдевшие от такой концовки, молча сидели с открытыми ртами. Всякое рассказывал нам Никита, но чтобы медведь и кишки… это был новый уровень. Нужно было время, чтобы прийти в себя.
А Никита курил, сплевывал и спокойно ждал. Мало помалу мы очухались и стали робко возражать: мол, хотя рассказ и поразительный, но он мало похож на правду. И вообще, может быть, ты что-то выдумал..? Никита молчал. Не дождавшись возражений, мы вконец осмелели и сказали, что все-таки не верим: этого быть не могло.
Получив такой вердикт (на который, впрочем, он и рассчитывал), Никита не просто унизил нас, а втоптал в грязь и растер каблуком. Отложив полторашку пива, которую он, словно ребенка, нянчил на коленях, Никита встал и задрал майку до подбородка. Под ней обнаружилось когда-то мощное тело, заплывшее пивным жиром (байки про рестлинг могли быть правдой). А сверху вниз через весь живот, от груди до паха, шли восемь глубоких шрамов: четыре слева и четыре справа. Словно от чьих-то лап.
Без сомнения, эти шрамы были оставлены зверем – получить такие в быту невозможно. Шрамы были неровные, рваные; те, что посередине, были шире и глубже. Особенно меня поразила их глубина: словно резьба по дереву, они погружались в тело на полсантиметра, а где и глубже. Какой же глубины тогда были раны? Полагаю, сантиметра два, не меньше.
Разглядывая шрамы, я смутно подумал, что пивной жир спас Никите жизнь. Будь он тощим как я в пятнадцать лет, когти обязательно задели бы внутренности. И не доехал бы Никита до больницы, а если бы и доехал, то разве что в отделение, расположенное в подвале.
Да, эффект был просто уничтожительным. Если до этого мы были ошарашены рассказом, то демонстрация “пруфов” просто лишила нас слов. Шрамы были, и оспорить их было невозможно.
Очевидно, Никита тщательно планировал свое выступление и, скорее всего, уже не раз выступал с ним. Но даже не смотря на постановку и театральность, я не мог не оценить его мастерства. Браво!
Вскоре после этой истории Никита покинул нас. Это было ожидаемо: после истории с медведем он уже не мог повысить накала. Никита примкнул к другой компании, средней возраст которой тоже был младше его. Как-то раз, проходя мимо, я издали увидел его в окружении новых поклонников. Знакомая картина: взгляды прикованы к нему одному; Никита картинно растопырил руки, изображая то ли гопника, то ли милиционера из своих похождений. Интересно, они уже дошли до медведя? Вряд ли, но все еще впереди.
Иногда я вспоминаю эту историю. Какая все же истинная причина этих шрамов? Случай с медведем, скажем прямо, маловероятен, зато отлично подходит для пьяных выступлений. Может быть, все гораздо проще: либо на Никиту напала бешеная собака, либо на него натравили собаку за какую-то провинность, например кражу. Такие обстоятельства не тянут на рассказ, поэтому пришлось сочинить про медведя, кровь и кишки.
Вот так. Эх, Никита! Каким колоритным и харизматичным ты был, как врезался в мою память! Где бы ты ни был, желаю тебе уберечься от невзгод, прожить долгую и счастливую жизнь. Храни тебя бог, случай, фортуна – во что там веришь. Надеюсь, так и случится – несмотря на твое упорное желание добиться обратного.
-
Игры (2). The Guardian Legend

Для большинства из нас восьмибитные игры сводятся к танчикам, тетрису и всяким аркадам. Но бывало ли, чтобы вы наигрывали в восьмибитную игру дни и недели? Чтобы было погружение как фильм или книгу? У меня – да.
В 1988 году (мне тогда было три) вышла игра The Guardian Legend. В “российском прокате” – то есть пиратских версиях Денди – ее почему-то назвали Chi Day Story, так что игра известна под двумя именами.
The Guardian Legend интересна во многих отношениях. Это был мультижанровый микс: летающий экшен и ролевая игра. В целом она опередила время и позже была признана эталоном. TGL была сложной и многообразной; я не мог оценить ее в детстве, не говоря уж о том, чтобы пройти.
Будущее, к Земле приближается огромная космическая станция (скорее даже организм). Мы управляем девушкой-киборгом, способной превращаться в звездолет. Игра начинается с пролога: нужно подлететь к станции, пробить ее защиту и попасть внутрь.
Здесь игра переходит в ролевой режим. Станция представляет собой целый мир, и мы начинаем его исследовать. Мир делится на экраны-комнаты, где нужно побеждать врагов, сражаться с мини-боссами, искать усилители и так далее. Цель – найти специальный портал в туннель. Прыгнув в него, девушка превращается в звездолет, и мы переходим в режим экшена. В конце туннеля ждет босс, а за победу дают ключ к новой части карты.
По ходу игры мир расширяется, героиня открывает все новый арсенал, появляются различные механики, туннели и боссы становятся более жуткими. Попадаются миролюбивые аборигены, с которыми можно торговать. Некоторые дают подсказки, как открыть туннели, запечатанные загадками.
Игра затягивает, и немало счастливых часов я провел в детстве, исследуя The Guardian Legend. Трудно передать словами, что же особого в игре и чем она опередила время, но все же я попытаюсь.
Пожалуй, главная находка разработчиков – это поощрение исследовать игровой мир. Дело в том, что сложность игры растет очень быстро, и особенно это заметно в туннелях. Если первые два игрок еще осилит, то соваться в следующие без прокачки не имеет смысла – проиграешь. Поэтому перед тем как открывать туннель, нужно побродить по округе в поисках усилителей. И вообще – всячески прокачивать героиню.
По своим меркам игра масштабна. Она предлагает большой мир, отличную графику, разнообразие врагов, оружия, механик. В каждой зоне разный ландшафт. Также в игре прекрасная музыка! Темы главного экрана и подводных туннелей я запомнил, видимо, уже на всю жизнь.
Игра хранит довольно большое состояние, поэтому пароли в ней очень длинные. Представьте, каково было мне, ребенку, переписывать с телевизора 32 символа [a-zA-Z0-9], чтобы сохраниться? Тогда ведь нельзя было сфотать экран. Сколько раз я терял листочек или переписывал с ошибками, из-за чего приходилось откатываться на старые пароли…
В игре не было справок и уведомлений, как принято сейчас. Приходилось записывать, что находится в какой комнате, чтобы позже туда вернуться. У каждой комнаты были координаты X и Y; всего их было несколько сотен. Игра была слишком сложна для меня: замысел разработчиков просто не помещался в голове. Я прошел The Guardian Legend на эмуляторе, когда уже был взрослым. Даже тогда я поразился, насколько сложна игра… и вместе с тем – прекрасна.
В награду за прохождение давали чит: если ввести пароль “TGL”, включится экшен-режим. В нем полностью убрана ролевая часть, оставлены только туннели. Специально для тех, кто хочет зарубиться с боссами.
Вряд ли вы кинетесь играть в восьмибитку 1988 года. Но знайте – есть такая жемчужина в мире игр, и есть те, кто ее любят и вспоминают с самыми теплыми чувствами. А если вы думаете, что я один такой чудик, почитайте комментарии к прохождению на Ютубе. Там все как один заливаются слезами.






-
Игры (1). Teenage Mutant Ninja Turtles 3: Manhattan Project
Давненько я не делал подборок по принципу чисел или постгреса. В этот раз я бы хотел поговорить об играх.
В детстве я много играл; увидев в первый раз приставку денди, я понял, что это мое. Тогда я не знал, что стану программистом, но какая-то химия возникла. Увы, у меня не было Спектрума или других программируемых платформ; это были обычные денди, сега, первая плойка, комп. Переход на следующую приставку случался редко, примерно раз в пять лет. Жили мы небогато, и я годами копил за заветную железку.
Я не избегал книг, однако игры развивали меня не меньше. Я запоминал сюжеты, персонажей, рисовал уровни по памяти, придумывал другие концовки. Обожал искать игровые механики, секретные уровни. О персонажах различных RPG мы с приятелем говорили часами, примерно как наша учительница – о персонажах “Войны и мира”. А уж сколько было эмоций, когда мы собирались вчетвером, подключали к первой плойке четыре геймапада и рубились на одном телевизоре!
В этой подборке я хочу рассказать об играх, которые мне запомнились. Уточню: это не обязательно хиты, в которые играли все. Скорее всего, о многих играх вы узнаете впервые, и я этому рад. Получив столько удовольствия в детстве, я в своем роде в долгу перед разработчиками. Мы, нищие дворовые пацаны, покупали пиратки: лицензионного контента не было в принципе. Едва ли разработчики получили хоть что-то с дисков и картриджей, что прошли через меня.
Буду публиковать игры по нарастанию мощности платформы: денди, сега, плойка, писюк.
В первом выпуске – замечательная игра для денди под названием Teenage Mutant Ninja Turtles 3: Manhattan Project от 1992 года. В народе – просто “третьи черепашки”.

Злой Шреддер поднял остров Манхэттен в небо, и надо идти выручать жителей. Игра начинается с пляжа, продолжается в море, затем мост, город, канализация, технодром, пещеры, небоскребы и другие локации. На каждом уровне два босса: промежуточный и финальный. Нам предстоит спасти Эйприл, победить обычного Крэнга и его супер-версию, а в финале сразиться с супер-Шреддером.
В игре много юмора, враги появляются так, чтобы было не скучно их валить: выходят из-за края экрана, лезут из люков, телепортируются или даже собираются на конвейере. Игра довольно сложна: в детстве мне было трудно играть в нее. Она рассчитана на двоих игроков, и нет логики, которая определяет, сколько врагов выпускать: все захардкожено. Так что одному игроку приходится тяжеловато.
Каждый, кто играл в третьих черепах, знает, что пройти ее можно только за Леонардо – черепашку с мечами. Дело в том, что боссы в игре очень сильные, и приходится бить их суперударами. И здесь одна тонкость: суперудары других черепах работают по прямой. У Леонардо суперудар объемный: он задевает тех, кто немного выше и ниже на плоскости. Из-за этого можно стоять чуть ниже босса и не ловить его удары, зато наши суперудары будут проходить по нему.
Кроме хорошего геймплея в игре была особенность: борьба с пиратством, которую учинил разработчик.
В оригинальном картридже была специальная перемычка между двумя пинами. Игра проверяла, проходит ли между ними электричество, и если нет, значит, картридж пиратский. Самое интересное: проверка случалась не в начале игры, а на середине во время битвы со Шреддером за Эйприл. И нет бы написать: дружище, у тебя пиратский картридж, купи лицензию. Нет – Шреддер становился неуязвимым! Я доходил до него дюжину раз без смертей, лупил по полчаса – и все без толку. Настоящее издевательство над ребенком!
Так что пройти игру в детстве не удалось. Но лет пять назад я включил эмулятор на Маке, достал с полки геймпад. Качнул ROM, завел черепах – и прошел с первой попытки! Оказалось, я помню порядок уровней, как валить врагов и где они появляются, где лежит пицца для восстановления здоровья и многое другое. Спас Эйприл, победил Шреддера и наконец-то увидел все то, что не удалось тридцать лет назад.




Прохождение:
-
Autocommit
Если вы работали с JDBC (интерфейс к базам данных в Джаве), то наверняка видели свойство
autoCommit. Точное его описание – камень в ботинке: вроде бы маленький, но измотает всю душу.Поведение его следующее. Когда
autoCommit— истина, запросы выполняются без явных транзакций. Например, вызываешьUPDATE, и изменения вступают в силу тут же. Если нужна транзакция, явно прописываешьBEGINиCOMMIT. КогдаautoCommitложь, то все интересней. Если в текущий момент транзакции нет, то любой запрос откроет ее. Далее все запросы будут выполняться в транзакции, пока мы не вызовемCOMMIT.Спрашивается, какое значение у
autoCommitпо умолчанию? Ответ — истина, но путаницы все равно хватает. Тысячи людей погорели на том, что вызываютINSERT, смотрят в базу – а там фига с маслом. Оказывается,autoCommitбыл ложью, и перед вызовомUPDATEсработал неявныйBEGIN. В конце мы не вызвалиCOMMIT, транзакция не закрылась, изменения откатились.Многие джависты думают, что
autoCommit– часть базы данных. И очень удивляются, узнав, что это не так. База данных ничего не знает ни о какомautoCommit. Этого свойства нет в протоколе Postgres, нет его и в протоколах других баз. Во всех случаях он имитируется логическом флагом и бородой if-else. Причем если вы думаете, что все просто, то ошибаетесь: на уровне драйвера проверка на autoCommit случается часто. Скажем, при входе в транзакцию нужно запоминать его прошлое значение и потом восстанавливать. При смене autoCommit надо проверять, находимся ли мы в транзакции и если да, завершать ее. И все это – ради чего?Я согласен, что, возможно, какая-то бородатая база вроде IBM DB2 на мейнфреймах поддерживала autoCommit на уровне протокола. Но сегодня это рудимент вроде лишнего позвонка, который когда-то был хвостом. В современных драйверах autoCommit имитируется программно, при этом нет способа избежать его вообще.
К тысяче людей, погоревших на
autoCommit, присоединился и я. При этом дело было не на Джаве, а в Питоне с библиотекойpsycopg2. Все по классике: скрипт подключается к базе и делаетUPDATE. Проверяю базу — изменений нет. Оказалось, вpsycopg2слизалиautoCommitс JDBC, и по умолчанию он выключен.Слушайте, хватит уже! Перестаньте тянуть в библиотеки это старье. Опирайтесь на естественное поведение базы: либо каждый запрос выполняется в неявной транзакции, либо их несколько заключаются в транзакцию. В современных библиотеках никаких autoCommit нет, и слава богу.
AutoCommit– это древнейший рудимент из пещерных времен. И в отличие от лишнего позвонка, он колоссально мешает жить. -
Про архитектуры
Говорят – такая архитектура, сякая архитектура. Масштабируется, учитывает то, другое. Но мне кажется, чаще всего у архитектуры одно оправдание – любопытство разработчика.
Все мы люди, и хочется попробовать новенького. Интернет и блоги только разогревают интерес. Кажется, что другие строят идеальные архитектуры, а ты — неудачник. Поэтому делается CQRS на очередях с Монгой и микросервисами в Кубернетисе. Рисуются диаграммы с адским числом стрелочек. Начальство ничего не понимает, но вроде бы выглядит солидно. Хорошо, делайте.
Время и сложность расшатывают архитектуры. В начальный момент схема статична, и кажется, что все идет по плану. Но, судя по всему, нарастающая сложность – это базовый закон мира: она прибывает и расшатывает все подряд. Читали книгу “Цель”? Там на примере игры со спичками показано, как ошибка в одном узле завода сказывается на всем производстве. Базовый принцип! Вот и здесь что-то подобное: сложность нарастает и все расшатывает.
Выясняется, что гениальная архитектура не любит, когда ее шатают: она не учитывает то, другое, третье. Переделывать поздно, потому что выяснится, что Акелла промахнулся, а это чревато вопросами. Архитектуру подпирают костылями, делая вид, что это минорчики, и беспокоиться не о чем.
Половина всех моих действий уходит на то, чтобы преодолеть проблемы “удачных” архитектур. Все они были кем-то составлены, представлены, защищены перед руководством. И вот я иду в базу не прямым путем, а через три микросервиса; пишу экраны кода, когда при ином подходе понадобилась бы строчка.
Поддержка таких архитектур – это расплата за неудачное решение, за праздное любопыство. Своего рода дань, которую взимает сложность.
Архитектура должна быть простой – это ее ключевое свойство. Архитектура должна умещаться в голове целиком, не вымещая других вещей. Простые вещи легко наращивать: даже если вы начали с монолита и одной базы, позже из них легко получить несколько сервисов и баз, а между ними очередь. Если вы начали с дюжины сервисов, баз и очередей, этот зоопарк вам не вывезти.
Сложность не должна опережать удобство. Как у Кнута: предварительное усложнение душит систему.
Архитектуры могут казаться сложными, но иной раз за ними стоит банальное любопытство: желание экспериментировать или строить что-то свое. Иной раз поражаешься: боже, это следы доклада с Ютуба, который был популярен десять лет назад! Вот откуда дровишки!
Решайте задачи максимально простым способом, и вопрос архитектуры решится сам собой.