Sinatraアプリのログをローテーションする

去年の7月から Sinatra + Unicorn で動かしている Web アプリがあるんだけど、そのログファイルが巨大になっていた。↓の unicorn.log がそれ。75MBにもなっている。
そこで、logrotate を使ってみることにした。

takatoh@nightschool $ ls -lh
合計 75M
-rw-rw-r-- 1 sombrero sombrero  752  7月 26  2014 CHANGES
-rw-rw-r-- 1 sombrero sombrero  122  7月 26  2014 Gemfile
-rw-rw-r-- 1 sombrero sombrero  468  7月 26  2014 Gemfile.lock
-rw-rw-r-- 1 sombrero sombrero 7.5K  1月  4 10:39 app.rb
-rw-rw-r-- 1 sombrero sombrero   64  7月 26  2014 app.ru
drwxrwxr-x 2 sombrero sombrero 4.0K  7月 26  2014 bin
-rw-rw-r-- 1 sombrero sombrero  327  7月 26  2014 boot.rb
-rw-rw-r-- 1 sombrero sombrero  126  7月 26  2014 config.yaml
-rw-rw-r-- 1 sombrero sombrero  104  7月 26  2014 config.yaml.sample
drwxrwxr-x 3 sombrero sombrero 4.0K  4月  8 04:59 db
drwxrwxr-x 3 sombrero sombrero 4.0K  7月 26  2014 lib
drwxrwxr-x 3 sombrero sombrero 4.0K  7月 26  2014 public
-rw-rw-r-- 1 sombrero sombrero  705  7月 26  2014 rakefile
-rw-rw-r-- 1 sombrero sombrero   14  7月 26  2014 start.cmd
drwxrwxr-x 2 sombrero sombrero 4.0K  4月  8 05:00 tmp
-rw-rw-rw- 1 sombrero sombrero  109  7月 26  2014 unicorn.conf
-rw-rw-r-- 1 sombrero sombrero  75M  4月  8 16:50 unicorn.log
-rw-r--r-- 1 root     root        5  3月 24 20:43 unicorn.pid
-rw-rw-r-- 1 sombrero sombrero   32  7月 26  2014 version.rb
drwxrwxr-x 2 sombrero sombrero 4.0K  7月 26  2014 views

参考になったのは次のページ。

 cf. Rails + Unicorn の logrotateAdd Star – yoshioblog
 cf. ログローテーション(logrotate)を使ってみる ( httpd(apache)の設定例 )

特に上のページを参考にして設定ファイルを書いてみた。設定ファイルは /etc/logrotate.d ディレクトリの下に、サービス名でファイルを作ればいいようだ。
書いた設定がこれ。

/home/sombrero/sombrero/unicorn.log {
    daily
    missingok
    rotate 60
    dateext
    compress
    delaycompress

    postrotate
    pid=/home/sombrero/sombrero/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
    endscript
}

設定の意味は次の通り。

  • daily 毎日ローテーションする
  • missingok ログファイルがなくてもエラーを出さない
  • rotate 60 60回ローテーションする
  • dateext ローテーションされたログファイルのサフィックスを日付形式にする
  • compress ローテーションされたログファイルを圧縮する
  • delaycompress 圧縮するのを次のローテーションの時にする

postrorate と endscript の間の記述は、ローテーションが終わったあとに実行される。
Unicorn は USR1 シグナルを受け取ると、ログファイルを開きなおしてくれるそうなので、そうしている。

logrotate -d で確認する。

takatoh@nightschool $ logrotate -d sombrero
reading config file sombrero

Handling 1 logs

rotating pattern: /home/sombrero/sombrero/unicorn.log  after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /home/sombrero/sombrero/unicorn.log
  log does not need rotating

エラーらしきものは出てないから大丈夫のようだ。
あとは1日待って確認しよう。

Nginxで同一IPからのコネクションを制限する

limit_conn_zone ディレクティブと limit_conn ディレクティブを使う。
ここのページが参考になった。

 cf. http://wiki.nginx.org/HttpLimitConnModuleJa

まずはゾーンの設定。これは制限の対象を何にするかの定義みたい。/etc/nginx/nginx.conf の http セクションの中で定義する。こんな感じ。

limit_conn_zone $binary_remote_addr zone=addr:2m;

$binary_remote_addr という変数は Nginx に標準で定義されている変数で、アクセスして来たクライアントのIPアドレス(バイナリ)が入っている。これをキーにしている、つまり制限の対象にしているわけだ。で、その設定に、addr という名前をつけている。2m と書いてあるのは、キーを保存するためのメモリーを確保しているみたい。

さて、次は実際に制限を設定するほう。例えば、vhost.example.com というバーチャルホストに対するアクセスを制限したければ、/etc/nginx/sites-enabled/vhost.exmaple.com の
server セクションに次のように設定する。

limit_conn addr 1;

これで、同一IPからのコネクションを同時に1つだけに制限できる。

なんか情報が少なくて自信がないけど、EC2 で動かしてるサーバーで試してみたら、ちゃんと制限されて2つ目のコネクションには 503 が帰ってきたので、多分あってる。

Ubuntuにsshで接続する

Windowsマシンから、Ubuntuのマシンにsshで接続できるようにする。
↓このページが参考になった。

 cf. http://www.server-world.info/query?os=Ubuntu_14.04&p=ssh

まずは、ssh サーバを atp-get でインストール。

takatoh@nightschool $ sudo apt-get install openssh-server
[sudo] password for takatoh: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  firefox-locale-en linux-headers-3.13.0-34 linux-headers-3.13.0-34-generic
  linux-image-3.13.0-34-generic linux-image-extra-3.13.0-34-generic
これを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  libck-connector0 openssh-sftp-server ssh-import-id
提案パッケージ:
  rssh molly-guard monkeysphere
以下のパッケージが新たにインストールされます:
  libck-connector0 openssh-server openssh-sftp-server ssh-import-id
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 12 個。
374 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,214 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/main libck-connector0 amd64 0.4.5-3.1ubuntu2 [10.5 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main openssh-sftp-server amd64 1:6.6p1-2ubuntu2 [34.1 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main openssh-server amd64 1:6.6p1-2ubuntu2 [319 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu/ trusty/main ssh-import-id all 3.21-0ubuntu1 [9,624 B]
374 kB を 0秒 で取得しました (397 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libck-connector0:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 421617 個のファイルとディレクトリがインストールされています。)
Preparing to unpack .../libck-connector0_0.4.5-3.1ubuntu2_amd64.deb ...
Unpacking libck-connector0:amd64 (0.4.5-3.1ubuntu2) ...
以前に未選択のパッケージ openssh-sftp-server を選択しています。
Preparing to unpack .../openssh-sftp-server_1%3a6.6p1-2ubuntu2_amd64.deb ...
Unpacking openssh-sftp-server (1:6.6p1-2ubuntu2) ...
以前に未選択のパッケージ openssh-server を選択しています。
Preparing to unpack .../openssh-server_1%3a6.6p1-2ubuntu2_amd64.deb ...
Unpacking openssh-server (1:6.6p1-2ubuntu2) ...
以前に未選択のパッケージ ssh-import-id を選択しています。
Preparing to unpack .../ssh-import-id_3.21-0ubuntu1_all.deb ...
Unpacking ssh-import-id (3.21-0ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for ureadahead (0.100.0-16) ...
ureadahead will be reprofiled on next reboot
Processing triggers for ufw (0.34~rc-0ubuntu2) ...
libck-connector0:amd64 (0.4.5-3.1ubuntu2) を設定しています ...
openssh-sftp-server (1:6.6p1-2ubuntu2) を設定しています ...
openssh-server (1:6.6p1-2ubuntu2) を設定しています ...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
ssh start/running, process 16328
ssh-import-id (3.21-0ubuntu1) を設定しています ...
Processing triggers for libc-bin (2.19-0ubuntu6.3) ...
Processing triggers for ureadahead (0.100.0-16) ...
Processing triggers for ufw (0.34~rc-0ubuntu2) ...

次に /etc/ssh/sshd_config ファイルを編集。28行目を次のように no にする。

PermitRootLogin no

root でのログインを拒否するわけだね。ちなみにデフォルトでは without-password となっていて、これは鍵認証が必要な設定らしい。

22番ポートを開ける。というか開いていた。

takatoh@nightschool $ sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
3000/tcp                   ALLOW       Anywhere
9000/tcp                   ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
8080/tcp                   ALLOW       Anywhere
80                         ALLOW       Anywhere
3000/tcp (v6)              ALLOW       Anywhere (v6)
9000/tcp (v6)              ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)
8080/tcp (v6)              ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)

最後に、sshを再起動。

takatoh@nightschool $ initctl restart ssh
initctl:不明なジョブ: ssh

あれ、ダメだ。上の参考ページのマシンとなにか違うのかも。
しょうがないから、/etc/init.d/ssh を直接叩いて再起動。

takatoh@nightschool $ /etc/init.d/ssh restart

これで Ubuntu 側は OK。今度は Windows 側。
接続には Tera Term を使う。

TeraTerm-connect

ホストに IPアドレスを指定して、OKボタンを押す。上に書いたとおり、ポートはデフォルトの22番。

TeraTerm-auth

ユーザー名とパスワードを入力して OK ボタンを押すと、無事接続できた。

TeraTerm-remote

Nginxのプロキシが動いてくれない

Sinatra + unicorn の組み合わせで Webアプリを動かしていて、これに Nginx からプロキシを通したい。もうちょっと具体的に言うと、Sinatra アプリは 8080 番ポートで動いていて、外部からは 80 番ポートでアクセスできるように、Nginx を設定したい、ということ。

で、こんなふうな設定ファイルを書いたんだけど、設定ファイルのテストが通らない。

upstream unicorn-lcstorage {
    # server unix:/var/run/unicorn/unicorn_lcstorage.sock;
    server 127.0.0.1:8080;
}

server {
    # port
    listen 80;

    # server name
    server_name storage1.lathercraft.net;

    # document root
    root /home/lcstorage/lcstorage;

    # index
    #index index.php index.html index.htm;

    # log files
    access_log /var/log/nginx/storage1.lathercraft.net/access.log main;
    error_log /var/log/nginx/storage1.lathercraft.net/error.log warn;

    keepalive_timeout 600;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;

    client_max_body_size 8G;

    location / {
        #root /home/lcstorage/lcstorage;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn-lcstorage;
    }
}
takatoh@nightschool $ sudo /etc/init.d/nginx configtest
 * Testing nginx configuration                                           [fail]

アプリ自体は 8080 番ポートで動いていることを確認済み。上の設定ファイルのリンクを /etc/nginx/sites-enabled から削除すると、テストが OK になるのも確認済み。なので、この設定ファイルが問題なのは間違いないと思うんだけど、一体どこが間違ってるのかわからない。

誰か、なにか気づいたら教えてください。

UbuntuにNginxをインストールする

apt-get コマンドでインストールできる。パッケージの種類がいくつかあるようだけど、組み込まれているモジュールが多い nginx-extras にした。

takatoh@nightschool $ sudo apt-get install nginx-extras

http でアクセスできるように、80番ポートを開ける。

takatoh@nightschool $ sudo ufw allow http
ルールを追加しました
ルールを追加しました (v6)

あとは起動するだけ。

takatoh@nightschool $ sudo /etc/init.d/nginx start

welcome-to-nginx-on-ubuntu

Sinatraアプリをunicornで動かす

まずは専用のユーザーを作る。

takatoh@nightschool $ sudo adduser sombrero
ユーザー `sombrero' を追加しています...
新しいグループ `sombrero' (1001) を追加しています...
新しいユーザー `sombrero' (1001) をグループ `sombrero' に追加しています...
ホームディレクトリ `/home/sombrero' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
sombrero のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: sombrero
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y

新しいユーザー sombrero に sudo する権限をつける。

takatoh@nightschool $ sudo gpasswd -a sombrero sudo
[sudo] password for takatoh: 
ユーザ sombrero をグループ sudo に追加

ユーザー sombrero でログインしなおして、Ruby と Git のバージョンを確認。

sombrero@nightschool:~$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
sombrero@nightschool:~$ git --version
git version 1.9.1

GitHub から Sombrero を clone。

sombrero@nightschool:~$ git clone [email protected]:takatoh/sombrero.git
Cloning into 'sombrero'...
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
remote: Reusing existing pack: 903, done.
remote: Total 903 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (903/903), 282.66 KiB | 131.00 KiB/s, done.
Resolving deltas: 100% (577/577), done.
Checking connectivity... done.

必要なライブラリをインストール。

sombrero@nightschool:~$ cd sombrero
sombrero@nightschool:~/sombrero$ sudo bundle install
[sudo] password for sombrero: 
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Fetching gem metadata from https://rubygems.org/..........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing tilt 1.4.1
Installing haml 4.0.5
Using httpclient 2.4.0
Installing rack 1.5.2
Installing rack-protection 1.5.3
Installing sass 3.3.9
Installing sequel 4.12.0
Installing sinatra 1.4.5
Installing sqlite3 1.3.9
Using bundler 1.6.3
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from haml:

HEADS UP! Haml 4.0 has many improvements, but also has changes that may break
your application:

* Support for Ruby 1.8.6 dropped
* Support for Rails 2 dropped
* Sass filter now always outputs <style> tags
* Data attributes are now hyphenated, not underscored
* html2haml utility moved to the html2haml gem
* Textile and Maruku filters moved to the haml-contrib gem

For more info see:

http://rubydoc.info/github/haml/haml/file/CHANGELOG.md

もともと運用していたディレクトリからアプリの設定ファイルをコピー。

sombrero@nightschool:~/sombrero$ cp /home/takatoh/w/sombrero/config.yaml .

データベースのマイグレーションを実行。

sombrero@nightschool:~/sombrero$ rake db:migrate
プログラム 'rake' はまだインストールされていません。 次のように入力することでインストールできます:

rake が入ってなかった。インストール。

sombrero@nightschool:~/sombrero$ sudo gem install rake
Fetching: rake-10.3.2.gem (100%)
Successfully installed rake-10.3.2
1 gem installed
Installing ri documentation for rake-10.3.2...
Installing RDoc documentation for rake-10.3.2...

もともとの運用元から、データベースファイルをコピー(上書き)。

sombrero@nightschool:~/sombrero$ sudo cp /home/takatoh/w/sombrero/db/sombrero.db db

ここでいったん、アプリが正常に起動するか確認。

sombrero@nightschool:~/sombrero$ rackup app.ru --port 9000

OK。

Unicorn のインストール。

sombrero@nightschool:~/sombrero$ sudo gem install unicorn
[sudo] password for sombrero: 
Fetching: kgio-2.9.2.gem (100%)
Building native extensions.  This could take a while...
Fetching: raindrops-0.13.0.gem (100%)
Building native extensions.  This could take a while...
Fetching: unicorn-4.8.3.gem (100%)
Building native extensions.  This could take a while...
Successfully installed kgio-2.9.2
Successfully installed raindrops-0.13.0
Successfully installed unicorn-4.8.3
3 gems installed
Installing ri documentation for kgio-2.9.2...
Installing ri documentation for raindrops-0.13.0...
Installing ri documentation for unicorn-4.8.3...
Installing RDoc documentation for kgio-2.9.2...
Installing RDoc documentation for raindrops-0.13.0...
Installing RDoc documentation for unicorn-4.8.3...

いろいろググった結果を見ると Unicorn の前に nginx をたてるのが普通のようだけど、今回は Unicorn のみで行く。公式サイト(?)によれば、アプリのルートディレクトリで unicorn と打てば起動するらしい。

sombrero@nightschool:~/sombrero$ unicorn
/var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:659:in parse_rackup_file': rackup file (config.ru) not readable (ArgumentError)
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:77:in reload'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:68:in initialize'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in new'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in initialize'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/bin/unicorn:126:in new'
	from /var/lib/gems/1.9.1/gems/unicorn-4.8.3/bin/unicorn:126:in new'
	from /usr/local/bin/unicorn:23:in load'
	from /usr/local/bin/unicorn:23:in main'

あれ、ダメだ。あ、rackup のファイルが config.ru じゃなきゃだめなのか。引数に与えてみるか。

sombrero@nightschool:~/sombrero$ unicorn app.ru
I, [2014-07-26T09:26:00.893170 #19156]  INFO -- : listening on addr=0.0.0.0:8080 fd=7
I, [2014-07-26T09:26:00.893297 #19156]  INFO -- : worker=0 spawning...
I, [2014-07-26T09:26:00.893751 #19156]  INFO -- : master process ready
I, [2014-07-26T09:26:00.894064 #19158]  INFO -- : worker=0 spawned pid=19158
I, [2014-07-26T09:26:00.894233 #19158]  INFO -- : Refreshing Gem list
I, [2014-07-26T09:26:01.337048 #19158]  INFO -- : worker=0 ready

今度は無事起動。ポート8080で待機している。今までどおり 9000番ポートで動かすには –port 9000 をオプションとしてつけてやればいいようだ。

Unicorn の設定ファイル unicorn.conf を書く。

listen "9000"
worker_processes 1
pid "./unicorn.pid"
stderr_path "./unicorn.log"
stdout_path "./unicorn.log"

どうも rackup するファイルは設定できないみたいだ。でも、unicorn コマンドの引数に与えてやれば、これで起動してみると、ちゃんと起動しているのが確認できた。

sombrero@nightschool:~/sombrero$ unicorn app.ru -c unicorn.conf

さて、今度はPCを起動したら自動で起動するようにする。それには /etc/init.d 配下に起動用のスクリプトを置く。

#!/bin/sh

PATH=/sbin:/usr/local/bin:/usr/bin
SOMBRERO_ROOT=/home/sombrero/sombrero

case "$1" in
start)
    cd ${SOMBRERO_ROOT}
    unicorn app.ru -c unicorn.conf -D
    ;;
stop)
    PID=`cat ${SOMBRERO_ROOT}/unicorn.pid`
    kill -QUIT ${PID}
    ;;
*)
    echo "Usage: sombrero {start|stop}" &gt;&amp;2
    exit 1
    ;;
esac

exit 0

unicorn についてる -D オプションはデーモン化するためのもの。
で、これをデーモン(サービス)として起動するには、OS のランレベルに応じた /etc/rc?.d フォルダの中に ‘S’ で始まるファイル名でソフトリンクを作ってやればいいらしい。もっとも、この部分は sysv-rc-conf というツールを使うのが通例のようだ。
それじゃ、まずランレベルの確認。

sombrero@nightschool:~$ runlevel
N 2

N が以前のランレベルで、2が現在のランレベルを示しているらしい。以前のランレベルってなんだかわからないけど今回はパス。とにかく現在のランレベルが 2 だということがわかった。
つぎ、sysv-rc-conf のインストール。

sombrero@nightschool:~$ sudo apt-get install sysv-rc-conf

で、この sysv-rc-conf を sudo つきで起動すると下のような画面になる。

sysv-rc-conf

よくわからないけど、sombrero の行の 2 のカラムのところに X 印をつけて保存して終了。
/etc/rc2.d フォルダを確認してみると、S20sombrero という名前でファイル(ソフトリンク)ができているのが確認できる。

sombrero@nightschool:~$ ls -l /etc/rc2.d
合計 4
-rw-r--r-- 1 root root 677  3月 13 10:42 README
lrwxrwxrwx 1 root root  20  7月  5 14:26 S20kerneloops -> ../init.d/kerneloops
lrwxrwxrwx 1 root root  15  7月  5 14:26 S20rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root  18  7月 26 11:58 S20sombrero -> ../init.d/sombrero
lrwxrwxrwx 1 root root  27  7月  5 14:26 S20speech-dispatcher -> ../init.d/speech-dispatcher
lrwxrwxrwx 1 root root  15  7月  5 14:26 S50saned -> ../init.d/saned
lrwxrwxrwx 1 root root  19  7月  5 14:26 S70dns-clean -> ../init.d/dns-clean
lrwxrwxrwx 1 root root  18  7月  5 14:26 S70pppd-dns -> ../init.d/pppd-dns
lrwxrwxrwx 1 root root  21  7月  5 14:26 S99grub-common -> ../init.d/grub-common
lrwxrwxrwx 1 root root  18  7月  5 14:26 S99ondemand -> ../init.d/ondemand
lrwxrwxrwx 1 root root  18  7月  5 14:26 S99rc.local -> ../init.d/rc.local

さあ、これで OK のはずだ。果たして PC を再起動してみると、自動的に起動しているのが確認できた。

今日はここまで。

Ubuntuの端末でRuby 2.1.1を使えるようにした

何を今更、というようなタイトルだけど、どういうことかというと、今までランチャーから新しい端末(コンソール)を起動しただけでは rvm でインストールした Ruby 2.1.1 を使えていなかったのだ。なぜなら、rvm を有効にする設定が .bash_profaile に書かれているのに対して、新しい端末を開いてもこのファイルを読み込まないらしい、からだった。
だから、今までどうしていたかというと、端末を開いたあとに、source .bash_profile とか bash --login とかやってたわけだ。さすがにこれはめんどくさい(実際には端末を開きっぱなしなのでそれほどでもない)。そこで、重い腰を上げて解決することにした。

いろいろ調べてみると、新しい端末を開くと、.bashrc は読み込んでくれるらしい。ということは、.bash_profile に書いてある該当箇所を .bashrc に書き写せばいいはず。.bash_profile の該当箇所はこれ。

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

ところが、これをこのまま .bashrc に書き写しても動かない。どうしてかというと、Ubuntu の sh は bash じゃなくて dash というシェルだから。

takatoh@nightschool $ which sh
/bin/sh
takatoh@nightschool $ ls -al /bin/sh
lrwxrwxrwx 1 root root 4  7月  5 14:26 /bin/sh -> dash

どうも dash では [[ … ]] という書式をサポートしていないらしい。というわけで、.bashrc の他の記述を参考に次のように書き換えた。

if [ -s "$HOME/.rvm/scripts/rvm" ]; then
    source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
fi

これで、新しい端末で最初から Ruby 2.1.1 が使えるようになった。

takatoh@nightschool $ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

Ubuntuのポートを開ける

ここの記事が参考になった。

 cf. ubuntuによるポート開放について – YAHOO! JAPAN 知恵袋

ufw というツールを使うといいらしい。まずはインストール。

takatoh@nightschool $ sudo apt-get install ufw
[sudo] password for takatoh: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
ufw は既に最新バージョンです。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 7 個。

すでに入ってたみたい。

状態を確認。

takatoh@nightschool $ sudo ufw status
状態: 非アクティブ

有効化。

takatoh@nightschool $ sudo ufw enable
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
takatoh@nightschool $ sudo ufw status
状態: アクティブ

無効化するには sudo ufw disable

デフォルトはすべて拒否。

takatoh@nightschool $ sudo ufw default DENY
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)

Rails の development 環境で動かしてるアプリにアクセスするため、3000番のポートを開ける。

takatoh@nightschool $ sudo ufw allow 3000/tcp
ルールを追加しました
ルールを追加しました (v6)

これでOK。

Ubuntuの端末のプロンプトをカスタマイズ

デフォルトでは「ユーザー名@ホスト名:カレントディレクトリ$」となってるんだけど、長いので短くしたい。特にディレクトリの深いところまで行くと1行じゃ納まらなくなったりしてすごく邪魔。
というわけで、↓このページを参考に変更してみた。

 cf. Ubuntu 端末のコマンドプロンプトをカスタマイズしてユーザー名やコンピューター名を非表示にする – Ubuntuアプリのいいところ

リンク先のページでは、ユーザー名とホスト名を消してるけど、上にも書いたとおりディレクトリを消したほうがシンプルになる。
具体的には、.bashrc を PS1 変数を設定している部分(俺の環境では60行目付近)を編集する。

takatoh@nightschool:~$ subl .bashrc
else
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h \$ '
fi

コメントアウトしてあるのが元の行。\w がカレントディレクトリを指しているみたいだ。
で、これを適用するとこうなった。

takatoh@nightschool:~$ source .bashrc
takatoh@nightschool $ 

Ubuntuの/home/takatohディレクトリをDeja DupでAmazon S3にバックアップする→失敗?

Deja Dup はファイル/ディレクトリのバックアップアプリ(本来は e と a の上に記号がつくんだけど入力できないので省略する)。Ubuntu の画面の左上のボタンを押して、Deja Dup で検索すると「バックアップ」ていうアプリが見つかる。これがどうも Deja Dup …なのか?
でもこのままだとバックアップ先の候補に Amazon S3 が出てこないので、Ubuntu ソフトウェアセンターで deja dup で検索して、Amazon S3 support
for Deja Dup をインストールする。そうすると S3 をバックアップ先に選べるようになる。

改めて「バックアップ」を立ち上げよう。バックアップするフォルダー(ホーム(takatoh))と無視するフォルダー(ゴミ箱と ~/Downloads)はデフォルトのまま。保存場所に Amazon S3 を選ぶと、S3 Access Key ID とフォルダーを入力するように画面が変化する。Access Key ID は AWS で取得したやつだとして、フォルダーの指定の仕方がよくわからないな。とりあえず、バケット名/フォルダ名(panicblanket/backup/nightschool)としてみた。スケジュールはどういうわけか保存期間しか入力できない。これもデフォルトのまま「期限なし」(ほかに「最低6か月」と「最低1年」が選べる)。
さて、これで「概要」の戻って「今すぐバックアップ」をクリックする。すると今度は「Amazon S3に接続」というタイトルで、Secret access key を入力する画面になった。キーを入力して「続行する」をクリック。結果、「バックアップに失敗しました」となった。なんでだ。

ググっても有用な情報は出てこない。そうこうするうち、うっかり自動バックアップを有効にしてしまったら、もう一度無効にしても「今すぐバックアップ」ボタンがグレイアウトしてしまった。こうなったら「次回のバックアップは今日です。」と書いてあるのを信じるしかない……んだけど、そもそも設定があってるのかわからないからなぁ……