LiteCoding

Заметки о программировании

Что я забыл сказать про миграцию с svn на git

без комментариев

Да, я совсем забыл, что есть автоматизация того порядка действий, на которые я сослался вот тут. Работающий шелл-скрипт от того же автора (а тут — описание).

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

10 января 2013 at 11:57

Категории: Заметки

Тэги: , ,

smali2java: итоги года

без комментариев

Близится Новый Год, и пора уходить на зимние каникулы. Поэтому сейчас самое время рассказать о том, чем уже стал проект smali2java, и во что он превратится в наступающем году.
Читать далее »

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

25 декабря 2012 at 10:02

Категории: Заметки

Тэги: , , , ,

О калибровке экранов

без комментариев

Давайте сегодня поговорим о калибровке экранов, т.к. этот вопрос волнует многих, если судить по логам запросов. Прежде чем дать готовое к употреблению решение, есть 2 факта, о которых вам просто необходимо знать:

1. Ёмкостные экраны почти никогда не требуют калибровки. Это как раз те экраны, которые реагируют на прикосновение пальца, которыми можно управлять размороженной сосиской, и для работы с которыми продаются всякие модные перчатки.

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

Как узнать, что требуется калибровка экрана? Очень просто. Если вы нажимаете на одну точку, а срабатывает нажатие на другую, и так происходит постоянно в какой-то области экрана (ну или на всем экране), то нужно калибровать.

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

2. Если ёмкостный экран начал неверно позиционировать ваши прикосновения, то сотрите с него грязь отпечатки пальцев куском мягкой влажной ткани. Если экран не вышел из строя, то это должно помочь.

3. Если же устройство как-то странно реагирует на изменение положения в пространстве, то тут требуется другая калибровка. Выполнить ее можно, перейдя в Настройки, затем Дисплей, а затем — Горизонтальная калибровка. Но это уже не калибровка экрана 🙂

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

17 декабря 2012 at 09:09

Категории: Заметки

Тэги: , ,

Блог переехал на AWS EC2

без комментариев

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

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

4 декабря 2012 at 14:25

Категории: Новости

Тэги:

Хинт мигрирующим с svn на git

без комментариев

Есть у меня для мигрирующих целых 3 совета:

1. Воспользоваться инструкцией (вроде этой) тех, кто уже прошел этот путь.

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

for repo in `ls -d -m1 /var/svn/* | xargs -n 1 basename`;
do svn co file:///путь_к_репозиторию/$repo /путь_для_локального_чекаута/$repo;done;

3. Генерировать файлы authors-transform.txt тоже лучше автоматически. Опять пример для Debian (удалите переносы строк):

for repo in `ls -d -m1 /путь_локального_чекаута/* | xargs -n 1 basename`;
do cd $repo; 
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); 
print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt; cd ..;done

Быть может, вы могли бы написать это проще, но эти корявые скрипты работают, что от них и требуется.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

20 ноября 2012 at 19:29

USB CDC ACM

без комментариев

Просматривая поисковые запросы, увидел, что немало посетителей приходят сюда за CDC (Communications Device Class) ACM (Abstract Control Model). Очень странно, учитывая, что я об этом никогда в этом блоге не писал. Тем не менее, ответ есть. Описание того, что это такое, а также ссылку на документацию (внизу страницы) можно найти тут.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

9 августа 2012 at 00:31

Категории: Заметки

Тэги: , ,

Августовские обновления

без комментариев

Дорогие (не)многочисленные читатели этого блога,

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

1. Andor’s Trail Editor
Пару месяцев назад написал редактор сэйвов для Andor’s Trail и сегодня выложил первую альфу, которая все это время пылилась у меня на винчестере. Этот редактор пока может и умеет не так уж и много: читать, писать и редактировать количество уже имеющегося в инвентаре предмета. Но это только начало. Вся беда в том, что рисовать я не умею совсем, поэтому если у вас есть желание помочь этому опенсорсному проекту, то я буду рад скетчам GUI, иконкам для классов предметов и т.д. Естественно, каждый соавтор будет упомянут на странице проекта и в разделе «О приложении» (когда он появится).
Скачать apk и исходные коды можно с google code.

2. Smali2Java
Вернулся к своему долгострою, который «подвис» из-за возникших проблем с алгоритмизацией казалось бы простых действий. На данном этапе (pre-Alpha) он уверенно разбирает шапку smali-класса, импорты, поля и прототипы методов. Надеюсь, в ближайшем будущем он уже сможет осилить восстановление конструкторов и геттеров/сеттеров. Этому проекту также требуется помощь: ссылки на описание работы алгоритмов восстановления исходного кода, советы, патчи, запросы новых и баг-репорты по заявленным функциям.

В принципе, это все хорошие новости на данный момент. Не забывайте оставлять комментарии, даже если согласны (а тем более, если не согласны) с моим мнением.

Ваш блогмастер LiteCoding.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

8 августа 2012 at 14:44

libav: как хранится YUV420 в AVFrame

без комментариев

Давненько не было заметок на тему программирования (да и заметок вообще), но за все это время не было ничего особенно интересного, чем бы я мог поделиться с вами, мои читатели. Сейчас я ковыряюсь под капотом libav, поэтому в этой заметке речь пойдет об одной конкретной проблеме. Если вы не в курсе, что такое libav, то про эту чудесную библиотеку можно почитать тут. Для особо нетерпеливых скажу, что это именно то, что выполняет основную часть работы в ffmpeg.

