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

Сканер CanoScan LiDE 210 в debian



Взял себе на днях CanoScan LiDE 210 взамен CanoScan LiDE 90, для которого поддержку так и не сделали в линуксе, а танцы с бубном мне надоели. Итак, подключил CanoScan LiDE 210, запустил xsane - все работает. Не настраивал вообще ничего, только установил xsane. Сканер шустрый и достаточно тихий. С поддержкой кнопок (в терминологии разработчиков sane - sensors) все хреново, как обычно, но есть финт ушами:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
0
а теперь нажимаем любую кнопку:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
1
Одна из кнопок сканера не вызывает никакой реакции, остальные работают (хотя их названия в выводе scanimage -A перепутаны). Так что несложно сделать скрипт для пакетного сканирования, реагирующий на кнопки:
scan.sh
#!/bin/bash

SCANNER=`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`
if [ -z $SCANNER ]
then
    echo "Scanner not found!"
    exit 1
fi
SCANNER="genesys:$SCANNER"

counter=1
while true
do
    BUTTON=`scanimage -d "$SCANNER" -A | grep '\[hardware\]' | grep "\[yes\]" | wc -l`
    if [ $BUTTON == 1 ]
    then
        echo -n "Start scan image $counter ..."
        scanimage -d "$SCANNER" --resolution 75 --mode Color --depth 16 --format png > $counter.png.tmp
        mv $counter.png.tmp $counter.png
        echo " complete"
        counter=$(($counter+1))
    fi
done
Собственно, запускаем вышеуказанный скрипт и жмем любую кнопку на сканере после помещения в него очередного документа.

суббота, 17 декабря 2011 г.

Открытый софт для научных расчетов


Задачки у меня бывают разные, кратенькое описание того, что может потребоваться я приводил здесь:

Дело происходит в Linux Debian, соответственно, интересует софт, который устанавливается из стандартного репозитория (что подразумевает опенсорсность). 

Для начала я протестировал двумерное Фурье преобразование (прямое и обратное) на широко известном тестовом изображении Lenna. Заодно в процессе поиска нужных функций увидел заметки об истории этого изображения Просто Лена и Обработка изображений: кто такая Лена

Выбор софта для такой типичной задачки вполне себе наличествует:
На практике же оказалось не так радужно, как хотелось бы. Из того, что есть в дебиане, работает "из коробки" только пакет octave. Зато для него можно установить множество расширений - например, необходимый мне пакет octave-image. Если же расширения нет в дебиан, можно установить из репозитория octave. Например, если мы хотим поставить последнюю версию разширения для работы с изображениями, качаем архив image-1.0.15.tar.gz: и далее в текущей директории выполняем:

aptitude install octave3.2-headers 
sudo octave
pkg install image-1.0.15.tar.gz
exit

Как видим, впечатление octave производит самое приятное. К сожалению, не умеет задействовать несколько ядер процессора, это досадно.

Далее я занялся тем, для чего, собственно, и подбирал софт. А именно, построением 3D модели земных недр по космоснимкам высокого разрешения. Несколько ссылок из предметной области:


На 32-бит хосте обработка космоснимка порядка 60 Мб размером требует около 1 Гб ОЗУ. Если же выполнять передискретизацию (скажем, уменьшить матрицу значений в 3 или 5 раз), то и намного меньше. Для Landsat 7 панхроматический снимок будет имеет вдвое большее разрешение и примерно вчетверо больший размер, так что 60 Мб снимок видимого и ИК диапазонов  соответствует примерно 250 Мб панхроматическому. Значит,  8 Гб ОЗУ на 64 бит хосте должно хватить и на обработку панхромата без передискретизации. Интересно, удастся ли это сделать на 32 бит хосте. Скоро проверю и это, как отлажу расчет на ближнем ИК диапазоне. Update. На 32-бит хосте панхроматический снимок прочитать не удалось - octave сообщает, что невозможно выделить требуемый объем памяти.

Статьи и документация по Octave плюс еще некоторые полезные ссылки:

среда, 14 декабря 2011 г.

