JMeterを使ってみた記録

  • 環境
    • Windows10 Pro バージョン1909
    • java version "1.8.0_251"

JMeterで負荷をかけたいのです。

アプリケーションにおいて、パフォーマンスは重要な要素です。また、どの程度の負荷まで耐えられるのかも、同じく重要な要素となります。JMeterを使用して、このような重要な要素を計測し、より信頼性の高いアプリケーションの開発・改良に役立てましょう。

1. JMeterの基本 | TECHSCORE(テックスコア)

やりたいこと

ローカル環境で実行しているWebアプリケーションで任意の操作中に負荷をかけたい。

JMeterをインストールします。

  1. Apache JMeter - Download Apache JMeterを表示する
  2. [Binaries]からzipファイルをダウンロードする
    • f:id:ponsuke_tarou:20201021093922p:plain
    • 今回は「apache-jmeter-5.3.zip」をダウンロードした
  3. zipファイルを解凍して任意の場所に配置する
# zipファイルを解凍して「/c/apps/」に配置する
$ unzip apache-jmeter-5.3.zip -d /c/apps/
Archive:  apache-jmeter-5.3.zip
   creating: /c/apps/apache-jmeter-5.3/
  inflating: /c/apps/apache-jmeter-5.3/LICENSE
#...省略...
  inflating: /c/apps/apache-jmeter-5.3/docs/api/org/apache/log/package-summary.html
  inflating: /c/apps/apache-jmeter-5.3/docs/api/org/apache/log/package-tree.html

# 「apache-jmeter-5.3/bin/」配下のコマンドでバージョンを確認する
WARNING: package sun.awt.X11 not in java.desktop
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.3

Copyright (c) 1999-2020 The Apache Software Foundation

JMeterの画面を起動します。

# apache-jmeter-5.3/bin/jmeterを実行すると画面が起動する
$ /c/apps/apache-jmeter-5.3/bin/jmeter
WARNING: package sun.awt.X11 not in java.desktop
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
   Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================

f:id:ponsuke_tarou:20201021105049p:plain

メニューを日本語表示にする

初期段階ではメニューが英語になっているので日本語表示にします。

  1. [Option] > [Choose Language] > [Japanese]
  2. メニューが日本語表示になる f:id:ponsuke_tarou:20201021134355p:plain

画面の操作を記録する(書き途中)

Thread Groupを作成する

  1. 左に表示されている[Test Plan]を右クリック
  2. [追加] > [Thread(Users)] > [スレッドグループ]で追加する
  3. 表示された画面で以下を設定する
項目 意味 設定値
名前 任意、初めてなのでデフォルトのまま
コメント 任意の値、とりあえず未設定
サンプルエラー後のアクション テスト停止
スレッド数 1回の実行でのアクセス数 初めてなのでデフォルトのまま
Ramp-Up期間 全リクエストの作成時間 60秒
ループ回数 シナリオを繰り返す回数 初めてなのでデフォルトのまま

各項目の意味は、【図解】はじめてでもわかるJMeterの使い方 - RAKUS Developers Blog | ラクス エンジニアブログが図まであってとても分かりやすいです。

記録コントローラーを作成する

  1. スレッドグループを右クリック
  2. [追加] > [ロジックコントローラー] > [記録コントローラー]で追加する
  3. 表示された画面で以下を設定する
項目 設定値
名前 任意、初めてなのでデフォルトのまま
コメント 任意の値、とりあえず未設定

HTTPプロキシサーバを作成する

  1. TestPlanを右クリック
  2. [追加] > [Non-Test エレメント] > [HTTP プロキシサーバ]で追加する
  3. 表示された画面で以下を設定する
項目 設定値
名前 任意、初めてなのでデフォルトのまま
コメント 任意の値、とりあえず未設定
ポート 使用していないポート番号、デフォルトの8888はちょうど使っていないのでそのまま
対象となるコントローラ 作成した記録コントローラを選択

プロキシを設定する

今回使用するのはChromeです。

  1. Win + R > [ファイル名を指定して実行]ダイアログを表示
  2. control inetcpl.cplを入力して[OK]ボタンで[インターネットのプロパティ]ダイアログを開く
  3. [接続]タブ > [LANの設定]ボタンでダイアログを開く
  4. [LANにプロキシサーバーを使用する] > ON
  5. 以下を設定し、[OK]ボタンで保存する
項目 設定値
アドレス localhost
ポート JMeterでHTTPプロキシサーバのポートに設定した値

f:id:ponsuke_tarou:20201021145844p:plain

画面の操作を記録する

  1. HTTP プロキシサーバの画面にある[開始]ボタンで記録を開始する
  2. ダイアログが表示されるので[OK]ボタンで進める
    • f:id:ponsuke_tarou:20201021151653p:plain
  3. ダイアログがさらに表示されるけど気にせずブラウザ画面の操作を開始する
    • f:id:ponsuke_tarou:20201021151810p:plain
  4. 操作を終了する場合は上記ダイアログの[停止]ボタンで終了する

localhostで記録する場合の注意ポイント

localhost:{アプリサーバのポート}/{アプリのURL}で画面の操作を記録をしたところ記録されたポートがアプリサーバの管理画面のポート(Payaraを使ったので4848)の記録しか取れませんでした。アプリでの操作が記録されなかったのです。

f:id:ponsuke_tarou:20201021162659p:plain
右側の[記録コントローラ]にぶら下がったHTTPリクエストの画面

  • localhostで記録する場合
    1. ipconfigでPCのIPアドレスを確認する
    2. {PCのIPアドレス}:{アプリサーバのポート}/{アプリのURL}をブラウザで表示する
      • この時点では「このサイトにアクセスできません」となって画面が表示できません。
    3. 「プロキシを設定する」をする
    4. HTTP プロキシサーバの画面にある[開始]ボタンで記録を開始する
    5. ブラウザをリロードするとアプリケーションの画面が表示される
    6. 操作を記録する
  • 参考 : たぬきさんのメモ帳:【JMeter】HTTPプロキシサーバとアプリケーションのお話

TCPとUDPの違いから知る特徴

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

TCPのコネクション確立方式である3ウェイハンドシェイクを表す図はどれか。

https://www.sc-siken.com/kakomon/30_aki/img/18a.gif https://www.sc-siken.com/kakomon/30_aki/img/18u.gif

https://www.sc-siken.com/kakomon/30_aki/img/18i.gif https://www.sc-siken.com/kakomon/30_aki/img/18e.gif

平成30年秋期問18 3ウェイハンドシェイクを表す図|情報処理安全確保支援士.com

TCPUDPは、トランスポート層プロトコルです。

OSI参照モデルTCP/IP役割プロトコル
アプリケーション層アプリケーション層サーバとアプリケーションとの間の通信HTTP/FTP/Telnet
プレゼンテーション層データの表現形式や文字コードを規定し、テキスト・画像などのデータ形式を区別
セッション層プロセスを区別して論理的な通信路を確立
トランスポート層トランスポート層通信における信頼性を確保するTCP/UDP
ネットワーク層インターネット層IPアドレスを元にネットワークを識別して転送に必要な情報を付け加えるIP
データリンク層ネットワークインターフェース層データリンク層では物理アドレスMACアドレスが識別にデータの送信先を特定
物理層ハードウェアデータを通信回線に送るのに必要な物理的な仕様を規定

TCP/IP階層モデルにおいて, TCPが属する層はどれか。

答. トランスポート層

https://www.fe-siken.com/kakomon/23_aki/img/38.gif

平成23年秋期問38 TCP/IP階層モデル|基本情報技術者試験.com

IPプロトコルとセッション層以上のプロトコルとをつないでいます。

インターネットで使われるプロトコルであるTCP及びIPと,OSI基本参照モデルの7階層との関係を適切に表しているものはどれか。

https://www.fe-siken.com/kakomon/13_haru/img/60.gif

TCPとIPは、インターネットや大多数のイントラネットなどをネットワークの基盤となっているプロトコルです。

平成13年春期問60 TCP/IPとOSI基本参照モデル|基本情報技術者試験.com

f:id:ponsuke_tarou:20201017205514j:plain
国指定重要文化財目黒邸

UDPは、リアルタイム性に優れたプロトコルです。

トランスポート層プロトコルであり,信頼性よりもリアルタイム性が重視される場合に用いられるものはどれか。

答. UDP

UDPは、TCPから信頼性確保を取り除いたコネクションレス型の通信を実現するプロトコルです。

平成29年秋期問34 トランスポート層のプロトコル|基本情報技術者試験.com

IPアドレスの偽装が容易にできてしまいます。

UDPの性質を悪用したDDoS攻撃に該当するものはどれか。

答. DNSリフレクタ攻撃

https://www.sc-siken.com/kakomon/30_aki/img/07.gif

平成30年秋期問7 UDPの性質を悪用したDDoS攻撃|情報処理安全確保支援士.com

プロトコル TCP UDP
タイプ コネクション型プロトコル コネクションレスプロトコル
高信頼性 高い 低い
速度/負荷 遅い/高い 早い/低い

f:id:ponsuke_tarou:20201017205627j:plain
目黒邸は新潟県魚沼市にある

TCPは、いろんな仕組みで高信頼性を高めるプロトコルです。

https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00780/052700004/A.jpg?__scale=w:500,h:525&_sh=07c0fe0330

仕組みが一目瞭然、インターネットを支えるTCPとUDPを完全図解(2ページ目) | 日経クロステック(xTECH)

ポート番号でセッション層以上のプロトコルを識別します。

TCP/IPで使われるアドレスやポート番号のうち,TCPのコネクションを識別するために必要なものの組合せはどれか。

答. あて先IPアドレス,あて先TCPポート番号,送信元IPアドレス,送信元TCPポート番号

OSI基本参照モデルTCPが属するトランスポート層は、通信の信頼性を確保する機能のほかに、アプリケーション間の通信を実現するという機能があります。

平成17年秋期問51 TCPコネクションの識別情報|応用情報技術者試験.com

使われる情報 情報から識別すること
あて先IPアドレス 情報を届ける先のホスト
あて先TCPポート番号 情報を届ける先アプリケーション
送信元IPアドレス 返信する時に宛先にするホスト
送信元TCPポート番号 返信する時に宛先にするアプリケーション

アプリケーションやプロトコルによってウェルノウンポートというお決まりのポート番号があります。 そのため、悪い人に狙い撃ちされることもあります。

PCへの侵入に成功したマルウェアがインターネット上の指令サーバと通信を行う場合に,宛先ポートとしてTCPポート番号80が多く使用される理由はどれか。

答. Webサイトの閲覧に使用されることから,通信がファイアウォールで許可されている可能性が高い。

マルウェアが80/TCPを使用するのは、このポートを使えば指令サーバへの通信をファイアウォールで遮断されにくく、さらに業務上行われる大量のHTTP通信に自身の通信を紛れ込ませられるからです。

平成28年秋期問45 TCPポート番号80が使用される理由|基本情報技術者試験.com

通信を始める前に3ウェイハンドシェイクでコネクションを確立します。

順番 SYN
synchronize
同期する
ACK
acknowledgement
承認
シーケンス番号 確認応答番号
1 1 0 ランダムな値 なし
2 1 1 相手から受信したシーケンス番号 相手から受信したシーケンス番号 + 1
3 0 1 相手から受信した確認応答番号 相手から受信したシーケンス番号

1. Aは、Bに接続要求(SYN)をします。

https://hldc.co.jp/blog/wp-content/uploads/2019/07/TCP_Start-1.jpg

TCPとUDPの違いとは?~Ethernet接続におけるオーバーヘッド削減ノウハウ~ | ハートランド・ザ・ワールド

2. Bは、確認応答(ACK)をして、Aに接続要求(SYN)をします。

https://www.infraexpert.com/studygif/tcpip24.gif

TCP/IP - TCP 3ウェイハンドシェイク

3. Aは、確認応答(ACK)をします。

https://upload.wikimedia.org/wikipedia/commons/f/f0/Three-way-handshake-example.gif

3ウェイ・ハンドシェイク - Wikipedia

確認応答は、受信側がデータを受け取ると「受け取ったよ連絡(ACK)」をする仕組みです。

TCPのフロー制御に関する記述のうち,適切なものはどれか。

答. 確認応答がない場合は再送処理によってデータ回復を行う。

平成23年特別問19 TCPのフロー制御に関する記述|情報処理安全確保支援士.com

フロー制御は、通信状況に応じてデータの転送量を制御することです。

TCPを使用したデータ転送において,受信ノードからの確認応答を待たずに,連続して送信することが可能なオクテット数の最大値をなんと呼ぶか。

答. ウィンドウサイズ

ウィンドウサイズは、TCP通信において受信側が現在受信可能なデータサイズを送信側に伝えるために使用されるTCPヘッダ内のフィールドです。

平成18年春期問53 TCPヘッダのウィンドウサイズ|応用情報技術者試験.com

相手からの応答がなくても1度に送信できるデータ量をウィンドウサイズといいます。

https://www.infraexpert.com/studygif/tcpip29.gif

TCP/IP - TCP ウィンドウ制御、フロー制御

毎回、「受け取ったよ連絡」を確認してから次を送信していると効率が悪いのです。 受信側で受け取れるデータ量を教えてくれるのでその量までACKがこなくてもデータを送ります。

TCPヘッダ中のウィンドウサイズの説明として,適切なものはどれか。

答. 受信側からの確認応答を待たずに,データを続けて送信できるかどうかの判断に使用される。

送信側ではウィンドウサイズで指定されたデータを送信し、そのデータの受信確認応答を待つ間に、最新の確認応答内のウィンドウサイズを確認してデータを送信することを繰り返します。このようにデータの確認応答を待たずに次のデータ送信を行うことで、TCPでは効率のよいデータ転送が可能となっています。

平成21年春期問15 ウィンドウサイズの説明|情報処理安全確保支援士.com

f:id:ponsuke_tarou:20201017205812j:plain
造りがとっても素敵です。

次回の勉強内容

ponsuke-tarou.hatenablog.com

DNSの基本を学ぼう

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

DNSに関する記述のうち,適切なものはどれか。

  1. DNSサーバに対して,IPアドレスに対応するドメイン名,又はドメイン名に対応するIPアドレスを問い合わせるクライアントソフトウェアを,ゾルという。
  2. 問合せを受けたDNSサーバが要求されたデータをもっていない場合に,他のDNSサーバを参照先として回答することを,ゾーン転送という。
  3. ドメイン名に対応するIPアドレスを求めることを,逆引きという。
  4. ドメイン名を管理するDNSサーバを指定する資源レコードのことを,CNAMEという。

平成28年秋期問18 DNSに関する記述|情報処理安全確保支援士.com

DNSは、ドメイン名やホスト名などとIPアドレスとを対応付けます。

TCP/IPネットワークでDNSが果たす役割はどれか。

TCP/IPを利用したネットワークでは、各ノードを識別するため一意のIPアドレスが割り当てられていますが、このIPアドレスは数字の羅列で人間にとって覚えにくいため、IPアドレスと対応する別名であるドメイン名が付けられています。DNS(Domain Name System)はこのドメイン名とIPアドレスを結びつけて相互変換する(名前解決する)仕組みです。
平成20年秋期問35 DNSが果たす役割はどれか|基本情報技術者試験.com

インターネット上のDNSサーバは階層化されており、ある名前の問合せが解決できない場合は、上位のDNSサーバに問い合わせて結果を得ることができます。

DNSに関する記述のうち,適切なものはどれか。

  • 答. インターネット上のDNSサーバは階層化されており,ある名前の問合せが解決できない場合は,上位のDNSサーバに問い合わせて結果を得ることができる。

DNSサーバは対応関係を階層構造で記憶していて、必要に応じてトップレベルのルートDNSサーバから下位に向かって順に問合せを行い、目的の対応を得ます。DNSサーバは通常2系統以上で構成されており、主系を「プライマリサーバ」、副系を「セカンダリサーバ」といいます。
平成20年春期問54 DNSに関する記述|応用情報技術者試験.com

f:id:ponsuke_tarou:20201015234037j:plain
月岡温泉したしみの宿東栄館の松風の半露天風呂

ゾーンは、特定のDNSサーバが管理するドメインの範囲のことです。

https://milestone-of-se.nesuke.com/wp-content/uploads/2018/09/transfer-zone-1.png.webp
【図解】DNSゾーン転送の仕組みとシーケンス~フォワーダとの違い,AD統合ゾーン,notify,スタブゾーンのメリット/デメリット~ | SEの道標

ゾーン情報が設定された大元のサーバをプライマリサーバといいます。

https://www.atmarkit.co.jp/icd/root/images/89124686.gif
Insider's Computer Dictionary:プライマリDNSサーバ とは? - @IT

プライマリサーバでは、無駄に情報を公開しないために設定でゾーン転送を許可するDNSサーバを限定できます。

DNSサーバに格納されるネットワーク情報のうち,第三者に公開する必要のない情報が攻撃に利用されることを防止するための,プライマリDNSサーバの設定はどれか。

  • 答. ゾーン転送を許可するDNSサーバを限定する。

定期的に実行される「プライマリ」から「セカンダリ」へのゾーン情報のコピー(同期処理)は、ゾーン転送(53/TCP)という機能を使用して行われますが、特に制限をしていない場合「セカンダリサーバ」以外のホストからの要求でも実行可能になっています。したがって攻撃者がこれを用いた場合「プライマリサーバ」からゾーン情報やサーバ/ネットワーク構成を不正に取得されてしまう可能性があります。
これを防ぐためには、ゾーン転送を行うホストをセカンダリサーバのみに制限し、ゾーン転送する情報の範囲を最小とする対策が有効です。
平成23年秋期問8 プライマリDNSサーバの設定|情報処理安全確保支援士.com

セカンダリサーバは、プライマリサーバからゾーン転送を受けてゾーン情報の複製を保持します。

https://image.itmedia.co.jp/ait/articles/1512/22/dnstips_pri_sec.gif
プライマリ、セカンダリの使い方を教えてください:DNS Tips - @IT

ゾーン情報はゾーンファイルに設定され、その1つ1つをレコードといいます。

https://jprs.jp/glossary/imgs/zonefile.png
JPRS用語辞典|ゾーンファイル

情報名 内容
Aレコード ドメインIPアドレスの対応が設定される
NSレコード ゾーン自身や下位ドメインに関するDNSサーバのホスト名が設定される
MXレコード ドメインへの電子メールを受け付けるメールサーバが設定される
CNAMEレコード 正規ホスト名に対する別名が設定される

https://www.nw-siken.com/kakomon/24_aki/img/09.gif
平成24年秋期問9 DNSのAレコードに関する記述|ネットワークスペシャリスト.com

ダイナミックDNSでは、PCのIPアドレスが変わっても、そのPCには同じホスト名でアクセスできます。

ダイナミックDNS(DNS UPDATE)の説明として,適切なものはどれか。

  • 答. PCのIPアドレスが変わっても,そのPCには同じホスト名でアクセスできる。

ダイナミックDNSは、インターネット接続の度に動的に割り振られるIPアドレスとそのホスト名の対応を動的に管理する仕組みです。
常時接続環境ではインターネット接続の度にDHCPからグローバルIPアドレスが割り振られるため、個人が自宅サーバを公開するときにホスト名とIPアドレスの対応をとることができないという問題が生じます。ダイナミックDNSでは、この問題に対応するために接続がある度(IPアドレスが割り振られる度)にIPアドレス・ホスト名対応情報の登録・更新をDNSサーバへ行います。これによって固定IPアドレスがない環境でも常に同じホスト名でアクセスさせることができるようになります。
平成19年秋期問35 ダイナミックDNS|応用情報技術者試験.com

インターネットプロバイダから割り当てられるIPアドレスが変わっても同じホスト名で接続できるようになります。

https://www.buffalo.jp/contents/topics/utilize/remoteaccess/setup/images/ddns_img.gif
これでできる!リモートアクセス|ダイナミックDNSの設定 | バッファロー

http://www.iobb.net/data/aboutddns.gif
ダイナミックDNSサービス - iobb.net

DNSサーバに対して、IPアドレスに対応するドメイン名又はドメイン名に対応するIPアドレスを問い合わせるクライアントソフトウェアをゾルといいます。

種類 問合せ方 機能
スタブゾル 再帰的問合せ
代理で他のDNSサーバに問い合わせをしてもらって最終結果をもらうこと
自分で名前解決できないからDNSリクエストを送信するだけのクライアント
フルサービスゾル 反復問合せ
名前解決できるまで繰り返して他のDNSサーバにお問合わせすること
自分で持っているキャッシュ情報か権威DNSサーバへの合わせで名前解決ができるサーバ

https://image.itmedia.co.jp/ait/articles/1706/23/wi-dnsfig302.png
DNSのリゾルバ/キャッシュ/フォワーダ機能:超入門DNS(1/2 ページ) - @IT

https://www.infraexpert.com/studygif/tcpip73.gif
TCP/IP - DNSとは その3

https://jprs.jp/glossary/imgs/non-recursivequery.png
JPRS用語辞典|非再帰的問い合わせ(non-recursive query)

キャッシュポイズニング攻撃対策として、再帰的な問合せに対しては内部ネットワークからのものだけに応答するように設定します。

https://www.ap-siken.com/kakomon/29_haru/img/41.gif
攻撃者がDNSキャッシュサーバに偽のキャッシュ情報を登録させる手順を追ってみます。

  1. 攻撃者は、キャッシュサーバに対して偽の再帰的な問合せを行い反復問合せを強制的に生じさせる。
  2. キャッシュサーバは、コンテンツサーバに対して反復問合せを行う。
  3. 攻撃者は、コンテンツサーバが正規の応答を返すよりも先にキャッシュサーバへ偽の応答を送りつける。
  4. キャッシュサーバは、攻撃者から送られた偽の応答を正規のものと判断しキャッシュに登録する。この時点でDNSクエリは解決済なのでコンテンツサーバから送られた正規の応答は破棄される。

