シングルクォートとダブルクォート

PerlRuby, JavaScriptなどでは文字列をシングルクォートで囲もうが, ダブルクォートで囲もうが, どちらも文字列リテラルには変わりないですよね. 当然変数展開などが行われる/行われない, などの差異はありますけども.

んで, Erlangでも差がないと思っていたんですよね. でも:

  • シングルクォート: アトム(大文字で始まったり, スペースを含めたりしたいときに)
  • ダブルクォート: 文字列(リスト)

らしいです. 今まで勘違いしていました. プログラミングErlangにも書いてあったー.

Mac OS XにErlyWebをインストール

ErlyWebはErlang用のWebフレームワーク. ちょいと使い心地を試してみたかったのでそのインストールメモ. Mac OS X Leopardにインストールしまうす.

参考はKLabさんところ.

Erlangのインストール

なにはなくともErlangをインストール. Macportsで楽ちんだぜ.

$ sudo port install erlang

Yawsのインストール

Erlangで書かれたWebサーバー. とある検証では同時接続数がApacheの限界値の20倍ぐらいでも平気だとか. ErlyWebはコイツの上で動作するのでインストール.

ちょっと前はファイルをダウンロードして, 適当な場所に配置していたような気がするけど, いつからかMacportsでインストールできるみたいだ(もしかして最初から?).

$ sudo port install yaws

ErlyWebのインストール

本命はErlyWebのサイトからダウンロード. erlyweb-0.7.1.tar.gz(現在)を落として伸張し, Erlangのlibディレクトリに突っ込んでおく. 下記のErlangのlibディレクトリまでのパスはボクの環境の場合なので, 適せん変更.

$ wget http://erlyweb.googlecode.com/files/erlyweb-0.7.1.tar.gz
$ tar zxf erlyweb-0.7.1.tar.gz
$ sudo mv erlyweb-0.7.1 /opt/local/lib/erlang/lib

ErlyWebでアプリケーションを作成

Erlangのシェルからerlywebモジュールの関数を呼んで作成する.

$ mkdir erlyweb_apps
$ erl
Eshell V5.6.4  (abort with ^G)
1> erlyweb:create_app("hoge", "/Users/takkkun/erlyweb_apps").
ディレクトリがどんどん作成されていく
2> q().

erlyweb_appsの下にhogeというディレクトリが作成され, その中に必要なファイルやらディレクトリができる. Yawsのためにログ吐き出し先も作っておこう. コレは手動.

$ mkdir erlyweb_apps/hoge/log

またErlyWebのアプリケーションはコンパイルが必要(つかErlangだからか)なので, コンパイルしておく. コレはファイルの内容が変更されるたびにやらなきゃいけない.

$ erl
Eshell V5.6.4  (abort with ^G)
1> erlyweb:compile("/Users/takkkun/erlyweb_apps/hoge", []).

Yawsの設定ファイルを書く

yaws.confという名前のファイルを作成し, 設定を記述する. とりあえず下記のように書いてみた. 他の設定はココらへんを参考にしてみたり.

どこに置いておけばいいのかはよくわからんのだけど, とりあえずerlyweb_apps/hogeの配下に作成. Railsっぽく1アプリケーションに1サーバーみたいにしておく(本当はよくないんだろうけど). 後でどこに置いておけばいいか調べておくか.

$ vi erlyweb_apps/hoge/yaws.conf
logdir = /Users/takkkun/erlyweb_apps/hoge/log
<server localhost>
    port = 8000
    listen = 0.0.0.0
    docroot = /Users/takkkun/erlyweb_apps/hoge/www
    appmods = <"/", erlyweb>
    <opaque>
        appname = hoge
    </opaque>
</server>

Yawsを起動する

yawsと打てば起動する. iオプションはインタラクティヴモードのコトらしいです.

yawsを実行したときに, カレントディレクトリにyaws.confがあれば読込んでくれるようだ. というコトでカレントディレクトリをerlyweb_apps/hogeにしておく.

$ cd erlyweb_apps/hoge
$ yaws -i
Eshell V5.6.4  (abort with ^G)
1> 
=INFO REPORT==== 9-Nov-2008::01:41:29 ===
Yaws: Using config file ./yaws.conf
yaws:Add path "/opt/local/lib/yaws/examples/ebin"
yaws:Running with id=default (localinstall=false) 
Running with debug checks turned on (slower server) 
Logging to directory "/Users/takkkun/erlyweb_apps/hoge/log"

