ヌーラボさんの事務所移転お披露目会に行ってきました
福岡の元気なソフトウェア開発会社ヌーラボさんの事務所移転お披露目会に行ってきました。
100冊目に読んだ本がとても素晴らしかった。「奇跡のリンゴ」
去年の9月、唐突に「1日1冊!1年で365冊の本を読むぞ!!」と奮起し、やっと100冊目に到達。。。。
目標には到達できそうにないが、100冊目にとても素晴らしい本に出会えた。
これは、絶対にお勧めです!周りの友人に是非とお勧めしまくっています!!
以下レビュー
木村さんの行動やその結果によって、
多くの人に「大切なこと」を気づかせてくれたのは紛れもない事実であり、本当に素晴らしいと思う。
また、思わず読者にのめり込ませる著者の才能も、木村さんの魅力を伝える十分なものだと思う。
この本が僕に気づかせてくれたことは、
物事は、ひとつの視点だけでなく、俯瞰的に見て物事を判断することが必要だということ。
そして、
どんなに時代が進んでも、
どんなに技術が発達しても、
どんなに豊かになっても
自然の本質は変わらない。
本来のあるべき姿に気づくことが大切だとこうことだ。
日本では、農業という分野に再びスポットライトが浴びはじめている。
そんな時代だからこそ
「自然の手伝いをしてその恵みを分けてもらう」という農業の大切さを学びました。
また、著者も記しているように
「木村から聞いた話を、すべて書き記すには、とても1冊や2冊の書物では足りない。。。」
本書では、読者を惹きつけるためのストーリーが色濃かったが、
本書を読んで、自然栽培に少しでも興味を持った読者に対して、
今度は木村さんから引き出したすべてを記してくれることを期待しています。
本書は私にとても良いこと教えてくれた。ぜひ周囲の友人全員に奨めたい1冊であります。
S2JDBCを使った再帰構造テーブルのデータを取得する
S2JDBCって再帰構造テーブルのデータを取得できるみたいでなのでやってみます。
親子構造を持つデータで、「業種」なるものを例にとってまずはテーブル作成から
テーブル
--シーケンス作成 create sequence "category_seq" start 100; --テーブル作成 CREATE TABLE category ( id integer NOT NULL DEFAULT nextval('category_seq'::regclass), parent_id integer, "name" character varying(100), version_no integer, CONSTRAINT category_pkey PRIMARY KEY (id), CONSTRAINT fk_category_recursion FOREIGN KEY (parent_id) REFERENCES category (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )
再帰構造でデータを取得するためにやることは、エンティティとサービスにちょいと仕込んであげるだけでOKです。
Entity
親エンティティへのマッピングを追加します。
@Entity public class Category { @Id @GeneratedValue public Integer id; @Column(name="parent_id") public Integer parentId; public String name; // 親データとなるエンティティをマッピング @ManyToOne public Category parent; }
Service
実際S2JDBCをコールするサービスでは、親エンティティとしてマッピングしたプロパティをjoinします。
@Override public List<Category> findAll() { return super.select().leftOuterJoin("parent").getResultList(); }
こだけで、カテゴリーサービスのfindAllをコールすると、親エンティティがセットされた状態のリストが取得できます。
ちなみに発行しているSQLは1回のみで、あとはS2JDBCの実装クラス(org.seasar.extension.jdbc.query.AutoSelectImpl)内にて
エンティティに設定しているマッピング情報を元にいろいろとやってくれているみたいです。
ルート(親)、もしくは条件指定するとリレーションのプロパティにセットされない?
しかし、どうやらwhere句などを指定するとどうもプロパティにセットされずに再帰構造にはならないみたいですね。
これは、エンティティに格納するハンドラが、条件が指定されているとされていない場合にそれぞれ違うインスタンスが指定されるからみたいです。
***selectAllにて条件指定なしの場合
org.seasar.extension.jdbc.handler.BeanListAutoResultSetHandler
***selectAllにて条件指定あり、もしくは外部SQLファイルの場合
org.seasar.extension.jdbc.handler.BeanListResultSetHandler
ま〜、条件指定すると、きれいな再帰構造を構成するのに情報が欠落してる可能性とかあるからかのかな、
上記の件に関しては僕の検証が足りなかったみたいで、Where句を使用してもBeanListAutoResultSetHandlerでハンドリングされます。
再帰SQL
それならばと、SQL99にて導入されている再帰SQLを使えばよいではないかと、ためしにやってみる。
再帰SQL(src/main/resources/sql/category/findByRoot.sql)
WITH RECURSIVE tmp_category as ( select * from category where id = /*id*/100 UNION ALL select category.* from tmp_category, category where category.parent_id = tmp_category.id ) select * from tmp_category;
Service
実際S2JDBCをコールするサービスでは、親エンティティとしてマッピングしたプロパティをjoinします。
public List<Category> findByRoot(Integer id) { Map<String, Object> param = new HashMap<String, Object>(); param.put("id", id); return this.jdbcManager .selectBySqlFile(Category.class, "sql/category/findByRoot.sql", param) .getResultList(); }
結果としてはマッピングはされていなかったです。
SQL自体は問題なかったんだけど、格納時のハンドらがBeanListResultSetHandlerになっていた。
なんとかして再帰SQLでマッピングを。。。
追加
org.seasar.extension.jdbc.query.AutoSelectRecurrenceImpl
これは書くと長すぎるので省きます。
(ベースはorg.seasar.extension.jdbc.query.AutoSelectImplをコピってます)
修正
以下のそれぞれのクラスに必要なメソッドを追記します
org.seasar.extension.jdbc.JdbcManager
/** * 再帰データの検索を作成します。 * * @param <T> * 戻り値のベースの型です。 * @param baseClass * ベースクラス * @return 自動検索 */ <T> AutoSelectRecurrence<T> fromRecurrence(Class<T> baseClass);
org.seasar.extension.jdbc.manager.JdbcManagerImpl
public <T> AutoSelectRecurrence<T> fromRecurrence(Class<T> baseClass) { return new AutoSelectRecurrenceImpl<T>(this, baseClass).maxRows(maxRows) .fetchSize(fetchSize).queryTimeout(queryTimeout); }
jp.co.hoge.service.AbstractService
/** * 再帰構造データを取得する際に使用するセレクタです * * * @return AutoSelectRecurrence 再帰取得用セレクタ */ protected AutoSelectRecurrence<ENTITY> selectRecurrence() { return jdbcManager.fromRecurrence(this.entityClass); }
これで何とか親情報のIDを指定して、再帰構造でデータを取得できるようになったが、
JdbcManagerやJdbcManagerImplなどに手を加えることになってしまった。
参考サイト
バックログが8月3日のリリースですごいことに
データベースビューで子階層が表示されないとき
SAStrutsのプロジェクトを作成後に、僕がよくやるミスのパターン。
データベースビューで子階層が表示されない
SAStrutsのプロジェクトを作成後、S2JDBCを設定して「さ〜マスタ作るぞ!!」と意気込んでデータベースビューのプロジェクトをクリック。
しかし、押せども押せども子階層が表示されない。。。
そう、そんなときはJDBCドライバがあやしいです。
そのプロジェクト、H2以外のDBを使おうとしてませんか?
SAStrusプロジェクト初期にパスが通っているのはあくまでH2のJDBCのみです。MySQLやPostgreSQLなどH2以外のDBを使う場合はJDBCドライバが必要なのでクラスパスってあげてください。
携帯の絵文字変換ライブラリを使ってみて
PHPの携帯の絵文字対応ライブラリはいくつか公開されているのがあるが、使ってみた感じ、絵文字変換ライブラリ HTML_Emojiがとても使いやすかったな〜。
ほかに探してみたライブラリはこんなのがありました。
携帯絵文字変換スクリプトをPHPで作ってみた。
PHP版 携帯絵文字変換ライブラリ2008(Ver.8)
今回これは使ってないけど、使い方によってはすごく重宝しそうだな〜と思った。
絵文字データベースと相互変換マッピングデータベースのJSONファイルを公開します。
あと、絵文字だけではないが文字コードすごくハマりました。。
PCサイトと携帯サイトのシステムなんだけど、これがしまったことに文字コードがそれぞれ以下のような設定で、Shift_JISとUTF-8の相互間のエンコードですごくタイヘンだったのです。