@blog.justoneplanet.info

日々勉強

代入された変数を書き換えると代入した変数まで書き換わる件

■トラブルが起こるサンプルソース

var x = new Array("1","2","3");
var y;
var a = 10;
var b;
var s = 'test';
var t;
function test(){
    y = x;
    y.pop();
    alert(x);//1番目のアラート
    b = a;
    b ++;
    alert(a);//2番目のアラート
    t = s;
    t = t.substring(0,2);
    alert(s);//3番目のアラート
}

■上記の実行結果

2番目はそのまま「10」と表示される

3番目もそのまま「test」と表示される

1番目は大方の予想に反して「1,2」と表示される

えっなんで「1,2,3」じゃないの?と普通は思う

■解説

代入「=」とは、そっくりそのままコピーされたと考えるのではなく、常にその値が入っているメモリーの場所情報が渡されたと考えなくてはならない

これは膨大な情報を持った変数の代入などが高速で行えるという言語仕様上のメリットがある

ところがサンプルソースのような違いが現れる。それはtypeofによる分類で

  • number
  • boolean
  • string
  • undefined
  • null

の型になるものはコピーされ、それ以外はメモリー情報が渡されているからである

■サンプルに加えて下さい

以下のコードをサンプルに加えて実行すると、アラートが3回増え「object、number、string」と表示される

つまりobjectは代入では単純にコピーはされないという事だ

alert(typeof(x));//object
alert(typeof(a));//number
alert(typeof(s));//string

■配列のクローンを作る

以下のようにすると一応はコピーができる。

var a = new Array("test1","test2","test3");
var b = a.concat ();
var c = a.slice (0);

■追記

「クローンを作る」という行為になかなか需要がない事が分かりました。まずは、クローンが本当に必要なのかを見直した方が良いかもしれません。

Dreamweaver MX(初期設定)で.htmの拡張子を.htmlに変更しよう

■方法

  1. Cドライブ>Program Files>Macromedia>Dreamweaver MX>Configuration>DocumentTypes>MMDocumentTypes.xmlを書き換える
  2. ただし上記のディレクトリはWindows XPの場合であり、他のOSでは若干異なる可能性もあるのでご了承。。。
3行目を
<documenttype id="HTML" internaltype="HTML" winfileextension="html,htm,shtml,shtm,stm,lasso,xhtml" macfileextension="html,htm,shtml,shtm,lasso,xhtml" file="Default.html" writebyteordermark="false">

と書き換える。要は、「htmの前にhtmlを配置し並び替える」ということ

■おまけ

初期設定がhtmってどういうこと!?しかもアプリケーションの環境設定で変えられないって欠陥じゃね!?とかツッコミいれてみたり。。。

$_GETと$_POSTのに格納された文字の自動エスケープ

SQLインジェクションの対策としては不完全である

■magic_quotes_gpcについて

php.iniの設定に「magic_quotes_gpc=On」と書き足せば’(シングルクォーテーション)、”(ダブルクォーテーション)、\(バックスラッシュ) 、NULLを自動的にエスケープ処理してくれる設定(ディレクティブ)。

エスケープ処理を取り除く時(magic_quotes_gpcがonに対して)

PHPの関数、stripslashes()を使用すれば自動エスケープされる前の文字列に戻せる

$before_str = 'test\'s test';
$after_str = stripslashes($before_str);
echo $after_str;//test's test

■対策

  1. PDO::quoteメソッドを使用する
  2. mysql_escape_stringを使用する
  3. Prepared Statementを使用する

ユーザがSQL文を文字列結合などで組み立てる場合、エスケープ漏れなどが起こりやすい。従って、3番目が最良の手法である。

正規表現でURLを表現しよう

■表記法

(http://|https://)[a-zA-Z0-9\./_\-]+

バックスラッシュ(\)と半角の¥(円マーク)は同義である

■ちょっと解説

  • (http://|https://)はhttp://、もじくはhttps://に一致
  • [a-zA-Z0-9./_\-]は小文字のアルファベット、大文字、数字、ピリオド、\アンダーバー、ハイフンに一致
  • +は直前の項目が1回以上

正規表現でメールアドレスを表現しよう

■表記法

^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$

バックスラッシュ(\)と半角の¥(円マーク)は同義である

以上

■ちょっと解説

  • ^は(次の項目が)行の最初の文字である事を示す
  • []でくくると括弧の中のどれか一文字
  • \wは大文字小文字のアルファベット、数字、アンダーバーに一致。
  • \-は-(ハイフン)に一致
  • \.は.(ドット)に一致
  • +は直前の項目が1回以上

「+」記号をはじいちゃっててスミマセンー

Safari3.0.3バグmemo(1)

■前提

Windows版でのテストである

■ポップアップのバグ(?もしくは仕様?)

  • ポップアップしたウインドウから空のウインドウをひらこうとすると無反応である。
  • という事で前日に、こちらでダウンロード開始したAjax文字化け解析ツールはSafariでのポップアップモードは使用できないなぁ~でもその他のモードは動きます。
  • Safariの2では通常通り起動します。

Ajaxのレスポンス文字化け解析ツール…ダウンロード開始!

Ajaxのレスポンス文字化け解析ツール作りましたの記事で使用したツールと基本的には同じものです。

■注意

  • このツールは自己責任において利用し、作者はこのツールの使用によって生じたいかなる損害についても責任をおいません。
  • ダウンロードして頂いたファイルをサイト上で公開しても構いません。(特に連絡等は頂かなくて結構です)
  • 一部の注意書きを除き、改変、再配布、商用利用は自由に行えます。
  • 不具合が生じた場合はこちらのサイトに御報告いただけると幸いです。

■ダウンロード

ダウンロード←クリックして下さい。

■使用方法

  • ダウンロードしたファイル「charset_tool.zip」を解凍します
  • 解凍するとフォルダの中に同じ名前のフォルダが出来る事があるので注意してください
  • ご使用のサーバーの適当なディレクトリにアップロードします
  • アップしたディレクトリのindex.htmlにアクセスして下さい
  • PHPファイルのリクエストはサーバーが対応していない場合は正しい検証が出来ません

■おまけ

  • Ajaxを使用しておりますので、Ajaxって何なのって人から、Ajax初心者まで勉強できるかと思います

Ajaxのレスポンス文字化け解析ツール作りました

■ツール

手っ取り早く試してみて下さい。(ポップアップでウインドウが開きます)

※IE6 + xmlをリクエスト + リクエストするファイルの文字コードShift-JISまたはEUC-JP + 受け取る形式がresponseText、この組み合わせの場合、ブラウザがフリーズします。つまりこの組み合わせはIE6をフリーズさせる組み合わせでありサイトでは使用してはイケナイ組み合わせという事になります

元のHTMLファイルの文字コード指定

上記をクリックして下さい

■分析結果

サーバーについて
  • 静的コンテンツのリクエストについて、POSTの使用の可否はサーバーの設定に依存する
  • POSTが使えた場合でもWindows2000Firefox2の場合はContent-Lengthがセットされず(もしくはサーバーに必要なヘッダがつかず)411のエラーが返る事がある
推奨できる文字コードとリクエスト

あくまでも個人的な見解です。筆者のコレまでのテスト環境はIE6Firefox2、です。随時増やしていきます

  • もっとも良いのはXMLをreswponseXMLで受け取る場合です(全ての文字コードにおいて文字化けする事なく表示されました)
  • テキストで受け取る場合はUTF-8以外は全て文字化けしました
  • html、jsonの場合はUTF-8以外は全て文字化けしました
  • xhtmlの場合はUTF-8以外は全て文字化けしました(ただし、文字化けしない場合も過去にありドキュメント内の文字に依存している可能性もあり要調査)
  • PHPの場合はheader(“Content-Type: text/html;charset=●●●”);で指定すれば文字化けは防げるようだ。(php.iniの設定にもよる)
ブラウザの違いについて
  • responseTextでXMLを受け取る場合、FirefoxではXMLのエンコード形式を解析しているようであり文字化けはしなかったが、IEではUTF-8以外を受け取ると文字化けしフリーズしてしまった
  • 文字化けする組み合わせの場合、IE6はフリーズする事があるようだ

■おまけ

サーバー、ブラウザの環境に依存するものなので皆さんが各自のサーバーで確かめられるダウンロード版を制作中です。

C:\System Volume Informationフォルダにアクセスしよう

■前置き

  • Windows XP Home Editionにおける解説である
  • 下記の解説におけるピンクのスペースは半角スペースである(分かりやすくするために色をつけてまっす)

以前パスワードを忘れた時に使ったツールがカスペルスキーのソフトでウイルスと判断されてしまった。(このあたりのグレーゾーンのソフトは判断が微妙)

もう使わないし削除したんだがゴミ箱から削除してもシステム復元ツール用のディレクトリに実は残ってしまっていた。

そこでC:\System Volume Informationにアクセスする必要があるのだがWindows XP Home Edition では管理者権限を持っているユーザーでもアクセスが拒否されてしまうのだ。

■アクセス方法:解決策

  1. スタート>ファイル名を指定して実行>cmd>OKをクリック
  2. コマンドプロンプトが立ち上がる
  3. 通常はここで「C:\Documents and Settings\(ユーザー名)」が表示される
  4. 「cd ..」と入力しエンターキー
  5. もう1回同じコマンドを実行しC:\>と表示される
  6. (マニュアルより抜粋)「cacls “driveletter:\System Volume Information” /E /G username:F」と入力しエンター。これはアクセス権の設定をフルコントロールにしている

(つっこみ)driveletterは通常「Cとなり、usernameは「(貴方のwindowsにログインしてる名前)となる。

つうか普通のユーザーはコマンドプロンプトなんて使わないから、マニュアルの記述じゃわからんだろっ!

  1. そしたらしたい作業(オレの場合はファイルの削除)をする
  2. 上記の作業は特にコマンドプロンプト上で作業する必要はない
  3. 「cacls “driveletter:\System Volume Information” /E /R username」を実行し指定ユーザーのアクセス権を削除する

■注意

ユーザー名にスペースが含まれている場合”(ユーザー名)”とダブルクォーテーションでくくるようにしてください。これはコマンドプロンプトにおける「半角スペース」が特別な意味を持つ為です

以上。

■おまけ

XPのProfessionalなどをご利用の皆様をはじめオフィシャルサイトのマニュアルも参考にしてみて下さいね

IE特有のJavaScriptの挙動…名前空間の,(カンマ)

■名前空間について

名前空間とは

名前空間はソースコード上で冗長な命名規則を用いなくても名前の衝突が起こらないようにし、しかもそれを容易に記述できるようにするためだけの概念

簡単に書くと

例えばaction();という関数を使うとして、もうひとつ全く別のaction();という関数を作ると動作しなくなる。別の名前にすれば良いのだがソースが数千行にもなり、他人が書いたとしたら関数名を決めるだけで毎回全てのソースコードを調べなければいけない。名前空間があれば衝突を回避できる。

■JavaScriptの名前空間とは

C#やPerlなどは言語仕様として名前空間があるが、JavaScriptには無いのでJSON記法を利用し、

var nameSpace = {
    name : "JustOnePlanet",
    display : function(){
        alert(nameSpace.name);
    }
}

というように記載する

■IE特有のエラー

    display : function(){
        alert(nameSpace.name);
    }

    display : function(){
        alert(nameSpace.name);
    },

誤ってカンマを書いてしまうとIEのみでエラーがでます。結局ミスタイプしただけですが、Firefoxだと問題なく動作します。(但し、カンマが無い方が正しい記述である)

■上記名前空間の使い方

  • “JustOnePlanet”にアクセスするにはnameSpace.nameと書く
  • nameSpace.display();と記述する事により関数を実行できる

display();と記述しても関数にはアクセスできない。これが名前空間の意義。