Pull to refresh
290
0
Игорь Афанасьев @afan

Директор по локализации, Evernote

Send message

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

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

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


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

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

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

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

Читать дальше →
Total votes 19: ↑16 and ↓3 +13
Comments 29

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

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



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

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

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

Читать дальше →
Total votes 17: ↑17 and ↓0 +17
Comments 20

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

Reading time 6 min
Views 147K


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

Сынишку, в силу его годовалого возраста, подарок не сильно впечатлил, а позволять бросать сложное электронное устройство на пол и отрывать этому устройству уши мне было жалко, и все шло к тому, чтобы убрать подарок на полку до лучших времен, однако мой взгляд пал на одну надпись на красочной упаковке…
Читать дальше →
Total votes 321: ↑315 and ↓6 +309
Comments 82

Интервалометр для SONY NEX-5 за 20 минут и $0

Reading time 3 min
Views 53K
Это пост я посвящаю всем тем, кто паял Covox для БК.

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

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


А теперь подробности:
Читать дальше →
Total votes 100: ↑98 and ↓2 +96
Comments 79

Визуализация разных дисков в файловом менеджере или Не совсем консольный FAR

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

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

Читать дальше →
Total votes 205: ↑188 and ↓17 +171
Comments 119

Интерфейс выбора цвета

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

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

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

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

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

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

А вот как это работает
Total votes 120: ↑101 and ↓19 +82
Comments 70

Добавляем свои поисковые системы

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

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

4.75 КБ

Где это все настраивается? Смотрим картинку:
Читать дальше →
Total votes 141: ↑110 and ↓31 +79
Comments 95

Как сделать сайт более iPhone-совместимым за 5 шагов

Reading time 2 min
Views 54K
Тот факт, что 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:


Читать дальше →
Total votes 95: ↑85 and ↓10 +75
Comments 38

WHOIS Digger — Сервис проверки доменов с нестандартным интерфейсом

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

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

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

Интерфейс WHOIS Digger


Чем же он удобен?
Читать дальше →
Total votes 65: ↑58 and ↓7 +51
Comments 95

GIZMO! или пятничный фильм

Reading time 1 min
Views 737
Самое время для пятничного познавательного видео, %username%!



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

Устраивайтесь в кресле поудобнее и приятного просмотра!
Total votes 45: ↑37 and ↓8 +29
Comments 18

TreeBrowser (браузер без табов) + демо-приложение

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



Под катом — подробное описание идеи и скриншоты.
Читать дальше →
Total votes 217: ↑210 and ↓7 +203
Comments 176

Идея: функция форматирования для удобной локализации строк

Reading time 2 min
Views 1.4K
Проблема: при переводе приложений на другие языки (чаще мы сталкиваемся с русификацией англоязычных продуктов) чаще всего страдает поддержка множественных форм чисел. Например, «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#, за что ему большое спасибо.
Total votes 37: ↑29 and ↓8 +21
Comments 40

Новогодний подарок — платная годовая подписка на Evernote

Reading time 1 min
Views 759

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

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

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

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

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

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

UPD: Раздача слонов успешно завершена.
Total votes 11: ↑7 and ↓4 +3
Comments 12

Прощай, любимая ВДНХ!

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

22.07 КБ
Они убили Кенни!
Total votes 204: ↑173 and ↓31 +142
Comments 261

RFID от Tikitag — непаханное поле для самоделкиных

Reading time 2 min
Views 6.3K
Интересная новость обнаружилась на Engadget:

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

59.23 КБ

Читать дальше →
Total votes 78: ↑71.5 and ↓6.5 +65
Comments 77

Миниатюрное приложение-калькулятор

Reading time 1 min
Views 3.1K
Т.к. Google Chrome умеет сохранять ярлыки к приложениям и запускать их без браузерной обвязки, решил сделать для себя небольшое приложеньице-калькулятор. Выглядит оно так:

7.56 КБ

Читать дальше →
Total votes 120: ↑97 and ↓23 +74
Comments 88

Сервис Feed43 теперь говорит по-русски

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

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

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

Читать дальше →
Total votes 109: ↑90.5 and ↓18.5 +72
Comments 87

Скрещиваем велотренажер с компьютером

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

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

15.05 КБ

Компьютер на руле съемный, и от датчика к нему идет провод, заканчивающийся стандартным 3,5 мм моно-миниджеком. Вот и подумал, а что если заставить вращением педалей имитировать нажатие кнопки мыши, подключить мышь к компьютеру и написать какой-нибудь софт (игрушку или что-то еще), чтобы сделать кручение педалей более интересным занятием?
Читать дальше →
Total votes 185: ↑175 and ↓10 +165
Comments 68

Information

Rating
Does not participate
Location
California, США
Date of birth
Registered
Activity