17 Feb 2014, 12:32

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

はじめに

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 `<main>'

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

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

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

Ruby/Tk 参考Links

<div class="outline-text-4" id="text-1-0-1">
  <ul class="org-ul">
    <li>
      <a href="http://www.tcl.tk/">Tcl Developer Site</a>
    </li>
    <li>
      <a href="http://ronor.web.fc2.com/rubytk/">Ruby/Tk入門</a>
    </li>
    <li>
      <a href="http://magazine.rubyist.net/?0003-RubyTkMovement">Rubyist Magazine &#8211; Ruby/Tk の動向</a>
    </li>
  </ul>
</div></p>

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

ついでに拡張tkも

tkはrequireできたけど、拡張tkをrequireするとエラーする。


require "tkextlib/tkimg/png"
require "tkextlib/tkimg/jpeg"

これは、libtk-imgを入れることで解決。

sudo apt-get install libtk-img

tkextlib/tileがつかえない!

tkextlib/tileをrequireすると、エラーした。tk-tileを入れる。

sudo apt-get install tk-tile

それでもエラーする!これもバグみたい。tcltk 8.5をインストールすればいいよとのこと。

結局8.5を頑張って入れる

tileを利用するには、8.5を入れる必要がある。 しかし、パッチを当てても自分の環境ではうまくいかない。 こまりあぐねていたが、以下のエントリを発見。

Ruby 1.8でも tcltk8.5をいれようという内容。これを真似してRuby2.0でも入れてみる。

tcl/tk8.5をインストール。

sudo apt-get install tcl8.5-dev tk8.5-dev

tk-devをいれていなかったらこれもインストール。(いろいろやりすぎて、どれが正解なのかわからない)

シンボリックリンクも作成。

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

Ruby公式サイトから2.0をダウンロード。

あとはコンパイルするのみ。


cd ruby2.0.0-p353/ext/tk
CONFIGURE_ARGS='--with-tcl-include=/usr/include/tcl8.5/ --with-tcllib=tcl8.5 --with-tklib=tk8.5' ruby extconf.rb
make

rubyはシステムのrubyを利用してコンパイルする。 mkmfというライブラリをつかっているので、ruby-devか入っていなかったら入れておく。

これで、コンパイルに成功すると、tcl/tk8.5版の tcltklib.soができるはず!

これを、既存のtcltklib.soと置き換える。

cd ~/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/x86_64-linux
sudo mv tcltklib.so tcltklib.so.bak
suod cp (コンパイルしたtcltklib.so) .

これで、tkextlib/tileがつかえるようになった。

irb(main):004:0* require 'tkextlib/tile'
=> true

なんか、Mint 64bit環境ででRuby/tkをつかうのがめちゃくちゃ大変なのだけれども。ボクには ruby/tkはレベル高すぎて使いこなせる気がしない。。。

11 Feb 2014, 23:47

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

161227: 内容が古くなったので、書き直しました。

[toc]

はじめに

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

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

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

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

準備

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

環境

  • Emacs 24.3.1
  • Ruby 2.1.0

優れた IDE の条件

優れた IDE が備えるべき機能は以下

  • シンタックスハイライト/ インデント
    • ruby-mode
  • 検索・置換 iedit, multiple-cursors, helm-ag, helm-swoop….etc
  • タグジャンプ ctags
  • コード補間
    • auto-complete, yasnippet
  • エラーチェック
    • flycheck
  • リファクタリング emacs-refactor
  • インタープリタ・デバッカ inf-ruby, pry
  • プロジェクト管理 projectile

シンタックスハイライト/ インデント

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$" . ruby-mode))
 (add-to-list 'auto-mode-alist '("Capfile$" . ruby-mode))
 (add-to-list 'auto-mode-alist '("Gemfile$" . ruby-mode))
 (add-to-list 'auto-mode-alist '("[Rr]akefile$" . ruby-mode))

enhanced-ruby-mode

今は, enhanced-ruby-mode というものもあるらしい.

以下の機能を強化.

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

自分はただの 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 で置換する.

参考:enhanced-ruby-mode の概説 - Qiita

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)

検索・置換

検索や置換機能が優れているところが Emacs のいいところ。 以下、自分がよく利用するものを列挙。

  • iedit
  • multiple-cursors
  • helm-ag -> 今は ripgrep の方がよい。
  • helm-swoop

コードリーディング

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 を参照.

helm-rdefs

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

gem install rdefs

helm I/F を経由して, Emacs から利用することができる.

.emacs の設定は以下.

(require 'helm)
(require 'helm-rdefs)
(add-hook 'ruby-mode-hook
          (lambda ()
            (define-key ruby-mode-map (kbd "C-c @") 'helm-rdefs)))

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

auto-highlight-symbol

シンボルをハイライト表示してくれる.

(require 'auto-highlight-symbol)
(global-auto-highlight-symbol-mode t))

タグジャンプ

ctags/ripper-tags

記事を独立させました.

試してないけれども、GNU GLOBAL でもタグジャンプができるみたい。

コード補完

robe

Ruby 用の補完をする. 補完は auto-complete という有名な elisp がある. もっと賢いのがオムニ補完と呼ばれるもの. これは文法を解析して補完してくれる.

el-get 経由で robe-mode を入れる.

また, pry というものも必要みたい. 詳しくは github の README 参照で.

gem install pry pry-doc method_source

設定を追記.

 ; robe
(autoload 'robe-mode "robe" "Code navigation, documentation lookup and completion for Ruby" t nil)
(autoload 'robe-ac-setup "robe-ac" "robe auto-complete" nil nil)
(add-hook 'robe-mode-hook 'robe-ac-setup)

補完以外にも、ドキュメント参照とか、定義ジャンプができるようだ。すごいぞ robe!!

  • Jump to method definition
  • Jump to super or a constructor called at point
  • Jump to a module or class (provided it has at least one method defined)
  • Display method documentation
  • Display information about method called at point using ElDoc
  • Method and constant name completion

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

エラーチェックといえば flycheck だ。flymake の時代は終わったと思っている。

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

ついでに, flycheck をカラフルにする flycheck-color-mode-line も入れた.

flycheck のチェッカーとして ruby-lint と robocop を入れてみる.

rubocop

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

まずは, gem で robocop をインストール.

gem install rubocop

.emacs の設定は以下.

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

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

  • https://github.com/bbatsov/ruby-style-guide

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

    さらに, 前述の 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 (ruby-mode motion-mode))

ruby-lint

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 (ruby-mode ruby-mode))

リファクタリング

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 でリファクタリングをするためのツール.

.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 は変数を抽出してはくれないのであまり賢くない.

インタープリタ・デバッカ

rubydb

標準ライブラリのデバッカ. ステップ実行できる. elisp は ruby のソースに梱包されている.

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 でバッファが起動. これだけ.

pry

inf-ruby よりも高機能らしい REPL.

(require 'pry)
;; optional suggestions
(global-set-key [S-f9] 'pry-intercept)
(global-set-key [f9] 'pry-intercept-rerun)

quickrun

素早く Ruby スクリプト を実行。

(require 'quickrun)

RSpec

記事を独立させました。

プロジェクト管理

rake

Interaction with rake command tool.

(use-package rake
  :config
  (eval-after-load 'ruby-mode
    '(define-key ruby-mode-map (kbd "C-!") 'rake))
  (setq rake-completion-system 'helm))

projectile

プロジェクト管理といえばこれ。

Project Interaction Library for Emacs.

自動でプロジェクトのルートディレクトリを探して, それ以下のファイルを見つけたり色々できる.

.projectile ファイルをマニュアルで作成することで, そのフォルダを Route Folder と認識出来る.(要 Emacs 再起動)

(require 'projectile)
(projectile-global-mode)
;; 大きいプロジェクトだと劇的に改善するらしい.
(setq projectile-enable-caching t)

projectile-rails

Ruby on rails 用.

(require 'projectile-rails)
(add-hook 'projectile-mode-hook 'projectile-rails-on)

10 Feb 2014, 05:14

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

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

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

ブレインテキストの威力

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

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

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

プレインテキストの定義

<div class="outline-text-3" id="text-1-2">
  <blockquote>
    <p>
      プレイン・テキストとは、印字可能な文字からなる、人間が直接読んで理解することのできる形式です。
    </p>

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

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

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

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

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

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

<div class="outline-text-3" id="text-1-3">
  <blockquote>
    <p>
      ソースコード管理システムは巨大なUNDOキー。
    </p>

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

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

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

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

<div class="outline-text-3" id="text-1-4">
  <blockquote>
    <p>
      全てはドキュメント。
    </p>

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

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

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

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

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

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

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

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

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

つまりは、

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

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

10 Feb 2014, 05:14

散文的ブログラミングの哲学につら抜かれたCleanCodeでカルチャーショック体験

ボブおじさんのProfessionalな哲学につら抜かれた本、CleanCodeを読んだ。

感想

めくるめくカルチャーショック体験

<div class="outline-text-3" id="text-1-1">
  <p>
    この本は、自分のこれからのコーディングスタイルを変えるかもしれないと思った。 ページをめくる度に、新たな発見と感動を感じた。
  </p>

  <p>
    カルチャーショックの詳細は、下の方に列挙するが、ダイジェストを書くと、
  </p>

  <ul class="org-ul">
    <li>
      コメントは嘘
    </li>
    <li>
      関数は20行以内
    </li>
    <li>
      コードは上から下へ物語のように書く
    </li>
  </ul>

  <p>
    つまり一言で言うと、
  </p>

  <p>
    文章のようにコーディングする
  </p>

  <p>
    ということ。
  </p></p>
</div></p>

散文的プログラミング

<div class="outline-text-3" id="text-1-2">
  <p>
    散文的プログラミング、文芸的ブログラミング、それらは考え方としては 知っていたが、所詮は妄想だと思っていた。
  </p>

  <p>
    しかし、そのような夢を本気で追求し、かつ実践し、 そのようなことは可能であるということを、具体的な方法で示しているのがこの本。
  </p>

  <p>
    この本では、Fitnesseのコードがよく例として引用される。
  </p>

  <p>
    それをみると、なるほど完全な文章ではないにしろ、とても綺麗だ。 読んでいて意味が頭に入る。これがCleanCodeなのかと思った。
  </p></p>
</div></p>

道を極めた男の武道書

<div class="outline-text-3" id="text-1-3">
  <p>
    この本は、~すべし、~べきというような、断定的な表現が多用される。
  </p>

  <p>
    冒頭で、この本はアジャイルマスターによる指南書だとかかれている。
  </p>

  <p>
    この本にかかれている方法が絶対ではない、とは思う。 武道にも流派はたくさんある。 この本は、道を極めたある男が記した、免許皆伝のための武道書と見ることができる。
  </p></p>
</div></p>

詳細

クリーンコード

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

<div id="outline-container-sec-2-1-1" class="outline-4">
  <h4 id="sec-2-1-1">
    プログラミングとは、コードとは
  </h4>

  <div class="outline-text-4" id="text-2-1-1">
    <p>
      まず初めに、プログラミングの定義がかかれている。
    </p>

    <ul class="org-ul">
      <li>
        機械に実行可能なものとするのがプログラミング、こうした仕様がコード
      </li>
    </ul>

    <p>
      コードがなくなることはないと語られている。モデル駆動開発がどんどん洗練されて、コードが自動生成されるようになっても、そのモデルを書くことがコーディングだと言っている(と解釈した)コードは要求の表現なので。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-2-1-2" class="outline-4">
  <h4 id="sec-2-1-2">
    Clean Codeとは
  </h4>

  <div class="outline-text-4" id="text-2-1-2">
    <p>
      CleanCodeの定義について、有名人の意見を募っている。一行に要約してみた。
    </p>

    <ul class="org-ul">
      <li>
        ビャーネ・ストラウストリップ・・・エレガントで効率がよいもの、1つのことをうまくやるもの
      </li>
      <li>
        グラディ・ブーチ・・・単純で直接的なもの
      </li>
      <li>
        デーブ・トーマス・・・文芸的であるもの
      </li>
      <li>
        マイケル・フェザーズ・・・気配りがきいているもの
      </li>
      <li>
        ロン・ジェフリーズ・・・重複を減らし、表現力を高め、単純な抽象化をしたもの
      </li>
      <li>
        ワード・カンニガム・・・その言語が、その問題のためにつくられたように見えるもの
      </li>
    </ul>

    <p>
      また、CleanCodeを書くため方法はこう書かれている。
    </p>

    <ul class="org-ul">
      <li>
        きれいなコードを書くためには、骨身を惜しまずに獲得した「きれいさ」のセンスをもって、無数の小さな手法を規律を持って適用する必要があります。この「コードのセンス」が必要なのです。
      </li>
      <li>
        洗練したコードを書くプログラマというのは、まっさらな画面に変形を加えていくことで、エレガントにコーディングされたシステムを造りあげる芸術家なのです。
      </li>
    </ul>

    <p>
      エレガントなセンス、という言葉に引っかかった。
    </p>

    <p>
      エレガントとは、優雅さ、洗練さとともに、精神性をも意味する。精神性、つまりその人のスタイルで貫かれた洗練さが、CleanCode。 この本にかかれているボブおじさんのスタイルは、まさに個性的なコードだ。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-2-1-3" class="outline-4">
  <h4 id="sec-2-1-3">
    意味のある名前
  </h4>

  <div class="outline-text-4" id="text-2-1-3">
    <p>
      名前づけについては、いろいろな本で語られているので新たに知ったことについてのみ、メモする。
    </p>

    <ul class="org-ul">
      <li>
        発音可能なものをつける
      </li>
      <li>
        ハンガリアン記法は、悪。
      </li>
    </ul>

    <p>
      ハンガリアン記法はコンパイラが型チェックを実装していないときにできたもの。現代のコンパイラは型チェックを行うので、不要。
    </p>

    <ul class="org-ul">
      <li>
        メンタルマッピングを避ける。
      </li>
    </ul>

    <p>
      メンタルマッピングとは、読んだ人が、ああこれはこの略だと頭の中で変換する思考プロセス。
    </p></p>
  </div></p>
</div></p>

関数

<div class="outline-text-3" id="text-2-2">
  <p>
    この章はなかなかカルチャーショックな部分が多く、興奮した。
  </p>

  <ul class="org-ul">
    <li>
      関数の第一規律は、小さくせよ、第二の規律は、さらに小さくせよ。
    </li>
  </ul>

  <p>
    ギャグのような経験則!小さくするための大胆な発言がこの先に続く。
  </p>

  <ul class="org-ul">
    <li>
      関数の長さが20行に達することなど、ほとんどないようにすべき
    </li>
    <li>
      if文、else文、while文などのブロック文が1行のながさでなければならない。そうすることで、ドキュメントとしての価値も生まれる。
    </li>
    <li>
      インデントレベルは1つか2つ
    </li>
    <li>
      関数の名前で示される、ある一つの抽象レベルにおけるいくつかのステップでのみ表現されるなら、その関数は一つのことをしています。関数を書く目的は、ある1つのより広い概念を、抽象レベルのいくつかのステップに分解すること。
    </li>
    <li>
      逓減原則: コードは上から下へと物語のように読める必要がある。関数は、抽象レベルの順番に並んでいる必要がある。
    </li>
    <li>
      switch文は、一度しか現れず、多態オブジェクトを生成し、継承の裏にかくされている場合のみ使う。それ以外はつかわない。
    </li>
    <li>
      引数は、理想的には0、その次が1、その次が2。3以上は避ける。引数が多くなったらクラスに抽出する。
    </li>
    <li>
      関数名は、動詞(名詞)の組み合わせ。
    </li>
    <li>
      出力引数は必要ない、thisが代わりになる。出力引数の使用は避ける。
    </li>
    <li>
      コマンド・照会の分離原則: 関数は、何らかの処理を行うか、何らかの応答を返すか(bool)のどちらかを行うべき。
    </li>
    <li>
      エラーコードはつかわず、例外処理を利用する。なぜなら、コードが単純になるので。try/catch内のブロックは関数として外へ出す。初めにtry-catch-finallyを書く。
    </li>
  </ul>

  <p>
    どの発言も、自分にとっては衝撃的だ。しかし、筆者は同じ衝撃をケント・ベッグのコードを読んで受けたそうだ。そして、その衝撃を原動力として、自分の手法や考えを洗練させた。自分もそれに倣いたいと思う。
  </p></p>
</div></p>

コメント

<div class="outline-text-3" id="text-2-3">
  <p>
    コメントも刺激的な発言が多く、頭をピリピリさせる興奮を得る。
  </p>

  <ul class="org-ul">
    <li>
      コメントは大して、いやおそらくまったく必要ない!
    </li>
    <li>
      コードでうまく表現するのに失敗したときに、それを補うために使用する。
    </li>
    <li>
      コメントは、メンテナンスされずに嘘が書いてある。コードこそが、真に正確な情報の源。
    </li>
    <li>
      コメントを書く時間があったら綺麗で表現豊かなコードへリファクタリングしろ。
    </li>
  </ul>

  <p>
    コメントを文章として書くのではなく、Extract Methodすればよいのか!これが、CleanCodeの極意なのか!
  </p>

  <p>
    前の章で、メソッドの長さの目安はせいぜい20行と書いてあった。あまりメソッドの抽出を実施すると、パフォーマンスに影響がでるのでは?
  </p>

  <p>
    と思ったが、そのことについては、前に調べたのだった。コンパイラは賢いので、小さいメソッドならばインライン化してくれる。
  </p>

  <p>
    <a href="http://futurismo.biz/archives/1939">組込み開発の二大迷信に挑む!リファクタリングにおけるパフォーマンスとスタックオーバーフローについての数値実験</a>
  </p>

  <p>
    中途半端に小さいことは駄目なのだ。コンパイラの進化を信じる。もっと小さくが正義。
  </p>

  <ul class="org-ul">
    <li>
      コメントアウトは、それを削除する勇気がないだけ。60年代にはコメントアウトする価値はあった。現代は、ソースコード管理システムが覚えているので、もはや必要ない。
    </li>
    <li>
      変更履歴、日誌コメント、これらはソースコード管理システムのなかった時代のもの。全部削除するべきです。
    </li>
  </ul>

  <p>
    つまり、ソースコード管理システムで管理するものはソースのなかに書かないということ。こういう考え方もかなりカルチャーショック。
  </p>

  <ul class="org-ul">
    <li>
      変数にコメントを強要するルールはまったく馬鹿げている。コードを雑然とさせ、嘘を喧伝し、混乱と無秩序へとコードを誘うでしょう。
    </li>
    <li>
      短い関数に関数ヘッダは不要。関数によく練られた名前をつけ、小さくし、一つのことを行うようにすることは、コメントヘッダをつけることに勝る。
    </li>
  </ul>

  <p>
    まったくその通り!仕事だと、自明な関数にも仕事ではコメントを強要される。こういう不自由な規則があるから、メソッドの抽出や名前変更が進まず、モンスター関数が量産される。 関数ヘッダに時間を割くならば、よい関数名や変数名を考えることに時間を割きたいものだ。
  </p></p>
</div></p>

データ・オブジェクトの非対象性

<div class="outline-text-3" id="text-2-4">
  <ul class="org-ul">
    <li>
      実装の隠蔽とは、抽象化!クラスというのは、変数をゲッタ、セッタを通してクラスの外に伝えるものではない。抽象インタフェースを公開することで、データの実装を知らせることなしに、利用者にデータの本質を操作させる。
    </li>
    <li>
      オブジェクトは、データを隠して抽象化し、データを操作する機能を与える。
    </li>
  </ul>

  <p>
    データとオブジェクトの違いを再認識。なにも考えずにgetterとsetterを作るのはpublicにするのと同意。良く考えることにする。
  </p></p>
</div></p>

クラス

<div class="outline-text-3" id="text-2-5">
  <ul class="org-ul">
    <li>
      クラスの規則は、小さくすること。第二の規則は、もっと小さくすること。責務の数で、小さくする。
    </li>
    <li>
      クラスの簡単な解説は、もし、そして、あるいは、しかし、といった単語以外の単語をつかって、25語以内(日本語だと100文字)程度で作成するべき。
    </li>
    <li>
      単一責務の原則(Single Responsibirity Principle) クラス、モジュールの変更となる原因となるものが1つでなければならない。
    </li>
    <li>
      多くの開発者は、1つの責務を持った小さなクラスが溢れかえることで、全体を見失うのではないかと危惧しています。
    </li>
  </ul>

  <p>
    ある一つの大きな作業を行うために、小さなクラスを渡り歩かなければならないかと心配します。 しかし、小さなクラスの集まりとして構成されたシステムは大きな少数のクラスで構成されたシステムよりも、可動部分がすくない。
  </p>

  <p>
    この考え方は実物を見るのが早い。この本で出てくるFitnesseのgithubを除くと、そこには小さく分割された無数のファイルとディレクトリがズラズラとならんでいてビックリした。
  </p>

  <p>
    git clone git://github.com/unclebob/fitnesse
  </p>

  <p>
    小さなクラスが適切に管理されたディレクトリの中に整然と並んでいる。管理の単位がファイルごとではなくて、サブディレクトリごとなのだ。一つ、抽象度が高いのだ。 これも、カルチャーショック。
  </p></p>
</div></p>

その他

<div class="outline-text-3" id="text-2-6">
  <ul class="org-ul">
    <li>
      説明的変数。プログラムを読みやすくする強力な手法の1つは、計算の途中結果を変数に格納し、その変数に説明的な名前をつける。
    </li>
    <li>
      条件をカブセル化する。条件の意図を示す関数で抽出する。
    </li>
    <li>
      条件の否定形を避ける。否定形の条件は肯定形よりもわかりにくい。
    </li>
  </ul>
</div></p>

08 Feb 2014, 07:16

Androidタブレット ASUS Nexus 7 (2012) を買ったよ

先週のことだけれども、Androidアプリの学習がしたいので、NEXUS7を購入した。

今までは、iPhoneとiPadで身を固めたAppleユーザだった。 しかし、12月ごろからAndroidの勉強をcourseraを利用して勉強しているので、Androidデバイスがどうしても欲しかったのだ。 Androidはシミュレータを利用すればデバイスを持っていなくても開発できるが、それでは心が悲しみで満たされる。

ヨドバシで購入した。値段は何と3000円!

もともとが15000円だけれども、WIMAX同時契約で5000引き、ヨドバシポイントで7000円引きだ。 ただし、e-mobile解約金を15000円払ってWIMAXに乗り換えたので、得したのか損したのか良く分からない。

クワッドコア、32GBで15000円。安い理由は、一年前の型落モデルなので。最新ではないか、開発用に利用するには十分だ。

Amazonから持ってきたスペックもメモしとく。

ブランドASUSTek

商品重量340 g

商品の寸法12 x 19.8 x 1 cm

メーカー型番NEXUS7-32G

カラーブラウン

商品の寸法 幅 × 高さ19.8 x 10 mm

画面サイズ7 インチ

解像度800×1,280

CPUブランドNVIDIA CPU

速度1.3 GHz RAM

容量1000 MB

HDD容量32 GB

HDDインターフェースSolid State

ワイヤレスタイプ802.11bgn

OSAndroid 4.1

充電時間4 時間

バッテリー寿命9.5 時間

リチウム電池1 watt_hours

リチウム電池パックbatteries_contained_in_equipment

リチウム電池 電圧1

V リチウム電池重量1 g

リチウムイオン電池数1

07 Feb 2014, 14:12

Rubyistになった日

仕事で新しいプロジェクトに加わることになった。

そのプロジェクトでの開発言語は、なんとRubyだ!

今まで、気が向いたらRubyをいじったりしていたが、ついに仕事でもRubyが使えるのだ。素直に、とてもうれしい。

開発期間は2ヶ月だが、これから2ヶ月間、本気出す。つまりは、

Rubyistになるのだ!

Rubyは楽しい

11月から、軽いうつ病だった。このエントリを書いたあたりから、ちょっと精神が病んでた。

仕事もやりがいがなく、途方にくれていた。プログラマとはなにか、どうすればプログラマになれるのだと日々悶々してた。

そんななか、Youtubeでこんな動画を見つけた。

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

  • キレイなコード、オブジェクト指向、テスタビリティはRubyにおいて正統である。
  • Rubyは楽しい。
  • Rubyを使えばいい仕事ができる。

とても感動した。

この動画をみて、Rubyがより好きになった。たのしいRubyも読み直した。閲覧数が少ないけど、この動画はもっと評価されるべき。

Rubyをいじっているうちに、だんだん元気になってきた。 Rubyだけが回復の要因ではないが(9割は抗うつ剤のおかげだが)、Rubyとともに元気になったという思い込みもあって、Rubyが今では大好きだ

そんななか、まさかのRubyの仕事だ。ほんとうに、うれしい。Rubyは楽しい。Rubyをつかえば自分は元気になる、そう信じている。

02 Feb 2014, 12:28

プログラミングできなくてもAndroidアプリができる!Courseraの「Creative, Serious and Playful Science of Android Apps」を受けた

Androidのアプリを作りたいので、Courseraでイリノイ大学のAndroidアプリ製作の講義を受けた!

[//www.youtube.com/embed/6rTbNJsztUU]

初心者にもやさしいAndroid講義

この講義は、以下の2つに分かれているところが特徴。

  • 非プログラマ向けの講義 : 1week – 5week
  • プログラマ向けの講義 : 6week – 9week

前半の1-5weekの講義が終わると、一応講義としても終了の単位がもらえる。後半は意欲があるひとのみが挑戦できるが、成績には影響しない。 怠惰な自分は前半の講義のみを受講したので、感想も前半部分の内容のみということで。

内容は、非プログラマにも理解できるようにということで、とてもやさしくて、丁寧。Javaの文法や、Eclipseの使い方などなど、一つ一つわかりやすく解説される。 しかし、EclipseやJavaに慣れ親しんでいる自分としては、講義の速度が遅く、物足りない部分も多々あった。 そういう人のために、後半の講義も用意されているのだと思う。

開発環境まわりでハマっても、Discussion Forumsをのぞくと大抵解決方法が見つかる。なにしろ、10万人が参加しているのだ。

自分と同じところでハマっている人は五万といる。 StackOverFlowで探すよりも、Forumで探した方がよい。ここが、MOOCの凄さ。

宿題はアプリ製作

Assignmentは、もちろんAndroidアプリ製作だ!5weekを通して、Lectureで3本、Assignmentで4本のアプリをつくる。

一番はじめの講義で、開発環境を整えた。記事にもまとめた。

Eclipse ADTでつくるAndroidエミュレータ開発環境構築メモ(Windows) | Futurismo

それから、2,3回目の講義で、基本的なアプリ製作の流れが解説される。そして、宿題で2本のアプリをこなす。 4,5weekの講義では、音楽や画像をつかうライブラリの解説や、Activityの制御など、やや本格的なものが解説されて、それをベースに宿題で2本のアプリをつくる。

Assignmentが終了すると、PairReviewもある。これは、別の人のつくったアプリをお互いに評価し合う。知らない国の知らない人のアプリを見るのはおもしろかった。

以下、Assignmentで作成したアプリのスナップショット。

ShannonKnuth

<div class="outline-text-3" id="text-2-1">
  <p>
    CS分野で有名な偉人を2人選んで、その紹介ページを作成する。これはWebベージをつくるようなお手軽な課題だった。
  </p>

  <p>
    <img alt="" src="http://lh6.ggpht.com/-3OADb9oo8ew/Uu5IvqNp5rI/AAAAAAAABBA/9CjaGYSrPAs/b69dfd00754411e3a3a1412d6a21891f.png" />
  </p>
</div>

Maracas

<div class="outline-text-3" id="text-2-2">
  <p>
    自由課題。Android端末の向きを変えるとマラカスの音がなるというくだらないアプリ。portrateとland-scapeの制御を応用。
  </p>

  <p>
    <img alt="" src="http://lh6.ggpht.com/-GYnTyQ-dydg/Uu5JEJ8ziRI/AAAAAAAABBI/87anf9TTpjE/7e37c85075cc11e3bdef9f148d21a5b9.png" />
  </p>
</div>

MisteryTures

<div class="outline-text-3" id="text-2-3">
  <p>
    4つのlayoutが渡される。ホームのlayoutから4つのページに遷移するようなアプリを作る。それぞれのページで音をならしたり、JavaScriptのゲームを動かしたりと。 ここでは、Activityの制御を応用する。
  </p>

  <p>
    <img alt="" src="http://lh3.ggpht.com/-cVD572_tZ3g/Uu5JRYh7bBI/AAAAAAAABBQ/kQ3G5nozJ-g/4a68d210868611e3a7c56f69d855062b.png" />
  </p>
</div>

RosenKavalier

<div class="outline-text-3" id="text-2-4">
  <p>
    自由課題。オペラ「ばらの騎士」のCDレビューを買いて、適当に音楽を鳴らしてwebページ遷移を作成した。時間がないので、手抜きの突貫工事・・・お恥ずかしい。
  </p>

  <p>
    <img alt="" src="http://lh6.ggpht.com/-pULzIWGlVto/Uu5Jaie53nI/AAAAAAAABBg/6lWxVCgrKAA/18e27c90868711e3a36ccd7596303339.png" />
  </p>
</div>

おわりに

本当に簡単なならば製作できるスキルはつく。しかし、本当に簡単なアプリしかできないため、売れる気がしないが・・・、いやアプリ製作はアイデア勝負か??

Androidアプリはファームなので、Android製作は泥臭いものかと思っていた。 しかし、実際にはWebページを製作するような感覚だった。こういうのは実際にやってみないと気づかないことだ。

後半の講義を受けないもう一つの理由は、平行してこっちのAndroidの講義を受けているから。

これからは、こっちの講義で頑張る!

02 Feb 2014, 04:15

実用的EmacsLispが満載!明日から使えるテクニック集 「Emacsテクニックバイブル」を読んだ

Emacsをより極めるために、Emacsテクニックバイブルを読んだ。



内容

サブタイトルが、作業効率を改善する200の技。

その名のとおり、便利なEmacsLispが次々と、そして網羅的に紹介されていく。Emacsでできることを全て紹介してやるみたいな気概がある。

前書きをすこし引用すると、

多くの解説書ではEmacs標準の機能の解説に重点を置いていますが、本書は外部パッケージに目を向けています。
なぜなら、外部パッケージは既存の機能とは異なる発想で製作されていたり、既存の機能をより良くしていくものが多いからです。

導入方法も丁寧にかかれているため、この本に従って作業すれば、簡単に自分のemacs環境も増強できる。実用的な本。

EmacsLispの文法も紹介されている。.emacsを増強するためには、この文法を知っておくと便利。

2010年出版ということで、2014年現在ではすこし古い内容になっている部分もある。

anythingの解説本

<div class="outline-text-3" id="text-1-1">
  <p>
    Emacsの「今」を紹介するために、anythingとその文法がそれぞれ一章ずつつかって解説されている。 anythingはEmacsをEmacsたらしめるとまで言われている、ライフチェンジ的な便利なelips。 anythingがなにかを知りたいならば、この本を本やで立ち読みするのもいい。
  </p>
</div>

感想

Elisp情報は、この本を買わなくてもネットには散らばってる。 しかし、本にまとまってることで、散らかった情報をまとめてに手に入れることができる。 今回、一気に自分のEmacs環境をパワーアップさせようと考えていたので、そんななか本書に出会えたのは運がいい。

一つ一つの部分が小さいので、時間が少しできたときにコツコツよんで、気軽に増強していけるのがよい。

anythingについて

<div class="outline-text-3" id="text-2-1">
  <p>
    anythingよりも、現在はそのforkであるhelmの方が有名になっていて、自分もhelmを利用している。 anythingもhelmも考え方や機能はそれほど変わらないため、helmの解説と思って、anythingの章を読んだ。 このanythingの考え方や操作方法は、本当にライフチェンジで、これなしではもうEmacsを触る気がしない、素晴らしいElispだ。
  </p>
</div>

Emacs実践入門との比較

<div class="outline-text-3" id="text-2-2">
  <p>
    Emacs実践入門のあとに本書を読んだので、テクニックは似通っているところもあった。
  </p>

  <hr />

  <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/Emacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%EF%BD%9E%E6%80%9D%E8%80%83%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%81%97%E3%80%81%E9%96%8B%E7%99%BA%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-WEB-DB-PRESS-plus/dp/4774150029%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774150029' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51M3ahu1q8L._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/Emacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%EF%BD%9E%E6%80%9D%E8%80%83%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%81%97%E3%80%81%E9%96%8B%E7%99%BA%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-WEB-DB-PRESS-plus/dp/4774150029%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774150029' rel='nofollow' target='_blank'>Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)</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.02
        </div>

        <div class='amazlink-detail'>
          大竹 智也
        </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/Emacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%EF%BD%9E%E6%80%9D%E8%80%83%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%81%97%E3%80%81%E9%96%8B%E7%99%BA%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-WEB-DB-PRESS-plus/dp/4774150029%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774150029' 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%2F11554259%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D11554259%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <hr />

  <p>
    Emacs実践入門に比べて、このテクニックバイブルの方がよりマニアック。 ちょっとしたマイナーなelipsももれなく、網羅的に拾い上げて解説している。 入り口としては、Emacs実践入門の方がよい。Emacs実践入門では満足できない人は、この本まで手を伸ばすのがよい。
  </p>
</div>

さいごに

この本に従って作業をすることで、有名な拡張は、一通り自分のinit.elにも導入できた。

Emacsは素晴らしい。この本を読んで、Emacsの拡張性がさらに好きになった。

19 Jan 2014, 13:55

世界最高の開発環境~CUIのリズムとハーモニーが生み出す極上の交響楽

ネットサーフィンをしていて、ふとこんな記事を偶然見つけた。

また、同じ時期にこんなつぶやきも偶然見つけた。

 

これらに強く心を突き動かされ、休日2日を利用して最高の作業環境を構築してみた。

最高の開発ツールの条件

よいツールの条件は、

  • 軽快に動作すること
  • コマンドラインであること
  • 開発が活発であること、勢いがあること
  • カスタマイズが可能であること

世界最高の開発環境

この観点で選んだツールたちを以下に列挙。

zsh tmuxは2014年現在でのデファクトスタンダード。

Emacs vs Vimはどちらもそれぞれ優れているが、自分はEmacs派。

Rictyは美しいフォント、molokaiは美しいテーマ、デザイン大事!

ibus-anthyは自分の隠し兵器、親指シフト用。

WMはいいとこ取りをしたXMonad、ターミナルはxmonadと相性のよいurxvt。

OSは、Linuxが大前提、Windowsはありえない。

Mintを選んでいるのはなりゆきだ。

コアな人はArchLinuxを選ぶが、自分はチキンなので可愛いMintを。

XMonadをつかっているところで、もはやMintである意味がないのだが・・・。

また、これらはdotfilesで管理され、常に進化を遂げていく。

CUIの生み出す音楽

CUIをベースとして、お互いのツールが有機的に絡み合あい、ハーモニーを生み出す。

軽快さとストレスフリーな心地よい、CUIのリズムがとても魅力的だ。

最高の開発環境を駆使しながら作業をすることは、極上の音楽の中に浸るようなものである。

19 Jan 2014, 12:53

タイル型ウィンドウマネージャという新たな世界観に衝撃を受けた!XmonadをつかってワクワクCUI生活

GUIのウィンドウを自由自在に操ることができる タイル型ウィンドウマネージャ、Xmonadを導入しました。

[toc]

タイル型ウィンドウマネージャとは

コマンドラインにこだわりはじめると、なんでもかんでもコマンドラインで完結させたくなる。

screenやtmuxのようなマルチプレクサは、とても快適だがそれをGUIでも実施するにはどうすればいいか調べたところ、タイル型ウィンドウマネージャの存在を知った。

タイル型ウィンドウマネージャとは、ウィンドウをコマンドラインで操ることのできるツール。

説明は、Wikipediaに譲るとして、タイル型ウィンドウマネージャを知ったことは、カルチャーショックだった。初めてコマンドラインの世界にふれて、コンピュータにはこういう側面もあるのか、というような感動を受けた。

タイル型WMには様々な種類があるようだ。XmonadとAwesomeが2大勢力のようなので、XMonadの方を導入してみた。

環境

  • Linux Mint 16 Cinnamon

セットアップ

公式サイトの Documentation – Quick start for the impatientに従いセットアップします。

インストール

Linux MintはUbuntuと同様に3つのパッケージが必要。

$ sudo apt-get xmonad
$ sudo apt-get instasll libghc-xmonad-dev
$ sudo apt-get instasll libghc-xmonad-contrib-dev

設定ファイルの作成

$HOME/.xmonad/xmonad.hsに設定ファイルを新規作成する。

もっとも基本的な設定ファイルは以下。Haskellで記述されている。

import XMonad

main = do
xmonad $ defaultConfig

Xmonadの起動

ログアウトする。ログイン画面で、「セッション」とかかれた部分を選択。「XMonad」を選択し、ログインする。ログインすると、なんと真っ黒な画面!

ここでかなりあせったが、実はこれはXMonadでログインしている証拠。あせらず騒がず【右Alt + Shift + Enter】を入力。これで、ターミナルが起動され、操作が可能になる。

Xmonadの使い方

ここまで着たら、ガイダンスに従って操作を覚えていく。

基本をメモ

– mod-shift-return: ターミナル起動

– mod-shift-q: xmonad終了

– mod-p: dmenu起動

– mod-q: 再起動

– mod-space: レイアウト配置変更

– mod-j/k/m: focus変更

– mod-h/l: サイズ変更

– mod-tab: レイアウト移動

manコマンドでも使い方がわかる。

man xmonad

カスタマイズ

一通り操作を覚えたら、カスタマイズを飽きるまで行う。以下のページをベースにカスタマイズ。

dmenuの導入

アプリケーションランチャーである、dmenuを導入する。

$ sudo apt-get install dmenu

Mod-pで上部にランチャーが表示されるので、適当に検索してツールを実行。例えばchromeで検索すると、google-chromeがすぐに引っかかる。

ショートカットキーの変更

Mod Keyはデフォルト 右Altなので、これをカタカナ・ひらがなキーに変更する。(

~/.Xmodmapを新規作成して、以下を書く。既存のmod3をクリアして、Henkan_Modeを設定。

clear mod3
add mod3 = Hiragana_Katakana

キーに対応する名前は、xevを起動して調べることができる。

xmonad.hsの defaultConfig内に以下を追記。

modMask  = mod3Mask,

最後に、以下で有効にする。

xmodmap $HOME/.Xmodmape

起動時にこの設定を有効にするために、~/.xsessionに追記しておく。

これで、使いやすくなったか???いや・・・微妙だ。

ターミナルの変更

ターミナルはMint defaultのgnome-terminalではなくて、軽量なterminalである、unicode-rvxtを利用。xmonad.hsの defaultConfigに以下を追記。

terminal = "urxvt"

XMobar

ステータスバーを表示させるために、xmobarを入れる。他にも、dzen2というツールがある。

$ sudo apt-get install xmobar

次に、設定ファイル~/.xmobarrcを作成。テンプレートを利用してみる。

$ cp /usr/share/doc/xmobar/examples/xmobar.config ~/.xmobarrc

.xmobar/xmobar.hsの mainのすぐ下の行に以下を追記することで、xmonad起動の延長でxmobarを起動することができる。

xmproc <- spawnPipe "/usr/bin/xmobar /home/tsu-nera/.xmobarrc"

キーボードショートカットの設定

以下のように書くことで、キーボードショートカットが設定できる。ここでは、Winキーとの組み合わせで設定

import XMonad.Actions.WindowGo

-- for keyboard shortcut
modm = mod4Mask

`additionalKeys`
 [
 ((modm, xK_e), runOrRaise "emacs" (className =? "Emacs"))
 , ((modm, xK_t), runOrRaise "urxvt" (className =? "URxvt"))
 , ((modm, xK_g), runOrRaise "chrome" (className =? "Google-chrome-stable"))
 ]

クラス名は、このコマンドを端末から実行して、+ のカーソルで調べたいWindowをクリックする。

xprop | grep WM_CLASS

背景の設定

fehという軽量な画像ビューアーで表示する方法が載っていたので、これを利用。

インストール。

sudo apt-get install feh

以下で背景を設定できる。

feh --bg-scale ~/Pictures/wallpaper/moonlight.png

これを.xsessionに書くと、なぜか動作しなかった。しかたがないので、.profileに記入した。

ファイルマネージャー

Mintのファイルマネージャー、nemoを利用すると、勝手にデスクトップを変更されるので、nemoは –no-desktopモードで起動する。aliasを.zshenvに切る。

alias nemo='nemo --no-display'

ショートカットでフルスクリーン

Mod + Spaceを押したときのデフォルトでは、複数回キーを押さないとフルスクリーンにならないので、これを改善。以下のサイトを参考に設定した。これは便利!

まとめ

ほかにも、いろいろと細かい設定が必要だけれども、きりがないので今日はこんなところで。

いろいろな作業をコマンドラインで実施することができるので、とても快適。しかし、残念ながらマウスを使わざるを得ないところもある。たとえば、ブラウザ操作のコピぺはマウスに頼らざるを得ない。

タイル型WMとの出会いはとても感動的だ。

さらなる精進をつんで、立派なCUIマスターになりたい。