バージョンアップ予定

某所の管理人さんにメールはしたのですが、掲示板スクリプトのバージョンアップ。

一部のサーバー(以外?)で不具合が出るのを修正
ボード単位で投稿行数制限できるように変更
ボード単位のスレッド数上限を設定できるようにしました
ゲット送信での投稿禁止
12桁トリップ

専ブラ設定がうまく出来ないサーバーが有るのは、今のところ原因不明なので見送り。

マニュアル変更してベクターに差し替え依頼を出さなくてはいけないので、1週間以上かかりそうです。


掲示板スクリプト公開

 年末にベクターへ公開依頼した掲示板スクリプトが登録されました。これでダウンロードできます。
 http://www.vector.co.jp/soft/unix/net/se494658.html

 perl初心者が作ったcgiなので、上級者には笑われそうな気がしたり、不具合報告が山ほど来そうな感じが有ったり、まったく利用されない心配が有ったりしますけど・・・

 ともかく一般公開です。小規模掲示板から巨大掲示板までと大風呂敷を広げていますが、実際の所、私のようなまとめサイトを作っていて、過去ログ倉庫と避難所の両方が欲しいような人に向いたスクリプトかもしれません。

 ちなみにベクターで公開という手間の掛かる方法を取っているのは、私の契約しているサーバーにはソフトをダウンロードするサイトを作ってはいけないという規約がある為だったりします。ベクターに作者登録がしてあると、作者用ホームページスペースを貸してくれるので、小規模バージョンアップが必要になったら、そちらを利用するかもしれません。

 今回は「まとめサイト作成支援セット」の時より大きく手間が掛かった為、多少お金儲けも考えたりしてます。寄付歓迎となっていますが、銀行口座に振り込まなくてもマニュアルページに有るバナーから広告の業者と契約すると、私にカンパをした事になります。クリックだけでも小額の利益が入る場合もありますが、そういうのは2個しか有りませんので考えないでおきましょう。

 私が今でも公開しているフリーウェアはこれで3個になりますが、全てプラットホームが違っているという・・・ちょっと珍しいかも。

 拍手(投票)コメント機能を公開すれば自作ソフトの全て、まとめサイトを構築する材料がひと通り揃う事になるのですが、こちらは管理者ページを作らないと人には奨められない状態なので厳しいかもしれません。


専ブラと文字コード

 掲示板スクリプトは一般公開に向けてマニュアル作りと動作チェックをしている訳ですが、同様な掲示板を作ろうとしている人(居るのか?)向けに解かった情報を公開。

 Shift_JIS以外の文字コード対応を表明している専ブラは「ホットゾヌ2」がEUC、「SofTalk WEB」がEUCとUTF-8ですね。

 「ホットゾヌ2」はEUCに対応しているという物の、EUCに設定すると名前や本文はEUCで送ってくれるのに、submitボタンの文字列はShift_JISで送るので、ボタンの文字列の確認にShift_JISも使わなくてはなりません。

 その他の専ブラは「したらば」(EUC)には対応している物の、掲示板の判定方法が違うのかほとんどの専ブラでShift_JIS以外では文字が化けまくりでした。

 その内のひとつに「えまのん」が有りました。しかし、えまのんは設定ファイルに文字コードの記述を追加している様子でしたので、その記述をShift_JISからeuc-jpやutf-8に変更したらどうか?と思って試してみました。その結果、UTF-8もEUCも閲覧だけなら出来る事が判明しました。ただ投稿はShift_JISでしかしないようで、投稿しても文字化けするだけでした。
 submitボタンの文字列もShift_JISで送られて来るので、この文字列がShift_JISなら文字コードを変換すれば良さそうですが、そうすると上に書いているように「ホットゾヌ2」での投稿が文字化けする事になります。
 結局ユーザーエージェントに「Emanon」の文字列が有れば文字コードをShift_JISから他の文字コードに変換するようにしました。
 結果UTF-8でもEUCでも投稿できるようになりましたが、UTF-8で投稿すると、datファイルが壊れていますというエラーが出ます。
 まぁ投稿は出来ていて、スレッドを再読み込みすれば問題無いので、私の掲示板スクリプトでは「えまのん」もUTF-8対応ブラウザという事にしました。作者さんには想定外かもしれませんけど。


 サイトの方に製作途中のマニュアルがアップしてあります。今回はこっそりではなく、トップページにリンクを張っています。読んで解かりにくい箇所が有ればご指摘よろしくです。


