JSP の暗黙オブジェクト一覧 [exam]
JSP の暗黙オブジェクト一覧。 Webコンポーネントディベロッパ(SJC-WC) (SUN教科書) より引用。書籍では request と response の型がそれぞれ、javax.servlet.ServletRequest、javax.servlet.ServletResponse として掲載されているが、恐らく誤りであると思われる(例えば、J2EE パスファインダー: 暗黙オブジェクトの多くの用途 の説明を参照)。
暗黙オブジェクト名 | 型 | スコープ |
---|---|---|
request | javax.servlet.http.HttpServletRequest | リクエスト |
response | javax.servlet.http.HttpServletResponse | ページ |
out | javax.servlet.jsp.JspWriter | ページ |
session | javax.servlet.http.HttpSession | セッション |
config | javax.servlet.ServletConfig | ページ |
application | javax.servlet.ServletContext | アプリケーション |
page | java.lang.Object | ページ |
pageContext | javax.servlet.jsp.PageContext | ページ |
exception | java.lang.Throwable | ページ |
慣れれば問題ないが、JSP の暗黙オブジェクトと EL の暗黙オブジェクトは紛らわしい。とは言ったものの、Grails を使うと JSP ではなく GSP になるので JSP や EL はあまり意識しなくなってしまうけど。
EL の暗黙オブジェクトについては次回のエントリで書く。
数字のタッチタイピング(ブラインドタッチ)を練習するには? [NT]
私は英文字のタッチタイピング(ブラインドタッチ)は、困らない程度にできるが、数字キーのブラインドタッチは出来るとは言い難い。
そこで、数字のタッチタイピングを練習するのに便利なソフトとWEBサイトを調べたので備忘録代わりに紹介する。
タッチタイピングを練習するソフト。数字キーのみの練習モードがあり、また、キーのガイドを表示することも出来る。どのキーをどれくらい間違えたのかなど詳細な履歴も確認できる。フリーソフト。
タイピング型ガンシューティングゲーム。数字キーのみ使用する。 Adobe Flash で作成されている。Adobe Flash は大抵の PC にはインストールされているので、ブラウザでアクセスするだけで使えるのが便利。
タイピングゲーム。一定の数をタイピングすると数字の列が増え、あるタイミングで「コンボ」が発生しスコアが加算されるようだ。ゲーム性が他の2つに比べ強い。NO SHOT と同様に Adobe Flash で作成されているので、大抵、ブラウザでアクセスすれば利用できる。
e-typing はインターネットでタイピングできるサイト。様々な状況でタイピングの練習ができ、スコアを登録してランキングで競い合える。数字キーの入力をマスターしたいのなら「タイピング バラエティ」-「ビジネス」-「金額」がお勧め。「金額」なので、「,」や「ENN」などの入力も求められるが、これはこれで練習になるだろう。 「タイピング バラエティ」-「テンキー」もあるのだけれど、これは、完全にテンキー向けで数字キーのタッチタイピング向けとは言い難い。 このサイトも Adobe Flash で作成されているので、大抵、ブラウザでアクセスすれば利用できる。e-typing の利点は画面の下段にキーのガイドが表示される点。キーの入力に慣れるまでは便利。
数字キーのタッチタイピングを純粋にマスターしたいのなら タイプウェルオリジナル がお勧め。ある程度出来るようになったら、「フラッシュゲーム NO SHOT(ナンバーショット)」、「ふわふわピエロ(タイピングゲーム)」、「e-typing {インターネットでタイピング練習}」で高得点を狙うと良いかも。
ジャンクションを利用してリンクを張るには? [NT]
Subversion + NetBeans 6.5 + Dropbox の問題 の続き。
Subversion のパスに空白が含まれてしまうために問題が生じていた。これをジャンクションを利用して解決してみる。
ジャンクションとはディレクトリに対するシンボリックリンクみたいなものである。Windows 2000 以降でファイルシステムが NTFS なら利用できる。
ジャンクションを作成するソフトウェアは幾つかあるが、リンク作成シェル拡張 for Windows 2000/2003/XP 再配布ページ を利用した。ソフトの説明は 窓の杜 - 【NEWS】NTFS用ハードリンク作成ソフト「リンク作成シェル拡張 for Windows 2000」 がわかりやすい。
ただ、注意点としてはジャンクションとして作成したディレクトリを削除する場合、リンク元のディレクトが削除されてしまうようだ。詳しくは ジャンクションの罠 | 水無月ばけらのえび日記 を参照。
しかし、私が実験してみたところ、explorer で削除(ゴミ箱へ移動したわけではない)した限りでは、ジャンクションとして作成したディレクトリのみが削除され、リンク元のディレクトリ内容は維持された。安全のためには RD コマンドを利用した方が良いだろう。
ジャンクションを利用して N:\dropbox\My Dropbox\Repository を N:\Repository へリンクを張った。この後に、NetBeans でプロジェクトを Subversion からインポートし直し、ファイルの履歴を参照したところ、次図のように期待する動作を得た。
そもそも、Dropbox が管理しているディレクトリは必ず「My Dropbox」というディレクトリ以下になるのがよろしくない。
この問題に関しては Dropbox の User Forum でも意見が出ている。
- Location of Dropbox-Folder - I really becoming angry! « Dropbox Forums
- DropboxPath - change or move dropbox folder name without reinstall « Dropbox Forums
Subversion + NetBeans 6.5 + Dropbox の問題 [NT]
Subversion のリポジトリをバックアップするのが手間なので、Dropbox のディレクトリに置いている。
こうすれば自動的にバックアップが取得されるので便利だ。
ただ問題が一つあった。NetBeans 6.5 で Subversion を利用しているときに、Dropbox のディレクトリのリポジトリを参照していると、履歴を検索できない。例えば、次図のように実行して履歴を検索すると...
このように、SVN が失敗してしまう。コミットやチェックアウトは問題なくできたので、これまで放っておいたのだが、やはり面倒だ。
SVN が失敗してしまう理由は、リポジトリに空白が含まれているパスを利用しているからかなと見当を付けていた。
しかし、リポジトリを Dropbox の管理下に置きたい。そこで、ジャンクションを利用することにした。
続く。
java.exe に SIGINT を送信するには? [NT]
ant の java タスクで起動したプログラムは CTRL-C を受け取れない の続き。
CTRL-C は SIGINT シグナルのことである。だから、java.exe に CTRL-C を送信できれば、必ずしもターミナルから送信する必要は無い。
結局、kill コマンドを使えばよい。windows の場合でも kill コマンドは存在する。
最終的に、
tlist | grep bin\\java.exe | tail -n 1 | groovy -n -e " println line.split(' ')[0]" | xargs kill
という one-liner で処理することにした。
tlist でプロセスの一覧を出力し、それから bin\\java.exe が含まれる行のみを取り出し、複数の java.exe が合った場合に備え、最後の 1 行だけを抽出し、その行を空白を区切り文字として分割して PID を得て、xargs で kill に渡すと。
grep や xargs の入手については以前に GNU utilities for Win32:experiment に記載した。
わざわざ groovy を使う必要は無く、ruby -e でも awk でも、なんでもできそうだけど、split が簡単に使えたのと、少し前に groovy をインストールしたので使ってみたかった、というどうでも良い理由による。
で、上記 one-liner を bat として置いておけば、簡単に runserver した java.exe を停止できる。
java.exe を runserver 以外で使わないという条件があるけど、その条件を回避するのは手間の費用対効果の観点から実装しない。
ant の java タスクで起動したプログラムは CTRL-C を受け取れない [NT]
GAE/J の開発で ant を使うと java.exe プロセスが残る の続き。
java.exe プロセスが残る原因は、ant と google の runserver の仕様に原因があった。
ant は java タスクを記述すると ant から java コマンドを起動できる。 その詳細は Java Task に記載されている。
runserver は実際には java コマンドを fork=true で呼び出している。この場合、ant の java とは別の java プロセスが実行される。
新しく起動した java プロセスの標準入力として input か inputstring 属性を利用できるが、インタラクティブに CTRL-C を送信する方法を見つけることはできなかった。
Nabble - Ant - Users - How to kill child process with control-c でも似たような議論があるけれど、結局 fork しないで java コマンドを使えばできるかも(適当な意訳)となっていて、質問者が最終的にどうしたのかはよく分からない。
GAE/J の SDK がバージョンアップ [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
UTF-8で日本語表示が可能に:「Google App Engine SDK for Java 1.2.1」リリース - ITmedia エンタープライズ によると 2009/05/13 付けで Google App Engine SDK が公開された。
Google の公式発表は Google App Engine Blog: Java SDK version 1.2.1 now available 。
これまでは、*.jsp ファイルにシステムのデフォルトエンコーディングしか利用できなかった。 例えば、Windows なら Shift_JIS(正確にはちょっと違うらしいけど)が利用される。
エンコーディングを変更できない不具合は GAE のフォーラム でも幾つかトピックがあがっていて、しょうがないから、jar をデコンパイルしてパッチを作った人もいた。そこまですると、規約的にまずいかなーと思っていたところ、Google が正式に修正版を出したので、一安心。
まだ Early Look なのでバグが枯れるには、しばし時間がかかりそう。
GAE/J の開発で ant を使うと java.exe プロセスが残る [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
GAE/J で Web アプリケーションを開発してサーバにアップロードする前に local で動作確認をすることを考える。
GAE/J では ant スクリプトが用意されていて、ant runserver と記述するとテスト用のサーバが起動する。起動したサーバを停止しようとして「CTRL-C」をタイプすると、ant は終了するが、プロセスを確認すると java.exe が残ったままになる。
この java.exe はサーバプロセスであり、内部的には jetty のようだ。
The Java Development Server - Google App Engine - Google Code によると、Running the Development Web Server 節で、
appengine-java-sdk\bin\dev_appserver.cmd [options] war-location
を実行してサーバを起動して、終了するときは
To stop the web server, press Control-C (on Windows, Mac or Linux).
とある。 Google の資料のように dev_appserver.cmd を利用した場合、CTRL-C でサーバは停止し、java.exe プロセスは残らない。しかし、ant runserver の場合はプロセスが残ってしまう。
もしかして、ant.bat/ant.cmd を実行しているのが問題なのかと思い、ant を java コマンドで起動してみた。ant を java コマンドで起動するには Running Apache Ant の解説を読むと良い。ant を java コマンドで起動した場合であっても runserver すると java.exe プロセスが残ってしまった。
runserver で動作しているサーバは内部的には jetty のようだ。jetty の場合は、Running Jetty-6.1.x - Jetty - Codehaus の Stopping にある操作をすると別のシェルから jetty を停止できる。
java - Java アプリケーション起動ツール などによると、java コマンドの -D オプションは JVM に対して与えるプロパティである。ant runserver から呼び出される ant-macros.xml に jetty の -D オプションを追加したが netstat -a で確認すると、STOP 用のポートは開かれない。
ant-macros.xml を解析すると com.google.appengine.tools.KickStart を呼び出しているので、直接 java コマンドで KickStart と -D オプションを付けてみたりもしたが、やはり STOP 用のポートは開かれない。STOP 用のポートは jetty の start.jar で処理しているのかもしれない。
結局、 dev_appserver を直接呼び出した場合はプロスセスが残らないので、ant との組み合わせの問題か、ant スクリプトの記述方法が問題なのかもしれない。dev_appserver の末端まで CTRL-C が通知できていない気がするんだよね~。
※私は Windows 2000 で動作確認しているので、他の環境では結果が異なるかもしれません。
[追記]このエントリには続きがあります。
GAE/J の Datastore API では Map を保存できない [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
GAE/J ではデータベース(RDB)は使用できない。その代わりに Datastoe API を利用する。これは、JDO とか JPA を利用して、要は、オブジェクトをシリアライズして保存しましょうという機能である。
あるデータを保存したいとする。保存したいデータは entity という役割を持つクラスにまとめる必要があり、最終的に entity のプロパティとして格納する必要がある。これらの仕様は Defining Data Classes - Google App Engine - Google Code に記載されている。
問題はそのページの「Collections」である。一部を引用する。
A datastore property can have more than one value. In JDO, this is represented by a single field with a Collection type, where the collection is of one of the core value types or a Serializable class. The following Collection types are supported:
- java.util.ArrayList<...>
- java.util.HashSet<...>
- java.util.LinkedHashSet<...>
- java.util.LinkedList<...>
- java.util.List<...>
- java.util.Set<...>
- java.util.SortedSet<...>
- java.util.Stack<...>
- java.util.TreeSet<...>
- java.util.Vector<...>
上記リストには Map インターフェースを実装するクラス(例えば、HashMap、TreeMap)が無い。
試しに TreeMap を保存しようとしたところ次の例外が発生した。
Map が使えないとちょっと不便だが、Map を使いたいのならば、素直に、key、value の組み合わせ自体を JDO で書き込んで欲しいということかな?
Open Flash Chart では積み上げグラフを作成できない [NT]
Open Flash Chart ver.1.9.7 では積み上げグラフを作成できない。
積み上げグラフは 積み上げ棒グラフと積み上げライン/エリアグラフを合わせたものの総称っぽい。
積み上げ某グラフとは、例えば、XML/SWF Charts > Gallery > Stacked_Bar にデモがあるようなグラフである。
また、積み上げライン/エリアグラフも作成できない。これは、forums.openflashchart.com • View topic - Stacked Line Chart で議論されている。 「Open Flash Chart ver.2 系列では積み上げグラフを作成できるので、幅を 1 pix にして表示してみたらどうか?もっとも、パフォーマンスは悪いだろうけど。」みたいな記述がある。
積み上げライン/エリアグラフは XML/SWF Charts > Gallery > Stacked_Area に例がある。
ちなみに、積み上げグラフ、積み上げ棒グラフ、 積み上げライン/エリアグラフは英語で、Stacked Chart、Stacked Bar Chart、Stacked line/Area Chart と呼ぶらしい。Graph より Chart の方が広い概念で、意味的には Graph という意味で Chart という単語を使用している例も多いと思う。Open Flash Chart と言うけれど、実際には表では使用できず、もっぱら Graph を扱っているしね。
ちょっと調査不足だった。とりあえず、積み上げグラフではなく、Area グラフを利用することで、回避することにした。