Railsアプリの引っ越し(4)デーモンとして動かす編

起動スクリプトを、これも apostrophe からコピー。

tonzlr@wplj:/etc/init.d$ cd
tonzlr@wplj:~$ cd /etc/init.d
tonzlr@wplj:/etc/init.d$ sudo scp tonzlr@apostrophe:/etc/init.d/tonzlr .
[sudo] tonzlr のパスワード: 
tonzlr@apostrophe's password: 
tonzlr                                        100%  455     0.4KB/s   00:00

これも変更しないでいいんじゃないかな。

起動確認。

tonzlr@wplj:~/tonzlr$ sudo /etc/init.d/tonzlr start
Starting Tonzlr

OK。

Unit ファイルを書く。

そして、/etc/systemd/system/tonzlr.service にリンクを張る。

tonzlr@wplj:~/tonzlr$ sudo ln -s /lib/systemd/system/tonzlr.service /etc/systemd/system/tonzlr.service

起動確認。

tonzlr@wplj:~/tonzlr$ sudo systemctl start tonzlr

OK。start したり stop したりして確認できた。

Ubuntu の起動時に自動起動するようにする。

tonzlr@wplj:~/tonzlr$ sudo systemctl enable tonzlr
Synchronizing state of tonzlr.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable tonzlr
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'tonzlr' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
update-rc.d: error: tonzlr Default-Start contains no runlevels, aborting.

むぅ、またエラーが出てる。だけど、この間の Flask アプリではこれでもちゃんと自動起動できるようになっていたので、今回もそれを期待してリブートしてみる。

tonzlr@wplj:~/tonzlr$ sudo reboot

……はたしてリブートした結果……おお、ちゃんと自動起動されている!

よし、最後に、Nginx のヴァーチャルホスト tonzlr を設定する。

sites-enabled/tonzlr にリンクを張って:

tonzlr@wplj:/etc/nginx$ sudo ln -s /etc/nginx/sites-available/tonzlr /etc/nginx/sites-enabled/tonzlr

ログファイル用のディレクトリを作る。

tonzlr@wplj:/etc/nginx$ sudo mkdir /var/log/nginx/tonzlr

Nginx をリロード。

tonzlr@wplj:/etc/nginx$ sudo systemctl reload nginx

hosts ファイルに tonzlr を追加して、http://tonzlr/ にブラウザでアクセスしてみる。

OK!!!!!!!!!
あとは、他のマシンの hosts ファイルを書き換えるだけだ。

Railsアプリの引っ越し(3)Unicornで動かす編

Unicorn のインストール。

tonzlr@wplj:~/tonzlr$ sudo apt install unicorn
[sudo] tonzlr のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libpango1.0-0 libpangox-1.0-0 ubuntu-core-launcher
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  ruby-kgio ruby-rack ruby-raindrops
以下のパッケージが新たにインストールされます:
  ruby-kgio ruby-rack ruby-raindrops unicorn
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 8 個。
269 kB のアーカイブを取得する必要があります。
この操作後に追加で 898 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-kgio amd64 2.10.0-1build1 [27.7 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-rack all 1.6.4-3 [81.3 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 ruby-raindrops amd64 0.16.0-1build1 [33.0 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 unicorn amd64 4.9.0-2build2 [127 kB]
269 kB を 0秒 で取得しました (1,720 kB/s)
以前に未選択のパッケージ ruby-kgio を選択しています。
(データベースを読み込んでいます ... 現在 216599 個のファイルとディレクトリがインストールされています。)
.../ruby-kgio_2.10.0-1build1_amd64.deb を展開する準備をしています ...
ruby-kgio (2.10.0-1build1) を展開しています...
以前に未選択のパッケージ ruby-rack を選択しています。
.../ruby-rack_1.6.4-3_all.deb を展開する準備をしています ...
ruby-rack (1.6.4-3) を展開しています...
以前に未選択のパッケージ ruby-raindrops を選択しています。
.../ruby-raindrops_0.16.0-1build1_amd64.deb を展開する準備をしています ...
ruby-raindrops (0.16.0-1build1) を展開しています...
以前に未選択のパッケージ unicorn を選択しています。
.../unicorn_4.9.0-2build2_amd64.deb を展開する準備をしています ...
unicorn (4.9.0-2build2) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
ruby-kgio (2.10.0-1build1) を設定しています ...
ruby-rack (1.6.4-3) を設定しています ...
ruby-raindrops (0.16.0-1build1) を設定しています ...
unicorn (4.9.0-2build2) を設定しています ...
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: current start runlevel(s) (empty) of script unicorn' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script unicorn' overrides LSB defaults (0 1 6).
insserv: warning: script 'bruschetta' missing LSB tags and overrides
systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...

apostrophe から設定ファイル unicorn.conf をコピー。

tonzlr@wplj:~/tonzlr$ scp tonzlr@apostrophe:tonzlr/unicorn.conf .
tonzlr@apostrophe's password: 
unicorn.conf                                  100%  166     0.2KB/s   00:00

たぶん、変更しないでいいはず。

tonzlr@wplj:~/tonzlr$ bundle exec unicorn_rails -c unicorn.conf -E production

OK。ブラウザで http://localhost:9009/ にアクセスして確認できた。

Railsアプリの引っ越し(2)とりあえず動いた編

前回のエントリのあとごちょごちょやってたらとりあえず動くようになったので、書いておく。
まず、依存しているらしいパッケージを apt install でインストール。

  • libgmp3-dev
  • libsqlite3-dev

専用ユーザの作りなおし。

takatoh@wplj $ sudo adduser tonzlr
takatoh@wplj $ sudo gpasswd -a tonzlr sudo

作ったユーザでログインして、GitHub からクローン。

tonzlr@wplj:~$ git clone https://github.com/takatoh/Tonzlr.git tonzlr

bundle install

tonzlr@wplj:~$ cd tonzlr
tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.1 with native extensions
Installing minitest 5.5.0
Installing thread_safe 0.3.4
Installing builder 3.2.2
Installing erubis 2.7.0
Installing rack 1.5.2
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing arel 5.0.1.20140414130214
Installing coffee-script-source 1.8.0
Installing execjs 2.2.2
Installing thor 0.19.1
Installing hike 1.2.3
Installing multi_json 1.10.1
Installing libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Installing tilt 1.4.1
Installing ref 1.0.5
Installing sass 3.2.19
Installing spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Installing will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-6634-1swo6wh.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that gem install json -v '1.8.1' succeeds before bundling.

やっぱりエラーになったけど、めげずに bundle update

tonzlr@wplj:~/tonzlr$ bundle update
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing rake 12.0.0 (was 10.4.2)
Installing i18n 0.8.1 (was 0.7.0)
Installing json 1.8.6 (was 1.8.1) with native extensions
Installing minitest 5.10.1 (was 5.5.0)
Installing thread_safe 0.3.6 (was 0.3.4)
Installing builder 3.2.3 (was 3.2.2)
Using erubis 2.7.0
Installing rack 1.5.5 (was 1.5.2)
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using bundler 1.14.6
Installing coffee-script-source 1.12.2 (was 1.8.0)
Installing execjs 2.7.0 (was 2.2.2)
Installing thor 0.19.4 (was 0.19.1)
Using hike 1.2.3
Installing multi_json 1.12.1 (was 1.10.1)
Installing libv8 3.16.14.17 (x86_64-linux) (was 3.16.14.3)
Using tilt 1.4.1
Installing rdoc 4.3.0 (was 4.2.0)
Installing ref 2.0.0 (was 1.0.5)
Using sass 3.2.19
Installing spring 1.7.2 (was 1.2.0)
Installing sqlite3 1.3.13 (was 1.3.10) with native extensions
Installing turbolinks-source 5.0.0
Installing will_paginate 3.1.5 (was 3.0.7)
Installing tzinfo 1.2.2
Installing rack-test 0.6.3 (was 0.6.2)
Installing treetop 1.4.15
Installing coffee-script 2.4.1 (was 2.3.0)
Installing uglifier 3.1.3 (was 2.6.0)
Installing sprockets 2.12.4 (was 2.12.3)
Installing sdoc 0.4.2 (was 0.4.1)
Installing therubyracer 0.12.3 (was 0.12.1) with native extensions
Installing turbolinks 5.0.1 (was 2.5.3)
Installing activesupport 4.1.4
Installing mail 2.5.4
Installing actionview 4.1.4
Installing activemodel 4.1.4
Installing jbuilder 2.6.3 (was 2.2.6)
Installing actionpack 4.1.4
Installing activerecord 4.1.4
Installing actionmailer 4.1.4
Installing railties 4.1.4
Installing sprockets-rails 2.3.3 (was 2.2.2)
Installing coffee-rails 4.0.1
Installing jquery-rails 3.1.4 (was 3.1.2)
Installing rails 4.1.4
Installing sass-rails 4.0.5
Bundle updated!

今度は成功。

設定ファイルの編集。

tonzlr@wplj:~/tonzlr$ cd config
tonzlr@wplj:~/tonzlr/config$ cp site_config.yml.example site_config.yml
tonzlr@wplj:~/tonzlr/config$ vi site_config.yml

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

tonzlr@wplj:~/tonzlr$ rake db:migrate RAILS_ENV=production
== 20141229035713 CreateWallpapers: migrating =================================
-- create_table(:wallpapers)
   -> 0.0021s
== 20141229035713 CreateWallpapers: migrated (0.0023s) ========================

== 20141229040752 CreateImages: migrating =====================================
-- create_table(:images)
   -> 0.0009s
== 20141229040752 CreateImages: migrated (0.0010s) ============================

== 20141230093231 AddImagesCountToWallpapers: migrating =======================
-- add_column(:wallpapers, :images_count, :integer, {:default=>0})
   -> 0.0038s
== 20141230093231 AddImagesCountToWallpapers: migrated (0.0039s) ==============

== 20141230233607 CreateTags: migrating =======================================
-- create_table(:tags)
   -> 0.0010s
== 20141230233607 CreateTags: migrated (0.0011s) ==============================

== 20141230234524 CreateTaggings: migrating ===================================
-- create_table(:taggings)
   -> 0.0010s
-- add_index(:taggings, :tag_id)
   -> 0.0007s
-- add_index(:taggings, [:taggable_id, :taggable_type])
   -> 0.0012s
== 20141230234524 CreateTaggings: migrated (0.0031s) ==========================

== 20141231051856 CreatePools: migrating ======================================
-- create_table(:pools)
   -> 0.0011s
== 20141231051856 CreatePools: migrated (0.0012s) =============================

== 20141231052318 CreatePoolings: migrating ===================================
-- create_table(:poolings)
   -> 0.0009s
== 20141231052318 CreatePoolings: migrated (0.0010s) ==========================

apostrophe からデータベースを持ってきて上書き。

tonzlr@wplj:~/tonzlr$ cd db
tonzlr@wplj:~/tonzlr/db$ scp tonzlr@apostrophe:tonzlr/db/production.sqlite3 .
tonzlr@apostrophe's password: 
production.sqlite3                            100% 6721KB   6.6MB/s   00:00
tonzlr@wplj:~/tonzlr/db$ cd ..

assets のプリコンパイル。

tonzlr@wplj:~/tonzlr$ rake assets:precompile
I, [2017-03-04T14:51:43.129624 #7460]  INFO -- : Writing /home/tonzlr/tonzlr/public/assets/application-542d4bf5c7f8bc802982fa7761156fb8.js
I, [2017-03-04T14:51:43.184646 #7460]  INFO -- : Writing /home/tonzlr/tonzlr/public/assets/application-9084123bb8f8533cdd8e6f85fc1b536c.css

Rails 自身で配信するように、config/environments/production.rb を編集。

そして起動。SECRET_KEY_BASE 環境変数を設定するのを忘れないように。

tonzlr@wplj:~/tonzlr$ export SECRET_KEY_BASE=rake secret
tonzlr@wplj:~/tonzlr$ bundle exec rails s -e production
=> Booting WEBrick
=> Rails 4.1.4 application starting in production on http://0.0.0.0:3000
=> Run rails server -h for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2017-03-04 14:55:12] INFO  WEBrick 1.3.1
[2017-03-04 14:55:12] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux-gnu]
[2017-03-04 14:55:12] INFO  WEBrick::HTTPServer#start: pid=7479 port=3000

これで、ブラウザでアクセスすると、動いているのが確認できた。

Railsアプリの引っ越し

Flask アプリの引っ越しが完了したので、apostrophe (Ubuntu 14.04 LTS) で動いているもうひとつの WEB アプリ(Rails 製)を wplj (Ubuntu 16.04 LTS) に引っ越す。

下準備

このアプリはファイルを貯めこむタイプなので、事前に tar コマンドと scp コマンドを使って /media/aysheaia/wallpapers 以下にファイルを配置しておいた。

専用ユーザの作成

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

Railsアプリの配置

ここからは上で作ったユーザで作業。
GitHub からクローンする。

tonzlr@wplj:~$ git clone https://github.com/takatoh/Tonzlr.git tonzlr

ディレクトリを移動して、依存パッケージをインストール。

tonzlr@wplj:~$ cd tonzlr
tonzlr@wplj:~/tonzlr$ bundle install
プログラム 'bundle' はまだインストールされていません。 'bundle' を利用するために、コンピュータの管理者に 'ruby-bundler' をインストールすることを相談してください

bundler がインストールされてなかった。インストール。

tonzlr@wplj:~/tonzlr$ sudo gem install bundler
[sudo] tonzlr のパスワード: 
tonzlr は sudoers ファイル内にありません。この事象は記録・報告されます。

あれ?なんでだ?
仕方がないので、takatoh ユーザに戻ってインストール。

takatoh@wplj $ sudo gem install bundler

もう一度 tonzlr ユーザで。

tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.1 with native extensions
Installing minitest 5.5.0
Installing thread_safe 0.3.4
Installing builder 3.2.2
Installing erubis 2.7.0
Installing rack 1.5.2
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing arel 5.0.1.20140414130214
Installing coffee-script-source 1.8.0
Installing execjs 2.2.2
Installing thor 0.19.1
Installing hike 1.2.3
Installing multi_json 1.10.1
Installing libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Installing tilt 1.4.1
Installing ref 1.0.5
Installing sass 3.2.19
Installing spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Installing will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-4815-1cena5t.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that gem install json -v '1.8.1' succeeds before bundling.

む、なんかエラーが。ヘッダファイル ruby.h が見つからないのか?
再び takatho ユーザで。ああもう、いちいちめんどくさいな。

takatoh@wplj $ sudo apt install ruby-dev

tonzlr に戻ってもう一度。今度はどうだ。

tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Using rake 10.4.2
Using i18n 0.7.0
Installing json 1.8.1 with native extensions
Using minitest 5.5.0
Using thread_safe 0.3.4
Using builder 3.2.2
Using erubis 2.7.0
Using rack 1.5.2
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using coffee-script-source 1.8.0
Using execjs 2.2.2
Using thor 0.19.1
Using hike 1.2.3
Using multi_json 1.10.1
Using libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Using tilt 1.4.1
Using ref 1.0.5
Using sass 3.2.19
Using spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Using will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-5824-26t94o.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that gem install json -v '1.8.1' succeeds before bundling.

まだエラーが!
ググってみるとこのページに
 cf. https://github.com/flori/json/issues/253
libgmp3-dev をインストールすればいい、みたいに書いてある。

takatoh@wplj $ sudo apt install libgmp3-dev
tonzlr@wplj:~/tonzlr$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Using rake 10.4.2
Using i18n 0.7.0
Installing json 1.8.1 with native extensions
Using minitest 5.5.0
Using thread_safe 0.3.4
Using builder 3.2.2
Using erubis 2.7.0
Using rack 1.5.2
Using mime-types 1.25.1
Using polyglot 0.3.5
Using arel 5.0.1.20140414130214
Using coffee-script-source 1.8.0
Using execjs 2.2.2
Using thor 0.19.1
Using hike 1.2.3
Using multi_json 1.10.1
Using libv8 3.16.14.3 (x86_64-linux)
Using bundler 1.14.6
Using tilt 1.4.1
Using ref 1.0.5
Using sass 3.2.19
Using spring 1.2.0
Installing sqlite3 1.3.10 with native extensions
Using will_paginate 3.0.7
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-7573-1jyzrko.rb extconf.rb
creating Makefile

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory:
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but
only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer
without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/gems/json-1.8.1 for inspection.
Results logged to
/home/tonzlr/tonzlr/vendor/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

An error occurred while installing json (1.8.1), and Bundler cannot
continue.
Make sure that gem install json -v '1.8.1' succeeds before bundling.

まだダメだ。最後のメッセージのように json をインストールしてみる。

takatoh@wplj $ sudo gem install json -v '1.8.1'
Fetching: json-1.8.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing json:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20170304-7998-r1om93.rb extconf.rb
creating Makefile

current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean

current directory: /var/lib/gems/2.3.0/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:0:
../fbuffer/fbuffer.h: In function ‘fbuffer_to_s’:
../fbuffer/fbuffer.h:175:47: error: macro "rb_str_new" requires 2 arguments, but only 1 given
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                               ^
../fbuffer/fbuffer.h:175:20: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
     VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                    ^
Makefile:239: ターゲット 'generator.o' のレシピで失敗しました
make: *** [generator.o] エラー 1

make failed, exit code 2

Gem files will remain installed in /var/lib/gems/2.3.0/gems/json-1.8.1 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/json-1.8.1/gem_make.out

ダメだな。詰んだか?
……というところで時間切れ。今日はここまで。

RubyとPythonをインストール

Ruby

takatoh@wplj $ sudo apt install ruby
takatoh@wplj $ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

おお、2.3だ。

Python

takatoh@wplj $ sudo apt install python
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
python はすでに最新バージョン (2.7.11-1) です。
python は手動でインストールしたと設定されました。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 432 個。

あれ、入ってる?

takatoh@wplj $ python -V
Python 2.7.11+

入ってた。

デーモンとして動かすSinatraアプリにユーザーのインストールしたRubyを使わせる

以前作った Sinatra アプリ(フォトビューワー)をデーモンとして動かそうとしてハマった記録。
Sinatra アプリをデーモン化したことは前にもやったことがあるので、基本的にはその時のエントリを見ながらやったんだけど、一つだけ、ハマりどころがあった。それはアプリが Ruby 2.0 以降(だっけ?)にサポートしているキーワード引数を使って書いてあるのに対して、システムにインストールされているのは Ruby 1.9.3 だってこと。ユーザーは rvm でインストールした 2.3.0 を使っているのでテスト中は動くけど、いざ本番になってみるとシステムの 1.9.3 が使われるので動かない。
どうにかしてデーモンにも rvm でインストールした 2.3.0 を使わせたい。
探し方が悪いのか、ググっても情報が出てこない。結局解決策を見つけたのは、自分のエントリだった。

つまり、起動スクリプトで GEM_PATH と GEM_HOME に rvm のパスを設定して export すればいいようだ。書いた起動スクリプトがこれ:

当然 PATH も rvm の Ruby のパスを設定している。
ともあれ、これで無事起動するようになった。

Windows 10環境のrubygemsでSSLエラーが発生した場合の対処法

新しい PC のセットアップ中、rubygems でエラーが発生した。環境は次の通り。

  • Windows 10 Home
  • Ruby 2.3.1 (RubyInstaller)
  • gem 2.5.1

発生したエラーは:

^o^ > gem install acm
ERROR:  Could not find a valid gem 'acm' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

どうも、SSLのエラーらしい。

で、いろいろとググりながら試した結果、次の手順でうまく回避できたのでメモしておく。

rubygemsのアップデート

普通なら gem コマンドでアップデートできるけど、それが使えないので rubygems.org からダウンロードしてアップデートする。
 cf. rubygems-update 2.6.8
上のリンクから、rubygems-update の最新版 2.6.8 をダウンロード、インストールする。

^o^ > gem install rubygems-update-2.6.8.gem --local
Successfully installed rubygems-update-2.6.8
Parsing documentation for rubygems-update-2.6.8
Installing ri documentation for rubygems-update-2.6.8
Done installing documentation for rubygems-update after 39 seconds
1 gem installed

^o^ > gem -v
2.5.1

インストールしただけではアップデートされないので、update_rubygems コマンドでアップデートする。

^o^ > update_rubygems
RubyGems 2.6.8 installed
Parsing documentation for rubygems-2.6.8
Installing ri documentation for rubygems-2.6.8
(以下略)

長々とメッセージが出るけど、これでアップデートできた。

^o^ > gem -v
2.6.8

確認

これで、正常に使えるようになったはず。

^o^ > gem install acm
Fetching: thor-0.19.1.gem (100%)
Successfully installed thor-0.19.1
Fetching: acm-0.4.2.gem (100%)
Successfully installed acm-0.4.2
Parsing documentation for thor-0.19.1
Installing ri documentation for thor-0.19.1
Parsing documentation for acm-0.4.2
Installing ri documentation for acm-0.4.2
Done installing documentation for thor, acm after 2 seconds
2 gems installed

OK。

参考ページ

 cf. Ruby distros, RubyGems, and SSL—Oy vey!

九九表のすべてのマスの和

前回から時間が開いてしまった。本当は Text.Parsec の話題を書こうと思ってるんだけど、今日も時間がないので小ネタ、しかも他人のネタ。

 cf. 九九表のすべてのマスの和 – 無駄と文化

詳しくはリンク先を見て。いくつかの言語でやってるんだけど、Ruby と Scheme がなかったのでやってみた。

まずは Ruby。

takatoh@apostrophe $ ruby sum_of_kuku.rb
2025

1〜9までの配列の直積をとって、それぞれを掛けあわせて、最後に全部足してるだけ。

Scheme でも同じ考え方。でもリストの直積を取る手続きが見当たらなかったので direct-product を自作した。

takatoh@apostrophe $ gosh sum-of-kuku.scm
2025

逆関数法で指数分布する乱数を生成する

[0,1)区間の一様乱数から、指数分布にならう乱数を生成するには、逆関数法というのが使える。
指数分布の密度関数は、パラメータをτとすると:
f(\tau)=\lambda e^{-\lambda\tau}
であり、分布関数 g(τ) は:
g(\tau)=\int^\tau_{-\infty}{\lambda e^{-\lambda\tau}}d\tau=1-e^{-\lambda\tau}
となる。g(τ)は 0~1 の値をとるので、この逆関数:
\tau=-\frac{1}{\lambda}log(1-g(\tau))
の g(τ) の代わりに一様乱数を入力してやれば、τ は指数分布する乱数になる。

じゃあ Ruby でやってみよう。

λ=0.5とし、10000個の乱数を発生させている。
これを Excel でグラフ化したのがこれ。
expon
「指数分布」の曲線は、上に書いた密度関数の曲線を、スケールを合わせるために8000倍して描いている。乱数はちゃんと指数分布になっているようだ。

参考にしたページ:
 cf. http://www.ishikawa-lab.com/montecarlo/4shou.html

Box-Muller法で正規分布する乱数を生成する

一様分布する乱数から、正規分布に従う乱数を生成する方法に、Box-Muller法というのがある。
Wikipediaによれば、(0,1) 区間の一様分布乱数2つ(X,Y)から、下の式で2つの正規分布乱数 Z_1Z_2 が得られる。

Z_1=\sqrt{-2log{X}}\cos{2\pi{Y}}
Z_2=\sqrt{-2log{X}}\sin{2\pi{Y}}

Z_1Z_2 は標準正規分布となるので、これらに標準偏差 σ をかけて平均 μ を足してやれば、任意の正規分布に従う乱数が得られる。

Ruby で 10000個の乱数を発生させるスクリプトを書いてみた。ここでは平均 μ=1.0、標準偏差 σ=0.2 とした。

結果を Excel でグラフ化してみた。水色の点が 0.1 単位のヒストグラム。黄緑の線が Excel に用意されている MORM.DIST 関数で描いたもの(スケールを合わせるために NORM.DIST 関数の値は 1000 倍している)。

Box-Muller

こうしてみると、ほぼぴったりと正規分布になっているようだ。

ちなみに Excel で平均値と標準偏差を求めたら、それぞれ μ=0.997、σ=0.201 となった。