20210611のC#に関する記事は4件です。

任意の言語のプログラミング演習をウェブブラウザで実施できるLMSの紹介

はじめに 以前,プログラミング演習を実施できるウェブシステムの紹介記事を書きました. このたび,より高機能化・高速化・安定化した新システムを開発したので,紹介させていただきます. 解説ページはこちらにあります: https://kjmtks.github.io/hugin-page/ 解説ページに,限定された権限しかありませんが,デモサイトを用意しております1ので是非お試しください. また,ご自身の環境にシステムを簡易的にインストールする方法を説明した3分程度の動画もあります: YouTube 主な機能 任意の言語のプログラミング演習をウェブブラウザで実施 本システムはサーバーに chroot 監獄を作成し,隔離された環境で,かつ,指定したリソース制約下で任意のプログラムを実施できる機能を持っています. これにより,任意のプログラミング言語を対象としたプログラミング演習をウェブで実施することができます.画像やグラフの出力にも対応しています. この機能を応用して,例えばウェブでLaTeXのタイプセットを行うことも可能です. 任意のプログラム実行環境の構築 プログラムを実行する隔離された環境は,任意に作成することができます. また,事前に用意されたインストールコマンドを使用して,特定の処理系が実行できる環境を簡易に作成することができます. 自由記述形,ファイル提出,フォーム入力の課題の出題 プログラミング演習以外の課題,すなわち,自由記述形課題,ファイル提出課題,フォーム入力課題の出題にも対応しており,LMSとして十分な機能を備えています. なお,これらの課題およびプログラミング演習を1つ以上組み合わせてひとつの課題として出題することができます. Markdwon (or HTML) + Scriban によるコンテンツ記述 講義コンテンツはすべてテキストで記述します. Markdwon (or HTML)と,LiquidライクなテンプレートエンジンであるScribanによる記述に対応しています. Gitとの連携 このシステム自体がGitのリモートリポジトリとなっており,Gitのコマンドでコンテンツ等の入手,更新を行うことができます. システムからもコンテンツの簡易的な編集が可能です. 単体テストによる課題の自動チェック プログラミング演習に対して単体テストを用意しておけば,受講生はこれを利用して自分の組んだプログラムのチェックを自動で行うことができます. これは,受講生の試行錯誤を推進するための機能です. 提出課題への手動フィードバック,最終成績のCSV出力 受講生は演習・課題を講師宛に提出することができます.講師はこれに対して採点をしたり,フィードバックコメントを送信することができます.また,再提出を求めることもできます. また,受講生全員の採点結果をCSV形式で出力することができます. 受講生の学習行動の可視化,オンライン状態の監視,全行動の記録, 受講生のすべての行動・オンライン状態は記録され,リアルタイムに確認することができます. 授業の進行を調整することに活用できるほか,学習が遅れている受講生の発見等に役立ちます. LDAP認証の利用(LDAPを使用しない認証との併用も可) 認証にLDAPを使用することができます.また,LDAPを使用しない認証も可能で,両認証を併用することもできます. マウス or スタイラスペンによるページへの書き込み 簡易的ですが,ペイントツールを使用することができます. ページそのものに自由に書き込みができるのが特徴で,ページをスクロールしても適切な位置が保たれます. 講義コンテンツ,プログラム実行環境,課題のひな形をウェブからインポート 講義コンテンツや,プログラム実行環境のインストールコマンド,課題のひな形などを簡単に入手する機能があります. いまはまだ少ないですが,これから充実させていく予定です. これにより,他の人が作成した良質なコンテンツを入手して講義をしたり,自習をすることができます. 再起動を頻繁に行っておりますので,つながらないこともあります. ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# is flexible

It's used for game, smart phone app, many ways. And Unity's it's acceptable.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】ErrorLog 出力時に Exception の内容が消失していた話

はじめに とある秘密プロジェクト X で作成したバッチを実行してエラーログを出力した際、例外の内容が消失した事件が発生しました。例外の内容はどこにいったのか … その謎を解き明かしていきます。 対象のコード catch (Exception ex) { _logger.LogError("ここにメッセージが入っていたよ", ex); } 結論 _logger.LogError の使い方が間違っていました。解き明かすプロセスを楽しみにしていた人はごめんなさい。単純だったので解き明かすプロセスの話が思い浮かばなかったのです。許してください。さて、正しい使い方はこうです。 catch (Exception ex) { _logger.LogError("ここにメッセージが入っていたよ {ex}", ex); } 引数に指定した ex を string 引数の方で指定してあげなくては出力されなかったのです。ex からしてみると休日上司に呼び出しをくらって会社に出社したときに「呼び出した理由?ん~、何だっけ、忘れちゃった。」と言われたようなものです。私だったら顔には出しませんが、内心発狂しています。ちなみに例外を先に持ってきて以下のように書いても例外は出力されます。 catch (Exception ex) { _logger.LogError(ex ,"ここにメッセージが入っていたよ" ); } というわけでログの出力時に渡す引数の順番や引数の内容に気をつけましょうという話でした。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XamarinバインドプロジェクトでJARなどをバインドする際、Javaのファイナライザが含まれる場合の対処法。

Javaでは、finalizeという名前の関数は「ファイナライザ」という特別な関数です。ファイナライザはクラスの後始末を行うために存在するが、いつ呼び出されるかわからない、また、呼び出されないこともあるらしく、「何かを積極的におこなう場所」ではありません。基本的に使用は推奨されてない、らしいです。 C#では同じような目的で「デストラクタ」があります。C#でデストラクタはクラス名に「~」をつけて宣言しますが、内部的には「Finalize」という関数名に変換されます。そのため、「Finalize」という関数名を使用すると、以下のような警告やエラーが出ます。 「void Finalize()」という関数を作成すると「デストラクタを宣言しようとしましたか?」警告が出ます。 「override void Finalize()」という関数を作成すると「Finalizeをオーバーライドしないでください。代わりにデストラクタを提供してください。」エラーが出ます。 何が問題か XamarinバインドプロジェクトでJARをバインドする際、JARの中にファイナライザが含まれていると、Javaの「finalize」がC#の「Finalize」という関数名となってエラーが出てしまう、という問題が発生します。 本来あるべき姿としては、「Javaのfinalizeという関数名をC#のデストラクタに変換してほしい」のですが、そうはなりません。 Metadata.xmlでどのように指定すればよいか?ネットで検索したところ、いい方法はないらしい。 案1.消してしまえばいい説 ファイナライザは使用すべきでないのだから、消してしまっても問題ない、という考えのようです。 <remove-node path="/api/package[@name='your.package.name']/class[@name='Proper.ClassName']/method[@name='finalize' and count(parameter)=0]" /> 案2.強引におきかえる派 Javaの protected final void finalize() という関数名は、通常なら protected override sealed unsafe void Finalize() に変換されてエラーになるが、無理やり unsafe /**/ ~FooIterator() というデストラクタにしています。なかなかすごい手です。 <attr path="/api/package[@name='com.company.api']/class[@name='FooIterator']/method[@name='finalize']" name="managedName">~FooIterator</attr> <attr path="/api/package[@name='com.company.api']/class[@name='FooIterator']/method[@name='finalize']" name="visibility"></attr> <attr path="/api/package[@name='com.company.api']/class[@name='FooIterator']/method[@name='finalize']" name="managedReturn">/**/</attr> 案3.自分で見つけた方法。 まずはビルドします。当然エラーになります。エラー一覧からエラー箇所のソースコードに飛び、手作業でデストラクタに書き換えた後、ビルドすれば無事ビルドできます。ただしリビルドやクリーンすると、元のエラーに戻るのが問題です。 どうするか 実際は案1で問題になる事はないと思われます。 しかし、本来あるべき姿としては、案2か案3です。案3はリビルドしたらエラーになるため、現実的には案2しかないと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む