書評: 『ハイパフォーマンス JavaScript』 Nicholas C. Zakas 著, 水野 貴明 訳

ハイパフォーマンスJavaScript

ハイパフォーマンスJavaScript

『ハイパフォーマンス JavaScript』 を読み終わりました。 簡単に内容についてと感想を書いておきます。

続きを読む

pg_stat_statements を使って遅いクエリを見つける (PostgreSQL, Ubuntu 10.04)

PostgreSQL などのリレーショナルデータベース (RDB) に対して発行されたクエリのうち、どのクエリで時間がかかっているのかを調べることは重要です。 そのための手段は色々ありますが、ここでは PostgreSQL のバージョン 8.4 以降で使用できる pg_stat_statements について、Ubuntu での使い方を説明します。

続きを読む

Java プログラマのための C# 入門 (#4 クラス定義の応用的なことと演算子のオーバーロード)

#3 クラス定義の基本とメソッド」 に引き続き、今回は C# のクラス定義の応用的なことを書いていきます。 C# のクラスには、Java にはないプロパティやインデクサというものを定義できます。 また、演算子オーバーロードすることもできます。

参考にしている書籍は 『独習 C#』 です。

続きを読む

Java プログラマのための C# 入門 (#3 クラス定義の基本とメソッド)

#2 配列と文字列」 に引き続き、今回は C# のクラス定義の基本とメソッドのパラメータについて Java との違いをメモしておきます。 参考にしている書籍は 『独習 C#』 です。

C# のクラスに関して、フィールドやメソッド、コンストラクタについてはほとんど Java と同じですが、インデクサやプロパティといった Java にはないものも定義できます。 また、メソッドに関して、パラメータを参照渡しにしたり、可変個数のパラメータを受け取るようにすることもできます。 今回はクラス定義の基本と、パラメータの参照渡しや可変個数のパラメータを受け取るメソッドの定義について。 インデクサやプロパティなどについてはまた次回書きます。

続きを読む

Java プログラマのための C# 入門 (#2 配列と文字列)

#1 プリミティブ型と制御構文」 に引き続き、今回は C# の配列についてと文字列について Java との違いをメモしておきます。 参考にしている書籍は 『独習 C#』 です。

続きを読む

Java プログラマのための C# 入門 (#1 プリミティブ型と制御構文)

最近 C# の勉強をしているので、JavaC# の差異をメモ程度に書いておきます。 タイトルには 「C# 入門」 と書いていますが、「Java プログラマC# を使うときに気をつけるべきこと」 という程度に解釈してください。 Java を知っていればとりあえず C# のプログラムは書けると思いますが、色々と違いがあって気をつけなければいけないところがありますので、そういった気をつけなければいけない点をまとめておこうというのがこの記事の趣旨です。

今回は、書籍と開発環境の紹介と、プリミティブ型と制御構文について書きます。

続きを読む

JavaScript の正規表現マッチング

JavaScript正規表現 (RegExp オブジェクト) を使ってマッチングする方法。 しょっちゅう忘れてしまううえに ECMAScript 仕様に適合した方法があまり web 上に書かれていないようなので軽くメモしておきます。

RegExp.prototype.exec( string ) メソッド

正規表現のマッチングを試して、マッチした文字列全体とキャプチャリングした文字列を取得するためのメソッドが RegExp.prototype.exec( string ) メソッドです。

このメソッドは、マッチングが成功した場合は Array オブジェクトを返します。 その Array オブジェクトの第 0 要素はマッチした部分文字列全体です。 正規表現にキャプチャリングが含まれていた場合は、Array オブジェクトの第 1 要素以降に、順番にキャプチャリングされた文字列が格納されます。 さらに、この Array オブジェクトには index プロパティと input プロパティが定義され、それぞれの値は、正規表現が文字列にマッチした開始位置とマッチングの対象になった文字列全体です。

また、RegExp オブジェクトの global フラグが true であるならば、マッチした部分の最後の文字の次の文字の位置が、RegExp オブジェクトの lastIndex プロパティに保持されます。 同じ RegExp オブジェクトを使って再び exec メソッドを実行すると、そのときのマッチングは lastIndex プロパティの値から再開されます。 よって、while ループでマッチしなくなるまで繰り返す、ということが可能です。

なお、マッチしなかった場合には exec メソッドは null を返します。

// global フラグを true にした RegExp オブジェクト
var re = /<(\d+),(\d+)>/g;
var m;
// マッチする部分がある限り繰り返す
while( m = ( re.exec( "ab<32,43>cddd<faa>da<342,2>bcaaeabc" ) ) ) {
    // マッチした部分の開始位置
    print( m.index );
    // マッチした部分文字列全体 (Ruby などでは $& で参照できる)
    print( m.shift() ); // (第 0 要素だけを取り出している)
    // キャプチャされた部分 (Ruby などでは $1, $2, ... で参照できる)
    print( m.join( ", " ) ); // (元々の第 0 要素は既に取り出したので, 残りはキャプチャされた部分のみ)
}

JavaScript でも、バージョンによっては RegExp['$&'] としてマッチした部分文字列全体を参照したり RegExp.$1, RegExp.$2, ... としてキャプチャされた部分を参照できたりしましたが、非推奨となっており、使わないようにした方がいいでしょう。 (ちなみに RegExp.$& は基本的に構文エラーになってしまうので、RegExp['$&'] と書く必要がある。)

参考文献