2009-06-01 Mon

Mechanize で form が取得できない はてぶ

agent = WWW::Mechanize.new
page = agent.get(URL)
puts page.body


という感じで某サイトのページを取得すると,
ちゃんとページの取得ができて,form があることが確認できるんだけど,
page.forms が nil になってしまう.

で,原因がわからないので,
試しに Perl で同様のスクリプトを書いてみたけど,
やっぱり form を取得できなかった.

2009-05-28 Thu

前日の Outputz 結果を Twitter に POST する はてぶ

- "今日" の 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]

2009-05-11 Mon

Sequel で LIKE はてぶ

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\\' \\'')">


2009-05-10 Sun

Sinatra + Passenger はてぶ

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]

2009-05-10 Sun

Phusion Passenger をインストール はてぶ

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.

Referrer (Inside):
[2009-05-10-3] Sinatra + Passenger

2009-05-08 Fri

Sequel を使ってみる はてぶ

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

2009-05-02 Sat

Sinatra いじり はてぶ

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]

Referrer (Inside):
[2009-05-05-1] Sinatra いじり 2
[2009-05-03-1] haml を使ってみる

2009-04-24 Fri

Sinatra を試す はてぶ

以下を参考に 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 を設定しないといけない.
汚ないけど,まあ,とりあえずはこれで.

ゴールデンウィーク中にもう少しいじってみよう.

Referrer (Inside):
[2009-05-02-2] Sinatra いじり

2009-04-10 Fri

smtp で大量にメールを送信する はてぶ

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


2009-03-20 Fri

ASIN入りアマゾン商品画像URLリダイレクトCGIの雛形を Ruby で はてぶ

- [を] 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 で固定)

2009-03-08 Sun

Ruby技術者認定試験 公式ガイド はてぶ

Ruby技術者認定試験 公式ガイド

時間ができれば挑戦してみたい.

2009-02-12 Thu

rchalow - chalow の Ruby 実装 はてぶ

最近,3 年ほど前につくって放置していた chalow の Ruby 実装に興味を持ってくれた人がいたので,plugin 機能をつけて公開してみます.

rchalow-0.0.2.tar.bz2

名前は適当なのが思い付かないので,とりあえず,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 が死んだ時/盜まれた時/トラブった時」
ということで,どこか外部を利用する方向で.

Referrer (Inside):
[2009-11-12-1] ChangeLogメモからHTML生成するツールまとめ
[2009-02-14-1] rchalow を読み直してみた

2009-01-11 Sun

プログラミング言語 Ruby はてぶ

プログラミング言語 Ruby

[2009-01-26]発売.

とりあえず,カートには入れておいた.

2008-12-30 Tue

ナタリーのマイレポートを rss で取得する はてぶ

ナタリーのマイレポート(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... ]

Referrer (Inside):
[2009-01-02-4] ナタリー用に Plagger の EFT を書いてみた

2007-11-24 Sat

Ruby でソケット通信 はてぶ

仕事で(その仕事が自分にまわってくることはないだろうけど).
ソケット通信のプログラムが必要になるらしいので,
ちょっと 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/

2007-11-22 Thu

exerb で作成したバイナリで Windows 共有が見れない はてぶ

仕事で使っている 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/

2007-04-15 Sun

Twitter Mobile Updater はてぶ

http://elpeo.jp/diary/20070413.html#p01

携帯からの更新用に,えろぺおさんの
Twitter Mobile Updater (mobile_twitter.rb) を仕込む.

user, pass, ua を設定して,サーバに置いておくだけ.

update しても,表示に反映されないことがある.

Referrer (Inside):
[2007-04-17-2] twitterMobile をインストールしてみる

2007-03-25 Sun

PRagger を使ってみる はてぶ

http://pragger.ikejisoft.com/wiki

PRagger を知ってから 1 ヵ月以上経って,
やっと使ってみた.

といっても,設定のサンプルとまとめサイトを見ながら,
custom_feed を使ってみただけ.

Plagger よりは導入が簡単なのはいい.

- PRaggerまとめサイト それPra
  http://garyo.sakura.ne.jp/ruby/pragger/index.php?FrontPage

2006-12-18 Mon

Wirble はてぶ

http://pablotron.org/software/wirble/

irb に以下の機能を追加
- tab-completion
- history
- built-in ri
- colorize

2006-10-14 Sat

rubilicious-0.2.0 はてぶ

http://pablotron.org/software/rubilicious/

0.2.0 にアップデートしていたので更新.

- Rubilicious [2006-05-01-18]

ChangeLog 最新ページ / カテゴリ最新ページ / 前ページ 1 2 3 4 5 6 7 / page 2 (7)