Ruby

LeopardのRuby関連環境

金曜に届きました!Leopard。なにやかやでようやく昨日の早朝インストールしました。Miniに変えたばかりでアップデートインストールにしようかとも思ったのですが、後々面倒が起こりそうなのでクリーンインストールしました。まだ、セットアップは完全じゃありませんが、今後は必要になるたびものを入れていくというスタンスでいこうかな。

気になる開発関連の環境ですが、付属のXCodeをインストールした状態で

Starter ToolKit DB2 on Railsを試す

昨日は久しぶりにDB2をいぢったりしてけっこう面白かったわけですが、何しろ大掛かりな業務アプリケーションを構築するわけじゃないのであんな作業に時間を費やすのはやっぱり面倒。昨日、一日でうんざりしちゃいました。それで、やっぱりrubyでなんとかできないかと思って調べてみたらもちろんありましたよ。ibm_db.0.8.0と、ruby-db2-0.4.4の2つ。

RubyでSOAP-RPCサーバを作る2

WSDLができたら、後は楽ちんでした。soap4rに付属のwsdl2rubyをつかってrubyスクリプトを生成して実際のメソッドを実装すればそれでオシマイ。

ruby wsdl2ruby --wsdl  ./lovmac.wsdl --type server --force

で、3つのrubyスクリプトが生成されます。

RubyでSOAP-RPCサーバを作る1(WSDL作成)

SOAP-RPCサーバをちゃんと作ろうと思ってWSDLを書き始めたのですがこれがまた大変でした。いまひとつ理解が浅いのか例によって動くまでに丸1日がかりでした。そもそも、WSDLって手で書くモノなのでしょうか?インタフェースを入力するとWSDLを吐き出してくれるツールがあっても良さそうなんだけどなあ。さすが、Javaにはツールが揃っていそうでしたが...とりあえず僕はviで。何に苦労したかと言えばnamespaceに尽きます。

マックチームに愛の手を! terminal使ってくれますか?

世の中同様、会社のマックチームは不遇で情報はあるのにアクセスする手段がない。マックチーム以外の人はそれぞれ必要に応じてMS-Access/Excelで情報の提供を受けることができるんですが、マックチームはそれができません。社内の情報系システムからはハッキリいって取り残されています。

で、フト思い立ったのが情報はサーバにあるんだからそっからとればいいじゃんっていう当たり前の事。win組のようにWebで見られない情報をいちいちExcelなぞにエクスポートしてもらってローカルでごちゃごちゃやる必要はマックチームはないんです。入社以来システム部、唯一のマカーとして(今や、プログラムを書くのも唯一になりつつある)ここは一番奮起するぞ!したほうがいいぞ!しようかな....

C/C++ or Ruby ?

in

近頃はRubyやPythonなんかのスクリプト言語の人気が高くて、人気の秘密が今ひとつ実感できなかったのですが今回のような経験をしてみるとその一端が見えたような気がします。それは、ライブラリの豊富さにあるのだと思います?例えば、今回のように「CSVファイルを読んでMySQLのデータベースを参照し結果を出力する」というたったこれだけの処理をC/C++で書くのに約一日半かかっています。前日に書いたRubyでは約二時間。この差はRubyにはMySQL操作のためのライブラリがあらかじめ用意されていたところにあります。C/C++にはそういうライブラリはありませんから(探せばあるのかも知れませんが)そこのところは自分でなんとかするしかないですよね。そうすると、それだけで半日はたっぷり時間を取られるわけでここらあたりのとっかかりの早さこそが人気の秘密なのじゃないかな?と思います。

1400万行のデータをRubyで扱うと...?(C/C++でリベンジ編)

1400万行のデータをRubyで扱うと...?で玉砕したのでここはC/C++で書いてみることにしました。C/C++の場合、使い捨ても業腹なので簡単なベースクラスを作成し派生クラスで対応することにします。ベースクラスでは今回必要なものだけを実装し、再利用するようなことがあれば逐次追加していくつもりです。(サンプルソースからはエラー処理を端折っています。)

static char* server_args[] = {
  "MySQLBase.cpp","--datadir=/usr/local/mysql/var","--key_buffer_size=32M"
};
static char* server_groups[] = {
  "embedded","server","this_program_SERVER",(char *)NULL 
};
class CMySQLBase {
protected:
  MYSQL*  m_db;
  MYSQL_RES* m_res;
public:
  CMySQLBase(void);
  virtual ~CMySQLBase(void);
  virtual int run(int argc,char* argv[]) = 0;
protected:
  int   init(void); // 初期化処理
  int   end(void);   // 終了処理
  bool  conn(const char* dbname); // コネクト処理
  bool  query(const char* query); // クエリ発行
  void  get_result(void); //結果の取得
  MYSQL_ROW get_row(void); //行の取得
  unsigned int get_field(void); //フィールド数の取得
};

このとき、それぞれのメソッドの実装は以下のとおり。

1400万行のデータをRubyで扱うと...?

in

仕事で

id,name,amount,date
:

のような構成のcsvファイルをMySQLのtable foo(id,category,name,price,value)とぶつけて

id,category,name,amount,price,date
:

に変換して出力する必要があったのでちょっとRubyでコードを書いてみました。cvsファイルはid列でソートされています。

require 'mysql'
require 'csv'

id  = nil
category = nil
price = nil
msql = Mysql::new('localhost','mysql','mypass','db')

CSV::Reader.create(File.open(ARGV[0],'r')).each { | row |
  if id != row[0] 
    id = row[0]
    result = msql.query("select * from foo where id = #{id}")
    if result.num_rows == 0
      puts "error! #{id}"
      break;
    end
    result.each do | var |
      category = var[0]
      price = var[1]
    end
  end
  puts "#{id},#{category},#{row[1]},#{row[3]},#{price},#{row[2]}"
}
msql.close();

いえ、動くんですよ。結果も欲しいものが得られました、テストでは。
ただ、本番のCSVファイル....14839193件もあったんですよ。いくら待って終わりませんです。計測無用。というわけで、玉砕しました。(しかも、来月から僕のDaily Workだってさ。マジ!?)

Railsのセッションファイル削除スクリプト

最近、プログラムを書くばかりで環境面・運用面のことを考えていないことが多いです。昨日も、tmpディレクトリに大量のセッションファイルが残存しているのことを発見!。Railアプリの運用については考慮すべき問題のようです。しかし約二ヶ月間放置でこんなになるとは.../var/tmp/~とはいえもちろん、使用ディスク容量にしっかりカウントされていました。

とりあえず、二日前までのセッションファイルは削除ということで以下のスクリプトで対処しました。/var/tmp以下はいろんなユーザのいろんなファイルがあるようでFile.owned?()が必要でした。

Rubyを始めて驚いた!!!コード

in

数ヶ月前、Railsを知り初めてRubyでコードを書いたとき一番悩んだのがチュートリアルにあった次のコード

@category_pages, @categories = paginate :category, :per_page => 10

一見、何をしているのかよく分からない、というか式の区切りがよくわかりませんでした。長らく、C/C++でコードを書いてきましたがこんなコードお目にかかったことがない。まず、右辺(らしき)paginateメソッドを頼りに調べてみて、()が省略されていることにようやく気づき、

rublog-0.2.0リリースしました。

rublog-0.2.0公開しました。変更点は、

  1. pingサーバの登録機能追加。pingサーバを独自に登録できるようにしました。
  2. コメント/トラックバックの承認可否追加。コメント・トラックバックを承認制にしました。(スパムで懲りた...)
  3. Amazonアソシエイト機能の追加。記事を書くときにASINコードを入力するだけででプロダクトレビューになります。
  4. hReviewフォーマット対応。アマゾン商品レビューの場合、hReviewフォーマットで出力します。
  5. カテゴリ・アーカイブブロック表示の追加。定番なので
  6. ブログ記事へのタグキーワード付加。これが自分でも結構楽しい。タグでの絞り込みもできます。
  7. 覚えきれないほどのバグフィックス(まだまだあるよ)

これで、ようやくカタチになってきたかなぁ。後は、コツコツとバグ取りしていきます。ダウンロードはSourceForgeまたはrublogダウンロードから。
Rubricks+rublogで構築した、本レビューサイトbookworms::本の虫もよろしかったらご覧ください。

Rubricksコンポーネントのスキーマ更新

rublogコンポーネントのバージョンアップの開発もそろそろ区切りを付けようと思っているのですが、スキーマのアップデートの方法でしばらくの間悩んでいました。なにしろ行き当たりばったりの開発なのでスキーマの変更がたくさんあって、この変更をどう処理したものかうまい方法が見つからず思案していたわけなんです。Railsのスキーマ管理のやり方としてはActiveRecord::Migrationを使用するのが素直なことはわかっていたのですがこれだとアプリケーション全体のバージョンに影響が出てしまいます。かといって別途SQLを用意してユーザにコマンドを打たせるのも今ひとつスマートじゃない気がして。

hReviewをどうブログツールに実装するか

早速、hReviewフォーマットで「砂をつかんで立ち上がれ(中島らも)」作成してみました。自作なのでどんどん試していけるのがいいですね。構造としては

<div class="hreview">
  <div class="summary"> ブログ記事タイトル </div>
  <div class="descripction"> ブログ記事本文 </div>
  <div class="product">
    <dl class="item">
      <dt class="fn url">  
       <a href="....">本のタイトル</a>
      </dt>
      <dd>著者</dd>
      <dd>出版社</dd>
      <dd>値段</dd>
    </dl>
  </div>
  <span class="reviewed vcard">
    <span class="fn">hippos</span>
  </span>
  <abbr class="dtreviewed" title="2006-11-29T14:26:57">
   2006-11-29
  </abbr>
  <a class="permalink" href="..." rel="selfbookmark">permalink</a>
</div>

悩んだのは画像の扱いで、item属性として画像を表示するかどうかなのですが、見栄えの好みとして本文中に画像を持っていきたかったので敢えてitem属性の中では画像を使用しませんでした。自分としては意外にすっきりできたと思いますがどうでしょう?タイトルと本文はもともと入力欄がありますのでこれはそのまま流用。肝心のレビュー対象となるproductはAmazonのASINコードを入力しそこから情報を取得しています。レビューには付き物の★の格付けは敢えてはずしました。

rublog公開しました。

in

blogとしてのおおよその機能はなんとか実装できたようだしそろそろ最初のバージョンを公開しました。現時点では、普段自分が使う機能(普通に記事を投稿・編集。たまにはコメントしたりされたり)程度はできたと思うのですが、MTとか使ったことがないので実際のところどの程度のものができたのかよく分かりません。ただ、自分のブログをお仕着せでなくって自由に作成したいという個人的目的は達成できました。それにしても、皆ブログに何を求めてるんだろ?自分自身もなんでblogなんて書いているのかよくわからないけれど...まあ、楽しいんでしょうね。テストを兼ねて書いてきたデモブログrublog開発ブログも公開しときます。

アップロードファイルの保存先

ファイルのアップロード機能をRailsで実現するのは意外と簡単で、HowtoUploadFiles in Ruby on Railsに詳細なチュートリアルがあるのですが、悩んでいるのはアップロードしたファイルをどこの保存するかなんです。チュートリアルや「RailsによるアジャイルWebアプリケーション開発」ではDBに保存する例があってそれにならってmediumblobのカラムに保存するよう作成してみたのですが、ちょっと気持ちが悪い。案の定、容量の大きなファイルをアップロードすると問題が発生します。

コンテンツの配信