2009年 06月 11日

jAutoPagerize

github に移して iframe で読みこむ版をつくってみた (id:javascripter さんの AutoPageLoader とおなじ)。なんで iframe にしなかったんだっけ……と思いつつなのでブランチになってる。google image でも效くようになってうれしいです。

iframe にすると、lazy load されているわけでないならブログパーツとかも全部どうにかなってしまうのでいい感じ。DOMContentLoaded で iframe 削除ってて、はてなスターはつかないので filter でつけてやる必要があった。

いろいろあって Safari 対応のコードとか残ってたけど全部削除した。Chrome が GM_xmlhttprequest に対応したらまた考えよう……

名前も変えて github にうつそうとおもったけど、なんかもうこういう虐げられてます感がでる名前でもういい気がしたのでとりあえずそのままにした。


いつもつかってるテスト用サイト

2009年 06月 09日

There was an error downloading the Flash Player update

expressinstall が "There was an error downloading the Flash Player update" からはじまるメッセージで起動しないときがある。あまりにも意味がわからなすぎたんだけど、ググってみると http://blog.deconcept.com/swfobject/forum/discussion/415/not-getting-express-install-feature-to-work/ とかがヒットした。

I couldn't find any info from my searches (not in flash help/livedocs), but after testing the minimum dimensions for express install to work are 214 wide and 137 high.

http://blog.deconcept.com/swfobject/forum/discussion/415/not-getting-express-install-feature-to-work/

一定サイズ以上の swf 描画領域がないとこのメッセージがでる。ローカライズされてないからいい迷惑すぎる。

2009年 06月 05日

クラスメソッドとインスタンスメソッドの定義

どうやら static なんとか、みたいに書いてクラスメソッドをつくる方法はないようだ?

class ModelBase (initarg:Any) {
	// class method
	def create (args: (Symbol, Any)*) = {
		val ret = this.getClass.newInstance.asInstanceOf[ModelBase]

		for ( (key, value) <- args) {
			ret(key) = value
		}

		ret
	}

	// instance method
	def update (key:Symbol, value:Any):Unit = {
		println(key, value)
	}
}

class User (a:Any) extends ModelBase(a) {
	def update_session ():String = {
		"......."
	}
}

object User extends User(null)

val user = User.create('name -> "cho45", 'session_key -> "...")

println(user)
println(user.update_session) //=> type error (user が ModelBase にキャストされてるから……)

object を class とは別に継承して定義して (これ、名前空間が別なんだろうか……) あげるみたいだ。

あと、こういうスーパークラスにインスタンス化をおいだす処理をどう書いたらいいかわからない……

こういうときのための generics か……

class ModelBase [T <: ModelBase[T]] (initarg:Any) {
	// class method
	def create (args: (Symbol, Any)*) = {
		val ret = this.getClass.newInstance.asInstanceOf[T]

		for ( (key, value) <- args) {
			ret(key) = value
		}

		ret
	}

	// instance method

	def update (key:Symbol, value:Any):Unit = {
		println(key, value)
	}
}

class User (a:Any) extends ModelBase[User](a) {
	def update_session ():String = {
		"......."
	}
}

object User extends User(null)

val user = User.create('name -> "cho45", 'session_key -> "...")

println(user)
println(user.update_session)

クラス名からインスタンスがつくれない

val con = classOf[Symbol].getConstructor(classOf[String])

Exception in thread "main" java.lang.ExceptionInInitializerError
        at Main.main(scala.scala)
Caused by: java.lang.NoSuchMethodException: Main$User$.<init>(java.lang.Object)
        at java.lang.Class.getConstructor0(Class.java:2678)
        at java.lang.Class.getConstructor(Class.java:1629)
        at Main$ModelBase.create(scala.scala:13)
        at Main$.<init>(scala.scala:38)
        at Main$.<clinit>(scala.scala)
        ... 1 more

というエラーでにっちもさっちもいかない……

2009年 06月 01日

gerry++

昨日だった

2009年 05月 31日

思うところ

Scala らしさ、というのがよくわからない。Scala であってもクラス作りまくってほげほげするという Java らしさを受け継ぎつつ書くのがいいんだろうか。というより Java のライブラリを利用すると自然とそうなってしまう……

2009年 05月 30日

はてブの非表示ユーザ関係の Greasemonkey script

  • 「うぜーなー」と思っても、永遠に非表示になってしまうと思うと非表示に入れにくい
    • → もっとカジュアルに非表示に追加したい
  • 非表示にしたときが、たまたまつまらないタイミングというだけだったかもしれない
    • → ずっと非表示なのは本位じゃない

ので3ヶ月で非表示ユーザを期限ぎれにして解除するユーザスクリプトを書きました。

http://gist.github.com/raw/117826/2085144424e6d5cd1e8cc93f74c988a8d81256ac/hatena.bookmark.expire_ignore_user.user.js

はてブの設定ページもついでに拡張していて、追加したユーザについて一覧できるようにしてあります。

  • いつ解除されるか、とかのデータははてブの custom_style にコメントとしてうめこんでいます
    • custom_style は公開情報なので、AES で暗号化しています
    • その関係で最初に起動したときキーを作ります
    • そこまでしなくてもいい気もしたのですがやっても損はしないのでやってみました
  • 設定ページから非表示ユーザを追加できなくなる (殆どしないし……)
  • 設定ページのリストで期限を再設定できる
    • 期限がすくなくとも生きている間にはこないようにできるように
  • 1日に1回 (はてブにアクセスしたとき) 非表示ユーザの更新をチェックして更新をかけます。
    • なので微妙にズレが生じます
  • 作ってから3ヶ月経ってないので使い勝手はわかりません


あとついでに「あるエントリをブックマークしているユーザ」を一括して非表示に追加できるスクリプトも書きました

http://gist.github.com/raw/117376/d7d23472e1af915df608d6f4f611998704723639/hatena.bookmark.ignoreentriesuser.user.js

ボタンがエントリページにでてきます。一度 confirm できかれます。

2009年 05月 29日

web.xml filter, 自分で Dispatch

Lift 見つつ最低限な部分を自分で再実装

  • 全部のリクエストを受け取ってなんかしたいなら filter を使う
  • filter では、何もせずに chain.doFilter すれば static ファイルとかをいい感じにやってくれる。

web.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
	<filter>
		<filter-name>HttpRequestDispatcher</filter-name>
		<filter-class>net.lowreal.skirts.HttpRequestDispatcher</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>HttpRequestDispatcher</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
package net.lowreal.skirts

import javax.servlet._
import javax.servlet.http.{HttpServlet, HttpServletResponse, HttpServletRequest}

class HttpRequestDispatcher extends Filter {
	val static = """^/(?:css|js|images|static).*""".r

	def init (filterConfig: FilterConfig) = {
		println("init")
	}

	def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) = {
		println("doFilter")
		(request, response) match {
			case (req: HttpServletRequest, res: HttpServletResponse) =>
				println("")
				println(req)
				req.getRequestURI match {
					case static() =>
						println("static")
						chain.doFilter(request, response)
					case _ =>
						println("dispatch")
						res.setContentType("text/html")
						res.getWriter.println { """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""" }
						res.getWriter.println {
							<html>
								<head><title>Hello World</title></head>

								<link rel="stylesheet" type="text/css" href="/css/base.css" media="screen,tv"/>
								<!-- script type="text/javascript" src="/js/site-script.js"></script -->
							<body>
								<h1>Request</h1>
								<pre>Method: { req.getMethod }</pre>
								<pre>RequestURI: { req.getRequestURI }</pre>
								<pre>QueryString: { req.getQueryString }</pre>
								<h1>Raw</h1>
								<pre>{ req }</pre>
							</body>
							</html>
						}
				}
			case _ => chain.doFilter(request, response)
		}
	}

	def destroy () = {
		println("destroy")
	}
}

skirts っていう名前で簡単なフレームワークを作ろうと思ってる。とりあえず Lift は気にいらなかったので、コードは参考にしつつも使わない方向に……

skirts = scala / 周りをとりまく何か / 美少女

2009年 05月 28日

gerry++

三日連続

スカラクロウラ - アクター

うーんよくわからない。while(true)/receive と loop/react の違いもよくわからない (スレッド作るかそうじゃないかだけの違い?)

クローラっぽいのを練習がてら書いてみた。あんまりわかりやすくはないなぁという気もする。もっといい書きかたあるのかな。

  • 一度に走るリクエストは2つまで
    • あらかじめ2つリクエストを出す Actor を作ってそれのキューにいれていく
  • List あたりが微妙にわかりにくい。普通に shift/push したい

http://gist.github.com/119257

あれこれ最初、スカラクロウラとかエントリで言いたかっただけだったのに、全くそんなこと忘れてエントリ書いてた