M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

ISBNコードのシリアライザ/デシリアライザをつくった

まあ背景事情がないでもないのですが。。思い立ったが吉日とばかり、あれこれの予定をすっぽかしてISBNコードの仕様を調べて、シリアライザ/デシリアライザをつくってみました。ISBN-10・ISBN-13のいずれにも対応しています。単体テストNUnitで、動作確認はWindowsmacOSのいずれでもとっています。

プロジェクトのGitHubリポジトリこちらアセンブリは例によってNuGet Galleryにて公開しています。

以下のようにして使います:

// P・ブルデュー『社会学の社会学』のISBNコード
string isbnString = "ISBN-13: 978-4938661236";
IsbnCode isbnCode = IsbnCode.Parse(isbnString);

// 以下のコードもこれと同義
// var isbnCode = IsbnCode.Parse("ISBN-13: 978-4-938661-23-6");
// var isbnCode = IsbnCode.Parse("ISBN-13 978-4938661236");
// var isbnCode = IsbnCode.Parse("ISBN 978-4-938661-23-6");
// var isbnCode = IsbnCode.Parse("ISBN978-4-938661-23-6");
// var isbnCode = IsbnCode.Parse("978-4-938661-23-6");
// var isbnCode = IsbnCode.Parse("9784938661236");
// var isbnCode = IsbnCode.Parse("ISBN-10: 4-938661-23-6");
// var isbnCode = IsbnCode.Parse("4-938661-23-6");
// var isbnCode = IsbnCode.Parse("4938661236");

// グループ記号は日本国内の出版であることを示す "4"
Digits group = isbnCode.Group; // => Digits("4")
string agencyName = isbnCode.Agency; // => "Japan"

// 出版者記号は藤原書店を表す "938661"
Digits publisher = isbnCode.Publisher; // => Digits("938661")

// 書名記号は 『社会学の社会学』 を示す "23"
Digits title = isbnCode.Title; // => Digits("23")

// 検査数字はモジュラス10で計算された '6'
char checkDigit = isbnCode.CheckDigit; // => '6'

// 引数なしの ToString() はプレフィクスやハイフンを含んだ形式の文字列を返す
string isbnString2 = isbnCode.ToString(); // => "ISBN-13: 978-4-938661-23-6"
string isbnString3 = isbnCode.ToString(IsbnCodeStyles.WithHyphens); // =>  "978-4-938661-23-6"
string isbnString4 = isbnCode.ToString(IsbnCodeStyles.AsIsbn10Code); // => "4-938661-23-6"

イベントログ1530直後に実行中の複数CLRプロセスでエラー発生

直近、仕事で保守しているバッチシステムで、同時に実行されていた複数の.exeがある時間帯─数十秒間にほぼ同時にエラーとなるという事象が発生しました。

標準エラー出力やエラーログに出力された内容は.exeにより様々で「インターフェイスがサポートされていません」や「タイプ初期化子が例外をスローしました」、そして単に「○○でエラーが発生しました」的な素朴で役立たずなものもありました。

一方、後述のようにイベントビューアを確認すると、事象発生直前にイベントログ1530が記録されていました。

コンテキスト

OS Windows Server 2008 R2
ランタイム .NET Framework 4.5.2
実装言語 C#
エラーメッセージ インターフェイスがサポートされていません」、「タイプ初期化子が例外をスローしました」など

インターフェイスがサポートされていません」は.exeが参照していたCOMの1つをロードする過程で発生しているようでした。「タイプ初期化子が例外をスローしました」は(別の).exeが稼働するCLRにODP.NETのクラスがロードされたとき、タイプ初期化子(=静的コンストラクタ)の実行中に意図せぬ例外に見舞われて発生したようです。

しかし前後の時間に実行されていた.exeでは事象は発生しておらず、現に今回異常終了した.exeにしても再実行したところ正常稼動しました。当該時間帯に人為的にシステム変更がなされていた痕跡もありません。

イベントログ

一方、OSのイベントログを参照すると事象発生の直前にこちらの記事で言及されているイベントログ1530が発生していました。

レジストリ ファイルは他のアプリケーションまたはサービスで使用されています。ファイルはすぐにアンロードされます。レジストリ ファイルを保持しているアプリケーションまたはサービスはこれ以降正しく機能しない可能性があります

というメッセージに続いて、この警告内容に該当するプロセスがずらりと一覧されており、前述のエラーを起こした.exeのプロセスはすべてここに含まれていました。

Microsoft TechNetの記事の説明には次のようにありますが:

This event can be caused by apps that do not release their Registry keys before shutting down. This most often occurs when an app runs in the background and does not release its Registry keys when a user signs off, in which case Windows forces the Registry to unload. There is no impact to users, though in rare cases recent configuration changes in the app might not be saved.
このイベントはシャットダウンのまえにレジストリ・キーを解放していないアプリケーションにより引き起こされる可能性があります。バックグラウンドで何かしらアプリケーションが実行されていて、ユーザのサインオフ〔に伴う当該アプリケーションのシャットダウン?〕に際してレジストリー・キーが解放されない場合にはたいがい発生するイベントです。このような場合、Windows OSが強制的にレジストリーをアンロードさせます。ユーザへの影響はありません。稀ではありますが、アプリケーションが行った直近の設定情報〔レジストリーに保存される設定情報?〕の変更が保存されないままとなることがあります。

今回の事象からすればこの説明にあるようなアプリケーション起点の問題ではないように思われます。時系列でいえば、このイベントログが出力された直後から数十秒間に.exeのエラーが発生しています。上記説明にあるサインオフ云々にしても、当該バッチシステムはJP1/AJS2 Agentサービスにより実行されており、ユーザのサインオン/サインオフとは無関係であるはず。

あるいは逆に、というかそもそも、このイベントログと事象とは何の関係もないのでしょうか。それにしてはタイミングがぴったりすぎで、メッセージ内容には直後にエラーになった.exeがずらりと並んでいるのですから、ひとまず関係ありと仮定するのが妥当なように思われます。

とはいえ、Google先生にあれこれ伺ってみても類似事象に関する返答を拝聴することはできませんでした。Microsoft社のサポート問合せで何かわかるとよいのですが。。

VS for Mac正式版インストーラを実行したらXamarin 6.3がインストールされた。。

この程正式版リリースとなったVisual Studio for Macですが、さっそくそのインストーラをダウンロードし実行してみたらXamarin Studio 6.3がインストールされました。。もちろんVisual Studio for MacはXamarin Studioをベースにしています。そうはいってもXamarin Studio 6.3とVisual Studio for Macはあくまでも別物です。というかXamarin Studio 7.0=Visual Studio for Macということのようです。

今回の手順は以下の通り:

  1. Uninstall Xamarin Studioの手順にしたがいXamarin Studioのアンインストールを実施*1
  2. Visual Studio for Mac公式サイトから"Visual Studio Installer.dmg"をダウンロード
  3. 上記インストーラを実行してインストールを実施
  4. ウィザードの"何をインストールしますか?"の表示内容を確認しつつ以降すべてデフォルトのまま先に進む*2

f:id:m12i:20170513191419p:plain

数時間後、インストール完了の画面が表示されたので、画面下部の"Visual Studio の開始"をクリックしてみました。

f:id:m12i:20170513191438p:plain

すると、あーら不思議、以下のようにXamarin Studio 6.3が起動しました。。

f:id:m12i:20170513191455p:plain

気を取り直して以下の手順でリトライします。6.3のアンインストールは行っていません。

  1. macOSを再起動(意味はなさそう、でもまあとりあえず)
  2. "Visual Studio Installer.dmg"を使ってインストーラをもう一度起動
  3. ウィザードの"何をインストールしますか?"の表示が若干変化していることを確認しつつ淡々と先に進む*3

f:id:m12i:20170513191721p:plain

数十分後、インストール完了の画面が表示されたので、画面下部の"Visual Studio の開始"をクリックしてみました。すると、今度こそVisual Studio for Macが起動しました。やったね!(?)

f:id:m12i:20170513192155p:plain

公式サイトには「使い慣れた IDEMac でも利用できるようになりました。」などとあってネーミングも"Visual Studio"ですが「ようするにXamarin Studioのメジャー・バージョンアップでしょ?」と構えていたらバージョンアップすらしていない"Xamarin Studio"がインストールされてしまったという、ヘンテコな事象でした。

*1:途中、この記事に提示されたコマンドのままでは権限不足エラーになってしまうものがありました。それらについては先頭にsudoを付けて実行し直しました。

*2:このときVisual Studio for Macのラベルの左側に"○"印が表示されているのと、右側にバージョン番号として"6.3"と表示されているのが気になるところです。

*3:Visual Studio for Macのラベルの左側に今度は見慣れたアイコンが表示されていますし、右側にバージョン番号として"7.0.0"と表示されています。