My Photo

« February 2012 | Main | April 2012 »

March 31, 2012

PHPメモ028:ファイルのダウンロード

ブラウザはHTTPヘッダでファイルを表示するかダウンロードの処理をするかを判断している。
HTTPヘッダの送信は header()関数を使用する。

void header(<文字列>)
文字列をHTTPヘッダとして送信する。

HTTPヘッダはデータより前になければならないので、header()関数はスクリプトの先頭にかかなければならない。

ファイルをダウンロードさせたい場合は、以下のサンプルコードのようにHTTPヘッダの Content-Type の値を "application/octet-stream" とすればよい。

$filename = "sample.jpg";
$filesize = filesize($filename);

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"${filename}\"");
header("Content-Length: ${filesize}");
readfile($filename);

// readfile()の代わりにこれでもよい
// echo file_get_contents($filename);

PHPメモ027:ファイルのアップロード

ファイルアップロード機能の有効化

PHPでファイルのアップロードの処理をするには、php.iniで

file_uploads = On

でなければならない。デフォルトでOnになっている。

1つのファイルのアップロード

一般的なファイルをアップロードするフォームは以下のようなものになる。

<form enctype="multipart/form-data" action="upload.php method="post">
送信ファイル:<input type="file" name="userfile" /><br />
<input type="submit" value="送信" />
</form>

上記のフォームから送信されたファイルを表示するコードは以下のようになる。
3つのif文で
・アップロードの成否
・ファイルサイズが0でないか
・画像ファイルか
をチェックして、画面に表示している。

if (FALSE !== $_FILES['userfile']['error']) {
  if (0 != $_FILES['userfile']['size']) {
    if (FALSE !== strPos($_FILES['userfile']['type'], 'image/')) {
        $base = basename($_FILES['userfile']['name']);
        copy($_FILES['userfile']['tmp_name'], $base);
        echo "<img src='" . $base . "'>";
    }
  }
}

上記のコードでは定義済み変数 $_FILES を使用している。$_FILES は配列であり、inputタグのname属性の値をキーとしてHTTP POSTでアップロードされたファイルの情報が格納されている。
この例だとアップロードされたファイルの情報は $_FILES['userfile'] に格納され、これはさらに下記表のキーを持つ配列となっている。

キー 値の意味
error アップロードの状態。成功の場合は0。
size アップロードされたファイルのサイズ。バイト単位。
name アップロードファイル名
type メディアタイプ。正しいかはアップロードしてきたクライアント次第。
tmp_name 受信したファイルの一時ファイル名

複数ファイルのアップロード

複数のファイルをアップロードする場合、フォームは以下のようになる。

<form enctype="multipart/form-data" action="upload2.php" method="post">
送信ファイル1<input type="file" name="userfile[]" /><br />
送信ファイル2<input type="file" name="userfile[]" /><br />
送信ファイル3<input type="file" name="userfile[]" /><br />
送信ファイル4<input type="file" name="userfile[]" /><br />
<input type="submit" value="送信" />
</form>

この場合、$_FILES には以下のようにアップロードされたファイルの情報が格納される。

$_FILES['userfile'][name][0]…1番目のファイルのファイル名
                         [1]…2番目のファイルのファイル名
                         [2]…3番目のファイルのファイル名
                         [3]…4番目のファイルのファイル名
$_FILES['userfile'][type][0]…1番目のファイルのファイルタイプ
                         [1]…2番目のファイルのファイルタイプ
                         [2]…3番目のファイルのファイルタイプ
                         [3]…4番目のファイルのファイルタイプ
$_FILES['userfile'][tmp_name][0]…1番目のファイルの一時ファイル名
                             [1]…2番目のファイルの一時ファイル名
                             [2]…3番目のファイルの一時ファイル名
                             [3]…4番目のファイルの一時ファイル名
$_FILES['userfile'][error][0]…1番目のファイルのエラーコード
                          [1]…2番目のファイルのエラーコード
                          [2]…3番目のファイルのエラーコード
                          [3]…4番目のファイルのエラーコード
$_FILES['userfile'][size][0]…1番目のファイルのファイルサイズ
                         [1]…2番目のファイルのファイルサイズ
                         [2]…3番目のファイルのファイルサイズ
                         [3]…4番目のファイルのファイルサイズ

よって、上記のフォームからアップロードされたファイルを処理するコードは以下のようになる。

foreach (array_keys($_FILES['userfile']['error']) as $fileEntry) {
  if (FALSE !== $_FILES['userfile']['error'][$fileEntry]
      && 0!= $_FILES['userfile']['size'][$fileEntry]) {
    if (FALSE !== strpos($_FILES['userfile']['type'][$fileEntry], 'image/')) {
      $base = basename($_FILES['userfile']['name'][$fileEntry]);
      copy($_FILES['userfile']['tmp_name'][$fileEntry], $base);
      echo "<img src='" . $base . "'>";
    }
  }
}

March 30, 2012

PHPメモ026:ファイル関連の関数 その4

string file_get_contents(<ファイル名>[, <インクルードパス使用>[, <ストリームコンテキスト>[, <オフセット>[, <長さ>]]]])
ファイルを読み込んで返す。ファイル名にはURLを指定することができる。独自コンテキストを使用する必要がない場合はストリームコンテキストは NULL を指定する。
失敗した場合はFALSEを返す。

int file_put_contents(<ファイル名>, <データ>[, <フラグ>[, <ストリームコンテキスト>]])
データを指定したファイルに書き込む。fopen(), fwrite(), fclose() を続けて呼んでデータをファイルに書き込むのと等価。
データは文字列、配列、ストリームリソースのいずれかを指定する。
戻り値は書き込まれたバイト数。エラーの場合はFALSE。

フラグ は下表のいずれかになる。

フラグ 説明
FILE_USE_INCLUDE_PATH ファイルをインクルードディレクトリから探す。
FILE_APPEND ファイルが既に存在する場合、追記する。
LOCK_EX 書き込み処理中にファイルに対する排他ロックを確保する

array file(<ファイル名>[, <フラグ>[, <ストリームコンテキスト>]])
ファイル全体を配列に読み込む。1行が1要素になり改行はついたままである。
失敗した場合はFALSEを返す。

string fread(<ファイルハンドル>, <長さ>)
指定したファイルを長さ分またはファイル終端までバイナリモードで読み込む。

int fwrite(<ファイルハンドル>, <文字列>, [<長さ>])
文字列をバイナリモードで指定したファイルに書き込む。
戻り値は書き込んだバイト数。エラーの場合はFALSE。

int readfile(<ファイル名>[, <インクルードパス使用>[, <ストリームコンテキスト>]])
ファイルを読み込んで標準出力に書き込む。
戻り値は読み込んだバイト数。エラーの場合はFALSE。

March 27, 2012

サーブレット・JSPメモ016:Struts:validator-rules.xml

環境
JDK 1.6.0_24
Struts 1.3.10

Struts関連の記事:
サーブレット・JSPメモ015:Struts:StrutsタグライブラリでInvalidCancelException

本ではValidatorの設定ファイルは WEB-INF フォルダに置いて

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
	<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml" />
</plug-in>

と設定するとある。しかしStrutsが提供するValidatorの検証ルールの設定ファイル validator-rules.xml は Struts 1.3.10 では struts-core-1.3.10.jar に含まれていて、パスは /org/apache/struts/validator/validator-rules.xml である。
よって、設定は

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
	<set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" />
</plug-in>

とする。Strutsを利用するなら/WEB-INF/lib フォルダに struts-core のjarファイルがあるはずなので、validator-rules.xml をjarファイルから取り出したり自分で作ったりする必要はない。
独自の検証ルールを作る場合は別に設定ファイル(validator-rules-2.xml とか)を作って WEB-INF フォルダに置いて struts-config.xml に追記すればよい。

サーブレット・JSPメモ015:Struts:StrutsタグライブラリでInvalidCancelException

いまさらStrutsの勉強中。「Apache Struts アプリケーション開発入門」という本を読んでいる。
Struts1.2の頃の本なので、本に載っているサンプルコードがそのままでは動かなかったりすることがたまにある。
そういうところをメモ。

環境
JDK 1.6.0_24
Struts 1.3.10

Strutsタグライブラリのhtml:cancelタグを使い、表示されたページのキャンセルボタンを押したら以下のような例外が発生した。

2012/03/27 18:30:40 org.apache.catalina.core.StandardWrapperValve invoke
致命的: サーブレット action のServlet.service()が例外を投げました
org.apache.struts.action.InvalidCancelException
	at org.apache.struts.chain.commands.AbstractValidateActionForm.isCancelled(AbstractValidateActionForm.java:73)
	at org.apache.struts.chain.commands.AbstractValidateActionForm.execute(AbstractValidateActionForm.java:111)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
...

struts-config.xmlのaction要素の子要素に
<set-property property="cancellable" value="true"/>
というのを書いてやれば例外は発生しなくなる。

<action path="/operateUser" type="OperateUserAction" name="userForm" parameter="method">
	<set-property property="cancellable" value="true"/>
	<forward name="create" path="/create.jsp" />
	<forward name="update" path="/update.jsp" />
	<forward name="delete" path="/delete.jsp" />
	<forward name="cancelled" path="/cancelled.jsp" />
</action>

参考サイト:Struts 1.2.9のInvalidCancelException - 忘れないようにメモしておこうかな。

March 23, 2012

サーブレット・JSPメモ014:タグライブラリの利用

タグライブラリを利用するには、タグライブラリのクラスファイルにクラスパスを通す。jarファイルの場合は /WEB-INF/libにファイルを置く。
JSPファイルにはtaglibディレクティブを書く。

<%@ taglib uri="<URI>" prefix="<プレフィックス>" %>

URIの指定方法には下記の3通りの方法がある。jarファイルとしてアーカイブされているタグライブラリは3番目の方法が大体は使えるので、web.xml にtaglib要素を書く必要はほとんどの場合ない。

  1. TLDファイルの物理パスを直接指定する。コンテキストルートからのパスかJSPからの相対パスで指定する。
  2. web.xml において定義されたTLDファイルのURIを指定する。 jsp-config要素の子要素のtaglib要素でtldファイルのパスとURIをマッピングする。
    <jsp-config>
      <taglib>
        <taglib-uri>http://taglib-sample.or.jp/taglibs/sample.tld</taglib-uri>
        <taglib-location>/WEB-INF/tld/sample.tld</taglib-location>
      </taglib>
    </jsp-config>
    
    そしてそのURIをtaglibディレクティブのURIとする。
    <%@ taglib uri="http://taglib-sample.or.jp/taglibs/sample.tld" prefix="s" %>
    

  3. TLDファイルで定義されているURIを指定する。TLDファイルでtaglib要素の子要素uriの値をJSPファイルのtaglibディレクティブのURIとする。

March 20, 2012

サンドstep4までクリア #FF11

午前中、お客様感謝デーなのでイオンに行ってきて、帰宅後にPHS見たら留守電が入っていた。
「サンド、ウィン、バスのVWの募集してるよ。もう11人集まってる。」
急いでログインしたが募集のシャウトは聞けなかった。もう閉まったようだ;;

でも午後、サンドの募集があって、今度は入ることが出来た。
自分は詩人で参加。
構成は、戦狩竜暗白吟、黒黒黒黒赤召、モモ忍忍白白。

ステップ3の過去ジャグナーのベヒーモスNMだけ弱点がうまく付けずホワイトアラインメントが全く上がらず。そしてメテオがバンバン来るw
倒したもののアートマは手に入らず。
なのでもう1戦。今度は全く順調に弱点を付けて、アートマゲット。

上記以外は順調に弱点を付いてジェイドとアートマを手に入れて倒した。
第1章残るはウィンのみ。

March 18, 2012

初VW、バスstep4までクリア #FF11

昨日、この前の裏ボスディンと同じようにLSメンバーから「VWステップ1からの募集あるよ」と電話があって、VWに参加した。
主催者にtellした時点で17人集まっていて、ギリギリセーフだった^^;
ジョブは赤で参加。

step1 その2、最初に現代北グスタベルグのワームNM。
殴りすぎてホワイトアライメントが40くらいで倒してしまった。よってジェイドは入手できず。
主催者さんが「盾以外にあんまりポコポコ殴らないように」と厳命w

step2 その2、過去北グスタベルグのペイストNM。
今度はちゃんとホワイトアライメントが上がってから倒したので探求の明色ジェイドをゲット。

step2、グスゲン、1個目のマップではやっている人いるようなので、2個目のマップの方でやることに。
集合にえらい時間がかかった。
グスゲン鉱山なんで久しぶりなのか、
「右側の扉を入って」
と言っているのに真ん中の扉を通ってしまい、現場にたどり着けない人多数^^;
戦闘は問題なく勝利。順応の暗色ジェイドをゲット。

step3 その1、現代パシュハウ、トンベリNN。
これも問題なく勝利。強襲のアートマ霊子ゲット。

step3 その2、過去パシュハウ、モルボルNM。
生臭い息でかな?何人か戦闘不能は出たものの、勝利。蹂躙のアートマ霊子ゲット。
カバンがいっぱいだったのでカバンのものをモグサックに移動していたらD2で飛ばされて報酬受け取れなかったorz

step4 その3、涸れ谷、ハルペイアNM。ハルペイア族って始めて見た。
結構戦死者が出てグダグダになったもののなんとか勝利。

これで第1章のバスルートをクリアってことかな。
このあとイベントというかクエストをクリアすれば、第2章のジュノルートに参加できるそうだ。


VWについては、WEBとか旅団の記事を見てもどんなのか良くわからなかったけど、1回やって大体わかった。
報酬のシステムはいいね。ロットしなくても一人一人にちゃんと戦利品が行くから。
step3やstep4でも戦闘不能が出たけど、LSメンバーよるとこの先はこんなもんじゃないらしい^^;
あと、ヴォイドストーンは勝った時だけ消費されるが敵を沸かした人だけは負けても消費するというシステムについてちょっと思ったことがある。
沸かせる人は他の参加者に比べてリスクを負っている訳だが、報酬に関しては特にボーナスがあるわけではないらしい。なんかちょっと沸かせる人にメリットがあってもいいじゃないかなあ。
普通は主催者が沸かせるらしいが、自分が参加した今回は主催者じゃないナイトさんが沸かしていた。第1章だから負けることはないと考えてそうなったんかな?

忘れないうちにまたやりたい。ウィンとサンドのstep1からの募集来い(´Д`)ノ

新潟開幕2連敗、磐田は今季初勝利 #jleague #albirex #jubilo

J's GOAL:試合詳細:2012 J1 第2節 アルビレックス新潟 1-2 大宮アルディージャ

ホーム開幕戦。GKは小澤さん。右SBが村上で三門はボランチに。そして亜土夢が先発。前節から結構選手が代わってる。
村上のクロスをBLが合わせて先制。しかし後半に2得点され逆転負け。開幕2連敗ですorz
前半は良かったらしいが、そこで1点しか取れなかったのがなあ。得点力不足は相変わらず。期待の平井もまだフィットしてない感じ。
後半は大宮がやり方を変えてきたのに対応できなかった。新潟は監督が選手交代や指示で流れを引き戻すって事が、できてない。
頼むよ黒崎監督。赤帽がもうクビになったけど、他人事じゃないと思うよ。


J's GOAL:試合詳細:2012 J1 第2節 ジュビロ磐田

磐田は山田のラッキーなゴールと駒野のビューティフルなFKで逆転、今季初勝利。
ただ、交代枠を2つも残した監督の采配は批判されてる。

March 17, 2012

PHPメモ025:カレンダー関連の関数

PHPではカレンダーとして主にグレゴリウス暦、ユリウス積算日(ユリウス日、ユリウス通日)、Unixタイムスタンプを使用する。
ユリウス積算日は紀元前4713年1月1日からの日数で、2日の日付の差を調べる際などには便利である。

int gregoriantojd(<月>, <日>, <年>)
グレゴリウス暦をユリウス積算日に変換する。

array cal_from_jd(<ユリウス積算日>, <カレンダー>)
ユリウス積算日を指定したカレンダーに変換する。第2引数は CAL_GREGORIAN がグレゴリウス暦。
戻り値はカレンダーの情報を含む配列。

サンプルーコード

$jd = gregoriantojd(5, 22, 2012);	// スカイツリー開業予定
echo $jd . "\n";
print_r(cal_from_jd($jd, CAL_GREGORIAN));
サンプルコードの出力
Array
(
    [date] => 5/22/2012
    [month] => 5
    [day] => 22
    [year] => 2012
    [dow] => 2
    [abbrevdayname] => Tue
    [dayname] => Tuesday
    [abbrevmonth] => May
    [monthname] => May
)

int unixtojd([<Unixタイムスタンプ>])
Unixタイムスタンプをユリウス積算日に変換する。引数が省略された場合は現在の日時を使用する。

int jdtounix(<ユリウス積算日>)
ユリウス積算日をUNIXタイムスタンプに変換する。

サンプルーコード
$ut = strtotime('2012/5/21'); // 金環日食
echo $ut . "\n";
$jd = unixtojd($ut);
echo $jd . "\n";
dispArray(cal_from_jd($jd, CAL_GREGORIAN));
$ut2 = jdtounix($jd);
echo $ut2 . "\n";
サンプルコードの出力
1337526000
2456069
[date]=>5/21/2012,[month]=>5,[day]=>21,[year]=>2012,[dow]=>1,[abbrevdayname]=>Mon,[dayname]=>Monday,[abbrevmonth]=>May,[monthname]=>May,
1337558400

最後のタイムスタンプの値は最初のUnixタイムスタンプの値よりちょうど9時間(60*60*9=32400秒)、日本時間とGMTの時差の分大きい。
これはユリウス積算日には時刻の情報がないので、3行目のUnixタイムスタンプからユリウス積算日への変換でローカル時間に関する情報が失われたため。

mixed jddayofweek(<ユリウス積算日>[, <モード>])
ユリウス積算日から曜日を返す。モードで返す値の形式を指定する。

モードに指定できる値は下表。

モード 説明
0 日曜日を0とする数値(デフォルト)
1 英語の曜日(フルスペル)
2 英語の曜日(3文字の省略形)

string jdmonthname(<ユリウス積算日>, <モード>)
ユリウス積算日から月の名前を返す。モードで返す値の形式を指定する。

モードに指定できる値は下表。

モード 説明
0 英語の月名(3文字の省略形)
1 英語の月名(フルスペル)

サンプルーコード
$jd = gregoriantojd(7, 27, 2012); // ロンドン五輪
echo jddayofweek($jd, 0) . "\n";
echo jddayofweek($jd, 1) . "\n";
echo jdmonthname($jd, 0) . "\n";
echo jdmonthname($jd, 1) . "\n";
サンプルコードの出力
5
Friday
Jul
July

int cal_days_in_month(<カレンダー>, <月>, <日>)
指定したカレンダーと月についてつきの日数を返す。第1引数は CAL_GREGORIAN がグレゴリウス暦。

bool checkDate(<月>, <日>, <年>)
指定した日付がグレゴリウス暦で妥当かを調べる。

サンプルーコード
echo cal_days_in_month(CAL_GREGORIAN, 2, 2012) . "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 2013) . "\n";
echo "\n";

echo (checkdate(2, 29, 2012) ? '有効' : '無効') . "\n";
echo (checkdate(2, 29, 2013) ? '有効' : '無効') . "\n";
サンプルコードの出力
29
28

有効
無効

デュナミス-ボスディンクリア #FF11

おとといの夜、「裏ボスディンのクリア目的の募集やってるよ」とLSメンバーから電話がかかってきた。ありがたい^^
急いでログインして参加した。
9キャラ(2アカの人が複数いたので中の人の人数は7人くらいだと思う)で出発。おいらは白。

石像を倒してからボス戦。
作戦はシーフが沸かしてドラゴンをマラソン、召が絶対防御してモンク、獣などでボスをボコる。連続魔が来たら赤が連続魔スタン。
で、やってみたが、負けたorz
ボスがあっちへこっちへワープして大混乱。自分も右往左往しているうちにボスがデスを配りはじめて回りの人たちがどんどん死んでいく(;゚∀゚)
とりあえずHP減っている人にケアルをしたらドラゴンに殴られて死亡。
全滅しましたorz
ボスのHPは半分ほど削った。

敗戦後の会話を聞いていると
・絶対防御でドラゴンのタゲがシーフから外れちゃったんじゃないか。
・ボスがワープするのでなかなかタゲれなくて攻撃が当てられない。
などと皆さん言っていた。

絶対防御や連続魔はないけどもう1回やってみようとはなしになり、トリガを取って再戦。
さっきは前衛がTPを貯めてなかったのでTPを貯めて連携しよう、あとは2hアビがない以外はさっきと同じ作戦で、ということになった。
2戦目開始。
でもやっぱりボスがワープしてみんな右へ左へ、うまく行っているのかいないのかさっぱりわからん。PTメンバーがワープするボスを求めて常に動き回っているので、回復しようと思っても射程外だったりして大変。
しかし、気がついたら勝ってた^^;
3人くらい戦闘不能になったけど、勝てればよいw
おいらは始まる前にプロシェル、ヘイストして、戦闘中はグラビガ食らった人にイレースしてただけ。役立たず^^;

でもこれでデュナミス-ザルカバードへの道は開かれた^^/

March 15, 2012

PHPメモ024:日付・時刻関連の関数 その2

int mktime(<時>[, <分>[, <秒>[, <月>[, <日>[, <年>]]]]])
日付からUnixタイムスタンプを取得する。
サンプルーコード
$t = mktime(10, 0, 0, 3, 14, 2012);
echo date('Y/m/d', $t) . ' の曜日は ' . date('l') . "\n";
サンプルコードの出力
2012/03/14 の曜日は Wednesday

array getdate([<Unixタイムスタンプ>])
タイムスタンプの日付情報を配列で返す。引数が省略された場合は現在のローカル時間を使用する。

返される配列のキーと値の意味は以下。

キー 備考
seconds 0-59
minutes 0-59
hours 0-23
mday 1-31
wday 曜日 0(日曜日)-6(土曜日)
mon 1-12
year 4桁の年
yday 年初からの日数 0-365
weekday 曜日 フルスペル
month フルスペル
0 Unixタイムスタンプ
サンプルーコード
$a = getdate(strtotime('+2 week'));
print_r($a);
サンプルコードの出力
Array
(
    [seconds] => 40
    [minutes] => 25
    [hours] => 15
    [mday] => 28
    [wday] => 3
    [mon] => 3
    [year] => 2012
    [yday] => 87
    [weekday] => Wednesday
    [month] => March
    [0] => 1332915940
)

PHPメモ023:日付・時刻関連の関数 その1

int time()
現在のUnixタイムスタンプ(1970年1月1日 00:00:00 GMT からの通算秒数を返す。

time() の戻り値はグリニッジ標準時であり日本時間に変換するには

time() + 9 * 60 * 60

のように9時間を足さなければならない。しかし、date() や strtotime() など日付・時刻関連の関数の多くはタイムゾーン情報を用いてローカルタイムに換算して処理を行うので、通常はこのような変換をする必要はない。

タイムゾーンは以下の優先順位で取得される。

  1. date_default_timezone_set() で設定したタイムゾーン。
  2. (PHP 5.4.0 以前)TZ環境変数。
  3. php.ini の date.timezone
  4. (PHP 5.4.0 以前)OSに問い合わせる

string date(<フォーマット>[, <Unixタイムスタンプ>])
指定されたUnixタイムスタンプからフォーマットに従って文字列を生成し返す。Unixタイムスタンプが省略された場合は現在の日時を使用する。

フォーマットに使用する文字は以下。

文字 説明
Y 年(4桁)
y 年(2桁)
L 閏年か(閏年なら1、閏年でないなら0)
m 月(01-12)
n 月(1-12、前ゼロなし)
M 月(3文字)
F 月(フルスペル)
t 指定したつきの日数
d
H 時(00-23)
h 時(01-12))
G 時(0-23、前ゼロなし)
g 時(1-12、前ゼロなし)
a am または pm(小文字)
A AM または PM(大文字)
i
s
D 曜日(3文字)
l 曜日(フルスペル)
w 曜日(数字、0-6)
e タイムゾーン識別子
T タイムゾーンの略称
O グリニッジ標準時との誤差
c ISO 8601 形式(XMLSchemaの型としいて規定されている形式)
r RFC 2822 形式

サンプルーコード
echo date('Y-m-d') . "\n";
echo date('Y/m/d H:i:s e') . "\n";
echo date('Y/m/d(D) h:i:s a O') . "\n";
echo date('D, d M Y H:i:s T') . "\n";
echo 'c(iso8601):' . date('c') . "\n";
echo 'r(rfc2822):' . date('r') . "\n";
サンプルコードの出力
2012-03-14
2012/03/14 14:27:31 Asia/Tokyo
2012/03/14(Wed) 02:27:31 pm +0900
Wed, 14 Mar 2012 14:27:31 JST
c(iso8601):2012-03-14T14:27:31+09:00
r(rfc2822):Wed, 14 Mar 2012 14:27:31 +0900

int strtotime(<文字列>[, <now>])
文字列の日付をUnixタイムスタンプに変換する。

第2引数はリファレンスを読んでもどういう意味なのか不明。下記の例にあるように、違う値を入れても同じ結果が返ってくる。

この関数の引数には 'yesterday' や '+1 month' など色々な表現が使える。
参考ページ:PHP :: イディオム / strtotime を使った相対的な日付 [Tipsというかメモ]

サンプルーコード
$now = time();
echo 'time() : ' . $now . ':' . date('Y/m/d H:i:s', $now) . "\n";
dateTest('2012-03-14');
dateTest('2012-03-14 10:00:00');
dateTest('yesterday');
dateTest('next Sunday');
dateTest('+1 month');
dateTest(date('Y-m-1').'+2 month');
echo "\n";

// 第2引数の値を変えても同じ値が帰ってくる。第2引数の意味は?
echo strtotime('2012-03-14', time()) . "\n";
echo strtotime('2012-03-14', time() - (24 * 60 * 60)) . "\n";
echo strtotime('2012-03-14', 0) . "\n";

function dateTest($str) {
	$t = strtotime($str);
	echo $str . ' : ' . $t . ' : ' . date('Y/m/d H:i:s', $t)   . "\n";
}
サンプルコードの出力
time() : 1331705389:2012/03/14 15:09:49
2012-03-14 : 1331650800 : 2012/03/14 00:00:00
2012-03-14 10:00:00 : 1331686800 : 2012/03/14 10:00:00
yesterday : 1331564400 : 2012/03/13 00:00:00
next Sunday : 1331996400 : 2012/03/18 00:00:00
+1 month : 1334383789 : 2012/04/14 15:09:49
2012-03-1+2 month : 1335798000 : 2012/05/01 00:00:00

1331650800
1331650800
1331650800

U-23 ロンドン五輪出場決定 #daihyo

日本が5大会連続9度目の五輪!/U23 - サッカー日本代表ニュース : nikkansports.com

まあ、決まって良かった。
協会とテレビ局はホッとしているだろう^^;
でも内容的には物足りなかった。

前半の終わりの方、完全に相手の守備を崩して決定的なチャンスだったのに、比嘉のシュートはキーパー真正面orz
扇原、清武のゴールはすばらしかった。
でもその後、戦意を失った相手から追加点を取れなかった。
攻撃が左や真ん中に寄っていて、一生懸命上がっているフリーの酒井を使ってなかった。
ドリブラーや裏に飛び出す選手はいるけど、タメを作って広い視野でパスを出せる選手が必要だ。
OAで中村憲剛なんてどうだろうか。

March 13, 2012

PHPメモ022:ファイル関連の関数 その3

resource fopen(<ファイル名>, <モード>[, <インクルードパス>[, <ストリームコンテキスト>]])
ファイルをオープンする。modeはアクセス形式(読み込み用、書き込み用など)指定する。インクルードパスは 1 または TRUE を指定すると include_path のファイルの検索も行う。
戻り値はファイルハンドル。エラー時にはFALSE。

mode は下表のいずれかになる。

mode 説明
r 読み込み用でオープンする。ファイルポインタをファイルの先頭に置く。
r+ 読み込み/書き出し用にオープンする。ファイルポインタをファイルの先頭に置く。
w 書き出しのみでオープンする。ファイルポインタをファイルの先頭に置き、ファイルサイズをゼロにする。ファイルがない場合は作成を試みる。
w+ 読み込み/書き出し用にオープンする。ファイルポインタをファイルの先頭に置き、ファイルサイズをゼロにする。ファイルがない場合は作成を試みる。
a 書き出しのみでオープンする。ファイルポインタをファイルの終端に置く。ファイルがない場合は作成を試みる。
a+ 読み込み/書き出し用でオープンする。ファイルポインタをファイルの終端に置く。ファイルがない場合は作成を試みる。
x 書き出しのみでオープンする。ファイルポインタをファイルの先頭に置く。ファイルが既に存在する場合は fopen() は失敗する。ファイルが存在しない場合は作成を試みる。
x+ 読み込み/書き出し用でオープンする。それ以外の振る舞いは'x'と同じ。
c 書き出しのみでオープンする。ファイルが存在しないは作成を試みる。ファイルが既に存在する場合でも 'w' のように切り詰めたり、'x' のように関数コールに失敗することもない。
c+ 読み込み/書き出し用でオープンする。それ以外の振る舞いは'c'と同じ。

'+' が付いているのは読み込み/書き出しの両方ができる。
'w' と 'a' と 'c' はファイルが既に存在すればそれを開くし、なければ作る。
'x' は新規作成用でファイルが既に存在するとエラーになる。

Windows環境では上表のモードの後に改行の変換モードを指定する 't' または 'b' を指定できる。デフォルトでは 'b'(バイナリモード)。

mode 説明
t '\n' を '\r\n' に変換する。
b バイナリモード。変換はしない。

bool fclose(<ファイルハンドル>)
ファイルをクローズする。

string fgets(<ファイルハンドル>[, <長さ>])
ファイルから1行読み込む。長さを指定した場合は改行に達する前でもlength-1バイト読んだ時点で終了する。

array fgetcsv(<ファイルハンドル>[, <長さ>[, <区切り文字>[, <囲い込み文字>[, <エスケープ文字>]]])
ファイルから1行読み込み、CSVフィールドとして処理をしてフィールドの配列を返す。

fputs(<ファイルハンドル>, <文字列>[, <長さ>])
fwrite(<ファイルハンドル>, <文字列>[, <長さ>])
文字列をファイルに書き込む。長さが指定された場合は文字列の終わりに達する前でも長さ分書き込んだ時点で終了する。
戻り値は書き込んだバイト数。エラーの場合はFALSE。

fputcsv(<ファイルハンドル>, <配列>[, <区切り文字>[, <囲い込み文字>]])
配列をCSVフォーマットでファイルに書き込む。

string serialize(<配列またはオブジェクト>)
値を方や構造を失わずに保存可能なバイトストリーム表現を含む文字列を生成する。

mixed unserialize(<文字列>)
シリアル化された変数をPHP変数値に変換する。

bool fflush(<ファイルハンドル>)
バッファリングされた出力をファイルに書き込む。

bool feof(<ファイルハンドル>)
ファイルポインタがファイルの終端に達しているかを調べる。

int fseek(<ファイルハンドル>, <オフセット>[, <シーク基準>])
ファイルポインタをオフセットで指定したバイト数移動する。移動の向きはオフセットが正の値なら末尾の方向、負の値なら先頭の方向。シーク基準はどの位置からオフセット分移動するかを指定する。SEEK_SET は先頭から、SEEK_CUR は現在の位置から、 SEE_END は末尾から。
戻り値は成功ならば 0、それ以外は -1。

ファイルを1行ごとに読み込むサンプルーコード
if ($fh = fopen('sample.txt', 'r')) {
	while (FALSE !== ($buffer = fgets($fh))) {
		echo $buffer;
	}
	fclose($fh);
}
シリアライズのサンプルーコード
if ($fh = fopen('serialize.txt', 'w')) {
	$a = array('Demon小暮', 'Ace清水', 'Luke篁');
	fputs($fh, serialize($a) . "\r\n");
	fflush($fh);
	fclose($fh);
}

if ($fh = fopen('serialize.txt', 'r')) {
	while (FALSE !== ($buffer = fgets($fh))) {
		$b = unserialize($buffer);
		print_r($b);
	}
	fclose($fh);
}

March 12, 2012

PHPメモ021:ファイル関連の関数 その2

bool mkdir(<パス>[, <モード>[, <入れ子>[, <ストリームコンテキスト>]]])
指定したディレクトリを作成する。
モードはデフォルトが0777で、Windowsでは無視される。
<入れ子>は入れ子構造のディレクトリの作成を許可するかの指定。デフォルトはFALSE。
戻り値は作成に成功した場合は TRUE、失敗した場合は FALSE。

bool rmdir(<ディレクトリ名>[, <ストリームコンテキスト>])
指定したディレクトリを削除する。削除しようとするディレクトリにファイル・サブディレクトリがある場合は削除に失敗する。
戻り値は削除に成功した場合は TRUE、失敗した場合は FALSE。

bool unlink(<ファイル名>[, <ストリームコンテキスト>])
指定したファイルを削除する。

string realpath(<パス>)
指定したパスの絶対パスを返す。

array glob(<パターン>[, <フラグ>])
パターンにマッチするエントリを配列で返す。

string dirname(<パス>)
パスのディレクトリの部分を返す。

string basename(<パス>[, <サフィックス>)
パスの最後にある名前の部分を返す。サフィックスを指定した場合はサフィックスを取り除いた名前を返す。

mixed pathinfo(<パス>[, <オプション>])
指定したパスの情報を配列に格納して返す。オプションでどの要素を返すか指定できる。

返される配列のキーと値は次のようになる。

キー
dirname ディレクトリ名部分
basename ファイル名部分
extension 拡張子部分
filename 拡張子を含まないファイル名部分

拡張子がない場合はextensionの要素自体がない。

サンプルーコード
$pattern = realpath('.');
echo "realpath: ${pattern}\n";
$files = glob($pattern . '/*.php');
foreach($files as $file) {
	$info = pathinfo($file);
	dispArray($info);
	echo ' dirname :' . dirname($file) . "\n";
	echo ' basename:' . basename($file) . "\n";
}

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
realpath: C:\applications\Apache2.2\htdocs\part5
[dirname]=>C:\applications\Apache2.2\htdocs\part5,[basename]=>test.php,[extension]=>php,[filename]=>test,
 dirname :C:\applications\Apache2.2\htdocs\part5
 basename:test.php
[dirname]=>C:\applications\Apache2.2\htdocs\part5,[basename]=>tmp.php,[extension]=>php,[filename]=>tmp,
 dirname :C:\applications\Apache2.2\htdocs\part5
 basename:tmp.php

bool copy(<コピー元ファイル>, <コピー先ファイル>)
ファイルをコピーする。

bool rename(<変更前ファイル名>, <変更後ファイル名>)
ファイルをリネームする。

PHPメモ020:ファイル関連の関数 その1

ファイル関連の関数は「ストリームコンテキスト」というものを引数に取るものがあるが、これがなんなのかは今のところ考えない。

string getcwd()
カレントのワーキングディレクトリを取得する。

resource opendir(<パス>[, <ストリームコンテキスト>])
パスで指定したディレクトリを開きディレクトリハンドルを返す。

string readdir([<ディレクトリハンドル>])
ディレクトリから次のエントリ名(ファイル名またはディレクトリ名)を返す。返すものがなければFALSEを返す。
引数が省略された場合は opendir() が最後に開いたものを使用する。

void closedir([<ディレクトリハンドル>])
ディレクトリを閉じる。
引数が省略された場合は opendir() が最後に開いたものを使用する。

array scandir(<パス>[, <ソート順>[, <ストリームコンテキスト>]])
パスで指定したディレクトリのファイル名およびディレクトリ名をすべて取得し配列として返す。
ソート順を省略した場合は昇順。

サンプルーコード
$cwd = getcwd();
dispArray(scandir($cwd));
dispArray(scandir($cwd, 1));

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
[0]=>.,[1]=>..,[2]=>customers,[3]=>test.php,[4]=>tmp.php,
[0]=>tmp.php,[1]=>test.php,[2]=>customers,[3]=>..,[4]=>.,

bool is_file(<ファイル名>)
指定したファイルがファイルであるかを調べる。

bool is_executable(<ファイル名>)
指定したファイルが実行可能であるかを調べる。

bool is_writable(<ファイル名>)
指定したファイルが書き込み可能であるかを調べる。ディレクトリに対しても使用できる。

int filesize(<ファイル名>)
ファイル名のファイルサイズを使用する。

bool is_dir(<ファイル名>)
指定したファイルがディレクトリであるかを調べる。

float disk_free_space(<ディレクトリ名>)
指定したディレクトリのディスクパーティションの利用可能なバイト数を返す。

int filemtime(<ファイル名>)
指定したファイルの更新時刻を取得する。

サンプルーコード
$cwd = getcwd();
echo "current directory: ${cwd}\n";
echo 'free ' . disk_free_space($cwd) . "bytes\n";

if (is_dir($cwd)) {
	if ($dh = opendir($cwd)) {
		while (FALSE !== ($filename = readdir($dh))) {
			if (is_file($filename)) {
				echo " file     :${filename}:";
				echo is_executable($filename) ? 'x' : '-';
				echo is_writable($filename) ? 'w' : '-';
				echo ' ' . filesize($filename) . "bytes\n";
			} else {
				echo " directory:${filename}:";
				echo is_writable($filename) ? 'w' : '-';
				echo "\n";
			}
		}
	}
	closedir($dh);
}
サンプルコードの出力
current directory: C:\applications\Apache2.2\htdocs\part5
free 420778958848bytes
 directory:.:w
 directory:..:w
 directory:customers:w
 file     :test.php:-w 570bytes
 file     :tmp.php:-w 7386bytes

March 11, 2012

URLエンコード、BASE64エンコード、MIMEヘッダエンコード

PHPの記事でいろんなエンコードが出てきたので簡単にまとめ。

URLエンコード

RFC3986では「パーセントエンコーディング」と呼んでいる。URLの文字列やフォームで送信されるデータに使われる。
以下のようにエンコードされる。
・アルファベット、数字、ピリオド、アンダースコアはそのまま。
・スペースは '+' に変換。
・それ以外は "%xx"(xxは16進数)に変換。ただし、Shift_JISの2バイト目などが非予約文字(URIで特別な意味を持たない文字?英数字、ハイフン、ピリオド、アンダースコア、チルダ)に対応する場合は、その文字をそのまま使用してもよい。
#「SHIFT_JISの2バイト目など」の「など」って何だ?他にどういう場合があるのか?
"abc123 あいうアイウ +-_:/" UTF-8でURLエンコードすると
abc123+%E3%81%82%E3%81%84%E3%81%86%E3%82%A2%E3%82%A4%E3%82%A6+%2B-_%3A%2F
Shift_JISでLエンコードすると
abc123+%82%A0%82%A2%82%A4%83A%83C%83E+%2B-_%3A%2F
になる。

BASE64エンコード

データを印字可能な64文字のみで表す。Eメールで広く使われている。
以下のようにエンコードする(例:UTF-8の"あいうab")

  1. 2進で表現する。
    1110 0011 1000 0001 1000 0010 1110 0011 1000 0001 1000 0100 1110 0011 1000 0001 1000 0110 0110 0001 0110 0010
  2. 6ビットごとに区切る。6ビットに足りない分は0で埋める。
    111000 111000 000110 000010 111000 111000 000110 000100 111000 111000 000110 000110 011000 010110 0010[00]
  3. 各6ビットを対応表で印字可能文字に置き換える。対応表はASCIIコード表などではなく、BASE64の独自のもの。
    4 4 G C 4 4 G E 4 4 G G Y W I
  4. 4文字ごとにまとめる。4文字に足りない部分は'='で埋める。
    44GC 44GE 44GG YWI=

MIMEヘッダエンコード

=?<文字セット>?<エンコーディング>?<エンコードされたテキスト>?=

encodingはBかQ。Bはbase64、Qははほぼquoted-printableと同じ符号化方法。

UTF-8の"あいうab"をエンコーディングBでエンコードすると
=?UTF-8?B?44GC44GE44GGYWI=?=
になる。

参考ページ:
付録D URLエンコーディング(URLエンコード または URLエスケープ)
パーセントエンコーディング - Wikipedia
Base64 - Wikipedia
Multipurpose Internet Mail Extensions - Wikipedia
Uniform Resource Identifier (URI): 一般的構文

PHPメモ019:エンコーディング関連の関数 その2

string htmlspecialchars(<文字列>[, <フラグ>[, <エンコーディング>]])
文字列中のアンパサンド、ダブルクゥオート、シングルクウォート、'<'、'>' を実体参照に変換して返す。フラグは変換の制御のためのフラグ。エンコーディングは変換に使用されるエンコーディングでデフォルトはISO-8859-1(PHP 5.4.0 より前)またはUTF-8(PHP 5.4.0以降)。

string htmlspecialchars_decode(<文字列>[, <フラグ>])
htmlspecialchars() の逆変換(実体参照→文字)を行って返す。

サンプルーコード
$str = '&"<>あいうabc';
$enc = htmlspecialchars($str);
echo $enc . "\n";
$dec = htmlspecialchars_decode($enc);
echo $dec . "\n";
サンプルコードの出力
&amp;&quot;&lt;&gt;あいうabc
&"<>あいうabc

string htmlentities(<文字列>[, <フラグ>[, <エンコーディング>]])
文字列中の実体参照に変換可能なすべての文字を変換して返す。

string html_entity_decode(<文字列>[, <フラグ>[, <エンコーディング>]])
htmlentities()の逆変換(実体参照→文字)を行って返す。

string urlencode(<データ>)
データをURLエンコードして返す。

string urldecode(<データ>)
データをURLデコードして返す。

string base64_encode(<データ>)
データをbase64でエンコードして返す。

string base64_decode(<データ>)
データをbase64でデコードして返す。

string mb_encode_mimeheader(<文字列>[, <文字エンコーディング>[, <7ビットエンコーディング>[, <ラインフィード>[, <インデント>]]]])
文字列をMIMEヘッダエンコーディングでエンコードして返す。
文字エンコーディングは文字列のエンコーディングを指定する。デフォルトはNLS設定(mbstring.language)により決定される。
7ビットエンコーディングは 'B' か 'Q'。デフォルトは 'B'(BASE64を使う)。
ラインフィードはデフォルトは "\r\n"(CRLF)。

string mb_decode_mimeheader(<文字列>)
文字列をMIMEヘッダエンコーディングでデコードして返す。

サンプルーコード
echo urlencode('abc123 あいう +-_:/');
echo "\n";
echo base64_encode('あいうab');
echo "\n";
echo mb_encode_mimeheader('あいうab');
サンプルコードの出力
abc123+%E3%81%82%E3%81%84%E3%81%86+%2B-_%3A%2F
44GC44GE44GGYWI=
=?UTF-8?B?44GC44GE44GGYWI=?=

2012年J1開幕戦 #albirex #jleague

J's GOAL:試合詳細:2012 J1 第1節 フロンターレ川崎 1-0 アルビレックス新潟

開幕戦は無得点で敗戦。
川崎も決して良くなかったと思うけど、それでも負けた。

BL、貴章の2トップ。SHは左小谷野、右アラン・ミネイロ。SBは左キム・ジンス、右三門。CBは大井、大輔。
三門がSBか。守備重視なら三門で攻撃重視なら村上って感じ?
ミシェウは控えにも入っていない。ケガ?

貴章はやっぱ貴章のまま^^;
最初のチャンスを決めていればなあ。

勲が最初に代えられたけど、あれでは仕方なし。かなりミスパスしたりボール奪われたりして良くなかった。

アラン・ミネイロは玉離れが悪くて奪われる場面が結構あった。日本のサッカーにフィットしてないな。キム・ジンスと連携も出来てないし。ヨンチョルとは較べるべくもない。
FK蹴ってたけど、うーん。どうかな。

FKと言えば途中で入った亜土夢。絶好の一からのFKだったのに壁に当ててチャンスをフイにした。去年もFKたくさん蹴っけど直接入ったのは確か1本。今年もFKからの得点はあんまり期待できないなあ。

小谷野はまあまあ良かったんじゃないかなあ。

ロスタイムのチャンスは惜しかったなー。得点力不足は変わらずか。
ひどい出来とまでは言わないが、明るい展望より不安の方が大きい開幕戦だった。
ミシェウ早く戻ってきてー;;

EQサヨン+1をゲット #FF11

昨晩、アビセア-アルテパのサボテンダーNMで胴型紙取りの募集があったので赤型紙希望、吟/白で参加。
6人(2アカが1人)で7戦やって型紙2枚を取得。トータル7枚。このNMはモンクと吟がよく出る。
10枚そろったのは1人だけだったのでもう一回りやることに。
もう7戦やってさらに2枚ゲット。@1枚のところで終了orz

でも帰りにレポート回収クエをやったら、ポロっと赤型紙出た(゚Д゚)
全然期待してなかったのにびっくりだ。

エスクトルサヨンもらってジュノに戻り、EQサヨン+1ゲット^^
これで赤のエンピリアン装束が全部+1以上になった。

March 10, 2012

学者上げてないけどSVローファー+1完成 #FF11

ブッキス連戦の後、気づいたらサバントローファーがかばんに入っていた。
型紙は7枚。学者上げてないけど捨てるのもなんかもったいない。
#貧乏性w
カバンの空きを作るためにサクッと+1を作ることに。
@1枚の型紙はアビ-ブンカのHanumanで取ることにした。でもなかなか出ない。4回目でやっと出た。
ルルデの庭で納品してSVローファー+1をゲット。ぜんぜん「サクッと」とは行かなかった。
そしてすぐにモグ預かり帳に預けた。
何のために作ったんだw

PHPメモ018:エンコーディング関連の関数 その1

array mb_list_encodings()
サポートするすべてのエンコーディングの配列を返す。

bool mb_check_encoding(<文字列>, <エンコーディング>)
文字列が指定したエンコーディングかを判定する。

サンプルーコード
$encodings = mb_list_encodings();
dispArray($encodings);

$str = 'こんにちは';
echo mb_check_encoding($str, 'UTF-8') ? "UTF-8\n" : "UTF-8以外\n";
サンプルコードの出力
[0]=>pass,[1]=>auto,[2]=>wchar,[3]=>byte2be,[4]=>byte2le,[5]=>byte4be,[6]=>byte4le,[7]=>BASE64,[8]=>UUENCODE,[9]=>HTML-ENTITIES,[10]=>Quoted-Printable,[11]=>7bit,[12]=>8bit,[13]=>UCS-4,[14]=>UCS-4BE,[15]=>UCS-4LE,[16]=>UCS-2,[17]=>UCS-2BE,[18]=>UCS-2LE,[19]=>UTF-32,[20]=>UTF-32BE,[21]=>UTF-32LE,[22]=>UTF-16,[23]=>UTF-16BE,[24]=>UTF-16LE,[25]=>UTF-8,[26]=>UTF-7,[27]=>UTF7-IMAP,[28]=>ASCII,[29]=>EUC-JP,[30]=>SJIS,[31]=>eucJP-win,[32]=>SJIS-win,[33]=>CP51932,[34]=>JIS,[35]=>ISO-2022-JP,[36]=>ISO-2022-JP-MS,[37]=>Windows-1252,[38]=>ISO-8859-1,[39]=>ISO-8859-2,[40]=>ISO-8859-3,[41]=>ISO-8859-4,[42]=>ISO-8859-5,[43]=>ISO-8859-6,[44]=>ISO-8859-7,[45]=>ISO-8859-8,[46]=>ISO-8859-9,[47]=>ISO-8859-10,[48]=>ISO-8859-13,[49]=>ISO-8859-14,[50]=>ISO-8859-15,[51]=>ISO-8859-16,[52]=>EUC-CN,[53]=>CP936,[54]=>HZ,[55]=>EUC-TW,[56]=>BIG-5,[57]=>EUC-KR,[58]=>UHC,[59]=>ISO-2022-KR,[60]=>Windows-1251,[61]=>CP866,[62]=>KOI8-R,[63]=>ArmSCII-8,
UTF-8

string mb_detect_encoding(<文字列>, [<エンコーディングリスト>])
文字列のエンコーディングの検出を試みる。エンコーディングリストは配列かカンマ区切りの文字列で、省略された場合のデフォルトはUTF-8とASCII。
戻り値は検出されたエンコーディング。検出できなかった場合はFALSE。

サンプルーコード
$str = 'こんにちは';
echo mb_detect_encoding($str, mb_list_encodings());
echo "\n";
echo mb_detect_encoding($str, 'UTF-8,EUC,SJIS');
サンプルコードの出力
UTF-8
UTF-8

string mb_convert_encoding(<文字列>, <変換先エンコーディング>[, <変換元エンコーディング>)
文字列を変換元エンコーディングから変換先エンコーディングに変換して返す。変換元エンコーディングが省略された場合のデフォルトは内部エンコーディング。

サンプルーコード
$str = 'こんにちは';
echo $str;
echo "\n";
echo mb_convert_encoding($str, 'SJIS');
サンプルコードの出力
こんにちは
???ノ???ヘ

string mb_convert_variables(<変換先エンコーディング>, <変換元エンコーディング>, <文字列変数>)
変数の文字列を指定したエンコーディングで変換する。文字列変数には変数、配列、オブジェクトを使用できる。
戻り値は変換前のエンコーディング。変換に失敗した場合はFALSE。

サンプルーコード
$str1 = 'こんにちは';
if (FALSE !== mb_convert_variables('SJIS', 'UTF-8', $str1)) {
	echo $str1 . "\n";
} else {
	echo '$str1' . ":変換失敗\n";
}

$str2 = array('明治', '大正', '昭和', '平成');
if (FALSE !== mb_convert_variables('SJIS', 'UTF-8', $str2)) {
	dispArray($str2);
} else {
	echo '$str2' . ":変換失敗\n";
}
サンプルコードの出力
???ノ???ヘ
[0]=>????,[1]=>?吳,[2]=>???a,[3]=>????,

mixed mb_substitute_character([<代替文字>])
変換できなかった文字の代わりとして出力する文字を指定する。引数無しの場合は代替文字を出力する。代替文字はUnicode値の整数で指定する。また"none"とした場合は代替文字を出力しない。
戻り値は引数がある場合は設定に成功した場合はTRUE、そうでない場合はFALSE。引数がない場合はUnicode値。

サンプルーコード
echo mb_substitue_character();
サンプルコードの出力
63

第70期順位戦B級2組最終戦、タナトラ降級 #shogi

第70期名人戦・順位戦 B級2組

まだ連盟のサイトは更新されてないけど、昨日最終戦だった。
9回戦までで広瀬七段の昇級は決まっていたけど、残りの1人は飯塚祐紀七段が最終戦に勝ってに決定。この人はよく知らない^^;
広瀬七段は最終戦も勝って10戦全勝。さすが、このクラスでは実力が頭ひとつ抜けているな。

降級点は田中寅彦九段、桐山清澄九段、神谷広志七段、青野照市九段。降級点2点で降格は田中九段と桐山九段。
田中九段と言えばその昔、公文式のCMに羽生二冠と一緒に出てた人だ。
瀬川さんと仲がいい豊川七段は最終戦に負けて3勝7敗だったけど順位の差(降級したばっかりなので1位)でなんとか逃げ切った。

よく言われることだけど昇級人数ってもう少し増やしてもいい気がする。人数が少ないAとB1は2人でもいいけど、B2以下は昇級をもう1人ずつ増やして降級点も25%とか30%にしたらどうだろうか。
今の昇級人数だと棋士の新陳代謝が進まない(おじいちゃんたちが粘って若い棋士が上に上がれない)し、C2の人数がどんどん増えていく^^;

March 09, 2012

PHPメモ017:文字列関数 その4

int mb_ereg(<パターン>, <文字列>[, <配列>])
文字列を正規表現を用いたパターンで検索する。第3引数があればマッチした文字列を格納する。
戻り値は第3引数がない場合、マッチすれば1を返す。第3引数がある場合はマッチしたバイト数を返す。

string mb_ereg_replace(<パターン>, <置換文字列>, <文字列>)
文字列を正規表現を用いたパターンで検索し置換文字列で置換して、置換した結果の文字列を返す。

サンプルーコード
$str = 'aaBBBBcccD';
$pattern1 = "[a-z]+";
$match = mb_ereg($pattern1, $str);
echo "${match}\n";
$match = mb_ereg($pattern1, $str, $arr);
echo "${match}\n";
dispArray($arr);
echo "\n";

$pattern2 = "[A-Z]+";
$result = mb_ereg_replace($pattern2, 'XXX', $str);
echo $result;
サンプルコードの出力
1
2
[0]=>aa,

aaXXXcccXXX

PHPメモ016:文字列関数 その3

int mb_strwidth(<文字列>[, <エンコーディング>])
文字列の長さをシングルバイト文字は1、マルチバイト文字は2として返す。

サンプルーコード
$str = '三菱東京UFJ銀行';
echo "${str}:" . mb_strwidth($str);
サンプルコードの出力
三菱東京UFJ銀行:15

string mb_strimwidth(<文字列>, <開始>, <幅>[, <マーカー>[, <エンコーディング>]])
文字列を開始の位置(0オリジン)から指定した幅で丸めて返す。幅はmb_strwidth()と同様にシングルバイト文字は1、マルチバイト文字は2と数える。マーカーがある場合は末尾にマーカーを付け、マーカーを含めて指定幅に収まるようにする。

サンプルーコード
$str = '日経平均9900円台を回復。7ヶ月ぶり。';
echo mb_strimwidth($str, 0, 20);
echo "\n";
echo mb_strimwidth($str, 0, 20, '...');
サンプルコードの出力
日経平均9900円台を回
日経平均9900円台...

string mb_convert_case(<文字列>, <変換モード>)
文字列中のアルファベットを指定した変換モードで変換して返す。

変換モード 意味
MB_CASE_UPPER 大文字に変換
MB_CASE_LOWER 小文字に変換
MB_CASE_TITLE 先頭だけ大文字に変換

string mb_strtoupper(<文字列>)
string mb_strtolower(<文字列>)
文字列中のアルファベットを大文字/小文字に変換して返す。

サンプルーコード
$str = 'orange LEMON grape Banana';
echo mb_convert_case($str, MB_CASE_UPPER);
echo "\n";
echo mb_strtolower($str);
echo "\n";
echo mb_convert_case('apple', MB_CASE_TITLE);
サンプルコードの出力
ORANGE LEMON GRAPE BANANA
orange lemon grape banana
Apple

string mb_conver_kana(<文字列>[, <オプション>])
文字列中の文字をオプションにしたがって変換して返す。オプションが省略された場合のデフォルトは KV。
この関数は日本語のみで使用可能。

オプション 対象 変換前 変換後
r 英字 全角 半角
R 英字 半角 全角
n 数字 全角 半角
N 数字 半角 全角
a 英数字 全角 半角
A 英数字 半角 全角
s スペース 全角 半角
S スペース 半角 全角
k カタカナ 全角 半角
K カタカナ 半角 全角
h ひらがな 全角 半角(カタカナ)
H カタカナ 半角 全角(ひらがな)
c カタカナ 全角 全角(ひらがな)
C ひらがな 全角 全角(カタカナ)
V カタカナ/ひらがな 濁点、半濁点つき文字 1文字に

サンプルーコード
echo mb_convert_kana("ガグゴぱぺぽ");
echo "\n";
echo mb_convert_kana("カタカナひらがな", 'cC');
サンプルコードの出力
ガグゴぱぺぽ
かたかなヒラガナ

PHPメモ015:文字列関数 その2

string implode(<結合文字列>, <配列>)
配列の各要素を結合文字列で連結した文字列を返す。

array explode(<区切り文字列>, <文字列>[, <要素数>])
文字列を区切り文字列で区切った各部分を要素とする配列を返す。要素数が指定された場合、配列の長さはその指定された値となり、最後の要素は文字列の残りの部分となる。

サンプルーコード
$a = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
$b = implode(",", $a);
echo $b;
echo "\n";

$str = 'Mercury/+/Venus/+/Earth/+/Mars';
$c = explode('/+/', $str);
dispArray($c);

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
Sun,Mon,Tue,Wed,Thu,Fri,Sat
[0]=>Mercury,[1]=>Venus,[2]=>Earth,[3]=>Mars,

mixed str_replace(<置換前>, <置換後>, <文字列>[, <置換された個数>])
文字列中の<置換前>をすべて<置換後>に置換して返す。
<置換前>と<置換後>は配列で複数指定することもできる。

サンプルーコード
echo str_replace('t', 'T', 'To be or not to be; that is the question', $count);
echo "\n";
echo $count;
echo "\n";

$str     = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order   = array("\r\n", "\n", "\r");
$replace = '<br />';
// まず最初に \r\n を置換するので、二重に変換されることはない
$newstr = str_replace($order, $replace, $str);
echo $newstr;
サンプルコードの出力
To be or noT To be; ThaT is The quesTion
6
Line 1<br />Line 2<br />Line 3<br />Line 4<br />

string ltrim(<文字列>[, <文字リスト>])
string rtrim(<文字列>[, <文字リスト>])
string trim(<文字列>[, <文字リスト>])
文字列の先頭/末尾/先頭と末尾両方の空白文字を削除する。文字リストがある場合は空白文字ではなく指定された文字を削除する。

サンプルーコード
$str1 = '   abc     ';
echo "|${str1}|" . ' => |' . trim($str1) . '|';
echo "\n";
$str2 = '...Hello!!';
echo "|${str2}|" . ' => |' . trim($str2, '.!') . '|';
サンプルコードの出力
|   abc     | => |abc|
|...Hello!!| => |Hello|

string number_format(<数値>[, <小数点以下の桁数>])
string number_format(<数値>, <小数点以下の桁数>, <小数部と整数部のセパレータ>, <整数3桁枚のセパレータ>)
数値の整数部に3桁ごとにセパレータを入れてた値を返す。小数点以下の桁数の指定がない場合は小数部は表示しない。

サンプルーコード
$val = 1234.567;
echo number_format(1234.567);
echo "\n";
echo number_format(1234.567, 2);
echo "\n";
echo number_format(1234.567, 2, ':', '-');
サンプルコードの出力
1,235
1,234.57
1-234:57

March 08, 2012

ブッキス連戦 #FF11

昨晩、ブッキス連戦のシャウトがあったので火行の原石希望で参加。5人PTでジョブは黒/吟と指示された。
黒/吟はインスニがないし身を守る術がマナウォールしかなくて正直怖いんだけど、仕方ない。
ライバルがいて Lord Varney の取り合いになった。トリガ集めに時間がかかってしまったが何とか5戦することができた。
1回だけ黄弱点が突けなかった時があって(歌だったみたいだが印光のスレノディがレジられたorz)、入手した五行アイテムの火原4個とフリーロットの火宝1個。
火原は5個であと1個足りないし、火宝は6個になったがEQサヨ+1持ってない。なんとも歯がゆい結果になってしまった^^;

PHPメモ014:文字列関数 その1

関数名に "mb_" というプレフィックスが付いている関数はマルチバイト文字を含む文字列を処理するための関数。
例えば mb_strstr() は strstr() のマルチバイト文字版である。

strint strstr(<文字列>, <パターン>)
strint mb_strstr(<文字列>, <パターン>)
文字列の中で最初にパターンが現れる場所から最後までを返す。見つからない場合はFALSEを返す。

int srtpos(<文字列>, <探すパターン>[, <オフセット>])
int mb_srtpos(<文字列>, <探すパターン>[, <オフセット>])
文字列のオフセットの位置から探し初めて最初にパターンが現れた位置を返す(0オリジン)。オフセットが省略された場合は文字列の先頭から探す(オフセット=0)。

int strrpos(<文字列>, <探すパターン>[, <オフセット>])
int mb_strrpos(<文字列>, <探すパターン>[, <オフセット>])
文字列の先頭からオフセットの位置までの間で最後にパターンが現れた位置を返す(0オリジン)。オフセットが省略された場合は文字列の末尾まで探す。

サンプルーコード
echo mb_strstr('ものすごくうるさくてありえないほど近い', 'ありえない');
echo "\n";
echo strpos('user@hogehogefoo.com', '@');
echo "\n";

// strpos()の戻り値が0の場合もあるので、判定は === や !== で行う。
if (FALSE !== strpos('http://www.hogehogefoo.com/', 'http://')) {
	echo 'URLはhttpである。';
} else {
	echo 'URLはhttpではない。';
}
echo "\n";

echo mb_strrpos('人民の人民による人民のための政治', '人民');
サンプルコードの出力
ありえないほど近い
4
URLはhttpである。
8

int strlen(<文字列>)
int mb_strlen(<文字列>)
文字列の長さを返す。

サンプルーコード
$a = 'the_silence_of_lambs';
$b = 'Ronove(ロノウェ)はソロモン72柱の序列27番';
echo $a . ':' . strlen($a);
echo "\n";
echo $b . ':' . mb_strlen($b);
echo "\n";
サンプルコードの出力
the_silence_of_lambs:20
Ronove(ロノウェ)はソロモン72柱の序列27番:26

strint substr(<文字列>, <開始位置>[, <長さ>]);
strint mb_substr(<文字列>, <開始位置>[, <長さ>]);
文字列の開始位置から長さ分の部分文字列を返す。長さが省略された場合は開始位置から末尾までの部分文字列を返す。

サンプルーコード
echo substr('entrepreneur', 3, 4);
サンプルコードの出力
repr

mixed sscanf(<文字列>, <フォーマット>[, <変数1>  ...]);
文字列をフォーマットに基づいてパースする。フォーマット以降のオプションの引数は参照渡し。
オプションの引数がない場合、戻り値は割り当てられた値の配列。オプションの引数がある場合、割り当てられた値がオプション引数に格納され、戻り値は割り当てられた値の数。

サンプルーコード
$a = ' 9 :Masashi Nakayama :1967.09.23';
$b = sscanf($a, '%2d :%s %s :%04d.%02d.%02d');
dispArray($b);
sscanf($a, '%2d :%s %s :%04d.%02d.%02d', $no, $fname, $lname, $year, $month, $day);
echo "${no}, ${fname}, ${lname}, ${year}, ${month}, ${day}";
echo "\n\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
[0]=>9,[1]=>Masashi,[2]=>Nakayama,[3]=>1967,[4]=>9,[5]=>23,
9, Masashi, Nakayama, 1967, 9, 23

第70期順位戦C級2組最終戦 #shogi

第70期名人戦・順位戦 C級2組

一昨日、C2の10回戦があったのをすっかり忘れていた^^;
昨日の夕方に気づいて結果を見たら瀬川さん勝ってる。4勝6敗で自力降級点回避ヽ(´Д`)ノ
正直1勝6敗になった時点で降級点は避けられないと思ったが、最後に3連勝。良かったー。
現在公式戦9連勝中。NHK杯予選で広瀬七段に勝っとる。絶好調。

負ければ史上最年少降級点だった阿部コールも回避。順位が最下位だけに瀬川さんより厳しい状況だったが、勝って瀬川さんと同じく4勝6敗。
彼は
・小学生の時にいじめられて不登校。
・青森から高速バスで奨励会に通った。
という、思わず応援したくなるようなエピソードの持ち主だ。
早指し将棋は相当強くてA級棋士にも勝っているらしい。
才能ある子だから順位戦も慣れれば昇級もあるだろう。

昇級は阿部健、中村、船江が10連勝で昇級決定。すごい(;゚∀゚)
これは史上初なのかな?
9勝1敗でダメだった菅井五段はがっくりだろうなー^^;

降級点は3勝7敗で17位の伊奈六段以下。中座さん1個目。
そして猛やんは2個目の降級点。三段リーグを1期抜けしたほどの人。まだ老け込むような年齢ではないのに(瀬川さんより2つ若い)。
降級点3個で陥落は島本五段。まだ31歳。三段リーグの通算勝率が.380でプロ入りだから、まあなんというか。。。
#ちなみに瀬川さんの三段リーグの通算勝率はここの情報によると5割ぴったり。
あとフリクラ宣言する人が何人出るだろか。室岡七段はするだろう。


来期、瀬川さんは31位か。今期より少し落ちる。
今の好調ができるだけ長く続き、降級点争いに絡みませんように(-人-)

March 06, 2012

PHPメモ013:配列関数 その3

array array_intersect(<配列1>, <配列2> [,<配列3> ...])
与えられた配列すべてに共通する値の要素からなる配列を返す。キーは配列1のものが使われる。

array array_diff(<配列1>, <配列2> [,<配列3> ...])
配列1から他の配列の要素の値と同じ値の要素を削除した配列を返す。

サンプルーコード
$arr1 = array('青森', '群馬', '長野', '滋賀', '岡山');
$arr2 = array('宮城', '群馬', '滋賀', '愛媛');
$result = array_intersect($arr1, $arr2);
dispArray($result);
$result = array_diff($arr1, $arr2);
dispArray($result);
echo "\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
[1]=>群馬,[3]=>滋賀,
[0]=>青森,[2]=>長野,[4]=>岡山,

array array_chunk(<配列>, <要素数>)
配列を指定した要素数の配列に分割する。

サンプルコード
$a = array('Superior', 'Michigan', 'Huron', 'Erie', 'Ontario');
$b = array_chunk($a, 2);
print_r($b);
サンプルコードの出力
Array
(
    [0] => Array
        (
            [0] => Superior
            [1] => Michigan
        )

    [1] => Array
        (
            [0] => Huron
            [1] => Erie
        )

    [2] => Array
        (
            [0] => Ontario
        )

)

array array_merge(<配列1>, <配列2> [,<配列3> ...])
与えられた配列をマージしたものを返す。キーが重複した場合は後の引数の配列の要素が残る。

サンプルコード
$a = array('toyota' => 'Prius', 'nissan' => 'March', 'honda' => 'Insight');
$b = array('honda' => 'Fit', 'suzuki' => 'SWIFT', 'mazda' => 'CX-5');
$result = array_merge($a, $b);
dispArray($result);
echo "\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
[toyota]=>Prius,[nissan]=>March,[honda]=>Fit,[suzuki]=>SWIFT,[mazda]=>CX-5,

array array_slice(<配列>, <オフセット>[, <要素数>])
オフセット(0オリジン)の位置から要素数で指定した数の要素を配列から切り出して返す。要素数を省略した場合は指定位置から後ろすべてを切り出す。

サンプルコード
$a = array('val1', 'val2', 'val3', 'val4', 'val5');
$b = array_slice($a, 2);
dispArray($b);
$b = array_slice($a, 2, 2);
dispArray($b);
echo "\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}
サンプルコードの出力
[0]=>val3,[1]=>val4,[2]=>val5,
[0]=>val3,[1]=>val4,

void list(<変数1>[, <変数2> ...])
配列の要素を変数に代入する。
list()は関数ではなく言語の構成要素である。

サンプルコード
$a = array('val1', 'val2', 'val3', 'val4', 'val5');
list($var1, $var2, $var3) = $a;
echo $var1 . "\n";
echo $var2 . "\n";
echo $var3 . "\n";
サンプルコードの出力
val1
val2
val3

サカダイ開幕スタメン予想 #albirex #jleague

今週のサカダイに開幕戦のスタメン予想が載っていた。
アルビのスタメン予想は

FW:平井,BL
サイドハーフ:小谷野,貴章
ボランチ:本間,菊地
DF:キムジンス,大井,大輔,村上
GK:黒河

記事によると、3トップもやったけど2トップの方がより機能している感じなので2トップじゃないかとのこと。
ミシェウは控えか。選手名鑑には「不動の司令塔」って書いてたんだけど^^;
それに亜土夢もミシェウもいないとなると、FKのキッカーは誰?
攻撃陣はいい補強が出来て期待が持てる。
守備陣はキムジンスと大井がどれくらいやってくれるのか。まあどっちかがイマイチだったとしても石川もいるし、そう心配はいらないか。

磐田は松浦がやはり左で先発との予想。

他、気になったところというと、大宮はボランチの外人を取ったので上田コータは控えに。起用法への不満もあって(それだけじゃないだろうけど)磐田を出て、昨シーズンは1年間レギュラーだったけど、1シーズンでまた控えに戻っちゃったなあ^^;

March 05, 2012

PHPメモ012:配列関数 その2

int count(<配列>)
int sizeof(<配列>)
配列の要素数を返す。

array array_count_values(<配列>)
配列の値をキーとし値の出現回数を値とする配列を返す。

サンプルコード
$a = array('A', 'B', 'B', 'B', 'A');
$cntArray = array_count_values($a);
print_r($cntArray);
サンプルコードの出力
Array
(
    [A] => 2
    [B] => 3
)

bool in_array(<値>, <配列>)
指定した値が配列の値にあるかを調べる。

bool array_key_exists(<キー>, <配列>)
指定したキーが配列のキーにあるかを調べる。

mixed array_search(<値>, <配列>)
配列に指定した値があればそのキーを返す。なければFALSEを返す。

array array_values(<配列>)
array array_keys(<配列>)
配列の値/キーを取り出して新たにキーを付けた配列を返す。

array array_combine(<キーの配列>, <値の配列>)
与えられた配列をそれぞれキー、値とした配列を生成して返す。

サンプルーコード
$a = array('Jan'=>31, 'Feb'=>28, 'Mar'=>31);
$vals = array_values($a);
$keys = array_keys($a);
dispArray($vals);
dispArray($keys);
$combined = array_combine($keys, $vals);
dispArray($combined);
echo "\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}

サンプルコードの出力
[0]=>31,[1]=>28,[2]=>31,
[0]=>Jan,[1]=>Feb,[2]=>Mar,
[Jan]=>31,[Feb]=>28,[Mar]=>31,

PHPメモ011:配列関数 その1

bool sort(<配列>)
bool rsort(<配列>)
配列を昇順/降順にソートする。キーは破棄されて0から振りなおされる。

サンプルーコード
$a = array('spades'=>850, 'hearts'=>847, 'diamonds'=>853, 'clubs'=>848);
sort($a);
print_r($a);
サンプルコードの出力
Array
(
    [0] => 847
    [1] => 848
    [2] => 850
    [3] => 853
)

bool asort(<配列>)
bool arsort(<配列>)
配列をキーと値の関係を保持したまま昇順/降順にソートする。

サンプルコード
$a = array('spades'=>850, 'hearts'=>847, 'diamonds'=>853, 'clubs'=>848);
asort($a);
print_r($a);
サンプルコードの出力
Array
(
    [hearts] => 847
    [clubs] => 848
    [spades] => 850
    [diamonds] => 853
)

bool shuffle(<配列>)
配列の要素をシャッフルする。

int array_push(<配列>, <値1> [,<値2>...])
配列の末尾に要素を追加。
戻り値は処理後の要素数。

mixed array_pop(<配列>)
配列の末尾の要素を1つ取り出して返す。
配列は末尾の要素を失い、長さが-1される。

int array_unshift(<配列>, <値1> [,<値2>...])
配列の先頭に要素を挿入する。
戻り値は挿入後の配列の要素数。

mixed array_shift(<配列>)
配列の先頭から要素を1つ取り出して返す。
配列は先頭の要素を失い、長さが-1される。

array array_splice(<配列>, <オフセット> [,<要素数> [, <置換配列>]])
配列のオフセット(0オリジン)の位置から要素数で指定した数の要素を削除し、その部分を置換配列で置換する。オフセットがマイナスの場合は後ろからの数えた位置(配列の長さ+オフセット)。要素数が省略された場合は指定位置から後ろをすべて句削除する。
戻り値は削除された要素の配列。

サンプルーコード
$a = array('val1', 'val2', 'val3', 'val4', 'val5');
$b = array_splice($a, 3);
dispArray($a);
dispArray($b);
echo "\n";

$a = array('val1', 'val2', 'val3', 'val4', 'val5');
$b = array_splice($a, 2, 2);
dispArray($a);
dispArray($b);
echo "\n";

$a = array('val1', 'val2', 'val3', 'val4', 'val5');
$c = array('A', 'B', 'C');
$b = array_splice($a, 2, 2, $c);
dispArray($a);
dispArray($b);
echo "\n";

$a = array('val1', 'val2', 'val3', 'val4', 'val5');
$b = array_splice($a, -3, 2);
dispArray($a);
dispArray($b);
echo "\n";

$a = array('A', 'B', 'B', 'A', 'B');
$cntArray = array_count_values($a);
print_r($cntArray);
echo "\n";

function dispArray($arr) {
	foreach ($arr as $key => $val) {
		echo '[' . $key . ']=>' . $val . ',';
	}
	echo "\n";
}

サンプルコードの出力
[0]=>val1,[1]=>val2,[2]=>val3,
[0]=>val4,[1]=>val5,

[0]=>val1,[1]=>val2,[2]=>val5,
[0]=>val3,[1]=>val4,

[0]=>val1,[1]=>val2,[2]=>A,[3]=>B,[4]=>C,[5]=>val5,
[0]=>val3,[1]=>val4,

[0]=>val1,[1]=>val2,[2]=>val5,
[0]=>val3,[1]=>val4,

2012年4月開始アニメ、豊作だ #anime

2012年春季開始の新作アニメ一覧 - GIGAZINE

うー、見たいの多すぎる^^;

まず絶対見るのは
「ヨルムンガンド」、「宇宙兄弟」、「Fate/Zero」の第2期。
とりあえず第1話を見て判断しようと思うのは
「聖闘士星矢Ω」、「エウレカセブンAO」、「ZETMAN」、「謎の彼女X」、「黄昏乙女×アムネジア」、「つり球」。
ほかにも興味ある作品はあるのだが(「めだかボックス」とか)、多すぎる。無理w

March 04, 2012

デュナミス-バストゥーククリア #FF11

先日のジュノに続いてバスもクリア。
これで三国+ジュノのデュナミスをクリアしてボスディンに行けるようになった。
しかし、デュナミスボスディンのボスは今までのとは違って相当強いらしい。
三国+ジュノは3人(うち1人は複数アカウント)でやって余裕だったが、ボスディンではこの人数では厳しいようだ。
LSの力をそう結集して(と言っても4人だが^^;)もらうしかないか。

ボスをやった後は時間いっぱい戦闘。錬金ギルドの手前の横道でやった。
先日のジュノでは魔法ジョブの敵がいないところでやったが、今回はいろんなジョブの敵がいる場所。
魔法ジョブは弱点突きにくいなー。今回でデュナミスの弱点システムが完全にわかった。
わかったけど、敵のジョブを素早く判断しないといけない。記憶力が悪いので名前で瞬時に判断は自分には無理。
わかったけど難しいことには変わりがない^^;

「28日後...」、「28週後...」

先々週に「28日後」を、先週「28週後」を見た。
以下、ネタバレありの感想。


「28日後...」はゾンビ物としては、まあそこそこではないか。
設定上はゾンビじゃないけど、全力で走って追いかけてくるゾンビみたいなものだw
話はバイオハザード。研究施設でウイルスが漏れて感染爆発、洋館でゾンビ(みたいなもの)から逃げるって、そのままや。

RAGEウイルスの設定に関しては少し違和感がある。
例えば、
・感染から発症まで1分とかからない。早すぎる。
・感染者は感染してない人を追いかけてくる。ゾンビと違って人間を食う訳ではないし、動く物に何でも襲いかかるわけではないのでどういう理屈なのかわからない。
まあ、変な感じはするが突っ込むのは野暮なんだろうなあ。

おまけで劇場公開版のエンディングが入っている。
エンディング前のシーンで腹部を撃たれた主人公が
・DVD版のエンディングでは元気に治っていて救出される。
・劇場公開版のエンディングでは死んじゃう。
という違いがある。
劇場公開版のエンディングは無理があるような気がする。一応、同行者の女は薬剤師って設定だけど、それでも腹を軍用拳銃で撃たれた人を手術して助けるって無茶だ。
劇場公開版のエンディングにはあまりに救いがないので、希望のあるエンディングに変更したんだろうけど無理過ぎるわ。

吹き替えで見たが、声優のキャスティングが主人公が三木眞一郎、同行する女が坂本真綾。エスカフローネ好きとしてはそこは楽しめた。


「28週後...」は監督が変わって、ダニー・ボイルは制作総指揮に。
こちらはゾンビもだけではなく人間からも追いかけられるが、それが1作目以上のおもしろさになっているかというとなってない。ストーリーには無理が目立ち、さらに腹が立つ登場人物がいる。結論としては楽しめなかった。

ストーリー上で一番の疑問点が「隔離されている無症候性キャリアの妻(下記の子供たちの母親)のところに夫が易々と入り込めた」点。
夫は確かに民間人の居住区の管理者で一般人よりは高いセキュリティレベルのIDカードを持っているのかもしれないが、それでも軍が厳重に管理しているはずの施設に自分のカードキーで入れるのはおかしいだろう。というか、軍隊も警備甘すぎるw

そして腹が立つのが最後まで生き残る姉と弟。特に弟。
結局、何もかもこいつらのせいだよな。ウイルスが広まったの。勝手にセーフゾーンから抜け出したり、感染している父親を避難所に招き入れたり。
最終的に姉と母親と同じように無症候性キャリアとなった弟がブリテン島を脱出したためにヨーロッパにもウイルスが広まると。

まあヒットした作品の続編が1作目より面白いことは滅多にないということか。


28日後… [Blu-ray]28日後… [Blu-ray]

20世紀フォックス・ホーム・エンターテイメント・ジャパン 2010-08-04
売り上げランキング : 26139

Amazonで詳しく見る
by G-Tools

March 02, 2012

W杯予選2連敗、ウズベキスタン戦

日本 対 ウズベキスタン - サッカー日本代表戦スコア速報 : nikkansports.com : nikkansports.com

得る物が何もない試合だったなー。宮市は出番なかったし。
メディアは「海外組が多いからこの時期でもコンディションは問題ない」と言っていたが、ザックは「(帰国してすぐの試合だから)走れないことはわかっていた」と言っていた。マスコミは適当なことばかり言ってるな。
対してウズベクはコンディションばっちり、運動量で圧倒された。

ボランチ、前の方の選手はだいたい良くなかった。
特にマイクと藤本が目立って悪かったように思った。
マイクは「足下がうまい選手」って話だったけどボール失いまくり。1トップの適性はないんじゃないか。

結局、ザックは本田がいないときの策を何も持ってないことを露呈した。
これでいいのか。ザックでいいのか。

March 01, 2012

デュナミス-ジュノクリア #FF11

LSメンバーに手伝ってもらって、4キャラ3人でデュナミス-ジュノをクリアした。
構成はシ×2、獣、黒。おいらはシで獣と黒は2アカ。

まず延長を取り。よくわからないので2人に付いていって戦っていたが、
「そいつ危ないよ」
と言われて、
「へ?」
と思っていたら、

Vanguard Ambusher のイーグルアイ
-> 1102のダメージ
Vanguard Ambusher に倒された…。

一撃で逝ってしまったorz
その後、戦いながら弱点について教えてもらって、少しわかった。
戦士等重装の敵はWS、狩人などの軽装の敵はアビリティで弱点を付ける。狩人と忍者はイーグルアイや微塵は弱点を突くまでダメージを与えないようにするそうだ。

延長を取り終わったらNMを倒してボス戦。
ボスは楽勝だった。

あとは時間いっぱい戦闘。
さっき死んだ2階の大公の部屋の前はAmbusherとHitmanばかりで弱点突きやすい。たまに3,4匹リンクすることがあってちょっと怖いけど。
戦闘後、旧貨幣を分配。あとレリックホルンがカバンにあった。
作る?いや無理だろう。。。詩人そんなに使わないし。
貨幣は売ってしまおう。

« February 2012 | Main | April 2012 »

May 2017
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      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof