Tom Adler’s blog

добрые китайские почтальоны

одна из приятных функций dmarc — хорошая обратная связь. Если его правильно настроить, серверы-получатели писем будут присылать отчёты о том, насколько успешно эти письма проходят проверки. Умные инструменты типа dmarcian могут эти отчёты агрегировать и показывать разные красивые картинки

на одной из таких отчётных картинок я вижу, что приблизительно половина писем с моего домена не проходит проверки. Но это не страшно — другая картинка показывает, что все такие письма отправлены из Китая

, , ,

Nokia и WebP

работа в большой компании иногда проявляет себя с неожиданной стороны. Вот, например, недавно я начал спрашивать про уровень внедрения у нас нового формата изображений WebP, и узнал, что наши юристы запрещают его использовать. Дело в том, что WebP основан на одном из элементов видеоформата VP8, а Nokia настаивает на том, что VP8 нарушает её патенты. Если бы мы при этом его использовали, позиции Nokia в суде по этому вопросу могли бы пошатнуться. Поэтому пока что мы продолжаем применять старые добрые PNG/JPEG

внезапно из этого поста я извлёк больше пользы, чем обычное удовольствие от публикации. Там же в википедии написано, что немецкий суд освободил VP8 от патентных претензий нокии в августе прошлого года. Вполне возможно, что запрет на WebM пришёл от наших юристов до этого события, и что теперь мы сможем его использовать. Нужно поинтересоваться!

,

https везде, ага

некоторое время назад я вдохновился постом «Почему все сайты должны работать по https», и заодно понял, что у меня нет решения проблем централизованной системы центров сертификации, поэтому в конце концов настроил на почти всех своих сайтах https с бесплатными сертификатами от startssl.com. Заодно включил автоматическое перенаправление на https и добавил клёвый заголовок Strict Transport Security. Конечно, отвалится процент пользователей древних систем, не знающих про StartSSL, и процент софта, не умеющего Server Name Indication. Говорят, второй питон к этому тоже относится

однако чего я не ожидал, так этого того, что отвалятся комменты производства IntenseDebate. С одной стороны, когда я их подключал, блог был на простом http. С другой стороны, они до сих пор вообще не предлагают никакой возможности использовать https. Как так можно!? Наверное, буду теперь смотреть в сторону disqus, а то и вообще откажусь от таких комментов: несколько штук в год не стоят хлопот.

, , ,

забавное про цикл for

хочу рассказать про недавний забавный случай на работе. Я поспорил с коллегой по поводу использования итераторов по массивам в сравнении с циклом for. Поводом для этого послужило то, что я считал определённые элементы в маленьком массиве посредством filter(…).length, а он это переделал в for. Аргументы друг друга нас не убедили, и коллега решил вынести это на более широкое обсуждение, и даже приготовил маленькую презентацию и тест.

аргумент коллеги был таков: использование filter приводит к выполнению многих посторонних операций, которые совершенно не нужны для такой простой вещи, как подсчёт определённых элементов. В результате драматически (в 150000 раз) ухудшается производительность, что и демонстрируется вот этим сравнением loop vs filter.

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

шеф выступил в роли арбитра и начал говорить, что с его 15-летним опытом работы программистом что filter, что for читаются одинаково легко. Я возразил, что это обманчивое впечатление, ошибки в for легко не заметить, и предложил проверить, что же именно выводит протестированный код

конечно же, супер-оптимальный for завершался в 150000 раз быстрее потому, что падал с ошибкой в первой же строчке. Когда мы это починили, правильное сравнение loop vs filter показало выигрыш в скорости всего в 10 раз. На наших реальных данных это единицы наносекунд.

я был очень благодарен коллеге и шефу за эту демонстрацию : )

sentry: сбор и анализ ошибок

TL;DR open-source программа Sentry очень помогает собирать, группировать и анализировать ошибки в веб-приложениях и прочих программах

не знаю, как вы, а я до недавнего времени использовал только самые примитивные методы для отслеживания ошибок. Самым первым было «исключение-на-емейл», и наши почтовые ящики нередко взрывались. В нокии мы складывали ошибки в серверные логи и пытались потом их анализировать при помощи Splunk (кстати, для своей задачи это отличный инструмент, рекомендую). А уж сама идея, что можно поймать яваскрипт-исключение в браузере и отправить его на сервер, казалась откровением

по вполне очевидным причинам эти методы работали плохо. Разобраться в списке из пары сотен объектов — сложная задача, а когда ошибок в логах популярного сервиса тысячи и десятки тысяч, руки просто опускаются. К счастью, многие программисты решили, что так быть не должно

в результате сейчас есть больше десятка сервисов, которые выполняют за вас всю рутинную работу и дают удобные инструменты для работы над ошибками. Самый первый и важный этап при этом — группировка одинаковых ошибок — в буквальном смысле уменьшает количество объектов для анализа на десятичные порядки. Например, со ста тысяч событий до ста групп ошибок, и это ещё тяжёлый случай. Из группировки естественно следует и подсчёт размера каждой группы, что даёт некоторое представление о важности каждой ошибки

уже такая группировка может показаться подарком богов, но разработчики не останавливаются на этом, и предоставляют дополнительные удобства. Например, оповещать по почте только о новых группах ошибок. Или автоматически создавать новую задачу в багтрекере. Или отмечать группу ошибок как исправленную, чтобы она не маячила перед глазами, и чтобы список групп можно было напрямую использовать как TODO. Или показывать исторические тренды проявления ошибки. Или фильтровать по разным параметрам типа платформы, браузера, сервера, кластера, или предоставленного самим приложением тега. И всё это почти для любого языка!

а у яваскрипт-приложений есть своя специфика, которая практически блокирует возможность решить проблему с наскока. Например, разные браузеры имеют разный формат сообщений об ошибках. И стек вызовов в них часто выдаётся по-разному. А у эксплорера текст сообщения об ошибке переводится на язык системы. Ну и минификация кода добивает любую возможность анализа

однако всё это — решаемые проблемы. Для единообразного вида стека вызовов есть библиотеки. Межбраузерная и межязыковая группировка тоже вполне достижима. С минификацией же успешно борются source maps

и вот тут поджидает засада. Нам кровь из носу нужна де-минификация. Для неё нужно предоставить source map, а это равносильно предоставлению исходного кода. Не всякий проект согласен открыто выложить свои исходники. А из десятка сервисов только RollBar согласен не требовать source map в открытом доступе, а получить её другим способом. Впрочем, есть ещё один вариант…

конечно, удобно, когда кто-то другой решает за тебя твои проблемы и берёт за это умеренную плату. Но в погоне за сохранностью исходников вполне можно взять на себя часть работы по установке локального сервиса. К счастью, такой сервис есть, и называется он Sentry. Его разработчик не только предоставляет Sentry как готовое SaaS-решение для анализа ошибок, но и делится исходниками с самыми параноидальными

поднять Sentry локально довольно просто, я управился за час. Подключить к коду плагины для отправки сообщений (под общим названием Raven) тоже дело простое. Остаётся только складывать в локальное хранилище source maps для разных билдов и включать в них собственно исходники (в поле sourcesContent). А потом можно откинуться на спинку кресла и наслаждаться : )

sentry interface screenshot

впрочем, у других сервисов часто бывают бесплатные тарифы с ограниченным количеством ошибок, которые могут кому-то подойти, так что вот вам список: ErrorCeption, JSLogger, QBaka, Muscula, TrackJS, BugSense, RayGun, BugSnag, RollBar, Errorify, AirBrake

, ,