ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

Androidの開発環境を作り直した

はじめに

たまに挙動がおかしい時があったんだけど、原因がイマイチわからないので作り直してみた。
環境はMacOSX10.7.4

その前に

AppCleanerでEclipseを削除した後、一応ホームディレクトリの二つのディレクトリ名を適当なものに変更

二つとも環境構築している中で作り直されました。
※参考:eclipse(mac)の再インストール - いろいろつまみ食い

環境構築

古い記事だけどわかりやすかったので参考にさせてもらいました
Android開発環境の構築 Eclipse編

Android SDK
JDK
  • インストールしてあるのでスルー
Eclipse
  • Eclipse DownloadsからEclipse IDE for Java Developersをダウンロード
  • 展開して~/Applications直下に配置
  • Eclipse 日本語化 | MergeDoc Projectから、Pleiades プラグイン本体のみをダウンロード(All in Oneじゃないよ)
    • Eclipse 4.2 Juno の場合は 1.3.5 以上を~とあったので安定板でなく最新版の1.3.5
  • 展開したものをEclipseインストールディレクトリにマージする
  • Eclipseアプリケーションのパッケージ内にあるeclipse.ini末尾にパスを追記
  • eclipse.iniを閉じてからEclipse起動
  • 不安になったのでもう一回閉じてから、パッケージ内のeclipseバッチを叩いて起動
  • [ヘルプ] - [新規ソフトウェアのインストール]選択
  • 作業対象を追加
  • 開発ツール、NDKプラグイン共にチェックをつけインストール
  • [Eclipse] - [環境設定]からAndroidを選択し、SDKロケーションに~/Developer直下に配置したAndroid SDKのルートディレクトリを設定
  • [ウィンドウ] - [Android SDK マネージャー]で、色々インストール
    • Tools
    • Extras
    • 今作ってるアプリが対応しているバージョンのAndroid全部
  • プロジェクトインポートして、実機を繋げて起動、問題なし
  • と思ったらlayout系のxmlが開けなかったのでもう一回clean起動、プラグイン入れたり更新したら必ずcleanするのが良さそう

テスト用プロジェクト内のリソースを参照する方法

はじめに

AndroidTestCaseを継承したクラスでAssets内のファイルを参照しようとしたらエラーになってしまうので解決策をメモ

解決編

AndroidTestCaseにはテスト用のContextを取得するためのAPIはあるようですが、hiddenらしくリフレクションで取得しています。一応、いくつかのクラスでリソースのアクセスを行いたいのでクラスを分けてAndroidTestCaseを外から渡すようにしてみました。ちなみにAndroidTestCase内にこのコードを書く場合には参考URLのようにgetTestContext以外の名前にしないとhiddenであるgetTestContextと名前がかぶっておかしくなります。

public class Utils {

    /**
     * テスト対象プロジェクトのAssetsフォルダを参照する場合はこれを使う
     * @param testCase
     * @return
     */
    public static Context getTestContext(AndroidTestCase testCase) {
        @SuppressWarnings("unchecked")
        Class clz = testCase.getClass();
        Method method;
        try {
            method = clz.getMethod("getTestContext");
            return (Context) method.invoke(testCase);
        } catch (Exception e) {
            return null;
        }
    }

}

// assets内
Utils.getTestContext(this).getAssets().open("json/test.json");

// res内は使わないぽい
getContext().getString(R.string.test)

startActivityForResultの直後にonActivityResultが呼ばれてしまう

はじめに

表題通りです。

解決編

Google グループ

Lance Nanekさんのコメントの通り、Manifestで移動先activityに設定されているlaunchModeがsingleTaskとなっていたのが原因でした。そもそもこの画面がsingleTaskである意味もわからなかったので単純に削除することで対応。
ただ、singleTaskにしているとonActivityResultが呼ばれる理由は結局よくわからない。singleTask指定にすると起動方法が変わって、呼び出し側画面に終了通知的なものが行くのだろうか。
理由とか書いてない記事ですんまそん

ダイアログ表示時に下の画面を暗くしない

はじめに

ダイアログを表示した場合に、下に隠れる画面を暗くしない方法をメモ、ダイアログ画面での操作が下の画面に影響するような場合に使えますね

styles.xml

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:backgroundDimAmount">0.0</item>
</style>

AndroidManifest.xml

<activity
    android:name=".com.murakaming.ExampleActivity"
    android:configChanges="keyboardHidden|orientation"
    android:theme="@style/CustomDialog" />

ちなみに

自分の例ではactivityにかぶせてますが参考urlではダイアログ生成時にスタイル渡してますね、自由度高そうです。

タイムアウトエラーが起きやすい問題を直した

はじめに

Eclipseからの実機インストールの話。GalaxyのTabとかではほとんど起きないんだけど、GalaxySとかXperiaでよくコンソールに以下のエラーが吐かれる問題を直したのでメモ

Failed to install ***.apk on device '***': タイムアウト
起動はキャンセルされました!

対策

Macの場合

  • 環境設定->Android->DDMS->ADB接続タイム・アウト(ミリ秒)

の設定が、デフォルトで5000になってるので20000に設定したら起きなくなりました。ちなみに10000くらいだと自分の環境ではタイムアウトします。使用PCのスペックとかにも依存するんだろうけど、とりあえず共有。

「勝ち続ける意志力」読了

勝ち続ける意志力 (小学館101新書)

勝ち続ける意志力 (小学館101新書)

はじめに

しょうがないと思いつつも、一般向けに強く書かれたことを残念に思ってしまいました。プレイヤーにしかわからないようなネタを含めつつ、対戦状況による意識配分の話とか、もっとゲームに寄った話が聞きたかったなぁというのが本音です。
ただ、噂で語られてた部分もある梅原さんの人生とか、心の移り変わりだとかを梅原さん自身が語ってる貴重な聖書なので、とりあえずプレイヤーは日々の感謝を表すために買うといいんじゃないかな。薄いからランクマの合間とかに読めばいいよ。以下少ないけど抜粋と感想。

真似できない強さ

p.118

10を超えた強さは、もはや教えることもできなければ誰も真似することもできない。おそらく、何が違うのか気づかない人が大半だ。誰もが真似できる10の強さとは次元が違う。
「アイツの強さはなんだ? なんとなく強いのは分かるけど...」
そんな印象を持つのではないだろうか。
自分だけにしかわからない努力で11、12、13の強さを手にした人間は、絶対の自信を自分のうちに宿すことができる。その自信は決して揺るがない。
何が違うのか、どこが強いのか。周りの人間が明確にその違いを指摘できない状態にまで持っていければ、そのゲームで負けることはない。

ここで言ってる10の強さというのは流行のスタイルだとか型にハマった強い戦法だとかを取り入れてたどり着ける限界っていう意味みたいです。
この限界を超えた地点っていうのは自分も強く感じていて、トッププレイヤーは"これをやってるから強い"なんてわかりやすいのは無く、下手したらコンボの技術はそんなに変わらない人だっています。
個人的には、一流プレイヤーが*1この10より上のラインを意識して日々の練習に取り組んでることがなんか嬉しいなと。

量ではなく質

p.187

たった2円の小さな発見でも、それを自分の成長と考えられる心があれば、「生活が良くなった」と笑って、明日も頑張ることができる。
逆に「15時間も頑張ったのに、結局は何も見つからなかった」というのが一番いけない。気持ちが暗くなり、自己嫌悪に陥り、モチベーションを保てなくなる。
だいたい、あまり多くのものを1日1日に求めたところで、それほど簡単に見つかるものでもない。

たった2円ってなんだよ思われるかもしれませんが、そこは正直どうでもいいです。大切なのは少しずつ進んでいることを毎日実感し、モチベを維持することだと神様は説いています。前後が無いのは手動で書き写すのが面倒なだけです。

最後に

この記事を書く前に既にこの本について書かれてるブログ記事をいくつか眺めたんだけど格闘ゲーマーがいなくて泣いた。ゲームやり込んで負けた時の悔しさとか、一流プレイヤーの対戦を見た時のよくわからない興奮とか知らない人がこの本を見てどれくらい凄さを感じられるのか正直疑問だったり。*2
もっと格闘ゲームやってる人の感想も聞きたいです。そしてもっと売れてゆくゆくは梅原さんにゲーム別の深い解説が見れる本を出してもらいましょう。ありがたや

*1:少なくとも梅原大吾

*2:スポーツとかと違ってゲームは本気でやってる人とそうでない人の意識の差があまりにも大きい気がするので、純粋に心配

さくらVPS申し込み〜SSHするまで

はじめに

  • Linux知らない
  • 開発環境作れない
  • 気軽にアプリ出せるような場がない

というないないづくしな私ですがこの度さくらVPSを契約してみました。これで遊び倒して「昨日話してたアプリのアイデア面白かったから今日リリースしたわー、とりま自分の仮想専用サーバーでリリースしたわー」とか、「ローカルにしか開発環境ないとすぐにリリースできなくない?」とか、「俺が昨日自分の仮想専用サーバーのセキュリティ高めた話ってもうしたっけ?」とか言えるようになりますね。2週間の無料お試し期間もあってとてもいいと思います。以下作業ログ。

申し込み

  • 申し込み完了
  • 仮登録完了メール受信
  • メールにあるURLでコントロールパネルへ行きIPとパスワード打ち込んでログイン
    • 簡単にUbuntuとかに変えられると知って迷う
    • でもなにも知らないので何しても勉強になると思いそのままCentOSを使用
    • ちなみにバージョン
# cat /etc/redhat-release
CentOS release 6.2 (Final)

ユーザを作る

  • コンパネの[仮想サーバ操作]から[起動]ボタンを押す
  • ステータスが稼働中になる
  • コンパネの[リモートコントロール]を押す
  • CentOSがカタカタと動いたあと、ログインを求められる
  • rootで入り、パスワードを求められるのでコンパネにログインしたのと同じパスワードを入力
  • ログイン
  • rootは権限が強すぎて怖いのでそうでもない権限をもつユーザを作成
    • ユーザのホームディレクトリもこれで作成される
# useradd murakaming
  • パスワード設定
    • passwdコマンドは予測されやすかったり短かったりするパスワードに警告出してくれる
# passwd murakaming
  • rootから変更、-を付けることで元のユーザの環境変数を引き継がないようにする
    • 自分で環境変数追加してないからこの時点で影響あるのかは知らないけどなんとなく
# su - murakaming
  • とりあえず作っただけなのでrootに戻る
    • rootに戻る場合はハイフンの後指定なし
    • 元のユーザに戻る場合はexitを使う、この場合は同じくrootに戻る
$ su -

セキュリティ設定の準備

  • 自分のユーザを管理グループであるwheelに入れる
    • 後でrootになれるユーザをグループで制限する
    • -Gオプションは入るグループをカンマ区切りで繋げれて、ここに含まないグループからは削除される
# usermod -G wheel murakaming
  • wheelグループは最初からあって、rootはそこに属しているみたい
# cat /etc/group | grep wheel
wheel:x:10:root

・後でMacからSSHでファイル転送(scp)するためにsshd起動

# /etc/init.d/sshd start

Macから鍵を用意(公開鍵暗号方式

  • ターミナルで鍵生成
    • -t rsaオプションでRSA暗号方式
    • 保存場所を聞かれるがデフォルトでいいので華麗にエンターを押す
    • パスワード無しはまずいのでしっかりパスワード入力する
$ ssh-keygen -t rsa
$ chmod 600 ~/.ssh/id_rsa.pub
  • 公開鍵を名前を変えて転送する
    • 複数端末からアクセスする場合はauthorized_keysに公開鍵を追加するらしい
$ scp ~/.ssh/id_rsa.pub murakaming@:~/.ssh/authorized_keys

セキュリティ設定

  • 設定ファイルを開く
# vi /etc/ssh/sshd_config
  • ポート番号変更
Port 
  • ルートログイン禁止
PermitRootLogin no
  • パスワードでの認証なし(公開鍵認証のみ)
PasswordAuthentication no
UsePAM no
  • 設定が終わったのでsshdを再起動
# /etc/init.d/sshd restart

Macから入ってみる

  • パスワードは鍵作った時に設定したもの
$ ssh murakaming@ -p 
  • コングラッチレーション・・・!

sudoを使えるようにする

  • 次のコマンドがroot権限じゃないと駄目みたいなので一旦rootへ
$ su -
  • sudoコマンドのための設定ファイルを開く
    • "%wheel ALL=(ALL) ALL"という行のコメントを外す
      • これでwheelに所属しているユーザがsudoできる
# visudo
  • murakamingに戻る
# exit
  • sudoを試してみる
    • パスワードはmurakamingのものを入力
$ sudo visudo

お疲れさまでした

$ logout