Subcribe via RSS

Rubyプログラムの高速化

2009/1/19 | Posted in ruby

Hard Core Ruby
Image by rbieber via Flickr
Rubyは便利だけど遅い.

実行が遅い分,プログラムを書くコストは下がるので,それはトレードオフだが,それでもRubyのプログラムをできるだけ速く動かしたい時はそのプログラムの性能を評価する必要があります.




参考にしたのは,
まつもと直伝 プログラミングのオキテ 第13回 プログラムを高速化する

まつもと直伝 プログラミングのオキテ 第18回 プログラムを高速化する(その2)

詳しいことは上記のページを見れば丁寧に説明してあります.

基本的には
$ time ruby hoge.rb
でかかる時間が測定できる.値が結構変わるので,何回かやっていい値で評価するのがいい.
で、どの辺で時間を食ってるのか、ボトルネックを知るためには
$ time ruby -rprofile hoge.rb
で,見れます.

でもこれよりも,
$ ruby-prof hoge.rb
のほうが測定が早くできてよいみたい.

ubuntuであれば
$ sudo apt-get install ruby-prof
でインストールできます.

詳しいことは上記のサイトを見てもらうのがよいので省略.

Reblog this post [with Zemanta]




Tags: , ,

twitterのダイレクトメッセージを受信するプログラムをrubyで

2009/1/15 | Posted in ruby, twitter

この記事は古いので、プログラムが使えない可能性が高いです。
今ならrubygemのtwitterライブラリを使うのがよいと思います。Oauthも必要です。



こないだ,twitterにくだらないギャグをpostするプログラムを書いたので,今度は他の人からの投稿を受け付けて,ギャグリストに追加するプログラムを書きました.



これで誰でも思いついたくだらないギャグをsubetterに言わせることができます.

進化したsubetter

ついでに,ギャグをテキストファイルに保存するのはなんかかっこ悪いので,MySQLにも入れることにしました.いずれMySQLに完全に移行したいですが,まだ両方やってます.

まだいくつか問題があって,MySQLにそのままじゃ入れられない文字の処理とか,全然よく分かってないのでその辺から修正しなきゃと思っています.

プログラムはこんな感じ.

require('rubygems')
gem('twitter4r','0.3.0')
require('twitter')
require "mysql"

flag = 0
msg = nil

my = Mysql::new("localhost", "user", "passwd", "db_name")

client =Twitter::Client.new(:login => 'subetter',:password => 'passwd')

client.messages(:received).each do |msg|
#メッセージのテキストを取得,改行文字を省く
joke = msg.text
joke = joke.strip

#メッセージの送り主を取得
user_name = msg.sender.screen_name

que = "SELECT * FROM jokes WHERE joke='" + joke + "'"
res = my.query(que)
res.each do |row|
flag = 1
end
#p flag

if flag == 0
sql = "INSERT INTO jokes VALUES ('','" + user_name + "','" + joke + "')"
#mysqlにギャグを登録
my.query(sql)
#テキストファイルにもギャグを登録
file = open("/home/jun/Dropbox/cyg/work/ruby/twitter/jokes.txt", 'a')
file.puts joke
file.close
else
flag = 0
end
end

exit




Tags: ,

Ubuntu8.10でRuby on Railsとmysqlとtwitter4rの環境を整える

2009/1/13 | Posted in ruby, twitter, ubuntu

なかなか苦労しました.

一番参考になったのは,

Ubuntu 8.04.1 に Ruby on Rails 2.1.0 を入れる – neconnect.net

です.

やること

$ sudo apt-get install ruby rdoc irb ruby1.8-dev rubygems libopenssl-ruby
$ sudo gem update --system
$ sudo apt-get remove rubygems
$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
$ sudo gem install rails
で,Ruby on railsの環境ができます.古いgemを入れてからアップデートして,古いgemを削除して新しいgemへのリンクを作るようです.

自分はMysqlを使いたいので,
$ sudo apt-get install mysql-server libmysql-ruby1.8 libmysqlclient15
$ sudo gem install mysql
をやって,起動時には
rails -d  mysql
をやるとデータベースをmysqlにしてrailsを実行できます.

これを毎回やるのは忘れそうなので,~/.zshrc(bashなら~/.bashrc)に
alias rails="rails -d mysql"
を追加しました.

で,twitter4rを使うには,
$ sudo gem install json
$ sudo gem install twitter4r
たしかこんな感じでいけると思います.

2010/07/09 追記
今rubyでtwitterアプリを作るなら、gemのtwitter4rではなくtwitterというのがいいです。

$sudo gem install twitter
でいけます.




Tags: , ,

15時にtwitterにギャグを投げるプログラムをRubyで

2009/1/9 | Posted in ruby, twitter, ubuntu

Image representing Twitter as depicted in Crun...
Image via CrunchBase
— 2010/07/09 追記—

以前かいたプログラムを修正したので、それを乗せておきます。
古いプログラムで使っていたライブラリがいまいちなので、少し違います。


あと、今後のことを考えるとOauth認証にしないとです。


require('time')
require 'rubygems'
require 'twitter'

#twitter conf
username = 'username'
password = 'password'

httpauth = Twitter::HTTPAuth.new(username, password)
client = Twitter::Base.new(httpauth)

lines = 0

msg = nil

open("/user/tjun/work/twitter/subetter/jokes.txt"){|file|
 while tmp = file.gets
 lines += 1
 end
}

open("/user/tjun/work/twitter/subetter/jokes.txt"){|file|
  msg = file.readlines[rand(lines)].chomp
  #print msg
}

client.update(msg)

—–ここまで追記—–

Rubyの勉強をちょっと昨日から始めたので,練習にtwitterにギャグをPostするプログラムを書いてみました.

subetter

1日1回ということでそんなにうざくないので,せっかくだからフォローしてやってください.



これを作るためにやることは
  • 1行に1つギャグを書いたテキストファイルを作る
  • テキストファイルをランダムで1行読む
  • それをtwitterにポストする
  • それをcronで1日1度実行する
っていう簡単なお仕事.

まず,ギャグを書いたテキストを作ります.
これは,いい方法が思いつかなかったのでとりあえずネットで適当に集めてきて自分でテキストファイルを作りました.まだギャグが30くらいしかない.さびしい.

で,それをランダムで1行読むっていうのは簡単だけど,twitterにpostするにはどうすればいいのかなって思って調べてみると,

twitterでbotを作りたい.(2) – reverleveeの日記
という,ほとんど同じことをやっている方を見つけたので,それを参考にさせてもらった.というか,最初からこれを拝借すれば早かったな.

ということで,自分の汚いコードは捨てて,その人のプログラムをコピペしたプログラムがこちら.
subetter.rb

require('time')
require('rubygems')
gem('twitter4r','0.3.0')
require('twitter')

lines = 0

msg = nil

open("jokes.txt"){|file|
while tmp = file.gets
lines += 1
end
}

open("home/user/....../jokes.txt"){|file|
#ファイルのパスは絶対パスで書かないとcronで読み込むときに失敗します
msg = file.readlines[rand(lines)]
# print msg
}

client =Twitter::Client.new(:login => 'subetter',:password => 'password')
client.status(:post, msg)
exit


jokes.txtにギャグを書きこみます.

文字化けは文字コードが原因なので,UTF-8で統一するように.

で、定期的にポストするには,Linuxの場合
crontab -e
でcronを設定することができます.
# m h dom mon dow command
00 15 * * * ruby /home/user/......../ruby/subetter.rb
これで毎日15時にギャグをつぶやきます.

次は,他の人がギャグを登録できるようにすることと,つっこみ側も作って2つで漫才を行うことを考えている.
Reblog this post [with Zemanta]




Tags: ,

Thinkpad X31にUbuntu8.10インストールメモ

2009/1/7 | Posted in linux, tips, ubuntu

新たにLinuxマシンを使う必要があったので,古いthinkpadにUbuntu8.10を入れて使うことにした.

つまづいたところがいくつか。

Ubuntuのisoイメージを焼いたDVD(またはCD)ブートの際認識されない

→これはたいていディスクにちゃんとイメージとして焼けてないことが原因です.
isoを焼けるソフトを探してきて焼きましょう.
ちなみに自分はDVDDecrypterというソフトを使ってDVD-Rに焼きました.

で、インストール.
BIOSとかインストールの際のパーティションなどは初心者にはちょっと難しいですが,他のサイトを参考に注意深くやってください.


インストール後につまづいたこと


ネットワークにつながらない

ケーブル挿したらネットワークにつなごうとはするんだけど、なぜか繋がらない。
これは他に原因があるっぽいのであきらめて、無線LANでつなぐことを考える。

無線LANのランプがついていないので、ドライバがないのかな、と考える.

googleでちょっと検索して、

Thinkpad R30 に ubuntu 8.10 ja をインストール まずは無線LAN

を参考にして、インストールのときに使ったLiveDVDを入れます.

メニューバー?の「システム」→「システム管理」→「Synaptic パッケージマネージャ」を開いて
「設定」→「リポジトリ」のに下の方の「CD-ROM/DVDからインストール」の「Ubuntu8.10 ‘Intrepid Ibex’のCD-ROM」チェックを入れ、OKを押してから、一度Synpaticパッケージマネージャを終了させます。

そして、再びSynpaticパッケージマネージャを起動し,「未インストール」の中から
「linux-backports-modules-intrepid-generic」をダブルクリックとかして、選択します.

同時に?も入れてください っていうのもOKして、「適用」を押すと、インストールが始まります.

それが終わったらPCを再起動してください。
きっとこれで無線LANが使えるようになります。



無線がWPAだとパスワードが通らない
→なぜか入力したパスワードがバグっちゃうみたい。
とりあえず別の無線LAN(WEP)で妥協した。
→結局,メニューバー?のネットワークのアイコン右クリックして「接続の編集」から対象となるネットワークを選んで「無線セキュリティ」からパスワード入力したら接続できた。
謎。
Fonの場合は,ちょっと違うらしい.

音量の調節ができない
→未解決。スクロールするたびに変な音がなるのは消した。
「システム設定」→「サウンド」から。

トラックポイントとセンターボタンによるスクロールができない
Ubuntu Intrepid (8.10)でThinkPadのトラックポイントを有効にするを参考に,
/etc/hal/fdi/policy/mouse-wheel.fdi
を作成する.
昔と設定方法が変わったので要注意。

で、PC再起動したらスクロールできるようになります。

とりあえず以上です.




Tags:
  • 書いてる人:

    Junichiro Takagi
    高木潤一郎

    http://tjun.jp
    mail@tjun.jp

    未踏でクリエータやってました。メーカーでエンジニアやってます。
    このブログは、会社とは関係なく個人の意見を書いています。

    RSS:


  • friendfeed: