propyonの日記

情報科学を学ぶ黄色いネズミ

米国(短期)留学週記~最終週~

tags: 米国(短期)留学週記

先週(先週とは言っていない)の自分への課題ができたかどうか

個人的なやつ

大関

  • [x] 機械学習の論文(転移学習関連)を読む
    • 読んだ
  • [ ] パタへネを...読めるだけ
    • 読んだ(終わってないです)
  • [ ] I1実験のレポートだけでも...(他の課題で詰まっている...)
    • 終わらない

こっち

  • [ ] introduction to the theory of computationを読み終える
    • 授業のスライドの復習で手一杯だった
  • [ ] CLRSを6章まで読む
    • 授業のスライドの復習(ry
  • [x] 期末試験に備えて勉強をする(当たり前)
    • 爆死しました

Stanford生活の総括

色々学びました(大嘘)

まず学んだものの中で一番大きいものは忘れないためには定期的に復習が必要だということです

ということで学んだこと(雑すぎる)を列挙していきます

日本とカリフォルニアの違うところ(と僕が感じた・聞いたこと)

以下はカリフォルニアが主語

僕は情報系なのでソースや話題は基本的にそっちの方や業界です

この情報が絶対というわけではないのであしからず

  • カリフォルニアの方が物価が圧倒的に高い(ラーメン一杯で$20とか?)
  • 飯がまずい(旨味という概念がまじでない)
  • カリフォルニアはcompetitiveな環境
    • 給料は高いが競争は苛烈(女性だと干されるし妊娠するリスクがあると見られるっぽい.またうつ病などもそこまで理解がある場所ばかりでない)
    • そんな感じでシリコンバレーのIT企業はめっちゃ働くっぽい
    • 何事も楽しいと思えるよう!と言われたがわかる
  • 社会人から大学院や大学で学び直しをすることが多い(実際僕の会った人もそうだった)
  • 企業の人が普通に学術的な講義をする(僕の受けていた授業はLinkedinの人でMasterを取っている人がしていた)(Summer Schoolだからかも)
  • 授業は少ない種類をみっちりやるという感じ
  • 課題とかリーディングが多い(これは僕が東大の課題と合わせてやった結果な気がする)
  • Stanfordは敷地の半分以上が緑地か居住地で思ったより研究する場所は狭い
    • 授業を受ける場所も僕はcomputer science関連の授業しか取っていないのでGatesという場所だけだった
  • 夏の気候は楽
    • あまり熱を貯める場所がないので昼は暑いけど夜は冷える
    • ジメジメしていないので過ごしやすい
  • 日常会話のリスニングの方がTOEFLTOEICのリスニングよりも難しい(それはそう)
  • 世界的には情報系で競プロをやっている人口は少ない(東大が多いだけ?)
  • 1DKで家賃が最低$30,000くらいするらしく新人だと学校の同期とシェアハウスする人が多いらしい
    • ホームレスとかキャンピングカーで過ごす人がいるのも嘘ではないっぽい
    • ただ,流石に昇給してもそうではないらしい
    • 飲食店で働いている人など電車や車で安い住宅地から通勤する人も多いらしい
  • シリコンバレーすごいと思われているかもしれないけどただの田舎
    • 見た感じだとまじでしょぼい
    • 松本市とかそういう地方の中核都市をイメージしてほしい
    • サンフランシスコも正直東京からしたらしょぼいし金か競争的な環境が欲しくないなら行く意味を感じない
    • 日本は飯が上手い・物価が低い・治安が良いと思う

日本とカリフォルニアの大学の似たようなところ(と僕が感じた・聞いたこと)

上の条件と同じ

  • 優秀な学生が金がもらえるベンチャーに行って教授が困っていることもあある
  • 大学の授業では復習が大事←Gitbookにまとめるのは有用だということに最後の方に気付きました
  • 内容自体は時間をかけているから丁寧だがやっていこと自体は変わらない
    • 違いは言語だけです
  • 教授は超優秀な方ばかり
  • 正規の学生に会った感じ,東大と大差があるかと言われたら多分そんなにないと思う(個人差の範囲内)
  • 一人だと辛いから信頼できる友達かパートナーがいたほうがよかった(個人的感想)
    • 日本だと寮生活でみんないい人なのでよかった
  • 日本でも海外でも大体俺は浮く
    • 年上だとうまくいくことが多い(相手の気遣いです)
  • 同じ人種/文化圏同士で固まる
    • ヨーロッパ組とアジア組に分かれる
    • 僕はピカチュウなので寮では中間って感じだった()
  • めっちゃテクノロジーがすごいかと言ったらそうでも
    • やはり先進国はインフラがすでに整っていることが多いのでなかなか新しい技術が浸透しにくい
    • QRコードはなく基本はクレカか現金
    • 現金を使っている人も割と多い

裏話

  • 他の寮ではHなことをする人のためにゴムが配られていました
    • 避妊大事
  • アメリカに携帯をなくしたので携帯電話がないです
  • 試験時間と場所を間違えました()

こっちに来て色々決意したこと

  • 彼女を見つけます
    • 一人じゃ生きられないとわかったので
    • 出会い系でもなんでも本気で何が何でも自分に合った人を見つけると決めました
    • 一応ですが別に誰でも良いわけじゃないです
  • 博士課程まで進学します
    • 専門性は武器になります
    • 進学は総合研究大学院大学の情報学専攻博士課程を考えています
    • お金がもらえる・5年一貫なので長期的に考えられる・立地が良い・先生が多く扱っている分野が広い・面談で自分の興味とすり合わせることができそう
    • 最悪情報系なら仕事に迷わないというのも決め手
    • 小学生の「プロ野球選手になる」という夢ほど難しいとは思わない
    • 仕事はインターンとかでも体験できるしそれよりも早いうちに大学院で研究をしたいという気持ちが強くなった
  • WEB開発とCSの基礎的な知識と論文を読むことを同時にします
    • WEB開発をしたいと思う機会が増えました
    • 枯れた知識をいかに身につけたかが最新の知識に追いつく鍵だと思いました
    • そろそろ研究する内容を考えたいと思いました

来週

学業

  • I実験を進める(実装したのを実演すれば良いらしい)

個人

ちなみに

来学期の時間割

来学期の時間割は多分こんな感じになります

(先学期にもっと自由に授業を取りたかったのですが留学で授業も時間もちゃんと取れなかったことを若干後悔しています笑)

計算論 OS 生物物理学(理物) 情報通信工学 言語・音声情報処理
映像メディア工学+信号解析(再履) 人工知能 パターン情報学(機械) 分散システム 電子デバイス基礎(再履)
実験+電磁気(再履) 実験 数理手法Ⅲ 実験 数量ファイナンス特論Ⅱ(経済)
実験+電磁気(再履) 実験 なし 実験 応用統計(経済)
  • 計算論: 量子計算まで扱うらしい.長谷川先生大好きなのでめっちゃ楽しみです
  • 映像メディア工学: 機械学習を使った画像処理.CVはどこに言っても大事と言われたので頑張りたい
  • 信号解析: 情報理論で信号解析が出てきて興味がわきました.単位を取ります
  • 電磁気: 再履.興味はないが単位をもらえないと留年します
  • OS: 興味があります.PCがどう動かされているのか謎
  • 人工知能: 他に授業がないので.汎用人工知能はまだまだ難しそうで扱えるドメインが限られているそうのであまり興味はないです
  • 生物物理: 生物情報をやりたく,物理学はよくわからないですが生物でどのように物理学を役に立てるのか気になります
  • パターン情報学: 映像メディア工学と同じです
  • 数理手法Ⅲ: 最適化くらいは工学部なので学びたい
  • 情報通信工学: ネットワークにも興味があるので
  • 分散システム: 分散システムに興味があります.クラウドとかどういうプロトコルになっているのかとか
  • 言語・音声情報処理: 正直単位がほしい以外の感情がない
  • 電子デバイス基礎: コンピュータアーキテクチャを勉強して内部がどうなっているのか気になりました
  • 数量ファイナンス特論: C++を使ってファイナンスに関するプログラムを作るようです.どちらも興味があります
  • 応用統計: ベイズ統計やマルコフ連鎖モンテカルロ法を学ぶらしいです.長谷川研に興味がありちょうどいいかなと思いました

あなたがものを渡すときに考慮しなければならない3つの渡し方

tags: 情報

どうも.コンピュータサイエンスを極める前にRuby on Railsを極めないとインターン先でやばい,ピカチュウです

今回はプログラミングにおける渡し方を整理したいと思います

題名は中身がない記事にありそうな雰囲気を意識しました.想像通り中身はないのでご安心ください

プログラミングにおける渡し方

プログラミングにおける変数の渡し方は以下の3つがあります

  • 値渡し
  • ポインタ(アドレス)渡し
  • 参照渡し

(渡し方なんてどうでもいいと思った人は,好きな人にプレゼントを着払いで渡せばいいと思います)

渡し方というのはコンピュータのメモリを理解すればすんなり理解できるので,サンプルコードと表をセットで説明したいと思います

その前に...メモリとは?

コンピュータには主記憶装置,通称メモリ(memory)というものがあります

このメモリにはそれぞれアドレスというのが割り振られています

そして,そのアドレス上で値を保持するのがプログラミングにおける変数の役割です

そのメモリをどう扱うかが渡し方によって異なるわけです

値渡し

サンプルコードはC言語です

int x = 1; # xのアドレスを確保し,そのアドレスの指す値に1を入れている
int y = x; # yのアドレスを確保し,そのアドレスの指す値にxのアドレスが指す値,1を入れている
変数名 アドレス
x m1 1
y m2 1

値渡しは上のように変数(y)のあるアドレスに指す値に,他の変数(x)の値を代入する際に渡すことです

ここではアドレスのやり取りはなく,値のやり取りのみが行われます

ポインタ(アドレス)渡し

C言語において,ポインタとして宣言されるとアドレス,値どちらの値も示すことができます

一方,単に整数として宣言された場合はそのアドレスの指す値を示します

ポインタの宣言,ポインタ以外アドレスを指す方法,アドレスの指す値を指す方法です

int* x; # 宣言
&x; # アドレス
*y; # 値

サンプルコードはC言語です

int x = 1; # xのアドレスを確保し,そのアドレスの値に1を入れている
int* y; # ポインタ型であるyのアドレスを確保している
y = &a; # yのアドレスにxのアドレスを入れている(xとyのアドレスを同じにした)
*y = 2 # yのアドレスの値に2を代入している
変数名 アドレス
x m1 1
y m2 m1

ここでは,ポインタとして宣言されたyの値に

参照渡し

サンプルコードはRubyです

x = 1
y = x
変数名 アドレス
x m1 1
y m1 1

参照渡しはアドレスをコピーして渡すやり方です

この渡し方でバグを生んだことしかないのです

次にその一例を載せておきます

Rubyでソート関数を書いたときの話

このなんたら渡しというのは別に変数に変数を代入するときだけでなく,関数に代入するときも関係します(仮引数に変数を代入していると考えるといいと思います)

Rubyの場合,配列,ハッシュを引数とする関数へは参照渡しが行われます

以下のようなバブルソートを用意します

引数にa(配列)とn(配列の要素数)を受け取ります

def bubble_sort(arr, n)
  flag = true
  while flag
    flag = false
    (1..n - 1).reverse_each do |i|
      next unless arr[i] < arr[i - 1]

      arr[i], arr[i - 1] = arr[i - 1], arr[i]
      flag = true
    end
  end
  arr
end

この関数でソートしてみると以下のような結果になります

arr = [*(1..10)].reverse!
# => [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
sorted_arr = bubble_sort(arr)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
puts sorted_arr
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

そうです,引数の配列もひっくり返ってしまっています

このように意図しない副作用が起きてしまうので注意が必要です

ちなみに

sorted_arr = bubble_sort(arr.dup)

のように引数に複製した配列を与えると配列を意図しない形でソートせずに返すことが可能です

まとめ

プレゼントを渡す時は渡し方にも拘ろう

RemacsをUbuntuにインストール

tags: 情報

Remacsとは

Remacsのリンク

EmacsをRustで書き換えようというOSSです

Emacsの拡張性は非常に高く僕もよく使うエディタですが,それをRustで改良しようというコンセプトが面白いですね

Remacsのインストール

Rustをインストールしていない場合

UNIX系の場合は下のコマンドでrustupをインストールします1

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

インストールはインストーラーの指示にしたかってください

Rustのインストールが済んでいる場合

Cコンパイラや周辺環境をインストールします

$ sudo apt install build-essential automake clang libclang-dev
$ sudo  apt install texinfo libjpeg-dev libtiff-dev \
   libgif-dev libxpm-dev libgtk-3-dev libgnutls28-dev \
   libncurses5-dev libxml2-dev libxt-dev

これが終わったら本体のインストールです

$ git clone https://github.com/remacs/remacs.git

remacsディレクトリに移りビルドします

$ ./autogen.sh
$ ./configure --enable-rust-debug
$ make

ところが

$ ./autogen.sh

を実行しようとすると以下のエラーが発生する

Checking Rust toolchain install ...
Remacs requires the rustup command to be installed in order to build. Please see https://www.rustup.rs/; Aborting.

rustuprustもインストールしたはずなのになんで...?

どうやらrustupをダウロードするときに

$ source $HOME/.cargo/env

というコマンドを打たないといけなかったらしいです

Remacsの実行

RUST_BACKTRACE=1 src/remacs

上のように実行します

RUST_BACKTRACE=1はとりあえず付けたほうがよいらしいです

-qというオプションをsrc/remacsのあとに付けることも可能です.emacs.dを無視してくれるオプションらしいです

使った感想

-qオプションを付けないで起動すると下のようなエラーメッセージが

Warning (package): Unnecessary call to ‘package-initialize’ in init file

Remacsではパッケージをinitializeしなくてもいいのかな?

とりあえずコーディングや拡張に関してEmacsと変わらないように感じました

使ってみて困った点があったらIssueに上げてみようと思います

"Customized Machine Learning-Based Hardware-Assisted Malware Detection in Embedded Devices"を読んだ

tags: 論文

Title: Customized Machine Learning-Based Hardware-Assisted Malware Detection in Embedded Devices

推測できること

組み込みデバイスにおいて,機械学習を利用しハードウェアで補助されたそれぞれのデバイスごとのマルウェア検知に関する論文?

Abstract

アブストアブスト

  • 組み込みデバイスはソフトウェアでマルウェアを検知しようとすると計算資源が少ないので困難
  • そこでハードウェアを使った方法がある
  • その検知の正確性を高める他に機械学習を応用してHPC(Hardware Performance Counter)の特徴からマルウェアを特定する

推測できること

  • 機械学習の手法とこれから述べられるのかな

結論

  • HPCの4つの特徴を用いるだけでよく,省エネである
  • 伝統的なHMDに比べて精度が最大29%も上がっている
  • 複雑な分類アルゴリズムの方が精度は高いが,簡単な分類アルゴリズムの方が占有ユニットあたりの精度は高い

結局どんな論文だったのか

何についての論文か

先行研究と比べた強み

  • ハードウェアを用いることで
    • ハードウェアを操作するほうが難しく堅牢さに繋がる
    • ハードウェアのコストに比べてマルウェアを検知する遅延が小さい
  • 今までは

技術や手法のキモはどこか

  • ハードウェア関連
    • HPCのたった4つの特徴のみを使う
  • 3つの手法
    • Experimental Setup and Data Collection
      • 普通にデータを集める
    • Feature Reduction
      • 重要なHPCを探して4つに絞った
    • Malware Detection Approach
      • まずは走っているアプリケーションの種類を特定する
      • その後にマルウェアを検知するためのcustomizedされた分類器が登場する
    • Application Class Prediction
      • SVMを使う(教師有り学習)と精度が低いので他のものを使った

どうやって有効と示したのか

  • Malware Detection Accuracy
  • Hardware Overhead Analysis
    • 遅延と専有するハードウェアのエリア占有度で測定
  • Efficiency of ML Classifiers in Proposed HMD

議論はあるのか

特に無し

わからなかった点

次に読むべき論文は

特に無し

読むのにかけた時間

2時間

論文を読む際のフォーマット

論文どう読みますか?

皆さんは論文を読む時どのように読みますか?

僕は

abstract->conslusion->その間

という風に読みます

このように読むことで最初にどこに力点をおいて読めばいいかということがわかります

加えて,conclusionまでがつまらない場合はその論文を読まなければ良いということがわかり無駄に論文を読まずに済みます

以下は自分が論文を読む時にメモに使うフォーマットです

色々の人の読み方を参考にしました

なぜこの記事を書いたのか

(書くことがないからです)

# 論文まとめフォーマット

###### tags: `論文`

## Title

### 推測できること

## Abstract

### アブストのアブスト

### 推測できること

## 結論

## 結局どんな論文だったのか

### 何についての論文か

### 先行研究と比べた強み

### 技術や手法のキモはどこか

### どうやって有効と示したのか

### 議論はあるのか

### わからなかった点

### 次に読むべき論文は

## 読むのにかけた時間