Portable Ubuntu

http://portable-ubuntu.of-jp.com/
coLinuxのPortable版+Ubuntu版らしい。


andLinuxを使ったときはLinuxマシンが別途あったので特別に重宝しなかったが、今は無いのでVirtualBoxの代わりに使えるかもしれない。
昔よりマシンのスペックあがってるから、常時起動してても気にならないかもしれないし。


とりあえず、一番新しいTRESを入れてみよう。不安定って書いてる人もいたけど……ま、まあ、とりあえずやってみるだけ。Portableなんだから失敗したら消すだけ……うん。そう自分を言い聞かせよう。


→駄目でした。起動中にmodprobeに失敗して止まった。
うーん、これを自力で修正するのと、古いバージョン入れるのと、どっちが早いか?
とりあえず何も考えないで済む、後者でいこう。ということでDOS_LITEを入れる。


こっちはOK。ちゃんと起動した。
NATも正常動作してて、apt-get updateもOK.
日本語にする必要は特にないので、Timezoneだけ修正。


他にいじるのは

  1. メモリ。標準で256だと少なすぎる。マシンのメモリが4GB、うち1GBをRAM DISCにして、普段からWindowsで1GB〜2GB使うので、さすがに1GBは割り当てられないか。とりあえず512。別にAndroidをビルドするわけでもないので足りるだろう。
  2. swapの場所。TEMPをRAMDISCに置いてるので、swapに256使われると、メモリを768使われてしまう。適当にC:\TEMPにでも置く。……あれ、設定はどこだろう。↑のサイトは情報が古くてファイルが変わってしまっている模様。


問題発生。
apt-getしたら、落ちた。Resource Temporary Failure。

iOS4

iPhoneのファームがupdateされたので適用してみた。
マルチタスクだけあってアプリの切り替わりがよくなった。
電池の持ちも良くなったらしいが・・・・・・普段多用しない人間にとって重要な待機電流は下がったのかな?


http://www.lifehacker.jp/2010/06/100622ios4.html
カメラを無音にする技。
なるほど、音楽を鳴らしている時は、音量ボタンが音楽の音量の制御に使用され、
かつその音量がカメラにも適用されるのか。
普段は着信音に適用されるが、この仕様の隙間をうまく突いた技だ。

WDの2TB HDD買いました

VirtualBox入れてAndroidのソースを落とす環境作ったら、HDDがそろそろ10GB切ってしまったので
新しくHDDを買うことにした。
(正直10GBもあればもうしばらくは持つとは思うが、最近HDDを買ってなかったので・・・)


最近は(といってもいつも”最近”と言ってる気がするけど・・・)ほんとHDD安いね。
2TBで1万切るとは。


あと、知らなかったが、最近のWDのHDDはセクタが4096になっているのね。
http://journal.mycom.co.jp/news/2009/12/18/021/index.html


現在使用してるメインPCはXPだが、XPではWDの専用ツール使わないと速度が非常に遅いそうなので
一台持ってるvistaノートPCでフォーマットした。
うーむ、そろそろXPも去り時か……

portrait と landscapeの処理速度

もぐら叩きをやっていて気づいたが、landscapeの方が処理が早い。


いつも、縦スクロールが減るという理由でportraitばかり使っていたが、
こういうのを味わうとlandscapeに適応せざるを得ない……


まあ、もぐら叩きのようなアプリのみportraitが早い、という可能性もあるけども。


どちらにせよ、何故速度差が生じるのかが気になるなあ。
描画関係のclassがportrait基準、とか?

adbは必ず使えるのか?

ふと思ったが、adbはAndroid端末なら必ず使えるんだろうか?
EKEN M001はUSB経由では使えず、Wi-Fi経由でなら使えるのと逆に
Wi-Fiでは使えずにUSBで使える端末もあるだろう。
それこそ全く使えない端末も携帯ならおかしくはないだろうし……


そういう情報載ってるとこ、あるのかな?
買う前に絶対調べておかないと、遊べない。

もぐら叩き2

http://www.hakkaku.net/series/android-で再開する-java-プログラミング

様にまともなもぐら叩きがあったので勉強させていただく。


大きな違いは、Viewをextendsしたclassの中に、もぐらclassを出現させてるところと、
そのclassをTimer周期ごとに再描画してるところ、
あたり判定をonTouchEventで得られる座標から行っているところ、か。
あとは自分が何故かゲームのストップ/リセットに力入れたあたり。


一昨日の時点では、あたり判定はButtonのonClickしか思いつかなかった。そりゃ、Buttonだってtouchされた座標データ使ってるよなあ・・・
Randomで表示変えること前提にしてるから、Layoutに縛られなくて済むし。
あとArrayListとか、Listの存在忘れてた……我ながら酷い。


もう少しちゃんとサンプル見て勉強しよう。

もぐら叩き

ボタンのonClickが使えるならもぐら叩きを作れるんじゃ?ということで作ってみた。


とりあえず.javaだけ。layoutはTableLayout使ってスタートボタン1つ、結果表示TextView1つ、似非モグラボタン6つ作っただけ。
タイマが使えて、onClick使えて、ならいけるんじゃね?、と頭の中でまともに考えずにコードを書いた結果がこのありさまだよ!

public class MoguraTataki extends Activity implements OnClickListener{
	// Views
	private Button button_start;
	private Button button_00;
	private Button button_01;
	private Button button_02;
	private Button button_10;
	private Button button_11;
	private Button button_12;
	private TextView point_text;
	
	// game values
	private Boolean game_start = false;
	private Integer point = 0;
	private Boolean mogura_status[];
	
	// for Timer
	Timer timer = null;
	Handler handler;
	private Integer time;
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mogura);
        
        button_start = (Button) findViewById(R.id.mogura_Button_start);
        button_00 = (Button) findViewById(R.id.mogura_Button0_0);
        button_01 = (Button) findViewById(R.id.mogura_Button0_1);
        button_02 = (Button) findViewById(R.id.mogura_Button0_2);
        button_10 = (Button) findViewById(R.id.mogura_Button1_0);
        button_11 = (Button) findViewById(R.id.mogura_Button1_1);
        button_12 = (Button) findViewById(R.id.mogura_Button1_2);
        point_text = (TextView) findViewById(R.id.mogura_textView);
        
        mogura_status = new Boolean[6];
        
        button_start.setOnClickListener(this);
        button_00.setOnClickListener(this);
        button_01.setOnClickListener(this);
        button_02.setOnClickListener(this);
        button_10.setOnClickListener(this);
        button_11.setOnClickListener(this);
        button_12.setOnClickListener(this);
        Init();
        
        // for timer
        timer = new Timer(true);
        handler = new Handler();
        timer.schedule( new TimerTask() {
			@Override
			public void run() {
				handler.post(new Runnable() {
					@Override
					public void run() {
						TimerEvent();
					}
				});
			}
		}, 100, 100); // first delay and delay interval, [ms]
    }
    
    private void TimerEvent(){
    	// init timer
    	if( time == 0 && game_start == true ){
    		time = 100;
    	}
    	// in game start
    	if( time != 0){
    		if( time % 10 == 0 ){// make mogura
    			EnableMogura();
    		}
    		else if( time % 10 == 5 ){// vanish mogura
    			DisableMogura();
    		}
    		time--;
    		if(time==0) GameStop();
    	}
    }
    
    private void EnableMogura(){
    	Random rand = new Random();
    	int r = rand.nextInt(6);
    	switch(r){
    	case 0:
    		button_00.setText("○○○○○");
    		break;
    	case 1:
    		button_01.setText("○○○○○");
    		break;
    	case 2:
    		button_02.setText("○○○○○");
    		break;
    	case 3:
    		button_10.setText("○○○○○");
    		break;
    	case 4:
    		button_11.setText("○○○○○");
    		break;
    	case 5:
    		button_12.setText("○○○○○");
    		break;
    	}
    		mogura_status[r] = true;
    }
    
    private void DisableMogura(){
    	int r;
    	for(r=0; r<6; r++){
    		if(mogura_status[r] == true) {
		    	DisableMogura(r);
		    	break;
    		}
    	}
    }
    
    private void DisableMogura(int r){
    	if(r < 0 && 5 < r) return;
    	switch(r){
    	case 0:
    		button_00.setText("×××××");
    		break;
    	case 1:
    		button_01.setText("×××××");
    		break;
    	case 2:
    		button_02.setText("×××××");
    		break;
    	case 3:
    		button_10.setText("×××××");
    		break;
    	case 4:
    		button_11.setText("×××××");
    		break;
    	case 5:
    		button_12.setText("×××××");
    		break;
    	}
		mogura_status[r] = false;
    	
    }
	
    public void onClick(View v){
		if( game_start == false){ // now no game
	    	if(v == button_start){// start or reset game
    			GameStart();
    		}
    	}
    	else{
    		if(v == button_start){
    			GameReset();
    		}
    		else if (v == button_00){
    			if(mogura_status[0] == true){
    				PointUp();
    				DisableMogura(0);
    			}
    		}
    		else if (v == button_01){
    			if(mogura_status[1] == true){
    				PointUp();
    				DisableMogura(1);
    			}
    		}
    		else if (v == button_02){
    			if(mogura_status[2] == true){
    				PointUp();
    				DisableMogura(2);
    			}
    		}
    		else if (v == button_10){
    			if(mogura_status[3] == true){
    				PointUp();
    				DisableMogura(3);
    			}
    		}
    		else if (v == button_11){
    			if(mogura_status[4] == true){
    				PointUp();
    				DisableMogura(4);
    			}
    		}
    		else if (v == button_12){
    			if(mogura_status[5] == true){
    				PointUp();
    				DisableMogura(5);
    			}
    		}
    	}
    }
    
    private void Init(){
    	point = 0;
    	game_start = false;
    	time=0;
    	button_start.setText("start");
    	point_text.setText("point:" + point);
    	for(int i=0; i<6; i++){
    		DisableMogura(i);
    	}
    }
    
    private void GameStart(){
    	Init();
    	game_start = true;
    	button_start.setText("reset");
    }
    private void GameReset(){
    	game_start = false;
    	Init();
    }
    
    private void GameStop(){
    	game_start = false;
    	button_start.setText("start");
    }
    
    private void PointUp(){
		point++;
    	point_text.setText("point:" + point);
    }
}

自分で書いててイライラしてた。
どのボタンを押したかどうかの感知を決めうちで書いてたり、ボタンのsetTextも決めうちだったり……
あと書きながら使いそうなコードを追加していったので要らないコード残ってたり……


たぶんぐぐったらもっと綺麗なもぐら叩き作ってる人いるんだろうなあ。
明日はそれサガして反省会しよう。