Sep 30, 2009
最近読んだ本:1789年-フランス革命序論

この夏から秋にかけては政権交代とかなんとか政治の世界でも大変動が起こりました。そこで、アメリカ独立と並んで議会制民主主義の原点とも言えるフランス革命についての本を読んでみたりして…。フランス革命の登場人物たちについての多少の基礎知識が必要ですけども、これが下手な小説よりも面白い!この本の書かれた時期が 1939年なので、最新の歴史研究からするともしかしたら少し時代遅れなのかもしれませんが、きちんと筋が通っていて納得のいく、そして何よりスリリング(結果は分かっているのにその過程が!)な本でした。ジョルジュ・ルフェーヴルってスゴイ歴史研究者だったんですねえ。
Sep 19, 2009
おやすみしたいけど、そうもいかない…
世の中は連休開始なんですけども、ぽちは風邪を惹いて頭痛が…orz
縁があって、毎週土曜深夜にはソードワールド2.0 という TRPG の IRC を使ったオンラインでのキャンペーンに参加しているのですけども、前々回も事情があっておやすみしてたのでこれ以上参加者の皆様方にご迷惑をお掛けするわけにはいきません。保つかどうかわかんないけど、なんとか頑張って参加しないと…。
Sep 18, 2009
バージョン管理に Git を導入
以前にも書きましたけども、ぽちたてのバージョン管理に Git を導入しました。今までバージョン管理システムとか全然使った事が無かったので、五十歩百歩さんのアドバイスや Git入門を参考に(もちろん man gittutorial も)、おっかなびっくり使い始めています。ちょっと Git について調べてみたら、Linuxカーネルや Perl関連の開発でもバージョン管理システムにはこれが使われているみたいですね。
まだ使ったコマンドと言っても、
$ mkdir pochitate $ cd pochitate
で準備した後で、
$ git init $ git add pochitate $ git commit -m 'はじめてのコミット'
しただけなんですけどね。
どうやら Git の機能はかなり豊富そうなんですけども、それだけにどう使って良いのやら、どう使ったら便利なのやら、まだまだ全然把握出来ていません。今のところは、
$ git log
や、
$ git log -p
で、記録を見たり差分を見たりするのが精一杯です。ぽちに Git をバリバリ使いこなせる日が来るのかなあ…?
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()
を使っています!
修正しないと…。
Sep 12, 2009
Perl/Tk で縦書きビューワーを作ろう (4)
悪戦苦闘の末、ページを先へ進む機能だけでなく後へ戻る機能も加わり、読んでいるページが何ページ目なのかも表示させるようにしてあります。とりあえずは UTF-8入出力専用の縦書きビューワーとして基本的な機能はなんとか実現させたような気がします。そういう訳で、相変わらず縦書きグリフの表示は出来ませんけども、無理矢理、ぽちたて 0.0.1 としてリリースしちゃいました。
既に数々の素敵で高機能な縦書きビューワーがある中、一応 Windows で使えない事も無いとはいえ、扱える入出力日本語文字コードが UTF-8 だけなので事実上 Linux/UNIX上で使う事しか想定していないぽちたて。需要は世界中にぽち一人しかしれませんが、今後もちまちま作り続けようと思っています。…それでも使ってみてくれた奇特な方がいらっしゃいましたら、バグレポートをメールなりコメントなりで絶賛大募集中です。
- ぽちたて 0.0.1 を動かすのに必要ないろいろ
- Perl
- Perl/Tk
- Lingua::JA::Fold
- 機能
- UTF-8 のテキストファイルを UTF-8 で縦書き表示します。
- 注意点
- 相変わらず縦書きグリフが表示出来ません。
- 相変わらずとんでもなく起動が遅いですがフリーズと間違えないで下さい。
- Linux上の Perl 5.10.0 でしか動作を確認していません。
- 使い方
- $ pochitate001.pl sampletext.txt
というわけでぽち*ぷ〜ちに公開用ページ Perl/Tk で縦書きビューワー『ぽちたて』を作ってみたを作りました。
しかし、なんとか Linux/UNIX上で TrueTypeフォントの縦書きグリフを表示する良い方法が無いものでしょうか?
Sep 10, 2009
Perl/Tk で縦書きビューワーを作ろう (3)
今日は余裕が無いのでやっと最低限の機能で動き出したコードだけ…。
- ぽちたてを動かすのに必要ないろいろ
- Perl (多分、5.8.8以上)
- Perl/Tk
- Lingua::JA::Fold
- 機能
- UTF-8 のテキストファイルを UTF-8 で縦書き表示します。
- 注意点
- 縦書きグリフが表示出来ません。
- 前のページへ戻る機能はありません。
- 今読んでるのが何ページ目なのか表示しません。
- とんでもなく起動が遅いですがフリーズと間違えないで下さい。
- Perl と CPAN を使える環境なら Windows でも動作するとは思いますけども、Linux の Perl5.10.0 でしか動作を確認していません。
pochitat20090910.pl
#!/usr/bin/perl
## 使い方 ###########################
# #
# $ pochitate20090910.pl sample.txt #
# #
#####################################
use strict;
use warnings;
use utf8;
use Tk;
use Lingua::JA::Fold qw(fold);
# 設定
my $font_family = 'IPA明朝';
my $font_size = 11;
my $font_style = 'normal';
my $font_color = '#000000';
my $background_color = '#e0ffff';
my $text_width = 523;
my $text_height = 28;
my $line_horizontal_margin = 26;
my $chr_vertical_margin = 15;
my $fold_length = 42; # 文庫本1ページの標準的な一行の文字数
my $page_lines = 18; # 文庫本1ページの標準的な行数
# メインウィンドウの準備
my $top = MainWindow->new( -title => 'ぽちたて' );
# フレームの準備
my $frame_top = $top->Frame();
my $frame_bottom = $top->Frame();
# 主画面となるキャンバスウィジェットの配置
$frame_top = $top->Canvas( width => 603, height => 671 );
$frame_top->create( 'rectangle', 1, 1, 602, 670, -fill => $background_color );
# ページ移動ボタンの配置(「<」で次ページ、「×」で終了)
my @chr_ids;
$frame_bottom->Button( -text => '<', -command => [ \&write_tategaki, \@chr_ids ],
-font => [ $font_family, 4, $font_style ] )->pack( -side => 'left' );
$frame_bottom->Button( -text => '×', -command => \&exit,
-font => [ $font_family, 4, $font_style ] )->pack( -side => 'left' );
# フレーム内の配置
$frame_top->pack();
$frame_bottom->pack( -side => 'right' );
# テキストファイルからの読み込みと折り返し処理
my $strs;
while(<>){
utf8::decode($_);
$strs = $strs . fold( 'text' => $_, 'length' => $fold_length,
'mode' => 'traditional' );
}
open my $fh, "<", \$strs or die "Couldn't open for reading: $!\n";
&write_tategaki(\@chr_ids);
MainLoop();
sub write_tategaki{
my $chr_ids = shift;
my $lines;
my $line_width = $text_width;
unless (eof $fh){
for my $c_id (@$chr_ids){
$frame_top->delete( $c_id );
}
@$chr_ids = ();
}
while(<$fh>){
utf8::decode($_);
my $chr_height = $text_height;
my @string = split(//, $_);
for my $chr (@string){
$frame_top->create( 'text', $line_width, $chr_height,
-fill => $font_color, -text => $chr,
-font => [ $font_family, $font_size, $font_style ] );
push @$chr_ids, $id;
$chr_height += $chr_vertical_margin;
}
$line_width -= $line_horizontal_margin;
$lines++;
last if ($lines > $page_lines - 1);
}
}
Sep 09, 2009
Perl/Tk で縦書きビューワーを作ろう (2)
今日も今日とてぽちたて作りです。
今日は自動折り返し機能や指定した行数を越えて縦書き描画しない機能を付けてみました。また、今はまだ機能自体は実装していませんが、将来必要になるページ画面移動ボタンも追加しています。今は押してもぽちたてが終了するだけなんですけどね。本当にまずシンプルな機能のものを作るつもりなので、当分の間、入出力の日本語文字コードは UTF-8 だけにしか対応出来ません。

ぽちたて作りの最大の懸案である縦書きグリフの取得と描画もまだ完全に手付かずの状態なので、入出力での多種類の日本語文字コードへの対応や、あったら嬉しい栞機能とか、さらには青空文庫ビューワーとしての進化等々、一体実現するのがいつの事になるのか気が遠くなりそうです。
pochitate20090909.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tk;
use Lingua::JA::Fold qw(fold);
# 設定
my $font_family = 'IPA明朝';
my $font_size = 12;
my $font_style = 'normal';
my $text_width = 450;
my $text_height = 46;
my $line_horizontal_margin = 26;
my $chr_vertical_margin = 16;
my $fold_length = 30;
my $page_lines = 17;
# メインウィンドウの準備
my $top = MainWindow->new( -title => 'ぽちたて' );
# フレームの準備
my $frame_top = $top->Frame();
my $frame_bottom = $top->Frame();
# 主画面となるキャンバスウィジェットの配置
$frame_top = $top->Canvas( width => 481, height => 561 );
$frame_top->create( 'rectangle', 1, 1, 480, 560, -fill => 'green',
-stipple => 'gray25' );
# ページ移動ボタンの配置(現時点ではボタンを押してもぽちたてを終了するだけ)
$frame_bottom->Button( -text => '<', -command => \&exit,
-font => [ $font_family, 9, $font_style ] )->pack( -side => 'left' );
$frame_bottom->Button( -text => '>', -command => \&exit,
-font => [ $font_family, 9, $font_style ] )->pack( -side => 'left' );
# フレーム内の配置
$frame_top->pack();
$frame_bottom->pack( -side => 'right' );
# テキストファイルからの読み込みと折り返し処理
my $strs;
while(<>){
utf8::decode($_);
$strs = $strs . fold( 'text' => $_, 'length' => $fold_length,
'mode' => 'traditional' );
}
# 各行ごとに各文字をひとつひとつ描画
open my $fh, "<", \$strs or die "Couldn't open for reading: $!\n";
my $lines = 0;
while(<$fh>){
utf8::decode($_);
my $chr_height = $text_height;
my @string = split(//, $_);
for my $chr (@string){
$frame_top->create( 'text', $text_width, $chr_height, -text => $chr,
-font => [ $font_family, $font_size, $font_style ] );
$chr_height += $chr_vertical_margin;
}
$text_width -= $line_horizontal_margin;
$lines++;
last if ($lines > $page_lines - 1); # 指定の行数に入りきれないなら描画中止
}
MainLoop();
こうしたものを作るのが初めてなので、機能の実装方法がきっと滅茶苦茶だったり無謀だったり乱暴過ぎたりどこから見てもおかしかったりするに違い無いと思うので、プログラミングの先達の皆様方がうっかりこのページを見てくれていて、なんとなく暇潰しにでも感想をコメントしてくれるのを本当に本当に心待ちにしています。
Sep 08, 2009
Perl/Tk で縦書きビューワーを作ろう (1)
今すぐ出来るところから始めてみようと思って、とりあえず Perl/Tk を使って縦書き表示部分だけパパッと書いてみました。

ボロボロなものでもとにかくでっち上げて、「こんなの作ってるんですよ~?」とアピールして、物知らずなぽちよりもっとスゴイ方々から色々とお知恵を拝借しよう、なんて虫の良い事を考えていたりします。自力で勉強してキチンとしたものを作れたらそれが一番なのですけども…。
pochitate20090908.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tk;
my $font_family = 'IPA明朝';
my $font_size = 12;
my $font_style = 'normal';
my $text_width = 450;
my $text_height = 46;
my $line_horizontal_margin = 26;
my $chr_vertical_margin = 16;
my $top = MainWindow->new( -title => 'ぽちたて' );
my $canvas = $top->Canvas( width => 481, height => 561 );
$canvas->pack();
$canvas->create( 'rectangle', 1, 1, 480, 560,
-fill => 'green', -stipple => 'gray25' );
while(<>){
utf8::decode($_);
my $chr_height = $text_height;
my @string = split(//, $_);
for my $chr (@string){
$canvas->create( 'text', $text_width, $chr_height, -text => $chr,
-font => [ $font_family, $font_size, $font_style ] );
$chr_height += $chr_vertical_margin;
}
$text_width -= $line_horizontal_margin;
}
MainLoop();
test.txt
たてがきテスト 縦書きテスト 犬山ぽち丸 タテガキてすと 何文字くらいが限界なのか試してみたけど、まだ折り返しの方法 を良く検討していなかったりします。何とか折り返しの良い方法が 無いものでしょうか…。 さらには一番肝心な縦書きグリフの呼び出し方も分かりません。 とりあえずは縦書き表示の基本部分を作ってみたものの、テキス トファイルの読み込みや折り返しや一画面分表示の前処理について もっとキチンと考えないと、全く使い物になりません。 問題は山積み過ぎてどれから手を付けていいのやらという状態。 しかし、一文字づつ配列に放り込んで縦書き表示させるなんて乱 暴な仕組みで実現したけど、これってテキストデータが膨大な量に なっても大丈夫なのかとっても不安です。
test.txt を引き数に与えて、実行権限を付けた pochitate20090908.pl を実行したのが一番上の画像になります。当面の問題は、
- マルチバイト文字列の折り返し
- 複数ページに渡るテキストデータの表示
- 縦書きフォントの取得と表示
という感じです。
ちゃんと調べたわけではありませんが、マルチバイト文字列の折り返しには Lingua::JA::Fold が、縦書きフォントの取得と表示では Font::FreeType や Font::TTF::GSUB あたりが使えたら良いなあ…なんて思っていたりします。
Sep 07, 2009
Perl/Tk で縦書きビューワーを作りたい
青空昆布の開発を引き継ぎましたや xjp2 を見て刺激を受けたぽち、先日の記事への Facelessさんのコメント、全部Perlで書けばいいと思うよ!思うよ!
に背中を押され、とうとう無謀にも自分で縦書きビューワーを作ろうなんて企んでしまいました。後々青空文庫向け機能も充実させたいとは思いますけども、まずはシンプルに「読み込んだテキストファイルを縦書きで表示する」という機能だけのものを作る予定です。
いざ縦書きビューワーを作ろうとすると一番問題になるのは、括弧、長音、句読点等の字形が横書きと縦書きでは違うという点です。代表的な日本語TrueTypeフォント、例えば IPAフォントには縦書きグリフも備わっていますが、縦書きに適さない横書きグリフに対応する縦書きグリフをフォントから取り出す方法に躓いてしまいました。調べてみると、TrueTypeフォントには内部に GSUB と呼ばれる横書きグリフID と縦書きグリフID の対応表があって、それを使って縦書きグリフを持って来るみたいなのですけども、具体的にどうやったらいいのか(それが Perl で可能なのかさえ)もわかりません。とりあえずは xjp2 ではどうやってるのか C で書かれたソースコードを眺めてみようと思います。
Sep 06, 2009
青空文庫ビューワー xjp2
Facelessさんのサイトの記事、青空昆布の開発を引き継ぎましたを読んで、青空昆布って何?と調べてみると、主に著作権切れの書物を無償で公開している青空文庫のテキストを PSP で快適に読む為のツールでした。今まで青空文庫というサイトの存在を知らなかったので、本好きのぽちはさっそく「アッシャー家の崩壊」のテキストデータをダウンロードして PC の emacs で読んでみましたが、ブログやメール、技術的な文書を横書きで読むのには抵抗が無いのですけども、どうも物語を読むのに横書きは雰囲気に欠けるような気がして落ち着きません。なんとか縦書きで読みたいと思って、Linux/UNIX向け青空文庫ビューワー xjp2 をソースからビルドするのに挑戦してみました。

xjp2 は素敵な縦書きビューワーなのですけども、残念な事に出力の日本語文字コードが EUC-JP の決め打ちになっていて、UTF-8 の入出力に対応していません。その為、日本語文字コードの環境を UTF-8 にしているぽちんちの debian lenny では、毎回ロケールを
$ export LANG=ja_JP.EUC-JP
してからでないと xjp2 をちゃんと使う事が出来ませんし、元に戻すにはまた改めて
$ export LANG=ja_JP.UTF-8
しなければなりません。今時の Linux の日本語環境はどれも UTF-8 が基本になって来ているのでこれはちょっと不便です。需要が少ないというのが最大の理由だとは思いますがこの日本語文字コードの問題も、debian や ubuntu で xjp2 が debパッケージ化されていない理由のひとつなのかもしれません。C に詳しければパッチを書いて開発者の方に送るんですけれども、とてもそこまでの実力は無いぽち。誰か xjp2 を UTF-8対応させた上で、ロケールを見に行って出力の日本語文字コードを変えるようにしてくれないかなあ…。