Neunomizuの日記

俺だけが俺だけじゃない

宿題はやるな

tags: 情報

僕/私はどう評価されているの?

僕/私はどう評価されているのだろうか?

人間社会に生きていれば当たり前に感じることですよね?

容姿,能力,家柄,学歴等々,人によって人をどこから,どのように評価するか千差万別です

それはプログラミング言語とて同様!

プログラミング言語も,プログラミング言語によって,式を評価をする順番は違います

自分がどう評価されているか知る前に,少し落ち着いてプログラミング言語において式がどのように評価されるかを見てみましょう

評価の区分は夏休みの過ごし方に似ている

評価の仕方は大きく分けて2つです

  1. Applicative(eager)-order
  2. Normal(lazy)-order

前者(先行評価)は式を先に評価し,後者(遅延評価)は式が必要になるまで評価しません

要するに,夏休みが始まる前に宿題を終える人と,夏休み最終日まで宿題を溜める人です

溜める方がNormalなことから分かるように,人間は宿題を溜めるものだということです(いやlazyなのか?)

例えば,以下のようなSchemeのコードがあるとします

(define (p) (p)) ;; 無限に再帰する関数
(define (test x y)
    (if (= x 0) ;; xが0なら0を,それ以外はyを返す
    0
    y))
(test 0 (p))

Applicative(eager)-order

もしこれが宿題を終わらせるタイプなら,式は以下のように評価され永遠に終わりません

(test 0 (p)) ;; ここがスタート
(test 0 (p)) ;; (p)を評価して(p)になる
(test 0 (p)) ;; (p)を評価して(p)
...

Normal(lazy)-order

溜めるタイプの場合は次のように(if (= x 0))が評価されると,関数が0を返し終わります

(test 0 (p)) ;; ここがスタート
0 ;; 0を出力して終了

ちなみに

どっちが早いかどうかは時と場合によります

Schemeapplicative-orderなので,式を先に評価してます(gaucheracketなど自分の処理系で試してみるとわかります)

そのため,この関数は無限に終わりません

ということで,宿題を終わらせるととんでもないことになるということがわかりました(謎論理)

宿題は(直前まで)やるな」ということが今回の教訓です

追記

前回書いたときは寝ぼけていたので書こうと思っていることと反対のことを書いていました

寝るべし」という教訓も得られました(適当)

知識欲旺盛な人へ

「Valgrind」...あなたを詐欺罪と器物損壊罪で訴えます!

tags: 情報

Valgrindを訴えます!

あなたを詐欺罪と器物損壊罪で訴えます!理由はもちろんお分かりですね?あなたが皆をこんなウラ技で騙し、セーブデータを破壊したからです!覚悟の準備をしておいて下さい。ちかいうちに訴えます。裁判も起こします。裁判所にも問答無用できてもらいます。慰謝料の準備もしておいて下さい!貴方は犯罪者です!刑務所にぶち込まれる楽しみにしておいて下さい!いいですね!1

はい.ということでValgrindを訴えます!(訴えません)

Valgrindが使えると騙しましたね。ちかいうちに訴えます。いいですね!

あなたは私を騙しました!

僕はMacを使っているので以下の環境はMacです!いいですね!

brewでインストールできると思っていますか?できると思いますよね?!いいですね!2

ということでインストールを試みます!

  • $ brew install valgrindterminalで打ちます
    • エラーが出るので覚悟の準備をしておいてください!問答無用でエラーを取り除きます。
  • $ brew edit valgrindterminalで打ちます.そうすると,viが起動するので,valgrindソースコードを編集してください!いいですね!
    • ソースコードheadという部分にあるhttps://sourceware.org/git/valgrind.gitという部分をgit://sourceware.org/valgrind.gitに置換してください!いいですね!
    • vimの基本操作がわからない人はこのサイトを見てください!いいですね!それでもわからない人はググってください!いいですね!
    • なんかボタン押してたらよくわからなくなってしまった人はESCを押して,uを連打してくださいいいですね!uで今までの行動をundoできます!いいですね!
  • その後は$ brew update$ brew install --HEAD valgrindをしてください!いいですね!

全部やりましたがうまく行かなかったです!

(調べるとこの方法はMojaveだとうまくいかないみたいです!ということでMojaveでもできるらしいやり方を調べます!いいですね!)

Mojaveでのやり方も調べます!いいですね!

StackOverflowの通りにやります!いいですね!

下のコードをterminalで打ってください!いいですね!

$ git clone https://github.com/Echelon9/valgrind.git
$ cd valgrind
$ git checkout feature/v3.14/macos-mojave-support-v2
$ ./autogen.sh
$ ./configure --prefix=/where/you/want/it/installed --enable-only64bit
$ make

次はvalgrind内にあるcoregrind/Makefileを探してください! vimで開いてください!いいですね!

そして,次の部分を

am__append_19 = \
    /usr/include/mach/mach_vm.defs \
        /usr/include/mach/task.defs \
        /usr/include/mach/thread_act.defs \
        /usr/include/mach/vm_map.defs

次のように置換してください!いいですね!

ただし,MacOSX10.14の部分は自分のMacのVersionに合わせてください!いいですね!

画面左上のりんごマークをクリックして,About This Macをクリックすると下のような画面が出てくるはずです! alt Mojave

    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/mach/mach_vm.defs \
        /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/mach/task.defs \
        /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/mach/thread_act.defs \
        /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/mach/vm_map.defs

それが終わったら

$ make

を再びしましょう

それでもだめなら#define __private_extern__ externというコードを

  • coregrind/m_syscall.c
  • coregrind/m_syswrap/syswrap-darwin.c
  • coregrind/vg_preloaded.c

に加えてください!そして$ makeをして,そのあとに$ make installをしてください!

それでもダメです!下記のようなエラー文が出るだけです...

./auxprogs/make_or_upd_vgversion_h .
/Applications/Xcode.app/Contents/Developer/usr/bin/make  install-recursive
Making install in include
make[3]: Nothing to be done for `install-exec-am'.
 .././install-sh -c -d '/where/you/want/it/installed/include/valgrind'
mkdir: /where: Permission denied
mkdir: /where: No such file or directory
mkdir: /where/you: No such file or directory
mkdir: /where/you/want: No such file or directory
mkdir: /where/you/want/it: No such file or directory
mkdir: /where/you/want/it/installed: No such file or directory
mkdir: /where/you/want/it/installed/include: No such file or directory
make[3]: *** [install-nobase_pkgincludeHEADERS] Error 1
make[2]: *** [install-am] Error 2
make[1]: *** [install-recursive] Error 1
make: *** [install] Error 2

これでMacではValgrindが使えないとわかりましたね!いいですね!3

おそらく使えます

Dockerや古いOSを使えばおそらく使えます^^b

前者はメモリが足りない(8GBだとそろそろ足りなくなってきた...),後者はバックアップを取るのが面倒,ということで僕が諦めただけです

質問サイト・ブログ

質問サイト・ブログにエラーの解消法を投稿してくださっている方にはいつも感謝をしています

結果として間違っていたからと言っても,僕は全く責めるつもりはないです(もし意図的ならguiltyですが)(そもそも環境は千差万別なので)

当然誰も訴えないですよ!いいですね!

間違え

この記事がもし間違っていて,「本当は普通に使えるよ!」ということがあったら是非とも教えていただきたいです😢

戒め

仮想環境を気軽に使える程度のスペックのPCを買いましょう

夏の短期留学で取る科目に関して

tags: 情報

今年の夏の予定

今年の夏はStanfordにComputer Scienceの勉強をしに行く予定です.具体的にはSummer Sessionに行きます.短期留学です.

minimumはVISAの関係上12 units,maximumが20 units(1 unitで50分の授業です)で授業を取ることが義務付けられています.

僕は"CS110","CS161","CS193C","CS229"という授業を取る予定です.(後述しますがCS193Cはさようならする可能性が高いです)

帰国したときに学部に報告する必要もあるようなので先にまとめておきます.


目的

なぜこのSummer Sessionに参加したのかについて述べます.

  1. レベルが高い国外の大学の授業を受けたい
  2. Computer Scienceに興味がある
  3. 色んな人と関わりたい

1つ目の目的

要は日本以外の勉強してみて自分のレベル感が知りたいっていうのがあるからですね.Summer Sessionなのでどれだけ正規の学生がいるのかわからないですが,米国以外から集まる生徒も優秀な方が多いと思うのでいい機会だと思います.

実際行かないと達成できなさそうですね.

2つ目の目的

「CSの勉強ってどこでもできるから行かなくてもいいのでは?」と若干思っているので,実際に行ってみて判断したいからですね.

どこでもできるのなら人生の自由度が高まるし,どこでもできないのならどうしてできないのかがわかるし行く意味はあると感じました.

3つ目の目的

自分が今いる寮に入ってからも思うことで,色んな人と関わるといい刺激を受けるからですね.

実は自分が東大に入ろうとしたのも,中国の優秀な青年を見て,日本人として僕は大丈夫なのかと思ったことが直接の理由です.

まだ見ぬすごいやつに会いたいというわけです.

まとめると

まとめると体験していないのに知ったような口を利きたくないからということでしょう.(周りにいる反面教師達を頭に浮かべながら)


各講義に関する情報

事前に手に入る,各講義の情報をまとめたいと思います.

100番台は1年生,200番台は2年生が学ぶものらしいです.1 楽勝ですね^^;(というのは嘘で期末試験と留学先での授業が被っていて中々やばそう)

あと,一回でも欠席するとその瞬間に単位が天国に行ってしまうそうなのでEEICのように授業に休むということはできなさそうです...

取る講義(17 unitsの予定)

  • CS110: PRINCIPLES OF COMP SYS(4 units)
  • CS161: DESIGN & ANALYSIS ALGORITHMS(5 units)
  • CS193C: CLIENTSIDE INTERNET TECHNOLOGY(3 units)
  • CS229: MACHINE LEARNING(5 units)

CS110: Principles of Computer Systems

  • 4 units
  • 講師は"Roslyn Cyrus"という方で,Linkedinを見るとStanfordのMaster方らしいです.学部の頃はコーネル大学で英語学とアフリカ学を専攻していたようです.ホームページが結構面白いです.
  • Principles and practice of engineering of computer software and hardware systems. Topics include: techniques for controlling complexity; strong modularity using client-server design, virtual memory, and threads; networks; atomicity and coordination of parallel activities; security, and encryption; and performance optimizations.

  • prerequisiteとしてコンピュータアーキテクチャの授業が指定されており,春学期の授業を見ると,UNIX・ネットワーク周りの部分などをみっちりやるようなのでそこらへんに興味があり取りました.一番楽しみな授業です.

CS161: Design and Analysis of Algorithms

  • 5 unit
  • 講師は"Reyna Hulett"という方でLinkedinを見るとGoogleとかFacebookとかDropboxで働いたことのあるかたでPh.D.の方らしいです.かなりアルゴリズムに強そう(小並感).
  • Worst and average case analysis. Recurrences and asymptotics. Efficient algorithms for sorting, searching, and selection. Data structures: binary search trees, heaps, hash tables. Algorithm design techniques: divide-and-conquer, dynamic programming, greedy algorithms, amortized analysis, randomization. Algorithms for fundamental graph problems: minimum-cost spanning tree, connected components, topological sort, and shortest paths. Possible additional topics: network flow, string searching. Prerequisite: 103 or 103B; 109 or STATS 116.

  • EEICにもアルゴリズムの授業はあるのですが,ひたすら擬似コードを眺めているみたいな授業なのでうーん.5 unitsがあり,きっちり理論をやってくれそうなので取りました.
  • やったことある内容も多い気がします(一応競プロをやっているので)が,理論はしっかり抑えてないので取ります(自分で分厚いアルゴリズムの本を読もうともならないし...).

CS193C: Client-side Internet Technologies

  • 3 units
  • 講師は"Patrick Young"という方でHPを見ると,IBMで働いていて,小さな開発チームでグループでの開発効率を高めるような製品を作っていたようです.Ph.D.も取っていますね.
  • Client-side technologies used to create web sites such as Google maps or Gmail. Includes HTML5, CSS, JavaScript, the Document Object Model (DOM), and Ajax. Prerequisite: programming experience at the level of CS106A.

  • これは単位とコマが余っていたので取りました().しかし,夏休みにWeb系の企業にインターンで行くこともありちゃんと勉強したいと思っていたので好意的に考えています(大学は職業訓練校じゃないという方々にお叱りを受けそうなのでおおっぴらには言えませんが).
  • 他の授業の課題がやばい場合は,優先度が低いのでさようならをします^^;

CS229: Machine Learning

  • 5 units
  • 講師は"Anand Avati"という方でLinkedinを見ると,かの有名なAndrew Ng氏の下で機械学習の研究をしているPh.D.の学生らしいです.インド出身でソフトウェアエンジニアの経験もあるようです.
  • Topics: statistical pattern recognition, linear and non-linear regression, non-parametric methods, exponential family, GLMs, support vector machines, kernel methods, model/feature selection, learning theory, VC dimension, clustering, density estimation, EM, dimensionality reduction, ICA, PCA, reinforcement learning and adaptive control, Markov decision processes, approximate dynamic programming, and policy search. Prerequisites: linear algebra, and basic probability and statistics.

  • 今学期,理学部情報科学科の統計的機械学習の授業を取っているのですが,似たような感じになりそうです.数式と格闘してアルゴリズムを実装するという地獄のような授業になりそうですが...頑張ります(泣)

おわり

授業とあちらでの生活は非常に楽しみです.

学部に入ってから毎日充実しています(?)が,実験をするたびに間違った学部に来てしまった感が否めなくなるので,(あえて)距離を取ることで自分の学科愛を確かめたいと思います.

〜次回に続く(予定)〜

EmacsでGit管理をもっと楽にしたくない??(WWOWWO)

Magitを使います

どうもこんにちは.Emacsでコードを書くことが増えたのですが,今まではEmacsでGit管理はしたことはなかったです(Emacsで書くときはGUIでしていました)

ということで,今回はEmacsでのGit管理ができるMagitというpackageの導入・使い方の話をまとめたいと思います

インストール

melpaを使いましょう

Emacsでは24以降には入っているので,下のコードをそのままEmacs上で打てば大丈夫です

`M-x package-list-packages`

を入力して,magitC-sで検索します

見つかったら,ixを押してインストール完了です

Magit使い方

最初にgit initをしたいと思ったそこのアナタ!

M-x magit-initをすれば大丈夫です:smile:

他の動作は基本的にはM-x magit-statusを押して,その後,commitpushなどをします

しかし,そのままではいちいちキーを打つ手間が多いので,新たにキーバインドを設定します

以下のコードをinit.elに加えることで,C-x gでMagitを呼び出せるようになります

(global-set-key (kbd "C-x g") 'magit-status)

Magitを呼び出した後は,Ppush関連の動作,bbranch関連の動作などができます

しかし,これらの操作をすべて一気に覚えるのは無理ですよね?

次に使うキーがわからないという方に非常に優しい機能があります!

?です

M-x magit-statusの後に?を押すとどのコマンドがどういう意味を持つのかという情報が一覧となって出てきます

EmacsでGit管理

EmacsでGit管理めっちゃしたくなりましたね.はい

参照URL

EmacsでOCamlのコーディングをしたいっていいなよ

OCamlの環境構築 in Emacs

すまん

ブログを変えると言ったばかりなのに...スマンありゃ ウソだった

前回の記事で「ブログを変える」という記事を書きましたが,結局SEOを考慮するとはてブロの方が強いので変更することを変更しました

これからはこちらの記事が学術っぽい話,あっちが個人的な話という風に上手く棲み分けたいです...

いーまっくそ

ということで今回の本題

皆さんの大学はEmacsが講義で使われていますか?

この授業ではみなさんにEmacsC言語のコードを書いてもらいます

と初心者が言われた日には,Emacsだけでなくプログラミングが嫌いになること間違いなしです

しかし,OCamlのようなTerminalとEditor上で作業する言語ではやはりVSCodeのようなモダンなEditorよりもEmacsの方が楽なのも事実

ということで今回は嫌われがちなEmacsOCamlの環境構築をしてみました(Vimは知らない)

なぜそもそもOCamlの環境構築を?

全然プログラミングができるようにならないので,プログラミングの基礎を始めようと思いました

この本で使われるOCamlの環境構築をしたので,そのまとめということで今回の記事を作りました

いきなりEmacsではなくその前に...

Editorの設定の前にpackage managerを入れましょう.これで後々packageが必要になっても安心です

ここではOPAM("OCaml Package Manager"の略)を入れます

OCaml自体もOPAM経由で入れます

$ brew install opam
$ opam init

この後,色々質問されますがyと答えればおkです

ここからEmacs

package-list-packages

MELPAパッケージからOCamlに関連するパッケージをインストールします

ここではtuaregexec-path-from-shellを入れます

これらを入れるとsyntax highlightと式の即時実行ができるようになります

packageの導入はもちろんEmacsの方で行います

Emacs

M-x package-list-packages

と入力してから,C-sを使って検索をします

tuargeexec-path-from-shellが見つかったら,それぞれiを打ってinstall完了です

その後,Emacs.emacs.d/init.elに以下の設定を加えます(もちろん.emacsなどでも大丈夫です

;; tuaregに関する設定
(add-to-list 'auto-mode-alist '("\\.ml[iylp]?" . tuareg-mode))
(autoload 'tuareg-mode "tuareg" "Major mode for editing OCaml code" t)
(autoload 'tuareg-run-ocaml "tuareg" "Run an inferior OCaml process." t)
(autoload 'ocamldebug "ocamldebug" "Run the OCaml debugger" t)

これで常にtuareg modeで.mlファイルを操作することが出来ます

このモードでは,.mlファイルの式上で

C-c C-e

を実行すると,式の評価をしてくれます

また,

C-c C-b

を実行すると,ファイル全体を実行してくれます

サクサクOCamlの実行をして早くプログラミングの基礎を身に付けたいと思います〜〜

参照URL