• Еще немного книг

    Выкладываю несколько прочитанных книжек. Полную подборку см. на книжной полке.

    Черный о красных. 44 года в Советском Союзе
    Роберт Робинсон

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

    Фрикономика
    Стивен Дабнер, Стивен Левитт

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

    Праведный палач. Жизнь, смерть, честь и позор в XVI веке
    Джоэл Харрингтон

    В основе книги лежит дневник палача Франца Шмидта 16 века. Сквозь этот дневник автор описывает средневековую жизнь Германии и Европы в целом. Передает уклад различный сословий, общественный порядок и место человека в обществе того времени. Рекомендую книгу, потому что она рушит многие мифы о Средних веках.

    Джедайские техники
    Максим Дорофеев

    Набор советов о том, как справляться с задачами. Своего рода русский аналог Make Time (см. ниже). Местами наивно, но взял парку вещей на заметку.

    Программирование на Сlojure
    Чаз Эмерик, Брайан Карпер, Кристоф Гранд

    Первая книга о Сlojure на русском языке, которая вышла еще в 2013 году. Талмуд на 800 страниц. Материал не устарел, советую прочитать и сейчас. Минус в том, что мало полезных примеров, нацеленных на практику. Рад, что добрался до этой книги уже с багажом знаний о языке.

    Elements of Сlojure
    Zachary Tellman

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

    Apache Kafka. Потоковая обработка и анализ данных
    Нархид Ния, Шапира Гвен

    Чтобы каждый раз не материться в работе с Кафкой, купил и прочел книжку. Полезно, раскрыто много деталей и тонкостей. К сожалению, адский перевод на уровне Гугла пятилетней давности. Держу на полке как справочник.

    Код. Тайный язык информатики
    Петцольд Чарльз

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

    Автор, ножницы, бумага
    Николай Кононов

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

    Идеальный программист. Как стать профессионалом разработки ПО
    Роберт Мартин

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

    Вся кремлевская рать. Краткая история современной России
    Михаил Зыгарь

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

  • Баг с почтой на Маке

    Наткнулся на странный баг с почтой. Касается MacOS, Mail.app и Gmail, то есть когда работаешь с Гугловым ящиком из обычного приложения на Маке. Ситуация: если долго набирать письмо, то при сохранении черновика на сервере создается новое письмо в цепочке. Выглядит так:

    Напоминает историю коммитов в Гитхабе. Видно, что каждый раз, когда я делал паузу, на сервере появлялось новое письмо вместо черновика. В результате образовалась цепочка на 53(!) письма. Они заполняют выдачу в поиске, мешают переписке.

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

    • Чел 1: Письма дублируются!
    • Гугл: Починили.
    • (через год) Чел 2: опять дублируются!
    • Гугл: Починили.
    • (через полгода) Чел 3: у меня то же самое!

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

    Проблему легко победить. Из верхнего меню пройдите по пути Mail → Preferences → Accounts. В списке учеток выберите нужную и включите таб “Mailbox Behaviours”:

    В поле “Drafts Mailbox” откройте выпадашку, чтобы указать, где хранить черновики. Укажите последний пункт “Drafts” под секцией “On my Mac”:

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

    Выставил эту опцию для всех Гугловых ящиков, и проблема ушла.

  • Книга в Читай-Городе

    Приятная возможность напомнить о книжке: теперь ее можно купить в сети “Читай-Город”. На подходе “Буквоед”. Спрашивайте везде!

  • Довод. Название

    Где-то читал, что название Tenet режиссер выбрал потому, что оно читается в обе стороны. Таким образом он проводит параллель с организацией, которая работает в обоих временных направлениях. И только недавно, когда шел и думал о чем-то краешком мозгов, догадался: а ведь русский перевод “довод” тоже читается наоборот.

    До чего же редкий случай! Нашлось слово, которое не только близко по смыслу к оригиналу (“принцип”, “догмат”), но и повторяет его семантику. Точное попадание, победа локализаторов.

    К сожалению, такое редко случается. Например, скоро выходит мультик Soul (в российском прокате — Душа). К переводу не подкопаешься, но семантика в том, что в сюжете переплетается загробная жизнь и музыка в стиле соул. То есть в названии два смысла — человеческая душа и музыка. Тут ничего не попишешь, бери что-то одно.

    А вот с Доводом зачетно вышло в плане названия. Но про сам фильм — как-нибудь в другой раз.

  • Зипперы в Clojure (часть 7). Обход в ширину. Улучшенный обмен валют

    Оглавление

    В прошлый раз мы работали с деревом валют, чтобы найти цепочку обмена. Мы нашли решение задачи, но упомянули, что в особых случаях дерево может получиться бесконечным. Объясним, как это возможно. Для этого вспомним, как zip/next обходит дерево.

    Алгоритм называется depth first или обход в глубину. При таком обходе код стремится в первую очередь вниз, а уже потом — в сторону (в нашем случае вправо). В этом легко убедиться, если разложить данные на части с помощью зиппера:

    (->> [1 [2 [3] 4] 5]
         zip/vector-zip
         iter-zip
         (map zip/node)
         (map println))
    
    ;; 1
    ;; [2 [3] 4]
    ;; 2
    ;; [3]
    ;; 3
    ;; 4
    ;; 5
    

    Read more →

  • Зипперы в Clojure (часть 6). Вирутальные деревья. Обмен валют

    Оглавление

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

    До сих пор вторая функция, которую мы передавали в зиппер, возвращала потомков из ветки. Для вектора это была просто seq, для XML — более сложная комбинация (comp seq :content). Оба варианта отталкиваются от родительского узла, и если потомков нет, функция вернет nil.

    Но что если функция потомков вернет постоянный набор, например:

    (fn [_]
      (seq [1 2 3]))
    

    Как поведет себя такой зиппер? Напишем его:

    (def zip-123
      (zip/zipper any?
                  (constantly (seq [1 2 3]))
                  nil
                  1))
    

    Read more →

  • Зипперы в Clojure (часть 5). Редактирование

    Оглавление

    До сих пор мы игнорировали другую возможность зипперов. Во время обхода можно не только читать, но и менять локации. В широком плане нам доступны все операции CRUD (Create, Read, Update, Delete), знакомые вам из веб-разработки. Ниже мы разберем, как они работают в зипперах.

    Напомним, зиппер принимает третью функцию make-node, в которую мы до сих пор передавали nil. В ней не было нужды, потому что мы только читали данные. Зиппер вызовет функцию в момент, когда мы просим вернуть данные с учетом изменений, которые внесли в локации. Функция принимает два параметра: ветку и потомков. Ее задача — соединить их так, как это принято в дереве.

    Read more →

  • Разбор статьи из журнала «Код»

    На Хабре – моя публикация Разбор статьи из журнала «Код» (Яндекс Практикум).

  • Зипперы в Clojure (часть 4). Поиск в XML

    Оглавление

    Предположим, нам поставили задачу: из XML с товарами выбрать магазины, где продаются айфоны. Обратите внимание: мы впервые коснулись связи между узлами, и это важно. По отдельности выбрать данные легко. Магазины — это локации, у которых где тег узла organization. Айфоны — локации, в которых узел с тегом product и атрибутом type="tablet". Но как найти связь между ними? Из второго набора получить первый?

    В прошлой части мы разложили XML последовательность с помощью xml-tree. Проблема xml-tree в том, что она порождает коллекцию узлов в одном направлении — от вершины вниз. Для примера выведем теги узлов. Часть (remove nil?) нужна, чтобы отсечь nil для текстового содержимого.

    Read more →

  • Зипперы в Clojure (часть 3). XML-зипперы

    Оглавление

    Мощь зипперов раскрывается в полной мере при работе с XML. От других форматов он отличается тем, что задан рекурсивно. Так, JSON, YAML и другие форматы предлагают типы — числа, строки, коллекции, — у которых разный синтаксис и структура. В XML, где бы мы ни находились, текущий узел состоит из трех компонентов: имени тега, атрибутов и содержимого. Содержимое может быть строкой и набором других узлов. На псевдокоде это можно выразить рекурсивной записью:

    XML = [Tag, Attrs, String|[XML]]
    

    Чтобы убедиться в однородности XML, рассмотрим условный файл с выгрузкой товаров:

    Read more →

Страница 1 из 49