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/07/04(Sun)23:07:14
 税制発言で混迷に陥っている民主党ですが、今度は菅氏自ら所得税の最高税率引き上げを検討する考えを示しました。消費税に関しては、所得次第での還付措置と生活必需品の税率軽減の考えを表明しているものの、これも発言が一定していないとの批判を浴びています。また、法人税は「課税対象を広げれば、法人税収の総額を変えないことは可能」であると述べ、外部から財源を持ち込まない考えを示しています。
 いずれも案としては妥当であったり、諸外国で実際に導入・運用されていたりするものばかりですが、あまりにも行き当たりばったりであると言わざるを得ません。所得税の最高税率をかつての水準に近づけたり、法人税の課税を組み替えたりすること自体には検討の余地がありますが、このタイミングで行き当たりばったりに出されては、消費税を上げる際の批判をかわすためのポーズで、本当に実現する気はないのではないかと不安を持たれても仕方がありません。
 仮にこれらの案を出すだけ出しておいて、消費税だけ上げてこれらは実施しなかったとなれば、もはや詐欺以外の何者でもありません。特に法人税については、「消費税を上げて法人税を下げる」行為が批判を浴びるのは当然ですが、この批判を避けるために考えもなしに法人税内部での組み換えを主張し、後から産業界の主張に負けて撤回したり、または案の定失敗して消費税財源による穴埋めを余儀なくされたとなれば、冗談では済まされません。
 ある税を増税しても、それが他の減税によって相殺されれば、結果的に国の歳入は直接的には増えないわけですから、税制というものは一体的に論じる必要があります。したがって、仮に民主党が消費税増税と同時に「法人税減税は法人税の組み換えにより行う」ことと「所得税の最高税率引き上げ」を主張するのであれば、これらはセットでなくてはいけません。そして、行うと主張したからには必ず行わなくてはなりません。他方、もし所得税の最高税率引き上げや法人税減税の自己完結をする気がない、あるいはそれをするとは限らないのであれば、「消費税は上げるが、他はしないかもしれない」と明確に宣言しなければなりません。
 ことに法人税の場合、「内部で収支を合わせる」必要があるわけですから、行き当たりばったりの案で実施できるとは限りません。法人税減税の是非はともかくとして、問題のある優遇措置廃止による不公平性の解消は悪いことではありませんが、優遇対象額や産業の変動なども考えずにいい加減な制度改変を行えば、どのみち消費税から資金を充填しなくてはならなくなります。消費税増税で批判を浴びたからと、考えもなしに批判をそらす案を公表するのではなく、しっかり検証してもらわなくては困ります。
 消費税の税率軽減や還付措置については、実際に多くの諸外国でも採用されており、増税の際には導入を検討する価値は十分にあります。しかし、それでも消費税というものが本質的に逆進性の強い税である以上、増税するなら社会福祉など逆進性を軽減できる用途に充てることが大前提です。いくら軽減措置を導入したからといって、それを所得税や相続税の軽減などといった累進税の減税、または法人税減税など、逆進性を軽減できない用途に用いる大義名分ができるわけではありません。
 また、軽減措置を充実させれば税収も減少し、結局は消費税率を高く設定しなければならなくなったり、早めに次なる増税を行わなければならなくなったりといった本末転倒な事態を招くため、軽減にも限界があります。そのような面からも、消費税は社会福祉に使用して逆進性の問題を軽減する前提は揺らぎません。繰り返しますが、「逆進性軽減措置を導入さえすれば、消費税に固有の問題を考える必要がなくなる」わけではありません
 菅氏の「消費税増税」「自己完結による法人税減税」「所得税最高税率引き上げ」の税制3点セットは、それなりに面白い提案であるとはいえるでしょう。しかし、あまりに行き当たりばったりの提案、かつ消費税増税が批判されているタイミングとあって、後の2つを本当に実行する気があるのか疑問を抱かざるを得ない状態となっています。消費税増税の批判をかわすためではなく、本当にそれをする気があるのなら、氏はそれを明確に宣言する必要があります。一方、実際には行う気がない、または行うとは限らないのであれば、氏はそれを明確に宣言しなくてはなりません。

 JPAであえて@Embeddedを使用する理由といえば、何らかの汎用性のあるコードの再利用に他なりませんが、今回は以前のTitle.java及びRuby.javaを用いたコードを作成してみます。
 前回作成したのは辞書らしきものでしたが、今回作成するのは名簿とします。名前はまず苗字でソートし、さらに名前でソートするものとします。したがって、人物データはTitle型のプロパティを2つ(姓・名)持つことになります。
/WEB-INF
 /classes
  /com
   /yamicha
    /namelist
     Title.java
     Ruby.java
     Person.java
     Category.java
     NameListAccess.java
     NameListServlet.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>
 Title.javaとRuby.javaのコードは前回と全く同じです(パッケージ名だけは変えてあります)。
// Ruby.java
package com.yamicha.namelist;

import javax.persistence.*;

@Embeddable public class Ruby
  implements java.io.Serializable{
  private static final char RUBY_MAP[][] = {
    {'ぁ' , 'あ'} ,
    {'ぃ' , 'い'} ,
    {'ぅ' , 'う' , '\0' , 'ヴ'} ,
    {'ぇ' , 'え'} ,
    {'ぉ' , 'お'} ,

    {'\0' , 'か' , '\0' , 'が'} ,
    {'\0' , 'き' , '\0' , 'ぎ'} ,
    {'\0' , 'く' , '\0' , 'ぐ'} ,
    {'\0' , 'け' , '\0' , 'げ'} ,
    {'\0' , 'こ' , '\0' , 'ご'} ,

    {'\0' , 'さ' , '\0' , 'ざ'} ,
    {'\0' , 'し' , '\0' , 'じ'} ,
    {'\0' , 'す' , '\0' , 'ず'} ,
    {'\0' , 'せ' , '\0' , 'ぜ'} ,
    {'\0' , 'そ' , '\0' , 'ぞ'} ,

    {'\0' , 'た' , '\0' , 'だ'} ,
    {'\0' , 'ち' , '\0' , 'ぢ'} ,
    {'っ' , 'つ' , '\0' , 'づ'} ,
    {'\0' , 'て' , '\0' , 'で'} ,
    {'\0' , 'と' , '\0' , 'ど'} ,

    {'\0' , 'な'} ,
    {'\0' , 'に'} ,
    {'\0' , 'ぬ'} ,
    {'\0' , 'ね'} ,
    {'\0' , 'の'} ,

    {'\0' , 'は' , '\0' , 'ば' , 'ぱ'} ,
    {'\0' , 'ひ' , '\0' , 'び' , 'ぴ'} ,
    {'\0' , 'ふ' , '\0' , 'ぶ' , 'ぷ'} ,
    {'\0' , 'へ' , '\0' , 'べ' , 'ぺ'} ,
    {'\0' , 'ほ' , '\0' , 'ぼ' , 'ぽ'} ,

    {'\0' , 'ま'} ,
    {'\0' , 'み'} ,
    {'\0' , 'む'} ,
    {'\0' , 'め'} ,
    {'\0' , 'も'} ,

    {'ゃ' , 'や'} ,
    {} ,
    {'ゅ' , 'ゆ'} ,
    {} ,
    {'ょ' , 'よ'} ,

    {'\0' , 'ら'} ,
    {'\0' , 'り'} ,
    {'\0' , 'る'} ,
    {'\0' , 'れ'} ,
    {'\0' , 'ろ'} ,

    {'\0' , 'わ'} ,
    {} ,
    {} ,
    {} ,
    {'\0' , 'を'} ,

    {'\0' , 'ん'}
  };

  private String ruby;
  private String sort;

  public Ruby(){
  }
  public Ruby(String r){
    setRuby(r);
  }

  public String getRuby(){
    return ruby;
  }
  public String getSort(){
    return sort;
  }

  private static final char FIRST = ' ';
  public void setRuby(String r){
    ruby = r;

    StringBuffer sb = new StringBuffer();
    StringBuffer sbt = new StringBuffer();

    int before = -1;
    char bc = '';
    for(int i = 0; i < r.length(); i++){
      char c = r.charAt(i);

      int value = 0;
      int type = 0;

      if(c != 'ー'){
        boolean match = false;
        for(int v = 0; v < RUBY_MAP.length; v++){
          for(int t = 0; t < RUBY_MAP[v].length; t++){
            if(RUBY_MAP[v][t] == c){
              match = true;

              value = v;
              type = t;

              before = v;
              bc = c;
            }
          }
          if(match)
            break;
        }

        if(!match)
          throw new IllegalArgumentException(
            "文字 " + c + " は使用できません。");
      }else{
        if(before == -1)
          throw new IllegalArgumentException(
            "伸ばす音は先頭に配置できません。");

        if(bc == 'ん'){
          value = before;
          type = 1;
        }else{
          value = before % 5;
          type = 2;
        }
      }

      sb.append((char)(FIRST + value + 1));
      sbt.append((char)(FIRST + type + 1));
    }

    sb.append(FIRST);

    sb.append(sbt.toString());

    setSort(sb.toString());
  }
  private void setSort(String s){
    sort = s;
  }
}

// Title.java
package com.yamicha.namelist;

import javax.persistence.*;

@Embeddable public class Title
	implements java.io.Serializable{
	private String title;
	private Ruby ruby;

	public Title(){
		ruby = new Ruby();
	}
	public Title(String t , String r){
		this();
		title = t;
		ruby.setRuby(r);
	}
	public Title(String t , Ruby r){
		this();
		title = t;
		ruby = r;
	}

	public String getTitle(){
		return title;
	}
	@Embedded public Ruby getRuby(){
		return ruby;
	}

	public void setTitle(String t){
		title = t;
	}
	public void setRuby(Ruby r){
		ruby = r;
	}
}
 Person.javaはTitleを2つ持ちます。そうなるとカラム名がかぶって問題が生じそうですが、ここで用いるのが@AttributeOverride(s)です。これを使えばカラム名を任意のものに変更でき、しかもNested Embeddedにも対応しています。
// Person.java
package com.yamicha.namelist;

import javax.persistence.*;

@Entity @Table(name="namelist_person" , schema="yamicha")
	public class Person implements java.io.Serializable{
	private int id;
	private Category category;
	private Title fname;
	private Title lname;
	private String position;

	public Person(){
	}
	public Person(Title ln , Title fn , String p){
		this();
		lname = ln;
		fname = fn;
		position = p;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@ManyToOne @JoinColumn(name="category" ,
		referencedColumnName="id")
		public Category getCategory(){
		return category;
	}
	@AttributeOverrides({
		@AttributeOverride(name="title" , 
			column=@Column(name="first_name")) ,
		@AttributeOverride(name="ruby.ruby" , 
			column=@Column(name="first_ruby")) ,
		@AttributeOverride(name="ruby.sort" , 
			column=@Column(name="first_sort"))})
		@Embedded public Title getFirstName(){
		return fname;
	}
	@AttributeOverrides({
		@AttributeOverride(name="title" , 
			column=@Column(name="last_name")) ,
		@AttributeOverride(name="ruby.ruby" , 
			column=@Column(name="last_ruby")) ,
		@AttributeOverride(name="ruby.sort" , 
			column=@Column(name="last_sort"))})
		@Embedded public Title getLastName(){
		return lname;
	}
	@Column(name="position") public String getPosition(){
		return position;
	}

	public void setId(int i){
		id = i;
	}
	public void setCategory(Category c){
		category = c;
	}
	public void setFirstName(Title t){
		fname = t;
	}
	public void setLastName(Title t){
		lname = t;
	}
	public void setPosition(String s){
		position = s;
	}
}

// Category.java
package com.yamicha.namelist;

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

@Entity @Table(name="namelist_category" , schema="yamicha")
	public class Category implements java.io.Serializable{
	private int id;
	private String name;
	private List<Person> people;

	public Category(){
		people = new ArrayList<Person>();
	}
	public Category(String n){
		this();
		name = n;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@OneToMany(mappedBy="category" , cascade=CascadeType.ALL)
		public List<Person> getPeople(){
		return people;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String n){
		name = n;
	}
	public void setPeople(List<Person> p){
		people = p;
	}

	public void link(){
		for(Person p : people)
			p.setCategory(this);
	}
}
 本当はCategory.peopleプロパティに@OrderByをつけてソートさせるつもりでしたが、単一のプロパティを用いてソートすることはできるものの、なぜか複数のプロパティを使ってソートしようとするとエラーになってしまい、断念しました。複数プロパティを使用するサンプルはJava EE 6のAPIリファレンスにも記載されており、仕様上は問題ないはずなのですが、非常に不可解です。EclipseLinkの問題でしょうか。
 仕方がないので、NameListAccess.javaでJPQLを使ってソートしています。
package com.yamicha.namelist;

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

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

  public void regist(){
    em.createQuery("DELETE FROM Person p").executeUpdate();
    em.createQuery("DELETE FROM Category c").executeUpdate();

    Category pm = new Category("日本の総理大臣");
    pm.getPeople().add(new Person(new Title("村山" , "むらやま") ,
      new Title("富市" , "とみいち") , "内閣総理大臣(52人目)"));
    pm.getPeople().add(new Person(new Title("橋本" , "はしもと") ,
      new Title("龍太郎" , "りゅうたろう") , "内閣総理大臣(53人目)"));
    pm.getPeople().add(new Person(new Title("小渕" , "おぶち") ,
      new Title("恵三" , "けいぞう") , "内閣総理大臣(54人目)"));
    pm.getPeople().add(new Person(new Title("森" , "もり") ,
      new Title("喜朗" , "よしろう") , "内閣総理大臣(55人目)"));
    pm.getPeople().add(new Person(new Title("小泉" , "こいずみ") ,
      new Title("純一郎" , "じゅんいちろう") , "内閣総理大臣(56人目)"));
    pm.getPeople().add(new Person(new Title("安倍" , "あべ") ,
      new Title("晋三" , "しんぞう") , "内閣総理大臣(57人目)"));
    pm.getPeople().add(new Person(new Title("福田" , "ふくだ") ,
      new Title("康夫" , "やすお") , "内閣総理大臣(58人目)"));
    pm.getPeople().add(new Person(new Title("麻生" , "あそう") ,
      new Title("太郎" , "たろう") , "内閣総理大臣(59人目)"));
    pm.getPeople().add(new Person(new Title("鳩山" , "はとやま") ,
      new Title("由紀夫" , "ゆきお") , "内閣総理大臣(60人目)"));
    pm.getPeople().add(new Person(new Title("菅" , "かん") ,
      new Title("直人" , "なおと") , "内閣総理大臣(61人目)"));
    pm.link();
    em.persist(pm);

    Category y = new Category("日本円紙幣の肖像");
    y.getPeople().add(new Person(new Title("夏目" , "なつめ") ,
      new Title("漱石" , "そうせき") , "千円札D"));
    y.getPeople().add(new Person(new Title("野口" , "のぐち") ,
      new Title("英世" , "ひでよ") , "千円札E"));
    y.getPeople().add(new Person(new Title("新渡戸" , "にとべ") ,
      new Title("稲造" , "いなぞう") , "五千円札D"));
    y.getPeople().add(new Person(new Title("樋口" , "ひぐち") ,
      new Title("一葉" , "いちよう") , "五千円札E"));
    y.getPeople().add(new Person(new Title("福沢" , "ふくざわ") ,
      new Title("諭吉" , "ゆきち") , "一万円札D,E"));
    y.link();
    em.persist(y);
  }

  public List<Category> getCategories(){
    return em.createQuery(
      "SELECT c FROM Category c" , Category.class).getResultList();
  }
  public List<Person> getPeople(Category c){
    TypedQuery<Person> tq = em.createQuery(
      "SELECT p FROM Category c JOIN c.people p WHERE c.id = ?1 " +
      "ORDER BY p.lastName.ruby.sort , p.lastName.title , " +
      "p.firstName.ruby.sort , p.firstName.title" ,
      Person.class);
    tq.setParameter(1 , c.getId());
    return tq.getResultList();
  }
}
 NameListServlet.javaでサンプルを登録・表示します。
package com.yamicha.namelist;

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="namelistservlet" , urlPatterns={"/*"})
  public class NameListServlet extends HttpServlet{
  @EJB(beanName="NameListAccess") private NameListAccess na;

  public void doPost(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    doGet(request , response);
  }
  public void doGet(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    na.regist();

    request.setCharacterEncoding("UTF-8");
    response.setHeader("Content-type" , "text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>Name List</title>");
    out.println("</head>");
    out.println("<body>");

    out.println("<b>Name List</b><br /><br />");

    List<Category> categories = na.getCategories();
    for(Category category : categories){
      out.println("<b>" + category.getName() + "</b>");
      out.println("<ul>");
      List<Person> people = na.getPeople(category);
      for(Person person : people){
        out.println("<li>");
        out.println("<b>" + person.getLastName().getTitle() + " " +
          person.getFirstName().getTitle() + "</b>");
        out.println("<small>(" +
          person.getLastName().getRuby().getRuby() + " " +
          person.getFirstName().getRuby().getRuby() + ")</small>");
        out.println(" - " + person.getPosition());
        out.println("</li>");
      }
      out.println("</ul>");
    }

    out.println("</body>");
    out.println("</html>");

    out.close();
  }
}
 このプログラムを動かしてみるまで気づきませんでしたが、総理大臣はそれなりに名前が分散しているのに比べ、紙幣の文化人は出席番号が後ろの方になりそうな人ばかりなのはなぜなのでしょうか。
カテゴリ [開発魔法][社会問題][経済・知的財産] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -