.NET Tutorial - Hello World in 5 minutes から取り組みはじめてみました -- .NET 💜 Azure (2021/12/01)

https://qiita.com/advent-calendar/2021/microsoft

2021/12/01の記事です。
**先鋒をつかまつります。**
<font color="purple">$\huge{Hello\ World}$</font>

# はじめに
- 私は、[.NET](https://docs.microsoft.com/ja-jp/dotnet/)の初心者です
- 名乗るほどのものではございませんが、[TORIFUKUKaiou](https://twitter.com/torifukukaiou)と申します
- プレゼントカレンダーにのっかって、[.NET](https://docs.microsoft.com/ja-jp/dotnet/)をはじめてみようとおもいます
- その「はじめました〜」な事柄を書いていきます
- これからはじめてみよう！　という方にはすこ〜しくらいお役に立てる内容になっていると**おもっています**

# まず最初にしたこと
- **GA** -- イベントのタイトル「祝 .NET 6 GA！」にある**GA** -- 「が」「じ〜えい」って何だったけ？　を調べました
    - 前も調べたことあるんです
    - でもすっかり忘れてしまっていました
    - **General Availability**
- 「.NET MS Learn」こんな感じの単語で[Bing](https://www.bing.com/)ってみました
- :surfer::surfer_tone1::surfer_tone2::surfer_tone3::surfer_tone4::surfer_tone5:をして以下の2つのページにたどり着きました 
    - ①[.NET 開発者向けの Azure](https://docs.microsoft.com/ja-jp/dotnet/azure/)
    - ②[.NET Tutorial - Hello World in 5 minutes](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro)


![スクリーンショット 2021-11-06 22.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/ea5a3df3-2432-b57b-6af1-1a3d6ec4571a.png)

https://youtu.be/eIHKZfgddLM?list=PLdo4fOcmZ0oWoazjhXQzBKMrFuArxpW80&t=40

から引用させていただきます。
※各言語・フレームワーク等のロゴの権利はそれぞれの作成者に帰属しています


# [.NET 開発者向けの Azure](https://docs.microsoft.com/ja-jp/dotnet/azure/)
- 「.NET 💜 Azure」ということを知りました
- 確かに知りました
- :point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5: これ、私が勝手に言いだしたことじゃないんです
  - リンク先に飛んでいただければわかりますが、本当にそう書いてあります
  - ちなみに、https://docs.microsoft.com/en-US/dotnet/azure/ と英語の方をみると、「Know that .NET 💜 Azure.」と書いてあります
    - 訳すといった野暮なことはいたしますまい
      - 英語は英語のまま理解することを私は心がけています
- それでは早速、私の「**いち推し**」ポイントを発表します
- それはハートの色が💜であることです
  - 桑名 正博さんの名曲 :musical_note: [セクシャルバイオレットNo.1](https://www.youtube.com/watch?v=mCdbIwyVcuE)の紫であること
  - 位の高いお坊さんしか着れないのですよ、紫は
- このページはいろいろと内容豊富なのでいずれまた戻ってくるとして、帯の「.NET 💜 Azure」ということを知りました

# [.NET Tutorial - Hello World in 5 minutes](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro)
- .NET Tutorial - 5分でできるHello World
- まず最初に試してみる、そして記事にしてみるにはこのくらいの分量がよさそうです
- <font color="purple">$\huge{Hello\ World}$</font>
- Windows, Linux, macOSの3種類が用意されています
- どれでやってもいいのですがLinuxを選びました
- もちろん:bangbang::bangbang::bangbang:、LinuxはAzureの[仮想マシン(VM)](https://azure.microsoft.com/ja-jp/services/virtual-machines/)を使います
- では、さっそくはじめていきます
- Let's get started :rocket::rocket::rocket: 
- [仮想マシン(VM)](https://azure.microsoft.com/ja-jp/services/virtual-machines/)は以下のような構成で作成済としてはじめます

| 設定項目 | 値 |
|:-:|:-:|
| OS  | Ubuntu 20.04  |
| サイズ  | Standard B1s (1 vcpu 数、1 GiB メモリ)  |
| ストレージの種類 | Standard SSD   |
| スワップ領域 ([追加方法](https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-20-04-ja)) | 1GB |

ローカルマシンからsshで[仮想マシン(VM)](https://azure.microsoft.com/ja-jp/services/virtual-machines/)に接続しておきます。

```
$ ssh -i ~/.ssh/id_rsa azureuser@<仮想マシンのIPアドレス>
```

以下、[仮想マシン(VM)](https://azure.microsoft.com/ja-jp/services/virtual-machines/)上での操作です。

 
## [Download and install](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install)
- まずは`dotnet`コマンドが使えるようにインストールをします
- https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-

```bash
$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ rm packages-microsoft-prod.deb
```

```bash
$ sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-6.0
```



以上でインストールが完了しました。

```bash
$ dotnet --info
.NET SDK (reflecting any global.json):
 Version:   6.0.100
 Commit:    9e8b04bbff

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  20.04
 OS Platform: Linux
 RID:         ubuntu.20.04-x64
 Base Path:   /usr/share/dotnet/sdk/6.0.100/

Host (useful for support):
  Version: 6.0.0
  Commit:  4822e3c3aa

.NET SDKs installed:
  6.0.100 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.11 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.11 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download
```

**.NET 6.0**を使えるようになりました:tada::tada::tada:

## [Create your app](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/create)

```bash
$ dotnet new console -o myApp

$ cd myApp

$ cat Program.cs
```

```c#:Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
```

ちなみに`.NET 5.0.402`で試したときの`Program.cs`は以下のようになっていました。

```c#:Program.cs
using System;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

~~https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro~~
~~は、2021/11/07 09:43(JAPN)時点では、`.NET 5.0.402`と同じ形式でチュートリアルが書かれているので読み替えが必要です。~~
~~※読み替えと大げさに言うほどのことではありません。~~
※2021/11/10 22:05(JAPAN)では、チュートリアルは新しい記法で書き直されています :tada:

![スクリーンショット 2021-11-07 9.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/5dae4f94-8bf9-d33e-11f3-9dc3af0ad5ef.png)

_「[新しい C# テンプレートで、最上位レベルのステートメントが生成される](https://aka.ms/new-console-template)」より引用させていただいています。_


## [Run your app](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/run)

- 上の続きで`myApp`ディレクトリにいることが前提

```bash
$ dotnet run
Hello World!
```


<font color="purple">$\huge{Hello\ World!}$</font>
:tada::tada::tada:

## [Edit your code](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/edit)
- Program.csに一行書き足してみましょう
- 現在日時を表示する処理を追加しています
- 私はnanoコマンドを使って編集をしました
    - Ctl + o: 保存
    - Ctl + x: 終了

```c#:Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Console.WriteLine("The current time is " + DateTime.Now);
```

編集をして保存をしたら再びRun:rocket::rocket::rocket:してみましょう。
ここがこの記事のハイライトです。

```bash
$ dotnet run
Hello, World!
The current time is 11/10/2021 13:08:38
```

<font color="purple">$\huge{Hello\ World!}$</font>
と
<font color="purple">$\huge{The\ current\ time}$</font>
:tada::tada::tada:

### Tips -- [Visual Studio Code](https://code.visualstudio.com/download) + [Remote SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
- nanoを使って編集したと書きました
- [Visual Studio Code](https://code.visualstudio.com/download)に[Remote SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) Extensionを追加して、[Visual Studio Code](https://code.visualstudio.com/download)で編集するのは便利です
- 参考: [[VSCode] Remote-SSH でサーバ上のファイルを直接編集する方法](https://webbibouroku.com/Blog/Article/vscode-remote-ssh)
    - ありがとうございます！

## [Next steps](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/next)
- ここからが本番です
- 魅力的なコンテンツが並んでいます
    - [C# を使用して .NET アプリケーションをビルドする](https://docs.microsoft.com/ja-jp/learn/paths/build-dotnet-applications-csharp/?WT.mc_id=dotnet-35129-website)
    - [C# の最初のステップ](https://docs.microsoft.com/ja-jp/learn/paths/csharp-first-steps/?WT.mc_id=dotnet-35129-website)
    - [.NET 101](https://www.youtube.com/watch?v=eIHKZfgddLM&list=PLdo4fOcmZ0oWoazjhXQzBKMrFuArxpW80) :video_camera:
        - 101です
        - [:dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog::dog:](https://ja.wikipedia.org/wiki/101%E5%8C%B9%E3%82%8F%E3%82%93%E3%81%A1%E3%82%83%E3%82%93)
            - [101匹わんちゃん](https://ja.wikipedia.org/wiki/101%E5%8C%B9%E3%82%8F%E3%82%93%E3%81%A1%E3%82%83%E3%82%93)
        - [101回目のプロポーズ](https://fod.fujitv.co.jp/title/4177)
            - 僕は死にましぇん。僕は死にましぇん! あなたが好きだから、僕は死にましぇん。僕が、幸せにしますからぁ!
            - 話は飛びますが、私が最初に買ったCD(コンパクトディスク):cd:は[SAY YES](https://www.youtube.com/watch?v=Q9qAyt0G-jM)でした

今後、この辺はやっていきます! 
特に[.NET 101](https://www.youtube.com/watch?v=eIHKZfgddLM&list=PLdo4fOcmZ0oWoazjhXQzBKMrFuArxpW80)は「**One O One**」になにか縁のようなものを感じるので見てみようとおもいます。


# Wrapping up :qiitan::lgtm::xmas-tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::lgtm::xmas-tree::qiitan:
- **.NET is an open source developer platform for building different types of apps.**
- Know that .NET 💜 Azure.
- `dotnet new`(どっト ネッ　ぬぅ〜)コマンドでプロジェクトの雛形を作って、<font color="purple">$\huge{Hello\ World!}$</font>と現在日時を表示させることができました
- [.NET 101](https://www.youtube.com/watch?v=eIHKZfgddLM&list=PLdo4fOcmZ0oWoazjhXQzBKMrFuArxpW80)のYouTube動画は為になりそうです :rocket::rocket::rocket:
- その他、MS Learnに便利な学習教材がそろっているので一通りやってみるとよさそうな気がしています :rocket::rocket::rocket:
- 私の「**いち推し**」ポイントは次の2つです
    - "Know that .NET 💜 Azure."のハートの色が💜 
    - [.NET 101](https://www.youtube.com/watch?v=eIHKZfgddLM&list=PLdo4fOcmZ0oWoazjhXQzBKMrFuArxpW80) :video_camera: -- 101に縁を感じます
        - コンテンツが素晴らしいのでそれは当然のこと[^1]として、💜や101に目がいきました

[^1]: すんごいのにそのすごさを感じさせないすごさに、すごさを感じますという気持ちでいっぱいです

---

以下、おまけ。

# [Elixir](https://elixir-lang.org/)💜 
- 突然ですが、私は[Elixir](https://elixir-lang.org/)というプログラミング言語が好きです
- 同じく<font color="purple">$\huge{Hello\ World!}$</font>をやってみたいとおもいます
- 日本語では「不老不死の霊薬」と訳され、言語のロゴカラーは紫です

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/3ed276e9-21fc-8fe7-a70b-abb771c7d1af.png)

※各言語・フレームワーク等のロゴの権利はそれぞれの作成者に帰属しています

## Ubuntu 20.04へのインストール
- [asdf](https://asdf-vm.com/)を使います

```bash
$ sudo apt install build-essential automake autoconf git squashfs-tools ssh-askpass pkg-config curl

$ sudo apt install libwxgtk3.0-gtk3-dev

# Nervesのドキュメントには書いていないけど追加しておくと、あとでErlangのインストールでWARNINGがでない
$ sudo apt install libssl-dev libncurses5-dev default-jdk unixodbc-dev fop xsltproc libxml2-utils
$ sudo apt install libwxgtk-webview3.0-gtk3-dev

$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.0
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
$ source ~/.bashrc
$ asdf plugin-add erlang
$ asdf plugin-add elixir
$ asdf install erlang 24.1.4
```

:coffee::coffee::coffee::coffee::coffee:
ここが長いのでコーヒーでも飲みながら気長にお待ちください。

```bash
$ asdf install elixir 1.12.3-otp-24
$ asdf global erlang 24.1.4
$ asdf global elixir 1.12.3-otp-24
```

```bash
$ elixir -v
Erlang/OTP 24 [erts-12.1.4] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [jit]

Elixir 1.12.3 (compiled with Erlang/OTP 24)
```

:tada:
インストールすることができました。

## プロジェクトの作成

```bash
$ mix new my_app
```

## 編集
- `lib/my_app.ex`を開いてみてください
- 最初は以下のようになっているとおもいます

```elixir:lib/my_app.ex
defmodule MyApp do
  @moduledoc """
  Documentation for `MyApp`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> MyApp.hello()
      :world

  """
  def hello do
    :world
  end
end
```

`run/0`メソッドを追加してみます。
`/0`は引数が0個という意味です。

```elixir:lib/my_app.ex
defmodule MyApp do
  @moduledoc """
  Documentation for `MyApp`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> MyApp.hello()
      :world

  """
  def hello do
    :world
  end

  def run do
    "Hello World!" |> IO.puts()
    time = DateTime.now!("Etc/UTC") |> DateTime.to_string()
    "The current time is #{time}" |> IO.puts()
  end
end
```

## Run

```bash
$ cd my_app
$ iex -S mix
```

```elixir
iex> MyApp.run()
Hello World!
The current time is 2021-11-06 14:46:32.250499Z
:ok
```

:tada:
<font color="purple">$\huge{Hello\ World!}$</font>と現在日時を表示させることができました。

IEx(Elixir's interactive shell)の終了は、`System.halt()`を呼び出すか「Ctl + c」を2回押すかしてください。

## Next Steps
[Elixir](https://elixir-lang.org/)は多少の心得がありますので少し説明を続けます

### [|>](https://hexdocs.pm/elixir/1.12/Kernel.html#%7C%3E/2) -- パイプ演算子
- [|>](https://hexdocs.pm/elixir/1.12/Kernel.html#%7C%3E/2)はパイプ演算子と呼ばれるもので、前の計算結果を次の関数の第1引数にいれてくれます
- これがとっても便利なんです
- さきほどの`run/0`の中でもこそっと使っていますがそれほどよさは伝わらないのではないかとおもいます
- そこで今度は、`.NET`タグがついたQiitaの記事を[Qiita API](https://qiita.com/api/v2/docs)を使って取得してみます
- まずライブラリ([Elixir](https://elixir-lang.org/)の世界では[Hex](https://hex.pm/)といいます)を追加します
- `mix.exs`を以下の通りに編集します


```elixir:mix.exs
  defp deps do
    [
      {:httpoison, "~> 1.8"},
      {:jason, "~> 1.2"}
    ]
  end
```

そうしてコマンドラインにて

```bash
$ mix deps.get
```

を実行して依存関係を解決します。

`lib/my_app.ex`に`items/1`関数を追加します。

```elixir:lib/my_app.ex
  def items(tag \\ ".NET") do
    "https://qiita.com/api/v2/items?query=tag:#{tag}"
    |> URI.encode()
    |> HTTPoison.get!()
    |> Map.get(:body)
    |> Jason.decode!()
    |> Enum.map(& Map.take(&1, ["title", "url"]))
  end
```

引数`tag`にはデフォルト値で`".NET"`を指定しています。
引数無しで`items/1`関数を呼び出した場合は、`tag`は`".NET"`が束縛されています。
引数指定有りで`items/1`関数を呼び出した場合は、`tag`は指定された値が束縛されています。
プログラムの中身の説明をします。

- QiitaのAPIエンドポイントがありまして
  - |> GETするでしょ、**いつやるの？　今でしょ！**
  - |> bodyを取り出します、**いつやるの？　今でしょ！**
  - |> JSONデーコードするでしょ、**いつやるの？　今でしょ！**
  - |> そうすると各要素がマップのリストが得られるので、情報量が多いからとりあえずタイトルとURLだけにするでしょ、**いつやるの? 今でしょ！**

ってな感じの<font color="purple">$\huge{Awesome}$</font>なプログラムを書くことができます。
ちなみに[|>](https://hexdocs.pm/elixir/1.12/Kernel.html#%7C%3E/2)を使わずに書くとこんな感じになります。

```elixir
Enum.map(
  Jason.decode!(Map.get(
    HTTPoison.get!(
      URI.encode("https://qiita.com/api/v2/items?query=tag:#{tag}")),
    :body)),
  & Map.take(&1, ["title", "url"]))
```




プログラムを動かしてみます。

```bash
$ iex -S mix
```

```elixir
iex> MyApp.items()
...

iex> MyApp.items("Elixir")
...

iex> MyApp.items("autoracex")
...
```

たくさんの良い記事に巡り会えることでしょう :tada::tada::tada:

### オススメの書籍 :books: 
- [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/) -- オーム社
- [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021) -- インプレス

### Webアプリケーションを楽しむなら
- [Phoenix](https://www.phoenixframework.org/)

### IoTを楽しむなら
- [Nerves](https://www.nerves-project.org/)

### AIを楽しむなら
- [Nx](https://github.com/elixir-nx/nx) + [Livebook](https://github.com/livebook-dev/livebook)

### コミュニティ
-  [elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w) Slack workspaceに参加してみてください
    - マヂ、やさしい人ばっかりのコミュニティ
    - あなたの**困った**をきっと解決してくれるでしょう
- [NervesJP](https://join.slack.com/t/nerves-jp/shared_invite/zt-9vteokip-iVAqi8TkT0ID_uK9dSqVHA) Slack workspaceでは、[Nerves](https://www.nerves-project.org/)やIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
- たくさんのコミュニティがあります
    - @kn339264 さん作の素敵な資料をご紹介します
    - [Elixirコミュニティ の歩き方〜国内オンライン編〜](https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian) :clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:

![FCOvBkAUYAE6mL8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a277d0ea-2780-d9a3-4062-66d38b175125.jpeg)
@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

---

# おわりに

https://qiita.com/advent-calendar/2021/microsoft

<font color="purple">$\huge{Know\ that\ .NET\ 💜\ Azure.}$</font>
<font color="purple">$\huge{Hello\ World}$</font>

**たくさんの良い記事に出会えることを楽しみにしています** :tada::tada::tada: 

---

明日は、@up-hashさんの「[.NET6 が起動するまでのコードを追ってみよう](https://qiita.com/up-hash/items/87e98261bb026298f207)」です。
お楽しみに〜:tada::tada::tada: