»
S
I
D
E
B
A
R
«
iPhone で Web サービスの SMS 通知を受ける
Jun 21st, 2009 by mootoh

Google CalendarRemember the Milk といった Web サービスには、 SMS 通知という機能があります。指定しておいた時間にリマインダがケータイに飛ばされてくるやつですね。 ところが、これまで iPhone で SMS を通知を受けようにもやり方がわかりませんでした。ユーザ名 at i.softbank.jp という選択肢が、 Web サービス側になかったのです。1

しかし、 iPhone OS 3.0 で MMS を送受信できるようになり、状況がかわりました。やってみてうまくいったのでシェア。

MMS

Softbank での MMS アドレスは ユーザ名 at softbank.ne.jp になります。これは、 Remember the Milk などの Web サービスでも選択肢にあります。

Remember the Milk での設定は、 “Settings” → “Reminders” (このアドレス) で、設定例は以下のようになります。

RTM SMS Setting for Softbank MMS


iPhone での MMS 通知をメール通知と比べたときの利点は、どのアプリにいても、通知内容がプレビューつきで、ポップアップ通知される ところですね。いわゆる Push Notification です。これがかなり便利。

iPhone アプリ側で Push Notification を実装するのも手なのですが、 MMS という既に Push Notification の共通基盤として存在するものを使うというのもアリかなーと。たとえば、ぼくのつくっている Remember the Milk の iPhone クライアント Milpon でも Push Notification やろうかなーと思ってたんだけれど、 MMS 通知で狙っていたことが十分に達成できてしまっていました。

他にも SMS 通知してくれる Web サービスってありますかね?

あと料金ですが、ソフトバンクに問い合わせたところ、海外からのでも MMS の送受信は パケット定額フル の適用範囲内とのことでした。受信料を気にせずじゃんじゃん MMS 通知を受けまくって OK ですね。


  1. 追記: いま Google Calendar の設定項目をみたら、 i.softbank.jp がありました。 

Grand Central Dispatch
Jun 11th, 2009 by mootoh

WWDC 2009 が始まり、 Mac OS X Snow Leopard の技術が少しずつ公開されてきています。 下位レイヤ屋にとって興味深いのは Grand Central Dispatch (GCD)OpenCL ですが、ここでは Grand Central Dispatch Technology Brief (PDF) をもとに、 GCD について書いてみます。PDF を参照しながら読んでいただければ。突っ込み歓迎。

かんたんなまとめ: Block という構文をつかうことで、マルチコアの性能を引き出す並列プログラムかんたんに書くことができるようになるよ (きっと)

おさらい

GCD の話の前に、背景をかんたんにおさらいします。

これまでムーアの法則にしたがって上がってきていたCPUのクロックは、発熱とか消費電力とかのために頭打ちになってきている。 そこで、クロックを上げずにプロセッサをパワーアップさせる方法として、1つのチップ内に複数のCPU (コア) をのせて並列処理をしましょう、というのがマルチコア化の流れ。

そうしたマルチコアを活かしてプログラムを速くするためには、プログラムを並列で書かないといけないわけです。 ところが、並列プログラミングというのはむずかしい。デッドロックとかレースコンディションとか非決定性のためにデバッグしづらいとか、泣けるポイントだらけなのです。

つまり、これまではプログラムの性能が足りなくても、お金を出すか待っていれば速いプロセッサがソフトウェアをそのまま速くしてくれたんだけれど、これからはそうはいかないよ、ということ。 そんな哀れなプログラマを救うべく、世界中の研究機関や企業がこぞって研究開発をしているのですが、そんな中 Apple が GCD をさらっと出してきたのでした。

Grand Central Dispatch とは何か

Mac OS X Snow Leopard で導入される、 マルチコア時代の並列実行基盤 です。 これまでの OS でいうところのプロセス/スレッドスケジューラのレイヤにありつつも、プログラマが直接たたける API を提供しているフレームワークでもある。

特徴は以下の3つ。

  • Block という単位で、かんたんに並列プログラムが書ける (らしい)
  • Mac OS X の洗練された開発ツールと統合されている
  • 軽い

Block

GCD の核となるのは、BlockQueue 、そしてそれらを動かすランタイムシステムです。

Block は並列実行の単位です。これまでのモデルだとスレッドに近い。Ruby だと Proc のイメージでしょうか。 Technology Brief の例によると、 Block は以下のようにして書きます。

x = ^{ printf("hello world\n"); }

ふつうの C/C++/Objective-C のブロック {} の先頭に ^ をつけたものですね。そうして定義した Block を変数に代入しています。 関数型っぽい。Block の中は、並列に実行する段になってはじめて評価される (遅延評価) のではないでしょうか。

Technology Brief によると、 Block には引数を渡すこともできるそうです。引数によって、処理の依存関係を表現するんでしょう。 Block の中で Block を呼び出すことで、 Nested Parallel のようなこともできそうです。

たとえば、依存関係のない配列の要素を並列で計算するのであれば、次のようなコードになるのかな ( [ ] で、ブロックに引数を渡すと勝手に仮定)。

   square = ^[int x]{ x * x; }
 
   int results[1024];
   for (int i(0); i<1024; i++) {
      results[i] = square(i);
   }

いかにもなデータ並列ですね。

定義した BlockQueue にどんどん放り込まれます。あとは、システムの方で自動的に依存関係を解析して、動ける Block をかたっぱしから並列実行していく。 Queue はスレッドプールをもっていて、Block の実行にはスレッドプールから空きスレッドを割り当てるというしくみ。 スレッドプールを使うことにより、スレッド生成/後始末のコストを小さなものにしています。

run queueにタスクをつっこんでいく、というのは Linux のプロセススケジューリングなどを想起させられます。 異なるのは、 GCD のキューは並列で動く Block 間の依存関係を解きながら並列実行をすすめる、というところでしょう。 ここに GCD のキモがあるとおもいます。どうやってるんだろう… プロセススケジューラが、 I/O が発生した段階でタスクを run queue から外すように、別 Block と通信が必要になったときには Queue から別の Block を取り出す、とかやりそう。

開発環境

Instruments で、 Block の実行状態を把握することができるそうです。 あのインターフェイスで並列プログラムを解析することができるのは魅力的ですね。 Apple のすごいところは、こういう統合されたインターフェイスがあるところだなあと。

軽い

スレッドプールをつかってるから、というのもありますが、 BlockQueue につっこむのに 15 命令しかつかわないよ、と。 ふつうのスレッドプログラミングでのスレッドのセットアップをするのに比べて 50 倍は速いんだぜ、と。

謎: 共有データ

Technology Brief を読んだだけでは、共有データをどのようにして排他するかという、並列プログラミングで一番問題になるところをどのようにして解決しているのかが分かりません。 lock する必要がなくなるよ! とは書いてあるのですが…

GCD では、プログラマはプログラムを Block にわけ、データ/処理の依存関係を Block の引数にするか、 BlockQueue に入れる順番で表現することになります。 そうしたときに、たとえば Producer/Consumer 問題はどのようにして書けばいいのか。仮説として、次のものを思いつきました。

  1. 静的解析をやってしまう : Block 間の依存関係を、コンパイル時にすべてしらべあげてしまうとか
  2. 書けないようにする : 共有データを Block 内に書くことができないようにする。共有するデータは引数として受け渡しするのみ

1 かなー…

考察

  • 一読したときには、単にスレッドプールがあって、ちょっとヘンな構文でスレッドを記述するだけのもの、と見なしていました。でも、 Block の依存関係を自動的に解消して並列実行する Queue というものは、実はすごいものである可能性があります。
  • GCD はタスク並列と粒度の大きなデータ並列を扱い、 OpenCL が細粒度のデータ並列を受け持つという両輪を標準で備えたことにより、Mac OS X は並列処理において他のプラットフォームをだいぶ引き離しますね。
  • あと、C/C++/Objective-C の構文拡張をしているわけですが、そうなると GCC に手を入れているか、別の技術 (LLVM, clang) をつかっているのかなーとか。

懸念

  • まずデバッグをどうするんだろう、というのがあります。並列で動いている Block をどうつかまえて、トレースするのか。 Apple がどのように Xcode で見せてくるのかとても興味あります。
  • また、 GCD がいくらすごい技術だったとしても、 Mac OS X でしか使えないのだったら魅力が半減してしまいます。

まとめ

Technology Brief にある GCD の概念はわかりやすいものです。 しかし、ふつうのプログラマがばしばし使うようになるかどうかは、共有データを複数の Block からアクセスするときのモデルと考え方が、いかに分かりやすくカンタンであるかにかかっています。 続報に期待ですね。

GCD によって、スレッドに代わる新しい並列プログラミングモデルの世界が実現するかどうかワクワクしながら、9月の Snow Leopard リリースを待ちます。

参考

Bonjour
Jun 2nd, 2009 by mootoh

iPhone アプリをつくってて、 Bonjour をつかえばいろいろと楽しいことができるんじゃない? と調べていました。ここまでのところをシェア。

Bonjour というのは、 DNS サーバがなくても、同じネットワーク内にいるコンピュータを見つけあうことができる技術。 Zero Configuration とか Rendezvous とか言われてたりもした。

準備

遊びでつかうなら、 service type = _wwdcpic あたりでローカルで遊ぶといいんじゃないかな。

本気でつかうなら、dns-sd にサービスの登録をする。 サービス名、説明、責任者といった情報をつけてメールすれば、そのうち受理されたりする。

Cocoa API

いいところ:

  • 使いやすく抽象化されてる
  • Mac, iPhone どちらでも同じように使える!

ちゃんと RubyCocoa でも使えたよ!

NSNetService

サーバ側。サービスを提供していることをアピールし、クライアントから接続されてくるのを待つ。

ながれ:

  • initWithDomain_type_name_port
  • setDelegate
  • publish

ここの type で指定するのを、 dns-sd に登録しておくということ。 クライアントとのやりとりは delegate のコールバックに通知される。 接続されたあとの処理は、ふつうのネットワークプログラムとおなじ。

NSNetServiceBrowser

クライアント側。サーバをてきとうに探し出して、接続する。

ながれ:

  • init
  • setDelegate
  • searchForServicesOfType

みつかったあとのサーバとのやりとりは、 delegate のコールバックに通知される。

Sample code

/Developer/Examples//Foundation/PictureSharing

このコードを読むと、だいたい把握できる。

あと、自分で書いたコードが github:remoteshortcuts にあります。 Mac with RubyCocoa, iPhone とごちゃまぜなかんじがたのしいかと。

つまづきポイント

  • NSNetService は、 stop を送られたあとにもう一度 publish で起動しようとしてもダメ (しぬ)
  • delegate を設定する前にメッセージを送っても意味なし

まとめ

想像以上にかんたんに使えました。 Cocoa フレームワークはすばらしい。 iPhone アプリどうしで小さなネットワークをつくって遊ぶようなときにさくっと使うと楽しそうです。勉強会とか。

Milpon 2.0 released
May 25th, 2009 by mootoh

Milpon 2.0 が AppStore にでました!

UI の大幅な改善、タグのサポート、 URL がついてるタスクは内蔵ブラウザで表示、タスク名やリスト、ノートを変更できるようにした、などなどたくさんの変更が入ってます。しかも無料! (ひきつづき) かれこれ4ヶ月をかけたアップデートになっています。

いろいろ見てたところ、無料で RTM と同期できる iPhone アプリはないとか。ぜひおためしください。


今後のアップデート予定は、

  • 週次レビューの支援
  • “あとまわし” ボタンの追加
  • スマートリストのサポート
  • 日本語へのローカライズ
  • 高速化

などがあります。こちらもおたのしみに。

iPhone ハッカソン @ KAYAC
May 25th, 2009 by mootoh

IMG_0994

KAYAC で iPhone ハッカソンをやるよ ということで鎌倉に行ってきました。メンバーは UICoderz から何人かと JTPA シリコンバレーカンファレンスツアーで一緒に行った面々から成る。ネットワークがつながる。

KAYAC はじつに楽しげなオフィスですね。物理的な環境がひとに与える影響は無視できないよなー。

自分はひたすら iPhone 3.0 用のアプリをつくってた。3.0 がリリースされた頃にはリリースできていたい。鎌倉ハッカソンはたいへんに作業がすすんだのでまたいきたいものです。

R0010794

その後のごはんの場では、科学や宗教、民俗学から音楽理論まで、多彩な議論がおもしろく交わされていてあやうく終電のがしかけた。

ホストしてくださった @theodoor さんありがとうございました。

Milpon 2.0 submitted
May 17th, 2009 by mootoh

しばらく音沙汰がない間なにをやっていたかというと、ずっと Milpon の次期バージョンをつくっていました。 UI の再構築、タグのサポート、などたくさんの改善をおこなっています。 App Store にアップグレードを申請中です。近いうちにリリースされるといいな。

スクリーンショット

Overview で時系列に、List でカテゴリごとに、 Tag でそれぞれを横断してタスクを一望できます。

Picture 1

完了ボタンをやや大きくして、押しまちがいの少ないようにしました。

Picture 2

タグでタスクを整理しているところ。

Picture 5

タスクの詳細表示の画面で、タスクの属性をよりいじれるようにしました。

Picture 3

id:KishikawaKatsumi さんによる、カレンダーで日付がえらべるようにするコードがはいっています。

Picture 4

タスクの追加画面。おおきめの表示にしました。

Picture 6


自分でも 2.0 をつかってフィールドテストしているのですが、もう 1.0 には戻れませんね。

App Store にでるまで、いましばらくおまちください。

Ditz のチケットを GitHub Page に表示する
Apr 16th, 2009 by mootoh

GitHub には Trac みたいな BTS がついてないので、外部の BTS をつかってバグ管理をすることになります。 Lighthouse なんかと連携してもおしゃれですが、ぼくの場合はオフラインで開発をしてることが多いので Ditz を愛用しています。そんな Ditz のチケットを、 GitHub サイトで表示させることができた ので、やり方をシェアしておきます。

やり方

Github には GitHub Pages という機能があります。これは、 GitHub に push した web コンテンツを GitHub のドメインで表示できるというもの。 そして、 Ditz には ditz html で release や task の一覧を HTML で出力する機能があります。これらを組み合わせましょう。

1. GitHub page をつくる

GitHub Pages::Project Pages で書かれている方法にしたがって、プロジェクトのページをつくります。早く言えば、 origin/gh-pages tree をつくって push するだけ。最初に push してから GitHub に反映されるまでは 10分くらいかかるので、次のステップを進めておきましょう。

例: github.com/mootoh/milpon@gh-pages

2. Ditz でコンテンツを静的生成する

ditz html [output-dir] で、 release や task の一覧がまとめられたファイル群を生成します。できたら、 checkout gh-pages && add output-dir && commit && push origin gh-pages で GitHub に反映。

3. That’s it!

もうできてしまっています。かんたんですね!

例: mootoh::milpon::ditz

ToDo

  • 自動化 : 定期的に ditz html するようなしくみを作る (cron?)
  • Ditz の HTML に、 issue 登録のしくみを入れる (どうやるんだろう)

Happy Ditz & GitHub hacking!

あわせて読みたい

ToddleDatabase
Apr 15th, 2009 by mootoh

ToddleDatabase という SQLite3 のラッパーライブラリを github に置きました。 iPhone での SQLite3 をつかった開発を多少ラクにするためのものです。 Milpon の beta07 からつかっています

例: SELECT

例として、 (id, name, tag_id) というフィールドからなる table から、指定した tag_id をもつ (id, name) をひっぱってくることを考えます。

ベタに SQLite3 の C API をつかうと以下のようなかんじ。

/*
 * collect (id, name) pairs from 'list' table by tag_id.
 *   table 'list' consits of (id, name, tag_id) 
 */
void select_list(sqlite3 *handle, int tag_id)
{
   // construct query
   sqlite3_stmt *stmt = nil;
   const char *query = "SELECT id,name from list where tag_id=?";
 
   if (sqlite3_prepare_v2(handle, query, -1, &stmt, NULL) != SQLITE_OK) {
      handle_error([NSString stringWithFormat:
        @"Error: failed to prepare statement with message '%s'.",
        sqlite3_errmsg([db handle])]);
      return;
   }
 
   sqlite3_bind_int(stmt, 1, tag_id);
 
   // send query and collect results
   while (sqlite3_step(stmt) == SQLITE_ROW) {
      NSNumber *iD   = [NSNumber numberWithInt:sqlite3_column_int(stmt, 0)];
      NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
   }
 
   sqlite3_finalize(stmt);
}

これ1つだけならいいんですが、アプリ内にこれと同じようなコードブロックが散在するのが悩みのタネでした。共通化しようにも、query として渡す引数の数はいくつになるかわからないし、型も不定。query の実行結果についても同様で、うまくまとめられません。

ToddleDatabase をつかうと以下のようになります。

(NSArray *) select_list:(ToddleDB *) db withTag:(NSNumber *)tag_id
{
   NSDictionary *where = [NSDictionary
      dictionaryWithObject:[NSString stringWithFormat:@"id=%d", [tag_id intValue]]
      forKey:@"WHERE"];
 
   NSArray *keys  = [NSArray arrayWithObjects:@"id", @"name", nil];                     // fields of table
   NSArray *types = [NSArray arrayWithObjects:[NSNumber class], [NSString class], nil]; // types of each fields
   NSDictionary *query = [NSDictionary dictionaryWithObjects:types forKeys:keys];       // run SQL SELECT
   return [toddleDB select:query from:@"list" option:where];
}

かんたんですね!


抽象化したことでどれくらいパフォーマンスに影響が出ているかは、まだ計っていません。どうだろうかな。

アプリケーションのプロトタイピングにはこういうラッパーを使ってじゃっかん抽象度の高いレイヤで試行錯誤し、リリースするにあたっては SQLite3 API を直叩きする、というのがベストプラクティスなのかな。

もっとよい抽象あるよ! とか高速化のヒントなどあれば、ぜひぜひ fork するなりコメントなりでお知らせください。

Git bundle
Apr 11th, 2009 by mootoh

Git つかって開発しているのですが、事情があってネットワークでつながっていないホストにもリポジトリをもっていかないといけなくなりました。github みたいな HUB があれば話はかんたんで、 git clone/pull/push/merge/… すればよいだけなのですが、そうはいかない。

どうしようかなーと、git-format-patch && git-am でやるか! と冴えない方法で運用しようとしていたところ、ふと Twitter でつぶやいてみると Vim 神であるところの @kana1 からお告げが。

  1. Motohiro Takayama
    mootoh @kana1 what I wanted to do is passing packed objects between separated site (not connected via internet, so push/pull does not work).
  2. kana

this quote was brought to you by quoteurl

git-bundle(1) DESCRIPTION:

Some workflows require that one or more branches of development on one machine be replicated on another machine, but the two machines cannot be directly connected, and therefore the interactive git protocols (git, ssh, rsync, http) cannot be used. This command provides support for git-fetch and git-pull to operate by packaging objects and references in an archive at the originating machine, then importing those into another repository using git-fetch and git-pull after moving the archive by some means (i.e., by sneakernet). As no direct connection between the repositories exists, the user must specify a basis for the bundle that is held by the destination repository: the bundle assumes that all objects in the basis are already in the destination repository.

これだ! zsh 補完で git オプションを探していたのですが、bundle は出てこなかったですね。@kana1++

まとめ

Twitter すごい。Thank you my 846 followers for supporting me a lot! I will help you in return.

あと、 Git は奥がふかいですねえ…

mixi アプリ オープンβ に参加できない件を問い合せてみた
Apr 11th, 2009 by mootoh

mixi アプリ オープンβ に参加できない で書いた件の続き。 mixi から回答がきたのですが、ダメなかんじでした。ちょっと長いですが、以下に引用します。


お問い合わせの件ですが、デベロッパー登録時の携帯認証の際、mixi でご指定可能な携帯メールアドレスのドメインは下記の通りとなっております。

  • docomo.ne.jp
  • ezweb.ne.jp
  • softbank.ne.jp
  • (d/h/t/c/k/r/n/s/q).vodafone.ne.jp
  • disney.ne.jp
  • (wm./di./dj./dk.)pdx.ne.jp
  • willcom.com

上記以外のドメインを有するメールアドレスの場合、現在 mixi では携帯用のアドレスとして認識されない仕様となっており、ご登録を完了していただくことはできかねます。恐れ入りますが、なにとぞご了承くださいますようお願いいたします。

また、こちらの仕様は現在 mixi モバイルをお使いいただける携帯電話端末に準じた仕様でございます。対応機種につきましては、下記の手順にてヘルプページよりご確認いただけますでしょうか。

■パソコンからのアクセスの場合 mixiトップ画面(http://mixi.jp) → 画面上部の「ヘルプ」 →  「mixiモバイル」 → 「Q.mixiモバイルの対応機種は? 」をクリック。

■携帯からのアクセスの場合 mixiモバイルトップ画面(http://m.mixi.jp) → 画面下部の「対応機種」 をクリック。

ご期待に添う回答が差し上げられず心苦しく存じますが、今回いただいたご連絡は、今後の改善課題として参考にさせていただきます。しかしながら、開発の都合上、ご要望にお応えいたしかねる場合もございますので、ご理解、ご了承のほど、よろしくお願い申し上げます。

なお、mixi では、法人様を対象としたパートナーアカウントを発行いたしております。パートナーアカウントをご利用の場合は、デベロッパー登録は不要となります。パートナーアカウントの詳細につきましては、下記のページをご参照いただけますでしょうか。

http://developer.mixi.co.jp/support/partner_account

※個人の方はデベロッパー登録が必要となりますので、恐れ入りますが、あらかじめご了承ください。


どうにも了承できないのですが、縁がなかったということなのでしょう。仕方ないですね。

とはいえ、mixi アプリは、 mixi サイト内で動くwebアプリを JS+Markup or Flash でつくるものなので、iPhone 開発者から見るとちょっと違うかな、というのはありますね。どちらかというと、まだ公開されていない mixi Connect の方にうまみがある。こちらが公開されるのを期待しながら待つとしましょう。

»  Substance: WordPress   »  Style: Ahren Ahimsa