2009/12/07

rvmを導入しようとしてなかったことにするまで

rvmを導入しようとしてなかったことにするまでの顛末
自分の知識が足りないため挫折

rvm自体はすんなり入ったあと

$ sudo rvm install 1.9.2-head
<i> Installing Ruby from source to: /usr/local/rvm/ruby-1.9.2-head </i>
<i> Running autoconf </i>
<e> Error running '/usr/bin/autoconf', please check /usr/local/rvm/log/ruby-1.9.2-head/autoconf.error.log </e>
<e> Skipping configure step, 'configure' script does not exist, did autoconf not run successfully? </e>
<i> Compiling ruby-1.9.2-head, this may take a while, depending on your cpu(s)... </i>
<e> Error running 'make ', please check /usr/local/rvm/log/ruby-1.9.2-head/make.error.log </e>

$ view /usr/local/rvm/log/ruby-1.9.2-head/autoconf.error.log

[2009-12-07 00:06:55] /usr/bin/autoconf
configure.in:6: error: Autoconf version 2.60 or higher is required
configure.in:6: the top level
autom4te: /usr/bin/m4 failed with exit status: 63

$ autoconf --version
autoconf (GNU Autoconf) 2.59
Written by David J. MacKenzie and Akim Demaille.

Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cd src/

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.gz

$ tar xzf autoconf-2.65.tar.gz

$ cd autoconf-2.65

$ ./configure --prefix=/opt/autoconf2_65
$ make

$ sudo /usr/sbin/checkinstall --fstrans=no -R

# rpm -ivh /usr/src/redhat/RPMS/i386/autoconf-2.65-1.i386.rpm

# autoconf -V
autoconf (GNU Autoconf) 2.59
Written by David J. MacKenzie and Akim Demaille.

Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# /opt/autoconf2_65/bin/autoconf -V
autoconf (GNU Autoconf) 2.65
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Akim Demaille.

気を取り直して
$ sudo rvm install 1.9.2-head
autoconfが古いって言われる
設定でautoconfの場所指定できないかなと思って探しはじめたのが間違いだった
/usr/bin/autoconf
決め打ちなわけないって所に気づくまでが長い
rvmのそれっぽいところのソース見たら
rvm_autoconf="$(which autoconf)"
って書いてあった
ここを上書くコマンドオプションはなさげ。どこ見てるんだろう。PATHかな?ってようやく把握。

$ which autoconf
/usr/bin/autoconf

$ echo $PATH
/usr/local/rvm/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sane/bin:/opt/python2.6/bin/:/opt/curl/bin/

$ PATH=/opt/autoconf2_65/bin/:$PATH
$ export PATH

$ sudo rvm install 1.9.2-head
<i> Installing Ruby from source to: /usr/local/rvm/ruby-1.9.2-head </i>
<i> Updating ruby from http://svn.ruby-lang.org/repos/ruby/trunk </i>
<i> Running autoconf </i>
<i> Configuring ruby-1.9.2-head, this may take a while depending on your cpu(s)... </i>
<i> Compiling ruby-1.9.2-head, this may take a while, depending on your cpu(s)... </i>
<i> Installing ruby-1.9.2-head </i>
<i> Installation of ruby-1.9.2-head is complete. </i>
<i> Updating rubygems for ruby-1.9.2-head </i>
<i> Installing gems for ruby-1.9.2-head. </i>
<i> Installing rake </i>
<i> Installation of gems for ruby-1.9.2-head is complete. </i>

できたっ!

$ rvm list
   ruby-1.9.2-head  ( ruby -v # => ruby 1.9.2dev (2009-12-06 trunk 26029) [i686-linux]) )
=> system ( ruby -v # => ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux] )

$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

$ rvm 1.9.2-head
cp: cannot create regular file `/usr/local/rvm/ruby-1.9.2-head/.irbrc': 許可がありません
$ sudo rvm 1.9.2-head

$ ruby -v
ruby 1.9.2dev (2009-12-06 trunk 26029) [i686-linux]

おおお

$ rvm system

$ ruby -v
ruby 1.9.2dev (2009-12-06 trunk 26029) [i686-linux]

ありゃりゃ

$ sudo rvm system
$ ruby -v
-bash: /usr/local/bin/ruby: そのようなファイルやディレクトリはありません

しょんあ

$ rvm list
   ruby-1.9.2-head  ( ruby -v # => ruby 1.9.2dev (2009-12-06 trunk 26029) [i686-linux]) )
<i> No system ruby found. </i>

ひょえー

$ sudo rvm use ruby -v 1.8.7
<i> Now using ruby 1.8.7 p174 </i>
$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

$ gem list

*** LOCAL GEMS ***

rake (0.8.7)

ぎゃふん
も、もとのgemは…
まあいっかあ

やっぱよくない
passengerの動かし方とかpgのインストール方法とか手順はちゃんと書いてあるけど めんどいな…
自分だとどこが問題か切り分け出来なくなりそ

rvm: Ruby Version Manager - Troubleshooting
http://rvm.beginrescueend.com/troubleshooting/

rvmはなかったことにしよう
$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

帰ってきたgemたち
$ gem list

*** LOCAL GEMS ***

actionmailer (2.3.5, 2.3.4, 2.3.3, 2.3.2, 2.2.2)

ZenTest (4.0.0)

おしまい

2009/09/23

how to install memcached and to use in php and ruby

memcachedのインストール、設定とphp, rubyからの使い方。
php, ruby間でのmemcache越しのデータやり取り。覚え書き。
rubyはirbから、phpはphp -a からそれぞれ対話型で呼び出し。

インストール
# yum --enablerepo=remi,rpmforge,epel,centosplus install memcached
version 1.4.1 installed from remi

php
# pecl install memcache
version 2.2.5 installed

# yum install php-pecl-memcache
ではだめ。
インストール完了したように見えるがエラーが発生

ruby
$ sudo gem install cached_model

seattle.rb作のrails用(activerecord用)プラグイン
そのうちこれもいるよね、ということでまとめて入れてしまう
同時にmemcache-clientがインストールされる
必要なのはmemcache-client

サービス
# service memcached start
# chkconfig memcached on

php 使い方
$m = new Memcache;
$m->addServer( '127.0.0.1', 11211 );
$m->add( 'foo', 'bar', 0, 3600 );
echo $m->get( 'foo' );
bar

ruby使い方
require 'rubygems'
require 'memcache'
cache = MemCache.new( '127.0.0.1:11211' )

cache['hoge'] = {'piyo' => 'piyopiyo'}
=> {"piyo"=>"piyopiyo"}
p cache['hoge']
{"piyo"=>"piyopiyo"}
=> nil

phpからruby
$m->add( 'foo', 'bar', 0, 3600 );

p cache.get( 'foo', true )
"bar"
=> nil

rubyからphp
cache.set( 'eleven', '11', 0, true )
=> "STORED\r\n"

echo $m->get( 'eleven' );
11

やりとりできるのは文字列型に変換されたものなので注意
というよりはたまたまうまくやり取りしているように見えるだけの気がする
後ろ側はメモリ上のkeyvalueストアなんだから、調べてきちんと渡せば出来そうだけど
用途がなさそう
jsonにしてつっこんで別言語から引っ張り出す方がまだ現実的
それだと言語別のmemcacheにした意味があんまね。

rubyからphp
ache.set( 'eleven', [1,2,3], 0, true )
=> "STORED\r\n"

var_dump( $m->get( 'eleven' ) );
string(3) "123"

phpからruby
$m->set( 'unko', array(0,1,2,5), 0, 3600 );
var_dump( $m->get( 'unko' ) );
array(4) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(5)
}

cache.get( 'unko', true )
"a:4:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:5;}"
=> nil

参考リンク
[memcached] memcache-client導入手順(Rubyクライアント) - Life with IT
http://l-w-i.net/t/memcached/0install_003.txt
ruby,php,perlでmemcacheの中身を使い回す | Parse Error
http://sugizou.jugem.jp/?eid=132
java で memcached に入れたものを ruby で取り出す (その逆も) - Learning to be Me
http://d.hatena.ne.jp/bubbles/20081029/1225291896

2009/09/16

twitter4rでtwitter検索するのに思ったより苦戦 そしてtwitterの仕様

twitter4rでtwitter検索するのに思ったより苦戦したのでメモを残す
twitter4rはruby用のtwitterライブラリ

2009-09-16時点
$ gem list --local | grep twitter
twitter4r (0.3.1)
Twitter API 仕様書はtsupoさん訳のもの。第31版。

twitter検索の大まかな使い方

twitter = Twitter::Client.new
iterator = twitter.search(:q => "四時 OR 4時 OR 4時", :lang => 'ja')
iterator.each do |tweet|
  p tweet.text
end

これで検索対象発言が取り出せる。無指定だと15件。
:lang => jaが日本語限定。「 OR 」でOR検索ができる。
試してないけど「 AND 」でAND検索できるんじゃね。このへんはAPI仕様書参照。

発言者名の取得

「show_user=true の場合」に発言ユーザ名でprefixが入るのはsearch.atomの場合のみ。
search.jsonの場合入らない。 twitter4rはjsonをパースするので、結局発言ユーザ名は入らない。

ググった結果から
tweet.user.screen_name
tweet.user.name
勘で探すけどいない

tweetは :source と :text と :created_ at しか持っていないように見える。 jsonのレスポンスには他にも居るのに!
仕方がないので↓こんな感じでライブラリを書き換えて

*** /usr/local/lib/ruby/gems/1.8/gems/twitter4r-0.3.1/lib/twitter/model.rb
     2009-09-14 00:55:27.000000000 +0900
--- /path/to/model.rb  2009-09-14 00:54:59.000000000 +0900
***************
*** 227,233 ****
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name]
      attr_accessor *@@ATTRIBUTES

      class << self
--- 227,233 ----
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name, :from_user]
      attr_accessor *@@ATTRIBUTES

      class << self
***************
eachのなかでユーザ名を取得した。
tweet.from_user

まず間違いなくもっとbetterな方法があると思うけど、web検索にもでてこないし、用は足りたので一応よかったことにする。
見つけたら加筆修正する。おしまい。

以下参考資料

UT blog: Twitter crawler with ruby 2
http://yyuto.blogspot.com/2009/06/twitter-crawler-with-ruby-2.html
RC3の無職しょ日記:Twitter4Rの歩き方
http://blog.livedoor.jp/r_c_3/archives/50648653.html
rdocは古いので参考意見にしかならない
http://twitter4r.rubyforge.org/rdoc/


2009-10-03 15:00追記

twitter4r 0.3.2以降でsearchでもfrom_user, to_userが取れるようになった
そのため、本エントリの修正は以後不要

2009/09/06

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました。
http://twitter.com/toki_b

cronでまわしてランダムで登録済みの発言をPOSTします。 話しかけられても特に返事はしません。フォロー周りも実装していません。 あらかじめ登録済みの発言をたんたんとPOSTするのみです。

開発・本番環境とコード管理は↓にまとめました。
實松アウトプット: gitとProjectLockerでtwitterbotをリリースするまで

構成はruby1.8.7 + Twitter4r0.3.1 + MySQL5.1.32 + ActiveRecord2.3.3 (+Rake 0.8.3)です。
まずは登録発言をふやさな。

gitとProjectLockerでtwitterbotをリリースするまで

gitとProjectLockerを利用してtwitterbotを管理してリリースしました。bot自体はlinode.comで動かしています。

ProjectLocker説明

ProjectLockerはワンストップのバグトラッキングシステムのホスティングサービスです。いわゆるBTS一式+ソース管理。プロジェクトごとにgitかsubversionのリポジトリを選択して使います。githubではなくこちらを選んだ理由はプライベートのリポジトリが無料で持てるから。tracやwikiはあるらしいけど利用してないので知りません。複数ユーザの管理や権限分けも可能。ただそもそも運営がDQNぽいのであんまり使わない方がいいと思います。

すぐやり方を忘れるので手順。gitはローカルリポジトリとconfig周りを設定済み。project locker, twitterはアカウント取得済み。

プロジェクト名を決める

決めるとやる気が出るので。今回は「時逆(tokisaka)」。

ローカルのディレクトリ構成を決める

$ mkdir $HOME/app/tokisaka
$ cd app/tokisaka
$ mkdir lib
$ mkdir spec
$ touch lib/foo.txt
$ touch spec/bar.txt

ローカルのディレクトリ構成の雛形は以上。gitはデフォルトだと(?)空ディレクトリを無視するのでファイルを作った。

ローカルリポジトリの準備

$ git init
$ git add .
$ git commit -m "initial commit"

ローカルリポジトリの準備ができた。

ProjectLocker側の準備

アカウントをとったあとどこからログインするのかいつも分からないので書いておく。ここからログインする。
ProjectLocker User Portal: Login
https://portal.projectlocker.com/

ログインしたら、左ペインの「Account Links」の中の「Add Project」からプロジェクトを追加する。入力するのはプロジェクト名とプロジェクト概要とgit/svn。
gitを選んでプロジェクトを作成完了。

プロジェクト一覧が出てくる。これは左ペインの「Account Links」の中の「List Project」と同じ。作ったプロジェクトの「Name」をクリックする。ここは直感的に。

「Users in Project」に誰もいなくて、「Account Users not Assigned to this Project」に自分がいるのでメールアドレスの隣の「Add To Project」をクリックする。「Users in Project」に自分が入る。

gitのリポジトリの場所が分からなくなったので後で追記する。左ペインの「User Links」から「User Home」を選択すると、プロジェクトごとのリポジトリURLとアカウントが表示される。tokisakaは「git-foobar@free2.projectlocker.com:tokisaka.git」

公開鍵を登録

「User Links」の中の「Manage Public Keys」に自分の公開鍵を登録する。「id_dsa.pub」の中身。

リモートリポジトリを登録

ローカルに戻る。
$ git remote add origin git-foobar@free2.projectlocker.com:tokisaka.git
$ git push
pushするとエラーが出る

To git-foobar@free2.projectlocker.com:tokisaka.git
! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'git-foobar@free2.projectlocker.com:tokisaka.git'
なので先にpullしてやる

$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
してから
$ git push
するとpushができる。ProjectLocker側でリポジトリを作ったときに「README」ってファイルが自動で生成されるが、それとぶつかるかららしい。
push, pullの時には鍵のパスフレーズを要求されるので入力する。

本番サーバ側(linode.com)からpull

秘密鍵を本番サーバに転送する。ProjectLockerに登録した公開鍵とペアのもの。その鍵を使って認証する。git initとgit pullでファイルを取得。pullするものを選べば反映したいブランチを適応できるんじゃないかな。HEADをガツンと反映するので知らない。

$ git init
$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
パスフレーズを入力するとProjectLockerのリポジトリからpullしてくる。

リリース完了。
http://twitter.com/toki_b

2009/07/27

mitaka.rb#3に参加してきた

mitaka.rb#3に参加してきました。
職場が市ヶ谷なので中央線沿線です>< なかまなかま といったら市ヶ谷は総武線ですとのツッコミされました。

===
2009-07-23 20:00-
@リトルスターレストラン

●Haml/Sass
@hamlはキてる 使おう
@sassはうん、また今度

===
勉強会
Keep
 会場運営ありがとうございます
 「おいしい」で上がったハードルに答えるmitaka.rb素敵
 PGCafeとのカオス具合がすばらしい
Problem
 あとの発表者がどんどん巻きに
Try
 ドラ娘がいるのか

じぶん
Keep
 じぶんからはなしかけることができた
Problem
 じぶんにrubyのネタない
Try
 rubyのネタ作ろう

日本Ruby会議2009に中てられてきた

日本Ruby会議2009に参加してきました。7/17-7/19の三日間長丁場でした。

イベント
Keep
 会場運営ありがとうございました
 クオリティ高い
 IRC同時通訳ありがとう
 1個1個の発表の質が高い
Problem
 温度調節困難なのはわかるので「上着もってこい」アナウンスが必要
Try
 日本語→英語が必要?
 翻訳重視になるのはそれはそれでちがうからなあ難しそ

じぶん
Keep
 三日間とも参加した
 toeic400点だけど海外の人のセッションを積極的に聞いた
 →言語違う環境で伝えることを意図しているので、聞いていればわからないでもない
Problem
 二日目は体調を崩して途中離脱した
 海外の人と話してない
Try
 海外の人とも話をしよう
 講義形式以外のところにもいく

オルグに中てられて当日吐き出したもの→實松アウトプット: オレとrubyと+α (Take the Red Pillの感想)もあわせて。

感想で書きやすいのはMatzの基調講演だったり、LTだったり、RejectKaigiだったりなんだけど、それ以外のひともすばらしかったです。ぱっと分かち合える以外のところもust振り返りしながら拾い上げしたい。

2009/07/20

オレとrubyと+α (Take the Red Pillの感想)

Take the Red Pill - 日本Ruby会議2009のセッションの感想。

感傷的な文章を書く。

ぼくはひよっこPHPプログラマーだ。
レガシーなコード(テストのないコード)に絶望していて、レガシーなコードしか書けない自分にもっと絶望している。
それはともかく、phpを選んでよかったなと思うこともあれば、失敗したかなと思うこともある。

今日はphpを選んでよかったと思った。phpに興味を持たなかったら、スクリプト言語に興味を持たなかったら、RubyKaigiにいなかったことは間違いないからだ。

ぼくが今やるべきことはその場にいて自分が感じたことを伝えること。これなら今の自分にも出来ること。
ぼくがこれからやるべきことは、その時点でぼくに出来ること。
セッションを通じて思ったこと、それは「ぼくとrubyと今のぼくに出来ること」だ。

●「Take the Red Pill」
角谷さんのプレゼンを残念にまとめると、「オレとRubyとRubyKaigi」だった。
今日のRubyKaigiまでくるのにも、課題と宿題に自分なりにチームなりに答えを出してきた、ということがよく伝わるプレゼンだった。
それと同時に、聞いている側にそれぞれの思いが形になっていった。

「何か質問はありますか?」
ここから、主役が聞いていた側に移り変わる。
場の熱に浮かされて、質問者が質問ならぬ自分語りを始めることになる。
テーマは全員「オレとrubyと+α」だ。
今日までの三日間の文脈がある。答えなんてない質問を投げかける。もやもやを吐き出す。思いを形にするというよりはもっと荒々しくぶつけていく。

「そこに月があれば指はRubyでなくてもよいのでは?」というIRCの書き込みの質問に対して角谷さんが「うん、そうだねえ」とやさしく答えたところで、ぼくは感極まって泣きそうになった。
(実際にはそうは言ってないかもしれないが、ぼくの記憶ではそうなっている 動画で見返すと熱量が下がる気がして書き終わるまでは確認しない)
rubyに限らず、何らかのコミュニティに一歩踏み出している状態であれば泣いていたと思う。

セッション終了の拍手は長く続いた。
終わってみれば角谷さんの30分のプレゼンは壮大な前フリであり導火線だった。
このエントリもまた、その熱に浮かされた状態で書いている。

ustreamの動画や、書き起こしや、twitterの#rubykaigiタグで追いましょう。
スタッフの皆さんありがとうございます。
書き起こしやそれに近いエントリをあげてくれる皆さんありがとうございます。
twiiterやIRCで実況してた皆さんありがとうございます。

以上が「ぼくとrubyと今のぼくに出来ること」のすべてです。

最近のトラックバック

information

  • author : sanemat
    表記はsanemat あるいは SANE もしくはsanematsu, sane
    sanemat's portfolio
    (murahashi kenichi)
  • サイト内検索
ブログ powered by TypePad