Не могу не написать про последнюю серию The Last of Us, раз уж начал. Как обычно —
СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ
Сериал получился очень странным. С одной стороны — да, есть мощнейшие сцены. Но они мощнейшие только локально, в моменте. В общую картинку они так и не складываются, накопительного эффекта не происходит.
Поначалу вырисовывалась красивая концепция — все, кого герои встречают, живут максимум одну серию. Хорошие, плохие — все. Как вести себя в такой ситуации? Что будет тобой двигать? Что будут означать для человека такие встречи, если он знает, что долго они не продлятся? На все эти вопросы сериал не дает ответа 🙂 Более того, они даже ни разу не вспоминают потерянных попутчиков и встречи эти никак героев не меняют. Так что это скорее случайность, а не концепция. А жаль, хорошая тема была бы.
Про постапокалипсис тут тоже ничего нет, задник этот очень условный. Ну там самолеты какие-то падают, нацистские правительства какие-то, рейдеры — это все на уровне фоновых мазков проработано, и углубляться в это бессмысленно. Человек против мира — такое можно и на диком западе представить, и в большом городе — да где угодно. А жаль, про постапокалипсис что-нибудь умное я бы тоже с удовольствием посмотрел.
Остаются отношения девочки и Педро. Вроде бы, достойный костяк, немало хороших фильмов на этом сделано. True Grit, например, или, не знаю, Leon The Professional тот же. Но тут тоже какая-то дыра, в некоторых сериях героев вообще почти не показывают!
Ну и короче я даже не знаю, от чего тут кайфовать. Я очень хотел бы найти, но не могу, к сожалению.
Ну и про концовку. Я знал, что она противоречива, но не знал, чем конкретно. Еще раз — спойлер!
Итак, Джоел успешно приводит Элли на операцию по изучению ее иммунитета. И узнает, что Элли в процессе погибнет, зато доктора получат лекарство и спасут весь мир! Штука в том, что доктора решили это сделать молча, без согласия Элли. Ну Джоел, понятно, психанул, перестрелял весь госпиталь и «спас» Элли. А мир не спас. Да еще и не сказал ей ничего. Ну вот, типа, противоречие. Прав или не прав?
И это, сука, действительно бесит. Потому что конфликт тут не настоящий, а из серии «не поговорили». То есть строится на том, что кто-то кому-то чего-то не сказал. То есть, все хорошие, противоречия нет, но все грустные и страдают. И, главное, путь к разрешению кристально ясен. Но нет, будем сопли жевать.
Бесит, если честно, такая драматургия. Поговорите — и проблема решена. Я еще понимаю, для первого акта, туда-сюда, как завязка пойдет. Но заканчивать на этом?
На самом деле, главная причина противоречивости: а не охуели ли вы, господа (за мат извени), заканчивать сезон на полуслове? Что это еще за клифхенгеры? Давайте уж, пожалуйста, разрешайте конфликты, а для второй серии придумывайте новые. А так не пойдет. Да, вот от этого у меня реально бомбит. Что это еще, блять, за эксперименты? Это вам что, Дюна часть первая?
Ну а насчет — правильно ли поступил Джоел? Сложно сказать. Тут условность задника начинает мешать прочувствовать важность решения. Дело в том, что в мире Last of Us они боятся этой мировой эпидемии меньше, чем мы боимся короны. Буквально — ходят без масок, лазят по зараженным канализациям, трогают/дышат грибами. Кто умер — те уже умерли, с новыми зомби (опять же, по тому, что нам показали) особых проблем ни у кого нет. У людей там все довольно неплохо, как бы странно это ни прозвучало. Они научились sustainable жить и даже наладили производства и комунны. Сложно при таких вводных почувствовать, что лекарство кого-либо там бы спасло или вообще что-то существенно поменяло.
Это, опять же, к вопросу о качестве сценария и накопительном эффекте. Если бы нам восемь серий показывали, как всем хреново именно без лекарства, то к девятой мы бы, может быть, прочувствовали всю трагедию необходимости делать выбор. А так у них там то клубничка, то фашисты, то педофилы. Ну и кому тут поможет противоядие?
Не понимаю я облака. Не понимаю и все.
Три сеньера (!) ебались с прошлого четверга, чтобы запустить ебучую функцию в ебучем Firebase. Причем не с нуля — у нас уже были функции, нужно было добавить новую. Но нет, не работает и все тут. Раньше работало, и продолжает работать, а точно такая же новая — нет.
В процессе я насмотрелся на всякие бездны админок Гугл клауда, которых, конечно же, несколько версий одновременно, переходы между которыми неочевидны, если вообще существуют. То есть буквально, читаешь ответы на стековерфлоу, а там «попробуйте вот такой URL», пробуешь — и попадаешь в интерфейс, который никогда не видел и как в него вообще попасть — хз.
Насмотрелся на всякие сообщения типа 7423/7424 permissions. Кому, в каком страшном сне, в принципе, хотя бы теоретически, может понадобиться регулировать доступ на таком уровне гранулярности? Для каких задач? Я понимаю, что «серьезных», но блин.
Начитался экспертов, которые рассказывают, что сообщениям об ошибках нельзя верить — если написано одно, то проблема, скорее всего, в чем-то другом. Вот это серьезный, энтерпрайз подход, вот это я понимаю! Годы здоровья этим экспертам, потому что я человек доверчивый — вижу узкоспецифичное сообщение об ошибке про CORS — думаю, что проблема именно в CORS.
Насмотрелся на проблемы версионирования, когда одна и та же тула раньше работала одним образом, а теперь другим. Или когда та же версия той же тулы перестала работать. Или Гугл на своей стороне поменял логику и теперь те же действия приводят к другим результатам. Удобно, ничего не скажешь.
Ну и надо ли говорить, что документация под все это практически отсутствует. Документация — это стековерфлоу и форумы, а сам гугл в основном показывает «пук-среньк, поставьте наш SDK и ни о чем не спрашивайте». Серьезно, у них больше доков по тому, как SDK поставить, чем по API этого SDK.
И все это ради того, чтобы вызвать три строчки скрипта «в облаке». За потраченное время я бы уже купил три сервера, настроил между ними load balancer и http-сервер с letsencrypt с базой поднял. И все бы работало.
Кстати, мой любимый ответ на stackoverflow, который я видел за это время — у меня что-то перестало работать, я подождал пару дней, ничего не делал, заработало опять. То есть облака еще и «надежны».
Короче, не понимаю, кому эти облака нужны. Нифига не удобно же, и сложно как ракетный двигатель. В чем плюсы?
Расходимся еще раз, хз че со строкой делать. В смысле непонятно, как через Reader, который под капотом кодирует в UTF-8, считать n байт, учитывая что единственное что он дает делать — читать UTF-16 character. Можно, конечно, читать по-одному char и считать, сколько места он занимает в UTF-8, но это как-то превышает пределы идиотизма, на которые я готов пойти
Предполагается, что этот самый Reader заведен для удобства, так вот, знаете что? Мне почему-то нифига не удобно. Просто дайте мне байты, неужели я так много прошу...
Я уже писал, что терпеть не могу приватные поля и вообще всяческие заборы и ограничения доступа. «Но Никита, они же защищают тебя самого от плохих решений», — скажете вы.
Ну и ситуация. Понадобился мне значит бинарный протокол до Кложевского встроенного РЕПЛа. Потому что хотите вы или нет, а бинарные протоколы сильно проще кодить, чем текстовые, а потом они еще и компактнее получаются, короче, одни плюсы.
А Кложевский REPL-сервер дает только текстовый канал. То есть открывает обычный сокет, конечно, но поверх его бинарного InputStream-а создает пять оберток, одна из которых как раз занимается тем, что берет вашу UTF-8 строку и конвертит ее в байты за вас. Удобно? Нет!
Ну то есть удобно, пока ты там какие-нибудь JSON-ы или EDN-ы пересылаешь, но их парсинг дело не одного часа и даже не одного дня усилий, не говоря уже о размере кода. А я там себе MsgPack присмотрел, который сделан вот ровно как я бы сам делал, прям идеальненько, и парсер с сериализатором я вчера прям за час накидал. Но бинарный, сука, надо уметь байтики пересылать.
Ну и вот. Ситуация. Сокет есть, технически по нему ходят байты, но ебучая Джава тебя от этого «абстрагирует» и прячет его в приватные поля. Если вы думаете, что это какая-то метафора, нет, конкретно в случае с Кложей там три обертки — InputStreamReader, LineNumberReader и LineNumberingPushbackReader. Потому что у нас было четыре пакета травы, бла-бла-бла, когда начал оборачивать ридеры в ридеры, сложно остановиться.
И вот я стою перед ситуацией. Либо я расчехляю рефлекшн и --add-opens=java.io
, которые жестко завязывают меня на конкретные реализации, конечно, но зато я получаю то что хочу, вещь, которая работает, пусть и с риском когда-нибудь в будущем сломаться или, допустим, не работать на какой-нибудь странной JDK (с чем я, в принципе, готов жить). Или не получаю совсем ничего и иду сосать лапу. И мне как-то кажется, что в ситуации «или что-то, пусть ограничено, но работающее, или тупо ничего, иди нахуй» объективно лучше первое, а не второе, при любых вводных.
Ну и вообще штука в том, что не авторам InputStreamReader-а это за меня решать. Если я хочу до чего-то добраться — дайте мне, блин, добраться. А я уже сам решу, плохо это, хорошо, или . Все равно эти реализации не менялись с Java 1, и уже, наверное, никогда не поменяются, а все сторонние JDK просто копируют реализацию. Я могу оценить этот риск, а автор, который изначально эти поля спрятал — не может.
Так мы и живем в мире, где, с одной стороны, компьютер должен и вроде бы может работать, сука, быстро, а с другой абстракции накладываются на абстракции и прячут внутренности друг от друга, а следующему слою приходится притворяться, что он не знает, что там происходит, и обходить эти ограничения по-своему. Все заняты, все устали, результат печальный.
Ну что мне теперь, бинарный протокол в base64 кодировать, что ли? Нет, так мы будущее не построим.
P.S. Немножко забавных деталей: InputStreamReader прячет переданный InputStream в sun.nio.cs.StreamDecoder, и туда я уже не очень хотел лезть, потому что выглядит проприетарно. Но зато он использует объект InputStream еще и как lock для синхронизации (в Java можно любой Object для этого приспособить), ну вот я на него и завязался. Ненадежно? Еще как. Why women live longer than men-вайбы. Ну а что мне остается делать?
Ух как бесит мода писать обезличенные предложения. Типа, вместо «Я люблю кофе» — «Люблю кофе». И так же понятно, что «я», вот и сократили. Это от Ильяхова пошло, да? Просто другого такого вредителя не знаю.
И еще немного подбешивает Present Continous вместо будущего времени о чем-то, что еще даже не случилось, а только в планах: «Студенты делают задания и защищают диплом» вместо «Мы выдадим студентам задания, а в конце курса они защитят диплом».
Сокращение хороший прием только потому, что ему легче всего научить. Прочитавшие Ильяхова пишут сухо, а нормальные ребята вроде нас с вами — сочно и красиво, и не стесняются подлежащих. Сравните:
> Меня ух как бесит мода писать обезличенные предложения. Типа, вместо «Я люблю кофе» некоторые пишут «Люблю кофе». И так же понятно, что они имели в виду себя, вот и сократили. Эта мода пошла от Ильяхова, да? Я просто другого такого вредителя не знаю.
Мы же не роботы. И даже студенты Бюро не роботы. Не надо отбирать у них личные местоимения.
Не знаю кто как, а я последний месяц с кайфом пишу на Питоне ООП. Ну вот это старое-доброе, с классами, наследованием, виртуальными методами.
Среди функциональных программистов это считается зашкваром, а я ничего плохого в этом не вижу — когда инструмент используется по назначению, это же прекрасно. Когда работал в ДжетБрейнсе, у нас все было лямбда через лямбду, лямбдой погоняет. Лямбды, конечно, великое изобретение, но они же не гибкие ни разу, непрозрачные абсолютно, да еще и одинаковые все. А я люблю, когда все по полочкам, названо аккуратно, внутренности видно.
Ну и с ООП надо аккуратно, конечно. Лишнего не делать. Если интерфейс, то с несколькими реализациями. Если паттерн, то по делу, а не «на будущее».
Но если все правильно, есть какой-то кайф, когда ты в родительском классе говоришь: вот тут дети будут переопределять, а в ребенке переопределяешь. Аккуратно как-то, что ли.
Ну и работает.
Утром произошел забавный момент лудонарративного диссонанса. Решил я купить себе игрулю Hitman III, значится. Заказал диск на Амацоне, т.к. диски дешевле, чем цифровая копия (что? да!).
Сегодня пришел почтальон. Давай, говорит, паспорт. Я ему аусвайс свой. А он такой — не, настоящий паспорт давай. И реально давай переписывать все данные: номер, дату рождения. Типа, игра 18+, и видимо там пометка была проконтролировать. Еще спросил, что за страна такая. Короче, как будто я Майн Кампф в библиотеке беру.
Выдал в итоге конверт. Открываю, там диск, и на нем большими красными буквами — Enter the world of the ultimate assasin. Добро, так сказать, пожаловать, в мир международного шпионажа и наемных убийц. Но чтобы поиграть, будь добр, предъяви паспорт, убийцы у нас на учете состоят. Ну просто забавный диссонанс.
Кстати, игра еще и требует постоянного онлайна, чтобы все убийцы были под постоянным надзором товарища майора из... Дании? Что тоже как бы не добавляет очков погружению.
Ну и чтобы пост был не зря — а объясните мне, в чем прикол компаниям требовать онлайна в своих играх? Геморроя много, а выигрыш в чем? Сам геймплей полностью оффлайновый, если ты там что-то себе накрутишь, ну, сам дурак, кому какое дело? Я понимаю, что есть какая-то неприятная капиталистическая причина это делать, но мне хочется понять, какая именно.
Разбирал в твиттере одно не слишком удачно сформулированное код-ревью, как пришли айтишники и давай обсуждать минусы вежливого обращения. МИНУСЫ! Типа, сколько максимум раз можно говорить пожалуйста? Нормально ли просить что-то сделать или надо приказывать? Поймет ли джун вообще, что от него хотят, если написать без оскорблений? Ну какое все-таки у нас сообщество, все о джунах думает и их удобстве, обожаю!
В связи с этим проговорю явно (да, явно, тут уже нельзя полунамеками): от вежливого обращения никто не умрет. У него нет, блядь, минусов! Что бы вы предпочли: унижающий вас тон и дельные замечания или вежливый тон и ТЕ ЖЕ САМЫЕ БЛИН дельные замечания? Кто-то реально выберет оскорбительный или там пассивно-агрессивный тон ПРИ ПРОЧИХ РАВНЫХ? Добровольно? Потому что суть-то не меняется.
Длиннее тоже не становится (моя вежливая версия даже короче получилась, например, и это я еще несколько «пожалуйста» добавил). В чем смысл настаивать на своем праве оскорблять других людей? Ради чего притворяться, что по-другому никак нельзя? Самоутверждение? Потому что других объяснений у меня нет.
Среди претензий была и такая, что, мол, вежливо писать это ж усилий надо прилагать, а у тимлида и так дел по горло, так что джуны обойдутся. На что я тоже хочу явно и недвусмысленно проговорить: усилия на формулировку надо прилагать, если только ты на самом деле так не думаешь. Если ты приходишь делать ревью с настроем «господи, все дебилы, за что мне вас бог дал, да откуда у вас руки растут, как такое говно вообще писать можно, все только на мне и держится», то да, чтобы этот настрой скрыть, надо прилагать усилия и выбирать формулировки.
Секрет? Не надо относиться к коллегам как к беспомощному говну, которое делает ошибки специально чтобы тебе день испортить. Всегда надо предполагать наилучшие намерения и продуктивный настрой. Тогда и формулировки сами начнут сами нормальные получаться, и переформулировать ничего не придется. Посмотрите еще выступление «This is Water» Дэвида Фостера Уоллеса, чтобы впечатлиться.
(исходный разбор не привожу, потому что во-первых начнется все то же самое, что и в твиттере, а во-вторых люди начинают суть ревью обсуждать, а мне интересна именно форма в данном случае)
По поводу третьей серии The Last of Us — ревью не будет. Сериал меня окончательно завоевал, разбирать на кусочки не хочется. Да, наверное, можно было бы круче (историю любви во время зомби-апокалипсиса можно ого-го какую написать!), но так тоже пойдет.
По поводу стиля Крейга Мазина, впрочем, есть вопросы. Во-первых он очень поверхностный. Не герои, а стереотипы. Не ситуации, а шаблоны. Не мир, а удобный задник. Хотелось бы узнать про жизнь что-то новое, неочевидное и при этом правдивое, а не просто выжимающее слезу. Как оно все работает, что с чем связано, что изменилось, а что осталось точно таким же. Но это высокая планка и нельзя по ней судить произведение, у которого свои задачи, конечно. Но как зрителю посмотреть что-то такое очень хотелось бы.
Во-вторых, есть ощущение, что сценарий слишком уж прямолинейный. У него нигде нет второго дна. Если герои грустят — они ходят и говорят «я грущу», если им нужно выяснить отношения — они идут и выясняют. А хотелось бы это понимать через косвенные действия, детали какие-то. Иначе это слишком уж для младшего школьного возраста.
Ну и хотелось бы хоть немного поэтики, метафор. Зачем это все, на что это похоже, рефлексии хоть какой-то. Вот самолет упавший — что мы об этом думаем? Что это нам напоминает? На что надеемся? А то слишком механически как-то.
Ну и зомби, хотелось бы, чтобы они зачем-то нужны были. А то пока серии такие, что можно было бы и без зомби вполне то же самое рассказать. Особенно третья — почему важно, что это происходит именно во время зомби-апокалипсиса?
Еще я поиграл в игру и, ну, выяснилось, что всякие глупости вроде самолетов с неба или походов в туалет это самодеятельность Мазина. А я-то думал что безработных сценаристов только в гейм-индустрию берут.
Будет ли разбор четвертой? Только если она меня чем-нибудь максимально тупым разозлит. Так что шансы высоки 🙂
Last of Us, эпизод 2, часть 2/2
СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ
Потом герои идут на замес в музей. Тут, кстати, у меня чисто художественный вопрос: вас обламало бы сделать его музеем грибов, биологии там, не знаю, ботсадом? Красивее же было бы гораздо? И страшнее — хуй разберешь, какое дерево просто дерево, а какое на тебя сейчас прыгнет.
Почему девочке не дают пистолет я если честно не понял. Не то чтобы они ее держат в заложниках или ведут куда-то против ее воли. Она вообще-то с ними заодно, и причин ей не доверять я не вижу. Плюс, перед лицом грибов, все люди — братья, разве нет? Очень странная драматургия, короче.
Следует схватка с «кликерами». Кстати, еще один чисто видеоигровой момент: чтобы герои не побежали назад, дверь, через которую они зашли, заваливает. Come on, я понимаю, что игрока надо на всякий случай ограничивать, но тут-то у вас герои, которым _надо_ пробраться через эту комнату. Какая у них мотивация бежать назад?
Кликеры — это такие чуваки, у которых глаза заросли древесными грибами и они ориентируются тупо на слух. Казалось бы, герои о них знали (обсуждали их, пока шли по мосту), знали, что зараженные есть в здании (нашли свежий труп), плюс они, как утверждается, «много раз» делали вылазки за карантинную зону. Однако никакой специальной тактики против них не используют, хотя казалось бы, брось камешек в другой конец комнаты и беги. У сталкеров были гайки для похожих целей, тут-то поди американцы за 20 лет тоже что-нибудь сообразили бы? Может не гайки, но вон пули говорят в избытке производят.
Короче, чуваки успешно выбираются (а вы как думали?), происходит любопытный твист с Тесс (кстати, актриса охуенная, из всех троих она больше всего на живого человека похожа), а потом грибы звонят своим по грибнице (художественное допущение, позволим) и к ним бежит толпа зомбаков (какой зомби-фильм без толпы зомбаков?). Кстати, для слепых они довольно четко и целенаправленно двигаются. Тесс жертвует собой (очень классная сцена, правда, но почему в ней Тодд Ховард, я так и не понял) и все заканчивается хорошо. Ну как хорошо? Нормально.
К этой части замечаний почти нет, кроме ухоженных бород у трупов. I mean, представить, что топливо для вертолетов, таблетки для сна или даже сендвичи в постапокалипсисе будут делать я еще могу — в конце-концов, это какие-никакие а потребности, а вот чтобы масла для ухода за бородой производили — это уже как-то слишком. Но это мелочи, конечно, просто забавно. Начинаешь еще больше любить работу гримеров и художника по костюмам на фильме Дорога, где все выглядят так, как будто и правда 20 лет живут на улице.
Но, опять же, не было бы красиво — никто бы это не смотрел. Спишем на кино-условности.
Жду с нетерпением третью серию, там Ника Оффермана обещают! Судя по реакциям, многим эта рубрика нравится, так что ждите ревью в понедельник-вторник!
Одни из нас, эпизод 1, часть 2. Будующее. Ну как будущее, 2023-й. Спойлеры!
По поводу будущего меня больше всего интересовало как оно, собственно, устроено. В смысле цивилизация, очевидно, разрушилась. Нам показывают Бостон, который теперь всего лишь один район, обнесенный стеной, домов на 500? То есть это сколько, в лучшем случае, тысяч 50? Причем застройка городская и очень плотная, поэтому главный вопрос: а что они, собственно, едят?
Если нет цивилизации, еду надо где-то брать. Где? В холодильнике? Что там случилось с животными, не очень понятно, но скорее всего это агрикультура, поэтому должны быть поля, да? Ну вот их че-то не видно, ни за стеной, ни внутри.
Еще странно, что над городом летает вертолет. Вертолет! Никакой цивилизации нет уже как 20 лет, бензин хранится в лучшем случае лет пять, откуда топливо? И даже если нефть все еще добывают и перерабатывают, разве эффективно ее тратить на вертолет?
Еще бросилось в глаза обилие распечатанных табличек (не нарисованных, а именно распечатанных). Как они сохранили их производство? И полный экип полицейских, с автоматами, рациями, шлемами, щитами, короче, полный комплект. Есть ощущение, что за 20 лет без производства и с чуть другими приоритетами (выживание) экипировка была бы, кхм, чуть менее с иголочки и распределена, кхм, чуть менее равномерно.
Упоминается, что в Атланте есть фабрика, которая производит _только_ такие предметы первой необходимости, как пули и пилюли (простите за рифму). Очень странный выбор, да? Заставляет задуматься (о логике сценария).
К организации тоже есть вопросы. Выглядит все так, что есть какая-то военная диктатура и все остальные, которые должны работать за еду. Неужели избыток производства настолько большой, что можно прокормить целую армию (бездельников)?
И еще это выглядит так, что диктатура и пролетариат немножко, кхм, на ножах, что ли? Что тоже странно — вам всем нужно выживать, цель общая, ну камон. Откуда трения? 20 лет, 50 тыщ населения, да вы все там друг друга знать будете за это время и в гости друг к другу ходить.
Там потом еще и сопротивление появляется, которое пытается... что, собственно? Мир разрушен, нихуя нет, идти некуда, лучше жизни все равно не будет, так за что борьба?
Главная деятельность сопротивления — рисовать на стенах свой логотип (не самый простой, требует трафарета, что опять же, как-то неэффективно) и писать тупую фразу «когда ты потерялся во тьме, ищи свет». Ну то есть что за философия? Гораздо легче представить, что они писали бы что-то в духе «Люди, вас обманывают» или «Федра сосет хуй», но «ищи свет» блин? Звучит так, что они не глаза людям пытаются открыть, а наоборот, в какую-то секту заманить.
Внутри штаб-квартиры сопротивления, разумеется, во всю стену нарисован логотип (на случай облавы, чтобы не отмазались уже) и происходит моя любимая (нет) драматургия: «я вам не скажу» — «скажи» — «не скажу». В чем конфликт непонятно, прогресса нет, люди просто ссорятся чтобы это выглядело «драматично». Детский сад, говорю же. Особенно улыбнуло «мы боремся за свободу и демократию, поэтому просто выполняйте приказы».
Происходит off-screen перестрелка непонятно из-за чего, а потом классический киношный прием, когда люди вместо того, чтобы сначала бежать в безопасность и там выяснять отношения сначала выясняют отношения и не особо куда-то торопятся. Ну и чисто режиссерская недоработка — когда не знаешь, что сделать с людьми, они просто стоят в коридоре друг напротив друга. Даже если истекают кровью. К — кино. Андор весь примерно так снят. Бесит ужасно, но в основном потому, что я как-то к более изобретательной режиссуре привык.
Потом наши герои бегут через буферную зону, которая как раз удобно не расчищена за 20 лет и в которой бродят одинокие полицейские. Потому что болезнь ест только гражданских, да?
Но в целом сериал норм и страдает, наверно, от некоторой наивности, поверхностности и завышенных ожиданий. Не Гражданин Кейн, короче.
А, кстати. Девочка шикарная. И актриса, и персонаж. Но хейтерс гонна хейт.
Craig Mazin is not so amazing
Так как искусство должно в первую очередь побуждать зрителя на диалог, хочу поговорить с сериалом The Last of Us. В игру не играл, будут спойлеры к первой серии.
Серия начинается с бойко написанного интервью, которое сразу выкладывает весь расклад: что за эпидемия, как, почему. Ученый-грибник-паникер (надеюсь, в русской версии его озвучивал Сергей Безруков?) рассказывает известную историю про кордицепс однобокий, который ест мозг муравьев и превращает их в зомби.
Утверждается, впрочем, что грибы неспособны выживать в человеческом организме. Не очень понятно, что он тут имеет в виду, потому что страница «Микозы» на Википедии перечисляет штук 20 разных грибковых заболеваний именно на человеке, включая поражения внутренних органов. Но допустим действие происходит в альтернативной вселенной, где никто не болеет молочницей, кандидозом кишечника и лишаями.
Также используются спорные формулировки вроде «причина эволюционировать», «цель гриба» и «воля гриба».
Далее «ученый» утверждает, что от грибов нет и невозможно создать лекарство. Что тоже подозрительно, потому что большинство грибковых заболеваний вполне успешно лечатся. Но — допустим — альтернативная вселенная. Хотя даже в ней, мне кажется, ученые не должны говорить «нет» и «невозможно», а скорее «мы пока не знаем» и «мы не нашли». Как говорили нам в универе, закон сохранения энергии он закон только в том смысле, что никто пока не видел, как он нарушается.
Еще меня напрягло, что никто в ответ на его «нет» не спросил его «как так-то?». Не попросил объяснить, почему нет. Это настолько естественный вопрос, что странно, что все так молча приняли неприятную новость.
Наконец, делается утверждение, что грибы, если смогут поражать человека, сразу поработят миллиарды. Звучит странно — грибы вполне себе существуют прямо сейчас и что-то мир они пока не захватили. Даже те зомби-муравьи, у которых выедают мозг, живут параллельно с грибком миллионы лет. И ничего, никто никого не поработил.
Понятно, что все это художественная условность, которая была нужна, чтобы как-то мотивировать глобальный апокалипсис, чтобы история вообще состоялась. Но можно было бы рассказать то же самое без глупостей?
Ладно. Через первые три минуты продрались 🙂 Поехали дальше.
Мы переносимся в 2003-й. Звучит самая смешная шутка — Пердо Паскаль, которому почти 50, с максимально помятой рожей говорит, что ему 36 лет. Они живут с дочкой и дядей и у них, в целом, все хорошо. Ни проблем, ни забот, работать правда приходится с утра до вечера, но даже это, кажется, никого не беспокоит. Эта часть явно могла бы быть поинтереснее, но у нее, кажется, чисто функциональная роль (показать, что у героя БЫЛО) и они решили много сил на нее не тратить.
Потом начинается катавасия. Военные летают, люди бегают, все горит и взрывается, но конкретные детали не очень понятны. Просто паника и все горит. Интересно, что пандемия началась внезапно и одновременно везде, включая самолеты в воздухе (да!), что, вроде бы, не очень биологично?
Происходит самый видеоигровой момент из возможных: у чуваков ломается машина посреди улицы, один вылазит с одной стороны, другой с другой, и они такие: ну все, нам никак не встретиться теперь, бегите. В играх такое сплошь и рядом, сюда идти можно, а сюда нельзя, ПОТОМУ ЧТО. Но в кино смотрится странно. Примерно как с Кратосом, который хоть и бог войны, но иногда не может перелезть через упавшее дерево и идет через пещеры и три лагеря дикарей и монстров, потому что НУ ВОТ ТАК МЫ ПРИДУМАЛИ.
Дальше за ними гонится зомби, пару раз происходит deus ex machina, их ловит военный, девочку убивают, и наконец случается самое странное монтажное решение — сразу после трагедии мы молча переносимся на 20 лет вперед. Кажется, что пилот должен был быть двумя эпизодами, и тут, наверное, происходила склейка. Давайте и мы прервемся до завтра, на следующий пост.
Эпл анонсировал новый HomePod, и я на секунду поддался слабости и задумался, а не нужен ли мне спикер к телеку? Хорошо, дай, думаю, порты посмотрю. А их нет! Наученный горьким опытом, я вышел в интернет с запросом «HomePod audio delay» и, конечно, нашел прекрасные отзывы о двух(!)секундной задержке.
Не, если смотреть фильм с AppleTV, то все нормально, он эти две секунды буферизует и картинку подзадерживает, чтобы было тип-топ. Музыку слушать так и вовсе пофиг. Но в игры, например, не поиграть. Аудио/видео с макбука не поредактировать. Альтернативные плееры (YouTube, Amazon Prime, VLC, Infuse) — без гарантий, понятно.
И вот чего я не понимаю. Технологии, позволяющие передавать аудио по воздуху с приемлимой задержкой вроде бы есть. У меня у самого лично было устройство с алиэкспресса (!) за 20 баксов, которое передавало оптическое аудио с задержкой всего 40мс по воздуху. То есть это не то чтобы рокет сайнс.
Ну или в Xbox/PlayStation, например, их родные гарнитуры, либо аудиоджек в контроллере — в цифрах не мерял, но в пределах человеческого восприятия задержка незаметна.
Но почему эти технологии — удел специализированных устройств? Почему не воткнуть точно такую же хуйню в макбук, эпл тв, хомпод? Если хочется совместимости с блютусом — почему не воткнуть в дополнение? Не то чтобы они на них экономили — в том же хоумподе стоят тачскрин, датчик температуры, влажности, акселерометр, и поверх этого целый компьютер мощностью с айфон нескольколетней давности.
Неужели основной юзкейс — стриминг звука — настолько несущественный, что кто-то решил, что акселерометр важнее? Где прогресс в этой области? В хоумподе так даже батарейку беречь не надо, он прям в розетку втыкается. И что?
Я, конечно, люблю некоторые продукты Эпла, но тут какое-то разводилово, как со Студио экраном, не?
Отдельно кекнул от того, что управляется эта ебала азбукой морзе (длинные и короткие постукивания, for real) при том, что сверху на нем круглый экран диаметром восемь сантиметров, на который можно кнопок десять легко засунуть.
Эх, не понимаю я ничего в шикарной жизни и фанбойстве.
Сегодня по интренету гуляет старое (2003) письмо Била Гейтса, в котором он эпично не может купить и скачать Microsoft Movie Maker с сайта Microsoft.
Все как мы любим: сайт тормозит, поиск не ищет, в загрузках левая херня («they told me that using the download page to download something was not something they anticipated», ну прекрасно же), а установка в итоге через Windows Update вообще, с попутной загрузкой лишних 17 Mb (эх, были времена!), потому что Windows Update заодно и систему обновит, и установка, которая длится возмутительные 6 минут (those are rookie numbers, по сегодняшним-то временам).
Как мне пишут, прям хоть сейчас копируй и выставляй на Grumpy Website. Но моя мысль немножко другая: если бы тот самый Гейтс, вместо того, чтобы просиживать кресло, рисовать планы продаж в Экселе и назначать/увольнять глав подразделений (ну или чем там топы занимаются обычно, я хз) писал бы такие письма раз в неделю, а не раз в год, то у нас была бы совсем другая Винда. Возможно, такая же хорошая, как МакОС был при Джобсе.
А получилось, как обычно получается. Вроде бы уникальная особенность Джобса была в том, что ему было реально не все равно, что они там делают. Он брал инсталляторы лично, ставил Макось, и если ему что-то в процессе не нравилось, ебал всех подчиненных пока нравиться не начинало. Это такой контур обратной связи, «а не херню ли мы делаем», который смотрит не на процессы, ограничения, компромиссы, а непосредственно на конечный продукт.
А обычно — ну, ты создал компанию, хочешь сделать продукт, говоришь — делайте Мувимейкер начальнику под тобой. Тот говорит своему начальнику, и так пять слоев вниз, пока наконец не дойдет до тех, кто непосредственно будет делать. Естественно, глухой телефон, смысл теряется, и результат будет скорее всего для галочки: начальники довольны, а от тебя (программиста) отъебались.
Не, это нормально, а как еще, если у тебя 10 тыщ человек? За каждым не побегаешь. Но вот именно в самом-самом конце посмотреть на то, что получилось, и взъебать всех, если по дороге потерялся смысл — вот, кажется, формула хорошего продукта. Потому что когда продукт дойдет до пользователя, он будет в такой же ситуации — ему пофиг на количество проведенных митингов, заинтересованных сторон или выписанных бонусов. Продукт либо работает для него, либо нет.
Поздравляю всех с началом новой рабочей недели, в общем.
Понадобилась библиотека парсинга Кложи на Питоне. Нашел edn_format. У них написано:
> Installation: pip install edn_format
Окей. Написал в консоли pip install edn_format
. Он мне:
> DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Причем пять (!) раз повторил. На случай, если за четыре не дойдет. АЛЛО, ГОВОРИТЕ ГРОМЧЕ!!!
Штирлиц прочитал телеграмму, ничего не понял, прочитал еще раз и все равно не понял. Что за installation scheme? Что за distutils? Я таких даже слов самих по себе не знаю, а там от них производные. Я еще ничего не сделал, а уже виноват.
Потом смотрю, дальше слово знакомое: Homebrew. У меня на компьютере в принципе есть Homebrew, но насколько мне известно, в процессе вызова pip install он не должен никак участвовать.
Но там еще и ссылка. Окей! Видимо, проблема настолько сложная и тонкая, что в 259 букв ее ну никак не объяснить, и они решили поставить ссылку. Может там что-то будет понятнее?
Открываю.
> I am one of the maintainers of pip [...] Homebrew is currently using distutils.cfg to configure package installation schemes, and we believe it is best for Homebrew to remove the usage.
Ага, то есть там какие-то терки между мейнтейнерами Homebrew и мейнтейнерами Pip. Как в эту войну оказался втянут я? Почему я вообще должен о ней знать?
> If you have been directed here from a pip warning, you don't need to take any action at this stage. Nothing is currently expected to break until Python 3.12, and a full solution will be implemented well before then.
Ага! Делать ничего не надо, сломать ничего не сломали, и даже в принципе не особо планируют, но зачем тогда мне об этом знать? Загадка.
> Note that as of 3.10.2, this issue no longer affects Python 3.10 and later.
python --version
> Python 3.10.9
Ну и какого, спрашивается, хуя? Почему люди, о существовании которых я ничего не знал, считают, что могут украсть пять минут моего внимания, чтобы известить меня о том, что проблема неактуальна и ничего делать раньше не надо было, а теперь уж и совсем не надо?
С Новым годом, короче. Oh shit, here we go again.
По роду своей деятельности я много пользуюсь веб-интерфейсами. И, конечно, они не могут быть все идеальными, нет-нет да и отвалится где-то что-то, или съедет, или наедет, или спрячется.
Отдельно люблю баги с лайаутом, где вещи плохо центрированы. Причем несложные даже случаи, вроде текста в кнопке или иконки в прямоугольнике. Казалось бы — ну как? Ну вот у тебя есть одна квадратная вещь, и есть другая, чуть побольше. Любой школьник шестого класса напишет вам и формулу, и программу, как центрировать одно относительно другого.
Но не в веб-программировании! Если думать об объектах как о прямоугольниках, то конечно, все будет просто. Но в вебе на каждый прямоугольник накладывается примерно миллион дополнительных правил: метрики текста, line-height, inline, выравнивание по baseline, распидорашивание флексов, наследование font-size и разные нелинейные единицы размеров, направление текста и прочие всякие зарезервированные места под скроллбар и тому подобное. Любой объект обязан про все это помнить и учитывать, но это просто не помещается номальному человеку в голову — поэтому и имеем то, что имеем. То есть нет-нет да и отвалится где-то что-то, или съедет, или наедет, или спрячется.
Конечно, скажете вы, тебе хорошо рассуждать про прямоугольники, но зато веб столько всего учитывает, там же СЕМАНТИКА. Ты не говоришь, что какой формы и что во что вложено, а как бы намекаешь компьютеру, что все это значит, и если повезет, то он покажет то, что ты от него хотел. А если не повезет, то покажет что-то другое и будет прав, а ты иди еще CSS подучи.
И я все это понимаю. Семантика, да. Сложная система, да. Но знаете что? Единственная семантика иконки внутри кнопки — что она стоит внутри по центру. И не надо мне про высшие цели рассказывать. Про высшие цели поговорим, когда вы научитесь иконки центрировать и три кнопки в ряд ровно ставить.
И не надо мне рассказывать, что это все можно сделать в вебе и что это не сложно. Просто посмотрите на факты — количество кривых и разваливающихся веб-интерфейсов и количество таких же нативных. Нужно не просто, чтобы можно было сделать нормально, но и чтобы нельзя было сделать ненормально.
А как научитесь — там и про семантику поговорим.
Короче, втянулся в Hitman, особенно в режим Freelancer. Причем втянулся довольно банально — увидел на Ютубе, зацепило, но чувак так плохо играл, что пришлось пробовать самому.
Freelancer — это такой roguelike, сделанный на основе существующих карт из Hitman 1-2-3, но хорошо сделанный, и в чем-то даже лучше отражает концепцию, чем оригинальная игра — приходится рисковать и импровизировать, а не ходить по одним и тем же дорожкам, заучивае расписание каждого NPC.
Кстати, твист на тему roguelike/roguelite довольно забавный. Roguelike это когда никакого мета-прогресса нет (например, Spelunky), а roguelite когда ты постепенно качаешься (как в Hades). Так вот, с одной стороны, во Freelancer ты постепенно нарабатываешь себе разного оружия, которое теоретически можешь брать с собой на миссии. А с другой — если что-то пошло не так, то его у тебя забирают. Так что прогресс тут такой, двухсторонний. Я за часов тридцать более-менее стабильно удерживаю только пару хороших пистолетов и пару винтовок, остальное как приходит, так и уходит.
А так да, все признаки Rogulite-игр: отлипнуть невозможно, сразу хочется еще дозы. Не ожидал, что ААА игры могут затягивать, обычно это удел инди. Ну и что понимать игру ты начинаешь после довольно существенного вложения времени (30-50 часов), за котороые обычные игры уже заканчиваются.
А интересно тут вот что. Мне кажется, что Хитман в первую очередь про контроль эмоций. Видишь возможность завалить свою цель? Не торопись, оцени обстановку. Это прямо противоположно тому, что _хочется_ сделать. Игра учит этому довольно жестко. Все пошло наперекосяк? Хочется, понятно, паниковать, а надо, наоборот, действовать четко, есть вполне конкретные шаги, которые нужно предпринимать. Это довольно сложно, учитывая, как все начинают бегать с винтовками наперевес, искать тебя и играет тревожная музыка, а тебе надо вести себя спокойно. Наконец, торопиться — последнее дело. Игра супер размеренная, большую часть времени ты подглядываешь из-за угла или там ныкаешься в шкафах. Но при этом это жутко интересно!
Еще, кажется, в Elden Ring была похожая зацепка. Когда ты видишь босса в первый раз, тебе хочется просто сразу бросить оружие и заплакать. Следующие несколько раз ты пытаешься что-то делать с его атаками, но делаешь это на инстинктах, то, что _кажется_ правильным (например, он замахнулся мечом — ты выставляешь щит, а он задерживает атаку и ударяет, гад, только через секунду). И только спустя пару десятков раз ты наконец понимаешь, что на самом это все был фасад, который пытался тебя обмануть, заставить действовать эмоционально, как _кажется_ правильным. А вместо этого есть вполне конкретные моменты и конкретные действия, которые надо предпринимать, и они даже не особо сложные. Но вот заставить себя хладнокровно смотреть, как дракон размером с дом машет хвостом и замахивается лапой и ничего не делать, пока не наступит правильный момент — вот где настоящий геймплей, настоящий челленж.
Короче, если что, рекомендую. Я слишком поздно/не там родился, чтобы оценить классические immersive sims, ну вот это closest and most pure thing today, кажется.
Расходимся, я уже все придумал. Неэффективно, зато удобно и просто
TOFO — Tonsky’s [Serialization] Format
Requirements:
- Textual
- Simple to implement
- Single-byte UTF-8 subset (ASCII)
- Evertything is length-prefixed
- No string escaping
- Reasonably human-readable
- Space efficiency is not a first priority
| Type | Format |
|--------|--------------------------------|
| nil | 'n' |
| false | 'f' |
| true | 't' |
| int | 'i' + 8b value |
| string | 's' + 8b len + len bytes UTF-8 |
| list | 'l' + 8b len + len objects |
| dict | 'd' + 8b len + 2*len objects |
| space | \n or ' ' |
| Number | Representation |
|-------------|----------------|
| 0 | 00000000 |
| 100 | 00000064 |
| 2147483647 | 7FFFFFFF |
| -1 | FFFFFFFF |
| -10 | FFFFFFF6 |
| -2147483648 | 80000000 |
d00000008
s00000002id i00000140
s00000007session s0000002436c8691a-4931-4995-9fea-bafb6a6d6174
s00000002op s00000004eval
s00000005forms l00000002
s00000007(+ 1 2)
s00000019(println "Hello, world!")
s00000002ns s00000004user
s00000004line i00000002
s00000006column i00000000
s00000004file s00000035/Users/tonsky/ws/clojure-sublimed/test_repl/forms.clj
Читать полностью…
d00000008s00000002idi00000140s00000007sessions0000002436c8691a-4931-4995-9fea-bafb6a6d6174s00000002ops00000004evals00000005formsl00000002s00000007(+ 1 2)s00000019(println "Hello, world!")s00000002nss00000004users00000004linei00000002s00000006columni00000000s00000004files00000035/Users/tonsky/ws/clojure-sublimed/test_repl/forms.clj
Полдня потерял на совершенно идиотский баг: в мобильной версии нашего родного Roam Research есть экранные кнопки для Cut/Copy, и вот они везде работают, кроме Cut в мобильном Сафари. Причем не работает совершенно молча — пошел нахуй, так сказать, вопросы?
В Гугле, естественно, у людей если и не работает, так уж все целиком — ни copy, ни cut. Мне бы их проблемы!
И вот пол дня я потратил на разбирательства. Обложил все логами. Поставил Xcode, чтобы цепляться к эмулятору Сафари инспектором. Хотел сначала просто к телефону, но не смог — то, как оно должно работать, не работает (веб-инспектор магически находит твой телефон), а кнопки чтобы это зафорсить нет и никакой диагностики тоже нет. Apple — it just works (not).
Перерыл DuckDuckGo, отчаявшись, даже у Гугла спросил. Уже морально приготовился переписывать код на использование copy + delete при нажатии на cut, что, блин, совсем нетрвиально, учитывая количество вариантов, в которых оно может вызываться.
И наконец удача мне улыбнулась — я раскопал причину в исходниках WebKit, причем от отчаяния — к концу дня моя самооценка уже упала до нуля от беспомощных попыток починить происходящее методом тыка и ощущения, что я обезъяна, пытающаяся починить карбюратор, а чтение исходников это хотя бы осмысленное действие.
Оказалось, что перед тем, как выполнить Cut, Сафари (только мобильный!) проверяет canCopy & canDelete, и вот canDelete-то у него не получался, потому что у нас под это дело создавалась невидимая textarea и ей зачем-то ставился атрибут readonly (не спрашивайте, не знаю). А текстарея создавалась, чтобы программно породить событие "copy"/"cut", внтури которого уже можно работать с буфером. Потому что это же Web API, кто сказал, что должно быть удобно? Мне не нужно, чтобы работа была сделана, мне нужно, чтобы вы заебались.
Выводов три.
Первый — читать исходники полезно. Кто бы мог подумать, да? Полезно это еще и для душевного спокойствия — ты хотя бы совершаешь прогресс в понимании происходящего, а не пытаешься перебором собрать случайную комбинацию случайных действий, которые бы делали то, что тебе нужно.
Второй — мобильный Сафари дно, всегда им был и до сих пор им остается. Даже если у вас все отлажено и работает в 99% браузерах, вас все равно выебет напоследок мобильный Сафари.
Ну и третий — это ровно то, почему я вебом больше не хочу заниматься. Потому что сначала все хорошо-хорошо, а потом ты полдня тратишь на тривиальную радномную хуйню, которая вроде бы должна работать, но почему-то не работает. Специально, чтобы позлить тебя, да.
Я не против неделю дрочить какой-нибудь алгоритм, не против вылизывать перформанс, не против чинить баги, которые я или мои коллеги написали. Но это хотя бы _познаваемо_, это работа с причиной и следствием, пусть иногда и сложными и запутанными, работа с ограничениями реального физического мира.
А веб — это работа с радномной хуйней, которая копилась 30 лет и которая меняется постоянно непонятно кем непонятно зачем левой пяткой. Я против вот этой вот обезъяньей работы, когда у тебя есть коробка с деталями от часов, тебе надо ее трясти, пока внутри детали сами вдруг не сложатся в часовой механизм. Почему нельзя по-нормальному? Прост.
Ну то есть как против? Расстраиваюсь я. А я хочу быть веселым. Всем доброе утро, веб-программистам соболезную.
Писал в 2020-м в ЖЖ про Jetpack Compose, но оно и в контексте прошлого поста про ООП хорошо, и вообще про data-oriented design. С сокращениями:
Идея делать такое АПИ — видимо, призрачное счастье разработчиков. Действительно, что может быть проще, чем написать:
Column {
Button()
Text()
}
Максимально лаконичное API, да? Но если присмотреться, мы увидим, что Column принимает не список детей, а замыкание. Почему это? Спросите вы. А потому что это гребаные процедуры, вот почему. Придумав такое API, ты невольно загнал себя в угол — его нужно держать строго определенным образом, и никак иначе. Удобно в простых примерах, а дальше начинаются сложности.
Мы, программисты, привыкли, что в коде можно делать много разных вещей. И нам это нравится! Можно принимать значения, передавать значения, трансформировать значения, обрабатывать значения. Но вы поняли, наверное, уже, к чему я веду, да? Компоуз решил нас этой радости, потому что его API ничего не принимает и не возвращает. Там нет значений. Его API можно только позвать, конец истории. Нельзя написать функцию, которая сортирует компоненты. Которая вставляет разделитель в список компонентов. Нельзя даже нормально вложить один компонент в другой без создания анонимной лямбды. Потому что и компонентов-то нет. Только лямбды.
А лямбды это что? Это худший из возможных форматов хранения данных. Хуже структур, понятно, и даже хуже чем ООП. Лямбда — это черный ящик, черная дыра, максимально негибкое, неудобное и безполезное явление, на которое ни посмотреть, ни потрогать, ни сообщение послать, ни разобрать, ни распечатать, ни сравнить, а только обернуть в другую такую же гребанную лямбду или передать дальше. Лямбды невозможно упростить — они всегда только растут, толстеют, как слои лука у Шрека или жировые прослойки на твоей слоеной архитектуре. Максимально вредный объект, особенно как основа API. И поверьте, внутри Композа (да и снаружи) этих лямбд хоть лопатой жуй, и они все анонимные, и ничего не принимают и не возвращают, и от неявных ресиверов зависят, и друг друга заворачивают и разворачивают (ха-ха, шучу, лямбду нельзя развернуть!) и они анонимные все! А, это уже было. Ну вы поняли.
[...]
Самый удобный АПИ у нас уже есть — это функции с явным списком аргументов и возвращаемым значением. И все. Конец истории. Лучше не будет. Серьезно. Не надо мудрить, хитрить, не надо придумывать «более удобный DSL», не надо аннотации придумывать, не надо компилятор форкать, не надо вообще программисту помогать вызывать функции. Лучше все равно не сделаете, а проблем на разгребание всего этого — создадите. Лучшая помощь — оставить нас в покое и дать писать обычный код.
Есть такой модный новый браузер, Arc. Казалось бы — ну что браузер, давно уже все придумали. Но они решили пойти не в сторону упрощения интерфейса, а в сторону усложнения — всяких панелей там понавешали, режимов и прочего. В итоге страницы маленькие, работает все это не пойми как, но есть и хорошая фича — автозакрывание табов. Раз в день он все, что ты не трогал, закрывает, чтобы не копилось.
Мне Арк не зашел, потому что автозакрывателем табов работаю я сам. Когда-то давно я табы копил, пока не прочитаю, и они на меня давили. А потом понял, что сам себя мучаю, и начал безжалостно их убивать. Пришел на работу, а на ноуте открыт Ютуб с незакрытым роликом? Закрыл, потом в истории найду. Не могу прочитать статью уже два дня? Ну значит не очень-то и хочется. Закончил рабочий день? Браузер должен остаться пустым. Любую открытую страницу всегда можно найти снова, было бы желание. Так что привычка хорошая, но целый новый браузер ради нее терпеть не хочется.
Есть другие модные ребята, делают терминал на Расте, называется Warp. Тоже простую концепцию решили разбавить «фичами» и «улучшениями», которые каждое по-отдельности вроде бы разумно и хорошо, а вместе создает какой-то лишней ментальной нагрузки, которой от терминала как раз не хочется. Из серии «а что будет, если...». В обычном терминале ты это себе хорошо представляешь, а что тут эти улучшаторы наулучшали — фиг его знает.
Когда я только начинал пользоваться Маком, мне очень понравился iTerm 2. Прям фичи были в самое сердечко, и много, и хорошо. Потом чет я понял, что ничем из них все равно не пользуюсь, и переехал на встроенный Terminal. Так с тех пор и не жалею. Терминал, конечно, можно сделать лучше, но, получается, не нужно.
Третий пример это почта Hey (не «неу», а «Хэй», типа «Э, слышь!»). Ребята придумали делить всю входящую почту на четыре потока — неизвестные отправители, инбокс, развлечения и чеки. Сбацали продукт, продают, вроде бы, все хорошо у них. Сам Хэй я не пробовал, зато сделал себе аналог на фильтрах Fastmail. Получилось хреново (фильтры нужно вручную обновлять, а интерфейс там не очень), но когда поток более-менее устаканился, оказалось, что это офигенно! Именно эти категории лучше всего прижились — важное, но неинтересное (paper trail), неважное, но интересное (feed), важное интересное (inbox) и неважное неинтересное (screened). Последнюю я, правда, не сделал, но и так уже хорошо.
Какая мораль? Их две. Во-первых, красота некоторых продуктов в их минималистичном изяществе. В браузер или терминал сложно что-то осмысленно-полезное добавить именно как фичу, потому что их концепция уже позволяет исполнять любой вокрфлоу. Но дизайнерам платят за интерфейс, поэтому интерфейса у нас много, а изящества — мало.
Вторая мораль в том, что хорошие продукты иногда — не продукты даже, а привычки. Но вот популяризовать привычку сложно, поэтому стартаперы из долины делают то, что умеют лучше всего — новые продукты. Даже если цель — научить людей закрывать вкладки. Ну а как их еще научишь? Я не знаю.
На всякий случай еще для айтишников повторю, потому что не все, кажется, понимают. Вежливо ≠ без мата. Можно токсично и без мата, со спасибо-пожалуйста, а можно максимально корректно через трехэтажный мат.
Нет: «Кто так пишет?», «Что это за говно?», «Чем ты думал?», «Опять?», «Надо пояснять?». Мата нет, но ЧСВ и дартаньянство сквозит в каждой букве.
Да: «Убери вот эту херню, а то если null в нее придет, весь стек ебнется и пиздец!» В таком коллективе с удовольствием бы поработал.
Провел в твиттере опрос, можно ли врать, с неудивительными результатами: 40% считает, что да. Из них 20% считает, что да, если это несет персональную выгоду (что еще хуже).
Твиттер, конечно, место известное, где люди путаются не в трех, а в одной даже сосне. Казалось бы: конечно же врать нельзя! Но почему-то стоит дать какое-то уточнение, и сразу вопрос становится неоднозначным. А если мне это выгодно? А если это чтобы наебать систему? А если никто не узнает? А если я очень хорошо вру? А если я зато собрал миллион лайков? Хотя вроде бы ничего не изменилось, вранье осталось враньем, и ничего хорошего в нем нет и гордиться им не стоит.
На меня лично большое впечатление произвел фильм «Выход через сувенирную лавку» Бэнкси. Это фильм не про самого Бэнкси, а про его друга-куратора, у которого очень интересная и метафоричная арка, якобы документальный. Но очень уж все красиво в конце складывается. И вот где-то ближе к концу Бэнкси вставляет такую фразу: «показывал этот фильм друзьям, и некоторые считают что я все придумал, что это такой розыгрыш (чтобы набрать классы), что ничего этого на самом деле не было. Что я full of shit. Но нет, все это взаправду».
И вот эта вот простота вернула меня в мир морального абсолютизма. Все на самом деле не сложно, а просто: обманул — даже если красиво, смешно, выгодно — ты full of shit. И ничего более. Правдивые истории в бесконечность раз важнее выдуманных. Мир строится на правде, а не на лжи. Прогресс происходит при честных взаимодействиях, а не на обмане и наебках.
Так вышло, что в нашем пост-советском обществе наебки считались поводом для гордости и это, видимо, многих путает. Не надо так. Те времена давно прошли, а в новых хороших гораздо лучше будет жить, если мы сможем доверять друг другу.
Врал ли я? Конечно врал. Приносило ли это мне выгоду? Тоже было дело. Буду ли я врать в будущем? Скорее всего. Но это никак не меняет того факта, что врать нельзя. Накручивать опыт, сдавать чужой диплом, ну камон — ну разве не очевидно, что это ухудшает ситуацию, уничтожает доверие, затрудняет взаимодействия, а не упрощает их?
В следующем выпуске разберем вопрос, можно ли бить детей. Тоже, говорят, вопрос далеко не однозначный.
Идею сформулировал @grishka, и спасибо ему за то, что повторял достаточно много раз, чтобы она во мне проросла.
Очень запоминающаяся формулировка: время не должно участвовать в аутентификации вообще никак. Сессия не должна протухать, не нужно раз в две недели вводить пароль или раз в три месяца менять его. Никак — то есть совсем никак. Если я залогинился, значит, блин, я залогинился.
Протухающие сессии, регулярный ввод пароля и галочка «запомнить меня», которая работает как плацебо, на самом деле ни от чего не защищают. Твои данные не окажутся в большей безопасности, если ты будешь логиниться каждый раз. Если у тебя украдут сессию — ну, значит украдут. Expire в две недели все равно оставляет достаточно времени злоумышленникам, чтобы ей воспользоваться, но бонусом еще ест твои нервы.
Спасибо еще, что мода «регулярно менять пароль» осталась в прошлом.
Отдельный привет гениям-программистам из кинопоиска. У меня там даже аккаунта нет, но каждый раз когда я туда захожу, я вижу сайт, через пару секунд редирект на какой-то левый домен для аутентификации (кого? чем?), и потом редирект обратно на сайт. Объяснить или оправдать это я не могу вообще ничем.
Короче, если я залогился — не разлогинивайте меня без спросу. А безопасность своей сессии я уж как-нибудь обеспечу.
Ну что, вроде бы очевидно, что к сериалу я неравнодушен, смотреть продолжаю, так что сильно постараюсь не доебываться, только к самым зацепившим местам. Хорошее тоже есть, но про него так интересно не напишешь, так что не думайте, что мне ничего не нравится или смотреть не стоит. Если бы не стоило, я бы и не смотрел. Итак, Last of Us, эпизод 2, часть 1/2.
СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ СПОЙЛЕРЫ
Серия начинается с зарисовки из Индонезии в 2003-м, где случилось одно из первых заражений. Зараженного показывают профессорше (это преподавательская должность, если что, не научная), она глядит в микроскоп и такая: пиздец, бомбите нас всех нахуй. Что выглядит, конечно, эффектно, но — бомбите? Серьезно? Вот так сразу? Без полдня на подумать? Может, еще с кем-то проконсультироваться? Может другие способы есть? Лечение может поискать? Зараженных половить? Изолировать там, карантин, анализы, пропускной режим? Еще забавно, что профессор грибологии визжит, как студентка, при виде гриба. Очень научно, ага.
К бомбить тоже есть вопросы. Вроде как намекается, что это как раз то, что они в итоге и сделали, причем по всему миру. Но бомбежки это оружие скорее точечное, а тут нужно тотальное, разве нет? Людей-то вы, может, немножко убъете, а грибы еще и раскидаете по сторонам. Короче, сомнительно все это очень.
Дальше идет сцена, где девочке долго объясняют, где и как ей писить и какать. Наверное, хотели напугать нас хардкорностью пост-апокалипсиса. Ух, журналом приходится подтираться! Вот это условия! (опустим, что девочка, например, всю жизнь так живет, вообще-то).
Идет перекус сендвичем с курицей. Курицу я еще могу представить, но хлеб? Он еще и намазан соусом каким-то он. Ух, вот это хардкорность! Но я рад, что индустрия супермаркетов и мамы, собирающие дочкам рюкзак, в пост-апокалипсисе не пострадала.
Следует мой любимый троп «припрем дверь шкафом, а она открывается наружу» (Большой Лебовски великий фильм, да), и наша компания выходит наконец на свежий воздух (чего не помешало бы сделать и этому ревью).
К свежему воздуху у меня только один вопрос — оно не ощущается пустым. В смысле людей нет, должно быть ощущение заброшенности какой-то, не? Вместо этого в каждом кадре столько деталей и красоты, что как-то и непонятно, а что, собственно, мы потеряли? В какой-то момент герои любуются видом, и он реально красивый, а не разрушенный/заброшенный/унылый/страшный. Хоть бы кто-нибудь сказал «а ведь без человека мир не так уж и плох», но нет, никто этого не говорит. Это уже территория философии, а мы тут про побегать от зомби собрались, зачем настроение портить.
На самом деле я почти уверен, что если бы не было так красиво, то оно не стало бы таким популярным. Американцы, конечно, на словах любят, когда их пугают, но в первую очередь понарошку, чтобы с сендвичами и мамой с папой.
Ресторан, в котором взрывом выбило окна, но стаканы (все!) остались красиво стоять на столах? Ну да, ну да.
Элли рассказывает, как ее укусили в первый раз. Напоминаю, ей «14» лет (акртисе 20, но эй, это же Голливуд!) и она родилась и выросла в карантинной зоне, ни разу не выходила за периметр. Как же ее укусили? Оказывается, внутри карантинной зоны есть молл, в который «не рекомендуется ходить», а она из любопытства пошла и ее укусили. Не знаю как вам, но зараженный молл внутри периметра звучит, кхм, странно? За 20 лет и при всем том количестве оборудования и персонала, которое они тратят на простое патрулирование, можно было бы зачистить один молл?
Происхоит еще один «видеоигровой момент», когда герои встречают завал, через который спокойно протискивается взрослая (!) женщина 1,72 м (!!) с рюкзаком (!!!), и такие «ну что же делать, нам не пройти, придется сидеть-ждать». Мне еще нравится, как они подергали картонные двери по соседству и такие «закрыто, штош, значит судьба».
В видеоигре это объясняется, понятно, тем, что анимацию «пролажу через дыру» не сделали, а за дверями в отеле ничего нет, даже комнат. Но в кино-то?
Продолжение ниже
Кстати, внезапно узнал СПОЙЛЕР, что в игре-то ты оказывается в самом начале играешь за дочку, а потом тебя бах — и убивают! Вот это я понимаю, ХОД.
Фильм, по идее, тоже так сделан, но что-то не считывается. Может потому что по постеру и общему информационному шуму уже было заранее понятно, что фильм будет не про дочку
На волне отключения Твиттером сторонних клиентов попробовал официальный. Разочарован. То есть это примерно как сайт, но с рекламой через каждые 3 поста и прочими «фичами» типа алгоритмической ленты, спейсов и «какие топики вам интересны».
Но сайт-то как раз у меня сильно лучше! Потому что на сайт можно поставить адблок, расширений и стилей, сделав тем самым из дефолтного опыта нормальный. Вообще я впечатлился в первую очередь от того, что увидел, в какой помойке люди сидят по дефолту и насколько я от нее отвык.
Главная заслуга тут, конечно, у веба. Шутка ли — любой сайт можно расковырять и подхачить под свой вкус, где это такое видано? Причем инструменты для этого прям в браузере положили, никуда даже ходить не надо. И все применяется еще в реальном времени, прям WYSIWYG, технлогия будущего.
Серьезно, а на веб псю из-за сложности, обратной несовместимости, производительности, но если чисто по фичам смотреть, то это, во-первых, охренеть как революционно, а во-вторых охренеть как демократично. Я даже не знаю, о чем еще просить, реально технология мечты, доступная каждому. Особенно сегодня, с процветанием закрытых корпоративных данных вместо открытых протоколов, когда у корпораций нет никакой мотивации делать хорошо, ты хотя бы можешь сделать себе хорошо сам.
А не было бы веба, сидели бы на нативных приложениях и смотрели бы на сраную рекламу, алгоритмическую ленту и замусоренный интерфейс с фичами, которые приносят денег вместо фич, которые приносят пользу.
Теперь бы еще с бекендом что-то придумать.
Давайте научу критиковать.
Например, многим кажется, что я «мочу» и «обсираю» интерфейсы, программы и их создателей. На самом деле идея Grumpy Website не в том, что «глядите, мне ничего не нравится», а в том, чтобы показать, какие бывают проблемы и как сделать лучше. Как учебный ресурс, только на 100% состоящий из конкретных примеров. Если надпись в кнопке криво выровняна, это не «гы-гы-гы дауны», или «макос говно, не пользуйтесь», а «обратите внимание на такой аспект, это важно, так не делайте, а делайте вот так».
Многие предложения не попадают на сайт, потому что в них особо нечему учиться. Баги у всех бывают, всем понятно, что если бы знали/могли, то исправили бы, это неинтересно (но иногда смешно, для смешно исключение). Интересно, когда намеренно делают плохо, потому что объясняют это неправильными причинами, а я показываю правильные.
По этой же причине на сайте не упоминаются продукты и компании. Потому что какая разница у кого сломано, если наша цель научиться делать лучше?
Это то, как в моем представлении выглядит здоровый, конструктивный диалог. Конкретика, без перехода на личности, с раскрытием темы. Да, не все и не всегда получается, я знаю, но работаю над этим. Не надо мне кидать сюда посты с Грампи, которые не так оформлены. Я стараюсь, но не всегда получается.
А теперь разберем примеры, которые люди воспринимают как «честный фидбек» и «вполне валидную критику», но которые по сути все же что-то другое. Примеры из обсуждения поста Ильи Бирмана про дорожные знаки. Так НЕ надо:
«Плохо, мне не нравится»
Нет конкретики. Что делать с таким отзывом? Это не фидбек, а агрессивная атака на автора. Кстати, хвалить без конкретики — норм 🙂
«Видно, что вы не водители»
Переход на личности. Во-первых, не угадали, что смешно. А во-вторых, какая разница, водители или нет? Идея либо хорошая, либо плохая, какая разница, кто ее высказал?
«Вы не разобрались»
Откуда вы знаете? А что если разобрался, но побольше вашего? Несогласны — пишите, с чем. Но не надо гадать про уровень эрудиции автора.
«Не надо ничего менять, умные люди делали»
Это вы просто автора дураком назвали, да? Надо объяснять, что с этим не так?
«Знаки менять нельзя»
Ну тут Бирман сам лучше меня написал. Но это важно, поэтому цитирую дословно:
> Самое главное, что изменит вашу жизнь. Нет никакого «нельзя». Можно всё. Это знание дороже знания ПДД. А если вы всё ещё думаете, что вам что-то нельзя, то давайте я вам разрешу! Разрешаю! (Просто мне можно всё, в том числе разрешать)
Мне это близко, потому что очень похожий фидбек я часто получаю, когда предлагаю что-то радикально переделать, типа файловую систему, ОС или TCP. Людям сложно представить, что мир может быть устроен иначе, чем так, как он устроен сейчас. Это понятно, но я бы хотел, чтобы мы научились это представлять чуть лучше, хоть это и сложно.
В общем, пишите, критикуйте, но не забывайте: конкретика (чтобы было, на что отвечать, «все плохо» — не критика) и без перехода на личности. Обсуждаем идеи, а не людей.
Лента в Тви опять принесла рассуждения, что мол писать код на интервью на позицию программиста — плохая практика. Типа, не охуели ли вы, господа, просить меня написать код, когда у меня такие красивые глаза и такие мягкие скиллы?
Ну я традиционно не могу понять, из-за чего сыр-бор. Подразумевается, что ты пишешь код восемь часов в день, пять дней в неделю, на протяжении нескольких лет. Так? Так. Тогда почему вдруг возникают проблемы пописать его еще сорок пять минут? Типа, какая разница? Ты перед этим его писал пол-недели, и после этого еще полнедели писать будешь, и так до пенсии (заплакал, но не суть). Это как чувака, который чистит картошку на кухне ресторана на сто человек попросить почистить еще две. Да он не заметит даже.
Представьте себе доктора, который такой «ой, не могу сейчас вас осмотреть, не привык не у себя в кабинете, у меня там кушетка, а у вас диван в гостиной». Или водитель такой «ой, у вас машина двухместная, а я только на пятиместных умею». Или пианист «я не могу на пианине белого цвета, я всю жизнь тренировался на черной». Бред? Бред.
Тогда почему просьба попрограммировать чутка в присутствии других людей вызывает такое отторжение у программистов? Если вы пишете код каждый день по восемь часов, то вам наверное все равно, на компьютере его писать или на доске, голосом о нем говорить или пальцами, с ИДЕ или без ИДЕ, в темной теме или светлой, без гугла или с гуглом? Потому что ну не может человек, который программирует, допустим, три года, не помнить, как создать список или какие там методы у строки. Он каждый день это по миллиону раз делает, хочешь-не хочешь а запомнишь.
Другое дело, если вы не программируете. Тогда, конечно, понятно. Тогда это все объясняет. И трудности, и возмущения, и отмазки. Только работодатель-то причем? Ему не ваши красивые глаза нужны. И не софт-скилы.
Интересный феномен, когда кто-то прилагает дополнительные усилия, чтобы сделать хуже.
Например, в телевизоре миллион способов «обработать» (ухудшить) изображение, хотя все, что от него требуется — просто показать цифровой сигнал ровно в том виде, в котором он поступает на порт. Все, лучше уже не сделаешь.
Или Твиттер, они пыжились, придумывали алгоритм «умного» кропа изображения. А в итоге лучший кроп — это не кропать картинку вообще. Если я прикладываю изображение, наверное, я хочу, чтобы его увидели целиком, а не какую-то часть? Если бы мне нужен был кроп, я бы кропнул.
«Алгоритмические» ленты в ту же степь. Лучшая алгоритмическая лента — обратная сортировка по дате. Если бы мне был не интересен какой-то контент, я бы от него отписался, не? А если я подписался, значит я хочу его видеть, епт.
Иногда, чтобы сделать хорошо, достаточно просто ничего не делать.