忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2025/11/30 03:43 |
ZF1.10 :Zend_Http_ClientとZend_Http_Cookie
HTTPリクエストを送受信するクラスです。
送受信ならfile_get_contents()curl_exec()で十分だろ、と思いきやこいつらには重大な問題があります。

何処かにPOST送信を行った際、ステータスコード302が返ってくるとそっちにGETで送り直しちゃうんだよね。
http://www.studyinghttp.net/status_code#Code302

本来POSTで302が返ってきたらユーザに一旦確認したうえで移動先にPOST送信する、というのが本来の動きなのですが、上記関数やブラウザを含む大抵の実装が確認せずにGET送信してしまうようになっています。
この挙動を変更することができないのか探してみましたがよくわかりませんでした。

Zend_Httpもデフォルトでは上記のような挙動を取るようになっていますが、オプションで正しい動作を行うように設定することができます。

また、Zend_Http_Cookieを使うことでCookieを簡単に使い回すことができ、セッションを利用しているサイトへのリクエストも楽に行うことができます。
言葉で言っても意味がわかんないので書いてみましょう。

zend_http1.php
<?php
	session_set_cookie_params(0,'/','localhost');
	session_start();
	
	$_SESSION['a']='aaa';
	$_SESSION['b']='bbb';

zend_http2.php
<?php
	session_start();
	var_dump($_SESSION);

zend_http1.phpでセッションに値を代入し、zend_http2.phpでその値を表示します。
ブラウザで順にアクセスすると、正しくセッションの値

array(2) {
  ["a"]=>
  string(3) "aaa"
  ["b"]=>
  string(3) "bbb"
}

が表示されます。


ではPHPで順に取得してみましょう。
zend_http3.php
<?php
	file_get_contents('http://localhost/zend_http1.php');
	$ret=file_get_contents('http://localhost/zend_http2.php');
	
	var_dump($ret);

$bodyは、

array(0) {
}


何も取得できませんでした。
file_get_contentsはcookieとか特に考えないので、zend_http1.phpをfile_get_contentsした時点で発行されたcookieをzend_http2.phpに送信していないからです。
zend_http2.phpにcookieを送信する手段もなくはないですが、stream_context_create()なんかで自作する必要があり少々面倒です。
Zend_Httpでやってみましょう。

zend_http4.php
<?php
	
	$zend_http1='http://localhost/zend_http1.php';
	$zend_http2='http://localhost/zend_http2.php';
	
	//Zend_Http
		require_once('Zend/Http/Client.php');
		require_once('Zend/Http/Cookie.php');
		$http = new Zend_Http_Client();
	
	// 厳格なリダイレクト
		$http->setConfig(array('strictredirects' => true));
	
	//リクエスト送信先
		$http->setUri($zend_http1); 
	
	//リクエスト送信
		$http->request('POST');
	
	//返り値を取得
		$res=$http->getLastResponse();
		$header=$res->getHeaders();
	
	//Cookieを取得
		$cookie=Zend_Http_Cookie::fromString($header['Set-cookie']);
	
	//新たなリクエスト
		$http = new Zend_Http_Client();
		
	//リクエスト送信先
		$http->setUri($zend_http2); 
	
	//Cookieをセット
		$http->setCookie($cookie);
	
	//リクエスト送信
		$res=$http->request('POST');
	
	//レスポンスボディ
		$body=$res->getBody();
		
		var_dump($body);

リクエスト送信先はスキームからの入力が必須です。
相対リンクやホスト名からの表記などはできません。

レスポンスボディ$bodyは、

array(2) {
  ["a"]=>
  string(3) "aaa"
  ["b"]=>
  string(3) "bbb"
}


見事にセッション情報が表示されました。
$cookie=Zend_Http_Cookie::fromString($header['Set-cookie']);
$http->setCookie($cookie);

の部分において、一回目のリクエストで発行されたセッションキーを取得し、二回目のリクエストに付加しています。
これにより、簡単にセッションの継続を行うことができます。


前公開したしたらば削除スクリプトはZend_Httpのcookie制御とstrictredirectsを使用しています。
旧管理画面は画面遷移のたびに毎回パスワードをフォームで送るというどうなんだ仕様だったのですが、リニューアルを経てセッションを利用したログイン管理になりました。
セキュリティ上は正しいのですがスクリプト的にはcookieを使い回さないといけないため少々面倒になりました。
また、したらばの管理画面はフォーム送信のたびに毎回302でリダイレクトされる仕様のため、リダイレクト先にも正しくPOSTを送信するためにstrictredirectsを使用しました。
ただこれ、ブラウザは普通にGETで送信し直しているにも関わらず正しく動いてるのにPHPからだとGETでリダイレクトしても動かず、たまたまPOSTで再送信したところ動いたという状態で、原因がよくわからないのが困ったものなのですが。
PR


2010/10/05 22:07 | Comments(0) | TrackBack() | PHP
買ったものリスト 2010/10/03

今月以降の発売スケジュールがやばい。

2010/10/07 レッド・デッド・リデンプション
2010/10/07 加奈~いもうと~
2010/10/14 毛糸のカービィ
2010/10/21 スーパーマリオコレクション スペシャルパック
2010/10/21 メダルオブオナー
2010/10/28 Fable3
2010/10/28 ラジルギノアMASSIVE
2010/10/28 車輪の国、向日葵の少女
2010/11/04 Fallout:New Vegas
2010/11/11 Forza Motorsport 3 Ultimate Edition
2010/11/18 コール オブ デューティ ブラックオプス
2010/11/20 XBOX360 Kinect
2010/11/20 Dance Evolution
2010/11/25 怒首領蜂大復活 ver1.5

確定してるのだけでここまで毎週だよ!絶対プレイしきらないよこんなの!
12月もNFSとか悪魔城とかバーチャロンとかあるしどうすんだこれ。
あと、そろそろMSKKは発売スケジュールを更新してあげるべき。


ランジーン×コード 大泉 貴
☆☆☆

個人的に大当たりだった伝説兄妹ですら特別賞に甘んじる第一回『このライトノベルがすごい』大賞を獲得するほどのものだからどれだけすごいのだろう、と期待して買ってみたのですが、完全に期待外れでした。

伏線が足りないとか伏線に気付かないとかそういう次元じゃなく、根本的に伏線がありません。
それなのにまったく描写のない人物だけどんどん登場しては消えていくので、思うことは、あんたら誰?
初回でいきなり見知らぬヒロインが敵で現れた、とか言われてもはあ、としか言えません。
唯一描かれているのがヒロイン格の由沙美ですが、こいつはこいつでわけわからんしな。

つまらないとまでは決して言いませんが、これで大賞とか言われても、首を傾げるしかありません。
勢い余って金賞受賞作の「僕たちは監視されている」も買ってしまっているのですが、こちらは期待外れにならないといいなあ。


荒川アンダーザブリッジ10 中村 光
☆☆☆

何が何だかわからないままクライマックスに。
一体何処が落としどころなんだこれ。

ちなみに「健全なる精神は健全なる身体に宿る」は「身体が健全ならば精神も健全になる」という意味ではない。


ファミ通Xbox360 2010年 11月号
☆☆☆☆

字が小せええええ。

なんだこれは。活字の限界を目指しているのか。
30ページも増やしたのにまだ足りないとかどういうことなの。


Halo: Reach

今までシリーズを一作もやったことが無かったのだが、評判も売上もいいので実は先日試しに買っていた。
んだが、どうも私には合わないようだ。
全体的に画面が暗くて見づらいのと、ムービー以外のシーンで台詞が字幕表示されないのと、あと最近はF/TPSにだいぶ慣れたと思ったんだけど本作はなんか酔う。
せめてノーマルクリア程度はしたいけど今後の予定的になあ。


デッドライジング2

発売日、新宿ヨド→売り切れ→横浜ヨド→売り切れ。
ちょっと入荷(出荷?)少なすぎじゃね?

なんでこんなB級映画みたいなパッケージなんだ。
中身は相変わらず大量のゾンビとキャッキャウフフするゲームです。
ていうか密度が異常に高過ぎて大変なんだがこんなにいたっけ?

今回は中庭三馬鹿みたいなのがいないっぽいのでちょっとだけ安心。

実績の手抜き感はどうにかならんかったんだろうか。
全部20て。



2010/10/03 16:34 | Comments(0) | TrackBack() | 買ったもの
今週の実績 2010/10/03
2010/10/02の実績

Dead Rising 2

死ぬな! 20
CO-OPプレイ中に仲間をダウンから回復させた。君を失いたくない!

ブラッドバス 20
500体のゾンビを倒した。まだまだ序の口。

英雄 20
10人の生存者を救出した。まだまだ外には生存者がいるんだよ!

日曜大工 20
コンボ武器を作った。俺にはチェーンソウが必要だ!

智代アフター

惚れるでないぞ? 10
ともが『成体化』した状態で、戦闘に勝利しました

2010/10/01の実績

智代アフター

エクスカリバーを入手 10
レアアイテム『エクスカリバー』を入手しました

2010/09/29の実績

DeathSmiles2 X

メリークリスマス 100
全てのステージでLv3を選択し廃楽園を通り宮殿をクリアした。ⅡXモードのみ。コンテニュー不可

2010/09/28の実績

智代アフター

おかえり、鷹文 100
D&Tをクリアしました

風子マスター 50
D&Tを風子と共にクリアしました

全ての感情を司る054番 10
全ての感情を司る054番に遭遇しました

“どん引き”の感情を司る090番 10
“どん引き”の感情を司る090番に遭遇しました、えぇぇぇぇ~~~!

“焦燥”の感情を司る081番 10
“焦燥”の感情を司る081番に遭遇しました、うわ、やばい…

“驚愕”の感情を司る075番 10
“驚愕”の感情を司る075番に遭遇しました、まじっ!?

“愉快”の感情を司る071番 10
“愉快”の感情を司る071番に遭遇しました、はは、おかしいっ

DeathSmiles2 X

開幕エクステンド余裕でした 10
1面でエクステンドした。

1プレイの重み 70
ⅡXモードでノーコンテニューで各キャラクターでクリアした。

2010/09/26の実績

智代アフター

“憂鬱”の感情を司る068番 10
“憂鬱”の感情を司る068番に遭遇しました…

DUNGEONS&TAKAFUMIS 70
D&Tをプレイしました

It's a Wonderful Life 100
本編をクリアしました

ひとつの結末 20
バッドエンドのどれかをクリアしました

森のパンダさん 50
『森のぱんださん』を作詞しました

名探偵とも 50
河南子脚本のドラマ『名探偵とも』を全て演じました

ツイニキマシター、ニポンキマシター 50
全ての外人鷹文に遭遇しました

がくがくがくがくがく… 50
智代と一日で百回キスをしました

みんなであそんでたの? 50
ともに嘘を信用してもらえました

After Burner Climax

Triple A 30
ARCADEモードで評価AAAを獲得(撃破数、コンボ数、プレイタイムのいずれか)

All Clear! 5
ARCADEモードをエンディングAでクリア


2010/10/03 16:30 | Comments(0) | TrackBack() | 実績
2ちゃんねる複数板 荒らし被害用避難板

シューティング板を見るとわかりますが、特にCAVE関連のスレは酷いことになっています。
なんとたった一人の気違いが数年にわたってほとんど毎日荒らし続けているんですよね。
恐ろしいことに。
世界には想像を絶する気違いがいるものだ。

過去のまとめはここらへんをどうぞ。
http://yuubiseiharukana.blog.shinobi.jp/Entry/313/
http://yuubiseiharukana.blog.shinobi.jp/Entry/326/
http://yuubiseiharukana.blog.shinobi.jp/Entry/327/
http://yuubiseiharukana.blog.shinobi.jp/Entry/344/
http://yuubiseiharukana.blog.shinobi.jp/Entry/345/
http://yuubiseiharukana.blog.shinobi.jp/Entry/346/

既に避難所はあるにはあるのですが、管理人が非常に狭量で、ちょっとでも管理人の気にくわないことを書いたら速攻BANされます。
例えば

 

522 名前:名無しさん[sage] 投稿日:2010/09/28(火) 08:36:46
ここの管理人はケイブ信者だからしょうがあるまい

ケイブゲーも面白いものは面白い
つまんないものはつまんないだけなのにな~

 

この程度でホスト晒し&アク禁です。
ありえねえ。

あと
http://yuubiseiharukana.blog.shinobi.jp/Entry/313/
とかへリンクするだけでも削除されます。
びっくりだね。

ということでかわりに作ってみた。

http://jbbs.livedoor.jp/game/51467/

まあ既に走ってるものがあるので、今さら立てたところで人が来るかどうかは判りませんが。
少なくとも余程のことがないかぎり削除とか晒しなんてことはしません。

どの程度までOKかは、既に別の掲示板がありますので参考にどうぞ。
http://jbbs.livedoor.jp/computer/22593/
 

 



2010/10/01 00:13 | Comments(1) | TrackBack() | 戯言
Android2.2 インテントでバイナリデータを渡す
インテントの使い方は、new Intent()でインスタンスを作成し、setAction()なりputExtra()なりで渡したいデータや情報を設定し、最後にstartActivity(intent)ってするだけです。
Webアプリで言うところの<form>タグにわりと近いですが、最大の特徴として<form action>の行き先をきっちりと指定しなくてよい、というものがあります。
Intent.setAction(Intent.ACTION_DIAL)とすると、Android側で勝手に、AndroidManifest.xmlIntent.ACTION_DIALに結びつけられているアプリケーションを探し出してきてくれます。

Windowsの拡張子関連付けのようなもので、拡張子が"ACTION_DIAL"のアプリを起動してくれという指定をするだけで、具体的にどのアプリを起動するかまでは記入しません。
最初はデフォルトのダイアラが起動すると思われますが、別のダイアラアプリをインストールしていればそちらを起動するようにもできるということです。
勿論宛先をきっちり指定したインテントも可能で、その場合はコンストラクタなりIntent.setClassName()なりで宛先パスを具体的に指定します。

さて、Intent.putExtra()でインテントに色々なデータを詰め込むことができるのですが、対応しているのがプリミティブ型とかParcelableとかCharSequenceとか、まあ要するにテキストデータを突っ込むのが前提になっています。
	intent.putExtra("title", "タイトル");
	intent.putExtra("value", 1);
などは問題なく行えます。
また、画像を扱うBitmapあたりはParcelableを実装しているのでそのまま突っ込めます。
が、適当なファイルなんかをそのまま突っ込みてーとか思ってもそのままではできません。

ではどうすればいいかというと、バイナリをストリーム化してバイト列にして投入、という面倒な手続きを取らないといけません。

送信側
	//ファイルをストリーム化してインテントに突っ込む
	InputStream input = getResources().openRawResource(R.raw.hoge);
	try {
		byte[] buffer = new byte[8192];
		int actual_read = 0;
			while ((actual_read = input.read(buffer)) != -1) {
				  intent.putExtra("hogehoge", buffer);
			}
	} catch (Exception e) {
		e.printStackTrace();
	}
受信側
	//インテントからストリームを取得
	byte[] buffer = intent.getByteArrayExtra("hogehoge");
	ByteArrayInputStream input = new ByteArrayInputStream(buffer);
なんかもっとこうどうにかならないものですかね。
いや、なんか手段はあるとは思うんだけどやり方がわかりません。


2010/09/27 22:31 | Comments(0) | TrackBack() | Android
買ったものリスト 2010/09/26

D&T無駄に凝りすぎだろ。


伝説兄妹! おかもと(仮)
☆☆☆☆☆

文体がこなれてない、書き慣れてない感がある。
あとイラストはかなり微妙。

だが、そんなことどうでもいいほど後半が素晴らしかった。
序盤は心底完全な底辺小悪党だった主人公が微妙に成長したりするような全然していないようなよくある展開ですが、ひとつだけでも男を見せることができたので印象がかわりました。

終盤の"その発言、もっともである"は倍角にする必要なかったな。
"まったくだ"とかでさらっと流してほしかった。

あと塔を登るところなんだが、糸をくっつけて通り過ぎた所のを引っ張って回収とかできなかったんだろうか。
それなら寝床除いて20枚くらいで行けそうなものだが。


アランウェイク 公式設定資料集 ~最終調査報告書~
☆☆☆☆

アランウェイクの情報満載。
ポット等の攻略情報だけではなく、原稿の内容までしっかりまとめらてているのがありがたかった。
ただ本書の発売時にはまだDLCのシグナルが完結していないので、そこらへんが未確定情報っぽく書かれていたのが残念。
売り時は完全に逃してしまうが、完結してから出してほしかった。


ぼのぼの24 いがらし みきお
☆☆☆☆

前巻が素晴らしすぎただけに比べてしまうと多少見劣りしてしまう。
元々架空生物の回ってあんまり好きではないですし。
しかしそれでも高水準の名エピソードが揃っているので読んで損は無し。


荒川アンダーザブリッジ9 中村 光
☆☆☆

島崎メインの巻、といっていいのやらどうやら。
例によって全然話が進まないまま終わった。


智代アフター
☆☆☆☆☆

「智代アフターの限定版ください」
「ありません」
今時限定版がないとか珍しいギャルゲだな。
360では初めてでは?

ということでとりあえずトゥルークリア。
ちょっとそんな展開有りかよ!?
うぼぁぁぁ
どうしてこんなひどいことばっかりするんだよスタッフ!

で、ことみアフターはいつ発売ですか?



2010/09/26 19:29 | Comments(0) | TrackBack() | 買ったもの
今週の実績 2010/09/26
2010/09/25の実績

智代アフター

急ぎすぎた人生 50
金髪の鷹文に遭遇しました

人生の宝物を探しにいこう 30
プロローグをクリアしました

いよっしゃああぁぁーーーっ!! 50
智代先生の出題に全て正解しました

Halo: Reach

パワフル ウェポン 10
難易度ノーマル以上で第 4 ミッションをクリア

極上の武器 10
ファイアファイトまたはキャンペーンで、DMR で 10 キル達成

プロトコルによる反撃 10
難易度ノーマル以上で第 3 ミッションをクリア

KOF SKY STAGE

それぞれの宿命 20
ステージ3クリア達成!(1Player Game)

真贋の果てに 20
ステージ2クリア達成!(1Player Game)

実力証明 10
ステージ1クリア達成!(1Player Game)

2010/09/24の実績

DeathSmiles2 X

二人の力を合わせれば 10
使い魔を累計100回投げた。

新たな使い魔使いの誕生 5
使い魔を投げた。

2010/09/23の実績

Halo: Reach

武器交換 10
キャンペーンで味方 AI と武器を交換した

ファースト ステップ 10
難易度ノーマル以上で第 2 ミッションをクリア

ドクター ドクター 5
ダメージを受けた後、ライフパックを使用してライフを回復した

Space Invaders IG

MANIAC DIFFICULTY CLEAR 20
難易度MANIACでノーマルモードをクリアしました。

ULTIMATE DIFFICULTY CLEAR 40
難易度ULTIMATEでノーマルモードをクリアしました。

CHALLENGE MODE CLEAR 20
チャレンジモード全99ステージをクリアしました。

2010/09/20の実績

Space Invaders IG

MUSIC FAN 10
ミュージックモードを10回プレイしました。

1,000 NAGOYA ATTACKS 10
最大NAGOYA ATTACK回数が1000に達しました。

HARD DIFFICULTY CLEAR 20
難易度HARDでノーマルモードをクリアしました。

2010/09/19の実績

Space Invaders IG

NORMAL DIFFICULTY CLEAR 15
難易度NORMALでノーマルモードをクリアしました。

EASY DIFFICULTY CLEAR 10
難易度EASYでノーマルモードをクリアしました。

1,500 CHAINED 10
最大CHAIN回数が1500に達しました。

モダン・ウォーフェア2

プロフェッショナル 30
最低でも15個のスペシャルオプスミッションで、それぞれ3つの星すべてを獲得する。


2010/09/26 19:14 | Comments(0) | TrackBack() | 実績
Android2.2 名刺管理アプリケーションを作ってみる6日目その2

http://codezine.jp/article/detail/4878?p=2

前回の続き。

マップアクティビティの呼び出し側はインテントで住所を突っ込んでいますが、呼ばれる側では見ていませんでした。
引き渡された住所をチェックして、マップの初期位置としてセットするにはMapView.getController().setCenter()などを使用しますが、この引数は経緯度で設定する必要があったりします。

そこで住所→経緯度への変換用にGeocorderというものが用意されています。
さっそく使ってみましょう。

/src/com.google.android.maps/MapActivity.java

	public void onCreate(Bundle savedInstanceState) {
	
		/* ここに前回までの内容 */
		
		//Geocoder
		    Geocoder geocoder = new Geocoder( this, Locale.getDefault());

		//インテント
		    String strAddress = getIntent().getStringExtra( BizCard.COLUMN_ADDRESS);
		
		//Geocoderで住所からAddressへ変換
		    try {
		    	//最初の一件を取得
				List<Address> addressList = geocoder.getFromLocationName(strAddress, 1);
				Address address = null;
				address = addressList.get( 0);
				//目的地を設定
			        if( address != null){
			            setDist(address);
			        }
			} catch (Exception e) {
				Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG);
				toast.show();
			}
	}

/res/values/strings.xml
	<string name="select_target">対象を選択してください</string>
	<string name="cannot_get_address">住所の取得に失敗しました</string>
サンプルではいきなりいろいろやってますが、とりあえず最低限の、一件だけ取得して目的地をセットするという簡単な内容にしてみました。

ところが、検索文字列に何入れてもGeocoder.getFromLocationName()で100%Exceptionが発動するんだがなんだこれ。
getMessage()すると"Service not Available"って言われた。なんだこれ?
map.xmlのAPIキーをちがう値にしてみると地図の取得自体できないからAPIキーが間違っているということもなさそうだし。

http://groups.google.co.jp/group/android-developers/browse_thread/thread/b02c29d746471358/81f09bbc825ffb26?lnk=raot
> I have seen the same issue when I updated from 2.1 and API Level 7
> (where it works) to 2.2 API Level 8 (where it does not).

> Seems to be in the level 8 package.  I also noticed quite a bit of
> slowdown in the map view scrolling after updating to 2.2.


日本語での同様な症状がまったく見つからない。
GoogleAPI4を入れ、サンプルとまったく同じ環境にして実行してみたがそれでも駄目でした。

本当にただ単にGoogleMapAPIが非対応になってただけだったりしたらどうしよう。

先に進めないのでBizCardアプリケーションは一旦中断。
残念。


Androidの記事


2010/09/24 23:14 | Comments(0) | TrackBack() | Android
PHP技術者認定試験初級試験を受けてきた

PHP技術者認定試験初級試験のベータ試験を受けてきました。

公式サイトが見あたらないのですがこんなかんじ。

プレスリリース
http://www.asial.co.jp/pressrelease/312
PDF
http://www.yosimasa.com/doc/pr-php-exam20100726.pdf
公式twitter
http://twitter.com/phpexam

一般枠が15名という狭き門でしたが、たまたまmixiで見かけたのでなんとなく申し込んでみたらあっさり通ったのでびっくり。

問題数40問、時間60分、7割(28問)で合格、電卓持ち込み可。
守秘義務があるので問題そのものは明かせませんが、以下試験の感想。

全問選択問題ですが、ひとつ選べが2/3、全て選べが1/3くらい出た印象でした。
初級だし勉強しなくても楽勝だろう、と思っていたら何気にそんなん知るかああ!!的な問題がちらほら。
日時フォーマットのパラメータとか覚えてどうするんだよと。
あと○○の設定はphp.iniで設定できるかどうか、という問題があったのですが、有名どころならともかくそんなマイナーなもの知るか!絶対これ初級じゃねえよ!という気分になりました。

PHP本体の拡張モジュール、mbstringなんかの問題が出るのはまあわかるのですが、でもPEARライブラリの問題を出すのはなんか違くないか?
しかも既に古いから使うなって言われてるパッケージを持ち出してくるし。
それが有りなんだったらAcme_IdolMasterだって有りだろ。

「ベータなので試験問題がおかしいかもしれません、問題が間違っていればチェックを」的なことも言っていたのですが、答えがわからないのに間違ってるかどうかもわからないよ。
しかしこれは問題が間違ってるのではないか、というのが何問かありました。
どう考えても全部正しくないやつとか、ひとつ選べなのに答えが二つあるものとか。
まあ大半は私の勘違いだと思いますが、少なくともあのelseifの奴は全部正しくないで間違いない筈だ。

電卓は持って行きませんでしたが、使う問題は出ませんでした。
なにやら受験者毎に問題が違うというリッチな仕様だそうで、他の人には出たかもしれません。
実際違うかどうかは見てないのでわかりませんが、まあそれは問題流出防止のブラフで実際は3種類くらいしかないんじゃなかろうかと思いますが。

合格発表は一ヶ月後です。
感覚的には合ってるのが4割、おそらく合ってるだろうが4割、そんなの知らないよというのが2割というレベルで、まあおそらくは合格してるんじゃないかなと。

今回は紙ベースのペーパーテストでしたが、来年からプロメトリックのCBT受験開始を目指しているようです。
上級はどんな問題なんじゃろか。



2010/09/23 19:17 | Comments(0) | TrackBack() | 資格
Android2.2 名刺管理アプリケーションを作ってみる6日目

http://codezine.jp/article/detail/4878

今回は残る地図の実装です。
現在はマップを選択すると、現在値などの指定をしていないのでデフォルトの日本全土マップが表示されます。
とりあえずMapView.onCreate()を実装。

/src/com.google.android.maps/MapActivity.java

public class MapActivity extends com.google.android.maps.MapActivity implements OnCheckedChangeListener {
	//インスタンス変数
	private MapView map = null;
	private RadioButton normalMapRadio = null;
	private RadioGroup radioGroup = null;
	private ToggleButton currentLocationToggle = null;
	private MapController controller = null;
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.map);

		// UI部品の取得
		    map = (MapView) findViewById(R.id.map);
		    radioGroup = (RadioGroup)findViewById( R.id.mapRadioGroup);
		    normalMapRadio = (RadioButton)findViewById(R.id.normalMapRadio);
		    currentLocationToggle = (ToggleButton)findViewById( R.id.currentLocationToggle);
		    
		// デフォルトで「地図」ボタンを選択しておく
		    normalMapRadio.setChecked( true);
		// ラジオボタンのクリックリスナー
		    radioGroup.setOnCheckedChangeListener( this);

		// マップコントローラを取得
		    controller = map.getController();
		// マップビューの各使用フラグをセット
		    map.setBuiltInZoomControls( true);
		    map.setSatellite( false);
		    map.setClickable( true);
		    map.setEnabled( true);
	}
}
GoogleMapを使用するにはいつものActivityではなくMapActivityを継承する必要があります。
このMapActivityは単にActivityを継承して地図を利用するのに必要な機能を付け加えただけなので、概ね同じように使用することができます。
ひとつだけabstract MapActivity.isRouteDisplayed()が宣言されているのでこちらの実装を行う必要があります。
単にルート表示を行うか否かのフラグみたいなので今回はとりあえずreturn false;とかやっておけば問題なさげです。

radioGroupは"@+id/mapRadioGroup"のラジオボタングループ、normalMapRadioはその中の「地図」ボタンです。
RadioGroup.setChecked()で選択状態のデフォルト値を指定します。

setOnCheckedChangeListener()でラジオボタンにクリックリスナーを定義します。
クリックが検知されるとonCheckedChanged()が発動します。
で、これはOnCheckedChangeListenerインターフェイスで宣言されているのでimplementsして実装する必要があります。

MapViewの各メソッドでフラグを投入し、動作を指定します。
setBuiltInZoomControls()でズームの可否、setSatellite()で衛星写真表示にするか否か、setClickable()でクリックやドラッグの可否、というかんじみたいです。
setClickable()setEnabled()の違いがわからなかった。

アクティビティからマップAPIの拡大縮小といった具体的操作を行うには、MapView.getController()MapControllerを取得します。
今回はとりあえず取得しただけで操作は無し。

ということでisRouteDisplayed()onCheckedChanged()を実装します。
    //ラジオボタンの選択変更時にマップを切り替える
	public void onCheckedChanged(RadioGroup group, int checkedId) {
    	// 「地図」がクリックされていたら衛星写真をオフ
        if( checkedId == R.id.normalMapRadio){
            map.setSatellite( false);
        //「衛星写真」がクリックされていたら衛星写真をオン
        }else if( checkedId == R.id.satelliteMapRadio){
            map.setSatellite( true);
        }
    }
	
	//ルート表示を行うか否かのフラグ
	protected boolean isRouteDisplayed() {
		return false;
	}
onCheckedChanged()は第一引数にラジオボタングループ、第二引数にラジオボタンIDが入ってきます。
第一引数は複数のラジオボタングループがあったりする場合に使うのだと思いますが、今回はひとつしかないのでIDだけで十分です。
その後はクリックされていたボタンによって、衛星写真をオンオフしているだけです。

isRouteDisplayed()は単にfalseを返します。

以上でラジオボタンが実装されたマップビューが完成しました。


Androidの記事


2010/09/20 18:59 | Comments(0) | TrackBack() | Android

<<前のページ | HOME | 次のページ>>
忍者ブログ[PR]