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%) |
*1:10-20)*5)+7" />
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と答えた。問題を書き写していて思ったのだが、何も一字一句同じに書く必要はなく、要点だけを日本語で書けばいいということに気が付いた。
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 ;
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)
}
20160331 Nguyên lý ngôn ngữ lập trình
package exercisepackage exercise
trait FP {
// Q1 def recLstSquare(n:Int):List[Int]={ if(n==1) List(1) return recLstSquare(n-1) ++ List(n*n) } def recHelpLstSquare(n1:Int,n2:Int):List[Int] = { if(n1==n2) List(n2*n2) else (n1*n1)::recHelpLstSquare(n1+1, n2) } def higLstSquare(n:Int):List[Int]{ //return (1 to n).map(n => n*n).toList }// Q2 def recPow(x:Double,n:Int):Double = { if(n==0) 1 else x * recPow(x, n-1) } def higPow(x:Double,n:Int):Double = (1 to n).toList.foldLeft(10)*1((x,y)=>y::x) }// Q4 def LessThan(n:Int,lst:List[Int]):List[Int] = null def recLessThan(n:Int,lst:List[Int]):List[Int] = { if(lst.isEmpty) lst else{ if(lst.head < n) lst.head::recLessThan(n, lst.tail) else recLessThan(n, lst.tail) } } def higLessThan(n:Int,lst:List[Int]) = null
// Q5 case class A(n:String,v:Int) case class B(x:Int,y:A) def lookup[T](n:String,lst:List[T],f:T=>String):Option[T] = { if(lst.isEmpty) null else{ if(f(lst.head)==n) Some(lst.head) else lookup(n, lst.tail, f) } }}
object Main { def main(args: Array[String]) { //debug message println("This is a main functuion") val LnSqare = new Array[Int](10) }}
*1:a,b)=>a*n)// Q3 def recAppend(a:List[Int],b:List[Int]):List[Int] = { if(a.isEmpty) return b else return a.head::recAppend(a.tail,b) } def recReverse(a:List[Int]):List[Int] = { a match { case List() => a case head::tail => recReverse(tail):+head } } def higAppend(a:List[Int],b:List[Int]) = null def higReverse(a:List[Int]):List[Int] = { a.foldLeft(List[Int](
20160328 Nguyên lý ngôn ngữ lập trình
package exercise
trait FP {
// Q1
def recLstSquare(n:Int):List[Int]={
if(n==1) List(1)
return recLstSquare(n-1) ++ List(n*n)
}
def recHelpLstSquare(n1:Int,n2:Int):List[Int] = {
if(n1==n2) List(n2*n2)
else (n1*n1)::recHelpLstSquare(n1+1, n2)
}
def higLstSquare(n:Int)= recHelpLstSquare(1,n)
// Q2
def recPow(x:Double,n:Int):Double = 0
def higPow(x:Double,n:Int) = null
// Q3
def recAppend(a:List[Int],b:List[Int]):List[Int] = null
def recReverse(a:List[Int]):List[Int] = null
def higAppend(a:List[Int],b:List[Int]) = null
def higReverse(a:List[Int]):List[Int] = null
// Q4
def recLessThan(n:Int,lst:List[Int]):List[Int] = null
def higLessThan(n:Int,lst:List[Int]) = null
// Q5
case class A(n:String,v:Int)
case class B(x:Int,y:A)
def lookup[T](n:String,lst:List[T],f:T=>String):Option[T] = null
}
object Main {
def main(args: Array[String]) {
//debug message
println("This is a main functuion")
val LnSqare = new Array[Int](10)
}
}
Nguyên lý ngôn ngữ lập trình初課題提出
chương trình đào tạo định hướng ứng dụng(Coursework)とchương trình đào tạo nghiên cứu(Research)のいずれでも必修科目となるNguyên lý ngôn ngữ lập trìnhの初回課題提出期限が今週末に迫った。
なお、同科目は珍しく4単位であり、回数も毎週水・土の10週、20回となっている。授業料は不明だが、3単位科目よりは高いかもしれない。いずれにしても金の問題よりも20回通うという肉体的負担の方が大きいのでできれば再履修は避けたい。
と思っていたらクラスの中に妙にやる気のある角刈りの奴がいて、授業の3週延長を申し出た。つまり6回追加になるわけだ。出席表が回ってきたのでサインしたら、なんとそれが授業延長の署名であった。かくしてその角刈りはクラス全員の署名を先生に渡し、その後ポータルサイトでも全授業回数が週2回の13週、合計26回となっているのが確認できた。ちなみに先生が若い女だから延長を希望したとかではない。40代ぐらいの男の先生である。授業も最新設備を利用した実習とかではなく、何もない教室での座学である。角刈りがなぜ延長を希望したのかはよく分からない。
さて、課題の提出は特設サイト
www.cse.hcmut.edu.vn/onlinejudge
において行われる。ここから以下の3ファイルを送信する。
MC.g4
LexerSuite.scala
ParserSuite.scala
当然、何も提出しないと0点となる。実は課題は今回の課題Aと次回の課題Bの2回あるが、単なる両者の合計点ではない。数式にすると
課題点数 = 2 * A * B / ( A + B )
となり、どちらかが0点だと自動的に課題全体が0点という理解に苦しむルールになっている。
なお、同科目全体の成績のつけ方は以下の通り。
Tutorial/Lab/Online(授業中の小テスト): 10%
Assignment(課題): 30%
Midterm(中間試験): 20%
Final(期末試験): 40%
科目の成績が50%以上なら単位取得となる。なお、MidtermやFinalはノートや自分で印刷してきた紙を見ながら問題を解くことが認められていが、PCの使用ができる科目は全体の3割ぐらい。ただし、たとえPCが使えても、そもそも試験問題は何パターンもあるので他の奴に答えを聞いても有利になることはないだろう。また、授業中の小テストも出題順序が人によって違う上に前の問題には戻れない仕様となっているので隣の席の奴のPCを覗き見るというカンニング防止になっている。
授業の時間帯は?
ベトナムの大学院の授業は平日の夜と土日を中心に行われる。2016年までは平日の昼間に必修科目があったようだが、2018年現在は存在しない。おかげで会社を休むことなく通える。このため、日本にように純粋な大学院生という人はあまりおらず、平日の昼間働いている人が多い。もちろん23歳で大学院に通っている人もいるが、全体の半分以下。30代ぐらいなら普通だ。40代ぐらいでも修士課程なら目立つようなものでもない。
なお、具体的な時間割は以下の通り。
6:30~8:55(土日のみ)
9:05~11:30(土日のみ)
12:30~14:55(土日のみ)
15:05~17:30(土日のみ)
18:15~20:40
授業回数は15回。週に1回で15週だが、たまに週2回で8週の科目もある。
ベトナム大学院の学費は?
ベトナムの大学院の授業料は日本のように年間定額ではなく、登録した科目ごとの課金である。しかも、同じ単位数であっても科目ごとに金額が違うので、値段は実際に登録して、1か月ぐらい経ってみないとわからない。時価のすし屋に行ったような気分だ。
具体的な科目名(単位数)金額としては
Đổ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₫
Triết học (3) 1,560,000₫
Phương pháp nghiên cứu khoa học nâng cao (3) 1,860,000₫
Hệ cơ sở dữ liệu nâng cao (3) 2,280,000₫
Lập trình nâng cao (3) 2,280,000₫
Kiến trúc máy tính nâng cao (3) 2,280,000₫
のように、同じ3単位科目でも1,560,000₫~2,280,000₫の開きがある。なお、成績のつけ方も詳しくは別ページで述べたいが、日本のようにとりあえず出席すれば、あるいはそもそも出席しなくても単位取得できるというものではなく、再履修もあり得る。というか、大半が初見殺しだ。その場合、また上記の授業料を払わなくてはならない。学生側も考えたもので、登録せず(=課金せず)教室に入り何食わぬ顔で授業に参加している者もいる。半分以上過ぎたところで姿を消すのだが、おそらく1発で単位取得できるように授業の内容を前もって知っておくのだろう。
コース選択に気を付けて!
ベトナムの大学院において、以下2つのコースがある。
chương trình đào tạo định hướng ứng dụng(Coursework)
chương trình đào tạo nghiên cứu(Research)
ググるとOZの大学院が同じような仕組みのようだ。イギリスにもTaughtとResearchの2つがあり、ほぼ同等とみていいだろう。なお、日本の大学院はnghiên cứu(Research)に近いようだ。
ứng dụng(Coursework)…座学50単位、修士論文10単位。合計60単位
nghiên cứu(Research)…座学30単位、修士論文兼出版による報告30単位。合計60単位
2つのコースが「ある」のであって、「選べる」ではない点に注意したい。というのも、入学手続きをすると自動的にというか勝手にứng dụng(Coursework)にさせられてしまう。それだけならまだしもứng dụng(Coursework)の必修科目まで勝手に登録させられてしまう。それらはnghiên cứu(Research)では必要のない科目だ。挙句の果てに不要な科目の授業料が課金される。1科目1万円以上で、3科目。具体的な授業料については別な機会に詳細を書きたい。
わざわざベトナムくんだりまで来て大学1年生のように授業を受けるのもなんだし、大学院なら研究メインだろう。入学手続き後は、「nghiên cứu(Research)を選択する」と早めに事務所に伝えておいた方がいい。あとあと無駄な金と時間を使わずに住む。
ベトナム大学院のレベルは?
あいにくと設備はなく、黒板(ホワイトボード)と机といすがあるだけ。申し訳程度に半世紀前のプロジェクタがあるぐらいだが古すぎて持ち込んだPCを繋げない人も多い。ここで「持ち込んだPC」という文言を見て気づいた人、正解。大学にPCないんだ。日本ほどの設備ではないのは仕方ないが、これはタンザニア、ジンバブエ、エチオピア、モザンピークに劣る。ウガンダあたりと比べてどうかなってレベル。
ただ、逆に一回りして、学生として通っているやつらは金持ちばかり。そう、教室にPCが1台もなくても、一人1台のPCをもってきている。というか、授業がその前提で行われ、各自持ち込んだPCをインターネットに接続し、オンライン上で小テストが行われたりする。つまり、ノートPCが買えない奴は入れない。一応国家大学なので学費自体は安いが、設備が全部持ち込みっていうのはつらい。
ちなみに、国家大学というのはベトナムにある大学の分類で、国立大学の中でも特に予算が多く配分されている(=授業料が安い)のが国家大学と呼ばれる。なお、授業料は日本で一般的な年間定額ではなく、登録した科目に応じて異なる。なのでその時々で違うが、一般的な年間学費はノートPCより安い。下手すりゃ月の家賃よりも安いかも。これは教育にかかるコストが安い国とみることもできるが、不動産価格が不当に高い国と考えることもできる。ベトナムの不動産については議論をすると長くなってしまい本来の趣旨である大学院の話題から外れるのでこの辺で。
学校紹介
通っている学校の情報。
名称:Đại Học Bách Khoa Thành Phố Hồ Chí Minh(英語名称:Ho Chi Minh City University of Technology)
学位:thạc sĩ
推定学費:約40万円