JMeterを使ってみた記録
- 環境
- Windows10 Pro バージョン1909
- java version "1.8.0_251"
JMeterで負荷をかけたいのです。
アプリケーションにおいて、パフォーマンスは重要な要素です。また、どの程度の負荷まで耐えられるのかも、同じく重要な要素となります。JMeterを使用して、このような重要な要素を計測し、より信頼性の高いアプリケーションの開発・改良に役立てましょう。
やりたいこと
ローカル環境で実行しているWebアプリケーションで任意の操作中に負荷をかけたい。
JMeterをインストールします。
- Apache JMeter - Download Apache JMeterを表示する
- [Binaries]からzipファイルをダウンロードする
- 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 ================================================================================
メニューを日本語表示にする
初期段階ではメニューが英語になっているので日本語表示にします。
- [Option] > [Choose Language] > [Japanese]
- メニューが日本語表示になる
画面の操作を記録する(書き途中)
Thread Groupを作成する
- 左に表示されている[Test Plan]を右クリック
- [追加] > [Thread(Users)] > [スレッドグループ]で追加する
- 表示された画面で以下を設定する
項目 | 意味 | 設定値 |
---|---|---|
名前 | 任意、初めてなのでデフォルトのまま | |
コメント | 任意の値、とりあえず未設定 | |
サンプルエラー後のアクション | テスト停止 | |
スレッド数 | 1回の実行でのアクセス数 | 初めてなのでデフォルトのまま |
Ramp-Up期間 | 全リクエストの作成時間 | 60秒 |
ループ回数 | シナリオを繰り返す回数 | 初めてなのでデフォルトのまま |
各項目の意味は、【図解】はじめてでもわかるJMeterの使い方 - RAKUS Developers Blog | ラクス エンジニアブログが図まであってとても分かりやすいです。
記録コントローラーを作成する
- スレッドグループを右クリック
- [追加] > [ロジックコントローラー] > [記録コントローラー]で追加する
- 表示された画面で以下を設定する
項目 | 設定値 |
---|---|
名前 | 任意、初めてなのでデフォルトのまま |
コメント | 任意の値、とりあえず未設定 |
HTTPプロキシサーバを作成する
- TestPlanを右クリック
- [追加] > [Non-Test エレメント] > [HTTP プロキシサーバ]で追加する
- 表示された画面で以下を設定する
項目 | 設定値 |
---|---|
名前 | 任意、初めてなのでデフォルトのまま |
コメント | 任意の値、とりあえず未設定 |
ポート | 使用していないポート番号、デフォルトの8888 はちょうど使っていないのでそのまま |
対象となるコントローラ | 作成した記録コントローラを選択 |
プロキシを設定する
今回使用するのはChromeです。
Win + R
> [ファイル名を指定して実行]ダイアログを表示control inetcpl.cpl
を入力して[OK]ボタンで[インターネットのプロパティ]ダイアログを開く- [接続]タブ > [LANの設定]ボタンでダイアログを開く
- [LANにプロキシサーバーを使用する] > ON
- 以下を設定し、[OK]ボタンで保存する
項目 | 設定値 |
---|---|
アドレス | localhost |
ポート | JMeterでHTTPプロキシサーバのポートに設定した値 |
画面の操作を記録する
- HTTP プロキシサーバの画面にある[開始]ボタンで記録を開始する
- ダイアログが表示されるので[OK]ボタンで進める
- ダイアログがさらに表示されるけど気にせずブラウザ画面の操作を開始する
- 操作を終了する場合は上記ダイアログの[停止]ボタンで終了する
localhostで記録する場合の注意ポイント
localhost:{アプリサーバのポート}/{アプリのURL}
で画面の操作を記録をしたところ記録されたポートがアプリサーバの管理画面のポート(Payaraを使ったので4848)の記録しか取れませんでした。アプリでの操作が記録されなかったのです。
- localhostで記録する場合
-
ipconfig
でPCのIPアドレスを確認する -
{PCのIPアドレス}:{アプリサーバのポート}/{アプリのURL}
をブラウザで表示する- この時点では「このサイトにアクセスできません」となって画面が表示できません。
- 「プロキシを設定する」をする
- HTTP プロキシサーバの画面にある[開始]ボタンで記録を開始する
- ブラウザをリロードするとアプリケーションの画面が表示される
- 操作を記録する
-
- 参考 : たぬきさんのメモ帳:【JMeter】HTTPプロキシサーバとアプリケーションのお話
TCPとUDPの違いから知る特徴
- 前回の勉強内容
- 勉強のきっかけになった問題
- TCPとUDPは、トランスポート層のプロトコルです。
- UDPは、リアルタイム性に優れたプロトコルです。
- TCPは、いろんな仕組みで高信頼性を高めるプロトコルです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
TCPのコネクション確立方式である3ウェイハンドシェイクを表す図はどれか。
TCPとUDPは、トランスポート層のプロトコルです。
OSI参照モデル | TCP/IP | 役割 | プロトコル |
---|---|---|---|
アプリケーション層 | アプリケーション層 | サーバとアプリケーションとの間の通信 | HTTP/FTP/Telnet |
プレゼンテーション層 | データの表現形式や文字コードを規定し、テキスト・画像などのデータ形式を区別 | ||
セッション層 | プロセスを区別して論理的な通信路を確立 | ||
トランスポート層 | トランスポート層 | 通信における信頼性を確保する | TCP/UDP |
ネットワーク層 | インターネット層 | IPアドレスを元にネットワークを識別して転送に必要な情報を付け加える | IP |
データリンク層 | ネットワークインターフェース層 | データリンク層では物理アドレスのMACアドレスが識別にデータの送信先を特定 | |
物理層 | ハードウェア | データを通信回線に送るのに必要な物理的な仕様を規定 |
TCP/IP階層モデルにおいて, TCPが属する層はどれか。
答. トランスポート層
IPプロトコルとセッション層以上のプロトコルとをつないでいます。
インターネットで使われるプロトコルであるTCP及びIPと,OSI基本参照モデルの7階層との関係を適切に表しているものはどれか。
UDPは、リアルタイム性に優れたプロトコルです。
トランスポート層のプロトコルであり,信頼性よりもリアルタイム性が重視される場合に用いられるものはどれか。
答. UDP
IPアドレスの偽装が容易にできてしまいます。
答. DNSリフレクタ攻撃
プロトコル | TCP | UDP |
---|---|---|
タイプ | コネクション型プロトコル | コネクションレス型プロトコル |
高信頼性 | 高い | 低い |
速度/負荷 | 遅い/高い | 早い/低い |
TCPは、いろんな仕組みで高信頼性を高めるプロトコルです。
ポート番号でセッション層以上のプロトコルを識別します。
TCP/IPで使われるアドレスやポート番号のうち,TCPのコネクションを識別するために必要なものの組合せはどれか。
答. あて先IPアドレス,あて先TCPポート番号,送信元IPアドレス,送信元TCPポート番号
OSI基本参照モデルでTCPが属するトランスポート層は、通信の信頼性を確保する機能のほかに、アプリケーション間の通信を実現するという機能があります。
使われる情報 | 情報から識別すること |
---|---|
あて先IPアドレス | 情報を届ける先のホスト |
あて先TCPポート番号 | 情報を届ける先アプリケーション |
送信元IPアドレス | 返信する時に宛先にするホスト |
送信元TCPポート番号 | 返信する時に宛先にするアプリケーション |
アプリケーションやプロトコルによってウェルノウンポートというお決まりのポート番号があります。 そのため、悪い人に狙い撃ちされることもあります。
PCへの侵入に成功したマルウェアがインターネット上の指令サーバと通信を行う場合に,宛先ポートとしてTCPポート番号80が多く使用される理由はどれか。
答. Webサイトの閲覧に使用されることから,通信がファイアウォールで許可されている可能性が高い。
マルウェアが80/TCPを使用するのは、このポートを使えば指令サーバへの通信をファイアウォールで遮断されにくく、さらに業務上行われる大量のHTTP通信に自身の通信を紛れ込ませられるからです。
通信を始める前に3ウェイハンドシェイクでコネクションを確立します。
順番 | SYN synchronize 同期する |
ACK acknowledgement 承認 |
シーケンス番号 | 確認応答番号 |
---|---|---|---|---|
1 | 1 | 0 | ランダムな値 | なし |
2 | 1 | 1 | 相手から受信したシーケンス番号 | 相手から受信したシーケンス番号 + 1 |
3 | 0 | 1 | 相手から受信した確認応答番号 | 相手から受信したシーケンス番号 |
1. Aは、Bに接続要求(SYN)をします。
2. Bは、確認応答(ACK)をして、Aに接続要求(SYN)をします。
3. Aは、確認応答(ACK)をします。
確認応答は、受信側がデータを受け取ると「受け取ったよ連絡(ACK)」をする仕組みです。
TCPのフロー制御に関する記述のうち,適切なものはどれか。
答. 確認応答がない場合は再送処理によってデータ回復を行う。
フロー制御は、通信状況に応じてデータの転送量を制御することです。
TCPを使用したデータ転送において,受信ノードからの確認応答を待たずに,連続して送信することが可能なオクテット数の最大値をなんと呼ぶか。
答. ウィンドウサイズ
ウィンドウサイズは、TCP通信において受信側が現在受信可能なデータサイズを送信側に伝えるために使用されるTCPヘッダ内のフィールドです。
相手からの応答がなくても1度に送信できるデータ量をウィンドウサイズといいます。
毎回、「受け取ったよ連絡」を確認してから次を送信していると効率が悪いのです。 受信側で受け取れるデータ量を教えてくれるのでその量までACKがこなくてもデータを送ります。
TCPヘッダ中のウィンドウサイズの説明として,適切なものはどれか。
答. 受信側からの確認応答を待たずに,データを続けて送信できるかどうかの判断に使用される。
送信側ではウィンドウサイズで指定されたデータを送信し、そのデータの受信確認応答を待つ間に、最新の確認応答内のウィンドウサイズを確認してデータを送信することを繰り返します。このようにデータの確認応答を待たずに次のデータ送信を行うことで、TCPでは効率のよいデータ転送が可能となっています。
次回の勉強内容
DNSの基本を学ぼう
- 前回の勉強内容
- 勉強のきっかけになった問題
- DNSは、ドメイン名やホスト名などとIPアドレスとを対応付けます。
- ゾーンは、特定のDNSサーバが管理するドメインの範囲のことです。
- ダイナミックDNSでは、PCのIPアドレスが変わっても、そのPCには同じホスト名でアクセスできます。
- DNSサーバに対して、IPアドレスに対応するドメイン名又はドメイン名に対応するIPアドレスを問い合わせるクライアントソフトウェアをリゾルバといいます。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
DNSに関する記述のうち,適切なものはどれか。
DNSは、ドメイン名やホスト名などとIPアドレスとを対応付けます。
TCP/IPを利用したネットワークでは、各ノードを識別するため一意のIPアドレスが割り当てられていますが、このIPアドレスは数字の羅列で人間にとって覚えにくいため、IPアドレスと対応する別名であるドメイン名が付けられています。DNS(Domain Name System)はこのドメイン名とIPアドレスを結びつけて相互変換する(名前解決する)仕組みです。
平成20年秋期問35 DNSが果たす役割はどれか|基本情報技術者試験.com
ゾーンは、特定のDNSサーバが管理するドメインの範囲のことです。
【図解】DNSゾーン転送の仕組みとシーケンス~フォワーダとの違い,AD統合ゾーン,notify,スタブゾーンのメリット/デメリット~ | SEの道標
ゾーン転送は、DNSサーバのゾーン情報全体を別のDNSサーバに転送することです。
【図解】DNSゾーン転送の仕組みとシーケンス~フォワーダとの違い,AD統合ゾーン,notify,スタブゾーンのメリット/デメリット~ | SEの道標
ゾーン情報が設定された大元のサーバをプライマリサーバといいます。
プライマリサーバでは、無駄に情報を公開しないために設定でゾーン転送を許可するDNSサーバを限定できます。
DNSサーバに格納されるネットワーク情報のうち,第三者に公開する必要のない情報が攻撃に利用されることを防止するための,プライマリDNSサーバの設定はどれか。
- 答. ゾーン転送を許可するDNSサーバを限定する。
定期的に実行される「プライマリ」から「セカンダリ」へのゾーン情報のコピー(同期処理)は、ゾーン転送(53/TCP)という機能を使用して行われますが、特に制限をしていない場合「セカンダリサーバ」以外のホストからの要求でも実行可能になっています。したがって攻撃者がこれを用いた場合「プライマリサーバ」からゾーン情報やサーバ/ネットワーク構成を不正に取得されてしまう可能性があります。
これを防ぐためには、ゾーン転送を行うホストをセカンダリサーバのみに制限し、ゾーン転送する情報の範囲を最小とする対策が有効です。
平成23年秋期問8 プライマリDNSサーバの設定|情報処理安全確保支援士.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
DNSサーバに対して、IPアドレスに対応するドメイン名又はドメイン名に対応するIPアドレスを問い合わせるクライアントソフトウェアをリゾルバといいます。
種類 | 問合せ方 | 機能 |
---|---|---|
スタブリゾルバ | 再帰的問合せ 代理で他のDNSサーバに問い合わせをしてもらって最終結果をもらうこと |
自分で名前解決できないからDNSリクエストを送信するだけのクライアント |
フルサービスリゾルバ | 反復問合せ 名前解決できるまで繰り返して他のDNSサーバにお問合わせすること |
自分で持っているキャッシュ情報か権威DNSサーバへの合わせで名前解決ができるサーバ |
キャッシュポイズニング攻撃対策として、再帰的な問合せに対しては内部ネットワークからのものだけに応答するように設定します。
攻撃者がDNSキャッシュサーバに偽のキャッシュ情報を登録させる手順を追ってみます。
- 攻撃者は、キャッシュサーバに対して偽の再帰的な問合せを行い反復問合せを強制的に生じさせる。
- キャッシュサーバは、コンテンツサーバに対して反復問合せを行う。
- 攻撃者は、コンテンツサーバが正規の応答を返すよりも先にキャッシュサーバへ偽の応答を送りつける。
- キャッシュサーバは、攻撃者から送られた偽の応答を正規のものと判断しキャッシュに登録する。この時点でDNSクエリは解決済なのでコンテンツサーバから送られた正規の応答は破棄される。
(省略)再帰的問合せの役割は、内部ネットワークのホストが外部ネットワークに接続する際の名前解決であり、原則として外部からの再帰的な問合せに応じる必要はないはずですから、再帰的な問合せを受け付けるホストを内部ネットワークだけに限定することがキャッシュポイズニング攻撃への対策となります。
平成29年春期問41 キャッシュポイズニング攻撃への対策|応用情報技術者試験.com
次回の勉強内容
伊香保温泉と水沢山登山
1日目:始めて伊香保温泉に行きました。
2日目:いよいよ水沢山登山
2日目は晴れたのでいよいよお楽しみの登山です。
伊香保温泉から車で15分くらいで着きました。
水沢観音駐車場に車を停めてスタートです。
事前に調べた情報では水沢観音で駐車場を提供しているとのことだったのですが、拝観者に提供しているのであって登山者向けではありません。
なので登山の前後は参拝を忘れずしてきました。
結構境内にはいろいろあって楽しかったです。
mizusawakannon.or.jp
登山口は、階段を上がった権現様の横にあります。
途中に何かの歌の碑があります。が、漢字が読めなくて何かはよくわかりませんでした。
この白い花はお家で調べて、サラシナショウマ・・・かな・・・と。
サラシナショウマ | 薬草データベース
登山道は最後の辺り以外は階段が主体となっていました。
時間は2-3時間くらいで距離も2kmとライトですが・・・階段は辛い。
体重が多いので・・・なかなか体力のいる登山でした。
ぜぇぜぇいいながら休憩をすると木々の間からは素敵な景色が見えます。
登山の楽しみです。
途中はお地蔵様が迎えてくれます。ありがたいことです。
山頂は、狭めで登頂したときには10人くらいのパーティーがご飯中でぎゅうぎゅう状態でした。
折り返さずに反対側へ行くルートもあるそうです。
いつか挑戦してみたいものです。
山頂で出会った常連っぽいおじさんのお話では、散歩がてらに朝登る方もいるそうです。
どおりで、スタスタと登る人とぜぇぜぇいいながら登る人がいるわけです。
最後はやっぱり名物の水沢うどんです。駐車場の前にはいくつものおうどん屋さんがあって登山後には嬉しいお食事どころとなります。
CP932とMS932の違いを調べて知ったCP932とSJISの違い
- 「統合したCP932」とMS932は同じようなもんです。
- CP932の歴史
- 「誕生したばかりのCP932」とSJISと同じですが、「統合されたCP932」とSJISには違いがあります。
- SJISやCP932で2byte目が「5C」「7E」の文字には問題が起こることがあります。
「統合したCP932」とMS932は同じようなもんです。
「統合したCP932」をJavaではMS932といいます。
わざわざ「統合したCP932」としたのには理由があります。
CP932は時代によってものがちょっとずつ違うのです。
CP932の歴史
西暦 | CP932 の歴史 |
ざっくり説明 |
---|---|---|
1982 | CP932誕生 | マイクロソフトが日本語ようにSJISという文字コードを作りました。このSJISの管理番号はコードページ932(CP932)でした。 |
1982以降 | NECとIBMがCP932をそれぞれで拡張 | 各社が自社製品用にCP932を拡張したのでCP932種類ができました。 |
1993 | CP932を統合 | マイクロソフトは拡張されたCP932を統合してWindows-31Jという名前でIANAに登録しました。CP932っていうと種類があるからJavaでは統合されたCP932(=Windows-31J)をMS932と呼ぶことにしました。 |
これをまとめてわかりやすい図で紹介しているのが以下のサイトです。
「誕生したばかりのCP932」とSJISと同じですが、「統合されたCP932」とSJISには違いがあります。
「統合されたCP932」にはあるけどSJISにはない文字があります。
「誕生したばかりのCP932」はSJISと同じですが、紆余曲折の結果「統合されたCP932」にはあるけどSJISにはない文字があります。
NECやBIMが拡張した部分です。
なんだかんだで結構いっぱいあります。どれもむつかしい漢字ばっかり・・・読めない書けない見分けられない。
漢字以外にもあります。
(CP932にはあるけどSJISにはない漢字の一例)
奓 奛 奝 奣 妤 妺 孖 寀 甯 寘 寬 尞 岦 岺 峵 崧 嵓
﨑 << これは「タチサキ」というらしい
鋗 鋙 鋐 﨧 鋕 鋠 鋓 錥 錡 鋻 﨨 錞 鋿 錝 錂 鍰 鍗 鎤 鏆 鏞 鏸 鐱 鑅 鑈 閒 隆 﨩 隝 隯 霳 霻 靃 靍 靏 靑 靕 顗 顥 飯 飼 餧 館 馞 驎
髙 << これは「ハシゴダカ」というらしい(CP932にはあるけどSJISにはない漢字以外の一例)
㌔ ㌢ ㍍ ㌘ ㌧ ㌃ ㌶ ㍑ ㍗ ㌍ ㌦ ㌣ ㌫ ㍊ ㌻ ㎜ ㎝ ㎞ ㎎ ㎏ ㏄ ㎡
SJISやCP932で2byte目が「5C」「7E」の文字には問題が起こることがあります。
Shift_JIS(SJIS, cp932) の文字コードで、2byte目が0x5c の \ になっているものの俗称(だめ文字、駄目文字)
0x5cの \ は使用するフォントやロケールによりバックスラッシュまたは¥記号で表示されます。
ダメ文字を含む文字列やパス、ファイル名を処理する場合には文字化け、検索不可など様々な不具合が起きることがあります。
ダメ文字には ー ソ 十 表 など、使用頻度の高いものもあるので cp932を扱う場合には注意が必要です。
fudist - Shift_JIS(cp932)の「ダメ文字」
WindowsにPython3とPyCharmをインストールする方法
- 環境
- Windows10 Pro 64bit バージョン1909
Pythonをインストールする
参考 : Pythonのダウンロードとインストール | Python入門
exeファイルをダウンロードする
- Python Releases for Windows | Python.orgを表示する
- [Latest Python 3 Release - Python 3.x.x]リンクを押下する
- 今回はPython 3.8.5
- ページの下のほうにある一覧から「Windows x86-64 executable installer」からexeファイルをダウンロードする
インストールする
- ダウンロードしたexeファイルを実行してダイアログを表示する
- [Add Python 3.x to PATH]にチェックを入れて環境変数のPATHに追加されるようにする
- [Customize installation]リンクで次の画面を表示する
- [Optional Features]でオプションを選択する
- 今回は初めてなので全選択
- [Advanced Options]でオプションを選択する
- インストール先を指定したい場合は[Customize install location]で指定する
- [Install]ボタンでインストールする
- [Setup was successful]が表示されたら[Close]ボタンでダイアログを閉じる
バージョンを確認する
インストールされたことを確認するためにバージョンを確認する
$ python -V Python 3.8.5
PyCharm(統合開発環境)をインストールする
PyCharmは無料版をインストールします。
exeファイルをダウンロードする
- PyCharm:JetBrainsによるプロ開発者様向けPython IDEを表示する
- [ダウンロード]ボタンで次の画面を表示する
- [Windows]の[コミュニティ]にある[ダウンロード]からexeファイルをダウンロードする
インストールする
- ダウンロードしたexeファイルを実行してダイアログを表示する
- [Next]ボタンで[Choose Install Location]画面へ進んでインストール先を指定する
- [Next]ボタンで[Installation Options]画面へ進んでオプションを選択する
- 各オプションについては PyCharmのインストール方法(Windows) | ガンマソフト株式会社が参考になる
- 今回は全部未選択
- [Finish]ボタンでダイアログを閉じる
プロジェクトを設定する
既存のプロジェクトをインポートする
gitでcloneしてきた既存プロジェクトをインポートします。
参考 : 既存のソースコードからプロジェクトをインポートする — PyCharm
- pyCharmを起動する
- [Open]でcloneしたフォルダを選択してインポートする
既に別のプロジェクトがある場合
PyCharmを使っていてほかのプロジェクトがある場合はこちらの方法でインポートします。
- [File] > [New Project...]でダイアログを開く
- 以下を設定して[Create]ボタン
- Location : cloneしたフォルダを選択
- New enviroment using : Virtualenv
- Location : 仮想環境を作る空のフォルダを指定(今回は初期値の
プロジェクトフォルダ/venv/
) - ここを設定すると次の「仮想環境を作成して設定する」が不要になります。
- Location : 仮想環境を作る空のフォルダを指定(今回は初期値の
- Create a maion.py welcome script : OFF
- ダイアログ(cloneした場所にいろいろ作っていい?)で[Create from Existing Sources]ボタン(選択はお好みで)
- 次のダイアログ(既存のプロジェクトと別Windowにする?)で[New Window]ボタン(選択はお好みで)
- ちょっと待つとプロジェクトがインポートされる(仮想環境用のディレクトリもできている)
仮想環境を作成して設定する
参考 : 仮想環境を構成する — PyCharm
- 「Ctrl+Alt+S」で設定画面を表示する
- [Project:{プロジェクト名}] > [Python Interpreter] > 歯車アイコン > [Add]でダイアログを表示する
- 左側のペインで[Virtualenv Enviroment]を選択して以下を設定する
- Location : 仮想環境を作る空のフォルダを指定(今回は初期値の
プロジェクトフォルダ/venv/
) - Base interpreter : 使うPythonのバージョンを選択する
- Inherit global site-packages(グローバル site-packages を継承する) : OFF
- Make available to all projects(すべてのプロジェクトで使用可能にする) : OFF
- Location : 仮想環境を作る空のフォルダを指定(今回は初期値の
- [OK]ボタンで仮想環境を作成する
- [Apply]ボタンで反映して、[Close]ボタンで設定画面を閉じる
- Locationフォルダが作成されて中にいろいろ入ってる
ライブラリをインストールする
- 画面下にある[Terminal]でターミナルを開く
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にインストールしたい場合
CookieにはWebアプリケーションでのユーザ情報やセッションIDが格納されます
- 前回の勉強内容
- 勉強のきっかけになった問題
- Cookieは、Webサーバに対するアクセスがどのPCからのものであるかを識別するためにブラウザにユーザ情報などを保存する仕組みです。
- セッションは、サーバとの一連のやり取りの流れです。
- CookieにSecure属性を設定することで、httpsのときだけWebブラウザからCookieが送出されます。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
CookieにSecure属性を設定しなかったときと比較した,設定したときの動作として,適切なものはどれか。
Cookieは、Webサーバに対するアクセスがどのPCからのものであるかを識別するためにブラウザにユーザ情報などを保存する仕組みです。
cookie(HTTP cookie:クッキー)は、状況によって異なるページを提供したいというニーズにより開発され、ユーザ識別やセッション管理を実現する目的などに利用されています。
平成19年秋期問36 cookieの説明|基本情報技術者試験.com
セッションは、サーバとの一連のやり取りの流れです。
Googleアナリティクスの基本指標を正しく理解しよう<セッション・ユーザー・ページビュー数> : ビジネスとIT活用に役立つ情報
CookieでセッションIDを持ってセッションの管理をします。
5.8. セッション管理 — TERASOLUNA Global Framework Development Guideline 1.0.0.publicreview documentation
セッションハイジャックとは、利用者のセッションIDを不正に取得しその利用者になりすましてサーバにアクセスすることです。
セッションIDによってセッションが管理されるとき,攻撃者がログイン中の利用者のセッションIDを不正に取得し,その利用者になりすましてサーバにアクセスする。
平成29年春期問23 ディレクトリトラバーサル攻撃|情報セキュリティマネジメント試験.com
セッションハイジャックされると、Cookieの情報では正規ユーザーによる操作なのかは判別できません。
セッションハイジャック等によって、ログイン中のセッションが第三者に乗っ取られても、URLやCookieに格納されているセッションIDが正規のものである限り、Webアプリケーション側では「攻撃者によって乗っ取られたリクエスト」なのか「正規ユーザによるリクエスト」なのかの区別がつきません。
平成28年春期問41 ブラウザに送信する直前に行う対策|応用情報技術者試験.com
Webアプリケーションのセッションが攻撃者に乗っ取られた場合は、重要な情報をWebブラウザに送信する直前にはパスワードによる利用者認証などを行う必要があります。
Webアプリケーションのセッションが攻撃者に乗っ取られ,攻撃者が乗っ取ったセッションを利用してアクセスした場合でも,個人情報の漏えいなどの被害が拡大しないようにするために,Webアプリケーションが重要な情報をWebブラウザに送信する直前に行う対策として,最も適切なものはどれか。
エ. パスワードによる利用者認証を行う。
平成28年春期問41 ブラウザに送信する直前に行う対策|応用情報技術者試験.com
CookieからセッションIDをパクられるとセッションハイジャックされます。
- 「推測」への対抗
- 予測困難なランダム値を使う
- ログイン(ユーザ認証)成功のたびに異なる値を使う
- 「奪取」への対抗
利用者のログアウト時には、WebサーバにおいてセッションIDを無効にします。
Webシステムにおいて,セッションの乗っ取りの機会を減らすために,利用者のログアウト時にWebサーバ又はWebブラウザにおいて行うべき処理はどれか。ここで,利用者は自分専用のPCにおいて,Webブラウザを利用しているものとする。
イ. WebサーバにおいてセッションIDを無効にする。
平成30年春期問43 セッションハイジャック対策|応用情報技術者試験.com
CookieにSecure属性を設定することで、httpsのときだけWebブラウザからCookieが送出されます。
secure属性が指定されていないと,暗号化されていない通信経路上にクッキーが送信されてしまい,盗聴される危険がある。最近の開発環境では,アプリケーション・サーバーや,フレームワークがsecure属性の設定を自動的に設定することが多いため気付きにくいかもしれない。マニュアルを確認し,正しく設定する必要がある。
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)
Cookieを発行する際に指定できる属性にはほかにもいろいろあります。
expires属性は,被害が発生してしまう可能性と関連する。この指定がある場合,指定された日時までクッキーが送信される。つまり,クッキーは指定された日時までファイル上に保存され,ブラウザ再起動後もその値が読み込まれ使用される。指定がない場合,有効期限はブラウザが終了するまでとなる。
この属性が指定されていなければ,ブラウザを起動していないユーザーが被害に遭うことはない。しかし,この属性が指定されていると,ブラウザ起動時にクッキーが自動的に読み込まれ送信されるため,ブラウザを起動していないユーザーも被害に遭う対象となる。この属性は,オートログイン機能を実現するために設定されることが多いが,このようなリスクが発生することは認識しておかなければならない。
第1回 まずは「クッキー」を理解すべし | 日経クロステック(xTECH)
次回の勉強内容
レスポンシブ対応で知ったメディアクエリの基本
- メディアクエリは、表示するディバイスなどによって適用するCSSを切り替える機能です。
- メディアクエリの指定方法
- メディアは、メディアタイプかメディア特性を論理演算子で組み合わせて指定します。
- スマートフォン用にはどんな指定がいいか集めてみました。
- メディアクエリを使うにはHTMLのheadタグにviewportを指定します。
メディアクエリは、表示するディバイスなどによって適用する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に一致しないすべての端末 |
ページ付きの素材や、印刷プレビューモードで画面に表示された文書 |
- 以下のメディアタイプは、メディアクエリ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>
CentOSでJSFのプロジェクトを作る
- 環境
参考資料
久しぶりに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
Mavenプロジェクトを作成する
- [Package Explorer]にカーソルを入れて「Ctrl + N」で新規作成ダイアログを表示する。
- [Maven] > [Maven Project] > [Next]ボタン
- [Create a simple project(skip archetype selection)]チェックボックスをONにする > [Next]
- 以下を設定して[Finish]ボタンでプロジェクトを作成する
- GroupId : プロジェクトのルートパッケージ名
- ArtifactId : プロジェクト名
- この時点でエラーがあっても見なかったことにする
コンパイラを設定する
- [Package Explorer]でプロジェクトを選択 > 「Alt + Enter」でプロパティダイアログを表示する
- [Java Compiler] > [Use compliance from execution environment 'JavaSE-1.5 on the 'Java Build Path']チェックボックスをOFFにする
- [Compiler compliance level]で「11」を選択 > [Apply]ボタンで適用する
- 以下のメッセージダイアログが表示されるので[Yes]でビルドを行う
JSFを設定する
- [Project Facet] > [Convert to Faceted...]リンクを押下して一覧を表示する
- [Java]をONにして[Version]を「11」にする
- [JavaServer Faces]をONにして[Version]を「2.3」にする
- [Dynamic Web Module]をONにして[Version]を「4.0」にする
- [Runtimes]タブ > 表示されたPayaraをONにする
- 下の方に出てくる[Further configuration required...]リンクを押下して[Modify Faceted Project]画面を表示する
- [Content directory : ]を設定する(今回はデフォルトのまま)
- [Generate web.xml....... : ]チェックボックスをONにする > [Next]ボタン
- 特に変更はしないで[OK]ボタンでダイアログを閉じる
- [Aply and Close]ボタンでプロパティダイアログを閉じる
- プロジェクトにエラーが有った場合は、エラーが消える(はず)
pom.xmlにJSFのライブラリを定義する
- Maven Repository: org.glassfish » javax.facesから任意のバージョンのMaven用定義をコピーする
- [JavaServer Faces]を「2.3」にしたので今回は「2.3.9」を使う
- Eclipseでpom.xmlを開いて定義を貼り付ける
- Maven Repository: org.primefaces » primefacesから任意のバージョンのMaven用定義をコピーする
- 今回は作業時点で最新の「8.0」を使う
- JSFでラジオボタンなどを使うのに便利
- 参考 : Primefacesの紹介
- [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に合わせる
- src/main/webapp/WEB-INF/web.xmlを開く
- web-appの記載をDynamic Web Moduleに合わせる
- 参考 : web.xmlのバージョン別DTD・XSDの宣言方法 | KATSUMI KOKUZAWA'S BLOG
- バージョン4.0の場合は以下の記載になる
- [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"> <!-- 省略 -->
動かしてみる
ページを作成する
- [webapp]を選択して「Ctrl + N」で新規ダイアログを開く
- [Web] > [HTML File] > [Next]ボタンで進む > [File name:]に「index.xhtml」を入力し[Next]ボタン
- [Templates:] > [New Facelet Composition Page](新規Facelet構成ページ) > [Finish]ボタンで新規ページを作成する
- 以下のコードを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を起動する
- [Package Explorer]でプロジェクトを選択して右クリック
- [Run As] > [Run On Server] > ダイアログでPayaraを選択して起動する
- http://localhost:8080/tryJsf/index.xhtmlにアクセスしてページが表示されたら動作確認完了
WordPressでGoogleのCustom Search APIを使ってみる
- 1. プロジェクトを作成してCustom Search APIを設定する
- 2. 検索エンジンを作成する
- 3. WordPressで検索処理を作る
- 4. ブログの投稿にショートコードを埋め込む
- 5. 結果を表示する
- もうちょっと使ってみた
1. プロジェクトを作成してCustom Search APIを設定する
- (ない場合)Google アカウントの作成でアカウントを作成する
- (ない場合)Google Cloud Platformでプロジェクトを作成する
- 画面上部でプロジェクトを選択する
- APIとサービスを有効化リンクで[APIライブラリ]画面を表示する
- 「Custom Search API」を検索して選択、[有効化]ボタンで有効にする
- プロジェクトを作成していないと有効化できないらしい
- 参考 : PHP、GoogleのCustom Search APIを使ってみる(1):事前準備1、APIキーを取得する|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~
- [ナビゲーションメニュー] > [APIとサービス] > [認証情報] > 画面上部の[認証情報作成] > [APIキー]でAPIキーを作成する
- APIキーをメモっておく
- ポップアップの[キーを制限]リンクから[API キーの制限と名前変更]画面を表示して制限情報を設定して[保存]ボタンで保存する
2. 検索エンジンを作成する
- Programmable Search Engine by Googleを表示して[Get started]ボタンで[Programmable Search]画面を表示する
- [新しい検索エンジン]で画面を表示して検索エンジンを作成する
- [検索するサイト] : 「*.sample.com」(後で削除する)
- [言語] : 「日本語」
- [検索エンジンの名前] : 好きな名前
- 参考 : Laravel上でGoogle Custom Search APIを使ってみた - Qiita
- [コントロールパネル]ボタンで画面を表示する
- 必要に合わせて検索エンジンを設定する
- 参考 : PHP、GoogleのCustom Search APIを使ってみる(2):事前準備2、検索エンジンの設定をする|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~
- Web全体を検索できるようにする設定
- [検索するサイト] > 登録したサイトを選択 > [削除]ボタンで削除する
- [ウェブ全体を検索]を「オン」にする
- [基本]タブ > [検索エンジン ID]から検索エンジンIDをメモっておく
3. WordPressで検索処理を作る
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. ブログの投稿にショートコードを埋め込む
5. 結果を表示する
もうちょっと使ってみた
初めて聞いた、AWS Elastic Beanstalkって何?
- 初めて聞いた、AWS Elastic Beanstalk
- AWS Elastic Beanstalkは、ウェブアプリケーションやサービスをサーバーでデプロイおよびスケーリングするためのサービスです。
- よくわかんないな・・・
AWS Elastic Beanstalkは、ウェブアプリケーションやサービスをサーバーでデプロイおよびスケーリングするためのサービスです。
AWS Elastic Beanstalk は、Java、.NET、PHP、Node.js、Python、Ruby、Go および Docker を使用して開発されたウェブアプリケーションやサービスを、Apache、Nginx、Passenger、IIS など使い慣れたサーバーでデプロイおよびスケーリングするための、使いやすいサービスです。
AWS Elastic Beanstalk(ウェブアプリの実行と管理)| AWS
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 コンテナを並行して実行できる環境を作成することができます。
複数コンテナの Docker 環境 - AWS Elastic Beanstalk
事前設定済み Docker コンテナ
自分が使いたいのと同じ設定の環境がある場合に使うものらしい。
docs.aws.amazon.com
よくわかんないな・・・
AWSのEC2を自動停止するLambdaを作る記録
実行権限を作成します。
- 「IAMのポリシーを作成する」を参考にポリシーを作成します。
- [JSON]タブで設定するポリシーは以下になります。
- 「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関数を作成します。
- AWSのコンソールにある[Lambda] > [関数の作成]ボタンで画面を開きます。
- 必要な項目を入力後に[関数の作成]ボタンで関数を作成します。
- オプション : [一から作成]
- 関数名 : 任意の関数名
- ランタイム : Python3.8
- 実行ロール : 既存のロールを使用する
- 作成したロールを選択します。
- 「Lambda関数を実行するトリガーを作成します。」を参考にトリガーを作成します。
関数を実装します。
- [関数コード] > [lambda_function.py]に以下のコードを張り付けて[保存]ボタンで保存します。
- 定数の[REGION_NAME]には停止対象のEC2インスタンスがあるリージョンを指定してください。
- 「関数を動かしてみます。」を参考にエラーが無くなるまで関数を動かして修正を繰り返します。
# -*- 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
使用した関数のドキュメント
- describe_instances : 辞書形式でインスタンスを取得する
- stop_instances : 指定したインスタンスを停止する
失敗したこと
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プロトコル
- 前回の勉強内容
- 勉強のきっかけになった問題
- SNMPは、TCP/IPネットワークに接続されている機器の情報を収集して監視や制御を行うためのプロトコルです。
- SNMPは、SNMPマネージャとSNMPエージェントの間で使用されます。
- SNMPv1、SNMPv2、SNMPv3の3つのバージョンがあります。
- SNMPマネージャとSNMPエージェントは、MIBをやり取りします。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
ネットワーク管理プロトコルであるSNMPv3で使われるPDUのうち、事象の発生をエージェントが自発的にマネージャに知らせるために使用するものはどれか。ここで、エージェントとはエージェント相当のエンティティ、マネージャとはマネージャ相当のエンティティを指す。
- SetRequest-PDU
- Response-PDU
- SNMPv2-Trap-PDU
- GetRequest-PDU
SNMPは、TCP/IPネットワークに接続されている機器の情報を収集して監視や制御を行うためのプロトコルです。
- 英語 : Simple Network Management Protocol
SNMPは、SNMPマネージャとSNMPエージェントの間で使用されます。
【図解】SNMPの仕組み~利用ポート,監視方法(マネージャのMIBポーリング/trap受信),tcp/udp,writeの実装例〜│SEの道標
SNMPv1、SNMPv2、SNMPv3の3つのバージョンがあります。
SNMPv1とSNMPv2は、セキュリティが弱いのであまり使われていません。
以下の記事で取り上げているSNMPリフレクター攻撃では、SNMPv2に対応し、コミュニティ名(SNMPでのパスワード的なもの)が初期値の「public」に設定されている機器をターゲットにしていたそうです。
www.itmedia.co.jp
SNMPv3は、セキュリティが強化されてPDUの暗号化ができるのが特徴です。
SNMPv1とSNMPv2では、コミュニティ名による認証をしていました。
PDUは、制御情報をくっつけたデータの送受信単位のことです。
- 英語 : Protocol Data Unit
- 読み方 : ピーディーユー
転送フレームでのSNMPメッセージ
GetRequest/GetNextRequest/SetRequest/GetResponseのPDU構造
TrapのPDU構造
どのようにしてネットワークを管理するのか?:監視を自動化するSNMP(2) - @IT
SNMPのPDUには種類があります。
名前 | 細かい名前 | UDPタイプ | 説明 |
---|---|---|---|
ポーリング | - | - | SNMPマネージャがSNMPエージェントにリクエストを送って情報を収集する |
ポーリング | GET REQUEST | 0 | 一部の管理情報を取得する |
ポーリング | GETNEXT REQUEST | 1 | 次に連続する管理情報を取得する |
ポーリング | GET RESPONSE | 2 | SNMPマネージャからの要求に対するSNMPエージェントの返答 |
ポーリング | SET REQUEST | 3 | 管理するサブシステムに対して変更を加える |
トラップ | - | 4 | SNMPエージェントがSNMPマネージャに障害の情報を送る |
事象の発生をエージェントが自発的にマネージャに知らせるために使用するのがトラップです。
図で示したネットワーク構成において,アプリケーションサーバA上のDBMSのデーモンが異常終了したという事象とその理由を,監視用サーバXで検知するのに有効な手段はどれか。
答. アプリケーションサーバAから監視用サーバXへのSNMPトラップ
応用情報技術者平成24年春期 午前問35
SNMPマネージャとSNMPエージェントは、MIBをやり取りします。
MIBは、機器の設定や状態などの情報集合体のことです。
- 英語 : Management Information Base
- 読み方 : みぶ
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
次回の勉強内容
勉強中・・・
LANセグメントを分ける仮想LAN、VLANのお話
- 前回の勉強内容
- 勉強のきっかけになった問題
- VLANは、1つの物理的スイッチで複数のスイッチがあるみたいにLANセグメントを分けることができる技術です。
- VLANは、LANセグメントの分割方法によって方式があります。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
VLAN機能をもった1台のレイヤ3スイッチに複数のPCを接続している。スイッチのポートをグループ化して複数のセグメントに分けると、スイッチのポートをセグメントを分けない場合に比べて、どのようなセキュリティ上の効果が得られるか。
VLANは、1つの物理的スイッチで複数のスイッチがあるみたいにLANセグメントを分けることができる技術です。
- 正式名称 : Virtual Local Area Network(Virtual LAN)
VLANではない場合、1つの物理スイッチには1つのLANセグメントがあります。
VLANにすると、まるで複数のスイッチがあるように複数のLANセグメントに分割することができます。
LANスイッチは、複数の機器をネットワークと接続できるようにする機器です。
OSI参照モデル | 機器 | 説明 |
---|---|---|
ネットワーク層 | L3スイッチ | ネットワークの中継機器の一つで、 ネットワーク層とリンク層の両方の制御情報に基づいてデータの転送先の決定を行います。 |
データリンク層 | L2スイッチ | MACアドレスを含んだ情報を使って 適切なポートにイーサネットフレームを転送します。 |
スイッチ内に作られた仮想スイッチのポートを物理的なポートに割り当てることでLANセグメントを分割します。
VLAN対応スイッチでは、仮想的に作られたスイッチ、いわゆる仮想スイッチがスイッチ内部で動いている。スイッチの物理ポートを仮想スイッチのポートに割り当てることで、ネットワークの分割を実現している。
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)
ブロードキャストドメインを分割できるので、他のセグメントへのARPを防止します。
ARPは、IPアドレスからMACアドレスを取得するために使われるプロトコルです。
ponsuke-tarou.hatenablog.com
スイッチが、PCからのブロードキャストパケットの到達範囲を制限するので、アドレス情報の不要な流出のリスクを低減できます。
L3スイッチの内部ルーターを使うことで分割したLANセグメント同士を接続することができます。
L3スイッチは、L2スイッチの内部にルーターの機能を組込んでルーターによるVLAN間ルーティングをするネットワーク機器です。
LANセグメントごとにIPアドレスを割り当てて、LANセグメント同士を接続します。
各VLANを識別するために割り振られる番号を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
物理的なポートごとにLANセグメントを分割するので、1つのポートにつけられるVLAN IDは1つです。
タグVLANは、イーサネットフレームにタグ情報を挿入してフレーム単位でLANセグメントを分割します。
- 英語 : tag VLAN
- 別名 : タギングVLAN
イーサネットフレームのタグで判別するので、1つのポートに複数のVLAN IDをつけられます。
タグVLAN (Tag VLAN) とは、複数のVLANを1本のLAN 接続だけで複数スイッチ間で共有できる技術です。IEEE802.1qという規格で規定されており、VLAN IDは1~4094が使えます。
【図解】タグVLANとネイティブVLAN (PVID)の違い,native vlanを変更する理由,不一致による影響 | SEの道標
イーサネットフレームは、イーサネットでの通信で使用するデータフォーマットのことです。
ponsuke-tarou.hatenablog.com
タグのフォーマットは、IEEE802.1Q(通称 : ドット1キュー)で標準化されています。
トランクプロトコルのまとめ ~IEEE802.1QとISL~ | VLAN(Virtual LAN)の仕組み | ネットワークのおべんきょしませんか?
EEE802.1Qでは送信元MACアドレスとタイプフィールドの間にタグと呼ばれる4バイトのフィールドを挿入します。
VLAN - アクセスポートとトランクポート
複数のVLANに所属しているポートをトランクポートといいます。
トランクポートは複数のVLANに所属するポートです。主にスイッチ同士を接続する際に使用するポートです。
VLAN - アクセスポートとトランクポート
タグVLANで使う物理ポートをトランクポート、トランクポート同士をつなぐリンクを「トランクリンク」と呼ぶ。トランクポートには通常、パソコンなどの端末を接続せず、スイッチのトランクポート同士をつなぐために使う。
ポートVLANとタグVLANの違いとは? | 日経クロステック(xTECH)
次回の勉強内容
RDSでOracleを作ってみる
- RDSでMySQLをつくってみました。
- RDSでOracleを作成してみます。
- EC2インスタンスから接続できるようにセキュリティグループを設定します。
- RDSへSQL*Plusで接続してみます。
- 自動停止するように自動停止時間をAutoStopタグに設定します。
- 失敗したこと
RDSでMySQLをつくってみました。
Oracleでもやりたいことができたので作ってみます。
ponsuke-tarou.hatenablog.com
EC2インスタンスから使えるRDSを作成します。
RDS作成予定のVPC内にある以前作成したEC2インスタンスから接続します。
ponsuke-tarou.hatenablog.com
RDSでOracleを作成してみます。
- AWS マネジメントコンソールで[RDS]を選択して、RDSの画面を表示します。
- [データベースの作成]ボタンで[データベースの作成]画面を表示します。
- 以下を設定して[データベースの作成]ボタン
- 画面上部に表示される[認証情報の詳細を表示]ボタンでパスワードを確認してどっかに記録しておきます。
EC2インスタンスから接続できるようにセキュリティグループを設定します。
今回はRDSとEC2が同じVPC内にある構成なので、RDSのセキュリティグループに
- EC2のプライベートIP
- EC2のセキュリティグループID(sg-xxxx)
のどちらかをOracle用ポート(1521)に許可するように設定します。
MySQLを作成したときは、プライベートIPを設定したので
今回は、セキュリティグループIDを設定してみます。
セキュリティグループにEC2インスタンスのセキュリティグループIDを設定します。
EC2インスタンスのセキュリティグループIDを確認します。
RDSへSQL*Plusで接続してみます。
EC2インスタンスにSQLPlusをインストールします。
(停止していたら)RDSを起動します。
- データベースの一覧で作成したRDSを選択します。
- [アクション] > [開始]で起動します(少々時間がかかります)。
- 一覧の[ステータス]が「利用可能」になったら起動しています。
エンドポイントを確認します。
- データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
- [接続とセキュリティ]タブ > [エンドポイント]に表示されている「{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 火 3月 10 11:45:48 2020 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 火 3月 10 2020 11:17:11 +00:00 Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL>
ユーザーを作成して好きに使っていきます。
自動停止するように自動停止時間をAutoStopタグに設定します。
MySQLのRDSを作ったときに設定したRDS自動停止用のLambdaで自動停止できるようにAutoStopタグを設定します。
ponsuke-tarou.hatenablog.com
- データベース一覧から作成したDB 識別子のリンクから詳細画面を開きます。
- [タグ]タブ > [追加]ボタンで[タグの追加] ウィンドウを表示します。
- [タグキー]に「AutoStop」と[値]に「自動停止したい時間」を入力して[追加]ボタンでタグを追加します。
失敗したこと
DBName must be less than 8 characters long.
- 事象 : [データベースの作成]画面の[データベースの作成]ボタンでエラーになった。
- 原因 : [最初のデータベース名]に指定したデータベース名の文字数が8文字以上だから。
- 対応 : 8文字未満のデータベース名を指定する。