NuGetライブラリ整理直後に謎のエラー

NuGetで使用するライブラリをVisualStuidoの管理画面より変更(削除->追加)し、合わせて削除したライブラリに依存するライブラリを削除したところ、dllが存在しない旨を表すエラーが発生。 そのdllを見ると、削除したはずのdll。 App.configを見ると、その削除したはずのdllに関するdependentAssemblyエントリが合ったため、バックアップを取得した上で該当箇所を削除したところエラーは出なくなった。 Visual StudioでNugetライブラリを削除する場合には、設定ファイル(App.config)には連動されない場合があるらしい。

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

Visual Studio 2017でReport Viewerの表示、編集ができない

Visual Studioで久しぶりにReport Viewerを編集しようとしたのだが、右クリックしても何も表示されない。 右上に右向きの矢印が表示されるはずなのだが、それもない… 新しいフォームを作ってReportViewerをドロップしたところ、何も表示されない。 https://stackoverflow.com/questions/28179780/reportviewer-not-shown-on-form-designer-c-winform を参考にInitializeComponentにコードを追加すると表示はされるが、やはり一切編集できない。 編集したい理由は、rdlcファイルを指定がエラーとなっていて編集し直したかったため。this.reportViewer1.LocalReport.ReportEmbeddedResource にrdlcファイルを直接指定する方法を試してみたが、GUIで指定したほうが有効になっているためか全く効かない。 最近.Net Coreのプロジェクトを作った際、Visual Studio CodeとIntellisenseがらみで干渉したため、いったんアンインストールしたことがあった。その際に設定がおかしくなったのかもしれない。 Visual StudioをいったんアンインストールしてOS再起動後にインストール。 Visual Studio 2017(Pro)をインストール後、拡張機能「Microsoft RDLC Report Designer」をインストール。 Microsoft.ReportingServices.ReportViewerControl.Winformsライブラリを、Visual Studio内のNuget管理画面にて、下げられる最低のバージョン140.337.80まで下げると編集メニューが表示される!! ただ、既に作成済みのreportViewerはうまく動作しないため、いったん削除して同名で再作成して再配置。 その後、最新バージョンまで上げたが、正常に動作している。 一旦バージョンを下げることでキャッシュか何かがクリアされたのか? 原因不明。

<span title='2019-10-04 00:00:00 +0900 +0900'>October 4, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

MySqlBulkLoaderでの取込結果が合わない

C#でMariaDBに接続する際にMySqlConnectorを利用している。 大量のデータを取り込む必要があったため、MySqlBulkLoaderで取り込んだところ、なんかゴミデータみたいのが入るうえに数字も合わない。 よくよく調べたところ、前段のCSV出力個所と、取込時の設定にミスがあった。 CSV出力時の改行の削除 CSV出力にはCSVHelper.CsvWriterを使用しているのだが、Fieldに改行があるとそのままCSVに出力される。CSVファイルは1行1データを前提としているので、ゴミデータが発生する原因になる。 csv.WriteField(col.ToString().Replace("\r", "").Replace("\n", "")) のように除去することで回避できた FieldQuatationCharacterの設定 FieldTerminator, LineTerminator は普通に設定したのだが、FieldQuatationCharacter を設定しないと、CSVHelperがせっかく括弧で囲んでくれた中にカンマが含まれていると、そこで区切られてしまう。 mySqlBulkLoader.FieldQuotationCharacter = '"'; と指定することで回避できた。 MySqlConnector の MySqlBulkLoader は上記のような不具合で項目数など合わなくてもエラーなしで無理やり取り込むのが困ったところ…

<span title='2019-08-23 00:00:00 +0900 +0900'>August 23, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

IEnumerableで受けてIReadOnlyListで返すなら

http://tack41tu.hatenablog.com/entry/2019/02/28/092329 で記載した方針を受けて、最近はCollectionに関してはIEnumerableで受けて、IReadOnlyListで返す基本方針としている。 一方で、プロパティの変更による予期せぬ誤動作を防ぐために、POCOについてはコンストラクタで初期とを設定し、setterを提供しないことでImmutableな形としている。 ただ、そうなるとCollectionもコンストラクタで渡す必要があるが、アルゴリズムの関係などでCollectionのメンバーは後で追加したいことがある。例えばDBからデータを取得して、鑑データの属性として明細データのCollectionを持たせる場合に、鑑データのclassをいったん生成した後、明細データを都度追加したいことが多い。要は短期間だけメンバーを追加したい。 POCOに渡すCollectionの参照を呼び出し側で保持し、鑑データのコンストラクタに渡した後で呼び出し側で持っているCollectionの参照をもとにメンバーを追加したのだが、なぜか反映されない。 結論としては、POCO内ではCollectionをListとして保持しており、コンストラクタでIEnumerableで受けた際に直ちにtoListで変換していた。これだとその時点でオブジェクトがコピーされてしまい、呼び出し側で持っている参照とは別物になってしまう。 そこで、IEnumerableで受けたオブジェクトは内部的にもIEnumerableで保持し、getterで参照された際にtoListしてIReadOnlyList型として返すことで解決した。こうすれば呼び出し側で持っている参照とPOCOで持っているクラスは全く同じとなり、呼び出し側でメンバーを追加、削除すればPOCOにも反映される。getterで参照する場合はそもそもIReadOnlyList型としてわたるのでメンバーの編集はできない。castすればできなくもないかもしれないが、少なくともそれは保証対象外という意図を明示できる。

<span title='2019-08-09 00:00:00 +0900 +0900'>August 9, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

rm /* やってしまった

やってしまいました。 rm ${HOGE}/* HOGEが未定義のため、ルートディレクトリのファイルが全削除。 幸い、rfオプションは付けていなかったので、消されたのはファイルのみ。 CentOS7において、ルートディレクトリに存在するファイルは以下のシンボリックリンク。 /bin -> /usr/bin /lib -> /usr/lib /lib64 -> /usr/lib64 /sbin/ -> /usr/sbin 組み込み系のコマンドしかまともに動作せず、/usr/binフォルダに移動してコマンドを実行しても -bash: /usr/bin/ln: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: となってしまう… なんとかググって見つけた以下のサイト [https://ja.stackoverflow.com/questions/24643/rm-f-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F:embed:cite] # /usr/lib64/ld-linux-x86-64.so.2 --library-path /usr/lib64 /usr/bin/ln -s /usr/lib64 /lib64 # /usr/bin/ln -s /usr/bin /bin # ln -s /usr/lib /lib # ln -s /usr/lib64 /lib64 # ln -s /usr/sbin /sbin 上記コマンドで復旧した。神!! 感謝!!! 死ぬほど焦った… 今覚えば、/usr/bin/busyboxを使えばよかったのかもしれない。 ちなみに、shebangにて #!/bin/bash -eu とやっていたのだが、該当ファイルを/bin/bashの引数で呼び出したので効いていなかった… shebangではなく本文中にset -euと書くことが大事だと、死ぬほど理解した.

<span title='2019-07-26 00:00:00 +0900 +0900'>July 26, 2019</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41