読んだ : .NET のエンタープライズアプリケーションアーキテクチャ 第 2 版 / Dino Esposito、Andrea Saltarello 著
ドメイン駆動開発 (DDD) 関係の読書会に参加していて、最近読んでいるのがこれです。
.NETのエンタープライズアプリケーションアーキテクチャ 第2版 (マイクロソフト公式解説書)
- 作者:Dino Esposito,Andrea Saltarello
- 発売日: 2015/06/04
- メディア: 単行本
本書は、『再利用可能で、入手が容易な、ソフトウェアアーキテクチャの確かな知識ベースを提供』 することを考えて執筆されています。 すなわち、DDD の書籍というよりは、開発者とアーキテクトのための、ソフトウェアアーキテクチャ (その中でも特にエンタープライズアプリケーションや web アプリケーションのアーキテクチャ) の虎の巻のようなものです。 その中にドメイン駆動設計の考え方も含まれています。
内容
本書の内容を紹介します。
1 部 「基礎」 では、ソフトウェアアーキテクチャの基礎ということで、アーキテクトの役割であったり、プロジェクトを成功させるためにソフトウェアディザスタ (技術的負債だらけであること) を何故避ける必要があるのかといったこと、ソフトウェアの設計原則やテストが重要であることなどが書かれています。 ここら辺は割と他の書籍でも書かれていることなので、わりとサラッと読んでしまって良さそうです。 (ここら辺の内容をちゃんと吸収するなら 『CODE COMPLETE』 などを読むのが良いと思います。)
第 2 部 「アーキテクチャの考案」 には、プレゼンテーション層とビジネス層についてが書かれています。 目玉は 5 章の 「ドメインアーキテクチャの発見」 で、要約すると 『ドメインを深く理解することだけが適切なアーキテクチャの発見につながる』 ということと 『サブドメインの存在に気づいた場合は、それらをサブアプリケーションとしてモデリングし、最適なアーキテクチャをそれぞれに定義でき』 るということです。 ユビキタス言語と境界づけられたコンテキストが重要である、ということですね。
DDD 関係の本を読むとドメインモデルを構築するための技術的な部分に着目しがちですが、本書ではドメインモデルはあくまでサポートアーキテクチャの 1 つにすぎないと明確に述べていて、ユビキタス言語と境界づけられたコンテキストの重要性を前面に押し出しているのが特徴的です。 また、システムを設計するための手法として、ユーザーエクスペリエンスファースト (UX ファースト) と呼ばれるアプローチをとっているのも特徴ですね。 これは、システム設計の作業をプレゼンテーション層から開始して、予備的な分析を並行して行うという設計理念です。 つまり、最初にビジネスドメインと UX に関するデータを集めてユーザーとの対話モデルを設計して、その後でデータのワークフローやロジック、サービス、ストレージの定義に取り掛かるというものです。
第 3 部 「サポートアーキテクチャ」 では、ドメインモデル、CQRS、イベントソーシングの 3 つのサポートアーキテクチャについての説明がなされます。 ドメインモデルを用いた場合は、ドメインのすべての側面に適合する単一のモデルを設計する必要があり、モデルが複雑になってしまうという問題があるということが述べられ、本書ではやや CQRS 推しな感じです。 (もちろんドメインモデルが適している場面ではドメインモデルを使えば良いのですが。) 個人的にもドメインモデルをがっつり設計するのが常にいいとは思っていなかったので、「DDD の分析部分 (ユビキタス言語や境界づけられたコンテキストの発見) は常に重要だけど、戦略部分 (各境界づけられたコンテキストに最適なアーキテクチャを割り当てる) ではドメインモデルを使う以外の方法もある。 トランザクションスクリプトでもいいし、CQRS という選択肢もある」 というのを明確に示している本書は参考になりました。
第 4 部は 「インフラストラクチャ」 で、永続化レイヤーについて説明されます。
感想
DDD の 「分析部分」 と 「戦略部分」 を分けて、「戦略部分に置いてどういうアーキテクチャを選択するのが最適なのかは場合による」 というのを明確に示しているのが良いなーと思いました。 上でも書いたように、DDD というと 「ドメインモデルをいかに設計するのか」 に着目しがちなのですが、分析部分がまず重要であるというのが読んでいて伝わってきました。 (ユビキタス言語と境界づけられたコンテキストが重要であるということは DroidKaigi 2017 でのあんざいゆきさんの発表でもなされてましたね。)
戦略部分については、サポートアーキテクチャとして DDD において従来から使われているドメインモデルだけでなく、CQRS とイベントソーシングについても述べられているのが良い点だと思います。 どういうものかの紹介や思想の説明もありますし、実装の例も紹介されています。 実際に設計する際にどういう形にすればよいかがイメージしやすいようになっていて参考になります。
翻訳については、1 部の日本語が難しくなっていて読みづらいという問題はありました。 2 部以降はそれほど気にならなかったです。
全体としては、エンタープライズアプリケーションや web サービスの開発者やアーキテクトがアプリケーションのアーキテクチャについて検討する際に役立つ知識がまとまっていて、良い本だと思います。 『.NET の』 とタイトルにありますが、.NET に詳しくなくても問題なく読み進めていくことができますし、アプリケーションの全体のアーキテクチャについて考えている人は読んでみて損はないと思います。
読んだ : RESTful Web Services with Dropwizard / Alexandros Dallas 著
Dropwizard に関わる仕事をしているので読んでみました。
RESTful Web Services with Dropwizard
- 作者: Alexandros Dallas
- 出版社/メーカー: Packt Publishing
- 発売日: 2014/02/19
- メディア: Kindle版
- この商品を含むブログを見る
Dropwizard について
Dropwizard は Java の web アプリケーションフレームワークです。 基本的には既存ライブラリの組み合わせで web アプリケーションを構築するというもので、Dropwizard 固有の仕組みはさほど多くありません。 (例えば Web リクエストを受け取るのは Jersey で、DB アクセスには Hibernate か jDBI が使われる。)
特に Java EE 系の知識を持っている人であれば、とっつきやすい感じです。
本書について
本書は、Dropwizard を使って web アプリケーションを構築するための方法を説明するものです。 プロジェクトの準備や、HTTP リクエストを受けるエンドポイントの記述、DB アクセス、ユーザー認証、HTML を返す View テンプレートについてなど、基本的な要素について、サンプルコードを交えながら仕組みが解説されます。
Java EE などについてある程度わかっている人が読むと Dropwizard の公式ドキュメントを読むのと大差ないと思いますが、初心者の人が読むと結構わかりやすいんじゃないかなと思います。 (ある程度わかってる人にとっても、Dropwizard についてざっと知ることができて良いかもしれませんが、そういう使い方だとちょっと値段は高めに感じる気がします。)
本書での学び
参考のリンクとしては現時点での最新バージョンのドキュメントへのリンクです。 閲覧時の最新バージョンのドキュメントは各自探してください。
- Dropwizard では、maven-shade プラグイン を使って、単体で web アプリケーションとして実行可能な JAR ファイル (uber-jar) を作る。
- Hibernate Validator によるアプリケーション設定のバリデーションが可能。
- jDBI で DB から取得した結果をオブジェクトにマップする方法として、
@MapResultAsBean
アノテーションを使うという方法もある。- 参考 : MapResultAsBean (jDBI 2.48.2 API)
- とはいえ公式的なドキュメントは何もなく、ドキュメント化されていない挙動に依存することになるので不安。 (JDBI の機能の多くがドキュメント化されてないのでまあこれに限った話ではないのだけど。)
- HTTP リクエストパラメータのバリデーション周り。
- JAX-RS のリソースメソッドのパラメータのバリデーションを明示的に実行することも可能。 (
@Valid
アノテーションでのバリデーション実行しか知らなかった。) - 複数フィールドにまたがるバリデーション。
- 参考 : Dropwizard Validation | Dropwizard
- JAX-RS のリソースメソッドのパラメータのバリデーションを明示的に実行することも可能。 (
- Dropwizard には HTTP クライアント用モジュールも含まれている。
- 認証周り。
- Basic 認証用のクラスが用意されている。
- オプションの認証も可能。 (認証されたユーザーの場合はそのユーザー専用のコンテンツを表示し、さもなければ一般ユーザー向けのコンテンツを表示する、みたいな。)
CachingAuthenticator
によるキャッシング。- 参考 : Dropwizard Authentication | Dropwizard
- Fixtures for Easy Software Testing (FEST) というプロジェクトがある。 TestNG や JUnit と一緒に使える。 ソフトウェアテストを書きやすくするライブラリ。
感想
Dropwizard をそこそこ使ってて公式ドキュメントも (全部ではないけど) 読んでいたので、本書での学びはあんまりなかったです。 とはいえ上に書いたように新たに知れたこともいくつかあったので読んでよかったです。 (そんなに時間もかけずにざっと読めましたし。)
とはいえ紙の本だと 30 ドル以上するので、ちょっと高い感じはしますね。
読んだ : Kotlin スタートブック ― 新しい Android プログラミング / 長澤 太郎 著
Kotlin エバンジェリスト (JetBrains 黙認) であり、日本 Kotlin ユーザグループ代表であるたろーさん (長澤 太郎) によって書かれた書籍 『Kotlin スタートブック ― 新しい Android プログラミング』 (赤べこ本) を読みました!!
Kotlinスタートブック -新しいAndroidプログラミング
- 作者: 長澤太郎
- 出版社/メーカー: リックテレコム
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
本書を読む前から、公式のリファレンスやチュートリアルなどの気になる箇所を見てはいて Kotlin についてはなんとなく理解はしていたのですが、ところどころ知識が欠けている部分もあったので、本書によってそういった知識の欠落を埋めることができました。
どんな本か?
内容については著者のたろーさんが紹介されています。
導入としてまず 1 部があり、2 部で Kotlin の文法や機能の詳細が解説されます。 3 部にて、Android アプリ開発で Kotlin をどのように活用できるかが説明されます。 対象読者は 「Java および Android 開発経験者」 と書かれていますが、2 部までなら Android アプリ開発については知らなくても問題なく読み進められます。 「Android アプリ開発で Kotlin を使うために読む本」 というわけではなく、「Kotlin を使い始めるときに読む本」 かつ 「Android 開発に Kotlin を活用するためにどうすればいいかが書かれている本」 という感じです。
全体としては易し目の説明でスクリーンショットも多用されているのでプログラム開発の初心者でも読みやすい本だと思います。 一方で、説明する内容についてきちんと節が分かれていて飛ばし気味に読むこともやりやすいので、ソフトウェア開発についてある程度経験がある人が Kotlin の導入のために読むというのにも適しています。
感想
Kotlin を Java の代わりとして使い始めるのは結構簡単で、いくつかある Java との違い (各種文法の違いや 「==
演算子は同一性検査ではない」 みたいな違い) をおさえさえすれば導入できます。 逆に導入するのが簡単なせいで、「ちゃんと Kotlin 特有の機能や文法を学ぶ」 機会を設けず、必要に応じて公式リファレンスを参照している、という人も多いのではないでしょうか。 私もまさにそんな感じだったので、今回本書を読んで Kotlin 特有の機能、文法を学べたのは非常に良かったです。
内容的には深く突っ込んでいくという感じではないので、本書を読みつつ気になったところは公式リファレンスを参照する、みたいに読み進めていくといい気がします。 公式リファレンスとは違った視点での説明されている項目もあったりするので、両方参照することで理解が深まったりもすると思います。 公式リファレンスには書かれていない 『!!
演算子の代わりに requireNotNull
メソッドを使うと良い』 というような記述があるのも本書の良いところですね。
まさに 「これから Kotlin を使っていこうと思っている人のための Kotlin 入門本」 として、以下のような人にオススメできる書籍でした。
- Kotlin を使ってみてるけどまだ Kotlin 全体についてちゃんとは学んでいない。
- まだ Kotlin を使ってみてないけどこれから使ってみようかと思っている。
第 3 部の内容 (Kotlin で Android アプリ開発) について、ほとんど知っているものだったので自分にとってはあまり意味はなかったのですが、Kotlin を使った Android アプリ開発がどんな感じか全然知らない人にとってはそれらも役立つと思います。
読書メモ
自分にとって気になった箇所と、それに関連する公式リファレンスへのリンク。
require
メソッド で満たすべき条件を記述できる。 (P31)- string template と raw string 50
List
型の値がイミューダブルとはかぎらない。List
型のサブクラスにImmutableList
があるので、ImmutableList
オブジェクトがList
型として渡される可能性がある。 (P54)List
以外のコレクションクラスも同様。
Range
のin
演算子で、値が範囲に含まれているかどうか調べられる。 (P55)- イテレータに何らかのインターフェイスを実装する必要はない。 規定のメソッドさえオペレータとして定義されていれば良い。 (P63)
- 可変長引数は
vararg
修飾子で宣言。 配列を渡すときには spread 演算子 (*
; アスタリスク) で展開。 (P73) - 末尾再起呼び出し最適化に
tailrec
修飾子。 (P76) - ローカル関数、関数定義の中に関数を定義できる。 (P77)
- インライン関数の引数としてインライン関数外で呼ばれうるラムダを受け取る場合は
noinline
修飾子を付ける。 (P94)- 修飾子を何もつけないと、インライン関数の実行コンテキストでの実行しかできない。 インライン関数の引数のラムダもインライン展開されるため。
- スタックトレースの内容に影響を受けるような関数も
noinline
にすることを検討すると良いとのこと。 - 参考 : Inline Functions - Kotlin Programming Language
- インライン関数の引数として別の実行コンテキストでインライン化されて実行されるラムダを受け取る場合は
crossinline
修飾子を付ける。 (P94)- これにより、非ローカルリターンが使えないことを呼び出し側に伝える。
- 参考 : Inline Functions - Kotlin Programming Language
- インライン展開されるラムダ式では非ローカルリターンが使える。 (P95)
- ラムダ式から脱出する場合はラベルへのリターン。 (P96)
- Kotlin にはラムダ式以外に無名関数もある。 ラムダと違い
return
で無名関数から脱出する。 (P97) - ラムダ式と無名関数をあわせて関数リテラルという。 (P97)
- 公開範囲は public と internal (同一モジュール内) と private と protected (Java とは違って同一パッケージからは見えない)。 (P138)
- 使用場所変位指定による型投影。 使用側で
in
またはout
修飾子を指定する。 (P163) - クラス宣言における型パラメータが共変の場合は
out
修飾子を、反変の場合はin
修飾子で宣言。 宣言場所変位指定。 (P165) - 型引数について何もわからない場合でもそのジェネリック型を使いたい場合にはスター投影。 (P167)
- インライン関数の型パラメータを具象型パラメータ (reified type parameter) にすることで実行時にその型を扱えるようになる。 (P168)
!!
演算子の代わりにrequireNotNull
メソッドを使うことで意図をメッセージで表現できる。 (P180)- 安全キャスト
as?
を使うと、キャストできないときはnull
になる。 (P183) - 参照の等価性と構造の等価性。 (P190)
- 言葉遣いが 「同一性」 と 「等価性 (同値性)」 じゃないんだなー、という部分がちょっと驚き。
- 参考 : Equality - Kotlin Programming Language
infix
キーワードのついた 1 引数のメソッドを中置表記で呼び出せる。 (P192)- 範囲を作る
..
も中置表記。 - 参考 : Functions - Kotlin Programming Language
- 範囲を作る
- 分解宣言 (destructuring declaration) には
operator
つきのcomponentN
メソッドが必要。 (P194)- データクラスは componentN も自動生成してくれる。 (P197)
- 参考 : Destructuring Declarations - Kotlin Programming Language
- 内部クラスには
inner
修飾子を付ける。 (P199) try
は式。 (P211)- レシーバ付き関数リテラルの型
A.(B)->C
は(A, B)->C
のサブタイプ。 (P214)
『Web API: The Good Parts』 を読んだ
- 作者: 水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/11/21
- メディア: 大型本
- この商品を含むブログ (6件) を見る
同僚から借りて読みました。 全体としては Web API の設計に少しでも携わる人間ならとりあえず読んでおいたらいいんじゃないかなーという感じです。 薄いし。
本書を読んだからと言って最高の Web API の設計ができるようになるとは思わないですが、Web API の設計をする際に知っておくべきことが一通りまとまっていて良い感じだと思いました。
学びメモ
知らなかったことや、なんとなく知ってたけど改めて調べたことなどまとめておきます。
RFC 5861 での Cache-Control
ヘッダの拡張
RFC 5861 にて、Cache-Control
ヘッダの 2 つの拡張が定義されています。
stale-while-revalidate
ディレクティブ : プロキシサーバー上でmax-age
を超えてキャッシュが切れた後も、(裏側で非同期にキャッシュの検証を行いつつ) キャッシュ済みの古いレスポンスデータを返しても良い時間を指定できる。stale-if-error
ディレクティブ : オリジンサーバーへのリクエストに失敗する場合に、キャッシュ済みの古いレスポンスデータを返してもよい時間を指定できる。
RFC 5861 の現在の state は “Informational” らしいのでどれぐらいサポートされてるのかわからないですが、「プロキシサーバー上でキャッシュが無効になったあとも、裏でキャッシュ更新しつつユーザーからのリクエストに対してはレスポンスを返してほしい」 って状況はあるので、こういうのが既存のプロキシサーバーなどでサポートされてるとアプリケーション開発時に便利に使えそうです。
本書の 4.3.6 節 「Cache-Control ヘッダ」 に記述されています。
独自のメディアタイプを作る
メディアタイプの登録プロセスの効率と柔軟性を増やすために、サブタイプのいくつかの登録 『木』 (registration “trees”) が RFC 6838 にて定義されています。 それぞれの木には facet *1 が定義されているので、新たに作る独自のメディアタイプの用途に応じて登録木を選択し、それに応じた facet を付けることになります。 (登録木によっては登録作業なども必要。)
- Standards Tree : IETF 標準に関連付けられるなどした、標準のメディアタイプのための木。 Facet はない。
- Vendor Tree : 公に使用可能な製品に結びつけられたメディアタイプのための木。 Facet は “vnd.”。 (例 : “application/vnd.ms-excel”)
- Personal or Vanity Tree : 実験的に作られたり、商業的に流通しない製品の一部だったりするメディアタイプのための木。 Facet は “prs.”。
- Unregistered x. Tree : 私的に、ローカルな環境でのみ使われるメディアタイプのための木。 Facet は “x.”。
Web API で使用されるメディアタイプを新たに独自に定義する場合は、vendor tree か personal or vanity tree のどちらかになるでしょう。
本書の 4.4.3 節 「自分でメディアタイプを定義する場合」 に書かれています。
CORS 周り
XMLHttpRequest
*2 には同一生成元ポリシー (Same Origin Policy) が適用されるため、通常は生成元の異なる URL に XMLHttpRequest
でリクエストを投げることができません。 異なる生成元へのリクエストが可能になるように考えられた仕様として CORS (Cross-Origin Resource Sharing) があります。
それ自体は知ってたのですが、
- CORS でプリフライトリクエストが投げられる条件 (
POST
メソッドでもプリフライトリクエストするとは限らない、みたいな話を聞いたことはあったけど、詳しくは知らなかった)、とか Cookie
やAuthentication
などのヘッダで認証情報をやり取りする場合は、サーバー側はAccess-Control-Allow-Credentials
ヘッダを返す必要があり、クライアント側はXMLHttpRequest#withCredentials
というプロパティをtrue
にしないといけない
など知らなかったので、いろいろあるなーと思いました。
ちなみに最近は CORS (や他の仕様) を置き換えるものとして Fetch Standard が作られてるみたいですね。
本書の 4.5 節 「同一生成元ポリシーとクロスオリジンリソース共有」 に書かれています。
セキュリティ周りの話
X-Content-Type-Options
ヘッダ
IE (どのバージョンまで? 11 も?) には Content-Type
ヘッダの値を無視してレスポンス内容のデータ形式を推定する Content Sniffing という機能があり、JSON として解釈されるべきコンテンツが HTML として解釈されて XSS 脆弱性になる、という問題があります。
IE 8 以降の場合は、サーバーがレスポンスとして次のレスポンスヘッダを返すことで Content Sniffing を無効にできます。 さらに、Firefox や Chrome、IE 9 以降では、このヘッダを付けることで JSON ハイジャック *3 (後述) の危険性を減らすことができるそうです。 (JSON を返すときは常に付けましょう。)
X-Content-Type-Options: nosniff
詳細は次のページに書かれています。
本書では、6.3.1 節 「XSS」 に書かれています。
JSON ハイジャック
JSON 形式のレスポンスを JavaScript としてブラウザに解釈させることで、別オリジンのサーバーから配信される JSON の内容を悪意ある第三者の web ページが読みだすことができてしまう、という脆弱性。 例えば、悪意ある第三者の web ページが Array
オブジェクトのコンストラクタを書き換えたうえで、配列を返す JSON ファイルを script
要素で読み込むと、JSON の中身が書き換えられた Array
オブジェクトのコンストラクタに渡されてデータが読まれる、という感じです。 (これは Firefox 2 系で発生していた脆弱性で、最近のブラウザは対策済みらしいです。)
サーバー側の対策として、以下のものがあります。
script
要素では読み込めないようにする :script
要素で読み込まれた場合には送られないヘッダフィールド (X-Requested-With
ヘッダなど) を必須にする。- JSON のレスポンスをブラウザが JS として認識しないようにする :
Content-Type: application/json
にすることはもちろん、X-Content-Type-Options: nosniff
を付ける。 - JSON のレスポンスを JS として解釈不可能にする (あるいは JS として実行されてもデータが読まれないようにする) : レスポンスの先頭に
while (true);
を付けるとか。
本書では、6.3;3 節 「JSON ハイジャック」 に書かれています。
セキュリティ周りの各種ヘッダ
X-XSS-Protection
レスポンスヘッダ : XSS を発生させそうなパターンがレスポンスに含まれている場合に、ブラウザがレスポンスをブロックする機能を有効にしたり無効にしたりできるヘッダフィールドぽい。 この機能は Chrome と Safari、IE (8 以降) がサポートしてるぽい?- ちゃんとしたドキュメントはあんまり見当たらない。
- XSS ブロックの機能はデフォルトで有効っぽい *4 から、サーバーサイドでは基本的には付けなくてもよさそう?
- 参考 : IE8 Security Part IV: The XSS Filter | IEBlog
Strict-Transport-Security
レスポンスヘッダ : ブラウザからのアクセスを HTTPS に限定させる。- http でリクエストされたときに https にリダイレクトする、という挙動だと、最初の http でのアクセスが中間者攻撃で書き換えられる恐れがある → 以前にこのヘッダが送られてきていたら、ブラウザは最初から https でアクセスする。
- RFC : RFC 6797 - HTTP Strict Transport Security (HSTS)
- 参考 : HTTP Strict Transport Security - Security | MDN
Public-Key-Pins
レスポンスヘッダ : ブラウザに暗号公開鍵とドメイン (?) を結び付けさせる → ブラウザは将来に証明書が偽造された場合に検知できるようになる。- 攻撃者により認証局が危殆化した場合に中間者攻撃されるのを防げる。
- RFC : RFC 7469 - Public Key Pinning Extension for HTTP
- 参考 : Public Key Pinning - Web security | MDN
本書の 6.5 節 「セキュリティ関係の HTTP ヘッダ」 に書かれています。
ブラウザがレスポンス内容を UTF-7 と誤認することによる XSS の成立
XSS 対策として 「<」 という文字列をエスケープするなどの方法がありますが、ブラウザにレスポンス内容の文字エンコーディングを UTF-7 だと誤認させることで、「<」 のエスケープをしていても 「<script>」 という文字列をそのままブラウザに食わせることができる、という攻撃があるとのことです。
UTF-7 では、「<」 という文字は ASCII の 「+ADw-」 として表現されるためです。 「+Adw-script+AD4-」 という文字列を UTF-7 としてブラウザに解釈させれば 「<script>」 とみなされるので、「<」 という文字のエスケープをしていてもそれをすり抜けて XSS ができることがあるようです。 (古いブラウザの脆弱性。)
最近のブラウザだと問題ないようですが、念のため対策するのであれば 「+」 をエスケープすると良いようです。
- 参考 : 第1回 UTF-7によるクロスサイトスクリプティング攻撃[前編]:本当は怖い文字コードの話|gihyo.jp … 技術評論社
- 参考 : UTF-7でXSSを発生させる10の方法 - 葉っぱ日記
本書の 6.3.1 節 「XSS」 に書かれています。
ステータスコード 429 Too Many Request
レートリミットに達した場合に返すためのステータスコードとして 429 Too Many Request が定義されているとのこと。 初めて知りました。
ヘッダフィールドの値として使用できる時刻の形式は決められてる?
本書には以下のように書かれていて、X-Rate-Limit-Reset
のようなヘッダフィールドの値として Unix タイムスタンプを使うことは問題がある、といってるんですけど実際どうなんでしょうね。 (本書 195 ページ。)
HTTP ヘッダに Unix タイムスタンプを入れるのは、実は問題があるのです。 というのは、RFC 7231 の HTTP 1.1 仕様によればヘッダに入れてよい時間の形式は以下の 3 種類に限定されているからです
多分根拠は RFC 7231 の以下の箇所だと思うんですけど、これって別にあらゆるヘッダフィールドの値として使われる時刻の形式について言っているのではなくて、HTTP-date
について言ってるだけな気もします。 わかんないですけど。
A recipient that parses a timestamp value in an HTTP header field MUST accept all three HTTP-date formats. When a sender generates a header field that contains one or more timestamps defined as HTTP-date, the sender MUST generate those timestamps in the IMF-fixdate format.
RFC 7231 (section 7.1.1.1 Date/Time Formats)
読んだ: Java エンジニア養成読本
2014 年 12 月に発売された 『Java エンジニア養成読本 [現場で役立つ最新知識、満載!]』 を読みました。 これだけを読んで Java がわかるわけではないけど、歴史から Java EE、周辺技術に至るまで説明されていて、Java 初心者が全体を俯瞰するのに良さそうだと思いました!
内容紹介
本書は、複数の著者による共著になっています。
まず、巻頭記事がきしださんによる 「誰も教えてくれない Java の世界」。 Java の歴史や、Java のエディション (Java SE、EE、ME について)、JDK や JRE、JCP、JSR の紹介や各種 IDE や有名なフレームワークの紹介など、Java を使い始めてみたけど世界観がよくわからない、という人に役立つ情報が凝縮されています。 「お前に Sun が救えるか」 といったネタも紹介されています。
続く特集 1 が irof さんによる 「Java 入門」。 もちろん Java の構文の細かいところまでは説明されていませんが、クラス定義についてや例外処理、標準ライブラリについてのプラクティスなどが紹介されています。
特集 2 は bitter_fox さんによる 「Java SE 8 時代のデータ処理入門」。 Java SE 8 で導入されたラムダ式や Stream API について説明されます。 私もここら辺のことはまだ詳しくは知らなかったのでためになりました。
特集 3 はキクタローさんによる 「現場で役立つ Java EE」。 Java 初心者にとっては Java EE とは何者なのか良くわからない存在だと思いますが、この特集を読むことでなんとなく何者であるかはわかると思います。 Java EE と一口に言ってもその技術要素は多岐に渡りますが、この特集では Servlet や JSF、JAX-RS、JPA、CDI、EJB といったわりと良く使われる技術要素について主に説明されます。 私も JSF や EJB については詳しくなかったので、本書を読んで勉強になりました。
特集 4 は渡辺さんによる 「現場で役立つチーム開発入門」。 Git や Maven、JUnit によるテストや Jenkins といった、開発現場で良く使われている周辺技術が説明されます。
最後に 「イマドキの Java 受託開発の現場で求められる知識」 というタイトルで、提案や設計について、「web 開発の現場では Java の知識だけでなく、HTML や CSS、JS の知識なども必要である」 みたいな話や、テストやデプロイについて説明されます。
感想
Java 初心者が Java を使った web アプリケーション開発について学ぶのにちょうど良い書籍になっていると思います。 もちろん、前半は web アプリケーション開発とは関係なく Java について学べますし、Java を使うなら (web アプリケーション開発をするつもりがなくても) 読むと良いでしょう。
文体がいいのか構成がいいのかムックという本の形態が良いのかわかりませんが、技術書としては読みやすかったです。
既に Java について深い造詣があるならこの本を読む必要はないと思います *1 が、これから Java を使っていきたい人や最近 Java を学び始めた人は、この本を早い段階で呼んでおくと後々の学習が捗ると思います。 Java の良書はいろいろありますが、重量級なものも多いですので、まずは軽く本書から読んでみる、というのをオススメします。
あなたと Java エンジニア養成読本、今すぐ購入!
Kindle 版もあるようですよ!
Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)
- 作者: きしだなおき,のざきひろふみ,吉田真也,菊田洋一,渡辺修司,伊賀敏樹
- 出版社/メーカー: 技術評論社
- 発売日: 2014/11/11
- メディア: 大型本
- この商品を含むブログ (6件) を見る
- 作者: きしだなおき,のざきひろふみ,吉田真也,菊田洋一,渡辺修司,伊賀敏樹
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/11
- メディア: Kindle版
- この商品を含むブログを見る