четверг, 18 июня 2009 г.

Hunchentoot на 80-ом порту

Навеяно сообщением в списке рассылки tbnl-devel, я вдруг обнаружил, что не помню как это сделать, что называется, сделал и забыл. Порывшись в истории (я показывал эту команду catap-у) нашёл нужную команду:
sudo setcap CAP_NET_BIND_SERVICE=ep /usr/bin/sbcl
Пишу здесь, что б в следующий раз больше не искать, точнее рыться не в истории jabber-а, а просто в блоге (я пишу здесь заметно меньше) :)

среда, 17 июня 2009 г.

Убить ClozureCL

Оказывает это просто (по крайней мере, версию 1.3), такой вот код:
(asdf:operate 'asdf:load-op :lift)

(defpackage :clozure.lift.test
(:use :cl :lift)
(:export :test))

(in-package #:clozure.lift.test)

(deftestsuite clozure-lift-test () ())

(addtest (clozure-lift-test)
test1
(ensure-same 6000
(length (let ((str ""))
(dotimes (i 1000)
(setf str
(concatenate 'string
str
"Привет")))
(length str)))))

(defun test ()
(run-tests :suite 'clozure-lift-test :report-pathname nil))
Приводит к
An unhandled error condition has been signalled: value #<BOGUS object @ #x14BF07EE> is not of the expected type SEQUENCE.
Теперь контрольный выстрел:
(clozure.lift.test:test)
В итоге, ошибка сегментирования и скоропостижный конец...

вторник, 16 июня 2009 г.

cl-libxml2 в gentoo-lisp-overlay

cl-libxml2 теперь доступна пользователям Gentoo Linux через gentoo-lisp-overlay. Добиться этого оказалось чрезвычайно просто. Сначала я написал хозяину репозитория этого оверелея, но он предложил мне сделать заявку через Bugzilla, что я и сделал: зашёл на bugs.gentoo.org (я уже давно там зарегестрирован, как-то сообщал о проблеме с xalan-c) , выбрал действие "New-Ex", выбрал продукт "Gentoo Linux", в качестве компонента указал "Ebuilds", параметр "Severity" установил в "enhancement", в "Keywords" добавил "InOverlay", ввёл прочую информацию типа Url, Summary и Description, а в дополнительные подписчики ("CC") добавил common-lisp@gentoo.org (это, насколько я понимаю, существенно ускорило обработку), теперь "Commit" и следующим шагом приатачил ebuild-файл. Ну и появился в irc-канале #gentoo-lisp на FreeNode.

Может я правильно оформил заявку, а может там вообще ребята оперативные, но не прошло и двух часов, как Stelian Ionescu сообщил о том, что он добавил мои ebuild-файлы (их было два, для garbage-pools и cl-libxml2) в оверлей (а заодно и пропатчил мой Makefile для вспомогательной библиотеки).

понедельник, 15 июня 2009 г.

cl-libxml2-0.3.1

Выпустил новую версию cl-libxml2. Ключевые изменения:
  • Смена лицензии на Lisp LGPL
  • Перемещение исходного кода на github (об это я уже писал)
  • Добавление системы xfactory, которая позволяет достаточно просто генерить xml
  • Ну и ещё несколько небольших изменений
Пример использования XFACTORY:
(xtree:with-object (doc (xfactory:with-document-factory 
((XUL "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" "xul")
(SVG "http://www.w3.org/2000/svg" "svg"))
(xfactory:process-instruction "xml-stylesheet" "href=\"style.css\" type=\"text/css\"")
(XUL "window"
(xfactory:namespace "http://www.w3.org/1999/xlink" "xlink")
(XUL "vbox"
(xfactory:attributes :flex 1
:width 500)
(loop for i from 1 to 3
do (XUL "label"
(xfactory:text "text ~A" i)))
(SVG "svg"
(xfactory:attributes :width "500px"
:height "500px")
(SVG "a"
(xfactory:attributes "xlink:href" "http://www.w3.org")
(SVG "rect"
(xfactory:attributes :x 100
:y 100
:width 300
:height 200
:fill "red"))))))))
(xtree:serialize doc *standard-output* :pretty-print t))
==>
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="style.css" type="text/css"?>
<xul:window xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:xlink="http://www.w3.org/1999/xlink">
<xul:vbox flex="1" width="500">
<xul:label>text 1</xul:label>
<xul:label>text 2</xul:label>
<xul:label>text 3</xul:label>
<svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="500px" height="500px">
<svg:a xlink:href="http://www.w3.org">
<svg:rect x="100" y="100" width="300" height="200" fill="red"/>
</svg:a>
</svg:svg>
</xul:vbox>
</xul:window>

четверг, 11 июня 2009 г.

Исходный код cl-libxml2 теперь на github

В общем, окончательно принял решение переводить все свои открытые проекты на git. Поскольку Project Hosting on Google Code не поддерживает git (а mercurial я не хочу), то решил воспользоваться github. Подобный перевод требует некоторого времени, поэтому буду переходить поэтапно, первая "жертва" - cl-libxml2. Т.е. проект по прежнему будет жить на Project Hosting on Google Code, но исходный код на github. Посмотреть его (исходный код) сейчас можно здесь, а получить так:
git clone git://github.com/archimag/cl-libxml2.git
В принципе, svn я не выкидываю полностью, документация (хотя её сейчас и откровенно мало), как и раньше, будет публиковаться через неё (svn), сейчас её можно смотреть здесь

среда, 29 апреля 2009 г.

cl-pdf и кирилица в структуре документа

PDF как формат я полюбил ещё до знакомства с lisp, ну а после перехода на CL открыл для себя замечательную библиотеку cl-pdf. Библиотека и правда замечательная, но с самого начала у меня не получалось с её помощью создавать структуру документа (закладки), содержащую русские названия. Тогда в CL я разбирался ещё совсем плохо и поэтому на проблему просто забил. Но вот теперь захотелось для одного генерируемого документа сделать всё красиво, ибо он большой и нужны нормальные средства навигации. Начал разбираться и нашёл проблему в функции pdf-string, причём, видимо, эта проблема проявляется только в sbcl: код этой фукнции подразумевает, что, например, (code-char 254) имеет тип base-char, но в sbcl это extended-char. В итоге родился небольшой патч, решающий эту проблему:
diff --git a/pdf.lisp b/pdf.lisp
index 16d8f6f..b54b5a6 100644
--- a/pdf.lisp
+++ b/pdf.lisp
@@ -235,21 +235,20 @@
(setq unicode (notevery #+lispworks #'lw:base-char-p
#-lispworks (lambda (char) (<= (char-code char) 255))
string)))
- (with-output-to-string (stream nil :element-type 'base-char)
- (write-char #\( stream)
- (when unicode ; write the Unicode byte order marker U+FEFF
- (write-char #.(code-char 254) stream) (write-char #.(code-char 255) stream))
+ (with-output-to-string (stream nil :element-type 'base-char)
+ (if unicode
+ (write-string "<FEFF" stream)
+ (write-char #\( stream))
(loop for char across string
for code = (char-code char)
if unicode
- do (write-char (code-char (ldb (byte 8 8) code)) stream) ; hi
- (write-char (code-char (ldb (byte 8 0) code)) stream) ; lo
+ do (format stream "~4,'0x" code)
else if (> code 255)
do (write-char (code-char (ldb (byte 8 0) code)) stream) ; lo
else do (case char ((#\( #\) #\\)
(write-char #\\ stream)))
(write-char char stream))
- (write-char #\) stream))))
+ (write-char (if unicode #\> #\)) stream))))

(defmacro with-outline-level ((title ref-name) &body body)
`(unwind-protect

пятница, 10 апреля 2009 г.

Отладка в hunchentoot-1.0.0

Недавно я писал о проблемах с отладкой приложений для новой версии hunchentoot. Проблема обсуждалась в рассылке и наконец Andreas Fuchs предложил решение этой проблемы, как оказалось, достаточно тривиальное. Оригинальное сообщение можно посмотреть здесь: http://common-lisp.net/pipermail/tbnl-devel/2009-April/004688.html. Я несколько модифицировал этот код (добавил управление режимом через пресловутую переменную *catch-errors-p*):
(defvar *catch-errors-p* t)

(defclass debuggable-acceptor (hunchentoot:acceptor) ())

(defmethod hunchentoot:process-connection ((acceptor debuggable-acceptor) (socket t))
(declare (ignore socket))
(if *catch-errors-p*
(call-next-method)
(handler-bind ((error #'invoke-debugger))
(call-next-method))))

(defmethod hunchentoot:acceptor-request-dispatcher ((acceptor debuggable-acceptor))
(if *catch-errors-p*
(call-next-method)
(let ((dispatcher (handler-bind ((error #'invoke-debugger))
(call-next-method))))
(lambda (request)
(handler-bind ((error #'invoke-debugger))
(funcall dispatcher request))))))
Теперь, для получения удовольствия от использования отладчика достаточно просто использовать debuggable-acceptor вместо hunchentoot:acceptor при запуске сервера (hunchentoot:start).