2015-06-12

暑い

今日、窓を開けていても少し暑いと感じました。梅雨っぽいはっきりしない天候で終始曇っていたと思うのですが、風が冷たくなくなったのでしょうか。少し湿気も感じます。やれやれ、もう夏はすぐそこなのですね。

2015-06-12 , ,

Android SDK プロジェクトの作り方, バージョン管理, local.propertiesアップデート, キーの生成, NDKまで

Android SDKのコマンドラインを使ったAndroidアプリプロジェクトの作成方法を記しておきます。しばらく離れているとすぐに忘れるので備忘録として(というかこうして書くことでより記憶に定着させるため)。

前提: SDK, JDK, ant等必要な物をインストールしてパスを通してあること

プロジェクトの作成

android --help create project

で、ヘルプが出るので参考に。

android※1 create project -n MyAwesomeApp -t 10※2  -p ./MyAwesomeApp※3 -k com.example.my_awesome_app -a MyAwesomeApp※4
  • ※1: Cygwin等からはandroid.batとするとよい。
  • ※2: -tの値(target ID)は環境によって異なる? android list targets で表示される。
  • ※3: カレントディレクトリへ作るなら単にピリオドのみでOK。
  • ※4: Activity名。デフォルトでアプリアイコンの下に表示される名前になる。

参考: http://developer.android.com/tools/help/android.html

コンパイルは次のようにする。

cd MyAwesomeApp
ant debug

インストールはAVDか端末を接続した上で ant debug install とする。

バージョン管理に入れる(Subversionやgit等)

バージョン管理では次のファイルを無視する(.gitignore等)。

  • local.properties
  • bin
  • gen
  • libs
  • obj (NDK使用時)

バージョン管理から取り出したときの作業

リポドシリから取り出したときはlocal.propertiesが無いので生成する必要がある。

cd MyAwesomeApp
android update project -p .

キーストアの情報が必要ならlocal.propertiesへ追記する。

キーの生成方法

キーの生成は次のようにする。(keytoolはJDKのbinの中)

keytool -genkey -v -keystore my_awesome_app.keystore -alias my_awesome_app -keyalg RSA -keysize 2048 -validity 10000

local.propertiesにキーの情報を追加する。

key.store=my_awesome_app.keystore
key.alias=my_awesome_app

次のようにしてリリースビルドできるようになるはず。

cd MyAwesomeApp
ant release

参考: http://developer.android.com/tools/publishing/app-signing.html

NDK

NDKを使いたい場合はjniディレクトリを作る。NDKのsamplesディレクトリを参考にすると良い。

プロジェクトディレクトリ下にjniディレクトリを作り、次のファイルを配置する。

  • Android.mk
  • Application.mk
  • *.cpp, *.h等

ビルドはプロジェクトディレクトリトップで ndk-build とし、成功したら、普通に ant debug 等。(参考: https://developer.android.com/ndk/guides/ndk-build.html)

AndroidManifest.xml は必要に応じて修正すること。特にNativeActivityを使う場合は修正が必要。

各ファイルの例を次に記す。(android-ndk-r10e時点。バージョンによってオプションは変わっていくかも?)

jni/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_CPP_FEATURES += exceptions
LOCAL_CPP_FEATURES += rtti
LOCAL_MODULE := my-awesome-app-jni
LOCAL_SRC_FILES := my-awesome-app-jni.cpp

include $(BUILD_SHARED_LIBRARY)
# include $(BUILD_EXECUTABLE) ←main()から実行する場合はこちら。

例外やRTTIのないC++なんて98年以前の感じですね。今更耐えられないので有効。(r10e現在デフォルト無効)

現在のバージョンではC++11はデフォルトで使えるらしいです。ライブラリはまた別の話ですが。

参考: https://developer.android.com/ndk/guides/android_mk.html

jni/Application.mk

APP_ABI := all
APP_STL := c++_static

stlport(stlport_static)にはstd::to_stringが無かったのでclangのライブラリ(c++_static)を指定しました。

参考: https://developer.android.com/ndk/guides/application_mk.html

jni/my-awesome-app-jni.cpp

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_my_1awesome_1app_MyAwesomeApp_nativeExampleFun(
    JNIEnv *env,
    jobject thisj,
    jstring exampleStr,
    int exampleInt,
    jobject exampleObj)
{
    struct UTFChars
    {
        JNIEnv *env;
        jstring str;
        const char *chars;
        UTFChars(JNIEnv *env, jstring str):env(env), str(str), chars(env->GetStringUTFChars(str, nullptr)){}
        ~UTFChars(){if(chars){env->ReleaseStringUTFChars(str, chars);}}
        const char *get() const {return chars;}
    };
    const std::string result = UTFChars(env, exampleStr).get() + std::to_string(exampleInt);
    return env->NewStringUTF(result.c_str());
}

関数名はパッケージ名やクラス名に合わせる。パッケージ名に_(アンダースコア)が入っているときは_の後に1が必要なので注意。_のままだとランタイムでエラーになる。

JNIに詳しくないんですが、こういうことをするための文字列ライブラリってないんですか?

src/com/example/my_awesome_app/MyAwesomeApp.java

//...略...
import android.graphics.Bitmap;
import android.widget.Toast;

public class MyAwesomeApp extends Activity
{
    //...略...

    // ネイティブ関数の宣言
    static {
        System.loadLibrary("my-awesome-app-jni"); //LOCAL_MODULEで指定した名前
    }
    native String nativeExampleFun(String exampleStr, int exampleInt, Bitmap exampleObj);

    //...略...
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // ネイティブ関数を呼び出してみる
        String result = nativeExampleFun("test", 123, null);
        Toast.makeText(this, result, Toast.LENGTH_LONG).show(); //test123と表示される
    }
}

AndroidManifest.xml (NativeActivity使用時の例)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.my_awesome_app"
      android:versionCode="1"
      android:versionName="1.0">

  <uses-sdk android:minSdkVersion="14" /><!--←SDKのバージョン-->
  <uses-feature android:glEsVersion="0x00020000"></uses-feature><!--←OpenGL ESを使う場合、そのバージョン-->

  <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:hasCode="false"><!--←Javaのコードを使わない場合はhasCodeをfalseにすること-->
        <activity android:name="android.app.NativeActivity"
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden"><!-- nameはNativeActivityを使うならこの値で固定。configChangesは端末回転時にActivityを破棄しない設定らしいけど、APIレベルによっては効かないらしい? -->

            <meta-data android:name="android.app.lib_name"
                       android:value="my-awesome-app-jni" /><!-- ←valueはAndroid.mkのLOCAL_MODULEで指定したモジュール名 -->

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
2015-04-22

Photoshopのスクリプトで現在のスクリプトのパスを求める方法

$.fileName で現在のスクリプトへのパスが得られるらしい。

Extendscript current script path - Stack Overflow

古いPhotoshopではこの手は使えないらしいので、わざと例外を発生させてファイル名を得る方法もあるらしい。すげぇ。

JSX(Adobeの方)でスクリプトファイル自身のpathを求める - Qiita

ちなみにFileやFolderのプロパティ、メソッド一覧はこちら。

JavaScript Tools Guide - javascript_tools_guide.pdf

2015-04-17

暑い

昨日から日中部屋が暑くなってきました。閉めきっていると30度近くまで行きます。でも窓を開けると涼しい風が通り抜けて気持ちいいですね。このくらいの気候が一番過ごしやすいかな。外出するなら今の時期ですね。どこか行きたいなぁ。

2015-04-17

2015春の新番組

1~2話程度見終わったので。今期はどうですかね。

今期も今のところコレといったものは無く。テキトーに見てます。最初から見ないもの、最初の数分だけ見てやめるものもずいぶん増えました。歳ですかね。

「俺物語!!」は良さそうなロマンスものですね。ちょっと面倒くさいなぁと思わないでもないけど。

セーラームーンを見て、そういえばこんな話だったなぁと懐かしんでいます。やっぱり私は戦う魔法少女があまり好きじゃないんだなぁと再認識。

「シドニアの騎士」は1期が良かったのですが、今期はどうでしょうね。

2015-04-16

ブログをあまり書いていない理由

最近全然書いてませんね。色々書きたいのですが、なかなか書けないでいます。何ででしょうね。

先日とある人と話をしたときに、その人が「インターネットは変わってしまった。もっと閉じた世界で、気軽に何でも書ける、あるいは、書いてある場所だったのに」と言うようなことをおっしゃっていました。他の人でも「昔は実名で日記が書けたけど、今は怖くなってしまったな」と言うのも聞いたことがあります。

それを聞いて私は共感するとともに、それだけではないかなぁという気もするのです。

確かにインターネットは誰でも使うものになりました。誰が見ているかわかったものではありません。うかつなことを書こうものなら、それが馬鹿発見器によって拡散される。そんなことが日常的に起きている世界でもあります。実際この私も、誰が見てるか分からないしなあ、あの人に見られてしまうかなあ、これがばれるとまずいなあ、などと考えると、書くのを控えてしまいます。SNSなどはそういう意味では良いですよね。共有範囲を適切に絞れば、だいぶ書きやすくなります。

世界が変わった。確かにそうですが、書きにくくなったのはそればかりではないでしょう。

私はその話を聞きながら、老いというものを感じました。

昔は良かった的な老い。すでにやったことがあることに対する飽き。情熱の低下。

おそらく若い人はこんな世界でも抵抗なく色々書けると思うんですよね。それは視野が狭いからかもしれない。知識や経験が少ないからかもしれない。私たちだってたいした経験や知識があるわけではないくせに。実際トラブルになる例はありますが、全体から見たらごく一部でしょうに。

多くはたいした反応も得られず、または、得られたとしても一過性のもので飽きてしまうといったところでしょうか。書いても何も起きなければ、書けば書くほど寂しくなっていきますからね。何の影響も期待しないのであればリスクを負ってまで公開する意味はありませんからね。その点やっぱりSNSはよく出来てるなと。いいね!、+1、リツイート、おきにいり、手軽に反応を返せるようになっている。ちょっと簡単すぎる気はしますが。リアルで会ったときに、あの投稿見たよ……とか、そういうのでも良いと思うのですけどね。

などと当たり障りのない一般的なことを書いてみました。

マクドナルドでAndroidのWordpressアプリから書いてます。PCのEmacs上から書くのが面倒というのも少しはあるのでしょうね。まとまった文書を書くならPCの方が良いですが、こういった気軽な文の場合は特に。

こんな文でも書くのに意外と時間がかかるものです。そこまでして書きたいと思えなくなってきているというのも大きいのでしょうね。

2015-02-14

キッチンタイマー

キッチンタイマーが壊れたので新しいのを探しています。

壊れたのは数年前に購入したTANITAのテンキータイプ(TD-379)。冷蔵庫に貼り付けて使っていたのですが、マグネットが弱く、何度も落としているうちに音はすれど何も表示されなくなってしまいました。

近くのホームセンターでまた適当なのを買っても良いのですが、このタイマーには不満があったのでもう少し良い商品は無いものかと探しています。

不満な点:

  • マグネットが弱い
  • 音がうるさすぎる

マグネットが弱いのは、たびたび冷蔵庫から滑り落ちてイライラさせられるだけならまだしも、結局壊れる原因になってしまったことを考えると思っていたより重要な点なのかもしれません。マグネットシートで改善することも出来たのかもしれませんが、まぁ、面倒くさいですよね。

音がうるさくて苦痛でした。大きな音量、甲高い音程、音の密度、とにかくやかましい。1秒くらいで自動的に止まってくれるならまだ良いのですが、もちろんそんな事はありません。耳が多少遠くても別の部屋にいても確実に気がつく、そんな用途を想定しているのでしょう。私はできるだけ鳴る前に止めていました。

というわけで、代わりを探しているのですがなかなか難しいですね。特に音量は鳴らしてみないとなかなか分かりません。店頭だと勝手に開けて電池入れて鳴らすわけにもいきませんし。Amazonのレビューを見ても「音が大きくて良い」という感想は分かりやすいですが、「音がちょうど良くて良い」という感想では私にとってちょうど良いのか分かりません。Youtube等で動画を見るのが一番分かりやすいでしょうか。音量は分かりませんが鳴り方は分かります。

「セロテープでふさげ」というような意見も見かけました。安いのを購入して自分で加工して使うという手もあるのでしょうね。

2015-02-14

2015冬の新番組

うーん、幸腹グラフィティかな。

  • -01/03(土) 22:00~ TOKYO MX 探偵歌劇ミルキィホームズ TD (第3期)
  • -01/04(日) 22:27~ TOKYO MX みんな集まれ!ファルコム学園 SC (第2期)
  • △01/05(月) 18:00~(※毎週月火の放送) NHK Eテレ わしも -WASIMO-
  • △01/05(月) 24:00~ TOKYO MX アブソリュート・デュオ
  • ○01/05(月) 24:30~ TOKYO MX ユリ熊嵐
  • △01/05(月) 26:05~ テレビ東京 神様はじめました◎ (第2期)
  • -01/06(火) 21:55~ TOKYO MX キュートトランスフォーマー 帰ってきたコンボイの謎
  • △01/06(火) 25:40~ テレビ東京 美男高校地球防衛部LOVE!
  • -01/07(水) 21:00~ バンダイチャンネル みりたり!
  • ×01/07(水) 22:26~ TOKYO MX うわばきクック
  • ×01/07(水) 25:05~ TOKYO MX 艦これ -艦隊これくしょん-
  • ×01/07(水) 25:35~ TOKYO MX 新妹魔王の契約者(テスタメント)
  • ×01/08(木) 21:55~ TOKYO MX 血液型くん!2
  • ○01/08(木) 22:30~ TOKYO MX たまゆら~卒業写真~劇場上映決定記念セレクション放送
  • -01/08(木) 24:00~ TOKYO MX 東京喰種 トーキョーグール√A (第2期)
  • -01/08(木) 24:00~ ニコニコ生放送 ぱんきす!2次元
  • ×01/08(木) 24:50~ フジテレビ 冴えない彼女の育てかた
  • ◎01/08(木) 26:01~ TBS 幸腹グラフィティ
  • △01/08(木) 26:31~ TBS 銃皇無尽のファフニール
  • -01/09(金) 24:00~ TOKYO MX アイドルマスター シンデレラガールズ
  • -01/09(金) 24:30~ TOKYO MX ジョジョの奇妙な冒険 第3部-スターダストクルセイダース- エジプト編※分割4クール
  • ×01/09(金) 25:58~ 日本テレビ デス・パレード
  • ×01/09(金) 26:00~ フジテレビ 暗殺教室
  • ×01/09(金) 26:25~ TBS 蒼穹のファフナー エグゾダス-EXODUS-
  • ○01/10(土) 23:30~ TOKYO MX デュラララ!!×2 承
  • ○01/10(土) 24:00~ TOKYO MX ALDNOAH ZERO(アルドノア・ゼロ) 後期
  • -01/10(土) 24:30~ TOKYO MX DOG DAYS″(第3期)
  • -01/10(土) 25:00~ TOKYO MX 少年ハリウッド-HOLLY STAGE FOR 50- (第2期)
  • △01/11(日) 22:00~ TOKYO MX 夜ノヤッターマン
  • △01/11(日) 22:30~ TOKYO MX 純潔のマリア
  • △01/11(日) 23:30~ TOKYO MX ローリング ガールズ
  • △01/11(日) 25:05~ テレビ東京 聖剣使いの禁呪詠唱
  • ×01/11(日) 25:35~ テレビ東京 戦国無双
  • ×01/13(火) 23:00~ TOKYO MX 黒子のバスケ 第3期
  • -01/17(土) 19:00~ バンダイチャンネル 美少女戦士セーラームーン Crystal ブラック・ムーン編 (第2期)
  • △01/23(金) 25:35~ TOKYO MX ISUCA -イスカ-

CM見るとたまゆらの劇場版が気になる。

2014-12-25

腰痛ほぼ治った

日常生活には支障がないくらいには治ったかな。右の後ろはまだ痛くなるケースがあるけど、このくらいなら何とか。これほど長く日常生活に支障があるくらいに痛くなったのはちょっと記憶に無い。

2014-12-21

腰痛回復の兆し

腰痛が始まってから一週間、今日ようやく症状の改善を感じました。

寝返りや起床をそれほど痛くならずに出来るようになりました。

立っていたりイスに座っているとまだ痛いのであまり活動する気にならないのですが、こういうときは休んだ方が良いのか動いた方が良いのかよく分からないですね。