Ethnaでビット演算子って始めて知った

結構アクセスが増えてくると、セッションが上手く繋がらないことが多くなってくる。
で、Ethnaの場合だと、Ethna_Sessionクラスの_validateRemoteAddr関数が弾いているっぽい。

コメント欄で
セッションに保存されたIPアドレスとアクセス元のIPアドレスが同一ネットワーク範囲かどうかを判別する(16bit mask)

って書いてあったんだけど、よう分からんかった。

■16bitマスクについて
多分
xxx.xxx.yyy.yyy
で、xの部分(16bit分)が変わったらいかんよって事だ。
逆にyの部分(16bit分)が変わっても、同一ネットワーク範囲とするってことだ。

まあ、会社とかになると24bitのサブネットマスクとか当たり前になるので、これってセキュリティ上厳しいのか厳しくないのかようわからんけど、まあ、何でも自由ってのよりは全然良いわな。
それは間違いない。

で、意味は分かったんだけど(多分)、今度はソースが解読できない。

function _validateRemoteAddr($src_ip, $dst_ip)
{
    $src = ip2long($src_ip);
    $dst = ip2long($dst_ip);

    if (($src & 0xffff0000) == ($dst & 0xffff0000)) {
        return true;
    } else {
        $this->logger->log(LOG_NOTICE, "session IP validation failed [%s] - [%s]",
                           $src_ip, $dst_ip);
        return false;
    }
}


ip2long()とif文中にある"&"演算子。
ip2long関数は、まあすぐ調べることが出来たんだけど、"&"演算子がなかなか出てこなかった。

で、見つけた。
【 ほでなすPHP 】 PHPの基本 -> 演算子

結局「ビット演算子」ってものらしい。
ビットっていうぐらいだから、2進数でごにょごにょやるらしい。

0xffff0000の見た方がわからなかったんだけど、多分最初の0xってのは、正負の記号と見た!
んで、後ろのffff0000が32bitを表しているはず!

で、ffff0000を2進数で直すと
1111 1111 1111 1111 0000 0000 0000 0000

となる。

IPアドレスは8bit×4で32bitだから、上のにあわせると
11111111.11111111.00000000.00000000
↓
255.255.0.0

って感じになる。

んーこれって数学?

つまりのところ、このif分は、fの部分の16bit分がマスク扱いで、そこが一緒かどうかみてるってことね。
それが一緒なら、同一ネットワークですよと。

んーこうやってマスクのチェックをしていたんだなと納得。
凄いなあ、藤本さんは!
年下とは思えない・・・(涙)

さすがPHPのコミッターだなーって思ったけど、学校行って勉強した人とかにとっては普通かな?
独学の僕には新鮮だったわ。

つか、こんなの無理だわー。

PHPでフォームの未入力チェックをする時

フォーム値を検証する時にempty関数を使うと"0"だとfalseにしてまう。
"0"も拾っていきたい場合は、strlen関数を使う。

$hoge = 0;
echo strlen($hoge);
// 1を表示


これで大丈夫かなと思ったけど、Ethnaの未入力チェックでもこれが使われていたので、ちょっと安心。

PHPは駄目な言語らしい

PHPがいかに駄目な言語か、という話。を読んでちょっと衝撃。
rubyのまつもとさんってこういう人なんだなあ。
なんだか人格的には好きになれそうに無い感じだな。
ちょっと怖いわ。

phpをやっている人は他の言語をやっていない人が多い

みたいな指摘があって、確かに僕はactionscriptもそんなに頑張ってないし、javascriptだってコピペばっかだし、cobolはガッツリやったけど古いしって感じだし、なんか該当するなって思った。
俺のソースもセキュリティホールだらけなのかしら。

けど、確かにphpは曖昧な処理が多いのかもしれないな。
「javaはめんどくさいけどカチって動く感じ」って誰かが書いていたけど、確かにcobolとかだと変数とかの型の定義をソースの冒頭でだーって書いていたなあと懐かしく思い出した。
Cはメモリの定義までするんだっけ?

ってことで、javaとかcとかをちょっと勉強してみたいかもと考え中。
rubyでも良いのかもしれんけどなあと考えていたら、図書館で借りてきていた本が確かあった。
図解でわかる Javaのすべて―ネット時代のプログラミング
オブジェクト指向とかの部分を読もうと思って借りてきたんだけど、簡単なアプリでも作ろうかしら。

こんなことを週末は考えられるんだけど、平日は仕事に忙殺されるんだよな。

他人のソースは読まんといかんな

公式マニュアルより。

continueは、ループ構造において現在の繰り返しループ の残りの処理をスキップし、条件式を評価した後に 次の繰り返しの最初から実行を続けるために使用されます、


もうPHP触り始めて3年以上経つけどはじめて知った・・・。
以前使っていたCOBOLだと、確か何もしない(飾り)ものだったと思ったけど・・・。
全然違うのでびっくり。

Ethnaのソース解析しててわかった。
ん~、他人のソースは読まんといかんなあ。

シンタックスハイライト(prettifier)を実装

このブログソースコードが以下の点で凄く見難かった。

1.phpのnl2br関数を使っているので、preタグの中でも改行されてしまう。
2.全て同じ色

で、素直にはてな日記とかで書こうかなと思ったんだけど、そういうのを解決していくのが勉強かなと思い留まり、頑張って実装してみた。

まずは、1つめの改行問題について。
smartyで独自の修飾子で解決できないかなと考え、いろんなところからソース探してきてこんなものが出来た。
参考サイト:No Such Blog or Diary - Nucleus の改行をちょっと頭よくする
function smarty_modifier_mynl2br($value)
{
    $i=0;
    $v2="";
    $n=mb_strlen($value);
    while($i<$n){
        $p=mb_strpos($value,"&lt;pre",$i);
        if($p==FALSE){
            $v2.=nl2br(mb_substr($value, $i));
            break;
        }
        $v2.=nl2br(mb_substr($value, $i,$p-$i));
        $i=$p;
        $p=mb_strpos($value,"&lt;/pre&gt;",$i);

        // 1つも無い場合
        if($p==FALSE){
            $v2.=mb_substr($value, $i);
            break;
        }

        $v2.=mb_substr($value, $i,$p-$i);
        $i=$p;
    }
    return $v2;
}

これで一応preタグ間はbrタグ入らないようになった。

続いて2の問題については、いろいろ探したらjavascriptで色つけれる奴があるみたいだった。
一番簡単そうなのが、Javascript code prettifierって奴だったので、以下のサイトを参考に実装。
参考サイト:コードをプリティに整形するjavascript「code prettifier」 : skuare.net

で、DBに格納しているデータそのものにprettifierってclass名をつけるのがなんだか嫌だったので、これまたsmartyの修飾子を作成。
function smarty_modifier_prettyprint($value)
{
    $result = str_replace('&lt;pre', '&lt;pre class="prettyprint"', $value);
    return $result;
}

んで、smartyのテンプレートで2つとも呼んでやればOKってことにした。
キレイキレイ。
≪ 前のページ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 次のページ ≫ 6 of 9

アーカイブ

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com