C#問題集をGitBookにまとめてます

こんにちは。

先日、C#の問題を投稿していましたが、良い機会なのでGitBookでまとめることにしました。

https://223n.gitbook.io/csl/

この問題集は、自分がC#の勉強をする際につまづいたり、ほかの方に教えていた際に困っていたところなどをメモしていたのを問題集にしています。

なるべく細かい解説を入れるようにしていますが、誤っていたらGitHubのリポジトリにIssueを送っていただければと思います。

今後もよろしくお願いします。

certcheck released

今回、初めてgo言語による証明書の有効期限チェックを行い、Slack通知してくれるプログラムを作成しました。

Github 223n/certcheck

有効期限の残日数が指定日数未満になった際に、Slackに投稿されます。
まだ、機能不足などがあると思いますが、Issueで投稿して頂ければと思います。

Avaloniaを使ってみる

Ⅰ.Avalonia

Avaloniaは、「マルチ・プラットフォーム .NET UI フレームワーク」ということで、C#によるXAML形式でアプリ開発が出来るフレームワークです。

Avalonia – GitHub

Ⅱ.導入方法とプロジェクトの作成方法

※ここでは、Visual Studio 2017 Version 15.8.4で解説しています。

1.画面から「ツール(T)」→「拡張機能と更新プログラム(U)…」をクリックします。

Visual Studioのメイン画面

2.「オンライン」を選択します。

3.右上の検索ボックスに「Avalonia」を入力します。

4.「Avalonia for Visual Studio」を選択します。

5.インストールをクリックします。

6.「Visual Studioの再起動」が促されますので、一度、Visual Studioを終了して再起動します。

拡張機能と更新プログラム

7.新しいプロジェクトを開くと、「Visual C#」に「Avalonia」が追加されます。

8.「Avalonia Application」もしくは「Avalonia MVVM Application」を選択してプロジェクトを作成します。

新しいプロジェクト

後は、作成できたプロジェクトを元に開発を進めていくのですが、まだXAML開発はやったことがないため、少しずつ勉強しながらやりたいと思います。

RVMでrubyをインストールしたのにrubyが認識されない

RVMを公式サイトのやりかたを見ながらインストールしたのですが、
なぜかrubyを動かそうとすると、そんなコマンドは無いと言われました。

今回は、この対応メモです。

223n@ja223n:~$ ruby -v
bash: ruby: コマンドが見つかりません

PC: DELL Inspiron 14
OS: Debian 9 (stretch) 64bit

223n@ja223n:~$ rvm install ruby-head
Warning, new version of rvm available '1.29.4', you are using older version '1.29.3'.
You can disable this warning with: echo rvm_autoupdate_flag=0 >> ~/.rvmrc
You can enable auto-update with: echo rvm_autoupdate_flag=2 >> ~/.rvmrc
Checking requirements for debian.
Requirements installation successful.
Installing Ruby from source to: /home/tatami/.rvm/rubies/ruby-head, this may take a while depending on your cpu(s)...
Cloning from https://github.com/ruby/ruby.git, this may take a while depending on your connection. 
HEAD is now at 297ae3437e mjit.c: clean up unit link from iseq
From https://github.com/ruby/ruby
* branch trunk -> FETCH_HEAD
Already up-to-date.
git checkout trunk
Copying from repo to src path...
ruby-head - #autoreconf.
ruby-head - #configuring.................................................|
ruby-head - #post-configuration..
ruby-head - #compiling...................................................-
ruby-head - #installing...............
ruby-head - #making binaries executable..
Installed rubygems 3.0.0.beta1 is newer than ignore provided with installed ruby, skipping installation, use --force to force installation.
ruby-head - #gemset created /home/tatami/.rvm/gems/ruby-head@global
ruby-head - #importing gemset /home/tatami/.rvm/gemsets/global.gems.......
ruby-head - #generating global wrappers........
ruby-head - #gemset created /home/tatami/.rvm/gems/ruby-head
ruby-head - #importing gemsetfile /home/tatami/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-head - #generating default wrappers........
ruby-head - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-head - #complete 
Ruby was built without documentation, to build it run: rvm docs generate-ri

さらに、Useコマンドを実行したところ、なにやらおかしなことを言われます。

223n@ja223n:~$ rvm use ruby-head
RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for a example.

確かに、 /bin/bash –login を実行すると、rubyは正しく動くようです。
参照関連が正しく設定されていないと思い調べたところ、こちらの記事を見つけました。

RVM 経由で Ruby を入れるときにハマったこと / tsujimotterのノートブック

記事にもあるとおり、以下のコマンドを実行する必要があったみたいです。

source ~/.rvm/scripts/rvm

今回は、~/.bashrcの最後に上のコマンドを追加して、正常に動くことを確認しました。

Oracle.DataAccessでパラメータエラーが発生する

Oracle.DataAccess.dll (Oracle 12c版)を使ってSQLを発行している場合に以下のようなエラーが発生します。

パラメータ・バインディングが無効です
パラメーター名:その他

このエラーですが、SQLのコメントに「:」を含む場合や、「/* */」でコメントを書いており「/」がコメント内にあり「:」がある場合などに、パラメータと誤認してArgumentExceptionエラーが発生するようです。

全角の「:」にする、「/」を削除するなどの対策が必要です。

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を使っている時点で、原則を破っていることになりますが)