24 May 2014, 06:18

Sikuli, Selenium, WSH, 3つの自動化ツールでGoogle検索自動化に挑め!

はじめに

前回、Sikuliの使い方を調べてみました。

今回は、Sikuliと別のツールを組み合わせてみます。前回記事の続編です。

やること

以下の手順を自動化します。

  1. firefoxを立ち上げる
  2. 検索窓にSikuliと入力する
  3. 検索ボタンをおす

以下のツールを利用します。

  • Sikuli … 画像認識による自動化ツール
  • Selenium … HTML解析による自動化ツール
  • WSH … キー操作の自動化ツール

なんだか、ヨットに対して戦車と軍艦と戦闘機で総攻撃をかけるような感じになってきた。

使う手段

JRubyです。以下を利用。

  • win32ole
  • sikulixapi
  • selenium-webdriver

win32oleはデフォルトで入っている。sikuliは前回記事を参照。

selenium-webdriverは、jgem install selenium-webdriverで問題なくインストール。

結果

自動化がキマるとけっこうきもちいい。

24 May 2014, 05:11

画像認識でアプリケーション操作の自動化を実現!Sikuliがあまりに革命的で興奮した

はじめに

アプリケーションの自動操作をスクリプトで実現するために、Sikuliを調べてみました。

Sikuliとは

Sikuliとは、

  • OpenCVをつかった画像認識
  • OCRをつかった文字認識

で、アプリケーションの自動操作を実現するためのツール、スクリプト言語。

Javaで実装されているため、JVM上で動作するスクリプト言語から利用できる。

スクリプト編集のためのIDEは、 画像とプログラム言語を合わせて表示できるという、革命的なソフトウェア。 久々に、スゴイ!とおもったソフトウェアだ。

インストール

sikuli-setup.jarをダウンロードして、インストーラをダブルクリックで起動するだけ。

すると、いろいろとインストールオブションがきかれる。JRubyを選択。

slkulix.jarをダブルクリックで起動。IDEが立ち上がる。

インストールは、以下のドキュメントが詳しい。

WinUtil.dllが見つからないエラーではまる

<div class="outline-text-3" id="text-3-1">
  <p>
    runsikulix.cmdで起動するとエラーした。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">[error] ResourceLoader: loadLib: Fatal Error 110: loading: WinUtil.dll

[error] ResourceLoader: loadLib: Since native library was found, it might be a problem with needed dependent libraries C:\sikuliX\libs\WinUtil.dll: 指定されたプロシージャが見つかりません。ﴀ＀ [error] ResourceLoader: loadLib: Check, wether a valid Sikuli libs folder is in system path at runtime!

  <p>
    よくわからないのだが、環境変数のパスを通して(C:)、JDK 7 を最新版にしたらなおった。
  </p></p>
</div></p>

Hello Sikuli

以下のようなコード。

App.open("notepad.exe")
  
find("1400849474303.png")
  
type("Hello Sikuli!!")

<p>
  <a href="https://picasaweb.google.com/lh/photo/lRDJ9IcUEEb0SOkEeZUtAjyD6hjDXGH6XyE6iLrzolo?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-MTSQnqO-6L8/U4AlKQuYAII/AAAAAAAABEI/aW-X9CjdRYo/s800/HelloSikuli.png" height="137" width="307" /></a>
</p>

<p>
  実行結果はこんな感じ。驚きの結果である。
</p>

<p>
  <iframe width="420" height="315" src="//www.youtube.com/embed/SoN_zfuG1E8?rel=0" frameborder="0" allowfullscreen></iframe> </div>
</p>

実行ファイルから実行する

<div class="outline-text-2" id="text-5">
  <p>
    もちろん、IDE を経由しないでコマンドラインから実行できる。
  </p>

  <p>
    ツールバーのファイルから実行ファイルとしてエクスポートを選択。 .skl拡張子のバイナリファイルができる。(ここではtest.skl) なかみは、たんなるzipだったりする。
  </p>

  <p>
    runsikulix.cmdの引数として、.sklを渡す(注意: 1.1からの仕様)
  </p>

  <div class="org-src-container">
    <pre class="src src-language">E:\test&gt;C:\sikuliX\runsikulix.cmd -r test.skl

  <p>
    これで、コマンドラインから実行できた。
  </p></p>
</div></p>

Rubyから実行する

<div class="outline-text-2" id="text-6">
  <p>
    Sikuliの素晴らしいところは、JVM上で動作スクリプト言語を利用できる。
  </p>

  <p>
    JPython, JRubyとか。つまりは、Rubyが使える!
  </p></p>
</div>

<div id="outline-container-sec-6-1" class="outline-3">
  <h3 id="sec-6-1">
    IDEで Rubyをつかう
  </h3>

  <div class="outline-text-3" id="text-6-1">
    <p>
      保存フォルダをのぞくと、たんなる.rbファイルがある。 IDEから実行すると、Lib配下にあるsikkulix.rbがrequireされるようだ。 ようするに、rubyの文法をつかってかけるということ。
    </p>

    <p>
      たとえば、さっきのHelloSikuliをメソッド化してみる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">def hello

App.open(“notepad.exe”)

find(“1400849474303.png”)

type(“Hello Sikuli!!”) end

hello()

    <p>
      すごい。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-2" class="outline-3">
  <h3 id="sec-6-2">
    Ruby scriptとしてつかう
  </h3>

  <div class="outline-text-3" id="text-6-2">
    <p>
      Sikuli IDEでは、実行時にsikkulix.rbを読み込んでいろいろやっているようなので、 このファイルに書いてあることを真似すると、純粋なrubyとして実行できる。
    </p>

    <blockquote>
      <p>
        But be aware: Since the interpreters used are based on Java, the modules available for Python or Ruby might not be available in the Jython or JRuby environment. So before trying to use any non-standard modules or extension packages, you have to check, wether they are supported in this SikuliX environment.
      </p>
    </blockquote>

    <p>
      Java APIを JRubyを経由して呼び出すため、 JRubyのちからを借りる。以下のガイダンスに従う。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/faq/030-java-dev.html">How to use SikuliX API in your JAVA programs — SikuliX 1.1+ documentation</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-3" class="outline-3">
  <h3 id="sec-6-3">
    JRubyをインストール
  </h3>

  <div class="outline-text-3" id="text-6-3">
    <p>
      以下から、インストール。インストールしたら、binフォルダにパスを通す。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://jruby.org/">Home — JRuby.org</a>
      </li>
    </ul>

    <p>
      実行は、jrubyコマンドで実行。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-4" class="outline-3">
  <h3 id="sec-6-4">
    sikulixapi.jarをクラスパスに追加
  </h3>

  <div class="outline-text-3" id="text-6-4">
    <p>
      sikulixapi.jarのなかに、sikuliを制御する処理が入っているので、ここにクラスパスを通す。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">require 'java'

$CLASSPATH << ‘C:\sikuliX\‘ require ‘sikulixapi.jar’

<div id="outline-container-sec-6-5" class="outline-3">
  <h3 id="sec-6-5">
    必要なSikuliクラスをimport
  </h3>

  <div class="outline-text-3" id="text-6-5">
    <p>
      つづいて、必要なクラスをインポートする。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">java_import "org.sikuli.script.Screen"

    <p>
      あとは、一生懸命書くだけだ。なんどでも思う、これはスゴイ。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-6" class="outline-3">
  <h3 id="sec-6-6">
    結果
  </h3>

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

<div id="outline-container-sec-6-7" class="outline-3">
  <h3 id="sec-6-7">
    Environment
  </h3>

  <div class="outline-text-3" id="text-6-7">
    <ul class="org-ul">
      <li>
        windows 7 64bit
      </li>
      <li>
        JDK 7 64bit
      </li>
      <li>
        JRuby 1.7.12
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-8" class="outline-3">
  <h3 id="sec-6-8">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-6-8">
    <p>
      Official
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.sikulix.com/">SikuliX powered by RaiMan &#8211; Home</a>
      </li>
    </ul>

    <p>
      Java Doc
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://dl.dropboxusercontent.com/u/42895525/docs/index.html">https://dl.dropboxusercontent.com/u/42895525/docs/index.html</a>
      </li>
    </ul>

    <p>
      Document
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/index.html">Sikuli / SikuliX Documentation for version 1.1+ (01/2014 and later) — SikuliX 1.1+ documentation</a>
      </li>
    </ul>

    <p>
      よくまとまっている日本語のまとめ
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://safx-dev.blogspot.jp/2013/02/sikuliui.html">Safx: SikuliスクリプトでのUI操作自動化を試してみる</a>
      </li>
      <li>
        <a href="http://hontech.xii.jp/blog/archives/28">sikuliの簡単な使い方 | hontech</a>
      </li>
      <li>
        <a href="http://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:sikuli">Sikuli KamonoWiki</a>
      </li>
    </ul>

    <p>
      Ruby関連
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://blackrat.org/ruby/getting-sikuli-script-working-with-jruby-on-the-mac/">Getting Sikuli Script working with Ruby(JRuby) on the Mac | blackrat.org</a>
      </li>
      <li>
        <a href="https://answers.launchpad.net/sikuli/+question/221083">Question #221083 : Questions : Sikuli</a>
      </li>
      <li>
        <a href="http://www.software-testing.com.au/blog/2010/08/16/automating-flash-ajax-popups-and-more-using-ruby-watir-and-sikuli/">Automating Flash, AJAX, Popups and more using Ruby, Watir and Sikuli | Illiteration –</a>
      </li>
    </ul>
  </div></p>
</div></p>

18 May 2014, 10:47

Eclim で Emacs と Eclipse のいいとこどり!Emacs で Java 開発環境を構築した (副題 打倒 Eclipse!)

[toc]

はじめに

よし, 認めよう. 私は, Eclipse フリークだった.

Eclipse ですべての開発環境の統合を夢見て, あらゆるプラグインを試した.

全 C/C++ プログラマに捧ぐ!Eclipse CDT を使う時のオススメ機能/ プラグインまとめ | Futurismo

歳をとるにつれて, 若かりし誤った考えを改めた. 真の統合開発環境は Emacs なのでは?

いや, うすうすは気づいている. Java 開発では Eclipse が最強なことくらい.

しかし, それを分かっていてあえて Emacs を使うことは美しい行為ではないか?

それは, 死を覚悟して決戦に挑む武士のように.

この記事は, そんな不安と挑戦の記録です.

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Linux Mint 16
    </li>
    <li>
      Eclipe 4.3 Kepler
    </li>
    <li>
      Emacs 24
    </li>
  </ul>
</div>

Java 開発環境について

まずは, Emacs における Java 開発環境を調べた.

以下の 3 つが選択肢としてある. 詳細な解説はリンク先に譲る.

JDEE

<div class="outline-text-3" id="text-2-1">
  CEDET ベースのツール. あまりメンテナンスされていないようだ.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://mikio.github.io/article/2012/12/23_emacsjdeejava.html">Emacs 中毒者に贈る JDEE による Java 開発環境の構築|ざる魂</a>
    </li>
    <li>
      <a href="http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki">http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki</a>
    </li>
    <li>
      <a href="http://www.emacswiki.org/emacs/JavaDevelopmentEnvironment">EmacsWiki: Java Development Environment</a>
    </li>
  </ul>
</div>

malabar-mode

<div class="outline-text-3" id="text-2-2">
  JDEE にかわってでてきたモダンな java のメジャーモード.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/nekop/20101215/1292380225">Emacs で Java を書く &#8211; nekop の日記</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/lranran123/20130404/1365088550">Emacs で Java の環境構築, CEDET と yasnippet と malabar-mode &#8211; 趣味プログラマがまれになんかしたことの記録</a>
    </li>
  </ul>
