Apr 26, 2011
SDL Perl をいじってみた (2)
懲りずにまだまだ SDL Perl をいじっています。今回はアイテムと、アイテムと自キャラの衝突判定、スコア表示を追加してみました。少しはゲームに近づいたのではないでしょうか?
SDL に加えて png画像の読み込みに SDL_image、truetypeフォントの読み込みに SDL_ttf を利用しています。

ご覧のように、魔法少女まどか☆マギカのまどかが漆黒に染まったソウルジェムを拾うゲーム(まだゲームとは言えない出来ですけども)になってしまったのは、まどかマギカの第11話・第12話を観たばっかりだったのと、前回投稿した動画、SDL Perl でゲームっぽい何かを書いてみたのコメントのキャラをまどかのドット絵にしたら?という書き込みに乗っかってみたからです。そんでもってまたもや動画を投稿してみました。
madoka.png と soul_gem.png


コードを追加するよりドット絵を手打ちする方に遥かに多くの時間が掛かってしまいました。さらりと描ける方々が本当に羨ましいです。
#!/usr/local/bin/perl
use strict;
use warnings;
use SDL;
use SDL::Events;
use SDLx::App;
use SDLx::Rect;
use SDLx::Sprite;
use SDLx::Text;
# ウィンドウ全体の準備
my $app = SDLx::App->new(
width => 512,
height => 384,
title => 'Catch the Soul Gem!',
dt => 0.02,
exit_on_quit => 1,
);
# 自キャラの準備
my $player = {
rect => SDLx::Rect->new( $app->w / 2 - 16, $app->h / 5 * 4, 32, 32 ),
v_x => 0,
score => 0,
};
# 自キャラ画像を入れる
my $player_character = SDLx::Sprite->new(
image => 'madoka.png', # 画像置き場へのパス
rect => $player->{rect},
);
# アイテムの準備
my $item = {
rect => SDLx::Rect->new( int( rand( $app->w ) ) - 16, 0, 32, 32 ),
v_y => 4,
};
# アイテム画像を入れる
my $item_character = SDLx::Sprite->new(
image => 'soul_gem.png', # 画像置き場のパス
rect => $item->{rect},
);
# スコアの準備
my $score = SDLx::Text->new(
font => 'VL-Gothic-Regular.ttf', # truetypeフォント置き場へのパス
h_align => 'right',
);
# 表示
$app->add_show_handler(
sub {
$app->draw_rect( [ 0, 0, $app->w, $app->h - 45 ], 0x007bbbff ); # 空
$app->draw_rect( [ 0, $app->h - 45, $app->w, 45 ], 0xc3d825ff ); # 地面
$player_character->draw( $app ); # 自キャラ
$item_character->draw( $app ); # アイテム
$score->write_to( $app, 'SCORE:' . $player->{score} ); # スコア
# CPU使用率が 100% に振り切れるようならディレイを挟んでも良いかも?
#$app->delay( 10 );
$app->update;
}
);
# 自キャラの動き
$app->add_move_handler(
sub {
my ( $step, $app ) = @_;
my $v_x = $player->{v_x};
$player->{rect}->x( $player->{rect}->x + ( $v_x * $step ) );
# 左の移動限度
if ( $player->{rect}->left <= 0 ) {
$player->{rect}->left( 0 );
}
# 右の移動限度
elsif ( $player->{rect}->right >= $app->w ) {
$player->{rect}->right( $app->w );
}
}
);
# アイテムの動き
$app->add_move_handler(
sub {
my ( $step, $app ) = @_;
my $v_y = $item->{v_y};
$item->{rect}->y( $item->{rect}->y + ( $v_y * $step ) );
# 衝突した?
if ( &check_collision( $item->{rect}, $player->{rect} ) ) {
$player->{score}++;
&reset_item;
}
# 下端まで行き着いた?
elsif ( $item->{rect}->top >= $app->h ) {
&reset_item;
}
}
);
# 自キャラの操作
$app->add_event_handler(
sub {
my ( $event, $app ) = @_;
# キーを押し込んだ場合
if ( $event->type == SDL_KEYDOWN ) {
# ←キーを押し込んで左へ
if ( $event->key_sym == SDLK_LEFT ) {
$player->{v_x} = -2;
}
# →キーを押し込んで右へ
elsif ( $event->key_sym == SDLK_RIGHT ) {
$player->{v_x} = 2;
}
# qキーまたは ESCキーを押して終了
elsif (
$event->key_sym == SDLK_q
or $event->key_sym == SDLK_ESCAPE
) {
$app->stop();
}
}
# キーを離した場合
elsif ( $event->type == SDL_KEYUP ) {
# ←キーや→キーを離したら自キャラが止まる
if (
$event->key_sym == SDLK_LEFT
or $event->key_sym == SDLK_RIGHT
) {
$player->{v_x} = 0;
}
}
}
);
# ループ開始
$app->run;
# 衝突判定
sub check_collision {
my ($A, $B) = @_;
return if ( $A->bottom < $B->top + 16 ); # 自キャラ上半分の衝突判定を削る
return if ( $A->right < $B->left );
return if ( $A->left > $B->right );
# 衝突
return 1;
}
# アイテムをリセット
sub reset_item {
$item->{rect}->y( 0 ); # 上端の
$item->{rect}->x( int( rand( $app->w) ) - 16 ); # ランダムな水平位置
$item->{v_y} = int( rand( 3 ) ) + 3; # ランダムな速度で再出現
}
Apr 22, 2011
SDL Perl をいじった挙句、ニコニコ動画へ投稿
少しでも SDL Perl の知名度が上がらないかと思ってニコニコ動画へ動画を投稿してみました。
Perl でゲームを書いてみようなんて物好きで酔狂な人が、一人でも増えると心強いんだけど。
Apr 21, 2011
SDL Perl をいじってみた
まったりと SDL::Manual を読みながら、新しくなった SDL Perl をいじってみました。

chr_01.png

とりあえず、ムーヴハンドラやイベントハンドラを仕込んで自キャラを動かしてみるところまで。敵キャラやアイテムや衝突判定は次回へ持ち越しです。
#!/usr/local/bin/perl
use strict;
use warnings;
use SDL;
use SDL::Events;
use SDLx::App;
use SDLx::Rect;
use SDLx::Sprite;
# ウィンドウ全体の準備
my $app = SDLx::App->new(
width => 512,
height => 384,
title => 'test',
dt => 0.02,
exit_on_quit => 1,
);
# キャラクタを入れる器の準備
my $rect = {
chr => SDLx::Rect->new( $app->w / 2 - 16, $app->h / 5 * 4, 32, 32 ),
v_x => 0,
};
# キャラクタを入れる
my $chr = SDLx::Sprite->new(
image => 'chr_01.png', # 画像置き場へのパス
rect => $rect->{chr},
);
# 表示
$app->add_show_handler(
sub {
$app->draw_rect( [ 0, 0, $app->w, $app->h - 45 ], 0x007bbbff ); # 空
$app->draw_rect( [ 0, $app->h - 45, $app->w, 45 ], 0xc3d825ff ); # 地面
$chr->draw( $app ); # キャラ
# CPU使用率が 100% に振りきれるようならディレイを挟んでも良いかも?
#$app->delay( 10 );
$app->update;
}
);
# 動き
$app->add_move_handler(
sub {
my ( $step, $app ) = @_;
my $v_x = $rect->{v_x};
$rect->{chr}->x( $rect->{chr}->x + ( $v_x * $step ) );
# 左の移動限度
if ( $rect->{chr}->left <= 0 ) {
$rect->{chr}->left( 0 );
}
# 右の移動限度
elsif ( $rect->{chr}->right >= $app->w ) {
$rect->{chr}->right( $app->w );
}
}
);
# 操作
$app->add_event_handler(
sub {
my ( $event, $app ) = @_;
# キーを押し込んだ場合
if ( $event->type == SDL_KEYDOWN ) {
# ←キーを押し込んで左へ
if ( $event->key_sym == SDLK_LEFT ) {
$rect->{v_x} = -2;
}
# →キーを押し込んで右へ
elsif ( $event->key_sym == SDLK_RIGHT ) {
$rect->{v_x} = 2;
}
# qキーまたは ESCキーを押して終了
elsif (
$event->key_sym == SDLK_q
or $event->key_sym == SDLK_ESCAPE
) {
$app->stop();
}
}
# キーを離した場合
elsif ( $event->type == SDL_KEYUP ) {
# ←キーや→キーを離したら自キャラが止まる
if (
$event->key_sym == SDLK_LEFT
or $event->key_sym == SDLK_RIGHT
) {
$rect->{v_x} = 0;
}
}
}
);
# ループ開始
$app->run;
CPU の使用率が 100% に振り切れるのは、古い PC だから仕方ないとして、むむむ、自キャラの左右の移動速度があからさまに違うのは何故!?左右の移動速度に差が出るようには書いてない筈なんだけど…。
まだまだ問題山積みです。
Apr 20, 2011
SDL Perl も、あるんだよ!
以前もここで書いたかもしれませんが、SDL の Perlバインディング、SDL Perl はバージョン 2.2.6 以前とバージョン2.5xx では API が大きく変わりました。その上最近では SDL::Manual Writing Games with SDL Perl のような初心者向け文書も書かれています。本が出るくらい日本語文書が充実している Ruby/SDL には到底及びませんけども、ひたすら SDL関連モジュールに埋め込まれた POD を読むしかなかった頃に比べてみれば、SDL Perl を使う為の敷居は随分低くなったのではないでしょうか?
早速 SDL::Manual をちまちま読みながら、教材になってるポンクローンやテトリスクローンを作ってみようと思います。
Apr 12, 2011
Net::AozoraBunko で青空文庫を検索・取得
ぽちたてを青空文庫ビューワー化する為に「青空文庫」と「Perl」で Web を検索してたら、いきなりスゴイの見つけました。
- Perlで文学を嗜む Net::AozoraBunko - JPerl advent calendar 2010 casual Track
- Net::AozoraBunko - search.cpan.org
Net::AozoraBunko
というわけで書いてみました。Net::AozoraBunko。
このモジュールは、青空文庫の作家や作品を検索し、作品をダウンロードすることができます
まだ CPAN にはあげてなくて、 github においてあります。
最初の URI の記事の書かれた時点では、まだ CPAN に上げてない旨が書かれていて、GitHub へのリンクが張られていますけども、二番目の URI の記事でご覧の通り、2011年 4月 12日現在ではしっかり CPAN にあります。青空文庫好きのぽちにとっては断然便利な Perlモジュールなのですが、このモジュールをぽちたてで使ったりしたら色々と便利な事が出来そうです。
Apr 09, 2011
IO::Uncompress::AnyUncompress でファイルを展開してみる
ぽちたてで gzip、bzip2、zip といった形式に圧縮されたテキストファイルを直接読み込めるようにしたくて Perl でそうした圧縮ファイルを展開する方法を調べてみると、gzip、bzip2、zip、その他をまとめて扱ってくれる IO::Uncompress::AnyUncompress という、そのものズバリな名前の便利そうなモジュールを発見。早速試しに gzip、bzip2、zipファイルを展開するコードを書いてみました。
#!/usr/bin/perl
use strict;
use warnings;
use IO::Uncompress::AnyUncompress qw/$AnyUncompressError/;
my $file = $ARGV[0];
if ($file =~ /.+\.txt$/) {
open my $fh, '<', $file
or die "Couldn't open $file for reading: $!\n";
my $content .= join '', <$fh>;
close $fh;
print $content;
}
elsif ($file =~ /.+\.zip$|.+\.gz$|.+\.bz2$/) {
my $z = IO::Uncompress::AnyUncompress->new($file)
or die "anyuncompress failed: $AnyUncompressError\n";
my $content .= join '', <$z>;
close $z;
print $content;
}
else {
die "Illegal file name: $file\n";
}
exit;
ファイルを引き数に取って、そのファイルがテキストファイルの場合はそのままで、対応している圧縮ファイルの場合は展開してから、文字列の入った $content
を print
で標準出力へ流しています。改めてテキストファイルが必要なら > で新しいファイルへリダイレクトしてあげるといいかも?
ファイル判別にファイル名の拡張子を使ってるので、中身が何だか分からないアヤシゲなファイルには危なくて使えないけど、ぽちたての用途なら充分使えそうです。
Nov 07, 2010
使わない方が吉
Web上で配布されている Perl で書かれた掲示板CGI は古いままメンテナンスされていないものが多く、その書き方もとても今世紀中に書かれたものとは思えないような書き方で平然と書かれていたり、セキュリティへの配慮も乏しかったりするみたいです。今日ぽちはそんな掲示板のソースコードを見る事になってしまいました。
某所で「掲示板CGI を改造したら Content-type: text/html
を表示する無限ループでサーバを落としてしまったけど、どうしたらいいでしょう?」といった感じの質問があったのですけども、そのベースとなった CGI のソースコードを見てみると、ちょっとスゴイものでした。use Encode
の代わりに require "./jcode.pl"
しているのは古い掲示板にありがちなので予想の範囲内だったとはいえ、use strict
も use warnings
もなし。当然のように汚染検出の -T
スイッチも使われていません。きわめつけは、use CGI
もされていなかったりしています。これをベースに改造するくらいなら、いっそ最初から書いた方がマシなんじゃないのかしら?なんて思ったのは秘密です。
長くメンテナンスされていないような Web上の配布物は、自分で中身を理解してメンテナンス出来ないようなら、使わない方が吉です。
Oct 13, 2010
パスワードをハッシュ化して保存してみた
もう二年くらい前になってしまいますけども、
という記事を読んだ事がありました。元々ぽちは、各種アカウントのうち致命的な物のパスワードはそれぞれバラバラにしていましたし、セキュリティにシビアにならなければならないような CGIプログラムを書く予定もありませんでしたので、なんとなく読み飛ばしていたのですけども、
という Perl の記事で、なんだかお手軽で便利そうな Perlモジュールがある事を知り、ちょっと勉強がてら、パパッとパスワードの保存とチェックの CGIプログラムを書いてみる事にしました。
通信経路も暗号化されるように SSL な HTTPS でリンクしています。CGI はパスワードの文字列に salt を振りかけてから、SHA-512 を使ってハッシュ化する仕組みにしてみました。詳しい事はそのうち時間がある時に、ぽち*ぷ〜ちの方で、今回書いたコードと一緒に詳しくメモをしておく予定です。
Sep 21, 2010
Perl 5.12.2 をインストールしてみた
ふと気がつくと、ついこないだ安定版のバージョンが 12 になったばかりの気がしていた Perl 5 がもうサブバージョンも 2 になっていました。今までぽちは debian lenny のパッケージに含まれる Perl 5.10.0 を普段使いの Perl にしていて、必要な Perlモジュールは可能な限り lenny でパッケージ化されている物を使い、それでも足りない物を CPAN からのインストールで補って来ました。そんなぽちも、ふと気がついたのがキッカケで、最新安定版の Perl で最新のモジュールを使える環境を整えてみようかな?なんて思って、システムが使う Perl とぽちが普段使う Perl をキッチリ別々にする事にしました。
方針としては、
- システムで使う Perl 5.10.0 では apt-get や aptitude での パッケージ管理に任せ、CPAN経由でのモジュールのインストールは行わない。
- ぽちが普段使いする Perl 5.12.2 では、モジュールは CPAN で管理し、常に最新の状態を維持する。
- Perl 5.10.0 での動作検証の為に debパッケージ化されていない Perlモジュールが必要なら、dh-make-perl を使って debパッケージ化して、ローカルの aptリポジトリから apt-get や aptitude でインストールする。
という感じです。
まずは、CPANモジュールのアンインストール - holidays-l開発ブログを参考に、5.10.0 に CPAN経由で入れたモジュールの数々をアンインストールしてスッキリさせ、ついでに今まで使っていた ~/.cpan以下も削除してしまいましょう。そして、お待ちかね 5.12.2 のビルド&インストール。インストール先は /usr/local/以下にします。
$ tar xvzf perl-5.12.2.tar.gz $ cd perl-5.12.2 $ ./Configure -Dprefix=/usr/local -Dinstallusrbinperl=N -de $ make $ make test $ sudo make install
これで素の Perl 5.12.2 のインストールが完了しました。
5.12.2 で CPAN からモジュールをインストールする時には、間違って 5.10.0 へインストールしないように、
$ /usr/local/bin/cpan
と、必ずフルパスで CPANシェルを起動さるようにします。
同じように perldoc も
$ /usr/local/bin/perldoc foobar
とフルパスで実行します。
さて、ぽちたての今後の動作検証用に 5.10.0 の方にも Lingua::JA::Fold が欲しいのですけども lenny には debパッケージがありません。仕方がないので dh-make-perl で野良debパッケージを作りました。
$ tar zxvf Lingua-JA-Fold-0.08.tar.gz $ dh-make-perl ./Lingua-JA-Fold-0.08 --build --desc 'To fold a Japanese text.' --version 0.08-0+0pochi1
これで liblingua-ja-fold-perl_0.08-0+0pochi1_all.deb の出来上がり。あとはローカルの aptリポジトリに放り込んで環境を整え、sudo aptitude install liblingua-ja-fold-perl するだけです。
早速 5.10.0 との違いを見てみようと /usr/local/bin/perldoc perldelta してみると
If you are upgrading from an earlier major version, such as 5.10.1,
first read perl5120delta, which describes differences between 5.10.1
and 5.12.0, as well as perl5121delta, which describes earlier changes
in the 5.12 stable release series.
なんて書いてあります。言われた通りに perl5120delta を読んでみると…。
The "..." operator
A new operator, "...", nicknamed the Yada Yada operator, has been
added. It is intended to mark placeholder code that is not yet
implemented. See "Yada Yada Operator" in perlop.
やだやだ演算子!?
とんでもないニックネームに惹かれながら perlop の Yada Yada Operator部分を読んでしまいました。
Yada Yada Operator
The yada yada operator (noted "...") is a placeholder for code. Perl
parses it without error, but when you try to execute a yada yada, it
throws an exception with the text "Unimplemented":
とりあえず未実装の部分に書いておくと、文法の解釈でエラーにしないで、実行時に"Unimplemented"(実行されませんでしたよ)のテキストと例外を投げてくれる演算子みたいです。なんだか範囲演算子とごっちゃになってややこしくなりそうな予感がします。いろいろ perldoc で読むつもりだったのにやだやだ演算子のネーミングが強烈過ぎて今日はここまで。
Jul 15, 2010
ダイスがない!
TRPG のりゅうたまを遊ぼうと、ルールブックも買ってウキウキしていたぽち。実際にシナリオを作ってプレイする前に、ぽち一人でプレイヤーキャラたちとモンスターとの模擬戦闘をやってみて、シナリオに登場させるのに丁度良い強さの敵を探してみようかな?なんて気分になって来ていました。ここでハタと気づいてみれば、りゅうたまでは 4面、6面、8面、10面、12面といった様々な多面ダイスを使いますけども、TRPGシステムでもメジャーな 6面ダイスや 10面ダイスはともかく、その他のマイナーなダイスをぽちは持っていません。しかも、ぽちが持っているダイスのうち割りと特殊な 10面ダイスは東京在住時代に専門店で購入したもので、かなりの田舎在住の現在、6面ダイス以外の多面ダイスは出掛けるのに現実的な距離にあるおもちゃ屋さんなどでは入手出来ません。将来的には Web通販に頼るにしろ、当面のこの状態には困ってしまいました。こんな事をチャットで愚痴っていると、お友達から「紙で自作すれば?」というお言葉。
自作?
そう、自作です!
ぽちには、Perl を始めたての頃に書いた IRCダイスボットがあるじゃないですか!!
そこからダイスロール部分のコードを抜き出してローカル実行用のツールにすればソロ模擬戦には充分です。けど、ここでまたハタと気づいてみれば、ぽちの IRCダイスボットは、ローカルに保存していたものは昨年末の HDD故障で失われていますし、さらにそれより前、Facelessさんが Perl で書かれた汎用性があって高機能の素敵な IRCダイスボットを公開された時に、より劣るぽちの IRCダイスボットは Web での公開もやめています。つまりローカルなぽちPC の中にも Web上にも再利用出来るコードはどこにも無くなっていたのでした。
こうしてズボラな手抜きの道を断たれたぽちが仕方なくちゃちゃっとテキトーに書いたのが下のダイスツールです。
dice.pl
#!/usr/bin/perl
use strict;
use warnings;
use Math::Random::MT; # 擬似乱数生成にメルセンヌ・ツイスタを使ってみる
my @dices;
my @advs;
my $dice_sum = 0;
my $adv_sum = 0;
@ARGV or die "need argument!\n";
if (@ARGV <= 3) { # 引き数は三つまで
while (@ARGV) {
my $arg = shift;
if ($arg =~ /^[1-9]\d?d(?:4|6|8|10|12|20|100)$/) { # 個数二桁まで、一般的な多面ダイスのみ
push @dices, $arg;
} elsif ($arg =~ /^(?:\+|-)?\d{1,2}$/) { # 修正値は二桁まで
push @advs, $arg;
} else {
warn "irregular argument: $arg!\n";
}
}
} else {
die "too mach arguments!\n";
}
my $seed = time ^ $$ ^ unpack "%L*", `ps axww | gzip -f`;
my $gen = Math::Random::MT->new($seed);
foreach my $dice (@dices) {
$dice =~ /^([1-9]\d?)d(4|6|8|10|12|20|100)$/;
my ($dice_count, $dice_size) = ($1, $2);
while ($dice_count) {
my $a_dice = int $gen->rand($dice_size) + 1;
$dice_sum += $a_dice;
$dice_count--;
print "d$dice_size: $a_dice\n";
}
}
foreach my $adv (@advs) {
$adv_sum += $adv;
}
print "add: $adv_sum\n";
print "sum: ", $dice_sum + $adv_sum, "\n";
擬似乱数生成にメルセンヌ・ツイスタを使おうと CPANモジュールの Math::Random::MT を使っている上に、乱数種を作るのに UNIX/Linuxコマンドの ps や gzip に依存しているので Linux を始めとした Unixっぽい環境でしか動きませんが、どのみち自分用ですのでこれでよし。
この dice.pl に実行権限を付けて実行パスの通ったディレクトリに放り込んだ後、
$ dice.pl 1d4 1d8 +1
d4: 3 d8: 2 add: 1 sum: 6
$ dice.pl 2d10 1d12 -2
d10: 6 d10: 5 d12: 11 add: -2 sum: 20
といった感じで使ってみたり。
これでやっとりゅうたまの模擬戦が出来ます。
Oct 29, 2009
Gtk2::Pango で縦書きしてみると
この二つのブログで Pango と cairo を使って C で書かれた縦書き表示のソースコードが紹介されていました。そこでそれを参考にして、ぽちも Gtk2-Perl と Cairo-Perl を通して Perl で書いてみました。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Gtk2;
use Cairo;
use Math::Trig qw/:pi/;
my $width = 80;
my $height = 280;
my $format = 'argb32';
my $file = 'verticaltext.png';
my $markup = <<"EOS";
<span font_family='IPA明朝' size='13000'>――《犬山ぽち丸》と、Pooch 123</span>
<span font_family='IPA明朝' size='13000'>『ぷ〜ち』は今日も元気でぇーす。</span>
<span font_family='IPA明朝' size='13000'>「Pangoの縦書きは、こんな感じ」</span>
<span font_family='IPA明朝' size='13000'>(本当に)――大丈夫かな……?</span>
EOS
my $surface = Cairo::ImageSurface->create($format, $width, $height);
my $cr = Cairo::Context->create($surface);
$cr->translate($width, 0);
$cr->rotate(pip2);
my $layout = Gtk2::Pango::Cairo::create_layout($cr);
my $context = $layout->get_context;
$context->set_base_gravity('east');
$layout->set_markup($markup);
Gtk2::Pango::Cairo::show_layout($cr, $layout);
$surface->write_to_png($file);
そしてその表示結果がこちら。

スカラー変数 $markup
の中にある原文と表示結果を比べていただけると分かるように、句読点の位置が真ん中に来ていたり、同じ記号でも場合によって縦になったり横になったりしていて(最初から横倒しにならない記号もありますけども)、結局、参考にしたブログで、Pango の日本語縦書き実装はそのまま実用にするにはまだまだ問題がある、という主旨の事が書かれていたのを再確認してしまいました。とは言うものの、 Perl での書き方の勉強にはなったかもしれません。Pango に代わる簡単な縦書き表示の手段もぽちには見つからないので、ぽちたて次期バージョンはこれを使うしかないのかなあ? debian lenny の公式パッケージにある少し前のバージョンの Pango でしか試していないので、安定版最新の Pango や 開発版の Pango ではどうなっているのかちょっと興味があります。
Oct 28, 2009
Gtk2-Perl を通して GTK+2 を勉強中
こないだ買って来た入門GTK+ は予想以上に良い本でした。入門書をちょっと齧った程度の C知識しかないぽちにも、分かりやすいソースコードで例示して GTK+ の使い方を教えてくれます。今のところ、この本を読みながら、解説されているいろんな機能を Gtk2-Perl - Table of Contents で首っ引きにして、Gtk2-Perl を通して Perl で書き直して動かしてみたりしていますが、Gtk2-Perl - Table of Contents に書いてある情報だけでは Perl でどんな風に書いて良いのか分からないものもあって、前途多難な状態です。誰かが Gtk2-Perl で書いたコードとかを参考にした方が良いのかなあ?
Sep 17, 2009
ぽちたて 0.0.3 をリリースしました
タイトル通り、ぽちたて 0.0.3 をリリースしました。公開の準備をしてたら日付跨いじゃってた…orz
今日はもう眠いので、詳しい事はまた今度追加で書きますね。
追記:コメントにもあるように、寝ぼけてうっかりな事件を起こしてしまいましたけども、今回のリリースでは栞機能を使えるようにしました。栞機能を使って復帰すると栞を挟んだページより前に戻れなくなってしまいますが、使っててよほど不便でない限りはこのままでもいいかな?なんて思ってみたり…。そのあたりの使用感もちょっと感想を聞いてみたい気がします。そして遅れ馳せながら、五十歩百歩さんのアドバイスに従って、ぽちたてのバージョン管理には Git を導入する事にしました。
Sep 15, 2009
ぽちたて 0.0.2 をリリースしました
ぽちたて 0.0.2 をリリースして、Perl/Tk で縦書きビューワー『ぽちたて』を作ってみたで公開しています。
今回の変更点は、キー操作でページ移動や終了が出来るようになった点、読み込んで表示出来るテキストファイルの日本語文字コードが UTF-8だけでなく、Shift JIS、EUC-JP、JIS と増えた点、エラーメッセージをキッチリ出すようにした点です。キー操作でのページ移動をアドバイスしていただいた 2ch Linux板、縦書きエディタはないかスレの 383さん、差分どころか丸ごと多日本語文字コード対応版にして送っていただいた Facelessさん、本当にありがとうございました。
遅々として進まない縦書きグリフ表示。TrueTypeフォント内部の情報を得るのに使えそうな Font::TTF::GSUB の POD を読んでも、ぽち自身に TrueTypeフォントの知識が全然無いので何が書いてあるのかサッパリわかりません。只今大慌てで GSUB - The Glyph Substitution Table を読んで勉強中なので、しばしのご猶余を。
Sep 14, 2009
ぽちたてをリリースしてみたけれど
なんだかわりとスレ違いな気もしましたが、知恵を借りられないかと 2ch Linux板の縦書きエディタはないかにこんなの作ってみましたとPerl/Tk で縦書きビューワー『ぽちたて』を作ってみたのリンクを張ってみたら、
- 引き数なしで起動した場合にキチンとエラーメッセージを出した方がいい
- マウスクリックだけでなくキーボード入力での操作の実装の実例
- 縦書きグリフ問題解決の一案として自前マッピング
などなど、早速色々と励ましや好意的なレスをいただいたりして、ぽちたてが、ぽち以外にも需要があったなんて嬉しい誤算です。あまり詳しいわけでもないぽちでさえこんなに簡単に縦書きビューワーが書けてしまう Perl と Perl/Tk は本当にスゴイですね。
好意的な反応に嬉しくてニンマリしながらあちこち眺めていると、モノマネやdan幕で有名な Perl の Encodeのメンテナとして有名な小飼弾さんの 404 Blog Not Found:#perl - utf8::decode()ではなくEncode::decode_utf8()を使うべき理由という記事を見つけました。
見ての通り、
utf8::decode()
は、不正なUTF-8バイト列に対して何もしません。
Validationの観点だけではなく、簡潔性の観点からも、
Encode::decode_utf8()
はおすすめです。すでに UTF-8 flag がついた文字列はそのままコピーするだけなので、条件分岐も不要です。
「404 Blog Not Found:#perl - utf8::decode()ではなくEncode::decode_utf8()を使うべき理由」より
うっかり知らずに思いっきりぽちたて内部で utf8::decode()
を使っています!
修正しないと…。