2015/01/15(木)Python勉強メモ#2「Unicodeブロック:Hiragana の文字をすべて出力せよ」

#!/usr/bin/env python
for cp in range(0x3040, 0x30A0): print(chr(cp), end=' ')

出力:

぀ ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゕ ゖ ゗ ゘ ゙ ゚ ゛ ゜ ゝ ゞ ゟ

ちなみにPerlで書くと↓のようになります。

#!/usr/bin/env perl
use open qw/:utf8 :std/;
print chr . ' ' for 0x3040 .. 0x309F;

16進数を「0x」で表現できる点はPythonのほうが好きです。

Perlでも「0x」使えました。(汗)

追記: Python版はリスト内包表記のほうがいいですかね。

#!/usr/bin/env python
 [ print(chr(cp), end=' ') for cp in range(0x3040, 0x30A0) ]

これでもいけますね。

#!/usr/bin/env python
print(' '.join(chr(cp) for cp in range(0x3040, 0x30A0)), end='')

2013/05/16(木)Perl勉強メモ #003 グラフ描く

「Graphviz::DSL」がレポートで活躍しています。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Graphviz::DSL;
use open IO => qw/:utf8 :std/;

my $graph = graph {
    name 'Miscellaneous Symbols';

    global rankdir => 'LR';

    my $cnt = 0;

    for my $dec ( hex('2600') .. hex('2609') )
    {
        $cnt++;
        my $char = chr $dec;
        node "node${cnt}", shape => 'record', label => "{<p>$char|<n>}";
    }

    while ($cnt > 1)
    {
        edge [ "node" . ($cnt - 1) . ":n" => "node" . $cnt . ":p" ];
        $cnt--;
    }
};

$graph->save(path => 'symbols', type => 'png', encoding => 'utf-8');

だけで以下のグラフが出ます。

symbols

日本語WordNetに使うとかなり面白いグラフが出ます。

graph

こんなんして意味あんのか?と思ってたけど、ログを解析してOSのデッドロック状態をグラフで表したりすると全然わかりやすさが違って驚きました。

2012/10/10(水)Perl勉強メモ #002 それホンマに画像?(File::LibMagic)

中身が↓の「image.png」ってファイルをサーバに置いてIE6でアクセスすると普通にJSを解釈してアラートが出てくるので画像を画像と見抜く必要があります。(徳丸本によるとIE7でもJSを解釈する)

<script type="text/javascript">alert('XSS');</script>

それがFile::LibMagicでできるようなのでインストールします。

cpanm File::LibMagic -v
Can't link/include 'magic.h', 'magic'

libmagicがないっぽいのでやり直し↓

yum install file-devel
cpanm File::LibMagic -v

Perlのコード↓(image.png以外は拡張子に対応した普通のファイルです)

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw/say/;
use File::LibMagic;

my @files = qw/image.png libmagic.pl
kubota4.png hentai.jpg yui.gif footer.js/;

my $libmagic = File::LibMagic->new;

for my $file (@files)
{
    say "$file:";
    say $libmagic->checktype_filename($file);
    say $libmagic->describe_filename($file);
    print "\n";
}

出力↓

image.png:
text/plain; charset=us-ascii
ASCII text, with no line terminators

libmagic.pl:
text/plain; charset=us-ascii
a /usr/bin/env perl script text executable

kubota4.png:
image/png; charset=binary
PNG image data, 118 x 118, 8-bit/color RGBA, non-interlaced

hentai.jpg:
image/jpeg; charset=binary
JPEG image data, EXIF standard

yui.gif:
image/gif; charset=binary
GIF image data, version 89a, 29 x 32

footer.js:
text/plain; charset=us-ascii
ASCII text

他にもCPANには「File::MimeInfo::Magic」もあるけど試せていません。画像だけならここまでしなくても良いかもしれませんが、ライブラリ使っとくのが無難でしょうかね。