RubyでWebアプリ作ろうぜ!

気ままに楽しくStudy中

CentOS 6.3(ゲストOS)へPostgreSQLをインストール

「10日でおぼえるLinuxサーバー入門教室」。別件で手間取っているため10日で読み終わる気配はなく、現在3日目の内容を読んでいます。

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

CHAPTER 03 > LESSON 13「MySQLクライアントの基本操作」では、MySQLをインストールしMySQLの基本操作を確認しますが、今後構築を予定している本番環境では、使い慣れたPostgreSQLを使うつもりなので、そちらをインストールしました。

パッケージがインストール済みかどうかを確認

# rpm -q postgresql
パッケージ postgresql はインストールされていません

リポジトリ上にあるパッケージを探す

# yum search "PostgreSQL"

PostgreSQLクライアントとサーバーをインストールする

yumコマンドでインストールした場合、システムユーザ"postgres"が自動作成される。

# yum install postgresql.x86_64
# yum install postgresql-server.x86_64

PostgreSQLの設置確認

# ls -la /etc/init.d/postgresql
-rwxr-xr-x 1 root root 5383  9月 14 02:25 2012 /etc/init.d/postgresql

PostgreSQLの初期化

データベースクラスタ($PGDATA)が作成される。
データベースユーザ"postgres"が定義される(- Uオプションを使った場合を除く)。

# service postgresql initdb
データベースを初期化中:                                    [  OK  ]

PostgreSQLの起動

[root@localhost ~]# service postgresql start
postgresql サービスを開始中:                               [  OK  ]

自動起動を設定する

# chkconfig postgresql on

Mac OS X(ホストOS)からリモートサーバー(CentOS 仮想マシン)へログイン

「10日でおぼえるLinuxサーバー入門教室」。別件で手間取っているため10日で読み終わる気配はなく、現在3日目の内容を読んでいます。

CHAPTER 03 > LESSON 12「sshによるリモートサーバーのしくみ」では、ホストOSがWindowsの場合の(クライアントPoderosaを使った)リモートサーバーへのログイン方法が書かれています。

私はホストOSにMac OS Xを使用しているので、その場合のリモートサーバーへのログイン方法を書きます。といっても非常にシンプルで、ターミナルからsshを使って以下のように入力するだけです。

ssh [ログイン先ユーザー名@]ログイン先ホスト名 [コマンド]
ssh [-l ログイン先ユーザー名] ログイン先ホスト名 [コマンド]

なおログイン先ホスト名を入力するため、あらかじめCentOSで「ifconfig」を実行し「eth0」の「inet addr:」に続いて表示されているIPアドレスを確認しておきます。

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

正規表現 ――主に「|」(選択)について

今日は、「楽しいRuby 第3版」>第14章「正規表現(Regexp)クラス」を読みました。

楽しいRuby。正直、1章〜6章あたりをパラパラとめくった段階ではぜんぜん楽しくないな〜と思っていましたが、「初めてのRuby」と並行して20章「ブロック」や21章「Mix-in」に目を通した際、本当に楽しく感じました。

たのしいRuby 第3版

たのしいRuby 第3版

これまではメタ文字の一覧に目を通しただけでもくらくらしてしまい、正規表現をちゃんと勉強したことがなかったんですが、楽しいRubyでは一から丁寧に説明されていて「おー!分かりやすい〜」と気分よく読むことができました。以下は、14章「正規表現(Regexp)クラス」を読みながら、気になった箇所を確認した結果をメモしたものです。

なお、Rubyのバージョンは1.9.3p194です。

正規表現オブジェクトの作り方

以下の3つの方法でオブジェクトを作ることができます。

/str/
regexp = Regexp.new("str")
%r!str!

空白の扱い

空白は任意の一文字として認識されるようです。

# 空白
p /./ =~ " " 
#=> 0
p /./ =~ "\s"
#=> 0

# 何もない
p /./ =~ ""
#=> nil

改行文字等の扱い

キャリッジリターンやタブ、改ページは任意の一文字として認識される。改行は任意の一文字として認識されない(mオプションを付けると認識される)。

# キャリッジリターン
p /./ =~ "\r"
#=> 0

