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

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

※以下の記事がトラックバックされます。
そのまんま手柄窃盗
2007/01/25(Thu)12:41:17
 あきれました。もうこの上なく。
 そのまんま東(東国原)氏当選。同氏としては「東国原」と呼んでほしいようですが、「そのまんま東」の方が区別がつけやすいですし、何より「そのまんま東」を通称名として使用し、それで当選した以上、当選した途端に「東国原」ではバランスを欠きます。通称名「そのまんま東」の呼称は免れません。
 とにかくそのまんま東氏は知事選で圧勝、当選しました。同氏も知名度先行とはいえそれなりの努力をしての当選であり、選挙前には「引退宣言」も行っています。芸能界は一般の会社に比べて異常なほど甘いため、引退宣言をしたところで後で復帰しようとすれば簡単にできるでしょうが、一応「退路を断つ」努力とみなすことはできるでしょう。また、マニフェストなどに関しても色々勉強を重ねてきたようです。当選の報が入るまで、相当緊張した時間を過ごされたことでしょう。
 しかし、大変嘆かわしいことなのですが、この事実を横取りしようとする浅ましすぎる人間が存在します。そういうハイエナのような人間が我が国に存在するというだけで頭が痛くなりますが、いくら嘆いても実在するのですからどうしようもありません。過去に存在したハイエナである「堀江」や「村上」などはオリの中ですが、このハイエナは今でも幅を利かせて堂々としていらっしゃいます。
 その名は「安倍」。何でも「氏は不祥事から立ち直り、大学を出て再チャレンジを果たした」そうです。何をバカげたことを。今回ばかりはこの不用意な発言に極めて強い怒りを覚えます。もはやあきれて物も言えませんが、あえて文字にするなら「バカを言うんじゃない、バラマキ安倍」の一言です。
 そのまんま東氏は以前に不祥事を犯しましたが、これは民間なら(たとえ冤罪でも)一発で終わりです。復帰など無理であり、ましてや出馬など夢のまた夢です。もし安倍氏が「そのまんま東氏のような売れっ子芸人には再チャレンジが認められるべきだ。一般国民に再チャレンジなど恐れ多いものであり、一切必要ない」という意味でこれを言ったのなら納得ですが。どちらにせよ、他人の手柄を横取りして、知事選で負けて苦い顔ながら「再チャレンジ」のアピールとは。確かに日本は美しい国ではなくなっているようです。首相からしてハイエナ同然なのですから。あまりに節度というものが不足しています。
 全く、愛国心や奉仕活動を押し付ける前に、自分の節度から何とかしてはいかがですか。しかもその目玉政策の「再チャレンジ」も単なるバラマキであり、また「ホワイトカラー〜」制度のように再チャレンジと完全に相反する制度の導入にも熱心です。このような首相がのさばる国など全く美しくありません。
 「私が愛国を口にしないのは、妻に愛を口にしないのと同じ」とは「バカの壁」の著者の言葉ですが(作者の年代が分かるような発言です)、この「バカの壁」によれば「愛憎は紙一重の関係にあり、愛も何もなければ全くの無関心になる」とのこと(発売から間もないころに読んだためうろ覚えですが)。ということは、日本の政治、教育、経済などについて論じている、あるいは思考している多くの人は、広義の「愛国」を持っている、とみなすことができそうです。
 つまり、私のような主張者ですら「愛国心の押し付けのようなバカげた教育を絶対に容認することができず、ハイエナ同然の首相が国のトップであることに強い怒りを覚える」程度の愛国を持つものと定義することができます。逆に言えば、こういうことが平気でなされる国は「愛されるなどもっての他の汚れ果てた国」ということです。
 事実、日本古来の文化である「礼」と「助け合い」はここまででもかなり弱っていたのに、小泉・安倍路線がトドメをさしてしまいました。逆に、日本政治の悪しき伝統である「バラマキ」を「再チャレンジ」の名の下に復活させようというのが安倍政権です。
 そのまんま東氏の手腕はまだ未知数ですが、少なくとも地元を盛り上げたい気持ちが存在するのは事実でしょう。そうでなければ、タレント活動に精を出していた方がリスクも少ないのですから。地元愛で新人として飛び込んだ東氏と、自党候補が氏にボロ負けしたくせにそれを「再チャレンジ」のアピールに使う安倍氏、見事なまでの好対照といえましょう。美しい日本を愛する多くの国民も、最近は「安倍不支持」に回っているようですし。

 ところで、宮崎知事選を少々分析してみたのですが、面白いことが分かりました。
 まず投票者を大きく4つに分類してみます。固定層、政党支持層、無党派層、低IQ層となるでしょう。これらのうちどの層が勝負を握るかは、選挙の状況によってかなり変わってきます。それでは宮崎の知事選ではこれらがどのように絡んできたのでしょうか。
 その前にこの分類の意味を簡単に述べておきましょう。まず固定層は利権者や公明党支持者などであり、変動が少ない特徴があります。政党支持層はそのまま、特定の政党を支持している人です。ただし、特定の政党支持層の人が必ず支持政党に投票するわけではありませんし、最近は支持政党も流動的になってきています。3つ目と4つ目は双方とも無党派層ではありますが、前者が政治を理解しているのに比べ、後者はそれを理解していないという点が違います。無党派層には棄権も多いと考えられますが、前者が棄権する理由は「支持できる政党がない」、後者は「政策の意味が分からないし、興味もない」が主な理由でしょう。
 ですから、「無党派に訴える」戦略を取る場合においても、「狭義の無党派層に訴える」のと「低IQ層に訴える」のとでは作戦が全く違ってきます。狭義の無党派層に訴えるのであれば、とにかく政策を十分に練り、主張・実績を積み重ねることです。逆に低IQ層に訴えるのであれば、政策を論じてはいけません。とにかくパフォーマンスに終始し、自分のみ正義で他が悪であると錯覚させ、マスコミに1秒でも多く取り上げられるようにすることです。
 では今回の「そのまんま選挙」の様相は。出口調査によれば、自民党支持者の3割、民主党支持者の4割強、無党派層の過半数が東氏に投票したそうです。低IQ層がそのまんま東氏の知名度のみで投票した分もかなり入っているのでしょうが、この結果はそれだけでは説明できません。
 ここで他の候補についても分析してみましょう。民主党が支援した候補は、自民支持層の4割、民主の4割強、無党派の3割から支持を受けています。自民党が支援した候補については、自民支持層で3割、民主で1割、無党派層で1割という有様です。自民支持層では3者が票を奪い合い、民主支持層では東氏と自党支援候補が奪い合い、無党派では東氏が圧倒的ではありますが、民主支援候補も3割を得ています。
 このいびつな構造はなぜ発生したのか。土地柄、前知事の不祥事、民主支援候補について自民の一部からも推す声があったことなども検討しなければなりませんが、簡単に言えば「自民支持層にも自民党に愛想をつかせている人が少なくない」「無党派層は案外民主党にも入れており、自民党を嫌っている」「民主支持層にも民主党に物申したい人が少なくない」ことが読み取れます。
 まず自民党ですが、私が総裁選以前から指摘していたように、安倍氏のあまりにひどい思想と政策は多くの国民の知るところとなりました。これがかなりのダメージとなっていることは言うまでもありません。特に無党派層から全く支持を受けられなかった点は注目に値します。(狭義の)無党派層が自民の横暴を嫌ったと考えるのが自然です。
 民主党は意外にも善戦していますが、民主党支持層でも東氏支持がかなり多かった点に留意する必要があります。つまりふぬけた小沢体制に怒る民主党支持層の人々が東氏を受け皿としたということです。小沢体制が許せないから民主には入れたくない、しかし自民党にはもっと入れたくない、それなら東氏に、というわけです。
 東氏の場合はどうでしょうか。低IQ層が選挙に行けばほぼ確実に東氏に入れることでしょうが、東氏は比較的抑え目の選挙活動を行っていました。また、無党派層において意外に民主支援候補が支持を得たのは、(狭義の)無党派層の一部が「タレント反発票」を投じたのと、低IQ層の投票が案外少なかったことが考えられます。低IQ層の投票がもっと多ければ、無党派層全体の母集団がかなり大きくなり、また低IQ層のほとんどが東氏に入れると考えられることから、相対的に無党派層における民主・自民支援候補の得票比率はもっと下がっていたはずです。
 結論としては、まず前知事の不祥事が根底にあり、さらに安倍氏の横暴的な行為によって多くの人が「自民離れ」を起こし、「自民党には絶対入れない」という状態に陥ったものと考えられます。しかしながら、民主党は小沢体制以後使い物になりません。だとすれば、この選挙が自民・民主の一騎打ちであれば民主党にするか棄権するかの選択になるところですが、今回は東氏がいました。つまり「東氏に入れる」ことがそのまま解になるのです。
 民主支援候補が意外にも広い層から票を得ているのは「自民は支持に値しない。しかしタレント候補は支持できない」といったタレント批判票によるものでしょうが、ここで東氏の作戦が奏功しました。アピールを抑え目にすることで、低IQ層の票を犠牲にする代わりに、(狭義の)無党派層と政党支持者を必要以上に「批判票」に走らせずに済んだのです。これがもしタレントの知名度を大々的に使った選挙であったなら、低IQ層から広く票を集める反面、「バカにするな」とばかりに他の層の大反発を招き、当選の事実は変わらないにしても勢力図はかなり違ったものになっていたでしょう。
 具体的にはどうなるのか。今選挙での無党派層の投票比率は「東5.5:民3:自1.3」程度のようですが、もし東氏がパフォーマンス選挙を行っていたら、「東5.5〜6.5:民2.5〜3:自0.5〜1」辺りになったのではというのが私の見立てです。低IQ層の分だけ無党派全体の母集団の数が増え、東氏の得票も増える代わりに、批判票として民主党の得票もある程度増え、狭義の無党派層からも低IQ層からもあまり投票されないであろう自民党はさらに埋没する格好です。
 他の政党では、自民支持層の比率はあまり変わらないか、東氏の比率が多少減ることが予想できます。民主支持層の投票比率では東氏と民主支援候補がほぼ互角なのですが、東氏がパフォーマンス選挙を行って反感を買っていれば、おそらく東氏の支持が減って民主支援候補の支持が増える形になっていたでしょう。
 では気になる参院選の行方は。残念ながら、この分析から参院選の動向を読むのはかなり困難です。参院選には「そのまんま東」がいないのですから。「メッキがはげた安倍政権、自民党は許せない」のではありますが、「民主党は小沢体制になってから劣悪になってしまった」ため、他に受け皿があればそこが躍進したことでしょうが、今の日本に受け皿はありません。もし民主党が前のままなら自民の受け皿になっていたはずですが、小沢体制では受け皿となることすらおぼつきません。何とも予想がつかない状態です。
 ただ、理想を言えば民主党に勝って欲しいです。もし自民党が勝ちでもすれば、無賃残業合法化制度が導入されてしまいかねません。同時に消費税を上げて法人税を下げる作戦にも出てくるでしょう。参院選まで共謀罪が留保されていたなら、これも成立させられることになります。ハイエナ首相の横暴をこれ以上許すことはできません。

 Persistence APIをTomcatで動かす。確かにPersistence APIはJava EE向けに作られたものですが、TomcatはJava EEというよりServletコンテナと表現する方が適切なものです。果たしてそのようなことが可能なのでしょうか。
 まずBluePrintsで習得した仕様を検討してみます。BluePrintsのサンプルのbuild.xmlによれば、Webアプリケーションはコンパイル後にwarファイル内で次のような配置を取るようです。
FileName.war
 /WEB-INF
  /classes
   /com
    /yamicha
     /package_name
      *.class
   /META-INF
    persistence.xml
 *.jsp
 興味深いのは、クラスファイルは「classes/com/yamicha...」内に配置され、persistence.xmlもJava SEで使用する場合と同じ位置に配置されるのですが、*.jspだけはWEB-INFの外に置かれている点です。Tomcat及びTomcatを内部で使用しているSun AppServerでは、JSPは自動的に「org.apache.jsp」に属するとみなされるようですが、上記の配置がSun AppServerで動くとされているからには、同じ機構を用いているTomcatでも動くでしょう(根拠のない自信)。
 ではまずアプリケーションをデザインするとしましょうか。以前に色々Servletを試した際、実験用ディレクトリとして「examples」を作成しましたので、今回はこれを利用します。ここにBluePrintsの完成系と同じようにファイルを配置していけば良いのです。たぶん。
 具体的にはこうなります。
/Tomcat_Dir
 /webapps
  /examples
   persist.jsp
   /WEB-INF
    /classes
     /META-INF
      persistence.xml
     /com
      /yamicha
       /toplink
        /characters
         Creator.class
         Element.class
         Name.class
         Prefix.class
         Sex.class
         SexList.class
 この配置やクラス名にピンと来た方、ご名答です。クラス及びパッケージ名はここで作成したものと同じなのです。ただし、今回は複合キーは使いません。カスケード構造も少々変更しています。おかげで、中身はほとんど同じというのに、無駄に長々とソースを記述することになりそうです。
 まずpersistence.xmlから。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
 <persistence-unit name="persist" transaction-type="RESOURCE_LOCAL">
   <provider>
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
</provider>
  <exclude-unlisted-classes>false</exclude-unlisted-classes>
  <properties>
   <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" />
   <property name="toplink.jdbc.url" 
value="jdbc:mysql:///yamicha?useUnicode=true&characterEncoding=SJIS" />
   <property name="toplink.jdbc.user" value="yamicha" />
   <property name="toplink.jdbc.password" value="password" />
   <property name="toplink.ddl-generation" value="create-tables" />
   <property name="toplink.target-database" value="MySQL4" />
  </properties>
 </persistence-unit>
</persistence>
 以前までとほとんど同じです。TomcatではJNDIからのDBの取得ができないのか、<non-jta-data-source>を使うと例外を投げられました。
 次は実に長々としたソースです。
// Creator.java

package com.yamicha.toplink.characters;

import javax.persistence.*;
import java.util.List;
import java.util.ArrayList;

@Entity @Table(name="persist_creator" , schema="yamicha") 
	public class Creator{
	private int number;
	private String url;
	private String creator;
	private List<Name> names;

	public Creator(){
		names = new ArrayList<Name>();
	}
	public Creator(String url , String creator){
		this();
		this.url = url;
		this.creator = creator;
	}

	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) 
		@Column(name="number") 
		public int getNumber(){
		return number;
	}

	@Column(name="url") public String getURL(){
		return url;
	}
	@Column(name="creator") public String getCreator(){
		return creator;
	}
	@OneToMany(cascade=CascadeType.ALL , mappedBy="creator" , 
		fetch=FetchType.EAGER) 
		public List<Name> getNames(){
		return names;
	}

	private void setNumber(int n){
		number = n;
	}
	public void setURL(String u){
		url = u;
	}
	public void setCreator(String c){
		creator = c;
	}
	public void setNames(List<Name> names){
		this.names = names;
	}

	public String toString(){
		return creator;
	}
}

// Element.java
package com.yamicha.toplink.characters;

import javax.persistence.*;
import java.util.List;
import java.util.ArrayList;

@Entity @Table(name="persist_element" , schema="yamicha") 
	public class Element{
	private int number;
	private String element;
	private List<Name> names;

	public Element(){
		names = new ArrayList<Name>();
	}
	public Element(int number , String element){
		this();
		this.number = number;
		this.element = element;
	}
	public Element(List<Name> names , int number , String element){
		this();
		this.number = number;
		this.element = element;
		this.names = names;
	}

	@Id @Column(name="number") 
		public int getNumber(){
		return number;
	}
	@Column(name="element") public String getElement(){
		return element;
	}
	@ManyToMany(fetch=FetchType.EAGER) 
		@JoinTable(name="persist_name_element" , 
		joinColumns=@JoinColumn(name="element") , 
		inverseJoinColumns=@JoinColumn(name="name")) 
		public List<Name> getNames(){
		return names;
	}

	public void setNumber(int n){
		number = n;
	}
	public void setElement(String e){
		element = e;
	}
	public void setNames(List<Name> n){
		names = n;
	}

	public String toString(){
		return element;
	}
}

// Name.java
package com.yamicha.toplink.characters;

import javax.persistence.*;
import java.util.List;
import java.util.ArrayList;

@Entity @Table(name="persist_name" , schema="yamicha") 
	public class Name{
	private int number;
	private String name;
	private Creator creator;
	private List<Element> elements;
	private Prefix prefix;
	private Sex sex;

	public Name(){
		elements = new ArrayList<Element>();
	}
	public Name(Creator creator , String name){
		this();
		this.creator = creator;
		this.name = name;
	}

	@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) 
		@Column(name="number") 
		public int getNumber(){
		return number;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@ManyToOne(fetch=FetchType.EAGER) 
		@JoinColumn(name="creator") 
		public Creator getCreator(){
		return creator;
	}
	@ManyToMany(cascade=CascadeType.ALL , fetch=FetchType.EAGER , 
		mappedBy="names") @OrderBy("number") 
		public List<Element> getElements(){
		return elements;
	}
	@OneToOne(cascade=CascadeType.ALL , fetch=FetchType.EAGER , 
		mappedBy="name") 
		@PrimaryKeyJoinColumn(name="number" , 
		referencedColumnName="number") 
		public Prefix getPrefix(){
		return prefix;
	}
	@OneToOne(cascade=CascadeType.ALL , fetch=FetchType.EAGER ,
		 mappedBy="name") 
		@PrimaryKeyJoinColumn(name="number" , 
		referencedColumnName="number") 
		public Sex getSex(){
		return sex;
	}

	private void setNumber(int number){
		this.number = number;
	}
	public void setName(String name){
		this.name = name;
	}
	public void setCreator(Creator c){
		creator = c;
	}
	public void setElements(List<Element> e){
		elements = e;
	}
	public void setPrefix(Prefix p){
		prefix = p;
	}
	public void setSex(Sex s){
		sex = s;
	}

	public String toString(){
		return name;
	}
}

// Prefix.java
package com.yamicha.toplink.characters;

import javax.persistence.*;
import java.util.List;
import java.util.ArrayList;

@Entity @Table(name="persist_prefix" , schema="yamicha") 
	public class Prefix{
	private int number;
	private String prefix;
	private Name name;

	public Prefix(){
	}
	public Prefix(Name name , String prefix){
		this.prefix = prefix;
		this.name = name;
		number = name.getNumber();
	}

	@Id @Column(name="number") 
		public int getNumber(){
		return number;
	}
	@Column(name="prefix") public String getPrefix(){
		return prefix;
	}
	@OneToOne(fetch=FetchType.EAGER) 
		@PrimaryKeyJoinColumn(name="number" , 
		referencedColumnName="number") 
		public Name getName(){
		return name;
	}

	public void setNumber(int n){
		number = n;
	}
	public void setPrefix(String p){
		prefix = p;
	}
	public void setName(Name n){
		name = n;
	}

	public String toString(){
		return prefix;
	}
}

// Sex.java
package com.yamicha.toplink.characters;

import javax.persistence.*;

@Entity @Table(name="persist_sex" , schema="yamicha") 
	public class Sex{
	private int number;
	private Name name;
	private SexList sex;
	public Sex(){
	}
	public Sex(Name name , SexList sex){
		number = name.getNumber();
		this.name = name;
		this.sex = sex;
	}

	@Id @Column(name="number") public int getNumber(){
		return number;
	}
	@Column(name="sex") @Enumerated(EnumType.ORDINAL) 
		public SexList getSex(){
		return sex;
	}
	@OneToOne(fetch=FetchType.EAGER) 
		@PrimaryKeyJoinColumn(name="number" , 
		referencedColumnName="number")
		public Name getName(){
		return name;
	}

	public void setNumber(int n){
		number = n;
	}
	public void setSex(SexList sl){
		sex = sl;
	}
	public void setName(Name n){
		name = n;
	}

	public String toString(){
		return sex.getLabel();
	}
}

// SexList.java
package com.yamicha.toplink.characters;

public enum SexList{
	MALE("男性") , FEMALE("女性") , NEWTRAL("中性");

	private String label;
	private SexList(String label){
		this.label = label;
	}
	public String getLabel(){
		return label;
	}
}
 代わり映えしませんが、ソースです。これをまじめにServlet内で記述してコンパイルするより、どこか別の場所で作っておいて、動作テストをした上で配置した方が楽でしょう(私も実際にそうしています)。別の場所でコンパイルしておいて、クラスファイルのみを投げ入れるのでも構いません。
 それでは今回の主要部、persist.jspに参りましょう。
<%@ page import="javax.servlet.http.* , javax.servlet.* , java.util.* , 
javax.persistence.* , com.yamicha.toplink.characters.* , 
static com.yamicha.toplink.characters.SexList.*"
contentType="text/html;charset=Shift_JIS" %>

<html>
<head>
<title>Java Persistence JSP</title>
</head>

<body>

<%
EntityManagerFactory factory = 
	Persistence.createEntityManagerFactory("persist");
EntityManager em = factory.createEntityManager();

EntityTransaction et = em.getTransaction();

try{
et.begin();

// 繰り返し実行できるようにするため、まずデータを削除
List<Creator> creatorlist = (List<Creator>)
	em.createQuery("SELECT c FROM Creator c").getResultList();
for(Creator c : creatorlist)
	em.remove(c);

em.flush();

Creator creators[] = {
	new Creator("http://www.yamicha.com/" , "yamicha.com") , 
	new Creator(null , "hisame") , 
	new Creator("http://sousya.umu.cc/" , "ruva") , 
	new Creator(null , "coolmint") , 
	new Creator(null , "Shou")
};

for(Creator c : creators)
	em.persist(c);

Name names[] = {
	new Name(creators[0] , "イリアス") ,
	new Name(creators[0] , "サーラ") ,
	new Name(creators[0] , "シェイン") ,
	new Name(creators[1] , "うなぎ") ,
	new Name(creators[1] , "ネコ") ,
	new Name(creators[1] , "クロウ") ,
	new Name(creators[2] , "ルヴァ") ,
	new Name(creators[2] , "リサ") ,
	new Name(creators[2] , "ファルシア") ,
	new Name(creators[3] , "クルード") ,
	new Name(creators[3] , "フィオーナ") ,
	new Name(creators[4] , "アルヤ") ,
	new Name(creators[4] , "ルナン") ,
	new Name(creators[4] , "レイシス") ,
	new Name(creators[0] , "ハードゥン") ,
	new Name(creators[3] , "セシール") ,
	new Name(creators[4] , "セイル")
};

for(Name n : names)
	em.persist(n);

em.flush();

Element elements[] = {
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[6] , names[11] , names[12] , 
		names[13] , names[15]})) , 1 , "火") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[3] , names[6] , names[10]})) , 2 , "水") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[3] , names[6] , names[11] , 
		names[12] , names[13]})) , 3 , "雷") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[4] , names[6] , names[12] , names[13]})) 
		, 4 , "土") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[5] , names[6] , names[10] , 
		names[12] , names[13]})) , 5 , "風") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[2] , names[6] , names[8] , 
		names[11] , names[14]})) , 6 , "回復") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[2] , names[6]})) , 7 , "聖") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0] , names[5]})) , 8 , "暗") ,
	new Element(
		new ArrayList<Name>(Arrays.asList(new Name[]{
		names[0]})) , 9 , "RDBMS")
};

for(Element e : elements)
	em.persist(e);

String prefixes[] = {
	"魔道士" , "騎士" , "聖騎士" , "デビル" , "デビル" ,
	"デビル" , "司祭" , "僧侶" , "聖騎士" , "剣士" ,
	"風術師" , null , null , null , "剣聖" , null , "勇者"
};

for(int i = 0; i < prefixes.length; i++)
	em.persist(new Prefix(names[i] , prefixes[i]));

SexList sexes[] = {
	FEMALE , NEWTRAL , MALE , FEMALE , FEMALE , FEMALE ,
	FEMALE , FEMALE , MALE , MALE , FEMALE , MALE ,
	FEMALE , FEMALE , MALE , FEMALE , MALE
};

for(int i = 0; i < sexes.length; i++)
	em.persist(new Sex(names[i] , sexes[i]));

et.commit();

for(Creator c : creators)
	em.refresh(c);
}catch(Exception e){
	out.println(e);
}

try{
// 作者ごとの属性一覧
out.println("<b>クリエイターごとの属性使用数</b>");

List<Creator> creators = (List<Creator>)em.createQuery(
	"SELECT c FROM Creator c").getResultList();

%>
<table border="1" cellspacing="0">
<tr><td bgcolor="#CCDDFF">Creator</td>
<td bgcolor="#CCDDFF">Element</td>
<td bgcolor="#CCDDFF">Value</td></tr>
<%

Query q_element = em.createQuery(
	"SELECT e.element , COUNT(e) FROM Element e " + 
	"JOIN e.names n JOIN n.creator c WHERE c.number = :number " + 
	"GROUP BY e.element ORDER BY e.number");
for(Creator c : creators){
	q_element.setParameter("number" , c.getNumber());
	List<Object[]> l = (List<Object[]>)
		q_element.getResultList();

	// クリエイター情報
	out.println("<tr><td valign=\"top\" rowspan=\"" + 
		(l.size() + 1) + "\">");
	out.println("<b>" + c.getCreator() + "</b>");
	if(c.getURL() != null)
		out.println("<br>" + c.getURL());
	out.println("<br>Character(" + c.getNames().size() + ")");
	out.println("</td>");

	// 属性一覧
	out.println("<td bgcolor=\"#DDDDDD\"><b>Kind</b>");
	out.println("</td><td bgcolor=\"#DDDDDD\">" + 
		l.size() + "</td></tr>");

	for(Object e[] : l){
		out.println("<tr>");
		out.println("<td>" + e[0] + "</td>");
		out.println("<td>" + e[1] + "</td>");
		out.println("</tr>");
	}
}
out.println("</table><br>");

// キャラクター一覧
%>
<b>キャラクター一覧</b>
<table border="1" cellspacing="0">
<tr><td bgcolor="#CCDDFF">Creator</td>
<td bgcolor="#CCDDFF">Prefix</td>
<td bgcolor="#CCDDFF">Name</td>
<td bgcolor="#CCDDFF">Sex</td>
<td bgcolor="#CCDDFF">Element</td></tr>
<%

for(Creator c : creators){
	for(Name n : c.getNames()){
		out.println("<tr>");
		out.println("<td valign=\"top\">" + 
			c.getCreator() + "</td>");
		out.println("<td valign=\"top\">" + 
			(n.getPrefix().getPrefix() != null ? 
			n.getPrefix().getPrefix() : "-") + "</td>");
		out.println("<td valign=\"top\">" + 
			n.getName() + "</td>");
		out.println("<td valign=\"top\">" + 
			n.getSex().getSex().getLabel() + "</td>");

		List<Element> elements = n.getElements();
		out.println("<td><b>Elements(" + elements.size() + 
			")</b>");
		for(Element e : elements)
			out.println("<br>" + e.getElement());
		out.println("</td>");

		out.println("</tr>");
	}
}
out.println("</table><br>");

// エレメントごとのキャラクター
out.println("<b>特定のエレメントを持つキャラクター一覧</b>");
List<Element> elements = (List<Element>)em.createQuery(
	"SELECT e FROM Element e").getResultList();
out.println("<table border=\"1\" cellspacing=\"0\">");
out.println("<tr><td bgcolor=\"#CCDDFF\">Element</td>");
out.println("<td bgcolor=\"#CCDDFF\">Name</td></tr>");
for(Element e : elements){
	List<Name> names = e.getNames();
	out.println("<tr>");
	out.println("<td valign=\"top\">" + 
		e.getElement() + "</td>");
	out.println("<td><b>Characters(" + 
		names.size() + ")</b>");
	for(Name n : names){
		out.println("<br>" + 
			(n.getPrefix().getPrefix() != null ? 
			n.getPrefix().getPrefix() : "") + n);
	}
	out.println("</td></tr>");
}
out.println("</table>");
}catch(Exception e){
	out.println(e);
}

em.close();
factory.close();
%>

</body>
</html>
 登録しているデータはこの前と同じです。紛れもなく同じです。なに、増えている?まさか。人間がそうそう簡単に増えるわけがないでしょう。以前に登録したデータでは14人でしたが、今回も14人に決まって
SELECT COUNT(*) FROM persist_name;

17
 いません。
 いい加減クリエイターの方からクレームが来そうで恐ろしいですが。いくらSQL編での使用許諾をもらっているとはいえ、これはもはや「目的外利用」に当たるわけですし、本来適切ではなさそうです。しかし、データが以前と全く同じでは問題ですし、かといって自分のキャラのみを野放図に登録すると他のクリエイター様の登録キャラ数とのバランスが取れなくなってしまいます。私のキャラだけ7件8件、他の人のキャラは2件3件では、相手を尊重していないといいましょうか。
 出力結果は次の通り。

クリエイターごとの属性使用数
Creator Element Value
Shou
Character(4)
Kind5
3
3
2
2
回復 1
yamicha.com
http://www.yamicha.com/
Character(4)
Kind9
1
1
1
1
1
回復 3
2
1
RDBMS 1
hisame
Character(3)
Kind5
1
1
1
1
1
coolmint
Character(3)
Kind3
1
1
1
ruva
http://sousya.umu.cc/
Character(3)
Kind7
1
1
1
1
1
回復 2
1

キャラクター一覧
Creator Prefix Name Sex Element
Shou - アルヤ 男性 Elements(3)


回復
Shou 勇者 セイル 男性 Elements(0)
Shou - ルナン 女性 Elements(4)



Shou - レイシス 女性 Elements(4)



yamicha.com 騎士 サーラ 中性 Elements(0)
yamicha.com 剣聖 ハードゥン 男性 Elements(1)
回復
yamicha.com 聖騎士 シェイン 男性 Elements(2)
回復
yamicha.com 魔道士 イリアス 女性 Elements(9)





回復


RDBMS
hisame デビル クロウ 女性 Elements(2)

hisame デビル ネコ 女性 Elements(1)
hisame デビル うなぎ 女性 Elements(2)

coolmint 剣士 クルード 男性 Elements(0)
coolmint - セシール 女性 Elements(1)
coolmint 風術師 フィオーナ 女性 Elements(2)

ruva 司祭 ルヴァ 女性 Elements(7)





回復
ruva 僧侶 リサ 女性 Elements(0)
ruva 聖騎士 ファルシア 男性 Elements(1)
回復

特定のエレメントを持つキャラクター一覧
ElementName
Characters(6)
司祭ルヴァ
アルヤ
ルナン
レイシス
セシール
魔道士イリアス
Characters(4)
司祭ルヴァ
デビルうなぎ
風術師フィオーナ
魔道士イリアス
Characters(6)
司祭ルヴァ
アルヤ
ルナン
レイシス
デビルうなぎ
魔道士イリアス
Characters(5)
司祭ルヴァ
ルナン
デビルネコ
レイシス
魔道士イリアス
Characters(6)
司祭ルヴァ
デビルクロウ
ルナン
レイシス
風術師フィオーナ
魔道士イリアス
回復 Characters(6)
司祭ルヴァ
剣聖ハードゥン
アルヤ
聖騎士シェイン
聖騎士ファルシア
魔道士イリアス
Characters(3)
司祭ルヴァ
聖騎士シェイン
魔道士イリアス
Characters(2)
デビルクロウ
魔道士イリアス
RDBMS Characters(1)
魔道士イリアス


 この通り、Tomcat JSPでもPersistenceが使えてしまいました。
 属性ごとの人数がおおむね同等になっているのが興味深いです。その他のデータとしては、
SELECT sex , COUNT(*) FROM persist_sex GROUP BY sex;

sex	COUNT(*)
0	6
1	10
2	1
 なぜか女性比率が多いです。余談ながら、支持率の統計などで「男性層の過半数が不支持に回りましたが、女性層の多くが支持しています」のような解説がなされることがありますが、これは実際のところエセ統計学なのでは。何といってもサンプルが2つしかないのですから。いわばテレビの「被験者が2人だけの実験」とほとんど変わりません(実際の統計学で仮説を証明するには100程度のサンプルは欲しいところ)。
 ついでに今回のソースでは、JSPでスタティックインポートを行っています。本当にできるのか自信ありませんでしたが、できてしまうものです。JSPの先頭部分にある「static com.yamicha.toplink.character.SexList.*」がそれで、これのおかげでFEMALEやらNEWTRALやらと書くだけで動くようになっています。
 その他、例えばCascadeTypeを多用するような場合は、「import static javax.persistence.CascadeType.*;」を記述しておくことで「PERSIST」や「ALL」だけでCascadeTypeを指定できるようになります。enum型の登場でstatic変数を使う機会も増えましたから、(特に「JSPでも使えてしまう」ことは)覚えておいて損はなさそうです。
 後は久々にEJBでも扱ってみたいところですが、あの重さを考えると。とはいえEntityはもともとEJBの一部ですし、どうしたものでしょうか。
カテゴリ [開発魔法][社会問題][ゲスト出演] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -