-
Антисемитизм
Советский Союз, при всем его равенстве и братстве, был антисемитским государством. Еще в раннем детстве я заметил, что взрослые подмечают национальность там, где в этом нет смысла. Например, в передаче “Что? Где? Когда?” крупье обращается к условному господину Шпильману, и все такие — о, еврей. С таинственной полуулыбкой, как будто раскрыли шпиона. Или в титрах: продюсер Кацман. Ага, вот этот парень.
Помню, прочитал фантастический рассказ “Песок” о космонавтах, которые застряли на планете-пустыне. Одного из героев звали Шапиро. Я пытался пересказать сюжет бабушке, но она без конца перебивала меня словами “Шапиро это еврей, это еврейская фамилия”.
Я понятия не имел, как определяют еврея. В какой-то момент я думал, что еврей — это любой мужчина в костюме, очках и с щетиной, и что они настолько особенные, что бывают только в телевизоре.
В великой державе с равными возможностями страдали не только евреи, но и представители всех национальных меньшинств. Вспомним, как основатели Яндекса не поступили в МГУ. У одного еврейские корни, у второго казахские. Значит, на образование высшего ранга претендовать вы не можете.
С годами советские наследие выветрилось из родителей, и больше про евреев я не слышал. Как хорошо, что сегодня не говорят “еврей” при виде человека с щетиной и горбинкой на носу. Ну, кроме совсем больных личностей, малый процент которых всегда найдется. Как здорово, что нынешние дети даже не поймут, о чем речь.
-
Тесты в Clojure (фрагмент главы)
В последней главе мы поговорим о тестировании приложений. Читатель узнает, что такое тесты и каких типов они бывают. Мы рассмотрим методы тестирования и хорошие практики. Постараемся избежать лишней сложности: не будем злоупотреблять терминами вроде TDD и BDT. Покажем, что в мире Clojure легко писать и поддерживать тесты.
Содержание
-
Сохранение страницы
Вот что меня удивляет. Хром и браузеры на WebKit захватили весь мир, фирмы выбрасывают старые движки, Мейл.ру и Яндексы ставят офисному планктону хромовые поделки. И до сих пор не решена банальная проблема. Я хочу сохранить страницу на диск, а потом открыть ее и увидеть в том же виде.
Простое сохранение страницы работает не всегда. Вот прямо сейчас проделайте следующее. У вас же Хром, да? Откройте любой проект на Гитхабе, хоть этот, например:
Сохраните страницу на диск (Ctrl/Command + S). Теперь откройте html-файл. Как оно?
Ужасно. Причина в том, что Хром ограничивает доступ к локальному ресурсу из-за CORS-ограничений. Безопасность и все такое, но в итоге я не вижу страницу. То же самое в любом Хромо-браузере: Опере, Edge, поделки от русских фирм. И даже в Сафари. А вот Firefox и, внезапно, Internet Explorer показывают нормально.
С сохранением страниц всегда была беда, сколько помню. Какие-то браузеры сохраняют исходный код страницы. Например, если это SPA, то вы ничего не увидите. Другие не скачивают стили и ресурсы. Если я хочу сохранить страницу, чтобы прочесть ее в самолете или поезде, то нет никакой гарантии, что все пройдет нормально. Открыл в поезде ноут, а там голый HTML. Извини друг, просто это небезопасно.
Другая странность — браузеры до сих пор не могут сделать скриншот страницы. Я в курсе про тысячи расширений для Хрома, но вопрос все равно открыт. На техническом уровне любой браузер может выплюнуть картинку. Я писал либу для протокола WebDriver, и это работает даже для Phantom.js. Послал запрос, получил PNG в Base64. Зачем плодить расширения там, где все и так есть, непонятно.
Если запинить вкладку в браузере, то рано или поздно она выпадет из памяти на диск. Переключитесь на нее, когда нет интернета, и увидите белый экран. По сути, есть только один надежный способ сохранить страницу — напечатать ее в PDF. Недостаток в том, что печатная версия иногда отличается в худшую сторону от оригинала. Так и живем.
-
Что там с книгой?
На этих выходных я выступал на конференции в Москве. Было очень приятно встретить людей, которых долгое время видел только на аватаре. Среди прочего несколько человек благодарили про книгу по Кложе, которую я пишу и выкладываю в блоге. Интересовались судьбой проекта, сроками. Я подробно отвечал и хочу, чтобы вы тоже знали.
Черновик книги почти закончен: написано шесть глав из планируемых семи. Последняя как раз на середине. Я должен был закончить ее примерно к этому времени, но попала вожжа под хвост: увлекся параллельной темой, завтра-завтра, и процесс заглох. Спасибо всем, кто подошел и сказал про книгу. Так я понял, что ее ждут, и продолжил писать на следующий же день после конференции.
Параллельно приступаю к поиску издательства. Это новая для меня вещь, потому что бумажные книги я еще не издавал. Электронная на LeanPub не в счет. Там всего лишь заполнил форму, приложил файл и прошел минимальные проверки. С бумажной книгой все по-другому: долго, дорого и изматывающе.
Книжные издательства отвечают в течение месяца, а чаще всего вообще не отвечают. Я уже написал два письма месяц назад и не получил ответа. Но вообще я их не виню: слышал от одного человека, что издательства просто заваливают рукописями. Сейчас каждый пятый что-то пишет и жаждет опубликовать. Для издательства выбрать книгу это как нам нанять фронтендера: все кричат, что они Д’Артаньяны, а на деле… вы поняли.
Намереваюсь выпустить книгу только в бумажном варианте. Не потому, что опасаюсь пиратства — время, которое я на нее потратил, я не окуплю, даже если книга пойдет за 5000 рублей за экземпляр. Просто хочу, чтобы книгу прочитали. Если вы скачаете ее на диск в виде файла, пусть даже за деньги, то, наверное, забросите в папку “прочесть позже”, и так она останется там навсегда. Давайте честно, когда в последний раз вы прочли книгу от корки до корки с монитора? Я бумажные-то еле-еле дочитываю, а уж сколько скачал pdf-ок…
Спрашивали, как отблагодарить за книгу, предлагали завести патреон. Кто-то даже сказал — не писать же тебе пустое спасибо, давай хоть денег дам. Все в точности наоборот. Зачем мне, главе семьи, сотруднику швейцарской фирмы, ваши двести рублей? Ну, наберется их на три тысячи, и что? Гораздо лучше, если вы пришлете абзац текста о том, как вам помогла книга. Что в ней хорошего, где косяки, опечатки. Одно такое письмо даст заряд для новой главы или даже книги. Так что все это не про деньги. Мотивация, вот что важно.
Ближе к выходу книги я бы хотел собрать отзывы в отдельном посте и ссылаться на него. Отзывы станут основной для будущей промо-страницы. Возможно, они пригодятся мне, когда буду разговаривать с издательством.
План такой: в ближайшие три недели заканчиваю главу и публикую ее в блоге. Затем сажусь за чистовик: все перечитываю, исправляю опечатки, нелепые обороты, неудачные примеры заменяю чем-то получше. Первые главы отличаются от последних по стилю, это надо порешать. Знаю пару мест, где не помешала бы диаграмма. Это будет чистовая версия, доступная только на бумаге.
Параллельно ищу и договариваюсь с издательством. Если ничего не выйдет, отпечатаю за свой счет сто экземпляров и продам по себестоимости. Основная цель, конечно, перевести книгу на английский язык: западная аудитория все же больше русской на порядок-два. Поэтому ваши отзывы так важны: даже если вы обнаружили неточность в напечатанной версии, есть шанс, что я исправлю это в переводе.
Кто-то из гостей конференции посетовал, что книгу заканчивать рано, еще столько всего не сказано. Но я ведь не говорил, что после этой книги больше не буду писать про Кложу! В моей тетради записан конспект, и все, что я пока написал (около 300 страниц), покрывает его где-то на четверть. Так что тема для материала есть, была бы только воля все это сделать.
Коротко напомню, что это за книга и почему следует ее купить. Я пишу про Кложу — замечательный язык программирования. От него получаешь почти физическое удовольствие: язык устроен так, что решать сложные задачи становится проще. Он меняет уклад мышления, будет трудно вернуться к обычным императивным языкам.
В своей книге я касаюсь нескольких тем. Я не ставлю цель покрыть весь язык — это уже сделали до меня. В этом и отличие: я беру узкую тему и копаю так глубоко, насколько это возможно. В типичной книге про исключения написана страничка. У меня это глава. Про системы вообще никто не пишет. У меня про это 55 страниц. И все — практика, практика, практика. Все опробовано на себе: работает или нет, и когда, и при каких условиях, и почему так, а не иначе, и что там сидит под крышкой. Аналогов я не видел.
Вот как обстоят дела с книгой. Писал это в том числе и для себя, чтобы лучше понимать ситуацию. Еще раз спасибо всем, кто подошел на конференции, и думаю, что все-таки выйдет!
-
Доклад Make Time
На прошлом митапе рассказал о книге Make Time. Это о том, как находить время на личные проекты без ущерба для работы и семьи. Перечислил практики, которые удалось закрепить. Горячо рекомендую купить и прочесть эту книжку. Другие клевые книжки смотрите на книжной полке.
-
Системы в Clojure
В этой главе мы поговорим о системах. Рассмотрим, как составить проект из отдельных частей и заставить их работать вместе.
Содержание
- Подробнее о системе
- Зависимости
- Преимущества
- Подготовка к обзору
- База данных
- Docker
- Mount
- Component
- Integrant
- Заключение
Понятие системы тесно связано с конфигурацией, которую мы подробно рассмотрели недавно. На этапе черновика конфигурация и системы составляли одну главу, но со временем стало ясно, что это отдельные темы. Причина кроется не столько в объеме материала, сколько в семантике. Конфигурация и система это не одно и то же.
Внимание! Вы читаете черновик к книге “Clojure на производстве”. Для книги я переписывал его много раз, но в блоге осталась старая версия. Здесь она для истории, а вам я рекомендую купить книжку.
Конфигурация учит тому, как получить параметры из внешнего мира. Как выстроить этот процесс согласно производству и пожеланиям команды. Система означает внутреннее устройство программы. Это набор компонентов с логическими связями и иерархией.
Система зависит от конфигурации, но не строго один к одному. Для одной и той же конфигурации бывают разные системы и наоборот. Главное отличие в следующем: конфигурация отвечает на вопрос как получить параметры, а система знает, как ими распорядиться.
-
Слабые фильмы
Уже пятый раз со мной такое. Читаю на условной Медузе про нашумевший фильм, иду, и… фильм оказывается удивительно слабым. Кинокритик разливался соловьем, а фильм затянут, конфликт примитивен, диалоги и сцены натянуты. Выхожу из зала с разочарованием.
Это случается все чаще и чаще. То ли я постарел, то ли ожидаю слишком многого. Я далеко не киноман — появляюсь в кинотеатре раз в три месяца. Мои чувства не притуплены бесконечными сериалами и фильмами. Может, в этом и проблема, как ни парадоксально?
Я вспомнил фильмы, от которых многого ожидал, но в итоге они оказались слабыми.
Магазинные воришки
Фильм про семью бедняков в Японии. Живут в нищите, зато дружно. Родители учат детей воровать в магазинах. Поначалу приятно: японский быт, ужин дошираками в тесном кругу. Семья подбирает девочку, с которой плохо обращаются, и ее принимают как дочь. Но потом слишком затянуто, ноль действия.
-
Плохие проекты
Поговорим о плохих проектах. Как понять, что проект плохой, а команда не профессиональна? Я собрал несколько признаков, которые прямо или косвенно говорят об этом. С каждым из них я борюсь много лет и вот решил написать. Если вы узнали свою команду, на вашем месте я бы встревожился.
Проект не подготовлен к старту
К сожалению, не каждый проект готов к старту после того, как вы скачали его код. И редко когда в проекте есть скрипт или Make-файл, который подготовит все нужное. Хотя технически это возможно.
Например, в условный Makefile можно засунуть установку виртуального окружения, утилит и пакетов, перенос файлов, скачивание ресурсов с сервера… но почти никто этого не делает. Приходится долбить коллег тупыми вопросами. Где взять этот файлик? Почему не ставится эта библиотека?
Причина кроется в лени и неуважении к коллегам. Если ты проделал рутинную подготовку, то почему бы не скопировать команды терминала в файл? Разве не очевидно, что следующий разработчик пойдет по тем же граблям?
В каждом проекте я держу Makefile и наполняю его разными задачами. Это база знаний о том, что можно сделать с проектом. Иногда коллега что-то спрашивает, а я отвечаю с именем Make-задачи, которую нужно запустить.
Если проект стартует только после часовой ручной подготовки, это плохой проект. Плох не код, а команда, которая его поддерживает. У них не принято думать об удобстве коллег, что критично в повседневной работе.
-
Слайды
Я смонтировал около ста выступлений (раз, два, три) и подметил недостаток, про который мало кто говорит.
Вот закончил человек презентацию. Спасибо, вопросы? Кто-то задал, уточняет детали. Выступающий: это же было на третьем слайде! И давай мотать в самое начало с тридцать пятого слайда на третий.
Так делать не надо. Во-первых, если вопрос по существу и зритель следил за мыслью, показывать слайд опять нет смысла. Вы уже показывали его, но что-то осталось непонятно. Скорей всего это вы объяснили плохо. Не нужно держать зрителя за дурака и тыкать ему тот же слайд. Правильно объяснить другими примерами и образами.
Во-вторых, во время перемотки образуется дурацкая пауза. Нажать двадцать раз на кнопку не так просто, и секунд пять-десять зрители ждут. Это мертвая зона, от которой становится неловко. Всех, кто выходит на сцену, учат — пауз быть не должно, особенно технических. Вы со своей презентацией не исключение.
Возьмите на заметку: не мотать слайды из конца в конец.
-
Прослушка
У нас дома телевизор, но мы пользуемся им как панелью. Антенны нет, подключаю ноут по HDMI и телек виден как второй монитор. Недавно обнаружил, что девайс продвинутый, с магазином приложений. Поставил Ютуб, зашел под учеткой и теперь смотрю без ноута.
Вчера включал дочке мульты. На главной Ютуба рекомендованные видео. Обычно это советские мультики вперемешку с тем, что я слушаю на работе. То есть Цветик-Семицветик — Korn — Кошкин дом — Enigma и так далее.
Но то, что я вчера увидел, заставило насторожиться. Ютуб предлагал к просмотру “Самогонщики” Гайдая. Помните, комедийная новелла с забавной троицей? С обложки смотрят Моргунов, Никулин и Вицин с характерными физиономиями.
Я стал ломать голову, с какого перепугу Гугл рекомендует что-то подобное, и не находил ответа. Я не смотрел ничего из советского кинематографа лет пять. Не гуглил биографии актеров. Мои интересы полностью ортогональны “Самогонщикам” и всему творческому пласту того времени.
А потом догадался, и стало не по себе.
Днем раньше я ехал в поезде. Ездили с сыном в деревню к бабушке. Поезд был фирменный, сидели в купе. Над входом в купе висел телевизор, по которому крутили “приключения Шурика”. В поездке я открывал ноут и подключал хот-спот. Интересное совпадение — вчера ты сидел возле телевизора с “Шуриком”, а сегодня Ютуб предлагает “Самогонщиков”.
Если это так, остается одно объяснение. Устройства слушают шум вокруг нас и отправляют в сервисы Гугла. Система распознает музыку, и корректирует веса рекомендаций.
Конечно, это не новость. Все большие компании хоть раз да были замечены в сборе данных без нашего ведома. На месте фирмы я бы тоже их собирал. Это ценная информация, с какой стати отказываться?
Но это первый раз, когда я столкнулся с такой сложной схемой. Передать шум поезда на сервер, распознать “Операцию Ы” и перестроить рекомендации – это все-таки сильно. У меня нет претензий к Гуглу: никто не умер, я сам на все подписался. Только удивление и тема для размышлений.
Кстати, именно поэтому я вырезал в веб-версии Ютуба блоки с рекомендациями. Это делается ад-блоком: навел курсор на регион и добавляешь селектор в черный список. Я не могу жить с этими блоками. Они начисто лишают хоть какой-то приватности, выдают все до последней интимности.
Однажды я посмотрел выступление Петросяна, которое запомнил из детства. Блок наводнился Степаненко, Маменко, бабками из Кривого зеркала и всей этой публикой. Не отмоешься!
Я полагаю, что системы рекомендации чувствительны к резкой смене контента. Возможно, это сделано специально. Может быть, для системы это значит, что за комп сел другой человек. Никто же не переключает учетку на айпаде, которым пользуется вся семья. Если смотрели пять Лунтиков, а потом Петросяна, это значит, что девайс передали другому человеку. И теперь надо рекомендовать не Смешариков, а Степаненко.
А если я не прав, то расскажите кто знает эту кухню.