yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/09 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
新倒壊革
2010/04/24(Sat)05:33:26
 自民党の敗北後より、水面下で不穏な動きを見せていた舛添氏ですが、このほどようやく「舛添新党」の道を選ぶことが明らかになりました。舛添氏ら3氏が改革クラブに合流し、これを衣替えして「新党改革」に変更、舛添氏が党首に就任するという形式を取るようです。一方、舛添氏に反発した2名が同党から離脱し、同党の保有議席は5から6に1つ増えるにとどまります。
 改革クラブ自体が2007年の参院選における民意を裏切って結党された政党であり、民主党のものとして与えられたはずの議席にただ乗りして政党交付金を確保しようとする、大義に乏しい党であることは同党の結党時にも述べましたが、舛添氏がそのような体質の政党に合流し、結果として同党が同様の行為を再び繰り返そうとするのは、皮肉であるとしか言いようがありません。しかも舛添氏は自民党の比例代表として当選しているのですから、こちらは真の意味で自民党の議席にただ乗りしています。
 与謝野氏や舛添氏らのような大物が離党している状況でありながら、ほとんどの自民党議員が呼応しない点からしても、多くの自民党議員は新党騒ぎを非常に冷めた目で見ているようです。事実、舛添氏が引き連れて入党となった議員も3名に過ぎず、独自の新党では政党要件さえも満たせないか、もし満たせたとしても苦しい状況となります。しかし、改革クラブを媒体として使用すれば、引き続き政党交付金も受け取れます。一方、改革クラブは二大政党や各新党の狭間への埋没に危機感を抱いているはずで、自分の党の「色」を犠牲にし、所属議員2名を失ってまで舛添氏を党首に受け入れたのは、まさにそれを打破する意図があるからこそでしょう。すなわち、どうしても実現したい共同の理念があるからというより、両者の利害が一致した結果が、この衣替え新党と見るのが妥当です。
 このようなやり方に対しては、「政党交付金を受け取るのは道理に合わない」との批判が出てくるのは当然ですが、舛添氏は「我々は金のかかる政治と決別したい」などと言っておきながら、政党交付金への批判に対しては「企業や労組から金を受け取れば、彼らは口も出す。我々は政党交付金でやるから国民全体をみている」と意味不明な論理を持ち出して正当化しています。この状況下で政党交付金を受け取るのは道理に合わないから批判が出るのであって、ここでは企業や労組などは全く関係がありません。団体献金を受け取らない姿勢は大いに結構ですが、これでは「政党交付金を受け取るのは道理に合わない」という疑問への説明になっていません。
 そもそも、私が舛添氏を信用しない理由の1つに、氏があまりにも自分勝手でご都合主義、あるいはその場限りの言い分を用いることが挙げられます。例えば、舛添氏が厚生労働相に就任していた時期、年金の記録の散逸が問題になった際には、どう考えても守りようのない期限を自ら掲げた挙句、案の定実現できないと分かったら、今度は開き直りをはじめました。また、自民党の大敗後には「今の自民党に必要なのは、民主党の小沢代表以上の独裁者」などと言っておきながら、後から谷垣体制を批判した際には「批判のない政党は独裁政党」と称して自らの行為を正当化する有様で、まるで発言の整合性が取れていません。今回の「新党改革」の件にしても、まさに当の舛添氏が真っ先に「金目当て」などと批判しそうなやり方ですし、手段を選ばず政党交付金を受け取る行為も「政治とカネ」の問題の一分類に他ならず、これもまた国民の政治不信の一因となっている事実を忘れてはいけません。
 一方、自民党は高い人気を誇る舛添氏を失い、衆院選大敗及びその後の混乱に続いて大きな痛手をこうむっているはずですが、ここは「自ら手を下すまでもなく厄介払いができた」と前向きに考え、党の再生を図るべきでしょう。与謝野氏にせよ、舛添氏にせよ、実際のところ彼らの離党は痛手などではなく、膿が排出されたと考えるべきです。
 舛添氏がここまで新党結成を先延ばしにしたのは、自民党総裁の座を狙っていたと考えるのが妥当です。しかも、国民からの高い人気を背景に、自民党議員の満場一致、円満譲渡のような形で総裁の座に就くことを狙っていたと考えられます。氏が今回離党に踏み切ったのも、谷垣氏や自民党が代表の座を譲渡しようとする気配を見せなかったためでしょう。
 しかし、このまま舛添氏が離党をしていなければ、いずれ自民党は「国民の声」に押しつぶされ、どうしても氏を総裁にせざるを得なくなった可能性が十分にあります。そして、仮に氏が自民党総裁に就任していれば、それこそ自民党ばかりか日本が大混迷に陥ったであろうことは想像に難くありません
 舛添氏は「はっきり物を言う」とみなされている人物であり、それが実直あるいは明快な印象を与え、国民の人気を獲得しているものと考えられます。さらに、マスコミは人気のある人物の批判を避けようとするため、氏の数々の暴言や問題はほとんど報道されておらず、結果として氏を政界の救世主でもあるかのように翼賛する報道ばかりが目立っています。しかし、仮に二大政党の片方を占める大政党の代表に就任したとなれば、氏も口当たりの良い発言ばかりはしていられませんし、問題発言があればマスコミといえど隠し通すのは困難です。
 すなわち、氏が代表就任後も「はっきり物を言う」姿勢を続けるならば、無賃残業合法化など氏が強硬に主張している政策、あるいはこれまで散々繰り返してきたものの、ほとんど報道されてこなかった暴言なども、それからはすべて白日の下にさらされる結果となり、国民の人気を失うのは時間の問題です。一方、氏がその姿勢をある程度改め、二枚舌政治を行うならば、今度は「舛添氏も他の政治家と変わらなかった」という印象を国民に与える結果となるでしょう。
 そして、仮にひとたび舛添氏の人気が落ち始め、マスコミが氏に遠慮しなくなれば、氏の体制が破綻するのは時間の問題です。なぜなら、氏は「小人のざれ言に付き合う暇はない」「バカ市長と言わないだけマシ」などといった暴言を吐いたり、かつて自らが「みなし役員」などの問題を管轄とする省のトップにありながら、「残業代が出なくなれば、みんな早く帰って家庭だんらんができる」などという、およそ実態とかけ離れた理由によって無賃残業合法化を強く推進したり、無賃残業合法化を「家庭だんらん法案」と言い換えさえすれば国民をだませると考えていたりと、実際には人格的・政策的にほとんど見るべき点のない人物であるためです。
 今のところはマスコミが批判的な報道を控えているため、これらの火種は表面化せずに済んでいますが、もしマスコミが手のひらを返し、国民も舛添氏の人格・政策について関心を持てば、まるで螺旋階段を転がり落ちるかのような勢いで、舛添氏は一気に支持を失ってしまうでしょう。もしそうなれば、自民党もただでは済みません。単に支持を失うばかりか、今度こそ壊滅的な打撃を受ける可能性さえ否定できません。
 その舛添氏が自ら党を去ったのですから、これは本来なら自民党にとって「願ってもない話」なのです。確かに自民党は国民からの支持を失っており、かなり苦しい状況にありますが、国民は雨後のたけのこのごとく湧き出る新政党にもほとんど期待してはいません。現在の自民党には、未だに堂々と世襲を続けたり、人気者の世襲議員を重用したりといった問題点もあるものの、民主党も落語家を擁立するなど、負けず劣らずの暴挙に出ています。せっかく与謝野氏や舛添氏のような懸念材料も消えたのですから、これらの点を改善しようと努力し、くだらない人気取りをやめ、「苦い薬」も含めて実直に政策を訴えるようにすれば、党を立て直せる可能性は十分にあります。
 そして当然のことながら、自民党総裁の可能性は当面は薄まったとはいえ、舛添氏の動向には今後とも十分に注意が必要です。現在の閉塞した政治状況において、政界再編が必要であるとする意見は理解できますが、それは舛添氏以外の手によって行われなくてはなりません。

 JAX-RSでは自動的にJAXBの変換を行ってくれるため、特にこれといった変換操作をしなくても、普通にオブジェクトを扱うかのように操作が可能であることは前回に試しました。
 しかし、JAX-RSで自動的に行えるのは、何もJAXBの変換だけではありません。あのいまいましいAjaxのせいで注目されてしまった技術・JSONすら変換できてしまいます。しかも、JSON用に特別なJavaBeanを用意したり、JSON化及び復元するためのコードを書かなくても、XMLをやり取りするのと同様の書き方をしておけば、それでJSONにしたり戻したりする変換が自動的に行われるというのです。
 そうであるならば、何らかの操作について「XMLでのやり取り」と「JSONでのやり取り」の両方を提供するのも非常に容易になりますし、場合によってはAjaxから直接アクセスするといった使い方も考えられます。いずれにしても、かなり面白そうな機能には違いありません。
 今回はとりあえず、前回の計算プログラムをJSONでも使えるよう拡張してみるものとしました。
/WEB-INF
 /classes
  /com
   /yamicha
    /rs
     /server
      @XmlRootElement Calc.java
      @Path CalcService.java
     /client
      @WebServlet CalcServlet.java
 web.xml
calcForm.htm
calcAjax.htm
 今回はあくまで「JSON対応にする」だけですので、web.xmlとCalc.javaの内容は前回と全く同様です。すなわち、データを保持するJavaBeanには全く手を加える必要がないことを意味します。JSONとして用いる場合でも、そのまま使えてしまいます。
 CalcService.javaは以下の通り拡張しました。
package com.yamicha.rs.server;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("calc") public class CalcService{
	public CalcService(){
	}

	// 計算用メソッド
	private Calc executeCalc(Calc calc){
		try{
			int answer = 0;

			int v1 = Integer.parseInt(calc.getValue1());
			int v2 = Integer.parseInt(calc.getValue2());
			String operator = calc.getOperator();

			if("+".equals(operator))
				answer = v1 + v2;
			else if("-".equals(operator))
				answer = v1 - v2;
			else if("*".equals(operator))
				answer = v1 * v2;
			else if("/".equals(operator))
				answer = v1 / v2;
			else if("**".equals(operator))
				answer = (int)Math.pow(v1 , v2);
			else
				return calc;

			calc.setAnswer(String.valueOf(answer));
		}catch(NumberFormatException e){
		}

		return calc;
	}

	// パラメータを取り、結果を XML 形式で返す
	@GET @Path("query/xml") @Produces("application/xml")
		public Calc queryToXml(
		@QueryParam("value1") String v1 ,
		@QueryParam("operator") String op ,
		@QueryParam("value2") String v2){
		Calc calc = new Calc();
		calc.setValue1(v1);
		calc.setValue2(v2);
		calc.setOperator(op);

		return executeCalc(calc);
	}

	// XML を取り、XML を返す
	@POST @Path("xml/xml") @Consumes("application/xml")
		@Produces("application/xml")
		public Calc xmlToXml(Calc calc){
		return executeCalc(calc);
	}

	// JSON を取り、XML を返す
	@POST @Path("json/xml") @Consumes("application/json")
		@Produces("application/xml")
		public Calc jsonToXml(Calc calc){
		return executeCalc(calc);
	}

	// JSON を取り、JSON を返す
	@POST @Path("json/json") @Consumes("application/json")
		@Produces("application/json")
		public Calc jsonToJson(Calc calc){
		return executeCalc(calc);
	}

	// XML を取り、JSON を返す
	@POST @Path("xml/json") @Consumes("application/xml")
		@Produces("application/json")
		public Calc xmlToJson(Calc calc){
		return executeCalc(calc);
	}
}
 見ての通りですが、XMLを取ってXMLを返すメソッド、JSONを取ってXMLを返すメソッド、XMLを取ってJSONを返すメソッド、JSONを取ってJSONを返すメソッドの各実装は、いずれも全く同じです。すなわち、Calcを受け取ってCalcを返しています。
 CalcServlet.javaは次のように変更しました。今回はコントロールの機能に特化しています。このServletでは、queryToXml、xmlToXml、jsonToXmlの3種類のメソッドを呼び出せるようにしています。
package com.yamicha.rs.client;

import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.servlet.annotation.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
import com.yamicha.rs.server.*;

@WebServlet(name="calcservlet" , urlPatterns={"/client/calc/*"})
  public class CalcServlet extends HttpServlet{
  private final static String REST_SERVER =
    "(このプログラムのURL)/restserver/calc/";

  public void doPost(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    doGet(request , response);
  }
  public void doGet(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();

    String path = request.getParameter("path");

    Calc calc = new Calc();
    calc.setValue1(request.getParameter("value1"));
    calc.setValue2(request.getParameter("value2"));
    calc.setOperator(request.getParameter("operator"));

    try{
      HttpURLConnection c = null;
      JAXBContext jc = JAXBContext.newInstance(Calc.class);

      if("query/xml".equals(path)){
        // GET 方式でパラメータを送り、XML を受け取る
        c = (HttpURLConnection)
          new URL(REST_SERVER + path +
          "?value1=" + URLEncoder.encode(calc.getValue1() , "UTF-8") +
          "&value2=" + URLEncoder.encode(calc.getValue2() , "UTF-8") +
          "&operator=" + URLEncoder.encode(calc.getOperator() , "UTF-8"))
          .openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);

        c.connect();
      }else if("xml/xml".equals(path)){
        // XML を送り、XML を受け取る
        c = (HttpURLConnection)
          new URL(REST_SERVER + path).openConnection();
        c.setRequestMethod("POST");
        c.setDoOutput(true);
        c.setRequestProperty("Content-Type" , "application/xml");

        c.connect();

        OutputStream os = c.getOutputStream();

        Marshaller m = jc.createMarshaller();
        m.marshal(calc , os);

        os.close();
      }else if("json/xml".equals(path)){
        // JSON を送り、XML を受け取る
        c = (HttpURLConnection)
          new URL(REST_SERVER + path).openConnection();
        c.setRequestMethod("POST");
        c.setDoOutput(true);
        c.setRequestProperty("Content-Type" , "application/json");

        c.connect();

        OutputStream os = c.getOutputStream();

        PrintWriter pw = new PrintWriter(os);
        pw.print("{"value1" : "" + calc.getValue1() +
          "" , "value2" : "" + calc.getValue2() +
          "" , "operator" : "" + calc.getOperator() +
          ""}");
        pw.close();

        os.close();
      }else{
        throw new Exception("path 引数が正しくありません。");
      }

      InputStream is = c.getInputStream();

      Unmarshaller u = jc.createUnmarshaller();
      Calc result = (Calc)u.unmarshal(is);

      is.close();
      c.disconnect();

      out.println(result.getValue1() + " " + result.getOperator()
	+ " " + result.getValue2() + " = " + result.getAnswer());

      out.close();
    }catch(Exception e){
      throw new IOException(e.toString());
    }
  }
}
 このServletは、calcForm.htmから呼び出します。
<html>
<head></head>
<body>

<form action="./client/calc" method="POST">

計算式:<br />
<input type="text" name="value1" size="10" value="1" /> 
<input type="text" name="operator" size="3" value="+" /> 
<input type="text" name="value2" size="10" value="1" />
<br />
<br />

リクエストを送りたいサービスのパス:<br />
<input type="radio" name="path" value="query/xml"
 checked="checked" />query/xml 
<input type="radio" name="path" value="xml/xml" />xml/xml
<input type="radio" name="path" value="json/xml" />json/xml
<br />
<br />

<input type="submit" value="計算" />
</form>

</body>
</html>
 正しく動作した場合、3つあるラジオボタンのどれを使用しても表示される結果は同じですが、query/xmlであればGET方式を用い、引数の形でデータを送信しますし、xml/xmlならXML形式で、json/xmlならJSON形式でデータを送信します。いずれの場合もXMLが返され、ServletがそれをJAXBで解析、計算結果をテキスト形式として表示します。
 calcAjax.htmは、xmlToJson、jsonToJsonの2種類のメソッドを呼び出します。こちらはServletなどを使用せず、RESTサーバーに直接アクセスしています。
<html>
<head>
<script language="JavaScript"> 
function createHttpRequest(){
	try{
		return new ActiveXObject("Microsoft.XMLHTTP");
	}catch(e){
		return new XMLHttpRequest();
	}
}

var request = null;
function getResult(){
	var path = "";

	for(var i = 0; i < calc.path.length; i++){
		if(calc.path[i].checked){
			path = calc.path[i].value;
			break;
		}
	}

	var value1 = calc.value1.value;
	var value2 = calc.value2.value;
	var operator = calc.operator.value;

	var senddata = "";
	var ctype = "";

	if(path == "json/json"){
		// JSON 形式でデータを送信
		ctype = "application/json";

		senddata = '{"value1":"' + value1 +
			'" , "value2":"' + value2 +
			'" , "operator":"' + operator +
			'"}';
	}else if(path == "xml/json"){
		// XML 形式でデータを送信
		ctype = "application/xml";

		senddata += '<?xml version="1.0"?>';
		senddata += '<calc>';
		senddata += '<value1>' + value1 + '</value1>';
		senddata += '<value2>' + value2 + '</value2>';
		senddata += '<operator>' + operator +
			'</operator>';
		senddata += '</calc>';
	}else{
		return;
	}

	if(request == null)
		request = createHttpRequest();
	else
		request.abort();

	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			var calc = eval("(" + request.responseText + ")");
			var str = calc.value1 + " " + calc.operator +
				" " + calc.value2 + " = " + calc.answer;
			document.getElementById("result").innerHTML = str;
		}
	};

	request.open("POST" , "./restserver/calc/" + path , true);
	request.setRequestHeader("Content-type" , ctype);
	request.send(senddata);
}
</script>
</head>

<body>

<form name="calc" onsubmit="getResult();return false">

計算式:<br />
<input type="text" name="value1" size="10" value="1" /> 
<input type="text" name="operator" size="3" value="+" /> 
<input type="text" name="value2" size="10" value="1" />
<br />
<br />

サービスのパス:<br />
<input type="radio" name="path" value="json/json"
 checked="checked" />json/json
<input type="radio" name="path" value="xml/json" />xml/json
<br />
<br />

<input type="submit" value="送信" />

<div id="result">(ここに結果が表示されます)</div>
</form>

</body>
</html>
 json/jsonとxml/jsonのどちらをチェックしても、返されるデータはJSON形式ですので、evalでJavaScriptにそれを解釈させるだけで復元が完了します。

 後は次のURLを開き、いずれのチェックを選択した場合でも正しく動作すれば成功です。

(アプリケーションのURL)/calcForm.htm
(アプリケーションのURL)/calcAjax.htm

 いずれの場合も結果は全く同じですが、CalcServlet.javaとcalcAjax.htmの実装の通り、やり取りされているデータ形式はそれぞれ全くの別物です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -