Enscriptのトラブルの解決法(冗長)

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

解決策

Slackwareにおいては “Courier New” のTrue Typeフォント(TTF)をインストールするだけ

もう少し厳密に言えば,enscriptに与えるフォント名を “Courier”, “Courier-Bold” などから, “Courier-New”, “Courier-New-Bold” などに変更する必要があります

フリーのCourier Newフォントの取得

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

以上でこれまで通り,enscriptとps2pdfで正しい印刷イメージができます.

動作確認できたdistro

上記は,Slackware ARM (32bit) 15.0ですが,Slackware AArch64 currentでも確認できました.

その後,Raspberry Pi OS (64bit) + KDE Plasma Desktopの環境でも試してみました.Debian系で Courier New のTrue Typeフォントをインストールする正攻法は,

apt install ttf-mscorefonts-installer

のようです.これで,Slackware同様にenscriptに与えるフォント名を “Courier-New”, “Courier-New-Bold” などとすることで,正常なPDFができるようになりました.

確認したのは,Slackware ARM (32bit) 15.0のみですが,たぶん,AMD64でも大丈夫だと思います.
むしろ,こちらが必要です.
32bit版.

Enscriptとの格闘(見当外れ)

→ 正しい見解

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

試しにCourierをTimesに変えてみると,全部文字が出ますのでフォントに依存した問題のようです.残念ながらEnscriptに備えられたフォントの中で等幅のものはCourierしかないので,別の等幅フォントをインストールして動くかな,というのが,ここまでの経緯と現在の考えです.

Courierはデータを等幅で印刷するのに非常に優れています.これに代わる等幅フォントがないかとネットでいろいろ調べましたが,少なくとも筆者の趣味に合うものはありませんでした.

そこで,あとの作業が混乱しそうな気もしますが,フリーで出回っている “Courier New” を追加インストールしてみることにしました.Enscriptに大昔, “Monaco” を追加インストールした経験があるはずですが,なんの記録も残っていませんので,ゼロからの出発となります.

想定している手順

  1. フリーのCourier New のTrue Typeのフォント(TTF)をネットで探し出す(たぶん “Courier New.TTF”)
  2. TTFからAFMを作成(事前の調べではLinux用のツールは見つかりませんでしたが,オンラインで変換するサイトが複数あるようです)
  3. Courier New.TTFを正しい方法でホストにインストールする
  4. AFMを/usr/share/enscript/afmに追加し,font.mapを編集する
  5. 自作Perlスクリプトを編集して,これまで “Courier” と指定していたところを “CourierNew” と指定するようにする.
  6. 祈ってパールスクリプトの出力をenscriptにかける
  7. ps2pdf (Ghostscriptの付属品)でPDFに変換して,文字抜けがなければめでたしめでたし

実践

フリーのCourier New

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

AFMファイルの作成

AFMは, “Adobe Font Metrics” というらしいです.Enscriptにはこのファイルが必要です.

事前の調査では変換ツールが見つかりませんでしたが,改めて調べると,ttf2afmというツールがSlackware ARM 15.0のホストにインストール済みでした

出力のファイル名については,/usr/share/enscript/afm内の例に習って,例えば “Courier-New-Bold.ttf” に対応するafmは "cnb.afm" としました.

AFMファイルのインストールとmapの修正

さて,AFMファイルができたので,/usr/share/enscript/afmにコピーします.

同じディレクトリーにあるfont.mapの内容に習って追加したAFMファイルを記述します.

祈って実行

自作のPerlスクリプトで,これまで “Courier” としていたところを “Courier-New” と置き換えて実行し,出力ファイルをenscriptで処理してみます.

成功!

うまくいきました.ただし,Monacoに関してはライセンス上の成約からフォントを組み込めないとかメッセージが出ましたが,出力に全く問題ないので良しとします.

PSファイルは,Ghostscript付属のps2pdfでPDF化しています.

等幅でないので,表はぐしゃぐしゃですが😅
32bit版.
pdfTeXの一部とman pageに書いてありますが,TeX系はインストールしたつもりはないので出所については詳しくわかりません😅

Mojoってなんだ (2)

DX SpiderのMojo版へのupgradeの続きです.

Slackware ARM 15.0のほうもupgradeできました.どうも,クローニング(ダウンロード)しているgitのデータが壊れてしまっていたようで,新規にcloneし直したところmojoがあるのでDebian同様checkoutしました.

いくつかの設定ファイルと,data以下のディレクトリーとファイルを全部コピーしてcluster.plを起動し,足りないモジュールを,

perl -MCPAN -eshell

からインストールして,動くようになりました.

結局Mojoは理解していないままです.

Mojolicious.pmだけはsbopkgでインストールしました.

Mojoってなんだ

一昨日でしたか,スペインのアマチュア無線家(ハム)からEMailが来ました.「動かしているDX Spiderにセキュリティーの問題があるからMOJO版にupgradeしてください」という内容でした.

そう,公開しているポートはありませんが,DX Spiderを2ノード,かなり昔から動かしています.たぶん,DX Spiderに関しては日本で動かしはじめた最初の数人に入っていると思います.

ついでにいえば,その前に動かしていたDX Netに関しても同様に最初の数人だと思います.もっともDX Netは日本で動かした人が数人であったように思いますが😓

さて本題に戻りますが,MOJOといわれても何のことやらさっぱり解りません.ネットで調べてもなんか解りません.しばらくうろうろしていると,Mojolicious.pmのことらしいとなんとなく解りました

いつものように事前調査は早々に打ち切って実行あるのみです.

2つのDX Spiderノードのうち外界とつながっていなくて,もう一つのノードとだけつながっているプライベートなほうを先に試してみることしました.大事な方を先に試して,途方に暮れることがよくある筆者としては賢明な判断だったと思います😓

しかし,スペインのハムが示してくれたupgrade用のスクリプトを動かしても,「Slackware 15.0 ARMは対象外だよ」といわれてしまいました.ARM版どころか,そもそもSlackware自体対象になっていません.

しょうがないので,x86_64なDebianで動かしていて,海外複数ノードとつながっている大事な方のDX Spiderのupgradeを試みました.結局こうなるんですよね😓

スクリプトはなんか無反応なまま終わってしまいました.

しょうがないので,gitのbranchを覗いてみることにしました.なんと,gitがないので,しょうがないからgitのインストールからはじめました.

Debianなので楽勝で,インストール後に,

git branch -a

を実行すると,remotes/origin/mojo なるブランチがあります.これかと思って,

git  checkout  mojo

としてcluster.plを実行したら,Mojolicious.pmがないといいます.これまでこのモジュールを要求されたことがないので,ブランチの切り替えは成功のようです.そこでDebianのパッケージサーチで当該のモジュールを探したらすぐ見つかりました.

インストールしてcluster.plを起動してもその後も「ない」というパッケージが表示されたのでその都度インストールといういつもの手順を3回ほどくりかえして,無事起動するようになりました.

起動したときのメッセージに “Mojo/何たら”との表示が出るので大丈夫でしょう

Slackware 15.0 ARM版に関しては,

git branch -a

でmojoの表示が出ないので,引き続き苦闘中です.

“Mojolicious”とは,どういう経緯か「もじゃもじゃ」と出てきましたが再現できません(当社調べ).
というか,そもそもMojolicious.pmがないと起動しないから大丈夫でしょう.