-
Конфигурация
Содержание
- Постановка проблемы
- Семантика
- Цикл конфигурации
- Ошибки конфигурации
- Практика
- Подробнее о переменных среды
- Переменные среды в Clojure
- Простой менеджер конфигурации
- Чтение среды из конфигурации
- Короткий обзор форматов
- Промышленные решения
- Заключение
В этой главе мы рассмотрим, как сделать Clojure-проект удобным в плане настроек. Мы разберем основные приемы конфигурирования: форматы файлов, переменные среды, несколько библиотек, достоинства и недостатки различных подходов.
Внимание! Вы читаете черновик к книге “Clojure на производстве”. Для книги я переписывал его много раз, но в блоге осталась старая версия. Здесь она для истории, а вам я рекомендую купить книжку.
-
Не хочу мнений
Я мечтаю о том, чтобы иногда что-то высказать, но не получить обратной связи. Не услышать, что думает собеседник. Не обязательно каждый раз, хотя бы изредка, потому что это роскошь.
Ведь как бывает: скажешь что-нибудь про новую книгу, фильм или программу, и что? Тебе обязательно ответят. Скажут, что книга устарела, в другой написано лучше. Что программа не нужна, когда все уже есть из коробки. Что в фильме плохие актеры и вообще послушай, сейчас я тебе все расскажу.
Так, стоп. Я не просил чужих мнений. Почему-то у людей не укладывается в голове простая вещь. Их мнение никто не спрашивал! Если я сказал про новую книгу, я не прошу чужих оценок. Я просто сказал. Не нравится книга — проигнорируй. Или попроси не разговаривать о книгах, я не обижусь, правда.
Когда мне говорят про новый софт или фильм, я лишь пожимаю плечами или благодарю. Новый редактор? Ну ок, здорово. Понятно, что я его никогда не поставлю, но собеседнику-то какая разница? Он тащится, ему клево. Порадуйся за него, с тебя не убудет.
Не надо сразу пропихивать свое мнение. Оно важно только по требованию. Вот если бы я подошел и спросил, какую книгу почитать в следующей поездке, тогда другое дело. Но я же не подошел.
Несколько лет назад я страдал такой же фигней, пока не нашлось средство. Я тогда увлекся Хаскелом и монадами и приседал на уши там, где меня не просили. Прекрасно понимаю, что я нес ахинею, но люди вокруг были не лучше. Они банально не слушали, что я говорю и несли встречную пургу. Получался как бы спор глухого с немым.
Однажды моим собеседником был очень опытный программист, человек гораздо старше. Он триггернул меня, и я завел ту же песню. Собеседник, внезапно, молчал и слушал с таким вниманием, как никто и никогда не слушал. Я сначала занервничал: почему он не перебивает, не приводит аргументы? Зря что ли я заготовил доводы против?
И в этот момент я услышал сам себя. Понятно, я и раньше слышал, но в этот раз это случилось как будто со стороны. Я осознал, что выгляжу жалко, что не понимаю сути, что повторяю чужие слова. Еще я понял, что собеседник это понял. Поэтому поскорей закончил разговор и больше так не делал.
Понятно, что этого бы не случилось, не будь того собеседника рядом. А ведь он ничего особенного не сделал — просто слушал и смотрел в глаза! Он был даже не собеседник, а слушатель. Благодаря ему я один раз себя услышал, и такая была польза.
С тех пор я хочу, чтобы в моем окружении было больше людей, которые умеют слушать. Не потому, что с моих уст сыплются перлы мудрости. А потому, что я хочу иногда слышать сам себя, а не чужое мнение.
-
Изменяемость в Clojure
Содержание
- Общие проблемы изменяемых данных
- Атомы
- Volatile
- Переходные коллекции
- Подмена переменных. Alter-var-root
- Немного о set!
- Изменения в контексте. Binding
- Локальные переменные в контексте
- Глобальные изменения в контексте
- Все вместе
В этой главе мы поговорим про изменяемость данных. Тем, кто программирует на классических языках, покажется странным, что теме уделено так много внимания. Причина кроется в дизайне языка. Неизменяемые коллекции – одна из центральных идей Clojure.
Внимание! Вы читаете черновик к книге “Clojure на производстве”. Для книги я переписывал его много раз, но в блоге осталась старая версия. Здесь она для истории, а вам я рекомендую купить книжку.
В классических языках данные по умолчанию изменяются, а стандартная библиотека предлагает ограничения: локи, атомарные изменения, постоянные коллекции. Clojure устроена наоборот: по умолчанию данные не изменяются, а стандартная библиотека включает несколько техник, чтобы изменять данные. Этим техникам и посвящена глава.
Руководства по Clojure учат работать с неизменяемыми данными. Это приводит к тому, что начинающие программисты на Clojure испытывают трудности, когда возникает потребность менять данные. На время этой главы мы займем противоположную позицию: рассмотрим, какими способом хранить и управлять состоянием в программах.
-
Подружиться с исключениями. Видео с митапа
В прошлом месяце ездил в Москву, выступал на кложурном митапе. Выкладываю видос с чистым звуком:
-
Теги и Instant View
Вчера обновил блог. Первое достижение – появились теги. Я и раньше проставлял их, но не было возможности искать по ним. Теперь под заголовком каждого поста указаны его теги. Ссылка по тегу открывает список постов с ним.
Раньше я просто валил посты в кучу, а теперь понял, что надо как-то их структурировать. Поиск от Гугла хорош, но не дает полной картины. Планирую сделать разделы по Кложе и Питону, собрать все видео, словом, навести порядок.
Второй прорыв – сделал для блога Instant View в Телеграме. Это когда пост можно просмотреть прямо в клиенте без перехода на сайт. Это был очень интересный опыт. Еще не успел ничего автоматизировать, эту заметку заброшу вручную в канал. Дальше буду думать. И напишу отдельный пост, как все сделать по шагам.
-
Исключения в Clojure
Это третья глава предполагаемой книги по Кложе на русском языке.
Содержание
- Основы исключений
- Цепочки исключений и контекст
- Переходим к Clojure
- Контекст ошибки
- Когда бросать исключения
- Подробнее о цепочках
- Печать исключения
- Логирование
- Исключения как данные. Сбор исключений
- Переходы
- Finally и контекстный менеджер
- Исключения на предикатах
- Приемы и функции
- Заключение
В этой главе речь пойдет об исключениях. Поговорим о том, как они устроены и в чем их особенность. Когда лучше кидать, а когда ловить исключения. Как записать их так, чтобы расследовать инцидент было легко.
Внимание! Вы читаете черновик к книге “Clojure на производстве”. Для книги я переписывал его много раз, но в блоге осталась старая версия. Здесь она для истории, а вам я рекомендую купить книжку.
Возможно, читателю покажется странным, что на столь простую тему написано так много. Но исключения не так просты, как принято считать. По мнению автора, другие книги уделяют им возмутительно мало внимания. Считается, что программисту достаточно знать, что исключения бросают, ловят и пишут в лог. Движемся дальше.
Это не так. Технически исключения просты, но несут обширную семантику. Когда их кидать, когда перехватывать? Как извлечь полезную информацию из цепочки исключений? Куда их записывать? Возможно ли ловить исключения предикатами? Трудно вспомнить книгу или руководство, которое отвечает хотя бы на часть этих вопросов.
Начинающие программисты пишут код, следуя только положительному пути. Отчасти поэтому так трудно расследовать ошибки. Сервер вернул статус 500. Почему? Возможны сотни причин, по которым запрос не удался. Но запись в логе слишком скупа, чтобы расследовать инцидент.
Опытный программист внимателен к ошибкам. Приходит понимание, что сэкономив на обработке исключений, разработчик на самом деле не выиграет. В перспективе он потратит время на расследование непонятных ошибок.
Будет правильным считать, что ошибки столько же равноправны, как и нормальное поведение программы. Ошибки типичны в сетевых сервисах, в больших распределенных системах.
-
UI-тесты в браузере
На последнем митапе рассказал про тесты в браузере. Чем они отличаются от обычных тестов, что такое WebDriver и немного про свою библиотеку для Кложи.
-
Беда с парком
Начитался я Варламова и решил помочь воронежскому парку. Там случилась беда: какие-то гандоны поставили на лето аттракционы, а осенью смылись и ничего за собой не убрали. Написал в электронную приемную вот такое письмо с фотографиями. Посмотрим, что ответят.
Меня зовут Иван, я проживаю рядом с парком имени Дурова, что рядом с цирком. У меня двое детей, мы часто ходим гулять с ними в парк. К сожалению, с парком не все хорошо, и об одной из проблем я хочу рассказать.
Прошлым летом какие-то предприниматели расставили аттракционы: батуты, паровоз, карусели. Работали все лето, но с наступлением осени ничего не убрали. Аттракционы простояли всю зиму под снегом, ржавели, постепенно разваливались. Я и другие жители недовольны по двум причинам: это неэтично и опасно для детей.
Я не знаю, почему предприниматели не вывезли имущество. Но уверен, что решение его бросить выходит за все границы. Парк — это общественная территория. Выходит так, что значительный участок завален ржавым хламом. Не понимаю, почему нельзя вывести аттракционы, а с предпринимателей взыскать штраф. Груды металлолома среди парка смотрятся безобразно.
Поломанные аттракционы опасны для детей. Всю зиму по ним лазят дети, забираются на крышу. Взрослые руками приводят механизмы в движение. Я видел, как вагон с детьми сошел с прогнивших рельс и перевернулся. У карусели с конями обрушилась железная крыша под тяжестью снега. Из земли торчат провода, и никто не знает, подключены они или нет. Аттракционы огорожены заборчиком высотой до колена, разве это остановит детей?
С наступлением лета в парк заехали другие предприниматели. Они сгружают старые конструкции в кучи и возводят рядом новые. Об уборке территории речь не идет. Это просто варварство. У нас был такой хороший парк, а теперь там бесчинствуют предприниматели при полном попустительстве администрации.
Я и другие жители требуем вывезти старые аттракционы из парка. С предпринимателей, кому принадлежит это имущество, взыскать штраф.
Прикладываю набор фотографий. Обратите внимание на смену времен года. Фотографии охватывают осень, зиму и весну.
-
Clojure.spec
Это вторая глава предполагаемой книги по Кложе на русском языке. См. первую главу про веб-разработку.
Содержание
- Типы и классы
- Основы spec
- Спеки-коллекции
- Вывод значений
- Спеки-перечисления
- Продвинутые техники
- Логические пути
- Анализ ошибок
- Понятные сообщения об ошибках
- Парсинг
- Разбор Clojure-кода (теория)
- Спецификация функций
- Переиспользование спек
- Дополнения к spec (обзор)
- Будущее спеки
- Итог
В этой главе мы рассмотрим
clojure.spec
– библиотеку для проверки данных в Clojure. Это особенная библиотека, поэтому уделим пристальное внимание.Внимание! Вы читаете черновик к книге “Clojure на производстве”. Для книги я переписывал его много раз, но в блоге осталась старая версия. Здесь она для истории, а вам я рекомендую купить книжку.
Spec это сокращение от specification, т.е. спецификация, описание. В общих словах, это набор функций и макросов, чтобы схематично описывать структуры данных. Например, из каких ключей состоит словарь и каких типов его значения. Такое описание называют спецификацией, или сокращенно спекой.
Особые функции принимают спеку, данные и проверяют, подходят ли данные под спеку. Если нет, то возвращают отчет: в каком узле данных произошла ошибка и почему.
Spec входит в стандартную поставку Clojure начиная с версии 1.9. Полное имя модуля
clojure.spec.alpha
. Пусть вас не смущает частичкаalpha
на конце имени. Она осталась по историческим причинам.Появление spec стало важной вехой в развитии Clojure. Ключевое свойство spec в том, что она фундаментальна. Валидация данных это всего лишь малая часть ее возможностей. Spec не только проверяет данные, но и преобразует и анализирует их. Например, на spec легко написать преобразование данных или парсер.
Технически spec основана на абстракциях, которые предлагает Clojure. Формально это обычная библиотека. Но абстракции spec оказались настолько мощны, что Clojure переиспользует их в работе. Начиная с 1.10, Clojure анализирует собственный код с помощью spec. Так проекты дополняют друг друга.
Мы начнем описание spec с валидации данных. Но прежде чем браться за техническую часть, разберемся с теорией. Как между собой связаны классы, типы и валидация.
-
Харассмент
У всех на уме сплошной харассмент. А задумывались ли вы, откуда взялся термин? В Википедии наваляли статьи на шести языках, а насчет происхождения — ни слова. Тем интересней узнать про термин подробнее, ведь пришел он из области, которая не имеет ничего общего с отношениями.
В корейском языке слово “харрас” означает раздражать, отвлекать, надоедать. Этот термин активно употребляли игроки в первый Старкрафт. На их жаргоне харрасом называют раннюю атаку на базу противника одним-двумя юнитами.
Конечно, уничтожить базу противника столь малыми войсками невозможно. Но цель харраса в том, чтобы отвлечь внимание противника от основных действий. Например, отбиваясь от харраса, противник забыл построить важное здание или потратил ресурсы на войска, хотя мог бы на развитие.
Еще во время харраса пытаются убить рабочих. Число рабочих критично на ранней стадии игры. Бывает, что после потери большей части рабов профессиональные игроки выходят, не дожидаясь формального поражения.
Любопытно, что ни в английском, ни в русском языке не нашлось подходящего синонима. Английские комментаторы банально переняли иностранное слово. Jaedong is going to harass his opponent with six lings. What a successful harassment it has been! Потом термин перекочевал в русский как что-то само собой разумеющееся.
Каждый раз, когда слышу про харассмент, представляю шестой пул и шесть лингов, бегущих на базу к противнику. Я так делал много раз. Ох, как подгорало у соперников!