Google Chromeで使えるRequestPolicy的な拡張機能を作成中

追記:完成しました

高木浩光先生の記事、「NoScript」をやめて「RequestPolicy」にしたを読んで以降、FirefoxではずっとRequestPolicyを使っています。
ただ、今はChromeをメインのブラウザにしているのですが、ChromeではRequestPolicyに代わる拡張機能が見当たらず、だだ漏れなのはあまり気持よくないながらも諦めてそのまま使っていました。
最近、はてなブックマークボタンでmicroadへの送信スクリプトが仕込まれている、という話があったので一念発起してまた探してみると、「KISS Privacy」というのが似た感じだったので使い始めてはみたものの、放置中です。
外部ドメインに画像やスタイルシートを置いているサイトは結構多いのですが、体がRequestPolicyがない状態に慣れてしまっていて、いちいち解除設定するのがおっくうなのでした。RequestPolicyは初期ルールが充実していたのと、あと私も気力がある時期に使い始めたので使い続けられたのかなあと。

今の私のニーズ

  • ラッキングを防ぎたいのがまず主目的なので、いちいち個別ルールを設定していく必要はない。ただし個別ルールも設定できるに越したことはない。
  • 個別にオプトアウトページに行ってオプトアウトするのは面倒だし、そもそもどこからトラッキングされているか普通にアクセスしている分にはわからないのをどうにかしたい。
  • requestのクエリにUAリファラが含まれているのは怪しいので、そういうのは半自動的に止めたい。
  • 全く別のサイトで同じ外部ドメインにアクセスしていたりするのも、トラッキングしようと思えばできてしまうので、気が付くようにしたい。

ちょこちょこ試しながら作っていますが、作りかけのものでいろいろなサイト見てみると、結構トラッキング的なものや外部ドメインアクセス解析的なものを仕込んでるところあるものですね。まあ、広告がつかないとサイト運営立ちいかない、そこまでいかなくても収入を得たい、アクセス解析したい、というのは当然ですし。

RubyでUSBRHのデータを取得する(Windows)

温湿度変化のログを採りたくなっていいものがないか調べていたら、Strawberry LinuxさんのUSBRHがお手ごろ価格だったので購入しました。
USBRHで取得した温湿度のログを採るソフトウェアは複数公開されていますが、細かいことがしたかったのでRubyで操作できるように書いてみました。最初、require 'win32api'して何かちゃちゃっと書いてUSBMeter.dllを操作すれば簡単にできるだろうと思っていましたが、素人にはそんなことなかった……。
試した環境はWindows XPで、Rubyは1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]

USBMeter.DLLをRubyで利用する - The Naked Programmer 2007 - Yahoo!ブログ
USBMeter.DLLをRubyで利用する (続き) - The Naked Programmer 2007 - Yahoo!ブログ
も参考になると思います。

require 'dl/import'

module USBRH
  extend DL::Importer
  dlload "USBMeter.dll"
  extern "char *_FindUSB(long *)"
  extern "long _GetTempHumid(char *, double *, double *)"
  extern "long _SetHeater(char *, long)"
  extern "long _ControlIO(char *, long, long)"
  extern "char *_GetVers(char *)"
  extern "long _GetTempHumidTrue(char *, double *, double *)"
end

class RHDevices
  def initialize
    index = [0].pack('l')
    @devices = {}
    while true
      current_index = index.unpack('l')[0]
      current_device = USBRH._FindUSB(index)
      break if current_device.to_s == ""
      @devices[current_index] = current_device
    end
  end
  
  def size
    @devices.size
  end
  
  def each
    @devices.each{|index,device|
      yield(RHDevice.new(device))
    }
  end
end

class RHDevice
  def initialize(device)
    @device=device
    @temperature = [0].pack('d')
    @humidity = [0].pack('d')
    @heater=false
    @led0=false
    @led1=false
  end

  def name
    @device.to_s
  end

  def version
    USBRH._GetVers(@device).to_s
  end

  def getTempHumid
    if USBRH._GetTempHumid(@device, @temperature, @humidity) == 0
      return @temperature.unpack('d')[0], @humidity.unpack('d')[0]
    else
      return nil,nil
    end
  end

  def getTempHumidTrue
    if USBRH._GetTempHumidTrue(@device, @temperature, @humidity) == 0
      return @temperature.unpack('d')[0], @humidity.unpack('d')[0]
    else
      return nil,nil
    end
  end

  def heater=(flag)
    if flag == true
      USBRH._SetHeater(@device, 1)
    elsif flag == false
      USBRH._SetHeater(@device, 0)
    else
      raise TypeError
    end
    @heater = flag
  end
  attr_reader :heater

  def led0=(flag)
    if flag == true
      USBRH._ControlIO(@device, 0, 1)
    elsif flag == false
      USBRH._ControlIO(@device, 0, 0)
    else
      raise TypeError
    end
    @led0 = flag
  end
  attr_reader :led0

  def led1=(flag)
    if flag == true
      USBRH._ControlIO(@device, 1, 1)
    elsif flag == false
      USBRH._ControlIO(@device, 1, 0)
    else
      raise TypeError
    end
    @led1 = flag
  end
  attr_reader :led1

end

rhdevices=RHDevices.new
rhdevices.each{|device|
  t,h = device.getTempHumid
  puts "name                 : #{device.name}"
  puts "version              : #{device.version}"
  puts "temperature          : #{t}"
  puts "humidity             : #{h}"
  t,h = device.getTempHumidTrue
  puts "corrected temperature: #{t}"
  puts "corrected humidity   : #{h}"
  device.led0=true
  sleep 1
  device.led0=false
  sleep 1
  device.led1=true
  sleep 1
  device.led1=false
=begin
  device.heater=true
  sleep 10
  t,h = device.getTempHumid
  puts "temperature : #{t}"
  puts "humidity    : #{h}"
  device.heater=false
=end
}

金沢スイーツフェア2009でいちごショートを食べる

誘われて、金沢スイーツフェア2009に行ってきました。2014の記事はこちら
朝方は雨で天気が心配でしたが、昼前から晴れて、途中空を見上げたらめずらしく雲ひとつない青空が。
マルガージェラートで駆けつけ一杯、その後は自分の知らない店を中心に、各店のいちごショートケーキを食べたので、記憶があるうちに印象を書いておきます。
こりずに最終日も行ってきました。そのときの印象はこの色で追記しています。

かぼちゃ村 ケーキ屋 ア・ポアン


最初に食べたいちごショート。最初の食べ口の印象としては王道的なショートな感じで、重くもないけれど、そんなに軽くもなく、おいしいけど甘めな感じ。
食べ進めると下段に白い果物が挟まっていて、途中でさっぱりおいしくなって、最後までおいしく食べ進められた。白い果物は白桃? 果物とクリームとケーキのあいまったおいしさに夢中になって、きちんと確認しなかったのが悔やまれる。

洋菓子工房 ドルチェ・カンパーニュ


ア・ポアンとは違って、さっぱりした感じのおいしさ。いちごのへたがしっかりついていて取るのに苦労。スポンジケーキはあっさり。生クリームは軽く、かつ上品。さっくり食べられて、後口もよく、個人的な好みに丁度合致。どれか一つだけ買うならこれかな。
いちごのへたは、最終日に食べたのは取りやすかった。個体差かも。

ケーキ工房 アン・ドゥー


どっしりしているけれど、重くてうっとくる感じでは全くない。重厚なおいしさってあるんだ、と思った。
食後の充実感がすごい。例えが悪いけれど、ストレスで甘いものを沢山食べたくなったときに、このショート一つだけあれば、しっかり満足しそう。

パティスリー ラ・ナチュール


これ、写真のとおり、いちごショートなのにいちごが上にないです。ぱっと見て白っぽすぎて、いちごショートと視認できなかった。注文するとき、この店はいちごのショートがないのかと思って木苺と赤いソースが乗ったケーキを頼みかけた。
この店は生クリームに別格のおいしさを感じる。食べ進めていくと、ごろっとしたいちごは中の下のほうにうずまっている。自分はいちごは最後のほうに食べる派なので、いちごが上に載っていると周りから削っていく食べ方となり、倒れないように気を使うけど、これは食べやすい。

ラ・パレット


食べ比べた中では、やや重めな感じ。普通のショートケーキってこんな感じだよね、うんうん、という感じ。これと次のはお腹のもたれがかなり勝ってきている中での印象なので、割り引く必要あり。

ル・パティシエ マエカワ


会場で最後に食べたいちごショート。食べ口としては、軽くもなく、重くもないけれど、悪い意味では全くない。バランスがとれたおいしさを感じた。

スタジオーネ


これと次のは持ち帰って食べた。傾いたりしているのは箱にぶつけたせい…。ちゃんとした写真はお店のページで。
軽さは標準的。どちらかというと甘めな方で、おいしい。細かく砕いたナッツが入っていたり普通の段々重ね構造ではなかったりと、工夫されている感じで、こういうこともおいしさに繋がっているのかも。

菓子工房 エクラタン


買うときレアチーズケーキのトッピングに惹かれてしまい、ショート食べ歩きという当初の目的を忘れそうになる。ドルチェ・カンパーニュのと同じくらい軽くてさっぱりした感じのおいしさで、好み。
短い時間で食べ比べてはいないので多少怪しいが、こちらはいくらかやさしい感じがした。翌日食べたので、生クリームがすこし変わってしまっていたかもしれない。野々市のほうに行くことがあれば、今度買って味をよくみてみるつもり。
最終日、ドルチェ・カンパーニュのと交互に食べ比べたところ、生クリームだけでもスポンジだけでも全体としてもこちらの方が軽かった。生クリームの口どけ感と軽さは一体どうしているんだろう。標準的な感覚からすると、ドルチェ・カンパーニュのもかなり軽い感じがしたけど、それを超えている。すごい。

金沢エクセルホテル東急


いちごショートの名前が「懐かしの…」というような風になっていた(記憶あやしい)。それを意味してか、生クリームはフレッシュな感じで、スポンジは甘めでカステラっぽい。これが組み合わさったことにより、他の店の感じとちょっと方向性が違うおいしさ。

堀田洋菓子店


いちごムースの層があって、これがちょっぴり酸味があって味覚的に新鮮だった。スポンジはしっかり。全体として甘めにまとまっていて、老舗の味的なおいしさ。

アニバーサリーショップ メープルハウス


メープルハウスはよく行くが、ショートは食べたことがなかった。こうして食べ比べすると、甘めで、軽さは普通。中にもふんだんにいちごがある。王道的なおいしさ。

ぶどうの木


甘めで、軽さも標準的で割としっかりめ。単品で食べ比べしてしまったけど、ご飯後にデザートとして食べるといい感じに満足しそう。

パティスリー ヴェルジェ


甘さはちょっとひかえめ。普通の軽さ。生クリームはそれほど甘くないけど、生クリーム堪能したいときに満足ってくらいしっかり。

感想とか

自分の場合、お店でケーキを選ぶとき、いちごショートはまず頼まず、別のものにしてしまいます。王道すぎて新規性を求めてしまうのと、正直「いちごと生クリームとスポンジケーキだけ」と甘くみていたところがあります。しかし、食べ比べてみるとずいぶん味が違う。そのおいしさも直線的に比べられるものではなく、お店ごとに違う次元でおいしさを開拓していると思いました。フェア以外でこういうことはなかなかできないので、やってよかったなあ。
会場でお腹一杯になって、近くのベンチで空を眺めながらぐったりしていると、隣のベンチにケーキを一個ずつ手にしたカップルがやってきて、語らいながらゆっくり食べはじめました。半分食べたところで、交換してた。これぞ大人の食べ方。

[nicoboom]終了します。ごめんなさい

はてな記法を忘れるくらい間があいてしまいました。
いろいろなことにかまけてnicoboomのメンテナンスを怠っておりました。

Ruby on Rails + MySQLを使って作っていたのですが、昨年夏ぐらいからデータ量増加に伴うレスポンスの低下が目に見えてきて、DBと構成を変えて試している途中でだめな人になってしまった感じです。あとちょっと忙しさにかまけて。言い訳です。

ニコニコチャート様が、うちでやっていたこと+αをされていますし、最近ニコニコ動画を見たら推移とか見れそうな感じになっていて、すこしほっとしました。

webサービスを作るには、思ったことを形にもっていくやる気がまずないと始まらないのではありますが、webサービスを「やっていく」には、それだけでは足りなくて、こつこつと面倒を見る底力のようなものが必要なのだと思いました。

参考にならないと思いますが、nicoboomではMedia TempleのWebホスティングサービス、Grid-Serviceを使っていました。月最低$20でRails + MySQL環境がお手軽に構築できます。ただ、私の場合運用後数ヶ月してDB負荷が閾値を超えて、一昨年10月から最安プランの$20 + MySQLのいっこ高いプランの$20 = $40となりました。あと、去年3月以降は「your RoR Container has run out of available RAM.」ということで、月1回ほどの頻度でRailsのプロセスが停められるようになりました。メールでお知らせが来るので気がついたらリスタートさせていました。これまで4度ほどサポートに拙い英語で質問を書きましたが、いずれも1日くらいで丁寧な回答が帰ってきました。

契約解除前にサーバからデータをダンプしましたがニコニコチャートがあるので十分ですよね。

ニコニコ動画のランキング仕様変更とそれに伴う少しの対応

ニコニコ動画のランキングが少し変わりました。

集計期間・更新タイミングの変更
従来は、デイリーや週間など問わず、1時間毎にデータを更新していましたが、下記の通り変更をしました。

・デイリー:毎日朝5時    〜 翌日朝5時の24時間で集計。
・週間  :毎週月曜日朝5時 〜 翌週月曜日朝5時の1週間で集計。
・月間  :毎月1日朝5時   〜 翌月1日朝5時の1ヶ月で集計。
※集計の後、朝6時にランキングページが更新されます。


ニコニコニュース‐ランキングをリニューアル!

この機会に、データ取得をhtmlからatomに切り替えました。
例:http://www.nicovideo.jp/ranking/mylist/daily/allhttp://www.nicovideo.jp/ranking/mylist/daily/all?rss=atom

で、今更ながら気が付いたこと。
atomでは、いつの時点のデータかが分からないのですね…。
日時モノとしてはfeed要素のupdatedがあるのですが、これはatomを「作った」日時っぽい。
状況証拠

  • 仕組みが変わった昨日は「2008-08-01T14:46:49+09:00」だった
  • 今日は「2008-08-02T05:25:41+09:00」
  • 月間、週間ランキングもなぜか毎日updatedが更新されている

atomでランキングの更新時点(2008-08-02T05:00:00+09:00とか)が分かるとありがたいのだけどなあ…。
自分ならどうするか考えてみました。

  • feed要素にdcterms:issuedを追加する
    • キレイではあるけど、これだけのためにdctermsを宣言するってのはどうなのかね。
  • CDATAの中に<strong class="nico-ranking-updated">を入れ込む
    • entry要素のcontentに入れ込む
      • W3C-DTFで?えー。
    • feed要素のsubtitleをCDATA化して入れ込む
      • subtitleにCDATAってなくない?
  • entry要素のidに書く
    • 動画ページを指示するidがころころ変わるのはどうよ。


うーん。よいアイディアが見つからない。自分なら宣言しまくりに違和感ないので、dcterms:issuedなのだけど…。
あ。発想を変えて、もうupdatedの日時を「出力した」日時(2008-08-02T05:25:41+09:00)ではなく「ランキングを更新した」日時(2008-08-02T05:00:00+09:00)にするという手も。


あとね、feed要素に

<link rel="previous" href="http://www.nicovideo.jp/ranking/mylist/daily/all?rss=atom" />
<link rel="next" href="http://www.nicovideo.jp/ranking/mylist/daily/all?page=3&rss=atom" />

もあればよいと思いました。

(彼|彼女)の主張には背景がある

空中キャンプさんの文章が好きです。
読んだその時々で、ふんふん、そうだよねー、なるほど…などと胸にしまって仕事に出かけたり寝床に入ったりしています。

5月21日の文章、たんすをどこに置くのか - 空中キャンプを読んで、しばらく前から感じ始めたことが自分の中で言語化されたので、書いてみます。


このときの文章では、「新居の内装や家具の配置などで意見が合わなかった」話が取り上げられています。
そして、

たぶん他人ってよくわからない要求をしてくるし、理解しがたいこともあるけれど、それをどうにか許容しなくちゃいけない。

と綴られています。

私もそう思ってました。今でも、前半部分はそう思います。ただ、後半がちょっと変わりました。こんな感じ。*1

たぶん他人ってよくわからない要求をしてくるし、理解しがたいこともあるけれど、その背景を聞かせてもらうことができれば、よくわからない要求が、相手にとって自然な要求って腑に落ちるかもしれない。そして、よくわからない要求をしてくるなあって最初に思ったってことは、そう思うだけの自分の背景が実はあるのだけれど、それを相手に丁寧に伝えられれば、相手も腑に落ちてくれるかも。そしたら、どっちかが溜める感じにはならないかも。

たとえば、ふたり暮しをはじめるとなって、ソファを置く場所の意見が分かれて揉めたとします。片方のうちどちらかがどうでもよかったらそもそも揉めないので、こんなときはどちらもが置く場所について、何らかの思いを持っているということです。
で、そういうとき、ふたりそれぞれ、思いの「背景」ってものが心のどこかにあると思うのです。友達の新居に遊びに行って幸せそうでそのときの配置が心に残っていて私も…と思っただとか、子供のころわびしいソファが居間の端っこにあっただけなのでいずれはと思っていただとか、2ちゃんねるのインテリア板で読んで実行してみたかっただとか、とある映画に出ていてかっこよかっただとか、通販生活のかっこいい写真って大抵この配置だからだとか。具体的に思い当たる節がまったく無かったとしても、もうすこし記憶を広げてみれば、あるかもしれない。親に整理整頓を煩く言われていてその反動で主要な家具は部屋の真ん中にデンと置きたいのだとか、端っこから詰めるのが好きだったりとか、かっこよくみせる経験則として置く位置の比率的なものがあってこの部屋だとこのあたり、だとか。あ。あとこういうこともありうるかな。キミの言うことが先走りすぎててストレス溜まってきていちゃもんをつけたくなったとか、仕事で疲れていて相談されるのがうっとおしいので実はあまり根拠ないけどこの場所って主張しつづけたり、とか。


そういうことをさらけ出せあえれば、どういう結論にしても、溜まるものがだいぶ減るような気がします。


恥ずかしくてお互い言えない・言ってもらえないってことはあると思うし、背景を言語化するなんて悠長なことやってらんねー、言葉にしてもらうの無理だーってこともあるでしょうけどね…。


難しい。


あと、揉めたとき以外にも、行動には背景ってあるのだろうな、って思います。
いつもは夜もご飯を炊いている彼女が雰囲気を変えてパンと主菜副菜スープを作っていて、その理由を聞いても特にないって言い張ってるとき、前日の仕事帰りに寄った本屋で今日の料理ビギナーズを立ち読みしたのが原因だったりとか、ね。*2

*1:空中キャンプさんの文章に乗っかるのは正直申し訳ない気分ですが…

*2:フィクションです