08 Jan 2017, 04:24

coursera で Programming Languages を受けた

coursera で Programming Languages を受けた。

概要

ワシントン大学の CS のコース。3 つの言語、SML、Racket、Ruby を通じて、プログラム言語のエッセンスを学ぶというコース。

なぜこの3つの言語かというと、以下のようなマトリックスで説明される。

                dynamically typed   statically typed

functinal Racket SML object-oriented Ruby Java/C#/Scala

  • ML: polymorphic type, pattern-matching, abstract type & module
  • Racket: dynamic typing, “good” macro, minimalist syntax, eval
  • Ruby: classes but not typed, very OOP, mixens

つまり、関数型言語、オブジェクト指向言語、動的型付け、静的型付けを バランスよく学ぶためにこの3つが選ばれたのだ。

講義は、関数型言語、オブジェクト指向言語、動的型付け、静的型付け の各特徴を比較しながら、コンセプトを解説していく。

感想

とてもハードな内容だった。StudyPlus で勉強時間を記録していたのだけれども、 各コースにかかった時間は以下のとおり. 150時間くらい。

  • Part A 72h
  • Part B 33h
  • Part C 52h

Assignment の目安は 3 時間となっているけれども、とてもそんな時間ではできなかった。

A,B,C を平行して受講したので、年末年始地獄を見た。全然時間が足りない。 1 日 12-15 時間くらいこれにかかりきりだった。

Assignment も難しく、何度もカンニングした。 本当は自力でときたかったけれども、力足らず解けなかった。 しかし、Assignment の内容は骨のある楽しい内容だった。詳しくは後述。

英語力がないことを痛感。 いろいろと力説していることの意味が把握できなかった。 この一年、英語力の向上に力を入れてきたのだけれども、それでもほとんどダメ。

関数型言語、オブジェクト指向言語、動的型付け、静的型付け、それぞれの特徴や比較が 興味深かった。言語もいろいろな特徴があり、一長一短あることを知った。

Emacs をエディタとして推奨しているところがいい。Emacs Love.

Part A

言語は Standard-ML を使う。 なぜなら、文法がシンプルで、初学者に使いやすいからとのこと。

SML を利用して、関数型ブログラミングのエッセンスを学んでいく。

week1

week1 では、プログラミングはしない。 コースの説明と、環境設定(Emacs や SML のインストール)まで。

week2

SML の基本文法を学ぶ。

  • 変数宣言
  • 関数宣言
  • if - then - else
  • 変数のスコープと内部変数(let)

基本データ型についても学ぶ

  • Pair
  • List
  • Tuple
  • Option(これが特殊)

Assignment は日付に関する関数を作成していく問題。これは難しくなかった。

week3

  • データ型(Datatypes)
  • パターンマッチ
  • 例外
  • 末尾再帰

パターンマッチの便利さに開眼。

Assignemnt は、文字列操作に関する関数を作成していく問題。

week4

  • 第一級関数
  • 高階関数
  • 関数クロージャ
  • 無名関数
  • map,filter
  • レキシカルスコープ

week5

  • type interface(型推論, ポリモーフィズム)
  • Mutual Recursion
  • modules
  • equivalence
  • Exam

Part B

Lisp 系の言語はいろいろ経験がある(Common Lisp ,Scheme, Emacs Lisp,Clojure) ので、それほど苦戦することはないだろうと思っていたが、とても苦戦した。

なにが苦戦したかというと、

week1

  • Racket の文法(cons, car , cdr … etc)
  • 遅延評価
  • ストリーム
  • メモ化再帰
  • マクロ(Optional)

Assignment でやたらとストリームが出てくる。手強かった。

week2

  • struct
  • インタープリタとコンパイラ
  • インタプリタの実装方法

Assignment は、MUPL という独自言語のインタプリタを Racket で書くこと。 意味が分からなすぎて泣きそうになった。

Honor Code とかもうどうでもいい(どうでもよくはないが・・)

github にある他人のソースコードを読んで理解するのがやっとだった。(理解すらできない!)

week3

  • 動的型づけ言語と 静的型づけ言語の比較.
  • Exam

Part C

week1

  • Ruby の文法
  • Duck Typing
  • Arrays, Hashs
  • block, proc
  • SubClass
  • Overriding, Dynamic Dispatch

Ruby は業務で使ったことがあるので、文法は問題なし。

assignment は テトリスのゲームの仕様拡張。 動作するコードが与えられて、継承を使って機能を追加する。 コードを読む力が試される。

と、ここでさっそくサンプルが動かない!Ruby2.3 では動かないみたい。 親切なおじさん現れて、解決用のスクリプトを公開してくれていた。

week2

  • Function Decomposition
  • Double dispatch
  • Multiple Inheritance
  • Mixins
  • Interfaces

Assignment は SML(FP)でかかれたコードを Ruby(OOP)にポートする。

week3

  • Subtyping
  • Final Exam

サブタイピングにについては、意味不明だった。

日本語情報もほとんどないから理解は諦めた。

最後に

今回、初めて MOOC にお金を払ってコースを受講した。 なぜなら、現在休職しているのだが復職の条件の一つがプログラミングの勉強をすることだからだ。 なので、certification があれば、プログラミングの勉強をしたという証明になると思った。

普段は途中で諦めてもいいやと思って受講していたけれども、お金を払うとやる気がでるね。

取得した cartification は以下。

23 Sep 2015, 10:20

railsで努力の名言を表示するのサイトを作成

Ruby on Rails をいじってみたくなったので、試しにWebサイトを作成してみた.

偉人の名言をただ表示していているだけのサイトです. heroku上で動作.

Motivation

以下の記事に触発された.

シルバーウィークも5日間あることから、 簡単なサイトをつくってみようと思った.

  <div id="outline-container-orgheadline2" class="outline-2">
    <h2 id="orgheadline2">
      製作までにやったこと
    </h2>

    <div class="outline-text-2" id="text-orgheadline2">
      <p>
        railsのレールに乗るのに時間がかかった. 以下のチュートリアルをやった.
      </p>

      <ul class="org-ul">
        <li>
          <a href="http://openbook4.me/projects/92">小学生でもわかるRuby on Rails入門 | OpenBook</a>
        </li>
        <li>
          <a href="http://dotinstall.com/lessons/basic_rails_v2">Ruby on Rails 4入門 (全28回) &#8211; プログラミングならドットインストール</a>
        </li>
        <li>
          <a href="http://railstutorial.jp/">Ruby on Rails チュートリアル:実例を使って Rails を学ぼう</a>
        </li>
        <li>
          <a href="http://ruby-rails.hatenadiary.com/entry/20140813/1407915718">Railsを始めたばかりの人向け!Railsの仕組みを一から理解しながらブログを作成する &#8211; Rails Webook</a>
        </li>
      </ul>

      <p>
        いろんなチュートリアルをやることで、 なんとなくアプリをどう作るかが見えてきた.
      </p>

      <p>
        最終的には、2日間かけてサイトを作成.
      </p>

      <p style="font-size:32px">
        以上、Happy Hacking!!
      </p>
    </div>
  </div>

  <div id="outline-container-orgheadline3" class="outline-2">
    <h2 id="orgheadline3">
      これからどうするか
    </h2>

    <div class="outline-text-2" id="text-orgheadline3">
      <p>
        名言のサイトを機能拡張しようと思っていたのだが、 このジャンルでは、すでに先人がアイデアを実現していた.
      </p>

      <ul class="org-ul">
        <li>
          fesh <a href="http://www.fesh.jp/">http://www.fesh.jp/</a>
        </li>
        <li>
          OneQuote <a href="http://onequote.org/">http://onequote.org/</a>
        </li>
      </ul>

      <p>
        これに変わるアイデアがでてこないので、 名言はひとまず終わりにしようかと考え中.
      </p>

      <p>
        しかし、せっかくチュートリアルを終わらせてrailsが分かるように なってきたので、ここで終わらせたくないなぁ.
      </p>
    </div>
  </div>

28 May 2015, 01:36

Ruby でシストレの世界を体験! Ruby ではじめるシステムトレード を読んだ

システムトレードのプログラムを自分で組んでみたいと思った.

coursera で講座をとったので、なにかこれに続く学習をしたいと思った.

なにか、手頃な入門書はないだろうか?

探して見たところ、以下の本が良さそうなので、読んでみた.

Ruby でシステムトレードのプログラムを組む本

Ruby を用いてシステムトレードのプログラムを組む本.

内容は、筆者が作ったプログラムを順に解説していくもの. シストレの知識がまとまっているわけではない.

この本は、Ruby 初心者、いやプログラミング初心者でも読めるように書いてある.

各章において、やりたいことのコードが載っていて、 その手前でそのコードで利用している文法が解説されている.

以下から、ソースコードがダウンロードできる.

Yahoo ファイナンスのスクレイビングとシミュレーション

内容は 2 つに分かれている.

  • データ取得
  • シミュレーション

データ取得

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    前半は、株データを収集するために、 Yahoo ファイナンスをスクレイビングするコードが解説される.
  </p>

  <p>
    やってみましたよ的な内容で、 スクレイビングについてまとまった知識を得られるものではない.
  </p>

  <p>
    open-url ライブラリを利用して HTML ページを落としてきて、 正規表現でパースするというもの.
  </p>

  <p>
    執筆時と Web の構造が変わっていたので、サンプルコードそのままでは動かない!
  </p>

  <p>
    修正コードが以下にあった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.panrolling.com/books/gr/gr121.html">Pan; Ruby ではじめるシステムトレード</a>
    </li>
  </ul>
</div>

シミュレーション

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    後半は、売買のシミュレーションを実施するプログラムを作成する.
  </p>

  <p>
    自分は、トレード自体は初心者なので、 いろいろなトレード基本用語が理解できないで困った.(テクニカル指標とか)
  </p>

  <p>
    プログラミング初心者を対象にしているが、トレードの初心者は対象にしていない.
  </p>
</div>

プログラミング書籍としては悪書

プログラミング書籍としては、ひどい内容だ.

  • 秩序も順番もなく、文法が述べられる
  • くだらないギャグやユーモアがちりばめられている
  • 初心者むきの本であるにも関わらずトリッキーな書き方ばかりがでてくるところ.

どうだ、こんなに短くかけるのだ、すごいだろ!

という叫びが随所にちりばめられている. 初心者向きの本ならば、ダサくても可読性がある書き方のほうがいい気がする. プログラミング初心者にこの本を読ませるのは、かなりきついだろう.

しかし、まずやりたいことがあって、そのための文法が解説されていたほうが、 淡白な文法書を読むよりも、取っ掛かりはしやすいのかもしれない.

雰囲気を味わう

シストレの本としては、よくわからなかった. Ruby と同じで、必要なときに必要な知識が出てくる。知識がまとまっていない.

いろいろなことが知っているものとして話がすすんでいるような気がして、 後半のほうはちんぷんかんぷん.

この本は、雰囲気を味わう本なのだろうと思った. 実際に、動くプログラムを動かすことで、なんとなくシストレを体験する本.

30 Dec 2014, 08:14

Gof デザインパターンの勉強メモ記事とブックマークまとめ

はじめに

今年の目標は, デザインパターンの攻略!

ということで, この一年でまとめた情報や書いた記事のブックマークページです.

過去記事は, Ruby と Java が入り混じっていたり, 気まぐれでどんどん更新していったので, とてもまとまりがないとおもう.

