発売前から気になってはいたんだけど、ついうっかりポチってしまった Camangi WebStation が届いた。オレが注文したのは、CJKオンラインショップ。Camangi の公式サイトに名前が掲載されているので、怪しいところではないとは思うんだけど、オーダーフォームが SSL に対応していなかったり、こちらが出した発送に関する質問を丸2日間放置してくれたりと、良いイメージは感じられない。今は Amazon.co.jp でも注文できるようになってるので、もし間違って買うならば Amazon.co.jp の方が良いと思うよ。

届いたところで少し触ってみたんだけど、電源を入れるといきなり日本語のメニューが出てきた。最初は英語表示で「言語設定を変えると日本語も表示可能」という流れだと思っていたので拍子抜け。この辺は、出荷時に日本向けを意識してるんだね。そういえば、日本語入力の Simeji がプリインストールされているってのも同じことか。
ま、その辺は良いんだけどね。。。触っているうちにいろいろと考えちゃうところが出てきている。ファーストインプレッションの感想をヒトコトで言うと「iPhoneって、すげーよくできてる」というものになっちゃうんだよね。
Camangi WebStation を購入する前に参考にしたのが、YouTube に上がっていた「Google Android OS runs on 7-inch Camangi WebStation」という動画。「アバター」の予告編を流しているところで「Smoothly, No delay」とか言ってる割にカクカクじゃん!と心の中でツッコミを入れつつも、どうせこのデバイスで動画を見るつもりはないので、それは許す!と思っていた。
ムービーの再生以外のところでは、Skype の起動も見えるし、ごく一般的な Android 端末なんだろうなという印象を持っていたのだが、届いた WebStation を触ってみると、だいぶ印象が違う。
おそらく、先の動画はかなり初期段階のコンセプト端末だったのだろう。製品版としては「単に Android を載せた端末」ではなく、Web ブラウジングやフォトフレーム、ミュージックプレーヤ、電子書籍リーダ等の「Camangi が考える用途」にこだわった端末になっている様子が伺える。ちなみに Skype は搭載されていない。
「Android 端末」として販売していると思っていたので、Android Market からいろいろなアプリケーションがインストールできると思っていたのだけれど、それも無し。インストール可能なのは、基本的には Camangi が独自に展開している Camangi Market に登録されているアプリのみ。
Camangi Market への登録アプリが豊富ならそれでも良いんだけど、2/5 現在で 700 アプリ程度。そこには Skype もないし、Evernote もない。
Android が本来持ち合わせているアプリ配布の自由さは無く、Apple が iPhone でやっているような「メーカーによりコントロールされたアプリ配布」を目指しているのが WebStation と Camangi Market なのだろうと思う。
そろそろプントのバッテリがヤバい気がする!と思って、充電のために(?)富士山へ行ってきた。ちなみに、エンジンの始動時にセルモータが止まりそうで、かなりヤバかった。。。
今回は山中湖周辺で富士山を見て来たんだけど、「山中湖交流プラザ きらら」で堪能してたら、15時30分くらいから、やけに人が増えてきた。
なんでだろ?と思って、そういえば!とネットで検索したら、ダイヤモンド富士が見られるタイミングだということが分かった。
そういうことならば!と、日没のタイミングまで待って撮ってみたよ。

ベストスポットと思われる場所には、すでに人がいっぱいだったので、ちょっと外れた場所で撮影してたら、日没の場所もズレてしまった。これではダイヤモンド富士もどきだね。
いずれ再挑戦しよう。
tDiary 2.2.2 およびそれ以前のバージョンにクロスサイトスクリプティング(XSS)脆弱性が発見されたため、tDiary 2.2.3 がリリースされました。
これに伴ない、第三tDiary.Netで稼働している tDiary も 2.2.3 へバージョンアップしました。特に動作に影響はないと思いますが、何かあればこの日記にツッコミをお願いします。
なお、脆弱性についての詳細は、tDiary開発プロジェクトによる下記の記事を参照してください。
ひさびさに CakePHP を触っているんだけど、自作 Component の中から CookieComponent を呼んだときに、ちょっとハマってたので記してみる。
Cookie Component の基本的な使い方はこんな感じ。
<?php
class SamplesController extends AppController
{
var $name = 'Samples';
var $uses = array();
var $components = array('Cookie');
function beforeFilter()
{
$this->Cookie->name = 'samplecookie';
$this->Cookie->time = 3600;
}
function test()
{
$this->Cookie->write('hoge', 'fuga', FALSE);
}
}
?>
これで /samples/test へアクセスしたときに発行される Cookie はこのようになる。
Set-Cookie: samplecookie[hoge]=fuga; expires=Thu, 25-Feb-2010 15:25:58 GMT; path=/
$this->Cookie->name で設定した samplecookie が Cookie 名に入っており、$this->Cookie->time で設定した値を元に expires の日時が入っているのが分かる。
次に自作の Component の中から Cookie コンポーネントを呼び出して、使ってみる。Controller では、自作 Component だけを呼び出すようにしている。
<?php
class SamplesController extends AppController
{
var $name = 'Samples';
var $uses = array();
var $components = array('Original');
function test()
{
$this->Original->func1();
}
}
?>
Component の中からは、別の Component を呼び出す場合、Controller と同じように $components へ指定してやれば良いことになっているので、自作の Component からは、このように Cookie Component を呼び出した。
また、Component には beforeFilter() が無いので、initialize() に Cookie Component の設定を書いてみた。
<?php
class OriginalComponent extends Object
{
var $components = array('Cookie');
function initialize(&$controller)
{
$this->Cookie->name = 'samplecookie';
$this->Cookie->time = 3600;
}
function func1()
{
$this->Cookie->write('hoge','fuga',FALSE);
}
}
?>
このコードで発行された Cookie は、最初のコードと同じように Cookie 名と expires がセットされることを期待していたのだが、実際に吐き出された Cookie には expires が付いていなかった。
Set-Cookie: samplecookie[hoge]=fuga; path=/
なんで?なんで?なんで?としばらく悩んでいたのだが、Cookie Component の中身を見て、ようやく分かった。
$this->Cookie->time で設定した値は、Cookie Component 内の startup() でのみ利用されており、また、startup() は Controller から呼ばれた場合に実行される処理らしい*1ので、上記のように initialize() などで time をセットしても、この値は利用されないのであった。
じゃあ、どうすれば良いのか?であるが、$this->Cookie->write() の第4引数に expires 設定を書いてやれば、やりたいことはできる。
<?php
class OriginalComponent extends Object
{
var $components = array('Cookie');
function initialize(&$controller)
{
$this->Cookie->name = 'samplecookie';
}
function func1()
{
$this->Cookie->write('hoge','fuga',FALSE, 3600);
}
}
?>
このコードを実行すると expires 付きの Cookie を発行してくれる。
Set-Cookie: samplecookie[hoge]=fuga; expires=Thu, 25-Feb-2010 15:54:42 GMT; path=/
$this->Cookie->name も利用されないなら、割と早く気がついたかも知れないんだけど、$this->Cookie->time だけが利用されない状態だったので、意外とハマって、悩んでしまったよ。
*1 コードは未確認。実行状況で確認した。
Barns & Noble の eBook 端末「nook」を手に入れた。まだ、日本向けには販売していないので、「黒船GADGET 」から購入。メールでやりとりさせて頂いて、メニューにはない商品も取り扱ってもらった。

こちらがそのメニューに無かった nook 用のカバー「Waxwear Cover in Chocolate」。ケースだと取り出すのが面倒くさいかな?と思って、読みたいときにパッと開くカバーの方が良いかな?というのと、布製の質感が欲しかったので、なかなか気に入っている。


モノとしての nook は、かなり満足。噂には聞いていたけど、E Ink の表示は、かなり綺麗。描画の遅さは確かにあるんだけど、文字を読む行為が苦にならない。目にも優しそう。
サイズも B6 のビジネス書と同じくらいなので、カバンの中に入れっぱなしにしても問題なさそう。バッテリの持ちがスペック通りなら、入れっぱなし方式でも大丈夫そうだし、これは本気で読書端末として使えそうな気がする。
読書をする時間をうまく確保しなきゃ。
「Ustream しながら東京マラソンを走っているランナーがいる」という情報が Twitter に流れてたので、軽い気持ちで見てたら、だんだん引き込まれてしまい、彼がゴールするまで見続けてしまった。

Twitter で流れていた情報によると、Ustream 用と通話用に iPhone を1台ずつ、それからリアルタイムに GPS 情報を垂れ流せる Glympse というサービスで、自身の走っている場所を公開するためにもう1台の iPhone、その他、合計で5台の iPhone を使っていたという話(真偽は不明)だった。
単に映像のダダ漏れというわけではなく、いろいろと話しながら走っていたのがすごいところ。更に、走りながら Twitter のタイムラインを確認したり、自分でも Tweet したりと観ていて全く飽きなかった。
飽きなかったと言うか、沿道からの応援もクリアに聞こえて、なんだか観ているこちらまで応援されている気になったし、Joseph の苦しそうな姿が見えると、思わず「がんばれー」と Tweet しちゃうし、もの凄い体験をさせてもらったと思う。
この企画のまとめページが Tokyo Marathon 2010 / A groundbreaking citizen broadcast にある。録画された Ust もここから観れるので、気になった人はちょっとチェックしてみると面白いと思う。
nook の内蔵メモリは 2GB で、スペック表によれば約1500個の eBook が格納できるとのことだ。ただ、まぁ、増設できる余地があるなら増設したい。「そこにスロットがあるからだ」という気持ちは誰もが持っているでしょ?
nook の microSD スロットは、裏蓋を外したところにある。裏蓋の外し方は「[nook Q&A] microSDの挿入方法」に詳しいので、そちらを参照すべし。

スロットとご対面できたのは良いんだけど、ハテ?これはどうやって挿し込むのだ?と思ったら、なんと上側へ開ける形式であった。こんな microSD スロットなんて初めて見た。

オープンした金具を閉じて裏蓋を取り付け直せば増設終了。めでたしめでたし。
nook を USB ケーブルで Mac へ接続すると、こんな感じでマウントされる。「nook」が内蔵メモリで、「NOOK 2ND」は増設した microSD のこと。
「nook」には最初からフォルダが気られている。それぞれの用途は名前を見れば想像がつく。

自分でスキャンした PDF や他から持ってきた ePub ファイルなどは、「my documents」に保存すれば良い。ただ、「my documents」の下にフォルダを作って、そこにファイルを突っ込んだ場合には認識してくれなかった(気がする)。

それから、「hoge.pdf」と「hoge.epub」のように拡張子だけ違うファイル名が同時に存在していると、タイトル一覧にうまく読み込めないようだ。
同じコンテンツを PDF と ePub で見たときに、どんな違いがあるか試そうとしてうまくいかなかった。