2016年5月16日月曜日

ClosedXML XLColorの色の一覧

ClosedXMLのXLColorおよびXLThemeColorの定義と実際の色の一覧表。
XLThemeColorはXLColor.FromTheme(XLThemeColor)を使用して出力。

無色がない。無色にしたい場合はどうすればよいのか・・・?


2016年4月1日金曜日

DB設計 連番は自動採番か手動採番か

連番を取得したい場合
・自動採番(mysqlでいうauto increment)
・手動採番(max(xxx) + 1)
どちらを選択すべきか?
というのを今の時点の判断基準を残す。

・親子関係等がない単一テーブルの場合
 自動採番

・親子関係がある場合
 手動採番。ただし、親テーブルの件数が多い場合は自動採番のほうがよいかも?


親子関係がある場合に手動採番にする根拠

 自動採番時の登録手順

  1. 親テーブルを登録(この際、自動採番される)
  2. 親テーブルを検索して連番の最大値を取得
  3. 子テーブルを連番を使用して登録


 手動採番時の登録手順


  1. 親テーブルを検索して連番の最大値を取得
  2. 親テーブルを連番をしようして登録
  3. 子テーブルを連番をしようして登録


手動採番のデメリットは連番の管理を自分でしなければいけないこと。
最大値+1や0件時のnull→1変換など。

その点、自動採番の場合はDBが処理してくれるからデメリットらしいデメリットはない。
が、登録処理中に検索処理が発生してしまう気持ち悪さがある。

と思って他の人に聞いてみた。

・やはり登録中の検索は気持ち悪い。
・その気持ち悪さは手動採番で代替可能である。
・単純に1テーブルだけに着目した場合、確かに手動採番は手間がかかる。
 しかし、同様の採番処理が他のテーブルでも発生した場合に共通化が可能。
 採番テーブルを作成するなど、既存のテーブルに変更は発生させずに採番仕様を統一できる。
・親テーブルの件数は?→今回は少ない。であれば、自動採番のコストはたかが知れている。

親テーブルの件数という観点は抜けてたな・・・

あと、自動採番の別の手法として、子テーブルのトリガーで親テーブルの連番最大値を取得設定という方法も見つけたけれど、これは回りくどいよね。

2015年11月19日木曜日

DB設計 PKは複合キーかサロゲートキーか?自分なりの判断基準。

PKを複合キーにするか、サロゲートキーにするか。
今後迷った時のために、現時点での自分なりの判断基準を残しておこう。

複合キーを許可するのは以下を全てのいずれかを満たす場合のみ。
1. PKが(将来的にも)変更されないこと。
2. 最終テーブルであること。
3. トランケートされるテーブルであること。 // 2016/01/29追加

根拠
1. PKが(将来的にも)変更されないこと。
F/Wが推奨していない場合もある。
規約としてPKの変更は不可としているプロジェクトがある。
その場合、更新処理なのにdelete/insert処理することになる。
関連する全テーブルの更新も発生する。

(将来的にも)と書いたのは、開発時点では変更されない予定だが、バージョンアップにより変更される可能性を考える必要があるから。

例えばグループ内の項目を一覧表示する場合で、テーブルにグループIDと項目表示順を持っている。
開発時点で「表示順の変更はないと聞いていたから、PKをグループIDと表示順にしました。」
みたいな。
バージョンアッップで「やっぱり表示順変更したいよね。」となったら辛い。

この場合はPKをグループIDと項目ID(ただの連番)とし、表示順はただの項目にすることで防げる。
将来を見据えて、PKの変更が発生しそうな所は事前に潰すこと。


2. 最終テーブルであること。
PKを他のテーブルで参照している場合、テーブルの項目が増えるので。
1テーブルのPKだけならまだいいけれど、大抵は複数テーブルへのキーを持っているし。
結合キーが増えるだけ間違いは起きやすい。

PKでの他テーブルへの結合がない、ぼぼ単独で存在するテーブルならOK。
例えば帳票出力のためのワークテーブルとかかな。

3. トランケート後にデータを再投入する際、サロゲートキーが振りなおされるため。
自然キーに対するPKが変更されてしまう。

ex)
事前データ
サロゲートキー, 親キー, 子キー, 名称
1, A, a, 名称A-a
2, B, b, 名称B-b

トランケート後にデータ再投入
サロゲートキー, 親キー, 子キー, 名称
1, A, a, 名称A-a
2, A, b, 名称A-b
3, B, b, 名称B-b

サロゲートキー=2のデータが変わってしまうため、関連するテーブルに影響がでる。

2015年8月1日土曜日

MySQL FEDERATEDエンジンの使い道を考える

http://thinkit.co.jp/free/article/0608/1/5/

FEDERATEDエンジンはトランザクションがサポートされていない以上、更新系には使えないと考えてよいと思う。
即時反映によりミラーみたいな感じで使えるかもと思ったけど、それだってトランザクション管理できないと何かあったときに不整合が起こるし。

負荷分散とかに使うとか書いてあるところもあったけど、リモートテーブルとFEDERATEDテーブルが1対1でしか作成できないから、それで負荷分散になるの?

