23 Mar 2014, 09:53

クールなオブジェクト指向言語 Coolを Linux Mintにインストール

Coolは、Classroom object Oriented Languageの略。

文字通り、教育用オブジェクト指向言語。

courseraで始まったCompilerの講義でつかう。この言語で、コンパイラの仕組みを学ぶ。

Linux Mintにインストールしたメモです。

環境

  • Linux Mint 16

インストール

まずは、依存ライブラリをインストール。


sudo apt-get install flex bison build-essential csh openjdk-6-jdk libxaw7-dev

つづいて、Coolをインストール。


sudo mkdir /usr/class
sudo chown $USER /usr/class
cd /usr/class
wget http://spark-university.s3.amazonaws.com/stanford-compilers/vm/student-dist.tar.gz
tar -xf student-dist.tar.gz
ln -s /usr/class/cs143/cool ~/cool

最後にパスを通す。


export PATH=/usr/class/cs143/cool/bin:$PATH

Hello Cool

お決まりのHello Worldをしてみる。

といっても、/usr/class/cs143/examples/hello_world.cl にサンプルがある。


class Main inherits IO {
   main(): SELF_TYPE {
        out_string("Hello, World.\n")
   };
};

コンパイルして実行。


$ cp /usr/class/cs143/examples/hello_world.cl .
$ coolc hello_world.cl
$ spim hello_world.s
SPIM Version 6.5 of January 4, 2003
Copyright 1990-2003 by James R. Larus (larus@cs.wisc.edu).
All Rights Reserved.
See the file README for a full copyright notice.
Loaded: /usr/class/cs143/cool/lib/trap.handler
Hello, World.
COOL program successfully executed
Stats -- #instructions : 152
         #reads : 27  #writes 22  #branches 28  #other 75

Emacs mode

こんなのがあるらしい。未検証だけど、リンクだけはっておく。

23 Mar 2014, 07:35

Programming Mobile Applications for Android Handheld SystemsでAndoroidアーキテクチャの基礎を体系的に学んだ

Androidの学習をcourseraをつかってしました。

[//www.youtube.com/embed/szmWnKKvj9s]

内容

Lecture

<div class="outline-text-3" id="text-1-1">
  <p>
    Android開発で必要な知識を体系的に習得できる。
  </p>

  <p>
    特徴は、知識ベースの網羅的解説。 実際にアプリをつくって楽しみましょうというスタイルとは、正反対。 Androidの構成要素を、毎週少しずつ、徹底的に叩き込まれる感じだ。
  </p>

  <p>
    たくさんの知識を一気に解説してくるので、頭に入りきれない。
  </p>

  <p>
    アダム先生の話し方は、とても形式的。
  </p>

  <p>
    概念の説明、デモアプリの説明、ソースコードの説明、このサイクルが繰りかえされる。 説明のためのフレーズまで、定形的に毎回同じという徹底ぶりだ。
  </p>

  <p>
    ジェスチャーが多めで、しかも週の後半に進にしたがってジェスチャーのレベルが上がっていくのがおもしろい。
  </p>

  <p>
    スライドが白黒で地味なせいもあり、講義を一度きいても不思議とほとんど頭に入らないのが辛い。
  </p></p>
</div></p>

Assignment

<div class="outline-text-3" id="text-1-2">
  <p>
    課題に取り組むことで、知識の整理ができる感じ。課題はPDF 3枚くらいの仕様を実装して、毎週提出する。
  </p>

  <p>
    膨大なサンプルのデモコードが結構役に立つ。これはありがたい。 ネットで見つかるソースよりも、課題のサンプルのほうがやくにたつ。 このコードを見ながら、課題でコピペで使えそうな部分を探す。
  </p>

  <p>
    驚いたことに、課題はすべて自動でテストされるのだ! Robotiumという受け入れテストツールを利用しているようだ。
  </p>

  <blockquote class="twitter-tweet" lang="ja">
    <p>
      CourseraのAndroid講義、Robotiumというテスティングフレームワークを使って自動テストされる。
    </p>

    <p>
      &mdash; きつね (@tsu_nera) <a href="https://twitter.com/tsu_nera/statuses/429948312783822848">2014, 2月 2</a>
    </p>
  </blockquote>

  <p>
  </p>

  <p>
    これは、Androidが吐き出すログをパースして期待通りの結果どうか判定する。Androidテスト技術、恐るべし。
  </p>

  <p>
    あと、掲示板に先生みずから頻繁にコメントしているのもうれしい。
  </p></p>
</div></p>

感想

Android開発は期待していたほどおもしろくない、ということが分かった。 いや、おもしろいアプリをつくっていないからかもしれない、けど。

副読本として参考書も読みつつ進めた。 このAndoroidの本も、同じように網羅的なので、講義との相性はいいかも。電子書籍版を買った。

<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/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Android-Zigurd-Mednieks/dp/4873115353%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873115353' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51kRjx9TAzL._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/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Android-Zigurd-Mednieks/dp/4873115353%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873115353' rel='nofollow' target='_blank'>プログラミングAndroid</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.02.23</div><div class='amazlink-detail'>Zigurd Mednieks<br /></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/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Android-Zigurd-Mednieks/dp/4873115353%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873115353' 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%2F11570632%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D11570632%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a></div></div></div></div></div>

この講座を受けて一番よかったのは、Androidの設計思想、MvCを勉強できたことだ。 Androidというシステムのなかで、オブジェクトがいかにしてやりとりしているかが分かった。

それぞれのAPIのつかいかたは時間がたつと忘れてしまうけれども、 大枠のAndroidアーキは頭に残り、またこれからにも役立っていくだろう。

22 Mar 2014, 09:40

RSpecのテスト結果をCSVで出力する

テスト項目表をExcelで作成する必要がある。

RSpecの実行結果をExcelにコピペするための楽な方法を考えてみたメモです。

RSpecのカスタムフォーマット

RSpecには、カスタムフォーマットという機能がある。

出力のフォーマットを自分でカスタマイズするための拡張ボイント。

この機能を利用して、CSVフォーマットでテスト結果を出力してみる。

前提条件

テスト項目表には、最低限以下のような項目を書く必要があると仮定する。

  • テスト番号
  • 大項目
  • 中項目
  • 小項目
  • 期待結果
  • 実施日

これらをRSpecのテストコードに埋め込む。

実装

メタデータをspecに埋め込む

<div class="outline-text-3" id="text-3-1">
  <p>
    RSpecのメタデータに、項目の情報を残す。デフォルトのメタデータは以下で見ることができる。
  </p>

  <pre><code>

it “テストです” do # すべての要素をみる example.metadata

# 特定の項目を見る
example.metadata[:description_args]

end

  <p>
    自分でメタデータを定義するには、 it &#8221; &#8220;, のあとに ハッシュ形式で書く。
  </p>

  <pre><code>

it “ほげほげであること” , :no => “1”, :date => “2014/03/22” do end

フォーマットスクリプトを作成する

<div class="outline-text-3" id="text-3-2">
  <p>
    フォーマットスクリプトは、デフォルトのフォーマッタを継承して作成する。
  </p>

  <p>
    必要なメソッドのみをカスタマイズする。
  </p>

  <ul class="org-ul">
    <li>
      initialise(output) はじめに呼ばれる
    </li>
    <li>
      example_started(example) サンプル開始時に呼ばれる
    </li>
    <li>
      example_passed(example) テスト成功時に呼ばれる
    </li>
    <li>
      example_passed(example) テスト失敗時に呼ばれる
    </li>
    <li>
      close() 最後に呼ばれる
    </li>
  </ul>

  <p>
    ほかにも、いろいろとメソッドがあるので、公式のドキュメント参照。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://rubydoc.info/gems/rspec-core/2.6.4/RSpec/Core/Formatters/DocumentationFormatter">Class: RSpec::Core::Formatters::DocumentationFormatter — Documentation for rspec-core (2.6.4)</a>
    </li>
  </ul>

  <p>
    今回は、Documentationフォーマットを継承する。
  </p>

  <pre><code>

def initialize(output) super(output) @results = Array.new end

def example_passed(example) super(example) result = createResult(example) result[:result] = “OK” @results << result end

def example_failed(example) super(example) result = createResult(example) result[:result] = “NG” @results << result end

def close output_csv() end

コマンド実行

<div class="outline-text-3" id="text-3-3">
  <p>
    コンソールから以下を叩く。
  </p>

  <pre><code>

rspec -I ../ -I . -r csv_formatter.rb csv_format_spec.rb -f CsvFormatter

  <p>
    -f のあとに自分がつくったフォーマッタのクラス名を渡す。
  </p>

  <p>
    -r のあとに自分がつくったスクリプトを渡す。
  </p></p>
</div></p>

コード

22 Mar 2014, 07:27

RSpecでWindows-31Jの文字コードを使うときのメモ

RSpecで Windows-31Jのエンコードを扱うときにハマったので、作業メモ。

Rubyファイルのエンコードについて

Rubyでは、ファイルのエンコードを判定するために、 ファイル冒頭のマジックコメントを利用している。


UTF-8の場合
# coding: utf-8

Windows-31Jの場合
# coding: Windows-31J

エンコードのことなる関係でRubyを利用するときは注意が必要。

Rubyでは、文字列のエンコードを変換するために、以下のメソッドがある。


# 戻り値として変更
str.encode!("UTF-8")

# 上書き変更
str.encode!("UTF-8")

# エンコードを調べる
str.encoding

RSpecでのエンコード

RSpecで文字列を比較するときは、当然文字コードが期待値と結果で同一な必要がある。

specファイルもテスト対象も同一の文字コードで記述すれば比較は問題ない。

しかし、普段Emacsに結果を表示していて、その表示がUTF-8でないと文字化けしてしまう。

しかたがないので、以下のようにした。

  • specファイルは UTF-8
  • テスト対象ファイルは Windows-31J
  • specからテスト対象を呼び出すときと、結果の比較で encodeメソッドを利用する。
it "日本語" do
  line = "SCENARIO_NAME = \'こんにちは\'".encode!("Windows-31J")
  @perser.parse(line, @regexp).should == "こんにちは".encode!("Windows-31J")
end

22 Mar 2014, 05:56

RubyからExcelを操作する方法について

RubyからExcel操作をする手順について調べてみた。

RubyからExcelを操作するライブラリ

RubyからExcelやスプレットシートを操作するライブラリはいくつかあるようだ。

RubyでExcelファイルを扱うライブラリの比較 – Qiita

標準ライブラリに含まれているものは、Win32OLEというものなので、これを試す。

環境

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

Win32OLE

Win32OLE は、COM とか ActiveX などと呼ばれたりする技術を扱うためのライブラリ。

COM オブジェクトは WIN32OLE::new(ProgID)という形式で呼び出す。 Excelの場合は、ProgIDは’Excel.Application’となる。

利用できるメソッドは以下のコマンドで表示できる。

$ ruby -r win32ole -e "excel = WIN32OLE.new('Excel.Application');puts excel.ole_methods;"

Excelオブジェクトの整理

  • Application ・・・ Excelオブジェクト本体
  • WookBook ・・・ Excelワークブック
  • WookSheet ・・・ Excelワークシート
  • Range ・・・ Excelのセルやセルの集合。
  • Excelのクラスの説明

やることリスト

  • xlsx拡張子の既存ファイルを開く
  • 既存ファイルから情報を読みこむ
  • 既存ファイルから情報を書き込む
  • ファイルを保存する

ファイルオープン

<div id="text-2-1" class="outline-text-3">
  <p>
    Win32OLEを利用するには、wiin32oleをrequireする。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">require <span style="color: #e6db74;">'win32ole'</span>

<div id="outline-container-sec-2-1-1" class="outline-4">
  <h4 id="sec-2-1-1">
    Applicationオブジェクト
  </h4>

  <div id="text-2-1-1" class="outline-text-4">
    <p>
      excelオブジェクト
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">Excelオブジェクト生成</span>

excel = WIN32OLE.new(‘Excel.Application’) # FileSystemObject生成 fso = WIN32OLE.new(‘Scripting.FileSystemObject’) # デバッグ用表示 excel.visible = DEBUG_SHOW

<div id="outline-container-sec-2-1-2" class="outline-4">
  <h4 id="sec-2-1-2">
    WorkBookオブジェクト
  </h4>

  <div id="text-2-1-2" class="outline-text-4">
    <p>
      bookオブジェクトを作成してファイルを開く。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">指定したファイルを開く</span>

book = excel.Workbooks.Open(fso.GetAbsolutePathName(FILE_PATH))

<div id="outline-container-sec-2-1-3" class="outline-4">
  <h4 id="sec-2-1-3">
    WorkSheetオブジェクト
  </h4>

  <div id="text-2-1-3" class="outline-text-4">
    <p>
      シートの取得方法は以下。コレクションに従った記法もできるところが嬉しい。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">一番左のシートを取得</span>

sheet = book.Worksheets(1)

# シート名が “Sheet1” のシートを取得 sheet = book.Worksheets(“Sheet1”)

# bookに属するそれぞれのSheetについて操作 book.Worksheets.each {|sheet| puts sheet.Name }

    <ul>
      <li>
        <a href="http://d.hatena.ne.jp/maluboh/20070708#p1">2007-07-08 &#8211; まるぼ~の日記</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-2-1-4" class="outline-4">
  <h4 id="sec-2-1-4">
    Rangeオブジェクト
  </h4>

  <div id="text-2-1-4" class="outline-text-4">
    <p>
      セルにアクセスする方法は以下。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">D5にアクセス</span>

cell = sheet.Cells.Item(4, 5) cell = sheet.Cells.Item(“5”, “D”) cell = sheet.Range(“D5”)

    <p>
      eachを利用してうまく処理するのがRubyをつかういいところ。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">列ごとに処理</span>

sheet.UsedRange.Rows.each do |row| # セルごとに処理 row.Columns.each do |cell| end end

# A1 ~ A5 を取得する方法 cells = sheet.Range(“A1:A5”) cells.each do |cell| end

指定したセルの読み書き

<div id="text-2-2" class="outline-text-3">
  <p>
    Valueメソッドで値を書き換える
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">値の読み込み</span>

puts cell.Value

# 値の書き込み cell.Value = “HogeHoge”

ファイルを保存する

<div id="text-2-3" class="outline-text-3">
  <p>
    saveメソッドで上書き保存ができる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">book.save

  <p>
    Excel操作中に異常終了してしまうと、プロセスが残ってしまう。 Rubyの例外処理の仕組みをつかうのがTips
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">  <span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">始め処理</span>

begin # 行いたい処理 sheet = book.Worksheets(1) sheet.Cells.Item(2, “C”).Value = “HogeHoge” ensure # 終わり処理 book.Close excel.Quit end

結果

Links

17 Mar 2014, 12:20

How to write a code like English(英文のようにプログラミングをする方法)

英語の文章のようにプログラミングをする方法についてのまとめです。

はじめに書いておくと、今回の記事の元ネタは以下の2つです。

[toc]

メソッド名と引数は文法にこだわるべし

まずは、オブジェクト指向と英語の5文型との関係性について。

S(Subject主語)はオブジェクト、V(Verb動詞)はメソッドに対応する。

第1文型 S + V

<div class="outline-text-3" id="text-1-1">
  <p>
    第一文型は、S+V。 誰・何は、どうする、SはVする。
  </p>

  <p>
    Vには、自動詞が使われる。主語と動詞で文が完結する。
  </p>

  <p>
    go、wait、start、listen、work, begin, come
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V # 自動詞 end end

  <p>
    第一文型の動詞には、前置詞+名詞の形をした副詞句が続くことが多い。
  </p>

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    前置詞をメソッド名に、名詞を第一引数にするべし。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def go_to(place) end

def wait_for(girlfriend) end

def live_in(town) end end

第2文型 S + V + C

<div class="outline-text-3" id="text-1-2">
  <p>
    第2文型は、S+V+C。 誰・何は、なんだ。S=Cの関係がなりたつもの。
  </p>

  <p>
    形容詞と名詞がCになる。Vには、大抵be動詞がくる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V(C) # be動詞 + 形容詞 end end

  <p>
    しかし、be動詞をメソッドにするには具体性がない。
  </p>

  <p>
    be動詞以外で動詞にくる名詞を以下に列挙。
  </p>

  <ul class="org-ul">
    <li>
      状態系 be, look, seem, keep, remain
    </li>
    <li>
      変化系 become、get, turn, go
    </li>
    <li>
      感覚系 feel、sound、
    </li>
    <li>
      <a href="http://www.elm-lab.com/CCP040.html">第2文型をとる動詞</a>
    </li>
  </ul>

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    第一引数に状態を入れるべし。
  </p></p>
</div></p>

第3文型 S + V + O

<div class="outline-text-3" id="text-1-3">
  <p>
    第3文型は、S+V+O。SはOをVする。Vは他動詞。Oは目的語。
  </p>

  <p>
    Objective、Objectiveですよ!Objective!大事なことは3回書きます。
  </p>

  <p>
    つまり、Oはオブジェクトがくる。オブジェクト指向万歳。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V(O) # 他動詞 + オブジェクト end end

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    オブジェクトか名詞を引数にするべし。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def study(@ruby) end

def read(aBook) end end

  <p>
    しかし、Oにくるものはなにも名詞ばかりでない。
  </p>

  <p>
    不定詞(to xxx)、動名詞(xxxing)、名詞句、名詞節もOとなり得る。 このケースはメソッドの引数とするにはすこし難しいな。
  </p></p>
</div></p>

第4文型 S + V + O + O

<div class="outline-text-3" id="text-1-4">
  <p>
    第4文型は、S+V+O(人)+O(物)。Sは
  </p>

  <p>
    ボイントは1つめのOは人、2つめは物。
  </p>

  <p>
    give, show, send, buy
  </p>

  <p>
    人というのは、モジュールに置き換えるのがよい。
  </p>

  <p>
    xxxManager, xxxListener, xxxController, xxxObserver&#x2026;.etc.
  </p>

  <p>
    オブジェクト間のやりとりでつかえる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def send(@Manager, @message) end

def give(@girlfriend, @present) end end

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    第一引数をやりとり先のオブジェクト、第二引数をデータにするべし。 英語を意識するならば、順番にこだわるべし。
  </p>

  <p>
    ちなみに、第三文型と第四文型は、変換可能。
  </p>

  <p>
    Tom shows hoge to him. / Tom shows him hoge.
  </p>

  <p>
    前置詞がともなうと引数の形にしずらいので、 第4文型として引数を2つとるほうが英語っぽい。
  </p></p>
</div></p>

第5文型 S + V + O + C

<div class="outline-text-3" id="text-1-5">
  <p>
    第5文型は、「S+V+O+C」(主語+動詞+目的語+補語)。O = Cの関係がなりたつ。
  </p>

  <p>
    第ニ文型との対比に注意。第二文型はS=Cだが、5はO=Cの関係。
  </p>

  <p>
    Oには、オブジェクトがくる。Cには状態がくる。 Sオブジェクトの指示でOの状態を変化させる。
  </p>

  <p>
    make, call, appoint, drive, find, keep, turn, notice,
  </p>

  <p>
    こうやって、動詞をならべてみると、実際に利用できそうなものはあまりないな。
  </p></p>
</div></p>

メンタルマッピングを避けるべし

メンタルマッピングとは、あたまの中での対応付け。 コードの中で、変数名はなにかを略されることがおおい。

cntl -> controller, mgr -> manager, sn -> serial number

しかし、略すと英語として読み取れなくなる。よって、メンタルマッピングには反対だ。

コメントを書く代わりにメソッドの抽出をするべし

コメントはコードを雑然させる。そして、度々間違っている。

こんなときはコメントを書く代わりに、その部分を戻り値なしのメソッドに抽出する。

たとえば、

// ソートする。
for(int i=0; i < 9; i++) {
  for( int j=i+1 i < 10 ; j++)
     if( a[i] > a[j] ) {
        swap(i, j);
     }
  }
}

<p>
  これはこうリファクタリングする。
</p>

<div class="org-src-container">
  <pre class="src src-C++"><span style="color: #66d9ef; font-weight: bold;">void</span> <span style="color: #a6e22e;">sort</span>(<span style="color: #66d9ef; font-weight: bold;">Data</span> *<span style="color: #fd971f;">a</span>) {

// ソートする。 for(int i=0; i < 9; i++) { for( int j=i+1 i < 10 ; j++) if( a[i] > a[j] ) { swap(i, j); } } }

<p>
  メソッド名を文章にすることで、コードが文章に近づくのだ。素晴らしいテクニック。
</p></p>

if, else, while文は一行で書くべし

if, else, whileを一文で書くことで、より英語の文章に近づく。

if (isdangerous())
  stopApplication();
else
  restartAplication();

<p>
  この際、条件式もメソッドに抽出する。
</p>

<p>
  javaでは is(条件)、rubyでは(条件)?というスタイルが好まれる。
</p></p>

説明的変数を導入すべし

説明的変数を導入すると、可読性が上がる。

ぐちゃぐちゃした論理は説明的変数またはメソッド抽出でわかりやすい文章に変える。

bool isSuccess = (条件1) && (条件2) && (条件3) || (条件4)

<p>
  ここでも、if文を一行にまとめるという規則と合わせると、より文章らしくなる。
</p>

<div class="org-src-container">
  <pre class="src src-C++"><span style="color: #f92672; font-weight: bold;">if</span> (isSuccess())

startMusicAndSingingASong();

まとめ

英語のようにコーディングするにあたって、最大の関心事が、「実行速度」だ。

メソッドを細かくすると、それだけ遅くなるのではないか?

大丈夫、コンパイラは進化しているので、細かいメソッド分割はコンパイラによって最適化される。詳しくは以下参照。

本当にコンパイラを信じていいの?迷信ではないか?

いや、実のところ、自分でも不安だ。どこかに書いてあったことをそのまま信じてだけだ。自信がない。

じゃあ、ということで、コンパイラについて勉強してみよう。今日から始まる courseraの コンパイラの講義に挑戦だ!

14 Mar 2014, 12:05

C言語の二重インクルード(多重インクルード)防止について

C言語のヘッダファイルでおまじないのように書いているコレ。

#ifndef  _FOO_H_
#define  _FOO_H_

#endif

インクルードガードという。いったいなんなのか調べた。

無限ループ防止

互いのヘッダファイルをインクルードしあうと、コンパイル時に無限ループに陥る。

foo.h

#include "bar.h"

bar.h

#include "foo.h"

実行結果

<div class="outline-text-3" id="text-1-1">
  <div class="org-src-container">
    <pre class="src src-language">  $gcc foo.c bar.c
 ... 
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from foo.c:2:

foo.h:1:17: error: #include nested too deeply #include “bar.h”

構造体のコンパイルエラー

一つの.hにある構造体を二つの.cでインクルードすると、コンパイルエラーが発生する仕様。

foo.h

struct test{
  int test;
};

bar.c / foo.c

#include "foo.h"

実行結果

<div class="outline-text-3" id="text-2-1">
  <pre><code>

% gcc bar.c foo.c In file included from bar.c:3:0: foo.h:2:8: error: redefinition of ‘struct test’ struct test{ ^ In file included from bar.h:4:0, from bar.c:2: foo.h:2:8: note: originally defined here struct test{

progma onceについて

インクルードガードを実現するためのコンパイラの仕組みに、#pragma onceというのがある。

ヘッダファイルの先頭に以下を記述するだけ。

#pragma once

#ifndefは別の機能をたまたま応用にしているに過ぎないが、 #pragma onceは機能としてあるので直接的。

Links

08 Mar 2014, 06:33

Rubyでステートマシンを実装してみる

前回、ステート・パターンをRubyで実装してみた。

これを機に、ステート・マシンもちゃんと実装まで学んでおこうとおもう。

ステート・マシンとは

ステート・マシンとは、システムの振る舞いの仕組み。

ステートマシン図とは、それをUML記法で表したもの。

ステート・マシンの構成要素

ステート・マシンの構成要素は以下のとおり。

  • 状態(State) ・・・なんて定義してよいやら。
  • 遷移(Transition)・・・ひとつの状態から別の状態へ移行すること

遷移はさらに以下の3つに分解できる。

  • イベント(Event) ・・・遷移のきっかけ、トリが
  • ガード(guard) ・・・遷移するための条件(true/false)
  • アクション(Action) ・・・遷移時の動作

以下のように記述する。

Event[Guard]/Action

また、状態に関係する動作をアクティビティという。アクションは遷移に関係する。

do/Activity

UML図

以下のようなステート・マシンをRubyで実装する。

rubytk_state_machine.png

<p>
  前回は自分のステータスをもとに振る舞いを変更したけれども、 今回は、別プロセスの状態によって、振る舞いを変えるようにしてみる。
</p>

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

実装

08 Mar 2014, 01:00

EmacsからPlantUMLを便利につかう方法

EmacsからPlantUMLをつかう方法を調べた。

手順はここにある。

いかんせん、わかりにくかったので、自分でも作業メモを残そうと思う。

ob-plantuml.el

Emacs内でplantumlをコンパイルするには、ob-plantuml.elをつかう。

これは、24.1以降のバージョンだとbuild-inされているのでとくにインストールは不要。

以下のサイトを参考に、init.elに以下を記述。

(setq org-plantuml-jar-path "/usr/share/plantuml/plantuml.jar")
(defun org-mode-init ()
  (org-babel-do-load-languages
   'org-babel-load-languages
   (add-to-list 'org-babel-load-languages '(plantuml . t))))
(add-hook 'org-mode-hook 'org-mode-init)

使用例

org-modeで書いているドキュメントの中で以下のようなコードを書く。

C-c, C-e h oで Org文書をHTML変換する。 このときに、plantumlからUML図の生成も行われる。

Code

<div class="outline-text-3" id="text-2-1">
  <pre><code>

#+BEGIN_SRC plantuml :file sample.png :cmdline -charset UTF-8 Alice -> Bob: Authentication Request Bob –> Alice: Authentication Response #+END_SRC

<div class="outline-text-3" id="text-2-2">
  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-sample2.png" alt="sample.png" />
    </p></p>
  </div></p>
</div></p>

plantuml-mode.el

plantumlを書くためのモードもあります。package.elからインストールした。

(require 'plantuml-mode)
(add-to-list 'auto-mode-alist '("\\.puml$latex " . plantuml-mode))
(add-to-list 'auto-mode-alist '("\\.plantuml$" . plantuml-mode))

<p>
  最近は、ブログの記事をorg-modeで書いているので、これでブログ執筆が便利になった。
</p>

<ul class="org-ul">
  <li>
    <a href="http://zhangweize.wordpress.com/2010/08/25/creating-uml-images-by-using-plantuml-and-org-babel-in-emacs/">Creating uml images by using plantuml and org-babel in emacs | zwz&#8217;s Blog</a>
  </li>
</ul>

06 Mar 2014, 13:09

簡潔さは力なり!Rubyでステートパターン(State Pattern)を実装する

Rubyでステートパターンを勉強したので、その学習メモです。

サンプルは前回の記事を発展させたもの。

ステート・パターンとは

状態遷移をわかりやすく実装するためのパターン。

各状態をクラスで定義する。各状態は、抽象的なスーパークラスのサブクラスになる。

Spec

以下のような仕様を実装したい。

停止中に再生ボタンをクリックと動作中を表示
停止中に停止ボタンをクリックとなにも表示しない
動作中に再生ボタンをクリックと一時停止を表示
動作中に停止ボタンをクリックと停止を表示
一時停止中に再生ボタンをクリックする動作中を表示
一時停止中に停止ボタンをクリックする停止中を表示

状態は、停止中、一時停止中、実行中の3つ。この3つをクラスにする。

実装比較

普通の実装

<div class="outline-text-3" id="text-3-1">
  <p>
    if文が多いですね。
  </p>

  <p>
  </p>

  <p>
    ここで、さらにBoot中、Shutdown中なんて2つの状態追加がはいったらなかなか死ねます。
  </p></p>
</div></p>

パターン適用後

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

感動のボイント

感動のポイントをアピール。自分はここに感動した。


  def start

    if (@status == OFFLINE)
      @status = ONLINE
      @textValue = "動作中"
      return
    end

    if (@status == ONLINE)
      @status = SUSPEND
      @textValue = "一時停止中"
      return
    end

    if (@status == SUSPEND)
      @status = ONLINE
      @textValue = "動作中"
      return
    end
  end

  def stop

    if (@status == ONLINE)
      @status = OFFLINE
      @textValue = "停止中"
      return
    end

    if (@status == SUSPEND)
      @status = OFFLINE
      @textValue = "停止中"
      return
    end
  end

  def start
    @status = @status.start
  end

  def stop
    @status = @status.stop
  end

なんという簡潔さだろうか!ふるえちゃう。