2014年3月30日日曜日

Googleアナリティクスでイベントを用いてダウンロード数を計測する方法

Googleアナリティクスを用いてファイルのダウンロード数を計測したい場合、イベントを用いて計測する方法があります。

色々ぐぐってみると

 <a href="download/some_file" onclick="ga('send', 'event', 'download', 'click', 'some file');">何かファイルをダウンロードします。</a>

なんてやり方が載っています。ga関数については適当にぐぐってみてください。

ところがこのやり方では私の場合はまったくトラッキングできませんでした。

そこでさらに色々調べたところ(ぐぐったところ)以下のサイトに正解が載っていました。ありがとうざいます。助かりました。


要はトラッキングの処理が完了する前に別のページ(この場合はdownload/some_file)に飛ぶことでトラッキング処理が中断されてしまうためうまく動かないようです。hitCallback関数を使うことでトラッキング処理が終わってからダウンロードが開始することが保証されるようです。
先のサイトでは旧来のGoogleアナリティクス(ga.jsを使うもの)のようですので、ここではユニバーサル・アナリティクス(analytics.jsを使うもの)の例を簡単に紹介します。
<a href="download/some_file" onclick="ga('send', 'event', 'download', 'click', 'some file', {hitCallback: function() {document.location.href='download/some_file';}}); return false;">なにかファイルをダウンロードします。</a>

要点は

  • hitCallbackを使用する。
  • onclickでは最後に return false; とし <a href=... のhrefに飛ばないようにする。代わりにhitCallback関数内で同じ場所を指定する。
  • 念の為javascriptに対応していないブラウザのために <a href=... のhref指定も残しておきましょう。

2014年3月19日水曜日

Android向けAdMob SDKからGoogle Play 開発者サービス SDKへの移行

2014年8月1日でこれまで利用してきたAndroid向けAdMob SDKのサポートが終了する
これに伴って旧来のAdMob SDKを利用しているアプリはGoogle Playへの新規登録やアップデートができなくなる。但し引き続き広告配信は可能。
GoogleはGoogle Play開発者サービスへの移行を推奨している。ここでは移行の手順を簡単に纏めておく。なお以下はEclipseで開発していることを前提にしている。Android Studio等他の環境を使用している場合は参考先を確認すること。

Google Play Services SDKのインストール


Google Play開発者サービスを使用するにはまず開発環境にGoogle Play Services SDKをインストールする必要がある。

  • Android SDK Managerを立ちあげる。Eclipseからならメニューのwindow → Android SDK Manager を選択。
  • ExtrasのGoogle Play servicesをインストール。対象端末はAndroid 2.3以上。
  • Buildに使用するSDKのバージョン(EclipseならPackage ExplorerのProperties - Android - Project Build Targetで指定するSDKのバージョン)のGoogle APIsもインストールする。
  • メニューの File → Importを選択しダイアログを表示させる。
  • Android → Existing Android Code into Warkspace を選択し Next ボタンをクリックしダイアログを表示する。
  • AndroidのSDKをインストールしたディレクトリの下に sdk/extras/google/google_play_services/libproject/google-play-services_lib/ があるはずなので、Root Directoryにこのディレクトリを記入する。
  • Copy projects into workspaceをチェックする。これによって現在のワークスペースにライブラリのコピーが作成される(これ大事らしい)。
  • Finishボタンをクリックしてワークスペースへライブラリプロジェクトをインポートする。

Google Play Servicesのライブラリを自分のプロジェクトから参照する


Google Play Services SDKをインストールしたら、自分のプロジェクトからそれを利用できるようにライブラリを参照する。
なおlibディレクトリに入っている古いAdMob用ライブラリ(GoogleAdMobAdsSdk-*.*.*.jar)は衝突するので削除しておく。

  • Package ExplorerでAdMobを利用するプロジェクトを右クリックしPropertiesを選択しダイアログを表示させる。
  • Androidを選択し下段のLibraryのAddボタンをクリック。
  • google-play-services_libを選択しOKボタンを押す。
  • Applyボタンをクリック(必要?)。
  • OKボタンを押し、ダイアログを閉じる。

Manifestファイルを編集


Manifestファイルを開き<application>エレメントの子エレメントとして以下の記述を追加する。

<application>
省略...
    <activity android:name="com.google.android.gms.ads.AdActivity"   android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    <meta-data android:name="com.google.android.gms.version"
                            android:value="@integer/google_play_services_version" />
省略...
</application>

Proguardの設定


(参考:Set Up Google Play Services SDK)
Proguardが必要なクラスを削除しないようにプロジェクトディレクトリ下にproguard-project.txtを作成する。これは google-play-services_lib ライブラリプロジェクトの下にあるものをコピーしてくれば良い。


ソースコードの修正


AdMobの使い方は様々なのであくまで一例。
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;

// 省略

// なにかの関数の中。onResumeが良い?

// Google Play servicesが利用可能か確認。
int res = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (res == ConnectionResult.SUCCESS) {
    // Google Play service使用可能
  // adView を作成する
  adView = new AdView(this);
    // MY_ADD_UNIT_IDには自分の広告ユニットIDを入れる。
  adView.setAdUnitId("MY_ADD_UNIT_ID");
  adView.setAdSize(AdSize.BANNER);
   
  // LinearLayout をルックアップする
  LinearLayout layout = (LinearLayout)findViewById(R.id.my_layout);

  // adView を追加
  layout.addView(adView);

  // 広告のリクエストを行い広告を表示する。
  // またテストデバイス(ここではエミュレータ)では
    // 広告が表示されないようにする。
  AdRequest adRequest = new AdRequest.Builder()
  .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
  .build();
  adView.loadAd(adRequest);
}

2013年9月16日月曜日

台所の排水管のつまりの直し方

しばらく前から台所の排水口の流れが悪かったんだがとうとうほとんど流れなくなってしまった。
流れが悪くなったら排水管の洗浄剤を使ってと、これまで誤魔化してたんだけど、今回は使ったら余計に流れが悪くなってほとんど詰まった状態。
業者さんを呼ぶしかないかな〜と思ったんだけど、一応ググってみてある方法を試しにやってみたら直ったのでその方法をメモ。


  • ゴミ受けや排水管のカバーを外してパイプをむき出しの状態にする。
  • いらないタオルなどでパイプに栓をする。その際反対側の端はシンクから出るようにする。
  • 熱いお湯(今回は給湯器から出る最大温度60℃。)をシンクいっぱいに貯める。
  • タオルの端を引いて栓を抜き一気に熱いお湯を流す。

一発で直りました(^O^)

奥から風が結構な勢いで吹き上げています(今日は台風だから)。いかにも通ったって感じです。
まだわずかに流れてたから良かったのかな。完全に詰まったらどうなんだろう?

取り敢えず、ありがとうGoogle、ありがとうやり方書いてくれた人!

2012年8月22日水曜日

PayPalの本人確認

私が公開しているAndroid用の歩数計アプリWalkroidにはAdMob広告が張り付けてあって、ユーザーにクリックしてもらえればそれなりの広告費が入るようになっています。受け取りはPayPalで行っています。

この8月は最初の振り込みがある...はずだったんですが何と振り込みがPayPalに拒否されたとのこと。「なんでやねん!」と色々調べてみるといつのまにかPayPalでは「本人確認」という手順を踏まないとお金のやりとりができなくなっている...メールとかなんの連絡もなかったような...

そんなわけで愚痴をいってもしょうがないので、以下に私が行った本人確認手順を参考までに記しておきます。

・ログイン後最初の画面の右側の「通知」のところにある「本人確認」のリンクから開始。

・確認書類をスキャンして送信します。私は自動車の免許証。その場合裏面に記載が無くても必ず表面とともに送信しましょう。後で送ってくれと言われます。画像サイズが大きいと送信が拒否されますので、その場合は適当に縮小して送りましょう。

・他のサイトを見ると登録住所、氏名は日本語で書いてある必要があるとのことでしたが、私の場合は英語のままでOKでした。

・暗証番号を郵送したとのメールがきます。私の場合は8/18にメールがきて郵送されてきたのが8/22。簡易書留ですので郵便受けではなく直接うけとる必要があります。

・暗証番号を入力してめでたく制限解除。

さて次回AdMobの振り込みはうまくいくでしょうか...

2012年8月12日日曜日

Ubuntu(Linux)上での音再生の不具合

この一ヶ月強、UbuntuでBansheeとかで音楽を聞いていると1、2秒ぐらいの長さの部分を何度も繰り返す(DJとかがレコードをキコキコやるスクラッチみたいな感じ)不具合が多発してうんざりしていた。

OSをUbuntuからLinux Mintに切り替えてみたりしたのだが、不具合はなおらず。どうしたものかと思っていた。たまに不具合がなくなり安定する時もあるのだがそれがどういう条件でそうなるのか分からない。

Google Chrome上で動画を見ているときもやはり同じように繰り返しが起きたり、ひどいときには早回し再生のようになってまったく見れなくなる。ところがある時試しにFirefoxで見てみるとかなり安定して再生できる。

そうこうしているうちにChromeを立ち上げていないとBansheeなど音楽アプリでも不具合無く再生できることを発見。色々とググったり試行錯誤してみるとどうもChromeのFlashを無効に設定すれば不具合が消える様子。

どうもこれまではNetscape Plugin API(NPAPI)というAPI上でFlashを動かしていたのだが、最近はChrome独自?のPepper APIというAPI上に移行した様子。これが腐っているのではという感触。

とりあえずChromeはFlashを無効にしてFlashが必要なサイトはFirefoxで見るようにした。

2012年5月23日水曜日

minSdkVersion, targetSdkVersionとProject Build TargetのSDKバージョンの違い

Androidのアプリを作成する時にはManifestファイルに
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="7"/>
等のようにSDKのバージョン(APIレベル)を設定すると思います。
さらにビルドするときに使用する SDKのバージョンもあります。
これらの違いはよく混乱するので簡単に纏めておきます。

minSdkVersion
指定したバージョン以上のシステムでならアプリが動作することを示します。これ未満のバージョンのシステムにはアプリはインストールできません。
動作することを保証するのは開発者の責任です。使用しているクラス・メソッドのAPIレベルを確認し、必要なら対処しましょう。

targetSdkVersion
指定したバージョンより新しいシステムではコンパチビリティを保証するためtargetSdkVersionで指定したシステムと同じように動作するようになります。
例えばこの値を11未満(Android 3.0.x HONEYCOMB未満)にするとたとえAndroid 3.0.xのシステムでもデフォルトのテーマはこれまでの @android:style/Theme になります(forward-compatibility)。
11に設定していればAndroid 3.0.xのシステムではHONEYCOMBスタイルの @android:style/Theme.Holo が使用されます。他にもAction Barの使用やオプションメニューがなくなる等の影響がでてきます。
アプリを作成した場合はエミュレータや実機で動作を十分に確認すると思いますが、そこで確認したことが保証されるよう確認に使用したバージョンをここに指定しましょう。

Buildに使用するSDKのバージョン
EclipseならPackage ExplorerのProperties - Android - Project Build Targetで指定するSDKのバージョンです。
この値によってソースコードで使用できるクラスやメソッドが決まります。targetSdkVersionより大きい値も設定できます。その場合、使用しているクラス・メソッドのAPIレベルを確認し対処するのは開発者の責任です。

2012年1月14日土曜日

Android - Javaでの文字列から小数への変換

色々な国で使われるアプリだと小数点がコンマ(,)で表現されるところもあることを意識しましょう。主にヨーロッパとかロシア、南米ですね(参考)。

EditTextビュー等に入力された文字列を数値に変換する時に


String str = someEditTextView.getText().toString();
float v = Float.valueOf(str);

として値を取り出すとコンマが小数点だと認識されずに例外(NumberFormatException)が発生してしまいます。

小数点がピリオド(.)でもコンマ(,)でも正しく文字列を値に変換するには

String str = someEditTextView.getText().toString();
NumberFormat nf = NumberFormat.getInstance(); // デフォルトのロケールを使う
Number n = nf.parse(str);
float v = n.floatValue();

等としましょう。これならロケールに合わせてピリオドやコンマを正しく小数点と認識してくれます。

また値を入力するためのEditTextビューに

<EditText
    ...
    android:inputType="numberDecimal"
/>

と数字関係の文字のみ入力できるようにしている場合には

    android:digits="0123456789.,"

等と入力できる文字を指定してコンマも入力できるようにしましょう。