コンテンツにスキップ

宿題の提出

本ページでは宿題の提出方法について説明します。 本講義ではプログラミング課題を宿題として毎週出します。それをGitHub上でリポジトリを更新するという形で提出してもらいます。 GitHub Classroomという、GitHub公式の宿題管理システムを使います。

事前にやっておくべきこと

  • GitHubアカウントの取得
  • week1にて告知した通り、ITC-LMSによるGitHubアカウントの提出
  • GitHubにログインしておく

【10/15追記】宿題置き場のリンクは https://github.com/eeic-software1-2021/ です

宿題の配付

毎週、宿題URLを配布します。それをクリックすると、各自のGitHub上に宿題リポジトリが配布されます。 一番最初の一回だけは、宿題URLをクリックすると以下のような初期設定の画面になります。

ここではGitHub ClassroomというGitHub公式の宿題管理システムが、各自のGitHubにアクセスしてもいいですか?と聞いてきています。 「Authorize GitHub Classroom」をクリックして承認してください。 これは一番最初に一回やるだけでOKです。

次に、下記のような画面になります。Accept this assignmentをクリックしてこの宿題をゲットしてください。

しばらくすると完了になります。

次に、宿題置き場に行ってください。すると次のように、あなたの宿題リポジトリが生成されています。 ここでは、eeic-software1-2021というオーガニゼーション(みんなの宿題が置かれる宿題置き場)上にassignment-week2-1-XXXというリポジトリが作られています。 ここでweek2-1は第二週目の一つ目の宿題という意味で、XXXの部分はあなたのアカウント名です。

(ちなみにここには全員分の宿題がおかれており松井からは全部見えるようになってます。皆さんは自分の宿題しか見れません。締切を過ぎると、松井がここから皆さんのリポジトリを一括でダウンロードして採点します。皆さんは宿題が終わったときにわざわざ松井にメールしたり、ソースコードを添付したりする必要はありません。また、締切までは何度でも自由に編集できます。)

宿題の実行

さて、宿題リポジトリをクリックしてみましょう。すると次のような画面になります。 これが宿題リポジトリです。宿題が何なのかは、各週の講義HPを確認してください。

さて、ここにはいろいろなファイル(.github/workflows, eval.py, test_case.json)があるのですが、これらは後で述べる自動採点のためのファイルなので全て無視して、main.cだけに注目します。これをクリックしましょう。

すると、下図のように、main.cの中身が表示されます。

ここで、このmain.cの中身を編集するということが、宿題の提出ということになります。右上の鉛筆ボタンをクリックして、このmain.cを編集します。

実際の宿題を行う手順は以下のようになるでしょう。

  • Google Cloud Shellやローカル環境で宿題を頑張ってコーディングする。すなわち、main.cを手元で作って頑張って中身を書く。それを検証してうまくいくことを確かめる。
  • 上記の宿題リポジトリを開き、作ったmain.cの中身をコピペする。

宿題の提出

さて、それでは実際にmain.cを編集して宿題を提出することを考えてみましょう。week2_1の宿題の内容は実行結果が以下になるようにプログラムを編集することでした。

$ gcc main.c 
$ ./a.out
Hello World!

よって、そうなるようにmain.cの中身を編集します。ここで、上図で見たように、画面の右上の鉛筆ボタンをクリックしてください。そうすることで、下図のように編集モードになり、main.cの中身を編集することが出来ます。

ここで中身を編集してください。直接編集することもできますが、基本はGoogle Cloud Shell Editor等で作ったファイルの中身をコピペすることになると思います。 ここでは、hを大文字にして、oを追加しました。

そして、画面をスクロールして一番下にいきます。すると下図のようになっています。

ここで、「Commit changes」の次の記入欄には、どういう変更を加えたかを一言で記述します(日本語でOKです) そして、一番下の緑色のボタンを押して、更新を反映します(この操作をコミットおよびプッシュと呼びます)

その後、宿題リポジトリのトップ画面に移動すると、下図のように、 更新が反映されていることがわかります。これで終わりです。

自動採点

main.cの中身をコピペしていると、コピペミスなどが怖いと思います。なので、自動で採点する機能を準備しています。下図に示すように、リポジトリ上の真ん中右ぐらいにある「3 commits」などと書いてあるところを押してください。

そうすると、下図に示すように、過去の編集履歴が見れます。 ここでは、一番直近の編集である「hを大文字にしてoを追加した」を押してみます。

すると、下図のように、更新内容が記述されています。 その下部に、github-actionsというbotがコメントを残していることがわかります。この部分が自動採点の結果になります。 毎回の更新(コミット)について、botが自動採点を実行してくれます。

ここでは

  • Run gcc main.c: Completed successfullyとあるので、コンパイルは成功しています。
  • Run ./a.out: Hello worldとあるので、./a.outを実行した結果はHello worldということです。
  • Judge: Error Hello world is not Hello World!. Something is wrongとあります。すなわち、ここでの出力のHello worldは実はwが大文字ではないし最後の「!」も抜けていて、間違っていることがわかります。

よって、あらためてmain.cを編集し、これらを修正してみます。

すると上図のように、Judgeの結果がSuccessになっています。これで、自動採点をパスしたということになります。このようにして、自分の答案がちゃんと自動採点をパスするかどうか確認するようにしてください。

注意として、

  • 自動採点は20秒ぐらいかかります。表示されない場合はしばらく待っていてください。
  • もし1分たっても表示されない場合は、自動採点システムがパンクしているかもしれないので、松井にDMしてください。
  • この自動採点はあくまでエラーチェックのためです。実際の採点は、松井の手元で別のパラメータで行ったりします。(なので、この自動採点だけをパスするような邪悪なプログラムを書いても意味がないです。)

注意

  • コードの修正は締切期限の間は何度でも行って大丈夫です。 更新されたリポジトリは、最終的に松井の側で機械的に全て実行して結果を確認します。
  • もし他人(友達)のコードをコピペしていたり、コピペしたうえでコピペがばれないように細工をしていた場合、自動的に検出してスコアを下げる予定です。なので、宿題は必ず自分の力で考えて解いてください
  • 書籍やウェブ上の情報を見て宿題の参考にしたということはOKです。その旨をソースコード中にコメントとして記述しておいてもらえると良いです。

発展:Gitを使った提出

上記の手順では手動でファイルを更新しました。 もしGitの使い方を知っている場合は、 通常のGitの使い方で更新してもらってOKです。

$ git clone https://github.com/eeic-software1-2021/assignment-week2-1-XXXXX.git
$ cd assignment-week2-1-XXXXX
# main.cを編集
$ git add main.c
$ git commit -m "main.cを良い感じに編集"
$ git push origin main

Gitの使い方はweek7で簡単に解説します。

発展:GitHub Devを使った提出

上記の「Gitを使った提出」は、GitHubのオンラインエディタ機能であるGitHub Devで行うこともできます。ひょっとするとこの方式がコピペより安心かもしれません。 ですがこの方式は非常に新しい機能なので、不具合等があるかもしれないので、注意してください。

宿題リポジトリ画面を開いた状態で、ピリオドキー(.)を一度押してください。そうすると、下図のように、画面がオンラインエディタに切り替わります。

このエディタ画面は、Google Cloud Shellと同じように、ブラウザ経由でファイルを編集できるというものです。 ちなみに、この画面にはターミナルはついていないので、プログラムを実行することはできません。

ここで、これまでと同じように、main.cに宿題内容をコピペします。 そして、下図のように、左側のソースコントロールボタンを押します。

こうすると、編集されたファイル(今回はmain.c)が表示されています。そのファイルの上にマウスをもっていき、「+」マーク(Stage Changes)を押してください。

そうすると、上図のように、ファイルが「Staged Changes」に移っています。これは編集内容が「更新OK」状態になっていることを意味します。 ここで、メッセージ記入欄にいつも通り一言メッセージを書きます。 そして、上のほうの「✓」アイコン(commit)を押します。これでOKです。別の画面でもとの宿題リポジトリを開いてみると、更新が反映されていることがわかります。自動採点も走ります。

コラム

上のGitHub Devの画面は、Google Cloud Shell Editorに似ていることに気付きましたか?しかも、それはvscodeをローカルにインストールした場合の画面にも似ています。これはなぜでしょうか?

まずGoogle Cloud Shell Editorとvscodeが似ている点について解説します。 vscodeというエディタはMicrosoftが作ったものです。そしてこれはオープンソースとして公開されています。オープンソースというのは、ソースコードの中身を公開し、適切な(しかし簡便な)方式に乗っ取れば、 その公開コードを他者でも使ったり編集して使ってよい、という権利体系のシステムです。vscodeそのもののリポジトリはこれです。

vscodeはオープンソースなので、それを(適切な手続きにのっとったもとで)別の会社も使うことができます。そこで、Eclipse Foundationという団体が独自にvscodeを 拡張したTheiaというエディタを公開しました。そして、Googleは自社のクラウド計算サービスであるGoogle Cloud Shellにおいて、そのオンラインエディタとして Theiaを採用したのです。

なので、Google Cloud Shell Editorは、vscodeの親戚にあたります。よって、画面が似ています。

ちなみに、GoogleはオープンソースとしてChromium(Chromeのコア部分)を公開しているのですが、最近MSは自社のEdgeのコア部分をChromiumに切り替えました。すなわち、GoogleのオープンソースをMSが使うということも起きています。この辺りは面白いですね。

さて、次になぜGitHub Devがvscodeに似ているか解説します。GitHubはもともと独自の組織だったのですが、2018年にMicrosoftがGitHubを買収しました。 それ以降、GitHubには色々とMSの技術が導入されることになります。その一つがGitHub codespacesです。これは Google Cloud Shell EditorのGitHub版とでもいうもので、ブラウザからリモートサーバにアクセスしてコーディングやプログラムの実行を行うことが出来ます。 違いとしてはcodespacesはリポジトリに紐づいており、リポジトリに対しcodespacesボタンを押すとその場で裏側で 仮想マシンが立ち上がるというものです。このエディタのインタフェースとして、vscodeが採用されました(いまやGitHubはMSの一部なので、MSが作ったエディタであるvscodeを使うのは自然です。)このcodespacesにはターミナルもついており便利なのですが、まだ個人アカウントが使うにはベータ版の状態です。

このcodespacesからターミナル機能を取り去りエディタ機能のみを残したものがGitHub Devです。なので、GitHub Devは、vscodeを作った会社であるMSが保持するGitHub社の製品なので、vscodeの系譜に連なる、というわけです。GitHub Devはエディタ機能のみのシンプルなものなので、誰でも無料で使うことが出来ます。

このように、ブラウザ上でのコーディングというのはホットトピックで、各社が色々検討している段階です。AmazonはCloud9というのを推しています(これはvscode関係ないです)

ちなみに、GitHubはもともとAtomというエディタを独自に作っており、結構人気だったのですが、MSに買収されてからはAtomの話は効かなくなってしまいました。エディタの歴史は面白いですね。

発展++: GitHub codespacesを使った提出

そうです。GitHub codespacesを使って編集してもOKです。この場合、ターミナルもついてくるので、実はGoogle Cloud Shell Editorを使わずともGitHub上で全てが完結します。現在codespacesはベータ機能なので使用申し込みをする必要があります。しばらく(数日?数週間?)すると使えるようになると思います。codespacesは有料なのですが今だけベータで無料になっています。