Dec 10, 2009
HDD破損とまさかのバックアップDVD紛失
タイトル通りの事態に陥ってしまいました。
「ホームディレクトリ外で管理していたサイズの大きな動画ファイルや音楽ファイルは取り戻せないけど、ホームディレクトリ以下のぽち環境の設定やその他の書き物類、手作りツール類は DVD にバックアップがあるから大丈夫♪」なんて思っていたら…肝心の時になってバックアップDVD まで紛失している事が発覚。お蔭で十二月に入ってからこの一週間ほどの余暇が全て、新しい HDD に debian lenny をクリーンインストールしてぽち環境を一から再構築する事に費やされてしまいました。次期ぽちたてのコードさえ、ここに載せた途中経過のメモから復帰させてる有様なので、当然次期ぽちたての開発にまでは全く手が回らず滞ったままになっています。
HDD の破損はともかく、バックアップDVD の紛失は整理整頓やちゃんとした管理を怠ったぽちの自業自得でしかありません。
とは言うものの、こういう事件は本当に堪えます…[犬]ω;)
Nov 28, 2009
怠けものなので
2ch の某スレを眺めてみたら、ぽちたてについて、「レベルの低いコーディング」という書き込みに対して「下手でも口だけで書かない奴よりはずっとマシ」などとやり合ってる方々がいて、ちょっとスレの雰囲気が悪くなっていました。どちらの主張にしろ、そんなことで険悪になられると困ってしまいます。実際、ぽちの Perl の書き方が拙くも低レベルなのは本人に自覚もあり、本当にもっともな指摘です。もっとスマートに洗練された書き方が出来るようになれたらなあ、なんていつも思っています。そんなぽちが、なんでまたわざわざぽちたてを書いているのかというと、他に書いてくれる人がいないからです。洗練された書き手の方が、ぽちが欲しいと思った機能を実装して縦書きビューワーを書いてくれたら、怠けもののぽちにとってはらくちんで嬉しいのですけれども…。
ぽちたては、xjp2 に対するいくつかの不満から、Linux向けの青空文庫対応縦書きビューワーを目指して作りはじめました(まだ青空文庫に対応するところまで到達していませんけども)。その不満というのは、第一に、UTF-8 での入出力に対応していない点、第二に、ぽち環境の debian lenny でビルドすると正常な動作ではないと思われる挙動があるという点です。特にフォントのアンチエイリアスを設定すると落ちてしまうのは致命的です。本来なら、xjp2 のソースコードをちゃんと読んで、改善する為のパッチを書いて貢献すべきなのでしょうけども、残念ながらぽちには C はほんのさわりしか理解出来ず、また、xjp2 の開発も止まったまま数年経っているようだったので、無謀にもぽち程度の能力しか無いのに Perl で縦書きビューワーを作ろうなんて思いついてしまいました。実は他にも Linux でも使える Javaベースのものや Adobe AIRベースのものもあるようですけども、タダで譲り受けた八年落ちの低スペックPC しか持っていないぽちは、モッサリ感を恐れて最初から利用を検討していません。もしかしたら想像するより軽快なのかなあ?しまった!そうだとしたら怠けられたかも!?
というわけで、xjp2 の開発さえ盛んだったなら、怠けもののぽちがわざわざぽちたてなんて作ろうとは思わなかったというお話でした。怠けものなので本当は怠けていたいのです。
Nov 27, 2009
Gtk2-Perl で Pango を使った縦書きビューワーを作ろう(3)
2ch Linux板の「GTK+プログラミング」というスレで、今まで躓いていた部分の解決法を教えて貰えました。事前にテキストを描画したオブジェクトが既にあるのかどうかを確かめて、あるようなら次の描画の為に destroy しちゃうという方法です。
言われてみればなぜ今まで気がつかなかったんだろうという感じのとても真っ当な方法なのですけども、独学の悲しさ、自分ではそこに気がつかないままになってしまっていました。教えてくれた方、本当にありがとうございます。まだまだ細々した部分は後回しにして放置しているのがほとんどの状態ですけども、とりあえずは複数ページに渡るテキストを読み進めたり戻ったりする事が出来るようになりました。
ぽちたて 20091127
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; # 日本語文字コード判別
use Lingua::JA::Fold qw/fold/; # 日本語禁則折り返し
use open IN => ":bytes"; # 入力される文字コードが混在している可能性があるので
use Gtk2 qw/-init/;
use Glib qw/TRUE FALSE/; # TRUE, FALSE で真偽値を扱う
use Cairo;
use Math::Trig qw/pip2/; # π/2 のラジアン値を使う
my $window_width = 605; # ウィンドウの幅
my $window_height = 693; # ウィンドウの高さ
my $surface_width = 600; # テキスト表示部の幅
my $surface_height = 661; # テキスト表示部の高さ
my $font_and_size = 'IPA明朝 11'; # フォント名とサイズ
my $background_color = '#e0ffff'; # 背景色
my $line_spacing = 19400; # 行間隔(1/1024ポイント単位)
my $fold_length = 42; # 文庫本 1ページの一般的な一行の文字数
my $page_lines = 18; # 文庫本 1ページの一般的な行数
my $shiori_file = 'pochitate_shiori.txt'; # 栞ファイルの場所
my @offsets = (0); # 既読ページのテキストデータ読み出し後のオフセット配列
my $page = 0; # 現在表示しているページ
my $shiori_page; # 栞を挟んだページ
my $filename; # 読み込むテキストファイル名
# メニューバーを作る為の下準備
my $entries = [
[ 'FileMenu', undef, 'ファイル(_F)' ],
[ 'Open', 'gtk-open', '開く(_O)...', '<ctrl>O', 'ファイルを開く',
\&text_file_open],
[ 'Save', 'gtk-save', '栞を挟む(_S)', '<ctrl>S', '栞を挟む', \&shiori ],
[ 'Quit', 'gtk-quit', '終了(_Q)', '<ctrl>Q', '終了する',
sub { Gtk2->main_quit; } ],
];
my $menu_info = <<'EOS';
<ui>
<menubar name='MenuBar'>
<menu action='FileMenu'>
<menuitem action='Open' position='top'/>
<menuitem action='Save'/>
<separator/>
<menuitem action='Quit'/>
</menu>
</menubar>
</ui>
EOS
# GTK+ のバージョンを確認
die "This viewer requires GTK+ 2.4.0, but we're compiled for "
. join '.', Gtk2->GET_VERSION_INFO. "\n"
unless Gtk2->CHECK_VERSION(2, 4, 0);
# 引き数が無くても栞があったら自動復帰
unless ($filename = $ARGV[0]){
if (-e $shiori_file){
open my $fh, '<', $shiori_file
or die "Couldn't open $shiori_file for reading: $!\n";
my $shiori_data = <$fh>;
close $fh;
chomp $shiori_data;
($filename, $offsets[0], $shiori_page) = split ' ', $shiori_data;
($ARGV[0], $page) = ($filename, $shiori_page);
}
}
# テキストファイルからの読み込みと文字コード判定・折り返し処理
my $strs;
foreach (@ARGV){
open my $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
my $content .= join '', <$fh>;
close $fh;
my $guess = guess_encoding($content);
ref $guess or die "Couldn't guess: $guess\n";
open $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
while (<$fh>){
$_ = $guess->decode($_);
$strs .= fold( 'text' => $_, 'length' => $fold_length,
'mode' => 'traditional' );
}
close $fh;
}
# メインウィンドウの準備
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
$window->set_title('ぽちたて 20091127');
$window->set_default_size($window_width, $window_height);
# 垂直ボックスとその第一段の中に水平ボックスを配置
my $vbox = Gtk2::VBox->new(FALSE, 2);
my $hbox = Gtk2::HBox->new(FALSE, 0);
$vbox->pack_start($hbox, FALSE, FALSE, 0);
# メニューバーの作成
my $ui = Gtk2::UIManager->new;
my $accelgroup = $ui->get_accel_group;
$window->add_accel_group($accelgroup);
my $actions = Gtk2::ActionGroup->new('actions');
$actions->add_actions ($entries, undef);
$ui->insert_action_group($actions, 0);
$ui->add_ui_from_string ($menu_info);
my $menubar = $ui->get_widget('/MenuBar');
# ページ移動ボタンの作成
my $button_next = Gtk2::Button->new;
my $icon_next = Gtk2::Image->new_from_stock('gtk-go-back', 'menu');
$button_next->set_image($icon_next);
$button_next->signal_connect('clicked' => \&next_ward);
my $button_prev = Gtk2::Button->new;
my $icon_prev = Gtk2::Image->new_from_stock('gtk-go-forward', 'menu');
$button_prev->set_image($icon_prev);
$button_prev->signal_connect('clicked' => \&prev_ward);
# ページ数表示部の作成
my $page_count = Gtk2::Label->new("- $page -");
# 垂直ボックス第一段の水平ボックスへ各ウィジェットの配置
$hbox->pack_start($menubar, FALSE, FALSE, 0);
$hbox->pack_start($button_next, FALSE, FALSE, 0);
$hbox->pack_start($button_prev, FALSE, FALSE, 0);
$hbox->pack_start($page_count, TRUE, TRUE, 0);
# スクロール付きウィンドウを作成して垂直ボックスの第二段に配置
my $scrolled_window = Gtk2::ScrolledWindow->new(undef, undef);
$scrolled_window->set_policy('automatic', 'automatic');
$vbox->pack_start($scrolled_window, TRUE, TRUE, 0);
open my $fh, '<', \$strs or die "Couldn't open virtual file for reading: $!\n";
seek $fh, $offsets[0], 0;
&next_tategaki(\@offsets, \$page);
$window->add($vbox);
$window->show_all;
Gtk2->main;
sub text_file_open {
my $dialog = Gtk2::FileChooserDialog->new(
'ファイルを開く',
undef,
'open',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
$dialog->show_all;
my $response = $dialog->run;
if ($response eq 'ok') {
my $filename = $dialog->get_filename;
# 得たファイル名のテキストファイルを読み込む。ここに色々書く予定。
}
$dialog->destroy;
undef;
}
# 次ページ表示
sub next_tategaki {
my ($offsets_ref, $page_ref) = @_;
return if eof $fh;
&write_tategaki;
push @$offsets_ref, tell $fh or die "Couldn't tell the file offset: $!\n";
$$page_ref++;
# ページ数の表示
$page_count->set_label("- $page -");
undef;
}
# 前ページ表示
sub prev_tategaki {
my ($offsets_ref, $page_ref) = @_;
return if $#offsets < 0 || defined $shiori_page && $shiori_page > $page - 3;
pop @$offsets_ref if $#offsets > 1;
seek $fh, $offsets[-2], 0;
&write_tategaki;
$$page_ref-- if $$page_ref > 1;
# ページ数の表示
$page_count->set_label("- $page -");
undef;
}
# 縦書き描画
sub write_tategaki {
# 既にテキストを表示していれば一旦クリア
my $current_object = $scrolled_window->child;
$current_object->destroy if $current_object;
# cairo を使った描画
my $surface = Cairo::ImageSurface->create('argb32',
$surface_width, $surface_height);
my $cr = Cairo::Context->create($surface);
# $cr->set_source_rgb(0,0,1); # 青
$cr->translate($surface_width, 0);
$cr->rotate(pip2);
my $layout = Gtk2::Pango::Cairo::create_layout($cr);
$layout->set_spacing($line_spacing);
my $context = $layout->get_context;
$context->set_base_gravity('east');
my $desc = Gtk2::Pango::FontDescription->from_string($font_and_size);
$layout->set_font_description($desc);
my $language = Gtk2::Pango::Language->from_string('ja');
$context->set_language($language);
if ($strs){
my $text;
my $lines;
while(<$fh>){
$text .= $_;
$lines++;
last if ($lines == $page_lines);
}
$text = decode_utf8($text);
$layout->set_text($text);
}
Gtk2::Pango::Cairo::show_layout($cr, $layout);
my $drawable = Gtk2::DrawingArea->new;
$drawable->size($surface_width, $surface_height);
$drawable->signal_connect(
'expose_event' => \&set_surface,
$surface,
);
$scrolled_window->add_with_viewport($drawable);
$drawable->show;
undef;
}
sub set_surface {
my ($widget, $event, $surface) = @_;
my $bg_cr = my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window);
my $color = Gtk2::Gdk::Color->parse($background_color);
$bg_cr->set_source_color($color);
$bg_cr->paint;
$cr->set_source_surface($surface, 0, 0);
$cr->paint;
undef;
}
# 栞を挟む
sub shiori {
open my $fh, '>', $shiori_file
or die "Couldn't open $shiori_file for writing: $!\n";
print $fh $filename, ' ', $offsets[-2], ' ' , $page - 1, "\n";
close $fh or die "Couldn't close $shiori_file: $!\n";
undef;
}
sub next_ward{
&next_tategaki(\@offsets, \$page);
undef;
}
sub prev_ward{
&prev_tategaki(\@offsets, \$page);
undef;
}
# Copyright (c) 2009, 犬山ぽち丸
# このコードは、Perl自体と同じライセンスで配布します。
# Copyright (c) 2009, Pochimaru Inuyama. All rights reserved.
# This code is distributed under the same terms as Perl itself.
Nov 19, 2009
今更タッチタイピング
次期ぽちたてが行き詰まってしまったので、気分転換にタッチタイピングを覚えようなんて思い立ちました。元々ぽちは頭の回転が鈍くてタイピングが早くても思考の方が追いつかないので、チャットをしててもわざわざタッチタイピングを習得する必要に迫られませんでした。そんなぽちが今回こんな事を始めたのは、カタタタタと恰好良くタッチタイピングしてるとなんとなく賢そうに見えるかも?というお気楽な理由からです。
とは言うものの、なんとなく賢そうで恰好良いという印象意外には全くタッチタイピングについての知識が無いぽち。Web で検索してみると、両手の指に決まった担当するキーを割り当てて慣れていくのが基本のようです。

「ファイル:TouchTyping HomePosition QWERTY.png - Wikipedia」より
これを参考にしてテキトーに何かの文章でも打ち込んでみようかな?例えば、どう考えても著作権なんて切れている筈の平家物語の本文とか!なんて思いましたけども、良く考えたら世の中にはタイピング練習ツールというものが存在します。Linux向けで何か良いのはないかしら?と探してみましたが、日本語配列キーボードに対応したものはないようです。そんな中でキーボード配列をカスタマイズ出来るタイピング練習ツール、klavaro が見つかりました。公式サイトのトップを見てみると、お手軽にも debian にパッケージがあります。この klavaro は日本語の文章をタイピング練習する為のツールではありませんが、ぽちはずっとローマ字入力なのでたいして差し支えはありません。これを使ってしばらく練習してみようと思います。
あ、そうそう、この文章も練習がてらタッチタイピングで入力していますけども、まだまだとっても遅かったりします。カタタタタなんて素早く打てるようになるのはいつになることやら…。
Nov 11, 2009
Gtk2-Perl で Pango を使った縦書きビューワーを作ろう(2)
早速行き詰まってしまいました。
問題になってるのは、縦書き表示部分のページ移動による再描画です。ぽちには再描画する前にどうやって以前の表示をクリアしたら良いのかが良くわかりません。これは GTK+2 での Pango や cairo の描画の仕組みを詳しく理解出来てないせいなのですけども、Gtk2-Perl版ぽちたては、Perl/Tk版ぽちたてのように簡単に次ページには行けないようです。とほほ[犬]ω;)
ちゃんと動かないのですが、仕方なく途中経過の断片コードを載せておきます。
ぽちたて 20091110
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; # 日本語文字コード判別
use Lingua::JA::Fold qw/fold/; # 日本語禁則折り返し
use open IN => ":bytes"; # 入力される文字コードが混在している可能性があるので
use Gtk2 qw/-init/;
use Glib qw/TRUE FALSE/; # TRUE, FALSE で真偽値を扱う
use Cairo;
use Math::Trig qw/pip2/; # π/2 のラジアン値を使う
my $window_width = 605; # ウィンドウの幅
my $window_height = 693; # ウィンドウの高さ
my $surface_width = 600; # テキスト表示部の幅
my $surface_height = 661; # テキスト表示部の高さ
my $font_and_size = 'IPA明朝 11'; # フォント名とサイズ
my $background_color = '#e0ffff'; # 背景色
my $line_spacing = 19400; # 行間隔(1/1024ポイント単位)
my $fold_length = 42; # 文庫本 1ページの一般的な一行の文字数
my $page_lines = 18; # 文庫本 1ページの一般的な行数
my @offsets = (0); # 既読ページのテキストデータ読み出し後のオフセット配列
my $page = 1; # 現在表示しているページ
my $filename; # 読み込むテキストファイル名
# メニューバーを作る為の下準備
my $entries = [
[ 'FileMenu', undef, 'ファイル(_F)' ],
[ 'Open', 'gtk-open', '開く(_O)...', '<ctrl>O', 'ファイルを開く',
\&text_file_open],
[ 'Save', 'gtk-save', '栞を挟む(_S)', '<ctrl>S', '栞を挟む', \&shiori ],
[ 'Quit', 'gtk-quit', '終了(_Q)', '<ctrl>Q', '終了する',
sub { Gtk2->main_quit; } ],
];
my $menu_info = <<'EOS';
<ui>
<menubar name='MenuBar'>
<menu action='FileMenu'>
<menuitem action='Open' position='top'/>
<menuitem action='Save'/>
<separator/>
<menuitem action='Quit'/>
</menu>
</menubar>
</ui>
EOS
# GTK+ のバージョンを確認
die "This viewer requires GTK+ 2.4.0, but we're compiled for "
. join '.', Gtk2->GET_VERSION_INFO. "\n"
unless Gtk2->CHECK_VERSION(2, 4, 0);
# テキストファイルからの読み込みと文字コード判定・折り返し処理
my $strs;
foreach (@ARGV){
open my $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
my $content .= join '', <$fh>;
close $fh;
my $guess = guess_encoding($content);
ref $guess or die "Couldn't guess: $guess\n";
open $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
while (<$fh>){
$_ = $guess->decode($_);
$strs .= fold( 'text' => $_, 'length' => $fold_length,
'mode' => 'traditional' );
}
close $fh;
}
# メインウィンドウの準備
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
$window->set_title('ぽちたて 20091110');
$window->set_default_size($window_width, $window_height);
# 垂直ボックスとその第一段の中に水平ボックスを配置
my $vbox = Gtk2::VBox->new(FALSE, 2);
my $hbox = Gtk2::HBox->new(FALSE, 0);
$vbox->pack_start($hbox, FALSE, FALSE, 0);
# メニューバーの作成
my $ui = Gtk2::UIManager->new;
my $accelgroup = $ui->get_accel_group;
$window->add_accel_group($accelgroup);
my $actions = Gtk2::ActionGroup->new('actions');
$actions->add_actions ($entries, undef);
$ui->insert_action_group($actions, 0);
$ui->add_ui_from_string ($menu_info);
my $menubar = $ui->get_widget('/MenuBar');
# ページ移動ボタンの作成
my $button_next = Gtk2::Button->new;
my $icon_next = Gtk2::Image->new_from_stock('gtk-go-back', 'menu');
$button_next->set_image($icon_next);
$button_next->signal_connect('clicked' => \&next_ward);
my $button_prev = Gtk2::Button->new;
my $icon_prev = Gtk2::Image->new_from_stock('gtk-go-forward', 'menu');
$button_prev->set_image($icon_prev);
$button_prev->signal_connect('clicked' => sub { Gtk2->main_quit; });
# ページ数表示部の作成
my $page_count = Gtk2::Label->new("- $page -");
# 垂直ボックス第一段の水平ボックスへ各ウィジェットの配置
$hbox->pack_start($menubar, FALSE, FALSE, 0);
$hbox->pack_start($button_next, FALSE, FALSE, 0);
$hbox->pack_start($button_prev, FALSE, FALSE, 0);
$hbox->pack_start($page_count, TRUE, TRUE, 0);
# スクロール付きウィンドウを作成して垂直ボックスの第二段に配置
my $scrolled_window = Gtk2::ScrolledWindow->new(undef, undef);
$scrolled_window->set_policy('automatic', 'automatic');
$vbox->pack_start($scrolled_window, TRUE, TRUE, 0);
open my $fh, '<', \$strs or die "Couldn't open virtual file for reading: $!\n";
seek $fh, $offsets[0], 0;
&next_tategaki(\@offsets, \$page);
$window->add($vbox);
$window->show_all;
Gtk2->main;
sub text_file_open {
my $dialog = Gtk2::FileChooserDialog->new(
'ファイルを開く',
undef,
'open',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
$dialog->show_all;
my $response = $dialog->run;
if ($response eq 'ok') {
my $filename = $dialog->get_filename;
# 得たファイル名のテキストファイルを読み込む。ここに色々書く予定。
}
$dialog->destroy;
}
sub next_ward{
&next_tategaki(\@offsets, \$page);
undef;
}
# 次ページ表示
sub next_tategaki {
my ($offsets_ref, $page_ref) = @_;
return if eof $fh;
&write_tategaki;
push @$offsets_ref, tell $fh or die "Couldn't tell the file offset: $!\n";
$$page_ref++;
undef;
}
# 縦書き描画
# 次ページや前ページへ移動する時に、
# 現在表示しているページをクリアする良い方法がないかなあ?
sub write_tategaki {
# cairo を使った描画
my $surface = Cairo::ImageSurface->create('argb32',
$surface_width, $surface_height);
my $cr = Cairo::Context->create($surface);
# フォントカラーをここで無理矢理指定出来るけど、0-1 の範囲のRGB表記という…。
# color name や hex code からの変換用関数が用意されてないか探してみようっと。
# 無いようなら自分で作る事!
# $cr->set_source_rgb(0,0,1); # 青
$cr->translate($surface_width, 0);
$cr->rotate(pip2);
my $layout = Gtk2::Pango::Cairo::create_layout($cr);
$layout->set_spacing($line_spacing);
my $context = $layout->get_context;
$context->set_base_gravity('east');
my $desc = Gtk2::Pango::FontDescription->from_string($font_and_size);
$layout->set_font_description($desc);
my $language = Gtk2::Pango::Language->from_string('ja');
$context->set_language($language);
if ($strs){
my $text;
my $lines;
while(<$fh>){
$text .= $_;
$lines++;
last if ($lines == $page_lines);
}
$text = decode_utf8($text);
$layout->set_text($text);
}
Gtk2::Pango::Cairo::show_layout($cr, $layout);
my $drawable = Gtk2::DrawingArea->new;
$drawable->size($surface_width, $surface_height);
$drawable->signal_connect(
'expose_event' => \&set_surface,
$surface,
);
$scrolled_window->add_with_viewport($drawable);
}
sub set_surface {
my ($widget, $event, $surface) = @_;
my $bg_cr = my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window);
my $color = Gtk2::Gdk::Color->parse($background_color);
$bg_cr->set_source_color($color);
$bg_cr->paint;
$cr->set_source_surface($surface, 0, 0);
$cr->paint;
undef;
}
# Copyright (c) 2009, 犬山ぽち丸
# このコードは、Perl自体と同じライセンスで配布します。
# Copyright (c) 2009, Pochimaru Inuyama. All rights reserved.
# This code is distributed under the same terms as Perl itself.
Nov 09, 2009
Pango 1.26 の縦書きは良いみたい
TrueTypeフォントについて調べてた頃に、2ch の Linux板にある「Linux上でのフォント総合スレ」というスレを覗いてみた事があるのですけども、それ以来定期的にそのスレをチェックするようになりました。さっきかなり久しぶりに眺めてみると、Pango 1.26 では句読点が中心線揃えの変な表示位置から正しい表示位置になっているというお話。しかも、次期ぽちたてに向けたぽちんちの断片コードまで紹介してくれているではありませんか!さらに挙句の果てには、ぽち断片を使って最新リリースの Pango 1.26 での次期ぽちたて表示を試してみてくれた方までいらっしゃいました。

うんうん、debian lenny で Pango 1.20 のぽち環境とは違って、充分実用に耐える品質で縦書きされています。次期ぽちたては、Pango の縦書きを使う為ダケに Gtk2-Perl版にしたので、この表示結果にはぽちもひと安心というかホッとしたというか、なんだか言葉では言い尽くせない思いです。
「Linux上でのフォント総合スレ 4」の皆様、本当にありがとうございます。お蔭様で、がんばって早く縦書きビューワーとしてひと通りの機能を実装しなきゃ!と、急に元気が湧いて来ました。
Nov 07, 2009
Gtk2-Perl で Pango を使った縦書きビューワーを作ろう(1)
前回の日記では次期ぽちたての縦書き表示部分の画像だけしか置いてなかったのですけども、今回からはちゃんと Perl のコードも書いておくことにします。

GTK+2 にならとっても分かり易い入門書まで出てたりしてますが、Gtk2-Perl の日本語文書は少ないので、こんないいかげんな断片でも誰かの助けになればと思って載せています。けっして「ぽちたて作りにちっとも進展がないから、とりあえずこないだのコードを載せちゃえ!」って事じゃないんですからねっ?誰ですか?一番役に立つのは結局本家の Gtk2-Perl - Table of Contents だって言ってるのは!(その通りですけども)
当然ではありますけども、Gtk2-Perl版ぽちたてを動かすには Perl や useされる Perlモジュール群だけでなく、事前に GTK+2 や Pango、cairo のライブラリがインストールされていなければなりません。debian lenny では libgtk2-perlパッケージをインストールすると、依存関係で必要なライブラリが一緒にインストールされるのでらくちんです。
ぽちたて 20091103
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/; # 日本語文字コード判別
use Lingua::JA::Fold qw/fold/; # 日本語禁則折り返し
use open IN => ":bytes"; # 入力される文字コードが混在している可能性があるので
use Gtk2 qw/-init/;
use Glib qw/TRUE FALSE/; # TRUE, FALSE で真偽値を扱う
use Cairo;
use Math::Trig qw/pip2/; # π/2 のラジアン値を使う
my $window_width = 605; # ウィンドウの幅
my $window_height = 693; # ウィンドウの高さ
my $surface_width = 600; # テキスト表示部の幅
my $surface_height = 661; # テキスト表示部の高さ
my $font_and_size = 'IPA明朝 11'; # フォント名とサイズ
my $background_color = '#e0ffff'; # 背景色
my $line_spacing = 19400; # 行間隔(1/1024ポイント単位)
my $fold_length = 42; # 文庫本 1ページの一般的な一行の文字数
my $page_lines = 18; # 文庫本 1ページの一般的な行数
my $shiori_file = 'pochitate_shiori.txt'; # 栞ファイルの場所
my @offsets = (0); # 既読ページのテキストデータ読み出し後のオフセット配列
my $page = 1; # 現在表示しているページ
my $shiori_page; # 栞を挟んだページ
my $filename; # 読み込むテキストファイル名
# メニューバーを作る為の下準備
my $entries = [
[ 'FileMenu', undef, 'ファイル(_F)' ],
[ 'Open', 'gtk-open', '開く(_O)...', '<ctrl>O', 'ファイルを開く',
sub { Gtk2->main_quit; } ],
[ 'Save', 'gtk-save', '栞を挟む(_S)', '<ctrl>S', '栞を挟む',
sub { Gtk2->main_quit; } ],
[ 'Quit', 'gtk-quit', '終了(_Q)', '<ctrl>Q', '終了する',
sub { Gtk2->main_quit; } ],
];
my $menu_info = <<'EOS';
<ui>
<menubar name='MenuBar'>
<menu action='FileMenu'>
<menuitem action='Open' position='top'/>
<menuitem action='Save'/>
<separator/>
<menuitem action='Quit'/>
</menu>
</menubar>
</ui>
EOS
# GTK+ のバージョンを確認
die "This viewer requires GTK+ 2.4.0, but we're compiled for "
. join '.', Gtk2->GET_VERSION_INFO. "\n"
unless Gtk2->CHECK_VERSION(2, 4, 0);
# テキストファイルからの読み込みと文字コード判定・折り返し処理
my $strs;
foreach (@ARGV){
open my $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
my $content .= join '', <$fh>;
close $fh;
my $guess = guess_encoding($content);
ref $guess or die "Couldn't guess: $guess\n";
open $fh, '<', $_ or die "Couldn't open $filename for reading: $!\n";
while (<$fh>){
$_ = $guess->decode($_);
$strs .= fold( 'text' => $_, 'length' => $fold_length,
'mode' => 'traditional' );
}
close $fh;
}
# メインウィンドウの準備
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
$window->set_title('ぽちたて 20091103');
$window->set_default_size($window_width, $window_height);
# 垂直ボックスとその第一段の中に水平ボックスを配置
my $vbox = Gtk2::VBox->new(FALSE, 2);
my $hbox = Gtk2::HBox->new(FALSE, 0);
$vbox->pack_start($hbox, FALSE, FALSE, 0);
# メニューバーの作成
my $ui = Gtk2::UIManager->new;
my $accelgroup = $ui->get_accel_group;
$window->add_accel_group($accelgroup);
my $actions = Gtk2::ActionGroup->new('actions');
$actions->add_actions ($entries, undef);
$ui->insert_action_group($actions, 0);
$ui->add_ui_from_string ($menu_info);
my $menubar = $ui->get_widget('/MenuBar');
# ページ移動ボタンの作成
my $button_next = Gtk2::Button->new;
my $icon_next = Gtk2::Image->new_from_stock('gtk-go-back', 'menu');
$button_next->set_image($icon_next);
$button_next->signal_connect('clicked' => sub {Gtk2->main_quit;} );
my $button_prev = Gtk2::Button->new;
my $icon_prev = Gtk2::Image->new_from_stock('gtk-go-forward', 'menu');
$button_prev->set_image($icon_prev);
$button_prev->signal_connect('clicked' => sub {Gtk2->main_quit;} );
# ページ数表示部の作成
my $page_count = Gtk2::Label->new("- $page -");
# 垂直ボックス第一段の水平ボックスへ各ウィジェットの配置
$hbox->pack_start($menubar, FALSE, FALSE, 0);
$hbox->pack_start($button_next, FALSE, FALSE, 0);
$hbox->pack_start($button_prev, FALSE, FALSE, 0);
$hbox->pack_start($page_count, TRUE, TRUE, 0);
# スクロール付きウィンドウを作成して垂直ボックスの第二段に配置
my $scrolled_window = Gtk2::ScrolledWindow->new(undef, undef);
$scrolled_window->set_policy('automatic', 'automatic');
$vbox->pack_start($scrolled_window, TRUE, TRUE, 0);
open my $fh, '<', \$strs or die "Couldn't open virtual file for reading: $!\n";
seek $fh, $offsets[0], 0;
&write_tategaki;
$window->add($vbox);
$window->show_all;
Gtk2->main;
sub text_file_open {
my $dialog = Gtk2::FileChooserDialog->new(
'ファイルを開く',
undef,
'open',
'gtk-cancel' => 'cancel',
'gtk-ok' => 'ok',
);
$dialog->show_all;
my $response = $dialog->run;
if ($response eq 'ok') {
my $filename = $dialog->get_filename;
# 得たファイル名を縦書き描画サブルーチンへ渡して実行する予定地
}
$dialog->destroy;
}
# 縦書き描画
sub write_tategaki {
# cairo を使った描画
my $surface = Cairo::ImageSurface->create('argb32',
$surface_width, $surface_height);
my $cr = Cairo::Context->create($surface);
# フォントカラーをここで無理矢理指定出来るけど、0-1 の範囲の RGB表記という…。
# color name や hex からの変換用関数が用意されてないか探してみようっと。
# $cr->set_source_rgb(0,0,1); # 青
$cr->translate($surface_width, 0);
$cr->rotate(pip2);
my $layout = Gtk2::Pango::Cairo::create_layout($cr);
$layout->set_spacing($line_spacing);
my $context = $layout->get_context;
$context->set_base_gravity('east');
my $desc = Gtk2::Pango::FontDescription->from_string($font_and_size);
$layout->set_font_description($desc);
my $language = Gtk2::Pango::Language->from_string('ja');
$context->set_language($language);
if ($strs) {
my $text;
$text .= $_ while(<$fh>);
$text = decode_utf8($text);
$layout->set_text($text);
}
Gtk2::Pango::Cairo::show_layout($cr, $layout);
my $drawable = Gtk2::DrawingArea->new;
$drawable->size($surface_width, $surface_height);
$drawable->signal_connect(
'expose_event' => \&set_surface,
$surface,
);
$scrolled_window->add_with_viewport($drawable);
}
sub set_surface {
my ($widget, $event, $surface) = @_;
my $bg_cr = my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window);
my $color = Gtk2::Gdk::Color->parse($background_color);
$bg_cr->set_source_color($color);
$bg_cr->paint;
$cr->set_source_surface($surface, 0, 0);
$cr->paint;
undef;
}
# Copyright (c) 2009, 犬山ぽち丸
# このコードは、Perl自体と同じライセンスで配布します。
# Copyright (c) 2009, Pochimaru Inuyama. All rights reserved.
# This code is distributed under the same terms as Perl itself.
Nov 02, 2009
ぽちたて次期バージョンへのみちのり

Pango を使った縦書きはこんな残念な感じですけれども、Gtk2-Perl や cairo-perl を扱う勉強も兼ねて最初のページを表示するだけのものを即席で作ってみました。後は以前のバージョンで実装した機能をこっちに持って来ればなんとかなりそうかも?メニューバーにページ移動ボタンだけでなく「ファイル(F)」なんて部分があるのは、ダイアログ画面でテキストファイルを指定して読み込む機能も付ける予定だからだったりします。
早くそれなりに恰好を付けて、ぽちたて 0.1.0 として公開出来るレベルになるといいなあ…。
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 で書いたコードとかを参考にした方が良いのかなあ?
Oct 25, 2009
入門Git を買いに行ったのに入門GTK+ を買って帰る

五十歩百歩さんのお薦めでバージョン管理システムに Git を使い始めたぽちですけども、今一つ使いこなせていません。最近、Git のメンテナの濱野純さんが書かれた、入門Git という本が出てるのを知り、最寄りの大きめの本屋さんに自転車でキコキコ走ってみました。つらつらとコンピュータ関連書籍のコーナーを眺めても見当たらなかったので、書店員の方に入門Git の事を説明して尋ねてみると、入荷の予定が無いというお話。なるだけ本は地元にある本屋さんの店頭にあるものを買う事を心掛けているぽちも、無いものは仕方ありません。まあ、せっかく本屋さんまで来たんだからと、未練がましくコンピュータ関連書籍コーナーをうろうろしていると、入門GTK+ という本を発見。奥付を見るとこれも最近出たばかりの本のようです。

ぽちたて次期バージョンの為に GUIツールキットの GTK+2 を勉強しようと思っていた矢先の事だったので、入門Git が買えなくてちょっと悔しかった事もあり、うっかり勢いで買ってしまいました。
ぽち、しばらくは入門GTK+ を読んでると思います。読了したら感想をここに書こうかなあ。
Oct 24, 2009
最近読んだ本:乙嫁語り 1巻

