<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1276325026160531839</id><updated>2012-03-19T23:59:57.780+04:00</updated><category term='lisp'/><category term='restas'/><title type='text'>Мемуары</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://uhalov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1276325026160531839/posts/default/-/lisp'/><link rel='alternate' type='text/html' href='http://uhalov.blogspot.com/search/label/lisp'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Дмитрий Ухалов</name><uri>http://www.blogger.com/profile/05796158088963568333</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/_is21pjAHlfY/S5DaKhx0auI/AAAAAAAAARg/SzZgJNKx7_o/S220/maestro-96x96.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1276325026160531839.post-1671219556328885088</id><published>2010-05-07T10:15:00.022+04:00</published><updated>2010-05-07T22:17:55.123+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='restas'/><title type='text'>Как я ставил RULISP</title><content type='html'>&lt;style type="text/css"&gt;
.post-body pre { margin-left: 25px; }
.post-body pre, .post-body code { font-size: 12pt; }
.post-body a { font-weight: bold; text-decoration: none; }
.post-body a:hover { text-decoration: underline; }
.post-body a:visited { color: #551A8B; }
&lt;/style&gt;&lt;br /&gt;
&lt;h2&gt;История установки &lt;a href="http://github.com/archimag/rulisp"&gt;RULISP&lt;/a&gt; для изучения.&lt;/h2&gt;&lt;br /&gt;
&lt;strong&gt;Предварительные условия&lt;/strong&gt;: у меня на машине с Gentoo установлен свежий SBCL (1.0.38.gentoo-r0), в портеж добавлен оверлей &lt;a href="http://github.com/archimag/gentoo-lisp-overlay"&gt;gentoo-lisp-overlay&lt;/a&gt;, из которого я буду ставить большинство пакетов CL. Также из портежа поставлен PostgreSQL 8.4 для базы данных форума.&lt;br /&gt;
&lt;br /&gt;
Использовалась инструкция по установке &lt;a href="http://lisper.ru/wiki/Развёртывание%20lisper.ru"&gt;отсюда&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Этап 1. Подготовка&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Для начала я создал рабочую директорию &lt;code&gt;~/workspace/lisp&lt;/code&gt; - здесь будут находиться пакеты, необходимые для запуска RULISP.&lt;/li&gt;
&lt;li&gt;В эту директорию загрузил следующие пакеты с &lt;a href="http://github.com/archimag/"&gt;гитхаба&lt;/a&gt;: &lt;a href="http://github.com/archimag/cl-closure-template"&gt;cl-closure-template&lt;/a&gt;, &lt;a href="http://github.com/archimag/cl-pdf"&gt;cl-pdf&lt;/a&gt;, &lt;a href="http://github.com/madnificent/cl-recaptcha"&gt;cl-recaptcha&lt;/a&gt;, &lt;a href="http://github.com/archimag/cl-routes"&gt;cl-routes&lt;/a&gt;, &lt;a href="http://github.com/archimag/colorize"&gt;colorize&lt;/a&gt;, &lt;a href="http://github.com/archimag/garbage-pools"&gt;garbage-pools&lt;/a&gt;, &lt;a href="http://github.com/archimag/puri-unicode"&gt;puri-unicode&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas"&gt;restas&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-colorize"&gt;restas-colorize&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-directory-publisher"&gt;restas-directory-publisher&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-forum"&gt;restas-forum&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-planet"&gt;restas-planet&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-simple-auth"&gt;restas-simple-auth&lt;/a&gt;, &lt;a href="http://github.com/archimag/restas-wiki"&gt;restas-wiki&lt;/a&gt;, &lt;a href="http://github.com/archimag/rulisp"&gt;rulisp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Создал директорию &lt;code&gt;~/workspace/lisp/systems&lt;/code&gt; для добавления пакетов в ASDF.&lt;/li&gt;
&lt;li&gt;Сделал симлинки на все файлы &lt;code&gt;*.asd&lt;/code&gt; из загруженных пакетов.&lt;/li&gt;
&lt;li&gt;В &lt;code&gt;~/.sbclrc&lt;/code&gt; прописал строчку для того, чтобы установленные пакеты были доступны в ASDF:&lt;br /&gt;
&lt;pre class="example"&gt;(push (merge-pathnames &amp;quot;workspace/lisp/systems/&amp;quot; (user-homedir-pathname)) asdf:*central-registry*)
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Создал от рута директории &lt;code&gt;/var/cache/rulisp&lt;/code&gt; (для кэша планеты) и &lt;code&gt;/var/rulisp&lt;/code&gt; (здесь будут храниться данные для вики). Так как я буду запускать программу от своего имени, то сделал &lt;strong&gt;chown&lt;/strong&gt; на эти директории.&lt;/li&gt;
&lt;li&gt;Скачал &lt;code&gt;http://pcl.catap.ru/snapshot.zip&lt;/code&gt; и распаковал файлы из содержащейся в нем директории &lt;code&gt;/var/www/pcl.catap.ru/htdocs/data/pages/pcl/&lt;/code&gt; в &lt;code&gt;/var/rulisp/pcl&lt;/code&gt; - это страницы dokuwiki для отображения в разделе &lt;strong&gt;PCL&lt;/strong&gt;. В файле &lt;code&gt;rulisp/pref.lisp&lt;/code&gt; исправил строчку, указывающую на расположение страниц PCL:&lt;br /&gt;
&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;*pcl-dir*&lt;/span&gt; #P&lt;span style="color: #bc8f8f;"&gt;"/var/rulisp/pcl/"&lt;/span&gt;)
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Чтобы не мучиться с зависимостями пакетов, имея оверлей gentoo-lisp-overlay, я просто поставил оттуда пакет &lt;strong&gt;restas&lt;/strong&gt; - он вытянул все необходимые для компиляции пакеты, а моя настройка в &lt;code&gt;~/.sbclrc&lt;/code&gt; заставляет SBCL использовать версии пакетов из гита. &lt;em&gt;(Как вариант можно во время компиляции получать ошибки вида &amp;quot;пакет XXX не найден&amp;quot; и тут же бежать в консоль его ставить. Но это неинтересно :).&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Этап 2. Создание базы&lt;/h2&gt;&lt;br /&gt;
Postgres у меня уже был настроен, так что я запустил &lt;strong&gt;psql&lt;/strong&gt; и создал базу &lt;strong&gt;rulisp&lt;/strong&gt;:&lt;br /&gt;
&lt;pre class="example"&gt;$ psql
&amp;gt; create database rulisp;
&lt;/pre&gt;Далее нужно было создать структуру базы, я воспользовался скриптами из директории &lt;code&gt;rulisp/install&lt;/code&gt;:&lt;br /&gt;
&lt;pre class="example"&gt;&amp;gt; \i ~/workspace/rulisp/install/user.sql
&amp;gt; \i ~/workspace/rulisp/install/forum.sql
&amp;gt; \i ~/workspace/rulisp/install/format.sql
&lt;/pre&gt;На файле &lt;code&gt;forum.sql&lt;/code&gt; я получил ошибку вида:&lt;br /&gt;
&lt;pre class="example"&gt;psql:forum.sql:83: ERROR:  language &amp;quot;plpgsql&amp;quot; does not exist
&lt;/pre&gt;Как выяснилось - для хранимых функций требуется поддержка языка &lt;strong&gt;PgPlSQL&lt;/strong&gt;. Чтобы её добавить, выполнил от имени пользователя &lt;code&gt;postgres&lt;/code&gt; следующую команду:&lt;br /&gt;
&lt;pre class="example"&gt;&amp;gt; create procedural language pgplsql;
&lt;/pre&gt;Теперь повторный запуск скрипта &lt;code&gt;forum.sql&lt;/code&gt; выполнился весь. Осталось выполнить скрипты обновлений &lt;code&gt;users.update-01.sql&lt;/code&gt;, &lt;code&gt;users.update-02.sql&lt;/code&gt;, &lt;code&gt;forum.update-1.sql&lt;/code&gt; и &lt;code&gt;format.update-01.sql&lt;/code&gt;.&lt;br /&gt;
В последнюю очередь исправил в файле &lt;code&gt;rulisp/pref.lisp&lt;/code&gt; строчку с параметрами подключения к базе данных (второе значение - имя пользователя, а третье я оставил пустым, так как запускаю из-под того же пользователя):&lt;br /&gt;
&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;*rulisp-db*&lt;/span&gt; '(&lt;span style="color: #bc8f8f;"&gt;"rulisp"&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;"lisp"&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;"123"&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;"localhost"&lt;/span&gt;))
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Этап 3. Запуск&lt;/h2&gt;&lt;br /&gt;
Запускал RULISP конечно же в &lt;strong&gt;Emacs&lt;/strong&gt; со &lt;strong&gt;SLIME&lt;/strong&gt;-ом. SLIME тоже взял с &lt;a href="http://github.com/archimag/slime-archimag"&gt;гита&lt;/a&gt;. Выполнил загрузку пакета rulisp:&lt;br /&gt;
&lt;pre class="src"&gt;CL-USER&amp;gt; (asdf:oos 'asdf:load-op &lt;span style="color: #da70d6;"&gt;:rulisp&lt;/span&gt;)
&lt;/pre&gt;Подождал немного, пока оно собирается и... получил странное сообщение:&lt;br /&gt;
&lt;pre class="example"&gt;erred while invoking #&amp;lt;COMPILE-OP NIL {1003B3B5D1}&amp;gt; on
#&amp;lt;CL-SOURCE-FILE &amp;quot;pcl&amp;quot; {10047DBF01}&amp;gt;
&lt;/pre&gt;Мучился я с ним недолго - такое уже бывало раньше при большом изменении пакетов. Я просто удалил &lt;strong&gt;FASL&lt;/strong&gt;-ы из &lt;code&gt;~/.fasls&lt;/code&gt; и запустил сборку еще раз. Теперь все прошло хорошо.&lt;br /&gt;
&lt;br /&gt;
Наконец-то :) запустил движок:&lt;br /&gt;
&lt;pre class="src"&gt;CL-USER&amp;gt; (restas:start '#&lt;span style="color: #da70d6;"&gt;:rulisp&lt;/span&gt; &lt;span style="color: #da70d6;"&gt;:port&lt;/span&gt; 8080)
&lt;/pre&gt;Открыл в браузере &lt;code&gt;http://localhost:8080&lt;/code&gt; и получил что-то очень &lt;a href="http://lisper.ru"&gt;знакомое&lt;/a&gt;. :) Побродил по страницам и разок выскочила ошибка &lt;code&gt;Internal Server Error 500&lt;/code&gt;. Чтобы посмотреть что происходит установил отладочный параметр:&lt;br /&gt;
&lt;pre class="src"&gt;CL-USER&amp;gt; (setf hunchentoot:*catch-errors-p* nil)
&lt;/pre&gt;Теперь в случае ошибок в Emacs выскакивает отладчик. Можно поглядеть содержимое переменных с помощью инспектора по C-c I.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Заключение&lt;/h2&gt;&lt;br /&gt;
Теперь в моей рабочей директории целая куча репозиториев, которые надо периодически синхронизировать. Чтобы меньше трудиться, написал простой скрипт для обновления &lt;code&gt;update.sh&lt;/code&gt;:&lt;br /&gt;
&lt;pre class="src"&gt;&lt;span style="color: #b22222;"&gt;#&lt;/span&gt;&lt;span style="color: #b22222;"&gt;!/bin/sh
&lt;/span&gt;
&lt;span style="color: #b22222;"&gt;# &lt;/span&gt;&lt;span style="color: #b22222;"&gt;&amp;#1057;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1072;&amp;#1083;&amp;#1072; &amp;#1086;&amp;#1073;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1083;&amp;#1103;&amp;#1077;&amp;#1084; &amp;#1074;&amp;#1089;&amp;#1077; &amp;#1083;&amp;#1086;&amp;#1082;&amp;#1072;&amp;#1083;&amp;#1100;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1088;&amp;#1077;&amp;#1087;&amp;#1086;&amp;#1079;&amp;#1080;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1080;&amp;#1080;
&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;for&lt;/span&gt; i&lt;span style="color: #a020f0;"&gt; in&lt;/span&gt; &lt;span style="color: #ff00ff;"&gt;`find . -maxdepth 1 -mindepth 1 -type d`&lt;/span&gt;; &lt;span style="color: #a020f0;"&gt;do&lt;/span&gt;
        &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; [ -d &lt;span style="color: #bc8f8f;"&gt;"${i}/.git"&lt;/span&gt; ]; &lt;span style="color: #a020f0;"&gt;then&lt;/span&gt;
                &lt;span style="color: #da70d6;"&gt;echo&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;"******* &amp;#1054;&amp;#1073;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1087;&amp;#1072;&amp;#1082;&amp;#1077;&amp;#1090;&amp;#1072; ${i}"&lt;/span&gt;
                &lt;span style="color: #da70d6;"&gt;cd&lt;/span&gt; $&lt;span style="color: #b8860b;"&gt;i&lt;/span&gt;
                git pull
                &lt;span style="color: #da70d6;"&gt;cd&lt;/span&gt; ..
        &lt;span style="color: #a020f0;"&gt;fi&lt;/span&gt;
&lt;span style="color: #a020f0;"&gt;done&lt;/span&gt;

&lt;span style="color: #b22222;"&gt;# &lt;/span&gt;&lt;span style="color: #b22222;"&gt;&amp;#1058;&amp;#1077;&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1100; &amp;#1089;&amp;#1086;&amp;#1073;&amp;#1080;&amp;#1088;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1079; SBCL &amp;#1089;&amp;#1086; SWANK
&lt;/span&gt;sbcl --noinform --noprint --disable-debugger --eval \
&lt;span style="color: #bc8f8f;"&gt;"(progn (load \"/home/maestro/workspace/lisp/slime-archimag/swank-loader.lisp\")\
 (save-lisp-and-die \"/home/maestro/.emacs.d/sbcl.core-for-slime\"))"&lt;/span&gt;
&lt;/pre&gt;И положил этот скрипт в директорию &lt;code&gt;~/workspace/lisp/&lt;/code&gt; - скрипт обходит все поддиректории и проверяет, есть ли в них &lt;code&gt;.git&lt;/code&gt;, а потом вызывает &lt;code&gt;git pull&lt;/code&gt; для обновления. Потом производится сборка образа SBCL для быстрой загрузки в Emacs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1276325026160531839-1671219556328885088?l=uhalov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uhalov.blogspot.com/feeds/1671219556328885088/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://uhalov.blogspot.com/2010/05/rulisp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1276325026160531839/posts/default/1671219556328885088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1276325026160531839/posts/default/1671219556328885088'/><link rel='alternate' type='text/html' href='http://uhalov.blogspot.com/2010/05/rulisp.html' title='Как я ставил RULISP'/><author><name>Дмитрий Ухалов</name><uri>http://www.blogger.com/profile/05796158088963568333</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='20' height='32' src='http://1.bp.blogspot.com/_is21pjAHlfY/S5DaKhx0auI/AAAAAAAAARg/SzZgJNKx7_o/S220/maestro-96x96.png'/></author><thr:total>0</thr:total></entry></feed>
