Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

2017-03-10

Rakefile でタスクを階層化する

Rake でタスク名がコロンで区切られてるようなものがある。それを作ってみる。

今回は rake -T と実行したら、次のような出力を返すタスクを例にする。

$ rake -T
$ rake -T
rake setup       # セットアップを行なう
rake setup:gem   # Gem をインストールする
rake setup:pods  # Pods をインストールする

Rakefile は次の通り:

#
# セットアップ用のタスク
#
desc "セットアップを行なう"
task :setup => %w[
     setup:gem
     setup:pods
]

namespace :setup do
  desc "Gem をインストールする"
  task :gem do
    sh "bundle -j4 --path vendor/bundle"
  end

  desc "Pods をインストールする"
  task :pods do
    sh "bundle exec pod install"
  end
end

これで、rake setup:gem と打てば Gem のインストールが行なわれるし、rake setup:pods で Pods のインストールが行なえる。

setup という namespace を作ってやるのがミソ。

あと setup namespace のタスクを一括で実行できるよう setup タスクも用意している。

同種のタスクを作る時に、見やすく・理解しやすく、使いやすい形として namespace は便利。

2017-03-03

Rakefile でサフィックス・ルールを書く

Makefile で言うところのサフィックス・ルールを、Rakefile で書く方法を調べてみた。

Rakefile では rule を使ってルールを設定する。ここでは、plantuml コマンドを使って、PNG 画像を出力する Rakefile を例に説明す2。

PLANTUML = "~/bin/plantuml.jar"

task :default => :uml

desc "UML 図を更新する"
task :uml => ["profile.png", "timeline.png"]

rule '.png' => '.plantuml' do |t|
  sh "java -jar #{PLANTUML} #{t.source}"
end

plantuml のコマンドは次の書式で使う。

$ java -jar ~/path/to/plantuml.jar 入力ファイル名

plantuml.jar への PATH を変数 PLANTUML にセット。

タスク :uml を実行すると「UML 図を更新」するようにした。rake uml で profile.png 及び timeline.png が作成される。出来上がるファイル名はダブル・クォーテーションで囲む必要がある。これを忘れてて、rake uml が実行できない、と少し悩んだ。

最後に rule を設定している。拡張子 .png ファイルは、拡張子 .plintuml を持つファイルが更新された時に次行のコマンドを実行して作成される。

2015-09-15

Ruby で文字連結

Ruby で文字連結するにはいくつかのやり方があって、その方式によりパフォーマンスが違うと Qiita の記事を読んで知った。

str = 'abc' + 'def'

良く使う String#+ は、結合する文字列のサイズを求め、メモリー領域を確保するという。

str = 'abc' << 'def'

他方、String#<< (String#concat) は文字列 'abc' に後続文字列を足してゆく (メモリー破壊的)。メモリー領域の確保はメソッド実行時毎ではなく、足りなくなった時にだけ行なわれる。メモリー確保量は今の「倍」という。

String#<< の方が、String#+ より効率がいい。

使ってみた

こんなメソッドを書いていた。

def foo(key,value)
  return key +' = ' + value + "\n"
end

これを String#<< で書き直してみた。

def foo(key,value)
  return key << ' = ' << value << "\n"
end

すると、こんなエラーが出た。

can't modify frozen String (RuntimeError)

そういえば、String#<< は破壊的メソッドなんだった。コードをこんな感じで直してみた。

def foo(key,value)
  return "" << key << ' = ' << value << "\n"
end

これで解決。

このコードで本当に速くなっているのかな? 記事を書いてたら自信がなくなってきた。プロファイルを取ってみたいな。

2014-04-02

最近の rbenv (2014-04)

rbenv を使うと複数バージョンの Ruby を入れられる。過去にも一度記事にしたけれど、最近、少し使い方が変わったのでもう一度書く。

準備

Debian 系では下記パッケージを事前にインストール。

$ sudo apt-get install build-essential libreadline-dev libssl-dev zlib1g-dev

OS X では XCode Command Line が入っていれば大丈夫... かな?

rbenv インストール

rbenv は git リポジトリーからインストールする。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

Bash の場合、設定を .profile と .bashrc のどちらに書くか難しい。.profile はログイン時のみ読み込み、.bashrc は bash 起動時に読み込み。screen で複数のスクリーンを起動する場合、.bashrc に設定を書いておかないと、新しいスクリーンで rbenv の設定が読み込まれない。

ところが、Debian 系が用意している .bashrc には非対話で呼ばれた時に、後ろの設定を無視するコードが入っている。これは sudo で呼び出した時に rbenv の設定が読み込まれず困る。よって、設定を書くなら、.bashrc の最初に書くのが良い。というのが、今のぼくの結論。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

ruby-build のインストール

最近の ruby-build は ~/.rbenv/plugins ディレクトリー下に入れるのが主流らしい。

$ mkdir -p ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

ruby と bundle のインストール

ruby をインストールする。

$ rbenv install -l
$ rbenv install 2.1.1
$ rbenv global 2.1.1
$ rbenv rehash

bundle もインストール。

$ rbenv exec gem install bundle --no-ri --no-rdoc

あとがき

rbenv の設定ファイルの書き方にハマったので説明を加えたのと、ruby-build のインストール方法が変わったので記事を書き直した。bundle を gem install bundle するのと rbenv exec gem install bundle するので、どう違いがあるのか実は分かっていない ^^;

2014-01-16

Ruby の正規表現マッチには名前が付けられる

こんなことをやろうと思った。

文字列に「集合場所 ○○」と記入されていたら、○○の部分を抜き出すコード。

最初に思いついたのが、こんなコード。

if /^集合場所 (.+)/ =~ string
  p Regexp.last_match(1)
end

これは何とも読みづらい。最近の Ruby はマッチする () に名前を付けられると聞いた。さっそく試してみる。

if /^集合場所 (?<meeting_place>.+)/ =~ string
  p meeting_place
end

これは見やすくなった!!

蛇足: リファクタリング

コードは一応完成したけれど、一応入力ミス対策も入れておく。集合場所を半角スペースではなく全角スペースやタブで書く人もいるかもしれない。

if /^集合場所[   ](?<meeting_place>.+)/ =~ string
  p meeting_place
end

半角スペース・全角スペース・タブが入ってるけど、見た目で分からない。その上、誰かがソースコードを tabify したらタブが消えてしまう。ここは空白を表す [[:blank:]] を使う。せっかくなので複数スペース対策も入れておこう。

if /^集合場所[[:blank:]]+(?<meeting_place>.+)/ =~ string
  p meeting_place
end

やあ、人によっては「空白区切り」と言っているのに「:」を使うかもしれない。最後にその対策も入れておく。

if /^集合場所[[:blank:]::]+(?<meeting_place>.+)/ =~ string
  p meeting_place
end

半角と全角のコロンも入れた。これで完成。ちょっと見栄えが悪いけど、マッチした文字列との対応が分かり易いのが良いね。

2013-11-25

Emacs で Ruby スクリプトに magic comment を入れない設定

Emacs で Ruby のスクリプトを開いたら、自動的にエンコーディングに関するマジック・コメントが入った。

# -*- coding: utf-8 -*-

Ruby 2.0 以降は文字列毎にエンコード情報を持っているのでマジック・コメント要らないよ、と教えてもらった。今、メインで使っているのは Ruby 2.0 なのでマジック・コメント要らない。というかむしろ邪魔。そこで、この設定をオフにした。

.emacs に以下のコードを追加。

(setq ruby-insert-encoding-magic-comment nil)

これでマジック・コメントの挿入が抑制されるはず。

2013-05-05

rbenv 版 ruby の高速化

rbenv 版の ruby が rvm 版の ruby よりも遅いという話がある。理由を調べてみると、最適化オプションに違いがある。rvm には -O3 オプションが使われていたのに対して、rbenv では -O2 オプションが使われていた。この最適化オプションの違いが ruby のスピード差になっている。

ruby-build log

ruby-build の git log を見るとこうある。

commit 9f8d53365aef52c940095f583cdc82f02caba90f
Author: Erik Michaels-Ober <sferik@gmail.com>
Date:   Wed May 1 07:38:43 2013 -0700

    ruby-build 20130501

commit 2f8dcafb0ec2c5f478e7f45d7eca3a0f0a5ae8c0
Merge: 28b9bcb b219192
Author: Sam Stephenson <sstephenson@gmail.com>
Date:   Fri Apr 26 16:00:19 2013 -0700

    Merge pull request #351 from jeremy/restore-o3-cflags
    
    Restore -O3 default when we build with clang

commit b219192020b4641e057c9f168089f8488624ec64
Author: Jeremy Kemper <jeremy@bitsweat.net>
Date:   Fri Apr 26 15:06:43 2013 -0700

    Restore -O3 default when we build with clang

2013-04-26 に -O3 オプションが適用されるよう修正が入っている。

rbenv reinstall

rbenv に reinstall サブコマンドはない。ただ、install サブコマンドに --force オプションを付けると、強制的にもう一度インストールできる。これを使って、ruby を再インストールする:

$ cd ~/build/ruby-build
$ git pull
$ sudo ./install.sh
$ cd ~/.rbenv
$ git pull
$ cd
$ rbenv install --force 2.0.0-p0

あとがき

rbenv で -O3 オプションが適用される様になったことは書いた。ログを見るとコンパイラーが clang の場合に -O3 オプションが使われる様になっている。GNU gcc の場合はどうなのかな? そこまでは調べていない。

ref

2013-05-03

Gemfile に github の URL を書く方法

Gemfile で gem を取得する時、git を使うなら次の書き方ができる。

gem 'rubygems-format-dummy', :git => 'git://github.com/ataka/rubygems-format-dummy.git'

けれど、もし git のソースコードを github でホスティングしているなら、もっと簡単に書くことができる。

gem 'rubygems-format-dummy', :github => 'ataka/rubygems-format-dummy'

この書式のお蔭で chef 用の Gemfile が更にスッキリした。

$ cat /etc/chef/Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :github => 'ataka/rubygems-format-dummy'

イイナ。これ。

2013-04-28

ruby-2.0.0-p0 で chef 11.4.4 をインストールする

ruby-2.0.0-p0 で chef をインストールすると、chef 実行時にこんなエラーが出た。

/Users/ataka/project/chef/vendor/bundle/ruby/2.0.0/gems/chef-11.4.4/lib/chef/provider/package/rubygems.rb:34:in `require': cannot load such file -- rubygems/format (LoadError)

この件に関しては、過去記事でダミーの format gem を作ることで解決した。

けれど、このやり方は自分で gem を作らねばならず面倒。少しでも簡便にインストールできる様にしようと、rubygems-format-dummy を GitHub に置いた。

これで、Gemfile を次の様に書けばよくなる。

source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :git => 'git://github.com/ataka/rubygems-format-dummy.git'

bundle install

一応、インストール・ログを残しておく。Mac の OS X 10.8.2。rbenv + ruby-2.0.0-p0。bundle コマンドでローカルにインストール。

$ bundle install --path vendor/bundle
Fetching git://github.com/ataka/rubygems-format-dummy.git
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 21 (delta 4), reused 21 (delta 4)
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (4/4), done.
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing erubis (2.7.0)
Installing highline (1.6.18)
Using json (1.7.7)
Installing mixlib-log (1.6.0)
Installing mixlib-authentication (1.3.0)
Installing mixlib-cli (1.3.0)
Installing mixlib-config (1.1.2)
Installing mixlib-shellout (1.1.0)
Installing net-ssh (2.6.7)
Installing net-ssh-gateway (1.2.0)
Installing net-ssh-multi (1.1)
Installing ipaddress (0.8.0)
Installing systemu (2.5.2)
Installing yajl-ruby (1.1.0)
Installing ohai (6.16.0)
Installing mime-types (1.23)
Installing rest-client (1.6.7)
Installing chef (11.4.4)
Using rubygems-format-dummy (0.0.1) from git://github.com/ataka/rubygems-format-dummy.git (at master)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into ./vendor/bundle
$ rbenv rehash
$ bundle exec chef-solo -v
Chef: 11.4.4

あとがき

これは ruby-2.0.0 のバグなのかなぁ? それとも仕様なのかなァ? chef 側が fix すべきなのか、ruby 側が fix すべきなのか... さてさて困った。

2013-03-21

rvm でデフォールトの ruby のバージョンを指定する

rvm で ruby の 1.9.3 と 2.0.0 を入れている。現在、デフォールトが 1.9.3 なのだけど、メインに使っているのは 2.0.0。毎朝、rvm で ruby のバージョン切替を行なうのが面倒になったので、デフォールトの ruby version を 2.0.0 に変更した。

現状

$ rvm list

rvm rubies

=> ruby-1.9.3-p392 [ i686 ]
   ruby-2.0.0-p0 [ i686 ]

# Default ruby not set. Try 'rvm alias create default <ruby>'.

# => - current
# =* - current && default
#  * - default


$ rvm use 2.0.0
Using /home/ataka/.rvm/gems/ruby-2.0.0-p0
$ rvm current
ruby-2.0.0-p0

rvm list で利用可能な ruby の一覧を表示。

rvm current で現在利用中の ruby を表示。

デフォールトの変更

デフォールトの変更は --default オプションを付ける。

$ rvm use 2.0.0-p0 --default

あとがき

これで明日以降、面倒や変なトラブルに悩まされなくなるはず。

2013-03-19

rbenv で複数バージョンの Ruby をインストール

rbenv でも複数のバージョンの Ruby をインストール・切り替えが出来ると聞いたので試してみた。

rbenv と ruby-build のインストール

予め必要とされるライブラリーのインストール。

$ sudo apt-get install build-essential libreadline-dev libssl-dev zlib1g-dev

次に必要とされる rbenv コマンドと ruby-build コマンドをインストールする。rbenv はローカル環境にインストールするけど、ruby-build コマンドはシステムにインストールする。

rbenv のインストール

rbenv は git リポジトリーからインストールする。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

.bashrc もしくは .zshrc に次のコードを追記:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
ruby-build のインストール

ruby-build も git リポジトリーからインストールする。

$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh

以上で、rbenv と ruby-build のインストールは終了。

Ruby のインストール

rbenv は rvm と違って ruby のインストールをデフォールトで行なわない。

現在最新の Ruby 2.0.0-p0 と 1.9 系最後の 1.9.3-p392 をインストールする。

まず、rbenv でインストール可能な ruby を確認。

$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.8.7-p371
  1.9.1-p378
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.3-dev
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-p327
  1.9.3-p362
  1.9.3-p374
  1.9.3-p385
  1.9.3-p392
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  2.0.0-p0
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.1.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.6.8
  jruby-1.7.0
  jruby-1.7.0-preview1
  jruby-1.7.0-preview2
  jruby-1.7.0-rc1
  jruby-1.7.0-rc2
  jruby-1.7.1
  jruby-1.7.2
  jruby-1.7.3
  maglev-1.0.0
  maglev-1.1.0-dev
  rbx-1.2.4
  rbx-2.0.0-dev
  rbx-2.0.0-rc1
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02

rvm と同じく数が多いのも嬉しい。今のぼくは、素の ruby しかインストールしないので、それほどありがたみはないけれど...

少し嫌なのは、rvm と違ってパッチ番号まで指定しないといけないことかな。rvm なら 1.9.3 と指定すれば Ruby 1.9.3 の最新パッチがインストールされたけど、rbenv は 1.9.3-p392 と指定しないといけない。面倒。

先に書いた通り 2.0.0 と 1.9.3-p392 をインストールする。インストールには rbenv install を使う。

$ rbenv install 2.0.0-p0
Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...
Installed ruby-2.0.0-p0 to /home/masayuki/.rbenv/versions/2.0.0-p0

$ rbenv install 1.9.3-p392
...

Ruby の変更

今、使っている ruby の確認。

$ rbenv version
system (set by /home/ataka/.rbenv/version)
$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]

おやおや。昔、システムにインストールした Ruby が動いてる。

今、rbenv でインストールしている ruby のバージョンを確認。

$ rbenv versions
* system (set by /home/ataka/.rbenv/version)
  1.9.3-p392
  2.0.0-p0

rbenv global でバージョンを指定。

$ rbenv global 2.0.0
rbenv: version `2.0.0' not installed
$ rbenv global 2.0.0-p0
$ rbenv rehash
$ rbenv version
2.0.0-p0 (set by /home/ataka/.rbenv/version)
$ ruby --version
ruby 2.0.0p0 (2013-02-24 revision 39474) [i686-linux]

バージョン番号だけじゃ Ruby の変更は出来ないのか。ちゃんとパッチ番号まで含めて変更。rbenv rehash を忘れずに。また railsなど、コマンドが付いてくるタイプのgemをインストールしたとき、rbenv rehashを実行する必要がある とのこと。

特定のディレクトリーでの Ruby 指定

rbenv --local を使うと、そのディレクトリー以下での Ruby のバージョンを指定できる。

$ cd ~/project/first-project/
$ rbenv local 2.0.0-p0

bundler コマンドの --path オプションを併用することで、特定のディレクトリー下の gem も指定することができる。

$ bundle install --path vendor/bundle
$ bundle list

あとがき

rvm は cd などの shell のコマンドを上書きすると聞き、不安になったので rbenv をインストールしてみた。マシンによっては rvm が残ってるものもあるので、移行しなきゃなあ。

rbenv rehash の存在が面倒だけど、それ以外は rvm よりスマートな気がする。

ref

2013-03-07

Redmine 2 系へのアップグレード方法

古い Redmine (< 2.0) を最新の Redmine にアップグレードするので、メモ。今回、ぼくは開発版をインストールした。2013-03-07 現在、Redmine の最新版は 2.2.3 (2013-02-12 リリース)。開発版をインストールする場合でも、問題はないはず。

参考ドキュメント

開発版は公式の git mirror から頂く。

アップグレード手順は以下のページを参照した。

必須条件

アップグレード必須条件を書いておく (PostgreSQL や SQLite3 を使ってる人は、「Redmineのインストール | Redmine.JP」を参照のこと)。

  • Ruby 1.8.7, 1.9.2, 1.9.3
  • RubyGems <= 1.8
  • Rails 3.2.12
  • MySQL 5.0 以上

Ruby 2.0 には対応していない。各アプリケーションのバージョン・チェック方法は以下の通り:

$ ruby --version
$ gem --version
$ gem list | grep rails
$ mysql --version

必要に応じてアップデートを行なわれたし。

データのバックアップ

以降、旧 Redmine は /var/redmine/ 以下にインストールしたとして話を進める。バックアップ先は ~/redmine-bakups。

$ mkdir ~/redmine-backups
files ディレクトリーのバックアップ

Redmine にアップロードしたファイルは、全て files ディレクトリー以下に保存されている。

$ rsync -a /var/redmine/files/ ~/redmine-backups/files
MySQL DB のバックアップ

mysqldump コマンドを使う。

$ mkdir -p ~/redmine-backups/db
$ /usr/bin/mysqldump -u USER -pPASSWORD REDMINE_DB | gzip > ~/redmine-backups/db/redmine_`date +%y_%m_%d`.gz

REDMINE_DB の名前は /var/redmine/config/database.yml の中を見れば確認できる。

アップグレード作業

Redmine の入手

安定版を使う人はDownloadページから最新版を入手して解凍されたし。ぼくは開発版を git から取って来る。

$ cd /var
$ git clone git://github.com/redmine/redmine.git redmine-dev

redmine-dev というディレクトリーに clone。既存の redmine ディレクトリー (今、動いているバージョン) を上書きしちゃわないように。

Redmine の設定
  1. 旧い config/dababase.yml をコピー
  2. 旧い config/configuration.yml をコピー (ver. 1.2.0 より前からアップグレードする時は config/configuration.yml.example を config/configuration.yml にコピーした上で旧 config/email.yml の内容をコピーする)
  3. files ディレクトリー以下をバックアップから復帰
  4. プラグインのコピー (これは後回しの方が安全かな?)
  5. rake generate_secret_token で config/initializers/secret_token.rb を作る
  6. テーマのコピー (これも後回しで良いかな?)

実作業は次の通り:

$ cd /var/redmine-dev/config
$ cp -p ../../redmine/config/database.yml ./
$ cp -p configuration.yml.example configuration.yml
$ cat ../../redmine/config/email.yml >> configuration.yml
$ cd ..
$ rsync -a ~/redmine-backups/files/* files
$ rake generate_secrete_token
$ ls config/initializers/secret_token.rb
config/initializers/secret_token.rb

トラブル・トラブル・トラブル

実は rake generate_secrete_toke する所でエラーになった。

 rake aborted!
no such file to load -- bundler/setup

bundler が必要らしいけれど、インストールされていない。インストールしようとしたら、gem のバージョンが古い (bundler は gem 1.3.6 以上) という。そんなわけで gem をアップデートして bundler をインストール。

$ sudo gem1.8 install rubygems-update -v 1.3.6
$ sudo update-rubygems
$ sudo gem1.8 install bundler

旧い Redmine が稼動中なので、gem をシステム・インストールするのは怖い。もしかすると、動かなくなるかも。bundler は --path オプションでローカルにファイルをインストールできる。推奨とされる ./vendor/bundle 以下にインストールすることにした:

$ cd /var/redmine-dev
$ bundle install --path vendor/bundle

しかし、ImageMagick 系でエラー。

checking for Magick-config... no
Can't install RMagick 2.13.2. Can't find Magick-config in (後略)

Magick-config がないという。ImageMagick 系のパッケージをインストール:

$ sudo apt-get install graphicsmagick-libmagick-dev-compat 

再度、bundle コマンド実行。

checking for wand/MagickWand.h... no

お次は wand/MagickWand.h がないという。libmagickwand-dev をインストール。

$ sudo apt-get install libmagickwand-dev

さあ、どうだ!!

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Using rake (10.0.3)
Using i18n (0.6.4)
Using multi_json (1.6.1)
Using activesupport (3.2.12)
Using builder (3.0.0)
Using activemodel (3.2.12)
Using erubis (2.7.0)
Using journey (1.0.4)
Using rack (1.4.5)
Using rack-cache (1.2)
Using rack-test (0.6.2)
Using hike (1.2.1)
Using tilt (1.3.4)
Using sprockets (2.2.2)
Using actionpack (3.2.12)
Using mime-types (1.21)
Using polyglot (0.3.3)
Using treetop (1.4.12)
Using mail (2.4.4)
Using actionmailer (3.2.12)
Using arel (3.0.2)
Using tzinfo (0.3.36)
Using activerecord (3.2.12)
Using activeresource (3.2.12)
Using metaclass (0.0.1)
Using mocha (0.10.5)
Using bourne (1.1.2)
Using bundler (1.3.1)
Using nokogiri (1.5.6)
Using ffi (1.4.0)
Using childprocess (0.3.9)
Using rubyzip (0.9.9)
Using websocket (1.0.7)
Using selenium-webdriver (2.31.0)
Using xpath (1.0.0)
Using capybara (2.0.2)
Using coderay (1.0.9)
Using fastercsv (1.5.5)
Using rack-ssl (1.3.3)
Using json (1.7.7)
Using rdoc (3.12.2)
Using thor (0.17.0)
Using railties (3.2.12)
Using jquery-rails (2.0.3)
Using mysql (2.8.1)
Using net-ldap (0.3.1)
Using ruby-openid (2.1.8)
Using rack-openid (1.3.1)
Using rails (3.2.12)
Installing rmagick (2.13.2)
Installing shoulda-context (1.0.2)
Installing shoulda-matchers (1.4.2)
Installing shoulda (3.3.2)
Installing yard (0.8.5.2)
Your bundle is complete! It was installed into ./vendor/bundle

成功!!

rake をこのまま実行すると、システムの gems を使ってしまう。bundle exec を使うと、--path で指定・インストールした gems を使ってくれる。なのでこれからの作業は bundle exec 付きで実行。

$ bundle exec rake generate_secret_token
$ ls config/initializers/secret_token.rb
config/initializers/secret_token.rb

secret_token.rb が出来ていることを確認して一安心。

MySQL の設定

MySQL の初期設定を行なう。

ここからは、ローカルの gems を使うので bundle exec を付ける。システム・インストールした gems を使う人は、適宜 bundle exec を消して作業されたい。

$ bundle exec rake db:migrate RAILS_ENV=production
クリーンアップ

キャッシュとセッション・ファイルをクリアする。

$ bundle exec rake tmp:cache:clear
$ bundle exec rake tmp:sessions:clear
パーミッションの変更

Apache などのウェブ・サーバーがディレクトリーにアクセスできるようにパーミッションを変更。

$ sudo chown -R redmine:redmine files log tmp
$ sudo chmod -R 755 files log tmp
確認

以上で Redmine 側の設定はおしまい。心配症な方は WEBrick サーバーを起動してチェック。

$ ruby script/rails server webrick -e production

ぼくはやらなかったけどね。

おしまい

最後にアプリケーション・サーバー (Apache とか) を再起動して実行。

DB を壊しちゃった人は、バックアップから復帰して再挑戦?

$ mysql -u USER -pPASSWORD REDMINE_DB < ~/redmine-backups/db/redmine_YYYY_MM_DD.gz

古い Redmine からアップグレードしようとすると、rake db:migrate RAILS_ENV=production でエラーが出るかもしれない。その場合は Redmine 2.2.2 をダウンロードして上の記事を参考に rake db:migrate ... を実行。データベースを新しくしてから、もう一度最新の Redmine で rake db:migrate ... をかける。

2013-03-06

irb —— Ruby のお手軽実行

Ruby のコードを書くのに、小さなコードのテストがしたい。でも、ファイルを開けて、一行程度のコードを書いて、shell から ruby を実行する... なんてしたくない。手軽に実行できる環境はないものかしらん、と聞いてみたら irb の存在を教えてもらった。

Ruby と一緒にインストールされるらしい。実行は irb コマンドを打つだけ。すると、ワンラナー形式で Ruby のコードが試せる。irb の中なら、設定した項目 (例えば def) も生きている。

$ irb
1.9.3p392 :001 > 'bye ' * 4
 => "bye bye bye bye "
1.9.3p392 :002 > str='bye '; str * 4
 => "bye bye bye bye "
1.9.3p392 :003 > 'foo'.center 20
 => "        foo         "
1.9.3p392 :004 > 'Sec 1'.ljust(10) + 'p.8'.rjust(10)
 => "Sec 1            p.8"
1.9.3p392 :005 > foo=['foo','bar','hoge']; foo.each {|f| print "This is #{f}\n"} 
This is foo
This is bar
This is hoge
 => ["foo", "bar", "hoge"]
1.9.3p392 :006 > def a(x) x * 5; end
 => nil
1.9.3p392 :007 > a(3)
 => 15
1.9.3p392 :008 > exit

exit で終了。こりゃいいや。

RVM で複数バージョンの Ruby をインストール

RVM (Ruby enViroment Manager) を使うと、Ruby のバージョン切り替え及び gem の環境切り替えができると聞いたので、インストール・メモと利用方法のメモ。

以下のサイトを参考にした。

インストールでハマる

apt-get でインストールできるかと思って試したら、どうもパッケージが見つからない。

$ rvm
プログラム 'rvm' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install ruby-rvm
$ sudo apt-get install ruby-rvm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: ruby-rvm のパッケージが見つかりません

ふふふ、ステキ (泣)。

インストール

» Installing Ruby RVM on Ubuntu 12.10 Obfuscated Reality を参考にインストール。まずは必要とされるパッケージを念のためインストール。

$  sudo apt-get install libxslt1.1 libxslt1-dev xvfb build-essential git-core curl libreadline-dev libyaml-dev libsqlite3-dev libgdbm-dev libffi-de libssl-dev

その後、rvm のインストール・コマンドを実行。

$ \curl -L https://get.rvm.io | bash -s stable --ruby

最新版 Ruby と各種必須ツール (らしきもの) のインストールが行なわれる。システム・インストールではなく、ユーザー・インストールになるらしい。インストール先は ~/.rvm/ 以下。インストールが終わると、次の様な文言が現れる

* To start using RVM you need to run `source ~/.rvm/scripts/rvm` in all your open shell windows, in rare cases you need to reopen all shell windows.

毎回コマンドを実行するのは面倒なので .bashrc に上記コマンドを書き込んでおく。

source $HOME/.rvm/scripts/rvm

Ruby の確認

インストールされた Ruby を確認する。

$ rvm list

rvm rubies

=* ruby-2.0.0-p0 [ i686 ]

# => - current
# =* - current && default
#  * - default

ruby-2.0.0-p0 がインストールされてた。

一応確認。

$ ls -F ~/.rvm/rubies/
default@  ruby-2.0.0-p0/

Ruby 1.9.* のインストール

最新の Ruby では困ることもあるので、枯れた Ruby も入れておく。

まずは rvm でインストール可能な ruby のバージョン確認。

$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-p371]
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p320]
[ruby-]1.9.3-p125
[ruby-]1.9.3-p194
[ruby-]1.9.3-p286
[ruby-]1.9.3-p327
[ruby-]1.9.3-p362
[ruby-]1.9.3-p374
[ruby-]1.9.3-p385
[ruby-]1.9.3-[p392]
[ruby-]1.9.3-head
[ruby-]2.0.0-rc1
[ruby-]2.0.0-rc2
[ruby-]2.0.0[-p0]
ruby-head

# GoRuby
goruby

# TheCodeShop - MRI experimental patches
tcs

# jamesgolick - All around gangster
jamesgolick

# Minimalistic ruby implementation - ISO 30170:2012
mruby[-head]

# JRuby
jruby-1.2.0
jruby-1.3.1
jruby-1.4.0
jruby-1.6.5.1
jruby-1.6.6
jruby-1.6.7.2
jruby-1.6.8
jruby[-1.7.3]
jruby-head

# Rubinius
rbx-1.0.1
rbx-1.1.1
rbx-1.2.3
rbx-1.2.4
rbx[-head]
rbx-2.0.testing
rbx-2.0.0-rc1

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7][-2012.02]

# Kiji
kiji

# MagLev
maglev[-head]
maglev-1.0.0

# Mac OS X Snow Leopard Or Newer
macruby-0.10
macruby-0.11
macruby[-0.12]
macruby-nightly
macruby-head

# Opal
opal

# IronRuby
ironruby[-1.1.3]
ironruby-head

山の様に出てきた。ここでは、Ruby 1.9.3 系の最新版をインストールしてみる。

インストールには rvm install を使う。

$ rvm install 1.9.3
Searching for binary rubies, this might take some time.
No binary rubies available for: ubuntu/12.10/i386/ruby-1.9.3-p392.
Continuing with compilation. Please read 'rvm mount' to get more information on binary rubies.
Installing Ruby from source to: /home/ataka/.rvm/rubies/ruby-1.9.3-p392, this may take a while depending on your cpu(s)...
ruby-1.9.3-p392 - #downloading ruby-1.9.3-p392, this may take a while depending on your connection...
######################################################################## 100.0%
ruby-1.9.3-p392 - #extracting ruby-1.9.3-p392 to /home/ataka/.rvm/src/ruby-1.9.3-p392
ruby-1.9.3-p392 - #extracted to /home/ataka/.rvm/src/ruby-1.9.3-p392
ruby-1.9.3-p392 - #configuring
ruby-1.9.3-p392 - #compiling
ruby-1.9.3-p392 - #installing
Retrieving rubygems-1.8.25
######################################################################## 100.0%
Extracting rubygems-1.8.25 ...
Removing old Rubygems files...
Installing rubygems-1.8.25 for ruby-1.9.3-p392 ...
Installation of rubygems completed successfully.
Saving wrappers to '/home/ataka/.rvm/bin'.
ruby-1.9.3-p392 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.3-p392 - #importing default gemsets, this may take time ...
Install of ruby-1.9.3-p392 - #complete

バージョンを切り替える

まず、今、インストールされてる ruby のバージョンを確認。rvm list で詳細情報が表示される。

$ ruby --version
ruby 2.0.0p0 (2013-02-24 revision 39474) [i686-linux]
$ which ruby
/home/ataka/.rvm/rubies/ruby-2.0.0-p0/bin/ruby
$ rvm list

rvm rubies

   ruby-1.9.3-p392 [ i686 ]
=* ruby-2.0.0-p0 [ i686 ]

# => - current
# =* - current && default
#  * - default

最新 2.0.0-p0 と 1.9.3-p392 がインストールされ、現在のデフォールトが ruby-2.0.0. なことが分かる。

rvm use でバージョンを変更。

$ rvm use 1.9.3
Using /home/ataka/.rvm/gems/ruby-1.9.3-p392
$ ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [i686-linux]

うん。OK。

あとがき

長くなったので、gem のインストールについてはまた次回。しかし、もう最新の Ruby 2.0 が入るようになっているとはね。便利。便利。

2013-03-04

Ruby で文字列置換 〜 正規表現を使わずに その 2

clmemo@aka: Ruby で文字列置換 〜 正規表現を使わずに の続き。Just another Ruby porter, さんの記事を参考に。

ここでは&&=を使うのがぴったり。

str["perl"] &&= "ruby"

Re: Ruby で文字列置換 〜 正規表現を使わずに - jarp, より引用

おお、とても良いことを教えてもらった。ありがとう!!

試してみる

元のコードは次の通り。

str = "This is perl test"
pl = "perl"

if str.include?(pl)
  str[pl] = "ruby"
end

これを、&&= を使って書き直すと、こうなる。

str = "This is perl test"
pl = "perl"
str[pl] &&= "ruby"

わっ。コードの量が減って可読性も上がった。バグも減らせそう。

すると、前のエントリーの最終コードは次の様にシンプルになる。

IMAGE = [
  "http://www.foo.org/bar.png",
  "http://www.hogehoge.net/o/NNN_NNNN.jpg",
  "http://sample.net/more.png"
]

IMAGE.each { |img|
  line[img] &&= "external/" + File.basename(img)
}

とてもスッキリ、これは良いね。

Syntax Sugar

Just another Ruby porte, さんによると、&&= は次のコードのシンタックス・シュガーとのこと。

str["perl"] &&= "ruby" (シンタックス・シュガー)
str["perl"] && str["perl"] = "ruby" (本来のコード)

フムフム、勉強になる。str["perl"] 自身が bool 値を返すのか?

ワンライナーで確認。

$ ruby -e 'p "This is perl"'
"This is perl"
$ ruby -e 'p "This is perl".include?("perl")'
true
$ ruby -e 'p "This is perl"["perl"]'
"perl"
$ ruby -e 'p "This is perl"["ruby"]'
nil

上から見ていく。一つ目は文字列の確認。OK。

二つ目は include? のテスト。true が返ってる。

三つ目は str["words"] のテスト。なるほど、マッチした文字列が返るのか。Ruby は nil もしくは false 以外は true と等価なので、"perl" が返っているからこのテストは true と。

四つ目は、わざと間違えてみるテスト。見事に nil が返ってる。フムフム、すると str["perl"] = ruby で文字列 str に perl が含まれていないと、nil = ruby という風になっちゃうからエラーになるのね。

Ruby 面白いなぁ。

2013-03-02

Ruby で文字列置換 〜 正規表現を使わずに

Ruby で文字列置換をしたいと思って頭を悩ませた。なんとか出来たのでメモ。

文字列[置換される文字列] = 置換する文字列 という構文を使う。サンプル。

str = "This is perl test"
p str
str["perl"] = "ruby"
p str

これを実行する。出力は以下の通り。

"This is perl test"
"This is ruby test"

上手く行った。

一手間かける

このままだと、文字列 str が文字列「perl」を含んでいるかどうかが分からない。include? を使う。

str = "This is perl test"
pl = "perl"

if str.include?(pl)
  str[pl] = "ruby"
end
p str

出力を見てみる。

 "This is ruby test"

う〜ん、この判定は必要なのかな? 分からないや。一応、念のため。

配列を使って

本当は、絶対 URL を相対 URL に変えたかった。ただし、ほとんどの絶対 URL は外へのリンクとして残しておいて、一部の URL だけ相対 URL に変えたかった。本来のコードは、こうなってる。予め相対リンクにする URL をリスト・アップしておいて each で回す。

IMAGE = [
  "http://www.foo.org/bar.png",
  "http://www.hogehoge.net/o/NNN_NNNN.jpg",
  "http://sample.net/more.png"
]

IMAGE.each { |img|
  if line.include?(img)
    line[img] = "external/" + File.basename(img)
  end
}

出力例はもう出さないよ。これで、絶対 URL の画像を external ディレクトリー以下から参照するように変更できた。

あとがき

置換と言えば正規表現なのだけど、URL を正規表現に変えるのが面倒で... なんかコストもかかりそうだったし。文字列で置換が出来ないものかと調べて、この方法に辿りついた。

もっと良い方法があったり、間違いを犯しているようならご指摘たまわりたい。

ref

  • class String (Ruby 1.9.2 リファレンスマニュアル)

2013-02-09

Ruby on Rails の準備メモ

Ubuntu Linux 10.04 をまだ使い続けている。

最近、Ruby on Rails に興味を持って遊んでみようと思ったところ、Ubuntu 10.04 の Ruby は古いという。というわけで、Rails を始めるに当たって、やったことのメモ。インストールしたのは、libYAML と Ruby と RubyGems。

libYaml のインストール

RubyGems をインストールしようとしたら、Ruby が libyaml に対応していない... と警告が出た。簡易インストール。

$ sudo apt-get install libyaml-dev

Ruby-1.9 のインストール

ソースコードを入手して、コンパイル。

$ ./configure
$ make
$ sudo make install

RubyGems-1.8 のインストール

ソースコードを入手して、setup.rb を実行。

$ sudo ruby setup.rb

Ruby on Rails のインストール

インストール前に gem (Ruby のパッケージ・マネージャー) で最新版にアップデート。

$ sudo gem update --system
Latest version currently installed. Aborting.

その後、Ruby on Rails をインストール。

$ sudo gem install rails

とりあえず、今日はここまで!!

2012-06-28

if (条件A || 条件B) の条件文が長くなったら、どこでコードを折り返すか?

先日、Twitter でタイトルの様な質問に出会った。この問いに簡単に答えたのだけど、140 字では全てを伝えきれないので、改めてブログのエントリーにする。

前置き

短い if 文をこう書くとする。

if (条件A || 条件B) 省略

if 文の中が長くなった時、読みづらい。

if (とっても長〜〜〜い条件A || とっても長〜〜〜い条件B) 省略

この時、どう書くのが良いか? 一例としてこんなのがある。

if (
    とっても長〜〜〜い条件A ||
    とっても長〜〜〜い条件B
) 省略

|| を条件式の後ろに置く書き方。

私見

ぼくは || を条件式の前に置く書き方を好む。

if (
    とっても長〜〜〜い条件A
    || とっても長〜〜〜い条件B
) 省略

インデントが少し崩れる。これはデメリットとして認める。

それよりも、「OR」である事が行頭を見るだけで分かるメリットを強調したい。「前置き」に例示した行末に置くやり方だと、行末まで目を動かさないと、条件式が || で繋がっていることを確認できない。

ぼくらは最初から if (条件A || 条件B) というコードを見ているので「OR」だと分かっているけれども、実際にコードを読む時はそれが「OR」なのか「AND」なのか分かっていない。行頭に置けば、初めて読むコードでも一目瞭然になる。

if (
    とっても長〜〜〜い条件A
    || とっても長〜〜〜い条件B
    || とっても長〜〜〜い条件C
    || とっても長〜〜〜い条件D
    || とっても長〜〜〜い条件E
) 省略

条件文が複雑になった時も、読みやすい。理解しやすい。

if (
    (
      とっても長〜〜〜い条件A
      || とっても長〜〜〜い条件B
    )
    &&
    (
      とっても長〜〜〜い条件C
      || とっても長〜〜〜い条件D
      || とっても長〜〜〜い条件E
    )
) 省略

分かりやすい、ということはバグが減るということ。コーディング一つ取っても、少し気を配るだけでバグを減らせる。

あとがき

本来、こういった長い条件文は、別関数にするのが定石。

ただ、プロファイルを見たらループの中の if 文の条件文がネックになってて、関数呼び出ししないコードにすることでプログラムの致命的な遅さが解決する... なんて泥臭いケースがある。マクロ (Lisp など) やインライン関数 (C99, C++ など) が使える言語なら幸せだけど、そういう言語を使っていない場合もある。

そういう場合に備えて、一つ頭の隅に入れておいてもらえれば。

なお、これはあくまでぼくのやり方にすぎない。他に良い方法があれば、是非、ブログの記事にして欲しい。

2012-05-29

社会人プログラマー向けのお勧め参考書記事が参考になる

という記事を読んだ。書かれたのは 2012-03-30。良記事なので、ブックマークを兼ねて紹介する。

タイトルは「新社会人 Web プログラマ向け」と書いてあるけれども、プログラマーだったら誰でも読む価値あり。大学生・高校生でも読める本は沢山ある。ウェブ・プログラマーじゃなくても、開発手法や VCS (Version Control System) の参考書は勉強になる。こういった参考書を読み漁って十分な知識を得た上級者には、他人に本を薦める時の手間を省いてくれる記事になる。

目次は以下の通り:

  1. プログラマとしての心得
  2. 開発手法
  3. WEB (追加)
  4. データベース
  5. VCS
  6. エディタ
    1. Emacs
    2. Vim
  7. CI/CD
  8. PHP
  9. JavaScript
  10. Ruby
  11. Python
  12. Perl
  13. “プロ”グラマ向け
  14. その他

各項目ごとに参考書が複数冊紹介されており、それぞれにコメントが付けられている。コメントは短いもので一行。たいてい 4 行。本を読んでみようか、興味を持つには十分な長さ。ぼくは全ての本を読んだわけじゃないけれども、良書が並んでいると思う。

2010-12-16

Emacs Evernote-mode -- Emacs から Evernote のノートを編集する

Emacs から Evernote のノートを編集できたらどれだけ便利だろう? 正にそんな EmacsLisp が開発されている。その名も evernote-mode.el。Emacs 22 以上で動作。バックエンドに Ruby (1.8.7 以上) を利用する。

本エントリーではインストール方法と簡単な使い方を紹介する。

Evernote-mode のインストール

まずは Google Code から emacs-evernote-mode プロジェクトのソースコードを入手する。ぼくは最近 Git に傾倒しているのでgit-svn を使ってソースコードを取得した。

$ cd project
$ git svn clone http://emacs-evernote-mode.googlecode.com/svn/trunk/ emacs-evernote
$ ls emacs-evernote
APACHE-LICENSE-2.0.txt  doc/  evernote-mode.el  ruby/

EmacsLisp のソースコードは一つだけ。主な作業は ruby でやっていて、evernote-mode.el はそのフロントエンドになっている。

まず、ruby スクリプトのインストールを行なう。

$ cd ~/project/emacs-evernote
$ cd ruby
$ sudo ruby setup.rb

次に EmacsLisp のソースコードを Emacs の load-path 上に置く。

$ cp evernote-mode.el ~/your/load/path

最後に .emacs に Evernote 用の設定を追加する。

;;
;; Evernote mode
;;
(setq evernote-enml-formatter-command '("w3m" "-dump" "-I" "UTF8" "-O" "UTF8")) ; optional
(require 'evernote-mode)
(global-set-key "\C-cec" 'evernote-create-note)
(global-set-key "\C-ceo" 'evernote-open-note)
(global-set-key "\C-ces" 'evernote-search-notes)
(global-set-key "\C-ceS" 'evernote-do-saved-search)
(global-set-key "\C-cew" 'evernote-write-note)
(global-set-key "\C-cep" 'evernote-post-region)
(global-set-key "\C-ceb" 'evernote-browser)

追加パッケージ

インストール作業が終了して、Evernote を開こうとしたら次の様なエラー・メッセージが出ることがある。

Unknown error (/usr/local/lib/site_ruby/1.8/thrift/transport/http_client_transport.rb:22:in `require': no such file to load -- net/https (LoadError))

これは、バックエンドで使っている ruby ライブラリーが足りていないために起きる。Ubuntu Linux 10.4 では、次のコマンドで足りない ruby ライブラリーを追加できる。

$ sudo apt-get install libhttpclient-ruby1.8

プロキシー

もし proxy を通さなければいけない場合は、.bashrc に次の一行を追加する。

export EN_PROXY=proxy.hoge.com:8080

簡単な使い方

C-cec (or M-x evernote-create-note) で新規の Evernote ノートを開いてみませう。

まず最初に Evernote のアカウントとパスワードを尋ねられる。

次にノートに付ける「タグ」を聞かれる。タグはカンマ区切りで複数設定可能。タグを付けたくない場合はそのまま RET

次はノートの名前 (タイトル)。

次に Edit mode を尋ねられる。Edit mode には XHTML と TEXT の 2 種類があるけど、今回は簡単な「TEXT」を選んでみる。

以上で、Evernote のノート用のバッファーが開かれる。ファイルの保存 (C-x C-s) をすると、自動的に Evernote 側に保存される様になっている。

簡単な使い方は以上。

ヘルプ

詳しい説明は本家ページの README をどうぞ。

落ち穂拾い

  • C-ceo: 既存のノートを開く
  • C-cew: バッファーを Evernote の新規ノートとして保存する。ローカルで書いたファイルを、Evernote にバックアップしたい時に重宝する
  • C-cep: バッファー全体ではなくリージョンを Evernote の新規ノートとして保存する
  • C-cet: ノートの「タグ」を変更する (変更後 C-x C-s で保存する必要あり)
  • C-cer: ノートの「名前」を変更する (変更後 C-x C-s で保存する必要あり)

Edit mode について

本エントリーでは簡単のため、TEXT モードのみの説明を行なった。Emacs-evernote-mode には TEXT モードの他に XHTML モードがある。

Evernote のノートにはリンクや太文字も書ける。これはただのテキストではない。どうやって実現しているのか? 実は Evernote のノートは ENML DTD に従う XML で書かれている。

DTD を読める人は enml2.dtd を読んでもらうとして、分からない人は HTML の簡易版と思ってもらえばいい。Emacs Evernote mode で Edit mode を「XHTML」にすると、直に ENML なテキストを編集できる。つまり、太字にしたり、リンクを張ったり、画像を貼ったりということが可能になる (多少の HTML の知識さえあれば!)

一旦、保存 (C-x C-s) すると ENML で書いたテキストが整形された上で「読み込み」専用モードになる。そこで C-x C-q してやると、「書き込み」モードに戻り、テキストの整形が解除されて再び ENML のソースコードが現れる。

ENML での編集が面倒になったら、C-cee で Edit mode を XHTML から TEXT に変更できる。逆に TEXT モードで編集後、少しノートに飾り付けをしたい場合にも C-cee で Edit mode を XHTML に変更可能。

あとがき

Emacs evernote-mode は EmacsLisp として久々に心ワクワクさせてくれる。まだ使い込んでいないので、早く使い回したい。