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
人気者の府
2010/05/16(Sun)00:47:05
 参院選を控え、各党で有名人の擁立が相次いでいます。民主党は柔道の谷氏を候補に立て、歌手の庄野氏の出馬も確定させましたが、対する自民党もスポーツ選手などを擁立し、国民新党も元野球選手に出馬要請を行っています。また、たちあがれ日本もスポーツ選手を擁立するばかりか、奇異な言動で注目を集めた杉村氏をも擁立するとしていますし、やや色彩は異なりますが、みんなの党は「イケメン経営者」として人気を博しているというタリーズコーヒー創業者・松田氏を擁立するようです。
 第三極を含め、どこもかしこも有名人ばかりといった状況ですが、まさに見るに耐えないという言葉がこれほど合う場面もありません。そもそも参院選、特に比例はその特性からタレント候補が登場しやすく、支持を失ってしまった民主・自民も、また党の規模が小さい弱小政党も厳しい状況であるため、ある程度のタレント候補が登場するのは十分に予想の範疇ですが、いくら何でも度が過ぎています。ここまで極端では選挙なのか人気投票なのか分かりません。
 そして、単に政権交代に伴う政治の混乱が生じただけであれば、それほど問題はありませんでしたが、実際の日本の政界は最悪のシナリオに陥りつつあります。かつて2005年の衆院選では、政策も何もない人気投票によって自民党が大勝し、後から時間差で小泉路線に批判の嵐が吹き荒れるというおかしな状態になっていましたが、このデタラメな状態が再び発生しようとしています。
 このようなくだらないタレント選挙を回避する方法は、1つしかありません。すなわち、政策も何も考慮しない投票者が大量に人気者・人気政党に投票し、当選させてしまうのですから、政策について理解している投票者が対立政党に投票し、政治家や各政党に「タレント選挙は行うだけ無駄である」と知らしめなくてはならないのです。もしそれが実現されなければ、味を占めた政党は再びタレントを立て、他党もタレントで応じざるを得なくなり、選挙が人気投票化する恐れがあります。事実、2005年の時点では「苦い薬」を訴えていた民主党が変質してしまったのは、その際の自民党大勝で「まじめに政策を訴えても無駄」という意識が出てきたことが一因のようです。
 ところが、今回の参院選では民主・自民ともにタレントやスポーツ選手を大量に擁立し、第三極さえも有名人を擁立しています。特に「たちあがれ日本」に至っては、小泉チルドレンの中でも特に多大な功績を残したわけでもなく、奇異で非常識な発言により名前だけが売れている杉村氏に白羽の矢を立てており、知名度目当てであるのは火を見るより明らかです。新党改革に至っては、現党首自身が知名度を利用して党首の座に滑り込む有様で、人気投票を嫌って他党に投票しようにも、選択肢がほとんど存在しない状態です。
 しかも2005年の衆院選の場合、スリードの戦略に基づく低IQ選挙を積極的に仕掛けていたのは自民党のみで、他党にも人気取り行為がなかったわけではないものの、一応は受け皿といえるものが存在していましたが、今回は大小問わず多くの党が人気取りに走っており、先祖がえりどころか状態はさらに悪くなっています。
 人気投票状態もここまでになると、政策などあってないようなものです。つまり、各政党ともいい加減な公約を掲げたり、難しい政策を廃して目先に利のある政策をぶら下げたり、後から適当な理屈でごまかしたりするようになったりしかねませんし、あるいは逆に政策としてしっかり掲げておいたものが、人気投票の影に隠れて注目されなくなってしまい、後から「そんなことは聞いていない」と批判されたりすることも考えられます。いずれにせよ、人気投票はまともな政治を著しく妨げます。
 そもそも、各党が申し合わせたかのようにタレント選挙に走った点からして、今の日本に存在する政党が自民党2つと多数のミニ自民党に他ならず、選択肢が存在しないことを裏付けています。本来であれば、民主党がタレント選挙に走ったとしても自民党は受け入れず、自党が低レベルなタレント選挙から脱却した姿を見せるべきですし、民主党も人気首相の世襲議員に頼るなどしている自民党との差別化を図るべきであって、タレント作戦に出るべきではありませんでした。第三極にしても、英国の自民党のような立場を目指したいのであれば、決して人気投票に加担しないようにすればそれだけで差別化を図れたものを、特に「たちあがれ日本」などは完全にどうかしています。また、タレント擁立というわけではないものの、旧改革クラブは思想の差異を無視して客寄せパンダを党首に迎え入れる有様で、やっていることは同じです。みんなの党に関しては、世襲・中川氏の擁立からして程度は知れているといえますが、それでも経営者・松田氏をタレント候補と評するべきかは微妙なところで、一応「第三極」として他党より頭1つ抜き出ているとはいえなくもありません。
 民主党の混乱やバラマキ政策などは、実際のところ政治にとって深刻な問題ではありません。事実上の戦後初と言っても過言ではない政権交代なのですから混乱しない方が不自然ですし、事業仕分けや子ども手当て財源のための意味不明な控除の廃止などは、自民党政権下ではまず起こりえなかった変化ですから、そこは評価されてしかるべきです。その上で、次のリーダーが子ども手当てなどのバラマキを廃止し、確保した財源を必要なところに振り向けるなり、借金を返すなりすれば良いのです。しかし、その混乱が全党挙げてのタレント選挙を招いたとすれば、これこそ最悪のシナリオです。
 次の参院選がタレント選挙になることがほぼ確定した以上、選挙の結果はどうあれ政治の混迷は避けられないでしょう。民主党にせよ自民党にせよ、あるいは乱立した小政党にせよ、少しの変革で「総自民党」状態から抜け出し、政策本位の支持を集めることができるところを、まとめてくだらないタレント選挙に走ってしまったのは残念でなりません。

 前回の簡易チャットでは@POSTで投稿、@GETで取得を行いましたが、(目的外利用が多いとはいえ)POSTとGETとは何とも普通で、@PUTも@DELETEも使用していません。そこで今回は、@PUTによる更新、@DELETEによる削除も実装した、簡素な「書評」らしきプログラムのサーバー側コードを書いてみます。
/WEB-INF
 /classes
  /com
   /yamicha
    /rs
     /server
      @Path BookReviewService.java
      @Entity Book.java
      @XmlElement Books.java
      @Entity Review.java
      @XmlElement Reviews.java
      @Stateless BookReviewAccess.java
  /META-INF
   persistence.xml
 web.xml
 このうちweb.xmlとpersistence.xmlは以前と全く同じで、ディレクトリ構成も同じです。私の環境では実際に以前の簡易チャットと共存させています。@Pathで別々のパスさえ設定すれば、当然ながら異なるRESTの共存は可能です。
// BookReviewService.java
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("book") public class BookReviewService{
	private BookReviewAccess ba;

	public BookReviewService() throws Exception{
		Context c = new InitialContext();
		ba = (BookReviewAccess)c.lookup(
			"java:global/rs/BookReviewAccess");
	}

	// サンプルデータを作成するメソッド
	@GET @Path("regist") public String registSampleBooks(){
		Book books[] = {
		new Book("Java EE プログラミング" ,
			"Cafe Babe Team" , "技術評論社" , 2600) ,
		new Book("どんなバカでもSQLが分かる本" , "El Escue" ,
			"ソフトウェアパブリッシング" , 1500) ,
		new Book("PHP + MySQL プログラミング" , "Zend" ,
			"パイソン・エデュケーション" , 4500) ,
		new Book("Java文法の基礎" , "Esp Resso" ,
			"ソフトウェアパブリッシング" , 980) ,
		new Book("改正刑法基礎知識" , "麻斐閣" ,
			"麻斐閣" , 2600) ,
		new Book("Java Servlet" , "Tom Cat" ,
			"ASFパブリッシング" , 2000) ,
		new Book("支配された日本・告発の本" , "ブログ市長" ,
			"ぽち出版" , 850)
		};

		for(Book b : books)
			ba.addBook(b);

		return "サンプルデータを登録しました。";
	}

	@GET @Path("books/{word}") public Books getBooks(
		@PathParam("word") String word){
		return new Books(ba.getBooks(word , 20));
	}
	@GET @Path("book/{id}") public Book getBook(
		@PathParam("id") int id){
		return ba.getBook(id);
	}
	@GET @Path("book/reviews/{id}") public Reviews getReviews(
		@PathParam("id") int bookId){
		return new Reviews(ba.getReviews(bookId));
	}

	@POST @Path("review") public void addReview(Review r){
		ba.addReview(r);
	}

	@PUT @Path("review") public void mergeReview(Review r){
		ba.mergeReview(r);
	}

	@DELETE @Path("review/{id}") public void removeReview(
		@PathParam("id") int id){
		ba.removeReview(id);
	}
}

// BookReviewAccess.java
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="BookReviewAccess" , mappedName="ejb/BookReviewAccess")
	public class BookReviewAccess{
	@PersistenceContext(unitName="MySQL") private EntityManager em;

	public List<Book> getBooks(String word , int max){
		if(word != null)
			word = "%" + word.replace("%" , "\%") + "%";
		else
			word = "%";

		Query q = em.createQuery(
			"SELECT b FROM Book b WHERE b.title LIKE ?1");
		q.setParameter(1 , word);
		if(max != -1)
			q.setMaxResults(max);

		return (List<Book>)q.getResultList();
	}
	public List<Review> getReviews(int bookId){
		Query q = em.createQuery(
			"SELECT r FROM Review r WHERE r.book.id = ?1" +
			" ORDER BY r.date DESC");
		q.setParameter(1 , bookId);

		return (List<Review>)q.getResultList();
	}

	public Book getBook(int id){
		return em.find(Book.class , id);
	}
	public Review getReview(int id){
		// XML として送受信する場合のために
		// r.bookId プロパティに対して
		// book の id を格納しておく
		Review r = em.find(Review.class , id);
		r.setBookId(r.getBook().getId());
		return r;
	}

	public void addBook(Book b){
		em.persist(b);
	}
	public void addReview(Review r){
		// r.bookId を ID に使って Book を取得し
		// その参照を r.book に格納する
		if(r.getBookId() != 0)
			r.setBook(em.getReference(Book.class ,
				r.getBookId()));

		r.setDate(new Date());
		em.persist(r);
	}

	public void removeBook(int id){
		em.remove(em.getReference(Book.class , id));
	}
	public void removeReview(int id){
		em.remove(em.getReference(Review.class , id));
	}

	public void mergeBook(Book b){
		em.merge(b);
	}
	public void mergeReview(Review r){
		if(r.getBookId() != 0)
			r.setBook(em.getReference(Book.class ,
				r.getBookId()));
		em.merge(r);
	}
}

// Books.java
package com.yamicha.rs.server;

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

@XmlRootElement(name="booksRoot")
	public class Books implements java.io.Serializable{
	private List<Book> books;

	public Books(){
		books = new ArrayList<Book>();
	}
	public Books(List<Book> b){
		setBooks(b);
	}

	@XmlElement public List<Book> getBooks(){
		return books;
	}
	public void setBooks(List<Book> b){
		books = b;
	}
}

// Book.java
package com.yamicha.rs.server;

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

@Entity @Table(name="rest_book" , schema="yamicha") @XmlRootElement
	public class Book implements java.io.Serializable{
	private int id;
	private String title;
	private String author;
	private String publisher;
	private int price;
	private List<Review> reviews;

	public Book(){
		id = 0;
		reviews = new ArrayList<Review>();
	}
	public Book(String t , String a , String p , int i){
		this();
		title = t;
		author = a;
		publisher = p;
		price = i;
	}

	@Id @Column(name="id") @GeneratedValue @XmlElement
		public int getId(){
		return id;
	}
	@Column(name="title") @XmlElement public String getTitle(){
		return title;
	}
	@Column(name="author") @XmlElement public String getAuthor(){
		return author;
	}
	@Column(name="publisher") @XmlElement
		public String getPublisher(){
		return publisher;
	}
	@OneToMany(mappedBy="book" , cascade=CascadeType.ALL)
		@XmlElement public List<Review> getReviews(){
		return reviews;
	}
	@Column(name="price") @XmlElement public int getPrice(){
		return price;
	}

	public void setId(int i){
		id = i;
	}
	public void setTitle(String s){
		title = s;
	}
	public void setAuthor(String s){
		author = s;
	}
	public void setPublisher(String s){
		publisher = s;
	}
	public void setReviews(List<Review> l){
		reviews = l;
	}
	public void setPrice(int i){
		price = i;
	}
}

// Reviews.java
package com.yamicha.rs.server;

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

@XmlRootElement(name="reviewsRoot")
	public class Reviews implements java.io.Serializable{
	private List<Review> reviews;

	public Reviews(){
		reviews = new ArrayList<Review>();
	}
	public Reviews(List<Review> r){
		setReviews(r);
	}

	@XmlElement public List<Review> getReviews(){
		return reviews;
	}
	public void setReviews(List<Review> b){
		reviews = b;
	}
}

// Review.java
package com.yamicha.rs.server;

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

@Entity @Table(name="rest_review" , schema="yamicha") @XmlRootElement
	public class Review implements java.io.Serializable{
	private int id;
	private String name;
	private String message;
	private Date date;
	private Book book;
	private int bookId;
	// bookId は XML 用のプロパティ
	// book をそのまま受け渡そうとすると循環参照になるため
	// book は @XmlTransient
	// bookId は @Transient にしてある

	public Review(){
		id = 0;
	}
	public Review(String n , String m){
		this();
		name = n;
		message = m;
	}
	public Review(String n , String m , int i){
		this(n , m);
		bookId = i;
	}

	@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") @XmlElement
		@Temporal(TemporalType.TIMESTAMP) public Date getDate(){
		return date;
	}
	@JoinColumn(name="book" , referencedColumnName="id")
		@XmlTransient
		public Book getBook(){
		return book;
	}
	@Transient @XmlElement public int getBookId(){
		return bookId;
	}

	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;
	}
	public void setBook(Book b){
		book = b;
	}
	public void setBookId(int i){
		bookId = i;
	}
}
 もう少しまともな書評プログラムであれば、レビューを行うユーザーを登録制にしてUser.javaなどのEntityを作成し、それをReview.javaに持たせるなどした上、そのユーザーにしか編集・削除権を与えないようにすべきですが、RESTに関係のないコードがかなり増えてしまうため、その辺は省略しています。とはいえ、実装するのは必ずしも難しくはないでしょう。
 後はせいぜい、Reviewにおいて循環参照が発生しないように対処している程度です。

 後はクライアント側のプログラムを作成してアクセスすれば良いのですが、とりあえずブラウザで

(アプリケーションのURL)/restserver/book/regist

 これを開いてサンプルを登録し、さらに

(アプリケーションのURL)/restserver/book/books/Java
("Java"の部分は任意の語句。ただし、日本語などエンコードが必要な文字ならエンコードすること)

 これでキーワードに合致する書籍の一覧がXMLで取得できれば成功です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -