Jythonはじめました

西尾さんのブログを写経中
http://www.nishiohirokazu.org/blog/2006/04/jython.html


用意したもの

eclipse (EclipseWiki http://eclipsewiki.net/eclipse/)
JDK1.6 (JDKダウンロード http://java.sun.com/javase/ja/6/download.html)
Python2.6 (Pythonダウンロード http://www.python.org/download/)
Jython2.5(Jythonダウンロード http://www.jython.org/downloads.html)
PyDeveclipseでのPython,Jython,IronPython開発用plugin http://pydev.org/download.html
 ↑なくてもOKですが、Pythonコードの補完とか出来るようになるので便利です。


↓写経なので、西尾さんのブログに載ってるコードとほぼ同じなのですが・・・
HelloJython.java

import org.python.util.PythonInterpreter;

public class HelloJython {
	public static String JAVA_STR = "String in Java World";

	public static void main(String[] args) {
		System.out.println("Hello Java!");
		PythonInterpreter pyi = new PythonInterpreter();
		pyi.exec("print 'Hello Python!'");
		pyi.execfile("script/init.py");
		System.out.println(pyi.get("PY_STR"));
	}
}

init.py

import HelloJython

print HelloJython.JAVA_STR
PY_STR = "String in Python World"


出力結果

Hello Java!
Hello Python!
String in Java World
String in Python World

やったー


ちなみに、こんな感じに配置


なにより、PyDevのおかげでeclipsePython書けるようになったのが嬉しかったりw
Jythonおもしろいです。ジャイソン。


JavaのコードはJavaのもの。
PythonのコードもJavaのもの。
それはジャイアン

(注:逆も可です)

メモ)マスタとログ

※業務上の個人的なメモです。一般的なことを書いてるわけじゃないので注意!


マスタが更新される度にログテーブルに新しいログが作られる。
そうしないと、マスタが更新されたときに、過去の計算結果が変わってしまう。
トランザクションデータは最新のログと常に紐付く。
ログテーブルのカラムの値を直接変更しちゃダメ。それは事実を改竄すること。


モデルの第2引数は値を入れる先を指定する。
もし、値を入れる先がnullの場合、自動的にObjectContext内に
DataObjectが作られてそこに値を入れる。
(自動で作られると知らずにCommitChanges()で嵌る)


アノテーション@Injectはただの目印。
Pageをnewするときに
@Inject
ObjectContext context;
を見つけたら、ObjectContextName("hoge")で指定した名前でObjectContextを作る(ように作ってある)。


現状、Daoに@Injectを付ける意味はあまり無い。

取り急ぎここまで。

質問力

仕様の説明を受けたときに、実装の時のことを考えて質問する力が足りない。
実装する力が足りなすぎて、話しながらイメージができない。
以前、id:t_yanoさんと一緒に説明を受けたとき、id:t_yanoさんはがんがん質問してた。
自分の知りたいことを的確に聞きだせるように質問できる力は絶対必要。

CompoundPropertyModel便利


最初は、モデルの概念に慣れなくてWicket面倒だなぁって思ってたけど
やっと便利さがわかってきました。

クラス名とか変数名は適当です。

private Form<Payment> createInputForm(Payment payment) {
	Form<Payment> form = new Form<CarrierPaymentReport>("inputForm", new CompoundPropertyModel<Payment>(payment));
	form.add(new TextField<Integer>("charge"));
	form.add(new TextField<Integer>("past"));
	form.add(new TextField<Integer>("correction"));
	return form;
}



・TextField(テキストボックス)の初期表示の値を設定したい。
・入力された値を受け取って次に遷移するぺージに渡したい。
この2つのことをやりたいって思った時に、Wicketじゃなかったら自分ならこう考えます(ました)。


ページが表示されるときに、setValue()みたいなメソッドを呼んで初期値を設定して、
次のページに遷移するボタンを押したらgetValue()みたいなメソッドを呼んで値を受け取る。


実際この方法でもできるけど、それじゃWicket使う意味ないですよね。
↑のコードではCompoundPropertyModelのインスタンスをFormの引数に渡しています。

CompoundPropertyModelに値のある場所(ここではPaymentのインスタンスのフィールド名)だけ教えれば、あとはsetValue()、getValue()などする必要ありません。


便利・・・


page自体にデフォルトのモデルを↓で設定することもできる。便利。
setDefaultModel(new CompoundPropertyModel(payment));

新カテゴリ「チラ裏」


例えば、プログラムに関する知識がまっさらな状態=すべてがわからない状態の時に
とりあえずJavaHello World!!を出力しようとしたとします。

System.out.print("Hello World!!");


Javaだとこう書くわけですけど、この時全部を理解しようとして
クラスや標準出力ストリームの話まですべて理解しようとすると難しい。


何が言いたいかと言うと、仕事として責任あるコードを書くって大変だなと
最近、痛感しています。それだけです!


ブログ書かなすぎなので、仕事中ふと思ったことなどを
ただ書いていくだけの敷居の低いカテゴリを作ってみました。
はい。

BigDecimal


BigDecimalは計算で生じる誤差を解決するために10進数値を文字列として扱う。
基本データ型に比べてパフォーマンスは落ちるが、厳密な計算が可能でお金の計算などに用いられる。

// 掛け算メソッド
BigDecimal multiply(BigDecimal val)

// 割り算メソッド
BigDecimal divide(BigDecimal val, int scale, int roundingMode)


javadoc
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/math/BigDecimal.html