Enumerable#grepを使う事で、文字列の配列から、
所望のパターンにマッチするものだけを抜き出す事が出来ますが、
以下のようにブロックを指定する事で、
マッチした部分だけを取り出す事が出来ます。

ruby>>
Dir["config/environments/*.rb"].grep(%r{(\w+).rb$}){$1}
#=> ["development", "production", "rake", "staging", "test"]
<<--

痒いところに手が届く感じですね。

posted by genki genki on Thu 30 Apr 2009 at 14:27 with 0 comments

Sassを使うようになって、属性とタグの区別がつきにくいなと感じていたので、シンタックスハイライトをする方法を探してみました。

これを使うと、こんな感じになります。

ss

だいぶ見やすくなりました。

posted by genki genki on Sun 26 Apr 2009 at 17:30 with 0 comments

例えばJavaScriptだと"\u3000"と書けば良かったのですが、少なくともRuby-1.8系ではこれに相当する記法が無さそうだったので、いつも困ってました。
色々調べてみた結果、以下のようにすれば良さそうです。

ruby>>
[0x3000].pack("U") == " " #=> true
<<--

長い事迂回していた問題だったのでスッキリしました :-)

Special Thanks

  • @yukiko pack("U")が使えそうという情報をありがとうございます。
posted by genki genki on Fri 24 Apr 2009 at 06:20 with 0 comments
posted by genki genki on Thu 23 Apr 2009 at 20:54 with 0 comments

Rails勉強会#40のセッションでも言いましたが、
エラーが発生した時等に表示されるbacktraceの表示は、
コンソールのように上から下に流れる画面上では
通常の逆順のほうが追いやすいと思います。

ということで、ちょっと試しにそのような挙動にしてみました。
以下のようなコードを実行するとテストできます。

ruby>>
class Exception
def set_backtrace(bt)
puts bt.reverse.map{|i|
i.sub(/^([/.\w]+):(\d+)/,
"\e[33m\1\e[m:\e[32m\2\e[m")
}.join("\n")
end
end

def foo
raise StandardError
end

def bar
foo
end

bar
<<--

こんな感じに、エラーが発生した場所に近い順に、
下から上にたどっていく感じに表示されます。

ss

上から下のbacktraceに目が慣れてしまっているので、最初は追いかけにくさを感じますが、一旦慣れてしまえば、スタックが深くて相当スクロールアップしなければエラーの発生源までたどり着けないという場合には良さそうな気がします。

stackという概念のイメージのせいで、新しいものが上の方に来るようになっているのだと思いますが、実用上は新しいものが下にくるこのスタイルの方が便利ではないでしょうか。

posted by genki genki on Thu 23 Apr 2009 at 04:04 with 2 comments

JRubyで相対パスを含む場合に、Jarファイルの中のファイルを読めるようにするためのモンキーパッチの最新版です。

ruby>>
def cleanup_path(path)
if path.to_s.match(/^file:/) && path.is_a?(String)
jar_path, inner_path = path.split('!', 2)
inner_path = File.expand_path(inner_path)
path = [jar_path, inner_path].join('!')
end
path
end

alias :require_original :require
def require(path)
require_original cleanup_path(path)
rescue Exception => e
raise e unless path.to_s.match(/^file:/)
end

alias :load_original :load
def load(path)
load_original cleanup_path(path)
rescue Exception => e
raise e unless path.to_s.match(/^file:/)
end

class Dir
class << self
alias :aref_original :[]
def
aref_original *(args.map{|path| cleanup_path(path)})
end
end
end
class File
class << self
alias :mtime_original :mtime
def mtime(path)
if path.match(/^file:/)
jar_file, = path.split('!', 2)
path = jar_file.sub(/^file:/, '')
end
mtime_original(path)
end
end
end
<<--

posted by genki genki on Tue 21 Apr 2009 at 02:41 with 0 comments

Merbでconfig/router.rbの中で、リソースのカスタムアクションを追加する方法のメモ。

ruby>>
resource :users,
:collection => {:active => :get},
:member => {:password => :get}
<<--

