ClosedXMLにて印刷範囲が設定され、「(」を含むシート名を保存するとファイルが壊れる

ClosedXML 0.93.1, 0.94.2で確認。 印刷範囲を設定したファイルを開いて、「(」を含むシートを作成して保存すると、ファイルが壊れてしまいExcelでは開けなくなる。 workbook.xmlを見る限り、シート名をシングルクォーテーションでエスケープできていないのが問題のようだ。 再現ケースを確定してIssueに挙げるか。

<span title='2019-03-11 00:00:00 +0900 +0900'>March 11, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Form Load時にRadioButtonのCheckedChangedイベント発生

C# WinFormにてForm Load時にRadioButtonのCheckedChangedイベントが発生する事態に遭遇。 LoadイベントではCheckedをFalseにしているだけだし、他に怪しいイベントも見当たらない。 原因はTabStopが設定された、最小のTabIndexを持つフォームがRadioButtonになっていたため。

<span title='2019-02-28 01:00:00 +0900 +0900'>February 28, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

C#でのCollection系オブジェクトの受け渡し指針

C#でCollection系オブジェクト(IEnumerable, ICollection, IList等)の受け渡しをどうすべきか悩んでいた。 ListよりIList, EnumerableよりIEnumerableといった実装を含まないInterfaceが好ましいのは当然として、 あらゆるオブジェクトを想定してより抽象的なクラスを選択すべきというのは感覚的にわかるのだが、どうもしっくりこない。 以下の記事を見てなるほどと思った。 https://enterprisecraftsmanship.com/2017/05/24/ienumerable-vs-ireadonlylist/ 言語に依存しない一般的な方針としては、Postel’s law.として知られる(初めて知った…) be conservative in what you send, be liberal in what you accept, C#における具体的な方針として prefer IEnumerable when accepting a collection; prefer IReadOnlyList when returning one. 確かに、引数は抽象的な方が使いやすいが、戻り値も抽象的だと結局toListしたりcastしたりしないといけないので使いにくいし、そもそもそんな使い方が正しいとは思えないので違和感があった。 IEnumerable - ICollection - IListという階層関係があるので、引数としてconservativeな(他の継承クラスも受け取れる)IEnumerableがよいというのはそのとおりだろう。 ただ、be liberal であるための解としてIReadOnlyListがあげられているが、これは利用側で内容を変更しないことがはっきりしている場合だろう。変更することが想定する場合はIListを返すべきと思われる。 複数のオブジェクトを格納する際には、IListの実装クラスがほとんどなので、これ以外を考慮する必要はとりあえずないと思われる。 DictionaryやHashtableを使う場合はIDictionaryあたりを返すのが妥当か?

<span title='2019-02-28 00:00:00 +0900 +0900'>February 28, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Ubuntuでmac方式のIME切り替え

macを使い始めて、IMEの切り替え方式をmac方式に切り替えています。Windows10ではIMEの設定をいじっていますが、近い将来mac方式が標準になるようです。 http://www.itmedia.co.jp/news/articles/1812/26/news094.html Ubuntu 18.04でも変更することができました。 https://garabakos.sakura.ne.jp/Zlinux/lx061.htm

<span title='2019-01-16 01:00:00 +0900 +0900'>January 16, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

C#におけるIEnumerable,IEnumerator

IEnumerable(IEnumerator)はIListに比べると制約が多く、同じことをやろうとしても面倒、その分汎用性が高い、くらいに思ってました。 実際には、IEnumerableには要素の編集が一切できないのが最も大きな違いだと思います。 https://stackoverflow.com/questions/1210295/how-can-i-add-an-item-to-a-ienumerablet-collection System.Linqを参照に追加すればIEnumerable.Appendが利用できますが、これはIList.Addとは違い非破壊的メソッドで自身は変更せずに要素を追加した新しいオブジェクトへの参照を返すだけです。 逆に言うと、一度設定したら編集しないCollectionを利用する場合はIEnumerableとして公開すればそとから編集されないことを保証できます。

<span title='2019-01-16 00:00:00 +0900 +0900'>January 16, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41