Quantcast
Channel: Futurismo
Viewing all 91 articles
Browse latest View live

プレインテキストへの決意 ~for progmatic programmer~

$
0
0

達人プログラマ-を読んでる。

プレーンテキストについての記述が心の琴線を震わせたので、その振動をキャプチャーする。

ブレインテキストの威力

スーパーハッカーの生産性のひみつ

達人プログラマーが取り扱う情報は、知識です。
その知識を永続的に格納するためのフォーマットで最も適しているものが、プレインテキストです。
プレインテキストを使えば、手作業、自動的な作業を問わず、
事実上すべてのツールを使って思い通りに知識を操作することができるようになるのです。

この、自由自在にというのには熟達が必要だが、そうなれれば確かにすごく効率が上がりそうだ。 すごいブログラマの生産性は10人の一般人に値すると聞いたことがあるが、 プレインテキストを使いこなすことが一つのヒントかもしれない。

プレインテキストの定義

プレイン・テキストとは、印字可能な文字からなる、人間が直接読んで理解することのできる形式です。

バイナリ形式は、データを解釈するためのコンテキストがデータ自身から切り離されてしまっている。
これでは、暗号化されていると同じ。

プレインテキストのデメリットは、バイナリに比べて大きな格納領域が必要、多くの計算量が必要。
メリットは、透明性が保証される、様々な活用ができる、テストが用意になる。

プレインテキストは、長持ちするし、ツールで自由自在に加工できる。

最近、mixiやYahooブログに投稿した昔の日記をwordpressに移行しようとしているのだが、 Rubyスクリプトで取り出そうとすると苦戦してる。単純なHTML形式で保存すればどんなによかったかと思う。

また、今までEvernoteに情報を集約していたが、Evernoteはプレインテキストではない。 Evernoteを利用することに危機感を覚える。 なにかEvernoteに変わるような代価手段も見当する必要があるかもしれない。

すべてをソースコード管理システムで管理

ソースコード管理システムは巨大なUNDOキー。

すべてをソースコード管理システムで管理すること。それがソースコードでなくても。
ドキュメント、電話番号、メモ、小さなスクリプト、日々の作業はリポジトリ内で厳重に保管される。

我われの扱うものが知識であり、それがプレインテキストで記述されるならば、 それを管理する洗練されたツールとして、ソースコード管理システムを利用する。

コードだけを管理すればいいと思っていた思い込みを打破するカルチャーショック!

日本語もプログラミング言語

全てはドキュメント。

コードとドキュメントを結びつける。同じような作業を繰り返して行わず、また時間の無駄にならない方法で、
ドキュメントを手近なところ(つまり可能な限りコード自身のなか)に置くことによって、簡単にドキュメントを作成できる。

実効可能ドキュメント、ドキュメントからコードを生成する。
ドキュメントとコードの2つをメンテナンスすることはDRY原則に反する。

プレインテキストならば、スクリプト言語によって加工が可能。
プレインテキストでないならば、ドキュメントは副次的なものにする、またはマクロを記述してドキュメントを生成する。

これは、Pandocのようなものを言っているのだろうか。プレインテキストから、Wordやpdfを自由に生成できる時代だ。 こういうツールを普段の開発に導入するためには、どうすればいいだろう。 自分のまわりはWordとExcelという、不動の権力が立ちはだかる。

しかし、それでもWordを捨ててプレインテキストで仕様書がかけるかどうか、tryはしてみよう。

プレインテキストを使いこなす決意

2014年の目標の一つに、コマンドラインをつかいこなすというものがある。

1月に入ってから、作業環境をコマンドラインにうつし、可能な限りマウスを利用せずにパソコン作業をするということに取り組んでいる。 だいたい一ヶ月が過ぎたが、やってみるとおもしろいもので、マウスを使わなくてもほとんどの作業は可能であり、かつ効率があがる。

このコマンドラインへの挑戦を拡張して、プレインテキストへも挑戦しよう。

つまりは、

  • 可能な限り情報をプレインテキストで扱う
  • 全てをソースコード管理システムで管理する
  • ツールを使って加工する技術を身につける

ということに取り組んでいこうとおもう。そのような火をつけてくれた本書に感謝。頑張るぞ。


EmacsでRubyの開発環境をさらにめちゃガチャパワーアップしたまとめ

$
0
0

はじめに

Ruby開発環境を整えようとおもったが、普段よく使っているEclipseを出すにはスクリプト言語は大げさだ。

スクリプト言語はコンソール端末で書くに限る。

というわけで、Emacs使いなあたしとしては、EmacsでのRuby環境を整えようとおもった。

いろんなサイトを参考にしつつ、導入したものを列挙していく。

準備

elip取得に必要な package.elやel-get.el、gitやwgetなどのツールはインストール済みのこと。

環境

  • Emacs 24.3.1
  • Ruby 2.1.0

入力支援

ruby-mode/enhanced-ruby-mode

まずはともあれ、Emacsのruby-modeを使う。 .emacsの設定。拡張子.rbと接頭語Capfile,GemfileをRubyファイルと認識させる。

(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(add-to-list 'auto-mode-alist '("\\.rb$latex " . ruby-mode))
(add-to-list 'auto-mode-alist '("Capfile$" . ruby-mode))
(add-to-list 'auto-mode-alist '("Gemfile$" . ruby-mode))

今は、enhanced-ruby-modeというものもあるらしい。

以下の機能を強化。

  • インデント
  • シンタックスハイライト
  • リアルタイムの文法チェック

MELPAに入っているので、package.elやel-get.elでインストールできる。

githubの元のリポジトリは開発が止まっているようで、自分はfork版を入れる。

enh-rubu-modeという名前を探してインストールした。

あとは、既存の設定で、ruby-mode-hock/ruby-mode-mapとなっているところを enh-ruby-mode-hock enh-ruby-mode-mapで置換する。

ruby-electric

ruby-electricはかっこやdo endなどの対応関係を自動で補正してくれる。

(require 'ruby-electric)
(add-hook 'ruby-mode-hook '(lambda () (ruby-electric-mode t)))
(setq ruby-electric-expand-delimiters-list nil)

ruby-block

ruby-blockを導入すると、end に対応する行をハイライトしてくれる。

;; ruby-block.el --- highlight matching block
(require 'ruby-block)
(ruby-block-mode t)
(setq ruby-block-highlight-toggle t)

コードリーディング

ctags/ripper-tags

タグジャンプを利用するためには、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-* ジャンプ元に戻る。

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

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

gem install ripper-tags

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

ripper-tags -e -R -f TAGS

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

rcodetools( xmpfilter )

rcodertoolsとは、Ruby開発のためのツール群。emacs界で有名な、rubikichi 氏の作品。

以下のような機能をゆうしている。

xmpfilter: Test::Unit assert* / RSpec should* 自動生成、コード注釈
rct-complete: 高精度メソッド名・クラス名・定数名等補完
rct-doc: ドキュメント参照・コードナビゲーター
rct-meth-args: 高精度メソッド情報リスト、TAGS ファイル作成
rct-fork: Rails 等重いライブラリを予めロードし、補完を高速化する(サーバ)
rct-fork-client: rct-fork サーバが保持する状態から Ruby スクリプトを実行する
ruby-toggle-file: テストスクリプトと実装スクリプトを切り換える
rbtest: 小規模スクリプトのための埋め込み Test::Unit

まずは、rcodertoolsをダウンロードする。gemコマンドで入る。

$ gem install rcodetools

gem environmentコマンドでインストールされた場所を調べて、rcodetools.elをload-pathが通った場所にコピーする。

$ gem environment
$ cp /usr/lib/ruby/gems/1.9.1/gems/rcodetools-0.8.5.0/rcodetools.el .

最後に、rcodetools/binにパスを通す(ここがハマりポイント!)このページに助けられた。

.zshenvとかに、

export PATH=$PATH:$HOME/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/rcodetools-0.8.5.0/bin

.emacsへの設定例は以下。

;; rcodetools
(require 'rcodetools)
(setq rct-find-tag-if-available nil)
(defun ruby-mode-hook-rcodetools ()
  (define-key ruby-mode-map "\M-\C-i" 'rct-complete-symbol)
  (define-key ruby-mode-map "\C-c\C-t" 'ruby-toggle-buffer)
  (define-key ruby-mode-map "\C-c\C-f" 'rct-ri))
(add-hook 'ruby-mode-hook 'ruby-mode-hook-rcodetools)

xmprilterを使うとRuby コードの行末に「# =>」を入れて xmpfilter を実行するとその行の返り値を見ることができる。

rct-completeを使うと、コードの自動補完が使える。

また、ruby-toggle-bufferはテストコードとソースコードを切り替えることができる。

切り替えたり、メソッドを補完しながらTDDする方法をTDCと名づけている。(Test Driven Completion)README.TDCを読むと面白い。

たくさん機能があるので、いろいろ調べるとよい。ちょっとまだつかいこなせてない。詳しくはREADMEを参照。

rdefs

rdefsはソースコードのclassやmodule、defといった宣言のラインを引っ張り出してくれるツール。

gem install rdefs

anything I/Fを経由して、Emacsから利用することができる。helmは見つからなかった。

wget https://raw2.github.com/mori-dev/anything-rdefs/master/anything-rdefs.el

.emacsの設定は以下。

(require 'anything)
(require 'anything-rdefs)
(add-hook 'enh-ruby-mode-hook
          (lambda ()
            (define-key enh-ruby-mode (kbd "C-@") 'anything-rdefs)))

これはなかなかよいツールだ。

リファクタリング

Rubyリファクタリング環境は以外に貧弱だった。なんとかならないものか・・・。

anzu

リファクタリングのリネーム機能を探していたら、これが良さそう。

置換や検索をおしゃれに実行するElisp。詳しくは、以下。

(require 'anzu)
(global-anzu-mode +1)

(set-face-attribute 'anzu-mode-line nil
                    :foreground "yellow" :weight 'bold)
(custom-set-variables
 '(anzu-mode-lighter "")
 '(anzu-deactivate-region t)
 '(anzu-search-threshold 1000)
 '(anzu-use-mimego t)
 '(anzu-replace-to-string-separator " => "))

ruby-refactor

ruby-refactorは、Rubyでリファクタリングをするためのツール。

githubからとってくる。

.emacsにも設定を追加。

(require 'ruby-refactor)
(add-hook 'ruby-mode-hook 'ruby-refactor-mode-launch)

こんなことができる。


    Extract to Method (C-c C-r e)
    Extract Local Variable (C-c C-r v)
    Extract Constant (C-c C-r c)
    Add Parameter (C-c C-r p)
    Extract to Let (C-c C-r l)

個人的にはExtract MethodとRenameができればよいが、Renameはできない。

また、Extract Methodは変数を抽出してはくれないのであまり賢くない。

コーディング支援

inf-ruby

Emacsのバッファからirbを起動する。

(autoload 'inf-ruby "inf-ruby" "Run an inferior Ruby process" t)
(add-hook 'ruby-mode-hook 'inf-ruby-minor-mode)

M-x inf-rubyでバッファが起動。これだけ。

SmartCompile

SmaprtCompleを入れることで、Emacs編集中に”C+c, C+c”でRubyを実行することができる。

.emacsにも設定を追加。

;; smart-compile
(require 'smart-compile)
(define-key ruby-mode-map (kbd "C-c c") 'smart-compile)
(define-key ruby-mode-map (kbd "C-c C-c") (kbd "C-c c C-m"))
(setq compilation-window-height 15) ;; default window height is 15

また、このままだと、コードチェックまでで、実行してくれないので、このサイトを参考にしてelispを編集した。

;;  ("\\.rb\\'"         . "ruby -cw %f")
  ("\\.rb\\'"         . "ruby %f")

auto-complite-ruby/RSense

Ruby用の補完をする。補完はauto-completeという有名なelispがある。

もっと賢いのがオムニ補完と呼ばれるもの。これは文法を解析して補完してくれる。以下の2つが使えそう。

  • RSense
  • auto-complete-ruby

しかし、・・・どちらも自分の環境では動かなかった。。。ruby2.0だと駄目なのかな?そのうち頑張る。とりあえず、auto-completeで我慢。

yasnippet-ruby

Emacsのスニペット挿入機能といえば、yasnippetだが、そのRuby用テンプレート群をいれる。

ここからダウンロードして、yasnippetのスニペット一覧に突っ込む!

いちおう、yasnippetsの設定も載せておく。ここでは、~/.emacs.d/snippetsにいれた。

(require 'yasnippet)
(yas/load-directory "~/.emacs.d/snippets")
(yas-global-mode 1)

;; 既存スニペットを挿入する
(define-key yas-minor-mode-map (kbd "C-x i i") 'yas-insert-snippet)
;; 新規スニペットを作成するバッファを用意する
(define-key yas-minor-mode-map (kbd "C-x i n") 'yas-new-snippet)
;; 既存スニペットを閲覧・編集する
(define-key yas-minor-mode-map (kbd "C-x i v") 'yas-visit-snippet-file)

静的解析

flycheckが熱いことが分かった。

flymake-ruby

文法を静的解析するために、flymake-rubyを入れる。

(require 'flymake-ruby)
(add-hook 'ruby-mode-hook 'flymake-ruby-load)

入れると、文法的におかしいところに色がつく。単純ミスしか指摘してくれない。

flycheck

flymakeのかわりに、flycheckというものがある。機能は似ているが、こっちの方が新しく拡張性がある。

両者の比較には、以下のエントリが参考になる。

(require 'flycheck)
(setq flycheck-check-syntax-automatically '(mode-enabled save))
(add-hook 'ruby-mode-hook 'flycheck-mode)

とりあえず、新しいflycheckをつかうことにする。

ついでに、flycheckをカラフルにする flycheck-color-mode-lineも入れた。どうも、MELPAやel-getで取得できなかったので、直接git cloneした。

git clone https://github.com/flycheck/flycheck-color-mode-line.git

設定は以下。

この拡張性を利用して、ruby-lintとrobocopを入れてみる。

rubocop

コーディングスタイルをチェックするために、rubocopを入れてみる。 以下を参考にした。

まずは、gemでrobocopをインストール。

gem install rubocop

.emacsの設定は以下。

(require 'rubocop)
(add-hook 'ruby-mode-hook 'rubocop-mode)

標準だと、Rubyコーディングスタイルガイドにしたがっているかチェックできる。

カスタマイズは徐々にしていこう。

さらに、前述のflycheckのcheckツールにrubocopを組み込むことができる。

flycheck-list-errorsで、flycheckが検出したエラーと一緒にチェックできる。I/Fの共通化。

(flycheck-define-checker ruby-rubocop
  "A Ruby syntax and style checker using the RuboCop tool."
  :command ("rubocop" "--format" "emacs" "--silent"
            (config-file "--config" flycheck-rubocoprc)
            source)
  :error-patterns
  ((warning line-start
            (file-name) ":" line ":" column ": " (or "C" "W") ": " (message)
            line-end)
   (error line-start
          (file-name) ":" line ":" column ": " (or "E" "F") ": " (message)
          line-end))
   :modes (enh-ruby-mode motion-mode))

ruby-lint

flymakeよりももう少し頭のいい解析をする。semantic(文法解析)的に解析してくれるらしい。

rubocopとの違いについても、githubのreadmeにかかれている。

gemでインストール。

gem install ruby-lint

これも、flycheckのインタフェースを利用してチェックさせる。

;; definition for flycheck
(flycheck-define-checker ruby-rubylint
  "A Ruby syntax and style checker using the rubylint tool."
  :command ("ruby-lint" source)
  :error-patterns
  ((warning line-start
            (file-name) ":" line ":" column ": " (or "C" "W") ": " (message)
            line-end)
   (error line-start
          (file-name) ":" line ":" column ": " (or "E" "F") ": " (message)
          line-end))
  :modes (enh-ruby-mode ruby-mode))

[Linux Mint] rbenvで取得したrubyで ruby tkをつかう方法メモ

$
0
0

はじめに

Ruby tkを利用しようとしたところ、エラーがでて使えなかった。

% irb
irb(main):001:0> require 'tk'
LoadError: cannot load such file -- tk
        from /home/tsu-nera/.rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/tsu-nera/.rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from (irb):1
        from /home/tsu-nera/.rbenv/versions/2.1.0/bin/irb:11:in `
'

この解決方法についてメモします。

Ruby/TkはTcl/TkのツールキットをRubyから利用するライブラリ。

Rubyの標準ライブラリに入っている。

tk-devを入れてみる

もともと自分のPCに入っていたRubyはrbenvを使ってビルドした。 どうも、Ubuntu(Mint)環境では、tk-devをあらかじめインストールしておかないと、Rubyのビルド時にRuby/Tkがビルドされないようだ。

ということで、

sudo apt-get install tk-dev

他にも、いろいろツールが追加でインストールされる。

libxss-dev tcl tcl-dev tcl-lib tcl8.5-dev tk tk-lib tk8.5 tk8.5-dev tk8.5-lib x11proto-scrnsaver-dev

これで、Rubyを再インストールしてみる。

% rbenv uninstall ruby-2.1.0
% rbenv install ruby-2.1.0 -v

これでOKだろうとおもったけど、やっぱりエラーした。

ビルドログをみると、やっぱりスキップされてしまう。

configuring tk
...........
check struct members..
check libraries....
Use ActiveTcl libraries (if available).
Search tclConfig.sh and tkConfig.sh.....................
WARNING: found "/usr/lib/tclConfig.sh", but cannot find valid Tcl library for the tclConfig.sh. So, ignore it.

WARNING: found "/usr/lib/tkConfig.sh", but cannot find valid Tk library for the tkConfig.sh. So, ignore it.
..........
Fail to find [tclConfig.sh, tkConfig.sh]
Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).

Search tcl.h..
Search tk.h..Search Tcl library..........
Search Tcl library..........
Warning:: cannot find Tcl library. tcltklib will not be compiled (tcltklib is disabled on your Ruby. That is, Ruby/Tk will not work). Please check configure options.

Can't find proper Tcl/Tk libraries. So, can't make tcltklib.so which is required by Ruby/Tk.
If you have Tcl/Tk libraries on your environment, you may be able to use them with configure options (see ext/tk/README.tcltklib).
At present, Tcl/Tk8.6 is not supported. Although you can try to use Tcl/Tk8.6 with configure options, it will not work correctly. I recommend you to use Tcl/Tk8.5 or 8.4.
Failed to configure tk. It will not be installed.
configuring tk/tkutil
Failed to configure tk/tkutil. It will not be installed.
configuring win32
Failed to configure win32. It will not be installed.
configuring win32ole
Failed to configure win32ole. It will not be installed.

Ubuntu特有のバグだったもよう

バグだった模様。バッチを発見。

しかし、パッチの当て方がわからない。30分で挫折。

途方にくれていたが、ズバリ解決する記事を発見!

sudo apt-get remove tk-dev
sudo apt-get install tk8.4-dev tcl8.4-dev

sudo ln -sfn /usr/lib/tcl8.4/tclConfig.sh /usr/lib/tclConfig.sh
sudo ln -sfn /usr/lib/tk8.4/tkConfig.sh /usr/lib/tkConfig.sh

このとおりに実施したら、なんとなくうまくいったっぽい。


configuring tk
........
check struct members..
check libraries....
Use ActiveTcl libraries (if available).
Search tclConfig.sh and tkConfig.sh...............................
Valid [tclConfig.sh, tkConfig.sh] are found in [["/usr/lib", "/usr/lib"]]
Use [tclConfig.sh, tkConfig.sh] == ["/usr/lib/tclConfig.sh", "/usr/lib/tkConfig.sh"]
Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).

Find Tcl/Tk libraries. Make tcltklib.so which is required by Ruby/Tk.
configuring tk/tkutil

成功、よかった ^_^;

% irb
irb(main):001:0> require 'tk'
=> true

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

$
0
0

コマンドラインから気軽にステップ数を集計するツール 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

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

$
0
0

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

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

人間失格。

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

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

Wikipediaから引用する。

スレッド

スレッド(thread)とは、CPU利用の単位。
プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが早くなる。
スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。

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

タスク

1つのタスクは、1つ以上のプロセスから構成され、1つのプロセスは、1つ以上のスレッドから構成される。

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

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

調査結果

わからん。

C++からアプローチ

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

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

実装結果

わからん。

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

タイマをつかってみた。

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

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

実装結果

ちょっとわかった。

まとめ

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

結論

結局、わからん。

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

$
0
0

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

結論

結論からいうと、

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

詳細

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

loadをコードの中で利用すると、無限ロードがが発生する可能性がある。 具体的には、A.rbでは、load ‘./B’, B.rbでは load ‘./A’を宣言している場合、 2つのファイルがお互いに互いをloadしあう。(C言語での2重インクルード)

なので、コードのなかでloadをつかうのは危険。

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

requireをつかうと、一度取り込まれた修正は更新されない。loadをつかうと更新される。 そのため、コードを修正たあとにirbでデバッグしようとしたときに、修正をirbに取り込むことができない。

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

Tips

以下のように書くと、irbからloadしても修正は取り込まれない。


if $0 == __FILE__
  ...
end

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

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

$
0
0

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. テスト成功

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

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

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

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

$
0
0

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

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


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

$
0
0

はじめに

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

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

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

環境

  • Emacs 24.3.1
  • Ruby 2.1.0

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

カラー表示

~/.rspecをつくると、rspecがカラーになる。

/.rspec
--format nested
--color

デスクトップ通知

autotest/discover.rbに以下を書くと、テストの成功時、失敗時のアクションが定義できる。

Autotest.add_hook :green do
end

Autotest.add_hook :red do
end

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

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

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

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

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で動かす

autotestをEmacs上で動かす elispもある。

wget http://www.emacswiki.org/cgi-bin/emacs/download/autotest.el

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

rspec-kickstarter

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

simplecov

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

gem install simplecov 

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

require 'simplecov'
SimpleCov.start

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

海外にメールを出した

$
0
0

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

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

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

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

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

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

「いらないよ~」

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

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

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

$
0
0

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

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

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

環境

  • Linux Mint 16

インストール

事前準備

まずは、以下をインストール

  • tk-dev
  • emacs
sudo apt-get install tk-dev
>sudo apt-get install emacs

Mozart2をインストール

以下からバイナリを落とす。

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

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

export PATH=/opt/mozart/bin:$PATH

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

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は設定できなかった。

ドキュメント

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

$
0
0

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

テンプレート


Dear xxx

[自己紹介 or 軽い挨拶]

[要件]

The following are the details.

[要件の詳細]

Regards,
hogehoge

件名

とりあえず全部暗記。

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

メールの冒頭

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

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

  • アメリカ: Dear Mr. hogehoge:
  • イギリス: Dear Mr. hogehoge,

ちょっと親しい場合

Dear hogehoge: または、Dear hogehoge,

もっと親しい場合は、Hello,Hiなども。

不特定多数

こんな表現も覚えときたい。

  • 関係各位 :To whom it may concern,
  • みなさま :Dear all, Hi everyone,

(参考)「英文メールの書き方」10分間レッスン|ビジネス英語|キャリアアップコース

自己紹介

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

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

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

書き出し

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

要件を伝える

  • I am writing this email because I’d like to
  • This e-mail is about ~

質問する

  • I have questions about ~
  • Let me ask(know) about
  • I’d like to know more about ~

要求する

詳細は以下

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

  • 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

メールの末尾

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

Regardsが鉄板。取り合えず、Regards。

Regards,
hogehoge

ちょっと親しい場合

面識がある人のみに使う。

Kind regards,
hogehoge

Best regards,
hogehoge

Thank you, thanksなどは気軽。

以下のルールがあるようだ。

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

(参考)ビジネスメールを送る場合の基本的なルール:文末や語尾に使われる結語

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

了解しました

  • 「了解」「了解しました」 内容を確認したことだけを伝える簡単な表現
Noted.
  • 相手の依頼を受けて「当然そうしますとも」「もちろんです」と言う場合の返事(丁寧な表現でもある。)
    Absolutely.
    Certainly.
  • 了解しました、大丈夫ですの意
    That would be fine.
  • 理解しました」

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

    I get the point.
    I understand.
  • 「わかりました」「わかった」と内容を確認、理解したと伝えたい場合の簡単な返事
    Okay.
    All right.
    Understood.

婉曲表現

柔らかい表現で、要求事項を伝える。重要!

  • if I may(可能であれば)
  • if you like(よろしければ)
  • Unfortunately(残念ながら)
  • It’s really too bad, but(誠に残念ですが)

(参考)英語でメールを書く時に使い回しができる超便利な英語の8つの定型文 | わいわい英会話

Would/Could

Wouldを極める。Couldでもいい。

  • I was hoping you would be able to shed some light on ~
  • Would it be possible for you to ~ ?
  • wouldn’t it be better if ~ ?
  • I would like to have your permission to ~
  • Please allow me to ~
  • I am wondering if you could ~
  • would rather ~
  • would like to ~

(参考) 英文ビジネスメールで即使える!英語の丁寧な表現をマスターしよう! | iKnow! BLOG

appreciateはthank you よりも丁寧。

  • I would appreciate it if

- Any information would be appreciated.

apologizeはSorryよりも丁寧。

  • I apologize for/that

(参考) 英文ビジネスメールで即使える!英語の丁寧な表現をマスターしよう! | iKnow! BLOG

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

$
0
0

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)

文字列を単語に分解してくれる。

sample code


require 'ripper'

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

実行結果

["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"]

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

イベントドリブン型解析

特定の構文に出会うたびに、イベントハンドラがコールされる。 on_XXXで定義する。XXXの部分には、Ripper:EVENTSでとれる値が入る。

pp Ripper::EVENTS

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

ripper つかってみる

S式配列を取得する

イベントドリブン型でsample.rbをパースしてみる。 まずは、以下のようなコードでS式の配列を出力する。


require 'ripper'
require 'pp'

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

ずらずらとS式の配列が現れる。


[: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]],

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

以下のようなことをする。

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

結果

まとめ

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

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

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

$
0
0

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

やりたいこと

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

Ruby初心者の実装

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

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

Ruby中級者の実装

サブウィンドウのオブジェクト生成時に親ウィンドウのオブジェクトのクラスを渡す。

これが普通のやり方かな~。

Ruby知ったかぶりの実装

Ruby, オブジェクト, 通知でググると、observerというライブラリが Ruby標準ライブラリで存在するようだ。

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

observerの役割分担

前提として、以下のようにやくわりを持たせる。

  • 観察者 : メインウィンドウ
  • 被観察者 : サブウィンドウ

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

observerの使い方

以下の4ステップ。

  1. add_observerで観察者と被観察者を結びつける。
  2. 変更があったときにchangedをコール
  3. notify_observersで観察者に通知
  4. 観察者側で定義された updateメソッドがコールされる。引数は3で設定した値。

実装例

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

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

Ruby勉強中の実装

追記。

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

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

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

$
0
0

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

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

Composite Patternとは

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

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

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

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

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

登場人物

  • Component(親) 全ての親になるもの
  • Leaf(葉) Leafを持たないもの
  • Composite(枝)Leafを持つもの

TkCompositeの使い方

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

以下が、作法。


class Tkhoge < TkWindow
  include TkComposite

  def initialize_composite
    ...
  end
end

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

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

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

サンプル

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

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


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

$
0
0

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

requireとは

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

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

たとえば、同一ディレクトリにあるhogehogeを自分のコードに取り込みたいときは、以下のようにつかう。


# requireを使う場合
requier './hogehoge'

# require_relativeを使う場合
require_relative 'hogehoge'

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

require_relative相対パスでパスを指定できる。

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

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

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

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

以下の処理を書くと、コード実行時にLOAD_PATHに自分のディレクトリを追加できる。


# 簡易版
$:.unshift File.dirname(__FILE__)

# 自分でパスを追加したい場合
$:.unshift(File.dirname(File.expand_path(__FILE__)) + '起動したプログラムからの相対パス')

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

ruby -I (ディレクトリ)でもパスを追加できる。起動用のシェルやbatを作成するといいかも。


#!/bin/bash

current_dir=`dirname $0`
cd ${current_dir}

ruby -I ./lib  $@

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

$
0
0

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

MVCとは

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

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

MVCアーキを利用すると、

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

などのメリットがある。

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

MVC実装例

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

MVC以前

普通の実装。

MVCの実装

Model, View, Controllerの3つにクラスを分割して実装。

proc, lambdaを導入する

上の例だと、ViewとControllerの間に依存関係がある。これをなくしたい。

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

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

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

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

$
0
0

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

RubyTk内でsleepが使えない

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

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

TkAfterをつかう

RubyTkでタイマ制御や定期監視のようなsleepに関わる処理に利用するライブラリがTkAfter.

使用例は以下のとおり。

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

なので、別の方法を考える。

Threadをつかう

RubyのThread機能を利用して、別スレッドで定期的な処理を動かす。

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

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

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

$
0
0

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

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

ステート・パターンとは

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

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

Spec

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

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

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

実装比較

普通の実装

if文が多いですね。

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

パターン適用後

感動のボイント

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


  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

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

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

$
0
0

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


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

sample.png

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))

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

Viewing all 91 articles
Browse latest View live