10 Jan 2016, 12:25

競技プログラミング対策用 Futurismo 別館を立ち上げ

Futurismo 競技プログラミング対策用 別館を立ち上げました。

プログラミングコンテストの参加記録や過去に解いた問題を 投稿していくためのサイトです。

このサイトに投稿記事を混ぜると、RSS フィードが汚れる?ので、 別サイトを立ち上げました.

以上

06 Jan 2016, 05:20

プログラミング Clojure を読んだ

プログラミング Clojure 第 2 版をようやく読みきりました。

読むのにかかった時間は、36 時間 14 分. 流し読みしてこのくらい.

本の構成

日本語で読める唯一のまともな Clojure 入門書.

全部で 10 章構成.1,2,3 章で、Clojure の基本的な文法を紹介する. 4 章以降、中級、上級向けの内容になってくる。 関数型プログラミング、状態、プロトコル、マクロ、マルチメソッドなどなど。 そして、最後の 2 章で、より実践的なアプリケーションを作成する.

感想

序文がやたらとカッコよかった.

  • Clojure はエレガントだ。
  • Clojure は「Lisp ・リローデッド」だ。
  • Clojure は関数型言語だ。
  • Clojure は並行プログラミングを簡単にする。
  • Clojure は Java を歓迎する。
  • Clojure は速い。

この序文とポールグレアムの本で, 誰もが Lisp ハッカーに憧れて Clojure の門を叩くのではないか?

しかし、内容は難しかった。

理解ができない部分が多々あり。 そういうところは流し読みして、老後の楽しみにして飛ばした。 1、2、3章は理解できたが、それ以降は正直理解したといえない.

これは、初心者向けの本ではない. Lisp や Java を熟知している人が Clojure を使ってみようという場合を想定してかかれている気がした. また、話の展開が早く、話題が次から次へとポンポン変わって、ついていくのが苦しい。

ただし、1,2,3 章で基本的な章を理解したので、 簡単なプログラムはかけるようになった.これからこの本読むひとは、 とりあえず最初の章を理解することを目標においてはどうだろうか?

日本語で出ている資料としてはこのプログラミング Clojure を 入門の入り口として選ぶひとが大多数だと思うが、 これを読みきって理解するひとは少ないのでは? 入門の敷居が高いところにも、Clojure が流行らない理由があるのではと思う.

ちなみに、入門には以下の MOOC がおすすめ.

これからどうするか

Clojure 力をつけるには、どうしよう。 ほかに日本語で読める本には目を通してしまった。選択肢としては、

どれもあまりパッとしないなぁ。答えはここでは出ませんでした。 このままだと、ここで Clojure の勉強がストップして先に進めない.

おすすめあれば、教えてつかあさい.

02 Jan 2016, 00:21

Emacs で Clojure の開発環境を構築

Clojure の勉強を始めました。

まずはなにより Emacs の設定からかと思うので、 Clojure の Emacs 設定を整えました. 現時点での設定をプログにスナップショット.

優れた IDE が備える機能

  • シンタックスハイライト/ インデント clojure-mode
  • 検索・置換 たくさんあるよ.
  • タグジャンプ ggtags
  • コード補間 ac-clojure
  • エラーチェック flycheck
  • リファクタリング clj-refactor
  • インタープリタ・デバッカ cider
  • プロジェクト管理 projectile
  • ドキュメント参照 eldoc

Clojure に特科した Elisp

clojure-mode

<div class="outline-text-3" id="text-orgheadline2">
  <p>
    Clojure のためのメジャーモード. シンタックスハイライトとかインデントとかを正してくれるモード. これは必須.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clojure-mode">https://github.com/clojure-emacs/clojure-mode</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-mode)<br /> [/sourcecode]
  </p>
</div>

cider

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    Clojure のためのインタラクティブな開発環境.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/cider">https://github.com/clojure-emacs/cider</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;cider)<br /> ;; clojure-mode で cider を有効に<br /> (add-hook &#8216;clojure-mode-hook &#8216;cider-mode)<br /> ;; eldoc を有効にする<br /> (add-hook &#8216;cider-mode-hook &#8216;cider-turn-on-eldoc-mode))<br /> [/sourcecode]
  </p>

  <ul class="org-ul">
    <li>
      cider-jack-in で repl 起動
    </li>
    <li>
      cider-connect でリモート repl に接続
    </li>
  </ul>

  <p>
    repl と連携して開発を行うことができる. REPL 駆動開発!!
  </p>
</div>

4clojure

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    clojure の問題集.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/losingkeys/4clojure.el">https://github.com/losingkeys/4clojure.el</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;4clojure)<br /> [/sourcecode]
  </p>

  <p>
    Emacs から問題をといたり、答え合わせができる. そのまま答えを投稿できればいいのだけれども、それは未対応.
  </p>
</div>

ac-cider

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    auto-complete for cider. 強力な補完機能が手に入る.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/ac-cider">https://github.com/clojure-emacs/ac-cider</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ac-cider)<br /> (add-hook &#8216;cider-mode-hook &#8216;ac-flyspell-workaround)<br /> (add-hook &#8216;cider-mode-hook &#8216;ac-cider-setup)<br /> (add-hook &#8216;cider-repl-mode-hook &#8216;ac-cider-setup)<br /> (eval-after-load &#8220;auto-complete&#8221;<br /> &#8216;(progn<br /> (add-to-list &#8216;ac-modes &#8216;cider-mode)<br /> (add-to-list &#8216;ac-modes &#8216;cider-repl-mode))))<br /> [/sourcecode]
  </p>
</div>

clojure-cheatsheet

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    CheatSheet を参照できる.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clojure-cheatsheet">https://github.com/clojure-emacs/clojure-cheatsheet</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-cheatsheet)<br /> (define-key clojure-mode-map (kbd &#8220;C-c C-h&#8221;) #&#8217;clojure-cheatsheet)<br /> [/sourcecode]
  </p>
</div>

clj-refactor

<div class="outline-text-3" id="text-orgheadline7">
  <p>
    Clojure 用リファクタリング支援ツール.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clj-refactor.el">https://github.com/clojure-emacs/clj-refactor.el</a>
    </li>
  </ul>

  <p>
    できる機能か多すぎ!覚えらんない..
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clj-refactor.el/wiki">https://github.com/clojure-emacs/clj-refactor.el/wiki</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clj-refactor)
  </p>

  <p>
    (defun my-clojure-mode-hook ()<br /> (clj-refactor-mode 1)<br /> (yas-minor-mode 1) ; for adding require/use/import statements<br /> ;; This choice of keybinding leaves cider-macroexpand-1 unbound<br /> (cljr-add-keybindings-with-prefix &#8220;C-c C-m&#8221;))
  </p>

  <p>
    (add-hook &#8216;clojure-mode-hook #&#8217;my-clojure-mode-hook)<br /> [/sourcecode]
  </p>
</div>

clojure-snippets

<div class="outline-text-3" id="text-orgheadline8">
  <p>
    Yasnipeet for Clojure
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/mpenet/clojure-snippets">https://github.com/mpenet/clojure-snippets</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-snippets)<br /> (setq clojure-snippets-dir &#8220;~/.emacs.d/el-get/repo/clojure-snippets/&#8221;)<br /> [/sourcecode]
  </p>
</div>

主に Lisp 系に役立つ Elisp

ggtags

<div class="outline-text-3" id="text-orgheadline10">
  <ul class="org-ul">
    <li>
      <a href="https://github.com/leoliu/ggtags">https://github.com/leoliu/ggtags</a>
    </li>
  </ul>

  <p>
    変数や関数の定義にタグジャンプする. ggtags-create-tags 関数を呼ぶと, ctags コマンドがコールされてタグがつくられる.
  </p>

  <p>
    と思ったら、つくられない。.globalrc に設定を追加する必要があるようだ. 以下のサイトを参考にした。ありがとうございます.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ayato.hateblo.jp/entry/20150603/1433329200">Clojure の開発で gtags を使う &#8211; (define -ayalog &#8216;())</a>
    </li>
  </ul>

  <p>
    タグができたら、あとはコマンドを定義するだけ.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ggtags)<br /> (add-hook &#8216;clojure-mode-hook (lambda () (ggtags-mode 1)))
  </p>

  <p>
    ;; use helm<br /> (setq ggtags-completing-read-function nil)
  </p>

  <p>
    ;; use eldoc<br /> (setq-local eldoc-documentation-function #&#8217;ggtags-eldoc-function)
  </p>

  <p>
    ;; imenu<br /> (setq-local imenu-create-index-function #&#8217;ggtags-build-imenu-index)
  </p>

  <p>
    (define-key ggtags-mode-map (kbd &#8220;C-c g s&#8221;) &#8216;ggtags-find-other-symbol)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g h&#8221;) &#8216;ggtags-view-tag-history)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g r&#8221;) &#8216;ggtags-find-reference)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g f&#8221;) &#8216;ggtags-find-file)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g c&#8221;) &#8216;ggtags-create-tags)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g u&#8221;) &#8216;ggtags-update-tags)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g m&#8221;) &#8216;ggtags-find-tag-dwim)
  </p>

  <p>
    (define-key ggtags-mode-map (kbd &#8220;M-,&#8221;) &#8216;pop-tag-mark))<br /> [/sourcecode]
  </p>
</div>

smartparens

<div class="outline-text-3" id="text-orgheadline11">
  <ul class="org-ul">
    <li>
      <a href="https://github.com/Fuco1/smartparens">https://github.com/Fuco1/smartparens</a>
    </li>
  </ul>

  <p>
    カッコの移動を簡単にする elisp. 似たような機能に Paredit という elisp もある. どちらを使うかは好き嫌い.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;smartparens-config)<br /> (smartparens-global-mode t)<br /> [/sourcecode]
  </p>

  <p>
    以下、自分のキーバインドを貼り付けるけれども、キーバインドは好きに設定してよい.
  </p>

  <p>
    正直、あまりつかいこなせてない&#x2026;
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (define-key sp-keymap (kbd &#8220;C-M-f&#8221;) &#8216;sp-forward-sexp) ;; forward<br /> (define-key sp-keymap (kbd &#8220;C-M-b&#8221;) &#8216;sp-backward-sexp) ;; backward
  </p>

  <p>
    (define-key sp-keymap (kbd &#8220;C-M-n&#8221;) &#8216;sp-next-sexp) ;; next<br /> (define-key sp-keymap (kbd &#8220;C-M-p&#8221;) &#8216;sp-previous-sexp) ;; previous
  </p>

  <p>
    ;; 一段中の/ 外のカッコに移動.<br /> (define-key sp-keymap (kbd &#8220;C-M-d&#8221;) &#8216;sp-down-sexp) ;; down<br /> (define-key sp-keymap (kbd &#8220;C-M-u&#8221;) &#8216;sp-up-sexp) ;; up
  </p>

  <p>
    ;; かっこの先頭と末尾に移動.<br /> (define-key sp-keymap (kbd &#8220;C-M-a&#8221;) &#8216;sp-beginning-of-sexp)<br /> (define-key sp-keymap (kbd &#8220;C-M-e&#8221;) &#8216;sp-end-of-sexp)
  </p>

  <p>
    ;; カッコのなかを削除・コピー (かたまり単位)<br /> ;; sp-kill/copy-hiblid-sexp というものもある<br /> (define-key sp-keymap (kbd &#8220;C-M-k&#8221;) &#8216;sp-kill-sexp)<br /> (define-key sp-keymap (kbd &#8220;C-M-w&#8221;) &#8216;sp-copy-sexp)
  </p>

  <p>
    ;; かっこを外す<br /> (define-key sp-keymap (kbd &#8220;C-M-s&#8221;) &#8216;sp-unwrap-sexp)<br /> [/sourcecode]
  </p>
</div>

show-paren-mode

<div class="outline-text-3" id="text-orgheadline12">
  <p>
    対応する括弧を光らせる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> ;; turn on highlight matching brackets when cursor is on one<br /> (show-paren-mode 1)<br /> [/sourcecode]
  </p>
</div>

rainbow-delimiters

<div class="outline-text-3" id="text-orgheadline13">
  <p>
    かっこの深さに応じて色付けしてくれる.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/Fanael/rainbow-delimiters">https://github.com/Fanael/rainbow-delimiters</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;rainbow-delimiters)<br /> [/sourcecode]
  </p>
</div>

31 Dec 2015, 22:46

REPL 駆動開発について(REPL Driven Development) 調べたメモ

REPL と REPL 駆動開発について調べたメモです.

REPL とは

Read-Eval-Print-Loop の略. 読んで、評価して、表示するを繰り返す.

対話的に開発するためのツール.

素早いフィードバックを得ることで、頭に浮かんだ考えを即実行できる!!

インタラクティブシェルとの違いがよくわからなかった. Lisp 系の言語で REPL という用語が利用され, スクリプト言語で インタラクティブシェルという用語が利用される??

各言語のサポート状況

スクリプト言語は大体できる.

  • Ruby … irb, pry
  • Python … iPhthon
  • Perl … perl -de 1

Lisp 系言語はもちろんできる.

  • Clojure .. lein repl
  • Scheme
  • Common Lisp

コンパイラ系言語でもサポートしようという取り組みがある.

REPL Driven Development

Repl によって開発を駆動する方法. 以下 RDD. 具体的には、 エディタと Repl を両側にならべて、以下のプロセスを繰り返す.

  1. 実装(S 式)を書いてみる
  2. 実装を 即座に Repl に読み込ませて評価
  3. 結果を確認しその実装が正しいことを確認する

この 記事によると、以下の 3 点から開放されることで、 開発に集中することができるとのこと.

  1. restarting the application … アプリケーションの再起動
  2. running something other than the application to verify behavior … 振る舞いの確認のためにアプリケーション以外を起動すること
  3. moving out of the source to execute arbitrary code… 任意のコードを実行するためにソースから離れること.

たとえば C#の場合は、アプリを止めて リビルドして、アプリを再起動するというサイクルが入るが、 このサイクルはとても時間がかかり受け入れがたい. REPL は瞬時にフィードバックが得られる.

RDD は TDD と組み合わせることもできる. テストを書くよりもより素早く フィードバッグを得られることが RDD の TDD に対するメリットだ. RDD の結果から, REPL の出力ずく pritty print をコピペすることで TDD のテストケースを書くことで、 リグレッションテストのメリットを享受できる.

資料

日本語

RDD 解説したスライド.

たいへん丁寧な解説。参考になる.

つまり、プログラムを作りながら、横で REPL を起動しておき、 その関数をロード(またはリロード)して実際に使ってみて、 さらに修正して、使ってみて、ということができる、ということです。

REPL 駆動開発を体験することができる.

Clojure は他の言語とは違ってファイルをベースに開発しません。 基本的に REPL の上に全てあるので、それを最大限に活かして開発出来るのが Clojure の利点であり他の言語に対するひとつの優位性でしょう

英語

REPL で評価した結果をコピペで TDD の期待値としてつかえば、 期待値を用意するのが楽。REPL の結果からテストが自動できればいいねという話.

所感

なにも REPL 駆動開発なんて、名前をつけるまでもなく、 つくったコードを動かして結果を確認するということは、当たり前のことだ. C 言語をはじめて勉強したときも、書いて、コンパイルして、実行をしていた.

REPL 駆動開発は、このフィードバッグを得るスピードが普通よりも抜群に速いことで、 開発により集中出きるのではと感じた. Emacs で C-x C-e をすることで、 Clojure や Emacs Lisp コードを評価して結果をパッと得られることは、快感でもある.

RDD は TDD と比較されることが多い. TDD はテストコードを書くのに、またメンテナンスすることに時間がかかることが問題視されることが多い. TDD は費用対効果を考えてやらなければならないというのが今の持論.

とくにプロトタイプなどは品質よりは速く成果をあげることが大事.そこで、RDD である. 先日ハッカーと画家を読んだが、そこでも速くアイデアを形にすることがハッカー気質だと学んだ.

より素早くフィードバッグを回してガンガンつくることに相性が良い.

REPL 駆動開発は、素早くプロトタイプや自分の考えを形にするときに有効な手段だと感じた.

28 Dec 2015, 17:39

あなたはハッカーですか?ハッカーと画家から学ぶハッカー気質について。

ハッカーと画家を読んだ.

エッセイの随所で、ハッカーの気質について語られている.

本記事では、その箇所の抜粋と要約、それに対する自分の考えをメモする.

記事を読むたびに、自分はハッカーとは程遠い存在なのだと悲観してしまう.

メイド・イン・ USA

コードは、ピラミッドみたいに、慎重に計画をしてから苦労して組みくものではない。 一気に集中して手を動かしながら、常に気を変えていく、木炭スケッチのようなものだ.

ソフトウェアの腕のよさは、素早い仕事を意味する.

そこでは大胆さが酬われる.

車や都市はそうはいかない. あまりに物質的すぎるからだ.

とにかくやる、という方法は、確かに利点がある. 速度がその理由だと思う. 誰でも作れる日用品を作ることで富を成すのは難しい. 価値は新しいものにある. そして最初になにかを作り出したいと思うならば速くやることは重要だ.

ハッカーの気質というものを、ソフトウェアや映画と都市や車の対比によって説明している.

  • ハッカー気質 … 速さ、新しさ
  • 職人気質 … 精密さ、成熟さ

アメリカ人は、日本に比べて車をつくることは下手だけれども、 ソフトウェアをつくるのは得意、それはハッカー気質をもっているから.

ハッカー気質、自分には存在するか?今のところ、ない. 一気呵成に自分の頭に浮かんだアイデアをコードに落とすことができない. それは、気質の問題なのだろうか?才能の問題なのだろうか?

ハッカーと画家

ハッカーと画家に共通することは、どちらもものを創る人間だということだ。

ハッカーと数学者は科学をやっているわけではないんだ。

科学者は、まず完璧な仕事から始める. つまり、 誰か他の人が既にやったことを再現することから始める。 そうしているうちに、独自の仕事が出来るレベルに達するのだ。 一方、ハッカーは、最初から独自の仕事をする。 ただ、最初はへたくそだろう。ハッカーはオリジナルから始め、 上手になってゆく。 科学者は上手になることから始め、オリジナルになってゆく。

ハッカーと科学者の対比によって、両者の違いを示している.

ハッカー気質 科学者


美しいデザインで評価される 独創的な論文で評価される 実践重視 理論重視 独自なものから上手になる 完璧なものを再現して上手になる

ハッカーと画家は*ものを創る*という点において共通していると述べている.

  • 昼間の仕事をもち、美しい創作の時間は別の時間にもつ。
  • 自分で書く(描く)ことによって学ぶ。ハックしながら学ぶ。
  • 技法を模倣することで上達する。
  • 次第に詳細化しながらものを創っていく(細部から全体へ)
  • 偉大な作品は到達すべきゴールのさらに上をいっていなければならない
  • 美に対する熱狂的な没頭を要求する。見えない細部にもこだわる.
  • 他の人と共同で作品をつくる。共感能力が必要。
  • 絵画同様に、ハッキングもクールな時代がやってくる.

自分は、ハッカーというよりも科学者に近い. 自分の学習スタイルは、本を買って読んでいる。 つまり、完璧なものを模倣することで上達を考えている。 これは、ハッカー気質からは遠いことだ。

ハッカー気質とは、下手でもいいからなにかを創り上げながら上達していく. なにかをつくりあげて、github に公開したこともない.

The Word Hacker

一般的には、ハッカーとはコンピュータに侵入する人物のことを指す。 プログラマの間では、優れたプログラマを指す。 プログラマにとって”ハッカー”は文字通りその道の達人であることを意味しているんだ. つまり、コンピュータに、よいことであれわるいことであれ、 自分のやりたいことをやらせることができるもの、と言うことだ.

名詞の”ハック”には二つの意味がある. それは賞賛にもなるし、侮辱にもなる. 醜い解答と独創的な解答には、共通点がある。どちらもルールを破っているということだ.

ハッカーは規則に従わない。それがハッキングの本質なんだ。

トマス・ジェファーソンはこう書いている。 『政府への慣行の精神は、ある種の状況では非常に価値のあるものだ。 だから私は、そのような精神が常に保たれることを望む』

ハッカーの気質、それはルールを破ること。 ルールを破ることが富と力の源であり、アメリカ人の気質ではなかったかと。

自分は、日本人だし、とりわけルールを破ることに臆病だ。 この点においても、ハッカーには遠い。

普通のやつらの上を行け

エリック・レイモンドはエッセイ「ハッカーになろう」の中で、 他のいろいろなアドバイスに混じって、 ハッカーになりたい人はどんな言語を勉強すべきかを述べている。 まず Python と Java から始めよ、学ぶのが容易だから。 真剣なハッカーはさらに、Unix をハックするために C を学び、 システム管理と CGI スクリプトのために Perl を学ぶべし。 そして本当に真剣なハッカーは Lisp を学ぶことを熟慮すべきだ、と。

技術を選択するときは、他の人がどうやってイルカなんて無視して、 何が最適かを見極めることだけを考えるべきだ.

プログラミング言語は、その力において差がある。 アプリケーションを書くならば、手に入るなかで最も力の強い言語を使うべきだし、 そうでない選択は、機械語を使うことが間違いであるのと同様で、間違いなのだ.

私は、Lisp が一番上にくると言おう。なぜなら、マクロがあるから。

ハッカーは Lisp を学ぶべきと、Lisp を熱く語る文章.

自分は、Lisp ができない.

素晴らしきハッカー

難しいのは、問題を解くことではなく、どの問題を解くかを決めることだ。 創造性を測るのは難しい。が、現実にはそれはコードの行数で測られるような 生産性をはるかに陵駕するだろう。

スーパーハッカーを特徴づけている資質は、 プログラミングを本当に愛しているということだ。 普通のプログラマは生活のためにコードを書く。 素晴らしいハッカーにとっては、コード書きは楽しみのためにするもので、 それにお金を払ってくれるというひとがいれば大いに喜ぶものだ。

ハッカーはよい道具が好きだ。悪い道具をつかうことに耐えられない.

素晴らしいハッカーはオープンソースを使うことを主張する。 そのほうが良質だというだけでなく、自分で多くをコントロールできるからだ。

ハッカーにとって、ソフトウェアの次に大事な道具は、おそらく仕事場だ。

ハッカーは、よい道具とともに、面白いプロジェクトを好む. 新しい技術的な挑戦があれば、どんなアプリケーションだって面白くなれる。

良いハッカーになる鍵は、たぶん自分がやりたいことをやることだ。 何かをうまくやるためには、それらを愛していなければならない。 ハッキングがあなたがやりたくてたまらないことである限りは、 それがうまくできるようになる可能性は高いだろう。

ハッカーはとりわけ好奇心が強い。 集中力について、他のすべてのことを頭から追い出せる能力。

自分を素晴らしいハッカーにすることができるとしたら、 退屈なプロジェクトの仕事は一切しなくてよい、その代わり、 絶対に中途半端な仕事はしないと誓うことだ。

この文章では、よいハッカーの特徴について乱雑にかかれている.

  • よい道具を愛する
  • よい職場を愛する
  • 面白いプロジェクトを愛する
  • やりたいことをやる
  • 好奇心と集中力が強い

自分は、いやいやながら、どんな仕事でもしてしまう。 それは、自分はプログラムを生活のために書いているからだ。 生活のためではなくて、楽しみのために書くほど実力がない。

プログラミングすら、今の自分には愛せないでいる.

まとめ

ハッカーに憧れてきた。しかし、ハッカーとは程遠い自分を再認識した.

自分の嫌になるほどの、慎重さ、臆病さが、ハッカー気質を妨げる。

自分は本当に、この道を選んで正解だったのか?

ハッカーになりたければ、もっと大胆に考えて、行動しなければいけない.

27 Dec 2015, 06:22

プログラミングでフロー状態に入るための習慣について

プログラミングの勉強をしていると、 フロー状態に入っていい感じに集中できることがある。

どういうときに、そうなれるのか、最近の自分の習慣についてまとめてみた.

姿勢を正す

正しい姿勢で作業をすると、集中できる.

私は、BagJoy というものを常に持ち歩いている. カフェでも職場でも、これをしいて座ることで背筋を伸ばして作業している.

大変おすすめ.

テクノを聴く

テクノミュージックを聴くと、集中できる.

ミニマルな、単調なリズムの繰り返しによって、 脳がズンズンと深い集中状態に導かれる.

Jazz やクラシックも大好きでよく聴くのだけれども、 結局はやはりテクノミュージックが一番よい.

プログラミングという作業とテクノミュージックは相性がよいのかも.

Digitally Imported という無料でテクノを聴けるサイトで聴いている. チャンネルは、Tech House だ.

カフェインをとる

カフェインをとると脳が集中できる.レッドブルもよい. カフェインの錠剤も、多用している.


でも、カフェインの効力はせいぜい 1 時間だ. 継続的なフローをキープするためには、カフェインの手段に頼ってはいけない.

プチ瞑想する

プチ瞑想をすると、集中力が上がる.瞑想については、以下の記事に書いた.

呼吸に意識を集中して、心のなかでマントラを唱える(おーなんすばーはー) そうすると、雑念が消えて集中状態に入れる.

瞑想のトレーニングをすることは、フローに入るためのよい訓練方法だ. 日々、雑念を捨てる訓練をすることで、瞬間的に無の状態へいつでもなれる.

マウスを利用しない

マウスを利用せずに、キーボードだけで作業をしていると、 集中することができる.

極端なはなし、Emacs の中にこもっていると作業に集中することができる. ときには、ブラウザを利用したくなることもある. Emacs ライクに操作できる conkeror というマイナなブラウザを利用している.

また、タイル型ウィンドウマネージャーを利用することで、 ウィンドウ配置をキーボードだけで完結させることができる.

まとめ・睡眠

いろいろとまとめてみたが、一番よいのは十分な睡眠をとる事なきがしている. 睡眠を十分にとった後は、なぜか集中力が上がる.寝不足だと集中できない.

26 Dec 2015, 11:25

AOJ へ Emacs から投稿するスクリプトをみつけた

AOJ の問題を最近解いているのだが、 Emacs から投稿するスクリプトがないかなと探していたら、見つけた.

aoj-submit をうつと、web に投稿してくれる。これは便利だ..

ここからが Hack. できれば、ローカルでテストケースを実行したい.

そのためのスクリプトを見つけた.

たとえば、問題番号 1147 のテストをしたいとき、 以下を実行すると、テストケースをダウンロードしてきてローカルで実行してくれる.

oj.py --aoj -i 1147.py 1147

ソースを読むと、html をスクレイピングしてるようなトリッキーなことをしていた.

これを Emacs から叩けるように、メソッドを追加してみた.

(defcustom aoj-ojpy-path nil "Your oj.py path")

(defun aoj-test ()
  (interactive)
  (shell-command (concat aoj-ojpy-path " --aoj -i "
                         (file-name-nondirectory (buffer-file-name)) " " (aoj--problemNO))))

これで、Emacs からテスト実行 -> 提出ができるようになった.

25 Dec 2015, 08:20

Udacity で Machine Learning for Trading の講義をきいた

Udacity で Machine Learning for Trading のビデオを見てみた.

これは、coursera にある以下のコンテンツの Part2 になる.

講義内容

3つのパートに分かれている.

  1. Python の numpy, pandas, scipy の使い方
  2. ヘッジファンドについて
  3. 機械学習

1 つめは、python の numpy, pandas ライブラリを用いて 金融データをどうやって扱うかが説明される.

2 つめは、ヘッジファンドの仕組みについて. ここのパートは、coursera の講義内容と内容がかぶってていたので、 飛ばした.

3 つめは、機械学習をシステムトレードに適用する方法について 説明される. 具体的に説明されていたのは、以下のような内容.

  • 線形回帰
  • KKN 法
  • Q 学習(強化学習)

他にも、KKN 法を改良した bagging algorithms や、 Q 学習を改良しした、Dyna-Q 学習 algorithms について解説されていた. 一度ビデオをみただけでは理解できなかった.

それから、この MOOC には提出課題はない. 課題の内容は公開されているのだが、提出が求められていない. Disscussion Board とかもないので、自力で解くのは断念して、課題はやらなかった.

感想

機械学習について、学べると思ったが、正直理解できなかった.

また、Computational Investing Part I に触発されて去年 FX のシステムトレードを したのて、これに機械学習のアイデアを取り入れて改良できればいいなと考えていた のだが、理解できていないので改良できない..

今後について

この講義だけで、機械学習をまなべると思っていたのは舐めていた.

本当に機械学習をシステムトレードに当てはめるためには、 本腰を入れて機械学習を学ばないといけないな. しかも、日本語のリソースで!(英語は理解できない)

機械学習を勉強するには、覚悟を決めて取り組まないと理解できない気がする. お試しで身につくようなものではない. 時間をかけるべきか、悩む.

とりあえず、深追いはせずにここで学習はやめようと思う.

20 Dec 2015, 08:16

プロコンをはじめたので今後の対策方法について考えた

ひまですることもないし、プログラミングにも興味がなくなってしまったので、 競技プログラミングの勉強をはじめた. プログラミングコンテストの対策についてまとめる.

以前、モチベーションについてはまとめた.

プロコンの動機について

プロコン参加の理由は、以下の通りだ.

  • 素早くコーディングする技術を身につけることができる.
  • プログラミングの基礎体力を身につけることができる.
  • TOEIC のように点数があるので自分の成長を実感できる.
  • 転職活動に利用できる.
  • プロダクトのクソコードから離れて自分の美学を貫いたコードがかける.

それから、Python でプログラミングをしている. 理由は、美しくコードがかけるからだ. C++という選択肢は捨てがたいが、C++よりも Python のほうがシンプルにかける. しかし、Python でプロコンをするのはまだ少数派のため、解答例を見つけるのが難しい,

TopCoder を中心に学習を進めていくつもりだ. 最終目標は TopCoder でイエローコーダになること。 そのためには、まず Div1 に上がること.

プロコンの対策について

プロコンの対策について、 こうすればよいというネット上のリソースをいろいろと検索したものの、よいものが見つからない. TOEIC などはみつかるのに。以下、検索結果を列挙.

現在、以下の本をもっている. 以下、簡単に所感を述べる.

  • 最強最速アルゴリズマー養成講座.(チーター本)

TopCoder の過去問を中心に演習問題が並んでいる.TopCoder 専用問題集.

  • プログラミングコンテストチャレンジブック.(蟻本)

北京オンラインジャッジの過去問を中心に演習問題が並んでいる. 解答例が C++なので、Python で読むには苦痛が伴うところが難点. プロコンで必要なアルゴリズムが網羅されている. 有名な対策本.

  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造.(ALDS)

アルゴリズムの基礎が、会津オンラインジャンジを利用して学習できる. タイトルに反して、どちらかというと基礎がための要素が強く、 プロコン向けではない気がしている.

Web 上のリソースには以下がある.

最強最速アルゴリズマー養成講座

実践・最強最速のアルゴリズム勉強会:

TopCoder のページにある対策記事(英語)

Python の対策には以下がよい.

効率のよい学習方法は、典型問題の暗記だと思っている. 受験数学をどうすれば解けるようになるか、考えてみると、典型問題を暗記することが 効率がよかったという、高校生のときの体験がある. 数学は暗記だ. 解法パターンを暗記してしまおう.

今後の学習計画について

どう進めればよいものか、なやんでいる. 心にもやもやしているものを書き出してみる.

  • 蟻本 蟻本を読むのが王道な気がするが、Python で取り組むには解答例に乏しい.
  • AOJ 会津オンラインジャッジは素晴らしいシステムだ。Python による解答例も見つかるので、 自分のコードと比較することで勉強にもなる. しかし、解答に対する解説がない問題は、学習の投資に対する効果が薄い.
  • TopCoder 過去問 TopCoder には、Editorial という過去問に対する解説がある. http://apps.topcoder.com/wiki/display/tc/Algorithm+Problem+Set+Analysis

    しかし、英語なので、困る. 日本語でないと、 理解するのに時間がかかるのだ.余計な労力をつかいたくない.

  • プログラミングコンテスト参加 TopCoder, Codeforce, AtCoder…たくさんのコンテストがある。 コンテストに参加すると、モチベーションが高まるのでよいが、 自分のペースで学習することができない点がデメリット. また、体系的に学習できない.

Conclusion

コツコツと続けられて、成果を振り返って確認できるものがよい. そうすると、とにかく無作為に数をこなすよりも、書籍による学習がよいと考えた. ここ数週間のメニューは以下の通りとする.

  • 蟻本を Python で解いで、基礎知識を身につける.
  • TopCoder の過去問を解いて、問題にとにかくなれる.(1日1題目標)
  • 可能な限りプロゴラミングコンテストに参加する。そして、復習する.

追記

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    蟻本、挫折した.ムズかしい. もっと簡単なもので対策をしなければ. 難易度順に問題が並んでいるサイトをみつけた. ICPC-AOJ というサイト.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ichyo.jp/aoj-icpc/">http://ichyo.jp/aoj-icpc/</a>
    </li>
  </ul>

  <p>
    AOJ による採点ができる & 難易度順に問題がならんでいる ということで、これを順に解いていくことにするよ..
  </p>

  <p>
    ACM-ICPC のサイトにおすすめ問題が載っている。これを解いていこう. おすすめ. サイトのリンクは POJ だけれども、AOJ で検索すると対応する問題が載っている.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.deqnotes.net/acmicpc/">http://www.deqnotes.net/acmicpc/</a>
    </li>
  </ul>
</div>

追記 2

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    TopCoder の練習方法についてかかれた記事.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.quora.com/How-should-I-practice-so-that-I-will-be-at-a-level-where-I-can-approach-TopCoders-Div1-500-problems-with-confidence">How should I practice so that I will be at a level where I can approach TopCoder&#8217;s Div1-500 problems with confidence? &#8211; Quora</a>
    </li>
  </ul>

  <p>
    TopCoder のチュートリアルがいいらしい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.topcoder.com/community/data-science/data-science-tutorials/">https://www.topcoder.com/community/data-science/data-science-tutorials/</a>
    </li>
  </ul>
</div>

追記 3

<div class="outline-text-3" id="text-orgheadline7">
  <p>
    twitter の対策方法まとめ
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://togetter.com/li/729445">http://togetter.com/li/729445</a>
    </li>
  </ul>
</div>

20 Dec 2015, 07:17

2015 年の過去記事振り返りと 2016 年の目標

今年も終わりなので、2015 年の振り返りと 2016 年の目標を立てる.

2015 年の振り返り

たいして成長を実感できない、一年となってしまった.

まず、2015 年の目標はどうだったかというと、以下の 2 つを目標にあげた.

  • 統計解析
  • 関数型言語

統計解析

<div class="outline-text-3" id="text-orgheadline2">
  <p>
    結論からいうと、身につかなかった. モチベーションも続かなかった. 今の仕事が組み込みソフトの開発なので、統計の知識なんて使う余地がない. そう思うと、途端にやる気が失せた.
  </p>

  <p>
    一応, MOOC で統計の講座を取った. R 言語をちょい頑張ったのだが、結局身につかず.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/3019">Coursera で Reproducible Research をうけた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2968">統計解析の基礎を学ぶ! edX の Foundations of Data Analysis をうけた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2961">Coursera で R 入門! Data Scientist の講座 2 つ | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/3069">鮮やかにデータを可視化する! coursera で Exploratory Data Analysis を受けた | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/3106">Gacco で 社会人のためのデータサイエンス入門をうけた | Futurismo</a>
    </li>
  </ul>
</div>

関数型言語

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    関数型言語も中途半端な頑張りに終わってしまった. SICP を読んでいたのだが、結局難しくて、途中で挫折してしまった.
  </p>

  <p>
    それから、Scala, Haskell, CommonLisp, Clojure と関数型言語を つまみぐいしたけれども、結局どれも中途半端。残るものはない.
  </p>

  <p>
    しかし、いろいろな言語に触れることで、 関数型言語の初歩はなんとなくわかったような気がする.
  </p>
</div>

その他小さい話題について

<div class="outline-text-3" id="text-orgheadline7">
</div>

<div id="outline-container-orgheadline4" class="outline-4">
  <h4 id="orgheadline4">
    MOOC について
  </h4>

  <div class="outline-text-4" id="text-orgheadline4">
    <p>
      今年の前半まで、MOOC を頑張っていた.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/3032">システム制御は奥が深い! 井戸の中の蛙な自分.coursera で Cloud Computing Cocepts をうけた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3109">仕事に関わる知識を MOOC で! Coursera で Cloud Computing Concepts Part2 を受けた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3950">ハードウェアの仕組みを学ぶ!coursera で From Nand To Tetris Part1 を受けた | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/3975">リアクティブプログラミングの世界観を垣間見!coursera で Principles of Reactive Programming を受けた | Futurismo</a>
      </li>
    </ul>

    <p>
      しかし、ある日突然、MOOC に対して興味を失ってしまう&#x2026;
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/4140">MOOC をはじめてから 2 年たち、そろそろ飽きてきた | Futurismo</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-orgheadline5" class="outline-4">
  <h4 id="orgheadline5">
    楽しかった FX
  </h4>

  <div class="outline-text-4" id="text-orgheadline5">
    <p>
      今年一番楽しかったのは、FX システムトレードのプログラムを Python で書いたことだ.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/4455">FX シストレプログラム AWS でサーバ借りてデビュー | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/4392">夏休みの自由研究 は OANDA API を利用して FX システムトレード | Futurismo</a>
      </li>
    </ul>

    <p>
      儲からなかったけれども、作り上げる喜びを感じた.
    </p>
  </div>
</div>

<div id="outline-container-orgheadline6" class="outline-4">
  <h4 id="orgheadline6">
    Emacs にあきる
  </h4>

  <div class="outline-text-4" id="text-orgheadline6">
    <p>
      2015 年の前半は、Emacs が好きだった。なにか Elisp で作品を書きたいと思っていた. だが、結局アイデアが浮かばずに、なにも作れなかった.
    </p>

    <p>
      そして、Emacs 自体にも飽きてしまった. 普段の開発では Eclipse をつかってるからね.
    </p>
  </div>
</div>

そして迷走する

<div class="outline-text-3" id="text-orgheadline8">
  <p>
    2015 年の下期、とにかく自分がなにをすればいいか分からなくなってしまった. 詳しい経緯は、以下の記事にまとめた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/3944">自分はプログラミングが好きなのだろうか? | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/5439">プログラミングに興味がなくなってしまった | Futurismo</a>
    </li>
  </ul>

  <p>
    いったい、自分はなにをすればいいのかわからない. こんな状態で、来年度の目標をどう立てればいいのやら&#x2026;.
  </p>
</div>

2016 年の目標

前にも書いた通り、今はプログラミングに対するモチベーションが下がっている.

目標はないよりもあったほうがよい.暫定の目標だ.

熱中できるようなおもしろいなにかが見つかったら、そっちに注力することにする.

TOEIC

<div class="outline-text-3" id="text-orgheadline10">
  <p>
    プログラミングに飽きてしまったが、その空いた時間を利用して TOEIC の勉強をしている.
  </p>

  <p>
    とにもかくにも、英語ができないと MOOC もできないし、洋書も読めない.
  </p>

  <p>
    英語力を向上させる一年としたい. 目指せ、860 点!!
  </p>
</div>

プロコン

<div class="outline-text-3" id="text-orgheadline11">
  <p>
    やることがなくなってしまったので、 とりあえずの目標. この目標は変えるかもしれない.
  </p>

  <p>
    TopCoder で Div1 にあがることが目標. 具体的な対策は以下に書いた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/5552">プロコンをはじめたので今後の対策方法について考えた | Futurismo</a>
    </li>
  </ul>
</div>

Clojure

<div class="outline-text-3" id="text-orgheadline12">
  <p>
    関数型言語を引き続き勉強したい. そのための手段として Clojure を選ぶ.
  </p>

  <p>
    Scala をやったほうが仕事で生かすチャンスはありそうなものだが、 なぜかわからないが、Clojure に惹かれるのだ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/4649">シンプルさが前に進む力となる Clojure | Futurismo</a>
    </li>
  </ul>

  <p>
    今、まともに利用できる言語は、C, Java, Ruby の 3 つくらい. これに、来年は Clojure を加えたい.
  </p>
</div>