вторник, 24 января 2012 г.

Как сгенерировать себе случайный аватар?

Сгенерируем тысячу и выберем самый красивый:
  • mkdir /tmp/avatars/
  • for i in `seq 1 1000`; do hash=`dd if=/dev/random bs=16 count=4 2>/dev/null | md5sum | awk '{ print $1 }'`; wget -q "http://www.gravatar.com/avatar/$hash?s=128&d=identicon&r=PG" -O /tmp/avatars/$hash.png; echo "$hash"; done
  • Идём в /tmp/avatars/ и выбираем аватар. Если нужна картинка большего размера, то можно вручную сделать HTTP-запрос с этим хешем.
  • Если случайные числа в /dev/random быстро заканчиваются, то замените его на /dev/urandom

















суббота, 14 января 2012 г.

www.100слов.рф — учите язык с помощью субтитров!

Как это работает?

Допустим, вы собрались посмотреть кино на английском:
  • Заходим на www.100слов.рф
  • Скачиваем кино вместе с субтитрами либо находим их в интернете;
  • Выбираем в меню "Начать урок" и загружаем .SRT файл c субтитрами;
  • Программа найдёт 100 самых часто-используемых слов из фильма и покажет вам их перевод с помощью одного или нескольких online-словарей;
  • В конце урока вы увидите подробную статистику по фильму: сколько слов было всего, сколько было отсеяно, какой % слов покрыл данный урок и т.д.
Сайт не требует регистрации, но если вы (бесплатно) зарегистрируетесь, то в добавок к вышеперечисленному сможете:
  • Сохранять свои предпочтения, а именно - список используемых словарей, любимый словарь и количество слов в уроке;
  • Во время урока отмечать слова как "известные". Программа будет помнить, какие слова вы уже знаете и не станет показывать их вам в следующий раз;
  • Просматривать список известных слов и удалять из него те, которые вы забыли.
В данный момент сайт поддерживает только английский, но возможно вскоре появится немецкий, французский и испанский.

Что под капотом
Тестирование

Все backend-классы (парсинг и анализ субтитров) покрыты Unit-тестами. Есть тест web-интерфейса (используется модуль Test::WWW::Mechanize::Catalyst).

WWW-тест эмулирует одновременную работу нескольких пользователей: они регистрируются, загружают субтитры, переводят слова, модифицируют параметры своего аккаунта и т.д. Тест создаёт для себя всё необходимое окружение и убирает за собой в конце.

Тест умеет автоматически конфигурировать и запускать временный экземпляр Apache2/mod_perl и тестировать приложение в условиях максимально приближенных к реальным.

Весь код (за исключением автоматически сгенерированных классов) проверен при помощи perlcritic-а в режме Brutal.

Все HTML страницы проходят валидацию на XHTML 1.0 / Transitional
Все CSS файлы проходят валидацию на CSS Level 2.1

Техническое имя сайта (не IDN): ss.entropyware.info

Feedback

В настоящий момент сайт и сама идея находятся на этапе опытной эксплуатации, поэтому было бы интересно получить feedback от тех, кто любит посмотреть фильмы на английском.

понедельник, 25 июля 2011 г.

meter-webapp --- система учёта показаний водных счётчиков

Общие сведения

Каждый месяц мне, как и другим жителям моего многоквартирного дома, приходится проделывать процедуру под названием "заполнение справки о расходах холодной и горячей воды". Данная процедура включает в себя заполнение бланка, в котором указываются: ФИО, номер квартиры, номера счётчиков холодной и горячей воды, предыдущие показания счётчиков холодной и горячей воды, дата подачи предыдущих показаний и, разумеется, текущие показания счётчиков холодной и горячей воды. Вдобавок, бланк заполняется в двух экземплярах. Ясно, что вся информация кроме текущих показаний либо не меняется вообще, либо может быть вычислена на основе уже имеющихся данных, причём эту задачу совсем несложно автоматизировать. Именно этой цели и служит web-приложение meter-webapp. Ещё одна приятная мелочь - email-напоминалка, которая отслеживает подал человек показания счётчиков в текущем месяце или нет.

Краткая техническая информация
Тестирование
  • Модульные тесты для всех пользовательских ORM-классов, порождённых от Class::DBI::*
  • Тест, проверяющий функционирование ORM-классов в комплексе
  • Тест, проверяющий работу web-приложения на самом вернем уровне
Все тесты самостоятельно создают для себя всё необходимое окружение и убирают за собой после завершения. Тесты первых двух типов создают для себя временную БД со всеми необходимыми таблицами. Результат манипуляции с данными проверяется при помощи модуля Test::DatabaseRow.

Функциональный тест также создаёт временную БД, инициализирует её, генерирует конфигурационный файл Apache-а, запускает instance на выделенном порту и полностью имитирует работу нескольких пользователей с сайтом: регистрацию, логин, настройку информации по квартире, подачу показаний и т.д. Все вышеперечисленное осуществляется при помощи модуля Test::WWW::Mechanize. После завершения теста, все временные файлы удаляются.

Если выставить переменную окружения - DONT_CLEANUP, то все временные конфиги, базы данных будут оставлены для ручного изучения и анализа.

На данный момент набор тестов покрывает не все случаи и будет расширяться.

Что дальше
  • Если получится, то "распространить среди жильцов нашего ЖЭКа" (C).
  • Do TODO

четверг, 28 апреля 2011 г.

Параллельный вейвлетный компрессор изображений EPSILON

EPSILON - это параллельный вейвлетный компрессор изображений. Программа поддерживает более 30 различных вейвлетных фильтров и имеет механизм для добавления новых. Кроме того, EPSILON поддерживает очень большие изображения (больше 4Gb) и позволяет точно задавать желаемую степень сжатия заранее.

К настоящему моменту имеются три механизма для распараллеливания:
  • POSIX threads
  • MPI (Message Passing Interface)
  • Собственное кластерное решение на базе TCP/IP
Метод распараллеливания задаётся опцией во время компиляции (имеются HOW-TO по запуску MPI и кластерной версии). Можно также собрать и простую, последовательную версию программы.

Архитектурно EPSILON состоит из двух частей: библиотеки libepsilon и программы epsilon, которая использует данную библиотеку. Таким образом, libepsilon может использоваться (и фактически используется) независимо.

Программа epsilon поддерживает два графических формата: PGM и PPM. Сжатое изображение сохраняется в собственном формате PSI. PSI-файл состоит из последовательности блоков, соответствующих блокам исходного изображения. Каждый блок абсолютно независим от остальных и имеет свой заголовок и CRC. Таким образом, даже если все блоки в файле кроме одного будут полностью испорчены или утрачены, то этот единственный блок распакуется без проблем и встанет на своё место в изображении.

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

Уже сжатое изображение можно дополнительно усечь (дожать). Благодаря технологии известной как embedded wavelet coding, алгоритм усечения выглядит следующим образом: пробежаться по всем сжатым блокам и усечь (буквально) каждый до необходимого размера. Единственное дополнительное действие - пересчёт CRC усечённого блока. Интересно отметить, что сжатое, а затем усечённое изображение ничем не будет отличаться от изначально сжатого до размера усечённого.

Начиная с версии 0.9.1 в EPSILON появился свой тестовый фреймворк, написанный на Perl. К настоящему моменту имются два теста: быстрый - quick.t и полный - verification.t

Полный тест для каждого из тестовых изображений перебирает все 4 версии EPSILON (generic, pthreads, cluster, mpi), все вейвлетные фильтры, все поддерживаемые размеры блоков и все допустимые режимы работы. Для каждой полученной комбинации (на данный момент их 7680) производится сжатие, распаковка и расчёт PSNR между исходным и восстановленным изображениями. Если полученный PSNR меньше ожидаемого, то тест сохраняет для дальнейшего анализа полученные файлы и список использованных опций.

EPSILON используется в составе OpenSource GIS-библиотеки GDAL: http://www.gdal.org/frmt_epsilon.html

Пример использования EPSILON на реальной спутниковой фотографии: http://www.gaia-gis.it/raster_benchmark/color-ortho-epsilon.html

EPSILON распространяется по лицензии GPL3 или LGPL3 (по выбору).
Страница проекта: http://epsilon-project.sourceforge.net/