Category Archives: ruby

Asciidoctor による PDF 生成

Python asciidoc と Apache FOP を使って PDF を生成する手順はここで説明しました。今回は asciidoctor と asciidoctor-fopub を使って PDF を生成してみます。動作確認は Fedora 21 でおこないました。

asciidoctor は AsciiDoc から DocBook を生成するツールです。Ruby で開発されており、RubyGem として提供されています。Python の asciidoc の代わりとなるツールです。

asciidoctor-fopub は DocBook から PDF を生成するツールです。Java で開発されており、Apache FOP の代わりとなるツールです。

(参考)
https://github.com/asciidoctor/asciidoctor
https://github.com/asciidoctor/asciidoctor-fopub

これらを、AsciiDoc > DocBook > PDF の順に処理することで AsciiDoc から PDF ドキュメントを生成することができます。

それでは、asciidoctor と asciidoctor-fopub のインストールをおこなってみましょう。

VLGothic フォント、IPA フォントのインストール

日本語フォントをインストールします。root ユーザーにて作業します。

# yum -y install vlgothic*-fonts
# yum -y install ipa-*-fonts

Asciidoctor のインストール

rubygem-asciidoctor という名前の RPM パッケージをインストールします。

# yum -y install rubygem-asciidoctor

これにより、以下がインストールされます。Ruby 本体もインストールされます。

1) ruby-irb-2.1.6-27.fc21.noarch.rpm
2) ruby-2.1.6-27.fc21.x86_64.rpm
3) rubygem-bigdecimal-1.2.4-27.fc21.x86_64.rpm
4) rubygem-json-1.8.1-27.fc21.x86_64.rpm
5) rubygem-io-console-0.4.3-27.fc21.x86_64.rpm
6) rubygem-asciidoctor-1.5.2-1.fc21.noarch.rpm
7) rubygem-psych-2.0.5-27.fc21.x86_64.rpm
8) rubypick-1.1.1-2.fc21.noarch.rpm
9) rubygems-2.2.2-101.fc21.noarch.rpm
10) rubygem-rdoc-4.1.1-2.fc21.noarch.rpm
11) ruby-libs-2.1.6-27.fc21.x86_64.rpm

OpenJDK 8 のインストール

asciidoctor-fopub のインストールには OpenJDK が必要になるので、これをインストールします。まずは、利用可能な OpenJDK を確認します。

# yum search all openjdk
...
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
...

OpenJDK 8 をインストールします。

# yum -y install java-1.8.0-openjdk-devel

asciidoctor-fopub のインストール

asciidoctor-fopub はまだ RPM として提供されていません。GitHub から asciidoctor-fopub をクローンしてインストールします。root 以外の一般ユーザーで作業します。

$ cd $HOME
$ git clone https://github.com/asciidoctor/asciidoctor-fopub

日本語の AsciiDoc ファイルを作成して動作確認

asciidoctor-fopub のディレクトリ下に移動して、最初の動作確認をおこないます。

$ cd asciidoctor-fopub

確認用の簡単な日本語の AsciiDoc ファイルを作成します。ファイル名は「samplej.adoc」としました。

$ cat << "EOF" > samplej.adoc
= 今日のご飯
犬猫 太郎 <doc@example.com>

参考サイト http://asciidoctor.org/[Asciidoctor]

== はじめに

今日のご飯のメニュー

* ドリンク: お酒
* メインディッシュ: 「猫まんま」/「犬まんま」からお選びください

Ruby のプログラムのサンプルです。

.A basic Ruby application
[source,ruby]
----
puts "寿司食べたい!"
----

EOF

asciidoctor コマンドを使って「samplej.adoc」ファイルから DocBook を作成します。DocBook は「samplej.xml」というファイル名で作成されます。

$ asciidoctor -b docbook -d article -a data-uri! samplej.adoc

つぎに fopub コマンドを使って DocBook ファイルから PDF ファイルを生成しますが、これは以下の手順でおこないます。

まずは、プロキシ配下の環境で作業している場合には、fopub コマンドを最初に実行する前に、「asciidoctor-fopub」ディレクトリの下に「gradle.properties」ファイルを作成して、プロキシの指定をおこいます。

(例)
$ cat << "EOF" > gradle.properties
systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
EOF

(参考)
http://gradle.org/docs/current/userguide/userguide_single.html
19.3. Accessing the web via a proxy

つぎに fopub コマンドを使って DocBook ファイルから PDF ファイルを生成します。このとき、日本語フォントを明示的に指定する必要があります。これを忘れると PDF 上で漢字が # に置き換えらて表示されます。

$ ./fopub samplej.xml \
  -param title.font.family VL-PGothic-Regular \
  -param body.font.family VL-PGothic-Regular \
  -param sans.font.family VL-PGothic-Regular \
  -param monospace.font.family VL-PGothic-Regular \
  -param symbol.font.family VL-PGothic-Regular

fopub コマンドが最初に実行されたときに、Gradle によって fopub に必要なライブラリが自動的にインターネットから取得され、これが終了すると PDF 生成が開始されます。fopub コマンドが完了したら、PDF ファイル「samplej.pdf」が生成されるので、日本語が正しく表示されていることを確認します。

fopub コマンドをシステムワイドに利用できるようにする

上記で作成した「asciidoctor-fopub」ディレクトリを「/usr/share/」以下にコピーします。

$ cd $HOME
$ sudo cp -ir ./asciidoctor-fopub /usr/share

fopub コマンドの wrapper シェル「/usr/local/bin/fopub」を作成し、実行権限を付加します。root ユーザーにて作業します。

# cat << "EOF" > /usr/local/bin/fopub
#!/bin/sh
DIRNAME=`dirname $0`
FOPUB_PATH=/usr/share/asciidoctor-fopub
PATH="${FOPUB_PATH}:${PATH}"
exec $FOPUB_PATH/fopub $@
EOF

# chmod +x /usr/local/bin/fopub

「JavaScript Promiseの本」の PDF 生成

動作確認として、fopub コマンドを使って、azu 氏が公開されている 「JavaScript Promiseの本」の PDF を生成してみます。

$ git clone https://github.com/azu/promises-book.git
$ cd promises-book/
$ asciidoctor -b docbook -d book -a data-uri! index.adoc
$ fopub index.xml \
  -param title.font.family VL-PGothic-Regular \
  -param body.font.family VL-PGothic-Regular \
  -param sans.font.family VL-PGothic-Regular \
  -param monospace.font.family VL-PGothic-Regular \
  -param symbol.font.family VL-PGothic-Regular

生成された PDF ファイル「index.pdf」 の内容を確認します。オリジナルサイトで配布されている PDF に近い内容になっており、とても綺麗な仕上がりの PDF ができました。

IPAPMincho フォントを指定して PDF を生成したい場合は、以下のように指定します。

$ fopub index.xml \
  -param title.font.family IPAPMincho \
  -param body.font.family IPAPMincho \
  -param sans.font.family IPAPMincho \
  -param monospace.font.family IPAPMincho \
  -param symbol.font.family IPAPMincho

簡単な Rails アプリケーションの作成

前回は Ruby の開発環境をインストールしたので、ここでは簡単な rails アプリケーション、いわゆる rails 版「Hello, World!」アプリを作成してみます。「RailsによるアジャイルWebアプリケーション開発 第4版」を参考にしました。

rails new の実行

「rails new」コマンドを使って rails アプリケーションを作成します。このとき、「--skip-bundle」オプションを指定し、これと同時に bundle install が実行されるのを防止します。つぎのコマンドを実行すると、アプリケーションと同名の「demo」という名前のサブディレクトリを作成し、そこに rails アプリケーションを配置します。

$ rails new demo --skip-bundle

bundle insall の実行

「rails new」コマンドが終了したことを確認したら、アプリケーションのディレクトリに移動し、「bundle install」コマンドを実行します。これにより、その rails アプリに必要なすべての gem パッケージが一括でインストールされます。root 以外のユーザーで「bundle install」を実行すると、それらの gem パッケージは「.gem」ディレクトリの下にインストールされます。インストール時にバージョンコンフリクトなどのエラーが発生する場合は、この「.gem」ディレクトリとアプリケーションのサブディレクトリ「demo」を削除してから最初からやり直してみてください。

$ cd demo
$ bundle install

「bundle install」を実行したときにインストールされる gem パッケージの一覧は Gemfile に記述されています。「bundle install --path vendor/bundle」というコマンドを使うことで、gem パッケージをアプリケーションのディレクトリ内にインストールすることも可能です。こうすることで、他のアプリとの gem パッケージのバージョンコンフリクトを防止することができます。redmine など、配布が必要なアプリは、アプリケーションのディレクトリ内に gem パッケージを配置する形でインストールします。