(省略)再帰的問合せの役割は、内部ネットワークのホストが外部ネットワークに接続する際の名前解決であり、原則として外部からの再帰的な問合せに応じる必要はないはずですから、再帰的な問合せを受け付けるホストを内部ネットワークだけに限定することがキャッシュポイズニング攻撃への対策となります。
平成29年春期問41 キャッシュポイズニング攻撃への対策|応用情報技術者試験.com

f:id:ponsuke_tarou:20201015233841j:plain
旧古河庭園のバラ

次回の勉強内容

ponsuke-tarou.hatenablog.com

伊香保温泉と水沢山登山

1日目:始めて伊香保温泉に行きました。

f:id:ponsuke_tarou:20201012220259j:plain
到着した日は雨だったので登山はやめて温泉街を散歩しました。
f:id:ponsuke_tarou:20201012220704j:plain
伊香保神社
f:id:ponsuke_tarou:20201012220746j:plain
GOTOキャンペーンの影響でしょうか、人がごった返していました。
f:id:ponsuke_tarou:20201012220836j:plain
いつか泊まってみたい横手館
f:id:ponsuke_tarou:20201012220927j:plain
細い道の間から山が見えます。

2日目:いよいよ水沢山登山

2日目は晴れたのでいよいよお楽しみの登山です。
伊香保温泉から車で15分くらいで着きました。
水沢観音駐車場に車を停めてスタートです。
f:id:ponsuke_tarou:20201012222656j:plain
事前に調べた情報では水沢観音で駐車場を提供しているとのことだったのですが、拝観者に提供しているのであって登山者向けではありません。
なので登山の前後は参拝を忘れずしてきました。
結構境内にはいろいろあって楽しかったです。
mizusawakannon.or.jp
f:id:ponsuke_tarou:20201012222439j:plain
登山口は、階段を上がった権現様の横にあります。
f:id:ponsuke_tarou:20201012222528j:plain
途中に何かの歌の碑があります。が、漢字が読めなくて何かはよくわかりませんでした。
f:id:ponsuke_tarou:20201012221012j:plain
この白い花はお家で調べて、サラシナショウマ・・・かな・・・と。
サラシナショウマ | 薬草データベース
f:id:ponsuke_tarou:20201012221127j:plain
f:id:ponsuke_tarou:20201012222213j:plain
f:id:ponsuke_tarou:20201012222000j:plain
登山道は最後の辺り以外は階段が主体となっていました。
f:id:ponsuke_tarou:20201012222134j:plain
時間は2-3時間くらいで距離も2kmとライトですが・・・階段は辛い。
f:id:ponsuke_tarou:20201012221800j:plain
体重が多いので・・・なかなか体力のいる登山でした。
f:id:ponsuke_tarou:20201012221155j:plain
ぜぇぜぇいいながら休憩をすると木々の間からは素敵な景色が見えます。
登山の楽しみです。
f:id:ponsuke_tarou:20201012222019j:plain
f:id:ponsuke_tarou:20201012222040j:plain
途中はお地蔵様が迎えてくれます。ありがたいことです。
f:id:ponsuke_tarou:20201012221632j:plain
山頂は、狭めで登頂したときには10人くらいのパーティーがご飯中でぎゅうぎゅう状態でした。
折り返さずに反対側へ行くルートもあるそうです。
いつか挑戦してみたいものです。
f:id:ponsuke_tarou:20201012221740j:plain
山頂で出会った常連っぽいおじさんのお話では、散歩がてらに朝登る方もいるそうです。
どおりで、スタスタと登る人とぜぇぜぇいいながら登る人がいるわけです。
f:id:ponsuke_tarou:20201012221606j:plain
最後はやっぱり名物の水沢うどんです。駐車場の前にはいくつものおうどん屋さんがあって登山後には嬉しいお食事どころとなります。
f:id:ponsuke_tarou:20201012222317j:plain

CP932とMS932の違いを調べて知ったCP932とSJISの違い

「統合したCP932」とMS932は同じようなもんです。

「統合したCP932」をJavaではMS932といいます。
わざわざ「統合したCP932」としたのには理由があります。
CP932は時代によってものがちょっとずつ違うのです。

CP932の歴史

西暦 CP932
の歴史
ざっくり説明
1982 CP932誕生 マイクロソフトが日本語ようにSJISという文字コードを作りました。このSJISの管理番号はコードページ932(CP932)でした。
1982以降 NECIBMCP932をそれぞれで拡張 各社が自社製品用にCP932を拡張したのでCP932種類ができました。
1993 CP932を統合 マイクロソフトは拡張されたCP932を統合してWindows-31Jという名前でIANAに登録しました。CP932っていうと種類があるからJavaでは統合されたCP932(=Windows-31J)をMS932と呼ぶことにしました。

これをまとめてわかりやすい図で紹介しているのが以下のサイトです。

https://weblabo.oscasierra.net/wp-content/uploads/2015/07/shift_jis-windows31j.png
Shift_JIS と Windows-31J (MS932) の違いを整理してみよう |

「誕生したばかりのCP932」とSJISと同じですが、「統合されたCP932」とSJISには違いがあります。

「統合されたCP932」にはあるけどSJISにはない文字があります。

「誕生したばかりのCP932」はSJISと同じですが、紆余曲折の結果「統合されたCP932」にはあるけどSJISにはない文字があります。
NECやBIMが拡張した部分です。
なんだかんだで結構いっぱいあります。どれもむつかしい漢字ばっかり・・・読めない書けない見分けられない。
漢字以外にもあります。

(CP932にはあるけどSJISにはない漢字の一例)
奓 奛 奝 奣 妤 妺 孖 寀 甯 寘 寬 尞 岦 岺 峵 崧 嵓
﨑 << これは「タチサキ」というらしい
鋗 鋙 鋐 﨧 鋕 鋠 鋓 錥 錡 鋻 﨨 錞 鋿 錝 錂 鍰 鍗 鎤 鏆 鏞 鏸 鐱 鑅 鑈 閒 隆 﨩 隝 隯 霳 霻 靃 靍 靏 靑 靕 顗 顥 飯 飼 餧 館 馞 驎
髙 << これは「ハシゴダカ」というらしい

(CP932にはあるけどSJISにはない漢字以外の一例)
㌔ ㌢ ㍍ ㌘ ㌧ ㌃ ㌶ ㍑ ㍗ ㌍ ㌦ ㌣ ㌫ ㍊ ㌻ ㎜ ㎝ ㎞ ㎎ ㎏ ㏄ ㎡

ちなみにCP932SJISである文字ない文字を見るのにこちらのサイトが便利でした。
uic.jp

SJISCP932で2byte目が「5C」「7E」の文字には問題が起こることがあります。

Shift_JIS(SJIS, cp932) の文字コードで、2byte目が0x5c の \ になっているものの俗称(だめ文字、駄目文字)
0x5cの \ は使用するフォントやロケールによりバックスラッシュまたは¥記号で表示されます。
ダメ文字を含む文字列やパス、ファイル名を処理する場合には文字化け、検索不可など様々な不具合が起きることがあります。
ダメ文字には ー ソ 十 表 など、使用頻度の高いものもあるので cp932を扱う場合には注意が必要です。
fudist - Shift_JIS(cp932)の「ダメ文字」

2byte目が5cと7eの一例

2byte目→
↓1byte目
5c 7e
0x \ ~ \正規表現とかでエスケープ文字になる
81 ×
83
84 Ы н
89
8a
8b
8c
8d
8e
8f
90
95 何年か前に「表現」って文字がおかしくなったことがあったなぁ
87 ここはCP932にはあるけどSJISにはない
fa ここはCP932にはあるけどSJISにはない

WindowsにPython3とPyCharmをインストールする方法

  • 環境
    • Windows10 Pro 64bit バージョン1909

Pythonをインストールする

参考 : Pythonのダウンロードとインストール | Python入門

exeファイルをダウンロードする

  1. Python Releases for Windows | Python.orgを表示する
  2. [Latest Python 3 Release - Python 3.x.x]リンクを押下する
  3. ページの下のほうにある一覧から「Windows x86-64 executable installer」からexeファイルをダウンロードする

f:id:ponsuke_tarou:20200924172105g:plain

インストールする

  1. ダウンロードしたexeファイルを実行してダイアログを表示する
  2. [Add Python 3.x to PATH]にチェックを入れて環境変数のPATHに追加されるようにする
  3. [Customize installation]リンクで次の画面を表示する
  4. [Optional Features]でオプションを選択する
    • 今回は初めてなので全選択
  5. [Advanced Options]でオプションを選択する
    • インストール先を指定したい場合は[Customize install location]で指定する
    • f:id:ponsuke_tarou:20200924173133p:plain
      今回はこんな感じ
  6. [Install]ボタンでインストールする
  7. [Setup was successful]が表示されたら[Close]ボタンでダイアログを閉じる

バージョンを確認する

インストールされたことを確認するためにバージョンを確認する

$ python -V
Python 3.8.5

PyCharm(統合開発環境)をインストールする

PyCharmは無料版をインストールします。

exeファイルをダウンロードする

  1. PyCharm:JetBrainsによるプロ開発者様向けPython IDEを表示する
  2. [ダウンロード]ボタンで次の画面を表示する
  3. [Windows]の[コミュニティ]にある[ダウンロード]からexeファイルをダウンロードする

f:id:ponsuke_tarou:20200924175653g:plain

インストールする

  1. ダウンロードしたexeファイルを実行してダイアログを表示する
  2. [Next]ボタンで[Choose Install Location]画面へ進んでインストール先を指定する
  3. [Next]ボタンで[Installation Options]画面へ進んでオプションを選択する
  4. [Finish]ボタンでダイアログを閉じる

プロジェクトを設定する

既存のプロジェクトをインポートする

gitでcloneしてきた既存プロジェクトをインポートします。
参考 : 既存のソースコードからプロジェクトをインポートする — PyCharm

  1. pyCharmを起動する
  2. [Open]でcloneしたフォルダを選択してインポートする
    • f:id:ponsuke_tarou:20200925152253p:plain

既に別のプロジェクトがある場合
PyCharmを使っていてほかのプロジェクトがある場合はこちらの方法でインポートします。

  1. [File] > [New Project...]でダイアログを開く
  2. 以下を設定して[Create]ボタン
    • Location : cloneしたフォルダを選択
    • New enviroment using : Virtualenv
      • Location : 仮想環境を作る空のフォルダを指定(今回は初期値のプロジェクトフォルダ/venv/)
      • ここを設定すると次の「仮想環境を作成して設定する」が不要になります。
    • Create a maion.py welcome script : OFF
  3. ダイアログ(cloneした場所にいろいろ作っていい?)で[Create from Existing Sources]ボタン(選択はお好みで)
    • f:id:ponsuke_tarou:20210118100606p:plain
  4. 次のダイアログ(既存のプロジェクトと別Windowにする?)で[New Window]ボタン(選択はお好みで)
    • f:id:ponsuke_tarou:20210118100809p:plain
  5. ちょっと待つとプロジェクトがインポートされる(仮想環境用のディレクトリもできている)
    • f:id:ponsuke_tarou:20210118100859p:plain
仮想環境を作成して設定する

参考 : 仮想環境を構成する — PyCharm

  1. 「Ctrl+Alt+S」で設定画面を表示する
  2. [Project:{プロジェクト名}] > [Python Interpreter] > 歯車アイコン > [Add]でダイアログを表示する
  3. 左側のペインで[Virtualenv Enviroment]を選択して以下を設定する
    • Location : 仮想環境を作る空のフォルダを指定(今回は初期値のプロジェクトフォルダ/venv/)
    • Base interpreter : 使うPythonのバージョンを選択する
    • Inherit global site-packages(グローバル site-packages を継承する) : OFF
    • Make available to all projects(すべてのプロジェクトで使用可能にする) : OFF
  4. [OK]ボタンで仮想環境を作成する
  5. [Apply]ボタンで反映して、[Close]ボタンで設定画面を閉じる
    • Locationフォルダが作成されて中にいろいろ入ってる
ライブラリをインストールする
  1. 画面下にある[Terminal]でターミナルを開く
    • f:id:ponsuke_tarou:20200925173451p:plain
  2. pip install {ライブラリ}の形式で開発に必要なものをインストールする
# Pythonのパッケージの形式であるwheel(ホイール)をインストールする(PyInstallerを使うのに必要)
(venv) C:\path\project>pip install wheel
# ...省略...
Successfully installed wheel-0.35.1

# 処理の高速化をしてくれるCython(サイソン)をインストールする(NumPyを使うのに必要)
(venv) C:\path\project>pip install Cython
# ...省略...
Successfully installed Cython-0.29.21

# 数値計算ライブラリであるNumPyをインストールする
(venv) C:\path\project>pip install numpy
# ...省略...
Successfully installed numpy-1.19.2

# PythonコードをWindows用のexeファイルに変換してくれるPyInstallerをインストールする
(venv) C:\path\project>pip install pyinstaller
# ...省略...
Successfully installed altgraph-0.17 future-0.18.2 pefile-2019.4.18 pyinstaller-4.0 pyinstaller-hooks-contrib-2020.8 pywin32-ctypes-0.2.0

# ファイルにライブラリとバージョンを書いてインストールすることもできる
(venv) C:\path\project>pip install -r requirements.txt
# ...省略...
Successfully installed astroid-2.4.2 colorama-0.4.3 et-xmlfile-1.0.1 isort-4.3.21 jdcal-1.4.1 lazy-object-proxy-1.4.3 mccabe-0.6.1 numpy-1.19.0 openpyxl-3.0.4 pandas-1.0.5 pyinstaller-hooks-contrib-2020.7 pylint-2.5.3 python-dateutil-2
.8.1 pytz-2020.1 six-1.15.0 toml-0.10.1 typed-ast-1.4.1 wrapt-1.12.1 xlrd-1.2.0

Macにインストールしたい場合

ponsuke-tarou.hatenablog.com

CookieにはWebアプリケーションでのユーザ情報やセッションIDが格納されます

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

CookieにSecure属性を設定しなかったときと比較した,設定したときの動作として,適切なものはどれか。

  1. WebブラウザがアクセスするURL内のパスとCookieによって指定されたパスのプレフィックスが一致するとき,WebブラウザからCookieが送出される。
  2. URL内のスキームがhttpsのときだけ,WebブラウザからCookieが送出される。
  3. JavaScriptによるCookieの読出しが禁止される。
  4. Cookieに指定された有効期間を過ぎると,Cookieが無効化される。

平成30年春期問11 secure属性を付けたときの動作|情報処理安全確保支援士.com

Cookieは、Webサーバに対するアクセスがどのPCからのものであるかを識別するためにブラウザにユーザ情報などを保存する仕組みです。

cookie(HTTP cookie:クッキー)は、状況によって異なるページを提供したいというニーズにより開発され、ユーザ識別やセッション管理を実現する目的などに利用されています。
平成19年秋期問36 cookieの説明|基本情報技術者試験.com

https://wakaru-web.com/wp/wp-content/uploads/2018/12/cookie01-750x656.jpg
【知識】Cookie(クッキー)って何のこと?何の役に立つの? | わかるWeb

https://www.soumu.go.jp/main_sosiki/joho_tsusin/security_previous/kiso/illust/cookie.gif
基礎知識 Cookieの仕組み

シングルサインオンのユーザー認証にも使用されます。

クッキーを使うSSO

  1. 最初のログインの際には、Webサーバにインストールされたエージェントが認証サーバにアクセスで認証を行う。
  2. その認証・識別情報をクッキーに含めクライアントに返す。
  3. 別のWebサーバにアクセスがあった場合には、エージェントが認証サーバにアクセスしクッキー情報をもとに認証を行う。

平成24年秋期問36 シングルサインオンの説明|応用情報技術者試験.com

サーバごとの認証情報を含んだCookieがサーバで生成され、クライアントのコンピュータに保存されます。

https://xtech.nikkei.com/it/article/COLUMN/20080221/294407/zu01.jpg
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)

f:id:ponsuke_tarou:20201015235804j:plain
月岡温泉したしみの宿東栄館のお夕飯

セッションは、サーバとの一連のやり取りの流れです。

https://www.asobou.co.jp/blog/wp-content/uploads/2017/05/session.jpg
Googleアナリティクスの基本指標を正しく理解しよう<セッション・ユーザー・ページビュー数> : ビジネスとIT活用に役立つ情報

セッションハイジャックとは、利用者のセッションIDを不正に取得しその利用者になりすましてサーバにアクセスすることです。

f:id:ponsuke_tarou:20210929194740j:plain

セッションIDによってセッションが管理されるとき,攻撃者がログイン中の利用者のセッションIDを不正に取得し,その利用者になりすましてサーバにアクセスする。
平成29年春期問23 ディレクトリトラバーサル攻撃|情報セキュリティマネジメント試験.com

セッションハイジャックされると、Cookieの情報では正規ユーザーによる操作なのかは判別できません。

セッションハイジャック等によって、ログイン中のセッションが第三者に乗っ取られても、URLやCookieに格納されているセッションIDが正規のものである限り、Webアプリケーション側では「攻撃者によって乗っ取られたリクエスト」なのか「正規ユーザによるリクエスト」なのかの区別がつきません。
平成28年春期問41 ブラウザに送信する直前に行う対策|応用情報技術者試験.com

https://xtech.nikkei.com/it/article/COLUMN/20080221/294407/zu02.jpg
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)

Webアプリケーションのセッションが攻撃者に乗っ取られた場合は、重要な情報をWebブラウザに送信する直前にはパスワードによる利用者認証などを行う必要があります。

Webアプリケーションのセッションが攻撃者に乗っ取られ,攻撃者が乗っ取ったセッションを利用してアクセスした場合でも,個人情報の漏えいなどの被害が拡大しないようにするために,Webアプリケーションが重要な情報をWebブラウザに送信する直前に行う対策として,最も適切なものはどれか。

エ. パスワードによる利用者認証を行う。
平成28年春期問41 ブラウザに送信する直前に行う対策|応用情報技術者試験.com

CookieからセッションIDをパクられるとセッションハイジャックされます。

セッションハイジャック対策

  • 「推測」への対抗
    • 予測困難なランダム値を使う
    • ログイン(ユーザ認証)成功のたびに異なる値を使う
  • 「奪取」への対抗
    • TLS を使用する
    • Cookieにsecure属性をつける
    • Cookieの「寿命」を短めにする
    • ログイン成功時にセッションIDを発行し直す

IPA『セキュア・プログラミング講座(Webアプリケーション編)』ブートアップセミナー資料

利用者のログアウト時には、WebサーバにおいてセッションIDを無効にします。

f:id:ponsuke_tarou:20200914221825p:plain
IPA『セキュア・プログラミング講座(Webアプリケーション編)』ブートアップセミナー資料

Webシステムにおいて,セッションの乗っ取りの機会を減らすために,利用者のログアウト時にWebサーバ又はWebブラウザにおいて行うべき処理はどれか。ここで,利用者は自分専用のPCにおいて,Webブラウザを利用しているものとする。

イ. WebサーバにおいてセッションIDを無効にする。
平成30年春期問43 セッションハイジャック対策|応用情報技術者試験.com

CookieにSecure属性を設定することで、httpsのときだけWebブラウザからCookieが送出されます。

 secure属性が指定されていないと,暗号化されていない通信経路上にクッキーが送信されてしまい,盗聴される危険がある。最近の開発環境では,アプリケーション・サーバーや,フレームワークがsecure属性の設定を自動的に設定することが多いため気付きにくいかもしれない。マニュアルを確認し,正しく設定する必要がある。
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)

Cookieを発行する際に指定できる属性にはほかにもいろいろあります。

  • Domain : cookieを送信するドメインを指定する属性。
  • Path : cookieを送信するURLディレクトリを指定する属性。
  • Expires : cookieの有効期限を指定できる属性。指定しない場合の期限はブラウザの終了時まで。
  • HttpOnly : この属性が設定されたcookieJavaScriptからアクセスできなくなる。

情報セキュリティスペシャリスト平成26年春期 午前Ⅱ 問10

 expires属性は,被害が発生してしまう可能性と関連する。この指定がある場合,指定された日時までクッキーが送信される。つまり,クッキーは指定された日時までファイル上に保存され,ブラウザ再起動後もその値が読み込まれ使用される。指定がない場合,有効期限はブラウザが終了するまでとなる。

 この属性が指定されていなければ,ブラウザを起動していないユーザーが被害に遭うことはない。しかし,この属性が指定されていると,ブラウザ起動時にクッキーが自動的に読み込まれ送信されるため,ブラウザを起動していないユーザーも被害に遭う対象となる。この属性は,オートログイン機能を実現するために設定されることが多いが,このようなリスクが発生することは認識しておかなければならない。
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)

f:id:ponsuke_tarou:20201015235704j:plain
月岡温泉したしみの宿東栄館のお夕飯

次回の勉強内容

ponsuke-tarou.hatenablog.com

レスポンシブ対応で知ったメディアクエリの基本

メディアクエリは、表示するディバイスなどによって適用するCSSを切り替える機能です。

表示された画面環境に応じて適用するスタイルを切り替える機能。
メディアクエリ(Media Queries)とは - IT用語辞典 e-Words

メディアクエリは画面の解像度 (例えばスマートフォンの画面とコンピュータの画面) といった条件に対応してコンテンツの描画が行えるようにするCSS3のモジュールである。
メディアクエリ - Wikipedia

メディアクエリは、一般的な端末の種類 (プリンタと画面など)や特定の特性 (画面の解像度やブラウザーのビューポートの幅など) に応じてサイトやアプリを変更したいときに便利です。
メディアクエリの使用 - CSS: カスケーディングスタイルシート | MDN

メディアクエリの指定方法

HTMLファイルにタグの属性として指定する

