2013/12/13(金)fi-6130のTWAINがフォーカスを取るのを抑止する

2013/12/13 16:27 PC(全般)
fi-6130等、Fujitsuのfi系ドキュメントスキャナのTWAINドライバウィンドウが1枚スキャンするごとにフォーカスを持っていってしまう問題。スキャン中他の作業、特に入力作業が出来ない。

とりあえずAPIフックで対処可能。

Windows API Hooking Tutorial

上を参考に、SetForegroundWindowを握りつぶせば良い。

最初単にグローバルフック(SetWindowsHookEx)でどうにかなるような気がしていたのだが、WM_ACTIVEAPPメッセージを握りつぶそうとしてもうまくいかなかった(WM_ACTIVEAPPが飛んできたタイミングは捕まえられる。そこで元のウィンドウにフォーカス移すのはちょと……)。

実のところWindowsのメッセージ機構の理解にあやしいところがあって、キーボード・マウス以外のメッセージにキャンセル機構がないのか、SetWindowsHookEx自体の制限か、それともWM_ACTIVEAPPメッセージは通知だけで、ウィンドウのアクティブ処理自体はエクスプローラ側の触れない領域にあるのかといったあたり判断できてない。C++でWin32ネイティブアプリ書いて、WndProc内であれこれやってみれば結論が出るんだろうけど、今回は時間がないので次回以降の課題。

.NET系でもマウス・キーボードのグローバルフックがかけられることは覚えておこう。

ソース整理できたらそのうち載せたいけども、元コードのライセンスがわからないな……

2013/11/09(土)HL-5450DNの印刷設定メモ

2013/11/09 4:44 PC(全般)
HL-5450DNの印刷設定のメモ。
メモしておかないと毎回間違えそうなので残しておく。

最近、BrotherのモノクロレーザープリンタHL-5450DNを導入した。

この機種、True 1200dpi出てグラデーションもかなりよいとの評判。
主にマンガ原稿を印刷する用途としても期待していた。

が、どうも期待した結果通りにならない。
あれこれ試した結果、どうも印刷結果に対して設定項目を誤認しやすい(あるいは自分がレーザプリンタの慣習を知らないだけ)名前になっているようだ。

[Brother HL-5450DN seriesのプロパティ->基本設定->印刷設定]
ここの項目が一番印刷結果に影響を与える。

3種類。

"グラフィックス":
プリンタ側でPhotoShopでの誤差拡散に近い二値化処理を行っている。元画像が二値画像なら(おそらく)これで問題無いが、グレースケールではディザ処理がかかる分汚くなる。

"テキスト":
"グラフィックス"のように二値化をかけずに(そのまま?)出力している。元画像のグレスケ部はインクジェットでのグレスケに近いし、二値・トーン部もしっかり出る。

"手動設定"->"システムのハーフトーンを使う":
一定の閾値を境に二値化がかかる。色々設定を弄ってみたのだが、想定と違ってハーフトーンにならなかった。グレスケを出力する場合白に飛ぶか黒につぶれるかどちらかになりそう。

それ以外に、"手動設定"内部に3種類の改善チェックボックスがある。これらについては確認した限りでON/OFFによる大きな差異は見えなかった。基本外す方向で良いような気がする。

ということで、"テキスト"がすさまじく優秀。マンガ原稿の場合、二値化にしろなんにしろ原稿側で処理してしまうのが基本だろう。"グラフィックス"を意図して選ぶ必要はないと思われる。

"グラフィックス"はお手軽にプリンタ機能だけでハーフトーンかけたいときに使うのが良いんだろうねえ。

最後にオマケで5450DNの雑感を書いておく。これまで使っていたのがMultiWriter 2350Nなので、それと比べてっていうところ。

印刷速度や綺麗さは大変優秀。特に1200dpiはすごい。グレースケールがこんなに綺麗に出て、この印刷速度。サイズも、ギリ卓上と名乗れるくらいでコンパクト。

動作音はかなり五月蠅い。静音モードにしないとちょっと夜間は無理。静音モードにした上でなお壁が薄くなければ使えるか。

心配していたオゾン臭や発熱も、2350Nに比べればずっとマシだった。あとは不満になりやすそうな用紙カールとか印刷の濃さがどうなるか。これらもドライバから制御できるようなので、そこは今後といったところ。

本体にパネルがないのでトラブったときが心配だけれども、とりあえず生きてさえいればブラウザからIPアドレス直打ちで設定・確認できるようなので大丈夫だろうか。

2013/05/08(水)libccid VerUpに伴うB-CASカード周りの設定変更

2013/05/08 24:56 PC(Linux)
自宅サーバ(debian)をsqueeze -> wheezyにしたらちょいちょい動かなくなったものがあったので、それ関連の記事。

今回はpcscd, bcs-perl 周りの話。

wheezyにして以降、pcsc_scanしてもカードが出てこない。

原因は、libccidのバージョンが変わった所為でカードリーダを認識しなくなったからのようだ。

[参考]
Linux/テレビ関連/libccid - PukiWiki Plus!

とりあえず、libccid_Info.plistにエントリを追加してpcscdを再起動すれば良い。
$diff /etc/libccid_Info.plist /etc/libccid_Info.plist.orig
328d327
<               <string>0x04E6</string>
554d552
<               <string>0x511A</string>
780d777
<               <string>SCM SCR 3310 NTTCom</string>

#/etc/init.d/pcscd restart
bcs-perl側の名前が"SCM SCR 3310 NTTCom"なのでそのまま入れてやる。

pcsc_scanしてカードの検出、bcs-perl listしてカードの認識が出来てることを確認すること。pcsc_scanがだめならpcsc側のリストをチェック、bcs-perl listがダメならbcs-perl.pl内のカード名($selected_reader)が怪しい。

パッケージ作り直す、unstableにするという方法もあるがうーん、依存の整理とか考えたくない……

[2013/10/11 追記]
後日、カードリーダを指し直したらまたbcs-perl listで取れる名前が変わってしまった。うーん、カードリーダ同じ型番でも取れるものが違うのか、ドライバ周りで細かく変わるものなのか……

bcs-perlを弄って修正。

[参考]
ぼんぼんブログ - ぼんぼん工房

2013/02/21(木)RubyでUTF-8ファイル名&外部コマンド実行

[2017/05/02 追記有り]
Rubyの``やsystemで外部コマンド実行するときに、実行ファイル自体や引数にUTF-8文字(SJISマッピング無し)が渡せないのであれこれ悩んだ問題。

確認はWindows7 64bit & Ruby1.9.3p0(ActiveScriptRuby)

前提。WindowsはファイルシステムがNTFSならUTF-8ファイル名を命名できる。内部コードもUTF-8になっている(はず)。しかし古いAPIを触ったり、INPUT/OUTPUT周りを見るとまだShiftJIS(Windows-31J)が多い。このズレは厄介で、ハマりどころのA代表。特にRubyの場合、UNIX寄りでWindows特有処理のケアはやっぱり甘い…

閑話休題。Windows&UTF-8の扱いが比較的良くなっているRuby1.9系(Dir.globの引数に.encode('utf-8')などでUTF-8文字列を渡すとUTF-8ファイル名が取れる)でも、マジックコメント入れてUTF-8保存しただけだと外部実行が出来ない。
# -*- encoding: utf-8 -*-
# -*- coding: utf-8 -*-

`utf8_filename`
どうにも通らない。SJISマッピング出来るファイルなら、SJISでやればいいだけの話なのだがUTF-8にあってSJISにない文字(U+2661(はーと)とか)が混ざってると動かない。


で、とりあえず色々やってみたのだが、結論から言うと綺麗に書くのは諦めた。

ちゃんと調べるべきなのだが(やってない)、どうもRubyが叩いてるAPI自体が古いんじゃないかという。

unicode - Ruby system() doesn't accept UTF-8? - Stack Overflow

なので、苦肉の策。
バッチファイルを作成して、それを実行する。
# -*- encoding: utf-8 -*-
# -*- coding: utf-8 -*-

open("tmp.bat", "w"){ |fp|
	fp.write("chcp 65001\n")
	fp.write("utf8_filename\n")
}

out = `tmp.bat`
Windowsのバッチ実行ではコードページが合えば、UTF-8ファイル名も通るのでそれを利用する。引数にファイル名を指定するときも同様。\\の数とかダブルクオート囲いとか先頭に./が必要な場合は適切にすること。

うーん、汚すぎて死にそう。

[参考]
Rubyで外部コマンドを実行して結果を受け取る方法あれこれ #Ruby - Qiita

systemuは知らなかった。

[2017/05/02 追記]
やはりきれいには書けていないが、さすがにbatを吐き出すのは汚すぎるということで苦肉の策第二段。小改善してみた。今回はnyagosを使用している。
	out = ""
	Open3.popen3("c:/********/nyagos.exe"){ |stdin, stdout, stderr, thread|
		stdin.puts("chcp 65001")
		stdin.puts("#{COMMAND} \"#{utf8_filename}\"")
		stdin.close
		out = stdout.read
	}
nyagosでなくても良いのだが、cmd.exeやnyaos.exeだとchcp 65001したあとにUTF-8を流し込めない。
ここらへんは、chcp後に貼り付けが出来るかどうかで確認する。

Windows APIを直接叩けば済むような問題に見えるんだよなあ。
ここはまた次回。
OK キャンセル 確認 その他