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/18(Sun)23:44:24
 今度は民主党が参院選候補として落語家を擁立することが明らかとなりました。民主党は以前にもニュースキャスターを擁立する動きを見せており、それに続くタレント候補となります。その他、自民党や乱立小政党などの他党も有名人を擁立したり、あるいは擁立することを検討、もしくは広告塔に用いるなどしており、参院選には様々な有名人が出馬あるいは登場する可能性が出てきました。
 一体民主党は何を考えているのでしょうか。かつて民主党は「さくらのパパ」なる有名人を擁立したことがありますが、この人は後に賭博が発覚して問題となり、民主党の印象にダメージを与えました。他党の例を出せば、自民党が料理研究家を当選保障で擁立した際には、小選挙区で落選するも比例1位のため復活当選し、その後には「料理番組」を理由に郵政の採決を欠席、批判を浴びています。また、事実上自民党に擁立されて出馬、落選した堀江氏は後に逮捕され、自民党は氏が無所属で出ていた事実を利用し、しっぽ切りに走りました。この通り、有名人を擁立したところで、ろくな結果にならないのは見えています。どうやら民主党は先の教訓から全く何も学んでいなかったようです。
 その上、日本には「世の中を変えなくてはならない」という志を持って勉学に励み、政治家を目指している人も少なからず存在します。客寄せパンダの席を1つ用意するたびに、志ある者の席が1つ減少することを考えれば、タレントを擁立するなどという行為はあまりにバカげており、とても容認できるものではありません。
 ただ、民主党の行動があまりに愚かである点は疑いようもありませんが、これは民主党だけの責任というより、現行の日本政治の責任、ひいては日本国民の責任であることも、指摘しないわけにはいきません。
 2005年の衆院選時、自民党は広告会社スリードの選挙戦略に基づき、具体性を伏せた上で「郵政」のみをひたすら訴え、あらゆる説明責任を意図的に放棄、さらには料理研究家や堀江氏のような有名人を擁立し、話題性によって大量の議席を取得しました。私はこの衆院選の最中、国民は自民党のあまりの侮辱に必ず怒り、その怒りは自民党を揺るがすであろうと考えていましたが、結果は失望に終わりました。
 失望を抱いたのは民主党議員も同じであるらしく、2009年の衆院選でおよそ意味の分からない政策を言い出したのも、2005年の衆院選で消費税増税などの「苦い」政策を掲げたところ、低IQ選挙戦略と有名人擁立を行った自民党に大敗し、まじめに公約を作っても全く無駄であると知らされたため、甘言を言い立てるよりなかったとの事情もあるようです。自分が作った公約が守れずに苦しんでいるのですから、「自業自得」の一言で片付けたくもなりますが、各党が理想論を並べ立てるだけの不健全な選挙がなされる責任の一端は、確かに国民にもあるはずです。
 また、自民党は2005年の衆院選以後にも、タレントの郷ひろみ氏や宮崎県知事の東国原氏を擁立しようとしたり、自分が事実上の解雇にしたはずの文民統制違反者・田母神氏を擁立しようとしたり、「美人すぎる市議」を擁立する動きを見せたりと、姑息な手段を繰り返しています。自民党がこのような擁立を繰り返すため、対抗上民主党も同様の行為に走らなくてはならないのであれば、自民党が悪いともいえますが、もとはといえばそのようなタレントを支持したり、政治家に侮られるような行動ばかり取る国民に問題があるのです。
 2009年の衆院選の際には、新聞コラムなど一部に「国民は前回衆院選のイメージ選挙に懲りた」との見解を表明する者も存在しましたが、実際にはほとんど変化はありません。麻生内閣時に散々世襲議員が批判されたにもかかわらず、逆風の中で小泉進次郎氏があっさり当選した上、同氏の定員50人のツアーに5000人もの応募があったことからも、それが伺えます。世の中、なぜか小泉氏を過大評価する早とちりな人も存在するようですが、有名な元首相・小泉氏の世襲であるがために目立ってはいるものの、就任からの日数を考えれば当然ながら、小泉氏は今のところ答弁を無難にこなす程度の実績しかなく、客観的には特に高く評価できるだけの結果を残してはいません。もし答弁が上手く、人気があるのが良い政治家であるというのなら、麻生氏はその両方を満たしていたはずです。
 さらには、タレント選挙は大政党だけにとどまらず、小政党の間にまで広がってしまう恐れがあります。2005年の衆院選より、自民党はなりふり構わず有名と見た人物を擁立しようとしていますし、民主党もそれに対抗してか、それとも起死回生のためか、今回の参院選では有名人の擁立を進めています。また、小政党も力の弱さをカバーするために話題性が必要であるからと、有名な知事らを広告塔に使おうとするなどしており、今の日本は政策本位の政治が最も必要な状況でありながら、選挙がまたもタレントの人気投票状態になり始めています。二大政党がくだらないタレント選挙を行っており、小政党がそのような選挙に疑問を呈しているならまだしも、これでは小政党も民主・自民と何ら変わるところがありません。
 また、国民の上記のような態度は、人格も政策もおよそ政治家の器に程遠いながら、なぜか人気だけはある舛添氏のような人物をのさばらせる原因ともなっています。無賃残業合法化にあれほど大反対し、政治家の些細な問題発言や空約束にあれほど荒れ狂う世論が、無賃残業合法化を強力に推進するばかりか、これを「家庭だんらん法案」と言い換えれば通ると発言するほど国民を愚弄し、各種暴言や空約束を行っている舛添氏を支持するのは、いかに少なくない国民が政策や人格を見ようとせず、「人気」を見ているかを体現しています。
 いずれにせよ、国民の態度がタレント選挙を生み出しており、タレント選挙がろくな結果を生まないことだけは、これまでの例からもはっきりしています。日本が座礁域の真っ只中にある状況で、果たしてタレントの人気投票で船長を決めてしまうのが正しいやり方なのか、十分に考える必要があります。
 政党の側も同様です。もし民主党が本気で今後の政権運営を行う意思を持っており、国民に理解と支援を求めたいのであれば、同党は今からでもタレントや落語家の擁立を撤回すべきです。小沢代表以後の変質を正し、タレントを擁立するような姑息な真似もやめれば、それが自動的に自民党との差別化にもつながりますし、分かっている人からは支持が得られるに違いありません。
 自民党の側も、例えば小泉進次郎氏を広告塔として利用すれば、確かに短期的にはある程度の人気が得られるでしょう。しかし、同党がこのような世襲を容認している限り、同党が「保守政党の経済政策」として「機会の平等」を唱えても、支持が得られるわけがありません。まして、仮に小泉氏がそれを唱えるようなことがあれば、説得力はゼロに等しいと言わざるを得ません。また、2005年の選挙では政策の長短をしっかり説明せず、低IQ戦略及びタレント選挙に持ち込んだため、案の定襲ってきた「存在しないはずの」副作用によって支持を失い、これが後の敗北の土壌となりました。これの二の舞を演じるつもりがなければ、いい加減にこのような姑息な方法を用いるのはやめるべきです。

 ただ単に結果を返すだけでもServletより簡単なJAX-RSですが、単純にパスやパラメータを受け取って文字列を返すだけでは、せいぜい「簡略化されたServlet」でしかありません。RESTを標榜するからには、XMLによるデータのやり取りも必要となるでしょう。
 JavaによるXMLといえば、今のところSAX、DOM、StAX、JAXBが有名どころです。しかし、前者3つはそれこそ自分でXMLを解析していかなくてはならず、これではServletで処理するのと全く変わりません。そもそもパース処理がコードのほとんどを占める状況にもなりかねず、開発が大変面倒になります。ここはWebServiceでも用いたJAXBを使用するのがよさそうです。
 そして実際、JAX-RSはXMLのオブジェクト化及びオブジェクトのXML化を自動的に行う仕組みを提供しています(マニュアルの記述によれば、String、byte[]、JAXB、JSONなど、様々な形式を普通に読み書きできるようになっているとのこと)。しかもその使い方といえば、引数や返り値に任意の型を用いるだけであるというのです。これが本当であれば、何とも簡単です。
 以下、簡単な計算機を実装しています。RESTの処理を行うクラスに加え、JAXBで変換を行う@XmlRootElementクラスが1つ、それにXMLリクエストを送受信する動作テスト用Servletが1つで、クラスは3つとなりました。
/WEB-INF
 /classes
  /com
   /yamicha
    /rs
     /server
      @XmlRootElement Calc.java
      @Path CalcService.java
     /client
      @WebServlet CalcServlet.java
 web.xml
 アノテーションのおかげで役割分担が明白です。
 web.xmlは前回と全く同様です。Servletは@WebServletで必要な情報を指定していますので、ここでは特に何も書いていません。
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>
  <display-name>JAX-RS Servlet</display-name>
  <description>JAX-RS Servlet</description>

  <servlet>
    <servlet-name>jax-rs</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.yamicha.rs.server</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>jax-rs</servlet-name>
    <url-pattern>/restserver/*</url-pattern>
  </servlet-mapping>
</web-app>
 Calc.javaはデータ保持用のクラスだけに、中身は完全にJavaBeanです。左辺値、右辺値、演算子、答えの4つのデータを保持できるようにしています。
package com.yamicha.rs.server;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="calc") public class Calc{
	private String value1;
	private String value2;
	private String operator;
	private String answer;

	public Calc(){
	}

	@XmlElement(name="value1") public String getValue1(){
		return value1;
	}
	@XmlElement(name="value2") public String getValue2(){
		return value2;
	}
	@XmlElement(name="operator") public String getOperator(){
		return operator;
	}
	@XmlElement(name="answer") public String getAnswer(){
		return answer;
	}

	public void setValue1(String s){
		value1 = s;
	}
	public void setValue2(String s){
		value2 = s;
	}
	public void setOperator(String s){
		operator = s;
	}
	public void setAnswer(String s){
		answer = s;
	}
}
 CalcService.javaはこれを解析して処理を行うクラスなのですが、XMLとの相互変換はJerseyが勝手にやってくれるため、かなりシンプルな記述で済んでいます。同じJAXBでも、WebServiceを書く際にはそれなりに苦労した記憶がありますが、こちらは全く難しい要素がありませんでした。
package com.yamicha.rs.server;

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

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

	// 動作テスト用
	// ブラウザからでも結果 XML の取得が可能
	@GET @Path("query") @Produces("application/xml")
		public Calc queryCalc(
		@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 jaxbCalc(calc);
	}

	// XML を受け取り、計算結果を記入した XML を返す
	@POST @Path("jaxb") @Produces("application/xml")
		public Calc jaxbCalc(Calc calc){
		try{
			// プロパティはいずれも String 型であるため
			// double として扱っても文字列の連結処理をしても
			// 構わないのだが、今回は int として計算している
			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;
	}
}
 今回は「POSTでXMLを受け取り、計算結果を格納したXMLを返す」メソッドも実装しているため、クライアント側となるServletも実装しました。名前はCalcServlet.javaとしました。Jerseyにはテスト用の機能も付属しているらしいのですが、どうもJersey固有の機能らしいため、ここではHttpURLConnectionでごく普通に処理を行っています。
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{

    if(request.getParameter("operator") == null){
      // 計算(右辺値・左辺値・演算子)入力フォーム
      response.setContentType("text/html;charset=Shift_JIS");
      PrintWriter out = response.getWriter();

      out.println("<html><head></head><body>");
      out.println("<form method="POST">");
      out.println("<input type="text" name="value1" size="10" value="1" /> ");
      out.println("<input type="text" name="operator" size="3" value="+" /> ");
      out.println("<input type="text" name="value2" size="10" value="1" />");
      out.println("<input type="submit" value="計算" />");
      out.println("</form>");
      out.println("</body></html>");
    }else{
      // 入力されたデータを XML 化して送り、計算結果を受け取って表示
      try{
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();

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

        // JAXBContext を作成
        JAXBContext jc = JAXBContext.newInstance(Calc.class);

        // HttpURLConnection を作成
        // Content-type は application/xml
        // データを POST するので、setDoOutput(true) が必要
        HttpURLConnection c = (HttpURLConnection)
          new URL(REST_SERVER + "jaxb").openConnection();
        c.setRequestMethod("POST");
        c.setDoOutput(true);
        c.setRequestProperty("Content-Type" , "application/xml");

        c.connect();

        // XML を POST する処理
        OutputStream os = c.getOutputStream();

        // Calc を XML に変換してストリームに書き込む
        Marshaller m = jc.createMarshaller();
        m.marshal(calc , os);

        os.close();

        // 結果を受け取る
        InputStream is = c.getInputStream();

        // ストリームから XML を読み取り、Calc に変換
        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(IOException e){
        throw e;
      }catch(Exception e){
        throw new IOException(e.toString());
      }
    }
  }
}
 無論、これは別に無理にJavaで書く必要はなく、PerlやPHPなどのスクリプト言語からリクエストを送ったり、あるいは通常のクライアントサイドのアプリケーションからリクエストを送るなどしても、XMLさえ正しく作成及び解析できているのであれば、同様に動作するはずです。
 後は実際に実行してみるだけです。せっかくCalcService.javaにGETの場合の処理も書いたことですし、どのようなXMLが生成されるかをチェックしておくのも面白そうですので、ひとまずブラウザから開くことにしました。

(アプリケーションのURL)/restserver/calc/query?value1=左辺値&operator=演算子&value2=右辺値

 今回の実装では、左辺値と右辺値はintの範囲の整数である必要があります。また、演算子には+、-、*、/、**が使用できます。ただ、JAX-RSを使用するような開発者にいちいち断る必要はなさそうですが、URLは当然エンコードしなくてはなりません。+記号は%2B、-は%2D、*は%2A、/は%2Fです。
 実際に以下のURLを開いてみたところ、

(アプリケーションのURL)/restserver/calc/query?value1=5&operator=%2D&value2=3

 次のような結果が得られました。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<calc>
  <answer>2</answer> 
  <operator>-</operator> 
  <value1>5</value1> 
  <value2>3</value2> 
</calc>
 次はServletですが、こちらは@WebServletアノテーションの記述の通り、以下のURLにマッピングされています。

(アプリケーションのURL)/client/calc

 フォームに必要事項を入力し、正しく計算が行えれば成功です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -