さくらのレンタルサーバにruby1.9

そろそろbotを動かす気になったきた。

ruby 1.9で作っているのでレンタルサーバにいれないといけない。

rubyはもともと入っているのだけれどバージョンが1.8なのです。

で、得意のまるまるコピー。

http://www.chrysolite.jp/2009/03/01/さくらのサーバでruby-on-rails/:title]


$ cd local/src/
$ curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 8813k  100 8813k    0     0  3208k      0  0:00:02  0:00:02 --:--:-- 3646k
$ tar xzf ruby-1.9.1-p0.tar.gz
$ cd ruby-1.9.1-p0
$ ./configure --prefix=$HOME/local
$ make
$ make install
$ cd ~
$ local/bin/ruby -v
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-freebsd7.1]

できた。

あとはgemで入れていたものをいれる。

Twitter4Rのインストール – gonpingyのフレッシュ日記

rest-open-uriのインストール – gonpingyのフレッシュ日記

Ruby/MySQLのインストール – gonpingyのフレッシュ日記


$ ls local/lib/ruby/gems/1.9.1/gems/
json-1.1.9              rest-open-uri-1.0.0     tmtm-ruby-mysql-3.0.2   twitter4r-0.3.1

これでおっけー。

Twitter4Rでmentions APIを使う

twitterのAPIに自分宛のtweetを取得するmentionsというAPIがあります。

Twitter API Wiki / Twitter REST API Method: statuses mentions

ただ、昨日入れたTwitter4RではこのAPIを使うメソッドがないらしい。

Twitter4Rを使ってTwitterのBotを作った – ひらやすのはてな日記

と書いてあり、使う方法も書いてあったので実施。

APIのURI追加するだけです。


$ vim /opt/local/lib/ruby1.9/gems/1.9.1/gems/twitter4r-0.3.1/lib/twitter/client/timeline.rb
1 class Twitter::Client
2   @@TIMELINE_URIS = {
3     :public => '/statuses/public_timeline.json',
4     :friends => '/statuses/friends_timeline.json',
5     :friend => '/statuses/friends_timeline.json',
6     :user => '/statuses/user_timeline.json',
7     :me => '/statuses/user_timeline.json',
8     :replies => '/statuses/replies.json',
9     :mentions => '/statuses/mentions.json',
10   }

9行目が追加。

なぜなかったのだろうか??単純にタイミングの問題かしら。

というかソースを見てみて、果たしてTwitter4Rを使う必要があったのかどうかが疑問。

今考えているものを作るには、一部のAPIを使うだけでよいので普通にopen_uriでよかったかも。。

Twitter4Rのインストール

ガチャピンのfollowだけではあまりにつまらないので

ついに人のfollowを始めた。

まだ、そんなにおもしろくはないけどbot作ってみるつもり。

のでtwitter APIを使うためにインストール。

Twitter4R – Open Source Ruby Project for Twitter REST API [Rubyforge]


$ sudo gem install twitter4r
Password:
Building native extensions.  This could take a while...
Successfully installed json-1.1.9
Successfully installed twitter4r-0.3.1
2 gems installed
Installing ri documentation for json-1.1.9...
Installing ri documentation for twitter4r-0.3.1...
Updating class cache with 37 classes...
Installing RDoc documentation for json-1.1.9...
Installing RDoc documentation for twitter4r-0.3.1...
ls /opt/local/lib/ruby1.9/gems/1.9.1/gems/
json-1.1.9/            tmtm-ruby-mysql-3.0.2/
rest-open-uri-1.0.0/   twitter4r-0.3.1/

jsonも一緒に入った。

gemで入れたのも4つになった。使ってないけど。。

rest-open-uriのインストール

いろんなAPIを使うための前準備でrest-open-uriをいれてみる。

別にrest-open-uriでなくともいいのですがRESTful Webサービス読んで

書いてあったのでちょっと使ってみようと思います。

RubyForge: open-uri for REST clients: Project Info

$ sudo gem install rest-open-uri
Password:
Successfully installed rest-open-uri-1.0.0
1 gem installed
Installing ri documentation for rest-open-uri-1.0.0...
Updating class cache with 27 classes...
Installing RDoc documentation for rest-open-uri-1.0.0...
$ ls /opt/local/lib/ruby1.9/gems/1.9.1/gems/
rest-open-uri-1.0.0

Ruby/MySQLのインストール

RubyからMySQLを使うためのライブラリをいれます。

ライブラリは2種類存在していて

Ruby/MySQL(pure Ruby)

MySQL/Ruby(CのMySQLライブラリのラッパー)

があります。

それぞれ長所、短所があるわけですが

作者の人が

MySQL/Ruby終了のお知らせ

こんなこと言っているのでRuby/MySQLの方をいれようと思います。

まだアルファ版だそうですが入れ方↓

Ruby/MySQL 3.0.2 alpha – しあわせプログラマ


$ sudo gem install tmtm-ruby-mysql --source http://gems.github.com

gemでインストールしたものがあるのは


$ ls /opt/local/lib/ruby1.9/gems/1.9.1/gems/
tmtm-ruby-mysql-3.0.2/

動くか確認する。


$ mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO gonpingy@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
$ mysql -u gonpingy -p
mysql> use test;
Database changed
mysql> create table ruby_test ( id integer, value varchar (32) );
Query OK, 0 rows affected (0.00 sec)
mysql> desc ruby_test;
+-------+-------------+------+-----+---------+-------+
Field Type Null Key Default Extra
+-------+-------------+------+-----+---------+-------+
id int(11) YES NULL
value varchar(32) YES NULL
+-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)

insertはできる。


#! /usr/bin/ruby -Ku
require 'mysql'
mysql = Mysql.connect( 'mysql://gonpingy:password@127.0.0.1:3306/test' )
mysql.query ( "insert into ruby_test values ( 1, 'abc' )" )

が、selectでエラー。。


#! /usr/bin/ruby -Ku
require 'mysql'
mysql = Mysql.connect( 'mysql://gonpingy:password@127.0.0.1:3306/test' )
mysql.query ( "insert into ruby_test values ( 1, 'abc' )" )
mysql.query ( "select id from ruby_test" )

こんなエラーが。。。よくわからない。


/opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql/protocol.rb:294:in `read_eof_packet': packet is not EOF (Mysql::ProtocolError)
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql.rb:233:in `block in simple_query'
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql/protocol.rb:212:in `block in synchronize'
from <internal:prelude>:8:in `synchronize'
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql/protocol.rb:211:in `synchronize'
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql.rb:222:in `simple_query'
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/tmtm-ruby-mysql-3.0.2/lib/mysql.rb:209:in `query'
from mysql.rb:6:in `<main>'

Ruby 1.9インストール

そういえばmacbookに入っているrubyは1.8なので1.9にしてみようということでメモ。

MacPortsでインストールしてみます。

参考にしたのは↓

K2-lab. –

Mac OSXで初めてのRubyを始めてみました – blog.katsuma.tv

ruby19とういうのをインストール。


$ sudo port install ruby19

インストールが終わったらデフォルトで入っている1.8から

1.9をみるようシンボリックリンクを作成。

(MacPortsでのインストール先は/opt/local/bin/)


$ sudo mv /usr/bin/ruby /usr/bin/ruby18
$ sudo ln -s /opt/local/bin/ruby1.9 /usr/bin/ruby
$ ruby -v
ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9]

他にもシンボリックリンク作らないといけないですね。

それと今まで作ってたプログラムが早速動きません。。

追加


$ sudo mv /usr/bin/gem /usr/bin/gem18
$ sudo ln -s /opt/local/bin/gem1.9 /usr/bin/gem

Handling International Encodings

Problem

You need to handle strings that contain nonASCII characters: probably Unicode characters encoded in UTF-8.

UnicodeなどASCIIコード以外の文字を扱う。

Solution

プログラムの最初に組み込み変数$KCODEでエンコードを指定すればよい。


$KCODE = 'u' # utf-8

shebang行に-Kで記述もできる。


#!/usr/bin/ruby -Ku

Getting the Parts of a String You Want

Problem

You want only certain pieces of a string.

文字列の一部分を取得する。

Solution

String#slice もしくは配列の添字で取得したい範囲を指定する。


string = 'Can you hear me now?'
puts string.slice ( 4, 3 ) # => you
puts string[4, 3] # => you
puts string[4..6] # => you

正規表現も使える。


string = 'Can you hear me now?'
puts string.slice ( /y../ ) # => you
puts string[/y../] # => you

memo

文字列の長さより長く範囲をしていすると、指定したポイントから文字列の最後までが取得される。


puts string.slice ( 4, string.length ) # => you hear me now?
puts string[4, string.length] # => you hear me now?

Testing Wheter an Object Is String-Like

Problem

You want to see whether you can treat an object as a string.

文字列としてオブジェクトを扱えるか調べる。

Solution

Object#to_strが定義されているか調べる。


puts 'A String'.respond_to? :to_str
puts 7.respond_to? :to_str

memo

Object#respond_to?はオブジェクトが定義しているpublicメソッドを持っているかどうかの真偽値を返す。

Managing Whitespace

Problem

Your string contains too much whitespace, not enough whitespace, or the wrong kind of whitespace.

文字列に空白が含まれていたり、足りなかったりする場合の対処法。

Solution

空白を取り除く場合String#stripを使う。取り除かれるのは先頭と末尾の空白のみ。

空白を付け足す場合String#centerString#ljustString#rjustを使う。空白を追加というより中寄せ、左寄せ、右寄せになる。


puts "tWe went crazy on ya, turned ya on to the night n ".strip # => We went crazy on ya, turned ya on to the night
puts 'We went crazy on ya, turned ya on to the night'.center ( 50 ) # =>   We went crazy on ya, turned ya on to the night
puts 'We went crazy on ya, turned ya on to the night'.ljust ( 50 ) # => We went crazy on ya, turned ya on to the night
puts 'We went crazy on ya, turned ya on to the night'.rjust ( 50 ) # =>     We went crazy on ya, turned ya on to the night

これだと差がわかりづらい。。

memo

  • String#gsubを使って置換するのが一番わかりやすい。