セキュリティを意識したプロトコル達
- 前回の勉強内容
- 勉強のきっかけになった問題
- IPsecは、IPでの暗号化技術を使った安全なインターネット用の通信プロトコルです。
- L2TPは、送信情報を運ぶトンネルのプロトコルです。
- RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。
- SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
暗号化や認証機能を持ち,遠隔にあるコンピュータを操作する機能をもったものはどれか。
ア. IPsec イ. L2TP ウ. RADIUS エ. SSH
平成26年秋期問11 SSH|情報処理安全確保支援士.com
RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。
- 正式 : Remote Authentication Dial In User Service
- 読み方:ラディウス、ラディアス
流れは、
- 不正なクライアントやサーバが使えないように、クライアントとサーバの間に共通暗号鍵を設定します。
- この共通暗号鍵を「Shared Secret」といいます。
- クライアントから送られてきたユーザの情報で、サーバは認証を行います。
- クライアントが送る情報を「Access-Requestメッセージ」といいます。
- サーバは、認証を行い結果をクライアントへ送信します。
サーバが送る応答 | パケットの種別 | 意味 |
---|---|---|
アクセス許可 | Access-Accept | 認証結果がOK |
アクセス拒否 | Access-Reject | 認証結果がNG |
アクセスチャレンジ | Access-Challenge | 不正アクセスを防ぐために 再度パスワードの入力などを要求 |
SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。
- 英語:(Secure:安全) + (Shell:コマンド入力を受け付けて解釈するプログラム)
Telnetも別のコンピュータと通信するプロトコルですが、暗号化はしていません。
残念なことに、暗号化していないのでのぞき見し放題です。
https://community.fs.com/blog/which-client-software-is-better-for-telnet-and-ssh.html
そこでSSH!通信経路が暗号化されているのでインターネットなどを経由しても安全に通信できます。
SSHのプロトコルには、「SSH1」と「SSH2」の2種類があります。
SSH1は、RSA公開鍵暗号方式を使います。
SSH2は、DSA公開鍵暗号方式を使います。が、RSA公開鍵暗号が使えるようになり「SSH2でRSA公開鍵暗号を使う」がおすすめです。
RSAは特許の問題から使用が制限されており、特許問題を回避するためにDSAを採用したSSH2が登場したという背景があるものの特許は2000年9月で失効し、SSH2でもRSAを利用して認証できるようになりました。
次回の勉強内容
根性で不正ログインを頑張るブルートフォース攻撃
前回の勉強内容
勉強のきっかけになった問題
共通鍵暗号の鍵を見つけ出す,ブルートフォース攻撃に該当するものはどれか。
- 1組の平文と暗号文が与えられたとき,全ての鍵候補を一つずつ試して鍵を見つけ出す。
- 平文と暗号文と鍵の関係を代数式に表して数学的に鍵を見つけ出す。
- 平文の一部分の情報と暗号文の一部分の情報との間の統計的相関を手掛かりに鍵を見つけ出す。
- 平文を一定量変化させたときの暗号文の変化から鍵を見つけ出す。
不正アクセスや不正ログインする攻撃はよくあります。
攻撃 | 手法 |
---|---|
ブルートフォース攻撃 | パスワードをどんどん変えて正解を探す |
リバースブルートフォース攻撃 | IDをどんどん変えて正解を探す |
パスワードリスト攻撃 | ヒントを仕入れてIDとパスワードを推測して正解を探す |
パスワードスプレー攻撃 | IDとパスワードをどんどん変えて正解を探す |
ブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してパスワードや鍵を見つける攻撃です。
- 別名:ブルートフォースアタック、総当たり攻撃
- 英語 : (brute force:力ずくの) + (attack: 攻撃)
辞書ツールやら考えられるすべての情報を使って文字列の組み合わせを全て試していく、根性の攻撃です。
パスワードの文字数や文字種が少ないと被害にあいやすいです。
独立行政法人情報処理推進機構セキュリティセンターが、パスワードに使用している文字の種類別に解読の所要時間をまとめたもの
ブルートフォースアタックとは?実験から分かる危険性と有効な4つの対策
リバースブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してIDを見つける攻撃です。
- 別名:リバースブルートフォースアタック、逆総当たり攻撃
- 英語 : (reverse:逆の) + (brute force:力ずくの) + (attack: 攻撃)
世の中には、規定回数パスワードを間違えるとロックされるアカウントロックというものがあります。
残念なことに、IDを変えていくのでアカウントロックされにくいです。
ブルートフォース攻撃の逆で、パスワードに固定文字列を使ってIDを変えながら試していきます。
パスワードリスト攻撃は、どっかで仕入れた情報をもとにIDとパスワードを推測して攻撃します。
- 別名:リスト型攻撃、パスワードリスト型攻撃、アカウントリスト攻撃、リストベース攻撃、リストベースアタック、リストアタック
いろんなサイトで同じようなIDやパスワードを使っていると被害にあいやすいです。
パスワードスプレー攻撃は、ブルートフォース攻撃とリバースブルートフォース攻撃をいい感じに合わせています。
- 別名:low-and-slow攻撃
決まった期間に決まった回数ログインに失敗するとアカウントロックがかかります。
だから、「パスワードを固定していろんなIDを試す」をひたすら繰り返します。
アカウントロックされたら別のIDでまた試します。
ついでに、不正を検知されないようにIPアドレスを変えたり、時間をずらして実行したりします。
次回の勉強内容
Webサイトでの認証技術であるベーシック認証とダイジェスト認証を知る。
- 前回の勉強内容
- 勉強のきっかけになった問題
- HTTPの認証機能を使用することで、Webサイトにアクセスできる権限を持っているかを確認します。
- ベーシック認証は、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信します。
- ダイジェスト認証は、パスワードをハッシュ値にして送信します。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
HTTPの認証機能を利用するクライアント側の処理として,適切なものはどれか。
HTTPの認証機能を使用することで、Webサイトにアクセスできる権限を持っているかを確認します。
会員サイトなどのWebサイトを特定の人々だけ見れるようにするには認証機能を使用します。
認証機能を使用することでWebページを見られる人かを確認します。
ベーシック認証は、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信します。
- 別名:基本認証
- 利点:多くのWebサーバが対応しています。
- 欠点:盗聴や改竄が簡単にできます。
認証の流れは、
1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401を返す
- HTTPステータスコード:Webサーバがレスポンスの意味を表す3桁のコードです。
- 別名:レスポンスコード
- 401(Unauthorized):「認証が必要だよん」とWebサーバは言っている。
WWW-Authenticate ヘッダーは 401 Unauthorized 応答と共に送られます。
例
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"
WWW-Authenticate - HTTP | MDN
3. クライアントがBase64エンコードしたユーザ名とパスワードをAuthorizationヘッダに指定して送る
例
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Authorization - HTTP | MDN
4. Webサーバが認証する
ダイジェスト認証は、パスワードをハッシュ値にして送信します。
- 英語:digest authentication
- 別名:HTTPダイジェスト認証
- 利点:ベーシック認証で防げなかった漏洩やら改ざんができます。
- 欠点:対応していないブラウザがあります。
認証の流れは、
1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401だけではなく「認証領域」や「認証方式」、「ランダムな文字列」を返す
- ここの
- 認証領域は、realm
- 認証方式は、Digest(ダイジェスト認証だよと知らせる)
- ランダムな文字列は、
- nonce(認証要求ごとに生成される一時的なデータでチャレンジともいう)
- opaque(ランダムに生成されるデータ)
- といいます。
3. クライアントがランダムな文字列を生成して、ユーザ名・パスワードと「2つのランダムな文字列」を使ってハッシュ文字列を生成する
4. クライアントは「2つのランダムな文字列」と「ハッシュ文字列」を送信する
MD5は、文字列から128ビットの値のハッシュ値を生成するハッシュ関数です。
- 正式:Message Digest 5
- 規約:RFC 1321
- 特徴:
- 同じ入力値は必ず同じ値になる
- 少しでも異なる入力値は全然違う値になる
- 不可逆な一方向関数を含むのでハッシュ値から効率よく入力値を割り出すことはできない
- 欠点:入力値がハッシュ値より長い場合、複数の異なる入力値なのに同じハッシュ値になってしまう「ハッシュ値の衝突」が起こる
# MD5でハッシュ値を生成する $ echo 'tarou' | md5 961ed3c18a02b9b87bcd3efa9eb2a0a9 # ちょっと違う文字だとぜんぜん違うハッシュ値が生成される $ echo 'taroo' | md5[f:id:ponsuke_tarou:20181005164602j:plain] e11337e5c8ce85a437712f57c63249e8 $ echo 'tarou' | md5 26223ea272f3f0e42cf872c01b9ba8ec
- 前回勉強したメールの認証:CRAM-MD5でも使っています。
次回の勉強内容
DDL と DLL の違い
DDLとは、テーブル構造を定義する言語です。
- 正式名称:Data Definition Language
- 別名:データ定義言語
- リレーショナルデータベースのテーブルを制御する言語。
「CREATE」「DROP」「ALTER」などが書いてあるやつです。
- テーブル全体の作成・変更・削除などを行う際に使用する。
仲間には、レコード単位の操作を行うDMLがあります。
- 正式名称:Data Manipulation Language
- 別名:データ操作言語
- リレーショナルデータベースのレコードを制御する言語。
- テーブル内のレコードの追加・検索・更新・削除などを行う際に使用する。
「SELECT」「INSERT」「UPDATE文」「DELETE」などが書いてあるやつです。
- データベースにおいてデータの検索・新規登録・更新・削除を行うための言語である。
DLLとは、プログラムを動かす時に使う部品です。
- 正式名称:Dynamic Link Library
- 別名:共有ライブラリ、シェアドライブラリ、動的リンクライブラリ
- 様々なプログラムから利用される汎用性の高い機能を収録した、部品化されたプログラムのこと。
- 単体で実行することはできず、実行可能ファイル(EXEファイルなど)が起動する際に自動的に連結されてメモリ上に展開される。
- 多くのプログラムが共通して必要とする機能が収められており、様々なプログラムの一部として取り込まれて実行される。
メール送信での認証技術に POP before SMTP と SMTP-AUTH
- 前回の勉強内容
- むかしむかし、SMTPには認証の仕組みがありませんでした。
- POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。
- SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。
- 次回の勉強内容
前回の勉強内容
むかしむかし、SMTPには認証の仕組みがありませんでした。
それに伴い、大量のメールを送り付ける「迷惑メール」が流行りました。
そこでメール送信時の認証技術として、「POP before SMTP」「SMTP-AUTH」ができました。
- 送信処理と転送処理を同一の仕組みで扱っている
- メールの投稿をするユーザを認証する仕組みがない
- 暗号化機能が標準で実装されていないため通信経路上を平文のメッセージが流れる
などの脆弱性があり、特に1,2の原因によって複数のメールサーバの第三者中継を利用した迷惑メールの温床となっていました。
平成18年秋期問74 SMTP-AUTH認証はどれか|応用情報技術者試験.com
POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。
SMTPに認証の仕組みはないけれど、メール受信で使うPOP3にはIDとパスワードによる認証の仕組みがあります。
SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。
SMTP-AUTHの特徴はどれか。
クライアントがSMTPサーバにアクセスするときにユーザ認証を行い、許可されたユーザだけから電子メールを受け付けます。
SMTP-AUTHにおける認証の動作を説明したものはどれか。
ア. SMTPサーバは,クライアントがアクセスしてきた場合に利用者認証を行い,認証が成功したとき電子メールを受け付ける。
平成26年秋期問37 SMTP-AUTHにおける認証の動作|応用情報技術者試験.com
SMTP-AUTHの特徴はどれか。
ウ. メールクライアントからメールサーバへの電子メール送信時に,ユーザアカウントとパスワードによる利用者認証を行う。
平成28年秋期問16 SMTP-AUTHの特徴はどれか|情報処理安全確保支援士.com
認証方法には種類があります。
認証方法 | 方法 | 説明 |
---|---|---|
PLAIN | 暗号化しないでユーザー名/パスワードをそのまま送る仕組み | パスワードが平文で流れているので危険な方式 |
LOGIN | 標準化されておらず独自の実装をしているメールサーバーもあって互換性が低い方式 | ユーザー名/パスワードはBASE64に変換される ユーザー名/パスワードを別々に送信したり一緒に送信したりする(やり方はそれぞれ) |
CRAM-MD5 | パスワード文字列がそのままネットワークを流れることがないように、暗号化が施される MD5を使用してチャレンジ-レスポンス認証を行い、パスワードそのものは暗号化された状態でも送信はしない |
流れ 1. サーバーとクライアントが共通に知っているパスワードを用意 2. サーバーは、クライアントに対し任意の文字列(Challenge文字列)を送る 3. クライアントはそのChallenge文字列と共通パスワードを使い、MD5で計算処理を行う 4. 結果をサーバーに返す 5. クライアントからの返答が傍受されても、ここからパスワードを復元するのは困難 6. サーバーは、自分でも同じ処理を行ない、結果が一致すれば相手が正しくパスワードを知っているとして認証する |
DIGEST-MD5 | CRAM-MD5の拡張版で、辞書攻撃や総当り攻撃などに対する耐性を高めたもの |
サブミッションポートを合わせて使います。
スパムメール対策として,サブミッションポート(ポート番号587)を導入する目的はどれか。
エ. SMTP-AUTHを使用して,メール送信者を認証する。
平成28年春期問44 サブミッションポートの導入目的|応用情報技術者試験.com
OP25Bでポート25番を使えないようにして、送信専用ポートとしてサブミッションポート587番を使います。
送信専用となったポート587番にアクセスしたユーザをSMTP-AUTHで認証します。
ponsuke-tarou.hatenablog.com
次回の勉強内容
スパムメール撲滅を目指す送信ドメイン認証技術
- 前回の勉強内容
- 勉強のきっかけになった問題
- メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。
- IPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側がDNSでIPアドレスを検証します。
- 電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名をDNSで公開鍵を取得して検証します。
- DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
スパムメールへの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。
- 送信側メールサーバにおいてディジタル署名を電子メールのヘッダに付与し,受信側メールサーバにおいてそのディジタル署名を公開鍵によって検証する仕組み << 正解
- 送信側メールサーバにおいて利用者が認証された場合,電子メールの送信が許可される仕組み
- 電子メールのヘッダや配送経路の情報から得られる送信元情報を用いて,メール送信元のIPアドレスを検証する仕組み
- ネットワーク機器において,内部ネットワークから外部のメールサーバのTCPポート番号25への直接の通信を禁止する仕組み
出典 : 平成25年 春期 情報セキュリティスペシャリスト試験午前Ⅱ 問16
メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。
残念なことにメールは送信元を偽ることができちゃいます。
スパムメールは送信元を偽装していることが多く、メールのヘッダに書いてある「From」のメールアドレスは安易に信用できません。
そこで、ちゃんとした送信元かを確認できるようにするための送信ドメイン認証技術が造られました。
IPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側がDNSでIPアドレスを検証します。
- 流れ
認証方法によって、送信メールサーバのIPアドレスの取得元が異なります。
送信ドメイン認証 | IPアドレスの取得元 |
---|---|
SFP | エンベロープFromにあるメールアドレス |
Sender ID | メールヘッダのFromやSenderにあるメールアドレス |
SFPは、メールの「エンベロープFromにあるメールアドレス」から取得します。
- 英語:Sender Policy Framework
なりすましメール撲滅に向けたSPF(Sender Policy Framework)導入の手引き:IPA 独立行政法人 情報処理推進機構
SPF(Sender Policy Framework)の仕組みはどれか。
イ. 電子メールを受信するサーバが,電子メールの送信元のドメイン情報と,電子メールを送信したサーバのIPアドレスから,ドメインの詐称がないことを確認する。
平成30年春期問40 SPFの仕組みはどれか|基本情報技術者試験.com
「エンベロープFrom(英語 : envelope(封筒) from)」とは、配信処理用のメールアドレスのことです。
エンベロープFromは、実際の送信者メールアドレスであり、宛先にメールが届くとエンベロープFromは削除されます。
メールヘッダにあるFromは、設定で変更することができます。
迷惑メールなどはメールヘッダにあるFromを詐称していたりします。
「エンベロープFrom」は、メールが宛先に到着してSMTPが終わると消えます。
でもなくなると問題があったときの送信先に困っちゃうので、メールの「Return-Path」に出力されます。
なので、Return-Pathを確認することでエンベロープFromが確認できます。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。
...ここでエンベロープFromが確認できます。... Return-Path: <51212-585086@envelope-from.smbc.co.jp> ... From: "三井住友銀行" <smbc_info@ra.smbc.co.jp> To: ponsukeのメアド Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ ....
なので、「エンベロープFromにあるメールアドレス」のドメインから送信側メールサーバのIPアドレス取得して検証します。
Sender IDは、「メールヘッダのFromやSenderにあるメールアドレス」からします。
「メールヘッダのFromやSender」はメーラなどの表示用のメールアドレスです。
メールヘッダのFromやSenderは、配信処理には使用されず送信者以外のアドレスを使用することが可能です。
メールヘッダのFromやSenderにあるメールアドレスのことをPRA(Purported(~といわれている) Responsible Address)ともいいます。
Sender IDは、PRAのドメインと同じサーバから送信されているかどうかを検証します。
PRAでは、Resent-Sender / Resent-From / Received / Senderなどのから情報を取得します。
取得方法の詳細は、rfc4407の2. Determining the Purported Responsible Addressに記載されています。
電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名をDNSで公開鍵を取得して検証します。
- 流れ
DKIMは、送信側メールサーバで電子署名を電子メールのヘッダに付与して、受信側メールサーバで検証します。
- 読み方:ディーキム
電子署名を利用するタイプにIIM(Identified Internet Mail)とDomainKeysという認証方法がありました。
この認証方法が合体してDKIMができました。
正式名称は、DomainKeys Identified(認証する) Mailです。
送信側のメールサーバで、メールヘッダとボディから電子署名を作成して、DKIM-Signatureヘッダに追加します。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。
...... DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ra.smbc.co.jp; s=smbcrmpc; t=1...; bh=Et...; h=From:To:Subject:Reply-To:Message-Id:Date:MIME-Version: Content-Type; b=dw8... From: "三井住友銀行" <smbc_info@ra.smbc.co.jp> To: ponsukeのメアド Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ ....
スパムメールの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。
ア. 送信側メールサーバでディジタル署名を電子メールのヘッダに付与して,受信側メールサーバで検証する。
平成30年春期問12 DKIMの説明はどれか|情報処理安全確保支援士.com
DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。
英語ではDomain-based Message Authentication, Reporting and Conformance(~との一致)、読み方は「ディーマーク」です。
TwoFive、なりすまし対策に有効なDMARCレポートを集計・可視化するサービス「DMARC / 25 Analyze」を提供開始 - クラウド Watch
「検証結果でそのメールをどう扱って欲しいか」を記述した情報の定義をSSP(Sender Signing Practice)といいます。
SSPは、DNSサーバに置いておきます。
次回の勉強内容
PKIは、世の中の安全を守っています。
- 前回の勉強内容
- 勉強のきっかけになった問題
- OCSPは、デジタル証明書をCRLを突き合わせて有効かを確認するためのプロトコルです。
- PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。
- 認証局モデルでは信用関係の保証が重要です。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。
- 正式名称 : Public Key Infrastructure
- 日本語訳 : 公開鍵暗号基盤
PKIとは、公開鍵暗号を正しく発行し配布するシステム。証明局発行の鍵が含まれた証明書をリボジトリで集中管理・配布する。
PKIとは - 意味の解説|ITトレンドのIT用語集
公開鍵暗号技術と電子署名を使って、インターネット上で安全な通信ができるようにするための環境のことを言います。 なりすましやデータの盗聴や改竄を防ぐためのインフラとして近年注目が高まっています。
インターネット用語1分解説~PKIとは~ - JPNIC
データの暗号化とデジタル署名によってPKIは「守秘性」、「完全性」、「認証」、「否認防止」といったセキュリティサービスを提供します。 これらのセキュリティサービスによって、自分が知らぬ間に情報を書き換えられるような事態や、機密情報が盗聴されるといった脅威を防ぐことできます。 そしてPKIとビジネスで利用される様々なアプリケーションを組みあわせることにより、そのアプリケーションに対してセキュリティインフラを提供することができます。
PKIとは
暗号化技術はいろいろあります。
認証局モデルでは信用関係の保証が重要です。
- 受領したデータが改ざんされていないことを確認するには電子署名を確認します。
- 電子署名を複合するには送信者の公開鍵が必要です。
- 公開鍵を使うには公開鍵が本物か証明書を確認します。
- その証明書が信用できるか確認するには認証局が信頼できるかを確認する必要があります。
認証局の信用関係を作る方法には種類があります。
種類 | 説明 |
---|---|
単独 CA モデル | 1つの CA が全てのユーザに証明書を発行する方式です。 |
階層型モデル | 複数の CA を階層型(ツリー構造)に構成する方式です。 |
Web モデル | あらかじめクライアントのアプリケーションにルート CA の一覧を埋め込む方式です。Web ブラウザで用いられています。 |
メッシュモデル | 複数の CA を相互認証により接続する方式です。 |
ブリッジ CA モデル | 複数の CA がブリッジ CA を介して接続する方式です。 |
次回の勉強内容
さるがSQL*Plusって何?って思ったのでインストールしてみた。
SQL*Plusは、OracleのDB用のCUIクライアントツールです。
SQL*Plusは、Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツールです。SQL*Plusでは、コマンドライン・ユーザー・インタフェースを使用できます。
また、SQL*Plus Instant Clientもあります。これは、OCI Instant Client対応のプラットフォームで使用できるスタンドアロン・コマンドライン・インタフェースです。SQL*Plus Instant Clientは使用可能なすべてのOracle Databaseに接続されますが、専用のOracle Databaseをインストールする必要はありません。
SQL*Plusのクイック・スタート
SQL*Plus とは SQL を実行するためのインターフェイスユーティリティである。
インスタンスの起動とマニュアル操作によるインタラクティブな SQL の実行が主であるが shell などのスクリプト言語と サイレントモード を併用することで簡単なバッチ処理にも使用できる(※)。
www.shift-the-oracle.com
sqlplusはoracleに対して処理を指示するための最も基本的なCUIのSQLクライアントツールです。 実質oracle databaseがインストールされている環境にはほぼすべてsqlplusもインストールされているため以下のような様々な用途で使用されています。
WalkingAlone sqlplusとは
何となく分かるようなわからないのでインストールします。
インストールしてみた。
- インストールする環境:Windows10 Pro 64bit
1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
- ダウンロードサイト : Instant Client for Microsoft Windows (x64) 64-bit
- 以下のzipを全部ダウンロードします。
- 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
2. ダウンロードしたものをすべて解凍して1つのフォルダにまとめます。
3. 解凍したフォルダを `C:\app\oracle\instantclient_xx_x` に配置します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ find /c/app/oracle/ -type d /c/app/oracle/ /c/app/oracle/instantclient_18_3 /c/app/oracle/instantclient_18_3/help /c/app/oracle/instantclient_18_3/help/ja /c/app/oracle/instantclient_18_3/help/ja/img /c/app/oracle/instantclient_18_3/help/ja/img_text /c/app/oracle/instantclient_18_3/help/us /c/app/oracle/instantclient_18_3/help/us/img /c/app/oracle/instantclient_18_3/help/us/img_text /c/app/oracle/instantclient_18_3/sdk /c/app/oracle/instantclient_18_3/sdk/admin /c/app/oracle/instantclient_18_3/sdk/demo /c/app/oracle/instantclient_18_3/sdk/include /c/app/oracle/instantclient_18_3/sdk/lib /c/app/oracle/instantclient_18_3/sdk/lib/bc /c/app/oracle/instantclient_18_3/sdk/lib/msvc /c/app/oracle/instantclient_18_3/sdk/lib/msvc/vc14 /c/app/oracle/instantclient_18_3/vc14
4. Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ printenv | grep -i oracle SQL_PLUS=C:\app\oracle\instantclient_18_3 # 何のパスかすぐわからなくなるので環境変数を1つ作ってそれをPATHに設定しました。 PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略> ORIGINAL_PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>
5. ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 TNS_ADMIN=C:\app\oracle\instantclient_18_3 NLS_LANG=Japanese_Japan.AL32UTF8
6. ORACLE ODBCドライバをインストールします。
管理者権限でプロンプトやGitBashなどを起動します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ cd $SQL_PLUS # 作った環境変数です。 $ odbc_install JA Oracle ODBC Driver is installed successfully.
7. SQL*Plusを起動してみます。
$ sqlplus SQL*Plus: Release 18.0.0.0.0 - Production on 水 9月 5 00:50:15 2018 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. ユーザー名を入力してください:
バージョン違いの実行記録
Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit
- Oracle Technology Network(OTN)からパッケージをダウンロードします。
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。 $ cd /c/apps/oracle $ unzip ~/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/ inflating: instantclient_12_2/uidrvci.sym inflating: instantclient_12_2/oci.sym inflating: instantclient_12_2/oraocci12d.sym inflating: instantclient_12_2/oraons.dll inflating: instantclient_12_2/genezi.sym inflating: instantclient_12_2/ociw32.dll inflating: instantclient_12_2/oraocci12d.dll inflating: instantclient_12_2/oci.dll inflating: instantclient_12_2/ociw32.sym inflating: instantclient_12_2/adrci.exe inflating: instantclient_12_2/oramysql12.sym inflating: instantclient_12_2/adrci.sym inflating: instantclient_12_2/xstreams.jar inflating: instantclient_12_2/oraociei12.dll inflating: instantclient_12_2/ocijdbc12.dll inflating: instantclient_12_2/orasql12.sym inflating: instantclient_12_2/oraocci12.sym inflating: instantclient_12_2/orannzsbb12.dll inflating: instantclient_12_2/ocijdbc12.sym inflating: instantclient_12_2/oraociei12.sym inflating: instantclient_12_2/genezi.exe inflating: instantclient_12_2/ojdbc8.jar inflating: instantclient_12_2/orannzsbb12.sym inflating: instantclient_12_2/uidrvci.exe inflating: instantclient_12_2/oraocci12.dll creating: instantclient_12_2/vc14/ inflating: instantclient_12_2/vc14/oraocci12d.sym inflating: instantclient_12_2/vc14/oraocci12d.dll inflating: instantclient_12_2/vc14/oraocci12.dll inflating: instantclient_12_2/vc14/oraocci12.sym inflating: instantclient_12_2/orasql12.dll inflating: instantclient_12_2/oramysql12.dll inflating: instantclient_12_2/BASIC_README $ unzip ~/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/ inflating: instantclient_12_2/sqlplus.exe inflating: instantclient_12_2/SQLPLUS_README inflating: instantclient_12_2/glogin.sql inflating: instantclient_12_2/orasqlplusic12.dll inflating: instantclient_12_2/sqlplus.sym $ unzip ~/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/sdk/ creating: instantclient_12_2/sdk/include/ inflating: instantclient_12_2/sdk/include/oci8dp.h inflating: instantclient_12_2/sdk/include/occiCommon.h inflating: instantclient_12_2/sdk/include/occiControl.h inflating: instantclient_12_2/sdk/include/oci1.h inflating: instantclient_12_2/sdk/include/ociap.h inflating: instantclient_12_2/sdk/include/orl.h inflating: instantclient_12_2/sdk/include/oratypes.h inflating: instantclient_12_2/sdk/include/nzt.h inflating: instantclient_12_2/sdk/include/xa.h inflating: instantclient_12_2/sdk/include/odci.h inflating: instantclient_12_2/sdk/include/occi.h inflating: instantclient_12_2/sdk/include/ociapr.h inflating: instantclient_12_2/sdk/include/ldap.h inflating: instantclient_12_2/sdk/include/ocixstream.h inflating: instantclient_12_2/sdk/include/ocixmldb.h inflating: instantclient_12_2/sdk/include/oro.h inflating: instantclient_12_2/sdk/include/ocixml.h inflating: instantclient_12_2/sdk/include/oci.h inflating: instantclient_12_2/sdk/include/occiAQ.h inflating: instantclient_12_2/sdk/include/ocidef.h inflating: instantclient_12_2/sdk/include/ociextp.h inflating: instantclient_12_2/sdk/include/orid.h inflating: instantclient_12_2/sdk/include/ort.h inflating: instantclient_12_2/sdk/include/ocidem.h inflating: instantclient_12_2/sdk/include/ocikpr.h inflating: instantclient_12_2/sdk/include/occiObjects.h inflating: instantclient_12_2/sdk/include/ocidfn.h inflating: instantclient_12_2/sdk/include/ori.h inflating: instantclient_12_2/sdk/include/occiData.h inflating: instantclient_12_2/sdk/include/nzerror.h creating: instantclient_12_2/sdk/lib/ creating: instantclient_12_2/sdk/lib/msvc/ inflating: instantclient_12_2/sdk/lib/msvc/oci.lib inflating: instantclient_12_2/sdk/lib/msvc/oramysql12.lib creating: instantclient_12_2/sdk/lib/msvc/vc14/ inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib inflating: instantclient_12_2/sdk/lib/msvc/oraocci12.lib inflating: instantclient_12_2/sdk/lib/msvc/oraocci12d.lib inflating: instantclient_12_2/sdk/lib/msvc/ociw32.lib creating: instantclient_12_2/sdk/lib/bc/ inflating: instantclient_12_2/sdk/lib/bc/oci.lib extracting: instantclient_12_2/sdk/ottclasses.zip inflating: instantclient_12_2/sdk/SDK_README inflating: instantclient_12_2/sdk/ott.bat creating: instantclient_12_2/sdk/admin/ inflating: instantclient_12_2/sdk/admin/oraaccess.xsd creating: instantclient_12_2/sdk/demo/ inflating: instantclient_12_2/sdk/demo/bcmake.bat inflating: instantclient_12_2/sdk/demo/make.bat inflating: instantclient_12_2/sdk/demo/cdemo81.c inflating: instantclient_12_2/sdk/demo/occidemod.sql inflating: instantclient_12_2/sdk/demo/occiobj.typ inflating: instantclient_12_2/sdk/demo/occidml.cpp inflating: instantclient_12_2/sdk/demo/occiobj.cpp inflating: instantclient_12_2/sdk/demo/oraaccess.xml inflating: instantclient_12_2/sdk/demo/occidemo.sql $ unzip ~/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip inflating: instantclient_12_2/JDBC_README inflating: instantclient_12_2/orai18n-mapping.jar inflating: instantclient_12_2/heteroxa12.sym inflating: instantclient_12_2/heteroxa12.dll inflating: instantclient_12_2/orai18n.jar $ unzip ~/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip Archive: /c/Users/ponsuke/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip creating: instantclient_12_2/help/ creating: instantclient_12_2/help/ja/ inflating: instantclient_12_2/help/ja/blafdoc.css inflating: instantclient_12_2/help/ja/cpyr.htm creating: instantclient_12_2/help/ja/img/ inflating: instantclient_12_2/help/ja/img/odbcdrvarch.gif inflating: instantclient_12_2/help/ja/img/odbcmodel.gif inflating: instantclient_12_2/help/ja/img/setup_app.gif inflating: instantclient_12_2/help/ja/img/setup_ora.gif inflating: instantclient_12_2/help/ja/img/setup_ssmig.gif inflating: instantclient_12_2/help/ja/img/setup_work.gif creating: instantclient_12_2/help/ja/img_text/ inflating: instantclient_12_2/help/ja/img_text/odbcdrvarch.htm inflating: instantclient_12_2/help/ja/img_text/odbcmodel.htm inflating: instantclient_12_2/help/ja/img_text/setup_app.htm inflating: instantclient_12_2/help/ja/img_text/setup_ora.htm inflating: instantclient_12_2/help/ja/img_text/setup_ssmig.htm inflating: instantclient_12_2/help/ja/img_text/setup_work.htm inflating: instantclient_12_2/help/ja/map.xml inflating: instantclient_12_2/help/ja/oracle.gif inflating: instantclient_12_2/help/ja/sqora.htm inflating: instantclient_12_2/help/ja/toc.htm creating: instantclient_12_2/help/us/ inflating: instantclient_12_2/help/us/blafdoc.css inflating: instantclient_12_2/help/us/cpyr.htm creating: instantclient_12_2/help/us/img/ inflating: instantclient_12_2/help/us/img/odbcdrvarch.gif inflating: instantclient_12_2/help/us/img/odbcmodel.gif inflating: instantclient_12_2/help/us/img/setup_app.gif inflating: instantclient_12_2/help/us/img/setup_ora.gif inflating: instantclient_12_2/help/us/img/setup_ssmig.gif inflating: instantclient_12_2/help/us/img/setup_work.gif creating: instantclient_12_2/help/us/img_text/ inflating: instantclient_12_2/help/us/img_text/odbcdrvarch.htm inflating: instantclient_12_2/help/us/img_text/odbcmodel.htm inflating: instantclient_12_2/help/us/img_text/setup_app.htm inflating: instantclient_12_2/help/us/img_text/setup_ora.htm inflating: instantclient_12_2/help/us/img_text/setup_ssmig.htm inflating: instantclient_12_2/help/us/img_text/setup_work.htm inflating: instantclient_12_2/help/us/map.xml inflating: instantclient_12_2/help/us/oracle.gif inflating: instantclient_12_2/help/us/sqora.htm inflating: instantclient_12_2/help/us/toc.htm inflating: instantclient_12_2/ODBC_IC_Readme_Win.html inflating: instantclient_12_2/odbc_install.exe inflating: instantclient_12_2/odbc_uninstall.exe inflating: instantclient_12_2/sqora32.dll inflating: instantclient_12_2/sqoras32.dll inflating: instantclient_12_2/sqresja.dll inflating: instantclient_12_2/sqresus.dll $ find /c/apps/oracle/instantclient_12_2/ -type d /c/apps/oracle/instantclient_12_2/ /c/apps/oracle/instantclient_12_2/help /c/apps/oracle/instantclient_12_2/help/ja /c/apps/oracle/instantclient_12_2/help/ja/img /c/apps/oracle/instantclient_12_2/help/ja/img_text /c/apps/oracle/instantclient_12_2/help/us /c/apps/oracle/instantclient_12_2/help/us/img /c/apps/oracle/instantclient_12_2/help/us/img_text /c/apps/oracle/instantclient_12_2/sdk /c/apps/oracle/instantclient_12_2/sdk/admin /c/apps/oracle/instantclient_12_2/sdk/demo /c/apps/oracle/instantclient_12_2/sdk/include /c/apps/oracle/instantclient_12_2/sdk/lib /c/apps/oracle/instantclient_12_2/sdk/lib/bc /c/apps/oracle/instantclient_12_2/sdk/lib/msvc /c/apps/oracle/instantclient_12_2/sdk/lib/msvc/vc14 /c/apps/oracle/instantclient_12_2/vc14 # Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。 $ printenv | grep -i oracle ORACLE_INSTANT_CLIENT=C:\apps\oracle\instantclient_12_2 PATH=<省略>/c/apps/oracle/instantclient_12_2:<省略> ORIGINAL_PATH=<省略>/c/apps/composer:/c/apps/oracle/instantclient_12_2:<省略> # ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。 $ printenv | grep -e TNS_ADMIN -e NLS_LANG NLS_LANG=Japanese_Japan.AL32UTF8 TNS_ADMIN=C:\apps\oracle\instantclient_12_2 # ORACLE ODBCドライバをインストールします。 $ cd $ORACLE_INSTANT_CLIENT $ odbc_install JA Oracle ODBC Driver is installed successfully. # SQL*Plusを起動してみます。 $ sqlplus {ユーザ名}/{パスワード}@{データベース}:1521/{サービス名} SQL*Plus: Release 12.2.0.1.0 Production on 火 1月 28 10:18:28 2020 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 水 10月 02 2019 11:27:17 +09:00 Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL>
Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 32bit
- Instant Client for Windows 32-bitからパッケージをダウンロードします。
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。 $ find ~/Downloads/ -name '*.zip' | xargs -n1 unzip -d /c/app/oracle/ Archive: /c/Users/m-uki/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip creating: /c/app/oracle/instantclient_12_2/ inflating: /c/app/oracle/instantclient_12_2/oraocci12.sym inflating: /c/app/oracle/instantclient_12_2/oraociicus12.dll inflating: /c/app/oracle/instantclient_12_2/uidrvci.sym inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.dll inflating: /c/app/oracle/instantclient_12_2/xstreams.jar inflating: /c/app/oracle/instantclient_12_2/orasql12.sym inflating: /c/app/oracle/instantclient_12_2/oraocci12d.dll inflating: /c/app/oracle/instantclient_12_2/genezi.exe inflating: /c/app/oracle/instantclient_12_2/ojdbc8.jar inflating: /c/app/oracle/instantclient_12_2/adrci.exe inflating: /c/app/oracle/instantclient_12_2/BASIC_LITE_README inflating: /c/app/oracle/instantclient_12_2/oraocci12d.sym inflating: /c/app/oracle/instantclient_12_2/orasql12.dll inflating: /c/app/oracle/instantclient_12_2/oraociicus12.sym inflating: /c/app/oracle/instantclient_12_2/oraocci12.dll inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.sym inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.dll inflating: /c/app/oracle/instantclient_12_2/ociw32.sym inflating: /c/app/oracle/instantclient_12_2/adrci.sym creating: /c/app/oracle/instantclient_12_2/vc14/ inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.sym inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.dll inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.dll inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.sym inflating: /c/app/oracle/instantclient_12_2/oci.dll inflating: /c/app/oracle/instantclient_12_2/oraons.dll inflating: /c/app/oracle/instantclient_12_2/genezi.sym inflating: /c/app/oracle/instantclient_12_2/ociw32.dll inflating: /c/app/oracle/instantclient_12_2/oci.sym inflating: /c/app/oracle/instantclient_12_2/uidrvci.exe inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.sym Archive: /c/Users/m-uki/Downloads/instantclient-jdbc-nt-12.2.0.1.0.zip inflating: /c/app/oracle/instantclient_12_2/orai18n-mapping.jar inflating: /c/app/oracle/instantclient_12_2/JDBC_README inflating: /c/app/oracle/instantclient_12_2/heteroxa12.dll inflating: /c/app/oracle/instantclient_12_2/heteroxa12.sym inflating: /c/app/oracle/instantclient_12_2/orai18n.jar Archive: /c/Users/m-uki/Downloads/instantclient-odbc-nt-12.2.0.1.0-2.zip creating: /c/app/oracle/instantclient_12_2/help/ creating: /c/app/oracle/instantclient_12_2/help/ja/ inflating: /c/app/oracle/instantclient_12_2/help/ja/blafdoc.css inflating: /c/app/oracle/instantclient_12_2/help/ja/cpyr.htm creating: /c/app/oracle/instantclient_12_2/help/ja/img/ inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcdrvarch.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcmodel.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_app.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ora.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ssmig.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_work.gif creating: /c/app/oracle/instantclient_12_2/help/ja/img_text/ inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcdrvarch.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcmodel.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_app.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ora.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ssmig.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_work.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/map.xml inflating: /c/app/oracle/instantclient_12_2/help/ja/oracle.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/sqora.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/toc.htm creating: /c/app/oracle/instantclient_12_2/help/us/ inflating: /c/app/oracle/instantclient_12_2/help/us/blafdoc.css inflating: /c/app/oracle/instantclient_12_2/help/us/cpyr.htm creating: /c/app/oracle/instantclient_12_2/help/us/img/ inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcdrvarch.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcmodel.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_app.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ora.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ssmig.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_work.gif creating: /c/app/oracle/instantclient_12_2/help/us/img_text/ inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcdrvarch.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcmodel.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_app.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ora.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ssmig.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_work.htm inflating: /c/app/oracle/instantclient_12_2/help/us/map.xml inflating: /c/app/oracle/instantclient_12_2/help/us/oracle.gif inflating: /c/app/oracle/instantclient_12_2/help/us/sqora.htm inflating: /c/app/oracle/instantclient_12_2/help/us/toc.htm inflating: /c/app/oracle/instantclient_12_2/ODBC_IC_Readme_Win.html inflating: /c/app/oracle/instantclient_12_2/odbc_install.exe inflating: /c/app/oracle/instantclient_12_2/odbc_uninstall.exe inflating: /c/app/oracle/instantclient_12_2/sqora32.dll inflating: /c/app/oracle/instantclient_12_2/sqoras32.dll inflating: /c/app/oracle/instantclient_12_2/sqresja.dll inflating: /c/app/oracle/instantclient_12_2/sqresus.dll Archive: /c/Users/m-uki/Downloads/instantclient-sdk-nt-12.2.0.1.0.zip creating: /c/app/oracle/instantclient_12_2/sdk/ creating: /c/app/oracle/instantclient_12_2/sdk/admin/ inflating: /c/app/oracle/instantclient_12_2/sdk/admin/oraaccess.xsd inflating: /c/app/oracle/instantclient_12_2/sdk/ott.bat creating: /c/app/oracle/instantclient_12_2/sdk/demo/ inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidml.cpp inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.typ inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.cpp inflating: /c/app/oracle/instantclient_12_2/sdk/demo/cdemo81.c inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemod.sql inflating: /c/app/oracle/instantclient_12_2/sdk/demo/make.bat inflating: /c/app/oracle/instantclient_12_2/sdk/demo/bcmake.bat inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemo.sql inflating: /c/app/oracle/instantclient_12_2/sdk/demo/oraaccess.xml inflating: /c/app/oracle/instantclient_12_2/sdk/SDK_README creating: /c/app/oracle/instantclient_12_2/sdk/lib/ creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oramysql12.lib creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ociw32.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12d.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oci.lib creating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/oci.lib creating: /c/app/oracle/instantclient_12_2/sdk/include/ inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociapr.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiCommon.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ori.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci8dp.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ldap.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixstream.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/odci.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ort.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occi.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiObjects.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixml.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiData.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci1.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/xa.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oratypes.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzerror.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiControl.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidem.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiAQ.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oro.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidef.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/orid.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixmldb.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociextp.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzt.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocikpr.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/orl.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidfn.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociap.h extracting: /c/app/oracle/instantclient_12_2/sdk/ottclasses.zip Archive: /c/Users/m-uki/Downloads/instantclient-sqlplus-nt-12.2.0.1.0.zip inflating: /c/app/oracle/instantclient_12_2/sqlplus.exe inflating: /c/app/oracle/instantclient_12_2/SQLPLUS_README inflating: /c/app/oracle/instantclient_12_2/glogin.sql inflating: /c/app/oracle/instantclient_12_2/orasqlplusic12.dll inflating: /c/app/oracle/instantclient_12_2/sqlplus.sym $ find /c/app/oracle/instantclient_12_2/ -type d /c/app/oracle/instantclient_12_2/ /c/app/oracle/instantclient_12_2/help /c/app/oracle/instantclient_12_2/help/ja /c/app/oracle/instantclient_12_2/help/ja/img /c/app/oracle/instantclient_12_2/help/ja/img_text /c/app/oracle/instantclient_12_2/help/us /c/app/oracle/instantclient_12_2/help/us/img /c/app/oracle/instantclient_12_2/help/us/img_text /c/app/oracle/instantclient_12_2/sdk /c/app/oracle/instantclient_12_2/sdk/admin /c/app/oracle/instantclient_12_2/sdk/demo /c/app/oracle/instantclient_12_2/sdk/include /c/app/oracle/instantclient_12_2/sdk/lib /c/app/oracle/instantclient_12_2/sdk/lib/bc /c/app/oracle/instantclient_12_2/sdk/lib/msvc /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14 /c/app/oracle/instantclient_12_2/vc14 # Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。 # ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。 $ printenv | grep -i -e instant -e NLS_LANG NLS_LANG=Japanese_Japan.AL32UTF8 TNS_ADMIN=C:\app\oracle\instantclient_12_2 PATH=<省略>/c/app/oracle/instantclient_12_2 # SQL*Plusを起動してみます。 $ sqlplus SQL*Plus: Release 12.2.0.1.0 Production on 火 1月 28 21:42:39 2020 Copyright (c) 1982, 2017, Oracle. All rights reserved. ユーザー名を入力してください:
Ubuntu18 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit
IPヘッダにあるプロトコル番号でプロトコルを識別できます。
- 前回の勉強内容
- 勉強のきっかけになった問題
- IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。
- ICMPは、IPにおいて制御や調査に用いられるプロトコルです。
- プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。
- ICMPフレームの部分は、データ本体であるIPペイロードに入っています。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
IPv4において,IPパケットで送られているデータが,ICMPメッセージであることを識別できるヘッダ情報はどれか。
IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。
IPv6は、IPv4よりたくさん割り当てられるように128 ビット (16 バイト)で表すIPです。
IPv6アドレスは『128bit』で構成されます。これは2^128通りのアドレス数を保有することになります。
IPv4とIPv6の違いについて | Netassist Blog
ICMPは、IPにおいて制御や調査に用いられるプロトコルです。
- 正式名称:Internet Control Message Protocol
IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。 ICMPはインターネット層(OSI参照モデルのネットワーク層)で動作するプロトコルです。
TCP/IP - ICMPとは
※. ベースの図は、以下のサイト様より拝借いたしました。
TCP/IPをはじめから
ICMP Flood攻撃 と Smurf攻撃は、ICMPのpingを使った攻撃です。
ping の正体は、ICMP の中で一番有名な使われ方である『Ping 要求【Echo Request】』と『Ping 応答【Echo Reply】』で、これは宛先 IP アドレスを 指定して Ping 要求を送り、その宛先まで到達できれば送信元へ Ping 応答を返します。
【図解】ICMPとは 〜Pingの仕組みやエラー通知によるIP通信の補助〜 | SEの道標
ICMP Flood攻撃は、pingコマンドを用いて大量の要求パケットを発信することによって、攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害します。
- 英語 : ICMP Flood(洪水)
攻撃対象となるサーバに対してなるべくサイズが大きくなるようにした「ICMP echo request(ping)」を大量に送り続けることで、攻撃対象および攻撃対象が属するネットワークのリソースを枯渇させることを目的とする攻撃です。
情報セキュリティスペシャリスト平成29年春期 午前Ⅱ 問18
Smurf攻撃は、IPアドレスを詐称してICMPの応答パケットを大量に送り付けます。
Smurf攻撃(スマーフアタック)は、ネットワークの疎通確認に使用されるICMP echo request(ping)の仕組みを悪用して、相手のコンピュータやネットワークに大量のパケットを送りつける反射型のDoS攻撃です。
攻撃者は、以下の手順で攻撃対象のサービスを妨害します。
①送信元IPアドレスを攻撃対象のコンピュータに偽装したICMP echo requestを攻撃対象が属するネットワークにブロードキャストで大量に送りつける
②ICMP echo requestを受け取ったネットワーク内の端末が一斉に攻撃対象にecho replyパケットで応答する
③大量の応答パケットの発生により攻撃対象のコンピュータおよびネットワークが過負荷状態になり正常なサービスが阻害される
情報セキュリティスペシャリスト平成26年秋期 午前Ⅱ 問12
プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。
プロトコル番号とは、IP(Internet Protocol)で通信する際に、上位層のプロトコルがなんであるかを識別するための番号。IPデータグラムのヘッダ部に8ビットの値として記載されるもので、0から255までのいずれかとなる。
プロトコル番号とは - IT用語辞典 e-Words
プロトコル番号は、上位層のプロトコルを識別するための番号であり、IPヘッダに 8 ビット情報であります。例えばプロトコル番号が 6 の場合はTCP、17 の場合はUDPとなります。プロトコル番号の枠は0~255です。
IPプロトコル番号一覧
プロトコル番号がわかるとプロトコルに何を使っているかがわかります。
IANAのプロトコル番号の一部はこんな感じです。
Decimal | Keyword | Protocol |
---|---|---|
1 | ICMP | Internet Control Message |
4 | IPv4 | IPv4 encapsulation |
6 | TCP | Transmission Control |
17 | UDP | User Datagram |
41 | IPv6 | IPv6 encapsulation |
ICMPのプロトコル番号は「1」です。
プロトコル番号は、Internet Protocol(IP)の宛先情報を含めているIPヘッダーに入っています。
ICMPフレームの部分は、データ本体であるIPペイロードに入っています。
ICMPフレーム部分でタイプ番号とそのコード番号がわかります。
ICMPのタイプ一覧
Type | 意味 |
---|---|
0 | エコー応答(Ping要求 / Echo Request) |
3 | 宛先到達不能 |
4 | 始点抑制 |
5 | 最適経路への変更指示 |
8 | エコー要求(Ping応答 / Echo Reply) |
9 | ルータ通知 |
10 | ルータ要求 |
11 | TTL超過によるパケット破棄の報告 |
12 | パケットパラメータにおけるエラー |
13 | タイムスタンプ |
14 | タイムスタンプ応答 |
15 | インフォメーション要求 |
16 | インフォメーション応答 |
17 | アドレスマスク要求 |
18 | アドレスマスク応答 |
第12回 TCP/IPプロトコルを支えるICMPメッセージ (1/3):基礎から学ぶWindowsネットワーク - @IT
次回の勉強内容
Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ
- 前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。
- 環境
- ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。
- トップ画面を作ります。
- 入力画面を作成します。
- 入力画面の入力値を出力画面に表示する処理を作成します。
- Bean Validationを使用した入力チェックを作成します。
- この本を読みながらやりました
前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。
ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。
トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp
トップ画面を作ります。
Controllerを作ります。
package example.app; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** トップ画面用のController. */ @Controller public class WelcomeController { /** * トップ画面の表示リクエストをハンドリングするためのメソッド. * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる. * @return トップ画面のView名. */ @RequestMapping("/") public String home() { // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。 return "index"; } }
Viewを作成します。
以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
index.jspを「/src/main/webapp/index.jsp」へ移動します。
以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。
「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。
<html> <body> <h2>Hello World!</h2> <ul> <!-- JSTL(JSP Standerd Tag Library)の「c:url」を使用して {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています. --> <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li> </ul> </body> </html>
リンクが追加されたことを画面を表示して確認します。
入力画面を作成します。
HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。
package example.app; import java.io.Serializable; /** * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス. */ public class EchoForm implements Serializable { /** serialVersionUID. */ private static final long serialVersionUID = -3147370534900886671L; /** 入力値を保持するプロパティ定義. */ private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。
package example.app; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * 入力画面のController. * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます. */ @Controller @RequestMapping("echo") public class EchoController { /** * 表示リスクエストをハンドリングするためのメソッド. * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます. * @param model * @return 入力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.GET) public String viewInput(Model model) { // フォームオブジェクトを生成してModelに追加します。 EchoForm form = new EchoForm(); // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。 // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため // JSPからは、リクエストスコープのオブジェクトとして参照できます。 model.addAttribute(form); return "echo/input"; } }
Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。
<html> <body> <h2>入力画面</h2> <!-- Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします. modelAttribute属性にフォームオブジェクトの属性名を指定します. 「form:form」要素にはmethod/action属性が指定でき、省略すると method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります. ここのaction属性は、"{App名}/echo"となります. --> <form:form modelAttribute="echoForm"> <div>テキストを入力してください :</div> <div> <!-- Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します. path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます. --> <form:input path="text" /> </div> <div> <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 --> <form:button>送信</form:button> </div> </form:form> </body> </html>
トップ画面のリンクを押下して入力画面を表示してみます。
入力画面の入力値を出力画面に表示する処理を作成します。
入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。
/** * 入力画面の送信リクエストをハンドリンクするためのメソッド. * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます. * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます. * また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません. * @return 出力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.POST) public String echo(EchoForm form) { return "echo/output"; }
Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。
<html> <body> <h2>出力画面</h2> <div>入力したテキストは・・・</div> <div> <!-- JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します. 「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます. --> 「<span><c:out value="${echoForm.text}" /></span>」 </div> <div>です。</div> <br> <div> <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. --> <a href="<c:url value='/' />">トップ画面へ戻る</a> </div> </body> </html>
出力画面を表示してみます。
Bean Validationを使用した入力チェックを作成します。
Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。
フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。
Hibernate Validationは、前回pom.xmlで設定しました。
/** * 入力値を保持するプロパティ定義. * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います. * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います. */ @NotEmpty @Size(max = 10) private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。
Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。
Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。
/** * 入力画面の送信リクエストをハンドリンクするためのメソッド. * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます. * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます. * また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません. * <<入力チェック>> * パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます. * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します. * BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません. * @return 出力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.POST) public String echo(@Valid EchoForm form, BindingResult result) { // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。 if (result.hasErrors()) { // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。 return "echo/input"; } return "echo/output"; }
View(input.jsp)にエラー情報を表示するパーツを追加します。
<form:input path="text" /> <!-- Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します. path属性に指定されたプロパティのエラー情報が表示されます。 --> <form:errors path="text" /> </div>
エラーになったときの入力画面を表示してみます。
この本を読みながらやりました
SpringプロジェクトにSpring MVCを設定する。
- 前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。
- 環境
- Spring MVC を設定します。
- 次回は、簡単なアプリを作ってみます。
- この本を読みながらやっています。
前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。
Spring MVC を設定します。
pom.xmlに依存関係を追加します。
- pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。
spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency>
Hibernate(ハイバネート) Validator を指定します。
Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
JCL inplement over SLF4 と Logback を指定します。
Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com
<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency>
ContextLoaderListener のセットアップ
ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com
空のコンフィギュレーションクラスを作成します。
package example.config; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { }
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。
<listener> <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. --> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. --> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </context-param> <context-param> <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. --> <param-name>contextConfigLocation</param-name> <param-value>example.config.AppConfig</param-value> </context-param>
DispatcherServlet のセットアップ
DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。
DispatcherServlet 用のコンフィギュレーションクラスを作成します。
package example.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * DispatcherServlet用のコンフィギュレーションクラス. * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる. * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される. */ @Configuration @EnableWebMvc @ComponentScan("example.app") public class WebMvcConfig extends WebMvcConfigurerAdapter { // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。 }
DispatcherServletクラスをサーブレットコンテナに登録します。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。
<servlet> <servlet-name>app</servlet-name> <servlet-class> <!-- DispatcherServletクラスをサーブレットコンテナに登録します. --> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. --> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </init-param> <init-param> <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. --> <param-name>contextConfigLocation</param-name> <param-value>example.config.WebMvcConfig</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. --> <servlet-name>app</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。
CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. --> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <!-- encodingパラメータにリクエストパラメータの文字エンコーディングとしてUTF-8を指定します. --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!-- forceEncodingパラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します. trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります. --> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. --> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Viewを判別できるように ViewResolver をセットアップします。
Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。
/** ViewResolverのセットアップ用メソッド. */ @Override public void configureViewResolvers(ViewResolverRegistry registry) { // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。 // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。 registry.jsp(); }
JSPからSpring MVCのtaglibが利用できるように定義を追加します。
以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
次回は、簡単なアプリを作ってみます。
この本を読みながらやっています。
コモン・マロウの葉っぱを食べてみた。
マロウの葉っぱは食べられるらしい。
マロウの葉っぱを調理して食べてみた - ちょっと変わった御飯を食べてみた
ameblo.jp
cookpad.com
cookpad.com
天ぷらにしてみた。
味がしない・・・花も単品でお茶にすると味がしない・・・体にいいからいいか。
サラダにしてみた。
味がしない・・・何にでも合わせられるともいえる。
炒めてみた。
初めて味がした。ほうれん草っぽいような気がする。
Springのプロジェクトにプロジェクトファセットを設定する。
Tomcatを設定したのでプロジェクトファセットを設定します。
ponsuke-tarou.hatenablog.com
- 環境
ファセットで、プロジェクトが使うものの定義をします。
- ファセットの和訳 : 〔宝石などの〕面を刻む、〔物事の一つの〕相、様相
ファセットは、Java EE プロジェクトの特性および要件を定義し、ランタイム構成の一部として使用されます。
ファセットをプロジェクトに追加すると、そのプロジェクトは、特定のタスクを実行し、特定の要求を実現し、または特定の特性を持つように構成されます。
プロジェクト・ファセット
プロジェクトの作成時にはさまざまな情報が収集され、それらに基づいてプロジェクト タイプの特定、標準ライブラリの追加、コンパイラ オプションの設定、パブリッシュ タスクの制御、ビルド パスの設定、アノテーション プロセッサの追加などが行われます。これらの情報は、プロジェクトの作成中にファセットを選択することによって指定します。
http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/ideuserguide/projects/conFacets.html
Eclipseでプロジェクトファセットを設定します。
- [Packge Exploer]でプロジェクトを選択します。
- 「Command + I」でプロジェクトの設定画面を開きます。
- 左側のメニューで[Progect Facets]を選択します。
- [Convert to Faceted...]リンクを押下します。
- [Project Facet]の一覧で[Java]にチェックを入れて[Version]を「1.8」にします。
- [Dynamic Web Module]にチェックを入れて[Version]を「3.1」にします。
- 下の方に出てくる[Further configuration available...]リンクを押下します。
- [Modify Faceted Project]画面で以下を設定します。
- [OK]ボタンを押下します。
- [Dynamic Web Module]で[Runtimes]を押下します。
- [Apatch Tomcat v8.0]にチェックを入れます。
- [Apply] > [OK]ボタンを押下します。
わいるどふらい(WildFly)って何?から学ぶEJB
- WildFlyは、オープンソースJavaEEアプリケーションサーバです。
- EJBは、JavaEEに既定されているサーバサイド向けのJavaBeansです。
WildFlyは、オープンソースJavaEEアプリケーションサーバです。
WildFlyは、Javaで記述されたサーバサイドアプリケーションを動作させるための基盤を提供します。
www.ossnews.jp
JBoss Application Serverから改名しました。
WildFly(ワイルドフライ)とは、JBoss AS(コミュニティ版)とJBoss EAP(エンタープライズ版)との混同を避けるため2014年4月にJBoss ASが改名された名称です。
その為、名称が変更されたのみとなっており、開発コミュニティ(オープンソースプロジェクト)やソフトウェア自体などJBoss ASと変わりません。
www.ossplaza.com
JBoss Application Server は1999年にEnterprise JavaBeansコンテナとして開発をされたJ2EEアプリケーションサーバです。
www.ossplaza.com
Tomcatとの違いはEJBが使えることです。
同様なサーバサイドプラットフォームとして「Tomcat」があります。
「Tomcat」はJSP/Servletを処理するアプリケーションサーバです。
「WildFly」は、TomcatをWebコンテナとして搭載しています。そのため、EJBとJSP/Servletの両方を処理できます。
www.ossnews.jp
Tomcatで提供される機能は基本的にServlet, JSP, JDBC接続プールのみで、他のものは提供されていません。シンプルですが、他のものが必要になったときに、それらをインテグレーションするコストが発生するなど、少し面倒なことになります。
TomcatになくてJBossにあるものを軽く列挙してみます。Java EEなもの
・JTAトランザクションマネージャ
・EJB
・MDB
・JPA
・JMS
・JCA
・JAX-WS
JBoss固有なもの
・JMX
・log4jを用いたログ基盤
・分散キャッシュなどの各種クラスタリングサービス
nekop.hatenablog.com
EJBは、JavaEEに既定されているサーバサイド向けのJavaBeansです。
- 正式名称:Enterprise JavaBeans
EJBを利用したシステムの開発者は必要な機能を「Bean」(ビーン)と呼ばれるJavaクラスとして開発していき、これを繋ぎ合わせてアプリケーションを構築する。BeanはEJBの仕様に準拠したアプリケーションサーバに組み込まれて実行される。サーバ側でトランザクション処理やDI(Dependency Injection:依存性注入)、セキュリティ制御などの諸機能を提供してくれるため、Beanの開発者はこれらに個別に対応する必要はなく、自らのビジネスロジックの記述に集中できる。
e-words.jp
まず、JavaBeansはJavaで書かれた再利用可能なソフトウェアコンポーネントのことです。
Java Beansはプログラムの再利用を目的としており、汎用的なロジックで構成されているクラスである。Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 サーバーサイド向けのJavaBeansはEnterprise JavaBeansと呼ばれている。
JavaBeans - Wikipedia
JavaBeansは、Sun Microsystems社のJavaBeans仕様に準拠した再使用可能なソフトウェア・コンポーネントです。JavaBeans仕様は、JavaBeanとなる一式のJavaクラスによって実装されるインタフェースおよびパッケージングの詳細を規定します。 開発者は、JavaBeansをプログラムを使用して組み合せるか、Oracle JDeveloperなどのビジュアル・プログラミング環境を使用してアプリケーションを作成できます。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/javabean/listing.htm
技術的な仕様のことを指してJavaBeansということもあります。
Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 再使用可能なコンポーネントを作成できる。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/glossary.htm#434709
JavaBeansの特徴
①プロパティ
JavaBeansは、「プロパティ」と呼ばれるものをもつJavaクラスです。あるBeanが持つ「属性」を「プロパティ」と考えることができます。
Javaのクラスでは、クラスの属性は、クラス中のフィールドで表現されると考えられます。ところが、あるBeanが持つプロパティは、クラスのフィールドとは関係ありません。ある特定のネーミング・ルールに従ったメソッドの存在が、そのBeanのプロパティを決めているのです。
JavaBeansのネーミング・ルールでは、あるBeanに次のようなメソッドがあるとき、そのBeanにはtitleというプロパティが存在することになります。
String getTitle ( ) ;
void setTitle ( String title);
- ネーミング・ルール
- setter、getter:プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加える
- setter名 = "set" + ( プロパティ名 )'
- getter名 = "get" + ( プロパティ名 )'
- プロパティ名:setter名やgetter名から、先頭の"set"、"get"を取り除いた文字列
- プロパティ名 = ( setter名から、先頭の"set"を取り除いたもの ) = ( getter名から、先頭の"get"を取り除いたもの )
- setter、getter:プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加える
② 永続化
Beanは、必要に応じてオブジェクトの状態を保存したり、復元したりすることができなければいけません。このことを、Beanを「永続化」する、といいます。このためには、Beanにjava.io.Serializableインタフェースを実装する必要があります。このインタフェースにはメソッドは定義されていないので、次のように定義するだけで構いません。
import java . io . Serializable; public class HogeBean implements Serializable { ..... }
Beanの種類
Session Bean:セッションを保持し、一時的なロジックを保存するオブジェクト
ビジネスロジックを実装するためのEnterprise Bean
- Stateful Session Bean:クライアントごとの状態を保持するセッションBean
- Stateless Session Bean:クライアントごとの状態を保持しないセッションBean
- Singleton Session Bean:常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean
Message Driven Bean ( メッセージ駆動型Bean):非同期処理の記述などJMS(Java Message Service)を使い、非同期のメソッドの呼び出しをサポートするEnterprise Bean
うちの庭という名の極小花壇
- せり科
- グラジオラス
- アボカド
- パッションフルーツ
- あじさい
- シソ科
- マロウ
- ユリ科
- デルフィニウム
- トリフォリウム
- コウモリラン
- 月桂樹
- 雲仙コメツツジ
- キク科
- ティランジア
- サンスベリア
- お亡くなりになってしまった方々
せり科
グラジオラス
アボカド
あじさい
名称不明
シソ科
ラベンダー
- 分類:シソ科ラバンデュラ属
- 2017-04-25 繁茂するラベンダーの使い道 - ponsuke_tarou’s blog
- 2017-05-02 ラベンダーのポプリを無駄なく作る方法 - ponsuke_tarou’s blog
アングスティフォリア
- 別名:イングリッシュラベンダー
- 学名:Lavandula angustifolia
- 名称不明
- ほのか
ストエカスラベンダー
- 別名:フレンチラベンダー
- 学名:Lavandula stoechas
- 名称不明
- 2018-05-22 春に盛大に切り戻したので今年のお花は諦める。
ラベンダーデンタータ
- 別名:フリンジラベンダー、キレハラベンダー
- 学名:Lavandula dentata
- 名称不明
- 名称不明
タイム
- 別名:タチジャコウソウ、イブキジャコウソウ
- 学名:Thymus vulgaris L.
- 分類:シソ科イブキジャコウソウ属(ティムス属)
コモンタイム
ゴールデンレモンタイム
- 学名:Thymus x citriodorus ”Aureus”
- 2018-05-29 使いきれなくてオリーブオイルに突っ込んだ。流行りのハーバ何とかっぽい。
スペアミント
- 分類 : シソ科ハッカ属
- 学名 : Mentha spicata
- 別名 : ミドリハッカ、オランダハッカ
- https://harb-tea.com/how-to-tell-mint/:葉はギザギザしているのが特徴
マロウ
ゼニアオイ
- 直根性
- 開花:5-8月
- 酸性の土を嫌うため土に苦土石灰を混ぜておく。
- 原産地:ヨーロッパ
- 害虫:ハマキムシ、アブラムシ、ワタノメイガなど
- 2018-05-22 ポット苗から育成中。
- 2018-06-09 コモン・マロウの葉っぱを食べてみた。 - ponsuke_tarou’s blog
- 2018-07-07 初めて花が咲いた
デルフィニウム
ブルーミラー
- 学名:Delphinium chinensis
- 別名:Larkspur、オオヒエンソウ
- 耐寒性1年草
- 2018-05-22 地植えしてから1年草なのを知った。1回目の花をドライフラワーにしたら凄く色が残って良かった。
コウモリラン
- 別名:ビカクシダ
- 分類:ウラボシ科ビカクシダ属
- 原産地:東南アジア、ポリネシア、亜熱帯オーストラリア
- 樹木や岩などに付着して生育する着生シダ
- 根を保護したり落ち葉や雨水などを受けるための付着葉と、繁殖のための胞子がつく胞子葉、2種類の葉がある
月桂樹
- 別名:ローリエ、ローレル
- 学名:Laurus nobilis
- 分類:楠(くすのき)科ゲッケイジュ属
- 2018-06-17 衣類の防虫剤になるらしいので冬物をしまうときに10枚くらい入れてみた。
キク科
ムギワラギク
- 別名:帝王貝細工(ていおうかいざいく)
- 分類:キク科ムギワラギク属
- 学名:Xerochrysum bracteatum
コロロ
- フランボワーズ
お亡くなりになってしまった方々
すみれ
ムーランフリルネロ
- スミレ科ビオラ属
- 時間が立つと黒から濃い紫色に変色していく
- 2018-05-22 ナメクジの餌食中。
名称不明
- 2018-05-22 ナメクジの餌食中。
- 2018-06-20 ナメクジの餌食になったところをバッサリ切ったら蘇らなかった・・・。