<!--linkタグのmedia属性で指定する-->
<link rel="stylesheet" href="hoge.css" media="screen, projection, tv" />
<!--styleタグのmedia属性で指定する-->
<style type="text/css" media="aural, speech">
...スタイルの指定...
</style>
<!--pictureタグの内部でのみsourceタグで使える-->
<picture>
  <source media='(min-width: 650px)' srcset='hoge.png'>
</picture>

CSSファイルに指定する

/* @mediaで指定する */
@media only screen and (max-device-width: 480px){
...スタイルの指定...
}
/* @importでCSSファイルと一緒に指定する */
@import url(example.css) screen and (color);

メディアは、メディアタイプかメディア特性を論理演算子で組み合わせて指定します。

メディアタイプの種類

メディアタイプは端末の全般的なカテゴリを説明します。 not 又は only の論理演算子を使用する場合を除いて、メディアタイプは任意であり、 all タイプが暗黙に含まれています。
メディアクエリの使用 - CSS: カスケーディングスタイルシート | MDN

メディアタイプ 対象
all すべての端末
screen printに一致しないすべての端末
print ページ付きの素材や、印刷プレビューモードで画面に表示された文書
  • 以下のメディアタイプは、メディアクエリ4から非推奨
    • tty(文字幅が固定の機器) / tv(テレビ) / projection(プロジェクタ) / handheld(携帯機器) / braille(点字ディスプレイ) / embossed(点字プリンタ) / aural(音声出力) / speech(音声出力)
    • 参考 : Media Queries Level 4

メディア特性の種類

メディア特性は、特定のユーザーエージェントや、出力端末や、環境などの特性を記述します。メディア特性式は、存在又は値を検査するもので、完全に任意です。それぞれのメディア特性式は、括弧で囲む必要があります。
メディアクエリの使用 - CSS: カスケーディングスタイルシート | MDN

名前 概要
color 出力端末の色コンポーネントあたりの色数、または端末がカラーでなければゼロ
height ビューポートの高さ
orientation ビューポート (またはページ付きメディアではページボックス) の向き portrait(縦長) / landscape(横長)
scripting スクリプト(例えばJavaScript)が利用できるかを検出する
width ビューポートの幅

※. 使いそうなのだけ抜き出したましたが、@media - CSS: カスケーディングスタイルシート | MDNにはたくさん乗っているので参照してください。

論理演算子の種類

論理演算子 not, and, only を使用して、複雑なメディアクエリを構成することができます。複数のメディアクエリをカンマで区切って、単一の規則にまとめることもできます。
メディアクエリの使用 - CSS: カスケーディングスタイルシート | MDN

論理演算子 意味
and 複数のメディア特性・メディアタイプをまとめる。
真になるためには結合されたそれぞれの特性が真を返す必要がある。
@media (min-width: 30em) and (orientation: landscape) { ... }
not メディアクエリを否定する。
クエリが偽を返せば真を返す。
使用する場合は、メディアタイプも指定しなければならない。
@media not all and (monochrome) { ... }
上記の解釈は以下
正解:
@media not (all and (monochrome)) { ... }
誤り:
@media (not all) and (monochrome) { ... }
only クエリ全体が一致した場合にスタイルを適用。
使用する場合は、メディアタイプも指定しなければならない。
メディア特性がついたメディアクエリに対応していない古いブラウザーで、そのスタイルが適用されるのを防ぐ。
最近のブラウザーでは効果がない。
@media only screen and (color) { ... }
,(カンマ) 複数のメディアクエリを一つのメディアクエリに結合する。
リストは論理 or 演算子のように動作する。
@media (min-height: 680px), screen and (orientation: portrait) { ... }

スマートフォン用にはどんな指定がいいか集めてみました。

いろいろやると訳わかんなくなるので、シンプルにスマートフォンの縦用だけをいろんなサイトから集めてみました。
スマートフォンの横からはPCと共通のCSSで頑張って見てもらう感じ。

@media screen and (max-width: 480px) { }
スマートフォンのシェアが増え、かつほとんどが縦画面で見ていると想定するなら、これが落ち着きどころと言える
【2020年4月修正追記】レスポンシブ CSSメディアクエリ(@media)ブレイクポイントまとめ | モバイル・スマホWeb・WordPressのSEO塾.com

スマホ向けは「タブレットじゃなくなったら」の否定法で
@media only screen and (max-width: 767px)
が主流。
レスポンシブウェブデザインのメディアクエリのオススメの書き方 [無料ホームページ作成クラウドサービス まめわざ]

@media screen and (max-width:768px) {
/*スマホ用のcssを記述*/
}
CSSでメディアクエリ(@media)を使ってレスポンシブ(スマホ対応)にする方法 | HikoPro Blog

560px未満をスマホと設定
ポートレートとランドスケイプは用途を分けて考える。←これ重要
※iPhoneSEのランドスケープ(568px)、iPad Pro 11の5:5 Split Viewもタブレット扱いにするために560pxに設定。<省略>
560px未満 @media screen and (max-width: 559px) {...}
960px未満 @media screen and (max-width: 959px) {...}
※「以下」ではなく「未満」にするために、メディアクエリの数字を一つ減らすのがポイントですね。
【新定番】レスポンシブデザインのブレイクポイントの正解はこれだった[2019最新版] - webのあれこれ

スマホ @media screen and (max-width: 480px)

【2020年3月】レスポンシブ CSSブレイクポイント・メディアクエリ(@media) | SEO塾/株式会社アルゴリズム

メディアクエリを使うにはHTMLのheadタグにviewportを指定します。

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

developer.mozilla.org
developers.google.com

CentOSでJSFのプロジェクトを作る

  • 環境
    • CentOS Linux release 7.8.2003 (Core)
    • Payara Server 5.194
    • Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)

参考資料

久しぶりにJSF用のプロジェクトを1から作ろうと思い立った。
記憶も記録も美しいまでに消えていた。
以下のサイト様を見ながら記憶と記録を作り直す。
ittoybox.com

EclipseにPayaraを設定する

Payaraを配置する

# 1. 任意のディレクトリへ移動
$ cd /opt
# 2. Payaraのzipファイルをダウンロード
$ wget https://repo1.maven.org/maven2/fish/payara/distributions/payara/5.194/payara-5.194.zip
# 3. zipファイルを解凍する
$ unzip payara-5.194.zip
# 4. 使い終わったzipファイルを削除する
$ rm payara-5.194.zip
# 5. .bash_profileで環境変数にPayaraを設定する
$ vi ~/.bash_profile
$ cat ~/.bash_profile 
$ export PATH=$PATH:/opt/payara5/bin
$ source ~/.bash_profile
# 6. 実行できるように権限設定する
RUN chmod -R 777 /opt/payara5/glassfish

Eclipseに設定する

qiita.com

Mavenプロジェクトを作成する

  1. [Package Explorer]にカーソルを入れて「Ctrl + N」で新規作成ダイアログを表示する。
  2. [Maven] > [Maven Project] > [Next]ボタン
    • f:id:ponsuke_tarou:20200716213456p:plain
  3. [Create a simple project(skip archetype selection)]チェックボックスをONにする > [Next]
  4. 以下を設定して[Finish]ボタンでプロジェクトを作成する
  5. この時点でエラーがあっても見なかったことにする

f:id:ponsuke_tarou:20200716213657p:plain