ぽちが大好きなエマの森薫さんの新作という事で迷わず読んだ一冊ですが、さすが期待通りの面白さでした。
二十歳の花嫁アミルさんの恰好良さ健気さもさる事ながら、十二歳の花婿カルルク君の存在で前作のエマよりも男の子成分を増量してくれているのも個人的に嬉しいです。後半ではカルルクの一族とアミルの一族との不穏な悶着も起こり次巻がとっても気になります。悶着を持ち込んだアミルの兄、アゼルも無口で一徹な感じの超美形ですけども、なんとなくこういうタイプは色々と厄介事を押し付けられたり貧乏籤を引かされる羽目になって、その性格故に早死にしそうな予感が…。
描き込みもとても美麗なので、いやもう、色んな方に読んで欲しい漫画です。
Oct 23, 2009
ぽちたて右往左往中
色々あって怒涛のように忙しかった十月も終わりを迎えつつある今日この頃、ブログも日記というより月記という感じの頻度に成り果ててしまいました。
ぽちたて 0.0.3 をリリース後、Perl だけを使ってなんとか縦書きグリフを表示しようと色々試行錯誤してみましたが、ぽちの頭が悪いせいでどうにも上手く行きません。半ばヤケになっていっそ縦書き専用の明朝体TrueTypeフォントを作って同梱しようかとまで考えましたけども、さすがに開発としての方向性が間違ってる気がして断念(笑)。なぜ Perl だけで実装する事に拘っているのかというと、Perl環境がある OS の間でクロスプラットフォームな縦書きビューワーにしたかったからなのです。けど、その意図はぽちの技術力の無さのお蔭で完全に暗礁に乗り上げてしまいました。
そこで、とりあえず実用的な縦書きビューワーを作る為に、縦書き表示の実装があるという Pango というライブラリを使う事にしました。このライブラリは GTK+2 で使うものなので、GUIツールキットも Perl のみで動いた Perl/Tk から、GTK+2 に変更し、Gtk2 という Perlモジュールを通してライブラリを操作する予定です。Pango にしろ GTK+2 にしろ C のライブラリで、これに依存してては Windows での導入の敷居が格段に高くなり、事実上、Linux/UNIX専用になってしまいますけれども、この際、Perl から操作可能なら贅沢は言えません。ぽちたては今後この方向で(ほぼ)Linux/UNIX向けツールという事で開発していこうと思います。
だってほら、Windows にはもう沢山素敵な縦書きビューワーがあるじゃないですか…(言い訳)。
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対応させた上で、ロケールを見に行って出力の日本語文字コードを変えるようにしてくれないかなあ…。
Aug 29, 2009
最近読んだ本:発動! タンポポ村救出作戦(銀河乞食軍団合本版1)・〈蒼橋〉義勇軍、出撃!(銀河乞食軍団黎明篇1)・葡萄山発動! タンポポ村救出作戦(銀河乞食軍団合本版1)司令部、陥落!?(銀河乞食軍団黎明篇2)

昔、図書館で読んだ事のあるスペオペ、「銀河乞食軍団」が合本版として再刊されているようなので、買って読んでみました。金平糖錨地でおネジっ子たちが活躍する外伝しか読んだ事が無いので、初めて本編を読む事になります。好もしい泥臭さと暖かさ、そしてなによりワクワク感のあるちょっと懐かしい雰囲気の本で、気持ちが真っ直ぐな冒険物語の良さというものを改めて思い出させてくれました。中でも登場人物のロケ松さんがなんとも良い味を出しています。ぽちの中で続刊(再刊?)予定が一番気になる本です。去年、惜しくも作者の野田昌宏さんがお亡くなりになって、もう過去の既刊分しか読めないというのが本当に残念です。

そんな中、野田さんが書いた続刊が希めない銀河乞食軍団シリーズに、別の作家さんが書いた新シリーズが登場しました。こういうのはシェアード・ワールドとでもいうのでしょうか?表紙も表紙な上に Web上ではかなり評判の悪いラノベ作家の方が書いていらしたので買うのにかなり躊躇しましたけども、結局、銀乞の看板に負けて購入。こちらの方は会話や説明がとにかくクド過ぎるのが気になって、野田さん独特の暖かみや軽みというのを感じる事が出来ませんけども、お話の筋としてはワクワク感もあって割合い面白かったです。

しかし、重ね重ね黎明篇の表紙ばっかりは、登場人物的にも登場ガジェット的にも内容にそぐわない、どうしようもなく間違った方向性だと思います。
Aug 12, 2009
Jul 27, 2009
雨が降っても断水
朝、蛇口を捻ると水が出ませんでした。
27日午前1時半ごろ、佐世保市瀬戸越町の市道脇のがけが崩れているのを通行人が見つけ、110番通報した。市水道局によると、付近を通る送水管3本が破損したとみられ相浦、中里・皆瀬、大野の3支所管内の17町約1万7800世帯(約4万4000人)が断水している。周辺の15町もさらに断水する可能性があるという。
幅5メートルの道路をふさいだ土石を取り除いた後、復旧工事に着手する予定で、復旧まで4日ほどかかる見通し。
「長崎新聞ホームページ:佐世保市で1万7800世帯断水 がけ崩れで送水管3本破損」より
旱魃でも豪雨でも結局毎年断水するぽち地元でした。復旧まで四日とかどうしろっていうの!!給水場所までめっちゃ遠い上に男手も自動車も無い家庭なのに…。しばらくは発展途上国の水汲み少年状態かも?ぽちがいる我が家はともかく、一人暮らしのお年寄りとかはかなり深刻な状態なのではないでしょうか?
とはいえ、こんな時に素早く対応してくれた陸自の給水車の方々にはとても感謝しています。
Jul 17, 2009
メーラーだえもんさん
メールを使い始めたのがまず携帯だったぽち。メアドを間違えて宛先不明のメールが戻って来た時、それなりに英語が読めたお蔭で自分のメアド間違いに気づいたものの、当時のぽちはメールサーバどころか PC やインターネットに完全に無知だったので、「'mailer-daemon' なんて名前で送って来るなんてなんだか趣味悪いなあ…」なんて思っていました。'daemon' は『悪魔』という意味の 'demon' じゃなくて、『守護霊』という意味の言葉で、可動しているサーバのプロセスを指すなんてこれっぽっちも知りません。ましてや優秀なハッカー(クラッカーじゃないですよ)を 'wizard' と呼び、バックグラウンドで甲斐甲斐しくマメに働いてくれているサーバを 'daemon' と呼ぶのはそこから来ているなんて説まであるなんて…。
とはいうものの、何を間違えたのか今では Linux/UNIX関係にそこそこ詳しくなって、サーバだなんだの知識も増えました。そんなぽちが Web をうろうろあっち読みこっち読みしてて発見したサイトがこちら↓
うちのメーラーだえもんさんも、宛先不明の間違いメールが届いたらエラーお知らせメールを返信しています。
しかし、…
なぜか、このメーラーだえもんのエラーお知らせメールに、 さらに返信がきてたりします。
メーラーだえもん>
『INOサン。最近、ボク宛にEmailが届いているようなんだけど、
ボクは日本語が読めないからコマっているんだ。
僕のお仕事に対する苦情じゃなければいいのだけど…
ボクの代わりにメールを読んでお返事を書いてくれないか?』INO>
『OK!じゃあ、君のアドレスに届いたメールを私に転送しといて』それは、 頑張りやさんの『メーラーだえもん』さんへの励ましのメールでしょうか?
…『ぱふぉ♪』←メール受信音。
けっこう、たくさん…
どれどれ…
TO:だえもん
From: From: @docomo.ne.jp
Subject: Re:failure notice
Date: Thu, 8 Aug 2002 15:18:59 +0900
誰?…(゚-゚)?うひゃ。
これは、マジメに返信すると大変なことになりそうなのでWEB上でお返事することにしましょう。
お返事
From: だえもん
…だえもんです。
「だえもんの悩み - ■メーラーだえもんさんへのお手紙」より
メーラーだえもんさんからメールが届いてもわざわざ返信しなくて良いので、「おっ、メーラーだえもんさん、今日もがんばってるなあ。」なんて、日々がんばってるメーラーだえもんさんに思いを馳せてみてはいかがでしょう?
Jul 13, 2009
NTT販売代理店のアヤシゲな光回線勧誘電話
NTTパートナーズを名乗るところから光回線の勧誘電話がありました。掛かって来た時間が通常考えられない非常識な時間なのと番号非通知なのにまず一番アヤシゲなものを感じたのですけども、アナログ回線から光回線への置き換えが既定の強制的な路線で、まるでアナログ回線が即日使用不能になるかのような印象を与えようとする、最低限事実しか言及してないものの意図的に誤った印象を与えようと誘導するまぎらわしい説明(ちょうど「DHMO に反対しよう」みたいな手法で、技術的な知識に乏しかったり論理的思考に慣れていなかったりするお年寄りなどはうっかり騙されてしまいそうな予感もします)に、こうしたやり方には激しい不快感を感じるぽちは、筋道を立てて明解にお断りしました。そしたらまるでこちらの話をまるっきり理解していないかのような応答を何度も何度も繰り返して来ます。こちらも結論としてのお断りを何度も何度も繰り返してたら、散々時間を奪われた挙句しまいにはガチャ切りされてしまいました。そして、ここでふと気がついたのですが、相手は担当者の名前さえ名乗っていません。しかも業務の電話でガチャ切りなんて普通の企業ならあり得ない対応です。今までも類似の NTT光回線勧誘電話は何度も掛かって来ましたけども、すべて「NTT販売代理店○○(社名)の××(担当名)と申します」と言ってましたし、ここまでアヤシゲな説明の仕方をするところはありませんでした。それにきちんと断りの意志を伝えたら丁寧に引き下がりましたし…。とまあ事件自体はこんな顛末でしたけども、この事件によってぽちの好奇心が激しく刺激されてしまいました。
とりあえずいかにも系列企業っぽいネーミングだけど電話対応のアヤシサからしてとてもそうは思えない NTTパートナーズって何?と思って Web で検索してみると、
先ほどNTTパートナーズとかいう会社から光回線の切り替えとかいう電話が掛かってきました。 だいたい夜の9時に掛けてくる事自体非常識極まりないのですが、何よりもこのNTTパートナーズという、いかにもNTTグループの一員を名乗るかのような社名が怪しい。調べてみましたが、そのような会社は見つけられませんでしたし、少なくともNTTグループ内には存在しないようです。
「怪しい!要注意!! - GOLDRAKE 【 みんカラ 】 ブログ」より
「あーのー、そういう電話はかけてこないようにNTTに言ってあるはずなんですけど。どちらの会社ですか?」
「NTTパートナーズフレッツ光受付センターです」
「会社名を教えてください」
「NTTパートナーズフレッツ光受付センターです」
「それ、会社名じゃないでしょ。どちらの会社ですか?」
「・・・弊社は、名乗らないようになっております」
「そちらから電話をかけてきて、名乗らない、はないでしょう?誰かに代わってください」
「もう弊社からはお電話しないようにいたしますので。失礼いたします(ツーツー)」
「弊社さん - DiaryNote」より
案の定胡散臭さ満載で調べるのが楽しくなって来ました。
さらに色々調べてみると、「NTT東日本(西日本)販売パートナー」という言葉は「NTT東日本(西日本)販売代理店」と同じ意味のようで、検索してみると販売代理店業務を行っている会社の Webサイトがいくつもヒットします。さて、そこからも微妙にずらしたネーミングの NTTパートナーズですけども、あれ?過去の歴史でこれと似たような事柄を知っているような…?あ!戦国時代の官職の私称!黒田官兵衛とか洞弾正次など、それぞれ兵衛府や弾正台の正規の官職から微妙にずらした私称を使っていましたよね。
きちんと相手の会社名を確認してください。また正式な販売パートナーならNTTへの登録番号がありますので、これも確認しておくと良いでしょう。なおその販売パートナーの名前をNTTで確認するのも良いでしょうね。ちなみにNTTの販売パートナーと偽って押し売りをする業者もたくさんあるようですので気をつけてください。
「教えて!Ziddyちゃん NTTの販売パートナー」より neumannさんの回答
NTTパートナーズ…アヤシサ大爆発です。
今回の件は飛び抜けて悪質な感じですけども、それ以外にも何度も何度も繰り返し掛かってくる NTT光回線勧誘にはいい加減うんざりしているので、何とか二度と掛けて来なくさせる方法は無いものかと思っていると以下の記事を発見しました。
勧誘の電話があった場合、まず【そちらはNTT本体ですか?代理店ですか?】
代理店の場合【会社名を教えてください、正規代理店ですか?】
NTTでも代理店でもどちらにも【この電話番号はどこで調べてますか?】
上記の事を聞きNTTと正規代理店の場合はNTTのお客様相談センターに連絡して勧誘自体を遠慮して欲しいと申告しましょう。
http://www.ntt-west.co.jp/share/inquire.html
お客様相談センター 0120-019000
(…中略…)
正規代理店以外や申告後もNTTなどから勧誘の電話があるようでしたら総務省電気通信消費者相談センター に電話をすると良いです。
http://www.soumu.go.jp/joho_tsusin/top/madoguchi/tushin_madoguchi.html
総務省電気通信消費者相談センター
〒100-8926 千代田区霞が関2-1-2 中央合同庁舎第2号館
Tel: 03-5253-5900
「Bフレッツ勧誘の電話がしつこくかかって来ます。皆さん経験ありますか? - Yahoo!知恵袋」より yasuminn_777さんの回答
実際に止めさせた方のブログも参考になります。
- NTTの光の勧誘と戦います その1 -開戦の狼煙- - WoodBookの巣【J-URBAN建築日記】
- NTTの光の勧誘と戦います その2 -正義の怪文書- - WoodBookの巣【J-URBAN建築日記】
- NTTの光の勧誘と戦います その3 -ホンマかいな- - WoodBookの巣【J-URBAN建築日記】
- NTTの光の勧誘と戦います その4 -終戦- - WoodBookの巣【J-URBAN建築日記】
また、NTT代理店業を営む方が書いたこういう記事も存在します。
最初は物好きな好奇心でしたけども、こういう情報は出来るだけ多くの方と共有しなればと思っていつになく長大な文章になってしまいました。しかしまあ、なんというか、常に誰かに騙されるかもしれないと気を張ってなきゃならない世の中というのも寂しいですよね。
代理店の説明がまるっきり同じ内容のトークだったブログの記事をいくつか発見したので注意喚起の為にも引用しておきます。寂しい世の中なのは仕方ありませんが、騙されないに越した事はありません。なんだかんだ言っても自衛するしかありませんから…。
「NTTより依頼を受けている者です」とのこと。内容は「お住まいのマンションは、光通信タイプの回線が引かれています。今回NTTよりアナログ回線から光回線へ変更する依頼を受けまして、その確認のお電話です」
(…中略…)
今度は固定電話の話。私「みんな携帯を使っているので、今のアナログ回線で問題はありません」業者「何かアナログ回線にこだわりがあるのですか」「固定電話は、マンション全体が光回線になっているので、変更が必要・・・」と言い出しました。「そんな連絡は受け取っていません」と私。「連絡したはずです。今回はその確認です」と業者。
(…中略…)
私「そんな変更の必要があるものは、しっかりとした文書で案内があるはずですよね。私は、NTTからの請求書はみんな保存しているので、その中に何もありませんでしたよ」。業者「以前ボストにチラシを入れたはずですがご覧にならなかったのですか」。私「そんな重要な連絡がチラシなんて変ですね。とにかくNTT東日本に確認しますので、それからです」。
(…中略…)
一応、NTTの116番に電話をして確認をしたところ、とくにアナログの回線を使用していても問題なく、変更の連絡もしていないとのこと。何か不審なことがあったらまた連絡してください・・・という返答でした。
「「電話回線の変更」を勧誘する業者にご注意 - アベレージ・ライフ」より
法的な事をきちんと確認したわけではありませんが、これは限りなく黒に近いグレーなんじゃないんでしょうか?
現在niftyを使っている(メールとホームページ、URL転送サービス)がそれは光に変えた場合にどうなるか。代理店の答えは、そのまま使えるという。今は@niftyにまとめて料金を支払っているが、はてniftyに断りなしに光に乗り換えて、そのまま@niftyの資源を使い続けられるものだろうか?と素朴な疑問を持った。
それでも、@niftyはそのまま使えます、というので、私は話の内容をFAXで送ってもらうことにした。FAXを見ると確かにトータルで安くはなるようだ。しかし見知らぬプロバイダ名が出ている。この意味するところはプロバイダをniftyから、そのプロバイダに変わることを意味する。再度電話が掛かってきて、niftyのメールアドレスとホームページはそのままで継続使用できるかを再確認したところ、使えると明言したのでひとまず、切り替えをお願いした。
ところが常識的に考えても無料でniftyの資源を使い続けられるとは思えない。@niftyのホームページを調べてみると、他のプロバイダに移行するに当たってメールアドレスを維持するためには「お手軽1」というダイアルアップ回線コース(263円)に変更しなければならない。
更に@homepageを維持するためには、「お手軽5」というコース(約1000円弱)に変更する必要がある。案の定、ただでは他プロバイダ経由では使えないのだ。あの代理店は間違っている。
「光への勧誘 - 1万歩クラブ」より
ぽちへの電話勧誘でも「Yahoo!BB のメールアドレスはそのまま維持出来ます」なんて説明していましたけども、これは「プロバイダを Yahoo!BB にしたままなら維持出来ますが、その場合、光回線に移行するとお得どころか完全に割高になってしまいます」という事なんでしょうね。これも、かろうじて嘘ではないけども事実を適切に教えてるわけじゃないというパターンのようです。
「デジタルになるので光回線もお宅の近くまでひくことになりました!」
うちのマンションは去年くらいにマンションですでに光ひいてますけど…。地デジとわざと混同させようとしているよね。地デジとネット回線は別です。
「今、半数くらいの人が光使ってるんですよね」
…どこの半数ですか?日本国民ですか?そんなに使ってるなんて、きいたことねーよ。
「将来的には全員光になるので、工事費が無料のうちにやっておいたほうがいいですよ」
…だから地デジと混同させようとしてるよね?電話回線があるのなら全員光になる必要はねーよ。しかもそれなら勧誘する必要もねーよ。そしてNTTは割といつでもキャンペーン中で工事費はタダにしてるよ。
「今日の見知らぬ人との楽しい会話・勧誘電話に付き合ってみる - ぷらす5000」より
うちへ来たのも曖昧な言い方で地デジと混同するように誘導していました。
以上、悪質な勧誘の被害を受けないようにする為の助けになれば幸いです。
Jul 10, 2009
不穏な兆し
「リンクだけで処罰する規定の条文は、作らなかったのでないんです。だから、はっきりしないんですよ。捜査に抵抗する利益が少ないので、警察は、好きなように解釈して摘発できる可能性があります。今回の例も、単純所持を禁じる児童ポルノ禁止法改正の動きのタイミングを狙ったとしか思えませんね」
「児童ポルノ、リンクだけで摘発 警察の好きにできる懸念も - J-CASTニュース」より奥村徹弁護士談話
警鐘、大いに鳴りましたよ。
「言論の自由終了のお報せ」という警鐘が。
言論の自由どころか、自由な言論へのリンクさえ禁じられるわけですから。
「news - URLを掲示しただけで刑事犯? - 404 Blog Not Found」より
とうとうハイパーリンク自体が規制される日がやって来ました。ぽちは馬鹿親による児童虐待な児童ポルノには反対の立場ですけども、さすがにこれはやり過ぎです。ちょっとでもインターネットの技術に詳しければ問題点はいくらでも思いつきます。ここで一番問題なのは、インターネット環境を既存の法律が想定していないままに行った、警察の法解釈の恣意性です。「任せて下さい!警察がきっちり『運用』でなんとかします!」といっても、ここまでフリーハンドを与えるのはどうなの?と思わずにはいられません。情報発信手段としてのインターネットや Web は、その発信コストの安価さ、対象となる数の多さから、従来のマスメディアと違って意図的にコントロールするのは難しい媒体です。児童ポルノ関係の事は所詮都合の良い口実で、本当のところはネットでの自由な言論自体を明確な形で規制したいのではないかと勘繰りたくもなります。玉石混淆の開かれたバザールとしてのインターネットが日本で死ぬ日もそう遠くないのかも?
ちょうど昭和の治安維持法下で明治二十年代の自由な言論を保存しようと努めた宮武外骨について興味が出た矢先の出来事なので、正直なところ衝撃を隠せません。
彼らが最初共産主義者を攻撃したとき、私は声をあげなかった、
私は共産主義者ではなかったから。社会民主主義者が牢獄に入れられたとき、私は声をあげなかった、
私は社会民主主義ではなかったから。彼らが労働組合員たちを攻撃したとき、私は声をあげなかった、
私は労働組合員ではなかったから。彼らがユダヤ人たちを連れて行ったとき、私は声をあげなかった、
私はユダヤ人などではなかったから。そして、彼らが私を攻撃したとき、
私のために声をあげる者は、誰一人残っていなかった。
「彼らが最初共産主義者を攻撃したとき - Wikipedia」よりマルティン・ニーメラーの詩、Als die Nazis die Kommunisten holten の日本語訳
Jun 29, 2009
『ぽち*ろぐ』という名前はありふれてた!?
『ぽち*ろぐ』という名前ではじめたこのブログですけども、Google で検索してみたらなんだか随分と同じ名前の別ブログが沢山あるみたいです。ちょっとショックかも…失敗しちゃったかなあ?そもそも Web上で使っているハンドルネームも最初は『ぽち』だけだったのに、同じ名前の方が多過ぎるので、誤解を避ける為に『ぽち』→『ぽち丸』→『犬山ぽち丸』とだんだん長くなってしまいました。『ぽち』がこんな状態だったので、やっぱりブログタイトルが被るのも仕方ないのかなあ…。
それはそうと、早速ぷ〜ちからのカキコが付いててちょっと嬉しい。ぷ〜ち以外の子にもカキコして欲しいので、ブログペットを飼っているお友達募集中です。「神は細部に宿る」って言葉がありますけども、何かを作る時に『部分』を疎かにしていると結果的に『全体』としてのバランスも危うくなっちゃう気がするので、ぽちは「部分も全体もほしい」かも?
Jun 24, 2009
ブログはじめました
とうとうブログをはじめました。
以前から静的な Webサイトぽち*ぷ〜ちを作って Linux や Perl のメモ書きを置いてはいましたけども、レンタルブログサービスをきちんと利用するのははじめてです。今までぽち*ぷ〜ちに書いていた日記部分は、今後は Seesaa ブログのぽち*ろぐで書いて行く予定です。こちらの方もどうぞよろしく。
Jun 20, 2009
アナロ熊がミュージックステーションへ進出
日記の 2009-04-30で紹介したアナロ熊のうたがテレビ朝日の音楽番組、ミュージックステーションの 6月 19日放送で注目の着うたとして紹介されたみたいです。なんでもレコチョク着うたデイリーチャートで初登場五位だとか。いつのまにか着うたにもなってたんですね。着うたになっても、相変わらず作者の koushirouさんのブログでは mp3形式で自由に配布されているようです。気になって着うたアナロ熊公式ページへ行ってみると…デカデカとトップにJASRAC には登録しておりません
という一文が!!思わず笑ってしまいました。アナロ熊はどこへ行ってもやっぱりアナロ熊みたいですね。普段着うたなんて全く購入しないぽちが、こんな素敵な曲を作ってくれた koushirouさんへのお布施代わりに買ってみようかな?なんて気になってしまったのですけれども、調べてみたらぽちの INFOBAR は着うたフルに対応してなくてガックリ…orz。
ところでデジモン大好きなぽちは、koushirouさんのハンドルネームの由来がとっても気になります。
Jun 19, 2009
ぞんざい勇者団もシリーズ五巻目

