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/02/22(Mon)00:59:53
 次期衆院選までは消費税に手をつけないと公約してきた民主党ですが、3月から消費税を含む税制改正議論を開始する予定であることを、財務相の菅氏が明らかにしました。ただ、菅氏はなおも「次期衆院選までは消費税を上げない」と明言しており、消費税議論を対立軸にしようとした自民党をけん制する目的との見方もあるなど、実際に民主党がどこまで本気なのかは定かではありませんが、少なくとも消費税について論じられる土壌が形成される可能性は出てきました。
 なぜ政治家が消費税議論をやりたがらないかといえば、それは明らかに選挙に差し支えるためですが、つくづく小沢氏以後の民主党の姿勢には疑問を抱かざるを得ません。かつての民主党は「消費税を上げ、年金保険料を全額税化する」ことを訴えており、かなり好感が持てたのですが、小沢氏以後は選挙目当てに増税論が封印されてしまい、「マニフェスト」が「政権公約」に逆戻りしてしまった感さえあります。そのひずみで財源を確保できなくなり、約束を破って増税論を持ち出し、それで支持を失って政権が瓦解するようなことになれば、これほど無意味な話はありません
 民主党の一部からは、「2005年の郵政選挙で、まじめに公約を作って訴えても全く無駄であることを思い知らされたので、今回は理想論で勝負するよりなかった」などの恨み節も聞かれるようですが、確かにあの郵政選挙は嘆かわしいことこの上ないものでした。私も最後の最後まで、きっと多くの人は国民の知性を愚弄する小泉政権に憤り、ふざけた選挙に異議を申し立てるであろうと信じ、またそうなることを願っていましたが、残念ながらそれは完全に裏切られました。
 実際には、小選挙区制ではわずかな票差が勝敗に結びつくため、この戦術に引っかかった人はあまり多くないとも考えられますが、ともかく議席ベースでは自民党は歴史的大勝を遂げ、民主党ら野党は再可決も阻止できない立場に置かれてしまいました。この経験が民主党を含む各党にとってトラウマとなり、そのせいで各党が不利な政策を言い出しづらくなってしまったのであれば、あの選挙の罪は極めて重いと言わざるを得ません
 しかしながら、民主党を含む各党は、あの選挙がもたらした結果をも直視しなくてはなりません。郵政のデメリットも訴えず、郵政民営化さえあれば何もかもが上手くいくような言い分により、一時的には再可決すら可能なほど多くの議席を獲得し、さらに郵政民営化にも道筋をつけた自民党でしたが、およそデメリットの存在しない政策など存在し得ない以上、国民が何らかの負担をこうむるのは当然にもかかわらず、郵政選挙ではそれが完全に隠蔽されていたため、約束が違うとして大きな批判を受ける羽目になりました。それ以外にも、「小泉改革」のメッキは安部政権以後に次々と剥がれ落ち、最終的には当の自民党政権自身が小泉改革の修正を言い出さざるを得なくなる状況にまで追い込まれ、自民党敗北の直接の原因となりました。さらに、郵政選挙の大勝によってようやくこぎつけたはずの郵政民営化も、政権交代によって逆方向に進み始めている有様です。これが例のような選挙の末路なのですから、郵政選挙を悪い方向に教訓にしてしまった民主党のやり方は、明らかに誤りであったと結論して間違いないでしょう。
 ただ、民主党の「次期衆院選までは消費税を上げない」という主張自体は、全く正当性のないものではありません。底の抜けたバケツに水を注いでも、決して水はいっぱいになりません。すなわち、無駄をできるだけ削減してから増税するのでなければ、せっかくの増税も効果が薄れてしまいます。増税によって規律が緩み、増税が無駄になることを不安視しているのであれば、「今は増税しない」のも選択肢の1つとして有効でしょう。
 一方、自民党側は民主党が消費税増税議論に着手することを批判していますが、民主党が上記のような意図で増税を封印しているのであれば、今のうちから「無駄削減後」を論じておくのは十分に合理的な行為であり、これは決して「今は消費税を上げない」という言い分と矛盾するものではありません。むしろ、直前になって議論を開始する方が問題が大きく、早めに始めておくに越したことはありません。
 政治家の消費税議論が低調になりやすい原因としては、国民に「消費税アレルギー」があるためと言われますが、実際の国民は政治家が考えているほど単純ではありません。消費税増税論が国民から非常に嫌われているのも、消費税増税そのものに対する嫌悪というよりは、「消費税が目的外利用、または無駄遣いされることに対するアレルギー」の側面の方が強いと考えられます。
 もし消費税の全額が確実に福祉に使われるという確証があれば、少なからぬ人は増税を容認するはずです。消費税増税論がタブー視されるほどまでに嫌われる理由があるとすれば、政治家が全く信用されておらず、消費税があさっての方向に使用されるであろうと多くの国民が考えているために他なりません。
 例を出すならば、増税分の無駄遣いは当然として、消費税を上げつつ法人税や相続税を下げる行為などが挙げられます。日本の福祉費用は増大しており、それの維持のためにはどうしても増税が必要であることを多くの国民は理解していますが、せっかくの増税が法人税減税などに消えるのであれば、福祉も何もあったものではありません。これは決して無根拠の懸念ではなく、実際に経団連は「消費税を毎年上げつつ、法人税は下げる」ビジョンを発表していますし、自民党政権下では相続税非課税の国債発行、贈与税免除の時限措置など、相続税の課税対象者に有利な措置が実際に検討されていました。当然のことながら、相続税などを優遇できるほど余裕が有り余っているのなら、多大なリスクを背負って消費税を増やす必要はありません。すなわち、今後与党や野党が消費税増税を論じるのであれば、それを法人税や相続税などの減税とはセットにしないことが最低限必要です。
 また、消費税は逆進性の強い税ですので、その観点からの対策も必要となってきます。どうせ税制全般の改正を議論するのであれば、消費税を大幅に引き上げつつ、大規模な「負の所得税」などの制度も同時に導入して逆進性を打ち消し、さらに相続税の大幅強化で消費を促すなど、大胆な改革があっても良いでしょう。言うまでもありませんが、年金保険料は消費税などとは比べ物にならないほど逆進性が強く、しかも民主党はかねてから全額税化を主張していますので、議論の際には消費税を財源とした全額税化を第一に検討し、実現の道筋を作る必要があります。
 そして、もし近々消費税増税に着手する予定があるのであれば、与党も野党も参院選ではそれを主張しなくてはなりません。なぜ消費税増税が嫌われるかといえば、増税自体への嫌悪よりも政治家が信用されていないことによる部分が大きく、その上さらにだまし討ち増税などしようものなら、どうなるかは見えています。
 確かに、2005年の郵政解散においては、説明責任も政策論争も何もなく、ただ単に国民の知性を愚弄していた小泉氏が大勝しました。ところが、小泉氏自身はメッキが剥がれないうちに身を引いたものの、その後の自民党の末路といえば、大変にみじめなものでした。さらに、麻生内閣が起死回生の手段として用いた金配りは、ニンジンにつられた多くの支持を獲得するどころか、なおさら多くの人に怒りを植え付ける結果となりました。政治家はこれらの教訓に学ばなくてはなりません。

 前回までで、とりあえずJSF 2.0のAjaxを使ってはみたものの、基本的にはページ変移を省略して結果を表示するデザインとなっており、Ajax関連の記述さえはずしてしまえば普通のフォームとして機能するものが中心でした。これはこれで分かりやすく、しかも普通のフォームと同じ感覚でAjaxを書けて便利なのですが、せっかくJavaScriptを使っているのですから、普通のフォームでは行えないような対話型の処理も書いてみたいものです。
 そのような処理として有名なのは、いわゆるオートコンプリートであったり、フォームに何らかの入力をするたびにデータが絞り込まれていくようなページでしょう。すなわち、入力がそのつどサーバーに送信され、その結果をブラウザが受け取って表示するような仕組みです。
 実は私、Ajaxをこのように使用したサイトが大嫌いであり、見つけ次第「制限付きサイト」に投入してJavaScriptが動作しないようにしているのですが、そのような技術がある以上は習得しておかないわけにはいきません。
 対話型ということで、いかなるものを書いたものか迷いましたが、あまりに単純な文字数計算や足し算では味気ないため、今回はひとまず「ベクトル内積・外積計算機」としました。無論、データベースのデータを読み込み、入力した条件にしたがってデータを絞り込むような本格的なコードも書けるはずですが、そもそも動かせるかどうか不明な状態から習得を始めたため、ごく簡単なものとなりました。
/WEB-INF
 /classes
  /com
   /yamicha
    /autosend
     CalcBean.java
     Vector3D.java
 web.xml
calc.xhtml
 実に簡単な構成ですが、たかだかこの程度のものを書くだけでも、JSF 1.xの時代は意味不明なXMLを長々と書く必要があったわけですから、いかに1.xが使い物にならなかったかが分かります。
 このweb.xmlもいい加減に書かずに済ませたいのですが、そこまで望むのは贅沢でしょうか。
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <display-name>JSF 2.0 Calc Servlet</display-name>
  <description>JSF 2.0 Calc Servlet</description>

  <servlet>
    <servlet-name>jsf20vector3dcalc</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>jsf20vector3dcalc</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
</web-app>
 ManagedBeanはほとんど見ての通りですが、dotProduct及びcrossProductなるプロパティを用意しています。本来であれば、データが送信された際に1度だけ計算を実行して保持しておき、プロパティにアクセスした際にはそれを返すのが効率的なのですが、今回は単純な実装としました。
// CalcBean.java
package com.yamicha.autosend;

import javax.faces.bean.*;
import javax.faces.event.*;

@ManagedBean @ViewScoped public class CalcBean{
	private Vector3D vector1;
	private Vector3D vector2;

	public CalcBean(){
		vector1 = new Vector3D();
		vector2 = new Vector3D();
	}

	public Vector3D getVector1(){
		return vector1;
	}
	public Vector3D getVector2(){
		return vector2;
	}
	public double getDotProduct(){
		return vector1.dotProduct(vector2);
	}
	public Vector3D getCrossProduct(){
		return vector1.crossProduct(vector2);
	}

	public void setVector1(Vector3D v){
		vector1 = v;
	}
	public void setVector2(Vector3D v){
		vector2 = v;
	}
}

// Vector3D.java
package com.yamicha.autosend;

public class Vector3D{
	private int AXIS = 3;
	private double value[];

	public Vector3D(){
		value = new double[AXIS];
	}
	public Vector3D(double x , double y , double z){
		this();
		setX(x);
		setY(y);
		setZ(z);
	}

	public double getX(){
		return value[0];
	}
	public double getY(){
		return value[1];
	}
	public double getZ(){
		return value[2];
	}

	public void setX(double x){
		value[0] = x;
	}
	public void setY(double y){
		value[1] = y;
	}
	public void setZ(double z){
		value[2] = z;
	}

	private double get(int axis){
		return value[axis];
	}
	private void set(int axis , double v){
		value[axis] = v;
	}

	public double dotProduct(Vector3D v){
		double product = 0;
		for(int i = 0; i < AXIS; i++)
			product += get(i) * v.get(i);
		return product;
	}
	public Vector3D crossProduct(Vector3D v){
		Vector3D result = new Vector3D();
		for(int i = 0; i < AXIS; i++){
			int cos = (i + 1) % AXIS;
			int sin = (i + 2) % AXIS;

			result.set(i , get(cos) * v.get(sin) - 
				get(sin) * v.get(cos));
		}
		return result;
	}
	public String toString(){
		return String.valueOf(getX()) + " , " +
			getY() + " , " + getZ();
	}
}
 今回最も重要なのが、おそらくこのcalc.xhtmlでしょう。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
  <title>JSF 2.0 Vector Calculator</title>
</h:head>

<h:body>
  <b>JSF 2.0 Vector Calculator</b>

  <h:form id="calc">
    <h:panelGrid columns="4">
      <h:outputText value="Vector" />
      <h:outputText value="X" />
      <h:outputText value="Y" />
      <h:outputText value="Z" />

      <h:outputText value="Vector1" />
      <h:inputText size="6" id="vector1x" value="#{calcBean.vector1.x}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>
      <h:inputText size="6" id="vector1y" value="#{calcBean.vector1.y}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>
      <h:inputText size="6" id="vector1z" value="#{calcBean.vector1.z}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>

      <h:outputText value="Vector2" />
      <h:inputText size="6" id="vector2x" value="#{calcBean.vector2.x}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>
      <h:inputText size="6" id="vector2y" value="#{calcBean.vector2.y}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>
      <h:inputText size="6" id="vector2z" value="#{calcBean.vector2.z}">
        <f:ajax execute="@this" event="blur" render="calc_result" />
      </h:inputText>
    </h:panelGrid>

    <hr />
    <b>Result:</b>
    <h:panelGrid id="calc_result" columns="2" border="1">
      <h:outputText value="Dot Product" />
      <h:outputText value="#{calcBean.dotProduct}" />

      <h:outputText value="Cross Product" />
      <h:outputText value="#{calcBean.crossProduct}" />
    </h:panelGrid>
  </h:form>

</h:body>

</html>
 ポイントは

<f:ajax execute="@this" event="blur" render="calc_result" />

 このタグです。IBMのチュートリアルなどを見る限り、eventで指定されたイベントが発生した際に(イベント名はJavaScript上の名称からonを除いたものを使用。blurであればonblur、clickであればonclick。event属性を省略した場合はonchangeとみなされる)、executeで指定されている部分のデータを送信し(@thisは自分自身のコンポーネントを表す)、その後にrenderで指定された部分を再描画する、という流れになっているようです。ちなみにonblurはフォーカスが外れた際に呼び出されるイベントです。今回の用途ではonchangeの方が適任なのですが、onchangeの場合はそもそもeventを省略できて味気なく、かといってevent="change"と明示するとなぜか動かなくなるため、blurにしてみました。
 JSF 2.0が面白いのは、データはサーバー上に保持されていて、送信の際には対象となったデータだけが送信・変更されている点でしょうか。無駄なデータの送信がないため、場合によっては有用そうです。このような処理を自力で書こうとするとかなり大変なのですが、JSFならすべて自動的にやってくれるため、手間もかかりません。逆に、途中でサーバー上のセッションが消えてしまった場合、ブラウザの側では入力しているはずなのに、サーバー上では入力されていないものとして扱われるといった問題も起こったりしますが、そこはご愛嬌です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -