• Базы данных в Clojure (1)

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

    Реляционные БД

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

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

    Read more →

  • Зипперы в Clojure (часть 8). Заключение

    Оглавление

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

    HTML

    И прошлых примеров видно, что зипперы подходят для работы с форматом XML. В том числе их можно применить и для HTML. Строго говоря, синтаксис HTML отличается от XML: некоторые элементы вроде <br> или <img> не имеют закрывающих тегов. Проблему можно решить с помощью парсеров, которые учитывают эти особенности. На выходе получим XML-дерево, которое поддается обходу как в примерах выше.

    Read more →

  • Помогайте (опровержение)

    Послушайте еще одну кулстори и выводы из нее.

    Недавно я смотрел код на Джаве, и не понял одну вещь. Все-таки я кложурист и в кишки JVM лажу только по необходимости. Было непонятно, почему вместо интерфейса можно передать лямбду, ведь последняя, насколько я знаю, имплементит Runnable и Callable, а в коде был левый интерфейс. Нормальный вопрос, который знает средней руки джавист. И тут Штирлиц ошибся — спросил об этом в Телеграм-чатах.

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

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

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

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

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

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

    Вот и сейчас я пишу этот пост после того, как ответил некоему Томасу из Швейцарии. Экран текста. Чел строит приложуху, но не идут дела. Зато благодаря моим письмам продвинулся на стадию прототипа.

    Где-то я читал басню о том, как на заре Микрософта один клиент купил Ворд и затупил. Он написал бумажное письмо с вопросами и бросил в ящик у двери офиса. Через неделю он получил ответ на четырех листах, написанный от руки одним из разработчиков. Тот чел до сих пор хранит это письмо. Вот она какая, любовь к пользователям.

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

  • Громкость

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

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

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

    У цифрового дизайна этого ограничения нет. Можно сделать десять экранов или пять каналов звука: звонок, приложения, игры, будильник, что там еще… И бесконечные настройки всего этого. Орет телефон — ты же понизил уровень звонка, балда, а надо было медиа! Учись пользоваться девайсом.

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

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

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

  • Твит картинкой

    Наверное, вы не заметили, а на Медузе случилось эпохальное событие. Вышла статья, в которой твиты показаны не через встроенный <iframe>, а картинками. Я даже не поверил, открыл инспектор и проверил. Картинки, офигеть.

    Вёрстка странная: где-то <source>, а где-то <img> и base64. Но при всей примитивности это огромный шаг. Встроенные твиты, конечно, глупость; но как и с любой глупостью, на ее преодоление нужны силы. И чем шире заблуждение, тем сильнее должен быть рывок.

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

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

    Всё же нашлась в Медузе светлая голова (причём не обязательно автор статьи). Кто-то понял, что картинка должна быть картинкой, а не слоём десяти абстракций (ifame, CORS, JavaScript, etc). Твит можно удалить, заблокировать, Твиттер прилёг, админ закрыл доступ. Картинка — это снимок объекта в момент времени. Я увижу объект в том виде даже через десять лет, когда и Твиттер продадут, и твит пометят как оскорбляющий всех на свете, или ещё что.

    В Твиттере бывает видео, но уже два этих слова в одном предложении — Твиттер и видео — заставляет меня фыркнуть. Анимированных гифок на 30 секунд не надо; нормальное видео должно быть на Ютубе.

    Камней в огород заслуживают ребята, которые постят код встроенными гистами. Это за гранью: вместо того, чтобы вставить код текстом и подсветить каким-нибудь highlight.js, который везде по умолчанию, чел копирует пять строчек ямла, делает гист, копирует ссылку на iframe и вставляет в бложик. В основном так делают на Медиуме, что говорит за себя.

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

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

  • Возрастное

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

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

    Занятно, что чем чаще пишет человек, тем больше этим бесит. О всяких Варламовых, Лебедевых и Навальных вспоминаю как о страшном сне. Эту дыру не заткнуть, а мне еще разбираться, какой из двадцати скопившихся постов прочесть. Раз в месяц — самое то для текущего состояния.

    Не прет почти никакое видео из Ютуба. Выщелкиваю подписки, которые когда-то ревностно искал. Не представляю, как смотреть чье-то выступление на 50 минут. Для меня это стало за гранью.

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

    Игры? Когда-то я даже жалел о том, что купил Мак — как теперь играть? Недавно посмотрел на Ютубе последний Дум. Первая мысль была — почему так однообразно? Все эти текстуры и дикая графика не прут. Раз в полгода прохожу что-то на эмуляторе первой Sony PS. При этом пользуюсь перемоткой вперед, чтобы ускорять медленные сцены.

    Не могу смотреть фильмы длинее двух часов — мука. Еле досидел Нолановский “Довод”. Если хочу что-то посмотреть, прежде всего проверяю хронометраж. Боготворю старые мульты Диснея по 80 минут с титрами. От современных 2:15 просто выворачивает.

    Уже не влекут другие языки программирования. После Кложи нельзя найти язык, который зацепит с той же силой. Зачем мне условный Golang? Коллега по работе не знает, как в нем сделать deep merge. У меня это пять строчек. И пусть оно ест в три раза больше памяти — мои силы важнее. Кроме Кложи, интересуюсь только Common Lisp-ом. Уйду в него, если с Кложей что-то пойдет не так.

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

    Чем заполнить пустоту, чтобы не остаться в пузыре? Пока что справляюсь книгами. Чередую технические и нон-фикшен, чтобы не было скучно. Сейчас вот читаю про Джаву и Чернобыль. В книге ты сам себе барин: если затянуто, пропускаешь. Нравится — вернулся и пережил заново.

    Удивительным открытием оказалась своя книга. Писать ее полтора года не так изнурительно, как вести опенсорс или писать по ночам очередной “свой проект”. Вот такая асимметрия: каждый день пишешь по две страницы и норм, даже чувствуешь подъем. А после третьей недели кодинга во внеурочное время кажется, что разваливаешься на части. Болят шея и руки, глаза как помидоры, на любую мелочь готов убить.

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

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

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

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

    Черный о красных. 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 (в российском прокате — Душа). К переводу не подкопаешься, но семантика в том, что в сюжете переплетается загробная жизнь и музыка в стиле соул. То есть в названии два смысла — человеческая душа и музыка. Тут ничего не попишешь, бери что-то одно.

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

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