ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

WebViewとかで未知のSchemeに対する処理最新版(?)

androidアプリを作る際にWebViewを組み込んでアプリ内ブラウザで表示することとかよくあると思います。 そんな時にWebページの中にhoge://hugahugaみたいなURIが出てきた場合は、大体shouldOverrideUrlLoading内に

   @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Uri uri = Uri.parse(url);
        String scheme = uri.getScheme();
        if (scheme.indexOf("http") != 0) {
            Uri intent_uri = Uri.parse(url);
            Intent intent = new Intent(Intent.ACTION_VIEW, intent_uri);
            activity.startActivity(intent);
            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }

こんなかんじの(他にもjavascript://とかありますけど割愛)処理を書いていると思います。 要は自前でハンドリングしてないSchemeはIntentとして飛ばすよ、的な処理ですがこれでちょっとこまったことに

何に困ったかって「アプリがインストールされてればschemeで起動、なければマーケットに飛ばすリンク」の場合、コレだとおかしくなるんですね。

<a href="intent://sample#Intent;scheme=foo;package=jp.example.foo;end">OPEN</a>

↑こんなやつ

どう困るかってUri.parse(url)こいつは#とか余計なものを弾いてしまうので、正しくIntentが送られない。どうすっぺかってんで調べてみたらIntent.getIntent(url)を使うと良いらしいのですが、こいつ結構前から非推奨になってる。 なのでIntent.parseUri(url, flag)を使うのが良さそう。

でも最近android全然触れてないので動作検証すらしてない。 これ正しいのかなぁ。 おわり。

Laravel4 でSessionをMemcachedに保存したい

備忘録

  • phpのモジュールでmemcached入れておく必要があるよ
  • memcacheじゃないよ

app/config/session.php

<?php
    /*
    |--------------------------------------------------------------------------
    | Default Session Driver
    |--------------------------------------------------------------------------
    |
    | This option controls the default session "driver" that will be used on
    | requests. By default, we will use the lightweight native driver but
    | you may specify any of the other wonderful drivers provided here.
    |
    | Supported: "file", "cookie", "database", "apc",
    |            "memcached", "redis", "array"
    |
    */

    'driver' => 'memcached',

こうかきます。なんか動いてます。memcacheの設定はどこに書くのだ・・・(:3」∠)

app/config/cache.php

<?php
    /*
    |--------------------------------------------------------------------------
    | Memcached Servers
    |--------------------------------------------------------------------------
    |
    | Now you may specify an array of your Memcached servers that should be
    | used when utilizing the Memcached cache driver. All of the servers
    | should contain a value for "host", "port", and "weight" options.
    |
    */

    'memcached' => array(

        array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),

    ),

cache・・・だと・・・(:3」∠)!? 見た感じ、これ複数サーバー書くだけで分散されるんだろうか?細かい説明あんまりかいてないんだよなぁ・・・Max100なのかなぁ・・・

Laravel4で複合プライマリーキーを設定する

Laravel4のSchemeBuilderを使って複合プライマリーキーを設定したかったけどダメだった。 パーティションを切りたかったので、パーティションのキーになる日時も合わせて複合主キーにしたかったけど、incrementsメソッドにはもれなくprimaryがついちゃうらしく

<?php
// こうとか
Schema::create("log", function($table) {
                $table->increments('id');
                $table->timestamps();
                $table->primary(['id', 'created_at']);
            });
// こうとか
 Schema::create("log", function($table) {
                $table->increments('id');
                $table->timestamps();
                $table->primary('created_at');
            });

こんなかんじにやってもエラーがでます。idからdropPrimaryをしてみてもエラーになる。 どないせいっちゅうねん

結論:使わない

本末転倒な気もするけど、とりあえずmigrationの最初に設定できればいいので、以下みたいにすれば問題ない(ある)

<?php
Schema::create("log", function($table) {
                $table->increments('id');
                $table->timestamps();
            });

DB::statement("
    ALTER TABLE `log`
    DROP PRIMARY KEY,
    ADD PRIMARY KEY (`id`, `created_at`);
    ");

わーい\\٩( 'ω' )و ///できたぞー(当たり前) incrementsとprimaryは別々にしてほしい(小並感)

Android Studio 0.4.2 にあげたら 「You are using Gradle version 1.6, which is not supported. Please use version 1.9. Please point to a supported Gradle version in the project's Gradle settings or in the project's Gradle wrapper (if applicable.)」とか言われた

久しぶりにandroidのアプリケーションをいじることになったので、AndroidStudioを新しいマシンに入れ直して、目的のプロジェクトをcloneして、gradleはwrapperを使うようにして開いたところ、表題のようなことを言われた。

「おめーのプロジェクトで使ってるgradle古いから。サポートしてねぇから。」 ということらしい。たぶん。

以下の手順で解消。

  1. build.gradleのバージョンを修正

各モジュール以下にあるbuild.gradleファイルのdependenciesの項目で、gradle:0.5.+になってるのをgradle:0.7.+に変更

 buildscript {
    repositories {
      mavenCentral()
    }
   dependencies {
      classpath 'com.android.tools.build:gradle:0.7.+'
   }
}
  1. wrapperで指定しているgradleのバージョンを修正

[yourproject]/gradle/wrapper/gradle-wrapper.properties このファイルのgradle-1.6-bin.zipとかってなってるのをgradle-1.9-bin.zipに変更

distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-bin.zip

これで開き直せば解決。

参考:http://stackoverflow.com/questions/21069275/android-studio-0-4-2-gradle-version-is-confused Android Studio 0.4.2, Gradle version is confused

SmartWatch2のapkをAndroidStudioでビルドしてみる #vgadvent2013

この記事はVOYAGE GROUP エンジニアブログ : Advent Calendar 2013の16日目の記事になります。

ガジェッターの皆さんこんにちは。@shinbashiです。
昨今では猫も杓子もスマホスマホですが、スマホといえばあれですよね。

f:id:shin_bashi:20131216232756j:plain

SmartWatch2

これですよね。大体の人はもう持ってると思います。便利ですよねー。
なんせ通知が腕時計でみれますし、他にも通知が腕時計でみれますし、たまにカップラーメン食べるときにタイマーつかえますし。
他にもSmartWatch2からandroid端末のカメラのシャッターを切ったり(僕は写真とりませんが)、雨雲が近づいてきたら知らせてくれたりします(空見ればいいんじゃないかな)。

すごくべんりですよね!

実際個人的にはXperiaZ1は大きすぎてポケットから取り出すのも億劫なので、通知をサッと見れるだけでもすごく便利です。

ガジェッターとしてはここで満足ですが、開発者としてはやっぱり自分でアプリを作りたいですね。
新しいもの好きの諸兄は開発はすでにAndroidStudioで行っていると思います。僕もそうです。
ただしSmartWatch用のSDKがgradleに対応しておらず、ADT(eclipce)用のものしか配布されていません。
そこでどうにかAndroidStudioで開発できないか検証してみました。

そんなわけでこの記事はandroidアプリ開発にAndroidStudioを使っており、eclipceでのSmartWatchの開発環境の構築方法をすでに理解している方向けの超ニッチな内容になっております。

eclipceでの環境構築は

KOBE GDG: Android SmartWatch2を触ってみる 1

こちらに丁寧にまとめられていますので、参考にしてください。

それでは初めて行きたいと思います。
最初に申しておきますが、すごく泥臭いです。

まず、ADTの機能でant用に作られているSmartExtensionAPIとSmartExtensionUtilsをgradle用にエクスポートしません。 そもそも僕の環境でexportがまともに動かないことと、AndroidStudio0.3.7現在モジュールをインポートする機能が無いため下手にエクスポートするとディレクトリ構造がぐっちゃぐちゃになってAndroidStudioで快適に開発するつもりが、逆に面倒になりそうでしたのでスマートなやり方はあきらめました。

\1. 新規にAndroidStudioでプロジェクトを作成。SmartExtensionAPIとSmartExtensionUtilsのsrcやらresやらAndroidManifest.xmlをコピーします

\2. 注意点として

  • SmartExtensionAPIのAndroidManifestに書いてあるpackagenameとsrc以下にあるディレクトリ構成は若干違う
  • AndroidManifestにはを追記する必要がある。ビルドに失敗する

などがあります。

\3. CompleSDKにSonyのAPIを指定できないので、同じように動作させるためにSmartExtensionAPIモジュールにANDROID_HOME/add-ons/addon-sony_add-on_sdk_2_1-sony-16/libs以下のjarファイルを追加します

\4. SmartExtensionUtilsはSmartExtensionAPIに依存しているのでbuild.gradleの末尾あたりに

dependencies {
    compile project(':SmartExtensionAPI')
}

モジュールのインポートする旨を記述します

\5. 実際に作成するSmartWatch用のプロジェクトを生成します。今回はSampleアプリを1と同じようにしてgradle用に移してきました。SampleSensorExtensionを使ったので、今回はSmartWatch2用アプリのプロジェクトとモジュールの名前はSampleSensorExtensionとします。

\6. SmartExtensionAPIとSmartExtensionUtilsをインポートします。インポートする機能がないので、それぞれのモジュールディレクトリ(SmartExtensionAPI/SmartExtensionAPI)を、現在のプロジェクトにまるっとコピーします。

\7. SampeSensorExtensionモジュールSmartExtensionUtilsに依存しているのでbuild.gradleの末尾に例によって

dependencies{
    compile project(':SmartExtensionUtils')
}

を追記します。

\8. ProjectStructureを開き、Modulesの中からSampleSensorExtensionを選択し、dependenciesタブから+を押してModule dependencyを選び、SmartExtensionUtilsを追加します

\9. 心の赴くままにSmartWatch用アプリを開発してください。

f:id:shin_bashi:20131217003457j:plain

動いた!

僕の場合は何やら警告がでてましたが、今回の目的はとにかくAndroidStudioでビルドできるかどうかの検証なのでここまでとします。

結論:できたけどeclipceで開発したほうが速そう

AndroidStudioを使うことで開発速度は上がるかもしれませんが、環境構築が面倒なのでネックですね。モジュールのインポートくらいボタンポチでできるようにしたいもんですね。GoogleがクリスマスプレゼントにAndroidStudioを正式リリースとかしてくれないかなぁとか思います。

明日はモンスターハンターとかモンスターストライクが好きなモンスター @kuromatu さんです!きっとモンスターっぽいなにかを語ってくれるんじゃないかと踏んでいます。

話題のKLABのPlaygroundのsoをビルドしようとして失敗した

MacでPlaygroundをandroid用にビルドしようとして微妙にコケました。

ビルド手順はこちらを参考にすると非常にわかりやすいです

ブライテクノBlog 2D/2.5Dゲームエンジン Playgroundのセットアップ http://brightechno.com/blog/archives/150

NDKのパスは同じ名前でパス通してあるし、特にイジる必要なさそうだなーと思ってたらコケました。

>> 1 error generated.
>> jni/Android/CSockReadStream.cpp:42:14: error: use of undeclared identifier 'close'

こんなエラーが沢山。NDK読み込めてない? と思って.bash_profileを除いてみたら、ANDROID_NDK_ROOTがexportついてなかった。 直接この変数見てたのか・・・、やっぱりちゃんと確認しないとだめだなーと思ってもう一度ビルド。コケた。

何がおかしいんだろと思ってndkを入れなおしてみたり色々試してみたけど変化なし。 再度.bash_profileを見てみると

ANDROIDNDK_ROOT・・・?

typoかーーーーーー

export $ANDROID_NDK_ROOT=/path~~~~~

で動きました。

orz

GooglePlay で アプリを別のアカウントに移管する

「アプリを移譲することになった」 「やっぱり別のアカウントでアプリを管理したい」

ってのは割とよくある話だと思います。 こちらからどうぞ(英語必須)

https://support.google.com/googleplay/android-developer/contact/dev_registration?extra.IssueType=transfer

うまく表示されない場合は、

https://support.google.com/googleplay/android-developer/

  1. のページ下部にある言語を選択から「English」を選択。
  2. 「CONTACT US」を押して
  3. Registration and Account Issues を選択
  4. I would like to have my apps transferred to a new account を選択
  5. Please fill out this form to resolve your issue. からformの部分がリンクになっているのでそこからフォームに必要事項を記入するとよいらしいです。

実際やったわけでないので、本当に出来るのかどうかは知らないのですが、以前見かけた記事(現在リンク切れ)では、移行先のアドレスから確認のメールを送信するなどの手順を踏んで移行できたとのことです。 ヘルプを読む限りでは、現在のアカウントをキャンセルして、新しいアカウントに全てアプリを移す。というような書き方をされていますが、説明にきちんと書けばアプリ単体を別アカウントに移すこともできるようです。