-
Прослушка
У нас дома телевизор, но мы пользуемся им как панелью. Антенны нет, подключаю ноут по HDMI и телек виден как второй монитор. Недавно обнаружил, что девайс продвинутый, с магазином приложений. Поставил Ютуб, зашел под учеткой и теперь смотрю без ноута.
Вчера включал дочке мульты. На главной Ютуба рекомендованные видео. Обычно это советские мультики вперемешку с тем, что я слушаю на работе. То есть Цветик-Семицветик — Korn — Кошкин дом — Enigma и так далее.
Но то, что я вчера увидел, заставило насторожиться. Ютуб предлагал к просмотру “Самогонщики” Гайдая. Помните, комедийная новелла с забавной троицей? С обложки смотрят Моргунов, Никулин и Вицин с характерными физиономиями.
Я стал ломать голову, с какого перепугу Гугл рекомендует что-то подобное, и не находил ответа. Я не смотрел ничего из советского кинематографа лет пять. Не гуглил биографии актеров. Мои интересы полностью ортогональны “Самогонщикам” и всему творческому пласту того времени.
А потом догадался, и стало не по себе.
Днем раньше я ехал в поезде. Ездили с сыном в деревню к бабушке. Поезд был фирменный, сидели в купе. Над входом в купе висел телевизор, по которому крутили “приключения Шурика”. В поездке я открывал ноут и подключал хот-спот. Интересное совпадение — вчера ты сидел возле телевизора с “Шуриком”, а сегодня Ютуб предлагает “Самогонщиков”.
Если это так, остается одно объяснение. Устройства слушают шум вокруг нас и отправляют в сервисы Гугла. Система распознает музыку, и корректирует веса рекомендаций.
Конечно, это не новость. Все большие компании хоть раз да были замечены в сборе данных без нашего ведома. На месте фирмы я бы тоже их собирал. Это ценная информация, с какой стати отказываться?
Но это первый раз, когда я столкнулся с такой сложной схемой. Передать шум поезда на сервер, распознать “Операцию Ы” и перестроить рекомендации – это все-таки сильно. У меня нет претензий к Гуглу: никто не умер, я сам на все подписался. Только удивление и тема для размышлений.
Кстати, именно поэтому я вырезал в веб-версии Ютуба блоки с рекомендациями. Это делается ад-блоком: навел курсор на регион и добавляешь селектор в черный список. Я не могу жить с этими блоками. Они начисто лишают хоть какой-то приватности, выдают все до последней интимности.
Однажды я посмотрел выступление Петросяна, которое запомнил из детства. Блок наводнился Степаненко, Маменко, бабками из Кривого зеркала и всей этой публикой. Не отмоешься!
Я полагаю, что системы рекомендации чувствительны к резкой смене контента. Возможно, это сделано специально. Может быть, для системы это значит, что за комп сел другой человек. Никто же не переключает учетку на айпаде, которым пользуется вся семья. Если смотрели пять Лунтиков, а потом Петросяна, это значит, что девайс передали другому человеку. И теперь надо рекомендовать не Смешариков, а Степаненко.
А если я не прав, то расскажите кто знает эту кухню.
-
Конфигурация
Содержание
- Постановка проблемы
- Семантика
- Цикл конфигурации
- Ошибки конфигурации
- Практика
- Подробнее о переменных среды
- Переменные среды в 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 с валидации данных. Но прежде чем браться за техническую часть, разберемся с теорией. Как между собой связаны классы, типы и валидация.