エンタープライズギークス (Enterprise Geeks)

企業システムの企画・開発に携わる技術者集団のブログです。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。

Akkaで始める並行処理(4) - Propsの使用方法とAskパターン

今回はアクターの生成で用いるPropsの詳細と、Askパターンについて解説する。 なお、今回からサンプルコードは主に Scala を用いる。 コンストラクタ引数を持たないアクターの生成 Propsはアクター生成時に用いるオブジェクトで、アクターの型やアクター生成…

AWS Lambdaにおける「ステートレス」なキャッシュ利用

AWS Lambda は、AWSが提供するイベントドリブンなプログラム実行環境であり、昨今ではサーバーレスアーキテクチャの実現手段として注目を集めている。 AWSの公式ドキュメントによると、AWS Lambda の関数はステートレスな実装にする必要がある。一方でステー…

Akkaで始める並行処理(3) - アクターの基本 (Java編)

前回の記事では、Scala による Akka の基本的なサンプルプログラムを紹介した。 Akka は Scala と Java それぞれに対応した API を提供している。 今回は、前回 Scala で作成したサンプルプログラムの Java 版を紹介する。 サンプルプログラムの全体構成を以…

「いまさらアジャイル巡業 in Tokyo 2016」で講演

11/19(土)にアジャイルプロセス協議会が主催する「いまさらアジャイル巡業 in Tokyo 2016」が開催された。あいにくの雨だったが、40名近くの人が参加した。また、この日は会場が株式会社ドワンゴの会議室だったこともあり、ニコニコ生放送での同時配信も行っ…

Atlassianユーザグループで「Bitbucket を使用したコードレビュー改善事例」を発表

9/27(火)に第19回 Tokyo Atlassian ユーザグループ(AUGJ)のイベントが開催された。 そこでは、ウルシステムズの伊藤が、担当しているプロジェクトにおけるコードレビューの事例を発表した。 augj.connpass.com Atlassian ユーザグループは、アトラシアンユ…

Akkaで始める並行処理(2) - アクターの基本 (Scala編)

前回は、Akka と アクターモデルの概要について説明した。 今回は、2つのアクター間でメッセージを交換する基本的なプログラムを紹介する。 今回のサンプルプログラムでは、Scala を用いる。 この連載では主に Scala によるプログラムを扱うが、次回は Java …

Akkaで始める並行処理(1) - アクターモデルとAkkaの概要

概要 近年、コンピュータの CPU はマルチコアが当たり前になった。マルチコアを使うにはマルチスレッドプログラムを扱う必要がある。 また、アプリケーションでは Web サービスなど複数のネットワーク通信を使用することが多くなっている。通常ネットワーク…

XP祭り2016でエンタープライズへのアジャイル開発の導入事例を講演

9/24(土)にXP祭り2016が早稲田大学西早稲田キャンパスで開催された。雨の中多くの方が参加していて、現在でもXPの熱量は冷めていないことを実感した。ウルシステムズの吉原の講演では、エンタープライズへのアジャイル開発の導入事例を紹介した。 今回のXP祭…

Cloud9の概要

Cloud9はいわゆるクラウドIDEである。ブラウザからクラウド上の開発環境を操作して開発できる。ローカルマシンに開発環境を構築せず、ブラウザだけあれば開発を始められるので非常に手軽である。先日(2016/7/14)、Amazonが買収したニュースが発表されてい…

JavaEE7をはじめよう(最終回) - CDI 拡張機能による独自スコープの作成

今回は Java EE 7 連載の最終回として、CDI の拡張機能を紹介する。 CDI は拡張ポイントを提供して独自の拡張ができるようにしている。具体的に可能なのは以下のようなことである。 独自スコープを追加する CDI Beanでないクラスを CDI Bean として登録し、…

DDD超入門(後編) - Domain-Driven Designの適用Step

前編ではDDDの概要についてふれたが、後編ではDDDの適用Stepを3つのStepに分けて紹介する。 まずStep1として、アプリケーションに登場しうる概念を抽出してドメインモデルで表現する。 次にStep2として、各ドメインの概念を深掘りしてソフトウェアとしてどう…

Nexus(大規模スクラム開発)の概要

Nexusとは Nexusはスクラムを開発したKen Schwaberが2015年に発表した大規模スクラム開発の手法である。言うまでもなく、スクラムはXPと並んで最も有名なアジャイル開発手法である(→Nexusの公式サイトへ)。 Nexusはスクラムを大規模開発向けに拡張している…

DDD超入門(前編) - Domain-Driven Designの概要

DDD

今回から2回に分けて、Domain-Driven Design(ドメイン駆動設計。略してDDD)を紹介する。 DDDとは、Eric Evans氏が2000年代初頭から提唱しているソフトウェア設計手法で、機能中心ではなくドメイン(ビジネス上の関心領域)に設計の重心を置いたオブジェク…

JavaEE7をはじめよう(28) - Concurrency Utilities for Java EE (後編)

前回の記事では Concurrency Utilities for Java EE のManagedExecutorServiceによる並行処理の例を紹介した。 今回はManagedScheduledExecutorServiceについて解説する。 ManagedScheduledExecutorServiceのサンプル この仕組みは、以前の記事で紹介した1分…

エンタープライズアジャイルで成功するために必要なこと

少し前の話になるが、今年の4月15日に品川で開催されたエンタープライズアジャイル勉強会で、ウルシステムズの河野が講演を行った。 エンタープライズアジャイル勉強会は、企業システムへのアジャイル開発の適用推進を目的とした勉強会で、この分野に取り組…

ニュースになったディープラーニング関連の論文を紐解く

2012年あたりから、急激にディープラーニング関連の驚くべきニュースを目にする機会が増えた。たとえば以下のようなものである。 2012年: Googleのコンピュータが自動的に猫を認識できるようになった 2012年: 画像認識コンペティションでディープラーニング…

JavaEE7をはじめよう(27) - Concurrency Utilities for Java EE (前編)

今回から2回に分けて Concurrency Utilities for Java EE を紹介する。今回は前編として、Concurrency Utilities for Java EE の概要と、アプリケーションサーバー側で管理・提供するスレッドプールの1つであるManagedExecutorServiceを紹介する。 Java SE …

Thymeleaf3 の fragment expressions で View の共通化を促進する

2016年5月に、 主に Spring MVC で使われるテンプレートエンジンである Thymeleaf のバージョン3がリリースされた。 (Thymeleafの本家サイトはこちらを、変更点の一覧はこちらを参照のこと。) このバージョンの主な変更点としては、以下のものが挙げられる…

JavaEE7をはじめよう(26) - Bean ValidationとJPAの連携

前回は Bean ValidationのListとgroupsを使って、複雑な制約条件を記述する方法を紹介した。今回は Bean Validation を組み込んだフレームワークの例として、JPA での使用例を紹介する。 JPA では、エンティティクラスに制約アノテーションを設定することで…

いまさらアジャイル巡業 in 広島

2016年3月12日に広島で「いまさらアジャイル巡業 in 広島」が開催された。 いまさらアジャイル巡業とは、アジャイルプロセス協議会が各地で行っている無料の勉強会である。松山、福岡、石川など全国各地で実施してきたが、今回はウルシステムズが企画・運営…

JavaEE7をはじめよう(25) - Bean Validationで複雑な条件を記述する

前々回と前回の記事では、Bean Validation の基本的なアノテーションの使用方法と、カスタムアノテーションの作成方法を紹介した。基本的にこれらは、1つの Bean に対して共通のバリデーションを定義するものである。 今回は、1つの Bean に対して複数の制約…

JavaEE7をはじめよう(24) - Bean Validationでカスタム制約を作る

Bean Validation では独自のバリデーションを行うカスタム制約を作成できる。今回はカスタム制約を作成する方法を紹介する。 カスタム制約は以下の2つの方法で作成可能だ。 既存の制約を組み合わせる。 独自のバリデーション処理を作成する。 方法1:既存の…

JavaEE7をはじめよう(23) - Bean Validationの基本

今回から数回に分けて、Bean Validation を紹介する。 Bean Validation(JSR-303)は JavaBeans のバリデーションを行う仕組みである。Java EE6 から追加され、Java EE7 でのバージョンは1.1である。 Bean Validationとは Bean Validation は、JavaBeans の…

JavaEE7をはじめよう(22) - WebSocket クライアント API

前回の記事までは、WebSocket のサーバー側の実装例を中心に紹介し、クライアント側の実装は JavaScript を利用してきた。 しかし、Java EE の WebSocket API はクライアント用の API も備えている。そのため、このクライアント用 API を使用すれば、ブラウ…

JavaEE7をはじめよう(21) - WebSocketによるプッシュ通信とCDIのイベント通知

前回までは、WebSocket を使ってクライアントからのリクエストに対して応答を返す方法を中心に解説してきた。 WebSocket ではクライアントとサーバーで相互通信を行えるため、クライアントからのリクエストを契機にするだけでなく、サーバー側から任意のタイ…

JavaEE7をはじめよう(20) - WebSocket - デコーダとエンコーダ

前回の記事では WebSocket の基本的な実装方法を示した。 WebSocket を用いて本格的なアプリケーションを作る場合、メッセージの送受信をどのように行うかが課題となる。WebSocket には、HTML の FORM のように、構造的なデータを送る仕組みはない。このため…

Andrew Ng先生の機械学習講義を解説する勉強会資料を公開

シリコンバレーの有名大学であるスタンフォード大学で、Andrew Ng先生の教える機械学習の講義が人気を集めている。この講義は形を変え、courseraという無料のWeb上オンラインコースとしても受講でき、ここ日本でも機械学習の勉強がしたい人達の間でも人気の…

JavaEE7をはじめよう(19) - WebSocketの基本

今回から数回に分けて、 Java EE7 で追加された機能の1つである WebSocket の解説を行う。 WebSocket はクライアント(ブラウザ)とサーバー間で相互通信を行うためのプロトコルで、1つのコネクションを使ってブラウザとサーバーが何度もメッセージの送受信…

JavaEE7をはじめよう(18) - CDI インターセプターとステレオタイプ

以前の記事 で、 Java EE7から追加された @Transactional による宣言的トランザクションについて解説した。その中で、glassfish4.1 では、ロールバック時に根本原因がわからないという不具合があることを述べた。 また、その対策として例外ログを出力するイ…

Java8超入門 - for文の代わりにStreamを使おう(3)

前回の記事では、Stream APIのfilterメソッドを使って、集合データから条件に合致する要素を抽出する方法を紹介した。 今回は集合データ内の要素を変換するmapメソッドを紹介する。 これまでと同様に、シンプルなPersonクラスを利用する。 public class Pers…

Spring特別勉強会レポート(後編)

前回は Pivotal社に所属するSpring コントリビュータの Josh Long 氏によるプライベートセッション「Bootiful Application」のうち、マイクロサービスと Spring Boot の内容を紹介しました。 今回は、後半部分である Spring Cloud についてのレポートです。 …

JavaEE7をはじめよう(17) - CDIのユニットテスト

CDIを使用したクラスのユニットテスト、すなわちJUnitなどのテストツールを使用した自動テストはどのように行うべきだろうか。 今回はユニットテストの方法について紹介する。 テスト対象のクラス 今回テストを行う対象は、前回の記事で紹介した、DAOを通じ…

Spring特別勉強会レポート(前編)

2015年9月2日、Spring FrameworkコントリビュータのJosh Long氏がウルシステムズを電撃訪問し、プライベートセッションを開催するというサプライズがありました。日本Springユーザー会のフォーラムに合わせて来日した折、過密なスケジュールのすきまを縫って…

JavaEE7をはじめよう(16) - CDI トランザクション

Java EE7から、CDI Beanに対する宣言的トランザクションが使用可能になった。 宣言的トランザクションの使用を宣言しておくと、メソッドの開始と同時に暗黙的にトランザクションを開始し、メソッドの終了時にトランザクションをコミットまたはロールバックで…

広島Javaユーザグループ「概念モデリング再入門 + DDD」勉強会

2015年8月3日に広島Javaユーザグループにて、弊社の河野 正幸が「概念モデリング再入門 + DDD」と題して講演を行った。 開催概要はこちらから、また当日の会場の様子は以下からどうぞ。 講演の内容は、概念モデルの作成手順と考え方に加えて、概念モデルをベ…

JavaEE7をはじめよう(15) - CDI 会話スコープ

前回までで、CDIの基本的な仕組みを紹介した。今回は、CDIのスコープの中でも特殊なスコープである、会話スコープ(@ConversationScoped) について解説する。 @RequestScoped, @SessionScopde, @ApplicationScoped はServletのスコープにもあるので、多くの方…

今だからこそ、省メモリープログラミング

富豪的プログラミングが当たり前となった昨今、メモリーを節約するプログラミング技術は話題にならなくなって久しい。 しかし、一方で省メモリーなプログラミング技法が生きるフィールドは広がりつつある。たとえば以下の様な状況だ。 巨大データを扱いたい…

JavaEE7をはじめよう(14) - Producerの効果的な利用方法

前回の記事では、インジェクションするクラスの候補が複数ある場合の様々な対処方法を紹介した。 今回は、Producerの効果的な利用方法を2つ紹介する。 リソースパラメータをProducerフィールドで一元管理する まずはProducerフィールドを使って、データソー…

JavaEE7をはじめよう(13) - インジェクション候補が複数ある場合の対処方法

前々回と前回の記事で、CDIの基本的な部分であるスコープとインジェクションについて解説した。 今回は、インジェクション候補のクラスが複数ある場合の様々な対処方法を紹介する。 実装や継承関係がある場合のスコープ指定 実装や継承関係がある場合は、実…

D3によるデータビジュアライゼーションの勉強会資料を公開

少し前の話になるが、2013年の9月にウルシステムズ社内でD3によるデータビジュアライゼーションの勉強会を開催した。せっかくなので、ここで資料を公開する。 D3を使うと、例えば以下のリンク先にあるように、ブラウザー内でインタラクティブに動作するグラ…

JavaEE7をはじめよう(12) - CDI Beanのインジェクション

前回は、CDIの定義方法を解説した。 今回は、CDI Beanをインジェクションする方法を紹介する。 インジェクションが可能なクラスの種類 インジェクションを行うには、@Injectアノテーションを使用する。 @Injectが使用可能なクラス、すなわちCDI Beanをプロパ…

JavaEE7をはじめよう(11) - CDI Beanの定義

前回の記事では、CDIの概要とインジェクションのサンプルを紹介した。 今回から2回に分けて、CDIの基本的な利用方法を紹介する。前半の今回は、CDI Beanの定義で指定するスコープについて解説する。 CDI Beanに指定できるクラス CDI Beanに指定できるクラス…

Java8超入門 - for文の代わりにStreamを使おう(2)

だいぶ間が空いてしまったが、Java8の超入門記事の第2回である。 前回の記事では、forループの代わりにStream APIのanyMatchメソッドを使って、コレクション全体に対する条件判定を行う方法を紹介した。 今回は、コレクションから条件に該当する要素を抽出す…

JavaEE7をはじめよう(10) - CDIの概要

今回から数回に分けてCDI(Contexts and Dependency Injection)を紹介する。 CDIは Java EE 6から追加されたDI(Dependency Injection、依存性注入)のための仕様である。 Java EE 7におけるCDIのバージョンは1.1であり、またJava EE 7から CDIはデフォルト…

JavaScriptでLispインタープリターを作ろう(8) ~ローカルスコープの導入~

前回の記事で関数を記述する機能が導入できた。しかしながら、現状のインタープリターにはローカルスコープが無く、変数が関数内に閉じていないために課題も残った。今回は、上記の課題を解決するためにローカルスコープを導入する。 ローカルスコープとは …

広島Javaユーザーグループ設立

2015年4月25日に広島Javaユーザグループ(広島JUG)が誕生した。 (広島JUG代表 上司さん) これまで広島にはJavaコミュニティが無く、「なぜ広島にはJavaユーザーグループが無いの?」と思っていた一人として、第1回立ち上げイベント「誕生」(https://hiros…

JavaEE7をはじめよう(9) - JPA TIPS

今回はJPAのまとめとして、JPAをより良く使う方法や知っておくとよいトピックについて述べる。 1. テーブル定義とエンティティクラス定義の整合性を保つ仕組み 以前の記事で紹介したように、JPAではスキーマジェネレーションを用いて、エンティティクラスか…

Raspberry pi の勉強会資料を公開

この3月にウルシステムズ社内にてRaspberry piの勉強会を開催した。せっかくなので、ここで公開する。 そもそも Raspberry pi に関心を持った理由は、自分の子ども達(5歳と0歳)に、より良いコンピューター体験をさせたいと思ったからである。 近年のGoogle…

JavaEE7をはじめよう(8) - JPAでのID定義

前回までJPAの使用方法を解説してきた。今回は、JPAを利用する上で、テーブルの主キーおよびエンティティのIDの設計で考慮しておくべき事柄を説明する。 複合主キーの定義方法 IDの定義方法を検討をするために、まずJPAでの複合主キーの定義方法を解説する。…

JavaScriptでLispインタープリターを作ろう(7) ~関数の導入~

前回の記事で、Lispインタープリターは「順次・反復・分岐」のすべての制御構文をサポート出来るようになった。今回は、いよいよ関数を記述する機能を導入する。 「仮引数」と「実引数」 関数を記述する機能を導入する前に、JavaScriptを例にして、関数につ…