06 Mar 2014, 11:43

[RubyTk]定期実行処理についてのメモ(Thread, TkAfter)

RubyTkでなにかの監視処理を実施する方法を調べたことのメモです。

RubyTk内でsleepが使えない

RubyTkでは、画面表示のために、Tk.mainloopを持ちいる。

これはメインスレッドで動作するため、 sleepをしてしまうとメインスレッドをその処理占有してしまい、 RubyTkをつかった描写ができない。また、逆もしかりである。

TkAfterをつかう

<div class="outline-text-3" id="text-1-1">
  <p>
    RubyTkでタイマ制御や定期監視のようなsleepに関わる処理に利用するライブラリがTkAfter.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/after.html">http://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/after.html</a>
    </li>
  </ul>

  <p>
    使用例は以下のとおり。
  </p>

  <p>
  </p>

  <p>
    タイマ制御がTkライブラリに依存してしまうのが個人的には気にくわなかった。
  </p>

  <p>
    なので、別の方法を考える。
  </p></p>
</div></p>

Threadをつかう

<div class="outline-text-3" id="text-1-2">
  <p>
    RubyのThread機能を利用して、別スレッドで定期的な処理を動かす。
  </p>

  <p>
    定期的な通知には、observerライブラリを利用する。
  </p>

  <p>
  </p>

  <p>
    どちらも実現したいことは同じだけれども、2つめのアーキの方が好きだ。
  </p></p>
</div></p>

05 Mar 2014, 12:29

[RubyTk] GUIアーキテクチャの定番MVCをRubyTkで実装してみる

MVCについて勉強したので、実際にRubyTkに応用してみる。

MVCとは

MVCとは、アーキテクチャの一つ。 Model-View-Controllerの略。 ユーザ・インタフェースをもつアプリケーションをうまくつくるための設計方法。

詳しい解説は、リンク先に譲るとする。

MVCアーキを利用すると、

  • 仕様変更につよい
  • 移植がしやすい

などのメリットがある。

また、テストが書きやすいという利点もある。 RubyTkライブラリがからむとviewのテストがかけない。 tkライブラリは論理的な処理から切り離したい。

MVC実装例

ボタンをおすと、ファイルからデータを読み出して、画面に表示するアプリケーションをつくる。

MVC以前

<div class="outline-text-3" id="text-2-1">
  <p>
    普通の実装。
  </p>

  <p>
    </div>
  </p>
</div>

<div id="outline-container-sec-2-2" class="outline-3">
  <h3 id="sec-2-2">
    MVCの実装
  </h3>

  <div class="outline-text-3" id="text-2-2">
    <p>
      Model, View, Controllerの3つにクラスを分割して実装。
    </p>

    <p>
      </div>
    </p>
  </div>

  <div id="outline-container-sec-2-3" class="outline-3">
    <h3 id="sec-2-3">
      proc, lambdaを導入する
    </h3>

    <div class="outline-text-3" id="text-2-3">
      <p>
        上の例だと、ViewとControllerの間に依存関係がある。これをなくしたい。
      </p>

      <p>
        Rubyでコールバックやハンドラの仕組みを導入するためにはどうすればいいのだろうか?
      </p>

      <p>
        答えは、procやlambdaを利用すればうまくできた!といっても、完全に依存関係がなくなったわけではないけど。
      </p>

      <p>
        感性的にこっちの方が美しく感じる。
      </p>

      <p>
        </div>
      </p>
    </div>

    <div id="outline-container-sec-2-4" class="outline-3">
      <h3 id="sec-2-4">
        Links
      </h3>

      <div class="outline-text-3" id="text-2-4">
        <ul class="org-ul">
          <li>
            <a href="http://stackoverflow.com/questions/1677861/how-to-implement-a-callback-in-ruby">How to implement a &#8220;callback&#8221; in Ruby? &#8211; Stack Overflow</a>
          </li>
        </ul>
      </div></p>
    </div></p>
  </div>

04 Mar 2014, 13:20

Rubyにおけるロードパス(require)のtips

基本的なことかもしれないけれども、基本すらできないので、Rubyのrequireについてしらべたことをまとめ。

requireとは

requireとは、ロードパスからファイルを探してきて自分のコードに取り込む仕組み。

requireの他にも、loadというものもある。両者の違いは別記事で以前まとめた。

<div class="outline-text-3" id="text-1-1">
  <p>
    たとえば、同一ディレクトリにあるhogehogeを自分のコードに取り込みたいときは、以下のようにつかう。
  </p>

  <pre><code>

requireを使う場合

requier ‘./hogehoge’

require_relativeを使う場合

require_relative ‘hogehoge’

  <p>
    requireは、LOAD_PATHが通ったところをロードするため、カレントディレクトリのファイルをロードするためには、ドットをうつ。
  </p>

  <p>
    require_relative相対パスでパスを指定できる。
  </p>

  <p>
    余談で、rspecは実行時にlibとspecのディレクトリがロードパスに追加される。
  </p></p>
</div></p>

相対パスがかっこ悪いのでなんとかする

個人的には、相対パスがかっこ悪いので、何とかしたい。

コード中でLOAD_PATHにカレントディレクトリを追加

<div class="outline-text-3" id="text-2-1">
  <p>
    以下の処理を書くと、コード実行時にLOAD_PATHに自分のディレクトリを追加できる。
  </p>

  <pre><code>

簡易版

$:.unshift File.dirname(FILE)

自分でパスを追加したい場合

$:.unshift(File.dirname(File.expand_path(FILE)) + ‘起動したプログラムからの相対パス’)

ruby起動時にLOAD_PATHにディレクトリを追加

<div class="outline-text-3" id="text-2-2">
  <p>
    ruby -I (ディレクトリ)でもパスを追加できる。起動用のシェルやbatを作成するといいかも。
  </p>

  <pre><code>

#!/bin/bash

current_dir=dirname $0 cd ${current_dir}

ruby -I ./lib $@

03 Mar 2014, 12:21

[RubyTk]コンポジット・パターン(Composite Pattern)とTkCompositeについてしらべた

RubyTkにTkCompositeというなぞのライブラリがあるので、しらべた。

名前から推測するに、Composite Patternと関係がありそうだ。

Composite Patternとは

Composite Patternとは、Gofのパターンの一つ。

説明はwikipediaに譲るとして、自分の理解では、

再帰的な操作が可能なデータ構造

親子関係のあるデータ構造と素の操作

という感じ。たとえば単方向リスト、木構造などのデータ構造とそれに対する操作。 何だか当たり前のことだ。

登場人物

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Component(親) 全ての親になるもの
    </li>
    <li>
      Leaf(葉) Leafを持たないもの
    </li>
    <li>
      Composite(枝)Leafを持つもの
    </li>
  </ul>
</div></p>

TkCompositeの使い方

TkCompositeを利用すると、 複数のウィンドウ部品がまとまってできているウィンドウ部品を簡単に作成できるみたい。

以下が、作法。


class Tkhoge < TkWindow
  include TkComposite

  def initialize_composite
    ...
  end
end

@frameがインスタンス変数として利用できる。 この@frameを親にして、この部品たちを組み合わせる(ここがcomposite!)

delegateを利用すると、属性を子の部品に委譲できる。

詳しくは以下のリンクを参照。

サンプル

再生、停止ボタン、エントリフィールドをもつのモックguiを作成してみた。

GUIの親部品、子部品がcompositeのよきサンプル。

02 Mar 2014, 10:36

[RubyTk]オブザーバ・パターン(Observer)でサブウィンドウから情報を取得する

RubyTkでオブザーバ・パターンを勉強したので、メモします。

やりたいこと

  • RubyTkで、メインウィンドウからサブウィンドウを起動。
  • サブウィンドウから情報(入力フォームに入力された情報など)を取得する。

Ruby初心者の実装

どうやればいいのかわからなかったので、とりあえずクラス変数を使って実装。

依存関係ヌメヌメどろどろの悪い実装。

Ruby中級者の実装

<div class="outline-text-2" id="text-3">
  <p>
    サブウィンドウのオブジェクト生成時に親ウィンドウのオブジェクトのクラスを渡す。
  </p>

  <p>
    これが普通のやり方かな~。
  </p>

  <p>
    </div>
  </p>
</div>

<div id="outline-container-sec-4" class="outline-2">
  <h2 id="sec-4">
    Ruby知ったかぶりの実装
  </h2>

  <div class="outline-text-2" id="text-4">
    <p>
      Ruby, オブジェクト, 通知でググると、observerというライブラリが Ruby標準ライブラリで存在するようだ。
    </p>

    <p>
      observerとは、ズバリ、Observer Paternをサクッと実装することができるライブラリ。
    </p></p>
  </div>

  <div id="outline-container-sec-4-1" class="outline-3">
    <h3 id="sec-4-1">
      observerの役割分担
    </h3>

    <div class="outline-text-3" id="text-4-1">
      <p>
        前提として、以下のようにやくわりを持たせる。
      </p>

      <ul class="org-ul">
        <li>
          観察者 : メインウィンドウ
        </li>
        <li>
          被観察者 : サブウィンドウ
        </li>
      </ul>

      <p>
        observerは被観察者、つまり状態の変化を通知するサブウィンドウで実装される。
      </p></p>
    </div></p>
  </div>

  <div id="outline-container-sec-4-2" class="outline-3">
    <h3 id="sec-4-2">
      observerの使い方
    </h3>

    <div class="outline-text-3" id="text-4-2">
      <p>
        以下の4ステップ。
      </p>

      <ol class="org-ol">
        <li>
          add_observerで観察者と被観察者を結びつける。
        </li>
        <li>
          変更があったときにchangedをコール
        </li>
        <li>
          notify_observersで観察者に通知
        </li>
        <li>
          観察者側で定義された updateメソッドがコールされる。引数は3で設定した値。
        </li>
      </ol>
    </div></p>
  </div>

  <div id="outline-container-sec-4-3" class="outline-3">
    <h3 id="sec-4-3">
      実装例
    </h3>

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

      <p>
        正直、2つめと3つめの違いがよくわからない。
      </p>

      <p>
        オブザーバライブラリを使うことで『オレ・こんなことも知ってるっすよ」という いやらしさがある。
      </p></p>
    </div></p>
  </div></p>
</div>

<div id="outline-container-sec-5" class="outline-2">
  <h2 id="sec-5">
    Ruby勉強中の実装
  </h2>

  <div class="outline-text-2" id="text-5">
    <p>
      追記。
    </p>

    <p>
      オブザーバパターンは、一つの観察対象に対して、複数の観測者がいるときに威力を発揮する!
    </p>

    <p>
      ということで、一つのサブウィンドウから、2つのウィンドウにを通知を送るように修正した。
    </p>

    <p>
      </div>
    </p>
  </div>

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>

まとめ

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

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

Links

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と一緒に利用すると、無限ループになるという悲しいことになった。注意。