がるの健忘録 このページをアンテナに追加 RSSフィード

2006-05-15

[][][]巷のソースちぇ〜っく:Perl

ふと思い出した…どこぞの掲示板に実在するソースなのですが。

  ファイルopen
  ロック開始
  ファイル読み込み
  ファイルclose

  データ処理

  ファイルopen
  ロック開始
  データ書き込み
  ロック解除
  ファイルclose

………。googleその他のランキング見てる限り「結構有名どころのフリーウェア掲示板」です。

何ゆえにこーゆーロックもどき構造に至ったのか、ちと興味ありあり。

とりあえず「fseekくらいは覚えとこうね」って感じでしょうか?

2006-04-27

[][][][]その値は数字? 数値?

直接的にはPHPなのですが、まぁPerlでもほぼ確定で同様のことが起きると思うので、あわせて。

型がしっかりした言語ではおきにくい事故なのですが…多分。型が暗黙に色々といじくられてしまう言語は、多分「プログラマの脳内でも自動補完」がなされてしまい、結果的に物凄いことが時々起きます。

直接的具体的には、こんな事象でした。


ビットマスク関連の計算がありまして。「1バイト値のうち、上位nビットを残し、それ以下をマスクする」系の処理を連想してください。

例えばnが4であれば、1111 0000(0xf0)を、目的とする値にぶつけて論理演算すればよいのですが。

ここで、間違えて

  $base_num = "11110000";

とやってしまいました。

恐らくは頭の中で無意識にこの値を「二進数として」取り扱うつもりだったのでしょう。

でもスクリプト言語では、これは「一千百十一万」という10進数として取り扱われてしまいます。以降この値を使って論理演算すれば以下略。


これ以外にも。例えば"0"というものを見たときに、スクリプトではこれを「数字」としても「数値」としても扱えてしまいます。でも、実際には数値と数字はまったく違うものです。

数値は「値」であり、メモリの中に格納されている実際の値です。

数字は「文字」であり、それは「ある値を文字としてあらわしたときに出てくるもの」です。

マシン語でVRAMとかやってるとよくわかるんですけどねぇ(苦笑

多分、ここを読んでる人の多くは「わかっている」ことだと思うのですが。あなたが「教えている」人はちゃんと理解できてますか?

…っていうのを、自戒を込めて書いてます(笑

2006-04-19

[][][][]なまほげ君登場予告(笑

んっと。…PHP君、色々と面倒な挙動が多すぎです。なので、

  • <?phpより前、或いは?>より後ろに1bit足りとでも余分なデータは認めない
  • 全角空白みつけたらワーニング
  • 先日発見した「引数の数」のチェック

をしてくれる「Perlの」プログラムでも書いてみようかなぁと(笑

ノリとしては、ナマハゲのように「行儀の悪いプログラム いねが〜」って感じでソースコードをホゲホゲするのでなまほげ君(笑

…いつになったら出来上がることやら(苦笑

2006-01-16

[][][]FF XI のマクロをPerlで切り出す

えっと…本気でメモなのですが。

Final Fantasy XI online ってのがありまして。で、PC(Windows)版ってのがあるのですが。

マクロ周りでチェックをいれてみたのですが…

mcr9.dat

とかって名前で入ってるのはいいのですが…もろバイナリなんです。

んで…私のように「PS2と混在」の場合、とりあえずPC版のマクロのリストとかが作りたくなりまして。でもバイナリを読み上げるのはちょっと人としてどうかと思いまして。


でまぁ「取り合えず簡易的に抜き出すっぽいPerl」を作りました。

文字コードは変換してないですし(元々はShift JIS)、かなり作りも荒いのですが。

まぁ本格的に使いたかったら適当に修正してください :-P


ってか…同アカウント内であれば、PCとPS2とでマクロのやり取りくらい通信とかでやりたいよぉ ;;


そうそう。

tab変換した文字列は、:で囲まれてよくわからんバイナリ化しています。

そんなんの辞書なんぞ用意するほど丁寧じゃありません(笑

#!/usr/bin/perl

$fn = "./" . $ARGV[0];

open (IN, $fn);
$data = "";
while(<IN>) {
  $data .= $_;
}
close(IN);

#
my @ret;
$count = 0;

sub cut { my ($a) = @_; $count += $a; }
sub add {
  my ($a) = @_;
  $wk = substr($data, $count, $a);
  $wk =~ s/[\x00]//g ;
  $wk =~ s/[\xFD]/:/g ;
  $count += $a;
  push @ret, $wk;
}

# 初期ヘッダ切り出し
cut(28);

# データ取得
for($i = 0; $i < 20; $i ++) {
  add(61);
  add(61);
  add(61);
  add(61);
  add(61);
  add(61);
  add(14); # タイトル
  push @ret, "------";
}

# 出力
$fn = $fn . ".txt";
open (OUT, "> $fn");
foreach $wk (@ret) {
  print OUT $wk . "\r\n";
}
close(OUT);

2006-01-06

[][][]DBD::mysqlのインストール

PerlのDBD::mysqlのインストール関連のお話です。


基本は

http://y-kit.jp/saba/xp/cpan.htm

を参照していただくのがぐっどなのですが…ちょいとはまったところなどを軽くメモ。


そうそう。私は

/opt/db/mysql-バージョン番号

にインストールしてますんであしからず。


とりあえず

ln -s /opt/db/mysql-4.0.24/bin/mysql_config /usr/local/bin/mysql_config

しておきます。

んで…


まず最大のポイントは

 /usr/local/mysql/bin/mysql_config --libs

で、吐き出されたデータをメモ。次に、

 /usr/local/mysql/bin/mysql_config --cflags

で、吐き出されたデータをメモします。

のあたり。

ディレクトリの指定には気をつけましょう。特にMySQL 4.0系を使いたくて別途インストールしたんだけど「実はディストリビューションが自動的に4.1系とか5系とかをインストールしてくれちゃってた」なんてときに地獄を見ます(苦笑


ようはinclude先の問題だったのですが。

通常、/usr/include/mysql配下に入ってる…と思ってつい「4.1系のincludeファイルをとりこんでしまう」と、

make test でエラーが出るわ、実際にconnectしようとすると

/usr/bin/perl: symbol lookup error: /usr/local/lib/perl5/site_perl/5.6.2/i586-linux/auto/DBD/mysql/mysql.so: undefined symbol: mysql_autocommit

とかって怒られたりします。

そりゃまぁ mysql_autocommit は4.1系からの導入だから、4.0系のsoファイル見てれば「ないのは当然だよねぇ」って話になるのですが。

具体的には mysql_version.h ファイルにあります MYSQL_VERSION_ID っていう定数を使って#if つかってコンパイルを色々やってるわけでして。

これで4.1系のincludeファイルみてれば、そりゃおかしなことになりますって(苦笑


というわけで。私の場合

perl Makefile.PL --cflags=-I/opt/db/mysql-4.0.24/include/mysql "--libs=-L/opt/db/mysql-4.0.24/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm"

というコマンドでOKになるわけです、はい。


そうそう。一応、コンパイル後の

/usr/local/lib/perl5/site_perl/5.X.X/iX86-linux/auto/DBD/mysql/

付近にあるんじゃないかと思われる

mysql.so

を ldd mysql.so して、依存ライブラリ関連はチェックしておきませう。

libmysqlclient.so.12 => /opt/db/mysql-4.0.24/lib/mysql/libmysqlclient.so.12 (0x40011000)

libz.so.1 => /usr/lib/libz.so.1 (0x4004f000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x4006b000)

libnsl.so.1 => /lib/libnsl.so.1 (0x40099000)

libm.so.6 => /lib/libm.so.6 (0x400af000)

libc.so.6 => /lib/libc.so.6 (0x400d2000)

/lib/ld-linux.so.2 (0x80000000)

これでもしlibmysqlclient.so が libmysqlclient.so.14とかなってたりすると、4.0系を使いたい的にはのーぐっどかもしれないです。


…これだけのために結構深いところまでDBI.pm触ったりmysql.pm触ったり色々してしまった……