fc2ブログ

My Journal

C#でAtCoderにVisualStudioを使って自動テスト&自動提出する

タイトル通りです。VisualStudioCode+OnlineJudgeTools+AtCoderCliって方法はググって出てくるのですが、個人的にC#でVSCode使うのは使い勝手が悪いと思っていて……どうしてもCodeじゃない方のVSを使いたいということで、色々やってみて一応それなりの形になったので記録しておきたいと思います。参考になればうれしいです。

1.VisualStudioでは開発者用PowerShellが使えるので、そこでOnlineJudgeToolsを使います。(AtCoderCliはいらないです)
2.「ディレクトリ作って、テストファイルダウンロード」とか、自動テスト・自動提出をワンライナーで気軽に使いたいので、PowerShellのコマンドレットを自作します。

1.のやり方は適当にググってください。python導入してpip3 install --user online-judge-toolsでPowerShell環境でも使えます。
2.はC:\Users\{ユーザー名}\Documents\WindowsPowerShell\Modules\下にディレクトリ(ex.AtCoderディレクトリ)を作ってpsm1ファイル(ex.AtCoder.psm1)を置けば良いです。名前はなんでも良いのですが、ディレクトリ名とファイル名を一致させるのがポイントです。
psm1ファイルの中に関数をマクロみたいな感覚で書いていって、VS上のPowerShellでImport-Module AtCoderとかやって読み込めば良いです。(Import-Moduleの上書きはできないっぽい?Remove-Moduleすると上書きされてるっぽい?その辺の挙動が謎)

2.についてもう少し詳しく。
自動テストは、
oj t -c ".\AtCoder\bin\Debug\netcoreapp3.1\AtCoder.exe" -d ".\testcase\abc123\$a\test"
みたいな感じでデバッグビルド時のexeでテストケース実行できます。ビルド時点でのしょうもないエラーは実行前に潰しておきたい派にオススメ。
oj t -c "dotnet run --project .\AtCoder\AtCoder.csproj" -d ".\testcase\abc154\a\test"
とかすればコードでテストケース実行できますが、これだとぼくみたいなのは保存し忘れて丘people~?ってなりますね。

自動提出は、
oj s $url ".\AtCoder\Program.cs" -l 4010 -y
とかで良いと思います。ビルド時テストと組み合わせれば、保存してないのを提出するポンなミスを防げてすばらだと思います。
現状、AtCoderで使えるC#は3種類のコンパイラがあり、-lオプションで指定する必要があります。
4010 (C# (.NET Core 3.1.201))
4011 (C# (Mono-mcs 6.8.0.105))
4012 (C# (Mono-csc 3.5.0))
-yオプションはソースコードとテストケースが同一ディレクトリに無いときに出る確認画面を飛ばせます。

え?コードは?いや、作ったコード貼れや!って感じだと思うんですけど、シェルスクリプトにバグあると悲惨なことになる可能性高いですし、悲しい事故を起こしたくないので載せないです……しばらく使ってみて問題なさそうなら載せるかも
スポンサーサイト



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2022/05/08(日) 00:50:54|
  2. PCネタ
  3. | コメント:0

[C#] Taskの中でTaskが終わるのを待つには?

親Taskの中で子Taskを実行して、その場で子Taskが終わるのを待つんじゃなくて、親Taskはそのまま続行したい。ただし、親Taskが子Taskより先に終わるのは避けたい。そんな時どうするか。

親Taskの頭でList tasks = new();して子Taskたちのリストを作成。
実行したいところでtasks.Add(TaskBAsync());とかする。
親Taskの最後、待機したいところでawait Task.WhenAll(tasks);すればよい。

分かれば簡単な話だけど、バチッと書いてある所が無くて色々試行錯誤するハメになったので書いておきます。

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2021/10/21(木) 08:34:26|
  2. PCネタ
  3. | コメント:0

LinuxでASP.NET使ってKestrelサーバーを立てる

前回は開発用証明書を使ってデバッグができるようにしました。

今回は一般に認められている認証局(要は開発用のオレオレ証明書ではないもの)から発行されたSSL証明書を利用してASP.NETを利用してLinuxにKestrelサーバーを立てます。今回はLet's EncryptのSSL証明書を利用します。
まず、Linuxで
sudo certbot certonly --standalone
を実行します。インターネットにはApacheだとかNginxだとかいうサーバー向けにcertbotを使う方法が紹介されていますが、この方法だとサーバーに依存せず証明書を発行できます。ちなみに、事前にドメイン名の取得をしておく必要があります。あと、80番ポートを他のプロセスが使っていない状態にしないとダメです。80番ポートを使っているプロセスはsudo lsof -i:80で分かります。
これをするとCertificateとPrivate Keyの2つのpemファイル(ファイルの場所が分からなくなったらsudo certbot certificatesで確認できる)が発行されます(他にも2つくらい作られるけど使わない)。この2つのファイルをバインドしてpfx形式にします。これにはopensslを使います。
sudo openssl pkcs12 -export -in {fullchain.pemまでのパス} -inkey {privkey.pemまでのパス} -out {好きなところにhoge.pfxを出力}
というコードです。この時、パスワードを登録するよう要求されるので、その登録したパスワードを記録しておきましょう。
ASP.NETのProgram.csの中身でConfigureWebHostDefaultsのところに
webBuilder.UseKestrel(options =>
{
  options.ConfigureHttpsDefaults(options =>
  {
    X509Certificate2 certificate = new(@"{hoge.pfxまでのパス}", "{先ほどのパスワード}");
    options.ServerCertificate = certificate;
  });
});
とすれば、pfxファイルを読み込んでくれて、そのpfxを元にSSL通信してくれます。
なお、ググるとC#のコードだけでAlexanderProさんのUtilitiesライブラリ使ってGetCertificateFromPEMstring()使えばできるよ~みたいな記事が出てきますが、それはWindowsでの話でLinuxではDSACryptoServiceProviderの機能が互換性の問題で完全には使えないのでダメです。素直にpfxファイルを作ったほうが良いです。

Let's Encryptの証明書は3ヶ月くらいしかないので、期限が近くなったらcertbotでpemファイル更新する必要がありますが、pemファイルを更新した時はもちろん最初にpfxファイルを作った時と同様にコマンドでopenssl使ってpfxファイルを更新する必要があります。

それから、ちなみに、このConfigureWebHostDefaultsに直接書き込むのと、launchSettings.jsonに書くのと何が違うんじゃいって感じですが、launchSettings.jsonに書くのは開発環境に限った処理で、本番環境での動作は基本的にConfigureWebHostDefaultsに書けばいいみたいです。例えば、開発環境ではHTTPを使って本番ではHTTPSを使いたいみたいな時はConfigureWebHostDefaultsの中にはwebBuilder.UseUrls("https://+:443");とか書いといて、launchSettings.jsonの中身には"applicationUrl": "http://localhost:50080"とかしておけばそれぞれ読み込んでくれます。
なお、当方の環境ではなんでかよく分かりませんが、ConfigureWebHostDefaultsとjsonの内容が競合するので#if DEBUGとか使ってConfigureWebHostDefaultsの中身はDEBUGの時だけ読み込むようにしてます。

テーマ:知っていて損は無いパソコン豆知識 - ジャンル:コンピュータ

  1. 2021/10/20(水) 09:15:57|
  2. 日々の記録
  3. | コメント:0
次のページ
Read me

プロフィール

ニワカ先輩

Author:ニワカ先輩
普段はTwitterにいます

最新記事

最新コメント

リンク

My Journal

Elegy Syndrome

鉄道コム



美少女ゲーム批評空間

カテゴリ

日々の記録 (245)
旅行記 (111)
鉄道 (320)
実物車両以外の鉄道ネタ (15)
鉄道以外の写真 (22)
PCネタ (16)
未分類 (2)

月別アーカイブ

BLOG RANKING

ブログ村

カウンタ

検索フォーム

RSSリンクの表示

QRコード

QR