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)
・PyDev(eclipseでの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のおかげでeclipseでPython書けるようになったのが嬉しかったりw
Jythonおもしろいです。ジャイソン。
JavaのコードはJavaのもの。
PythonのコードもJavaのもの。
それはジャイアン。
(注:逆も可です)
メモ)マスタとログ
※業務上の個人的なメモです。一般的なことを書いてるわけじゃないので注意!
マスタが更新される度にログテーブルに新しいログが作られる。
そうしないと、マスタが更新されたときに、過去の計算結果が変わってしまう。
トランザクションデータは最新のログと常に紐付く。
ログテーブルのカラムの値を直接変更しちゃダメ。それは事実を改竄すること。
モデルの第2引数は値を入れる先を指定する。
もし、値を入れる先がnullの場合、自動的にObjectContext内に
DataObjectが作られてそこに値を入れる。
(自動で作られると知らずにCommitChanges()で嵌る)
アノテーション@Injectはただの目印。
Pageをnewするときに
@Inject
ObjectContext context;
を見つけたら、ObjectContextName("hoge")で指定した名前でObjectContextを作る(ように作ってある)。
現状、Daoに@Injectを付ける意味はあまり無い。
取り急ぎここまで。
@ObjectContextName("Hoge")
一連の遷移のあるページ間でObjectContextNameが微妙に違ったために
context.commitChanges()が正しく機能しないバグで嵌りました。
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
新カテゴリ「チラ裏」
例えば、プログラムに関する知識がまっさらな状態=すべてがわからない状態の時に
とりあえずJavaでHello 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