ヌーラボさんの事務所移転お披露目会に行ってきました

福岡の元気なソフトウェア開発会社ヌーラボさんの事務所移転お披露目会に行ってきました。

エレベータから出るとカンパニーカラーのグリーンで出迎えてくれます


ホールのカッコいいインテリアウォッチ


ホールと通路のパーテション

その他いろいろと、写真で紹介したいのですがPマークがあるのでww

お披露目会は豪華バイキングビュッフェとこの日のために用意してくれてたビールサーバーとドリンク。そしてなんと取締役(アガッティーノとタバッティーノ)参加のセッションで大盛り上がりでした。

この日はバックログの新機能リリース日もあり、お披露目会ありと忙しそうでしたが、両方ともコンプリートカットオーバーでさすがというべきプロの仕事っぷりでした。
おつかれさまでした。

100冊目に読んだ本がとても素晴らしかった。「奇跡のリンゴ」

去年の9月、唐突に「1日1冊!1年で365冊の本を読むぞ!!」と奮起し、やっと100冊目に到達。。。。
目標には到達できそうにないが、100冊目にとても素晴らしい本に出会えた。

奇跡のリンゴ―「絶対不可能」を覆した農家・木村秋則の記録

これは、絶対にお勧めです!周りの友人に是非とお勧めしまくっています!!

以下レビュー

木村さんの行動やその結果によって、

多くの人に「大切なこと」を気づかせてくれたのは紛れもない事実であり、本当に素晴らしいと思う。

また、思わず読者にのめり込ませる著者の才能も、木村さんの魅力を伝える十分なものだと思う。

この本が僕に気づかせてくれたことは、

物事は、ひとつの視点だけでなく、俯瞰的に見て物事を判断することが必要だということ。

そして、

どんなに時代が進んでも、

どんなに技術が発達しても、

どんなに豊かになっても

自然の本質は変わらない。

本来のあるべき姿に気づくことが大切だとこうことだ。

日本では、農業という分野に再びスポットライトが浴びはじめている。

そんな時代だからこそ

「自然の手伝いをしてその恵みを分けてもらう」という農業の大切さを学びました。

また、著者も記しているように

「木村から聞いた話を、すべて書き記すには、とても1冊や2冊の書物では足りない。。。」

本書では、読者を惹きつけるためのストーリーが色濃かったが、

本書を読んで、自然栽培に少しでも興味を持った読者に対して、

今度は木村さんから引き出したすべてを記してくれることを期待しています。

本書は私にとても良いこと教えてくれた。ぜひ周囲の友人全員に奨めたい1冊であります。

奇跡のリンゴ―「絶対不可能」を覆した農家・木村秋則の記録
石川 拓治 NHK「プロフェッショナル仕事の流儀」制作班
幻冬舎
売り上げランキング: 302
おすすめ度の平均: 4.5
5 本書に出会えたことに感謝!!
5 自分の「ものさし」が大きく変わる1冊の本
5 リンゴだけで終わらない
4 なんだか、すごい
5 『りんごのおじさん』は実在の人物です。 木村秋則さんの記録

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日のリリースですごいことに

先日、僕が愛用するBacklogを開発、運営しているヌーラボさん主催の「Backlog開発者とユーザーの集い@福岡」に行ってきました。

ここでちょっとバックログとは

バックログ

概要だよ
  • プロジェクト管理ができる
  • ビジネスコミュニケーションも円滑
  • 開発者ユーザでだけでなく、様々なタスクを抱える業種に対応
  • 開発者にうれしいガントチャート・バーンダウンチャート機能
  • 親近感のあるデザインで使っていると和む!!
  • セキュリティも安心
  • ASPで対費用効果もわかりやすい

ほかにもいろいろありますが、ざっくりこんな感じです。

んで、集いはどんなだったの

8月3日にバックログのリリースがあるとのことで、そのリリースで追加される機能は

今回の目玉は「携帯対応」じゃないでしょうか。
携帯で見れたらいいな〜と常々思ってたんですが、2009年夏遂にビックリリースです。

新機能のプレゼンその1


新機能のプレゼンその2


がやがやフリースペースミーティング(ブレスト?)

データベースビューで子階層が表示されないとき

SAStrutsのプロジェクトを作成後に、僕がよくやるミスのパターン。

データベースビューで子階層が表示されない

SAStrutsのプロジェクトを作成後、S2JDBCを設定して「さ〜マスタ作るぞ!!」と意気込んでデータベースビューのプロジェクトをクリック。
しかし、押せども押せども子階層が表示されない。。。
そう、そんなときはJDBCドライバがあやしいです。

そのプロジェクト、H2以外のDBを使おうとしてませんか?

SAStrusプロジェクト初期にパスが通っているのはあくまでH2のJDBCのみです。MySQLPostgreSQLなどH2以外のDBを使う場合はJDBCドライバが必要なのでクラスパスってあげてください。

直接jarをセットする場合

1.使用するDBのJDBCドライバをゲット
2.プロジェクトの「/src/main/webapp/WEB-INF/lib」以下にコピー
3.プロジェクトの「プロパティ」⇒「Javaのビルドパス」にてセットしたドライバを指定

mavenの機能で設定する場合

1.使用するDBのdependencyをpom.xml追記
2.mavenコマンド打つ。もしくはplugin入れてるなら更新する

これでデータベースビューのプロジェクトをクリックしたら、ちゃんと子階層が見れます。

ちなみに、ドライバなどが無くて開かない場合はeclispeのワークスペースいかにある.metadata/.logに何かしらのエラーがアウトプットされてますので、それもご参考に。。。。


ん?そもそもJDBC指定し忘れるようなそんなポカミスしない??それはすんません。

営業用の備忘録ブログはアメブロへ〜

営業テーマのブログをアメブロに作りましたとです。

営業とはハートなり

はてなの方に書こうかと思ったんだけど、なんだか自分のテーマ違いかなと思ったんで。。。

とは言ったものの、このはてなのブログもしっかりとしたテーマを持ってるわけではないんだけどね。敢えてテーマを付けるとしたらWebアプリの備忘録かな。。

携帯の絵文字変換ライブラリを使ってみて

PHPの携帯の絵文字対応ライブラリはいくつか公開されているのがあるが、使ってみた感じ、絵文字変換ライブラリ HTML_Emojiがとても使いやすかったな〜。

ほかに探してみたライブラリはこんなのがありました。
携帯絵文字変換スクリプトをPHPで作ってみた。
PHP版 携帯絵文字変換ライブラリ2008(Ver.8)

今回これは使ってないけど、使い方によってはすごく重宝しそうだな〜と思った。
絵文字データベースと相互変換マッピングデータベースのJSONファイルを公開します。

あと、絵文字だけではないが文字コードすごくハマりました。。
PCサイトと携帯サイトのシステムなんだけど、これがしまったことに文字コードがそれぞれ以下のような設定で、Shift_JISUTF-8の相互間のエンコードですごくタイヘンだったのです。

それぞれの文字コードはこんな構成

PC:Shift_JIS
携帯:Shift_JIS
DB:UTF-8

そもそも、PCサイトは文字コードUTF-8だろうという僕の思い込みがハマった原因でもあるんですが。。。

参考サイト

文字コードの変換