whileD'iary

日記とか

docker使ってC#書いてみた

はじめに

adventar.org

このアドベントカレンダーの19日目の記事です

前回はかがりさんだったのですが、ちゃんと読んだ本をアウトプットしててすごいなと思いました

今回は最近やったこととして、dockerでサクっとC#を書いたという話です

dockerということなので今回はMonoを使用してみました

docker

$ docker run -it mono /bash/bin
$ apt update
$ apt install vim

Mono公式がDockerイメージを配布するのでありえん楽ですね

とりあえずこれでコンテナ内でC#コンパイルと実行ができます

本当は外部ファイルをコンパイルと実行をできるようにしたかったけどよくわからなかったのでやめました

わかる方は教えてください

C

とりあえず車輪の再発明ですがかんたんにスタックを実装

using System.Collections.Generic;
using System;

namespace Info.Whiled {
  class StuckTest{
    public static void Main(){
      Stuck<string> stuck = new Stuck<string>();
      stuck.Push("vim");
      stuck.Push("c#");
      
      Console.WriteLine(stuck.Pop());
      Console.WriteLine(stuck.Pop());
    }
  }
  
  class Stuck<Type> {
    private List<Type> list = new List<Type>();

    public void Push(Type data) {
      list.Add(data);
    }

    public Type Pop() {
      Type data = list[list.Count-1];
      list.RemoveAt(list.Count-1);
      return data;
    }
  }
}

コンパイルして実行

$ mcs Stuck.cs
$ mono Stuck.exe
> c#
> vim

本当にC#コンパイルして実行できた、とか言ってた気がします

次にエラトステネスのふるいを実装

こちらはとりあえず言語触るたびに書いてたのですんなり

特有の構文もいりませんし

using System;

namespace Info.Whiled {
  class Era {
    public static void Main(string[] args){
      bool[] bools = new bool[101];
      for(var i=2; i<bools.Length; i++) bools[i] = true;

      for(var i=2; i<bools.Length; i++){
        if(bools[i])
          for(var j=i*2; j<bools.Length; j+=i)
            bools[j] = false;
      }

      for(var i=2; i<bools.Length; i++){
        if(bools[i]) Console.WriteLine(i);
      }
    }
  }
}
$ mcs Era.cs
$ mono Era.exe
2
3
5
7
11
... 

めっちゃ楽

感想

C#、なかなか書きやすいのではないかと感じた

dockerめっちゃ便利

あと僕に知識がなくそのままコンテナ内でvim使って書いてたのでシンタクッスハイライトとかなにもなしで書いてたのでつらかった

最後に一つ、Windowsがある場合は普通にWindowsで書けばいいなと思いました

内容全然なかったですが、これで終わりです。明日の記事はぬまたさんで「2017年おもしろかったYouTubeの動画を紹介します。」だそうです。きっと面白い記事を書いてくれるでしょう。