検索に使用するなら、複数のDBを検索する場合にそれぞれのDBに接続→検索を繰り返す必要があるけれど、FEDERATEDを使用すれば表面上はDBへの接続は1回ですむから便利。
対象DBが1つなら、そもそもFEDERATEDを使う意味はないと思う。直接対象DBに接続すればよいだけだから。

検索に使用するなら、リモートテーブルをあたかも自身のテーブルとして扱うことができるので、join等が発生するケースなら便利。

更新がなく複数DBを使用した検索系のみのシステムとなると、情報の分析システムとかなら使えるのかも。
分析システム用DBを作ってFEDERATEDエンジンを使用して、複数の登録更新系システムのDBの情報を取得する。
DWHのようなシステムでなら使えるのかも。

・余談1
FEDERATEDエンジンがトランザクションをサポートしてないと知って茫然としていたとき、Sipderエンジンなるものを発見。
トランザクションもサポートされているようだし、パーティションという考えでこれぞ負荷分散という感じ。
こっちのほうが便利な気がする。
ただし、ドキュメントがあまりないし、MySQLが標準ではサポートしてないから導入するにはハードル高い。
MariaDBならSpiderエンジンがバンドルされるみたい。いいなぁ。

・余談2
Windows7にインストーラを使用してMySQLをインストールすると、FEDERATEDエンジンが使用できなかった。
試しにバイナリを配置すると使用できた。
原因不明。

2015年6月22日月曜日

ClosedXMLってスタイルのコピーはできないの?

IXLRow.CopyToを使うと値のコピーはできるんだけど、背景色や罫線とか書式とかまではコピーしてくれないのかな。
InsertRowsBelowで追加した行に対して上記をやってみたのだけれど、背景色なし、罫線なし、書式も標準になってて困ったもんだ。
ExcelWriterだったか、他のExcel系ツールだとそのあたりも一緒にコピー出来たことあったんだけどなぁ。

行ごとにいちいちスタイルを設定しなきゃいけないんだろうか。
面倒だな。。。

2015/08/01 追記
コピー元の行を削除すると、コピー先の書式等が解除されてるみたい。

たとえば一覧形式のExcel帳票で2件のデータ行を作成する場合。
1行目:ヘッダ行
2行目:テンプレート行
こんな感じのテンプレートが存在したとして。

失敗例
1. 2行目をコピーして、3行目4行目にデータ行を作成。
2. 2行目を削除。
これだと2行目を削除した時点で3行目4行目の書式等が解除される。

成功例
1. 2行目をコピーして、3行目を作成
2. 2行目3行目にデータを設定
テンプレート行をそのままデータ行として使用する。行を削除しなければ3行目の書式も生きている。

一応成功はしたけれど、どうなんだろうこれ。

2016/06/22 追記
テンプレート行削除時に、他の行のスタイルが解除されるということは、
そういうこと(スタイルの流用)はするなということかなと結論。

セル(または行、列、範囲)毎に個別にスタイルを設定するほうがよいのであろう。

2015年6月10日水曜日

10年も間があるとさっぱりわからんなぁ

久々にLinuxやってるけど、コマンドが変わりまくってる。
パッケージ管理がrpmからyumていうのになってるし、iptablesよりfirewallになってるし。
当時はiptables万歳的な感じだったのになぁ。

CentoOSも6と7で色々コマンド違うし。。。
少しずつ覚えていかんとなぁ。

2015年6月7日日曜日

pingが通らない

Wiindows→CentOSのping結果


ping 10.0.X.X

10.0.X.X に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。

10.0.X.X の ping 統計:
    パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)

CentOS→Windowsは通るのになぁ。

そういえばDHCPで変なIPが割り振られてる。。。10.0.X.X。。。こんなIP見たことないなぁ。
ゲートウェイが192.168.X.XでVAIOさんのIPも192.168.X.Xなのに。
ゲートウェイのIPとDHCPで振られるIPには関連は無いのか?

試しにCentOSを192.168.X.Xに固定→再起動してみた。
CentOSからネットワークに接続できなくなった。
ゲートウェイにすらping通らない。。。

なんだこれ。

-- 追記 --
できた。
参考にしたページ
https://blog.apar.jp/linux/402/
http://vboxmania.net/content/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A

VirtualBoxのネットワークアダプタの設定がNATだとホストOSとの通信ができないのか。
ホストOSとは別のネットワークになるのか。

今回はホストOSと同じネットワークに別端末として配置したいので「ブリッジアダプター」を選択。


割り当てでブリッジアダプターを選択


ほいでCentoOSを見てみるとIPが192.168.X.Xになってることを確認。
いざWindows→CentOSのpingを。

192.168.X.X に ping を送信しています 32 バイトのデータ:
192.168.X.X からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.X.X からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.X.X からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.X.X からの応答: バイト数 =32 時間 =1ms TTL=64

192.168.X.X の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

オッケー!!

が、Windowsのエクスプローラーからは見れない。
SAMBAは入れたはずなのに。。。