カテゴリー「Ruby」の13件の投稿

2009年10月10日 (土)

デザインパターン

連休初日。

内職デイ。

今さらながらデザインパターンの重要性を再認識。

JavaとかC#とかで大きめの開発をやるときは、まずい設計だとソッコーで破綻するので、ときにはデザインパターンも参考にして「誰が実装しても同じようなコードになる」よーなアプローチを取り、品質が一定になるよう、スキルの差が生産性の差にならないよう、全体最適されるように開発を進めるんですけれども。

Rubyのよーに柔軟性の高い言語だと、言語側である程度問題を吸収してくれるというか、お任せできちゃうというか、わざわざデザインパターンを適用しなくても直感的なコードが書けちゃったりする。
ので、あんまりきっちりした設計はせずに、コードを書きながら設計を進めたりするんですけど。その分コードは何度も書き直すけど(でも生産性が高いので案外平気だったりする)。

んですけれども。
それでも、コードが増えてくると今ひとつエレガントじゃないコードになったり、拡張性が低かったり、自分しか分からなかったり、コードを読むための前提知識が必要だったりするよーな状況に陥ることが分かった。Rubyと言えども。

というわけで再読。

オブジェクト指向における再利用のためのデザインパターン/ソフトバンククリエイティブ

レシピになっているので、必要なところだけ読めばいいのは助かる。もう10年も前の書籍なのか。

| | コメント (0) | トラックバック (1)

2009年7月26日 (日)

Twitterで自分のつぶやきを取得する

Twitterを使っていると、日々つぶやきがトラッキングされるので、これを有効利用したくなってくる。
例えば、日報を作成したり、以前つぶやいたアイデアを見直したり。

ところが、Twitterでは過去の「自分の」つぶやきを検索することは基本的にはできない。1ページに20個までのつぶやきしか表示されないため、仕方なく「もっと読む」を何度かクリックし、都度ブラウザの検索を使って目的のつぶやきを見つけるとか、Googleのsite:オプションを使って検索するとか、若干空しい作業をしてきた。

で、最近、フォロー中の中にもそのよーなつぶやき(その1その2)を見かけるようになったので、ざっくりTwitter APIを見てみたんですけど、やっぱり「ユーザを指定して語句を検索する」ようなAPIは提供されていない模様。

まぁ、大規模なユーザを抱えるTwitterでは、サーバに負荷をかけるような検索はできるだけ避けたいのかもしれないな、とも思える。

で、APIを眺めてると、最大200件のつぶやきは取得できるので、コレを使って定期的に自分のつぶやきをローカルのDBやテキストで保存しておき、ローカルで検索するしかないのかな、と。

ということで、直近の200件のつぶやきを取得するRubyスクリプトを書いてみた。
確認環境は久しぶりにMac OS X Leopard。RubyのバージョンはMacPortsでインストールした

ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9]
1.8系。ライブラリが提供されていれば1.9系でもWindowsでも動くと思う。

まず、Twitter4RというTwitter API用のライブラリをインストール。

gem install twitter4r
スクリプトはコチラ。
require 'rubygems'
gem('twitter4r')
require 'twitter'

def url(id)
"http://twitter.com/#{@login}/status/#{id}"
end

@login = 'your id'
password = 'your password'
twitter = Twitter::Client.new(:login=>@login, :password=>password)
twitter.timeline_for(:me, :count=>200) { |status|
puts "#{status.id} #{status.text} #{url(status.id)}"
}
とりあえず、つぶやきのIDとその内容、Twitter上のURLが出力されるようにしておいた。

実行結果はこんな感じ。

実行結果

Twitter APIの結果はUTF-8だとか書いてあった気がするので、もしかしたらWindowsのコマンドプロンプトだと文字化けするかもしんない。
適当に変換してください。

あとは、スクリプトをdaemonにして、たとえばつぶやきIDとかで比較して差分だけを保存するような形にしておけば、とりあえず、自分のつぶやきをトラッキングする、という目的は達成できると思う。

余裕があったらGAEとかでサービス化して公開するところなんですけど。


下記サイトに感謝。

| | コメント (0) | トラックバック (0)

2009年5月28日 (木)

Windows + MeCab + Ruby

RubyGoogleでも使われているらしいし、Mac OS X Leopardにもインストールされているという形態素解析エンジンMeCab

このMeCabをRubyから使おうとすると、通常はスクリプト言語用のバインディングを使うことになると思うんですけど、このRubyバインディングはWindows環境においてはそのままインストールできません。
C++のコンパイラがあればmakeできるらしいけど、まぁ、メンドいですな。どーしてもmakeを通したいヒトはMicrosoft Visual C++ Express Editionでも使えばいいんジャマイカ。


