インストール

$ 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)

CVSからインストール

MacPortsにはあるがhomebrewには無いのでcvsに置いてあるのからインストール。

$ cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime

Emacsの設定

;; slime
(setq load-path (cons "/Users/komagata/code/slime" load-path))
(require 'slime-autoloads)
(setq slime-lisp-implementations `((sbcl ("/usr/local/bin/sbcl"))
(clisp ("/usr/local/bin/clisp"))))
(add-hook 'lisp-mode-hook
(lambda ()
(cond ((not (featurep 'slime))
(require 'slime)
(normal-mode)))))
(eval-after-load "slime"
'(slime-setup '(slime-fancy slime-banner)))

;; japanese
(setq slime-net-coding-system 'utf-8-unix)

SLIME on Mac(Install from source) from komagata on Vimeo.

slime-mode

C-c C-c
現在のトップレベルフォームをコンパイル
M-x slime-compile-region
リージョンをコンパイル
C-c C-k
カレントバッファのファイルをコンパイルし,ロードする(コンパイルが成功した場合だけロードされる)
C-c M-k
カレントバッファのファイルをコンパイルする(ロードしない)
C-c C-l
バッファのファイルをロードする
M-x slime-load-sysmtem
入力されたシステムの変更されたファイルをコンパイルしてロードする

homebrewでMacにインストール

$ brew install sbcl

http://localhost:9393/hello

Commit c6954984dca64cbc02ee28f63ec4f7ce56bec1b4 to komagata's lokka - GitHub

ktkr! 神降臨! > @yagi_

IRC(#lokka-ja)で適当に話してたことが既に実装されとる!

テーマAPIとプラグインAPIは超大切なのでプラグイン規約はちょっと悩みますね。@yagi_さんが書かれている通りですが、現状helloというプラグインを作るとするとこんな感じです

  • plugin/lokka-hello/lib/lokka/hello.rbがあればrequireする。
  • Lokka::Helloがあればregisterする。
  • helperはLokka::Helpersを勝手に再オープンしてメソッド追加すればよろし。

規約とは殆どが配置と命名の事です。配置はこんな感じです。

LOKKA_ROOT/
 plugin/
  lokka-hello/
   lib/
    lokka/
     hello.rb

URLの/helloにアクセスするとhelloと表示し、helloというhelperを追加するhelloプラグインの中身はこんな感じです。

module Lokka
  module Hello
    def self.registered(app)
      app.get '/hello' do
        'hello'
      end
    end
  end

  module Helpers
    def hello
      'hello'
    end
  end
end

簡単なルールでいいかもですね。

Lokkaの@yagi_さんのforkのplugin autoloadを辛抱たまらず勝手にマージしてみた。

$ git fetch git://github.com/yagitoshiro/lokka.git master:plugin-patch
$ git merge plugin-patch

Commit c01380f5d6d5ddf4145fa990c7d3d1ca03ed8bce to komagata's lokka - GitHub

404 not found - Lokka

サンプルのHelloプラグインが動いてないので明日もっとよく見る。今日は寝る。

まずMacPortsをアンインストール

(MacPortsで入れたzshをログインシェルにしてると裏世界でひっそり幕を閉じる。が、Terminal.appのshells option with:を/bin/shにすれば助かる。)

Homebrewをインストール。(Xcodeはその前に必要)

$ sudo chown -R `whoami` /usr/local
$ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"

gitをインストール。

$ brew install git

rvmをインストール

情報処理推進機構:プレス発表:記事:「2010年度日本OSS貢献者賞・日本OSS奨励賞」受賞者を選定

IPA(独立行政法人情報処理推進機構、理事長:藤江 一正)は、このたび、優れたオープンソースソフトウェア(OSS)の開発及び普及に貢献した個人等を表彰する「2010年度日本OSS貢献者賞」および「2010年度日本OSS奨励賞」の受賞者を選定しました。

今回発表された日本OSS貢献者賞2010に日本語プログラミング言語なでしこの作者、酒徳 峰章さんが受賞されていました。おめでとうございます。

以前、尊敬するエンジニアは誰?と聞かれたときに、DHHですかねー?などと適当に答えてしまったんですが、本当は酒徳さんだなあーと。

どれが良い悪いではなく、プログラマーを

  • 0を1にするのが得意な人
  • 1を10にするのが得意な人
  • 10を100にするのが得意な人

の3つに分けるとしたら酒徳さんは0を1にするタイプの人だなあと思っていました。

酒徳さんを初めて見たのは確かオープンソースカンファレンス2005だか2006で、なでしこの発表をされている時でした。その頃僕はプログラマーというと早口で捲し立てる完璧主義者というイメージを持っていたので、(プログラマーにもこんなにゆっくりしゃべってくれる優しそうな人がいるのか)と驚いたことを覚えています。

その後ウノウで働く中で数回ペアプロやったり、酒徳さんの活動をウォッチしてたんですが、とてもユニークな人で、僕もこういう風になりたいなと思うようになりました。(社内で聞こえてきた会話の断片などを元に記憶を掘り起こしているので事実と違うところをがあるかもしれません。)

プログラミングが半端じゃなく好き

ウノウで開発合宿をしたとき、WindowsのGUIアプリを誰か(ココイチさんかな?)が作っていて、「よくあるこういう処理ってどうすればいいんでしたっけ?」と聞いたときに酒徳さんが「それならいいのがありますよ」といって取り出した自作ライブラリの名前が"BenriUtil"。「BenriUtilっていい名前ですね!」というと「これ、便利なんですよ・・・」と言っていました。

また別の時は、「女子高生にプログラミングをしてもらうには携帯しかない!」と言って、FlashLiteのプログラムを良く知るためにActionScriptを始めていました。(Web開発環境"葵")

「Delphi好きの我々にとっては馴染み易いですね」(変数宣言の名前と型の順番が同じ)と言って勉強のために作ってたのがHello, Worldではなく、1マス1マスが人の形の画像を使ったライフゲーム。

僕自身も、上手い下手は兎も角、(ご飯が食えて、死ぬまでプログラミングが出来ればそれでいいや・・・)と考えてるクチなんですが、それでも酒徳さんよりプログラミングが好きか、楽しんでやっているかと問われると自信がありません・・・。

極端な成果物指向

元々、酒徳さんが"日本語プログラミング言語ひまわり"を作ったのは会社のアルバイトの人の業務自動化のためだそうです。

ウノウでCTOの尾藤さんがペアプロの時に、酒徳さんがプログラミング言語やコンパイラを作るときには普通必ず使うであろう技術やツールを知らないことに驚いていました。「今までどうやっていくつも言語を作ってきたんですか?」って。

酒徳さんはというと「おお、こんな便利な物があったんですね!これは凄いですね!」と言っていました。

しかし、その後、周りの人に聞いたり、定番の書籍(ドラゴンブック等)を読んであっという間に習得していました。

「これで次からはプログラミング言語がもっと楽に作れる!」とか言ってました。

成果物指向かつ楽しんでやりたい

0を1にするには極端に独善的である必要があります。しかし、酒徳さんはそういった欲望を他人に迷惑の掛からない自分のソフトウェアのコードの中だけで爆発させているように見えます。

僕自身は上記3種類でいったら1を10にするタイプかなあ・・・と思っているので直接的には真似出来ませんが、常々、酒徳さんをリスペクトしている次第です。

MacでTerminal.appから起動したアプリとFinder/Spotlightから起動したアプリの環境変数が違う。(厳密にはFinderとSpotlightも違う)

MacVimから色々やろうとしたときにかなりウザイ。

:!rvm
zsh:1: command not found: rvm

shell returned 127
:!echo $PATH
/Applications/MacVim.app/Contents/MacOS:/usr/bin:/bin:/usr/sbin:/sbin

・・・ほう(イラッ

/etc/launchd.confでsetenvすればいいそうです。(なんでcshみたいな書き方なんだろう?)

# /etc/launchd.conf
setenv PATH /Applications/MacVim.app/Contents/MacOS:/Users/komagata/.rvm/gems/ruby-1.8.7-p299@ruby1.8.7/bin:/Users/komagata/.rvm/gems/ruby-1.8.7-p299@global/bin:/Users/komagata/.rvm/rubies/ruby-1.8.7-p299/bin:/Users/komagata/.rvm/bin:/Users/komagata/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

PATH in MacVim

できた。

(/etc/pathsやenvironment.plistで設定する方法もあるみたいですが、Finder/Spotlightの両方共設定することが出来なかったのでこの方法です。)