雑文発散

«前の日(06-11) 最新 次の日(06-13)» 追記
過去の日記

2002-06-12 頭すっきり水曜日

うわっ

これだよ、これ。このクリア感。やっぱり人間は寝ないとダメだね。朝から電車内でプログラムチェックなんぞやったら、昨日さんざん調べて見つからなかったバグ発見。いったい昨日はなんだったんだ。。。

新聞掲載

日経産業新聞にウチのサービスの記事が載った。今年の始めに作った機能がようやく日の目に。全てが正しく載っているわけではないけど、今回はかなり正しい記事。担当記者もそれなりに勉強したらしい(笑)

今日のセブンイレブン

  • ジューシーソース焼きそば(290円)
  • コーンサラダ(190円)
  • 青じそドレッシング(20円)
  • 緑水(140円)マイナスイオングッズ付き

料理

料理作るのは好きだし、まぁ、美味しいと言われることも多かった。ただ、「できる方ができる時にやる」って言ってたのに、僕ばっかり作ってた時期があって、なんか納得いかずにケンカしたこともあった。もちろん、その時期に彼女の方も「できる時」だったんだけどね。

試食会

まぁ、食べたいのなら、いずれ部室で(笑)まぁ、普通のおかずだけで、特別なものは作れないけど。

役割分担

最初は「当番制にしようか?」という話をしたら、前述の「できる方ができる時にやる」を提案してきたので、じゃあそうしようという話になった。僕が先に帰れるときはさっさと帰ってスーパー寄って、食事作って待ってるって感じだったんだけど、その逆はあまりにも少なかった。彼女の方が先に帰ってたのに夕飯の支度を何もせずに、自分のやりたいことをやっていた時にはさすがに頭にきたけど。「なんで作らないんだ?」って聞いたら、僕が作った方が美味しいから、みたいなことを言われたときには、「こりゃ付き合う相手を間違ったかな?」と思った。そういうもんじゃないだろ?って。

まぁ、

そんなこんなで別れたのだ。もちろん、これが全ての理由じゃないけど。。。なんでこんなん語ってるんだ?今日は(笑)

あらら

「まぁ」が多すぎ。ダメダメだ。

本日のツッコミ(全2件) [ツッコミを入れる]

双月 [はじめまして。ゆうすけさんのとこから飛んできました。...難しいですね。とりあえず、お疲れだと思うので、ええと、お大..]

すずき [はじめまして>双月さん えっと、別れたのはだいぶ前のことなので全然平気です。ご心配ありがとうございます。]


2003-06-12 スタミナドリンク希望、木曜日

ダル

昨日のダルさは眠気のためなのかと思って、昨夜は23時前に就寝。朝までグッスリかと思ったら、深夜3時過ぎくらいに目が覚めた。しかも、妙に喉が乾いていたので、台所でお茶をグビッ。自分の部屋に戻ったけど、なんかもの足りない。シアター室の冷蔵庫に水を入れていたのを思い出してグビグビグビッ。ようやく満足して再び眠りに。

7時過ぎに目覚めたけど、ダルさは抜けきらず。湿気のせいか?

日記+コミュニティ

『日記(ウェブログ)とコミュニティを融合した新感覚サイト「きゅるる」、6月12日より正式サービス開始!』だそうだ。

【主な機能】
・日記全文検索機能(フレーズでも検索可能です)
・コメント機能(日付ごとにコメントを追加できます)
・ユーザー日記ページのスキン(デザイン)変更機能
・写真(画像)追加機能(画像はサーバー側で縮小、レタッチ不要でデジタルカ
 メラで撮った写真をそのままアップロード可能です)
・日記のつながり機能(同じ日の同じテーマ日記、キーワードつながり、逆リ
 ンクつながり)
・日記メルマガ配信機能(日記を追加すると自動的に購読者に日記をメール配
 信することができます)

tDiary と関心空間の良いトコ取り+αって感じなのかな。

【追記】ネタ元は PressNetwork で流れたメール

ゆらぎ対応?

シミュレーション」と「シュミレーション」、どっちが正しいんだっけ?と改めて考えると不安になったので、google で検索してみた。

シミュレーション」ではズラズラ出てきたので、やっぱり「シミュ」で正しかった!と思いつつも、念のため「シュミレーション」でも検索してみたら、こっちもズラズラと。

「あはは、間違ってるヤツ、こんなにいるじゃん」と、いくつかのサイトを見に行って、Command + F でサイト内検索をしても、、、ない、ないんですよ「シュミレーション」が。どーなってんの?と思いつつ「シミュレーション」で検索すると、それはちゃんと見つかる。

これって google 側で「シミュレーション」のよくある間違いとして「シュミレーション」を認識・対応しているんだろうか? 他にもこんな言葉ないかなー?

本日のツッコミ(全3件) [ツッコミを入れる]

犬子 [私も、昨晩はあまりの喉の渇きで目が冷めました。3時前でした。その事態にビックリしたので思わず時計を見たくらい。]

すずき [気圧のせいだね、きっと(笑)]

おが [simulationですな。なのでシミュレーションが正解です。]


2004-06-12

[] 病院

午前中に病院へ電話してみたが、今日の今日では予約がいっぱいで無理と言われ、次回にチャレンジ、、、するのかな。

[] 誕生会

花壇代官山 花壇で、僕の誕生パーティを開いてくれた。メンツは同居組、チム、non-nonn、ワタ、ユリ(敬称略)。誕生月&倶楽部会員ならコース料理割引ってことで、こりゃイイ!と思ってたものの、その場で会員になることはできずに残念。

ケーキ最後にケーキ(持ち込み)を用意してくれていた。プレートにチョコレートで何か描かれてると思ったら、、、

プレートダースベイダーのイラストが!(笑) ケーキ屋さんにお願いして描いてもらったとのこと。「ダースベイダー書いて貰えますか?」と聞いたら「イラストを用意してください」と言われて、わざわざ手配してくれたそうだ。

会計時に、(数千円のコース+飲み物)×8名なのに7万円台のレシートを持ってこられ「えぇぇ!?」と言って、再チェックさせたら今度は5万なんぼ。それでも、よく見たらコースが10名として計算されており、再再度のチェックでようやく正しそうな金額が出て支払うという、なんとも怪しげな結末に。この事件(?)が意味するところは、この先1年の僕は、訂正多しで前途多難ということになるのだろうか。


2005-06-12

[] プレゼント

今年の誕生日プレゼントにこんなモノを貰ったよ!

ちゃんと頭から被れるんだよ!ゴム臭くて息苦しいけど(笑)

ヨーダ 頭

手も付いている。オレの手がデカ過ぎて、なかなか入らないんだけどさ(笑)

ヨーダ 手

[] Leatherman "SQUIRT"

前から存在は知っていて、ちっこくて、かわいくて、キレイで、コレ欲しいなぁと思ってはいたものの、値段はソレナリなので躊躇していた。

ところが、ふと、アシストオンを見たら値下げされてたので即購入。S4のブルー。どうやって持ち歩こうかな。キーホルダーとして使ってる方法が紹介されてるけど、それ以外の方法はなんかないかな。

[] アーリャマーン EPISODE 1 帝国の勇者(ネタバレ注意)

買ったは良いけど、なかなか観る時間が取れずにいたのだが、今日ようやく観ることができたインド版スター・ウォーズ。パクリではなくリスペクトらしいのだが、エピソード4〜6だけでなく、エピソード1からも影響を受けている。ただ、結構ゴッチャなんだよな。殺し屋(賞金稼ぎ?)がX-Wingもどきに乗っていたりするし、味方の兵隊がストームトルーパー風だったりするし。あえてごちゃ混ぜにしてるのか、本気で間違っているのかは良くわからんかった。

で、こういうモノは吹き替えだろう!と思って、オリジナル音声ではなく日本語吹き替え版で観たのだが、キャストが凄い。主人公のアーリャマーン(ルークに相当)には水島裕、アーリャマーンの師匠ホーシン(オビワンに相当?でも顔はルーカスっぽい)には石丸博也、悪玉のナーラック(ここはダースベイダー相当ではなく、皇帝相当でもない。見た目はマグマ大使風)には池田秀一という豪華な顔ぶれ。この辺はなかなか良い。

でも、この作品、パロディとして観る分には良いけど、本気で観ようと思うとツライよ。はっきり言ってつまらない。途中で何度寝たことか(笑)。しかも、これ、本作で終わりじゃないのだよ。エピソード1と付いているのは伊達じゃなかった。

本作の最後では、主人公がドクロ顔のデススターもどきに連行され、悪の親玉とライトセイバーもどきで戦うのだ。そして、いよいよ決着が!というところで、アーリャマーンがカーボン冷凍(なのか?)されてしまって、、、というところで終わり。。。思わず「えー」っと叫んでしまった。

エピソード2の予告もあって、この後は美女がカーボン冷凍を解きにやってくるようなんだけど、、、観ないだろうなぁ、きっと。

本日のツッコミ(全2件) [ツッコミを入れる]

reno(まだ) [「スペースボール」は好きでしたねえ…と思ったら、いつのまにかDVDが。なぜ?(笑) http://www.amazo..]

すずき [スペースボール、まともに観たことないんですよねぇ。借りて観てみようかな。]


2006-06-12

[] ワールドカップの凄さ

ということで、21時前には社員全員帰宅したのココロよ。すげーな、おい、ワールドカップって。まぁ、オレも帰った訳だが。

[] 負けた。。。

危なっかしかったけど、なんとかこのままイケると思って見てたんだけどなぁ。うーむ。


2007-06-12

[Mac] Safari 3 Public Betaインストール

Mac OS X 10.4.9 (PowerPC) へインストールしてみた。既存の Safari 2 が上書きされるので注意!

Safari 3 Public Beta

パッと見、違いが分からん。あ、日本語リソースが無いようで、メニューが全て英語になっているから見た目は違うか。

気になっていた「\」問題は、「\」として入力可能になったようだ<ほれ

[] キュウリ味のペプシを飲んでみたよ

コンビニに「ペプシ アイスキューカンパー」があったので買って飲んでみたが、、、見事に美味しくない。


2008-06-12

[] Web Application Security Forum の Conference 2008 が7月4〜5日に開催

いつの間にやら www.wasf.net から wasforum.jp へドメイン変更をしていた WASForum こと Web Application Security Forum。毎年、この時期にカンファレンスを開いているのだが、今年はなかなかアナウンスされないなーと思ってたら、やっときたきた。

WASForum Conference2008開催決定」というエントリによると、今年は初の2日間開催。1日目が管理者向け、2日目がエンジニア向けっぽいのだが、オレとしては両日参加してみたいところだ。

今朝見たときは、1日目と2日目で別料金がかかる&値段が違うような記述があったような気がするのだが、いま見ると載ってないな。調整中ってことかな。

ということで、募集開始の告知を待つことにする。たぶん、これまでの参加者にはメールで告知してくれるよね?

本日のツッコミ(全2件) [ツッコミを入れる]

okdt [登録開始いたしましたー。 いち早くお申込ありがとうございます。]

すずき [どうもです。 当日はよろしくお願いしますー。 ちなみに登録開始の情報は twitter で捕獲しました。]


2009-06-12

[] Redmine勉強会に参加してきた

Redmine勉強会に ust 担当として参加した。

ウチの場合、影舞、Trac、Redmine が共存していて、一番使っているのが Trac という状況。Redmine はイイ!と思いつつ、他のシステムからの全面移行は行なっていない。まとめた方が管理は楽そうだとは思うものの、そこまで困っていないのと、過去の情報資産の「完全移行」は難しいんじゃないか?という考えから、そのまま共存している感じ。

ま、それはともかく。

いつも ust をやっている時には、配信状況のモニタを中心に行なってしまい、(申し訳ない事に)発表者のスライドや話にはあまり集中できていない。

ところが、今回の勉強会では、モニタリングそっちのけで、各発表に集中してしまうこともチラホラ。どうも、自分とは違う視点からの利用例などの発表があって、引き込まれてしまった。

2時間休憩ナシの密度の濃い勉強会だったけど、疲れた感じはせず、ひたすら面白かった。まだまだいろいろな視点からの使い方があると思うので、ぜひ次も開催できるといいな。


2014-06-12

[TreasureData] トレジャーデータの事例活用セミナーに参加してきた!

「トレジャーデータ 無印良品「MUJI passport」事例セミナーのご案内」というメールを貰って、最近 TD のクエリをガシガシ叩くことが増えてきたオレは興味津々だったのだが、会社に OK を貰って、業務の一環として参加してきた。

セミナーのWebページを見てもハッシュタグが書かれていなかったので、「あぁ、そういうセミナーなんだな」(?)と思ったりして、もしかして Twitter 実況したらダメなのかしら?とつぶやいてみたら、

と、即座に OK を貰ったので、ひさびさに実況をしてきた。

実況とは言うものの、実は自分用のメモであって、これを使って、会社内で共有する参加レポートも作成するのであった。

ちなみに実況する際には、講演者の話を聞きながら、プレゼン資料に書かれた文章も参考にしながら、自分で理解した言葉に変換して書いているので、必ずしも講演者の言葉通りのものではない。文字起こしではないのだ。オレの解釈や間違っていたり、理解が違っていると、ちんぷんかんぷんな内容になっている恐れもある。

ただ、この方法は瞬間的な理解とアウトプットを集中して繰り返すため、セミナーなどの理解度が上がって、自分では気に入っている方法。

また、それがまとめられて、誰かの理解の助けになればそれも良いよね、と思って、ローカルなメモではなく、あえて Twitter に書いている。

ということで、まとめて貰った!!

肝心のセミナーの中身だけど、いま自分が叩いているようなクエリに関連することだけではなく、もっと別の視点からみた活用法のヒントを得られたので、オレ的には非常に参考になった良いセミナーだった。

少し前から、インフラの構築もできるし、アプリも書けるようなエンジニアを「フルスタックエンジニア」なんて言葉で呼ぶようになってきているけど、これからのフルスタックエンジニアは、それに加えて、分析・統計・解析もできるようにならないと生きていけないのでは?などと危機感を持ったりも。

大学へ行ってない40過ぎたおっさんでも、分析・統計・解析の世界を学んでいくことができるかなー。


2015-06-12

[Pebble] そろそろ Pebble の開発についても体験しておこうと思ってチュートリアルを学んでみる #4

昨日の日記の続き。今日は Pebble から「Pebble とリンクしたスマートフォン」を通じて Web API から情報取得する部分を作っていくところになる。

Web から取得した情報を追加する

チュートリアルの Part3PebbleKit JS を使って、Web 上のコンテンツから取得した情報を Pebble アプリ内に表示するチュートリアルになる。

Watchface アプリのレイアウト定義をしていく

このチュートリアルでは、JavaScript で OpenWeatherMap から現在の天気と気温を取得して表示していく。

まずは、JavaScript で情報を書き換える場所づくりとして、テキストレイヤーを追加していく。これは、時刻表示のときと同じ流れなので分かりやすい。

// Create temperature Layer
s_weather_layer = text_layer_create(GRect(0, 130, 144, 25));
text_layer_set_background_color(s_weather_layer, GColorClear);
text_layer_set_text_color(s_weather_layer, GColorWhite);
text_layer_set_text_alignment(s_weather_layer, GTextAlignmentCenter);
text_layer_set_text(s_weather_layer, "Loading...");

ちょっと違うのは、初期状態で表示するテキストを「Loading...」にしているところかな。JavaScript で情報取得して書き換える前には、こういった表示にしておくほうがユーザにやさしいということだろう。

それから同じフォントでも違うフォントサイズを利用するには、appinfo.json で改めて定義が必要なようだ。

{
  "type": "font",
  "name": "FONT_PERFECT_DOS_48",
  "file": "fonts/perfect-dos-vga.ttf",
  "compatibility": "2.7"
},
{
  "type": "font",
  "name": "FONT_PERFECT_DOS_20",
  "file": "fonts/perfect-dos-vga.ttf",
  "compatibility": "2.7"
},

ここでチュートリアルの説明にちょっとワナがある。

チュートリアル Part2 では、フォントファイルの指定を "file": "fonts/perfect-dos-vga.ttf" のように fonts ディレクトリ以下にファイルがあるように書いているのに、チュートリアル Part3 では "file":"perfect-dos-vga.ttf" とディレクトリが存在していない。

上記の JSON は Part2 に合わせてディレクトリが入った状態で書いている。

その他、いつもの unload 処理を追加した後で、build & install すると、このような Loading 表示が出た。

Pebble app

ちなみにフォントサイズの指定は「_48」とか「_20」の部分になるようだ。どういうルールでそうなっているのかは、うまく把握できていないのだけど、「_20」の部分を「_10」に書き換えて build & install してみたら、小さいフォントで表示されたので、今はそういうものだと思っておこう。

AppMessage を使うための定義を作る

Pebble および Pebble と接続しているスマートフォンとの間の通信は、AppMessage API を使って行われるとのこと。

AppMessage の使い方の概要は次のようになるらしい。

  1. AppMessage 用のコールバック関数を作成する
  2. コールバック関数をシステムへ登録する
  3. アプリケーションで通信を始めるために AppMessage をオープンする

この手順で開始されて実際にメッセージが届くと AppMessageInboxReceived コールバックが呼ばれるそうだ。コールバック関数は、次の4つが紹介されている。カッコ内の関数名はチュートリアルに書かれていた名前であり、これに固定されている訳ではない。

  • 正常系: メッセージが届いたとき( inbox_received_callback()
  • 異常系: メッセージをロストしたとき( inbox_dropped_callback()
  • 正常系: メッセージ送信に成功したとき( outbox_failed_callback()
  • 異常系: メッセージ送信に失敗したとき( outbox_sent_callback()

コールバック関数を定義したら、それを init() の中でシステムへ登録する。

// Register callbacks
app_message_register_inbox_received(inbox_received_callback);
app_message_register_inbox_dropped(inbox_dropped_callback);
app_message_register_outbox_failed(outbox_failed_callback);
app_message_register_outbox_sent(outbox_sent_callback);

AppMessage を ON にするためには「app_message_open()」を実行してやる必要がある。

// Open AppMessage
app_message_open(app_message_inbox_size_maximum(), app_message_outbox_size_maximum());

これを実行するのは、コールバック関数を定義した後に行なうのがベストプラクティスだとチュートリアルには書いてある。この順番で実行することで、メッセージの取りこぼしが無くなるみたいだ。

それから、Pebble とスマートフォンの間でデータのやりとりをするためのキーとして、次の定義をしておく。

#define KEY_TEMPERATURE 0
#define KEY_CONDITIONS 1

AppMessage でのメッセージのやりとりのキーは数値のようなのだが、数字でのアクセスだとマジックナンバーになってしまうし、何よりコードがリーダブルでは無くなるので、こうしておくのが普通だそうだ。更に複雑になった場合には enum を利用して整理する方法もあるよと紹介されている。

PebbleKit JS の準備

PebbleKit JS は、src/js/pebble-js-app.js ファイルに記述していく。どうもこのひとつのファイルに全てを記述していくようだ。

最小のひな形としてサンプルが掲載されている。そのインデントが好みではないので、自分ではこのようにした。最小構成では readyappmessage のイベントを LISTEN するだけのものだ。

/*global Pebble */
Pebble.addEventListener('ready', function(e) {
  console.log('PebbleKit JS ready !');
});

Pebble.addEventListener('appmessage', function(e) {
  console.log('AppMessage received !');
});

ここまでできたら、また build & install を実行する。そして console.log() の出力を見てみようというのだ。まず、インストール時に console.log() の実行結果が表示された。

% pebble install --phone 192.168.1.78
[INFO    ] Installation successful
[INFO    ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO    ] app is ready: 1
[INFO    ] JS: Tutorial1: PebbleKit JS ready !

それから、ログを見る方法として pebble logs コマンドが紹介されている。log じゃなくて logs ね。これを実行すると、ログの流し見ができるようになる。

% pebble logs --phone 192.168.1.78
[INFO    ] Enabling application logging...
[INFO    ] Displaying logs ... Ctrl-C to interrupt.
[INFO    ] I ocess_manager.c:297 Heap Usage for App <Tutorial1>: Total Size <22352B> Used <6536B> Still allocated <40B>
[INFO    ] JS: stopping app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO    ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO    ] app is ready: 1
[INFO    ] JS: Tutorial1: PebbleKit JS ready !

これは既に起動していた Tutorial1 の Watchface を別の Watchface に切り替えてから、もう一度 Tutorial1 へ戻したときの様子。一度 Tutorial1 がストップし別の Watchface が起動(こっちは特にログを吐き出していない)、そして Tutorial1 が再び起動して、console.log() の内容が表示された。

つまり、Watchface アプリの起動時に pebble-js-app.js が読み込まれ、イベントリスナーに登録した ready イベントが発火されたという訳だ。

この logs サブコマンドでは、PebbleKit JS の console.log() だけでなく、C 言語での APP_LOG の内容も出力してくれるそうだ。チュートリアルにも「logs はデバッグに超便利だよ!」って書かれている。プリントデバッグ万歳!

天気の情報を取得する

OpenWeatherMap.org から天気情報を取得して、Watchface アプリに表示させるステップが説明されている。チュートリアルの説明そのままだけど、こんな手順になるそうだ。

  1. スマートフォンに対してユーザの位置情報をリクエスト
  2. 取得した位置情報を用いて OpenWeatherMap.org へ天気情報をリクエスト(XMLHttpRequest を使用する)
  3. 取得した天気情報を Wachface アプリへ送信する

この手順は JavaScript の範疇になる。コードを追加していくのは、先ほどと同じ src/js/pebble-js-app.js だ。

その前に、位置情報を取得するためには appinfo.jsoncapabillities の定義が必要になるそうなので記述する。

"capabillities": [
  "location"
],

JSON 内のどのレベルに書くのか?と思ったのだけど、他のフィールドの配下ではなくトップレベル(という言い方で良いのだろうか?)に書けばいいようだ。

そして改めて JavaScript へ戻る。先ほど作った ready イベントのリスナーに getWeather() の呼び出しを追加する。

Pebble.addEventListener('ready', function(e) {
  console.log('PebbleKit JS ready !');
  getWeather();
});

getWeather() の中身はこうなっている。

function locationSuccess(pos) {
  // We will request the weather here
}

function locationError(err) {
  console.log('Error requesting location!');
}

function getWeather() {
  navigator.geolocation.getCurrentPosition(
    locationSuccess,
    locationError,
    {timeout: 15000, maximumAge: 60000}
  );
}

まず getWeather() 内で navigator.geolocation.getCurrentPosition() を実行して位置情報を取得する。これは Pebble の独自メソッドではなく、標準の Geolocation API の書式だ。

Pebble がスマートフォンと接続している状態であれば、この API を使ってスマートフォンが持っている位置情報をこの JavaScript で取得できるってことみたいだ。

位置情報が取得できたら、locationSuccess() が呼ばれ、失敗したら locationError() が呼ばれる。locationSuccess() には位置情報のオブジェクトが渡される。

次はこの locationSuccess() の中身を実装していく。

function locationSuccess(pos) {
  var url = 'http://api.openweathermap.org/data/2.5/weather?lat='
          + pos.coords.latitude
          + '&lon='
          + pos.coords.longitude;

  xhrRequest(url, 'GET', function(responseText) {
    var json = JSON.parse(responseText);

    var temperature = Math.round(json.main.temp - 273.15);
    console.log('Temperature is ' + temperature);

    var conditions = json.weather[0].main;
    console.log('Conditions are ' + conditions);

  });
}

xhrRequest() はこのチュートリアルで独自に定義した XMLHttpRequest の処理(この日記には書いてないので、本家チュートリアルを参照すべし)だ。ここでは、getCurrentPosition() で取得した位置情報を使って OpenWeatherMap.org の API 呼び出し用の URL を作り、それを XMLHttpRequest(つまり Ajax)で呼び出している。レスポンスが返ってきたら、その中身を JSON にパースして、console.log() へ吐き出している。

ここまで作って build & install したら次のようなログが出てきた。

% pebble install --phone 192.168.1.78
[INFO    ] I ocess_manager.c:297 Heap Usage for App <Tutorial1>: Total Size <22352B> Used <6536B> Still allocated <40B>
[INFO    ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO    ] Installation successful
[INFO    ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO    ] app is ready: 1
[INFO    ] JS: Tutorial1: PebbleKit JS ready !
[INFO    ] JS: Tutorial1: Temperature is 18
[INFO    ] JS: Tutorial1: Conditions are Rain

気温が 18 度で、天気は雨だ。このとき OpenWeatherMap の Web サイトで東京の天気を見てみたら、18度で雨となっているので、正しく情報が取得できたようだ(これを書いていたときには東京にいた)。

Pebble app

OpenWeatherMap からのレスポンスのサンプルが、このチュートリアルの Gist で公開されている。日の出・日の入りや気圧とかも取得できるみたいだね。

天気を Pebble に表示する

JavaScript での最後のステップと書かれている。このステップで、JavaScript から Pebble アプリへのデータ送信のやり方が分かるはず。

まず、AppMessage で使うキーを appinfo.json に定義する。

"appKeys": {
  "KEY_TEMPERATURE": 0,
  "KEY_CONDITIONS": 1
}

これは最初のほうで Tutorial1.c へ定義した、この部分と一致させるってことだろうな。

#define KEY_TEMPERATURE 0
#define KEY_CONDITIONS 1

次に AppMessage 送信の本体部分を実装していく。その本体はこのような形で Pebble.sendAppMessage() を使う。temperatureconditions には、それぞれ温度と天気の値が入っているものとする。

var dictionary = {
  'KEY_TEMPERATURE': temperature,
  'KEY_CONDITIONS': conditions
};

Pebble.sendAppMessage(dictionary,
  function(e) {
    console.log('Weather info sent to Pebble successfully!');
  },
  function(e) {
    console.log('Error sending weather info to Pebble!');
  }
 );

それから、appmessage のイベントリスナーにも getWeather() を仕込んでおけとのこと。これは後から実装する「情報のアップデート」に必要な仕込みらしい。

あともうちょい。

今度は Tutorial1.c の修正。inbox_received_callback() の中を実装することになる。AppMessage で送信されたキーごとに文字列を作成し、TextLayer へ出力する流れ。

static void inbox_received_callback(DictionaryIterator *iterator, void *context) {
  Tuple *t = dict_read_first(iterator);

  while (t != NULL) {
    switch (t->key) {
    case KEY_TEMERATURE:
      snprintf(temperature_buffer, sizeof(temperature_buffer), "%dC", (int)t->value->int32);
      break;
    case KEY_CONDITIONS:
      snprintf(conditions_buffer, sizeof(conditions_buffer), "%s", t->value->cstring);
      break;
    default:
      APP_LOG(APP_LOG_LEVEL_ERROR, "Key %d not recognized!", (int)t->key);
      break;
    }

    t = dict_read_next(iterator);
  }

  snprintf(weather_layer_buffer, sizeof(weather_layer_buffer), "%s, %s", temperature_buffer, conditions_buffer);
  text_layer_set_text(s_weather_layer, weather_layer_buffer);
}

最後に「一定時間で天気情報をアップデートする」という処理を tick_handler() の中に記述する。tick_handler() は「1分ごとに時計表示を書き換える」ところで使っていたルーチン。ここに「30分ごとに天気情報を取得して AppMessage を送信する」という処理を追加する。

if (tick_time->tm_min % 30 == 0) {
  DictionaryIterator *iter;
  app_message_outbox_begin(&iter);

  dict_write_uint8(iter, 0, 0);

  app_message_outbox_send();
}

ここまで書いて build & install をすると、Watchface に現在位置の天気情報が表示される。さっきログに出てきたように、「18C Rain」と表示された。

Pebble app

これでチュートリアルの全てが終了。なんとなく全体像は把握できたかな。でも JavaScript 部分はともかく、C 言語部分はだいぶ模写しただけ感があるので、もうちょっと知識を得ねばという感じだな。

なにはともあれ、自分で作った画面が Pebble 上に表示されるのは楽しいね、チュートリアルとは言え。


2016-06-12

[] 修理に出していた Helinox の椅子が戻ってきた

昨年の北海道旅行のために買った Helinox の「サンセットチェア」を、3月にふもとっぱらへキャンプへ行った時に壊してしまっていた。椅子が倒れていたことに気がつかずに座ろうとしてしまい、自分がひっくり返るのと同時に椅子へおかしな加重を与えてしまって、ポールが曲がってしまったのであった。

先週、購入した店舗へ持ち込んで修理の依頼をしていたのだけど、それが完了したとのことで引き取りに行ってきた。

曲がってしまったポールを2本交換して4,600円(税別)。新品の Helinox チェアを買うよりは安いけれど、結構いいお値段になってしまった。

次からは気をつけて座らないと。