見本&動作テスト用掲示板アップ

 製作中の掲示板スクリプトは専ブラ設定以外はほぼ出来上がりました。

 専ブラ設定に手を付ける前にこっそりサイトにアップし一通り機能の動作確認をしたり、専ブラのバージョンアップをして設定方法を確認したりとまだまだ作業が有ります。それでも年内には一般公開できそうな感じになってきました。

 導入を検討している方や、まとめサイトの掲示板に要望の有る方、ただ落書きがしたい方など覗いてみて下さい。書き込み自由ですが、完成したら掲示板はごっそり削除します。
 掲示板スクリプトに対する感想や要望を書き込まれるのも有りです。

shift_jis設定でのテスト
euc-jp設定でのテスト
utf-8設定でのテスト

 スレタイ一覧ページの最後の方に過去ログ倉庫へのリンクが有ります。

 携帯ではまだ見ていないのですが、パソコンでざっと見た感じではeuc-jpとshift_jisは見た目が同じなので、どちらを選択しても良さそう。utf-8ではフォントが違うのでアスキーアートがずれて使いにくそう。

 トップページはテンプレートファイルを2種類用意しました。それぞれを管理人が編集してアップした後に、スクリプト側で板やカテゴリのリストやウィンドウの開き方を書き換える仕組みになってます。

 スマートフォン用スクリプトが必要なのかどうかは、スマフォ持ってないので見当が付きません。どう見えているのかも分かりません。


中間報告です


 現在掲示板スクリプトの管理者ページを製作中な訳ですが、やっぱり複数で管理できないと駄目だろうな〜と云う事で現在はメンバー管理部分の作業をしてます。

 管理者は掲示板の設定を含む全てを管理する「オーナー」、設定以外の部分で複数有る掲示板の全てを管理する「マスター」、1つのカテゴリ内の複数の掲示板を管理する「カテゴリ管理者」、1枚の掲示板だけを管理する「ボード管理者」の4種類に分けて、それぞれ専用のログインスクリプトを用意します。「オーナー」以外の管理者は「レス管理」「スレッド管理」「全体管理」という具合に権限を3つに分けるようにしています。1人で全部管理する場合は「オーナー」用スクリプトしか使わないのですけど。
 この画像は「オーナー」用スクリプトの画面ですね。デザインがお粗末ですけど。

bbs_menu


 まぁ今の所「オーナー」用スクリプト以外は影も形も無いのですが、他は「オーナー」用スクリプトをちょっと修正すればできるかな、などと簡単に考えています。

 規制の設定は複数掲示板全体への設定と掲示板単体での設定と両方できるようにしています。これでサーバーの規約が許す所であればレンタル掲示板としての運用もできるはずです。借り手の獲得方法まで用意する気は有りませんけど。

 dat落ちはスレッド数の上限を超えてスレ立てされたら、スレッド一覧の1番下に有るのを過去ログ倉庫に移動する仕様になってます。2ちゃんねるのように980レスを超えて24時間以内に書き込みが無ければdat落ちなどと云う高度な仕組みは思いつきません。過去ログ倉庫はdatファイル形式のまま保管します。

 画像に有る機能の内、管理者設定が製作途中で、メンテナンス告知/掲示板再構築/専ブラ設定/トップページ編集などの機能はまだ作っていません。
 他は大体作って有りますが、ちまちまと仕様を変更したせいで、管理者用スクリプト以外にも変更が必要になってます。まぁ年内には完成しそうな感じではありますが、さてどんなもんでしょうね。使いたい人が居るかどうかも謎ですけど。


