Sep 09, 2013

Perl で grep.pl

UNIX/Linux のコマンドに lv/lgrep というのがあります。ぽちは UTF-8 や CP932、EUC-JP や 7bitJIS の各日本語文字エンコーディングに跨ってテキストファイルの中身を検索するのに使っています。この lgrep を、ぽちが普段使う機能の範囲だけ、Windows上の Emacs を通して使えるように、Perl で書いてみました。

grep.pl

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Encode qw/ encode decode /;
use Encode::Guess qw/ euc-jp cp932 iso-2022-jp utf8 /;
use Encode::Locale;
use Getopt::Std;

my %opts;
getopts 'n', \%opts;

my $expr = decode 'console_in', shift @ARGV;
my @trg = map { glob } @ARGV;

for my $file ( @trg ) {
    -f $file or next;
    open my $fh, '<', $file or die "Couldn't open $file: $!";
    my $str = join '', <$fh>;
    close $fh;
    $str or next;

    my $encobj = Encode::Guess->guess( $str );
    my $enc;
    unless ( ref $encobj ) {
        $enc = 'utf8';
        warn "Couldn't guess: $encobj. $file is decoded by $enc.\n";
    } else {
        $enc = $encobj->name;
    }
    my @decoded =  split "\n", decode $enc, $str;

    my ( $i, @linum, @greped, @maped );
    for my $line ( @decoded ) {
        ++$i;
        if ( $line =~ /$expr/g ) {
            push @greped, $line;
            push @linum, $i;
        }
    }

    for my $greped ( @greped ) {
        my $linum = shift @linum;
        if ( $#trg > 0 ) {
            if ( $opts{ n } ) {
                push @maped, "$file:$linum:$greped";
            } else {
                push @maped, "$file:$greped";
            }
        } else {
            if ( $opts{ n } ) {
                push @maped, "$linum:$greped";
            } else {
                push @maped, $greped;
            }
        }
    }

    my $encoded = encode 'console_out', join "\n", @maped;
    print $encoded, "\n" if $encoded;
}

__END__

使い方はこんな感じ。

C¥> perl grep.pl -n 金剛 kiniro_mosaic_utf8.txt kongou_mosaic_euc-jp.txt kan_colle_cp932.txt sasebo_kaigunbochi_7bitjis.txt
kongou_mosaic_euc-jp.txt:3:英国生まれの金剛デース!!
kan_colle_cp932.txt:7:金剛 「Hi!今日も良い天気ネー!」
sasebo_kaigunbochi_7bitjis.txt:14:地元住民には海軍墓地として知られる佐世保市東公園には、金剛・加賀・飛龍・瑞鳳・大鷹・矢矧の慰霊碑が存在する。

第一引き数には正規表現を受け取るので、正規表現のメタ文字が含まれる文字列をそのままの形で検索したい場合には、メタ文字をバックスラッシュでエスケープしてあげて下さい。

Posted at 12:59 in perl | Permalink | Comments/Trackbacks ()

Sep 03, 2013

Perl で cat.pl

UNIX/Linux のコマンドに cat というのがあって、ぽちは主にテキストファイルの中身を表示させたり、バイナリファイルを結合するのに使っています。先日、Windows上でバイナリファイルを結合しなければならなくなり、Unixコマンドの cat相当のものを Perl でざっと書いてみました。

cat.pl

#!/usr/bin/env perl

use strict;
use warnings;

binmode STDOUT;

while ( <@ARGV> ) {
    open my $fh, '<', $_ or die "Couldn't open $_: $!";
    binmode $fh;
    print while <$fh>;
    close $fh;
}

コードを見ての通りですけども、こんな感じで使います。

C¥> perl cat.pl file1 file2 file3 > catenated_file

Windows上でバイナリファイルを扱わなきゃいけないので、ファイルハンドルを通しての遣り取りでは binmode を使っています。

と、ここまでは良かったのですけども、これを書いた直後に Windows のコマンドの copy で、

C¥> copy /b file1+file2+file3 catenated_file

とバイナリファイルの結合が出来る事が発覚して、全部無意味になってしまいました……。

Posted at 19:55 in perl | Permalink | Comments/Trackbacks ()

Aug 02, 2013

当ブログのコメント&トラックバック機能を停止します

ぽち*ろぐのコメント欄にびっくりするぐらい大量のスパムコメントが押し寄せてしまいました。この所記事の更新もあまり無く、ましてや訪れてコメントに書き込みして下さる方も絶えて久しいので、いっその事と思ってブログからコメントやトラックバックのプラグインを取り外してしまいました。どうしても犬山ぽち丸に伝えたい事がある方は、Twitterアカウントの pochimarui まで @ を飛ばすか pochi@hoshinoumi.net までメールをお送り下さいませ。

コメントやトラックバックを使わないんだったら、ブログ形式で記事を書く理由がほとんど無くなってしまいました。[犬]ω;)

Posted at 19:39 in 日記 | Permalink | Comments/Trackbacks ()

Jul 14, 2013

Flash Player を導入して Linux で『艦これ』を遊ぶ

2014/09/07追記:この記事を書いた当時とは違って、現在の艦これでは、以下の記事を参考にして Linux で艦これを遊ぶ事は出来ません。特に拘りが無い限りは Webブラウザに Linux版の Google Chrome を利用するのが Linux で艦これを遊ぶのには簡単です。(FireFox や Iceweasel等の他の Webブラウザで艦これを遊ぶ方法もあります。)

ぽち、相変わらずブラウザゲームの『艦これ』にハマっています。ユーザー数がとうとう十五万人を突破して、ブラウザゲームとしては破格のヒットになって来てるみたいですね。

艦これ母港画面201307141425サムネイル

明らかに Windows でも Mac でも無いデスクトップ画面を見ての通り、ぽちは Linux上で、具体的には debian wheezy上で iceweasel 17.0.7 という Webブラウザを使って艦これを遊んでいます。艦これは Flash Player を利用したゲームなので、当然、Webブラウザだけでは動きません。艦これを遊ぶ為には Linux向けの Flash Player を adobe の公式サイトからダウンロードして来て適切な場所に置いてあげる必要があります。

Flash Player のダウンロード時の画面

そこで「その他の Linux用.tar.gzファイル」を選択してダウンロードすると、install_flash_player_11_linux.i386.tar.gz というファイルがやって来るので、これを展開します。

$ tar zxvf install_flash_player_11_linux.i386.tar.gz

展開して出て来た libflashplayer.so というファイルが Flash Player の本体なので、これを /usr/lib/mozilla/plugins/ か ~/.mozilla/plugins/ に置いてあげると iceweasel で Flash Player が利用出来るようになります。

艦これもニコ動もこれでオッケー♪

ついでに、展開して出来た usr/bin/flash-player-properties も /usr/local/bin/ か実行パスを通した ~/bin/ に置いておくと便利です。

Posted at 16:17 in linux | Permalink | Comments/Trackbacks ()

Jun 27, 2013

『艦これ』はじめました

一、二週間ぐらい前からブラウザゲームの『艦これ』を遊んでいます。提督名は daisy です。この眼鏡っ子は巡洋戦艦の霧島さん(CV: 東山奈央さん)。

艦これ母港画面201306271930サムネイル

「巡洋戦艦」というと戦艦の仲間みたいなイメージですけども、調べたところによると `Battle Cruiser' を「巡洋戦艦」と訳したのは誤訳に近くて、装甲は巡洋艦並みの薄さでもお蔭で軽くて巡洋艦並みに高速を出せるという、簡単に言うと「主砲が戦艦並みの大きめな巡洋艦」で、「巡洋戦艦」というより「戦闘巡洋艦」と訳すのが実態に近いみたいです。

艦これ編成画面201306271930サムネイル

そして、現在のひなぎく艦隊の陣容はこんな感じ。実は主力の方々が手酷い損傷を受けて軒並み長時間のドック入りをしているので、このメンバーは控えの皆さんになります。油断して戦艦や正規空母などの大型艦をどんどん出撃させていると、あっというまに油やボーキサイトが尽きてしまうので、なかなか遣り繰りが大変なゲームだったりします。運営の事前の予想以上に大量のプレイヤーが殺到してサーバがパンクしてしまい、今のところプレイヤーの新規登録が停止されていますけども、わりと楽しい育成系ゲームですので興味があれば登録が再開されたら遊んでみるのも良いかも?

May 20, 2013

ぽちたて 0.1.8 をリリースしました

IPAフォント使用時のぽちたて0.1.8画面サムネイル

放置されたまま幾星霜……なんと二年振りの更新になりますが、ぽちたて 0.1.8 をリリースしました。

今月は、長い間 testing だった debian wheezy が stable になったり、perl-5.18.0 が出たりと、ぽちのパソコン環境的に何かと色々ありました。testing時代からずっと wheezy を使って来たので前者はどうという事も無かったのですけども、後者の Perl 5.18.0 では、ぽちたて 0.1.7 がファイルを開こうとすると、

Strings with code points over 0xFF may not be mapped into in-memory file handles

とエラーを吐いて die してしまいます。

perl5180delta を読んでみると、Updated Modules and Pragmata の * PerlIO::scalar has been upgraded to 0.16. にこんな文章が。

The buffer scalar supplied may now only contain code points 0xFF or lower. [perl #109828]

つまり、 PerlIO::scalar はコードポイント 0xFF以下の文字列しか open 出来なくなっちゃってたのでした。ぽちの緩い書き方のせいで内部表現の文字列入りスカラー変数のリファレンスを open していた 0.1.7 がファイルを開けなくなるのも当然です。

というわけで、ぽちたて 0.1.8 ではきちんと中身の文字列を UTF-8 でエンコードしてから open するように修正しました。

ぽちは、「お行儀良く書いてね?」と怒られてたわけです。ちゃんと怒ってくれるなんて素晴らしい!!