Собственно, в институте по "Программированию для Интернет" было дано задание - написать простенький веб-сервер.
Так как предмет ориентирован на .NET,а писать на C# не было никакого желания, сегодня напросился написать этот сервер на F#.
Хорошо хоть разрешили.
(setf *my-blog* (make-instance 'blog)) ;Also available in Common LISP
среда, 31 марта 2010 г.
вторник, 30 марта 2010 г.
Книжное.
Я люблю книги. Нежно и трепетно.
Разные и всяческие, скажем так. В плане литературы я практически всеяден. Мне нравится Лавкрафт, нравится Достоевский, мне нравятся стихи Бродского, мне нравится художественная литература по "Вархаммеру", я обожаю читать технические книги и научную фантастику.
Бывают, конечно, вещи, которые я читать совсем не могу по причинам стойкого отвращения (хороший пример - "Война и мир"). А также - те, которые просто не смог прочитать, по необъяснимым причинам (а это уже "Властелин колец", которого несколько раз начинал и засыпал).
Книги я люблю читать в бумажном виде, но, если нет бумажного варианта - в целом, нормально переношу и электронные версии.
На днях я разжился еще двумя книгами - "Краткая история времени" Хокинга и "Введение в теорию алгоритмических языков и компиляторов". Хокинга пока не начинал, предположительно, начну на выходных. Про компиляторы уже читаю - ничего не поделаешь, надо для института (хотя, откуда такой фатализм? тема-то очень интересная, да и написано вроде толково).
Параллельно я читаю Practical Common LISP, SICP и Programming F#.
Из художественного - пробую читать первую книгу из серии Mass Effect, но, ввиду решительного недостатка времени, ничего не получается. К сожалению.
Не так давно с удовольствием прочитал "Фулгрима" из цикла "Ересь Хоруса". Книга очень понравилась мне, и, думаю, понравится даже тем, кто не совсем в курсе событий из мира Вархаммера. В основе лежат старые как мир мысли о том, что "благими намерениями выложена дорога в Ад" и "от добра добра не ищут".
Разные и всяческие, скажем так. В плане литературы я практически всеяден. Мне нравится Лавкрафт, нравится Достоевский, мне нравятся стихи Бродского, мне нравится художественная литература по "Вархаммеру", я обожаю читать технические книги и научную фантастику.
Бывают, конечно, вещи, которые я читать совсем не могу по причинам стойкого отвращения (хороший пример - "Война и мир"). А также - те, которые просто не смог прочитать, по необъяснимым причинам (а это уже "Властелин колец", которого несколько раз начинал и засыпал).
Книги я люблю читать в бумажном виде, но, если нет бумажного варианта - в целом, нормально переношу и электронные версии.
На днях я разжился еще двумя книгами - "Краткая история времени" Хокинга и "Введение в теорию алгоритмических языков и компиляторов". Хокинга пока не начинал, предположительно, начну на выходных. Про компиляторы уже читаю - ничего не поделаешь, надо для института (хотя, откуда такой фатализм? тема-то очень интересная, да и написано вроде толково).
Параллельно я читаю Practical Common LISP, SICP и Programming F#.
Из художественного - пробую читать первую книгу из серии Mass Effect, но, ввиду решительного недостатка времени, ничего не получается. К сожалению.
Не так давно с удовольствием прочитал "Фулгрима" из цикла "Ересь Хоруса". Книга очень понравилась мне, и, думаю, понравится даже тем, кто не совсем в курсе событий из мира Вархаммера. В основе лежат старые как мир мысли о том, что "благими намерениями выложена дорога в Ад" и "от добра добра не ищут".
понедельник, 29 марта 2010 г.
суббота, 27 марта 2010 г.
F# Mono Bug, или Микрософт как всегда.
Наткнулся сегодня на интересный баг в F#.
До конца локализовать пока не удалось, но, кажется, что паттерн матчинг с 'a option неправильно работает.
Итак. Имеем код (да, это тот самый шифр цезаря :] ):
В винде все работает, как и предполагалось - написав в 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 с выводом типов вообще как-то не очень ладится. Не могли сделать все как в дотнет.
До конца локализовать пока не удалось, но, кажется, что паттерн матчинг с '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, который в убунте ставится командой
После чего подключается в .emacs:
Последняя строка подключает выбранную схему автоматически.
Кстати, тема hober, которая и предлагается по умолчанию, мне понравилась - давно хотел что-нибудь с темным фоном вместо обычного светлого.
Наслаждаюсь.
UPD: Только что открыл для себя команду M-x htmlize-region (и ее варианты htmlize-buffer etc). Однако, чего только емакс не делает :] Восхитительно.
Эта команда генерит html-код, в точности повторяющий происходящее у вас на экране (я имею ввиду цветовую схему, например). В код также входит css.
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. Повторюсь, это относится к людям в целом, а не к тем людям, которые интересны мне. Да, это двойные стандарты. Но почему бы и нет, в конце концов?
В целом, люди, что ни говори, ужасны. Отдельные представители человечества, с которыми я каждый день не без удовольствия общаюсь, например, или которые мне интересны (и так далее) - короче, назовем их "те, кто входит в мой круг интересов" - так вот, они хороши. Но все человечество в целом - ужасно. Непредсказуемо, стихийно, непонятно - и от этого ужасно.
С другой стороны - математика. В ней все подчинено определенному закону. Пойми этот закон - и вот ты уже понимаешь, почему события происходят так, а не иначе, что за этим стоит. (Конечно, за одним законом скрывается другой, но от этого их только интереснее открывать и понимать). Числа и функции стабильны, когда их понимаешь.
Числа я понимаю.
Людей нет.
Числа прекрасны.
Люди - нет.
P.S. Повторюсь, это относится к людям в целом, а не к тем людям, которые интересны мне. Да, это двойные стандарты. Но почему бы и нет, в конце концов?
Новое и рабочие моменты
Всем привет! Достаточно долго не писал, но совершил над собой волевое усилие, и вот я снова здесь.
Что же интересного произошло за последние дни? Ну, я практически добил Practical Common LISP - осталась глава про format, пакеты и несколько глав с примерами. Такими темпами скоро буду "On Lisp" начинать, наверное.
На работе - выпустили версию 6.0 :] И попутно обновили тултипы (хотя мне таки милее jQuery'вские наработки в этой области).
Также пощупал F#. Впечатления в целом положительные, а по сравнению с C# так вообще отличные. Конечно, немного расстраивает жесткая типизация, с другой - что ни делается, все к лучшему. Однако наличие в нем доступа к CLI не может не радовать - то, чем привлек меня в свое время Clojure (обширная библиотека), только без страшных джавовских наворотов (ну не могу я этого понять, чесслово, в дотнете гораздо все прозрачнее).
Наконец-то толком занялся институтскими делами, в частности, домашними заданиями. Теперь осталось только собраться, сосредоточиться и подтянуться.
Посмотрим, что получится.
Что же интересного произошло за последние дни? Ну, я практически добил Practical Common LISP - осталась глава про format, пакеты и несколько глав с примерами. Такими темпами скоро буду "On Lisp" начинать, наверное.
На работе - выпустили версию 6.0 :] И попутно обновили тултипы (хотя мне таки милее jQuery'вские наработки в этой области).
Также пощупал F#. Впечатления в целом положительные, а по сравнению с C# так вообще отличные. Конечно, немного расстраивает жесткая типизация, с другой - что ни делается, все к лучшему. Однако наличие в нем доступа к CLI не может не радовать - то, чем привлек меня в свое время Clojure (обширная библиотека), только без страшных джавовских наворотов (ну не могу я этого понять, чесслово, в дотнете гораздо все прозрачнее).
Наконец-то толком занялся институтскими делами, в частности, домашними заданиями. Теперь осталось только собраться, сосредоточиться и подтянуться.
Посмотрим, что получится.
пятница, 12 марта 2010 г.
Лицензия
Прикола ради добавил в репозиторий, в котором храню всякую институтскую фигню вроде лабораторных и домашних заданий, README с текстом MIT License.
Если я все правильно понимаю - теперь любой желающий может взять и сдать мою работу преподавателю (правда, сохранив при этом копирайт, хе-хе).
Если я все правильно понимаю - теперь любой желающий может взять и сдать мою работу преподавателю (правда, сохранив при этом копирайт, хе-хе).
четверг, 11 марта 2010 г.
вторник, 9 марта 2010 г.
Компилируем бинарники из лиспа - SBCL и clisp
Давно не писал, потому что пока что почти все вечера у меня заняты погружением в Коммон Лисп.
Пощупал Clojure, и она мне, в целом, понравилась, если бы не одно "но" - совершенно неочевидные внутренние механизмы джавы, благодаря которым я вообще не понимаю, что к чему, что это за classpath, зачем он нужен, почему его надо явно указывать и с какой стати мой простейший скрипт на две строчки тормозит полторы секунды перед выполнением. Конечно же, если вникнуть во внутреннее устройство джавки и научиться компилировать мои clojure-произведения в *.jar, все будет работать быстрее. Но это впереди, а пока что я решил закончить-таки Practical Common LISP.
И сегодня я расскажу, как компилировать бинарник в SBCL и clisp.
Итак, начнем с SBCL. Подготовив наш файл к запуску, а именно - написав функцию, которая будет запускаться первой (этакий int main() :] ), мы грузим sbcl-овский REPL и пишем там:
Получив в ответ "Т", мы, в принципе, готовы приступать к компиляции. Вводим в REPL:
По идее, функция #'save-lisp-and-die просто сохраняет состояние интерпретатора лиспа, если бы не... параметр :executable вместе с :toplevel. Они содержат явное указание - скомпилировать бинарник, при запуске которого выполнится функция function-name. В качестве дополнительного требования к function-name sbcl просит явно вызывать функцию (quit).
Итак, когда я попробовал указанные выше манипуляции впервые и получил результат, радости моей не было предела. До тех пор, пока я не взглянул на размер бинарника - а он оказался, ни много ни мало, 28 мегабайт. Ага, для простенького скрипта. Ну, это остается на совести создателей SBCL, тем более, думаю, вряд ли сейчас для кого-то проблема бинарники в 20+ мег. Впрочем, глубоко этот вопрос я не ковырял, скорее всего, можно и сократить объем файла.
Теперь перейдем к clisp:
Здесь видим, что :toplevel меняется на :init-function и, кроме того, добавляется параметр :quiet, который препятствует показу баннера clisp перед запуском вашей программы. Меня такие вещи бесят. Кому нравится - не указывайте :quiet вообще.
Добавлю, что ваша программа должна содержать вызов функции #'ext:exit, чтобы она нормально завершила работу (иначе после того, как ваша программа завершится, пользователю покажут clisp-овский REPL).
Бинарник таким образом получается всего 5,5 мег.
Пощупал 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 мег.
Подписаться на:
Сообщения (Atom)