iriya-ufo's blog

Curiosity was simply the first derivative of knowledge.

複数の環境で Rails を開発する

普段は MacOS 使って Rails いじってますが Ubuntu を使った時も同じように開発できたらなと思ったのでやり方を書きます。また開発環境は以下を想定しています。

  • 既存の Rails プロジェクトのコードは github で管理
  • Rails アプリは heroku で公開
  • これから述べる環境構築は Ubuntu プラットフォームの話

また Ubuntu に開発環境が一切入ってない状態の場合、たくさんインストールすべきものがあるのでここでは割愛します。あくまで私の環境だとこうやれば動いたということです。

ローカル開発環境を整える

まず既存のアプリを github からクローンします。

$ git clone "https://github.com/yourname/app.git"

gem を揃えるため $ bundle update します。私の環境では Ubuntu に PostgreSQL Server がないよとエラーが出たので psql をインストール後 $ bundle update しました。

$ sudo apt-get install postgresql postgresql-server-dev-9.1
$ rehash
$ bundle update

ここで Rails サーバーを起動してみると JavaScript runtime error が出ました。私は以下をインストールしましたが nodejs があるので therubyracer は必要ないかもしれません。

$ gem install therubyracer # nodejs があるので必要ないかも
$ gem install execjs
$ sudo apt-get install nodejs

マイグレーションの実行をします。

$ bundle exec rake db:migrate RAILS_ENV=development

ここまで出来ればローカルアクセスで Rails アプリが動作すると思います。

Heroku で動かす

アプリは heroku という PaaS で公開します。普段は MacOS の開発環境から heroku にアクセスしていますが、Ubuntu でも同様に heroku に push できるようにしたいと思います。

まず ~/.ssh に USB などで rsa キーをコピーしてきます。なお heroku 用にデフォルトとは別の名前でキーを保存した場合、config ファイルも必要となります。 config ファイルはこんな感じ。

Host heroku.com
 User git
 port 22
 Hostname heroku.com
 IdentityFile ~/.ssh/heroku_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

このまま $ heroku open しても No app specified. と言われます。 解決方法は簡単で git remote でリポジトリを追加すればOKです。

$ git remote add heroku git@heroku.com:blooming-wildwood-xxxx.git

参照

複数パソコンからherokuの同一サービスにデプロイする方法

以上です。

Rails 4.0.0.rc1 から 4.0.0 にアップデートしたら嵌った

3系から4系のアップデートを参考にしたのだけれど、変にエラーが出て嵌ったので解決方法を書く。

ruby アップデート

まず ruby を最新のバージョンにアップデートする。 ruby は rbenv で管理している。

$ rbenv install 2.0.0-p247
$ rbenv global 2.0.0-p247
$ rbenv rehash
$ ruby -v # バージョンの確認

gem アップデート

$ gem update --system
$ gem update bundler
$ gem i bundler

Gemfile 編集

Rails アプリの Gemfile を編集します。 プロジェクトによって使ってる gem が違うと思うのであまり参考にならないかもしれません。 ポイントとしてはエラーがでた場合などは、インストール済みの gem のバージョンを固定するといいです。

1
2
3
4
5
6
7
8
9
10
11
-gem 'rails', '4.0.0.rc1'
+gem 'rails', '4.0.0'

-gem 'sass-rails', '~> 4.0.0.rc1'
+gem 'sass-rails'

-gem 'bootstrap-sass'
+gem 'bootstrap-sass', '2.3.2.2'

-gem 'jbuilder', '~> 1.0.1'
+gem 'jbuilder', '1.0.2'

$ bundle update にて Rails をインストールして起動したらエラーメッセージがでました。

/Users/iriya/.rbenv/versions/2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems.rb:286:in `bin_path': can't find gem rails ([">= 0"]) with executable rails (Gem::GemNotFoundException)
from /Users/iriya/.rbenv/versions/2.0.0-p247/bin/rails:23:in `<main>'

パスが無いよって言われました。 railties という gem をインストールすることで解決できました。

$ gem i railties

以上です。

MacOS のパッケージ管理で便利な Homebrew の使い方

備忘録のため使い方をまとめます。インストールの仕方は割愛します。

$ brew update   # brew を最新にする
$ brew outdated # インストール済のパッケージのうち最新のバージョンが公開されてるものを表示
$ brew upgrade  # インストールしている Formula をアップデート
$ brew doctor   # エラーなどのチェック
$ brew cleanup  # 旧バージョンのパッケージを削除

各ディレクトリの使用量をターミナルで確認する方法

ターミナルを使って HDD 容量を確認するのに使うコマンドは df です。 ディレクトリの容量を確認するコマンドは du です。

今回はちょっと便利なオプションを紹介します。

Human readable option

df, du のいずれのコマンドも -h オプションをつける事で MB, GB, などの単位で表示してくれるので見やすくなります。

容量を圧迫しているサブディレクトリを探す

サブディレクトリ毎に容量を表示して欲しいときがあります。 例えば、以下のような状況を想定します。

~/project/a
~/project/b
~/project/c

このように project 配下に a, b, c という3つのディレクトリがある場合 $ du -h ~/project とすると ~/project が利用している容量は把握できますが、端末上にずらずらと文字が並び分かりにくいです。 また a, b, c のうちどのディレクトリの使用量が多いかということも分かりづらいです。

そこで各サブディレクトリの容量を簡単に把握するには以下のようにします。

$ du -hd1 ~/project

はい、すごく便利ですね。

センター試験廃止について意見申す

どうやら本当にセンター試験がなくなるようなので思うことをつらつらと書いてみます。

とりあえずここを読んでどんな感じに改革するのかみてみました。

大学入試改革:「教育変える突破口に」 下村博文文科相に聞く

う〜ん、言ってる事はいいことなんだけど、どうもこれではうまくいかない気がします。

1次試験の学力試験では結果を得点ランク別に示し、東京大であれば、例えば1000点満点の850点以上なら全員OKとする。2次試験以降は面接や小論文で、リーダーシップや創造力、ボランティア活動力など、ペーパーテストで判断できない能力を判断して、最終的に合否を決めるようにしたい。 暗記中心のペーパーテストを2回もしないでも済むように考えたい。賛否両論あると思うが、学力だけの1点差で勝ったことにどんな意味があるのか。

暗記中心と言ってるけど、大学が実施する2次試験はレベルの高い所だとよく練られた良問が多く、ただ暗記して解けるようなものじゃないので十分に学力の証明になってるはず。それに本当に1点差で勝ち負けが決まってる層はそんなに多くなく、むしろある程度の幅をみてそのレンジにいれば合格なんていう風にしちゃうとそれこそ差がつかなくなってしまうんじゃないの?そうなった時に次に判断する材料が面接や小論文ってどうやって採点するんだろう?

本来、大学はその大学のカラーがあってしかるべきで、こんな学生に入学して欲しいっていう学生像を描くべきなんだけど、それを面接で見極めるなんて無理でしょ。画一された、面接を採点するルールなんてものを作っちゃうと大学のカラーが出ないし、かといってルールがないまま大学に任せちゃうと、面接で落ちちゃった学生はなんで落ちたのか示されないと納得できないと思うな。

質の面では教育機関として、大学が時代の変化にどう対応するか、危機意識を持ってもらわなければいけない。これまで大学には自分たちは研究機関で教育機関ではないという考えがあった。学生が勝手に頑張ってきた面もある。

すごく大切なこと言ってるんだけど、これは入試制度を変えたらよくなる問題じゃない。 確かに理系の研究室でひどいところなんか、教授は学生を下っ端使いにしててろくに指導もせずに放任してるとこもあるし、逆にきちっと学生を指導してる立派な先生もいる。 そもそも大学は学問をする所であるので、学生はきちっと勉学をしなきゃいけない、だけど日本の場合だと大学でいい成績を収めてもそれが評価されにくいのだ。それを改善するためには企業、学生、大学という三者の関係をうまくまわす必要がある。企業側は新卒採用して学生を育てるという点だけ注力せずに大学で優秀な成績を収めた人を採用する方向になるよう努力して欲しい、そうすると学生はいい成績を収めようとするし、となれば大学側も寝てたら単位が降ってくるようないい加減な授業をする先生は減るだろう。 難しいとは思うが大学にだけ負担を強いてもよくならないんじゃないかな。

とまぁ適当に書いてみたけど、どうなんでしょうね。2次試験まで廃止して変わりに面接しますってのは辞めた方がいいと思うな。てか色々書いてたらもう一回大学行きたくなってきた・・・。(僕の昔の夢は科学者になることでした)

Gauche で Rlwrap を使う

Gauche で開発をするなら rlwrap は外せませんね。 ということで早速インストールしてみましょう。

端末から以下を実行します。

$ sudo apt-get install rlwrap

Gauche の補完ファイルを準備します。

$ mkdir ~/.rlwrap
$ touch ~/.rlwrap/gosh_completions

以下の内容を先程の gosh_completions に保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
(require "binary/io") (require "binary/pack") (require "dbi")
(require "dbm") (require "dbm/fsdbm") (require "file/filter")
(require "file/util") (require "gauche/auxsys") (require "gauche/cgen")
(require "gauche/charconv") (require "gauche/collection") (require "gauche/config")
(require "gauche/fcntl") (require "gauche/hook") (require "gauche/libutil")
(require "gauche/listener") (require "gauche/logger") (require "gauche/mop/propagate")
(require "gauche/mop/singleton") (require "gauche/mop/validator") (require "gauche/net")
(require "gauche/package") (require "gauche/package/fetch") (require "gauche/package/util")
(require "gauche/parameter") (require "gauche/parseopt") (require "gauche/process")
(require "gauche/regexp") (require "gauche/selector") (require "gauche/sequence")
(require "gauche/serializer") (require "gauche/syslog") (require "gauche/termios")
(require "gauche/test") (require "gauche/threads") (require "gauche/time")
(require "gauche/uvector") (require "gauche/version") (require "gauche/vport")
(require "math/const") (require "math/mt-random") (require "rfc/822")
(require "rfc/base64") (require "rfc/cookie") (require "rfc/hmac")
(require "rfc/md5") (require "rfc/mime") (require "rfc/quoted-printable")
(require "rfc/sha1") (require "rfc/uri") (require "srfi-0")
(require "srfi-1") (require "srfi-10") (require "srfi-11")
(require "srfi-13") (require "srfi-14") (require "srfi-19")
(require "srfi-2") (require "srfi-26") (require "srfi-27")
(require "srfi-29") (require "srfi-37") (require "srfi-4")
(require "srfi-42") (require "srfi-43") (require "srfi-5")
(require "srfi-9") (require "sxml/adaptor") (require "sxml/serializer")
(require "sxml/ssax") (require "sxml/sxpath") (require "sxml/tools")
(require "sxml/tree-trans") (require "text/csv") (require "text/diff")
(require "text/gettext") (require "text/html-lite") (require "text/info")
(require "text/parse") (require "text/sql") (require "text/tr")
(require "text/tree") (require "util/combinations") (require "util/digest")
(require "util/isomorph") (require "util/lcs") (require "util/list")
(require "util/match") (require "util/queue") (require "util/rbtree")
(require "util/record") (require "util/relation") (require "util/stream")
(require "util/toposort") (require "util/trie") (require "www/cgi")
(require "www/cgi-test")

(use srfi-1)

;; カレントモジュールが継承しているモジュールで定義されている変数と、
;; その他のモジュールがエクスポートしている変数を出力する。
(define (main args)
  (define (register lister modules)
    (for-each (lambda (mod)
                (for-each (cut hash-table-put! ht <> #t)
                          (lister mod)))
              modules))
  (define ht (make-hash-table))
  (register (lambda (mod)
              (hash-table-keys (module-table mod)))
            (module-precedence-list (current-module)))
  (register module-exports
            (all-modules))
  (for-each print
            (sort (map symbol->string (hash-table-keys ht))))
  0)

.zshrc に以下を追加します。

alias gosh="rlwrap -b '(){}[],#;| ' gosh"

参照

Emacs の Info の使い方と Info ドキュメントインストールの仕方

info の使い方

info は Emacs の中で説明を読むしくみ。

M-x info または C-h i で開始する。

u       up      一つ上に戻る
d       dir     入口に戻る
M-x info        info を開始する
q       quit    終了
space           とにかく読み進む
p       prev    前の節に戻る
n       next    次の節に進む
RET             矢印 (cursor) のある節に進む
m       menu    (その画面の中の) 名前で指定して移動する

info ドキュメントのインストール

ここでは SICP, Gauche, R5RS の info のインストールをやってみる。

SICP info

以下より sicp.info.gz をダウンロードし /usr/share/info に置く。

/usr/share/info の dir ファイルに以下を付け足す。

SICP
* SICP: (sicp).    Structure and Interpretation of Computer Programs.

Gauche info

Gauche の info をインストールする。

$ sudo apt-get install texinfo
$ cd Gauche-0.8.11/doc
$ make -f Makefile.in texi
$ makeinfo gauche-refj.texi
$ sudo cp gauche-refj.info* /usr/share/info

dir ファイルを編集する。

 Gauche
 * Gauche(ja):   (gauche-refj.info).     An R5RS Scheme implementation.

R5RS info

/home/iriya/lisp/scheme/r5rsj/texi から info ファイルを /usr/share/info にコピーする。

$ sudo cp *info* /usr/share/info

dir ファイルを編集する。

R5RS
* R5RS:         (r5rsj.info).           Revised^5 Report on Algorithmic Language Scheme.

シェル周りまとめ

csh tcsh まとめ

.login (csh, tcsh)

login shellを csh, tcsh にした場合、端末から login した際に読み込まれる設定ファイル。 login 後にシェルを起動しても読み込まれない。

.tcshrc (tcsh)

tcsh を起動した際に読み込まれる設定ファイル。 login 後にシェルを起動した際にも毎回読み込まれる。

.cshrc (csh,tcsh)

csh を起動した際に毎回読み込まれる設定ファイル。 tcsh の場合には .tcshrc がない場合にこのファイルが読み込まれる。 .tcshrc の中で .cshrc を読み込むように設定し .cshrc には csh, tcsh に共通する設定を記述することも多い。

.logout (csh, tcsh)

login shellを csh, tcsh にした場合、端末から logout する際に実行される設定ファイル。 ユーザの tmp ファイルの削除や、画面のクリア、メッセージの表示などを設定することができる。

bash まとめ

以下の設定ファイルはbashを使用するユーザ向けです。

.profile (sh, bash)

login shellを sh, bash にした場合(rootのlogin shell を除けば、shにすることはほとんどないが)に端末から login した際に読み込まれる設定ファイル。 login 後にシェルを起動しても読み込まれない。

.bash_profile (bash)

login shell を bash にした場合に端末から login した際に読み込まれる設定ファイル。 login 後にシェルを起動しても読み込まれない。

.bash_logout (bash)

login shellを bash にした場合、端末から logout する際に実行される設定ファイル。

.bashrc (bash)

bash を起動した際に読み込まれる設定ファイル。 login 後にシェルを起動した際にも毎回読み込まれる。

標準のコマンドの関連付けを変更 Update-alternatives

Ubuntu にて update-alternatives コマンドを使用すると標準コマンドの関連付けを変更できます。 例として Emacs の関連付けを変更する方法をみてみましょう。 Emacs がどこから実行されるか調べてみます。

$ which emacs
/usr/bin/emacs

次に実態を調べます。

$ ll /usr/bin/emacs
lrwxrwxrwx 1 root root 23 2008-01-06 23:03 /usr/bin/emacs -> /etc/alternatives/emacs

シンボリックリンクになっており実態は /etc/alternatives/emacs であることが分かります。

次に alternatives の正体を突き止めます。

$ ll /etc/alternatives/emacs
lrwxrwxrwx 1 root root 16 2008-03-25 18:47 /etc/alternatives/emacs -> /usr/bin/emacs22

となり結局のところの正体は /usr/bin/emacs22 だと分かりました。

ln -s でシンボリックリンク先を変更してもいいのですが、こんなとき Ubuntu では以下のようにします。

$ sudo update-alternatives --config emacs

そうすると対話形式でどれを標準にするか聞いてきますので簡単に関連付けの変更ができます。

参考

Emacs の Load-path の調べ方

Emacs で load-path を調べてそれを見やすく表示させる方法です。

*scratch* バッファで以下を評価します。

load-path [Ctrl+j]

次に ( にカーソルを移動して以下を実行します。

M-x query-replace-regexp RET
Query replace regexp: (半角空白) RET
Query replace regexp   with: C-q C-j
RET

そして ! で全て置換します。

これで load-path が見やすく表示されます。