2chでのステマは効果がありそう
MorningBomb(モーニングボム)というスマホ用の目覚ましアプリを開発しています。1か月に1度くらいしか押されない公式サイトの「いいね!」ボタンが、昨日だけで数十回も押されたので、めったに開かないアクセス解析のページを開いてみて驚きました。
この1か月で1日のアクセス数が平均10くらいの公式サイトが、06/02(土)だけで23,046にもなっていました。
参照元は、2chの人気まとめサイト、ハムスター速報でした。ハムスター速報が13,113件、その新着記事サイトが6,074件、スレッドのURLをブラウザにコピペして開いたと思われる直接参照が3,270件です。
比較のため、大手ニュースサイトのGIGAZINEに掲載されたときは掲載された当日で632件でした。GIGAZINEの記事は使い方がとても詳しく書かれていて、Androidマーケットへの直接リンクも貼られていたので公式サイトを見る必要がなかったのかもしれませんが、2chはケタ違いです。
こうなると、よっぽど祭りにでもなったのかと思ったのですが、MorningBombが言及されているレスは、たったひとつだけ! 朝確実に一発で目が覚める方法
もちろん、この投稿をしたのは僕ではないのですが、人気スレにURLを貼り付けるだけでこんなにアクセス数が稼げるなら、うまく使ってみたいものだなと思いました。
参考:MorningBombは、家を離れるまで解除できないアラームアプリです(音は止められます)。制限時間内に家から離れられないと、Twitterやショートメッセージで反省文が送信されます。アラームが鳴った後は、アンインストールできず、電源を切っても反省文が送信されます。ただ、この仕組みは厳しすぎたため、最近はMorning+(モーニングプラス)というアプリの開発を行なっています。
LocalNotificationのメモ
iOSのLocalNotificationで調べたことをメモしておく。
通知の方法
1. [閉じる] [アプリを起動] のようなボタンが付いたダイアログを表示する方法
[閉じる] [アプリを起動] のようなボタンが付いたダイアログを表示するには、iOSの設定 > 通知画面からアプリケーションを選択して、「通知のスタイル」を「ダイアログ」にする。アプリケーションごとの設定でないことに注意。サンプルアプリのデフォルトでは「バナー」になった。アプリのデフォルトをダイアログ形式にすることができるかは未調査。
2. [アプリを起動]のようなアクションボタンを付ける方法
通知のスタイルをダイアログにして、UILocalNotification.alertAction プロパティを設定する。
できないこと
1. Cancelボタンが押されたときのイベントを取得することはできない
can we get close event of local notification or can we get any midnight date change event
2. 通知ダイアログがiPhoneのスリープボタン(電源ボタン)で閉じられたときのイベントを取得することもできない
アプリケーション本体がapplicationDidEnterBackgroundイベントで、すでにバックグラウンドに入っているときは、イベントは取りようにない。
LocalNotificationのサンプルアプリ
村上幸雄さんのブログのサンプルアプリが、必要最低限でわかりやすかった。リンクのGitHubからダウンロードできる。
Cocoa練習帳 iOS Local Notification
PHPFogをセットアップして、チームでソースコードを共有する(Mac編)
PHPFogを立ち上げてみたのでメモしておく。
PHP Fogでのセットアップ方法
公式サイト通りにやれば簡単
https://phpfog.com/apps/34421#/source_code
サーバーリポジトリを共有する方法
1.SSHの公開鍵をサーバーに登録する
2.Gitでクローンする
Gitのリポジトリ名は、アカウントページ(https://phpfog.com/account )でShared Cloud をクリック、アプリアイコンをクリック、左側のSource Coceメニューをクリックすると表示される。
$ cd ~/workspace $ git clone git@git01.phpfog.com:yourappname.phpfogapp.com
3.ファイルを編集してPUSHする
あとは、チームメンバーが普通にファイルを編集、コミットして、git pushするだけでサーバーが更新される。
$ git push origin master
(おまけ)DBにアクセスする
アカウントを持った本人以外でDBにアクセスするには、以下のようにする。
- アカウントページ(https://phpfog.com/account )でShared Cloud をクリック、アプリアイコンをクリック、左側のDatabaseメニューをクリックする
- Launch phpMyAdminボタンをクリックすると新しいページが開くので、そのURLとユーザー名、パスワードをメンバーで共有する
Android 2.XのアプリをAndroid 3.Xや4.0でも動くようにするときの注意点(オプションメニュー)
Android 3.Xや4.0の端末にはオプションメニューを表示するためのハードキーがない。代わりにAction Barというメニュー用の新しいコンポーネントを画面上に表示させることが推奨されている。Creating an Options Menu
しかし、Action Barは場所をとるし、Action Barに載せるほど強調したくないメニューがあったため、これまでと同じようにメニューボタンが押されたらオプションメニューを表示させる方法を調べた。
一番ラクそうだったのが、戻るボタン、HOMEボタン、タスクボタン(アプリ切替ボタン)の横に、ソフトキーでメニューボタンを表示させる方法。といっても、これはActivityにオプションメニューがあれば自動的に表示される。最大の注意点は、AndroidManifest.xmlのtargetSdkVersionが、11(Android 3.0)より小さい数字になっていること。SDKのバージョンを上げるからって張り切って15(Android 4.0.3)とかにするとオプションメニューが表示されない。ただし、この方法だとSDKのバージョンを上げることはできない。
ちなみに、できればSDKを使いたいなと思い、android:targetSdkVersionを15にして、オプションメニューっぽいボタンを自分で作って、以下のようにActivity.openOptionsMenuメソッドを呼んでみたが、メニューが画面下部にしか表示されないので諦めた。
mPopupMenuButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { openOptionsMenu(); // プログラム的にオプションメニューを開く } });
上部の自分で作った画像ボタンをタップして、Activity.openOptionMenu()を呼び出すようにしても、メニューは画面下部にしか表示されない。
あとはリフレクションを使ってSDKバージョン11以降のPopupMenuを使うことも試したが、MenuItemが選択されたことを判別するためのリスナーとして匿名クラスPopupMenu.OnMenuItemClickListenerをインスタンス化するあたりで複雑になりすぎて挫折。
デバッグ用のキーの期限が切れたためGoogle Mapが表示されないときの対処法(Android)
デバッグ用のGoogle Maps APIのキーを発行してから1年が過ぎると、有効期間が切れるようだ。
デバッグ実行しようとすると、eclipseのコンソールにログに以下のエラーメッセージが出て地図が表示されない。
Description Resource Path Location TypeError generating final archive: Debug Certificate expired on 12/03/13 16:30
以下の手順で証明書を再発行する。
(1) keytoolを使って証明書のフィンガープリントを生成する
$ keytool -list -alias androiddebugkey -keystore <debug.keystoreの場所> -storepass android -keypass android androiddebugkey, 2012/03/13, PrivateKeyEntry, ?ؖ????̃t?B???K?[?v?????g (MD5): 87:53:EF:2D:14:D6:D7:B4:4E:41:C1:E2:FD:E9:03:B4
Mac OS Lionではコンソールの文字が化けたが、動作には影響なかった。
debug.keystoreの場所は、Mac OSの場合は「~/.android/debug.keystore」がデフォルト。Windowsでは以下の通り。
- Windows Vista: C:\Users\
\.android\debug.keystore - Windows XP: C:\Documents and Settings\
\.android\debug.keystore
(2) Googleのページで証明書のフィンガープリントを入力してキーを発行する
次のURLにアクセスして先ほどのフィンガープリントを入力すれば、Android Maps APIのキーが表示される。
http://code.google. com/android/maps-api-signup.html
(3) これまで使っていたキーを置き換える
XMLファイルなどに書かれているキーを置き換える。
Mac OS X LionにJDK、eclipseをインストールする
Mac OS X LionにJDK、eclipseをインストールしたときのメモ。JDKをインストールしてから、eclipseをインストールする。
1. JDKをインストールする
(1) AppleのDevelopersサイトにアクセス
Downloads for Apple Developersで、Apple IDとパスワードを入力する。Apple IDを持っていない場合は、「Join now」で新規登録してから再度アクセスする。
(2) Java for Mac OS X 10.7 Update 1 Developer Packageをダウンロード
Downloads for Apple Developersのページで、画面左の検索ウィンドウで「Java」と入力して検索実行。Java for Mac OS X 10.7 Update 1 Developer Packageを選択する。そして、.dmgをクリックしてダウンロードする。
(3) インストール
ダウンロードした.dmgファイルをクリックしてマウント後、.pkgファイルをクリックしてインストール。
(4) 環境変数を設定する
ホームディレクトリの.bash_profileを編集する。なければ新規作成する。
$ cd ~/ # ホームディレクトリを開く $ ls -a # 隠しファイルも含めてすべてのファイルを表示する . .bash_history Movies .. Desktop Music .CFUserTextEncoding Documents Pictures .DS_Store Downloads Public .Trash Library $ vi .bash_profile # ファイルを編集する。なければ新規作成される。
JDKのパスを入力する。
# .bash_profile JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home export JAVA_HOME PATH=${JAVA_HOME}/bin:$PATH export PATH
[esc]:wqと入力して保存して編集を終了。設定を再読み込みして反映させる。
$ source ~/.bash_profile $ java -version # JDKにパスが通ったか確認 java version "1.6.0_29" # インストールしたJDKとパスが同じ Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11M3527) Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
2. eclipseをインストールする
(1) eclipseのダウンロード
公式のダウンロードページを開いて、「Eclipse IDE for Java EE Developers」のMac OS X 64 Bitを選択してダウンロードする。もし日本語化したければ、Mac OS X LionにEclipseをインストールして日本語化までのメモの記事が参考になる。
(2) eclipseのインストール
ダウンロードしてきたeclipse-jee-indigo-SR1-macosx-cocoa.tar.gzをクリックして展開して、出てきたeclipseフォルダをそのままアプリケーションフォルダに移動すればインストール完了。
Mac OS X LionにRuby 1.8.7、Rails 3.0.10をインストールする
Mac OS X LionにRuby 1.8.7の環境を作ったときのメモ。今後、1.9.2も使いたいので、複数のバージョンのRubyを切り替えて使えるツール、RVMを先にインストールする。
公式ページのInstalling RVMに書かれている通りRVMをインストールしようとすると、いきなり失敗した。
$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head ) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 184 100 184 0 0 221 0 --:--:-- --:--:-- --:--:-- 1383 bash: line 1: html: No such file or directory bash: line 2: syntax error near unexpected token `<' 'ash: line 2: `<head><title>301 Moved Permanently</title></head> montecut:bin montecut$ bash < <(curl -sk https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) bash: line 154: git: command not found bash: line 156: git: command not found ERROR: Unable to clone the RVM repository, attempted both git:// and https://
エラーメッセージを見る限り、RVMはgitがないとインストールできないらしい。
gitをインストールするには、MacPortsが必要で、MacPortsをインストールするにはXcodeが必要なので、以下の一式を順番にインストールする。
2. MacPortsのインストール
公式サイトのMac OS X Package Installで、MacPorts download directoryのリンクからMacPorts-2.0.3-10.7-Lion.dmgをダウンロードする。.dmgファイルをクリックしてマウント、出てきた.pkgファイルをクリックしてインストールする。
3. gitのインストール
以下のページを参考にして、gitをインストールする。
最速で Git を Mac にインストールして基本的なコマンドを使う方法 WEBLE
実行したコマンドは以下の通り。Gitに関連するライブラリはたくさんあるが、全部自動でインストールしてくれる。(数十分はかかる。)
$ sudo port install git-core ... ---> Installing git-core @1.7.7.2_0+doc+pcre+python27 ---> Activating git-core @1.7.7.2_0+doc+pcre+python27 ---> Cleaning git-core $ /opt/local/bin/git --version # Gitはここにインストールされる git version 1.7.7.2 $ echo $PATH # /opt/local/bin へのパスが追加されているか確認 /opt/local/bin:/opt/local/sbin:/Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Applications/android-sdk-macosx/tools/
4. RVMのインストール
準備ができたので、改めてRVMをインストール。Mac に rvm を使って ruby と rails をインストール id:itto100penさんの記事を参考にさせていただいた。
# cd ~/ # ホームディレクトリに移動 $ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer ) # インストールコマンド $ vi .bash_profile # .bash_profileの編集 … # 以下を追記 echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function $ source .bash_profile # 設定を再読み込み $ type rvm | head -1 # これを入力して… rvm is a function # これが出力されればテストOK $ rvm requirements
5. Rubyのインストール
以下のコマンドを実行して、RVMでインストールできるRubyの一覧を出す。古いバージョンから最新のものまで対応しているのがわかる。それより、Rubyの派生バージョンがこんなにたくさんあったことにビックリ。
$ rvm list known # インストールできるRuby # MRI Rubies … [ruby-]1.8.7[-p352] [ruby-]1.8.7-head [ruby-]1.9.1-p378 [ruby-]1.9.1[-p431] [ruby-]1.9.1-head [ruby-]1.9.2-p180 [ruby-]1.9.2[-p290] [ruby-]1.9.2-head [ruby-]1.9.3-preview1 [ruby-]1.9.3-rc1 [ruby-]1.9.3[-p0] [ruby-]1.9.3-head ruby-head … # GoRuby … # JRuby … # Rubinius … # Ruby Enterprise Edition … # Kiji … # MagLev … # Mac OS X Snow Leopard Only … # IronRuby -- Not implemented yet. ...
1.8.7をインストールする。
$ rvm install 1.8.7-p352 # インストール $ rvm use 1.8.7-p352 # 切り替え Using /Users/montecut/.rvm/gems/ruby-1.8.7-p352 $ ruby -v # バージョンを確認 ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-darwin11.2.0]
6. Rails 3.0.10のインストール
Rubyに続いて、Railsをインストールする。最新のRailsは3.1だが、手元の書籍とバージョンを合わせるため、3.0系では最新の3.0.10にする。
$ rvm gemset create rails3 $ rvm use 1.8.7@rails3 Using /Users/montecut/.rvm/gems/ruby-1.8.7-p352 with gemset rails3 $ gem install rails -v 3.0.10 /Users/montecut/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/timeout.rb:60: [BUG] Bus Error ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-darwin11.2.0] Abort trap: 6
Railsをインストールと上記のようなエラーが出る。
調べてみると、Xcode 4でシステムのデフォルトコンパイラがGCC 4.2 から LLVM GCC 4.2に変わったせいで問題が起きているらしい。以下のリンクによると、LLVMではないGCCを使えば問題が解決するとのこと。
で、GCC4.2とLLVM GCC4.2の違いは、LLVMをちょっと調べてみた id:wagavulinさんのページがわかりやすい(といっても僕にはむずかしいorz)。
僕の理解だと、たとえばC言語の場合、C言語→機械語にコンパイルする際、x86とARMなどのCPUのアーキテクチャごとに、別々の機械語を生成しなければならなかった。そうすると、一度機械語に変換されたアプリケーションは異なるCPU間で互換性がなくなる。LLVMがあれば、Javaのアプリケーションが複数種類のプラットフォームのVM上でも動くように、中間形式のバイトコードをひとつ作るだけで、複数種類のCPU上で動作するようになるのだと思う。(間違っていたらすみません…。)
Mac OS X Lion に gcc-4.2 をインストールするよのページを参考にGCCをインストールしてみる。
まずは、以下のコマンドでGCCを確認。/usr/bin/gccが、LLVM GCC 4.2を指していることがわかる。
$ ls -l /usr/bin | grep gcc lrwxr-xr-x 1 root wheel 12 11 20 15:42 cc -> llvm-gcc-4.2 lrwxr-xr-x 1 root wheel 12 11 20 15:42 gcc -> llvm-gcc-4.2 lrwxr-xr-x 1 root wheel 28 11 20 15:42 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2 lrwxr-xr-x 1 root admin 52 11 20 15:42 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2 lrwxr-xr-x 1 root admin 52 11 20 15:42 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2 lrwxr-xr-x 1 root admin 32 11 20 15:42 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2 lrwxr-xr-x 1 root admin 32 11 20 15:42 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2 lrwxr-xr-x 1 root admin 32 11 20 15:42 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2 lrwxr-xr-x 1 root admin 32 11 20 15:42 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2 lrwxr-xr-x 1 root admin 32 11 20 15:42 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
先ほどインストールしたMacPortsで、GCCのインストールをしようとしたが、gcc42ではビルドに失敗する。
$ port search gcc # MacPortsでGCCの検索 … apple-gcc42 @5666.3 (lang) Apple's version of gcc 4.2 ... gcc42 @4.2.4 (lang) The GNU compiler collection … Found 42 ports. $ sudo port install gcc42 # GNUコンパイラのGCC 4.2はビルドできない。 Password: ---> Fetching archive for gcc42 ---> Attempting to fetch gcc42-4.2.4_2.darwin_11.x86_64.tbz2 from http://packages.macports.org/gcc42 ---> Fetching gcc42 Error: gcc42 does not build on Snow Leopard or later. Error: Target org.macports.fetch returned: unsupported platform Log for gcc42 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_gcc42/gcc42/main.log Error: Status 1 encountered during processing. To report a bug, see <http://guide.macports.org/#project.tickets>
今度はapple-gcc42で試してみる。
$ sudo port install apple-gcc42 # GCC42 $ which gcc-apple-4.2 # GCCのパスを調べる /opt/local/bin/gcc-apple-4.2
無事GCC 4.2が入ったので、Rubyのコンパイルとインストールをやりなおす。RVMにGCCを手動で指定して実行する。
$ rvm uninstall 1.8.7-p352 # いったん削除 /Users/montecut/.rvm/rubies/ruby-1.8.7-p357 has already been removed. $ CC=/opt/local/bin/gcc-apple-4.2 rvm install 1.8.7-p352 # gcc-apple-4.2を指定してインストール Installing Ruby from source to: /Users/montecut/.rvm/rubies/ruby-1.8.7-p352, this may take a while depending on your cpu(s)... ruby-1.8.7-p352 - #fetching ruby-1.8.7-p352 - #extracted to /Users/montecut/.rvm/src/ruby-1.8.7-p352 (already extracted) Applying patch 'stdout-rouge-fix' (located at /Users/montecut/.rvm/patches/ruby/1.8.7/stdout-rouge-fix.patch) ERROR: Error running 'patch -F 25 -p1 -N -f <"/Users/montecut/.rvm/patches/ruby/1.8.7/stdout-rouge-fix.patch"', please read /Users/montecut/.rvm/log/ruby-1.8.7-p352/patch.apply.stdout-rouge-fix.log ruby-1.8.7-p352 - #configuring ^[[Bruby-1.8.7-p352 - #compiling ruby-1.8.7-p352 - #installing Removing old Rubygems files... Installing rubygems-1.8.10 for ruby-1.8.7-p352 ... Installation of rubygems completed successfully. ruby-1.8.7-p352 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake). ruby-1.8.7-p352 - #importing default gemsets (/Users/montecut/.rvm/gemsets/) Install of ruby-1.8.7-p352 - #complete
またエラーが出るが、--forceオプションを付けることで解決する。
$ CC=/opt/local/bin/gcc-apple-4.2 rvm install 1.8.7-p352 --force # 2度目なので--forceを付けないと失敗する Installing Ruby from source to: /Users/montecut/.rvm/rubies/ruby-1.8.7-p352, this may take a while depending on your cpu(s)... ruby-1.8.7-p352 - #fetching ruby-1.8.7-p352 - #extracting ruby-1.8.7-p352 to /Users/montecut/.rvm/src/ruby-1.8.7-p352 ruby-1.8.7-p352 - #extracted to /Users/montecut/.rvm/src/ruby-1.8.7-p352 Applying patch 'stdout-rouge-fix' (located at /Users/montecut/.rvm/patches/ruby/1.8.7/stdout-rouge-fix.patch) ruby-1.8.7-p352 - #configuring ruby-1.8.7-p352 - #compiling ruby-1.8.7-p352 - #installing Removing old Rubygems files... Installing rubygems-1.8.10 for ruby-1.8.7-p352 ... Installation of rubygems completed successfully. ruby-1.8.7-p352 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake). ruby-1.8.7-p352 - #importing default gemsets (/Users/montecut/.rvm/gemsets/) Install of ruby-1.8.7-p352 - #complete $ rvm use 1.8.7-p352 # 切り替え Using /Users/montecut/.rvm/gems/ruby-1.8.7-p352 $ ruby -v # バージョンを確認 ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-darwin11.2.0]
続いてRailsをインストール。
$ gem install rails -v 3.0.10 $ which rails /Users/montecut/.rvm/gems/ruby-1.8.7-p352@rails3/bin/rails $ rvm use 1.8.7@rails3 --default # このターミナル以外でも使えるようにする Using /Users/montecut/.rvm/gems/ruby-1.8.7-p352 with gemset rails3
うまくインストールできた。最後に、Railsでデモアプリを作成する。
$ rails new demo $ bundle install # 足りないgemをインストール $ rails generate scaffold Post name:string title:string content:text # 適当なスケルトンを作成 $ rake db:create $ rake db:migrate $ rails s # サーバーを起動する
ブラウザで、http://127.0.0.1:3000/postsにアクセスして、Railsのページが表示されればOK。