プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Javaプログラマが今日から始めるC#ぼっち勉強会 その1

 話は聞いたぞ、人類 Javaは滅亡する!

 な、なんだってーーーー


 というわけで、Javaヤバイ ボラクル マジオニ と言いつつ既に数ヶ月。いい加減デブい重い腰を上げ、Javaから別言語への移行を本気で検討する必要があるでしょう。

 私の場合、殆どデスクトップアプリケーションにJavaを利用しています。今回の無償サポートを打ち切るというOracleの姿勢は、Web屋は急いでJavaから切り替える必要もないでしょうが、私にとっては割と直撃ダイレクトアタック攻撃なのです。


 

C#、キミに決めた!

 Javaから他のどの言語に移行するのかですが、無論JVM言語であるScala、Kottlin、Groovyは除外です。
 となると、基本的にはC++、C#、Rust、Go、JavaScript、Python辺りになるでしょう。

 Pythonは有力候補ですが、前にも言った様に型を明示しない言語は好きじゃない。(最低限関数の型ぐらいは書きたい) JavaScriptも同様。

 C++は普段から使っていますが、メインにするかというと、Javaというファイルや文字列の扱いやすいぬるま湯に浸かってきた私としては、メインにはしたくない。一度ファイルや文字列からC++のオブジェクト世界に入ってしまえば、そんなに苦は無いんですが、やっぱりそこが苦しい。UTF-8以外の文字コードがすべて滅べば良いのに。あと、filesystemはやく実装してくれぇ。Boostを使うとビルドに何をリンクすれば良いのかわかりにくいんだよなぁ。Mavenみたいに自動ビルドシステムがC++にも欲しい。そういやCONANはまだ使ったことない。

 Rustは今アツい言語ですが、ライブラリの数の不安や、学習コストの高さから、ひとまず移行する先としては除外しました。

 残るはGoとC#ですが、決め手はClojureでした。
 なんと、JVM言語のClojureってClojure CLRという.NET上でも動く実装があるらしい。Clojure Scriptは知ってたけど、Clojure CLRは知らなんだ。

 というわけで、どこまでClojure CLRと連携出来るか分かりませんが、.NET言語であるC#を学ぶことにしました。

開発環境

 普通に考えればVisual Studioなのでしょうが、Emacsキーバインドにするのが面倒くさい。
 ていうか、会社とかで使おうと思ったらVisual Studio Expressになってしまうので、何とか避けたい。最終手段にしたい。

 Emacs、ないしVisual Studio Codeで良い感じの開発環境を整えられないのか、ひとまず足掻いてみましょう。
 駄目だったらVisual Studioのキーバインドを泣きながらEmacs化する作業が待っています。(昔Emacsキーバインド化の拡張入れたらやたら不安定になって、削除した)

.NET Coreのインストール

Microsoft .NET

 .NET Coreと.NET Frameworkがあって、FrameworkはWindows専用。(GUIとかも作れる模様。)
 Linuxでも利用したいので一先ずは.NET Coreを選択してインストール。バージョンは2018年現在で最新版の.NET Core 2.1です。
 チュートリアルに従ってダウンロード&試しに動かしてみる。


f:id:nodamushi:20180721210435p:plain:w320
f:id:nodamushi:20180721210456p:plain:w320
f:id:nodamushi:20180721210556p:plain:w320

f:id:nodamushi:20180721210731p:plain

「dotnet run」って実行すると、Helo Worldが表示されました。無事動かせたようですね。

Javaとプロジェクト構成の違い:サンプルプロジェクトの作成

 MavenとかGradleなどでプロジェクトを作成するとsrc/mainとsrc/testが作成されて、一つのプロジェクトでメインコードもテストコードも両方管理しますね。

 しかし、.NETではそれぞれを別のプロジェクトとして作成し、それらのプロジェクトをソリューションという単位で管理するようです。
 EclipseのWorkspaceなどがソリューションに近いでしょうか。

 

 というわけで、最初のサンプルプロジェクトを作ってみました。

mkdir tmp
cd tmp
dotnet new sln
dotnet new console -o sample
dotnet new xunit   -o sampleTest
dotnet sln add sample sampleTest
cd sampleTest
dotnet add reference ../sample

 上記のコマンドは以下の様な意味になります。

  1. tmpディレクトリをソリューションとする。(dotnet new sln)
  2. コンソールアプリケーションプロジェクト sampleをtmpの下に作成する。(dotnet new console -o sample)
  3. xUnitテストプロジェクト sampleTestをtmpの下に作成する。(dotnet new xunit -o sampleTest)
  4. ソリューションに作成したプロジェクトを追加する。(dotnet sln add sample sampleTest)
  5. テストプロジェクトからメインのプロジェクトが見える様に参照を追加。(cd sampleTest→dotnet add reference ../sample)

f:id:nodamushi:20180722015109p:plain:w320

Emacsの開発環境: omnisharp-emacs

 例え不毛だったとしても、一先ずはEmacsでの環境を構築してみます。
 Emacs………というか、VimやVisual Studio Codeでもそうみたいですが、OmniSharpというスゴイナニカを介して補完候補表示や、リファクタリング等の機能を実現するようです。この辺はC++のirony-serverと同じ機構なのでしょう。

インストール手順

  1. package-install→omnisharpをインストール
  2. omnisharp-install-serverコマンドを実行してOmniSharpをインストール

 omnisharpの細かい設定は後々オレノサイキョー化するとして、一先ずはこの程度の設定で十分でしょう。

(use-package omnisharp
  :init
  (add-to-list 'company-backends  'company-omnisharp)
  (add-hook 'csharp-mode-hook
            (lambda ()
              (omnisharp-mode)
              (flycheck-mode))))

emacs-omnishaprを使ってみる

 で、先ほど作成したsample/sampleTestにあるC#ファイルを開きます。開いたらomnisharp-start-omnisharp-serverでOmniSharpを起動します。ソリューションファイルはtmpの下のtmp.slnを選択します。

 適当にプログラムを書いてみると、以下の図の様に、補完を表示したり、構文エラーの場所に破線が出たり、helmでどこから参照されてるかの一覧出したり、シンボル検索したり、中々リッチな環境です。

f:id:nodamushi:20180722021735p:plain:w320

f:id:nodamushi:20180722024750p:plain:w320

 しかし、Eclipse等の様に、エラーに対してどう修正すれば良いのか、までは提案してくれない。(※Visual Studioでもしてくれなかったわ)
 そして、正直ドキュメント書きにくい。Visual Studioみたく、///を書いたらparamとかreturnを自動生成して欲しい。summaryだけじゃ足りない。

 後、色々調べていると、omnisharp-unit-testとかいう関数を使ってる古い記事があるんだけど、そんな関数見つからない。どうすりゃいいの。
 仕方がないから、compileコマンドから"dotnet run"とか"dotnet test"で起動してみれば、まぁ、何とか起動は出来る。

f:id:nodamushi:20180722024318p:plain:w320

 とはいえ、ちょっとしんどい。
 Eclipseみたく現在開いてるファイルのmain関数を実行するとかも出来ない。
 なら、最低限replが欲しいので、Visual Studio Communityをインストールしたら入ったcsiをcomint-runで動かしてみたけど、文字化けするし、複数行入れると変になるし、あまり上手く動作してくれなかった。むぅ………


 というわけで、C#をEmacsで開発するのは、エディタとしてみると中々リッチだけど、IDEとしてみると不十分な感じです。



 ならば次はVisual Studio Codeかな………。明日へ続く。