2011年5月23日月曜日

JavaScript The Good Parts 1、2章



1章


とくにないけど、以下の定義はたびたび利用されるので、覚えておく。



Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};


いちいちprototypeって書かなくていいのと、thisを変えすことでメソッドを続けて呼べる(カスケード)がメリット


2章 文法



  • 名前

    • undefined,NaN,Infinityは予約語ではない。



  • 数値

    • jsは数値型が1つ。1と1.0は同じ。

    • NaNは数値を生成できない計算をした場合に得られる。NaNはどんな値ともイコールにならない。NaNとも。isNaN関数を使用すること。

    • 数値はメソッドをもつ



  • 文字列

    • 16bit長

    • プロパティとメソッドをもつ



  • 命令文

    • スコープはグローバルor関数スコープ

    • varを付けると関数内のプライベート変数

    • if文などはブロックを形成しないので、変数の宣言は、関数内の先頭で行う。(関数スコープは存在する)

    • 偽と評価されるもの。以下以外は真。

      • false

      • null

      • undefined

      • 空文字列''

      • 0

      • NaN



    • switchのcaseは式でもいい。case x+y:

    • for in はプロパティ名かキー名を列挙するが、プロトタイプチェーン上のものと区別するために以下のようにする。





for (myvar in obj) {
if (obj.hasOwnProperty(myvar)) {

}
}




    • try{}catch(e){}finally{}

      • try内で例外が投げられると、catchが引数に例外オブジェクトを受け取り、処理。finallyは例外に関わらず必ず実行される。



    • throw:例外を発生させる

      • 例外がtry外で起こった場合、実行を中断して、呼び出し元でtryがあれば処理を移動する。

      • 通常throwにはname,messageプロパティを含ませる。



    • returnと式の間に改行はダメ、breakとラベルの間に改行はダメ。





    • typeofはnumber,string,boolen,undefined,function,objectを返す。

      • null,配列はobjectを返す点に注意。





  • リテラル

    • オブジェクトのプロパティ名はリテラルとして扱われるので、コンパイル時に正体がわからない変数は使用できない。







2011年5月15日日曜日

Perlの文字コード周り



perl - Encode 入門
perl - Encode 中級
perl - use utf8; #って何だ?
Perl で utf8 化けしたときにどうしたらいいか


use utf8って何よ



  • (ASCII領域外の)各文字列にutf-8を示すフラグを付ける。

  • ソースコードがutf-8であること前提

    • エディタでutf-8で書く必要がある。





基本の流れ



  • 入力データの文字コード->utf-8に変換

  • utf-8から元の文字コードに戻して出力




# ecu-jpからutf8に、決め打ちで変換
use Encode.pm
my $utf8 = decode("eucjp", $_); //ecujpをutf-8に変換 フラグも付ける。
print encode("eucjp", $utf8);



変換しないと。。。

・正規表現など、検索がマッチしない。
・utf-8とそうでない文字列を結合すると、文字列全体がutf-8扱いになるので、文字化けする。


decodeとencodeの覚え方


perl側から見て、バイト列に符号化(encode)するか、perlの内部表現に復元(decode)するか


入力コードを判定して変換


Encode::Guess
suspects(容疑者)に、変換候補を書いておく(完璧に判定するのは不可能なため?)



use Encode::Guess;
Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);




変換元コード決め打ち&頻繁に変換 => find_encoding


以下の'eucjp'など、名前判定しなくていいので高速。
(encode,decodeは内部でfind_encodingを使用している)



# 変換元コード決め打ち&頻繁に変換
use Encode.pm
my $eucjp = find_encoding('eucjp');
my $utf8 = $eucjp->decode($_);
print $eucjp->encode($utf8);



ファイルを開く際に文字コード指定(変換元コード決め打ち)



#use Encode.pm <- :encodingはPerlIO機能なのでいらない
open my $fh, "<:encoding(eucjp)", $argv or die "$argv : $!";




utf-8 フラグの確認



use Devel::Peek;
Dump($x);


SV~LENまでが一塊。
FLAGSにUTF8があるかどうかで判断。


エラー処理


エンコードに失敗した場合、encode,decodeの第3引数でエラー処理を実施できる。

以下の定数は変換できなかった場合、実体参照にする。



Encode::FB_HTMLCREF #10進数
Encode::FB_XMLCREF #16進数
Encode::FB_PERLQQ  #perl表記 \x{ }


サブルーチン(クロージャ)を渡すことも可能



EUC-JPやShift_JISで扱えない文字も、HTMLやXMLではCharacter Reference (文字参照;CREF)という方法で表記することが可能です。例えば、☺は&#9786;または&#x263A ;と表記すればいいのです。前者はその文字のUnicodeを10進数表記、後者は16進表記したものです。




エラーメッセージ


  • Wide character in print at ...

  • UTF8フラグが付いているのをprintしているので、encode('utf8', $text);



OOP


Encode::Encoder


ルール追加



  • 動的: Encode::Encoding

  • 静的: enc2xs



ちなみに


\x{3000} は全角空白