вторник, 25 января 2011 г.

Postgres Внесение изменений в тип ENUM

Как оказалось в Postgres внести изменения в перечислимый тип ENUM не так то просто! В Postgres ENUM это именно создаваемый пользователем новый тип данных, который можно использовать сразу в нескольких таблицах. Состоит он из статических упорядоченных списков. Тип занимает 4 байта на диске, а текстовая метка зависит от настроек (параметр NAMEDATALEN), по умолчанию 63 бита.

суббота, 22 января 2011 г.

Catalyst. Генератор ссылок $c->uri_for Часть 1

Вольный перевод документации

$c->uri_for()

Одной из полезных способностей фреймворка Catalyst является способность тасовать страницами приложения не опасаясь что всё поломается, т.е. проще говоря, - болье нет проблем со ссылками в шаблонах страниц. Например, у вас есть приложение работающее по адресу http://www.domain.com/Calendar и у этого приложение большая вложенность "/Calendar/2010", "/Calendar/2011/01" и т.д. Если вы переносите своё приложение на другой домен, а может быть ещё вдобавок меняете расположение приложения отностительно корня "http://www.mydomain.com/Tool/Calendar" то раньше все ссылки ломались.

среда, 12 января 2011 г.

Ubuntu 10.10 Восстановление удалённых фотографий с флешки с помощью foremost

Возникла необходимость восстановить данные с флешки от фотика. Флешка Sony MemoryStick PRODuo (2Gb), Со слов пострадавшей проблема в том, что "внезапно стёрлись все фотки с фотоаппарата" . О фотоаппарате ничего не известно. Заниматься восстановлением мёртвой флешки будем на Ubuntu 10.10

Чтобы не мучить и без того умирающую флешку скопируем с неё всю информацию командой dd на жёсткий диск компьютера. Чтобы знать откуда копировать нужно подсмотреть путь к устройству, выполнив нехитрую команду fdisk (перед этим конечно же вставив флешку в картридер)

sudo fdisk -l

Зная что наш флэш диск размером 2Gb легко находим его. У меня он называется /dev/mspblk0 Монтировать подключённое устройство не нужно. После этого запускаем процесс копирования.

sudo dd if=/dev/mspblk0 of=photo.dd

Процесс копирования не быстрый, на моём ноуте ушло 1166,91 сек на скорости 1,7 MB/c Можно было поэкспериментировать с флагом cbs=bytes который позволяет конвертировать за раз указанное количество байт, но чем проще метод, тем больше вероятность получить назад наши потерянные данные.

Команда dd простая как пять копеек. Всё что она делает это копирует данные с стандартного ввода на стандартный вывод. При этом можно менять размер блока и ещё несколько мелочей вроде пропуска указанного количества блоков.

Теперь самое важное. Качаем и запускаем команду foremost

sudo aptitude install foremost
mkdir ./out
foremost -t jpg -o ./out photo.dd

Для того чтобы восстановить не только jpg файлы, а вообще всё подряд, нужно вместо -t jpg указать -t all

ps: На данный момент foremost поддерживает (может восстанавливать) следующие форматы файлов jpg, gif, png, bmp, avi, exe, mpg, wav, riff, wmv, mov, pdf, ole, doc, zip, rar, htm, cpp

вторник, 11 января 2011 г.

Perl и динамические регулярные выражения

Нашёл тут у себя старый код, который решал интересную задачу поиска произвольно вложенных конструкций с помощью регулярных выражений. Эх! За что люблю Perl, так это за то что в нём такие мощные regexp'ы. Решение было подсмотрено в книге Дж.Фридла "Регулярные выражения" и называется это решение "Динамические регулярные выражения".

Regexp для проверки правильности вложенности скобок в строке текста выглядит вот так

my $regex;
$regex = qr/ (?:[^()]+ | \( (??{ $regex }) \) )* /x;

if ( $text =~ m/$regex/ ) {
    print "строка валидна\n";
}

понедельник, 10 января 2011 г.

Как разбить tar.gz архив на тома и как его потом склеить

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

tar czf - ./backup | split -d -b 10m - backup.tar.gz.

В результате получится несколько файлов по 10 Мб с окончанием .01 .02 .03 и т.д.

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

cat backup.tar* | tar xzf -