2005-12-25
ちょっとはまった
Dir.chdir('../test/unit') { require 'background_img_test' }
って書いてて、うまくtesting中にchdirされてねーなと思ったら、Test::Unit::TestCaseって無理矢理ENDに登録してるんだった。END使う方法ってエレガントじゃないと思うんだけど、ruby的にはどうなんかなー。
Subversion ドメインの変更
foo.example.comにURLを設定していたレポジトリをbar.example.comに変更したいんだけどfoo.example.comのレポジトリが見れないと上手くできないぽ?
$ svn switch svn+ssh://foo@bar.example.com/repos
ssh: connect to host foo.example.com port 22: Connection refused
svn: 接続が突然閉じました
むーん
bgmakerのtestを書く
ぞ!いまさらだけど。どうもTDDできねー。こういうAPI作ろう!とか具体的に思った時じゃないとどうしてもコードから先に書き始めてある程度規模になってからtest書くことに。JavaやってないひとでRubyでもTDDでコード書いてる人ってどれぐらいいるんだろ。オレは少なくとも誰も知らない。
そういえば一時期RSpecでtest書いてたけど、結局xUnitであるTest::Unitに戻っちゃった。RSpecで仕様を!みたいなのは解るんだけど、RSpecじゃなきゃできないこと、みたいなのが無くって明確な差違の利点が見いだせなくって。
いわかん
gorou.zapto.org鯖が落ちてるから背景画像が表示されない!なんてこった!
追記:rails2uにへんこうしt
リプルローディング - Google 検索
ひょっとして長瀬語?はめられた?原書だとなんなんだろう。 repull loading ?
HD600のコードを
http://mitsuamikko.hp.infoseek.co.jp/howto.html
DBIx::Classのあれ
http://unknownplace.org/memo/2005/12/25#e002
うーん、RubyのActiveRecordでやってみたけど上手い解決方法みつかんねーなぁ。
class Playlist < ActiveRecord::Base
belongs_to :song, :include => [:artist]
end
で先読みincludeしたところで、playlist[int].song にアクセスした時に得られるsongのインスタンスがリプルローディングでartist読み込んでるだけだし。そのためsong.artistにアクセスしたときのレイジーロードが発生しないためちょびっとだけ高速に。でもartistを参照しないときはもちろんかえって遅くなっちゃうし。なので
Playlist.find(:all, :limit => 10, :order => "created_on DESC", :include => [:song])
で取得してってのがDBIxと同じで一番実装コストは低いけどやっぱ速度がなぁ。
#!/usr/bin/env ruby
$LOAD_PATH << '/home/gorou/src/rails/activerecord/lib/'
require 'active_record'
require 'logger'
require 'pp'
logger = Logger.new(STDOUT)
logger.level = Logger::DEBUG
ActiveRecord::Base.logger = logger
ActiveRecord::Base.establish_connection(
:adapter => "sqlite",
:database => ":memory"
)
class CreateTables < ActiveRecord::Migration
def self.up
create_table :playlists do |t|
t.column :song_id, :integer
t.column :created_on, :timestamp
t.column :updated_on, :timestamp
end
create_table :songs do |t|
t.column :name, :text
t.column :artist_id, :integer
t.column :album_id, :integer
end
create_table :albums do |t|
t.column :name, :text
t.column :artist_id, :integer
end
create_table :artists do |t|
t.column :name, :text
end
Artist.create :name => 'Beatles'
Album.create :name => "Sgt Pepper's Lonely Hearts Club Band", :artist_id => 1
Song.create :name => "Sgt Pepper's Lonely Hearts Club Band", :artist_id => 1, :album_id => 1
Song.create :name => "With A Little Help From My Friends", :artist_id => 1, :album_id => 1
Song.create :name => "Lucy In The Sky With Diamonds", :artist_id => 1, :album_id => 1
Song.create :name => "Getting Better", :artist_id => 1, :album_id => 1
Song.create :name => "Fixing A Hole", :artist_id => 1, :album_id => 1
Song.create :name => "She's Leaving Home", :artist_id => 1, :album_id => 1
Song.create :name => "Being For The Benefit Of Mr. Kite!", :artist_id => 1, :album_id => 1
Song.create :name => "Within You Without You", :artist_id => 1, :album_id => 1
Song.create :name => "When I'm Sixty-four", :artist_id => 1, :album_id => 1
Song.create :name => "Lovely Rita", :artist_id => 1, :album_id => 1
Song.create :name => "Good Morning Good Morning", :artist_id => 1, :album_id => 1
Song.create :name => "Sgt Pepper's Lonely Hearts Club Band (Reprise)", :artist_id => 1, :album_id => 1
Song.create :name => "A Day In The Life", :artist_id => 1, :album_id => 1
c = Song.count
c.times{ Playlist.create :song_id => rand(c).succ }
end
def self.down
drop_table :playlists
drop_table :songs
drop_table :albums
drop_table :artists
end
end
class Playlist < ActiveRecord::Base
belongs_to :song, :include => [:artist]
end
class Song < ActiveRecord::Base
has_many :playlists
belongs_to :artist
belongs_to :album
end
class Album < ActiveRecord::Base
has_many :songs
belongs_to :album
end
class Artist < ActiveRecord::Base
has_many :songs
has_many :albums
end
begin;CreateTables.down ; rescue; end
CreateTables.up
Playlist.benchmark('default', Logger::DEBUG, false) do
playlists = Playlist.find(:all, :limit => 10, :order => "created_on DESC")
playlists.each do |playlist|
playlist.song.name
playlist.song.artist.name
end
end
Playlist.benchmark('include', Logger::DEBUG, false) do
playlists = Playlist.find(:all, :limit => 10, :order => "created_on DESC", :include => [:song])
playlists.each do |playlist|
playlist.song.name
playlist.song.artist.name
end
end
gorou.zapto.org 鯖
鯖の電源がご臨終らしく、年内復旧は無理とのこと。ご報告ありがとうございました!
ARのexample
うお
require 'active_record'
require 'logger'; class Logger; def format_message(severity, timestamp, msg, progname) "#{msg}\n" end; end
なんだかなー。
曽我部
脳内でどうしても「そがぶ」と読んでしまう。
ぱにぽにだっしゅ!の
オマージュでリスペクトでトリビュートっぷりはホント素晴らしすぎるなぁ。
トナカイ
http://blog.livedoor.jp/asuka_ruike/archives/50261503.html
あー。まぁサンタと云うよりはトナカイだよね。
- 出版社/メーカー: ジーオーティー
- 発売日: 2005/12/22
- メディア: DVD
- クリック: 66回
- この商品を含むブログ (4件) を見る
本日新作発売!って開き直ってるなぁ、、、。樽ブームは終わった。
fubのお気に入りをmigemoインクリメンタルサーチでしぼって開く
bookmarkletで使うとき便利すぎ。さくっと快感がないもっさりブラウザはダメだわぁ。
↓の
べんりだわぁ。RSSなひとらとよくしらないひとらのを消したらすっきりした。
マイミクの友人の最新日記を表示させなくするbookmarklet
誰か作ってそうだけど。マイミク管理使いにくすぎ。
javascript:(function(){var h=location.href;var m=(h.match(/owner_id=(\d+)/))||(h.match(/[^_a-zA-Z]id=(\d+)/));if(m)location.href='http://mixi.jp/delete_diary_friend.pl?id='+m[1];})();
ばらすと
(function(){
var h = location.href;
var m = (h.match(/owner_id=(\d+)/)) || (h.match(/[^_a-zA-Z]id=(\d+)/));
if(m) location.href = 'http://mixi.jp/delete_diary_friend.pl?id=' + m[1];
})();