2014年5月25日日曜日

Androidで画像エフェクト実装

androidで画像にエフェクトをかける調査をしたのでメモ

環境

  • eclipse
  • android4.0以上

GPUImage for Android

調査したのはandroid版のGPUImage。ソースコードが一年前から変更されてないのが気になります。(従業員の回転の早い会社だから、メインで作成している社員さんが辞めたのかな?)
ソースを見るとopenGLでゴリゴリと書いています。私はopenGLは初心者レベルで得意じゃないけど、勉強の役に立ちそう。といわけで基本的な実装を実施。

導入手順

  • android-gpuimageのサイトからダウンロード
  • プロジェクトをeclipseにimport。必要なファイルはlibraryフォルダ以下なので、library配下をプロジェクトとしてimportします。
  • cleanして、利用するプロジェクトにライブラリとして設定します。

サンプルコード

色相・彩度(Saturation)


  GPUImage gpuImage = new GPUImage(this);
  gpuImage.setImage(bitmap);
  gpuImage.setFilter(new GPUImageSaturationFilter());
  Bitmap newbitmap = gpuImage.getBitmapWithFilterApplied();

基本的な使い方は上記のやり方となります。あとは取得したBitmapオブジェクトをImageViewに設定します。上記のコードの場合、フィルターはnew GPUImageSaturationFilterで設定しています。色々と用意されているフォルターは全てGPUImageFilterクラスを継承しています。ソースコードを見ると、GPUImageクラスのsetFilterでGLSurfaceViewを使ってrender処理をおこなっています。

GLSurfaceViewはOpenGLのレンダリングが可能なビューを提供してくれるクラスです。
レンダリング (描画) を受け持つのはGPUImageRendererクラスです。これがRendererをimplementsしたクラスです。

androidアプリの開発をしていると、時々OpenGLをやっておけばよかったと思うことがあると思います。android版のGPUImageはOpenGLの基本を学習するのにも適したコードだと思います。私も知識不足なので色々と学習してみたいと思います。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月18日日曜日

Androidエミュレーターからデスクトップのlocalhostに接続する

androidエミュレーターでlocahostに接続したらエラーが発生したのでメモ

環境

  • mac

やりたいこと

  • androidからvollyでAPIサーバーに接続
  • APIサーバーはrailsで作成してlocalで起動
  • APIサーバーはダミーのテスト用でAPIのjson結果を返すだけ。認証とかトークンは不要

androidでvollyの接続pathをlocalhost:3000にしたらいきなりエラーが発生しました。

原因は、localhostのpath。androidエミュレーターからデスクトップのurlを見るには、

10.0.2.2

に接続しないといけません。なので、railsの場合は10.0.2.2:3000にして接続すると無事接続できます。

ただ、私のAPIサーバー環境はrails4なのでCan't verify CSRF token authenticityエラーが発生しました。なのでコントローラーに

skip_before_filter :verify_authenticity_token

と記載することで、無事に接続できるようになりました。

それにしても、androidのvollyはめちゃくちゃ便利ですね。もうちょっと慣れたら記事を書きたいと思います。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月13日火曜日

Android Studioの導入 MAPアプリを作成してみる4 最終回

環境

  • mac

前回の続きです。

前回で準備ができたので実装を開始します。

画面となるMainActivityを以下のようにします。

MainActivity.java

public class MainActivity extends Activity {

    private static final String TAG_MAP_FRAGMENT = "MAP_FRAGMENT";

    private MapFragment mMapFragment;
    private GoogleMap mGoogleMap;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // MapFragmentオブジェクトを取得
        this.mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        if (this.mMapFragment == null) {
            // MapFragment がなければ作成する
            this.mMapFragment = MapFragment.newInstance();
            getFragmentManager().beginTransaction()
                    .add(android.R.id.content, mMapFragment, TAG_MAP_FRAGMENT)
                    .commit();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mGoogleMap == null) {
            this.mGoogleMap = this.mMapFragment.getMap();
            if (this.mGoogleMap != null) {

                mapInit();

            } else {
                // GoogleMapが使用不可のとき
            }
        }
    }

    // 地図の初期設定メソッド
    private void mapInit() {

        // 地図タイプ設定
        this.mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

色々なサンプルを参考にしたのですが、onResume()内で処理をするのが正式な作法のようです。Effective androidにも同じことが記載されていました。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.mapapplication.app.MainActivity"> 

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        /> 

</RelativeLayout> 

上記をビルドして実機で動かします。この時注意して欲しいのは、エミュレーターだと動作しないので、実機で動かす必要があることです。
起動すると、私の環境ではAuthorization failure.が発生しました。原因はgoogle play servicesが存在しないのが原因なのでinstallします。

再びビルドして起動します。見事動作しました。

せっかくなので、東京駅の位置を指定する実装を行ってみます


public class MainActivity extends Activity {

    private static final LatLng TOKYO_STATION = new LatLng(35.681588,139.76608); //東京駅の緯度経度
    private static final String TAG_MAP_FRAGMENT = "MAP_FRAGMENT";

    private MapFragment mMapFragment;
    private GoogleMap mGoogleMap;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // MapFragmentオブジェクトを取得
        this.mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        if (this.mMapFragment == null) {
            // MapFragment がなければ作成する
            this.mMapFragment = MapFragment.newInstance();
            getFragmentManager().beginTransaction()
                    .add(android.R.id.content, mMapFragment, TAG_MAP_FRAGMENT)
                    .commit();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mGoogleMap == null) {
            this.mGoogleMap = this.mMapFragment.getMap();
            if (this.mGoogleMap != null) {

                // MapFragmentのオブジェクトをセット
                //this.mMapFragment.setRetainInstance(true);

                mapInit();

            } else {
                // GoogleMapが使用不可のとき
            }
        }
    }

    // 地図の初期設定メソッド
    private void mapInit() {

        // 地図タイプ設定
        this.mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        // 地図へのマーカーの追加
        MarkerOptions mo1 = new MarkerOptions();
        mo1.position(TOKYO_STATION);
        mo1.title("東京駅");
        Marker tokyost = this.mGoogleMap.addMarker(mo1);

        this.mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(TOKYO_STATION, 15));
        this.mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

再びビルドして起動します。見事動作しました。

とりあえず今回はここまです。起動さえできれば色々な実装が行えると思います。androidらしい楽しいアプリを作ってみましょう。でわ。

下の本を買いました。android本買うの久々です。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月11日日曜日

Android Studioの導入 地図アプリを作成してみる その3

環境

  • mac
  • Android Studio0.5.2

前回の続きです。

APIを取得した後は、プロジェクトからSDKを参照できるように設定します。

手順

  • library dependencyを選択
  • Google play servicesを選択
  • applyを押す
  • gradleでビルドが走る。

私の環境だと、この場でエラーが発生しました。原因はcompile 'com.google.android.gms:play-services:+'の部分。詳しくエラー内容を見るとgoogle repogitryが存在していなかったのでinstallしました。

installを終えたらもう一度ビルドします。今度はError:Main manifest has <uses-sdk android:minSdkVersion='8'> but library uses minSdkVersion='9'と出てビルド失敗。gradle.buildファイルのminSdkVersionの部分が8になっていたので、以下のように14に修正します。


apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services:+'
}

もう一度ビルドするとGradle invocation completed successfully in 27 secが出て成功。

manifest.xmlを変更

google maps android API v2の使用に必要なmanifest.xmlファイルに以下のおまじないを追加します。

manifest.xml


    <!-- 追加パーミッション1:Google Maps Android API のアクセス許可 --> 
    <permission
        android:name="com.rakuraku.android.ekimap.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" /> 

    <uses-permission android:name="com.rakuraku.android.ekimap.permission.MAPS_RECEIVE" /> 

    <!-- 追加パーミッション2:現在位置取得のため --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <!-- 追加パーミッション3:Google Mapsの動作に必要 --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

    <!-- 追加パーミッション4:OpenGL ES version 2(地図描画用) --> 
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" /> 

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" > 

        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> 
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/map_key"/> 

        <activity
            android:name="com.example.mapapplication.app.MainActivity"
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 

                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    </application> 

おまじないが多いですが、仕方ありません。さらにres/stringsとres/integersのresourceファイルにもAPI keyとGoogle Play Servicesのversionを設定します。

strings.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <string name="app_name">MapApplication</string> 
    <string name="hello_world">Hello world!</string> 
    <string name="action_settings">Settings</string> 
    <string name="map_key">AAAAAAAAAAAAAA11111111111111</string> 

</resources> 

integers.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <integer name="google_play_services_version">4323000</integer> 

</resources> 

これでようやくjavaプログラムの実装を開始できます。長くなったのでまたまた続きます。次回で終わる予定です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月10日土曜日

Android Studioの導入 地図アプリを作成してみる その2

環境

  • mac
  • Android Studio0.5.2

前回雛形のアプリを立ち上げたので本格的にアプリを作り込んでいきます。

今回はMapアプリの作成なので、APIにgoogle maps android API v2を利用します。
google maps android APIは日本語の情報が少ないので、少し丁寧に記載していきたいと思います。

APIキーを取得

google maps android API v2を利用するには、APIキーを取得する必要があります。APIはgoogle APIコンソールで取得します。

statusがONになっていなければstatusをONにします。上記のようにボタンが緑になってONが表示されていればOKです。

SHA1を取得

APIキーを取得するにはandroidのSHA1を知る必要があります。手順は以下の通りです。

  • 1.debug.keystoreの場所を特定します。eclipseやAndroid Studioを使っている場合は「/Users/{ユーザー名}/.android/debug.keystore」の場所にあります。
  • 2.keytoolコマンドを叩きます。コマンドは「keytool -list -v -keystore "{debug.keystoreパス}" -alias androiddebugkey -storepass android -keypass android」になります。

では、上記の通りコマンドを叩いてみましょう。ターミナルを立ち上げて、上記のコマンドを打ち込みます。


keytool -list -v -keystore "/Users/{ユーザー名}/.android/debug.keystore" -alias androiddebugkey -storepass android -keypass android 

別名: androiddebugkey
作成日: 2012/09/23
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=Android Debug, O=Android, C=US
発行者: CN=Android Debug, O=Android, C=US
シリアル番号: 秘密
有効期間の開始日: 秘密
証明書のフィンガプリント:
  MD5:  秘密
  SHA1: 秘密
  SHA256: 秘密
  署名アルゴリズム名: 秘密
  バージョン: 3

SHA1が表示されています。コピペしてテキストにでも貼付けておきましょう。

さて、SHA1が分かったら再びgoogle APIコンソールに戻ります。プロジェクトを作成→Credentials→Android Keyを選択して入力画面を開きます。以下の場所に「SHA1;パッケージ」を入力します。

間違いがないことを確認してcreateを押します。

APIが表示されているはずです。これでAPIの取得は終了になります。

さて、次はいよいよ地図アプリを実装していきます。これがまた動かすまで結構面倒だったりします。でわ、また。

追伸:androidアプリ開発者は、英語力を可能な限りあげましょう。google glassも全部英語だし英語読むのが遅いと今後どんどんきつくなると思います。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月6日火曜日

Android Studioの導入 地図アプリを作成してみる その1

Android Studioを導入したので、操作に慣れるために地図アプリを作成していきます。

環境

  • mac
  • Android Studio 0.5.2

前回Android Studioを導入したのでアプリを作成していきます。

手順

  • 1.Android Studioを立ち上げて「New Project」を選択。
  • 2.プロジェクトの情報を入力。入力する情報はeclipseと変わりません。今回は地図アプリを作成するので、MapApplicationにしました。
  • 3.nextボタンを押し続けてプロジェクト作成。gradleでビルドが走ります。ビルド時間は若干eclipseより遅い感じがします。

作成したプロジェクトを起動

では、作成したプロジェクトを起動します。矢印をクリックします(画面キャプチャの赤丸の箇所)。

初回で使用出来るエミュレーターがないので用意します。背後の赤のバッテン印はeclipseで作成したエミュレーターです。eclipseとは見ているpathが違うので、この環境では動かないみたいです。

androidのエミュレーター起動には時間がかかります。ひたすら待ちましょう。(開発時には高速エミュレーターか実機を使った方がいいです。高速エミュレーターについてはそのうち記事を書きます。)
エミュレーターが起動したら、また先ほどの矢印ボタンを押します。作成したエミュレーターが選択可能になっているので、選択して起動します。

選択するとhello worldアプリが起動されます。

以上です。ここまではeclipseと大差ないので、eclipseでの開発に慣れている人は違和感なく作業を開始することができると思います。

さて、次はこのサンプルアプリに地図機能を盛り込んでいきたいと思います。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月4日日曜日

国立科学博物館@上野「医は仁術」 感想

上野の国立科学博物館で開催されている「医は仁術」を見に行ってきました。

正直、最初は入るかどうか迷ったのですが、入ってよかったです。日本の昔(江戸)の医療から現在の最先端の医療技術の歴史変遷が理解出来ました。
百聞は一見に如かずといいますが、まさにその通りで、日本の歴史的な医療の資料をみることで色々なことが学習出来ました。

根底にある基礎の力

どの世界でもそうですが、基礎を理解することは大切です。医療に限らず、IT、スポーツ、経営等、現代には様々な分野で膨大な知識が体系化されています。しかし、 我々は基礎を学ぶ時間をおろそかにしがちです。現代ビジネスでは「成果(アウトプット)」を急ぐあまり、理論を学ばずにいきなり実践で新技術を導入したり、プロジェクトを開始したりします。

でも、それではいけません。それではまるで、五臓六腑を信じ、現代医学における解剖学の知見とは異なる概念を元に治療を行っていた昔の人と変わりません。

技術を扱うには正しい知識を身につける必要があります。もちろん知識だけでは役に立たないので、現場で実践して改良していく必要があります。人の世界の本質は江戸時代から何も変わっていないのです。

西洋医学の緻密さに驚いた日本人達は、杉田玄白らが翻訳した解体新書を元にどんどんと医療技術を向上させていきます。翻訳に使った辞書等も展示されていましたが、彼らの努力には頭が下がります。我々は彼らの行いに感謝し、そしてプロフェッショナルとしての姿勢を吸収しないといけないと思いました。もちろん今とは時代が違いすぎるのですが、やはり技術者は自分の持つ知識や技術を使うだけでなく、広めるという責任があると思います。今はブログがあるのですから、どの分野でもプロの皆さんは是非時間を割いて情報を発信していただきだいと思います。

今回の展示のテーマです。人を思う心。日本人が大切にしている考え方ですね。

これに関しては、出口近くに設置されていたアニメーションが印象的でした。医療に従事する女性医師が子供と接する時間が取れず、子供がグレてしまうお話です。

僕は幸運にも体が強いほうで、ほとんど病院には行きません。しかし、以前病院に用事があって行った時にあまりに院内が混雑していて驚いたことがあります。日本は世界的に見ても、医療費に比べて提供される医療の質がすぐれているらしいです。だからなのか、様々な人がちょっとしたことで病院に駆け込むようです。

我々日本人が本当に「仁」を大切にするなら、我々はもっと「予防」に力をいれるべきだと私は思います。日々のトレーニング、毎日の食事、定期的な体のケアをすればもっとみんなが訪問しやすい病院になるのではないでしょうか。今は病院に人が集まり過ぎです。

医者だって人間です。長時間労働をすれば疲れるし、労働の質は落ちるでしょう。それに、今の医者の忙しさでは、日々進化し続ける医療技術をロクに追うことも出来ないのではないでしょうか。他の分野の技術者にも言えることですが、最新の情報を仕入れて自分で研究を続ける時間を持つことは非常に大事です。

技術を追うことが出来ない程の労働環境になってしまうことで結局損をするのは、労働のサービスを受ける側です。そして技術の進歩の遅れは、後の世代にも影響を与えます。ブラック企業の経営者がよく責められていますが、サービスを利用する側にも問題があるのだということを我々は理解するべきでしょう。

技術の発展

個人的にはここが一番面白かったです。3Dプリンタを使った医療は今後主流になっていきそうな気がします。

私もスマホ、aruduino、3Dプリンタを使ったサービスに携わる人間ですが、ますます様々な専門分野の技術者が協力し合う必要がでてくる世の中になっていきそうな予感がしました。

あとはips細胞のコーナーもありました。でも、

STAP細胞のコーナーはありませんでした。

どうしてですか!設置してください!

まとめ

「医は仁術」というより「医療の歴史」といった印象が強かったです。一般の値段が一人1500円と高めですが、技術好きや医療に興味のある人は行ってみるといいのでないでしょうか。家族やカップルのデートとしても楽しめるんじゃないでしょうか。

まとめ

おみやげ屋はこんな感じですw

私は何も買いませんでした。でも、みなさん結構買っていて驚きです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年5月3日土曜日

Android Studioの導入

Android Studioを導入したのでメモ

環境

  • mac

導入理由

  • pluginが本格的にAndroid Studioへ移行してきているから
  • gradleが便利だから
  • eclipseが嫌いだからw

1.ここのページへ遷移し、「downLoad Android Studio」のボタンを押下する。

2.downloadが完了したら、dmgファイルをアプリケーションフォルダにドラッグ&ドロップする。(いつものmacアプリinstall作業と同じ)

図1:アプリケーションフォルダ

3.Android Studio.appがあるので、アプリケーションを起動する。

図2:Android Studio起動画面

上記の画面が表示されれば成功。

ブログを書きながらでも15分くらいの作業で完了したので、実際は5分くらいで簡単に導入できると思います。eclipseとはなんだったのか...。

さて、次はAndroid Studioでサンプルアプリを作成していきたいと思います。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...