サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
デスク環境を整える
enterprisegeeks.hatenablog.com
Nexusとは Nexusはスクラムを開発したKen Schwaberが2015年に発表した大規模スクラム開発の手法である。言うまでもなく、スクラムはXPと並んで最も有名なアジャイル開発手法である(→Nexusの公式サイトへ)。 Nexusはスクラムを大規模開発向けに拡張しているので、Nexusを知るためにはスクラムを知る必要がある。スクラムは3〜10人程度のスクラムチームがイテレーション開発を運営するためのロール、成果物、イベント(やること)で構成されている。スクラムは単独のスクラムチームの運営を想定している。Nexusはスクラムを複数チームが連携しながらイテレーション開発を行えるように拡張している。 筆者がアジャイルコーチとして顧客を訪問するとよく聞かれることは、「アジャイル開発は1チームだけなのか。複数チームではどうするのか」ということである。スクラムでは1チームは多くても10人程度
前回は、Akka と アクターモデルの概要について説明した。 今回は、2つのアクター間でメッセージを交換する基本的なプログラムを紹介する。 今回のサンプルプログラムでは、Scala を用いる。 この連載では主に Scala によるプログラムを扱うが、次回は Java で同等のプログラムを作成したものを掲載する予定だ。 全てのソースコードは、githubリポジトリにある。 全体の処理の流れ 今回のサンプルでは、親と子の2つのアクターを作成し、以下のように動作させることを目的としている。 親アクターが子アクターにメッセージとして整数値を送信する。 子アクターは親アクターから整数値を受け取ると、その値の2乗した値を親に送り返す。 親アクター(MyApp)と子アクター(SubApp)は、それぞれが独立したタスクを実行するオブジェクトである。 親アクターが、クライアント(ApplicationMai
AWS Lambda は、AWSが提供するイベントドリブンなプログラム実行環境であり、昨今ではサーバーレスアーキテクチャの実現手段として注目を集めている。 AWSの公式ドキュメントによると、AWS Lambda の関数はステートレスな実装にする必要がある。一方でステートレスな実装を追求すると、外部サーバからのデータ取得処理が増え、結果として処理パフォーマンスが悪化することが多い。 本稿では、データの性質に応じたAWS Lambda での状態保持(キャッシュ利用)の可否について考察し、キャッシュに関する実装や運用の一例を示す。 1. Lambda 関数に求められる「ステートレス」の意味 AWSの公式ドキュメンテーションによると、AWS Lambdaの関数は、ステートレスな実装にする必要がある。 コードは必ず「ステートレス」なスタイルで書く必要があります。 ~中略~ 関数をステートレスにするこ
今回から2回に分けて、Domain-Driven Design(ドメイン駆動設計。略してDDD)を紹介する。 DDDとは、Eric Evans氏が2000年代初頭から提唱しているソフトウェア設計手法で、機能中心ではなくドメイン(ビジネス上の関心領域)に設計の重心を置いたオブジェクト指向設計手法の1つである。 前編の今回はまずDDDの概要にふれ、次回は後編としてDDDの適用Stepについて簡単に紹介する。 DDDの前身 DDDは、Martin Fowler氏が以下の書籍『PoEAA(Patterns of Enterprise Application Architecture)』の中で分類している以下の3つのロジックパターンの内「ドメインモデル」の流れをくんでいる。 エンタープライズアプリケーションアーキテクチャパターン 作者: マーチン・ファウラー出版社/メーカー: 翔泳社発売日: 201
前回の記事では、Scala による Akka の基本的なサンプルプログラムを紹介した。 Akka は Scala と Java それぞれに対応した API を提供している。 今回は、前回 Scala で作成したサンプルプログラムの Java 版を紹介する。 サンプルプログラムの全体構成を以下に再掲するが、詳細に関しては前回の記事を参照していただきたい。 今回のサンプルプログラムも、github で公開している。 子アクターの生成 Java 版では、アクターは、抽象クラスのUntypedActorを継承して定義する。 まず、子アクターの定義のうち、staticメンバーのメッセージオブジェクトの定義について示す。 // UntypedActor を継承 public class SubActor extends UntypedActor { // イミュータブルオブジェクトとしてメッセージクラ
Java8で新たに提供されたStream APIの基本をまとめておく。 (今回は並列処理機能については割愛する。) 概要 Stream API はJava8から追加されたAPIであり、高機能な繰り返し処理を記述できる。同じくJava8から追加されたラムダ式の使用を前提としている。 Stream API は次の3つに分類される。 生成処理 (Source) 既存データからStreamを生成する。代表格はListやSetのstreamメソッドだが、Streamインターフェースにも多数の生成用のstaticメソッドがある。 中間操作 (Intermediate Operation) Streamのデータ加工を行う。代表格はfilter, map, flatMapで、他にもlimit, skipなどがある。 終端操作 (Terminal Operation) Streamの全データを一括で別のデー
前編ではDDDの概要についてふれたが、後編ではDDDの適用Stepを3つのStepに分けて紹介する。 まずStep1として、アプリケーションに登場しうる概念を抽出してドメインモデルで表現する。 次にStep2として、各ドメインの概念を深掘りしてソフトウェアとしてどう表現するかにについて紹介する。 最後にStep3でドメイン部品の仕上げとDDDの恩恵ついてふれていく。 Step1: ドメインモデルによる表現 DDDでは機能やユースケースに加えて、その裏に潜んでいる「概念」を抽出する必要がある。そのため、DDDを導入するにあたってアプリケーションに登場しうる概念を整理した「ドメインモデル」がまず必要となる。全体のコンテキストを整理して、該当のドメインモデルを描くことがDDDの最初の1歩となる。 例として、よくある一般的な受注管理の簡単なドメインモデルをあげる。 「顧客」からある「商品」の「注文
前回の記事では、Stream APIのfilterメソッドを使って、集合データから条件に合致する要素を抽出する方法を紹介した。 今回は集合データ内の要素を変換するmapメソッドを紹介する。 これまでと同様に、シンプルなPersonクラスを利用する。 public class Person { private String name; private boolean maleFlag; private int age; public String getName() { return this.name; } public boolean isMale() { return this.maleFlag; } public int getAge() { return this.age; } public Person(String name, boolean maleFlag, int age
概要 近年、コンピュータの CPU はマルチコアが当たり前になった。マルチコアを使うにはマルチスレッドプログラムを扱う必要がある。 また、アプリケーションでは Web サービスなど複数のネットワーク通信を使用することが多くなっている。通常ネットワーク通信は同期処理で行われる。複数のネットワーク通信を同期処理で行うと、通信結果の待ち時間が増えるため処理時間が延びてしまう。処理時間を短縮するためには、通信の非同期化や並列化が必要となる。 マルチコアを使いこなし、かつ複雑なアプリケーションを構築するためには、並行処理を簡単かつ効率的に記述する必要がある。 この連載では、アクターモデルによる並行処理ライブラリ Akka を通して、並行処理を実現する方法を紹介する。 今回はアクターモデルと Akka の概要について述べる。 アクターモデルとは 並列処理を効率的に実現する方法のひとつにアクターモデルが
2016年5月に、 主に Spring MVC で使われるテンプレートエンジンである Thymeleaf のバージョン3がリリースされた。 (Thymeleafの本家サイトはこちらを、変更点の一覧はこちらを参照のこと。) このバージョンの主な変更点としては、以下のものが挙げられる。 HTML5 マークアップの完全サポートにより、整形式XMLで記述する必要がなくなった。 テキストモードサポートにより、CSS、JavaScript やメールなどの任意のテキストフォーマットに適用しやすくなった。 fragment expressions により、共通化したテンプレートに任意の要素を引き渡せるようになった。 本記事では、最後の fragment expressions について解説する。 その理由は、この機能が、筆者が個人的に Thymeleaf の弱点と思っていた部分を大きく改善するものだからで
前々回と前回の記事で、CDIの基本的な部分であるスコープとインジェクションについて解説した。 今回は、インジェクション候補のクラスが複数ある場合の様々な対処方法を紹介する。 実装や継承関係がある場合のスコープ指定 実装や継承関係がある場合は、実際にインジェクションしたい具象クラスにスコープを指定する。 例えば、次のようなインターフェースがあるとする。 public interface SomeIf {} インターフェースや抽象クラスに対してはスコープを指定できないため、SomeIfを実装する具象クラスに対してスコープを指定する。 @RequestScoped public class SomeBean implements SomeIf {} インジェクションの指定は、インターフェースや抽象クラスに対しても行える。次のようにSomeIfに対して@Injectを指定すると、CDIコンテナはS
前回の記事では、インジェクションするクラスの候補が複数ある場合の様々な対処方法を紹介した。 今回は、Producerの効果的な利用方法を2つ紹介する。 リソースパラメータをProducerフィールドで一元管理する まずはProducerフィールドを使って、データソースや永続性コンテキストなどのリソースを効果的にインジェクションする方法を紹介する。 CDIを使用しない場合やJava EE5以前の場合、リソースをインジェクションするには@Resourceや@PersistenceContextのような、目的に合わせたアノテーションを設定する必要がある。これらのアノテーションにはJNDI名のようなパラメータも必要となる。 // JPAのコンテナ管理永続性コンテキスト @PersistenceContext(unitName = "default") private EntityManager e
前回までは、WebSocket を使ってクライアントからのリクエストに対して応答を返す方法を中心に解説してきた。 WebSocket ではクライアントとサーバーで相互通信を行えるため、クライアントからのリクエストを契機にするだけでなく、サーバー側から任意のタイミングで、クライアントにプッシュ通信することも可能である。この仕組みは、時報のように定期的なタイミングで処理を行ったり、株価の更新のように何らかのイベント発生を契機として通知を行う処理に適用できる。 時刻通知アプリケーション 今回のサンプルは、前回の記事で紹介した WebSocket の チャットアプリケーション に含まれている。 内容としては、チャットアプリケーションを使用している全てのクライアントへ1分間隔で現在時刻を通知するというものだ。 上記アプリケーションのページを開いて放置しておくと、1分おきに現在時刻が通知される。(アプ
前回の記事では、JUnit上で動作するJPAのサンプルコードを紹介した。 今回は、前回のサンプルをベースにして、JPAを使う上で重要な機能である永続性コンテキストについて解説する。 永続性コンテキスト JPAは永続性コンテキストというある種のバッファのような仕組みによって、データベースと同期を取っている。 この仕組みを理解しておかないと、不可解な挙動に思えてしまうことだろう。 登録・更新時の動作 例えば、以下のコードを実行してみる。 @Test public void 永続化コンテキスト(){ Team t1 = new Team(); t1.setName("チームA"); EntityManager em = getEm(); em.getTransaction().begin(); // 永続化コンテキストへの登録 em.persist(t1); t1.setName("チームB")
今回から数回に分けて、Bean Validation を紹介する。 Bean Validation(JSR-303)は JavaBeans のバリデーションを行う仕組みである。Java EE6 から追加され、Java EE7 でのバージョンは1.1である。 Bean Validationとは Bean Validation は、JavaBeans のプロパティが取り得る値や条件を、制約のアノテーションとして設定することで、バリデーション内容を定義する仕組みである。そのため、これを利用すれば、バリデーションの定義やロジックを色々な場所に書く必要がなくなり、一元的な管理が可能になる。また、バリデーションに関するエラー時のメッセージ設定や、独自バリデーションの作成も行える。 バリデーションの仕組みとして独立しているため、様々なフレームワークに組み込むことができる。Java EE では、JSF(2
シリコンバレーの有名大学であるスタンフォード大学で、Andrew Ng先生の教える機械学習の講義が人気を集めている。この講義は形を変え、courseraという無料のWeb上オンラインコースとしても受講でき、ここ日本でも機械学習の勉強がしたい人達の間でも人気の講義となっている。 [Machine Learning by Stanford University] https://www.coursera.org/learn/machine-learning/ 人気の秘密 Andrew Ng先生の講義は内容が非常に実用的であることが人気の理由の1つとして挙げられるだろう。Andrew Ng先生はシリコンバレーの企業を相手に機械学習の指導をしている。おそらくその経験から、理論に走りすぎず、機械学習を適用するプロジェクトにおいて本当に有意義な内容に強くフォーカスしていることが感じられるのだ。Andr
今回から数回に分けてCDI(Contexts and Dependency Injection)を紹介する。 CDIは Java EE 6から追加されたDI(Dependency Injection、依存性注入)のための仕様である。 Java EE 7におけるCDIのバージョンは1.1であり、またJava EE 7から CDIはデフォルトで有効化されている。 DIはクラス間の依存関係を、コンテナ(CDIの実行環境)が解消する技術である。 依存関係を疎に保つことによって、実装や外部リソースの切り替えを容易にし、コードの独立性やテストのしやすさを高めることができる。 C(Contexts)とは、オブジェクトのライフサイクル(スコープ)を定義することで、コンテナが適切にオブジェクトのライフサイクルを管理することを指す。ライフサイクルの中であればオブジェクトの状態(ステート)を自由に変更できる。
CDIを使用したクラスのユニットテスト、すなわちJUnitなどのテストツールを使用した自動テストはどのように行うべきだろうか。 今回はユニットテストの方法について紹介する。 テスト対象のクラス 今回テストを行う対象は、前回の記事で紹介した、DAOを通じてデータベースを操作するSampleServiceである。 以下に再掲する。 @Transactional @RequestScoped public class SampleService { // DAOをインジェクション @Inject private TeamDao dao; /** * 新しいチームを登録する * * 空文字の場合は実行時例外を、 * 引数が2文字以下の場合はチェック例外を発生させる。 * @param teamName チーム名 * @throws SampleException チーム名が2文字以下の場合 */
今回は Java EE 7 連載の最終回として、CDI の拡張機能を紹介する。 CDI は拡張ポイントを提供して独自の拡張ができるようにしている。具体的に可能なのは以下のようなことである。 独自スコープを追加する CDI Beanでないクラスを CDI Bean として登録し、…
Java EE7から、CDI Beanに対する宣言的トランザクションが使用可能になった。 宣言的トランザクションの使用を宣言しておくと、メソッドの開始と同時に暗黙的にトランザクションを開始し、メソッドの終了時にトランザクションをコミットまたはロールバックできる。 宣言的トランザクションは、Java EE6まではコンテナ管理トランザクション(Container-Managed Transactions, CMT)として、EJBにしか設定できなかった。Java EE7からはCDI Beanに設定可能となったため、事実上あらゆるクラスに宣言的トランザクションを設定可能となった。 今回は、宣言的トランザクションの設定方法とサンプルを紹介する。 @Transactional アノテーション CDI Beanに対して宣言的トランザクションを設定するには、@javax.transaction.Trans
今回から、3回に分けてJava8 Stream API の終端操作について解説する。 終端操作は Stream の中の要素を実際に処理をする工程であり、fliter 等の中間操作は終端操作をトリガーにして初めて実行される。 中間操作を適用した要素に対して、終端操作で処理し、最終的に Stream から別のデータへの変換を行う。 JavaのStream API に終端操作があるのは、List等のコレクションとStreamが別物になっているためだと思われる。この点で、同様の機能を持つ他の言語(RubyやScalaなど)とは、大きく仕組みが異なっている。 終端操作にはStreamから他のデータへの変換というStream API特有の操作と、集計・条件判定・畳み込み演算といった他の言語にも見られる操作の2つの側面がある。 終端操作のメソッド 終端操作には以下のものがある。 副作用 - forEac
前回は Pivotal社に所属するSpring コントリビュータの Josh Long 氏によるプライベートセッション「Bootiful Application」のうち、マイクロサービスと Spring Boot の内容を紹介しました。 今回は、後半部分である Spring Cloud についてのレポートです。 なお、セッションではLong氏が次々とソースコードを矢継ぎ早に書き換えていったため、 この記事に掲載するサンプルコードは、筆者が内容に即したものをあらためて作成したものになります。 Spring Cloud マイクロサービスでシステムを構築すると、複数のSpring Boot アプリケーションが連携する分散構成となります。 Spring Cloud は分散構成のアプリケーションを制御するためのプロダクト群です。 複数のアプリケーションの設定管理、サービス管理、負荷分散、耐障害性、セ
2015年9月2日、Spring FrameworkコントリビュータのJosh Long氏がウルシステムズを電撃訪問し、プライベートセッションを開催するというサプライズがありました。日本Springユーザー会のフォーラムに合わせて来日した折、過密なスケジュールのすきまを縫って勝どきまで足を運んでくれたのです。 セッションのタイトルは「Bootiful Application」。Spring Frameworkの新機能である「Spring Boot」と「Spring Cloud」の概要を解説するものです。「百聞は一見にしかず」とばかりに、息もつかせぬ超高速コーディングで次々とデモを披露するLong氏に参加者一同、圧倒されっぱなし。刺激が多く、実りの多い2時間でした。今回はプライベートセッションのエッセンスをまとめてご紹介します。 Josh Long氏。ユーモアセンス抜群のギークです。 瞬きす
前回までJPAの使用方法を解説してきた。今回は、JPAを利用する上で、テーブルの主キーおよびエンティティのIDの設計で考慮しておくべき事柄を説明する。 複合主キーの定義方法 IDの定義方法を検討をするために、まずJPAでの複合主キーの定義方法を解説する。 エンティティのIDは、永続性コンテキストの中でエンティティを一意に識別する値である。また、EntityManger#find の引数にIDを渡すことからわかるように、JPAでは ID は1つのオブジェクトでなければならない。 そのため、@Embeddable アノテーションを付与した複合主キーを表すクラスを定義する必要がある。(エンティティクラスの内部クラスとすることが多い) @Embeddable public static class PK { @Column(length = 10) private String name; @Co
富豪的プログラミングが当たり前となった昨今、メモリーを節約するプログラミング技術は話題にならなくなって久しい。 しかし、一方で省メモリーなプログラミング技法が生きるフィールドは広がりつつある。たとえば以下の様な状況だ。 巨大データを扱いたい場合 データの分析目的で、通常のマシンでは1台のメモリーには載らないほど大きなデータをランダムアクセスしたい場合がある。 この場合、1台のマシンのメモリーには載らないという理由で仕方なくHadoopやSparkなどで分散処理させるのかもしれないが、ランダムアクセスをどうにかシーケンシャルなアルゴリズムに考えなおし、なおかつパフォーマンスを出すためにノード間の通信も最小にするような工夫せざるを得ない。 大変な労力がかかる割に、パフォーマンスは出にくく、分散処理特有のトラブルにも遭遇してしまう。 そうではなく、数百GBのメモリーを積んだマシンを用い、省メモリ
前々回と前回の記事で、JPAが提供する3つのクエリの定義方法のうち、JPQLとNaitiveQueryについて解説した。 今回は、最後の1つであるCriteria APIについて解説する。 Criteria API Criteria API は、API呼び出しによってクエリオブジェクトを構築する方法で、JPQLで定義されている文法と同じ内容のクエリを作成できる。 型安全なAPI呼び出しを使ってクエリを組み立てるため、動的にクエリを組み立てる必要がある場合には便利な仕組みである。 ただし、型安全であることにこだわったためか、 Criteria APIは使用するクラスが多く、非常に複雑な仕組みになっている。 Criteria APIで使用するクラスは主に以下の4つである。 CriteriaQuery クエリ全体に該当し、select句、from句、where句、group by句などを設定し、
今回から3回に分けて、JPAでエンティティを検索する手段であるクエリを解説する。 JPA では javax.persistence.Query というオブジェクトで、問い合わせの内容を表す。 このQueryを作成する方法は以下の3種類がある。 JPQL (Java Persistence Query Language) Native Query Criteria API いずれの場合もEntityManagerにあるそれぞれのクエリを作成するメソッドを呼び出してQueryを生成する。 以降、それぞれの定義方法や特徴を記述するが、今回の記事ではJPQLについて解説し、Native QueryとCriteria APIに関しては次回以降で解説する。 JPQLとは JPQL(Java Persistence Query Language)は、JPAが標準化したもので、SQLに似た問い合わせ言語で
前回の記事ではJPAのクエリの定義方法のうち、JPQLについて解説した。 今回はNative Queryについて解説する。 Native Queryとは Native Queryは直接SQLを実行する機能であり、JPQLではサポートされてないSQLやデータベース製品固有の方言などを実行することができる。 JPQLでサポートされてない構文には以下のようなものがある。 右外部結合、完全外部結合、直積 FROM句でのサブクエリ使用。(select句やwhere句では使用できる) DDLの実行(テストでの使用を想定) CTE(共通テーブル式)の使用 UNION ただしNative Queryは、JPQLで実現できない機能を利用する場合や、JPQLが生成するSQLが非効率な場合のみに使用するべきであり、JPQLがSQLに翻訳するコストがかかるという理由で使用するべきではない。 これは、JPQLからS
JPA(Java Persistence API)は、データベースなどの永続化記憶とJavaのオブジェクトとのマッピングを定義して、SQLをあまり書くことなくデータベースとの同期を取ることができる仕組みである。 JPAはO-Rマッピングだけでなく、永続化コンテキストによる同期化やクエリAPIなど多くの機能を備えており、これらの機能を使うことで、SQLを含むコード量の削減やパフォーマンス向上などの多くのメリットが得られる。 この記事では、JPAの詳細な仕様に立ち入らずに、JPAの概要や使用方法、知っておくとよいトピックについて紹介する。 概要 JPAの主な機能は以下の通り O-Rマッピング - Javaオブジェクトにアノテーション(またはXMLファイル)を指定して、データベースのテーブルとのマッピングを定義する。オブジェクトとテーブルを1対1でマッピングするだけでなく、テーブル間の関連の多重
次のページ
このページを最初にブックマークしてみませんか?
『エンタープライズギークス (Enterprise Geeks)』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く