<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bluegold &#187; ruby</title>
	<atom:link href="http://blog.bluegold.me/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bluegold.me</link>
	<description>OpenSolaris と MacBook で自宅ネットワークを構築するメモ</description>
	<lastBuildDate>Sat, 06 Aug 2011 16:10:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Rails 2.3 のタイムゾーン</title>
		<link>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/</link>
		<comments>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 11:08:34 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=278</guid>
		<description><![CDATA[Rails 2.3 にて ActiveRecord のフィールドの参照のしかたによって、タイムゾーンが変わってしまう問題。]]></description>
			<content:encoded><![CDATA[<p>2006年頃に Rails 1.2 で作成したアプリケーションを Rails 2.3 にアップグレードしています。</p>
<p>プログラムの移行自体は1週間ほどで完了したのですが、テストをしていてタイムゾーン関連の問題に遭遇しました。</p>
<p>データベースに有効期限を表すフィールドがあるのですが、1時間前から1時間後まで有効なレコードを作成して、現在が有効期間内かどうかを調べるテストが失敗したので問題に気がつきました。
</p>
<p>Rails 2.x ではタイムゾーンが導入されたのは知っていたので、下のように設定を行っていました。</p>
<pre class="brush: ruby;">
config.time_zone = 'Tokyo'
config.active_record.default_timezone = 'Tokyo'
</pre>
<p>しかし、ログを見ていると JST と UTC とタイムゾーンが混ざっているようだったので、単純なアプリを作成して調べてみました。すると、以下のような結果に</p>
<pre class="brush: ruby;">
c = Sample.find(:first)
&gt;&gt; c[:created_at]
=&gt; Mon, 24 Aug 2009 17:09:49 +0000
&gt;&gt; c.created_at
=&gt; Tue, 25 Aug 2009 02:09:49 JST +09:00
&gt;&gt; c[:created_at].class
=&gt; DateTime
&gt;&gt; c.created_at.class
=&gt; ActiveSupport::TimeWithZone
</pre>
<p>同じフィールドでも [] メソッドでデータを取得するのと、フィールド名を指定して取得するので、クラスもタイムゾーンも異なるんですね。ちょっとビックリしました。
</p>
<p>どこかにタイムゾーンを意識しないコードがあって、この２つを混同してしまってるんだろうな。<br />
調べるのはメンドクサイな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 1.2.6 と gem 1.3.0 を一緒に使う</title>
		<link>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/</link>
		<comments>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 16:18:53 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=132</guid>
		<description><![CDATA[Rails 1.2.6 と rubygems 1.3.0 を一緒に使った時に表示される deprecated メッセージが表示されないようにするには]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://merbivore.com/" title="Merb">Merb</a>が最近はやっているようなので、インストールして使ってみようと思いました。Merb には Rubygems 1.3.0 以上が必要なのでアップデートしたところ、仕事で開発している Rails 1.2.6 で作られたアプリケーションに gem の deprecated メッセージが出てくるようになってしまいました。
</p>
<p>たとえば script/console を実行すると以下のようなメッセージが出てきます。</p>
<pre class="brush: ruby;">
$ script/console
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/boot.rb:20 is outdated
Loading development environment.
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/../config/boot.rb:20 is outdated
&gt;&gt;
</pre>
<p><span id="more-132"></span>
<p>このアプリは Rails を使っているのでとうぜんWeb用のアプリなのですが、管理用に独自のコマンドラインシェルを用意しています。こちらのコマンドの実行時にも同様のメッセージが出てきてしまっています。「Rails 2.2 系に上げるいい時期かな」とも思わないでもないのですが、製品として提供している物なので、今期末にいくつか控えている納品を終えるまではバージョンを上げるわけにもいきません。
</p>
<p>仕方がないのでクイックハック<br />
script/console の最初で stderr を /dev/null に捨てるようにしました。</p>
<pre class="brush: ruby;">
#!/usr/bin/env ruby
$stderr.reopen('/dev/null')
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/console'
</pre>
<p>deprecated なメッセージを簡単に抑制する設定とかもあるんだろうか。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>last.fm のプレイリストをブログに表示するには</title>
		<link>http://blog.bluegold.me/2008/12/lastfm-playlist/</link>
		<comments>http://blog.bluegold.me/2008/12/lastfm-playlist/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:53:57 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=117</guid>
		<description><![CDATA[last.fm のプレイリストをブログに表示するために書いた Ruby プログラムの説明]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/2008/12/last-fm-audioscrobbler-logo.jpg" width="150" height="128" alt="last.fm" class="title_img" /></p>
<p>
<a href="http://higash.net" title="HiGash.Net">HiGash.Net</a>の中の人にWordPressのキレイなテーマを作ってもらったので、<a href="http://last.fm" title="last.fm">last.fm</a>の「最近聴いたトラック」を表示するプログラムを作りました。
</p>
<p>
last.fm の<a href="http://www.lastfm.jp/widgets/chart" title="last.fm">公式のウィジェット</a>を使用すれば簡単にブログに貼付ける事ができますが、公式の物はFlashを使っていて自分でデザインを変更できないので、自分で作ってみました。last.fmは<a href="http://www.audioscrobbler.net/">audioscrobbler</a>というAPIを用意しているので、このAPI経由で情報を取得します。今回は Ruby の <a href="http://scrobbler.rubyforge.org/">scrobbler gem</a>を利用しています。
</p>
<p><span id="more-117"></span>
<p>
scrobbler gem のインストールは以下のように簡単です。</p>
<pre class="brush: ruby;">
$ sudo gem install scrobbler
</pre>
</p>
<p>
<a href="http://scrobbler.rubyforge.org/docs/">scrobblerのドキュメント</a>を見ながら、プログラムを書いていきます。<br />
手順はだいたい次のようになります。</p>
<ol>
<li>last.fmのユーザの「最近聴いたトラック」の一覧を取得する</li>
<li>トラックのアルバムアートワークを取得する</li>
</ol>
<h2>last.fmのユーザの「最近聴いたトラック」の一覧を取得する</h2>
<p>
scrobblerライブラリを使うと簡単で、last.fmのユーザ名を指定して<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/User.html">Scrobbler::User</a>のオブジェクトを作成するだけです。</p>
<pre class="brush: ruby;">
user = Scrobbler::User.new('bluegold')
recent_tracks = user.recent_tracks
</pre>
<p>Scrobbler::User#recent_tracks の戻り値は<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/Track.html">Scrobbler::Track</a>のArrayになっています。Scrobbler::Track は再生した曲の情報を表すオブジェクトで、曲のアルバム名やアーチスト名、last.fmのURLなどの情報を保持しています。last.fmの URLは、たとえば Sheryl Crow の Real Goneの場合は<a href="http://www.lastfm.jp/music/Sheryl+Crow/_/Real+Gone">このページ</a>の事です。
</p>
<p>最近再生したトラックを表示するだけなら、ここまでで終わりです。</p>
<h2>トラックのアルバムアートワークを取得する</h2>
<p>
Scrobbler::Track のオブジェクトにもimageやthumbnailなどのattributeは存在するのですが、これらは&#8217;only seems to be used on top tracks for tag&#8217;とのことでScrobbler::User#recent_tracksでは値が設定されていません。そこでトラックのアーチスト名とアルバム名から<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/Album.html">Scrobbler::Album</a>のオブジェクトを作成して、そこからアルバムアートワークを取得します。Scrobbler#Trackのオブジェクトから得られるアルバム名は（アーチスト名も？）エスケープされていて、そのままでは正しくデータを取得出来ない場合があったので、CGI#unescapeHTML を利用して元に戻しています。</p>
<pre class="brush: ruby;">
track = recent_tracks.first
album = Scrobbler::Album.new(
  track.artist,
  CGI.unescapeHTML(track.albumname)
)
image_url = album.image(:small)
</pre>
<p>上のコードで1曲分のアートワーク画像へのURLが得られるので、表示したい曲数分繰り返します。
</p>
<p>あとは好きなようにHTMLを書いてスタイルを設定するだけです。完成した結果はこのブログのフッターに表示されている通りです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/lastfm-playlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressのバックアップを Gmail に保存する その3</title>
		<link>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/</link>
		<comments>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 16:28:18 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=45</guid>
		<description><![CDATA[WordPressのバックアップを GMail に保存する方法。添付ファイルつきのメールを送信する Ruby のスクリプト。]]></description>
			<content:encoded><![CDATA[<p>前回、暗号化を行った事によりバックアップの保存の目的はほぼ果たしているのですが、気持ちが悪いので添付ファイルについても考えてみました。</p>
<p>gmail と uuencode をキーワードに Google で検索した所、mutt を使うのが一般的らしい。<br />
↓のように &#8216;-a&#8217; キーワードで添付するファイルを指定するだけで添付ファイルとして扱ってくれます。</p>
<pre class="brush: bash;">
mutt -a name.afz -a mysql_name.afz -s &quot;name backup `date`&quot; to_address
</pre>
<p>
複数の添付ファイルにも対応しているので、この方法で問題ないかとも思ったのですが、１つだけ問題がありました。mutt では Envelope From を引数で変更することが出来ず、muttrc/.muttrc に別途設定する必要があります。</p>
<p>なんかめんどくさそうな感じがしたので、結局は Ruby でフィルタプログラムを書くことにしました。</p>
<p><span id="more-45"></span>
<p>以下のような物になりました。</p>
<pre class="brush: ruby;">
#!/usr/bin/env ruby
#
# sendmail.rb&lt;/p&gt;

require 'rubygems'
require 'tmail'
require 'net/smtp'
require 'nkf'
require 'etc'
require 'socket'
require 'optparse'

def usage( status, msg = nil )
  output = (status == 0 ? $stdout : $stderr)
  output.puts msg if msg
  output.print(&amp;lt;&amp;lt;EOS)
Usage: cat msg | #{File.basename $0} [-j|--ja] [-s &lt;subject&gt;] [-f &lt;from&gt;] &lt;to&gt;

  -s,--subject=sbj   subject of the message. (default=(none))
  -f,--from=from     from address.
  -a,--attachment=file attachment
  -j,--ja            handle japanese message. (default=off)

EOS
  exit status
end

def main(args)
  subject = nil
  from = guess_from_address()
  to = []
  attachments = []
  ja_locale = false

  OptionParser.new do |opt|
    opt.banner = &quot;Usage: #{$0} [options]&quot;

    opt.on('-s', '--subject=subj', 'subject of the message. (default=(none))') do |arg|
      subject = arg
    end
    opt.on('-f', '--from=from', 'from address.') do | arg|
      from = arg
    end
    opt.on('-j', '--ja', 'handle japanese message. (default=off)') do
      ja_locale = true
    end
    opt.on('-a', '--attachment=file', 'attachment') do |arg|
      attachments &amp;lt;&amp;lt; arg
    end

    to = opt.parse!(args)
  end

  usage(1) if to.empty?

  setup_mail(from, to, subject, $stdin.read, ja_locale, attachments)
end

def setup_mail( from, to, subject, body, ja_locale, attachments )
  mail = TMail::Mail.new
  mail.date = Time.now
  mail.from = from
  mail.to = to
  mail.subject = subject if subject
  mail.mime_version = '1.0'

  # 本文の処理
  if attachments.empty?
    message = mail
  else
    message = TMail::Mail.new
    message.transfer_encoding = '7bit'
  end
  if ja_locale
    message.body = &lt;span class=&quot;caps&quot;&gt;NKF.&lt;/span&gt;nkf('-j', body)
    message.set_content_type 'text', 'plain', 'charset' =&amp;gt; 'iso-2022-jp'
  else
    message.body = body
    message.set_content_type 'text', 'plain'
  end

  # 添付ファイルの処理
  unless attachments.empty?
    mail.parts.push(message)

    attachments.each do |filepath|
      body = nil
      File.open(filepath) { |f| body = f.read } rescue nil
      next if body.nil?

      attachment = TMail::Mail.new
      filename = File.basename(filepath)

      encoded_body = [body].pack('m').chomp.gsub(/.{76}/, &quot;\\1\n&quot;)
      attachment = TMail::Mail.new
      attachment.body = encoded_body
      attachment.transfer_encoding = 'base64'
      attachment.set_content_type('application', 'octet-stream', 'name' =&amp;gt; filename)
      attachment.set_content_disposition('attachment',
                 'filename' =&amp;gt; filename)

      mail.parts.push(attachment)
    end

    mail.write_back
  end

  puts mail.encoded

  mail
end

def guess_from_address
  user = getlogin()
  unless user
    $stderr.puts 'cannot get user account; abort.'
    exit 1
  end
  if domain = (Socket.gethostname || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['HOSTNAME'] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['HOST'])
    user + '@' + domain
  else
    user
  end
end

def getlogint
  begin
    require 'etc'
    Etc.getlogin
  rescue LoadError
    &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['LOGNAME'] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['USER']
  end
end

main(ARGV)
</pre>
</p>
<p>TMail のサンプルの sendmail.rb をほぼそのまま使っています。<br />
引数　&#8217;-a&#8217; で添付ファイルを指定出来るように変更しました。（getopts が deprecated になっていたので optparse で書き直しています。）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

