旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

はじめてのRuby on Rails インストール(VagrantとCentOSとrbenvとRuby 2.0.0でRails 4.0の環境構築の手順)

まとめていきます。いっぺんに書く気力がないので少しずつ書いています。
書き終わりました。

ぶっちゃけドットインストールを見漁ればできるんですが、レッスンが分かれてたり自分が何してるかわからなくなりそうなところが少しあったので、そこをちょっと丁寧に書きたいです。時間が経つと手順を忘れてしまう自分のためでもあります。
環境はMac OS Xです。

流れ

Vagrantを用意する

f:id:shgam:20131013193640j:plain

Vagrantは仮想環境にOSをぶっこんだりぶっこわしたりっていうのを簡単にできるツールです。Vagrantを使うためにVirtualBoxという仮想環境のためのアプリケーションを用意します。

https://www.virtualbox.org/wiki/Downloadsからお使いのOSを選んでインストールします。

f:id:shgam:20131013190519j:plain

VirtualBoxが用意できたら、Vagranthttp://downloads.vagrantup.com/から最新のバージョン・お使いのOSを選んで入れましょう。

f:id:shgam:20131013190632j:plain

Vagrantを使って仮想マシンCentOSを入れる

vagrant box add [boxの名前] [url]

という形でboxの名前とurlを指定して仮想マシンのひな形を取得します。

ここではCentOSを使いますので、下記の通り、http://www.vagrantbox.es/からbox名、urlをコピーして、下記の通りになります。CentOSはサーバによく使われるLinux系のOSです。

vagrant box add centos64box http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

時間がけっこうかかります。
待っている間に読むおすすめマンガとして、「アフロ田中」という日常系のギャグマンガがあります。松田翔太さんと佐々木希さん主演で映画にもなりました。» 上京アフロ田中全10巻 完結セット (ビッグコミックス)

...

boxの追加が終わったら、作業するスペースを作って移動しましょう。てきとーな名前で大丈夫です。

mkdir myVM
cd myVM

そこで、さっき入れたbox(テンプレート)でマシンを初期化します。

vagrant init centos64box

以下のようなメッセージが出ていれば成功です。

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

すると、現在の場所(myVM)にVagrantfileという設定ファイルが出来ているはずです。エディタでファイルを開くとこんな感じです。なんかいろいろ書かれてますが、「設定ファイルなんだな」というのが分かればオッケーです。

f:id:shgam:20131013193139j:plain

ここまで確認できたら、ついに仮想マシンを起動させます。

vagrant up

また時間がかかります。先ほどのアフロ田中を読み進めましょう。

...

終わると、マシンが実行された状態になっているのでターミナルから仮想環境に入ります。

vagrant ssh

「Welcome to your Vagrant-built virtual machine.」というメッセージが出て、ちゃんと入れるはずです。これでCentOSを利用できるようになりました。

参考 » Vagrant入門 (全13回) - プログラミングならドットインストール

CentOSにrbenvを入れる

rbenvというのは、Rubyのパッケージ管理ツールです。環境に複数のバージョンのRubyを入れとけるので便利らしいです。

gitを入れる

sudo yum -y install git

yumというのはツールをインストールするためのツールです。-yというオプションはyes/noで聞かれる全てにyesで答えてねという意味です。

rbenvを入れる

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

rbenvはGitHubに置かれているので、そこから取ってきます。

パス、環境変数の設定

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l

ここらの意味はよくわかりません。誰かおしえてください。

ruby-buildを入れる

次に、「rbenv install」のようにコマンドでささっとRubyをインストールするためのプラグインを入れます。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Ruby 2.0.0を入れる

ようやくRubyを入れるステップまで来ました。ruby-buildを入れたので、これでいけます。

Ruby2.0.0のインストール

rbenv install -v 2.0.0-p247

(追記)インストールできるRubyのバージョンを確認するには、以下のコマンドを打ちます。たぶんlはlistのlですね。

rbenv install -l

時間がかかります。待ち時間に読むマンガですが、「王様達のヴァイキング」というハッカー少年マンガもおすすめです。» 王様達のヴァイキング (1) (ビッグコミックス)

インストールの反映

これやらないと反映されないらしいです。

rbenv rehash

インストールしたものを使うと宣言

複数入れておけるのがrbenvの良いところなので、「このバージョンを使うよ」というのは言わないといけません。

rbenv global 2.0.0-p247

Rails 4.0を入れる

gemをアップデートしとく

gem update --system

Rubyのライブラリはrubygemsのgemコマンドでインストールできます。最新のRailsをインストールしたいのであればこのシステムを最新にしておきましょう。

ドキュメント無しでrailsをインストール

gem install railsでいけるんですけど、riだのrdocだの、ドキュメントもインストールすると時間がかかっちゃうので「それはいらないっす」っていうオプションをつけてインストールします。

あと、-Vというオプションをつけると途中経過が見えるみたいです(試しに-V無しでやったら何してんのかぜんぜんみえなかった)。

gem install rails --no-ri --no-rdoc -V

時間かかるなー...。

反映

rbenv rehash

インストールが完了したら、rails -vで確認しましょう。「Rails 4.0.0」と表示されれば、これで万事オッケーです!
これであなたもDHHです!!!ひゃっほーーーーーー。



この記事を書いてわかったこと

ドットインストール最強です。

【初心者向け】RubyとSinatra、アンテナサイトの作り方

(2014/12/29)チュートリアル動画を録画しました。こちらもどうぞ。


RubySinatraでアンテナサイト(WebサイトからRSS取得して表示するサイト)を作るチュートリアル的な記事を書いてみることにします。本記事の対象者は「HTMLはわかるけど動的なサイトは作ったことが無い」くらいの人です。

また、いかんせん素人が書いているものなので認識違いや説明不足が見つかるかと思います。コメントやTwitterブコメなどからご指摘くださると助かります。ちなみに、環境はMac OS Xを想定しています。

ソースコードは(初めて)GitHubに置きました。

» gaaamii/sinatra_rss

目次

1. はじめに

2. とりあえずHello,World

  • 準備
  • 実行

3. ビューを作る

  • layout.erb
  • index.erb

4. main.rbでつくった変数をビューに埋め込む

  • views内のファイルとの結びつけ
  • 変数を埋め込む

5. RSSファイルから記事の情報を取り出す

  • サイトのrssファイルを探す
  • gemを足す
  • RSSParserを使う

6. サイトの情報をビューに埋め込む

  • サイトのタイトルを表示
  • サイトのリンクを付ける

7. ループを回して記事を全て表示する

あとがき

関連

1. はじめに

完成品

完成は、こんな感じです。記事の一覧を表示しているだけですね。
f:id:shgam:20130826040827j:plain

Ruby

Rubyが使える環境を用意してください。Mac OS Xなら標準で使えるはずですが、バージョンが古いとか何かしら問題がある場合はぐぐって解決しておいてください。この記事はRuby 2.0.0を想定していますが、Ruby1.9以降ならたぶん問題はありません。

マシンにインストールされているRubyのバージョンを調べるには、ターミナルで以下のコマンドを打ち込んでください。

ruby -v

Sinatra

Sinatraに「環境構築」と呼ばれるような重々しい作業は必要ありません。やることはたった1つ。

  • sinatraというgemをインストールする

これだけです。

ターミナルから

gem install sinatra

でインストールしてください。rootユーザで無い場合(そういう感じのエラーが出たとき)は

sudo gem install sinatra

と入力し、パスワードを答えてください。

フォルダを作る

Rubyが使えることがわかったら、お好みの場所にフォルダを作りましょう。

mkdir RSSApp

このフォルダ内で作業していきます。

2. とりあえずHello,World

Hello,Worldを出すのはもう、一種の通過儀礼ですよね。やっておきましょう。

準備

先ほど作ったRSSAppフォルダの中に、main.rbというファイルを作ります(app.rbでもhogehoge.rbでも大丈夫です)。

その中で、「自分、Sinatra使いたいっす」ってことを書きます。

require 'sinatra'

これでSinatraを使えるようになったので、実際に使ってみます。requireの行の下にこう書いてください。

get '/' do
  "Hello,World."
end

実行

そして、ターミナルからこれを実行します。

ruby main.rb

f:id:shgam:20130823152410j:plain

