Monday, July 28, 2008

Nike+のWeb API

Nike+はFlash (Flex or AIR)のフロントエンドからアクセスするけど、裏ではWeb APIでデータにアクセスできる。が、そのAPIは公開されていないらしい。

公開されていなくても、簡単なAPIなので、すでに解析されていろいろ作られている。


Connecting to the Nike+ API with C#
 APIの一覧表がある。
Accessing Nike+ data with PHP
 PHPからアクセスするクラス。SimpleXMLとCurlが必要。
Nike+ iPod Stats Wordpress Plugin
 Wordpressのプラグイン。


で、C#の記事のAPIの一覧表に従ってアクセスしてみると、USのサイトのアカウントになってしまい、日本のサイトに記録されているデータが出てこない。

ということで、FirefoxにLive HTTP Headersを入れて、日本のサイトへのアクセスを少し調べてみた。下記のようにすると、日本のサイトからデータを取り出すことができた。

ログイン
https://secure-nikeplus.nike.com/nikeplus/v1/services/app/external_profile_login.jsp?login=[ログインID]&password=[パスワード]&locale=ja%5Fjp

ログインするとクッキーが2個セットされる。(xxxxはクッキーの値)
Set-Cookie: AnalysisUserId=xxxx; domain=.nike.com; path=/; expires=Friday, 31-Dec-2010 23:59:59 GMT
Set-Cookie: PSESSIONID=xxxx; domain=.nike.com; path=/

以降はこのクッキーをヘッダに入れてアクセスする。

ユーザのプロファイル
https://secure-nikeplus.nike.com/nikeplus/v1/services/app/get_user_data.jsp

runの一覧
https://secure-nikeplus.nike.com/nikeplus/v1/services/app/run_list.jsp

ブラウザでアクセスすれば、クッキーは自動的に処理されるので、3つのURLを順にブラウザのアドレス欄に入れるだけでよい(ログインIDとパスワードは置き換えて)。そうすれば、どんなXMLデータが返ってくるかわかる。

こんな感じ。





Thursday, July 3, 2008

Nike+のトレーニングがおかしい件

Nike+のトレーニングがおかしい。

プランに従って、その日に走る→積算されない。いつまでたっても0Kmのまま。
プランの次の日に走る→積算される。
プランの次の次の日に走る→積算されない。

常に次の日に走るようにして、順調に「0kmの遅れ」で来たのだが、一度雨が降って、次の次の日に走ったら、その後はずっと「8kmの遅れ」になり、この遅れが解消できない。本当は走っているのに…

そこで、やったこと。

iPodをPCに接続すると、リムーバブルディスクとして見える。(たとえばE:)

E:\iPod_Control\Device\Trainer\Workouts\Empeds\4H812RWSVSX

の辺りにNike+のデータが入っている(最後の記号列はおそらくセンサーのシリアル番号)。この下にlatestとsynchedという2つのフォルダがあり、走るとlatestの下にファイルができて、iTunesで同期すると、Nike+のサイトに送信され、送信されたファイルはsynchedに移動するらしい。

そこで、雨で1日遅れたデータをsynchedからlatestにコピーして、日付を1日前にする。修正は3か所。

ファイル名
2008-06-30 19;00;47.xml

2008-06-29 19;00;47.xml

ファイルの中身
<time>2008-06-30T18:11:35+09:00</time>

<time>2008-06-29T18:11:35+09:00</time>

<starttime>2008-06-30T18:11:35+09:00</starttime>

<starttime>2008-06-29T18:11:35+09:00</starttime>

一度、iPodを外して、もう一度接続すると、修正したデータがNike+のサイトに送信される。

これで「8kmの遅れ」がなくなるかと思ったら、まだだめ。

トレーニングを一度削除して、同じ日程でもう一度作成しなおす。
これでようやく「0kmの遅れ」になった。

データを消すだけなら、Nike+のサイトでできるので、修正前のデータを一応消しておく。




使っている人があまりいないのか、検索しても文句を言っている人は少ない様子。

ここで少し文句が出ていた。
http://forums.nike.com/thread.jspa?messageID=187710
(言語選択出たら、英語を選択)

Nikeの人らしい人が、
Please don't go crazy trying to figure out why the progress bar in the Nike+ Coach Training Overview is indicating that you're behind while your My Runs > With Training view indicates that you're right on pace. It's not you! It's us. We're having some problems with the beta version of the training tool, and it's taking a little bit longer than anticipated to sort them out.

We apologize. It's not fun or motivating to see "you are x miles behind" every time you log in. I hope we're able to fix this problem soon, and to properly recognize all of your hard training.
と書いている。

(意訳)
ちゃんとトレーニングしているのに「遅れ」って出るのはなぜだとあまり追及しないでね。あなたのせいではありません。私たちのせいです。ベータ版のトレーニングツールに問題があるのはわかっています。直すのは思ったより時間がかかりそうです。

本当にすみません。ログインするたびに「xマイルの遅れ」と出るのは楽しくないし、やる気もでないでしょう。なるべく早く問題を解決して、あなたのハードトレーニングをきちんと認識できるようにしたいと思います。
そのあと、代わりに、Nike Running BlogのTraining Logを使ってくれと書いてあるのだけど、これはアメリカのサイト。日本のサイトにはこの機能はない。

試しにアメリカのサイトにアクセスしてみたところ、日本のサイトのアカウントとアメリカのサイトのアカウントは別らしい。で、アメリカのサイトにアカウント登録してみた。すると、不思議なことにスクリーン名は共通らしく、日本のアカウントと同じ名前は使えなかった。わけがわからない。

iPodのNike+は日本のサイトに登録してしまい、iPod側の設定を直す方法を調べていないので、とりあえず、アメリカのサイトはアカウントを作っただけで、まだデータを送ったりはしていない。

Monday, June 16, 2008

Objectivism versus Constructivism

まとめ






客観主義構成主義
真理とは?人間の外に唯一の客観的真理が存在する。真理は多様。それぞれの人間の心の中で社会的、経験的に形作られる。主観的。
知る人と知る対象の関係は?知る人は知る対象は分けることができ、知る人は知る対象に影響を及ぼさずに、実験や観察を行う。知る人と知る対象は分けることのできない。両者の相互作用の中で知識が構成される。
知識を見つける方法は?仮説を立て、条件を制御し、実験を行い、検証する体験と内省の繰り返しの中で構成される。
人間とは?自然法則に従い、外部からの刺激により行動する受動的な実体。自ら知識を構築するために、積極的に対象と関わる能動的な実体。


構成主義の学習理論
  1. 学習とは学習者自身が知識を構築していく過程である。
  2. 知識は状況に依存している。
  3. 学習は共同体の中での相互作用を通じて行われる。
構成主義の教授上の留意点
  1. まちがうことを尊重する。
  2. 探索することを奨励する。
  3. 学習者相互のやり取りを促す。
  4. 教師の役割はfacilitator

Saturday, June 14, 2008

テニスコートでシコをふむ

これからの時代の教育(学習)は、やっぱり構成主義だよねというわけで、構成主義パラダイムと学習環境デザインという本を読んでいる。2章、3章の理論の概要の部分はわかりやすく整理されていると思う。この本の主張は、従来の知識伝達型の教育観(この本では客観主義と呼んでいる)から構成主義の教育観への変化はパラダイム的転換だということである。

テニスにはテニスのルールがある。相撲には相撲のルールがある。ウィンブルドンチャンピオンと横綱のどちらが強いかという問いは意味をなさない。土俵の上でフェデラーがラケットを振り回しても、テニスコートで朝青龍がシコをふんでも、理解不能である。

客観主義と構成主義が別のパラダイムであるなら、客観主義的な小学校教育に構成主義的な総合学習を取り込み、その成果を客観主義的な「学力」というもので評価するのは、テニスコートでシコをふんでいるような気がする。

Friday, June 13, 2008

項目反応理論とCollective Intelligence的手法

先日のゼミで、久しぶりに項目反応理論のことを思い出した。その時にもちょっと言ったけど、項目反応理論の項目パラメータの推定をCollective Intelligence的手法で行うのは面白いかもしれない。

最近、ご当地検定とか、何とか検定というのがたくさんある。自分たちで簡単な検定を作るサイトもある。

ある能力を測るテストを作りたいときに、問題をたくさん用意して、後は、Webで多くの人に受験してもらうと、項目パラメータの推定が自動的に行われて、多くの人が受ければ受けるほど、測定の精度・信頼性が上がったり、コンピュータ適応型テストの性能が上がったりするようにできるのではないか?

こうすると、項目パラメータは不変ではなく、時間と共に変化するようになるが、それはそれで面白い。TOEFLのようなテストの項目パラメータはほとんど不変だと思うが、何とか検定の場合、時代と共に項目パラメータが変化していくのは、むしろ当然な気がする。多くの人が正解するようになれば、過去に受験したテスト結果から計算される能力値も低下する。能力値の時価がわかる。

おまけ:人を集めるデザインパターン

Wednesday, June 11, 2008

休止状態からの復帰検出

Twitterをタスクトレーでずっと動かしている場合、Windowsが休止状態から復帰したら、それを検出して更新したい。

JavaでWindowsやMacのスリープ/休止からの復帰を検出する方法はあるのか?

とりあえず、Windowsに関しては、下記を見つけた。

CodeProject: PC StandBy Detector for Java apps. Free source code and programming help

ダウンロードしようとしたら、メンバー登録が必要だった。下記に同じ記事があって、こちらはすぐにダウンロードできた。

CodeGuru: Java/C++ PC Standby Detect and Prevent

中を見てみると、案の定、JNIでdllを呼び出している。が、よく見たら、スタンバイの要求を検出するけど、スタンバイからの復帰は検出してくれないみたい。これは使えない。

今回の場合、復帰を直接検出するのではなく、十分な頻度で(1分間に1回程度)時刻を調べて、時刻が飛んでいたら休止していたと判断すればよいかもしれない。

Tuesday, June 10, 2008

Twitter + Java


TwitterのWeb APIをJavaから使うサンプルを作ってみた。

http://www.mediafire.com/?ycvm1nsx0wu

(パスワードつき)

Restletを使ってTwitterのWeb APIにアクセスしてFriends Timelineを取得。SystemTrayを使ってタスクトレイに小さいアイコンを表示し、クリックするとFriends Timelineが表示される(現在はテキストのみ)。実行可能なjarの中にjarのライブラリを入れるためにOne-JARを使用。

Monday, June 9, 2008

TwitterFox

TwitterFoxのソースを覗いてみる。

ステータスバーのアイコンのイメージがcontent/statusbar.png。3つのアイコンが1枚のイメージにまとまっている。

content/twitternotifier.xul
を見ると、こんな感じ。

<statusbar id="status-bar">
...
<statusbarpanel id="twitternotifier-statusbar-button"
class="statusbarpanel-menu-iconic"
context="twitternotifier-main-menupopup"
ondblclick="gTwitterNotifier.openURL('http://twitter.com/home')"
onclick="return gTwitterNotifier.onClickStatusbarIcon(event)"
tooltip="twitternotifier-tooltip">

<label id="twitternotifier-statusbar-text" style="margin: 1px"/>
</statusbarpanel>
..
</statusbar>
CSSのクラスを指定しているので、CSSでコントロールしているらしい。なので、content/twitternotifier.cssを見てみると、こんな感じ。
#twitternotifier-statusbar-button {
list-style-image: url("chrome://twitternotifier/content/statusbar.png");
display: -moz-box;
-moz-image-region: rect(16px, 16px, 32px, 0px);
padding-left: 3px;
padding-right: 3px;
}

#twitternotifier-statusbar-button[state="active"] {
list-style-image: url("chrome://twitternotifier/content/statusbar.png");
-moz-image-region: rect(32px, 16px, 48px, 0px);
}

#twitternotifier-statusbar-button[state="error"] {
list-style-image: url("chrome://twitternotifier/content/statusbar.png");
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
mozの独自拡張を使って、イメージを切り出している。
-moz-image-region: rect(top, right, bottom, left);
一番上の16x16がstate="error"の時のアイコン。一番下がstate="active"の時のアイコン。真ん中がその他の時。

content/twitternotifier.jsを見ると、stateを切り替える関数がある。
setButtonState: function(state) {
var btn = this.$("twitternotifier-statusbar-button");
btn.setAttribute("state", state);
},
こんな風に呼び出している。
showMessage: function(message) {
var elem = this.$("twitternotifier-status-tooltip");
if (message) {
this.setButtonState("error");
elem.setAttribute("value", message);
}
else {
this.setButtonState("active");
elem.setAttribute("value", "TwitterFox");
}
},

messageは多分エラーメッセージで、エラーが発生すると、アイコンが赤くなって、マウスを上に持っていくと、ツールチップにエラーメッセージが表示されるらしい。