10 Nov 2014, 13:12

LinuxFoundation が MOOC に進出! edX で Introduction to Linux を受ける.

はじめに

会社で LPIC の資格をとれという, パワーハラスメントにあっている. ストレスで嫌だったらありゃしない.

なので, しぶしぶと Linux の勉強をするために, MOOC の Linux 講座を受講してみた.

Linux 生みの親登場

この edX の講座は, LinuxFoundation が主催. LinuxFoundation というのは Linux 普及のための教育期間. University 以外の機関が MOOC への参加を発表したことは, 少し話題になった.

すごいと思ったのは, このイントロ動画.

Linux 生みの親, リーナス・トーバルズ直々の宣伝活動だ.

  <div id="outline-container-unnumbered-3" class="outline-2">
    <h2 id="unnumbered-3">
      結構期待はずれだった&#x2026;
    </h2>

    <div class="outline-text-2" id="text-unnumbered-3">
      <p>
        結論から書くと, 期待はずれ.
      </p>

      <p>
        なぜかというと, 知っていることばかりだったから.
      </p>

      <p>
        Linux に触れたことがまったくない人のための, 本当の初心者をターゲットにしているように思う.
      </p>

      <p>
        なので自分のような, 仕事で Linux をつかったり, 自宅のノート PC に ArchLinux を入れて遊んでいるような人にとっては, 常識的なことばかりが書いてあるので, まったくつまらない.
      </p>

      <p>
        自分にとっては, この講座は意味がなかったな&#x2026;
      </p>

      <p>
        いやいや, そういう屁理屈は, LPIC L1 の試験に合格してから言わねば&#x2026;
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-4" class="outline-2">
    <h2 id="unnumbered-4">
      LPIC L1 の試験対策になるかな. .ならない
    </h2>

    <div class="outline-text-2" id="text-unnumbered-4">
      <p>
        edX で勉強しても, それが対策にはならないというのが感想.
      </p>

      <p>
        LPIC という試験は, 問題を暗記すると受かる試験なので. LPIC の勉強は, 問題集や ping-t をとくのがよい.
      </p>

      <p>
        ただし, Linux に触れたことがないひとには, この edX の講座はいいかもしれない. 毎週, Lab という項目で, 実際に手を動かして Linux にふれる課題が出される.
      </p>

      <p>
        暗記すれば, 試験には受かるが, 知識としてはすぐにわすれてしまう. 手を動かすと, 知識は体に残る.
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-5" class="outline-2">
    <h2 id="unnumbered-5">
      LPIC L1 と Introduction to Linux の対応
    </h2>

    <div class="outline-text-2" id="text-unnumbered-5">
      <p>
        最後に, LPIC L1 の出題範囲と, 今回の edX の講座の対応をかいておく.
      </p>
    </div>

    <div id="outline-container-unnumbered-6" class="outline-3">
      <h3 id="unnumbered-6">
        101 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-6">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 101:システムアーキテクチャ<br /> 101.1 ハードウェア設定の決定と構成<br /> 101.2 システムのブート<br /> 101.3 ランレベルの変更とシステムのシャットダウンまたはリブート</p> 

        <p>
          Chapter 01: The Linux Foundation<br /> Chapter 02: Linux Philosophy and Concepts
        </p>

        <p>
          主題 102:Linux のインストールとパッケージ管理
        </p>

        <p>
          102.1 ハードディスクのレイアウト設計<br /> 102.2 ブートマネージャのインストール<br /> 102.3 共有ライブラリを管理する<br /> 102.4 Debian パッケージ管理を使用する<br /> 102.5 RPM および YUM パッケージ管理を使用する
        </p>

        <p>
          Chapter 03: Linux Structure and Installation<br /> Chapter 07: Finding Linux Documentation
        </p>

        <p>
          * 主題 103:GNU と Unix のコマンド
        </p>

        <p>
          103.1 コマンドラインで操作する<br /> 103.2 フィルタを使ってテキストストリームを処理する<br /> 103.3 基本的なファイル管理を行う<br /> 103.4 ストリーム, パイプ, リダイレクトを使う<br /> 103.5 プロセスを生成, 監視, 終了する<br /> 103.6 プロセスの実行優先度を変更する<br /> 103.7 正規表現を使用してテキストファイルを検索する<br /> 103.8 vi を使って基本的なファイル編集を行う
        </p>

        <p>
          Chapter 06: Command Line Operations<br /> Chapter 10: Text Editors<br /> Chapter 13: Manipulating Text<br /> Chapter 17: Processes
        </p>

        <p>
          * 主題 104:デバイス, Linux ファイルシステム, ファイルシステム階層標準
        </p>

        <p>
          104.1 パーティションとファイルシステムの作成<br /> 104.2 ファイルシステムの整合性を保持する<br /> 104.3 ファイルシステムのマウントとアンマウントをコントロールする<br /> 104.4 ディスククォータを管理する<br /> 104.5 ファイルのパーミッションと所有者を管理する<br /> 104.6 ハードリンクとシンボリックリンクを作成・変更する<br /> 104.7 システムファイルを見つける, 適切な位置にファイルを配置する
        </p>

        <p>
          Chapter 08: File Operations<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-7" class="outline-3">
      <h3 id="unnumbered-7">
        102 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-7">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 105:シェル, スクリプト, およびデータ管理</p> 

        <p>
          105.1 シェル環境のカスタマイズと使用<br /> 105.2 簡単なスクリプトをカスタマイズまたは作成する<br /> 105.3 SQL データ管理
        </p>

        <p>
          Chapter 15 : Bash Shell Scripting<br /> Chapter 16: Advanced Bash Scripting
        </p>

        <p>
          * 主題 106:ユーザインターフェイスとデスクトップ
        </p>

        <p>
          106.1 X11 のインストールと設定<br /> 106.2 ディスプレイマネージャの設定<br /> 106.3 アクセシビリティ
        </p>

        <p>
          Chapter 04: Graphical Interface<br /> Chapter 18: Common Applications
        </p>

        <p>
          * 主題 107:管理業務
        </p>

        <p>
          107.1 ユーザアカウント, グループアカウント, および関連するシステムファイルを管理する<br /> 107.2 ジョブスケジューリングによるシステム管理業務の自動化<br /> 107.3 ローカライゼーションと国際化
        </p>

        <p>
          Chapter 05: System Configuration from the Graphical Interface<br /> Chapter 09: User Environment
        </p>

        <p>
          * 主題 108:重要なシステムサービス
        </p>

        <p>
          108.1 システム時刻を維持する<br /> 108.2 システムのログ<br /> 108.3 メール転送エージェント (MTA) の基本<br /> 108.4 プリンターと印刷を管理する
        </p>

        <p>
          Chapter 14: Printing
        </p>

        <p>
          * 主題 109:ネットワークの基礎
        </p>

        <p>
          109.1 インターネットプロトコルの基礎<br /> 109.2 基本的なネットワーク構成<br /> 109.3 基本的なネットワークの問題解決<br /> 109.4 クライアント側の DNS 設定
        </p>

        <p>
          Chapter 12: Network Operations
        </p>

        <p>
          * 主題 110:セキュリティ
        </p>

        <p>
          110.1 セキュリティ管理業務を実施する<br /> 110.2 ホストのセキュリティ設定<br /> 110.3 暗号化によるデータの保護
        </p>

        <p>
          Chapter11: Local Security Principles<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

09 Nov 2014, 12:04

Emacs で Python 開発環境を構築

はじめに

coursera で Python をつかう講座を 2 つとった.

もちろん Emacs で開発環境をつくったので, 構築メモ.

  <div id="outline-container-unnumbered-2" class="outline-2">
    <h2 id="unnumbered-2">
      入力支援
    </h2>

    <div class="outline-text-2" id="text-unnumbered-2">
      <p>
        python.el は公式, python-mode.el は Python コミュニティによって作成されたもの.
      </p>
    </div>

    <div id="outline-container-unnumbered-3" class="outline-3">
      <h3 id="unnumbered-3">
        python
      </h3>

      <div class="outline-text-3" id="text-unnumbered-3">
        <p>
          Emacs にデフォルトではいっているやつ.
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-4" class="outline-3">
      <h3 id="unnumbered-4">
        python-mode
      </h3>

      <div class="outline-text-3" id="text-unnumbered-4">
        <p>
          Python コミュニティによって作成されたもの.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/emacsmirror/python-mode">emacsmirror/python-mode</a>
          </li>
          <li>
            <a href="https://launchpad.net/python-mode/">python-mode.el in Launchpad</a>
          </li>
          <li>
            <a href="http://tnt.math.se.tmu.ac.jp/~tetsushi/nzmath/emacs-python-mode.html">Guide &#8211; Software &#8211; Emacs &#8211; python-mode</a>
          </li>
        </ul>

        <p>
          ショートカットがまとまっている.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://ikautimituaki.hatenablog.com/entry/20111120/1321806070">python-mode の便利なショートカットまとめ &#8211; まったりいんふぉまてぃくすめもらんだむ</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-5" class="outline-3">
      <h3 id="unnumbered-5">
        インデント設定
      </h3>

      <div class="outline-text-3" id="text-unnumbered-5">
        <p>
          4 で設定.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (add-hook &#8216;python-mode-hook<br /> &#8216;(lambda ()<br /> (setq indent-tabs-mode nil)<br /> (setq indent-level 4)<br /> (setq python-indent 4)<br /> (setq tab-width 4)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-6" class="outline-2">
    <h2 id="unnumbered-6">
      コードリーディング
    </h2>

    <div class="outline-text-2" id="text-unnumbered-6">
    </div>

    <div id="outline-container-unnumbered-7" class="outline-3">
      <h3 id="unnumbered-7">
        helm-etags-plus
      </h3>

      <div class="outline-text-3" id="text-unnumbered-7">
        <p>
          ダグジャンプ. ctags を利用する. そして, ctags を Emacs から利用するために, 最近は helm-etags-plus なるものを使っていたりする.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/jixiuf/helm-etags-plus">jixiuf/helm-etags-plus</a>
          </li>
        </ul>

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

        <p>
          [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> $ ctags -o TAGS *.py<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-8" class="outline-3">
      <h3 id="unnumbered-8">
        swoop
      </h3>

      <div class="outline-text-3" id="text-unnumbered-8">
        <p>
          ctags はメソッドの定義にはジャンプできるけど, 変数の宣言にジャンプできない.
        </p>

        <p>
          変数の宣言に飛びたいときは, swoop が最近は大のお気に入り.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://fukuyama.co/emacs-swoop">Emacs バッファ内高速ナビゲーション Swoop.el を作りました. &#8211; Web 学び</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;swoop)<br /> (global-set-key (kbd &#8220;M-o&#8221;) &#8216;swoop)<br /> (global-set-key (kbd &#8220;C-M-o&#8221;) &#8216;swoop-multi)<br /> ;; (global-set-key (kbd &#8220;M-o&#8221;) &#8216;swoop-pcre-regexp)<br /> (global-set-key (kbd &#8220;C-S-o&#8221;) &#8216;swoop-back-to-last-position)
        </p>

        <p>
          (define-key isearch-mode-map (kbd &#8220;M-o&#8221;) &#8216;swoop-from-isearch)<br /> (define-key swoop-map (kbd &#8220;M-o&#8221;) &#8216;swoop-multi-from-swoop)
        </p>

        <p>
          ;; サイズ変更禁止<br /> (setq swoop-font-size-change: nil)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-9" class="outline-3">
      <h3 id="unnumbered-9">
        imenu
      </h3>

      <div class="outline-text-3" id="text-unnumbered-9">
        <p>
          関数一覧を表示する. そのままだと動かなかったので, いかのリンクを参考にした.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://qiita.com/lambdasakura@github/items/ceb9bc6fb008c959ec4b">Emacs の Python 開発環境構築メモ &#8211; Qiita</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (semantic-mode 1)<br /> (add-hook &#8216;python-mode-hook<br /> (lambda ()<br /> (setq imenu-create-index-function &#8216;python-imenu-create-index)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-10" class="outline-2">
    <h2 id="unnumbered-10">
      リファクタリング
    </h2>

    <div class="outline-text-2" id="text-unnumbered-10">
      <p>
        主に名前変更の Elisp を導入.
      </p>

      <p>
        参考リンク:
      </p>

      <ul class="org-ul">
        <li>
          <a href="http://stackoverflow.com/questions/28796/what-refactoring-tools-do-you-use-for-python">What refactoring tools do you use for Python? &#8211; Stack Overflow</a>
        </li>
      </ul>
    </div>

    <div id="outline-container-unnumbered-11" class="outline-3">
      <h3 id="unnumbered-11">
        anzu
      </h3>

      <div class="outline-text-3" id="text-unnumbered-11">
        <p>
          インタラクティブな補完.
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/syohex/emacs-anzu">syohex/emacs-anzu</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-12" class="outline-3">
      <h3 id="unnumbered-12">
        iedit
      </h3>

      <div class="outline-text-3" id="text-unnumbered-12">
        <p>
          C-;から気軽に同じキーワードを編集できる.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/emacs/Iedit">EmacsWiki: Iedit</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-13" class="outline-3">
      <h3 id="unnumbered-13">
        Ropemacs
      </h3>

      <div class="outline-text-3" id="text-unnumbered-13">
        <p>
          Python 用のリファクタリングツール.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://rope.sourceforge.net/ropemacs.html">ropemacs, rope in emacs</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-14" class="outline-2">
    <h2 id="unnumbered-14">
      コーディング支援
    </h2>

    <div class="outline-text-2" id="text-unnumbered-14">
    </div>

    <div id="outline-container-unnumbered-15" class="outline-3">
      <h3 id="unnumbered-15">
        jedi
      </h3>

      <div class="outline-text-3" id="text-unnumbered-15">
        <p>
          Python のオムニ補完 (かしこい補完) をしてくれる.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://qiita.com/yuu116atlab/items/2a62cb880ac863dcc8ef">emacs-jedi の install &#8211; Qiita</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-16" class="outline-3">
      <h3 id="unnumbered-16">
        ac-python
      </h3>

      <div class="outline-text-3" id="text-unnumbered-16">
        <p>
          auto-complete の python 強化版.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ac-python)<br /> (add-to-list &#8216;ac-modes &#8216;python-2-mode)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-17" class="outline-3">
      <h3 id="unnumbered-17">
        quickrun
      </h3>

      <div class="outline-text-3" id="text-unnumbered-17">
        <p>
          quickrun を利用すれば, python コードを Emacs から実行可能.
        </p>

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

        <p>
          システムの version が 3 で, Emacs からは 2 を利用したいときは, 以下のようにすれば実行コマンドをオーバライドできる.
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (quickrun-add-command &#8220;python&#8221;<br /> &#8216;((:command . &#8220;python2&#8221;))<br /> :override t)<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-18" class="outline-2">
    <h2 id="unnumbered-18">
      静的解析
    </h2>

    <div class="outline-text-2" id="text-unnumbered-18">
    </div>

    <div id="outline-container-unnumbered-19" class="outline-3">
      <h3 id="unnumbered-19">
        flymake
      </h3>

      <div class="outline-text-3" id="text-unnumbered-19">
        <p>
          flymake でエラーチェックを実施. エラーチェックのエンジンに pyflakes を利用する.
        </p>

        <p>
          [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> $ sudo pip install pyflakes<br /> [/sourcecode]
        </p>

        <p>
          Emacswiki を参考に設定.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/PythonProgrammingInEmacs">EmacsWiki: Python Programming In Emacs</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (when (load &#8220;flymake&#8221; t)<br /> (defun flymake-pyflakes-init ()<br /> ; Make sure it&#8217;s not a remote buffer or flymake would not work<br /> (when (not (subsetp (list (current-buffer)) (tramp-list-remote-buffers)))<br /> (let* ((temp-file (flymake-init-create-temp-buffer-copy<br /> &#8216;flymake-create-temp-inplace))<br /> (local-file (file-relative-name<br /> temp-file<br /> (file-name-directory buffer-file-name))))<br /> (list &#8220;pyflakes&#8221; (list local-file)))))<br /> (add-to-list &#8216;flymake-allowed-file-name-masks<br /> &#8216;(&#8220;\\.py\\'&#8221; flymake-pyflakes-init)))<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

  <div id="outline-container-unnumbered-20" class="outline-2">
    <h2 id="unnumbered-20">
      さいごに
    </h2>

    <div class="outline-text-2" id="text-unnumbered-20">
    </div>

    <div id="outline-container-unnumbered-21" class="outline-3">
      <h3 id="unnumbered-21">
        Environment
      </h3>

      <div class="outline-text-3" id="text-unnumbered-21">
        <ul class="org-ul">
          <li>
            ArchLinux
          </li>
          <li>
            Emacs 24.4
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-unnumbered-22" class="outline-3">
      <h3 id="unnumbered-22">
        Special Thanks
      </h3>

      <div class="outline-text-3" id="text-unnumbered-22">
        <ul class="org-ul">
          <li>
            <a href="http://www.emacswiki.org/PythonProgrammingInEmacs">EmacsWiki: Python Programming In Emacs</a>
          </li>
          <li>
            <a href="http://www.jesshamrick.com/2012/09/18/emacs-as-a-python-ide/">Emacs as a Python IDE &#8211; Jessica Hamrick</a>
          </li>
          <li>
            <a href="http://pedrokroger.net/configuring-emacs-python-ide/">Configuring Emacs as a Python IDE &#8211; Pedro Kroger</a>
          </li>
          <li>
            <a href="http://uchikoshi22.hatenadiary.jp/entry/20110925/1316936253">Emacs を Python 用 IDE としてセットアップ &#8211; uchikoshi22&#8217;s blog</a>
          </li>
          <li>
            <a href="http://d.hatena.ne.jp/cou929_la/20110525/1306321857">emacs の python 開発環境を整える &#8211; フリーフォーム フリークアウト</a>
          </li>
          <li>
            <a href="http://blog.kzfmix.com/entry/1334218401">Emacs の Python 開発環境を整えた</a>
          </li>
          <li>
            <a href="http://lambdalisue.hatenablog.com/entry/2013/06/23/071344">Vim を最強の Python 開発環境にする 2 &#8211; Λ Lisue&#8217;s blog</a>
          </li>
          <li>
            <a href="https://github.com/gabrielelanaro/emacs-for-python">gabrielelanaro/emacs-for-python</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

09 Nov 2014, 11:42

システムトレードで億万長者になるぞ! coursera で Computational Investing Part I を受けた

はじめに

お金持ちになりたい! 仕事をしないで, 遊んでくらしたい!

ということで, coursera でアルゴリズム投資を勉強してみた.

      <div id="outline-container-unnumbered-2" class="outline-2">
        <h2 id="unnumbered-2">
          内容
        </h2>

        <div class="outline-text-2" id="text-unnumbered-2">
        </div>

        <div id="outline-container-unnumbered-3" class="outline-3">
          <h3 id="unnumbered-3">
            アルゴリズム取引
          </h3>

          <div class="outline-text-3" id="text-unnumbered-3">
            <p>
              アルゴリズム取引についての内容.コンピュータで自動的に株の売買をするのだ!
            </p>

            <p>
              今, 投資の世界では, 1/3 の取引はコンピュータを介して実施されているら しい.それを, アルゴリズム取引という. <a href="http://en.wikipedia.org/wiki/Algorithmic_trading">Algorithmic trading &#8211; Wikipedia, the free encyclopedia</a>
            </p>

            <p>
              いわゆる, ヘッジファンドがなにをしているかが分かる.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/What-Hedge-Funds-Really-Introduction-ebook/dp/B00MYFT0TQ/ref=la_B00NR7UJ4A_1_1?s=books&#038;ie=UTF8&#038;qid=1414890856&#038;sr=1-1">Amazon.co.jp: What Hedge Funds Really Do: An Introduction to Portfolio Management 電子書籍: Philip J. Romero, Tucker Balch: 本</a>
              </li>
            </ul>
          </div>
        </div>

        <div id="outline-container-unnumbered-4" class="outline-3">
          <h3 id="unnumbered-4">
            Books
          </h3>

          <div class="outline-text-3" id="text-unnumbered-4">
            <p>
              講義で利用した本はこれ.Active Portfolio Management は もっとも重要な Algorithmic investing の本.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%83%BB%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E2%80%95%E9%81%8B%E7%94%A8%E6%88%A6%E7%95%A5%E3%81%AE%E8%A8%88%E9%87%8F%E7%9A%84%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%AA%E3%83%81%E3%83%A3%E3%83%BC%E3%83%89%E3%83%BBC-%E3%82%B0%E3%83%AA%E3%83%8E%E3%83%AB%E3%83%89/dp/4492711252/ref=sr_1_1?s=books&#038;ie=UTF8&#038;qid=1414412296&#038;sr=1-1">Amazon.co.jp: アクティブ・ポートフォリオ・マネジメント-運用戦略の計量的理論と実践: リチャード・ C. グリノルド, ロナルド・ N. カーン, Richard C. Grinold, Ronald N. Kahn, 明治生命特別勘定運用部, 日興証券アセットマネジメント本部: 本</a>
              </li>
              <li>
                <a href="http://www.amazon.co.jp/Active-Portfolio-Management-Quantitative-Controlling/dp/0070248826/ref=sr_1_1?s=english-books&#038;ie=UTF8&#038;qid=1414412270&#038;sr=1-1">Amazon.co.jp: Active Portfolio Management: A Quantitative Approach for Producing Superior Returns and Selecting Superior Returns and Controlling Risk (McGraw-Hill Library of Investment and Finance): Richard Grinold, Ronald Kahn: 洋書</a>
              </li>
            </ul>

            <p>
              この本にしたがって, 投資の基本的用語, 投資モデル, 投資に利用するた めの指標が解説される. 講義では, あまりプログラミングのことには降れず,経済用語の解説が多い. そして, この分野の知識はほぼない自分にとってはとてもつらい.
            </p>
          </div>
        </div>

        <div id="outline-container-unnumbered-5" class="outline-3">
          <h3 id="unnumbered-5">
            Assignment
          </h3>

          <div class="outline-text-3" id="text-unnumbered-5">
            <p>
              ただし, 宿題では, 毎回 Python プログラムを組むことになる. 講義で学んだ, 理論や考え方をコードに落とし込む.
            </p>

            <p>
              内容が実践的で楽しい.いくつか紹介.
            </p>

            <ul class="org-ul">
              <li>
                Yahoo ファイナンスからデータを取得.
              </li>
              <li>
                モンテカルロ法で最適なポートフォリオをシミュレートする.
              </li>
              <li>
                Event Study という投資戦略を実施するマーケットシミュレータを作成.
              </li>
              <li>
                あらかじめ決めておいたイベントを検出したら, 以下を実施. <ul class="org-ul">
                  <li>
                    100 ドルの BUY
                  </li>
                  <li>
                    5 日後に 100 ドルの SELL
                  </li>
                </ul>
              </li>

              <li>
                戦略をバックテストで評価する.
              </li>
            </ul>

            <p>
              各 Assignment は, 以下の wiki にある.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://wiki.quantsoftware.org/index.php?title=Computational_Investing_I#Assignments">http://wiki.quantsoftware.org/index.php?title=Computational_Investing_I#Assignments</a>
              </li>
            </ul>
          </div>

          <div id="outline-container-unnumbered-6" class="outline-4">
            <h4 id="unnumbered-6">
              Python
            </h4>

            <div class="outline-text-4" id="text-unnumbered-6">
              <p>
                ちなみに, 自分は Python 初挑戦だ. Ruby はできるので, それに似た Python はとくにつまづくことはなかった.
              </p>

              <p>
                Python に苦労するよりも, 以下のライブラリに苦戦.
              </p>

              <ul class="org-ul">
                <li>
                  Numpy
                </li>
                <li>
                  Pandas
                </li>
              </ul>

              <p>
                どちらも, Python で数値計算に利用するための デファクトスタンダードラ イブラリのなので, 情報元は多い.
              </p>

              <p>
                NumPy や pandas の参考書:
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E2%80%95NumPy%E3%80%81pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-Wes-McKinney/dp/4873116554/ref=pd_rhf_dp_s_cp_11_NKWA?ie=UTF8&#038;refRID=1RXNRYY640CBNJB4AVE8">Amazon.co.jp: Python によるデータ分析入門 -NumPy, pandas を使ったデータ処理: Wes McKinney, 小林 儀匡, 鈴木 宏尚, 瀬戸山 雅人, 滝口 開資, 野上 大介: 本</a>
                </li>
              </ul>
            </div>
          </div>

          <div id="outline-container-unnumbered-7" class="outline-4">
            <h4 id="unnumbered-7">
              QSTK
            </h4>

            <div class="outline-text-4" id="text-unnumbered-7">
              <p>
                初心者がいきなりアルゴリズム投資なんてできるのだろうか, と初めは思った.だが, Python の投資用ライブラリを利用すると, 簡単にデータの取得や分析をすることができた.
              </p>

              <p>
                QSTK というものを利用する.
              </p>

              <ul class="org-ul">
                <li>
                  <a href="http://wiki.quantsoftware.org/index.php?title=QuantSoftware_ToolKit">Quantwiki</a>
                </li>
                <li>
                  <a href="https://github.com/tucker777/QSTK">https://github.com/tucker777/QSTK</a>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>

      <div id="outline-container-unnumbered-8" class="outline-2">
        <h2 id="unnumbered-8">
          感想
        </h2>

        <div class="outline-text-2" id="text-unnumbered-8">
        </div>

        <div id="outline-container-unnumbered-9" class="outline-3">
          <h3 id="unnumbered-9">
            競馬の投資シミュレーションについて
          </h3>

          <div class="outline-text-3" id="text-unnumbered-9">
            <p>
              大学生のとき, 競馬のレースをモンテカルロ法でシミュレートして, その結果によって, 最適なポートフォリオを組んで競馬にかけるようなことをした.
            </p>

            <p>
              本当は, 大学生のときも競馬ではなくて投資を対象にトライアルを することも考えたのだが, 金融工学を一から学ぶにはハードルが高いので,止めた.
            </p>

            <p>
              大学生のころは, 社会人になったらもっとプログラミングの知識を身につけ て, 株式投資でも同じようなことをしたいと思っていた.
            </p>

            <p>
              今回の Assingment は, それと同じことをしてポートフォリオを算出した. つまりは, 望みがかなって, うれしい.
            </p>
          </div>
        </div>

        <div id="outline-container-unnumbered-10" class="outline-3">
          <h3 id="unnumbered-10">
            今後について
          </h3>

          <div class="outline-text-3" id="text-unnumbered-10">
            <p>
              このアルゴリズム取引は, 実用的で楽しかった. ここで終わらせることなくて, 継続させたい. あわよくば, 億万長者になって, 明日は会社を休みたい.
            </p>

            <p>
              今回の内容は Part1 だが, Part2 は 2015 年に予定されている. Part2 では, 機械学習をアルゴリズム取引に導入するらしい.
            </p>

            <p>
              Ruby によるシステムトレード本というものを買った. ひとまずはこれを読んでみる.
            </p>

            <ul class="org-ul">
              <li>
                <a href="http://www.amazon.co.jp/Ruby%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89-%E7%8F%BE%E4%BB%A3%E3%81%AE%E9%8C%AC%E9%87%91%E8%A1%93%E5%B8%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%9D%82%E6%9C%AC%E3%82%BF%E3%82%AF%E3%83%9E/dp/4775991280/ref=pd_sim_b_1?ie=UTF8&#038;refRID=1RXNRYY640CBNJB4AVE8">Amazon.co.jp: Ruby ではじめるシステムトレード (現代の錬金術師シリーズ): 坂本タクマ: 本</a> <ul class="org-ul">
                  <li>
                    <a href="http://moneyzine.jp/article/corner/7">坂本タクマの絶対システムトレード原論:株/FX ・投資と経済がよくわかる MONEYzine</a>
                  </li>
                </ul>
              </li>
            </ul>
          </div>
        </div>
      </div>

08 Nov 2014, 06:26

コマンドラインから JUnit を使う方法

最近, Eclipse が嫌いになってしまったので, コマンドラインから JUnit を利用する方法を調べてみた.

Environment

  • ArchLinux
  • JUnit 4.11

事前準備

JUnit をダウンロード.

適当なフォルダに junit.jar を配置したあとに, CLASSPATH を通す.

[sourcecode language=”bash” title=””]
export JUNIT_HOME = /usr/share/java
export CLASSPATH = $JUNIT_HOME/junit.jar:$CLASSPATH
[/sourcecode]

コマンドラインから実行

以下のソースを動かしてみる. ここでは, Lab2Test.java というファイル名.

[sourcecode language=”java” title=””]
import static org.junit.Assert.*;
import org.junit.Test;

public class Lab2Test {
public static int num () {
return 10;
}

@Test
public void test () {
assertEquals (10, num ());
}
}
[/sourcecode]

コンパイルは普通に実施.

[sourcecode language=”bash” title=””]
javac Lab2Test.java
[/sourcecode]

コマンドラインから実行するには, java org.junit.runner.JUnitCore [クラス名] という書き方をして実行する.

[sourcecode language=”bash” title=””]
$ java org.junit.runner.JUnitCore Lab2Test
JUnit version 4.11
.
Time: 0.004

OK (1 test)
[/sourcecode]

クラスが増えてきたら, プログラムにクラス名を書く方法もある. 以下, 参照.

Ant を利用する

すこし大きなコードを扱うときはビルドツールとの連携が役に立つ. ここでは, ant を利用してみる.

build.xml を作成.

JUnit で必要な情報は, ここが詳しい.

[sourcecode language=”xml” title=””]














[/sourcecode]

エラー詳細を表示するためには, の 1 行が必要.

Eclipseで自動生成

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    もっといい方法を発見したので、追記.
  </p>

  <p>
    Eclipseでbuild.xmlは自動生成ができる.
  </p>

  <p>
    自動生成したいプロジェクトを選択して、
  </p>

  <ul class="org-ul">
    <li>
      Eclipseメニューから「ファイル」>「エクスポート」を選択.
    </li>
    <li>
      [エクスポート]ダイアログから, [一般] > [Antビルド・ファイル]を選択.
    </li>
  </ul>

  <p>
    以下のようなbuild.xmlが生成される. 手動で build.xmlを記述するのがバカらしくなった.
  </p>

  <p>
    [sourcecode language=&#8221;xml&#8221; title=&#8221;&#8221;]<br /> <?xml version="1.0" encoding="UTF-8" standalone="no"?><br /> <!&#8211; WARNING: Eclipse auto-generated file.<br /> Any modifications will be overwritten.<br /> To include a user specific buildfile here, simply create one in the same<br /> directory with the processing instruction <?eclipse.ant.import?><br /> as the first entry and export the buildfile again. &#8211;><project basedir="." default="build" name="tdd_by_example"><br /> <property environment="env"/><br /> <property name="ECLIPSE_HOME" value="../../../../usr/share/eclipse/"/><br /> <property name="junit.output.dir" value="junit"/><br /> <property name="debuglevel" value="source,lines,vars"/><br /> <property name="target" value="1.7"/><br /> <property name="source" value="1.7"/>
  </p>

  <p>
    <path id="Junit4.userclasspath"><br /> <pathelement location="../../../../usr/share/java/junit.jar"/><br /> </path><br /> <path id="tdd_by_example.classpath"><br /> <pathelement location="bin"/><br /> <path refid="Junit4.userclasspath"/><br /> </path><br /> <target name="init"><br /> <mkdir dir="bin"/><br /> <copy includeemptydirs="false" todir="bin"><br /> <fileset dir="src"><br /> <exclude name="**/*.ucls"/><br /> <exclude name="**/*.java"/><br /> </fileset><br /> </copy><br /> <copy includeemptydirs="false" todir="bin"><br /> <fileset dir="test"><br /> <exclude name="**/*.ucls"/><br /> <exclude name="**/*.java"/><br /> </fileset><br /> </copy><br /> </target><br /> <target name="clean"><br /> <delete dir="bin"/><br /> </target><br /> <target depends="clean" name="cleanall"/><br /> <target depends="build-subprojects,build-project" name="build"/><br /> <target name="build-subprojects"/><br /> <target depends="init" name="build-project"><br /> <echo message="${ant.project.name}: ${ant.file}"/><br /> <javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}"><br /> <src path="src"/><br /> <src path="test"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </javac><br /> </target><br /> <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/><br /> <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler"><br /> <copy todir="${ant.library.dir}"><br /> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/><br /> </copy><br /> <unzip dest="${ant.library.dir}"><br /> <patternset includes="jdtCompilerAdapter.jar"/><br /> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/><br /> </unzip><br /> </target><br /> <target description="compile project with Eclipse compiler" name="build-eclipse-compiler"><br /> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/><br /> <antcall target="build"/><br /> </target><br /> <target name="MoneyTest"><br /> <mkdir dir="${junit.output.dir}"/><br /> <junit fork="yes" printsummary="withOutAndErr"><br /> <formatter type="xml"/><br /> <test name="tdd_by_example.MoneyTest" todir="${junit.output.dir}"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </junit><br /> </target><br /> <target name="tdd_by_example"><br /> <mkdir dir="${junit.output.dir}"/><br /> <junit fork="yes" printsummary="withOutAndErr"><br /> <formatter type="xml"/><br /> <test name="tdd_by_example.MoneyTest" todir="${junit.output.dir}"/><br /> <classpath refid="tdd_by_example.classpath"/><br /> </junit><br /> </target><br /> <target name="junitreport"><br /> <junitreport todir="${junit.output.dir}"><br /> <fileset dir="${junit.output.dir}"><br /> <include name="TEST-*.xml"/><br /> </fileset><br /> <report format="frames" todir="${junit.output.dir}"/><br /> </junitreport><br /> </target><br /> </project><br /> [/sourcecode]
  </p>
</div>

Emacs で利用する

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    Emacs で ant を実行するときは, -emacs オプションをつける
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> $ ant -emacs test<br /> [/sourcecode]
  </p>

  <p>
    エラーした場合, エラー箇所にジャンプできる.
  </p>
</div>

01 Nov 2014, 02:12

ArchLinux でノート PC のバッテリを長持ちさせる方法

最近引越しをした. 引っ越す前の町には電源カフェがたくさんあったのだが, 引越し先では, 電源が利用できるカフェが少ない.

なので, ノート PC (ArchLinux) のバッテリを長持ちさせる方法を模索してみた.

バッテリ確認

残りバッテリーを調べる

apci コマンドで, バッテリ状態を見ることができる.

$ apci -b

cbatticon

システムトレイ用のバッテリアイコン.

エコの設定

明るさ調整

明るさを低くすることで, バッテリを長持ちできる.

xcalib

xcalib で, コマンドラインから明るさを調整できる.

# 設定クリア
$ xcalib -c 

# 明るさを 70
$ xcalib -co 70 -a

laptop-mode-tools

laptop-mode-tools は, ラップトップ PC の電源を, 使用状態に応じて適切に調整してくれるツール.

初期設定はここ. /etc/laptop-mode/laptop-mode.conf

起動方法

# サービス登録
$ sudo systemctl enable laptop-mode
# 再起動
$ sudo systemctl restart laptop-mode

# 手動起動
$ sudo laptop-mode auto
# ステータス確認
$ sudo laptop-mode status

追加インストール

  • apcid で laptop-mode-tools から 電源管理.
  • hdparm で Hard Disk の回転数をセーブ.

バッテリーが少なくなったらサスペンド

以下を記述することで, バッテリが少なくなったときに, 自動的にサスペンド状態にする.

/etc/udev/rules.d/99-lowbat.rules

# Suspend the system when battery level drops to 2% or lower
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="2", RUN+="/usr/bin/systemctl suspend"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="1", RUN+="/usr/bin/systemctl suspend"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="0", RUN+="/usr/bin/systemctl suspend"

30 Oct 2014, 03:38

iPhone を CIFS サーバにするアプリ CIFS NQ

仕事で CIFS をつかっている.

たとえば, カフェでダラダラしているときに, 急に CIFS のパケットが気になってしょうがなくなったとしよう.

NotePC には Windows がはいっている. しかし, Windows のクライアントがあっても接続する CIFS サーバがないと, CIFS のパケットを見ることができない!

VirtualBox に CentOS を入れて, その上に Samba サービスを立ち上げるとい うことを以前やった.

しかし, 今は仮想マシンを立ち上げる容量がないという不幸な状況.

そんなもどかしさに悶え苦しんでいるひとのために朗報!

iPhone を CIFS サーバにすればよい

iPhone を CIFS サーバにするアプリ

GoodReader

<div class="outline-text-3" id="text-1-1">
  <p>
    仕事効率化の定番アプリ, GoodReader に エクスプローラからアクセスする ことができる.以下, リンク参照.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://samulife.com/iPhone/goodreader-webdav">iPhone GoodReader を PC のネットワークドライブに割り当てる方法!! ドラッグ&ドロップでファイル転送できる</a>
    </li>
  </ul>

  <p>
    しかし, この手順で Windows のエクスプローラからアクセスすると, 都合が わるいことに気づく.それは, GoodReader のサポートしている SMB のバージョ ンが 1 だったこと.
  </p>

  <p>
    自分は, SMB2 のパケットが見たかった&#x2026;.
  </p>
</div>

CIFS NQ

<div class="outline-text-3" id="text-1-2">
  <p>
    ということで, 次に探したのがこれ. CIFS NQ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://itunes.apple.com/jp/app/id806015001">iTunes の App Store で配信中の iPhone, iPod touch, iPad 用 CIFS NQ</a>
    </li>
  </ul>

  <p>
    開発した会社は, CIFS/SMB のリーディングカンパニーとか.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.visualitynq.com/?lang=jp">Visuality Systems &#8211; ホーム</a>
    </li>
  </ul>

  <p>
    無料なので, さっそくインストールしてみた. 設定画面からサーバステータスを ON に設定することで, CIFS サーバ起動.
  </p>

  <p>
    エクスプローラの URL 欄に IP を打ち込んで乗り込む. WireShark でパケッ トキャプチャをすると, SMB2 だった.
  </p>

  <p>
    おもわずニヤリ.
  </p>

  <p>
    これで, カフェで SMB2 のパケットをみることができるよになった.
  </p>
</div>

さいごに

誰トクな記事なんだろう….

29 Oct 2014, 13:29

数学での関数とプログラミングでの関数

関数についての違和感

大学では, 応用数学を専攻していた.

大学でならった関数の定義は, ある集合から別の集合への写像だった.

就職して, C 言語でプログラムを書くようになってからずっと, どうも関数にたいして違和感を抱いてきた.

なんでこれが関数なんだ??

int main (void) {
  printf ("Hello, World!");
  return 0;
}

以下のページに同じようなことがかかれていたので引用.

x = x + 1

古き良き小学校の時代, この行には困惑させられたものだった. 魔術的な x が, 加算されたのに等しいままでいる事に. どういうわけか, プログラミングを始めると, それに構わなくなる. 「やれやれ, それは重大な事柄じゃないし, プログラミングとは現実のビジネス行為なんだから, 数学的な純粋さについてあら探しなんて必要無い (その議論なら, 大学にいる狂った髭面野郎どもにさせておけばいい) 」と思っていた. けれども, ただ知らなかっただけで, 我々が間違っていて高い代償を支払っていたのは 明らかである.

Haskell における関数の定義

最近, プログラミング Haskell という本を読んだ.

その中での関数の定義を読み, 自分が思ってきた関数のイメージと一致した.

関数は, ある型の引数を他の型の引数の結果に変換する. 型とは, 互いに関連する値の集合.

これだ! と思った.

これが大学でならった関数の定義だ. 関数型言語というのは数学に近いときいていたが, それを感じた瞬間だった.

うれしかったので, 今回の記事にしてみた. もっと, 関数型言語について知りたいと思った.

C 言語と Java における関数の定義

C 言語 (手続き型) と Java (オブジェクト指向型) における関数の定義について も, Wikipedia で調べてみたので, 書いておく.

関数型における関数とは, 意味するところは違う. これが, 違和感の正体だった.

C 言語 (手続き型パラダイム)

戻り値つきのサブルーチン.

プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたもの.

Java (オブジェクト指向パラダイム)

あるクラスないしオブジェクトに所属するサブルーチン.

各オブジェクトが持っている自身に対する操作. オブジェクトは「データ」と「手続き」から成っているが, その「手続き」の部分に当たる.

22 Oct 2014, 14:52

Haskell を快適に利用するための Emacs 環境の構築

edX で Haskell の講座をとり始めました.

内容はさておき, まずは Emacs の環境作りから始めました.

環境づくりに夢中になって内容がおろそかになるという, いつもの悪いパターン.

haskell-mode

Haskell のマイナーモード.

(autoload 'haskell-mode "haskell-mode" nil t)
(autoload 'haskell-cabal "haskell-cabal" nil t)

(add-to-list 'auto-mode-alist '("\\.hs$" . haskell-mode))
(add-to-list 'auto-mode-alist '("\\.lhs$" . literate-haskell-mode))
(add-to-list 'auto-mode-alist '("\\.cabal\\'" . haskell-cabal-mode))

モードの設定.以下のリンクが詳しい.

 ;; indent の有効.
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'font-lock-mode)
(add-hook 'haskell-mode-hook 'imenu-add-menubar-index)

Haskell Script の編集モード

(add-to-list 'interpreter-mode-alist '("runghc" . haskell-mode))
(add-to-list 'interpreter-mode-alist '("runhaskell" . haskell-mode))

Haskell でかかれたスクリプトを haskell-mode で編集する.

#!/usr/bin/env runhaskell

Ghci との連携

M-x run-haskell で ghci が起動.

(setq haskell-program-name "/usr/bin/ghci")

C-c, C-l でも起動.

(add-hook 'haskell-mode-hook 'inf-haskell-mode) ;; enable

ghci の起動とファイルの読み込みを一緒に行う設定.

(defadvice inferior-haskell-load-file (after change-focus-after-load)
  "Change focus to GHCi window after C-c C-l command"
  (other-window 1))
(ad-activate 'inferior-haskell-load-file)

- inferior-haskell-mode で設定すると便利なこと - プログラムとかのの blog

gcd-mod

Haskell 開発を助ける機能がそろったツール.

Install

% cabal update
% cabal install ghc-mod

Settings

(autoload 'ghc-init "ghc" nil t)
(autoload 'ghc-debug "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init)))

Emacs での使い方は以下のページに書いてある.

エラーチェック

flymake

構文チェック.

(add-hook 'haskell-mode-hook (lambda () (flymake-mode)))

hlint

コードチェック. cabal install hlint でインストールする. C-c C-c でカーソル部のチェック.

自動補完

こんなの見つけた. ac-haskell-process.

(require 'ac-haskell-process) ; if not installed via package.el
(add-hook 'interactive-haskell-mode-hook 'ac-haskell-process-setup)
(add-hook 'haskell-interactive-mode-hook 'ac-haskell-process-setup)
(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'haskell-interactive-mode))

Links

21 Oct 2014, 14:46

セマフォを利用して 2 つのスレッドに交互に処理をさせる方法 (Java)

Java の並列処理用のライブラリについて調べたまとめ. 主に, 先日受けた coursera の POSA の復習だったりします.

Semaphore

並列プログラミング環境での複数のプロセスが共有する資源に アクセスするのを制御する際の単純だが便利な抽象化を提供する変数または抽象データ型

2 種類に分けられる.

Counting Semaphores

カウンティングセマフォ. 任意個の資源を扱うセマフォ

Binary Semaphores

バイナリセマフォ. 値が 0 と 1 に制限されている (ロック/ アンロック, 使用可能/ 使用不可の意味がある) セマフォ.

ミューテックスともいう.

Java

ConditionObject

wait/notify によるスレッド間の通知では, 一つのスレッドで一ヶ所でしか wait できない.たとえば, 条件 A と条件 B の両方がそろうまでまつなど.

ConditionObject を利用すると, 複数箇所で wait することができる.

Condition は, Object 監視メソッド (wait, notify, および notifyAll) を別個のオブジェクトに分解し, それらに任意の Lock 実装の使用を組み合わせて, オブジェクトごとに複数の待機セットを保持する効果を付与します.

Java

CountdonwLatch

他のスレッドをある地点でまち合わせるための機構.

競馬のスタートバーのようなイメージ.

または, 旅行のツアーガイド. 集合時間が決められていてるので, それまでに旅行客は集合場所に集合する. 全員が集合したら, 次の移動場所へ移動する.

Java

PingPong

2 つのスレッドがセマフォを利用しつつ, 交互に処理をするプログラム.

セマフォ処理

import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.Condition;

public class SimpleSemaphore {
    private Lock lock;
    private Condition notEmpty;
    private volatile int count;

    public SimpleSemaphore (int permits, boolean fair) {
        count = permits;
        lock = new ReentrantLock (fair);
        notEmpty = lock.newCondition ();
    }

    public void acquire () throws InterruptedException {
        lock.lockInterruptibly ();
        try { 
            while (count == 0) 
                notEmpty.await ();
            count--;
        }finally{ lock.unlock (); }
    }

    public void acquireUninterruptibly () {
        lock.lock ();
        try { 
            while (count == 0) 
                notEmpty.awaitUninterruptibly ();
            count--;
        }finally{ lock.unlock (); }
    }

  public void release () {
        lock.lock ();
        try{ 
            count++;
            notEmpty.signal ();
        }
        finally{lock.unlock ();}
    }

    public int availablePermits () {
        return count;
    }
}

メイン処理

import java.util.concurrent.CountDownLatch;

public class PingPongRight {

    // イテレーション数
    public final static int mMaxIterations = 10;

    // 2 つのスレッドの待ちあわせ用
    public static CountDownLatch mLatch;

    public static class PlayPingPongThread extends Thread {

        private int mMaxLoopIterations = 0;
        String mStringToPrint;

        SimpleSemaphore mSemaphoreOne;
        SimpleSemaphore mSemaphoreTwo;

        public PlayPingPongThread (String stringToPrint,
                                                             SimpleSemaphore semaphoreOne, SimpleSemaphore semaphoreTwo,
                                                             int maxIterations) {
            mStringToPrint = stringToPrint;
            mSemaphoreOne = semaphoreOne;
            mSemaphoreTwo = semaphoreTwo;
            mMaxLoopIterations = maxIterations;
        }

        public void run () {

            for (int loopsDone = 1; loopsDone <= mMaxLoopIterations; ++loopsDone) {
                try {
                    // 処理の権利を取得して, 処理を実施
                    acquire ();
                } catch (InterruptedException e) {
                    e.printStackTrace ();
                }
                System.out.println (mStringToPrint + "(" + loopsDone + ")");
                // 次の処理の権利を解放
                release ();
            }

            // 自スレッドの処理がすべて終わったらカウントダウン
            mLatch.countDown ();
        }

        private void acquire () throws InterruptedException {
            mSemaphoreOne.acquire ();
        }

        private void release () {
            mSemaphoreTwo.release ();
        }
    }

    public static void process (int maxIterations) throws InterruptedException {
        // 待ち合わせ
        mLatch = new CountDownLatch (2);

        // バイナリセマフォ
        // セマフォを獲得できたら 次のステップに進める
        SimpleSemaphore pingSema = new SimpleSemaphore (1, true);
        SimpleSemaphore pongSema = new SimpleSemaphore (1, true);

        // pong が動作しないようにセマフォ獲得
        // これで, 確実に ping から処理をすすめることができる.
        pongSema.acquire ();

        // 二つのスレッド生成
        PlayPingPongThread ping = new PlayPingPongThread ("Ping! ",
                                                                                                            pingSema,
                                                                                                            pongSema,
                                                                                                            maxIterations);
        PlayPingPongThread pong = new PlayPingPongThread (" Pong!",
                                                                                                            pongSema,
                                                                                                            pingSema,
                                                                                                            maxIterations);

        System.out.println ("Go!");

        // スレッドスタート
        pong.start ();
        ping.start ();

        // 二つのスレッドの待ち合わせ
        mLatch.await ();

        System.out.println ("Done!");
    }

    public static void main (String[] args) throws InterruptedException {
        process (mMaxIterations);
    }
}

20 Oct 2014, 15:45

Java で Producer-Consumer Pattern を実装してみた

二つのスレッドで同期キューを用いて情報をやりとりするときに利用する アーキテクチャ・パターンに, Producer-Consumer Pattern というものがある.

Publisher-Subscriber パターン, 生産者-消費者パターンともいう.

これを Java で実装する場合は, BlockingQueue インターフェースを利用できる.

syncronised/wait/notify を利用してもできるが, BlockingQueue を利用したほうが楽.

以下, coursera の POSA での Assignment を改造してみて, 簡易版の Producer-consumer Pattern を書いてみた.

source

[sourcecode language=”java” title=”” ]
import java.util.concurrent.*;

public class SynchronizedQueue {
// Keep track of the number of times the producer test iterates.
static volatile int mProducerCounter = 0;

// Keep track of the number of times the consumer test iterates.
static volatile int mConsumerCounter = 0;

// Maximum timeout.
static final int TIMEOUT_SECONDS = 5;

// Error value for a timeout.
static final int TIMEOUT_OCCURRED = -1;

// Error value for a failure.
static final int FAILURE_OCCURRED = -2;

public static class QueueAdapter {
private BlockingQueue mQueue;

public QueueAdapter (BlockingQueue queue) {
mQueue = queue;
}

/**
* Insert msg at the tail of the queue.
*/
public void put (E msg) throws InterruptedException, TimeoutException {
// Keep track of how many times we’re called.
mProducerCounter++;
boolean timeoutValue = mQueue.offer (msg,
TIMEOUT_SECONDS,
TimeUnit.SECONDS);
if (timeoutValue == false)
throw new TimeoutException ();
}

/**
* Remove msg from the head of the queue.
*/
public E take () throws InterruptedException, TimeoutException {
// Keep track of how many times we’re called.
mConsumerCounter++;
E rValue = mQueue.poll (TIMEOUT_SECONDS,
TimeUnit.SECONDS);

if (rValue == null)
throw new TimeoutException ();

return rValue;
}
}

private static QueueAdapter mQueue = null;

static Runnable producerRunnable = new Runnable () {
public void run () {
for (int i = 0; i < mMaxIterations; i++) try { mQueue.put (i); if (Thread.interrupted ()) throw new InterruptedException (); } catch (InterruptedException e) { System.out.println ("Thread properly interrupted by " + e.toString () + " in producerRunnable"); // This isn't an error - it just means that // we've been interrupted by the main Thread. return; } catch (TimeoutException e) { System.out.println ("Exception " + e.toString () + " occurred in producerRunnable"); // Indicate a timeout. mProducerCounter = TIMEOUT_OCCURRED; return; } catch (Exception e) { System.out.println ("Exception " + e.toString () + " occurred in producerRunnable"); // Indicate a failure. mProducerCounter = FAILURE_OCCURRED; return; } } }; static Runnable consumerRunnable = new Runnable () { public void run () { for (int i = 0; i < mMaxIterations; i++) try { if (Thread.interrupted ()) { throw new InterruptedException (); } Integer result = (Integer) mQueue.take (); System.out.println ("iteration = " + result); } catch (InterruptedException e) { System.out.println ("Thread properly interrupted by " + e.toString () + " in consumerRunnable"); // This isn't an error - it just means that // we've been interrupted by the main Thread. return; } catch (TimeoutException e) { System.out.println ("Exception " + e.toString () + " occurred in consumerRunnable"); // Indicate a timeout. mConsumerCounter = TIMEOUT_OCCURRED; return; } catch (Exception e) { System.out.println ("Exception " + e.toString () + " occurred in consumerRunnable"); // Indicate a failure. mConsumerCounter = FAILURE_OCCURRED; return; } } }; // Number of iterations to test public static int mMaxIterations = 1000000; public static int mMaxQueueSize = (mMaxIterations / 10); public static void main (String[] args) { try { mQueue = new QueueAdapter(new ArrayBlockingQueue(mMaxQueueSize));
// mQueue = new QueueAdapter(new LinkedBlockingQueue ());

// create threads
Thread consumer = new Thread (consumerRunnable);
Thread producer = new Thread (producerRunnable);

// start the threads.
consumer.start ();
producer.start ();

// Give the Threads a chance to run before interrupting them.
Thread.sleep (100);

// interrupt the threads.
consumer.interrupt ();
producer.interrupt ();

// wait for the threads to exit.
consumer.join ();
producer.join ();

} catch (Exception e) {
}
}
}
[/sourcecode]