Обо мне

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

среда, 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 мег.