✖
本当にコード書くのが遅くて困る…… もともとプログラムを早く書くのが得意とはいえないが、それにしてもひどいだろう。気が落ちている。
本当にコード書くのが遅くて困る…… もともとプログラムを早く書くのが得意とはいえないが、それにしてもひどいだろう。気が落ちている。
Scala で書いてる個人的なアプリケーションは、今月中にどこかでリリースしたいなぁ。書こうと思ってから数ヶ月経っているわけだし…… しかし仕事も詰まってる。
仕事で Perl, JS, AS と書いて、個人的に Scala, Ruby をそれなりに書く生活が続いてる。飽きなくて良い。それぞれ良いところ、使い所があると思う (好き嫌いはあるけれど……)。
僕は最近 Scala が結構いいと思っていて、なんでかっていうと
あたりが気にいってる。十分に書きやすいなら、型がついていたほうが安心できていいし、Java という巨大な既存資産を無駄にしない姿勢が好きだ。
一方で、LL として使おうとするとちょっとやりにくい部分もある。
簡単なスクリプトを書くような分野には向いてないと思うけど、軽めのウェブアプリケーションとかだとちょうどよくて、Java と LL の中間ぐらいにピッタリとハマる言語だと思う。
また女生徒読んだし……素で泣くし……
object Main extends Application {
def rubylike (s:Int, e:Int)(f:Int => Unit) = {
(s to e).foreach { i =>
f(i)
}
}
rubylike(1, 10) { i =>
println(i)
}
}部分的にカリー化して最後に関数をひとつだけとるようにすると、いい感じに書ける
ケータイのメールで起こされる夢をみた。なんか女の子からメールがきて、とても切ない気分になった。ふと時刻をみると昼の11時で、「やばい、遅刻だ!!!」
というところで現実にガバッっと起きて、急いで時計を確認したら、午前4時
//#! scala
object X {
var mes = ""
def / (o: => Any) = this
def < (m:Symbol) = { mes = m.toString; this }
def ! () = { println("ひだまりスケッチ×365 " + mes + "!") }
}
(0 to 10).foreach {
X / _ / X < '来週も見てくださいね!
}ふつうにかくとふつうにできてしまうのでおもしろくない。 → これがおもしろい http://d.hatena.ne.jp/kmizushima/20080710/1215654623
じゃう゛ぁとかよくわからないし的なレベルではじめようとすると前段階で躓くので、Rack とか HTTP::Engine 的に、あとはハンドラを書けばokみたいな状態にするまでのメモ
Java なウェブアプリは WAR とかいう形式にしてやると、サーブレットコンテナ (Jetty とか TomCat とか?) というものがよしなに起動してくれるようになるらしいです。GAE/J もそう。なので、それに沿ったものを作ります。
.
|-- src
| |-- META-INF
| | `-- jdoconfig.xml
| `-- net
| `-- lowreal
| `-- skirts
| `-- HttpRequestDispatcher.scala
`-- war
|-- WEB-INF
| |-- classes
| | |-- META-INF
| | | `-- jdoconfig.xml
| | `-- net
| | `-- lowreal
| | `-- skirts
| | `-- HttpRequestDispatcher.class
| |-- lib
| | `-- scala-library.jar
| |-- logging.properties
| `-- web.xml
|-- css
| `-- base.css
|-- images
|-- index.html
|-- js
`-- staticwar ディレクトリ以下が公開される (WEB-INF を除く) ディレクトリで、WEB-INF 以下にアプリケーション実体があり、WEB-INF/web.xml でルーティング設定をします。
web.xml ではふつう、URI -> Servlet の対応を 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>
<init-param>
<param-name>foo</param-name>
<param-value>hogehoge</param-value>
</init-param>
</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 {
var static = """^/(?:css|js|images|static).*""".r
val through = """^/_.*""".r
var router:HttpRouter = null
def init (filterConfig: FilterConfig) = {
println("initializing...")
val config_foo = filterConfig.getInitParameter("foo")
println("initialized config: " + config_foo)
}
def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) = {
// ここでなんかする
(request, response) match {
case (req: HttpServletRequest, res: HttpServletResponse) =>
val path = req.getRequestURI
val statics = static
path match {
case statics() =>
chain.doFilter(request, response)
case through() =>
chain.doFilter(request, response)
case _ =>
// router.dispatch(req, res)
}
case _ => chain.doFilter(request, response)
}
}
def destroy () = {
println("destroy")
}
}
アプリケーション起動時に init がよばれ、リクエストごとに doFilter がよばれてくるので、doFilter で request, response を適当にいじくればいいことになります。ここで chain.doFilter(request, response) をすればデフォルトのハンドラが呼ばれるっぽいので、普通は war 以下の static なものがそのまま返されます。
throught() は GAE/J のテストログインハンドラのためのやつです。(/_login? とかを GAE/J 側がハンドルしてる)