MS Excel XML to CSV


XSLT file excel2csv.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mso="urn:schemas-microsoft-com:office:spreadsheet" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
   <xsl:for-each select="mso:Workbook/mso:Worksheet/mso:Table/mso:Row">
        <xsl:for-each select="mso:Cell">
                <xsl:value-of select="mso:Data"/>
                        <xsl:if test="position()!=last()">
                        <xsl:text>      </xsl:text>
                        </xsl:if>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
   </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Important: you may replace 4 spaces in "<xsl:text>      </xsl:text>" to single tabulation (or any other delimiter)!

Use as
cat file.xls | xsltproc excel2csv.xsl - > file.csv

пятница, 25 ноября 2011 г.

Lossless музыка: ape+cue и flac+cue


Как мне недавно имели честь сообщить, аз есмь ретроград - не слушаю Vinil RIP :) В самом деле, по старинке обхожусь mp3. Собственно, когда-то проблемы были с воспроизведением lossless форматов, а разницы с mp3 не заметил. Но вот сегодня доступно много всякого разного именно в виде рипов виниловых пластинок, из того что я давно хотел отыскать - так что разбираемся.

1. Если у нас есть flac+cue - достаточно привести к юникодной кодировку (текстового) файла cue:
cat *.cue | iconv -f cp1251 -t utf8 > .cue
Впрочем, необходимо это только тогда, когда имя файла flac содержит не-латинские символы - в ином случае все можно прослушать и без перекодировки.

2. Когда у нас наличествует набор файлов ape + cue, ставим пакеты pacpl, flac и monkeys-audio (для установки последнего нужно подключить репозиторий http://www.debian-multimedia.org/) и далее перекодируем (здесь команда рекурсивно пройдет все подкаталоги в поисках файлов ape и создаст файлы flac):
pacpl -t flac -o ape -r .
Как и выше, перекодируем файлы cue в юникод и меняем в них имя_файла.ape на имя_файла.flac

Прослушать файлы cue умеет audacious ( в нем можно настроить определение кодировки CP1251 для файла cue и проч.) и qmmp (работает в однобитной кодировке, так что кириллические названия в нем увидеть не удастся, но прослушать трэки - можно). Из прочих популярных плееров _не справились_ с задачей amarok, rhythmbox, juk и smplayer.

Ссылки:
Работа с flac+cue и ape+cue в Debian
Converting Monkey’s Audio (ape) to flac in Ubuntu
Split lossless audio (ape, flac, wv, wav) by cue file in Ubuntu

пятница, 29 июля 2011 г.

О LevelDB и SQLite



Новость:
Компания Google открыла исходные тексты БД LevelDB

Кратко о LevelDB - хранилище ключ-значение, однопоточный доступ, нет гарантий целостности всех данных, в памяти держит копию всех данных лог-файлов.

Утилита для тестирования SQLite у них кривая, мои патчи к ней брать тут

Результаты тестирования с патчем для использования целочисленного Primary Key смотреть здесь

Как видим, LevelDB на тестах показывает местами так себе преимущество относительно реляционной транзакционной СУБД... а местами ухитряется быть еще и медленнее :) Неплохо бы сравнить с CDB от DJB с патчем, убирающем ограничение на "константность". В любом случае, по проведенным тестам нет смысла в использовании LevelDB - функционал урезан сильно, а заметного выигрыша в производительности не видно.

Равно есть куда улучшать и SQLite - некоторые результаты плохи на фоне остальных тестов. Значит, у нас многое еще впереди.

пятница, 22 июля 2011 г.

Обновление eglibc в debian


eglibc (2.13-8) unstable; urgency=low

Starting with the eglibc package version 2.13-5, the libraries are
shipped in the multiarch directory /lib/$arch instead of the more
traditional /lib.

The toolchain in Debian has been updated to cope with that, and most
build systems should be unaffected. If you are using a non-Debian
toolchain to build your software and it is not able to cope with
multiarch, you might try to pass the following options to your
compiler:

-I/usr/include/$arch --sysroot /usr/lib/$arch

-- Aurelien Jarno Sun, 26 Jun 2011 22:28:52 +0200


вторник, 19 июля 2011 г.

Семантический веб и формат RDF


В результате общения на форуме с разработчиком Virtuoso возникло желание поглядеть, что бы все это значило и не будет ли оно полезно мне. Итак, смотрим.

Немного ликбеза: Облако и куб: RDF в аналитической базе данных

Описание языка запросов: SPARQL

Набор утилит: Command Line Semantic Web With Redland

В дебиане доступны следующие пакеты: redland-utils (утилита rdfproc), rasqal-utils (утилита roqet) и raptor-utils (утилита rapper). На этих утилитах построен облачный сервис Triplr — Web Command Line

Запрос из найденных в сети примеров:
$ time roqet -e 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?website FROM    WHERE { ?person foaf:weblog ?website ; foaf:name ?name . ?website a foaf:Document}'
...
roqet: Query returned 74 results

real	0m1.929s
user	0m0.112s
sys	0m0.012s

$ openload http://planetrdf.com/bloggers.rdf -t|grep Content-Length:
URL: http://planetrdf.com:80/bloggers.rdf
Content-Length: 56645

Теперь попробуем протестировать самостоятельно. Для экспериментов я взял лог веб-сервера, сконвертировав его в файл test.ttl нижеприведенного формата:
@prefix : <http://mobigroup.ru/2011/ttl/example#> .
[] :host "localhost"; :prot "http"; :code 503; :length 12731; :url ""; :type ""; :version "" .
[] :host "localhost"; :prot "https"; :code 503; :length 12731; :url ""; :type "GET"; :version "HTTP/1.1" .
[] :host "localhost"; :prot "https"; :code 302; :length 611; :url "login"; :type "POST"; :version "HTTP/1.1" .
[] :host "localhost"; :prot "https"; :code 200; :length 8006; :url ""; :type "GET"; :version "HTTP/1.1" .
...

$ stat --format=%s test.ttl
8502820

$ wc -l test.ttl 
52593 test.ttl

Загружаем в специальное хранилище (используется BerkeleyDB) и выполняем запрос:
$ time rdfproc test.db parse test.ttl turtle -n
rdfproc: Parsing URI file:///tmp/test.ttl with turtle parser

real	1m35.248s
user	0m42.927s
sys	0m7.116s

$ stat --format="%n %s" test.db*
test.db-po2s.db 21569536
test.db-so2p.db 79216640
test.db-sp2o.db 62119936

$ time rdfproc test.db query sparql - 'PREFIX : <http://mobigroup.ru/2011/ttl/example#> SELECT  ?code ?url ?length WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }'>log
rdfproc: Query returned bindings results:
rdfproc: Query returned 1457 results

real	0m13.773s
user	0m13.569s
sys	0m0.132s

А здесь выполняем запрос прямо к файлу:
$ cat test.sparql
PREFIX : <http://mobigroup.ru/2011/ttl/example#>
PREFIX  src: <file:>
SELECT  ?code ?url ?length
FROM    src:test.ttl
WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }

$ time roqet -qi sparql test.sparql >/dev/null
...подождал полчаса и прервал запрос...

Увы, очень уж тормознуто. Для сравнения, обычный grep:

$ time grep ":code 503;" test.ttl>/dev/null

real	0m0.046s
user	0m0.040s
sys	0m0.008s

$ grep ":code 503;" test.ttl|wc -l
1457

Теперь попробуем виртуозу. Ставим (запрошенный при установке пароль скоро понадобится!):
$ sudo aptitude install virtuoso-opensource

Открываем в браузере ссылку http://localhost:8890/conductor/ и идем в раздел RDF -> RDF Store Upload, где и грузим наш файл test.ttl ( за 2 минуты 45 секунд). Теперь в разделе RDF->SPARQL выполняем запрос:
PREFIX : <http://mobigroup.ru/2011/ttl/example#>
SELECT  ?code ?url ?length
WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }

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

А вот так с помощью консольной isql-vt стереть нафиг все данные и загрузить новые (см. DB.DBA.TTLP_MT):
DB.DBA.RDF_GLOBAL_RESET() ;
DB.DBA.TTLP_MT (file_to_string_output ('/tmp/test.ttl'), '', 'http://localhost:8890/DAV/offline');




И пара запросов - на подсчет всех фактов указанного вида и отчет по URL определенного вида:
PREFIX : <http://mobigroup.ru/2011/ttl/haproxy/offline#>
SELECT  count(*) as ?count
WHERE   { ?x :timestamp ?timestamp }

PREFIX : <http://mobigroup.ru/2011/ttl/haproxy/offline#>
SELECT *
WHERE   { ?x :url ?url .
        ?x :length ?length .
        ?x :backend ?backend .
        ?x :session ?session .
        FILTER regex(?url, "q=") .
        FILTER regex(?url, "/share/") .
}

Ссылки:
Semantic Web
SPARQL — язык запросов к RDF
Знакомимся с RDF и Semantic Web через N3
<> a :RoughGuide; :to :Notation3 .
Primer: Getting into RDF & Semantic Web using N3
W3C Semantic Web Tutorial
A Prototype Knowledge Base for the Life Sciences

О виртуозе:
Extending SPARQL IRI Dereferencing with Virtuoso Sponger Middleware
Sindice, its startup company and 12 billion+ live triples SPARQL endpoint

Геоданные:
OGC Seeks Comment on candidate GeoSPARQL standard

Ресурсы:
RDF-ресурсы (диаграмма кликабельна!)
Currently Alive SPARQL Endpoints

Здесь есть и про bio2rdf
Virtuoso Universal Server AMI for Amazon EC2 Instantiation Guide

What is the Bio2RDF Project?

Страница проекта bio2rdf на sf
Bio2RDF - Demo queries

PubMed : U.S. National Library of Medicine National Institutes of Health

воскресенье, 3 июля 2011 г.

Haproxy и openload: 40ms проблема


При тестировании сервисов за реверс-прокси HAProxy посредством утилиты openload обнаружилась занимательная вещь: любой запрос выполняется не быстрее, нежели за 40 мс! Даже с "monitor-uri /TESTME" (при наличии этой директивы во фронтэнде HAProxy сам обрабатывает запрос, сообщая о состоянии текущего фронтэнда).

Запросы openload через HAProxy:
$ openload http://127.0.0.1/TESTME 1
URL: http://127.0.0.1:80/TESTME
Clients: 1
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 25
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 50
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 75
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 100

Прямое подключение openload к серверу:
$ openload http://127.0.0.1/TESTME 1
URL: http://127.0.0.1:80/TESTME
Clients: 1
MaTps 2590.64, Tps 2590.64, Resp Time 0.000, Err 0%, Count 2601
MaTps 2609.15, Tps 2775.79, Resp Time 0.000, Err 0%, Count 5399
MaTps 2644.94, Tps 2967.00, Resp Time 0.000, Err 0%, Count 8366
MaTps 2649.39, Tps 2689.48, Resp Time 0.000, Err 0%, Count 11077

Как выяснилось, проблема таится в кривом сетевом коде openload: мало того, что сильно нагружается CPU и о тестировании производительных сервисов стоит забыть сразу, так еще и возникает указанный выше таймаут.

Забавно, конечно, что автор openload побайтово работает с данными - видимо, в Индии процессоры мощные, а интернет медленный :D Комментарий от Willy:

What is shown below clearly indicates that it will never be possible
to reach medium to high loads with this tool, it receives the response
one byte at a time ! Anyway, this is unrelated to what you're observing.