:collectionで指定したアクションは、resource(:users, :active) などのように参照できて、"/users/active" のような感じになります。

:memberで指定したアクションは、resource(@user, :password) などのように参照できて、"/users/1/password" のようなスタイルになります。

posted by genki genki on Mon 20 Apr 2009 at 14:54 with 0 comments

GAEを使う上での大きな制限として、ファイル数1000までというのがあります。
これを乗り越えるために、unpackしたGemの中から不要なファイルを掃除したりする必要があったのですが、
関連するGem群をjarファイルにまとめる事でこの問題を乗り越えられます。

上記のファイルをlibの下に配置して、config/init.rb
あたりでrequire_fixを読み込みます。
これはjarファイルの中のrbファイルの読み込みに関するバグを
回避するためのものです。

実際に以下のサイトでmerb.jarを使って運用しています。

これによって、事実上ファイル数制限に左右されずにアプリケーションを開発する事が出来るようになります。
ただ、1ファイルのサイズ制限(10MB)が存在するので、jarファイルが大きくなりすぎた場合は分割する必要があります。

posted by genki genki on Sun 19 Apr 2009 at 08:25 with 0 comments

JRubyを使っていて、JavaのArrayListを作りたい場合には、以下のようにすると良いようです。

ruby>>
java.util.Arrays.as_list([1,2].to_java).getClass.to_s

=> "class java.util.Arrays$ArrayList"

<<--

posted by genki genki on Fri 17 Apr 2009 at 11:03 with 2 comments

DataMapper用のDataStoreアダプター、dm-datastore-adapter-0.2.2をリリースしました。

今回のリリースで以下のような機能がサポートされます。

  • トランザクション
  • OR条件
    ruby>>
    Post.all(:id => [1,2,3])
    <<--
    のような事が出来るようになりました。
  • NOT条件
    ruby>>
    Post.all(:updated_at.not => nil)
    Post.all(:id.not => 3)
    <<--
    などが出来るようになりました。

DataMapperのアダプタとして主に必要な機能はだいたい揃ってきました。

デモサイトであるWatchMe!もアップデートしています。

まだ実用的なサービスになってないですが、登録したサイトをクローリングして全てのページの監視を行い、エラーが発生したらメールで知らせるサービスになる予定です。

posted by genki genki on Fri 17 Apr 2009 at 04:29 with 8 comments

Rakeでnamespaceなどを使った場合に、Rubyのシンボルをネストさせたい時があるのですが、

ruby>>
task :foo => :"bar:baz"
<<--

のように書くのが、DSL的にちょっとかっこうわるいです。
そこで、以下のようなものがあればちょっと奇麗に書けます。

ruby>>
class Symbol
def method_missing(method, *args, &block)
if args.empty? && block.nil?
[self, method].join(':').intern
else
super
end
end
end

:foo #=> :foo
:foo.bar #=> :"foo:bar"
:foo.bar.baz #=> :"foo:bar:baz"
<<--

いかがでしょう。

posted by genki genki on Wed 15 Apr 2009 at 05:45 with 0 comments

GAE/Jにはファイル数制限(1000まで)があるので、なるべく不要なファイルは減らしたいのが人情というものです。
ということで、unpackしたgemsから不要なファイルを掃除するために、以下のようなスクリプトを使用しています。

script/strip_gems

ruby>>
#!/usr/bin/env ruby

Dir['gems/gems/'].each do |dir|
%w(
Generaters TODO README.
README
spec// test// examples// tasks//
tutorial// demo//
CHANGES CHANGES.txt CHANGELOG
LICENSE MIT-LICENSE Rakefile CONTRIBUTORS
Manifest.txt History.txt install.rb setup.rb
).each do |pattern|
Dir[File.join(dir, pattern)].each do |path|
command = "rm -rf #{path}"
puts command
system command
end
end
end
<<--

Gemの中に含まれているファイルには制約が無いので、
簡単なパターンで全てを掃除するのは難しいですね。

posted by genki genki on Wed 15 Apr 2009 at 04:51 with 0 comments

非常にシンプルなのですが、毎回GlobalHelpersに書くのが面倒なので、
Merbから
GRAVATAR
のアイコンを表示するための
merb_gravatarプラグインを作りました。

http://github.com/genki/merb_gravatar/tree/master

インストール方法

pre>>
% sudo gem install merb_gravatar
<<--

使用法

dependencyでmerb_gravatarを指定して、viewで以下のように使います。

html>>
<%= gravatar @user.mail, 16 %>
<<--

第二引数はアイコンのサイズを1~80で指定します。省略すると80が選ばれます。

例

ss1

GAE/Jでも使えます(See http://watch-me.appspot.com/people)

posted by genki genki on Tue 14 Apr 2009 at 11:05 with 0 comments

dependencyでdata_objectsを指定すると、GAE/Jでなぜか突然exitしてしまうので理由を調べていたところ、data_objectsのtransaction.rbで以下のようなコードがあり、そこで落ちている事が分かりました。

ruby>>
module DataObjects

class Transaction
HOST = "#{Socket::gethostbyname(Socket::gethostname)[0]}" rescue "localhost"
<<--

Socket::gethostbyname を使っているところですね。

posted by genki genki on Tue 14 Apr 2009 at 04:25 with 0 comments

一人で長距離を走るのが暇なので、
走っている間に会話ができる仲間を求めてはじめた
MerbJog
ですが、
勉強会系イベントの手法として優れた特性を持っている事が分かったので
開催する上でのポイントなどをまとめておきます。

特長

  • 会場スペースの制約が無く、参加人数に制限がいらない
  • 1〜2時間程度と、短時間で終わる
  • 仕切り、準備、後片付けなどがほとんど不要
  • 話した内容とは無関係に、走り終わったあとに満足感がある
  • フォーメーション的に中心人物ができにくいので、全員が比較的フラットに話題に参加できる
  • 体力の許す限り話したい人のそばに移動できる
  • 二次会をしないので安上がり
  • 健康的

短所

  • ググれないので脳に入ってる情報だけがたより
  • ホワイトボード、PCなどが無いので言葉だけで説明する必要がある
  • 悪天候時には中止・延期せざるをえない
  • 体力が無い人は参加できない
  • 参加者と遭遇できない場合がある

開催上のポイント

  • 皇居などの信号が少なく、5〜10kmぐらいのコースが良い
  • 遭遇できなくても泣かない。たまには一人で走るのもよし
  • 遭遇率を高めるために、主催者は携帯を持っていく
    • 携帯はランニングポーチに入れておくと気にならなくて良い
  • 筋肉の疲労が抜けるまで、なか2日程度あけた方が良い

See Also

posted by genki genki on Mon 13 Apr 2009 at 13:44 with 1 comment

DataMapper用のDataStore用アダプタ、dm-datastore-adapterを作りました。

これを使えば、MerbアプリをほぼそのままGoogle App Engine for Javaの上で動かせるようになります。
(実際にはgemの依存関係など、細かい調整が必要になりますが)

実際に以下のサイトでdm-datastore-adapterを使っています。

ローカル環境でも別なアダプタを利用すれば、普通のMerbアプリとして動作テストできるので、開発効率が飛躍的に向上します。

posted by genki genki on Mon 13 Apr 2009 at 05:37 with 0 comments

gemを指定したディレクトリにインストールする方法を紹介します。
以下のように -i オプションでディレクトリを指定します。

pre>>
gem install -i ./gems data_objects --no-ri --no-rdoc
<<--

Gemをunpackしている場合に、もう一つ、二つGemを追加したい時などに重宝します。

posted by genki genki on Sun 12 Apr 2009 at 17:34 with 2 comments

現在のところ、JRubyでjgem install do_sqlite3などによってdo_sqlite3をインストールしようとすると、Native extensionを使っているという事でエラーが出ます。

pre>>
Building native extensions. This could take a while...
/usr/local/jruby/lib/ruby/1.8/mkmf.rb:7: JRuby does not support native extensions. Check wiki.jruby.org for alternatives. (NotImplementedError)
<<--

この問題を解決するには、最新版のdatamapper/doをgithubからとってきて、自分でbuildする必要があります。

http://github.com/datamapper/do/tree/master

doをgit cloneしたら、まずはdata_objectsディレクトリに移動し、以下のようにしてdata_objectsをインストールします。

pre>>
% jruby -S rake package
% sudo jgem install pkg/data_objects-0.9.12.gem
<<--

続いて、do_jdbcディレクトリに移動し、do_jdbcをコンパイルしてインストールします。

pre>>
% jruby -S rake compile
% jruby -S rake package
% sudo jgem install pkg/do_jdbc-0.9.12-java.gem
<<--

最後に、do_sqlite3 ディレクトリに移動し、以下のようにインストールします。

pre>>
% jruby -S rake package
% sudo jgem install pkg/do_sqlite3-0.9.12-java.gem
<<--

以上でインストール完了です。

posted by genki genki on Sun 12 Apr 2009 at 03:34 with 0 comments

Bumble
はGoogle App Engine for JavaのDateSoreを利用するためのライブラリですが、Railsで利用する前提で作られているので、
Merbで利用する場合には、以下のような修正を加えると良いようです。

bumble.rb

ruby>>
module Bumble
(..snip..)
def self.included(base)
base.send :include, InstanceMethods
base.send :extend, ClassMethods
Merb::Router.root_behavior =
Merb::Router.root_behavior.identify(Bumble => :key)
end
<<--

これによって、resource(@person) #=> /people/5 のようにidentifyしてくれるようになります。

posted by genki genki on Sun 12 Apr 2009 at 02:19 with 0 comments

GAEjのファイル数制限が厳しいので、rails.jarを試作してみました。

rails-2.3.2.jar

jrubyのバグなのか、jarファイルの中身に対してrequireをする時に、
pathの中に../..のような感じの指定が入っているとうまくロードできないようなので、その問題を回避するモンキーパッチをあてる必要がありました。

require_fix.rb

ruby>>
alias :require_original :require
def require(path)
path = File.expand_path(path) if path.to_s.match(/^file:/)
require_original path
end

alias :load_original :load
def load(path)
path = File.expand_path(path) if path.to_s.match(/^file:/)
load_original path
end
<<--

それでこんな感じに使えます。

pre>>
% java -jar $JRUBY_HOME/lib/jruby-complete.jar -rrequire_fix -rrails-2.3.2.jar -S rails -v
Rails 2.3.2
<<--

実際にはlibの下に設置する感じになりますね。

posted by genki genki on Sat 11 Apr 2009 at 09:41 with 0 comments

Ramaze
はModularなWebアプリケーションフレームワークです。
以下のようにしてインストールしました。

pre>>
% sudo gem install ramaze
% sudo gem install manveru-innate
% sudo gem install manveru-nagoro
<<--

続いて、以下のようひな形を生成して起動します。

pre>>
% ramaze --create hello
% cd hello
% ramaze
<<--

ログの出力

ss1

起動画面

ss2

posted by genki genki on Thu 9 Apr 2009 at 19:28 with 0 comments

2日前ぐらいからいろいろ頑張ってたのですが、ようやくGAEjの本番環境でMerbアプリを動かせました。

http://jmerbist.appspot.com/

ss

使っているgemをfreezeする仕組みがあるフレームワークであれば、どれでも以外と簡単に動きそうな感じがします。

いやー、これは色々面白い事が出来そうですね!

posted by genki genki on Thu 9 Apr 2009 at 17:18 with 0 comments

Google App EngineでMerbを動かしてみた。

ss

しかし、本番環境にデプロイするためには別途Google App Engine Javaのアカウント申請が必要らしい。申請してみたけれど、レスポンスが無いので初回の10000万件の枠はもう無くなっている模様。

残念だなー。

posted by genki genki on Thu 9 Apr 2009 at 08:55 with 0 comments

以前、Merb用のaliasの設定をご紹介しましたが、今度はjruby版です。

sh>>
alias jm='PATH=./bin:$PATH jruby -S merb'
alias jmi='jm -i'
alias jmg='PATH=./bin:$PATH jruby -S merb-gen'
<<--

rubyとjrubyを両方使ってると、

pre>>
% jruby -S merb
<<--

のように書く事が多いので、aliasを設定しておくと便利ですね。

posted by genki genki on Thu 9 Apr 2009 at 01:45 with 0 comments

最新のhpricotをjruby(1.2)で利用する手順をメモしておきます。

まず、githubから最新のhpricotをcloneしてきます。

あとは、以下のようにしてjruby用のパッケージをbuildしてインストールします。

pre>>
% jruby -S rake package_java
% sudo jgem install pkg/hpricot-0.8.235-jruby.gem
<<--

これでOK.

posted by genki genki on Wed 8 Apr 2009 at 16:49 with 0 comments

思い立ってJRubyの環境を入れてみる事にしました。

ちょうどバージョン1.2が出ているようなので、ソースを落としてきます。

http://dist.codehaus.org/jruby/1.2.0/jruby-src-1.2.0.tar.gz

落としてきたファイルは/usr/local/jruby-1.2.0 あたりに展開します。
展開したら、Javaらしくantでbuildします。

pre>>
% ant
<<--

あとは、以下のように~/.zshrcなどで環境変数を設定します。

sh>>
export JRUBY_HOME=/usr/local/jruby-1.2.0
export PATH=:$JRUBY_HOME/bin:$PATH
<<--

これで、ひとまずjrubyが動くようになります。

pre>>
% jruby -v
jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-04-08 rev 6586) [i386-java]
<<--

posted by genki genki on Wed 8 Apr 2009 at 06:45 with 0 comments

Merb/DataMapperをしばらく使っていたのですが、
少なくともバージョン0.9.10, 0.9.11では、
associationの実装にバグがあり、
レコード数が多いテーブルがあると、aggregation系の処理に時間がかかるという問題がある事が分かりました。

例えば、Post.has n, :comments な関係がある時に、
以下のようなコードを実行すると、このようになります。

ruby>>
?> Post.first.comments.count #=> 188
~ (0.000865) SELECT "id" FROM "posts" ORDER BY "id" LIMIT 1
~ (0.000094) SELECT "id", "post_id" FROM "comments" WHERE ("post_id" IN (1)) ORDER BY "id"
~ (0.000063) SELECT COUNT(*) FROM "comments" WHERE ("post_id" = 1)
<<--

2つ目のSQLは不要なのですが、発行されてしまいます。
例えばCommentのレコード数が多かった場合、Commentオブジェクトを大量に生成しようとしてしまうため、致命的な遅さになってしまいます。

目下この問題の解決策を探しているところですが、
Edge-DMのspec/仕様でerrorが出ている状態なので、なかなか手が付けられない感じです。
とりあえず、dm-coreのassociations/relationship.rbの中の、

ruby>>
# @api private
def get_children(parent, options = {}, finder = :all, *args)
parent_value = parent_key.get(parent)
bind_values = [ parent_value ]

    with_repository(child_model) do |r|
      parent_identity_map = parent.repository.identity_map(parent_model)

      query_values = parent_identity_map.keys
      bind_values = query_values unless query_values.empty?
      query = child_key.zip(bind_values.transpose).to_hash
      collection = child_model.send(finder, *(args.dup << @query.merge(optio

ns).merge(query)))

      return collection unless collection.kind_of?(Collection) && collection.any?

<<--

の最後の collection.any? で件のSQLが実行されているところまでは分かりました。
DataMapper::CollectionはextlibのLazyArrayを継承しているクラスなのですが、どうもそのへんの仕様が変わったのに追従できてないのかな。
モジュールを過度に分散しすぎるのも、整合性を保つのが大変になるという問題がありますね。
注意深く完全なSpecを書く事を心がけていれば防げる問題かもしれないですが。

posted by genki genki on Wed 8 Apr 2009 at 04:52 with 0 comments

最近の釣果ならぬYak Shaving状況:

  • watch.s21g.com が重たくて固まる
  • CouchDB-adapterを疑ってmysqlに戻す
  • まだ遅いのでdm-aggregatesを調査
  • dm-core が原因っぽいのでdm-coreのソースを見る
  • dm-core のスペックが通らない
  • postgresが必要なのでインストール
  • Mac用インストーラではdo_postgresがmakeできない
  • postgresをソースからインストール <- いまここ

ということで、MacOSにPostgresを入れるためにユーザを作成する手順のメモ。

pre>>

dscl . -create /Users/postgres

dscl . -create /Users/postgres UserShell /bin/bash

dscl . -create /Users/postgres RealName "Postgres"

dscl . -create /Users/postgres UniqueID 451

dscl . -create /Users/postgres PrimaryGroupID 451

dscl . -create /Users/postgres NFSHomeDirectory /usr/local/pgsql

<<--

UID/GIDの根拠は自信が無い。UIDは500未満にしておくとログイン画面にでないようになるそうだ。

Alas, life is full of yakshaving!

See Also

posted by genki genki on Tue 7 Apr 2009 at 23:36 with 0 comments

桜が散る前に、4/8の夜21時よりMerbJog#2を開催いたします。

詳細・参加申請は以下のサイトをご覧ください。

飛び入り参加もOKです。

よろしくお願いします。

posted by genki genki on Tue 7 Apr 2009 at 14:52 with 0 comments

DataMapperはSQLを解さないアダプタも利用可能なので、この方法でSQLが実行できるかどうかはアダプタを選びますが、一般的には以下のようにすれば直接SQLを実行できます。

ruby>>
Post.repository.adapter.execute("sql string")
<<--

結果は、例えばmysqlを使っている場合にはDataObjects::Mysql::Resultが帰ってきます。

posted by genki genki on Tue 7 Apr 2009 at 00:54 with 0 comments

DataMapperでSetterメソッドを上書きして、プロパティの設定をコントロールするには、以下のようにします。

ruby>>
def uri=(uri)
attribute_set :uri, ::URI.parse(uri).normalize.to_s
end
<<--

posted by genki genki on Sun 5 Apr 2009 at 06:54 with 0 comments

度々忘れるのでメモしておきます。

ruby>>
Merb::ControllerExceptions.constants.sort #=> ["Accepted", "ActionNotFound", "BadGateway", "BadRequest", "Base", "ClientError", "Conflict", "Continue", "Created", "ExpectationFailed", "Forbidden", "GatewayTimeout", "Gone", "HTTPVersionNotSupported", "Informational", "InternalServerError", "LayoutNotFound", "LengthRequired", "MethodNotAllowed", "MovedPermanently", "MovedTemporarily", "MultiPartParseError", "MultipleChoices", "NoContent", "NonAuthoritativeInformation", "NotAcceptable", "NotFound", "NotImplemented", "NotModified", "OK", "PartialContent", "PaymentRequired", "PreconditionFailed", "ProxyAuthenticationRequired", "Redirection", "RequestEntityTooLarge", "RequestRangeNotSatisfiable", "RequestTimeout", "RequestURITooLarge", "ResetContent", "STATUS_CODES", "SeeOther", "ServerError", "ServiceUnavailable", "Successful", "SwitchingProtocols", "TemplateNotFound", "TemporaryRedirect", "Unauthorized", "UnsupportedMediaType", "UseProxy"]
<<--

posted by genki genki on Sat 4 Apr 2009 at 22:57 with 0 comments

Merb/DataMapper/CouchDBの環境で rspec を使う場合には、
spec_helper.rb
で以下のように設定すると良いようです。

ruby>>
config.before(:all) do
DataMapper::AutoMigrator.auto_migrate(nil,
*(DataMapper::Resource.descendants - [Merb::DataMapperSessionStore]))
end
<<--

セッションストアを使っている場合は、
Merb::DataMapperSessionStore用のrepositoryを
別途指定すると良いと思います。

posted by genki genki on Sat 4 Apr 2009 at 22:07 with 0 comments

DataMapper#auto_migrate!を実行すると、以下のようなコードが実行される。

