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
 垂オ訳ございませんが、現在このブログではトラックバックを受け入れていません。

 この記事に対してリンクされる場合には、こちらのURLをご利用ください。
http://void.yamicha.com/blog/blog.cgi?mode=view&number=767
 上記URLをトリプルクリックされますと、簡単にURL全体の選択が行えます。

※以下の記事がトラックバックされます。
テン菅
2010/06/12(Sat)20:11:03
 沖縄問題をめぐる福島氏の罷免と社民党の連立離脱に続き、今度は国民新党の亀井氏が金融・郵政改革相を辞任しました。国民新党は会期を延長しての郵政改革法案の成立を主張していましたが、民主党は選挙日程への影響を考慮して要求を受け入れず、亀井氏の辞任に至ったものです。ただし、社民党の場合とは違い、ただちに連立を解消するものではないとされています。高支持率に乗って一気に選挙になだれ込むはずが、菅内閣は最初からつまづきを余儀なくされました。
 前任者の時期に社民党には離脱され、今度は就任早々に国民新党との関係まで不安定化するとあって、菅氏は早速出鼻をくじかれた格好ですが、無理に会期を延長して郵政改革法案の成立を行わなかったのは正解といえるでしょう。国民新党と安易に「成立」の合意を交わしたのは菅氏の落ち度ですが、政治を有利に進めるために国民新党をつなぎとめる必要があり、そのために会期延長や郵政改革法案の成立を強行したとあっては、こちらもまた「政争の具」に他ならないためです。
 もし今の日本に何か喫急の課題があり、会期を延長してすぐにでも成立させなければならないところを、民主党が選挙目当てに会期延長を否定したなら、それは批判を浴びても仕方のない行為です。しかし、郵政改革法案は決して喫急の法案ではないどころか、民業圧迫などの問題点も多く指摘されている代物です。むしろ十分な検証が必要なはずで、連立相手をつなぎとめるために無理やり成立させるようなものではありません。
 したがって、選挙前に駆け込み成立を図るよりは、これを参院選の公約の1つとして設定し、信任を得た上で成立させる方が道理にかなっています。国民新党としては、民主党が力を失えば法案の成立は絶望的ですし、仮に民主党が勝利しても国民新党が力を失えば約束が反故にされてしまうという危機感があるはずですが、その場合は郵政改革法案が必要とされていなかったと判断するよりありません。
 つまり、民主党が国民新党の要請を蹴ったのは、選挙対策ではなく道理の面からも正当なものといえます。もし無理に会期延長の末に法案を成立させていれば、時間の経過による菅氏への期待感の消失だけでなく、連立維持のために問題のある法案を無理やり成立させた菅氏の行動への疑問、国民新党に好き勝手を許した菅氏の指導力への不信などが生じ、氏はおそらく支持を減らしていたでしょう。
 また、今のところ菅氏がかなりの支持を集めているのは、菅氏本人ではなく「脱小沢」の動きが評価されているためです。小沢氏に支配された民主党ではどうしようもなく、自民党も評価に値せず、第三極も国民の要求を勘違いした政党がほとんどであるため、一時期は森時代や麻生時代を上回るほどの閉塞感が漂っていました。しかし、選択肢のない状況下で民主党が小沢氏を排除したのと、小沢氏はともかく民主党自体は一定の評価を受けていたために、意外なほど支持を持ち直したものと考えられます。
 そうであるなら、政策を掲げて国民に信を問える今こそ、小沢・鳩山時代のおかしなバラマキに対して大ナタを振るう最大かつ絶好の機会であるはずです。国民の多くは小沢氏を支持せず、その行動や政策に疑問を抱いているのですから、小沢時代の政策を全面的に見直すのは小沢色及び小沢氏の影響力の排除にもつながり、国民から支持を得られるはずです。さらに、実現が極めて難しい、あるいは実現してもほとんど意味のない無駄なバラマキ政策に関しては、選挙を目前に控えた今であれば容易に見直せます。一方、選挙の後で実現不可能だから、または無駄だからと約束を反故にすれば、批判を浴びるのは免れません。
 特に子ども手当てに関しては、かねてから子どもへの予算の欠乏が指摘されている日本において、配偶者控除などの矛盾に満ちた控除を廃止し、代わりに子どもの福祉を充実させようとする政策なのですから、本来なら非の打ち所のない優れた政策です。しかし、これを選挙対策としてバラマキにしてしまったがために、意味不明な状況に陥っているのです。せっかく子ども重視の政策が登場したはずが、その予算が車の売り上げに貢献するのでは意味がありません。この財源を生かして育児環境や教育を充実させれば、その方が弱者救済になりますし、教育格差などの格差問題も軽減できます。
 このように、民主党が掲げている目玉政策には、理念自体には優れた点が見受けられるものの、一部のピントがずれているせいで台無しになっているものがあります。これらを是正するだけでもかなりの効果が出る上、是正であれば現行案の修正であって廃止ではないため、作り直すより簡単な上、国民にも受け入れられやすいはずです。
 また、この参院選が終了すれば、衆院の解散がない限りは3年ほど選挙のない期間が続きます。そこでぜひとも争点にすべきなのが年金改革です。民主党は3年内に年金一元化と全額税化を実現することを目玉公約とすべきですし、自民党も対抗した公約を行うべきです。財源として消費税が必要なら、民主党はそれも公約に盛り込むべきでしょう。ここで先延ばしをしたとしても、年金改革や消費税はいずれ必ず論じなくてはならない問題ですし、何よりタレントの人気投票よりも年金選挙の方が圧倒的に建設的です。
 菅氏が受け持つ最初の課題は、仮に目玉政策であったとしても、無用と見た政策は容赦なく覆すことです。氏にこれができなければ、「菅内閣も前の体制と変わらない」と判断され、逆に支持を失ってしまうでしょう。

 EJBにはTimer Serviceなるものがあります。タイマーの設定の記述が若干面倒なことを除けば、あるタイミングで特定の動作を行ったりと、なかなか面白い機能です。
 ところで、EJB 3.1には@Scheduleなるものが加わっています。どうやら、このアノテーションをメソッドにつけておけば、指定した時間や間隔でそのメソッドが呼び出されるらしい、何ともお手軽そうな機能です。
 TimerServiceを手書きで使うより自由度はなさそうですが、定期的な更新が必要なデータを更新したり、一定期間毎にログを削除したり、特定の曜日・日付・年月に必要な処理を実行したりするには困らないはずです。
 以下、「30秒毎にデータベースから最新のログを取得し、@SingletonのBeanに格納」「2分毎にログを確認し、5分以上前のログがあったらデータベースから削除」するサンプルです。特に最新のログを必要とはせず、しかもデータベースにアクセスが殺到してパフォーマンスが悪くなることを回避したいような状況を想定しています。
/com
 /yamicha
  /schedule
   @Entity Log.java
   @Stateless LogAccess.java
   @Singleton LogCache.java
   @WebServlet LogServlet.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>
 Log.javaはログですので、必要な情報を色々と格納できるようにしても構いませんが、今回は単純にIDとメッセージ、日時だけとしました。
package com.yamicha.schedule;

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

@Entity @Table(name="schedule_log" , schema="yamicha")
	public class Log implements java.io.Serializable{
	private int id;
	private String message;
	private Date date;

	public Log(){
		date = new Date();
	}
	public Log(String s){
		this();
		message = s;
	}

	@Id @GeneratedValue @Column(name="id") public int getId(){
		return id;
	}
	@Column(name="message") public String getMessage(){
		return message;
	}
	@Column(name="date") @Temporal(TemporalType.TIMESTAMP)
		public Date getDate(){
		return date;
	}

	public void setId(int i){
		id = i;
	}
	public void setMessage(String s){
		message = s;
	}
	public void setDate(Date d){
		date = d;
	}
}
 LogAccess.javaはデータベースにアクセスするBeanです。登録・取得・削除の機能を実装しています。これらを直接呼び出すと、データベースへの読み書きの動作が生じます。
package com.yamicha.schedule;

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

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

	public void add(Log log){
		log.setDate(new Date());
		em.persist(log);
	}
	public List<Log> getLogs(){
		return em.createQuery(
			"SELECT l FROM Log l ORDER BY l.date DESC" ,
			Log.class).getResultList();
	}
	public void clearOld(){
		// 5分以上前のものを削除
		Query q = em.createQuery(
			"DELETE FROM Log l WHERE l.date < ?1");
		q.setParameter(1 , new Date(new Date().getTime() -
			60 * 5 * 1000));
		q.executeUpdate();
	}
}
 LogCache.javaは30秒毎にログを読み込んで更新し、2分毎にLogAccessのclearOld()を呼び出します。読み込んだログは自身のフィールドに保管し、getLogs()ではそれを呼び出し側に返しています。
package com.yamicha.schedule;

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

@Remote @Singleton(name="ScheduleLogCache" ,
	mappedName="ejb/ScheduleLogCache")
	public class LogCache{
	@EJB(beanName="ScheduleLogAccess") private LogAccess la;
	private List logs;
	private Date update;

	public LogCache(){
	}
	@Schedule(hour="*" , minute="*" , second="*/30")
		synchronized private void refresh(){
		logs = la.getLogs();
		update = new Date();
	}
	@Schedule(hour="*" , minute="*/2" , second="0")
		private void clear(){
		la.clearOld();
	}

	synchronized public List getLogs(){
		return logs;
	}
	synchronized public Date getLastUpdate(){
		return update;
	}
}
 一部をコメントアウトしようとした際に、"*/1"などの表現がコメントの終点とみなされて面食らったりしましたが、これで一定間隔での呼び出しを行ってくれます。記述方法は他にも色々あり、The Java EE 6 TutorialのUsing the Timer Serviceの項に詳しく書かれていました。
 いくつか簡単にまとめておくと、

hour="10-15" , minute="0" , second="0"
 10:00:00、11:00:00、12:00:00 ... 15:00:00。

hour="1,3,5" , minute="0" , second="0"
 01:00:00、03:00:00、05:00:00。

hour="*" , minute="*" , second="*/10"
 秒数が10で割り切れる10秒毎。

hour="15/3" , minute="0" , second="0"
 15時より3時間毎。

 などの記述があるということが書かれています。
 LogServlet.javaでログの読み書きを実装しています。ログはLogCacheから取得しています。
package com.yamicha.schedule;

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;
import java.util.Date;

@WebServlet(name="logservlet" , urlPatterns={"/*"})
  public class LogServlet extends HttpServlet{
  @EJB(beanName="ScheduleLogCache") private LogCache lc;
  @EJB(beanName="ScheduleLogAccess") private LogAccess la;

  public void doPost(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    doGet(request , response);
  }
  public void doGet(HttpServletRequest request ,
    HttpServletResponse response) throws IOException{
    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>Log</title>");
    out.println("</head>");
    out.println("<body>");

    out.println("<b>Log</b>");

    String c = request.getParameter("c");

    if("add".equals(c)){
      la.add(new Log(request.getParameter("message")));
      c = null;
    }

    if(c == null || c.isEmpty()){
      List<Log> logs = lc.getLogs();

      out.println("<table border="1">");
      out.println("<tr>");
      out.println("<td bgcolor="#CCDDFF">ログ</td>");
      out.println("<td bgcolor="#CCDDFF">日付</td>");
      out.println("</tr>");

      for(Log log : logs){
        out.println("<tr>");
        out.println("<td>" + log.getMessage() + "</td>");
        out.println("<td>" + log.getDate() + "</td>");
        out.println("</tr>");
      }

      out.println("</table>");

      out.println("Last Update: " + lc.getLastUpdate());

      out.println("<form action="?" method="POST">");
      out.println("<input type="submit" value="再読み込み" />");
      out.println("</form>");

      out.println("<form action="?" method="POST">");
      out.println("<input type="text" name="message" size="40" />");
      out.println("<input type="hidden" name="c" value="add" />");
      out.println("<input type="submit" value="登録" />");
      out.println("</form>");
    }

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

    out.close();
  }
}
 タイマーを開始したり止めたり変更したりしないのであれば、@Scheduleはかなり手軽に使えそうです。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -