01 December 2023

Про хобби вне работы

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

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

А теперь спросите меня, чем я занимаюсь на работе...

 

Сегодня случился еще один конфуз из той же серии.
Читая очередную статью о том, что не надо людей на собеседованиях насиловать алгоритмическими задачками с LeetCode, я наткнулся в ней на пару примеров этих самых задач. Сам я всегда был категорически против задрачивания такого рода заданий, которые имеют около нулевое практическое применение и относятся больше к области математики, чем к программированию, но... Одна из задачек прям засела в голове и не отпускала, пока я сел и не решил ее. А потом еще одну. И еще. 

Я вообще чертовски далек от всех этих продвинутых фокусов типа "динамического программирования", алгоритмов балансировки деревьев, бла-бла-бла, но решение задачек оказалось чертовски увлекательным и аддитивным занятием, даже более веселым, чем пазлы в "Human Resource Machine". 

На некоторых задачках получилось показать даже весьма приличные результаты:


Интереса ради посмотрел на лучшие ответы для решенных задач на JavaScript, чтобы понять, как они соотносятся с эффективностью моих C++ решений. 

Так вот, JS это нечто, что работает как минимум на порядок медленнее и жрет в 6 раз больше памяти. Причем надо понимать, что плюсовый код запускают под санитайзером памяти, что, скорее всего, садит производительность как минимум в несколько раз...

По итогу, как набор пазлов, LeetCode штука прикольная, но насиловать этим людей на интервью -- упаси госпади!





04 November 2023

Как я оказался в Тулче, хоть изначально даже не знал о существовании этого города...

Вообще за Румынией водится много печальных рекордов в области ДТП.
К примеру, по итогам 21-го года, именно Румыния была на первом месте в Евросоюзе по количеству смертей вследствие происшествий на дорогах. Что представляет из себя эта статистика на практике мне удалось испытать на собственной шкуре. 

Крошечный, ничем не примечательный, румынский городишко Мэчин.
Перекресток, где наша машина должна была уступить главную дорогу. В плане обзора перекресток просто ужасный, прям вот хуже не придумаешь. Перед ним -- знак "STOP". Жена за рулем, она останавливает машину и начинает медленно въезжать на перекресток, чтобы получить ну хоть какую-то видимость. Я на долю секунды моргаю, а когда открываю глаза, то вижу, что наша машина въезжает в бок автомобиля, который летит по главной дороге...

Местный житель города Мэчин по имени Ник вечером пятницы вез троих детей из школы.
Путь от его дома до школы -- пять минут от силы. Но доехать за пять минут это очень долго и неинтересно, особенно в вечер пятницы. Поэтому Ник летит по родному городу на скорости 120 км/ч. В том числе и через все перекрестки с никакущей видимостью, где дополнительно стоят знаки ограничения скорости и даже зеркала, чтобы хоть как-то видеть, что происходит на пересекающих главную дорогах... 
А жена Ника, пребывающая в этот момент дома, за руль, кстати, сама сесть не может. Она сидит без водительских прав. Потому что три недели назад их у нее забрал местный полицейский по имени Мэдолин. И забрал их за злостное превышение скоростного режима.   

По итогу все участники ДТП, можно сказать, отделались легким испугом. Мы то знак видели и поэтому двигались на минимальной скорости, готовые в любой момент уступить дорогу. Но когда на перекрестке с таким обзором кто-то летит на скорости 100+, пересечь его безопасно становится практически невыполнимой задачей...

По жизни я вообще не фаталист. Человек не суеверный. Но когда с тобой происходит такое, волей-неволей лезут в голову всякие странные мысли. Если бы наша машина заехала на это злополучный перекресток буквально на секунду раньше, то последствия могли бы быть немного печальнее. 
И вот ты начинаешь что-то вспоминать, анализировать, прокручивать. Подъезжая к городу останавливались, чтобы сбегать в кусты у дороги. А могли бы и не останавливаться -- нам до отеля в Галаце ехать оставалось меньше часа. Или вот, допустим, черт с ним, остановились, но ты на один раньше меньше бы стряхнул и сложилось бы все по другому... 
Но самое интересное, что прокручивая в голове десятки факторов из-за которых моя семья могла бы прекратить свое существование в этом месте, в это самое время, я понял, что самый главный фактор, он всего один. 
24 февраля 2022 года. 

 



22 July 2023

Дегенеративный AI

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

Безусловно, это прикольное свойство такого рода алгоритмов -- вести вроде как осмысленный диалог, с "пониманием" его текущего контекста, но вот к потенциальной пользе такого рода "бесед" есть большие вопросы.
Практически все мои диалоги на профессиональные темы (т.е. по теме программирования) состояли из некорректных и крайне сомнительных ответов машины, хоть какой-то "смысл" из которых мог бы извлечь разве что специалист, глубоко разбирающийся в теме. Новичка же программирование с подсказками AI будет постоянно заводить на крайне опасные территории. И нет ничего удивительного, что сообщество "Stack Overflow" практически моментально среагировало на появление ChatGPT тотальным запретом на постинг результатов работы этого алгоритма в качестве ответа на задаваемые вопросы. 

Да ладно, хрен с ним, с программированием, я вот сегодня, смеха ради, закинул в ChatGPT совсем простой запрос "best coop platformers of all time" и получил (вместе с предупредительным "это очень субъективно") следующую десятку игр:
    New Super Mario Bros. Wii (2009)
    Rayman Legends (2013)
    Cuphead (2017)
    Donkey Kong Country: Tropical Freeze (2014)
    Trine 2 (2011) 
    Overcooked 2 (2018) 
    LittleBigPlanet 2 (2011) 
    Super Mario 3D World (2013) 
    Guacamelee! (2013) 
    Lovers in a Dangerous Spacetime (2015) 

Все хорошо, не считая небольшой проблемы -- "Overcooked 2" и "Lovers..." это не платформеры никаким боком.  



Т.е. даже в самой тривиальной выдаче 20% информации это мусор, для отсеивания которого не нужны какие-то супер специфические, экспертные знания.  

Ради продолжение шоу ввел точно такой же запрос три минуты спустя.
Получил следующую десятку:
    Super Mario Bros. Series (Various Nintendo Consoles)
    Rayman Legends (Multiplatform)
    Donkey Kong Country Series (Various Nintendo Consoles)
    New Super Mario Bros. Series (Nintendo Consoles)
    Castle Crashers (Multiplatform)
    Cuphead (Multiplatform)
    Trine Series (Multiplatform)
    LittleBigPlanet Series (PlayStation Consoles)
    Spelunky 2 (Multiplatform)
    Guacamelee! Series (Multiplatform)

Какие изменения мы видим в новом списке? 
Во-первых, AI почему-то начал писать про серии игр (6 элементов в списке), хотя запрос был точно такой же и спрашивали его просто про игры, а не серии. 
Во-вторых, если сохранять хоть какую-то системность выдачи и исходить из серий, то мы должны были бы видеть "Spelunky Series", которая представлена точно так же всего двумя играми как и "Guacamelee!". 
В-третьих, в выдаче по прежнему есть мусор -- "Castle Crashers" это не платформер. 
В-четвертых, а куда подевался год выпуска? Почему в первой выдаче он был, а во второй этот момент перестал быть важным и появилась платформа?  
И вообще, а это в принципе правильно, что каждый свой ответ AI генерирует, имея глубоко в фундаменте огромный фактор случайности, и ни один из пяти одинаковых запросов не даст одинаковый результат?  

