典型的な一日のスケジュール

  • 8:30 - 起床。
  • 9:00 - 渋谷区スポーツセンターのジム。(火・木だけ)
  • 11:00 - 出社。
  • 13:00 - 昼飯。
  • 14:00 - 仕事のコードを書く。
  • 19:00 - 退社。
  • 19:30 - 夕食。
  • 20:00 - 趣味のコードを書く。
  • 24:00 - 就寝。

要はコードを書いてるんですが、一応、就業時間内は仕事のコード、それ以外は趣味のコードと必ず分けるようにしています。

仕事ではLispパーカーのサイトやHelp me, hackers!等を書き、趣味ではLokkaを書いています。帰ってから毎日4時間はLokkaを書いているんですが、なかなか進みません。自分で書きつつ、他のRubyプログラマーの方に興味を持ってもらえるようにしないといけないなと思っています。

ネットのお陰で暇の潰し方などいくらでもある昨今、他人の興味やコミットメントは貴重な資源だとつくづく感じています。(ニコ動見てたら楽しく一日を終わらせることなど容易)

そんな中、ruby1.9.2対応などで沢山コミットしていただいた@tyabeさんがLokkaのコミッタになってくれました。(要はgithubリポジトリのcollaboratorsに追加)

あざーす!

Lokkaのプラグインの機能を修正しました。

komagata's lokka at master - GitHub

修正点

  • プラグインのフォルダ名規則を変更(foo -> lokka-foo)
  • プラグインフォルダを移動(/plugin -> /public/plugin)

フォルダ名はそもそもlokka/foo.rbだったのでオートロードの命名に従えばlokka-fooのハズ、というのと、プラグインをgemにするときのためです。(sinatra-logger, rack-flashみたいに。)

プラグイン命名規則は要は下記。

Dir["public/plugin/lokka-*/lib/lokka/*.rb"]

フォルダ移動はプラグイン内にcssや画像を置けるようにです。WordPress的に。

RbConfig Plugin - Lokka

これはrbconfigというプラグインを試しに作ってみて、問題が出たところを修正した感じです。rbconfigプラグインは単にrubyインタプリタの情報を表示するrbconfigを出すだけのプラグインです。

# lokka-rbconfig/lib/lokka/rbconfig.rb
require 'rbconfig'

module Lokka
module Rbconfig
def self.registered(app)
app.get '/admin/plugins/rbconfig' do
haml :"plugin/lokka-rbconfig/views/index", :layout => :"admin/layout"
end
end
end
end
# lokka-rbconfig/views/index.haml
- content_for :head_last do
%link{:rel => 'stylesheet', :href => '/plugin/lokka-rbconfig/views/style.css', :type => 'text/css'}
%h2 RbConfig
%dl.rbconfigs
- Config::CONFIG.each do |key, value|
%dt= key
%dd= value

中身はこんな感じです。

問題点

作ってみてプラグイン機能の課題がいくつかできました。

  • テンプレートの指定が冗長
  • 管理画面や他のテーマのlayoutを利用する場合はテンプレート言語が同じである必要がある。(管理画面の場合はhaml限定になる)
  • プラグインがページを持ってない場合もあるのでプラグイン一覧からリンクを貼っていいのか悪いのか、どこに貼ればいいのかわからない。(lokka本体にプラグインのページを知らせる方法が無い)

もしインストールしてみた方で自分用に修正した箇所とかあれば是非、気軽にpatchやpull requestしていただけるとありがたいです!

ローカルのMacでは動いてるんだけど、Debian lenny(5.0.6)だと、

$ wget http://beta.quicklisp.org/quicklisp.lisp
$ sbcl --load quicklisp.lisp
* (quicklisp-quickstart:install)
* (ql:add-to-init-file)

した後に再度立ち上げると下記のエラーが。

$ sbcl
This is SBCL 1.0.18.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at .

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
WARNING:
Error while scanning system definitions under directory #P"/usr/lib/sbcl/":
unknown &KEY argument: :RESOLVE-SYMLINKS
WARNING:
Error while scanning system definitions under directory #P"/usr/share/common-lisp/source/":
unknown &KEY argument: :RESOLVE-SYMLINKS

debugger invoked on a SIMPLE-ERROR in thread #<THREAD "initial thread" RUNNING {a8345c9}>:
Error during processing of initialization file /home/deployer/.sbclrc:

The name "SB-BSD-SOCKETS" does not designate any package.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [TRY-RECOMPILING] Recompile impl and try loading it again
1: [RETRY ] Retry loading component ("quicklisp" "impl").
2: [ACCEPT ] Continue, treating
loading component ("quicklisp" "impl") as having been
successful.
3: [CONTINUE ] Ignore and continue processing.
4: [ABORT ] Skip this initialization file.
5: Skip to toplevel READ/EVAL/PRINT loop.
6: [QUIT ] Quit SBCL (calling #'QUIT, killing the process).

((FLET #:LAMBDA69) #<SB-KERNEL:SIMPLE=PACKAGE-ERROR {b30ee31}>)
0]

20080618211322.gif

ざんねん!!
わたしの ぼうけんは これで おわってしまった!!

(SBCLを最新版にしたら動きました!Thank! Zach Beane and ルシフェルw)

An interview with Paul Graham : The Setup

And what software?

I use surprisingly little client software. All I really use on my Mac is Firefox and Terminal. I use the usual Unix utilities (vi for editing). I use Arc for programming, which in turn runs on top of MzScheme.

Paul Grahamもvi使ってるってことでShibuya.lisp Hackathon #1でArcの@mgikenさんもvimを使ってることに納得。VimShellを使ってるとお聞きしたので僕もSBCLでやってみた。

% vi
Error detected while processing /Users/komagata/code/dotfile/vim/.vim/plugin/vimshell.vim:
line 48:
g:VimShell_EnableInteractive option does not work this version of vimshell.

普通にvimshellをgithubから落としてきてインストール。(※最近のバージョンではg:VimShell_EnableInteractive optionが使えないのがちょっとしたハマりポイント)

" vimshell
nmap :scl :VimShellInteractive sbcl<cr>
nmap :sirb :VimShellInteractive irb<cr>
vmap <silent> ,s :VimShellSendString

.vimrcにこんな感じでsbclとirbをVimShellInteractiveで起動するキーマップを設定して、コードの選択範囲をVimShellに送る設定をしてみた。

SBCLの場合

VImShell + SBCL

irbの場合

VimShell + irb

ホント単にREPLに文字送るだけなんだけどとても便利。vimユーザーにとってはコレぐらいシンプルなのが使い易いかも。後はカレントバッファの内容を全部REPLに送りたいんだけど普通のvim設定の書き方が分からない・・・。

会社でさくらのVPS借りたら既に時代はCentOS 5.5。ヒャッハー。

$ cat /etc/redhat-release 
CentOS release 5.5 (Final)

さくらのVPSでは既にDebianがコンパネから選べるようになってるけど典型的なLokkaインストール先として手順作りたかったのでCentOS。というか会社のサーバーとして使う場合、大した事しないので「もうどっちでもええわ!」という感じになってきてヤバイ。自分がデスクトップで使う場合は絶対Debianじゃないと嫌だけど。

git

$ wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
$ wget http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
$ sudo rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

rpmforgeをリポジトリに追加して入れる。

$ sudo vim /etc/yum.repos.d/rpmforge.repo
#enabled = 1
enabled = 0

rpmforgeはあんまり信用ならない感じがするのでデフォルトオフにする。

$ sudo yum -y --enablerepo=rpmforge install git

ruby

$ sudo yum install curl-devel openssl-devel zlib-devel readline-devel ncurses-devel

zlib-develはrubyをソースからいれた時にrubygemsに必要。curl-devel, openssl-develはpassengerに必要。readline-devel, ncurses-develはirbに必要。

$ cd /tmp/ruby-1.8.7-p302/ext/openssl
$ ruby extconf.rb
$ make
$ sudo make install

passengerインストール前にopenssl-develを入れた上でrubyソースの中のopenssl拡張を入れる必要あり。

$ cd /tmp/ruby-1.8.7-p302/ext/readline
$ ruby extconf.rb
$ make
$ sudo make install

irbはreadline拡張を入れる必要あり。

運営に携わった方々は大変だったとおもいます。お疲れ様です。ありがとうございました!

自分の内容的には予想以上に僕がヘボくて進まなかった感じ。

やりたい事は単に"hunchentootで1ページ作りたい(CSSとか画像も)"ってだけ。

今回はasdfではなく、quicklispを使ってみました。hunchentootのコードで古いページを参考にしてたので該当の関数が無かったりしてモタモタ。結局は@g000001さんに@quekさんのこのエントリーをコピペして動かしてもらった感じ。

LispパーカーのページはLispで動いてなきゃイカンだろうということで勉強始めてるんですが、setqとsetfの違いもよく分かってないような状態。とにかくgithubに公開しつつやっていきたいと思います。

komagata's alien-fjord-jp at master - GitHub

改善したいところ

  • PATH的なものが設定されてれば(ql:quickload "hunchentoot")じゃなくて普通に(require "hunchentoot")できるのではないか。そのやり方が知りたい。
  • 元はexecutableなイメージを作るためのコードなのでエントリポイントとなるmain関数は要らないハズ。
  • *posix-argv*に再代入してるのは強引過ぎるので普通に指定したい。
  • "/"で"/index.html"にアクセスしたい。
  • *invoke-debugger-hook*は何だろう?エラーが発生してdebuggerが動いたらexit(1)するってことかな?
  • どうせ1ページだったら静的htmlを読み込まずにcl-whoで書きたい。

ツッコミいただけるとありがたいです。(+勉強になります)

@machidaさんのLispパーカー(ラフ)

パーカーdemo

素敵!僕的にはもうちょっとあの異常なエイリアン君のボディが見えたら楽しいかなと思いました。ギークTシャツはいっぱいあるけど、Lispパーカー集団でHackathonしたらヤバイ感じでオモロイと思いました。

元ネタは下記ですね。

トカゲのアイコンを使わないのはとても良いと思います。Lispは古くからのAlien Technologyってのがキャッチーで楽しいですね!

HaskellやLispやFORTHなどの素敵な言語はそれ自体が完結した綺麗な世界を構築しているので汚い外界(UNIXとか)といやいやストリームを絆いでる感じがします。(妄想)

なので、僕らが新しい言語で動かしてまずホッとするところのHello, Worldが入門に出てきません。REPLやEmacsでリスト操作とかそういうのばっかり。そんな僕がホッとするHello, Worldのやり方を教えてもらいました。

#!/usr/bin/env sbcl --script
(format t "Hello, World~%")
$ ./hello.lisp 
Hello, World

どうこれ。僕らの様なIT土方にとってはこういうのがホッとします・・・。

インストール

$ brew install gnupg

portはgpg2とかmysql5とか切ないコマンド名になるが、brewはならないので嬉しい。

$ gpg --gen-key
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ご希望の鍵の種類を選択してください:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
選択は?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で満了
<n>w = 鍵は n 週間で満了
<n>m = 鍵は n か月間で満了
<n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)
Key does not expire at all
これで正しいですか? (y/N) y

あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
"Heinrich Heine (Der Dichter) "

本名: Masaki Komagata
電子メール・アドレス: komagata@gmail.com
コメント:
次のユーザーIDを選択しました:
“Masaki Komagata

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

秘密鍵を保護するためにパスフレーズがいります。

今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
+++++
.+++++
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
+++++
....+++++
gpg: /Users/komagata/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵C138E9C6を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/C138E9C6 2010-10-24
指紋 = 7561 4664 1FE1 22EC A050 B4CF 9397 D6B9 C138 E9C6
uid Masaki Komagata
sub 2048R/7A1DDA53 2010-10-24

~/.gnupg以下に色々出来てる。

以前@g000001さんにSBCL+SLIMEのデモを見せてもらった時、関数やマクロの定義にジャンプできるだけでなく同じノリでアセンブリまで降りて行けれるのを見せてもらってびっくりした覚えがあります。コンパイラとデバッガが言語仕様に含まれてるCommon Lispならではですね。

* (defun main () (format t "unk~%"))

MAIN
* (save-lisp-and-die "unk" :toplevel #'main :executable t)
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into unk:
writing 5248 bytes from the read-only space at 0x20000000
writing 3088 bytes from the static space at 0x20100000
writing 40529920 bytes from the dynamic space at 0x1000000000
done]

SBCLではsave-lisp-and-dieで実行可能バイナリファイルを作成できるみたいです。

$ ./unk
unk

「ほう、経験が生きたな」(@ブロントさん)

$ du -h unk
39M unk

でかい!でもまあこれは仕方がない。

$ file unk
unk: Mach-O 64-bit executable x86_64

当たり前だけどMacではELFじゃなくてちゃんとMach-Oなんですね。これじゃ@g000001さんがやってたみたいな、"ローカルで適当な実行可能イメージを作ってLinuxサーバーにアップ"なんてことできませんな。

明日はShibuya.lisp Hackathon #1 : ATNDに行きます。

@g000001さんと@quekさんと同じ会社にいたお陰でLispといえばCommon Lispだと洗脳されているのでCommon Lispを再び勉強したい。

@machidaさんも行くので何をやるのか相談しました。@machidaさんが”Made with secret alien technology”パーカーをデザイン・販売サイトへの登録して、僕がhunchentootでペラいちのページを作るというのをやったらどうかなと。(最近さくらのVPS借りたので)

hunchentootで1ページなんてインストールするだけだろう?と思われるでしょうが、初心者以前の僕は恐らく、CentOS上でhunchentootが動かないとかどハマりしていい課題になるのではないかと・・・。

当日の課題

  • Emacs設定
  • SBCLインストール
  • SLIMEインストール
  • asdfインストール
  • Hunchentootインストール
  • cl-whoの勉強
  • shellから実行できるbinaryを作る調査
  • サーバー設定(mod_proxy)