2013/07/16(火)apt周りあれこれ

2013/07/16 27:07 PC(Linux)
#aptitude upgrade
しようとしたら、依存関係が色々ぶつかって通らなくなってた問題。
(いつも通り、先頭sudoは適宜読み換えて下さい)

wheezyにしたときにちゃんと整備してなかったのが今になって出てきたっぽい。

とりあえず、
#aptitude upgrade --full-resolver
して、お勧めの方法でやってしまう。
 slang1:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 gnome-users-guide-es:none : 依存: scrollkeeper:none[仮想パッケージです]
 libpcap0:none : 依存: libc6:none (>= 2.2.3-7)[仮想パッケージです]
 libperl5.6:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 ide-smart:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libguile9 : 依存: libreadline4 (>= 4.3-1)[仮想パッケージです]
 perl-5.6:none : 依存: perl:none (>= 5.6.0-20)[仮想パッケージです]
 libident:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 nas-lib:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libcap1:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 webrick:none : 依存: libruby:none (>= 1.6.5)[仮想パッケージです]
 libpisock4:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libg++27 : 依存: libc5 (>= 5.4.7-6)[仮想パッケージです]
 mc-common:none : 依存: perl:none[仮想パッケージです]
 python2.1 : 依存: libreadline4 (>= 4.3-1)[仮想パッケージです]
 slang1a-utf8:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 libdns5:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 aalib1 : 依存: slang1 (> 1.4.9dbs-4)[仮想パッケージです]
 kjc:none : 依存: java-common:none[仮想パッケージです]
 watanabe-vfont:none : 依存: vflib2:none (>= 2.25.1-4.1)[仮想パッケージです] または
                             vflib3:none (>= 3.6.8-1.1)[仮想パッケージです]
 ipchains:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
                 依存: debconf:none[仮想パッケージです]
 gnome-users-guide:none : 依存: scrollkeeper:none[仮想パッケージです]
 libdb2:none : 先行依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 libdb2-util:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 libisc4:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libjasper-1.701-1:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
                          依存: libjpeg62:none[仮想パッケージです]
 libdb4.0:none : 依存: libc6:none (>= 2.3.2-1)[仮想パッケージです]
 libjcode-perl:none : 依存: perl5:none[仮想パッケージです]
 ipmasqadm:none : 依存: libc6:none (>= 2.2.2-2)[仮想パッケージです]
 libupnpsdk1:none : 依存: e2fsprogs:none (>= 1.27-2)[仮想パッケージです]
                    依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
                    依存: libuuid1:none[仮想パッケージです]
 libmm11:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libmm13:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
 perl-5.6-base:none : 依存: perl-base:none (>= 5.6.0-20)[仮想パッケージです]
 linuxigd:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
                 依存: libstdc++2.10-glibc2.2:none (>= 1:2.95.4-0.010810)[仮想パッケージです]
 libnkf-ruby:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
                    依存: libruby:none (>= 1.6.7-3woody5)[仮想パッケージです]
 libnewt0:none : 依存: libc6:none (>= 2.2.4-4)[仮想パッケージです]
 libreadline4:none : 依存: libc6:none (>= 2.3.2.ds1-4)[仮想パッケージです]
                     依存: libncurses5:none (>= 5.4-1)[仮想パッケージです]
 ldso:none : 依存: libc6:none (>= 2.1.94)[仮想パッケージです]
以下のアクションでこれらの依存関係の問題は解決されます:

      以下のパッケージを削除する:
1)      aalib1
2)      gnome-users-guide:none
3)      gnome-users-guide-es:none
4)      ide-smart:none
5)      ipchains:none
6)      ipmasqadm:none
7)      kjc:none
8)      ldso:none
9)      libc5:none
10)     libcap1:none
11)     libdb2:none
12)     libdb2-util:none
13)     libdb4.0:none
14)     libdns5:none
15)     libg++27
16)     libguile9
17)     libident:none
18)     libisc4:none
19)     libjasper-1.701-1:none
20)     libjcode-perl:none
21)     libmm11:none
22)     libmm13:none
23)     libnewt0:none
24)     libnkf-ruby:none
25)     libpcap0:none
26)     libperl5.6:none
27)     libpisock4:none
28)     libreadline4:none
29)     libupnpsdk1:none
30)     linuxigd:none
31)     mc-common:none
32)     nas-lib:none
33)     perl-5.6:none
34)     perl-5.6-base:none
35)     python2.1
36)     slang1:none
37)     slang1a-utf8:none
38)     watanabe-vfont:none
39)     webrick:none



この解決方法を受け入れますか? [Y/n/q/?]
受け入れた。うーん、noneはパッケージ消失だと思うのだがlibc6絡みで消えてる奴はなんなのだ。

で、linuxigd(upnpdを提供してるパッケージ)だけ消えてくれない。
Stopping linuxigd: upnpd invoke-rc.d: initscript linuxigd, action "stop" failed.
Starting linuxigd: upnpd/usr/bin/upnpd: error while loading shared libraries: libupnp.so.1: cannot open shared object file: No such file or directory invoke-rc.d: initscript linuxigd, action "start" failed.
dpkg: クリーンアップ中にエラーが発生しました:
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 127 を返しました
処理中にエラーが発生しました:
 linuxigd
とりあえずupnpdは今使ってなかったと思うので、何とかして消す。

インストール・アンインストールのプリ・ポストプロセス周りで問題が出ている模様。

/var/lib/dpkg/info/にここらのスクリプトが集まっているので中身を見る。
$cat /var/lib/dpkg/info/linuxigd.prerm

#!/bin/sh
set -e
# Automatically added by dh_installinit
if [ -x "/etc/init.d/linuxigd" ]; then
        if [ -x /usr/sbin/invoke-rc.d ] ; then
                invoke-rc.d linuxigd stop
        else
                /etc/init.d/linuxigd stop
        fi
fi
# End automatically added section
こいつは止めてるだけだな。

で、結論から言うととりあえず手動で止めて、このスクリプト消してしまうのが手っ取り早いと思う。
#mv /var/lib/dpkg/info/linuxigd.prerm /var/lib/dpkg/info/linuxigd.prerm.orig
プリ部分はこれでOK。ポスト部分はメモってなかったが同様の方法で問題なかったと思う。

これで晴れて、
#dpkg -r linuxigd
が通った。

乱暴だが、そもそもパッケージの作りがおかしいので仕方ない。

2013/06/17(月)アンテナ配線周りあれこれ

2013/06/17 20:07 家電
これまでTOKYO MXをPC視聴できていたのが出来なくなった問題。

6月頭スカイツリー移転絡みでアンテナ調整が行われた。MX以外の地デジチャンネルは堅調なのだが、MXだけかなり状態が悪くなってしまった。

自宅は集合住宅なので、自分でアンテナや共用部分の配線を弄ることは出来ない。出来ることは限られるがとりあえず足掻くだけは足掻いてみた。

で、色々やってみたら状況は改善したのだがイマイチ原因も確定しないし、今後問題も出そうな気もする。なので一応メモを残しておきたい。

dB値はTVTest読み。

↓がスカイツリー変更後の状態
[壁面テレビ端子 -> 5C-FV 15m -> 8分配 -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 11.00dB

×視聴不可
↓分配を止めたら、とりあえず映るには映ったけどギリギリ。これでは分配も出来ないし、天候にも左右されそう。ちょっと厳しい。
[壁面テレビ端子 -> 5C-FV 15m -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 15.00dB

○視聴可能
で、このあとブースター(VB-33CU)を分配器の前に入れてみた。この時はちゃんとメモってなかったので記憶頼り。
[壁面テレビ端子 -> 5C-FV 15m -> (混合入力)VB-33CU -> 8分配 -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 15dB(記憶あやふや)
[壁面テレビ端子 -> 5C-FV 15m -> (別入力)VB-33CU -> 8分配 -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 22dB(記憶あやふや)
VB-33CUには混合入力と別入力(UHF/BS・CS)とあり、別入力の場合別端子にそれぞれの同軸ケーブルを繋ぐ。モードの切り替え自体はスイッチで行う。

5C-FV 15mをブースターの混合入力に入れ、設定を混合にするとやはり15dB前後。しかし接続はそのままで、モードのみ別入力にする(分配後のBS入力は死ぬ)と22dB位に改善した。

ここでもしかしてブースター内部のLPFが効いてる? という辺りに考えが至る。反射波かノイズが悪さをしているんじゃないか。LPFが効くならば分波器で改善する? と思って分波器を調達したのが↓

[壁面テレビ端子 -> 5C-FV 15m -> 分波器 -> 8分配 -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 9.75dB

×視聴不可
駄目。安いとはいえ分波器で1.25dBも下がるンだっけという疑問もありつつ、あと考えられるのは、そもそも家のアンテナコネクタに来てる信号が弱すぎるのか。ということはブースターを入れる位置が間違ってる…

[壁面テレビ端子 -> S-4C-FB 50cm -> (混合入力)VB-33CU -> 5C-FV 15m -> 8分配 -> S-4C-FB 1m -> TUNER IN]
TOKYO MX 25.11dB

○視聴可能

一応、dB値では改善した!

うーん、集合住宅ではブースターでコネクタにかなり高レベルの信号が来ている認識だった(C/NのCレベルが電圧上限に近くなっている)。そのため、ブースターを根本に入れても改善はしない、ケーブル損失は補正できるが微々たるものくらいだと思っていたので完全に想定外。

コネクタの時点でC/NのCが低すぎて、ケーブルの損失が他のチャンネルよりも大きくC/Nを劣化させたということだろうか。

そうすると、共用部の配線に問題があるとしか…

なお、これらの作業のどの過程でもNHK~FUJITVでは35dB前後で大きな変動はなかった。


ブースターを挟んで以降、非ドロップのブロックノイズを頻繁に見るようになった気もするのでちょっと様子を見てまた見直したい。

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を直接叩けば済むような問題に見えるんだよなあ。
ここはまた次回。

2012/07/17(火)Thunderbirdの文字化け対処法

2012/07/17 10:24 PC(全般)
Thunderbird(13.0.1)のメール本文で文字化けする問題。

前提として、ThunderbirdではOutlook Expressよりもcharset申告を厳密解釈する。
なので、申告がおかしいメールを判定失敗するのは仕様。これはRight Encodingなどのアドオンで快適に対処、のはずだった。

しかし、charset=UTF-8のメールがISO-2022-JP判定されて文字化けしている。これはちょっと困る。

2カ所チェックすること。

・該当メールのフォルダのプロパティ
一般情報タブ->規定の文字エンコーディング→"この設定をフォルダ内の全てのメッセージに適用する(各メッセージの文字エンコーディング指定や自動判別結果を無視する)"
のチェックを外す。

・ツール->オプション->詳細->設定エディタ
mailnews.force_charset_override
をfalseに設定

自分の場合は以上2カ所で直った。

参考)UTF-8のメールが文字化けする【備忘録】 - Bacchus.gif

2012/07/10(火)春M(SpringM)の関連づけ周り

2012/07/10 11:05 PC(全般)
春MでeXecute周り触ってたら、期待と違う動作になったのでまとめておく。

春MはeXecuteで外部アプリケーションを起動できる。この時に「システムの関連づけ」を参照して起動アプリケーションを決める場合、オプションを引き渡さない。

たとえば、eXecuteで
massigra.exe a.bmp /blank
は"/blank"オプションが反映されるが、massigra.exeがシステムで.bmpに関連づけられているときに、
a.bmp /blank
は"/blnak"オプションが反映されない。コマンドプロンプトの仕様とずれているので、春M側のバグと見ていいように思う。

回避方法は一応ある。とりあえずこの例で言えば、春M自体で.bmpにmassigra.exeを関連づけした後、eXecuteで
\"massigra.exe a.bmp /blank\"
とすれば回避可能ではある。けど、拡張子ごとにやるのはちょっと不毛。

そして\"戦法はシステム関連づけには通用しない。

ということで、当座の手立てとしては「オプション指定したい場合は起動exeから書く」以外に無さそうである。

2012/06/16(土)XP+IE6環境にIE Collectionをインストールすると

2012/06/16 13:50 PC(全般)
Windows XP, IE6環境にUtilu IE Collectionをインストールすると、元々入っていたIE6の挙動がおかしくなる問題。

まず前提として、
・IE Collectionはインストール時にレジストリを大量にいじる(梱包している各IEインストーラの挙動次第)。
・アンインストールしてもそれを完全に元に戻さない。
・IE自体が複数バージョン同時実行することを全くケアしていない。

これだけ見ても、デフォルトで入っているIEを動かし続けたい場合、その環境に対して「導入すべきではない」。

以下のように、仮想環境にIE Collectionを導入するのが良いだろう。
Reliable Cross-Browser Testing, Part 1: Internet Explorer | Smashing Coding

しかし、導入してしまった場合どうなるか。
[発生条件]
・OS: Windows XP (SP2, SP3で確認)
・IEバージョン: IE6(IE6の複数バージョンで確認)
・Utilu IE Collection 1.7.2.1をインストール
(インストール時、オプションでIE7かIE8をチェック)

[現象]
元々入っていたIE6で、JavaScriptのwindow.open呼び出し時に、Windowが2画面開く。1枚は表示が空かつSHDocViewが無い状態で正常に動かない。アイコンも正常なIE6と異なる。その他、JS多用画面で頻繁にフリーズ・ブラクラ状態になる。

手元の環境ではIE Collectionで7or8を入れた場合に100%再現した。IE Collectionをアンインストールしても改善しない。

対処方法はかなり対処療法的手法になる。IE Collectionをアンインストールした後、レジストリエディタで以下のキーを削除。
HKEY_CLASSES_ROOT\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}	(既定)	(値の設定なし)
HKEY_CLASSES_ROOT\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}\InProcServer32	(既定)	C:\\Program Files\\Internet Explorer\\ieproxy.dll
HKEY_CLASSES_ROOT\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}\InProcServer32	ThreadingModel	Both
要は"C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6"キーごと消す。

キーの意味は各自で調べて欲しい(ごめんなさい、調べきれませんでした)。

これでIE6のwindow.open周りの挙動は本来の動きに戻る。他におかしいところがあるかもしれないが、一度入れてしまったら後の祭り。IEのIE6より新しいバージョンを入れるか、復元するか、OSの再インストールをするか…… 綺麗にする方法はそこらしかなさそうである。IEのアップデートに失敗して旧IEが動かなくなってしまったときと同じ感じである。

あ、でも綺麗なOSにIE Collection入れてレジストリパッチを作る方法はあるかな……

なお、レジストリの修正は当然自己責任で。バックアップを取ってからの実施をお勧めする(ERUNTとか、この部分だけエクスポートするとか)。

2012/06/16(土)AutoIt!でBTScanをちょっと改良

BTScanの記事なのかAutoIt!の記事なのか判断付かないけどとりあえず書いておこう。

AutoIt!はuwsc等で知られる、いわゆるWindows自動化ツール(マクロレコーダ)である。

uwsc(無料版)と比較すると、
[劣る]
・自動記録がちょっと弱い(いわゆる座標依存系のスクリプトを吐くことが多い)
・専用エディタが微妙に使いづらい
(一度拡張子を.au3にしないとメニューが開かないって!)
・仕様に慣れるまでに時間がかかる

[優る]
・とにかく高機能
・正規表現文字列操作もファイル操作もなんでもあり
・GUIも作れる、フォームエディタ付きで作りやすい
・exeもお手軽に作れる(uwscだとPro版のみ)

といったような感じ。どっちかというとマクロいじってると言うよりほぼ一言語を覚えるのに近い。類似のことはやろうと思えば.NET系列なりRubyなりでもできるわけで、初期学習コストが高そうなAutoIt!を使うメリットはかなり微妙なところではある。とはいえ、やっぱりお手軽感はあるか。

さて、今回BTScanにちょっと機能が欲しいってんで、AutoIt!でスクリプトを書いてみた。

目的としては、カウンタリセットボタンが欲しいのと、フォルダ名の最下位部だけ変更するような機能を追加したい。

AutoIt!で書くとこんな感じ。
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("BTScan Tool", 623, 75, 192, 114)
GUISetFont(9, 400, 0, "MS Pゴシック")
$inputFolder = GUICtrlCreateInput("", 8, 8, 489, 20)
$buttonReset = GUICtrlCreateButton("カウンタリセット", 456, 40, 161, 25)
$buttonFolderSet = GUICtrlCreateButton("フォルダ名セット", 504, 8, 113, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Run("c:\\hogehoge\\BTScan\\BTScan.exe")
WinWaitActive("[Class:#32770]")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $buttonFolderSet
			$org = ControlGetText("BTScan 3", "", 1000)
			$newFolder = GUICtrlRead($inputFolder)
			$newPath = StringRegExpReplace($org, "^(.*?)\\([^\\]*)$", "$1\\" & $newFolder)
			ControlSetText("BTScan 3", "", 1000, $newPath)
		Case $buttonReset
			ControlSetText("BTScan 3", "", 1005, "1")
	EndSwitch
WEnd
これを実行すると、ボタン2つテキストボックス1つのフォームがBTScanと共に立ち上がる。hogehogeは適当に読み替えて欲しい。例外処理とかは全く考慮無し。

ちなみに、コメントで囲まれたGUI部分はフォームエディタをWYSIWYGにいじってそのまま貼り付けただけ。

このフォームは別のファイルで保存しておける。コピペの手間が発生するとは言え十分にありレベル。

…うーん、でもやっぱり他の言語使った方が良い?

(2012/7/12) スクリプト微修正。TWAINダイアログ出てても変更反映可に。

2012/01/05(木)tvrock起動時にwarning

2012/01/05 23:57 PC(全般)
tvrock起動時に、注意ダイアログが表示され、
「チャンネル"****"の設定がされていません。設定・チューナー欄でチャンネルを設定して下さい。」
が出る問題。

地上波チューナーに衛星の番組が割りあたっていたり、設定→チューナー→チャンネル設定が出来ていない場合などに出る。

新規にチューナーを追加した際などにチャンネル設定が半端になっていたりすると出るので注意。

2011/12/27(火).NETのSerialPortでケーブルを抜くと例外

.NET(WinXP, .NET 3.5で発生)のSerialPortクラスで、USB-Serial変換ケーブルを使用している際に起こる問題。このケーブルに紐づくCOMポートをOpen()後、Close()前にケーブルを抜くと例外が発生する。

原因は.NET側のバグ。ケーブルの挿抜というかCOMポートが消えることを考慮していない。

発生する例外は把握している限りで2種(UnauthorizedAccessException, ObjectDisposedException)。前者は、Dispose()中に発生する。後者は、SerialPort内部で動いてるThreadが出してくる。

UnauthorizedAccessExceptionはラッパークラスを作って、Dispose()をオーバーライドしtry~catchで囲ってやることで対処可能。以下を参照。簡単なのでコードは書かない。

街角のリブロガー: C# SerialPortのエラー「UnauthorizedAccessException」対策

ObjectDisposedExceptionの方はちょっと難しい。発生箇所は.NET内部の別スレッドのようで、捕まえられる場所を思いつかない(存在しない?)しタイミングも不定。Thread.GetDomain().UnhandledExceptionで発生タイミングはとらえられるが、ここではキャンセルできない。古い.NET、おそらく1.1以下だとこの手の例外は処理継続となるのだが、.NET 2.0以降はアプリが落ちてしまう(WinXP/Win7, .NET 3.5で確認)。

ということで、どうもコードでの容易な対処方法がないようだ。アプリケーション構成ファイルでの回避策があるらしいので以下を参照。

SerialPort Crashes after disconnect of USB COM port | Microsoft Connect

こんな感じでよい。

program.cs
[STAThread]
static void Main()
{
	...

	//メインスレッド以外の非ハンドル例外処理
	Thread.GetDomain().UnhandledException +=
		new UnhandledExceptionEventHandler(Application_UnhandledException);

	...
}

public static void Application_UnhandledException(
	object sender,
	UnhandledExceptionEventArgs e
){
	if( e.ExceptionObject != null &&
		e.ExceptionObject.GetType() == typeof(ObjectDisposedException)) {
		
		//.NET3.5のSerialPortのバグで、ケーブル挿抜後にハンドル不能の
		//ObjectDisposedExceptionが返ることがある。このため、未ハンドル例外処理にて
		//ObjectDisposedExceptionについてのみ無視する。

		//何もしない
	} else {
		//何かメッセージを出力
		
		Application.Exit();
	}
}
以下のアプリケーション構成ファイルをアプリケーションと同じディレクトリに置く(hoge.exeが実行ファイルなら、hoge.exe.configとなる)。

hoge.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<runtime>
		<legacyUnhandledExceptionPolicy enabled="1"/>
	</runtime>
</configuration>
構成ファイルを上記のように書くと、非ハンドル例外に関しては処理継続となる。釈然としないが、どうもこれが楽な方法らしい。

その他の非ハンドル例外を無視して良ければ、program.cs側の記述は不要。

.NETのバージョン変更、OSの変更で直る可能性有り。
OK キャンセル 確認 その他