• Мракобесие в школах

    Был на школьном собрании. Нынче в моде такая тема: всевозможные кружки и организации выведывают, когда будут собрания, и ходят рекламируют свои услуги. Это раздражает: полно вопросов, у всех дома дети, а эти паразиты отнимают время. Зашла первая про танцы, вторая про коммерческую продленку, третья еще какая-то дичь…

    Но окончательно я офигел, когда зашел поп. Такой каноничный, пузо во, борода во, крест больше Афона. И погнал такую дичь, что аж затошнило. Что детей пытаются сделать врагами, запад высасывает мозги, что на Украине предали прошлое. Я немного терпел, а потом громко попросил его замолчать. Мамаши закудахтали, поп взбодрился и перешел к делу.

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

    Мамаши выбрали религию, поп приободрился. Я объяснил, что сын на эту дичь ходить не будет, принципиально приеду с работы и заберу. Поп начал было опять про Украину, но я попросил его замолчать. Немного покусались, и он ушел.

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

    В Подмосковье, говорят, вообще попы ведут религиозные занятия вместо истории и биологии. Без комментариев.

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

  • Медицинская страховка

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

    В старой фирме дали страховку. Надо было сделать МРТ, решил воспользоваться. Не ожидал, что взаимодействие со страховой такое аналоговое. Звонишь, висишь в очереди. Потом объясняешь офисному сотруднику в мельчайших подробностях, что у тебя болит, куда пошел и что назначили. Он тебя придирчиво расспрашивает. Какая-то офисная крыса знает все до последней интимности.

    Страховые – жадные. Тебе пытаются отказать, нужно доказывать, что ты попадаешь под страховой случай. Это долго и унизительно.

    Моя жена стоматолог, вот что она рассказывает. Пациентов по страховым в клиниках не любит никто: ни врачи, ни дирекция, ни администраторы. Это вытекает в нелюбовь к пациенту. Страховых стараются перенаправить врачам более низкого ранга.

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

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

    Еще у врача есть такая штука как план. За невыполнение штраф. Выше я объяснил, что выручка по страховым не засчитывается в план текущего месяца, поэтому слишком много страховых пациентов увеличивает риск штрафа.

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

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

    Будет ли врач после этого брать страховых? Только от безысходности.

    Для меня страховка это одна из миллиона офисных фич, которыми пытаются купить сотрудника. Как печеньки на кухне, йога, фитнес-зал, мешки-кресла, приставка и пейнтбол. Не надо ничего этого, платите живыми деньгами. Я сам куплю что мне надо. И за лечение заплачу сам.

  • Clojure extended: Java interop book

    Today, I published my first Clojure book about Java interop. It took 60 pages and seven chapters with five of them related to practice. I solve real cases borrowed from real projects I’ve have worked before in Clojure relying on Java a lot.

    I decided to write such a paper because I got tired of more and more Clojure books published. They all consider their reader as a newbie and do leave enough room for extended topics.

    The whole that book is a single extended topic. It consists of bits of knowledge I’ve been collecting for years. It is a tough and nerdy reading for those who bother with details. I’m really proud of I managed to complete it.

  • Remus: a new RSS/Atom feed parser for Clojure

    Recently, I found plenty of code that I usually borrow from project to project without hosting it on GitHub. I think I may share some of that since it might be useful to anybody.

    The first library I’d like to start with is a feed parser. There are already some Clojure wrappers for ROME and they even solve default cases. But mine wrapper is special since it supports lots of additional options and tweaks. So if you play with RSS a lot, try Remus, the library I’m introducing in this post.

    It’s also built on top of ROME but uses clj-http for HTTP communication with all its features, e.g. redirects settings, connection pooling, conditional requests by Etag.

    Remus fetches all the possible data from a feed including non-standard tags for further processing. Some feeds (YouTube, for example) distribute useful data with custom XML tags, e.g video statistics or geographical coordinates.

    Start with including the library into a project:

    :dependencies [[remus "0.1.0"]]
    

    Import it:

    (ns your.project
      (:require [remus :refer [parse-url parse-file parse-stream]]))
    
    ;;;;
    ;; or
    ;;;;
    
    (require '[remus :refer [parse-url parse-file parse-stream]])
    

    Now parse a URL:

    (def result (parse-url "http://planet.clojure.in/atom.xml"))
    

    The result will be a map with :response and :feed keys. The first one holds an HTTP response. You’ll need it to save some of the headers for further HTTP communication. The :feed key contains a huge map representing a parsed feed:

    (def feed (:feed result))
    
    (println feed)
    
    ;;;;
    ;; a small subset of the origin feed
    ;;;;
    
    {:description nil,
     :feed-type "atom_1.0",
     :entries
     [{:description nil,
       :updated-date #inst "2018-08-13T10:00:00.000-00:00",
       :published-date nil,
       :title
       "PurelyFunctional.tv Newsletter 287: DataScript, GraphQL, CRDTs",
       :author "Eric Normand",
       :link
       "https://purelyfunctional.tv/issues/purelyfunctional-tv-newsletter-287-datascript-graphql-crdts/",
       :contributors (),
       :uri "https://purelyfunctional.tv/?p=28660",
       :contents
       ({:type "html",
         :mode nil,
         :value "long HTML here....."
         }),
     :extra {:tag :extra, :attrs nil, :content ()},
     :published-date #inst "2018-08-13T11:59:11.000-00:00",
     :entry-links
     ({:rel "alternate",
       :type nil,
       :href "http://planet.clojure.in/",
       :title nil,
       :length 0}
      {:rel "self",
       :type nil,
       :href "http://planet.clojure.in/atom.xml",
       :title nil,
       :length 0}),
     :title "Planet Clojure",
     :link "http://planet.clojure.in/",
     :webmaster nil,
     :uri "http://planet.clojure.in/atom.xml",
     :authors ()}
    

    To parse a file:

    (def feed (parse-file "/path/to/some/atom.xml"))
    

    This function returns just a feed data structure.

    Remus supports options to specify how to communicate via HTTP; how to deal with broken or wrong encoded feeds; how to prevent receiving data you’ve already processed. I described all of this in the readme file and do not want to clone that text here. Instead, please look through that file and examples. I hope you’ll find the library helpful and will use it one day.

  • Что делать с залитым Маком

    Два дня назад я залил Мак. Он не работает, ждет ремонта в сервисном центре. Все из рук вон, не могу работать, не трекаю часы.

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

    Итак, если вы опрокинули на Мак стакан воды, нужно его перевернуть и выключить. В перевернутом состоянии вода не будет стремиться вглубь корпуса, где самые важные детали: материнская плата и процессор. В отключенном состоянии меньше шанс, что случится замыкание.

    Забейте на несохраненные документы — вы их потом восстановите. На корректное завершение работы уйдет пара минут, что критично для системы.

    Бросайтесь в такси и езжайте в сервисный центр. Если вас не отпускают с работы (хотя какая работа без Мака) или вы сидите с грудным ребенком, передайте Мак таксисту и договоритесь с сотрудником центра, что он его примет.

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

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

    Чего точно не следует делать, так это заниматься самолечением. Не нужно раскручивать технику, что-то там протирать, любоваться деталями. И уж точно не трогайте фен, с ним только хуже.

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

    Даже стыдно об этом вспоминать. Жаль, что не нашлось никого, кто бы спросил: Иван, зачем ты его разбираешь? Что хочешь там увидеть? Предположим, ты открыл его, а там вода. Значит, срочно ремонт. А теперь предположим, воды нет. Значит, все хорошо? Не факт. Если и правда обошлось, мастер его почистит от пыли и вернет через пару часов. Если нет, значит, вода вступила в реакцию, впиталась в батарею, и наступит жопа. Так что вариант один — в ремонт.

    Так и было в моем случае: открыл, а воды нет. Обрадовался. Пыль собрал, выправил полоски радиатора ножом. Собрал — не работает. Потерял 40 минут, пока ездил за специальными отвертками.

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

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

    С осторожностью слушайте советы тех, кто “разбирается” в Маках. Не случайно взял это слово в кавычки. Если ваш знакомый просто снимал заднюю крышку и чистил пыль, это ни о чем не говорит. Специальный набор отверток дает +10 к уверенности, но ничего к знанию. Я и сам могу скручивать крышку по десять раз на дню и глазеть на потроха. Как это поможет реанимировать залитый Мак? Никак. “Разбирающийся” знакомый ничем не рискует, а вы — дорогой техникой.

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

    Короче, езжайте в ремонт асап. Теперь о том, как защитить Мак от воды.

    Вытирайте руки. В первый раз я залил мак каплями воды, которые стекали с влажных рук. Кажется, что ерунда, а в итоге смерть материнки и три недели ожидания новой из Москвы.

    Если капля попала на кнопки, не нужно на нее дуть. Так вы только загоните ее вглубь. Когда капля маленькая, она не может протечь в щель из-за сил поверхностного натяжения. Промокните ее ватной палочкой.

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

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

    Купить подставку, которая держит Мак над поверхностью стола. Подойдет тем, у кого два внешний монитор и клавиатура.

    Надеюсь, что-то полезное я донес. Берегите технику Эпла. Иначе придется превозмогать на старенькой Ленове с Убунтой, но это тема отдельного рассказа.

  • Рост доллара

    У тех, кто живет в России, но работает за валюту, есть дурацкая черта — радоваться росту доллара. Прекратите это делать.

    Во-первых, это не доллар растет, а рубль падает.

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

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

    Не все работают за доллары. Если точнее, очень немногие. Врачи, учителя, госслужащие получают обычные рубли. От того, что ваш доход вырос на 10%, им не легче. Проседает вся страна.

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

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

  • Проверка русской орфографии в Emacs

    Неделю назад добавил в Emacs проверку русской орфографии. Теперь проверяю заметки прямо в редакторе. Расскажу, как подружить Emacs с русским текстом и заодно об орфографии в принципе.

    Emacs умеет проверять текст без установки сторонних модулей. Для этого служат команды с префиксом ispell-. Например, ispell-buffer проверит весь буфер, ispell-region – выделенный фрагмент.

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

    По умолчанию Emacs использует одноименную программу ispell. Это старая консольная утилита, заменившая spell – еще более древнюю программу. Префикс i означает international, то есть проверку на любом языке при наличии словаря.

    Установить русский пакет в ispell долгое время не получалось. Его нет в репозиториях brew, поддерживается только Линукс. Сборка под Мак валилась ошибками в кодировках.

    Emacs работает не только с ispell, но и другими spell-совместимыми программами. К ним относится, например, aspell, утилита из проекта GNU. Она реализует тот же протокол обмена данными, что и ispell, но более мощная и современная.

    Поставим ее из brew:

    brew install aspell --with-lang-ru
    

    Обратите внимание на флаг в конце. Он указывает, что при установке нужно подтянуть русский пакет. Без флага пакета не будет, и программа не поймет русский текст.

    Полный список флагов можно посмотреть в формуле на Гитхабе.

    Чтобы Emacs понял, что теперь у нас aspell вместо ispell, скажем ему об этом командой:

    (setq ispell-program-name "aspell")
    

    Добавьте это выражение в свой .emacs файл. Необязательно перезагружать редактор. Чтобы изменения вступили в силу мгновенно, скопируйте этот же код в буфер *scratch*, поставьте курсор за последней скобкой и нажмите C-j.

    Начнем проверку на английском. Откройте любой файл с латиницей. Из списка команд, вызванного по M-x, выберите ispell-buffer. Редактор переключится в режим проверки:

    Когда spell-программа находит незнакомое слово, проверка останавливается в ожидании пользователя. Цифры от 0 до 9 служат для выбора подходящего слова. Клавиша i означает принять слово как исключение. Пробел означает пропустить слово.

    По окончанию проверки Emacs предложит сохранить правила в локальный словарь. Например, у вас было слово Postgres, о котором aspell не знал. Если в процессе проверки вы нажали i и сохранили локальные правила, то в следующий раз Emacs воспримет его как словарное слово.

    Чтобы проверить русский текст, переключите словарь командой ispell-change-dictionary. Выберите из списка пункт ru. Откройте файл на русском и запустите ispell-region.

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

    Иногда мы пишем текст, в котором есть и русские, и английские слова. Например, описание программы и ее код. Emacs не умеет проверять текст сразу на нескольких языках. Если запустить прогон всего буфера, то русскому словарю будут незнакомы все английские слова и наоборот. Чтобы не добавлять в каждый словарь иностранные исключения, проверяйте текст частями. Выделяйте нужные абзацы и вызывайте ispell-region.

    Вся информация в Емаксе представлена текстом, поэтому проверка работает в любой части интерфейса. Она не зависит от языка или платформы, под которую вы пишете код. Я частенько прогоняю файлы Кложи, чтобы найти опечатки в переменных. Проверяю описание комита в буфере magit. Ищу ошибки в заметках этого блога.

    Важно помнить, что ispell проверяет только отдельные слова, но не словосочетания или предложения. Поэтому остаются ошибки, когда у слова не то окончание или время. Или когда из-за копи-пасты образовалась бессмыслица. Даже после проверки текст нужно вычитывать.

    Мой полный конфиг Емакса лежит на Гитхабе.

    А как дела с русским языком в вашем редакторе?

  • Мнение

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

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

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

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

    Но если вы действительно радеете за правду, и все ваши помыслы лишь о том, чтобы слова не расходились с делом, то послушайте вот что.

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

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

    Наверное, вы догадались, что не сбылось ни одно высказывание. Я прекратил записывать за окружающими не потому, что ничего не сбывалось. Это было ясно с самого начала.

    Дело в другом. С таким подходом ты начинаешь выглядеть маньяком и мудаком одновременно. Люди очень болезненно реагируют, когда припоминаешь их ошибки. Расцветает весь спектр эмоций. Если и есть способ угробить отношения, то вот он: ловить на слове.

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

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

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

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

    Я тоже раньше так поступал – находил старые записи в чьих-то блогах и доказывал, что автор не прав. Например, насмехался над диванными аналитиками, сулившими рост биткоина до миллиона долларов. Или нашел доклад от 2012 года, где автор сулит Кложе скорую смерть.

    Но затем понял, что это от безделья и зависти. Если бы я писал что-то по делу, у меня бы не было времени пинать других за ошибочные высказывания.

    Чужая ошибка должна интересовать меня только в разрезе работы или жизненного опыта. Я должен извлечь урок и обезопасить проект или семью. Но пустые насмешки не приносят пользы, только пожирают время и тешат самолюбие.

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

    Мнение привязано ко времени. Уже через месяц автор может изменить тому, что высказывал раньше. Никто не в праве обвинять его. Автор ничего не должен читателю.

  • Зачем нужна Кложа

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

    Как же ответить, зачем нужна Кложа? Чем подкрепить точку зрения? Примерами из жизни.

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

    Сидели в офисе, работали, устали. Захотели почесать языком. Коллега пожаловался на функцию map в Питоне, и пошло-поехало. В итоге мы вышли на функциональное программирование и работу с данными в ФП-стиле. Заспорили, как лучше обходить коллекции.

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

    Я сначала не понял, почему это именно задача – в том смысле, почему над ней нужно думать. Совершенно рутинная вещь, два редьюса. Первый собирает все рейты по возрасту, второй считает среднее. Вот и все.

    Можно свести два в один, как-то оптимизировать, но не суть. Главное, что кложурист вообще не видит здесь проблемы. Задача уже решена в уме, достаточно написать код в репле.

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

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

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

    Понимаете, нет инструмента! А нет инструмента, нет и понимания, что чего-то не можешь. Будешь сраться в чате, доказывая, что твой язык клевый. А как же ты узнаешь как эффективно работать с данными, если в языке ничего для этого нет? Замкнутая система.

    По аналогии со словом: если нет слова, значит, нет целого домена в сознании. Этой пустоты не видно изнутри, ее можно увидеть только со ступени выше. Я искренне верю тем, кто пишет, что ему и так нормально. Верю, нормально. Человек ко всему привыкает. Мы раньше и массив по i,j обходили и считали это нормальным. Но это не оправдание лени и нежеланию учиться.

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

    Почему так много вопросов именно по работе с коллекциями? Неужели автор не умеет переводить список в словарь? Скорее всего, Кложа не первый его язык, и он уже программировал раньше.

    Дело не в том, что в Кложе трудно обрабатывать коллекции. Наоборот, это сильнейшая ее сторона. Разница в том, что на этот раз автора заставили делать это правильно. Отсюда ломка.

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

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

    В Кложе нельзя так, просто нельзя. В ней есть изменяемые коллекции и стейт, но это высокая планка. Язык так устроен, что если ты взялся что-то менять, то подружись сперва с неизменяемостью.

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

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

    Возвращаясь к вопросу из заголовка – Кложа нужна затем, чтобы научиться работать с данными. Чтобы при одном только виде коллекции мозг автоматом выдавал комбо из map, reduce и filter.

    Если вы пишете только на императивных языках, то скорей всего, не умеете работать с данными. Вам нормально, но вы не умеете. Не умеете, но вам нормально. Такой вот замкнутый круг. Это не страшно, и я до Кложи не умел. Посмотрел старый код на питоне и ужаснулся.

    Нет трудности в том, чтобы сесть за Кложу на недельку и повтыкать, как работать с данными. Мир после этого станет другим.

  • Прелести РЖД

    Каждое лето я вожу сына в деревню к бабушке. Поездка туда и обратно занимает два дня. Отвезти и забрать – четыре.

    Мне приходилось ездить разными классами и типами вагонов. В целом, РЖД медленно, но верно улучшается. Появляются фирменные поезда, в проводники набирают молодежь. Начальник поезда делает обход и опрашивает пассажиров.

    Все же, хотелки опережают инертную РЖД. Последние годы я наблюдаю все те же проблемы, а решения им не видно.

    Больше всего раздражает малое время посадки. Если это не главный вокзал в крупном городе, поезд стоит две минуты. За это время пассажир должен подойти к вагону, показать документы и подняться по лестнице. У него могут быть дети, вещи. Навстречу прут курильщики. Словом, ад.

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

    Другая беда это нумерация вагонов. Кажется лишним утверждать, что в мире пассажира нумерация бывает одной – от головы. Нумерация от хвоста это внутренняя дичь, которую выплескивают наружу. Внутри компании нумеруйте как хотите, но не заставляйте пассажира парсить и восстанавливать верный порядок. Будто у него других забот нет.

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

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

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

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

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

    Пару лет был в Москве зимой. Был неприятно удивлен числом милиционеров и бомжей. За каждым баннером лежит бездомный, а над ним мент с овчаркой. Насколько я понял, у мента одна задача – перегнать бомжа на другой участок. Так они и кочуют из крыла в крыло.

    Я подозреваю, что ни один значимый чиновник РЖД не садится в обычный поезд на обычном вокзале. Им подают служебные поезда, у которых другой регламент. В том и проблема: производитель не пользуется своей же услугой. В результате не понимает, какое дно производит.

Страница 2 из 42