私が作った/改造した、ジャンクな物

Unix系(FreeBSD/NetBSD/OpenBSD, GNU/Linux, Solaris, et al.)や、 PC-98x1(PC-9801,PC-9821) な機械の DOS や、 ATX(PC/AT) な機械の DOS などで動作するガラクタです。 ドキュメントを書くのが面倒だとか、 使う場面が凄く限定されているとか、 使う人を選ぶだとか、 そういう意味のガラクタであって、 バグがあるとか動作不良起こすとか、 そういう事ではありません。

だからといって、バグが無い事を保証・補償・保障するわけでもありませんので。

改造品やパッチのライセンスは、原作のライセンスを参照してください。

私が作成したものは、ライセンス形態を指定している物を除き、 BSD-license か GPL か LGPL か、 どれか都合の良いライセンス形態でお使いください。 利用の際はあくまで自己責任で、AS IS。

もはや ATX の DOS や PC-98x1 は必要とされない時代になってしまい、 そちら関連はメンテナンスしませんし、する気力もありません……。


RSS 2.0書いてみました。

あと、このページは 100KB超あるので、はてなアンテナは、こけます (はてなアンテナは 32KiB までしか対応していないらしい)。


目次



機種依存/環境依存の強い物


■ pgp - Pretty Good Privacy 2.6.3i の PC-9801対応改造

本ソフトのメンテナンスは打ち切りました。

FreeBSD の portaudit より引用:

Affected package: pgp-2.6.3i_1
Type of problem: gnupg -- OpenPGP symmetric encryption vulnerability.
Reference: <http://www.FreeBSD.org/ports/portaudit/8375a73f-01bf-11da-bc08-0001020eed82.html>
CERT vulnerability note 303094
CVE name CVE-2005-0366

PGP 総本山が ver.2 系のメンテナンスを打ち切っている為、 治せませんので。そこんとこ宜しく。

DOS 汎用。

pgp 2.6.3iの MS-DOS 汎用版は、 見事に AT機のハードウェア (8253 Timer) を使用している為、 NEC PC-9801 + MS-DOS では動きません。 だから治しました。

まぁ、pgp ml を web でのぞいたら、既知の問題らしいのですが。 いくら乱数が欲しいからって言っても、MS-DOS 汎用と言いながら、 I/O port 直叩きってねぇ……。

# for AT(OADG) compatible と言っておけば問題無いのに。

MOD_PGP .LZH 108150 98-02-07 22:32


■ dumplist to binaly converter "dmp2bin"

DOS 汎用。

読んで字の如く、そのまんま、 テキスト形式のダンプリストをバイナリへ変換します。 当然チェックサム検査します。

昔の雑誌のダンプリストを OCR かけた後、 チェックサム検査をしながらバイナリに変換するのに使います。

何か……、ファイル全体のCRC符号も付けて欲しかったなぁ。 1行毎のチェックサムだけでは不安だ。 いや実際問題、ボロボロ OCR ミスが出て、 デバッガで追っかけをする羽目に。(;_;

Sat,06 Mar,2010 更新:
dmp2bin.cc 改訂、MZモード追加。
MZ な(旧SOFTBANK社の Oh!シリーズな?) 水平チェックサム/垂直チェックサムに対応。
MZモード時は、「SUM 」で始まる行は垂直チェックサムとみなします。
実行ファイルは LSI-C86 で生成 (コンパイラオプションに -D__MSDOS__ オプションを追加)。

DMPUTYS .LZH 32813 00-02-12 12:27

DMPUTY .LZH 36750 00-02-12 12:31

dmp2bin.ccTue,06 Apr,2010 (16KiB)

DMP2BIN.EXETue,06 Apr,2010 (21KiB)


■ N88-DiskBASIC Diskfile Treat Utility

DOS 汎用。

各種エミュレータ、 P88SR(PC-8801mk2SR)T98 / T98-NEXT(PC-98x1 series) などで使われている ディスクファイル形式 D88 のうち、 N88-DiskBASIC / N88-DiskBASIC(86) フォーマットの ディスクの中身を、 一覧、吸い出し、書き込み、リネーム、削除、属性変更、 クリーンアップ、チェックディスク、 セクタ読み出し、セクタ書き込み、 します。 削除ファイル復活も出来ますが、完全手動操作の為、 それなりの技量が必要です。

dmp2bin が完成してすぐに作り始めた事を考えると、 何をしたのか、ばればれかもしれない。

でも、必要とする様な人は、こんな弱小ほめぱげ、 見てないだろうなぁ。

# 完成してから気付いたけれど、これってば、 ごく小さな Disk Operating System そのもの、なんでは。

## 2004/05 追記: T98-NEXT で D88 が使われている事を知らなかった人。

DBDSKS .LZH 51523 98-03-28 21:24

DBDSK .LZH 21477 98-03-29 0:18


■ PSX MemoryCard [Read/Writ]er for PC-98x1 & AT-Compatible "PSM2"

詳細はこちら

DOS 汎用。

プレステの実機のメモリーカードや擬似メモリーカードの、 一覧、読み、書き、削除、フォーマット、アンデリート、相互転送、 などを行います。 本物のメモリーカードを扱う場合は、専用インターフェースが 必要です。

DOS 用 PSX memory card reader/writer である PSM(総本山不明)と、 MS-Win 用の WinPSM(総本山不明)で、 使用する回路が異なり、 しかも某秋月で販売もしている WinPSM 用の回路に 気に食わない点が有ったので、 DOS 用 PSM をベースに、 ハード/ソフト共に、自分で製作した物です。

取り敢えずは、WinPSM 用ハードも使用出来る様になっています。 しかも PC-9801/9821 と AT 互換機両用です。

PlayStation Emulator で扱っている、 Plane Image の MemoryCard DataFile にも対応させました。

これで、 メモリーカードへの書き込み中に通信エラーで チェックデジット吹き飛ばしてアクセス拒否されたり(実話)、 メモリーカードの中の半田が剥がれて使用不可になったり(実話)、 Flash-EEPROM の寿命が来てデータがお亡くなりになったり (メモリーカードでは無いけれど、Compat Flash で実際に起きた)、 しても大丈夫。

で、読み出したデータファイルを、 てきとーに、ちょちょい〜と、バイナリエディットして、 書き戻してやれば、 Ace Combat 3 のプレミアムディスク無しでナイトレーベン(だっけ?)を使えたり初代 Armored Core 無しで Master of Arena で強化人間になったり、 出来ます。

って、いまどきやろうとする人が居るとは思えない(自爆)。

回路

PSM2 .LZH 6756 03-09-01 2:19


■ calc_chk

ANSI C 互換なら FreeBSD / OpenBSD / GNU/Linux / Solaris / MS-DOS / MS-Windows 何でもおっけー。 同封バイナリは MS-DOS 汎用。

極単純なデータ改竄検査用の値を計算します。

4/2/1 octet 単位の積算と XOR だけしか対応していません。

かなり昔に、ANSI 方式 / CCITT 方式の 右/左ローテート CRC16 / CRC32 算出プログラムも作りましたが、 AX.25 関連でしか使いませんでしたので、これには含んでいません。

まぁ結局、PlayStation のセーブデータレベルでは、 積算か XOR の検査程度で済んでしまう、と言うだけなのですが。

CALC_CHK.LZH 11550 04-05-21 5:10


■ Virtual Joystick InterFace "VJS"

PC-9801/9821 の実機の DOS 専用。

音源内蔵の 98 に、 さらにもう1枚 C-BUS 音源(26音源)を搭載した状態で、 Joystick のみ C-BUS 音源を使用し、 音は内蔵音源から出す、 為のドライバ。

音源2枚差しドライバ、とも言う。

おまけ機能として、音源入れ替え機能、音源隠し機能、 とどめは、 内蔵と C-BUS の両方の音源から同じ音を出す音源複写機能、 付き(笑)。

某 Bio_100% の某 Dynamo が音源回りで不安定 (一部の26互換音源でこけるとか、86音源を認識しないとか) だったのを改造して治した際の副産物でもあり、 音源は内蔵しているけれど Joystick ポートが無い 98Multi で Joystick を使いたかった為でもあり。 でも Joystick を持っていなかったり。

# web で検索してみると、 件の Bio_100% の Dynamo で音源でこけている人がいる様ですが、 今更、拙作の対応パッチなんて公開しても使わないですよね……。

VJS .LZH 11138 99-04-02 2:31


■ Extend(Hidden?) MemorySwitch Setting Program "EXTMEMSW"

PC-9821/98Multi の実機専用。

私の使用している PC-9821Cs2 は、9821 のくせに、 何故か GRPH+2 による、V-SYNC の 31kHz への切り換えが 使用出来無い (GRPH+1 による 24kHz への切り換えは出来るのだけれど)。

そこで、意地で、V-SYNC の設定を切り替えるプログラムを 作ってしまいました。

設定は記録されますので、一度設定すれば、 ITL もリセットしても FD ベースでも NetBSD(98) でも、 31kHz で表示されます。

HSB の WI IGDC:31 や WI IGDC:24 でも切り替えられますが、 その場合は COLD-BOOT すると 強制的に 24kHz に戻されてしまいますし、 そもそも MS-DOS でしか切り替えできません。

本プログラムで 24kHz に設定するなり、 電源投入時/リセット時に GRPH+1 とか GRPH+2 とかすると、 元に戻ります。

元々は PC-9821 Cs 専用に作りましたが、 web で聞いた噂では、 PC-9821 Multi (21 C series) 全般で使える、 と言う噂もあります(未確認)。

EXTMEMSW.LZH 3291 99-05-09 18:08


■ LHa for UNIX V 1.14i の DOS 汎用改造版

本ソフトのメンテナンスは打ち切りました。

Sun,24 Sep,2006 : LHA の unlzh.c にバグ(スタックオーバー/アンダーフロー?)が 見つかったとか何とか言う情報が出ています。 詳細不明。

DOS 汎用。

PC-98x1 や PC/AT 互換機,OADG 準拠機などの、 MS-DOS, DOS/V, PC-DOS/V 上から、

が出来ます。

LHA114IM.LZH 74951 01-11-29 23:10

参考、引用元

LHA for UNIX


■ CoolON for MS-DOS and MBM extend menu

SocketA 系列で MBM を使っている人専用。

AMD Athlon 系 CPU 用のソフトウェアクーラー(Software Cooler) FVCool や CoolON を、 純粋 MS-DOS や、 マルチブートマネージャー MBM の拡張メニューに組み込める様に、 移植したものです。

もっとも、純粋 MS-DOS では hlt を発行せず、 常にフルパワーで動作する仕様になっているので、 全く意味が無いでしょう(^^;。 単に、MBM 拡張メニュー用の下敷きに作っただけです。

MBM - Multiple Boot Manager の拡張メニューに、 本アーカイブ内の mvcool.mbm を組み込めば、 対応ソフトウェアクーラーの無い OS でも、 ソフトウェアクーラーが有効になります。 と言っても、CoolON は MS-Win 用で、 FVCool は *BSD/Linux 用なので、 主要な OS はカバー出来ている様な気もしますが。

*BSD/Linux は適当に設定すれば適当に FVCool を動かせますが、 MS-Windows NT 系(2000 とか XP とか)では CoolON を動かすのにいちいち Administrator パスワードを入力するのが面倒です。 MBM 拡張メニューに入れ込んでしまえば、 起動時に適当に設定してくれるので便利です。

なお、本 MBM 拡張メニュー組み込み用は、 MBM 原作者 ELM 氏の MKM によるグラフィカルな拡張メニューとは 排他使用になります。 MKM の組み込みサイズ制限に収まらなかったので。

MVCOOL .LZH 11962 03-06-15 03:56

参考、引用元

CoolON Project(SoftwareCooler on MS-Win)

MotherBoard Monitor &amp; SoftwareCooler for FreeBSD(and Linux)

ELM - Multiple Boot Manager


■ MBM 書き込みしない改造版

いわゆる DOS/V コンパチ機汎用。

mbm038mod.lzh (8KiB)(Mon,10 Jul,2006)

mbm039mod.lzh (9KiB)(Sun,29 May,2011)

mbm039disasm.lzh(89KiB)(Sun,29 May,2011)

原作: ELM - Multiple Boot Manager

ELM氏作の MBM - Multiple Boot Manager を愛用しているのですが、 MBM は、 起動時に Activeフラグを操作するために MBR を書き戻す、 何か操作をするたびに環境設定を MBR に書き戻す、 と言う仕様になっています。

が、しかし。 BIOS で MBR の書き込み制限を有効にしている場合や、 コンパクトフラッシュや USB メモリなどの フラッシュメモリ系で運用している場合、 この「毎回毎回書き戻す」と言う仕様では、 毎回毎回ウォーニングが出てうるさかったり、 寿命に悪影響を与えたり、 困った事になります。

ので、起動時の書き戻しと、 設定変更時の書き戻しを、 行わない様に改造しました。 デフォルト起動の変更時のみ、 (他の変更も一緒に)保存を行います。

当然ながら、 アクティブフラグが設定されていないと起動できない腐れOSが 起動できなくなる、 MBM のマスクモードを使ってだまくらかさないと起動できないタコOSが 起動できなくなる、 と言う、 そもそもの MBM の高機能化を否定しかねない副作用があります。


裏事情。 職場のGNU/Linux派に 「作業/試験兼用機(別の機体にわける様な予算は無い)の 起動モードの切り替えするのに、ブートローダーどうする?」 と相談したら、 「lilo 使え。それがいやなら grub。それ以外は認めない。」 と言われ。 職場のMS-Windows派に相談したら、 「ブートローダー?、何それ。MS-Windows なら、そんなもの要らないよ。」 と言われ。 結局ブチキレて独断で勝手に改造版 MBM に入れ替えたと言う……。


ゴミネタ物


■ pLaTeX のマクロ

一発芸ネタパッチの為、メンテナンスしません。

nest_top.tex(1KiB) 親の方

nest_int.tex(1KiB) 子の方

pLaTeX にて、ソースを親と子に分割した場合に、 親から子を \input{} / \include{} した場合でも、 子のみ単独の場合でも、 どちらでもコンパイルできる様にするマクロ。

職場の後輩 T 氏にけしかけられて、 おもわず、1日だか2日だか潰して書いてしまったが、 誰も使わなかったと言う代物。


UNIX系汎用

FreeBSD とか NetBSD とか OpenBSD とか GNU/Linux とか SunOS とか Solaris とか cygwin とか MinGW とか。


■ xjdic 改造パッチ

xjdic24.patch3.bz2(4KiB)

オリジナルの xjdic では、 辞書ファイル名が 80 文字を越えたり、 辞書データ1件が 256 バイトとか 512 バイトを越えたり、 すると、SIGSEGV 出して落ちます。 その修正。

本来、strlcpy() とか strlcat() とかを使って修正すべき所を、 とんでもない手抜きでバッファサイズを 1024 バイトに増やしただけです。 ので、1件につき 1KiB より大きいデータを食わせると、やっぱり落ちます。

ついでに、^U での全文字削除を追加しました。

FreeBSD 2/3/4/6, Solaris 2.6/8 で動作確認済み。


■ gjiten-1.1 改造パッチ

本パッチのメンテナンスは打ち切りました。

gjiten-1.1.diff.gz(1KiB)

xjdic の GTK+ 版フロントエンドとでも言うべき、 GJITEN を、 FreeBSD で使える様にするパッチです。 何の事は無い、#include <stdint.h> を削っただけです。

gjiten-2.x は、SIGSEGV だの BusError だの出て、 修正が面倒になったのでやめました。

私個人は、CUI版のxjdic しか使わないので、 本パッチのメンテナンスはしません。


■ mlclock-1.1 改造パッチ

tclock 移行に伴い、本パッチのメンテナンスは打ち切りました。

mlclock-1.1-modified.tar.bz2(8KiB)

現在日時時刻を文字表示する時計 mlclock の、改造版です。 オリジナルでは -geometry オプションが利用できず、また、 窓の再描画を頻繁に失敗しているので、 そのあたりを修正しました。

私個人は、 後述の tclockディジタル表示追加版に移行したので、 本パッチのメンテナンスはしません。


■ mnews 改造パッチ

mnews122PL1_diff.gz(2KiB)

mnews-1.22PL6.patch1.gzmnews-1.22PL6T1-IMAP4,Unicode用 (3KiB)

標準の mnews で -DUSE_TZ_NAME が付いている OS で -DADD_DATE_FIELD を有効にした場合、

Date: Sat,24 Jan 2004 02:16:26 JST

と言う感じの Date: フィールドを作ってくれます。 しかしながらこの形式だと、 GMT との時差が何時間かわかりませんし、 SpamAssasin が時刻を誤判読して SPAM 判定してしまいます。 そこで、

Date: Sat,24 Jan 2004 02:16:26 +0900 (JST)

と言う感じの Date: フィールドを生成する様にパッチを作りました。 但し、環境設定に jst_mode: off が無い状態で閲覧すると、 "+0900 (JST)" が "JST" に変換されて 表示されます(変換されるのは表示だけ)。


■ lha-1.14i 私家 Traversal Hack 対処パッチ

lha-ac 移行に伴い、本パッチのメンテナンスは打ち切りました。

参考:http://sourceforge.jp/projects/lha/

lha-114i.p0-patch.bz2(2KiB) OpenBSD 3.6-RELEASE の ports の lha-1.14i.p0 パッチ内包版。

lha-114i.p6-patch.bz2(5KiB) FreeBSD 4.11-STABLE の ports の lha-1.14i.p6 パッチ内包版。

各ディストリビューター提供の Traversal Hack 対処パッチでは、 「ルートディレクトリ指定の展開」 「上位ディレクトリ指定の展開」 の拒絶だけでなく、 「カレントディレクトリ指定の展開」 も拒絶する作りになっていますが、 この私家パッチは、 「ルートディレクトリ指定の展開」 「上位ディレクトリ指定の展開」 のみを拒絶し 「カレントディレクトリ指定の展開」を 許可する様にしたものです。

有り体に言うと、以前、バックアップを取る時に、

lha p hogehoge.lzh .

として作ったアーカイブがあり、展開できなくなって困った、 と言うだけですが。

http://sourceforge.jp/projects/lha/ 版の lha では、 「カレントディレクトリ指定の展開」 も許可する様に修正されていました。 但し、デフォルトでバックアップファイルを作らない、に、 変更になっています。

OpenBSD の場合は、OpenBSD 3.9-RELEASE から、 /usr/ports/archiver/lha が 本家ベースから sourceforge ベースに変更になっていました。

FreeBSD の場合は、/usr/ports/archiver/lha-ac が、 sourceforge ベースです。

と言う訳で、面倒なんでこのパッチのメンテナンスはしません。 sourceforge版に --enable-backup-archive 付ければ 本パッチと同等の機能になります。


■ lha-1.14i-ac20050924p1 修正パッチ

参考:http://sourceforge.jp/projects/lha/

lha-ac-1.14.i.patch1.lzh(1KiB)

lha-ac-1.14.i.patch1.tar.bz2(41KiB)

lha-1.14i-ac20050924p1 の configure で、 --with-default-method= が使えないバグを修正するパッチ。

本家の trunk を探してみたら、 Tue Feb 5 21:30:09 2008 の Revision 879 で修正済だった。

Mon,16 Feb,2009 追記: サーバリプレースの際にパッチを当てようとしたら、 lha のインストールに必要なパッチを lzh に固めていたのでは、 缶詰の中の缶切りじゃん、でハマった。tar+bz2 で固め直し。


■ PCMプロポの送信データを復調するお話

本パッチは技術的考察の為に作成したものであり、メンテナンスは行っていません。。

SmartPropo は SANWA のプロポには非対応なので、 自分でデータを解析して、 自分でコードを書きました。

SANWA の 6ch PCM プロポ SRD-6127TS の送信データを 生 wave 形式で録音し、下記 srdpcm2dat で処理すると、 プロポのスティック操作量を読み出す事が出来ます。 PPM, PE, FSK 各変調方式の復調のみも出来ます。

srdpcm2dat.cc(30KiB)

srdpcm2dat で復調のみを行い生のデータを出力した時に、 各ビットの情報量を推定する為の補助プログラム srdpcm_entropy.cc(7KiB)、 実際問題としては、 未知のデータ形式の解析を行う時にしか必要無いでしょう。

プロポの送信データを録音して wave 形式にしたデータ例 PCM_TEST.tar.bz2(94KiB)

それ以外の機種では試した事が無いので (持っていないし、借りられる相手もいない)、 どうなるか判りません。 少なくとも、このプロポが送出しているデータには、 6ch 分のデータを送るぎりぎりのデータ容量しか無かったので、 8ch PCM プロポだとデータ形式が変わっていないと 入り切らないでしょう。 そんな訳で、チャンネル数が異なると データ形式も変わっていると思います。

このソースのパーサー部分を、 適当な MCU,FPGA,CPLD などに移植して、 適当に I/F を書いて、 ラジコン受信機の AF を引っ張り出して MCU,FPGA,CPLD などに入力してやれば、 スティック操作量を PCM モードで 生データのまま受信できるでしょう。 ……。 と言うよりも、そうする為に書いたんですけど。 開発する時間とかお金とか体力とか精神力の余裕が無いよぅ(泣。

FPGA/CPLD に移植するには……、 復調アルゴリズムを見直して書き直した方が良い様な気がします。 なにぶん、 カウンタやデータラッチ、 マグニチュードコンパレータやフルアダーを、 ふんだんに使ってしまったので、 消費セル数がやたら増えそう……。 100セル台にのるのかな、のらないかな、 ……これだけで 500セルくらい行っちゃったらやだなぁ。

Futaba や JR の PCM プロポをお使いの方は、 SmartPropo のソースを拝借した方が良いでしょう。 なにぶん、私が中古で購入したプロポが SANWA の PCM プロポで、 SmartPropo は SANWA のプロポに非対応だったので、 自力で解析しなければならなかった、と言うのが、 これを作るきっかけですので。 KO の PCM プロポをお使いの方は……、 自力で解析するしか無いでしょう。


■ xmbmon204/xmbmon205 改造パッチ

本ソフトのメンテナンスは打ち切りました。

Desktop Image図の、中央上のヤツ。

xmbmon204-patch.bz2(3KiB)

xmbmon205-patch.bz2(3KiB)

最近の CPU やら ChipSet やらは発熱が激しい様で。 xmbmon 入れて、てきと〜にモニターしていたのですが、 私の使っているマザーボード/BIOS では、 どうも派手にマイナスバイアスがかかっている様でした。 なので、 xmbmon にオフセットを付けられる様に改造してみました。

# オリジナルにオフセットを乗せる機能が無いのは、 マニュアルの読み落しで、実は有る、 と言う訳では無いですよね[y/n]。


xmbmon205-acpippc-patch.bz2(7KiB)

FreeBSD 4.11-STABLE / 5.2.1-CURRENT 以降では、 AMD64(Athlon64) な計算機において、 acpi_ppc を使って Cool'n'Quiet (CnQ) の制御が出来るようになりました。 そのモニタ機能を xmbmon に付けてみました。

FreeBSD 6 で cpufreq + powerd に変わったんですが、 対応させる気力が無いっす。


■ gtkipmsg-0.2.6 の GTK2 / UTF-8 / ニックネーム / 封書 / システムトレイ(GNOME1,KDE,GNOME2,KDE3) 対応 改造版

本ソフトのメンテナンスは打ち切りました。

gtkipmsg-0.2.6-p5.tar.bz2(127KiB)(Wed,10 Oct,2007)(メモリリーク対処版)

gtkipmsg-0.2.6-p4.tar.bz2(126KiB)(Wed,10 Oct,2007)(メモリリーク未対処版)

*BSD (FreeBSD, NetBSD, OpenBSD,..., 4.xBSD ? ) とか GNU/Linux とか Solaris とかで使える IP-Messenger(ipmsg) と言うと、 xipmsg か gtkipmsg か gipmsg(gnome ip-messenger) か g2ipmsg になりますが、 これらは athena 用か GTK+-1.x 用か GNOME 用か GNOME2 用で、 GTK+-2 (GTK2 ?) のみの環境では使用できず、 且つ、g2ipmsg 以外は開発が終了してしまった模様だし、 g2ipmsg は GNOME2 必須です。

そこで、gtkipmsg を GTK+-1.2.x と GTK+-2 のどちらかだけあれば使える様に改造しました (GTK+-1.0.x は未確認)。 GNOME や GNOME2 等は不要です。

nickname の、設定と送信と設定保存を、追加しました。 (ニックネームの受信は、 オリジナル gtkipmsg でも対応していました)

封書/非封書の選択送信機能も追加しました。

Fedora では locale が標準で UTF-8 だそうですが、 それでも問題無くビルドして使える様にしました (GTK+-2 のみ確認)。

Solaris では socket のライブラリの構成が異なっていますが、 これも問題無くビルドして使える様にしました。

GNOME2仕様(KDE3もGNOME2と同じ仕様らしい)の システムトレイに入れられる機能も追加。 FUJIE Takashi氏の GNOME1 や KDE でシステムトレイに入れるパッチもマージ。

オリジナルの gtkipmsg に、 メモリリークとか、未確保のメモリへのアクセスとか、 見つけたので修正。

GTK+-2 の GTKネイティブ用 input module にメモリリークを見つけたので、 メモリリークしない様に gtkipmsg 側で小細工を追加。

日本語入力を行う場合、 GTK+-1.2.x では、 kinput2 や uim-xim 等の XIM から入力します。 GTK+-2 では、 環境変数 GTK_IM_MODULE で指定したモジュールから入力します。

ビルドする時、

./configure
の引数に(いや、私は ../configure 派なのだけれどさ)、
--enable-gtk2
を付けると、GTK+-2 用にビルドします。 指定しないと、GTK+-1.2.x 用にビルドします。
--enable-systemtray
を付けると、GNOME2仕様のシステムトレイに入れます。 KDE3のシステムトレイにも入るらしいです(未確認)。 指定する場合は、 自動的に --enable-gtk2 が指定され、 また GTK+-2.10以降が必要になります、 が、GNOME2 や KDE3 は不要です。 指定しないと、システムトレイには入りません。
--enable-systemtray1
を付けると、GNOME1 や KDE でシステムトレイに入れます。 指定しないと、システムトレイには入りません。
--disable-default-sealed

と付けると、初期状態が非封書になります。 指定しないと初期状態は封書です。

既知の問題点。 実用上、差し支えない範囲まで来たので、もう治さない。

  • GTK+-1.2 だとメモリ消費 8MiB くらいで済むのに、 GTK+-2.10 だと 33MiB(GTK_IM_MODULE=xim の場合) 〜45MiB(GTK_IM_MODULE が xim 以外の場合)も メモリを食う。
  • 実用上差し支えなければ良いで書いた、てきとーなコード。 人間では実現できないほどシビアな操作するとメモリリークするし。
  • 環境設定関連でのメモリリークとか残っていそう。 ポインタ返しの関数を使った後に NULL pointer 検査してない箇所も わんさかあったが、もう治していられない。
  • 起動時に xshm の ID が不足すると、余計なメッセージを表示してから起動する。
  • 封書で送られたメッセージを、開封確認の返答を返さずに読める抜け道がある。
  • ファイル送受信非対応。
  • 不在通知非対応。
  • ログにニックネームのみが記録され、ユーザとグループとIPが記録されない。
  • 送信時にログにホストとユーザとグループとIPが記録されない。
  • 受信した時にニックネームとホストのみ表示され、ユーザとグループが表示されない。

原著作者、参考、引用元

IP-Messenger 開発研究室

gtkipmsg

IPメッセンジャーをシステムトレイに入れる


■ p0f 2.0.5 改造パッチ

本ソフトのメンテナンスは打ち切りました。

p0f.c.diff.bz2(2KiB)

オリジナルの p0f には、 どうも pflog 形式のパーサにバグが有る様なので、 適当に治してみました。

で、後になって OpenBSD の ports をよく見たら、 2004/05/03 に修正パッチが追加されていたオチ。 但し、OpenBSD の ports のパッチは 現在のバージョンの pflog で使われているヘッダ長専用ですが、 こちらの改造パッチは、一応、汎用にしてあります。 まぁ、pflog の仕様を変更してヘッダ長を変えるとは、 あまり思わないけれど。

OpenBSD 3.5 と FreeBSD 4.11-STABLE のみで動作確認。


■ vtwm 5.4.6b 6ボタン以上対応、改造パッチ

本パッチのメンテナンスは打ち切りました。

vtwm.diff.bz2(1KiB)

twm 系の軽量で仮想スクリーン対応の vtwm ですが、 6ボタン以上(スクロールも其々の方向毎に1ボタンと数える)だと、 ボタン番号6以上を押すと落ちるバグだか仕様だかがあります。 治してみました。

ただまぁ、今の御時世、 ここまでの軽量高速にこだわる人ってそうそういないらしく、 パッチを作った所で使う人がいないのではないかと思われ。 xinerama にも対応していないし。

と、言う訳で、本パッチのメンテナンスはしません。


■ vtwm 5.4.7 フォーカスの有無によってタイトルの色を変える改造パッチ

本パッチのメンテナンスはしません。

vtwm-5.4.7.patch1.bz2(2KiB)

twm 系の軽量で仮想スクリーン対応の vtwm
ウィンドウにフォーカスが有るかどうかは、 ウィンドウのボーダーの色の変化で分かる様になっていますが、 加えてタイトルの色も変える様にするパッチです。

ただまぁ、今の御時世、 ここまでの軽量高速にこだわる人ってそうそういないらしく、 パッチを作った所で使う人がいないのではないかと思われ。 xinerama にも対応していないし。

と、言う訳で、本パッチのメンテナンスはしません。


■ fvwm 2.4.19/2.4.20 フォーカス改造パッチ

fvwm-2.4.19-patch.bz2(Mon,25 Sep,2006)(3KiB)

fvwm 系の軽量で仮想スクリーン対応の fvwm ですが、 アプリケーション側が強制的にフォーカスを奪おうとすると、 それを許可する仕様になっているみたいです。

例:gimp とか firefox とか。

アプリケーション起動時に 勝手にフォーカスが移動してしまうのが嫌なので、 アプリケーション側が強制的にフォーカスを奪おうとした時に、 フォーカスを奪い返す様に改造しました。

やっつけ仕事なので、かなり汚いパッチです。

2.4.19用に書いたパッチですが、2.4.20でもそのまま使えます。


■ tclock-1.0.1 for X11 時報&強制最前面表示&透過ディジタル時計、追加パッチ

Desktop Image図の、右上のヤツ。

tclock-1.0.1.patch7.bz2(8KiB) オリジナルのソースからの差分のみ

tclock-1.0.1.patch7.tar.bz2(14KiB) オリジナルを含む全ソース

※ FreeBSD ports のパッチも同梱されています。

透過アナログ時計と言いますか、透明アナログ時計と言いますか、 の、tclock(総本山不明、原作:Copyright (C) 1991 Rob Mayoff)に、

を追加しました。 もっとも、時報は cron でやった方が良いのではないかと言う気がしますが。

ウィンドウマネージャの機能を使わずに tclock 自身の機能のみで、常に最前面に表示したい時は、 "-sticky" オプションを追加してください。 デフォルト off になっています。 そんな機能、絶対に使わない、と言う場合は、 tclock.c の先頭の "#define ENABLE_STICKY" を コメントアウトすると、より小さな実行ファイルになります。

xlock/xautolock/xlockmore 等の画面ロックをかけた場合や、 xscreensaver 等のスクリーンセーバーを動かした場合は、 「常に最前面に表示」が中断されます。 画面ロックやスクリーンセーバーが解除されると、 「常に最前面に表示」が再開されます。

"-sticky" オプションを指定した場合、 時計の針か目盛りをクリックすると、 「常に最前面に表示」が無効になります。 もう一度クリックすると、有効になります。

時報機能はデフォルト off になっています。 使いたければ、-chime オプションを付けてください。 そんな機能、絶対に使わない、と言う場合は、 tclock.c の先頭の "#define ENABLE_TIMEANNOUNCEMENT" を コメントアウトすると、より小さな実行ファイルになります。

透過アナログ時計はデフォルト on になっています。 使いたくなければ、+analog オプションを付けてください。

透過ディジタル時計はデフォルト off になっています。 使いたければ、-digital オプションを付けてください。 表示内容を変更したければ、-form オプションとロケールで指定してください、 指定内容は man strftime を見てください。 表示位置を変更したければ、-digitalgeometry オプションで指定してください。 フォントを変更したければ、-fontset オプションで指定してください。


■ acpi_ppc-20050313, acpi_ppc-20050521 改造パッチ

本パッチのメンテナンスは打ち切りました。

acpi_ppc-20050313.patch.bz2(4KiB) nice指定プロセスが忙しくなってもギアを上げる版。

acpi_ppc-20050313.patch2.bz2(4KiB) nice指定プロセスが忙しくなってもギアを上げない指定ができる版。(ギアを上げる指定も可能)

acpi_ppc-20050521.patch3.bz2(5KiB) patch2 + hw.acpi.cpu.px_lowest を可変にした。

FreeBSD 6 以降では cpufreq & powerd が搭載された為、 acpi_ppc は不要です。 powerd 改造パッチは後述。

FreeBSD 4.11-STABLE / 5.2.1-CURRENT 以降で、 Athlon64 (AMD64) の Cool'n'Quiet (CnQ) や、 Intel の Enhanced SpeedStep 等での、 CPU の動作周波数を動的に制御できる様にするカーネルモジュール、 acpi_ppc (http://www.spa.is.uec.ac.jp/~nfukuda/software/) に、

  • 速度切換を行う閾値を設定可能にした
  • 負荷がとても高い/低い時は一気に多段階上げる/下げる機能を追加
  • 切替履歴の表示を追加
  • 「nice指定されたプロセスが忙しくなってもギアを上げない」指定ができる
  • 下限速度も指定できる様にした(上限速度の指定は、オリジナルでも可能)

してみました。

「nice 指定されたプロセス云々」は、有り体に言うと、 「distributed.net とか SETI とかスクリーンセーバーとか、 そういうもの"だけ"を動かしている時は、 どんなに負荷が上がっても最低速度を保ち、 それ以外の処理を始めたら速度を上げる。」 と言う為のものです。 もっとも、BSD系とかGNU/Linux系とかは、 なんにも処理をしていない時は、 最低速度の状態よりも さらに低消費電力の状態になっている筈ですが。 それなのにわざわざそういうものを動かすと、 たとえ最低速度のモードでも消費電力が上がっている筈です :P。 現に、xmbmon の温度計を見ていると、 温度が上昇しているし。

distributed.net とか SETI とかを動かす場合、 設定は、

hw.acpi.cpu.px_top_threshold: 95
hw.acpi.cpu.px_2up_threshold: 90
hw.acpi.cpu.px_stepup_threshold: 50
hw.acpi.cpu.px_stepdown_threshold: 35
hw.acpi.cpu.px_2down_threshold: 25
hw.acpi.cpu.px_threshold_mode: 5
とか
hw.acpi.cpu.px_top_threshold: 95
hw.acpi.cpu.px_2up_threshold: 80
hw.acpi.cpu.px_stepup_threshold: 60
hw.acpi.cpu.px_stepdown_threshold: 40
hw.acpi.cpu.px_2down_threshold: 20
hw.acpi.cpu.px_threshold_mode: 5

ぐらいの、出足の軽い設定にした方が良さそうです。 たとえ distributed.net とか SETI とかを nice 指定していても、 非 nice 指定のプロセスの BUSY があまり上がらず、 acpi_ppc改造版がギアを上げる必要無しと判定し、 ギアが上がらない事が、しばしばありますので。 distributed.net とか SETI とかに、 nice と idprio の両方を指定すれば、いくらかましかも (idprio に関しては、後述の「注意」を参照のこと)。

動作確認済み環境:

  • FreeBSD 4.11-STABLE-i386、 SN95G5(v2) Athlon64 3500+(Winchester)(2.2/2.0/1.8/1.0GHz) nForce3 250、 Cool'n'Quiet。 全く問題無し。 なんら条件も無し。 2005年5月から常用中。 後述の idprio のみ注意を要する。
  • FreeBSD 5.4-RELEASE-amd64、 SN95G5(v2) Athlon64 3500+(Winchester)(2.2/2.0/1.8/1.0GHz) nForce3 250、 Cool'n'Quiet。 ざっと使ってみた感じ、問題無さそう。 但し、FreeBSD-4系を常用している為、 FreeBSD-5系での常用試験の予定は当分無し。
  • FreeBSD 4.11-STABLE-i386、 DELL Latitude C400、 MobilePentium3 (1000/733MHz) i82830M、 SpeedStep。 2005年5月から常用中。 下記3点と後述の idprio のみ注意を要する。
    • 起動時に、パッチを当てた acpi_dsdt を読み込まないと、 そもそも ACPI が正常稼働せず、acpi_ppc が動けません。 これは、 DELL の ACPI は BIOS だかファームだかなんだかにバグが有るとかで、 FreeBSD や ACPI_PPC のせいではありません。
    • 起動時、ACPI を有効にする前に、 「hw.pcic.intr_path="1"」指定にて、 PCMCIA/PCCARD の割込モードを PCI モードから ISA モードにして、 割込を禁止してポーリングモードにしないと、 page fault 12 を出してカーネルが刺さり、起動できません、 これは acpi_ppc とは全く無関係の問題です、 どうも DELL のノート型の一時期の機種に特有の問題らしい。
    • ACPI を有効にすると、acpi_ppc の有無に関わらず、 suspend to memory(S3), suspend to disk(S4), の両方で、死にました、 これも acpi_ppc とは全く無関係の問題です。 たぶん、FreeBSD 4系の ACPI の実装が未完成な辺りと、 DELL のノート型の BIOS が OS を選ぶ辺りが、 お互いに悪さをしているのではないかと。

注意

Tue,13 Dec,2005 現在、 FreeBSD 4.11-STABLE(Oct 12 17:40:59 JST 2005) 上の acpi_ppc-20050313 を有効にしている環境で /usr/sbin/idprio を使用すると、 稀にマシンが再起動する現象が見つかりました。

私家改造版でも、 本家のオリジナル版 acpi_ppc-20050313 でも発生しました。

また、/usr/sbin/idprio を一切使用していなかった、 2005年4月から12月までの2台のべ10ヶ月間は、 全く平穏無事に動いていました。

現在、 FreeBSD 4系が原因なのか、 idprio が原因なのか、 acpi_ppc が原因なのか、 ACPI が原因なのか、 マシン固有なのか、 何か別のソフトが原因なのか、 追跡中です。

Thr,15 Dec,2005、中間まとめ。


  • OS は、FreeBSD 4.11-STABLE(Oct 12 17:40:59 JST 2005) のみしか、試していない。
  • DELL LATITUDE C400 (Mobile-Pentium3 1000/733MHz, i82830M)、 SN95G5 (Athlon64 3500+, nForce3 250)、 の2台とも、発症する。
  • idprio を使用していても、 acpi_ppc を kldload していない時は、 まだ発症した事が無い。
  • hw.acpi.cpu.px_control=0 (acpi_ppc の自動切替え off)でも発症するが、 滅多に発症しなくなる。 これなら発症する、と思うパターンを 10回くらい繰り返したが1回だけしか発症しなかった。
  • acpi_ppc を kldload していても、 idprio を使用していない時は、 のべ10ヶ月間、一度も発症した事が無い。
  • idprio したプロセスが多い方が、発症しやすい。 idprio 指定した setiathome -standalone(いわゆるテストモード)や、 idprio 指定した distributed.net を、 合わせて5本同時に動かすと、 どれか1つ setiathome -standalone が完了した瞬間、 ほぼ確実に発症する。
  • プロセスの生成もしくは消滅を行ったとき (idprio 指定の有無を問わない)、 もしくは idprio の新規指定もしくは変更したとき、 に、発症する。 プロセスの生成もしくは消滅を行うときは、 idprio 指定されたプロセスの方が発症しやすい。 idprio 指定されていないプロセスが生成もしくは消滅するときは、 滅多に発症しない(発症しないわけではない)。
  • プロセスの生成もしくは消滅、 idprio 指定の新規もしくは変更、 をしない時には、発症したためしが無い。
  • Load が高い方が、発症しやすい?
  • そういえば、 X (XFree86 4.5.0) を動かしていない時は、 試した事が無いや。

Sat,17 Dec,2005、中間まとめ。


  • idprio 指定を、がしがしいじって top を見ていたところ、 優先度を下位に落しても優先度上位のプロセスよりも優先して走っていたり、 優先度を上位に上げても優先度下位のプロセスの方が優先して走っていたり、 している。しかもしょっちゅう。
  • デバッグ用の DDB と -g を指定したカーネルを作ったら、 今のところ、ぜんぜん発症しない。

    Fri,23 Dec,2005、中間まとめ。


  • idprio 指定したプロセスが2つ以下だと、 とりあえず発症した事は無い。
  • Sat,17 Dec,2005 に、はっきりと気付いた現象、 "idprio 31 nice +20" 指定されたプロセスが、 "idprio -t nice +20" なプロセス(idprio無指定のプロセス) よりも、優先して動く現象が、 けっこう頻繁に発生している事を確認。

Mon,26 Dec,2005、中間まとめ。


  • idprio 指定したプロセスが1個の時でも、発症した。 ただし、2台を3週間、のべ1ヶ月半使っていて、今日が初めて。 具体的な状況は、 idprio 31 指定した distributed.net を1つ動かしている状態で、 NFS に umount かけたら落ちた。 NFS サーバ側では正常終了になっていたので、 多分、umount のプロセスが消滅する瞬間に落ちたのだろう。

acpi_ppc が splx() 使っていない事がらみか? FreeBSD 4系の idprio がらみか?

と、言うわけで、個人的には、 「acpi_ppc は、たぶん問題無い。 FreeBSD 4系のスケジューラの rtprio/idprio の処理が おかしいのではないか」、 と言う結論に達しました。


Fri,29 Sep,2006、現状。


2005年12月に idprio を無効にしてから9ヶ月、 全く問題無く動作しています。


■ powerd 改造パッチ

本ソフトのメンテナンスは打ち切りました。

powerd 改造パッチの原作はこちら(http://www.imasy.or.jp/~ume/FreeBSD/)。

powerd62R-thermal-20050624.diff.bz2(3KiB) タイプ0:ume氏のパッチを FreeBSD 6.2-RELEASE 対応に修正したもの。

powerd62R-thermal-20070317.diff.bz2(4KiB) タイプ1:タイプ0に加えて、クロックの1段階/2段階の上げ/下げ対応改造。

powerd62R-2007321.diff.bz2(5KiB) タイプ2:タイプ0に加えて、クロックの上げ下げのアルゴリズムを多段階にした物。

powerd62R-2007412.diff.bz2(6KiB) タイプ3:タイプ2に加えて、上限/下限クロックの設定、プロファイル切り換え、を追加した物。

powerd63R-2007412.diff.bz2(6KiB) タイプ3の FreeBSD 6.3-RELEASE 用。

概要

注意(追記:Jan〜May,2008): CoreDuo i945GM FreeBSD/i386 6.3-RELEASE SMP-kernel な環境で使用した所、 特に X を止める時に、週数回のペースでカーネルフリーズが頻発しました。 本パッチを利用していなくても起きます。 Intel統合チップな環境で SMP と SpeedStep を同時使用すると駄目らしい? GENERIC-kernel な環境だと、1〜2ヶ月に1回のペースまで減る模様。 Athlon64 nForce3 FreeBSD/amd64 6.3-RELEASE GENERIC-kernel な環境では、 今の所、全く問題は起きていません。

FreeBSD 4 や FreeBSD 5 では、 acpi_ppc(acpi_ppc に関してはこちらを参照)を 手動で入れる事で、 負荷状況に応じて CPU の動作周波数を変更する事が出来ましたが、 FreeBSD 6 以降では、 Athlon64 (AMD64) の Cool'n'Quiet (CnQ) や Intel の Enhanced SpeedStep 等での、 CPU の動作周波数を動的に制御できるカーネルモジュール cpufreq と、 負荷状況に応じて cpufreq を制御するデーモン powerd が、 実装されました。

しかしながら、cpufreq & powerd は、 温度が上昇した時に shutdown する機能はありますが(cpufreq に内蔵)、 温度が上昇した時にクロックを落す機能が弱いです (acpi_ppc だと機能自体が無いけれど)。 BIOS だか ACPI だかに、 hw.acpi.thermal.tz0._TSP と hw.acpi.thermal.tz0._TC1 と hw.acpi.thermal.tz0._TC2 と hw.acpi.thermal.tz0._PSV と hw.acpi.thermal.tz0._ACx が有れば、 温度上昇時にクロックを落す機能が有効になるみたいですが、 どれか1つでも情報が無いと、 BIOS だか ACPI だかが温度を読む機能に対応していても、 クロックを落してくれないみたいです。 クロック制御機能とか CnQ とか SpeedStep 使ってみた感じでは、 ヒートシンクとかファンとかエアフローとかが狂っていない限り、 AthlonXP系とか Athlon64系では、 夏場に最大速度で回しても60℃±5℃で納まっており、 危険を感じた事はありませんが。 PentiumM とか CeleronM とか CoreDuo だと、 最大速度で回すと冬場なのに90℃とか100℃とか指すんですが……、 温度計が狂っている? Pentium4 とか PentiumD とか Xeon とかだと、真冬に部屋の暖房を止めても、 ファンが轟音で回り続けるんですが……。

powerd の注意1: acpi_ppc はカーネル空間で動くので、 カーネル空間からデータをコピーしないぶん、 powerd より、ほんのちょっと軽くて速いですが、 万が一バグや悪相性が有ると、カーネルごと死にます。 powerd はユーザ空間で動くので、 カーネル空間からデータをコピーするぶん重いですが、 万が一バグや悪相性が有っても、カーネルは安全です。

powerd の注意2: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 例えば make world した時の様に、 負荷が頻繁に上がったり下がったりする場合、 いちいちクロックを上げたり下げたりしてしまいます。

powerd の注意3: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 Athlon64系の様に、クロックの段階数が少ない物で使うと、 クロックが上がったり下がったり振動してしまいます。 この辺に関しては、acpi_ppc の、 切り換え前後の周波数を見てヒステリシス性を持つアルゴリズムを 移植すべきかと。

cpufreq の注意1: Athlon64 だと、監視している温度は CPU の温度では無い模様。 一体、何処の温度なんだろう……? そもそも、10秒毎に hw.acpi.thermal.tz0.temperature を見ていても、 変化しないんですが。mbmon だと変化しているのに……?

タイプ0の中身

ume氏により、 温度が上昇した時にクロックを落すパッチが公開されましたが、 FreeBSD 6.0-CURRENT 用だったので、 FreeBSD 6.2-RELEASE 用に調整してみました (size_t を int と書いてしまっている点の修正を含む)。

タイプ0の注意1: Athlon64 だと、監視している温度は CPU の温度では無い模様。 一体、何処の温度なんだろう……? そもそも、10秒毎に hw.acpi.thermal.tz0.temperature を見ていても、 変化しないんですが。mbmon だと変化しているのに……?

タイプ0の注意2: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 例えば make world した時の様に、 負荷が頻繁に上がったり下がったりする場合、 いちいちクロックを上げたり下げたりしてしまいます。

タイプ0の注意3: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 Athlon64系の様に、クロックの段階数が少ない物で使うと、 クロックが上がったり下がったり振動してしまいます。 この辺に関しては、acpi_ppc の、 切り換え前後の周波数を見てヒステリシス性を持つアルゴリズムを 移植すべきかと。

タイプ1の中身

ume氏のパッチは、クロック強制低下モードに入ると、 負荷が上がろうが下がろうがクロックを変えなくなる仕様だったので、 負荷が下がった場合はクロックを落す様に改造してみました。

さらに。 負荷がとても高い時には段階を踏まずに最高クロックにしたり、 負荷がちょっとだけ高い時には1段だけ上げたり (標準の powerd では2段上がる)、 負荷がとても低い時には2段下げたり (標準の powerd では1段下がる)、 nice 指定されたプロセスで負荷が上がった場合はクロックを上げなかったり、 する機能の追加をしてみました。 なお、デフォルトでは追加機能は無効にしてあります。

タイプ1の注意1: Athlon64 だと、監視している温度は CPU の温度では無い模様。 一体、何処の温度なんだろう……? そもそも、10秒毎に hw.acpi.thermal.tz0.temperature を見ていても、 変化しないんですが。mbmon だと変化しているのに……?

タイプ1の注意2: 温度上昇に関して抑圧的な挙動をします。 温度が設定値を越えると、ガンガンとクロックを落していき、 どんなに負荷が上がっても、 温度が下がるまでクロックを上げなくなってしまいます。

タイプ1の注意3: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 例えば make world した時の様に、 負荷が頻繁に上がったり下がったりする場合、 いちいちクロックを上げたり下げたりしてしまいます。

タイプ1の注意4: 標準の powerd や改造パッチ タイプ0や改造パッチ タイプ1は、 Athlon64系の様に、クロックの段階数が少ない物で使うと、 クロックが上がったり下がったり振動してしまいます。 この辺に関しては、acpi_ppc の、 切り換え前後の周波数を見てヒステリシス性を持つアルゴリズムを 移植すべきかと。

タイプ2の中身

ume氏のパッチは、クロック強制低下モードに入ると、 負荷が上がろうが下がろうがクロックを変えなくなる仕様だったので、 上限クロックを下げるだけに改造してみました。 上限クロック以下の範囲で、 負荷に応じたクロックの上げ下げは続行されます。

負荷に応じたクロック変更のアルゴリズムを変更しました。 acpi_ppc のヒステリシスのアルゴリズムを元に改造して、 多段階のクロック上げ下げに対応しました。

クロックを下げる時には、 暫く待ってから下げる様に改造しました。 これで、make world の様に、 負荷がバタバタ変動しても、いちいちクロックを下げたりしなくなる……、 はず。

タイプ2の注意1: 標準の powerd やタイプ0、タイプ1、に比べ、 クロックが上がりがちになるので、 発熱量や、電気代や、ノートPCの電池の持ち時間には、 悪影響があるかもしれません。

タイプ2の注意2: クロックの変更に必要な時間に対して 温度変化に必要な時間がとても長いため、 温度の設定値と温度監視の時定数によっては、 クロックが上がったり下がったり発振します。

タイプ3の中身

タイプ2に、クロックの上限と下限を設定できる様にしました。

また、設定を2セット持ち、使用中に切り換えることが出来ます。

注意事項はタイプ2と同じ。

タイプ3の注意1: オリジナルの powerd でも、sysctl debug.cpufreq.lowest にて クロックの下限は指定できます。 但し、使用中の変更はできません。

その他

注意:freebsd-update で powerd が更新されると、再パッチが必要です。

使い方:

(1) acpi とか cpufreq とかを入れる。
cpufreq は、手動で
% kldload cpufreq
すると動作不良を起こすので、/boot/loader.conf で
cpufreq_load="YES"
する。

(2) acpi と cpufreq の状況を確認する。
% sysctl hw.acpi.thermal
と
% sysctl dev.cpu
で、
hw.acpi.thermal.tz0.temperature: 56.0C
hw.acpi.thermal.tz0._PSV: -1
dev.cpu.0.freq: 375
dev.cpu.0.freq_levels: 1667/15000 1458/13125 1333/14000 1166/12250 1000/13000 875/11375 750/9750 625/8125 500/6500 375/4875 250/3250 125/1625
とか
hw.acpi.thermal.tz0.temperature: 40.0C
hw.acpi.thermal.tz0._PSV: 100.0C
dev.cpu.0.freq: 1000
dev.cpu.0.freq_levels: 2200/67000 2000/56000 1800/46000 1000/20000
とかなっていれば、使えるはず。

(3) クロックダウンしたい温度を設定する。
90℃に設定したいならば、
% sysctl hw.acpi.thermal.user_override=1
% sysctl hw.acpi.thermal.tz0._PSV=90C
とか、/etc/sysctl.conf で
hw.acpi.thermal.user_override=1
hw.acpi.thermal.tz0._PSV=90C
とかする。
sysctl で設定した場合は、再起動すると変更が消える。
/etc/sysctl.conf に書いた場合は、再起動しないと変更が反映されない。
hw.acpi.thermal.tz0._HOT=90C
とか
hw.acpi.thermal.tz0._CRT=90C
とかすると、10秒?以上 90℃以上が続くと shutdown してしまうので注意。
hw.acpi.thermal.tz0._PSV=-1
だと、温度判定しない。

(4) パッチを当てた powerd を入れる。

(5) powerd の温度対応の設定をする。
/etc/rc.conf で
powerd_flags="-a adaptive -b minimum -n adaptive -p 100 -r 50 -i 60 -t"
みたいに、-t オプションを追加する。

(6) powerd を起動する。
% /etc/rc.d/powerd stop
% /etc/rc.d/powerd start
もしくは
% /etc/rc.d/powerd restart
する。

(7) どんな感じでクロックが変化しているかを見たければ、
% /etc/rc.d/powerd stop
% powerd -a adaptive -b minimum -n adaptive -p 100 -r 50 -i 60 -t -v
とかする。


(8) タイプ0〜タイプ3共通の、温度関連の設定に関して。

温度監視を有効にしたい場合は、 -t オプションを付けます。
標準設定では無効になっています。

温度監視の時間間隔(時定数)は -c オプションで [ms] 単位で指定します。
なお、-p オプションの指定値より小さな単位で指定しても、
-p オプション指定値の倍数に丸められます。
また、-p オプションの指定値や acpi の監視時間間隔(たぶん10秒)より
小さくする事は出来ません。
標準設定では -c 10000 (10秒)です。


(9) タイプ1の独自設定に関して。

負荷がとても上がった時に、段階を経ずに最高クロックにしたい時は、
例えば負荷95%で強制的に最高クロックにしたい時は -U 5 オプションを追加します。

負荷がちょっとだけ上がった時に、1段だけクロックを上げたい時は、
例えば負荷60%時は -u 40 オプションを追加します。

負荷が大きく下がった時に、2段クロックを下げたい時は、
例えば負荷20%時は -d 80 オプションを追加します。

nice 指定されたプロセスで負荷が上がった時にはクロックを上げたくない時は、
-l 2 オプションを追加します。
標準設定では -l 0 (nice 指定されたプロセスの負荷も勘定する)になっています。

負荷割合の指定は、acpi_ppc と論理が逆になっていますので注意。

個人的な好みは、Core Duo の場合は、
-a adaptive -b minimum -n adaptive -p 100 -U 35 -r 50 -u 60 -i 80 -d 90 -l 10 -t
あたりかなぁ。
Athlon64 の場合は、FreeBSD 6.2-RELEASE の標準設定のままで問題無し。


(10) タイプ2の独自設定に関して。

負荷がとても上がった時に、段階を経ずに最高クロックにしたい時は、
例えば負荷95%で強制的に最高クロックにしたい時は -U 5 オプションを追加します。
標準設定では -U 0 (負荷が100%より大きくなった時、
そんな事はありえないので、つまりこの機能は無効)に
なっています。

-r オプションと -i オプションの意味が変更されています。

負荷が上がってアイドル時間が -r 指定値よりも小さくなった場合、
アイドル時間が -r での指定値よりも大きくなると推定されるクロックまで
引き上げます。
例えば、-r 60 が指定されている時にアイドル時間が 20%になった場合、
クロックを倍に引き上げます。
(処理している時間が80%だから、
クロックを倍にすると処理している時間が40%でアイドルが60%になると
想定される)。

負荷が下がってアイドル時間が -i 指定値よりも大きくなった場合、
アイドル時間が -i での指定値よりも小さくなると推定されるクロックまで
引き下げます。
例えば、-i 80 が指定されている時にアイドル時間が 90%になった場合、
クロックを半分に下げます
(処理している時間が10%だから、
クロックを半分にすると処理している時間が20%でアイドル時間が80%になると
想定される)。

負荷が下がった時のクロックを下げるまでの待ち時間は、
-D オプションで [ms] 単位で指定します。
なお、-p オプションの指定値より小さな単位で指定しても、
-p オプション指定値の倍数に丸められます。
標準設定では -D 0 (待ち時間無し)です。

nice 指定されたプロセスで負荷が上がった時にはクロックを上げたくない時は、
-l 2 オプションを追加します。
割込処理で負荷が上がった時にはクロックを上げたくない時は、
-l 8 オプションを追加します。
nice 指定と割込処理の負荷の両方を無視したい場合は -l 10 オプションを追加します。
標準設定では -l 0 (全ての負荷を勘定する)になっています。

負荷割合の指定は、acpi_ppc と論理が逆になっていますので注意。

個人的な好みは、Core Duo の場合は、
-a adaptive -b minimum -n adaptive -p 100 -D 300 -c 10000 -U 25 -r 55 -i 80 -l 10 -t
あたりかなぁ。
Athlon64 の場合は、FreeBSD 6.2-RELEASE の標準設定のままで問題無し。


(11) タイプ3の独自設定に関して。

タイプ2の機能は全部持っています。
クロックの上限/下限の設定と、プロファイルの切り換えが加わっています。

-H でクロックの上限を設定します。-H 1500 ならば、1500MHz が上限クロックになります。
-L でクロックの上限を設定します。-L 500 ならば、500MHz が下限クロックになります。

-0 で、プロファイル1を選択します。
これ以降の引数指定は、プロファイル1に適用されます。
-1 で、プロファイル2を選択します。
これ以降の引数指定は、プロファイル2に適用されます。
-0 か -1 か、どちらか最後に指定された方が、
powerd の起動時のプロファイルとして選択されます。

-C val で、val のプロファイルから、現在選択しているプロファイルに、
設定をコピーします。
val は 0 か 1 で、コピー元プロファイルを指定します。

powerd の起動後、powerd に SIGUSR1 を送るとプロファイル1に切り替わります。
powerd に SIGUSR2 を送るとプロファイル2に切り替わります。
sudo 使わないと、シグナルを送れないと思いますが。

個人的な好みは、Core Duo の場合は、
-0 -a adaptive -b minimum -n adaptive -p 100 -D 300 -c 10000 -U 25 -r 55 -i 80 -H 1458 -L 250 -l 10 -t -1 -C 0 -H 1667 -L 625 -0
あたり。通常時はプロファイル1を使い、
プログラミング時や製図時やゲーム時はプロファイル2に切り換えます。
でも、切り換えるのが面倒くさい。
かと言って切り換えないと、
CoreDuo の省電力時は目茶苦茶遅いし、
クロックを上げると発熱とファンの騒音が酷いし。
つくづくバランス悪いCPUだと思う。
裏を返すと、MobilePentium3 とか PentiumM とかは、そこそこバランス良かったと思う。
AMD系のモバイル用?CPUは、使う機会に恵まれないので不明。

■ xsysinfo-1.4a CPU と MEM と SWAP は別系統の色を設定できる改造パッチ

本ソフトのメンテナンスは打ち切りました。

Desktop Image図の、右下のヤツ。

xsysinfo-1.4a.patch3.bz2(6KiB) (Fri,04 Jul,2008)

※ FreeBSD ports のパッチも同梱されています。 …… 2006年11月9日付で、 FreeBSD ports からは外されてしまった模様。

xsysinfo(総本山不明)では、 colors 指定にてグラフ表示の色を変更できますが、 LOAD, DISK, PKT, NFS C/S は グラデーション方式で色を使用するのに対して、 CPU, MEM, SWAP は 意味毎に色を使い分けています。 で、グラデーション用の色と、意味表示用の色を、 別個に設定できる様に改造してみました。

あと、オリジナルの xsysinfo にはメモリ破壊バグがあったので修正。

FreeBSD 4 以降では、swap の表示が間違っているバグがあったので修正。

それから、FreeBSD ports の FreeBSD 6 対応のパッチも同梱。

mcolors にてグラデーション用の色を指定し、 colors にて意味用の色を指定します。

何故 xosview を使わずに xsysinfo なのかと言うと、 同じ更新間隔に設定しても xosview の方が CPU負荷が高かったから、 と言うだけの理由。 でも、メモリ常駐量は、xsysinfo が 2.6MiB で、 xosview は 2.1MiB だった。


■ xosview-1.8.3 on FreeBSD でメモリを 4GiB以上積んでいると容量計算を間違えるバグ修正パッチ

xosview-1.8.3.patch1(2KiB) (Tue,11 Sep,2012)

xosview-1.8.3を FreeBSD で使った場合、 メモリを 4GiB 以上積んでいる時にページサイズが 4KiB 以下だと メモリの容量計算を間違えます。 それの修正パッチ。


■ Qt-BSch , pcb.sourceforge.net , EDA 関連

回路図CAD QtBSch , 回路基板CAD pcb.sourceforge.net 関連は、こちら


■ pcb.sourceforge.net , EDA , RS-274D / RS-274X gerber 関連

回路基板CAD pcb.sourceforge.net の RS-274X ガーバ出力 と MITS FLASH for WIN 回路基板切削機 関連は、こちら


■ SSL の暗号強度の指定が出来ないアプリケーションで、強引に指定する方法

本パッチは技術的考察の為に作成したものであり、メンテナンスは行っていません。。

1) OpenSSL ライブラリの ssl_lib.c を用意する。
2) SSL_CTX_new() だけ切り出して、ssl_ctx_new.c に保存する。
3) 編集する。SSL_DEFAULT_CIPHER_LIST を、てきとーにいじる。
   こんな感じになる。
4) コンパイル:gcc -g3 -O3 -c -o ./ssl_ctx_new.o ./ssl_ctx_new.c -I$TOP -I$TOP/ssl
   $TOP は、OpenSSL を展開したディレクトリ。
5) リンク:gcc -shared -g3 -O3 -o ./ssl_ctx_new.so ./ssl_ctx_new.o
6) 出来上がった ssl_ctx_new.so を、適当なディレクトリに保存する。
7) 暗号強度を強制指定したいアプリケーションを動かす時のみ、
   env コマンドあたりを使って環境変数 LD_PRELOAD に ssl_ctx_new.so を
   フルパスで追加する。
強引だなぁ……、いいのかなぁ……。

■ boinc SETI@Home Enhanced, Optimized for FreeBSD 4.11-STABLE with Pentium3 SSE and fftw3f(WITH_SSE)

本パッチのメンテナンスは打ち切りました。

Berkeley Open Infrastructure for Network Computing (通称 BOINC)版 SETI@Home / SETI@Home Enhanced の、 fftw 3.x(SSE,SSE2,3dNow対応) を利用して最適化した SETI@Home Enhanced(ver.5)系のオフィシャル版ソース もしくは SETI@Home(ver.4)系 setiboinc.sourceforge.net版ソース Seti@home Boinc Optimization と、 同じく naparst版ソース Harold Naparst を、 Pentium3(MMX,SSE対応)上の FreeBSD 4.11-STABLE の gcc34 で コンパイルが通る様に改変し、ビルドしたバイナリです。

reference_work_unit.sah での試験に合格する事を確認してあります。 但し、一切の、保証,補償,保障は、ありません。 使いたい方は、自身で判断して下さい。

SETI@Home は SETI@home Enhanced(ver.5系)に移行し、 May 16, 2006 をもって、ver.4系への work unit の生成を止めたそうです。 下記クライアントのうち ver.4系は、もはや使用できません。


boinc-client-5.4.7_build.tar.bz2(2.6MiB) Optimized boinc client 5.4.7 for i386-unknown-freebsd4.11 (Pentium3 SSE i387)

setiathome_5.12_p3-sse-fftw3-freebsd4.tar.bz2(268KiB) SETI@Home Enhanced 5.12 for i386-unknown-freebsd4.11 (Pentium3 SSE i387)

naparst版は、 hnaparst.homelinux.com に接続拒否されてソースが入手できないため、 ビルドできていません。 オフィシャルソース版は遅いからやだ、と言う方は、 Linux Emulation でも使って、 crunch3r あたりの GNU/Linux用 SETI@Home Enhanced でも動かしてください。 なお、crunch3r の app_info.xml をそのまま使うと エラー出してこけるので注意されたし (ファイル名のリビジョン番号が古いままになっている)。 crunch3r の GNU/Linux用 boinc は FreeBSD 4-STABLE の RedHat8 ベースの Linux Emulation では 動かせませんでした(RedHat8 用の libcurl.so.3 と libssl.so.0.9.7 と libcrypto.so.0.9.7 が入手できん。 自前ビルドするのは面倒だから嫌)。

FreeBSD 4系のオフィシャル ports/package では、 boinc, SETI@home Enhanced への対応をやめたそうです。

setiathome 5.12 オフィシャル版を自前で修正して、 FreeBSD 4.11-STABLE 用にビルドして試験してみたら、 計算結果は5〜7桁一致で合格だったものの、 setiathome 4.07 naparst最適化版と比べて7倍遅く、 setiathome 4.07 オフィシャル版と比べて3割遅く、 なっていました。 オフィシャルの広報にも、 Enhanced は より精細になったぶん重くなった、 と書いてはありますが。

常用の MobilePentium3 1000MHz で、 本物のデータ処理を開始してみたのですが……。 3WU ダウンロードして処理開始した所、 10時間±5時間で、 3WU 全て、よそさま3人(合計9人)の返答が完了しているのに、 私の所は、最初の WU の、しかも30%しか終わっていないのですが。 ベンチマーク値からの単純換算で、 よそさまの処理速度の半分しか出ていないのですが。 いっそのこと、 FreeBSD の Linux Emulation で走らせた方が速いんでは? ……。 1WU 完了するのに、19時間かかりました。 しかも、申報失敗で invalid 出されて granted credit が 0.00 になりました。 19時間が全て無駄に。 ……。 FreeBSD の Linux Emulation で crunch3r 版を単独試験で動かしてみた所、 約1.5倍速く(所要時間65%)完了しました。 boinc からの呼び出しで正しく処理できて valid 判定が貰えるかどうかは、 今、試しているところ。

使い方


どのくらい、性能が違うのか。


reference_work_unit.sah での総処理時間で比較。

boinc-client:使用したコンパイルオプション


CC=gcc34
CFLAGS=-g3 -O3
CXX=g++34
CXXFLAGS=-g3 -O3
CPP=cpp34
CPPFLAGS=-g3 -O3
LDFLAGS=-g3 -O3
./configure --with-ssl --enable-debug --with-wx-config=false

-O3 -march=pentium3 -mmmx -msse -mfpmath=387 -mfpmath=sse -ffast-math -funroll-loops -ffloat-store -funsafe-math-optimizations -mpreferred-stack-boundary=4 -fomit-frame-pointer

boinc-client:ソースの変更箇所


Makefile の LDFLAGS と LIBCURL と LIBS に 余計な -L と -rpath が付くので削除 (LIBCURL の -L/usr/local/lib は残す)。

*** config.h.org        Thu May 25 19:34:20 2006
--- config.h    Thu May 25 20:42:21 2006
***************
*** 183,195 ****
  /* #undef HAVE_STD_LOCALE */
  
  /* Define to 1 if max is in namespace std:: */
! /* #undef HAVE_STD_MAX */
  
  /* Define to 1 if min is in namespace std:: */
! /* #undef HAVE_STD_MIN */
  
  /* Define to 1 if transform is in namespace std:: */
! /* #undef HAVE_STD_TRANSFORM */
  
  /* Define to 1 if you have the <strings.h> header file. */
  #define HAVE_STRINGS_H 1
--- 183,195 ----
  /* #undef HAVE_STD_LOCALE */
  
  /* Define to 1 if max is in namespace std:: */
! #define HAVE_STD_MAX 1
  
  /* Define to 1 if min is in namespace std:: */
! #define HAVE_STD_MIN 1
  
  /* Define to 1 if transform is in namespace std:: */
! #define HAVE_STD_TRANSFORM 1
  
  /* Define to 1 if you have the <strings.h> header file. */
  #define HAVE_STRINGS_H 1
*** lib/std_fixes.h.org     Fri May  6 09:36:07 2005
--- lib/std_fixes.h Thu May 25 19:55:38 2006
***************
*** 19,24 ****
--- 19,25 ----
  
  #ifndef _STD_FIXES_H_
  #define _STD_FIXES_H_
+ #include <sys/types.h>
  
  #ifdef __cplusplus
  
*** lib/md5_file.C.org      Tue Nov 22 03:34:28 2005
--- lib/md5_file.C  Thu May 25 20:33:42 2006
***************
*** 101,112 ****
--- 101,117 ----
          
      CryptReleaseContext(hCryptProv, 0);
  #else
+     for(int i=0; i<32; i++){
+       buf[i] = random();
+     }
+ /*
      FILE* f = fopen("/dev/random", "r");
      if (!f) {
          return -1;
      }
      fread(buf, 32, 1, f);
      fclose(f);
+ */
  #endif
      md5_block((const unsigned char*)buf, 32, out);
      return 0;

SETI@Home Enhanced オフィシャル版:使用したコンパイルオプション


CC=gcc34
CFLAGS=-g3 -O3
CXX=g++34
CXXFLAGS=-g3 -O3
CPP=cpp34
CPPFLAGS=-g3 -O3
LDFLAGS=-g3 -O3
BOINCDIR=/tmp/setiboinc/boinc-client-5.4.7
./configure --disable-dynamic-graphics --disable-graphics --disable-server --enable-mmx --enable-sse --enable-fast-math --with-ssl

-O3 -march=pentium3 -mmmx -msse -mfpmath=387 -mfpmath=sse -ffast-math -funroll-loops -ffloat-store -funsafe-math-optimizations -mpreferred-stack-boundary=4 -fomit-frame-pointer

SETI@Home Enhanced オフィシャル版:ソースの変更箇所


Makefile の BOINCDIR の設定が狂っているのを直す。

*** configure.org       Sun Apr 30 16:04:46 2006
--- configure   Thu May 25 21:48:01 2006
***************
*** 21986,21992 ****
  else
          printf "OpenSSL found in $ssldir\n";
          LIBS="$LIBS -lssl -lcrypto";
!         LDFLAGS="$LDFLAGS -L$ssldir/lib";
  
  cat >>confdefs.h <<_ACEOF
  #define USE_OPENSSL 1
--- 21986,21992 ----
  else
          printf "OpenSSL found in $ssldir\n";
          LIBS="$LIBS -lssl -lcrypto";
!         LDFLAGS="$LDFLAGS";
  
  cat >>confdefs.h <<_ACEOF
  #define USE_OPENSSL 1
***************
*** 22402,22408 ****
  
           lib_is_static="yes"
           sah_lib_last="${sah_static_lib_last}"
!        BOINC_EXTRA_LIBS="${BOINC_EXTRA_LIBS} -L${SSLDIR}/lib ${sah_lib_last}"
  
  else
  
--- 22402,22408 ----
  
           lib_is_static="yes"
           sah_lib_last="${sah_static_lib_last}"
!        BOINC_EXTRA_LIBS="${BOINC_EXTRA_LIBS} ${sah_lib_last}"
  
  else


以下は ver.4系の古い話。

本パッチのメンテナンスは打ち切りました。

setiathome_4.07_p3-sse-fftw3-freebsd4.tar.bz2(702KiB) setiboinc.sourceforge.net version

setiathome_4.07_p3-sse-fftw3-naparst-freebsd4.tar.bz2(635KiB) naparst version

boinc-client.bz2(305KiB) Optimized boinc client version 4.68 for i386-unknown-freebsd4.11

使い方


パッケージで boinc-client-4.68.20050601_2 を入れた後、 SETI@Home に参加登録

/usr/local/bin/boinc -attach_project [hogehoge] [mogemoge]

し、参加登録完了したところでエラーが出るので一旦終了。 上記アーカイブの中身を /var/db/boinc/projects/setiathome.berkeley.edu/ に展開し、展開された /var/db/boinc/projects/setiathome.berkeley.edu/app_info.xml.fftw3f_pentium3m_optimized か /var/db/boinc/projects/setiathome.berkeley.edu/app_info.xml.fftw3f_pentium3m_naparst を /var/db/boinc/projects/setiathome.berkeley.edu/app_info.xml に cp なり mv なり ln なり ln -s なりして、 もう一度、boinc を始動

/usr/local/etc/rc.d/boinc.sh forcestart

すると、最適化版で処理を行う様になります。

fftw3f は埋め込みにしてあるので、 別途インストールする必要はありません。

マシン起動時に自動的に boinc を開始したければ、 /etc/rc.conf に

boinc_enable="YES"

を追加します。

使用したコンパイルオプション


-O3 -march=pentium3m -mmmx -msse -ffast-math -funroll-loops -ffloat-store -funsafe-math-optimizations -mpreferred-stack-boundary=4 -fomit-frame-pointer

ソースの変更箇所、setiboinc.sourceforge.net版


*** client/main.cpp.org        Tue Jan  4 08:39:09 2005
--- client/main.cpp    Sat Dec 10 23:10:52 2005
***************
*** 40,45 ****
--- 40,46 ----
  #include <errno.h>
  #endif
  
+ #include "exception.h"
  #include "diagnostics.h"
  #include "util.h"
  #include "s_util.h"

*** client/qtest.cpp.org       Tue Dec 28 06:58:20 2004
--- client/qtest.cpp   Sat Dec 10 23:12:15 2005
***************
*** 243,252 ****
                        spacer = espace;
  
                float timeOfOneBase = (baselineTime) / ((float)runCount) * 2e6;
!                   timeOfOneBase = 5 * arrayCount * log2(arrayCount) / timeOfOneBase;
                    
                float timeOfOneOpt = (optimizedTime) / ((float)runCount) * 2e6;
!                   timeOfOneOpt = 5 * arrayCount * log2(arrayCount) / timeOfOneOpt;
                    
                printf("   FFT %s%d: %.2f percent;  %.2f vs %.2f MFlop, %d errs forwards, %d errs backwards \n", 
                        spacer, arrayCount, (baselineTime - optimizedTime) / optimizedTime * 100,
--- 243,252 ----
                        spacer = espace;
  
                float timeOfOneBase = (baselineTime) / ((float)runCount) * 2e6;
!                   timeOfOneBase = 5 * arrayCount * (log(arrayCount)/log(2.0)) / timeOfOneBase;
                    
                float timeOfOneOpt = (optimizedTime) / ((float)runCount) * 2e6;
!                   timeOfOneOpt = 5 * arrayCount * (log(arrayCount)/log(2.0)) / timeOfOneOpt;
                    
                printf("   FFT %s%d: %.2f percent;  %.2f vs %.2f MFlop, %d errs forwards, %d errs backwards \n", 
                        spacer, arrayCount, (baselineTime - optimizedTime) / optimizedTime * 100,

ソースの変更箇所、naparst版


*** client/analyzeFuncs.cpp.org        Sat Dec 10 07:06:47 2005
--- client/analyzeFuncs.cpp    Fri Dec 16 22:05:06 2005
***************
*** 120,125 ****
--- 120,126 ----
  static void cache_destroy();
  
  
+ inline        double round( double tmp ) { return (+0.0 <= tmp) ? floor(tmp+0.5) : ceil(tmp-0.5); }
  static float *acml_fft_comm(int n)
    // returns pointer to comm array for fft of length n, which is a power of 2.
  {
***************
*** 660,665 ****
--- 661,667 ----
  } // seti_analyze()
  
  
+ inline        int __signbit( double tmp ) { return copysign(1.0,tmp) < 0.0; }
  static void cache_destroy()
  {
      int i;
*** client/gaussfit.cpp.org    Sat Dec 10 07:06:47 2005
--- client/gaussfit.cpp        Mon Dec 12 01:21:40 2005
***************
*** 185,190 ****
--- 185,191 ----
    return f_ChiSq;
  }
  
+ inline        float fminf( float a, float b ){ return (a < b) ? (a) : (b); }
  
  static inline float f_GetTrueMean(
    float fp_PoT[],
*** client/malloc_a.cpp.org    Sat Dec 10 07:06:47 2005
--- client/malloc_a.cpp        Mon Dec 12 04:26:02 2005
***************
*** 51,59 ****
    void *pmem;
    void *palignedMem;
    void **pp;
! #if defined(__SSE__)
    return ((void *)_mm_malloc(size,alignment));
! #endif
    // ensure byteAlignment is positive (if alignment is 0, make it 1)
    if (alignment < 1) {
      alignment = 1;
--- 51,59 ----
    void *pmem;
    void *palignedMem;
    void **pp;
! #if defined(__ICC)
    return ((void *)_mm_malloc(size,alignment));
! #else
    // ensure byteAlignment is positive (if alignment is 0, make it 1)
    if (alignment < 1) {
      alignment = 1;
***************
*** 70,75 ****
--- 70,76 ----
    pp[-1] = pmem;    // store original address
  
    return(palignedMem);            // return aligned memory
+ #endif
  }
  
  //Frees memory that was allocated with malloc_a
***************
*** 77,91 ****
    void **pp;
  
    if (palignedMem == NULL) return;
! #if defined(__SSE__)
    _mm_free(palignedMem);
    return;
! #endif
  
    pp = (void **) palignedMem;
  
    //pp[-1] pts to original address of malloc'd memory
    free(pp[-1]);
  }
  
  void *calloc_a(size_t size, size_t nitems, size_t alignment) {
--- 78,93 ----
    void **pp;
  
    if (palignedMem == NULL) return;
! #if defined(__ICC)
    _mm_free(palignedMem);
    return;
! #else
  
    pp = (void **) palignedMem;
  
    //pp[-1] pts to original address of malloc'd memory
    free(pp[-1]);
+ #endif
  }
  
  void *calloc_a(size_t size, size_t nitems, size_t alignment) {

どのくらい、性能が違うのか。


reference_work_unit.sah での総処理時間で比較。 setiboinc.sourceforge.net版は、 バイナリパッケージ版と比べ 1.45倍高速化し、 バイナリパッケージ版の 70%の所要時間でした。 naparst版は、 バイナリパッケージ版と比べ 2.31倍高速化し、 バイナリパッケージ版の 43%の所要時間でした。 また、naparst版は、 setiboinc.sourceforge.net版と比べ 1.59倍高速化し、 setiboinc.sourceforge.net版の 63%の所要時間でした。



■ ofx2csv.pl

ofx2csv.lzh(Sat,15 Sep,2007)(4KiB)

ein氏のofx ファイルを csv ファイルに変換するを、 手直しして、対応するタグを増やしたものです。

Microsoft Money の ofx 形式の電子明細書を、 カンマ区切り csv 形式の電子明細書に変換します。 これで、 取引先金融機関が ofx 形式の電子明細書しか発行してくれなくても、 Microsoft Money をわざわざ買ったりせずに、 OpenOffice のままでも大丈夫(実話)。

また、csv のデータとして出力されない口座情報を、 コメントとして出力する様に変更しました。


■ 株価/ETF/投信/為替の自動取得スクリプト

investor.lzh(Wed,01 Aug,2012)(24KiB)

2012年8月1日の yahoo の株価情報の仕様変更に対応。

2011年4月25?日の nikkei の URL 変更に対応。

2011年3月24?日の yahoo の株価情報の仕様変更に対応。

2009年4月10日の infoseek の為替情報の仕様変更に対応。

2009年4月6日の yahoo の株価情報の仕様変更に対応。

2009年3月5日の yahoo の株価情報の仕様変更に対応。

2009年2月2日の yahoo の株価情報の仕様変更に対応。

2008年12月1日の日経の投信情報サイトの仕様変更に対応。

株価、為替レート、投資信託の基準価額、を調べて、 指定の下限値以下/上限値以上であったら通知するスクリプト。

crontab で

03 16 * * 1-5   $HOME/bin/investor_check.pl stock ${HOME}/investor/ >> ${HOME}/investor/error.log 2>&1
03 00 * * 2-6   $HOME/bin/investor_check.pl fund ${HOME}/investor/ >> ${HOME}/investor/error.log 2>&1
03 22 * * 1-5   $HOME/bin/investor_check.pl forex ${HOME}/investor/ >> ${HOME}/investor/error.log 2>&1

としてやれば、毎日1回ずつチェックして、 結果を "${HOME}/investor/[タイムスタンプ]" に出力する。 標準状態ではメールでの通知は切ってあるので、 アラートメールで通知したければ適当に調整されたし。


■ vim の各種処理を強化するスクリプト

多言語対応(m17n) の国際化(i18n) エディタ、 vim +iconv ですが、 vim の日本語化版 jvim と比べると、 やっぱり +multi_byte の処理が弱いです。 以下のスクリプト群は、 kaoriya パッチを使わずに オリジナルのままの vim7 以降にて、 日本語処理を幾らか強化するスクリプト群です。

# バージョンアップ(portupgrade とか apt-get とか)毎に 香り屋パッチ当てするのは面倒なので、 オリジナルのままとかバイナリパッケージのまま使いたい、 とか、 サーバや共有計算機などで使っているので、 環境設定の変更は出来るけれど パッチ当てとかソフトウェアの追加とかするわけにはいかない、 とか、 香り屋パッチが非対応の最新版 vim を使いたい、 とか、 そんな時の為に。


その1:

vimrc_autofenc(Tue,27 Nov,2012)(9KiB)

日本語で書かれたファイルの編集用の文字コードを自動判定します。 また、モードラインでの文字コード指定に対応します。

使い方:

このスクリプトの内容を ~/.vimrc に追加してください。

modeline で文字コードを指定する場合、

vim:set fencs=euc-jp nomodified:

等と指定してください。 nomodified を忘れると、痛い事になる場合があります。

日本語を含まないファイルの場合は、 システムデフォルトの文字コードとして扱います。   注意: OpenBSD だと システムデフォルトの文字コードが latin1 になっていますので、 デフォルト文字コードも latin1 になります。

備考:

ロケールを UTF-8 にしている場合は、 UCS-2 と UCS-2LE は自動判定されません(できません)。

web で見つかる、文字コード自動判定スクリプト(香り屋系?)だと、 日本語を含まないファイルを編集する場合 ISO-2022-JP とか ISO-8859 とか判定してしまいます。 また、ファイルサイズが 0 のファイルを編集する場合 なにか適当な文字コードで処理してしまい、 その後に日本語を追加すると ISO-2022-JP とか ISO-8859 とか なにか適当な文字コードとかで保存されてしまいます。 さらに、モードラインで CP932 を指定した場合に、 ファイル内に特定の文字を含み かつ内部文字コードが euc-jp になっている場合は、 ファイルの文字コードを euc-jp として処理してしまいます。


その2:

matchit2.vim(Wed,13 Mar,2008)(25KiB)

matchit2.noesc.vim(Sun,25 Mar,2012)(25KiB)

以下の機能を、日本語対応にします。

%       対応する括弧の検索(これは jvim でも multi_byte の括弧非対応)
w W     次の単語の先頭へ移動
e E     次の単語の最後尾へ移動
b B     単語の先頭へ移動
*       カーソル位置の単語を後方検索
#       カーソル位置の単語を前方検索
y{motion}       単語を yank
d{motion}       単語を削除
c{motion}       単語を削除して insert モードへ移行

使い方:

matchit2.vim か matchit2.noesc.vim を ~/.vim/plugin/ か ~/.vim/after/plugin/ に置いて下さい。 vim の次回起動時から、 w e b % * # y d c の各コマンドが日本語対応になります。

既知バグ:

vim と jvim の違いとしては、上記だけでなく下記もありますが、 下記の物は、 m17n とか i18n とか日本語化とかは無関係の vim の仕様なので、 vim オリジナルのまま、いじっていません。

ロケール
        jvim だとロケールは英語のみ。
        vim だとロケールは多言語(i18n)。
        なんか、普通に考えると逆なんではないかと思ってしまうが。

日本語入力
        jvim だと、組み込み onew。
        vim だと、ターミナル依存。
        im が使えない時は vim だと日本語入力ができず痛い。kon とかリモートシェルとか。

$       行末へ移動。
        jvim だと行末の文字の上、vim だと行末の改行記号の上。
        これは、set selection=old でコンパチになる。

v V     ビジュアルモード(領域選択)。
        jvim だと V で選択モードに入っても v で選択モードの解除になる。
        vim だと V で選択モードに入ったら v だと選択モードの変更になる。
        jvim だとビジュアルモード時は行末にスペースが表示されるので、
        空行があっても選択しているか否か判るのだけれど、
        vim だとビジュアルモードだろうがそうでなかろうが、
        set listchars=eol:$ の設定いかんで行末が表示されないので、
        空行があると選択してるのだかいないのだかわからない。

:help   ヘルプ。
        jvim だと help 表示時は操作方法が専用のモードになる。
        vim だと help ファイルの ReadOnly 編集モードになる。

u U ~   大文字小文字変換。
        jvim だと平仮名片仮名変換も行われる。
        vim だと純粋に大文字小文字変換のみ。

あいまい検索
        jvim だと、いわゆる半角文字と全角文字を区別せずに検索できる。
        vim だと無理。
        「aAaA」辺りが、いっしょくたに検索できるかどうかと言う話。

罫線
        jvim だと、罫線描画機能が追加されている。

その3:

SearchComplete2.vim(Mon,10 Nov,2008)(3KiB)

SearchComplete.vim の eregex.vim 用版。 eregex.vim版の検索コマンド / で検索文字列を入力する時に、 タブキーにて文字列補完ができます。

使い方:

SearchComplete2.vim を ~/.vim/plugin/ か ~/.vim/after/plugin/ に置いて下さい。 vim の次回起動時から、有効になります。


その4:

monday.vim(Mon,13 Jan,2009)(8KiB)

Stefan Karlsson 氏原作の インクリメント/デクリメント機能 monday.vim に 「名無しの vim 使い」氏パッチを追加した上に、 拙作デバッグ&機能追加を行った物。

数値だけでなく、 曜日や月名称のインクリメント/デクリメントが出来ます。

拙作改造部分1:  日本語名でもインクリメント/デクリメントが出来ます (月→火、とか、睦月→師走、とか)。

拙作改造部分2:  カーソル位置が単語の先頭とずれていても、正しく処理できます。

使い方:

monday.vim を ~/.vim/plugin/ か ~/.vim/after/plugin/ に置いて下さい。 vim の次回起動時から、有効になります。


その5:

sessionsaver.vim(Fri,29 Jan,2010)(5KiB)

わたなべひろふみ 氏原作の Vimのセッションを自動的に保存/復元(Session Saver)に なんか色々機能追加を行った物。

使い方:

sessionsaver.vim を ~/.vim/plugin/ か ~/.vim/after/plugin/ に置いて下さい。

カレントディレクトリからセッションの復元を行った場合は、 vim 終了時に カレントディレクトリにセッションを保存します。
「カレントディレクトリからセッションの復元を行った場合」以外は、 vim 終了時に 共通のワークエリア(~/.vim/tmp/)にセッションを保存します。

カレントディレクトリにセッションの保存するモードにするには、 vim 上から「:mks! LastSession.vim」を実行し、 それから一旦 vim を終了して
vim --cmd "let g:force_resume_current = 1"
にて vim を起動しなおすと、 カレントディレクトリにセッションを保存するモードに切り変わります。

セッションの復元をするには、
vim --cmd "let g:force_resume_current = 1"
とすると カレントディレクトリからセッションの復元を試み、 駄目なら 共通のワークエリア(~/.vim/tmp/)から復元を行います。
vim --cmd "let g:force_resume_last = 1"
とすると 共通のワークエリア(~/.vim/tmp/)から復元を行います。

実際に使う際には、 上記の vim の起動コマンドを シェルスクリプト等のエイリアスに登録した方が便利でしょう。
それから、 セッションを保存してあるファイル(LastSession.vim)には セッション保存先ディレクトリも記録されているので、 セッションを保存してあるファイル(LastSession.vim)を他のディレクトリに移して 移転先でレジュームを行っても、移転前のディレクトリに セッションを保存してしまいます。   LastSession.vim 内の「cd ほげほげ」の行を消せば、移転もできます。


おまけ1:

cpp.vim(Mon,11 Aug,2008)(4KiB)

filetype cpp の時に、 ラベル行とマクロ行のインデント量を、 vimデフォルトの0から、 直前のインデント量から半コマ戻し、 に変更するスクリプト。

K&R系とか ANSI C FAQ 系だと、 vim デフォルトのインデント量ではなく、 このスクリプトで変更したあとのインデント量だったと思う。

使い方:

cpp.vim を ~/.vim/indent/ か ~/.vim/after/indent/ に置いて下さい。 ~/.vimrc 辺りに filetype indent on を追加すると、有効になります。

既知バグ:


おまけ2:

vim_macro.lzh(Thu,30 Jan,2014)(163KiB)

個人的にお気に入りのスクリプトを丸ごと固めたもの。 拙作のスクリプトや拙作改造版の他、 他の方の製作されたスクリプトや、そのデバッグ版も同梱されています。 原作者や権利関係は、 各ファイルの先頭に書いてありますので、それを見てください。

eregex.vim
        AKUTSU toshiyuki 氏作。
        正規表現を、標準的な拡張正規表現と互換にします。
        拙作改造部分:
        後方検索を追加、再置換を追加、hlsearch が効く様に修正、しています。

keisen.vim
        AKUTSU toshiyuki 氏作。原作のまま。
        罫線を引けます。

mark.vim
        Yuheng Xie 氏作。
        拙作改造部分:
        syntax on 時に、syntax のキーワードと重なる部分が
        マーク表示できなくなっていた点を、表示できる様に修正、
        かわりに正規表現が使えなくなっています。

markjump.vim
        Robert KellyIV 氏作。
        ファイル中にマークを挿入/検索します。
        拙作改造部分:
        セレクトモードの選択をしない様に修正しています。

SessionSaver サスペンド/レジューム機能
        「Just another Ruby porter,」氏原案、
        拙作デバッグ&機能追加。
        既知バグ:
        レジューム時に、
        画面分割モードでは syntax のハイライティングが復帰されません。
        これは vim の仕様もしくはバグと思われます。

showmarks.vim
        Anthony Kruize 氏、Michael Geddes 氏作。
        ジャンプ位置のマークを表示します。
        動作が重いのが難点。
        拙作改造部分:
        起動直後から表示するように修正。

vimspell.vim
        Mathieu Clabaut 氏作。原作のまま。
        綴り間違いを検索できます。但し重いです。

ZoomWin.vim
        Charles Campbell 氏作。原作のまま。
        バッファ分割状態とバッファ全画面表示状態を、
        ショートカットキーで交互に切り替えられます。

SearchComplete2.vim
        Chris Russell 氏作。
        検索コマンドで検索文字列を入力する際に、タブキーで補完ができます。
        拙作改造部分:
        eregex.vim 対応化。

C++ 追加シンタックス
        自作。
        色を好みに変更。
        演算子のハイライティングを追加してみましたが、目茶苦茶重いので封印。

doxygen 追加シンタックス
        自作。
        色を好みに変更しただけです。

C++ 追加インデント
        自作。
        プリプロセッサ指定とラベルのインデントを、半コマ戻しに変更しました。

monday インクリメント/デクリメント機能
        Stefan Karlsson 氏原作、「名無しの vim 使い」氏パッチ、及び拙作デバッグ&機能追加パッチ。
        数値だけでなく、曜日や月名称のインクリメント/デクリメントが出来ます。
        拙作改造部分:
        日本語名でもインクリメント/デクリメントが出来ます
        (月→火、とか、睦月→師走、とか)。

matchit2 日本語対応 移動 検索 機能
        拙作。
        %       対応する括弧の検索
        w       次の単語の先頭へ移動
        e       次の単語の最後尾へ移動
        b       単語の先頭へ移動
        *       カーソル位置の単語を後方検索
        #       カーソル位置の単語を前方検索
        の各機能を、日本語対応にしています。

使い方:

個人用の設定ファイルを丸ごと固めただけなので、 unix系ならば、ホームディレクトリの下に展開するだけです。 既に個人設定をお持ちの方は、必要なファイルを保存してから、作業して下さい。 MS-Windows系は使った事無いので不明。


■ middleman-1.9.1 デバッグパッチ

本ソフトのメンテナンスは打ち切りました。

middleman-1.9.1.patch.bz2(Wed,11 Oct,2006)(2KiB)

middleman-1.9.1.patch2.bz2(Fri,25 May,2007)(3KiB)

middleman-1.9.1.patch4.bz2(Fri,27 Jul,2007)(5KiB)

middleman-1.9.1.patch5.bz2(Wed,28 Nov,2007)(6KiB)

middleman-1.9.1.patch6.bz2(Mon,28 Jan,2008)(7KiB)

web フィルタの Middleman filtering proxy server (別称は middle-man とか mman とか)に、 バグとか不都合とか見つけたので、色々といじってみました。

patch1。 バッファオーバーランして、 スタックを破壊して落ちるバグを見つけてしまったので治しました。

patch1 を適用しても、 ユーザー定義の実行可能型 template 機能にも、 コア吐いて落ちるバグを見つけました。 システム定義 template 機能か ユーザー定義のファイル指定 template 機能 だけを使っていれば平気なので、 気が向くまで治さないと思う。

patch2。 webブラウザからmmanの環境設定をしようとした時に、 mmanのフィルタ名やら何やらに日本語が混じっていると、 webブラウザが文字コードの判定を間違える事があったので、 charset=UTF-8 を明示する様にしてみました。

patch3。 特定のサイトでデータ転送中に転送が切れるバグを治そうとして失敗。 のちの patch5 で、取り敢えずは解消された。

patch4。 SOCKS4a に対応しました。 tor で、privoxy を使わずに mman だけで DNS の匿名化まで行えます。

patch5。 サーバが返す text/html の中に NUL(\0) 終端文字が混じっていると、 終端文字以降に rewrite ルールが適用されないバグがあったので治した。 サーバが応答を Transfer-encoding: chunked で返した時に、 rewrite ルールが適用されると、 チャンクサイズがでたらめになる(再計算していない)バグを見つけたものの、 チャンクサイズの再計算を正しく行う様にデバッグしている余裕が無いので、 chunked で応答が来ない様に HTTP/1.0 に変更。 patch4 の内容が、OpenBSD 非対応だったので、OpenBSD 対応に修正。

patch6。 本来の URL に .. が混じっていた時に、 mman が特殊コマンドとみなして処理してしまうバグと言うか仕様と言うかがあり、 NaviTime 辺りで派手にこけていた。 ので、 ピリオドが3個以上続いた場合か、 ピリオドの前の文字列が特殊コマンド名と一致しない場合は、 スルーする様に修正した。 真っ当に考えると、 環境設定に特殊コマンドを無視する URL を記述できる様にすべきだろうが、 その仕様変更の作業量を考えると、 mman をフルスクラッチで書き治した方が良い気がしてくるので、 付け焼き刃で対応……。

ついでに拙作 mman 環境設定


■ OpenBSD 4.0〜4.2〜 の syslogd 改造パッチ

本ソフトのメンテナンスは打ち切りました。

syslogd.patch.gz(1KiB)

OpenBSD 4.0-RELEASE や 4.2-RELEASE の syslogd では、 facility に想定外の物(25以上)が来た時に無視します (どっちかって言うと OpenBSD のバグ……なのか、 OpenBSD の仕様が厳しすぎるのか)。 で、IO-DATA の無線LAN 機器の syslog 機能を使うと、 facility に 26 とか 27 とか 52 とか言う数値を突っ込んで来るので、 ログに記録されません。

その辺を修正するパッチ。


■ OpenBSD 4.4 を YP(NIS) クライアントとして運用した時に getpwent(),getpwnam() にて YP(NIS) の passwdエントリが取得できない場合があるバグを治すパッチ

本ソフトのメンテナンスは打ち切りました。

OpenBSD44.libc.getpwent.patch.gz(1KiB)

OpenBSD 4.4-RELEASE を YP(NIS) のクライアントとして運用する際、 /etc/passwd, /etc/master.passwd にて 「+@netgroup_name」エントリや「+nis_user_name」エントリを使うと、 そのエントリのパースを間違えて、 YP(NIS) からユーザ名を取得できない、多分バグ、があります。

その辺を治すパッチ。   OpenBSD のソースの cvs を見た感じだと、 OpenBSD 4.3 から 4.4 に移行する際の getpwent.c Revision 1.35 にて 重複したコードをまとめた際に、間違えたのだと思う。


■ DNS の bind(named) で REFUSED を返信しない様にする改造パッチ

本ソフトのメンテナンスは打ち切りました。

OpenBSD44.usr.sbin.bind.DontReply_REFUSED.patch(1KiB)

本パッチは、OpenBSD 4.4-RELEASE 同梱の bind 9.4.2-P2 をベースにしています。 本家の bind9 や、別の OS に同梱されている物だと、 微妙にずれているかもしれません。

2008年頃から? 送信元 IP アドレスを偽造して NS . の DNS query を送りつけ、 DDoS を行わせるアタックが大流行している模様です。   それへの対応として、REFUSED パケットすらドロップするパッチです。   副作用として、 正当な query で REFUSED が発生した場合でもドロップしてしまい、 クライアントがタイムアウトするまで待たされた上に、 リトライをかけてくる場合がある問題があります。   REFUSED をドロップまでするのは、 RFC の面から見ても過激すぎる対応だと思います。

BSD Diary Version 0.8091 「パケットドロップするのはデメリットの割りには大したメリットもないんで、 refuse 返した方がいいんでね?」 参照の事。


■ umix 修正パッチ

umix-1.0.2.patch.tar.bz2(1KiB)

CUI で音量を設定するツールの umix ですが、 ioctl するのに符号無しで行うべき所を、 符号有りで処理してしまっているバグ?があります (……、 GNU/Linux の man 見ると「符号有り」って書いてありますが、 /usr/include 見ると「符号無し」になっています)。

その辺を修正するパッチ。


■ XPostitPlus-2.3 I18N 日本語化パッチ

本パッチのメンテナンスは打ち切りました。

XPostitPlus-2.3.i18n.patch2.bz2(4KiB)

後述のバグが治らず、あきらめました。 fusenshi でも使ってください。 なお、fusenshi の標準設定だと、 ネットワーク経由で遠隔からの操作が許可されていますので、 env WITHOUT_NETWORK=yes make した方が良いかと思われます。

XPostitPlus(総本山不明)を、I18N 化するパッチです。 日本語依存の処理は、していないので、多分 I18N。 はっきり言って、車輪の再発明なのだけれども、 以前に I18N 化した方のホームページが消え去っている上に web キャッシュにも残っていないし。

※ FreeBSD ports のパッチと、 fj.sources に流れていた HOSAKA.Eiichi 氏の xim 有効にすると大きさがこける問題の修正パッチも、 同梱しています。

お約束の XtSetLanguageProc() だけでは日本語化できず、 片手間に1週間以上かかって判明したのが、 XtCreatePopupShell() で wmShellWidgetClass しちゃうと xim が通らねぇ、とか言う現象。 topLevelShellWidgetClass なら通ったのだが……。

それから、 明示的に SetArg(XtNfontSet, text_font); SetArg(XtNinternational, True); しないと、 日本語の表示ができなかった辺りもよく判らん。

既知バグ:

再描画が行われなくなったり、コア吐いて落ちる件は、 Xaw のかわりに Xaw3d を使う様にしたら、問題が発生しなくなった。 もう治すの面倒なので治さない。

もっとも、以前、xfig では逆に Xaw3d を使うと落ちて Xaw なら平気、 と言う事があったけれど……。


■ uim のステータスポップアップ改造パッチ

原著作者:uim

uim-1.8.0.patch.time_on_off.bz2(3KiB)(表示/非表示をkinput2風にするパッチと、画面外に表示しない様に修正するパッチ)

uim-1.7.0.patch.time_on_off.bz2(4KiB)(表示/非表示をkinput2風にするパッチと、画面外に表示しない様に修正するパッチ)

uim-1.6.0.patch1.bz2(2KiB)(画面外に表示しない様に修正するパッチ)

uim-1.6.0.patch2.bz2(1KiB)(uim-dict-gtkにてGTK+-2が原因でメモリリークする問題の対処パッチ)

uim-1.5.4.patch2.bz2(3KiB)(patch2 にデバッグ表示を追加した物)

uim-1.3.1.patch1.bz2(2KiB)(表示/非表示をkinput2風にするパッチと、画面外に表示しない様に修正するパッチ)

uim-1.3.1.patch2.bz2(2KiB)(patch1 に、uim-dict-gtkにてGTK+-2が原因でメモリリークする問題の対処を追加した版)

ウィンドウのフォーカスを変えた後に? ステータスウィンドウを表示しようとすると、 ステータスウィンドウが表示されない場合があります。   原因も対処法も不明です。   取り敢えず、マウスを動かしてみたり、 変換させたい文字入力以外のキー入力をすると、 表示が戻ってくるみたいですが。

uim-1.7.0 / uim-1.8.0 用では、 「表示/非表示をkinput2風にするパッチ」は、 同等の機能が本家に取り込まれたにも関わらず、 FreeBSD 8-STABLE/amd64, FreeBSD 10-CURRENT/amd64 では正常に機能しなかった為、 uim-1.3.1用に実装した手法で再実装しています。

uim-1.6.0用では、 「表示/非表示をkinput2風にするパッチ」は、 同等の機能が本家に取り込まれた為削除しました。

uim-1.3.1用のパッチですが、 uim-1.4.1/1.4.2/1.5.0/1.5.3/1.5.4/1.5.5/1.5.6 でも使えました。

kinput2(総本山不明)だと、ステータス表示のポップアップが、 「直接入力時(かな漢字変換無効時)は、常に非表示」、 「かな漢字変換有効時は、常に表示」、 となっています。

オリジナルの uim だと、 ステータス表示のポップアップは、 「(入力モードに関わらず)変化が有った後に指定した秒数だけ表示。 もしくは、(入力モードに関わらず)常に表示」、 となっています。

kinput2 に慣れた身には、uim のステータス表示だと、 現在の入力モードが把握できなくなるか、 ステータス表示が邪魔になるか、 どちらかになってしまい、不便で仕方がありませんでした。

そこで、uim で kinput2 風の表示ができるパッチを作りました。

パッチを当てて再構築して、 uim-candwin-gtk, uim-xim, im-uim.so を新しい物に入れ替えた後、 ~/.uim に

(define bridge-show-input-state? #t)
(define bridge-show-input-state-time-length 0)
(define bridge-show-input-state-time-length-at-off -1)
(define bridge-show-input-state-time-length-at-on 0)

と書いてから uim関連を再起動すると、kinpu2 風になります。

時間指定を 0 にすると常に表示(パッチで追加した機能)、 負にすると常に非表示(パッチで追加した機能)、 正にすると指定した秒数だけ表示(原作版と同じ)、 となっています。

あと、ステータスウィンドウが画面外にはみ出す場合でも、 構わず表示してしまい、見えなくなってしまう事が有ったので、 修正しました。 オリジナルのソースを見ると、 そういう機能を付けた痕跡は有りましたが、 機能していなかったので……。

パッチを見てわかるとおり、なげやりです。 今すぐどうにかしたかったので。


備考: uim-dict-gtk にてメモリリークしているのを発見。 「追加」「編集」「削除」あたりで、 「読み方」「書き方」あたりの widget を表示した時に、 2MiBずつリークしている。

↑ GTK+-2 の問題だった。 しかも、他の GTK+-2 を使ってテキスト入力をするソフト全てで メモリリークする。

解決策1: env GTK_IM_MODULE=xim して xim な input method を使う。

解決策2: GTKネイティブの input module(非 xim な IM)を使う場合は、 helper/dict-main-gtk.c の gtk_main(); の前後で

GtkIMContext* const im_context = gtk_im_multicontext_new();
gtk_im_context_set_client_window( im_context, NULL );
gtk_main();
g_object_unref( im_context );

の様に、 ダミーの input module を読み込みっ放しにする。

patch2 にて、ダミー読み込みっ放しによる解決策を実装した。

もっとも、uim-dict-gtk は普通なら、 数単語、登録なり編集なり編集する毎に終了するから、 大きな問題にはならない気もする。


■ uim-Anthy のキーカスタマイズで大文字と小文字を別のキーとみなすパッチ(Canna+kinput2風)

uim-1.5.0-anthy.scm-capital.patch(3KiB) uim-1.5.x用

uim.conf(97KiB) (Thu,23 Apr,2009) ${HOME}/.uim のサンプル

uim-1.3.1/1.4.1/1.4.2/1.5.0/1.5.3/1.5.4/1.5.5/1.5.6 どれでも使えました。

拙作パッチ anthy-9100h.patch13Bptn20.bz2 以降と併用する場合、 「ANTHY_RECONVERT_DISABLE true」していないと、 思い通りに入力できない場合があります。

拙作パッチ anthy-9100h.patch13Bptn20.bz2 を使用しない場合、 ソースを改造するか、フロントエンドの設定機能にて、 デフォルト設定を ANTHY_RECONVERT_DISABLE にしていないと、 思い通りに入力できない場合があります。

Canna+kinput2 にあった、 「ZA」とタイプすると「A」が、 「Za」とタイプすると「a」が、 入力される機能を、 uim-anthy で実現する為のパッチ。

ついでに、 小文字でタイプすると平仮名、 大文字でタイプすると片仮名、 先頭に「;」を付けてタイプすると片仮名、 と言う設定も追加してみました。 但し、 「ザジズゼゾ」が「AIUEO」と、かぶっているので、 「AIUEO」を「@A @I @U @E @O」に変更しています。

さらに、 「t.」とタイプすると「t」が入力される項目を追加。 これにより、例えば「at.」とタイプして変換すると、 読みが「あt」の変換になり、 vagus氏の alt-cannadic の extra にある、 JIS X 0208 以外の単漢字変換ができます。   なお、バグだか仕様だか知りませんが、 標準の Anthy は EUC-JP-MS のみ対応で、 JIS X 0212/0213 EUC-JP は非対応です。 なので、 JIS X 0212/0213 EUC-JP 対応端末であっても、 EUC モードの Anthy では、これらの追加された文字は処理できません。

anthy.scm だけに適用すると xim だけで、 anthy-utf8.scm だけに適用すると GTK+/Qt だけで、 大文字小文字が区別され、もう一方では区別されない、 と言う、嫌な事態になるので注意。


■ uim-Anthy-1.5.5 で追加された、ひらがな/カタカナ変換の自動学習を無効にするパッチ

uim-1.5.5-anthy.scm-dontlearnkana.patch(1KiB) uim-1.5.5用

uim-Anthy-1.5.5 から、 ひらがな/カタカナ変換を行った時に、 変換した内容を学習する機能が追加になっていました。

ただ、この機能、 「学習させたい時は漢字変換で、 学習させたくない時はひらがな/カタカナ変換で」 と言う「使い分け」をしている人にとっては、 はっきり言うと邪魔な機能です。

本パッチは、ひらがな/カタカナ変換をした時の学習を無効にするパッチです。

もっとも、このパッチが役に立つ人がそうそういるとは思えませんが。


■ uim-canna-utf8 uim-canna で EUC-JP JIS X 0201 や EUC-JP JIS X 0212 を使える様にするパッチ

uim-1.8.6.canna-utf8.patch.bz2(17KiB) uim-1.8.6用

元々の uim-canna は EUC-JP JIS X 0208 のみ使えますが、 本パッチを適用すると ASCII や EUC-JP JIS X 0201 や EUC-JP JIS X 0212 も 使える様になります。

Canna自体およびかんなプロトコルは いつの頃からかは忘れましたが ASCII や EUC-JP JIS X 0201 や EUC-JP JIS X 0212 も 使える様になっていますので、 Canna側の改造は不要です。


■ uim-canna-utf16 uim-canna でかんなプロトコルに UTF-16BE をねじ込むパッチ

uim-1.8.6.canna-utf16.patch.bz2(17KiB) uim-1.8.6用

uim-canna にて、 かんなプロトコルをしゃべる際に SVR3.2 JAE プロセスコードの代わりに UTF-16BE を使うパッチです。

これで かんなプロトコル採用エンジンでも Unicode が使える様になりますが、 なにぶん、UTF-16BE を解するかな漢字変換エンジンが無い為、 何の役にも立ちません。


■ かな漢字変換 anthy で、個人用学習データを活用して変換結果の改善を目指すパッチ Since Sun,02 Sep,2007

概要:

オリジナルのままの 「かな漢字変換 anthy」 は 個人用の学習データの上限がとても少なく設定されており、 文書のタイプをしていると 数時間前の学習内容が上限量超過で消え去ってしまいます。

世間で Anthy が「学習しなくて馬鹿だ」といわれるのは、 主にはこの設定の為です。

「学習しない」辺りを改善して、 「学習する様に」して「学習した内容であれば」変換結果を多少は良くしよう というパッチです。

……最初のうちは↑なパッチだったのですが、 patch13 に至った所で、 変換結果関係無く何でもかんでも思い付いた機能は実装して試してみる パッチになっていました。

使用上の注意:

備考: あくまで私個人の憶測になりますが、 オリジナルの Anthy の場合、 古いPCやサブノートのような小型低速小容量のPCでも 軽快に動く事を目指していると思われる発言が見受けられますので、 もしかしたら故意に少なくしているのかもしれません。 憶測の根拠: 「http://slashdot.jp/~tabatee/journal/407854 anthyの速度 - tabatee の日記」 あくまで憶測ですからね。 あと、 組込系へも移植できる様にしたい、 と言う感じの発言も見かけた様な気が。

パッチの全般的な概要:

パッチのライセンス:

patch8 以降は、LGPL と3条項 BSDライセンスの混合となります。
その為、ソース再配布・バイナリ再配布とわず、 再配布の際には、同梱するドキュメント等で 「OpenBSD の libc のソースコードの一部を同梱及び利用している」 旨を明示する義務が有ります (「libc のソースコードの一部」の部分は、 具体的に「strlcpy(),strlcat(),mergesort() のソースコード」 でも可)。 なお、3条項 BSDライセンスなので、 明示する義務は有りますが、広告する義務は有りません。

alt-depgraph 同梱版は、 2012年3月辺りから GPL の辞書と CC BY-SA 2.1 の辞書の両方が含まれています。 GNUライセンスで再配布されている方は ライセンス違反になる可能性が有りますのでご注意下さい。
CC が混じるとまずい方は、単漢字辞書を無効に (mkworddic/dict.args.in および alt-cannadic/extra/Makefile.am から gt-kanji- を含む行を削除) して下さい。


パッチの入手:


Anthy関連の情報があるサイト:


■ かな漢字変換 anthy の付属語グラフを検索/表示する

depgraphdump.cc(55KiB) Sat,16 May,2009

かな漢字変換 Anthy にて、例えば、
「|直すの|」(|なおすの|)の付属語は、 付属語グラフの、どの部分に該当するのだろう、
とか、
付属語が「すの」で終わる物には、どんな品詞が有るだろう、
と言った事を調べる為のソフト。

↑ の例だと、 「anthy-9100h + patch13Bptn23 + alt-depgraph-090506 + 2009年05月16日パッチ」 の場合、

% egrep "^なお " alt-cannadic/gcanna.ctd
なお #F14*400 なお 尚 #R5*301 治 #S5*301 直 #CJ*300 なお 尚 #R5*300 直 #S5*300 なお 治 #CJ*200 猶 #F14*200 猶 #R5*200 なお #JN*151 なお 直 #JN*150 尚 奈緒 #JN*100 奈央 奈穂 #JN*50 奈保
% grep -w "S5" src-worddic/wtab.h
{"#S5",POS_V,COS_NONE,SCOS_NONE,CC_S5,CT_HEAD,WF_INDEP    /* "サ行五段"*/},
% cat src-worddic/ptab.h | grep -w POS_V | grep -w CC_S5 | grep -w CT_HEAD
{"サ行5段活用動詞語幹",POS_V,COS_NONE,SCOS_NONE,CC_S5,CT_HEAD,WF_INDEP},
% depgraphdump -n "サ行5段活用動詞語幹" -w "すの" -e
End: サ行5段活用動詞語幹|すの H SzC  :0.0  @_サ行5段語幹後 "" @サ行5段終止形 "す" @_5段終止形(共通) "" @「の」終助 "の" Sz@
End: サ行5段活用動詞語幹|すの HnSeC  :0.0  @_サ行5段語幹後 "" @サ行5段連体形 "す" @_5段連体形(共通) "" Hn@「の」格助(準体) "の" Se@

とか

% depgraphdump -w "すの" -e -r
End: サ行5段活用動詞語幹|すの HnSeC  :0.0 @_サ行5段語幹後 "" @サ行5段連体形 "す" @_5段連体形(共通) "" Hn@「の」格助(準体) "の" Se@
End: サ行5段活用動詞語幹|すの H SzC  :0.0 @_サ行5段語幹後 "" @サ行5段終止形 "す" @_5段終止形(共通) "" @「の」終助 "の" Sz@

とかします。
なお、品詞から先頭ノード名を探す部分は、現在は完全手動です。 また、上記の先頭ノード名を探す方法は不完全で、 検索漏れが発生する可能性が有ります。


■ xmcd-3.3.2 で CDDB に送信できないバグ修正

本パッチのメンテナンスは打ち切りました。

xmcd-3.3.2.fbsd_ports.6.patch1.bz2(2KiB)

xmcd-3.3.2 で CDDB に送信しようとした時に、 Disc Note とか Track Note 辺りの任意記入の欄を未記入にすると、 NULL ポインタの指す先にアクセスして SIGSEGV で落ちるバグが有ったので、 治しました。

ついでに、 利用する CDDB を cddb.com から freedbtest.dyndns.org に 変更しました。

でも xmcd は日本語データベース非対応です。 無理矢理に日本語を通すと、滅茶苦茶なデータにしてくれます。 素直に grip とか easytag とか使った方が良いと思う。


■ fusenshi-0.9.0 が GTK+-2 側の原因でメモリリークする問題への対処

fusenshi-0.9.0.patch1.bz2(1KiB)

fusenshi を、 GTKネイティブの input module と共に使っている場合、 付箋紙が1枚も無い状態から付箋紙を作成すると、 GTK+-2 側の IM が原因で、 毎回 2MiB ずつくらいメモリリークします。

この問題を、fusenshi 側で強引に何とかするパッチ。

このパッチを使わなくても、 使用している入力モジュールが XIM対応ならば (例えば uim の場合、uim-xim を使う)、 GTK_IM_MODULE=xim して xim な input module を使えば、 メモリーリークしなくなります。

ちなみにこの問題、 GTK+-2 で GTKネイティブの IM を使っているアプリケーションは、 全て発症します。

GTK側の問題なので、fusenshi の本家に連絡するか否か、 迷う所なんだよなぁ……。


■ libusb の活線挿抜対応のバグ修正パッチ

本ソフトのメンテナンスは打ち切りました。

libusb-0.1.12.patch.bz2(2KiB)

libusb-0.1.12 には、 既に接続している USB デバイスがある時に 再度 USB デバイスの検索を行うと、 接続済みの USB の管理テーブルを破壊する バグもしくは仕様があります。

libftdi の ftdi_usb_open() を使うと、 必ずこれを引き当てて、USBデバイスとの接続を破壊してくれます。

# ftdi_usb_open() でエラーが返ってきた場合、 既に ftdi_usb_open() に成功していた他のデバイスの管理テーブルは全て、 破壊されています。

それを修正するパッチ。FreeBSD と GNU/Linux用。 Mac OS X 用は計算機が無いため作っていません(作れません)。

それから、GNU/Linux用 libusb の場合、 usb_open() すると、オープンに成功しようが失敗しようが、 常に成功を返すという痛いバグがありますが、それも修正しています。


■ libftdi の仕様修正パッチ

本ソフトのメンテナンスは打ち切りました。

libftdi-0.10.patch.bz2(1KiB)

libftdi は、 FTDI なデバイスを複数台接続していた場合に ftdi_usb_open() を複数回実行した時の挙動が、 BSD系と GNU/Linuxで異なっています。

FreeBSD の場合、

  struct ftdi_context ftdic[n];
  for (int i = 0; i < n; i++) {
    ftdi_init( &(ftdic[i]) );
    ftdi_usb_open( &(ftdic[i]), 0x0403, 0x6001 );
  }

の様にすると、ftdic[0] 〜 ftdic[n] は、 1台目、2台目、……n台目のデバイスと接続されます。

ところが GNU/Linux の場合、全く同じソースであるにも関わらず、 ftdic[0] 〜 ftdic[n] は全て1台目のデバイスと接続され、 しかも ftdic[0] 〜 ftdic[n-1] は壊れた状態になります。

このパッチは、GNU/Linux でも FreeBSD と同じ動作に修正します。 まぁ libftdi の説明書やソースのコメントを読む限りでは、 「ftdi_usb_open() は先頭のデバイスと接続します」って 書いてあるのだけれどね。 「先頭のデバイス」って、 「未接続の先頭」(FreeBSDの挙動)なのか 「接続・未接続問わず、先頭」(GNU/Linuxの挙動)なのか、 どっちなのだろう?

なお本パッチを利用する場合は、 libusb の活線挿抜対応のバグ修正パッチ も 適用する必要があります。

また、本パッチを適用していても、 BSD系では若番から順番に接続され、 GNU/Linuxでは老番から順番に接続されます。

例:

USBバス番号     バス内での機器番号      FreeBSDの場合   GNU/Linuxの場合 本パッチ適用前のGNU/Linux
1               2                       優先順位1       優先順位8       接続されない
1               3                       優先順位2       優先順位7       接続されない
2               2                       優先順位3       優先順位6       接続されない
2               3                       優先順位4       優先順位5       接続されない
3               2                       優先順位5       優先順位4       接続されない
3               3                       優先順位6       優先順位3       接続されない
4               2                       優先順位7       優先順位2       接続されない
4               3                       優先順位8       優先順位1       これのみと接続される

バス内での機器番号の1は、ルートハブに割り当てられる。

■ GNU/Linux な glibc に FreeBSD な MALLOC_OPTIONS を付けてみるパッチ

本ソフトのメンテナンスは打ち切りました。

代替? jemalloc の opt.junk 使えばいいんでね?

glibc-2.3.2.ds1.patch_malloc_conf.lzh(11KiB)

BSD系の malloc()/new/new[]/realloc()/free()/delete/delete[] では、 環境変数 MALLOC_OPTIONS か シンボリックリンクファイル /etc/malloc.conf か グローバル変数 char* _malloc_options で J を指定すると、 確保したメモリや解放したメモリが 0xD0 でゼロクリア (ゼロじゃないけど)されます。 (解放したメモリが消去されるのは、 2008年6月時点では FreeBSD のみ…… NetBSD はどうだっけ?)

これにより、 渡されるメモリが 0x00 で初期化してある事を想定しているバグや、 解放したメモリに再度アクセスするバグを、 発見し易くなります。 (その手のツールは、 valgrind とか ElectricFence とか mpatrol とか ccmalloc とか leaktracer とか、 色々ありますが、0x00 で初期化してある事を想定しているバグを みつける機能は、どれにも無かったかと思います)

また、確保したメモリを一旦塗りつぶす為、 Linux Memory Overcommit の問題が起きにくくなります。たぶん。

あとはまぁ、 作業領域を初期化せずに使って、 そのままデータファイルとして出力する様なプログラムにおいても、 データの空き領域が単一のデータで埋まってくれるので、 データを保存する時の圧縮効率が大幅に上がる場合があります……、 そういう事はそのプログラムがちゃんと処理すべき事なので、 この効果は期待すべきではないのですけれども。

しかしながら、GNU/Linux の GNU libc にはその機能はありません。 なので、その機能を付けるパッチを作ってみました。

なお、本パッチでは、引数が BSD系非互換の独自仕様になっています。

で、さっそく。 glibc の calloc() が、 malloc() されたメモリが chunk_is_mmapped() なら 0x00 でクリアされている事を前提にしている仕様を発見。 glibc内から glibc内の malloc() を使っているケースだから、 malloc() したメモリがゼロクリアされている事を前提にしても、 問題ではなく「正当な」仕様ですが。

さらに、 glibc の calloc() が、 malloc() で得たメモリが !chunk_is_mmapped() でも (sbrk で割り当てられた場合でも)、 それが今回の malloc() で拡張された領域ならば、 0x00 でクリアされている事を前提にしている仕様を発見。 brk() のメモリがゼロクリアされる事って保障されていたっけ?

本パッチでは、上記の2件両方共対応しています。


■ Logitech(Creative Labs) もしくは OEM(BUFFLAO とかバッファローコクヨサプライとか)のマウスにて、AC_PAN(HUC_AC_PAN) なチルトホイールを FreeBSD 6.4 で使える様にするパッチ

acpan_mouse.freebsd64.diff(5KiB)(Mon,03 Aug,2009)

Logitech(Creative Labs) のチルトホイール付きマウスに、 ホイールをチルトしても何も起きないし、 xev で確認しても何も起きていないタイプが、 存在します。
# 手元に有るものだと、 バッファローコクヨサプライ(OEM:Logitech(Creative Labs)) BSMOU02YM(WH)。

これは、 一般的なマウスではホイールチルトが第4・5ボタン もしくは第6・7ボタンに割り当てられているのに対して、 これらのマウスではチルトが Consumer: AC Pan と言う 全然別のイベント?に割り当てられており、 マウスドライバが対応していない為です。

本パッチは、 この AC Pan イベント?をボタン操作として認識させるパッチです。

使い方:
% cd /usr/src/sys/dev/usb
% patch -p6 -N < acpan_mouse.freebsd64.diff
あとは、通常のカーネル再構築と同様。
patch実行時は、必要に応じて適宜 sudo を付けて下さい。

備考:
本マウスでは、

となっていた。 なので、拙作パッチ側で、「離した」イベントを捏造している。


■ ホイールチルト操作をすると勝手に中ボタンクリックイベントが発生してしまうマウスにて、ホイールチルト操作を優先させる FreeBSD 6.4-RELEASE/8-STABLE用パッチ

acpan_mouse.make_button_delay.freebsd64.diff(5KiB)(Wed,16 Dec,2009)

acpan_mouse.make_button_delay.freebsd8s.diff(3KiB)(Tue,26 Jul,2011)

一部のチルトホイール付きマウスにて、 特定のアプリケーションでホイールチルト(第6/7ボタン)が 使えない事があります。
# 手元に有るものだと、 Firefox3/3.5 にて、 アクロス AMS-SS/SW/SB(中身は Ione Lynx-R9 Gaming Mouse1600 らしい)の、 ホイールチルトが無視されます。

これは、 ホイールチルトを操作すると マウスが勝手に第2ボタン同時クリックの情報を送ってきてしまい、 その為に、アプリケーションが 「第2ボタンの操作中なのでそれ以外のボタン操作を無視」 と言う処理をしてしまう為です。

本パッチは、 第1〜3ボタンと第4以降ボタンの同時クリック情報が送られてきた時に、 先に第4以降ボタンのクリックイベントのみを発生させ、 直後に第1〜3ボタンのクリックイベントのみを発生させる事で、 ホイールチルトを効かせるパッチです。
# 副作用として、 「第4以降ボタンの操作中なので第1〜3ボタン操作を無視」 と言う事が発生する場合があります。


■ FreeBSD loader から拡張パーティションにインストールした FreeBSD を読み込める様にするパッチ

本家 FreeBSD 10-CURRENT 2012/08/?? にて、 同等の機能が実装されていました。
本パッチは不要になりましたので削除します。

loader.dosext.freebsd8.patch(3KiB)(Thu,28 Jul,2011)

loader.dosext.freebsd10C_2012319.patch(3KiB)(Thu,29 Mar,2012)

FreeBSD loader が、 拡張パーティションにインストールした FreeBSD を 読み込める様にするパッチです。
別途、 拡張パーティションにインストールした FreeBSD loader を 読み込む手段が必要です。 例えば GRUB2(要 insmod ufs2)。

[FreeBSD-users-jp 91326] (桂島@横浜 氏、Tue, 1 Jan 2008) の loader 改造パッチ(05:DOS Extend(CHS) のみ対応)を元に、 0F:DOS ExtendedX(LBA) にも対応する様に追加改造したものです。


■ Petname Tool for Firefox3 with checking the CA

本ソフトのメンテナンスは打ち切りました。


Firefox Add-on の Petname Tool が Firefox3 に未対応なので、 自前で Firefox3 に対応させてみました。 (Mon,20 Oct,2008、 Firefox3版 petname_tool が公開されている事を確認したので修正) の Firefox3版がサーバ証明書の一致検査をしない仕様に変更されたので、 Firefox2版 petname_tool と同様にサーバ証明書の一致検査を行う様に 改造してみました。 Petname Tool とは何ぞや、と言う話は 高木浩光@自宅の日記 2007年09月30日 フィッシング回避補助ツール「petname tool」 あたりを参照されたし。

注意: Petname Tool は、 「HTTPS で接続したサーバ(が提示した証明書)が、 事前に登録したサーバ(の証明書)と同じものであるかどうか」 を確認する手助けとなる能力しかありません。 接続したサーバもしくは通信路が安全だったり信用できるかとか、 閲覧している内容が信用できるかとか、 そういった事を確認する能力はありません。

原作版から拙作Firefox3用版に移行する際には、 登録データの変換を行う必要があります(手作業)。 Firefox2 にて(あるいはテキストエディタで bookmarks.html を編集して)、 description の項目を keyword(ShortcutURL) にコピーしてから ブックマークのインポートを行なって下さい、 あるいはブックマークの Import を行ってから Firefox3 にて description の項目を keyword にコピーしても構いません。 Firefox3 から Firefox2 に移行する場合は、 ブックマークの Export をすれば、そのまま使えると思います。

mod1版の登録データは mod3版でも使えますが、 mod3版の登録データは mod1版では使えません。

Javascript の書き方をまともに勉強した事など無く、 勢いと思いつきとノリだけで、 原作版のソースと mozilla.org のリファレンスマニュアルとサンプルと Add-ons のソースを 見ながら継ぎはぎして作ったので、 バグが無いかとか安定して動くかとかセキュアかとか高速かとか、 その辺は知りません。 自分で使う際に困らない程度に動作確認してはいますが。

既知バグ:

オリジナルと仕様が変わった箇所:

内部情報的な話:

蛇足その1: Firefox3 で SSL通信時に ロケーションバー? URLバー?の色を変えたい場合は (Firefox2 だと変わる)、 以下を chrome/userChrome.css か stylish Add-on に追加する。 以下の設定だと、 真っ当な SSL だとクリーム色に、 強度が低いと黄色に(見た事無いけれど)、 アヤシイ SSL(見た事無いけれど)もしくは未確認だと赤色に、 なる筈。

#urlbar[level][pageproxystate],
#urlbar[level][pageproxystate],
#urlbar[level][pageproxystate] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level][pageproxystate] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level][pageproxystate] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar),
#urlbar[level][pageproxystate] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar) {
  color: #000000 !important;
  background: #F5BEBE !important;
}

#urlbar[level="high"][pageproxystate="valid"],
#urlbar[level="high"][pageproxystate="valid"],
#urlbar[level="high"][pageproxystate="valid"] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level="high"][pageproxystate="valid"] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level="high"][pageproxystate="valid"] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar),
#urlbar[level="high"][pageproxystate="valid"] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar) {
  color: #000000 !important;
  background: #F5F6BE !important;
}

#urlbar[level="low"][pageproxystate="valid"],
#urlbar[level="low"][pageproxystate="valid"],
#urlbar[level="low"][pageproxystate="valid"] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level="low"][pageproxystate="valid"] > :not(#identity-box):not(#urlbar-icons),
#urlbar[level="low"][pageproxystate="valid"] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar),
#urlbar[level="low"][pageproxystate="valid"] > :not(#identity-box)>:not(dropmarker):not(progressmeter):not(.progress-bar) {
  color: #000000 !important;
  background: #F5F600 !important;
}

蛇足その2: 中間証明書がころころ変わって、 Petname の mod2版もしくは mod3版で別の証明書と判定されてしまう件。 結論から言うと、中間証明書のシリアル番号が何パターンか出回っているらしい。 中間証明書を手元のブラウザに入れてシリアル番号を固定してしまえば、 常に同じと判定されるのだけれども、それもどうかと思うし……、 そこまでするなら、Petname Tool 使わなくても、 サーバ証明書を全部ローカルに登録してしまえば。

根:これはローカルの計算機で固定されているので変わらない。
74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2
; Class 3 Public Primary Certification Authority; "VeriSign, Inc."

パターン1:www.verisign.co.jp
29:B7:3D:9F:75:01:B8:C0:AD:FD:5E:43:37:A3:90:D1:AD:20:5F:48
VeriSign Class 3 Public Primary Certification Authority - G5; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:57:BF:FB:03:FB:2C:46:D4:E1:9E:CE:E0:D7:43:7F:13
        Date:2006/11/08 09:00:00,2021/11/08 08:59:59
B1:80:39:89:98:31:F1:52:61:46:67:CF:23:FF:CE:A2:B0:E7:3D:AB
VeriSign Class 3 Extended Validation SSL SGC CA; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:2C:48:DD:93:0D:F5:59:8E:F9:3C:99:54:7A:60:ED:43
        Date:2006/11/08 09:00:00,2016/11/08 08:59:59
        X.500 Name: CN = Class3CA2048-1-48

パターン2:seal.verisign.com
87:50:7F:E5:19:BD:E7:A1:19:AE:A3:2F:77:9D:76:30:5D:7A:69:13
VeriSign Class 3 Public Primary Certification Authority - G5; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:58:F3:9E:5C:01:2B:19:47:21:A9:8E:E4:EE:E0:F8:BF
        Date:2006/11/08 09:00:00,2021/11/08 08:59:59
4A:8A:2A:0E:27:6F:F3:3B:5D:D8:8A:36:21:46:01:0F:2A:8B:6A:EE
VeriSign Class 3 Extended Validation SSL SGC CA; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:11:2A:00:6D:37:E5:10:6F:D6:CA:7C:C3:EF:BA:CC:18
        Date:2006/11/08 09:00:00,2016/11/08 08:59:59
        X.500 Name: CN = Class3CA2048-1-48

パターン3:www.verisign.com
7E:7E:02:6F:71:BF:E7:BB:C7:E7:E5:C5:91:B1:91:5C:B6:68:4E:6C
VeriSign Class 3 Public Primary Certification Authority - G5; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:63:92:6B:8A:8F:40:82:FD:AC:C0:3B:D3:78:29:A6:C0
        Date:2006/11/08 09:00:00,2021/11/08 08:59:59
4A:8A:2A:0E:27:6F:F3:3B:5D:D8:8A:36:21:46:01:0F:2A:8B:6A:EE
VeriSign Class 3 Extended Validation SSL SGC CA; VeriSign Trust Network; "VeriSign, Inc."
        Version:3
        Serial:11:2A:00:6D:37:E5:10:6F:D6:CA:7C:C3:EF:BA:CC:18
        Date:2006/11/08 09:00:00,2016/11/08 08:59:59
        X.500 Name: CN = Class3CA2048-1-48


■ Cookie Button for Firefox3

cookiebutton0.9.3.mod.xpi(48KiB) Sat,26 Feb,2011

Firefox Add-on の cookie button の、禁止/許可/永続許可(?)のアイコン表示が小さすぎて見にくいので、 見やすくなるようにアイコンを描きなおしてみました。   それだけ。


■ 正規表現でファイル比較

diffregex.cc Sat,18 Oct,2008 (3KiB)

正規表現でファイル比較をします。

第1引数に中身が正規表現のプレーンテキストのファイルを指定し、 第2引数にプレーンテキストのファイルを指定します。

普通の diff と違い、出現順序は不問です (正規表現だとソートができないから)。


■ 工画堂スタジオの lpg画像を PNG画像に変換

lpg2png.cc Sun,04 Jan,2009 (16KiB)

工画堂スタジオの 「BB TwinPack」 「ブルーフロウ」 「ブルーフロウ ファンディスク」 「ブルーブラスター」 「ブルーブラスター ファンディスク」 で使われている画像形式の lpg画像を、 png形式に変換します。 聞くところによると、「羅刹 弐」も同じ形式らしいです。

BB TwinPack BF パートの「凄い難しい」レベルで全クリした後に 工画乃郷をのぞいてみたら、 エンディング絵が2パターンあるとか書いてあって、 もう1周する気力が無かったので、勢いで作った。

バグではなくて仕様です: lpg形式では、 256色インデックスカラー + 8bitアルファ値、 と言う形式があるみたいですが、 PNG形式で多階調アルファを持てるのは 24bitカラー + 8bitアルファ のモードだけです。 なので、インデックスカラーから24bitカラーへ勝手に変換します。


■ fontforge にて JIS X 0212, JIS X 0213-1, JIS X 0213-2 フォントと ISO-10646(UCS/Unicode) フォントを相互変換する為のプラグイン

fontforge_plugin_jisx0212_jisx0213.c Fri,08 Oct,2010 (14KiB)

フォントエディタ fontforge にて、 JIS X 0212, 0213-1, 0213-2 などのフォントを、 UCS/Unicode フォントに変換できる様にするプラグインです。

インストールの仕方:
fontforge のソースを展開する。
上記 fontforge_plugin_jisx0212_jisx0213.c を fontforge のソースを展開したディレクトリの plugins/ ディレクトリに 入れる。
plugins/ ディレクトリにて、 make ./.libs/fontforge_plugin_jisx0212_jisx0213.la する。
出来上がった .libs/fontforge_plugin_jisx0212_jisx0213.* を、 fontforge をインストールした先の share/fontforge/plugins/ ディレクトリにコピーする。

追記:
OSの種類によっては、上記手法では駄目な場合があります。 その場合は、 「LPCTSTR氏 - リククーブログ - FontForgeでJIS X 0213を使えるようにする」 に書かれている、Makefile* を書き換える方法を用いて下さい。
というよりもむしろ Makefile* を書き換える方法の方が真っ当な方法ですが。

使い方:
K14 や jisksp16 などの、 JIS X 0212/0213-1/0213-2 フォントの編集を開始する。
「エンコーディング」→「エンコーディングを強制」のメニューから、 「JISX0212」か「JISX0213-1」か「JISX0213-2」の適切な物を選ぶ。
「エンコーディング」→「エンコーディングを変換」のメニューから、 「ISO10646(BMP)」や「ISO10646(Full)」などの、変換したい先を選ぶ。
終わり。


■ SVN::Web を日本語対応にするパッチ

SVN-Web-0.53.Jcode.diff Sun,22 Aug,2010 (4KiB)

subversion リポジトリを web から閲覧する為のソフト (perl) SVN::Web を、日本語対応にするパッチです。   別途 Jcode.pm が必要です。

原作版の SVN::Web だと、 I18N対応と言っておきながら、その実は UTF-8 のみの対応で、 ISO-2022 とか EUC とか ShiftJIS/CP932 とかのファイルがあると、 盛大に文字化けします。

本パッチを使用すると、 svn:mime-type にて charset の記述が有る場合は 入力文字コードを charset で指定された文字コードとみなして処理し、 無い場合は Jcode.pm にて自動判別を行います。

このパッチとは無関係に、原作版の SVN::Web を subversion-1.6系で使うと、

svn: In file 'subversion/libsvn_ra/deprecated.c' line 289: assertion failed (*path != '/')
svn: In file 'subversion/libsvn_ra/libsvn_ra.c' line 759: assertion failed (*path != '/')
svn: In file 'subversion/libsvn_ra/libsvn_ra.c' line 783: assertion failed (*path != '/')

とエラーを出しまくり、まともに動いてくれません。
結局、どうにもならなくて、svn側のソースをいじって、 このエラーで abort() している行をコメントアウトして使っていますが。
どうも、 書式で / を付加するか否かが、変わったか厳密化したか、したっぽいですが。

あと、これも本パッチとは無関係ですが、 SVN::Web は Fast::CGI だか FCGI だかも使っている様な気がするのですが、 依存関係が記述されていなくて自動インストールされない様な気がする。


■ TkCvs を日本語ロケール対応にするパッチ

tkcvs_8_1.locale_patch.bz2 Thu,03 Sep,2009 (2KiB) TkCvs-8.1用 日本語ロケール対応にするパッチ

tkcvs_8_2.locale_patch.bz2 Thu,03 Sep,2009 (2KiB) TkCvs-8.2用 日本語ロケール対応にするパッチ(OpenBSD非対応)

tkcvs_8_2.locale_patch2.bz2 Thu,03 Sep,2009 (6KiB) TkCvs-8.2用 日本語ロケール対応にするパッチ(OpenBSD対応)

tkcvs_8_2.font_patch.bz2 Thu,03 Sep,2009 (2KiB) TkCvs-8.2用 フォントを変更可能にするパッチ

tkcvs_bitmaps.lzh Thu,03 Sep,2009 (2KiB) おまけ:改造アイコン

subversion リポジトリを GUI で閲覧・操作する為のソフト TkCvs を、日本語ロケール対応にするパッチです。

原作版の TkCvs だと、 svn と通信をする際に、svn が英語で応答する前提で作られています。   しかしながら、日本語ロケール上で TkCvs を使用すると、 svn も日本語で応答してしまいます。   その為、TkCvs が svn と通信できなくなってしまいます。
だからと言って、TkCvs を英語ロケールにて動かすと、 svn との通信はうまく行く様になりますが、 今度は TkCvs のログビューワやファイルビューワやテキストエディタにて 日本語の閲覧・操作ができなくなってしまいます。
では、svn を「env LC_ALL=C svn」にすると。   TkCvs の内蔵ビューワーも通信もうまく行きますが、 今度は普段コマンドラインから svn を使う時にも ロケールが英語固定になってしまいます。
ぶっちゃけて言うと、 env LC_MESSAGES=C tkcvs でも良いのかも知れませんが。
本パッチでは、 TkCvs が svn と通信する時だけ、ロケールを英語に変更しています。
備考:
なので、日本語ロケール以外、 例えば中国語ロケールだとかロシア語ロケールだとか、 でも、正しく動作する様になると思います。 試していませんが。

フォントを変更可能にするパッチを適用した後、 ${HOME}/.tkcvs に

set cvscfg(guifont) "-*-fixed-medium-r-normal--14-*"
set cvscfg(browserfont) "-*-fixed-medium-r-normal--14-*"
set cvscfg(listboxfont) "-*-fixed-medium-r-normal--14-*"
set cvscfg(flashfont) "-*-fixed-bold-r-normal--14-*"
set cvscfg(dialogfont) "-*-fixed-medium-r-normal--14-*"

等と記述すると、フォントが変更できます。
guifont がメニュー等のフォント?(これのみ原作版でも変更可能)、 browserfont がログや Annotate/Blame ブラウザや Graphical Branch Diagram のログブラウザ等で使用するフォント、 listboxfont がファイラー等で使用するフォント、 flashfont がファイラー等でハイライト・選択された時に使用するフォント、 dialogfont がダイアログボックス等で使用するフォント、 です。

おまけの改造アイコンは、 原作版のアイコンだと、 変更ファイルと通常フォルダのアイコンの色調が似ていて区別しにくいとか、 追加アイコンと削除アイコンと不明ファイルアイコンの 色調が似ていて区別しにくいとか、 だったので、 違いが派手になる様に色を変更してみた物。


■ xshisen-1.51 のバグ修正パッチ

xshisen-1.51.patch Wed,02 Dec,2009 (1KiB)

ええと、開発元ページは消えてしまった模様です。

未初期化のポインタを delete してしまうミスの修正。

たぶん、 「M.H Plamo Linux Home Page 0901 - 2009年その1」 の、「xshisen 関連のパッチ」の 3番と同じ内容ではないかと思われますが。 現時点ではアクセス出来ない為、確認できません。


■ mlterm 改造パッチ

多言語対応ターミナル mlterm用の改造パッチです。

mlterm-3.3.2.cjk_word_separate_patch Sun,02 Feb,2014 (6KiB)
mlterm-2.9.4.cjk_word_separate_patch Thu,24 Dec,2009 (6KiB)
マウスのダブルクリック等での単語選択の際に、 日中韓/英数/記号/ギリシャ文字/キリル文字/ドイツ語/等の 文字種が変わった所を単語の区切りとみなすパッチ。
標準の機能の word_separators とは別個に機能します。
mlterm-3.0.1 / 3.1.0 / 3.1.3 / 3.1.8 でもそのまま使えました。

mlterm-3.1.8.underline Sun,12 May,2013 (1KiB)
mlterm-3.1.0.underline Wed,09 May,2012 (2KiB)
mlterm-3.0.1.underline Thu,07 Oct,2010 (2KiB)
アンダーラインの表示位置を kterm と同じ位置に変更するパッチ。


■ tomoe SIGSEGV修正パッチ

手書き文字認識エンジン tomoe の修正パッチです。

tomoe-0.6.0.patch Wed,08 Dec,2010 (1KiB)
tomoe-0.6.0 〜 tomoe-trunk(r1629 Wed Mar 18 2009) を gtk-2.2? 辺りのバージョンで使うと、 最初の1画目を書いた時点でいきなり Segmentation fault を出して 落ちる事があります。
本パッチはれに対して、 対処療法で無理矢理 SIGSEGV を出さない様にして 処理を続行させるものです。


■ かんなプロトコルをしゃべる anthy-agent代替ソフト

canna-agent.2013Y09.tar.lzma Sat,09 Nov,2013 (212KiB)
anthy-agent と全く互換の操作方法で、 かんなプロトコルのかな漢字変換サーバに接続する クライアントソフトです。
3条項BSDライセンス。

作った本人が言うのもなんですが、 かんなプロトコルのかな漢字変換サーバのベンチマークテスト以外に 用途を思いつきません。

ビルドには C99 対応コンパイラの使用が必須です。


■ GImageView SIGSEGV修正パッチ

GImageView の修正パッチです。

gimageview-0.2.27.patch Sun,05 Jan,2014 (3KiB)
GImageView(gimv) 0.2.27 を amd64 にて使うと アーカイブファイルを扱う時に SIGSEGV を出して落ちますが、 これに対する対処療法なパッチです。


■ 各種スクリプト


エンターテインメント


■ NetHack-3.2.3 + JNetHack-1.1.5 for PC-98x1 / PC-AT with TILE on MS-DOS

JNetHack 関連はこちら


■ GearHead-1 国際化 & GearHead-2 UTF-8化 & Unix系対応

GearHead-1 関連はこちら

GearHead-2 関連はこちら


Last modified on Fri,25 Jul,2014.
This contents was founded in Wed,07 Oct,1998.
FENIX ほめぱげ
G-HAL ほめぱげ
ソフトヱアに関するウダウダ
Mail to, メールはこちらへ
Suggestion Box, 投書箱
BBS, 掲示板 UserName:BBS、Password:BBS