Показаны сообщения с ярлыком данные. Показать все сообщения
Показаны сообщения с ярлыком данные. Показать все сообщения

Свистульки, бубенчики и рюшечки в документах LaTeX



13 коммент.
Как все уже хорошо знают, в ЛаТеХ добиться хорошего качества документов по умолчанию очень просто: используя десяток стандартных команд, вы получите неизменно превосходный результат (ТМ) без лишних усилий. То есть документ будет хорош, но ведь иногда хочется украшательств, мигалок, свистулек и бубенчиков. На эту тему автор уже собрал небольшую коллекцию, которой и рад поделиться. Кроме того, автор открыл для себя удивительные книги Edward Tufte, который знает толк в визуальной подаче информации.


Читать далее

Перенос таблиц из MS Excel или OpenOffice Calc в LaTeX через Calc2LaTeX



8 коммент.
Это небольшая заметка может пригодится помимо автора этих строк тем, кому нужно переносить или создавать сравнительно простые таблицы из Excel или Calc в LaTeX, потому как создание таблиц в LaTeX это занятие, часто причиняющее адские боли ниже поясницы.

Читать далее

KdeSVN: графический svn клиент к Subversion



11 коммент.
Система контроля версий Subvervion, она же SVN, чрезвычайно удобна для небольшой группы, особенно если серьёзных требований по веткам и их слиянию не предъявляется. И хотя в консоли Subversion пользоваться удобно и просто, иногда бывает удобнее просмотреть графически историю версий или быстро вытащить нужный файл определённой ревизии - тут нам поможет svn клиент kdesvn.
Читать далее

Небольшая шпаргалка по командам 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 - в данном посте не рассмотрены возможности создания и слияния веток, но в качестве быстрого введения должно хватить. Больше есть в переведённом на русский исчерпывающем мануале тут.
Читать далее

EXIF теги в Linux: зачем нужен EXIF



7 коммент.
В различных форматах графических файлов возможность хранить дополнительные сведения, например, время выдержки, значение диафрагмы, время или ещё что-нибудь. Это обеспечивает формат EXIF (Exchangeable Image File Format). В Linux для работы с EXIF данными есть такой мощный пакет утилит, как exiftools, всю полезность которого автор этих строк испытал на себе. Вот, например, потребовалось вам сохранить какие-то пометки о том, где сделан этот снимок - тут-то вам exiftools и пригодится.


Например, выдираем теги из RAW-файла на примере цифровой камеры Canon EOS 400D
exiftool IMG_0383.CR2 :
beast@notebeast:~$ exiftool IMG_0383.CR2
ExifTool Version Number : 6.57
File Name : IMG_0383.CR2
File Size : 8 MB
File Modification Date/Time : 2008:10:22 12:48:10
File Type : CR2
MIME Type : image/x-raw
Image Width : 1936
Image Height : 1288
Bits Per Sample : 8 8 8
Compression : JPEG (old-style)
Make : Canon
Camera Model Name : Canon EOS 400D DIGITAL
Preview Image Start : 79450
Orientation : Horizontal (normal)
Preview Image Length : 68724
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Modify Date : 2008:10:15 15:44:26
Exposure Time : 1
F Number : 6.3
Exposure Program : Manual
ISO : 100
Exif Version : 0221
Date/Time Original : 2008:10:15 15:44:26
Create Date : 2008:10:15 15:44:26
Components Configuration :
Shutter Speed Value : 1
Aperture Value : 6.3
Flash : Off
Focal Length : 55.0mm
Macro Mode : Normal
Self-timer : 0
Quality : RAW
Canon Flash Mode : Off
Continuous Drive : Single
Focus Mode : Manual Focus
Canon Image Size : Unknown (-1)
Easy Mode : Manual
Digital Zoom : None
Contrast : Normal
Saturation : Normal
Sharpness : +3
Metering Mode : Center-weighted averaging
Focus Range : Not Known
Canon Exposure Mode : Manual
Long Focal : 55
Short Focal : 18
Focal Units : 1
Max Aperture : 5.6
Min Aperture : 32
Flash Activity : 0
Flash Bits : (none)
Focus Continuous : Unknown (8)
Zoom Source Width : 0
Zoom Target Width : 0
Photo Effect : Off
Color Tone : Normal
Focal Type : Zoom
Focal Plane X Size : 23.04mm
Focal Plane Y Size : 15.37mm
Auto ISO : 100
Base ISO : 100
Measured EV : -6.12
Target Aperture : 6.3
Exposure Compensation : 0
White Balance : Auto
Slow Shutter : None
Shot Number In Continuous Burst : 0
Flash Guide Number : 0
Flash Exposure Compensation : 0
Auto Exposure Bracketing : Off
AEB Bracket Value : 0
Focus Distance Upper : 0.77
Focus Distance Lower : 1
Bulb Duration : 0
Camera Type : EOS Mid-range
Auto Rotate : None
ND Filter : Unknown (-1)
Self-timer 2 : 0
Canon Image Type : Canon EOS 400D DIGITAL
Canon Firmware Version : Firmware 1.0.4
Owner's Name : unknown
Camera Body No. : 0730325266
Set Button Cross Keys Func : Set: Picture Style
Long Exposure Noise Reduction : Off
Flash Sync Speed Av : Auto
Shutter-AE Lock : AF/AE lock
AF Assist Beam : Emits
Exposure Level Increments : 1/3 Stop
Mirror Lockup : Disable
E-TTL II : Evaluative
Shutter Curtain Sync : 1st-curtain sync
Magnified View : Image review and playback
LCD Display At Power On : Display
Canon Model ID : EOS Digital Rebel XTi / 400D / Kiss Digital X
Num AF Points : 9
Canon Image Width : 3888
Canon Image Height : 2592
Canon Image Width As Shot : 3504
Canon Image Height As Shot : 2336
AF Points Used : (none)
Serial Number Format : Format 2
Original Decision Data : 0
File Number : 128-0000
Bracket Mode : Off
Bracket Value : 0
Bracket Shot Number : 0
Noise Reduction : Off
WB Bracket Mode : Off
WB Bracket Value AB : 0
WB Bracket Value GM : 0
Filter Effect : None
Toning Effect : None
Lens Type : EF-S18-55mm f/3.5-5.6
Internal Serial Number : H0885505
Dust Removal Data : (Binary data 1024 bytes, use -b option to extract)
Tone Curve : Standard
Sharpness Frequency : n/a
Sensor Red Level : 0
Sensor Blue Level : 0
White Balance Red : 0
White Balance Blue : 0
Color Temperature : 5200
Picture Style : Standard
Digital Gain : 0
WB Shift AB : 0
WB Shift GM : 0
Sensor Width : 3948
Sensor Height : 2622
Sensor Left Border : 52
Sensor Top Border : 23
Sensor Right Border : 3939
Sensor Bottom Border : 2614
WB RGGB Levels As Shot : 2236 1024 1024 1507
Color Temp As Shot : 5211
WB RGGB Levels Auto : 2236 1024 1024 1507
Color Temp Auto : 5211
WB RGGB Levels Measured : 2236 1024 1024 1507
Color Temp Measured : 5211
WB RGGB Levels Daylight : 2236 1024 1024 1507
Color Temp Daylight : 5200
WB RGGB Levels Shade : 2615 1024 1024 1253
Color Temp Shade : 7000
WB RGGB Levels Cloudy : 2427 1024 1024 1367
Color Temp Cloudy : 6000
WB RGGB Levels Tungsten : 1589 1086 1086 2509
Color Temp Tungsten : 3200
WB RGGB Levels Fluorescent : 1889 1034 1034 2126
Color Temp Fluorescent : 3769
WB RGGB Levels Kelvin : 2236 1024 1024 1507
Color Temp Kelvin : 5211
WB RGGB Levels Flash : 2479 1024 1024 1339
Color Temp Flash : 6262
WB RGGB Levels PC1 : 512 1024 1024 512
Color Temp PC1 : 4255
WB RGGB Levels PC2 : 512 1024 1024 512
Color Temp PC2 : 4255
WB RGGB Levels PC3 : 512 1024 1024 512
Color Temp PC3 : 4255
WB RGGB Levels Custom : 1201 1133 1133 5999
Color Temp Custom : 2400
User Comment :
Flashpix Version : 0100
Color Space : sRGB
Exif Image Width : 3888
Exif Image Length : 2592
Interoperability Index : R98 - DCF basic file (sRGB)
Interoperability Version : 0100
Focal Plane X Resolution : 4433.295
Focal Plane Y Resolution : 4453.608
Focal Plane Resolution Unit : inches
Custom Rendered : Normal
Exposure Mode : Manual
Scene Capture Type : Standard
Thumbnail Offset : 78336
Thumbnail Length : 1114
Photometric Interpretation : RGB
Samples Per Pixel : 3
Rows Per Strip : 256
Planar Configuration : Chunky
Strip Offsets : 443086
Strip Byte Counts : 7543495
Aperture : 6.3
Drive Mode : Single-frame shooting
Flash : Off
Image Size : 1936x1288
Lens : 18.0 - 55.0mm
Preview Image : (Binary data 68724 bytes, use -b option to extract)
Scale Factor To 35mm Equivalent : 1.6
Shooting Mode : Manual
Shutter Speed : 1
Thumbnail Image : (Binary data 1114 bytes, use -b option to extract)
WB RGGB Levels : 2236 1024 1024 1507
Blue Balance : 1.47168
Circle Of Confusion : 0.019 mm
Focal Length : 55.0mm (35mm equivalent: 85.9mm)
Hyperfocal Distance : 24.97 m
Lens : 18.0 - 55.0mm (35mm equivalent: 28.1 - 85.9mm)
Light Value : 5.3
Red Balance : 2.183594

Забавно, да, а что ещё можно с EXIF делать? Например, чтобы выцедить из RAW-файла время выдержки, сделать надо вот что:
exiftool -shutterspeed IMG_0383.CR2
Shutter Speed : 1
Для того, чтобы использовать exif-теги, надо запросить список тегов в которые возможна запись. Пишем:
exiftool -listw IMG_0383.CR2

Так, например из кучи тегов мы хотим писать в тег City. Для этого:

$ exiftool -City=Moscow IMG_0383.CR2
1 image files updated
И теперь:

$ exiftool -City IMG_0383.CR2
City : Moscow

Ура, теперь мы в тег City записали, что хотели. Утилита exiftools может не только читать, но и записывать информацию в EXIF-теги. Это может быть полезно и нужно для хранения в RAW-файлах информации о съёмке.


И зачем всё это надо!?
Причины, по которым есть необходимость модифицировать EXIF-данные в RAW-файлах могут быть разные. Вот, например, ув. тов. jetxee хочет в фотографиях хранить геотеги, то есть где фотография была снята.

Мне это потребовалось вот для чего. Результатами моих научных экспериемнтов являются куча RAW-файлов, и в каталоге лежит небольшой файл с условиями эксперимента (что снималось и для чего). Разные не очень технически продвинутые коллеги любят эти файлы копировать и использовать их где-то ещё (типа проверить и посмотреть), а потом говорят: "слушай, вот я тут картинку обработал, и результаты такие и такие - не помнишь, откуда этот файл!?". Хуже дело, если взяли по одному файлу из нескольких разных экспериментов и вот теперь надо разобраться, что откуда взято.

В общем случае экспериментатор при таком вопросе бледнеет и начинает громко говорить плохими словами. Но этого можно не делать: внедрить информацию в сам RAW-файл в какой-нибудь хитрый тэг. Потом так проще отследить файлы.

И теперь, чтобы избавить себя от нервотрёпки, делаем так: находим любой записываемый тег, и пишем туда то, что относится к эксперименту. После этого записываем нужные данные во ВСЕ файлы RAW скопом:
exiftool -City='Moscow Engineering Physics Institute' *.CR2

10 image files updated

С удовлетворением видим:
exiftool -City *.CR2
======== IMG_0383.CR2
City : Moscow Engineering Physics Institute
======== IMG_0384.CR2
City : Moscow Engineering Physics Institute
======== IMG_0385.CR2
City : Moscow Engineering Physics Institute
======== IMG_0386.CR2
City : Moscow Engineering Physics Institute
======== IMG_0387.CR2
City : Moscow Engineering Physics Institute
======== IMG_0388.CR2
City : Moscow Engineering Physics Institute
======== IMG_0389.CR2
City : Moscow Engineering Physics Institute
======== IMG_0390.CR2
City : Moscow Engineering Physics Institute
======== IMG_0391.CR2
City : Moscow Engineering Physics Institute
======== IMG_0392.CR2
City : Moscow Engineering Physics Institute
10 image files read

И всё дела. И уж теперь ваши нерадивые коллеги не введут вас в ступор вопросом: а отуда этот файлик!?

Здесь же, кстати, следует отметить, что EXIF данные можно записывать не только в RAW-файлы, но и в TIFF например. Однако полей для записи в TIFF меньше, хотя их тоже можно использовать.
Читать далее

Subversion - быстрый старт, или Ставим Subversion/SVN за минуту в Linux



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


Какая польза от Subversion не-программисту?
Даже если вы не профессиональный программист, система контроля версий может быть полезна для:
  1. возможности откатиться на любую предыдущую версию документа. Если вы пишете статью в ЛаТеХе и вам захотелось посмотреть на то, что у вас было две недели назад. В этом случае можно получить как историю изменений, так и непосредственно сами версии текстов.
  2. коллективной работы. Если статью или программу пишут несколько человек и хранят изменения в одном файле под управлением SVN, то они могут одновременно изменять и удалять разные части без риска потерять изменения.
  3. создания нескольких веток документа. Внесённые удачные изменения в одну ветку можно объединить с результатом основной работы.


Как быстро поставить и использовать систему контроля версий?
На самом деле, в этом нет ничего сложного. Итак, возьмите вашу латеховскую статью \ скрипт \ исходник программы и попробуйте. Для того, чтобы быстро поставить Subversion (она же SVN) и воспользоваться всеми её благами, нужно выполнить несколько простых шагов.


1. Ставим Subversion и оболочку для неё
Хотя с системой контроля версий удобнее работать через консоль, графическая оболочка не помешает (можно визуально наблюдать изменения, сравнивать правки и прочее). Ставим:
# aptitude install kdesvn svn
и все зависимости (здесь рассматривается svn v.1.4.2 из Debian GNU/Linux Etch). Через мгновение у нас уже будет установлена Subversion. Полдела сделано!


2. Начало работы с Subversion - импорт файлов в репозиторий
Первым делом нужно создать новый репозиторий - простой, без особых затей и канделябров:
$ svnadmin create phdthesis
В текущем каталоге появится подкаталог phdthesis следующего содержания:
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 conf
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 dav
drwxr-xr-x 5 penta4 penta4 32768 2008-06-03 18:55 db
-r--r--r-- 1 penta4 penta4 2 2008-06-03 15:48 format
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 hooks
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 locks
-rw-r--r-- 1 penta4 penta4 229 2008-06-03 15:48 README.txt

Красным подсвечены важные для нас каталоги: conf содержит конфигурационный файл репозитория (сейчас мы его немного допилим), а db содержит версии наших данных.

Наш репозиторий предполагается локальным, то есть доступа по сети к репозиторию нет и не надо. Тогда нужно конфиг немного допилить. Редактируем файл phdthesis/conf/svnserve.conf для того, чтобы у нас не было проблем с записью туда новых файлов - для этого ищем строку anon-access и правим:
anon-access = write
Теперь любой аноним имеет права на запись в наш репозиторий - то есть вам не нужно ломать себе голову авторизацией и паролями (если, конечно, с проектом работаете вы один).

Так, репозиторий создали, теперь его нужно наполнить данными. Для этого переходим в каталог, где хранятся нужные данные, и даём команду:
$ svn import -m "Initial dissertation state" file:///mnt/flash/other/phdthesis/
Здесь указывается полный путь до репозитория. Каждый раз указывать его не нужно - скоро мы поднимем SVN-сервер одной левой, и наша жизнь станет ещё веселее.

При импорте файлов Subversion будет выводить в консоль имена добавляемых файлов:
Adding disser.ins
Adding chapter.dtx
Adding kvoptions.ins
Adding (bin) draft_PhD_Konnik.dvi
Adding PhD_Konnik_chapter_introduction.tex
Adding PhD_Konnik_chapter_introduction.tex.backup
Adding PhD_Konnik.log
Adding PhD_Konnik.toc
Adding (bin) PhD_Konnik_chapter_introduction.dvi
Adding PhD_Konnik.tex
Adding (bin) PhD_Konnik.pdf
Adding (bin) PhD_Konnik.dvi

Committed revision 1.
То есть команда svn import берёт содержимое текущего каталога и помещает его в репозитарий, а так же все вложенные каталоги, если они есть. При этом выводится номер ревизии - это 1, наша первая правка.

Теперь ваши данные увековечены в репозитории, который будет автоматически бдить за вашими данными. И это просто!


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

$ svn checkout file:///mnt/flash/other/phdthesis/
в результате чего в текущем каталоге получим локальную копию данных из репозитория.

После внесения нужных правок, загружаем результаты обратно в репозиторий, для чего выполняем команду в каталоге, где находится рабочая копия данных, с которыми работали:
$ svn commit --message "minor edition in tex-files"
После ключа --message пишем в кавычках короткое сообщение, чтобы отличать одну правку от другой. В процессе загрузки изменений Subversion будет выводить имена файлов, которые загружаются:
Sending PhD_Konnik.tex
Sending draft_PhD_Konnik.tex
Transmitting file data ..
Committed revision 2

Готово! Ревизия изменённых файлов зарегистрирована в репозитории. Вот так легко и просто начать работать с Subversion.

Для начала работы с системами контроля версий этого должно хватить.


Ссылки

Очень толковая статья для начала есть тут, фундаментальный талмуд по возможностям Subversion лежит здесь.

Читать далее

Создание документов DJVU в Linux



44 коммент.
Задача: имеется отсканированная большая книга, и требуется перевести её в компактный формат для последующего просмотра в том же djview. В общем, нужно создавать документы DjVU в Linux.
Решение: в Linux просто и легко конвертируем насканированные страницы в DJVU.


Почему DJVU?
Потому, что есть множество отсканированных книг, и есть потребность их компактно хранить и работать с ними. Для этой задачи орлы из AT&T Labs разработали специальные алгоритмы сжатия, которые легли в основу формата DJVU.

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


Что потребуется для создания DJVU файлов из изображений
Для того, чтобы сконвертировать много изображений в DJVU нужно установить следующие пакеты:
aptitude install djview djvulibre-bin netpbm
При сканировании следует именовать файлы подряд так, чтобы они сортировались в порядке нумерации страниц. То есть вот так:

000.jpg, 001.jpg, 002.jpg, ..., 012.jpg

а не так:
0.jpg, 1.jpg, 2.jpg, ..., 12.jpg

потому как 12.jpg появится перед 2.jpg - так что при сканировании нужно об этом подумать.

Файлы изображений помещаются в отдельный каталог, после чего переходим в этот каталог и даём команду:
./any2djvu-bw
Эта команда - вызов скрипта оболочки, текст которого приведён ниже:

#!/bin/bash
#
# any2djvu-bw
#

if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Error: anytopnm, ppmtopgm, pgmtopbm and cjb2 are needed"
echo
exit 1
fi

shopt -s extglob

# DEFMASK="*.jpg"
DEFMASK="*.png"
DPI=300
# uncomment the following line to compile a bundled DjVu document
OUTFILE="#0-bw.djvu"

function usage() {
echo
echo "usage:"
echo
echo "$0 [\"REGEXP\"]"
echo " converts single pages with the default mask $DEFMASK (or REGEXP if provided)"
echo " in the current directory to single-page black and white djvu documents"
# uncomment the following line to compile a bundled DjVu document
echo " and bundles them as a djvu file $OUTFILE"
echo
}

if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi

for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Error: current directory must contain files with the mask $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# in netpbm >= 10.23 the above line can be replaced with the following:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done

# uncomment the following line to compile a bundled DjVu document
djvm -c $OUTFILE $MASK.djvu

Красным в скрипте выделена строчка, где определяется, какой формат файлов будет преобразован в DJVU. В данном примере это png.

Итак, в результате работы скрипта появятся промежуточные файлы djvu и файл #0-bw.djvu - это и есть конечный файл, содержащий в себе все страницы. Переименовываем его в то, что более приятно глазу, и готово. После этого можно открыть полученный файл при помощи djview или evince.


Так же перевести документы в формат DJVU можно и другими утилитами.

any2djvu
Это веб-сервис, находящийся тут. Он позволяет перевести отсканированные изображения непосредственно в файл DJVU. Удобно для тех, у кого широкий и дешёвый интернет-канал.

Так же можно воспользоваться кодом, предложенным комментатором с OpenNet:

#!/usr/bin/perl -w

my $i = 0;

my @cmds = qw[ djvm -c output.djvu ];
foreach ( <*.*> ) {
if (/(.*)\.jpg$/ ){
print "$_\n";
# system("c44", '-crcbfull', $1.'.jpg', $1.'.djvu');
system("cpaldjvu", $1.'.jpg', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
elsif (/(.*)\.tif$/ ) {
print "$_\n";
# установить 300 dpi в tiff'e
#system("tiffset", '-s 296 2', $1.'tiff');
#system("tiffset", '-s 282 300.0', $1.'tiff');
#system("tiffset", '-s 283 300.0', $1.'tiff');
# или
# system("cjb2", '-dpi', '300', '-losslevel', '100', $1.'.tiff', $1.'.djvu');
system("cjb2", $1.'.tif', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
}
print "$i files renamed\n";
system(@cmds);
print "\n$cmds[2] created";





Конвертируем PDF-документ в DJVU
Сконвертированные документы DJVU из PDF, как правило, имеют меньший размер и гораздо быстрее просматриваются, что особенно актуально для портативных устройств.

Для того, чтобы сконвертировать файл PDF в DjVu, требуется в текущем каталоге выполнить:
./pdfs2djvu
Это тоже скрипт на баше, код которого такой:

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Error: pdftoppm, cjb2 and djvm are needed"
echo
exit 1
fi

shopt -s extglob

OUTFILE="#0.djvu"
DEFMASK="*.pdf"
DPI=600

if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi

for PDF in $MASK; do
if [ ! -e $PDF ]; then
echo
echo "Error: current directory must contain files with the mask $MASK"
echo
exit 1
fi
echo $PDF
pdftoppm -mono -r 600 -aa yes $PDF $PDF
for PBM in $PDF*.pbm; do
echo $PBM
cjb2 -dpi $DPI $PBM $PBM.djvu
rm -f $PBM
done
done

djvm -c $OUTFILE $MASK*.pbm.djvu

Выполнение скрипта приведёт к тому, что все файлы PDF в текущей директории будут сконвертированы в DJVU. Аналогом является программа от Гугл под названием dpf2djvu.

Единственное условие: скрипт не переваривает кириллические названия с пробелами. Так что желательно временно переименовать файл так, чтобы он содержал только латинские символы и желательно без пробелов.

Ещё можно попробовать программу
gscan2pdf, которая позволяет сканировать изображения в форматы PDF и DJVU. Так же вам может пригодиться программа unpaper для «очистки» сканов. Это существенно улучшает их пригодность для последующего компьютерного использования.

Ссылки

Пост является волным пересказом этой замечательной статьи, тексты скриптов оттуда же. Так же можно прочесть вот это и это. Интересная подборка материалов на русском есть тут.
Читать далее

Как сделать бекап при помощи dd: используем dd для backup



27 коммент.
Для того, чтобы сделать backup (бэкап, резервная копия) винчестера для последующего восстановления вовсе не нужны коммерческие, проприетарные утилиты - есть старый, как мир, dd. С помощью dd очень удобно и просто делать бекапы, и всё, что нужно сделать - просто правильно его использовать.

Эпиграф
Только зануды делают резервные копии:
настоящие мужчины просто
закачивают все важное на ftp,
позволяя остальным отзеркалировать это.
Линус Торвальдс



Утилита dd есть в любом дистрибутиве, и даже в Knoppix, который можно использовать для восстановления данных, и вам не потребуются разные платные примочки типа Paragon backup или Symantec backup. То есть с помощью dd можно делать backup
системы, в том числе backup сервера. Для этого так же потребуется любой архиватор, в данном примере это gzip. Приведён вариант с архивированием на другую машину по сети с использованием SSH или netcat.


1. Приготовления

Загружаемся с любого LiveCD диска с Linux / BSD, залогиниваемся под root-аккаунтом.
Убеждаемся, написав в консоли df, что ни один из тех разделов, что мы собираемся копировать, не примонтирован на запись. Решаем, куда будем архивировать данные: это может быть другой раздел на винчестере, внешний жёсткий диск или по сети.


2. Создаём резервную копию

В данном примере /dev/hda это винчестер, который архивируем, а /dev/sda1 - это раздел внешнего винчестера или другая партиция, на которую архивируем, hda.img.gz - получившийся сжатый файл-образ.

2.1 Внешний винчестер или другой раздел диска

Монтируем устройство, куда мы будем архивировать данные
# mount -t vfat /dev/sda1 /mnt/sda1
Перегоняем данные с одного винчестера на другой. Так как данных много, полезно их сжать - и никс-системы позволяют это делать "на лету". В примере использван GZip, но подойдёт и любой другой (например, bzip2 или p7zip).
Для этого:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.img.gz
Здесь происходит архивирование с одновременным сжатием, результат чего записывается в файл hda.img.gz
Параметр "conv=sync,noerror" указывает dd не читать блок, если при этом происходит ошибка, но записать в архивируемый файл-образ данные, чтобы размер блока не менялся.
Параметр "bs=64K" это размер блока в килобайтах - использование такого большого размера блока ускоряет процесс копирования. Параметр bs можно сделать ещё больше, а именно равным размеру кеша копируемого диска (например bs=8m), это сильно ускорит весь процесс.
Выходной поток передаётся по конвейеру для сжатия gzip, результат выводится в файл на другом диске.

2.2 Удалённо по сети
Всё то же самое, что в п.2.1, но с добавлением в конвейер SSH:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c | ssh -c blowfish user@hostname "dd of=hda.img.gz bs=64k"
Архивный файл появится в домашней директории пользователя user на машине hostname. Если сеть маленькая, лучше вместо hostname использовать просто ip-адрес. Опция -c blowfish заставляет SSH выбрать алгоритм шифрования Blowfish, который быстрее остальных шифрует данные.

Вариант с netcat, если данные копируются по локальной сети и шифрование не нужно:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c | nc 192.168.1.1 3333
На удалённой машине должен быть запущен netcat:
# nc -l -p 3333 > hda.img.gz
Вариант с SAMBA, если копирование производится на оффтопичную машину: примонтировать удалённо сетевой ресурс
smbmount //192.168.1.100/shared /mnt/remoteshare -o username=имяпользователя,password=пароль
и далее всё то же, что и в п.2.1.



3. Восстанавливаем данные из бекапа
Пример тот же: /dev/hda это винчестер, который архивируем, hda.img.gz - архивный сжатый файл-образ, а /dev/sda1 - это раздел внешнего винчестера или другая партиция, с которого восстанавливаем данные.

3.1 Внешний винчестер или другой раздел диска

Копируем и распаковываем файл-образ одновременно:
# gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K
Все параметры в п.2 уже объяснены.


3.2 Удалённо по сети
Сетевой вариант с восстановлением из файл-образа:

dd if=hda.img.gz | ssh -c blowfish user@deadhost "gunzip -c | dd of=/dev/hda1 bs=64k"

Следует помнить, что в данном случае не следует использовать опцию conv=sync,noerror в опциях dd - если вы всё-таки включите эту опцию, в большинстве случаев это исказит записываемые данные (это заставляет dd не дожидаться данных, приходящих по сети, если целый блок недоступен).


Ссылки
Этот пост является переводом этой замечательной статьи, дополненной и расширенной этой и этой статьями. Так же это применимо к утилитам восстановления данных, описанных здесь.
Читать далее

Ошибки при записи DVD и как с ними бороться



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

Сбой в процессе записи в начале или середине диска
Редко, но бывает так: в начале или середине диски запись обрывается и growisofs выдаёт сообщение

Executing 'builtin_dd if=1.iso of=/dev/cdrom obs=32k seek=0'
/dev/cdrom: "Current Write Speed" is 16.4x1352KBps.
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
0/4393730048 ( 0.0%) @0x, remaining ??:?? RBU 100.0% UBU 0.0%
1671168/4393730048 ( 0.0%) @0.4x, remaining 1007:27 RBU 100.0% UBU 1.9%
:-[ WRITE@LBA=330h failed with SK=3h/ASC=0Ch/ACQ=00h]: Input/output error
:-( write failed: Input/output error
/dev/cdrom: flushing cache
/dev/cdrom: closing track
:-[ CLOSE TRACK failed with SK=3h/ASC=0Ch/ACQ=00h]: Input/output error
/dev/cdrom: closing session
/dev/cdrom: reloading tray


Болванку выбрасывать не надо, а только запустить процесс ещё раз - диск будет продолжен с того места, где запись прервалась. После этого диск нормально читается и проходит проверку на MD5-суммы.


Ошибка закрытия сессии
Диск полностью записался, и начинается закрытие сессии - иногда здесь происходит ошибка:

2144544*2KB out @ average 9.9x1352KBps
/dev/cdrom: flushing cache
/dev/cdrom: closing track
/dev/cdrom: closing session
:-[ CLOSE SESSION failed with SK=5h/ASC=72h/ACQ=03h]: Input/output error


Обидно: диск-то записался, но читаться он не будет, так как не закрыта сессия.
Для этого есть фирменная "затычка" от авторов dvd+rw-tools: небольшая программа close, и нужен её исходник. Его нужно скачать отсюда, установить/скачать исходные коды dvd+rw-tools и скопировать close.cpp в каталог с исходниками dvd+rw-tools. После этого в каталоге с исходниками компилируем close.cpp командой:
g++ -o close close.cpp
Всё, даём ей права на исполнение, вставляем в привод диск с неудачно закрытой сессией и пишем:
close /dev/hda
Если /dev/hda ваш пишущий DVD-привод, конечно. После этого диск будет закрыт, его можно прочесть и он проходит проверку MD5-сумм.

Как сообщают комментаторы, так же
для закрытия сессии можно использовать команду
dvd+rw-format -lead-out /dev/scdN
Должно работать и для обычных DVD-R дисков.


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

dd if=/dev/cdrom bs=2048 count=2261481 | md5sum

c99a74c555371a433d121f551d6c6398 -
1+0 записей считано
1+0 записей написано
скопировано 2048 байт (2,0 kB), 1,51564 секунд, 1,4 kB/s

Для того, чтобы это обойти, нужно всего лишь вынуть и вставить диск. :-)
Читать далее

Измерительные возможности цифровой камеры Canon 40D



6 коммент.
Этот пост будет интересен тем, кто использует цифровые фотокамеры в качестве измерительных. Чаще всего это физики, техники и астрономы. Здесь приведены фрагменты технического отчёта для одной из лабораторий МИФИ, которая дала нам на время 40D. Так что не ждите здесь дифирамбов Live-view и прочим потребительским штучкам. Нас она интересует как измерительное устройство.

Для выяснения правды был использован конвертер DCRAW, о чём уже писалось здесь. Для просмотра и анализа сырых данных из RAW-файла следует использовать графический анализатор nip2, о котором так же есть что почитать там и тут.



Как сделать из обычной камеры измерительную
Используем DCRAW с ключами:
dcraw -4 -D -T img0001.cr2

Ключ -4 имеет решающее значение: это позволяет выводить изображение в 16-битный формат, в котором содержится только 14 бит необработанных данных.

После этого данные можно загружать в MATLAB или Octave для работы или использовать nip2 для анализа данных.


Немного теории
Теоретический верхний предел значений пикселей фотокамеры равен разрядности АЦП - в данном случае это значение 16384 цифровых единиц. В современных цифровых камерах устанавливаются, как правило, 12-битные АЦП, однако в камерах высокой ценовой категории могут быть АЦП больших разрядностей (14 и 16 бит).

Несмотря на то, что значения, получаемые с фотосенсора, линейно зависят от времени экспозиции постоянного источника света, при подходе к теоретическому пределу значений отклик фотосенсора становится нелинейным. Значение насыщения меньше теоретического предела АЦП: например, для 12-битного АЦП, применяющегося в большинстве современных зеркальных камер, предел экспериментально получаемых значений меньше теоретического на 10-20%.


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

После этого в системе численных математических расчётов MATLAB / Octave обрабатываются снимки по выделенной области интереса: анализируется ход среднего значения по области интереса и дисперсия значений в выбранной области. Это позволяет узнать, насколько линеен фотоприёмник камеры и при каких значениях освещённости начинается насыщение.

Как видно из хода зависимостей, на уровень насыщения, который равен значению 13826 из 16384, сенсор фотокамеры Canon D40 выходит плавно, и до уровня 12000-13000 зависимость от интенсивности зарегистрированной освещённости можно считать линейной с достаточно хорошей точностью (см.рис.1). В качестве погрешности отложено стандартное отклонение данных плоского поля размером 64х64 отсчёта.


a)



б)


Рис.1: Линейность фотосенсора в зависимости от сигнала:
а) на малых экспозициях (логарифмический масштаб),
б) на больших экспозициях (линейный масштаб).



Данные о шумах для камеры Canon 40D
Для этих целей следует использовать экспозицию с закрытой крышкой. Данные, полученные в ходе обработки таких данных, позволяют судить о росте уровня шума в зависимости от экспозиции и ISO. Следует отметить, что усиление сигнала (соответствующее значению ISO) происходит до записи изображения в RAW-файл. С возрастанием величины усиления возрастают и шумы.



a)


б)
Рис.2: Изменение статистических параметров темнового шума от величины ISO:
а)среднее значение,
б) стандартное отклонение от среднего значения



На рис.2 приведена зависимость среднего значения сигнала темнового кадра от ISO и стандартное отклонение этих значений при постоянном времени экспозиции. Видно, что стандартное отклонение возрастает с изломами (возможно, используется многоступенчатый АЦП).

На рис.3 представлены зависимости величины шума (стандартное отклонение пикселей при многократном усреднении одной и той же сцены для разных величин пикселей) от сигнала.


Рис.3: Зависимость сигнала от шума для данных, обработанных
DCRAW в документальном режиме.
Данные приведены для красного канала.



Рис.4: Зависимость сигнала от шума для данных,
обработанных DCRAW в документальном режиме.
Данные приведены для зелёного канала.



По нашим данным, при обработке получаемых изображений конвертером DCRAW, можно оценить полный динамический диапазон как 56 dB и линейный динамический диапазон как 52 dB.

Это очень хороший результат для бытовой камеры, т.к. аналогичное устройство класса "scientific graduated" стоит как минимум в 3-4 раза дороже. Так что Canon 40D можно вполне использовать в любительской астрономии и в качестве фоторегистратора в оптических экспериментах.

Читать далее

Создание графиков в gnuplot: пример построения графика



23 коммент.
Согласно официальной документации, gnuplot имеет интерактивный и поточный режим. В интерактивном режиме вы вводите команду за командой, задавая параметры строительства графика. Для изучения возможностей или чтобы построить единственный график это, наверное, нужно, но обычно проще написать скрипт и скармливать его гнуплоту. Об этом далее.

Как в gnuplot построить график
Gnuplot использует скриптовой язык, который описывает строительство графика функции или рядов данных. В скрипте задаются параметры графика: шрифты осей, пределы по осям, расположение легенды. После этого скрипт передаётся по конвейеру гнуплоту, и он выдаст файл PostScript, который и содержит график.

Чтобы быстро посмотреть и, при необходимости, перестроить график, нужно открыть его программой просмотра PS-файлов. Например, kghostview. Её вообще хорошо держать открытой на другом виртуальном рабочем столе, а скрипт построения графика изменять - и при перестраивании график в kghostview автоматически обновится.

Небольшой пример. Имеются ряды данных в обычном текстовом файле, нужно построить график. Вот исходные данные, файл RAWSTDmeasurementresult
1.6593991e+00 1.6523134e+00 1.6407763e+00
1.8986703e+00 1.8667678e+00 1.8595763e+00
2.6304331e+00 2.5340401e+00 2.4999678e+00
4.2843754e+00 4.0227936e+00 4.0423230e+00
7.6136102e+00 7.0438436e+00 7.1057056e+00

Нужно построить цветной график, с подписями на осях по-английски, шрифт Helvetica. Вот что у меня получилось:

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "~/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps"
set xlabel "ISO number" font "Helvetica,18"
set bmargin 4
set ylabel "Pixels standard deviation" font "Helvetica,18"
set yrange [0:50]
set key top left
set xtics ("100" 0,"200" 1,"400" 2,"800" 3,"1600" 4)
set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
plot "~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 1 title "RAW data, Red channel" with linespoints linestyle 1,"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 2 title "RAW data, Green channel" with linespoints linestyle 3,"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 3 title "RAW data, Blue channel" with linespoints linestyle 2


Ничего сложного в этом нет, сейчас я эти иероглифы прокомментирую.

Даже беглый взгляд на текст при некотором знании английского позволяет догадаться, какие строчки что примерно делают. Понятно, что команда set что-то устанавливает - а устанавливает она параметры построения графика. А команда plot как нетрудно догадаться, что-то строит. Так что всего-то навсего две команды и немного параметров к ним. Не так страшно, как выясняется - для настоящего джигитапользователя никс-систем это не должно быть проблемой.


Пример скрипта построения графика на gnuplot с пояснениями
Итак, разбираем скрипт.

#! /usr/bin/gnuplot -persist
Это обычный заголовок скриптов, только указывает он на gnuplot а не на, скажем, perl или bash. Если вы когда-нибудь видели скрипты, то сразу почувствуете себя как дома.


set terminal postscript eps enhanced color solid
Устанавливает постскрипт-вывод, расширенный - можно использовать греческие символы, цветной - графики будут цветными.


set output "~/matlab/programs/kmvdecoder/plots/1NoiseRAWSTDtoISOnoisecomparing.ps"
Это путь к будущему графику и имя графика. Можно сваливать их в текущий каталог или куда захотите.


set xlabel "ISO number" font "Helvetica,18"
Подпись по оси Х будет "ISO number", шрифтом Helvetica и размером 18 пунктов.


set bmargin 4
Устанавливаем нижнее поле равное 4 относительным единицам, чтобы не обрезалась подпись к оси Х (этот досадный косяк имеет место быть у меня, у вас его может и не быть).


set ylabel "Pixels standard deviation" font "Helvetica,18"
Подпись по оси Y будет "Pixels standard deviation", шрифтом догадайтесь каким :-)



set yrange [0:50]
Пределы по оси Y составляют от 0 до 50.



set key top left
Легенда (обозначение рядов данных) сверху слева.



set xtics ("100" 0,"200" 1,"400" 2,"800" 3,"1600" 4)
Отсчёты по оси Х будут 100, 200, 400 800 и 1600.


set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
Здесь задаётся номер линии (чтобы на неё сослаться при построении конкретного ряда данных), тип линии и тип точки (квадратик, кружочек, ромбик...).


plot "~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using
1 title "RAW data, Red channel" with linespoints linestyle
1,
"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 2
title "RAW data, Green channel" with linespoints linestyle
3,
"~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult" using 3
title "RAW data, Blue channel" with linespoints linestyle 2
Вся эта конструкция предписывает строить график, который будет состоять из трёх линий (типа 1, 2 и 3). График строится по данным, которые лежат в одном текстовом файле тут: ~/matlab/programs/kmvdecoder/plots/RAWSTDmeasurementresult

Заголовок у каждой ветви графика разный, он задаётся после
title, а слово using означает, что в файле несколько рядов данных: для первой ветви - первый столбик, для второй ветви - второй столбик и так далее.

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

Следует отметить, что, вопреки распространённому заблуждению, gnuplot выдаёт графики с publication-ready качеством, которые без вопросов принимаются в любом зарубежном (и уж тем более местном) научном журнале. Например, NASA с помощью gnuplot создаёт карты погоды, а некоторые математические системы (типа MATLAB) просто используют куски кода gnuplot чтобы отрисовывать графики. Так что график, который выдаст гнуплот, в любом случае на порядок краше того, на что способен ексель или Openoffice.org Calc.

Для тренировки можно немного поиграть с параметрами и посмотреть, к чему это приводит. Смотреть удобнее всего в kghostview или любой другой программе, способной открыть PostScript-файлы.
Читать далее

Живой Линукс своими руками, Эпизод 2: Варианты загрузки



1 коммент.
Сделанный вами живой дистрибутив LiveUSB, о котором говорилось тут, может многое - можно указывать опции при загрузке и получить много интересного.

Возможность загрузчика Linux запускать ядро с определёнными параметрами - это, конечно, очень приятный плюс. Живой дистрибутив, созданный live-scripts, может получать опции при загрузке, для чего нужно нажать TAB в самом начале (когда видна таблица загрузчика). После этого через пробел вписывать параметры. Ниже о некоторых наиболее интересных я напишу.


Монтирование разделов
Есть случаи, когда монтировать разделы не надо и вообще не нужно иметь дела с дисками. Например, при проверке железа. По умолчанию созданный дистрибутив монтирует все файловые системы, до которых только доберётся. Поэтому при загрузке стоит указать соответствующие параметры:
  • nocd --- не загружать поддержку CDROM-устройств,
  • nohd --- не загружать поддержку винчестеров,
  • noauto --- не монтировать найденные файловые системы автоматически.

Копирование в оперативную память
Очень нужная функция, особенно если вы хотите создавать живой дистрибутив для спасательно-восстановительных целей. Например, после того, как образ будет скопирован в память, можно вынимать компакт-диск из привода - это позволит записывать данные на CD\DVD-R\RW, если такие утилиты включены в состав дистрибутива.
Для этого следует передать параметр при загрузке:
  • toram или copy2ram --- это скопирует дистрибутив полностью в оперативную память и выдвинет лоток с диском.
Естественно, объём оперативной памяти должен позволять это сделать. Далее работа с дистрибутивом ничем не отличается от обычной - только происходит быстрее, так как чтение с компакт-диска для этого не требуется.

Загрузочная флешка со Slax
Однажды мне потребовалось по-быстрому сделать флешку загрузочной и поставить туда LiveUSB дистрибутив SLAX. Кратко приведу здесь основные шаги.

Сначала скачиваем SLAX отсюда. Размечаем пространство на флешке и форматируем раздел под файловую систему FAT. Скачанные tar-архив распаковываем и копируем на флешку каталоги boot и slax.
Теперь делаем флешку загружаемой (у меня с загрузчиком lilo получилось только с FAT):

When Slax is unpacked to your device, it will create '/boot/' and '/slax/' directories there. Only one more step is needed to make Slax boot from your USB device or disk: you have to manually navigate to the newly created /boot/ directory and run bootinst.sh script (if you are in Linux) or bootinst.bat script (if you are in Windows).

The method mentioned above will simply install syslinux bootloader to your device's MBR (master boot record). Syslinux works only on FAT filesystem (which is widely used on most USB
flash keys, Cameras and MP3 players). If your device or disk is formated using a different filesystem (it is strongly recommended to use a native Linux filesystem like XFS), you will have to use 'liloinst.sh' script instead.
Currently, liloinst doesn't provide the same nice boot menu like syslinux, but this will be implemented soon.

После этого флешка становится загружаемой.
Читать далее

Вертикальная конкатенация двух файлов



9 коммент.
Обработанные экспериментельные данные часто представляют собой ряды чисел, по которым затем небходимо строить графики. Иногда требуется склеить данные из двух источников так, чтобы новые данные были дополнительными столбцами в уже существующих данных.

Задача:
Есть данные A:
$ cat RAWMAXmeasurementresult
2.7100000e+02 2.8300000e+02 2.8000000e+02
2.7300000e+02 2.8700000e+02 2.8400000e+02
2.7400000e+02 2.9600000e+02 2.9000000e+02
2.7800000e+02 3.0400000e+02 2.9800000e+02

Есть другой файл с данными B, полученный обработкой результата эксперимента в другой программе:
$ cat shutter
.00024414062500000000
.00031661600810536980
.00037652020030874656
.00048828125000000000

Нужно сделать так, чтобы в результате получился файл типа:
2.7100000e+02 2.8300000e+02 2.8000000e+02 .00024414062500000000
2.7300000e+02 2.8700000e+02 2.8400000e+02 .00031661600810536980
2.7400000e+02 2.9600000e+02 2.9000000e+02 .00037652020030874656
2.7800000e+02 3.0400000e+02 2.9800000e+02 .00048828125000000000
Так проще строить графики в гнуплоте, что в скриптах реализуется сравнительно просто.

Условия:
1. Ряды A и B можно перемещать, но нежелательно менять местами данные в ряде А.
2. Решение должно предполагать автоматизированную обработку (данных очень много, Ексель \ ОпенОфис Calc отпадают).
3. Ряд B получается не напрямую, сделать всё в одной программе нельзя.
4. Разделители - пробелы (количество неважно).
5. Задача не надуманная.

Что требуется:
Скрипт\программа, делающая такую конкатенацию, максимально кроссплатформенная (никаких вижуал васиков), ориентированная на *nix-среду.


Решение:
Изумительное по краткости и лаконичности: использование команды paste.
$ paste -d " " RAWMAXmeasurementresult shutter > ourendresult
И вся любовь.

Первоначально найденное решение:
Скрипт на Perl делающий всё это:

#! /usr/bin/perl
use strict;
use warnings;

my $kmvSourceFileName="RAWMAXmeasurementresult"; ## File that will be expanded by adding data
my $kmvTargetFileName="shutter";## File to be added to source file

my @kmvSourceFile =`cat $kmvSourceFileName`; ## file content
my @kmvTargetFile =`cat $kmvTargetFileName`;

my $kmvMaxIndexSourceFile = scalar @kmvSourceFile; ## how many elements in massive?

for (my $ii=0; $ii<$kmvMaxIndexSourceFile; $ii++)
{
if (index($kmvSourceFile[$ii], "\n")>0) ## if there is end-of-line symbol - remove it from source line
{
chop $kmvSourceFile[$ii];
}
$kmvSourceFile[$ii] = $kmvSourceFile[$ii]." ".$kmvTargetFile[$ii];
}

my $kmvResultFileName = $kmvSourceFileName.$kmvTargetFileName;

open(DATA, "+>$kmvResultFileName");##Открываем файл, куда пишем тестовые результаты
print (DATA @kmvSourceFile); ## Сюда пишем тестовые результаты
close(DATA); ##Закрываем файл, куда пишем тестовые результаты

Скрипт есть и он работает, но з
олотые мои анонимные комментаторы предложили решение, изумительное по краткости и лаконичности: использование команды paste.
Читать далее

Шифрование в Linux: Стеганография



22 коммент.
Задача: требуется скрыть сам факт передачи важных данных по открытым каналам связи.
Решение: несколько стеганографических утилит, доступных по лицензии GNU GPL и имеющихся в Debian, помогут решить проблему.

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

Стеганография
- в переводе с греческого дословно означает «тайнопись». Это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.

О программе steghide и пойдёт речь далее.

Установка и работа
Для того, чтобы поставить все стеганографические утилиты, что есть в Дебиан, мне потребовалось 4Мб и несколько секунд ожидания. При помощи друга всех дебианщиков, команды apt-get install, было установлено:
outguess - Universal Steganographic tool
stegdetect - Detect and extract steganography messages inside JPEG
steghide - A steganography hiding tool
snowdrop - plain text watermarking and watermark recovery
Чего с лихвой хватит для любых параноидально одержимых приватностью своих данных граждан.

Сокрытие данных
Хотелось бы отметить чрезвычайно подробный и толковый мануал steghide - увлекательнейшее чтиво, где подробно расписываются параметры и рассказывается вкратце, как программа работает и какие алгоритмы использует.
Вдоволь насладившись чтением, приступаем к непосредственно скрыванию своих сокровенных данных в какой-нибудь безобидный рисунок. Например, такой:


Когда я оформлял трудовой контракт, меня попросили написать свою краткую автобиографию - чем не конфиденциальные данные? Файл сохранился, вот его и внедрю в картинку - благо это простой текст, форматирования нет.
Для этого нужно набрать команду:
$ steghide embed -ef autobio.txt -cf MacOS.jpg -sf MacOShide.jpg
То есть внедряем файл autobio.txt (ключ -ef, embed file) внутрь рисунка MacOS.jpg (ключ -cf, cover file), в результате чего имеем рисунок со внедрённым стего под названием MacOShide.jpg (ключ -sf, stego file). При этом прогамма спросит дважды пароль:
Enter passphrase:
Re-Enter passphrase:
embedding "autobio.txt" in "MacOS.jpg"... done
writing stego file "MacOShide.jpg"... done
Всё готово, вот в этом рисунке весь мой жизненный путь за четверть века :-)

Для того, чтобы снова иметь возможность прочесть скрытый текст, извлекаем его оттуда:
$ steghide extract -sf MacOShide.jpg -xf autobio2.txt
То есть извлечь из стего-файла MacOShide.jpg скрытую информацию в файл autobio2.txt (ключ -xf, extract file). Утилита будет лаконична:
Enter passphrase:
wrote extracted data to "autobio2.txt".
Готово, файл записан.

Небольшое исследование
Кто умеет читать маны, мог почерпнуть тоже, читая пример в коце man steghide. Но мне стало интересно, насколько изменился рисунок не визуально, а количественно. Для этого люди, занимающиеся обработкой изображений, традиционно применяют среднеквадратическое отклонение между двумя изображениями. Вооружившись исчерпывающий статьёй Финапа [1] и реализовав её в MATLAB, вычисляем разницу:
>> kmvRMSandnorm('MacOS.jpg', 'MacOShide.jpg')

ans =

0.0032
Да, ну разумеется, такую разницу в изображении мы не увидим, даже если будем пристально вглядываться: всего отличие всего лишь на 0.32%! Отличия между изображениями можно увидеть, не сильно напрягаясь, где-то при 3-5%.
Ну и разумеется, что контрольная сумма файла изменилась:
$ md5sum MacOS.jpg
da6d7d25d5560fb22eb9d2f6ca09417f MacOS.jpg

$ md5sum MacOShide.jpg
87a02d9714ed43f49d2aeb37c4e75d94 MacOShide.jpg
Так что изменения, конечно, есть, но очень небольшие - на глаз не заметить, так что можно смело переправлять личную информацию по электронной почте, даже если её просматривает злобный админ.

Литература
[1] Fienup, J. Invariant error metrics for image reconstruction, Applied Optics, 32, 1997, 36, 8352-57
[2] Стеганография. Прячем секреты Dru Lavigne
Читать далее