目次

いろいろととめどなく書いていますが、メインとなるものはフィギュアのレビューと、プログラミング関連のメモです。

フィギュアについて

[サムネイル] 雪子[サムネイル] ネイ[サムネイル] ジブリール

購入したものについてレビューを書いています。

以下おすすめ(それぞれレビューエントリにリンク)
★★★
Creators' Labo CL#015 新世紀エヴァンゲリオン 綾波レイ
★★
BASTARD!! カイ・ハーン (1/6スケールPVC塗装済み完成品)
魔界天使ジブリール 聖天使ジブリール (1/7スケールPVC塗装済み完成品)

戦国ランス 鈴女 (すずめ) (1/8スケールPVC塗装済み完成品)
ギルティギア イグゼクス ブリジット
ペルソナ4 天城雪子 限定版 (アルター)
一騎当千Dragon Destiny 関羽雲長 (1/8スケールPVC塗装済み完成品)
SMC 関羽雲長

プログラミングについて

主にPHPを中心に、ひっかかった点などについてメモ書きとして残しています。自分用でもありますが、同様の事象にぶつかった方が検索でたどり着いて参考になれば幸いです。

一例:
[PHP / Web] 住所情報を一括で GoogleMaps の座標に変換
[PHP] mb_convert_encoding() でエラー
[AIR] エラー:1037 パッケージをネストすることはできません。

[PHP] 2進の数を比較すると異なる値が同じと判断されることがある

異なる2進数の数値を10進数に変換したらとうぜんながら違うと判定されるのに、2進数で比較したら同じだよといわれたでござるの巻。




等しくねえよ!

ソースは以下のような感じ。
説明書きの部分は省いてあります。


<?php
//10進数として値をセット
$a = bindec( "11110000111100001111000011110000" );
$b = bindec( "11110000111100001111000011110001" );
if( $a == $b ){
$result .= "等しい( ".$a." = ".$b." )";
}else{
$result .= "等しくない( ".$a." != ".$b." )";
}
//2進数に変換
$a_bin = decbin( $a );
$b_bin = decbin( $b );
if( $a_bin == $b_bin ){
$result .= "等しい( ".$a_bin." = ".$b_bin." )";
}else{
$result .= "等しくない( ".$a_bin." != ".$b_bin." )";
}
?>


なんでもともと異なる値が変換かけたら同じものとして判定されるの?
PHPが型とかもってないことが関係してるのかしら? 原因は謎。調べたらわかるのかもしれんけど。
とりあえず比較かけるときは10進数に変換しておいたほうがよかろうという自分へのメモ。

追記:
上記のソースで初めにセットする2進数としての値(実際セットされるときには文字列だけれど)が16桁のときまでは正常に判断できて、17桁を超えるとダメになることを確認。ビット処理でなんかいろいろあるんだろうか。

[PHP] xxx.xxx.xxx.xxx/yy の形のIP帯域指定にマッチするかをチェックする

携帯電話でのアクセスなどで、接続元のIPがアクセス許可されるべきものかどうかを判別する際、その許可されるべきIPが "192.168.1.0/24" のような形で示されることがよくあります。
携帯のキャリアが発表している形はたいていこうかと思います。

iモードセンタのIPアドレス帯域
http://www.nttdocomo.co.jp/service/imode/make/content/ip/
例:210.153.84.0/24

EZサーバのIPアドレス帯域
http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
例:210.230.128.224/28

Yahoo!ケータイにて利用するIPアドレス帯域
http://creation.mb.softbank.jp/web/web_ip.html
例:123.108.236.0/24

少し調べると、正規表現を使うとか、PEAR の Net_IPv4 を使うとか方法はいろいろありそうなのですが、少々ややこしいのでベタな形で関数を作成しました。

ロジックとしては、
・帯域IPをマスク部分でANDをかけたもの
・接続元IPをマスク部分でANDをかけたもの
が等しいかという単純なビット演算です。

たとえば、192.168.1.0/24 と 192.168.1.123 の場合、
11000000 10101000 00000001 00000000 (192.168.1.0)
11000000 10101000 00000001 11111011 (192.168.1.123)
となり、

11000000 10101000 00000001 00000000 (192.168.1.0)
AND演算
11111111 11111111 11111111 00000000 (/24 : 24個の1を頭から)

11000000 10101000 00000001 00000000 (192.168.1.0)

11000000 10101000 00000001 11111011 (192.168.1.123)
AND演算
11111111 11111111 11111111 00000000

11000000 10101000 00000001 00000000 (192.168.1.0)

で、結果が同じか、ということで判断します。

テストは少ししかしていませんので完璧かどうかはいまの時点で不明ですが、理屈的にはわかりやすいものかと思います。






<?php
//===============================================================
// IPを指定の形式の文字列と比較してマッチングするかを確認
// マッチングすれば TRUE
//===============================================================

function CheckIpFromString( $str, $ip ){

//初期化
$mask = "";
$ip_str = "";

//----------------------
//要素に分解
//----------------------
//マスクとIP部と分離

$ary_temp = explode( "/", $str );
if( is_array( $ary_temp ) ){
$mask = isset( $ary_temp[1] ) ? $ary_temp[1] : "";
$ip_str = $ary_temp[0];
}
//形式がおかしい場合(/で分割できない)は、エラーとする
if( strlen( $mask ) <= 0 || strlen( $ip_str ) <= 0 ){
return( false );
}
// 判別文字列
$ary_target = explode( ".", $ip_str );
// アクセス元IP
$ary_access = explode( ".", $ip );

//-------------------------------------------------
//分割に失敗した場合はエラー(NG扱い)として戻す
//-------------------------------------------------
if( !is_array( $ary_target ) || !is_array( $ary_access ) ){

return( false );
}
if( count( $ary_target ) < 4 || count( $ary_access ) < 4 ){
return( false );
}

//----------------------------------
// ビット演算での判定のため2進数に変換する
//----------------------------------

$bin_target = "";
$bin_access = "";
// 数値分だけ頭から1をセット
$bin_mask = str_pad( str_repeat( "1", $mask ), 32, "0", STR_PAD_RIGHT );
// コロンを省いてそれぞれ2進数にしたものを連結
for( $i = 0; $i < 4; $i++ ){
$bin_target .= str_pad( decbin( $ary_target[$i] ), 8, "0", STR_PAD_LEFT );
$bin_access .= str_pad( decbin( $ary_access[$i] ), 8, "0", STR_PAD_LEFT );
}

//-------------------------------
//判定して結果を返す
//-------------------------------
// どちらもマスクでAND演算を行い(1の部分だけが比較対象)、比較を行う

if( bindec( $bin_target & $bin_mask ) == bindec( $bin_access & $bin_mask ) ){
return( true );
}else{
return( false );
}
}

//端末のIPを取得
$ip = $_SERVER['REMOTE_ADDR'];
$result .= "接続元(仮) : <br>\n";
$result .= $ip."<br>\n";

// IP帯域を配列でセット
$ip_str = array(
"210.230.128.224/28",
"121.111.227.160/27",
"61.117.1.0/28",
"219.108.158.0/27",
"219.125.146.0/28",
"192.168.1.0/24"
);

$result .= "指定帯域(複数指定) : <br>\n";
for( $i = 0; $i < count( $ip_str ); $i++ ){
$result .= $ip_str[$i]."<br>\n";
}

//ヒットしたかのフラグ
$flg = 0;

//どれかにヒットするか
for( $i = 0; $i < count( $ip_str ); $i++ ){
//ヒットしたらフラグを立てて抜ける
if( CheckIpFromString( $ip_str[$i], $ip ) ){
$flg = 1;
break;
}
}

if( $flg > 0 ){
//該当する場合
$result .= "OK!";
}else{
//該当せず
$result .= "NG!";
}

//テンプレートをインクルード
include( "void.tmpl" );

?>



追記:20090703
なんか2進になった数値を比較したらキテレツな結果になったので、比較の際に10進数に変換する処理( bindec() )を追加。

[PHP] 文字列中に特定の記号で囲まれた文字列を抽出する

ひょっとしたら標準関数にあったり単純な組み合わせでできそうな気もするのですが、せっかく自作したので、同様のニーズがあったときにまた作り直さなくて済むようにメモ。

文字列中に、なんらかの規則で囲まれる文字列があったとして、それらを抽出するものです。
ただ単に一文字ずつとってきて、開始記号があったらフラグをあげ、フラグがあがっている間じゅうはは取得し続けるというただそれだけのもの。




//======================================================
// 区切り記号(始まり・終わり)のある文字列を抽出する
//======================================================

function GetElementFromString( $sep_s, $sep_e, $str, $enc ){

//検出元となる文字列の長さを取得
$len = mb_strlen( $str, $enc );
//初期化
$flg = 0;
$idx = 0;

//----------------------------------
//文字を1文字ごと取得する
//----------------------------------

for( $i = 0; $i < $len; $i++ ){

//1文字取得
$c = mb_substr( $str, $i, 1, $enc );

//始まり記号があれば印としてフラグに1
if( $c == $sep_s ){
$flg = 1;
}
//記号内であれば(フラグが立っていれば)区切り内文字として格納
if( $flg == 1 ){
$temp .= $c;
}
//終わり記号があれば
if( $c == $sep_e ){
//配列に区切り内文字を格納
$ary[$idx++] = $temp;
//クリア
$flg = 0;
$temp = "";
}
}
return( $ary );
}

//初期化・設定
$str = "隠れてる文字が{ABC}どこかにあるよ! 隠れてる{DEF}文字がどこかにあるよ! 隠れてる文字がどこかに{GHI}あるよ! 隠れ{JKL}てる文字がどこかにあるよ! ";
$result = "";

//関数呼び出し(囲み開始記号、囲み終了記号、文字列、文字コード)
$ary = GetElementFromString( "{", "}", $str, "UTF-8" );

//結果を整形
$result .= "元文字:".$str."<br />\n";
$result .= "<div style=\"color:#008800\">\n";
if( is_array( $ary ) ){
//配列であれば順々に表示セット
for( $i = 0; $i < count( $ary ); $i++ ){
$result .= "[".$i."] - ".$ary[$i]."<br />\n";
}
}else{
//配列でなければそのまま
$result = $ary;
}
$result .= "</div>\n";

//テンプレートをインクルード
include( "void.tmpl" );

[アニメ] アスカが名前変わったのは駆逐艦で名前を統一したかったからか

と、いまごろ気がついた。
同時に、海上自衛隊の護衛艦の名前で統一ということかもしれん、と思った。

もう来月になれば激しく流行おくれになるであろうヱヴァンゲリヲンの話です。

<帝国海軍駆逐艦>
綾波 : Wikipedia 吹雪型 11番艦
敷波 : Wikipedia 吹雪型 12番艦
巻波 : Wikipedia 夕雲型 5番艦

 1/700 ウォーターライン新シリーズ 綾波

(Amazon)
 1/700 ウォーターライン新シリーズ 敷波

(Amazon)


<海上自衛隊護衛艦>
あやなみ : Wikipedia 就役 1958/2/12〜1983/3/30
しきなみ : Wikipedia 就役 1958/3/15〜1983/3/30
まきなみ : Wikipedia 就役 1960/10/28〜1987/2/20

<関連>
蒼龍 : Wikipedia 帝国海軍 航空母艦
ラングレー : Wikipedia アメリカ海軍 航空母艦
イラストリアス : Wikipedia イギリス海軍 航空母艦


アオシマ 1/700 ウォーターライン イギリス海軍航空母艦 イラストリアス 1/700 プラモデル
(Amazon)

あ、これで波が三つそろったということで、零号機と弐号機と伍号機が三体合体して「三波」となり、超巨大な三波春夫ロボが現れるのか。

ごごごごごごと割れる新潟沖合の海。
「こんにちわ こんにちわ 未来の国から」
使徒を見て
「お客様は神様です」
あ、それでいいや。もう観たことにしとこう。

遠足や旅行は計画を立てているとき、ゲームは発売前、アニメは放送の合間(公開前)が一番楽しい。

tag : ヱヴァンゲリヲン エヴァンゲリオン アニメ

リンク
最新記事
最新コメント
月別アーカイブ
カテゴリ
プロフィール

Author:Apocripha.net
FC2ブログへようこそ!

検索フォーム
RSSリンクの表示
Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード