月別アーカイブ: 2009年5月

メビウス PC-NJ70A 液晶センサータッチパッド

●タッチパッドのところに iPhone が埋まってるやつ

iPhone / iPod touch を使っていると、マウス代わりにこれでそのまま PC操作
できたらいいんじゃないかな、と思うことがあります。
タッチパッドの感触はなめらかでレスポンスも速いし、マルチタッチもわかりやすく、
スクロールなどの操作も心地よく動いてくれるからです。
(実際に iPhone をタッチパッド代わりにできるアプリもあるようです)

本当にそれを実現しようとしたのかどうかわかりませんが、
SHARP メビウス PC-NJ70A の見た目はまさにそれ。
センサーの仕組みはともかくマルチタッチ対応のパッドに液晶画面もついていて
独自のアプリも動くという。なんか埋まってます。

そのメビウスがようやく手元に届いたので使ってみました。

現実はそう甘くはないようです。

●光センサー液晶パッドのモード

・マウス操作モード
・タッチ操作モード

●マウスモード

mebius pc-nj70a

通常はマウスモードで、ノートパソコンの一般的なタッチパッドとして機能します。
特徴的なのは以下の点

・表面がつるつる
・パームレストと一体型
・サイズ大きい、幅が広い
・ボタンが 3つあるけど 2ボタンマウス相当
・マルチタッチ
・多少のビジュアルエフェクトがある

つるつるなのはおそらく光学式センサーの光を通す必要があるため。
光が透過しさえすれば透明な素材で全体を覆ってしまっても構わないのでしょう。

ボタンは残念なことに 2ボタンでした。
VAIO type P は中ボタンがついていて 3ボタン。
液晶パッドの真ん中のボタンは「マウス操作」と「タッチ操作」の切り替えです。

マルチタッチの活用として二本指スクロールがあります。
EeePC 901 等と同じです。

液晶パッドの画面には、タッチ位置に遅れてついてくる光のカーソル演出があります。
この辺は設定で変更できるようです。

●タッチ操作モード

mebius pc-nj70a

真ん中ボタンでタッチ操作モードに切り替えると、液晶パッドにメニューが出てきます。

ここでタッチを活用した独自のアプリケーションを走らせることが出来るようです。
マウスカーソルを使うウィンドウズアプリと違って、こちらは直接触って操作
できるのが特徴。

しかも光学センサー液晶パッドは他の方式と違い

・マルチタッチ対応 (何点でも?)
・静電容量式のように指が触れただけで反応する
・ペン操作もできる

等と利点も多数あります。
しかしながら画面の呼び出しや表示切り替えは決して速いとはいえず
なめらかなアニメーション演出も期待できません。

例えば電子ブックリーダーでは本のタイトル一覧が表示されるのに、タッチ操作では
上下にスクロールできません。マウスの左右ボタンで上下のページ切り替えだと
気がつくのに若干時間を要しました。(一応二本指スクロールは出来るけど描画が
ついてこない)

アプリケーションの作り込みの甘さや描画速度の遅さ、反応の悪さなど、可能性の
あるセンサーやデバイスをまだまだ使いこなせていないようにみえます。

サブ画面用に描画アクセラレータが乗っていないのか、メインメモリからの描画
転送がボトルネックなのかはまだわかりません。

センサー自体は大変ユニークで、例えば「エンターテイメント」に入っている
ピアノのアプリはマルチタッチを実感できます。
とりあえず指 4本のタッチ座標が取れているのは確認できました。

HP TouchSmart PC IQ800 のマルチタッチは 2点までだったので、今後 SDK が公開
されたり Windows7 用ドライバが出てくれば、さまざまな活用が考えられます。
今後に期待ですが、「iPhone / iPod touch が埋まっている」の域まで達するには
まだまだかかりそうです。

なおタッチ操作モードではマウスカーソルが動かないので PC の操作ができません。
外付けのマウスをつないでおけばタッチモードでも普通に使えました。

●まとめ

ネットブックなど多くのノートパソコンがあふれる中で、普通じゃない機能を持った
PC であることは確かです。
実用性よりもまずはこの点をおもしろいと思えるかどうかが評価の境目となるでしょう。
これからしばらく実際に持ち歩いて使いつつ、まずは普通の PC としてセットアップ
してみます。

関連エントリ
メビウス PC-NJ70A 画面解像度とタッチ
Windows7 とマルチタッチ / HP TouchSmart PC IQ800

TANITA カロリズム AM-120

久しぶりの歩数計関連です。
やっぱり買ってしまいました。カロリズム

TANITA カロリズム CALORISM

ここ最近加速度センサーの普及によって歩数計がちょっとしたブームです。
例えば一般的に

(1) つける場所を選ばない

 2D または 3D の加速度センサーによって向きの制限が無くなりました。
 腰にクリップで留めなくてもいいんです。
 胸ポケットでも鞄の中でも OK

(2) 時計内蔵で自動記録

 毎日 0時に自動でカウンタをリセット。
 1~2週間分の記録が残るので、面倒な操作なしに毎日の歩数がわかります。

(3) その他

 消費カロリー表示、歩いた総時間の表示、歩数を入れておくと距離の算出、
 などはたいてい基本機能としてついてます。

新製品の出るペースが速いし種類も多いし機能も豊富でつい気になってしまいます。
ただ安価なものだと加速センサーではなく振り子スイッチ式のものがある点に注意。
振り子式のシンプルなものの方が良い場合もありますが、気楽に使えるのは
加速度センサータイプの方です。

●ハドソン てくてくエンジェル

他にもゲーム風の機能がついているものも多数あります。
特に以前紹介した「てくてくエンジェル」は機能的に侮れません。

てくてくエンジェル DS日記 まじめレビュー

例えば
・120日間のログ保存
・乗り物に乗っている間の誤計測を遮断するスリープ機能
・毎日の記録とは別に測れる、区間計測機能
・リセット時間を変更できる昼夜のシフト機能

など、他の歩数計についていないのが不思議なくらい作り込んであります。
残念ながら欠点もあって、数日使わないでいるとえんじぇるが逃げてしまい
ゲーム&計測が終わってしまうこと。
ただのツールじゃないのであたりまえですが使ってるとよく遭遇します。
あとは省電力のためボタンを押すまで液晶画面が消えていることでしょうか。
未使用だとバッテリーは結構持ちます。

●コナミ e-walkeylife 2

その後使っていたのはコナミの歩数計 e-walkeylife2 (健身計画2)

e-walkeylife 2

こちらは加速センサータイプながら腰への取り付け推奨です。
しっかりしたクリップやストラップなどがついており、気楽に鞄に入れたりとかは
できません。
特徴は USB コネクタ内蔵で、PC や TV 用の健身計画2があればデータを
転送できるというもの。別売りなので結局使いませんでした。

もう一つの特徴は歩きと走りを区別してカウントできることです。
それぞれ別カウントし、かつ消費カロリーなども別計算です。
走っても良い歩数計って実はあまりないんです。
たいていは歩行のみ計測で走行時は誤計測する可能性があります。
または本気で走るなら Nike+ とかジョギング用。

●TANITA カロリズム AM-120

そして

TANITA カロリズム

最近出たカロリズムはもはや単なる歩数計ではなく「活動量計」を名乗っています。
まず取り付ける場所が違います。
腰じゃないと計測できなかった昔の万歩計とは完全に別物。
「上半身につけてください」だそうです。

なぜなら

(1) 上半身も含めた動きを検知して、歩行以外の運動も測定
  歩かなくても 1日の総消費カロリーがわかる

(2) 1時間毎の活動量を記録。
  1日単位ではないので、何時頃激しく動いたのかよくわかる。

1時間単位の運動量はわかりやすいグラフ表示です。PRO TREK の気圧計みたいな。
ちゃんと 24個メモリがあるので夜型でも昼夜逆転でも大丈夫。

時間単位の詳細なグラフが残るのは一週間分。
さらに週単位で 7日分の活動量をグラフで一覧可能です。これは 12週間遡れます。

歩行計測の枠を飛び出そうとしています。
少々値段が高めですが、出勤時間、外出時間などが一目でわかるグラフは非常に
おもしろいし、、少々怖くもあります。

その他歩数計としての基本機能は押さえています。

初期設定時に体脂肪率を入れないといけないのが少々変わってるところでしょうか。
そのおかげか基礎代謝表示があるので、基礎代謝+消費カロリーがわかるのは
ユニークです。何カロリーまで食べても大丈夫、という目安になりますね。

本体はスリムなスティック型ですが、表示も大きく見やすいものです。
CR2032 x2 個使う代わりに電池寿命は 9ヶ月と比較的長め。
長時間センサーが反応しない状態になると液晶を消してスリープ状態になるようです。
賢いのは振動を検知して自動で起動すること。
ボタンを押す必要はありません。

本来非常に高機能なはずなのに、どうにかしてシンプルかつ単純にまとめようと
苦労したあとが見えます。
それゆえ時間グラフと総活動量表示以外は比較的普通なのです。
歩数、消費カロリー、時刻、距離&時間、エクササイズ単位やメッツなど。

モード切替は表示の切り替えだけ。
6画面あるけど表示の違いが少なくて慣れるまでちょっと見分けづらい。
メモリボタンで記録を遡れますが、1ボタンしかないので一周するまで戻れません。
当日の画面に戻らないと「週ログ←→日ログ」の切り替えが出来ないのも不便です。
週ログで間違ってメモリボタンを押してしまうと特に。

無理してボタン数を減らすよりも、てくてくエンジェルみたいに
 カーソル+決定
とかメニュー式の方がずっとわかりやすい気がします。

リセット時間の変更が無いので、夜型かつ1日単位できっちり歩数を計測したい人は
時計をずらしておく必要があります。でも従来の歩数計と違って時間単位のグラフが
あるので、そこまでこだわらなくても十分楽しめます。

やっぱりというか区間計測機能は無いです。
カウンタの強制リセットはありますがその日の記録も消えます。

時計は時刻のみでカレンダー無し。

マニアックに見てくと、可能な操作も少なく表示画面数も少なく少々物足りない
ところがあります。

でも一目ですぐわかる時間毎のグラフはやっぱり楽しいし、その日の行動を
思い出すにも役立ちます。
Nike+ の記録はもっと詳細ですが、PC に接続しないと見れないし常時測定している
わけじゃないのでなあまり手軽とはいえませんでした。

1日あたりの歩数を増やしていこうとか、ノルマを守ろうとか、目的を達成しようとか
そういう従来の歩数計のモチベーションとは少々質が違います。
自分の毎日の行動が記録に残ってること。
それだけで興味があるし、総活動量なので歩数だけを気にしなくても良いわけです。
身につけていてもプレッシャーがずっと少ないのです。

でも…仕事してるのに、座ってずっとキーボードをたたいていてもマウスをクリック
していても、さっぱり活動量は増えません。
キータイプを消費カロリーに変換するアルゴリズムが必要です!

関連エントリ
てくてくエンジェル DS日記 まじめレビュー

WindowsMobile Touch Pro E30HT と 3D

HTC E30HT の 3D caps 情報を提供していただきました。
nekomantle さんありがとうございました。

Direct3D Mobile DeviceCaps 一覧

E30HT は 3D アクセラレータに対応していないようです。
スペックを調べてみると、同じ Touch Pro でも HT-01A/X05HT とは相違点が目立ちます。

HTC Touch Pro E30HT
HTC Touch Pro HT-01A
HTC Touch Pro X05HT

通信方式の違いから使用しているチップが異なっており、
搭載されている 3D 機能も互換性がないのかもしれません。

モバイルライフ応援日記 伊藤浩一 au初のスマートフォン「E30HT」開封レビュー(第104回)
 >図12 起動画面。ユーザーインタフェースには「Touch FLO 3D」ではなく
 >「Touch FLO」が搭載されています

上の記事によると Touch FLO 3D ではなく Touch FLO に変更されているとのこと。
この辺も関係がありそうです。

なお Qualcomm MSM7500 自体は 3D アクセラレータを持っています。

西川善司の3Dゲームファンのための「東京ゲームショウ2007」グラフィックス講座

問題なのは、同じ Touch Diamond や Touch Pro 系、また同じ機種名でも互換性が
ないということです。
以前作成した d3dmclock も Touch Diamond / Touch Pro 系で動作すると書きましたが、
このデータを見る限り一概には言えなくなりました。
きちんと 3D を扱えるデバイスが少ないとか バグ とか、
WindowsMobile で 3D は何かとたいへんです。

関連エントリ
HTC Touch Diamond で Direct3DMobile その(10) d3dmclock v1.10 3Dクロック 更新
HTC Touch Diamond で Direct3DMobile その(9) d3dmclock v1.00 3D クロック

VisualStudio 2010 beta lambda 式

VisualC++ 2010 beta ではラムダ式が使えます。
無名の関数を inline で宣言することが可能で、関数オブジェクトのように
取り扱いできます。

Download Visual Studio 2010 Beta
Examples of Lambda Expressions

変数で受け取る場合は auto や template を使った汎用の入れ物が必要です。

auto f0= []( int x, int y ){ return x * y; };
std::tr1::function f1= f0;

lambda 式は無名の型宣言に相当するので、同等の型を明示的に宣言することが
できません。
名前をつけるだけなら下記の定義は出来ますが、これも f0 が有効な範囲のみです。

typedef decltype(f0) lambda_type2;
lambda_type2 f2= f0;

全く中身が同じ lambda 式を定義しても別の型と見なされるようです。

auto	f2= []( int a, int b ){ return	a * b; };
auto	f3= []( int a, int b ){ return	a * b; };
decltype(f2)*	fp2= &f3;  // error

上記の例はエラーです。
そのため定義内容を知らない外部から直接参照する手段がありません。

実際に使ってみると単純な関数ポインタでは無いことがわかります。

・lambda 式に応じて無名のクロージャー用クラスが定義される
・メンバとしてキャプチャした変数のコピーまたは参照が格納される
・クロージャークラスのメンバ関数として呼び出される。

確認してみます。

int v= 0;
auto  f4= []( int a, int b ){ return  a * b; };
auto  f5= [&]( int a, int b ){ return  a * b + v; };
auto  f6= [=]( int a, int b ){ return  a * b + v; };

sizeof(f4) == 1
sizeof(f5) == 8 // x64
sizeof(f6) == 4

sizeof(f4) が 1 なのは実質的にサイズが無いことを意味しています。
sizeof(f5) と sizeof(f6) はどちらも v を参照していますが、たまたま x64 で
コンパイルしていたので異なるサイズになりました。
ポインタ(参照)である証拠で x86 だと 4 になります。

auto	f4= []( int a, int b ){ return a * b; };
f4.operator()( 2, 10 );

operator() の呼び出しが出来ます。

int	v;
auto	f5= [&]( int a, int b ){ return a * b + v; };
int	r0= f5.v; // cannot access private member
int	r1= f5.w; // is not a member

直接アクセスはエラー。変数名はそのままメンバになってます。

lambda 式の定義が返す値はその場でキャプチャされたクロージャーそのものであるということ。
クロージャー未使用でも空の構造体が定義されること。
実行する関数はクロージャー型と静的に関連づけられており、そのために型は常にユニークとなること。
lambda 式の呼び出しは静的なものであってポインタでは無いということ
等がわかります。

実際に出力コードも追いかけて確認。

きちんとインライン展開されているし、これで定義を知らない外部からは直接アクセス
できない理由もわかりました。
外部関数呼び出しのようにインライン出来ない場合は std::tr1::function のような
関数オブジェクトが必要になるわけです。

struct func_base_2 {
    virtual int  operator()( int a, int b )= 0;
};

template
struct func_impl_2 : public func_base_2 {
    T  exf;
    func_impl_2( T lambda_f ) : exf( lambda_f ) {}
    int	operator()( int a, int b )
    {
        return  exf( a, b );
    }
};

struct func_2 {
    func_base_2*   ptr;
    template
    func_2( const T&& lambda_f )
    {
        ptr= new func_impl_2( lambda_f );
    }
    template
    func_2( T& lambda_f )
    {
        ptr= new func_impl_2( lambda_f );
    }
    int	operator()( int a, int b )
    {
        return	(*ptr)( a, b );
    }
    ~
};


    func_2    f7( []( int x, int y ){ return x*x + y*y; } );
    int   mm= f7( 3, 9 );

この場合の f7 は callback として持ち出せます。
使えるのはクロージャーが作られた関数スコープの中のみです。

関連エントリ
VisualStudio 2010 beta1

VisualStudio 2010 beta1

VisualStudio 2010 beta1 を使ってみました。
環境は Windows7 RC + Windows SDK for Windows 7 RC。

とりあえずコンパイラオプションを見ると x64 に arch オプションが増えていることがわかります。
「 /arch:AVX 」すでに intel AVX に対応している様子。

実際にコンパイルすると C5 命令が見えます。
浮動小数演算部分でちょうど SSE/SSE2 命令が AVX で置き換わっている形です。
実行するとやっぱり Illegal Instruction。

float	af= 1.3f;

C5 FA 10 05 C3 51 0E 00 vmovss      xmm0,dword ptr [__real@3fa66666 (13FD5CE2Ch)]  
C5 FA 11 44 24 74    vmovss      dword ptr [af],xmm0 

直接 AVX 命令を使うには immintrin.h を include する必要があるようです。
immintrin.h には AVX の 256bit 長のデータ型 __m256 が宣言されていました。

他に追加されたオプションは auto の扱い方です。
VC++ 2010 は auto や decltype といった宣言で型をコンパイラに判断させることができます。
キーワードの意味が変わったので /Zc:auto- で無効にできるようです。

MSDN auto Keyword

VC++ 2010 はこのように新しい言語仕様を取り入れていて、面白い機能がいろいろ
増えています。
たとえば lambda 式が使えるようになってること。

auto f_mul= []( int a, int b ) ->int { return a * b; };

宣言した無名関数をオブジェクトとして受け取れます。楽しい!
[] は capture の宣言で、クロージャーへ変数を渡す手段を記述するようです。
コピー [=] と参照 [&]、または変数個別に指定できます。
返値の型は return 文で類推しますが引数のあとの -> でも指定できます。

MSDN Lambda Expressions in C++

auto は型を自動で判別する変数宣言で、型そのものを受け取るなら decltype() が使えます。

&& 宣言は右辺値参照。代入可能な左辺値ではなく、値としての右辺値を
参照で取れるというもの。

Rvalue Reference Declarator: &&

実際に定数値でも参照可能となります。
この宣言は const でないので書き換えもできました。

int&& dd= 3;
dd++;

disassemble して生成コードを見ると、無名の auto 変数へ代入してからアドレスを
取っています。
どうやらこれが本来束縛されていないテンポラリで、右辺値参照によってこのような
無名領域へのアクセスが可能になるようです。
加算もその領域に対して行われています。

実際どのように使えばどんな効果があるのか、下記ページをかなり参考にさせて
いただきました。

ntnekの日記 和訳:Rvalue References: C++0x Features in VC10, Part 2

特に効率化は期待できるようです。
例えば C++ では一時オブジェクトが何度も生成破棄されることがありますが、
受け取った引数がすでにコピーされた一時オブジェクト(右辺値)とわかっているなら
そのまま再利用してもかまわないというわけです。
コピー元のオリジナルなら左辺値。

右辺値参照の宣言は、一時領域へのアクセス手段を手に入れると同時にこのような区別も可能になります。

非常に面白いです。
今日は本来の作業の目的を忘れてずっと VisualStudio 2010 。