はてなブックマーク - Androidでスレッド内でアラートを出すと
    このエントリーをはてなブックマークに追加

    プレゼン配信サービス「ZENPRE」で、次期バージョンに対応したAndroidアプリを作っている際に、
    ちょっと詰まった点を1つご紹介します。

    ウェブAPIにアクセスしてデータを取る間に別処理を、なんていうことをしたいときは、
    別スレッドを定義してその中で処理を書くかと思います。

    そして、そのデータ取得でエラーが発生したりしたら、Toastなどでアラートを出すでしょう。
    それをやりたくて、以下を書いてみました。

    new Thread(new Runnable(){
      @Override
      public void run() {
        try{
          connect("xx.xxx.xxx.xxx",80);
        } catch (Exception e) {
          Toast.makeText(PresenImageActivity.this, getText(R.string.alert_fail_connect), Toast.LENGTH_LONG).show();
        }
      }
    }).start();

    こういう風にすると、実際にエラーが発生したときに、以下のシステムエラーに出くわします。

    java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()

    別スレッド内でUIの操作を行うのはだめのようです。

    そこでHandlerの登場です。
    UI Threadが持つキューにジョブが入り、UIの操作ができるようになります。
    というわけで、以下のように書きました。

    private final Handler handler = new Handler();
    new Thread(new Runnable(){
      @Override
      public void run() {
        handler.post(new Runnable() {
          public void run() {
            try{
              connect("xx.xxx.xxx.xxx",80);
            } catch (Exception e) {
              Toast.makeText(PresenImageActivity.this, getText(R.string.alert_fail_connect), Toast.LENGTH_LONG).show();
            }
          }
        });
      }
    }).start();

    これで、別スレッド内で起きたエラーを表示できるようになりました。
    簡単ですが、備忘も込めて。

    今回開発したAndroidアプリにも実装したZENPREの新機能、「同期録画コンテンツ」を使って、
    見逃した勉強会をいつでも閲覧できる機能の紹介は次回。

      はてなブックマーク - Titanium MobileでiPhoneアプリを開発、リリースしました
      このエントリーをはてなブックマークに追加

      * 2010/11/17 17:00追記

      foursquareで誰もチェックインしない会社のMayerになってニヤニヤしている小山です。

      最近、個人的にですが、`CacooViewer’というiPhoneアプリをリリースしました。

      CacooViewer
      CacooViewer

      CacooViewerは、弊社と同じ福岡に本社を置くヌーラボさんの`Cacoo‘というリアルタイムなコラボレーションが可能なWebドローイングーサービスのモバイルビューワです。
      CacooViewerは非常に簡単なアプリですが、Flashで作成されているCacooの「iPhoneやiPadで作成した画像を見れない」という弱点を若干ながら補完するアプリになっています。

      で、

      実はこのアプリ、Titanim Mobileを利用して作られています。

      Titanium Mobileって何?

      Titanium Mobileとは、大雑把に言うと「JavaScriptを利用してiPhoneを初めとしたモバイルネイティブアプリが作成できるクロスコンパイル開発環境」です。

      Titanium MobileはTitanium Developerという開発環境を通じて利用できます。
      Titaniumはデスクトップアプリを作成することもでき(Titanium Desctop)、それらもTitanium Developerを通じて利用できます。

      Titanium Mobileは何がいいの?

      特に自分のようなWebシステムの開発者に言えるのですが、まず第一に「JavaScriptという普段利用している言語でiPhoneのネイティブアプリが作成できる」ということでしょう。
      やはり言語の壁というのは少なからずあります。学習コスト以前に「やろうかな」と思うことに躊躇してしまいます。それがJavaScriptという普段使い慣れているものが利用できるというのは非常に大きいです。

      次に言えるのは「コード記述量が格段に少なくなる」ということです。これはJavaScriptという言語の恩恵とも言えますが、Objective-Cでは記述が多くなる部分も、Titanium Mobileでは全て糖衣しているようなイメージを受けます。単純には言えませんが、開発スピードも早くなるかもしれません。
      逆にTitanium Mobileから提供されているAPI以外の機能を利用するのはなかなか難しそうです。

      最後に、「メモリ管理をする必要がない」ということです。これも逆に言えば「メモリ管理ができない」ということになるのですが、
      CacooViewerのような単純なアプリの開発では、本当にメモリを意識することなく開発ができます。
      自分みたいなゆとりプログラマには嬉しいメリットですw

      Titanium Mobileの情報はどれくらいあるの?

      これは最も重要な疑問だと思います。しかし、心配ありません。

      まず、1番初めに強調したい情報として@donayamaさん著の「Titanium MobileではじめるiPhoneアプリケーション開発(PDF)」という日本語電子書籍(PDF)があります。
      これがすごいです。もうなんというかO’Reilly本並です。この書籍でひととおりの開発が可能です。

      さらに@donayamaさん主導でtitanium-mobile-doc-jaという日本語情報の収集プロジェクトがあります。
      (さきほどの電子書籍はこのプロジェクトの成果のようです)
      こちらにもAPIに関する日本語解説や細かいTipsなどが数多く蓄積されています。

      さて、本当は最初に紹介するべきものとして公式APIリファレンスもあります。

      そして、開発を進めるに当たって最も強力な味方になってくれる公式サンプルアプリ「Kitchen Sinkがあります。

      Kitchen SinkはTitanium Mobileでできることをほぼ全て詰め込んだアプリです。
      その全てのコードがTitanium Mobileで作成されていて、さらにソースコードがすべて公開されています

      つまり、「何ができるのか」と「どう作るのか」を見ることができるのです。

      公式APIは若干間違っていたり古いことがあるらしく、Titanium Mobile開発者の間では「困ったときはKitchen Sinkを見ろ」が合言葉だとかそうでないとか。

      おそらく世のTitanium MobileでiPhoneを開発する開発者のiPhoneにはKitchen Sinkが実機転送されているのではないでしょうか?

      Titanium Mobileで開発できるというのは分った。じゃあ実際どんなもんなの?

      Kitchen Sinkも実機転送はできますが、App Storeに出ているわけではありません。
      またかつての規約に「クロスコンパイルだめ」的なものがあったせいか、心配することもあるかもしれません。
      「Titanium Mobileで作成してApp Storeでリリースできた」という話は聞きますが実際のその公開されているソースコードはなかなか探しにくいものです。

      というわけでCacooViewerのソースコードを公開します。

      github.com/k1LoW/CacooViewer

      そもそもCacooViewerを開発してみようと思ったのは、PHPMatsuriでユニットホスティング賞を受賞させていただき賞品としてiPod Touchをいただいたので、何かiPhoneアプリを作ってみようと思ったのがきっかけです。
      PHPMatsuriに感謝します(そしてこれがPHPMatsuriレポート最終章です)。

      また、コラボレーションをキーワードにしているヌーラボさんのコラボレーションツールCacooのアプリです。
      ソースコードもコラボレーションしない手はありません。

      このCacooViewerのソースコードは実際にTitanium Mobileを利用してビルドし、App Storeで配布されています。
      ソースコードをみてみると非常に少ないコード量で機能が実装されていることがわかります。
      初めて作成したTitanium Mobileのコードでいろいろツッコミどころ満載ですが、逆に「これで作れるのか」と思ってもらえれば幸いです。

      Titanium Mobileが良さそうなのは分った。

      どうですか?Titanium Mobileに興味が出てきましたか?

      かなりニッチな話題ですが、できるだけ多くの方がTitanium Mobileに興味をもってもらえれば嬉しいです。
      そしてそこからさらにJavaScriptへ興味をもってくれることを切実に願います。

      それを目的として、Fusicでは来週11月25日にTitanium Mobileの社内勉強会を開催予定です。
      実際に開発環境の作成からシミュレータへのビルド、あとリリースまでにつまづいた点などを
      簡単ですができるだけわかりやすく発表する予定です。

      もし需要がありそうでしたら、その模様をZENPREにて配信したいなと考えています。
      11月25日15:00よりZENPREにてTitanium Mobile社内勉強会を配信します。

      想像以上の反響ありがとうございます。みなさんJavaScriptへ興味をもってくれたということで非常にうれしく思います。
      発表時間としては1時間弱を見込んでいます。
      配信URLは当日@ZENPREの中の人に告知してもらいます。また、開始時間近くになりましたら、ZENPREトップページからリンクがたどれるはずです。

      よろしければ是非ご覧ください。

      それでは良いJavaScriptライフを。

      募集

      弊社では、絶賛エンジニアを募集しています
      役に立つ技術もそうでない技術も分け隔てなく、「技術に好奇心をもって行動すること」を評価してくれる環境に興味のある方は是非。

        はてなブックマーク - NIFTY Cloudのベンチマークをいろいろ比較
        このエントリーをはてなブックマークに追加

        Fusic 平田です。

        先日のPHP Matsuriで弊社社員がNIFTY Cloud無料利用券を持ち帰ってきました
        というわけで、ベンチマーク取っていろいろ比較。

        各プランの比較

        mini/small(1GB Mem)/medium(2GB Mem)/large(4GB Mem)でそれぞれベンチマークを取ってみました。
        UnixBench 5.1.2を使用して、

        # yum -y install gcc
        # wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz
        # tar zxf unixbench-5.1.2.tar.gz
        # cd unixbench-5.1.2
        # vim Makefile
        ※ GRAPHIC_TESTSとGL_LIBSをコメントアウト
        # make
        # ./Run

        ってな感じで取ってます。

        で、Index Scoreだけを書くとこんな結果になりました。
        mini 1CPU: 665.4
        small 1CPU: 1875.8
        medium 1CPU: 1844.8
        large 1CPU: 1720.5
        medium 2CPU: 2380.3
        large 2CPU: 3672.6
        グラフにするとこんな感じ(クリックで拡大)。

        1CPUの場合、small以上だとだいたい同じ結果になりました。
        スペック変えた分だけ素直に出てるな、といった印象1 です。

        手元との比較(仮想マシン同士)

        2vCPU/2GBメモリ同士の比較ということで、以前手元で組んだ仮想環境と比較します。
        比較対象は
        1. VMWare ESXi
        2. KVM on Redhat 5.4(qcow2)2
        で設定をいじらずに組んだ結果との比較です。
        Index Scoreがそれぞれ
        VMWare 1CPU: 838.0
        KVM 1CPU: 700.0
        medium 1CPU: 1844.8
        VMWare 2CPU: 1299.6
        KVM 2CPU: 1285.6
        medium 2CPU: 2380.3
        で、グラフだとこんな感じ(クリックで拡大)。


        載せてるマシンの性能差だったり設定差だったりするんでしょうが、スコア差がかなり大きいので驚きました。

        手元との比較(実機と比較)

        検証機(この辺でも使っているPowerEdge T105)が4CPU/4GBメモリだなと思い、これもlargeと比較してみました。
        # とっさに思いついたため、OSがUbuntu 10.04だったりします。


        これまた思った以上に差をつけられました。

        おまけ:さくらVPSと並べてみる

        さくらインターネットの田中社長がさくらVPSのunixbench結果を公開されていたので、これとも比較してみました。
        互いのサービス提供のスタイルから違うので一概に比較できるものでもないんですが、まあ参考程度にってことでとりあえずmini/smallと並べてみることに。
        ちなみにさくらのIndex Scoreは
        1CPU: 1157.7
        4CPU: 1540.6
        となってます。これまた優秀なスコア。

        まとめ

        NIFTY Cloudのスコアはさすがに優秀ですね。
        VPSじゃ足りない、なんて時には選択肢の一つとして十分ありなのかなーと思いました。
        構成もある程度柔軟にできますし。
        コントロールパネルも、特に使いにくい箇所はなかったです。

        miniより下があればもっと手軽に使えるのになーといった個人的な希望もありますが、まあそこは棲み分けみたいなものかなとも思っています。

        CM

        株式会社Fusicでは、エンジニアを積極的に募集中です。
        気が付いたら社員が賞を取ってきたり無料サービス券を獲得してくれたりする(こともある)Fusicで働いてみたい方は、こちらからエントリーをお願いします。

        1. Pipe-based Context Switchingの値がなぜかCPU数に反比例してますが。。。 []
        2. qcow2よりLVM割り当てたほうが良い結果出せていましたね。。。 []