No Such Blog or Diary
C#-mode (csharp-mode)
- 2005-02-16 (Wed)
- ソフトウェア ( Meadow/Emacs ) プログラミング ( C/C++/C# )
Meadow/Emacs の C#-mode (csharp-mode) を発見.http://www.davh.dk/script/ で公開されている.csharp-mode.el を site-lisp ディレクトリに入れて,.emacs に
(autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t) (setq auto-mode-alist (cons '( "\\.cs\\'" . csharp-mode ) auto-mode-alist ))
のエントリを追加すると使用可能.
Visual Studio.NET2003 を持っているにもかかわらず,Meadow で書いてコマンドラインでコンパイルするというあほなことをやっている.
ちなみに,コマンドラインでコンパイルするには
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat
を実行して環境変数を適当に設定させるらしい.
- Comments: 0
- TrackBack (Close): -
最萌トーナメントの集計スクリプト
- 2005-02-16 (Wed)
- プログラミング ( sed/wake/awk )
AWK の勉強のためとの建前で 第2回東方最萌トーナメント の集計スクリプトを書いてみた.スレッドの番号を入れると wget でページを落としてきて解析して gnuplot でグラフを描いてくれる.あほだ...
- Comments: 0
- TrackBack (Close): -
AWK - match と substr
- 2005-02-16 (Wed)
- プログラミング ( sed/wake/awk )
AWK 使いはじめて一時間ほどはまっていたのが,直前の正規表現でマッチした部分の取り出し方だった.ruby やら perl やらではそれらは簡単にできるのだが(特別な変数に入る),awk はそこまではできないらしい.結局 awk で正規表現でマッチした部分を取り出すには,match と substr あたりを使う必要があるとの結論に達した.
例えば, hh:mm 見たいな時間の表示を取り出すには
pos=match($0, /[0-9][0-9]:[0-9][0-9]/) if(!pos) next timestr = substr($0, pos, RLENGTH)
などのようにする.
match で正規表現をマッチさせて,返り値でその開始位置を取得し(RSTART変数にも入る),長さが RLENGTH に入っているのでその分を substr で取り出すという手順になる.マッチに失敗したときは 0 が帰るらしい.コード中ではマッチしなかった場合に next を呼ぶようにしている.
- Comments: 0
- TrackBack (Close): -
AWK - はじめ
- 2005-02-16 (Wed)
- プログラミング ( sed/wake/awk )
awk のプログラム(スクリプト)は
pattern { action } pattern { action } ....
という構造にjなっている.pattern は /regex/ などのような正規表現や,BEGIN, END のような全ての最初と最後を意味するものがある.
入力はレコードセパレータ(RSという変数に入っている)によってレコードに分割され,全ての pattern に対してマッチが取られ,マッチしたときにはその pattern の action が実行される.デフォルトではフィールドセパレータは改行コードなので,一行が一レコードになってる.
例えば,外部から TARGET という変数に何か値を渡してあげて,"Start of TARGET" から "End of TARGET"までのレコードを出力するようなのは以下のとおり.
BEGIN { FLAG=0 STARTPat="Start of "TARGET ENDPat="End of "TARGET } //{ if($0 == ENDPat){ FLAG = 0 } if(FLAG) print if($0 == STARTPat){ FLAG = 1 } }
BEGIN で最初に変数を初期化しておいて,その後ろの //{...} で全てのレコードに対してマッチして処理をしている.これをファイル(split.awk)に保存して
awk -f split.awk -v TARGET=1st < in.dat
とかやると, in.dat の中の "Start of 1st" から "End of 1st"までの行が取り出せる.
ちなみにレコードはフィールドセパレータ(FSという変数)で分割されて,各フィールドは $i (i=1,2,...,NF) で取り出せる.$0 はレコード全体.出力は print で,引数を省略すると print $0 の意味になる.
詳しくはマニュアル参照.
- Comments: 0
- TrackBack (Close): -