l'essentiel est invisible pour les yeux

Tuesday, January 30, 2007

Write Great Code Vol.2

先週Write Great Code Vol.2を買った。現在半分ぐらい読み進めたがこれがかなり面白い。
内容は教科書的に奥深くもありつつ、実践的で分かりやすいレベルでもあるのでさくさくと読み進めることが出来る。今読んでいるところは、静的変数・自動変数・定数といったあたり。それぞれ内部でどのように表現され、どれぐらいのコストが必要かということ。そして、欠点・利点が詳しく書かれている。

昨年秋ごろから、VHLLでのプログラミング機会ばかりでプログラムが実行される仕組みなどは自分の中で全てブラックボックスであることに危機感を覚えた。豊かさが人間の勉学への熱意の平均値を下げるという調査結果があるかはわからないが、コンピュータの抽象化がミドルクラスのプログラマを怠慢にさせるかもしれない。(これはあくまでプログラマ全体の平均値の話。トップクラスはやはり凄い。)

Cellプログラミングでは、アセンブリと1対1で対応した組み込み命令をC言語上から実行することも多い。SPU上のプログラムでは256KBバイトの制限があるため、メモリの管理をプログラマが意識しなければならない。PPUプログラムでは、PowerPCのアセンブリを読み解く力が必要になる。CellプログラミングをするにもWrite Great Codeは、とってもステキな一冊です。

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 1111111111\n\n"
>> {:te => BigDecimal.new("0.123456789123456789")}.to_xml
=> "\n\n 0.123456789123456789\n\n"
>>


activesupport-1.4.0

% ./script/console
>> {:te => 1111111111}.to_xml
=> "\n\n 1111111111\n\n"
>> {:te => BigDecimal.new("0.123456789123456789")}.to_xml
=> "\n\n 0.123456789123456789\n\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を採用した理由
など細かい事はたくさん気になるのだが、そんなことは全て差し置いても欲しい。Asiaでの発売は2008年の予定。

新たなライフスタイルを提供する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つだけ扱う場合は次の順序で実行する。

  1. SPEコンテキストの作成
  2. SPEのローカルストアにSPEに実行させるプログラムをロードする
  3. SPEコンテキストを実行する
  4. 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の言ってることがわかった的なことを言われた。だけど、ずっと日本に篭っていた私は一体・・・。