Архив блогов типа Blogger: делаем локальную копию с помощью HTTrack Website Copier



15 коммент.
Архив блога можно сделать по-разному: например, экспортом в XML с помощью встроенной функции Blogger - но это для авторов. А если нужна работающая копия блога вместе с картинками, помещёнными на другом хостинге, простым wget-ом тут точно не обойтись. И тут нам на помощь приходит httrack website copier - это offline browser, который позволяет скачивать сайты целиком. В этом посте привожу небольшое руководство по httrack, в смысле как пользоваться httrack для зеркалирования блогов а-ля Blogspot.


Мои пять копеек, или Как скачать блог на blogger для локального просмотра

Так как с помощью wget (во всяком случае версии 1.10.2) создать полностью работоспособную копию блога на blogspot не получается, будем для этих целей использовать так же входящий в дистрибутив Debian (и не только его) offline броузер под названием httrack website copier, или просто httrack далее.
Насчёт wget - друзья, мне самому он очень нравится, но есть задачи, которые ему не по зубам. Без обид, всем теоретикам от WGET: ребята, прежде, чем делать глобальные выводы, ПОПРОБУЙТЕ СВОИ РЕЦЕПТЫ! Просто скачайте чей-нибудь мало-мальски нагруженный джаваскриптами и картинками на другом хостинге блог на blogspot с помощью wget, потом откройте его offline и Вы увидите большую разницу. Поверьте, это не так просто, и я на 100% солидарен с Андреем Афанасенко и его комментариями в обсуждении этой темы: всё не так просто.
Опций, ключиков и шаманских проклятий к httrack море, но нам надо скачать блог - так что будем использовать и проверять опыт предыдущих поколений. Всё течёт и всё меняется, и на момент последней правки этого поста командная строка, которая позволяет зеркалировать для локального просмотра блог на blogspot выглядит так:
httrack "http://ВАШБЛОГТУТ.blogspot.com/" "+*.css" "+*.js" "+*.jpg" "+*.jpeg" "+*.tiff" "+*.png" "+*.gif" "+*.giff" "+*.swf" "+.ico" -v --disable-security-limits -s0 "-*666*" "-*BlogBacklinkURL*"
Кавычки обязательны. При этом хорошо бы сделать какой-нибудь каталог, в который вы будете это сваливать (например, /home/vasya/ЗЕРКАЛОБЛОГА/ ) и уже внутри этого каталога запускать httrack с вышеупомянутыми заклинаниями.
Во всяком случае для блогов на платформе блоггера эта формула работает: по крайней мере, так удалось полностью скачать блог IceWM and all around полностью, вместе с работающими ссылками на картинки (для просмотра в полный рост) и ссылками в метках, которые позволяют просмотреть все посты с одной меткой.
И ещё. Блоги некоторых особо злостных графоманов (вроде меня) занимают много, много места, так что запаситесь временем и местом на диске. Очень может быть, что сразу, за один раз, блог вытащить не удастся. Конкретно "Записки дебианщика" занимают вместе с картинками и комментариями почти 2Гб. Будучи сжатыми архиватором 7Z с агрессивными настройками, "записки" занимают 107Мб, но распакуются в те же 2Гб. Кстати скачать "Записки дебианщика" одним архивом теперь можно по этой ссылке.


Обновление локальной копии
Для того, чтобы продолжить скачивание большого блога или синхронизировать локальную версию с тем, что есть в Интернете, httrack может обновить скачанный проект. Насколько я понял, для этого нужно добавить к вышеупомянутому заклинанию ключик --update

То есть для обновления уже скачанного блога с blogspot из директории, где находится директория
hts-cache (в ней лежит файл hts-cache/doit.log который содержит все нужные параметры) и пишем:
httrack "http://ВАШБЛОГТУТ.blogspot.com/" "+*.css" "+*.js" "+*.jpg" "+*.jpeg" "+*.tiff" "+*.png" "+*.gif" "+*.giff" "+*.swf" "+.ico" -v --disable-security-limits -s0 "-*666*" "-*BlogBacklinkURL*" --update
И httrack пытается обновить проект. И обновляет его, выкачивая оставшиеся файлы. Кстати, чтобы пропускать файлы со слишком тормозных серверов, можно ещё тайм-аут для httrack поставить поменьше, добавив ключик --timeout 20 после чего тайм-аут будет 20 секунд.

Отмечу так же, что в каталоге hts-cache лежат два больших архива в формате ZIP - так вот, удалить можно только тот из них, который называется old.zip, а new.zip лучше не трогать. Дело в том, что эти файлы содержат информацию, необходимую httrack для обновления скачанного сайта, и если эти файлы удалить, то вы не сможете просто обновить копию (придётся выкачивать всё заново).


Ссылки в тему
Над этой темой бились лучшие умы блоговедения и блоготехники, достижения коих увековечены к примеру в заметке Дмитрия Конищева Создание зеркала сайта и в посте Андрея Афанасенко Архив блога/blogarchive. За что оным умам (а так же всем, кто принимал участие в обсуждениях) низкий поклон и огромная благодарность.
Так же благодарность тов.
vnaum за то, что разыскал в дебрях документации к Блоггеру ссылку на возможность получить все посты Blogger с помощью скриптов на Python.
Читать далее

Небольшая шпаргалка по командам SVN



33 коммент.
В этом посте я решил собрать простые и наиболее часто используемые мной команды svn, часть параметров и способов работы с репозиториями svn, которых я склонен забывать. Это своеобразная шпаргалка, описание subversion на простых примерах. Чтобы теперь находки по работе в subversion никуда не потерялись - им место в блоге.

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

Пример, который я люблю приводить своим студентам - их диплом. Большой документ, много текста и картинок. Обычно написание диплома в форматах, к тому не предназначенных, приводит к кошмару вида diplom-pupkin-last-best-new-cool-version45.doc с полным непониманием того, что изменилось в 44 версии и как посмотреть, много ли поменял научный руководитель в тексте с прошлой встречи. Subversion, будучи использованной вместе с LaTeX, избавляет от головной боли и других нежелательных расстройств при написании диплома или (того хуже) диссертации.


Наполнение репозитория Subversion
Репозиторий, созданный командой:
$ svnadmin create /usr/local/svn/newrepos
нужно наполнить свежими данными. Для этого есть команда svn import это быстрый способ скопировать не версионированное дерево файлов в хранилище, например:
$ svn import mytree file:///usr/local/svn/newrepos/some/project \
-m "Initial import"
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h

Committed revision 1.

Стоит заметить, что после завершения импорта, оригинальное дерево файлов не конвертируется в рабочую копию. Для того, чтобы начать работать вам необходимо создать новую рабочую копию (svn checkout) дерева файлов.


Добавление новых файлов и каталогов в репозиторий Subversion
Например, вы создаёте крупный документ в ЛаТеХе, и появился новый каталог с новыми текстами или картинками. Как их добавить в Subversion репозиторий? Очень просто:
$ svn add temp A temp A temp/Lit_obzor2_edt.tex

Теперь смотрим на статус наших файлов и видим, что против них стоит буква А - значит, они Added, то есть добавлены:

$ svn status
? image
? biblio
? optcodeimages
M draft_PhD_Konnik.dvi
! PhD_Konnik.log
A temp
A temp/Lit_obzor2_edt.tex
! PhD_Konnik.toc
M PhD_Konnik_chapter_results.tex~
! PhD_Konnik_chapter_introduction.dvi
! PhD_Konnik.aux
! PhD_Konnik.bbl
! draft_PhD_Konnik.log
! PhD_Konnik.blg
! draft_PhD_Konnik.toc
! draft_PhD_Konnik.aux
! draft_PhD_Konnik.bbl
M PhD_Konnik.dvi
! draft_PhD_Konnik.blg
M PhD_Konnik_chapter_results.tex
! PhD_Konnik_chapter_introduction.log

Они будут помещены в репозиторий при следующей отправке (commit).

Обновление рабочей копии до состояния репозитория
Файлы, находящиеся в репозитории свежее, чем у вас в рабочей копии. Дубовый вариант заключается в том, чтобы удалить свою рабочую копию и сделать chekout из репозитория. Это проходит, если репозиторий только ваш и вы уверены, что никаких изменений в рабочей копии вы не потеряете. Но есть вариант и получше:
$ svn update U
biblio/my.bib
U
biblio/my.bib.bak

Updated to revision 9.

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

Латинские буквы перед именем файла имеют свой сакральный смысл, скрытый в недрах документации сокрушительных размеров (кстати, документация очень хороша, и есть даже частичный перевод на русский тут). Собственно, буква означает действие, которое выполнил Subversion для приведения рабочей копии в актуальное состояние:
U foo

Updated — Файл foo был обновлен


A foo

Added — Файл или директория foo были добавлены в рабочую копию.


D foo

Deleted — Файл или директория foo были удалены из рабочей копии.


R foo

Replaced — Файл или директория foo была заменена в рабочей копии; это значит, что foo был удален, а новый элемент с таким же именем был добавлен.


G foo

merGed — Файл foo получил новые изменения из хранилища, однако ваша локальная копия содержит ваши
изменения. Либо изменения не пересекаются, либо они точно такие же, как ваши локальные изменения, поэтому Subversion успешно выполнил слияние изменений хранилища с файлом.


C foo

Conflicting — Файл foo получил от сервера конфликтующие изменения. Изменения с сервера пересекаются с
вашими изменениями фала.


Просмотр истории ревизий в Subversion
Часто нужно просмотреть, что и как редактировалось - для этого при отправке новых данных в репозиторий (commit) есть смысл писать содержательные и осмысленные комментарии. Если это так, то можно многое узнать о том, что и когда редактировалось:
$ svn log --revision 1:3
что значит: выдать лог ревизий с первую по третью. Увидим:
----------------------------------- r1 | penta4 | 2008-06-03 15:49:21 +0400 (Втр, 03 Июн 2008) | 1 line Initial dissertation state
--------------------------------
r2 | penta4 | 2008-06-03 16:56:01 +0400 (Втр, 03 Июн 2008) | 3 lines Committed new editions
---------------------------------
r3 | penta4 | 2008-06-03 16:58:12 +0400 (Втр, 03 Июн 2008) | 2 lines incremental ------------------------------------------------------------------------


Очень удобно, когда нужно кому-то отправить историю правок вашей программы или документа.


Просмотр изменений в Subversion
Например, нужно просмотреть изменения, происшедшие со второй по четвёртую ревизии. Легко!
$ svn diff --revision 2:4 PhD_Konnik.tex > PhD_Konnik.tex.diff.r2-4
Это выведет нам в diff-файл все изменения, а ваш любимый текстовый редактор их с удовольствием подсветит для более удобного просмотра.



Отмена изменений в Subversion

Вы сидите и правите какой-то документ - и тут с ужасом понимаете, что правите _не тот_ документ. Не беда - переносите изменения во временный файл, а для того документа, который вы нечаянно испортили, пишем:
$ svn revert UMNIK08-Report-01/Report-01-sub1-shortened.tex
Reverted 'UMNIK08-Report-01/Report-01-sub1-shortened.tex'
После этого SVN вернёт файл Report-01-sub1-shortened.tex в то состояние, в котором он находится в репозитории.


Копирование или перемещение нескольких файлов в SVN/Subversion (multiple targets move/copy in SVN)
Странно, однако SVN не понимает символов типа *, так что ваша попытка сделать так:
$ svn mv MCBC/*jpg LinuxImages/
приведёт к ошибке:
svn: Client error in parsing arguments
Чтобы не перемещать все файлы по одному, воспользуемся _ваша любимая оболочка тут_, в моём случае это Bash:
for i in *.cs ; do svn mv $i newFolder/ ; done
Конечно, если в вашей операционной системе есть нормальная консоль :-)


Выдача определённой правки файла из репозитория
Например, нам очень нужно посмотреть, каким был файл при второй правке. Для этого пишем:
$ svn cat --revision 2 PhD_Konnik.tex > PhD_Konnik.tex.v2
То есть выводим результат второй правки файла PhD_Konnik.tex и записываем его в файл PhD_Konnik.tex.v2 для дальнейшего просмотра.


Восстановление удалённых файлов в Subversion
Ну и наконец самое страшное: вы приказали Subversion удалить файл из репозитория, а потом кто-то вам говорит: этот файл нужно вернуть. На самом деле, файл, который вы удалили из SVN, никуда не делся: элемент исчезает из правки HEAD, но продолжает существовать в более ранних правках. Так что вопрос "как восстановить удалённый файл в Subversion" имеет довольно простой ответ: скопировать его из последней правки, где он был.

Главное вспомнить, как этот файл назывался. Если помним хотя бы частично имя файла (например, overview), то можно попросить Subversion вывести все упоминания о правках этого файла так:
svn log -v | grep spatialcoh -A 5 -B 5
Здесь параметры для grep такие: -A 5 это выдача 5 строк после (After) совпадения, -B 5 это 5 строк до (Before) совпадения. Получим длинный вывод вида:
spatialcoherencyexplained.eps 436 | penta4 | 2009-12-02 15:39:30 +0300 (Срд, 02 Дек 2009) | 2 lines
Changed paths:
M /PhD_Konnik_autoreferat.tex
M /PhD_Konnik_chapter_opticalcoding.tex
M /PhD_Konnik_chapter_overview.tex
D /images-opticalcoding/spatialcoherencyexplained.eps
M /images-opticalcoding/sxemacorrelator3.eps
M /latex.py
M /svnstatus.tex
M /zagashnikPhD_Konnik.tex

--
M /biblio
A /formaldocs/disserDocs.tif.7z
A /images-opticalcoding/PSFdotssize.eps
M /images-opticalcoding/PSFoutofLambdaDeltaLambdavsfromNumberOfElementsPSFRus.ps
A /images-opticalcoding/auxilaryImagesForDisser.svg
A /images-opticalcoding/spatialcoherencyexplained.eps
M /zagashnikPhD_Konnik.tex

TENGIBLE changes:
- autoreferat is improved slightly;
- Spatial coherency is improved
Красным подчеркнул я: видно, что файл
spatialcoherencyexplained.eps удалён в правку 436, и теперь хотим его восстановить. Смотрим, в какой правке файл был удалён - в 436, значит, в 435 есть его последняя копия. Восстанавливаем:
svn copy --revision 435 file:///phdthesis/images-opticalcoding/spatialcoherencyexplained.eps spatialcoherencyexplained.eps
Всё, теперь файл появится снова, вместе с историей правок (что важно) и вы можете его править дальше.

Ссылки
Разумеется, это далеко не все возможности Subversion - в данном посте не рассмотрены возможности создания и слияния веток, но в качестве быстрого введения должно хватить. Больше есть в переведённом на русский исчерпывающем мануале тут.
Читать далее

Как построить графики с погрешностями в gnuplot по экспериментальным данным



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

Для того, чтобы указать gnuplot строить графики с погрешностями, строка с командой plot в скрипте должна содержать директиву with errorbars:
  • погрешности откладываются для данных по оси Х: with xerrorbars
  • погрешности откладываются для данных по оси Y: with yerrorbars
  • погрешности откладываются для данных по обоим осям: with xyerrorbars
Величину погрешности можно посчитать для каждой точки (в зависимости от эксперимента, например, при измерениях на разных пределах) и сделать для этого в файле данных test.dat данных отдельную колонку:
#  X     Y     dX    dY
1.0 1.2 0.8 1.5
2.0 1.8 0.3 2.3
3.0 1.6 1.0 2.1


В этом случае, чтобы построить график с погрешностями по оси Y, например, последняя команда в скрипте для графика будет выглядеть так:
gnuplot> plot "test.dat" using 1:2:3 with yerrorbars
Общая идея, думаю, понятна: сначала указываются колонки, содержащие данные, а потом колонки, содержащие значения погрешностей. Таблица, любезно утянутая отсюда, даёт прекрасную иллюстрацию:

Data Format Columnusing with
(X,Y) data X Y 1:2 lines, points, steps,
linespoints, boxes, etc.
Y has an error of dY X Y dY 1:2:3 yerrorbars
X has an error of dX X Y dX 1:2:3 xerrorbars
Y has an error of dY, and
X has an error of dX
X Y dX dY 1:2:3:4 xyerrorbars
Y has a range of [Y1,Y2] X Y Y1 Y2 1:2:3:4 yerrorbars
X has a range of [X1,X2] X Y X1 X2 1:2:3:4 xerrorbars
Y has a range of [Y1,Y2], and
X has a range of [X1,X2]
X Y X1 X2 Y1 Y2 1:2:3:4:5:6 xyerrorbars


Для иллюстрации разберу два рабочих примера с построением графиков с погрешностями и аппроксимацией данных.


Пример 1. Построить график с погрешностями по обеим осям в gnuplot

Итак, есть экспериментальные данные в виде таблицы с разделителями - пробелами:

16 18 0.72 10 whiteLEDS 1 10
12 30 0.61 12 greenUltraBrightLEDS 1 10
8 200 0.45 20 HGlamp 1 15
6 1600 0.35 35 AlGaAsLser 1 50
4 17000 0.28 68 NdYAG-laser 1 900
4 25000 0.27 70 HeNeLaser 1 1100

Нужно построить зависимость первой колонки от второй, при этом погрешности по оси X составляют 7% от данных, а по оси Y указаны в колонке 7. Вот такой при этом получается код для gnuplot:

#! /usr/bin/gnuplot -persist
set terminal postscript 'NimbusSanL-Regu' eps enhanced
set output "./plot/PSFoutofLambdaDeltaLambdavsfromNumberOfElementsPSF.ps"
set encoding koi8r
set xlabel "Light's monochromaticity, {/Symbol l}/{/Symbol D}{/Symbol l}" font "NimbusSanL-Regu,18"
set nokey
set bmargin 4
set ylabel "Number of resolvable points of the PSF's kinoform" font "NimbusSanL-Regu,18"
set logscale x
set grid
set xrange [1:100000]
set mxtics 10
set style line 1 lt 1 pt 7 ps 0.5
plot "./PSFoutofLambdaDeltaLambda.txt" using 2:((300/$1)**2):7:(((300/$1)**2)*0.07) with xyerrorbars linestyle 1, "./PSFoutofLambdaDeltaLambda.txt" using 2:((300/$1)**2) smooth bezier with lines


Результат строительства графика:
Что в этом коде (и графике) есть примечательного, заставившего меня таки покопаться в мануале?

Ну например то, что при строительстве данных с погрешностями вам не удастся использовать линии: опция with linespoints не пройдёт и gnuplot будет выдавать ошибки. И это правильно: экспериментальные данные соединять непрерывной линией - моветон. Так что используем только linestyle 1 который определён так: set style line 1 lt 1 pt 7 ps 0.5 Это значит: тип линии 1, стиль точек 7, размер точки на графике 0.5. Крайние точки я просто соединил кривой Безье, о чём честно написал в коде графика: smooth bezier with lines

Ну и наконец нужно было построить квадратичную зависимость по оси Y, что реализовано так: ((300/$1)**2) то есть число 300 делится для каждой точки на значение в первой колонке, результат возводится в квадрат.



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

#! /usr/bin/gnuplot -persist
set terminal postscript 'NimbusSanL-Regu' eps enhanced solid
set yrange [0.1:10000]
set logscale x
set logscale y
set mxtics 10
set mytics 10
set grid xtics ytics mxtics mytics
set format y "10^{%L}"
set format x "10^{%L}"
set mxtics 10
set output "./plots/1RAWMEANtoSaturateLineApproxcomparingLogscale.ps"
set encoding koi8r
set xlabel "Exposure value, rel. units" font "NimbusSanL-Regu,18"
set ylabel "Signal mean value, DN" font "NimbusSanL-Regu,18"
set key bottom right
set bmargin 4
set style line 1 lt 2 pt 7 ps 1
f(x) = (a*x)+b
fit f(x) "./RAWMEANmeasurementresult" using 4:($3-255.22579) every ::4::35 via a,b
plot "./RAWMEANmeasurementresult" using 4:($3-255.22579):7 title "Digital values of photosensor signal" with yerrorbars linestyle 1, f(x) title "linear fitting function" with line


Сейчас маэстро Воланд скромный автор сих строк разоблачит этот опыт. Первое, что надо разоблачить - аппроксимацию прямой. Здесь сначала задаётся функция f(x) = (a*x)+b которая далее подгоняется под данные using 4:($3-255.22579) из которых вычитается постоянная величина (эксперимент такой был). Далее при подгонке я потребовал от gnuplot
использовать только точки с 4 по 35-ю every ::4::35 и, наконец, подогнать коэффициенты a и b под данные via a,b.

Здесь я отмечу то, что сам часто забываю: директиву every можно использовать не только при подгонке, но и для других графиков. Для этого полезно иметь перед глазами таблицу, которую изваял автор not so Frequently Asked Questions:

every I:J:K:L:M:N
I Line increment
J Data block increment
K The first line
L The first data block
M The last line
N The last data block
every 2 plot every 2 line
every ::3 plot from the 3-rd lines
every ::3::5 plot from the 3-rd to 5-th lines
every ::0::0 plot the first line only
every 2::::6 plot the 1,3,5,7-th lines
every :2 plot every 2 data block
every :::5::8 plot from 5-th to 8-th data blocks

Теперь осталось построить два графика на одном:
plot "./RAWMEANmeasurementresult" using 4:($3-255.22579):7 title "Digital values of photosensor signal" with yerrorbars linestyle 1, f(x) title "linear fitting function" with line

То есть строим зависимость колонки 3 от 4 и используем колонку 7 как источник погрешности. При этом накладываем аппроксимационную линию с помощью директивы f(x) title "linear fitting function" with line

Собственно, вот итог моих фокусов:

Красиво и вполне себе презентабельно, хоть в Nature отправляй.
Читать далее

Ребрендеринг блога, Эпизод 2: Новая надежда



29 коммент.
Что, не ждали!? А вот оно как! Даже отчаянные консерваторы и поклонники тезиса "Не сломалось - не чини" иногда делают это... А если серьёзно, то на смену шаблона меня подтолкнул мой старинный товарищ SAV, который однажды на линукс-поинте деликатно мне намекнул на страшные тормоза с отрисовкой шаблона моего блога. Ну, думаю, раз такое дело, надо принимать меры. И я их принял, о чём далее.

Новый шаблон я несколько обточил перед тем, как сломать старый, но блог "Записки дебианщика" (вместе с самим дебианщиком :-)) немного покукожит и поплющит, так как большая часть виджетов слетела и их надо восстанавливать героическим самоотверженным трудом. А в этом нелёгком деле авторский коллектив призывает на помощь благодарных читателей, дабы оные кидали тухлые помидоры в места наибольших скоплений багов.

Обновлено: на удивление, всё прошло довольно быстро и с минимальными потерями. Виджеты я перетащил со старого шаблона, самые занудные виджеты реализованы уже в Блоггере (гугловцы не дремлют).

Новая идея такая: на главной - только один пост, и при том укороченный (с помощью fullpost). Все кнопки, виджеты и гаджеты снесены в подвал (вниз страницы) - это особенность нового одноколоночного шаблона. Так как здесь важен текст, а не навороченное оформление, я выбирал самый простой шаблон при внешней презентабельности и минимализме. Основной шрифт Trebuchet - как и прежде, и по крайней мере в Firefox масштабируется колесом мыши без косяков.
Обращаю внимание пользователей Microsoft Internet Explorer: в коде шаблона о вашем браузере написано много нехороших слов, так что если что-то отображается неправильно, то в этом виноваты не только кривые руки автора блога :-)
Так вот, пост на главной один, а остальное ищется локальным поиском (внизу слева), с помощью облака тегов или непосредственно по архиву блога (стандартный гугловский виджет). Функциональность вроде не пострадала. Предложения по улучшению принимаются (и пока у меня есть время их воплотить).

Немножко истории
Решил выложить предыдущие версии блога - как он выглядел раньше.
Сначала я решил не мудрствовать и просто выбрал стандартный шаблон Sand Dollar, но выглядит он вполне сносно:


Потом был шаблон с листьями, который я нашёл где-то на окраине Интернета и который я установил тогда, когда был Великий Переход Blogger со статических шаблонов на динамические (после этого отпала необходимость делать Republish your blog - ветераны помнят, что это). В шаблон с листьями я со временем напихал столько хаков и джаваскриптов, что со роптать начали даже самые стойкие орлы. Шаблон содержал постоянно регенерируемую градиентную заливку (без неё шаблон не смотрелся вообще) - выглядел красиво:


... но тормозить под нагрузкой джаваскриптов стал безбожно.
И вот, когда в очередной раз мне начали выносить мозг написанием научно-технического отчёта и переоформлением его в Microsoft Word (ну, вы поняли, да?), мне и пришла в голову шальная мысль - а не сменить ли мне шаблон. Полдня поисков, и вот, собственно, результат.

Тормозить здесь просто нечему (в шаблоне только одно внешнее изображение - в заголовке). Код довольно прост и компактен, а большая часть хаков стали не нужны, так как они уже реализованы командой Blogger.

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

Маршруты и треки с помощью GPS-навигаторов Garmin



6 коммент.
Отслеживание перемещений по GPS (tracking) это довольно интересная и полезная возможность современных навигаторов. Например, вы пошли в поход или просто в парк, и долго блуждали, пока искали правильный путь - со включённым отслеживанием вы потом сможете дома посмотреть, как можно было бы срезать путь. Или, что тоже важно, по этим данным можно найти обратную дорогу.

Собственно, на навигаторе всё довольно просто: в зависимости от модели, трекинг включается одной-двумя кнопками (в Garmin GPSmap 60CSX - главное меню - Track - ON). После этого на экране должны оставаться точки, которые обозначают ваш путь по местности. Эти данные в абсолютных координатах хранятся в самом навигаторе, и скачать их оттуда можно в Linux довольно просто.

Скачиваем треки в гармине под Linux
Для этого нам понадобится консольная утилита gpsbabel. Её исходники нужно скачать с официального сайта (или посмотреть в репозиториях своего любимого дистрибутива) и собрать. Далее в нашем распоряжении появляется собственно gpsbabel, с помощью которого треки и скачиваем. Вот как это происходит (утянуто у тов. jetxee из этого поста):

Можно загрузить трек и точки маршрута с устройства при помощи программы gpsbabel, из командной строки. Если устройство подключено к /dev/ttyUSB0, а нужен трек с точками в формате GPX, то получить его можно так:
$ gpsbabel -t -w -i garmin -f /dev/ttyUSB0 -o gpx -F мойтрек.gpx
Другой способ получить эту информацию — скопировать с устройства GPX-файл в режиме USB Mass Storage, а потом уже его конверировать-преобразовывать… Этот файл с названием вида ГГГГММДД.gpx появляется на карточке памяти только если включена соответствующая функция в приборе.

Ну и зачем это всё надо!?
Ответ на этот вопрос я хочу дать в виде примера. Вот, например, был я не так давно в замечательном парке Покровское-Глебово. Парк этот замечателен в первую очередь тем, что его вовсе не так просто найти, как это может показаться на первый взгляд, а найдя - ориентироваться в нём. Для меня это превратилось в увлекательное путешествие и освежение в памяти навыков спортивного ориентирования на местности, чем я увлекался в горячую пионерскую юность...

Итак, по результатам моих хождений по мукампо парку, появился файл с расширением GPX, который я скачал с помощью gpsbabel (см. немного выше). И что с ним, спрашивается, делать? А вот что. Скачиваем замечательную программу JOSM, которая позволяет редактировать карты OpenStreetMap (OSM). Как легко догадаться, программа на Java, и просит эту саму джаву не древнее версии 1.5. Выглядит сама программа примерно так:


После этого можем скачать карту с OpenStreetMap и загрузить её в JOSM для просмотра. Интерфейс на Java, так что набираемся терпения и ждём, пока отрисуется. Далее можно открыть скачанный трек в формате GPX и он должен стать новым слоем (над картой). Тонкая серая извилистая линия, помеченная на скриншоте красными стрелками, это и есть мой путь по парку.
Собственно, из него я потом узнал, как пройти более коротким путём и что в парке мне не удалось с первого захода посмотреть. Довольно удобно так же использовать трекинг для редактирования OpenStreetMap, особенно если вы хорошо знаете район - с помощью треков можно вносить в карты улицы и дома. Но об этом как-нибудь в следующий раз...
Читать далее

Garmin 60CSx: технические особенности устройства и карты для Garmin



8 коммент.
В этом посте мне хотелось собрать раскиданные там и сям разные технические особенности GPS-навигатора Garmin 60CSx. Кроме того, несколько замечаний о картах для Garmin 60CSx. Собственно, о них далее.

Где скачать карты для Garmin? Собственно, на торрентах или пойти и честно воспользоваться картами OpenStreetMaps.
Уже готовые карты OSM по городам есть здесь. Или можно отправиться на сайт OpenStreetMaps, зарегистрироваться там и скачать карту нужной области честно и бесплатно.

Для этого заходим на http://www.openstreetmap.org/ и регистрируемся. Далее выделяем область карты, которую хотим экспортировать (для последующей закачки в навигатор), жмём на Экспорт и просим карту в OSM формате - через некоторое время получаем файлик map.osm. Теперь скачиваем mkmap отсюда, как завещал ув.тов. jetxee в своей бессмертной статье, оно на джаве и требует сановскую джаву версии старше 1.5. С её помощью компилируем в полученный OSM-файл в img формат. Получившийся файл заливаем в гармин с помощью sendmap.

Однако с картами OpenStreetMap есть одна проблема: не дают скачать сразу большую карту (я с жадности запросил у сервера векторную карту всей Москвы с областью). Если нужны большие карты, например, всей РФ, можно податься на Cloudmade.com и скачать оттуда. Этот сайт содержит уже скачанные карты местностей в формате OSM (которые мы потом перегоняем в img для Гармина) и собственно файл IMG, который можно закачать в навигатор.


Закачивание карт в Garmin 60CSx
По сообщениям разных осведомлённых орлов, во внутренней памяти (internal) может находиться до 3 карт, тогда как на флешке (microSD) - только одна. Хотя, как совершенно справедливо попенял многоуважаемый комментатор diaword, на самом деле, никто не мешает скачать несколько карт и потом собрать из них одну. Это можно сделать с помощью утилиты Mkgmap, а её ключик --gmapsupp позволяет собрать результирующую карту из нескольких отдельных и потом залить в навигатор. Файл gmapsupp.img является архивом из нескольких карт *.img, причем их можно как упаковывать, так и обратно распаковывать с помощью sendmap.

А такой финт, как закачка четырёх файлов карт сразу:
Gmapbmap.img -- базовая карта
Gmapsupp.img -- ваша карта
Gmapsup2.img -- другая карта
Gmapprom.img -- другая карта
на Garmin 60CSx не проходит, к сожалению.

Размер одной карты (img-файл) не может превышать 2Gb, хотя карта может состоять из кусков, число этих кусков не может быть больше 2025.

Комментарий насчёт экрана Garmin 60CSx
В Сети есть много критики по поводу низкого разрешения (160х240 пикселей) трансфлективного экрана у 60CSx. Критика понятна, так как есть другие навигаторы с более высоким разрешением. Но друзья, мы же помним, зачем гарминовцы эту модель выпускали? Правильно, для туристов, рыбоволовов, любителей активного отдыха и прочих экстремалов. Там важно не любоваться на карты, а быстро понять, где ты находишься.

Чтобы дать понять всю прелесть экрана 60CSx в походных условиях, вот фотография face-to-face: мой телефон Motorola 1200AE и 60CSx. На мобильнике подсветка включена на полную катушку, а на Гармине она не включена вообще.

И кто из них продержится дольше - думаю, понятно.


Память и подключение
Подключение происходит через miniUSB кабель как в режиме MassStorage, так и по специльному протоколу. И тот, и другой вариант поддерживаются в Linux.
В комплекте идёт карта microSD на 64Mb, максимальная поддерживаемая ёмкость карты 4GB micro SDHC.

Батареи

Удобнее использовать комплект аккумуляторов: от двух NiMH аккумуляторов ёмкости 2700mA*h устройство будет работать 16-20 часов.
Читать далее

QtOctave - графическая оболочка для Octave



13 коммент.
Хотя MATLAB и правит миром численных математических расчётов, в этом деле ему зреет очень хорошая альтернатива - GNU/Octave. И хотя у Октавы много проблем, таких как слабая документация и в основном консольный режим работы, есть и хорошие новости: проект QtOctave, ставящий своей целью сделать графическую среду разработки для Octave, весьма неплох. О нём и будет этот небольшой пост.

Установка
Для того, чтобы поставить QtOctave, вам потребуется скачать бинарник с сайта авторов и установить пакет octave в вашем дистрибутиве. Собранный и готовый бинарник прямо с сайта qtoctave_binaries_Linux_i386-0.8.1_svn166.binaries.tar.bz2 . Далее устанавливаем QtOctave по инструкции, то есть делаем sudo ./install.sh

В свежих версиях дистрибутивов QtOctave наличествует в репозиториях, и установить её можно просто и легко:
aptitude install qtoctave
По зависимостям потянется и новая версия GNU/Octave, если она ещё не установлена.


Работа
Собственно, открываем графическую консольку и пишем:
qtoctave
Перед вами развернётся графическая благодать, в которой замигает разноцветными огнями вся неимоверная мощь Octave. Разворачиваем одно из окон и открываем там свой скрипт на MATLAB\Octave. Выглядит это так:

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


Сразу из замеченных недостатков: в графической консоли внутри QtOctave нельзя использовать подсказку по клавише TAB, при этом оно переходит в режим правки. Так же хотелось бы попенять на то, что QtOctave
не сохраняет расположение окон. Но это в общем не так бросается в глаза: при некотором навыке работы с Октавой или Матлабом работать вы будете не с консолью, а с редактором, как уже описывалось ранее.

Так же в комплекте идёт справка в формате HTML, причём весьма добротная. Конечно, до матлабовской ещё очень и очень далеко, но уже что-то. И главное, что это в комплекте, то есть batteries included.
То есть можно не только работать в Octave, но ещё и получать справку по командам, хотя и весьма базовую.


Заключение

В целом впечатление QtOctave производит очень благоприятное. Хотя Octave можно пользоваться таким же способом, как и MATLAB, о чём уже писалось, просмотр переменных и история команд в графическом виде это очень полезные возможности QtOctave. Хочется пожелать успехов проекту и дальнейшего развития.

Так же можно посмотреть в сторону
Python и SciPy. Как советуют товарищи питонисты, для этого есть следующие инструменты:
  • Python(x,y) готовый дистрибутив питона для научных нужд (batteries included).
  • SPYDER (графическая оболочка, входит также в Python(x,y) в дополнение к Eclipse)
Так же можно посмотреть в сторону IPython.

К сожалению, главный (и единственный!) разработчик QtOctave прекратил работу над проектом. Вот чем стоило бы заняться, КДЕшники, а не пилить свистульки типа фильтров Ланцоша и прочей мишуры...
Читать далее

Научная поисковая система на вашем Linux-десктопе



10 коммент.
Некоторое время назад я писал о SWISH++, и вот теперь мне хотелось бы обобщить написанное в более краткой форме. Проблема поиска нужной статьи, если не помнишь точно где она находится в каталогах, действительно серьёзная.


1. Поиск дубликатов
Итак, когда я накачал нужных мне статей из Интернета, я прежде всего смотрю, есть ли они у меня в коллекции с помощью fdupes. Эта программа ищет дубликаты файлов:
$ fdupes -rd .
Точка в конце говорит о том, что искать дубликаты fdupes будет, начиная с текущего каталога, поэтому можно в каталоге со статьями сделать подкаталог 1/ и набросать туда скачанные статьи.

Fdupes сравнивает файлы как побайтово, так и с помощью подсчёта md5-суммы, работает невероятно быстро, сортировка производится в полуавтоматическом режиме: программа выводит в консоли дублирующиеся файлы и спрашивает, какой из них оставить. Об этом уже говорилось в статье о подходах к сортировке PDF-файлов.


2. Индексация текста в PDF-файлах
Сначала из
документов pdf вытаскиваем текст, для чего просим утилиту find найти все файлы PDF и для каждого найденного выполнить pdftotext без выдачи предупреждений и без вставки символов разрыва страницы:
find -name '*.pdf' -exec pdftotext -nopgbrk -q {} \;
Надо отметить, что pdftotext хорошо работает только для английского языка, на котором, в общем, все статьи и написаны.

Теперь индексируем все текстовые файлы - в этом нам поможет собрат SWISH++ по имени index++ для индексации текстовых файлов:
index++ -e "text:*.txt" .
Точка в конце означает, что поиск ведётся с текущего каталога. Подробнее об индексации и автоматизации этого процесса сказано здесь.

В результате в текущем каталоге появится файл swish++.index где, собственно, лежит информация об индексировани файлов. Теперь всё готово для поиска.


3. Ищем в архиве статей нужное
Для поиска используем search++ которая найдёт по нашему запросу в индексированной базе swish++.index файлы. Вот пример поиска статьи по математической морфологии, в которых нет упоминания про медицину:
$ search++ morphology and erosion and dilation not medicine
Мгновение спустя вижу результат (вывод сокращён):
# results: 125
99 ./Krylov2.txt 3771 Krylov2.txt
49 ./13300407.txt 3103 13300407.txt
46 ./morph1.slides.printing.6.txt 4369 morph1.slides.printing.6.txt
37 ./lecture_morphology_sara.txt 6746 lecture_morphology_sara.txt
30 ./SIGGRAPH2002_Sketch-Mitchell.txt 5308 SIGGRAPH2002_Sketch-Mitchell.txt
26 ./MorphologicalImageProcessing.txt 7642 MorphologicalImageProcessing.txt
25 ./phdsymp2002_ledda.txt 8298 phdsymp2002_ledda.txt
23 ./lab2_manual.txt 9313 lab2_manual.txt
23 ./Project 1.txt 9946 Project 1.txt
22 ./morphology.txt 11212 morphology.txt
22 ./edg/morphology.txt 11212 morphology.txt
22 ./slides-6-geometry.txt 11717 slides-6-geometry.txt
22 ./V1BFOGG8.txt 10797 V1BFOGG8.txt
18 ./71650638.txt 13978 71650638.txt
Первая колонка - релевантность, вторая - расположение файла относительно текущей директории, третья - размер файла, четвёртая - имя. Просто и понятно.

Теперь в консольке набираю kdpf
./Krylov2.pdf и смотрю нужную мне статью. И всё.

Ссылки
Собственно, документации о SWISH++ очень мало, так что в основном я решил собрать свои предыдущие записи в один пост:
- поиск и удаление дубликатов файлов с помощью fdupes;
- выделение текста из PDF-файлов и их индексация;
- поиск в индексированных файлах с помощью SWISH++
Читать далее

Чтение MAT-файлов MATLAB в nip2



3 коммент.
То, о чём так долго говорили красные, белые, зелёные, и даже голубые - свершилось. Теперь замечательный графический анализатор nip2 полностью поддерживает чтение MAT-файлов, в которых MATLAB записывает данные рабочего окружения с двойной точностью (double precision). И хотя в основной ветке этой возможности ещё нет, в SVN-репозитории оно уже появилось благодаря скромным усилиям автора этих строк и John Cupitt - одного из авторов nip2 и библиотеки VIPS.

На всякий случай: nip2 это графический анализатор изображений (это не привычный gimp или photoshop), который создавался специально для работы с огромными файлами и научных применений. Но он может быть полезен и простым пользователям: с его помощью легко открывать, просматривать, кадрировать огромные файлы. Или, например, склеить две фотографии в одну - как склеивают панорамы.


Для чего нужно открывать MAT-файлы в nip2
Упреждая возможные вопросы "а зачем нам проприетарный mat когда есть csv" отвечу: запись в открытый формат CSV в матлабе происходит несколько нетривиальным образом и можно записать только одну переменную. Более того, если забыть указать несколько важных параметров, можно сильно потерять в точности сохраняемых данных. И главное, что уже много результатов научных экспериментов сохранено в MAT-формате.

Периодически возникает необходимость быстро просмотреть эти данные (это изображения) в каком-нибудь просмотрщике без необходимости загружать MATLAB. Таковых просмотрщиков я не знаю - открыть MAT-файл может только GNU/Octave с помощью библиотеки matio. Так что эта возможность очень нужна и востребована.

Установка nip2 и VIPS

Хотя об установке nip2 я уже писал, тем не менее, повторюсь. Сначала нужно скачать отсюда из support-зоны самый свежак. Сначала собираем VIPS и устанавливаем пакет, потом собираем nip2 и тоже устанавливаем. Последние версии (vips7.18.XX) со старыми версиями Питона могут не собраться, так что для этого при сборке пользуем ключ --without-python и собираем.

Для себя и своих студентов я собрал пакеты под Debian Etch и архитектуру i386 (да-да, я в конкретном бронепоезде):
После этого добавляем программу в меню вашего оконного менеджера или запускаем прямо из графической консоли командой nip2.


Просмотр MAT-файлов MATLAB в nip2

Здесь всё довольно просто: в диалоге открытия явно указываем, что хотим просмотреть MATLAB's mat-files и далее открываем такой файл. Пример на скриншоте - легендарная Лена
(а кто такая Лена?)


А теперь примерчик посложнее - загружаем изображение усреднённых темновых шумов цифровой камеры и берём от них Фурье-преобразование (на том же скриншоте открыта в левом нижнем углу неудачная фотография от скоростной съёмки):


Так что наши данные теперь можно просмотреть без томительного ожидания, пока MATLAB откроет эти файлы. Кстати о данных в форматах CSV и MAT...


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


Подготовка
Ответ состоит из нескольких частей. Да, Матлаб может сохранять данные в своём формате mat, и его может прочесть та же Octave (теперь и nip2 с использованием библиотеки matio). Для проверки сгенерируем матрицу

>> a = magic(5)

a =

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

>> b =a./3

b =

5.6667 8.0000 0.3333 2.6667 5.0000
7.6667 1.6667 2.3333 4.6667 5.3333
1.3333 2.0000 4.3333 6.6667 7.3333
3.3333 4.0000 6.3333 7.0000 1.0000
3.6667 6.0000 8.3333 0.6667 3.0000

>> b(2,2)=1.09878432753084573248523475
>> b(2,3)=2^20

Видим только первые четыре числа после запятой - это потому, что по умолчанию MATLAB отображает числа в коротком формате. Изменить этот формат можно командой format type.

Чтобы сделать задачу более наглядной, в матрицу записали два числа: одно с разными числами после запятой, а второе - очень большое (2^20). Теперь сохраняем в MAT-файл и CSV командами:
save('magic5x5doubleafterformatlong.mat', 'b'); %% это сохраняется MAT-файл
csvwrite('magic5x5double-afterformatlong.csv',b); %% это сохраняется CSV-файл

Теперь открываем их и сравниваем с исходниками...

Данные в MAT-файле.
В MAT-файлах всё чисто: он сохраняет так же, как и открывает.
>> load('magic5x5doubleafterformatlong.mat')
>> b
b =
1.0e+06 *
Columns 1 through 4
0.00000566666667 0.00000800000000 0.00000033333333 0.00000266666667
0.00000766666667 0.00000109878433 1.04857600000000 0.00000466666667
0.00000133333333 0.00000200000000 0.00000433333333 0.00000666666667
0.00000333333333 0.00000400000000 0.00000633333333 0.00000700000000
0.00000366666667 0.00000600000000 0.00000833333333 0.00000066666667
Column 5
0.00000500000000
0.00000533333333
0.00000733333333
0.00000100000000
0.00000300000000
>> b(2,2)
ans =
1.09878432753085
>> b(2,3)
ans =
1048576

Данные в CSV-файле.
А вот тут начинаются приключения. MATLAB записывает в CSV формат данные с точностью, такой же, как при отображении. То есть, например, при отображении используется вывод только первых 4 чисел после запятой - следовательно, сохранены они в CSV будут так же.

>> b(2,2)

ans =

1.0988

С большими числами тоже самое: они сохраняются в экспоненциальной форме с точностью, установленной для отображения (по умолчанию 4 знака). Это так же видно в CSV-файле (записывает с той точностью, с которой отображает). У одной и той же матрицы, сохранённой в CSV и MAT сходный размер.


>> b(2,3)=2^20

b =

1.0e+06 *

0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 1.0486 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000

>> b(2,3)

ans =

1048600

>> 2^20

ans =

1048576

Именно так оно и происходит по умолчанию: MATLAB просто округляет числа при записи в CSV до четырёх значащих чисел. Для того, чтобы запись происходила с нужной нам точностью в CSV, следует использовать команду dlmwrite и явно указывать точность. Например так:

>> dlmwrite('magic5x5double1-dlmwrite-precision12f.csv', b, 'precision', '%12.12f')

Это записывает матрицу в CSV формат с переменной b и обеспечивает точность 12 значащих чисел. Так что стоит аккуратнее обходиться с командами записи: csvwrite вам запишет, конечно, переменную, но с малой точностью. Это может стать источником трудноуловимых проблем.


Отображение данных в MAT и CSV форматах в nip2
Теперь, возвращаясь к теме поста, в последних версиях (nip2 и vips > 7.18.2) замечательного графического анализатора nip2 можно просматривать не только данные в CSV, но и в MAT-файлах. Это очень и очень удобная возможность: например, усреднённое изображение в MAT-файле можно проанализировать и посмотреть без необходимости загружать лишний раз MATLAB. Особенно это актуально, если изображение в MAT-файле больших размеров. Точность просмотра CSV и MAT-данных составляет 5 значащих цифр.
Читать далее

MOCP - Music On Console player, или Играй, гармонь!



20 коммент.
Время от времени нужно выходить в консоль и гасить иксы - для изменения иксовых же настроек или обновлений, связанных с иксовыми пакетами. И сидеть в это время в тишине совсем не хочется. Конечно, можно запустить XMMS на ноутбуке и проигрывать музыку оттуда, но есть решение лучше: MOCP. Запустил MOCP в консольке, скрыл - и музыка заиграла. Вышел из иксов что-то поправить в консоли - а гармонь-то поёт :-)

Если б гармошка умела
всё говорить, не тая...
(с) Песня, из которой слов не выкинуть

Об этом замечательном плеере уже писал Андрей aka vonderer здесь. Из той песни тоже слов не выкинуть, но я немного подробнее остановлюсь на управлении плеером. Как любое хорошее приложение, оно управляется горячими клавишами, и основные клавиатурные сокращения такие:
  • ENTER – переключиться в директорию и\или начать воспроизведение песни
  • o – проиграть URL (например, интернет-радиостанции)
  • p или пробел – пауза
  • s – стоп
  • l – переключиться между одно- и двухпанельным режимом
  • a – добавить текущий файл в список воспроизведения
  • A – добавить текущую директорию в список воспроизведения
  • C – очистить список воспроизведения
  • q – отключить консольный интерфейс (сервер MOC будет продолжать воспроизведение, к нему можно подключиться снова, набрав mocp)
  • Q – отключение MOC-сервера (прекращение воспроизведения)

Так же можно воспользоваться более широкими возможностями по управлению плеером с помощью следующих клавиатурных сокращений:
  • n -- проиграть следующую песню из списка
  • b -- проиграть предыдущую песню из списка
  • S -- воспроизведение в произвольном порядке
  • R -- повторяет выбранную песню циклически
  • u -- перемещает элемент списка воспроизведения вверх
  • j -- перемещает элемент списка воспроизведения вниз
  • g или / -- ищет заданную строку в именах фалов песен
  • r -- перечитать директорию заново
  • f -- переключить режим отображения с имён файлов на теги
  • TAB -- переключение между списком воспроизведения и файлами песен
  • H -- показывает скрытые файлы
  • Ctrl-t -- показать или убрать длительность песни в списке
  • Ctrl-f -- показать или убрать формат песни
  • U -- переместиться на уровень выше в директории
  • a -- добавить файл к списку воспроизведения
  • A -- добавить каталог к списку воспроизведения
  • C -- очистить список воспроизведения
  • V -- сохранить список воспроизведения
  • d -- удалить отмеченные песни из списка воспроизведения

Наконец, управление громкостью
  • < -- уменьшить громкость на 1%
  • , -- уменьшить громкость на 5%
  • >— увеличить громкость на 1%
  • . — увеличить громкость на 5%
Если вы запамятовали какую-нибудь команду, то получить справку по клавиатурным сокращениям можно клавишей "?"

Язык осин и берёз MOCP по умолчанию отображает славяно-греко-латинской мешаниной, что легко поправить. Для этого копируем пример конфига отсюда:
$ cp /usr/share/doc/moc/examples/config.example.gz ~/.moc/
$ cd ~/.moc
# chown $USER config.example.gz
Где $USER - имя пользователя в системе. После этого разархивируем конфиг:
$ gunzip config.example.gz
$ mv config.example config
И правим его своим любимым текстовым редактором. Чтобы заставить MOCP дружить с кириллицей в ID3v1-заголовках, необходимо найти строку:

#ID3v1TagsEncoding = WINDOWS-1250

и превратить ее в

ID3v1TagsEncoding = WINDOWS-1251
И всё, играй, гармонь!
Читать далее

Как обналичить чек Google Adsense в Москве



15 коммент.
Некоторое время назад на блоге появилась контекстная реклама Google AdSense, чтобы несколько поддержать моё материальное благосостояние. И вот я получил свой долгожданный чек на целых сто восемнадцать долларов. Казалось бы - что такого, всего лишь обналичить чек? Но вот тут-то история и начинается...

Пусть этот пост немного не в тему блога, просто мало ли кому пригодится (или я снова буду обналичивать чек от AdSense). Итак, мы имеем чек Google AdSense, который выпустил Citibank в США. Такие чеки выглядят так:



Всего делов - обналичить чек. Для этого мы обзваниваем окрестные банки и говорим, как совершенно правильно советуют старшие товарищи, что нужно СДАТЬ ИМЕННОЙ ЧЕК НА ИНКАССО.

Услуга это не массовая, и скорее всего придётся ехать в центральное (головное) отделение банка. Операция проводится довольно долго (у меня заняло около 40 минут вместе с открытием счёта), так что запасаемся терпением. Ниже - итоги моих странствий со счастливым концом :-)

Краткий обзор пунктов приёма именных чеков Google AdSense на инкассо в Москве

Сразу заявляю: я звонил в те банки, которые либо близко от меня территориально, либо где у меня уже открыты счета. Все данные актуальны на Июль 2009 года. Так как всё течёт и меняется, лучше перед походом не полениться и позвонить в банк.

Итак, чеки Google AdSense соглашается брать:

  • РБР, Русский банк развития (ФК Открытие): комиссия 1% от суммы (минимум 5$) + 900 руб (!) на почтовые расходы + комиссии сторонних банков. Время - не более 1 месяца. Только в головном отделении. Требуется открытие счёта.
  • Банк Москвы: комиссия 350 рублей, вроде (?) счёт открывать не обязательно, сроков назвать не могут.
  • Юниаструм банк: комиссия 500 рублей (= 21$), открытие счёта, головное отделение. Время 1-2 месяца.

В Райффайзен Банк, Альфа-банк и БинБанк можно не звонить и не тратить время - чеков не берут.


Теперь личные впечатления.

Несмотря на то, что в РБР у меня открыт счёт, комиссия у них просто грабительская: 1% от суммы и 900 рублей на почту + комиссия сторонних банков. Я, конечно, понимаю здоровое желание банков подзаработать, но всё имеет свои пределы.

Банк Москвы так же порадовал: по телефону бодро пообещали, что обналичить могут в любом офисе, но я, зная цену таким обещаниям, поехал в головное отделение. Дальше начинался цирк с конями: в головном офисе обналичка чеков только до 18:00 (хотя отделение работает до 20:00) и срока обналички назвать не могут (!). Такой восхитительный бардак, впрочем, неудивителен, судя по отзывам клиентов о самом банке.

Решив, что нервы дороже, поехал в Юниаструм банк. Путь неблизкий, но он того стоил. Персонал очень вежливый и приветливый, клиентов немного, на всю операцию (открытие счёта, приём чека на инкассо, оплата комиссии) ушло около 40 минут. В итоге: открыт валютный счёт, но без карты (комиссия не берётся, как и деньги за обслуживание), через 45 дней деньги можно забрать по паспорту в любом отделении Юниаструмбанка.

Не так давно (конец августа 2009) я зашёл в местный доп.офис Юниаструма и, после некоторых объяснений, забрал свои кровные 110$ американских рублей. Правда, с меня взяли комиссию в 1.5% "за безналичный перевод" - это составило около полутора долларов. На всё ушло около 40 дней, как и было обещано банкирами.
Читать далее

Закачка карт в GPS навигатор Garmin GPSMap 60CSx



15 коммент.
Не так давно решил разориться на GPS-навигатор, так как по многим местам приходится мотаться и ходить по отечественным картам уже нет никакой возможности. Вспомнив о том, как ув.тов. jetxee нахваливал Garmin GPSMap 60CSx, решил его прикупить. Естественно, сразу встал вопрос о том, как закачивать в него карты.


Выглядит он как достаточно крупных габаритов мобильник (середины 90-х, если кто помнит). Покупал на ebay, так как платить две цены здесь желания особого нет. Отсюда есть одна особенность: навигатор с английским меню, так что русские карты должны быть в транслитерации.

Итак, вариантов закачки карт в GPS-навигатор, собственно, два: через эмуляцию /dev/ttyUSB0 по закрытому протоколу Garmin и по Mass Storage.

Закачка карт в GPS-навигатор по протоколу Garmin
Этот вариант оказался самым жизнеспособным. Если ваше ядро собрано с поддержкой garmin_gps, то после подключения навигатора к USB штепселю ядро нам должно написать в логах dmesg так:
usb 4-1: new full speed USB device using uhci_hcd and address 3
usb 4-1: configuration #1 chosen from 1 choice
drivers/usb/serial/usb-serial.c: USB Serial support registered for Garmin GPS usb/tty
garmin_gps 4-1:1.0: Garmin GPS usb/tty converter detected
usb 4-1: Garmin GPS usb/tty converter now attached to ttyUSB0
usbcore: registered new interface driver garmin_gps
drivers/usb/serial/garmin_gps.c: garmin gps driver v0.28
Выделенная строчка нам говорит о том, что у нас появился новый порт имени /dev/ttyUSB0 куда мы будем закачивать наши карты.

Где взять карты для GPS-навигаторов Garmin?
Это философский вопрос, и в одном посте на него не ответить. Но для начала можно воспользоваться открытыми картами OpenStreetMaps (после регистрации имеем возможность экспортировать нужные вам куски карт в XML формат).

Уже собранные карты для Garmin, на всякий случай, есть здесь. После распаковки будет много файлов, нам нужен только 008XXX.img


Программы для закачки карт в GPS-навигаторы для Linux
Софта под Linux для закачки gps-карт в навигатор немного. Из опробованного мной могу сказать про sendmap. Скажу сразу: версия sendmap17Lstatic, которая Stable version of sendmap with RS support only, не работает у меня никак. При попытке отправить в навигатор карту ругается:

./sendmap17Lstatic /dev/ttyUSB0 -s57600 moscowregion.img
GPS SendMap & GetMap version 17, Kozicki@gps.chrisb.org

Checking input files
Preparing...
Failure to communicate with GPS or no maps can be upload into GPS
Зато работает новая версия, которая на сайте обозначена как Free sendMap20 rev 4.2 BETA for Linux with experimental USB support. С её-то помощью и удалось закачать карту, сделанную для московской области:
./sendmap20 -t/dev/ttyUSB0 -s9600 moscowregion.img
Detected : GPSMap60CSX Software Version 3.60
Available memory : 120 MB
Max number of maps: 2025
Final map size : 486 kB
Maps uploaded!
После этого карта появляется в списке карт навигатора (на всякий случай - у Garmin в устойстве карта может быть только одна, загрузка новой стирает предыдущую).

Параметры можно менять, например, изменить скорость закачки (-s115200) и присвоить карте другое отображаемое имя (-mMOSCOW )
./sendmap20 -t/dev/ttyUSB0 -mMOSCOW -s115200 63240001.img
После этого навигатор карту видит и может с ней работать. Правда, на той карте географическая привязка была какая-то странная...
Для Windows программы для закачки карт в GPS-навигатор называются MapSource и GPSMapEdit.

Закачка карт в GPS-навигатор через Mass Storage

Если выбрать в меню навигатора этот вариант, он станет большой флешкой и вы сможете на него закачивать карты:
usb 4-1: new full speed USB device using uhci_hcd and address 4
usb 4-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 4
usb-storage: waiting for device to settle before scanning
scsi 0:0:0:0: Direct-Access Garmin 60x microSD 1.00 PQ: 0 ANSI: 5
sd 0:0:0:0: [sda] 246016 512-byte hardware sectors (126 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 246016 512-byte hardware sectors (126 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1
sd 0:0:0:0: [sda] Attached SCSI removable disk
sd 0:0:0:0: Attached scsi generic sg0 type 0
usb-storage: device scan complete
По идее, монтируем /dev/sda1 и наступает нам счастье. После этого, по идее, нужно создать каталог garmin и закачать туда вашу карту с названием gmapsupp.img

Но здесь есть нюанс: если вы это делаете в первый раз, закачать карты можно, но навигатор карт не видит. Это связано, как я понял, с регистром символов: каталог должен называться Garmin - так, как его создаёт программа sendmap при первой заливке карт.

И ещё. Как выяснилось на форумах, закачать на флешку несколько карт и выбирать из них в Garmin 60 CSx не получится. С флешки видно только одну карту.
Читать далее

Подключение внешнего монитора к ноутбуку с помощью xrandr в Linux



16 коммент.
На каждом уважающем себя ноутбуке или нетбуке есть разъём для подключения внешнего монитора - для презентаций с проектора вещь необходимая. В Linux подключение внешнего монитора к ноутбуку с приходом Xrandr 1.2 и выше проблем не составляет, но на всякий случай выложу небольшое описание с примерами использования xrandr для работы с внешним монитором на ноутбуке.


Подключаем внешний монитор к ноутбуку с помощью xrandr

Не так давно я прикупил замечательный нетбук Toshiba NB-100, и сразу же потребовалось провести с него презентацию. Всё довольно просто - подключаем внешний монитор или проектор и пишем в консольке:
xrandr
На это нам xrandr ответит примерно так (цветовая раскраска - моя):
Screen 0: minimum 320 x 200, current 1024 x 768, maximum 1280 x 1280
VGA connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1280x800 60.0
1280x768 60.0
1024x768 60.0*
800x600 60.3
640x480 59.9
LVDS connected 1024x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1024x600 60.0*+
800x600 85.1 72.2 75.0 60.3 56.2
640x480 85.0 72.8 75.0 59.9
720x400 85.0
640x400 85.1
640x350 85.1
TV disconnected (normal left inverted right x axis y axis)
Так, что всё это значит? А значит это вот что:
  • VGA - наш внешний монитор или проектор, 1024х768- это разрешение, установленное на устройстве сейчас, 60.0 - частота кадров.
  • LVDS - собственно экран ноутбука, на котором сейчас стоит разрешение 1024х600 (так как он широкоформатный), 60.0 - частота кадров.
  • TV disconnected - ТВ-выход отключён (так как его попросту в этом нетбуке нет).
И сейчас лёгким и непринуждённым движением мы быстренько поставим на проекторе то разрешение, которое нам нужно.


Режим Clone mode

Это значит, что на внешнем мониторе \ проекторе будет отображено ТО ЖЕ САМОЕ, что и на экране ноутбука. Чтобы сделать Clone mode на новый монитор делаем так:
xrandr --output VGA --mode 1024x768 --output LVDS --mode 1024x600
Если разрешение внешнего монитора 800х600, то нужно поправить команду так:
xrandr --output VGA --mode 800x600 --pos 800x0 --output LVDS --mode 1024x600 --pos 0x0
Это всё позволит отдублировать изображение с экрана ноутбука на внешний монитор или проектор. А как быть, если нужно показывать два разных изображения?

Здесь имеет место быть маленькое лирическое отступление. Если xrandr отказывается выставлять высокое разрешение на внешнем мониторе, это может быть связано с объёмом видеопамяти. Для того, чтобы решить проблему, нужно иксам указать на использование "большого виртуального экрана". Делается это правкой файла /etc/X11/xorg.conf где в секции Section "Screen" добавляем:
Section "Screen"
Identifier "Default Screen"
Device "Generic Video Card"
Monitor "Generic Monitor"

SubSection "Display"
Virtual 2048 1024
EndSubSection

EndSection
Здесь указывается разрешение общего виртуального экрана в формате ШИРИНАхВЫСОТА (в данном случае 2048 на 1024). Именно такой вычтя из этого физическое разрешение вашего монитора, вы получите максимальное разрешение внешнего монитора ноутбука, которое можно установить с помощью xrandr.

Режим
Dual Monitor mode
При таком режиме вывод на проектор будет отличаться от вывода на монитор ноутбука: то есть вы сможете перетаскивать окна на внешний монитор, а на ноутбучном мониторе их не будет. Это очень удобно, когда вам нужно показать вывод, скажем, латеховского документа и не пугать благородных донов видом латеховского кода.

Сделать это можно с помощью правки xorg.conf, как уже говорилось, или с помощью xrandr. Чтобы сделать DualHead на внешний монитор с разрешением 1024х768 пишем
xrandr --output LVDS --mode 1024x600 --pos 0x0 --output VGA --mode 1024x768 --right-of LVDS --pos 1024x0
В этом случае ведущим будет внешний монитор (это определяется параметром --pos). То есть где 0 тот и главный монитор (на нём будут менюшки открываться). А вот так:
xrandr --output VGA --mode 1024x768 --pos 1024x0 --output LVDS --mode 1024x600 --pos 0x0
Ведущей будет панель ноутбука.

Горшочек не вари
Чтобы отключить всю эту светомузыку с внешним монитором, нужно дать команду:
xrandr --output VGA --off
после чего всё вернётся на место, внешний штепсель будет выключен и проектор отключится от вашего ноутбука.

Как повернуть экран в Linux с помощью Xrandr
Повернуть изображение на ноутбуке (в частности, удобно на нетбуке, когда хочешь почитать книжку) с помощью xrandr очень просто:

xrandr -o left

Чтобы повернуть по часовой стрелке изображение на мониторе пишем:

xrandr -o right


Чтобы вернуть всё на место, достаточно дать команду:

xrandr -o normal

И всё вернётся на свои места.

Графические утилиты для xrandr
Для того, чтобы иметь возможность всё делать через графические утилиты, есть утилита grandr. Выглядит она не просто, а очень просто:
Собственно, она является простой обёрткой для консольной утилиты xrandr и позволяет управлять подключением внешних мониторов (вращение, размещение и прочее) без необходимости что-то набирать в консоли. Аналогичная оболочка для xrandr в KDE называется krandr.


Ссылки

Весьма полезно будет ознакомиться с трудами арчеводов, линсоветчиков и общими идеями по xrandr.
Читать далее

Живой Linux своими руками, Эпизод 3: Тюнинг системы



9 коммент.
После того, как первый живой дистрибутив создан, записан на диск и от этого получено море положительных эмоций, нужно идти дальше. Некоторое время спустя выясняется, что где-то что-то не допилено, не хватает каких-то возможностей, не всегда стартуют иксы или в них забыли вписать кириллицу. Этот пост я писал по заметкам, которые оставлял в процессе доведения своего живого пингвина до ума.


Экономим место
Лучше начинать с базовой установки своего дистрибутива и, в зависимости от задач, сносить одни пакеты и ставить другие. Тут главное не увлекаться и знать, что место на диске ограничено, хотя сжатие у squashfs с патчем lzma весьма сильное.

Что можно удалить из базового дистрибутива
Пример с дистрибутивным ядром показателен - его снос высвобождает целых 60Мб. Но есть куча других мелких и не очень утилит, которые не нужны в таком объёме, особенно в бездонной директории /usr. Итак:
  • снос дистрибутивного ядра и замена "живым"
  • aptitude purge python2.4
  • удаление утилит тестирования типа reportbug, installation-report и прочих
  • вырубка всяких альтернативных утилит типа dc, nano, tcsh, portmap
  • прополка от python-selinux, policycoreutils и прочих параноидальных прибамбасов
  • долой info, bind9, whois, finger, telnet....
  • убирать документацию разработчиков из /usr/share/doc и словарей из /usr/share/dict - это не столько сокращает объём сколько уменьшает количество файлов (где-то на 10 тысяч)
  • локали (/usr/share/i18n/locales), мануалы (/usr/share/man) и шрифты оставить только нужные и на тех языках, о которых вы слышали. Локали можно убрать с помощью localepurge.
В общем, следует пройтись с топором по директориям, особенно сильно им размахивая в /usr, где добра больше всего. Всё это поможет сэкономить место для чего-нибудь действительно полезного. Например, для иксов :-)
У меня в итоге получилось, что базовый ISO-образ вместе с иксами, MC и IceWM занимает чуть больше 100Мб. В ходе тестирования в эмуляторе выяснилось, что загружается сие чудо в системах с более чем 64Мб ОЗУ. На ноутбуке загрузилось примерно за минуту, нашло все устройства и даже примонтировало автоматом все диски.


Что стоит установить в базовую систему
Всё сказанное ниже будет сильно зависеть от того, что вы хотите сделать из системы. Но я думаю, совсем не лишним и не обременительным будет установить:
  • облегчённые утилиты для интернет: wget и elinks
  • утилиты тестирования оборудования: dmidecode, lshw, hdparm, memtest86+, bonnie++
  • samba для общения с оффтопичной системой
Это сформирует базовую систему, которую лучше всего скопировать куда-нибудь и сжать в архив. При необходимости её легко дополнять и обвешивать программами под текущие нужды - а дальше можно печь живые диски, как горячие пирожки, при помощи live-скриптов.


Настройки, о которых легко забыть
Их не так много, но их отсутствие приводит к досадным разочарованиям. Поэтому ниже - небольшой список того, что следует сделать в системе перед запаковыванием её в ISO-образ и на флешку.

Автоматический логин
Чтобы каждый раз не писать пароль, лучше всего настроить автоматический вход в систему. Если диск спасательный, то можно сделать так: удалить пакет xdm и поставить mingetty - так обеспечивается вход в систему пользователя без пароля и запуск иксов, когда они нужны.
Итак:
aptitude remove xdm
aptitude install mingetty


После этого заходим в /etc/inittab меняем строку вида
1:2345:respawn:/sbin/getty 38400 tty1
на
1:2345:respawn:/sbin/mingetty --autologin имяпользователя tty1
Заменяя имяпользователя на логин реального юзера, имеем беспарольный вход в систему (взято отсюда). Потом, если потребуются иксы, пишем startx и наслаждаемся.


Настройка иксов

Если вы хотите, чтобы иксы (если они есть, конечно) запускались всегда и везде, нужно прописать драйвер vesa:
Section "Device"
Identifier "Cirrus Logic GD 5446"

Driver "vesa"
BusID "PCI:0:2:0"
EndSection

И не забыть про кириллицу

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc104"
Option "XkbLayout" "us,ru(winkeys)"
Option "XkbOptions" "grp:alt_shift_toggle"

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

Так же не стоит забывать про разрешение экрана - указывайте все при конфигурации иксов:
dpkg-reconfigure xserver-xorg
Повыключайте разного рода ускоряющие драйверы типа glx и dri, если вы создаёте спасательный диск. В общем, тюнинг системы - дело увлекательное...
Читать далее