aswww log

エンジニアの技術録。アプリとかウェブとか

AndoroidアプリにAdMobバナー広告を設定するときにハマった

AdMobを設定するために以下のサイトを参考にbuild.gradleを実装したり、google-services.jsonを設置したりした。

https://firebase.google.com/docs/admob/android/quick-start?hl=ja

すると例のR.が読めなくなるエラーとともに以下のエラーが出力された。

エラー :Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package name '[パッケージ名].debug'

原因は先日追加した開発用モジュールdebugが原因らしい。
そこで、以下のとおり修正したgoogle-services.jsonを/debug/配下に設置した。

  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:209109689792:android:463e3def0de05f38",
        "android_client_info": {
          "package_name": "[パッケージ名].debug"
        }

するとR.が読み込めなくなる例のエラーは解消された。

参考:
http://stackoverflow.com/questions/34990479/no-matching-client-found-for-package-name-google-analytics-multiple-productf

WebView内で通信エラーでエラー画面表示さす

WebView内で通信エラーになった場合(net::ERR_CONNECTION_TIMED_OUT)、エラーページを表示さすようにハンドリング
#WebViewClient生成時に定義してあげる

○準備(既にassetsディレクトリがある場合は不要)
HTMLを置くassetsディレクトリを作成する。
AndroidStudioのプロジェクトのappを右クリック→[新規]→[New]→[Folder]→[Assets Folder]を選択。
app/src/main/asestsディレクトリが作成される。
また、build.gradleに以下のとおり追記する。(自動挿入されることもあるので、既にあったら編集不要)

android {
    sourceSets{
        main{
            assets.srcDirs=["src/main/assets"]
        }
    }
・
・
・

app/src/main/asestsにエラー画面のHTML(network_error.html)を配置して準備終了

○WebViewクラスにコーディング

次のとおりWebView生成時にオーバーラードして実装する。

WebView webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView webview, int errorCode, String description, String failingUrl) {
        if(errorCode < 0){
            // 自作のエラーページを表示
            webView.loadUrl(“file:///android_asset/network_error.html”);
        }
    }

参考URL
http://www.hangout.co.jp/blog/archives/148
http://stackoverflow.com/questions/4997677/android-webview-onreceivederror
http://growsic.com/blog/androidlocalhtml/

Andoridアプリの開発と本番の取扱をGradleでどうにかする

参考にしたサイトは以下。
https://firespeed.org/diary.php?diary=kenz-1824

Andoroidアプリ界隈で開発と本番は

開発=debug、本番=release

っぽいので以下はそれに則って記載する。

○一つの端末にデバッグバージョンアプリとリリースバージョンアプリを共存させたい
Module内にあるbuild.gradleを以下のとおり修正する。

    buildTypes {
        debug{
            applicationIdSuffix ".debug"
        }
        release {
		・
		・
		・

ビルド時にデバッグバージョンアプリの時は、アプリIDに.debugがつくので、アプリバージョンIDがリリースバージョンと被らない=共存できる

○開発と本番で設定ファイルを切り替えたい。
以下のとおり設定ファイルを切り替えられる。

  • 本番用定数

/src/main/res/values/strings.xml

<resources>
    <string name="app_name">Sample application</string>
    <string name="url">http://gati.net</string>
</resources>

/src/debug/res/values/strings.xml

<resources>
    <string name="url">http://uso.net</string>
</resources>

Javaソースコード内で参照する際は普通にR.string.urlでOK。

WEBアプリのようにENVで切り替えられないのは少し不便。

MacVimでfileformat=unixのファイルで改行を変換するには\n

WindowsGVimだと例えばfileformat=unixのファイルで改行を空白に変換したいときは

:%s/^M/ /g

もしくは

%s/¥(半角円マーク)n/ /g

でできた。
自分の今のMacOSX上にインストールしたMacVimの場合は

%s/\(半角バックスラッシュ)n//g

※\(半角バックスラッシュ)=option+¥(円マーク)

じゃないと変換できなかった。
他のサイトの記事によると¥nで置換できている人もいるので同じMacでもバージョンとか環境によって違うのかも?

Dockerで共有ディレクトリのパーティションを変更する方法

Docker上で以下を行っても反応無し。パーミッションも変わらない。

chmod -R 777 cache

共有ディレクトリはローカル側のディレクトリのパーミッションもそのまま共有されるようなので、ローカル側を以下のとおり変更

chmod -R 777 cache

dockerにsshしてみると777になっているはず

Stringの文字列中に複数個の文字列が一個でも含まれている場合、continueする

Q.$taisyoStringの文字列中に"ダメ"または"いらない"文字が含まれている場合、continueするphpプログラムを書きなさい。

A.
phpの文字列検出系関数の中で一番処理効率がいいのはstrpos関数らしいのでできるだけそれを使う。

  • 回答1.一番シンプルif文だけ
const DAME_MOJI="ダメ";
const IRANAI_MOJI="いらない"

if(strpos($taisyoString, self::DAME_MOJI) !== false or strpos($taisyoString, self::IRANAI_MOJI) !== false){
    continue;
}
  • 回答2.php5.6からconstでarray使えるようになったらしいからarrayで定義
const HUYOU_MOJIS = array("ダメ","いらない");

foreach(self::HUYOU_MOJIS as $huyouMoji){
   if(strpos($taisyoString, $huyouMoji) !== false){
        continue 2;
    }
}
  • 回答3.preg_matchで判断。一番短くてすむ
const HUYOU_MOJIS = "ダメ|いらない";

if(preg_match($taisyoString, self::HUYOU_MOJIS) === 0){
    continue;
}
//もちろん3項演算子でも可

and etc...

AndoroidStudioのAVDのkvmに関わるエラーでハマった件

先の記事、「AndoroidのAVDのためにcpu-checkerしようとしたらmysql-serverがエラー」はそもそも以下のAndroidDeviceManagerでAndroid6.0の端末をクリックした際に以下のエラーメッセージが表示されたことから始まった。

f:id:aswww:20160523215738p:plain

KVM is required to run this AVD.
/dev/kvm is not found.

Enable VT-x in your BIOS security settings, ensure that your Linux distro has working KVM module.

ここにはkvmが無いとのことなのでkvmを以下のサイトを参考にインストール。

How to Install KVM and Create Virtual Machines on Ubuntu

egrep -c ‘(svm|vmx)’ /proc/cpuinfo
sudo apt-get install qemu-kvm libvirt-bin bridge-utils virt-manager
sudo adduser name libvirtd
virsh -c qemu:///system list

ここまで記事通り。ただし、この後のCreating Virtual Machinesでまたエラーが発生。
[New VM]で新しい仮想環境を作ろうとしてもできなかった。Errorの内容は忘れてしまったが、とにかく「kvmを利用できません」みたいな内容だった。
以下のサイトを参考に調べると
KVM と /proc/cpuinfo の微妙な関係 | CUBE SUGAR STORAGE

BIOSのCPUの設定でVMを許可しなきゃいけないらしいのでBIOS起動。
ASUSの場合、BIOSの最初の画面はこんな感じ。

f:id:aswww:20160523225227j:plain

最初は簡易設定画面らしいので[Advanced Mode](詳細設定?)へ移動

f:id:aswww:20160523225319j:plain

[詳細設定]→[詳細]→[CPUの設定]→[Intel VT(Intel Virtualization Technology)]を[有効]に設定。
[退出]→[保存してリセットする]を選択して再起動。

改めてAndroidStudioを起動し、エミュレータを起動したら件のエラーは出なくなった。