teppeilog

ちょっとずつエンジンかかってきた

Archive for the ‘ruby’ tag

REXMLの文字エスケープに関するバグ

leave a comment

REXMLを使用してXMLを作成するとき、Elementに子ノードを追加する場合にadd_elementを使用し、同時に属性値も追加していた。しかし何故か&がエスケープされなかった。’はエスケープされるけど。以下コードで調べてみたら、add_elementで属性追加するとエスケープされないけど、add_attributeで追加するとエスケープされることが分かった。

require 'rexml/document'

value = "<>&\'\""

sample = REXML::Element.new("a")

sample.add_element("b", {"attr" => value})

c_tag = sample.add_element("c")
c_tag.add_attribute("attr",value)

xml = ""
formatter = REXML::Formatters::Pretty.new
formatter.compact = true
formatter.write(sample, xml)  

puts xml

実行結果

<a>
  <b attr='<>&&apos;"'/>
  <c attr='&lt;&gt;&amp;&apos;&quot;'/>
</a>

なぜ?

動作環境 Ruby 1.8.7

このエントリーをはてなブックマークに追加
はてなブックマーク - REXMLの文字エスケープに関するバグ
Share on Facebook

Written by teppei

1月 29th, 2012 at 5:57 pm

Posted in プログラミング

Tagged with ,

whenever の使い方

leave a comment

Railsアプリケーションで定期的に何かを実行したいという場合、wheneverを使用するという選択肢があるかと思います。wheneverは要するにLinuxのcronの設定をrubyから行えるというもの。environment.rbの設定も引き継いだrubyスクリプトを実行できるので、DBへのアクセスも簡単。

まずはインストール。

sudo gem install whenever

Railsディレクトリで

wheneverize

を実行すると ./config/schedule.rb が作成される。このファイルにcron設定を書く。

schedule.rbの中には書き方のサンプルがあるので多分大丈夫。たとえば sample.rb ってスクリプトを1時間毎00分に動かしたいときは

every 1.hours, :at => 0 do
  set :output, {:error => 'log/error.log', :standard => 'log/cron.log'}
  runner './sample.rb'
end

runner は ./script/runner のこと。

cron設定を反映するには

whenever --update-crontab

内容を確認するには

crontab -l

logをみて No such file or directory のエラーが出ている場合、runnerに書かれてるrubyのパスが間違っている場合があります。デフォルトが #!/usr/bin/env ruby となっているので、環境に合わせてパスを修正する必要があります。

このエントリーをはてなブックマークに追加
はてなブックマーク - whenever の使い方
Share on Facebook

Written by teppei

1月 12th, 2012 at 3:55 pm

Posted in プログラミング

Tagged with ,

GoogleにClientLoginしてみる

leave a comment

GoogleのAPIを使用するためにClientLogin処理、C2DMを使ってみたいのでRubyで実装してみました。ClientLoginで取得するのは他のサービスを使うために必要なAuthのパラメータなので、それを取り出す。

require 'net/https'
require 'uri'

auth_hash = Hash.new

url = URI.parse("https://www.google.com/accounts/ClientLogin")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5

req = Net::HTTP::Post.new(url.path)

req.set_form_data({
:accountType => 'HOSTED_OR_GOOGLE',
:Email => 'hogehoge@gmail.com',
:Passwd => 'hogehoge',
:service => 'ac2dm',
:source => 'hogetest'
})

https.start do
  res = https.request(req)
  if res.code == "200"
    res.body.split("\n").each do |data|
      key,value = data.split("=")
      auth_hash[key] = value
    end
  end
end

print auth_hash['Auth'] # => 必要なAuth
このエントリーをはてなブックマークに追加
はてなブックマーク - GoogleにClientLoginしてみる
Share on Facebook

Written by teppei

2月 4th, 2011 at 2:30 pm

ziprubyでディレクトリごと圧縮

leave a comment

RubyでZipを作成する方法はざっと調べた限りziprubyとrubyzipあたりが使われているっぽい。とりあえずziprubyをチョイスして、ディレクトリを含めた圧縮を実装。

Read the rest of this entry »

このエントリーをはてなブックマークに追加
はてなブックマーク - ziprubyでディレクトリごと圧縮
Share on Facebook

Written by teppei

1月 20th, 2011 at 3:50 am

Posted in プログラミング

Tagged with ,

RailsでXMLをBuilderすると日本語が文字参照になる対策

leave a comment

RailsでXMLを生成・出力するので Builder::XmlMarkup を使ってみたんだけど、日本語が文字参照になっちゃって使い勝手がよくない。ちょっと調べてみたらStringクラスのto_xsメソッドが原因のよう。そこでto_xsメソッドを例えばenvironment.rbでオーバーライドしちゃう。

class String
  def to_xs
    ERB::Util.html_escape(self)
  end
end

今のところ問題はない。

このエントリーをはてなブックマークに追加
はてなブックマーク - RailsでXMLをBuilderすると日本語が文字参照になる対策
Share on Facebook

Written by teppei

1月 18th, 2011 at 3:43 pm

Posted in プログラミング

Tagged with ,

Ruby開発環境をLeopardからSnow Leopardへ変更したときにはまったこと

leave a comment

いまさらながらLeopardからSnow Leopardへアップグレードしました。最近はRuby..Ruby…な案件が多いのでRuby開発環境必須。

OSのアップグレード自体はクリーンインストールしてTime Machineバックアップからデータを移行することで簡単にできました。楽でした。しかしMacPortsは引き継げないようなので削除して再インストール。あと必要そうなmysql5とかモロモロいれる。

そしてRuby。MacにはRuby1.8.7がすでに入っていて、あとはgemでrailsとかsequelとかいれるだけと思っていたのに問題発生。gemのmysqlが全然動かない。それまでに作ったスクリプトからSequel使ってDBにアクセスしようとするとアウト。何度もインストールしてはアンインストールして・・・を繰り返してアウアウアー。さすがにちょっと分からないと思って、検索したらありがたいことにこのページに原因が。gemのmysqlだけは例外的なインストールをしなくちゃいけないらしい。

sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/opt/local/bin/mysql_config5

上記でgem mysqlいれてSequel使ってみたらいけました。

このエントリーをはてなブックマークに追加
はてなブックマーク - Ruby開発環境をLeopardからSnow Leopardへ変更したときにはまったこと
Share on Facebook

Written by teppei

4月 9th, 2010 at 2:09 pm

Posted in プログラミング

Tagged with ,

SinatraはPUTメソッドによるファイルアップロードは対応していない

leave a comment

タイトル通り。凄くハマりました。

PUTでおくるとqueryにreq.bodyで送ったデータがすべて展開されて突っ込まれます。そしてファイルサイズが大きいデータだと展開しきれず落ちます。

POSTメソッドだとparamsからデータを取得できます。

このエントリーをはてなブックマークに追加
はてなブックマーク - SinatraはPUTメソッドによるファイルアップロードは対応していない
Share on Facebook

Written by teppei

10月 24th, 2009 at 5:20 pm

Posted in プログラミング

Tagged with ,

forkしたプロセスをProcess.kill()するとdefunctが残る

leave a comment

とあるシステムで親プログラムからforkで子プログラムを起動させ、頃合いをみて親プロセスがその子プロセスをkillするという処理を実装した。しかしpsコマンドでプロセスの状態を確認すると、子プロセスで動作させたと思われるプログラムが

defunct ..
defunct ..
defunct ..

と残りまくり。これは何かと訪ねたら調べてたら、どうやら親プロセスでforkして子プロセスを起動すると、親にてProcess.waitを呼ばないとゾンビ(defunct)になってしまうとのこと。

これを回避するには子プロセスに対してProcess.detachを行ってから、Process.killを行う。

例えば

pid = fork do
  何か処理
end

Process.detach(pid)
Process.kill(:INT, pid)

な感じ。

このエントリーをはてなブックマークに追加
はてなブックマーク - forkしたプロセスをProcess.kill()するとdefunctが残る
Share on Facebook

Written by teppei

9月 30th, 2009 at 1:54 am

Posted in プログラミング

Tagged with

日本Ruby会議2009に申し込んでみた

leave a comment

最近サーバサイドばかり、そしてRubyばかり書いているので勢いで申し込んだ。
6000円はたけぇぇぇ。けど自分のためになることにはお金を使おう。

日本Ruby会議2009

それにしても時間がないなぁ。

このエントリーをはてなブックマークに追加
はてなブックマーク - 日本Ruby会議2009に申し込んでみた
Share on Facebook

Written by teppei

6月 2nd, 2009 at 7:51 pm

Posted in 未分類

Tagged with