yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/11 の記事
[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/01/25(Mon)01:25:26
 経団連の次期会長として、住友化学の米倉氏を当てる人事が固まりました。財閥系企業出身者の会長就任は今回が初めてです。氏は2004年から4年に渡って経団連副会長、その後は評議員会の議長のポストに就いており、その手腕が高く評価されたものとみられます。また、氏には石油事業の海外展開に道筋をつけたなどの功績がある他、マラリア被害がひどいアフリカで用いる蚊帳を開発し、現地生産を成功させるといった活躍もあるようです。このまま人事が確定すれば、5月にも正式に就任することとなります。
 かねてから経団連は自民党に相当な比重を置いており、毎年の政策評価や献金額でも自民党が民主党を大幅に上回っていました。特に政策評価には明らかに恣意的にしか見えない部分も散見される有様で、実際に民主党が躍進した2009年には政策評価を見送らざるを得ませんでした。もし経団連が公平・公正に政策評価を行っていたか、少なくともその自負があるのなら、政権交代の可能性など無関係に政策評価を行ったとしても、何の問題もなかったはずです。これでは民主党政権下で経団連の影響力が地に落ちるのも当然というもので、「財閥系」の不文律を破っての会長就任となる米倉氏には、民主党との関係を充実させる役目も期待されているようです。
 しかしながら、経団連会長がまず取り組まなくてはならない難題は、国民からの信頼を回復することに他なりません。かつての与党である自民党と蜜月関係にあった経団連は、自民党に様々な政策を実現させてきましたが、それが自民党の敗因の1つとなったことは明らかです。ある意味、国民が直接投票可能な自民党を通し、経団連に退場勧告を突きつけたようなものと言っても過言ではありません。
 政権交代のある政治においては、相手が民主党どころか自民党であっても、これまでのように二つ返事で経団連の傍若無人な振る舞いを受け入れてくれるわけがありませんし、実際に受け入れれば選挙で敗北するのみです。そのような意味でも、経団連の発言力は著しく低下しているといえるでしょう。
 この状況を打破するには、経団連はまず国民の信頼を勝ち取らなくてはなりません。しかし、今まで経団連がやってきたことを考えると、それは非常に険しい道といえるでしょう。例えば、談合の課徴金引き上げの際には、当初提示されていた「欧米並み」の水準に文句をつけ、小幅の引き上げにとどめてしまいました。談合は要するに税金の横領に当たるわけですから、自己利益のために税金横領の罰則を引き下げたと非難されても仕方がありません。また、ミートホープや三菱自動車問題など生命や食品にかかわる複数の事件は、公益通報がなければ闇に葬られていた可能性がありますが、経団連は公益通報者保護法の適用基準を厳格に修正させてしまいました。自分の利益のためであれば、国民の生命や健康を犠牲にすることもいとわないようです。
 経済政策の面でも、以前の会長であった奥田氏(トヨタ)は「消費税を毎年1%ずつ上げ、法人税は下げる」という内容の「奥田ビジョン」を発表していますし、その次の会長である御手洗氏(キヤノン)の時期には無賃残業合法化を積極的に推進し、政府案では年収900万円以上を基準としていたところを、経団連は400万円にすべきと主張し、インターネット上ではごく小規模ながらもキヤノン製品不買の動きさえ見られました。本来なら信用第一のはずの企業の集合体でありながら、信用は完全に地に落ちていると考えて間違いないでしょう。
 無論、これまでの経団連の意義を全否定するつもりはありません。今後どうなるかは不明ではあるものの、少なくとも今までの経団連は「大企業の、大企業による、大企業のための組織」に過ぎず、決して日本や国民の利益など考えてはいませんでしたが、たまたま「経団連が望む政策」と「日本に必要な政策」が合致した場合の政策実現に関しては、経団連にも功績があるといえるでしょう。
 ところが、最近では野放図な規制緩和による弊害が次々と表に出てきており、世界同時不況もそれに拍車をかけている状況です。緩和すべき無用な規制が多く存在していた時代には、経団連もそれなりに活躍できていたはずですが、最近では「経団連が望む政策」と「日本に必要な政策」が完全に乖離・対立してしまっています。
 そして、経団連が自己利益至上主義の主張を行っている限り、国民からの信頼は決して回復しません。経団連は自ら「企業が海外に逃げる」と主張している通り、日本が荒廃したとしても海外に脱出すれば済むことですから、日本を壊滅させてでも自分の利益を最大化しようとするのは理にかなった行動ではありますが、前述の通りもはやそれは通用しないと知るべきでしょう。
 かつて鳩山氏は所信表明演説にて、自民・公明体制を「経済の合理性に偏った政治」であると批判していましたが、自公政治全体への評価はともかくとして、経団連の政策を実現してきたという意味で言えば、これは正しくありません。少なくとも今までの経団連は「自分の利益を最大化する」ことを至上命題としており、日本経済を省みてはきませんでした。経団連に参加している大企業に利益を与えつつ、経済の合理性に反する政策というのは十分に存在し得ます。例えば、無用な規制緩和によって大企業が利益を得たとしても、それが国民や日本経済にダメージを与えれば、それは経済の合理性に反しています。
 米国ではオバマ氏が大統領に就任し、日本でも民主党が政権の座に就きました。今度は経団連も変わらなくてはなりません。米日両方の民主党が苦戦しているように、経団連の変革も容易ではないはずですが、米倉氏は手腕を評価されているものとみられますので、やる気さえあれば不可能ではないはずです。
 無論、氏が奥田氏や御手洗氏のような方針・思想で事に臨むなら、国民の信頼を得ることなどできようはずがなく、民主党との距離を縮めるのも難しく、下手をすると自民党との蜜月も続かなくなり、旧体制を引きずってしまうことになりますが、氏はまたマラリア予防の蚊帳を開発するなどの活躍もあり、もしかすると今までの会長よりも大義が見える人かもしれません。大変に困難な道のりではありますが、果たして経団連は「大企業の、大企業による、大企業のための組織」から脱皮できるのでしょうか。

 続・MapKey。前回は@MapKeyJoinColumnを使用しましたので、今回は@MapKeyColumnを使用してみます。
 @MapKeyJoinColumnでは、キーとして何らかのEntityを使用していました。すなわち、@OneToManyのOne側のEntityとMany側のEntityに加え、キーの役目を持つEntityも書く必要がありました。当然のことながら、テーブルも3つ生成されます。例えば前回のコードでは、次の3つのテーブルが生成されました。
(キーにあたるテーブル)
mapkeyjoin_account
+------+----------+
| id   | name     |
+------+----------+
| 8751 | 現金     |
| 8752 | 当座預金 |
| 8753 | 売掛金   |
...

(One 側)
mapkeyjoin_office
+------+----------------+
| id   | name           |
+------+----------------+
| 8758 | 北朝鮮支店     |
| 8763 | ミャンマー支店 |
| 8768 | 阿久根支店     |
+------+----------------+

(Many 側)
mapkeyjoin_value
+------+---------+---------+--------+
| id   | price   | account | office |
+------+---------+---------+--------+
| 8759 |  350000 |    8753 |   8758 |
| 8760 |  150000 |    8751 |   8758 |
| 8761 |  800000 |    8754 |   8758 |
...
 @MapKeyColumnは@MapKeyJoinColumnと似ていますが、何らかのEntityをキーにするのではなく、カラムのデータがそのままキーとなるようです。すなわち、上記の例を@MapKeyColumnで書き換えるなら、テーブルは次のようになります。
(One 側)
mapkeyjoin_office
+------+----------------+
| id   | name           |
+------+----------------+
| 8758 | 北朝鮮支店     |
| 8763 | ミャンマー支店 |
| 8768 | 阿久根支店     |
+------+----------------+

(Many 側)
mapkeyjoin_value
+------+---------+----------+--------+
| id   | price   | account  | office |
+------+---------+----------+--------+
| 8759 |  350000 | 売掛金   |   8758 |
| 8760 |  150000 | 現金     |   8758 |
| 8761 |  800000 | 受取手形 |   8758 |
...
 これはすなわち、@MapKeyJoinColumnに比べて以下のような特徴があるとみなせます。

・キーにあたるデータはカラムに記録されるため、別のテーブルは生成されない。
・キーがカラムに記録される性質上、カラムに記録できるデータ以上のものはキーにできない。

 つまり、キーとなるデータに色々な属性を持たせたい場合、あるいは同じ名前のキーが複数存在しかねない場合には、@MapKeyJoinColumnの方が適任であるといえます。
 前者の例としては、以下のようなものが挙げられます。
id	name	type	genre	...
1	現金	借	資産
2	買掛金	貸	負債
3	売上	貸	収益
 この場合、勘定科目に色々なデータが含まれているため、単にString型のキーだけでは対応しきれません。
 後者の例としては、ややいい加減ではありますが、以下のようなものが挙げられます。
id	title
1	支店長
2	支店長補佐
3	支店長補佐
4	経理部長
...
 これをStringで表現しようとすると、"支店長補佐1"などのようにしなくてはなりません。
 また、使用するキーはあらかじめほとんど決まっていて、普段はその中から選択して使用すれば事足りるものの、場合によっては後からキーを新たに登録しなくてはならず、プログラム的に定数としてキーを定めておけないような場合にも、@MapKeyJoinColumnの方が便利です。勘定科目はまさにこの例に当てはまる代表格です。
 一方、特にそうした事情がないのであれば、@MapKeyColumnでも特に問題はなさそうです。単に文字列によるマップを使いたいだけであれば、@MapKeyColumnの方が分かりやすいでしょう。
/WEB-INF
 /classes
  /com
   /yamicha
    /mapkeyjoin
     Program.java
     Command.java
     MapKeyAccess.java
     MapKeyServlet.java
  /META-INF
   persistence.xml
 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>
 ソースは以下の通り作成しました。ただ、今回も1箇所ほど不可解なプロパティがあります。いつもながらサンプルデータは非常に適当です。
// Program.java
package com.yamicha.mapkey;

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

@Entity @Table(name="mapkey_program" , schema="yamicha")
	public class Program implements java.io.Serializable{
	private int id;
	private String name;
	private String developer;
	// 今回のキーは String
	private Map<String , Command> commands;

	public Program(){
		commands = new Hashtable<String , Command>();
	}
	public Program(String s , String d){
		this();
		name = s;
		developer = d;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@Column(name="developer") public String getDeveloper(){
		return developer;
	}
	@OneToMany(fetch=FetchType.EAGER ,
		cascade=CascadeType.ALL , mappedBy="program")
		@MapKeyColumn(name="command_type")
		public Map<String , Command> getCommands(){
		return commands;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setDeveloper(String s){
		developer = s;
	}
	public void setCommands(Map<String , Command> c){
		commands = c;
	}

	public void link(){
		for(Command c : commands.values())
			c.setProgram(this);
	}
}

// Command.java
package com.yamicha.mapkey;

import javax.sql.*;
import javax.persistence.*;

@Entity @Table(name="mapkey_command" , schema="yamicha")
	public class Command implements java.io.Serializable{
	private int id;
	private String name;
	private String command_type;
	private Program program;

	public Command(){
	}
	public Command(String s){
		name = s;
	}

	@Id @Column(name="id") @GeneratedValue public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@ManyToOne @JoinColumn(name="program")
		public Program getProgram(){
		return program;
	}
	@Column(name="command_type") private String getCommandType(){
		return command_type;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setProgram(Program p){
		program = p;
	}
	private void setCommandType(String c){
		command_type = c;
	}
}

// MapKeyAccess.java
package com.yamicha.mapkey;

import javax.ejb.*;
import javax.annotation.*;
import javax.persistence.*;
import java.util.*;

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

	public void regist(){
		Program java = new Program("Sun Java" ,
			"Sun Microsystems");
		java.getCommands().put("Compile" , new Command("javac"));
		java.getCommands().put("Execute" , new Command("java"));
		java.link();
		em.persist(java);

		Program mono = new Program("Mono C#" , "Novell");
		mono.getCommands().put("Compile" , new Command("gmcs"));
		mono.getCommands().put("Execute" , new Command("mono"));
		mono.link();
		em.persist(mono);

		Program ada = new Program("GNAT" , "AdaCore");
		ada.getCommands().put("Compile" , new Command("gnatmake"));
		ada.link();
		em.persist(ada);

		Program perl = new Program("perl" , "Larry Wall");
		perl.getCommands().put("Execute" , new Command("perl"));
		perl.link();
		em.persist(perl);
	}
	public List<Program> getPrograms(){
		return (List<Program>)em.createQuery(
			"SELECT p FROM Program p").getResultList();
	}
	public Program getProgram(Object id){
		return em.find(Program.class , id);
	}
}

// MapKeyServlet.java
package com.yamicha.mapkey;

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.*;

@WebServlet(name="mapkeyservlet" , urlPatterns={"/*"})
  public class MapKeyServlet extends HttpServlet{
  @EJB(beanName="MapKeyAccess") private MapKeyAccess ma;

  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();

    ma.regist();

    List<Program> programs = ma.getPrograms();
    for(Program p : programs){
      out.println(p.getName() + " (" + p.getDeveloper() + ")");

      Map<String , Command> commands = p.getCommands();
      for(Map.Entry<String , Command> e : commands.entrySet())
        out.println("t" + e.getKey() + ": " + e.getValue().getName());

      out.println();
    }

    out.close();
  }
}
 前回に引き続き、commandTypeプロパティは必要なのか非常に謎です。当然ながらprivateにしてあります。
 これを実行すると、以下の結果が得られます。
Sun Java (Sun Microsystems)
	Execute: java
	Compile: javac

Mono C# (Novell)
	Execute: mono
	Compile: gmcs

GNAT (AdaCore)
	Compile: gnatmake

perl (Larry Wall)
	Execute: perl
 テーブルは次の通りです。
mapkey_program
+------+------------------+----------+
| id   | developer        | name     |
+------+------------------+----------+
| 8741 | Sun Microsystems | Sun Java |
| 8744 | Novell           | Mono C#  |
| 8747 | AdaCore          | GNAT     |
| 8749 | Larry Wall       | perl     |
+------+------------------+----------+

mapkey_command
+------+--------------+----------+---------+
| id   | command_type | name     | program |
+------+--------------+----------+---------+
| 8742 | Execute      | java     |    8741 |
| 8743 | Compile      | javac    |    8741 |
| 8745 | Execute      | mono     |    8744 |
| 8746 | Compile      | gmcs     |    8744 |
| 8748 | Compile      | gnatmake |    8747 |
| 8750 | Execute      | perl     |    8749 |
+------+--------------+----------+---------+
カテゴリ [開発魔法][社会問題][経済・知的財産] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -