21 Feb 2014, 12:36

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

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

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

Ctagsを利用する

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

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

sudo apt-get install ctags

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

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

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

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

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

ripper-tags で高速化

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

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

gem install ripper-tags

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

ripper-tags -e -R -f TAGS

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

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

observrで保存を自動監視

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

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

以下でインストール。

gem install observer
gem install rev

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

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

監視スタート。

observr ripper.observr

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

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

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

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

 

19 Feb 2014, 15:13

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

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

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

rspec-kickstarterとは

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

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

つかってみる

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

require 'spec_helper'
require 'message_filter'

describe MessageFilter do

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

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

end

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

テストのリズム

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

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

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

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

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

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

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

18 Feb 2014, 23:59

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

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

結論

結論からいうと、

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

詳細

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

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

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

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

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

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

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

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

    <pre><code>

if $0 == FILE … end

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

18 Feb 2014, 13:28

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

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

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

人間失格。

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

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

Wikipediaから引用する。

スレッド

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

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

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

タスク

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

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

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

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

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

調査結果

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

C++からアプローチ

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

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

実装結果

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

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

タイマをつかってみた。

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

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

実装結果

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

まとめ

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

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

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

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


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

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


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

これはマルチタスク。


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

結論

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

17 Feb 2014, 13:04

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

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

つかってみる

以下からダウンロード。



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

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

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

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

実行形式は以下。

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

シェルを作成

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

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


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

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