среда, 28 января 2009 г.

Еще пару слов о vim и фолдинге.

Написав предыдущую заметку, я решил проверить, а не проще-ли будет сделать фолдинг на основе синтаксиса? И проверил. :) Вот собственно новая функция:

function! LoadClipboardFile()
set number
syntax clear
syntax sync fromstart
set foldmethod=syntax
syntax region NoteFold start="---=====.\{-}=====---" end="---=====.\{-}=end=---" fold transparent
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
set foldcolumn=3 "отступ от края
map <F2> :r!date '+\%F \%H:\%M \%S s'<CR>
imap <F2> <Esc><F2>
map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h
endfunction


Теперь весь фолдинг обрабатывается по синтаксису. :) Мне так даже больше нравится...

вторник, 27 января 2009 г.

Пару слов о vim и его фолдинге.

История эта началась с небольшого поста уважаемого tengu-crow, в котором я откментировал, что тоже есть такие идеи и методы использования. Собственно для того, что бы понять о чем идет дальше речь, желательно прочесть то, о чем шла речь в том посте + коментарии мои и tengu-crow + последующие его заметки и наши общие коментарии под общим названием в его ЖЖ "Афигено большой файл" тут, тут, и тут. :) И так речь идет о фолдинге в vim по просьбе вышеупомянутого френда. :)

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

Небольшое лирическое отступление.

Когда программисты пишут программы, то довольно удобно, что бы все функции были "свернуты", то есть мы видели только их заголовки, а внутрь попадали только тогда, когда нам это действительно надо. Это напоминает лист бумаги, часть которого сложена и как бы скрыта от глаз, но в любой момент ее можно развернуть и глянуть что внутри. Данный подход называется фолдингом. Фолднг в vim бывает 3-х видов:
  • manual - ручной
  • indent - большая величина отступа означает большую глубину складки
  • expr - для определения складок используется выражение
  • syntax - складки определяются в соответствии с правилами подсветки синтаксиса
  • diff - специальный режим складок для отражения различий в файлах
  • marker - складки определяются с помощью специальных маркеров в тексте
В нашем случае я попробовал использовать режим expr, так как из всех методов более всего подходили 3: expr, syntax и marker. С маркерным методом я пободался, но так и не смог заставить его работать так, как я хочу, поэтому я его забросил, во всяком случае пока. С синтаксисом я вообще пока не разбирался, хотя и надо бы. ;) Поэтому остался метод "регулярных выражений", которые я очень люблю еще с первого знакомства с perl. :)

Далее лирика, но уже без отступлений. ;)

И так, в нашем афигено большом файле есть темы и заметки. И очень не плохо было бы, сворачивать все наши записи, оставляя только заголовки от них. С методом мы уже определились. Так что поехали. Далее привожу не весь, но часть конфига, дабы не загружать повествование лишними деталями. Для тех, кто не в курсе, коментарии в конфигах vim начинаются со знака ковычек (").
vim ~/.vimrc
;)

Собственно исторически сложилось, что файл со всякими записями у меня назывался *.clipboard, поэтому для его открытия я и сделал функцию.

"вызываем функцию при открытии файла
autocmd BufEnter *.clipboard silent exe LoadClipboardFile()
"
сама функция
function! LoadClipboardFile()
"
покажем номера строк, люблю я так ;)
set number
"
выберем метод фолдинга
set foldmethod=expr
"
а тут самое интересное: вычисление фолдинга по маскам, но об этом позже
set foldexpr=getline(v:lnum)=~'=end=---$'?'s1':getline(v:lnum)=~'^---=====\\s'?'a1':-1
"
заголовок, тоже опишу ниже
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
"отступ от края, в котором будут показываться уровни фолдинга
set foldcolumn=3
"
ну это чисто для вставки даты в текст по нажатию F2
map <F2> :r!date '+\%F \%H:\%M \%S s'<CR>
imap <F2> <Esc><F2>
"
а это для создания новой записи по нажатию F4
map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h
endfunction


И так каждая запись у меня имела вид:

---===== <дата опционально> тема =====---

текст
---===== <дата опционально> тема =end=---

Соотеветственно строка

foldexpr=getline(v:lnum)=~'=end=---$'?'s1':getline(v:lnum)=~'^---=====\\s'?'a1':-1


делает следующее:
  1. берем текущую строку (getline)
  2. если она оканчивается на '=end=---$', то возвращаем s1, что означает конец текущего фолда (знак =~ - означает если содержит)
  3. если нет, то оцениваем ее начало на наличие '^---=====\\s', и если так, то возвращаем начало нового фолда (a1)
  4. если же нет, то возвращаем -1, что значит, что уровень фолда не поменялся
Комбинация: <условие>?<результат если верно>:<результат если ложно> я думаю известно многим программистам. ;) Так что тут все довольно понятно.

Далее делаем еще одну косметическую операцию, а именно надпись на фолде:

set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')


Тут вообще практически все понятно: устанавливаем заголовок фолда как строку, взятую из начала фолда и удалив из нее "---===== " - вначале и " =====---" - в конце, что бы не мешали. ;)

Ну можно еще немного объяснить, как работает вставка новой записи, хотя там все просто - чисто последовательность команд vim-а:

map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h


  1. o---===== - вводимновую строку, печатаем начало заголовка и выходим в командный режим
  2. zo - раскрываем фолд, ибо обнаружив начало, наш фолд схлопывается
  3. F2 - на ней у нас висит мап ввода даты. ;)
  4. Но дата вбилась строкой ниже! Поэтому поднимаемся обратно и присоединяем (J) следующую строку к нашей.
  5. A - начинаем в конце ее добивать окончание заголовка (=====---)
  6. - переход на новую строку
  7. Далее все повторяется для закрывающего заголовка (=end=---)
  8. k - поднимаемся вверх
  9. ^ - переходим в начало строки
  10. /=====- - ищем точку после даты на первом знаке равно
  11. И делаем шаг влево, что бы оказаться сразу же за введенной датой и быть готовыми вводить новый заголовок. :)
Если лень - то нажмем просто "o" и будем в новой строке вводить текст, в заголовке останется только дата. Если нет - то напишем текст, который и будет отображаться в заголовке фолдинга.


Свернутый файл выглядит так:



Развернутый:



И далее:

LOL от моего друга! :)

- Так, - подполковник прошёлся рукой по жёсткому ёжику волос, - напомню всем вам текущую ситуацию. Президент, мертв. Тех двух жирн..., извините с альтернативным строением тела, черножоп..., извините, афроамериканских сотрудников CIA которые оставили пост, для того чтобы купить пончиков с кофе уже сажают на электрический стул. И я лично попросил, что бы губку им на головы не положили. Но факт остается фактом. Как? Как, я вас спрашиваю, исламисты смогли протащить в Белый Дом РПГ-7. Куда смотрели остальные? Боже, какая нелепая смерть. Быть забитым насмерть в ванной противотанковыми ракетами. Что может быть нелепей? И так... ваши предложения?
- Хилари?
- Отпадает. Если америка проглотила чернож..., извините, афроамериканского кандидата, то женщина исключена!
- Перенести иннагурацию?
- Ответ отрицательный! Заказаны напитки и закуски, приглашена сама ДжейЛо, в конце концов вы знаете какой визг поднимут пида... э-э-э... да кого я обманываю? Пидарасы если им объявят, что они не могу пройти маршем? Этим дрищам всё равно по поводу чего ходить маршами. Если есть разрешение а потом его нет они поднимут вой до небес. Ещё предложения?
- Двойник?
- Нет. Мы прочесали мелким гребнем все штаты. Вы же знаете это стандартная процедура. У Ронни, я имею ввиду Рейгана их было четверо. Так вот на него ни кто даже близко не похож.
- Сэр, у меня есть альтернативное предложение.
- Обрадуй меня Билл.
- Русские.
- Что русские?
- Вот смотрите, - помощник раскрыл кожаную папку и принялся тыкать в неё ручкой, - вот он на корпоративе не обращайте внимания на его глупый вид - русским это нравится. Это на даче - снимок сделан издали но видно что даже размер совпадает. Это он ведёт какую то дибильную, извините, с отклонениями в развитии, передачу. Это на КВН-не.
- Хм... А если вот так?
- Да сэр, пигмент придётся изменить.
- А с русскими уже договорились?
- Так точно! Мы больше не лезем в Джорджию, а они отдают нам его на 4 года.

И буквально через три часа доставленый на стратосферном FG-308 умытый, одетый, покрашенный и слегка охуевший Игорь Верник сияя белозубой улыбкой вышел на иннагурационную дорожку.

(с)Dandr

LOL: рисунок канадской девочки

Канадские первоклассники рисовали на уроке на тему "Кем я хочу быть, когда вырасту". Рисунок одной девочки вызвал бурную реакцию учительницы.

лопата

(надпись на картинке: когда я вырасту... Я хочу быть как мамочка!)

На следующий день девочка принесла учительнице записку от мамы:

"Дорогая г–жа Дэвис,
Я хочу объяснить, что именно изображено на рисунке моей дочери. Это НЕ я, танцующая стриптиз на шесте! Я работаю в строительном магазине и как–то раз рассказала своей дочери, сколько денег мы заработали во время последнего снежного шторма. На рисунке я продаю ЛОПАТУ!
Г-жа Харрингтон."

воскресенье, 18 января 2009 г.

Сноуборд

На новый год подарил жене подарок от smile. Набор "экстрим". :) Выбрала она обучение сноуборду. Надо сказать, что на лыжах она у меня ездит уже более 4-х лет, и ездит не плохо. А я пару лет назад на них "встал". И все меня подмывала мысль попробовать "доску". Ну вот она и решила, что более подходящего момента не будет. :) Поэтму мы сегодня поехали с ней вместе, ей инструктора выдали, а мне мы его наняли. :)
Ну что могу сказать? Мне понравилось. :) Причем понравилось больше, чем на лыжах. Так что видимо буду покупать себе доску. ;)

Сброс пароля на винде.

Только что наткнулся на утилиту chntpw в репозитариях. Не трудно догадаться, что она делает. :) Надо срочно поставить ее на мою загрузочную флешку. ;)

четверг, 15 января 2009 г.

Empathy

Собственно попробовал сабж (для тех, кто не в курсе, это еще один IM-клиент). Ну что сказать? Кое что понравилось. Но в общем еще сыроват. Пиджин нравится больше. Единственно, почему я поставил эмпати, так это потому, что в нем есть поддержка "голоса" с gtalk юзерами. Надо было потестить. ;) Поставил, потестил... На двух компах в локалке. Не знаю что я не так делал, но звук просто отвратительный! То ли это из-за pulseaudio (может надо на alsa попробовать?), то ли из-за чего-то еще, не знаю. Но реально применить это невозможно. :( Вот такие грустные дела... А я уже радовался...

LOL: Microsoft has you, Neo.

Knock, knock
The Microsoft has you
Follow the white penguin


:)

воскресенье, 11 января 2009 г.

SPORE

Написание заметок а-ля HOWTO и прочего отложено, по причине засасывания меня в данную игруху. :) Не думаю, что это продлиться долго, но пока прет - буду играть. ;)

Коротко об игре, для тех кто не в курсе: жуткая смесь RTS, симулятора бога и стратегии. Начинаешь, выбрав планету, жизнь клеткой, плавая в "супе" и поедая то, что можешь, убивая тех, кого можешь, убегая от тех, от кого можешь. :) Накапливая новые фрагменты ДНК от съеденных/найденных частей других микробов/растений/клеток/прочего периодически конструируешь свою клетку с помощью редактора, добавляя ей то, что тебе кажется нужным. Затем, пройдя какой-то период, когда клетка разрастается, выходишь на сушу и переходишь в стадию "существо". Принцип примерно-тот же, только ДНК дается за фрагменты других существ (умерших, то бишь скелеты, или убитых тобой). Еда дает только силы. Дружба с другими существами позволяет лечиться в их гнездах и набирать их себе в стаю (вообще стая выходит не большая, 4 штуки всего, ну и то ладно) :)
Следующий этап - племя. Видоизменение самого существа прекращается и начинается стратегия. С самим существом можно делать только "одевание" да строить хижины со всякой фигней, типа копий, для вооружения.
После захвата кучи племен переходим в стадию цивилизация. Имеем города и скважины со "специями". Последние добываем - получаем деньги. Планета заселена существами твоего же вида, так что городов будет много. Их надо все захватить. В зависимости от твоих предыдущих действий ты станешь либо "торгашом", либо "воякой", либо "батюшкой". Соответственно города получаешь либо перекупая их, либо побеждая, либо дуряя мозги жителям. Получая город другой специализации - получаем доступ к другим возможностям, например перекупив "вояк" получаем возможность строить военную технику. До этого, если мы били "торгошами", то у нас был только торговый транспорт. Захват скважен так же возможен без военных, например подкупая рабочих. И так: захватив все города получаем наконец-то цивилизацию, способную выйти в космос! :) Далее собственно начинается самая длинная часть игры, логический конец у которой есть, но фактического - нет. Кто играл в "элиту" на синклере, то поймет. ;)
Тут в общем все просто: летаем, колонизируем, торгуем, воюем и прочее, прочее, прочее... В общем я за вечер вышел в космос, облажался пару раз, пришлось переигрывать. Потому что вылезти из полученной задницы было очень сложно. ;) К сожалению игра не имеет возможности сохранить разные варианты. Но мы же хитрые: сохраняем периодически копию подкаталога с сохраненкой. И все. ;)

К слову сказать игра прекрасно идет под wine, так что перегружаться в трупик-XP не пришлось. :)

среда, 7 января 2009 г.

Bacula, постскриптум.

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

И так, что мы имеем? Машина упала. Перегружаемся. Не поднимается. Грузимся с CD. Чекаем файловые. В моем случае выяснилось, что все они живы, кроме рут овой. Почему - это уже вопрос другой и с ним мы будем разбираться позже, да и заметки эти не об этом. ;) В общем чекаем (fsck -y), что бы оно все попра вило. Поправить мы поправили, но у нас полным полно всякого Г. в lost+found, а так же отсутствуют нужные файлы в /bin, /sbin и /etc. В общем трындец по лный. К сожалению я делал бакап только /home, /etc, mysql и списка установленных пакетов (для экономии места). Таким образом восстановление, в случае п адения системы сводится к установке системы заново, доустановке нехватающих пакетов из сохраненного списка, а так же восстановление /home. Немного доль ше, чем если бы было забакаплено все, но чем-то надо жертвовать. ;) Но так как у нас, в данном случае погиб только root, можно немного схалтурить и не переставлять систему. :) Короче поехали!

Сначала грузимся с CD, это понятно. Монтируем старый рут куда-нибудь:

mkdir /mnt/ROOT
mount /dev/sdaX /mnt/ROOT

Теперь зальем (с того же CD например) утраченное и необходимое:

cd /bin && find . -type f | cpio -pdu /mnt/ROOT/bin
cd /sbin && find . -type f | cpio -pdu /mnt/ROOT/sbin

Почему для cpio задан "-u"? Потому что в моем случае, например, оказалось, что /bin/sh есть, только вот он внутри не нужный нам ELF, а кусок лога. :( Т ак что приходится переписывать все. ОК, теперь есть надежда, что что-то у нас да заработает. ;)

mount /dev/sdaX /mnt/ROOT/usr #монтируем usr
mount /dev/sdaX /mnt/ROOT/var # так же поступаем с var и прочими
mount /dev/sdbX /mnt/ROOT/data # а это у нас второй веник, там где бакапы леж али
mount -t proc none /mnt/ROOT/proc

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

chroot /mnt/ROOT

Так, если ошибок не получили, как я первый раз (тогда я и узнал, что вместо /bin/sh имеем кусок конфига), то значит мы в системе и можно заняться восст ановлением. bextract живет в /usr/sbin, поэтому надеемся что восстановление пройдет нормально. Но есть одно "но": если бы у нас была лента, то все было бы просто

mkdir /etc.new
bextract -b /data/backup/bacula/<наш bsr файл> <наша ленточка> /etc.new/

но мы сохраняли на винт + плюс я потерял все конфиги bacula, а этой утилите нужен bacula-sd.conf. Поначалу я тупа дал путь к файлам с бакапа. Не тут то было... Пришлось читать ман. ;) Оказалось нужен конфиг сторадж демона с конфигуренным сторадж девайсом. Восстанавливаем его руками в минимальном виде:

mkdir /etc/bacula
cat > /etc/bacula/bacula-sd.conf

в cat пихаем следующее:

Storage {
Name = local-sd
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
SDAddress = 127.0.0.1
}
Director {
Name = local-dir
Password = "тут не важно что ;)"
}
Device {
# а вот это самое главное
Name = FileStorage
Media Type = File
Archive Device = /data/backup/bacula/ # это где у нас бакапы лежат
Random Access = Yes;
Label media = yes
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
Drive Index = 0;
Autoselect = yes;
}
Messages {
Name = Standard
director = local-dir = all
}

И так, конфиг у нас есть, можно восстанавливаться:

bextract -v -b /data/backup/bacula/<наш bsr файл> FileStorage /etc.new/

И ждем распаковки нашего etc. :) Развернул я его в отдельную папку, что бы потом глянуть что было запоганено, но это прямого отношения к данной теме не имеет. ;)

mv /etc /etc.old && mv /etc.new /etc

Собственно все. :) Или почти все... Надо бы до конца восстановить все поврежденное в root. Решить эту проблему можно по разному. Я поступил следующим о бразом (может будет интересно любителям "однострочников

Так как ни dpkg, ни всякие apt-утилиты ошибок не выдавали, я сделал вывод, что с их базами было все ОК. Тогда делаем так:

find / -mount -type f | xargs -i dpkg -S {} | cut -d ':' -f 1 | sort | uniq | xargs -i sudo sh -c "aptitude -y reinsta ll {}"

И ждем, пока переставятся пакеты, файлы от которых лежать в руте. :) Процесс этот не быстрый, так что можно идти курить. ;) После этого выходим из chro ot,
Удачи всем!