ディジタル証明書の有効性はCRLで確認します。
- 前回の勉強内容
- 勉強のきっかけになった問題
- CRLは、有効期限内に失効したディジタル証明書の一覧です。
- 受け取ったデジタル証明書は、CRLを突き合わせて有効かを確認できます。
- CRLを集中管理して検証してくれるのはVAです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
特定の認証局が発行したCRLに関する記述のうち,適切なものはどれか。
CRLは、有効期限内に失効したディジタル証明書の一覧です。
- 英語 : Certificate Revocation List
- 日本語 : 証明書失効リスト
- CRLに書いてあること : 証明書のシリアル番号 と 失効日
CRLとは有効期限よりも前に失効させたデジタル証明書の一覧です。有効期限よりも前に失効させるというのは、例えば証明書の誤発行や証明書の秘密鍵紛失で悪用されるのを回避するための処置です。認証局では、そのような証明書をCRLに登録して管理します。
CRL(証明書失効リスト)とは、OCSPとは | ネットワークエンジニアとして
認証局が管理する、失効済み電子証明書の一覧。
CRLの仕様は、電子証明書と同様にX.509の規格で決められています。また、CRLにはリストを発行した認証局が電子署名を行っているので、電子証明書と同じく偽造はほぼ不可能といえます。
証明書失効リスト (CRL)|SSLサーバ証明書 ジオトラスト
本来のユーザーから失効の申し出があると、認証局はその情報を CRL に追加する。また、デジタル証明書の記載内容が変更されることもある。こういった場合も、認証局に申請すると CRL に加えることができる。
【公式】NTTPCコミュニケーションズ
CRLは認証局(CA)から定期的に最新のものが配布されています。CRLの仕様はデジタル証明書の仕様を定めたITU-T X.509で標準化されています。
CRL(Certificate Revocation List) | セコムトラストシステムズのBCP(事業継続計画)用語辞典
有効期限前に失効される理由は色々あるらしいです。
- 送信データを暗号化する鍵データが入ったパソコンを紛失した >> 誰かが使わないように失効させる
- 間違って発行してしまった >> 使わないから失効させる
- 被発行者の規則違反 >> 証明したくないから失効させる
受け取ったデジタル証明書は、CRLを突き合わせて有効かを確認できます。
方法1. CRLファイルをダウンロードして突き合わせて確認します。
CRLファイルを実際に見てみました。
qiita.com
方法2. OCSPというプロトコルを使ってオンラインで確認します。
- 英語 : Online Certificate Status Protocol
- 日本語 : オンライン証明書状況プロトコル
OCSP(Online Certificate Status Protocol)は、ブラウザなどのクライアントが、認証局が提供するOCSPサーバーに対して証明書のシリアル番号を問合せ、OCSPサーバーが証明書のステイタスを返すという仕組みです。
証明書の失効:CRL(Certificate Revocation Lists) とOCSP | rms.ne.jp
OCSP は、オンラインで証明書の失効情報を確認するためのプロトコルであり、RFC2560 に規定されています。証明書利用者(OCSP リクエスタ)は、OCSP レスポンダ(OCSP サーバーとも呼ばれる)に失効情報を問い合わせます。OCSP レスポンダは、問い合わせに対して証明書の状態 について、有効(good)、失効(revoked)、不明(unknown) のいずれかとして返します
KI関連技術に関するコンテンツ
デジタル証明書の有効性をリアルタイムで確認するプロトコル。OCSPサーバはCA自身や、CRLを集中管理するVAが運営する。OCSPクライアントはサーバに対してデジタル証明書を確認させることによって、自力でのCRL取得や照合の手間を省略できる。
OCSP(Online Certificate Status Protocol)とは - IT用語辞典 e-Words
リアルタイムでディジタル証明書の失効情報を検証し、有効性を確認するプロトコル。対象となるディジタル証明書のシリアル番号をVA(証明書有効性検証局)に送信し、有効性の検証結果を受け取る機能を提供する。
OCSP|情報セキュリティマネジメント試験.com
OCSPレスポンダにサーバが問い合わせをしてその応答をキャッシュしておいて、そのキャッシュを基にクライアントに送信する方法をOCSP Staplingと言います。
OCSP Staplingとは、WebサーバーなどのSSLサーバ証明書を提示するサーバーが認証局のOCSPレスポンダーに問合せを行い、そのキャッシュされた結果を、証明書とともにブラウザなどのクライアントに提示するという仕組みです。
このキャッシュされた結果は、サーバーとクライアントのTLS/SSLハンドシェイクの過程でCertificate Status Requestとして利用されます。
rms-digicert.ne.jp
OCSP Stapling(ステープリング)では、クライアントがOCSP要求を行うのではなく、サーバがOCSP要求を行い、その応答をキャッシュする。サーバはキャッシュしたOCSP応答を、サーバ証明書と一緒にクライアントに送信する。これによりクライアントはOCSP responderに問い合わせる必要がなくなり、HTTPS通信の開始を高速化することができる。
OCSP の問題のひとつは、SSL ハンドシェイク時にウェブサーバとクライアント間の通信に加えて、クライアントが OSCP サーバへ通信するという実質 3 者間の通信になっておりこれが SSL ハンドシェイク時のオーバーヘッドになっていることです。OCSP ステープリングは、ウェブサーバがウェブブラウザの代わりに OSCP レスポンダに問い合わせ、SSL ハンドシェイクの際に OCSP レスポンスをクライアントに提供するというメカニズムです。※ 8 これはすでに IETF RFC6066 で定義されています。
https://www.jp.websecurity.symantec.com/welcome/pdf/wp_ssl_handshake.pdf
実際に見てみました。
CRLを集中管理して検証してくれるのはVAです。
- 英語 : Validation Authority
- 日本語 : 検証局
- 別名 : 証明書有効性検証局
認証局(CA)と違い、デジタル証明書の発行は行わず、検証機能に特化しているためこのように呼ばれる。クライアントからの問い合わせに応じて、CAの公開鍵で署名の正当性を検証したり、証明書の有効期限を確認したりする。
e-words.jp
デジタル証明書の有効性を確認する検証機能のみを行うので、証明書を発行する認証局とは区別する意味合いから異なる名称がついています。VAがCRLを集中管理することで無効な証明書にすばやく対応することができます。
www.secomtrust.net
クライアントからのディジタル証明書の有効性に関する問い合わせに対し、署名の検証、有効期限の確認、CRLの確認などを行い、有効性の可否を応答する役割をもつPKIの機関。
VA|情報セキュリティマネジメント試験.com
次回の勉強内容
ディジタル署名の公開鍵を保証するディジタル証明書
- 前回の勉強内容
- 勉強のきっかけになった問題
- ディジタル証明書は、公開鍵暗号方式において公開鍵の正当性を保証するものです。
- SSL/TLSでのクライアントとサーバでのやり取りではディジタル証明書が使われます。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
ディジタル証明書に関する記述のうち,適切なものはどれか。
ディジタル証明書は、公開鍵暗号方式において公開鍵の正当性を保証するものです。
デジタル署名だけではそもそも配布されている公開鍵が本当に正しい公開鍵(下図ではAさんの公開鍵)なのかを確認することができません。デジタル署名の解析用の公開鍵が正しいことを証明するためにはデジタル証明書を使用します。
デジタル証明書の仕組み
デジタル証明書は、証明したい内容に対して「ハッシュ化」と「秘密鍵による暗号化」を行ったものです。
証明書を信頼できる第三者機関から発行してもらうことで、公的な確認(証明)ができる仕組みです。
デジタル署名とデジタル証明書 CapmNetwork
デジタル署名単独では公開鍵が本人のものであるか確認できないが、デジタル証明書をデジタル署名に付属させることにより、データが改ざんされていないこととともに(この機能はデジタル署名単独で実現できる)、データの作成者を認証局を通して証明することができる。
デジタル証明書(電子証明書)とは - IT用語辞典 e-Words
受信者に届いたデータは、送信者からのデータであることを確認できます。
ディジタル証明書をもつA氏が,B商店に対して電子メールを使って商品の注文を行うときに,A氏は自分の秘密鍵を用いてディジタル署名を行い,B商店はA氏の公開鍵を用いて署名を確認する。この手法によって実現できることはどれか。ここで,A氏の秘密鍵はA氏だけが使用できるものとする。
ウ. B商店に届いた注文は,A氏からの注文であることを確認できる。
平成26年秋期問37 ディジタル証明書で確認できること|基本情報技術者試験.com
ディジタル証明書は、認証局(CA)と呼ばれる第三者機関によって発行された、個人や企業(のサーバ)に対する電子式の証明書です。
ディジタル証明書には「発行者ID」「主体者ID」「有効期間」などの情報が含まれ、その信頼性を保証するため認証局のディジタル署名が付されています。
平成27年春期問45 社員のスマートフォンの認証|基本情報技術者試験.com
ディジタル証明書の有効性はCRLで確認します。
次回の勉強内容
送ったデータの完全性を保証するためのディジタル署名
- 前回の勉強内容
- 勉強のきっかけになった問題
- ディジタル署名でデータがなりすましや改ざんが行われていないことを証明します。
- XMLディジタル署名はXML要素として署名を付けられます。
- XML署名の種別
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
ディジタル署名でデータがなりすましや改ざんが行われていないことを証明します。
- 英語 : digital signature
- 別名 : 電子署名
・ファイルにくっつけるデータだよ
・ファイルの正当性を証明するよ
・誰が作ったかを示すよ
・改ざんされていないことを示すよ
デジタル署名とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
送信者は、メッセージの原文から一定の計算手順で割り出した短いデータを文書に添付して送信する。受信者は受け取った署名データを一定の手順でこれを検証することにより、文書に署名を行ったのが送信者本人であることや、文書が通信途上で改ざんされていないことなどを確認することができる。
電子署名(デジタル署名)とは - IT用語辞典 e-Words
送信側のデータをハッシュ値にしてデータと一緒に送信し、受信側でもデータをハッシュ値にして比較することで改ざんされていないことを確認する仕組みをメッセージ・ダイジェストといいます。
データから生成したハッシュ値をダイジェスト値といいます。
データのダイジェスト値をハッシュ関数で取得して、それを秘密鍵で暗号化します。
データの送信者はまず作成したデータを自分の秘密鍵を使って暗号化するとともに、データのハッシュ値をハッシュ関数によって算出する。ハッシュ値は、元のデータを逆算できないという特殊な値で、算出したハッシュ値を自分の秘密鍵を使って暗号化する。送信者は受信者にあらかじめ公開鍵を渡しておき、暗号化したデータと暗号化したハッシュ値を受信者に向けて送信する。
KDDI株式会社――Tomorrow, Together
「署名」はハッシュ値を暗号化した値のことです。
デジタル署名を利用する前提として、送信者と受信者の間で公開鍵の入手とハッシュ関数の共有が必要となる。仕組みとしては、送信者はデータの一部分のハッシュ値を計算し、それをあらかじめ入手してある送信先の公開鍵で暗号化する。そして、元データとともにその暗号化したハッシュ値(署名)を送信する。
デジタル署名 − @IT ネットワーク用語事典
メッセージダイジェスト(またはハッシュ値)と呼ばれるデータを暗号化します。メッセージダイジェスト(ハッシュ値)とは、本文より「ハッシュ関数」という一方向関数を用いて抽出したビットデータのことを言います。「ハッシュ関数」という関数を用いると、本文から一定の長さのビット列(0と1の羅列)が抽出されます。ハッシュ関数とは、ビット列から全く異なるビット列と作り出す関数になります。
デジタル署名・電子署名とは何か?|ハッシュ関数とメッセージダイジェスト
XMLディジタル署名はXML要素として署名を付けられます。
・署名対象、署名アルゴリズムやメッセージダイジェストおよび証明書などをXMLの文法で表現している。
・ディジタル署名がXMLタグ付き言語であり分かりやすい。
・任意のデータファイルやXML文書の全体だけではなく、XML文書の一部に対しても署名を付けることができ、部分署名や多重署名などができる。
・XML署名で参照する暗号アルゴリズムなどのオブジェクトの識別子は、W3Cなどで定めているURIを参照する。
平成28年 秋期 情報セキュリティスペシャリスト 午前II 問4
署名対象のダイジェスト値(ハッシュ値)を求め、ダイジェスト値を子要素としてXML署名情報要素に入れ、さらにその署名情報要素に対してダイジェスト値と署名値を計算し挿入する。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT
XML 署名では、XML ドキュメントに埋め込むか、別の方法で XML ドキュメントに関連付けることができる一連の XML 要素を定義します。これによって、受信者は、メッセージが変更されておらず、送信者が意図したとおりのものであることを確認できます。
https://msdn.microsoft.com/ja-jp/library/cc465608.aspx
デジタル・コンテンツに対するデジタル署名に署名し、それを検査するための XML 構文および処理規則を定義する仕様です。 この仕様は、World Wide Web Consortium (W3C) および Internet Engineering Task Force (IETF) による共同開発です。
IBM Knowledge Center
インターネット上での情報交換のためのフォーマットとしてXMLが使われるので、XML にデジタル署名を付与するする必要があります。
近年、インターネット上での情報交換のためのフォーマットとして、XML(eXtensible Markup Language)が注目を浴びています。XML は拡張可能なマークアップ言語 [75] であり、テキストファイルでありながら構造化された情報を柔軟に扱うことができます。XML は、HTML の元ともなった SGML から、インターネットでの情報交換に必要な箇所を抽出したサブセットです。
XML 文書に対する改ざん、なりすましを防ぐために、デジタル署名の機能が求められています。現在、XML にデジタル署名を付与するための規格として、W3C (World Wide Web Consortium) において「XML 署名(XML Signature)」の標準化が進められています。XML の署名要件(RFC2807)、XML 署名構文と処理(RFC3075)、XML の正規化 (RFC3076) が RFC として公表されています。
PKI関連技術に関するコンテンツ
XML署名の種別
XML文書中の任意のエレメントに対してつけることができるのがデタッチ署名です。
- 英語 : Detached Signature
対象データと署名を別々のところに置いとけるのはデタッチ署名です。
Detached Signature(デタッチ署名)
署名要素と署名対象要素が独立している場合の署名形式。(署名対象別のファイルである場合や同じXML文書内でも要素の親子関係がないときなど)
平成28年秋期問4 XMLディジタル署名の特徴|情報処理安全確保支援士.com
署名対象要素と署名要素が独立した署名形式(sibling elements)である。
Detached署名は、署名対象データに任意の電子ファイル(Word、Excel、MPEG画像データ、XML文書など)を指定して、署名対象データをXML署名部分とは独立させ外部ネットワークやローカルファイルに置くことができる。またXML文書内にXML署名要素とXML署名対象要素を並列に配置させることもできる。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT
エンベロープ署名は、複数の人の署名を付けられます。
署名要素が署名対象要素の子要素となる署名形式である。
Enveloped署名は同じ文書に複数人の署名を付けるなどの用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT
エンベローピング署名では署名要素の子要素として対象データを指定します。
署名要素が署名対象要素の親要素となる署名形式である。
Enveloping署名は署名対象要素を包含した形式で、医療のカルテのように初めの医師が署名したカルテに、次の医師が新しく書き添えた部分のみに署名を加えていくような用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT
次回の勉強内容
パラメータと引数の違い
似ているし、意思疎通にはそれほど困らないけど・・・「引数 == パラメータ」ではないです。
パラメータと引数の違い
パラメータは、関数に受け渡されるものの宣言す。
/* * pra1とpra2は、パラメータです。 * JavaDocでも「@param」で説明を書きます。 */ private void calledMethod(int pra1, String pra2) { ・・・・ }
・メソッド(や関数)に定義されているのは「パラメータ」(もしくは「パラメータ変数」)。
・メソッド(や関数)に定義されたすべてのパラメータ群は「パラメータ リスト」と呼びます。
blog.masahiko.info
パラメータは、プロシージャが呼び出されるときに期待する値を表します。パラメータは、プロシージャの宣言で定義されます。
パラメータと引数の違い
関数の定義の中で関数に渡す値として定義されている値。
パラメータと引数の違い | 同じと思っていない?
引数は、関数に渡した実際の値のことです。
// arg1とarg2は、引数です。 private void callMethod() { int arg1 = 5; String arg2 = "五"; calledMethod(arg1, arg2); }
・メソッド(や関数)のパラメータに渡された値*1は「引数」(「パラメータ値」との言い換えも可能)。
・メソッド(や関数)のパラメータ群に渡されたすべての値群は「引数リスト」と呼びます。
blog.masahiko.info
引数は、プロシージャを呼び出すときに、プロシージャのパラメータに渡す値を表します。呼び出し元のコードは、プロシージャを呼び出すときに引数を渡します。
パラメータと引数の違い
関数を呼び出すときに渡す値。
パラメータと引数の違い | 同じと思っていない?
仮引数と実引数の違い
仮引数と実引数の違いは、パラメータと引数のそれと同じです。
メソッド定義のパラメータ変数のことを仮引数という。
呼び出し側でメソッドに渡すパラメータのことを実引数という。
blog.codebook-10000.com
仮引数も実引数も「~な引数」で理解が難しいです。
仮パラメータと実パラメータの違い
仮パラメータは、パラメータのことです。
実パラメータは、引数のことです。
仮パラメータと実パラメータの違いは、パラメータと引数のそれと同じです。
仮引数も実引数も用語説明があまり見当たらなくてで理解が難しいです。
こんな感じで使われています。
変数パラメータの実引数は仮パラメータと正確に同じ型でなければなりません。
E2033 変数実パラメータと変数仮パラメータとは同一の型でなければなりません (Delphi) - RAD Studio
関数を呼び出すとき、その関数が受け取る引数の数、それぞれの引数の型が一致していなくてはならない。引数の数が一致しないとエラーになる:
[エラー] 実パラメータが足りません
Add 関数は 2 つの引数を受け取るので、引数 1 つでこの関数を呼び出すことはできない。
関数
プロシージャ呼び出し時の実パラメータ・リスト
プロシージャ定義時の仮パラメータ・リスト
パラメータ渡し
まとめ
関数が受け取るものの定義 | 関数に渡す値 |
---|---|
パラメータ | 引数 |
仮引数 | 実引数 |
仮パラメータ | 実パラメータ |
EclipseでTomcatを設定する。
- 前回は、プロジェクトにSpringを設定しましたがTomcatを設定していないことに気が付きました。
- Tomcatは、Java Servlet や JSP を実行するためのWebコンテナです。
- Macの場合
- Windowsの場合
- 失敗したこと
- 次は、Spring MVC の設定をしていきます。
前回は、プロジェクトにSpringを設定しましたがTomcatを設定していないことに気が付きました。
Tomcatは、Java Servlet や JSP を実行するためのWebコンテナです。
Apache License 2.0を採用したオープンソースソフトウェア。
2005年以降、Apacheソフトウェア財団のトップレベルプロジェクトのひとつであるApache Tomcat Project 内で開発されている。
それ以前はかつて存在していたJakartaプロジェクト内で開発されていた。
Apache Tomcat - Wikipedia
オープンソースのソフトウェアで、Javaサーブレット・JSPを処理するアプリケーションサーバ。Tomcatは単独でWebサーバとして動作することも可能だが、ApacheやIISのプラグインと動作できるようになっており、実際にはプラグインとしての利用が主流である。
Tomcatは主なUNIX系OSやWindows、Mac OS Xなどで動作する。Sun Microsystems社からJavaサーブレット・JSPのリファレンス実装として認められたソフトウェアで、利用者も非常に多い。
e-words.jp
Webコンテナは、Javaサーブレットの実行環境となるソフトウェアです。
- 別名 : Servlet container
Java EE アーキテクチャのWebコンポーネント規約を実装するソフトウェア。
この規約では、コンピュータセキュリティ、並列性、ライフサイクル管理、トランザクション処理、デプロイやその他のサービスを含むWebコンポーネントの実行環境を規定している。WebコンテナはJava EEプラットフォームAPIを利用したJSPコンテナとしての機能も提供する。
Webコンテナ - Wikipedia
サーブレットはWebサーバ上で動作させるJava言語で書かれた簡易なプログラムで、クライアント(Webブラウザなど)からの要求を受けて処理を行い、結果をWebページとして送信する。サーブレットは単体では動作せず、Webサーバからの処理要求を受け付けてサーブレットの記述に従って実際の処理を行うソフトウェアが必要で、これをサーブレットコンテナという。
e-words.jp
Macの場合
Tomcatを配置します。
- Apache Tomcat® - Apache Tomcat 8 Software Downloadsへアクセスします。
- 好きなバージョンの.tar.gz をダウンロードして解凍します。
- 解凍した「apache-tomcat-8.0.23」(バージョンによって末尾は変わる)をApplicationsディレクトリ配下に移動します。
- Tomcatに権限を付与します。
- Tomcatを起動します。
- ブラウザで「http://localhost:8080/」にアクセスします。
- Tomcatを停止します。
# Tomcatに権限を付与します。 $ chmod 755 /Applications/apache-tomcat-8.0.23/bin/startup.sh $ chmod 755 /Applications/apache-tomcat-8.0.23/bin/shutdown.sh # Tomcatを起動します。 $ /Applications/apache-tomcat-8.0.23/bin/startup.sh Using CATALINA_BASE: /Applications/apache-tomcat-8.0.23 Using CATALINA_HOME: /Applications/apache-tomcat-8.0.23 Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home Using CLASSPATH: /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar Tomcat started. # Tomcatを停止します。 $ /Applications/apache-tomcat-8.0.23/bin/shutdown.sh Using CATALINA_BASE: /Applications/apache-tomcat-8.0.23 Using CATALINA_HOME: /Applications/apache-tomcat-8.0.23 Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home Using CLASSPATH: /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar
EclipseにTomactのプラグインを入れます。
方法は2つあるので好きな方を選びます。
zipファイルでインストールする方法
- 環境
- Eclipse Tomcat Pluginへアクセスします。
- zipファイルをダウンロードします。
- [Help] > [Install New Software]を選択します。
- [Work with] > [Add...]ボタン > [Archive]ボタン > ダウンロードしたzipファイルを選択 > [OK]ボタン
- [Tomcat Plugin]にチェックを入れます。
- [Next>]ボタン > [Next>]ボタン > [I accept the........]を選択 > [Finish]ボタン
- Eclipseを再起動します。
- Tom猫マークが表示されます。
Eclipse Marketplaceでインストールする方法
- 環境
EclipseにTomcatを設定します。
- 環境を設定します。
- [Windows] > [Preferences] > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択します。
- [Tomcat ホーム] > [Browse...]ボタン > 「/Applications/apache-tomcat-8.0.23」を選択します。
- コンテキスト宣言モードを選択します。
「コンテキスト宣言モード」は、コンフィグレーションファイルの選択となります。
「server.xml」を選択すると、\conf\server.xml にアプリケーションコンテキストの設定が更新されます。
「コンテキストファイル」を選択すると、指定したディレクトリ(デフォルトは \conf\Catalina\localhost)にアプリケーションコンテキストの設定ファイル(プロジェクト名.xml)が作成されます。
proenomichi.blogspot.jp
- Eclipseに設定されているJavaのバージョンを確認します。
- サーバを追加します。
- アプリケーションを動かしてみます。
- [Project] > [Clean...] を押下してプロジェクトをクリーンします。
- [Package Exploer]でプロジェクトを選択して右クリックします。
- [Run As] > [Run on Server] を押下するとダイアログが表示されます(されないこともあります)。
- ダイアログで Tomcat を選択して [Finish] を押下します。
- 毎回、同じサーバを使用するのであれば「Always use this server when running this project」にチェックを入れておきます。
- http://localhost:8080/{プロジェクトの名前}/ にアクセスすると「Hellow World!!」が表示されました。
Windowsの場合
- 環境
- Windows10 Pro 64bit
- Eclipse Version: Oxygen.3a Release (4.7.3a)
Tomcatを配置します。
- Apache Tomcat® - Apache Tomcat 8 Software Downloadsのサイトからzipファイルをダウンロードする
- 任意のフォルダに解凍する
- 起動してみる
- startup.shで起動する
- startup.shで起動する
- http://localhost:8080/ をブラウザで表示して起動することを確認する
- shutdown.shで停止する
# startup.shで起動する $ /path/to/apache-tomcat-8.5.47/bin/startup.sh Using CATALINA_BASE: /path/to/apache-tomcat-8.5.47 Using CATALINA_HOME: /path/to/apache-tomcat-8.5.47 Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp Using JRE_HOME: /path/to/Java/jdk1.8.0_231/ Using CLASSPATH: /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar Tomcat started. # shutdown.shで停止する $ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh Using CATALINA_BASE: /path/to/apache-tomcat-8.5.47 Using CATALINA_HOME: /path/to/apache-tomcat-8.5.47 Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp Using JRE_HOME: /path/to/Java/jdk1.8.0_231/ Using CLASSPATH: /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
EclipseにTomcatを設定します。
- Eclipseを起動する
- [設定]ダイアログ > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択
- [Tomcat ホーム] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
- [コンテキスト宣言モード] > [コンテキスト・ファイル]を選択
- [適用して閉じる]ボタンで[設定]ダイアログを閉じる
- [サーバー]タブ > 右クリック > [新規] > [サーバー] > ダイアログを表示
- [Apache] > [Tomcat v8.8 Server]を選択 > [次へ>]ボタン
- [Tomcatインストール・ディレクトリー:] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
- [JRE:] > インストールしたTomcatに合ったバージョンを選択(Apache Tomcat® - Which Version Do I Want?) > [完了]ボタンでTomcatを追加する
- [サーバー]タブに表示されたTomcatをダブルクリック > [ポート] > 変更の必要があれば変更する(他のサーバと被らない様にする等)
失敗したこと
Java/bin/java: No such file or directory
# shutdown.shを実行したら怒られました。 $ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh Using CATALINA_BASE: /path/to/apache-tomcat-8.5.47 Using CATALINA_HOME: /path/to/apache-tomcat-8.5.47 Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp Using JRE_HOME: /c/Program Files (x86)/Common Files/Oracle/Java Using CLASSPATH: /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar /path/to/apache-tomcat-8.5.47/bin/catalina.sh: line 520: /c/Program Files (x86)/Common Files/Oracle/Java/bin/java: No such file or directory
Could not contact [localhost:8005]. Tomcat may not be running.
# shutdown.shを実行したら怒られました。 $ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh Using CATALINA_BASE: /path/to/apache-tomcat-8.5.47 Using CATALINA_HOME: /path/to/apache-tomcat-8.5.47 Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp Using JRE_HOME: /path/to/Java/jdk1.8.0_231/ Using CLASSPATH: /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar 11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer ▒d▒▒: Could not contact [localhost:8005]. Tomcat may not be running. 11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer ▒d▒▒: Catalina.stop: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ...省略...
- 原因:起動と停止で対象にしているポートが違うから
- 対応:server.xmlでポートを変更する
<!--変更前--> <Server port="8005" shutdown="SHUTDOWN"> <!--変更後--> <Server port="8080" shutdown="SHUTDOWN">
The CATALINA_HOME environment variable is not defined correctly
# バッチを使ったら怒られた。 $ /path/to/apache-tomcat-8.5.47/bin/startup.bat The CATALINA_HOME environment variable is not defined correctly This environment variable is needed to run this program
次は、Spring MVC の設定をしていきます。
EclipseでMavenのプロジェクトにSpringとJSPを設定する
- Eclipseをインストールします
- Mavenプロジェクトを作成します。
- Eclipseの設定をします。
- Spring をpom.xmlに設定します。
- Web.xmlを編集します。
- 次は、Tomcatを設定します。
- 困った
- 出典
Mavenプロジェクトを作成します。
Eclipseの設定をします。
Eclipseのデフォルトを使用しない場合に設定を行います。
- 環境
Workspace全体の設定
Spring をpom.xmlに設定します。
pom.xmlって何?
Mavenは、Project Object Modelに基づいたプロジェクト管理ツールです。
Project Object Modelを略すとPOMです。
pom.xmlにはプロジェクトの情報を設定します。
pom.xmlに依存関係を設定します。
pom.xmlに設定する
必要なタグがない場合は保管機能を使って追記します。
Spring IO Platformの dependencyManagement 定義をインポートして依存ライブラリのバージョンを管理します。
- 以下定義を project の dependencyManagement の dependencies に追記します。
<!-- https://mvnrepository.com/artifact/io.spring.platform/platform-bom --> <dependency> <!-- Spring IO Platformは、Springのアプリ開発・実行で必要な各種ライブラリやサードパーティライブラリのバージョンを決定し、依存関係を解決するためのSpringサブプロジェクトです。 --> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>2.0.8.RELEASE</version> <type>pom</type> <scope>import</scope><!-- 追記します。 --> </dependency>
Servlet APIのjarを依存ライブラリとして指定します。
- jarを依存ライブラリに追加すると src/main/webapp/index.jsp で発生していたエラーを解消できます。
- 以下定義を
の に追記します。
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 --> <scope>provided</scope> </dependency>
JSP Standard Tag Library(JSTL)のjarを依存ライブラリとして指定します。
- jarを依存ライブラリに追加することでJSPの実装を手助けしてくれるタグを利用できるようになります。
- 以下定義を
の に追記します。
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-jstlel --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-jstlel</artifactId> <version>1.2.5</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 --> </dependency>
コンパイルするソースファイルとコンパイルして出力するJavaの互換バージョンを指定します。
- 以下定義を
の の の に追記します。
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin --> <dependency><!-- <plugin>タグに変更します。 --> <groupId>org.apache.maven.plugins</groupId><!-- 削除します。 --> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version><!-- バージョンはSpring IO Platformで管理されているバージョンが適用されるので削除します。 --> <configuration><!------ ▼追記します。 ---> <source>1.8</source><!--- プロジェクトの[Javaコンパイラー]に設定したバージョンを指定します。 ---> <target>1.8</target><!--- Java8を指定します。 ---> </configuration><!--- プロジェクトの[Javaコンパイラー]に設定したバージョンを指定します。 ---> </dependency><!-- </plugin>タグに変更します。 -->
書き終わったpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qiita.ponsuke0531</groupId> <artifactId>trySpring</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>trySpring Maven Webapp</name> <url>http://maven.apache.org</url> <dependencyManagement> <dependencies> <!-- https://mvnrepository.com/artifact/io.spring.platform/platform-bom --> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>2.0.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-jstlel --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-jstlel</artifactId> </dependency> </dependencies> <build> <finalName>trySpring</finalName> <pluginManagement> <plugins> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
Web.xmlを編集します。
- src/main/webapp/WEB-INF/web.xml を開きます。
(必要があれば)動的Webモジュールのバージョンをプロジェクト指定に変更します。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"<!--ここ--> version="3.0"><!--ここ-->
JSPを設定します。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <jsp-config> <!-- JSPに関する共通的な定義. --> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <!-- JSPファイルの文字コード指定. --> <page-encoding>UTF-8</page-encoding> <!-- 各JSPファイルの先頭にインクルードするJSPファイルの指定. --> <include-prelude>/WEB-INF/include.jsp</include-prelude> </jsp-property-group> </jsp-config> </web-app>
web.xmlで指定したJSPファイルを作成して JSP Standard Tag Library(JSTL) のtaglib定義を追加します。
taglibの定義を追加することで、どのJSPからもJSTLのtaglibが利用できるようになります。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
次は、Tomcatを設定します。
困った
プロバイダの迷惑メール対策にOP25B
- 前回の勉強内容
- メールのざっくりとした流れ
- OP25Bは、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止します。
- IP25Bは、外部のコンピュータからネットワーク内のTCPポート25番への通信を禁止します。
- 次回の勉強内容
前回の勉強内容
メールのざっくりとした流れ
OP25Bは、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止します。
- 正式 : Outbound(外に向かう) Port 25 Blocking
ネットワークの境界にあるルータなどの機器で、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止することで、インターネットサービスプロバイダなどが会員のパソコンからスパムメールが送信されるのをブロックするために行っています。
OP25Bとは、ネットワークの境界にあるルータなどの機器で、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止すること。インターネットサービスプロバイダ(ISP)などが会員のパソコンからスパムメールが送信されるのをブロックするために行っている。
OP25B(Outbound Port 25 Blocking)とは - IT用語辞典 e-Words
インターネットサービスプロバイダ(ISP)が,OP25Bを導入する目的はどれか。
イ. ISP管理外のネットワークに向けてISP管理下のネットワークから送信されるスパムメールを制限する。
平成29年春期問15 OP25Bを導入する目的はどれか|情報処理安全確保支援士.com
25番のポートはメール送信において、SMTPでデータを送る際に利用するウェルノンポートです。
ウェルノウンポートという特定のサービスやプロトコルが利用することが広く知られているポートがあります。
ウェルノウンポートとは、TCP/IPによる通信で利用されるTCPやUDPのポート番号のうち、著名なサービスやプロトコルが利用するために予約されている0番から1023番のこと。
ウェルノウンポート(well-knownポート)とは - IT用語辞典 e-Words
SMTPとは、電子メールを伝送するための通信手順の一つです。
利用者(の使うメールソフト)からメールサーバに送信依頼する際や、メールサーバ間でメールを転送する際にシステム間で交わされる要求や応答のデータ形式、伝送手順などを定めている。
SMTP(Simple Mail Transfer Protocol)とは - IT用語辞典 e-Words
なんでこんな事するの?
25番ポートの送信を塞ぐことでメールの送信ができなくなります。
クライアント・ソフトウェアからの送信だけでなく、メール・サーバ間での中継でも利用される。そのため、一般的には、認証なしで接続、利用できるようになっている。もしSMTPプロトコルで認証を必須にしてしまうと、任意のドメインからのメールを受け付けることができなくなるからだ。
スパム・メールの送信を制限するOutbound Port 25 Blockingとは − @IT
spamメールやvirusメールは、 しばしば自ネットワーク(ISP)のメールサーバを用いず、 送信先メールサーバのTCP 25番ポートへ直接接続して配送されます。 こういった状況から、 外部のメールサーバへの通信をできなくすることでspamメールやvirusメールの送信が抑止されることを期待するものです。
インターネット用語1分解説~OP25B(Outbound Port 25 Blocking)とは~ - JPNIC
IP25Bは、外部のコンピュータからネットワーク内のTCPポート25番への通信を禁止します。
OP25Bが内側から外側への怪しいメール送信をブロックするのに対し、IP25Bは外側から内側への怪しいメール送信をブロックします。
インターネットサービスプロバイダ(ISP)が,スパムメール対策として導入するIP25Bに該当するものはどれか。
答. 他社ISPのネットワークの動的IPアドレスから自社ISPのメールサーバへのSMTP通信を制限する。
情報処理安全確保支援士令和2年秋期 午前Ⅱ
次回の勉強内容
メールを書くときに使う文法はRFC 5322です。
- 前回の勉強内容
- メールのざっくりした流れ図
- メールを書くときにRFC 5322を使います。
- ヘッダ情報は、「フィールド名:フィールド本文CRLF」で構成されます。
- はてなブログからもらったメールを土台に見てみます。
- 次回の勉強内容
前回の勉強内容
メールのざっくりした流れ図
メールを書くときにRFC 5322を使います。
インターネット標準 RFC 5322(旧 RFC 822)に準拠した電子メールにおいて,ヘッダと本体を区別する方法はどれか。
ア. <header>と </header>で囲まれた部分をヘッダ,
とで囲まれた部分を本体とする。
イ. 1個のピリオドだけから成る行の前後でヘッダと本体を分ける。
ウ. Subjectフィールドがヘッダの最後であり,それ以降を本体とする。
エ. 最初に現れる空行の前後でヘッダと本体を分ける。>>>正解
平成26年秋期問20 メールヘッダと本体を区別する方法|情報処理安全確保支援士.com
RFC 5322とは、メールのフレームワークにおいてコンピュータ利用者間で送信されるテキストメッセージの文法です。
RFC 5322とは、IETFが発行するRFCという文書の一つで、電子メールのフレームワークにおいてコンピュータ利用者間で送信されるテキストメッセージの文法、インターネットメッセージフォーマット(IMF)を規定しています。
いつもメーラーによろしくやってもらっているけどちゃんと決まりがあるんです!
IETFとは、インターネット技術の標準を定める団体です。
IETFは、インターネット技術の標準化を推進する任意団体です。 コンピュータシステムを相互接続するため、 共通の技術仕様策定を議論するグループから発展したものです。
インターネット用語1分解説~IETFとは~ - JPNIC
RFCとは、インターネットの標準を定めた文書です。
RFC 【Request For Comments】
RFCとは、インターネット技術の標準化などを行うIETF(Internet Engineering Task Force)が発行している、技術仕様などについての文書群。TCP/IP関連のプロトコル(通信規約)の標準仕様などが記されたもので、インターネット上で公開されており誰でも入手・閲覧することができる。
RFC(Request For Comments)とは - IT用語辞典 e-Words
- (旧 RFC 822)って書いてあるのは、いろいろ改訂してきたからなんです。
- 1982年 : RFC 822: Standard for the Format of Arpa Internet Text Messages
- 2001年 : RFC2822(Internet Message Format) : RFC 822の改訂版
- 2008年 : RFC5322(Internet Message Format) : RFC 2822の改訂版
ヘッダ情報は、「フィールド名:フィールド本文CRLF」で構成されます。
メールの情報は、フィールドを定義して書かれています。
ヘッダフィールドは、フィールド名の次にコロン(":")、次にフィールドの本文、最後に CRLF で終了する行である。フィールド名は(コロンを除く)印刷可能な US-ASCII 文字で構成されなければならない。フィールド本文は CR と LF とを除く任意の US-ASCII 文字のほかに、空白・水平タブの各文字で構成されてよい。<省略>
必須のヘッダフィールドは発信日付フィールドと発信元アドレスフィールドだけである。それ以外のすべてのヘッダフィールドは文法的にはオプションである。
2.2. ヘッダフィールド | RFC5322(Internet Message Format)
発信日付フィールドには、メール配送システムへの投入準備ができたことをメッセージ作成者が示した日付と時刻を書きます。
Date: Sat, 24 Feb 2018 12:59:20 +0900
発信元フィールドには、メッセージの送信元のメールボックスを書きます。
発信元フィールド | 書く内容 |
---|---|
From: | メッセージの作者のアドレス |
Sender: | メッセージの実際の送信に責任を持つ代理人のメールボックス(実際に送った人的な) このフィールドがない時は送信者が作者と同一ということ。 |
Reply-To: | メッセージの返信先 このフィールドがない場合の返信先はFrom:にあるアドレス |
From: "はてなブログ " < noreply+blog-anniversary_mail@hatena.ne.jp>
宛先アドレスフィールドには、メッセージの受信者を書きます。
宛先アドレスフィールド | 書く内容 |
---|---|
To: | メッセージの主要な受信者 |
Cc: | メッセージの内容はその人たちに向けられたものではないかもしれないが、それを受け取るべき人のアドレス |
Bcc: | メッセージの受信者を表すが、他の受信者に公開されないアドレス |
To: hoge@hoge.com
識別フィールドは、必須じゃないんだけど「書くべき」とされています。
「Message-ID:」フィールドには、ユニークなメッセージ識別子を書きます。
Message-Id: <20180224035920.A26A21B80B9@smtp01.hatena.ne.jp>
「Message-ID:」フィールドを書くことで、特定のメッセージの特定のバージョンを表しユニーク性はそれを生成したホストによって保証されます。
メッセージ識別子は機械的に読み取られることを目的としており、その後に修正されたメッセージはそれぞれ新しいメッセージ識別子を持つことになります。
識別フィールド | 書く内容 |
---|---|
Message-ID: | ユニークなメッセージ識別子 |
In-Reply-To: | 返信元メッセージの「Message-ID:」フィールドの内容 |
References: | 返信元メッセージの識別フィールドの値 |
情報フィールドには、メッセージに関して人が読むことのできる情報を書くけど必須ではありません。
「Subject:」には、メッセージの見出しを表す短い文字列、件名を書きます。
Subject: はてなブログ/ponsuke_tarou(id: ponsuke_tarou) さま、ponsuke_tarou’s blogを開設して1年が経ちました
返信では、「Re:」の後に元のメッセージの "Subject:" フィールドの内容を続けてもいいです。必須ではありません。
他の文字列や二つ以上の "Re: " が使用されるのは望ましくないため、文字列 "Re: " をひとつだけ使うのが好ましいそうです。
そういえば、社会人なり立ての十数年前にメーラの件名では見切れるぐらい「Re:」が連続しているメールをちょいちょい見かけて「わかりずらいよ」と思ったことがありました。
情報フィールド | 書く内容 |
---|---|
Subject: | メッセージの見出しを表す短い文字列、件名 |
Comments: | メッセージボディに関する任意の追加コメント |
Keywords: | 受信者にとって役に立つかもしれない重要な単語や語句のカンマ区切りリスト |
再送フィールドには、メッセージの特定の再送に関連する情報を書きます。
再投入のたびに個別の再送フィールドの集合が追加されるべきである(SHOULD)。メッセージの特定の再送に関連するすべての再送フィールドはひとまとめにして置かれるべきである(SHOULD)。再送フィールドの新しい集合はメッセージの先頭に追加される。したがって、もっとも新しい再送フィールドがメッセージの前方に現れる。再送フィールドが追加されるとき、そのメッセージの他のフィールドは変更されない。<省略>
再送フィールドは、そのメッセージがユーザーによって配送システムに再投入されたことを識別するために使用される。再送フィールドを使用する目的は、最終受信者に対してそのメッセージが元の送信者から(元のフィールドはすべて同じままで)直接送られたかのように見せることである。
RFC5322(Internet Message Format)
返信の時に欲しいフィールド | 対応する再送フィールド | 内容 |
---|---|---|
MUST | Resent-Date: | メッセージの再送信者がその再送メッセージを発信した日付と時刻 |
MUST | Resent-From: | メッセージを再送した人またはシステムのメールボックス |
「Resent-From:」と同じ場合、使用されないべき(SHOULD NOT)。 | Resent-Sender: | 一人または複数の人に代わってメッセージを再送した個人 |
SHOULD | Resent-Message-ID: | 再送メッセージのためのユニークな識別子 |
※. 他にもフィールドはあります。
トレースフィールドは、情報提供用です。
- このフィールドの詳しい文法は、RFC 5321 - Simple Mail Transfer Protocolに定義されているそうです。
Received: by 10.100.164.108 with SMTP id h99csp1614716pje; Fri, 23 Feb 2018 19:59:21 -0800 (PST) Return-Path: <noreply+blog-anniversary_mail@hatena.ne.jp> Received: from smtp01.hatena.ne.jp (gw.hatena.ne.jp. [59.106.108.66]) by mx.google.com with ESMTP id a21sixxxxxxxpgw.xxx2018.02.23.19.59.20 for <hoge@hoge.com>; Fri, 23 Feb 2018 19:59:21 -0800 (PST)
はてなブログからもらったメールを土台に見てみます。
Delivered-To: hoge@hoge.com Received: 一番上の Received が受信側メールサーバ X-Google-Smtp-Source: 「X-」始まりで、Gmailがつけている X-Received: by 「X-」で始まる項目は、メール送信者やサーバ側で任意に設定できる ARC-Seal: i=1; a=rsa-sha256; t=.................................. ARC-Message-Signature: i=1; a=rsa............................ ARC-Authentication-Results:.......................................... Return-Path: <noreply+blog-anniversary_mail@hatena.ne.jp>送信先のメールアドレスに届けられない場合、サーバが自動的に送信者へ通知するための宛先 Received: 経由したサーバのIPアドレスやドメイン名、送信元のIPアドレスやドメイン名などで、経由したサーバの数だけ Received が記録される Received-SPF: SPF認証情報とドメイン送信元サーバーを照合した結果 Authentication-Results: 送信ドメイン認証の結果。RFC 5451にて標準化 Received: from ヘッダ一番下の Received が送信元 From: "はてなブログ " < noreply+blog-anniversary_mail@hatena.ne.jp> To: mana.ukigaya.opentone@gmail.com Subject: はてなブログ/ponsuke_tarou(id: ponsuke_tarou) さま、ponsuke_tarou’s blogを開設して1年が経ちました Date: Sat, 24 Feb 2018 12:59:20 +0900 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="メールを情報を区切る文字" Message-Id: <20180224035920.A26A21B80B9@smtp01.hatena.ne.jp> --メールを情報を区切る文字 Date: Sat, 24 Feb 2018 12:59:20 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 メッセージ本文の部分 メッセージのボディは単純な US-ASCII 文字からなる行である。ボディに課される制限は以下の二つだけである: CR と LF とは CRLF としてのみ現れなければならず(MUST)、ボディ内にそれらが独立して現れてはならない(MUST NOT)。 ボディ内の各行は CRLF を除いて 998 文字までに制限されなければならならず(MUST)、78 文字までに制限されるべきである(SHOULD)。 [http://srgia.com/docs/rfc5322j.html#p2.3:title] --メールを情報を区切る文字 Content-Type: MIME-Type; name="添付ファイルの名前" Content-Disposition: attachment; filename="添付ファイルの名前" Content-Transfer-Encoding: base64 添付ファイルを文字にしたもの --メールを情報を区切る文字--
次回の勉強内容
プログラムの気持ちを理解したいから逆ポーランド表記法
- 前回の勉強内容
- 逆ポーランド表記法とは、コンピュータが理解しやすい記述方法です。
- 「逆」じゃないポーランド表記法とは、演算子を数値の前に置く記法です。
- 人がよく使うのは、中置記法です。
- 次回の勉強内容
逆ポーランド表記法とは、コンピュータが理解しやすい記述方法です。
- 別名 : Reverse Polish Notation / 後置記法
- 数式やプログラムを記述する方法の一種。
- コンピュータで処理するのに都合のいい形の、数式の書き方。
ポーランド記法をコンピュータでの利用に適した形に改変したものである。
逆ポーランド記法 - Wikipedia
コンピュータのプログラミングにおいて、算術式を表記する手法の一つである。
逆ポーランド記法とは何? Weblio辞書
コンピュータで数式を計算する時、逆ポーランド法が都合が良い方法ため利用します
数式を逆ポーランド法に変換するための事柄
逆ポーランド記法で記述された数式x 1 2 - 3 + =は、「xに1から2を引いた(-)ものに3を足して(+)代入する(=)」と読むことができます。 より機械的な表現にすれば「xに、1に2を-して、それに3を+して、それを=する」と読むこともできます。 つまり、この表記においては、演算対象と演算処理が処理順に記述されることになります。 プログラミングなどではx = 1 - 2 + 3;といった式を書きますが、実は実行時にはスタックというものを使って逆ポーランド記法的に計算しています。
二分木を使った数式の逆ポーランド記法化と計算 - Programming/Tips - 総武ソフトウェア推進所
「A+B×C」の逆ポーランド表記法はどうなるでしょう?
式A+B×Cの逆ポーランド表記法による表現として,適切なものはどれか。
ア. +×CBA イ.×+ABC ウ. ABC×+ エ.CBA+×
平成23年秋期問1 逆ポーランド表記法|情報処理安全確保支援士.com
演算子を被演算子の後に記述します。
逆ポーランド記法の利点
- カッコが不要
- 左から順に処理していけば計算結果が得られる
ここでは、Y=(A+B)×(C-(D÷E))という式をポーランド表記法で表現する例を説明します。 木で表現し、節から上に出るときにそこの記号を書いていくと以下のようになります。
ポーランド表記法―逆ポーランド記法の利点や欠点、例など
「逆」じゃないポーランド表記法とは、演算子を数値の前に置く記法です。
- 別名 : Polish notation / 前置記法
ポーランド記法とは、数式表現の表記法の一つで、演算子を数値の前に置く記法のことである。考案者がポーランド人の論理学者であったことからこのように呼ばれる。
ポーランドきほうとは何? Weblio辞書
次回の勉強内容
MacにHomebrewでPostgreSQLをインストールしてデータベースを作る
環境
OS : macOS Hight Sierra v10.13.2
Homebrew : 1.5.2
HomebrewでPostgreSQLをインストールして起動する
Homebrewを最新化してインストールする準備をする
# 異常がないか確認する $ brew doctor Your system is ready to brew. # アップデートする $ brew update Updated 5 taps (homebrew/science, homebrew/core, homebrew/php, homebrew/versions, caskroom/cask). ==> New Formulae amber kallisto <省略> # バージョンを確認する $ brew -v Homebrew 1.5.2 Homebrew/homebrew-core (git revision 5c4df; last commit 2018-01-25)
HomebrewでPostgreSQLをインストールする
# どんなバージョンがあるか確認する $ brew search postgresql ==> Searching local taps... postgresql postgresql@9.4 postgresql@9.5 postgresql@9.6 ==> Searching taps on GitHub... caskroom/cask/navicat-for-postgresql caskroom/cask/photo-supreme-postgresql ==> Searching blacklisted, migrated and deleted formulae... # 今回はv9.6をインストールする $ brew install postgresql@9.6 <省略> ==> Caveats If builds of PostgreSQL 9 are failing and you have version 8.x installed, you may need to remove the previous version first. See: https://github.com/Homebrew/legacy-homebrew/issues/2510 To migrate existing data from a previous major version (pre-9.0) of PostgreSQL, see: https://www.postgresql.org/docs/9.6/static/upgrading.html To migrate existing data from a previous minor version (9.0-9.5) of PostgreSQL, see: https://www.postgresql.org/docs/9.6/static/pgupgrade.html You will need your previous PostgreSQL installation from brew to perform `pg_upgrade`. Do not run `brew cleanup postgresql@9.6` until you have performed the migration. This formula is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/postgresql@9.6/lib CPPFLAGS: -I/usr/local/opt/postgresql@9.6/include To have launchd start postgresql@9.6 now and restart at login: brew services start postgresql@9.6 Or, if you don't want/need a background service you can just run: pg_ctl -D /usr/local/var/postgresql@9.6 start ==> Summary 🍺 /usr/local/Cellar/postgresql@9.6/9.6.6: 3,273 files, 36.8MB
環境変数を設定する
# PATHを設定する $ echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile $ source .bash_profile $ printenv PATH /usr/local/bin:/Users/mana/.phpenv/shims:/Users/mana/.phpenv/bin:/usr/local/bin:/Users/mana/.phpenv/shims:/Users/mana/.phpenv/bin:/usr/local/opt/postgresql@9.6/bin:/usr/local/Cellar/ant/1.10.0/libexec/bin:/usr/local/bin:/usr/local/sbin:/Users/mana/.nodebrew/current/bin:/Users/mana/bin/Sencha/Cmd/6.0.2.14/..:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin # デフォルトのデータディレクトリの場所を設定する $ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.bash_profile $ source .bash_profile $ printenv PGDATA /usr/local/var/postgres
PostgreSQLのデータベースクラスタを作成する
$ pg_ctl initdb -o "-E utf8 -U postgres" The files belonging to this database system will be owned by user "mana". This user must also own the server process. The database cluster will be initialized with locale "ja_JP.UTF-8". initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8" The default text search configuration will be set to "simple". Data page checksums are disabled. creating directory /usr/local/var/postgres ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: /usr/local/Cellar/postgresql@9.6/9.6.6/bin/pg_ctl -D /usr/local/var/postgres -l logfile start
概要
pg_ctl init[db] [-s] [-D datadir] [-o initdb-options]
説明
initまたはinitdbモードはPostgreSQLの新しいデータベースクラスタを作成します。 データベースクラスタとは、単一のサーバインスタンスで管理されるデータベースの集合です。 このモードはinitdbコマンドを呼び出します。 詳しくはinitdbを参照して下さい。
オプション
-D datadir
データベース設定ファイルのファイルシステム上の場所を指定します。 これが省略された場合、環境変数PGDATAが使われます。
-o initdb-options
initdbコマンドに直接渡すオプションを指定します。
このオプションは、確実にひとまとめとして渡すために、通常は単一引用符または二重引用符で囲まなければなりません。
pg_ctl
initdb — PostgreSQLのデータベースクラスタを新しく作成する
概要
initdb [option...] [ --pgdata | -D ] directory
オプション
-E encoding
テンプレートデータベースの符号化方式を選択します。
-U username
データベースのスーパーユーザのユーザ名を選択します。 initdbを実行している実効ユーザの名前がデフォルトです。 スーパーユーザの名前はあまり重要ではありませんが、慣習的に使われているpostgresを(オペレーティングシステムのユーザ名と異なっていても)使っても良いでしょう。
initdb
PostgreSQLサーバを起動してみてみる
$ pg_ctl status pg_ctl: no server running # 起動する $ pg_ctl -D /usr/local/var/postgres -l logfile start server starting $ pg_ctl status pg_ctl: server is running (PID: 68826) /usr/local/Cellar/postgresql@9.6/9.6.6/bin/postgres "-D" "/usr/local/var/postgres" # バージョンをみてみる $ psql -V psql (PostgreSQL) 9.6.6 # データベース一覧をみてみる $ psql -l -U postgres List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) # ユーザ一覧をみてみる $ psql -c 'select * from pg_user' -U postgres usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig ----------+----------+-------------+----------+---------+--------------+----------+----------+----------- postgres | 10 | t | t | t | t | ******** | | (1 row) # ロール一覧をみてみる $ psql -c 'select * from pg_roles' -U postgres rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig | oid -------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+------ postgres | t | t | t | t | t | t | -1 | ******** | | t | | 10 pg_signal_backend | f | t | f | f | f | f | -1 | ******** | | f | | 4200 (2 rows)
psql — PostgreSQLの対話的ターミナル
概要
psql [option...] [dbname [username]]
オプション
-c command
psqlに対し、指定のコマンド文字列commandを実行するよう指示します。 このオプションは繰り返すことができ、また-fオプションと任意の順序で組み合わせることができます。 -cまたは-fが指定されると、psqlは標準入力からコマンドを読み取りません。 その代わりに、すべての-cオプションおよび-fオプションを順に処理した後、終了します。
-l
利用可能な全てのデータベースを一覧表示し、終了します。 この他の接続に関連しないオプションは無視されます。
-U username
デフォルトのユーザではなくusernameユーザとしてデータベースに接続します (当然、そうする権限を持っていなければなりません)。
-V
psqlのバージョンを表示し、終了します。
psql
pg_user
pg_userビューはデータベースユーザに関する情報へのアクセスを提供します。 これはパスワードフィールドを隠蔽したpg_shadowを公に読めるようにしたビューです。
50.81. pg_user
pg_roles
pg_rolesビューはデータベースのロールに関する情報を提供します。 これは単に一般に公開されているpg_authidのビューですが、パスワード列が空白になっています。
50.72. pg_roles
データベースを作ってつなげる
PostgreSQLのユーザを作成する
$ createuser -d -e -P mana -U postgres Enter password for new role: Enter it again: CREATE ROLE mana PASSWORD 'md5a6747d5690695f2d69c556af98aca23b' NOSUPERUSER CREATEDB NOCREATEROLE INHERIT LOGIN; # ユーザ一覧で確認する $ psql -c 'select * from pg_user' -U postgres usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig ----------+----------+-------------+----------+---------+--------------+----------+----------+----------- postgres | 10 | t | t | t | t | ******** | | mana | 16384 | t | f | f | f | ******** | | (2 rows) # ロール一覧で確認する $ psql -c 'select * from pg_roles' -U postgres rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig | oid -------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+------- postgres | t | t | t | t | t | t | -1 | ******** | | t | | 10 pg_signal_backend | f | t | f | f | f | f | -1 | ******** | | f | | 4200 mana | f | t | f | t | t | f | -1 | ******** | | f | | 16384 (3 rows)
createuser — 新しいPostgreSQLのユーザアカウントを定義する
概要
createuser [connection-option...] [option...] [username]
オプション
username
作成するPostgreSQLユーザの名前を指定します。
-d
新しいユーザに対してデータベースの作成を許可します。
-D
新しいユーザに対してデータベースの作成を禁止します。 これはデフォルトです。
-e
createuserが生成しサーバに送信するコマンドを出力します。
-U username
接続に使用するユーザ名です(作成するユーザの名前ではありません)。
-P
このオプションが指定されると、createuserは新しいユーザのパスワードのプロンプトを表示します。 もしパスワード認証を使う予定がなければ、これは必要ありません。createuser
データベースを作成する
$ createdb -e -O mana first-db "はじめてのPsgreSQLのDB" -U postgres CREATE DATABASE "first-db" OWNER mana; COMMENT ON DATABASE "first-db" IS 'はじめてのPsgreSQLのDB'; # データベース一覧で確認する $ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- first-db | mana | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
createdb — 新しいPostgreSQLデータベースを作成する
概要
createdb [connection-option...] [option...] [dbname [description]]
オプション
dbname
作成するデータベースの名前を指定します。 この名前はクラスタ内の全てのPostgreSQLデータベースの中で一意でなければなりません。 デフォルトでは、現在のシステムユーザと同じ名前でデータベースを作成します。
description
新しく作成されるデータベースに関連付けるコメントを指定します。
-e
createdbが生成し、サーバに送信するコマンドをエコー表示します。
-O owner
新しいデータベースの所有者となるデータベースユーザを指定します。 (この名前は二重引用符で囲まれた識別子として処理され
createdb
データベースに繋いでみる
$ psql -U mana -d first-db psql (9.6.6) Type "help" for help. # データベース一覧をみてみる first-db=> \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- first-db | mana | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) # ロール一覧をみてみる first-db=> \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- mana | Create DB | {} postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} # テーブル一覧をみてみる(まだ何もない) first-db=> \d No relations found. # 終了してみる first-db=> \q
psql — PostgreSQLの対話的ターミナル
概要
psql [option...] [dbname [username]]
オプション
-d dbname
接続するデータベースの名前を指定します。 コマンドラインでオプション以外の最初の引数としてdbnameを指定するのと同じ効力を持ちます。
-U username
デフォルトのユーザではなくusernameユーザとしてデータベースに接続します (当然、そうする権限を持っていなければなりません)。
psql
思い出の一枚
EclipseでMavenプロジェクトを作成する方法
Mavenは、Project Object Modelに基づいたJavaのプロジェクト管理ツールです。
ビルドやテスト、依存ライブラリ追加は自動化できる!:Eclipseプラグインq4eでカンタンMaven入門(前編)(1/3 ページ) - @IT
Maven Project を作ります。
- 環境
聞いたことはあるけどよく知らないMyBatisにちょっと近づいてみる
- MyBatisは、O/Rマッパーです。
- ということでMyBatisは、リレーショナルデータベースとJavaプログラムを手軽につなげてくれるフレームワークです。
- Eclipseを使う場合の便利なプラグイン
- MyBatisでエラーになって困った事例集
MyBatisは、O/Rマッパーです。
O/Rマッパーっていうのはオブジェクト指向のプログラムとリレーショナルデータベースをつなげてくれます。
O/RマッパーはObject/Relationalマッパーの略で、オブジェクト指向のプログラムと、RDBをライブラリで橋渡ししようという考え方です。
cfm-art.sakura.ne.jp
ということでMyBatisは、リレーショナルデータベースとJavaプログラムを手軽につなげてくれるフレームワークです。
MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。 MyBatisを使うことで、直接 JDBC を扱うコードを書いたり、クエリ引数やクエリ結果を手動で設定する必要がほとんどなくなります。 MyBatis の設定やデータベースレコードと Java オブジェクトの関連付けは、XML またはアノテーションを使って行うことができます。
MyBatis – MyBatis 3 | イントロダクション
JDBCは、リレーショナルデータベースにアクセスするための標準Java APIです。
Java Database Connectivityの省略という噂はありますがホントの名称はわからないっぽいです。
JDBCを使って「データベースへの接続」「SQLの実行」「データベースからの結果取得」ができます。
このJDBCを直接使うよりもMyBatisをJDBCの手前に置いて使うほうがカンタンにデータベースとプログラムをつなげることができます。
5.2. データベースアクセス(MyBatis3編) — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.1.0.RELEASE documentation
設定やSQLはXMLに書けばMyBatisが頑張ってくれます。
XML 形式の設定ファイルを使って SqlSessionFactory を生成する
XML 形式の設定ファイルには、MyBatis システムの基本設定が含まれます。 例えば、データベースから Connection のインスタンスを取得する DataSource や、トランザクションの制御方法を決定する TransactionManager などです。
XML 形式の設定ファイルの詳細については後ほど改めて説明しますが、ここでは簡単なサンプルを挙げておきます。<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>Mapped SQL Statements について
以下は、先ほどの例で SqlSession のメソッドを呼び出したときに実行されることを想定した XML ベースの Mapped Statement です。<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>BloggerMapper のような Mapper クラスなら、実は XML を使う必要はありません。 代わりに、Java アノテーションを使って下記のように Mapped Statement を記述することができます。
public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); }
5.2. データベースアクセス(MyBatis3編) — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.1.0.RELEASE documentation
Eclipseを使う場合の便利なプラグイン
MyBatis Generatorは、オブジェクトを自動生成してくれます。
- 構成ファイルを作成する
- [実行] > [実行構成] > [MyBatis Generator] > 構成ファイルを選択 > 実行
MyBatisでエラーになって困った事例集
クライアントサーバの3階層システムの基本
3階層システムとは
別名 : 3層システム / 3層クライアントサーバシステム / 3階層アーキテクチャ / 3-tier system
クライアントサーバシステムを
- プレゼンテーション層(ユーザインターフェース部分)
- アプリケーション層(ビジネスロジック部分)
- データ・アクセス層(データベース部分)
の3層に分割して構築したシステム。
クライアントおよびサーバの処理を複数の階層に分離して配置することで、ある階層へ変更を加える必要が生じた際にも柔軟に対応できるようなっている。
3階層システムでは、クライアント側にはユーザインターフェース部分のみを残し、あとはサーバ側に実装する。クライアントはユーザからの操作を受け付け、アプリケーション層からの処理結果を表示することのみを行う。
アプリケーション部分をクライアントから分離してサーバに実装することにより、ビジネスロジックが変更された場合でもサーバ側のアプリケーションを変更するだけでよく、変更がシステム全体に及ぶことは無い。また、大量のデータを扱うシステムでは、ネットワークを通じてクライアントとサーバの間で大量のデータのやり取りをする必要が無くなる。
各層の役割
プレゼンテーション層(ユーザインターフェース層 / UI層)
- ユーザーに情報を表示したり、ユーザーからの入力を受け付けたりする機能を担当するレイヤ
- 細かな変更や拡張が発生しやすい
- 使い勝手を向上させるためのインターフェイスの改善
- 新デバイス対応など(PDAや携帯電話対応など)
などなど
プログラムは、ユーザー・インターフェイスの実装なので、ほかの層に比較すれば、実装やテストにかかるコストはそれほど大きくない
アプリケーション層(ビジネス・ロジック層 / ファンクション層)
- アプリケーションの実際の情報処理を担当するレイヤ
- 業務フローや各種データ処理など、ビジネスで必要な情報処理をソフトウェアとして実装するレイヤ
- 本質的な部分は比較的長期にわたって変わりにくい
- ビジネスの処理そのものをプログラムとして表現したもの
- ユーザー認証やトランザクション処理など、プログラム実装やテストには多大な工数が必要になることが多い
データ層
- データベース・システムへのアクセス・保存機能を組み込むレイヤ
- データベースの構造を変更することはそれほどない
- 本質的なデータ構造自体は何十年も変わらず使い続けられるというケースも少なくない
- ただ・・・
- あらかじめ業務分析をきちんと実施してデータ構造を決定しておく必要はある
- アクセス効率や可用性、セキュリティ性能向上など、運用面からデータベース構造の見直しが発生することはある
- 利用するデータベース・システム(例えばSQL Serverか、Oracleかなど)によって内容が大きく影響を受ける
- 逆に考えると・・・
- データ層を独立させることで、データベース・システムの違いから、ビジネス・ロジック層を分離できるというメリットがある
- 逆に考えると・・・
3層構造はMVCと一緒のものでしょうか?
層構造をお勉強していて思った、「MVCモデルと似てない?」「一緒?」
- プレゼンテーション層 - View
- アプリケーション層 - Controll
- データ層 - Model
な感じ?
「3層構造」「MVC」なんかでググるとすぐにわかります。それは間違いです。
違い : 3層構造は直線でつながる
MVCは三角でつながる -> プレゼンテーション層とデータ層はつながらないが、ViewとModelはつながる
違い : 表しているものが違う
- 3層構造 : データベース〜ユーザーの間の情報経路
- MVC : ユーザインタフェースにおける画面上のコンポーネントの管理方法
という訳で違う、その違うものを対応させようとしたのがおかしいという結果です。
思い出の一枚
NetBeansにGlassFishを設定する方法
NetBeansをインストールしたのでGlassFishを設定します。
ponsuke-tarou.hatenablog.com
GlassFishが設定できました。
MacにNetBeansをインストールする方法
dmgをダウンロードします
- NetBeansのサイトをブラウザで表示します。
- 言語とOSを選択します。
- .dmgをダウンロードします。
NetBeansをインストールします
- NetBeans8.2.pkgを押下します。
- [Continue]ボタンを押下して進みます。
- ライセンスの説明を読んで[Agree]を押下します。
- [Install]を押下します。
- 使い終わったものはゴミ箱へ。