2011年06月15日 23:17
2011年05月08日 01:03
URL マッピング
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>HelloServlet</url-pattern> </servlet-mapping>
初期化パラメータの設定
コンテキスト初期化パラメータ
Web アプリケーション内で共有できる
▽web.xml に記述
<web-app> <context-param> <param-name>[パラメータ名]<param-name> <param-value>[値]<param-value> <context-param> </web-app>▼取り出し
context.getInitParameter("[パラメータ名]");
サーブレット初期化パラメータ
サーブレットごとに設定する
▽web.xml に記述
<servlet> <servlet-name>[サーブレット名]<servlet-name> <servlet-class>[サーブレットクラス名]<servlet-class> <init-param> <param-name>[パラメータ名]<param-name> <param-value>[値]<param-value> <init-param> </servlet>▼取り出し
config.getInitParameter("[パラメータ名]");
HTML to Servlet
発信:HTML
HTMLファイルから発信する(formタグを使用)
<form action="/project_name/file_name" method="post"> <input type="text" name="userName"> </form>
受信:Servlet
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response){ // 返り値の型:String request.getParameter("userName"); // 返り値の型:String[] request.getParameterValues("userName"); }
Servlet to JSP
発信:Servlet
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response){ // ArrayList userList; request.setAttribute("userList,userList"); request.getRequestDispather("outUsers.jsp").forward(request,response); }
受信:JSP(JSTL使用)
以下の定義文を記述
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>使い方
<c:forEach var="user" items="${userList}" varStatus="status">
2011年03月26日 18:15
下の画像を見てください.
紫色したアメーバ状の形をしたものと,黄色くトゲトゲしたものがあります.
この図形に名前がついていて,どちらかは「ブーバ(booba)」で,もう一方は「キキ(kiki)」です.
どちらが「ブーバ」でしょうか?
答えは,被験者の年齢や出身地にかかわらず,95 ~ 98 %の人が前者(雲の形)を「ブーバ」,後者(ギザギザの形)を「キキ」と答えるそうです.
しかし,その仕組みはまだ完全には解明できていないようです.
dashi さんの考察によれば,
余談ですけど,昔 誰かに言われた
「お前が見ている『青』はおれにとっての『青』じゃないかもしれないんだよなぁー」
っていうのが忘れられません.
紫色したアメーバ状の形をしたものと,黄色くトゲトゲしたものがあります.
この図形に名前がついていて,どちらかは「ブーバ(booba)」で,もう一方は「キキ(kiki)」です.
どちらが「ブーバ」でしょうか?
答えは,被験者の年齢や出身地にかかわらず,95 ~ 98 %の人が前者(雲の形)を「ブーバ」,後者(ギザギザの形)を「キキ」と答えるそうです.
しかし,その仕組みはまだ完全には解明できていないようです.
dashi さんの考察によれば,
すごい不思議...ヒトの脳には、形や音から抽象的特徴を抽出する能力がある。
トゲトゲの形とキキという鋭い音(口を横に引っぱり喉を閉じてやっと出せる音)に共通して認識できるものがあるのだろうと推察されます。
◇dashi's room: ブーバ/キキ効果
余談ですけど,昔 誰かに言われた
「お前が見ている『青』はおれにとっての『青』じゃないかもしれないんだよなぁー」
っていうのが忘れられません.
2011年03月24日 23:21
素数を求めるにあたって,『エラトステネスの篩(ふるい)』という公式をつかってみた.
計算方法は,エラトステネスの篩 - Wikipedia 参照
※ステップごとに載っているコードと,全ソースのコードは少し違う.
最初の素数『2』から昇順で探索リストに前数値を格納する
リストの先頭の数を素数リストに格納する
ステップ 2 で素数リストに加えられた数の全ての倍数を,探索リストから除外する
探索リストの最大値が素数リストの最大値の平方を比較
Ⅰ)小さい場合,
素数リストおよび探索リストに残っている数が素数となる.
Ⅱ)大きい場合,
ステップ 2 に戻る.
2 つのリストに含まれる数値すべてが素数
1 つのリストとしたいときは,リスト同士の結合
公式をつかう場合とつかわない場合とで,処理時間の違いを計測してみた.
公式をつかわない方法は,以下のメソッドを使用した.
引数は,『100,000』とした.
for文で回す:1693 ミリ秒
エラトステネスの篩(Collections):2617 ミリ秒
エラトステネスの篩(Collectionsなし):3298 ミリ秒
...あれっ
計算方法は,エラトステネスの篩 - Wikipedia 参照
※ステップごとに載っているコードと,全ソースのコードは少し違う.
ステップ1
最初の素数『2』から昇順で探索リストに前数値を格納する
for (int i = 2; i <= searchNumber; i++) searchList.add(i);
ステップ2
リストの先頭の数を素数リストに格納する
deleteNumber = searchList.get(0); primeList.add(deleteNumber);
ステップ3
ステップ 2 で素数リストに加えられた数の全ての倍数を,探索リストから除外する
for (int i = 0; i < searchList.size(); i++) { if (searchList.get(i) % deleteNumber == 0) searchList.remove(i); }
ステップ4
探索リストの最大値が素数リストの最大値の平方を比較
Ⅰ)小さい場合,
素数リストおよび探索リストに残っている数が素数となる.
Ⅱ)大きい場合,
ステップ 2 に戻る.
if (searchList.get(searchList.size() - 1) < primeList.get(primeList .size() - 1) * primeList.get(primeList.size() - 1)) { break; } else { continue; }
結果表示
2 つのリストに含まれる数値すべてが素数
for (int i : primeList) // 素数リスト System.out.print(i + ","); for (int i : searchList) // 探索リスト System.out.print(i + ",");
1 つのリストとしたいときは,リスト同士の結合
primeList.addAll(searchList); // 結合 for (int i : primeList) System.out.print(i + ",");
計算速度計測
公式をつかう場合とつかわない場合とで,処理時間の違いを計測してみた.
公式をつかわない方法は,以下のメソッドを使用した.
private void calcOld(final int searchNumber) { final List<Integer> primeList = new ArrayList<Integer>(searchNumber / 2); for (int i = 2; i < searchNumber; i++) { if (isPrimeNumber(i)) { primeList.add(i); } } // --------- 結果 ----------- for (int i : primeList) System.out.print(i + ","); } // 自身より低い数値で割り切れる数があるかループしてチェック private boolean isPrimeNumber(final int n) { for (int i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; }
引数は,『100,000』とした.
for文で回す:1693 ミリ秒
エラトステネスの篩(Collections):2617 ミリ秒
エラトステネスの篩(Collectionsなし):3298 ミリ秒
...あれっ
2011年03月23日 21:51
問題
次のソースから出題
public class HentaiJava { /* * public static void main(String[] args){ * System.out.println("Hello World!"); calc(); } */ public static void calc(){ int i = 012; // @JNI.start::\u000a\u002f\u002a native "C" { int *ip = &i; *ip += 3; i = *ip; } // @JNI.end::\u002a\u002fi+=\u0033\u003b System.out.println(i); double j = ___問2___; int k = 0; http://java.sun.com while(j != j){//無限ループ if(k > 100)break; k = k++; if(k < 100) int l = i++; k = + ++k; if(j<100^k>100) System.out.println("Hello World!"); } System.out.println(k); } static { calc(); } }
問 1
本ソースをコンパイルする際にエラーが生じる行が1箇所ある. 該当行を//(ダブルスラッシュ)でコメントアウトせよ.
問 2
本ソース内のwhile文が無限ループとなるDouble型 j について述べよ.
問 3
本ソース内でC言語による処理が行われている箇所について詳細に述べよ.
問 4
問1,2を満たすとき, 本プログラムを >java HentaiJava [Enter] としたときの実行結果について述べよ.
なお, HentaiJavaは正常にコンパイル済みであり,クラスパスは通っているものとする.
解答
public class HentaiAnswer { /* public static void main(String[] args){ System.out.println("Hello World!"); calc(); }*/ public static void calc(){ int i = 012; // @JNI.start::\u000a\u002f\u002a native "C" { int *ip = &i; *ip += 3; i = *ip; } // @JNI.end::\u002a\u002fi+=\u0033\u003b System.out.println(i); double j = Double.NaN; int k = 0; http://java.sun.com while(j != j){//無限ループ if(k > 100)break; k = k++; if(k < 100) //int l = i++; k = + ++k; if(j<100^k>100) System.out.println("Hello World!"); } System.out.println(k); } static{ calc(); } }
問 1 解答
A. int l = i++; の行.
型と変数の宣言は2命令なのでif文直後に置くと変数が型の解決に失敗する.
whileブロック直前のhttp://java.sun.com の文字列は
ラベル(ラベル名: の形式の文字列)とコメントアウト文字列であるため問題ない.
同様に, whileブロック内の j<100^k>100 は^演算子(XOR)であるため問題ない.
問 2 解答
A. NaNは0除算(0/0の事)定数.
NaNとNaNを==で比較すると、falseとなる.
問 3 解答
A. 本ソースではC言語による処理を行う箇所はない.
native "C" {処理} は複数行コメント内のダミーブロックである.
前後のアノテーション風のコメント(@Native.hoge 当然偽者)の末尾にユニコードエスケープによるコメント宣言がある.
よって, ポインタとかアツく語ってしまうのはもってのほかである.
また, i+=3;演算がユニコードエスケープで行われている.
問 4 解答
本プログラムはmainメソッドを含まないが, static 初期化ブロックを用いることで
初期化段階での実行を可能としている.
メソッドの実行はstaic{} -> calc()の順に進む.
*
calc()の前半では, int i に8進数の12(10進数の10)を代入している.
その直後のユニコードエスケープによるブロックの末尾では
さらにi+=3の演算が隠れている.
よって, System.out.println(i);では13が表示される.
*
calc()の後半では, NaNにより無限ループとなったwhileブロックに入る.
k = k++; は後置インクリメントであり, 代入してからk++が評価されるため値は増えない.
また, 問1のエラーを除去した if(k<100) はk = + ++k; が入るため k は100になるとそれ以上増えない.
よって, if(k>100)はtrueになることはないためbreak文に到達せず, whileブロックを抜けることはない.
また, XOR演算子を利用したif文もtrueになることはないため"Hello World!"は表示されない.
*
以上をまとめると, A. 本プログラムは実行すると13が表示された後無限ループに入る.
終了はCtrl+C や Ctrl+D, 又はCtrl+Z など強制的に終了させるしかない.