# タブ
p /./ =~ "\t"
#=> 0

# 改ページ
p /./ =~ "\f"
#=> 0

# 改行
p /./ =~ "\n"
#=> nil
p /./m =~ "\n" # オプション「m」を付けると認識される
#=> 0

選択

P279の表14.18「『|』を使った例」にて、下記のような例示があり最初は戸惑いました。なお例示番号は便宜的に付けたものです。

例示1

     パターン: /^(ABC|DEF)$/
       文字列: "ABCDEF" 
マッチする部分:  (マッチしない) 
p /^(ABC|DEF)$/ =~ "ABCDEF"
#=> nil

例示2

     パターン: /^(AB|CD)+$/ 
       文字列: "ABCD" 
マッチする部分: "▶ABCD◀"
p /^(AB|CD)+$/ =~ "ABCD"
#=> 0

例示1と例示2とでマッチングの結果が相違することはなんとなく分かりましたが、例示2のようにパターンが「/^(AB|CD)+$/」である場合、マッチする部分は「"ABCD"」ではなく「"AB"」となるのでは?と疑問に思いました。

しかし「"AB"」ではないかと考えたのは、パターン「/^(AB|CD)+$/ 」のマッチングが

((行頭が"AB"にマッチする)かつ(行末が"AB"の1回以上の繰り返しにマッチする))
または
((行頭が"CD"にマッチする)かつ(行末が"CD"の1回以上の繰り返しにマッチする))

のようにおこなわれるものと錯誤していたためで、よく考えてみるとパターン「/^(AB|CD)+$/ 」のマッチングは

(行頭が"AB"または"CD"にマッチする)
かつ
(行末が"AB"または"CD"の1回以上の繰り返しにマッチする)

のようにおこなわれるので、マッチングする部分が「"ABCD"」になると理解できました。

# マッチする部分を確認
/^(AB|CD)+$/ =~ "ABCD"
p $&
#=> "ABCD"

キャプチャ(後方参照)

正規表現の中の「()」で囲まれた部分にマッチした文字列は、$1, $2 …といった変数から取り出すことができます。なんかシェルスクリプトと似てるな〜と思いました。

ソース

/http:\/\/([^\/]*)\// =~ "http://doc.ruby-lang.org/ja/1.9.3/doc/index.html"
p $& # マッチした部分文字列が代入されている変数
* p $1  # ホスト名が代入されている変数

結果

"http://doc.ruby-lang.org/"
"doc.ruby-lang.org"

この$1, $2 …は、「$○」の形式ですが、グローバル変数ではないことに注意が必要です。
ソース

def test
  /http:\/\/([^\/]*)\// =~ "http://doc.ruby-lang.org/ja/1.9.3/doc/index.html"
  p $&
end
test
p $1

結果

"http://doc.ruby-lang.org/"
nil

正規表現って使いこなせるようになると強力そうですね〜。章末で勧められていた「詳説 正規表現 第3版」も読んでみたいです。

詳説 正規表現 第3版

詳説 正規表現 第3版

CentOS 6.3をゲストに仮想環境構築

先日、読み終えた「作りながら学ぶRuby入門 第2版」。入門者向けに情報が整理されており分かりやすい内容だったのですが、個人的にWebサーバーがからんでくるとコードを書いている段階でイメージが湧きづらい処理が多く、Webアプリを作りたいならやっぱりLinuxやサーバーについての経験を積んで、もっとイメージが湧くように鍛えておかないといけないな〜と思いました。

そこで「経験なんて積む気があればいくらでも積める!」と自分に喝を入れ、Linuxド素人の私でも読破できそうできそうな書籍を見つけたので中古で買ってきました。

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

タイトルにも書いた仮想環境の構築は、本書を参照しながらおこなったのでスムーズに終りました。ちなみに私の環境ではホストOSがMax OS X 10.8.1になっています。本書で動作検証がおこなわれている環境では、ホストOSがWindows 7です。そのため仮想環境の構築時に使用するコマンドがWindowsとMacとで微妙に異なり適宜読み替えが必要になりますが、仮想環境を構築してしまえばゲストOSでの操作が主となりますので特に問題はないと思います。

なお、MacにおいてデフォルトゲートウェイIPアドレスは、システム環境設定 → ネットワーク → WiFi(※接続中の通信方法に応じた接続を選択する)→ TCP/IP → ルータで確認できるみたいです。

まだCHAPTER01しか読んでいませんが、手を動かしながら学んでいく構成になっているので、「作りながら学ぶRuby入門 第2版」同様にめちゃめちゃ楽しいです。実習でプロセスをpsコマンドやtopコマンドで確認し、killコマンドでシグナルを送って作業する部分がありましたが、こういう作業ってCUIの方がしっくりきますね。あと、ちょっとした設定を変更するのにviの使い勝手が良すぎて若干興奮気味です。Linuxハマりそう。

読み始めたばかりなのでまだ技術的にハマったところはありません。強いていうならmanコマンドで表示されるマニュアルが英語なので読めないということぐらい。英語苦手です。

とりあえず、日本語のマニュアルが表示されるようパッケージをインストールしました。

$ yum install man-pages-ja

f:id:rbpg:20130215113337p:plain

riquireしたらLordError→Ruby1.9.2からの仕様です

たのしいRuby 第3版

たのしいRuby 第3版

ブロックつきメソッドの作り方について勉強しようと、「楽しいRuby 第3版」>「第20章 ブロック」を写経しつつ読んでいたところ、P416の「booklist_test.rb」を実行した際にLoadErrorが発生しました。

エラーメッセージ

/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- book.rb (LoadError)
	from /Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from booklist_test.rb:2:in `<main>'

どうも実行した「booklist_test.rb」と同じディレクトリ(カレントディレクトリ)に置いてあるファイル(「book.rb」と「booklist.rb」)を読み込めていないようなので、確認してみました。

ロードパスの確認

$ irb
irb(main):001:0> $LOAD_PATH.each do |path|
irb(main):002:1*   puts(path)
irb(main):003:1> end

確認結果

/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-darwin12.1.1
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin12.1.1
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1
/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin12.1.1
=> ["/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-darwin12.1.1", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin12.1.1", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1", "/Users/admin/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin12.1.1"]

やはり「.」(カレントディレクトリ)がロードパスに指定されていませんでした。なんで〜?

google先生に聞いてみたところRuby1.9.2リリースから$LOAD_PATHにカレントディレクトリが含まれなくなったようです(ソース: Ruby公式サイト>Ruby 1.9.2リリース)。

LoadErrorが発生する
$:はカレントディレクトリを含まなくなりました。そのためスクリプトは修正を要することがあります。ともあれ、もともとスクリプトはできるだけカレントディレクトリに依存しないように書いた方がよいでしょう。

とりあえず、requireで読み込むパスに、明示的にカレントディレクトリを指定することで動くようになるそうです(ソース: ぬいぐるみライフ(仮))。こんな感じでrequireしたら写経したコードが動きました。

booklist_test.rb

# coding: utf-8
require './book'
require './booklist'

bookliset.rb

# coding: utf-8
require './book'

「作りながら学ぶRuby入門第2版」第6部、第7部(全7部)

第6部: P296〜

「作りながら学ぶRuby 第2版」第6部および第7部を読みました。

第6部では、Webサーバー用フレームワークであるWEBrickを使ってプログラムからWebページを扱う方法と、テキストにRubyのプログラムを埋め込むためのライブラリであるERBを使ってWebページを生成する方法の2つを主に学びます。

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版

実は第6部ではそれ以外にもWebアプリを作るための基礎的な事項について広く説明されてます。説明されているのは下記の事項です。

  • Webアプリケーションの構成(クライアント/サーバー方式についてなど)
  • Webの仕組みとWebサーバーの働き
  • ハイパーテキストとHTML(CSSについては第7部のコラムで触れられています)
  • WebサーバーWEBrick
  • ERBを使ってWebページを生成する

本当に、この本はいたれりつくせりですね。入門者に優しすぎて感動的です。逆に静的なウェブサイトを作った経験があるなどで、すでにHTMLなどについての知識をお持ちの方は、WEBrickとERBについての内容だけ確認して第7部へ進むと良いと思います。第7部ではWEBrickについて更に詳細な内容を学ぶことができます。

なお、第6部の練習問題の結果をデフォルトの文字設定のままのChromeSafariにて、サンプルコードの内容を読み込むと文字化けします(確認バージョンはChrome: 24.0.1312.57、Safari: 12.12)。その際は、サンプルコードのHTMLの内容にcharset属性で文字エンコーディングを指定したタグを追加すると正常に表示されます。

<head><meta charset="UTF-8"></head>

第7部: P346〜

そして、いよいよ第7部へ。この部では、本書の演習で作ってきた蔵書アプリをWebアプリバージョンへ改良していきます。

まず、目標とするアプリの画面遷移を整理し、状態の表し方として状態遷移図の書き方(読み方)を学びます。このように「設計」という考え方を入門者のうちから知っておくことで、自前でアプリを作ろうとした際に、いきなりコードを書き始めてハマるといった悲しい事態を避けることができるかもしれません。

状態遷移図でイベントや遷移について確認をしたら、次にWEBrick上でのプログラムの動作について説明がなされます。ここでは、下記ののような処理の違いに応じてWEBrickの動作がどのように変化するかについて、図を用いて分かりやすく説明されます。ここは非常に面白かったです。

  • HTMLファイルを生成する場合
  • erbファイルを表示する場合
  • フォームのアクションを処理する場合

WEBrickについてのドキュメントは少ないようですので、このように入門者向けの分かりやすい解説は貴重かもしれません。気になった方は書店で本書のP360〜363をぜひ確認してみてください。

説明の詳細は本書に譲るとして、以下、WEBrickの動作について自分用のメモを残します。

HTMLファイルを生成する場合

FileHandlerを使ってファイルを転送する。FileHandlerは、通常のファイルサーバとしての機能を提供するためのサーブレット

erbファイルを表示する場合

ERBHandlerを使って内部的にERBを呼び出し、埋め込み処理を実行する。ERBHandlerは、ERB を扱うためのサーブレット

フォームのアクションを処理する場合

ProcHandlerを使い、リクエストで指定されたアクションに関連付けられたメソッドを呼び出す。ProcHandlerは、Procを扱うためのサーブレット。Procとは、ブロックをコンテキスト(ローカル変数のスコープやスタックフレーム)とともにオブジェクト化した手続きオブジェクト。

終わりに

1ヶ月かけて本書を読むことで、久しぶりに楽しく一人の時間を過ごせた気がします。完全に童心にかえって読みふけってしまいました。私もこういう本でプログラム入門をしたかったなと思いますね〜。第7部に関しては私には多少難しい内容もありましたが、基礎はしっかりと身についたと思うので数をこなして知識を深めていきたいと思います。

本書を読み始めた段階では、本書を読み終えたらすぐにRailsの入門本を読むつもりでしたが、本書を読み進める中でRubyという言語自体に興味が湧き、もっとRuby自体の勉強をしてみたくなりました。そこで、これからは先日購入した「初めてのRuby」を読んでいこうと思います。ちょっと寄り道していきます。楽しみ〜。

初めてのRuby

初めてのRuby

HTMLの記述方法

「作りながら学ぶRuby入門 第2版」での勉強も、いよいよ第6部(全7部中)。Webアプリ作成の段階となりました〜!

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版

Webアプリ作成に取りかかる前に、その準備としてWebアプリケーションの構成(クライアント・サーバ方式の説明など)を学び、さらにHTMLの基本を学びます。久しぶりに手書きのみでHTMLを書いたので良い復習になりました。

今日は帰宅が遅くなったのでHTMLの記述方法だけざっと確認して終了です。

HTMLの記述方法(HTML5

<!DOCTYPE html>  ※1
<html lang="ja">   ※2
<head>
<meta charset="UTF-8">  ※3
<title>HTMLの復習</title>
<link rel="stylesheet" type="text/css" href="/common.css">  ※4
</head>
<body>
...
</body>
</html>

※1 DOCTYPEを宣言する
※2 html要素でドキュメントの言語を宣言する
※3 charset属性で文字エンコーディングを指定する
※4 link要素で外部スタイルシートを読み込む