参考)
http://bundler.io/bundle_install.html
http://blog.redmine.jp/articles/3_0/installation_centos/

rails アプリケーションの起動

rails アプリには WEBrick と呼ばれる開発用の Web Server が付属しています。これを起動するには、つぎのコマンドを実行します。

$ rails server

これによって rails アプリにアクセスすることができます。ブラウザから「http://127.0.0.1:3000」にアクセスして空のアプリの画面が表示されることを確認してください。WEBrick を停止するには、CTRL+C を入力して停止します。

rails のバージョンの指定

特定のバージョンの rails を明示的に指定してインストールすることもできます。

例)
$ gem install rails -v 4.2.0
$ rails new demo
$ cd demo & rails s

すべての利用可能な rails のバージョンはつぎのコマンドで検索できます。

$ gem list --remote --all rails | grep '^rails '

ただし、ruby のバージョンと rails バージョンの互換性を確認したうえで rails のバージョンを選択する必要があります。以下の互換性が推奨されているようです。

Rails 4.0 – Ruby 2.0 以上を推奨
Rails 4.1/4.2 – Ruby 2.1 以上を推奨
Rails 4.2.1 – Ruby 2.2 以上を推奨

コントローラとアクションメソッドの作成

rails アプリケーションのカスタマイズの最初のステップは、コントローラとアクションメソッドの作成です。簡単に説明すると、アクションメソドはブラウザから送信された URL にもとづいてコールされる関数のことです。そして、コントローラはアクションメソドを集めたものです。文法的にはコントローラはクラスとして実装され、アクションメソドは、そのクラスのインスタンスメソドとして実装されます。つぎのコマンドはコントローラ「Say」を作成し、アクションメソッド「hello」および「goodbye」を作成します。

$ rails generate controller say hello goodbye

これにより SayController クラスが作成され、その中に hello メソド、goodbye メソド が定義されます。SayController クラスは rails フレームワークが提供する ApplicationController クラスを継承しています。

アクションメソッドにロジックを記述

作成されたアクションメソッドの中身は空っぽなので、この中にいわゆるビジネス・ロジックを記述していきます。これには「app/controllers/say_controller.rb」ファイルを開いての hello メソッドをつぎのように変更します。現在時刻を取得してその値をインスタンス変数 @time に格納しています。

class SayController < ApplicationController
  def hello
    @time = Time.now
  end

  def goodbye
  end
end

アクションメソドが実行された後は、自動的に同名のビューの処理に引き継がれ、HTML レンダリングがおこなわれます。このとき、アクションメソドの中で作成したインスタンス変数 @time はビューに引き渡されます。

ビュー(テンプレート)の内容を記述

「ビュー」はアクションメソッドで設定されたインスタンス変数の内容を受け取り HTML をレンダリングする機能を持ちます。「ビュー」のことを「テンプレート」とも呼びます。ファイル名の拡張子は「.html.erb」となっており、これは「Embedded Ruby」を意味します。Windows の ASP (Active Server Pages) や Java の JSP (Java Server Pages) と同等のものになります。

「app/views/say/hello.html.erb」ファイルを開いて以下のように変更します。ビューの中でアクションメソッドから渡されたインスタンス変数 @time を参照しています。

<h1>railsからこんにちは!</h1>
<p>現在の時刻は <%= @time %> です。</p>

「app/views/say/goodbye.html.erb」ファイルを開いて以下のように変更します。

<h1>さようなら!</h1>
<p>ご訪問ありがとうございました。</p>

各ビューのテンプレートの中には HTML ページの <body> 〜 </body> タグの内側の部分のみを記述します。ここで記述した内容はさらに外枠の共通テンプレート「app/views/layouts/application.html.erb」に取り込まれ、これによって <body> 〜 </body> タグの外側の部分がレンダリングされて出力されます。

アプリの画面を表示する

ブラウサで以下の URL を開いて内容を確認します。URL のクエリーの部分が「http://〜/コントローラ名/アクションメソド名」となっていることに注意してください。

http://127.0.0.1:3000/say/hello
および
http://127.0.0.1:3000/say/goodbye

ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドが呼び出され、アクションメソッドで設定した内容が、ビューに反映されて HTML ページに表示されることがわかります。

ルーティングについて

上記で「ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドを呼び出す」と述べましたが、こうした処理のことを「ルーティング」と呼び、このルーティングの設定は「config/routes.rb」ファイルに記述します。

Rails.application.routes.draw do
  get 'say/hello'

  get 'say/goodbye'

end

例えば「http://127.0.0.1:3000/」が呼び出されたときに、indexページ(rootページ)として、hello ページを表示したい場合は、つぎのように「root ‘say#hello’」の行を追加します。また、どの URL パターンにも当てはまらないときに goodbye ページを表示したい場合は「match ‘*path’, to: ‘say#goodbye’, via: :all」の行を追加します。

Rails.application.routes.draw do
  root 'say#hello'

  get 'say/hello'

  get 'say/goodbye'

  match '*path', to: 'say#goodbye', via: :all

end

RPM を使って Ruby 開発環境をインストール

Fedora に Ruby をインストールしようとしたとき、以前は古いバージョンのものしか用意されていませんでした。そのため、新しいバージョンの Ruby のソースをダウンロードし、コンパイルしてインストールする必要がありました。現在はそれなりに新しいバージョンのものが用意されているので、RPM を使ってインストールできます。Fedora 21 で動作確認しました。

Apache Web サーバをインストール

開発環境では主に WEBrick と呼ばれる Web Server を利用するので apache を利用する必要はありませんが、念の為にインストールしておきます。

# yum -y install httpd-devel

Apache Web サーバを開始し、また自動起動に設定します。

# systemctl start httpd
# systemctl enable httpd

ブラウザで「http://127.0.0.1/」にアクセスして Apache のテストページが表示されることを確認します。

sqlite をインストール

sqlite データベースのデータは1つのローカルファイルとして格納され、Microsoft Access の MDB ファイルのような感覚で利用できるデータベースです。 MySQL 等とほぼ同等の SQL コマンドが利用でき、またローカルファイルをコピーするだけで、データベースのデータがコピーできるので開発環境でよく利用されます。つぎのコマンドにより SQLite 3 がインストールされます。

# yum -y install sqlite sqlite-devel

MariaDB をインストール

つぎのコマンドで MariaDB をインストールします。

# yum -y install mysql-server mysql

これによって以下のようなパッケージがインストールされます。

1) boost-program-options-1.55.0-8.fc21.x86_64.rpm
2) galera-25.3.5-9.fc21.x86_64.rpm
3) mariadb-10.0.17-1.fc21.x86_64.rpm
4) mariadb-common-10.0.17-1.fc21.x86_64.rpm
5) mariadb-config-10.0.17-1.fc21.x86_64.rpm
6) mariadb-errmsg-10.0.17-1.fc21.x86_64.rpm
7) mariadb-galera-server-10.0.17-3.fc21.x86_64.rpm
8) perl-DBD-MySQL-4.027-3.fc21.x86_64.rpm
9) mariadb-libs-10.0.17-1.fc21.x86_64.rpm

インストールが完了したら MariaDB を開始し、自動起動に設定します。

# systemctl start mariadb
# systemctl enable mariadb

インストール直後に MariaDB の起動しようとして以下のエラーが表示される場合があります。

# systemctl start mariadb
Job for mariadb.service failed. See "systemctl status mariadb.service" and "journalctl -xe" for details.

その場合は、必要なファイルは保存した上で、MariaDB をアンインストールし、MariaDB 関連の設定ファイルとディレクトリを削除したことを確認した後、再度インストールしてみてください。

例)
# yum -y erase \
  boost-program-options \
  galera \
  mariadb \
  mariadb-common \
  mariadb-config \
  mariadb-errmsg \
  mariadb-galera-server \
  perl-DBD-MySQL \
  mariadb-libs

# rm /etc/my.cnf
# rm -rf /etc/my.cnf.d/
# rm -rf /usr/share/mariadb
# rm -rf /var/lib/mysql/
# rm -rf /var/log/mariadb/

MariaDB のインストール直後は、データベースの root ユーザのパスワードは空の状態です。パスワードを設定していないので、パスワード無しでデータベースに接続することが可能です。今回は開発環境なので、パスワード設定をしないでおきます。デフォルトでは MariaDB に対してのネットワークアクセスを許可していないので、パスワードを設定してなくても問題ありません。もし、MariaDB の root ユーザのパスワードを設定したい場合はつぎのコマンドを実行して設定することができます。対話的にいろいろ質問されますが、パスワード入力の部分以外はエンターキーのみを押して進めます。

# mysql_secure_installation

以下のように直接に SQL コマンドを実行して root ユーザーのパスワードを変更することもできます。

