Обо мне

Моя фотография
Дикий Полярный Сов

воскресенье, 12 декабря 2010 г.

Идея для футболки

Пришла в голову офигенная идея для футболки. Носить обязательно на девушке.

Итак, на груди надпись:
'(       )
Между скобками, естественно, ОНИ. А ниже надпись:
LISP - тема списков раскрыта
Ящитаю, будет бомба.

четверг, 9 декабря 2010 г.

понедельник, 27 сентября 2010 г.

Я вернулся.

Не знаю, надолго ли, но вернулся, гыгы.

Написал на хаскеле интерпретатор конечных автоматов Мили, аналогичный используемому в институте "МИЭМ-89" (написанному на паскале). На все про все ушло около двух вечеров: один разбирался с парсерами и их комбинаторами и писал свой велосипед (хотя, наверное, стоило бы повтыкать в Parsec), а второй - писал собственно интерпретатор.

Устанавливаем SDL-ные биндинги поверх Haskell Platform for Windows

Наткнулся на такую ссылку: http://web.animal-machine.com/blog/2010/04/a-haskell-adventure-in-windows/

пятница, 23 июля 2010 г.

Кнопочки.

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

Кстати, на фейсбуке я тоже теперь есть.

Новое сообщение. Работа и развлечения.



Итак, как некоторые из вас уже знают, я сменил работу. Теперь я отошел от дел перловых и пишу на пайтоне. Под django. В общем, то самое, о чем я мечтал полгода.

На работе использую Ubuntu 10.04, emacs, ipython, git. Впечатления - восхитительные. Все-таки фреймворк упрощает программисту работу в разы, если не на порядок. К тому же, встроенные средства джанги, типа админки, тоже сильно облегчают работу, особенно на этапе разработки.

Приобрел себе книгу "Категории для работающего математика", штудирую потихоньку. Также с целью математического самообразования (или восполнения пробелов в памяти - как посмотреть) разжился "Лекциями по линейной алгебре" и "Теорией множеств". Сейчас продвигаюсь по всему этому потихоньку.

Такие дела.

понедельник, 28 июня 2010 г.

Erlang + OCaml и все-все-все.

Вот здесь опубликованы весьма интересные слайды - про то, как функциональные языки вытеснили в продакшене императивщину. Крайне интересно.

Сказать по правде, именно так я себе все и представлял.

пятница, 25 июня 2010 г.

Няшный Haskell.

На днях нарыл книжку "Programming in Haskell", начал потихоньку разбираться. Пока что понимаю не так уж много, но работаю над собой. Налицо, кстати, явное сходство F# с сабжем - afaik, одни и те же люди приложили руку к созданию как того, так и другого.

А сейчас - про общую, хех, "няшность" брутального Хаскеля. Игру про няшного котика, написанную на Haskell, все видели? Ну а теперь вот второе наблюдение - интерпретатор Хаскеля называется "hugs". Вот сидит такой одинокий программист, захочется ему обнять кого-нибудь, открывает он консоль и пишет там "обнимашки" (ну, hugs пишет, имею ввиду). И запускается ему интерпретатор, и теплеет у него на душе, и с блаженной улыбкой он начинает работать.

пятница, 18 июня 2010 г.

Насущные вещи и perlянка.

Всем привет!

Вот немного разобрался со своими проблемами - ушел на очередной околоземный виток в институте (я снова четверокурсник, хаха), нашел себе новую работу (программист python+django, аккурат то, о чем я мечтаю вот уже полгода как), сейчас дорабатываю две недели в "Докторе" и сваливаю.

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

Но. Была очень серьезная проблема, которую разрешить не удалось. О чем я искренне сожалею. Мне будет не хватать вас, ребята.

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

А именно - о ключе 'e' в регулярных выражениях Perl. Тема эта для меня новая - не так уж и давно начал ее ковырять, поэтому если что - не обессудьте, буду рад выслушать всяческую критику, замечания и предложения.

пятница, 4 июня 2010 г.

Наконец-то пост. О работе и всяком таком.

И снова я возвращаюсь сюда.

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

Установил для Emacs расширение yasnippet. Как я раньше без всего этого жил - скорость набора кода увеличилась в разы. Продолжаю запоминать собственные мнемоники. Очень удобно, сделал уже набор сниппетов для jQuery и для часто используемых перловых оборотов. Особенно понравилась возможность встраивать в сниппет elisp-код.

В планах на будущее - доосилить таки F#-сервер и заняться программированием всяких прикладных автоматизирующих рутинную работу штучек на пайтоне. Хочу попробовать IronPython, а также Stackless - мельком видел его, вроде достаточно интересен.

Такие вот наполеоновские планы, хехе.

пятница, 7 мая 2010 г.

Last second save!

Давно не писал.
А все почему?
Да потому что нечего особо писать. Как будет что интересное - немедленно сообщу.

На следующей неделе начальник сваливает в отпуск на две недели, и я принимаю на себя весь нелегкий груз веб-программизма. Атлант, однако!

Вот такие дела.

понедельник, 19 апреля 2010 г.

Метро 2033

Раз уж день пошел богатый на посты в блоге, продолжим, пока прет. Прошел "Метро 2033".

Конечно, наверное, на просторах интернета много камней кинуто в огород линейности-коридорности, но мне понравилось. Особенно понравилась атмосфера - виды разрушенной Москвы прямо как бальзам на душу (не подумайте плохого). Выйдя на поверхность с Боровицкой (в игре), сразу же узнал пейзаж, несмотря на разрушения. А уж эпизод с телебашней это вообще ух.

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

F# - красивая конструкция

Сижу, пишу сервер. Есть у меня две функции, которые принимают данные разных типов (String и byte array) и отправляют их в поток - первая, соответственно, для отправки клиенту текста (заголовки всякие, прочая белиберда), вторая - для отправки изображений и прочей бинарщины.

И вот, благодаря паттерн матчингу, их можно объединить:

let sendToStream (str: NetworkStream) (bin: Object) =
    match bin with
        | :? string as strn ->
            str.Write(System.Text.Encoding.UTF8.GetBytes(strn), 0, strn.Length)
        | :? (byte[])  as bytarr ->
            str.Write(bytarr, 0, bytarr.Length)

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

P.S. Кстати, в приведенном примере компилятор найдет изъян - не покрыты все паттерны. Дело лечится добавлением граничного случая | _ -> failwith "Invalid input" например.

Новое и насущное.

Увидел вчера в книжном нового, свеженького (для России) Рейвенора-отступника, и не смог пройти мимо - подхватил и утащил, аки паук, на кассу.

Качество бумаги по сравнению с предыдущим изданием - небо и земля, причем сравнение, естественно, не в пользу предыдущего. И, хотя я уже читал его в оригинале, начал читать в русском переводе. Пока откровенных косяков не замечено - Молох все еще Молох.

Вот так. Этот пост, конечно, не интересен будет тем, кто не в теме :]

пятница, 16 апреля 2010 г.

Erlang - шифр цезаря.

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

О том, что из этого получилось - под катом.


четверг, 15 апреля 2010 г.

Эрланг. Впечатления.

Первое впечатление: "хехе, паттерн матчинг, оптимизация хвостовой рекурсии... как тут дела с HOF?".
Второе: "Неизменяемые переменные!"
Третье: "Круто, все так параллелится!"
Четвертое: "Что-то мне синтаксис напоминает..."
Пятое: "ПРОЛОГ?"

О нежданной пользе старинных технологий.

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

А пользовался бы КПК или телефоном для тех же целей - не было бы у меня сейчас полтинника.

воскресенье, 11 апреля 2010 г.

Лекция в политехе.

Был в среду на лекции "Эволюция искусственного интеллекта" в Политехническом музее.

Лекция проходила в Большой аудитории. На подобном мероприятии в политехе был впервые, а в самом политехе - в третий раз в жизни :]

В общем, пришел, сел. Пришел за 5 минут до начала (то бишь без пяти восемь). Народу было где-то половина аудитории. К тому моменту, когда началась лекция (началась она с опозданием на 10 минут) - был уже почти полный зал (только несколько верхних рядов были заполнены наполовину.

Итак, собственно про лекцию. Я по ходу делал кое-какие заметки, сейчас по ним попробую восстановить. Если что забыл - не обессудьте.


четверг, 8 апреля 2010 г.

F# web server, текущая картина.

Итак, на данный момент имеется:

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

Однако взглянул я в код, и кое-что мне не понравилось. Чтобы добавить новые функции, слишком много надо курочить.

И решил я его переделать.

Сегодня займусь.

среда, 31 марта 2010 г.

F# web server

Собственно, в институте по "Программированию для Интернет" было дано задание - написать простенький веб-сервер.

Так как предмет ориентирован на .NET,а писать на C# не было никакого желания, сегодня напросился написать этот сервер на F#.

Хорошо хоть разрешили.

вторник, 30 марта 2010 г.

Книжное.

Я люблю книги. Нежно и трепетно.

Разные и всяческие, скажем так. В плане литературы я практически всеяден. Мне нравится Лавкрафт, нравится Достоевский, мне нравятся стихи Бродского, мне нравится художественная литература по "Вархаммеру", я обожаю читать технические книги и научную фантастику.

Бывают, конечно, вещи, которые я читать совсем не могу по причинам стойкого отвращения (хороший пример - "Война и мир"). А также - те, которые просто не смог прочитать, по необъяснимым причинам (а это уже "Властелин колец", которого несколько раз начинал и засыпал).

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

На днях я разжился еще двумя книгами - "Краткая история времени" Хокинга и "Введение в теорию алгоритмических языков и компиляторов". Хокинга пока не начинал, предположительно, начну на выходных. Про компиляторы уже читаю - ничего не поделаешь, надо для института (хотя, откуда такой фатализм? тема-то очень интересная, да и написано вроде толково).

Параллельно я читаю Practical Common LISP, SICP и Programming F#.
Из художественного - пробую читать первую книгу из серии Mass Effect, но, ввиду решительного недостатка времени, ничего не получается. К сожалению.

Не так давно с удовольствием прочитал "Фулгрима" из цикла "Ересь Хоруса". Книга очень понравилась мне, и, думаю, понравится даже тем, кто не совсем в курсе событий из мира Вархаммера. В основе лежат старые как мир мысли о том, что "благими намерениями выложена дорога в Ад" и "от добра добра не ищут".

понедельник, 29 марта 2010 г.

Рванули две станции метро. Меня не задело, я в этот момент только просыпался у себя дома.

суббота, 27 марта 2010 г.

F# Mono Bug, или Микрософт как всегда.

Наткнулся сегодня на интересный баг в F#.
До конца локализовать пока не удалось, но, кажется, что паттерн матчинг с 'a option неправильно работает.
Итак. Имеем код (да, это тот самый шифр цезаря :] ):


module Caesar

let alphabet = Array.ofSeq "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.,?!+=/"

let getIndex (arr: 'a[]) (elt: 'a) =
    let optIndex = arr |> Array.tryFindIndex( (=) elt )
    match optIndex with
    | Some(x) ->
        printfn "found %A" x
        x
    | None ->
        printfn "None"
        -1

let encodeLetter (shift: int) (letter: char) =
    let idx =
        letter
        |> getIndex alphabet
    printfn "%c - %d" letter idx
    alphabet.[
        ( idx + shift ) % (Array.length alphabet)
        ]


В винде все работает, как и предполагалось - написав в fsi, к примеру

#load "caesar.fs"
Caesar.encodeLetter 5 'a';;

Получим на экране

found 0
a - 0
val it : char = 'f'

То есть - getIndex отработал как надо, достал нам индекс, что, в свою очередь означает, что паттерн матчинг Some(x) сработал. Под моно же имеем следующую картину:

None
a - -1
val it : char = 'e'

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

Бьюсь в истерике Очень интересный баг.


UPD: Однако, если вызывать getIndex напрямую - выводит все как полагается. Значит, беспорядки начинаются уже в encodeLetter - почему-то "теряется"... пока не пойму что.

UPD2: Причина, оказывается, крылась в генерализации функции (я явно указал 'a в качестве типа параметра). Как только поменял типы параметров в getIndex на char - заработало и под Mono. Подозреваю, тут что-то связано с выводом типов. Буду ковырять дальше.

UPD3: У Mono с выводом типов вообще как-то не очень ладится. Не могли сделать все как в дотнет.

вторник, 23 марта 2010 г.

Цветовая схема для Emacs

Вчера, с подачи @HornedKavu, набрел на сайт с создателем цветовых схем для Емакса. Выяснилось, что для установки этой самой темы нужен пакет color-theme.el, который в убунте ставится командой

sudo apt-get install emacs-goodies-el

После чего подключается в .emacs:

(add-to-list 'load-path "/usr/share/emacs22/site-lisp/emacs-goodies-el/")
(require 'color-theme)
(eval-after-load "color-theme"
  '(color-theme-hober))


Последняя строка подключает выбранную схему автоматически.
Кстати, тема hober, которая и предлагается по умолчанию, мне понравилась - давно хотел что-нибудь с темным фоном вместо обычного светлого.

Наслаждаюсь.

UPD: Только что открыл для себя команду M-x htmlize-region (и ее варианты htmlize-buffer etc). Однако, чего только емакс не делает :] Восхитительно.

Эта команда генерит html-код, в точности повторяющий происходящее у вас на экране (я имею ввиду цветовую схему, например). В код также входит css.

четверг, 18 марта 2010 г.

Почему я люблю математику и недолюбливаю людей.

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

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

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

Числа я понимаю.
Людей нет.
Числа прекрасны.
Люди - нет.

P.S. Повторюсь, это относится к людям в целом, а не к тем людям, которые интересны мне. Да, это двойные стандарты. Но почему бы и нет, в конце концов?

Новое и рабочие моменты

Всем привет! Достаточно долго не писал, но совершил над собой волевое усилие, и вот я снова здесь.

Что же интересного произошло за последние дни? Ну, я практически добил Practical Common LISP - осталась глава про format, пакеты и несколько глав с примерами. Такими темпами скоро буду "On Lisp" начинать, наверное.

На работе - выпустили версию 6.0 :] И попутно обновили тултипы (хотя мне таки милее jQuery'вские наработки в этой области).

Также пощупал F#. Впечатления в целом положительные, а по сравнению с C# так вообще отличные. Конечно, немного расстраивает жесткая типизация, с другой - что ни делается, все к лучшему. Однако наличие в нем доступа к CLI не может не радовать - то, чем привлек меня в свое время Clojure (обширная библиотека), только без страшных джавовских наворотов (ну не могу я этого понять, чесслово, в дотнете гораздо все прозрачнее).

Наконец-то толком занялся институтскими делами, в частности, домашними заданиями. Теперь осталось только собраться, сосредоточиться и подтянуться.

Посмотрим, что получится.

пятница, 12 марта 2010 г.

Лицензия

Прикола ради добавил в репозиторий, в котором храню всякую институтскую фигню вроде лабораторных и домашних заданий, README с текстом MIT License.

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

вторник, 9 марта 2010 г.

Компилируем бинарники из лиспа - SBCL и clisp

Давно не писал, потому что пока что почти все вечера у меня заняты погружением в Коммон Лисп.

Пощупал Clojure, и она мне, в целом, понравилась, если бы не одно "но" - совершенно неочевидные внутренние механизмы джавы, благодаря которым я вообще не понимаю, что к чему, что это за classpath, зачем он нужен, почему его надо явно указывать и с какой стати мой простейший скрипт на две строчки тормозит полторы секунды перед выполнением. Конечно же, если вникнуть во внутреннее устройство джавки и научиться компилировать мои clojure-произведения в *.jar, все будет работать быстрее. Но это впереди, а пока что я решил закончить-таки Practical Common LISP.

И сегодня я расскажу, как компилировать бинарник в SBCL и clisp.

Итак, начнем с SBCL. Подготовив наш файл к запуску, а именно - написав функцию, которая будет запускаться первой (этакий int main() :] ), мы грузим sbcl-овский REPL и пишем там:

(load "our-file-name")

Получив в ответ "Т", мы, в принципе, готовы приступать к компиляции. Вводим в REPL:

(sb-ext:save-lisp-and-die "binary-file-name" :executable t :toplevel 'function-name)

По идее, функция #'save-lisp-and-die просто сохраняет состояние интерпретатора лиспа, если бы не... параметр :executable вместе с :toplevel. Они содержат явное указание - скомпилировать бинарник, при запуске которого выполнится функция function-name. В качестве дополнительного требования к function-name sbcl просит явно вызывать функцию (quit).

Итак, когда я попробовал указанные выше манипуляции впервые и получил результат, радости моей не было предела. До тех пор, пока я не взглянул на размер бинарника - а он оказался, ни много ни мало, 28 мегабайт. Ага, для простенького скрипта. Ну, это остается на совести создателей SBCL, тем более, думаю, вряд ли сейчас для кого-то проблема бинарники в 20+ мег. Впрочем, глубоко этот вопрос я не ковырял, скорее всего, можно и сократить объем файла.

Теперь перейдем к clisp:

(load "our-file-name")
(ext:saveinitmem "binary-file-name" :executable t :init-function 'function-name :quiet t)


Здесь видим, что :toplevel меняется на :init-function и, кроме того, добавляется параметр :quiet, который препятствует показу баннера clisp перед запуском вашей программы. Меня такие вещи бесят. Кому нравится - не указывайте :quiet вообще.

Добавлю, что ваша программа должна содержать вызов функции #'ext:exit, чтобы она нормально завершила работу (иначе после того, как ваша программа завершится, пользователю покажут clisp-овский REPL).

Бинарник таким образом получается всего 5,5 мег.

четверг, 25 февраля 2010 г.

Django

Попробовал вчера вечером Джангу. По субъективным ощущениям - гораздо проще рельс.

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

Прошел туториал из четырех простых шагов и уже смог нафигачить что-то более или менее работающее.

В общем ALL HAIL DJANGO! Буду теперь ковырять мануалы в целях более вдумчивого въезжания в предмет.

пятница, 19 февраля 2010 г.

Jonathan Coulton

Наткнулся вчера на Джонатана Коултона. Это просто праздник какой-то.
Просто кину пару ссылок с небольшими комментариями:

http://www.youtube.com/watch?v=1BmK8PYm504 (The Future Soon - песня про мальчика, который мечтает стать ученым и создать расу роботов-воинов)

http://www.youtube.com/watch?v=z53WLtowYBo (The song about evil Genius in love)

http://www.youtube.com/watch?v=j4TnhemCEmc (Codemonkey - PHP-кодеры, это про вас!)

http://www.youtube.com/watch?v=AjcH2UmK1uo (Песня про зомби от лица зомби)

Восхитительно. Большая часть песен артиста доступна с его сайта для свободного скачивания.

Кстати, именно он написал финальную песню, которую исполняет AI GladOS в игре Portal. Этого само по себе могло быть достаточно, имхо.

вторник, 16 февраля 2010 г.

Хехе

Я смотрю, у моих постоянных читателей появились аватарки. Причем аватарки, совпадающие с твиттерскими. Подозреваю, это из-за подключения твиттера к google buzz.

понедельник, 15 февраля 2010 г.

Выходные пролетели как-то скомканно-незаметно, вроде как два дня целых, а, с другой стороны, и сделать-то почти ничего не успел.

Со следующей недели буду снова ходить в институт, параллельно сдавая несданные долги. Надеюсь, в этом году у меня все получится.

С удивлением узнал, что внутре Android'а - неонка ядро Linux.

Углубился в изучение Common LISP, пока что очень нравится, хоть и весьма сложно (местами).

Сегодня с утра в офисе целый час не было интернета. Вот до чего доводит монопольный провайдер =/

Засим разрешите откланяться, пойду работать.

P.S. Твиттер довел меня до мании выражать все мысли кратко, чтобы укладываться в 140 символов. Надо что-то с этим делать.

пятница, 12 февраля 2010 г.

SICP


Читаю SICP. По первости ломает мозг напрочь. Привык уже к императивным языкам, а тут функциональный, да еще с такой-то теорией.

Очень понравилось адаптировать примеры к моим условиям - можно, конечно, скачать mit-scheme и переписывать все с книги, но гораздо интереснее реализовывать то же самое на, к примеру, elisp'е.

Вчера, к примеру, столкнулся с проблемой. Задача - написать функцию, складывающую первый аргумент с модулем второго, не используя функции модуля. Пример на Scheme:

(define (a-plus-abs-b a b) ((if (> b 0) + -) a b))

Однако в CommonLISP'е и elisp'е такой пример не заработал - не понравилось им выражение (if (> b 0) + -), стоящее на месте, где лисп ожидал увидеть имя функции. В итоге, после размышлений, решил попробовать (пример на elisp):

(defun a-plus-abs-b (a b)
  (apply (if (> b 0) '+ '-) (list a b)))

То бишь, применить функцию "+" либо "-" к списку аргументов. Чуть позже подсказали другой способ - используя funcall:


(defun a-plus-abs-b (a b)
  (funcall (if (> b 0) '+ '-) a b))

Вот такие дела. Очень рекомендую.

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

четверг, 11 февраля 2010 г.

Божественный Лисп, Emacs-style

Сегодня написал свою первую функцию на elisp, которая хоть что-то делает ;)

Суть вот в чем - команда clipboard-kill-ring-save в emacs помещает содержимое выделенного региона в kill-ring (буфер обмена) и в буфер обмена операционной системы (таким образом я "выношу" информацию из редактора). До сих пор о том, что команда отработала как надо, я узнавал по пропадающей подсветке региона (transient-mark), но сегодня столкнулся с проблемой - когда я выделяю весь буфер (\C-x h), его содержимое не подсвечивается. Таким образом, я не могу узнать, сохранилось ли содержимое в буфер обмена, или я промазал мимо клавиш ;)

Решение достаточно простое - добавить в .emacs строки:


(defun my-own-clipboard-kill-ring-save (beg end)
  (interactive "r")
  (clipboard-kill-ring-save beg end)
  (message "SAVED TO CLIPBOARD") )


и

(global-set-key "\C-xj" 'my-own-clipboard-kill-ring-save)

Таким образом, при нажатии комбинации клавиш \C-x j мы не только положим содержимое выделенного региона в буфер обмена, но и получим в минибуфере сообщение "SAVED TO CLIPBOARD".

Enjoy.

По данным из некоторых источников...

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

Заранее спасибо

понедельник, 8 февраля 2010 г.

Bye-bye, beautiful!

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

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

Трансплантация прошла успешно, пациент жив.

Впечатления от RailsClub Moscow

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

Понравилось дико. Это, в общем-то, вторая IT-конференция, на которой я побывал. Первой была "agile-методика разработки", еще на втором курсе (тоже, кстати, удачная была конференция, хоть и в более формальной обстановке).

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

Итак, когда мы добрались до места (а оказались мы на месте где-то за полчаса до начала), там не было еще никого, кроме организаторов, настраивавших оборудование - проектор, ноутбук, интернет, трансляцию и камеру с микрофоном. Микрофон так и не настроили - слышно было не очень хорошо, но вполне различимо, так как мы сидели метрах в трех от докладчиков.

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

В очередной раз убедился, что Емакс впереди планеты всей и никакие vi'и с ed'ами с ним не сравнятся. Затем послушал про интересную систему индексации текстовых данных (так я это понял) под названием Sphinx. Взял на заметку, почитаю подробнее.

В общем, на этом "официальная" часть конференции окончена. Мы посидели еще немного, похоливарили "emacs vs. vim" и "mac vs pc", а также "win mobile vs android vs iphone" ну и по мелочи, да и разошлись.

четверг, 4 февраля 2010 г.

Linux & EEE PC 701

Ах да - на днях проделал сабж - установил Убунту 9.10 на Asus EEE PC (тот самый, на который не так давно ставил Рельсы и они томозили).

Впечатления восхитительные - работать все стало быстрее, система без проблем встала на SD-карточку, вставленную в кардридер нетбука.
На все про все + русификация системы ушло около 30-40 минут. Еще 15 минут ставил Руби, Рельсы, гемкаттер, Емакс, шрифты (свой любимый Терминус). Сегодня попробую запустить на ЕЕЕ гугл хром, надеюсь, что под линуксом нормально потянет.

Аватар 3 дэ

Был вчера вечером (ночью) на "Аватаре", смотрел его в формате IMAX 3D.

Ну что сказать - ничего особенно "УХ!" не увидел. Да, 3Д видно, местами даже удалось обмануть мозг, местами отвисала челюсть, но примерно такого результата я ожидал от "обычного" 3д. Я так понимаю, на этот самый "обычный" теперь идти нет смысла.

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

среда, 3 февраля 2010 г.

Eset NOD32 EPIC FAIL, или "подарочки исподтишка"

Вчера полез в msconfig, чтобы посмотреть, почему игрушки время от времени тормозят.

К немалому для себя удивлению, обнаружил в списке работающих служб некие Eset HTTP server и еще что-то от Eset. К слову сказать, говно от Eset антивирус NOD32 я уже давно удалил, после проведенных клинических испытаний, когда бесплатный CureIT нашел у меня с десяток вирусов при постоянно включенном и обновляющемся НОДе.

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

Оказалось, с выключенными службами не работает 3d-графика - при попытке запустить хоть какую-нибудь игру эта самая игра падала, вызывая "неизвестную ошибку". Чтобы проверить свои догадки, включил есетовские службы обратно. Перезагрузился.

Все заработало.

Вот это я понимаю - антивирус! Который нельзя удалить полностью, даже действуя по инструкции, который сажает в память машины процессы, которые не нужны пользователю, который блокирует возможности компьютера, если эти процессы отключены... Стоп! Это НЕ антивирус. Что угодно, но только не антивирус.

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

вторник, 2 февраля 2010 г.

diary.ru и философский камень

Дневник на дайри удалился, не прошло и года.

По вопросу о введении нормальной поддержки openid ответа я так и не получил. Пойду выведу свой пост в их сообществе наверх, вдруг на него обратят-таки внимание.

UPD: А вывести его вверх уже нельзя. Насмешили, стервецы.

понедельник, 1 февраля 2010 г.

Установка Ruby on Rails на Eee PC 701

Вчера занимался сабжем около пары часов.

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

Единственной проблемой стала невозможность (почему-то) утилиты gem качать пакеты из интернета. Дело, скорее всего, было в неправильно настроенном файрволле, который блокировал ruby, не давая ему возможности вылезти в интернет за новой порцией пакетов. К сожалению, никакого оповещения/предупреждения при этом не выводилось, что затруднило диагностику проблемы и привело к тому, что я понял, в чем дело, лишь после окончания процесса установки.

В итоге уже через полчаса мучений с зависимостями чувствовал себя полным apt-get'ом.

Но в итоге все обошлось - пришлось скачать и установить вручную новую версию гемов, а потом - рельсы, gemcutter, rake и до кучи mongrel.

Начал генерировать скрипты - обнаружились досадные подвисания script/generate, видимо, из-за слабости самой машинки. Но эксперимент можно считать удачным.

Игрушки - Mass Effect 2

Поиграл в Mass Effect 2. Постараюсь обойтись без спойлеров.

Подробности - дальше.

пятница, 29 января 2010 г.

Парикмахерская

Поход в парикмахерскую растянулся на час вместо запланированного получаса, но, впрочем, результат того стоит - я наконец-то постригся. Уже две недели собирался, как-никак.

В данный момент изучаю Ruby on Rails. Если в оригинальный Ruby я въезжаю легко и с полпинка, то, чтобы встать на рельсы, приходится прилагать какие-то прямо титанические усилия - временами, прислушиваясь, я могу услышать, как трещит щаблон у меня в голове.

Зато преимущества, которыми эти рельсы меня соблазняют...

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

Романтика.

diary.ru, часть 2

Сегодня выяснилось интересное - оказывается, openID, предоставляемый diary.ru (да-да, на этом прогрессивном ресурсе и такое даже есть), не поддерживается блогспотом.

Вот это я понимаю, сели в лужу перед всем Интернетом. Зато поддерживаются ЖЖ и лиру, говорите? Да кому нужен кусочек русского сегмента Интернета, если он варится в своем соку и не может взаимодействовать с остальным миром? На ЖЖ то же самое реализовано нормально. Лиру не пробовал, боюсь, честно говоря, трогать его даже трехметровым шестом.

Получилось как PHP - "Глобально и Надежно". Добро пожаловать в Будущее, сынок. Папа, почему здесь все так страшно?

Предыдущий пост о дайри

четверг, 28 января 2010 г.

Атомные депутаты

Почитать про атомных депутатов

(по следам поста твиттер-юзера Crelby )

Слышал уже про эту историю с истеричным депутатом, но не думал, что там все настолько маразматично. А письмо его, я считаю, следует повесить на стене в рамочку, и каждое утро, просыпаясь с постели, перечитывать его.

Затем вытирать сбегающие по щекам слезы и идти умываться.

P.S. В игру играл, лицензионную, уровня с аэропортом, естественно, не видел, о чем жалею, но исключительно потому, что кто-то решил за меня, что мне можно смотреть, а что нельзя.





diary.ru

Есть в интернете такой сайт - diary.ru. Он гордо носит название "сервис онлайн-дневников", перед всякими фишками на сайте стоят собачки (типа "@дневники", "@видео", "@спамреклама" и так далее).

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


Полный негодования утренний пост

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

И практически каждый день мне приходится проходить мимо курящих на лестнице товарищей.

Тут надо сделать небольшое отступление и сказать, что Арендатор, у которого вся эта братия снимает помещения, запрещает курить в зданиях - это пожароопасно и вообще. Чтобы донести мысль, что курить в зданиях Арендатора все-таки нельзя, на каждом лестничном пролете, аккурат у окна, где любят стоять курильщики, были вывешены объявления "Курить запрещается! Администрация блаблабла".

Однако люди - они как дети. Мозгом, которому лень протащить жопу и другие части тела на два этажа вниз, на площадку перед зданием, было найдено феноменальное решение, которое, я уверен, в будущем войдет в анналы истории. Объявления были просто сорваны/заклеены чем-то другим, и торжествующий Человек продолжил совершенно, по его мнению, справедливо нарушать правила Арендатора.

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

И так каждое утро.

вторник, 26 января 2010 г.

Про winlock

Надо сказать, что уже некоторое время функционирует раздел на нашем сайте, связанный с разблокировкой компьютера от всяческих винлоков: http://www.drweb.com/unlocker (в разработке которого я принимал непосредственное участие).

Однако вирусы успевают мутировать быстрее, чем они оказываются в наших списках (что, кстати, неизбежно). И вот в субботу я стал счастливым обладателем одного из таких винлоков, к счатью, сработанного без искры, без души.

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

Дальше - больше. В наших базах такого номера еще не было (что дало мне некоторый повод для гордости - ведь я стал кем-то вроде первопроходца, как же, как же), в чужих базах - тоже, гугление практически не помогло - в результате поисков мне стало известно только, кого искать - некий файл plugin.exe в директории Program Files.

Итак, пришлось чинить все руками.

Первым делом я загрузился в безопасном режиме. Баннера я не увидел, и это стало для меня хорошим знаком (и доказало, что винлок явно не доработали напильником, ведь некоторые умельцы присобачивают его аж к explorer.exe в качестве не то расширения, не то еще хрен знает чего, попутно блокируя безопасный режим).

Первым делом я удалил файлик plugin.exe из своих програм файлзов.

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

* Я создал файл plugin.txt
* переименовал его в plugin.exe
* и запретил производить над ним какие-либо действия через "Свойства файла"

Далее, в редакторе реестра я нашел все ключи, содержащие в себе упоминание "plugin.exe", и удалил их (естественно, разборчиво : ) ). После чего осталось только отключить автозагрузку plugin.exe через msconfig.

До сих пор все *тьфу-тьфу-тьфу* работает.

Определенно,

надо больше спать.

суббота, 23 января 2010 г.

Хехе

Вот так, незаметно, и подошла к концу рабочая неделя.

Сижу, слушаю Mojo Nixon и вспоминаю далекое детство, когда вовсю играл в Redneck Rampage - веселую игру про двух американских деревенщин-придурков, у которых инопланетяне регулярно крали свиноматку. Эту свиноматку и приходилось спасать в каждом уровне. И на диске с игрой был шикарнейший саундрек из кантри/рок-н-ролльных треков, в том числе UFO's, Big Rigs & BBQ и You can't kill me вышеупомянутого Никсона.

Что характерно - именно тогда, кажется, я впервые заметил, что моего знания английского языка вполне хватает, чтобы понимать процентов 80-90 из того, о чем поют. Что мне, откровенно говоря, понравилось.

И еще - вчера заслушивался Johny B. Good Чака Берри. Тоже приносит радость, да, хоть и связанную с другими воспоминаниями - трилогией "Назад в будущее", которую я тоже любил смотреть в детстве.


четверг, 14 января 2010 г.

Еще совы





Git туториал, часть 1

Вот собрал воедино все, что успел усвоить, чтобы не забыть. Лучший способ что-нибудь запомнить - описать, как ты это делал, зачем и почему. Причем, достаточно часто, осознание и понимание своих действий приходит именно во время их детального и пошагового описания.
В общем-то, знания в большинстве своем почерпнуты из gittutorial(7), но на всякий случай - пусть будут.

Это настолько fail, что даже win

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

[Озарение]

Чего только не произойдет среди ночи!

Решив перед сном полистать интернет, наткнулся на ветку форума, где, среди прочего, был описан вопрос, до которого у меня никак не доходили руки и голова - деление полиномов по модулю. Теперь в моей голове все с громким щелчком встало на свои места.

Не забыть бы с утра.

К вопросу о полярных совах


среда, 13 января 2010 г.

Дорога домой

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

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

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

Git и Github

До сей поры мое знакомство с системами контроля версий ограничивалось только CVS и SVN. С первой я работал "по бумажке" (использовал для скачивания модулей, изменять которые мне не требовалось - то есть просто держал у себя библиотеку, которую регулярно обновлял), а второй я пользовался по институтским нуждам, из виндового клиента TortoiseSVN. И вот на днях я обратил свой взор на git

Что могу сказать? Понравилось гораздо больше, чем SVN. Если пользоваться shared репозиторием, разницы, в принципе, мало (или я просто ее не заметил -  у меня, например, пока нет данных о разрешении конфликтов - кроме меня в мои репозитории никто ничего не пушит). Но можно еще держать этакую сеть репозиториев, которая, как я понимаю, удобнее для не очень крупных проектов (а если еще и параллельно отправлять изменения в центральный репозиторий и коллегам!). Одним словом, пока я вижу в нем преимущества.

Вот пытаюсь разобраться до конца, некоторые вещи пока неочевидны. Но, думаю, скоро все станет ясно.

Ах да, забыл рассказать про Github. Теглайн сайта - social coding. Этакий вконтактик для программистов. Можно делиться исходными кодами, слать друг другу патчи, лазить по чужим репозиториям, и все это, очевидно, работает на git.

Class instance variables в Ruby

Второй день уже бьюсь над понимаем сабжа. Как вчера вечером прочитал, так и завис.

А все дело в чем? В Руби каждый класс - это тоже объект, а переменные типа @@variable, которые я раньше считал "переменными класса", на самом деле принадлежат иерархии наследования (как-то так).
То есть, сочинив классу потомка, мы будем иметь доступ не к новой @@variable, а все к той же самой, и, поменяв ее в потомке, мы изменим ее и в предке! Не совсем то, что надо, если речь идет о переменной класса (ЕМНИП, в  C++ оно называлось static).

Дальше начинается магия. В Руби _все_ является объектом, в том числе, как уже было сказано, и сам класс. А значит, мы можем использовать @variable в определении класса, и эта самая @variable будет принадлежать не иерархии наследования, а только самому нашему классу.

Но как организовать к этой переменной доступ? Об этом - после рекламы далее.


вторник, 12 января 2010 г.

Первый пост

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