Теперь про выводы из всей этой истории.
В своем текущем виде такого рода AI алгоритмы мне видятся не то, чтобы полезными, а даже вредными. Подкупающая простота получения глубоких "аналитических" ответов по абсолютно любой теме приводит к тому, что многие, в силу лени, принимают их за истину в последней инстанции, даже не пытаясь задействовать минимальный уровень скепсиса и производить хотя бы поверхностную предварительную проверку. 
А многие держатели ресурсов с контентом уже начали потирать ручки, надеясь заваливать свои сайты дешевым генерированным материалом типа "Лучшие TWS наушники, которые вы можете купить прямо сейчас" или "Десять причин, почему вам стоит попробовать анальный секс". Сеть начала активно заполняться информационными помоями, которые представляют из себя миллионную перекомпиляцию того, что уже давно было написано людьми, с досыпанным ворохом ошибок, неточностей и дезинформации...
 
Как говорится, добро пожаловать в Web нового поколения
 



03 May 2023

Лытдыбр

Решил отписаться по всяким мелочам, чисто чтобы не терять форму и чтобы Google этот бложек на радостях не перевел в архивное состояние.

Погнали!


***

Зеленский сегодня (3-го мая) внезапно прибыл с визитом в Финляндию. 

Сообщаю об этом ребенку и получаю ответ в духе времени:
- А что его выпустили? Ему разрешили выехать?  


***

На Steam Deck периодически поигрываю в игры Nintendo в эмуляторах (угу, сейчас это "Advance Wars").

Постоянно спотыкаюсь о бесячую проблему, которая доставала и дома, когда в течении дня мог играть во что-то и на Switch и на ПК. Речь идет про разное расположение кнопок на геймпадах. 
Испокон веков у большой N кнопка "A" находится правее кнопки "B". У Microsoft же все наоборот. Причем с точки зрения логики использования, функции кнопок "A" и "B" аналогичны на обоих платформах -- первая это операция подтверждения, а вторая -- отмены. 

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

Для гайдзинов, естественно, геймпады адаптировать никто не стал. И так пусть в ноги кланяются после своих Atari. 


***

Смотрю потихоньку сериал "Mad Men" про будни рекламного агентства в Нью-Йорке 60-х. 

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

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

А ведь раньше это практически был билет на большой экран или в телевизор...

Что касается самого сериала -- он очень крутой. Правда, похоже, что четвертый сезон был пиком. Досматриваю сейчас пятый и вижу, что сценаристы как-то подисчерпались и медленно дрейфуют в сторону "jumping the shark".

11 February 2023

Steam Deck: первые впечатления

Прошлой осенью стукнуло четыре года, как у меня в доме появился Nintendo Switch. Более чем достаточно, чтобы в полной мере распробовать прелести портативного гейминга. Поэтому, когда Valve анонсировали Steam Deck, я сразу же им заинтересовался. Некоторое время после старта продаж эта консоль была в жутком дефиците и, даже если что и доезжало к нам в страну, у барыг это продавалось по совершенно неприличным ценникам.
Как мы знаем, в прошлом году наконец-то завершилась острая фаза дефицита полупроводников, консоль начала свободно продаваться, а значит некоторые товарищи, доставляющие к нам консоли из Европы, поумерили свои аппетиты. 

Так как у меня за плечами богатый опыт использования актуальной портативки Nintendo, то, рассказывая о Deck, я буду, в первую очередь, сравнивать конкретно эти две приставки. 

И еще. Deck, как и Switch, умеет работать в док-режиме, но т.к. лично у меня на хозяйстве есть современный ПК, подключенный к 75" телевизору, и внушительная коллекция Xbox геймпадов, то приставку от Valve я буду рассматривать исключительно в портативном сценарии использования.   


Внешний вид 

Steam Deck очень большой. В сравнении со Switch -- прям таки огромный. 
Если использовать приставку исключительно в помещении, то никаких особых неудобств это не приносит. Она не тяжелая, очень удобно лежит в руках и с ней без проблем управляется даже моя одиннадцатилетняя дочь.  
На самом деле, такие габариты дают немало преимуществ. Есть куда отводить тепло, чтобы оно не проходило через области, где игрок держит руки. Valve не поскупились на огромный хват и держать Deck намного комфортнее, чем плоский как доска Switch. Большой экран в 7", использовать который сильно приятнее 6.2" малыша, который ставят в модели без OLED технологии. 
И, наконец, органы управления -- их много, сильно больше, чем у Switch, и они заметно удобнее. Но про управление надо писать отдельно. 