=INFO REPORT==== 9-Nov-2008::01:41:29 ===
Ctlfile : /Users/takkkun/.yaws/yaws/default/CTL

=INFO REPORT==== 9-Nov-2008::01:41:29 ===
Yaws: Listening to 0.0.0.0:8000 for servers
 - http://localhost:8000 under /Users/takkkun/erlyweb_apps/hoge/www
1>

そしてWebブラウザhttp://localhost:8000/にアクセスすると, ErlyWebのルートらしきものが表示される, と. とりあえずこんなもんかー.

心と脳をはっくはく(に)してあげる

最近MIND HACKSを買ったんですよー.

Mind Hacks: Tips & Tricks for Using Your Brain

Mind Hacks: Tips & Tricks for Using Your Brain

こういう話けっこう好きで, 前々からおもしろそうだと思っていまして. んでさっき読み終えた.

計100個のHackが章立てて書かれているんだけど, 各Hackの実験(すべてにあるワケじゃない)がおもしろい! だいたいのページをDOUTORにいるときに読んでいたから, 読みながら実践はできなかったけど, 周りに誰もいない状況でやったらもう驚きだね! 感動を教えてあげたいお! 読んでいるだけじゃ"へー, 脳とか目ってそうなってんのー"ぐらいだけだから一度はやった方がいいかも.

そして読んだ後は誰かに協力してもらって, 試してみると良さそう. 何気に飲みの場で役立ちそうなネタもあるし……

あとWebデザイナーの方にもいいかも. 視覚と聴覚に関する章は表現を広げてくれそう. 実際UIに関する考察とかあったなぁ.

というコトでパフォーマンスHACKSも楽しみです.

Mind Performance Hacks: Tips & Tools for Overclocking Your Brain

Mind Performance Hacks: Tips & Tools for Overclocking Your Brain

Synergyってのがすごいらしい

以前飲んでいたら, id:golden-eggsさんが"Synergyがすごいいい!"なんて言っていました(飲む前だったかなぁ?).

google:synergy

話を聞く限りでは複数のディスプレイでひとつの仮想ディスプレイを構築してしまおう, というモノらしい.

んで今日読んだMacFanにちょろっと出てきた(白黒んところのマンガね)のによると, 別にOSは統一されている必要はないっぽい. そのマンガの中ではWindowsのデスクトップ3台とWindowsのノート1台とMacBook1台で1つの仮想ディスプレイを構築していた……!

ディスプレイが複数ある環境になったら使ってみよー.

rascutでswfobject.jsが404になる

rascutActionScript絡みのファイルの変更を検出して, 自動コンパイルをしちゃうもの. さらにCometでコンパイル完了をWebブラウザに通知して, 自動ロードまでしちゃうにくいやつです. id:secondlifeさん++

だけどなんか画面が真っ白になるんですよね. Firebugを見るとswfobject.jsがない模様. 同じ症状が出ている人いっぱいみたいだね.

d:id:lifegood:20080928
g:actionscript:id:kusigahama:20080922:1222105950

ちなみにボクの環境は下記のとおり.

うーん, rascutによって起動されるHTTPサーバーがくさい. というコトでhttpd.rbを追ってみると, 31行目の:

if F.file?(@path) && F.readable?(@path)

で真にならない(真のときにステータスコード200となる). 詳しく見るとF.file?(@path)の時点でfalseとなる. てかファイルですらないって!

んで原因はその前の27行目:

@path = env["PATH_INFO"] == '/' ? @root : F.join(@root, env['PATH_INFO'])

もっと言うと:

F.join(@root, env['PATH_INFO'])

によって, ~js/swfobject.js/と最後にスラッシュが付く. んー, PathInfoが空であろうとjoinしているのが問題なのかなぁ?

というコトで:

@path = env["PATH_INFO"].empty? || env["PATH_INFO"] == '/' ? @root : F.join(@root, env['PATH_INFO'])

とか適当にF.joinを回避してやれば404とはならなくなりました. めでたしめでたし.

ブロック

Perlのブロックってすごいよね. パッと見, 構造っぽいもん. でもevalとかdoとかってブロックが後に続いているだけなんだよね(微妙な認識かも)?

@odd_numbers = grep { $_ % 2 } 1..100

となると, 言語自身にtry~catchのような例外の機構を備えていないPerlでも:

try {
  print 1 / 0;
}
catch {
  print "Divided by zero\n";
};

こんなコトができちゃうワケか! すげぇ!

まぁError.pm使えばいいんだけどね! 自分で書く必要もないんだけどね! プログラミングPerlに載っているけどね!

でも面白いね!

タブキーを押したときにソフトタブに置き換える

.emacsファイルに以下のように書けばいいみたい. tab-width nのnにはお好みのタブ幅を.

(setq-default tab-width 4 indent-tabs-mode nil)

ただしコレだとタブ(\t)を入力するコトができなくなっちゃう. まぁどうしてもタブを入力したい! っていうケースもそうそうないからいいかなぁ.

リストと配列

いまいちリストと配列を分ける意味がわからなかったんだけど, スカラーコンテキストが提供されたときに以下のような違いがあるんだね.

$last_value = qw/a b c/; # "c"
@values = qw/a b c/;
$length = @values; # 3

なんかの役に立つのかなぁ, と思っていたけど, たしかに配列をスライスしたときに違いがある. スライスで取得できるのは配列ではなく(もちろんスカラーでもない)リストだから, スカラーコンテキストを提供すると最後の要素が得られるもんな.

@values = qw/a b c/;
$value = @values[1]; # "b"

コレ以外になんか違いってあるのかな?

自然言語としてのPerl

昨日からプログラミングPerlを読んでいるんだけど, いろいろと味わった気分. まだ1章の中盤だけど.

まずコンテキストという概念に感動した. この場合はスカラーを求める(スカラーコンテキスト). またこの場合はリストを求める(リストコンテキスト). たとえ求めたモノと違うモノが与えられても, できる限り解釈しようとする. またどっちにでも対応するコトもできる(だからwantarrayとかあるんだろうな). 自然言語もそうなんじゃないかなぁ?

@weeks = ('Sunday', 'Monday', ..., 'Friday', 'Saturday'); // リストコンテキスト

# ifのカッコ中はブール値を求める. すなわちスカラーコンテキスト.
# 配列はスカラーコンテキスト中で要素数を返す. 数値の0は偽, それ以外は真.
if (@weeks) {
    print "よって真";
}

# だからシンプルにこう書ける(普通ならforeach使うけどね).
while (@weeks) {
    print shift @weeks, "\n";
}

あとpackageの説明がうまかった. たしかに会話や文章では何について話すかをまず決め(主題化), そのあとは決めた対象を会話中から省略してしまう. packageも一緒.

package Rabbit;
use Cat;

sub bark {
    print "ぶぅぶぅ, きーきー\n";
}

bark(); # このbarkはRabbitのbark(主語が省略 -> packageに指定されたモノ)
Cat::bark(); # これはCatのbark(主語が指定されている)

ただ"名前空間を確立する"という説明だけでは自然言語としてのPerlという視点を得られなかったと思う.

また"物事をアナロジーで解決するな"と言うけれどホントそうだな, って思う. 自分の中にある知識前提で読んでいたら"はいはい, 名前空間, わろすわろす"でこの主題化の話をスルーしていたな, きっと. まぁ結果に違いはないんだろうけど, こういう側面を見られてうれしい.

このあたりにソッコー感動してしまった. 他にコンテキストなどの概念を備えた言語ってあるのかな? そういう面でも興味が湧く時間を味わえた. まだまだ片鱗だと思うけど先が楽しみ!

childNodesを使わずに子要素を取得する方法

私的メモ.

var options = document.getElementsByTagName('select')[0].options;
var rows = document.getElementsByTagName('tbody')[0].rows;
var cells = rows[0].cells;

childNodesとかとあまり変わらないんだけど, 以下のようなケースでは違う.

<select>
  <option value="hoge">fuga</option>
</select>

childNodesだとoption要素の直前, 直後のスペースがテキストノードとして取得されるけど, optionsならその心配はない. rowsやcellsも一緒.