agent = WWW::Mechanize.new page = agent.get(URL) puts page.body
という感じで某サイトのページを取得すると,
ちゃんとページの取得ができて,form があることが確認できるんだけど,
page.forms が nil になってしまう.
で,原因がわからないので,
試しに Perl で同様のスクリプトを書いてみたけど,
やっぱり form を取得できなかった.
- "今日" の Outputz 結果を Twitter に POST する - A More Beautiful day
http://d.hatena.ne.jp/gtaka555/20090527/p1
がよさげだったので,パクってみました.
日が変わってから実行するように,
元ネタとは違って前日の結果を取得して Twitter に post します.
#!/usr/bin/ruby19 -Ku require 'mechanize' require "date" MAGIC_WORD = '' #outputz のふっかつのじゅもん USER = '' # Twitter のユーザ PASS = '' # Twitter のパスワード def twitter_update(status) Net::HTTP.version_1_2 req = Net::HTTP::Post.new( '/statuses/update.xml' ) req.basic_auth(USER, PASS) q = "status=#{URI.encode(status)}" Net::HTTP.start( 'twitter.com' ) do |http| response = http.request(req, q) end end def get_outputz(date) agent = WWW::Mechanize.new configpage = agent.get('http://outputz.com/config/') form = configpage.forms.first form['magic_word'] = MAGIC_WORD agent.submit(form) d = date.strftime("%Y%m%d") page = agent.get("http://outputz.com/daily/#{d}") doc = Nokogiri::HTML(page.body) byte = doc.xpath("id('contentBox')/div[1]/p").to_s.scan(/[\d,]+/)[0] ranking, ranking_info = doc.xpath("id('contentBox')/p[1]").to_s.scan(/\d+/) return "#{date} の outputz: #{byte}文字.順位 #{ranking} 位(上位 #{ranking_info}%)" end yesterday = Date.today - 1 twitter_update(get_outputz(yesterday))
関連
- outputz.el を使ってみる [2008-11-23-1]
- outputz はじめてみました [2008-11-21-2]
Sequel で LIKE を使いたい場合,
DB[:foo].filter(:bar.like("baz"))
とすればいいんだけど,この like は case sensitive なので,
大文字・小文字を区別したくない場合は,
DB[:foo].filter(:bar.ilike("baz"))
と,ilike を使う.
また,SQL injection 対策は Sequel がやってくれるので,
特に考えなくていいっぽい.
word = "' or 'a' = 'a' '" d = DB[:timeline].filter(:status_text.like("#{word}"))
は以下のような SQL になる
#<Sequel::MySQL::Dataset: "SELECT * FROM `timeline` WHERE (`status_text` LIKE BINARY '\\' or \\'a\\' = \\'a\\' \\'')">
Passenger 経由で Sinatra で作ったアプリケーションにアクセスするには,
アプリケーションのあるディレクトリに
1. config.ru
2. public ディレクトリ
3. tmp ディレクトリ
を用意する.
config.ru の内容は
require 'app' # Sinatra アプリケーション run Sinatra::Application
あとは httpd.conf に
<VirtualHost sinatra.example.com> ServerName sinatra.example.com DocumentRoot /path/to/SinatraApp/public </VirtualHost>
などと書いておけばよい.
- Sinatraで鼻歌まじりのWeb開発
http://www.slideshare.net/dara/sinatraweb?type=powerpoint
- Phusion Passenger をインストール [2009-05-10-2]
Rails アプリケーションを実行するための Apache モジュール Phusion Passenger をインストールしてみました.
インストール
# gem install passenger # passenger-install-apache2-module # Apache モジュールのビルドとインストール
passenger-install-apache2-module で,
以下のような設定情報がでるので,これをもとに httpd.conf を書き換え.
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2 PassengerRuby /usr/bin/ruby
<VirtualHost *:80> ServerName www.yourhost.com DocumentRoot /somewhere/public # <-- be sure to point to 'public'! </VirtualHost>
httpd.conf を書き換えて Apache を再起動しようとしたところ,
以下のエラーがでて起動できない.
*** Passenger ERROR (ext/common/ApplicationPoolServer.h:602): Cannot execute /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/ApplicationPoolServerExecutable: Permission denied (13)
- Re: Passenger 2.0.4 + Rails 2.2.2 + Centos 5.2 (Xen) = Help needed... - dlepage - com.googlegroups.phusion-passenger - MarkMail
http://markmail.org/message/ukx2u5jr54nr4jbx
によると,SElinux が悪いらしいので,
# setenforce 0
すれば OK.
Ruby の O/R マッピングライブラリ Sequel を使ってみる.
まずはデータベースへの接続.
DB = Sequel.sqlite('sequle.sqlite')
テーブルの作成
DB.create_table :items do primary_key :id string :foo string :hoge
dataset の取得.
テーブルへの操作は dataset に対して行なう.
dataset = DB[:items]
insert
dataset.insert(:foo => 'bar', :fuga => 'hoge)
update
dataset.filter(:foo => 'bar').update(:foo => 'baz')
sql を実行
DB.fetch("SELECT * FROM items") do |r| p r end
- Sequel: The Database Toolkit for Ruby
http://sequel.rubyforge.org/
- Ruby Freaks Lounge:第9回 SinatraとSequel・Hamlで掲示板アプリを作る|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/ruby/0009
Sinatra でこんなものを作ってみる.
とりあえず,
- twitter,wassr を指定して post
- twitter と wassr のタイムラインをまとめて表示
- wassr で reply_status_rid を指定したレス
とかできるはず.
あとは,
- haml を使う
- twitter のレス
- 名前をリンクにする
- イイネ や fav
- 携帯と PC で view を変える
とかできれば十分かな.
- Sinatra
http://www.sinatrarb.com/
- Sinatra を試す [2009-04-24-1]
以下を参考に Ruby のフレームワーク『Sinatra』を使ってみました.
- Ruby Freaks Lounge:第7回 小規模Webアプリのためのフレームワーク,Sinatra|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/ruby/0007
ちょっとした CGI を作るのにちょうどいいかもしれない.
再起動しなくても変更が反映されるのも便利だし.
で,Apache を動かしている CentOS には rubygems が入っていないので,
Xen 上の Momonga Linux で試したんだけど,
外部からアクセスするために,以下のような設定を
CentOS 上の Apache に追加.
ProxyPass /foo/bar/ http://momonga.example.com:4567/ ProxyPassReverse /foo/bar/ http://momonga.example.com:4567/
これで,http://www.example.com/foo/bar/ 以下にアクセスすると,
http://momonga.example.com:4567/ で動いている Sinatra に proxy される.
Sinatra 側で proxy されることを意識した URL を設定しないといけない.
汚ないけど,まあ,とりあえずはこれで.
ゴールデンウィーク中にもう少しいじってみよう.
Postfix のパフォーマンス確認のため,
以下のような script で大量に送信をしてみた.
#!/usr/bin/ruby require 'net/smtp' THREADS = 4 NUM = 5000 # 1 thread 当たりの送信件数 CONTENT = "a" * 4 * 1024 MAILSERVER = "postfix.example.com" TO = "[email protected]" threads = [] (1..THREADS).each do |i| threads << Thread.new do puts "start thread: #{1}" (1..NUM).each do |i| Net::SMTP.start(MAILSERVER, 25) { |smtp| smtp.send_mail("test mail #{i} to #{TO}.\n#{CONTENT}", "[email protected]", TO) } end end end threads.each do |i| i.join end
- [を] ASIN入りアマゾン商品画像URLリダイレクトCGIの雛形
http://chalow.net/2009-03-18-1.html
を Ruby で書いてみた(特に書き直す意味もないけど,
Amazon Web Services を使ったことがないので,試しに).
#!/usr/bin/ruby require 'cgi' require 'open-uri' AWS_ID = "key" q = CGI.new asin = q["a"] size = q["s"].empty? ? "s" : q["s"] aurl = "http://webservices.amazon.co.jp/onca/xml?" + "Service=AWSECommerceService&" + "AWSAccessKeyId=#{AWS_ID}&" + "Operation=ItemLookup&ItemId=#{asin}&ResponseGroup=Images" res = open(aurl).read url = "" case size when "s" url = res.scan(/<SmallImage><URL>(.+?)</)[0].to_s when "m" url = res.scan(/<MediumImage><URL>(.+?)</)[0].to_s when "l" url = res.scan(/<LargeImage><URL>(.+?)</)[0].to_s end url = "http://...1x1.jpg(1x1画像のURL)" unless url puts "Location: #{url}\n\n"
(※たつをさんの「雛形」同様、セキュリティとかエラー処理とかはご自分で)
まあ,これはどうでもよくて,Rewrite の方.
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^img/([A-Z0-9]+)-([sml])\.jpg$ /amaimg.cgi?a=$1&s=$2 [L]
RewriteCond でリクエストされたファイルが存在しなければ,
rewrite を行ない cgi に飛ばし,画像をキャッシュする.
なので,chalow の Amazon のイメージ付きリンクの作成 plugin は以下のように,
http://..../img/[ASIN]-[SIZE].jpg を表示するようにすればいいはず
(まだ試してない).
sub amazon_img { my ($asin, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; my $imageprefix = "http://.../img/"; # 画像を cache したディレクトリ my $suffix = "ftnk1221-22/ref=nosim"; # アソシID使用時 $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1<img src="$2">/gi; $str =~ s/$/<br>/gm; $str =~ s/<br>\Z//m; my $image = "<img src=\"$imageprefix/$asin-m.jpg\">"; return qq(<a href="$prefix/$asin/$suffix">$image</a><a href="$prefix/$asin/$suffix">$str</a>); }
(すでに使用している plugin を変更するのは面倒なので,サイズは m で固定)
最近,3 年ほど前につくって放置していた chalow の Ruby 実装に興味を持ってくれた人がいたので,plugin 機能をつけて公開してみます.
名前は適当なのが思い付かないので,とりあえず,Ruby の r をつけて,
rchalow ということで.
chalow との違いは,設定ファイルを
- 設定ファイル
- テンプレート
- プラグイン
に分けたことくらいです.
他は,ほぼ perl のコードを ruby に置き換えていっただけのはずです
(3 年以上放置してたので,よく覚えてない.ChangeLog の操作用ライブラリは作った).
また,
- 自分の環境しか考慮してない
- 実装してない機能が多い
- plugin が少ない
- plugins ディレクトリが pwd 以下にあると仮定している
- コードが汚ない
等,色々と問題があると思いますが,
興味を持った方は試してみてください.
あとは,chalow をいじりたいけど,perl わからねぇと言う人もどうぞ.
Ruby の標準ライブラリしか使ってないのでお手軽です(たぶん).
# そのうち,CodeRepos とか,どこかにアップします(たぶん).
今後さらにいじるとしたら
- コードの整理
- 記法の追加
- h4 や h5 とか
あと
- [を] chalow version 2 へ向けての大改造
http://chalow.net/2008-01-26-1.html
最大の変更ポイントは、これはどうなっているんだろう?
月別ページ、日別ページ、カテゴリ別ページの廃止です。
記事ページとトップページ以外は CGI で動的生成します。
といっても検索 CGI の日付周りのオプションを強化するだけですが。
あとは、まだ着手していませんが検索 CGI も含めた完全 UTF-8 化。
出力は UTF-8 に統一しようかと。
- chalow - CHAngeLog On the Web
http://chalow.org/
- App::Chariot という簡易ブログツールをつくった - TokuLog 改めB日記
http://d.hatena.ne.jp/tokuhirom/20080527/1211892818
- Corno 作成中 - A More Beautiful day
http://d.hatena.ne.jp/gtaka555/20081028/p1
- Ruby 版 chalow 作成中 [2005-11-09-1]
(追記)
http://twitter.com/at_aka/statuses/1200402445
@ftnk あ、どうも。rchalow のリポジトリー公開、楽しみにしています。
手元で公開してもいいかと思ったけど
http://twitter.com/at_aka/status/1200548887
@ftnk 「自分の開発環境が死んだ時」->「自分の開発 PC が死んだ時/盜まれた時/トラブった時」ということで,どこか外部を利用する方向で.
ナタリーのマイレポート(http://natalie.mu/my/report)の feed がないので,
rss を生成する script を書いてみた.
Plagger なら MixiScraper のような感じでやればいいんだろうけど,
よくわかっていないので,Ruby ででっちあげてみた.
流れとしては以下のような感じ.
1. WWW::Mechanize でログインして http://natalie.mu/my/report を取得
2. nokogiri と正規表現で適当に切り出し
3. RSS::Maker で rss を生成
[ Read More... ]
仕事で(その仕事が自分にまわってくることはないだろうけど).
ソケット通信のプログラムが必要になるらしいので,
ちょっと Ruby で書いてみた.
クライアント
#!/usr/bin/ruby require 'socket' s = TCPSocket.open("localhost", 12345) s.puts("test") s.close
localhost の port 12345 で待ち受けているサーバに,
"test" という文字列を送る.
サーバ
#!/usr/bin/ruby require 'socket' require 'thread' gs = TCPServer.open(12345) addr = gs.addr addr.shift printf("server is on %s\n", addr.join(":")) while true Thread.start(gs.accept) do |s| print(s, " is accepted\n") puts(s.gets) print(s, " is gone\n") s.close end end
port 12345 で待ち受け,クライアントから送られた文字列を表示.
なんか簡単すぎて拍子抜け.
- まつもと直伝 プログラミングのオキテ 第16回 ネットワーク・プログラミング(ソケット編)
http://itpro.nikkeibp.co.jp/article/COLUMN/20071031/285990/
仕事で使っている Ruby script を他の人も使えるようにと思い,
exerb でバイナリを作ってみたんだけど,
作成したバイナリでは Windows 共有が見れない.
もちろん,元の script では問題ない.
環境は
- exerb-4.2.0
- Ruby-mswin32-1.8.6-p111
- Windows Vista Ultimate
まあ,exerb が簡単に使えることがわかっただけでも,よしとしておく.
手順の覚え書き
1. レシピファイルの自動生成
必要なライブラリ・モジュール情報等を記載したレシピファイルの生成.
$ ruby -r exerb/mkexy foo.rb
これで,レシピファイル foo.exy が生成される.
2. 実行ファイルの生成
$ exerb foo.exy
これで,バイナリ foo.exe が生成される.
- Exerb Project
http://exerb.sourceforge.jp/
- Ruby-mswin32 (ja)
http://www.garbagecollect.jp/ruby/mswin32/ja/
http://elpeo.jp/diary/20070413.html#p01
携帯からの更新用に,えろぺおさんの
Twitter Mobile Updater (mobile_twitter.rb) を仕込む.
user, pass, ua を設定して,サーバに置いておくだけ.
update しても,表示に反映されないことがある.
http://pragger.ikejisoft.com/wiki
PRagger を知ってから 1 ヵ月以上経って,
やっと使ってみた.
といっても,設定のサンプルとまとめサイトを見ながら,
custom_feed を使ってみただけ.
Plagger よりは導入が簡単なのはいい.
- PRaggerまとめサイト それPra
http://garyo.sakura.ne.jp/ruby/pragger/index.php?FrontPage
http://pablotron.org/software/wirble/
irb に以下の機能を追加
- tab-completion
- history
- built-in ri
- colorize