</div>

Eclim

<div class="outline-text-3" id="text-2-3">
  Emacs から Eclipse をつかう. その発想があったか!</p> 

  <ul class="org-ul">
    <li>
      <a href="http://sleepboy-zzz.blogspot.jp/2014/02/emacsjava_22.html">memo: Emacs で Java の設定</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/clairvy/20100630/1277854580">Emacs-Eclim を試す &#8211; クラなんとか or くらなんとか or cla なんとかの日記</a>
    </li>
  </ul>
</div>

選定する

<div class="outline-text-3" id="text-2-4">
  <p>
    選ぶに当たって重視する機能は,
  </p>

  <ul class="org-ul">
    <li>
      JUnit 連携機能
    </li>
    <li>
      リファクタリング
    </li>
    <li>
      コード補完・タグジャンプ
    </li>
    <li>
      Android 開発連携
    </li>
  </ul>

  <p>
    malabar-mode に挑戦したが, maven がよくわからずに挫折.
  </p>

  <p>
    なので, eclim を試す.
  </p>
</div>

開発環境を整える

eclim

<div class="outline-text-3" id="text-3-1">
  インストーラがあるので, 指示にしたがって入れればよい.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/install.html">Download / Install &#8211; eclim (eclipse + vim)</a>
    </li>
  </ul>
</div>

eclim-emacs

<div class="outline-text-3" id="text-3-2">
  emacs から利用するためには, eclim-emacs を入れる.</p> 

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

使い方

設定ファイルに以下を追記.

[sourcecode language=”emacs-lisp” title=””]
(require ‘eclim)
(require ‘eclimd)

;; java-mode で有効
(add-hook ‘java-mode-hook ‘eclim-mode)
[/sourcecode]

M-x start-eclimd で eclipse を eclim デーモンとして起動.

M-x eclim-project-mode で workspace にあるプロジェクト一覧が表示される.

適当にソースを選んでごにょごにょ. 詳しくは, README 参照. まだ, あんまりいじくりまわしていない.

M-x stop-eclimd で eclipse を eclim デーモンを終了.

このページがとても詳しいのでリンクをはっておきます.

[[http://www.skybert.net/emacs/java/][.:: skybert.net :: emacs
java ::.]]

auto-complete/company-mode で自動補完

<div class="outline-text-3" id="text-4-1">
  <p>
    auto-complete/company-mode で eclipse の補完機能と連携できる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)<br /> [/sourcecode]
  </p>
</div>

タグジャンプ

<div class="outline-text-3" id="text-4-2">
  <p>
    &#8216;eclim-java-find-references で定義元にジャンプできる. しかし, gtags をしてもいい.
  </p>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (define-key eclim-mode-map (kbd "C-c C-e l") &#8216;eclim-java-find-references)<br /> [/sourcecode]
  </p>
</div>

Program 起動

<div class="outline-text-3" id="text-4-3">
  <p>
    org.eclim.java.run.mainclass にメインクラスを設定.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/vim/java/java.html">Java / Jps &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://eclim.org/vim/settings.html">Settings &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://stackoverflow.com/questions/7394811/eclim-what-to-set-org-eclim-java-run-mainclass-to">vim &#8211; Eclim &#8211; What to set org.eclim.java.run.mainclass to? &#8211; Stack Overflow</a>
    </li>
  </ul>

  <p>
    設定方法は, .settings/org.eclim.prefs というファイルを作成して,以下を書き込む
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> org.eclim.java.run.mainclass=<Class Name><br /> [/sourcecode]
  </p>

  <p>
    しかし, これだけでは動作しなかった. main メソッドの場所で eclim-run-class を実行すると, ようやく eclim 経由で java program が起動.
  </p>

  <p>
    起動は, eclim の機能を利用するのではなくて, 別のビルドツールを利用したほうがいいな.
  </p>
</div>

JUnit を動かす

<div class="outline-text-3" id="text-4-4">
  <p>
    これで JUnit が動いた. これはいいな.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk">https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (defun eclim-run-test ()<br /> (interactive)<br /> (if (not (string= major-mode "java-mode"))<br /> (message "Sorry cannot run current buffer."))<br /> (compile (concat eclim-executable " -command java_junit -p " eclim&#8211;project-name " -t " (eclim-package-and-class))))<br /> [/sourcecode]
  </p>
</div>

最後に

使いこなすには, 時間がかかりそうな.

今は, まだ eclipse のほうがいいと思っている. いや, 負けるな Emacs!

.emacs の設定

<div class="outline-text-3" id="text-5-1">
  <p>
    最後に設定を張り付けておく.
  </p>

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

  <p>
    ;; java-mode で有効<br /> (add-hook &#8216;java-mode-hook &#8216;eclim-mode)
  </p>

  <p>
    ;; eclim daemon<br /> (require &#8216;eclimd)
  </p>

  <p>
    ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)
  </p>

  <p>
    ;; Displaying compilation error messages in the echo area<br /> (setq help-at-pt-display-when-idle t)<br /> (setq help-at-pt-timer-delay 0.1)<br /> (help-at-pt-set-timer)
  </p>

  <p>
    ;; add keybinds<br /> (define-key eclim-mode-map (kbd "C-c C-e p q") &#8216;eclim-problems)<br /> (define-key eclim-mode-map (kbd "C-c C-e p o") &#8216;eclim-problems-open)<br /> (define-key eclim-mode-map (kbd "C-c C-e p n") &#8216;eclim-problems-next)<br /> (define-key eclim-mode-map (kbd "C-c C-e p p") &#8216;eclim-problems-previous)<br /> ;; Re-map `eclim-project-create&#8217; to C so that I can use c for<br /> ;; `eclim-problems-correct&#8217;<br /> (define-key eclim-mode-map (kbd "C-c C-e p C") &#8216;eclim-project-create)<br /> (define-key eclim-mode-map (kbd "C-c C-e p c") &#8216;eclim-problems-correct)<br /> (define-key eclim-mode-map (kbd "M-.") &#8216;eclim-java-find-declaration)<br /> ;; find-references = list-callers.<br /> (define-key eclim-mode-map (kbd "C-c C-e l") &#8216;eclim-java-find-references)
  </p>

  <p>
    ;; skip warning error<br /> (setq compilation-skip-threshold 2)
  </p>

  <p>
    (setq eclim-eclipse-dirs "/opt/eclipse/kepler")<br /> (setq eclim-executable "/opt/eclipse/kepler/eclim")<br /> (setq eclimd-executable "/opt/eclipse/kepler/eclimd")<br /> (setq eclimd-default-workspace "/mnt/win/src/coursera")<br /> [/sourcecode]
  </p>
</div>

15 May 2014, 14:47

Web操作手順書を自動生成!Emacs org-babelで実現するRun Book Automation(RBA)

はじめに

RunBookAutomationや Code As Infrastructureという単語をよく耳にする今日この頃。 仕事でなにかと手順書を作成することがだれにでもあるはず。

今日は、文芸的プログラミングと、RunBookAutomationの概念を合体させて、 Web操作の作業手順書を自動作成してみます。

これは、以下の記事の続編です。つまり、selenium-webdriverを Web操作自動化のためのエンジンとして利用します。

以下の過去記事と関係があります。

[toc]

出力のためのツール org-babel

org-babelを利用する。

org-babelとは、文芸的プログラミングを実現するためのemacsの機能。

Babel: active code in Org-mode

Ruby Codeに出力

org-babelを利用して出力するには、rubyのcodeを以下のように囲む。

  #+begin_src ruby :tangle ./hello_rba.rb :exports none

<ul class="org-ul">
  <li>
    begin_src ruby &#x2026; rubyのコード
  </li>
  <li>
    :tangle ./hello_rba.rb &#x2026; rubyの出力ファイル指定
  </li>
  <li>
    exports none &#x2026; org-modeのexport機能ではcodeをexportしない。
  </li>
</ul>

<p>
  Rubyコードに書き出すには、以下を実施。
</p>

<div class="org-src-container">
  <pre class="src src-language">M-x org-babel-tangle

<p>
  これで、動作する手順書(RBA)が自動生成される。
</p></p>

HTMLに出力

org-export-dispatchから htmlを選択することで、htmlに変換可能。

このとき:exports noneのオブションのおかげで、rubyのコードは出力されない。

github風にオシャレな出力

<div class="outline-text-3" id="text-4-1">
  <p>
    pandocを利用して md から htmlに変換することで、cssがつかえる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://shuzo-kino.hateblo.jp/entry/2014/02/16/220708">Pandocでドキュメント変換で楽する &#8211; Bye Bye Moore</a>
    </li>
  </ul>

  <p>
    このデザインがとても気に入った!Special Thanks
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">wget https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css

pandoc hello_rba.md -c github.css -s -o hello_rba.html

PDFに出力

pandocを利用してpdfに変換したかったけど、深刻な容量不足のため断念。

代替手段として、firefoxのプラグインでHTMLをpdfに変換した。

スクリーンショットを撮影

selenium-webdriverには、スクリーンショット撮影機能がある。

これを手順ごとに実施して、画像ファイルもorg-modeに含める。

wd.save_screenshot('screenshot.png')

<p>
  org-modeにはこんな感じで書く
</p>

<div class="org-src-container">
  <pre class="src src-language">[[./screenshot.png]]

<p>
  これで、画像がついてよりわかりやすくなった。
</p></p>

Code

RunBook

<div class="outline-text-3" id="text-7-1">
  <p>
    表示のために、冒頭に#を入れています。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">#   * Hello RBA

** はじめに

Selenium Webdriverをつかって、Google検索します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

require ‘pp’

require ‘selenium-webdriver’

#+end_src

** 手順

まずは、firefoxを立ち上げます。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd = Selenium::WebDriver.for :firefox

#+end_src

次に、https://www.google.co.jp/ にアクセスします。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.get “https://www.google.co.jp/"

wd.save_screenshot(‘screenshot.png’)

#+end_src

[[./screenshot.png]]

次に、検索窓に以下を入力します。

- “Selenium Builder”

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:id, “lst-ib”).click

wd.find_element(:id, “lst-ib”).clear

wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder”

wd.save_screenshot(‘screenshot2.png’)

#+end_src

[[./screenshot2.png]]

最後に、検索ボタンを押します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:name, “btnK”).click

#+end_src

#+begin_src ruby :tangle ./hello_rba.rb :exports none

sleep 3

wd.save_screenshot(‘screenshot3.png’)

wd.quit

#+end_src

[[./screenshot3.png]]

生成したCode

<div class="outline-text-3" id="text-7-2">
  <div class="org-src-container">
    <pre class="src src-language">require 'pp'

require ‘selenium-webdriver’

wd = Selenium::WebDriver.for :firefox

wd.get “https://www.google.co.jp/" wd.save_screenshot(‘screenshot.png’)

wd.find_element(:id, “lst-ib”).click wd.find_element(:id, “lst-ib”).clear wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder” wd.save_screenshot(‘screenshot2.png’)

wd.find_element(:name, “btnK”).click

sleep 3 wd.save_screenshot(‘screenshot3.png’) wd.quit

Sample

11 May 2014, 10:39

Emacs で Scala 開発環境を構築 (Ensime)

はじめに

edX で受けた プログラミングパラダイム の講義のなかで,

” これからは, Scala と Erlang だ!C++ と Java はレガシーになりつつある!”

とのことだったので, ちょっと scala をいじってみようと思います.

[toc]

Environment

<div class="outline-text-3" id="text-unnumbered-2">
  <ul class="org-ul">
    <li>
      Linux Mint 16 64bit
    </li>
    <li>
      Scala 2.9
    </li>
  </ul>
</div>

Installing Scalas

Installing the JDK

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    Scala は JVM 上で動作する. まずは JDK をインストール.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install openjdk-7-jdk<br /> [/sourcecode]
  </p>
</div>

Installing sbt

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Scala のビルドツールである sbt を入れる. 以下から Download して, 解凍. なかにある bin ディレクトリにパスを通す.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html">Setup &#8211; sbt Documentation</a>
    </li>
  </ul>

  <p>
    日本語のドキュメントがあった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://scalajp.github.io/sbt-getting-started-guide-ja/">始める sbt &#8211; ようこそ</a>
    </li>
    <li>
      <a href="http://www.scala-sbt.org/">sbt &#8211; sbt Documentation</a>
    </li>
  </ul>
</div>

Installing Scala

<div class="outline-text-3" id="text-unnumbered-6">
  [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install scala<br /> [/sourcecode]</p> 

  <p>
    以下から最新版をダウンロードしてもよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-lang.org/download/">Download | The Scala Programming Language</a>
    </li>
  </ul>

  <p>
    ダウンロードしたら bin ディレクトリにパスを通す.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> # Scala<br /> export PATH=$HOME/app/sbt/bin:$PATH<br /> export PATH=$HOME/app/scala/bin:$PATH<br /> [/sourcecode]
  </p>
</div>

Hello Scala

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    それでは, お決まりの儀式から.
  </p>

  <p>
    [sourcecode language=&#8221;scala&#8221; title=&#8221;&#8221;]<br /> object Hello extends App {<br /> println ("Hello, Scala!")<br /> }<br /> [/sourcecode]
  </p>

  <p>
    以下で実行.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> % scalac Hello.scala<br /> % scala Hello<br /> Hello, Scala!<br /> [/sourcecode]
  </p>
</div>

Installing Emacs

Emacs 自体のインストール方法は省略.

Installing scala-mode

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    scala-mode と scala-mode2 がある. 2 を入れた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/hvesalai/scala-mode2">hvesalai/scala-mode2</a>
    </li>
  </ul>
</div>

Installing Ensime

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    Scala 用の統合開発環境. インストールはは github にしたがえばよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/ensime/ensime-src">ensime/ensime-src</a>
    </li>
  </ul>

  <p>
    Ensime Server をダウンロードしてロードパスの通った場所におく.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.dropbox.com/sh/ryd981hq08swyqr/V9o9rDvxkS/ENSIME%20Releases">Dropbox &#8211; ENSIME Releases</a>
    </li>
  </ul>

  <p>
    (ハマリメモ. github から落としてきたやつではなくて, Dropbox から落とした Reliese 番でないとダメなんだね. めちゃくちゃハマった)
  </p>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    .ensime を作成
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <p>
      ensime を利用するには, .ensime という設定ファイルが必要.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d.hatena.ne.jp/masaaki1001/20121226/1356539103">ensime の設定方法 &#8211; masaaki1001 の日記</a>
      </li>
      <li>
        <a href="http://d.hatena.ne.jp/lranran123/20130409/1365515128">Emacs での Scala 開発には Ensime というプラグインらしい -q 趣味プログラマがまれになんかしたことの記録</a>
      </li>
      <li>
        <a href="https://github.com/ensime/ensime-sbt-cmd">https://github.com/ensime/ensime-sbt-cmd</a>
      </li>
    </ul>

    <p>
      上記を参考に~/.sbt/plugins/plugins.sbt を作成し, 以下を記入.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> resolvers += Resolver.sonatypeRepo ("snapshots")
    </p>

    <p>
      addSbtPlugin ("org.ensime" % "ensime-sbt" % "0.1.5-SNAPSHOT")<br /> [/sourcecode]
    </p>

    <p>
      M-x ensime-config-gen というコマンドでも対話的に設定ファイルが作成できるらしい.
    </p>

    <p>
      Hello.scala を開いたディレクトリで以下を実行.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> sbt "ensime generate"<br /> [/sourcecode]
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-12" class="outline-4">
  <h4 id="unnumbered-12">
    emsime 実行
  </h4>

  <div class="outline-text-4" id="text-unnumbered-12">
    <p>
      これで, .ensime が生成される.
    </p>

    <p>
      Emacs 上で M-x ensime を実行. 先ほど生成した.ensime の場所を教える.
    </p>

    <p>
      今日はこんなところで. 逐次, 追記予定.
    </p>
  </div>
</div>

追記 2014-06-21

sbt-mode というものもある.

機能的には ensime とおなじようなことができるし, ensime ファイルを作成しなくてもいいので導入が楽.

ensime よりよいところは, M-x sbt-send-region で Scala REPL にリージョンを送信することができるところ. これは便利そう.

また, repl を autoload する方法もあるようだ.

10 May 2014, 23:16

[edX]Embedded Systems – Shape The World ずっと受けたかった組み込みソフト開発の授業

はじめに

レジスタも触ったことのないニセエセ組込みエンジニアなので、 リアル組込みエンジニアになりたくて、edXで組込み開発の学習をしました。

結果は、途中で挫折しました。全15週の10週目くらいで挫折。 なので、この記事も中途半端な記事になります。

自分はリアル組み込みエンジニアにはなれませんでしたorz.

[toc]

内容

0,1のフリップフロップから電子回路、レジスタへと、基礎からしっかり解説される。 オームの法則とか、忘れた。電子回路は読んで読まないふりをした。

期待していた?電子回路の知識は十分過ぎるほど出てきた。 ADC,DACあたりはほんとうに挫折。

言語はC言語

<div class="outline-text-3" id="text-2-1">
  <p>
    言語はもちろん、C言語だ。補足的にアセンブラ言語もでてくる。楽勝楽勝。
  </p></p>
</div></p>

実践も重視

<div class="outline-text-3" id="text-2-2">
  <p>
    知識的な部分だけではなく、開発プロセスや品質の考え方、デバッグ手法など 実践的な部分も説明される。
  </p>

  <p>
    開発プロセスでは、フローチャートやサブルーチンといった、 手続き型用語が解説されて、やや時代遅れを感じた。
  </p></p>
</div></p>

進め方

講義の流れ

<div class="outline-text-3" id="text-3-1">
  <p>
    イントロダクションとして、2人のコント?から始まる。 動画よりも、文章の方が多め。
  </p>

  <p>
    動画ではとくにパワーポイントは使わずにホワイトボードで解説されるので、 字がきれいでなく読みにくい。
  </p></p>
</div></p>

Labについて

<div class="outline-text-3" id="text-3-2">
  <p>
    講義よりも比重が置かれているのが、Labと呼ばれている実機学習。
  </p>

  <p>
    毎週課題が出されて、それに取り組むことで講義の内容の理解を深める。
  </p>

  <p>
    課題の評価はテストコードで自動でチェックされる。 シミュレータと実機の両方で評価することが求められる。
  </p>

  <p>
    評価ボードは、Texas Instrumentsの EK-LM4F120XLというものを買った。 ネットで注文して購入する必要がある。ARMの Cortex-Mが載っている。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.tij.co.jp/tool/jp/ek-lm4f120xl">Stellaris LM4F120 LaunchPad 評価ボード &#8211; EK-LM4F120XL &#8211; TI ツール・フォルダ</a>
    </li>
  </ul>

  <p>
    開発環境としては、Keil uVision for the ARM, MDK-Lite (32KB) Editionを利用する。 ARMの開発をするためのIDE.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.keil.com/uvision/default.asp">µVision IDE &#8211; Overview</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-2-1" class="outline-4">
  <h4 id="sec-3-2-1">
    Lチカ
  </h4>

  <div class="outline-text-4" id="text-3-2-1">
    <iframe width="560" height="315" src="//www.youtube.com/embed/32fij3U6SUo" frameborder="0" allowfullscreen></iframe>
  </div></p>
</div></p>

感想

自己紹介

<div class="outline-text-3" id="text-4-1">
  <p>
    まず、なぜ私がニセエセ組込みエンジニアなのかを説明したい。 そのために、まずは自分のしていた仕事を書こうと思う。 このブログに仕事の話を書くのも初めてな気がする。
  </p>

  <p>
    今は別のこと(社内ニートとも)をしているけれども、ちょっと前までは、 ストレージ装置の組込みソフトエンジニアだった。
  </p>

  <p>
    開発はそこそこ大規模で、機能モジュールごとに担当チームが別れている。
  </p>

  <p>
    自分の所属していたチームは、エラー発生時のリカバリが担当。 つまり、装置でエラーが発生したときに、 可用性を失わないためにあらゆる手段をつかってあれこれする役目。
  </p>

  <p>
    そのなかでも、自分が担当していた部分は、 ハードエラーが発生して装置内の各種ドライバから通知を受けたときに、 装置の可用性を失わないためはどうすればいいかを一生懸命考える部分。
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-sample5.png" alt="sample.png" />
    </p></p>
  </div>

  <p>
    ハードと接するinterfaceはドライバ層で隠蔽されているため、 実は自分はレジスタを触ったことがない!
  </p>

  <p>
    そもそもレジスタがなんだかわからない。 雑誌『Interface』や『トランジスタ技術』が 会社の休憩ゾーンにおいてあるが、書いてあることがほぼわからない。
  </p>

  <p>
    これって、組込みエンジニアとしてどうなの? これが、ニセエセ組込みエンジニアたる所以である。
  </p></p>
</div></p>

課題

<div class="outline-text-3" id="text-4-2">
  <p>
    自分は、組込みエンジニアという肩書きではあるものの、 実際はハードウェアを理解していない。
  </p>

  <p>
    以下の記事にとても共感する。
  </p>

  <p>
    <a href="http://monoist.atmarkit.co.jp/mn/articles/0703/26/news101.html">組み込みギョーカイの常識・非常識(8):組み込みソフトウェアって何</a>
  </p>

  <p>
    ちなみに、この記事を書いた著者のことを調べてみるとこんな本を書いてた。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/41MIz39174L._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>組込みソフトウェアエンジニアのためのハードウェア入門 (組込みプレスSelection)</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.05.11
        </div>

        <div class='amazlink-detail'>
          みわ よしこ
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6186429%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D6186429%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    ハードウェアの担当者と一緒の打ち合わせに参加しても、正直ちんぷんかんぷん。
  </p>

  <p>
    ということで、以下が学習目標。
  </p></p>
</div></p>

学習目標

<div class="outline-text-3" id="text-4-3">
  <p>
    DMA Driver が DMA Portのハードエラーを検出して、 そのエラー要因ごとに異常を通知する仕組みを理解すること。
  </p>

  <p>
    DriverがDMAなのは、 仕事で一番お世話になったのが DMA Driverの担当の人だったから。
  </p>

  <p>
    ここからは、勉強メモ。
  </p></p>
</div></p>

Embeded System

組み込みシステム。

特定の機能を実現するために機械や機器に組み込まれるコンピュータシステム。

組み込みシステムの主な構成要素は以下。

  • Embedded Systems
    • MicroCotroller
      • Memory
        • RAM
        • ROM
      • Processor(CPU)
      • I/O Ports
      • DAC
      • Bas
      • Timer
    • External Circuits
    • Physical Device
      • Sensor
      • ADC

以下のような特徴をもつ。

  • A microcontroller hidden inside
  • A dedicated purpose
  • Run in real time
  • Input/output is important
  • High volume, low cost
  • Extremely reliable
  • Low power
  • Small size and weight

MicroController

マイクロコントローラー。いわゆる、マイコン。

Microcontrollers, which are microcomputers incorporating the processor,
RAM, ROM and I/O ports into a single package,
are often employed in an embedded system because of their low cost,
small size, and low power requirements.

I/O Port

<div class="outline-text-3" id="text-6-1">
  <p>
    Input Port/Output Portの略。 Input Portは 外部の世界(外部の集積回路、sensor, etc) からの情報をコンピュータのなかに入れる。Output Portはその逆。
  </p>

  <p>
    A port is a physical connection between the computer and its outside world.
  </p></p>
</div>

<div id="outline-container-sec-6-1-1" class="outline-4">
  <h4 id="sec-6-1-1">
    device driver
  </h4>

  <div class="outline-text-4" id="text-6-1-1">
    <p>
      a set of software functions that facilitate the use of an I/O port.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-1-2" class="outline-4">
  <h4 id="sec-6-1-2">
    GPIO
  </h4>

  <div class="outline-text-4" id="text-6-1-2">
    <p>
      GPIOはGeneral Purpose Input/Output(汎用入出力)の略語。
    </p>

    <p>
      <a href="http://ja.wikipedia.org/wiki/GPIO">GPIO &#8211; Wikipedia</a>
    </p>

    <p>
      LSIチップや電子機器の備える入出力端子の一種で、 設定次第で様々な用途に利用できるもの。
    </p>

    <p>
      ソフトウェアの指示によって任意の入力あるいは出力に利用することができる。 複数の端子がGPIOに割り当てられている場合には、 これを一つのグループとして一括して制御することができ「GPIOポート」などと呼ばれる
    </p>

    <p>
      <a href="http://e-words.jp/w/GPIO.html">GPIOとは 【 General Purpose Input/Output 】 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </p>

    <p>
      PinはGPIOの構成要素。たとえば、GPIO PortAは、PA0-PA7の8つのPinからできている。
    </p>

    <p>
      Pins can be configured for digital I/O, analog input, timer I/O, or serial I/O. For example PA0 can be digital I/O or serial input.
    </p>

    <p>
      Pinのそれぞれが外部デバイスに接続される。 用途は、レジスタの設定によって自由にできる。
    </p>

    <ul class="org-ul">
      <li>
        PA1 &#x2026; LEDへのOutput用
      </li>
      <li>
        PA2 &#x2026; Switch からの Input用
      </li>
      <li>
        PA3 &#x2026; UART の Input用
      </li>
      <li>
        PA4 &#x2026; UART の Output用
      </li>
    </ul>
  </div></p>
</div></p>

Register

<div class="outline-text-3" id="text-6-2">
  <p>
    コンピュータのプロセッサなどが内蔵する記憶回路で、 制御装置や演算装置や実行ユニットに直結した、 操作に要する速度が最速の、比較的少量のものを指す。
  </p>

  <p>
    一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。 コンピュータにおいては、プロセッサが内蔵しているそれを指す。 プロセッサには、プログラムが読み書きできるレジスタ以外に、 プロセッサ自身が動作するためのレジスタがあり、内部レジスタなどと呼ばれる。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)">レジスタ (コンピュータ) &#8211; Wikipedia</a>
  </p>

  <p>
    Registers are high-speed storage inside the processor.
  </p></p>
</div>

<div id="outline-container-sec-6-2-1" class="outline-4">
  <h4 id="sec-6-2-1">
    Registerのプログラムでの扱い
  </h4>

  <div class="outline-text-4" id="text-6-2-1">
    <p>
      Pinを操作するためのレジスタには、 アドレス空間の決められたアドレスが割り振られている。(仕様)
    </p>

    <p>
      プログラムでは、あらかじめDefineを利用してレジスタのアドレスを宣言するのが王道。 volatileをつけることで、コンパイラが最適化してアドレスを変更するのを防ぐ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">#define PA5   (*((volatile unsigned long *)0x40004080))

    <p>
      これは以下と同値。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">data = (*((volatile unsigned long *)0x40004080));

data = 0x40004080; data = (*0x40004080);

    <p>
      そうすると、以下のようにして Registerの値を Read/Writeできる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language"># Register Write

PA5 = 0x20;

Register Read

data = PA5;

    <p>
      初期設定はこんな感じ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">void PortF_Init(void){ volatile unsigned long delay;

SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

<div id="outline-container-sec-6-2-2" class="outline-4">
  <h4 id="sec-6-2-2">
    LチカExample抜粋
  </h4>

  <div class="outline-text-4" id="text-6-2-2">
    <div class="org-src-container">
      <pre class="src src-language">// symbolic names instead of addresses

#define GPIO_PORTF_DATA_R (*((volatile unsigned long )0x400253FC)) #define GPIO_PORTF_DIR_R (((volatile unsigned long )0x40025400)) #define GPIO_PORTF_AFSEL_R (((volatile unsigned long )0x40025420)) #define GPIO_PORTF_PUR_R (((volatile unsigned long )0x40025510)) #define GPIO_PORTF_DEN_R (((volatile unsigned long )0x4002551C)) #define GPIO_PORTF_LOCK_R (((volatile unsigned long )0x40025520)) #define GPIO_PORTF_CR_R (((volatile unsigned long )0x40025524)) #define GPIO_PORTF_AMSEL_R (((volatile unsigned long )0x40025528)) #define GPIO_PORTF_PCTL_R (((volatile unsigned long )0x4002552C)) #define SYSCTL_RCGC2_R (((volatile unsigned long *)0x400FE108))

// 2. Declarations Section // Global Variables unsigned long SW1; // input from PF4 unsigned long SW2; // input from PF0

// Subroutine to initialize port F pins for input and output // PF4 is input SW1 and PF2 is output Blue LED void PortF_Init(void){ volatile unsigned long delay; SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

void FlashSOS(void){ //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); //O GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); delay(10); // Delay for 5 secs in between flashes }

Memory

ROM

<div class="outline-text-3" id="text-7-1">
  <p>
    書き込んだデータは消去できないが、電源を切ってもデータが消えない読み出し専用のメモリ.
  </p></p>
</div></p>

RAM

<div class="outline-text-3" id="text-7-2">
  <p>
    データの読み書きは自由に行えるが、電源を切ると内容が消えるメモリ(Random Access Memory)
  </p></p>
</div></p>

Interface

ハードウェアとソフトウェアを結ぶもの。ここでいうところは、ハードウェアインタフェース。

interface is defined as the hardware and software that combine to allow the computer to communicate with the external hardware.

I/O Port, 外部電子回路、物理的デバイス、ソフトウェアなどを集めたもの。

An interface is defined as the collection of the I/O port, external electronics, physical devices, and the software, which combine to allow the computer to communicate with the external world.

以下の4つに分類される。

  • Parallel – binary data are available simultaneously on a group of lines
  • Serial – binary data are available one bit at a time on a single line
  • Analog – data are encoded as an electrical voltage, current, or power
  • Time – data are encoded as a period, frequency, pulse width, or phase shift

Parallel Interface

<div class="outline-text-3" id="text-8-1">
  <p>
    パラレルポートとは、コンピュータシステム内で、 ばらばらの周辺機器をケーブルで接続するために使われる物理的なインタフェースの一種。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88">パラレルポート &#8211; Wikipedia</a>
    </li>
    <li>
      <a href="http://www.sophia-it.com/content/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9">パラレルインターフェースとは 「パラレルインタフェース」 (parallel interface): &#8211; IT用語辞典バイナリ</a>
    </li>
  </ul>
</div></p>

Syncronization

<div class="outline-text-3" id="text-8-2">
  <p>
    ハードウェアとソフトウェアの同期処理。
  </p>

  <p>
    ハードウェアのスピードとソフトウェアのスピードは、 ソフトウェアの方が早いため相互でやりとりするためには以下の手段がある。
  </p></p>
</div>

<div id="outline-container-sec-8-2-1" class="outline-4">
  <h4 id="sec-8-2-1">
    Blind-Cycle
  </h4>

  <div class="outline-text-4" id="text-8-2-1">
    <p>
      決められた時間SleepしたあとにI/Oステータスをチェックする.
    </p>

    <p>
      the software writes data to the output device, triggers (starts) the device, then waits a specified time. We call this method blind, because there is no status information about the I/O device reported to the software.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-2" class="outline-4">
  <h4 id="sec-8-2-2">
    Busy-Wait
  </h4>

  <div class="outline-text-4" id="text-8-2-2">
    <p>
      Input deviceのデータが更新されたときにI/Oステータスをチェックする。
    </p>

    <p>
      状態がBusyならばWait(loop), Readyならば次のステップへ。
    </p>

    <p>
      Busy Wait is a software loop that checks the I/O status waiting for the done state. For an input device, the software waits until the input device has new data, and then reads it from the input device,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-3" class="outline-4">
  <h4 id="sec-8-2-3">
    Interrupt
  </h4>

  <div class="outline-text-4" id="text-8-2-3">
    <p>
      ハードウェアが発生させる特別な通知。
    </p>

    <p>
      An interrupt uses hardware to cause special software execution. With an input device, the hardware will request an interrupt when input device has new data. The software interrupt service will read from the input device and save in global RAM,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-4" class="outline-4">
  <h4 id="sec-8-2-4">
    Periodic Polling
  </h4>

  <div class="outline-text-4" id="text-8-2-4">
    <p>
      クロックタイマの割り込み契機でI/Oのステータスをチェック
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-5" class="outline-4">
  <h4 id="sec-8-2-5">
    DMA
  </h4>

  <div class="outline-text-4" id="text-8-2-5">
    <p>
      Direct Memory Access あるメモリから別のメモリに直接情報を書き込む
    </p></p>
  </div></p>
</div></p>

Serial Interface

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

<div id="outline-container-sec-8-3-1" class="outline-4">
  <h4 id="sec-8-3-1">
    UART
  </h4>

  <div class="outline-text-4" id="text-8-3-1">
    <p>
      Universal Asynchronous Receiver/Transmitter (UART). 調歩同期方式によるシリアル通信をするための汎用I/F。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/UART">UART &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      有名なので、最近のほとんどのマイコンに搭載されているらしい。
    </p></p>
  </div></p>
</div></p>

Thread/Process/Task

Thread

<div class="outline-text-3" id="text-9-1">
  <p>
    A thread is defined as the path of action of software as it executes.
  </p></p>
</div></p>

Process

<div class="outline-text-3" id="text-9-2">
  <p>
    A process is defined as the action of software as it executes.
  </p>

  <p>
    スレッドとプロセスの違いは、変数のスコープの違い?
  </p>

  <p>
    Threads share access to I/O devices, system resources, and global variables, while processes have separate global variables and system resources. Processes do not share I/O devices.
  </p>

  <p>
    実際は、OSによってバラバラ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2245">スレッドとタスクの違いについてしらべてみた(C++/Linux) | Futurismo</a>
    </li>
  </ul>
</div></p>

Interrupt

Hardware Interrupt Software Action.

Busy-Waitの制御で待ってられない場合は、Interruptを利用する。

ここからは、一般的な説明ではなくてedXの中だけの定義。

Arm/DisArm

<div class="outline-text-4" id="text-10-0-1">
  <p>
    Armとは、ハードウェアが割り込みをあげることを有効化する。
  </p>

  <p>
    DisArmとは、ハードウェアが割り込みをあげることを無効化する。
  </p></p>
</div></p>

Enable/Disable

<div class="outline-text-4" id="text-10-0-2">
  <p>
    Enableは一時的に割り込みを有効化する。
  </p>

  <p>
    Disbleは一時的に割り込みを無効化する。
  </p>

  <p>
    Disable中に発生したInterupptは Pendingされて、Enable時に通知される。
  </p></p>
</div></p>

Interruputの初期化処理

<div class="outline-text-4" id="text-10-0-3">
  <ol class="org-ol">
    <li>
      Trigger flag set by hardware
    </li>
    <li>
      the device is armed by software
    </li>
    <li>
      the device is enabled for interrupts in the NVIC
    </li>
    <li>
      the processor is enabled for interrupts (PRIMASK I bit is clear)
    </li>
    <li>
      the interrupt level must be less than the BASEPRI.
    </li>
  </ol>
</div></p>

Context Switch

<div class="outline-text-4" id="text-10-0-4">
  <p>
    割り込みをハードウェアが検知したときに、 foregroundとbackgroundのスレッドを入れ替える。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81">コンテキストスイッチ &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    現在のプロセスの実行を一時停止して、 スタックにレジスタ情報を覚えておく。
  </p>

  <p>
    割り込みハンドラを実行して、 ハンドラの実行が終了したらもとのプロセスを再開する。
  </p>

  <ol class="org-ol">
    <li>
      Current instruction is finished,
    </li>
    <li>
      Eight registers are pushed on the stack,
    </li>
    <li>
      LR is set to 0xFFFFFFF9,
    </li>
    <li>
      IPSR is set to the interrupt number,
    </li>
    <li>
      PC is loaded with the interrupt vector
    </li>
  </ol>
</div></p>

Interrupt Service Routine(ISR)

<div class="outline-text-3" id="text-10-1">
  <p>
    割り込みサービスルーチン。割り込みハンドラともいう。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9">割り込みハンドラ &#8211; Wikipedia</a>
  </p>

  <p>
    コンテキストスイッチによって、 foregroundで動作している busy-waitなスレッドとISRがスワップされる。
  </p>

  <p>
    割り込み受け付けによって起動されるオペレーティングシステムや デバイスドライバのコールバックルーチン。 割り込みハンドラは割り込み原因によってそれぞれ存在し、 割り込みハンドラがそのタスクを完了するまでにかかる時間も様々である。
  </p></p>
</div>

<div id="outline-container-sec-10-1-1" class="outline-4">
  <h4 id="sec-10-1-1">
    NVIC
  </h4>

  <div class="outline-text-4" id="text-10-1-1">
    <p>
      割り込みハンドラに対応させたい関数は、 startup scriptに事前に登録しておく。
    </p>

    <p>
      vectorというメモリ領域にシステムにどの関数を実行すればいいかをアドレスとして教える。
    </p>

    <p>
      interrupt発生時は vectorを参照して、それに対応する割り込みルーチンの関数を呼ぶ。
    </p>

    <p>
      nested vectored interrupt controller (NVIC) manages interrupts, which are hardware-triggered software functions. Some internal peripherals, like the NVIC communicate directly with the processor via the private peripheral bus (PPB). The tight integration of the processor and interrupt controller provides fast execution of interrupt service routines (ISRs), dramatically reducing the interrupt latency.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-10-1-2" class="outline-4">
  <h4 id="sec-10-1-2">
    Acknowledge
  </h4>

  <div class="outline-text-4" id="text-10-1-2">
    <p>
      割り込みをISRが認識すること。 ISRが割り込みの認識を行った後、同じデバイスからの割り込みが発生しないよう割り込みマスクをする必要がある。 そうしないと、クラッシュする恐れがある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d241445.hosting-sv.jp/community/report/report31.html">レポート31:割り込みサービスルーチン(ISR)の処理</a>
      </li>
    </ul>

    <p>
      実装でやってはいけないことは以下。
    </p>

    <ul class="org-ul">
      <li>
        長時間の処理はしてはいけない。
      </li>
      <li>
        待ち状態になってはいけない、Delay Loopはつかわないほうがよい。
      </li>
      <li>
        呼んではいけない関数がある。
      </li>
    </ul>

    <p>
      割り込みハンドラでは必要最小限の処理のみを行い、別のタスクに通知して、 メインの処理はそっちでさせるように実装すべき。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-10-1-3" class="outline-4">
  <h4 id="sec-10-1-3">
    ISRからメイン処理への通知方法
  </h4>

  <div class="outline-text-4" id="text-10-1-3">
    <p>
      ISRとメイン処理はグローバルなメモリ領域を介して情報を受渡しする。
    </p>

    <ul class="org-ul">
      <li>
        Binary Semaphore
      </li>
    </ul>

    <p>
      ISRで 決められたflagを立てて、メイン処理でそのフラグを監視する。 flagが1ならば、それのフラグに対応する処理を実施する。
    </p>

    <ul class="org-ul">
      <li>
        MailBox
      </li>
    </ul>

    <p>
      flagとともにデータも渡すこともある。
    </p>

    <p>
      flagをStatusといい、flagとdataを合わせたデータ構造をMailという。 (MailBox Pruducer-Consumer Pattern)
    </p>

    <ul class="org-ul">
      <li>
        FIFO queue
      </li>
    </ul>

    <p>
      ISRでFifoなメモリ領域にデータをPUTし、 メイン処理のloop処理でで定期的にFifoなdataをチェックし、順次実行する。
    </p></p>
  </div></p>
</div></p>

10 May 2014, 03:51

Software Defined Infrastructureに関するブックマーク

Software Defined Storageという用語を知りました。 この用語に関して調べたブックマークメモです。

たったひとつのキーワードからどんどん世界が広がっていき、 調べるのがとても楽しく、またSoftware Defiedの動向に驚いている。

Software Defined xxx とは

ソフトウェアを中心としたインフラ構築のビジョン。

Software-defined data center (SDDC) is a vision for IT infrastructure
that extends virtualization concepts such as abstraction, pooling,
and automation to all of the data center’s
resources and services to achieve IT as a service (ITaaS)

「Software Defined」とは「(手作業ではなく)ソフトウェアで定義・制御する環境」を実現する、または目指すという意味

各ベンダの動向

Intel – Software Defined Infrastructure(SDI)

<div class="outline-text-3" id="text-2-1">
  <p>
    データセンターのサーバー、ネットワーク、ストレージを統合する戦略。
  </p>

  <blockquote>
    <p>
      SDIの大きな特徴は、コンピュート(CPU、メモリ)、ネットワーク、ストレージなど、データセンターを構成するハードウェアをすべて抽象化して、ソフトウェアで自由に設定を変更することができる点
    </p>

    <p>
      ハードウェアとソフトウェアがタイトに結びつくのではなく、ハードウェアを抽象化し、必要に応じてソフトウェアから設定を変更するだけで、サーバーのリソース構成をダイナミックに変更できるシステムが必要になってきた
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://itpro.nikkeibp.co.jp/article/NEWS/20130723/493463/">米インテルがSoftware Defined Infrastructureを発表、ストレージとネットワークで攻勢:ITpro</a>
    </li>
    <li>
      <a href="http://cloud.watch.impress.co.jp/docs/column/virtual/20130730_609512.html">【仮想化道場】“やわらかいデータセンター”を作る、IntelのSoftware Defined Infrastructure &#8211; クラウド Watch</a>
    </li>
  </ul>
</div></p>

Cisco – Software Defined Network(SDN)

<div class="outline-text-3" id="text-2-2">
  <p>
    Software-Defined Networking.ネットワークにおけるSoftware defined.
  </p>

  <blockquote>
    <p>
      SDN allows network administrators to manage network services<br /> through abstraction of lower level functionality.
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://en.wikipedia.org/wiki/Software-defined_networking">Software-defined networking &#8211; Wikipedia, the free encyclopedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      広義:「従来システムのネットワーク要素を抽象化し分割する、コンピュータ ネットワークを構築するアプローチ」(wiki より)<br /> 狭義:「(広義のアプローチを具体化するために)ネットワーク機器のコントロール プレーン、データ プレーンを分離し、集中化されたソフトウェアからコントロールして、もっと効率的なこと、便利なことをする!!」
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://gblogs.cisco.com/jp/2014/02/open-source-controller-framework-opendaylight-1/">Cisco Japan Blog » オープンソース コントローラ フレームワーク ― OpenDaylight (1)</a>
    </li>
  </ul>

  <p>
    なんと、Courseraに講義を発見!時間があれば受けたいところだが。。。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.coursera.org/course/sdn">Software Defined Networking | Coursera</a>
    </li>
  </ul>
</div></p>

EMC – Software Defined Storage(SDS)

<div class="outline-text-3" id="text-2-3">
  <p>
    EMCのとなえる戦略。ストレージにおけるSoftware Defined.
  </p>

  <blockquote>
    <p>
      Software-defined storage (SDS) is a term<br /> for computer data storage technologies which separate storage hardware<br /> from the software that manages the storage infrastructure
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://en.wikipedia.org/wiki/Software-defined_storage">Software-defined storage &#8211; Wikipedia, the free encyclopedia</a>
    </li>
  </ul>

  <p>
    SDNはOpenFlowという共通技術によって浸透したが、 ストレージ分野では共通技術となるようなものがないとか。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.publickey1.jp/blog/14/software-defined_storage.html">Software-Defined Storage、これからのストレージ技術が実現する世界とはどのようなものか? - Publickey</a>
    </li>
  </ul>
</div></p>

実現するためのArchtecture

Software Defined Infrastructe

<div class="outline-text-3" id="text-3-1">
  <p>
    このページで紹介されているアーキテクチャがわかりやすい。
  </p>

  <p>
    <a href="http://www.ctc-g.co.jp/report/column/it_sdi/index.html">よくわかるIT新発見 第1回 「Software Defined xx」の潮流を読み解く!|伊藤忠テクノソリューションズ</a>
  </p>

  <p>
    以下、引用。
  </p>

  <ul class="org-ul">
    <li>
      Orchestration ・・・ 下位の機能レイヤのAPIを通じて全体のプロビジョニングを実施。
    </li>
    <li>
      Controller ・・・ 上位レイヤからのAPIを介した指示にしたがって、Deviceの設定変更を実施。
    </li>
    <li>
      Device ・・・ 上位レイヤのAPIを介した指示にしたがって、必要なITリソースを提供。
    </li>
  </ul>
</div></p>

Rack Scale Architecture(RSA)

<div class="outline-text-3" id="text-3-2">
  <p>
    Intelが提唱するアーキテクチャ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://news.mynavi.jp/news/2013/04/12/141/">ラックはサーバ集積からモジュール構造へ、Intel | マイナビニュース</a>
    </li>
  </ul>

  <p>
    これはよくわかならいな。
  </p></p>
</div></p>

実現するための技術・OSS

OpenStack

<div class="outline-text-3" id="text-4-1">
  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/OpenStack">OpenStack &#8211; Wikipedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      クラウド基盤を構築するオープンソースソフトウエア。<br /> KVMやXen、VMware ESXi、Hyper-Vといった仮想化ソフト(ハイパーバイザー)と組み合わせ、<br /> IaaS(Infrastructure as a Service)やストレージサービスを提供するための仮想マシンやストレージ、ネットワークの管理機能などを提供する
    </p>

    <p>
      OpenStackを使って構築したクラウド環境は、<br /> 統一したAPIや認証を使って管理できる。<br /> また、IaaSのパブリッククラウドサービスで最大手であるAmazon EC2と互換性を持つ。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://itpro.nikkeibp.co.jp/article/Keyword/20121029/433321/">Networkキーワード &#8211; OpenStack とは:ITpro</a>
    </li>
    <li>
      <a href="http://cloud.watch.impress.co.jp/docs/column/cloud/20140404_642748.html">【クラウド特捜部】プレーヤーがそろい表舞台に立つOpenStack &#8211; クラウド Watch</a>
    </li>
  </ul>
</div></p>

CloudStack

<div class="outline-text-3" id="text-4-2">
  <ul class="org-ul">
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1403/03/news019.html">プロダクトの差はわずか? 活動評価視点で検証:OpenStackとCloudStack、違いは何? (1/2) &#8211; @IT</a>
    </li>
  </ul>
</div></p>

OpenFlow

<div class="outline-text-3" id="text-4-3">
  <p>
    OpenFlowとは、 ソフトウェアによってネットワークの構成を行うための新しい標準。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://e-words.jp/w/OpenFlow.html">OpenFlowとは 〔 オープンフロー 〕 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </li>
    <li>
      <a href="http://www.publickey1.jp/blog/13/openflowsdnopenflowsdn_japan_2013.html">OpenFlow/SDNはなぜ誕生したのか、OpenFlow以前にあった問題とは。生みの親カサド氏が壇上で語る。SDN Japan 2013 - Publickey</a>
    </li>
  </ul>
</div></p>

Hydrogen

<div class="outline-text-3" id="text-4-4">
  <p>
    OpenDaylight Projectとは、 SDN(Software Defined Network)のプラットフォームを開発するプロェクト。 Linux Foundation Projectのひとつ。
  </p>

  <blockquote>
    <p>
      SDN の市場育成とともにこの分野の革新とユーザ環境への導入促進を目的に活動を開始したのが「OpenDaylight」です。業界をリードする素晴らしいメンバー(Platinum/Goldスポンサー:Brocade、Cisco、Citrix、Ericsson、IBM、Juniper、Microsoft、Redhat、NEC、VMWare)が参加し、複数のインダストリ プレイヤーによるコントリビューション(HackFest 参加、ソースコード寄贈、共同開発)によりコントローラ フレームワークを形成
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://gblogs.cisco.com/jp/2014/02/open-source-controller-framework-opendaylight-1/">Cisco Japan Blog » オープンソース コントローラ フレームワーク ― OpenDaylight (1)</a>
    </li>
  </ul>

  <p>
    OpenDaylightが開発したオープンソース コントローラ フレームワークがHydrogen。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sourceforge.jp/magazine/14/02/06/144500">オープンソースSDNプロジェクトのOpenDaylightが初リリース、「Hydrogen」が登場</a>
    </li>
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1402/05/news050.html">SDNのオープンソースプロジェクト:OpenDaylight Project、最初のリリースHydrogenを発表 &#8211; @IT</a>
    </li>
    <li>
      <a href="http://gihyo.jp/dev/serial/01/linuxcon2014/0003">#3 最終回はNeela Jacques氏にOpenDaylightについて伺いました:LinuxCon Japan 2014 Preview|gihyo.jp … 技術評論社</a>
    </li>
  </ul>
</div></p>

09 May 2014, 22:39

Selenium BuilderでRubyコードを自動生成して実行する

次世代Selenium IDEと唱われている、Selenium Builderを試したメモ。

次世代Selenium IDE

次世代という意味は、Selenium2 、 つまりWebdriverをサポートしているということ。

Selenium IDEは Selenium1(or RemoteConsole RC)をサポートしている。

Selenium Builderの準備

<div class="outline-text-3" id="text-1-1">
  <p>
    Selenium Builderは forefoxのブラグイン。 なので、まずはfirefoxをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.mozilla.org/ja/firefox/new/">Firefox のダウンロード — 自由な Web ブラウザ — Mozilla</a>
    </li>
  </ul>

  <p>
    次に、以下からプラグインをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sebuilder.github.io/se-builder/">Selenium Builder &#8211; The next evolution</a>
    </li>
  </ul>

  <p>
    firefoxを再起動後、Ctrl+Alt+B or メニュー -> 開発ツール -> Launch Senium Builder.
  </p>

  <p>
    Selenium Builderについては、以下の記事がとても詳しい。Special Thanks!!
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://blog.trident-qa.com/2013/12/selenium-builder-vs-ide-recap/">次世代のIDE、Selenium Builderまとめ | 品質向上ブログ</a>
    </li>
  </ul>

  <p>
    まとまったドキュメントはここ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/sebuilder/se-builder/wiki">Pages · sebuilder/se-builder Wiki</a>
    </li>
  </ul>
</div></p>

ruby selenium webdriverの準備

<div class="outline-text-3" id="text-1-2">
  <p>
    rubyから seleniumを利用するために、selenium-webdriverを利用する。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver

  <p>
    プロキシ配下では以下。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver -r -p http://username:password@proxy.hostname:port

<div id="outline-container-sec-1-2-1" class="outline-4">
  <h4 id="sec-1-2-1">
    Windows環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-1">
    <p>
      Windows環境でgem installを動かすためには、devkitのインストールが必要。 RubyInstallerと Devkitをセットでインストールする必要がある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://rubyinstaller.org/">RubyInstaller for Windows</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-1-2-2" class="outline-4">
  <h4 id="sec-1-2-2">
    Cygwin環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-2">
    <p>
      そもそも、Cygwin環境では 依存パッケージのffiがバグっててインストールできない。
    </p>

    <p>
      Cygwin64bit版は依存しているffiライブラリがバグってる! パッチを当てる必要があるという茨の道。
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://github.com/ffi/ffi/issues/284">https://github.com/ffi/ffi/issues/284</a>
      </li>
    </ul>

    <div class="org-src-container">
      <pre class="src src-sh">$ gem install selenium-webdriver

Building native extensions. This could take a while… ERROR: Error installing selenium-webdriver: ERROR: Failed to build gem native extension.

    /usr/bin/ruby.exe extconf.rb

checking for ffi.h… *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more

    <p>
      回避方法をためしてみても、自分の環境ではうまくいかなかったので諦め。
    </p></p>
  </div></p>
</div></p>

Rubyコードを生成

自動化したいページで右クリックする。

SeleniumBuilderが立ち上がる。記録の開始を選択して、作業を記録。

記録が終わったら、ツールバー -> ファイル -> エクスポートを選択。

Selenium2としては以下の形式へExportできる(2014/5現在)

  • JSON
  • Java(Junit/TestNG)
  • Ruby
  • Python
  • PHP
  • Node.JS
  • C#

Selenium1としてExportするとさらに対応言語が多くなる。

  • HTML
  • Groovry
  • Perl

Selenium1だと、RubyのRSpecやtextunitにも対応しているようだ。 もっともっと多くなるのは時間の問題だろう。スゴい!

Rubyを選択して、Rubyのコードを生成。

require 'rubygems'
require 'selenium-webdriver'
wd = Selenium::WebDriver.for :firefox

wd.get "https://www.google.co.jp/"
wd.find_element(:id, "lst-ib").click
wd.find_element(:id, "lst-ib").clear
wd.find_element(:id, "lst-ib").send_keys "Selenium Builder"
wd.find_element(:css, "div.tsf-p").click
wd.find_element(:name, "btnK").click
wd.quit

<p>
  selenium-webdriverがrequireされいてるところに注目されたし。
</p></p>

Rubyコードを実行

生成したコードをコマンドラインから実行するだけ!こんなに簡単だとは!

07 May 2014, 10:36

プログラミングの世界観を変える衝撃!Paradigms of Computer Programmingで震えるほどの知的感動を体験した

はじめに

MOOCのEdxでParadigms of Computer Programmingという講座を受けた。

感動というものを頭に走る電撃と定義するならば、 このCourseは自分にとって、まちがいなく最高の感動だった。

[toc]

内容

感動的な講義の展開

プログラム言語のパラダイムやコンセプトが紹介される。

5つのパラダイムが紹介される。

  • Functional Programming(関数型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)
  • Deterministic Dataflow Programming(決定性データフロープログラミング)
  • Multi-Agent Dataflow Programming(マルチエージェントデータフロープログラミング)
  • Active Object Programming(アクティブオブジェクトプログラミング)

感動すべきは、その講義の展開だ。

はじめに、すべてのBaseになる関数型パラダイムからスタート。

そして、関数型パラダイムに、 State(状態)という概念を追加することで、 オブジェクト指向パラダイムに発展させる!

また、関数型パラダイムに Concurrency(並行性)、Thread(スレッド)という概念をを追加することで、 決定性データフローパラダイムに発展させる!

そして、決定性データフローパラダイムに Port(ポート)という概念をを追加することで、 マルチエージェントデータフローパラダイムに発展させる!

最後に、オブジェクト指向パラダイムとマルチエージェントデータフローパラダイムを 融合させることで、アクティブオブジェクト指向パラダイムへ発展させる!

新しいパラダイムやコンセプトが紹介されるごとに、 価値観を覆す感動が自分の頭の中で電撃としてピリピリ走った。 めくるめく感動体験の連続である。

こんな体験はそうめったにできるものではない。スゴい!

情熱的なビーターバンロイさん

レクチャーをするビーターバンロイさんの語り口がとても情熱的だ。

語り口にも感動した。重要な概念になるたびに、 声の音程と強さがあがり、情熱的に語りかけてくる。感動に拍車をかける。

Oz(マルチパラダイム言語)と参考書について

Ozというマルチパラダイム言語を利用する。

個人的には、MozartがEmacsをベースにしているところがとてもよかった。Emacs最高!

しかし、Ozの文法がわからない・・。

情報元やサンプルコードが少なくて、文法を調べるのに苦労した。 概念的にわかっていてもその実装するための文法がわからず時間かかったり。 loopを書くのに2時間つかったり。参考書とforumでサンプルコード漁りまくった。

参考書

分厚くて重い。。900ページある。しかし、これがないと辛い。実はEnglishが一番難しい言語。

通称、CTM本、CTMCP本、ガウディ本というらしい。

感想

モチベーション

講座のなかでは、以下のような利点を強調してモチベーションをあげようとしている。

  • いくつものプログラミング言語がある。全てを学ぶことは不可能。
  • プログラミング言語はパラダイムで分類できる。
  • パラダイム、そこから導出れるコンセプトを抑えることで、多くの言語を理解できる!

なるほど、利にかなっている。

今は、オブジェクト指向が全盛だが、その天下もいつまで続くかは分からない。

技術が進めばマルチコアや並列処理に対応するために、それに適した言語が必要になるかもしれない。 HTMLなんかは宣言的プログラミングの典型で、オブジェクト指向ではどうにもならない。

プロフェッショナルなプログラマを目指すのならば、 オブジェクト指向だけでなくて、他の考え方も知っておきたいところだ。

また高校生のころにこんな本を読んで、とても感激を受けた。

パラダイムを学び、そしてその考えに触れることで自分の価値観が揺るがされる。 新たな世界が見えるようになる。そんな知的興奮をパラダイムは与えてくれる。

実際は、、

講座は2月からはじまったのだが、他のことが忙しくてスケジュールどおりには進められなかった。

なので、4末に講座が終了したあと、5月のGWの休みに集中して一気に勉強した。

AssignmentやExamは締切り後に解いたりして、点数にはならず。それが残念。

プログラミング言語の分類学

プログラミングパラダイムを分類したポスターが以下のサイトからダウンロードできる。

- Classification of the principal programming paradigms

今まで3つのパラダイムしかしらなかった。

  • Declarative Programming(宣言的プログラミング)
  • Procedural programming(手続き型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)

このポスターを眺めてみると、プログラミングの世界は広大であり、 自分は視野が狭かった、ほんの片鱗しか見えていなかったと思った。

そして、この講座で紹介されなかったパラダイムもまだまだたくさんあることに驚いた。 もっともっと、いろんな言語やパラダイムに触れたいと、強く思った。

ちなみに、最後にオススメ言語が紹介される。 よい言語は、広く様々なパラダイムをカバーしてていること。 その意味で、ScalaとErlangがオススメ、 C++とJavaもややマルチパラダイムだけどちょっとレガシー、だそうだ。

Coursereで紹介されたプログラムパラダイムのメモ

メモをとりながら、動画を見ていたのでそのメモ。

今まで、あまりメモはとらなかった。満員電車で動画を見ることが多かったので。 今回はGWに集中して取り組めたので、メモをとることはよいことだと思った。

以下、引用がほとんどのメモだけれども、内容が間違っているかもしれないので注意。

これはEmacs org-modeで階層的にメモをとった。 これからも、今回触れられなかったパラダイムを追加していき、 パラダイムツリーを生涯にわたって進化させていきたい。

プログラミングパラダイムとは

プログラミングパラダイムとは、プログラミングの分類方法、スコープ、見方。

なにかを定義しているようでなにもいっていない・・・詳しくはwikipedia参照。

Base Concepts

Valiables

変数の構成要素は以下の2つ。

  • 識別子(Identifier)
  • 格納域実体(Store entity)

Identifires and Store Entity

x = 1 ということはどういうことかを説明する概念。

数学的な写像関係で x = 1 を説明しようとしている。{ X -> x1=1 }みたいな感じ。 x1がメモリ上の実際の(束縛された)値で、Xがそれを指し示す識別子。

environments

識別子と変数の写像関係を環境という。

State

State(状態)とは、必要とされる計算の途中結果を含む、値の時系列。 (sequence of values calculated progressively, which contains the intermediate results of a computation)

状態の導入によって、プログラムに時間の概念を与える。

Declarative Programming

宣言型プログラミング。

第1の意味は、 処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイム。 第2の意味は、 純粋関数型プログラミング、論理プログラミング、制約プログラミングの総称。

HTMLはStateless、Declarative Programming language. 状態はクッキーを導入してしばしば実現する。

Functional Programmming

Impliclite(declarative) State

暗黙的状態。宣言的状態ともいう。

  • 関数の実行結果が値をもつ
  • 同じ入力には必ず同じ出力を返す。
  • Explicite Stateとの対概念。
  • 参照透明性。

Higher-order programming

高階プログラミング。procedure valueをサポートしている言語でのプログラミング技術。 関数を引数としてわたす能力。

Rubyではlambda, procなど。C言語には関数ポインタがある。C言語は2階。

Recursion

再帰的プログラミング。

accumulater

C++の、numericライブラリ(accumuulateなど)で利用されている。

スタックのサイズが均一なことが特徴的。

tail-recursion

末尾再帰。

その中にただ1つの再帰呼び出しがあり、 かつその呼び出しが手続き本体の最後にあるもの。

invariant programming

不変式プログラミング。再帰的に呼ばれる度に、数学的に真になる式。

Imperative Programming

命令型プログラミング。 計算をプログラム状態を変化させる文の列で記述するパラダイム。

Imperative Programmingとは、Function paradigmにCellの概念を加えたもの。

  • Declarative Programingの対になる概念。 Imperative vs Declaretive is also Stateful vs Stateless
Imperative programming = Function paradigm + Cell

  • 実行するたびに、内部の状態によって結果がことなる。
  • 手続き型と同義のこともある。(Procedural programming)

手順やチェックリストはプログラムではないが、 命令型プログラミングのスタイルに似たコンセプトである。 それらのステップが命令であり、実世界が状態を保持している。

  • 械語は命令から構成される

低レベルから見た場合、 プログラムの状態はメモリの内容によって定義され、文としては機械語の命令が相当する。

Explicite State

明示的状態。

  • 生存期間が2度以上の手続的呼び出しに渡るような一つの状態。
  • 関数の実行の中に値をもつ。
  • 手続きの引数に現れないもの。

同様なことを関数型パラダイムで実現するためには、仮引数に状態を持たないといけない。

Cell

Explicite State(明示的状態)を表す基本型。二つの構成要素からなる。

  • 名前値(Vaiue)
  • 単一代入格納域への参照(Identifier)

Function ParadigmsとImperative Paradigmの違いは、

  • Function
    • 状態変化しない(Immunity)
    • 機能追加時にインタフェースの変更の影響度がおおきい。
  • Inperative
    • 機能追加時にインタフェースの変更の影響度がない。(モジュール性, モジュールプログラミング)
    • 状態変化する。

Structured programming

構造化プログラミング。

構造化プログラミングではプログラミング言語が持つステートメントを 直接使ってプログラムを記述するのではなく、 それらを抽象化したステートメントを持つ仮想機械を想定し、 その仮想機械上でプログラムを記述する。 普通、抽象化は1段階ではなく階層的である。 各階層での実装の詳細は他の階層と隔離されており、 実装の変更の影響はその階層内のみに留まる(Abstract data structures)。 各階層はアプリケーションに近い抽象的な方から土台に向かって順序付けられている。 pこの順序は各階層を設計した時間的な順番とは必ずしも一致しない(Concluding remarks)

- 構造化プログラミング - Wikipedia

標準的な制御構造のみを使い、 プログラム全体を段階的に細かな単位に分割して処理を記述していく手法。

「制御の流れ」を構造化しただけであり、 「データ構造」には何の制限や規則も設けていない。

「芸術品」から脱却して「工業製品」へ遷移すること、 あるいは、「処理性能重視」から「保守性重視」へ向かったもの。 別の見方をすれば、処理効率を犠牲にして、作りやすさや理解容易性を求めたもの。

三つの構造化文

ダイクストラが提唱。

  • 順次

順接、順構造とも言われる。 プログラムに記された順に、逐次処理を行なっていく。 プログラムの記述とコンピュータの動作経過が一致するプログラム構造である。

  • 反復

一定の条件が満たされている間処理を繰り返す。

  • 分岐

ある条件が成立するなら処理Aを、そうでなければ処理Bを行なう。

- 構造化プログラミング - Wikipedia

Object-Oriented Programming

オブジェクト指向型プログラミング。

CTMCP, Chapter 6,7

Data abstraction

データ抽象。3つの構成要素がある。

  • Input
  • Output
  • Interface

データ抽象は内部と外部からなるプログラムかつ、両者がインターフェースを通じてやりとりするもの。

A data abstraction is a part of a program that has an inside, an outside, and an interface in between The inside is hidden from the outside.

Input/Output

内部は外部からは隠蔽されている。-> カプセル化という。

The inside is hidden from the outside

Interface

The interface is a set of operations that an be used according to certain rules.

データ抽象には、主に二つの方法がある。

  • Abstract Data Type(ADT) keeps values and operations separate.
  • Object groups together value and operations in a single entity.

Encapsulation

プログラムと内部と内部をインタフェースで分けること。

カプセル化のメリットは大規模開発をシンプルにする。

  • 正しさを保証する。
  • 複雑さを解消する。

Abstract Data Type

抽象データ型。ADTと略されることも。

構造化プログラミングは仮想機械モデルに基づく段階的詳細化法(stepwise refinement)をもたらしたが、 データ構造の変更を行うと変更部分がソースコード中に散在してしまうという弱点があった。 データ抽象の概念はその欠点を補完するものであった

An ADT consists of a set of values and  a set of operations.

  • Integer型
    • Value:1,2,3
    • Operation:+
  • Stack型
    • Value: elemtent
    • Operation: push, pop, …

ValueとOperationそれ自体はStateを持たない。

CTM, p433

Diference between ADT and Object。Stackをつかった実装の違い。

  • ADT
local Wrap Unwrap in
  {NewWrapper Wrap Unwrap}
  fun {NewStack} {Wrap nil} end
  fun {Push W X} {Wrap X|{Unwrap W}} end
  fun {Pop W X} S={Unwrap W} in X=S.1 {Wrap S.2} end
  fun {IsEmpty W} {Unwrap W}==nil end
end

この手法はStateful ADTという。

そして、C言語では、こうやってデータ抽象化を行うことがおおい。 もちろん関数ポインタ配列を使えばC言語でもObjectをつくることができるが、 実際にはそこまでやらない。(面倒)

  • Object

オブジェクトでは、データに対する操作はプロシージャ変数として扱われることに注目。

fun {NewStack}
  C={NewCell nil}
  proc {Push X} C:=X|@C end
  proc {Pop X} S=@C in X=S.1 C:=S.2 end
  fun {IsEmpty} @C==nil end
in
  stack(push:Push pop:Pop isEmpty:IsEmpty)
end

オブジェクト指向言語は、 単にObjectをサポートする言語ではなくて、Abstruct Data Typeも強力にサポートしている。

ObjectとADTの意味がごっちゃにつかわれているのが現実の現状。

Object

値と操作をひとつのまとまりとしたもの。以下の構成要素をもつ。

  • 値 ・・・Explicite State(明示的状態)
  • 操作 ・・・Procedural Data Abstruction(手続的データ抽象)

以下の能力を備えている。

Data Abstruction

オブジェクトは内部と外部はインタフェースを通じてやりとりされる。

内部の明示的状態をAttributes,インタフェースをMethodsという。

Procedure Dispatch

オブジェクトは単一なエントリポイントをもつ。(エントリポイント = 呼び出し口) エントリポイントに渡される引数をメッセージという。

下の例だと、Counterがエントリポイント。エントリポイントにinc,getメッセージを送る。

   {Counter inc}
   {Counter get(X)}

エントリポイントから、メッセージに対応するプロシージャが呼びだされる。

メッセージとプロシシージャはあらかじめDispatch(バンドリング)されている。

Instantiation

オブジェクトは一つのメソッドで、 異なる属性をもつ複数のオブジェクトを生成できる。

この能力をInstantiation(インスタンス化)という。

Classes

メソッドと属性を定義する特別なシンタックスをClassという。

属性とメソッドはレコードデータ構造によって管理されているだけである!

Classという概念によって、オブジェクトの”宣言”と”生成(new)“を分離する。

Inheritance

継承。あるオブジェクトが他のオブジェクトの特性を引き継ぐこと。

Exceptions

例外。プログラムがある処理を実行している途中で、 なんらかの異常が発生した場合に、 現在の処理を中断(中止)して、別の処理を行うこと。 その際に発生した異常のことを例外と呼ぶ

よくある2つの概念。

  • try ・・・ 例外ハンドラをもつ例外補足コンテクストを生成。
  • raise・・・ もっとも内部の例外補足コンテキストへjampし、そこにある例外ハンドラを起動。

各コンテキストはスタックで管理され、tryはスタックの1つにmarkerをつける。 raiseはmarkerにジャンプしてmarkerの場所に例外処理のコンテキストを挿入する。

CTM p93参照。

例外をつかわないと、コンテクストごとの結果を検証必要があり、 case文が乱立するうんこコードが出来る。

Concurrenct Programming

複数の相互作用を及ぼす計算タスクの(同時)並行的実行をおこなうパラダイム。

平行プログラミング。(並列プログラミングではない)。

Multiple progressing activities that exist at the same time Activities that can communicate and synchronize

  • Communicate: information passes from one activity to another
  • Synchronize: an activity waits for another to perform a specific action

平行プログラミングには3つの代表的なパラダイムがある。

  • Detarministic Dataflow
  • Message-passing concurrency(Erlang and Scala actor)
  • Shared-State concurrency(Java monitors)

その他、並列実行の競合をさけるためには、以下ようなパラダイムもある。

  • Lazy Deterministic Dataflow
  • Constraint Programming

Detarministic Dataflow Programming

決定性データフロープログラミング。

関数型パラダイムをべースにしている。

スレッド処理、時間経過をともなうのにも関わらず、実行結果はつねに一定! これが、Deterministicと名づけられた所以。

Deerministic is not Obsarbable.

アイデア自体は70年代に提示されたアイデアのに、今まで忘れ去れれていた。

  • MultiCore, ManyCore Processing (マルチコア、メニーコア)
  • Destributed Computing
  • Concurrent Deployment
  • BigData Computing

以上のようなキーワードとともに、 21世紀の今こそ注目をあびるべき、次世代プログラミングパラダイム! (とピーターバンロイさんがいっていた)

CTMCP, Chapter 4

Detarministic Dataflow

Unbound Value

メモリ上に値が存在しないが、宣言された変数。

  • C/C++では、ゴミ(不定データ)が格納されている。
  • Javaは0初期化されている。
  • Prologは実行時にエラー終了する。
  • Ozは値がbindされるまでまちあわせる。

DataFlow Value

Unbound Valueがbindされるまでプログラムの実行を待ち合わせるような宣言的変数。

Bindされたときの実行を Dataflow Executionという。

このデータフロー変数によって、No Race Conditions(非強豪状態)を実現する! (これがもっともこのパラダイムで大事)

Threads

プログラムの処理の単位(Thread of Program)

  • Each thread is sequential.
  • Each thread is independent of the others.
  • Two threads can communicate if they share a variable

WikipediaではCPUのひとつの処理単位と定義されている。

- スレッド (コンピュータ) - Wikipedia

Streams

リストの終端がUnbound Variableであるもの。

Streamsは2つのThread間の通信チャネルとして利用できる。

Streamの構成要素は以下。

  • Producer ストリームのデータを生成。
  • Consumer Producerから生成されたストリームのデータを受け取ってアクションを起こす。
  • Transformer ProducerとConsumerとの間を仲介する。
  • Pipeline ProducerとConsumerとTransformerの間を仲介する。

単一格納変数(single-assined value)の性質(一度しか代入できない) を同期のスレッド間通信のための手段にする。

平行スレッドのなかでStreamを読み書きするものをAgentsという。

  Produce ———-> Transformer ——–> Consuemer

NonDeterminism

非決定性。プログラムの実行結果を決定ことができるシステムの能力。

Nondeterminismはmanagedされることが必須! しかし、制御がとても難しい。 だからこそ、Determinismが重要なのだと。

Scheduler

どのスレッドを実行するかを決める、システムの一部をスケジューラという。

Concurrency Transparency

平行透過性。

複数のユーザーが1つのリソースを共有して使用するとき、 それらユーザーに競合状態を気づかせてはならない。

concurrency for dummies

平行性のためのダミースレッド。

平行透過性のためには、いくらスレッドを動的に追加しようとも、削除しようとも、 最終的に得られる結果はかわらない(Deterministic!)

それは、スレッドの各処理をincrementalに動作させることで可能となる

Multi-agent dataflow programmming

マルチエジェーントデータフロープログラミング。

Concurrency を解決するためのいろいろなパラダイムのなかで、 最強のパラダイムがこれだとピーターバンロイさんはいう。

なぜなら、Deterministic Dataflow Programmingをベースに、 NonDeterminismの制御を機能追加したから。

(Deterministic Dataflow Programmingに、Portという明示的状態をくわえた)

Distributed Systemともいう。

CTMCP, Chapter 5

Port

ボート。Named Steram.名前のつけられたストリーム。

以下の操作をもつ、Abstruct Data Structure。

  • Port Creation
  • Message Sending
    • Asyncronize
    • Syncronize

Agents

通信モデルは大きく2つに分けられる。

  • Client-Server Architectures
  • Pear-to-Pear Architectures

Client,Server,PearをAgentという。

以下の構成要素をもつ。

  • have identity … mail address
  • recieve messages … mailbox
  • process messeges … orderd mailbox
  • reply to messeges … pre-addressed return letter

エージェントは独立実体で、自身の局所的な目的を目指して仕事をする。 相互作用が適切に設計されていればエージェントは大局的仕事も達成する。

CTMCP, Chapter 5より。

Agentをもちいるプログラミングを、 Object-Oriented Programmingと対比されて、 Agent-Oriented Programmingということもある。

ただし、Agentは必ずしもObjectでなくてもよい。2つのうちのどちらか。

  • Object
  • Transition state-functions

Coordinator

AgentのなかでほかのAgentをまとめるAgentをCoordinatorという。以下の性質をもつ。

  • 代理性 ・・・他のAgentの代理をして処理をおこなう。処理の結果をAgentに通知。
  • 知性 ・・・ 他のAgentから情報をあつめを代表して判断を下す。
  • 移動性 ・・・他のAgentを代表して判断を下す。

Master(Coordinator)-Slave Archtecture.

Stateless Agent

あるメッセージを受信したときに、そのメッセージに応じてアクションをとるAgents. アクションは受信メッセージに依存する。

Agentはひとつのスレッドと複数のポートをもつ。ボートは明示的変数(Cell)と同義。

このPort以外はImmutableなデータ構造。Portのみがメモリ上に確保される。

State with Agent

ポートの他にState(明示的状態)をもつこともある。

処理の実行自体はStreamデータ構造に入ったfunctionのプロシージャごとに実施する (Immutable and incremental)が、StateによってReplyの方法を変える。

Protocol

Messageの送信と受信のルール。

- 通信プロトコル - Wikipedia

プロトコルにしたがうことで、デッドロックを防ぐ。

BroadCast

他の複数のエージェント(Multi-Agent)に通信を送る。

Contract Net

Ozma

Multi-agent dataflow programmmingを実現するための言語。ScalaとOzを合体させた。

ピーターバンロイさん直々の説明動画は以下で見れる。

github repository.

Active Objects Programming(Object-Based Agent)

オブジェクト指向におけるオブジェクトを、 自ら判断し処理できる機能を持ったエージェントと呼ばれるモジュールに 置き換えたもの。

Object-Oriented Programming とMulti-Agent Programmingの2つのパラダイムを 合体させてできたパラダイム。

オブジェクトの属性ではなくて振る舞いが重要視される。

EnglishのWikipediaに OOPとAOPの対応比較表がある。

03 May 2014, 11:45

プログラマは芸術家となりえるか?クヌース先生のプログラム論を読んだ読書メモ

はじめに

文芸的プログラミングに興味を持ったため、クヌース先生のエッセイ集をAmazonで買ってみました。

一般的なサイエンスとアートの定義

クヌース先生の代表的著作 The Art of Computer Programmingがある。 この本のタイトルである Artという言葉は、 どのような意味でつかっているかを、サイエンスとアートを対比させて述べられている。

古代から中世、近代の各時代におけるアートとサイエンスの言葉の使われ方について紹介される。 いろいろと、その時代ごとに意味が異なることが分かる。 そして、今日的な意味でのサイエンスとアートはこういうものでは、と述べられる。

サイエンスとは、私たちがきわめてよく理解し、したがってコンピュータに教え込むことができるような知識のことである。
もし、私たちが何かを完全に理解したとはいえない場合には、その何かはアートの範疇に入る。

ここでは、未知なものの追求をアート、既知なものがサイエンスと説明されている。

科学的な立場とは、論理的な、系統だった、個性的でない、冷静な、理性的なという言葉で特徴づけられる。

一方、芸術的な立場とは、美的な、創造的な、人間性豊かな、熱心な、理性的でない、といった言葉で特徴づけられる。

そして、コンピュータ・プログラミングはサイエンスでもありアートである、とのべられる。 たとえとして、機械学習があげられる。 機械学習の目的は機械に知性を持たせることなので、 その研究成果はサイエンスだが、その追求の仮定はアート。

クヌース先生の考えるサイエンスとアートの定義

しかし、と文章はつづく。

いろいろ本を読んで歴史的に調べたけど、 なんか違和感があるなぁという前置きで、以下、のべられる。

私が芸術としてのコンピュータ・プログラミングを話す場合は、
主に美的な意味での芸術の様式について考えるのです。
教育者として、また著作者としての私の仕事の目標は、
読者に美しいプログラムを書くことを学んでもうらことであります。

私たちがプログラムを書こうとするときのきもちは、
ちょうど詩をつくったり作曲したりするときの気持ちと同じであります。
それは、プログラミングは知的な満足と感情的な満足の両方を私たちに与えることができます。
それは、プログラミングによって複雑さを征し、
矛盾なく構成された規則の系統を真に樹立することができるからです。

プログラムには、優雅なものもあり、異国風のものもあり、また光り輝くものもあります。
私が申し上げたいことは、壮大なプログラムを、
高貴なプログラムを、そして真実壮麗なプログラムを書くことが可能であるということです。

一般的な意味での芸術として、 クヌース先生はプログラムを作品、マスターピースとしてとらえている。なるほど、それは知ってた。

自分の仕事で書くプログラムを考えるとかなしくなる。 自分はif文にelse文を追加する仕事や、 switch文にcase文を追加するような仕事をしている。 仕事でのプログラミングは労働だ。仕事を楽しむことは諦めている。

しかし、プログラミングは好きだ。 それはわくわくするような行為だ。生まれ変わっても、プログラマでいたい。

プログラムにおける善について

功利主義哲学者、ベンサムについて言及する。そして、 プログラムにおけるよいことが、アートとなりえれば素晴らしいとのべられる。

ベンサムは、美学よりも、結果の有用性のほうが優れているという助言を与えています。

私たちは、美というものの個人的な標準を定める、
ある自由はもっています。しかし、私たちが美しいと考えるものが
ほかの人にとっても有用であると考えられるならば、それ特に素晴らしいでしょう。

私は、なんらかの意味で、たいへんよいプログラムを書くことが楽しいのです。

「よい」ということを要約すると、以下のようなことがかかれている。

  • プログラムが正しく動作すること
  • そのプログラムがユーザとやさしく対話すること
  • コンピュータのもつリソースが実際に使用される効率をあげること

ビジネス的に最もよいプログラムとは、お金を稼げるプログラムだ。

そして、ビジネス的によい(有用である)プログラムと 自分が個人的によいと信じるプログラムが交差するとすると、それは素晴らしい。 逆に言えば、それがずれていると不幸。

意味のあるエラーメッセージを作成したり、誤りを犯しにくい、
柔軟性のある入力形式を設計することは、真の芸術であるといえるでしょう。

言い過ぎな気もするが。。。

Emacsがすばらしいということ

仕事は芸術になるか?以下のようなことが述べられている。

私たちは、ほとんどどうしようもないくらい退屈で、
どんな創造性のはけ口も見当たらないような、
プログラミングの仕事を割り当てられることがあります。

この私の仕事をどうやって芸術にしたらよいのでしょうか?

この状況では創造性や芸術的手腕の余地はないでしょう。
しかしこのような場合でさえ、大きな改良を加える方法はあるものです。
もし仕事のための道具が美しいものであれば、決まりきった仕事をするのも楽しくなるものです。

つまり仕事とは、Emacsを芸術作品に昇華させること、と読めた。

まとめ

まとめると、Artとしてのプログラムとは、

  • 自分が美しいと感じるプログラム
  • 創造的な、独創的なプログラム

であること。

仕事としてではなく、個人として、自分の楽しいと思えるArtを作り上げるとプログラマは幸せになれる。

Artは個人的な感性である。それが、

  • 仕事におけるよいこと交差すればプログラマは幸せになれる。
  • 仕事におけるよいことと交差しなければ、仕事とはEmacsを芸術作品に昇華させることだと割り切れば幸せになれる。