「MacのLeopardからはSpotlightが高機能になったのでランチャーとかあんまり要らない」

的なエントリーをどこかでみたんですが、僕の使い方が悪いのか、望んでるのと違う感じで、windowsの「ファイル名を指定して実行」(以下ファ実)と比べてストレスが溜まっています・・・。

要は、「引数付きでコマンドを入力したい」んですが、どうもSpotlightは検索用でそういう物では無い?

ファ実ではW-r(windowsキー+r)で入力欄が開き、引数付きでコマンドが実行できるので、例えばパスの通ったところにsayというコマンドを作っておいて、

W-r say これ強キック効きませんけど?

で喋るとかが出来たし、補完も効いた。

spotlightでも

C-Space scp komagata.org:/home/komagata/foo.txt ~/Documents/

とかが出来て欲しい。AppleScriptに一連の引数付きでスクリプトを作ればランチャーとして呼べるけど、引数との組み合わせで色々やりたい。

QuickSilverをインストールしてみたら動かなかった。(更新が止まっている?)

皆さんどうやってるのか非常に気になります。

関連:

AllegroServeのインストール

Commonlisp(今後CL)にはasdfというパッケージシステムがあるそうです。

(require 'asdf)
(require 'asdf-install)
(asdf-install:install 'aserve)

asdfをrequireしてasdf-install:installするとwebから取って来て、依存関係を含めてコンパイルしてインストールしてくれる。

CLiki : ASDF-Installここに書いてあるパッケージを見てインストールしてくれるみたいです。

RubyでいうとGitHub RubyGemsみたいなもんなのかな?

下記の依存パッケージも入りました。

  • acl-compat
  • cl-ppcre
  • cl-unicode
  • flexi-streams
  • trival-gray-streams
  • puri
  • htmlgen

何か便利そうなのいっぱいありますね。

aserveの起動

(require 'aserve)
(net.aserve:start :port 8888)

上記で起動。

(net.aserve:publish
          :path "/" 
          :content-type "text/html; charset=utf-8" 
          :function
          #'(lambda (req ent)
              (net.aserve:with-http-response
                  (req ent)
                (net.aserve:with-http-body
                    (req ent)
                  (net.html.generator:html
                    (:html
                      (:head (:title "Hello World!"))
                      (:body "Hello World!")))))))

foo:barっていうのはメソッドかな? net.aserve:publishというのでリクエストと関数をマッピングするそうです。

「rackかsinatraみたいだ!」

と一瞬思いますが、そもそもプリミティブなHTTPってこういうもんですよね。

が、ブラウザからアクセスするとエラーが。まったくイミフですが、こちらに解決策を載せてくださってるのでそのまま実行。

長いのでファイルに保存して読み込むとか出来ないのかな?と思ってやってみました。

foo.lispという拡張子はSLIMEがSLIMEのモードとして開いてくれるらしく、C-M-xで評価できて凄く便利!

~/code/cl/boot-aserve.lisp というファイルに保存しました。

(load "code/cl/boot-aserve")

で読み込めるみたいです。

(net.aserve:publish
          :path "/" 
          :content-type "text/html; charset=utf-8" 
          :function
          #'(lambda (req ent)
              (net.aserve:with-http-response
                  (req ent)
                (net.aserve:with-http-body
                    (req ent)
                  (net.html.generator:html
                    (:html
                      (:head (:title "Hello World!"))
                      (:body "Hello World!" 
                       :br
                       (JPN "へろー"))))))))

上記を実行してブラウザのlocalhost:8888にアクセス。

Hello World!

出た。

JPNというマクロで日本語がちゃんと出るようになってるみたいです。webサーバーの方で対応したいな。他にいいwebサーバーないのかしら?

参照:

デフォルトのエディター設定

% sudo update-alternatives --config editor

Redmineのタスクの更新メール、自分に関係あるものだけ届くようにしてるんですが、複数のプロジェクトが平行して動いているのでいかんせん数が多い。(ミーティングが多い日などは1日でいきなり100通超える)

Gmailでj,kを使ってどんどん見て行くんですが、最近高速に処理するコツが分かって来た。

チケットメールを素早く処理するコツ

基本、(HTMLメールにした場合)このhr線から上だけを見て行けばサクサク処理できる。

[いこーよ </del> 新機能 #1662] いこーよをRails 2.3.3へいこーよ。 <del> komagata@gmail.com </del> Gmail

  • ハマってるところで知ってることがあったら「たしかxxxってブログに乗ってましたよー」とか書く。
  • チケットの内容がよくわからない場合は「イミフ」とだけ書くと、チケット作成者が内容を見直すという合意をしておく。

チケット作成で繰り返し起きるコミュニケーションミスを減らすコツ

新規チケットを作る時にテキストエリアにデフォルトのテンプレを設定しておくと書かなきゃ行けないことがわかりやすい。(特に終了条件が曖昧だと作業者は非常にやり辛い。明確な成果物やエビデンスを残すことをゴールにすると上手く行く。)

「xxxを考える/決定するという」タスクが乱立するしていたら、「xxxの内容をまとめてxxxさんにメールする」「Googleサイトに内容をまとめる」などに変更すると終了条件が明確化する。

いこーよ </del> Redmine(タスク管理)

デフォルトテンプレを入れるredmine 0.8系trunkへのdiff:

Index: app/controllers/issues_controller.rb
===================================================================
--- app/controllers/issues_controller.rb        (リビジョン 2819)
+++ app/controllers/issues_controller.rb        (作業コピー)
@@ -115,6 +115,7 @@
     @issue = Issue.new 
     @issue.copy_from(params[:copy_from]) if params[:copy_from]
     @issue.project = @project
+    @issue.description ||= l(:default_issue_description)
     # Tracker must be set before custom field values
     @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
     if @issue.tracker.nil?
Index: lang/ja.yml
===================================================================
--- lang/ja.yml (リビジョン 2819)
+++ lang/ja.yml (作業コピー)
@@ -635,9 +637,10 @@
 setting_mail_handler_api_key: APIキー
 text_email_delivery_not_configured: "メールを送信するために必要な設定が行われていないため、メール通知は利用できません。\nconfig/email.ymlでSMTPサーバの設定を行い、アプリケーションを再起動してください。" 
 field_parent_title: 親ページ
-label_issue_watchers: Watchers
+label_issue_watchers: ウォッチャー
+default_issue_description: "h3. 目的\n\n(何故このタスクをする必要があるのか)\n\nh3. 終了条件\n\n# (終了条件1)\n# (終了条件2)\n# (終了条件3)" 
 setting_commit_logs_encoding: コミットメッセージのエンコーディング
-button_quote: Quote
+button_quote: 引用
 setting_sequential_project_identifiers: プロジェクト識別子を連番で生成する
 notice_unable_delete_version: バージョンを削除できません
 label_renamed: renamed

Redmine上だけで問題を追跡するコツ

  • チケット解決時には関連するリビジョン番号を入れる「r654 で修正」とリポジトリブラウザにリンクが張られる。
  • svnとかのフックの設定をしておくて、コミットログに「fixes #1234」とか書くだけで“解決”+“進捗100%”にしてくれると同時にリポジトリブラウザからチケットへのリンクが張られる。
  • コード上の気になるところはコードレビュープラグインで疑問を書いておく。

開発人数をスケールさせるにはRailsの設計思想みたいに、開発環境も中央集権的ではなくて、「何も共有しない」というようにすると上手くいくなあと感じます。 (リモートからのみの作業者と共同で開発する場合)

自由な場所 </del> p0t

こんな感じでプログラミングって楽でいいかもなあと、膝パソコンを実践してみたら結構まじめに良い。

MacBookぐらいバッテリーが持てば、大抵は電源無しで済んで、寝る時に充電しとけばいいので取り回しが楽。

ソファー

外部ディスプレイはリビングPC的な物として、眠ってたノートPCにつなげてみました。

リビングPC的なもの

windowsを192dpiぐらいに設定すると全部巨大になって結構見易い。Firefoxなら画像も拡大してくれるし、拡大しといたURLも記憶してくれるので便利。

coLinuxにremedie入れてiTunesとremedie専用になりました。(操作はMacBookからvncでする)

ThinkPad x61もあるんですが、膝パソコンすると裏面はパームレストどころじゃない熱量を発するんでちょっと厳しいです・・・。

関連:冷えピタ – p0t

・・・なんて小洒落たエントリーで終わると思ったか!!糞がぁ!

REAL ARCADE PRO.3

膝パソコンとか言ってる場合じゃない! 膝RAP3(REAL ARCADE PRO.3)なんですよ!

参照:【ニコニコ動画】ウメハラキメル

関連:オーバースペックコントローラー – p0t

テーブル、椅子、こたつ、布団を粗大ゴミに出しました。

リサイクル業者に頼むと大きなテーブルとかは物凄く高くつくイメージだったんですが、区の粗大ゴミに頼んだらテーブルが600円、他は300円で事足りてお得な感じでした。

渋谷区/粗大ごみ(有料)

ネットから引き取りに来てもらう日と対象を登録して、当日8:00時までにコンビニで粗大ゴミ券買って張って出しておくだけ。

ソファーベッド以外の家具を全部出しちゃった感じです。すっきりした。

テーブル

全部捨てた結果がこれだよ!

p0t.jp と gemcasts.org のドメイン失効しちゃいました。

ドメイン更新なんて、マヤの暦が2012年で一周するとかそのぐらい未来のことかと勝手に考えていました・・・。

他にも色々失効したんですが、何故かというと、p0t.jp がドメイン切れ期限を知らせるメールの宛先になっていたため、まず p0t.jp が切れて、それに依存している他のドメインもスルーしてしまうという・・・。

ドメイン更新忘れずに

今度は忘れない様に、1年周期のイベントとしてGoogleカレンダーに登録しておきました。

これでドメインの件は忘れてOK。

リビングPC的なもの(Debian Lenny)にRemedieインストール。(また)

% sudo apt-get install perl perl-modules git-core build-essential libxml2 libxml2-dev libxml-atom-perl libxml-feed-perl libxml-libxml-common-perl libxml-libxml-perl libxml-perl libxml-rss-perl libxml-xpath-perl libyaml-perl libyaml-syck-perl libsqlite3-dev sqlite3 libnet-ssleay-perl
% cd /var/www
% git clone git://github.com/miyagawa/remedie.git
% cd remedie
% sudo chown -R komagata:komagata blib pm_to_blib
% perl -MCPAN -e shell
cpan> install Bundle::CPAN
cpan> install Http::Engine
cpan> install MooseX::ConfigFromFile
cpan> install MooseX::Getopt
% env PERL_MM_USE_DEFAULT=1 cpan -i .

こちらを参考にinitファイルを前より少しだけちゃんと書く。

% sudo vi /etc/init.d/remedie
#!/bin/sh
### BEGIN INIT INFO
# Provides: remedie
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start remedie at boot time
# Description: Enable service provided by remedie.
### END INIT INFO

case $1 in
start)
cd /var/www/remedie/bin
sudo -u komagata env HOME=/home/komagata nohup perl ./remedie-server.pl > /dev/null 2>&1 &
;;
esac
% sudo chmod 755 /etc/init.d/remedie
% sudo update-rc.d remedie defaults 99 1

今回、リバースプロクシはnginxを使ってみました。

% sudo apt-get install nginx
% sudo vi /etc/nginx/sites-available/remedie
server {
listen 80;
server_name remedie;
location / { proxy_pass http://localhost:10010; }
}

% sudo ln -s /etc/nginx/sites-enable/remedie /etc/nginx/sites-available/remedie

Debian apacheの作法“a2ensite”のnginx版はあるんですかね?わからないので普通にシンボリックリンク張りました。(敗北)

Remedie Media Center

ヒャッハー!

動画もジャンルの細分化/深化が進んだのでこういうの必要ですよね。

関連:Remedie – Debian etch – p0t

闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達

闘うプログラマー新装版が出たそうです。一時絶版してたので図書館とかでしか手に入り辛かったんですがこれで解決。

新しいプログラミングパラダイムや方法論、学術論も好きですが、こういう泥臭い実録プロジェクト系も大好きです。

“プログラマーのスポーツはスカッシュ”という偏見を僕に植え付けてくれた本でもあります。

WindowsXPの安定性もこいつらのカーネルのおかげ。いや、スカッシュのおかげ。

Mac開発秘話系では同じく泥臭めのレボリューション・イン・ザ・バレーがおすすめ。

どっちも華やかなイノベーションとやらの陰では、

「おい、この腐った変数名を付けた馬鹿はどこだ!」

とか

「このバグを直すまで帰れない」

とかいったみみっちぃ出来事が満載なんですね。

参照:

会社のブログがCommon Lispで書かれたAllegroServeになったので更新するにはCommon Lispが書ける必要がある。

g000001さんに初心者におすすめの環境を教えてもらったので設定しました。

どうやらLispは起源が古いのでUNIX文化とはかなり違うらしい。そこがとても面白く感じました。

  • 時間の起点が1900年
  • 言語というより環境(イメージ的にはLispというOSをUNIX上で動かしてそれと通信する感じ?)

処理系のインストール

Lispの実装(処理系)はたくさんあるようですが、SBCLというのがネイティブバイナリを実行するので速く、オープンソースで人気があるそうです。(ポータブルなバイトコードを実行するCLISPというのも人気があるみたいです)

% port variants sbcl
sbcl has the variants:
        powerpc: Platform variant, do not select manually
        darwin_8_i386: Platform variant, do not select manually
        darwin_9_i386: Platform variant, do not select manually
        html: Builds the SBCL and ASDF documentation as HTML
        threads: enable threaded runtime
% sudo port install sbcl +threads +html

エディタのインストール

“郷に入っては郷に従え”ということでCarbon Emacsをインストールしました。zshやmacがemacs key bindなので移動とかは大丈夫なんですが、windowとか、bufferとか殆ど忘れてたので入門GNU Emacs 第2版をチラ見しながらやっていきます。(第3版が出てるみたいですが、僕が持ってるのは第2版・・・)

Lisp用のモードをインストール

SLIMEという単なるLispモード以上に処理系のプロセスに接続してやりとりしたり、デバッガついてたり、激甘スイーツ環境を提供してくれるものがあると教わったので入れました。

% port variants slime
slime has the variants:
        app: Build SLIME against editors/emacs-app
        sbcl: Require lang/sbcl for SLIME
        openmcl: Require lang/openmcl for SLIME
        clisp: Require lang/clisp for SLIME
% sudo port install slime +sbcl

処理系の選択は別としてappは何だろうなぁ。

“インストール後に.emacsにコレ貼付けろ”と表示されるのでそのまま張付け。

;; h key
(global-set-key [(control ?h)] 'delete-backward-char)

;; slime
(setq load-path (cons "/opt/local/share/emacs/site-lisp/slime" load-path))
(require 'slime-autoloads)
(setq slime-lisp-implementations
     `((sbcl ("/opt/local/bin/sbcl"))
       (clisp ("/opt/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)

(最初の行はC-hがヘルプで糞うざい対策、最後のは日本語用設定)

EmacsでM-x slimeで起動。あぁこれが噂の・・・というアニメーションでプロンプトが出現。

SLIME REPL

REPLが動いた。(上にSBCL:とあるのはSBCLとソケット通信してるみたいです。)

マニュアルのインストール

% sudo port install lisp-hyperspec

仕様書兼マニュアルはHyperSpecというそうです。 C-c C-d hでマニュアルが。

HyperSpec

しかし、これは俺の中でのLispじゃない!みんな何か適当なバッファに落書きみたいにコードを書いて適当に評価してたはず。

C-M-xでカーソルを含むトップレベルのフォームを評価してミニバッファに出してくれるらしい。

Eval

そうそう、こういう感じ。

疲れたのでAllegroServeまで行かなかった。

参照: