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/02/27(Sat)23:24:42
 企業献金を禁止する法改正を待つまでもなく、経団連が企業献金への関与を中止する方針を固めました。今までの経団連は「金も出すが口も出す」方針で献金のあっせんを行っていましたが、民主党の大勝によって政治関与が難しくなった上、政治資金に対する国民からの視線も厳しくなる一方ですので、中止を決断したものとみられます。
 そもそも民主党が掲げている企業献金禁止案自体、自民党への兵糧攻めの意味合いが強いとみなされていますが、今回の決定はそれが前倒し実行されるようなものですから、与党時代に財界との蜜月関係を築き、大量の献金を確保してきた自民党にとっては、大打撃となるであろうことは想像に難くありません。その上に「郵政選挙」の大量当選から状況が一変し、政党交付金も大幅に減額されるため、なおさらダメージは大きくなります。ただでさえ弱り目の自民党としては、まさに踏んだり蹴ったりの状況です。
 しかし、自民党はこれを危機的状況であると認識し、下手に自分の手足を縛るより、むしろ財界依存を打破するチャンスであると捉え直すべきでしょう。自民党は長らく与党の利権に支えられて権威を誇ってきた政党ですので、下野した途端に混乱に陥るのは当然とさえいえますし、政権交代が日常的に発生する二大政党制に対応するためには体質改善が必要ですが、本件もその一環に過ぎません。
 二大政党制においては、両者の立場に差異が少ない中で、それぞれが党の個性を発揮することが重要になりますが、それでは「自民党らしさ」とは一体何なのでしょうか。自民党は「保守」を強調していますが、保守とは何なのでしょうか。財界の傀儡となり、大量の企業献金を受け取る見返りとして、日本のためにならない政策でも二つ返事で実行することが、「自民党らしさ」や「保守」なのでしょうか。そうでないならば、企業献金がいかに「自民党らしさ」を阻害してきたか分かろうというものです。
 今後、企業献金への制限が厳しくなることはあれ、緩和される可能性は低いでしょう。企業献金に対する国民の目も同様です。まして、自民党は経団連ら財界の言い分を二つ返事で受け入れてきており、大企業のためにはなっても日本の国益を損ねる政策を実行したり、あるいは実行しようとした結果が、今回の大敗北の直接の原因となっています。政治資金規正の意味でも、また「自民党らしさ」を発揮する意味でも、企業献金依存から脱却しなくてはならないのは明らかで、これを機に党内の改革を進める必要があります。
 ただ、自民党がそのような改革を行う上で、不安なのが総務会長の田野氏のような考え方です。曰く、「野党だから要望を政策に反映できない中で、経団連の決定はある程度仕方ない」というのです。すなわち、与党に舞い戻ったら財界の要望を次々に政策に反映し、再び大量の献金を受け取ろうという意味であるとみなせます。政権交代のある政治においては、国民を無視して財界の傀儡となっていては選挙に勝てませんが、氏はなぜ自民党が敗北に至ったか分かっているのでしょうか。
 経団連は献金で自民党を買収し、自分の利益にはなっても国益に反する政策を大量に実行させた結果、企業の集合体でありながら国民からの信頼を失い、自民党を通して退場勧告を突きつけられました。経団連が大企業の取りまとめ役として今後も力を発揮したいのであれば、経団連は体質を変える必要があり、新会長の米倉氏はそれを行わなくてはなりません。そして、もし経団連が変わるのであれば、自民党も変わらなくてはなりません。仮に経団連が変わらず、自民党もまた変わらなければ、国民から再び不信任を突きつけられる結果が待っています。
 現状の自民党は「敵失」に期待するしかない状況に置かれていますが、その敵失が民主党にダメージを与えることはあっても、自民党の信頼回復にはほとんど役立っておらず、支持を回復するのは困難な状況です。だからこそ、自民党は経団連の決定を逆に生かし、献金によるがんじがらめの状態から脱却し、「自民党らしさ」を発揮する準備を整えるべきでしょう。そのような努力と改革を重ねていけば、低IQ選挙のような一過性のものに頼らなくても、いずれ必ず信頼を得られるに違いありません。

 JSFにおけるf:selectItemsには、ManagedBeanのコレクション(例えばMap)を指定できました。すなわち、ManagedBeanでの操作次第でメニューの中身を変更できることを意味しますが、これとAjaxを組み合わせると便利ではないでしょうか。すなわち、何らかのイベントにあわせてAjaxリクエストを送信し、そこでコレクションの中身を変更するのと同時に、f:selectItemsを使用するコントロールをf:ajaxのrenderに指定しておいて再読み込みさせれば、任意のタイミングで手軽にドロップダウンメニューなりラジオボタンなりの中身を変更できそうです。
 すなわち、これまでは主に結果表示に使っていたAjaxを、今度はコントロールの動的な変更に使用してみようという試みです。単にメニューの中身を変えるだけならAjaxなしのJavaScriptでもできますが、あらゆるデータをJavaScript中にいちいち全部記述していると非常に膨大になる可能性がある場合、あるいは内容を動的に更新したい場合には、Ajaxの方が便利でしょう。
 せっかくAjaxでメニューを動的に変更するのですから、今回はメニュー項目をEntityとしました。
