dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

mysqlの正規表現

2010-12-22 23:45:51 | linux
mysqlのregexpをいろいろ試してみました。

mysql> select 'abcd' regexp '(b|bc)';
+------------------------+
| 'abcd' regexp '(b|bc)' |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)


この↓表記方法だとエラーになります。
mysql> select 'abcd' regexp 'b(|c)';
ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp

たぶん普通の文字列ならマッチしないであろう[.NUL.]を使えばエラーになりません。
メリットがあるかは別として。
mysql> select 'abcd' regexp 'b([.NUL.]|c)';
+------------------------------+
| 'abcd' regexp 'b([.NUL.]|c)' |
+------------------------------+
| 1 |
+------------------------------+
1 row in set (0.00 sec)





前方一致する文字列を判定する正規表現

2010-12-21 01:17:45 | ruby
いくつかの文字列の中から、特定の文字列に前方一致するものを判定する方法です。
ちょっと強引ですが、正規表現でも実現できます。

【プログラム】

def make_prefix_match_regexp(str)
restr = '^'

cs = str.split('')
cs.each do |c|
restr << '(?:|' + Regexp.quote(c)
end

restr << ')' * cs.length + '$'

return restr
end


restr = make_prefix_match_regexp('http://test.jp/index.html')
re = Regexp.new(restr)
print("[#{restr}]\n")

['http://test.jp/',
'http://test.com/',
'http://test.jp/index.html',
'http://test.jp/index.html?p=1'].each do |str|
res = str =~ re
print("#{str}: [#{res.to_s}]\n")
end


【実行結果】
[^(?:|h(?:|t(?:|t(?:|p(?:|:(?:|/(?:|/(?:|t(?:|e(?:|s(?:|t(?:|\.(?:|j(?:|p(?:|/(?:|i(?:|n(?:|d(?:|e(?:|x(?:|\.(?:|h(?:|t(?:|m(?:|l)))))))))))))))))))))))))$]
http://test.jp/: [0]
http://test.com/: []
http://test.jp/index.html: [0]
http://test.jp/index.html?p=1: []




FirefoxでXMLパースエラーにしない方法

2010-12-15 23:06:45 | Firefox
Firefoxで整形式ではないXMLを閲覧しようとすると、パースエラーになってしまいます。

XML パースエラー: 整形式になっていません。
URL: http://mobile.goo.ne.jp/
行番号: 35, 列番号: 64:
---------------------------------------------------------------^

Firefoxの拡張機能の Force Content-Type を使うと、指定のURLパターンで Content-Type を変更できるので、application/xhtml+xml を text/html に変換すると、XMLパースエラーにならずにページを閲覧することができます。

mysqlコマンドの出力結果のエスケープの無効化

2010-12-15 01:01:36 | linux
mysql コマンドのオプションで -r をつけると、たとえば文字列中の\tがエスケープされずにタブとして出力されるようになります。

■-r なし
% echo "select '[\t]';" | mysql -s
[\t]

■-r あり
% echo "select '[\t]';" | mysql -s -r
[ ]



mysqlのテーブル情報

2010-12-14 00:34:51 | mysql
mysqlのテーブルサイズなどを取得する方法です。
行数を一気に取得できるので便利です。

【SQL】
select
table_schema db
, table_name tbl
, concat(round(table_rows/1000, 2),'k') rows
, concat(round(data_length/(1024*1024), 2),'M') data
, concat(round(index_length/(1024*1024), 2),'M') idx
, concat(round((data_length+index_length)/(1024*1024), 2),'M') total_size
from
information_schema.TABLES
order by
db asc
, tbl asc
;

【実行結果】
db tbl rows data idx total_size
db1 tbl1 490.50k 100.63M 39.67M 140.30M
db1 tbl2 1215.99k 72.69M 76.75M 149.44M


rubyのファイナライザ

2010-12-10 23:37:42 | linux
ObjectShare.define_finalizerを使って、クラスの終期化処理をしてみました。

■プログラム

class TestObjectShare
@@obj = nil

private
def initialize()
print("初期化処理\n")
end

def self.finalizer()
proc do
print("終期化処理\n")
end
end

def self.do_something()
if ! @@obj
@@obj = self.new
ObjectSpace.define_finalizer(@@obj, TestObjectShare.finalizer)
end

print("メソッド実行\n")
end
end


TestObjectShare.do_something

■実行結果
初期化処理
メソッド実行
終期化処理


プログラム終了時に終期化処理が行われています。

flasmのつづき

2010-12-04 21:32:48 | linux
flasmの逆アセンブル結果はstdoutに出力することができます。

% flasm -d XXX.swf

URLを抽出するなら、出力結果から push 'http~' を検出すればよいですね。





flashからのURL抽出

2010-12-03 23:33:21 | linux
flashファイルからURLを抽出する方法です。

■flasmのインストール
flasmはSWFファイルの逆アセンブラです。

% gunzip flasm16src.zip
% make
% sudo make install

■flashファイルからのURL抽出
% flasm XXX.swf
で XXX.flm が作成されます。

% cat XXX.flm
...
defineMovieClip 171 // total frames: 55

frame 0
push 'URL11'
push 'http://xxx.co.jp/'
...

push 'http://...' となっている行を抽出すれば、URLを抽出できますね。



diffの改行の扱い

2010-12-03 02:55:06 | linux
diffでは、行末の改行は無視して比較するようです。

■file1.txt
abc<LF>
def<LF>

■file2.txt
abc<LF>
def

% diff file1.txt file2.txt; echo $?
0

ということで、行末の改行は無視して比較されています。

flashからのテキスト抽出(プログラム編)

2010-12-02 00:40:21 | linux
SWFファイルからテキストを抽出するプログラムです。
perlプログラムの標準入力にSWFファイルを入力すると、
標準出力にSWFから抽出されたテキストを出力します。


#!/usr/bin/perl
#
# SWF からテキストを抽出
#

use strict;
no encoding;
use warnings;
use SWF;
use SWF::Parser;
use SWF::Element;

sub header_callback
{
my($self, $signature, $version, $length,
$xmin, $ymin, $xmax, $ymax, $framerate, $framecount) = @_;
}

sub tag_callback_text
{
my($self, $tag_no, $length, $datastream) = @_;

# SWF::Element::Tag生成
my $e;
eval {
$e = SWF::Element::Tag->new(Tag => $tag_no, Length => $length);
$e->unpack($datastream);
};
if ($@) {
STDERR->print($@);
return;
}

# テキストを出力
if (eval { $e->isa('SWF::Element::Tag::DefineEditText') }) {
print($e->InitialText);
}
}


#
# メイン
#
my $parser = SWF::Parser->new('header-callback' => \&header_callback,
'tag-callback' => \&tag_callback_text);

# 読み込み
my $data = '';
while (my $line = <STDIN>) { $data .= $line; }

$parser->parse($data);

flashからのテキスト抽出(インストール編)

2010-12-01 00:41:03 | linux
flashからテキストを抽出する目的で、必要なものをインストールします。

■1. ming のインストール
flashムービーを生成するためのライブラリ。

% gtar zxvf ming-0.3.0.tar.gz
% cd ming-0.3.0
% ./configure
% make
% sudo make install


■2. ming-perl のインストール

% gtar zxvf ming-perl-0.3.0.tar.gz
ming-0.3.0/perl_ext にファイルが展開される
% cd ming-0.3.0/perl_ext
% perl Makefile.PL
% make
% sudo make install


■3. Data-TemporaryBag.pm のインストール
% gtar zxvf Data-TemporaryBag-0.09.tar.gz
% cd Data-TemporaryBag-0.09
% perl Makefile.PL
% make
% sudo make install


■4. SWF-File.pm のインストール
% gtar zxvf SWF-File-0.42.tar.gz
% cd SWF-File-0.42
% perl Makefile.PL
% make
% sudo make install