My Photo

« August 2014 | Main | October 2014 »

September 28, 2014

選択リストを拡張するSelect2

Select2はjQuery UIで選択リスト拡張するライブラリ。選択リストで複数選択可能な場合、便利そうだなと。
複数選択可能な場合のサンプルコード test_select2.html を以下に示す。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Select2のテスト</title>
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<link type="text/css" rel="stylesheet" href="/css/jquery-ui-1.10.4.min.css" />
<link type="text/css" rel="stylesheet" href="/css/select2.css" />
<script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui-1.10.4.min.js"></script>
<script type="text/javascript" src="/js/select2.min.js"></script>
<script type="text/javascript">
$(function() {
  $("#select2Test").select2();
});
</script>
<style type="text/css">
.result { width: 300px; min-height: 100px; border: solid 2px; }
</style>
</head>
<body>
<div>
<form action="./select2_test_2.php" name="form" id="form" method="post">
<p>
	<select multiple="multiple" name="select2Test[]" id="select2Test" style="width: 300px;">
		<option value="">--</option>
		<optgroup label="自動車">
			<option value="7201">日産自動車</option>
			<option value="7203">トヨタ自動車</option>
			<option value="7267">本田技研工業</option>
		</optgroup>
		<optgroup label="空運">
			<option value="9202">ANAホールディングス</option>
		</optgroup>
		<optgroup label="通信">
			<option value="9432">NTT</option>
			<option value="9433">KDDI</option>
			<option value="9984">ソフトバンク</option>
		</optgroup>
	</select>
</p>
<input type="submit" value="submit" />
</form>
</div>
</body>
</html>

select要素のname属性に "[]" が付いているのに注意。複数選択可能なので配列形式にしないと選択された項目をすべて取得することができない。

ファイルは以下のように配置した。Select2 の画像ファイルを /css/images に置いたので、select2.css の画像を指定している部分のパスを書き換えた。
ダウンロードした select2 のzipファイルには画像ファイルは下記にある以外に selec2x2.png というのも含まれているが、なくても特にエラーにならなかった。

[ドキュメントルート]
├[css]
│├[images]
││├jQuery UI の画像ファイル
││├select2.png
││└select2-spinner.gif
│├jquery-ui-1.10.4.min.css
│└select2.css
└[js]
  ├jquery-1.9.1.min.js
  ├jquery-ui-1.10.4.min.js
  └select2.min.js

2つの項目を選択すると下のようになる。選択を解除するには項目名のラベルにある×印をクリックする。

Select2_sample_1

ここで、入力フィールドをクリックすると、選択リストは下のようになる。既に選ばれている項目は選択肢から取り除かれている。

Select2_sample_2

また、入力フィールドに文字を入力すると、その文字によって下のよう選択肢が絞り込まれる。

Select2_sample_3

現在選択されている項目をjQueryで以下のように取得できる。val属性の値を取得するということか。

$("#select2Test").select2("val"));

選択するコードは以下になる。1個だけ選択するなら第2引数を配列にする必要はない。

$("#select2Test").select2("val", ['9432', '9433', '9984']);

選択リストの拡張ライブラリには他に Chosen というのがある。自分は使ってないが Chosen を使ったページを触ってみたら、選択肢が日本語だと選択肢の絞込みはできないようだった。

参考ページ:
Select2 3.5.1
[JS]セレクトボックスの使い勝手をパワーアップするスクリプト -Select2 | コリス
セレクトボックスを100倍使い易くする!! | CoDE4U

September 21, 2014

ワールド・ウォーZ

ワールド・ウォーZ  [DVD]ワールド・ウォーZ [DVD]

KADOKAWA / 角川書店 2014-10-24
売り上げランキング : 8958

Amazonで詳しく見る
by G-Tools
WORLD WAR Z〈上〉 (文春文庫)WORLD WAR Z〈上〉 (文春文庫)
マックス ブルックス Max Brooks

文藝春秋 2013-03-08
売り上げランキング : 138600

Amazonで詳しく見る
by G-Tools

TSUTAYAで旧作・準新作100円だったので借りて見た。
5段階評価で3.5か4かなあ。レンタルなら見て損したとは思わないかな。すごい面白かったというほどでもないが。
原作の小説とは「ゾンビで世界が滅亡の危機に陥る」という大枠以外は共通点は少ないらしい。
以下、ネタバレ含む感想。

序盤、ものすごい勢いでゾンビが増えていく。ゾンビにかまれて感染すると1分経たずにゾンビになる。ゾンビが走って追いかけてくる。主人公一行はゾンビから逃れてアパートに逃げ込む。このあたりすごい既視感。「28日後」に似ている。
「世界の希望だ」なんて言われていたウイルス学者が、最初に行った在韓米軍基地でいきなりビビッて逃げ出してコケて、そのはずみで自分を銃で撃っちゃって死んだのは笑った^^;
映像的に面白いと思ったのが「ゾンビの濁流」。炎や水、煙なんかがCGで描かれるのは普通だが、ゾンビの群れが濁流のように押し寄せてくるところ、あれはたぶんCGだと思うのだが新鮮だった。
ラストのゾンビがあふれかえるWHOの研究所、すごいバイオハザードっぽい。ゲームの。
なんだかこれと言って特筆するところがないなあ。あえて言えばゾンビ映画にブラピが出てるってところか。

日本語吹き替えで見たが、声優が豪華で「あー、この声は○○だ。」って考えながら見るのも楽しい。主人公は堀内賢雄。他に玄田哲章、大塚芳忠、浪川大輔、若本規夫、磯部勉、三木慎一郎。主人公と最後まで一緒に行動するイスラエルの女性兵士を坂本真綾。
声優じゃないCVは主人公の奥さん役を篠原涼子がやっている。まあ悪くなかった。
#「プロメテウス」の剛力彩芽と比較したら100倍マシ。

ゾンビ発生の原因は結局わからなかったが、戦うにあたってとても重要なZの生態(死んでるから死態?)が判明し、ラストは「戦いはまだまだ続く」のような言葉で締められる。この映画自体は傑作というわけではないが、作品の世界観はこの一作で終わるのはもったいない気がする。いくらでも話が作れそう。孤立している生存者の話とか、Zの侵攻を食い止めた後の反攻作戦、勝利後の復興の話とか。

September 17, 2014

PHPメモ047:XML処理 その3 XPath

関連記事:
PHPメモ045:XML処理 その1 XMLをパースする
PHPメモ046:XML処理 その2 エラー処理

XPathでノードを参照する

名前空間がないXMLのノードをXPathで参照するコードを以下に示す。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a>
 <b>
  <c>xxx</c>
  <c>yyy</c>
 </b>
 <d>
  <c>zzz</c>
 </d>
</a>
XML;

$xml = simplexml_load_string($string);

$result = $xml->xpath('/a/b');
echo "/a/b\n";
print_r($result);

$result = $xml->xpath('/a/b/c');
$i = 0;
while(list( , $node) = each($result)) {
    echo "/a/b/c [{$i}]\n";
    print_r($node);
    $i++;
}

出力は以下のようになる。

/a/b
Array
(
    [0] => SimpleXMLElement Object
        (
            [c] => Array
                (
                    [0] => xxx
                    [1] => yyy
                )

        )

)
/a/b/c [0]
SimpleXMLElement Object
(
    [0] => xxx
)
/a/b/c [1]
SimpleXMLElement Object
(
    [0] => yyy
)

XMLにデフォルトの名前空間がある場合

XMLにデフォルトの名前空間がある場合、上記と同様のコード

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="http://into.cocolog-nifty.com/">
 <b>
  <c>xxx</c>
  <c>yyy</c>
 </b>
 <d>
  <c>zzz</c>
 </d>
</a>
XML;

// 以下略

を実行すると、出力は下記のようになりノードを参照することが出来ない。

/a/b
Array
(
)

名前空間がある場合は xpath() メソッドの前に registerXPathNamespace() メソッドで名前空間とプレフィックスを指定し、XPathにプレフィックスを付けると参照できるようになる。
コードを以下に示す。

// XMLは上のコードと同じ。

$xml = simplexml_load_string($string);

// プレフィックス、名前空間を指定
$xml->registerXPathNamespace('into', 'http://into.cocolog-nifty.com/');

$result = $xml->xpath('/into:a/into:b');
echo "/into:a/into:b\n";
print_r($result);

$result = $xml->xpath('/into:a/into:b/into:c');
$i = 0;
while(list( , $node) = each($result)) {
    echo "/into:a/into:b/into:c [{$i}]\n";
    print_r($node);
    $i++;
}

出力は以下。今度はノードを参照できている。

/into:a/into:b
Array
(
    [0] => SimpleXMLElement Object
        (
            [c] => Array
                (
                    [0] => xxx
                    [1] => yyy
                )

        )

)
/into:a/into:b/into:c [0]
SimpleXMLElement Object
(
    [0] => xxx
)
/into:a/into:b/into:c [1]
SimpleXMLElement Object
(
    [0] => yyy
)

registerXPathNamespace() メソッドはXMLに元々指定されていた名前空間のプレフィックスを変えたいときにも使用できる。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<hoge:a xmlns:hoge="http://into.cocolog-nifty.com/">
 <hoge:b>
  <hoge:c>xxx</hoge:c>
  <hoge:c>yyy</hoge:c>
 </hoge:b>
 <hoge:d>
  <hoge:c>zzz</hoge:c>
 </hoge:d>
</hoge:a>
XML;

$xml = simplexml_load_string($string);

// プレフィックスをhogeからintoに変更
$xml->registerXPathNamespace('into', 'http://into.cocolog-nifty.com/');

// 以下略

参考ページ:
PHP: SimpleXMLElement::registerXPathNamespace - Manual
PHP: SimpleXMLElement::xpath - Manual
SimpleXMLで名前空間付きタグの一覧を取得する - 肉とビールとパンケーキ by @sotarok

XMLの名前空間について参考ページ:
XML名前空間の簡単な説明

2014秋アニメは大豊作かも

必ず見ようと思っているのは
ガンダム Gのレコンギスタ
Fate/stay night
ログ・ホライズン(第2期)
蟲師 続章(後半)
PSYCHO-PASS2
繰繰れ!コックリさん
の6作品。

Gレコは見ないわけにはいかない。ただ、富野作品なら何でも好きかというとそうでもない。Vガン、ブレンパワード、ターンAはイマイチだった。好きなのはダンバイン、Z、キングゲイナー。果たして今作はどうなるだろうか。
Fateからサイコパス2までの4作品は再アニメ化、第2期、分割2クールの後半などで、「前作を見たから今回も見よう」ということで。しかしFateはなんで凛ルートなんだ。セイバールートが見たかった;;
こっくりさんは毎期、気楽に見れそうな作品を1つは入れているので。今期だと「ヤマノススメ」がそれに当たる。秋アニメの中でこの作品を選んだのは広橋涼と小野Dが出ているから。声優で選んだ。中田譲治もいい。櫻井孝宏は嫌いだけど。

他に気になる作品は以下。
7つの大罪
ワールドトリガー
甘城ブリリアントパーク
クロスアンジュ 天使と竜の輪舞
SHIROBAKO
大図書館の羊飼い

「7つの大罪」と「ワールドトリガー」は原作マンガが未読だが、面白そうだなと思っていた。
「甘城ブリリアントパーク」は原作:賀東招二、アニメーション制作:京都アニなので面白い作品になる確率は高いと思う。それにOP歌が「AKINO with BLESS4」だ。一万円と二千円やるから愛してね~♪(違う)
「クロスアンジュ」はサンライズとキングレコードが組んだ作品。雰囲気としてはキングレコード作品っぽい。声優が豪華。
あとの2つはあんまり期待していないが、とりあえず最初は見てみようと思う。
「SHIROBAKO」はP.A.WORKSの作品。PAというと「TRUE TEARS」と「花咲くいろは」は良かったんだが、それ以降はがっかりなのが続いている。
「大図書館の羊飼い」は原作ゲームは未プレイだが、オーガストのゲームはいくつかプレイしてどれも面白かったので。でも「夜明け前より瑠璃色な」のアニメは悲惨な出来だったなあ。

今期は7作品を録画しているが、「アルドノアゼロ」は全く見れていない。
10月以降も続くのは「ヤマノススメ」。あと「HUNTER×HUNTER」は選挙編が終わったが、どこまでやるんだろうか?「暗黒大陸編」は原作が全く中途半端なところだし。
仮にHUNTERが終わるとしても、「継続1作+新規(6+α)作」。大河ドラマは見るのをやめたし「総合診療医Dr.G」は9月で終わるが、それでも録画したアニメをその週のうちに全部見るのは大変そう。「+α」の部分が6作になったら、まあ見きれないだろう^^;

September 16, 2014

秀丸エディタマクロの検索・置換系命令のinselectオプション

マクロを作っていて replaceall 命令が思ったように動いてくれない。調べたら自分がinselectオプションについて間違って覚えていたことがわかった。
秀丸マクロの検索・置換系命令のinselectオプションを
「選択範囲のみ検索/置換する」
だと思っていたが、実際には 「選択範囲を含む行のみで検索/置換する」
という動作をする。
つまり、検索・置換命令における「選択した範囲内」というのは行単位の選択であり、行の途中から途中の選択には対応していない。選択範囲(表示色が反転している範囲)の外でも、選択範囲と同じ行ならば検索・置換の対象となる。
なぜわかったかというと、マクロではなく検索ダイアログによる検索で「選択した範囲内のみ」をチェックし、行の途中から途中までが選択された状態で検索を実行すると

「選択した範囲のみ」の範囲は行単位(改行までの範囲)となります。

という内容のメッセージボックスが出たから。あの、こういうのは実行時の警告じゃなくてマクロのリファレンス(ヘルプ)に書いておいてくださいorz

September 15, 2014

PHPメモ046:XML処理 その2 エラー処理

関連記事:XML処理 その1 XMLをパースする

URIではない名前空間

XMLに名前空間があってその名前空間がURIの形式になっていない場合、パースするとワーニングが出る。
例として下記のコードを実行する。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="abc">
 <b>xxx</b>
</a>
XML;

$xml = simplexml_load_string($string);

すると以下のようなワーニングが出る。

Warning: simplexml_load_string() [function.simplexml-load-string]: namespace warning : xmlns: URI abc is not absolute in /var/www/test/xpath_test2.php on line 9
Warning: simplexml_load_string() [function.simplexml-load-string]: <a xmlns="abc"> in /var/www/test/xpath_test2.php on line 9
Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /var/www/test/xpath_test2.php on line 9

libxmlのエラーの抑止

XML関連のエラーやワーニング(libxmlエラー)の出力を抑止し、必要に応じてエラーの情報を取得するにはlibxmlエラーを無効にする libxml_use_internal_errors()、エラー配列を取得する libxml_get_errors()、libxmlエラーハンドラをクリアする libxml_clear_errors() を使用する。

bool libxml_use_internal_errors([bool $use_errors = false])
--
use_errors  ユーザーによるエラー処理を有効 (TRUE) または無効 (FALSE) にする。 
無効にすると、既に存在する libxml のエラーもすべてクリアする。

以下にサンプルコードを示す。

$string = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="abc">
 <b>xxx</b>
</a>
XML;

// ユーザによるエラー処理を有効にする
libxml_use_internal_errors(true);

$xml = simplexml_load_string($string);

foreach (libxml_get_errors() as $error) {
    print $error->message . "\n";
}
libxml_clear_errors();

出力は以下のようになる。

xmlns: URI abc is not absolute 

参考ページ:
PHP: libxml_use_internal_errors - Manual
PHP: libxml_get_errors - Manual

盤上の夜

森博嗣か小川一水でも買おうかと書店に行ったが、帯の「第33回SF大賞受賞」という言葉に釣られて手に取って、将棋・囲碁などボードゲームの話だと知って購入した。短編集。

盤上の夜

表題作にしてSF大賞受賞作。囲碁の話。
SFと哲学は結構近いと思う。この話は脳科学とか認知科学とかのサイエンスと言えなくもないが、どっちかという哲学っぽいと思った。
興味深い話ではあったが、語られる女性棋士があまりにも悲惨な目にあっていて、グロテスクで(グロい描写があるわけではないが)、なんだか楽しめなかった。重ねて言うが話がつまらないということではない。が、気が弱い私は導入部の悲惨な話で「グロい」とか「この人かわいそうだ」という思いが先立って、その後の話が楽しめなかった。

人間の王

チェッカーというチェス盤を使うゲームの話。ただ、他の話にも言えるがゲームを知らなくても話は理解できる。この話が一番SFぽかった。でも面白い話かというとそうでもなかった。

清められた卓

麻雀の話。この話が一番楽しめた。結末もすっきりしていて、全員がハッピーになって、読後感が良かった。

象を飛ばした王子

チャトランガの話。遥か昔の話。これはSF要素があったかな。話は面白かった。

千年の虚空

将棋の話。SFっぽい用語も出てくるがほとんど男女のドロドロした情念の話で一番つまらなかった。この短編集で扱われるボードーゲームで一番好きな将棋の話なのに。残念。

原爆の局

最初の「盤上の夜」の続きの話。「清められた卓」の登場人物も少し出てくる。「盤上の夜」よりさらに哲学っぽい話ような気がする。いい話だった。


すごく面白かった!って話は1つもなくて、さっと読み終わってしまった。雑な5段階評価をするとこんな感じ。
「盤上の夜」と「原爆の局」:3.5
「人間の王」:3
清められた卓:4+
象を飛ばした王子:3.5+
千年の虚空:2
全体:3.5

盤上の夜 (創元SF文庫)盤上の夜 (創元SF文庫)
宮内 悠介

東京創元社 2014-04-12
売り上げランキング : 142993

Amazonで詳しく見る
by G-Tools

ばらかもん、東京喰種

ツタヤのコミックレンタルで「現在放映中のアニメの原作」コーナーがあって、2作品を借りてみた。

ばらかもん

アニメは視聴中で面白い。なので原作も読んでみた。3巻まで読了。アニメとほぼ同じ内容、というかアニメが原作にほぼ忠実。ほのぼの面白い。アニメの先の展開がわかっちゃうと嫌だから続きはアニメが終わってから読むことにした。

以前、「老若男女誰が読んでも面白いマンガ」について考えたことがある。自分が読んだ事のある作品で一番広く受け入れられそうなのは「よつばと!」という結論になったが、「ばからもん」はその上を行くかも。
この2作品、大枠は結構似ている。どちらも幼い女の子とその保護者(的な立場)の大人の日常の話である。でも「ばらかもん」の方がギャグ要素が強いところと、田舎が舞台なところで「よつばと!」より受け入れやすそう。田舎が舞台だと都会の人は「田舎ってそんななのか」と思うし、田舎の人は田舎あるあるで楽しめるし、どちらに住む人にとっても引っかかるところが多いんじゃないかと思った。

ばらかもん 1 (ガンガンコミックスONLINE)ばらかもん 1 (ガンガンコミックスONLINE)
ヨシノ サツキ

スクウェア・エニックス 2009-07-22
売り上げランキング :

Amazonで詳しく見る
by G-Tools


東京喰種

アニメはOP歌(TK from 凛として時雨)が良さそうと思ったが、未見。自分は「寄生獣」が好きなので、それに近い感じがあるのかもと思って読んでみた。さっと1,2巻を読んだら「結構面白いな」と思ったが、じっくりと読んだら設定に無理があることに気付いて冷めた。

この作品で人を食べる「喰種(ぐーる)」という種族は人間にまぎれて人間のふりをして生活している、ということになっている。この辺は「寄生獣」と同じ。
#喰種であることがばれた者は逃亡して住所不定な潜伏生活になる。
しかし、喰種は「人間の食物を食べようとすると強烈な嘔気を催す。無理して食べて栄養を吸収すると体調を崩す。」という。それじゃ人間にまぎれて暮らすなんて不可能だろう。大人の喰種は人間の食物を我慢して飲み込み、後でこっそり吐くという技術を身に付けているようだが、他人と飲食する時、常にそれをやり続けるのは相当難しいのではないか。特に子供時代、毎日学校で昼食の時間に吐き気に耐えて食物を飲み込み、後で吐くなんて無理だと思う。
#歯が溶ける。喰種は歯が丈夫という設定があるのかもしれないが。
また喰種は外見では人間と区別が付かないが、血液検査やレントゲン・エコーなどをしたら見つけることができる。それなら喰種を脅威とみなす人間社会はそういう検査を義務付ければいい。喰種は人間から喰種に変わるのではなく生まれたときから喰種なのだから、生まれた直後とか一定の年齢で喰種かどうかのチェックを義務付けるだけでほとんどの喰種を排除できるはず。でもそういうことはやっていなくて、喰種を捕獲・排除する公的機関が警察のように聞き込みをしたり観察をしたりして喰種を見つけて倒している。効率悪い。

というわけでストーリーに期待したらダメ。単なるバトルものとしたらまあ読めなくはない。

東京喰種 1―トーキョーグール (ヤングジャンプコミックス)東京喰種 1―トーキョーグール (ヤングジャンプコミックス)
石田 スイ

集英社 2012-02-17
売り上げランキング :

Amazonで詳しく見る
by G-Tools

September 11, 2014

PHPメモ045:XML処理 その1 XMLをパースする

PHPでXMLをパースするには、XMLファイルを読んでパースする場合は simplexml_load_file()、XML文字列をパースする場合は simplexml_load_string() を使用する。

SimpleXMLElement simplexml_load_file(
  string $filename
  [, string $class_name = "SimpleXMLElement"
  [, int $options = 0
  [, string $ns = "" [, bool $is_prefix = false ]]]])

filename XMLファイルへのパス
class_name  指定されたクラスのオブジェクトを返す。このクラスは SimpleXMLElement クラスを継承していなければならない。
options PHP 5.1.0 と Libxml 2.6.0 から、追加の Libxml パラメータ を指定する。
ns 名前空間プレフィックスあるいはURI。
is_prefix  ns がプレフィックスである場合に TRUE、 URI である場合に FALSE。デフォルトは FALSE。

SimpleXMLElement simplexml_load_string (
  string $data
  [, string $class_name = "SimpleXMLElement"
  [, int $options = 0
  [, string $ns [, bool $is_prefix = false ]]]] )

data XML文字列。

以下にサンプルコードを示す。

$str = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<Results xmlns="http://into.cocolog-nifty.jp/">
  <NumberOfResults>2</NumberOfResults>
  <Island>
    <IslandId>1</IslandId>
    <IslandName>西表島</IslandName>
    <Prefecture>沖縄</Prefecture>
  </Island>
  <Island>
    <IslandId>2</IslandId>
    <IslandName>奄美大島</IslandName>
    <Prefecture>鹿児島</Prefecture>
  </Island>
</Results>
XML;

$xml = simplexml_load_string($str);

print "xml=\n";
var_dump($xml);

print "\n-----\nxml->NumberOfResults=\n";
var_dump($xml->NumberOfResults);

print "\n-----\nxml->Island=\n";
var_dump($xml->Island);

print "\n-----\n";
$i = 0;
foreach ($xml->Island as $v) {
	print "foreach xml->Island:{$i}=\n";
	var_dump($v);
	$i++;
}

実行結果は以下のようになる。

xml=
object(SimpleXMLElement)#1 (2) {
  ["NumberOfResults"]=>
  string(1) "2"
  ["Island"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#2 (3) {
      ["IslandId"]=>
      string(1) "1"
      ["IslandName"]=>
      string(9) "西表島"
      ["Prefecture"]=>
      string(6) "沖縄"
    }
    [1]=>
    object(SimpleXMLElement)#3 (3) {
      ["IslandId"]=>
      string(1) "2"
      ["IslandName"]=>
      string(12) "奄美大島"
      ["Prefecture"]=>
      string(9) "鹿児島"
    }
  }
}

-----
xml->NumberOfResults=
object(SimpleXMLElement)#3 (1) {
  [0]=>
  string(1) "2"
}

-----
xml->Island=
object(SimpleXMLElement)#3 (3) {
  ["IslandId"]=>
  string(1) "1"
  ["IslandName"]=>
  string(9) "西表島"
  ["Prefecture"]=>
  string(6) "沖縄"
}

-----
foreach xml->Island:0=
object(SimpleXMLElement)#4 (3) {
  ["IslandId"]=>
  string(1) "1"
  ["IslandName"]=>
  string(9) "西表島"
  ["Prefecture"]=>
  string(6) "沖縄"
}
foreach xml->Island:1=
object(SimpleXMLElement)#5 (3) {
  ["IslandId"]=>
  string(1) "2"
  ["IslandName"]=>
  string(12) "奄美大島"
  ["Prefecture"]=>
  string(9) "鹿児島"
}

結果で不思議なのはコードの27行目 var_dump($xml->Island) の出力結果。var_dump($xml) の出力から考えると配列のように出力されると予想していたが、実際は最初の要素だけが出力される。さらに不思議なのは31行目 foreach では今度は配列のように要素を1個ずつ処理していくことができる。
参考ページ2にはmovies要素の下にmovie要素が複数あるXMLをパースしたSimpleXMLElementオブジェクトについて、

注意: プロパティ (先ほどの例の $movies->movie) は配列ではありません。反復処理 と 配列形式でのアクセス ができるオブジェクトです。

とあった。上記のサンプルコードについても var_dump($xml) の出力のIslandプロパティの部分は配列であるかのように出力されるが、実際は配列みたいに使えるだけであって配列ではないということらしい。
Smartyを使って $xml->Island の要素をすべて表示するPHPのサンプルコードとテンプレートの例を以下に示す。まずPHPのコード。

$smarty->assign('results', $xml);

次にテンプレート。

<ul>
{foreach $results as $v}
  <li>{$v->IslandId}:{$v->IslandName}({$v->Prefecture})</li>
{/foreach}
</ul>

参考ページ:
1.PHP: SimpleXML - Manual
2.PHP: 基本的な SimpleXML の使用法 - Manual

September 08, 2014

Facebookで自分の過去の投稿やいいね!を見る

メモ。
自分の自分の過去の投稿や「いいね!」したものを見るには、Facebookの自分のページで名前をクリックし、カバー写真上(右側)に表示されている「アクティビティ」をクリックする。

参考ページ:Facebookで過去に「いいね!」した記事や投稿履歴を見る方法|エンジョイ!マガジン

ソーシャルボタンの設置方法

tweetボタンやいいね!ボタンなどのソーシャルボタンをテスト用ページに設置してみた。
はてブのボタンまではレイアウトとか意識せずに並べて記述したら横に並んでボタンが表示されたが、Pocketのボタンだけなぜか改行されて左端に表示されてしまう。よくわからないのでとりあえずCSSで "foat: left;" なdiv要素でボタン毎にくくって横並びにした。

テスト

以下、ソーシャルボタンの設定方法について参考リンク。


tweetボタン(twitter)

まぁなんだ…その…あれだ ブログに色々なボタンを設置してみた。「Twitterツイートボタン」編
Twitterボタン | About


いいね!ボタン(Facebook)

Facebook「いいね!」ボタンをBlogに設置する方法 | nanapi [ナナピ]
Like Button


+1ボタン(Google+)

+1 ボタン - Google+ Platform — Google Developers


はてなブックマーク

はてなブックマークボタンの作成・設置について - はてなブックマーク


Pocektボタン(Pocket)

Pocket は一言で言えば「後で読む」サービス。

【連載】バルーン型のソーシャルボタンをブログに設置する方法。 (4)Pocket編 - Hike×Hack
Pocket for Publishers: Pocket Button


ソーシャルボタンをまとめて設置する方法

ソーシャルボタンを1つずつ設置するのではなくまとめて設置する方法もある。しかし、下記の参考サイトに書いてある方法はサービスを利用するためにアカウントの新規作成が必要(忍者ツールズ)、Pocketのボタンに対応してない(他の2つ)という理由で使わなかった。

いろんなソーシャルボタン(SNSボタン)をまとめて簡単に設置する方法|厳選!フリーツール

September 07, 2014

PL/pgSQL その2

関連記事:PL/pgSQL

PL/pgSQLで書いたコードの実行

以前の記事ではPL/pgSQLの使いみちと使い方を書いていなかった。PL/pgSQLは関数の定義に使う。実行は関数として実行する。
関数はSELECT文で実行する。下記のように、FROMがなくてもエラーにならない。

SELECT <関数名>

OracleのPL/SQLはコードをファイルに保存しファイルを指定して実行することができたと思うが、PL/pgSQLはそういうことができない。あくまで関数を記述して関数として実行するしかない。その点はPL/SQLより不便な気がする。

データを変更するPL/pgSQLコードの例

以前の記事ではデータを検索する例だけだったので、データを変更するコードを示す。
下記の例では、table1 を条件を指定して検索し、その検索結果の user_id を area_id=5 で table2 に挿入している。戻り値は挿入した件数である。

CREATE OR REPLACE FUNCTION insert_table2()
RETURNS int AS '
DECLARE
  cur CURSOR FOR 
    SELECT user_id 
    FROM table1 
    WHERE flag_delete IS NULL type = 1
      AND user_id NOT IN (SELECT user_id FROM table2 WHERE area_id = 5) 
    ORDER BY user_id;
  r table1;
  count int;
BEGIN
  count := 0;
  OPEN cur;
  LOOP
    FETCH cur INTO r;
    IF NOT FOUND THEN
      EXIT;
    END IF;
    INSERT INTO table2 (user_id, area_id, create_date) 
    VALUES (r.user_id, 5, CURRENT_TIMESTAMP);
    count := count + 1;
  END LOOP;
  CLOSE cur;
  RETURN count;
END
' LANGUAGE plpgsql;

17~19行目で最後までフェッチしたら終了するようにしている。この部分がないと無限ループになる可能性がある。
#この関数の場合はINSERT文でSQLエラーになり止まる。

September 04, 2014

source または .(ドット)コマンド

下記のような cd コマンドを使ったシェルスクリプト test.sh がある。

cd /var/www

このシェルスクリプトに下記のように実行した場合、カレントディレクトリはシェルスクリプト実行前と変わらない。

$ pwd
/home/user1
$ ./test.sh
$pwd
/home/user1

これは上記のようにシェルスクリプトを実行すると新たなシェルが起動してそこでシェルスクリプトが実行され、シェルスクリプトが終了すると起動されたシェルも終了するからである。
現在のシェルのカレントディレクトリを変えたいなら source コマンドまたは .(ドット、ピリオド)コマンドを使用してシェルスクリプトを実行すればよい。source コマンドは現在のシェルにスクリプトを読み込んで実行する。
#source も . も which コマンドで見つからない。bashの内部コマンドで同じ機能に2つの名前が付いているということか?
また、source でシェルスクリプトを現在のシェルで実行した場合、シェルスクリプト内でセットして変数がシェルスクリプト終了後にそのまま残っている。同じシェルで実行しているのだから当然だが。

最初のシェルスクリプトに変数に値を代入する処理などを加える。

cd /var/www
pwd
var1=abc
echo $var1

. で実行すると以下のようになる。元のシェルでシェルスクリプトが実行されたので、シェルスクリプトの結果も元のシェルに残っている。

$ pwd
/home/user1
$ . ./test.sh
/var/www
abc
$ pwd
/var/www
$ echo $var1
abc
$

参考ページ:
ドットコマンドと直接スクリプトを実行した時の違い - Webエンジニアの技術メモ ~PHP、SQL、Linuxなど~
sourceコマンド (ピリオド)

puttyの自動ログインとplink

puttyをコマンドラインから起動して自動的にログインする方法。

puttyjp.exe -ssh -2 -pw <パスワード> <ユーザ名>@<接続先IPアドレス>

puttyに保存したセッションを使う場合は以下のようになる。ただ、ログファイルの設定がしてあるセッションを指定してもログが保存されない。接続に直接関係ある設定だけ利用されるのかとも思ったが、フォントの設定とかは使われてるんだよなあ。不思議だ。

puttyjp.exe -load <puttyの設定のセッション名> -pw <パスワード>
 <ユーザ名>@<接続先IPアドレス>

さらに、"-m <ファイル名>" というオプションを付けるとファイルに記述したコマンドを実行できると説明しているサイトがあるが、どうやってもうまくいかない。一瞬puttyウィンドウが開くが、すぐに閉じる。接続的他かどうかもわからない。

puttyjp.exe ではなく同じフォルダにある plink.exe は -m オプションを付けて接続することが出来た。書式は以下。

plink.exe -ssh -2 -pw <パスワード> <ユーザ名>@<接続先IPアドレス>
 -m <ファイル名>

以下のように出力をリダイレクトすれば出力をファイルに保存できる。バッチファイルで使えそうだ。

C:¥>C:¥putty¥plink.exe -ssh -2 -pw wasbook wasbook@192.168.3.1:22 -m C:¥bat¥test.sh > C:¥log¥test.log

参考ページ:
PUTTYで、ユーザID/Passwordをいちいち入力しないで接続 | Pa-kun plus idea
SSH/PuTTY/RemoteCommand - yanor.net/wiki
Using PuTTY
puttyのコマンドラインオプション(引数)。 - シンプルな暮らし。 - 家族とWEBマーケティングな日々
IT-NOTE: PuTTY:SSHログインとコマンドの自動実行
putty のマクロでファイル転送とコマンド実行を行う。 - それマグで!

September 02, 2014

コマンドプロンプトのFTPクライアントで自動ログイン

WindowsのCUIのFTPクライアントは以下のようにオプションを付けるとコマンドファイルを読み込んでそれを実行することができる。コマンドファイルにIDとパスワードを書くことで自動的にログインできるので、FTPクライアントの処理をバッチファイルに組み込むことができる。

ftp -s:<コマンドファイル>

下記はコマンドファイルの例

open 192.168.3.1
taro
hoge#moge

lcd I:\aa\bb
cd /home/taro/cc
pwd
ls -al

disconnect
bye 

上記のコマンドファイルは次のようなことをしている。
1行目:ftpサーバに接続
2行目:ユーザID
4行目:パスワード
5行目:ローカルのディレクトリを移動
6行目:リモートのディレクトリを移動
7行目:リモートのカレントディレクトリを出力
8行目:ファイルのリストを出力(隠しファイルも含む)
10行目:切断
11行目:ftpクライアント終了

上記はファイルのリストを表示しただけが、ファイルのアップロードやダウンロードも当然出来る。ftpコマンドは参考ページを参照。

参考ページ:
FTPコマンドをバッチファイルで実行する
MS-DOS(コマンド)プロンプト用 FTPの使い方 - コマンド解説

September 01, 2014

PHPメモ044:PHPで暗号化・復号化

PHPでの暗号化・復号化にはMcypt関数を使う。
暗号化・復号化関数のサンプル。

define('SECRET_KEY', 'nanchara');	// パスワード暗号化キー

// 文字列暗号化
function encrypt_string($str) {
	
	// オープン
	$td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
	$key_size = mcrypt_enc_get_key_size($td);
	$key = substr(md5(SECRET_KEY), 0, $key_size);
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
	
	// 初期化
	mcrypt_generic_init($td, $key, $iv);
	
	// 暗号化
	$encrypted = mcrypt_generic($td, $str);
	$encrypted = base64_encode($encrypted);
	
	// 終了
	mcrypt_generic_deinit($td);
	
	// クローズ
	mcrypt_module_close($td);
	
	return $encrypted;
}

// 文字列復号化
function decrypt_string($encrypted) {
	
	// オープン
	$td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
	$key_size = mcrypt_enc_get_key_size($td);
	$key = substr(md5(SECRET_KEY), 0, $key_size);
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
	
	// 初期化
	mcrypt_generic_init($td, $key, $iv);
	
	// 復号化
	$decrypted = mdecrypt_generic($td, base64_decode($encrypted));
	$decrypted = rtrim($decrypted);
	
	// 終了
	mcrypt_generic_deinit($td);
	
	// クローズ
	mcrypt_module_close($td);
	
	return $decrypted;
}

上記の関数の最初に書いたバージョンは異常に遅くなることがあった。1回だけ実行する場合は問題ないのだが、大体3回以上連続して実行すると1回に10秒とか20秒とかかかる。原因は mcrypt_create_iv() の第2引数を MCRYPT_DEV_RANDOM としていたことだった。
MCRYPT_DEV_RANDOM だと mcrypt_create_iv() は初期化ベクトル(IV)生成のためのソースを /dev/random から読む。この /dev/random は乱数生成に必要な情報がない場合に情報が貯まるまで止まる。よって、暗号化・復号化関数を連続して実行すると mcrypt_create_iv() の /dev/random を読むところで止まってしまう。
第2引数を MCRYPT_DEV_URANDOM に変更したところ、問題は解決した。この場合、乱数を /dev/urandom から読む。/dev/urandom は本当の乱数ではなく疑似乱数らしいが仕方がない。
ちなみに、mcrypt_create_iv()のドキュメントを読むと、mcrypt_create_iv() の第2引数を省略した場合のデフォルトは MCRYPT_DEV_URANDOM だった。一方、下の方に書いてあるサンプルコードでは MCRYPT_DEV_RANDOM を使っていた。サンプルコードがあったらそれに倣ってコーディングするよね…。

Mcrypt関数についての参考ページ:
PHP: mcrypt_generic - Manual
omnioo lab. record | オムニオラボ WEB, LAMP, jQuery, ITのお話

/dev/randomについての参考ページ:
/dev/random - Wikipedia
/dev/random の乱数生成... - trial and error

« August 2014 | Main | October 2014 »

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