24 окт. 2009 г.

something about everything

Давненько я сюда не писал.. Этот пост будет обо всём, а последующие уже более конкретно о чём-нибудь (:

Последний пост был аж в июле, а с тех пор кое-что изменилось: во-первых в августе я устроился на работу. Так что теперь я программист ("на четверть ставки") в конторе "Метротек"; во-вторых с сентября я начал учиться - снова на 3-м курсе; и кроме того, я продолжаю преподавать в своей школе.
И вот обо всём об этом я и буду в ближайшее время писать - ведь каждый из этих трех видов деятельности, связан так или иначе с программированием (и как это ни печально, менее всего - учёба).

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

id3project также находится в замороженном состоянии. Однако это всё же нечто намного более реальное, чем Джойстик. Я перестал над этим работать когда начал учиться и времени стало катастрофически нехватать на какую бы то ни было дейтельность вне цикла работа-учеба-работа. И всё же летом я делал какие-то незначительные изменения.
Репозиторий можно по прежнему найти на patch-tag.com (адрес немного другой в связи с внутренними изменениями на сервере).
Кроме того, библиотеку в форме cabal-пакета можно скачать с централизованного хранилища библиотек для haskell'а: idiii. Тогда, если у вас установлен cabal, можно просто написать в консоли
$ cabal install idiii
и пакет установится,, все зависимости разрешатся и все будут счастливы.
Там указана версия 0.0, поскольку это просто "init-commit". То есть я пока залил туда "чтоб было", чтобы потом не думать на тему регистрации и т.п. А дорабатывать ещё надо много чего, прежде чем можно будет со спокойной душой использовать библиотеку и делать что-нибудь полезное.
Например, я хочу переделать все парсеры,, чтобы использовать binary-io; естественно, надо реализовать больше фреймов; более удобную внутреннюю организацию структур данных и какие-то усовершенствования в simple-интерфейсе, о котором был предыдущий пост.
На этом пока всё.

13 июл. 2009 г.

id3project is alive!

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

но о чём это я?.. об id3project!
за эту неделю я многое сделал. хотя вспомню я сейчас не всё и не в хронологическом порядке.
помимо изменений в самой библиотеке, о которых речь пойдёт дальше, я начал использовать darcs - хаскеллевскую систему контроля версий. то есть он у меня и раньше был. но теперь я попробовал подружиться с ним и действительно понять зачем мне это надо и как что-нибудь с его помощью сделать. удобно, наверное..
а ещё я нашёл бесплатных хостинг для проектов использующих darcs на patch-tag.com
не знаю что в нём ещё хорошего, кроме того, что он бесплатный и для darcs.. но мне-то и этого хватит сполна.
итак, дело приняло серьёзный оборот! думаю, скоро можно будет уже выкладывать библиотеку в hackage.

теперь, о самой библиотеке:
- были сделаны значительные усовершенствования в структурах данных, хранящих информацию тега. не упоминая конкретики самой структуры, сложно рассказать о каких-то изменениях в общем. упомяну лишь, что я стал использовать (впрочем давно) такую штуку как аксессоры из пакета data-accessor (не знаю как это можно разумно перевести). все структуры данных, которые я использую - записи (records). у записей есть поля содержащие информацию. так вот стандартный интерфейс доступа к этим полям в хаскелле довольно неудобный (имхо). аксессоры предлагают (1) более удобный интерфейс, (2) абстракцию, которая позволяет менять эти методы доступа к полям записи. так что когда я менял структуры, мне не приходилось исправлять код везде, где они используются - я просто менял аксессоры.
- функция чтения тега из файла стала лучше, проще, надёжнее.
- функция записи тега в файл была наконец таки сделана! и если я чего-нибудь не упустил,, работает она не только правильно, но и эффективно. в чём была сложность: тег хранится вначале музыкального файла. у тега есть паддинг - резервное место для дописывания (кусок файла забитый нулями). это нужно для того, чтобы если тег увеличится, не переписывать весь файл заново (у меня например встречаются mp3 по 30-40 мегабайт), а записать его поверх старого, уменьшив тем самым паддинг (пэддинг). я разобрался как это сделать аккуратно и вроде бы у меня получилось.
- и наконец, самое(?) главное! я сделал "простой интерфейс" для этой библиотеки. простой интерфейс в кавычках, потому что это - во-первых (мягко говоря) урезанная функциональность, во-вторых это называется интерфейсом в смысле программирования, а не пользования. то есть интерфейс для тех, кто программирует на хаскелле. он действительно простой. но если это то, ради чего я делал всё что я делал (а это разумеется не так),, то я был настоящим извращенцем - это как строить большой, очень надёжный самолёт, с хорошими аэродинамическими характеристиками, в котором для пилота предусмотрена удобная приборная панель с бесчётным числом рычажков, кнопочек, тумблеров и прочих элементов управления,, а потом сделать для него пульт дистанционного управления (это ведь удобно) с двумя кнопками (всё просто): "/ехать/ вперёд" и "/ехать/ назад" (ничего лишнего).
вот примерно также и с этим моим простым интерфейсом..
там есть несколько функций такого вида:
getArtist :: Tag → Maybe String
она берёт тэг и возвращает либо Nothing - ежели информации об исполнителе в тэге не имеется, либо (Just "имярек") - ежели исполнитель имярек.

setArtist :: String → Tag → Tag
эта функция берёт имя которое вы хотите записать, тэг и возвращает изменённый тэг. при этом если информация об исполнителе в тэге имелась - она будет изменена,, а если е\ не было - будет создана.

в модуле ещё несколько точно таких же функций для названия трека, номера трека, года записи и названия альбома - в ближайшее время добавлю ещё парочку (комментарий, жанр и т.п.). всё очень просто - даже не надо знать что такое Tag. кстати, откуда он тогда берётся? из файла очевидно,, с помощью функции readTag:
readTag :: FilePath → IO (Maybe Tag)
она берёт имя файла, а возвращает "может быть тэг". это значит, что если в данном файле есть id3-тэг - значение будет иметь вид (Just tag),, а если нет - Nothing.

ну и для полноты картины надо упомянуть обратную функцию - для записи тега в файл:
writeTag :: FilePath -> Tag -> IO ()
куда писать и что писать - всё просто.

итак,, стоит написать маленький пример, чтобы показать как это всё работает и о чём вообще речь.
суть нижеследующего листинга в следующем: мы прочитаем тэг, посмотрим, есть ли в нём информация о номере трека, и если есть, отредактируем - если это цифра, то поставим перед ней ноль. по-моему вполне разумное изменение - некоторые плееры некорректно сортируют треки по номерам, если не проставлены нули слева:
1, 10, 11, 2, 3 .. - это происходит потому, что номер трека хранится в теге ввиде строки, а не числа и в данном случае эти строки сортируются в лексикографическом порядке - по алфавиту.
а мы сделаем так: 01, 02, 03 .. 10, 11.


 1 import System       (getArgs)
 2 import ID3.Simple
 3
 4 main = do
 5     files ← getArgs                         -- аргументы программы - список файлов, для редактирования
 6     mapM_ (withTag correctTrack) files      -- применим к каждому преобразование
 7
 8 -- в этой функции мы изолируем ввод-ввывод    (надо бы мне добавить её в библиотеку)
 9 withTag :: (Tag → Tag) → FilePath → IO ()
10 withTag function file = do
11     smth ← readTag file                            -- читаем "может быть тэг" из файла
12     case smth of
13          Nothing  → return ()                      -- если тэга в файле нет, то не делаем ничего
14          Just tag → writeTag file (function tag)   -- если тэг есть, преобразуем его и запишем обратно в файл
15
16 -- теперь, собственно, само преобразование
17 correctTrack :: Tag → Tag
18 correctTrack tag =
19     case getTrack tag of                 -- смотрим номер трека в тэге
20          Nothing  → tag                  -- если его там нет, то возвращаем тэг без изменений
21          Just num → if length num ≡ 1    -- а если есть - смотрим цифра ли это (один символ в строке)
22                        then setTrack ('0':num) tag     -- если да - добавляем слева ноль и пишем в тэг
23                        else tag                        -- если нет - ничего не меняем

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

стоит ещё сказать о том, как проверить, что вообще что-то произошло - как посмотреть сам тэг. очень просто: print tag.
поскольку я сделал все структуры данных используемые в библиотеке членами класса Show, можно просто выводить структуру на экран без дополнительной обработки. при этом информация будет вполне читабельно форматирована.

пост получился и так уж слишком большой.. так что о том, что ещё собираюсь сделать напишу в следующем.

p.s.
перечитал и заметил, что пишу то "тэг", то "тег".. а как правильно?

21 апр. 2009 г.

Joystick 0.5

"Видение победителя выплыло из последних минут предрассветного хаоса..." - на часах 5:18,, а я бьюсь со своим кремниевым зверем...

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

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

начинка пока остаётся той же. но теперь она лучше отделена от оболочки,, а это значит что менять/совершенствовать её будет удобнее.

13 апр. 2009 г.

Joystick is online

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

Joystick - это чат-бот, которого я пишу на хаскелле. изначально он был просто ботом, с которым можно было пообщаться на своём компе. он учится говорить у своих собеседников, запоминая как они строят предложения. система более чем примитивная,, но иногда она выдавала такие перлы,, что не восхищаться им было сложно.
потом darling-kicks написал для него интерфейс для работы через вконтакт (на перле). и Джой там какое-то время жил и был всем доволен, общался со всеми желающими через сообщения или надписи на стене. у него там появились друзья и почитатели,, те кто с ним регулярно общался. мы понемногу устраняли всякие неисправности и улучшали его,, и интересно, что администрация не засекла что его (потому что он достаточно естественно себя вёл),, хотя в то же самое время у моего знакомого забанили вконтакте двух самописных ботов и стали строже следить за тем, что многие пишут "недостоверную информацию" (: Джой как и в фильме "испоганил все их планы".
потом всё постепенно как-то заглохло.. во-первых потому что с ростом лексикона бредовость его мыслей возрастала экспоненциально,, а все хотели с ним болтать как с человеком - никто не хотел его учить, как надо говорить,, во-вторых изменился api контакта и перл-интерфейс перестал работать. и переделывать его не было большого смысла - нужны были качественные изменения.
новая реинкарнация Джойстика из Марракеша была реализована мной уже под irc полностью на хаскелле. было это в августе прошлого года на chaos constructions - атмосфера располагала к тому, чтобы что-нибудь эдакое сделать - впрочем и предыдущая версия была в значительной степени сделана на этом мероприятии годом раньше.
новая irc-версия была полностью переделана и более или менее нормально работала,, но особой популярностью не пользовалась. видимо потому что наиболее активные собеседники - люди далёкие от "хакирования",, а в irc собственно в основном либо те, кто там уже очень давно,, либо те, кто просто по жизни увлекается такими штуками.
а вот на прошлой неделе было такое мероприятие под названием sun teсh days - тоже посиделки для программистов организованные Sun. и снова это вдохновило нас с darling-kicks на новые свершения в старых начинаниях.
итак новая, последняя на данный момент версия Джоя - это старая начинка из irc-версии в новой обертке jabber-интерфейса. нашлась библиотечка для хаскелла про джаббер и оказалось очень просто перенести то, что было готово.
теперь Джой может работать как нормальный jabber-bot и всё в общем-то в этом смысле хорошо. к тому же джаббер в последнее время стал довольно популярен и весьма доступен. так что можно расчитывать на нормальную аудиторию собеседников.

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

в то же самое время darling-kicks параллельно со мной занимается разработкой Джоя на перле. и надо заметить со своими оригинальными идеями. браво, дружище!
посмотрим что у нас выйдет...

да и самое главное! как его теперь можно найти:
нужно в своём джаббер-клиенте, добавить пользователя 0xjoystick@jabber.org - и когда он будент онлайн, с ним можно поболтать (;

p.s. не надо думать, будто id3project умер. он вошёл в рутинную стадию документации и тестирования, а всякая рутина как известно убивает творческие порывы. поэтому через некоторое время, поиграв с Джойстиком, я вернусь и с новыми силами доделаю то что задумал. обязательно доделаю. если брошу на пол-пути - будет не просто обидно, это будет стыд и срам. я себе этого не прощу. (;

6 февр. 2009 г.

Синхрофазотрон и теги

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

и вот из тех примитивов, для которых надо определять преобразование напрямую,, мне остались только числа (Integer) со значением размера. а тут особую сложность представляет такая неприятная штука как синхронизация "/ по англицки synchsafe integer - это что-то вроде синхробезопасное число о_О
я уже достаточно намучался с десинхронизацией в самом начале - поскольку размер тега и размеры фреймов в соответствии со стандартом id3v2.4 синхронизированы. до сих пор не понимаю зачем это вообще нудно делать /= но фиг с ним,, когда я разбирался с десинхронизацией, я не очень-то понял как она происходит,, грубо говоря, я просто взял какую-то готовую функцию на с++ и переписал на haskell'е. но теперь, когда мне нужно было сделать функцию обратную к этой - такой готовой в интернетах не нашлось. в общем мне пришлось разобраться с десинхронизацией и придумать обратную функцию для синхронизации. и я очень доволен что у меня это получилось (:

теперь вроде бы все структуры обратно-конвертируемы. и надо это проверять. то есть надо проверить на заданном множестве это преобразование - обратная к парсеру.
собственно будет повод разобраться с Quickcheck (или HUnit).

следующий шаг: тестирование, оформление и документирование того, что уже готово.

4 февр. 2009 г.

Трансформируемся! "/ тьфу! Абстрагируемся!

трудовой план на сегодня выполнен!
я внёс существенные изменения во внутреннюю структуру id3project. преобразования и улучшения были направлены на абстрагирование структур данных представляющих теги и их внутренности. теперь можно менять (усложнять/совершенствовать) эти структуры, не меняя при этом остальную часть библиотеки.
внешне же ничего не изменилось. по завершении работ, я запускаю тестовую программу точно также как и вчера,, и что я вижу?? да всё тоже самое! работает всё точно также как работало вчера, изменилиcm только внутренние связки и механизмы взаимодействия структур.

следующий шаг: обратное преобразование структур в данные для записи в файл.

3 февр. 2009 г.

readTag :: FilePath -> IO ID3Tag

доделал сегодня в более или менее приемлемой форме часть id3project отвечающую за чтение тегов.
то есть группу модулей с парсерами и модуль-обёртку с функцией, которая просто берёт файл и выдаёт весь тег в виде структуры данных.
тип этой структуры объявлен членом класса Show - так что можно просто применить функцию print к тегу и он будет выведен на экран в аккуратном, читабельном виде. и вообще можно таким образом преобразовывать структуру в текст, если нас не интересуют внутренние нюансы структуры тега.
сделал-то в общем я вчера. но сейчас подправил обработку кодировки - вроде всё правильно работает.

на настоящий момент 100%-ного соответствия стандарту нету (кстати речь пока только о id3v2). поскольку там много тонкостей с флагами - во-первых я не очень понимаю назначение некоторых из них,, а во-вторых некоторые из них требуют использования дополнительных библиотек, как то компрессия или перекодирование фреймов и тому подобные хитрости.

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

100% поддержка стандарта пока не предполагается,, поскольку это не очень-то нужно. я полагаю что в тегах редко используется компрессия и тому подобные заморочки - никто не заморачивается. да и из фреймов используется небольшой набор. другое дело что попадаются те, которые используются в реальности, но не описаны в стандарте - например я встретил фрейм TYER который содержит год выпуска альбома, но в стандарте для этого используется TDRC. поэтому важно добавить поддержку "неофициальных", но реально используемых фреймов.

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

31 янв. 2009 г.

Pseudo OOP


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

Vimperator

установил для Firefox'а плагин,, называется Vimperator.
это то, о чём я давеча думал - мол нехватает возможностей и всяких крутостей vim'а в других программах.
а этот плагин как раз делает в firefox'е всякие удобные сочетания из vim'а.
в списке возможностей vimperator очень важным пунктом стоит
"- бибикает при ошибке" (: ну не прелесть ли? прямо как vim..
куда-то сразу пропала менюшка и адресная строка (фтопку их). зато появилась внизу статусная строка как в виме.
и это правда удобно и вообще здорово, сразу настраивает на крутанское восприятие интернетов (:
всем рекоммендую. впрочем как и vim (;

vimperator

28 янв. 2009 г.

$ man id3-project

NAME
id3-project - прожект по созданию инструментов работы с музыкальными тегами формата id3.

SYNOPSIS
Этот прожект включает в себя библиотеку (на Haskell'е) и программу для работы с тегами музыкальных файлов формата ID3v2. Библиотека включает в себя обширный набор парсеров и инструментов, для чтения и редактирования тегов. Программа имеет простой но удобный консольный shell-интерфейс и оставляет возможности для расширения.

DESCRIPTION
В настоящее время, для Haskell'а нет библиотеки для работы с музыкальными тегами. За исключением ,TagLib которая, к сожалению, имеет весьма ограниченную функциональность и является лишь привязкой к одноимённой библиотеке на C++. Функции в ней определяются вызовами соответствующих с++-функций из TagLib. В id3-project предполагается создание native-haskell библиотеки.
Для чтения тегов используются монадические комбинаторы парсеров из библиотеки PolyParse.
Для консольного интерфейса используется библиотека Shellac. Она позволяет в декларативном стиле очень просто и быстро создать весьма удобный и легко переносимый командный shell-интерфейс с заменяемым backend'ом, который предоставляет набор дополнительной функциональности, такой как история команд или автодополнение.

OPTIONS
о Состояние
В настоящее время проект находится в стадии активной разработки.

о Программа минимум
+ Корректное чтение тегов в соответствии со стандартом.
- Корректная запись, добавление и удаление тегов.
- Консольный интерфейс.
- Работа с группами файлов.

о Программа максимум
- Всё то, что содержит "программа минимум".
- User-friendly графический интерфейс.
- Извлечение информации из имени файла и его расположения в соответствии с заданным образцом и запись в тег.
- Наоборот: извлечение информации из тега и корректировка имени файла.
- Индексация медиатеки - составление сводной базы данных с собранной по тегам информации.
- Поиск соответствий в онлайн-базе и корректировка/дополнение тегов.
- Нахождение "похожих" тегов в разный файлах для корректировки опечаток и т.п.
- ... всё, что только может понадобиться практической необходимостью и удобством.

BUGS
нет информации.

PORTABILITY
Portable. Библиотека должна одинаково хорошо работать как под *nix-системами так и под windows.

AUTHOR
Автор предпочитает не упоминать своё настоящее имя в общедоступных источниках информации, но известен его псевдоним и адрес электронно почты, по которому с ним можно связаться: laughedelic [at] gmail [dot] com

SEE ALSO
man haqid3 (not released yet)

STANDARDS
Официальный сайт стандарта id3

HISTORY
laughedelic's short story:
"Причина возникновения этого проекта заключается в том,, что у меня накопилось довольно много музыки (около 100GB) и я пользуюсь iTunes. А это означает, что музыка упорядочивается именно по тегам и даже более или менее чёткая структура расположения музыки в файловой системе не играет особенной роли. Естественно, что теги прописаны далеко не все, которые хотелось бы,, и далеко не во всех файлах. Существует множество программ для редактирования тегов и каталогизации музыки,, но ни одна из них не удовлетворила меня полностью в плане настраиваемости и функциональности. Поэтому я решил сделать свою программу. Всё просто.
Кроме того, для меня, как для программиста на Haskell, особое значение имеет свой вклад в дело т.н. lambda-revolution (:"


September 28, 2009


:_

27 янв. 2009 г.

"The beauty of Open Source"


по каким-то таинственным, неизвестным мне причинам, моё давешнее знакомство и дружба с open-source протекали в какой-то мягкой, безболезненной форме.
конечно у меня были разнообразные приключения с Linux'ом,, но там я их по большей части искал сам, да и они были в основном на верхнем уровне.
то есть я сталкивался с проблемами и "играми" open-source вне самих source.
а вот за последние несколько дней я окунулся в эту среду с головой и осознал таки что это такое изнутри.
3 дня и 3 ночи пытаясь скомпилировать всякие чужеродные библиотеки и плагины, разрешая сложную паутину взаимозависимостей и совместимостей и
(самое жёсткое) исправляя многочисленные ошибки в чужих исходниках,, я наконец понял что значила фраза в описании одного плагина
"Its the beauty of Open Source software. Study the code, change it, and use it."
там говорилось мол, это работает "из коробки" только для ххх, но вы легко можете переделать это для других платформ - угу "/ не тут-то было!
в общем вдоволь я наковырялся чужих исходников.. больше не хочу. сегодня ночью вроде и уже и не делаю ничего такого - а уснуть всё равно не могу.
всё время какие-то идеи...

26 янв. 2009 г.

Cabalizing! "/

в последние дни я упорно пытался постичь Кабаллу Хаскелла.
3 дня и 3 ночи я сидел в консоли и бубнил магические заклинания:
$ cabal configure
$ cabal build
$ cabal install

failed!
$ cabal --reinstall install
$ cabal,, cabal,,, cabal!!

иногда правда приходилось произносить и обычные заклинания, типа
$ ./configure
$ make
$ sudo make install

но и они приносили мне немало хлопот..
а потом всё запутывалось,, падало, катилось в тартарары и приходилось начинать всё сначала...
иногда даже приходилось произносить страшное рекурсивное заклятие:
cabal install cabal
О_О
или такое: cabal install cabal-install..

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

25 янв. 2009 г.

testing vim blogposting

всё таки кое-как мне удалось прикрутить этот плагин к vim для постинга в blogger.
один плагин не работает.. другой тоже.. третий вот запустил но при этом мне пришлось исравлять ошибки в коде на питоне - а я ведь его не знаю совсем..
но,, как известно,, я парень с мышлёный (; так что всё уладилось.
а вообще... надо просто брать и самому писать такие скрипты! не блог весть какая ерунда.
если не лень будент - так и сделаю в ближайшее времечко..

upd: оказалось лень и не досуг...

23 янв. 2009 г.

"Getting Started"

В этом блоге я буду писать о своих начинаниях, идеях, успехах и всяческом "лидировании в области программирования" (: