これがベトナム大学院の実態だ!

Trường Đại Học Bách Khoa Thành Phố Hồ Chí Minhの大学院修士課程に社会人入学

Kiến trúc máy tính nâng cao を終えて

【客観情報】
科目名: Kiến trúc máy tính nâng cao
単位数: 3
必修区分:研究コースの場合選択科目だが、座学コースの場合必修
授業料: 2,280,000
Học kỳ: 1/2017-2018
時間帯: 毎週日曜日
授業期間: 2017/09/10/~2018/01/07
出席:取らない(ただしセミ抜き打ち小テスト、中間試験、プレゼンあり)
プレゼン:6~8名グループで1回
試験:セミ抜き打ち小テスト、中間試験、期末試験(PC使用不可、ただしノートや印刷した紙等の閲覧は可能)
レポート:6~8名グループで2~3回

【感想】
座学が中心で、一応アセンブラっぽいコーディングはやるのだが全て宿題となっており、レポート提出。
これがグループ単位となっており、ほぼ同じグループのメンバーにやってもらい、名前だけ載せてもらうことで平常点ゲットとなるかと思われたが、最終的な結果は後述。
小テストや中間試験は抜き打ちなのだが、たまたま用事があり先生に欠席届を出した際、「来週小テスト」の返信があり、内容の準備はともかく気持ちの上では準備できた上で小テストを受けた。
しかし、中間試験が問題であった。ある日、頭痛がひどかったので欠席届を送ったところ、先生からは「今日は中間試験」との返答であった。その時点で出発したとしたら余裕で間に合う時間ではあったものの、学校に到達が厳しいほどの頭痛であったため、やむなく欠席した。中間試験は全体の20%の配点であった。
その後しばらく学校を休んでおり、久々に出席したところ6~8名グループでプレゼンをやることになっていた。
そのころ勢いのあった角刈り君のグループに入ろうと話しかけたところすでに満員のようであった。
たまたま別な奴と話したところそのグループはまだ3~4名程度だったので、リーダーに掛け合い混ぜてもらった。
この授業のプレゼンは1つのパワーポイントやPDFファイルで行うが、自分の担当箇所を自分で説明するというもの。つまり名前だけ載せてもらうことはできない。
俺は中間試験を休んでしまったこともあり、プレゼン準備に力を入れた。
あいにくとプレゼン当日に激しい頭痛に見舞われたが、プレゼンは他のメンバーとの兼ね合いもあり休むわけにいかないと思い、それでも自分で運転する体力はないのでタクシーで登校。なんとか成し遂げ、評価は90%とかなり高い物であった。
その後期末試験を経て最終的な結果が10点満点中4.5点。同じプレゼングループのメンバーからは、「惜しかった。中間試験を休まなければ(5.0点以上取れて)単位取得できていたかも」となぐさめの言葉をもらったが。
結果として単位は得られなかったが、プレゼンのグループリーダーといろいろ話して親しくなり、くしくもその彼と次セメスターで同じ授業になり、その後いろいろな情報を得ることができるようになった。

Lập trình nâng caoを終えて

【客観情報】
科目名: Lập trình nâng cao
単位数: 3
必修区分:研究コースの場合選択科目だが、座学コースの場合必修
授業料: 2,280,000
Học kỳ: 1/2017-2018
時間帯: 毎週日曜日
授業期間: 2017/09/10/~2018/01/07
出席:取らない(ただし後述のプレゼンあり)
プレゼン:グループ1回(個人でもOK)
レポート:1回
試験:期末試験(PC使用不可、ただしノートや印刷した紙等の閲覧は可能)

【感想】
解説中心で授業らしい授業であった。
学生のノートPCの持ち込みが前提となっており、特定のソフトの操作やソースコードの入力、実行を行う。
レポートは本来グループであるが、同じグループのメンバーが逃亡した(授業に来なくなった)ため結局一人で行うこととなった。
グループで行う場合は3~6名一組だが、発表は誰か一人でよい。この場合発表者以外は名前だけ載せて何もせず平常点ゲットということもあり得る。
実は俺はこれを狙って6名のグループに属していたが、妙にやる気のあるやつが3名ずつの分割を提案、俺の属した3名でどうするか相談しているうちに他の2名が登校拒否となり俺一人だけとなってしまった。
仕方がないのでruby and railsチュートリアルにあるコードを転用して急ごしらえでそれらしいシステムを構築したところ、なんとそれが高評価であった。
学生間の360度評価だったらどうなっていたかわからないが、このプレゼンは先生の評価だけで決まるのでそれに助けられた形となった。
実はプレゼンにはローカルルールがあり、動画を利用すると低評価。パワーポイントは動画埋め込みが弱いのでもともと動画を使う予定はなかったが万が一使っていたら取り返しのつかないことになっていた。
また、これは当たり前と言えば当たり前だが、何を思ったかプレゼン中にエロ画像を写した奴がいて、教室内に失笑が漏れたが、ここで先生が大激怒。もちろん、エロ画像を写した奴にだよ。失笑した奴らにじゃないよ。
彼がなぜわざわざプレゼンの場でエロ画像を写したのかは本人のみ知るところだと思うが、この時の先生の怒り様が半端ではなったため、おそらく相当な減点であっただろう。先述の動画を利用したグループも叱責というか注意程度であり、怒ったわけではなかった。なお、この動画を使ったグループの発表者が次セメスターで必修科目の延長署名を集めた角刈り君である。
実は俺もプレゼンで萌え画像というかロリ画像を使ったのだが、そもそもベトナムロリコンという概念がなく単なる子供の画像と解釈されたこと、そしてこれが怒られた彼との最大の違いだが服を着ていたことが幸いした。

期末試験はプログラミング言語の問題なのにまさかのPC使用不可でできは悪く、しかも、試験後のレポートも他の学生はCuda Cのコードを書いてくることだったがなぜか俺にだけPythonを指定され、やむなくその通りにしたが提出後の返答はなくしばらく不安になっていたが、数か月後に成績発表があり、なんと10点満点中8点。
散々だったHọc kỳ 1/2017-2018で唯一単位取得ができた科目であった。まさに、捨てる神あれば拾う神あり。

Hệ cơ sở dữ liệu nâng caoを終えて

【客観情報】
科目名: Hệ cơ sở dữ liệu nâng cao
単位数: 3
必修区分:研究コースの場合選択科目だが、座学コースの場合必修
授業料: 2,280,000
Học kỳ: 1/2017-2018
時間帯: 毎週土曜日 18:15~20:40
授業期間: 2017/09/09~2018/01/13
出席:取らない(ただし後述のプレゼン2回及び抜き打ち小テストあり)
小テスト:抜き打ち1回
プレゼン:グループ1回、個人1回
レポート:2回
試験:中間試験1回、期末試験(PC使用可能)
その他:課外授業強制、教師の日課金(一応任意)

【感想】
授業らしい授業もなく、学生のプレゼンが主であった。
2~3回ほど欠席してしまったが、それ以外はすべて出席、試験はもちろんプレゼン2回実施、レポート2回提出したが10点満点中3.7点とコストパフォーマンスが悪い科目であった。
選択科目なので2度と取らないが、再履修の学生もいた。おそらくコースの関係で必修になっているのであろう。
実は強制の課外授業があり、これに参加しないと減点。また、教師の日に向けて集金があったが、この課金をしなかったのも低得点に関係しているのだろうか。
なお、他の科目では今のところ教師の日の集金はなかった。

成績平均点について

日本の大学では成績証明書もしくは単位習得証明書なる物があり、100点満点でそれぞれの科目の成績が分かる。
この場合、落ちた科目は除外される。
ベトナムの場合Trung bình tích luỹ môn họcもしくはĐiểm trung bình toàn khóaというのがこれに当たる。
後者のĐiểm trung bình toàn khóaをGoogle翻訳するとGPAとなるが、いわゆるアメリカのGPAとは唯一にして最大の違いがある。
というのも、アメリカの大学で言うGPAは、落ちた科目を0点として平均点を計算するからだ。
ほぼ満点の科目が何個あろうと、途中で行かなくなった科目があれば0点となり平均点は大きく下がる。さらにGPAが一定以下の場合は強制的に退学となる。アメリカの大学(院を含む)の授業料は1科目20万円ぐらいで、卒業(修了)には数千万円かかかるそうだ。ネットゲームで言えば数千万円近く課金したのにアカウント削除されるぐらいのインパクトだろう。これはフェアじゃない。
幸い、ベトナムは日本同様、落ちた科目は平均点に含まれない。

なお、最近では日本の大学でもGPAを計算するところが出てきて、アメリカ同様に落ちた科目は0点として平均を出すようだ。
もっともこれはアメリカの大学院に留学する場合に使用するぐらいで、日本国内で就職する場合は普通に成績証明書もしくは単位習得証明書を提出するので、落ちた科目に関しての情報は開示されない。

科目登録について

日本の大学でも同様、科目登録あるいは履修登録というものが存在する。
ただし、入学直後は学校側から強制的に必修科目の一部を登録させられてしまう。
これが非常に曲者で、自分のコースに関係ない物を強制的に登録させられ、結果として課金させられる。
これに関しては事前に防ぐ手立てはないので、強制的に登録させされた時点で自分のコースに必要な科目か確認するしかない。
関係ない科目が登録及び課金されていたら即座に学校側に連絡、その科目を取り消させる。
さて、入学して半年~1年ぐらいで強制登録はなくなる。
もっとも、事前にこのブログを読んでいた状態で入学すれば最初から無駄を排除することも可能だが。

さて、実際の科目登録だが、これはポータルサイト上で行うので学校に行く必要はない。
受けるべき科目の曜日と時間帯がかぶらなければいくらでも登録できる。
ただし、日本の大学と違い、1科目いくらで課金されるので注意。

日本の大学であればとりあえず100単位ぐらい登録し、数打てば当たる方式で半分の50単位は取得、それを3年繰り返せば卒業に必要な単位をほぼ修得でき、4年生で就職活動や研究に集中できるわけだが。中には勉強熱心な先輩がいて、4年間で300単位以上を取得したらしい。ということは登録したのはそれ以上ということになる。
もっとも文系の学部だと履修制限なるものが存在し、年間40単位までした登録できないとか正気の沙汰じゃない。
ところが、最近は理系学部含めCAP制限なるものが多くの大学であるようだ。なんか難しい横文字を使っているが要は履修制限。
上限がどれぐらいかは学校や学部によるだろうが、豪快に100単位以上登録ができないのは痛手であろう。先述の先輩のように300単位以上取得するようなやる気のある学生の芽が摘まれてしまうことにもなる。
日本の大学でも変な履修制限などはせず、科目ごと課金にすれば真剣に科目を選択するだろうし、何より授業がほとんどない4年生の学費を大幅に減らせるはずだ。放送大学が科目ごと課金を先駆けて実施しているようだが。
日本では大学全入時代などと呼ばれ、入学がやさしくなった分、入学後の勉強がハードになっているのだろうか。

科目ごとの授業料一覧

Triết học (3単位) 1,860,000
Đổi mới sáng tạo & Khởi nghiệp (2単位) 1,485,000
Quản lý và lãnh đạo (2単位) 1,485,000
Phương pháp nghiên cứu khoa học nâng cao (3単位) 1,860,000
Nguyên lý ngôn ngữ lập trình (4単位) 4,125,000
Phân tích thiết kế giải thuật (3単位) 不明
Cấu trúc dữ liệu và giải thuật (4単位) 不明
Mạng máy tính (4単位) 不明
Giải thuật nâng cao (3単位) 2,280,000
Hệ cơ sở dữ liệu nâng cao (3単位) 2,280,000
Kiến trúc máy tính nâng cao (3単位) 2,280,000
Lập trình nâng cao (3単位) 2,280,000
Khai phá dữ liệu (3単位) 2,280,000
Cơ sở tri thức (3単位) 2,280,000
Hệ thống thông minh (3単位) 2,280,000
Lập trình logic và ràng buộc (3単位) 2,280,000
Xử lý ảnh số và video nâng cao (3単位) 2,280,000
Thiết kế phần mềm hướng đối tượng (3単位) 2,280,000
Hệ hỗ trợ quyết định (3単位) 2,280,000
Thống kê đại số tính toán và ứng dụng (3単位) 2,280,000
Tính toán hệ thống khả cấu hình (3単位) 2,280,000
Xử lý ngôn ngữ tự nhiên (3単位) 2,280,000
Đồ họa máy tính nâng cao (3単位) 2,280,000
Phân tích chương trình (3単位) 2,280,000
Kiểm tra chương trình (3単位) 2,280,000
Hệ thời gian thực (3単位) 2,280,000
Hệ phân bố (3単位) 2,280,000
Tính toán song song (3単位) 2,280,000
Nguyên lý thiết kế và kiến trúc phần mềm (3単位) 2,280,000
Hệ thống nhúng (3単位) 2,280,000
Thiết kế phần mềm theo mẫu (3単位) 2,280,000
Điện toán đám mây (3単位) 2,280,000
Khai phá dữ liệu siêu lớn (3単位) 2,280,000
Bảo mật trên thiết bị di động (3単位) 2,280,000
Bảo mật tính riêng tư trong khai phá dữ liệu (3単位) 2,280,000
An ninh m¿ng (3単位) 2,280,000
Bảo mật thông tin cho nhà quản lý (3単位) 2,280,000
Nhận dạng mẫu và học máy (3単位) 2,280,000
Mô hình hóa & đặc tả yêu cầu phần mềm (3単位) 2,280,000
Công nghệ phần mềm thế hệ mới (3単位) 2,280,000
Mạng xã hội và thông tin (3単位) 2,280,000
Mạng máy tính nâng cao (3単位) 2,280,000
Bằng chứng số (3単位) 2,280,000
Bảo mật cơ sở dữ liệu (3単位) 2,280,000
Bảo mật sinh trắc học (3単位) 2,280,000
Bảo mật hệ thống thông tin hiện đại (3単位) 2,280,000
Bảo mật trên điện toán đám mây (3単位) 2,280,000
Mã hóa (3単位) 2,280,000
Dữ liệu lớn (3単位) 2,280,000
Hệ thống thông tin quản lý (3単位) 2,280,000

Nguyên lý ngôn ngữ lập trình 驚異の再履修率!

Nguyên lý ngôn ngữ lập trình (必修、4単位、授業料約2万円)の受講者名簿を見た。
全登録者は49名。ただ、授業が始まってからまだ1回も来ていない1名を除外し、実質48名ということになる。
この48名中、以前この授業を受けたことのある人数は20名。つまり、20 / 48 = 0.42 だから、42%が再履修者だ。
驚くべきことに、うち1名はこの授業が3回目となる再々履修者であった。
他の科目の再履修率がどれほどかまだ名簿を精査していないから比較できないが、異常ともいえる数値だ。
しかも再履修者も含め、少なくとも44名以上は毎回出席している。皆勤賞だ。
必修科目なんだから出席していれば単位認定すればいいように思えるが、大学としても単価が高い4単位科目を落とすことで安定した収益源としているのだろうか。
同科目を初めて受講する学生は28名。
学生数や単位習得の難易度が以前と同程度と仮定するならが、この28名中たったの8名が単位習得、残る20名は次回以降のセメスターで再履修ということになる。

実は2月末の初回授業の日、前期であの悪名高い科目を一緒に戦った戦友ともべきクラスメイトと隣同士で座った。
彼はもともと能力の高い人であったが、本科目においてもscalaIDEの使い方を熟知しており、自分の能力の低さにコンプレックスを感じていた。
だがその彼も再履修であることがわかった。
しかし、これは決して彼の能力が低いわけではない。
むしろ、彼ほどの能力があっても再履修を余儀なくされる恐るべき科目ということになる。

Lập trình nâng cao感想およびCuda C本試験コード

Học kỳ 1/2017-2018に行われたLập trình nâng caoだが、期末試験がほとんどできておらず、かつ出席をとらない授業であったため事実上出席点もなく、唯一の救いはプレゼンテーションが過大評価と思えるほどの好評であったからか、成績は10点満点中8点であった。
逆に中間・期末2回の試験を受験、プレゼン2回実施、レポート2回提出したにも拘わらずたったの3.7点というわけのわからない科目もあるので、これはもう運とか、先生と合う合わないといった次元のものかもしれない。
さて、そのLập trình nâng caoだが、Cuda Cの問題を自宅で自己採点というか再現してみた。

/*
del 20180130_exam.exe
nvcc 20180130_exam.cu -o 20180130_exam.exe -deviceemu
./20180130_exam
*/
#include<stdio.h>
#include<cutil.h>
#define ROWS 3
#define CLOS 5

__global__ void add_mat(float* mA, float* mB, float* mC, int nRows, int nCols){
	*(mC + blockIdx.x * nCols + threadIdx.x) = *(mA + blockIdx.x * nCols + threadIdx.x)+ *(mB + blockIdx.x * nCols + threadIdx.x);
}

__global__ void show_mat(float* mC, int nRows, int nCols){
	printf("%3.1f ", *(mC + blockIdx.x * nCols + threadIdx.x));
}

int main(int argc, char* argv[]){
	//int LnBlock, LnThread, LnRows, LnCols;
	float LnaA[ROWS][CLOS] = {
		 { 1.1, 1.2, 1.3, 1.4, 9.4 }
		,{ 2.1, 7.3, 1.7, 0.9, 2.4 }
		,{ 3.1, 7.3, 1.7, 0.9, 3.5 }
	};
	float LnaB[ROWS][CLOS] = {
		 { 3.5, 0.3, 3.1, 0.7, 9.4 }
		,{ 7.2, 7.3, 1.7, 0.9, 2.4 }
		,{ 8.2, 7.3, 1.7, 0.9, 9.9 }
	};
	float LnaC[ROWS][CLOS] = { 0.0 };
	printf("Question a\n");
	add_mat<<<(ROWS * CLOS), 1>>>(&LnaA[0][0], &LnaB[0][0], &LnaC[0][0], ROWS, 1);
	show_mat<<<(ROWS * CLOS), 1>>>(&LnaC[0][0], ROWS, 1);
	printf("\nQuestion b\n");
	add_mat<<<1, (ROWS * CLOS)>>>(&LnaA[0][0], &LnaB[0][0], &LnaC[0][0], ROWS, 1);
	show_mat<<<1, (ROWS * CLOS)>>>(&LnaC[0][0], ROWS, 1);
	printf("\nQuestion c\n");
	add_mat<<<ROWS, CLOS>>>(&LnaA[0][0], &LnaB[0][0], &LnaC[0][0], ROWS, CLOS);
	show_mat<<<ROWS, CLOS>>>(&LnaC[0][0], ROWS, CLOS);
}

Bài kiểm tra AST (11/4)

本日2018/04/11Nguyên lý ngôn ngữ lập trìnhにおいて小テストが実施された。この小テストはこれで5回目。ほぼ2回に1回の割合で実施されている。

Đã bắt đầu vào lúc Wednesday, 11 April 2018, 6:25 PM
Tình trạng Đã hoàn thành
Hoàn thành vào lúc Wednesday, 11 April 2018, 6:44 PM
Thời gian thực hiện 18 phút 25 giây
Điểm 2,50 của 10,00 (25%)

Câu hỏi 1

Không chính xác
Điểm -0,33 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho văn phạm có các luật sinh sau: 

program → vardecls 

vardecls → vardecl vardecls | vardecl 

vardecl → type ids 

type → INTTYPE | FLOATTYPE 

ids → ID COMMA ids | ID 

Và AST tương ứng với văn phạm trên được định nghĩa như sau: 

trait AST 
case class Program(decls:List[VarDecl]) extends AST 
case class VarDecl(typ:Type,id:List[String]) extends AST 
trait Type extends AST 
object IntType extends Type 
object FloatType extends Type 

Phương thức visitVardecls cần phải trả về đối tượng gì?

Chọn một:
 Không chính xác

Thông tin phản hồi

Câu hỏi 2

Chính xác
Điểm 1,00 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho luật sinh của phát biểu for trên ngôn ngữ Pascal được viết ở dạng EBNF như sau: 

forstmt → FOR ID ASSIGN exp (TO | DOWNTO) exp DO stmt 

trong đó, forstmt là ký hiệu không kết thúc đại diện cho phát biểu for; các token FORTO, DOWNTODO đại diện cho các từ khoá for, to, downto, do; ID đại diện cho một biến; ASSIGN cho := ; exp là ký hiệu không kết thúc đại diện cho biểu thức;stmt là ký hiệu không kết thúc đại diện cho phát biểu. Khi sử dụng TO thì vòng lặp for sẽ tăng giá trị biến đếm ID lên 1 sau mỗi lần lặp cho đến khi giá trị của ID lớn hơn giá trị của exp; còn khi sử dụng DOWNTO thì giá trị của biến đếm ID sẽ giảm đi 1 sau mỗi lần lặp cho đến khi ID nhỏ hơn giá trị của exp.

Trên AST, nút FORSTMT được dùng để diễn tả cho phát biểu for nói trên, hỏi nút FORSTMT sẽ có bao nhiêu nút con?

Chọn một:
 Chính xác

Thông tin phản hồi

Câu hỏi 3

Không chính xác
Điểm -0,33 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho văn phạm có các luật sinh sau: 

vardecls → vardecl vardecls | vardecl 

vardecl → type ids 

type → INTTYPE | FLOATTYPE 

ids → ID COMMA ids | ID 

Một visitor sinh bởi ANTLR cho văn phạm sẽ có phương thức visit nào trong các phương thức dưới đây?

Chọn một:
 Không chính xác

Thông tin phản hồi

Câu hỏi 4

Không chính xác
Điểm -0,25 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

 

Cho luật sinh của phát biểu for như sau: 

forstmt → LB exp SEMI exp SEMI exp RB  stmt 

trong đó, 
forstmt là ký hiệu không kết thúc biểu diễn phát biểu for; các ký hiệu kết thúc LBRB và SEMI tương ứng với '(', ')' và ';'; exp là ký hiệu không kết thúc biểu diễn biểu thức; stmt là ký hiệu không kết thúc biểu diễn một phát biểu bất kỳ.


Cho các khai báo cấu trúc dữ liệu của AST hiện có như sau:

trait Stmt // cấu trúc lưu trữ cho phát biểu

trait Exp // cấu trúc lưu trữ cho biểu thức

Chọn khai báo thích hợp cho cấu trúc dữ liệu của nút ForStmt trên AST biểu diễn cho phát biểu for trên?


 

Chọn một:
 Không chính xác

Thông tin phản hồi

Câu hỏi 5

Chính xác
Điểm 1,00 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho luật sinh của phát biểu if như sau: 

ifstmt → IF exp THEN stmt ELSE stmt 

trong đó ifstmt là ký hiệu không kết thúc đại diện cho phát biểu if; các token IFTHENELSE ứng với các từ khoá if, then, else; exp là ký hiệu không kết thúc đại diện cho một biểu thức; stmt là ký hiệu không kết thúc đại diện cho một phát biểu. 

Giả sử ctx là biến đang cất giữ nút ứng với ifstmt, để truy xuất nút con stmt sau THEN thì cần phải viết như thế nào?

Chọn một:
 Chính xác

Thông tin phản hồi

Câu hỏi 6

Chính xác
Điểm 1,00 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho luật sinh của phát biểu if như sau: 

ifstmt → IF exp THEN stmt ELSE stmt 

trong đó ifstmt là ký hiệu không kết thúc đại diện cho phát biểu if; các token IFTHENELSE ứng với các từ khoá if, then, else; exp là ký hiệu không kết thúc đại diện cho một biểu thức; stmt là ký hiệu không kết thúc đại diện cho một phát biểu. 

Giả sử ctx là biến đang cất giữ nút ứng với ifstmt và đang viết cho một visitor để tạo AST, để tạo AST cho nút con stmt sau ELSE thì cần phải viết như thế nào?

Chọn một:
 Chính xác

Thông tin phản hồi

Câu hỏi 7

Không chính xác
Điểm -0,25 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho văn phạm có các luật sinh sau:  

program → vardecls 

vardecls → vardecl vardecls | vardecl  

vardecl → type ids  

type → INTTYPE | FLOATTYPE  

ids → ID COMMA ids | ID  

Và AST tương ứng với văn phạm trên được định nghĩa như sau: 

trait AST 
case class Program(decls:List[VarDecl]) extends AST 
case class VarDecl(typ:Type,id:List[String]) extends AST 
trait Type extends AST 
object IntType extends Type 
object FloatType extends Type 

Đối tượng IntType được tạo ra trong phương thức nào?

Chọn một:
 Không chính xác

Thông tin phản hồi

Câu hỏi 8

Chính xác
Điểm 1,00 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho luật sinh của phát biểu if như sau: 

ifstmt → IF exp THEN stmt ELSE stmt 

trong đó ifstmt là ký hiệu không kết thúc đại diện cho một phát biểu if; các token IFTHENELSE ứng với các từ khoá if, then, else; exp là ký hiệu không kết thúc đại diện cho một biểu thức;  stmt là ký hiệu không kết thúc đại diện cho một phát biểu bất kỳ.

Trên AST, nút IFSTMT được dùng diễn tả cho phát biểu if trên, hỏi nút IFSTMT sẽ có bao nhiêu nút con?

Chọn một:
 Chính xác

Thông tin phản hồi

Câu hỏi 9

Không chính xác
Điểm -0,33 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

Cho luật sinh của phát biểu if như sau: 

ifstmt → IF exp THEN stmt ELSE stmt 

trong đó ifstmt là ký hiệu không kết thúc đại diện cho phát biểu if; các token IFTHENELSE ứng với các từ khoá if, then, else; exp là ký hiệu không kết thúc đại diện cho một biểu thức; stmt là ký hiệu không kết thúc đại diện cho một phát biểu. 

Nút trên cây phân tích cú pháp (parse tree) sinh bởi ANTLR ứng với ifstmt sẽ là đối tượng của lớp nào?

Chọn một:
 Không chính xác

Thông tin phản hồi

Câu hỏi 10

Không chính xác
Điểm 0,00 của 1,00
Cờ câu hỏi

Nội dung câu hỏi

 

Cho cấu trúc dữ liệu của AST được khai báo như sau:

trait Exp

case class Add(e1:Exp,e2:Exp) extends Exp // cho phép cộng 2 ngôi

case class Minus(e1:Exp,e2:Exp) extends Exp // cho phép trừ 2 ngôi

case class Mul(e1:Exp,e2:Exp) extends Exp // cho phép nhân

case class Lit(i:Int) extends Exp

Hãy viết AST thích hợp của biểu thức (10 - 20) * 5 + 7 (độ ưu tiên và kết hợp như thông lệ)? 

Qui ươc viết:

- Viết đúng cả chữ thường và hoa, đúng thứ tự toán hạng (trái hoặc phải), trình tự tính toán

- Không viết khoảng trắng 

= Không viết dư thừa

 

*1:10-20)*5)+7" />Không chính xác

Thông tin phản hồi

2018/04/07 Nguyên lý ngôn ngữ lập trình中間試験

去る2018年4月7日(土)、Nguyên lý ngôn ngữ lập trìnhの授業後半においてKiểm tra giữa kỳ(いわゆる中間試験)が行われた。時間は65分間で、問題用紙の持ち帰りは禁止されている。「持ち帰った場合は0点とする」との但し書き付きであった。

しかしおまけとして一人1枚ずつわら半紙が配られた。今までの傾向から中間試験や期末試験でわら半紙が配られた場合、回収されず、仮に試験官に渡しても受け取りを拒否される。ということは、ここに問題を書き写して持って帰ればいいわけだ。これまで試験を受けた科目はすべて選択科目であったため、わざわざ手書きで写すほどのことでもなかったが、本科目は必修なので、仮に今期落ちても、来期以降で再履修する場合に備えて問題を控えておいた方がいい。というか本科目は再履修(および再々履修)の人数が多いので、落ちることも想定して保険をかけておくべきだろう。

本科目のアクティブ受講者40名中外国人は俺を含め2名。もう一人の彼に対しては問答無用で英語版が配られたが、俺に対しては「Vietnamese or English?」と聞いてきたので、迷わずEnglishと答えた。問題を書き写していて思ったのだが、何も一字一句同じに書く必要はなく、要点だけを日本語で書けばいいということに気が付いた。

f:id:k4h8:20180410123857j:plain

I. Part one(以前出された課題1の評価式を利用すること)4点満点

1. RELOPによる正規表現で以下4つを表す方法を7文字以内で答えよ。
>=, <=, >, <

2. ANTRLによる正規表現で以下条件のパスワードを表せ。
4文字以上。
少なくとも数字1桁かつ文字1桁を含む。
〇いい例 123a, Ab2cg, m2Ncxd4
×ダメな例 1234(数字のみで文字がない), mnbcg(文字のみで数字がない), a?12x(?を使ってはいけない)

3. BNFによる正規表現
@, ^, ? で、優先度はそれぞれ小中大
演算子はINTである

4. 以下構文をANTRLを使って表せ。
struct vidu{
    int a, b;
    struct con{
        float c;
        float d;
    } e:
}

ID identifer
COMMA ,
SEMI ;

f:id:k4h8:20180410125049j:plain

II. Part two (6点満点)

5. 以下コード
class A {def accept(V:Visitor) = ......

と、書いているうちにつかれてきたので問題そのものはこの辺で。

内容としては、全体の4割が正規表現に関するもの。仕事で普段から秀丸サクラエディタを使いこんでいる人であれば正規表現そのものは知っていても(ベトナムに来ると日本語環境がなかったりしてnotepad++やsublime textが一般的だが)、RELOP、ANTRL、BNFの3種類の違いを全部暗記するのは大変だ。残りの6割はプログラミング言語scalaに関する問題だが、はっきりいって授業自体が大変に分かりにくく、無料のscala攻略サイトを見た方がはるかに分かりやすい。自分の場合はドワンゴ社のサイトhttps://dwango.github.io/scala_text/が役に立った。

授業料の値上げ

各科目の授業料課金情報を見ていたところ、HK1/2017-2018から授業料が値上げされていることに気づいた。

入学当初HK 2/2016-2017の科目としてTriết học 1,560,000(3単位科目)が勝手に登録・課金されており、何の連絡もなかったのでこの登録は無効だとして今期にずらしたが、今期で登録した同科目に1,860,000が課金されていた。もちろんこの課金は不当としてキャンセルさせたが、それよりもわずか1年で授業料が20%値上げという点に驚愕だろう。逆に言うと、あと1年早く入学していたらもっと安くすんだわけだ。そうなると、来年の授業料はどうなるのか。日本の大学でも授業料の値上げはありうるが、1年で20%上がるというのはあまり聞かない。ベトナムの大学では在籍年数が長引くと闇金ウシジマくんなみに支払額が増えるのだろうか。

HK 2/2017-2018の授業料

今期であるHK 2/2017-2018の授業料通知が来た。期の開始が2月なので、大分遅れて通知が来たことになる。

Nguyên lý ngôn ngữ lập trình: 4,125,000(4単位科目)
Xử lý ngôn ngữ tự nhiên: 2,280,000(3単位科目)
合計: 6,405,000

4単位科目がまさか3単位科目の倍近いとは予想外である。角刈りの余計な署名活動により授業が6回増えたのでその分の増額もあるのかもしれない。このことは他の単位科目を登録した際に明らかになろう。なお、今期の授業は4科目あるが、うち2科目は以前の期ですでに支払ったものの学校側の都合で開講が遅れて今期にずれた。なので上記に挙げた残り2科目を今月払うことになる。支払金額は5月30日までとなっている。実はHK1/2017-2018の授業料支払が1か月ぐらい遅れのたが、その際特になんの連絡もなかった。こちらから支払方法について問い合わせたところ、「最寄りのOCBに行ってカードを有効化し、その口座に入金し、OCB公式サイトにて引き落とせ」というものであった。

参考までに2017-2018年度中の授業料合計は16,665,000(本日のレートで約78,507円)である。日本の大学院の年間授業料と比べれば格段に安く、仮に卒業まで4年かかったとしてもこの4倍ぐらいであれば30万円ちょっとか。

なお、日本の場合大学院は卒業ではなく修了というのが正しいが、ベトナムにおいては学部と同じく卒業という言葉を用いる。なので本ブログでも卒業要件などという言葉が出てくるが、日本の大学院でいうところの修了要件と同義である。

Học kỳ 1/2017-2018の成績

Học kỳ 1/2017-2018(日本風に言えば2017-2018年度前期か)の成績がすべて明らかとなった。登録は3科目で、どの科目も3単位。

Hệ cơ sở dữ liệu nâng cao: 3.7
Kiến trúc máy tính nâng cao: 4.5
Lập trình nâng cao: 8

成績は10段階評価というか10点満点で、5点以上が合格、つまり単位取得とされる。この場合、1/2017-2018では1科目合格なので、取得単位数は3単位となる。卒業には60単位取得が必要だから、このペースでいけば単純計算で10年かかる。さすがに今期は3単位ということはないだろうから、もう少し短くなるとは思うが、それでも修士課程を2年間で修了するのは簡単ではないようだ。

20160404 Nguyên lý ngôn ngữ lập trình

AstSuite.scala

import org.scalatest.FunSuite
import mc.utils._

class AstSuite extends FunSuite with TestAst {
test("an assignment to an int literal") {
val input = "a = 1;"
val expected = Prog(List(Assign("a", Intlit(1))))
assert(checkAst(input,expected,301))
}
test("an assignment to an expression ") {
val input = "a = a + 4;"
val expected = Prog(List(Assign("a", BinOp("+",Id("a"),Intlit(4)))))
assert(checkAst(input,expected,302))
}
test("a simple if statement") {
val input = "if 2 then a = 2; else a = 5;"
val expected = Prog(List(IfStmt(Intlit(2),Assign("a",Intlit(2)),Assign("a",Intlit(5)))))
assert(checkAst(input,expected,303))
}
// Question 2.
test("Question 2. a") {
val input = """a = 4; if b then a = 2; else a = 5; """
/*val expected = Prog(
List(
Assign("a",Intlit(4)),
IfStmt(
Id("b"),Assign("a",Intlit(2)),
Assign("a",Intlit("a",Intlit(5)))
)
)
)*/
val expected = Prog(List())
assert(checkAst(input,expected,304))
}
test("Question 2. b") {
val input = """a = b + 4; b = c − (d + 4); c = d − 1; """
val expected = Prog(List())
assert(checkAst(input,expected,305))
}
}

 

ASTGeneration.scala

package mc.astgen
import org.antlr.v4.runtime.Token
import org.antlr.v4.runtime.CommonTokenStream
import org.antlr.v4.runtime.ParserRuleContext
import java.io.{PrintWriter,File}
import org.antlr.v4.runtime.ANTLRFileStream
import mc.utils._
import scala.collection.JavaConverters._
import org.antlr.v4.runtime.tree._
import mc.parser._
import mc.parser.MCParser._

class ASTGeneration extends MCBaseVisitor[Any] {

override def visitProg(ctx:ProgContext) = Prog(ctx.stmt.asScala.toList.map(visit(_).asInstanceOf[Stmt]))

//override def visitStmt(ctx:ProgContext) = ctx.getChild(0).accept(this)

}