# mysql -uroot
mysql> use mysql;
mysql> update user set password=password('********') where user = 'root';
mysql> delete from user where user = '';
mysql> flush privileges;
mysql> exit;

上記の ******** の部分は任意のパスワードを設定してください。

# mysql -uroot -e "show variables like '%engine%'"

+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
| storage_engine         | InnoDB |
+------------------------+--------+

MariaDB のエンジンが InnoDB に設定されていることを確認します。InnoDB エンジンは Transaction 処理をサポートします。上記の出力結果より default_storage_engine が InnoDB になっているいることがわかります。default_storage_engine の他に storage_engine という項目も表示されていますが、これは互換性のために残しているもので現在は使用されていません。

(参考)
https://mariadb.com/kb/en/mariadb/server-system-variables/#default_storage_engine
https://mariadb.com/kb/en/mariadb/server-system-variables/#storage_engine

つぎのコマンドでエンジンの種類を確認することもできます。

# mysql -uroot -e "show engines"

参考までに、エンジンは起動後も変更することができます。テーブル毎に異なるエンジンを指定できます。以下の例は、test データベース内に、 t1 テーブルを MyISAM エンジンで作成し、t2 テーブルを InnoDB エンジンで作成します。

例)
# mysql -u root
> use test;
> set storage_engine=MYISAM;
> create table t1 (i int);
> set storage_engine=INNODB;
> create table t2 (i int);
> show tables;
> show table status from test;
> drop tables t1, t2;
> exit
#

MariaDB の設定ファイルのトップは「/etc/my.cnf」であり、その中から「/etc/my.cnf.d/」ディレクトリ内の各ファイルが読み込まれます。今回は変更部分だけを「/etc/my.cnf.d/customize.cnf」ファイルに設定します。これは以下の手順でおこないます。

特に MariaDB のキャラクターセットを「utf8mb4」でなく「utf8」に設定してしまうと、UTF-8 の 4バイト文字、例えば「𠮷野家(よしのや)」の「𠮷」が DB に格納されず欠落するので注意が必要です。

# cat << "EOF" > /etc/my.cnf.d/customize.cnf
[mysqld]
default_storage_engine=InnoDB

innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true

collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip_character_set_client_handshake

[mysql]
default_character_set=utf8mb4

[client]
default_character_set=utf8mb4
EOF

設定を有効にするために MariaDB を再起動し、設定が反映されたことを確認します。

# systemctl restart mariadb

# mysql -uroot -e "show variables like 'character_set%'"

+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8mb4                      |
| character_set_connection | utf8mb4                      |
| character_set_database   | utf8mb4                      |
| character_set_filesystem | binary                       |
| character_set_results    | utf8mb4                      |
| character_set_server     | utf8mb4                      |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+

# mysql -uroot -e "show variables like 'collation%'"

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+

Ruby のインストールに必要なツールをインストール

# yum -y install git gcc-c++ patch make bzip2 autoconf automake libtool bison openssl-devel readline-devel zlib-devel curl-devel libyaml-devel libffi-devel libxml2-devel libxslt-devel

Ruby 本体のインストール

# yum -y install ruby-devel rubygem-bundler ruby-RMagick

ruby-devel のインストールにより、依存関係によって ruby 本体もインストールされます。

JavaScript エンジンをインストール

# yum -y install nodejs

ImageMagick、IPA Font をインストール

# yum -y install ImageMagick ImageMagick-devel
# yum -y install ipa-*-fonts

Rails のインストール

# yum -y install rubygem-rails rubygem-railties

インストールされた ruby, gem, bundle, rails のバージョンを確認

ruby のバージョンを確認します。

# ruby -v
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-linux]

rubygems のバージョンを確認します。

# gem --version
2.2.2

bundle のバージョンを確認します。

# bundle -v
Bundler version 1.7.6

rails のバージョンを確認します。

# rails -v
Rails 4.1.5

irb インタプリタで ruby を使ってみる

ちょっとした対話的な操作で Ruby を使用したい場合は、 irb が利用できます。

例)
$ irb
irb(main):001:0> def t(a,b)
irb(main):002:1> (a*b)/2.0
irb(main):003:1> end
=> :t
irb(main):004:0> t(10,20)
=> 100.0
irb(main):005:0> quit
$

以上で Ruby 開発の環境がインストールできました。すぐにでも Rails アプリの開発にとりかかることができます。