A Day in the Life

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のコードを

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

あー。まぁサンタと云うよりはトナカイだよね。

類家明日香 樽でどうだっ! [DVD]

類家明日香 樽でどうだっ! [DVD]

本日新作発売!って開き直ってるなぁ、、、。樽ブームは終わった。

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];
})();
記事の一覧 >