で、提供されているRubyバインディングにこだわらなければ、WindowsのMeCabをRubyから使用できます。

まず、IO.popenを使う方法。

clipWindows上のrubyでMeCabをちょっこっと使ってみたい

popenは実行ファイルをプロセスを起こして実行し、そのプロセスの標準入出力との間にパイプラインを確立するIOメソッド。MeCabは標準入力からの入力を解析し、標準出力に吐いてくれるので、popenを使えば操作できます。

解析の度にMeCabプロセスを起こすことになる(と思う)ので、リソースを消費するのと、性能が出ない(と思われる)のが難点と言えば難点。
でもまぁ、あるものを組み合わせて、サラりと解決するこのやり方はhackっぽくてケッコー好き。


解析の度にイチイチプロセス起こすなんてあり得ん!!という方は、DLLを直接呼び出すやり方をどうぞ。

clipwindowsのrubyからlibmecab.dllを呼び出す

DLLのインターフェイスが分かっていればRubyから呼び出すのは比較的簡単だし、一度ロードしてしまえばRubyスクリプトがメモリに乗っかってる間は呼び出せるので、毎回プロセスを起こすpopen方式よりはコストが低いと思われます。


先人達の知恵に感謝。


個人的には、無理してDLL呼び出ししなくても、popen方式でRubyバインディングと同じインターフェイスのラッパークラスをローカルに準備するのが吉じゃないかと。
開発はWindowsで運用はLinuxで、というシーンを考えたときに、(Rubyバインディングが使用できる)Linuxに乗せる際の手間がなくなるよう腐心した方が幸せな気がします。

| | コメント (0) | トラックバック (0)

2009年4月 8日 (水)

Pythonの次

マジか!!

clipグーグル、「App Engine」でのJavaサポートを発表

Google App Engineの次のサポート言語はJavaだったか…。
昨今の(Ruby等の)軽量動的言語にだいぶ押されてきたとは言え、WEB系じゃまだまだ人気というか、(ベンチャー系ではない)企業では未だにそれしか選択肢が無いかのような顔をしてのさばっている(失礼)JavaのGoogleによるサポートは、結構衝撃。


久しぶりにシビれた。


しかしまぁ、なんつーか。Javaとは…Google的じゃないような気もするし、Googleの本音を垣間見た気もするし。
App Engine、大化けするかもしれんなぁ。

Googleも必死ということかもしれない。

| | コメント (0) | トラックバック (0)

2009年1月 7日 (水)

初めてのRuby

初めてのRuby/オライリージャパン私信になってしまうけど、最近出たRuby本なら初めてのRubyがいいんじゃないでしょうか。オライリーの動物本にしてはめちゃくちゃ薄いし、日本語だし

ワタクシも持ってますヨ。全部読んでないけど。(またかよ)

Rubyスクリプト言語がどういうものかをサラりと俯瞰するにはちょうど良いリファレンスだと思う。

賛否は知らないけど404 Blog Not Foundの書評でもわりと高評価。
小飼氏曰く、K&R本(プログラミング言語C)と同じような簡潔さ、だとさ。

あー、K&Rも…第2版を全部読み切った自信がないなぁ。

| | コメント (2) | トラックバック (0)

2008年7月26日 (土)

Flex on Rails

Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0キター!!!こういう本を待ってたんですヨ!!!

Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0

って年末発売なのか…。

しかも洋書じゃねーか…。

翻訳版も同時発売していただきたい!!
っていうか、年末までに(技術)英語がスラスラと読めるようになってりゃいいんだよな。


さておき、k-nos氏がEvernoteに衝撃を受けたと聞いて、将来購入するかもしれないiPod touchやiPhoneのために…ではなく、職場とプライベートの間、WindowsとMac OS Xの間でメモとかシンクロしたい、という理由でEvernoteを導入してみたわけです。

一番簡単な同期方法として、今まではGmailとか使ってたわけです。言い換えると、プラットフォームに依存しないWEBアプリで同期を取ってたわけで、GmailのUIの秀逸さもあり、これはこれで便利っていうか、フツーに考えられる手法かな、と。

ただ、Flashはともかく、AjaxなWEBアプリだとインターフェイスに限界も感じつつあったり。上海の回線速度的にはFlashもキツいし。で、最近のクライアントアプリってどーなのよ、という観点でEvernoteを見てみると、…当たり前に楽勝なわけです。

これからまた、クライアントアプリが盛り返して来るんじゃないか、と思ったり。もちろん、サーバとの連携は必須なので、クライアント側はマルチプラットフォームなFlex使って、サーバ側はRailsだろ、とか思うわけです。
そこに"Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0"登場。やっぱりニーズはあるんでしょーな。

まぁ、Flexはまだまだモッサリしてるし、Adobeがおさえているので、劇的に流行ることはなさそーだけど。

| | コメント (0) | トラックバック (0)

2008年7月13日 (日)

Protocol Buffers

Protocol Buffers:

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler.
CNET Japanの記事によると
Protocol Buffersの目的は、サーバ間で多様なフォーマットのデータを高速で共有する際の問題を解決することだ。
(中略)
Protocol Buffersは、XMLの代替手段として、ネットワーク上でやりとりされるデータ形式や、ハードディスクに保存されるデータ形式を記述するものになる。
GoogleはこのProtocol BuffersをApache License, Version 2.0で公開。

異なるサーバ間あるいはプラットフォーム間のデータ共有は、確かにXMLを使用することが多いし、往々にして(プロジェクト毎に)独自実装だったりするわけだけど…。orz

公開されている実装はC++, Java, Python。Ruby実装かC#実装が出てきたら触ってみようかな。せめてJavaを触らんかい、というツッコミはナシで。

| | コメント (0) | トラックバック (0)

2008年5月 4日 (日)

TwitterはRailsを放棄するか

/.-J経由、TechCrunch Japaneseの記事「Twitter、Ruby on Railsを放棄か」によるとRuby on Railsで構築されていることで有名なTwitterがスケーラビリティの問題からRailsを捨て、新たに構築し直される…かも、とのこと。

Twitterが登場し、猛烈な勢いで流行っていった当初、「これはすごい」と「どこが楽しいのか分からない」という両極端の意見の狭間で、傍観を決め込んでいたんだけど、k-nos氏がTwitterを始めたことに気づいて、最近自分もアカウントを作ってたり。

Twitterを使ってみた現在の感触は…まぁ、なんだろ、ネットに向かって大声でひとりごちるような変なシステムですな。blogを1日に何度もポストするような人には向いているかもしんない。blogほど構えなくてもいいし、チャットほどリアルタイムじゃない、ある意味ニッチなゆるーい雰囲気がウケたのかも、と今頃になって分析。

ちなみにワタクシのTwitter上のつぶやきはこちら。日本語対応直前くらいから使ってます。


で、システム系の業務から離れてしまったので、仕事でRailsを使用することは限りなくゼロに近づいちゃったんですな。「あのTwitterもRailsで動いているんですよ!!イキましょう!!Railsで!!」と上司を説得することは今後ないわけです。けど、それでもTwitterがRailsを本当に放棄するのか、注視していこうと思ったり。特にRailsをやめて、代替手段としてRubyを使用し続ける場合、どんな仕組みになるのかがウォッチしておきたい。

追記:2008年5月4日(日)22:53
builder by ZDNet Japanより「TwitterはRailsを捨てません」という記事。TechCrunch Japaneseも下記のようにフォローしている。

私に言えるのは「Twitterが、Ruby on Railsから離れる予定だと話している」と主張する筋が複数あるということだけだ。会社が後に100%ガチと分かることを否定するのは、これが初めてではない。

| | コメント (0) | トラックバック (0)

2008年4月17日 (木)

first attack

MacBookiPodのときも驚いたが、説明書の類はほとんどない。Appleらしいというかなんというか。割り切り方が半端じゃない。

なので、何も考えず起動ボタンをポチッ。フツーに起動し、ネットにもフツーに接続でき、だいたい直観的な操作でなんとかなる雰囲気。トラックパッドの日本指操作はソッコーで理解できたけど、クリックボタンが一つしかないのはなかなか慣れない。

で、最初に起動したアプリは"Safari"だったり。


そのあと、DockやFinderからいろいろとアプリケーションを起動してみて、Mac OS X文化の一部をざっくりと俯瞰。技術書の目次を眺めたり、パラパラとめくってみたりするのと同じ行動かもしれない。

トーゼン分からないことが出てくるので、その都度ネットで検索。便利な世の中ですな。

で、ネット上やローカルの探索中に面白そうなアプリケーションを見つけたりするんだけど、深追いはしないことに。実は根本的なことが分かっていないんでした。


アプリケーションのインストール方法やインストール先が分からない


Windowsだと、そもそもインストーラ任せだし、インストール先もProgram Files配下に置くか、他の場所に置くか、というノリもだいたい分かるし、基本的にコントロールできる。けど、Mac OS XってUNIXなんでしょ。まさかアプリケーションのソースが配布されてて、コンパイルして、配置して、テキストエディタで環境変えて、みたいなことはないと思うけど(そのよーなものもたぶん実際にはある)、aptみたいなパッケージ管理ツール使うのか?MacだとMacPorts?

ちなみに、UNIX系システムを触るときは、アプリケーションをどこにどのように配置するかというノリが分からないので、パッケージ管理ツールを使ったインストールしかしたことがなかったり。Debian GNU/Linuxだとaptですな。Debian系はUbuntuしか使ったことないけど。
RubyパッケージならRubyGemsなわけで。

ということで、いったん現実逃避してMac OS XにRuby on Railsをインストール。ターミナルを開いて

gem install rails -r
書き込み権限がないと言って怒られる。
sudo gem install rails -r
成功。
これで、MacでもRailsで遊べるなぁ。

で、逃避から戻ってきて、一般的なアプリケーションのインストール方法は…とりあえず、Firefoxは詳細なインストール方法が載ってたのでその通りに。

ふうん。ディスクイメージをマウントするのね。インストール後はアンマウントしちゃっていいのね。媒体として扱う感じか。ということはここがアレで、えーと…。

Mac OSの基本的なことが全然わかってないので、細かいところがいちいち新鮮。


で、最初にDockから削除したアプリも"Safari"だったり。

| | コメント (0) | トラックバック (0)

2007年6月15日 (金)

RSSクライアント

GeekなぺーじRSSクライアントの作成(XML::RSS)で、PerlによるRSSクライアントのサンプルが掲載されてたので、Ruby(1.8.6)で書き直してみた。未検証だけど、多分同じように動作するはず。

require 'rss'
require 'open-uri'

# ここを変更してください
url = "http://kyow.cocolog-nifty.com/blog/index.rdf"

rss_source = ''
open(url) do |f|
rss_source = f.read
end

rss = RSS::Parser.parse(rss_source)
puts rss.channel.title
puts rss.channel.link
puts rss.channel.description

rss.items.each do |item|
puts item.title
puts item.link
end
多分、1.8.2でも1.8.4でも動くと思う。

環境によっては、出力の日本語文字列が化けるはずなので、適宜エンコードして欲しい。

require 'kconv'
:
puts rss.channel.title.tosjis
:
みたいな感じで。

このくらいのスクリプトだとRubyとPerlでコード量はほとんど変わらないんですな。コードの見易さは…各自で判断していただきたい。
ちなみに、その昔PerlでコソコソとCGIとか書いていたので、個人的にはPerlのコードにもあんまり違和感を感じなかったり。


| | コメント (0) | トラックバック (0)

2007年6月 1日 (金)

楽天WEB SERVICEをRubyから呼び出してみる

Rubyの作者であるまつもとゆきひろ氏が楽天技術研究所のフェローに就任(楽天のプレスリリース/.-J)ということなので、Rubyで楽天WEB SERVICEのAPIを叩いてみた。

まず、超簡単なhttpクライアント。

require 'open-uri'

html = ''
url = "http://kyow.cocolog-nifty.com"
open(url) do |file|
html = file.read
end

print html

全く簡単だ。

このhttpクライアントで楽天WEB SERVICEの検索APIを叩いてみる。デベロッパーIDはここで取得しておくこと。

require 'open-uri'
require 'kconv'
require 'cgi'

xml = ''
developer_id = 'デベロッパーID'
search_string = "検索キーワード"
rakuten_api_uri = "http://api.rakuten.co.jp/rws/1.7/rest?developerId=#{developer_id}&operation=ItemSearch&version=2007-04-11&keyword=#{CGI.escape(search_string.toutf8)}"
open(rakuten_api_uri) do |f|
xml = f.read.tosjis
end

print xml

マーベラス!!

このサンプルはWindows環境で動作させたので、文字コードをShift_JISとUTF-8間で変換している。

REST方式のAPIを呼び出しているので、戻り値はXMLとなる。あとは、戻ってきたXMLをparseすれば良いんだけど…せっかく楽天WEB SERVICEはJSON形式でも値を返せるんだし、XMLよりも軽量であることを考えて、JSONのAPIを呼び出することにする。セキュリティの問題を置いておくとJavaScriptで直接扱えて、Ajaxとも相性が良さそうだしね。

で、JSON parserにはWebOS GoodiesSimple JSON parser & builderを使用することにする。コード量が少なくて簡単に扱えそうなので。これをダウンロードしてjsonparser.rbという名前で保存し、こんな感じに。

require 'open-uri'
require 'kconv'
require 'cgi'
require 'jsonparser.rb'

def out(obj)
if obj.is_a? Hash
obj.each_key {|k|
print "key = #{k}\n"
out obj[k]
}
elsif obj.is_a? Array
obj.each {|i|
print "\n"
out i
}
else
if obj.is_a? String
obj = obj.tosjis
end
print "value = #{obj}\n"
end
end

json_string = ''
developer_id = 'デベロッパーID'
search_string = "検索キーワード"
rakuten_api_uri = "http://api.rakuten.co.jp/rws/1.7/json?developerId=#{developer_id}&operation=ItemSearch&version=2007-04-11&keyword=#{CGI.escape(search_string.toutf8)}"
open(rakuten_api_uri) {|f|
json_string = f.read
}

parser = JsonParser.new
obj = parser.parse(json_string)

out obj

Simple JSON parser & builderがparseした結果は「ハッシュと配列が入れ子になったオブジェクト」なので、それを表示するためのコード(outメソッド)が全体のほとんどを占めている。単にオブジェクトの中身を単に見るだけなら、再帰を使わなくてもinspectするだけで良い。

| | コメント (2) | トラックバック (0)

2007年5月11日 (金)

RubyによるPDFファイルの生成方法 on Windows

Rubyを使ってPDFファイルを生成する方法について調査。HowtoGeneratePDFs(翻訳)が参考になる。
Windowsをメインに使っている以上、pure Rubyな方式が何かと便利で問題が少ないと思われるので、PDF::Writerを使ってみることにする。
インストールはRubyGemsを使用して

gem install pdf-writer
まったく簡単だ。

早速使ってみたところ、どうやらPDF::Writer(1.1.3)は日本語を出力できない。うそーん。

再びググり、ぐうたら ruby ユーザのページより"日本語フォントパッチfor pdf-writer"を落としてくる。けど、このパッチ、.diffファイルで記述してあるので、(patchコマンドがない)Windowsだと使えねぇ。うそーん(二回目)。

一応、Vectorでpatch for Win32なツールを落として使ってみたけど、(使い方がまずかったのか)うまく当たらなかったので、仕方なく.diffファイルをテキストエディタで開いて、地道にネチネチと自力パッチ。
ちっ、こういうコンピュータがやるべき作業を人力でやらなきゃいけないときって、超情けない気分になるな…。


自分の環境では、

Rubyのルート\lib\ruby\gems\1.8\gems\pdf-writer-1.1.3\lib\pdf
配下のいくつかのファイル(.diffファイルを読んでちょーだい)にパッチを当てることにより、とりあえず日本語を含むPDFファイルの出力が可能になった。

PDF::WriterのAPIリファレンスはこちら


| | コメント (0) | トラックバック (0)

2007年4月13日 (金)

プロキシが邪魔してRubyGemsでインストールできないとき

Rubyの標準パッケージマネージャ(?)であるRubyGemsでRubyパッケージをインストールする機会が増えてきた。Ruby on Railsが流行ってからは特に。

で、RubyGemsでインストールする際、ローカル環境に該当パッケージがない場合は、自動的にリモートインストールすると思うんだけど、このとき、プロキシ内にいると外部ネットワークにアクセスできず、

ERROR: While executing gem ... (SocketError)
getaddrinfo: no address associated with hostname.
とかエラーが出てインストールできない。

こんなときは-pオプションでプロキシを設定してあげると、インストールできるようになる。

gem install パッケージ名 -r -p http://your.proxy.hostname:port_no
注意すべき点は、
  1. http://...とHTTPを使用することを明示
  2. :8080のようにプロキシが使用しているポートを明示
の二点。

-pオプションはRubyGemsのリモート系コマンドの共通オプションで、gem help installなどとするとusageが表示されるのでチェキ。

毎度プロキシを指定するのが面倒であれば、Windowsの場合(というか他のプラットフォームでRubyを使ったことがないだけです…)、http_proxyという環境変数に上記書式でプロキシを設定しておけば、指定しなくても済むようになる(けど、セキュリティ的にはたぶんよろしくない)。

[2007/05/22 追記]
RubyGemsのバージョンが0.8.10なら上記方法で問題なかったんだけど、0.9.2で試したところ

ERROR: While executing gem ... (NoMethodError)
っていうエラーが出やがる。(上にも書いてあるけど)環境変数http_proxyにプロキシのアドレスを設定し、
gem install rails -r
とすれば、とりあえずインストールできるので、RubyGemsのプロキシ越えがうまくいかなかった人は試して欲しい。


| | コメント (0) | トラックバック (0)