2011年3月27日日曜日

日本のAndroidはdocomoがほぼ独占状態っぽい? ~Android Marketの統計情報を眺める~

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
そういえば、最近AndroidMarketのデベロッパーコンソールで自分のアプリのインストール数等の統計情報が閲覧できるようになりました。
こんな感じでアプリのとこにリンクが出ています。








統計情報の画面はこんな感じで、アクティブユーザ数の推移や、
端末のOSなどなどの数値、グラフを見ることが出来ます。




統計情報で閲覧できる内容


この統計情報では以下の情報を閲覧する事が出来ます。

アクティブなインストール数の推移グラフ


2010年の12月辺りからコッチのアクティブインストール数の推移です。
拡大表示したり、ある時点でのユーザ数を参照したり色々出来ます。


OSの内訳


アクティブなユーザが使っている端末のOSの内訳です。右端の「マーケットのすべてのアプリ」が何を意味するのかちょっとよくわかりません。
平均って事かな?


端末の内訳


アクティブなユーザが使っている端末の内訳です。



国の内訳


アクティブなユーザが住んでるっぽい国の内訳です。


言語の内訳


アクティブなユーザが使ってるっぽい言語の内訳です。






日本国内においてはdocomo端末が圧倒的っぽい


現在リリースしている「青空文庫ビューア Ad」はアクティブユーザ数が43650程度です。
統計情報の端末の内訳を見てみると・・・。


それぞれのキャリアは・・・。







No 端末 比率 キャリア

1 SEMC Xperia X10 22%  docomo

2 Samsung Galaxy S 14%  docomo

3 Fujitsu Toshiba REGZA Phone T01C 12%  docomo

4 Sharp IS03 9%  au

5 Samsung Galaxy Tab 7%  docomo

6 N-04C 6%  docomo

7 Sharp Lynx 3D SH-03C 5%  docomo

8 Sharp Galapagos 4%  softbank

9 Sharp IS01 4%  au

10 HTC myTouch 3G 4%  ?








docomo:65%
au:13%
softbank:4%

docomoが圧倒的。
飽くまで自分のアプリの利用者は、という事になりますが、
キャリアの機能依存のアプリ以外は概ね大体どこも同じなんじゃないかなーとか思っています。
自分の他のアプリも大体同じような分布になっています。


まとめ


統計見た限りdocomo圧倒的じゃね、という事で、
  • とりあえずdocomoユーザの気持ちでアプリを考えてみる
  • 生粋のdocomo使いのデベロッパはチャンス

auも最近はかなり頑張っていますが、この構図は当分ひっくり返らないだろうなーと思います。
softbankはiPhoneがあるので、あんまり力入ってないんだろうなーというイメージ。端末は良いの出てるんですけどね・・・。
あとau oneマーケットとかandronavi、AmazonなどAndroid Marketにはあがってこない情報も多々あるんですけど、
まぁ今の所誤差だろ、と。

2011年3月20日日曜日

2月分のAndroidアプリでの広告収益を全額寄付すますあ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
@tomorrowkey氏が以下の様な事をしでかしたので、
自分も釣られてうっかり寄付してしまいますた。


Googleチェックアウトでの寄付はココからできます。


収益源はAndroidアプリに付けている広告です。
これの2月分(2/17~3/19分)を全てGoogleチェックアウト経由で日本赤十字社に寄付しました。
以下はAdMobの収益のあれをあれする画面です(やばげな情報はモザっています。全然稼いでないやつが居て泣けます)。

収益は263.25$。
円に換算すると、263.25*80=¥21060(円高でよかった・・・のか)

ポポポポーン!





















21060円あれば技術書が10冊くらい・・・。
少額ではありますが、東北関東大震災で被災された方々の助けに少しでもなれば幸いです。
釣られてうっかり収益を寄付しちゃうAndroidデベロッパーが増える事を期待しています。

2011年3月2日水曜日

ScalaでFizzBuzz 無限リストで4 クラスにする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
前回ではdefでFizzBuzzの処理を整理してましたが、どうもmapした後のタプルの処理が汚いなー
という事でそこだけ吸収出来そうな仕組みを考えてみました。

Scala的な要素

  • Implicit Conversion
  • 無限リスト
  • Extractor Patternsによるパターンマッチ

ソース

FizzBuzzクラスを作成し、FizzBuzz#applyでどの数までやるか貰っています。
中では前回同様
3つ置きで"Fizz"が出てくるcycle
5つ置きで"Buzz"が出てくるcycle
1から始まるincrement
をzipp(拡張したメソッド)して、mapしてFBでマッチさせて、出す。感じです。

zippは内部的にzipとmapをしていて、単純にTuple2の中身をtoStringして連結しています。
これによって3つのリストをzippで連結した結果は
1, 2, Fizz3, 4, Buzz5, Fizz6, 7・・・
といったリストになってます。
FBオブジェクトのunapplyの中で、要素にFizzかBuzzが含まれるか判定しています。
マッチする場合は
case FB(x) => x.replaceAll("[0-9]","")
が実行され、数字が除去された文字列になります。

class FizzBuzz {
    //Seq系のクラスを拡張する。zippメソッドを追加している。
class Zipper[T](val l : Seq[T]){
def zipp[T](l1:Seq[T]):Seq[Any] ={
l.zip(l1).map(p=>p._1.toString + p._2.toString);
}
    }
    //implicit conversionでSeqをZipperに暗黙的に変換する
implicit def zipper[T](l:Seq[T]) = new Zipper(l)
    
    //指定したIterableを繰り返す無限リスト
def cycle[T](i:Iterable[T]) = Stream.continually(i).flatMap(v=>v) 

    //指定した値からインクリメントしていく無限リスト
def increment(begin:Int):Stream[Int] = Stream.cons(begin, increment(begin+1))

    //Extractor Patterns
object FB {
  def unapply(x: String) = if ((x.indexOf("Fizz")> (-1))||(x.indexOf("Buzz")>(-1))) Some(x) else None   
}

    //実行
def apply(i:Int)={
cycle(List("","","Fizz")).zipp(
cycle(List("","","","","Buzz"))).zipp(
increment(1))
.take(i)
.map(p => p match{
case FB(x) => x.replaceAll("[0-9]", "") 
case x => x
})
}
}
for(i <- new FizzBuzz()(100)) println(i)


課題

  • zippが問答無用でタプルをtoString連結してる
  • map内部の処理が結構無理やり

おわり

コードはSimply Scalaで試せます。
Scalaは面白いなーとつくづく感じました。まさにDSLですね。
FizzBuzzの為だけに用意された拡張。
これだけ色々出来ると、それぞれの担当がオレオレDSLを作ってカオスな感じになってしまいそう。
Scalaをチームでやる時は特にその辺のルール決めが重要だなぁとかなんとか感じました。
あと、可読性が微妙。Scalaのscaladocから実装を眺めてみると、大体いつも挫折します。
謎過ぎて。その辺は慣れなんですが、普及の妨げにはなるだろうなぁという印象です。
でも面白いよ!

おわり。