一人情シスのつぶやき

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

テーブル定義の移行でよく使う方法

社内DBを試行錯誤しているため、DB間データ移行の前段としてテーブル定義をコピーしたいことがある。 大抵のDBでは無料でもツールが充実しており、ODBCライブラリを入れればよっぽど問題ないと思うのだが...

Windows 10 Pro 64bitで、SSMSからOracleにアクセスしようとしたところ、どうにもエラーでうまく行かない。64bitのInstant Client + ODBCをインストールし、OSのODBC管理ツールでテスト接続は成功しているのだが...

で、こういう時はAccessODBC経由でリンクを貼る分にはまず失敗しない。この状態でテーブルをAccessにテーブル定義のみコピーし、そのAccessのテーブルをSSMSでインポートするとうまくいく。

redmine, zabbixのActive Directory(LDAP)認証

redmine, zabbix共にActive DirectoryLDAP機能を利用して認証の統合ができる。が、設定方法が引っかかった。

redmineはアカウントごとに認証方式の設定が可能。「管理」の「LDAP認証」にAD認証の設定をしたうえで、AD認証したいアカウントを作成して認証方法をADと指定してやればよい。

一方、zabbixは認証方法を変えるとそれが全ユーザーに適用される。ユーザーグループごとに認証方式が指定できるのだが、既定では「デフォルト」となっている。 認証を変えると、この「デフォルト」の認証方式が変わるので、結果として全ユーザーグループの認証方式が変更されてしまう。なので、「Zabbix administrators」グループの認証方式を事前にローカルに変更しておく必要がある。

だが、インストール時に作成される管理者アカウントでログインした状態だと、この「Zabbix administrators」グループの認証方式を変更できない。自分、及び自分のプライマリグループに関する情報は変更できないらしい。なので、別のユーザーグループを作成し、そこに所属するアカウントを作成。アカウントに「Zabbix特権管理者」権限を付与。そのアカウントでログインして「Zabbix administrators」グループの認証方式を「Zabbixデータベース内のユーザー情報」に変更する、という手順を踏む必要がある。 zabbixめんどい。

ClosedXMLの画像追加におけるWorksheetの取り扱いについて

C#でClosedXMLを使用してExcelに画像を追加する処理をしていた際、なぜかWorkbookの保存時にObjectDisposedExceptionが発生するという事態になりました。

以下のようなコードです

            using (XLWorkbook wb = new XLWorkbook(filePath))
            {
                IXLWorksheet ws_src = wb.Worksheet("Template");

                using (IXLWorksheet ws = ws_src.CopyTo("1"))
                {
                    var image = ws.AddPicture(imagePath1);
                    image.MoveTo(ws.Cell(3, 3).Address);
                    image.Scale(.5);

                    image = ws.AddPicture(imagePath2);
                    image.MoveTo(ws.Cell(20, 3).Address);
                    image.Scale(2);

                }

                using (IXLWorksheet ws = ws_src.CopyTo("2"))
                {
                    var image = ws.AddPicture(imagePath3);
                    image.MoveTo(ws.Cell(3, 3).Address);
                    image.Scale(.5);
                }

                ws_src.Delete();

                wb.Save();
            }

wb.Save() を実行すると例外が発生します。imageの処理をコメントアウトするとエラーは発生しません。

結論として、Worksheetを割り当てるusing句を外したところ、正常に動作するようになりました。エラー調査の際にOpenXMLのコードもちらっと見たのですが、おそらく画像を追加する際にいったんWorksheetの情報を更新して再割り当てするような処理が必要となります。usingを使っていると再割り当てができないのでエラーになったのではないかと。

ただ、エラー箇所がusing句の中ではなく、Saveを実行した場所というのはよくわからないのですが... 再割り当てできない状態で内部変数をいろいろいじくって、それをファイルに保存する際にそれが検知されてエラーとなる、とかではないかと。

ClosedXMLのサンプルコードを見ていると、Workbookにusing句を使用するものはあるが、Worksheetに使用するものはほとんどない。WorkbookのDisposeで配下のすべてのリソースが解放されるので不要なのだろう。上記書き方が一般的ではないのかも。

MySQL Workbenchに切り替え

前回の記事で、HeidiSQLがうまく動作しない(DEFAULT CURRENT_TIMESTAMPを表示できない)件で、クライアントをMySQL Workbenchに切り替えた。

実は以前も試していたのだが、ホスト名のみで指定した場合に、Test Connectionは成功するのに実際に接続する際にエラーで落ちてしまっていて中止していた。IPアドレスで指定したところ正常に動作したので、こちらに切り替えることにした。

HeidiSQLがDEFAULT CURRENT句を認識しない

社内データベースをMariaDBで構築しており、Windows 10からHeidiSQLにてアクセスしているのだが、TIMESTAMP型の列にDEFAULT CURRENT_TIMESTAMP を設定すると、更新は成功するのだが、画面上表示されない。コメントまで表示されなくなる。

値が設定されていないわけではなく、

show full columns from テーブル名

で確認するとちゃんと設定されているので、別画面で確認しながら進めないといけない。めんどい。

OS: Windows Server 2008 R2 SP1 MariaDB: 10.2.9 HeidiSQL: 9.4.0.5125

本家のForumを見ると、2件同様の報告が上がっているが、コメントがついていない。 別のツールに切り替えるか。

中年プログラマーの気概

ネガティブな話から始まりますが...

作者は来年で40になります。 Software DesignやWeb DB Pressなどの雑誌を見ていると、自分より若いと思われる人の記事が圧倒的に多くなってきました。 技術・スキルが優れていれば年齢など関係ないことはわかっているのですが、ちょっとした疎外感を感じたりします。

私が新卒入社した際には、ウォーターフォール開発全盛で記事も40~50代のものが多かったような気がします。Web系の技術は特に技術の進歩が早く、若い人ほどキャッチアップしやすいという状況はあるように思います。

ですが、IT技術が好きという気持ちは今でも変わりませんし、幸い(?)まだまだコーディングに携われますし、それなりの権限を持って作業ができるポジションにいます。 今の自分のポジションでしかできないことを行い、発信していこうと思います。定年までには雑誌に記事1本載せて見たい!!

.Netプログラムの配布

今さら、とは思われるとは思いますが...

当社の社内システムは、外部業者に保守を依頼している販売管理システムとパッケージの会計システムを除いて、はほぼAccessでした。データもファイルに含んでいるタイプ。 なので、各自ファイルをデスクトップにコピーするとデータが共有できなくなるので、ファイルサーバにファイルを置いて、各自が直接実行する形で利用していました。たまに動作がおかしくなったのは、同時起動でファイルが壊れたりしたのではないかと思ってます。

現在、社内システムをC# + RDBMS(SQL Server, MariaDB)に移行中。 上記の感覚で、C#のプログラムは、dllも含めてファイルサーバに置いて、各自直接実行してもらってました。さすがに動作がおかしくなることはないのですが、dllも含めて手動で配置しないといけないとか、ファイルサーバの場所を忘れると実行できないとか、いまいちだな~と思ってました。

そう、ClickOnce。 プロジェクトの設定にて「発行」の項目でファイルサーバを指定して発行すれば、インストーラが生成され、それをインストールしてもらえば以降はスタートメニューから起動可能。バージョンアップ時の更新も勝手に検知してやってくれる。最高!!

10年遅れ? でMicrosoftさんの素晴らしさを実感しました。