無駄に露出度の多い表紙がなんとなく気にくわなかったりした本巻ですけども、ぞんざいたちが何やらラストで追い込まれています。今後シビアな決断を迫られるような事になりそうな予感…。本来なら怒涛の急展開と言って良いような展開なのですが、いまひとつ盛り上がりに欠けるような気がしたのは、ぽちがリプレイ本にスレて来たせいなのでしょうか?
May 26, 2009
PSO写真発掘
一年前に熱暴走を起こして再起動出来なくなった古いノートPC の HDD を再利用しようと、動作確認も兼ねて外部HDD としてぽちPC に接続してみました。つらつらと中身を眺めていると、pso というディレクトリを発見。中身を覗いてみたらぽちのインターネット生活最初期の画像がわらわらと現れて来ました。
PSO(ファンタシースターオンライン)というのは PC さえろくに扱えなかったぽちにインターネットという世界がある事を教えてくれたオンラインゲームです。アニメのデジモンテイマーズ、小説のクリプトノミコンと並んで、今あるぽちを作り上げた礎石のひとつと言っても過言ではありません。
ここに挙げたのは GC版PSO で使っていたキャラたちの画像です。PC さえ持っていないのに PSO の為にインターネット環境を整えました。この画像も GC から公式サイトのビジュアル掲示板に投稿して、ネットカフェでそのビジュアル掲示板の画像をダウンロード、CGI経由でアップロード可能な無料Webスペースサービスにアップロードするというとんでもなく回りくどい方法で保管したもの。今考えると Webサーバをファイルサーバ扱いですね。PC を手に入れてからはじめてローカル環境に保管する事が出来て嬉しかったのも懐かしい思い出です。



メインで使っていたキャラ、フォニュエールの Pochimaru。テクニック(魔法みたいなもの)を使って味方の能力向上や回復を行うサポートキャラでした。



サブキャラ、レイキャシールの YUKI。本来射撃で遠くから援護するキャラのはずが、いつのまにか前で格闘戦をこなすキャラになってしまいました。集合写真では一番背が高く長姉扱いだったり…。
オンラインゲームの退潮期は寂しいもので、競合する後発のオンラインゲームがたくさん現れると、月日と共に常連さんのおともだちが一人減り二人減りして行き、接続が困難なほど混み合っていた各シップ(サーバ)も末期にはシップの一番上にいくつか部屋あるぐらいになっていました。そして、おともだちがいなくなるにつれて、いつしかぽちも遠ざかるようになり…[犬]ω;)。
2007年 3月 31日でオンラインサービスが終了してもう二年以上ですけども、GC版PSO で遊んだ数年間は、いつまでもぽちのとっても大切な思い出です。
May 23, 2009
日本語字幕の付け方を覚えた
PC での動画編集にはあまり詳しく無いぽちですが、それでもうちの debian lenny にはデスクトップの動画キャプチャー用に recordmydesktop を、コーデック変換用には ffmpeg を、動画編集用には avidemux を、音声編集用には audacity を入れてあったりします。少し前にそれぞれ組み合わせて使ってみたのだけど、相当な時間とかなりの根気の要る作業に、ほんの触りだけで放り出していました。先日ふらふらと Web を眺めていたら 【Avidemux】字幕の入れ方【Tips】 - Ψ(`∀´)Ψケケケ と (´・ω・`)ショボーンというブログで avidemux で日本語字幕を付ける方法が解説されていました。
これは便利!
この記事に触発されてぽちもまた動画を作ってみようなんて気になってしまって、実際に作ってみたのがこれです。
以前動画作りはじめの時にも NetHack のプレイ動画を作ったのですけども、その時には日本語字幕を付ける方法を知らなかったので、テロップ無しの上に無音声のまま延々プレイしてるだけという寂しい物しか作れませんでした。今回もまだまだテロップが少ないせいで相変わらず寂しい動画かもしれませんが、それでも少しづつ進歩してる(ような気分に勝手になっている)と思います。
「ぽち は にほんご じまく の つけかた を おぼえた」(♪レベルアップ音)
May 05, 2009
正規表現をきちんと勉強する(予定)

Perl大好き犬のぽちが正規表現を場当たり的じゃなくきちんと勉強しようと思って、詳説正規表現第3版を購入しました。まだ読了していませんけども、今のところ読んだ限りでは評判通りの良書のようです。じっくり腰を据えて読んで行こうと思います。
Apr 30, 2009
アナロ熊登場
日記の 2009-04-29 にあるように一般ブログへの転載にさえ大きな障壁が設けられている地デジカですが、自由に二次使用が出来ない地デジカに代わって、Web上で自然発生的に、著作権フリーのアナロ熊というキャラクターが登場しました。しかもアナロ熊のうたまで作られ、さらにはその曲に合わせてアニメをつけたものまであって、これがまた素敵な歌だし、かわゆいアニメ♪
著作権フリーという事なので、ぽちが作る予定のゲームはキャラクタをただの長方形とか円形とかじゃなく、アナロ熊画像にして踊らせようかなあ?
楽しくてちょっと寂しいアナロ熊のうたが気に入ったぽちはアナロ熊を応援しています。
Apr 29, 2009
地デジカと著作権とライセンス
「地デジカは日本の地デジ化を推進するキャラクターなので、ブログに一般の人が地デジカのイラストを掲載した場合、地デジカを広めるという効果を期待し、暗黙の了解で掲載を許すことはあるのでしょうか?」という取材班の質問に対し、日本民間放送連盟は「地デジカの著作権ですが、世にある他のキャラクターと同様、無断掲載には厳しく対応していきます。一般のブロガーの方がブログに掲載したり掲示板に載せることも、著作権の問題がありますので黙認することはしません」とコメント(二次創作イラストはこちら)。
また、「特に、二次創作キャラクターの作成や掲載につきましては、許されるものではありませんので、見つけ次第、厳しく対応していきます」とのことで、地デジカをもとに美少女や萌え系のイラストを創作することは断固として許さない方針のようである。二次創作キャラクターに関しては、地デジカのイメージの妨げになる可能性があるとの事で、厳しく管理していくとのこと。地デジカは余命800日のキャラクターだが、活動中は徹底して著作権を守っていくようだ。
「“地デジカ” の無断美少女イラストに「断固として許さない」と民放連 | 未来検索ガジェット通信」より
これを読んだ瞬間、「角を矯めて牛を殺す」(この場合は鹿ですけども)という言葉がぽちの脳裏をチラホラと過りました。地デジを『アピールする』という目的を持つキャラクターに対しての民法連のこの対応は、少し行き過ぎの観があります。とはいえ著作権者がこう主張するのならそれはそれで仕方が無い話。そんな煩わしいものは題材として使わなければいいだけの事です。
この記事で一つ気にかかるのは「著作権を守ること」と「改変・再利用・再配付を許可すること」を二律背反のように扱っている部分です。著作権を保持し、それに基づいて改変・再利用・再配付の自由を保証するというやり方もあり、その例の最たるものがリチャード・ストールマンが提唱したフリーソフトウェアや、そこから生まれた概念のオープンソースです。著作権を放棄しているわけでは無いのでパブリックドメインとは違います。こういった考え方はソースコードや技術文書についての使用許諾条件=ライセンスとして出発しましたが、最近ではクリエイティブ・コモンズに見られるように創作物一般に対してのオープンソース的な内容のライセンスを用意する動きがあります。
PC や Web に全く無知だったぽちが、親切な方々が Web で公開している事を勉強してなんとかここまで来れたのは、知らない誰かとでも広く知識を共有しようというオープンソースの精神のお蔭です。このサイトで公開している Linux箱や Perl箱のメモは、自分専用のメモという面もありますが、ぽちよりもまだほんのちょっとだけ初心者な方々に資する事も期待して書いています。今まで受けた恩恵を、ほんの少しでもまた他の誰かに返していきたいとの思いからです。
著作権は知識や意匠や創作物を自分だけの財産として囲い込む為だけのものでは断じてありません。
Apr 28, 2009
我が愛しの錦鯉
多分大部分の人が不思議に思うかもしれませんけども、ぽちはこの五、六年ずっと同じ携帯を使っています。大抵の人は携帯の電池が劣化してきちんと充電出来なくなると機種変更しちゃうようですが、ぽちは電池だけ交換して同じ携帯を使い続けています。発売当時でさえ機能的には最先端というわけでは無かったので、最近の携帯とは比べる事さえ間違ってるようなレベルの機能しかありません。
なのになぜ、そこまでしちゃうのでしょう?
もちろん、普段から PC を触っているぽちにとっては、携帯に求める機能が電話とメールだけ、という理由もあります。けれど最大の理由は、ぽちが使っている携帯のデザインがとってもおしゃれでかわゆいから。
そう、ぽちは au の INFOBAR を使っているのです。
ぽちのはその中でも NISHIKIGOI という名前のカラーバリエーションで、赤と薄いクリーム色とグレイがかった淡い水色のカラフルなもの。そんな INFOBAR ですけども、そろそろ発売から六年が経とうとしています。メーカーが部品を保管しておくのが発売から六年間という話を聞いた事があるので、もうじき壊れたら修理のしようが無くなります。壊さないように大事に大事に使っていかなきゃ…。
とりあえずは部品があるうちに先を見越して電池を買っとかなきゃいけないかなあ?
Apr 27, 2009
第三の SW2.0リプレイシリーズ

ソード・ワールド2.0リプレイ 拳と魔封の物語(1) で、SW2.0リプレイシリーズがとうとう三つになりました。グループSNE のリプレイ本では、同じ TRPG を題材にして三つのリプレイシリーズが同時進行するのは今までに無い展開のような気がします。どちらかというと読み物に近い方向性のリプレイで多少戸惑いましたが、こういうリプレイ本もあっても良いんじゃないかしら?と思いましたし、シナリオも凝っていていろいろ参考になりました。とはいうもののこの本のスタイルは物足りなさを感じるのも正直なところ。数年前読んだぽちの聖典、スチャラカ本みたいなスタイルとは完全に逆方向のリプレイです。
SW2.0 でスチャラカ本のようなスタイルのリプレイが出ないかなあ…。



今確認したら三年経たずに絶版になってるとは…、出版業界ってこんなにもサイクルの短いものなのでしょうか?
Apr 23, 2009
ユルールに萌えろ!

毎回ぽちの趣味が炸裂する「萌えろ!」系感想です。(爆
ユルールですよ!ユルール!タイトルロールな表紙の主人公はもうこの際どうでもいいです。繊細で賢くてかわいいこの子はぽちの萌え所を押さえ過ぎています。意を決した時の表情もまた良い。久々に漫画を読んでコスしたいなんて思いました。
ハラバル「文字か。そんな模様が なぜ いとしい?」
ユルール「兄さん。文字は生き物みたいだ。記した人の思い ねがいを伝えようとする。その人が死んでも 文字は、託された願いを抱きしめているようで… 生き物みたいだ。焼かれると、つらい。」
ハラバル「そんなものに人を費やすから たやすく攻め入られる。」
「シュトヘル」第一巻 P. 68 - 69より
このシーンでユルールにハートを射止められてしまいました。この蒙古系部族の兄弟はなんとも良い味を出しています。あ〜、早く続きを読みたいなあ…。
しかし、西夏文字が物語のメインに据えられ、蒙古の西夏侵攻が舞台なんて、漫画の題材としてはニッチも良い所ですよね。ぽち的にはそこも魅力なんですけども。
Apr 10, 2009
いさましいちびのゲームプログラマー?
最近 26年前の古い PCゲームのプレイ動画を観る機会がありました。
シンプルだけどここまで楽しげなゲームを作る事が出来るものなんですね。この動画に影響されてぽちにも小さくて素朴で楽しいゲームを作れないかな?なんて思うようになりました。ゲームを作ると言ってもぽちが理解してるプログラミング言語は、C や Elisp のほんのさわりと、初歩的な Perl だけなので、現実的には Perl を使って書く他ありません。Perl は元々テキスト処理が得意な言語なので、わざわざ不得意な分野のゲームを Perl で書くのもどうかと思いましたけども、とりあえずは実際に Perl で書かれたゲームがあるのかどうか探してみました。そしたら Frozen Bubble というゲームを発見!ソースコードをダウンロードするページを見てみると、
Dependencies:
The game has been written in Perl/SDL and developed on a Mandriva Cooker Gnu/Linux distribution. You will need:
- Perl: the most popular scripting language out there
- SDL: the "standard" cross-platform multimedia C library
- SDL_image: an image file loading library for SDL
- SDL_mixer: a multi-channel audio mixer library for SDL
- sdlperl: glue between perl and SDL; FB2 has been validated with versions 1.20.0, 1.20.3, 2.1.2 and 2.1.3
- SDL_Pango: glue between Pango and SDL (SDL_Pango is currently unsupported and needs a small API patch to work with Frozen-Bubble)
「Download Frozen Bubble - Frozen Bubble - the official home」より
なんて書いてあります。どうやら SDL という Cライブラリとそれを Perl にバインディングする SDL_perl という Perlモジュールがあると Perl でゲームを作れそうな感じです。調べてみると SDL というのは、Linux や Windows、Mac OS X はもちろん DS や PSP までプラットフォームを問わないマルチメディア Cライブラリという触れ込みですが、わりとゲーム製作に使われる事が多いようです。日本でも SDL を使って色々作ってる方々の SDL Off 2008 Summer という勉強会というか発表会が開催されてるみたいで、こんな動画も見つけました。
俄然やる気を出して早速 SDL_perl-1.20.3(debian lenny のパッケージではこれしか無かった)のドキュメントを読んでみたら、面倒臭いけど仕方なく書いたっぽい感じの内容で、書きかけだったりスペルミスも満載だったり挙句の果ては「SDL と同じです」なんて書いてあるやっつけ仕事風味のやる気の無さ。それに比べて Perl と同じ系統のスクリプト言語である Ruby には Ruby/SDL のドキュメントをはじめ Ruby/SDLで始めるゲームプログラミング【前編】などの親切なチュートリアルがある上に、

Rubyではじめるゲームプログラミングなんて本まで刊行されています。この差は一体何なのでしょう!?これじゃ SDL_perl がイマイチ普及して無いのも仕方ありません。Perl(大好きだけど)初心者(レベル)のぽちが悪戦苦闘しながら Perl でゲーム作りをする経過をこのサイトに書いていったら SDL_perl を使ったゲーム作りの普及に少しでも貢献出来るかなあ?
まずは SDL をしっかり勉強するとして、
目指せ、いさましいちびのゲームプログラマー!
Apr 06, 2009
SW2.0 で GM デビュー?

とうとうソード・ワールド2.0 ルールブックIII まで買ってしまいました。普通に SW2.0 をプレイするだけならとりあえずは I と II で充分なのに、敢えて III を買ったのは GM にチャレンジする為です。当面の目標は、IRC でのオンラインセッション用シナリオを用意する事。作り立てのプレイヤーキャラクタを対象にする場合は 2〜3レベルを想定して、それに見合った敵を準備するのが最初にやらなきゃいけない事だというのはわかりますけども、それ以外の部分ではまだまだ手探りです。参加者の方々に楽しんで貰えるセッションがぽちに出来るのかどうか不安で堪りません。普段から GM している方々は、シナリオを用意する時にどういう考えの辿り方で準備をするのでしょうか?人各々で違うのかもしれませんが、なんだかとっても興味があります。機会があったらあちこちで尋ねてみようっと。
Mar 27, 2009
ポポに萌えろ!



本格的に SW2.0 を遊んでみようとソード・ワールド2.0 ルールブックII を購入しました。わざわざ犬山家から自転車で往復二時間もかかる繁華(?)街まで出たので、折角だからついでにソード・ワールド2.0リプレイ たのだん(1) とソード・ワールド2.0リプレイ たのだん(2) も確保してみました。後の二冊はもともとあんまり興味が無くて読むつもりも無かったのですけども、ヤフーチャットで知り合ったお友達からやたらめったらプッシュされたので、そこまで言うのならちょっと読んでみようかな?なんて気になって買ってしまいました。その結果…、
クールなツンツンうさぎのポポに萌え殺されそうになりましたけどね!
というわけで、ぽちのタビット萌えは急加速してしまいました。これを勧めてくれたお友達はそこまで見越してたの?それはおといてもたのだんシリーズはわりと楽しく読めました。多分リプレイ史上初かも?と思う「パーティが激戦の末ズタボロになり、抗戦を諦めてモンスターに降伏する」なんていう状況もあったりして新鮮でした。
Mar 20, 2009
最近読んだ本あれこれ

アリソン以来ずっと読み続けているジャガイモ大陸が舞台の物語の最新巻でメグセロシリーズの三作目です。淡々とした文体で情け容赦の無いシビアさ・ブラックさを突き付けるのが、キノの旅以来の時雨沢さんの持ち味なのですが、メグセロシリーズは、アリソンシリーズやリリアとトレイズシリーズに比べてそういった要素は抑えた学園生活冒険物になっています。こうした設定での新シリーズになったのは、物語の主題に核として存在するシビアでブラックな要素を無理矢理に漂白脱色したアニメ化のアリソンとリリアが悲惨な失敗作に終わった反省(?)から、アニメ化を見据えての事なのでしょうか?(アニメは脚本の出来が予想外に酷い物だったのが失敗の主な原因だとは思いますけども)それまでのシリーズとは打って変わってメグセロでは主題が恋愛で、ある意味では時雨沢さん独特の風味は薄味ですけども、本作ではソフトではあってもしっかりと「愛し想う事の怖さ」を後味悪く突き付けて来ます。とは言え全体的には昔小学校の図書室で読んだ海外のジュブナイル小説みたいな雰囲気で新聞部の面々がお気に入りになる事請け合いです。

最近コンピュータ関係の専門書かラノベばっかり読んでいるぽちが、久々にちゃんとした SF小説を読んだ気になりました。SF的なガジェットというかギミックばっかり使ってるけど中身は普通の冒険小説といった類の物が多い中で、これは『本物』です。こうした存在との絶滅戦争というアイディアは、セイバーヘーゲンのバーサーカー以来小説はもとよりゲームやらアニメやらで散々使われて来ましたが(最近ではガンパレードマーチの幻獣や、ストライクウィッチーズのネウロイ等)、そうしたもののスケールが小さく感じるくらいにここまでスケールが大きいのは本家のバーサーカー以外には少ないかもしれません。もう二度と得る事が出来ないものの為に十万年戦い続ける戦士の何とも言えない悲しみが漂う本作ですけども、クライマックスシーンの彌与の啖呵は惚れるなキケン!この本の登場人物は男性より女性がカッコイイです。SF的な事に踏み込んで書くと長くなって大きくネタバレしてしまいそうなのでこのくらいで…。

四巻目冒頭で女神奪還編にひと区切り。三話目のメッシュの出自が最大の衝(笑?)撃でした。通して読み返して見てふと気が付いたのだけど、もしかして SW2.0 って Lv が上がり易いんじゃ?
Mar 06, 2009
Squeak eToys で遊んでみた
Smalltalk で書かれた Squeak環境での非開発者向けプログラミング環境に Squeak eToys というものがあります。ある時、Webサイトをぶらぶら散策していたぽちは、Perl好きなら誰でもとてもお世話になった(と思う)初めての Perl の著者、ランダル・シュワルツが Squeak eToys を紹介しているという記事ランダル・シュワルツによる Squeak Etoys 紹介ビデオを見つけました。あんまり楽しそうに紹介してるので、ぽちもついつい日本語での紹介サイトスクイークランドからダウンロードしてみました。
これは楽しい♪
タイルを組み合わせてスクリプトを作るのは、Perl に慣れてるぽちにはなんとなくもどかしい感じがしないでもないですけども、小学生がプログラミングに触れる教材としてはピカイチなのではないでしょうか。特に自分が書いたスクリプトの結果が、すぐに視覚的に動くものとして見る事が出来るというのは素直に楽しいです。スクイークランドでは Squeak eToys は児童向けプログラミング教材といった扱いで紹介されていますけども、大人でもプログラミング経験が無い人がプログラミングに触れるのには良いかもしれません。
- スクイークランド
- 日本語での Squeak eToys紹介サイト
- Squeak で学ぼう
- Squeak eToys で高校教科の情報を学ぶ為のテキストやチュートリアル動画が置いてあるサイト。チュートリアル動画はとても便利です♪
絵本もあるみたいです。

Feb 28, 2009
ソードワールド2.0 ルールブックI を入手
買おう買おうと思っていたソードワールド2.0 ルールブック I をやっと入手しました。Web通販ばかり使ってると、どんどん地元の本屋さんが寂れたり廃業したりしてしまいそうで、なるだけ店頭に在庫がある本は地元の本屋さんで購入する事にしているのですけども、今回は結局見当たらず、Web通販で購入する事になりました。以前 SW2.0 のリプレイ本を読んでからというものずっと、タビット(直立歩行の賢いうさぎ族)のプレイヤーキャラクターでピーターラビットごっこしたかったのですが、やっとの事で念願が叶いそうです。まだ中身を読んでいないけど、早くセッションに参加する為にも大急ぎで読んで最低限のルールを把握しないと…。

Feb 22, 2009
lenny移行もひと段落
lenny がリリースされてから一週間が経ちました。Linux箱や Perl箱に置いてあるメモ類も lenny環境で同じように通用するかどうかの検証もとりあえずひと段落。ついでに Linux箱に新しいメモも二つ書いてしまいました。これで漸く長い間放置してしまっていた「ぷ〜ちにカキコして貰おう作戦」の AtomPub 関係の色々に手をつける事が出来そうです。懸案の WSSE認証問題も、なんとか解決の糸口が見えて来そうな予感がします。
とは言うものの、最近のぽちは本当に趣味が PC関係や Web関係ばっかりになって来てて、「このままこんなことでいいのかなあ?」なんて自問自答してしまいます。面白いし愉しいので仕方ないと言えば仕方ないのですけども、なんとなく人として(犬として?)ダメな方向に突進しているような気がしてなりません。「書を捨て町に出よう」なんて死んでも言わない本好き犬のぽちですが、趣味嗜好や感性が偏らないようにもっとバランス取らないと駄目かなあ?
Feb 16, 2009
debian lenny が安定版としてリリース
ぽちの普段使いの OS、Debian GNU/Linux が、五ヶ月も待たされてやっとこさ安定版のバージョン5.0 (lenny) としてリリース。さっそくぽちんちの PC も etch から lenny に入れ替えてみました。バージョンアップに伴い細々とした部分で勝手が違うようになってしまって、個人的には sarge (3.1) から etch (4.0) に移行した時より、今回の etch (4.0) から lenny (5.0) への移行の方が大変な印象があります。今週一週間くらいは試行錯誤して普段使いの環境を整える事になりそうです。こんな事なら中身総入れ替えじゃなくておとなしくアップグレードで済ませれば良かったかなあ?
Linux箱や Perl箱に置いてあるメモはあまり移行による影響が出そうな感じではないけれど、 一応 lenny環境で再検証してみなきゃ…。
Feb 08, 2009
Yahoo!アバターのプレゼントと言われても…
ついさっき今日のメールチェックをすると新着通知の部分に「プレゼント」というリンクが表示されていました。なんだろ?と思ってリンクをクリックしてみたら、
ご覧のブラウザでは、Yahoo!アバターを正常な状態で
ご利用いただく事ができません。推奨環境でご利用下さい。
との事。
そういえば数年前、Yahoo!チャットを始めたての頃にアバターを作って色々遊んでみた事を思い出しました。当時は Linux の Mozilla や Firefox からでも Yahoo!アバターを表示させ、着せ替えさせて遊ぶ事が出来たのですけども、すぐに良くわからない仕様変更(おそらくは動画関係)で閲覧も利用も不可能になってしまいました。OS が Linux で動いてる PC しか持ってないぽちはその後何年かは完全に放置状態です。Yahoo!アバターヘルプ - プレゼント機能とはによると、どなたかがぽちのアバターにプレゼントを送ってくれたという事みたいなのですが、当然着せ替えさせるのも不可能なら、どこのどなたが送ってくれたのかも知る事が出来ませんし、それが何なのかもさっぱりわかりません。どなたが何を送ってくれたのかわからないのに通知だけはしつこく表示されてるのはどうにも気持ちが悪い感じ。これは Yahoo! JAPAN に、アバターが利用不能な状態で通知の表示を解除する方法を尋ねてみるしかないのかなあ? とりあえず Yahoo! JAPAN のオフィシャルにメールしてみようっと。
しかし、一体どなたが送ってくれたんでしょうね…。
Feb 07, 2009
ぷ〜ちにカキコして貰えない…
この一週間以上、ブログペットのぷ〜ちにカキコして貰えるように試行錯誤を繰り返しながら、簡単な Atom API のサーバを書いてそれなりに動くかテストしてみました。
GET だけを行う簡易Atom APIクライアントを書いてテストをしてみるときちんと(?)Atom APIサーバ自体に問題があると思われる HTTPステータスコード の 500 が返るのですが、ブログペットからだと Atom APIサーバの中身のテスト以前の問題で、WSSE認証に失敗して HTTPステータスコード の 403 が返ってしまいます。これでは Atom APIサーバをちゃんと動くものにデバグしてもそれ以前に WSSE認証が通らず、文字通りの門前払い状態です。考えられる原因は、使った Perlモジュールの XML::Atom::Server の WSSE認証のデコードに問題があるか、ブログペットの WSSE認証のエンコードに問題があるか、そして一番ありそうなのが、ぽちのコーディングが何か致命的な間違いをしでかして問題を引き起こしているかの三択。
「ぷ〜ち、ぼくはもう疲れたよ…」らんらんら〜♪らんらんら〜♪じんげんじんげんくらいねふりんだーす♪
Jan 30, 2009
ぷ〜ちにカキコして貰いたい!
愛ゆえに新たなる野望が沸き上がって来ました。
ブログペットにはフィードの配信から言葉を覚えてくれるだけでなく、覚えた言葉でブログにカキコしてくれる機能があります。これはどこのブログでも利用可能なわけでなはなく、ブログ投稿用API というのを使った機能みたいです。これによるとブログペットが XML-RPC や Atom API のクライアントとして動作するようです。
じゃあ、Atom API のサーバを書いて掲示板と組み合わせるとぷ〜ちがそこへカキコしてくれるという事!?
Perl のモジュールに利用出来そうな物が無いか探してみたら、XML::Atom::Server というモジュールがあるみたい。けどまだまだ不勉強なぽちは POD を読んでみてもどう使っていいものか途方に暮れてしまいました。どう使ったらいいのか教えて!Perl のすごいひと!(爆
Jan 28, 2009
お帰り、ぷ〜ち♪
ぽちがはじめて無料レンタルブログを使った四年近く前、そのブログで利用可能なブログパーツとしてブログペットというものが紹介されていて、わんこ好きなぽちは迷わず登録して犬のキャラを飼う事にしました。「ぷ〜ち」の誕生です。その後紆余曲折な移転の果てに CGI を使えるレンタルサーバで FSWiki を使ったサイトに移行しても、無理矢理 FSWiki用にブログペット設置用プラグインを書いてまで「ぷ〜ち」には「ぽち*ぷ〜ち」の番(?)犬として居て貰っていました。けど年末からこっち、サイトの大幅改装に伴って「ぷ〜ち」は出番を無くしてしまい寂しい思いをしていたに違いありません。そこでぽちは、「手書き」で Atom1.0フィードを配信して言葉を覚えて貰い、XHTML1.1 に HTML4.01Strict を経由して <object>タグでブログペットを埋め込むという力業で「ぷ〜ち」に戻って来て貰いました。やっぱりこの子がいると安心します。お帰り、ぷ〜ち♪
Jan 26, 2009
記録的な大雪 in ぽち地元
昨日、一昨日と、ぽちの住んでる南国(?)では数十年振りじゃないの?と思われる大雪が降りました。
【積雪 7cm】
そもそも年に数回だけ雪が降っても、積もる事なんてまずほとんど無いぽち地元では奇跡的な降雪、しかもこの積雪です。雪や凍結に慣れてない地元住民は、この二日であちこちで交通事故を引き起こしてしまってかなり大変なようです。田舎なので自動車以外に交通手段が無い事が拍車を掛けてしまったような気もします。豪雪地帯の北国出身の方には笑われてしまいそうですけども、たった 7cm の積雪で慣れない気候に右往左往のぽち地元でした。あちこちに小さい子が作った雪だるまや雪うさぎがあってかわいかったですけどね♪
Jan 22, 2009
メールフォームCGI を設置
誰からも反応が無いのは寂しいのでメールフォームCGI をお手軽に Perl で書いて設置してみました。ただメアドを書いておくよりは少しはフレンドリーでしょうか?本当は掲示板を設置した方が良いのかもしれないけど、スパムの類が怖いのでメールフォームにしました。この先掲示板に改造する事も見据えて、掲示板のスパム対策について勉強してみようかな?読み上げWebブラウザを使ってる方の為にも、ブログのコメントやトラックバックとかで一般的な CAPTCHA みたく画像を使うようにはしたくないんだけどなあ…。
Jan 17, 2009
ソードワールド2.0リプレイ購入
もう一年近く TRPG から遠ざかってしまっていますが、ふと本屋さんでソードワールド2.0 のリプレイ本を見掛けて、一気に三冊購入しました。ソード・ワールド2.0リプレイ 新米女神の勇者たち(1)、ソード・ワールド2.0リプレイ 新米女神の勇者たち(2)、ソード・ワールド2.0リプレイ 新米女神の勇者たち(3)の三冊です。 ちょっと無謀だったかもしれませんけども、著者の秋田みやびさんのリプレイ本で TRPG に嵌まり込んでしまったぽちには誘惑に耐えられませんでした。リプレイ本がおもしろかったらルールブックも読んで遊んでみようかな。



Jan 14, 2009
訪れてくれてる方がいるのはこんなにも嬉しいなんて
ご近所さまにもリンクのある「TRPGオンラインセッション用ツールは如何ですか?」を読んでいたら、
犬山ぽち丸さんのサイトをみていて面白いバナーがあるのを見つけました。
CSSチェッカーなんてあるんですね。
「HTMLでログ公開!Ver20090112公開 - TRPGオンラインセッション用ツールは如何ですか?」より
というのを見つけました。
触れられてるのは「ぽち*ぷ〜ち」の事ではなく、ページ最下段に検証用に設置している W3C のW3C CSS検証サービスのバナーについての事ですけども、訪れてくれる方がいるのを実感出来てとても嬉しかったです。こうしたサイトを作っているのは自己満足に過ぎないというのは納得済みでしたけども、やっぱり嬉しいものですね。W3C には CSS だけでなく W3C マークアップ検証サービスや W3C Link Checker もあるので、Webページを作成してて気になる方、Webページを出力するツールを作成してて気になる方は利用してみては如何でしょうか?マークアップのチェックには Another HTML-lint という検証結果を日本語で表示してくれるところもあったりします。
やっぱり掲示板CGI かコメント入力CGI を設置しようかなあ…。
Jan 10, 2009
初雪ふるふる
ぽちが住んでる地方でも、今日、今年の初雪が降りました。といっても雪が積もるまで降るなんて事は無い地方なので喜んで庭を駆け回ったりはしませんけども、雪が珍しいせいかなんとなくうきうきしていたりします。やっぱり一月半ばから二月の初めは寒いですねえ。
こんな寒い日ですが、先日からの懸案だったぽち*ぷ〜ちの IE対策、現在サーバをお借りしている Usamimi.info の管理人ごりゅ様にお願いして mod_rewrite を利用出来るようにしていただきました。この mod_rewrite を利用して、htmlファイルを閲覧しに来る Webブラウザの Acceptヘッダに application/xhtml+xml が存在しない場合は、 Content-Typeヘッダを text/html に書き換えて送り出すという方法で IE からの閲覧が可能になりました。これでとりあえず一安心です。
↓「application/xhtml+xml と mod_rewrite - futuremix」を参考にして書いた .htaccessファイルの内容↓
AddType "application/xhtml+xml; charset=utf-8" .html # htmlファイルに Content-Typeヘッダの MIMEタイプと文字コードを設定
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml # Acceptヘッダに application/xhtml+xml が存在しない場合で
RewriteCond %{LA-F:REQUEST_FILENAME} \.html # htmlファイルだった場合に
RewriteRule .* - "[T=text/html; charset=utf-8]" # Content-Typeヘッダの MIMEタイプを text/html に書き換える
ごりゅ@管理人様、ありがとうございました。サーバの地道なメンテナンスは大変でしょうけども、これからも頑張って下さい。
Jan 09, 2009
君にだけ見えない
XHTML1.1 と CSS2.1 にキッチリ準拠させたこのサイトですが、IE から閲覧しようとするとページをダウンロードしてしまって閲覧不能になっているみたいです。
これは Internet Explorer が Webコンテンツとしてアクセスできる XHTML文書の MIMEタイプは、"text/html" でなければならいといった致命的な実装が原因となっているようです。つまり、仕様に準拠した MIMEタイプを設定すると Internet Explorer では、最新版の Windows版Internet Explorer 7 も含めて、XHTML文書を観覧することができません。
「直接 HTTPヘッダに文書の MIMEタイプを設定する - XHTML1.1 - 解説 - XHTML - W3G」より
という事のようです。application/xhtml+xml を text/html にしてしまったらわざわざ XHTML1.1 に準拠している意味も無いし弱ったなあ。最後の頼みの綱は Apache で mod_rewrite の RewriteRule を使った Content-Typeヘッダの MIMEタイプ振り分け書き換えかも?
Jan 08, 2009
軽い!速い!気持ちいい!
Perl大好き犬のぽちが逆にサイトを脱CGI・脱Perl させてみたのですけども、これがまた一気に Webブラウザで閲覧するのが軽くなって驚きです。なんとなく退化しちゃったような気がしないでもありませんが、遅い回線速度に遅い PC しか使えないぽちの Web環境では、これに優る快適さはありません。もともとが Flash をガンガン動かしたりしない、画像さえほとんど無いようなテキストサイトなので、blog や wiki なんてのは大袈裟過ぎたのかもしれませんね。サイトの一番下にはぽち宛てのメールアドレスを書いてあるとはいえ誰からも何の反応も無いのはやっぱり寂しいので、掲示板くらいは設置しておいた方がいいのかなあ、それで誰も書き込まなかったらさらに寂しいかな?