Pdfをc#で作りたい

とあるシステムで帳票をテンプレートから生成する機能を作ろうと思ったので、
いろいろ調べていると、ThinReportsという便利そうなアプリがあることを知りました。

rubyがあれば使えるらしいのですが、せっかくなのでpdfを勉強してc#で
ThinReportsのテンプレートファイルから生成できるような仕組みを作りたいと考えました。
それがこれ(https://github.com/223n/PDFCnet)なのですが、
まだまだ足りない機能などがあり、かなり修正が必要だなぁと感じています。
また、AdobeReaderなどで開くと保存ダイアログが表示されてしまい、
正常に生成できていないと思われます。
いつかは完成させたいと思いながら、少しずつ頑張っていきたいと思います。

リリースで思うこと

ある開発者曰く

「テストを実施したソースコードが一緒であっても、新たにコンパイルしたファイルはダメだ」
とおっしゃいます。
まず、VisualStudioでは、Webであれば発行先ごとにプロファイルを作成して、
自動的に発行を行ってくれる機能がありますが、これは使えないことになります。
また、ClickOnceでは、テストと本番で設定を変えることがあり、
どうしてもコンパイルしなければならないため、使えません。
自動的にテストやコンパイルを行い、配置までしてくれるCIツールも
この意見では使えないものになってしまいます。
しかし、最初の原則を守ったままCIツールはどうしても使いたい。
コンパイルしたものをGitなどに上げて、
それを配置だけしてしまう、ということも考えられますが、
それではテスト機能というものが丸っ切り意味が無いようにも感じてしまいます。
しかも、この原則、少し困ったことになります。
Debugでコンパイルしたものはどうするのか?という問題です。
「本番前なんだからReleaseでコンパイルしたものを配置するに決まっている!」
などと言われそうですが、DebugとReleaseでテストと本番の挙動を制御している場合、難しいです。
「それを回避できるようにするのが開発者の役目!」とか言い出したら、
もう何のためのDebugとReleaseなんだよと言いたいですが…
どうしたものかなぁ。
(*結局のところ、ソースコードが一緒なら大丈夫!と誰かが大判をついてくれることを待っているようにしか見えないのですが…)
(*CIツール以前に、ClickOnceを使っている時点で、原則を破っていることになりますが)

テストコードの実装

テストコードはちょっとした修正結果の担保を簡単に取ることができる非常に心強い味方です。

しかし、テストコードをいざC#で書いていると、少し困ったことに遭遇してしまいました。

まず、現在のVisualStudioでは、テスト用のプロジェクトを作成して、対象のプロジェクトを参照します。

そのため、通常はテスト対象のメソッドなりプロパティは、外部から触れるpublicなどに限られてしまい、

privateは外部からアクセスしてのテストはできません。

(* 日本という国は恐ろしいもので、動的参照を用いて参照しているexeやdll内のprivateなメソッドやプロパティ、

フィールドを参照して書き換え、テストするぜヒャッハーな悪用できちゃうような技術を作ってしまう人も居るわけで…)

では、外部からアクセス可能な範囲でテストをしようとするのですが、

通常、publicを避けているのでテストしたいメソッドがprivateだったりして拡張メソッドや困ってしまいます。

(* 先の動的参照によるテストもありますが、動的参照はインテリセンスを殺してしまい、

非常に保守性が低下しがちで、誰も引き継げなくなってしまうという以前に、ナイワーを感じる今日この頃。)

自分自身、このテストの実装という経験や知識が弱いと感じているのですが、

いい資料はないものでしょうか…

Vagrantがrubyのエラーでpluginがこける件

windowsでvagrantが正常に動作しない問題の対応策についてのメモです。

以前、WindowsでVagrantのpluginをインストールして使用している際に、

なぜかrubyのエラーが発生してしまい、

vagrant upなどがコケてしまう問題に遭遇していました。

今回もその類でつまづいていたのですが、

どうやら原因は.vagrant.dフォルダまでのパスにあったようです。

◇原因◇

.vagrant.dフォルダまでに半角英数字以外の文字が含まれている。

◇確認方法◇

デフォルトの状態では、以下のフォルダにあります。

%HOMEPATH%

  1.  エクスプローラーを開く。
  2.  パスに「%HOMEPATH%」を入力する。
  3.  開かれたフォルダ名に半角英数字が含まれているかを確認する。
◇対応方法◇
  1.  エクスプローラーを開く。
  2.  パスに「%HOMEPATH%」を入力する。
  3.  「.vagrant.d」フォルダを、Cドライブの直下などに移動する。
  4.  「PC」もしくは「コンピュータ」を右クリックして「プロパティ」をクリックする。
  5.  「システムの詳細設定」をクリックする。
  6.  「環境変数」をクリックする。
  7.  次の変数を新規登録する。変数名: VAGRANT_HOME変数値: 4.で移動した先のパス (例. C:.vagrant.d)
  8.  再起動する。

◇その他◇

そもそも、同じMicrosoftアカウントを追加しているのですが、

デスクトップPCとノートPCで、ユーザーフォルダ名が異なるのでしょうか….

ここが疑問で、ノートPCは動くのにデスクトップPCは動かないという

よく分からない罠にハマってしまった訳ですが。

C#のobject型でBool型チェック

先日行われた2016年10月度の勉強会にて、
RubyやPythonでのbool型チェックが簡単にできないというネタがありました。

そこで、C#ではどうだったかなと思い試してみました。

// 実装

今回は、拡張メソッドでobject型にIsBoolというbool型かどうかを確認できるように実装してみました。

Ref. MSDN 拡張メソッド (C# プログラミング ガイド)
Ref. MSDN is (C# リファレンス)

public static bool IsBool(this object obj)
{
return (obj is bool);
}

さて、これで完成です。
実際に使う場合は、下記のようなコードになります。

object obj = new object();
bool result = obj.IsBool(); // false

// 実行結果

実際に実行してみた結果が下図です。

Bool型かどうかの判定

// まとめ

ということで、何もなく実装できてしまいました。

C#では、言語側で“obj is type”“objがnull以外でtype型と互換性があるかどうか”
bool型で返してくれるというありがたい機能が実装されているため、問題になりませんでしたが、
他の言語だとこういう問題もあるんだなと改めて言語間の違いを感じました。

わざわざ拡張メソッドなんて定義しなくてもよかったのですが、まぁ、何事も経験だと思いますで…

また、今回の実装によってobject型に対しても拡張メソッドが実装できる、
ということを新たに知ることができました。

今まで試したことがなかったのですが、これならあの忌々しいDBNullチェックも

obj.IsDBNull()

obj.IsDBNullOrNothing()

のように実装できるんですねぇ。

V130をアダプタモードで使用するにあたって

NTT V130をアダプタモードで使用したら、IP電話ができなくなった際のメモです。

* 数日ほど迷ったので、メモ

今回、家のルーターをNEC Aterm WG1800 HP2から、YAMAHA NVR510に変更しました。

その際に、NTT V130で使用しているIP電話が使用不可になりました。

“V130をアダプタモードで使用するにあたって” の続きを読む

【追記あり】Windows上のVagrantでPluginをInstallしようとするとこける件

どはまりしたので、解決メモ

# ホスト環境
Windows 10 x64

# Vagrant Version
1.8.4

# 状況

 vagrant plugin install vagrant-hostsupdater

 などのffiを使用しているプラグインのインストールを実行すると、
 vagrant upなどのコマンドを実行しようとすると下記画像のように、
 ffiのロードエラーでvagrantが実行できなくなる。

   CnERmGUVUAATdhC

# 解決方法

 1. Ruby をインストールする。
 2. Ruby2.DevKit をインストールする。
 3. Vagrant を再インストールする。
 4. 「C:\Users\$ユーザー名$\.vagrant.d」のフォルダを削除する

 
(2016/08/08 00:06追記)
プラグインのインストールは完了しました。
が、プラグインの実行でコケてます…うーん

DataGridViewを改造してみる

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみた話です。

DataGridViewを少し改造してみました!という小ネタです。

000003

Source:  https://github.com/223n/HiStudy/tree/master/MergeGridView2

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみました。

プロジェクトには、MergeGridView2とSampleの2プロジェクトが含まれています。
MergeGridView2は、改造したGridView本体があり、
Sampleでは、MergeGridview2を実際に配置した結果です。

CellPaintイベントやPaintイベントをトリガーに、
UpdateHeaderメソッドでは、列ヘッダを描画しており、
UpdateCellメソッドでは、行ヘッダを描画しています。

ところで、この記事を書く際にVisualStudioを更新したり再起動していたのですが、

123

なんと、メソッド等の1行上に参照数と、参照状況が確認できる機能が自動更新で追加されていたようです。

拡張メソッドの実装について

VB.NETとC#での拡張メソッドの実装方法について

とあるプロジェクトに参加している際に、以下のようなクラスがありました。

CommonExtentionClass

「やべぇ、ちゃんと拡張メソッド使ってやがる!!(VB.NETで)」
という興奮も束の間

Public Shared Function TimeToInt(ByVal pDate As Date) As Integer

それ、拡張メソッドちがうよ… (´;ω;`)

ということで、おさらいも兼ねて、VB.NETとC#での拡張メソッドの実装方法について書いていきます。

参考資料は以下のMSDNをご参照ください。

Ref. 拡張メソッド (Visual Basic) – MSDN

Ref. 拡張メソッド (C# プログラミング ガイド) – MSDN

“拡張メソッドの実装について” の続きを読む