Linux上のClosedXMLで画像データを扱うときにSystem.DllNotFoundExceptionが発生する

Linux(Ubuntu 18.04)環境に.NET Core SDK 2.2をインストールし、ClosedXmlで画像を含むExcelファイルを扱おうとしたところ、下記の様な例外が発生して実行出来ません。

System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libdl' or one of its dependencies. In order to help diagnose loading problems, consider setting th
 e LD_DEBUG environment variable: liblibdl: cannot open shared object file: No such file or directory at Interop.Libdl.dlopen(String fileName, Int32 flag)
     at System.Drawing.SafeNativeMethods.Gdip.LoadNativeLibrary()
     at System.Drawing.SafeNativeMethods.Gdip..cctor()
     --- End of inner exception stack trace ---
     at System.Drawing.SafeNativeMethods.Gdip.GdipLoadImageFromDelegate_linux(StreamGetHeaderDelegate getHeader, StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek, StreamCloseDelegate close, StreamSizeDelegate size, IntPtr& image)
     at System.Drawing.Image.InitFromStream(Stream stream)
     at ClosedXML.Excel.Drawings.XLPicture..ctor(IXLWorksheet worksheet, Stream stream)
     at ClosedXML.Excel.Drawings.XLPictures.Add(Stream stream)
     at ClosedXML.Excel.XLWorkbook.LoadDrawings(WorksheetPart wsPart, IXLWorksheet ws)
     at ClosedXML.Excel.XLWorkbook.LoadSpreadsheetDocument(SpreadsheetDocument dSpreadsheet)
     at ClosedXML.Excel.XLWorkbook.LoadSheets(Stream stream)

.NET Core Runtimeインストール時に依存関係が処理されていないことが原因です。下記のコマンドを実行してGDI+関連のライブラリをインストールすると解決します。

sudo apt install libc6-dev 
sudo apt install libgdiplus
cd /usr/lib
sudo ln -s <a rel="noreferrer noopener" target="_blank" href="http://libgdiplus.so/">libgdiplus.so</a> gdiplus.dll

環境によってはLD_LIBRARY_PATHの設定も必要になるようです。

ASP.NET COREを使ったWEBサービス作成(習作)

習作としてASP.NET COREを使用したWEBサービスを作成してみた。
もちろんLinux(Ubuntu 18.04)上で動作している。

Excelファイルをアップロードすると、適当な文字列部分をバーコード画像に置き換えてくれる。

https://barcode.code-lab.net/

選挙を電子投票に出来ない理由

引き続いて電子投票に出来ない理由とか語ってみる。

全国に投票所の数は4万7千箇所。一箇所当たり10台程度の端末を配置するとしても47万台。全国4万7千箇所の拠点をネットする、47万台の端末からなるオンラインシステムを2週間程度でセットアップする・・・単純な物量だけでもゾッとしますね。

物量だけの問題なら別に良いのです。簡単ではない理由は他にもあります。

・オフグリッド
ネットワーク障害や停電、サーバの障害は全国様々な場所で毎日のように起こっています。全国数万箇所を接続するとなると何処も障害を起こさないと言うことはほぼ不可能ですし、悪意をもって妨害される可能性も考慮すると、オフグリッドでも使える事が求められます。

・多重バックアップ
万が一にもデータが失われることがあってはなりません。データは常に多重にバックアップ(最低でも三つ。二つだと差違があったときに、どちらが正しいか判断出来ない)される事が必要です。

・堅牢性
多重のバックアップに加えて盗難出来ないように固定する処置や、記録メディア自体が破壊されないような処置が必要です。

・長寿命
選挙は 何時行われるか分からない ため、端末やサーバーは事前に購入し、数年間にわたって保管・維持しておくことが求められます。

上記のような要件を満たそうとすると、市販のタブレットをそのまま使う事が難しいと分かっていただけるかなと思います。

なおかつ操作が簡単である事はもちろん、きちんと投票が出来てることを投票者が確認出来る必要があったりと、存外面倒な要件が沢山あるのです。

選挙をインターネット投票に出来ない理由

社内SEは出来ない理由しか言わないという記事をみて心が痛いので、最近よく見る選挙のインターネット投票をできない理由を語ってみよう。

投票制度には二つの要件があります。一つは匿名性。誰が誰に投票したのかは分からない事が求められます。二つ目は信憑性。投票内容が改竄や成り済ましなど不正が行えない事が求められます。インターネット投票の実現が難しい理由は、信憑性と匿名性を両立する良い方法が無いからです。

信憑性を保持するための最も単純な方法は、投票内容に電子署名を付与することです。ですが電子署名は投票者個人に結びついているため、誰が誰に投票したのか明確に記録されてしまいます。匿名性は完全に失われます。

信憑性を保持する為の方法として古くから行われてきた方法に監査ログがあります。データベースへのあらゆる操作を時系列にそって保存したログファイルです。データには誰が投票したのかの記録を残さず、かつ監査ログで改竄を検知すると言うことは出来ます。ですが、全ての操作を保存しているが故に、ログを丁寧に分析すると結局誰が誰に投票したのか分かってしまう可能性が高いです。匿名性は不完全なものになります。

電子署名も監査ログも無し。データ上は誰が投票したのか紐付けないとなると、サーバー管理者は容易に改竄できてしまいます。匿名性を維持できても、信憑性がありません。これでは投票として成立しませんよね。

現状の技術でインターネット投票を成立させるには、投票の匿名性を諦め、記名投票にするしかありません。先行してインターネット投票を実施しているエストニアのシステムも各個人に発行された公開鍵暗号をもちいた電子署名によるもので、匿名性のないものになっています。

よく言われる「拘束して無理矢理投票させる場合があるから」とかは、拘束している時点で刑事罰の対象です。またエストニアのインターネット投票では投票期間中は何度でも変更投票を可能とすることで、強要のリスクを軽減しています。

SOHO用のNASに必要な要件

SOHO環境のNASをどうするか思案した結果、3ベイモデルのNASに行き着いたので、参考までにとりまとめておく。

SOHO向けNASの考察

SOHOにRAID5/6は不要

RAID5/6を構成できることを売り文句とする簡易NASが売られているが、安易にRAID5/6で構成してはいけません。RAID5/6の欠点も正しく知っている必要があります。

RAID5/6のHDDで物理障害が発生した場合には復旧は困難を極めます。例えばNAS本体が故障した場合、あるいは複数台のHDDが障害を起こした場合、これを普及するには同一型番のNAS本体なり、あるいはNASをマウントする専用のソフトウェアが必要になります。専用機材を持たない状態では手が出せないため、業者に委託せざる得なくなる可能性が高く、速やかな復旧は望めませんし、HDD4台程度のNASでも数十万の復旧費用がかかることになります。

RAID5/6のメリットはHDD1台では実現できない大容量を実現できる点、複数台のHDDに分散することで高速な読み書きを行える点にあります。ですが8TBのHDDでも、2TBのHDDでも容量単価は殆ど変わりません。大容量のメリットを得られるのは8TBを超えるパーティションが必要な時だけです。容量が8TB以下ならRAID1で十分です。高速化が必要ならRAID5/6よりもRAID10のほうが優れていますし、SSDをキャッシュとして使用するのも効果的です。

つまるところRAID5/6が必要なのは、RAID0/1/10では賄えないような、16TBを超える大きなパーティションが必要な場合に限られると言うことです。

SOHOならRAID1が理想

復旧作業を考えるならばRAID1が理想的です。よほど特殊なファイルシステムを採用していない限り、既存のPCでマウントするだけで直前に保存されたファイルも含めて復元することが出来ます。

高速性が必要ならSSDキャッシュを

高速性が必要ならSSDのキャッシュを設けた方が実効性が高いです。 RAID5/6/10でHDDの台数を増やすよりも 高い実効性を期待できる上に、先に述べたように復旧作業を考えるなら RAID5/6/10 は避けたいところです。

バックアップ機能も必要

RAIDにしているからと言ってバックアップが不要になるわけではありません。誤った操作によりファイルを上書きした場合など、バックアップがなければ対処できません。したがってバックアップ用のドライブも必要です。

出来れば世代別バックアップを行えるように、共有用パーティションの2倍程度の容量が必要です。

SOHO向けNASの まとめ

以上の条件を踏まえると、共有ストレージとしてRAID1を構築するためにHDDを2ドライブ、バックアップ先とするためにHDDを1ドライブ、合わせて3ドライブ以上のNASが必要ということになります。これに加えて、高速性も求めるならSSDをキャッシュとして利用できるもの必要です。

この条件を満たすNASを探していた時にたどり着いたのがQNAPの QNAP TS-332X/351/328のシリーズ。 他社だと2ドライブより上位のモデルは4ドライブになってしまい、少々オーバースペックとなってしまいます。ですが、QNAPのこのシリーズは 3.5インチのHDDを3台まで搭載できるというよく考えられた製品です。 TS-332X/351 ならSSDキャッシュを設けられるので速度面でも十分です。

ちなみにQNAPは中々尖った製品が多くて面白いです。比較的に安価なNASにも10GbE SFP+ポートを設けていたり、GPGPUやLGPAによる演算をサポートしていたり、仮想OSのホストになれたり、もはやNASの皮をかぶったサーバーですね。QSW-804-4Cなんかも10Gb HUBとしては最安値なんじゃないかな。