強引に一つのページにまとめてみた感じ… (*‘д`*)

一年の振り返り

Rubyist になる

去年の 12 月から Rubyist になった.

そして, オブジェクト指向開発に触れることになった.

楽しかったので, 何も考えずにデザインパターンを使ってみたりした. しかし, これはのちに後悔することになった.

保守性よりもスピードを重視するべきだったのに, デザインパターンをつかって, 仕事が遅れてしまったという悲しい思い出.

POSA を学ぶ

coursera で POSA (Pattern Oriented Software Archtecture) をまなんだ.

ここで登場した Schmidt さん (POSA2 を書いた人) がとても情熱的に Pattern を語るのをきき, パターンが素晴らしいと洗脳された.

Javaer になる

年の暮れごろに Javaer になった.

すると, 一緒に仕事する人にすごく怖くてパターンに詳しいひとがいた.

OO でまともに設計した経験のない自分は, その人からしてみれば素人なので, レビューしているのだか教育をされているのだかわからない感じだった.

そんなことだから考え方がいつも手続的なんだ と, しょっちゅう罵倒された../ (._.)

毎日怯えつつ, あんなやついつかギャフンと言わせてやるという, なかば憎悪に似た感情を抱きつつ??, パターンの勉強をしたのだった.

これからどうするか?

Gof デザインパターンは 20 年前のもの.

最近, おもしろい podcast を発見した.

Gang of Four のメンバが 20 年たった今, なにを感じているのかをインタビューした podcast.

Gof デザインパターンは, 20 年も前のものなのだ.

そして, 今や時代はオブジェクト指向から関数型へと向かっている.

OO から FP へ

デザインパターンを学習していると, 関数型だともっと簡潔にかける気がしてきた.

たとえば, これ.

というわけで, 来年は関数型言語を頑張る. 関数型言語のパターンみたいなものはあるのかな??

Pattern

パターン

建築環境に繰り返し現れる課題を解決に導く具体的な方策を記述したもの.

アレクサンダーのパターン形式

  • パターン名
  • 写真
  • 上位パターンへのつながり
  • 本文
  • 下位パターンへのつながり

パターンランゲージ

建築において繰り返し現れる構造を再利用しやすい形式でまとめたもの. あるいは, パターンを集めて一つの体系としてまとぬあげたもの.

建築家クリストファーアレクサンダーが考えた建築手法.

時を超える建築の道

パターンランゲージを記した建築理論. 本の題名.

角谷信太郎さんのおもしろいはなしの youtube 動画も見つけた.

無名の質

生き生きとした建築や街が備えている特性. 古い街並みに潜む住みやすさや美しさ.

Design Pattern

Gof Degign Pattern

生成に関するパターン

Factory の原則

生成と実装を分離することで, プログラムはシンプルになる.

  • 生成パラメータの指定方法をシンプルに
  • 生成後の管理をシンプルに
  • 生成するオブジェクトの指定方法をシンプルに

特定のケースで特定のオブジェクトを生成するのは手続き思考的.

2 つをわけて考えることで設計に集中.

  • 動作方法
  • 生成,管理方法

Factory Method

オブジェクトの生成を行う時のインタフェースを規定して, インスタンス化するクラスを決定するのはサブクラスに任せる.

factoryMethod の中でオブジェクトの生成をすることで, 生成を生成オブジェクト (メソッド) 内にカプセル化.

switch 文は Abstract Factory によってリファクタリング可能.

  1. C 言語での応用

    C 言語で Abstruct Data Type な設計をつかうときの常套手段.

    int createInstance (void) {
      return calloc (4);
    }
    
    int destroyInstance (int ptr) {
      free (ptr);
      return NULL;
    }
    
    int main (void) {
      int *instance = createInstance ();
      instance = destoryInstance (instance);
      return 0;
    }
    
  2. 使いどころ

    グループ化されたオブジェクトについて,

    • 生成用オブジェクト (Creator)
    • 振る舞い用オブジェクト (Product)

    のペアを作成するとき.

Abstract Factory

関連するオブジェクト群を, その具象クラスを明確にせずに生成するための インタフェースを提供する.

関連するインスタンス群を生成するための API を集約することによって, 複数のモジュール群の再利用を効率化することを目的とする.

実装は意識せずに, インタフェース (API) のみで, 抽象的な部品をつくりあげる.

Factory Method 自体のカプセル化. マルチ Factory Method. Factory Methods.

Builder

オブジェクトの生成手順が複雑な場合に, その生成過程をカプセル化する.

ドメイン駆動設計でいうところのエンティティオブジェクトを生成する Factory.

Prototype

生成するオブジェクトの原型をコピーして新しいオブジェクトを生成する.

Abstract Factory と似ている.

  • new でオブジェクトを生成すれば Abstract Factory.
  • clone をつかう場合の Prototype.

複製を作成するためのメソッドを用意する. といういたって単純なもの.

プロトタイプ が複製を担当し, それ以外の生成における操作をクライアントが 担っている.

Map にテンプレートを登録しておいて, 利用するときに複製する. バイナリデータをマップにいれておいて, キーとなる名前をつけて管理する, など.

Java には, Clonable インタフェースがある.

クラスの数をかなり減らすことができる.

  1. 利用シーン

    • Abstract Factory パターンでなされるように,

    クライアント・アプリケーションにおいて オブジェクトの生成者をサブクラスにすることを回避する

    • 標準的な方法 (例えば’new’) で新しいオブジェクトを作ることによる

    固有のコストが所与のアプリケーションにとって高すぎる時にそれを回避する.

Singleton

システム内で生成可能なインスタンス数をひとつだけに制限する.

一般的なシングルトンパターンの実装方法は以下.

  • static method
  • private な 定数に オブジェクトを保存
  • オブジェクトは getInstance () メソッドで取得

各 Factory の違い

デザインはしばしば,

  • 比較的に複雑でなく,
  • カスタマイズしやすく,
  • サブクラスを急速に増やす

ファクトリメソッドを用いるところから出発

一層の柔軟性が必要となる箇所が発見されるに伴い,より柔軟だが複雑な Abstract Factory, Prototype, Builder へと発達してゆく.

  1. Factory Method

    ファクトリのクライアントとなるオブジェクトが, ファクトリオブジェクトにインスタンスの生成を委譲する.

    • 親クラスである Creator クラスが子クラスである

    ConcreteCreator クラスにオブジェクトの生成を委ねる

    • Creator クラスと ConcreteCreator クラスとの関連である.
    • 継承
    • [オブジェクト生成] の抽象化にポイントを置いたパターン
  2. Abstract Factory

    親クラスであるファクトリが, 実際のオブジェクトの生成をサブクラスに委譲する

    • Client のインスタンスが ConcreteFactory のインスタンスにオブジェクトの生成を委ねる
    • オブジェクト同士の関連
    • 委譲
    • [関連するオブジェクト群をまとめて生成するための手順] の抽象化
  3. 参考:

構造に関するパターン

Adapter

インタフェースを変換することにより, インタフェースに互換性がない クラス同士を接続する.

単なるラッパークラスとも言える.

ラッパー方法は 2 つ.

ここでは, ConcurrentLinkedQueue と ConcurrentArrayQueue を 生成時に交換するために, Adapter をつかっている.

Bridge

クライアントがアクセスするクラス (インタフェース) と実装クラスを分離して, それぞれを独立に変更できるようにする.

オブジェクト指向のこころの本にとても詳しく書いてある.

これぞ, オブジェクト指向の本質! みたいな.

  • インタフェースを用いて設計する.

機能追加と機能実装の組み合わせ爆発を抑止することができる.

Composite

部分-全体階層を表現するために, クラスの木構造に組み立てる. 同一の クラスから派生したサブクラスを木構造のノードとし, クライアントは木構造の任意の部分を同一のインタフェースで扱える.

別名, フォルダパターン. フォルダには, フォルダとファイルがある. こっちの名前のがわかりやすいし, 覚えやすい.

Decorator

サブクラス化ではなく委譲により, クラスに新しい機能を追加する.

ポイントは, オブジェクトの委譲方法が,

  • 集約ではなくてコンポジション
  • 継承ではなくてコンポジション

LinkedList 構造.

Facade

複数のクラス群からなるサブシステムにアクセスするための, インタフェースを提供する.

facade とは, 正面という意味.

Proxy

オブジェクトへのアクセスをフックするための代理オブジェクトを提供する.

Proxy は英語で代理人.

Windows のデスクトップショートカットもプロキシ.

本物のオブジェクトにアクセスするまえにクッションを置くことで, そこに機能追加できる.代理プラスアルファの機能をもつ.

Flyweight

一度生成したインスタンスはプーリングしておき, 必要なときに取り出して使う.

シングルトンパターンは フライウェイトパターンと合わせて利用されることがおおい.

特徴は,

  • private な 変数に オブジェクトを保存.
  • オブジェクトが存在すれば, getInstance で渡す. オブジェクトが存在しなければ, オブジェクトを作成して getInstance で渡す.
  1. wikipedia から説明引用

    その時点で対象のインスタンスが生成されていない場合

    • 対象のインスタンスを新たに生成する.
    • 生成したインスタンスをプールする (言い換えると, メンバのコンテナオブジェクトに格納する).
    • 生成されたインスタンスを返す.

    対象のインスタンスが既に生成されていた場合

    • 対象のインスタンスをプールから呼び出す.
    • 対象のインスタンスを返す.

振る舞いに関するパターン

Command

動作を表現するオブジェクト. 動作とそれに伴うパラメータをカプセル化したもの.

  1. 特徴

    • 手続きに必要なパラメータの一時格納場所として便利.
    • 関数呼び出しのためのパラメータを集めて,

    後で使用するためにコマンドを保存しておくことができる.

    • 保存されたデータ構造に対する追加, 削除が可能になる.
    • コマンドの生成と実行のタイミングの分離.

Chain of Responsibility

責務を持たせたオブジェクトの Chain に 要求を渡していく.

要求は,

  • そのオブジェクトで処理できればそこで処理する
  • そのオブジェクトで処理できなければ, 次のオブジェクトに渡す.
  1. 参考記事:

Interpreter

文字列からなる構文を構文解析 (Interprete) し, 構文を表現したオブジェクト構造ともとの文字列を関連付ける.

Iterator

オブジェクトの集合 (データ構造, コンテナ) があるとき, その集合の内部構造はカプセル化したままで, 要素に対して順にアクセスする方法を提供する.

コンテナオブジェクトの要素を列挙する手段を独立させることによって, コンテナの内部仕様に依存しない反復子を提供することを目的とする.

言語でサポートしていることがおおい. 拡張 for 文, for-each 文などと呼ばれる.

自前で実装するよりも, 言語に頼るほうがよい.

  1. Java

    Collection フレームワークでは, 反復子が利用できる.

    List<Integer> list = LinkedList<Integer>
    for (int i; list) {
    System.out.println (i);
    }
    

    Iterator インタフェースを実装することで, 自前のクラスにイテレータを適用できる.

  2. Ruby

    Enumerable モジュールを Mix-in する.

  3. 参考:

Mediator

複数のオブジェクトを相互作用させる場合に, お互いのオブジェクト同士が直接参照することをなくすため, 相互作用そのものをオブジェクトとして定義する.

Memento

オブジェクトの状態を保存しておき, 元に戻せるようにしておく. オブジェクトを以前の状態に (ロールバックにより) 戻す能力を提供する.

Observer

あるオブジェクトに依存した複数のオブジェクトがある場合に, 被依存オブジェクトの状態変化を, 依存オブジェクトに通知する.

Ruby ではライブラリがある.

イベントリスナ.

State

状態に応じてオブジェクトの振る舞いを変更したいときに, 振る舞いを別オブジェクトにカプセル化する.

Strategy

アルゴリズムをカプセル化して, アルゴリズムを交換可能にする. ひとつの入力データに対して, アルゴリズム毎に異なる結果を出力する.

アプリケーションで使用されるアルゴリズムを動的に切り替える必要がある際に有用.

  • Android
  • Windows
  • Linux
  1. 変更を考慮して設計するアプローチ

    オブジェクト思考のこころより引用.

    • 変更内容を予測するのではなくて, どこに変更が発生するのかを予測する
    • 実装を用いてプログラミングするのではなくて, インタフェースを用いてプログラミンクする.
    • クラス継承よりも, オブジェクトの集約を多用する.
    • 流動的要素をカプセル化する.

    switch 文を多用したり, グチャグチャになってきたら赤信号. switch 文は流動的要素なので, その部分をクラスに分離してカプセル化する.

    クラスに分離する際は, 継承をさけて集約を多用する.

  2. Effective Java から

    p101 戦略を表現するために関数オブジェクトを使用する

    • 戦略を現すインタフェースを用意
    • 個々の具象戦略に関してそのインタフェースを実装しているクラスを定義.
      • 具象戦略が一度しか利用されないならば, 無名クラスで作成
      • 繰り返し利用されるならば, public static final の フィールド or static factory method を通じて提供.
  3. 名前のつけかた

    xxxStrategy

Template Method

単なる継承.

アルゴリズムを複数のステップに分解し, それぞれのステップを抽象メソッドにする. 各ステップでのメソッドの実装はサブクラスで定義する.

システムのフレームワークを構築するための手段としてよく活用される.

Factory Method パターンは, 内部に Template Method パターンを包含することが多い

class A
  def execute ()
    raise "to be implemented"
  end
end

class B < A
  def execute ()
  end
end

class C < A
  def execute ()
  end
end

Visitor

複数のオブジェクトからなるオブジェクト構造があるときに, それぞれのオブジェクト要素に処理を追加または オブジェクト要素の処理を変更するため, Visitor クラスを用意する.

OOP の 2 大原則

オブジェクト指向のこころとは, ズバリ以下だ.

  • 流動的要素を探し出してカプセル化する
  • クラス継承よりもオブジェクトの集約を多用する

デザインパターンとともに学ぶオブジェクト指向のこころより

カプセル化の視点で整理

カプセル化がデータ隠蔽というのは狭義の定義.

カプセル化とはあらゆるものを隠蔽すること.

  • データ
  • メソッド
  • 実装
  • 派生クラス
  • 設計の詳細
  • 実体化の規則

流動的要素を探し出してカプセル化する. 委譲は手段.

この観点から, デザインパターンをとらえ直すと,

流動的要素 Pattern


アルゴリズム Strategy 状態 State 振る舞い Decorator パターンマッチ, 型 Visitor 動作, 要求 Command 実装 Bridge 変化への反応 Observer 相互作用 Mediator 生成 Factory Method, Abstract Factory , Prototype 一意性 Singleton, Flyweight 構造の生成 Builder 集合の巡回構造 Iterator インタフェース Adapter システム Facade 設計の詳細 Template Method

Links

概要がかかれたページ

噛み砕かれた, わかりやすい説明.

図解で解説されている.

サンプルソースが豊富.

24 Nov 2014, 02:23

Ruby の win32ole で Windows GUI アプリのキー操作を自動化する

はじめに

Windows 上のアプリをキーボード操作で自動化したいと考えた.

Ruby の win32ole を利用すれば, 実現できそうなので, 調べた.

Win32ole とは

Windows 版の Ruby には, win32ole というライブラリがある.

これを利用すると, Ruby から Windows のいろいろなアプリを操作できる. (Excel,iExplore などなど…)

Windows アプリにキーを送ることができるので, キー操作で完結するアプリならば, 操作を自動化できる, というわけだ.

以前, Excel の操作で win32ole を利用した.以下, 過去記事参照.

今回は, キーボード操作関連の情報をまとめる.

WSHShell を操作

WSHShell とは, Windows のシェル. これを Ruby から制御する.手順は 2 つ.

  • あるウィンドウをアクティブにできる
  • アクティブなウィンドウにキーコードを送る

事前準備

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    以下の 2 行で, まずは wsh オブジェクト生成.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;<br /> wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> [/sourcecode]
  </p>
</div>

プログラム起動

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Run メソッドでプログラムを起動できる.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウをアクティブにする

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    AppActivate メソッドで ウィンドウをアクティブにできる.
  </p>

  <p>
    アプリのタイトルを指定する. 成功すると, ture が返る. 失敗すると, false が返る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.AppActivate (&#8216;Title&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウにキーコードを送る

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    SendKeys メソッドで ウィンドウにキーを送る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.SendKeys (&#8216;A&#8217;)<br /> [/sourcecode]
  </p>

  <p>
    詳細な SendKey コードはここにある.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://msdn.microsoft.com/en-us/library/8c6yea83.aspx">SendKeys Method</a>
    </li>
  </ul>
</div>

Sample

notepad

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    メモ帳起動してなにか書く. Popup メソッドでメッセージ表示.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> wsh.AppActivate (&#8216;無題&#8217;)
  </p>

  <p>
    wsh.SendKeys (&#8216;Hello&#8217;)
  </p>

  <p>
    wsh.Popup (&#8216;Happy Hacking!!&#8217;)<br /> [/sourcecode]
  </p>
</div>

explorer

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    C:-neraフォルダをコピーして test2 フォルダを作成する.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> # coding: utf-8<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run &#8216;explorer C:\Users\tsu-nera\Desktop&#8217;
  </p>

  <p>
    sleep (3)
  </p>

  <p>
    wsh.AppActivate (&#8216;Desktop&#8217;)
  </p>

  <p>
    # テストフォルダ選択<br /> wsh.SendKeys (&#8216;t&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # コピー & ペースト<br /> wsh.SendKeys (&#8216;^c^v&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # リーネム<br /> wsh.SendKeys (&#8216;{F2}test2{ENTER}&#8217;)
  </p>

  <p>
    # popup<br /> wsh.Popup (&#8216;Copy Success!!&#8217;)<br /> sleep (3)<br /> wsh.SendKeys (&#8216;{ENTER}&#8217;)<br /> [/sourcecode]
  </p>
</div>

14 Sep 2014, 05:02

Reactor Pattern について調べてみたまとめ

coursera で受けている, POSA の講義で出てきた Reactor Pattern について調べてみたまとめです.

Reactor Pattern とは

イベント駆動のためのデザインパターン.

[sourcecode language=”text” title=”” ]
The reactor design pattern is an event handling pattern
for handling service requests delivered concurrently
to a service handler by one or more inputs.
[/sourcecode]

特徴

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      イベント (入力データ) を, 処理や状態を表すハンドラ (メソッド or サブクラス) にディスパッチ (結びつける) する.
    </li>
    <li>
      ハンドラごとに責務を分割できるので OOP 向き.
    </li>
    <li>
      ハンドラ以外の部分はフレームワークに隠蔽されていることがおおい.
    </li>
  </ul>

  <p>
    EventMachine は Reactor パターンの高性能な実装さ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://keijinsonyaban.blogspot.jp/2010/12/eventmachine.html">見えないチカラ: 【翻訳】 EventMachine 入門</a>
    </li>
  </ul>

  <p>
    Android は状態ごとにハンドラが呼び出される.
  </p>

  <ul class="org-ul">
    <li>
      onCreate ()
    </li>
    <li>
      onResume ()
    </li>
    <li>
      onDestory ()
    </li>
  </ul>

  <p>
    Spring Framework では, GET や POST の HTTP request は, それぞれ対応するメソッドにコールバックされる.
  </p>
</div>

Structure

<div class="outline-text-3" id="text-1-2">
  <ul class="org-ul">
    <li>
      Resources: 入力データ
    </li>
    <li>
      Synchronous Event Demultiplexer:入力データを拾うためのイベントループ. シングルスレッドで loop していることが特徴 (Synchronous).
    </li>
    <li>
      Dispatcher: ハンドラを管理する. Demultiplexer から通知を受けたら, Resource を Handler に Dispatch する (select など)
    </li>
    <li>
      Handler: Resource に関連付けられた処理.
    </li>
  </ul>
</div>

Socket Programming における Reactor Pattern

Socket Programming ででてくる Reactor は, 狭義の Reactor Pattern のようだ.

特徴

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      すべての処理をシングルスレッドで実施する.
    </li>
    <li>
      マルチスレッドを利用しなくても, 非同期処理がかける.
    </li>
    <li>
      スレッドやプロセス数の制限なしに, クライアントからの要求に答えることができる.
    </li>
  </ul>
</div>

実装方法

<div class="outline-text-3" id="text-2-2">
  <ul class="org-ul">
    <li>
      ソケットを select で監視する. 読み取り可能, 書き込み可能なソケットのみに対して処理を実施する.
    </li>
    <li>
      遅い回線があるときに, その回線に引きずられて Reactor が他の処理をできない. すべての処理が Blocking される.そんなときは, non-blocking write を利用する.
    </li>
  </ul>
</div>

sample

<div class="outline-text-3" id="text-2-3">
  <p>
    以下のリンクのサンプルをそのまま写経しました.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://gihyo.jp/dev/serial/01/ruby/0030archives/age=1">第 29 回 Reactor で非同期処理をやってみよう (1):Ruby Freaks Lounge|gihyo.jp … 技術評論社</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> write_socks = hosts.map do |host|<br /> TCPSocket.new (host, 80)<br /> end<br /> read_socks = []
  </p>

  <p>
    # handler<br /> write_proc = lambda{|sock|<br /> sock.write (request)<br /> }
  </p>

  <p>
    # handler<br /> read_proc = lambda{|sock|<br /> sock.read<br /> sock.close<br /> }
  </p>

  <p>
    # Reactor<br /> until (write_socks + read_socks).empty?
  </p>

  <p>
    # Demultiplexer<br /> r_socks, w_socks, e_socks = IO.select (read_socks, write_socks)
  </p>

  <p>
    # Dispatcher<br /> if ws = w_socks.first<br /> write_proc.call (ws)<br /> read_socks << ws write_socks.delete (ws) end # Dispatcher if rs = r_socks.first read_proc.call (rs) read_socks.delete (rs) end end [/sourcecode] 

    <p>
      Working With TCP Socket における Reactor Pattern.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/2572">TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる | Futurismo</a>
      </li>
      <li>
        gist: <a href="https://gist.github.com/tsu-nera/0a0930175a3f23641848">https://gist.github.com/tsu-nera/0a0930175a3f23641848</a>
      </li>
    </ul></div> </div> </div>

17 Aug 2014, 12:49

TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる

はじめに

これからネットワーク関係の業務が始まる.

ネットワークの知識をつけるためにソケットプログラミングの本を読み始めた.

本の内容

Ruby をつかって, ソケットプログラミングの内容が解説されている.この本 のよさは, まさに,

安い, はやい, うまい

である.

  • Amazon Kindle で購入できるから, 1000 円で即時に手に入る.
  • はじめのほうが丁寧にかかれているので, Ruby さえしっていれば, 短時間 でソケットプログラミングのエッセンスを速習できる.
  • たった 100p ちょいの厚さだけれども, 要点がまとまっていてる.

初めの 13 は基本のサーバ・クライアントプログラミング.C 言語にも通じ る内容を Ruby で解説している. わたしの業務ははじめは Ruby でプロトタイ ピングをして, そのあと Java で書く予定.なので, 言語に縛られない知識 が欲しい. そういう意味で, 基礎を学ぶことは有意義.

自分は以前, C で 軽くネットワークをかじったので, Ruby での簡潔さに驚 いた. いろいろメソッドが解説されるのだけれども, 最後に Ruby の糖衣構 文がでてきて, ほーら Ruby だとこんなに簡単にかけるんだよーといわれる.

中盤は, Non-Blocking I/O やマルチソケットプログラミングなど, やや専門 的なな内容を扱っている. 自分の仕事では利用するところとしないところ我 ありそうなので, つまみ食いしつつ読んでいる (今ここ)

驚いたのが終盤の章だ. ネットワーキングのアーキテクチャパターンが解説 されている. 結構マニアック.そして, coursera でここを学んだ, そしてま だ学んでいる自分としては, この参考資料はうれしい.

ソケットプログラミングの基礎メモ

以下, かんたんなメモ.

Socket

  • 実行中のプログラム間でデータの送受信を行うための標準的なプログラ ミングインターフェース (API) の一つ.
  • TCP/IP アプリケーションを作成するための抽象化されたインターフェース
  • ソケット (BSD) - Wikipedia

EndPoints

端末.一意に定まる通信先.

Socket は IP Address と PortNo.をつかって, 通信先のソケットを特定す る. ネットワークに接続されたパソコンや PDA, 携帯電話などのネットワーク 端末の総称.

エンドボイントに Socket がバインドされる.

Loopbacks

IP アドレスは必ずしもリモートホストと関連付けられている必要はない. 得に開発環境では, ローカルな IP アドレスが役に立つ.

自端末に対して通信することを LoopBack という. LoopBack で指定するアドレスを Loopback Address という.

  • ハードウェアと関係ない, 論理的なインタフェース.
  • Linux では, localhost と言われている. IP は 127.0.0.1

ループバックとは 〔 ローカルループバック 〕

Server Lifecycle

  1. create ソケットの生成
  2. bind
    • ソケットを利用する Port にバインド.
      • User でバインドする Port は 1025-48999
    • ソケットが通信を許可する IP を指定.
  • 0.0.0.0: すべて許可
  • 127.0.0.1: 自端末のみ許可
  • xxx.xxx.xxx.xxx: ある端末のみ許可
  1. listen 通信先ソケットからの通信をまつ
  2. accept 通信先ソケットからの通信を受け取り, 通信路 をそのつど生成 (connection)
  3. close 通信元ソケットの消滅.
# coding: utf-8
require 'socket'

# 1. create
server = Socket.new (:INET, :STREAM)

# 2. bind
addr = Socket.pack_sockaddr_in (4481, "0.0.0.0")
server.bind (addr)

# 3. listen 
server.listen (5)

# 4. accept
loop do
  connection, _ = server.accept

  ## send message from client.
  # ehco "Hello" | nc localhost 4481
  p connection

  # it should be closed each connection
  connection.close
end

# 5. close
server.close

TCPServer

Ruby では, 以下のような糖衣構文がある.

server = TCPServer.new (4481)
# => 
# server = Socket.new (:INET, :STREAM)
# addr = Socket.pack_sockaddr_in (4481, "0.0.0.0")
# server.bind (addr)
# server.listen (5)

Client LifeCycle

  1. create ソケットの生成

(2. bind )

  1. connect サーバと接続
  2. close ソケットの破棄
require 'socket'

# 1. create
socket = Socket.new (:INET, :STREAM)

# 3. connect
remote_addr = Socket.pack_sockaddr_in (80, 'google.com')
socket.connect (remote_addr)

# 4. close
socket.close

TCPSocket

Ruby では, 以下のような糖衣構文がある.

socket = TCPSocket.new ('google.com', 80)
# =>
# socket = Socket.new (:INET, :STREAM)
# remote_addr = Socket.pack_sockaddr_in (80, 'google.com')
# socket.connect (remote_addr)

Simple Read

以下の例では, 永遠にサーバは Read を待ち続けて, その先が進まない.

require 'socket'

Socket.tcp_server_loop (4481) do |connection|
  puts connection.read
  connection.close
end

Socket は指定されたデータ長のデータが到着するまで待ち続ける. デッドロックを回避するためには,

  • Client 側で データの最後で EOF を送信する.(EOF event)
  • Server 側で一度に読み込むデータ長を小さくする. (partial read)

Client のソケットが close メソッドを実行すると, その延長で EOF が通知 される.

最後に

来週からつかう知識だとだとおもうと, 知識を吸収しようという集中力が違 う.

それは, 不安だからでもある. 知識を求めるのは, 自分の無力感を感じたく ないから. 仕事が遅れて辛いおもいをしたくないから.

はたして, これからやってけるかな…

29 May 2014, 12:36

Seleniumをブラウザなしで起動するための方法を調べた

やりたいこと

Seleniumでテストを実行するとき、いちいちブラウザを立ち上げると重くて遅い。

そこで、ブラウザを立ち上げずに、 ヘッドレス(headless)にSeleniumを実行する方法を調べてみた。

Seleniumは実行するブラウザを自由にいれかえることができる。 そこで、特殊なブラウザを指定することによって実現できそうだ。

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      windows 7 64bit
    </li>
    <li>
      ruby 2.0
    </li>
  </ul>

  <p>
    環境はRuby & Windowsです。
  </p>

  <p>
    [toc]
  </p></p>
</div></p>

Base

このコードを改造する。ベースのドライバは firefox

require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"
element = driver.find_element(:name, 'q')
element.send_keys "PhantomJS"
element.submit
puts driver.title

driver.quit

HtmlUnit Driver

HtmlUnit Driverの特徴は、

  • HtmlUnit は GUI を持たない WebBrowser の Java ベースの実装
  • ava 以外の言語でこのドライバーを使用するには Selenium サーバーが必要

ということで、以下からSelenium Serverを取ってくる。 検索窓から selenium-serverと検索して、最新版のjarファイルを落とす。

コマンドラインから起動。

> java -jar selenium-server-standalone-2.39.0.jar

<p>
  <a href="http://www.storklab.com/seleniumhq.org/docs/03_webdriver.html#htmlunit-driver">この</a> ページに従って、以下のように書く。
</p>

<div class="org-src-container">
  <pre class="src src-language">driver = Selenium::WebDriver.for :remote, :url =&gt; "http://localhost:4444/wd/hub", :desired_capabilities =&gt; :htmlunit

<p>
  ページの取得は成功したけれども、検索窓を探すことができなかった。別の手段をば。
</p></p>

PhantomJS Driver

PhantomJS Driverは、No Browserなブラウザ。(意味不明)

PhantomJSの内部でGhostDriverというものを利用して、 これでNo GUIなブラウザを実現しているらしい。

以下のサイトからwindows用のバイナリをダウンロードして、 phantomjs.exeするだけ。

phantomjs.exe --webdriver=9134

<div class="org-src-container">
  <pre class="src src-language">require "selenium-webdriver"

driver = Selenium::WebDriver.for(:remote, :url => “http://localhost:9134")

driver.navigate.to “http://google.com" element = driver.find_element(:name, ‘q’) element.send_keys “PhantomJS” element.submit puts driver.title driver.quit

<p>
  また、phantom.exeに環境変数PATHを通すことで、 以下のように書くことができる。
</p>

<p>
  こうすると、 rubyスクリプト起動の延長でphantomjsを起動してportに接続してくれる。
</p>

<div class="org-src-container">
  <pre class="src src-language"># driver = Selenium::WebDriver.for(:remote, :url =&gt; "http://localhost:9134")

driver = Selenium::WebDriver.for :phantomjs

gem headless

linuxだとこういう方法もある。

Xvfbという仮想ブラウザウ利用するのでwindowsではできない。

25 May 2014, 05:37

Rubyの無名関数についての整理メモ

はじめに

Scalaで関数型プログラミングを勉強しているが、無名関数がよくわからない。

無名関数はRubyでいうところのブロックとのこと。

なので、慣れ親しんだ言語のRubyで整理してみることにした。

スタート地点

単純に、足し算について考えてみます。

# -*- coding: utf-8 -*-
# ふつうの足し算
def add2(x, y)
  x + y
end

p add2(1, 2)

# 関数の抽象
def add3(x, y)
  add2(x, y)
end

p add3(1, 2)

<p>
  ここまではさすがに理解できる。
</p></p>

ブロック渡し

無名関数

<div class="outline-text-3" id="text-3-1">
  <p>
    そもそも無名関数(Annonimous Functions)とは、 名前付けされずに定義された関数。 Function Literal(関数リテラル)、匿名関数といわれることもある。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E7%84%A1%E5%90%8D%E9%96%A2%E6%95%B0">無名関数 &#8211; Wikipedia</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-1-1" class="outline-4">
  <h4 id="sec-3-1-1">
    メリット
  </h4>

  <div class="outline-text-4" id="text-3-1-1">
    <ul class="org-ul">
      <li>
        一度しか使わない関数の名前を付けなくて済む。
      </li>
      <li>
        名前の衝突を考えなくて済む。
      </li>
      <li>
        関数の引数などに直接渡せる
      </li>
    </ul>

    <p>
      Rubyだと、無名関数はブロックで表現される。do endでも表現される。
    </p>

    <p>
      明示的に変数として表現する方法とそうでない方法がある。
    </p>

    <ul class="org-ul">
      <li>
        明示的に渡すときは、引数に&をつけて、callメソッドで呼び出す
      </li>
      <li>
        暗示的に渡すときは、yieldで呼び出す
      </li>
    </ul>

    <div class="org-src-container">
      <pre class="src src-language"># ブロック渡し(明示的)

def add5(x, y, &proc) proc.call(x, y) end

p add5(1, 2){|x, y| x + y}

ブロック渡し(暗示的)

def add6(x, y) yield(x, y) end

p add6(1, 2){|x, y| x + y}

関数値

Procedure Values。関数を値としてメモリ上に保持すること。

Rubyでは、ブロックをProcオブジェクトとして、 メモリ上に名前をつけて束縛したものが、それにあたる。

lambda, procとして表現する方法がある。callメソッドで呼び出す。

# 関数値の導入
def add4(x, y, proc)
  proc.call(x, y)
end
proc = lambda{|x, y| x + y}
p add4(1, 2, proc)

# ラムダの糖衣構文
p add4(1, 2, ->(x, y){x + y})

カリー化

そして、よく分からない概念が、カリー化。

複数の引数をとる関数を、

であるような関数にすること。

部分適用を容易にすることが可能になるというメリットがあるらしい。

# カリー化
curry = lambda{|x| lambda{|y| x + y}}
p curry.call(1).call(2)

# ラムダの糖衣構文
curry2 = ->(x){->(y) {x + y}}
p curry2.call(1)
p curry2.call(1).call(2)

# カリーの糖衣構文
curried_proc = proc.curry
p curried_proc.call(1)
p curried_proc.call(1).call(2)

実行結果

<div class="outline-text-3" id="text-5-1">
  <p>
    この結果をみると、Procオブジェクトとしてメモリ上にあることがよくわかる。
  </p>

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

#<Proc:0x007fd286805e48@sample.rb:45 (lambda)> 3 #<Proc:0x007fd286805b28 (lambda)> 3

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で問題なくインストール。

結果

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