/WEB-INF
 /classees
  /com
   /yamicha
    /varmenu
     @Entity Account.java
     @Entity AccountType.java
     @Entity Journal.java
     @ManagedBean AccountBean.java
     @Stateless AccountAccess.java
  /META-INF
   persistence.xml
 web.xml
account.xhtml
 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 Account Servlet</display-name>
  <description>JSF 2.0 Account Sample Servlet</description>

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

  <servlet-mapping>
    <servlet-name>jsf20account</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
</web-app>
 application.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>
 @Entityクラスとしては、勘定科目の種別(資本、負債など)を記録するAccountType、勘定科目(現金、当座預金など)を記録するAccount、取引を記録するJournalの3つを作成しました。本来、Journalには取引の日付や小書きなどのデータも格納できるようにすべきですし、そもそも複式の記帳としては貸借がセットになっていなければおかしいのですが、今回はあくまでAjaxのコードですから、「金額」のみを持つ簡単なものとしました。
 まずAccountTypeの内容をドロップダウンリストに表示し、ユーザーがいずれかの項目を選択すると、そのAccountTypeに属するAccountが次のドロップダウンリストに表示される、というUIを想定して作成しています。その上で、金額を入力して送信するとJournalに記録されるものとします。
// AccountType.java
package com.yamicha.varmenu;

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

@Entity @Table(name="varmenu_account_type" , schema="yamicha")
	public class AccountType implements java.io.Serializable{
	private int id;
	private String name;
	private List<Account> accounts;

	public AccountType(){
		accounts = new ArrayList<Account>();
	}
	public AccountType(String s){
		this();
		name = s;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@OneToMany(cascade=CascadeType.ALL , mappedBy="type")
		public List<Account> getAccounts(){
		return accounts;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setAccounts(List<Account> a){
		accounts = a;
	}

	public void link(){
		for(Account a : accounts)
			a.setType(this);
	}
}

// Account.java
package com.yamicha.varmenu;

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

@Entity @Table(name="varmenu_account" , schema="yamicha")
	public class Account implements java.io.Serializable{
	private int id;
	private String name;
	private int price;
	private AccountType type;
	private List<Journal> journals;

	public Account(){
		journals = new ArrayList<Journal>();
	}
	public Account(String s){
		this();
		name = s;
	}

	@Id @Column(name="id") @GeneratedValue public int getId(){
		return id;
	}
	@Column(name="name") public String getName(){
		return name;
	}
	@ManyToOne @JoinColumn(name="type") public AccountType getType(){
		return type;
	}
	@OneToMany(cascade=CascadeType.ALL , mappedBy="account")
		public List<Journal> getJournals(){
		return journals;
	}

	public void setId(int i){
		id = i;
	}
	public void setName(String s){
		name = s;
	}
	public void setType(AccountType t){
		type = t;
	}
	public void setJournals(List<Journal> j){
		journals = j;
	}
}

// Journal.java
package com.yamicha.varmenu;

import javax.persistence.*;

@Entity @Table(name="varmenu_journal" , schema="yamicha")
	public class Journal implements java.io.Serializable{
	private int id;
	private int price;
	private Account account;

	public Journal(){
	}
	public Journal(int p){
		price = p;
	}

	@Id @Column(name="id") @GeneratedValue public int getId(){
		return id;
	}
	// 帳簿の金額に price というプロパティ名は奇妙ながら
	// value などでは色々面倒なので...
	@Column(name="price") public int getPrice(){
		return price;
	}
	@ManyToOne @JoinColumn(name="account") public Account getAccount(){
		return account;
	}

	public void setId(int i){
		id = i;
	}
	public void setPrice(int p){
		price = p;
	}
	public void setAccount(Account a){
		account = a;
	}
}
 これらのEntityはAccountAccessクラスから使用します。
package com.yamicha.varmenu;

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

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

	// サンプルデータ登録用メソッド
	public void regist(){
		AccountType assets = new AccountType("資産");
		AccountType liabilities = new AccountType("負債");
		AccountType equity = new AccountType("資本");
		AccountType income = new AccountType("収益");
		AccountType expenses = new AccountType("費用");

		assets.getAccounts().add(new Account("現金"));
		assets.getAccounts().add(new Account("当座預金"));
		assets.getAccounts().add(new Account("売掛金"));
		assets.getAccounts().add(new Account("のれん"));
		assets.getAccounts().add(new Account("開発費"));
		assets.link();
		em.persist(assets);

		liabilities.getAccounts().add(new Account("買掛金"));
		liabilities.getAccounts().add(new Account("支払手形"));
		liabilities.getAccounts().add(new Account("社債"));
		liabilities.link();
		em.persist(liabilities);

		equity.getAccounts().add(new Account("資本金"));
		equity.getAccounts().add(new Account("資本準備金"));
		equity.link();
		em.persist(equity);

		income.getAccounts().add(new Account("売上"));
		income.getAccounts().add(new Account("受取手数料"));
		income.getAccounts().add(new Account("仕入割引"));
		income.link();
		em.persist(income);

		expenses.getAccounts().add(new Account("仕入"));
		expenses.getAccounts().add(new Account("除却損"));
		expenses.getAccounts().add(new Account("貸倒損失"));
		expenses.link();
		em.persist(expenses);

		em.flush();
	}

	public List<AccountType> getAccountTypes(){
		return (List<AccountType>)em.createQuery(
			"SELECT t FROM AccountType t").getResultList();
	}
	public List<Account> getAccounts(AccountType t){
		em.merge(t);
		return new ArrayList<Account>(t.getAccounts());
	}
	public List<Journal> getJournals(){
		return (List<Journal>)em.createQuery(
			"SELECT j FROM Journal j ORDER BY j.id DESC"
			).getResultList();
	}

	public AccountType getAccountType(int id){
		return em.find(AccountType.class , id);
	}
	public Account getAccount(int id){
		return em.find(Account.class , id);
	}

	public void addJournal(Journal j , int acc_id){
		Account a = em.getReference(Account.class , acc_id);
		j.setAccount(a);
		em.persist(j);
	}
}
 AccountAccessはAccountBeanクラスで使用します。
package com.yamicha.varmenu;

import javax.ejb.*;
import javax.annotation.*;
import javax.faces.validator.ValidatorException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.event.*;
import java.util.*;

@ManagedBean @ViewScoped public class AccountBean{
	@EJB(beanName="AjaxAccountAccess") private AccountAccess aa;
	private Map<String , Integer> accountTypes;
	private int accountType;
	private Map<String , Integer> accounts;
	private int account;
	private int price;

	public AccountBean(){
		accountTypes = new TreeMap<String , Integer>();
		accounts = new TreeMap<String , Integer>();

		accountType = -1;
		account = -1;

		price = 0;
	}

	// DI 後でなければドロップダウン用の Map を作成できないので
	// Map へのデータ登録は @PostConstruct で行う
	@PostConstruct private void init(){
		createAccountTypes();
		createAccounts(-1);
	}

	private void createAccountTypes(){
		accountTypes.clear();

		accountTypes.put("種別を選択" , -1);
		for(AccountType t : aa.getAccountTypes())
			accountTypes.put(t.getName() , t.getId());

		accountType = -1;
	}
	private void createAccounts(int id){
		accounts.clear();

		accounts.put("勘定を選択" , -1);
		if(id != -1){
			AccountType at = aa.getAccountType(id);
			if(at != null){
				for(Account a : aa.getAccounts(at)){
					accounts.put(
						a.getName() , a.getId());
				}
			}
		}

		account = -1;
	}

	// サンプルデータ登録用メソッド
	public void regist(){
		aa.regist();
		init();
	}

	// AccountType のドロップダウンの選択項目が
	// 変更された際に呼び出されるイベント
	// AccountType に対応する Account をデータベースから
	// 取得し、Account のドロップダウンの Map に登録する
	public void changeAccountType(ValueChangeEvent e){
		createAccounts(((Integer)e.getNewValue()).intValue());
	}

	public void addJournal(){
		aa.addJournal(new Journal(price) , account);
		price = 0;
		init();
	}

	public int getAccountType(){
		return accountType;
	}
	public Map<String , Integer> getAccountTypes(){
		return accountTypes;
	}
	public int getAccount(){
		return account;
	}
	public Map<String , Integer> getAccounts(){
		return accounts;
	}
	public int getPrice(){
		return price;
	}
	public List<Journal> getJournals(){
		return aa.getJournals();
	}

	public void setAccountType(int a){
		accountType = a;
	}
	public void setAccountTypes(Map<String , Integer> a){
		accountTypes = a;
	}
	public void setAccount(int a){
		account = a;
	}
	public void setAccounts(Map<String , Integer> a){
		accounts = a;
	}
	public void setPrice(int p){
		price = p;
	}

	// 勘定科目が選択されていない場合に
	// エラーを発生させるバリデータ
	public void accountValidator(FacesContext context ,
		UIComponent component , Object value){
		if(((Integer)value) == -1){
			throw new ValidatorException(
				new FacesMessage("勘定を選択してください。"));
		}
	}
}
 JSF + EJB + JPAは中身の割にコードが長くなるので困りますが、以上でJavaコードは終わり、ようやく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 Variable Dropdown</title>
</h:head>

<h:body>
  <b>JSF 2.0 Variable Dropdown</b>

  <h:form>
    <h:panelGrid columns="2">
      <h:outputText value="AccountType:" />
      <h:selectOneMenu value="#{accountBean.accountType}"
        valueChangeListener="#{accountBean.changeAccountType}">
        <f:selectItems value="#{accountBean.accountTypes}" />
        <f:ajax execute="@this" render="account_list" />
      </h:selectOneMenu>

      <h:outputText value="Account:" />
      <h:selectOneMenu id="account_list" value="#{accountBean.account}"
        validator="#{accountBean.accountValidator}">
        <f:selectItems value="#{accountBean.accounts}" />
      </h:selectOneMenu>

      <h:outputText value="Value:" />
      <h:inputText value="#{accountBean.price}" />
    </h:panelGrid>

    <h:commandButton value="Add" action="#{accountBean.addJournal}" />

    <hr />
  </h:form>

  <table border="1">
    <tr>
      <td>Type</td>
      <td>Account</td>
      <td>Price</td>
    </tr>

    <ui:repeat value="#{accountBean.journals}" var="j" end="20">
      <tr>
        <td><h:outputText value="#{j.account.type.name}" /></td>
        <td><h:outputText value="#{j.account.name}" /></td>
        <td><h:outputText value="#{j.price}" /></td>
      </tr>
    </ui:repeat>
  </table>

  <h:form>
    <h:commandButton value="Regist Sample Accounts"
      action="#{accountBean.regist}" />
  </h:form>

</h:body>

</html>
 最初に「Regist Sample Accounts」を押すとサンプルの勘定科目が登録され、その後はAccountTypeドロップダウンに選択肢が現れます。ここから適当な勘定の種類(例えば「資産」)を選択すると、下のAccountドロップダウンに選択肢が現れます(「資産」を選んだ場合であれば、「のれん」「売掛金」「当座預金」「現金」「開発費」。開発費は費用ではなく繰延資産です。念のため)。後はその下のValueテキストボックスに金額を入れて「Add」を押せば、取引のデータが登録されます。また、Accountドロップダウンの項目を選択せずに「Add」を押すと、バリデータによってエラーメッセージが表示されます。
 データベースのせいで複雑になってはいますが、つまりは単にexecuteで必要なデータを送信し、Mapの中身を変更し、renderで再描画するだけですから、この手法は手軽な割に便利そうです。
カテゴリ [開発魔法][社会問題][経済・知的財産] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -