MW211 EXIT

devlog
UTF-8/マルチバイト文字の長さ
2012年05月17日
マルチバイト文字(日本語文字)について、
「SHIFT_JIS」は「2バイト」、「UTF-8」は「3バイト」…などと
誤って覚えちゃダメです。
UTF-8のマルチバイト文字は(一文字当たり)、「1バイト~4バイト」なのです。

各バイトの先頭ビット辺りにバイト長の識別子が付加され、
その残りで文字を識別する。
┌────┬──────────────────┐
│1バイト │0_______                            │
├────┼──────────────────┤
│2バイト │110_____ 10______                   │
├────┼──────────────────┤
│3バイト │1110____ 10______ 10______          │
├────┼──────────────────┤
│4バイト │11110___ 10______ 10______ 10______ │
└────┴──────────────────┘

ざっとこんな感じ(なのか?)
┌──────────────────┐  ┌─────────────┐
│0AAAAAAA                            │→│                  0AAAAAAA│
├──────────────────┤  ├─────────────┤
│110AAAAA 10BBBBBB                   │→│         00000AAA AABBBBBB│
├──────────────────┤  ├─────────────┤
│1110AAAA 10BBBBBB 10CCCCCC          │→│         AAAABBBB BBCCCCCC│
├──────────────────┤  ├─────────────┤
│11110AAA 10BBBBBB 10CCCCCC 10DDDDDD │→│000AAABB BBBBCCCC CCDDDDDD│
└──────────────────┘  └─────────────┘

なにかとサニタイズで話題の「/」ですが…。

「/」は「0x2F」なわけだが、以下の四つはすべて「0x2F」=「/」を表すことになる。
上記の法則に照らし合わせてみれば、以下の様々なパターンが該当する。
┌──────┬──────────────────┬
│2F          │00101111                            │
├──────┼──────────────────┼
│C0 AF       │11000000 10101111                   │
├──────┼──────────────────┼
│E0 80 AF    │11100000 10000000 10101111          │
├──────┼──────────────────┼
│F0 80 80 AF │11110000 10000000 10000000 10101111 │
└──────┴──────────────────┴
                                      ┬──────────────────┐
                                      │                           _0101111 │①
                                      ┼──────────────────┤
                                      │                  ___00000 __101111 │②
                                      ┼──────────────────┤
                                      │         ____0000 __000000 __101111 │③
                                      ┼──────────────────┤
                                      │_____000 00000000 00000000 __101111 │④
                                      ┴──────────────────┘

で、①②③は「bin2hex()」で「/」に変換できたが、④は変換できなかった。
「/」を「hex2bin()」で変換すると「2F」となった(最短優先みたい)。
分類:文字コード
設計/アカウントのロックアウト
2012年05月16日
「アカウントのロックアウト」とは、
ユーザアカウントを凍結して、ログインできないようにすること。

パスワードを闇雲に試してみようとする輩を排除するために、
一定回数以上パスワードを間違えると、
自動的にそのアカウント(ログインID)が使えなくしたりする。

ただし、第三者がログインIDを知っている場合、そのアカウントになりすまして
わざと誤ったパスワードを何回も入力し、アカウントをロックアウトしてしまうという
嫌がらせができてしまうわけだ。

銀行ATMでも同様の機能があるが、ログインIDにあたるのがキャッシュカードであり
これは容易に他人の手に渡らないので大丈夫。
でも、ログインIDとなるとそこまでのセキュリティ感覚は働きづらい。

この点を考慮せず(甘く見て)、その復旧を管理者の手動とかに設計すると
年中無休即時対応のサポート並みに地獄をみることになる…かも。

だから、回復方法としては、一定時間おいたら自動的に復旧させる、
当事者にアカウントがロックした旨のメールを出して自分で復旧してもらう、
とか自動化が必要だ。

あ、そうそう、「アカウントのロックアウト」には
迷惑行為をする輩を締め出すためって場合もある。
ま、これは懲罰処置だから、ロックアウトしちまえば終わり。
あと、これこれこういう理由でロックアウトしたよって通知すれば親切だね。
分類:設計
IE/JavaScriptをローカルで実行する時の警告文
2012年05月15日
Internet Explorerで、ローカルファイルを開いた時に、
そこにJavaScriptが実装されていると、いちいちメッセージが表示されて
JavaScriptの実行が制限される。

IE8以前だと以下のようなメッセージが表示される。
┌──────────────────────────────────────┐
│セキュリティ保護のため、                                                    │
│コンピュータにアクセスできるアクティブコンテンツは表示されないよう、        │
│Internet Explorerで制限されています。                                       │
│オプションを表示するには、ここをクリックしてください..                      │
└──────────────────────────────────────┘
IE9だと以下のようなメッセージが表示される。
┌──────────────────────────┌──────────┐┐
│スクリプトやActiveXコントロールを実行しないよう、   │ブロックされている  ││
│               Internet Explorerで制限されています。│コンテンツを許可する││
└──────────────────────────└──────────┘┘

これは、既定で制限設定となっているからだ。

【ローカルファイルでJavaScriptが使えない(既定)件】
メニューバーから「ツール」→「インターネットオプション」を選択し、
以下のように適用
┌──────────────────────────────────────┐
│インターネットオプション                                                    │
├──────────────────────────────────────┤
│                                                                ┌────┐│
│                                                                │詳細設定││
│┌───────────────────────────────┘        ││
││┌設定────────────────────────────────┐││
│││■セキュリティ                                                      │││
│││  ■マイコンピューターのファイルでのアクディブコンテンツの          │││
│││                                                    実行を許可する*│││
││└──────────────────────────────────┘││
││  *Internet Explorerの再開後に有効になります。                         ││
│└────────────────────────────────────┘│
│                                                    ┌──┐┌──┐┌──┐│
│                                                    │ OK ││    ││適用││
│                                                    └──┘└──┘└──┘│
└──────────────────────────────────────┘
分類:ブラウザ
Apache/公開ディレクトリの設定
2012年05月14日
「htpd.conf」で以下の設定を行う。

DocumentRootを適当なものにする。
┌──────────────────────────────────────┐
│DocumentRoot "C:/www"                                                       │
└──────────────────────────────────────┘
一応、設定もしておく。
┌──────────────────────────────────────┐
│<Directory "C:/www">                                                        │
│    Options Indexes FollowSymLinks Includes ExecCGI                         │
│    AllowOverride All                                                       │
│    Order allow,deny                                                        │
│    Allow from all                                                          │
│</Directory>                                                                │
└──────────────────────────────────────┘

エイリアスをつかって、パスを割り付ける。
┌──────────────────────────────────────┐
│<IfModule alias_module>                                                     │
│    Alias /■ "C:/www/■/htdocs"                                            │
│</IfModule>                                                                 │
└──────────────────────────────────────┘
そこの設定もしておく。
┌──────────────────────────────────────┐
│<Directory "C:/www/■/htdocs">                                              │
│    Options FollowSymLinks                                                  │
│    AllowOverride All                                                       │
│    Order allow,deny                                                        │
│    Allow from all                                                          │
│<IfModule mod_rewrite.c>                                                    │
│    RewriteEngine On                                                        │
│    RewriteBase /■/                                                        │
│    RewriteRule !\.(js|ico|gif|jpg|png|bmp|css|csv|pdf)$ index.php          │
│</IfModule>                                                                 │
│</Directory>                                                                │
└──────────────────────────────────────┘

以上。
PHP/Shift_JISとUTF-8
2012年05月12日
「UTF-8」にあるのに「Shift_JIS」にはない文字というのがある。

(マルチバイト文字)「1文字」に対して「Shift_JIS」は「2バイト」使うのに対して
「UTF-8」は「3バイト」とか使うのだから、当然そういう文字があっても不思議はない。

で、そういう文字を「UTF-8→Shift_JIS」変換したらどうなるのか?
大抵は「?」とか特定の文字に変換される。
┌──────────────────────────────────────┐
│mb_convert_encoding('■', 'SJIS-win', 'UTF-8');                             │
└──────────────────────────────────────┘
この結果は「?」となる。(「■」が「UTF-8」固有文字だったとする)

┌──────────────────────────────────────┐
│mb_convert_encoding('あいう■えお', 'SJIS-win', 'UTF-8');                   │
└──────────────────────────────────────┘
ちなみにこういう混在している場合は「あいう?えお」となる。
→他の文字に悪影響は与えない

では、「UTF-8→Shift_JIS→UTF-8」と行って来い変換した場合は?
┌──────────────────────────────────────┐
│mb_convert_encoding(mb_convert_encoding('■', 'SJIS-win', 'UTF-8'),         │
│                    'UTF-8',                                                │
│                    'SJIS-win');                                            │
└──────────────────────────────────────┘
結果は「?」。

一旦「?」になってしまったら、もう「?」なのだ。
分類:PHP、文字コード
PHP/ホスト名を取得する方法
2012年05月11日
┌──────────────────────────────────────┐
│$ip = getenv("REMOTE_ADDR");                                                │
│$host = getenv("REMOTE_HOST");                                              │
│if (($host == NULL) || ($host == $ip)) {                                    │
│  $host = gethostbyaddr($ip);                                               │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
PHP/IPアドレスを取得する方法
2012年05月10日
┌──────────────────────────────────────┐
│$ip = getenv("REMOTE_ADDR")                                                 │
└──────────────────────────────────────┘
分類:PHP
PHP/文字コード変換
2012年05月09日
「①」←→「e291a0」(UTF-8)
上記のように文字とそのコードを変換する方法。
┌──────────┬───────────────────────────┐
│「①」─→「e291a0」│bin2hex('①')                                         │
├──────────┼───────────────────────────┤
│「①」←─「e291a0」│hex2bin('e291a0')                                     │
└──────────┴───────────────────────────┘
二文字以上の文字列でもOK。

但し、「hex2bin()」はPHP5.4以降から実装されるので、
使えない場合は自作関数を代替か。
分類:PHP
HTML/POST変数のname属性が配列の場合
2012年05月08日
基本的に、name属性には変数を使う。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[]"      value="1"/>     →  $_POST[a]       = 1│
└──────────────────────────────────────┘
配列を使ってもよい。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[1]"     value="1"/>     →  $_POST[a][1]    = 1│
└──────────────────────────────────────┘
もちろん、連想配列(添字が文字列)でもOK。
┌──────────────────────────────────────┐
│<input type="hidden" name="a['z']"   value="1"/>     →  $_POST[a]['z']  = 1│
└──────────────────────────────────────┘
配列の添字を省略すると、自動で設定してくれる。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[]"      value="1"/>     →  $_POST[a][0]    = 1│
│<input type="hidden" name="a[]"      value="2"/>     →  $_POST[a][1]    = 2│
└──────────────────────────────────────┘
直前に添字があればその次に追加されていくが、
最大添字を起点としてカウントアップしていくので必ず直前の次というわけではない。
(上記のように、元々起点がなければ「0」から始まる)
「$a[] = 1;」みたいな処理と同じようなもんだ。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[3]"     value="1"/>     →  $_POST[a][3]    = 1│
│<input type="hidden" name="a[]"      value="2"/>     →  $_POST[a][4]    = 2│
│<input type="hidden" name="a[1]"     value="3"/>     →  $_POST[a][1]    = 3│
│<input type="hidden" name="a[]"      value="4"/>     →  $_POST[a][5]    = 4│
└──────────────────────────────────────┘
なお、文字列の添字はそのカウントアップからは無視される。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[3]"     value="1"/>     →  $_POST[a][3]    = 1│
│<input type="hidden" name="a['4']"   value="2"/>     →  $_POST[a]['4']  = 2│
│<input type="hidden" name="a[]"      value="3"/>     →  $_POST[a][4]    = 3│
└──────────────────────────────────────┘
添字が同じものが複数あれば同一と見なし、最後方が上書で優先される。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[]"     value="1"/>      →  $_POST[a][0]    = 1│
│<input type="hidden" name="a[]"     value="2"/>      →      (上書される)   │
│<input type="hidden" name="a[1]"    value="3"/>      →  $_POST[a][1]    = 3│
└──────────────────────────────────────┘
これは変数の場合と同じこと。
┌──────────────────────────────────────┐
│<input type="hidden" name="a"       value="1"/>      →      (上書される)   │
│<input type="hidden" name="a"       value="2"/>      →  $_POST[a]       = 2│
└──────────────────────────────────────┘
ちなみに、変数名と配列名が同名だった場合には?
┌──────────────────────────────────────┐
│<input type="hidden" name="a"       value="1"/>      →      (上書される)   │
│<input type="hidden" name="a[]"     value="2"/>      →  $_POST[a][0]    = 2│
│<input type="hidden" name="a[]"     value="3"/>      →  $_POST[a][1]    = 3│
└──────────────────────────────────────┘
階層毎で(まるごと)上書される感じ(上記と下記がそれを物語っている)。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[]"     value="1"/>      →      (上書される)   │
│<input type="hidden" name="a[]"     value="2"/>      →      (上書される)   │
│<input type="hidden" name="a"       value="3"/>      →  $_POST[a]       = 3│
└──────────────────────────────────────┘
それと多次元配列も大丈夫。
┌──────────────────────────────────────┐
│<input type="hidden" name="a[1][2]" value="1"/>      →  $_POST[a][1][2] = 1│
└──────────────────────────────────────┘
分類:HTML
JavaScriptの長時間の処理を実行した場合の挙動
2012年05月07日
ブラウザにより以下のように違う。
────────────────────────────────────────
【IE9】(しばらくしてからブラウザをクリックした場合)
  (ケース1)
    #単純に永久ループさせるとこの現象となる模様
      (ケース2)よりも程度がひどい場合にこちらのメッセージになる模様
┌────────────────────────────┌────────┐┐
│■■が応答しません。                                    │Webページの回復 ││
└────────────────────────────└────────┘┘
  (ケース2)
┌────────────────────────────┌────────┐┐
│■■は、長時間実行中のスクリプトが原因で応答しません。  │スクリプトの停止││
└────────────────────────────└────────┘┘
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【IE4~IE8】(しばらくして自動でダイアログが開く)
┌──────────────────────────────────────┐
│Microsoft Internet Explorer                                                 │
├──────────────────────────────────────┤
│このスクリプトの実行を中止しますか?                                        │
│                                                                            │
│このページのスクリプトが、Internet Explorerの実行速度を遅くしています。     │
│スクリプトを実行し続けると、                                                │
│コンピューターが反応しなくなる可能性があります。                            │
│スクリプトを中断しますか?                                                  │
│                  ┌────────┐┌────────┐                  │
│                  │      はい      ││     いいえ     │                  │
└──────────────────────────────────────┘
JavaScriptの処理が重い(もしくは永久ループ)
http://support.microsoft.com/kb/175500/ja
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【Firefox11】(しばらくして自動でダイアログが開く)
┌──────────────────────────────────────┐
│警告:応答のないスクリプト                                                  │
├──────────────────────────────────────┤
│このページのスクリプトは処理に時間がかかているか応答しなくなっています。    │
│今すぐスクリプトを停止するか、このまま処理を続行させるか選択してください。  │
│  スクリプト:http://…                                                      │
│  □次回からは確認しない                                                    │
│                  ┌────────┐┌────────┐                  │
│                  │   処理を続行   ││スクリプトを停止│                  │
└──────────────────────────────────────┘
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【Chrome18】(しばらくして自動でダイアログが開く)
┌──────────────────────────────────────┐
│ページ応答なし                                                              │
├──────────────────────────────────────┤
│次のページは応答していません。                                              │
│応答があるまで待つか、強制終了してください。                                │
│┌────────────────────────────────────┐│
││xxxx.htm                                                                ││
└──────────────────────────────────────┘
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【Safari5】(反応なし)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【Opera11】(反応なし)
────────────────────────────────────────
分類:ブラウザ
前へ 1 2 3 次へ