RESTなWebサービスをマウントするRESTファイルシステム、FUSEで作ってみた FUSE REST Ruby
2007-06-24
FUSE用のRubyライブラリで、FuseFSてのがあるのを最近知った
RubyのFuseFS使ってtwitter file systemを作ってみた
Rubyで手軽にファイルシステムを構築できるそうな。面白そうなので、ひとつ試しにRESTなWebサービスをローカルにマウントするRESTファイルシステムを作ってみた。
(http://localhost:3000/books/3.xml へアクセスして中身を表示)
あと外部Webサービスをローカルにマウント!てのがやりたかったので、TwitterとTumblrのAPIをマウントしてみた。
$ cat ~/restfs/TwitterStatus/user_timeline/117011742/text > ~/restfs/TumblrAPI/write
こんな感じで普通にファイル操作をすると、Twitter http://twitter.com/tkmr/statuses/117011742 から Tumblr http://tkmr.tumblr.com/post/4104854 へポスト。
サーバ準備
手始めに手元にあったこんなクラスへアクセスしてみる、Railsでさくっと。
ruby script/generate scaffold_resource Book title:string rate:int review:string
//タイトル(title)とレビュー(review)を文字列でレート(rate)をIntで持つBookクラス
ruby script/srever start で待ち受けておく
開発環境の準備
自分のPCはMacなので、MacFUSEをインストール
http://code.google.com/p/macfuse/
今回は MacFUSE-Core-0.4.0.dmg をダウンロード、普通にインストール
FUSEへのRubyブリッジFuseFS、MacOSX対応した物が↓らしいので
http://www.datanoise.com/articles/2007/3/9/macfuse-and-ruby-fusefs-extension
svn co http://svn.datanoise.com/fusefs-osx
cd fusefs-osx
make
sudo make install
インストール、すんなり上手くいった
あとActiveResourceを単体で使いたいので
sudo gem install activeresource --source http://gems.rubyonrails.org
gemから入れておいた
CRUDを実装
RubyでFuseFS::MetaDirを継承したクラスを実装していく、適当に以下のようにしてみました。富豪的プログラミングだなー
require 'fusefs' class RESTfs < FuseFS::MetaDir def initialize resource @resource=resource end #カレントディレクトリーのファイル一覧を返す - ls dirname/ def contents path action, id, key = scan_path path unless action then return @resource.actions end unless id then resources = action=="all" ? @resource.find(:all) : @resource.find(action) return resources.map{|r| r.id.to_s } end @resource.find(id).attributes.keys end #ディレクトリーとファイルの判定 def directory? path action, id, key = scan_path path key ? false : true end def file? path !directory?(path) end #ファイルの中身を返す - cat filename def read_file path action, id, key = scan_path path item = @resource.find(id) item.attributes[key].to_s + "\n" end def size(path) read_file(path).size end #ファイルへ書き込み - echo "hoge" > filename def can_write? path file?(path) end def write_to path, body action, id, key = scan_path path if key then item = @resource.find(id) item[key] = body item.save end end #ファイル削除 - rm filename def can_delete? path file?(path) end def delete path action, id, key = scan_path path @resource.find(id).destroy if id end #フォルダ作成 - mkdir newdir def can_mkdir? path false end def mkdir path end #フォルダ削除 - rmdir dirname def can_rmdir? path action, id, key = scan_path path return false if key id ? true : false end def rmdir path action, id, key = scan_path path @resource.find(id).destroy if id end end
ざっくりとCRUD一通り書いたので使ってみる
require 'restfs' require 'rubygems' gem 'activeresource' require 'active_resource' class Book < ActiveResource::Base self.site = "http://localhost:3000/" self.logger = Logger.new($stderr) def self.actions ["all"] end end if (File.basename($0) == File.basename(__FILE__)) root = FuseFS::MetaDir.new root.mkdir("/Book", RESTfs.new(Book)) FuseFS.set_root(root) FuseFS.mount_under(ARGV[0]) FuseFS.run end
これをターミナルで立ち上げる ruby bookfs.rb ~/restfs/(ホームへrestfsという空ディレクトリを作成しておく)
~ tatsuya$ cd restfs/Book ~/restfs/Book tatsuya$ ls all ~/restfs/Book tatsuya$ cd all ~/restfs/Book/all tatsuya$ ls 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 8 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 7 9 ~/restfs/Book/all tatsuya$ cd 3 ~/restfs/Book/all/3 tatsuya$ ls id rate review title ~/restfs/Book/all/3 tatsuya$ cat title ~/restfs/Book/all/3 tatsuya$ ~/restfs/Book/all/3 tatsuya$ cat title てすとタイトル ~/restfs/Book/all/3 tatsuya$ ls -ltr >> title ~/restfs/Book/all/3 tatsuya$ cat title てすとタイトル total 4 -rw-rw-rw- 1 tatsuya tatsuya 16 6 23 16:02 title -rw-rw-rw- 1 tatsuya tatsuya 13 6 23 16:02 review -rw-rw-rw- 1 tatsuya tatsuya 2 6 23 16:02 rate -rw-rw-rw- 1 tatsuya tatsuya 2 6 23 16:02 id ~/restfs/Book/all/3 tatsuya$
普通にローカルファイルのように操作できる。お手軽で楽しいな〜、サーバ側のログを見ると
GET http://localhost:3000/books.xml --> 200 OK (4775b 0.37s) GET http://localhost:3000/books/3.xml --> 200 OK (224b 0.32s) GET http://localhost:3000/books/3.xml --> 200 OK (224b 0.33s) ・・・・・・・・・・・・・・ PUT http://localhost:3000/books/3.xml --> 200 OK (1b 0.32s)
GETアクセスが大変なことに!!富豪的だが気にしない
次は外部サービスをマウントしてみる、TwitterAPIとTumblrAPIをマウントしてTwitterから取ってきた発言をTumblrへポスト。まずTwitterから
module Twitter USER = "Twitterアカウント" PASSWORD = "パスワード" class Status < ActiveResource::Base self.site = "http://#{Twitter::USER}:#{Twitter::PASSWORD}@twitter.com/" self.logger = Logger.new($stderr) def self.actions ["public_timeline","user_timeline","friend_timeline"] end def self.find *args if args[0].to_s.to_i.to_s.size == args[0].to_s.size then super("show/#{args[0]}") else self.get(args).map {|r| self.new(r) } end end end end
とりあえずReadだけ。Tumblrも同じように書こう思ったけどAPIとActiveResourceが相性悪そうだったので普通にNet::HTTPでアクセスした、ソースは長くなったので一応最後に貼り付けときます。それではマウントして試してみる
root = FuseFS::MetaDir.new root.mkdir("/TwitterStatus", RESTfs.new(Twitter::Status)) root.mkdir("/TumblrAPI", Tumblr::ApiFS.new) FuseFS.set_root(root) FuseFS.mount_under(ARGV[0]) FuseFS.run
これを実行してマウント、次に別のターミナルを立ち上げて普通にシェルからファイル操作してみる
#ローカルファイルとしてアクセスすれば ~/restfs/TwitterStatus/public_timeline tatsuya$ ls 117011742 created_at id text user ~/restfs/TwitterStatus/public_timeline tatsuya$ cat 117011742/text なんかさっきtwitter落ちてた? #TwitterAPIへアクセスしている GET http://twitter.com:80/statuses/show/117011742.xml --> 200 OK (589b 0.43s) #Twitterの発言をTumblrへポスト ~/restfs/TwitterStatus/public_timeline tatsuya$ cat 117011742/text > ~/restfs/TumblrAPI/write
OKぽい。
$ cat ~/restfs/TwitterStatus/user_timeline/117011742/text > ~/restfs/TumblrAPI/write
で、Twitter http://twitter.com/tkmr/statuses/117011742 から Tumblr http://tkmr.tumblr.com/post/4104854 へポスト。
本当は $cat ~/restfs/TwittreStatus/user_timeline/* | grep `date +%Y%m%d` | ~/restfs/TumblrAPI/write とかシェルスクリプトに書いて、cronで自動更新にして。本物のUNIXパイプでWebサービスをマッシュアップ! Web1.0世代のPlagger (w みたいなネタを書きたかったけど、時間が無くなったのでそれはまた今度。
しかし面白いね〜FuseFS。RSSfsなんて作ると面白いかも、またはAtomPPfsとか。ただMacのFinderで外部サービスのフォルダを開くとかなり激しいアタックがWebサービスへ行くのでw やっぱ実用的では無いな、LAN内にあるサーバへ繋ぐならなんとかなるかも。あとちゃんとキャッシュの仕組みを作ればまた別だろうけど。
それにしてもweb上のリソース とローカル上のリソースが混在する環境って楽しいね。ネットOSというか、ネット上のリソースをローカルリソースと同じ意識で扱う(またはネット上に全てのリソースを置く)ことが実用的になったら、その用途に最適化したOSが出てくるのかな。そうすると通信速度の進化はまだまだ続く必要があるな、今のローカルHDDがSerialATA接続で 1.2Gbps/秒 と考えれば家庭用の光ファイバーでも単純な速度は何とかなりそう?むしろサーバの負荷やネットのハブになるエクスチェンジポイントの負荷が問題なのかも。データセンタ内でサーバを分散しても、回線の負荷は下がらないので、全体でみるとデータセンタの分散が良いのかな。
あと回線速度が十分高速になっても、日本からアメリカのWebサービスにアクセスするならレイテンシが問題になるのか、、どんな技術でも光速が限界になるから1秒で地球7周半、ls コマンド打って結果が返るまで最速0.1秒は遅いか早いか。いくら回線速度が早くてもレイテンシが高いとスーファミのスト2ターボみたいになるのかな?w そうするとやっぱデータセンタの分散やWinnyみたいな情報のキャッシュを分散するモデルが有効になってくるのかな、光速の限界を超えるためにプロセスを微細化する最近のCPUみたい。速度が伸びないなら距離を縮めよう、みたいな。
じゃあ究極の負荷分散はP2Pでクライアントをサーバにして、負荷の中心を無くしてしまうのが良いのかな?Google GearでブラウザがストレージとWebサーバを持ったから、あとはクロスサイトアクセスの制限を取っ払っちゃえばw どうだろ。データの同期・整合性は取り難くなるのでサーバ型とのハイブリットとか、例えばニコニコ動画のコメントは軽いのでサーバで同期して、映像はBittorrent的なモデルで配信するとか・・・・・
うーんなんだろ。まあ結論としては、FUSEfs面白い:)ということで
===============================================
一応TumblrFSのソースを↓に貼っておきます、適当ですが。
module Tumblr USER = "ユーザ名" SITE = "http://#{USER}.tumblr.com/api" EMAIL = "mailアドレス" PASS = "パスワード" class ApiFS < FuseFS::MetaDir def contents path ["read","write"] end def directory? path false end def file? path !directory?(path) end def read_file path action, hoge = scan_path(path) return "Please insert a text!!\n" if action=="write" result = "" open("#{SITE}/#{action}") do |f| result += f.read end result end def size path read_file(path).size end def can_write? path scan_path(path)[0]=="write" end def write_to path, text if can_write?(path) then begin title = text body = text param = "" {"email"=>EMAIL,"password"=>PASS,"type"=>"regular","title"=>title,"body"=>body}.each do |key,value| param += "#{key}=#{URI.encode(value)}&" end param.chomp!("&") res = Net::HTTP.start("www.tumblr.com", 80) do |http| http.post("/api/write", param, {'Content-type'=>'application/x-www-form-urlencoded'}) end rescue p "Email or Password error!! : tumblr" end end end def can_delete? path can_write? path end def delete path end def can_mkdir? path false end def mkdir path end def can_rmdir? path false end def rmdir path end end end
コメント
car bumper protection「Sorry :( [URL=http://delta-ford.tonkinhonda.cn/mercedes-car-dealer-in-amarillo-texas.htm#] mercedes car dealer in amarillo texas [/URL] <a href=" http://delta-ford.tonkinhonda.cn/mercedes-car-dealer-in-amarillo-texas.htm "> mercedes car dealer in amarillo texas </a> http://delta-ford.tonkinhonda.cn/mercedes-car-dealer-in-amarillo-texas.htm mercedes car dealer in amarillo texas [URL=http://lee-chrysler.tonkinhonda.cn/oldsmobile-car.htm#] oldsmobile car [/URL] <a href=" http://lee-chrysler.tonkinhonda.cn/oldsmobile-car.htm "> oldsmobile car </a> http://lee-chrysler.tonkinhonda.cn/oldsmobile-car.htm oldsmobile car [URL=http://reinz-bmw.tonkinhonda.cn/ferrari-599-gtbwallpaper.htm#] ferrari 599 gtbwallpaper [/URL] <a href=" http://reinz-bmw.tonkinhonda.cn/ferrari-599-gtbwallpaper.htm "> ferrari 599 gtbwallpaper </a> http://reinz-bmw.tonkinhonda.cn/ferrari-599-gtbwallpaper.htm ferrari 599 gtbwallpaper [URL=http://ford-rules.tonkinhonda.cn/alfa-county-orange-romeo.htm#] alfa county orange romeo [/URL] <a href=" http://ford-rules.tonkinhonda.cn/alfa-county-orange-romeo.htm "> alfa county orange romeo </a> http://ford-rules.tonkinhonda.cn/alfa-county-orange-romeo.htm alfa county orange romeo [URL=http://www.tonkinhonda.cn/cadillac-biarritz-feature.htm#] cadillac biarritz feature [/URL] <a href=" http://www.tonkinhonda.cn/cadillac-biarritz-feature.htm "> cadillac biarritz feature </a> http://www.tonkinhonda.cn/cadillac-biarritz-feature.htm cadillac biarritz feature 」
driveway dodge「Sorry :( [URL=http://saidie-ford.sarasotamazda.cn/japan-ese-use-cars.htm#] japan ese use cars [/URL] <a href=" http://saidie-ford.sarasotamazda.cn/japan-ese-use-cars.htm "> japan ese use cars </a> http://saidie-ford.sarasotamazda.cn/japan-ese-use-cars.htm japan ese use cars [URL=http://www.sarasotamazda.cn/honda-stream-picture.htm#] honda stream picture [/URL] <a href=" http://www.sarasotamazda.cn/honda-stream-picture.htm "> honda stream picture </a> http://www.sarasotamazda.cn/honda-stream-picture.htm honda stream picture [URL=http://ouirsman-ford.sarasotamazda.cn/hot-grips-bmw-motorcycles.htm#] hot grips bmw motorcycles [/URL] <a href=" http://ouirsman-ford.sarasotamazda.cn/hot-grips-bmw-motorcycles.htm "> hot grips bmw motorcycles </a> http://ouirsman-ford.sarasotamazda.cn/hot-grips-bmw-motorcycles.htm hot grips bmw motorcycles [URL=http://bmw-delerships.sarasotamazda.cn/aerodynamic-bmw-kit-x3.htm#] aerodynamic bmw kit x3 [/URL] <a href=" http://bmw-delerships.sarasotamazda.cn/aerodynamic-bmw-kit-x3.htm "> aerodynamic bmw kit x3 </a> http://bmw-delerships.sarasotamazda.cn/aerodynamic-bmw-kit-x3.htm aerodynamic bmw kit x3 [URL=http://daewoo-42.sarasotamazda.cn/jeep-scrambler-forum.htm#] jeep scrambler forum [/URL] <a href=" http://daewoo-42.sarasotamazda.cn/jeep-scrambler-forum.htm "> jeep scrambler forum </a> http://daewoo-42.sarasotamazda.cn/jeep-scrambler-forum.htm jeep scrambler forum 」
dulles used cars「Interesting... [URL=http://lamborghini-president.liftedjeep.cn/honda-morgantown-kentucky.htm#] honda morgantown kentucky [/URL] <a href=" http://lamborghini-president.liftedjeep.cn/honda-morgantown-kentucky.htm "> honda morgantown kentucky </a> http://lamborghini-president.liftedjeep.cn/honda-morgantown-kentucky.htm honda morgantown kentucky [URL=http://volvo-map.liftedjeep.cn/bargin-mart-used-cars-louisville-ky.htm#] bargin mart used cars louisville ky [/URL] <a href=" http://volvo-map.liftedjeep.cn/bargin-mart-used-cars-louisville-ky.htm "> bargin mart used cars louisville ky </a> http://volvo-map.liftedjeep.cn/bargin-mart-used-cars-louisville-ky.htm bargin mart used cars louisville ky [URL=http://staunton-subaru.liftedjeep.cn/bell-ford-of-colonia-nj.htm#] bell ford of colonia nj [/URL] <a href=" http://staunton-subaru.liftedjeep.cn/bell-ford-of-colonia-nj.htm "> bell ford of colonia nj </a> http://staunton-subaru.liftedjeep.cn/bell-ford-of-colonia-nj.htm bell ford of colonia nj [URL=http://lamborghini-president.liftedjeep.cn/custom-car-care-decatur.htm#] custom car care decatur [/URL] <a href=" http://lamborghini-president.liftedjeep.cn/custom-car-care-decatur.htm "> custom car care decatur </a> http://lamborghini-president.liftedjeep.cn/custom-car-care-decatur.htm custom car care decatur [URL=http://mazda-2.liftedjeep.cn/wallwork-ford-fargo.htm#] wallwork ford fargo [/URL] <a href=" http://mazda-2.liftedjeep.cn/wallwork-ford-fargo.htm "> wallwork ford fargo </a> http://mazda-2.liftedjeep.cn/wallwork-ford-fargo.htm wallwork ford fargo 」
salary car audio installer「Cool. [URL=http://buick-car.cadillacanderson.cn/north-country-toyota.htm#] north country toyota [/URL] <a href=" http://buick-car.cadillacanderson.cn/north-country-toyota.htm "> north country toyota </a> http://buick-car.cadillacanderson.cn/north-country-toyota.htm north country toyota [URL=http://honda-pc800.cadillacanderson.cn/extreme-jeeps.htm#] extreme jeeps [/URL] <a href=" http://honda-pc800.cadillacanderson.cn/extreme-jeeps.htm "> extreme jeeps </a> http://honda-pc800.cadillacanderson.cn/extreme-jeeps.htm extreme jeeps [URL=http://buick-car.cadillacanderson.cn/toyota-prius-incentives-financing.htm#] toyota prius incentives financing [/URL] <a href=" http://buick-car.cadillacanderson.cn/toyota-prius-incentives-financing.htm "> toyota prius incentives financing </a> http://buick-car.cadillacanderson.cn/toyota-prius-incentives-financing.htm toyota prius incentives financing [URL=http://kingsbay-honda.cadillacanderson.cn/avril-lavigne-car.htm#] avril lavigne car [/URL] <a href=" http://kingsbay-honda.cadillacanderson.cn/avril-lavigne-car.htm "> avril lavigne car </a> http://kingsbay-honda.cadillacanderson.cn/avril-lavigne-car.htm avril lavigne car [URL=http://honda-tallahassee.cadillacanderson.cn/dodge-troubleshooting-codes-p0106.htm#] dodge troubleshooting codes p0106 [/URL] <a href=" http://honda-tallahassee.cadillacanderson.cn/dodge-troubleshooting-codes-p0106.htm "> dodge troubleshooting codes p0106 </a> http://honda-tallahassee.cadillacanderson.cn/dodge-troubleshooting-codes-p0106.htm dodge troubleshooting codes p0106 」
ewald chevrolet oconomowoc「Cool. [URL=http://ford-savannah.tiltonford.cn/budget-car-cyprus-hire.htm#] budget car cyprus hire [/URL] <a href=" http://ford-savannah.tiltonford.cn/budget-car-cyprus-hire.htm "> budget car cyprus hire </a> http://ford-savannah.tiltonford.cn/budget-car-cyprus-hire.htm budget car cyprus hire [URL=http://ford-savannah.tiltonford.cn/honda-metropolitan-scooter.htm#] honda metropolitan scooter [/URL] <a href=" http://ford-savannah.tiltonford.cn/honda-metropolitan-scooter.htm "> honda metropolitan scooter </a> http://ford-savannah.tiltonford.cn/honda-metropolitan-scooter.htm honda metropolitan scooter [URL=http://ford-gpa.tiltonford.cn/race-car-driving-lessons.htm#] race car driving lessons [/URL] <a href=" http://ford-gpa.tiltonford.cn/race-car-driving-lessons.htm "> race car driving lessons </a> http://ford-gpa.tiltonford.cn/race-car-driving-lessons.htm race car driving lessons [URL=http://opel-monovolume.tiltonford.cn/ford-sorens.htm#] ford sorens [/URL] <a href=" http://opel-monovolume.tiltonford.cn/ford-sorens.htm "> ford sorens </a> http://opel-monovolume.tiltonford.cn/ford-sorens.htm ford sorens [URL=http://ford-savannah.tiltonford.cn/bmw-film-uma-thurman.htm#] bmw film uma thurman [/URL] <a href=" http://ford-savannah.tiltonford.cn/bmw-film-uma-thurman.htm "> bmw film uma thurman </a> http://ford-savannah.tiltonford.cn/bmw-film-uma-thurman.htm bmw film uma thurman 」
solar car motors「Interesting... [URL=http://york-nissan.futerecar.cn/2003-door-handle-sequoia-toyota.htm#] 2003 door handle sequoia toyota [/URL] <a href=" http://york-nissan.futerecar.cn/2003-door-handle-sequoia-toyota.htm "> 2003 door handle sequoia toyota </a> http://york-nissan.futerecar.cn/2003-door-handle-sequoia-toyota.htm 2003 door handle sequoia toyota [URL=http://brillon-toyota.futerecar.cn/mco-rental-car-convertabile.htm#] mco rental car convertabile [/URL] <a href=" http://brillon-toyota.futerecar.cn/mco-rental-car-convertabile.htm "> mco rental car convertabile </a> http://brillon-toyota.futerecar.cn/mco-rental-car-convertabile.htm mco rental car convertabile [URL=http://durrand-toyota.futerecar.cn/car-accidents-senior-citizens.htm#] car accidents senior citizens [/URL] <a href=" http://durrand-toyota.futerecar.cn/car-accidents-senior-citizens.htm "> car accidents senior citizens </a> http://durrand-toyota.futerecar.cn/car-accidents-senior-citizens.htm car accidents senior citizens [URL=http://suzuki-4x4.futerecar.cn/angeles-rental-car.htm#] angeles rental car [/URL] <a href=" http://suzuki-4x4.futerecar.cn/angeles-rental-car.htm "> angeles rental car </a> http://suzuki-4x4.futerecar.cn/angeles-rental-car.htm angeles rental car [URL=http://anderson-chevrolet.futerecar.cn/physics-engineering-for-the-chrysler-building.htm#] physics engineering for the chrysler building [/URL] <a href=" http://anderson-chevrolet.futerecar.cn/physics-engineering-for-the-chrysler-building.htm "> physics engineering for the chrysler building </a> http://anderson-chevrolet.futerecar.cn/physics-engineering-for-the-chrysler-building.htm physics engineering for the chrysler building 」
ford racing series home「interesting [URL=http://ford-mirrors.irvinetoyota.cn/frank-butcher-car-lot.htm#] frank butcher car lot [/URL] <a href=" http://ford-mirrors.irvinetoyota.cn/frank-butcher-car-lot.htm "> frank butcher car lot </a> http://ford-mirrors.irvinetoyota.cn/frank-butcher-car-lot.htm frank butcher car lot [URL=http://honda-factory.irvinetoyota.cn/1999-chrysler-300-heated-seats-trouble.htm#] 1999 chrysler 300 heated seats trouble [/URL] <a href=" http://honda-factory.irvinetoyota.cn/1999-chrysler-300-heated-seats-trouble.htm "> 1999 chrysler 300 heated seats trouble </a> http://honda-factory.irvinetoyota.cn/1999-chrysler-300-heated-seats-trouble.htm 1999 chrysler 300 heated seats trouble [URL=http://honda-factory.irvinetoyota.cn/police-car-chase-games.htm#] police car chase games [/URL] <a href=" http://honda-factory.irvinetoyota.cn/police-car-chase-games.htm "> police car chase games </a> http://honda-factory.irvinetoyota.cn/police-car-chase-games.htm police car chase games [URL=http://honda-factory.irvinetoyota.cn/diecast-car-displays.htm#] diecast car displays [/URL] <a href=" http://honda-factory.irvinetoyota.cn/diecast-car-displays.htm "> diecast car displays </a> http://honda-factory.irvinetoyota.cn/diecast-car-displays.htm diecast car displays [URL=http://daewoo-crane.irvinetoyota.cn/2cv-equivalent-cars.htm#] 2cv equivalent cars [/URL] <a href=" http://daewoo-crane.irvinetoyota.cn/2cv-equivalent-cars.htm "> 2cv equivalent cars </a> http://daewoo-crane.irvinetoyota.cn/2cv-equivalent-cars.htm 2cv equivalent cars 」
pillars of the mercedes production system「Cool... [URL=http://car-planet.vincenzoferrari.cn/car-dealer-west-salem.htm#] car dealer west salem [/URL] <a href=" http://car-planet.vincenzoferrari.cn/car-dealer-west-salem.htm "> car dealer west salem </a> http://car-planet.vincenzoferrari.cn/car-dealer-west-salem.htm car dealer west salem [URL=http://ford-burnouts.vincenzoferrari.cn/skoda-import-book-values.htm#] skoda import book values [/URL] <a href=" http://ford-burnouts.vincenzoferrari.cn/skoda-import-book-values.htm "> skoda import book values </a> http://ford-burnouts.vincenzoferrari.cn/skoda-import-book-values.htm skoda import book values [URL=http://mercedes-astros.vincenzoferrari.cn/jeep-40.htm#] jeep 40 [/URL] <a href=" http://mercedes-astros.vincenzoferrari.cn/jeep-40.htm "> jeep 40 </a> http://mercedes-astros.vincenzoferrari.cn/jeep-40.htm jeep 40 [URL=http://ashland-mazda.vincenzoferrari.cn/mazda-premier-at-georgetown-texas.htm#] mazda premier at georgetown texas [/URL] <a href=" http://ashland-mazda.vincenzoferrari.cn/mazda-premier-at-georgetown-texas.htm "> mazda premier at georgetown texas </a> http://ashland-mazda.vincenzoferrari.cn/mazda-premier-at-georgetown-texas.htm mazda premier at georgetown texas [URL=http://parts-chevrolet.vincenzoferrari.cn/2009-ford-taurus-x.htm#] 2009 ford taurus x [/URL] <a href=" http://parts-chevrolet.vincenzoferrari.cn/2009-ford-taurus-x.htm "> 2009 ford taurus x </a> http://parts-chevrolet.vincenzoferrari.cn/2009-ford-taurus-x.htm 2009 ford taurus x 」
bmw 650 cs for sale「Nice [URL=http://pompey-dodge.hondaspecialist.cn/ford-probe-service-manual.htm#] ford probe service manual [/URL] <a href=" http://pompey-dodge.hondaspecialist.cn/ford-probe-service-manual.htm "> ford probe service manual </a> http://pompey-dodge.hondaspecialist.cn/ford-probe-service-manual.htm ford probe service manual [URL=http://batmen-car.hondaspecialist.cn/car-computer-tuning.htm#] car computer tuning [/URL] <a href=" http://batmen-car.hondaspecialist.cn/car-computer-tuning.htm "> car computer tuning </a> http://batmen-car.hondaspecialist.cn/car-computer-tuning.htm car computer tuning [URL=http://toyteck-toyota.hondaspecialist.cn/cheap-uk-used-cars.htm#] cheap uk used cars [/URL] <a href=" http://toyteck-toyota.hondaspecialist.cn/cheap-uk-used-cars.htm "> cheap uk used cars </a> http://toyteck-toyota.hondaspecialist.cn/cheap-uk-used-cars.htm cheap uk used cars [URL=http://batmen-car.hondaspecialist.cn/acura-el-vs-honda-civic.htm#] acura el vs honda civic [/URL] <a href=" http://batmen-car.hondaspecialist.cn/acura-el-vs-honda-civic.htm "> acura el vs honda civic </a> http://batmen-car.hondaspecialist.cn/acura-el-vs-honda-civic.htm acura el vs honda civic [URL=http://pompey-dodge.hondaspecialist.cn/oregon-used-cars-for-sale.htm#] oregon used cars for sale [/URL] <a href=" http://pompey-dodge.hondaspecialist.cn/oregon-used-cars-for-sale.htm "> oregon used cars for sale </a> http://pompey-dodge.hondaspecialist.cn/oregon-used-cars-for-sale.htm oregon used cars for sale 」

bmw f650gs for tall riders「Cool... [URL=http://porsche-scoops.hyundaiverna.cn/toyota-w56-transmission.htm#] toyota w56 transmission [/URL] <a href=" http://porsche-scoops.hyundaiverna.cn/toyota-w56-transmission.htm "> toyota w56 transmission </a> http://porsche-scoops.hyundaiverna.cn/toyota-w56-transmission.htm toyota w56 transmission [URL=http://ford-verification.hyundaiverna.cn/ford-ranger-rear-abs.htm#] ford ranger rear abs [/URL] <a href=" http://ford-verification.hyundaiverna.cn/ford-ranger-rear-abs.htm "> ford ranger rear abs </a> http://ford-verification.hyundaiverna.cn/ford-ranger-rear-abs.htm ford ranger rear abs [URL=http://car-blocks.hyundaiverna.cn/volvo-penta-4-cylinder.htm#] volvo penta 4 cylinder [/URL] <a href=" http://car-blocks.hyundaiverna.cn/volvo-penta-4-cylinder.htm "> volvo penta 4 cylinder </a> http://car-blocks.hyundaiverna.cn/volvo-penta-4-cylinder.htm volvo penta 4 cylinder [URL=http://cadillac-concord.hyundaiverna.cn/chevrolet-narragansett.htm#] chevrolet narragansett [/URL] <a href=" http://cadillac-concord.hyundaiverna.cn/chevrolet-narragansett.htm "> chevrolet narragansett </a> http://cadillac-concord.hyundaiverna.cn/chevrolet-narragansett.htm chevrolet narragansett [URL=http://daimer-chrysler.hyundaiverna.cn/chevrolet-upland.htm#] chevrolet upland [/URL] <a href=" http://daimer-chrysler.hyundaiverna.cn/chevrolet-upland.htm "> chevrolet upland </a> http://daimer-chrysler.hyundaiverna.cn/chevrolet-upland.htm chevrolet upland 」