ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

Java/Pythonプログラマの自分が今からC#を学ぶ価値があるかどうかを検討する

f:id:piro_suke:20180416234346j:plain

WindowsのGUIアプリとして作りたいものがいくつかあって、

PythonのGUIライブラリを

いくつか(PyQtとかwxPythonとかKivyとか)試してみたけどしっくりこず、

やっぱりWindows用アプリを作るなら.NETじゃない?

ということでC#での開発について調べている。

今まで「Windows限定でVisualStudioがないと開発できないJavaみたいな言語」という、

汎用的じゃないイメージがあって避けていたのだけど、

調べてみると.NET CoreとかLinuxでも動作するCUIアプリを開発する仕組みもあって、

興味が湧いてきた。

新しい言語を学ぶならメイン言語にする価値があるものが良いので、

自分がプログラミング言語に求めることが一通りできるかどうか、調べてみた。

プログラミング言語に期待することは

個人的にプログラムを書く際によく利用している技術やライブラリを思い出しつつ、

簡単に実現できるようになっててほしいことを洗い出してみた:

  • テキストエディタとシェル(コマンドプロンプト)で開発できること
  • 実行環境の起動が遅くないこと
  • サードパーティライブラリ管理機能があること
  • サクッと作って実行可能なスクリプトが書けること
  • リスト内包表記的なリスト処理ができること
  • PostgreSQLに接続できること
  • Excel操作できること
  • SSH接続とトンネリングができること
  • Webスクレイピングができること
  • Web APIに接続できること
  • Apacheで動作するWebアプリを開発できること
  • データ分析・機械学習ができること
  • iOS用アプリを開発できること

テキストエディタとシェル(コマンドプロンプト)で開発できること

ちょっとしたデータ変換がしたい時にIDEを起動せずにプログラムを書いて実行したい。

VisualStudio無しでビルドや実行ができるかな、と調べてみたら

「.NET Core SDK」で実現できるようになっていた。

これはJavaでいうJDK的なもので、VisualStudioに含まれているものを使うか、

下記のサイトからダウンロードして単体で使用することもできる。

www.microsoft.com

インストールすると、下記のような感じでビルド・実行できる

コンソールアプリ用プロジェクトの作成

dotnet new console -o TestConsoleApp

プロジェクトをビルドする

dotnet build

プロジェクトを実行する

dotnet run

なんとLinuxやMac用のSDKもあり、クロスプラットフォームなアプリが開発できる。

サクッと作って実行可能なスクリプトが書けること

いちいちプロジェクトを作らず、

Pythonみたいにスクリプトを1つ書いて実行して終わり、

みたいな感じで使いたい。

ありました。C#スクリプト(.csx)

www.buildinsider.net

csiコマンドで実行できる。

実行環境の起動が遅くないこと

これはもう少し試してみないと分からない。

今のところ、そんなに速くないけど、そんなに遅くない感じ。

サードパーティライブラリ管理機能があること

PythonのpipやNode.jsのnpmみたいな、

サクッと必要なライブラリを導入して使える環境が欲しい。

あった。そりゃあるか。NuGet。何の略かは分からない。

NuGet Gallery | Home

VisualStudio経由でも、.NET Coreのdotnetコマンド経由でも使える。

dotnetコマンドは下記のように使用する。

dotnet add package パッケージ名

リスト内包表記的なリスト処理ができること

期待してなかったのだけど、できるっぽい。

var evens = from n in numList where n % 2 == 0 select n;

これはLINQのクエリ構文というもので、コレクションをSQL風に処理できるらしい。

まだ触ってないけど、これだけでC#好きになれそうな気がする。

PostgreSQLに接続できること

PostgreSQL好きなので、SQLServer以外にも接続できることを一応確認しておく。

www.buildinsider.net

できる。

Excel操作できること

マイクロソフト製なのだからネイティブな感じでできるだろう、

と思ったら、こちらのサードパーティ製のライブラリが使いやすいらしい。

github.com

SSH接続とトンネリングができること

DBを扱うような開発ツールを作る時用に、

SSHトンネリングができるかどうかを確認しておく。

あった。

github.com

Web APIに接続できること

HTTPクライアントライブラリはチェックしておかないと。

色々あるけど、HttpClientクラスを使うのがよさげ。

HttpClient クラス (System.Net.Http)

Webスクレイピングができること

この辺は、どの言語もいくつか選択肢があるイメージ。

最初に見つけたやつ。

qiita.com

Apacheで動作するWebアプリを開発できること

これはIISがあるので無理だろうと思ってたのだけど、

.NET Coreに ASP.NET Core というのが含まれていたので、調べてみたらできそう。

docs.microsoft.com

素晴らしい。

データ分析・機械学習ができること

検索してみると、Accord.NETというライブラリがよく利用されてるっぽい。

Introduction - Accord.NET Machine Learning in C#

iOS用アプリを開発できること

これも期待してなかったのだけど、

Xamarin.iOSで提供されてるSDKで開発できるみたい。

docs.microsoft.com

何でもできるな。

おわり

C#は思ってたより柔軟に書けるようになってるし、

クロスプラットフォームで開発できるし、

ということでかなり興味が湧いた。

起動速度とかは試してみないと分からないけど、

これでGUIアプリがほかの言語より簡単に作れるなら、

学ぶ価値ありそう。

More Effective C# 6.0/7.0

More Effective C# 6.0/7.0