コンパイラを設定する

  1. [Package Explorer]でプロジェクトを選択 > 「Alt + Enter」でプロパティダイアログを表示する
  2. [Java Compiler] > [Use compliance from execution environment 'JavaSE-1.5 on the 'Java Build Path']チェックボックスをOFFにする
  3. [Compiler compliance level]で「11」を選択 > [Apply]ボタンで適用する
    • f:id:ponsuke_tarou:20200716215324p:plain
  4. 以下のメッセージダイアログが表示されるので[Yes]でビルドを行う

JSFを設定する

  1. [Project Facet] > [Convert to Faceted...]リンクを押下して一覧を表示する
    • f:id:ponsuke_tarou:20200716215510p:plain
  2. [Java]をONにして[Version]を「11」にする
  3. [JavaServer Faces]をONにして[Version]を「2.3」にする
  4. [Dynamic Web Module]をONにして[Version]を「4.0」にする
  5. [Runtimes]タブ > 表示されたPayaraをONにする
    • f:id:ponsuke_tarou:20200716224248p:plain
  6. 下の方に出てくる[Further configuration required...]リンクを押下して[Modify Faceted Project]画面を表示する
  7. [Content directory : ]を設定する(今回はデフォルトのまま)
    • Content directoryは、HTMLやCSSや画像ファイルなどのコンテンツを格納するディレクトリルート
  8. [Generate web.xml....... : ]チェックボックスをONにする > [Next]ボタン
    • f:id:ponsuke_tarou:20200716224434p:plain
  9. 特に変更はしないで[OK]ボタンでダイアログを閉じる
    • f:id:ponsuke_tarou:20200716224621p:plain
  10. [Aply and Close]ボタンでプロパティダイアログを閉じる
    • プロジェクトにエラーが有った場合は、エラーが消える(はず)
pom.xmlJSFのライブラリを定義する
  1. Maven Repository: org.glassfish » javax.facesから任意のバージョンのMaven用定義をコピーする
  2. Eclipseでpom.xmlを開いて定義を貼り付ける
  3. Maven Repository: org.primefaces » primefacesから任意のバージョンのMaven用定義をコピーする
  4. [Package Explorer]でプロジェクトを選択 > 「Alt + F5」でダイアログを表示 > [OK]ボタンでMavenを更新する
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...省略...
  <dependencies>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.faces</artifactId>
      <version>2.3.9</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.primefaces/primefaces -->
    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>primefaces</artifactId>
      <version>8.0</version>
    </dependency>
  </dependencies>
</project>

ServletのバージョンをDynamic Web Moduleに合わせる

  1. src/main/webapp/WEB-INF/web.xmlを開く
  2. web-appの記載をDynamic Web Moduleに合わせる
  3. [Package Explorer]でプロジェクトを選択 > 「Alt + F5」でダイアログを表示 > [OK]ボタンでMavenを更新する
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">
<!-- 省略 -->

動かしてみる

ページを作成する

  1. [webapp]を選択して「Ctrl + N」で新規ダイアログを開く
  2. [Web] > [HTML File] > [Next]ボタンで進む > [File name:]に「index.xhtml」を入力し[Next]ボタン
  3. [Templates:] > [New Facelet Composition Page](新規Facelet構成ページ) > [Finish]ボタンで新規ページを作成する
    • f:id:ponsuke_tarou:20200720193154p:plain
  4. 以下のコードをindex.xhtmlに記載する
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<head>
    <title>MavenでJSFのプロジェクトをEclipseで作ってみた。</title>
</head>
<body>
    JSFのプロジェクト
</body>
</html>

Payaraを起動する

  1. [Package Explorer]でプロジェクトを選択して右クリック
  2. [Run As] > [Run On Server] > ダイアログでPayaraを選択して起動する
  3. http://localhost:8080/tryJsf/index.xhtmlにアクセスしてページが表示されたら動作確認完了

f:id:ponsuke_tarou:20200720224119p:plain
Eclipseのブラウザで見るとこんな感じ

失敗したこと

qiita.com
qiita.com
qiita.com

f:id:ponsuke_tarou:20200720224310j:plain
ゆの宿上越館の超美味しい鮎

WordPressでGoogleのCustom Search APIを使ってみる

1. プロジェクトを作成してCustom Search APIを設定する

  1. (ない場合)Google アカウントの作成でアカウントを作成する
  2. (ない場合)Google Cloud Platformでプロジェクトを作成する
  3. 画面上部でプロジェクトを選択する
  4. APIとサービスを有効化リンクで[APIライブラリ]画面を表示する
  5. 「Custom Search API」を検索して選択、[有効化]ボタンで有効にする
  6. [ナビゲーションメニュー] > [APIとサービス] > [認証情報] > 画面上部の[認証情報作成] > [APIキー]でAPIキーを作成する
    • f:id:ponsuke_tarou:20200626104859p:plain
  7. APIキーをメモっておく
  8. ポップアップの[キーを制限]リンクから[API キーの制限と名前変更]画面を表示して制限情報を設定して[保存]ボタンで保存する
    • [API の制限] > [キーを制限] : 「Custom Search API」を選択
    • f:id:ponsuke_tarou:20200626105727p:plain

2. 検索エンジンを作成する

  1. Programmable Search Engine by Googleを表示して[Get started]ボタンで[Programmable Search]画面を表示する
  2. [新しい検索エンジン]で画面を表示して検索エンジンを作成する
  3. [コントロールパネル]ボタンで画面を表示する
    • f:id:ponsuke_tarou:20200626110820p:plain
  4. 必要に合わせて検索エンジンを設定する
  5. [基本]タブ > [検索エンジン ID]から検索エンジンIDをメモっておく
    • f:id:ponsuke_tarou:20200629120126p:plain

3. WordPressで検索処理を作る

PHPで検索処理を作る
  1. WordPressにショートコードを使ってPHPを埋め込む方法 - Qiitaを参考にショートコードをfunctions.phpに作る
  2. 検索結果を表示する処理をoutput-google-block-quote.phpに作る
  3. 検索をする処理をoutput-google-block-quote.phpに作る
functions.php : ショートコードを設定する
<?php
// ...省略...
/** Custom Search APIでGoogle検索した結果を引用符形式で表示する. */
function google_block_quote() {
    ob_start();
    get_template_part('output-google-block-quote');
    return ob_get_clean();
}
add_shortcode('search_google', 'google_block_quote');
output-google-block-quote.php : 検索結果を表示する
<?php
require_once('search-google.php');
$items = search_google();
?>

<h1>今日のGoogle検索</h1>
<?php if (count($items) === 0) : ?>
<p>検索したけど結果なし</p>
<?php else : ?>

<?php foreach ($items as $key => $item) : ?>
<blockquote class="wp-block-quote">
<a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a>
<p><?php echo $item['snippet']; ?></p>
</blockquote>
<br>
<?php endforeach; ?>

<?php endif; ?>
output-google-block-quote.php : 検索をする
<?php
/**
 * GoogleのCustom Search APIでの検索結果を取得する.
 * @return array 検索結果.
 */
function search_google(): array
{
    $reqest_url = create_reqest_url();
    $retJson = file_get_contents($reqest_url, true);
    $ret = json_decode($retJson, true);
    return $ret['items'];
}

/**
 * Custom Search APIへのリクエスト内容含めたURLを作成する.
 * @return string リクエスト内容含めたURL.
 */
function create_reqest_url(): string
{
    $paramAry = array(
        // 検索する文字列
        'q' => 'ponsuke tarou',
        // メモっておいたAPIキー
        'key' => {APIキー},
        // メモっておいた検索エンジンID
        'cx' => {検索エンジンID},
        // 検索結果をjson形式で取得する
        'alt' => 'json',
        // 取得開始順位(1~10位までの検索結果を取得する)
        'start' => 1
    );
    $param = http_build_query($paramAry);
    return 'https://www.googleapis.com/customsearch/v1?'. $param;
}
?>

4. ブログの投稿にショートコードを埋め込む

  1. WordPressの管理画面 > [Posts] > [Add New]ボタンで投稿画面を表示する
  2. タイトルを入力する
  3. 本文に「[search_google]」と書く
    • f:id:ponsuke_tarou:20200629183357p:plain
  4. [Publish]ボタンで公開する

5. 結果を表示する

f:id:ponsuke_tarou:20200629183528p:plain
検索結果が表示される

もうちょっと使ってみた

qiita.com

初めて聞いた、AWS Elastic Beanstalkって何?

初めて聞いた、AWS Elastic Beanstalk

同僚にDockerでコンテナ環境を作ってみたいと相談していたら「AWS Elastic Beanstalk」というものを聞いた。
何それ?

AWS Elastic Beanstalkは、ウェブアプリケーションやサービスをサーバーでデプロイおよびスケーリングするためのサービスです。

AWS Elastic Beanstalk は、Java、.NET、PHP、Node.js、PythonRuby、Go および Docker を使用して開発されたウェブアプリケーションやサービスを、Apache、Nginx、Passenger、IIS など使い慣れたサーバーでデプロイおよびスケーリングするための、使いやすいサービスです。
AWS Elastic Beanstalk(ウェブアプリの実行と管理)| AWS

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F162114%2F257fe1a3-08f6-0604-8a22-7b945056212d.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=4ef2ef7d2fa26ed2846950bb024340f5
[初心者向け]AWS Elastic Beanstalk - Qiita

Elastic Beanstalk自体は、無料で使えます。

Elastic Beanstalk には追加料金はかかりません。アプリケーションを格納および実行するために必要な AWS のリソースに対してのみお支払いいただきます。
AWS Elastic Beanstalk(ウェブアプリの実行と管理)| AWS

Dockerプラットフォームは、3種類あります。

単一コンテナの Docker

1つのインスタンスにコンテナは1つしか作れない・・・のか?

単一コンテナプラットフォームは、インスタンスごとに 1 つのコンテナを実行する必要がある場合にのみ使用します。
Docker コンテナからの Elastic Beanstalk アプリケーションのデプロイ - AWS Elastic Beanstalk

マルチコンテナの Docker

Docker を最大限に活用するため、Elastic Beanstalk では、Amazon EC2 インスタンスが複数の Docker コンテナを並行して実行できる環境を作成することができます。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/aeb-multicontainer-docker-example.png
複数コンテナの Docker 環境 - AWS Elastic Beanstalk

事前設定済み Docker コンテナ

自分が使いたいのと同じ設定の環境がある場合に使うものらしい。
docs.aws.amazon.com

よくわかんないな・・・

AWSのEC2を自動停止するLambdaを作る記録

実行権限を作成します。

  1. IAMのポリシーを作成する」を参考にポリシーを作成します。
    • [JSON]タブで設定するポリシーは以下になります。
  2. IAMのロールを作成する」を参考にロールを作成します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "ec2:DescribeInstances",
                "ec2:StopInstances",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

自動停止の対象と停止時間を設定できるようにするためにEC2インスタンスにAutoStopタグを追加します。

自動停止の対象と停止時間を設定できるようにするためにRDSにAutoStopタグを追加します。」を参考にEC2インスタンスにAutoStopタグを追加します。

Lambda関数を作成します。

  1. AWSのコンソールにある[Lambda] > [関数の作成]ボタンで画面を開きます。
  2. 必要な項目を入力後に[関数の作成]ボタンで関数を作成します。
    • オプション : [一から作成]
    • 関数名 : 任意の関数名
    • ランタイム : Python3.8
    • 実行ロール : 既存のロールを使用する
      • 作成したロールを選択します。
  3. Lambda関数を実行するトリガーを作成します。」を参考にトリガーを作成します。

関数を実装します。

  1. [関数コード] > [lambda_function.py]に以下のコードを張り付けて[保存]ボタンで保存します。
    • 定数の[REGION_NAME]には停止対象のEC2インスタンスがあるリージョンを指定してください。
  2. 関数を動かしてみます。」を参考にエラーが無くなるまで関数を動かして修正を繰り返します。
# -*- coding: utf-8 -*-

from __future__ import print_function

import sys
import json

import boto3
from datetime import datetime, timedelta, timezone, date
import re

# 停止対象のインスタンスがあるリージョンを設定する
REGION_NAME = 'ap-northeast-1'
DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
print("Loading function")

def get_instance_list(ec2):
    """
    起動中かつ[AutoStop]タグが設定されたインスタンスを取得する処理.

    Parameters
    ----------
    ec2
    """
    instances = ec2.describe_instances(
        Filters=[
            {"Name": "instance-state-name", "Values": ["running"]},
            {'Name': 'tag-key', 'Values': ['AutoStop']}
        ]
    )['Reservations']
    new_instances = []
    for instance in instances:
        new_instances.append(instance['Instances'][0])
    return new_instances

def get_auto_stop_tag(instance):
    """
    AutoStopタグに設定された時間文字列を取得する.
    """
    result = ''
    val = ''
    tag_list = instance['Tags']
    tag = next(iter(filter(lambda tag: tag['Key'] == 'AutoStop' and (tag['Value'] is not None and len(tag['Value']) != 0), tag_list)), None)

    if tag:
        val = tag["Value"]

    if not val:
        print('タグに時間が指定されていません。')
    elif not re.fullmatch('\d{1,2}:\d{1,2}', val):
        print('タグに設定されている文字列が時間(hh:mm)ではありません。' + val)
    else:
        print('タグに設定された時間は、' + val + 'です。')
        result = val

    return result

def get_utc_time(jst_time_string):
    """
    HH:MM形式のJST時間文字列をUTC時間にして取得する.
    """
    # 時間文字列を{時間, 分}の配列にする
    jst_time = jst_time_string.split(':');
    today = datetime.now()

    # 設定時刻が8:59以前である場合、UTC変換時に前日にならないよう日付を1日進めておく
    if int(jst_time[0]) < 9:
        today = today + timedelta(day=1)

    jst_time = datetime(today.year, today.month, today.day, int(jst_time[0]), int(jst_time[1]))
    utc_time = jst_time + timedelta(hours=-9)
    return utc_time

def is_stop(event_time, auto_stop_time):
    """
    インスタンスを停止するかを判定する
    """
    # 設定時間の5分前
    from_time = auto_stop_time + timedelta(minutes=-5)
    # 設定時間の5分後
    to_time = auto_stop_time + timedelta(minutes=5)

    print("イベント時間(" + event_time.strftime(DATETIME_FORMAT) + ")が、" + \
          from_time.strftime(DATETIME_FORMAT) + "から" + to_time.strftime(DATETIME_FORMAT) + "の間であればインスタンスを停止します。")
    # AutoStopタグに指定された時刻の前後5分以内であればインスタンス停止
    is_stop = from_time <= event_time and event_time <= to_time
    return is_stop

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    ec2 = boto3.client('ec2', REGION_NAME)

    instances = get_instance_list(ec2)

    if len(instances) == 0:
        print('処理対象のインスタンスはありません。')
        return 0

    # インスタンス終了処理
    for instance in instances:
        print(instance['InstanceId'] + 'は起動中です。')
        # [AutoStop]タグに設定された時間文字列を取得する
        tag_time_string = get_auto_stop_tag(instance)

        if tag_time_string:
            # [AutoStop]タグに設定された時間文字列をUTC時間にする
            auto_stop_time = get_utc_time(tag_time_string)
            print('タグに設定された時間(UTC)は、' + auto_stop_time.strftime(DATETIME_FORMAT))

            # 引数のイベント時間を取得
            event_time = datetime.strptime(event["time"], DATETIME_FORMAT)

            if is_stop(event_time, auto_stop_time):
                ec2.stop_instances(InstanceIds=[instance['InstanceId']])
                print(instance['InstanceId'] + "を停止しました。")

    return 0
使用した関数のドキュメント

失敗したこと

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

  • 原因 : describe_instances関数を実行する権限がなかった。
  • 対応 : ポリシーの[Action]に「ec2:DescribeInstances」を追加しました。
Response:
{
  "errorMessage": "An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 34, in lambda_handler\n    instance_list = get_instance_list()\n",
    "  File \"/var/task/lambda_function.py\", line 19, in get_instance_list\n    instances = ec2.describe_instances(\n",

ネットワークにいる機器を監視するSNMPプロトコル

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

ネットワーク管理プロトコルであるSNMPv3で使われるPDUのうち、事象の発生をエージェントが自発的にマネージャに知らせるために使用するものはどれか。ここで、エージェントとはエージェント相当のエンティティ、マネージャとはマネージャ相当のエンティティを指す。

  1. SetRequest-PDU
  2. Response-PDU
  3. SNMPv2-Trap-PDU
  4. GetRequest-PDU

情報処理安全確保支援士平成31年春期 午前Ⅱ 問20

SNMPは、TCP/IPネットワークに接続されている機器の情報を収集して監視や制御を行うためのプロトコルです。

  • 英語 : Simple Network Management Protocol

構成機器や障害時の情報収集を行うために使用されるネットワーク管理プロトコルです。

TCP/IPの環境で使用されるプロトコルのうち,構成機器や障害時の情報収集を行うために使用されるネットワーク管理プロトコルはどれか。

答. SNMP
応用情報技術者平成26年春期 午前問34

SNMPはアプリケーション層のプロトコルです。

TCP/IPネットワークでは、プロトコル階層はアプリケーション層・トランスポート層・インターネット層・ネットワークインタフェース層に分けられている。SNMPと同じ階層に属するものはどれか。

答. FTP
https://www.ap-siken.com/kakomon/18_aki/img/52_1.gif
ソフトウェア開発技術者平成18年秋期 午前問52

https://www.infraexpert.com/studygif/tcpip2.gif
TCP/IPをはじめから

SNMPは、SNMPマネージャとSNMPエージェントの間で使用されます。

https://www.infraexpert.com/studygif/tcpip69.gif
TCP/IP - SNMPとは

https://milestone-of-se.nesuke.com/wp-content/uploads/2017/12/snmp-summary-2.png
【図解】SNMPの仕組み~利用ポート,監視方法(マネージャのMIBポーリング/trap受信),tcp/udp,writeの実装例〜│SEの道標

監視を行うのがSNMPマネージャです。

WindowsサーバーやUNIXサーバーにインストールされます。

いろんな製品があります。

https://www.hinemos.info/sites/default/files/2019-09/MonicolleAbout2.PNG
特長・メリット(Hinemos Monicolle) | Hinemos

https://www.nagios.com/wp-content/uploads/2017/10/XI_Home_Dashboard.png
Nagios XI - Easy Network, Server Monitoring and Alerting

https://www.manageengine.jp/products/OpManager/images/mib-browser-snmp-oid.png
ManageEngineが提供するOpManager

SNMPマネージャは、UDPのポート番号162を使用します。

https://www.infraexpert.com/studygif/tcpip70.gif
TCP/IP - SNMPとは

監視されるのがSNMPエージェントです。

http://itdoc.hitachi.co.jp/manuals/3020/30203T0401/FIGURE/ZU010210.GIF
SNMPエージェントを構成するプロセス

http://otndnld.oracle.co.jp/document/products/E13161_01/tuxedo/docs10gr3/snmpadmin/wwimages/snmpadmin-01-1-3.gif
Oracle SNMP エージェントの概要

SNMPエージェントは、UDPのポート番号161を使用します。

f:id:ponsuke_tarou:20200318231214j:plain

SNMPv1、SNMPv2、SNMPv3の3つのバージョンがあります。

https://i2.wp.com/murci.net/wp-content/uploads/2018/12/snmp.png?resize=300%2C103&ssl=1
SNMPバージョンごとの違い – murci.net

SNMPv1とSNMPv2は、セキュリティが弱いのであまり使われていません。

以下の記事で取り上げているSNMPリフレクター攻撃では、SNMPv2に対応し、コミュニティ名(SNMPでのパスワード的なもの)が初期値の「public」に設定されている機器をターゲットにしていたそうです。
www.itmedia.co.jp

SNMPv3は、セキュリティが強化されてPDUの暗号化ができるのが特徴です。

SNMPv1とSNMPv2では、コミュニティ名による認証をしていました。

PDUは、制御情報をくっつけたデータの送受信単位のことです。

  • 英語 : Protocol Data Unit
  • 読み方 : ピーディーユー

転送フレームでのSNMPメッセージ
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu5.gif
GetRequest/GetNextRequest/SetRequest/GetResponseのPDU構造
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu6.gif
TrapのPDU構造
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu7.gif
どのようにしてネットワークを管理するのか?:監視を自動化するSNMP(2) - @IT

https://download.huawei.com/mdl/imgDownload?uuid=46e0b068cf634b4ea4154ec87161214f.png
What Is SNMP - Huawei

プロトコルによって呼び名は変わります。
プロトコル 呼び名
HTTP・TCP パケット
UDP・IP データグラム
イーサネット無線LAN フレーム
銀行とかのATM セル

出典 : PDU(プロトコルデータユニット)とは - IT用語辞典 e-Words

SNMPのPDUには種類があります。

名前 細かい名前 UDPタイプ 説明
ポーリング - - SNMPマネージャがSNMPエージェントにリクエストを送って情報を収集する
ポーリング GET REQUEST 0 一部の管理情報を取得する
ポーリング GETNEXT REQUEST 1 次に連続する管理情報を取得する
ポーリング GET RESPONSE 2 SNMPマネージャからの要求に対するSNMPエージェントの返答
ポーリング SET REQUEST 3 管理するサブシステムに対して変更を加える
トラップ - 4 SNMPエージェントがSNMPマネージャに障害の情報を送る

https://image.itmedia.co.jp/ait/articles/0303/21/r13zu1.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu2.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu3.gif
https://image.itmedia.co.jp/ait/articles/0303/21/r13zu4.gif
どのようにしてネットワークを管理するのか?:監視を自動化するSNMP(2) - @IT

https://blogs.manageengine.jp/wp-content/uploads/2019/02/snmp_architecture.jpg
ネットワーク監視の超基本「SNMP」とは? « ManageEngine ブログ

https://download.huawei.com/mdl/imgDownload?uuid=085cf691cc3d49cd9150b8195dd9fec3.png
What Is SNMP - Huawei

事象の発生をエージェントが自発的にマネージャに知らせるために使用するのがトラップです。

図で示したネットワーク構成において,アプリケーションサーバA上のDBMSのデーモンが異常終了したという事象とその理由を,監視用サーバXで検知するのに有効な手段はどれか。
https://www.ap-siken.com/kakomon/24_haru/img/35.gif
答. アプリケーションサーバAから監視用サーバXへのSNMPトラップ
応用情報技術者平成24年春期 午前問35

SNMPマネージャとSNMPエージェントは、MIBをやり取りします。

http://atnetwork.info/tcpip2/tcpip25501.jpg
SNMPの仕組み(マネージャ/エージェント) TCP/IP入門

MIBは、機器の設定や状態などの情報集合体のことです。

  • 英語 : Management Information Base
  • 読み方 : みぶ
一つの要素が複数の子要素を持ち、階層が深くなるほど枝分かれしていく木構造です。

https://www.alaxala.com/jp/techinfo/archive/manual/AX2400S/HTML/11_7/CFGUIDE2/FIGURE/ZU209041.GIF
SNMP概説

https://download.huawei.com/mdl/imgDownload?uuid=51473c1c11b9497e9e163a64e6c03292.png
What Is SNMP - Huawei

MIBは、ASN.1という記法に従って定義されています。
  • 英語 : Abstract Syntax Notation One
  • 日本語 : 抽象構文記法1

ASN.1(Abstract Syntax Notation One = 抽象構文記法1)は、情報の構造定義の言語です。 通信プロトコルのフォーマットを規定するための言語で、 SNMPのMIBの記述、証明書:デジタル署名、LDAP,、Kerberos、TCなど多くのプロトコルで使用されています。
http://www5d.biglobe.ne.jp/stssk/asn1/index.html

SNMPエージェントは、MIBの内容で機器の状態を判断します。

サーバやネットワーク機器のMIB(Management Information Base)情報を分析し,中間者攻撃を遮断する。
応用情報技術者平成29年秋期 午前問38

f:id:ponsuke_tarou:20200313202707j:plain
北区の宝泉湯

次回の勉強内容

勉強中・・・

LANセグメントを分ける仮想LAN、VLANのお話

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

VLAN機能をもった1台のレイヤ3スイッチに複数のPCを接続している。スイッチのポートをグループ化して複数のセグメントに分けると、スイッチのポートをセグメントを分けない場合に比べて、どのようなセキュリティ上の効果が得られるか。

  1. スイッチが、PCから送出されるICMPパケットを全て遮断するので、PC間のマルウェア感染のリスクを低減できる。
  2. スイッチが、PCからのブロードキャストパケットの到達範囲を制限するので、アドレス情報の不要な流出のリスクを低減できる。
  3. スイッチが、PCのMACアドレスから接続可否を判別するので、PCの不正接続のリスクを低減できる。
  4. スイッチが、物理ポートごとに、決まったIPアドレスをもつPCの接続だけを許可するので、PCの不正接続のリスクを低減できる。

情報処理安全確保支援士平成31年春期 午前Ⅱ 問12

VLANは、1つの物理的スイッチで複数のスイッチがあるみたいにLANセグメントを分けることができる技術です。

  • 正式名称 : Virtual Local Area Network(Virtual LAN)

VLANではない場合、1つの物理スイッチには1つのLANセグメントがあります。
VLANにすると、まるで複数のスイッチがあるように複数のLANセグメントに分割することができます。

https://www.infraexpert.com/studygif/vlanz1.gif
VLANとは

LANスイッチは、複数の機器をネットワークと接続できるようにする機器です。

OSI参照モデル 機器 説明
ネットワーク層 L3スイッチ ネットワークの中継機器の一つで、
ネットワーク層とリンク層の両方の制御情報に基づいてデータの転送先の決定を行います。
データリンク層 L2スイッチ MACアドレスを含んだ情報を使って
適切なポートにイーサネットフレームを転送します。

https://news.mynavi.jp/kikaku/switch-1/images/001.jpg
https://news.mynavi.jp/kikaku/switch-1/images/002.jpg
いまさら聞けないスイッチの基礎(1) LANスイッチとは? | TECH+

スイッチ内に作られた仮想スイッチのポートを物理的なポートに割り当てることでLANセグメントを分割します。

VLAN対応スイッチでは、仮想的に作られたスイッチ、いわゆる仮想スイッチがスイッチ内部で動いている。スイッチの物理ポートを仮想スイッチのポートに割り当てることで、ネットワークの分割を実現している。
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph01.jpg?__scale=w:500,h:197&_sh=0c20a502a0
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

ブロードキャストドメインを分割できるので、他のセグメントへのARPを防止します。

https://milestone-of-se.nesuke.com/wp-content/uploads/2016/12/VLAN3.png
【図解】初心者にも分かる VLAN 入門〜仕組み,メリットや必要性について〜 | SEの道標

ARPは、IPアドレスからMACアドレスを取得するために使われるプロトコルです。
ponsuke-tarou.hatenablog.com
スイッチが、PCからのブロードキャストパケットの到達範囲を制限するので、アドレス情報の不要な流出のリスクを低減できます。

https://www.sc-siken.com/kakomon/31_haru/img/12.gif
情報処理安全確保支援士平成31年春期 午前Ⅱ 問12

L3スイッチの内部ルーターを使うことで分割したLANセグメント同士を接続することができます。

L3スイッチは、L2スイッチの内部にルーターの機能を組込んでルーターによるVLAN間ルーティングをするネットワーク機器です。

https://news.mynavi.jp/article/vlan-4/images/002.jpg
今さら聞けない「VLANの基本」(4) VLAN間ルーティング | TECH+

LANセグメントごとにIPアドレスを割り当てて、LANセグメント同士を接続します。

https://network.oreda.net/_media/device/switch/svi.png
https://network.oreda.net/_media/device/switch/routedport.png
L3スイッチで、VLAN間ルーティング(SVIかルーテッドポート) [現場で必要なネットワーク技術入門]

各VLANを識別するために割り振られる番号をVLAN IDといいます。

f:id:ponsuke_tarou:20211005172936j:plain
同じVLAN IDに所属する機器同士は通信できます。
VLAN IDの「0」と「4095」は予約済みの番号です。

VLAN ID 用途
0 VLANにも属していないフレームであることを表す特殊なID
4095 システム用

VLANは、LANセグメントの分割方法によって方式があります。

名前 概要
デフォルトVLAN(VLAN1) L2スイッチの初期状態で、1だけが設定されているVLANです。
VLAN1だけなのでLANセグメントは分割されず1つだけです。
プライベートVLAN 同一VLAN内でのアクセス制御が可能なVLANです。
ダイナミックVLAN スイッチに接続する機器のMACアドレスやユーザー情報によって自動で割り当てるVLANを決めます。
ポートベースVLAN スイッチにの差込口(ポート)でLANセグメントを分割します。
タグVLAN フレームにタグをつけてVLANを見分けます。

ポートベースVLANは、複数のポートを論理的なグループにまとめグループ内だけの通信を可能にします。

  • 別名 : ポートVLAN、スタティックVLAN

ポートベースVLAN
スイッチの接続ポート単位でグルーピング
ソフトウェア開発技術者平成18年秋期 午前問59

https://news.mynavi.jp/article/vlan-2/images/003.jpg
今さら聞けない「VLANの基本」(2) ポートベースVLANとは | TECH+

物理的なポートごとにLANセグメントを分割するので、1つのポートにつけられるVLAN IDは1つです。

https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph02.jpg?__scale=w:500,h:238&_sh=0c40f00df0
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

タグVLANは、イーサネットフレームにタグ情報を挿入してフレーム単位でLANセグメントを分割します。

イーサネットフレームのタグで判別するので、1つのポートに複数のVLAN IDをつけられます。

タグVLAN (Tag VLAN) とは、複数のVLANを1本のLAN 接続だけで複数スイッチ間で共有できる技術です。IEEE802.1qという規格で規定されており、VLAN IDは1~4094が使えます。
https://milestone-of-se.nesuke.com/wp-content/uploads/2017/10/tag-vlan-1.png
【図解】タグVLANとネイティブVLAN (PVID)の違い,native vlanを変更する理由,不一致による影響 | SEの道標

イーサネットフレームは、イーサネットでの通信で使用するデータフォーマットのことです。
ponsuke-tarou.hatenablog.com
タグのフォーマットは、IEEE802.1Q(通称 : ドット1キュー)で標準化されています。

https://www.n-study.com/grafic/newvlan12.gif
トランクプロトコルのまとめ ~IEEE802.1QとISL~ | VLAN(Virtual LAN)の仕組み | ネットワークのおべんきょしませんか?

EEE802.1Qでは送信元MACアドレスとタイプフィールドの間にタグと呼ばれる4バイトのフィールドを挿入します。
https://www.infraexpert.com/studygif/vlanz10.gif
VLAN - アクセスポートとトランクポート

複数のVLANに所属しているポートをトランクポートといいます。

https://www.sc-siken.com/kakomon/30_haru/img/19.gif
情報処理安全確保支援士平成30年春期 午前Ⅱ 問19

トランクポートは複数のVLANに所属するポートです。主にスイッチ同士を接続する際に使用するポートです。
https://www.infraexpert.com/studygif/vlanz9.gif
VLAN - アクセスポートとトランクポート

タグVLANで使う物理ポートをトランクポート、トランクポート同士をつなぐリンクを「トランクリンク」と呼ぶ。トランクポートには通常、パソコンなどの端末を接続せず、スイッチのトランクポート同士をつなぐために使う。
https://cdn-xtech.nikkei.com/atcl/nxt/column/18/00131/020600002/ph04.jpg?__scale=w:500,h:253&_sh=0b70bf0750
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)

f:id:ponsuke_tarou:20161230114147j:plain
いつか見た景色

次回の勉強内容

ponsuke-tarou.hatenablog.com

RDSでOracleを作ってみる

RDSでMySQLをつくってみました。

Oracleでもやりたいことができたので作ってみます。
ponsuke-tarou.hatenablog.com

EC2インスタンスから使えるRDSを作成します。

RDS作成予定のVPC内にある以前作成したEC2インスタンスから接続します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20200311084258j:plain

RDSでOracleを作成してみます。

  1. AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
  2. [データベースの作成]ボタンで[データベースの作成]画面を表示します。
  3. 以下を設定して[データベースの作成]ボタン
    • データベース作成方法を選択 : 標準作成
    • エンジンのオプション
      • エンジンのタイプ : Oracle
      • エディション : Oracle Standard Edition Two
      • バージョン : Oracle12.2.0.1.ru-2020-01.rur-2020-01.r1(お好みのバージョンを選択でOK)
      • ライセンス : license-included
    • テンプレート : 開発/テスト
    • 設定
      • DB インスタンス識別子 : oracle-12(お好みの名前でOK)
      • マスターユーザー名 : admin(お好みの名前でOK)
      • パスワードの自動生成 : ON
    • DB インスタンスサイズ
    • 接続
      • Virtual Private Cloud (VPC) : 接続予定のEC2と同じVPC
      • パブリックアクセス可能 : なし
    • 追加設定
      • 最初のデータベース名 : ponsukedb
      • 削除保護の有効化 : ON
    • 上記以外の設定値は規定値のまま
  4. 画面上部に表示される[認証情報の詳細を表示]ボタンでパスワードを確認してどっかに記録しておきます。
    • f:id:ponsuke_tarou:20200303224505p:plain
      パスワードを表示できるのはこのときだけです。

EC2インスタンスから接続できるようにセキュリティグループを設定します。

今回はRDSとEC2が同じVPC内にある構成なので、RDSのセキュリティグループに

  1. EC2のプライベートIP
  2. EC2のセキュリティグループID(sg-xxxx)

のどちらかをOracle用ポート(1521)に許可するように設定します。
MySQLを作成したときは、プライベートIPを設定したので
今回は、セキュリティグループIDを設定してみます。

セキュリティグループにEC2インスタンスのセキュリティグループIDを設定します。

EC2インスタンスのセキュリティグループIDを確認します。
  1. AWS マネジメントコンソールで[EC2]を選択して、EC2の画面を表示します。
  2. [インスタンス] > 対象のEC2インスタンスを選択 > 下の詳細画面を表示します。
  3. [セキュリティグループ]に表示されているリンクからセキュリティグループの画面を表示します。
  4. 一覧の[Security group ID]に表示されているセキュリティグループIDをメモします。
セキュリティグループを設定します。
  1. AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
  2. サイドメニューにある[データベース]リンクでデータベースの一覧を表示して、対象のRDSのDB 識別子リンクから詳細画面を表示します。
  3. VPC セキュリティグループのリンクからセキュリティグループの詳細画面を表示します。
    • f:id:ponsuke_tarou:20200219201158p:plain
  4. [Inbound rules]タブにある[Edit inbound rules]ボタンから編集画面を表示します。
  5. [Add rule]ボタンで行を追加して、以下を設定します。
  6. [Save rules]ボタンで保存します。

RDSへSQL*Plusで接続してみます。

EC2インスタンスにSQLPlusをインストールします。

ponsuke-tarou.hatenablog.com

(停止していたら)RDSを起動します。

  1. データベースの一覧で作成したRDSを選択します。
  2. [アクション] > [開始]で起動します(少々時間がかかります)。
  3. 一覧の[ステータス]が「利用可能」になったら起動しています。

エンドポイントを確認します。

  1. データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
  2. [接続とセキュリティ]タブ > [エンドポイント]に表示されている「{DB識別子}.xxxxx.{リージョン}.rds.amazonaws.com」がエンドポイントで接続情報となります。

Oracleにログインできました。

$ sqlplus64 admin/password@oracle-12.hoge.us-east-2.rds.amazonaws.com:1521/pondb

SQL*Plus: Release 12.2.0.1.0 Production on 火 310 11:45:48 2020

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

最終正常ログイン時間: 火 310 2020 11:17:11 +00:00


Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
ユーザーを作成して好きに使っていきます。

ponsuke-tarou.hatenablog.com

自動停止するように自動停止時間をAutoStopタグに設定します。

MySQLのRDSを作ったときに設定したRDS自動停止用のLambdaで自動停止できるようにAutoStopタグを設定します。
ponsuke-tarou.hatenablog.com

  1. データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
  2. [タグ]タブ > [追加]ボタンで[タグの追加] ウィンドウを表示します。
  3. [タグキー]に「AutoStop」と[値]に「自動停止したい時間」を入力して[追加]ボタンでタグを追加します。

失敗したこと

DBName must be less than 8 characters long.

f:id:ponsuke_tarou:20200303224225p:plain

ORA-12514: TNS:listener does not currently know of service requested in connect

qiita.com

f:id:ponsuke_tarou:20200229152733j:plain
北区の平和湯