作成し、ビルドが通るとマージしてくれます。使ってみたくなった方はドキュメントを読めば簡単に導入できます。ソースコードが公開されているため改造も容易です。開発以外にも活用できるものです。これらの技術を活用し、効率的なソフトウェア開発に役立てていただければ幸いです。APIを作ってみる」でした。最近の良かったことはサッカーのワールドカップで日本が出た全試合をリアタイし、サッカーに少し詳しくなれたことです。解説を務めた本田圭佑などの時代しか知りませんでした。つぶやきを理解するためにルールや戦略論(フォーメーションなど)を調べていきサッカーの奥深さに少し気づけたかなと思います。ページの作成を担当し、リーダーとして動いていた経験をもとに、当時意識していたことを書きたいと思います。私は別の団体と兼部をしているのですが(以下、G隊)、G隊では春の学祭にてクイズを使った出し物をしようということになりました。教室の中で完結するのですが、スタンプラリーのように順番に数問のクイズを解いていく形式で、最初の頃は設問を印刷して来場者に自分のペースで順番に解いてもらおうという議論でした。ページでクイズを読めるようにしようということになりました。結果的に印刷費用を抑えられるという利点もありました。非常にスマートで費用もかからないので現代の価値観に合った素晴らしい企画に思われましたが、ひとつだけ問題がありました。ページを作ることができる人材の不足でした。開発を担当していました。ページにする仕事はひとりでやるには業務量が多すぎました。対応することは困難でした。記法を用いて書けるシステムを採用すべきだと考えました。Markdown(マークダウン)は、文章の書き方です。デジタル文書を活用する方法として考案されました。・手軽に文章構造を明示できること・簡単で、覚えやすいこと・読み書きに特別なアプリを必要としないこと・それでいて、対応アプリを使えば快適に読み書きできることなどです。その後、多くの開発者の手を経ながら発展してきました。ページを作ることができます。記法を使うとして、どんなツールを使えばよいのでしょうか。条件をいくつか出しました。使う必要があった)無料のサービスである結果、"StackEdit"なるサービスを発見しました。ページを作ることができるサービスで、アプリのダウンロードが不要だったこともありがたく感じました。共有できるというのは魅力的でした。進捗管理にも大変役立ちました。ファイルにエクスポートすることもできました。作成して公開していました。ファイルでもアップロードできたのかもしれないがよくわからん)。エディター画面デザインは凝ったものにできませんが、学祭でしか使わないページになるだろうということで妥協することにしました。リポジトリにアップロードするという体制ができあがりました。導入:開発裏話ここまでは企画運営の方針に関しての話でしたが、ここからはチームのみんなに環境構築をしてもらう段階となります。開発の文脈の用語)を使わないよう徹底したことです。自分の知らない言葉で埋め尽くされたドキュメントは読む気にならないでしょう。知らない語彙が一定数あると読解精度が落ちるわけですが、個人的にはこの現象は外国語の文章に限らず専門的な内容の文章を読む場合でも変わらないと思っています。ドキュメントの整備に加えて、質問しやすいような環境づくりも意識しました。定例会議では何か困ったことがないか尋ね、相談してもらえるようにしました。アップロードしてもらいました。それを私がチェックするという流れです。結果クイズ画面クイズ画面は上のような感じになりました。した印象で、問題を解くうえではかなり見やすい画面になっているように思います。プログラミングを使わなくてもここまでできるのは素敵ですね。学祭当日は、私は忙しかったので運営として参加することはできませんでしたが盛況だったと聞いています。貢献できたようで嬉しい限りです。開発につなげやすくなったことは思わぬ幸運でした。おわりに新しくプログラミングに興味を持ってもらうには、「なんだか難しそう」という食わず嫌いを払拭させ、自分にもできそうだと思ってもらうことが何よりも重要でした。これはプログラミングに限らず新たな技術を導入する時には常に心掛けるべきことでしょう。チームの抵抗感を和らげ、スムーズな導入を目指しましょう。プロジェクトテンプレートを選択して作成します。ここで<port>ランダムに選択されたポート番号です。見るSwaggerページだと思います。試しに実行することもできます。サンプルデータ用のサービスを作成するまず次のようなTodoItemクラスを作成します。}}つぎにそれを扱うITodoItemContainerを作ります。実装は少し長くなったので下の方に書いておきます。単純にList<TodoItem>を用意してそれに足したり抜いたりしているだけです。使うためにはDIコンテナに登録する必要があります。builder.Build();が呼び出されている箇所より上でbuilder.Services.AddSingletonを呼び出せば登録することができます。今回は次のコードをを追加しました。コントローラーはControllerBaseを継承して作ります。これを継承することで応答に便利な関数を利用できます。ControllerBaseApiCotroller属性をつけると以下のようなAPIの動作を有効化できます。コントローラーにメソッドを定義することでアクションを設定できます。DELETEが含まれていると自動的にHTTPメソッドとして登録されますが、Swaggerが認識できないのでHttpGet属性をつけるほうが良いです。}ルーティングルーティングはRoute属性を用いてコントローラーまたはアクションに設定できます。ルーティングは大文字小文字の区別がありません。api/todoでもApi/Todoでも同じものとして扱われます。コントローラにRoute属性を使うとそのコントローラーでのデフォルトのルートが設定されます。部分を取り除いた文字列が入れられます。アクション、つまりメソッドにRoute属性を使うとそのメソッドだけにルーティングを設定できます。このとき、/または~/で始めるとコントローラーのルートテンプレートと結合されません。動詞テンプレートでもルーティングは設定できます。動詞テンプレートを使うこと方が良いです。動詞テンプレートは以下の6つです。}}メソッドの引数メソッドの引数はURLパスから受け取ったりリクエスト本文から受け取ったりできます。URLパスから情報を受け取るRoute属性やHttpGet属性などで{id}のように書くことで、引数idにその値を受け取ることができます。{id?}とすることで省略することができます。省略された場合引数にはデフォルトの値が入ります。リクエストヘッダーFromBodyはSystem.Text.Jsonを使って自動的にパースしてくれます。}}メソッドの返り値メソッドの返り値にはActionResult<T>を指定しておけば暗黙的なT=>ActionResult<T>のキャストが実装されているのでとりあえずは困らにと思います。型が指定できないとき、例えば匿名型を使用するときなどはActionResultを使えばよいです。そのまま値を返しても問題ありませんが、ControllerBaseに実装されているメソッドを利用することで一緒にStatusCodeを指定することもできます。使われそうなものをいかに列挙しておきます。返すオブジェクトを生成する。引数にはアクションの返り値にしたいオブジェクトを指定する。返すオブジェクトを生成する。第2引数にはアクションの返り値にしたいオブジェクトを指定する。返すオブジェクトを生成する。第1引数には作成されたコンテンツを返すアクションの名前を、第2引数にはそのアクションのURLの生成に使用するルートデータ。第3引数にはアクションの返り値にしたいオブジェクトを指定する。返すオブジェクトを生成する。クラスのドキュメントを参照してください。DELETEメソッドを追加して最終的に次のようになりました。どれを使えばいいのか全然わからなかったです。クラスのドキュメントを参照してください。2022の12日目の記事です。本題まで長いので読み飛ばしていただいて結構です。限らずプログラムを書かされることは間々あります。いったときに、特に言語を指定されなければ自分の慣れている言語で書きたいものです。ところで、筆者にとってその「慣れている言語」というのがC#なわけですが、これがどうにも講義で使うのには相性が良くないのです(個人の感想です)。講義でプログラムを求められる状況では、うちの場合大抵その一回限りの使い捨ての、コンソールアプリとすら言わないような実行して出力を見るだけといったようなものを書くことになります。C++やPythonであれば、(予め環境構築が終わっていれば)適当に1つファイルを作って書き捨て、実行すればそれでいいので何も思うところはありません。consoleしてプロジェクトを作らねばなりません。プログラムが記述されたファイルと実行ファイル以外にいろいろファイルやフォルダが生成される始末で、「書き捨て」をするには余りに仰々しすぎるのです。試行錯誤もっと、それこそC++やPythonのように、プログラムが記述されたファイルと、せいぜいコンパイル後の実行ファイル程度でどうかしたい。Compiler)を直接叩いてコンパイルしようと思い立ちました。実際これでコンパイル、実行自体はできるのですが、いくつか問題がありました。インテリセンスが効かないまず、始めにやってみて気が付いたのは、単に.csのファイルを開くだけでは、VSCodeでインテリセンス等が全くと言っていいほど効かないのです!C#と言えば静的解析(ほんとに?)。それが効かないのは余りに面倒でした。cscを叩く方法でC#にインテリセンスを効かすにはどうするか。いくつか方法はあるのですが、最も単純なのは、*.csprojをワークスペースに配置することです。consoleすれば簡単に生成できます。consoleが必要なものの、1回で済むならだいぶ状況は良くなったと、初めはそう思いました。フォルダ内にエントリポイントがあるファイルを複数置けないこの方法の問題点は何か。それは、VSCodeで開いたフォルダ全体が1つのプロジェクトとして認識されるため、エントリポイントを1つしか持てないということです。言い換えれば、Mainのあるファイルがフォルダ内に複数あると、VSCode上でエラー表示が出るのです。実際にはcscでコンパイルするのでエラーは無視できるのですが、うっとうしいですし、本当にエラーになっているものを見逃すかもしれません。適当にファイルの中身の切り貼りを自動化すれば、一応大した手間なくエラーも無くコンパイルもできる状態にはできるものの、各.csファイルは単体でコンパイル/実行不可能なうえ、自動化用の諸々(当時私は専用のC#プログラムとtask.jsonで行っていました)がフォルダ内に散乱して、結局当初の目的をあまり達成できていませんでした。光明さてそうこうしいたある時、「そういえばC#をインタープリタ的に実行できるのがあった気がする」と思い出しました。それについて調べたところ、dotnet-scriptというものを見つけ、これがまさに自分の求めていたものでした。(CSX)と書いてあり、これがそのdotnet-scriptのファイルなのですが、ここに書いてあったことにこれを書いている今気が付きました。scriptsについての紹介になります。scripts(dotnet-script)とはどういうものなのかの話の前に、簡単にインストール方法を説明しておきます。dotnet-scriptをするだけです。できることdotnet-scriptでは以下のことができるようです。アプリケーションへの埋め込みInteractive実行(これが先ほど言った「インタープリタ」的実行)スクリプト実行(主目的)このうちアプリケーションへの組み込みは今回説明しません。scriptまたはdotnet-scriptと入力することで、インタプリンタ環境が起動します。文法は通常のC#とほぼ同じです。リテラルや変数を;無しで打つと値を表示してくれます。ImplicitUsing(後述)によるものですが、初めからある程度using済みなので、少し変わった電卓程度の用途には十分使えます。起動後初めの出力が異様に遅いので、適当に数字を打って出力させておくといいでしょう。一応後述のスクリプトファイルを読み込んだり、NuGet参照したもできますが、あまり複雑なことをするには(当然ながら)向いてはいません。打ち間違いに強い電卓でしょう(個人のry)。終了は#exitで行えます。スクリプト実行さて本題、求めていたスクリプト実行です。initとすれば、直下にomnisharp.jsonとmain.csxが、.vscode下にlaunch.jsonが生成されます。これができればあとは好きにC#を書いていけます。filenameでできます。(普通にファイルを作っても問題ありませんが、たまにスクリプトファイルとして認識してくれずインテリセンス等が効かなくなることがあります。その場合、VSCodeを開きなおせば問題ありません。