2006-03-02 [長年日記]
_ 自分の行為の正当性はどこからくるのか
別に今さら大上段から NHK やマスコミ批判をしたいなんてことはこれっぽっちも思っちゃいないんだけど、自分の正しさを信じて疑わない人は案外いるよなぁって思った。
もちろん、常に自分の正しさを疑うことでそれが自信のなさに繋がり、臆病でビクビクした挙動不審な人間になる*1とか、何かの宗教などにすがって思考停止してしまうという状態になるのも困るんだけども、まるっきり疑いがないというのもやっぱり困るんだな。
例えばそれが好意の押し売りレベルの日常的な程度なら愛想笑いしてりゃいいんだけど、マスコミや免許稼業*2の中には何らかの特権が世間やお上によって与えられていると勘違いする人も出てくる。まぁ個人的には出てきて当然かなとも思う。
自分の場合を振り返ってみると、なんていうか、振り子のように自信満々モードとマジヘコミモードの間を行ったりきたりしてるような、そんな感覚だ。単振動っていうほど単純ではなく、その周期も振れ幅も不定。振り子運動へ加わるエネルギーは外からのものもあれば中からのものもある。*3
例え話のままいくと、上に出てくる「困った人」っていうのは、外からのエネルギーだけでどっちかにばーんと行ったまま帰ってこない人のことなのかなと思う。たまにいる電波くんは中からのエネルギーだけでどっちかに行って帰ってこない人かな。
何が言いたいかっていうと、振り子でどっちかに寄ったままっちゅーのは重力に逆らった不自然な状態なので注意しましょうってことですよ。特にどっちかに振れやすい環境にいる人はね。まぁ、自然な状態を維持するのもそれはそれで大変なんだけどさ。
2006-03-03 [長年日記]
_ なぜ Firefox がって
なぜFirefoxは日本では普及しないのか (/.-j)
- ソフトのインストールなんか自分でしない人が多い
- メーカー製のプレインストールマシンでデフォルトブラウザになってない
のが大きいと思いますが。つーか「ブラウザ」という単語だって理解されているかどうか疑問ですよ。「パソコンに最初から入ってるインターネットするやつ」です。Mac ユーザーの方がブラウザを理解してるでしょうね。デフォルトブラウザの変更を1回や2回経験してるわけですから。
うちの実家は1年くらい前から Firefox です。黙って Firefox をデフォルトブラウザにしてわざわざ IE のアイコンでショートカットをデスクトップに置く意地悪をしたので。最初アイコンを Firefox のままにしたので戸惑いましたが、アイコンを変えてしまってからは別に文句も言わずに使ってます。IE でなきゃ見れないサイトにはどうも当たったことがないようです。
※ 帰省したときに黙ってアップデートしてます。
そんなもんです。
他人に乗り換えを薦めたのは Web 絡みの仕事をしている人*1ともともと Netscape を使っていた人だけなので、普通の人に薦めて成功するかどうかは分かりません。起動のとろさがいやがられることは多そうな気がします。あと国産タブブラウザが好きな人にはデフォルトの Firefox はシンプルすぎて面白くないだろうし、Windows べったりな人にはマルチプラットフォームのメリットはない。もともと付け入るスキがほとんどないような気がします。
*1 Web Developer が便利だよという薦め方で成功。最初は IE だけでなく他のブラウザでもデザインや動作のチェックをしろという意味で薦めたらいやがられました。SEO という概念が理解されるようになってからはページのリニアライズなどをさっとできる Web Developer が便利、ということが理解されました。
2006-03-05 [長年日記]
_ コーヒーミルを買ってみた
ドリップコーヒーが好きなんだけど、時間が掛かるのでそんなにしょっちゅうドリップしてるわけじゃない。そうすると引いた状態で買ってきた豆が悪くなっちゃう。そんなに大量に買ってるわけじゃないし、これ以上減らすのは難しい。
ということで豆を自分で引くことにしてみた。ますます時間が掛かってドリップしなくなるような気もするけど、そこはそれ。
_ pukiwiki の parser いじり
なんか今のところ & を2回エスケープしちゃってるみたい。それ以外はとりあえず思ったような感じで出力できてる感じなんだけど、なんでこんなことんなってんだ?
ヘルプのページに書式がことこまかに書かれてるんで確認にはちょうどいいんだけど、同じ記法がプラグインだったりユーザー定義ルールだったり組み込みだったり、面倒くさいなぁこれ。ほんとに。
今のところ convert_html.php, default.ini.php, file.php, func.php, html.php, make_link.php, plugin.php, pukiwiki.ini.php を使って、init.php の代わりに pseudo-init.php を用意。init.php をそのまま使うとデータディレクトリの permission チェックとかしちゃうんで動かない。
2006-03-06 [長年日記]
_ そうか結城さんが Ruby 本書く、のか?
いや知らないけどね。もしそうならかなり喜ばしい話だ。
この日記がスタートして3週間ほどで Ruby 版 Tropy が公開されている。その後、Rails のネタが本家の日記に載る。着実に進んでいる雰囲気。
というか、自分が興味を持つ順番と丸っきり違うな、この日記。面白い。
2006-03-08 [長年日記]
_ Inspiration 8 IE Trial やっぱだめ。
inspiration.com に登録してるのでアップデート案内のメールがきた。IE ってなんだ? International Edition か?とか思いながら試したが、やはり日本語の編集はまともに行えない。(キャレットが1バイトずつ移動する。)
やっぱ OS X じゃ Omni 使うのがいちばんか? OmniGraffle は通常のドローとしてはともかく、アイディアを練る段階では使いにくいし、Outliner は最初から階層的な構造になっている構想しか練ることができない。「カードをばらまいてあとで図にまとめあげる」という使い方にはインスピレーションがいちばんなんだがなぁ。
2006-03-10 [長年日記]
_ フォントは断然Osaka-等幅アンチエイリアスなし
※ 2006年9月末現在で Monaco + アンチエイリアスに移行しました。それまでの経験に反してある程度肉厚の方が見やすかった。要は見やすいレンダリングが実現できればアンチエイリアスの有無は関係ないっぽい。
Osaka-等幅の正規ライセンスは自分が Mac を使う理由のうちの結構な割合を占めている。コードを書かないときは何とも思わないフォントだけど*1。書いているときは半分近いかもしれない。それくらいこのフォントは重宝している。難点は小文字の g と q、i と j の判別がかなり難しいところ。これさえなけりゃなぁとは思うが、致命的な問題になることはまずない。たいしたもん書いてないからか?
*1 コーディングを除いた場合の Mac を使う理由は、Aqua とヒラギノや平成などのフォントライセンス、および Windows よりは分かりやすい UI と コマンドラインツール
2006-03-12 [長年日記]
_ コーヒーを挽くのは要素が増えて面白いぞ
先日購入したミルで初挽き。店の人に言われるがままいちばん絞ってから2回転半くらい緩めて挽いてみたら確かにサンプルの荒さにはなったんだけど、ちょっと自分の好みより細かい感じ。
ということで次回は3回転と1/4の荒さで引いてみよう。
豆は挽いたらちょっと増えた。*1
こうして記録しながら手探りで当たりを探していく過程は、モノクロを焼いていた頃を思い出す。撮影からプリントの最終段階までに入る要素は数多い。レンズ選び、乳剤(フィルムと印画紙)選び、乳剤への露光料、現像の押し具合、それぞれの要素を加減しながら最終的に好みの仕上がりを目指す。
あー。こりゃそのうち焙煎しちゃうかもな、おれ。いかんいかん。複数の要素を一気に変更したらいかん。地道にいかないと。
※ ドリップそのものはもうマイレシピはできあがってるので割愛。これをいじる気はない。
*1 豆の状態でカップに入れてはかり、それを挽いたら元のカップに収まらなくなった。
2006-03-13 [長年日記]
_ 携帯電話のサブスクライバIDの送出は off れる。はず。
トラッキングcookieがスパイウェアなら、EZwebの携帯電話は100%がスパイウェア入り
100% じゃないよ、という重箱の隅つつきなので Trackback せずにひっそりと。
2005年4月14日以降、サブスクライバID は EZ番号という呼び名に変わり、ユーザーの端末操作にて送出の可否を設定できます。らしいです。
EZ番号 (サブスクライバ ID) の通知設定機能追加について (auからのお知らせ 2005年4月4日版) を参照されたし。
ちなみになぜ au だけ取り上げられているのか分からない人のために補足。携帯電話にはユーザーエージェントとは別に本当に個体を識別するための ID があります。docomo はユーザーに本物の個体識別番号を要求する際は警告メッセージが出るはず。vodafone は知らない。au のこれがセキュリティーの文脈で取り上げられるのは、上の機能追加以前は公式サイトでも何でもないどんなサイトでも、ユーザーに何の断りもなしにこの情報が取れるようになっていたから。
と言っても、個人情報を収集していない限り同じサブスクライバ ID の「端末」がアクセスしてきているということしか分からないので、どこの誰がどんなことしてるということは分からない。
ただまぁ、普通に考えて、普段 off にしといて必要なサイトに当たった場合だけこんな面倒くさい操作を経て on に切り替える、なんてことはやらないわなぁ。それこそキーロック並みにワンアクションで切り替えられるとか、docomo みたいにその都度ダイアログで選択するとかでない限り。
_ なるほど prototype.js って便利かも
実際の活用についてはよく分かっていないんだけど、javascript のオブジェクトの定義はどうにか書きやすくなんねーのか、と思ってあれこれ調べて試行錯誤したのちに prototype.js の中身と、サンプルとして Validator を覗いてみたら、結構感動した。なるほどねー、確かにこれは書きやすい。
- 初期化子っていうやつを使うのがクールらしい
- JSON もおんなじだ
何をしていたのかって言うと、JsUnit でテストが書きたかっただけなんだけど、なかなか勉強になりましたマル
いやね、javascript って慣れてくると書きやすくて面白いんだけど、オブジェクトの定義と動かして確認するのがだりーなと前々から思っていたのね。その辺の鬱陶しさが昨日、今日とあちこち調べてだいぶスッキリしましたよ、ということです。今までは一発勝負の関数くらいしか書いてなかったけど、もうちょっと複雑なものも今後は書けるように…なったらいいな。なれるかな…。
2006-03-15 [長年日記]
2006-03-18 [長年日記]
_ Apache2 + fastcgi + trac.fcgi してみる
はえー。
普通に CGI で動かしたときはなんじゃこれ使えっかボケと思ったもんだけど、fastcgi だと普通に使えるレベルになる。(まぁ、うちのサーバは遅いんですが。)
さーて複数のプロジェクトを扱うにはどうしたらいいのかな。
※ とりあえず面倒なのでリポジトリを分けずに、モジュールに突っ込むことにした。trac でも何もしなくて済むし、こんでいいや。
2006-03-21 [長年日記]
_ PukiWiki の記法を PukiWiki 以外でも使う
にあるように必要なファイルを抜き出してみました。やったことは
- html.php の catbody() のうち HTML の出力に必要な処理だけを抜き出す
- init.php のうち HTML の出力に必要な処理だけを抜き出す
あとはエラーが出ないように必要なファイルを require しただけです。結局認証やプラグイン周りを除いて PukiWiki 本体のほとんど全部要るんですが…。
2006-03-23 [長年日記]
_ あなたの ssh は目的の host に直接繋がってますか?
実は今までずっとセッションが切れておらず、新規に繋いだと思っていた ssh はすべて繋がり続けていた ssh のトンネルをくぐっていた。
という説はどうだろう。.ssh/config を書けばトンネルを経由してるかどうかは分からなくなるが、接続を切ったときに
Connection to localhost closed.
って言われるかな? ssh -q してれば分からなくなるんだけど。
2006-03-25 [長年日記]
_ 字幕…
ぎゃーす。せっかく保存しておこうと思っていた世界遺産の番組中に県議会の補欠選挙の結果が入ったよー。
こういうのもデジタル放送になったら外せるようにならないのかな。単に電波がデジタルなだけじゃダメだけど。その辺全然調べてないから分からないな。データ放送でインタラクティブなんつーのもいいんだけど、放送の繰り上げ繰り下げ情報の伝送方法の標準化とか、余計な字幕を別レイヤーにするとか、そういうのも頑張ってほしいな。音も入ってるな。音のチャンネルも増やさないと。
と、たまに保存目的の録画をすると思うのであった。
2006-03-26 [長年日記]
_ なるほどテンプレートっていろいろ考えなきゃいけないんだな
最近 ecmascript を(Web 以外の目的で)利用している。で、簡単なテンプレートみたいなのがほしいなと思ったんだけど、当然のように JavaScript で探すと HTML ベースで DOM をいじるテンプレートばっかりで目的に合わない。
じゃー作ったらいいかーと思って別なテンプレートを参考にしようと眺め始めたら、あぁこりゃ面倒くせえと思って早々に挫折。ただ考えたら目的はキーワードを置換できりゃいい程度なので、全然再発明する必要ないじゃんということで一安心。
安心したついでにのんびりテンプレートについて考えてたら、とりあえず今自分が知っている範囲ではテンプレートってのは3パターンくらいあるのかなと思った。
- ERB や 素の PHP のように言語とデータの関係を逆にしたもの
- amrita のようにテンプレートが対象とするデータの構造、言語の構造の両方に依存するもの
- Perl の HTML::Template, PHP の Smarty のように新たな文法を作るもの
順につらつらと書いてみよう。
1. 言語とデータの関係を逆にしたもの
JSP なんかもこういうものっぽい。(よく知らない。)このパターンでは print 文でデータを出力するという従来のプログラミングとは異なり、地の文がそのままデータとして出力され、特殊な記号で挟んだ範囲が言語の文と解釈される。ことが多い。
例えば PHP では
<p>ここは普通に HTML として出力される。</p>
<?php
if ( $cond ) {
?>
<p>ここは $cond が成り立ったら出力される</p>
<?php
}
?>
てな感じに書く。
ちなみに PHP 界隈ではこれはメンテしにくくなるのであえて封じて 3 のようなテンプレートシステムを利用する派と、テンプレートなんて邪魔くせえ派に二分しているような印象を受ける。Ruby では ERB の受けは悪くはないが、これは binding という考え方と、「その場で即出力されるとは限らない」ことの二つの要因が大きいように思う。PHP の場合は <?php ?> で囲んでいない部分は HTML としてそのまま出力されるという問答無用さが初期の学習コストを大きく下げる役割を果たす一方、凝った処理の抽象化などに利用しにくいという問題も持つので、敬遠されることもあるのだ。
2. 出力に用いる言語、ロジックを書く言語の特性を利用したもの
amrita が分かりやすい例だと思うというか、amrita のことしか考えてないんだけど、
amrita のテンプレートサンプル
<ul> <li id=boyaki> </ul>
amrita のコードサンプル
data = {
:boyaki => [ '時間がない', '金がない', 'やる気がない' ]
}
tmpl = TemplateFile.new( templatefile )
tmpl.expand( STDOUT, data )
なんて具合。1 のパターンだと、このように同じ構造でいくつもデータを出力する場合に言語が持ってるループの機能を使わなくてはいけない。当然、記述量は多くなる。
しかし amrita の場合は言語の構造と HTML の構造を活かして配列はくり返し処理すればいいじゃん、と解釈して出力してくれる。楽。嬉しい。
ただし amirita は HTML にべったりなのでプレーンテキストには利用できない。(と思う。)例えば自動送信するメールのテンプレートとしては向いていない。(HTML メールにするのも手かな?)
3.新たな文法を作るもの
Web 向きのテンプレートシステムにはこのパターンが多いような気がする。基本的には
- テンプレートデータの中の特定のパターンの部分に
- 出力したいデータを展開する
という処理をくり返して最終的な出力データを生成するものである。例えば Perl の HTML::Template では
HTML::Template のテンプレートサンプル1
<TMPL_VAR NAME=dataname>
HTML::Template のコードサンプル1
$tmpl = HTML::Template->new(filename => 'template'); $tmpl->param( 'dataname' => 'REALDATA' ); print $tmpl->output;
という形で、dataname を囲んだタグの部分に REALDATA を出力できる。amirita みたいなもんじゃんと思うかもしれないけど、ループや条件分岐をさせようと思ったらテンプレートにもコードにも手を加えないといけない点が大きく違う。
HTML::Template のテンプレートサンプル2
<ul> <TMPL_LOOP NAME=loopname> <li><TMPL_VAR NAME=dataname></li> </TMPL_LOOP> </ul>
HTML::Template のコードサンプル2
$tmpl = HTML::Template->new(filename => 'template' );
foreach ( @REALDATA ) {
$item{'dataname'} = $_;
push( @loopdata, \%item );
}
$tmpl->param( 'loopname' => \$loopdata );
print $tmpl->output();
PHP の Template_Sigma だと以下のようになる。
HTML_Template_Sigma テンプレートサンプル
<ul>
<!-- BEGIN loopname -->
<li>{dataname}</li>
<!-- END loopname -->
</ul>
HTML_Template_Sigma コードサンプル
$tmpl = new HTML_Template_Sigma( $tmpldir );
$tmpl->loadTemplateFile( 'template' );
foreach ( $arr as $data ) {
$tmpl->setVariable( array( 'dataname' => $data ) );
$tmpl->parse( 'loopname' );
}
ただし、HTML::Template の場合は
HTML::Template のコードサンプル3
$this->param( 'loopname' => [ {'dataname' => REALDATA},
{'dataname' => REALDATA} ]
);
のようにも書けるので、テンプレート前提にデータの形式を整えておけば amrita 的な使い方もできなくはない。
また Template_Sigma の場合でも wrapper を書いて amrita みたいにデータを放り投げるだけで済むようにできるので、そういうものを用意して使った方がいいかもしんない。
どれも一長一短だなぁ
で、いまのところこういう感想を抱いている。
1 は PHP のぐちゃぐちゃなものをいくつも見ていると絶対に採用したくない仕組みで、自分の場合はこの経験が ERB の印象も悪くしている。さらに変数に値がセットされてないとエラーになる(インスタンスの変数かメソッドがねーよと怒られる)など、テンプレートシステムだと思ってしまうと不親切でとっつきにくい。(上の Sigma の話と同じで wrapper 書けばいいんだけど。)しかしごく簡単な定形文への語句の埋め込みしか行わない場合は素早く十分に機能する。
逆に例えば HTML とコードを分離したいという要求には、(当然のことながら生 PHP や)ERB のようなアプローチは合致しない。ただこの「分離」にも何段階かあって、HTML もコードも両方自分で書くけど分かれていた方がメンテが楽ってレベルから、HTML をいじる人は HTML しか知らないしその人の環境では HTML をそのままブラウザで表示するしか確認の方法がない、というレベルまである。中間の段階に入る人は割と自由にテンプレートのような仕組みを選択できるけど、最後のレベルの場合はファイルが HTML として絶対に破綻しないという条件を満たす必要がある。いわゆるきちっとしたテンプレートシステムを使わずに(例えば自作の小さなツールなどで)これを実現するのは意外と難しい。(運用で回避という合わせ技もあるけど。)しかしこれを採用すると逆にコードが膨らんだり実行速度が落ちたりする。*1
さて。
結論が何もない。なんか長文書くとこのパターンが多くねえか?
*1 まぁ言語のコードにコンパイルするとかキャッシュするとか工夫されていることが多いので、うまく使えば結構速度低下を抑えられそうな気がするんだけど。
2006-03-27 [長年日記]
_ ecmascript の Array で each するときの制限?ではありません
※ 詳しくは後半の追記を読んでください。
すでに最速の人のページをはじめあちこちで普通に紹介されているのですが、
Array.prototype.each = function( callback ) {
var len = this.length;
for ( var i = 0; i < len; i++ ) {
callback( this[i] );
}
}
で Array に Ruby の each みたいなメソッドを足すことができます。しかしこれ、自分で定義しているオブジェクトの中で利用してプロパティを参照しようとしてもできません。するとエラーで止まります。具体的には
MyObj.prototype = {
prop: 'hoge',
method: function() {
var arr = [ 9, 8, 7, 6 ];
var str;
arr.each( function( num ) {
str += this.prop + "\t" + num + "\n";
});
}
}
みたいなことができません。これはあれですか、each の中で this を解釈したときに MyObj にならずに Array になっちゃうからでしょうか。MyObj.prop を参照するつもりなのに本当は Array.prop を見に行っちゃってるのかなと思うんですが。違うかな。あと、回避策はないのでしょうか。
いやまぁ、手元では Array#first(), Array#next(), Array#item(), Array#at_end() なんつーのを用意して for で回す方法で回避できてるんですけどね。なんか面白くないなぁ、と。
すでに Array を拡張しちゃうのは確定なので素直に for ( i in array ) で回せば?っつーのはナシの方向で。
※ このネタ、カテゴリ何にしてようかなぁ…。JavaScript にしちゃうと他の ecma 系のものが該当しないし、Ecma262 か? スクリプト言語の名前に見えないなぁ。あ、ここに挙げたコードは動かしてみてません。
[2006-10-28 追記]
上を書いたときには根本的に分かっていなかったのだが、一応残しておいてとりあえず正解のコードを追記しておく。オブジェクトをまたいで使える Array#each は以下のようになる。
/**
* Array の要素一つずつに function を適用する
*
* @param function callback
* @param Object obj(あってもなくてもよい)
*/
Array.prototype.each = function( callback, obj ) {
var len = this.length;
for ( var i = 0; i < len; i++ ) {
callback.call( obj, this[i] );
}
}
これを利用する場合、上のようにあるオブジェクトから利用したいという際は
arr.each( function( e ) {
..
}, this );
と第2引数にオブジェクトを投げてやる。特別オブジェクトなど作成していない場合はそのまま
arr.each( function( e ) {
..
} );
でよい。このコードを理解する際に必要な知識は
- JavaScript の変数スコープ
- function の引数は多すぎても足りなくてもエラーは起きないこと
- Function#call の第1引数が null か undefined になった場合は Global オブジェクトになること
の3つである。下の2つは
Under Translation of ECMA-262 3rd Edition の
15.3 Function オブジェクトの call メソッド を、
最初のスコープの話は
Hawk's W3 Laboratory : JavaScript Notes : JavaScript 深層 : スコープチェーンと変数のスコープ(2)
をよく読むと分かるはず。
ま、分からなくても使うだけなら使えるけど。
2006-03-28 [長年日記]
_ サーチエンジン遍歴かぁ
かつての最強検索エンジン、AltaVistaの開発者が死去 (/.-j)
メインで使ってたのは
千里眼 → ODIN → 千里眼 → goo → Lycos → Google beta(jp) → Lycos → Google*1
かなぁ。goo はなぜかあまり使わなくて Lycos が好きだった。Google が日本語 beta を開始してからも、人には Google を薦めてたのになぜか自分は Lycos 使ってた。Fresheye も最初の頃は面白がって使ってたんだけど、Google のサブみたいな感じだったかな。
昔は複数の検索エンジンを使うのは割と当たり前だったのに、今は Google 一本で、Yahoo も確認に使うって感じかなぁ。infoseek とか AltaVista を好んで使ってた時期はなかった。
*1 ディレクトリは ntt.jp → Yahoo!
2006-03-30 [長年日記]
_ public の概念と Google 八分
サイバーエージェント運営のウェブサイトの一部がGoogleから削除される (/.-j)
タレコミ文にある「公共的」という言葉に過剰反応するスレと化している…。
日本では public の概念が希薄あるいはないという話をどこかで聞いたことがあるけど、そんな感じなのかな。
ところでこのストーリーの中でも書かれているけど、Google が不正と判断した場合の対処って、削除じゃなくて pagerank を強制的に最低にするっつー処理じゃダメなのかな? 内部的にも削除じゃなくて非表示扱いとかなんだろうし、存在そのものをなかったことにするかのような操作はちょっと行き過ぎてる気がする。
Google が意図的に検索結果から特定のサイトを除外する行為そのものを否定する気はないんだけど、SEO 絡みについては pagerank の範囲内での操作にとどめるべきじゃないかってこと。他の(大人の事情などの)要因のない SEO の場合は、pagerank に始まり pagerank に終わる方が一貫性があってすっきりすると思う。
2006-03-31 [長年日記]
_ 必要最低限 Rhino
いい加減 HTML を書いて <script> でスクリプトを読み込ませて Firefox の JavaScript コンソールでデバッグ、っていうのに疲れたのでコマンドラインで動くものはねーのかと以前から調べていた Rhino を動かしてみた。(これ、らいのぅって読むのね。知らんかった。)Java が必要だけど、最近のクライアントOS ではフツー入ってるので気にしない。逆に Java はないけど gcc はあるよってゆー BSD 使いとかの人は SpiderMonkey を使え。
で、困ったことに Rhino のページに書いてある通りにやっても動かない。CLASSPATH の設定というのが超基本的にすぎて端折ってあるので。やるのはこんな感じ。(例は .zshrc)
export CLASSPATH=/usr/local/bin/js.jar:$CLASSPATH alias jrunscript='java org.mozilla.javascript.tools.shell.Main'
Win の場合は適当にバッチファイルにする。名前は Java SE 6 Mustang じゃじゃ馬ならし Scripting から jrunscript にしておく。そうすっと最終的には
jrunscript -f scriptfile
だけでおけ。
…なんか使いにくいなぁ。readline とかその辺ですか? SpiderMonkey で JavaScript のインタラクティブシェル で読むのと違って編集とかできないし。んー。
※ その後、rlwrap をかましたら超絶便利になりました!
参考
_ puts for ecmascript
以下の3つの環境でだいたい期待通りに同じ動作をする puts() 関数です。
- ブラウザ
- Windows Scripting Host
- Rhino の shell(SpiderMonkey は未確認)
function puts( message ) {
try {
document.write( message + "<br>" );
} catch ( e ) {
try {
WScript.echo( message );
} catch ( e ) {
try {
print( message );
} catch ( e ) {
;
}
}
}
}
WSH スクリプトを書いていたんだけど、WSH 依存の部分と ecma 262 の部分を切り分けられないかなーとモゾモゾしていた。PHP で定数が定義済みかどうか調べる defined みたいなやつでオブジェクトが使えるかどうかチェックしたいと思ったのだが、そんなものはないみたい。どうしようと思っていてハタと気がついたのが「例外を catch すりゃいいんじゃねーの?」ってことだった。これに気がついたのが何日か前。
その後 prototype.js を読んで、Try.these() すごいっす!と思って、とりあえず書いたのが上のもの。何をしたいのかというとブラウザ上でも WSH でも Rhino の shell 上でもとにかく何かを出力して改行する。それだけのもの。これで何が嬉しいかっていうと、ロジックのチェックは情報が豊富に取れる Mozilla 系の環境で行い、最終動作を WSH で、という形で動かしやすくなるってこと。
たったこれだけなのに快適さがずいぶん違う。こういうものを(たわいのないものであっても)自分で作ったという喜びが ecmascript の場合は妙に大きい気がする。Ruby の場合は「こんなに便利なメソッドがあったのか!」という喜びが多いが、ecmascript の場合は「たったこれだけなのに(標準の状態に比べて)すげー便利になった!」の方が多い。そんな感じ。
上の書き方がオススメできるかどうかは知りません。例外処理は不慣れなもんで。使いたい人はご自由に。
本当はスクリプト起動時にどれが有効かチェックしてあとは適切なオブジェクトの適切なメソッド呼ぶようにした方がいいんですけど。いいんです、そんな細かいこと。
参考
_ ありがとう NIFTY-Serve、さようなら
まぁまだ使ってるんだけどね。@nifty は。
_ anonymous [if(typeof document != 'undefined')... みたいなのはどうでしょうか。]
_ wtnabe [あーなるほど。undefined でなければ存在はしているから使えると。なんて単純なことだったんだ…。]