さとやn Blog

試合はRuby,勝負はC#!

2011年04月

Javaで複数パターンの日付文字列を厳密にパースする。

Javaで日付文字列をパースする処理が必要になりました。 org.apache.commons.lang.time.DateUtilsを使えば複数のパターンを配列で指定できるそうなので、それを利用してやってみる。
ていうか、ロケールに合わせて yyyy/MM/dd とか yyyy.MM.dd とか yyyy-MM-dd とか、一般的に使用されそうなやつはデフォルトで対応しろよ、とか思うのですが、そこはJavaなのでハナから期待はしていません。

で、下記のようなコードを書いてみました。 区切り文字が /(スラッシュ), .(ドット)、-(ハイフン)という、かなり普通に使用されるであろうパターンです。

	import java.text.ParseException;
	import java.util.Date;
	import org.apache.commons.lang.time.DateUtils;

	public class Main {
	    public static void main(String[] args) {

	        String[] patterns = new String[] {"yyyy-MM-dd", "yyyy.MM.dd", "yyyy/MM/dd"};

	        String[] dateStringList = new String[] {"1973-05-30", "1973.5.30", "1973/5/30", "1972/16/60"};

	        for (String dateString : dateStringList) {
	            try {
	                Date d = DateUtils.parseDate(dateString, patterns);
	                System.out.printf("String=%s, Date=%s\n", dateString, d);
	            } catch (ParseException e) {
	                // TODO Auto-generated catch block
	                e.printStackTrace();
	            }
	        }
	    }
	}
	
で、結果は
53)

う〜ん、、、 1972/16/60 というありえない日付を 1973/05/30
とちゃんと解釈してくれています。ていうか、エラーにしろよ、とか思うのですが、まあ、この言語ではもうこういうのが当たり前なんだと、あきらめモード、、、。

でも、DateUtils.parseDateStrictly を使うと厳密に解釈してくれるそう。
で、やってみると結果は

05)

まあ、これが普通だと思うんだけど、、、。

ちなみにC#では、何もしなくても期待通り、、、。
43)

まあ、Rubyでも
55)

C#やRubyがお利口さんなだけです

jQuery: live関数でまだ存在しない要素に対してイベントを設定する

Ajaxを使用していると、動的に追加されたコンテンツにボタンとかリンクとかがあって、そいつらにイベントハンドラを設定したい場合が多々あると思います。
私はこれまでは、Ajaxで取得したコンテンツをページに追加した後に、イベントハンドラを設定するコードを書いていたのですが、これって結構コードが美しくなかったりします。
でも、まあ、仕方ないよなー、とか思っていたのですが,jQueryのliveメソッドを使用すると、簡単に解決できてしまうことを発見。
ドキュメントを読むと、
	Attach a handler to the event for all elements which match the current selector, now and in the future.
現在及び将来において存在する要素に対してイベントハンドラを設定することができる、とのこと。
これは素晴らしい、と言うことで早速やってみる。
「追加」をクリックすると、Ajaxで部分コンテンツを取得して、ページに追加して、「削除」をクリックするとその要素が消える、といった感じのページを作ってみる。
31)

live関数を使用しない場合は、こんな感じで、部分コンテンツ取得後に「削除」リンクのイベントを設定するコードを書いてました。
	$(function(){
		
		//「追加」リンクをクリックで 簡単なDIV要素をAjaxで取得してドキュメントに追加するだけ
		$("#addLink").click(function(){
			$.get("./get_partial_content", function(html){
				$(document.body).append($(html));
				
				//削除リンクのイベント設定
				$(".deleteLink").click(function(){
					$(this).parent().remove();
				})
]			});
		});
		
	})
でも、この書き方だと、要素を追加するたびに、既存の削除リンクに対してもイベントハンドラを追加し続けてしまいます。この例では要素が削除されてしまうので、眼に見える害はありませんが、もしアラートを表示するような内容にした場合、何度も同じアラートが表示されるような削除リンクができあがってしまいます。
できればページ初期化時にイベント関連はまとめて設定しておきたいところです。
で、それを可能にしてくれるのがlive関数、というわけで、コードを次のように書き換えてみる。

	$(function(){
		
		//「追加」リンクをクリックで 簡単なDIV要素をAjaxで取得してドキュメントに追加するだけ
		$("#addLink").click(function(){
			$.get("./get_partial_content", function(html){
				$(document.body).append($(html));
			});
		});
		
		//上記のイベントで動的に追加されたDIV要素の「削除」リンクをクリックすると、自分自身(と親DIV)をドキュメントから削除する
		$(".deleteLink").live("click", function(){
			$(this).parent().remove();
		});
	})
	
こうすると、動的に追加されたコンテンツ内の class="deleteLink" の要素に対してもイベントハンドラが設定されます。
素晴らしい!

mono のサイトはPHPで作ってる?

.NET Frameworkのオープンソース実装版のmonoですが、先ほどサイトを見に行ったらこんなエラーが、、、。

Fatal error: Call to a member function on a non-object in /home/mono/public_html/includes/ObjectCache.php on line 409

ASP.NET じゃないのか?!

ただ、それだけです。 

中原の虹 (1) (講談社文庫)

張作霖の物語です。

マンチュリアン・レポート より先にこっちを読むべきだったのに、順番を間違ってしまった、、、。


タイトル中原の虹 (1) (講談社文庫)
著者/監督/Artist浅田 次郎
価格, 出版¥ 660 講談社
評価★★★★
 2011-04-15

【内容説明】

壮大なスケールで描かれる英雄たちの物語!「汝、満洲の王者たれ」。老占い師の予言のもと、貧しく親もない一人の青年が、満洲の覇者となるべく立ち上がる。馬に跨り広大な大地を駆ける、馬賊の長として。

【内容(「BOOK」データベースより)】

「汝、満洲の王者たれ」予言を受けた親も家もなき青年、張作霖。天命を示す“龍玉”を手に入れ、馬賊の長として頭角を現してゆく。馬と拳銃の腕前を買われて張作霖の馬賊に加わった李春雷は、貧しさゆえに家族を捨てた過去を持つ。栄華を誇った清王朝に落日が迫り、新たなる英雄たちの壮大な物語が始まる。

livedoor プロフィール
QRコード
QRコード
  • ライブドアブログ