一人情シスのつぶやき

名古屋の中小企業で一人情シスをしている作者が、日々の業務で思うことをつぶやきます。

ClosedXMLによるExcel編集がVirusBusterに強制終了させられる

ClosedXMLで、ファイルサーバの雛形ファイルをもとに編集して出力するということをよく行います。 この際、ClosedXMLの保存先がファイルサーバだと、当社のVirus Buster Business SecurityにUnauthorized Encryptionと言われて 強制終了させられることがあります。Excelファイルは作成できず、exeも消されてしまうので再インストールとなります。

テストした結果、ClosedXMLでの保存先がローカルであれば問題ないことが確認できたので、ClosedXMLではローカルに一時フォルダを作成してそこに保存し、System.IO.File.Copyでコピーすることで解消しました。

うっかりmasterリポジトリでcommit

git管理していて、ローカルリポジトリでブランチ切り忘れてmasterブランチで作業、ローカルcommitまでして気付いた。 このままpushしても、当然リモートのmasterブランチにダイレクトにpushはできず、弾かれる。 PRも出せない、と思っていたが。

pushでは、ローカルとリモートの両方のブランチを指定できる。

git push origin <local_branch>:<remote_branch>

local_branchにmaster, remote_branchに本来切ろうと思っていたブランチ名を指定し、そのブランチでPRを出す。

ClosedXMLでWindows7だけレイアウトが崩れる

アホな話です。

ClosedXMLで、一部コードでうっかり以下のようなコード書いてました。

            using (IXLWorkbook targetBook = new XLWorkbook(filePath))
            {
                using (IXLWorksheet targetSheet = targetBook.Worksheet(1))
                {

                }

                targetBook.Save();
            }

usingの入れ子です。 普通、入れ子になるような階層があれば一番上位のクラスが下位のDispose呼んでくれるっと思いますよね〜。 でも、このときはusing句覚えたてで、とにかく使いたかったんです、using入れ子かっけ〜って思ってたんです...

症状としては、Windows 7の場合のみシートのフォーマットが崩れます。なぜかWindows 10は大丈夫。OSによって症状が違う理由は不明。 sourceを見ると、XLWorksheetのDisposeでrange情報をクリアしてるっぽいから、そこで情報が消えて、そのまま保存すればそりゃレイアウトは崩れるな〜と。

追記) どうも、最新の0.93.1で発生し、0.92.0では発生しなかったようだ。ライブラリのバージョンアップした途端に大量に問い合わせが...

今日のクソVBAコード

stDocName = ChrW(xx) & ChrW(yy) & ChrW(zz) & ChrW(abc) & ChrW(def) & ChrW(ghi) & ChrW(jkl) & ChrW(mno) & ChrW(pqr) & ChrW(stu)
DoCmd.OpenReport stDocName, acPreview

ChrWの引数は実際にはコードが入る。 式の右辺をイミディエイトウィンドウに入力すると、日本語のレポート名が表示される...

暗号化?なんのために? あとで見る人への嫌がらせか? ちょっと意味がわからない

CIの導入について検討

一人で開発していても、テストやデプロイにミスが出る可能性はある。 CIの導入を検討した。

結論としては、CI用途のサーバーを別途導入することはしない。現在主に開発しているC#プロジェクトでは、CIにもWindowsが必要となる。ライセンス費用が必要だし、Dockerでお手軽に再構築できる環境としたいため。

やりたいことは以下の通り

  • リポジトリのPRコードのビルド
  • テスト、結果通知、OKならmerge
  • DBの構成情報に関して、リポジトリと実環境で差異がないかチェック

1,2点目はWindowsを避ける以上、不可能。開発時に自端末でテストを行い、PRのコメントに記載する運用で対応。 3点目は、毎日定時に実行する普通のバッチでなんとかなるレベル。

テストに関して、DBに関連するところは一切やっていない。面倒なので。 一方で内製アプリの殆どはDBのデータを持ってきてそのまま表示し、加工して更新する程度のものがほとんどのため、結果ほとんどテストがない状態。 本番環境に接続する際には専用のクラスを利用しているので、テスト環境用にも同様のクラスを作成し、テスト実行時にはそちらを利用してDB接続するようにしてテストを行うようにする。まずこちらが優先。

Dockerでdumpファイルから空のデータベースを作成するDockerfileを作成し、開発にすぐに利用できるようにする。

その上で、上記の運用で品質をさらに高めていく。

Docker Container 起動失敗

Docker Hostのスタートアップサービスにて、Docker ContainerをBuild, Upするスクリプトを実行しているのですが、以下のようなエラーが大量に発生してUpしていませんでした。

 8月 26 03:07:44 sever-name dockerd-current[864]: time="2018-08-26T03:07:44.615597202+09:00" level=error msg="could not calculate checksum for \"fb1077f711d4fc436c0b6e115f8cdb0c871f46c818ec998efbf489df5e4a4de5\", \"devmapper: Unknown device fb1077f711d4fc436c0b6e115f8cdb0c871f46c818ec998efbf489df5e4a4de5\""
...
 8月 26 03:07:44 server-name dockerd-current[864]: time="2018-08-26T03:07:44.617971873+09:00" level=error msg="migration failed for 866ae31005298fd6f1bb2944418eb34969b16ead2a18ed332fa011a311f3b4b2, err: open /var/lib/docker/graph/60e65a8e4030022260a4f84166814b2683e1cdfc9725a9c262e90ba9c5ae2332/json: no such file or directory"
...

ログの内容を見ると、以下のissueと同じように見える。再起動前にDockerのバージョンが1.13.1-74 に上がったようだし...

github.com

対処方法は記事からは判明せず。

スタートアップスクリプトを手動で実行したところ、普通にupしたので、docker containerが起動していなければスクリプトを再度実行するcronジョブを登録することで暫定対処した。

CentOS7のDocker構築ではまったこと

storage driverがdevice mapperの場合のディスク容量

device mapperの場合は、既定のディスク容量が10GBほどとなる。Oracle DatabaseのDockerコンテナをbuildするとこける。

storage driverを最初からoverlay2 にするための方法

インストール時にデバイスタイプにLVMを指定すると、Dockerのstorage dirverはdevice mapperになる。 docs.docker.com 基本ディスクを選んで、xfsを選んでやる必要がある。

さらに、CentOS7 1511(minimal)の場合は上記の手順でもやはりdevice mapperが既定となる。overlayを使用するための設定がされていないためと想像される。

docs.docker.com

CentOS7 1804(minimal)で基本ディスク(xfs)でインストールすれば、overlay2がstorage driverとして設定される。