2013年12月18日

ASP.NET MVCでリフレクションを使って任意のオブジェクトの一覧をCSV形式で返す

ASP.NET MVCで任意のオブジェクトのIEnumerableを受け取ってCSVファイルを出力するクラスを作ったので、久しぶりにGitHubに上げておこうと思う。

https://github.com/mikehibm/CSVResult


何も大した事はしていないけれど、リフレクションを使った例として今度の勉強会で使おうかと思っている。
上の様なデータが


この様にCSV形式でダウンロードされる。上はExcel 2010で開いた所。

CSV形式と言うと、データの中に引用符(ダブルクォート)やカンマが含まれていた場合の処理が面倒だ。

今回は
  • ダブルクォートは二重化する。("→"")
  • カンマは全角に変換する。
  • 改行コードは「|」に変換する。
というとりあえずのルールで実装してみた。

検索して調べた限りではカンマが含まれる場合は項目全体をダブルクォートで囲めば良いと書いてあるケースが多かったけれども、それだとExcel 2010でどうしても列がずれてしまうので、苦肉の策として全角にしてしまった。^^;

改行コードについても同じく、ダブルクォートで囲むだけではExcel 2010では上手く行かないみたいなので適当に「|」に変換する事にした。まあ実際に使う際には適宜仕様に合わせて変更すればいいかなと思う。



















 

2013年11月6日

子供向けにぜひおすすめしたい算数アプリ4選

cocos2d-x を使って子供向けの算数ドリルのアプリを作ろうとしていて、そのための参考に既存のアプリを調べていたら「これはすごい!」と思えるものがいくつか見つかったのでメモしておこうと思う。

Google Playで「算数」や「Math」で検索して大体200位ぐらいまでの結果の中から良さそうなものを選んで、かれこれ40個ほどをインストールして実際に動かしてみた上で厳選した結果なので、子供向けの算数アプリを探している方にはぜひ参考にして頂ければと思う。



第4位


Math Is Fun:陽気な数学


グラフィックがいい味を出している。ドリルというよりはパズル的。結構考えないと行けないのでどちらかと言うと高学年向けかも。大人でも遊べる。

Android app on Google Play  




第3位


Mathemagica Free - Kids Math


独特のグラフィックで最初はとっつきにくい感じがしたけれど、やってみるとなかなか面白い。問題のパターンが多くて、よく考えられている。
算数を始めたばかり、というレベルから高学年まで幅広いレベルに対応した問題が用意されているので、ぜひ有料版を買って長く遊びたい。

Android app on Google Play 




第2位


おサルさんの算数 ― 空飛ぶアドベンチャー


最初にこれをやってみた時は感動した。きれいなグラフィックと軽快な横スクロールでシューティングゲーム風のプレイは斬新だ。
子供はきっとのめり込むと思う。

Android app on Google Play  




そして一番「すごい!」と思ったのはこれ!


第1位


Hudriks Math For Kids


『美しいグラフィック、3Dアニメーション、特殊効果が、小学校に通うあなたのお子様にとって、算数の学習を忘れられないほど楽しいものにしてくれます。』

確かに美しく描かれたキャラクターと背景のグラフィックが素晴らしい! キャラクターが飛び跳ねるアニメーションの時にはちゃんと影の大きさも変わる。このクオリティの高さにはただただ脱帽。(見た感じ多分開発環境はUnityだろうな。) 
ワクワクさせられる音楽も良い。
ストーリーモードでは面倒な設定やレベル選択の必要も無く簡単な問題から自然に難しい問題に変わっていく辺りも良く考えられていると思う。

Android app on Google Play  








 

2013年10月25日

MacTypeでWindowsの文字がキレイになった!

MacとWindowsを並べて作業している時に、Windowsの文字の読み辛さがどうも気になって我慢出来なくなったので、MacType というソフトを入れてみた。


萌えないごみの日: Windowsのフォント環境に怒りを禁じ得ない人びとへ

gdi++Heliumを越えた(?)と噂のMacTypeをインストールしてみた | 情報科学屋さんを目指す人のメモ 

↑ MacTypeを入れる前 
(引用元: http://kirmav.blogspot.com/2010/05/windows-os-ipodiphone-macoslinux.html)



↑ MacTypeを入れた後
(引用元: http://kirmav.blogspot.com/2010/05/windows-os-ipodiphone-macoslinux.html)







結果、かなり読み易くなって大満足。

64bitのWindows 8.1で使っているけど特に問題も無さそうだ。

どうしてこれが標準機能になっていないのか、理解に苦しむな~。^^









 

2013年10月10日

初めてcocos2d for iPhoneでアプリを作った時に役に立ったリンクまとめ

目次





最初に目を通したチュートリアルなど


Cocos2D 2.XでシンプルなiPhoneゲーム開発チュートリアル | Ray Wenderlich 
iPhoneゲーム:スペース・シューターの作成チュートリアル | Ray Wenderlich 
cocos2d for iPhone: Class Hierarchy 



ARCを使うための設定


基本的には、cocos2dのソースコードを除外して自分で作成するファイルだけをARC対応にすれば良い。

cocos2dのテンプレートから作ったプロジェクトに対してXCodeのメニューから「Convert to Objective-C ARC」を選べば、かなりの部分を自動でやってくれる。

Cocos2D 2.X プロジェクトをARCに対応させる方法 | Ray Wenderlich 

下はcocos2dの部分をスタティックライブラリにしてリンクする方法。

【cocos2d, Objective-C】Cocos2でARCを使う。ハマりましたー! - 夏までにiPhone アプリつくってみっか! 



色々なコーディングTips


最初は基本的な画面遷移やボタンの作成方法でとまどったけれど、調べながらなんとかやるうちに慣れてきた。

cocos2d入門編 ボタンの作り方(CCMenuItem, CCMenu) | Learn iPhone, iOS, Objective-c, cocos2d and ....?  
ハマケン100%開発: cocos2d: <初級>スコア表示をローカライズしてみよう  
cocos2d でボタンを押して画面遷移をする | EUI - iPhoneやandroidスマートフォンアプリの開発を教えるスクール  
cocos2d - Changing the image of a CCSprite - Stack Overflow  
cocos2dでスケジューラを使う - 一定時間ごとや毎フレームごとに実行する処理を書く方法 | thaty 



ユニバーサル対応


iPhoneだけでRetina、非Retinaの違いと縦長サイズへの対応があるので3種類の画面がある。iPadにも対応しようとするとさらにRetina、非Retinaの2種類があるので合計5種類の画面サイズを考慮して開発しないと行けない。

この辺はAndroidだともう無限に近いぐらいのバリエーションがあるので、むしろあきらめて単に一つの画像を拡大/縮小してやり過ごしてしまうのだけれど、iOSだと「5種類しかないなら頑張って対応しないと行けないかも」という気持ちになってしまう。

その結果、背景画像の様に画面枠にきっちり合わせたい画像については同じ画像でも5つのバージョンを作って対応するような事になってしまう。(ものすごく面倒...)

各種ボタンやダイアログの背景の様なものについては、試行錯誤した結果、
  • iPhone 非Retina用
  • iPhone Retina / iPad非Retina用
  • iPad Retina用
の3種類のバージョンで済ませることにした。iPhoneのRetinaとiPadの非Retinaは画素数がそれほど変わらないので同じ画像を使ってもほぼ違和感がないのだ。(3種類作るのも結構面倒だけど。)

実際の画像ファイル名はそれぞれ
  • aaa.png
  • aaa-hd.png
  • aaa-ipadhd.png
の様にしておけばプログラムからは意識しなくてもcocos2dが上手く使い分けてくれる。

あとは、オブジェクトを画面に配置する時の座標指定を画面サイズに対する相対指定で行う様にしておけば iPhone 5の縦長画面にも対応出来る。

ただ、CocosBuilderの様なツールを使えばもっと楽になる事に気付いたのは開発がほぼ終わってからだった。最初から使っておけば良かった。


その他解像度関係で参考になったリンクはこの辺り。

cocos2dアプリをiPhone5の解像度に対応させる | mooapp  
【Objective-C】iPhoneとiPadを判別判定し処理分けする方法 | 和洋風KAI 



モーダルダイアログを表示する


アプリの設定画面がそれなりにかっこいいモーダルダイアログになる様にしたかったので色々試した。結局ゲーム本体よりもこの辺にかなり時間を費やしてしまった。

モーダルダイアログを表示するのは、下のページに載っている ModalAlertクラスを参考にして出来た。

Modal Alerts for Cocos2D | The Rombos-Blog 

ただ、これだとアニメーション中などに内容がダイアログの範囲外にはみ出した時にそのまま表示されてしまって非常に具合が悪い。ダイアログの枠から出たら表示されない様にクリッピングして欲しい。

そこで下のページで見つけたClippingNodeクラスを組み合わせて使う事にした。

Simple Masked Sprite | Obj-C based 2D engine for iOS, OSX and Android  
ClippingNode/ClippingNode.m at master · njt1982/ClippingNode · GitHub 

これでなんとか無事にイメージ通りのモーダルダイアログを表示する事が出来た。

正直言ってこれぐらいのコンポーネントはcocos2d自体かcocos2d-extensionsに入っているものだろうと思っていたけれど甘かった。


UIWebViewを使ってHTMLを表示する


設定画面の次は、アプリの「使い方」的な情報を表示する画面でUIWebViewを使ってHTMLを表示する必要が出てきた。ただcocos2dの画面にUIWebViewをどうやったら組み込めるのかが全く分からなかった。

ここでかなりつまづいてしまった。

UIWebView を使ってリソースバンドル内の HTML ファイルで、外部 JavaScript や CSS を読み込む - 24/7 twenty-four seven  
Cocos2dとStoryboardを組み合わせる - なんかの Log  
cocos2dのレイヤーへUIKitを追加、削除する方法。 « なんかもう実験場  
Cocos2dでWebViewを利用する - 自堕落なぺぇじ  
CCUIViewWrapper – wrapper for manipulating UIViews using Cocos2D  

結局、上の最後のリンクに載っているCCUIViewWrapperクラスを使う事にして上手く行った。




AdMobの広告を表示する


AdMob広告を表示する方法については、下の2つのやり方を見つけた。

cocos2dでAdMobを実装する « なんかもう実験場  
ios - Admob banner integration in Cocos2d 2.0 / Admob banner in iphone games - Stack Overflow 

比べてみるとどうも見た感じ後者の方がスマートな気がしたので、こちらの方法で実装した。ここは特に問題もなくさらっと実装出来た。



買って良かった本


実は最初に挙げたチュートリアルよりも前にまずこの本を読んだ。ひとつのゲーム(15パズル)を最初から作りこんでいく過程が丁寧に説明されているので、全体の流れをつかむのに最適だと思う。

cocos2dでつくるiPhoneゲーム―自由で速い、ゲーム用フレームワークを使う! (I・O BOOKS)







 

2013年9月28日

Android 4.3でSurfaceViewを使うアプリがランダムにクラッシュする件

Google Playで公開しているあるアプリを更新しようと思ってテストしていると、なぜか数回に一度の割合でクラッシュする事に気付いた。

エラーの内容はこんな感じ。
java.lang.IllegalArgumentException
: at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
: at android.view.Surface.unlockCanvasAndPost(Surface.java:255)


そういえば最近Google Playの管理画面で報告されるエラーが増えてきていた。自分のテスト端末(初代Nexus7)で出ているエラーと同じものだ。


エラーが起きている端末は全てNexus7。おそらく Android 4.3 を搭載している端末で問題が発生している様な気がする。


エラーが起きるのは、SurfaceViewを使ったActivityから一旦別のActivityを起動して、また元のActivityに戻ってきた瞬間だ。毎回というわけではなく大体5回に1回ぐらいの頻度なのでやっかいだ。

Backキーでホーム画面に戻ってからまたアプリを起動した時やタスク一覧から戻ってきた時は全く問題は起きない。


調べてみると下のスレッドが見つかった。

Issue 58385 - android - android 4.3 - IllegalArgumentException at SurfaceHolder.unlockCanvasAndPost(canvas) - Android Open Source Project - Issue Tracker - Google Project Hosting 

やっぱりAndroid 4.3 のSurfaceView にはバグがあるようだ。

しかも現状では回避策は無さそう。。。

SurfaceView を使っているアプリ全てが影響を受けるとすると、結構大きな問題になるのではないだろうか。

SurfaceViewを使うのを止めて View の Canvas に描画する様に書き直して対策した、という書き込みはあった。しかも皮肉な事にハードウェアアクセラレーションのおかげでかえってFPSが改善されたとの事。

とりあえず View.isHardwareAccelerated() の戻り値を見て、trueならView+Canvasを使って、false (かつOSが4.3より前) なら SurfaceView を使う様にすればなんとかなるかも知れない。

でも、同じ事をするのに2種類の方法で実装しないと行けないとなると、これは面倒だなー。

4.3を搭載した端末が一般的になる前になんとか早く解決してくれないかな〜。




2013/09/29  追記:

そういえば、4.0以降なら TextureView があった。これを使おう!

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES. ICE_CREAM_SANDWICH){
    //TextureViewを生成
} else {
    //SurfaceViewを生成
}

テストしてみた所上手く行っているみたい。
これで今回は一応解決!








  

2013年9月18日

iOSアプリとAndroidアプリを同時に開発する方法

最近はいろんな開発環境やツールがあるけれど、とりあえず以下のような選択肢で検討している。
  • Cocos2d-x
  • Xamarin + Cocos2d-XNA
  • Corona
  • Unity
  • Herlock
  • Titanium Mobile
  • Apache Cordova (PhoneGap)
  • Monaca



ガシガシ動くゲームを作るなら


Cocos2d-x


ようやくcocos2d for iPhoneで簡単なゲームアプリを作れる様になった自分としては、次はこれでAndroid版とiOS版の同時開発かなと思っている。

cocos2d for iPhoneで得た知識も使えるし、CocosBuilderなどの周辺ツール類も豊富なのが魅力。

最初は「AndroidではNDKが必要」というのを聞いただけで尻込みしていたけれど、採用事例は結構多そうで、ネットでの情報も増えてきつつあるみたいだ。

今この本を読みながら次のアプリ開発に向けて準備しているところ。
cocos2d-xによるiPhone/Androidアプリプログラミングガイド


Xamarin + Cocos2d-XNA


意外なところでは、C#で開発するという手法もある。XamarinとCocos2d-XNAというライブラリを組み合わせれば2Dゲームアプリも作れるみたいだ。

普段仕事で使っている言語はC#なので、本当に使い物になるのならぜひ使いたい。Windowsストアアプリの開発も出来るし、有料版ならVisual Studioとの統合も可能なのでかなり興味を惹かれる。

Xamarin StudioというIDEの無料版をとりあえずインストールしてぼちぼち試しているところ。


Corona


2Dゲームに特化した「エレガントなAPIで従来より10倍速く開発出来る」というのが売り文句の開発環境。Luaというスクリプト言語を使う。デモなどを見るかぎりでは確かに簡単に2Dゲームが作れそうだ。

ただ、プロプライエタリなソフトウェアなのであまり依存したくはないかな、と思ってしまう。



Unity


とりあえずインストール しては見た。面白そうな解説本も買って積んであるのだけれど、まだじっくり触る事が出来ていない。

次のバージョン(4.3)ではなんと2Dゲームに特化した機能も追加されてますますパワーアップするらしい。
Unity - Unity PRESS RELEASE – Unity、2D向けゲーム開発機能とクラウドサービスを新たに提供 
もしかするとこれからのゲームアプリ開発の大本命になるのではないかとも思ってしまうほど高機能。

ちょっと高機能過ぎて初心者は慣れるまでが大変。それにしてもUnityのアセットストアは強力。


Herlock


今日、こんなのも見つけた。国産の新しいクロスプラットフォーム統合開発環境。JavaScriptで開発出来る。だからBackbone.jsやTweenJSなどと言った既存のJSライブラリも使える。 しかもOpenGLで高速なグラフィック処理も可能。

iOS/AndroidアプリをJavaScriptで開発、OpenGL対応で高速描画の「Herlock」、クローズドβリリース - Publickey 
FlashライクなコードでOpenGLの処理を記述できるため、高速なグラフィック処理を実現する点も大きな特徴です。ゲームなど高速な画面書き換えなどを要求するアプリケーションに対応します。』 
Herlockの紹介動画 

これは期待大。早速クローズドベータ版の利用申請をしておいた。



ゲーム以外なら


Titanium Mobile


クロスプラットフォーム開発の老舗。


Xamarin


Xamarin Studio または Visual Studioを使ってC#で開発が可能。個人的にはかなり興味あり。


Apache Cordova (PhoneGap)


HTML5 + JavaScriptのアプリをラップしてネイティブアプリを作成するツール。

Apache CordovaとPhoneGapの関係が分かりにくい事になっているけれど、今の所は結局同じモノみたいだ。
Cordova(PhoneGap) とりあえずどんなものか | MUSHIKAGO APPS MEMO 
AdobeがApache Cordovaの私家版PhoneGapの3.0をリリース, APIをプラグイン化してより身軽に | TechCrunch Japan 


Monaca


内部的にはPhoneGapを利用しているらしい。ブラウザ上で利用出来るIDEが秀逸。Monacaデバッガというのもちょっと試してみたけれど、とても便利で感動した。

なんとなくApache Cordova(PhoneGap)を使うのであればこっちの方が生産性が高そうな気がしている。HTML5での実装に適したアプリを作る機会があったらぜひ使いたい。


今日の結論


この他にも色々な開発環境やツールがあると思うけれど、次は

Cocos2d-x
Unity

の順でやって行こうかなと思っている

余裕が出来たら、

Monaca
Xamarin

あたりにも手を伸ばしたい。

あとHerlockにはぜひとも頑張って完成度を高めて行ってもらいたい。応援してます!




 



2013年8月22日

Google Chromecast を買ってみた

なぜかオーダーしてから届くまでに3週間もかかったけれど、Chromecast がようやく届いた。




セットアップは実に簡単だった。

テレビのHDMI端子に本体を差し込んで、USBケーブルで電源につなぐ。(もちろん電源アダプタが付属している。)

テレビと壁の間に本体を差し込むスペースが無い時の為に、HDMIの延長ケーブルも付属しているのでちょっと感心した。

その後PCのブラウザで所定のURLを開く。するとアプリケーションをダウンロードする様に言われるので、ダウンロードしてインストールする。そのアプリを実行すると、Chromecast用のWifi設定やデバイス名称の設定を行う画面が表示される。何も変更せずにデフォルトのままで問題無しだった。


YouTubeがまるでテレビみたいに見える。(笑)


Netflixのストリーミングで映画のタイタニックも観てみた。
画質は普通にDVDで観ているのと変わらない様に感じた。


実は既にだいぶ前からリビングのテレビにはWindowsのPCをつないでYouTubeや動画を観ていたのだけれど、それよりも明らかに画質が良い様な気がする。

それに何より使いやすい。

手元のスマートフォンのChromecast対応アプリで出力先に自分のデバイスを選ぶだけ。

今の所対応アプリはYouTube, Netflix, Google Play Music/Movie(?) ぐらいしか無いみたいだけれど、これから増えてくるに違いない。対応アプリが増えればひょっとするとヒット商品になれるかも。(?)

現時点でも、YouTubeとNetflixのヘビーユーザーにはかなりオススメだと思う。





.

2013年7月25日

Google Appsアカウントを使ってGoogle Playストアで購入しようとするとエラーになる件

何やらGoogleから手頃な価格で面白そうなものが発売されたらしい。

Google、「Chromecast」発表。わずか35ドルで、テレビをオンラインビデオ対応にする新デバイス - Publickey http://www.publickey1.jp/blog/13/googlechromecast35.html



35ドルならこれはとりあえず試さなければ、と早速Google Playストアから購入手続きを開始した。



ところが、いざ支払いをしようとすると途中でエラーメッセージが表示されて先へ進めない。


何なんだこれは...と思いながら「こちらからお問い合わせください」のリンクをクリックしてメールアドレスを入力して送信する。


これでなんとか復旧するかと思ったけれど、しばらくしてGoogleから自動返信のメールが来る。

Your Google Apps account has been disabled by your administrator. Please contact your Google Apps administrator for more information. Your Google Apps administrator is usually someone outside of Google who set up your Google Apps account.

これを読むとどうもGoogle Appsのアカウントを使っている事に原因がありそうな感じだ。でもGoogle Appsの管理画面を隅からすみまで探しても問題になっていそうな所を見つける事が出来ない。

小一時間検索してやっと次のリンクを見つけた。

https://support.google.com/wallet/contact/ga_reset



どうもGoogle Appsで管理しているアカウントをGoogle Playで使っている場合、アカウントのパスワードをリセットするとセキュリティ保護のために自動的にGoogle Checkout (Wallet)へのアクセスが停止される仕様になっているらしい。

https://support.google.com/wallet/answer/2909022?hl=ja
お客様のメール アドレスのパスワードがお客様の組織の管理者によって再設定されたことが検出されたため、またはお客様がご自身のパスワードを変更したことが検出されたため、お客様のお支払い情報を保護するための予防措置としてアカウントが停止されました。ただし、この停止の影響を受けるのは Google ウォレットへのアクセスのみであり、Google Apps のその他のサービス(Gmail、カレンダー、Google サイトなど)には引き続きアクセスできます。


よく分からない仕様だけれど、とにかくGoogleとしてはお金を扱うWalletへのアクセスは厳重にしたいという事の様だ。検索すると同様にGoogle Playで買い物が出来ないよ〜、という声がいくつか見られた。

とりあえず上のフォームにメールアドレスや「最後の注文の詳細情報」などを入力して送信。

これで無事回復することを祈りながら今結果を待っているところ。

しかしなんとも不便な仕様なので、これはぜひとも改善してもらいたいところだ。



追記:
その後24時間かかるかかからないかぐらいでGoogleの日本の担当者の方から日本語でメールが来て、さらにその数時間後に無事Walletのアカウントが回復して買い物が出来るようになった。Googleの対応は意外に早くて嬉しかったのだが、連絡用のフォーム(https://support.google.com/wallet/contact/ga_reset)にたどり着くまでにさんざん検索結果を漁らなければならなかったのが少々残念だった。






 

2013年6月22日

初めてiPhone/iPadアプリを作った時に役に立ったリンクまとめ

Xcodeのキーボードショートカット


キーボードで完結!ハイスピード Xcodeコーディング
http://www.slideshare.net/cocopon/xcode-12535772

開発レシピ:Xcodeの常用ショートカットキー | iOS開発者@日本
http://www.iosjp.com/dev/archives/92



UIViewに角丸の枠と影を付ける


UIImageに影をつけて角も丸くする | ニョホホホhoooo!の2011年08月27日の2番目の記事
http://plaza.rakuten.co.jp/tech1985/diary/201108270001/

頭と尻尾はくれてやる! 画像に影を付けたいのでいろいろプロパティをいじってみた
http://ringsbell.blog117.fc2.com/blog-entry-494.html

【iPhoneアプリ開発】UIImageViewに枠とドロップシャドウを設定する方法 | WEB開発お役立ちブログ
http://websystem.biz/?p=34



UIViewのタップイベントを取得する


UIViewのタップを検知|Penta creation
http://pentacreation.com/blog/2012/12/121218.html



Objective-Cの基礎


逆引きObjective-C for iPhoneアプリ - 定数(#define,const)
http://www.objectivec-iphone.com/introduction/const/define-const.html

Objective-Cのアクセサの話 - As Sloth As Possible http://blog.livedoor.jp/faulist/archives/1480850.html

【Objective-C】配列(NSArray、NSMutableArray)の要素(値)をランダムに並べ替える方法 - creativi.tea
http://teapipin.blog10.fc2.com/blog-entry-221.html

Objective-Cでの配列シャッフル - Dolice Lab
http://lab.dolice.net/blog/2013/03/14/shuffle-the-array-in-objective-c/



StoryboardのAuto Layoutを理解する


ios - Xcode 4 and Interface Builder: Editing Vertical Spacing Constraint (Anchor Top, not Bottom) - Stack Overflow
http://stackoverflow.com/questions/14107799/xcode-4-and-interface-builder-editing-vertical-spacing-constraint-anchor-top

Using Auto Layout | Building Responsive User Interfaces in iOS6 | InformIT
http://www.informit.com/articles/article.aspx?p=2015112&seqNum=2

Beginning Auto Layout in iOS 6: Part 1/2 | Ray Wenderlich
http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2



Storyboardを使った画面遷移


StoryboardとSegueの基本 - Kesin's diary
http://kesin.hatenablog.com/entry/20120908/1347079921

iOSゆとりプログラミングのススメ - 仕事人の開発日誌
http://d.hatena.ne.jp/omaemona01/20111204/1322961924

Storyboardを使った画面遷移と値の受け渡し 其の二 : てるてる坊主
http://teru2-bo2.blogspot.com/2012/03/storyboard_28.html

複数のStoryboard間を遷移するチュートリアル | XCode始めました。
http://xcode-beginner.blogspot.com/2012/04/storyboard_29.html




意味不明のクラッシュを回避する


OS X 10.8.4でXcodeでiOS Simulatorを実行したときにSIGABRTでアプリがクラッシュすることがある問題の暫定的な対処(修正済み) - 24/7 twenty-four seven
http://d.hatena.ne.jp/KishikawaKatsumi/20130606/1370509631



途中でプロジェクト名を変える


Xcodeのプロジェクト名、Bundle Identifier、アプリ名の関係 - Debian GNU/Linux 3.1 on PowerMac G4
http://d.hatena.ne.jp/paraches/20130211

Xcodeのプロジェクト名を変える | Morizotter Blog
http://blog.morizotter.com/2013/03/03/change-xcode-project-name/



Homeボタンでアプリを一時停止せず終了させる


Cocoaの日々: iOS 4.0 でアプリを一時停止しない設定 - UIApplicationExitsOnSuspend
http://cocoadays.blogspot.com/2010/06/ios-40-uiapplicationexitsonsuspend.html



ユーザーデータを永続化する


iOS - NSUserDefaultsを使うときはWrapして使うと便利 - Qiita [キータ] http://qiita.com/aguuu/items/2af840ded249b3e4e9bb



UIをアニメーションする


UIViewで手軽にアニメーションを実行する方法 - プログラミングノート
http://d.hatena.ne.jp/ntaku/20090226/1235659545

逆引きObjective-C for iPhoneアプリ - CABasicAnimationの基本的な使い方(移動・回転・拡大・縮小)
http://www.objectivec-iphone.com/animation/CoreAnimation/CABasicAnimation.html

Objective-Cと戦うブログ: Core Animationの基礎的なところ
http://obc-fight.blogspot.com/2012/10/Core-Animation-fundamental.html

iOS - Core Animation 中級編 - Qiita [キータ]
http://qiita.com/inamiy/items/bdc0eb403852178c4ea7

CABasicAnimationを試してみた | スマートフォンアプリ開発会社のエンジニアブログ
http://engineerblog.glpgs.com/index.php/archives/165

Core Animation で画像を回す (フェンリル | デベロッパーズブログ)
http://blog.fenrir-inc.com/jp/2010/09/transform_animation.html


パーティクルを表示する


テンポラリー無題 › 忙しい人のためのUIView(UIKit)でパーティクル。CAEmitterLayer & CAEmitterCell 。
http://www.tmpmudai.net/?p=448

CAEmitterLayer でクリスマスは爆発しろ - iOS Advent Calendar 2011
http://d.hatena.ne.jp/KishikawaKatsumi/20111202/1322835912

iOS 5 UIKit "パーティクル•システム"チュートリアル | Ray Wenderlich
http://www.raywenderlich.com/ja/26781/ios-5-uikit-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AF%E3%83%AB%E2%80%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB

UIKit上でパーティクルエフェクトを表示する - Over&Out その後
http://d.hatena.ne.jp/shu223/20130315/1363298992


画面サイズの違いに対応する


iPhone, iPad, iPod touchの画面サイズまとめ | noriaki blog
http://blog.noriaki.me/2012-11-18-display-size-iphone-ipad-ipodtouch

【Objective-C】iPhone5(4インチ)のサイズ判別など、画面サイズの取得にはUIScreenが便利 - しすぜろ
http://syszr.com/s13.html

Objective-C - スクリーンのウィンドウサイズ(WindowSize)を取得する方法 - | Learn iPhone, iOS, Objective-c, cocos2d and ....?
http://programming-ios.com/objective_c-window-screen-size/

[xcode][objective-c][ios][cocoa]Storyboardの画面サイズの範囲外なので配置できない問題
http://pnome.blog88.fc2.com/blog-entry-111.html



UIViewの背景に画像をリピート表示する


[iOS] UIViewの背景画像を設定する | Hi-farm blog
http://blog.hi-farm.net/2010/11/21/ios-uiview%E3%81%AE%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/



BGMと効果音を鳴らす


第9回 ゲームの仕上げ | Think IT
http://thinkit.co.jp/story/2011/06/03/2145?page=0,1

[iPhone 開発メモ] AVAudioPlayer を使用して音楽を再生する | Sun Limited Mt.
http://blog.syuhari.jp/archives/1015

サウンドを再生する:iPhoneアプリ開発雑記帳
http://iphone.o-84.com/dev-tips/knowhow/play-sound/

イチから学ぶiPhone/iPadアプリ開発 第12回 「BGMや効果音を付けよう!」
http://www.bhnt.co.jp/blog/%E9%9B%91%E8%A8%98/%E7%A4%BE%E5%93%A1%EF%BC%9Acobra/%E3%82%A4%E3%83%81%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6iphoneipad%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E7%AC%AC12%E5%9B%9E-%E3%80%8Cbgm%E3%82%84%E5%8A%B9%E6%9E%9C%E9%9F%B3%E3%82%92%E4%BB%98/

音楽と、効果音の再生 (iPhoneアプリ開発記 [fou media lab.])
http://www.fou.ne.jp/iphone/2009/10/post_3.html




広告を表示する


新しいAdMob SDK(Google AdMob Ads SDK for iOS)での広告設置方法 - Over&Out その後
http://d.hatena.ne.jp/shu223/20110324/1300985815

AdMob Ads SDK を Xcode に追加してアプリ内に広告を表示する方法 | Maccle
http://maccle.com/develop-ios-app/how-to-add-google-admob-ads-sdk/


iPad対応(ユニバーサル化)


Xcode4.2におけるiPhone/iPadユニバーサルアプリ化: iPhoneアプリ開発備忘録
http://iphone-app-developer.seesaa.net/article/235646213.html

[Xcode 4.3] iPhone アプリを iPad 対応のユニバーサルアプリにする方法 | ラクイシロク
http://rakuishi.com/iossdk/3733/



タイマー処理の改善


NSObject Class Reference
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelector:withObject:afterDelay:

xcode - Cancel [self performSelector:... withObject:nil afterDelay:20]; - Stack Overflow
http://stackoverflow.com/questions/5055869/cancel-self-performselector-withobjectnil-afterdelay20



アプリの紹介動画を作る


iPhoneの画面をキャプチャして動画撮影できる「Reflector」の使い方~PCツールを使って、非脱獄でも録画可能に!~
http://applian.jp/tweak/iphone_display_recorder/

iPhone・iPadの画面をまるごと動画でキャプチャーできるアプリ『Display Recorder』
http://www.excite.co.jp/News/apple_blog/20120619/TouchLab_2012_2_4184.html




アプリを宣伝する


こんなにあった! iPhone/Androidアプリを出す時にリリースを送りたい媒体53個総まとめ【全て無料】
http://plus.find-job.net/iphone-android-press-site







-----------------------
以上!

2013年6月21日

はじめてのiPhoneアプリ開発

iOSでアプリを作ってみた感想


今までアプリ開発はAndroidひとすじでやって来たけれど、せっかくMacBookAirもあることだしそろそろiOSアプリもやって見たくなった。

初めてXcodeを起動した時はEclipseとあまりにも違うので戸惑った。

昔はC言語で徹夜で仕事したりもしていたけれど、Objective-Cというのはまた独特の文法があってこれも最初はびっくりした。メソッドを呼ぶのにかぎカッコで囲むとは。

まあどれも最初の1週間でほぼ慣れた。

やってみるとiOSアプリの開発は結構面白い。正直言ってAndroidよりも面白いかも。

なぜそう感じるかというと、まずシミュレータの動作が軽いのが一因ではないかと思う。

それからGUIの設計ツール(ストーリーボード)がとても使いやすい。XMLをいじってはいちいち実機で確認しながら進めるAndroidとは効率がかなり違う。

あと、プログラムで画面の一部をアニメーションさせるときの書き方もiOSの方が書きやすい様に感じる。まあイディオムみたいなものなので一度覚えてしまえばそんなに違いはないけれど。

それから、パーティクルを実現するクラス(CAEmmiterLayerなど)が標準で含まれているのは素晴らしい。

全体的に見て、もし初心者にアプリ開発を教えるのであればAndroidよりはiOSの方が教えやすいように感じた。


お世話になっている本



まるごと学ぶiPhoneアプリ制作教室


はじめて開発するならこの本がかなりおすすめ。下の2冊の教科書的な構成と全く違って、本当に作者と一緒に開発しているような感じで、簡単な事から順を追ってアプリが出来て行く様になっている。断片的な知識は読めば分かるけど、僕のように最初のとっかかりの流れが分からないという人にはとても良いと思う。
サーバー側(GAE)のJavaアプリケーション開発のための解説まで入っているけれど、これはさすがに蛇足だったかなと思う。むしろその分のページ数でもっと別のiOSアプリ(特にiPad用)の制作例を載せて欲しかった。







よくわかるiPhoneアプリ開発の教科書【iOS 6&Xcode 4.6対応版】


プロの力を身につける iPhone/iPadアプリケーション開発の教科書











2013年4月25日

ロードバランサーを使って複数のWebサーバーでASP.NET MVCアプリケーションを動かした時のメモ

ハードウェアの構成


ロードバランサー1台
Webサーバー3台
DBサーバー1台


ソフトウェアの構成


Webサーバー
 Windows Server 2008 R2
 IIS7.5
 ASP.NET MVC 4

 IISではひとつのWebサイトの下に複数のASP.NET MVCアプリケーションを配置。

DBサーバー
 Windows Server 2008 R2
 Microsoft SQLServer 2008


パターン1 - それぞれのWebサーバー内でSessionを管理


ロードバランサーが「セッション維持機能」を持っている事が前提。

Session管理は State Service を使う。

State Service を使う為のweb.configの設定

<sessionstate mode="StateServer">      stateConnectionString="tcpip=127.0.0.1:42424"
      stateNetworkTimeout="10" />
各Webサーバーで「ASP.NET State Service」が自動起動する様に設定しておく事。




パターン1で発生した問題


ロードバランサーのセッション維持機能が上手く動いていない!
そのため時々Webサーバーが切り替わってログイン画面が表示されてしまう。

ロードバランサーのベンダーに調査してもらっても「設定に特に問題は見つかりません。アプリ側の問題では?」との事で、解決せず。

教訓:しょぼいロードバランサーは使わない!

今回のプロジェクトではロードバランサーは自分達の管理下にはないので、パターン1はあきらめる。



パターン2 - SQLServerでSessionを管理


ロードバランサーのセッション維持機能に頼らずにSession情報をDBに格納してWebサーバー間で共有する事にする。これならWebサーバーが任意のタイミングで切り替わっても大丈夫。

1. SQLサーバーにSession情報を保存するためのデータベースを作成する。

 aspnet_regsql.exe -S server -U username -P password -ssadd -sstype p

 ※tempdbに保存するのではなく永続化するために -sstype pオプションが必要。

このコマンド一発でデータベースの作成、テーブルの作成、期限切れのSession情報を削除するためのJobの登録まで行なってくれる。

 aspnet_regsql.exeのヘルプはこちら


2. MachineKeyの設定を共通化する。

全てのWebサーバーでMachineKeyを共通化しておかないと、認証クッキーやその他さまざまなデータの暗号化・復号化の処理がWebサーバーが切り替わった時に上手く行かなくなる。

IIS7.5の管理画面で該当のアプリケーションを選択すると、「MachineKey」という項目があるのでそれを開く。


画面右側の「Generate Keys」をクリックして「Apply」するとweb.configファイルのsystem.webセクションに下の様な設定が追加される。

<machineKey decryptionKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" validationKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
あとはこの部分をコピーして他の2台のWebサーバーのweb.configにペーストすればOK。

参考URL:How To: ASP.NET 2.0 で MachineKey を構成する方法




3. IIS Metabase上のSite IDを共通化する。

これをしておかないと、Webサーバーが切り替わった時にSQLServer側で別アプリケーションとして認識されてしまって、Session情報の共有が出来なくなってしまう。今回はこれでハマった。。。


対策としてはSQLServerのストアドプロシージャを修正するという方法もあるみたいだけど、IIS7.5以降なら下の方法で簡単にIDを共通化出来るみたい。

IIS上で何度かWebサイトを作成したり削除したりしているとIdの値が変わってしまうので、該当のWebサイトを選択した上で「Advanced Settings」を開いてIDの欄に他のサイトと重複しない値を入力する。


他の2台のWebサーバーでも該当のサイトが同じIDを持つ様に入力する。

この設定を行った後は、IISを再起動する必要があるので注意。




おまけ:Forms認証を使う場合の注意点



  • 一つのWebサイトの下に複数のアプリケーションを配置する場合は、アプリケーション毎に認証クッキーの名前を変える事。

  • 認証クッキーのパスは「/」から変更しない方が良い。
    (ブラウザはクッキーのパスについては大文字小文字を区別するが、サーバーはURLの大文字小文字を区別しない為。)










.

2013年3月16日

Google Readerの代わりはGASで作ろう

GAS(Google Apps Script)というものがあるのは知っていたけれど、今まで使う場面がなかったので勉強していなかった。


ざっとリファレンスに目を通して出来そうな事を見てみると、毎日重宝しているGoogle リーダーの代わりになりそうなものを作れそうな気がしてきた。



アイデアとしてはこんな感じ。



  • フィードURLとその最終取得日をスプレッドシートに保存。
  • 定期的に全フィードをチェック。
  • 最終取得日より新しい記事があればメールで送信。
  • 記事1本を1メールとして自分宛てに送信。
  • Gmailでメールを受けて自動でラベル付け。


この記事を見てEメール送信のスクリプトを試してみたら、定形メールの自動送信は本当に簡単に出来た。

【GAS】簡単!Google Apps Script とAPIを使った自動メール配信システム作成 | カグア!Googleアナリティクス解説Blog

これは使えそうだ。




RSSの管理をGmailで行なうというアイデアは最近どこかで読んだ様な気がするけれど、確かに1記事1メールとしてGmailに取り込んでしまえば、未読・既読の管理も簡単だしスターを付けるのも簡単に出来る。

しかもスマートフォンからもPCからもさっとアクセス可能。


新しいブログなどを見つけてRSSフィードを登録したい時も、Google Appsのフォーム機能を使えば登録画面は簡単に出来そうだ。

フォーム機能を使わなくてもそれこそScriptを使えば(ブックマークレットなども併用して)ブラウザからクリック一発でフィード登録、という事も可能かも知れない。


という事で今度時間がある時にぜひ作りたい。


ああ、また「やりたい事リスト」の項目が増えたなー。(笑)








2013年3月6日

Azure Mobile ServicesがAndroidに対応! Android2.2以降で実行可能


Windows Azure Mobile ServicesがAndroidに対応したそうだ。

Windows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More… - ScottGu's Blog


これでバックエンドのサービスを簡単に作成する事が出来る。嬉しい!

ところが説明を読むと、「Android 4.2以降が必要」という注意書きが。。。

「え、うそでしょ~。4.2以降なんて現時点で使えるのはNexusシリーズぐらいじゃないの...」

と思ったけれども、サンプルコードをダウンロードしてマニフェストファイルを見ると、

android:minSdkVersion="8"
android:targetSdkVersion="17"

となっている。

なので、アプリの動作環境としてはAndroid 2.2以降なら問題ないみたいだ。


(「4.2以降が必要」というのは開発用のSDKのバージョンを指している様だ。)



試しに Android 2.3.5 が入ったHTC Evoでサンプルアプリケーションを動かしてみた所、Todoリストにデータを追加する部分については問題なく動作した。


Azure Mobile Servicesの管理画面からデータを確認したところ。



Todoリストのチュートリアルはこの後「ユーザー認証の追加」や「GCMを使ったプッシュ通知」の実装に続く。

まだそこまでは試していないけれど、多分Android2.2以降なら問題無さそうな気がするので、まずは一安心した。


これでさらにアプリ開発の可能性が広がりそうだ!



*追記:
ここにははっきり「2.2+」と書いてあるので、やっぱり大丈夫そうだ。

MS Open Tech develops the open source Android SDK for Windows Azure Mobile Services - Interoperability @ Microsoft - Site Home - MSDN Blogs







 

2013年2月19日

AndroidでAnimation終了後にViewを削除する

動的に追加したViewに対してアニメーションを実行して、アニメーションが終了したらそのViewを完全に削除してしまいたい、というケースがあってハマったのでメモ。


基本的にはアニメーションの終了後に何かをするには、前もってAnimationListenerをセットしておけば良いはず。

AnimationListener の onAnimationEnd というメソッドをオーバーライドして処理を書く事になる。 

この onAnimationEnd の中でアニメーション対象のViewを親のViewから削除しようとして、次の様に書いたら parentView.removeView の所で エラーで落ちた。




調べてみると、どうやら onAnimationEnd 内でUIの処理をするとまずいみたいだ。parentView.post() を呼んでUIスレッドに処理をRunnableの形で渡せば問題なく実行出来る様になった。






  

2013年2月15日

jQueryのイベントで return false はしない方が良い

前回の記事を書いている時に検索にヒットしたリンクでちょっと「へぇ~っ」となったものがあったのでメモ。

 javascript - event.preventDefault() vs. return false - Stack Overflow

イベントのハンドラを書く時に、jQueryのイベントと通常のDOMのイベントでは

return false;

の意味が違うらしい。まずい、今まで気にしていなかった。。。


jQueryのイベント:

  •   デフォルト動作を抑止。
  •   イベントバブリングを中止する


通常のDOMのイベント: 

  •   デフォルト動作を抑止。(但しブラウザのバージョンに依存)
  •   イベントバブリングの中止はしない


という事らしい。


jQueryのイベントハンドラで return false; をしてしまうと、イベントバブリングまで中止されてしまう。これはあまり好ましくない事だ。

なぜイベントバブリングを中止する事が好ましくない(or やってはいけない)のかは、下の記事を読めばよく分かる。


jQuery Events: Stop (Mis)Using Return False | Fuel Your Coding


jQueryのバブリングと、「return false;」「e.stopPropagation();」「e.preventDefault();」について | ふじこのプログラミング奮闘記


JavaScriptのイベント伝播について覚書 | Linuxで自宅サーバ構築




結論



jQueryのイベントハンドラでは、

1. デフォルト動作を抑止するには、event.preventDefault() を 使う。

2. バブリングを中止する必要がある場合は、event.stopPropagation() もしくは
event.stopImmediatePropagation() を場面に応じて使い分ける。

3. return false は親要素にもイベントハンドラがアタッチされている場合などにバグの原因になり得るので、使う場合は十分に注意する。(もしくは使わない。)

というのが良いみたいだ。







  

[jQuery] Enterキーでフォーカスを移動するには

Enterキーでフォームを送信したくない時は


あるWebアプリケーションのフォームで、Enterキーを押してもSubmitされない様にする必要があって、ちょっと調べた。

リターン(Enterキー)でフォームを送信しない方法: 小粋空間

とりあえずこの記事の「4.押されたキーを判定して抑止する」の所に書いてある方法で対応出来た。


Enterキーで次のフィールドにフォーカスを移動するには


次に、どうせならEnterキーで次のフィールドにフォーカスを自動で移動させたいな~、という事になった。やってみたら、jQueryのおかげでこんな感じで割りと簡単に出来た。

Enterキーが押された時にfalseを返すのではなくて e.preventDefault() を使う様に変えた。その理由はこちらを参照。


Shift+Enterキーにも対応するには


さらについでにShift+Enterキーでの逆順の移動にも対応させてみた。




もっとキーイベントを細かく制御するには


こんな感じで作りだすと、欲が出てきてさらにファンクションキーや矢印キーにも対応したくなってくる。でも、自分で作らなくても何かあるんじゃないかな~という気もする。

探してみたら次の様なjQueryプラグインが見つかった。
Enter/Tab項目移動とFunctionKey制御をplugin化 - せかにゃ~

これで機能的には申し分無さそうだ。ただソースコードを見ると対象のフォームがdocument.forms[0]に固定されていたりするので場合によっては少し変更する必要があるかも知れない。


キーイベントを拾って独自の関数を実行するだけならこういうのもあった。(フォーカス移動の処理は自分で書く必要があるみたいだ。)
jQuery.gpKeyでキー操作が楽々に。 | Ginpen.com



最近はWindowsアプリケーションをWebに置き換える案件も多いので、きっとこの様なプラグインは役に立つと思う。




 

2013年2月14日

Azure仮想マシン上でNode.jsアプリケーションをデーモン化してユーザー権限で運用する方法

作ったNode.jsアプリケーション


初めてのNode.jsアプリケーションを作ってみた。
作ったのは、ここに載っていたもの。
Androidアプリからnode.js+Socket.IOと双方向通信する

早速Windows Azure上で動かそうと思ったのだけれど、いくつか苦労したのでメモしておきたい

「Windows Azure Web Sites」は現状ではWebSocketは不可


まず、「Windows Azure Web Sites」は現時点では使えない。このサービスのベースとなっているIISのバージョンが7.5で、まだWebSocketプロトコルに対応していないからだ。

試しにやってみると、ブラウザ同士で試すと問題なく動くが、実際にはWebSocket以外のプロトコルにフォールバックして動作している。この状態だとAndroidのネイティブアプリケーションからsocket.ioライブラリを使用しての接続は上手く行かなかった。

近い将来これが IIS8.0 にアップデートされてWebSocketが使える様になったら、多分これから下に書く様な面倒な作業は不要になると思う。


「Windows Azure 仮想マシン」でUbuntuサーバーを立てる


仕方ないのでAzure上にUbuntu仮想マシンを立ち上げる事にした。

Ubuntu 12.04 Serverのインスタンスを起動して、Node.jsやその他のパッケージをインストールするのは、何の問題もなく完了。

 node folder/app.js

で起動して3000番ポートで接続を待ち受ける。と同時にAzure仮想マシンの設定でエンドポイントを追加して、外側の80番ポートを内側の3000番ポートにつなげる。これでブラウザからもAndroidアプリからも接続出来て問題無く動作させる事が出来た。

素晴らしい!

ただ、Android側のネットワークをWiFiから3G回線にすると動作しなくなるという現象に遭遇した。どうやらキャリア側で80番ポート上のWebSocketの通信を遮断しているみたいだ。(というよりおそらく、キャリアが使っているProxyサーバーがWebSocketに対応していないのだと思う。)

これに対する対策として、Azure側のエンドポイントのポート番号を443に変更したら問題なく動作する様になった。(特に443番でなくてもいいと思うけれど、ユーザー側にFirewallがある場合に、外向きのTCPパケットがブロックされている可能性が80番の次に低いポート番号という事で、443番にしておいた。)


Node.jsアプリケーションをデーモン化したい


Node.jsのアプリケーションをデーモン化して動かすには、forever を使うのが簡単らしい。

foreverコマンドを実行するスクリプトを rc.localに追加するなり、/etc/rc2.d フォルダにシンボリックリンクを張るなりすればサーバー起動時に自動で実行される様になる。


ユーザー権限でデーモンを実行したい


ただ、root権限ではなくユーザー権限で実行する方法がすぐには見当たらなかったので、調べるのにちょっと時間がかかった。結論としては次の2つのどちらかが良さそうだ。

方法1: suコマンドと forever を使う

 su - [user] -c"cd [/home/directory] && forever start [folder]/app.js"

というコマンドへのシンボリックリンクを /etc/rc2.d フォルダに作成する。(または/etc/rc.localの最後に追加する。)


方法2: Upstartを使う
 

 Upstart を使ってお手軽 daemon 化 - インフラエンジニアway

ここに書いてある方法で initctl コマンドでデーモンとしての実行を管理出来る様になる。
実行ユーザーを指定するには、

 setuid [user]

を設定ファイルに追加すればOK。


Ubuntuの標準的な方法としては Upstart を使う方が良さそうなので、とりあえず今はこれでいいかな、と思う。







 

2013年1月30日

初めてAndroidアプリを公開して1年経過した

作ったアプリ


1年半ぐらい前にこんな記事を書いて、オセロゲームを作ってみた。
http://blog.makotoishida.com/2011/06/android-1.html 

6月から作り始めて、9月に一応大体の機能が完成。その後アイコンを作ったり細かい改善をしたりして、2011年の12月にGoogle Playストアに公開した。

Google Play
https://play.google.com/store/apps/details?id=com.ishida_it.mireversifree



1年間の有効インストール数の推移


公開してから全く更新せずに1年を経過した頃からアクティブユーザー数に減少傾向が見られた。
ちなみに下段のグラフの水色の線はAndroid 2.3、緑の線はAndroid 4.0以降。
グラフの右端で少し右肩上がりになっているのは、Undo機能を追加する更新をした後。

現在の有効インストール・ユーザー数(インストール後、削除していないユーザーの数)は約7400。総ダウンロード数は2万1200となっている。

細々とした数字ではあるけれど、公開してからほぼ1年間放置状態だったのにしては結構インストールされているのではないかと思う。

やはり誰でも知っているオセロゲームだから、ダウンロードする前に「このゲームは面白そうかどうか」を考える必要が無いというのが大きいのだろうと思う。

とは言えさすがに1年も更新せずにいると、新たにインストールされる数よりもアンインストールされる数の方が上回ってアクティブユーザー数が徐々に減少し始める。Google Playの検索アルゴリズム上なんらかのマイナス評価が加えられるのかも知れない。


Undo機能追加でちょっと持ち直す



2012年の12月になってようやくUndo機能を追加する更新を行った。するとやはり新規インストール数がまた上昇しだした。更新によってユーザーの目に付く機会が多少増えたみたいだ。

この直後、ユーザーさんから「Undo機能を付けてくれてありがとう」というメールをもらったのには驚いた。と同時に単純に嬉しかった。アプリ開発者のモチベーションは案外こういう些細な事で保たれるのではないかとも思った。


せっかくなので大幅にリファクタリング


ただ、Google Playのレビュー欄に「コンピュータが弱い」という評価が多かったので、今年の1月に大幅にリファクタリングを行なって思考ルーチンの高速化と強化をしてみた。

思考ルーチンだけでなく盤面のデータ構造から書き直す様な大変更になったのでなかなか大変だったけれども、何とか先日新しいバージョンを公開する事が出来た。

これでまた新規インストール数が増えてくれればちょっと嬉しい。初めて公開したAndroidアプリという事もあってか、何となくよちよち歩きの我が子を見守る様な気分になってくる。



 
 

2013年1月23日

無料で外国語を学べるDuolingoに感動!

今週の中島聡さんのメルマガで紹介されていたこの動画を観た。
Luis von Ahn: Massive-scale online collaboration | Video on TED.com

Webで自動投稿を防ぐための認証に使われる「CAPTCHA」を発明したLuis von Ahnさんのスピーチだ。

CAPTCHAを改良したRECAPTCHAでは多数の人間の画像認識力を集めて古い書籍などのデジタル化に役立てているとの事。

このアイデアをさらに進めて言語教育に応用したのが、「Duolingo」という言語学習サービス。


早速登録して試してみた。今のところスペイン語、ドイツ語、フランス語、ポルトガル語、イタリア語の5ヶ国語のみの様だけれど、ぜひアジアの言語も増やして欲しいところだ。



個々の生徒が学習している間に行った翻訳作業が、実はDuolingoのサーバーで集約されて巨大な知識ベースに格納され、実際に翻訳が必要な所で活用される、というイメージだろうか。

つくづくすごい事を考える人が居るものだと感心させられてしまった。