2007年 10月 29日

GranParadiso

Firefox の history.dat の形式に嫌気がさした (パーサ書いたけど、大量のヒストリあると重くて使えない……) ので Fx3 に乗りかえるお><
GranParadiso Alpha8 入れた! 常用してやる!!!! (FireBug と Greasemonkey がない時点でむり)

userChrome.js が有効なっているけど、hatena のきりかえはどっかバグってるっぽいなぁ

いきなり常用プロファイルで起動して大丈夫かなぁと思ったけど、割と大丈夫っぽい。2.0 に戻れないかもだけど

やばい GM なしで生きていくのはつらい。というか GM 入れてない人ってよくインターネットできるよな……

memo

CREATE TABLE moz_anno_attributes (
	id INTEGER PRIMARY KEY,
	name VARCHAR(32) UNIQUE NOT NULL
)
CREATE TABLE moz_annos (
	id INTEGER PRIMARY KEY,
	place_id INTEGER NOT NULL,
	anno_attribute_id INTEGER,
	mime_type VARCHAR(32) DEFAULT NULL,
	content LONGVARCHAR,
	flags INTEGER DEFAULT 0,
	expiration INTEGER DEFAULT 0,
	type INTEGER DEFAULT 0,
	dateAdded INTEGER DEFAULT 0,
	lastModified INTEGER DEFAULT 0
)
CREATE TABLE moz_bookmarks (
	id INTEGER PRIMARY KEY,
	type INTEGER,
	fk INTEGER DEFAULT NULL,
	parent INTEGER,
	position INTEGER,
	title LONGVARCHAR,
	keyword_id INTEGER,
	folder_type TEXT,
	dateAdded INTEGER,
	lastModified INTEGER
)
CREATE TABLE moz_bookmarks_roots (
	root_name VARCHAR(16) UNIQUE,
	folder_id INTEGER
)
CREATE TABLE moz_favicons (
	id INTEGER PRIMARY KEY,
	url LONGVARCHAR UNIQUE,
	data BLOB,
	mime_type VARCHAR(32),
	expiration LONG
)
CREATE TABLE moz_historyvisits (
	id INTEGER PRIMARY KEY,
	from_visit INTEGER,
	place_id INTEGER,
	visit_date INTEGER,
	visit_type INTEGER,
	session INTEGER
)
CREATE TABLE moz_items_annos (
	id INTEGER PRIMARY KEY,
	item_id INTEGER NOT NULL,
	anno_attribute_id INTEGER,
	mime_type VARCHAR(32) DEFAULT NULL,
	content LONGVARCHAR,
	flags INTEGER DEFAULT 0,
	expiration INTEGER DEFAULT 0,
	type INTEGER DEFAULT 0,
	dateAdded INTEGER DEFAULT 0,
	lastModified INTEGER DEFAULT 0)
CREATE TABLE moz_keywords (
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	keyword TEXT UNIQUE
)
CREATE TABLE moz_places (
	id INTEGER PRIMARY KEY,
	url LONGVARCHAR,
	title LONGVARCHAR,
	rev_host LONGVARCHAR,
	visit_count INTEGER DEFAULT 0,
	hidden INTEGER DEFAULT 0 NOT NULL,
	typed INTEGER DEFAULT 0 NOT NULL,
	favicon_id INTEGER
)

places.sqlite + ActiveRecord

require "rubygems"
require "active_record"
require "active_support"

ActiveRecord::Base.establish_connection(
	:adapter => "sqlite3",
	:database => "places.sqlite"
)

class MozHistoryvisit < ActiveRecord::Base
	belongs_to :place, :class_name => "MozPlaces", :foreign_key => "place_id"
end

class MozPlaces < ActiveRecord::Base
end

p Time.now.yesterday
# なんか 6桁ちがうのでかけてみてる……
# ソースよまないとよくわからなそう
from = Time.now.yesterday.to_i * 1000000

MozHistoryvisit.find(:all, :conditions => ["visit_date > ?", from]).each do |h|
	place = h.place
	puts place.title
	puts place.url
	puts place.visit_count
	puts
end

GranParadiso のロケーションバー補完

なんかちょっと Fx2 よりディレイあるなぁ。

Amalgam

補完候補を生成するプロセスとランチャが実際動いてるプロセスを分離したほうがいいかもなぁ。Ruby のスレッドだと影響しあっちゃうし、マルチコアの恩恵がうけられないし、ごちゃごちゃやったりするので Cocoa と通信してるよこでやったりするとたまに落ちる。起動直後 fork して DRb るのがいいのだろうか

Amalgam 2007-10-29

http://lab.lowreal.net/test/amalgam/Amalgam.2007-10-29.dmg

つかれてきた。プラグインで候補を追加できるのと、サブランチャを作れるところぐらいまでやった。起動がクソ遅い (毎回アプリケーションフォルダスキャンしてるから)

プラギンは ~/.amalgam/plugins において、.d reload_plugins すれば(リ)ロードされるように

プラギン自体は http://coderepos.org/share/wiki/Amalgam#plugins みたいになっていて、候補を生成するとき毎回プラグインの candidates メソッドが呼ばれる (なので必要ならプラギン側でキャッシュする必要がある)

サブランチャは http://coderepos.org/share/browser/lang/ruby/Amalgam/plugins/folders.rb こんなんみるとなんとなくわかるかもしれない。amalgam.sublaunchers 配列に push すると候補を生成するやつ (とフィルタしてソートするメソッド) をそのオブジェクトに委譲する。

サブランチャから戻るには C-b で、サブランチャの中では空白 RET でも選択されたアイテムが実行される (通常は空白 RET はキャンセル扱い)

デバッグコンソールみたいなのをアプリケーション内にもったほうがいいなぁ。SEGV には無力だけど……

GranParadiso に Greasemonkey

強制的に有効にしたら普通につかえた。

https://addons.mozilla.org/ja/firefox/addon/421 が便利っぽい。アイコンがださいけどw

Amalgam Fx ヒストリ

fuzzy 検索にしたくて URL リストをとってきてこっちでやっていたんだけど、重すぎなのと不安定 (スレッドつかってるから) なので、SQL クエリを直接なげるようにした。LIKE をてきとうに投げて、visit_count でソートするようにしてみた。だいたいロケーションバーの補完とにたかんじに

http://coderepos.org/share/changeset/838

設定とかプラグイン

って、すごく気をつかう部分だよなぁ……実装しまくるっていう感じじゃなくて、よく考えて実装して、一度置いて、また考えて、みたいなのを繰り返さないと良い設計にならない……たぶんすごい人はいっきにできてしまうんだろうけど……

スレッドとか DRb とか RubyCocoa のくみあわせ

どうも相性わるくて、落ちるときは確実に落ちるけど、最小再現つくろうとすると落ちない。メインスレッド以外で Obj-c のオブジェクトにアクセスするとまずいっぽいけど確実にそうってわけでもないしなぁ……

ruby のバージョンあげないとだめなのかも

ruby 本体へのパッチってこういう系の問題対処だったんだ

パッチあて済みの libruby がレポジトリにはいっていたのでそれそのままコピーしたら落ちなくなった

cd /usr/lib
sudo mv libruby.1.dylib libruby.1.dylib.orig
sudo cp ~/project/rubycocoa/src/misc/libruby.1.dylib . 

http://rubycocoa.sourceforge.net/EmbedRubyCocoa

2007年 10月 28日

千石原

今日は両親と一緒に千石原へ。昨日の台風のおかげで雲ひとつない。写真を90枚ほどとった。1Gbytes ぐらい。

なんか、あれだけど、観光地の飯屋で、まずいところほど罪深いところはないと思う。観光地自体がつまんないのは別にいいと思うけど、飯屋がまずいのはほんとにあれだと思う。そういう店はさっさと滅びるべきだ。想像したらわかるだろうけど、例えばデートとかで「おいしいお店だといいね!」とかいってそういう店屋に入って、「おいしくなかったね」っていう、そういういたたまれなさとか、嫌じゃないか。もちろん二人でならそういったある種の困難、みたいなものがあっても乗り超えていけるだろうけど、べつにそれはどうだっていい。とにかく、そういうまずい飯を出す店っていうのは、根本的に想像力 (あるいは味覚) が欠如しているんだと思う。