画像対応の前にSETTING.TXTの項目追加

 画像対応をするに当たっては、画像モードがONかOFFかを何処かに書き込まなくてはなりません。やはり板単位でON OFFが切り替えられる方が良いですからね。
 そうすると、SETTING.TXTに項目を追加するのが妥当と考えられます。2ちゃんねるには無い機能なので、他所の掲示板などを参考に項目を追加する事にしました。
 ついでに初期には見送った設定も追加する事にします。

BBS_PASSWORD_CHEC=checked/無し
 checkedになっているとスレ立てフォームをindex.htmlには表示せず別画面にします。

BBS_SLIP=checked/無し
 checkedにするとIDの末尾1桁に端末情報を追加します。
 既にパソコンは0携帯はOというのはやっていますが選択できるようになります。

ここまでは2ちゃんねるの旧サーバー方式に有る設定、これからは独自設定です(一部0ch Scriptの真似してます)。

BBS_READONLY=caps/trip/checked/無し
 checkedにすると誰にも書き込みが出来ない板になります。過去ログ倉庫専用板にする時に使います。
 capsにするとキャップIDを持っている人だけが書き込める板になります。キャップ機能は記事には書かずにこっそり付けましたが、管理者用トリップのような物です。事前に管理人がID登録しないと使えません。それを利用して書き込みは会員制の掲示板にする事ができます。
 tripにするとキャップIDを持っている人と、規制スルーに登録したトリップを持っている人が書き込める板になります。

BBS_MOBILECAP_AUTO=checked/無し
 BBS_READONLY=caps及びtripになっている時のみ有効な機能。
 キャップIDに携帯の端末IDを登録し、携帯から書き込む時は自動的に端末IDをキャップID入力欄(メール欄)に書き込みます。

BBS_IMG_MODE=checked/無し
 checkedにすると画像がアップロードできるようになります。

BBS_IMG_MAX_SIZE=102400
 アップロードできる画像の最大サイズを設定。単位はバイト

BBS_IMG_THUMBNAIL_X=120
 サムネールの横幅の最大ピクセル数

BBS_IMG_THUMBNAIL_Y=120
 サムネールの縦幅の最大ピクセル数


 と書いたものの、一体いつ頃実装できるかは謎ですけど。
 
 最近になってやっとこさアフィの申請をする気になりまして、現在まとめサイトに使っているサーバーとドメイン管理業者の広告をパソコンのページに入れました。今書いている掲示板スクリプトや過去に書いた投票コメント機能については、当然実行できるサーバーです。
 独自ドメインとセットにすると、メールアドレスが作り放題なのですが、comドメインからメール送信すると最近は携帯やwebメールで弾かれる事が多いです。これからサイトを持とうという人は少々高くてもjpドメインが良いかもしれません。

 アフィの申請が通ったので、掲示板には憑き物の広告対応を先にするかもしれないです。


aa.cgi:アスキーアートを画像へ変換するメインルーチン

 サブルーチンは出来上がったので、メインルーチンです。メインルーチンでは文字列を取得して画像系サブルーチンに渡す作業と、出来上がった画像の良し悪しで画像の書き直しをします。
 引数はpathinfo形式でaa.cgi/wararei/1173973901/30のように渡します。通常は240ピクセル描画で480ピクセルにする時は最後にwを付けます。

#!d:/perl/bin/perl

require 'setting.cgi';
require './sub/aa.pl';

use utf8;
use Image::Magick;

cgi_main();
exit(0);

 この辺は毎度のお約束です。

sub cgi_main{
    my $size;
    ($opt,$bbs,$key,$opt) = split( /¥//,$ENV{'PATH_INFO'});
    my ($num) = $opt =~ /(¥d+)/;
    if (index($opt,'w') < 0) {
        $size = 1;
    } else {
        $size = 2;
    }

 引数を取得する部分です。

    my $str;
    if(open(LOG,"< ../$bbs/dat/$key.dat")) {
        flock(LOG,1);
        my $fpt;
        if ($fpt = get_index($num)) {
            if ($num == 1) {$fpt = 0;}
            seek(LOG,$fpt,0);
            ($str,$str,$str,$str) = split(/<>/,<LOG>);
        }
    close(LOG);
    }

 索引を使ってdatファイルから本文を読み込みます。

    my $sp = encode($outchr,$sp = ' ');    #全角スペース
    $str =~ s/(?:¥s|$sp|<br>)+$//o;          #文末の余分な改行とスペースの除去

 アスキーアートを取り出すに当たって文末に余分な空白が有ってもサブルーチンの方で除去するのですが、処理が軽くなるように文字列の段階で除去しておきます。

    my @line = split(/<br>/,$str);
    my $height = @line * 18;

 本文を<br>で分割して配列に格納します。配列に格納する前にutf-8に変換しておきたい所ですが、文字列の長さを調べる必要が有るのでそうもいきません。
 この段階では文字列の高さを16ピクセル行間を2ピクセルという事で画像の高さ$heightに代入しておきます。

    @text = html_txt(@text);
    my $width = shift(@text) * 10;
    img_init($width,$height);

 昨日の記事で作ったサブルーチンで本文の配列を変換し最長文字数を元に仮描画する画像の横幅を決めます。
 1文字を縦16ピクセルで描画する場合、半角文字の横幅は8ピクセルで良さそうですが、プロポーショナルフォントなので多少余裕を持たせて10ピクセルとしておきます。

    my @pos = img_str(2,@text);

 文字列をimg_strサブルーチンに渡して描画します。最初は必ず2を渡して16ピクセル(2×8)の高さの文字で描画します。
 配列@posには描画後トリミングした画像のサイズが入ります1番目の要素に幅、2番目が高さです。

    if ($pos[0] > 0 && $pos[0] < 240 * $size) {

 画像サイズが0(何も文字が無かった)ではなく、240または480ピクセルより小さい場合はもう一度描画をやり直します。
 色々と試したところImageMageckライブラリでの文字の描画は小さい文字で書いて拡大すると、画像がボケるので大きく書いて縮小する事にしました。GDの場合は画像の縮小が単純に余分なピクセルを間引くだけなので、ボケるのを覚悟で小さく書いて拡大しないと文字が読めなくなります。

        $pos[0] /= 2;
        my $big = int($size * 240 / $pos[0] + 0.999);

 出来上がった画像のサイズから文字を8ピクセルの何倍にしたら良いかを計算して$bigに格納します。0.999を足しているのは切り上げの処理です。普通の切り上げなら0.9を足すだけで良いのですが、上の方のif文で少しでも小さければ再描画なので、480/239.5=2.004…となるのを考慮しています。これで再描画の倍率は3以上の数値になります。ちなみに四捨五入なら0.5を足します。
 実際の所、479ピクセルを480ピクセルに拡大してもボケないと思いますけど、計算の都合です。試した所170ピクセル程度の画像を240ピクセルに拡大するとボケが目立ちました。

            img_del();
            $width *= $big;
            $height *= $big;
            img_init($width / 2,$height / 2);
            @pos = img_str($big,@text);
        }
    }

 倍率は8ピクセルの何倍かですから、16ピクセルで計算した$width、$heightを半分にして描画サブルーチンを呼び出します。

    img_resize($size,@pos);
    img_print();
}

 最後に画像サイズを240ピクセルまたは480ピクセルに整形して出力します。
 これでアスキーアートというかレス本文を画像として出力できるようになりました。後はaa.cgiの出力を表示するa.cgiが必要になります。説明を書こうかと思ったのですが、htmlのimgタグで張るだけの話ですので省略します。

 仕組みが頭に浮かんだので作ったのですが、文字化けをしないように表示するには時間を掛けてバージョンアップをしていく必要がありそうです。が、アスキーアートビューアーはしばらくこのままにしておいて、画像アップロード対応を検討します。


aa.cgi:アスキーアートを画像へ変換する前のサブルーチン

 メインルーチンを作る前に、文字列変換もサブルーチン化した方が良さそうに思えてきたので、2個サブルーチンを追加します。

sub html_txt {
    my @text;
    my $len;
    my $width = 0;

 引数として文字コード変換前の本文を1行ずつ要素に格納した配列を受け取ります。

    foreach $data(@_) {
        $data =~ s/^ +//;       #行頭の半角スペース削除
        $data =~ s/ +/ /g;        #2個以上の半角スペースは1個に
        $data =~ s/<.*?>//g;   #htmlタグ削除

 ImageMagickの文字列描画関数は空白の扱いがhtmlとは異なるので変換します。

        if ($outchr ne 'shift_jis') {
            my $tmp = $data;
            Encode::from_to($tmp,$outchr,'shift_jis');
            $len = length($tmp);
        } else {
            $len = length($data);
        }

 文字列の長さを取得します。半角を1文字全角の1文字を2文字とカウントする為にはshift_jisが都合が良いので、元の文字コードがshift_jisでない場合は仮変換してからカウントします。

        if ($width < $len) {$width = $len;}
        if ($outchr ne 'utf-8') {$data = decode($outchr,$data);}

 文字列幅の最大値が$widthに入るようにします。その後文字コードをutf-8に変換します。

        $data = str_cnv($data);
        $data =~ s/¥¥/¥¥¥¥/g; #"
        push(@text,$data);
    }
    return ($width , @text);
}

 &nbsp;や&amp;等のhtml特有の文字列をstr_cnv関数を作って変換します。
 昨日掲載したサブルーチンで使うAnnotate関数は何故か円記号がそのままでは表示できないので変換します。この変換方法でも多少不具合が出るみたいです。
 返り値として配列の最初の要素に文字幅の最大数を、残りに変換した文字列の配列を渡します。

sub str_cnv {
    my $text = shift;
    my @src = (
        '&quot;|&#34;|&#x22;',
        '&amp;|&#38;|&#x26;',
        <中略>
        '&lsaquo;|&#8249;|&#x2039;'
    );

    my @dst = ('"','&','<','>',' ','¡','¢','£','¤','¥',
        '¦','§','¨','©','ª','«','¬',' ','®','¯',
    <中略>
  '‘','’','‚','“','”','„','†','‡','‰','‹' #250
    );
    my $j=@src;
    for(my $i=0;$i<$j;$i++) {
        $text =~ s/$src[$i]/$dst[$i]/g;
    }
    return($text);
}

 文字列を力技で変換するサブルーチンです。utf-8に変換した後に残る&amp;や&nbsp等のhtml特有の文字列を変換します。ただし全ての文字列が変換できる訳では有りません。うまく変換できない物は?に化けます。
 このサブルーチンではencode関数で変換し損なった文字列には対処できません。その辺りは今後の課題として検討する必要が有ります。
 encode関数で文字コード変換前に&#99xxxx;等の独自の書式で予め変換しておく等の措置が必要かもしれません。
 今回のサブルーチンは文字化け対策が必要なため頻繁にバージョンアップする必要が有ります。昨日公開したサブルーチンはグラフィックライブラリを変更したら差し替えられるようにしたいという事で、aa.plという別ファイルに記述してrequire文でメインルーチンに挿入するようにします。


aa.cgi:アスキーアートを画像へ変換するサブルーチン

 さて、アスキーアートを画像に変換するにはGDとImageMagickのどちらのライブラリが良いのか?という事になりますが、私が借りているサーバーではGDはサポートせず、ImageMagickのみサポートしているので結論は1つしかありません。実際にはGDで作ってアップしたら動かなかったのでImageMagickで作り直したのですけど。
 そんな訳で本来はメインルーチンから書くのですが、今回はサブルーチンからにしました。

 まずはフォント名などの設定に関係する部分はsetting.cgiに書いておきます。

$fontfile = './ipagp-mona.ttf';

 フォントファイルはcgiと同じディレクトリに置いた方が表示の失敗が少ないような気がしますが、何とも言いがたいところです。
 メインルーチンでuse Image::Magick;とuse utf-8;が宣言されている前提でaa.cgiのサブルーチンを書きます。

sub img_init {
    my $x = shift;
    my $y = shift;
    $image = Image::Magick->new;
    $image->Set(size=>$x.'x'.$y);    # カンバスサイズ 
    $image->ReadImage('xc:white');    # バック白
}

 メインルーチンから引数として、画像の仮のサイズを変数$xと$yに受け取ります。
 イメージオブジェクトを初期化して、画像サイズをセット、背景を白で塗りつぶします。
 ReadImageは画像ファイルを読み込む時に使うのが主な役割の関数ですが、画像を読み込まない場合でも背景色を設定する為に必要になります。
 $image変数だけがグローバル変数になります。

sub img_del {
    undef $image;
}

 イメージオブジェクトを削除するサブルーチンです。出来上がった画像のサイズによっては削除してから書き直す必要が有るので作りました。メインルーチンに書けば1行で済むのですけど、この辺は気分です。

sub img_str {
    my $size = shift;    #1=8ピクセル
    my @text = @_;
    my $y = $size * 8;
    my $yadd = $y + $size;
    $size *= 8;

 文字を画像に変換するサブルーチンの冒頭部分です。引数として8ピクセルの何倍なのかを$size変数に、残りのはutf-8に変換した文字列の配列です。

    foreach $data(@text) {
        $image->Annotate(
            text=>$data,
            fill=>'black',
            font=>$fontfile,
            pointsize=>$size,
            x=>'0',
            y=>$y
        );
        $y += $yadd;
    }

 Annotate関数で文字列を画像に書き込みます。Pointsizeは検索した内容ではポイント数を渡すと書いて有りましたが、実際に試した所ピクセル数を渡すようです。
 またこの関数に渡す文字列はutf-8でなくてはならないと決まっています。GDの類似の関数も同様です。

    $image->Trim();
    my ($width, $height) = $image->Get('width', 'height');
    return($width,$height);
}

 Trim関数で画像の上下左右の背景色しか無いラインを切り落とします。trim関数だけでは出力する画像のサイズは変わらず、Set関数でpage指定しなくてはならないのですが、この後再描画が発生する可能性が有りますので、ここで画像サイズを変更しても無駄に終わる可能性も有るのでSet関数による調整は最後にします。
 返り値として変換後の画像の幅、高さの配列を渡してサブルーチンを終わります。

sub img_resize {
    my $size = shift;
    my $width = shift;
    my $height = shift;
    $size *= 240;
    $height = int($height / $width * $size + 0.5);
    $image->Resize(width=>$size,height=>$height);
    $image->Set(page=>$size.'x'."$height");
}

 img_strで作成した画像のサイズを240の倍数の幅にリサイズするサブルーチンです。
本来は240ピクセル固定でも良いのですが、ついでに480ピクセル対応もしたので選べるようにしました。Set関数で実際に出力する画像サイズを設定しています。

sub img_print {
    $image->Posterize(levels=>4);    #4色モード変換
    print "Content-type: image/gif¥n¥n";
    binmode STDOUT;                        # Winの時のおまじない 
    $image->Write('gif:-');                 #gifで書き出し
}

 作成した画像を画面に出力する部分です。土曜日にアップした時点では256色gifで出力していましたのでサイズが巨大でした。日曜日に圧縮率60%のjpegに変更したら少しサイズは小さくなりましたが、jpeg特有のノイズが乗るようになりました。更に調べたら色数を変更できるようでしたので、本日4色gifに変更してみました。
 「人形の怖い話ありませんんか?」まとめのトップページに使っている初代スレ>>3の画像のサイズを比較すると、

   最初の256色gif 240ピクセル:18592byte 480ピクセル:41203byte
   圧縮率60%jpeg 240ピクセル:10489byte 480ピクセル:30005byte
   本日変更4色gif 240ピクセル: 4385byte 480ピクセル:12536byte

実にjpegの半分以下、最初の1/3以下になり、かつjpeg特有のノイズもなくなりました。パチパチパチ
2色モードにすると更にサイズが小さくなりますが、さすがに画質が悪くなるのでやめておきます。4色化に当たってディザを掛けたり、いったんグレースケールにしてから4色化したりと試してみましたが変化が無いのでやめました。透過色を指定すると重くなるようでしたので、これもやめました。
 4色モードにした弊害として若干フォントの周りにギザギザが出ているような気がします。けれどjpegのノイズよりマシ、劇的な画像の軽量化を考えれば仕方がないとあきらめます。

 一応下請けのサブルーチンはできあがりました。最小8ピクセル(6ポイント)の文字で描画できますが、IPAモナーPゴシックは半角文字の間隔がMS Pゴシックと同じになるのは10ピクセルからなので8ピクセルで描画する事は有りません。アスキーアートの大きさによっては24ピクセルや40ピクセルで描画する場合も考慮して最小を8にしています。

 メインルーチンでは大きな文字で描画してから縮小するのと、小さな文字で描画してから拡大するのとどちらが綺麗な画像が得られるかによってサブルーチンの使い方が変わります。


携帯用にアスキーアートを画像変換する方法論

 携帯でアスキーアートを見るには文字列を画像に変換しなければなりません。まとめサイトで携帯専用にページを編集しているのは「幽霊と暮らしてるまとめ」だけですが、たまにアスキーアートが有ると、フロントページのプレビュー画面をコピーしてフォトショップで横240ピクセルに縮小しコントラストを調整してからgif画像に保存しています。
 フォントはMS Pゴシックの12ポイント(16ピクセル)行間2ピクセルが元になります。

 perlやPHPで文字を画像として書き込むにはGDかImageMagickというライブラリを使います。ただし、どちらのライブラリも日本語を表示するにはフォントファイルを別途用意しなければなりません。またフォントを入手してもMS Pゴシックを基準としたアスキーアートがずれないフォントでなくてはなりません。Windowsのフォントファイルをそのままサーバーにアップできれば簡単な話ですが、ライセンスの関係からむずかしいようです。
 検索を掛けてみたところ、アスキーアートがずれないフリーのIPAモナーフォントというのが有りました。このリンクのサイトから入手でます。Pゴシックはipagp-mona.ttfという名前のファイルになります(偶然ですがサイトの人も小林w当然別人です)。試しに人形の怖い話まとめのトップページに使っているアスキーアートをワードに貼り付けてMS Pゴシックと比較してみたところ、平仮名のフォントに違いを感じるもののずれる事無く表示できていました。
 ちなみにこのIPAモナーフォントはマックやUNIX系OSで2ちゃんねるを閲覧する時に使うのがメインのようです。

 で、要点をまとめると

・文字の描画にはGDかimagemagickライブラリを使う
・フォントはIPAモナーPゴシックを用意する
・画像の横幅は適当に描画してから、リサイズする
・12ポイントで描画して縮小するのが良さそうだが、小さい文字で出力も検討
・最終的に画像の横幅は240ピクセルにする。
・画像形式はgifで透過対応が望ましいが、重くなりそうなら白背景。場合によってはjpegも検討。
・画像を表示するページはa.cgi、画像出力はaa.cgi

 こんなところですね、後は実際にコーディングしてから調整するしかないです。


<< | 2/8PAGES | >>

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< November 2018 >>

テスト

笑える霊体験まとめサイト
の表紙作成に使ったソフト

Poser 10

新品価格
¥14,316から
(2014/4/9 14:19時点)

広告だったり

オリジナル電子書籍

selected entries

categories

archives

recent comment

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM