yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/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/07/10(Sat)11:16:15
 大相撲の野球賭博問題で、一時は開催が危ぶまれていた名古屋場所は開催され、NHKは生中継をやめて20分程度のダイジェスト放送を流すこととなりました。放映権料をどうするかはまだ未定のようです。また、本問題をめぐっては、相撲協会が公益法人の地位にあることに政府からも疑問の声が出ており、一般法人化される可能性も否定できない状況となるなど、相撲協会にとっては厳しい局面が続きそうです。
 相撲協会にしてもNHKにしてもそうですが、これらの組織は本件における最大の被害者が誰であるのか分かっているのでしょうか。この視点から今回の問題を検証すれば、これらの組織がいかに独善的な物の考え方しかできていないか、いかに狭い視野から物事を見ているかが分かるはずです。
 賭博にかかわっていない力士や関係者にとっては、今回のゴタゴタは非常に残念なものであるはずですし、問題を起こしていない関係者やファンのためにも名古屋場所は開催したいとの考えは理解できなくもありません。また、世の中には多くの相撲ファンも存在し、これらのファンの声に応えるためにも何らかの方法で放映はしたいというNHKの決定も分からないではありません。
 しかし、今回の問題で最も大きな被害を受けているのは、問題にかかわっていない力士や関係者でもなければ、相撲ファンでもありません。角界の問題やNHKの対応によって何のいわれもない被害を負わされるのは、実は相撲とは全く関係のない一般市民なのです。
 今のところ相撲協会は公益法人として活動しており、また相撲は「国技」とされているため、相撲協会は国から様々な便宜を受けています。当然、この便宜はもとをただせば国民の肩代わりによって成り立っているわけです。したがって、たとえ相撲ファンでなかったとしても、日本の一般市民である限り、本件は決して無関係な問題ではありません。むしろ、日本全体で見れば熱心な相撲ファンよりも相撲への興味に乏しい人の方が多いはずですから、このような人はどちらかといえば「サイレントマジョリティー」に属するといえるでしょう。言うなれば、多数派の国民が少数派のために、相撲協会への便宜に協力している図式となります。
 さらに、NHKは年間30億ともされる高額の放映権料を相撲協会に支払っており、相撲協会の収入の数割を占めるとされるほど貴重な収入源となっていますが、当然これは「みなさまの受信料」から支出されています。そして、NHKはテレビを視聴できる全世帯を受信料徴収の対象としており、未払い世帯に対する裁判をちらつかせたこともあるほどですので、最近はインターネットの普及でテレビの価値は大きく低下したとはいえ、まだ「国民皆契約」とみなしても差し支えない状況です。無論、その中には相撲に興味がない人も、それ以前に生中継など見られるわけがない人も、非常に多く含まれています。したがって、この場合に最も損をするのは、間接的に相撲協会を潤しつつ何の受益もない、生中継など見ない人ということになります。
 無論、相撲にあまり興味がない人や、生中継を見ない人が多数派だからといって、直ちに相撲には便宜を図るべきではない、あるいは放送すべきでないと主張する気はありません。しかし、そこで大問題が発覚したとなれば話は別で、さすがに今の状態を考え直さないわけにはいきません。
 しかも、今回の問題には暴力団がかかわっていたわけですから、相撲に関係ない市民の負担がめぐりめぐって暴力団を利し、その暴力団が市民を苦しめるという図式が成り立ちます。このことを考えれば、相撲協会の立場やNHKの方針が今までのままであって良いはずがありません
 NHKが生中継の中止を決めた後、視聴者からは多くの意見が寄せられ、中継すべきとの意見が多くを占めたといいますが、この結果を鵜呑みにするようでは、「サイレントマジョリティー」の存在を完全に無視していると指摘せざるを得ません。前述の通り、本件における最大の被害者は相撲とは関係のない人々です。生中継ではなくダイジェスト番組を放送するにせよ、相撲協会に放映権料が渡りかねない決定である点に変わりはありません。まして、現状では捜査に非協力的な者も存在し、しかも暴力団とのつながりも払拭できているとは限らない状況であるのを忘れてはいけません。放映権料を無償にする取り決めを行うか、あるいは相撲とは何の関係もない大多数の人々に対して「なぜ相撲を放送しなければならないのか」をしっかり説明できない限り、ダイジェストであろうと放映をすべきではありませんでした。
 相撲協会にしても同様です。問題に無関係の力士や関係者、相撲ファンの気持ちを考えるのも結構ですが、同協会には「最大の被害者」について考えているらしい様子が全く見受けられません。実際には、相撲ファンや関係者より何より先に、相撲に関係ない人に大迷惑をかけたことを自覚しなくてはならないのです。相撲協会としては一般法人化は回避したいようですが、公益法人であることによって受ける便宜が誰によって提供されているものなのか、そして収入のかなりの部分を占める放映権料の出所がどこなのかを考えれば、「最大の被害者」を無視するような行動は取れないはずです。それというのに、未だに捜査に非協力的な者がいたり、組織改革に抵抗する者が存在するとは、情けないにもほどがあります。
 相撲協会は当然、組織の大改革を行わなくてはならず、この「最大の被害者」に顔向けができないような行動を取るべきではありません。そして、相撲協会がそれをできないようであれば、国は「最大の被害者」のために相撲協会を一般法人化して一切の便宜を取りやめるべきですし、NHKも「みなさまの受信料」を「最大の被害者」に対して胸を張って説明できないような用途に使ってはいけません。

 JPA 2.0のウリといえば、おそらく悲観的ロックとCriteriaでしょう。しかし、悲観的ロックの実装は(不完全とはいえ)比較的早く行われたようですが、Criteriaは古いGlassFish v3 Previewでは実装されていない始末で、APIドキュメントにも書いてあるものを実行できない状態がしばらく続いていました。
 そうなると、どうしても面白いものを期待してしまうのが人情というものです。ところが、これがなかなか厄介な代物でした。確かにJPQLよりは実行してみてからのミスは防げそうですが、どこぞの言語の類似機能などと比べてしまうとひたすら面倒さが目立ちます。チュートリアルでは@StaticMetamodelを使用する方法とそうでない方法が紹介されていますが、今回は後者を用いました。コードを書く量は減るものの、やたらと冗長です。
/WEB-INF
 /classes
  /com
   /yamicha
    /criteria
     Maker.java
     Product.java
     ProductAccess.java
     ProductServlet.java
  /META-INF
   persistence.xml
 今回は@StaticMetamodelを使用していないため、JPAにかかわるクラスは@Entityのみです。
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>

// Maker.java
package com.yamicha.criteria;

import javax.sql.*;
import javax.persistence.*;
import java.util.*;

@Entity @Table(name="criteria_maker" , schema="yamicha")
	public class Maker implements java.io.Serializable{
	private int id;
	private String name;
	private List<Product> products;

	public Maker(){
		products = new ArrayList<Product>();
	}
	public Maker(String n){
		this();
		name = n;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@OneToMany(cascade=CascadeType.ALL , mappedBy="maker")
		public List<Product> getProducts(){
		return products;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setProducts(List<Product> p){
		products = p;
	}

	public void link(){
		for(Product p : products)
			p.setMaker(this);
	}
}

// Product.java
package com.yamicha.criteria;

import javax.sql.*;
import javax.persistence.*;
import java.util.*;

@Entity @Table(name="criteria_product" , schema="yamicha")
	public class Product implements java.io.Serializable{
	private int id;
	private String name;
	private int price;
	private Maker maker;

	public Product(){
	}
	public Product(String n , int p){
		this();
		name = n;
		price = p;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@Column(name="price") public int getPrice(){
		return price;
	}
	@ManyToOne @JoinColumn(name="maker" ,
		referencedColumnName="id")
		public Maker getMaker(){
		return maker;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setPrice(int i){
		price = i;
	}
	public void setMaker(Maker m){
		maker = m;
	}
}
 ProductAccess.javaでCriteria APIを使用しています。
package com.yamicha.criteria;

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

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

	// サンプル登録メソッド
	public void regist(){
		Maker san = new Maker("San Microsystems");
		Maker olacre = new Maker("Olacre");
		Maker mesql = new Maker("MeSQL AB");
		Maker bae = new Maker("BAe Systems");

		san.getProducts().add(new Product(
			"GrassFish Application Server" , 640000));
		san.getProducts().add(new Product(
			"Soralis" , 750000));
		olacre.getProducts().add(new Product(
			"Olacre DataBase" , 1200000));
		bae.getProducts().add(new Product(
			"AeroLogic Application Server" , 720000));
		mesql.getProducts().add(new Product(
			"MeSQL" , 250000));
		mesql.getProducts().add(new Product(
			"MeSQL Enterprise Support" , 550000));
		olacre.getProducts().add(new Product(
			"Olacre Application Server" , 800000));
		san.getProducts().add(new Product(
			"Blade Server" , 1060000));

		san.link();
		olacre.link();
		mesql.link();
		bae.link();

		em.persist(san);
		em.persist(olacre);
		em.persist(mesql);
		em.persist(bae);
	}
	// 指定した価格を下回る製品を
	// 価格の順番に並べて返す
	public List<Product> getProducts(int price){
		CriteriaBuilder cb = em.getCriteriaBuilder();

		CriteriaQuery<Product> pq =
			cb.createQuery(Product.class);
		Metamodel m = em.getMetamodel();
		EntityType<Product> product_entity =
			m.entity(Product.class);
		Root<Product> p = pq.from(Product.class);

		pq.where(cb.lt(p.get(product_entity.getSingularAttribute(
			"price" , Integer.class)) , price));
		pq.orderBy(cb.asc(p.get(product_entity.getSingularAttribute("
			price" , Integer.class)))).select(p);
		return em.createQuery(pq).getResultList();
	}
	// 指定した価格を下回る製品を持っているメーカーを返す
	public List<Maker> getMakers(int price){
		CriteriaBuilder cb = em.getCriteriaBuilder();

		CriteriaQuery<Maker> query =
			cb.createQuery(Maker.class);
		Metamodel m = em.getMetamodel();
		EntityType<Product> product_entity =
			m.entity(Product.class);
		EntityType<Maker> maker_entity = m.entity(Maker.class);

		Root<Product> p = query.from(Product.class);
		query.where(cb.lt(p.get(product_entity.getSingularAttribute(
			"price" , Integer.class)) , price));
		Join<Product , Maker> join = p.join(
			product_entity.getSingularAttribute(
			"maker" , Maker.class));
		query.distinct(true).select(join);

		return em.createQuery(query).getResultList();
	}

	public void clear(){
		em.createQuery("DELETE FROM Product p").executeUpdate();
		em.createQuery("DELETE FROM Maker m").executeUpdate();
	}
}
 タイプセーフではあっても、面倒この上ありません。SQLクエリに直すなら、ただこれだけの操作です。
// getProducts
SELECT * FROM criteria_product WHERE price < ? ORDER BY price;

// getMakers
SELECT DISTINCT m.* FROM criteria_maker m 
INNER JOIN criteria_product p ON m.id = p.maker 
WHERE p.price < ?;
 ProductServlet.javaで結果を表示します。
package com.yamicha.criteria;

import javax.servlet.annotation.*;
import javax.ejb.*;
import javax.annotation.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.persistence.*;
import java.io.*;
import java.util.List;
import java.util.ArrayList;

@WebServlet(name="productservlet" , urlPatterns={"/*"})
	public class ProductServlet extends HttpServlet{
	@EJB(beanName="ProductAccess") private ProductAccess pa;

	public void doGet(HttpServletRequest request ,
		HttpServletResponse response) throws IOException{
		doPost(request , response);
	}
	public void doPost(HttpServletRequest request ,
		HttpServletResponse response) throws IOException{
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-type" ,
			"text/plain;charset=UTF-8");
		PrintWriter out = response.getWriter();

		pa.clear();
		pa.regist();

		out.println("価格が 600000 より安価な製品:");
		List<Product> products = pa.getProducts(600000);
		for(Product product : products){
			out.println(product.getName() + "\t" +
				product.getPrice());
		}

		out.println();
		out.println("価格が 700000 より安価な製品を持つメーカー:");
		List<Maker> makers = pa.getMakers(700000);
		for(Maker maker : makers){
			out.println(maker.getName());
		}

		out.close();
	}
}
 @StaticMetamodelを使えばまだマシ(Metamodelクラスを書く手間はありますが、IDEによる生成を前提とするなら矛盾はなし)ですが、できることならもう少し簡素に書けたなら、の一言です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -