2011年3月26日土曜日

Android -- 縦横描画の切り替え

■xmlで画面描画している場合


main.xmlで縦横の固定するかを管理するときは、AndroidManifest.xmlの以下configChangesを指定。






  • portrait   縦固定
  • landscape  横固定
  • unspecified  固定なし(デフォルト)
実際には固定なしの場合以下のxmlから作られた描画クラスが使用される。

縦 ⇒ res/layout/xxx.xml
横 ⇒ res/layout-land/xxx.xml

■Viewクラス作成時

Activityクラスで縦、横が切り替わったことは判断できるので、その場合に
Viewクラスの表示内容を切り替える。以下使用するActivity。

// 設定が変更されたとき
    public void onConfigurationChanged(Configuration conf){
     super.onConfigurationChanged(conf);
    }
// インスタンスの状態保管
    public void onSaveInstanceState(Bundle savedInstanceState){
     super.onRestoreInstanceState(savedInstanceState);
    }
// インスタンスの状態を再現する
    public void onRestoreInstanceState(Bundle outState){
     super.onSaveInstanceState(outState);
    }

画面を縦から横にしたときに呼び出される順番。

  1. onSavexxx(変更時の値を保持)
  2. onCreate(Activity作成しなおし)
  3. onRestore(再作成時の処理)

以下、ソースを表示。
MyViewerActivity
public class MyViewerActivity extends Activity {
 static final String TAG = "MyViewerActivity";

 private Configuration config;
 private int orientation;
 private static int[][] areas = new int[][]{
  new int[]{5,5,200,200},
  new int[]{5,5,300,300}
 };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
     Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);

        // Winddowsの変更
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 環境情報取得
        Resources resouces = getResources();
        config = resouces.getConfiguration();

        if (config.orientation != Configuration.ORIENTATION_PORTRAIT) {
         orientation = 1;
        }

        setContentView(R.layout.main);
//        setContentView(new MyView(this));
    }

    @Override
    // 設定が変更されたとき
    public void onConfigurationChanged(Configuration conf){
     super.onConfigurationChanged(conf);
     Log.d(TAG, "config");
     this.config = conf;
    }

    @Override
    // インスタンスの状態保管
    public void onSaveInstanceState(Bundle savedInstanceState){
     Log.d(TAG, "onSave");
     super.onRestoreInstanceState(savedInstanceState);
     int ori = 0;
     // 縦表示じゃないばあい
     if (config.orientation != Configuration.ORIENTATION_PORTRAIT) {
      ori = 1;
     }
     Log.d(TAG, "orient=" + ori);
     savedInstanceState.putInt("ORIENTATION", ori);
    }

    @Override
    // インスタンスの状態を再現する
    public void onRestoreInstanceState(Bundle outState){
     Log.d(TAG, "onRestore");
     super.onSaveInstanceState(outState);
     orientation = outState.getInt("ORIENTATION");
    }

    public Rect getArea() {
     Log.d(TAG, "getArea");
     int[] area = areas[orientation];
     return new Rect(area[0],area[1],area[2],area[3]);
    }
}
MyViewクラス
public class MyView extends View{
 private MyViewerActivity context;
 private Drawable drawable;

 public MyView(Context context) {
  this(context,null);
 }

 // main.xml使用時はこっちが呼ばれる
 public MyView(Context context, AttributeSet attrs) {
  super(context);
  this.context = (MyViewerActivity)context;

  Resources resources = context.getResources();
  drawable = resources.getDrawable(R.drawable.pose08_g);
 }

 protected void onDraw(Canvas c) {
  super.onDraw(c);
  c.drawColor(Color.GREEN);
  if (drawable != null) {
   drawable.setBounds(context.getArea());
   drawable.draw(c);
  }
  int w = this.getWidth();
  int h = this.getHeight();
  Paint p = new Paint();
  p.setStyle(Style.STROKE);
  p.setColor(Color.DKGRAY);
  c.drawRect(new Rect(5, 5, w-10, h-10), p);
 }
}

Android -- Viewクラス

久々なので思い出しながらまとめます。

■画像描画
画像描画には2つの方法がある

  • main.xmlででの表示
  • Viewerクラスを継承して新規に作成しての表示

Viewerクラスを継承してのMyViewerを表示にはmain.xmlに独自Viewerの
パスを指定する必要がる。(com.hogeがそれ。)





なお、以下のどっちでも表示できる。

  setContentView(R.layout.main);
//setContentView(new MyView(this));

main.xmlを使用したときは、Viewerクラスの引数2つのコンストラクタが呼ばれる。

■画像表示


画像表示には2とおりある

  • BitmapFactoryで画像を作成し、それをCanvasで表示
  • Resourcesでgetした画像をDrawableで表示

ということで以下、Viewソース

public class MyView extends View{
 private Context context;
// private Bitmap image;
 private Drawable drawable;

 public MyView(Context context) {
  super(context);
  this.context = context;
 }

 // main.xml使用時はこっちが呼ばれる
 public MyView(Context context, AttributeSet attrs) {
  super(context);
  this.context = context;

  Resources resources = context.getResources();
//  image = BitmapFactory.decodeResource(resources, R.drawable.pose08_g);
  drawable = resources.getDrawable(R.drawable.pose08_g);
 }

 protected void onDraw(Canvas c) {
  super.onDraw(c);
  c.drawColor(Color.GREEN);

/*  if (image != null) {
   c.drawBitmap(image, 10, 10, new Paint());
  }
*/
  if (drawable != null) {
   drawable.setBounds(10, 10, 310, 310);
   drawable.draw(c);
  }
  int w = this.getWidth();
  int h = this.getHeight();
  Paint p = new Paint();
  p.setStyle(Style.STROKE);
  p.setColor(Color.DKGRAY);
  c.drawRect(new Rect(5, 5, w-10, h-10), p);

  for (int i = 0; i <10; i++){
   Paint p2 = new Paint();
   p2.setStyle(Style.FILL);
   p2.setColor(Color.rgb(25*i, 0, 0));
   c.drawCircle(25 * i + 125, 25 * i +125, 100, p2);
  }
 }

}


2011年3月25日金曜日

久々Androidやろうとしたら、アノテーションやらdebug.keyエラーやら

久々にAndroidをやろう、ということでつかってなかったノートPCに前つくったアプリを
持ってきて動かそうとしたらいろいろエラーがでたのでそれについて記載。(俺の4時間・・)


  1. androidを最新にしようとしたらjava1.6に上げなきゃだめだめ
  2. ソースのアノテーションでエラーでまくり
  3. Error generating final archive: Debug certificate expired on・・・エラー
まず、最新のandroidが出てないかをandroid developersに見に行ったらありました。

http://dl.google.com/android/installer_r10-windows.exe

上記をクリックしてダウンロードすると、Programsの下にandroidフォルダとしてインストール
されました。前はファイル解凍して任意の場所において使っていたはずだけど
かわったんだ、、とここは特に問題なし。と思いきやjava1.6じゃないとだめなのでそれも
oracleサイトからインストールを強制的に促されたんでそれに従いインストール。

で次にインストールしたパスを設定しソースを表示すると大量にアノテーションでエラーが・・
でググるとjavaの設定が1.5だとアノテーションでエラーが出るようなので、プロジェクトの
プロパティ->Javaコンパイラーのコンパイラー準拠レベルを1.6に変更し再ビルド。
これでアノテーションエラーは回避できた、と思いきや・・・

最後に1つ以下のエラーが出てしまう。

Error generating final archive: Debug certificate expired on

いろいろDDMの設定とかいじったけどだめだったのでこれもググったら、Android開発するとき
に必要となるdebugkeyなるものの有効期限が切れているためエラーになっていたっぽい。
以下のサイトを参照に一旦C:\Documents and Settings\xxx\.android下のdebug.keystore
を削除し、その後タイムゾーンを変更したらサイド作成され、エラーも消えました。


ふー、やっぱ2ヶ月のブランクは大きかったか。。こまめに見るようにしよ。。

2011年3月23日水曜日

Rails + GAEでサイト立ち上げ

Rails + GAEでサイトを公開したい!!ということであれこれ検索すると、
さんがすでに行われていたので、それを参考にやってみた。

http://chirokings.blogspot.com/2011/02/gaerubyrails-on-windows-2311.html

手順は

  1. ruby(1.8.7)にrails(2.3.11)をインストール
  2. rubyにappengine-jrubywoをインストール
  3. rails2311_appengine.rbをダウンロードしそれを一部修正
  4. 3ファイルをもとにプロジェクト作成
  5. dev_appserver.rb.baでサーバを起動
  6. アプリケーションIDを/WEB-INF/appengine-web.xmlに指定
  7. appcfg.rb.batでGAEにデプロイ

つまるところは特になしだけど、5を行うことで6のファイルが作成される。

コマンドと補足

  1. gem install rails -v 2.3.11
  2. gem install google-appengine 
  3. Fetch configuration files ⇒FileUtils.mkdir_p 'app/controllers/rails'
  4. ruby rails2311_appengine.rb
  5. dev_appserver.rb.bat .
  6. <application>xxxIDapplication> のxxxIDをアプリ名にする
  7. appcfg.rb.bat --enable_jar_splitting update .
次はDBアクセスだー!

原子力by池上彰の学べるニュース

テレビで原子力の基礎をやっていたのでそれを記載。

■原子力の基礎
原子は中性子と陽子でできている。
原子の原子核に中性子をぶつけた時に原子核が分裂する。
その際に発生するエネルギーが原子力。

核分裂する際に中性子が2個から3個飛び出す。それが更に他の原子核
にぶつかって核分裂を繰り返す。この繰り返しを臨海という。

■ウランの種類
ウラン235 0.7%
ウラン238 それ以外

中性子の数が3つ違い、ウラン235は核分裂する。

■ウラン濃縮
ウラン鉱山⇒粉末⇒遠心分離機でウラン235を濃縮する。
ウラン235のほうがウラン238より中性子3つ分軽いのでそれ
によりウラン235を分離する

■高濃縮による用途の違い
3~5% 原子力発電
90%   原子爆弾

原子力発電では核分裂の際の中性子の量を制御棒でコントロールしている。
原子爆弾の場合は中性子を制御できないため、核分裂がいっきにおきる。


■放射線量について
単位:ミリシーベルト(mSv)

0.05 : 胸部X線[1回]
0.19 : ニューヨーク飛行機[1回]
6.9  : CTスキャン[1回]
50   : 原子力で働く人[年間]
500 : 白血球の一時的現象
7000 : 死亡

■そもそもベクレルとシーベルトって!?
出している放射線量 => ベクレル
人体が受ける影響 => シーベルト

■式 ベクレル⇒シーベルト
2.2 x 10の-5乗

■水1ℓに100ベクレル(Bq)の放射線量の場合
100 x 2.2x 10の-5乗
= 2.2 x 10の-3乗 Sv
= 2.2mSv

■年間自然放射被爆
2.4mSv= 2400mSv


■その他
・そもそも原子力発電所で原子爆発のようなことは起こりえない。
・原子力が海岸にあるのは、水蒸気発電の水を海水で冷やす必要があるため。
・セシウムにしてもヨウ素にしても体に入ってもずっととどまることはない。
  セシウムも100日ぐらいで尿とかと一緒に体の外に出る。

2011年3月21日月曜日

GAEでBigtableアクセスの基礎

Bigtableにアクセスするに必要なクラスファイルは以下の2つ。
  • データクラス定義ファイル
  • 永続化マネージャクラスファイル
ちなみにBigtableとRDBの呼び方の違い
 レコード⇒entity
 データ項目⇒property


データ定義ファイル記載ルール
  • データ項目には@Persistentアノテーションをつける
  • プライマリキーは@PrimaryKeyアノテーションをつける
  • コンストラクタでメンバ変数に値を設定する
  • データ項目にアクセッサを作成する
永続化マネージャ
  • PersistenceManagerクラスをインスタンス生成するためのFactoryクラスとして生成する
  • 一度だけでよいのでSingletoneで実装する

あとはこれらを使用するところの修正
  • データ定義ファイルインスタンス生成
  • 永続化マネージャファクトリでマネージャクラス生成
  • makePersistentの引数にデータ定義をわたし、永続化実行
  • 永続化マネージャclose
あとはGAEへデプロイし実行。なんとできました!!


ふっふっふ。

slim3入門

WebToolKitの構成がわかったところでいよいよGAEのプラグインである
slim3を使ってみる。

以下参照サイト。

slim3開発でわかったこと
  • build.xmlを使用しながら必要なMVCを作成していく
  • buildした時にはソースと一緒にTestソースも同時に作成される。つまりTest駆動型開発。
  • ソース修正・追加してもサーバの再起動は不要
以下、作成した手順。(参照したサイトのままですが・・)
①コントローラ作成
build.xmlのgen-controllerを実行
antには/twitter/を入力
 ⇒/twitter/indexの短縮

②フォームの修正
war/twitter/index.htmlを修正

③/twitter/tweet用のコントローラ作成
build.xmlのgen-controller-without-viewを実行
antには/twitter/tweetを入力

④twitter/TweetControllerコントローラの修正
return redirect(basePath);

⑤モデルを作成
build.xmlのgen-modelを実行
antにはTweetを入力

⑥モデルを修正
必要な項目&アクセッサ追加

⑦モデルようのサービス作成
build.xmlのgen-serviceを実行
antにはTweetServiceを入力

⑧サービスを修正
public Tweet tweet(Map input) {
Tweet tweet = new Tweet();
BeanUtil.copy(input, tweet);
Transaction tx = Datastore.beginTransaction();
Datastore.put(tweet);
tx.commit();
return tweet;
}

⑨サービスを呼び出すようにコントローラをさらに修正
public Navigation run() throws Exception {
service.tweet(new RequestMap(request));
return redirect(basePath);
}

⑩実行!

あと以下にアクセスするとgaeのローカル状況をいろいろ見れるみたい

Google Web Toolkit入門

半年ほど前にGAEを試したがそのときはGWTは使わなかった。
今回GAEのプラグインのslim3を試すにあたってそもそもGWTの構成とか
まったく知らないのでまずはGWTの基礎を勉強する。

以下を参照。

本家サイト
 http://code.google.com/intl/ja/webtoolkit/

GWT入門サイト
 http://gwt.keicode.com/

手順
①環境構築
②新規プロジェクト作成
③コンパイル
④実行
⑤GAEへデプロイ

はまったのは、実行時にChromeを使用していたが、GWTプラグインが入っている
はずだったが、うまくインストールされていなかったため、実際に実行しアクセスしようとすると
サーブレットアクセスで404NotFoundエラーが出たこと。

その場合は、一度GWTプラグインをアンインストールして再度入れなおしてから
実行してアクセスすれば問題ないよう。

あとわかったことは、
  1. GWTで作成したコードは③コンパイルしてあげないとjavascriptとかの実際のファイルに変換されないこと。
  2. GWTを使うとブラウザにpluginを入れないと表示されないこと。

とくに2は一般的に広めるには使うほうとしては面倒かも。。

2011年3月20日日曜日

アバター

連休中に見ようと4本かりたうちの3本目。

3時間ぐらいの永い映画だったけどCGが凄いのもさることながら話も
面白かったので見ていて時間を感じなかった。

内容的には、先住民族が住んでいる土地を人間が開発のために破壊する
という、何かインディアンと開拓者の戦いのような話でよくありそうな話
ではあるが、そこに感情移入せずにはおれないほどナヴィの人の表情は
自然に感じた。

格闘シーンや先頭シーンも描画の仕方がうまかったし、スピーディーなだけ
じゃなくメリハリがあり、見ていた飽きなかった。

またナヴィの人は髪の毛で動物と結びつき、その動物と同化して空や陸を
自由に移動するが、それはエイワという巨大なネットワークの一部で全ては
そのエイワというネットワークで繋がっているという発想も興味深いと思った。

この映画を3Dで映画館で見た人はより鮮明に記憶に残ったことでしょう。
それができなかったのがちょっと残念、と思うぐらいよかった。


あとジェームズキャメロンの話の中では一番面白かった。

震災から1週間

3連休2日目。
今日で東北大震災から1週間とちょっと。

昨日は一日家にいたので今日は午前中から町に出た。

電車は普段どおり走っていたが人気はまばらだった。
銀座で降り有楽町ビックに行き、パソコンを見てから銀座のスタバで
本を読んで帰ってきた。

余震もだいぶおさまり、町と人も少し落ち着きを戻しつつあるが、
節電の影響でいたるところの電気はまだ消えたままだった。

ブランド店は軒並み店をまだ閉めたままだったが、昼過ぎになると
ひと気もだいぶ出てきた。今週末はそれ程余震がなかったせいか、はたまた
余震に人が慣れたのか、どちらにしろ先週末とは今の事態に対しての
恐怖心は和らいでいるように感じた。

今回の地震で気づいた点は3つ。
1つは自然の前では人は非常に弱いこと。
2つ目は普段は気にしないけど、結局は現代社会は電気や水道、
ガスといったインフラの上に成り立っていること。
3つ目は最終的には自分と自分の周りの環境が大事であること。


震災で一生分の涙を流し、避難生活を送っている人がいる一方で、震災報道
を伝えていたテレビも徐々に普段どおりのお笑いや情報番組に変わっていき
いつの間にか震災は遠いもののように感じてしまいそうになる。

そしてまた余震が来ることでその恐怖を思い出す。


人はよくできていて、どんなにつらいことも時間がたつにつれて少しずつ
その痛みが和らいでいく。しかしそれをすべて忘れることもない。


偶然震災を受けた人、たまたま震災を受けなかった人。
そこに何も違いはなかった。なのに一方で耐え難い苦しみを味わい、一方では
テレビ番組をみて笑を取り戻しつつある。


生活を取り戻すことは大事。

ただ苦しんでいる人がいる現実をしっかり見て、自分に何ができるのか、
立ち止まってもう一度考える必要がある気がした。