先週Write Great Code Vol.2を買った。現在半分ぐらい読み進めたがこれがかなり面白い。
内容は教科書的に奥深くもありつつ、実践的で分かりやすいレベルでもあるのでさくさくと読み進めることが出来る。今読んでいるところは、静的変数・自動変数・定数といったあたり。それぞれ内部でどのように表現され、どれぐらいのコストが必要かということ。そして、欠点・利点が詳しく書かれている。
昨年秋ごろから、VHLLでのプログラミング機会ばかりでプログラムが実行される仕組みなどは自分の中で全てブラックボックスであることに危機感を覚えた。豊かさが人間の勉学への熱意の平均値を下げるという調査結果があるかはわからないが、コンピュータの抽象化がミドルクラスのプログラマを怠慢にさせるかもしれない。(これはあくまでプログラマ全体の平均値の話。トップクラスはやはり凄い。)
Cellプログラミングでは、アセンブリと1対1で対応した組み込み命令をC言語上から実行することも多い。SPU上のプログラムでは256KBバイトの制限があるため、メモリの管理をプログラマが意識しなければならない。PPUプログラムでは、PowerPCのアセンブリを読み解く力が必要になる。CellプログラミングをするにもWrite Great Codeは、とってもステキな一冊です。
l'essentiel est invisible pour les yeux
Tuesday, January 30, 2007
Write Great Code Vol.2
RSpec 0.7.5.1 + Ruby-GetText-1.8.0 + Rails 1.2.1でRSpecがエラーを吐くので
先日Rails1.2にバージョンアップしたら、controllerに対してrails_specを実行すると全てエラーを吐くようになった。get, postでリクエストを発行するところでエラーが発生している。
specify "should render 'login'" do
get 'login'
controller.should_render :login
end
% ./script/rails_spec spec/controllers/accounts_controller_spec.rb
.F
1)
NoMethodError in 'When requesting /accounts/login with controller isolated from views should render 'login''
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.split
./spec/controllers/accounts_controller_spec.rb:23:
./script/rails_spec_server:17:in `run'
./script/rails_spec_server:38:
Finished in 0.121637 seconds
2 specifications, 1 failure
%
Gettextによって追加されるbefor filterのinit_gettext中の"request.cgi"でエラーが発生している。
def init_gettext # :nodoc:
cgi = nil
if defined? request.cgi
cgi = request.cgi
end
call_methods_around_init_gettext(@@before_init_gettext)
init_gettext_main(cgi) if @@gettext_domainnames.size > 0
call_methods_around_init_gettext(@@after_init_gettext)
if ::RAILS_ENV == "development"
@@before_init_gettext = []
@@after_init_gettext = []
end
end
このエラーを回避するために、specファイルのsetupメソッド中に次の処理を追加すると解決する。
setup do
# ...
ENV['REQUEST_URI'] = request.request_uri
end
Sunday, January 28, 2007
NHKインドの衝撃第一回

1月28日21:00~NHKで第一回インドの衝撃が放送された。
トーマス・フリードマンも登場し"フラット化する世界"についてからインドの教育・Infosysとインドの実情を1時間の番組にまとめられていた。
フラット化する世界を読んだときに、静かな危機に鳥肌をたてたが番組を見ても同じだった。紙と鉛筆のみを持ち教室にぎっしりと詰まった学生・勉強しインドの発展に貢献したいという目標を持つ学生・勉学に集中できることが幸せですと語る学生・屋外の塾で傘をさしながら雨に濡れつつノートを取る学生。私の大学の講義では、インドと中国からの留学生が最前列に集中し、真ん中を空けて後方にその他の留学生が座る。そして、日本人が最後尾の列に座る。一日16時間勉学に励む。
どれほどの日本の学生が「何のために勉強する?」という質問にまじめに答えられるのだろうか?
戦後の日本はあんな状態だったのだろうか。豊かさの中でハングリー精神を育て国民の意欲を促進させる教育制度とはどんなものだろうか?急速に優秀な頭脳の需要が高まる中、優秀な頭脳を育成できない国は、急速に衰えても不思議ではない。
頭脳立国を掲げ頭脳を売り上げにつなげるソフトウェア産業において急速な発展を遂げるインド。21世紀日本の中小企業もインド・中国の優秀な頭脳にアクセスし、彼らの頭脳を活用しなければならないだろう。アメリカ企業がR&Dセンターをインドに設立するように、自社の雇用を自国に限らず展開していかなければ企業は滅びてしまう。21世紀の知識労働者が活躍する企業は、自社の発展を支える頭脳を育てる教育に対して還元することを求められるだろう。
これは、静かな危機でもあり大きなチャンスでもある。
優秀な頭脳がアジアに溢れイノベーションのチャンスが生まれる。そのフラット化する世界で自分が何をしていこうか?近頃ずっとそう自問を続ける。勉強することがたくさんある。
参考
インドの衝撃 第一回
インドのIT産業の躍進とR&D
Friday, January 26, 2007
感情を伝えるBei Xuの歌声
にすっかり魅せられてしまった。
マンハッタンのメディカルセンターのIT部門で働いているOLでもあり、中国出身のJazz SingerのBei Xu. 先日iTunes Music StoreでユーミンのA Happy New Yearのカバーをダウンロードしたことで知り、Lost In Translationを買いに走りました。
「私はどちらかというと、声を楽器と思うより、感情を伝えることに集中している。ふだんも人の感情とか察知するのを得意としているから」
包み込むようなBei Xuの綺麗でしっとりとした歌声と優美な世界観に魅了されます。歌っているというより、Bei Xuが表現するそれぞれの曲の世界観を語りかけているように思えてきます。
学業専念の2006年を終え新曲を出した、Crystal Keyのきっと永遠に。本当に、何度聞いてもジーンとさせてくれるバラード。普通に涙ぐみそうになった。
ジャケットのCrystal Keyがとってもセクシーです。
Saturday, January 20, 2007
[rails] activesupport-1.4.0 CHANGELOG
Rails 1.2では、activesupport-1.4.0にアップデートしています。
activesupport-1.4.0/CHANGELOG
* Add ActiveSupport::Multibyte. Provides String#chars which lets you deal with strings as a sequence of chars, not of bytes. Closes #6242 [Julian Tarkhanov, Manfred Stienstra, Thijs van der Vossen & Jan Behrens]
ActiveSupport::Multibyteをrequireすると、String#charsメソッドが追加されます。charsメソッドはマルチバイト文字列への操作のプロキシ的な役割を果たします。
ActiveSupport::Multibyte
% ./script/console
Loading development environment.
>> "É À È Ù Â Ê Î".reverse
=> "\216� \212� \202� \231� \210� \200� \211\303"
>> "É À È Ù Â Ê Î".chars.reverse
=> #<activesupport::multibyte::chars:0xb700136c string="Î Ê Â Ù È À É">
>> "É À È Ù Â Ê Î".chars.reverse.string
=> "Î Ê Â Ù È À É"
>> "É À È Ù Â Ê Î".slice 1..2
=> "\211 "
>> "É À È Ù Â Ê Î".chars.slice 1..2
=> #<activesupport::multibyte::chars:0xb6ffaaf8 string=" À">
>> "É À È Ù Â Ê Î".chars.slice(1..2).string
=> " À"
>>
ActiveSupport::CoreExtensions::String::AccessがString#charsに対しての操作に変更されたため、マルチバイト文字を扱えるようになりました。
>> "É À È Ù Â Ê Î".at 0
=> "É"
>> "É À È Ù Â Ê Î".from 1
=> " À È Ù Â Ê Î"
>> "É À È Ù Â Ê Î".from 10
=> "Ê Î"
>> "É À È Ù Â Ê Î".first
=> "É"
>> "É À È Ù Â Ê Î".last
=> "Î"
>>
* Hash#to_xml supports Bignum and BigDecimal. #6313 [edibiase]
Hash#to_xmlがBignumとBigDecimal型に対応しました。
before
% ./script/console
>> {:te => 1111111111}.to_xml
=> "\n\n \n"1111111111 \n
>> {:te => BigDecimal.new("0.123456789123456789")}.to_xml
=> "\n\n \n"0.123456789123456789 \n
>>
activesupport-1.4.0
% ./script/console
>> {:te => 1111111111}.to_xml
=> "\n\n \n"1111111111 \n
>> {:te => BigDecimal.new("0.123456789123456789")}.to_xml
=> "\n\n \n"0.123456789123456789 \n
>>
* Hash.create_from_xml has been renamed to Hash.from_xml, alias will exist until Rails 2.0 [DHH]
Rails 2.0まではXML文字列からRubyの型を返すcreate_from_xmlが残されますが、WARNINGが発生します。Hash.from_xmlを使用しましょう。
>> Hash.create_from_xml("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n <name>David</name>\n</hash>\n")
=> {"hash"=>{"name"=>"David"}}
>>
% tail -f log/development.log
DEPRECATION WARNING: Hash.create_from_xml has been renamed to Hash.from_xml See http://www.rubyonrails.org/deprecation for details. (called from irb_binding at (irb):24)
* alias_method_chain works with accessor= methods also. #6153 [Caio Chassot]
* Added Module#alias_attribute [Jamis/DHH]. Example:
class Content < e =" Email.find(1)"> "Superstars"
e.subject # => "Superstars"
e.subject? # => true
e.subject = "Megastars"
e.title # => "Megastars"
alias_methodが属性の代入に対しても使用できるように変更。(破壊メソッドを表す!と真偽値を返す?だけがサポートされていました)。また、alias_methodと同じように、プロパティのエイリアスを設定できるalias_attributeが追加されました。
* Optional identity for Enumerable#sum defaults to zero. #5657 [gensym@mac.com]
Enumerable#sumでブロックを評価した値の合計値が計算できます。
inject(0) {|sum, p| sum + yield(p)}と等価です。
>> [100,200,300].sum {|yen| yen * 1.05}
=> 630.0
* Enhance Symbol#to_proc so it works with list objects, such as multi-dimensional arrays. Closes #5295
Symbol#to_procがネストした配列に対しても適用できるようになりました。
>> [[1, "one"], [2, "two"], [3, "three"]].map(&:last)
=> ["one", "two", "three"]
ActiveSupport::OrderedHash#valuesの追加。このクラスは、キーの値をソートした状態で配列として保持します。ハッシュと同様にキーでアクセスできます。
% ./script/console
>> oh = ActiveSupport::OrderedHash.new
>> oh[:a] = 2; oh[:b] = 1; oh[:c] = 3;
>> oh.keys
=> [:a, :b, :c]
>> oh.values
=> [2, 1, 3]
>> oh
=> [[:a, 2], [:b, 1], [:c, 3]]
* Added Array#to_s(:db) that'll produce a comma-separated list of ids
Array#to_s(:db)の追加。Array.map(&:id).join(',')と等価。
Saturday, January 13, 2007
[Cell] SPUプログラムをスタンドアロンで実行する。(spulets)
SPUプログラムもスタンドアロンで実行可能にするには、crt(C RunTime Object)を合わせてリンクする必要がある。GCCでは-mstdmainオプションを付加することで、スタンドアロンで実行可能としてコンパイルできる。SPUプログラムのHello, Wolrdを単独で実行可能としてコンパイルする。
PPUから起動される場合と異なり、main()の引数がint argc, char **argvとなることに注意する。引数のアドレスはローカルストア上のアドレスを参照している。
hello.c
#include <stdio.h>
int main(int argc __attribute__((unused)), char **argv __attribute__((unused))) {
int i;
printf("Hello, world from SPE.\n");
for(i=0;i<argc;i++) {
printf("argv[%d]=%p\n", i, argv[i]);
}
return 0;
}
Makefileを作成する。Cell SDK 2.0に付属しているmakeファイルを使用する。LDFLAGS_gcc定数に-mstdmainを定義する。
PROGRAM_spu = hello
LDFLAGS_gcc = -mstdmain
include /opt/ibm/cell-sdk/prototype/make.footer
実行するとargv[1]の引数の値が0x3fff0に配置されていることが分かる。
# ./hello test
Hello, world from SPE.
argv[0]=0x3ffe8
argv[1]=0x3fff0
#
ローカル・ストレージは0x3fffd0を開始位置としてスタックポインタを初期化する。プログラムに渡されるコマンドライン引数は、0x3fff0のアドレスからスタックに詰まれる。メモリスタックの図をSPU Application Binary Interface仕様書より拝借した。

参考
SPU Application Binary Interface仕様書 (PDF)
Friday, January 12, 2007
iPhoneからiTunes Music Storeで直接音楽を購入できない理由を考える
スティーブ・ジョブズの面接試験、iPhone編を大学への通学途中に考えてみた。
Appleは携帯電話だけを提供する会社ではなく、PC, iPod, Apple TV, iPhoneといったプロダクトを元に、マルティメディアを楽しむためのエコシステムを提供する会社である。そしてその中心に位置するのがPCでありiTunesである。iPhoneという携帯電話のみで完結する気はさらさらない。PCからiTunes Storeを通してコンテンツを購入し、家にいるときはApple TVで楽しみ、外ではiPodやiPhoneで楽しむ。iPhoneは1つの端末でしかない。コンテンツを購入する場所が増えるのは消費者の混乱をもたらし、シンプルでもない。
「iPhoneでも音楽を購入できないと競争できない」と考えるのは、携帯電話のみをサービスとして取り扱っている会社ならではの発想ではないだろうか?Appleが提供するのは電話ではない。
PCとApple TVとiPhoneが実際に手元にあるライフスタイルを妄想してみた。
家の中のマルティメディアコンテンツをPCからiTunesを立ち上げるだけで管理できる。ポッドキャストや音楽をチェックしその日聞きたいマルティメディアコンテンツをiPhoneにSyncする。それで出かける。家に帰ったら映画の続きをApple TVで楽しむ。これは、iShuffleやiPodを持ち歩くときと全く変わらない感覚だ。
家の中のマルティメディアコンテンツは、iTunesで管理されるのが美しいしシンプルだ。
携帯電話で音楽をダウンロードするには、通信料金が必要になる。さらに、アメリカでiTunes対応携帯を出しているSprintやVerizonではそれぞれ一曲あたり2.5ドル、1.99ドルというプレミアム料金が加算される。
日本では携帯でショッピングをしたり音楽を購入する感覚が根付いている。
iPhoneの登場により、日本でもPCにインストールされたiTunesを中心としたエコシステムが普及するかどうか楽しみである。
The World Is Flatは新しい物の見方を与える一冊
フラット化する世界の下巻を読み終えた。
上巻を読み終えた前回、「頭を整理する一冊」と書いていたのは大きな間違いだった。3重の集束を初めとして付箋を貼った箇所を何度も多読する必要性を感じた。
偉大な著作には、人々に新しいものの見方を与えるという目標がある。フリードマン氏は間違いなく、その目標に達した。-- ジョセフ・スティグリッツ(コロンビア大学教授。ノーベル経済学賞受賞者)
と評されるように、新しい見方を与えてくれる一冊となった。特に「第7章 理想の才能を求めて」・「第8章 静かなる危機」・「第9章 これはテストでない」に渡ってと、教育者ではなくジャーナリストとして世界中を回り取材した内容から洞察したアメリカの教育制度の危機から、世界の教育制度に至るまでの話には非常に関心を持った。
私たちが何気なくぼーっとしている間にも、中国やインドの人達(の一部)が一日16時間~18時間も働き(or 勉強)、休日も休み無く勉学に励んでいるという。だからといってこちらが、1日20時間勉強して休日も勉強するなどとやっていると死んでしまう。ただ、「世界をフラット化した10の要因」を教育で教えて、だからこそ誰にでも世界を動かすチャンスがあることに興味を持たせるような教育をするべきではないだろうか。教育問題についての知識が皆無な私でも、安部政権が掲げる日本の教育再生はきわめて重要な問題であることはわかる。人口が減り世界がフラット化し外国から高いレベルの教育を受けた優秀な労働力が流れ込んでくれば、個人個人が「雇用される能力」を高めてより発想や付加価値をつけるといったより上のレベルの能力を習得しなければならない。
先日友達と飲んだときに、アーティスティックな才能が必要になる世界を除けば、努力することで成功することはできるという話で盛り上がったが、この表現は間違っていた。CQ + PQ > IQと書かれているように、CQ(好奇心)とPQ(情熱)は「(自分に)努力していること」を感じさせず、人を突き動かす強力なバイタリティとなる。好奇心と情熱がもっと「もっと良い方法はないか」と人を突き動かす。「会議が長いこと」も会社のいいところであり、デザイン部門・開発部門の枠を超えて、未来を変えてしまう革新的なプロダクトを創ることに、ジョブスや天才エンジニア達、全員の強力な熱意・情熱が注がれるAppleのプロダクトが人を魅了しないわけがない。
本文中に「希望を輸出するアメリカ」という表現がある。
先日Apple TV, iPhoneといったプロダクトを発表した、Appleは希望を輸出している企業だろう。モバイル分野では日本が進んでいるのに、日本の企業ではiPhoneはアイデア段階で存在してもプロダクトにはならない。スティーブ・ジョブズだからこそ可能になったiPhoneのユーザー・エクスペリエンスに中島さんが言及している。
フラット化する世界でのイノベーションというのは、「イノベーションの達人 - 発想する会社をつくる10の人材」の「第3章 花粉の運び手」で表現されている他花受粉の全世界版だと思った。つまり発想する会社を作る人材は世界中に存在し、それらを他花受粉させることでイノベーションを起こしていく。それを可能にするインフラが整いつつあるのだ。
PS
フラット化する世界を読み終え、本には大量のコメント付き付箋が貼られた。下巻を半分ぐらい読んだときに、AmazonのリコメンドエンジンにオススメされてA・トフラー作の富の未来(上下)をまんまと注文してしまった。全くいい顧客だ。明日来るはずである。
Thursday, January 11, 2007
Apple, Inc.が羨ましい
Macworld San Fransisco 2007
iPhone and Aplle TV
ムービーで見ただけでも全身に鳥肌がたった。3回も。
もう、本当にワクワクさせられる。
Apple TVはすぐ注文したし、iPhoneのMulti-Touch UIには感動した。
Multi-Touch Interaction Research
タッチパネル上でDJもやってしまう。5年の家電にはこんなUIが溢れているのだろうか。
テクノロジー・デザイン・インタフェース。
全てクールだ。
- ソフトウェアキーボード
- 日本語の場合予測変換を用意してくれるのか
- 画面に指紋がつかないか
- バッテリ短くないか
- GSM+EDGEを採用した理由
新たなライフスタイルを提供するApple.
最後はPCの前で思わず一緒に立ち上がってスタンディング・オーベーションをしてしまうほど、本当に、本当に感動した。
参考
iPhoneを触ってみた、そしてiPhoneの歴史?
Tuesday, January 09, 2007
[本] The Wold Is Flatは今世界で起きている変化について頭を整理する一冊

少し前に中国からの留学生の自己紹介プレゼンを聞く機会があった。
彼の自信・自慢たっぷりの中に「ワタシのことキライな人多いデス。」という(謙虚さを示す?)セリフを何度もはさみながら話す様子や、とてつもなく強い知的欲求を持つオーラが溢れている彼に興味を持った。協調を好む日本人を気遣ってかは、知らないが「自分は嫌われてもしかたナイデス。」と何度も繰り返すため、「いやいや面白いよ。もっと話して」と何度もコメントした。
これまで、インド出身のエンジニアと働いた経験が無いのだが、彼・彼女らも強い知的好奇心とハングリー精神を持つ。世界中の優秀かつStay Hungryな人達が世界に飛び出し、または自国でGoogleを使って世界で起こっている最先端の知識にアクセスしていると思うと、その世界の中で自分はどこで価値を発揮すべきかと自問自答する一方で何かとてつもないことを起こせる時代が目の前に来ていると感じていた。でも、それが一体何なのかはっきりと説明できない。
今、世界で何が起こっているのか?もっと世界に目を向けなければいけない。近頃強くそう感じていたのだった。
先日フラット化する世界(原書 The World Is Flat)という本を見つけて、タイトルに強く興味を惹かれすぐさま上下巻合わせて注文して今日届いた。そして上巻を今読み終えた。(もちろんその際には原書と訳書のAmazonのレビューとレイティングを参考にした。本当にCGMは便利なものだ。)
そんな新しいIT世代のインドの若者を表す言葉にZippieがある。
Wired MagazineがHere Come the Zippies!(ジッピーここにあり)でZippieについて定義している。フラット化する世界(上)から引用すると、
年齢は十五歳から二十五歳で、活力に富み、ジェネレーションZに属する。男女いずれも同じで、学生・職業人の差を問わない。野心や願望を前面に押し出す。冷静で、自信に満ち、創造的だ。自らやりがいのある困難な仕事を求め、リスクを好み、怖れをしらない。
<--snip-->
ジッピーは定められた運命ではなく目的を原動力とする。内ではなく外に目を向け、現状にとどまらずに上昇する。
彼らはルイ・パスツールの残した「幸運の神様は、常に用意された人にのみ訪れる。」という言葉を心から良く理解しているだろう。彼・彼女らがアメリカ・日本にとって最高のビジネスパートナーにもなり、低級~中級の技術者の雇用を奪う存在になることについては本書で多くのページを割いて語られている。
インドや中国で働く若者は、アメリカや中国にでて高度な知識の勉学に励み習得しようとする者もいる。Y2K特需以降の光ファイバーインフラの発展によりインド国内で海外から下請けを請負いその中から知識を吸収し自分の物にしていく者もいる。
世界のフラット化はグローバルレベルでの最適化をもたらす。
より低コストで出来る仕事や高い技術レベルを要さない仕事は海外にアウトソーシングされ、自国内には専門的かつ高い能力を要する仕事や病院・サービス業といった直接的な仕事だけが残る。Zippieや日本やアメリカに留学する人達の知的好奇心とハングリー精神は、多くの日本人にはまだまだ足りないものだ。
エドウィン・ランド博士が言ったこの言葉が気に入っている。
世界とは、収穫されるのを待っているこの実り豊かな畑のようなものです。種はもう蒔かれていて私のすべきことは、行ってもっと多くの種を蒔き、収穫することです。
フラット化が進む世界では田んぼには水路が完備され、品種改良が進む苗がそろっている。ただ、それらの苗の存在や水路や温度調節の使い方を知らなければいい作物は育たない。今世界で何が起こっているのかを知りそれらへのアクセスパスを持つ必要がある。
この10年~15年あまりに多くのイノベーションが並行して同時に発生したため、その偉大さをまだはっきりと理解できていない。ただ何か凄いことを起こせる時代に突如として突入した。そしてフラット化が進む現在はルネサンスに例えられることもある。
人生は短く地球の時間軸で見ると無に等しい。
また時間という資源は誰でも共通に同じく消費されるという。しかしこれは語弊があると思う。1万年前では、1日は生物にとって共通で1日だった。フラット化が進む世界では違う。1日という時間に10日分の価値を見出すことも可能だろう。
そんな時代に、世界を変えるチャンスに自分の人生をかけれるというのはなんとエキサイティングなんだろう。
本の感想が抜けてしまったが、多くのブログ等で本書についてまとめられている。
経済に関する知識や歴史を知らない私には、インドの発展やアメリカとの関係について勉強になる部分が多かった。どちらかというと、目からうろこ的な目新しいことがかかれいてるというよりは現在世界で起こっていることと、この20年で同時に大量発生したイノベーションについて整理する一冊として価値のある本であると思う。
下巻が楽しみだ。
Sunday, January 07, 2007
[Cell] libsp2 APIを使用してMailboxを介した通信
3週間ほどCellから離れている間に、CBE SDK2.0やlibspe2がリリースされました。
libspe2はlibspe1と大きくspufs抽象化の仕組みが異なっているので、libspe2 APIの基本的な使い方を見ていきます。
SPEはプログラム中から直接扱えないため、ソフトウェアレベルで抽象化されて扱うための実装としてコンテキストが導入されており、コンテキストは"論理的なSPE"についての情報を保持します。プログラマはSPEコンテキストへのポインタを扱うことでSPEを操作できます。
SPEコンテキストを1つだけ扱う場合は次の順序で実行する。
- SPEコンテキストの作成
- SPEのローカルストアにSPEに実行させるプログラムをロードする
- SPEコンテキストを実行する
- SPEコンテキストを廃棄する
SPEコンテキストの作成はspe_context_create関数を使用します。
第一引数にコンテキストに適用するフラグを指定します。
第二引数はギャングコンテキスト(複数のコンテキストを1つに関連付け)を使用する際に使用します。
PPE側のプログラム
spe_context_ptr_t ctx;
// Create SPE context
if((ctx = spe_context_create(SPE_EVENTS_ENABLE, NULL)) == NULL) {
perror("spe_context_create");
return 1;
}
SPEのローカルストアにプログラムをロードするには、spe_program_load()関数を使用する。
ここではCESOFを使用しているため、ELFイメージをロードする必要はありませんが、ELFイメージを手動でロードする場合は、spe_image_open()関数を使用します。
extern spe_program_handle_t spe_mbox;
// Programe load to Local Store
if((rc = spe_program_load(ctx, &spe_mbox)) < 0) {
perror("spe_program_load");
return 1;
}
SPUと他のデバイス間(他のSPUやPPU)の通信には、MMIO・DMAといった手段のほかに、Mailboxという32bitメッセージをやり取りする仕組みが用意されています。今回はMailboxを利用してデータを送信します。メールボックスの詳細は、Cell Broadband Engine Programming Handbook 19.6 Mailboxesを参照してください。
SPUのMailboxへデータを書き込むには、spe_in_mbox_write()関数を使用します。
送信先のコンテキスト, 書き込むデータへのポインタ, 書き込むデータ数, ブロッキングに関する振る舞いを引数に指定します。
unsigned int mbox_data = 123;
// Write to Mailbox
if((rc = spe_in_mbox_write(ctx, &mbox_data, 1, SPE_MBOX_ALL_BLOCKING)) < 0) {
perror("spe_in_mbox_write");
return 1;
}
SPEコンテキストを実行します。
引数に与えたspe_stop_info_t型の変数であるstop_infoへのポインタを渡すことでSPEの終了状態に関する情報が取得できる。spe_stop_info_t構造体についての詳細は、libspe-v2.0.pdfを参照。
// Print exit status code
switch(stop_info.stop_reason) {
case SPE_EXIT:
printf("SPE_EXIT stop_info.result.stop_exit_code=0x%x\n", stop_info.result.spe_exit_code);
break;
case SPE_STOP_AND_SIGNAL:
printf("SPE_STOP_AND_SIGNAL stop_info.result.stop_signal_code=%d\n", stop_info.result.spe_signal_code);
break;
case SPE_RUNTIME_ERROR:
printf("SPE_RUNTIME_ERROR stop_info.result.spe_runtime_error=%d\n", stop_info.result.spe_runtime_error);
break;
case SPE_RUNTIME_EXCEPTION:
printf("SPE_RUNTIME_EXCEPTION stop_info.result.spe_runtime_exception=%d\n", stop_info.result.spe_runtime_exception);
break;
}
最後にSPEコンテキストを破棄する。
// Destroy SPE Context
if((rc = spe_context_destroy(ctx)) < 0) {
perror("spe_context_destroy");
return 1;
}
SPE側のプログラム
#include <stdio.h>
#include <spu_mfcio.h>
typedef union {
unsigned long long ull;
unsigned int ul[2];
} addr64;
int main(unsigned long long speid __attribute__((unused)),
addr64 argp __attribute__((unused))) {
unsigned int mbox_data;
printf("Hello, world from SPE.\n");
// Read data from mailbox
mbox_data = spu_read_in_mbox(); // spu_readch(SPU_RdInMbox)
printf("SPE mbox_data: %d\n", mbox_data);
return 26;
}
spu_read_in_mbox()関数でinbound mailboxにあるデータを読み込む。
ソースコード一式
ディレクトリ構造は次の通り。
% ls -FR
.:
Makefile ppu/ spu/
./ppu:
Makefile mbox_test.c
./spu:
Makefile spe_mbox.c
%
ppu/mbox_test.c
#include <stdio.h>
#include <libspe2.h>
extern spe_program_handle_t spe_mbox;
int main() {
int rc;
int flags;
unsigned int entry = SPE_DEFAULT_ENTRY;
unsigned int mbox_data = 123;
spe_context_ptr_t ctx;
spe_stop_info_t stop_info;
// Create SPE context
if((ctx = spe_context_create(SPE_EVENTS_ENABLE, NULL)) == NULL) {
perror("spe_context_create");
return 1;
}
// Programe load to Local Store
if((rc = spe_program_load(ctx, &spe_mbox)) < 0) {
perror("spe_program_load");
return 1;
}
// Write to Mailbox
if((rc = spe_in_mbox_write(ctx, &mbox_data, 1, SPE_MBOX_ALL_BLOCKING)) < 0) {
perror("spe_in_mbox_write");
return 1;
}
// SPE Context running
if((rc = spe_context_run(ctx, &entry, 0, NULL, NULL, &stop_info)) < 0) {
perror("spe_context_run");
return 1;
}
// Print exit status code
switch(stop_info.stop_reason) {
case SPE_EXIT:
printf("SPE_EXIT stop_info.result.stop_exit_code=0x%x\n", stop_info.result.spe_exit_code);
break;
case SPE_STOP_AND_SIGNAL:
printf("SPE_STOP_AND_SIGNAL stop_info.result.stop_signal_code=%d\n", stop_info.result.spe_signal_code);
break;
case SPE_RUNTIME_ERROR:
printf("SPE_RUNTIME_ERROR stop_info.result.spe_runtime_error=%d\n", stop_info.result.spe_runtime_error);
break;
case SPE_RUNTIME_EXCEPTION:
printf("SPE_RUNTIME_EXCEPTION stop_info.result.spe_runtime_exception=%d\n", stop_info.result.spe_runtime_exception);
break;
}
// Destroy SPE Context
if((rc = spe_context_destroy(ctx)) < 0) {
perror("spe_context_destroy");
return 1;
}
return 0;
}
実行結果
Mailboxを介した通信とSPEプログラムの返り値26(=0x1a)が正常に取得できています。
# ./mbox_test
Hello, world from SPE.
SPE mbox_data: 123
SPE_EXIT stop_info.result.stop_exit_code=0x1a
#
参考
SPE Runtime Management Library (PDF)
Cell Broadband Engine Programming Handbook Version 1.0 (PDF)
Monday, January 01, 2007
アップルが売る所有者意識
A Happy New Year.
2007年になりました。
ジャズを聞ききながら本を読む事が最近お気に入りです。
中でも、Bill Evansの美しいピアノは本に集中できます。
iTVと合わせてiPhoneも発表?などとMacフリークを超えて憶測が飛び交っていますが、サンフランシスコで1月8日からMacworldが開催されます。CESも非常に楽しみです。
John Scurryの世界を動かす経営哲学(上)が昨日届き、さっき読み終えた。初版が発刊されたのは1988年なのでもう大昔の話だけど、アップルがパーソナルコンピューターの市場を創造し、「アップルを持っている!」という所有者意識を作り揚げ、Appleの失敗に至るまでの話がJohn Scurreyの立場から描かれています。今年読んだ最初のこの本で垣間見る、シリコンバレーのルネサンスは非常に強烈だった。
自分が生まれる5年も前にアメリカではこんなジョブスの言うInsanely Greatなことが起こっていたのに、自分がテクノロジーに興味を持ったのはつい6年ほどと思うと時間が非常に惜しいが、これからの10年もまたルネサンスとなるだろう。テクノロジーがよりユーザにつながれこれまでになかった全く新しいユーザエクスペリエンスが創造されることになる。そんなパソコン1つで楽しいことが始めれる年に生まれたことに感謝したい。
さて、John Scurryはマーケティングのプロである。
第二の波と表現されるトップダウン型経営のペプシから全くカルチャーの異なる積極参加型経営のアップルに移りジョブスと共に製品群を売り出していくわけである。コカコーラに圧倒的に話されていたペプシが視点を変えポジショニングを変えるチャレンジキャンペーンでコカコーラからシェアを奪い取り、アップルがNo.1の巨人IBMに挑むために、徹底した比較広告でMachintoshはIBMと戦う製品だ!というレベルまで顧客の認識を引き上げた。
この本が面白いのは、ペプシで築き上げたマーケティングの達人John Sculleyがペプシとは全く性格の異なる第三の波と表現される企業と市場で活躍するする模様が描かれているところである。これを読むと第三の波に相当する企業が今の日本でもどれだけあるのだろうか?と考えてしまう。今年一年でこれまでなかった「アメリカに対する憧れ」が芽生えた。アメリカに渡ろうと心が決まりつつある。
Macとの最初の出会いは、Kid PixとIllustratorで絵を描いたことだった。
コンピュータで絵を描ける事に"Insanely Great"を感じたのを思い出した。そして、Hyper Card上では絵を描いてイベントドリブンなプログラムで動かすことが子供のとき何より楽しかった。
PS.
カナダに一年留学していた友達がすっかり考え方が変わって面白い人間になっていたのだけど、その友達にrakutoの言ってることがわかった的なことを言われた。だけど、ずっと日本に篭っていた私は一体・・・。
Thursday, December 28, 2006
[日記] 2006年を振り返る
漫才という夢に向かって走っている一年目の友達がこんなことを書いていた。
話は少し変わるが最近、昔からの付き合いの友達と遊んでいても、合わないと感じる事が多くなったような気がする。
空気がぬるいというか何と言うか。
まあやっぱり普通に就職していく人と自分の本当にやりたい事を追求していく人とはどうしたって空気の違いが出てくるものだとは思う。
Life is beautifulでUIEJ立ち上げメンバ募集という記事を見つけ、気がついたら応募していたのがちょうど一年前だった。今年一年は本当に長かった。そしてきつかったが楽しい一年だった。
技術スキル的な成長もあるが、面白い人達と出会い考え方が大きく変わった。働き出して3年目の大学3年ぐらいまで、友達が書いている事と全く同じことを感じていた。
私の場合は、自分にバリアを貼ることで周りへの興味・関心をなるべく排除した。そうしないと、一人で走り続けるだけのモチベーションが維持できないような気がしていた。なぜか、ずっと一人で走っていると思いこんでいた。この業界は特殊だし、友達と夢を語り合うこともなかった。だから友達とはそんな話は全くしなかったし、「友達は友達。私は私」と勝手に分け隔てていた。
誰でも自分自身を周りから隔てるという事はあるのかもしれない。
オリックスの清原選手もプロに入ったときに周りのノイズを排除して自己に集中するために、番長というキャラクターを作り出し近寄りがたくしていったとテレビで語っていたし、サッカーの中田選手も感情を表に出さないように自分を作っていったと話していた。
今年は環境も大きく変わり、一年の半分近くを東京で過ごした。
物事の考え方も大きく変わった今だから振り返れる。私の場合は、バリアを貼って自分のモチベーションを維持してきたことにはメリットもデメリットもあったと思う。メリットは、モチベーションを維持し走ってきたことで強力なスキルを手にした。デメリットは、周りへの関心・興味が薄れ自己中心的になり、非常に狭い感性しか持てなくなったことである。今年は、自分に自信が持てるようになりバリアを外すよい時期だったのかもしれない。
そんな時に、エッジが効いている人が集まっているUIEJの人達に出会うことができた。
某世界的大企業出身のPMはタッチラインを割っていても割っていないというようなジャイアンぶりだし、理系の日本一の大学出身なのにものすごい柔軟な頭だしベンチャーの社長でもあり田園調布に住んでいたという面白い人もいるし、毎朝自転車で20kmぐらいの距離を通っていて映像系の出身なのにプロジェクトマネージメントを行いプログラムも書くマカーな人がいたり、自称問題児という今までであったことに無い新しいメイド系の楽しい人がいたり、笑顔がステキなトムクルーズがいたり、ホストだと思っていたらネットナンパ師だった人がいたり、CEOはマッドサイエンティストだし、社長は○○に凄い詳しいし、キャラクターに富んでいる。
(全てほめ言葉です。念のため。)
本当にすばらしい人達と一年間一緒にやれて、人を隔てることもなくなったしその人達のステキなところと自分のステキなところで何か起こせないか?常にそう思う。機会はそこら中にあって広く興味をもち感性を磨いておかないと見逃してしまう。
今年は出会いも別れもあったが、いい出会いや別れを経験することで物事を考えることでその人の感性や人間がつくられる。いい一年だった。
未来を予測する最善の方法は、それを発明することだ
というアラン・ケイ氏の言葉の通り、未来は創るものだと思う。シアトルかシリコンバレーに渡りガレージベンチャーを起こすまでに色々なステキな人と出会い影響をうけたい。また、そんなエッジの利いた人達に「この人と何かやると楽しそう」そう感じさせるオーラを出せるように自己を磨いていきたい。
人生はあっという間だ。どうせなら楽しいほうがいい。
最高のチームを作り、未来を創造することで時代をつくる。これが自分の人生の楽しみだと思っている。
Tuesday, December 26, 2006
[ruby] ウムラウトを実体参照に変換
卒論やらポルトガル語やらで、Cellができない。。
早く片付けてまたCell始めます。
というわけで今日は、Rubyでウムラウトを実体参照に変換するだけのプログラムです。実体参照を打つのが面倒だったため、同じことで誰かが苦しまないように書いておきます。
module Umlaut
UMLAUT_TRANSLATE_TABLE = %w(À Á Â Ã Ä Å Æ Ç È É Ê Ë
Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú
Û Ü Ý Þ ß à á â ã ä å æ ç è é
ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø
ù ú û ü ý þ ÿ)
def umlaut2entity
ret = ""
self.each_byte do |c|
(ret += c.chr and next) if c < 0xc0
ret += UMLAUT_TRANSLATE_TABLE[c - 0xc0]
end
ret
end
end
String.class_eval do
include Umlaut
end
if $0 == __FILE__
puts "Voc\xea \xe8 linda!".umlaut2entity
end
実行結果
% ruby test2.rb
Você è linda!
%
これでブラジル人とつきあうことになっても大丈夫です。
参考
http://www.pref.shizuoka.jp/kikaku/ki-28/bom_dia/lesson10.htm
Saturday, December 16, 2006
ライフスタイル2.0について考える - デジタル・テレビの新たなる挑戦に行ってきた
Connect
goo 辞書近頃よくConnectという言葉を耳にするが、この言葉が気に入っている。広い意味で解釈できる言葉で抽象的だが、「テクノロジーをユーザにつなげてより良いユーザエクスペリエンスを提供する」・「それぞれ単独で動いて自己完結していたモノ同士をつなげてより良いユーザエクスペリエンスを生み出す」。
Connect - つなぐ, 結合する
デジタル・テレビの新たな挑戦 に行ってきた。SONY・シャープ・松下・NTT・Microsoftといった、そうそうたる大企業の方々ばかり。年齢層も30~50代ぐらいの方が多くスーツを着用されている方が目立った。
LLやWeb関連セミナーにしか出席したことが無く家電系のイベントは初めてだった。
当たり前だけど市場が変われば市場を創造している人も変わるなと感じた。
これまでメーカーが創造してきた市場にソフトウェアを作って成長してきたYahoo, Googleといったソフトウェア企業が参入できるような領域が生まれている。何だかとっても楽しそうなことが出来そうだが、とりあえずは自分の部屋にデジタルホームを作ってみないとどんなユーザエクスペリエンスがあると楽しいかわからない。うちのサーバ化しているPS3も何か家電としての活用方法を見出してiTV買ってなど。
とりあえず、ライフスタイル2.0って何って考えてみる。
- ホームサーバ上にデータが蓄積され好きな場所から好きなときにデバイスに合わせて適切に変換され取り出すことが出来る。(ロケフリ)
- Web2.0という言葉ともに広まった集合知やFolksonomyを家電上からも利用できる。
- DLNAで家の中にある家電がつながり、テレビやPCからRemote UIで操作できる。
- WinならMyネットワークに目覚ましやクーラーなどが表示される。
- iTunes Storeで購入した映画のジャンルに合わせて、テレビからスピーカーのイコライザを自動で調整してくれる。
ライフスタイル2.0を創造できるなんて楽しすぎ。
TODO
- DLNA 1.x 2.0
- DRM
- Remote UI
- Cell
Friday, December 15, 2006
Sunday, December 10, 2006
[Cell] ダブルバッファリングを用いたDMA転送
CellプログラミングではSPEプログラミングでの最適化テクニックが重要となる。CellにおけるDMA転送はLSとメインメモリの間をCPUを介さずに通信する仕組みである。今回は、DMA転送を最適化するダブルバッファリングというテクニックを試してみた。
DMA転送を最適化するテクニックとしてダブルバッファリングがある。 ダブルバッファリングでは、二つのバッファとタググループを使用し、DMA転送と計算を同時に行うことで処理時間を短縮することができる。
DMA転送に使用するバッファを2つ宣言する。
2^20という巨大なサイズを持つ配列に0~2^20-1間で初期値を代入する。PPE側で8つのSPEで処理を並列処理するようにデータを準備する。PPEの処理は次のようにする。
- DMA転送に使用するため128byte境界にアラインした領域をヒープにメモリを確保する。
- 配列の値を初期化する。
- 配列を16個のチャンクにわけ、1つのSPUで2つのチャンクの処理する。
- DMA転送するデータにはチャンクのサイズとチャンクの開始アドレスを設定する。
特定の境界にアラインされた領域をヒープ上に確保するには、CBE SDKで提供されているmalloc_align.hに含まれる_malloc_align()関数を利用する。確保したメモリは、free_align.hに含まれる_free_align()で開放する必要があることに注意する。
array_size = 2 << 20;
data = (int*)_malloc_align(array_size * sizeof(int), 7);
for(i=0;i<array_size;i++) data[i] = i;
配列をSPUで処理する際のアドレスやチャンクのサイズといった制御情報を持つ構造体を次のように定義する。padを入れて128byteのサイズで定義することでDMA転送を最適化する。
typedef struct _control_block {
unsigned int chunk_size;
unsigned int addrSB;
unsigned int addrDB;
unsigned char pad[116];
} control_block;
1つのDMA転送に渡すcontrol_block構造体は二つのチャンクへのアドレスを持つ。それぞれシングルバッファリングとダブルバッファリングを使用して処理するためのチャンクへの開始アドレスを設定する。1つのSPUで2つのチャンクを処理するので、元の配列を1/16したサイズをチャンクのサイズとする。
control_block cb[8] __attribute__ ((aligned(128)));
/** 省略 **/
chunk_size = array_size >> 4;
for(i=0;i<8;i++) {
cb[i].chunk_size = chunk_size * sizeof(int);
cb[i].addrSB = (unsigned int) &data[chunk_size * (2*i+0)];
cb[i].addrDB = (unsigned int) &data[chunk_size * (2*i+1)];
}
SPE側では、「データをインクリメントする関数」「シングルバッファリングでデータを読み込みデータをインクリメントする関数」「ダブルバッファリングを使用してデータを読み込みデータをインクリメントする関数」の3つを定義する。
DMA転送では1度の最大転送サイズが16KBとなっているため、バッファの大きさは16KB=4096byteの2倍のバッファを用意する。DMA転送のデータが格納されるため、128byteアラインする。
control_block cb __attribute__((aligned(128)));
/* DMA data buffer */
int dma_data_buffer[8192] __attribute__((aligned(128)));
int *data[2];
int *data[2]の二つのポインタは、dma_data_buffer変数で確保した領域をダブルバッファリングで使用するため二つにわけそれぞれの先頭アドレスへの参照を持つ。
data[0] = &dma_data_buffer[0];
data[1] = &dma_data_buffer[4096];
SIMD演算を使用してデータをインクリメントする関数の定義。
/* SIMD演算でデータをインクリメント */
void inc_data_SIMD(int *dest, unsigned int asize) {
int i;
vector unsigned int *vdest;
vector unsigned int vinc = (vector unsigned int) {1,1,1,1};
vdest = (vector unsigned int *) dest;
for(i=0;i<(int)asize/16;i++) vdest[i] = spu_add(vdest[i], vinc);
}
シングルバッファリングとダブルバッファリングを利用してデータを読み込む関数を比較する。
loopcountにはチャンクサイズを1度のDMA転送の最大サイズ16KBで割った値が格納されているものとする。
次の関数ではシングルバッファを利用し引数で渡された実効アドレスのデータを読み込み、バッファに格納する。タグ値として20を指定する。mfc_write_tag_maskで20bit目にマスクをあてDMA転送が完了するまで、mfc_read_tag_status_all()でプロセッサが停止する。その後データをインクリメントし、mfc_putマクロを使用してデータをLSからメインメモリに転送する。
このようにシングルバッファリングではデータ転送とデータの計算処理が逐次的に行われるため効率が悪い。
void single_buffer_example(unsigned int addr) {
int i;
for(i=0;i<loopcount;i++) {
mfc_get(data[0], addr+16384*i, 16384, 20, 0, 0); // 16KB
mfc_write_tag_mask(1 << 20);
mfc_read_tag_status_all();
inc_data_SIMD(data[0], 16384);
mfc_put(data[0], addr+16384*i, 16384, 20, 0, 0);
mfc_write_tag_mask(1 << 20);
mfc_read_tag_status_all();
}
}
ダブルバッファリングを利用したDMA転送では、転送とデータの計算処理が並行して行われる。
ダブルバッファリングを利用したDMA転送は、初めの読み込み・ループによる繰り返し読み込み・最後に転送されたデータの処理の3部から構成される。
void double_buffer_example(unsigned int addr) {
int i;
mfc_get(data[0], addr, 16384, 20, 0, 0); // 16KB
for(i=1;i<loopcount;i++) {
mfc_write_tag_mask(1<<(20+(i&1)));
mfc_read_tag_status_all();
mfc_get(data[i&1], addr+16384*i, 16384, 20+(i&1), 0, 0);
mfc_write_tag_mask(1<<21-(i&1));
mfc_read_tag_status_all();
inc_data_SIMD(data[(i-1)&1], 16384);
mfc_put(data[(i-1)&1], addr+16384 * (i-1), 16384, 21-(i&1), 0, 0);
}
mfc_write_tag_mask(1<<21);
mfc_read_tag_status_all();
inc_data_SIMD(data[1], 16384);
mfc_put(data[1], addr+16384*(loopcount-1), 16384, 21, 0, 0);
mfc_write_tag_mask(1<<20 || 1<<21);
mfc_read_tag_status_all();
}
次の関数では、ループ処理に入る前にDMA転送でメインメモリからLS上のdata[0]にデータをタグの値に20をつけて転送する。ループ一回目の動作は次のようになる。
mfc_write_tag_mask(21)が実行されるため、mfc_read_tag_status_all()でプロセッサがDMA転送が完了するまで待つことは無い。DMA転送ニ使用しているバッファとは違うもう1つのバッファdata[i&1]=>data[1]に並行してデータをシステムメモリから読み込む。このときタグの値として20とは違う値(21)を指定する。
mfc_get(data[0], addr, 16384, 20, 0, 0); // 16KB
for(i=1;i<loopcount;i++) {
mfc_write_tag_mask(1<<(20+(i&1)));
mfc_read_tag_status_all();
mfc_get(data[i&1], addr+16384*i, 16384, 20+(i&1), 0, 0);
mfc_write_tag_mask(1<<20);で20ビット目にマスクを指定してmfc_read_tag_status_all();を実行することで、ループ処理の前に開始したDMA転送が完了するまで待つ。(その間もタグに21を指定したDMA転送が並行して動作している) 読み込まれたdata[0]から始まる値をインクリメントする。
mfc_get(data[i&1], addr+16384*i, 16384, 20+(i&1), 0, 0);
mfc_write_tag_mask(1<<21-(i&1));
mfc_read_tag_status_all();
inc_data_SIMD(data[(i-1)&1], 16384);
mfc_put(data[(i-1)&1], addr+16384 * (i-1), 16384, 21-(i&1), 0, 0);
}
loopcountの値は常に偶数になることに注意する。
ループ処理が完了した後に、mfc_get(data[i&1], addr+16384*i, 16384, 20+(i&amp;amp;1), 0, 0);の転送処理が完了するまで待つ。ループの最後の繰り返しで実行されるmfc_put(data[(i-1)&1], addr+16384 * (i-1), 16384, 21-(i&amp;amp;1), 0, 0);は常にdata[0]が指すバッファに対しての処理となるため、data[1]のバッファも同様にLSからメインメモリにDMA転送する。
そして、最後にmfc_write_tag_mask(1<<20)で全てのDMA転送が完了するまで待つためのマスクを指定する。
}
mfc_write_tag_mask(1<<21);
mfc_read_tag_status_all();
inc_data_SIMD(data[1], 16384);
mfc_put(data[1], addr+16384*(loopcount-1), 16384, 21, 0, 0);
mfc_write_tag_mask(1<<20 || 1<<21);
mfc_read_tag_status_all();
}
今回は、DMA転送関連のプログラミングTipsとしてダブルバッファリングを調べた。ダブルバッファリングを拡張したマルチバッファリング・共有I/Oバッファというテクニックもあるようだ。これについては次回。
参考
Cell Broadband Engine Programming Handbook Version 1.0 [PDF] (10MB近くあります)
Thursday, December 07, 2006
ジャムセッションの精神 - サービスを越える瞬間より
すばらしい。
今日届いたサービスを越える瞬間を読み終えた。本当に感動した。この一冊は「おもてなし=ホスピタリティとは何か」を心に刻む一冊として何度も繰り返し読むことになりそう。
ホテルのスタッフ一人一人には、常にその場でできる最高のアドリブの判断が求められる。それがリッツカールトンで「ストーリー・オブ・エクセレンス」として語り継がれる「心のためのチキンスープ」(心温まる話)となっている。スタッフが奏でるジャムセッションを支えるために、エンパワーメントやクルドがあり、それを支える人材採用・感性の共有といった内容にいたるまで盛りだくさんの内容となっている。
発想する会社やイノベーションの達人から垣間見えるIDEOの企業哲学にも感動したが、根にあるのはリッツカールトンの企業哲学でも同じであるように思えた。つまり「サービスを越える瞬間」に書かれている内容は、ホテル業界に限った話などではなく全ての企業や組織でもっと真剣に考えることで変わる部分な気がする。
IDEOではチャレンジを重要視する。リッツカールトンでも2000千ドル/日与えられるエンパワーメントをどのように使おうか常にアイデアをめぐらす。日常から考えて行動する場を提供し、フィードバックを得ることで次の成長につなげる機会をたくさん与えられるといったところはどちらにも共通している。
根にあるのは、「ゲストに感動を与えたい」・「使ってもらう人にすばらしい経験を届けたい」といったインスピレーションでありそれを全社員が共有しその感性を心から共有して仕事をすることでPRIDE&JOY(誇りと喜び)を感じている。みんなそれが楽しくてたまらない。全員が「感性を心から共有していること」には驚いた。自分が知らない世界から学べることは多い。
本中の一章にこんな言葉があった。
"目指す"年収の5%を自分に投資するぐらいでなくてはだめだ。
本業に時間もお金を投資するのは普通だが、センスやアイデアを磨くための自己投資としてもこの5%を(全く違ったことに)割くように心に留めておきたい。
Wiiリモコン+マイク
WiinRemoteというソフトが公開されている。
カラオケのマイクにWiiリモコンのようなセンサつけて、振り付けつきで採点してくれるとかって面白いような。振り付け付きのムービーはあるけど採点とかもあったりするのかな。
あと、あの退屈な映像は何がいいんだろう?採点ではなくて自分がステージ上でライブしているような映像でアバターが自分のマイクパフォーマンスの通り動くとかのほうが面白いよな。でもそうなると、マイクパフォーマンスに応じてお客の歓声も変化し、点数も変化したら面白いと思うけどなぁ。(カラオケか・・・。脱音痴。)
あと、ジムにもおいて欲しい。
Wednesday, December 06, 2006
社外の知識にアクセスする環境はどうやれば作れるか?
「イノベーションを行わない企業は死ぬ」
という本中の言葉を見たときに、中島さんがビルゲイツと大喧嘩したと書かれていた話をなぜか思い出した。イノベーションには大きなリスクを伴うがそれをしないと結果として死ぬことにつながる。という何とも厄介なもの。
イノベーションの実践方法についてのパラダイムシフトについて述べた本「OPEN INNOVATION - ハーバード流イノベーション戦略のすべて」では、ZeroxやIBM/インテルといった企業の取り組みが事例とともに紹介されている。研究開発から使用に関する権利まで全て自社内にとどめて独占するのがクローズイノベーションであり、このモデルは知識があらゆるところに普及した現在では成功しないという。「テクノロジーはそれ自体で価値を持つことは稀であり有効なビジネスモデルにつなげて初めて競争優位性となる」という表現が印象に残った。
2年ほど前に進路について考えていたときに、MOT(技術経営)に興味を惹かれたけどMOTではこの本に書かれているようなことを詳しく習うのかな。
大学の研究室での面白い研究成果や知識にアクセスしやすい環境を社内に用意する。研究室に投資をして教授や学生と自社の研究員の交流を増やすというのはインテルのアプローチだけど、大規模な投資を出来ない小さいところではどうするのがいいだろう。少し前に光学迷彩や透明マントが話題になって「これすごいな!」って盛り上がった(で、盛り上がっただけで終わった。)けど、面白い研究や新しい研究を自社の技術とつなげることを推奨するのがいいかも。
面白い研究(分野は様々)をチェックするようにする。
研究者を社内に招くようにしてブレスト。
研究室に突撃して話を聞いてブレスト。
お金を出して定期的に実際会う。
答えになってないな。
全く知らなかった技術へのアクセス手段を用意し、一人一人が"よく"考えることは重要だな思った。