2011年4月7日木曜日

入学式!

きょうは長男の入学式!

天気もよくて入学日和。

家族で歩いて小学校まで。ゆっくり歩いて15分ぐらい。
明日からは一人で歩いていくのか、と思うと少し不安だけど
小学校に入ると6年生のお兄さんやお姉さんが優しくクラスまで
誘導してくれ、クラス内でも男の子がお笑いをやったりしてリラックス
してる感じで一安心。

体育館での入学式、2年生が歌やメロディオンでお迎え。
その後先生紹介され、担任の先生は年配の女の先生。
厳しい感じかと思ったけど、その後の教室での話を聞いてその考えは
一変しとてもやさしいおおらかな先生だな、と思い一安心。

帰りは同じ幼稚園で同じクラスになった親子と一緒に帰って、そのあと
近くの川原でバーベキュー。

なんだか心配しているのは親だけで、子供はそれ程でもないのかな、
と親の心子知らず、とはよく言ったもんです。

また一つ成長したわが子でした。

2011年4月1日金曜日

とりあえず自分にできること Android停電アプリ

地震から3週間。

とりあえず自分にできることとして、アプリを作った。
すでに輪番停電の状態を検知するアプリはアンドロイドでも出ているけど、それでも自分でつくることに
何か意味が出るような気がしたので作成した。

Androidアプリ 停電観測

ただAPIをたたいているだけなので、全然だけど少しでも今の世の中の役に立てればと思います。

2011年3月31日木曜日

Android MapViewでクリックイベント取得

MapViewをクリックした時に、その場所のジオコードを取得し、そのジオコードを元にいろんなAPIをたたきたい、ということでやってみたが、結構はまったのでいかに記載。

とりあえず最初に以下のようにMapViewのOnClickListenerのEventを取得するようにした。


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

  MapView mapView = (MapView)findViewById(R.id.mapView);
                mapView.setBuiltInZoomControls(true);
                mapView.setOnTouchListener(new OnTouchListener() {
   public boolean onTouch(View v, MotionEvent event) {
    GeoPoint point = mapView.getMapCenter(); // TODO 自動生成されたメソッド・スタブ
    lati = point.getLatitudeE6() / 1E6;
    lon = point.getLongitudeE6() / 1E6;


    // ここでAPIよびだし!!

    mMapController.animateTo(point);
    Log.d(TAG, "click lati=" + lati + " lon=" + lon);
    return false;
   }
  });
しかししかーし、OnTouchイベントは1回しかこない!
ちなみにOnTouchをTrueにしてリターンすると、それ以降の処理を受け付けれなくなった。
また、OnClickListenerでもいけるかな!?と思ったけどEventすら受け付けなかった。

ちなみに画面をタップした時にその場所にアイコンを表示するために、Overlayクラスを実装していた。
うーむ、とあれこれbreakを張って見ているとどうもOverlayクラスにはEventが来ていた。

おおー、じゃこっちでとればいいじゃん、ということでOverlayで取得するように変更!
以下ソース。

public class IconOverlay extends Overlay {
 Bitmap mIcon;
 int mOffsetX;
 int mOffsetY;

 GeoPoint mPoint;

 IconOverlay(Bitmap icon, GeoPoint point){
  mIcon = icon;
  mOffsetX = 0 - icon.getWidth() / 2;
  mOffsetY = 0 - icon.getHeight() / 2;
  mPoint = point;

 }


 @Override
    public boolean onTap(GeoPoint geopoint, MapView mapview) {
     mPoint = geopoint;
        // ここでAPIをよびだし!!!
     return super.onTap(geopoint, mapview);
    }

 @Override
    public void draw(Canvas canvas, MapView mapview, boolean shadow) {
  super.draw(canvas, mapview, shadow);

  if (!shadow){
   Projection projection = mapview.getProjection();
   Point point = new Point();
   projection.toPixels(mPoint, point);
   point.offset(mOffsetX, mOffsetY);

   canvas.drawBitmap(mIcon, point.x, point.y, null);
  }
 }

}

2011年3月30日水曜日

学べるニュース プルトニウム

池上彰の学べるニュースで原子力特集、またやっていたのでまとめよう。

■プルトニウムについて
・プルトニウムは自然界にないもので核分裂の時にできるもの。
・プルトニウムも核分裂を起こす。
・プルトニウムとウランを混合した燃料をMOX燃料という。
・MOX燃料を使用した原子炉をプルサーマル原子炉といい、福島第一原発の3号機はこれ。
・核燃料からプルトニウムを増幅させようとしたものが、高速増殖炉(もんじゅ)である。
・プルトニウムは重いが出すアルファ線は人体影響を及ぼしやすい。

■放射線について
放射線には
・アルファ線
・ガンマ線
・ベータ線
・中性子線
がある。

アルファ線は紙とかも貫通しにくい。
ガンマ線はアルミニウム箔は貫通しにくい。
ベータ線は厚い鉄鋼は貫通しにくい。
中性子線は水やコンクリートを貫通しにくい。

プルトニウムはアルファ線。

2011年3月29日火曜日

Android  MapViewへキー発行

ひさびさMapViewをつかってAndroidアプリを作成しようとおもったら、MapViewが表示されなかった。
理由は認証キーが変わっていたためでした。

念のため以下、認証キーの発行方法。
ただし、デバッグ用と正式版はちがいます!!これ注意しないと、実際にストアに上げた後に
地図が表示されない!っと騒ぐ羽目になっちゃいます。(自分はその口でした・・)

■発行手順(デバッグ用)
①Javaのkeytoolでandroidのフィンガープリントを発行
②①でandroidサイトから発行てもらう。


①Javaのkeytoolでandroidのフィンガープリントを発行
keytoolはJavaのbinに存在しますー。


 cd "C:\Program Files\Java\jdk1.6.0_10\bin"
 keytool -list -alias androiddebugkey -keystore "C:\Documents and Settings\KENZY\.android\debug.keystore" -storepass android -keypass android

 androiddebugkey, 2011/03/25, PrivateKeyEntry,
 証明書のフィンガープリント (MD5): DC:A0:9C:F1:10:xxxx.....


②①でandroidサイトから発行てもらう。

あとは以下にアクセスし、上記の認証情報を入力して同意するとキーがもらえる。

http://code.google.com/intl/ja/android/maps-api-signup.html


■発行手順(androidストアアップ用)
手順はおなじだけど、①のフィンガープリントの発行方法が違います。

フィンガープリント発行する元となるkeystoreをAndroidMarketにアップする際に使用するkeystoreを使えばよいのです。xxxxがkeystore

 keytool -list -keystore xxxx


でOK!!



2011年3月27日日曜日

スクレイピングって

Webサイトから必要な情報を引っ張ってくることをスクレイピング
っていうらしい。

確かに必要な情報を取りたい時に、サイトがAPIを提供していれば
それを使えばいいけど、そういうの提供していないサイトから情報を
取得するのってどうすればいいのかな!?っとちょっと思っててグーぐる
ったらこの単語に引っかかった。

で、調べたらjavascriptで以下のサイトでやっていた。

 http://blog.goo.ne.jp/xmldtp/e/625be225495dcb649161d9a3c09d6816

あとAndroidだとWebViewをつかって!?簡単にできそうなので以下
参考にやってみようかな。

 http://android.g.hatena.ne.jp/keigoi/20100211/1265892976
 http://fromnorth.blogspot.com/2010/02/webview.html

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);
 }
}

【スマート農業】 いまさらだけど、いまだからこその農業IoT 

久々投稿 転職してはや2年半。バタバタしてる中で、あーっという間に時間は過ぎてきた。 仕事はそれなりに順調だけど、ただやっぱり自分で何かを起こす!ということはではできていなく、、、年齢45をこえ、、、、、とくに昔からずーとやろうやろうと言って実現できてなかっった農業IoT。。 去...