Thursday, June 26, 2008

Sunday, June 22, 2008

[Euro2008] オランダの敗戦

オランダ対ロシアは、延長の末1対3でオランダが負けた。自分は録画したのを今朝観たのだが、延長分を予約していなかったので、前後半の45分が終了後にインターネットで結果を確認するハメに。後半の最後にファン・ニステルローイのヘディングで追いついた時は「イケイケ」ムードだったので期待したのだが。

結局はトーナメントになって「負けたら終わり」なので、本来の攻撃的ムードでなかったのが敗戦の原因だったような気がする。

選手交代でロッベンが出場しなかったなどの采配についても、恐らく攻められるだろうなあと予想するが、それ以前に攻撃的なムードでなかったのがファンとして残念だ。前回のEuro2004の時は、対チェコ戦で2対0から3点取られて逆転されるという壮絶な戦いを演じたが、仮に負けたとしてもファンはそういう試合を望んでいるのだ。

国を背負っている当人たちからすると今日のような試合をしてしまうのも理解できるが、しかしオランダ人サポーターの立場に立ったとしても、萎縮して覇気のない試合で負けるよりか、攻めて攻めて攻めまくって、その結果負ける方がスッキリすると思うのだが。

その中にあって、スナイデルの闘志というか気迫というか、ゴールへの固執には感動した。こういった選手がいてこそオランダだと思うし、今後もその伝統を守り続けてほしい。

あと、敗戦後に現役引退を表明したファン・デル・サールには、「ご苦労様、ありがとう」と言いたい。

[JavaScript] Closures

今John Resigの「Pro JavaScript Techniques」を読んでいるが、Closuresについてちょっとメモ。

Closuresとは、内部関数が外部関数の変数を参照するというもので、以下にサンプルを書いてみる。


window.onload = function () {
var obj = document.getElementById("main");
obj.style.border = "1px dashed red";
delayedHide(obj, 2000);
}

function delayedHide(obj, time) {
setTimeout(function() {
obj.style.display = "none";
}, time);
}


「idが"main"という要素を赤の点線で囲み、2秒後に消す」という簡単なサンプルだ。これをClosuresを使わないで書くと、window.onload内でsetTimeoutを書くことになり、以下のようなコードになる。


var obj;
window.onload = function() {
obj = document.getElementById("main");
obj.style.border = "1px, dashed red";
setTimeout("delayedHide()", 2000);
}

function delayedHide() {
obj.style.display = "none";
}


この場合は、objをグローバルに宣言する必要があるため、他のライブラリがobjというグローバル変数を使っていた場合にコードが破綻する。また、objを引数にしてもよいが、そうすると、


window.onload = function() {
obj = document.getElementById("main");
obj.style.border = "1px, dashed red";
setTimeout("delayedHide(obj)", 2000);
alert(window.obj == obj); // グローバルかを確認
}

function delayedHide(obj) {
obj.style.display = "none";
}


と書いてしまいがち。意図したとおりに動くので問題ないように見えるが、実はwindow.onloadで使用されているobjは、グローバル変数になってしまっているので、実際の引数としてobjはdelayedHideに渡っていない。
上の例に書いたように、alert(window.obj == obj);をwindow.onload内で書くか、delayedHideの引数名objから別の名前に変えることで確認することができる。

じゃあ、window.onload内でobjをvarを使って宣言し、この関数内のスコープにおさめようとすると、以下のようになる。


window.onload = function() {
var obj = document.getElementById("main"); // local scope
obj.style.border = "1px, dashed red";
setTimeout("delayedHide(obj)", 2000);
alert(window.obj == obj); // グローバルかを確認
}

function delayedHide(obj) {
obj.style.display = "none";
}


これだとobjが意図したとおりにdelayedHideに渡らないので、"main"要素が消えない。いろいろ悪あがきをして、以下のように書いたとしても、ブラウザによっては動作したりしなかったりで、もう蟻地獄だ。


setTimeout("delayedHide(" + obj + ")", 2000);
setTimeout("delayedHide('" + obj + "')", 2000);
setTimeout("delayedHide(" + this.obj + ")", 2000);


そもそも、関数を呼び出すのに関数名の文字列と変数を組み合わせて値を作るっていうのは、あり得ない。

ということで、function()がいろんな場所に入るので慣れるまでは少し違和感を感じるかもしれないが、Closuresを使ったコードの記述は、ポータビリティを保証するよい方法なのだ。

Saturday, June 21, 2008

iMacを買った

妻のパソコンの調子が悪くなり(5年間使い続けたWindows機)、今度はMacを使いたいと言い出した。これまで自分はMacBook(白)を使っていたが、それを妻に譲り自分用にiMacを買った。20インチの画面は大迫力で解像度も大きいので、複数のウインドウを使った開発がはかどりそうだ。

とりあえずEmacsは常に画面に表示されることになるだろう。

という訳で、この週末はセットアップに時間を取られそうだ。

Friday, June 20, 2008

[jQuery] $.getScript

jQueryの$.getScriptをはじめて使ってみた。これは、クリックなどのイベントにあわせて指定したURLのJavaScriptをダウンロードして実行するというもの。

ユーザからの入力後でないと実行できない処理にとても便利だ。しかし、AjaxやCSSをいろいろ駆使してリッチなブラウザアプリケーションを開発するのは本当に苦労するだろうなあ、と思った。

Wednesday, June 18, 2008

Firefox 3

ギネスへの挑戦に協力するためにダウンロードしました。全体的に使いやすいし、パフォーマンスも向上している。が、予想したとおりadd-on(plugin)の互換性がまだ不充分なので、結局2.0.0.14に戻した。

本格移行には、もう少し時間が掛かりそうだ。

Tuesday, June 17, 2008

[JavaScript] SoundManager2

SoundManager2を使って、MP3を再生する簡単なサンプルを作った(開始から30秒でフェードアウトする)。改善の余地ありだが、とりあえず動いたので備忘録のためにそのまま貼り付け。

<html>
<head>
<title>Sound Sample</title>
<script type="text/javascript" src="js/soundmanager2.js"></script>
<script type="text/javascript"><!--

var sound; // sound instance
var interval; // value for setInterval

soundManager.url = "js/soundmanager2.swf"; // different from default (swf location)
soundManager.debugMode = false; // debug mode: off

soundManager.onload = function () { // .onload ensures the library is loaded
sound = soundManager.createSound({
id: 'mySound',
url: 'URL of mp3 file' // comma is not necessary for the last option
});

sound.play();
interval = setInterval("checkElapsedTime()", 1000); // every 1 second
};

// volume range is from 0 to 100
function checkElapsedTime() {

pos = sound.position;
if (pos > 30000) { // Stop after 30 seconds
clearInterval(interval);
sound.stop();
sound.unload();
} else if (pos > 25000) { // Volume = 25 after 25 seconds
sound.setVolume(25);
} else if (pos > 20000) { // Volume = 50 after 20 seconds
sound.setVolume(50)
}
};
-->
</script>
</head>
<body>
</body>
</html>

[JavaScript] Firebugサイコー

最近JavaScriptのコードを書く機会が多くデバッガを探していたが、決定的なものを見つけられずにいた。という訳で、いちいちalertで値を出力するという前時代的な方法でしのいでいた...

しかし、「灯台下暗し」でFirefoxのpluginに「Firebug」というものが。これがサイコー。
生産性上がりまくりで、楽しいJavaScript生活がおくれそうだ。

Monday, June 16, 2008

[Euro 2008] オランダが好調な理由

前回のWorld Cup決勝進出国であるイタリアとフランスを撃破して早々に決勝トーナメント出場を決めたオランダ。本当に好調だ。その好調として以下のようなシステムの変更が挙げられている。
  • 伝統の4-3-3システムから4-2-3-1に変更して、ファン・ニステルローイの1トップの下に強力な中盤(スナイデル、カイト、ファン・デル・ファールト、ロッベン、ファン・ペルシの中から3人)というシステムになり、それが機能している
しかし、個人的には以下の理由が大きいような気がしている。
  • 主力が白人選手のみで、これまでの人種間の対立がなくなった
古くはフリット、ファンバステンやダービッツ、ついこの間まで代表だったセードルフなど、オランダの中心選手には黒人が必ずいた。移動のバスでも彼らが後ろのほうを常に陣取るなど、オランダ代表チーム内には人種間の対立があった、というのは結構有名な話だ。今回の場合は、起用法をめぐってファンバステンと対立していたセードルフが代表を辞退した結果、この対立が無くなったという精神的な部分での負担軽減が好調な理由だと考えるのはどうだろうか。

人種差別や人種間の対立ということを表に出すのはタブーだが、実際は
まだまだ存在しているというのは間違いないだろう。例えば、同じ代表チームで戦っていても、出身地による意識の違いがあるフットボールのスペイン代表は有名だし(代表選手の出身地の内訳とチーム状態の相関を見てみると興味深いことが多い)、いまだに黒人が代表入りしていない南アフリカのラグビー代表、ごく一部を除いて水泳選手に黒人がほとんどいない、などなど枚挙にいとまがない。

これは現実なので仕方が無いと悲しむのも結構だが、こういった差別や対立がなくなるよう、一歩一歩前進するしかないのも確かだ。

Sunday, June 15, 2008

Google Browser Syncがディスコン

この記事によると、Google Browser Syncがディスコンになるようだ。理由は、まもなくリリースされるFirefox3へ対応するための開発リソースが確保できないからとのこと。

自分は、自宅でPCとMacを複数台使用しているためこれを愛用していたのだが、これ以上サポートされないとなると残念だ。一方で、フリーで提供されているサービスが突然休止させられるというリスクを(以前からわかっていたものの)認識した。

まあ、Firefox3へ本格的に移行するのは少し先になるので、それまでfoxmarksとかの別のツールや、Operaの新バージョン(9.5)を試してみるか。

Thursday, June 12, 2008

[Euro 2008] Netherlands vs Italy

The game really impressed me. Although the final score was 3 vs 0 (Netherlands won), the game was so close (just Italy had no luck).

The first goal by Ruud van Nistelrooy was obviously off-side. But the shot by Wesley Sneijder was superb, and it would have been a goal, regardless Ruud van Nistelrooy touched.

I have not seen Italy attacked such aggressively (contrary, Italy is famous for their strong defense called "catenaccio"). I understand that the group is a really hard one (the other two countries are France and Romania) and this game was vital for both of them. But the Italians' attacks were different from usual and it was really nice to see they are attacking seriously because it is rare.

As I am living in Japan, I have to be a night owl to see Euro2008 live.
But this reminds me of my life in the UK (I was living in Cambridge while Euro2004) and I will keep on watching it anyway.

Wednesday, June 11, 2008

本多のオヤジさん逝く

「ぷらっとホーム」創業者である、本多のオヤジさんが亡くなった。
昔のPC-UNIX創世記には本当にお世話になった。

御冥福を祈ります。

Tuesday, June 10, 2008

Linux on Virtual PCで時計がずれる

近Virtual PC 2007でLinux(Debian)を入れて遊んでいるのだが、時計が尋常じゃないくらいずれる。というわけで、詳細はさておき以下の対策を。

(1) カーネルの起動オプションに”clock=pit”にしてタイマー割り込みを100Hzにする
(2) その他のオプション(
”nosmp noapic nolapic”)を(1)と同様に入れる
(3) ntpdateで定期的に時間を合わせるようにする

とりあえずこれで様子を見るか。

Sunday, June 08, 2008

秋葉原で通り魔殺人

秋葉原で通り魔殺人があったらしい。昨日の時点で今日の天気予報は雨だったので、今日は秋葉原へ行くのを止めたのだが、自分にとってはこれが幸いした格好だ。

いかなる事情があったか現時点ではわからないが、いずれにせよこんな犯罪を犯した人間に対しては憎悪を禁じえない。とにかく被害にあった方々の無事と秋葉原の発展を祈る。

Friday, June 06, 2008

MozRepl | hyperstruct

このPluginは、FirefoxなどのMozillaアプリケーションにTelnetをしてコントロールできるというもの。

早速Python経由で使ってみたが、こりゃあ便利だ。
やろうと思えば、Webアプリケーションのテストが全部自動化できてしまう。

いろいろ遊べそうなので、起動時に自動でONになるようにしておいた。

Wednesday, June 04, 2008

マニュアルを読め?

95 percent of all returned gadgets actually work, Americans don't read manuals」という記事を見つけた。タイトルだけを見ると笑えるのだが、本文中にあるように「マニュアルを読まないと使えない」という製品をユーザに強要するのは作り手としていかがなものか、というのもわかる。

ユーザとしての自分の経験としては、携帯電話のあの分厚いマニュアルは読む気も起こらない。

作り手側の経験として、ある製品のマニュアルを担当していた時代があったが、ユーザがまず読まないだろうなあ、という気持ちを持ちつつも、「製品検査部門からの強い指示」で詳細なマニュアルを作成していた。

まとめると、
作り手側のマニュアルの存在意義としては、「ユーザへ手順を示す」という目的以外に「何か事故が起きたときの責任逃れ」というのがあり、一方でユーザにとってマニュアルは「邪魔なもの」といった感じだろう。

ここまで虐げられているマニュアルがかわいそうに思えてきた。

Tuesday, June 03, 2008

ウェブを変える10の破壊的トレンド

筆者はJETROに所属していただけあり、下手なコンサルに頼むよりも充実した内容だった。
Webのトレンドを10のキーワードに分類して、その動向を解説している。

自分として興味のある画像・動画検索については、「まだまだ」ということらしいが、
将来はどうなるんだろう?

[JavaScript] setIntervalとclearInterval

何か最近ちょっとしたことでも忘れてしまうので、備忘録でこのBlogを使うか。
setInterval(関数名,ミリ秒)
指定した関数を指定した時間間隔で実行する

clearInterval(ID)
実行してsetIntervalを解除するが、IDとしてsetIntervalの戻り値を使う

もう年をとったなあ。

Sunday, June 01, 2008

WindowsでISOをマウント

突然LinuxのインストールISOイメージからファイルを抽出したくなったのだが、WindowsにはISOをマウントする方法が内蔵されていないことに気づいた。

かといって、自分が使っているThinkPad X40にはCD-ROMがついていないので、CD-RにISOイメージを焼いて外付けドライブをつけるのはとっても面倒だ。

そこでいろいろ調べたところ、以下のような便利なツールがあるのを見つけた。

Virtual CD-ROM Control Panel for Windows XP(Microsoft Download)

使い方は、ダウンロードしてドライバをコピーしてツールを起動するだけ。とっても簡単。
どうやらこのツールはMSDNを使いやすくするためのもので、保障は無いみたいだけど。


最近、LZHの解凍がOSビルトイン機能としてできたり、今回のISOのマウントができたりと、ようやく「ユーザの立ち位置」でいろいろなものを提供してきたMS。少し見直したかも。