yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/12 の記事
[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] [31]

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
 垂オ訳ございませんが、現在このブログではトラックバックを受け入れていません。

 この記事に対してリンクされる場合には、こちらのURLをご利用ください。
http://void.yamicha.com/blog/blog.cgi?mode=view&number=761
 上記URLをトリプルクリックされますと、簡単にURL全体の選択が行えます。

※以下の記事がトラックバックされます。
辞任相当判定
2010/04/30(Fri)22:55:56
 不起訴処分となった小沢氏に対し、検察審査会が「起訴相当」の判断を下し、波紋が広がっています。小沢氏は続投の意思を見せているものの、党外ばかりか党内からも辞任を求める声が公然と噴出しており、このままでは確実に参院選にも影響するとあって、鳩山内閣はいっそうの窮地に立たされているようです。
 今まで批判をのらりくらりとかわしてきた小沢氏ですが、このような状況になったからには、おそらく氏は遅かれ早かれ幹事長を退くことを余儀なくされるでしょう。いくら権力に固執する小沢氏といえど、氏を取り巻く状況は最悪と言っても過言ではありませんし、そもそも内閣の方が小沢氏をかばいきれなくなりつつあります。状況が好転する見込みもない以上、地位を退かなくてはならないのは時間の問題です。
 そして、いずれ地位を退くことを余儀なくされるのであれば、最初からそうしておけば問題が拡大せずに済んだものを、今まで政治を大混乱させてきた民主党及び小沢氏の罪は重いと言わざるを得ません。特に、党内の異論を封じ込め、批判的な言を行う者を処分し(生方氏の副幹事長解任)、小沢独裁体制を認めてきた民主党執行部、鳩山内閣の責任は非常に重く、内閣の指導力に疑問符がつくのも当然です。
 そもそも鳩山内閣は、小沢氏が政治資金に関する疑惑のみならず、政治家としても国民に全く信任されていないこと、また内閣の二重権力状態に国民が強い疑念を抱いていることも、認識しなくてはなりません。仮に小沢氏が政治資金疑惑において潔白であったとしても、氏の手法や民主党の勢力状態には多くの国民が不信を抱いており、辞任が望まれている点に変わりはありません。
 実のところ、民主党は決して能力のない政党ではありません。鳩山内閣はひどい状態であるとしか言いようがありませんが、閣僚まですべて無能なわけではありません。また、民主党は候補者の公募にも取り組んでいましたので、党内には有能な人材を十分に抱えているはずです。これは、有力政治家の世襲議員を未だに平然と擁立し、公募をすれば杉村氏のような議員を集めるといった有様の自民党と比較し、大きな長所となり得ます。
 しかし、今の民主党は小沢氏の独裁体制にあり、有能な若手や中堅の声が封殺されている状況にあります。小沢氏ら民主党の実権を握っている人間は、もともと自民党から離党した者ばかりですので、これでは自民党がもう1つあるのと変わりません。対する「本物の」自民党も、体制を刷新しようという意思はほとんど持っていないらしいため、二大政党の両方が支持を失う状態につながっています。さらに、最近になって小政党が乱立していますが、これらの多くは自民党離党者によって設立されており、単なる小型自民党に他なりません。これでは政治が閉塞状態に陥るのも無理はありません。
 その上、二重権力状態の民主党において、小沢氏は無茶としか言いようのないことを閣僚に指示し、鳩山氏も勝手なことを公言するため、閣内は大混乱に陥っています。いかに有能な人間が閣内にいたとしても、これでは仕事に取り掛かるどころではありません。さらに、仮に成功を収めたとしても、その成果は国民から評価されるどころか、小沢氏への批判の中に埋もれてしまうのです。
 しかも民主党は、かつては消費税増税を政策に盛り込むなど、必ずしも「甘い汁」ばかりを訴えていたわけではありませんでしたが、小沢氏が権力を握ってからは変質してしまいました。金配りを行った自民党にすら「社会主義政策」とまで批判されるほどで、まがりなりにも負担増を訴えていた以前の民主党に比べ、その劣化を憂う人は少なくないはずです。
 民主党にとって、本来なら今の状況はこの上ない機会に他なりません。自身も支持を失ってしまってはいるものの、自民党は全く体質を変えるつもりがなく、そちらに支持が戻る様子はありませんし、乱立する小政党もほとんどが自民党の衛星政党、あるいはミニ自民党に過ぎません。しかも幸いなことに、民主党には民間から集めた人材も存在し、腐った部分を取り除いたとしても、身は十分に残っています。さらには参院選までが控えており、小沢氏が主導したバラマキ政策の見直しを公言したり、「苦い薬」も含めた現実的な政策を訴えるには事欠かない状態にあります。したがって、小沢氏を排除して独裁状態を終わらせ、若手や中堅の優秀な人材を中心に体制を編成すれば、いち早く「二大自民党及び多数の小自民党」状態から脱却できる可能性は十分にあるのです。
 小沢氏の処遇に関し、ここまで民主党は多くのミスをしてきました。すなわち、大連立の際には民主党を滅亡寸前にまで追い込んだ小沢氏を慰留すべきではありませんでしたし、代表選で小沢氏に近い鳩山氏を選んだのも失敗でした。また、今回も小沢氏を早めに解任しなかったことが、現在の状況につながっています。いずれの場合もその選択が何を意味するかはその時点で明らかに分かっていたはずであり、当時の民主党がそれを選択した結果、今の追い込まれた民主党があるのです。
 確かに小沢氏は豪腕でもあり、参院選の大勝も小沢氏による部分がありますので、むげに扱えないという立場は分からなくもありませんが、それが今の「試合に勝って(選挙での大勝)、勝負に負けた(政策をまともに実現できていない段階での支持率低下と参院選敗北の危機、下手すると党の離散)」状況につながっているのであれば、全く意味がありません。
 ここまでの状況ともなれば、小沢氏が地位を退くのはもはや時間の問題なのですから、民主党は早く始末をつけるべきでしょう。それすら不可能な程度の政党であるならば、自党もろとも退くことになっても文句はいえません。

 前回まででJAX-RSの使い方が分かりましたので、今回はごく簡単な(名前とメッセージを送るとデータベースに発言が登録される)チャットのサーバー側を作成してみます。まさかJava EEでJDBCを直接使ってデータベースの読み書きをするわけにもいきませんので、JAX-RS + EJB + JPAの構成となります。
 クライアント側に関しては、XMLさえ読み書きできれば言語・実行環境は問いませんが、JSF 2.0のAjaxで実装する意図から、web.xmlにはJSF関連の記述を加えてあります。ただし、今回の記事ではサーバー側の実装しか行っていません。
/WEB-INF
 /classes
  /com
   /yamicha
    /rs
     /server
      @Path SimpleChat.java
      @Entity ChatMessage.java
      @XmlElement ChatMessages.java
      @Stateless ChatMessageAccess.java
  /META-INF
   persistence.xml
 web.xml
 アノテーションのおかげで一目瞭然ですが、SimpleChat.javaがリクエストを受け取り、ChatMessageAccess.javaを使ってデータベースに書き込みます。
 前述の通り、今回のweb.xmlにはJSF関連の記述を行っています。
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>

<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>
<servlet-name>jsf20</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>jax-rs</servlet-name>
<url-pattern>/restserver/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>jsf20</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
 データベースを使用するとなれば、用意が必要なのがpersistence.xmlです。
<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="MySQL" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/MySQL</jta-data-source>
    <properties>
      <property name="eclipselink.jdbc.driver"
        value="com.mysql.jdbc.Driver" />
      <property name="eclipselink.ddl-generation"
        value="create-tables" />
      <property name="eclipselink.ddl-generation.output-mode"
        value="database" />
      <property name="eclipselink.target-database" value="MySQL" />
      <property name="eclipselink.logging.level" value="FINE"/>
    </properties>
  </persistence-unit>
</persistence>
 今回はシンプルなチャットですので、テーブルの構成自体は非常に簡単で、IDの他には名前、発言、発言日時を保管するカラムしかありません。
package com.yamicha.rs.server;

import javax.sql.*;
import java.util.Date;
import javax.persistence.*;
import javax.xml.bind.annotation.*;

@Entity @Table(name="rest_chatmessage" , schema="yamicha")
	@XmlRootElement
	public class ChatMessage implements java.io.Serializable{
	private int id;
	private String name;
	private String message;
	private Date date;

	public ChatMessage(){
		id = 0;
	}
	public ChatMessage(String n , String m){
		this();
		name = n;
		message = m;
	}

	@Id @Column(name="id") @GeneratedValue @XmlElement
		public int getId(){
		return id;
	}
	@Column(name="name") @XmlElement public String getName(){
		return name;
	}
	@Column(name="message") @XmlElement public String getMessage(){
		return message;
	}
	@Column(name="date") @Temporal(TemporalType.TIMESTAMP) @XmlElement
		public Date getDate(){
		return date;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setMessage(String s){
		message = s;
	}
	public void setDate(Date d){
		date = d;
	}
}
 ChatMessages.javaはJAXB用です。
package com.yamicha.rs.server;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
	public class ChatMessages implements java.io.Serializable{
	private List<ChatMessage> messages;

	public ChatMessages(){
		messages = new ArrayList<ChatMessage>();
	}
	public ChatMessages(List<ChatMessage> msgs){
		messages = msgs;
	}

	@XmlElement public List<ChatMessage> getMessages(){
		return messages;
	}
	public void setMessage(List<ChatMessage> msgs){
		messages = msgs;
	}
}
 ChatMessageAccess.javaでは、発言日時順に任意の数の発言を取得するメソッド、発言を登録するメソッドの2つを実装しています。
package com.yamicha.rs.server;

import javax.ejb.*;
import javax.annotation.*;
import javax.persistence.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;

@Remote @Stateless(name="ChatMessageAccess" ,
	mappedName="ejb/ChatMessageAccess")
	public class ChatMessageAccess{
	@PersistenceContext(unitName="MySQL") private EntityManager em;

	public ChatMessages getMessages(int max){
		Query q = em.createQuery(
			"SELECT c FROM ChatMessage c ORDER BY c.date DESC");
		if(max != -1)
			q.setMaxResults(max);

		// 結果を ChatMessages にラップして返す
		return new ChatMessages((List<ChatMessage>)
			q.getResultList());
	}
	public void writeMessage(ChatMessage msg){
		// 発言日時を現在時刻に設定する
		msg.setDate(new Date());

		em.persist(msg);
	}
}
 残るはRESTリクエストをさばくSimpleChat.javaなのですが、実はJAX-RS(の仕様なのかJerseyの仕様なのか、はたまた単に先行リリースゆえの未実装であるだけなのかは不明)、EJBのDIを受け付けてくれません。DIしたい変数にアノテーションをつけておいても、注入が一切なされないため、nullになってしまいます。
 仕方がないのでInitialContextから取っていますが、基本的に注意が必要なのはここだけです。
package com.yamicha.rs.server;

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ejb.*;
import javax.naming.Context;
import javax.naming.InitialContext;

@Path("chat") public class SimpleChat{
	private ChatMessageAccess ma;

	public SimpleChat() throws Exception{
		Context c = new InitialContext();
		ma = (ChatMessageAccess)c.lookup(
			"java:global/rs/ChatMessageAccess");
	}

	@POST @Path("write")
		public void writeMessage(ChatMessage message){
		ma.writeMessage(message);
	}

	@GET @Path("all") public ChatMessages readMessages(
		@QueryParam("max") @DefaultValue("20") String smax){
		int max = 20;
		try{
			max = Integer.parseInt(smax);
		}catch(NumberFormatException e){
		}

		return ma.getMessages(max);
	}
}
 この時点では、データを登録するにはXMLをPOSTする必要がありますが、単に動作を確認するだけであれば、データベースに適当なデータを登録しておいて「/restserver/chat/all」をブラウザで開くだけです。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -