Posts

Showing posts from April, 2010

Настройка резкости web-камеры

Жила-была у меня веб-камера вот такая Bus 002 Device 007: ID 046d:08d7 Logitech, Inc. QuickCam Communicate STX Обзавелся я ею, когда писал систему документооборота с модулем поддержки веб-камер. Вот возникло желание поиграться с девайсом - поглядеть, что можно получить, если разобрать и подстроить фокусировку. Что касается воспроизведения видео, то mplayer у нас уже работает с V4l2 (пару лет назад не работал и я держал в своем репозитории mplayer, собранный с V4l). Команда просмотра, соответственно, будет такой: mplayer tv:// -tv driver=v4l2:width=640:height=480:device=/dev/video1 Разобрать было несложно, достаточно снять кнопку сбоку на корпусе и выкрутить единственный винтик, скрывающейся в колодце под этой кнопкой. Подкрутил на пару оборотов положение линзового блока (приблизил к матрице). Результат мне вполне понравился - на расстоянии от от полуметра до метра самое то. Upd. Вот так можно вести запись с камеры наблюдения (длительность записи 1 минута): $ mencoder tv:// -tv

Скрипты для mapserver: mapinfo.py и mapdraw.py

Скрипты давно уже выложены, но приведу еще и здесь, для гарантии, что не потеряются. Реализация на питоне, поскольку именно в питоне лучшая поддержка модуля mapscript. mapinfo.py #!/usr/bin/python # This program comes with ABSOLUTELY NO WARRANTY. This is free software, and # you are welcome to redistribute it under certain conditions. # See the GNU General Public Licence for details. # Copyright (C) 2007, Alexey Pechnikov import sys import mapscript def Usage(): print 'Usage: map.py [-extent ] -conf [-point ] [-width ] [-height ]' sys.exit(1) in_file = None extent = None point = None width = None height = None args = sys.argv arg = args.pop(0) while len(args) > 0: arg = args.pop(0) if arg == '-extent': if len(args) < 3: Usage() else: minx = float(args.pop(0)) miny = float(args.pop(0)) maxx = float(args.pop(0)) maxy = float(args.pop(0))

Работа с bluetooth

Приведена подборка советов из моих заметок примерно 5-ти летней давности. Может, кто всплакнет над ними на досуге, вспомниная времена былые. Впрочем, для встраиваемых устройст кое-что из описанного ниже по-прежнему может быть актуально. OBEX Устанавливаем пакет для работы с OPEN OBEX apt-get install obexftp После этого перезапускаем bluez-utils /etc/init.d/bluez-utils restart Теперь мы можем, например, получить список всех директорий первого bluetooth-устройства obexftp -b -l Или получить список директорий устройства 00:12:62:C0:6E:9E obexftp -b 00:12:62:C0:6E:9E -l Следующая команда отправляет mp3-файл /tmp/1/Mihail_Boyarskii_-_Vstrecha_v_puti.mp3 на сотовый телефон obexftp -b -p /tmp/1/Mihail_Boyarskii_-_Vstrecha_v_puti.mp3 Здесь также можно указать устройство 00:12:62:C0:6E:9E и папку назначения "Memory card" (карта памяти) obexftp -b 00:12:62:C0:6E:9E --chdir "Memory card" -p /tmp/1/Mihail_Boyarskii_-_Vstrecha_v_puti.mp3 Отметим, что указанный в с

Интернет через irda

Просматривая свои архивы, нахожу немало интересного. Например, сабж. Выкладываю здесь, чтобы не хранить еще десятилетие в бэкапах документации :-) 1.Установить поддержку irda и пакет утилит irda-tools 2.Подсоединяем irda-устройство Tekram (в нашем случае подключено к порту ttyS1) irattach /dev/ttyS1 -d tekram -s 3.Проверяем успешность подключения cat /proc/net/irda/discovery 4.Запускаем pppd для подключения к сети pppd call irda-gprs cat /etc/chatscripts/irda-gprs # стандартный, можно использовать с bluetooth-соединением # This chatfile was generated by pppconfig 2.3.2. # Please do not delete any of the comments. Pppconfig needs them. # # ispauth PAP # abortstring ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED # modeminit '' ATZ # ispnumber OK "ate1" OK 'at+cgdcont=1,"IP","internet.mc","",0,0' OK "atdt*99#" #

VirtualBox на 32-бит системе с 64-бит ядром

Долго ли, коротко ли, а 64-бит архитектуры развиваются и становятся интересными для практического применения. Ядро ветки 2.6.32 вполне прилично работает на нетбуке, так что возникла мысль попробовать 64-бит ядро. Почему именно такая конфигурация? Да очень просто - всегда можно загрузиться в 32-бит ядро и оказаться в хорошо известной 32-бит конфигурации. Почему на нетбуке? Все просто - мне хватает его производительности, а по размерам он меньше ноутбука и практически бесшумен. Пару дней назад, когда я уже сидел с 64-бит ядром, понадобилось запустить VirtualBox. А он запускаться не хочет. Ну, что поделать, значит, пришло время попробовать 64-бит чрут в 32-бит системе с 64-бит ядром. Поставил sid, хотя можно было и squeeze, это не принципиально, поскольку виртуалбокс все равно для ленни собран в репозитории на оффсайте. Плюс сделал скрипт для запуска VirtualBox в чруте: $ cat /usr/local/bin/virtualbox #!/bin/sh CHROOT=/srv/chroot_amd64 if test ! -e $CHROOT/dev/.udev; then

ASUS EEEPC 1005PE

Image
Решил написать пару слов о сем девайсе, поскольку о нем "ходят слухи тут и там", притом мало соответствующие действительности. Итак, по порядку. Открываем коробку и достаем девайс. На нем по дефолту установлена виндоус 7, которую я вижу первый раз (а вот с вистой и вовсе познакомиться не довелось, чему я искренне рад). Долго и упорно настраивается при первом запуске, с полчаса примерно. Наконец запустилась, логинюсь. Тормози-и-ит. Проверяю конфигурацию - 2 Гб ОЗУ, винт 250 гиг и довольно шустрый, но все это пропадает втуне, поскольку система весьма задумчива. Из приятного - наконец-то увидело точку доступа с WPA2 без лишних телодвижений. Делаю то, ради чего, собственно, я винду загружал - регистрируюсь в ASUS WebStorage. Вроде как приложение для регистрации для нетбука и сделано, но шрифты страшные, лет 10 назад такие в линуксе иногда попадались, а некоторые "окошки" не влазят на экран (открыл еще несколько предустановленных программ - та же хрень). При первой поп

Презентация по HTML5

Эта интерактивная презентация понравилась ясностью и наглядностью, примеры работают и притом вполне "жизненные": This presentation is an HTML5 website

Селективность индексов в SQLite

При разработке больших БД возникает необходимость в использовании множества индексов, но скорость вставки данных при этом падает катастрофически. Проанализировав, пришел к следующему результату - высокоселективный индекс на больших таблицах ведет себя ужасно. То есть, если в таблице 10М записей проиндексировать поле с десятком вариантов значений, это еще ничего, но если значений миллион, то скорость вставки записей снизится на несколько порядков. Для небольших таблиц рекомендации известны: Re: Behavior of SELECT queries during transaction С большими наборами данных все интереснее - в случае единственного индекса потенциально хорошую производительность можно получить при вставке заранее упорядоченного набора записей. Если же индексов много, то даже предварительная подготовка добавляемых записей ничего не даст. Расширение FTS3 предоставляет другую реализацию индекса - и этот индекс отлично работает с высокоселективными значениями. Зато имеет большие проблемы при выборок низкоселек

Улучшение zlib-сжатия для FTS3

Все бы хорошо с zlib-сжатием, но при вставке коротких строк или чисел оверхед получается многократный - сжатая строка в разы больше исходной. В качестве решения я решил не сжимать короткие строки (маньше 80 символов в данный момент), указывая 4-х байтный заголовок такой строки (содержит длину исходной строки, если строка сжата) как FFFFFF. Таким образом, эти строки легко распознаются при распаковке и оверхед минимален. Замечу, что сначала попытался использовать типы данных - если строку не сжимаю, то возвращаю text, а не blob. На выходе функции compress() получается набор сжатых и несжатых строк. Оверхед меньше, но решение потенциально способно породить сложноуловимые грабли. Как минимум, определить, использовано ли сжатие для записей, станет сложно. В моем деб-пакете с эскулайт это усовершенствование уже есть, а в fossil-репозиторий пока не добавил.

SQLite index performance degradation tests

.schema CREATE TABLE role ( id INTEGER PRIMARY KEY AUTOINCREMENT, uid BLOB ); CREATE INDEX role_uid_idx on role(uid); Method 10 iterations of the 500 000 inserts: insert into role (uid) values (uid) uid=randomblob(1) $ ./test.tcl 1 7 seconds per iteration 2 7 seconds per iteration 3 7 seconds per iteration 4 7 seconds per iteration 5 7 seconds per iteration 6 7 seconds per iteration 7 7 seconds per iteration 8 7 seconds per iteration 9 7 seconds per iteration 10 7 seconds per iteration uid=randomblob(8) $ ./test.tcl 1 7 seconds per iteration 2 8 seconds per iteration 3 9 seconds per iteration 4 10 seconds per iteration 5 11 seconds per iteration 6 12 seconds per iteration 7 13 seconds per iteration 8 13 seconds per iteration 9 14 seconds per iteration 10 15 seconds per iteration uid=randomblob(16) $ ./test.tcl 1 7 seconds per iteration 2 10 seconds per iteration 3 12 seconds per iteration 4 14 seconds per iteration 5 18 seconds per iteration 6 44 seconds per iteration 7