01 Mar 2014, 05:47

Rubyのコードをripperでパースする方法

Rubyのコードをパースしたい。 自前で正規表現をつくったり、strscanでゴリゴリ解析するのは工数不足そう。

ということで、Rubyのコードを字句解析するのためのツールをしらべた。

Ruby標準ライブラリのなかの以下の2つが利用できそうだ。

それぞれ、つかってみる。

やりたいこと

とりあえず、こんなことができればOK.

  • クラスの定数を抜きだし
  • メソッドに含まれるメソッドとその引数の抜きだし

解析対象

今回の解析対象Rubyコードは以下。


TEST  = "test"
TEST2 = "test2"

def method1
  foo(1, 2,"Hello")
  bar(1, 2,"Hello")
end

def method2
  bar(5, 6,"Hi")
  foo(3, 4,"Hi")
end

def foo(val1, val2, str)
end

def bar(val1, val2, str)
end

rdoc

rdocはRubyのドキュメント生成のためのツールだけれども、Rubyコード解析用のライブラリもあるみたい。

そういえば、このまえ記事にしたrspec-kickstarterも rdocでrspecを解析しているっぽい。

コマンドラインから以下を実行すると、カレントディレクトリのコードを解析してHTMLを生成してくれる。

rdoc .

こんな感じ。ちゃんとメソッドと定数が抜き出せている。

どうも、引数は抜き出せなさそう。調査不足かもしれないが、採用は却下。

ripper

Rubyのコード解析をするための標準ライブラリ。

トークン指向型解析(tokenize)

<div class="outline-text-3" id="text-4-1">
  <p>
    文字列を単語に分解してくれる。
  </p></p>
</div>

<div id="outline-container-4-1-1" class="outline-4">
  <h4 id="sec-4-1-1">
    sample code
  </h4>

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

require ‘ripper’

File.open(“./sample.rb”) do |io| io.each_line do |line| p Ripper.tokenize(line) end end

<div id="outline-container-4-1-2" class="outline-4">
  <h4 id="sec-4-1-2">
    実行結果
  </h4>

  <div class="outline-text-4" id="text-4-1-2">
    <pre><code>["TEST", "  ", "=", " ", "\"", "test", "\"", "\n"]

[“TEST2”, “ “, “=”, “ “, “\“”, “test2”, “\“”, “\n”] [”\n”] [“def”, “ “, “method1”, “\n”] [” “, “foo”, “(”, “1”, “,”, “ “, “2”, “,”, “\“”, “Hello”, “\“”, “)”, “\n”] [” “, “bar”, “(”, “1”, “,”, “ “, “2”, “,”, “\“”, “Hello”, “\“”, “)”, “\n”] [“end”, “\n”] [”\n”] [“def”, “ “, “method2”, “\n”] [” “, “bar”, “(”, “5”, “,”, “ “, “6”, “,”, “\“”, “Hi”, “\“”, “)”, “\n”] [” “, “foo”, “(”, “3”, “,”, “ “, “4”, “,”, “\“”, “Hi”, “\“”, “)”, “\n”] [“end”, “\n”] [”\n”] [“def”, “ “, “foo”, “(”, “val1”, “,”, “ “, “val2”, “,”, “ “, “str”, “)”, “\n”] [“end”, “\n”] [”\n”] [“def”, “ “, “bar”, “(”, “val1”, “,”, “ “, “val2”, “,”, “ “, “str”, “)”, “\n”] [“end”, “\n”]

    <p>
      tokenizeの他には、sexp(S式)、lexer(位置情報つき)がある。
    </p>

    <ul>
      <li>
        <a href="http://ruby-doc.org/stdlib-2.0.0/libdoc/ripper/rdoc/Ripper.html">Class: Ripper (Ruby 2.0.0)</a>
      </li>
    </ul>
  </div></p>
</div></p>

イベントドリブン型解析

<div class="outline-text-3" id="text-4-2">
  <p>
    特定の構文に出会うたびに、イベントハンドラがコールされる。 on_XXXで定義する。XXXの部分には、Ripper:EVENTSでとれる値が入る。
  </p>

  <pre><code>pp Ripper::EVENTS

  <ul>
    <li>
      <a href="https://gist.github.com/tsu-nera/9272622">https://gist.github.com/tsu-nera/9272622</a>
    </li>
  </ul>

  <p>
    ripper-tagsのソースコードとかも、使い方の勉強になる。
  </p>

  <ul>
    <li>
      <a href="https://github.com/tmm1/ripper-tags">https://github.com/tmm1/ripper-tags</a>
    </li>
  </ul>
</div></p>

ripper つかってみる

S式配列を取得する

<div class="outline-text-3" id="text-5-1">
  <p>
    イベントドリブン型でsample.rbをパースしてみる。 まずは、以下のようなコードでS式の配列を出力する。
  </p>

  <pre><code>

require ‘ripper’ require ‘pp’

File.open(“./sample.rb”) do |io| pp Ripper.sexp(io) end

  <p>
    ずらずらとS式の配列が現れる。
  </p>

  <pre><code>

[:program, [[:assign, [:var_field, [:@const, “TEST”, [1, 0]]], [:string_literal, [:string_content, [:@tstring_content, “test”, [1, 9]]]]], [:assign, [:var_field, [:@const, “TEST2”, [2, 0]]], [:string_literal, [:string_content, [:@tstring_content, “test2”, [2, 9]]]]], [:def, [:@ident, “method1”, [4, 4]], [:params, nil, nil, nil, nil, nil, nil, nil], [:bodystmt, [[:method_add_arg, [:fcall, [:@ident, “foo”, [5, 2]]], [:arg_paren, [:args_add_block, [[:@int, “1”, [5, 6]], [:@int, “2”, [5, 9]], [:string_literal, [:string_content, [:@tstring_content, “Hello”, [5, 12]]]]], false]]], [:method_add_arg, [:fcall, [:@ident, “bar”, [6, 2]]], [:arg_paren, [:args_add_block, [[:@int, “1”, [6, 6]], [:@int, “2”, [6, 9]], [:string_literal, [:string_content, [:@tstring_content, “Hello”, [6, 12]]]]], false]]]], nil, nil, nil]],

  <p>
    @という記号の後にイベント名っぽいものがある。 パースしたいキーワードの近くにあるイベント名っぽいものをXXXとして処理を書いていく。
  </p>

  <p>
    以下のようなことをする。
  </p>

  <ul>
    <li>
      定数を抽出
    </li>
    <li>
      定義されているメソッドをインデックスとする配列を作成
    </li>
    <li>
      配列の要素にcallされているメソッドをキー、引数をvalとするハッシュを作成。
    </li>
  </ul>
</div></p>

結果

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

まとめ

はじめに使い方を覚えるのに苦労した。

一度分かってしまえば正規表現でパースするよりも簡単そうだ。

23 Feb 2014, 11:32

英語でのビジネスメールの書き方まとめ

英語でメール書くのが難しすぎるので、英語でメールを書くポイントをまとめてみた。気がついたらその度に追記予定。

[toc]

テンプレート


Dear xxx

[自己紹介 or 軽い挨拶]

[要件]

The following are the details.

[要件の詳細]

Regards,
hogehoge

件名

とりあえず全部暗記。

  • お礼 Thank you for…
  • 質問 Question about…
  • 要求 Request about/for
  • 問い合わせ Inquiry about/for
  • 催促 Reminder
  • 重要 Urgent

メールの冒頭

アメリカ式とイギリス式がある。アメリカは: イギリスは,

改まった間柄や初めてメールを送る相手の場合

<div class="outline-text-3" id="text-3-1">
  <ul class="org-ul">
    <li>
      アメリカ: Dear Mr. hogehoge:
    </li>
    <li>
      イギリス: Dear Mr. hogehoge,
    </li>
  </ul>
</div></p>

ちょっと親しい場合

<div class="outline-text-3" id="text-3-2">
  <p>
    Dear hogehoge: または、Dear hogehoge,
  </p>

  <p>
    もっと親しい場合は、Hello,Hiなども。
  </p></p>
</div></p>

不特定多数

<div class="outline-text-3" id="text-3-3">
  <p>
    こんな表現も覚えときたい。
  </p>

  <ul class="org-ul">
    <li>
      関係各位 :To whom it may concern,
    </li>
    <li>
      みなさま :Dear all, Hi everyone,
    </li>
  </ul>

  <p>
    (参考)<a href="http://www.zkai.co.jp/ca/g/english/mail_lesson.html">「英文メールの書き方」10分間レッスン|ビジネス英語|キャリアアップコース</a>
  </p></p>
</div></p>

自己紹介

とりあえず自己紹介を覚える。

My name is hogehoge(名前) of hugahuga(所属).

Thank you for your e-mail of March 14. (3月14 日付のメールをありがとうございました)

書き出し

結論から述べるのが、ビジネスメール。

要件を伝える

<div class="outline-text-3" id="text-5-1">
  <ul class="org-ul">
    <li>
      I am writing this email because I&#8217;d like to
    </li>
    <li>
      This e-mail is about ~
    </li>
  </ul>
</div></p>

質問する

<div class="outline-text-3" id="text-5-2">
  <ul class="org-ul">
    <li>
      I have questions about ~
    </li>
    <li>
      Let me ask(know) about
    </li>
    <li>
      I&#8217;d like to know more about ~
    </li>
  </ul>
</div></p>

要求する

<div class="outline-text-3" id="text-5-3">
  <ul class="org-ul">
    <li>
      It would be great if you could ~
    </li>
    <li>
      I&#8217;d appreciate it if you could ~
    </li>
    <li>
      I was wondering if you could ~.
    </li>
    <li>
      <a href="http://www.alse-net.com/column/email-reibun.htm">英文Eメール &#8211; 定型文・例文</a>
    </li>
  </ul>
</div></p>

詳細は以下

結論のあとに詳細を述べる。

  • details are as below , as follows , the following
  • here is a details/The following are the details.
  • xxx is written below.
  • this is a xxx

メールの末尾

初めてメールをやりとりする場合

<div class="outline-text-3" id="text-7-1">
  <p>
    Regardsが鉄板。取り合えず、Regards。
  </p>

  <pre><code>Regards,

hogehoge

ちょっと親しい場合

<div class="outline-text-3" id="text-7-2">
  <p>
    面識がある人のみに使う。
  </p>

  <pre><code>Kind regards,

hogehoge

Best regards, hogehoge

  <p>
    Thank you, thanksなどは気軽。
  </p>

  <p>
    以下のルールがあるようだ。
  </p>

  <p>
    1.先頭の一文字を大文字する 2.最後にコンマをつける 3.名前を伴って使う
  </p>

  <p>
    (参考)<a href="http://english-columns.weblio.jp/archives/=1034">ビジネスメールを送る場合の基本的なルール:文末や語尾に使われる結語</a>
  </p></p>
</div></p>

その他、覚えておきたい表現

了解しました

<div class="outline-text-3" id="text-8-1">
  <ul class="org-ul">
    <li>
      「了解」「了解しました」 内容を確認したことだけを伝える簡単な表現
    </li>
  </ul>

  <pre><code>Noted.

  <ul class="org-ul">
    <li>
      相手の依頼を受けて「当然そうしますとも」「もちろんです」と言う場合の返事(丁寧な表現でもある。)
    </li>
  </ul>

  <pre><code>    Absolutely.
Certainly.

  <ul class="org-ul">
    <li>
      了解しました、大丈夫ですの意
    </li>
  </ul>

  <pre><code>    That would be fine.

  <ul class="org-ul">
    <li>
      理解しました」
    </li>
  </ul>

  <p>
    あなたの言う意味がわかりますよ、と状況に理解を示す場合
  </p>

  <pre><code>    I get the point.
I understand.

  <ul class="org-ul">
    <li>
      「わかりました」「わかった」と内容を確認、理解したと伝えたい場合の簡単な返事
    </li>
  </ul>

  <pre><code>    Okay.
All right.
Understood.

  <ul class="org-ul">
    <li>
      <a href="http://english-columns.weblio.jp/archives/=974">英語のビジネスメールで「了解」「了解しました」「理解しました」「わかった」「分かりました」(わかりました)と言いたい時の表現:「noted」など | 英語の勉強コラム</a>
    </li>
  </ul>
</div></p>

婉曲表現

<div class="outline-text-3" id="text-8-2">
  <p>
    柔らかい表現で、要求事項を伝える。重要!
  </p>

  <ul class="org-ul">
    <li>
      if I may(可能であれば)
    </li>
    <li>
      if you like(よろしければ)
    </li>
    <li>
      Unfortunately(残念ながら)
    </li>
    <li>
      It’s really too bad, but(誠に残念ですが)
    </li>
  </ul>

  <p>
    (参考)<a href="http://waiwaienglish.com/mailwriting-3677.html">英語でメールを書く時に使い回しができる超便利な英語の8つの定型文 | わいわい英会話</a>
  </p></p>
</div>

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

  <div class="outline-text-4" id="text-8-2-1">
    <p>
      Wouldを極める。Couldでもいい。
    </p>

    <ul class="org-ul">
      <li>
        I was hoping you would be able to shed some light on ~
      </li>
      <li>
        Would it be possible for you to ~ ?
      </li>
      <li>
        wouldn&#8217;t it be better if ~ ?
      </li>
      <li>
        I would like to have your permission to ~
      </li>
      <li>
        Please allow me to ~
      </li>
      <li>
        I am wondering if you could ~
      </li>
      <li>
        would rather ~
      </li>
      <li>
        would like to ~
      </li>
    </ul>

    <p>
      (参考) <a href="http://blog.iknow.jp/posts/529">英文ビジネスメールで即使える!英語の丁寧な表現をマスターしよう! | iKnow! BLOG</a>
    </p>

    <p>
      appreciateはthank you よりも丁寧。
    </p>

    <ul class="org-ul">
      <li>
        I would appreciate it if
      </li>
    </ul>

    <p>
      - Any information would be appreciated.
    </p>

    <p>
      apologizeはSorryよりも丁寧。
    </p>

    <ul class="org-ul">
      <li>
        I apologize for/that
      </li>
    </ul>

    <p>
      (参考) <a href="http://blog.iknow.jp/posts/529">英文ビジネスメールで即使える!英語の丁寧な表現をマスターしよう! | iKnow! BLOG</a>
    </p></p>
  </div></p>
</div></p>

22 Feb 2014, 01:00

マルチパラダイム言語Ozの開発環境MozartをインストールしてHelloWorldするまで

edXでコンピュータプログラミングのパラダイムについての学習を始めた。

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

学習のための言語として、コースではOzというマルチパラダイムな言語を利用する。

この記事では、Ozとその開発環境であるMozartの導入をメモする。

インストール

事前準備

<div id="text-1-1" class="outline-text-3">
  <p>
    まずは、以下をインストール
  </p>

  <ul class="org-ul">
    <li>
      tk-dev
    </li>
    <li>
      emacs
    </li>
  </ul>

  <pre><code>sudo apt-get install tk-dev

>sudo apt-get install emacs

Mozart2をインストール

<div id="text-1-2" class="outline-text-3">
  <p>
    以下からバイナリを落とす。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sourceforge.net/projects/mozart-oz/files/v2.0.0-alpha.0/">Mozart-Oz Programming System &#8211; Browse /v2.0.0-alpha.0 at SourceForge.net</a>
    </li>
  </ul>

  <p>
    githubに開発版もあるのでlinkをはっておく。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/mozart/mozart2#downloads">https://github.com/mozart/mozart2#downloads</a>
    </li>
  </ul>

  <p>
    解凍して、適当なところに配置。その後binディレクトリにパスを通す。ここでは、.zshenvに以下を追記
  </p>

  <pre><code>export PATH=/opt/mozart/bin:$PATH

  <p>
    端末から$oz と起動してemacsが起動すればOK. $oz -nwで端末から開ける。
  </p>
</div>

Hello World

おきまりのHello Worldはこんな感じ。

{Browse 'Hello World'}

この行を選択して、M-x oz-feed-regionを実行すると、ブラウザが立ち上がり、Hello Worldが表示される。

oz-mode

Emacs環境のカスタマイズ。以下のようなショートカットが使えるらしいが、自分の環境ではうごかない。

C-. C-lFeed current line現在行をフィードする
C-. C-rFeed selected region選択範囲をフィードする
C-. C-bFeed whole buffer全バッファをフィードする

ということで、別のショートカットを割り当てた。

(add-hook 'oz-mode-hook
  (lambda () 
    (define-key oz-mode-map "\C-c\C-b" 'oz-feed-buffer)
    (define-key oz-mode-map "\C-c\C-l" 'oz-feed-line))
    (define-key oz-mode-map "\C-c\C-r" 'oz-feed-region)))

すべてのショートカットは以下。

環境変数OZEMACSに利用するemacsが設定できるらしい。 しかし、emacsclientは設定できなかった。

ドキュメント

日本語の情報がすくないけど、以下のベージが参考になる。

参考書はこれしか知らない。

 

21 Feb 2014, 15:36

海外にメールを出した

今週は、仕事ではじめて海外にメールを出した。しかも4通。

メール一通書くのにものすごく時間がかかる。そして、送信し終わったあとは、手の冷や汗がものすごい。

了解しました、ということを書くために10分悩んだり。結局、Sureと書いた。

華々しきデビューのメールの内容が、

「このAPIつくれません。諦めていいですか?」

という、いきなり敵対心むき出しな内容だったけれども、

「いらないよ~」

という、やさしい返答をもらってうれしかった。

思い出にのこる出来事なので、ブログに書いとく。

21 Feb 2014, 15:19

EmacsでRSpec環境をめちゃガチャパワーアップしたまとめ

はじめに

Emacs環境でのRSpec環境を強化しようと思った。

結果的にはEmacsうんぬんとあまり関係なく、 尻すぼみになってしまったけど、まあいいや。

これは前回の記事の続編。

環境

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Emacs 24.3.1
    </li>
    <li>
      Ruby 2.1.0
    </li>
  </ul>

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

rspec-mode

まずは定番のrspec-modeを導入。

(require 'rspec-mode)
(eval-after-load 'rspec-mode
  '(rspec-install-snippets))

RSpec関係のショートカットを実行すると Could not determine the project root.とでてしまう。

以下を参考にして、空Rakefileを作成する。おまじないも書く。

(custom-set-variables '(rspec-use-rake-flag nil))
(custom-set-faces )

これでショートカットが動く。

C-c , v RSpec実行
C-c , s カ-ソルが当たっているサンプルを実行
C-c , t Specとソースを切り替える

rspecを実行したときのバッファが主張しすぎだと思う場合は、popwinで調整。

(push '("*rspec-compilation*" :regexp t) popwin:special-display-config)

yasnippet

rspec用の yasnippetを導入する。これで入力が楽になる。

git clone git@github.com:gary/yasnippets-rspec.git

とりあえず githubから落としてきて、ruby-modeのフォルダに突っ込んだ。 なんか、やりかたが違う気がするけど。。。

auto-test

保存時にRSpecを自動で動かすためのツール。

まずは、autotestを入れる。

gem install ZenTest

libにテスト対象コード、specにテストコードを入れる。 プロジェクトルートにautotestというディレクトリをつくり、 そのなかにdiscover.rbを作成。

プロジェクトルートで autotestを起動。テストを編集して、勝手にテストが走れば成功。

mkdir autotest
echo 'Autotest.add_discovery { "rspec2" }' > autotest/discover.rb
autotest

カラー表示

<div class="outline-text-4" id="text-4-0-1">
  <p>
    ~/.rspecをつくると、rspecがカラーになる。
  </p>

  <pre><code>/.rspec

–format nested –color

デスクトップ通知

<div class="outline-text-4" id="text-4-0-2">
  <p>
    autotest/discover.rbに以下を書くと、テストの成功時、失敗時のアクションが定義できる。
  </p>

  <pre><code>Autotest.add_hook :green do

end

Autotest.add_hook :red do end

  <p>
    たとえばLinux Mintだと、notify-sendコマンドを使えばデスクトップ通知が可能だ。notify-sendのインストールは以下の過去記事参照。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2160">GTDの規律に従い生産性Up!!3分後にデスクトップ通知と音を鳴らすワンラインスクリプト(Linux) | Futurismo</a>
    </li>
  </ul>

  <p>
    アイコンはフリー素材からひろった。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.iconarchive.com/">http://www.iconarchive.com/</a>
    </li>
  </ul>

  <pre><code>wget http://icons.iconarchive.com/icons/hopstarter/sleek-xp-basic/256/Close-2-icon.png

wget http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Actions-dialog-ok-apply-icon.png

  <p>
    めっちゃくちゃいい感じに表示される!これはテンションアップ。
  </p>

  <pre><code>Autotest.add_discovery { "rspec2" }

Autotest.add_hook :green do system ‘notify-send -i ~/Pictures/tdd/Actions-dialog-ok-apply-icon.png OK’ end

Autotest.add_hook :red do system ‘notify-send -i ~/Pictures/tdd/Close-2-icon.png Error’ end

Emacsで動かす

<div class="outline-text-4" id="text-4-0-3">
  <p>
    autotestをEmacs上で動かす elispもある。
  </p>

  <pre><code>wget http://www.emacswiki.org/cgi-bin/emacs/download/autotest.el

  <p>
    だがしかし、自分の環境ではうまくうごかなかった。。。 emacs上でshellをたちあげて、autotestを実行すると同じことができる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/dchelimsky/rspec/wiki/autotest-integration">Autotest Integration · dchelimsky/rspec Wiki</a>
    </li>
    <li>
      <a href="http://tmtms.hatenablog.com/entry/20110101/rspec">RSpec で autotest &#8211; @tmtms のメモ</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/amacou/20080908/1220893836">autotest,RSpec,Emacsで快適テスト環境をつくる(あとGrowlも) &#8211; AorBorF</a>
    </li>
  </ul>
</div></p>

rspec-kickstarter

RSpecのテストコードを自動生成するツール。以下の記事を参照。

simplecov

RSpecと組み合わせてカバレッジをとるツール。

gem install simplecov 

spec_helper.rbに以下の2行を追加するだけ。すごくsimple!

require 'simplecov'
SimpleCov.start

ただし、autotestと一緒に利用すると、無限ループになるという悲しいことになった。注意。

21 Feb 2014, 12:36

EmacsのRuby環境でタグを自動生成してタグジャンプ!

Emacsをつかっていても、Eclipseみたいにタグジャンプしたい!

そんな情念に突き動かされて、タグジャンプの方法をしらべました。

Ctagsを利用する

タグジャンプを利用するためには、ctagsがRubyに対応しているようだ。

まずは、ctagsをインストール。linux mintでは以下で入る。

sudo apt-get install ctags

Exuberant Ctagsというものがctagsの代わにインストールされた?まあいいや。

ルートディレクトリで以下を実行。

ctags-exuberant -a -e -f TAGS --tag-relative -R *

TAGSが生成される。これをemacsからつかえばよい。試しに M-x find-tagsを入力して、タグジャンプが発動すればOK。

  • M-. find-tags タグジャンプ
  • M-* ジャンプ元に戻る。

ripper-tags で高速化

さらに改善。ctagsよりも高速なripper-tagsというものを見つけた。Emacsにも対応しているよう。

ripper-tagsは ctagsデータをより高速に生成するツール。

gem install ripper-tags

ルートディレクトリで以下を実行。

ripper-tags -e -R -f TAGS

helm-etags-selectで見やすさアップ

さらにさらに改善するには、helm-etags-selectがいいかも。 helmインターフェースで飛び先を絞り込み。C-x c e で発動。

observrで保存を自動監視

さらにさらにさらに改善。ctagsを保存するたびに作り直す。

保存の監視には、observerを利用する。observerはファイル監視用のgem. watchrをforkして作られた。

以下でインストール。

gem install observer
gem install rev

正規表現を利用して、設定ファイルを書く。 プロジェクトのルートディレクトリにスクリプト作成。(ripper.observr)

watch( 'spec/(.*)_spec\.rb' )  {system("ripper-tags -e -R -f TAGS") }
watch( 'lib/.*\.rb' ) { system("ripper-tags -e -R -f TAGS") }

監視スタート。

observr ripper.observr

素晴らしき開発環境になった。

161231:追記 helm-etags+を使おう

helm-etags+のなかに含まれている、ctags-update.elを利用することで、ファイル保存時にタグを更新することができる。

ctags-update.el : 【多言語対応関数定義ジャンプツール】Exuberant ctagsを賢く自動更新させる

 

19 Feb 2014, 15:13

Rubyのテストコード自動生成!レガシーコードをrspec-kickstarterで切り崩す

RSpec絶賛勉強中! t-wadaさんの記事を参考にして写経してる。

RSpecについての情報を探してネット上を徘徊していたら、 rspec-kickstarterというおもしろそうなツールを発見したので試す。

rspec-kickstarterとは

githubのREADMEによると、 既存コードからRSpecのスケルトンコードを自動生成するツールのようだ。

  • インストール
    gem install rspec-kickstarter
    

つかってみる

写経用教材をrspec-kickstarterにかけてみると・・・

require 'spec_helper'
require 'message_filter'

describe MessageFilter do

  # TODO auto-generated
  describe '#new' do
    it 'works' do
      word = double('word')
      result = MessageFilter.new(word)
      expect(result).not_to be_nil
    end
  end

  # TODO auto-generated
  describe '#detect?' do
    it 'works' do
      word = double('word')
      message_filter = MessageFilter.new(word)
      text = double('text')
      result = message_filter.detect?(text)
      expect(result).not_to be_nil
    end
  end

end

あっという間に自動生成。自動生成なのでテストがDRYではあるが、それでも素晴らしい。 いきなり最終回だ。

テストのリズム

オプション -f をつけると、 既存のspecコードに足りないメソッドのサンプルを追加してくれる。

このオプションをつかうと、以下のようなTDDのリズムが考えられる。

  1. メソッドを定義
  2. メソッドに対応するスケルトンを生成し、テストを実装
  3. テスト失敗
  4. メソッド実装
  5. テスト成功

普通ならば、このあとリファクタリングをする。

まだ、お試しなので、もう少し使ってみて有用性を見極めてみる。

一からスクラッチを書くコードよりも、レガシーコードにたいして絶大な効果がありそう。

また、テストファイルをとりあえず生成することができるので、初めの一歩をkickするためだけの用途でも使えそう。

18 Feb 2014, 23:59

Rubyでのloadとrequireの違いをしらべたメモ

Rubyで、他のファイルを取り込むときにrequireとloadがある。 違いをしらべてみた。

結論

結論からいうと、

  • コードの中で使う場合は require
  • irbのなかで使う場合は load

詳細

コードのなかでloadをつかってはいけない理由

<div class="outline-text-3" id="text-2-1">
  <p>
    loadをコードの中で利用すると、無限ロードがが発生する可能性がある。 具体的には、A.rbでは、load &#8216;./B&#8217;, B.rbでは load &#8216;./A&#8217;を宣言している場合、 2つのファイルがお互いに互いをloadしあう。(C言語での2重インクルード)
  </p>

  <p>
    なので、コードのなかでloadをつかうのは危険。
  </p></p>
</div></p>

irbのなかでrequireをつかってはいけない理由

<div class="outline-text-3" id="text-2-2">
  <p>
    requireをつかうと、一度取り込まれた修正は更新されない。loadをつかうと更新される。 そのため、コードを修正たあとにirbでデバッグしようとしたときに、修正をirbに取り込むことができない。
  </p>

  <p>
    loadを利用すると、再度修正を取り込むことができる。
  </p></p>
</div>

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

  <div class="outline-text-4" id="text-2-2-1">
    <p>
      以下のように書くと、irbからloadしても修正は取り込まれない。
    </p>

    <pre><code>

if $0 == FILE … end

    <p>
      irbから実行した場合、__FILE__は irb、$0はファイル名になる。
    </p></p>
  </div></p>
</div></p>

18 Feb 2014, 13:28

スレッドとタスクの違いについてしらべてみた(C++/Linux)

今日、タスクとスレッドの違いについて質問された。

うまく説明できなかった。

人間失格。

ということで、ここで反省しようと思う。

タスクとスレッドの定義について

Wikipediaから引用する。

スレッド

<div class="outline-text-4" id="text-1-0-1">
  <blockquote>
    <p>
      スレッド(thread)とは、CPU利用の単位。<br /> プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが早くなる。<br /> スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。
    </p>
  </blockquote>

  <blockquote>
    <p>
      ある処理を単一のスレッドのみを用いて動作させる環境もしくは手法をシングルスレッドという。<br /> 対して、複数のスレッドが同時に動作することをマルチスレッドという。<br /> プログラム(概ねプロセス)の開始時にはメインとなるスレッドが動作する。<br /> 必要に応じてその他の処理をするスレッドを作り、実行させる事も出来る。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)">スレッド (コンピュータ) &#8211; Wikipedia</a>
    </li>
  </ul>
</div></p>

タスク

<div class="outline-text-4" id="text-1-0-2">
  <blockquote>
    <p>
      1つのタスクは、1つ以上のプロセスから構成され、1つのプロセスは、1つ以上のスレッドから構成される。
    </p>

    <p>
      プロセスと同義。スレッド (コンピュータ)と同義。タスク並列性などの用語では両者を区別しない場合もある。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%82%B9%E3%82%AF">マルチタスク &#8211; Wikipedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      OSから見た処理の実行単位。<br /> 通常はスレッドが実行単位となるが、OSによってはプロセス(複数のスレッドを含むプログラム全体)を1つの実行単位としてみる場合もある。<br /> 一つのアプリケーションソフトが行っている作業全体を一つのタスクと扱う場合が多く、この場合は「プロセス」に近い意味合いになる。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://e-words.jp/w/E382BFE382B9E382AF.html">タスクとは 【 task 】 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </li>
  </ul>
</div></p>

調査結果

<div class="outline-text-3" id="text-1-1">
  <p>
    わからん。
  </p></p>
</div></p>

C++からアプローチ

C++11では、threadライブラリがあるので、使ってみる。

 g++ thread.cpp  -pthread -std=c++11 -Wl,--no-as-needed

実装結果

<div class="outline-text-3" id="text-2-1">
  <p>
    わからん。
  </p></p>
</div></p>

タイマをつかって比べてみる

タイマをつかってみた。

スレッドライブラリをつかったマルチスレッドプログラムは5秒かかる。

スレッドライブラリをつかってないシングルスレッドプログラムは15秒かかる。

実装結果

<div class="outline-text-3" id="text-3-1">
  <p>
    ちょっとわかった。
  </p></p>
</div></p>

まとめ

C++/Linux環境だと、コンパイルした a.outを実行したものがタスク(プロセス?)

% ./a.out &
% ps
  PID TTY          TIME CMD
11484 pts/5    00:00:00 a.out

ひとつのプログラムのなかに複数のスレッドが動ける。

これはシングルスレッドかつシングルタスク。


int main()
{
  std::cout << "hello thread" << std::endl;
  return 0;
}

これはマルチスレッドかつシングルタスク。


int main()
{
  thread th(  std::cout << "hello thread" << std::endl; );
  thread th2(  std::cout << "hello thread" << std::endl; );
  th.join();
  th2.join();
  return 0;
}

これはマルチタスク。


 % ./a.out &
 % ./a.out &
 % ps
  PID TTY          TIME CMD
 8668 pts/5    00:00:00 a.out
 8874 pts/5    00:00:00 a.out

結論

<div class="outline-text-3" id="text-4-1">
  <p>
    結局、わからん。
  </p></p>
</div></p>

17 Feb 2014, 13:04

コマンドラインからステップ数をカウントするためにStepCounterを試す

コマンドラインから気軽にステップ数を集計するツール StepCounterを試しました。

つかってみる

以下からダウンロード。



git clone git@github.com:takezoe/stepcounter.git

コマンドラインから利用するためには、追加でstepcounter-x.x.x-jar-with-dependencies.jarが必要。

以下からダウンロードできる。

よくよく探すと、eclipse-plugin/jp.sf.amateras.stepcounter/libにもあったので、これをstepcounter.jarにリネームした。

実行形式は以下。

java -cp stepcounter.jar jp.sf.amateras.stepcounter.Main [ファイル名] [ファイル名] 

シェルを作成

以下のサイトを参考にして、スクリプトを作成してみた。

いい感じ。とりあえずはこれで。


browser.rb,Ruby,,26,8,9,43
crawler.rb,Ruby,,19,5,1,25
parser.rb,Ruby,,43,11,2,56
test_parser.rb,Ruby,,29,8,1,38