スポンサーサイト

一定期間更新がないため広告を表示しています

  • 2018.02.25 Sunday
  • -
  • -
  • -
  • -
  • by スポンサードリンク

青空文庫リーダーを作ってみる(4)

露見しているバグと対応状況
(1)禁則処理の不具合
行頭禁則処理を1文字の追い出しぶら下げ(直前行の行末に付加)のみにしているため、台詞の終わり等で句読点と括弧が続くとおかしくなります。
対策としては、フォーマッタでの追い出しぶら下げを2重にし、表示ルーチン側で文字合成することを考えています。


(2)行頭に回ってしまった閉じ括弧が横書きされることがある。
原因不明。表示にはcairo, pango, pangocairo をそのまま使っているので、ライブラリ側の問題かも知れません。

(3)複数起動できない
作業用中間ファイルやしおりファイルをカレントディレクトリに作成しますが、名称固定で作成するため、後から起動したほうが上書きします。
しおりファイルはともかく、中間ファイルは乱数名を使うべきでしょう。しおりを共有する必要がなければ、起動ディレクトリを複数にすることで現バージョンでも回避できるはずです。

(4)しおりがフォーマットに対応しない
しおりが保持しているページ番号はフォーマッタが作成する中間ファイルに依存しています。このため、(プログラムを改変して)1ページあたりの文字数を変更すると、過去に作成したしおりが意味をなさなくなります。
ユーザー側での表示レイアウト調整を開放しない理由はこれです。ページにしおりを挟んでいるので間違ってはいないのですが。対策はしおりをページから行や文字単位にすることですが、そこまでする必要があるかどうか。

(5)目次
目次は青空文庫ルビ付きファイル内で指定される、大見出し、中見出し、小見出しが出現した箇所を拾いだして作成していますが、フォーマッタの動作が不完全なため見出しが表示されません。


(6)ルビが表示されない
基本仕様には盛っていません。フォーマッタと表示ルーチンの連携を然程考えずにプログラムしたので、実現にはかなり苦労しそうです。


青空文庫リーダーを作ってみる(3)

UIの具合はこんな感じです。

作品閲覧


マウス右クリックでしおり機能の呼出



しおりは複数を一括して管理するので、読書履歴として用いることもできます。

青空文庫リーダーを作ってみる(2)

とりあえず仕様を固めたので、アルファバージョンを脱稿します。

基本仕様
概要
青空文庫に登録されているルビ付きファイルを読み込んで表示する。但し、ルビや傍点は表示しない。

機能
ルビ付きファイル(shift-jis)を読み込んでフォーマットして表示。
目次作成機能
ページ送り、ページ指定ジャンプ
しおり機能


追加仕様
表示レイアウトのユーザー側での調整
文字フォント、行間、文字間、ルビ表示の有無


MD5SUM d8b8fd7dde45a48b07e7e871aacf5e6e

実装について
実行環境
OS Lucid PuppyLinux 528JP
ランタイム等 python 2.7.3  pygtk 2.17.0 pycairo 1.8.8 pygobject 2.21.1
上記OS及びランタイムが動くだけのCPU、メモリ、ストレージ、及びXGA以上のディスプレイ

PuppyLinux 528JP 専用になりますが、devxがなくても動くようにpythonのSFSを作りました。python 関連の詰め合わせはこちら。
私の日用品そのままですので今回は使っていないライブラリも同梱されています。このため、ちょっとサイズが大きいのが難点です。また、ほとんどを公式リポに寄らず新規にビルドしました。このため追加モジュールはpython標準であるsite-packagesにインストールされています。
MD5SUM 12de202979713b5e06cd8038c15ad365



青空文庫リーダーを作ってみる

電子出版真っ盛り、な昨今、今更 青空文庫 でもないのかも知れませんが、せっかくあるのだから利用しない手はありません。

リーダーソフトはWindowsCEの頃からいろいろありました。最近ではAndroidにもありまして、僕の端末にもインストールしてあります。
翻ってLinux(gnome環境)ではどうよ、とちょっとググってみたのですが思うように見つけられませんでした。perlで書かれたものが一つあったのですが、僕はperlを読み書きしませんのでパス。

なければ作るしかない、ということで python と pygtk を使ってここ数日取りかかっていたのですね。

gtk(2.0)でのレンダリングはかなりややこしく、cairo だけではだめでpangoも使いこなさなくてはなりません。まあ、ややこしいだけで別段難しい訳ではないのですが、作っていてうんざりするのは確かです。

実際に縦書きさせてみたら、PuppyLinuxでお馴染みのM+1P+IPAGでは句読点の位置がおかしくなってしまってダメでした。IPA明朝は大丈夫のようです。

現状の問題点
サーフェース
cairoのサーフェースの使い方がよく分かりません。ウィジェットに直接描けるはずですが、どうもうまくいかない。何か根本的に間違っている気がしています。
しかたないので、ImageSurfaceに逃げており、いちいちpngに吐き出してそれをimageに読み込んで表示しています。扱うデータ量が小さいので何とか実用になっていますが、後述するように処理が増えたらちょっと使えないかも知れません。

正規表現
python 2.7 の正規表現(re)では必ずしもUTF-8をうまくさばけないようです。これも使い方が悪いのかも知れませんが。しかたないので動作する範囲で使っていますが、正規表現なしで青空文庫独特の書式制御文字列を完全に処理するのはかなり大変です。


いっけん、それらしい起動画面


英数字が横倒しになるのは良いとして、その長さを見ていないので格好が悪い。


そして文末。西暦はともかく和暦で数字が横倒しになるのは何とかしたいところ。

1ページ分の文字を改行コードでつなぎ、ひとつの文字列としてpangocairo_contextへ送り込んでいます。この方法は速度は稼げると思うのですがルビを振ることができません。また、行間や文字間の調整もできません。
行間調整は表示を1行ごとにして、その都度表示開始位置を指定しなおせば何とかなりそうですが、文字間はフォントを作り直さなくてはならないかも、です。1文字表示するごとに位置を調整する方法もありますが、まあ、速度がどうなるか分かったもんではないですね。

ルビについてはもう一つ問題があり、青空文庫の仕様で、ルビがかかる場所を明示する場合と暗黙の場合(もっぱら漢字の直後、英単語なんかの場合もあり)とがあって、後者に対応するために常に漢字とかな文字の境目を検出していなくてはなりません。
例えば、
 広い青空《あおぞら》に 
と書かれていたら、青空の上(実際は縦書きなので右横)に小さいフォントであおぞらと表示しなくてはなりません。「い」から「青」に変わったところを始点として記録し、「に」を見たところで廃棄ですが、入力者の都合で、
 広い青空に《あおぞら》
等と打たれていたらかなり厄介ではないでしょうか。

現実には青空文庫のリーダーソフトはたくさんある訳ですから手間暇を惜しまなければちゃんと作れるのでしょうけれど。

今回はソースを貼りません。不完全なソフトを公衆にさらすと罰せられるそうなので。この世に不完全じゃないソフトがあったら教えてほしいもんです。

うーむ、先は長いなあ。(こればっかり)


gphoto2

Linuxでデジカメを使う際、定番で使われるのがgphoto2ではないでしょうか。多くの場合、libgphoto2 として他のアプリケーションから呼び出されますが、gphoto2 というコマンドラインインターフェースも用意されています。

カメラをつなぎ、電源を入れた状態で
gphoto2 --list-config
と入力すると、何か表示されるはずです。電源が入っていなかったり、ライブラリがサポートしていない(最新モデルのカメラだったりする)場合はエラーになりますが。

ということで、実験する場合は旧めのカメラを用意するのが良いと思います。Linuxにおいては、旧いハードのほうが何かと都合良いのはカメラも例外では無いということです。

手元にキヤノンのPowershot A100というカメラがありますので試してみました。このカメラは専用ASICである Digic を搭載し始めた頃の製品です。仕様を見るといわゆるおもちゃカメラに相当するのですが、キヤノンが作るとおもちゃカメラもこうなる、というメーカーの主張が感じられて良いカメラだと思います。技術力があるくせに、薄利多売を前提とするコンパクトカメラとなるとひたすら没個性的な製品を乱発する、どこぞの某N社や某F社は見習って欲しいもんですな。

話を戻します。

稿末に PowershotA100を繋いで --list-config を実行し、戻ってきたパラメータを各々問い合わせた結果をに示します。

ホワイトバランスやカラーモード、フォーカス時のマクロや遠景への切り替え、フォーカスポイントの切り替え等、カメラが備えている機能を反映している項目が見当たりません。この辺が汎用ドライバの弱いところです。

使うカメラが一眼レフで、フォーカスはマニュアル、データもRAWのまま、現像するためにレリーズ直後にPCへ吸い上げるだけ、といった用途であればこのままでも良いでしょう。例えば、RAW現像ソフトであるRawstudio2.0のリモート撮影機能に使用例が見られます。

このように、gphoto2 をそのまま使おうとすると機能が限定され、結果用途も限られてしまいます。マスストレージクラスに対応していないカメラからデータを吸い出すのに使うくらいです。

とはいえ、限られた機能の中で使い道を探すというのも趣味ならば許されるでしょう。gphoto2とコンパクトカメラの組み合わせでどの程度遊べるか、もう少し追求したいと思います。


Google Docs で

Adobe Flash のセキュリティアップデートに合わせてChromeもアップデートしたそうなので更新してみました。
だから、なのか?
Google Docs で日本語入力できるようになっています。何時からだろ?


python で CGI

以前 Google の gdata で遊ぶのに python の sfs を作りました。その際、gdataを思うように扱うことができず、長らく放置していました。
しかし、せっかく苦労して作ったのに(gdata だけではなく、pygtk も入れた)のにこのままではもったいないと思い、使い道を探していたのですね。

調べてみると標準状態のpython はwebサーバを持っているとかで、これで遊んでみることにしました。

webサーバにするためのコードは次の通り。

[web.py]
#! /usr/bin/python
# -*- coding:utf-8 -*-

# vim: set fileencoding=utf-8 :
#

import cgi
import BaseHTTPServer,CGIHTTPServer

"""
    このファイルを設置したディレクトリにある index.html を表示(なければディレクトリを返す)
    無限ループなのでユーザーブレーク(pkill python)で終了のこと
"""
BaseHTTPServer.HTTPServer(( '127.0.0.1', 8080 ), CGIHTTPServer.CGIHTTPRequestHandler ).serve_forever()
[終わり]

これでサーバーとして動作します。簡単すぎる。

cgi は cgi-bin 以下に設置するらしい。以下によくある例題を示します。

[cgi1.py]
#! /usr/bin/python
# -*- coding:utf-8 -*-

# vim: set fileencoding=utf-8 :
#
import sys
import datetime

html_body="""Content-Type: text/html¥n
<html>
<head>
</head>
<body>
%d/%d/%d %d:%d:%d
</body>
</html>
"""

n=datetime.datetime.now()

print html_body % (n.year, n.month, n.day, n.hour, n.minute, n.second)

[終わり]

設置後、ブラウザにて localhost:8080/cgi-bin/cgi1.py と入れると時刻を表示します。



の、つもりだったのですが...
何も表示しません。

コンソールにて ./web.py としてエラーメッセージを拾ってみたら

Traceback (most recent call last):
  File "/usr/lib/python2.7/CGIHTTPServer.py", line 251, in run_cgi
    os.execve(scriptfile, args, env)
OSError: [Errno 13] Permission denied

と宣ってくれるではありませんか。

Permission denied ということでファイル属性をチェックしてみましたがどれも 755 で異常なし。
python のドキュメントによると、cgi は セキュリティの都合上 nobody さん名義で実行されるそうです。PuppyLinux を使っているとユーザー名なんかに注意を払うことは少ないですが、早速、su nobody と打って nobody さんになります。この状態で関連するファイルやディレクトリを見ていけばどこかで Permission denied でハネられるであろう、という目論見。

結局、Dropbox のユーザーディレクトリが原因でした。話が前後しますが、今回のお遊びの延長線上に他のPC(やサーバー)をブラウザ経由で弄ろうというのがあり、ソースコードの転送に便利なようにDropboxで共有をかけた(プロジェクトディレクトリを作っただけだが)のです。755にしておかなくてはならないところが404 になってましたよ。確かにDropbox インストールしてからディレクトリのパーミッションなんかチェックしたことなかったな。

ざっとしかドキュメントに目を通していませんが python で cgi するのはちょっと問題があり。というのは、いちいち新しいインタープリタを起動するらしいのですね。サーバーにpython 使っていれば大丈夫か、と思ったのですが 前述の通り execve なんぞ呼び出しているあたり、すごく単純に処理しているものと思われ。

ディスクレスなマシンでの利用も視野に入れているのだけれど、メモリ的に大丈夫なんだろうか...


高床式冷却装置



室温31度です。パッケージソフトのビルドなんぞやると一気にCPU温度が77度に達しますよ。
ヒートシンクがうまく装着されてないのかなあ、とも思うのですが、ビルドが終われば一気に10度位は下がるので放熱そのものはそれなりに行われていると思います。
まあ、PCが底面吸気構造なので本体の熱で机が暖まってくれば冷却効果も下がるのは当然。
ということで、思いっきり机上から離してみました。これで74度位で平衡状態になります。微妙なところですが、やらないよりはましかと。
そして、問題が一つ。
この状態ではキーボードが打てません。


audacious 3.2.3


何気に公式サイトに対抗しているスクリーンショット。分かりますか?


長らく 3.2.1 を使っていたのですが、久しぶりにアップデートしましたよ。
ついでにmpg123 も 1.14.2 にしてみました。

mp3については高域のディティールが気に入らず、最近はFLACなんぞに逃げたりしていました。再生音にどの程度影響があるか分かりませんが、ライブラリ(mpg123)を再構築・更新するにあたってオプション i586-なんちゃら(i586指定には2種類あって名前の長いほうを選択) を試しています。また、audaciousともども、最適化レベルを一つあげています。そう思って聴くせいか、以前より若干高域は自然になったかも。絶対的なディティール不足は否めませんが(※)。まあ、気休めということで。

audaciousも3.3以降はGTK+3が必須になったようです。3.2系のメンテも継続するらしいのでGTK+3に移行できそうにないPuppyLinuxでもしばらくは安心でしょう。



google docs その後

Google docs(現在はDrive) を ローカルアプリで弄ってみる、という趣旨でやっていた実験の続きです。


その後、遭遇したのは

1)アップロードできない
gdata.MediaSource に content_length というのがあるのですが、何故かこれが正しく設定されません。苦し紛れに適当に設定してアップロードしたのですが、今度は通信過程でエラーが出ました。サーバーに使えない命令発行しているっぽい。

2)pdf を正しく認識しない
前記事のスクリーンショットでも分かるように、タイプが pdf のファイルをリストします。v1で扱えるのは document, presentation, spreadsheet ですが、pdf をpresentation と思ってダウンロードすると、その形式には変換できない、というエラーがでます。
原因は、これら拡張子がpdf のファイルは、Adobe Reader 形式のファイルであり、google docs (v1)がいうところの presentation ではないのですね。試しにブラウザ上でプレゼンテーションを作成してみると、ちゃんと タイプにはpresentation と入ります。

3)とりあえず Export はできるようになった
ということで、document (MS Word形式に変換)と presentation (Adobe Reader形式に変換)は Exportできるようになりました。spreadsheetは仕様にあるように認証方法を変えないとできません。


やはり使っているライブラリが旧いことが原因なのか?それとも、何か回避策があるのか?
いかんせん、ドキュメントもフォーラムも完全英語であり、僕にとっては翻訳しながらでないと読めないこともあって調査が進みません。

しばらく凍結だな。あるいは開発放棄とも。


<< | 2/30PAGES | >>

calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
262728293031 
<< July 2020 >>

selected entries

categories

archives

recent comment

recent trackback

recommend

links

profile

search this site.

sponsored links

others

mobile

qrcode

powered

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