なんか USB のメモリリーダが Windows@SC440 で認識しない。いいけど Mac は無線でつないでで遅いから鯖に転送するのがたいへんだ……というかそろそろ鯖の容量がきつくなってきたのでどうにかしたいけどうにもできない。

「花が終わるとあの清楚な姿は消え、葉が伸び広がり、キャベツのお化けのような姿に変わります」

水芭蕉のことを説明している看板に書いてあったんだけど、なんかちょっと暗い部分があるいいかただよなぁと思った。あと引用だけ書くとどっかの小説にでてきそうだなぁ

IMG_60520077
順光

IMG_60560075

逆光

千石原

というかなんかカップルが結構いて微妙に腹立たしい……と思いきやそうでもなく、なんか今日の自分はいつにも増して妄想力が働いていて、ああ彼らにはこんなストーリーがあったんだろうなぁとか、こんなイベントであんなフラグがたって今ここにいるんだなぁとか考えてにやにやしてたまじきもい。

DSLR

若い女性の一眼はニコン多いなぁ。キムタク効果なのか単に値段なのかはわからないけど……

RAW

Photoshop の現像時のごみとり機能が便利だ。パッチツールみたいなやつだけど、自動で似た色のところを選択するっぽい。いまつかってる一眼がゴミはいってるんだけどどこについているかわからない……開放してとっているときはボケて気にならないけど、絞るとおもっきり写るんだよなぁ

RubyCocoa メモ

  • NSArray の便利メソッドはわりと最近追加された
    • Array とか Enumerable のメソッド
    • 今リリースされているやつだと使えない
  • NSDictionary は Symbol 渡しても String 渡しても同じように扱ってくれる
    • dic[:hoge] dic["hoge"] がおなじ
  • 0 と false は別ものに変換される
    • 最近の修正? かな @window.setOpaque(0) がきかなくて気付いた
    • r1874 かなぁ。0.12.0 が r1925 だから最新リリースでは既にそうだったみたいだ
  • hogehoge= を呼ぶと setHogehoge に変換してくれる
    • これのおかげで @input.stringValue += "hogehoge" とか書ける
  • 最近いろんな Obj-C の inspect がわかりやすくなった。r2038?
    • いちいち p arr.to_a とかしなくてもいいし、p str.to_s とかもする必要ない
    • pp も対応してるらしい r2092?

NS* 系がほぼ Ruby のオブジェクトと同じように扱えるようになってて、あんまり違いを意識する必要がなくてすてき。

2007年 10月 27日

今の Amalgam の曖昧検索と Chemr の補完

r = /(#{str.split(//).map {|c| Regexp.escape(c) }.join(").*?(")})/i
@now.concat @candidates.select {|i|
	r === i.name
}.sort_by {|i|
	# 文字が前のほうに集っているほど高ランクになるように
	m = r.match(i.name)
	(0...m.size).map {|i| m.begin(i) }.inject {|p,i| p + i }
}

もっとうまくかけるかな、というかいいアルゴリズムあるかな……(Chemr にもうつそう)
いまつかってるかぎりだとけっこういい感じ

adp
Adobe Photoshop
fi
Finder
dip
Displays.prefPane
dis
Displays.prefPane
thu
Thunderbird
safa
Safari
tem
Terminal
trm
Terminal
itu
iTunes

みたいにそれっぽくトップにくる。てきとうにうってもあたるのはやっぱいいなぁ。QS もそうだけど


あと Chemr で TAB おしたときに

keys[0].zip(*keys[1..-1]) do |a|
	m = a.first.downcase
	if a.all? {|v| v && (m == v.downcase)}
		common << m
	else
		break
	end
end

ってやってるけど、もっとうまく書けないかなぁ……要素中の先頭から共通の部分を最長でもってくる……

こういうの考えるの苦手すぎる……すなわち頭が悪いというこなんだけど……

Chemr 2007-10-27

http://coderepos.org/share/changeset?new=lang%2Fruby%2FChemr%40759&old=lang%2Fruby%2FChemr%40740

http://lab.lowreal.net/test/chemr/Chemr.2007-10-27.dmg

  • .chm バンドルをサポート
  • 検索結果がなくなった場合自動的に曖昧検索になるように
    • 曖昧検索中はテーブルビューが赤くなる
    • かなり重いのでデフォルトにはできない……