メディアフォース 開発者ブログ

株式会社メディアフォースの開発者による非公式ブログです。

JavaSEでCDIのObserversを試してみる

利用方法

今回は、JavaSEで使ってみたいと思います。
話し変わりますが、JavaEE7 から色々なライブラリの仕様取り込んだりしてEJBが駆逐されつつあっていい感じに見える。

事前準備

  • お好みでeclipseなど。
  • Weldを落としてくる。
    • ここ からダウンロードできる。
    • Mavenの場合
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-core</artifactId>
    <version>2.4.0.Final</version>
</dependency>
  • パスの通っている場所にMETA-INFディレクトリおよび空のbeans.xmlを作る。
  • 今回使ったプロジェクトはこちらにうp github.com
  • src配下にMETA-INFディレクトリ作ってあるけど良くない気がする。(サンプルだしまぁいいか)

何ができるんじゃろか

@Observers アノテートされた引数の型とEventの型が一致した場合に勝手に通知してくれるっぽい。

試してみる

java:ObserverSample.java(通知用)

public class ObserversSample {
	@javax.inject.Inject
	javax.enterprise.event.Event<User> event;
    
	public static void main(String[] args) {
		Weld weld = new org.jboss.weld.environment.se.Weld();
		WeldContainer container = weld.initialize();
		ObserversSample obsSample = container.instance().select(ObserversSample.class).get();

		obsSample.run();
	}

	public void run() {
		this.event.fire(new User().name("山田").age(30));
	}
}


java:User.java

public class User {
    //単なるPOJOなのでgetter/setterは省略
	private String name;
	private int age;
}

java:UserEventListener.java

public class UserEventListener {
	public void fire(@Observes User user) {
		System.out.println("Event Fire:" + user.getName());
	}
}

実行すると

Event Fire:山田

が出る。Eventを介して見事に通知された。楽すぎる・・・。

通知先を指定する

せっかくなので、InsertイベントとUpdateイベントで分けたい。
今のままだと、Insert用UserクラスとUpdate用Userクラスを作るか、Userクラスの中でイベントタイプを持つかしないとならないのでちょっとイケてない感がある。

ということで、Qualifier を作る。

アノテーションなので @interface で定義する。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Insert {}

Eventに @Insert アノテーションを付ける。

public class ObserversSample {
	@Inject
	@Insert
	Event<User> insertEvent;

	public void run() {
		this.insertEvent.fire(new User().name("山田").age(30));
	}
}

EventListener の引数に @Insert を付与する。

public class UserEventListener {

	// @Insertあり
	public void insert(@Observes @Insert User user) {
		System.out.println("Insert:" + user.getName());
	}

	// @Insert無し
	public void any(@Observes User user) {
		System.out.println("Any:" + user.getName());
	}
}

実行してみる

Insert:山田

@Insertのメソッドのみが通知され、@Insertなしは通知されない。

通知されたメソッドで例外が発生すると、呼び出し元に例外がthrowされてそれ以降は伝播しないもよう。

キャリアプランを考える ~1. 自分コンセプトを決める~

夏の暑さも落ち着き秋の涼しさも感じられるようになった昨今、いかがお過ごしでしょうか。

9月ともなると就職活動に励む学生が目立ちますね。当社でも数年前から新卒を精力的に受け入れており、最近では中途採用より新卒採用のほうが比率が高くなってきました。

さて、当事業部でも新卒者を受け入れますが、中途採用と違って新卒者はキャリアプランを決めきれてないケースが多く見られます。 就活シーズンということで、キャリアプランについてお話したいと思います。

キャリアプラン

就活生にとって就職とは金銭を稼ぐ手段を得るためのものであると思いますが、学生の期間は20年前後であるのに比べ社会人の期間は40年以上もあります。 是非とも学生のうちからキャリアプランを考えておき有意義な社会人生活を送っていただければと思います。

キャリアプランについてはググれば多々でてきますので、そちらも併せて参照いただくとして筆者個人の定義としては次のように考えてます。

続きを読む

でぶそる(BIハッカソン)開催しました

先週金曜日の話ですが、第二回「でぶそる」を開催しました。

f:id:mf_sol_eai:20160703181743j:plain

Development and Solution を略して「でぶそる」ですが、要はハッカソンです。スケジュールの都合上、一日間の開催となりましたが、非常に濃縮された一日で有意義な時間だったと思います。 第一回目は当事業部内で開催し、テーマは「 DataSpider Servista + kintone」でした。

第二回では事業部 + 当他事業部 + アプレッソさん を招いての合同で開催しました。総勢47名、7チームの大所帯ハッカソンとなりました。テーマは「DataSpider Servista + BI」。 ※いや今思えばよく参加してくれたな... 当事業部ではコアなプロダクトとして、DataSpider Servista を採用していることもあり、開発工数を短くできるEAIツールはハッカソンのお供と化してます。

筆者は企画・運営で参加しており第一回目は開発しなかったのですが、やはり他人のハッカソンを見てると疼いてくるものがあるというか、二回目は耐え切れずに参加してしまいました。

f:id:mf_sol_eai:20160703182228j:plain

f:id:mf_sol_eai:20160703182241j:plain

f:id:mf_sol_eai:20160703182317j:plain 奥でうなだれてる pepper くんがみえますね。導入したばかりで開発環境の整備が間に合わなかったのが残念。

f:id:mf_sol_eai:20160703182524j:plain 開発も終盤、集まって動作確認中の一幕。

f:id:mf_sol_eai:20160703182609j:plain やったぜ

f:id:mf_sol_eai:20160703182649j:plain スマホのカメラを使ったBIに挑戦中

f:id:mf_sol_eai:20160703182740j:plain プレゼン資料も一日の時間内で作成。即興の割にはキレイな作りになってます。 このチームはBIツールとして WebFOCUS を採用してました。

f:id:mf_sol_eai:20160703183020j:plain BIでトイレ問題解決チーム。こちらは Tableau を採用

全7チームの発表を一時間半でこなす過密スケジュールの中、全チームとも素晴らしいプレゼンでした。

その後、全参加者による懇親会を経てでぶそるは終了。参加者の満足気な表情は主催者として嬉しいものがあります。 第三回、予定しておりますので興味のある方は是非ご参加ください!

IT Week 春にお邪魔してきました

f:id:mf_sol_eai:20160516094214j:plain

www.m2m-expo.jp

先週 5/11~5/13 まで東京ビッグサイトにて IT Week 春が実施されていました。 今年も参加させていただきましたが、当事業部は特定の製品やプロダクトをフォーカスしているわけではなく、市場の動向調査という面が強いので出展企業は一通り巡っています。 IT Week は年々規模が大きくなるので、体力的にそろそろ一通りめぐるのがしんどい年齢になってしまいました。 そろそろ体力の有り余ってる若手も同行してもらい、私は最低限の分野だけを見るようにしたいと思います...。

f:id:mf_sol_eai:20160516102533j:plain

IT Week の出展内容は毎年変わるものですが、今年は特に「クラウド」や「IoT」にフォーカスした内容が非常に多かったと思います。2015年はIoT元年とも言われていますが、インフラやサービスが整備されて導入の敷居が下がった2016年では爆発的に広まる兆しを見せています。 センサー類の小型デバイスをはじめ、EC2 などの安価な IaaS、簡単にスマホアプリが作れ運用まで行える PaaS、CRMERPなど業務システムのSaaSといった一連のサービスが全てクラウド上で行えるため、IoTを導入するのにこれほど適した時期はないのではないかと思います。 その分、以前よりもネットワークインフラやセキュリティが課題として浮き彫りになりそうです。

オンプレミスでの運用時はノンストップであることが前提となっていたように思いますが、IaaS などサービスを利用する場合には安価である分、サービスの利用停止時間は必ずしも発生することになります。また、WANを介する以上、専用線やLANと比べて圧倒的に損失率は高くなります。 これからは「ノンストップであること」よりも「ストップや損失を許容できる」システムや運用作りが肝要ではないのかと、そう思います。

当社HPをリニューアルしました

本日、当社HPをリニューアルいたしました。

www.mforce.co.jp

昨今の流行を取り入れまして、レスポンシブ&フラット(ややマテリアル?)デザインのシックな仕上がり。 当社のイメージカラーであるブルーを基調としたカラーリング。 うーん、デザインは悪くない。

PC向け画面

f:id:mf_sol_eai:20160415142145p:plain

スマホ向け画面

f:id:mf_sol_eai:20160415142235p:plain

曖昧な用語を定義することの重要性

IT業界では常に新しいワード*1が生み出され、略され、定義の曖昧な用語が飛び交っている。 例えばソフトウェアにおけるテスト工程名称は単体試験、Unit test(UT)、Program test(PT) など、企業によって異なるケースも多い。 Systemt test(ST)を Product test(PT)と呼ぶこともあったり、略称によっては重複することもあり統一された呼称がない*2、または浸透していないのが現状である。

テスト工程だけでなく、要求分析なのか要件定義なのか、基本設計なのか概要設計なのか、似たようで異なる用語が多すぎる。 統一された用語が定義されているのが無論、ベストではあるのだが工程自体が企業独自のものであり、様々な用語を用いてる以上、統一用語を定義するのは難しい。

そのような状況においては用語の定義と状況の定義が肝要となる。

具体的には以下のようなものだ。

用語 状況 完了時の状態
ユニットテスト(UT) ソースコードメソッド単位試験 メソッドの機能要件が満たせている
結合テスト(IT) データのインプットからアウトプットに対する試験 クラス、モジュール間でデータIOに対する機能要件が満たせている
システムテスト(ST) 画面上からデータの登録など要求に対する機能要件の試験 要求に対する機能要件が満たせている
受け入れテスト(AT) パフォーマンスや負荷など、非機能要件に対する試験 想定ユーザの運用要件が満たせている

日常から様々な略称や用語を用いることが多い業界だが、用語の定義が曖昧であるとコミュニケーションロスにも繋がってしまう。

テスト工程を例としたが、会議の場などで顧客の話、先輩・上司の話が理解できない若手の多くは用語の定義を求めていないことが多いように思う。 企業の風土といえば聞こえは良いが暗黙の了解で決められた用語も多く、同じ職種でも企業が変われば意味が異なる。 コミュニケーションロスを起こさずスムーズに業務を遂行するためにも用語の定義は忘れないようにするべきであると考える。

*1:パズワードとも言う

*2:もしかしたらIPA等で定義されているかも

HULFT IoT先行検証版に申し込んでみた

セゾン情報さんが開発している HULFT IoT の先行検証版が申し込みできるようになってました。 ということで早速当社も申し込みをば。

www.hulft.com

説明を見る限りですと、Agent から Manager への単方向転送を行うための専用ツールみたいなイメージでしょうか。 HULFT といえば堅牢な通信プロトコルで有名ですが、バックエンドにデータ送るにあたって欠損が許されないクリティカルなデータを送るときに有効そう。

DataSpider Servistaとの連携も出来そうなので、クラウドでのIoTバックエンドとして活用が期待できる。が、IoTとなるとトランザクション量が半端じゃないのでそれを捌ききれるのかは気になるところ。