My Photo

Recent Trackbacks

January 31, 2012

Androidアプリ開発メモ060:画面が回転するとonDestroy()が呼ばれてActivityが破棄される

関連する記事:
Androidアプリ開発メモ027:表示の向き
Androidアプリ開発メモ057:AVDの画面の向きを変更する

画面を回転させるとonDestroy()が呼ばれてActivityが破棄され、onCreate()が呼ばれて新たなActivityが作られる。
これを避ける方法として、参考ページではAndroidManifest.xmlでActivity要素にandroid:screenOrientation属性を指定して画面の向きを固定した上で、センサから回転を取得して自力が表示を回転する処理を実装する方法を載せている。

自分が今作っているタイマーアプリでは、横向き画面が必要とは思えないのでandroid:screenOrientation属性を指定するだけにしておいた。

参考ページ:Androidアプリの画面回転時にonDestroyさせない方法 | Tech Booster

Androidアプリ開発メモ059:スリープから復帰させる

関連する記事:Androidアプリ開発メモ058:ロック画面を出さないようにする

「スリープから復帰させる」と言っても、そもそもどういう状態をスリープというのかがわからない。
電源は入っているけど画面の真っ暗の状態のことではないとどこぞに書いてあったが、自分としては
「しばら端末を操作せずに置いて画面が真っ暗になった状態」
だと思っている^^;

スリープから復帰させるにはまず PowerManager を getSystemService() で取得し、その PowerManager#newWakeLock() で WakeLock を取得して acquire() でロックを取得する。
ロックを取得したら、適切なタイミングでロックを release() しなければならない。そうしないとリソースの解放漏れ?ずっとスリープにならなくなる?

android.os.PowerManagerクラス
public PowerManager.WakeLock newWakeLock(int flags, String tag)
フラグパラメータのレベルにあるウェイクロックを得る。ウェイクロックを取得するためにそのオブジェクト上で acquire() を呼び、終わったら release() を呼ぶ。
もしスクリーンをonにキープするためにこれを使うなら、代わりに FLAG_KEEP_SCREEN_ON を使うことを考えるべきである。このwindowフラグはプラットフォームによって正確に管理されるだろう、ユーザがアプリケーション間を動くときに。そして特別なパーミッションを必要としない。
引数
  flags  フラグ値の組み合わせ
  tag    デバッグのためのクラス名(または他のタグ)

android.os.PowerManager.WakeLockクラス
public void acquire()
デバイスをウェイクアップロックを作成したときに要求したレベルでオンにする。

android.os.PowerManager.WakeLockクラス
public void release()
CPUまたは画面がonであるという主張をリリースする。
リリースされ後すぐにoffになるだろう。すなわち他の保持されているロックがあればoffにならないだろう。

newWakeLock() で指定するフラグは、スリープ状態から起こして画面を表示するならば
FLAG_SHOW_WHEN_LOCKED | FLAG_TURN_SCREEN_ON | FLAG_DISMISS_KEYGUARD
で良いようだ。

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
	| PowerManager.ACQUIRE_CAUSES_WAKEUP
	| PowerManager.ON_AFTER_RELEASE,
	"TimerExample6");
wakeLock.acquire();
// この間、ロックを取得した状態にある
wakeLock.release();

参考ページ:
Y.A.M の 雑記帳: Android PowerManager を使う
画面を ON のままにする方法 - Android 開発入門
液晶パネルのWakeLockを取得し、Sleep状態からWake状態へ遷移する | Tech Booster
スクリーンロックを解除する方法 - 明日の鍵

January 29, 2012

朝日新聞土曜版の「職場の理不尽Q&A」が頭にくる

朝日新聞の土曜版「be on Saturday」に「職場の理不尽Q&A」という職場のことに関する人生相談みたいなコーナーがあるのだが、この回答が毎回毎回とても頭に来る。
どんな質問に対しても、回答の基本姿勢は
「長いものには巻かれましょう」
「出る杭は打たれるよ、静かにしてましょう」
「人のことをとやかく言ってるけど、あなた自身に問題あるんじゃないの?」
だ。

28日のこのコーナーでは、職場はで不正出張をしている人を上司に告発したいという相談に対して
「そんなことしてもあなたが職場にいづらくなるだけですよ。」
「そもそもそんなこと思うなんて、あなた自身に問題あるんじゃないですか?」
とうものだった。
先日、オリンパスが内部通報者に対する重大な人権侵害をしたとして東京弁護士会から警告を受けた。公益通報者保護法が施行されて内部告発した人を保護していこうという世間の流れなのに、朝日新聞は「会社で不正行為を見つけてもだまっとけよ。」という考えらしい。

他に以前の相談で覚えているのは
「やってもやらなくて意味なさそうな仕事をどんどん押し付けられて、忙しすぎて死にそう。」
という相談に対して
「効果なさそうな仕事はやらなきゃいいじゃん」
という回答だった。
相談者はやる・やらいないの決定権を持ってない人で、上から「つべこべ言わずにとにかくやれっ!」って言われてるから困って相談してるんだろう。
なのに上記のような回答。バカじゃなかろうか。

「長いものには巻かれろ」、「出る杭は打たれる」、「見てみぬふり」って日本人の悪いところだと思う。
それを大新聞が助長するようなことを言っている。
なんか悲しくなる。。。

Androidアプリ開発メモ058:ロック画面を出さないようにする

タイマーなどのアプリで画面のバックライトが消えた状態やロック画面からアクティビティを表示する方法を検索すると PowerManager と KeyguardManager を使う例が多く出てくる。
ただ、KeyguardManager.KeyguardLock は現在はdeprecatedになっていて、代わりに windowに WindowManager.LayoutParams の FLAG_DISMISS_KEYGUARD と FLAG_SHOW_WHEN_LOCKED をセットする方法が使うようにドキュメントに書いてある。deprecatedになった KeyguardManager のメソッドや KeyguardManager.KeyguardLock のところに。

フラグをセットした場合の動きを確認するサンプルコード

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	
	// フラグをセット
	Button button5 = (Button)findViewById(R.id.button5);
	button5.setOnClickListener(new View.OnClickListener() {
		public void onClick(View v) {
			Window window = getWindow();
			window.addFlags(
				| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
				| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
		}
	});
	
	// フラグをクリア
	Button button6 = (Button)findViewById(R.id.button6);
	button6.setOnClickListener(new View.OnClickListener() {
		public void onClick(View v) {
			Window window = getWindow();
			window.clearFlags(
				| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
				| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
		}
	});
}

上記のコードを実装したボタンがあるだけのアプリは実機(Xperia ray)で次のように動いた。

  1. ボタン5を押す(フラグがセットされる)。
  2. 電源ボタンを押すと、画面のバックライトが消灯する。
  3. 電源ボタンかHOMEキーを押すと、バックライトが点灯しアプリの画面が表示される。
  4. ボタン6を押す(フラグをクリア)
  5. 電源ボタンを押すと、画面のバックライトが消灯する。
  6. 電源ボタンかHOMEキーを押すと、バックライトが点灯しロック画面が表示される。

参考ページによると、「lock pattern」とやらのあり・なしで同じフラグをせっとしてあっても動きが違うようだ。
lock pattern ってのは
設定>現在地情報とセキュリティ>画面ロックの設定>パターン
のことだろうか?

今、AlarmManagerを使って5分とか10分とか間隔を指定すると一定時間毎に画面が表示されて音が鳴るようなアプリを作ろうとしている。
このアプリでは FLAG_DISMISS_KEYGUARD と FLAG_SHOW_WHEN_LOCKED に加えて FLAG_TURN_SCREEN_ON をWindowにセットしている。
FLAG_TURN_SCREEN_ON は自信はないが、たぶん画面が表示されるときにバックライトを点灯するということだと思う。
これでバックライトが消えた状態でも時間が来れば画面が表示される、と思ったが、うまくいかないときもある。画面は真っ暗なままで音だけが鳴る。
表示される場合/表示されない場合の切り分けができていない。

また、フラグとは関係ないかもしれないが、アラームの時間が時々遅れたり、いつまでたってもアラームが来なかったり、いつの間にかアラームがキャンセルされていたりする。原因はどれも不明で未解決。

参考ページ:
Y.A.M の 雑記帳: Android FLAG_DISMISS_KEYGUARD と FLAG_SHOW_WHEN_LOCKED を使う
スクリーンロックを解除する方法 - 明日の鍵
Booster

Androidアプリ開発メモ057:AVDの画面の向きを変更する

Ctrl+F11 または Ctrl+F12 で画面の向きを変更できる。
「Ctrl+F11 で横向き、Ctrl+F12 で縦向き」と書いてあるところもあるが、どちらでも今縦なら横に、横なら縦に向きになる。
それぞれ右回転、左回転ってことだろうか。

実際にAVDで試すと、ホーム画面だとうまく向きが変わってくれる。
しかしアプリだと動きがおかしい。縦から横にしたときは問題ないのだが、横から縦にすると下の画像のようにデバイスは縦画面になるが画面の中が横画面の時のままになる。
何でだろう?

ガンダムAGE第2部、少し見たけど相変わらずひどい #anime

冒頭少し見たけど、ひどすぎるなあ。
第1部から25年たったけど戦争は続いていて、ヴェイガンが徐々に勢力を広げているって、あり得ないだろう。
第1部の頃はヴェイガンの方が技術レベルが高さから優位に立っているのはわかる。しかしあの時点で既に2機だけとはいえガンダムと白い人(ウルフだっけ?)のMSというヴェイガンに対抗できる高性能機があった。
それから25年間あったらガンダムに使われている技術をフィードバックしてヴェイガンのMSに対抗できる量産型MSが作れるだろう。
それにヴェイガンは失敗した火星移民の生き残りで、人口は地球連邦側より遙かに少ないはずだ。ファーストのジオンと同じでマンパワーその他国力で大きく劣るわけだから戦争に勝つには短期決戦しかあり得ない。25年戦い続けて優位を保ってるって論理的におかしい。
SEEDや00はなぜ主人公が強いかとかなぜガンダムが強いかという理由付けがちゃんとあった。
AGEはそういうのが全くない。
子供向けとはいえ、ガンダムを名乗るならもうちょっときちんとした設定を考えべきだったのではないか。


笹本祐一さんが最近のガンダムについてつぶやく - Togetterの内容は非常に納得できるものだ。
ガンダムをラーメンにたとえると、GやWはラーメンかどうかは怪しいが食べてみればおいしい(おいしくないという人も当然いるが)。
しかしAGEはラーメンだとかラーメンじゃないかという以前に、料理にすらなっていないと。

January 28, 2012

2012シーズン新潟始動 #albirex

23日に新体制の発表があり、チームが動き出した。
さて、今シーズンの戦力について考えると戦力ダウンは間違いない。新潟のストロングポイントだったヨンチョルと高徳が抜けて、さらにCBのレギュラー千葉が移籍。ブルロペが残ってくれたのは本当に助かった。
補強は前の方がガンバから平井、韓国の大卒キムヨングン、ブラジルからアラン・ミネイロ。SBに京都から中村、CBに湘南から大井健太郎。
高卒の鈴木武蔵はJ1ですぐ通用するだろうか。素質は間違いなくあると思うから、途中出場でもいいから使って育てて欲しい。

よくわからんのが千葉の穴埋めに大野を戻すのではなく大井を取って、大野は湘南へレンタルしたこと。
これは、新潟は大野は正直J1では厳しいと思っている、大井はJ1でやりたい、湘南は大井の代わりをよこせということでこういう移籍になったのか。
大井は磐田では長年レギュラーCBが出れないときの控え、去年はJ2だったから、J1でレギュラーとしてシーズンを過ごすのは初めてか。奮起を期待しよう。がんばれ大井。

こう見るとJ1で実績あるのは平井だけ。キムヨングンやアラン・ミネイロがチームに早くフィットして活躍してくれれば中位くらいにいけるかもしれないが、そうじゃないと厳しい。
どこぞの「一番早い順位予想」でもことごとく16位以下だった。無理もない^^;

今週のサカダイの特集は「2012 Jリーグ全40クラブの補強診断」。
新潟は編集部の評価がC、柱谷幸一の評価はE。
#5段階評価(A~E)なのか?編集部はEを一つも付けてないが。
編集部の評価が甘い気がする。新潟以外も首をかしげるような評価もある。
たとえばFC東京がD評価になってる。今野の穴は確かに大きいが磐田でレギュラーのCBだった加賀を獲得したし、それ以外のポジションだと新潟が欲しかった千真やアーリアジャスールを取っている。
大物の獲得はないが新潟より下ってことはないと思うけどなあ。

サカダイには予想布陣が載っていた。
ミシュウとブルロペの2トップで平井が左MFになっていたが、ミシェウと平井が逆の可能性もあるだろう。
右MFはアラン・ミネイロだった。こいつの活躍がチームの浮沈を握っているような気がする。
亜土夢は右MFの控え。まあ去年は悪くなかったとはいえすごく良かったわけでもない。FKからの得点も少なかったし、アラン・ミネイロが使えるような控えもやむなしだろう。
ボランチは本間と菊地。まあそうだろうな。やはり菊地はボランチだよ。三門よりいい。小林は年齢的にフルにはできないだろうし。
DFは左SBが中村、CBが大井と大輔。右はSBは村上。
鹿島から取った小谷野は予想布陣のどこにも載っていない。使い道なしってこと?
まあ、神田強化部長を信じるしかないな。
まず今年は「潟る」のをどうにかしないとな^^;

January 27, 2012

PHPメモ009:クラス

Javaのクラスとかなり近い。

  • プロパティ(メンバ変数)、メソッドがある。
  • newでインスタンス化
  • extendsで継承。
  • メンバのアクセス権をpublic,protected,privateで指定する。
  • finalでオーバーライド禁止。
  • abstractで抽象化。
  • interfaceとimplements。

クラスの定義

クラス名は大文字小文字を区別しない。

class <クラス名>
{
	<プロパティの定義>
	<メソッドの定義>
}

メンバへのアクセス

static、constで定義しメンバには"::"でアクセスする。
ここでの変数名には先頭の"$"がいる。

<クラス名|self|parent>::<変数名|変数名>

それ以外はのメンバには"->"でアクセスする。
ここでの変数名には先頭の"$"はいらない。

<クラス参照の変数の変数名>-><変数名>

アクセス権の指定

プロパティとメソッドに対するアクセス権はpublic,protected,privateで指定する。 メソッドでアクセス権の指定を省略した場合はpublicとなる。

public どこからでもアクセス可能
protected そのクラス自身、継承したクラス、親クラスからアクセス可能
private そのクラス自身
var publicと同じ。下位互換のためにある。PHP5では使用すべきではない。

親クラスから子クラスのメンバーにアクセスって、どうやるんだろう?

定数(const)

定数はconstを付けて宣言する。定数名には先頭の'$'はいらない。
#変数じゃないってことか。

$this

Javaの"this"と同じ。

self,parent

クラス定義の内部からメンバにアクセスするために使う。
selfはそのクラス自身、parentは親クラス。

コンストラクタ・デストラクタ

void __construct ([ mixed $args [, $... ]] )

下位互換のため __construct() がない場合はクラス名と同じ名前のメソッドがコンストラクタとして探されるが、PHP5では__construct()を使うべき。
子クラスのコンストラクタでは親クラスのコンストラクタは明示的に呼ばれないので"parent::__construct()"が必要。

デストラクタはオブジェクトを参照するものがひとつもなくなったときに呼ばれる。またスクリプトの終了時にも順不同で呼ばれる。

void __destruct ()

クラスのオートローディング

__autoload()関数を定義すると、未定義のクラスが使用され時に__autoload()が実行されてクラスをロードする。

function __autoload($class_name) {
    include $class_name . '.php';
}

サンプルコード

class A1
{
	const constant = 'A1_Constant';
	public static $stat = 'A1_Static';
	
	public    $pub = 'A1_Public';
	protected $pro = 'A1_Protected';
	private   $pri = 'A1_Private';
	
	public    $var1 = 'A1_var';
	
	// コンストラクタ
	public function __construct() {
		echo 'A1 constructor is called.' . "\n";
	}
	
	public function showProperties() {
		echo 'A1 showProperties() is called.' . "\n";
		echo '  constant=' . self::constant . "\n";
		echo '  $stat=' . self::$stat . "\n";
		echo '  $pub=' . $this->pub . "\n";
		echo '  $pro=' . $this->pro . "\n";
		echo '  $pri=' . $this->pri . "\n";
	}
	
	protected function proMethod() {
		echo 'A1 proMethod() is called.'. "\n";
	}
}

class A2 extends A1
{
	public    $var1 = 'A2_var';
	
	// コンストラクタ
	public function __construct() {
		parent::__construct();
		echo 'A2 constructor is called.' . "\n";
	}
	
	public function showProperties() {
		echo 'A2 showProperties() is called.' . "\n";
		echo '  constant=' . self::constant . "\n";
		echo '  $stat=' . self::$stat . "\n";
		echo '  $pub=' . $this->pub . "\n";
		echo '  $pro=' . $this->pro . "\n";
		echo '  $pri=' . $this->pri . "\n";
	}
	
	public function pubMethod() {
		echo 'A2 pubMethod() is called.' . "\n";
		$this->proMethod();
	}
}

echo 'A1::constant=' . A1::constant . "\n";
echo 'A1::$stat=' . A1::$stat . "\n";

$baseClass = new A1();
$baseClass->showProperties();
echo '$baseClass->pub=' . $baseClass->pub . "\n";
echo '$baseClass->var1=' . $baseClass->var1 . "\n";

echo 'A2::constant=' . A2::constant . "\n";
echo 'A2::$stat=' . A2::$stat . "\n";

$subClass = new A2();
$subClass->showProperties();
$subClass->pubMethod();
echo '$subClass->pub=' . $subClass->pub . "\n";
echo '$subClass->var1=' . $subClass->var1 . "\n";

出力

A1::constant=A1_Constant
A1::$stat=A1_Static
A1 constructor is called.
A1 showProperties() is called.
  constant=A1_Constant
  $stat=A1_Static
  $pub=A1_Public
  $pro=A1_Protected
  $pri=A1_Private
$baseClass->pub=A1_Public
$baseClass->var1=A1_var
A2::constant=A1_Constant
A2::$stat=A1_Static
A1 constructor is called.
A2 constructor is called.
A2 showProperties() is called.
  constant=A1_Constant
  $stat=A1_Static
  $pub=A1_Public
  $pro=A1_Protected
  $pri=
A2 pubMethod() is called.
A1 proMethod() is called.
$subClass->pub=A1_Public
$subClass->var1=A2_var

PHPメモ008:include,require

include,require,include_once,require_onceは指定したファイルを読み込んで評価する。
関数・クラスなどを機能ごとにファイルにまとめてモジュールとし、必要に応じて読み込むようにする。

上記4つの言語構造の動作の違いは、指定したファイルがなかった場合、
include,include_onceは警告を発行し処理が続行され、
require,require_onceはエラーを発行して処理が停止される。
また、include_once,require_onceは複数回実行されても1回しか読み込まない。

サンプルコード
module1.php


requireoncetest.php


requireoncetest.phpの出力
module1

January 26, 2012

PHPメモ007:スコープ

PHPの変数はほとんどがグローバルスコープ。
CやJavaではブロック内で宣言した変数のスコープはブロック内に限られるが、PHPではブロック内で初めて出てきた変数もグローバルスコープになる。

{
	$a = 10;
}
echo $a;	// 10と出力される

関数では関数内で使用される変数はすべて関数内のみのローカルスコープとなる。

サンプルコード
$a = 10;

function foo() {
	$a = 20;
	
	echo "\$a=${a} in foo()<br />\n";
}

echo "\$a=${a}<br />\n";
foo();
出力
$a=10<br />
$a=20 in foo()<br />

クラス内の変数についてはクラスのところで説明。

global

関数内からグローバルスコープの変数にアクセスしたい場合、globalキーワードを使ってグローバル変数を宣言する。
ただし、可読性が悪くなったりバグの原因になる可能性があるのでやたらめったら使うものではない。というかなるべく使わないほうがいいと思う。

サンプルコード
$b = 30;

function bar() {
	global $b;
	
	echo "global \$b=${b} in foo()<br />\n";
	
	$b = 40;
}

bar();
echo "\$b=${b}<br />\n";
出力
global $b=30 in foo()<br />
$b=40<br />

«輪廻のラグランジェ、視聴中止

January 2012
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

twitter

XI-Prof

無料ブログはココログ

日本blog村

  • アニメ
    にほんブログ村 アニメブログへ
  • FF11
    にほんブログ村 ゲームブログ FF11(FFXI)へ

好きな音楽家

メモ