これで、http://localhost:4567というURLをブラウザから打ち込んでアクセスできるようになります。見ての通りDOMには最低限のタグしか作られておらず、本当にただのHello,Worldです。

f:id:shgam:20130823152758j:plain

もしも今まで動的なWebサイトを作ったことが全く無い人でしたら、ここでいったん喜びましょう。僕は喜びました。

3. ビューを作る

とりあえずmain.rbを実行できたので、次はビューを作ります。ここではテンプレートエンジンとしてERBを使います。テンプレートを使う際はファイル名に注意しましょう。ファイルの構成はこんな感じです。

main.rb
views
  layout.erb
  index.erb

main.rbは任意のファイル名で大丈夫ですが、viewsというフォルダ名・layout.erbというファイル名は決まっています。違う名前で作ってしまうとテンプレートとして使えなくなるので注意です。

layout.erb

layout.erbには複数ページ作る際に共通する部分を記述しておきます。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>RSSアンテナ</title>
  </head>
  <body>
    <h1>RSSアンテナ</h1>
    <%= yield %>
  </body>
</html>

問題ないと思いますが、この行だけ特別です。

<%= yield %>

「ここに他のerbファイルの中身を埋め込んでね」という意味です。

index.erb

そして、index.erbには最終的にRSSから取ってきた情報をリスト表示するための記述をします。が、まだRSSをいじくっていないので、ここではリストのタグだけ書いておきます。ここに書いたものが先ほどのyieldの部分に埋め込まれることになります。

<ul>
  <li>ここにエントリが表示されるよ</li>
</ul>

4. main.rbでつくった変数をビューに埋め込む

そろそろ動的というか、サーバサイドっぽいことをしてみましょう。最終的にやりたいのはRSSから取った記事の情報をリスト表示したいので、取ってきたものをビューに埋め込む方法を知っておかなければなりません。

views内のファイルとの結びつけ

main.rbでルートパスをgetしたときにindex.erbとつなぐには、こう書きます。

get '/' do
  erb :index
end

これでオッケーです。実行すると、先ほどerbファイルに書いた内容が表示されているはずです。

変数を埋め込む

main.rb内でてきとーな文字列を変数に入れます。

get '/' do
  @hello = "こんにちは!じぇじぇじぇ!"
  erb :index
end

先ほどのindex.erbに埋め込みます。

<ul>
  <li>ここにエントリが表示されるよ</li>
  <li><%= @hello %></li>
</ul>

実行してこうなっていればOKです。

f:id:shgam:20130823174930j:plain

さて、これだけできればもうやりたい放題です。やることは基本的に、
main.rbで生成 -> index.erbで表示
だけだとわかれば、だいたいのことができそうな気がしますね。ここらへんでも小さく喜んでおきましょう。

5. RSSファイルから記事の情報を取り出す

さて、次はmain.rbの方でRSSファイルから記事の情報を取り出す作業をします。難しそうですが、gemのおかげでとっても簡単にできます。

サイトのrssファイルを探す

記事をとってきたいサイトのrssファイルを見つけましょう。

見つけるには、サイトのソースを表示します。各ブラウザの開発ツールでもいいですし、「右クリック→ソースを表示」でも良いです。「command + F」などで、"rss"という文字列を検索します。

f:id:shgam:20130823180840j:plain

すると、rssファイルが置かれたURLが見つかるはずです。例えば、はてなブックマークのトップページであればhttp://b.hatena.ne.jp/hotentry.rssです(http://feeds.feedburner.com/hatena/b/hotentryにリダイレクトされますが、どちらでもオッケーです)。

以下ではこのURLを使います。
http://b.hatena.ne.jp/hotentry.rss

gemを足す

urlをもとにrssファイルを扱うにはrssというgemが必要ですので、これをrequireする行を書き足しておきましょう。

require 'sinatra'
require 'rss'
...

RSSParserを使う

get '/' do
  @rss = RSS::Parser.parse("http://b.hatena.ne.jp/hotentry.rss")
  erb :index
end

細かいことはおいといて、上でやっているのはURLからrssを取ってきたという感じです。すっごい簡単ですね。それを@rssというインスタンス変数に入れてあります。

6. サイトの情報をビューに埋め込む

サイトのタイトルを表示

情報をちゃんと取れたか確認する意味で、まずはサイトのタイトルを表示してみましょう。

<ul>
  <li><%= @rss.channel.title %></li>
</ul>

はてなブックマーク - 人気エントリー」と表示されていればオッケーです。

サイトのリンクを付ける

リンクが無ければアンテナサイトにならないのでリンクを付けます。

<li><a href="<%= @rss.channel.link %>"><%= @rss.channel.title %></a></li>

ここまでで、サイトの情報が取れていること・それを表示できることがわかりました。

7. ループを回して記事を全て表示する

では、この情報から全ての記事を表示します。一つ一つの記事を表示するには、ビュー(index.erb)の方でループを回してあげます。

記事の情報は@rss.itemsに配列の形で入っているので、これらは.eachで取れます。ここでentryに入れているのは、一記事分の情報です。

(2014/6/16 追記)aタグの閉じタグを忘れていたので追記しました。

<ul>
<% @rss.items.each do |entry| %>
  <li><a href="<%= entry.link %>"><%= entry.title %></a></li>
<% end %>
</ul>

できました。これでentryが取れなくなるまでリストにリンクと記事タイトルを埋め込んで表示してくれます。

f:id:shgam:20130826040827j:plain


ここまでの処理を、フィード元を増やしてやればアンテナサイトができますよね。
チュートリアルは以上です。

あとがき

正直、自分で書いててRSS::Parserのやっていることがぜんぜん分かっていないことに気付きました。あと、はてなブックマーク数を取る方法も実はわかっていません名前空間がどうのこうのという問題らしいです。

結局この記事はRubySinatraの解説というより、「とりあえずフィード表示できたやつがとりあえずフィード表示したい奴に向けて書いた記事」になりました。それでも初心者には何かしらの役には立つと思います。補足は随時足していくつもりですが、詳しいこと分かる人はこの記事にがんがんコメントやツッコミくださいお願いします。

関連

たのしいRuby

rssの処理はこちらに書いてありました。「第3版」なのに注意。「第4版」ではrssについて触れられていません。

Sinatra: README(Japanese)

わざわざチュートリアル書いといてアレですけど、Sinatraの使い方は僕ななんかの記事読むよりこちらを読んだ方が良いです。

» Sinatra: README (Japanese)

【Sinatra】動的に追加した文字列からHTMLタグをエスケープする方法

またしても3つのはてブSinatraについてです。

先ほどサイトを確認したところ、なんだか気持ち悪いことになっていました。レイアウトが崩れ、DOM上には切れ目のよくわからないimgタグが...。

f:id:shgam:20130822140418j:plain

原因はとっても簡単で、フィードの取得元のdescriptionにHTMLタグが含まれていたために、それがまんまこちらのDOMに入ってしまったというわけです。

解決策

main.rb(コントローラのファイル)のhelpersに、「エスケープのためのメソッド使いたいっす」ってことを書き、

helpers do
    include Rack::Utils
    alias_method :h, :escape_html
end

index.erb(ビューのファイル)とかで変数を埋めこんでる部分に「エスケープしてね」ってことを書く。

<%= h hoge %>

これで大丈夫。

アホ過ぎやばい

今回のサイトは決め打ちのフィード元から情報引っ張るだけだからぜんぜん考えてなかったけど、これユーザーがフォームに入力するようなサービスだったらスクリプト埋めこんだりできて、やばいですよね。

エスケープの手段も知らずにサイト公開してたなんて我ながらアホだったと思います。

ドットインストールだとこちらで解説されています。
» #17 エスケープ処理を施そう | Sinatra入門 - プログラミングならドットインストール

RubyとSinatraではじめの一歩ということで「3つのはてブ」を作った&公開しています

Webサービス作るの難しすぎるよう...という弱音記事の投稿から早くも3週間ほどが経過しました。

相変わらずスローペースなんですが、ちまちまとRubySinatraをいじりつつ、昨日にはこんなものを公開しました。

3つのはてブ
(現在は公開していません。)
f:id:shgam:20130814024829j:plain

コンセプト

はてブのテクノロジーカテゴリの記事をよく読むんですが、あそこって自分好みのネタが見つかる場所じゃないです。けっこう混沌としていて、ぜんぜんテクノロジーじゃない記事もあります。「”ブログ運営論”ってそれ、テクノロジーなのか」と疑問に思ったりしてます。

そもそも「テクノロジー」という括りは広すぎて、自分好みの情報・ネタと出会うにはちょっと時間がかかります。2ちゃんまとめに飛んでジャンキーなネタを漁って時間を浪費する、なんてことがしょっちゅうあります。

というわけで自分の場合、「Web(制作)の情報欲しいからはてブからHTML・CSS・JSのタグだけ追っかければとりあえずいいのでは」というのが今回のサイトのコンセプトです。

コンテンツは少しずつ増やす

とはいっても現状、こちらで定めたはてブタグの新着を表示するだけのものです。コンテンツが少なくて余白が超絶広いですね。面倒だったのでシンプルさを意識して、サイドバー・フッターはもとより、ナビゲーションすら付けていないです。そういったコンテンツは必要を感じたものから、少しずつ足していこうと思っています。

これから

完成度の高いものをばしっと出した方が盛り上がるのはわかっているんですが、とりあえず公開しないとやる気が出ないので思い切りました。

本当はデータベース絡めてユーザー管理もしてなんやかんやとしっかりしたものを作りたいのですが、何はともあれ1発目のSinatra製サイト公開です。フィードバック求めていいクオリティでもないですが、何かお気づきの点ありましたらコメントやらTwitterやらで教えてください。

初歩的な内容になると思いますが、技術的なことは別エントリで書きます。

SinatraでTwitterログイン機能を実装する

Sinatraアプリを作る時にTwitterでログインする方法が書かれている記事はわりとすぐ見つかった。

そのまんま写経して、ログインはできた!

けどこのTwitterアカウントの情報をデータベースに突っ込めないとユーザー管理ができない。また時間がかかりそうだ。あうあうあー。

【ドットインストール】”#11 掲示板アプリを作ってみよう”でわかってなかったところとActiveRecordのありがたみ

以前、2日前にドットインストールの「Sinatra入門」完了したけど今main.rb見直したらもう意味分からなかったと書きました。あれからちょっと勉強しなおして、もっかい動画観てます。

Sinatra入門"#11 掲示板アプリを作ってみよう"で、前回見たときはimport.sqlが何者かわからなかったんですが、今見たらすぐわかりました。

命令の文をコンソールから直接書かずにファイルに入れてるだけ

これは「データベースに対する命令(sql文)が書かれたファイル」です。で、bbs.dbというデータベースに対してこれを実行するときに

.read import.sql

とすれば、単純にimport.sqlの中身である

create table comments (
    id integer primary key,
    body text
);

が実行されるというわけです。SQLiteを立ち上げた状態でこれを直で書いても実行されるのは同じです。

ActiveRecordとつないじゃおう

んで、こうしてcommentsテーブルを作っただけで、あとはActiveRecordを使ってRubyのコードからデータベースとのやりとりができるみたいです。

昨日、参考書(作りながら学ぶRuby入門 第2版)の中でも似たようなことをしている場面があったのですが、ActiveRecordよりも面倒くさいことをやらされていました。コードからデータベースの中身をいじくるのは同じですが、

@hoge.do("select * from products;")

みたいなかんじで、生のsql文を書いていました(@hogeにはDBIのデータベースハンドラとやらが入っています。データベースをいじくるためのものっぽいです)。

この体験のおかげで、ActiveRecordのありがたみがちょっとだけわかりました。

Product.order("id desc")

と書けば中身を持ってきてidの降順に並べることができるので、ずいぶん便利そうです。

あと余談ですが、勉強したことをブログに書こうとすると意外と中途半端な理解のところが見つかったりして面白いですね(時間はとられますが)。

【Ruby】コードからコメント文だけを抜き出してみる

なんとかWebアプリを作るため、ペアプログラミング的な感じでRubyを教わっています。

作りながら学ぶRuby入門 第2版を進めながら、参考書のサンプルコードのコメント文は実装の手順みたいになっているので、コメント文だけを残して自分で書く。わからなければその都度質問したり、間違っていたらツッコミを入れてもらう、という勉強方法でやっています。というか教えて頂いてます。

で、そのコメント文以外を削除するというのを手動でやっているんですが、これは自動化した方がいいんだろうなと思いました。

(手順のコメントと実装コードが混在してる状態。ペアプロのためにコメント文だけを抜き出したい)
f:id:shgam:20130731020810j:plain

これくらいの処理なら今の自分でも書けるな、ということで書いてみました。

fname = ARGV[0]
 comments = []
 open(fname,"r") do |f|
   i = 0
   while row = f.gets
     line = row.strip
     if line =~ /^#/
       comment = row 
       comments[i] = comment
       print "#{i}: #{comments[i]} \n"
       i += 1
     end
   end
end

これを実行すると出力はこんな感じになります。インデントはあった方が良いので残しました。
f:id:shgam:20130731021415j:plain

ろくにメソッドは知らないしスマートになんて書ける気がしないけど、正規表現・ファイル入出力・式展開など、ちょうど今回勉強したところの復習になったと思う。

これをコンソールに出すだけじゃなくて新たなファイルに書き込むところまでやろうと思ってたけどちょっとよくわからないし眠くなったのでまた明日ということで。

Bundlerってなに?

よく使いそうなのでメモ。

Rubyの便利なライブラリパッケージであるgemですが、それを扱うのにほぼ必須っぽいのがBundlerだそうです。

こちらの記事が参考になりました。
橋本商会 » Ruby書くならBundler使え

開発環境とデプロイ環境で完全に同じバージョンのgemを使えると、無駄なバグが起こらない

【Ruby】文字列を文字に分解して配列につっこむにはsplitメソッドを使うらしい

前期の授業で、「文字列探索のアルゴリズムがどうのこうの」っていうのをやりました。

Rubyで文字列探索アルゴリズムの実装(をやりたい)

授業としてはレポート課題を来週までに出せば良いだけで、コード書けとかいう課題はありません。が、せっかくプログラミングを勉強しているので実際にアルゴリズムを書いてみたいと思い、ちょっと頑張ってます。

できるなら最近勉強を始めたRubyで書きたいです(こういうことを文字列処理がイケイケのRubyでやろうとするのはほんと時間の浪費以外の何者でもないのかもしれないけど)。

配列に入れたい

で、早速困りました。文字列探索をするには一文字ずつ、配列の値として文字を保存しておきたいのに、インプットをgetsメソッドで受け取ると、文字列になってしまう。

ごちゃごちゃ考えてきもい感じの書き方をしたりもしたけど、なんだか上手くいきませんでした。

gets.chars

で文字としてもらえばいける!と思ったけどなぜか配列に入れるときに改行文字まで入れられたりして泣きそうになりました。

split("")でおっけー

いくつかぐぐったところ、文字列はsplit("")で分解できるらしい。それを配列に入れればいいのだから、下のようになる。

# 文字列から
target = gets
# 配列をつくる
targets = target.split("")

これで、要はこういうことになるはず。

target => "hogehoge"
targets => ["h","o","g","e","h","o","g","e"]

【Ruby】セッターとゲッターを自前で書かなくてもアクセサーメソッドで属性にアクセスできる

隣のテーブルの女子大生の会話(イケメンの見定め方について)を聞きながら作りながら学ぶRuby入門 第2版を進めています。

クラスを作って、インスタンスを作る。
そんで、
インスタンス.年齢
みたいな感じでインスタンスの持ってる属性(今回だとnameとage)にアクセスしてそれを変更したり、表示したりしたい。
セッター(変更するためのメソッド)やゲッター(読み込むためのメソッド)を自前で書く方法もあるけど、Rubyではattr_accessorというメソッドが用意されているので、それを使えば簡単にできるらしい。

class Tantei
        def initialize(name,age)
                @name = name
                @age = age
        end
        attr_accessor :name, :age
end

shin = Tantei.new('工藤新一',17)

# 表示
puts "氏名:#{shin.name}, 年齢:#{shin.age}"

# 氏名、年齢の変更
shin.name = '江戸川コナン'
shin.age = 7
puts "氏名と年齢を変更しました。"

# 再度表示
puts "氏名:#{shin.name}, 年齢:#{shin.age}"

(実行結果)
氏名:工藤新一, 年齢:17
氏名と年齢を変更しました。
氏名:江戸川コナン, 年齢:7

江戸川コナンって改めてすごい名前だな。

「作りながら学ぶRuby入門 第2版」を買ってしまった

お金が無いのでできるだけ図書館で借りようとしてるんだけど、久しぶりに技術書を衝動買いしてしまった。

この本ではRailsSinatraも使わずにちゃんとゼロからWebアプリのコードを書いていくので、これを足がかりにサーバーサイドとDBへの入門を果たしたい。

2700円の出費はなかなか大きいので、ちゃんと最後までやり遂げる。
隣のテーブルでカップルが楽しそうにテスト勉強しててすでに心折れそうだけど頑張る。

Rubyでクラスの継承(inheritance)

基本からちまちまとやっていこう。
Codecademyのレッスン中ではRubyのクラス継承がこんなコードで説明されている。

class ApplicationError
  def display_error
    puts "Error! Error!"
  end
end

class SuperBadError < ApplicationError
end

err = SuperBadError.new
err.display_error

勉強もせずにRubyのコードに触れたとき、「まずこの不等号は何なんだ」と感じてたんだけど、このサンプルだととてもわかりやすい。

class SuperBadError < ApplicationError


SuperBadErrorというクラスはApplicationErrorというクラスを継承してますよ、という意味。で、継承していればdisplay_errorというメソッドはSuperBadErrorの定義に書き加えないでいい。

昨日、わけわかんなかったこれは

# なにこれclassの中で何も定義してないじゃん
# なんだこの不等号!
class Comment < ActiveRecord::Base
end

ActiveRecord::Baseを継承したCommentというクラスを定義する」という意味だったことがわかる。

Rubyはググればググるだけ「◯◯というものをつくったのでソースコード置いときます」みたいな記事がヒットするので、早くまともに読めるようになりたい。

2日前にドットインストールの「Sinatra入門」完了したけど今main.rb見直したらもう意味分からなかった

頭悪すぎる死にたい。

# gemを読み込む
# gem == ライブラリって認識で良いのかな?
# requireとincludeの違いがなんかわからん

require 'sinatra'
require 'sinatra/reloader'
require 'active_record'

# ActiveRecordとDBを接続
# ::ってなんなの?
ActiveRecord::Base.establish_connection(
        "adapter" => "sqlite3",
        "database" => "./bbs.db",
)
# helpersって?
helpers do
        # Rack?ほあっ?
        include Rack::Utils
        # alias_method?ああん?
        alias_method :h, :escape_html
end

# なにこれclassの中で何も定義してないじゃん
# なんだこの不等号!
class Comment < ActiveRecord::Base
end

get '/' do
        #.order()って?
        @comments = Comment.order("id desc").all
        erb :index
end

# postって?
post '/new' do
        # .createって? てかこの行なんなの?
        Comment.create({:body => params[:body]})
        redirect '/'
end

post '/delete' do
        # params[:id]って?.
        Comment.find(params[:id]).destroy
end

Rubyで"invalid multibyte char (US-ASCII)"とか出てきた

これまたメモ。

Ruby1.9エンコーディングはデフォルトがASCIIなので、UTF-8にしとかないとエラーが出るみたいです。

これをスクリプトの最初の行に記述しましょう。

# encoding: utf-8

ちなみに、Ruby2.0以降はデフォルトがUTF-8になったのでこの、マジックコメントは要らないらしい。
» Ruby 2.0.0-p0 リリース

RubyのARGV配列が上手くいかないのは勘違いだった

Rubyでは、コマンドラインからデータを受け取る方法としてARGVという配列を使うようです。

ちょっとバカっぽい勘違いをしたのでメモ。

参考書通りにこういうの書いて、
(print_argv.rb)

print "first: ", ARGV[0], "\n"
print "second: ", ARGV[1], "\n"
print "third: ", ARGV[2], "\n"

実行。

ruby print_argv.rb
first: 
second: 
third: 

あれー、入力させてくれない。

で、こういう感じに実行するんだってことに気付く。

ruby print_argv.rb ああ なるほど そういうことか

と、こうなる。

first: ああ
second: なるほど
third: そういうことか

さすがにこれで5分も嵌ってたのは自分だけだと思うけど、IO#getsと同じ雰囲気でやっちゃう、同じような勘違いする人もいなくもないかなと思ったので。