У меня появилась задача декодировать кадр из видеопотока и сохранить его в оперативной памяти в YUV 4:2:0 (PixelFormat.PIX_FMT_YUV420P, как он поименован в libav). И если вопрос декодирования решается довольно быстро и легко (тут есть очень неплохой учебник по написанию видеоплеера с использованием libav, а тут — обновленные примеры из этого учебника для последней версии библиотеки), то попытки разобраться, как данные хранятся в AVFrame, долгое время не давали результата.

Нас интересуют прежде всего поля AVFrame.data и AVFrame.linesize. Первое — массив указателей на участки памяти с данными, а второе — массив с длинами строки данных. Последнее нужно пояснить отдельно — памяти выделяется больше, чем нужно для хранения данных, т.к. она может использоваться кодеком для более эффективного кодирования/декодирования. Т.е. AVFrame.data содержит как полезные данные, так и мусор (в лучшем случае — лишние нулевые байты). При этом данные разделены по каналам: Y-компоненты хранятся в памяти, на которую указывает data[0], U- и V-компоненты — в памяти по data[1] и data[2] соответственно. В моем случае для кадра 704×288 AVFrame.linesize был следующим: {736, 368, 368, 0, 0, 0, 0, 0}.

С Y-каналом никаких проблем возникнуть не могло: там находились 288 (height) строк длиной по 704 (width) байта, и каждая строка была выровнена по границе 736 байт (AVFrame.linesize[0]). А вот попытки прочитать подобным образом U- и V-каналы приводили к выходу за пределы массива данных. Как оказалось, в data[1] и data[2] данные хранятся следующим образом: 144 (height / 2) строки длиной по 352 байта (width / 2), выровненные по границе 368 байт (AVFrame.linesize[1] и AVFrame.linesize[2]).

И, наконец, алгоритм чтения на псевдокоде:

AVFrame frame;
/*...*/
for(int i = 0; i < frame.height; i++) {
    readY(frame.data[0], i * frame.linesize[0], frame.width);	
}
		
for(int i = 0; i < frame.height / 2; i++) {
    readU(frame.data[1], i * frame.linesize[1], frame.width / 2);
    readV(frame.data[2], i * frame.linesize[2], frame.width / 2);
}

И в итоге получаем YUV 4:2:0 фрейм, записанный в непрерывный участок памяти.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

3 августа 2012 at 11:22

Категории: Заметки

Тэги: ,

Как бороться с INSTALL_PARSE_FAILED_NO_CERTIFICATES

без комментариев

Вот, предположим, собираете вы приложение с помощью ant, все прописано как надо, все ПО, участвующее в процессе сборки приложения последних версий, в т.ч. и JDK7. Все проходит успешно, на выходе получаете apk-файл, а приложение не устанавливается. При попытке установить через ADB появляется «информативное» сообщение INSTALL_PARSE_FAILED_NO_CERTIFICATES. Что делать? На самом деле, тут виноват именно JDK7, который по умолчанию использует SHA-256 вместо SHA-1 в утилите jarsigner. Решить эту проблему очень просто. Т.к. задание signjar в ant не поддерживает перегрузку алгоритма для генерации подписи, то вам придется установить JDK6 (вместе с JDK7 они отлично уживаются) и изменить значение переменной окружения JAVA_HOME на каталог bin установленного JDK6. После этого процесс сборки заработает как надо.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

16 апреля 2012 at 14:54

Получение списка зависимостей классов в Java

без комментариев

Совсем недавно на хабре проскакивала статья «Определяем все классы, которые использует приложение на Java«, в которой рассматривался ряд хитроумных способов получить список зависимостей конкретного проекта. Ничего не могу сказать по поводу удобности предложенных решений, т.к. до сих пор мне не приходилось иметь дело с инструментацией в Java. Но вот подобная задача с небольшими вариациями уже появлялась в моем списке.

Все уже изобретено. А то, что не изобретено, на самом деле изобретено и основательно позабыто. Поэтому я хочу обратить ваше внимание на CDA (Class Dependency Analyzer), инструмент статического анализа классов Java. Сразу огорчу сторонников open source, вы не сможете найти исходный код данного инструмента в открытом доступе. Зато он freeware’ный, т.е. по-настоящему бесплатный. Никакой рекламы, ограничений функциональности и прочих трюков, заставляющих купить полную (full, pro, ultimate) версию продукта. Его GUI построен с помощью JGoodies, поэтому особых красивостей ожидать не стоит. Но зачем нам молоток с уникальным дизайном, если нужно просто вбить гвоздь? Главное, чтобы его рукоятка удобно лежала в руке, его баланс не напрягал, и чтобы он не рассыпался от первого серьезного удара. CDA именно такой инструмент — простой и надежный. У него есть единственный недостаток — не «понимает» рефлексию, но это беда всех статических анализаторов. В остальном этот инструмент полностью оправдывает ожидания.

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

Итак, если у вас есть подобная задача, попробуйте CDA для ее решения. Удачи!

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Написал: Дмитрий Воробьев

16 апреля 2012 at 13:15