Ruby:RVMで1.9.2をMBAにインストールする

RubyとRailsを勉強する必要になったので、習うより慣れろということで、本に従ってチュートリアルを進めていこうと思っていた矢先、MBA(Lion)にRVMでRubyのバージョン1.9.2をインストールしようとしたところ、失敗。

readline.c: In function ‘username_completion_proc_call’:

ぐぐったら、以下の情報が出てきた。

readlineのパッケージを入れ直してから再挑戦してみろという感じだろうか?
@kazuhisa1976さんから、opensslのpkgも入れてインストールしたほうがいいと言われたので、

$ rvm get head
$ rvm pkg install readline
$ rvm pkg install openssl
$ rvm remove 1.9.2
$ rvm install 1.9.2 -C --with-openssl-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr

でインストールしてみたら、うまくいったっぽい。

以下のコマンドでデフォルトのバージョンを1.9.2にしておいた。

$ rvm --default 1.9.2

わからない事だらけだが、じっくりとやっていきたい。


Android:Loaderについてメモ

Android 3.0より、Loaderを使ってデータをロードしなさいということで、Cursorの管理をstartManagingCursorに任せるのは非推奨になっているので、CursorLoaderについての記事をテクブ本を見ながら理解しようと思っていたら、CursorLoaderはContentResolverのLoaderのため、単純にsqliteのデータをロードするにはどうすればいいのかがわからなかった。

Loaderについて読んでいると、AsyncTaskLoaderを継承して処理を定義するとか。
参照URL

AsyncTaskLoaderは、AsyncTaskをさらに使い勝手をよくしたものであるということはわかった。AsyncTaskはonPreExecuteやonPostExecuteでUIに絡む処理を行なうため、どうしてもインナークラスになり易く、かつActivityクラスとの結合度が高いものになりがちである。

そこを、AsyncTaskLoaderだと、AsyncTaskのdoInBackGroundの処理のみに限定して処理させるような形。ActivityまたはFragment側で使うローダーをロードし、ローダーのコールバックメソッドを実装することで、UIの処理をActivityまたはFragment側に持たせる。これで、AsyncTaskLoaderに非UIの処理を、ActivityまたはFragmentにUIの処理を任せることができるので、ローダーの再利用性も増すし、役割の分離もたやすいと。

Loaderのロードは、ActivityのonCreateか、FragmentのonActivityCreatedで行なう。

sqlite用のローダーは、既にライブラリが公開されていたので、自分はそれを使わせてもらうことにした。
https://gist.github.com/1217628

SimpleCursorLoaderクラスは、抽象クラスになっているので、loadInBackgroundメソッドで取得したいカーソルを取ってきてリターンするだけの実装を継承したクラスで行なえばよい。楽だ。
サンプルとして載せておく。

まずはSimpleCursorLoaderを継承しているMyCursorLoader。

public class MyCursorLoader extends SimpleCursorLoader {

    public MyCursorLoader(Context context) {
        super(context);
    }

    @Override
    public Cursor loadInBackground() {
        // DBHelperはデータベースを扱うクラス
        DBHelper dbHelper = DBHelper.getInstance(getContext());
        Cursor cursor = dbHelper.findAll();
        return cursor;
    }
}

次に、MyCursorLoaderを使っているListActivity。

public class SampleList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private SimpleCursorAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_list);
        mAdapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_expandable_list_item_1,
                null, // Cursorが空のアダプタを作る
                new String[]{DatabaseColumn.NAME}, // 適当なデータ
                new int[]{android.R.id.text1},
                0);
        setListAdapter(mAdapter);
        // ローダーをロードする
        // idを0に、Bundleをnullに、コールバック実装は自身のクラスにしている
        getLoaderManager().initLoader(0, null, this);
    }

    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        // getLoaderManager().initLoaderで受けたidとBundleはここで受け取る
        // 複数ロードしたりする場合はidで処理を分ける
        // ここでは簡単にSimpleCursorLoaderを継承したMyCursorLoaderを返す
        return new MyCursorLoader(this);
    }

    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        mAdapter.swapCursor(cursor);
    }

    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }
}

cursor.requery();の代わりが、

getLoaderManager().restartLoader(0, null, this);

になると思うので、データの編集が終った後等はこれを呼べばよいと思う。

ListViewなどで各行がクリックされたときの処理を行なう際に、Loaderからデータベースの情報を取れるのか、それとも、mAdapter.getCursorでカーソルを取ってそこから処理をするのかが今のところよくわかってない。現在は後者にしているが、それが正しいのか自信があんまりない。

あとrestartLoaderはonResumeなどでも呼んだほうがいいのだろうか?なども今のところ疑問点。変化があったら更新されるとか書かれていたのだが、データを更新しても表示状は更新されてなかったので、やはり明示的に呼ぶべきなんだろうか?そのあたりも後日調べていきたい。


Android:AdMobに広告出稿してみた結果

前にWiFiCutterのマーケティング戦略でAdMobに広告出稿してみたというのをアプリ内課金してみたというKeynoteで書いてたのですが、1ヶ月半ほど全く音沙汰なし。年末になっていきなり広告の承認がされましたという連絡がメールで来た。そこで、どれくらいの効果がでたのかを晒そうと思います。

ちなみに、予算は50ドル(入金が50ドル以上じゃないと受け付けない)
さらに、1日の予算は10ドル(1日の最低金額)

1日目
1クリック:15セント
クリック数:67回
ダウンロード数:3
2日目
1クリック:15セント
クリック数:67回
ダウンロード数:5
3日目
1クリック:8セント
クリック数:125回
ダウンロード数:3
4日目
1クリック:8セント
クリック数:125回
ダウンロード数:4
5日目
1クリック:5セント
クリック数:200回
ダウンロード数:3

ここで予算を使い切った。
18DL/50ドルという結果に。

結論としては、1クリック5セントにしても1日で10ドル使い切ってしまう(そんなに安くてもいいのか?)最低入札額が3セントからだから、ひょっとしたら3セントでも結構有効かもしれない。ただし、クリック数が多いからといってもダウンロード数に結びつくとも限らなかった。しかしクリック数が多い方が機会は多いわけだから、クリック単価はなるべく低めに設定して、徐々にアップさせていくほうがいいのかもしれない。

また、Cost/DLは2.5ドル程度。今の為替でいうと、1ダウンロードしてもらうのに200円払っているという計算になる。WiFiCutterはシェアウェアなので、1週間の利用の後に150円で買ってもらう。買ってもらえない場合もあるし、買ってもらったとしても、自分の儲けは105円なので、大赤字である。

ダウンロード無料!でアピールしていないので(広告にシェアウェアです!と書いてる)、無料をアピールするとインストール率が上がるだろうと思う。たぶんね。100ドルくらいを投資して、広告付きアプリか有料の500円以上のアプリなどをアピールすると、ある程度の効果があるんじゃないかと思う。
150円程度のアプリで広告を出すのは、よほどの事がない限りはプラスにならないだろう。

AdMobで広告収入を得ている人は、収入の一部分を自分のアプリの広告に回すとさらに利益が増えるんじゃないかなー?たしか広告に回すと何割か上乗せして広告を表示できるはずだし…。そういう戦術をとってみたいが、今はAdMobを入れているアプリが俺のアプリでは存在しないので、広告のせられるアプリを考えたらそういう作戦をやってみたいと思う。

それにしても、思ったよりもシビアだった。もっといけるかと思ってた…。


今年の目標

明けましておめでとうございます。
本年も宜しくお願い致します。

昨年は震災や、自分自身が独立した年ということもあって、激動の1年でした。共著で本も出させていただき、Androidの資格を取得し、何度か講師活動をしました(Slim3, Android系など)。年末にかけて就職活動をする宣言を行い、現在も就職活動中であります。1月中には、決めようと思っています。

さて、今年の目標です。

  • Androidアプリを5つ以上リリースする
  • ダウンロード数にこだわる。アクティブインストール数にこだわる(質の向上)
  • コンテストに応募して、なんでもいいから賞をとる
  • コンテストなどに人を巻き込んでいく(チームワークで応募)
  • GAE/Jを使いこなせるようになる
  • 情報発信の頻度を増やす
  • 外国語を覚える(が、頼るところは頼る)
  • ロードバイクに乗る!
  • 体重を65kg程度に落としてキープする
  • ネットからの収入を月15万にまで上げる
  • 書評を書く
  • また本が書きたい(願望)
  • 講師活動の継続

Androidアプリの作成はもはや自分のライフワークであり、考える事がだいたいAndroidの事になっています。年末にはWiFi Beamというアプリを作ったりして、アプリの製作と収益化と最新技術の勉強をと思ってます(しかしサンプルプロジェクトのコピーでだいたいいけたから詳しくはわかってないのだけど)。

自分は便利系のアプリを作るのが得意なので、世の中をよくするアプリを5つ以上出すようにしたいと思います。また、その際にはダウンロード数とアクティブインストール数にこだわるようにしていきたいと思います。昨年は心が折れて、アップデートの続きをする気持ちが失せてしまったりなどありました。Android Marketの評価は、いとも簡単に開発者のやる気を失くします…。そこで挫けないように、頑張っていけたらと思います。今までのアプリもアプデに精進します。負けてたまるか!

コンテストに応募云々のところは、自分一人だけで考えることが多かったので、アイデア出しチームみたいなのをネット上でも募って面白いアイデアがあれば、形にしていけたらいいなぁと思いました。一人の力では限界があるし、どうも面白いアイデアというのに自分の中ではフィルタがかかってしまい、なかなか思いつかないので、そこは人に頼ってもいいかなと思っているので、そういうチームが組めたらなぁということです。

あとはサーバサイドの技術は、やっぱりGAEを追いかけたい。Slim3かDjangoかGo言語になるかはまだ決めかねていますが。

アプリを作る事自体はいい事だと思うし、それを通じて情報習得をすることもあるので、そういうフィードバックをもっと増やせていけたらいいなぁと思います。まぁ実際にアプリを作っている最中などは、ネタバレしたらまずいのでなかなか書けないですが。

外国語を覚える、に関しては、外国語対応をちゃんとできるようになりたいというのがあります。習慣化する方法を考えるようにします。

自転車に乗る機会がめっきり減っているので、今年はトレーニングもちゃんとやりたいなぁと(毎年言っている気がする)。友達と年に1度はレースに出る、みたいな約束をして、レースにでるように頑張りたいなと思います。

収入に関しては、アプリと連動するところがありますが、買ってよかった!と思われるアプリを作っていくこと、ユーザにとって使い易いアプリを作ることなどで継続的に収入を得られる方法を模索していきたいと思います。けっしてユーザから奪い取ってやろうとか、そういう気持ちでは作らない。いいものを認めてもらって買ってもらう。それを心がけます。

知識や知見をシェアしあって、よりよい世の中作りができるように、今年も精一杯頑張っていきます。


今年を振り返る

今年を振り返ってみようと思う。
まず、下半期の目標を元に、考えてみる。

■数値化・明確化できる目標

  1. × 生活サイクルを安定化させる(朝方への脱却)
  2. ○ Androidアプリケーション技術者の資格を取得
  3. △ Scala&GAEでWebサービスを作る(なんでもいい)
  4. ○ 年内にAndroidアプリをあと3つ以上リリース
  5. × アプリのテスト自動化をする習慣の獲得
  6. × RSSリーダーなどちゃんと設定して情報を拾う
  7. × twitterへの依存度を減らす。しない時間を作る。
  8. × 週ベースで目標設定を行う
  9. × 設定した目標に対する反省を行う
  10. × 自転車で週2回程度遠出する
  11. × 体重を63キロ以下にしてキープ

■数値化できない目標

  1. ○ 勉強会になるべく参加する。できれば講師やる
  2. △ 信頼を得られるように努める
  3. △ 部屋を綺麗に保つ
  4. × 無駄の削減に努める
  5. △ 交友関係を広める
  6. △ 使える技術を増やす
  7. △ 野菜を摂るように努める

うーん、ほとんど×だし。
意識的に目標を作るサイクルをちゃんと回さないといかんと思いつつ、ダラダラとやってしまった。
評価できる点といえば、Androidアプリをリリースしている点と、Androidの資格を取ったことくらい。Scalaの代わりにPythonの勉強もちょっとやってた。でも最近全然できていないが。

目標管理が下手になっているのは、紙の手帳を使わなくなってからひどくなった気がする。付箋紙駆動でToDo管理していた時期もあったのだが、あくまでそれは当日のToDoの管理であり、中長期の目標設定が全然できてなかった。そこに甘えが生じて、戦略通りの動きができてなかったかなと思う。振り返りを行なう週間…。やっぱり作るべきだ。

講師などは、WebデザイナーのためのAndroidレイアウト勉強会の講師をしたり、そのためのサイトの作成を行なったりと、やれることはやってきたが、継続性が弱いので、中途半端になっている。継続していきたいところだが、それにかかるコストが大き過ぎて気持ちばかりが焦っていった。作っても稼げないのだ。ただ、その影響か、仕事をもらうことはできた。

また、アプリ内課金の講師を日本Androidの会 中国支部の勉強会で行った。そのときに作ったスライドはわかりやすいと好評らしい。自分が目指している社会はデベロッパーがもっと評価されるというか、ちゃんとお金を貰って評価される社会なので、その手伝いになったかなという気はしている。アプリ内課金を使って、開発者がもっと儲け易い世界になればいいなぁと思う。

アプリが売れる→開発者嬉しい→もっと便利なアプリ作る→ユーザ喜ぶ→アプリが売れる…

という正しいスパイラルが生まれるようになってほしい。そのためにも、ユーザがアプリにお金を払う事がもっと一般的になってほしいと思う。

それにしても、プログラムばっかりやっていて、全然自転車に乗らなくなってしまった…。なんかそういう生活がしたいと思っていたわけでもないのに、やっぱり余裕がないというか勉強をしつづけないといけないという強迫観念があるのだろう。まぁそうはいってもダラダラもしているのだけど。気分転換を自転車で行なうというふうに紐付けすることができなかった。

あと体重は現状維持のまま。68kgくらい。秋くらいから、ウォーキングをしていたのだが、時間がかかるし痩せるための運動になっているかといわれたら微妙だったので、ランニングに切り替えたところ、膝を痛めてしまって歩くのもつらい状態になってしまった。今はもう直っているのだが、結局それが原因でウォーキングも気付いたらやらなくなってしまっていた。焦りが焦りを呼んだ。こうなるとちょっと負のスパイラルである。

やっぱりちゃんと儲けているか、というところが問題なんだろう。儲ける事に対して一歩引いてしまうのは全くよくないことだなと思った。どうすれば儲かるか、は念頭において考えてアプリは作っているのだが、自分が作るアプリは大きくは儲からない…。WiFiCutterにしても、1ヶ月に1万円程度。英語対応しているのだが、それでもなかなか売れない。もっともっと知られるようにするべきなのだろうが。

儲けようと思ったらiPhoneをやったほうがいい、という言葉は幾度となく頂いたのであるが、自分レベルの人間が技術的に勉強する重点を分散したら、もっと置いていかれるのではないか?という不安のほうがでかくてなかなか勉強する気になれない。あとAndroidアプリ開発が楽しいというのがある。

Androidアプリ開発は儲からないという話があるが、たしかにそれは思うが、評価してもらえるアプリを作れば売れるといえば売れる。ただそれが生活できるレベルで売れるかと言われたら本当に微妙。もっともっとアプリを作らないといけないし、それで安定するかと言われたらさっぱりわからない。安定化させようとしたら、月額課金制のアプリを作るなりしなければならないと思う。

話が大幅にそれたのだが、儲けることを意識してアプリは作っている。しかし生活できるレベルでの儲けに至っていない。就職活動中に面接で、「作りたいから作る、というだけではダメ。そういう姿勢で作っていると手間だけかかって疲弊していく」というふうに言われた。まさにそうなっている気がする。とはいっても仮説を立てて作ってはいるのだが…。

こうやって書いていると、自分の弱みがだんだんわかってきた。
作るだけで満足していた。
いや、twitterマーケティングなど、ソーシャルマーケティングはある程度しているが、それでもマーケティングが十分でないということに気付いた。アプリを英語対応したら、終わりでいいのか?答えは否だなと気付いた。

来年の目標の1つが決まった。

総括すると、

勉強は継続しているが、圧倒的に量が足りていない。アプリを形にしているという点では評価できるが、そこから一歩踏み出せていないので、グローバル視点で考えろ。コンテストなどにあまり挑戦していないから挑戦しろ。思考を狭めてアイデアが出せていないので偏見を持たずにアイデアを考えるべき。もっと運動をするべき。稼ぐことにもっと貪欲になれ。

ということになるだろうか。

来年は32歳。もう大して若くもない。
残されている時間は少ない。
もっともっと貪欲に世の中を便利にすることに取り組みたい。