犬も歩けばエンジニアになる

プログラミングや数学や物理に関する技術メモ

米国CS学部で卒業までに履修した授業-1~2年目編

筆者が米国のとあるリベラルアーツカレッジでCS(コンピュータサイエンス)学部と物理学部をダブルメジャーで卒業するまでに履修した授業を紹介してみようと思います。

対象となる読者

  • 理系でアメリカ留学に興味のある方

  • 文系卒エンジニアだけど理系卒エンジニアがどんな勉強をしてきたのか気になる方

一年目

一年目はほとんど数学関連の授業です。すべての基礎となる数学の知識をガチガチに固めます。 リベラルアーツで教養の授業も取らないといけないので、理系科目は少なめです。

1 Calculus (2学期) Math

教科書:Calculus by Michael Spivak

日本の大学でいう解析の授業です。高校時代に習った極限の概念をイプシロン-デルタ論法を使って厳密に定義し、足し算・掛け算から、微分積分まで再定義していきます。

2 Linear Algebra (1学期) Math

教科書:Linear Algebra with Applications by Otto Bretscher

機械学習やグラフィックスなど、線形代数の知識が生きてくるCS分野はたくさんあります。単なるウェブアプリ開発などであれば、これらの分野の知識がなくても生きていけますが、流行りのAI開発に関わりたいのであれば線形代数は欠かせません。

3 Data Structures and Algorithms (1学期) CS

一年目で唯一のプログラミングを伴う授業です。連結リスト、ハッシュマップ、二分木などのデータ構造やバブルソートクイックソートなど基本となるアルゴリズムJavaで実装していきます。 特にハッシュマップは知っているかいないかで世界が変わるので、必須の知識です。

4 Modern Physics (2学期) Physics

教科書:Quantum Physics of Atoms, Molecules, Solids, Nuclei, and Particles by Robert Eisberg

高校で習った古典物理で凝り固まった頭を近代物理へとアップデートします。プランクアインシュタインなど、物理学の英雄たちが編み出した特殊相対性理論量子力学を歴史の順番通りに学んで行きます。 実験やレポートが多く、個人的には四年間の大学生活で一番苦労した授業でした。

二年目

二年目は物理から距離を起き、CS寄りの授業ばかり取っていくことにしました。早めにプログラムを書けるようになって、インターンや金稼ぎをしたいという不純な理由ですw

5 Computer Organization (1学期) CS

そもそもコンピュータってなんだっていうところから始まる授業です。ANDやOR回路など回路の組み合わせで足し算掛け算ができるよっていうお話に始まり、チューリングマシンなど概念的なことからintelSandy Bridge世代に導入されたHyper-Threading(ハイパースレッディング)がどういう仕組みなのかなど、低レベルなコンピュータ技術を中心に学んで行きます。 ラボではVHDLを使ってFGPA上で自作CPUを作り、最終的にはPythonアセンブリ言語を自作するところまで行きました。

6 Data Analysis and Visualization (1学期) CS

基本的なデータサイエンスのお話。はじパタに書いてあるような、ベイズ統計、K近傍法、PCA(主成分分析)などから、ニューラルネットワークPythonとnumpyのみで実装していく授業です。流行りのニューラルネットワークについても教えてもらえたので、教授はちゃんと授業内容をアップデートしているんだなと感心しました。

7 Computer Vision (2学期) CS

前半はディープラーニングが流行る以前の技術である、SIFTなどの特徴量によるObject Recognition(物体認識)の技術などを勉強します。後半ではディープラーニングを使った最先端のモデルの論文を読んでディスカッションするのが主な内容です。後半では、ディープラーニングを使った自然言語処理音声認識の技術であるRNNやLSTMについても学びました。

8 Programming Languages(1学期) CS

プログラミング言語について詳しく学ぶ授業です。Haskellなど関数型プログラミングの方法や、Parallel Computing(並列計算)の方法、c言語のメモリ管理についてなど、雑多な内容が多かった印象ですが知っていいて損はない知識ばかりでした。

9 Vector Calculus(1学期) Math

日本の大学で言うベクトル解析の授業です。ガウス、ストークス、グリーンの定理など、三次元空間上の微積分について学びます。ほとんど物理のために取った授業でしたが、三次元空間での計算に慣れることができたという意味ではCSにも生きている気がします。


リストが長くなってきたので、3~4年目編は別記事にします。

Julia - for文内でよく起きるUndefVarErrorの対処法

JuliaのFor文内でUndefVarErrorが出る場合

Juliaで誰もが一度は遭遇するのがUndefVarErrorです。

ERROR: LoadError: UndefVarError: num not defined

Pythonや他の言語を勉強した人がJuliaでコードを書くと、あれっとなる場所でこのエラーが起こります。 例を上げてみましょう。

NG例

num = 0  
for i=1:10  
  num += i 
end                     
print(num)

ぱっと見これで問題なさそうですが、Juliaでこれは動きません。

Juliaでは、グローバル変数をスコープ内で扱う場合には明示的にglobal修飾子をつける必要があるのです。

OK例

num = 0  
for i=1:10  
  global num += i  # ここにglobalが必要!
end                     
print(num)


グローバル変数とローカル変数のさらに詳しい記事も書きましたので、ぜひ読んでみてください!

segas.hatenablog.com

おすすめ理系洋書 - Priciples of Mathematical Analysis (Rudin)

Baby Rudinとして知られる超良書

以前から気になっていた解析学の洋書を読み終わったので本ブログ初のブックレビューをしてみます。 このPrinciples of Mathemtaical Analysisはアメリカの大学では解析の授業で必ず手っていいほど指定の教科書になる超超超ド定番の本です。私自身はアメリカの学部卒ですが、数学専攻ではなかったので触れ合う機会はありませんでした。それでもBaby Rudinという愛称で親しまれ、数学専攻の友人は必ず持っている本だったのでいつか読んでみたいと思っていました。


どんな人におすすめか

結論から言いますと、数学科以外の理系学生だけど数学に自信のない方におすすめです。この本は一切図形や直観的な解説がなく、すべての定理・定義が数式と言葉で表されています。そのため、あいまいな理解ではこの本を読み終わることができません。しかし、解説が冗長で退屈なわけではなく、すべての定理の証明が驚くほどにシンプルで美しく解説されています。あくまで私の感想ですが、この本を読んだことによって数学者がなぜ数学を愛するのかが理解できた気がします。と、ここまでこの本を褒めちぎりましたが、万人におすすめということではありません。内容的には高校数学ができれば理解できなくはないはずですが、リーマン積分などさえ図がなしに説明されています。また、中には証明が美しすぎて、「作者はどうやってこんな証明方法を思いついたんだろう」と感心するものがあります。少なくとも理系で大学レベルの数学に触れてきた人でなければ理解に時間がかかりすぎて投げ出してしまうでしょう。


Baby Rudinを読む前に

文系だけど数学に興味がある人や、挑戦してみたい高校生などには別にMichael SpivakのCalculusという本がおすすめです。こちらの本もアメリカの大学では必ずと言っていいほど指定教科書になるもので、私が卒業した物理学科でも一年目の数学の授業で使いました。Rudinが定理をできるだけ簡潔に美しく証明するのに対し、Spivakはどういった思考過程で証明を思いつくのか、直観的な説明も交えて解説してくれています。Baby Rudinは数学科の学生が証明を一つ理解するのに数時間を要するような本です。少なくとも大学数学の経験がない人がBaby Rudinから読み始めるのは少し無謀なレベルだと感じました。

過去記事まとめ


Julia

Julia - for/whileループ文のいろいろ

For文の基本

Forループで1から10まで出力する例です。

for i=1:10
    println(i)
end

特に難しい点はありませんね。

リストの要素を一つずつ取り出すinキーワードも便利です。

for i in [1, 2, 3, 4, 5]
    println(i)
end

while文の場合

While文を使う場合、global変数を定義してからループさせる場合が多いです。 1から10まで出力させる例だと以下のようになります。

i = 1
while i<=10
    println(i)
    global i += 1  # globalを付けないとエラー
end

while文内では変数iがglobalであることを明記しないといけないのは忘れがちです。

Juliaでのglobal関数やlocal関数については別記事があるので参考にしてください。

Julia - グローバル変数とローカル変数 - Juliaで学ぶプログラミング(Pythonも使うよ!)

while文とbreak

breakを使ってwhileループから抜け出すこともできます。

while true
    println(i) # ここはglobalなし
    if i >= 5 # ここはglobalなし
        break
    end
    global i += 1 # ここはglobalを付けないとエラー
end

if文やprint関数に渡す時はiにglobalを付ける必要はありませんが、iに新しい値を代入する場合はすでに定義されているglobal関数に値を代入することを明示的にするためglobalが必須です。

暗号学 - 暗号理論の活用例

暗号とは

暗号理論を学ぶ前に、暗号とは何をするものなのかをまず明確にしましょう。

今現在、世界に存在する暗号を利用した製品やサービスは想像以上に多くあります。以下が全てではありませんが、いくつかのサービスをカテゴリー別にあげてみましょう。

1.通信の保護

送信者と受信者の少なくとも二人が三者に通信内容を知られることなく情報のやり取りを公の場ですることが目的。また、通信内容を途中で三者に改竄されなようにする必要もある。

2.保存データの秘匿化

ユーザーがデータを自分にしか解読できない状態で保存することが目的。通信の保護よりデータサイズが大きな場合が多い。

  • BitLocker (Windows標準搭載のディスク暗号化ツール)
  • AndroidiOSのデータ暗号化機能
  • Tresorit (暗号化クラウドストレージサービス)

3.ユーザーの認証

ユーザや物を識別し、なりすましを防ぐのが目的。特定のユーザだけを受け入れ不正ユーザを排除するサービスが多い。パスワードを知っているか、もしくはパスワードが埋め込まれた物理的な鍵を持っているかで認証する。

4.改竄の防止

複数人で一度合意した内容が改竄されてしまうことを防ぎます。複数人の参加者がお互いを必ずしも信用していないという点で、通信の保護の改竄防止とは少し異なります。

もちろんこれらが全てではなく、他にもたくさんの利用例があるでしょう。


まとめ

この記事をよんで覚えていただきたいのは、

  • 暗号理論は情報を秘匿するだけでなく、なりすましや改竄を防ぐ

です。

暗号学 - 暗号の歴史

暗号学の勧め

もしあなたが一度でも、暗号学で世界に貢献したい、暗号で愛する誰かを守りたい、美女のPCをクラッキングしてムフフな画像をを入手したい、と一度でもおもったことがあるならば、暗号を学ぶモチベとしては十分です。昔の私もそうでしたから(どれが一番のモチベだったかはご想像にお任せします)。


暗号の歴史 - 超要約

まず暗号学の今日までの流れを見てみましょう。

-19世紀末まで

コンピュータのない時代に暗号は主に軍事と外交目的でつかわれていました。暗号といっても某名探偵少年漫画のダイイングメッセージ的な、なぞなぞのようなものです。

-20世紀前半

第2次世界大戦中の通信手段として、ドイツ軍が人類で初めて機械的な暗号装置を開発します。対するイギリスなどの連合国側はそれを解読するための装置を開発し、暗号化、解読ともに急速にハイテク化します。アラン・チューリングら天才たちがコンピュータの前進のような電子計算機でドイツ軍の暗号解読に成功します。

f:id:segas:20200612213521j:plain
"File:Enigma vorne.jpg" by corppneq is licensed under CC0 1.0

-20世紀後半

コンピュータが企業などのビジネス用途で普及しだし、銀行間の送金システムなど、軍事以外の目的での暗号利用がはじまります。また、インターネト上で暗号が利用されるようになり、簡単に通信傍受、改変、そしてなりすましができるようになったため、それらの攻撃から通信を守る必要性が出てきました。

21世紀~

一般庶民にもパソコンやスマホが普及し、HTTPS,Wifi,4G通信などで暗号が使われまくっています。量子コンピューターの実用化の可能性がでてきたため、量子暗号アルゴリズムなどが研究される時代になりました。