> recvfrom(3, 0x507340, 1, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
> select(1, [0], NULL, NULL, {0, 0}) = 0 (Timeout)
> select(4, [3], [], [3], {0, 200000}) = 1 (in [3], left {0, 160000})
> recvfrom(3, "H", 1, 0, NULL, NULL) = 1
> recvfrom(3, "T", 1, 0, NULL, NULL) = 1
> recvfrom(3, "T", 1, 0, NULL, NULL) = 1
> recvfrom(3, "P", 1, 0, NULL, NULL) = 1
> recvfrom(3, "/", 1, 0, NULL, NULL) = 1

Как обходной путь, для работы с openload можно добавить в конфиг фронтэндов HAProxy директиву "no option tcp-smart-accept". После тестирования лучше отключить эту директиву - для работы браузеров и т.п. она не нужна, а эффективность работы сети снижает.

Разбор проблемы от Willy:

Hehe as you can see the client's but is even more visible here,
with 40ms betweeen the two parts :

1) the connection comes in and the first half of the request is received :

10:05:38.831751 accept(4, 0x7fff071de650, [128]) = -1 EAGAIN (Resource temporarily unavailable) <0.000000>
10:05:38.831751 recvfrom(1, "GET /README HTTP/1.1\r\n", 8192, 0, NULL, NULL) = 22 <0.000000>
10:05:38.831751 recvfrom(1, 0x6a8096, 8170, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) <0.000000>
10:05:38.831751 epoll_ctl(0, EPOLL_CTL_ADD, 1, {EPOLLIN, {u32=1, u64=1}}) = 0 <0.000000>
10:05:38.831751 epoll_wait(0, {}, 5, 0) = 0 <0.000000>
10:05:38.831751 gettimeofday({1309413938, 831751}, NULL) = 0 <0.000000>

2) the clients remains silent for 40 ms, we're waiting for it to talk :

10:05:38.831751 epoll_wait(0, {{EPOLLIN, {u32=1, u64=1}}}, 5, 1000) = 1 <0.040000>
10:05:38.871751 gettimeofday({1309413938, 871751}, NULL) = 0 <0.000000>

3) the client finally decides to send the last part 40 ms later :

10:05:38.871751 recvfrom(1, "Connection: Close\r\nHost: 127.0.0.1\r\n\r\n", 8170, 0, NULL, NULL) = 38 <0.000000>

Большое спасибо Willy Tarreau (автор HAProxy) за помощь. Выше были приведены некоторые части нашей переписки для получения ясного представления о происхождении и решении проблемы.

TclCloud is an opensource tcl interface to the Amazon AWS webservices


Свершилось :) Полное описание и исходники см. по ссылке TclCloud

TclCloud is an opensource tcl interface to the Amazon AWS webservices api that enabled cloud automation of most AWS products and operations. Example use cases include the following:
* starting and stopping EC2 instances
* attaching EBS volumes
* creating and interfacing with SimpleDB and RDS instances
* managing EC2 Autoscale and Load Balancer configurations
* sending Simple Email Service messages
* creating, submitting and monitoring Elastic Map Reduce (Hadoop) jobs
* configuring VPC networks
* and so on ...
For more information on the Amazon AWS cloud products, see: http://aws.amazon.com/products/

Для удобства собрал пакет, брать в моем репозитории или по ссылке
Tcl cloud deb package

среда, 15 июня 2011 г.

Деб-пакеты с модулями SQLite


Собрал некоторые расширения как деб-пакеты, см. репозиторий http://mobigroup.ru/debian/pool-squeeze/main/s/

В апстримовском расширении FTS3 поправлен баг, мешающий собирать его отдельным модулем. Версия из текущего trunk, умеет conflict-resolution для виртуальных таблиц (можно писать insert or replace ...). Также добавлена поддержка стеммеров Snowball.

Модуль ICU собран "как есть" апстримовский.

Добавлен модуль для подсчета хэша sha1 (используется быстрая реализация из BSD-систем).

Для перекомпиляции, в т.ч. под другие ОС, см. в архивах файлик debian/rules, где содержатся команды сборки.

Для удобства загрузку нужных расширений можно сделать с помощью файла ресурсов:
$ cat ~/.sqliterc 
.load /usr/lib/libsqlitetcl.so
.load /usr/lib/libsqliteicu.so
.load /usr/lib/libsqlitefts3.so
.load /usr/lib/libsqlitesha1.so

$ sqlite3
-- Loading resources from /home/veter/.sqliterc

(C) Alexey Pechnikov aka MBG, mobigroup.ru