Во-первых, стики, которые имеют большой ход и по размерам соизмеримы со стиками классических полноразмерных контроллеров, а не с огрызками, которые ставят на джойконы.
Во-вторых, нормальная крестовина, вместо кнопок. Единственная к ней претензия (да и вообще, единственная претензия из области органов управления) -- она не очень удобная для прожима диагоналей в файтингах. Если что, в этом смысле, Switch Pro Controller не сильно лучше.
В-третьих, есть четыре дополнительные кнопки на тыльной стороне, на которые можно цеплять, к примеру, клавиатурные "Enter" и "Escape" для игр, которые не идеально управляются с геймпада.     
В-пятых -- целых два тачпада, которые закрывают вопрос с играми, заточенными под управление мышкой. Дополнительный бонус -- на левом тачпаде, кроме центрального клика, есть еще четыре клика по периметру.

09 January 2023

Heroes of Might and Magic III: как работает сложная система правил

Когда почти четверть века назад я начал играть в только-только вышедшую третью часть легендарных "Героев", я уже был программистом. В то время это еще не стало моей профессией и особых денег не приносило, но мыслил я уже исключительно в этой парадигме и, к примеру, когда сталкивался с той или иной программой, постоянно задавал себе вопрос "а как они это сделали?". В случае "Героев", я прокручивал в голове способы реализации сложной системы правил, по которым живет эта игра. Те, кто играл, знают, что к огромному количеству однозначно описываемых понятий, типа параметров героя или рекрутированных существ, есть бесконечное число "модификаторов": исключений из правил, которые трансформируют их поведение. Иммунитет к тому или иному виду магии, невозможность сбежать с поля боя, бонус при атаке определенных классов существ, модификаторы перемещения по карте, нестандартные правила регенерации манны и т.д. и т.п. 

К огромному сожалению, оригинальный код игры так и не стал доступен публично, но так как игра имеет прямо таки культовый статус (особенно в русскоязычном пространстве), собралась команда энтузиастов, которая решила просто взять и переписать игру с нуля, стараясь по максимуму повторять поведение оригинала. Проект называется VCMI engine и я, не без интереса, покопался в его исходниках. Особенно в той части, которая касалась реализации описанных выше "исключений из правил". 

Надо сказать, авторы VCMI подошли к решению вопроса основательно. 

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

Во-вторых, та самая сложная система исключений из правил получила название "бонус" и это стало общим механизмом, пронизывающим все игру насквозь. Свойства любого артефакта это перечень бонусов. Любая особенность монстра это тоже бонус. Скиллы героя это бонусы. И все эти бонусы сведены и описаны в одной огромной таблице. Герой, которые научился ходить по воде, имеет в игре бонус WATER_WALKING. Стреляющий во время битвы монстр отмечен как SHOOTER. А если на него кастанули Forgetfulness, то он получит "бонус" FORGETFULL  и разучится стрелять на определенное время (время жизни -- один из атрибутов бонуса). 

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

Схема распространения бонусов в игре

В итоге, к примеру, Ангелы описаны в конфигурационном файле castle.json таким вот образом:

    "angel" :
    {
        "index": 12,
        "level": 7,
        "faction": "castle",
        "abilities":
        {
            "hateDevils" :
            {
                "type" : "HATE",
                "subtype" : "creature.devil",
                "val" : 50
            },
            "hateArchDevils" :
            {
                "type" : "HATE",
                "subtype" : "creature.archDevil",
                "val" : 50
            },
            "const_raises_morale" :
            {
                "stacking" : "Angels"
            }
        },
        "upgrades": ["archangel"],

Массив abilities как раз и описывает бонусы, например, ненависть к дьяволам имеет бонус типа HATE, subtype указывает класс существ, против которых он работает, а val -- процент дополнительного урона.