IEの「名前を付けて画像を保存」がうまく動かない

昨日作った数式画像生成サイト(http://exp.frozenlib.net/)に「画像かHTMLをコピーして使ってね」と書いたにもかかわらず、IEで「名前を付けて画像を保存」を行うと画像が壊れてしまっていた。

調べてみたところ、

  • HTTPレスポンスヘッダにVary:*が含まれている
  • 透過PNG画像を保存しようとした

の2つの条件が重なると起こるようだ。

原因はこうだ。

  1. ASP.NETのOutputCacheを使用
  2. すると、キャッシュを使用したページのHTTPレスポンスヘッダにVary:*が含まれるようになる
  3. すると、IE7やIE6では画像の種類とサイズが「利用不能」と表示される
  4. さらに、そのような画像に対して「名前を付けて画像を保存」を行うと、bitmap形式でしか保存できなくなっている
  5. ここで、もし、保存する画像が透過PNGだったとすると、透明度情報が失われてしまう。

とりあえず、不透明な画像を出力することで解決したが、できれば、OutputCacheを使いつつ、Vary:*が出力されないようにしたい。
が・・・なかなか上手くいかない。

新はてなブックマーク用O2Handlerコマンド

URLに対応するエントリの表示

http://b.hatena.ne.jp/entry/{1?<{Uri}>}

URLの登録

http://b.hatena.ne.jp/ユーザー名/add.confirm{1?<?url={UrlEncode(Uri,"utf-8")}>}

コマンド登録方法

  1. コマンドを入力していない状態で Ctrl + Insert を押す
  2. 登録画面が出たら "内容" を "Webサイト" に設定する
  3. "URL" に上記コマンドを入力
  4. "変数を使用する" にチェックを付ける
  5. "名前" に適当な名前を入力し、OKを押す。

使い方

直接入力したURLと合成して使用します。

例:URL登録コマンドのコマンド名が "HayateBookmark Add" で "http://frozenlib.net/" を登録する場合

http://frozenlib.net/>HayateBookmark Add

もちろんコマンド名は省略することも可能

http://frozenlib.net/>hba

よくわからない

最近プログラミング言語 scala にはまっているが、どうもよくわからない動作が多い。

val map = new scala.collection.mutable.HashMap[Class[_], AnyRef => String ]
def f(value:Class[_]) = map.getOrElse(value,null) 
f(classOf[String]) 

// f の呼び出し中に map.getOrElse で例外発生
class TypeEx(self:Class[_]) { def getNameEx() = self.getName() }
implicit def toTypeEx[_](t:Class[_]):TypeEx = new TypeEx(t)

classOf[Int].getNameEx() // OK

var r1:Class[_] = classOf[Int]
r1.getNameEx() // OK

val r2:Class[_] = classOf[Int]
r2.getNameEx() // コンパイルエラー!!! (valだとimplicit convertion は使えないのか?)

val r3 = classOf[Int]
r3.getNameEx() // OK (valなのにOK。valで型を指定しているからダメだったのか?)

val s:String = "ABC"
s.r // OK (rはStringを暗黙の型変換で変換したRichStringのメンバ。valで型を指定しているのにOK)

環境

scalaのテストフレームワーク

SUnit(標準ライブラリ)

http://www.scala-lang.org/docu/files/api/scala/testing/SUnit$object.html:Title=例を見る限り、テストケースと別にテストスイートを作らないと、テスト一覧を列挙できないような感じがする。
だとすれば、DRY原則に反しているので嫌。

http://www.artima.com/scalatest/:Title=ScalaTest

JUnit形式、TestNG形式、独自の形式など、さまざまな形式でテストを作ることができる。
クラスを一つ作って、コマンドラインから指定するだけで、テストの経過と結果の出力をカスタマイズできるので、他のソフトとの連携も容易そうだ。