ruby>>
self.auto_migrate!(repository_name = nil)
AutoMigrator.auto_migrate(repository_name)
end
<<--

AutoMigrator#auto_migrateは以下のようになっている。

ruby>>
def self.auto_migrate(repository_name = nil, *descendants)
auto_migrate_down(repository_name, *descendants)
auto_migrate_up(repository_name, *descendants)
end
<<--

第二引数以降でDMのクラスリストを指定できる。
省略すると、DataMapper::Resource.decendantsが指定されたものとして動作する。
特定のリソースだけまとめてauto_migrateするには便利そうだ。

posted by genki genki on Sat 4 Apr 2009 at 12:49 with 0 comments

今週末の4/5(日)にMerbJogを開催いたします。
Merb/Rubyなど、プログラミングに関する会話をしながら皇居の周りを走ります。
詳細・参加登録は以下のページをご覧ください。

http://atnd.org/events/510

開催時刻は多少変動する可能性があります。
雨天、悪天候の場合は延期となります。
ご了承ください。

posted by genki genki on Fri 3 Apr 2009 at 16:31 with 0 comments

急遽大門駅付近で開催されることになったCouchDB勉強会のレポートです。

参加者: @maiha, @yugui, @yamaz, @takiuchi

そもそもCouchDBは何かというと、
Apacheのプロジェクト
で、分散、耐障害性、スキーマフリー、ドキュメント指向なデータベスで、
RESTfulなAPIを使って制御します。

結構前から存在していたのですが、取りかかるきっかけがなくてスルーしていました。
しかし、dm-couchdb-adapterを使ってMerb/DataMapperで利用可能という事が分かり、にわかに盛り上がってきました。

早速、couchdbをインストールします。
いまのところ、ソースからcouchdb-0.9.0をインストールするのが一番良いようです。
macportsのcouchdb-0.9.0aでは動作が微妙に異なっているようでうまく動きませんでした。

dm-couchdb-adapterは、dm-moreにバンドルされているのですが、
そのままでは一部機能が利用できなかったので、
問題の分析を行いながら、
@maihaさんが改良を加えていきました。
改良版はこちらにあります。
使ってみたい場合は、maiha/dm-moreをcloneしてきて、

pre>>
% cd adapters/dm-couchdb-adapter
% sudo rake install
<<--

すればOKです。
基本的な使い方は上記GitHubリポジトリのREADMEを読めば分かります。

結論として、普通にMerbアプリを作れるようになりました。
試しに作りかけの社内ツール的なものをMerb/DM/CouchDBの構成にしてみました。

http://watch.s21g.com

Future Worksとしては、

  • read_manyでのorderの指定。emitの第一引数を使う。逆順をどうするか。
  • count以外のaggregate (max, min, sum, avg) のサポート

などがありますね。

posted by genki genki on Fri 3 Apr 2009 at 13:41 with 0 comments

ubuntuにcouchdbをソースから入れる手順をメモしておきます。

posted by genki genki on Fri 3 Apr 2009 at 02:50 with 0 comments

データベースのメンテナンスのために、明日(2009/4/3)の早朝04:30ごろから30分程度、弊社のサービスに繋がりにくくなる時間が発生する見込みです。

ご迷惑をおかけいたしますが、よろしくお願いいたします。

Update

メンテナンスは無事に終了いたしました。

posted by genki genki on Thu 2 Apr 2009 at 13:55 with 0 comments

いろいろあって、いまはこんな感じになってます。

pre>>
[alias]
co = checkout
ci = commit -a
st = status
up = pull --rebase
a = add
b = branch
c = commit
d = diff
<<--

posted by genki genki on Thu 2 Apr 2009 at 12:43 with 2 comments

Formula
は、数式を簡単にブログに貼付けて共有できるサービスです。
このたび、FormulaをRails-2.3.2に対応させました。

また、対応作業の過程で、Rails用のpaginationライブラリである、
pagination_scopeのバージョン0.1.2をリリースいたしました。

:groupオプションを含むnamed scopeのpaginationに対応いたしました。

posted by genki genki on Thu 2 Apr 2009 at 01:31 with 0 comments

Rails-2.3からRackに対応した事と関連が深いと思うのですが、
ruby-openidを使っていると、logger関係のエラーが出るようです。
ruby-openidでは、デフォルトでは以下のように

ruby>>
@@logger = Logger.new(STDERR)
<<--

STDERRを使うようになっているのですが、これがRackと相性が悪いようです。
以下のように、config/initializers/*.rbあたりで別途loggerを設定すると良いようです。

ruby>>
OpenID::Util::logger = Logger.new(File.join(Rails.root, %w(log openid.log)))
<<--

posted by genki genki on Wed 1 Apr 2009 at 20:39 with 0 comments

polymorphic_urlの中身で使われている build_named_route_callのソースを貼付けておきます。

ruby>>
def build_named_route_call(records, namespace, inflection, options = {})
unless records.is_a?(Array)
record = extract_record(records)
route = ''
else
record = records.pop
route = records.inject("") do |string, parent|
if parent.is_a?(Symbol) || parent.is_a?(String)
string << "#{parent}"
else
string << "#{RecordIdentifier.send("plural_class_name", parent
)}".singularize
string << "
"
end
end
end

    if record.is_a?(Symbol) || record.is_a?(String)
      route << "#{record}_"
    else
      route << "#{RecordIdentifier.__send__("plural_class_name", record)}"
      route = route.singularize if inflection == :singular
      route << "_"
    end

    action_prefix(options) + namespace + route + routing_type(options).to_s
  end

<<--

posted by genki genki on Wed 1 Apr 2009 at 13:13 with 0 comments

Railsでモデルのバージョン管理を行うというと、
acts_as_versionedを使うのが一般的でしたが、
しばらくメンテナンスされていないのと、githubでforkがカオス状態になっていて、公式ドキュメントと実装が一致しなくなっているなど、ちょっと使いにくい状況になっているようなので、それ以外の選択肢を調べてみました。

  • version_fu
    かなりシンプルな作り。ソースは100行程度。そのぶん、Versionedテーブルの作成などは自動でやってくれない。
  • SimplyVersioned こちらもシンプル路線。Versionedテーブルを使わずに、1つのテーブルでhas_manyアソシエーションを使って管理するタイプ。validates_uniqueness_ofとかを使っていないならこれでも良いかな。
  • acts_as_versioned_association
    aavでassociationを含むモデルのバージョニングが出来なかった問題を解決したものらしい。
posted by genki genki on Wed 1 Apr 2009 at 11:39 with 0 comments
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
memojrubymerbGAEDMrubygemお知らせeventcouchdbtipsideajarjogpluginrailsyakadapteraliasbumble
Comments rssrss
瀧内元気 瀧内元気: MacOS版は以下にあります genki/ViMouse 01/16 05:40
dsjf dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これでも出... 01/08 23:23
瀧内元気 瀧内元気: おお、チェックしてみます。thx! 12/24 05:23
overisland overisland: Reeder for iPhone もこの UI を実装していますね。 12/24 05:13
瀧内元気 瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 http:... 12/01 12:20
tkawa tkawa: http://devcenter.heroku.com/articles/rails31_herok... 12/01 10:47
瀧内元気 瀧内元気: どもー。いまはgithubに置いてあります https://github.com/genki/irb... 07/10 08:31
ともち ともち: こんにちは! すばらしいプログラムをありがとうございます。しかし、merbiのドメイン、切れているみ... 07/10 02:30
Services from s21g
MagicBag
MagicBagは、Cloudflare R2やS3互換ストレージをMacのFinderから扱えるファイル同期クライアントです。
アンテナショップめぐり
東京にある全国のアンテナショップ、イベント、特産品を地図や条件から探せるサービスです。
YOMU Web小説リーダー
YOMUは、Web小説の読み上げに特化したiPhoneアプリです。
補助探
公開されている補助金・助成金情報を集約し、条件に合う制度を探しやすくするサービスです。
jotter.me
jotter.meは、考えやアイデア、情報を書き留めるためのノートサービスです。