• Поза лотоса

    Когда я вижу программиста в позе лотоса, в голове играет сюжет.

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

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

  • Мальчик и птица

    Я знал, что этого делать не следует, но сделал — сходил на мульт “Мальчик и птица”. Будет много скепсиса и спойлеров, я предупреждал.

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

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

    В американском прокате мульт назвали “The boy and the heron” — мальчик и цапля. Это правильно, потому что мальчика и (псевдо)цаплю мы видим большую часть фильма. И хотя у слова “heron” однозначный перевод — цапля, Карл!, — в русском прокате она стала птицей. Эта претензия не к Миядзаки, а к переводчикам.

    В целом, мульт страдает от тех же проблем, что и второй Аватар. При запредельном качестве картинки в нем никакой сюжет, все скомкано и ситуативно. Зрителя отвлекает миллион незначащих деталей. Досадно, что бюджет спустили на визуальную красоту, попустившись смыслом.

    Мульт идет 2 часа 10 минут — не так уж и мало. Первые 40 минут — это топтание на тему “не ходи в запретное место”. Понятно, что когда ребенку говорят не ходить куда-то, он пойдет, вопрос в том, как скоро. Но с этим большая затяжка.

    Когда герой входит в запретное место, начинается фантасмагория. Каждые десять минут он проваливается в новый мир со своими причудами. Мелькают локации, существа, загадочные сцены. Все это красиво, но требует ответов: кто это, откуда, зачем и что если? Режиссер не считает нужным все это объяснять; он забрасывает героя в новую локацию, где другие существа, враги и друзья. Словно летишь на карусели и видишь только мелькание.

    Иногда режиссер дает отдохнуть: показывает пять минут, как девушка режет хлеб, мажет маслом и ест. Ме-е-едленно и основа-а-ательно. Без музыки, только звон посуды и скрип пола. Красиво, но опять же — назрел миллион вопросов, может, объясните хоть что-нибудь? А бутерброд потерпит.

    Если вы думаете, что я цепляюсь зря, то вот малая толика вопросов:

    • Зачем герой рассек голову камнем?
    • Зачем мачеха пошла в башню?
    • Почему нельзя входить в родильную комнату?
    • Почему мачеха гонит героя прочь?
    • Какую роль играл нерожденный ребенок? Его хотели забрать? Кто и зачем?
    • Какую цель преследовал король попугаев?
    • Что за камни, из которых колдун строил башню? Почему они злые?
    • Что за хранитель гробницы? Почему его не показали?
    • Это все один мир или разные?
    • Если парень в мире мертвых — он умер?
    • Мать парня умерла в больнице или вознеслась на небо, потому что была огненным духом?
    • Что стало в параллельном мире после апокалипсиса?
    • Куда делся дед-колдун? Кто унаследовал его?

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

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

    • на чердаке он находит послание умершей матери — книгу “Как поживаете?”. Что там написано и какую роль играет находка — не ясно.

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

    • В мире мертвых живет женщина-рыболов, при этом она вовсе не мертвая. Что она там делает и зачем помогает герою — непонятно.

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

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

    Пожалуй, главное: нет морали. Совершенно не ясно, от чего предостерегает режиссер. Как жить, чтобы это не повторилось? Или наоборот: все, что случилось — хорошо? Где ориентиры?

    Изумила пара сцен:

    • отец дает беременной жене чемодан со словами “осторожно, он тяжелый”. После чего смотрит, как она тащит его в коляску. Помочь беременной жене? Не слышали.

    • Парнишка бьет себя камнем по голове, из нее вытекает ЛИТР крови. Парень спокойно идет домой. Хотел бы я это видеть. Нельзя было как-то реалистичней? Как писал выше, тема самонаказания не раскрыта.

    Словом, если вы смотрели другие мульты Миядзаки, сходите на “Мальчика и птицу” из чувства долга: все-таки прощальный мульт. Недочеты можно списать на фирменный стиль автора: кроме него таких мультов (почти) никто не делает. В отрыве от остального творчества Миядзаки мульт затянут и скучноват. Очень на любителя.

    PS: если речь пошла об аниме, в следующем посте расскажу о другом мульте, который, напротив, советую посмотреть.

  • PG2 benchmarks, part 2

    Table of Content

    In the previous post, I was measuring bare query/execute/copy functions of the library. Although it’s useful, it doesn’t render the whole picture because it’s unclear how an application will benefit from faster DB access.

    This post covers the second group of benchmarks I made: a simple HTTP server that reads random data from the database and responds with JSON. The benchmark compares PG2 and Next.JDBC as before.

    Introduction

    Some general notes: the server uses Ring Jetty version 1.7.1, JVM 21, Ring-JSON 0.5.1 for middleware. The handles are synchronous. The application uses connection pools for both libraries, and the pools are opened in advance when the server gets started. The maximum allowed pool size is 64. HTTP requests are sent by the ab utility with different -n and -c keys; the -l flag is always sent.

    Read more →

  • PG2 early announce and benchmarks, part 1

    TL;DR: https://github.com/igrishaev/pg2

    Table of Content

    Introduction

    During the last year, I was working on PG — JDBC-free PostgreSQL driver in pure Clojure. By purity it means, there is only a TCP socket to read and write bytes according to the official PostgreSQL protocol, and nothing more.

    It was fun: the very idea of implementing something low-level in Clojure was a challenge. I’ve made a series of tricks to squeeze the performance: mutable collections in favour of Clojure’s ones, special macros to traverse collections using Iterator and .forEach, and so on. After all, my driver was about 1.5 times slower than Next.JDBC, and I still think there is room for further improvement.

    One may ask what is the point of making a driver from scratch in 2024. The reason is, I’m still missing plenty of Postgres features when working with it from Clojure. Namely:

    • no built-in JSON support. In every project, I’ve got to extend some protocols with PGObject, encode and decode the JSON manually;

    • no COPY support. In Postgres, COPY IN/OUT is one of the best features I can remember. But there is no built-in CSV nor binary encoding, for example.

    • Poor time support: selecting a timestamp returns an instance of java.sql.Timestamp which is based on java.util.Date: a mutable object deprecated in Java 1.1.

    • Poor array support: only a certain number of types, no multidimensional arrays, etc.

    • No built-in connection pool.

    Today I deprecated the PG project in favour of PG2. This is a successor of PG(one), my second attempt to make a JDBC-free driver for Postgres. This time around, it’s written completely in Java with a thin Clojure layer. I’ve made some benchmarks and it looks like PG2 2-3 times faster than Next.JDBC. There is no documentation yet, only integration tests that cover plenty of cases (I borrowed the old tests and improved then). Although the documentation is highly required, I could not wait to announce PG2 and share the benchmarks.

    How the benchmarks were made

    I’ve got three Mac devices with core i5, i9, and ARM M1 processors. On each device, I’ve got PostgreSQL installed. All the settings are default, no changes are made. JVM is version 21 although the 16th is the minimum version. The benchmarks are made with Criterium version 0.4.6.

    There are two types of benchmarks, actually. In the first group, I measure query/execute functions using the Criterium framework. In the second group, I’m running a simple HTTP server using Ring + Jetty + JSON and measuring requests per second with Apache Benchmark (ab). For each test, I show the source code with a chart and comments.

    The source code of benchmarks can be found in the repository.

    Read more →

  • Предновогоднее

    Этот пост — просто чтобы сказать что-нибудь хорошее перед Новым годом.

    Спасибо всем, кто меня читает. Я отключил аналитику и не знаю, становится ли читателей больше или меньше. Хочется верить, что кому-то все еще интересны мои статьи. Надеюсь, это сохранится и в будущем.

    Недавно я перенес партию заметок и Телеграма в блог, и в комментариях упрекнули, что много нытья про плохой софт. Я перечитал и понял, что это так. Давно заметил: находить недостатки в чужой работе легко. Можно взять айфон и найти сотню недостатков в интерфейсе. Это обеспечит блог постами на год вперед, но кому интересен поток жалоб?

    Поэтому я решил писать меньше о проблемах софта и больше — о чем-нибудь другом. На ум приходят такие темы:

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

    • драйвер для Постгреса. Недавно я переписал его на Джаве и теперь он в три раза быстрее, чем next.jdbc Шона Корфилда. Пишу и сам в это не верю. Но многое нужно поправить, прежде чем выкатить релиз.

    • пост про 1С, на котором я писал года три-четыре еще в Чите. Меня задевает, когда про 1С рассуждают те, кто знает его со слов свата кума сестры. Расскажу, как за вечер сделать на 1С то, что фронтендеры пилят месяцами.

    Всем удачи и добра, увидимся в новом году.

  • Плеер в Ютубе

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

    Пример: если щелкнуть по видео, фокус будет на временной шкале. Пробел ставит видео на паузу. Если кликнуть по динамику, выключится звук, и фокус окажется на виджете звука. Нажимая пробел, вы будете включать и выключать звук.

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

    Ясен хрен, так быть не должно. Пробел должен отвечать за что-то одно, а не все разом в зависимости от того, где сейчас фокус. Это мышление кодера: да, плеер сложный и логично, что он состоит из компонентов. Но какое мне дело как пользователю? Представьте радиоприемник, где у кнопок разные функции в зависимости от угла к северу или фазы Луны. А для фронтендера это — обычное дело.

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

    Я уже говорил, что нам не везет с фронтендерами. Почему-то они не могут сделать нормальный интефейс, хоть в Гугле, хоть Амазоне, получая при этом космические деньги.

    Чтож, подождем.

  • Наблюдение

    Обновить программу, которая долго просит обновиться, в надежде, что она оставит тебя в покое – то же самое, что дать денег алкашу. Через какое-то время он придет снова, но будет просить настойчивее.

    Нужно расстаться раньше этого.

  • Две проблемы

    Говорят, в программировании две проблемы: инвалидация кэша и именование переменных. Не знаю, я никогда не испытывал с этим проблем. Чтобы не сбрасывать кэш, просто пиши без кэша. Проще оптимизировать SQL-запрос, чем возиться с условным Редисом.

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

    Истинные две проблемы программирования другие.

    Первая — программист закладывает абстракции там, где не следует. Иными словами, готовится к тому, что никогда не произойдет. Например, делает наследование из трех классов или внедряет ОРМ на случай переезда на другую базу. И никогда не переезжает.

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

    Как только первое и второе правила согласуются с реальностью, жить и работать становится проще.

  • Вещи, которые должны были сделать жизнь лучше (1)

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

    Уведомления

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

    А есть еще уведомления в браузере! Кто их там включает в здравом уме, не представляю.

    Обновления

    Мы живем в мире непрерывных обновлений. Обновляются программы, пакеты, прошивки, операционные системы. По умолчанию обновления включены, и это настоящий ад.

    Редкая программа обновлятся молча. Чаще всего нам показывают модалки, которые нельзя скрыть. Никого не волнует, что обновление одной программы сломало другую. Обновления рушат процессы, вынуждают людей простаивать, потому что ноут ушел в обновление. Скрипт, который стабильно работал полгода, упал из-за нового пакета.

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

    Голосовые меню

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

    Например, десять вечера, ребенок заболел. Я звоню в аптеку, чтобы узнать, есть ли то, что нужно. А там номер 8-800: сначала здравствуйте, потом свежие предложения, перечисление пунктов меню. Оператор поддержки сидит в Туле за тысячу километров. Какая от него может быть помощь? Поэтому я звоню только в аптеки с городским номером.

    Забавно, что лет двенадцать назад я делал голосовое меню для Энергосбыта в Чите. Находил это очень важным и полезным для абонентов.

    Синтез речи

    С обработкой речи ситуация спорная. С одной стороны, прикольно управлять Алисой: включать музыку, спрашивать погоду и всякие мелочи. С другой стороны, технологии речи привели к телефонному спаму. Раз в пару дней звонок из банка, где заскриптован разговор сотрудника, предлагающего кредит. Сделано очень реалистично: если не прислушаться, можно разговаривать с машиной, как с живым человеком. Эту технику переняли различные мошенники, и их жертв стало больше.

    Фирм, которые предлагают телефонный спам, совсем немного, буквально пять. Одна из них находится в Воронеже. У нас на митапе выступал ее основатель. Если отбросить мыльную формулировку “оказание услуг по информированию населения посредством телефонной и сотовой связи”, то останется то, ради чего фирма и создавалась — спам. Так что имейте ввиду: когда вам звонит робот с предложением списать долги, велика вероятность, что это дело рук одного хорошего воронежца.

    (продолжение следует)

  • Картинки в Телеграме

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

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

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

    Вот и получается, что пост с картинками проще сверстать в Телеграфе и кинуть ссылку, чем бодаться с Телеграмом. Редкий случай, когда фирма делает костыль для самой себя.

    Все это очень странно.

Страница 5 из 74