• А пусть тесты сами себя и поддерживают

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

      Как обычно выглядят тесты?


      Очень схематично, каждый юнит-тест обычно состоит из следующих шагов:

      1. Инициализации входных данных;
      2. Выполнения бизнес-логики и получения результата;
      3. Сравнения результата с эталоном.

      Входные и выходные данные зачастую находятся в самом коде; когда изменения кода привносят ожидаемые изменения в выходных данных, эталонные результаты приходится править вручную. В некоторых случаях, когда данные для теста объемны, их выносят в отдельные файлы, но поддержка эталонных данных, а так же логика сравнения остается на плечах разработчика.

      Но ведь все это можно унифицировать!

      Читать дальше →
    • Serge — решение для непрерывной локализации от Evernote

        Сегодня я хочу рассказать вам о проекте, над которым я работал (и продолжаю работать) в Evernote с 2008 года, и которое несколько дней назад стало Свободным ПО.



        Для многих разработчиков локализация ассоциируется с дополнительным пластом проблем: как поддерживать локализованные ресурсы в актуальном состоянии? А что если языков не 2-3, а 20-30? Как вовремя отправлять новые строки на перевод? А что если во время перевода разработка ушла вперед, и каких-то строк уже нет, а есть новые? Как мержить присланные переводчиками файлы ресурсов? Не секрет, что из-за этого многие просто забивают на локализацию или стараются отложить ее на потом.

        Сейчас у Evernote более 150 млн пользователей по всему миру, более 70% этих пользователей находятся за пределами США, каждый месяц мы переводим по 15 тыс. новых слов в 40 с лишним проектах на более чем 26 языков, и выпускаем новые релизы наших продуктов одновременно на всех языках. При этом на техническую поддержку всей этой системы требуется один человек, и то изредка.

        Как нам это удается?

        Читать дальше →
      • История реверс-инжиниринга одного пушистого зверька



          Тихим утром третьего января, когда Москва уже дремала после новогодних праздников, в нашей квартире раздался звонок в дверь. Почта наконец-то доставила посылку с новогодними подарками, заказанными на Амазоне. Среди прочего в ней находился и подарок для сына — электронный питомец Furby. Покупка его была, в общем-то импульсной. Игрушка значилась в бестселлерах новогоднего сезона и стоила относительно недорого. В сортах Furby я не разбирался, но когда-то давно что-то позитивное об игрушке слышал.

          Сынишку, в силу его годовалого возраста, подарок не сильно впечатлил, а позволять бросать сложное электронное устройство на пол и отрывать этому устройству уши мне было жалко, и все шло к тому, чтобы убрать подарок на полку до лучших времен, однако мой взгляд пал на одну надпись на красочной упаковке…
          Читать дальше →
        • Интервалометр для SONY NEX-5 за 20 минут и $0

            Это пост я посвящаю всем тем, кто паял Covox для БК.

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

            Сначала — видео конечного результата:


            А теперь подробности:
            Читать дальше →
          • Визуализация разных дисков в файловом менеджере или Не совсем консольный FAR

              Была у меня давнишняя идея, как расширить возможности интерфейса файловых менеджеров, улучшив визуализацию разных дисков, разных типов дисков и определенных папок. И вот теперь ее удалось реализовать.

              Скриншот для затравки:

              Читать дальше →
            • Интерфейс выбора цвета

                В недавно вышедшем Photoshop CS5 к закладкам Color и Swatches (1) и диалогу (2) добавился так называемый HUD Color Picker (3):

                Средства для работы с цветом в Adobe Photoshop

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

                Разумеется, тут есть над чем работать. Собственно, наличие нескольких разных палитр/диалогов в самом Photoshop намекает на то, что там не все гладко и продуманно. Ниже я хочу показать пример интерфейса работы с цветом, который мог бы во многом заменить все эти разрозненные контролы и даже привнести что-то новое.

                Вот как это выглядит:

                Цветовое колесо

                А вот как это работает
              • Добавляем свои поисковые системы

                  Что мне нравится в Google Chrome, так это возможность очень удобной работы с разными поисковыми системами: ввел ключевое слово, пробел и печатаешь запрос. Однако этой функцией пользуются на 100% далеко не все.

                  Сегодня я хочу рассказать, как добавлять свои «поисковые системы» (это, на самом деле, могут быть не только поисковые системы) и тем самым повысить производительность работы в Интернете.

                  4.75 КБ

                  Где это все настраивается? Смотрим картинку:
                  Читать дальше →
                • Как сделать сайт более iPhone-совместимым за 5 шагов

                    Тот факт, что iPhone предлагает наиболее развитый мобильный браузер среди мобильных платформ, пожалуй, ни у кого не вызовет сомнений. Однако не все знают, что довольно небольшими усилиями можно сайт сделать еще более дружественным к тем, кто смотрят его на iPhone или iPod Touch.

                    Ниже предлагаются простые 5 шагов, с которых можно начать, на примере сайта WHOIS Digger.

                    Шаг 1. Аналог favicon.ico

                    Когда пользователь создает ссылку на ваш сайт в виде иконки в SpringBoard, iPhone автоматически формирует картинку из скриншота страницы. В результате почти всегда получается неразборчивая каша, которая на гордое звание «иконки для iPhone» никак не тянет. Пропишите этот тег в заголовке страницы:

                    <link rel="apple-touch-icon" href="res/iphone_icon.png" />

                    и добавьте соответствующую картинку res/iphone_icon.png размером 57х57 пикселов. iPhone сам добавит скругленные углы и полукруглый блик, сделав вашу иконку похожей на остальные.

                    Вот так выглядит исходная картинка и иконка на рабочем столе iPhone:


                    Читать дальше →
                  • WHOIS Digger — Сервис проверки доменов с нестандартным интерфейсом

                      Как обычно выглядит сервис проверки доменного имени на занятость на разных сайтах регистраторов? Все очень скучно и банально: вы вводите имя домена, нажимаете на кнопку, страница перегружается со всеми потрохами, ресурсами и скриптами, только для того чтобы вы увидели, что доменное имя занято. Теперь надо вернуться назад, ввести новое имя и т.д. Где-то интерфейс чуть получше, где-то чуть похуже, но проблема остается: удобного инструмента для ведения «мозгового штурма» по выбору доменного имени я не нашел.

                      Поэтому сел как-то на выходных и сделал для себя «WHOIS Digger», который теперь вынес в онлайн.

                      Вот как он выглядит:

                      Интерфейс WHOIS Digger


                      Чем же он удобен?
                      Читать дальше →
                    • GIZMO! или пятничный фильм

                        Самое время для пятничного познавательного видео, %username%!



                        Не могу не поделиться роскошным фильмом «Gizmo!» (IMDB), который представляет собой подборку редких документальных кадров необычных и причудливых изобретений человечества начала-середины прошлого века. Вы все еще думаете, что такое явление как паркур — молодая забава, придуманная французом Давидом Беллем, как говорит нам Википедия? Хотите увидеть, как выглядел прототип робопылесоса Roomba в пятидесятых? Все это и многие другие результаты работы неуемной человеческой фантазии вы найдете в этом фильме.

                        Устраивайтесь в кресле поудобнее и приятного просмотра!
                      • TreeBrowser (браузер без табов) + демо-приложение

                          Решил я поучаствовать в Mozilla Labs Design Challenge Summer 2009, ибо уж больно вкусная тема конкурса — «Что можно предложить на замену табам в браузере». Для начала — видео:



                          Под катом — подробное описание идеи и скриншоты.
                          Читать дальше →
                        • Идея: функция форматирования для удобной локализации строк

                            Проблема: при переводе приложений на другие языки (чаще мы сталкиваемся с русификацией англоязычных продуктов) чаще всего страдает поддержка множественных форм чисел. Например, «1 заметка, 2 заметки, 5 заметки» или якобы универсальное «1 file(s)» и т.д. Дело в том, что во всех языках программирования обычно дело не идет дальше варианта sprintf() или какого-то шаблонизатора, а поддержку множественных форм надо каждый раз программировать ручками: если N = 1, то «1 заметка», иначе «N заметок». А делать это каждый раз лениво. Эту задачу частично решает фреймворк gettext, где есть понятие нескольких вариантов локализованной строки, но это не сильно облегчает жизнь, ибо в одной строке, показываемой пользователю, может быть несколько частей, зависящих от чисел («Найдено 23 файла в 3 папках»), а значит куски строк надо потом все равно склеивать между собой.

                            Поэтому мне пришла следующая идея: почему бы не придумать какой-то общий формат, микроязык (по аналогии с вполне устоявшимся форматом функции format() или sprintf()), чтобы адресовать эту проблему и упростить в дальнейшем написание локализуемого кода.

                            Как известно, в разных языках разное количество множественных форм числа. В английском их два («1 file», «many files»). В русском — три («1 файл», «2 файла», «много файлов»). В арабском их вообще, как говорит нам Pootle, аж 6 штук. Поэтому нам нужно иметь возможность задавать прямо в строке набор из нескольких подстрок и параметр, от которого зависит выбор этих подстрок.

                            Предлагаемый формат подстроки с множественными вариантами:
                            {%COUNTER%|FORM0|FORM1|FORM2[|FORM3][|FORM4][|...]}

                            где
                            %COUNTER% — это некое имя переменной, которое может иметь значения [0,1,2,3,...]
                            FORM0 — это версия строки для значения COUNTER = 0 (это особый случай, обычно требующий отдельного сообщения)
                            FORM1, FORM2 и т.д. — это альтернативные варианты текста для каждой множественной формы данного языка; для английского это будет два варианта, для русского — три и т.д.

                            Пример на английском языке:
                            {%F%|No files|1 file|%F% files} found in {%D%|0 folders|1 folder|%D% folders}.

                            Это даст нам следующие конечные варианты строки на выходе при подстановке различных значений %F% и %D%:
                            %F% = 0, %D% = 1 => No files found in 1 folder.
                            %F% = 1, %D% = 2 => 1 file found in 2 folders.

                            Тот же пример строки, переведенной на русский:
                            {%F%|Не найдено файлов|1 файл найден|%F% файла найдено|%F% файлов найдено} в {%D%|0 папках|1 папке|%D% папках|%D% папках}.

                            Это даст нам следующие конечные варианты строки на выходе при подстановке различных значений %F% и %D%:
                            %F% = 0, %D% = 1 => Не найдено файлов в 1 папке.
                            %F% = 1, %D% = 2 => 1 файл найден в 2 папках.

                            Заметьте, что получив для перевода всю строку, содержащую несколько таких вариантных включений, переводчику а) легче понять, в каком контексте используются все части строки и б) у него есть возможность для маневров, чтобы в итоге строка звучала лучше.

                            Было бы здорово иметь реализацию подобного микроязыка на разных языках программирования.

                            Надеюсь, кому-нибудь идея пригодится.

                            UPD: Результат не заставил себя долго ждать: в данном топике хабраюзер webdew делится реализацией функции на C#, за что ему большое спасибо.
                          • Новогодний подарок — платная годовая подписка на Evernote


                              Хочу присоединиться к новогодней раздаче слонов (pun intended).

                              У меня есть три подарочных годовых подписки на расширенный сервис Evernote (обычно годовая подписка стоит $45).

                              Расширенная подписка дает такие преимущества как:
                              • возможность хранить и синхронизировать абсолютно любые файлы;
                              • 500 Мб объем новых заметок в месяц вместо бесплатных 40;
                              • Безопасную передачу всех данных при синхронизации через SSL;
                              • Приоритетное распознавание текста в фотографиях;
                              • Приоритетную техподдержку.

                              В общем, вполне наваристо.

                              Правила получения подарка просты — напишите здесь в комментариях как вы используете Evernote и почему платная подписка нужна именно вам (можете написать не про себя, а про знакомых или про вашу любимую бабушку, если ей нужен платный аккаунт). В конце дня я выберу три наиболее понравившихся комментария (оригинальных/трогательных/развернутых/необычных/etc.) и отпишу авторам этих комментариев приватным сообщением, чтобы узнать адрес электронной почты, на который выслать подарочный сертификат.

                              С наступающим!

                              UPD: Раздача слонов успешно завершена.
                            • Прощай, любимая ВДНХ!

                                Несколько лет не был на ВДНХ и решил сегодня прогуляться, посмотреть, что там и как. Была смутная надежда, что парк советской истории за прошедшие лет десять все-таки стряхнет с себя барахольщиков и начнет возрождаться. Но то, что я там увидел, меня поразило:

                                22.07 КБ
                                Они убили Кенни!
                              • RFID от Tikitag — непаханное поле для самоделкиных

                                  Интересная новость обнаружилась на Engadget:

                                  Компания Tikitag (подразделение Alcatel-Lucent) привлекла к себе внимание на конференции DemoFall, показав RFID-набор (ридер и RFID-метки), которые, как заявлено, должны будут появиться в продаже в течение месяца по весьма демократичной цене.

                                  59.23 КБ

                                  Читать дальше →
                                • Сервис Feed43 теперь говорит по-русски

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

                                    Зачем нужен Feed43?

                                    Наш сервис дает возможность вам самим создавать RSS-каналы из любых веб-страниц. Фактически, Feed43 предоставляет универсальный API на основе RSS к любому сайту, любой странице и даже любой части страницы.
                                    • Хотите читать новости с сайтов, не предоставляющих RSS?
                                    • Хотите предоставлять разнообразные RSS-потоки для читателей вашего собственного сайта/блога, не заморачиваясь при этом с программированием?
                                    • Хотите отслеживать список самых кассовых фильмов, количество полученных Россией олимпийских медалей, популярные записи в блогах?
                                    Все это теперь возможно.

                                    Читать дальше →
                                  • Скрещиваем велотренажер с компьютером

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

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

                                      15.05 КБ

                                      Компьютер на руле съемный, и от датчика к нему идет провод, заканчивающийся стандартным 3,5 мм моно-миниджеком. Вот и подумал, а что если заставить вращением педалей имитировать нажатие кнопки мыши, подключить мышь к компьютеру и написать какой-нибудь софт (игрушку или что-то еще), чтобы сделать кручение педалей более интересным занятием?
                                      Читать дальше →