ARPU, ARPPU, バイラル

ARPU 【Average Revenue Per User】
・一人あたりの月間売上高
・ユーザー1人あたりの収入
・客単価
・100万人のユーザーを抱えるサービスで、月額1億円の売上が出た場合は 100,000,000 / 1,000,000 = 100で、1人あたりARPUが100円


ARPPU【Average Revenue Per Payed Use】
・有料会員あたりの売上げ
・無料ゲームなどで実際に課金したユーザー1人あたりの収入
・100万人のユーザーを抱えるサービスで、月額1億円の売上が出て、課金者が15万人の場合は 100,000,000 / 150,000 = 666.67でARPPUが666.67円
・インストールユーザー数 x 継続率 x 課金率 x 課金ユーザー?


バイラル【viral marketing】
・企業の商品やサービスを消費者に口コミで宣伝してもらい、利用者を広げるマーケティング戦略
・「バイラル」は「感染的な」という意味で、マーケティングの仕組みをウィルスの感染・増殖に例えている。


参考
http://www.socialapplication.jp/2009/07/column/614/
その他色々

コーディングルール2

Stringに+は使わない。

+がダメな例

str = "出力"
str = str + "するよ"
puts str

+が良い例

str = "出力"
str2 = str + "するよ"
puts str
puts str2

上記の方はレシーバ自体を破壊的に変えている感じがするけれど、
新しいオブジェクトを生成しててメモリを消費する。
たのしいRubyとか割といろんな本に書いてるね。
でかいtxtファイルとかを読み込んで、1行ずつ+で文字列に加えたり、
ループでひたすら+しちゃうのは良くない。
レシーバを破壊的に変えて文字列を連結する場合は、

str = "出力"
str << "するよ"
puts str
str = "出力"
str.concat("するよ")
puts str

上2つのどちらかじゃないとダメ。
これだと破壊的にレシーバを置き換える更新をして連結をするから、
1個のStringオブジェクトのままで済んでメモリの消費を抑えられる。

ということで、Stringに+は基本的に使わない!というのは周りにも煩く言ってます。

ちなみに式展開を使って

str = "出力"
puts "#{str}するよ"

のような事も良くしますが、これは新しいオブジェクトが出来ちゃうかもしれない。
にわか知識です(´Д`;)これも良くない気がしてきた…

コーディングルール

メソッドの()を省略するか?
thenを省略するか?
do〜end、{〜}はどっちを使うか?

など色々あるけれど、上記3点についての個人的なルール。


1.メソッドの()は省略しない。
ケースバイケースだとは思うけれど、基本的には省略しない。
そっちの方が見やすい。
putsとかは省略する。
Railsサニタイズをしてくれるhとかも省略する。
要はシンプルで皆使ってて瞬間的に分かるのは省略して、それ以外は()で囲んでます。


2.thenは省略する。
基本的には省略する。
ただ、1行にまとめたい時がたまにあって、そういう省略出来ないときはちゃんと書く。

if a > b
  puts "a"
else
  puts "b"
end

とかのようにシンプルだったら、

if a > b then puts "a"
else puts "b" end

とか書いたりしてる。
その方が見やすいと思った時に。


3.割と半々
個人でコードを書くと、{}が多いかも。
会社のプロジェクトだとdo〜endで周りに合わせる。
基本的に自分の中ではこだわりがない。
ただ、思えば

10.times{|i| p i}

とするときは、どうもdo〜endで書こうとしない気がする…。
個人でコードを書く時は、メソッドによって無意識に使い分けてるかも?
後はネストしまくってる時は分かりやすくなるかなと、途中を変えて混ぜたりはしてる。
全部統一した方がいいのかもしれないなーと、どっちにするか答えは出せていないんだよなぁ。


ただ、自分の中でルールを作りすぎると、
周りとの協調性が無くなるので、こだわりすぎも良くないと思う。

見やすくするのは当然大事で、
そのために自分の中にルールはあった方が良いと思うけれども、
もっと大事なのは協調性ですよね。

これに統一しろ、統一しようとチームで決まったら、それに従えるように拘りは持ちすぎない!

irbでよくやる事

Windows+R」でファイル名を指定して実行
irb」でirbを起動

irb(main):001:0> require "pp" #.irbrcファイルで起動時にrequireする設定にすれば楽
=> true

irb(main):002:0> str = "abcde" #適当に文字列で何かテストしたい時
=> "abcde"

irb(main):003:0> arr = (1..10).to_a #適当に配列で何かテストしたい時
=> [1,2,3,4,5,6,7,8,9,10]

## この辺からよくやるtips オブジェクトのクラスと、使えるメソッドの確認

irb(main):004:0> str.class  #オブジェクトのクラスを確認
=> String

irb(main):005:0> arr.class  #オブジェクトのクラスを確認 配列は当然Array
=> Array

irb(main):006:0> str.methods #定義されているメソッドを確認
=> ["",・・・,""] #略

irb(main):007:0> str.methods.sort #上記の物をちょっと見やすく、アルファベット順にする
=> ["",・・・,""] #略 ソートされて表示される

irb(main):008:0> pp str.methods.sort #上記の物をもっと見やすく1行に1メソッド表示する
["",
・・・,
""] #略
=> nil


## 更にそれっぽいメソッドを探したい時

##例1  ?で終わる真偽値を返しそうなメソッドの一覧が欲しい

irb(main):009:0> str.methods.grep(/\?$/).sort #末尾が?で終わるメソッドの一覧
["xx?",
・・・,
"yy?"] #略
=> nil


##例2  !で終わる破壊的に動作しそうなメソッドの一覧が欲しい
irb(main):010:0> str.methods.grep(/!$/).sort #末尾が!で終わるメソッドの一覧
["xx!",
・・・,
"yy!"] #略
=> nil


##例3  to_を含む、別のオブジェクトに変換しそうなメソッドの一覧が欲しい
irb(main):011:0> str.methods.grep(/to_/).sort #to_を含むメソッドの一覧
["to_a","to_f","to_i","to_s","to_str","to_sym!"]
=> nil


##例4 nで始まるメソッドの一覧が欲しい
irb(main):012:0> str.methods.grep(/^n/).sort #nで始るメソッドの一覧
["next","next!","nil?"] 
=> nil

こんな事をよくしてます。

オブジェクトのインスタンスにどんなメソッドが実装されているかを確認して、
いっぱいあったらざっくり見た上で、必要な動作をしそうなメソッドが無いかを探す。
知らないけれど、名前的にそんな動作するんじゃないか?と思える物を見つける。
もしくは何となく気になったものを見つける。

そういったメソッドを、irbでどう動作するか試してみる。
思い通りの結果が返ったら、引数やレシーバを変えて数パターンテストしてみる。

上手く動けば、実装に使う。(後々でちゃんと調べる)
上手く動かない時は、別のメソッドを探す。
名前的に上手く動きそうなのに、引数が足りないとか何か惜しい気がするときはリファレンスを見る。

色々探したけれども、やりたい動作をしてくれない予感がしたら、
ぐぐって目的に対して参考になるソースを探す。
見つけたらirbで試したりリファレンスを見る。

って感じ。



メソッドによって、結果を配列を返したり、
何らかの違ったクラスのオブジェクトで返す事もあるので、
そういった場合は再度 .class で確認してループ。
そうする事で色々見えてきて、自分の中ではこれが確認の基本としている。


先日、Hashにmap!メソッドあったっけ?って話題(だったかな?)がちらっと出て、
無かったような…と思いirbを立ち上げて確認した。

その際はこんな感じ

irb(main):001:0> h = {}
=> {}

irb(main):002:0> h.class
=> Hash

irb(main):003:0> h.methods.grep(/^m/).sort
=> ["map", "max", "member?", "merge!", "method", "methods", "min"]

破壊的なのは無さそうだねと結論。

irb(main):004:0> require "active_support"としても
=> true

irb(main):005:0> h.methods.grep(/^m/).sort
=> ["many?", "map", "max", "member?", "merge!", "metaclass", "method", "methods", "min"]

2つ増えるくらいで、やっぱり無さそう。
.map!だと、NoMethodErrorが起きちゃうね。

念のため、grepせずに
h.methods.sort
で全部表示してざっくり確認もする。

これで、1個バグが出るコードも潰せましたと。




ココまでは基本的にRuby環境でのテスト。
Rails環境で、自分で定義したModelなどを使いたい場合は、

Windows+R」でファイル名を指定して実行
「cd パス」でapplication_rootフォルダまで移動して、
ruby script/console」でRails環境でコンソールを起動
で試す。

色々読み込んで起動が遅いのと、
Railsの拡張メソッドかRubyでも使えるメソッドかわからない場合があるので、
自分の場合は基本的にはirbで先に色々試して、使い分けます。
起動早いし。

必要に応じて、irb環境で
require "active_support"やら
require "active_record"やらしてみる。

自前のmodelで実際にfindしたり、
その結果に対しての動作を試したいときには真っ先にrails環境のscript/consoleって感じ。