LiteCoding

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

Архив категории ‘Заметки’

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

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

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

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

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

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

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

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

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

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

Written by Дмитрий Воробьев

Декабрь 17th, 2012 at 09:09

Хинт мигрирующим с 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

Written by Дмитрий Воробьев

Ноябрь 20th, 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

Written by Дмитрий Воробьев

Август 9th, 2012 at 00:31

Posted in Заметки

Tagged with , ,

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

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

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

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

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

Written by Дмитрий Воробьев

Август 8th, 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

Written by Дмитрий Воробьев

Август 3rd, 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

Written by Дмитрий Воробьев

Апрель 16th, 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

Written by Дмитрий Воробьев

Апрель 16th, 2012 at 13:15

Генерация хэша ключа для интеграции Android-приложения с Facebook

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

Известно, что этот хэш можно сгенерировать следующей командой:
keytool -exportcert -alias androiddebugkey -keystore "\.android\debug.keystore" | openssl sha1 -binary | openssl base64
(зачем это нужно, можно прочитать в официальной документации).

Но стоит допустить ошибку в пути к хранилищу ключей, алиасе ключа или пароле, хэш все равно будет сгенерирован, но интеграция работать не будет. Для того, чтобы избежать этой ситуации (а также чтобы можно было генерировать хэш без JDK и OpenSSL), я написал простенькую утилиту. В результате работы она выдает либо сообщение об ошибке, либо хэш. Параметры командной строки взяты из JDK keytool. Скачать скомпилированный вариант можно отсюда.

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

Written by Дмитрий Воробьев

Март 22nd, 2012 at 11:47

Драйвер ADB для телефонов HTC

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

Что самое интересное, ко всем телефонам HTC, которые так или иначе попадали мне в руки, подходят стандартные драйвера, которые идут в комплекте с Android SDK (в SDK Manager нужно поставить галку для пакета Extras / Usb Driver package). Если по каким-то причинам неопознанное устройство в диспетчере устройств есть, а драйвер для него в папке usb_driver не находится, то тут помогает простая правка inf-файла.

1. Смотрим свойства устройства в диспетчере задач. Нас там интересует код экземпляра устройства. Точнее, строка с его VID и PID
2. Модифицируем inf-файл. В секции [Google.NTx86] и [Google.NTamd64] добавляем в зависимости от кода устройства:
. Если строка с VID и PID содержит MI_01, добавляем в обе секции строку

%CompositeAdbInterface% = USB_Install, USB\VID_значение&PID_значение&MI_01

например,

%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C9A&MI_01

2b. Если строка с VID и PID не содержит MI_01, добавляем в обе секции строку

%SingleAdbInterface% = USB_Install, USB\VID_значение&PID_значение

например,

%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C01

3. Снова выполняем поиск драйвера в usb_driver и следим за прогрессом его установки. Готово!

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

Written by Дмитрий Воробьев

Ноябрь 17th, 2011 at 13:30

Posted in Заметки

Tagged with ,

Драйвер ADB для Motorola XOOM

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

UBS-драйвер для Motorola Xoom можно скачать отсюда, либо с помощью прямой ссылки на Motorola 5.2.0 Driver with MotoHelper.

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

Written by Дмитрий Воробьев

Октябрь 14th, 2011 at 11:09

Posted in Заметки

Tagged with ,