Previous month:
April 2007
Next month:
June 2007

今日のパズル「バラの花びら(petals around the rose)」

 Google AnalyticsのUIが大幅に改良されたので、解析結果を見なおしていたのだが、そこで気が付いたのが、見覚えのない"petals around rose"というキーワードで来る人がたくさんいること。私にはなじみのない言葉だったので調べてみると、以前のエントリーのコメント欄にこのパズルのことが書かれており、それが検索エンジンに引っかかっているようである。

 実際のパズルも見つけて遊んでみたが、なかなか手ごわい。Total Roll=10あたりでやっと法則を発見し、Total Roll=14で"Correct again! We think you've got probably got it"と褒めてもらえた。パズルの場所は、

 Play Petals Around the Rose

だ。このサイトによると、ビル・ゲイツもかなり苦戦したらしい(参照)。

 ちなみに、説明が英語なので日本語訳を提示しておく。

 このゲームの名前は、「バラのまわりの花びら」。ゲームの名前が重要です。コンピューターがさいころを5個振り、あなたにその得点を当てるようにたずねます。得点はつねに、0もしくは偶数の数字です。あなたのミッションは、コンピューターがどうやって得点を計算しているかを見つけ出し、「バラの君主」になることです。

遊び方:
"Roll Dice"をクリックしてゲームを開始します。予想した得点を("Your Guess"のところに)入力し、"Accept Guess"をクリックして結果を知ります。そして再び"Roll Dice"をクリックして(法則を発見するまで)チャレンジするか、あきらめてこのページから立ち去ってください。がんばってね!


スーパー・エージェントScott Borasを目撃

 金曜日にマリナーズvs.ヤンキーズ戦に行ってきたのだが、そこで目撃したのが、松坂の代理人をつとめたことで日本でも有名な Scott Boras。試合前の練習中にバックネット越しにヤンキーズのAlex Rodriguesとなにやら真剣な顔で話している。Alexが10年で$252million(日本円で300億円弱)という破格の契約でマリナーズから引き抜かれた時の代理人もScott Borasだったし、「きっと金銭関係のもめごとに違いない」と思ってしまったのは私だけではないはず。ホームラン1本あたりのボーナス金額でヤンキーズとすれ違いでもあるのかと想像が膨らんでしまう。

Agent1 Agent2

 この手の代理人(エージェント)は、契約金額の5%程度をもらうことをインセンティブとして球団側から引き出せる限りの金を引き出すのが役目。松坂の契約交渉がなかなかまとまらなかったのは、そんな代理人の中でも、タフな交渉人として知られるスーパー・エージェントScott Borasを松坂が雇ったから。「松坂があれほどメジャーでプレーしたがっているのに」とScott Borasを悪者にする日本のマスコミがいたが、それは少し勘違いだ。Scottを雇った時点でああなることは松坂にも分かっていたはず。

 ちなみに、アメリカのスポーツ界の代理人の役割に関して知りたい人には、トム・クルーズ主演の「ザ・エージェント」がオススメ。松坂の契約交渉劇の記憶が新しいうちに見ると面白さも格別かも。


Photoshopで遊ぶ: iPodの広告風影絵を作ってみた

 写真から人物の切り抜きができるようになったので、前から作りたかった「iPodの広告風影絵」の作成。手順はいたって簡単だ。

1.Photoshop CS3 のクイック選択ツールを使って人物の輪郭を選択する
2.それを元にパスを作る
3.パスを元にベクターレイヤーを作り、黒く塗りつぶす
4.一つ下に新しいレイヤーを作り、iPodの広告のカラーの色のどれかで塗りつぶす

 以下が今日作った作品。誰の写真を元にしているかは言わなくとも分かるだろう。

Kage1_2 Kage2

Kage3_2 Kage4

Kage5


Photoshop CS3の「クイック選択ツール」が便利な件について

 少し前からPhotoshopを使っているのだが、どうしても上手にできなかったのが写真から人物や物を切り取ること。私の知る「Photoshop使い」たちは、皆口を揃えたように「パスを使いこなせ」というが、その方法はあまりにも手間がかかりすぎて私には向いていない。今日Photshop CS3がやっと届いたので、うわさの「クイック選択ツール」を試してみると、ものの5分ぐらいで以下の切り抜きに成功した。

Kame_0Kame_1

 やり方は以下の通り。

1.まずは「クイック選択ツール」で大まかな選択をする。微妙な部分は少しはみ出しても気にしない。
2.選択を反転させる
3.はみ出した部分とそうでない部分のコントラストの差が一番大きいものをRGBチャネルから選び、今度は外側から内側に向かって再び「クイック選択ツール」を使ってはみ出した部分だけを選択するようにクリックして行く
4.だいたいの修正が終わったら、選択を再び反転させる
5.「エッジの修正」を選び、エッジをスムージングする

 これだけで上の例ぐらいの切り抜きが簡単にできる。パスを使う方法と比べたらば桁違いに簡単だ。


本質的でないものを徹底的に排除すると美しくなる(「アップルのデザインの秘密」より)

 アップルの作る製品のデザインがなぜあれほどにすばらしいかを熱く語った文章を発見。一番気に入った部分を引用してみる。

"The businessman wants to create something for everyone, which leads to products that are middle of the road," says Brunner. "It becomes about consensus, and that's why you rarely see the spark of genius."

"Critical to Apple's success in design is the way Jobs brought focus and discipline to the product teams," ­Norman says. "[Jobs] had a single, cohesive image of the final product and would not allow any deviation, no matter how promising a new proposed feature appeared to be, no matter how much the team complained. Other companies are more democratic, listening to everyone's opinions, and the result is bloat and a lack of cohesion.

"The difference between BJ and AJ, Before and After Jobs, is not the process," he continues. "It is the person. Never before did Apple have such focus and dedication. Apple used to wobble, moving this way and that. No more."

One direct result of that sharpened focus is Apple's unique ability to create simple products. Though the idea of a simple high-tech device seems counterintuitive (why not offer more functionality if you can?), it's worked for Apple.

"The hardest part of design, especially consumer electronics," says Norman, "is keeping features out." Simplicity, he says, is in itself a product differentiator, and pursuing it can lead to innovation.

Rolston agrees. "The most fundamental thing about Apple that's interesting to me," he says, "is that they're just as smart about what they don't do. Great products can be made more beautiful by omitting things."

Technology Review: The Secret of Apple Designより引用】

 その中でも注目すべき点は、太字にした部分。ジョブズは「どんな製品を作りたいか」というビジョンをものすごくはっきりと持っており、そこから少しでも外れるような機能は、どんなにすばらしいアイデアであろうと、チームメンバーがどんなに文句を言おうと、絶対に追加させたりしないのだ。

 iPodのシンプルなデザイン。ボタンの数が極端に少ないアップルリモコン。この「本質的でないものを徹底的に排除する」というジョブズの姿勢が、アップル製品をあれほど美しく使いやすいものに仕上げているのだ。

【追記】デザインに関して私が最も影響を受けた書物二冊を参考のために紹介しておく。どちらもオススメである。


Microsoft oFone!?

 AppleがiPhoneなら、MicrosoftはoFoneだ。というわけで、マイクロソフトが先週のEmbedded Developer Conferenceで見せたビデオがこれ。 

 マイクロソフトがわざわざお金をかけて作った冗談ビデオだったのだが、YouTubeにアップロードされたビデオが一人歩きしまっている上に、勘違いをあおるような書き方をしているブロガーもおり(本当に勘違いしている可能性もある)、市場は少し混乱ぎみだ。


JavaFX Script 入門、とりあえず言語仕様に目を通してみた

 CNetでも報道された通り、Sunが独自のスクリプト言語JavaFX Scriptを発表した。テクノロジーの優劣だけで決まるものではないので、この試みがうまく行くかどうかは何とも予測しがたいが、とりあえず言語仕様が公開されたので目を通してみた。

 私なりに興味深いと思った点は以下の5つ(ただし、私なりの拡大解釈が多少入っている可能性もあるので要注意)。

1.宣言型のUIをサポートしていること

 宣言型大好き人間の私としては、この方向性は大賛成(ちなみに、UJMLも宣言型のUI言語^^)。"押してね!"というラベルがついたボタンを表示するには、こう書けば良い。

        Frame {
              content: Button {
                   text: "押してね!"
                   action: operation() {
                        System.out.println("押してくれて、ありがとう");
                   }
              }
              visible: true
         }

2.配列・文字列のオペレーション

 C++やJavaが進歩を止めている間に、スクリプト言語は大幅に進歩してきたが、やはり生産性の向上という意味では、配列と文字列のオペレーションがライブラリーではなくて言語レベルでキチンとサポートされている点がスクリプト言語の一番の強みと私は感じている。もちろんSunもそこははずさずに来た。下のサンプルは、配列に対するinsertやdeleteなどのオペレーション。

        var x = [1,2,3];
        insert 10 into x; // yields [1,2,3,10]
        insert 12 before x[1]; // yields [1,12,2,3,10]
        delete x[. == 12]; // yields [1,2,3,10]
        delete x[. >= 3]; // yields [1,2]
        insert 5 after x[. == 1]; // yields [1,5,2];
        insert 13 as first into x; // yields [13, 1, 5, 2];
        delete x; // yields []

 その中でも便利そうなのが、SQLのように配列に対してqueryをかけて別の配列を作るselect。下のサンプルは、各アルバムの曲の中から、アルバムのタイトルと一致するトラックのインデックスを新たな配列として作っている。

        var titleTracks =
            select indexof track + 1 from album in albums,
                      track in album.tracks
                          where track == album.title;

 このqueryはforeach文にも適用できて、その場合は、

            foreach (album in albums,
                      track in album.tracks
                          where track == album.title)

となる。

 そして文字列のオペレーション。スクリプトを使いこなしている人たちにはあたり前だが、文字列中の変数やステートメントを展開してくれるのはやはり便利だ。

        var name = 'Joe';
        var s = "Hello {name}"; // s = 'Hello Joe'

        var answer = true;
        var s = "The answer is {if answer then "Yes" else "No"}"; // s = 'The answer is Yes'

3.非同期な実行

 興味深いのが、do later ステートメントを使って、指定したブロックのコードを非同期で実行できること(ただし、新しいスレッドを作るわけではなく、単にキューに入れて後から実行する)。便利な機能ではあるが、サイド・エフェクトのことを考えずに間違った使い方をするプログラマーが続出しそうで、少し心配。

        import java.lang.System;
        var saying1 = "Hello World!";
        var saying2 = "Goodbye Cruel World!";
        do later {
             System.out.println(saying1);
        }
        System.out.println(saying2);

 逆に単なるdoステートメントの方が、別スレッドを作ってdo内部のコードを実行させるように出来ている点が興味深いが、スレッドのディスパッチに関しての記述にまだあいまいさがあり、このあたりの言語仕様はまだ十分に練られていないように感じた(今後変更する可能性あり?)。

4.Update Triggerという考え方

 これはなかなか面白い。「新しいオブジェクトが作られた」とか、「オブジェクトの変数が変更された」などのイベントをキャッチして、それに対応した処理を記述できるのだ。そのためコンストラクターは不要で、代わりにこんなプログラムを書くことになる。

         class X {
              attribute nums: Number*;
         }

         trigger on new X {
              insert [3,4] into this.nums;
         }

         var x = new X();
         System.out.println(x.nums == [3,4]); // prints true

5.Incremental and Lazy Evaluation

 Haskellを知っている人には珍しくもないコンセプトだが、C++/Javaプログラマーに一口で説明するには少し難しいのがこれ。ある変数に実際の値を代入するのではなく、計算式を代入しておく機能がIncremental Evaluationだ。そうしておくと、エクセルのスプレッドシートのフォーミュラのように、参照先の変数の値が変化すると自動的に新しい値を計算し直してくれるのだ。さらに、それをlazyと宣言しておくと、その計算を実際に計算結果を参照する時まで遅らせておいてくれるのが、Lazy Evaluationである。

 Sunが提供しているサンプルは少し分かりにくいので、先の宣言型のUIを例として、このIncremental Evaluationを説明するとこうなる(注意:ここが私なりに拡大解釈してしまっている可能性がある部分)。

        label = "押してね!";
        message = "押してくれて、ありがとう";
        Frame {
              content: Button {
                   text: bind label;
                   action: operation() {
                        System.out.println(message);
                   }
              }
              visible: true
         }

とすると、上の例と同じく"押してね!"というラベルのボタンが表示されるのだが、その後、

        label = "押さないで!";
        message = "押さないでって言ったのに!";

と変数labelの値を変更するだけで、ボタンのラベルが自動的にアップデートされるのだ(再度UIを宣言し直す必要はない)。これにより、HTMLのDOMに相当するものが不要になる点が注目だ。

まとめ

 全体として見ると、コンパクトにまとまった良く出来たスクリプト言語というのが私の感想。宣言型UIは大歓迎だし、それとIncremental Evaluationの組み合わせには大きな可能性を感じる。ただし、Incremental Evaluationを実現するには、変数間の依存関係をグラフとして持っておく必要があり、そこをどのくらい効率良く実装できるかが勝負だろう。

 一つだけどうしても好きになれないのが、doステートメントが別スレッドを作ってしまう点。I/O用のバックグラウンド・スレッドの存在はプログラマーからはあえて隠し、その代わりにI/O関係のAPIをすべて非同期にした方がずっとすっきりとした言語仕様になると思う(長年UIを作る仕事をしてきたが、マルチスレッド・プログラミングとUIはものすごく相性が悪いのだ)。


衆合智サービスと検閲と言論の自由と

 HD-DVDのコピー防止用の暗号キーが早くも発見されてしまい、ネットにはその情報があふれている(参照)。そのニュースそのものは、目新しい話でもなんでもないのだが、今注目すべき問題は、ソシアル・ニュース・サービスのdiggが広告スポンサーであるHD DVD Promotion Groupからの圧力で、「検閲」をした、という問題の方である(参照参照)。

 「編集者ではなく、ユーザー自身が選んだニュース」というdiggのうたい文句そのものが揺らぐようなこの検閲問題、衆合智を利用したソシアル・ネットワーク・サービスのそもそもの成り立ちを考えれば、diggのユーザーたちがものすごく過敏に反応したことも理解できる。

 そもそも欧米には「言論の自由」をものすごく尊重する文化はあるが、diggユーザーの中にはその中でも際立ってその辺りに敏感な人たちが沢山いるようだ。結局のところdiggのCEOのJay Adelsonが検閲の事実を認め(参照)、そのすぐ後にChief ArchitectのKevin Roseが

But now, after seeing hundreds of stories and reading thousands of comments, you’ve made it clear. You’d rather see Digg go down fighting than bow down to a bigger company. We hear you, and effective immediately we won’t delete stories or comments containing the code and will deal with whatever the consequences might be.

If we lose, then what the hell, at least we died trying. 【原文へのリンク

と検閲をはずすことをアナウンスして一応の収拾をつけている。現時点でdiggでHD-DVDでサーチをかけると(サーチ結果参照)、確かに検閲はすでに解除されていることが確認できる。

 衆合智を利用した形での新しいメディア・サービスを語る上で、何年後かの歴史の教科書に載っても良いぐらいの事件をネットからリアルタイムで目撃できるとは、何とも痛快な時代になったものだ。


はてなブックマークとnewsingをマッシュアップして読者アンケートを作ってみた

 はてなブックマークとnewsingをマッシュアップして読者アンケートを作ってみたので下に貼り付けてみるテスト。

 はてなブックマークが20個以上ついたものを新しい順に並べて、投票できるようにした。「newsing it!」というボタンを押せば投票結果を見たり、自分で投票することもできる(投票するにはnewsingにユーザー登録する必要あり)。


シアトルの小鴨たち

 近所のゴルフ場の池に鴨の子供が生まれたのでパチリ。

Duck1

 まだ泳ぎが下手なので、やたらと波をたてる。

Duck1

 出遅れてしまった一匹が懸命になって足をバタバタとさせる。この背中がなんとも…

Duck1

 日向ぼっこをしていたので、 アップで撮影。

Duck1