fc2ブログ

Excelでのフォーム

2011年06月15日 23:17

やってみること

Excel 2007でフォームボタン的なものをつくってみる

使うもの

開発タグ > 挿入 > フォームコントロール

開発挿入

ラジオボタン―数値の出力―

・ラジオボタン ラジオボタン

・グループ化 ラジオグループ化

フォーム選択














JavaServlet・JSP・HTML初歩的知識

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 さんの考察によれば,

ヒトの脳には、形や音から抽象的特徴を抽出する能力がある。
トゲトゲの形とキキという鋭い音(口を横に引っぱり喉を閉じてやっと出せる音)に共通して認識できるものがあるのだろうと推察されます。
dashi's room: ブーバ/キキ効果

すごい不思議...

余談ですけど,昔 誰かに言われた
「お前が見ている『青』はおれにとっての『青』じゃないかもしれないんだよなぁー」
っていうのが忘れられません.

エラトステネスの篩(ふるい)―素数の求め方―

2011年03月24日 23:21

素数を求めるにあたって,『エラトステネスの篩(ふるい)』という公式をつかってみた.

計算方法は,エラトステネスの篩 - 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 ミリ秒

...あれっ
[エラトステネスの篩(ふるい)―素数の求め方―]の続きを読む

問題-Java

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 など強制的に終了させるしかない.