状態遷移から知る有限オートマトン

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : 状態遷移図を使って有限オートマトンを知る

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

次の表は,入力記号の集合が{0,1},状態集合が{a,b,c,d}である有限オートマトン状態遷移表である。長さ3以上の任意のビット列を左(上位ビット)から順に読み込んで最後が110で終わっているものを受理するには,どの状態を受理状態とすればよいか。
https://www.ap-siken.com/kakomon/18_aki/img/07.gif

1. a 2. b 3. c 4. d
平成18年秋期問7 有限オートマトンの状態遷移表|応用情報技術者試験.com

無効と有効の状態遷移をテストする状態遷移テストというものがあります。

  • 英語 : state transition testing

ブラックボックステストの設計技法の一つ。無効と有効の状態遷移を実行するテストケースを設計する。
JSTQBソフトウェアテスト標準用語集

状態遷移をテストするには状態の遷移を整理するために図と表を使用します。

状態遷移図は、発生する可能性のあるイベントとその結果の状態を図にしたものです。
  • 英語 : state diagram
  • 特徴
    • 「できること」を表現する
    • 状態遷移の流れを容易に把握できる
    • 図示することによって新たな発見がある
      • どこへの遷移もしない状態 / 複数の異なる状態に遷移するイベント
      • 状態遷移に関する仕様の不備にだって気がつく

コンポーネント又はシステムが取りうる状態を示し、ある状態から他への状態の変化の原因となる、(又は)その結果として生ずる、イベントや状況を表すダイアグラム。
JSTQBソフトウェアテスト標準用語集

A diagram that depicts the states that a system or component can assume, and shows the events or circumstances that cause or result from a change from one state to another.
IEEE 610Standard Glossary of Software Engineering Terminology

図はマルチタスクで動作するコンピュータにおけるタスクの状態遷移を表したものである。実行状態のタスクが実行可能状態に遷移するのはどの場合か。
https://www.fe-siken.com/kakomon/23_aki/img/20.gif

  1. 自分より優先度の高いタスクが実行可能状態になった。
  2. タスクが生成された。
  3. 入出力要求による処理が完了した。
  4. 入出力要求を行った。

平成23年秋期問20 タスクの状態遷移|基本情報技術者試験.com

f:id:ponsuke_tarou:20190402224738p:plain

状態遷移表は、発生する可能性のあるイベントと状態の組み合わせから生じる結果を示す遷移をテーブルで表したものです。
  • 英語 : state table
  • 無効な遷移と、有効な遷移の両方を示します。
  • 特徴
    • 「できないこと」を洗い出せる
    • 仕様があいまいな個所に潜む欠陥を発見できる
      • 全ての状態と全てのイベントを組み合わせるので、仕様のあいまいな個所を特定できる
    • 状態遷移図の不備を見つけることができる

次の表は,文字列を検査するための状態遷移表である。検査では,初期状態をaとし,文字列の検査中に状態がeになれば不合格とする。
解答群で示される文字列のうち,不合格となるものはどれか。ここで,文字列は左端から検査し,解答群中の△は空白を表す。
https://www.fe-siken.com/kakomon/18_haru/img/09.gif

ア. +0010 イ. -1 ウ. 12.2 エ. 9.△
平成18年春期問9 状態遷移表|基本情報技術者試験.com

f:id:ponsuke_tarou:20190402224451p:plain

図は,偶数個の1を含むビット列を受理するオートマトン状態遷移図であり,二重丸が受理状態を表す。a,bの正しい組合せはどれか。
https://www.ap-siken.com/kakomon/25_haru/img/03.gif
回答群
https://www.ap-siken.com/kakomon/25_haru/img/03a.gif
平成25年春期問3 オートマトンの状態遷移図|応用情報技術者試験.com
f:id:ponsuke_tarou:20190402225742p:plain

状態遷移図状態遷移表は、各メリットを合わせてお互いを見合わせながら整理することでテストケースを洗い出す事ができます。

状態遷移図では動作を想定しながら作るので「できること」に着目しがちですが、状態遷移表は状態とイベントを網羅的に組み合わせるので「できないこと」にも気が付けるのです。
性格が違うのだからどちらかあればいいってわけではないのですね。

f:id:ponsuke_tarou:20190402223808p:plain
この日の思い出

オートマトンは、入力から内部の状態と規則に従い結果を出力する仮想的な自動機械です。

  • 英語 : automaton

e-words.jp

入力と状態の数がある程度決まっているのが有限オートマトンです。

  • 別名 : 有限状態機械

有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である。
デジタル回路やプログラムの設計で使われることがあり、ある一連の状態をとったときどのように論理が流れるかを調べることができる。有限個の「状態」のうち1つの状態をとる。ある時点では1つの状態しかとらず、それをその時点の「現在状態」と呼ぶ。
何らかのイベントや条件によってある状態から別の状態へと移行し、それを「遷移」と呼ぶ。それぞれの現在状態から遷移しうる状態と、遷移のきっかけとなる条件を列挙することで定義される。
有限オートマトン - Wikipedia

図で表される有限オートマトンで受理される文字列はどれか。ここでhttps://blogs.c.yimg.jp/res/blog-fc-69/u_mana80/folder/555192/26/12834726/img_10?1472221498は初期状態を,https://www.fe-siken.com/kakomon/18_aki/img/11_2.gif受理状態を表す。
https://www.fe-siken.com/kakomon/18_aki/img/11.gif
ア 01011     イ 01111     ウ 10111     エ 11110
平成18年秋期問11 有限オートマトン|基本情報技術者試験.com
f:id:ponsuke_tarou:20190402232447p:plain

勉強のきっかけになった問題も状態遷移図を書いてみるとわかりやすいです。

f:id:ponsuke_tarou:20190402232736p:plain

f:id:ponsuke_tarou:20190402223714p:plain
いつかの思い出

次回の勉強内容

ponsuke-tarou.hatenablog.com

ページング方式におけるページインだけの処理の割合

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : ページング方式の基本用語を理解したい。

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

ページング方式の仮想記憶において,あるプログラムを実行したとき,1回のページフォールトの平均処理時間は30ミリ秒であった。ページフォールト発生時の処理時間が次の条件であったとすると,ページアウトを伴わないページインだけの処理の割合は幾らか。

ページフォールト発生時の処理時間〕
(1) ページアウトを伴わない場合,ページインの処理時間は20ミリ秒である。
(2) ページアウトを伴う場合,置換えページの選択,ページアウト,ページインの合計処理時間計60ミリ秒である。

  1. 0.25
  2. 0.33
  3. 0.67
  4. 0.75

平成28年春期問17 ページインだけの処理の割合|応用情報技術者試験.com

f:id:ponsuke_tarou:20190401194116p:plain
いつかの思い出

ページング方式とは、メモリ領域をページと呼ばれる一定の大きさの領域に分割し、物理的なアドレスとは別に仮想的なアドレスを割り当てて管理する方式です。

物理メモリが不足した時にOSさんは、ハードディスクの一部をメモリっぽく使用してくれます。
それが仮想メモリです。仮想メモリはハードディスクにスワップファイルという専用領域を造ります。

$ cd /var/vm/  #<<< Mac OSはここにスワップファイルを作ります。
$ ls -l
total 8388608
-rw------T  1 root  wheel  1073741824  3 31 22:05 sleepimage
-rw-------  1 root  wheel  1073741824  2 20 00:06 swapfile0 # <<< スワップファイル
-rw-------  1 root  wheel  1073741824  3 10 21:57 swapfile2
-rw-------  1 root  wheel  1073741824  3 31 21:48 swapfile3

ページング方式の仮想記憶を使うとプログラムやデータを不連続な主記憶に割り付けることができます。

細切れのメモリ空間を連結して一つの連続した空間として利用したり、補助記憶装置(ハードディスクなど)上にも仮想的なメモリ領域を確保することで、物理メモリの容量を超えてメモリ空間を利用することができます。

f:id:ponsuke_tarou:20190401204406p:plain
どこかの思い出

仮想アドレスと物理アドレスマッピングを格納するページテーブルを使って管理します。

ページング方式では、OSさんが仮想アドレスと物理アドレスマッピングを格納するページテーブルを使って物理メモリと仮想メモリを管理してくれます。
ここで、仮想メモリはページ単位なのに物理メモリが違う大きさで管理されていると行き来が大変なので、ページと同じ大きさのカタマリで管理します。
この物理メモリのカタマリをページフレームとか物理ページとかフレームとかっていいます。

管理するために同じサイズにデータを分割した1つ1つがページです。

https://wa3.i-3-i.info/img/data/3300/d003352-8.pnghttps://wa3.i-3-i.info/img/data/3300/d003352-9.pnghttps://wa3.i-3-i.info/img/data/3300/d003352-10.png
https://wa3.i-3-i.info/word13352.html

f:id:ponsuke_tarou:20190401200151p:plain
あの日の思い出

アクセスしようとした領域が物理メモリではなく仮想メモリにある場合に発生する割り込み処理をページフォールトといいます。

  • 英語 : page fault

ページング方式の仮想メモリにおいて、プロセスがアクセスしようとしたページが物理メモリ上に無く、仮想メモリにあるときに仮想メモリを管理する制御装置が発する例外あるいは割込処理をページフォールトといいます。
このページフォルトは、エラーっぽい名前だけれどとかでとか来た時に表示される通知やお知らせ的な存在です。
そのページフォルトをOSさんが検知して物理メモリに必要なページを読み込んでくれます。

f:id:ponsuke_tarou:20190401200306p:plain
ぬのたき

リストラ的にページフレームを追い出すことをページアウトといいます。

ページング方式では「プロセスが使ってる部分は物理メモリ、使ってない部分は仮想メモリを使う」「仮想メモリはページというカタマリで使われていく」、そして「使ってなかった部分を使うときは仮想メモリから物理メモリを使うようにする」ことがわかりました。
が、物理メモリが空いていればいいけど、空いていなかったらどうするんだろう?

物理メモリが空いていなかったら、どれかのページを追い出すんです!
どのページフレームを追い出すかってのはアルゴリズムによって違います。

逆にデビュー的にページをページフレームに読み込むことをページインとかスワップインといいます。

f:id:ponsuke_tarou:20190401202233p:plain
この日の思い出

次回の勉強内容

ponsuke-tarou.hatenablog.com

SQLインジェクション

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : SQLインジェクションの対策を学ぶ

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

SQLインジェクション対策について,Webアプリケーションの実装における対策とWebアプリケーションの実装以外の対策として,ともに適切なものはどれか。
https://www.sc-siken.com/kakomon/28_aki/img/17.gif
情報セキュリティスペシャリスト 平成28年秋期 午前Ⅱ 問17

SQLインジェクションとは、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。

  • 別名 : ダイレクトSQLコマンドインジェクション, SQL注入
  • 英語 : SQL injection(注入,投入)

https://blogs.mcafee.jp/wp-content/uploads/2018/06/sqlinjection-1.jpg
https://blogs.mcafee.jp/wp-content/uploads/2018/06/sqlinjection-2.jpg
SQLインジェクション攻撃への対策|脆弱性を悪用する仕組みと具体例

https://www.scutum.jp/information/web_security_primer/images/web_security_primar_ph_05.gif
【2】SQLインジェクションによる顧客情報流出 ― 不正アクセスの横綱!| Webサイトセキュリティ対策入門 by WAF「Scutum」プロジェクト

対策 : SQLを埋め込むところで特殊文字を適切にエスケープ

'    →  ''
\   →  \\
今夜分かるSQLインジェクション対策:Security&Trust ウォッチ(42) - @IT

入力値で仕込んでデータが再利用されたときに効力を発揮するセカンドオーダーSQLインジェクション

たとえアプリケーションが常にシングルクオートをエスケープしていても、 攻撃者はなおも、データベース中のデータがそのアプリケーションで再利用さ れるときにSQLをインジェクトすることができます。

  • 例えば・・・
    1. 攻撃者がアプリケーションに登録して、ユーザ名「admin'--」、 パスワード「password」のユーザ名を作る
    2. アプリケーションはシングルクオートを正しくエスケープして、INSERT文が作られる
      • insert into users values ( 123, 'admin''--', 'password', 0xffff)
    3. 攻撃者がパスワードを変更する
      • update users set password = '" + newpassword + "’ where username = '" + rso ( "admin'--") + "'"
    4. 最初にせっかくエスケープしたのに次には・・・・されず・・・クエリが生成される
      • update users set password = 'password' where username = 'admin'--'
    5. 攻撃者は、admin'-- というユーザを登録することによって、admin のパスワードを自由にセットできる

https://image.itmedia.co.jp/ait/articles/0611/02/r20_42_01.gif
今夜分かるSQLインジェクション対策:Security&Trust ウォッチ(42) - @IT

対策 : データベースでのアクセス権は最小限に留める

不正なSQLがWebアプリから送られても最小限のアクセス権だけを与えることで被害を軽減できます。

シングルクオーテーションを使わないSQLインジェクション

SQLインジェクション対策というと、「'」の扱いばかりが注目されるが、「'」を使わなくても成立する攻撃もあります。

  • 例えば・・・
    1. SELECT name FROM user where uid = '$uid' AND age > $age
    2. 渡される$uidと$ageの特殊文字は、適切にエスケープ!が、こんなものがきたら・・・
      • $uid:ueno
      • $age:31 UNION…
    3. SELECT name FROM user where uid = ' ueno ' AND age > 31 UNION……
    4. UNION以降のSQLも実行されてしまう・・・
    5. 対策 : 問題は、ageの値をシングルクオーテーションで囲う
      • SELECT name FROM user where uid = '$uid' AND age > '$age'

対策 : SQLプレースホルダを利用する

プレースホルダとは、ユーザ入力をもとに生成される部分に特殊文字を使用したSQL文中のひな形を用意し、その変数部分には実行時に値を割り当てる仕組みです。

PHPの場合 : $1と$2がプレースホルダ
PHPでのSQLインジェクション対策 - プレースホルダ編 | Let's Postgres

$res = pg_query_params(
  $dbconn,
  'UPDATE users SET profile = $1 WHERE userid = $2',
  array($_REQUEST['profile'], $_SESSION['me']['userid'])
);

Javaの場合 : ?がプレースホルダ
安全なSQLの呼び出し方 - Qiita

PreparedStatement prep = conn.prepareStatement("SELECT * FROM employee WHERE name=?");
prep.setString(1, "山田");

マルチバイト文字の問題

  • 例えば・・・入力値「\x97' OR A=A」をエスケープ処理すると「予' OR A=A」になる
    1. 「\x97' OR A=A」の「'」を「\'」とエスケープして処理する
      • \x97' > \x97\' (「\x97」だけでは意味をなさない)
    2. 「\'」の部分をエンコードする
      • \x97\' > \x97\x5C\x27 > \x97\x5C(予)\x27( ' ) > 予'
    3. 結果としてエスケープ処理すると「予' OR A=A」となり「'」を「\'」とエスケープしたが、「'」が残ってしまう

シフトJISは2バイト文字ですが、2バイト目に1バイト文字の文字コードを含んだ文字もあります。

  • \x94\x5C → 能
  • \x95\x5C → 表
  • \x96\x5C → 暴

「'」を「''」とエスケープしている場合にも同様の現象が起きる可能性がある。

対策 : クライアント側の文字コードシフトJISを使うのをやめてEUC-JPなどを使う

文字コードを変更できない場合の対策
  • 半端な1バイト文字を受け付けない処理を書く
  • マルチバイトを扱う関数を通して、文字コードを整理
// PHPの場合
// mb_convert_encoding — 文字エンコーディングを変換する
/* SJISエンコーディングからSJISに変換 */
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

f:id:ponsuke_tarou:20190331221754j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

パイブライン処理での危険がパイブラインハザード

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : パイブライン処理での危険を学ぶ

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

パイプライン方式のプロセッサにおいて,パイプラインが分岐先の命令を取得するときに起こるハザードはどれか。

  1. 構造ハザード
  2. 資源ハザード
  3. 制御ハザード > 正解
  4. データハザード

平成26年秋期問7 分岐命令で発生するハザード|応用情報技術者試験.com

パイブラインハザードは、パイプライン処理を止めたりやり直さなければならなくなり効率が悪くなることです。

  • 英語 : pipeline hazard

マイクロプロセッサ(MPU/CPU)のパイプライン処理で発生する問題の一つです。

そもそもハザードとは、危険の原因・危険物・障害物などを意味する英語です。

  • 英語 : hazard

https://resilient-medical.com/wp-content/uploads/2018/05/hazard1-600x450.jpg
https://resilient-medical.com/risk/hazard

ハザードの種類は、原因によって分けられます。

制御ハザードは、分岐命令によって先取りした命令が無駄になることです。

  • 別名 : 分岐ハザード
  • 例えば・・・
    • 条件分岐で実行の流れが二つに分かれる場合、条件の評価を待たずに先行して片方の分岐の命令群をパイプラインに投入することになるが、条件を評価した結果もう一方に分岐することが確定した場合、パイプラインの内容を破棄して正しい分岐の命令群を投入しなおさなければならない。
    • 分岐命令を実行した場合、次に実行される命令は、分岐が成立した場合と不成立の場合の2通りがある。分岐が成立しないと仮定して命令を先取りすると、分岐が成立した場合に先取りした命令をキャンセルし、改めて分岐が成立した場合の命令を実行しなければならない。

制御ハザードによって先取りした命令のキャンセルが発生し、ムダになったクロック*1のことをインターロック*2もしくはストール*3という。

http://security2600.sakura.ne.jp/main2/image3/hazard1.jpg
パイプラインハザード - Security Akademeia

解決方法
  • 分岐先が判明するまで先取りしない
  • 常に分岐が不成立(あるいは成立)と仮定して先取りを進める
  • 場合によってはストールが起こることを容認する。

f:id:ponsuke_tarou:20190315214631p:plain
飛鳥山公園

データハザードは、命令が直前の命令の実行結果を使用する場合に発生します。

ある命令が直前の命令の処理結果を利用するような場合に、実行結果を待たなければパイプラインが進められない状況が発生します。

http://security2600.sakura.ne.jp/main2/image3/hazard2.jpg
パイプラインハザード - Security Akademeia

https://image.slidesharecdn.com/sample-150315081741-conversion-gate01/95/cpu-16-638.jpg?cb=1449891681
CPUの同時実行機能

解決方法
  • NOP命令を挿入する
  • データハザードを検知したら実行結果を次の命令に直接たわしてしまう
    • 演算装置によってハードウェア的に実現される

構造ハザードは、CPU内部の資源の衝突によって発生します。

複数の命令をパイプラインで並行に処理する過程で、同じタイミングで同じハードウェア資源にアクセスしようとするなど競合が発生し、処理がつっかえることがあります。

  • 例えば・・・
    • 命令Aがメモリへの書込を行っているのと同じタイミングで後続の命令Bがメモリの読込をしようとするとメモリアクセスがバッティングします。バッティングしないようにするために命令Bは1クロック処理を遅らせる必要があります。これにより1クロック分遅延します。

https://news.mynavi.jp/article/architecture-124/images/002.gif
https://news.mynavi.jp/article/architecture-124/images/003.gif
コンピュータアーキテクチャの話(124) パイプライン処理と構造的ハザード | マイナビニュース

http://memes.sakura.ne.jp/memes/wp-content/uploads/2012/03/risc_contention.png
http://memes.sakura.ne.jp/memes/wp-content/uploads/2012/03/risc_hazard.png
マイコンの構造と処理3 – ミームス(MEMEs)のサポートページ

解決方法
  • ハードウェア的に回避することは可能。
    • しかし完全に構造ハザードを起こさない構成はコストの上昇を招く。
    • 構造ハザードの確率が低ければ、コスト上昇を抑えるために、多少の構造ハザードを無視するのが現実的である。

f:id:ponsuke_tarou:20190315003545p:plain
思い出の一枚

次回の勉強内容

勉強中・・・

*1:CPUの動作基準となる時間の単位で、このクロックの整数倍の時間をかけて命令を実行していきます。命令パイプライン中の1ステージの実行には最低1クロックかかるので、4ステージ構成の命令パイプラインでは、1個の命令を実行完了するためには、最低でも4クロックの時間が必要となります。CPUをはじめとしたコンピュータの各回路は、一定の時間で刻まれるクロック信号に歩調を合わせながら処理を行っています。 このクロック信号は、非常に正確な時間間隔でパルス(非常に短い時間の間だけ変化する電流)を発生する水晶発振器によって生成されます。

*2:安全装置・安全機構の考え方の一つで、ある一定の条件が整わないと他の動作ができなくなるような機構のこと。

*3:命令パイプラインでは、除算命令のように命令の処理完了に長い時間がかかる場合、パイプラインに次の命令を取り込むのを待つ必要がある。この問題の解決策としてパイプラインの各段階が忙しいことを示せるようにして、パイプラインをインターロックして次の命令がステップを進まないように止めなければならない。これがストールであり、分岐のように中断以前の処理が無駄になる場合にはストールに加えて無駄となった処理時間分も加わり、これらがインターロックのロスとなる。

パイプライン処理の基本を学ぶ

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : パイプライン処理の基本を学ぶ

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

スーパスカラの説明として、適切なものはどれか。

  1. 処理すべきベクトルの長さがベクトルレジスタより長い場合、ベクトルレジスタの組に分割して処理を繰り返す方式である。
  2. パイプラインを更に細分化することによって、高速化を図る方式である。
  3. 複数のパイプラインを用い、同時に複数の命令を実行可能にすることによって、高速化を図る方式である。
  4. 命令語を長く取り、一つの命令で複数の機能ユニットを同時に制御することによって、高速化を図る方式である。

必ず受かる情報処理技術者試験-平成24年度春季-応用情報技術者-問題・解答11

パイプライン処理とは、マイクロプロセッサの高速化手法の一つです。

プロセッサ内での命令処理は、複数の段階を順次行います。

  • 処理の段階
    1. 命令の読み込み(フェッチ)
    2. 解釈(デコード)
    3. 実行(エグゼキュート)
    4. 結果の書き込み(ライトバック)

通常は、前の命令のサイクルが完全に終わらないと、次の命令を処理し始めることはできません。

http://mt-net.vis.ne.jp/images/501/FE2000S_18_a1.gif
パイプライン処理 [徹底研究!情報処理試験]

パイプライン処理は、各段階の処理を独立して動作させることで、前の命令のサイクルが終わる前に次の命令を処理し始められます。

http://mt-net.vis.ne.jp/images/501/FE2000S_18_a2.gif
パイプライン処理 [徹底研究!情報処理試験]

パイプライン処理には種類があります。

命令の処理を独立して実行できる工程に分割するのが、命令パイプラインです。
  • 英語 : pipeline processing

https://image.slidesharecdn.com/kagamicomput201514-150713021412-lva1-app6892/95/kagamicomput201514-14-638.jpg?cb=1436753672
kagami_comput2015_14

レンダリング処理の高速化に特化しているのが、グラフィックスパイプラインです。

3次元コンピュータグラフィックスで、3次元から2次元のデータを作る多段階の過程全体をパイプライン処理によって高速化しています。

https://game.watch.impress.co.jp/img/gmw/docs/590/700/ps_42_s.gif
西川善司の3Dゲームファンのための「プレイステーション 4」グラフィックス」講座(後編) - GAME Watch

命令パイプラインによる並列化と同じ方法でループ処理を最適化するのが、ソフトウェアパイプラインです。

アウト・オブ・オーダー実行*1に似ているものの、命令の並べ替えがCPU ではなくコンパイラで 行われる点に違いがあります。

http://my-web-site.iobb.net/~yuki/wp-content/uploads/2017/06/200612_dsp04_pipe.jpg
TI C64x DSPによる画像認識の最適化実装 | ある計算機屋さんの手帳

スーパースカラは、複数のパイプラインで並列に命令を処理できるようにする機構です。

並列実行可能な複数の命令を,複数の演算器(パイプライン)に振り分けることによって並列に実行する。
平成31年春期問8 スーパスカラの説明はどれか|応用情報技術者試験.com

https://ascii.jp/elem/000/000/555/555472/fig1_c_740x500.jpg
https://ascii.jp/elem/000/000/555/555471/

https://image.itmedia.co.jp/edn/articles/1702/24/tt170224MCUQA35_001.jpg
スーパースカラって何? (1/3) - EDN Japan

スーパーパイプラインは、パイプラインの段階を細分化して多くすることで並走できる命令数を増やします。

http://www.myelq.com/Glossary/Images/superpipeline.gif
スーパーパイプライン

https://img.atwikiimg.com/www38.atwiki.jp/hiropknot/attach/69/47/%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3.gif
コンピュータ構成要素 - hiropknot @ ウィキ - アットウィキ

http://www.ap-siken.com/kakomon/27_haru/img/09.gif
http://semirara.sota1235.net/general/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B9%E3%82%AB%E3%83%A9

f:id:ponsuke_tarou:20190314233906p:plain
パイプライン制御方式
f:id:ponsuke_tarou:20190314231009p:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

*1:コンピュータのプロセッサー(CPU)が命令を処理するとき、規定の順番(操作手順)を守らないで実行するやりかた。命令を一時的に溜めておき、命令を細分化してできる作業から実行する方式。メリット:無駄な待ち時間が発生しないのでの作業を高速化できる。デメリット:作業の分割など手間のかかる作業が増えるので、処理工程は複雑になる

Dos攻撃とDDos攻撃はサーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

マルチベクトル型DDoS攻撃に該当するものはどれか。

  1. 攻撃対象のWebサーバ1台に対して,多数のPCから一斉にリクエストを送ってサーバのリソースを枯渇させる攻撃と,大量のDNS通信によってネットワークの帯域を消費させる攻撃を同時に行う。
  2. 攻撃対象のWebサイトのログインパスワードを解読するために,ブルートフォースによるログイン試行を,多数のスマートフォンやIoT機器などの踏み台から成るボットネットから一斉に行う。
  3. 攻撃対象のサーバに大量のレスポンスが同時に送り付けられるようにするために,多数のオープンリゾルバに対して,送信元IPアドレスを攻撃対象のサーバのIPアドレスに偽装した名前解決のリクエストを一斉に送信する。
  4. 攻撃対象の組織内の多数の端末をマルウェアに感染させ,当該マルウェアを遠隔操作することによってデータの改ざんやファイルの消去を一斉に行う。

情報処理安全確保支援士平成30年秋期 午前Ⅱ 問4

Dos攻撃DDos攻撃は、サーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。

1つのIPアドレスから攻撃を仕掛けるのが、Dos攻撃です。

  • 英語 : Denial(否定・拒絶) of Service attack
  • 日本語 : サービス拒否攻撃
F5アタックは、一人でF5ボタンを押下し続ける寂しい攻撃です。

ブラウザでF5を押すと、画面をリロードしてくれます。しかもキャッシュ保存せずに。
なので、画面のデータを全部サーバへ要求します。
そしてF5を猛烈に連打するとサーバに負荷をかけることができます。

複数のIPアドレスから攻撃を仕掛けるのが、DDos攻撃です。

  • 英語 : Distributed(分散型の) Denial of Service attack
  • 日本語 : 分散型サービス拒否攻撃

https://www.nttpc.co.jp/service/ddos/img/img_index_03.jpg
DDoS対策サービス|ソリューション・サービス|【公式】NTTPC

DDos攻撃では、ボットネットが使われます。

外部からの遠隔操作に従って処理を実行するプログラムがボットです。それがたくさん集まったのがボットネットです。
残念ながら、自分のパソコンやスマホにボットが入ってしまうとDDos攻撃の加害者となります。

https://eset-info.canon-its.jp/files/user/malware_info/images/threat/150120_3/images/img01.jpg
ボットネットとは何か? どうやって防ぐのか? | サイバーセキュリティ情報局

ボットネットを遠隔操作するために指令を送ったり制御するサーバーが、C&Cサーバーです。
  • 英語 : Command and Control server

https://eset-info.canon-its.jp/files/user/malware_info/images/term/sa/images/171_1.jpg
C&Cサーバー | サイバーセキュリティ情報局

Miraiは、ランダムなIPアドレスを生成してtelnetポートにログインを試行し工場出荷時の弱いパスワードを使っているIoT機器などに感染を広げるとともにC&Cサーバからの指令に従って標的に対してDDoS攻撃を行うマルウェアです。
  • 読み方: ミライ

https://image.itmedia.co.jp/tf/articles/1704/13/tfayagi_mirai1704_fig01.jpg
IoTデバイスを狙うマルウェア「Mirai」とは何か――その正体と対策:超速解説 Mirai - TechFactory

感染した端末上でIPアドレスをランダムに走査し、新たな標的を見つけます。そして、工場出荷時のデフォルト値や単純なID/パスワードの組みによる辞書攻撃によって、標的IoT端末のtelnetポートへのログインを試みます。この動作を繰り返して、ボットネットを拡大していきます。Miraiが構築したボットネットは、過去最大級の規模のDDoS攻撃を引き起こしています。
情報処理安全確保支援士平成30年秋期 午前Ⅱ 問11

攻撃には、「フラッド型」「脆弱性」「マルチベクトル型」があります。

フラッド型は、大量データを送りつけて処理しきれなくなるようにします。

https://tech.nikkeibp.co.jp/it/article/COLUMN/20070307/264106/zu01.jpg
サービス妨害攻撃 --- DoS,DDoS,smarf,SYNフラッド,DNS amp | 日経クロステック(xTECH)

脆弱性は、脆弱性を利用して不正処理を行わせサービス機能を停止させます。

WAFは、Webアプリケーションの脆弱性を狙う攻撃を遮断するファイアウォールです。

ponsuke-tarou.hatenablog.com

マルチベクトル型は、複数の手法を組み合わせます。

攻撃対象のWebサーバ1台に対して多数のPCから一斉にリクエストを送って「サーバのリソースを枯渇させる」攻撃と大量のDNS通信によって「ネットワークの帯域を消費させる攻撃」を同時に行います。

https://businessnetwork.jp/Portals/0/Data/2019/02/22/A10_3.jpg?11915105630126
A10が機械学習でDDoS防御を自動化、追加ライセンスは不要で(ページ2) | ビジネスネットワーク.jp

f:id:ponsuke_tarou:20201001203726j:plain
那須岳朝日岳

OSI参照モデルネットワーク層トランスポート層が攻撃に使われやすいです。

第7層 アプリケーション層
第6層 プレゼンテーション層
第5層 セッション層
第4層 トランスポート層 <- 反射型DDoS攻撃 / DNSリフレクタ攻撃
第3層 ネットワーク層 <- ICMP Flood攻撃
第2層 データリンク層
第1層 物理層

反射型DDoS攻撃は、トランスポート層DNSサーバやNTPサーバを反射に使ってパケットを増幅させる攻撃です。

  • 別名 : リフレクション攻撃、DrDoS攻撃(Distributed Reflection Denial of Service attack)
UDPの性質を悪用したDDoS攻撃DNSリフレクタ攻撃があります。
  • 別名 : DNSアンプ攻撃

反射に利用されるサーバ(リフレクター)の特徴

  • UDPを使用している >> TCPに比べてIPアドレスを詐称しやすい
  • 問い合わせよりも応答の方が大きい >> 攻撃の効率が上がる

これらの特徴に合うのが、DNSサーバやNTPサーバです。

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

https://jprs.jp/glossary/imgs/reflection.png
JPRS用語辞典|DNSリフレクター攻撃(DNSアンプ攻撃)

ICMP Flood攻撃は、ネットワーク層のICMPを利用して回線を過負荷にさせる攻撃です。

ICMP Flood攻撃に該当するものはどれか。
答. pingコマンドを用いて大量の要求パケットを発信することによって,攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害する。
https://www.sc-siken.com/kakomon/27_aki/img/10.gif
情報セキュリティスペシャリスト平成27年秋期 午前Ⅱ 問10

f:id:ponsuke_tarou:20190313221021j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

メッセージカードコレクション2019春

1. 葉っぱ

f:id:ponsuke_tarou:20190220200446j:plain

2. あなたを考えています

f:id:ponsuke_tarou:20190220200514j:plain

3. 黒い花

f:id:ponsuke_tarou:20190220200544j:plain

4. 花と蝶

f:id:ponsuke_tarou:20190220200615j:plain

5. 花と鳥

f:id:ponsuke_tarou:20190220200701j:plain

6. 花とモルモット

f:id:ponsuke_tarou:20190220200737j:plain

7. 花とうさぎ

f:id:ponsuke_tarou:20190220200822j:plain

8. カラー

f:id:ponsuke_tarou:20190220201045j:plain

10. バラ

f:id:ponsuke_tarou:20190220201155j:plain

12. どシンプル

f:id:ponsuke_tarou:20190220201310j:plain

シール

f:id:ponsuke_tarou:20190220201224j:plain

Laravelのプロジェクトを作ってみる。

  • 環境
    • macOS Mojave version10.14.3
    • PHP 7.3.1
    • Composer version 1.8.0

Laravelは、ただで使えるMVCのWeb開発用フレームワークです。

laravel.com

Laravelをインストーラを使わないでインストールします。

readouble.com

Composer Create-Projectでインストールします。

$ composer create-project --prefer-dist laravel/laravel {プロジェクトの名前}
コマンドの説明です。

利用可能なリポジトリにある既存のパッケージを複製して自身のパッケージにしたい(パッケージをフォークしたい)
$ composer create-project [vendor]/[package]

qiita.com

prefer-distオプション
GitHubなどでリポジトリを配信している場合、git cloneでソースを落としてくる(prefer-source)か、zipでダウンロードする(prefer-dist)か選ぶことができます。
通常、prefer-distでダウンロードしたほうが高速です。ただ、アクセストークンなどの認証情報をセットしておく必要があるので、設定できてない人はうまく動かないかもしれません。
そのためか、composerはprivateリポジトリの場合、デフォルトでgit cloneしようとします。
この挙動を変更してzipダウンロードを強制するのが --prefer-dist オプションで、 composer install --prefer-dist などのように使います。
blog.tojiru.net

$ composer create-project --prefer-dist laravel/laravel tryPhp
Installing laravel/laravel (v5.7.19)
  - Installing laravel/laravel (v5.7.19): Loading from cache
Created project in tryPhp
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 86 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.10.0): Loading from cache
  - Installing vlucas/phpdotenv (v2.6.1): Loading from cache
  - Installing symfony/css-selector (v4.2.3): Loading from cache

# 省略

laravel/framework suggests installing pusher/pusher-php-server (Required to use the Pusher broadcast driver (^3.0).)
laravel/framework suggests installing symfony/dom-crawler (Required to use most of the crawler integration testing tools (^4.1).)
laravel/framework suggests installing symfony/psr-http-message-bridge (Required to psr7 bridging features (^1.0).)
lcobucci/jwt suggests installing mdanter/ecc (Required to use Elliptic Curves based algorithms.)
psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.)
psy/psysh suggests installing hoa/console (A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit.)
filp/whoops suggests installing whoops/soap (Formats errors as SOAP responses)
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.6.0)
phpunit/phpunit suggests installing phpunit/php-invoker (^2.0)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/nexmo-notification-channel
Discovered Package: laravel/slack-notification-channel
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
> @php artisan key:generate --ansi
Application key set successfully.

# バージョン確認します.
$ php artisan -V
Laravel Framework 5.7.26

# 作成されたLaravelプロジェクトのディレクトリ構成を見てみます.
$ find tryPhp/ -type d
tryPhp/
tryPhp//database  # データベースのマイグレーションとモデルファクトリ、初期値設定(シーディング)が格納される
tryPhp//database/migrations
tryPhp//database/seeds
tryPhp//database/factories
tryPhp//bootstrap  # フレームワークの初期処理を行うapp.phpファイルが格納される
tryPhp//bootstrap/cache  # 初期処理のパフォーマンスを最適化するため、フレームワークが生成するルートやサービスのキャッシュファイルが保存される
tryPhp//app   # アプリケーションのコアコードを格納するディレクトリ
tryPhp//app/Providers
tryPhp//app/Exceptions
tryPhp//app/Http # コントローラ、ミドルウェア、フォームリクエストを設置します。アプリケーションへのリクエストを処理するロジックは、ほぼ全てこのディレクトリ内に設置します。
tryPhp//app/Http/Middleware
tryPhp//app/Http/Controllers
tryPhp//app/Http/Controllers/Auth
tryPhp//app/Console # アプリケーションの全カスタムArtisanコマンドで構成します。これらのコマンドクラスはmake:commandコマンドにより生成されます。
tryPhp//config    # アプリケーションの全設定ファイルが格納される
tryPhp//resources   # ビューやアセットの元ファイル(LESS、SASS、JavaScript)で構成され、すべての言語ファイルも格納される
tryPhp//resources/js
tryPhp//resources/js/components
tryPhp//resources/lang
tryPhp//resources/lang/en
tryPhp//resources/sass
tryPhp//resources/views
tryPhp//tests
tryPhp//tests/Unit
tryPhp//tests/Feature
tryPhp//storage  # コンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークにより生成されるファイルが保存される
tryPhp//storage/app  # アプリケーションにより生成されるファイルを保存するために利用
tryPhp//storage/app/public  # プロファイルのアバターなどのようなユーザーにより生成され、外部からアクセスされるファイルが保存される
tryPhp//storage/framework  # フレームワークが生成するファイルやキャッシュに利用
tryPhp//storage/framework/cache
tryPhp//storage/framework/cache/data
tryPhp//storage/framework/testing
tryPhp//storage/framework/sessions
tryPhp//storage/framework/views
tryPhp//storage/logs   # アプリケーションのログファイルが保存される
tryPhp//public   # アプリケーションへの全リクエストの入り口となり、オートローディングを設定するindex.phpファイルが格納される
tryPhp//public/svg
tryPhp//public/css
tryPhp//public/js
tryPhp//routes
tryPhp//vendor  # Composerによる依存パッケージが配置される
# 省略

readouble.com

動かして画面を見てみます。

# 開発サーバをhttp://localhost:8000として起動します。
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>

http://localhost:8000/にブラウザでアクセスするとLaravelの画面が表示されました。
f:id:ponsuke_tarou:20190219230855p:plain

PHPにはビルトインウェブサーバーというテスト用の開発サーバがくっついています。
# php -Sのコマンドでもphp artisan serveと同じように動作します。
$ php -S localhost:8000 -t public
PHP 7.3.1 Development Server started at Tue Feb 19 23:12:16 2019
Listening on http://localhost:8000
Document root is /Users/mana/Dropbox/ApacheDcumentRoot/tryPhp/public
Press Ctrl-C to quit.

ディレクトパーミッションを設定します。

Laravelをインストールした後に、多少のパーミッションの設定が必要です。storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください。設定しないとLaravelは正しく実行されません。
インストール 5.7 Laravel

$ cd tryPhp/

# 権限を確認します
$ ls -l | grep storage
drwxr-xr-x@  5 mana  staff     160 12 15 23:37 storage

$ ls -l bootstrap/
total 8
-rw-r--r--@ 1 mana  staff  1620 12 15 23:37 app.php
drwxr-xr-x@ 5 mana  staff   160  2 19 22:24 cache

# 書き込み権限を追加する
$ chmod o+w storage/
$ chmod o+w bootstrap/cache/

# 権限を確認します
$ ls -l | grep storage
drwxr-xrwx@  5 mana  staff     160 12 15 23:37 storage

$ ls -l bootstrap/
total 8
-rw-r--r--@ 1 mana  staff  1620 12 15 23:37 app.php
drwxr-xrwx@ 5 mana  staff   160  2 19 22:24 cache

www.atmarkit.co.jp

f:id:ponsuke_tarou:20190219234237j:plain
思い出の一枚

サービスマネジメントシステムの規格はJIS Q 20000です。

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : JIS Q 20000って何?

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

ITサービスマネジメントの情報セキュリティ管理プロセスに対して,JIS Q 20000-1(サービスマネジメントシステム要求事項)が要求している事項はどれか。

ア. CMDBに記録されているCIの原本を,セキュリティが保たれた物理的又は電子的に格納庫で管理しなければならない。
イ. 潜在的な問題を低減させるために,予防処置をとらなければならない。
ウ. 変更要求が情報セキュリティ基本方針及び管理策に与える潜在的影響を評価しなければならない。
エ. 変更要求の受入れについての意思決定では,リスク,事業利益及び技術的実現可能性を考慮しなければならない。

https://www.sc-siken.com/kakomon/28_haru/am2_24.html

ITサービスマネジメントは、ITシステムによる利用者が必要とするサービス提供を管理することです。

  • 英語 : IT Service Management
  • 略称 : ITSM
  1. ITシステムを開発・運用することが業務の主目的になりがち・・・
    • 利用者視点が不足してしまい、ユーザーの満足度向上に課題になってしまう
  2. だから、利用者視点でITサービスの提供を考える <<< ITサービスマネジメント
    • ITシステムの開発・運用は、ITサービスを提供するための手段
    • ビジネス環境や情報技術の変化に合わせて改善を続けていく

ITサービスマネジメントにおける成功事例体系化した書籍群をITILといいます。

  • 英語 : Information Technology Infrastructure Library
サービスの企画・構築・運用というシステムライフサイクルに沿って、5つのカテゴリに分類されています。
  • サービス・ストラテジ
  • サービス・デザイン
  • サービス・トランジション
  • サービス・オペレーション
  • 継続的なサービス改善

http://104.215.0.91/wp-content/uploads/2016/10/itil.png
ITILとは – システム管理者なら押さえておきたい、ITIL用語解説 | ITサービス管理ソリューション「SmartStage|スマートステージ」

http://www.itsmf-japan.org/aboutus/images/itil-1-2017.png
ITILとは - itSMF Japanオフィシャルサイト

https://image.itmedia.co.jp/im/articles/0803/17/l_image02.jpg
ITIL V3はV2からどこが変わったか (1/3) - ITmedia エンタープライズ

ISO/IEC 20000は、ITサービスマネジメントシステムに関する国際規格です。

https://www.jqa.jp/service_list/management/service/iso20000/img/index_img01.gif
概要 | ISO/IEC 20000(ITサービス) | ISO認証 | 日本品質保証機構(JQA)

https://image.itmedia.co.jp/im/articles/0707/18/r4image01.jpg
IT管理のあるべき姿とISO 20000 (2/3) - ITmedia エンタープライズ

ISO/IEC 20000の日本版が、JIS Q 20000です。

JIS Q 20000は、2部構成になっています。

JIS Q 20000-1は、サービス提供者に対する要求事項が定義されています。
  • サービスマネジメントシステムの一般要求事項
    • 経営者の責任 / 他の関係者が運用するプロセスのガバナンス / 文書の運用管理 / 資源の運用管理 / SMS の確立及び改善
  • 新規サービス又はサービス変更の設計及び移行
    • 一般 / 新規サービス又はサービス変更の計画 / 新規サービス又はサービス変更の設計及び開発 / 新規サービス又はサービス変更の移行
  • サービス提供プロセス
    • サービスレベル管理 / サービスの報告 / サービス継続及び可用性管理 / サービスの予算業務及び会計業務 / 容量・能力管理
    • 情報セキュリティ管理 : 以下を特定するために変更要求を評価しなければならない
      • 新たな情報セキュリティリスク、又は変化した情報セキュリティリスク
      • 既存の情報セキュリティ基本方針及び管理策への潜在的影響
  • 関係プロセス
    • 事業関係管理 / 供給者管理
  • 解決プロセス
    • インシデント及びサービス要求管理
    • 問題管理 : 潜在的な問題を低減させるために,予防処置をとらなければならない。
  • 統合的制御プロセス
    • 構成管理 : CMDBに記録されているCIの原本を,物理的又は電子的にセキュリティが保たれた書庫で管理しなければならない。
    • 変更管理 : 変更要求の受入れについての意思決定では,リスク,事業利益及び技術的実現可能性を考慮しなければならない。
    • リリース及び展開管理
JIS Q 20000-2は、実践のための規範が定義されています。

f:id:ponsuke_tarou:20190219195334j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

YAMLって何?

YAMLは、データ構造の書き方です。

  • 正式名称 : YAML Ain't a Markup Language(「Markup Language」と書いてあってもマークアップ言語ではありません)
  • 読み方 : ヤムル
  • 拡張子 : .yaml

JSONと同様にYAMLはキーと値を持つが、日付や時刻を始めとして、JSONよりも多くのデータ型を処理する。
https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

e-words.jp

いろんな開発言語で使えます。

yaml.org

PythonにはPyYAMLというYAMLを扱うライブラリがあります。

PyYAML以外にもruamel.yamlやPySyck などがあります。

入門Python3のサンプルコードでYAMLに触れてみます。

https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

これが、YAMLのファイルです。

YAMLには「ハッシュ」「配列」「スカラー」の3つの書き方を組み合わせてデータを表現します。

「キー: 値」形式で表されるのもがハッシュです。

「:」のあとには半角スペースを必ず入れます。

name:
  first: James
  last: McIntyre
「- 値とかキー」形式で配列になります。

「-」のあとには半角スペースを必ず入れます。

poems:
  - title: 'Motto'
    text: |
      Politeness, perseverance and pluck,
      To their possessor will bring good luck.
  - title: 'Canadian Charms'
    text: |
      Here industry is not in vain,
      For we have bounteous crops of grain,
      And you behold on every field
      Of grass and roots abundant yield,
      But after all the greatest charm
      Is the snug home upon the farm,
      And stone walls now keep cattle warm.
値がスカラーです。

true, false, yes, no, on, offは、Pythonで読み込むと真偽値となります。
整数と文字列は、Pythonで読み込むとPythonの整数と文字列になります。

dates:
  birth: 1828-05-25
  death: 1906-03-31
details:
  bearded: true
  themes: [cheese, Canada]

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

# 仮想環境をつくって、
$ python3 -m venv tryYaml
$ source tryYaml/bin/activate
(tryYaml) $ cd tryYaml/

# PyYAMLをインストールします。
$ pip3 install PyYAML
Collecting PyYAML
  Downloading https://files.pythonhosted.org/packages/9e/a3/1d13970c3f36777c583f136c136f804d70f500168edc1edea6daa7200769/PyYAML-3.13.tar.gz (270kB)
    100% |████████████████████████████████| 276kB 1.1MB/s 
Installing collected packages: PyYAML
  Running setup.py install for PyYAML ... done
Successfully installed PyYAML-3.13

$ pip list
Package    Version
---------- -------
pip        19.0.1   
PyYAML     3.13   
setuptools 39.0.1 

# YAMLファイルをGitHubからダウンロードします。
(tryYaml) $ wget https://raw.githubusercontent.com/madscheme/introducing-python/master/storage/mcintyre.yaml
--2019-01-31 00:43:54--  https://raw.githubusercontent.com/madscheme/introducing-python/master/storage/mcintyre.yaml
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.108.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.108.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 654 [text/plain]
`mcintyre.yaml' に保存中

mcintyre.yaml                                100%[===========================================================================================>]     654  --.-KB/s 時間 0s       

2019-01-31 00:43:54 (13.0 MB/s) - `mcintyre.yaml' へ保存完了 [654/654]

(tryYaml) $ ls -l
total 136
drwxr-xr-x@ 12 mana  staff  384  1 30 23:54 bin
drwxr-xr-x@  2 mana  staff   64  1 30 23:52 include
drwxr-xr-x@  3 mana  staff   96  1 30 23:46 lib
-rw-r--r--@  1 mana  staff  654  1 31 00:43 mcintyre.yaml
-rw-r--r--@  1 mana  staff   61  1 30 23:53 pip-selfcheck.json
-rw-r--r--@  1 mana  staff  114  1 30 23:52 pyvenv.cfg

コードを書きます。

# ソースファイルを作って
(tryYaml) $ echo -n > tryyml.py

# SublimeTextで開きます。
(tryYaml) $ subl tryyml.py 


実行するとYAMLファイルの内容を読み込めたことがわかります。

(tryYaml) $ python3 tryyml.py 
detailsの内容: {'bearded': True, 'themes': ['cheese', 'Canada']}
poemsの数: 2
poemsの1つ目のタイトル: Motto
datesの型: <class 'dict'>
datesのbirthの型: <class 'datetime.date'>
detailsのbeardedの型: <class 'bool'>
detailsのthemesの型: <class 'list'>
booksのurlの型: <class 'str'>
poemsのtextの型: <class 'str'>

(tryYaml) $ 

思い出の一枚

f:id:ponsuke_tarou:20190131201017j:plain
偕楽園

Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。

前回は、Slack-Python-Onboarding-Tutorial をできるようにローカル環境に必要なものを準備しました。

ponsuke-tarou.hatenablog.com

今回は、Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。

チュートリアル用のSlack AppとBotユーザーを作成します。

github.com

新規にSlack Appをapi.slack.comで作ります。

api.slack.com
f:id:ponsuke_tarou:20190111165403p:plainf:id:ponsuke_tarou:20190111165424p:plainf:id:ponsuke_tarou:20190111165802p:plain

作ったAppがSlackと対話できるようにBotユーザを作ります。

f:id:ponsuke_tarou:20190111171209p:plainf:id:ponsuke_tarou:20190111171222p:plain

作ったBotにイベントを登録します。

github.com

Ngrokを起動して一時的に外部からローカルへアクセスするURLを取得します。

$ ngrok http 8080

ngrok by @inconshreveable                                                                                                            (Ctrl+C to quit)
                                                                                                                                                     
Session Status                online                                                                                                                 
Session Expires               7 hours, 57 minutes                                                                                                    
Version                       2.2.8                                                                                                                  
Region                        United States (us)                                                                                                     
Web Interface                 http://127.0.0.1:4040                                                                                                  
Forwarding                    http://cd36dfb5.ngrok.io -> localhost:8080                                                                             
Forwarding                    https://cd36dfb5.ngrok.io -> localhost:8080                                                                            
                                                                                                                                                     
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                            
                              0       0       0.00    0.00    0.00    0.00          

app.pyを起動します。

Ngrokを起動したターミナルとは別のターミナルを起動してapp.pyを起動します。

(slackTutorial) $ python3 app.py 
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 218-532-055

Slackの[Enable Events]をONにします。

[Request URL]には、{Ngrokで表示されているURL} + {app.pyのhearsメソッドのルートである/listening} の値を設定します。
ちゃんとサーバを使用している場合は、そのサーバのURLを設定します。
{Ngrokで表示されているURL}は、起動のたびに変わるのでその都度[Change]ボタンで[Request URL]を変えます。
f:id:ponsuke_tarou:20190128225347p:plain

[Subscribe to Bot Events]でBotにイベントを登録します。

ページの下の方にある[Subscribe to Bot Events]の[Add Bot User Event]ボタンでBotにイベントを登録します。
登録が終わったら[Save Changes]ボタンで保存します。
f:id:ponsuke_tarou:20190128230532p:plain

環境変数にアプリの資格情報を設定します。

チュートリアルBotでは、osモジュールを使用して環境変数からアプリの資格情報を読み込んで利用します。
そのため、環境変数に資格情報を設定する必要があります。

# bot.py
# -*- coding: utf-8 -*-
u"""lack-Python-Onboarding-TutorialのBotクラス."""
import os
import message
# 省略
        # When we instantiate a new bot object, we can access the app
        # credentials we set earlier in our local development environment.
        self.oauth = {"client_id": os.environ.get("CLIENT_ID"),
                      "client_secret": os.environ.get("CLIENT_SECRET"),
                      # Scopes provide and limit permissions to what our app
                      # can access. It's important to use the most restricted
                      # scope that your app will need.
                      "scope": "bot"}
        self.verification = os.environ.get("VERIFICATION_TOKEN")
# 省略
  1. アプリの[Basic Information]ページで、[Client ID][Client Secret][Verification Token]をコピーします。
    • https://cloud.githubusercontent.com/assets/4828352/20548888/198e2270-b0dc-11e6-9a92-5fe3842be4ba.png
  2. .bash_profileなどで以下のように環境変数を設定します
    • f:id:ponsuke_tarou:20190129234300p:plain
      .bash_profileの場合

認証の設定を行います。

github.com

  1. 左サイドのメニューにある[OAuth & Permissions]からページを開いて[Redirect URLs]を設定します。
  2. [Add New Redirect URL]ボタンを押下してRedirect URLを入力し、[Add]ボタンで追加します。
    • Redirect URLには、{Ngrokで表示されているURL} + {app.pyのthanksメソッドのルートである/thanks} の値を設定します。
    • {Ngrokで表示されているURL}は、起動のたびに変わるのでその都度[Change]ボタンで[Request URL]を変えます。
  3. [Save URLs]ボタンを押下して保存します。

f:id:ponsuke_tarou:20190128233556p:plain

思い出の一枚

f:id:ponsuke_tarou:20190111171304j:plain

PythonのウェブフレームワークであるFlaskを学ぶ。

Flaskは、Pythonのウェブフレームワークです。

  • 和英 : (flǽsk)〔実験で使う〕フラスコ〔ウイスキーなどの〕フラスコ瓶

https://a2c.bitbucket.io/flask/_images/logo-full.png
Flaskへ ようこそ — Flask v0.5.1 documentation

Flaskは、Bottleと同じくらい簡単に使えるが、Facebook認証やデータベース統合など、本格的なウェブ開発で役に立つ様々な拡張を備えている。
https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

ウェブフレームワークは、クライアントからの要求とサーバの応答を処理してくれます。

https://camo.qiitausercontent.com/709d8bdb4a5bb2d9223cc468e21f2dcbcb2cfb19/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36353331322f63303638613462632d643964372d373363662d353332352d3166346536616538333536632e706e67
Python Webフレームワーク Django vs Pyramid vs Flask 2015年12月 - Qiita

WSGIライブラリのwerkzeugとjinja2が入っています。

WSGIとは、PythonでのWebサーバとWebアプリケーションをつなぐインターフェースを定義した仕様です。

WSGIJavaにおけるJava Servelet APIと同じように,WebサーバとWebアプリケーション間の汎用的なインターフェースを定義しています。WSGIを利用することで,WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになりました。
gihyo.jp

f:id:ponsuke_tarou:20190108201858p:plain
5. WSGIとPylons - Emerge Technology

https://c-bata.link/webframework-in-python/_images/router.png
ルーティング — c-bata.link

本を見ながら実際にFlaskを使ってみます。

  • 環境
    • macOS Mojave バージョン10.14.2
    • Python 3.6.5
    • pip 18.1

https://www.oreilly.co.jp/books/images/picture978-4-87311-738-6.gif

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

# インストールします。
$ pip3 install flask
Collecting flask
  Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
    100% |████████████████████████████████| 92kB 701kB/s 
Collecting click>=5.1 (from flask)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
    100% |████████████████████████████████| 81kB 2.3MB/s 
Collecting Jinja2>=2.10 (from flask)
  Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
    100% |████████████████████████████████| 133kB 1.3MB/s 
Collecting Werkzeug>=0.14 (from flask)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |████████████████████████████████| 327kB 2.2MB/s 
Collecting itsdangerous>=0.24 (from flask)
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
  Downloading https://files.pythonhosted.org/packages/da/fc/2979c425ad23d528d6ac2e1f3efdc28e572fa1e1fbd5a75171cbdd7ddaa5/MarkupSafe-1.1.0-cp36-cp36m-macosx_10_6_intel.whl
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0

# バージョン確認します。
$ flask --version
Flask 1.0.2
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
$ pip3 -V
pip 18.1 from /Users/mana/Dropbox/ApacheDcumentRoot/Slack-Python-Onboarding-Tutorial/tryFlask/lib/python3.6/site-packages/pip (python 3.6)

リクエストの入口にする try_flask.py を作ります。

ホーム画面用の index.html を作ります。


jinja2を体験してみます。

jinja2は、Python用のテンプレートエンジンです。

f:id:ponsuke_tarou:20190109223501p:plain
Welcome to Jinja2 — Jinja2 Documentation (2.10)

テンプレートのHTMLを作ります。
# templatesディレクトリを作成して、
$ mkdir templates
# その中にHTMLを作ります。
$ echo -n > templates/jinja2.html

動かしてみます。

$ python3 try_flask.py 
 * Serving Flask app "try_flask" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415
127.0.0.1 - - [09/Jan/2019 23:23:34] "GET /echo/ponsuke_tarou HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 301 -
127.0.0.1 - - [09/Jan/2019 23:24:45] "GET /echo/?name=ponsuke_tarou&do=%27write%20HatenaBlog%27 HTTP/1.1" 200 -
127.0.0.1 - - [09/Jan/2019 23:34:24] "GET /echo/?name=ponsuke_tarou&do=HatenaBlog%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6 HTTP/1.1" 200 -
 * Detected change in '/path/to/try_flask.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 256-786-415

f:id:ponsuke_tarou:20190109221733p:plain
http://localhost:8080/にアクセスするとホーム画面が表示されました。
f:id:ponsuke_tarou:20190109222336p:plain
http://localhost:8080/echo/ponsuke_tarouにアクセスると引数の「ponsuke_tarou」がちゃんとハマった文字列が返されました。
f:id:ponsuke_tarou:20190109233513p:plain
http://localhost:8080/echo/?name=ponsuke_tarou&do=HatenaBlogを書いて にアクセスするとGETで渡した引数がテンプレートにハマって表示されました。

Slack-Python-Onboarding-Tutorial をできるように必要なものを準備する。

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Slack : Web版
    • ブラウザ : Chrome バージョン: 71.0.3578.98(Official Build) (64 ビット)
    • Python : 3.6.5
    • pip : 18.1
    • git : version 2.17.2 (Apple Git-113)

前回は、Incoming webhooksでメッセージを送ってみました。

ponsuke-tarou.hatenablog.com

Incoming webhooksではない方法でメッセージを送れるようにSlack-Python-Onboarding-Tutorialをやりたいとおもいます。

github.com

Onboardingは、新規メンバへの教育的なことです。

jinjibu.jp

今回は、チュートリアルに必要なものを準備します。

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

ponsuke-tarou.hatenablog.com

パッケージ管理ツールのpipはPythonにくっついています。

(google翻訳)python.orgからダウンロードしたPython 2> = 2.7.9またはPython 3> = 3.4を使用している場合、またはvirtualenvまたはpyvenvによって作成された仮想環境で作業している場合は、pipは既にインストールされています。
Installation — pip 19.1.1 documentation

Python開発用の仮想環境を作るツールであるVirtualenv的なものはvenvとしてPythonにくっついています。

(google翻訳)virtualenvは独立したPython環境を作成するためのツールです。
Python 3.3以降、そのサブセットがvenvモジュールの下で標準ライブラリに統合されました。
ただし、venvモジュールはこのライブラリのすべての機能を提供するわけではありません(たとえば、ブートストラップスクリプトを作成できない、ホストpython以外の他のバージョンのPython用の仮想環境を作成できない、再配置できないなど)。
Virtualenv — virtualenv 17.0.0 documentation

venv モジュールは、軽量な "仮想環境" の作成のサポートを提供します。仮想環境には、仮想環境ごとの site ディレクトリがあり、これはシステムの site ディレクトリから分離させることができます。それぞれの仮想環境には、それ自身の Python バイナリ (様々な Python バージョンで環境を作成できます) があり、仮想環境ごとの site ディレクトリに独立した Python パッケージ群をインストールできます。
venv --- 仮想環境の作成 — Python 3.7.3 ドキュメント

チュートリアルリポジトリをクローンします。

f:id:ponsuke_tarou:20190106140937p:plain
URLをコピーする。

# コピーしたURLでクローンします。
$ git clone https://github.com/slackapi/Slack-Python-Onboarding-Tutorial.git
Cloning into 'Slack-Python-Onboarding-Tutorial'...
remote: Enumerating objects: 19, done.
remote: Total 19 (delta 0), reused 0 (delta 0), pack-reused 19
Unpacking objects: 100% (19/19), done.

仮想環境を準備します。

venvで仮想環境を作ります。

qiita.com

# クローンしたディレクトリへ移動します。
$ cd Slack-Python-Onboarding-Tutorial

# 仮想環境を作ります。
$ python3 -m venv slackTutorial

# 仮想環境を有効化します。
$ source slackTutorial/bin/activate

pip3で必要なパッケージをインストールします。

# パッケージをインストールする前に import文でモジュールを検索するディレクトリを確認しておきます。
(slackTutorial) $ python3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Users/mana/Dropbox/ApacheDcumentRoot/Slack-Python-Onboarding-Tutorial/slackTutorial/lib/python3.6/site-packages']
>>> exit()

# pip3の情報を確認しておきます。
(slackTutorial) $ pip3 show pip
Name: pip
Version: 18.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: pypa-dev@groups.google.com
License: MIT
Location: /path/to/Slack-Python-Onboarding-Tutorial/slackTutorial/lib/python3.6/site-packages
Requires: 
Required-by: 

# チュートリアルに必要なパッケージをインストールします。
(slackTutorial) $ pip3 install -r requirements.txt
Collecting click==6.6 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/1c/7c/10b4132dd952b6a04e37626258825b8aa8c1eb99545f2eb26a77c21efb55/click-6.6-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 1.6MB/s 
Collecting Flask==0.11.1 (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/63/2b/01f5ed23a78391f6e3e73075973da0ecb467c831376a0b09c0ec5afd7977/Flask-0.11.1-py2.py3-none-any.whl (80kB)
    100% |████████████████████████████████| 81kB 2.6MB/s 
Collecting itsdangerous==0.24 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz (46kB)
    100% |████████████████████████████████| 51kB 10.1MB/s 
Collecting Jinja2==2.8 (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/96/a1/c56bc4d99dc2663514a8481511e80eba8994133ae75eebdadfc91a5597d9/Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |████████████████████████████████| 266kB 2.2MB/s 
Collecting MarkupSafe==0.23 (from -r requirements.txt (line 5))
  Downloading https://files.pythonhosted.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz
Collecting pyaml==16.9.0 (from -r requirements.txt (line 6))
  Downloading https://files.pythonhosted.org/packages/e3/bb/e920e88da947f3915229dedd7a3c77267d37bcfbfc2e0aa350f33f25f9b3/pyaml-16.9.0.tar.gz
Collecting PyYAML==3.12 (from -r requirements.txt (line 7))
  Downloading https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 3.1MB/s 
Collecting requests==2.11.1 (from -r requirements.txt (line 8))
  Downloading https://files.pythonhosted.org/packages/ea/03/92d3278bf8287c5caa07dbd9ea139027d5a3592b0f4d14abf072f890fab2/requests-2.11.1-py2.py3-none-any.whl (514kB)
    100% |████████████████████████████████| 522kB 4.2MB/s 
Collecting six==1.10.0 (from -r requirements.txt (line 9))
  Downloading https://files.pythonhosted.org/packages/c8/0a/b6723e1bc4c516cb687841499455a8505b44607ab535be01091c0f24f079/six-1.10.0-py2.py3-none-any.whl
Collecting slackclient==1.0.2 (from -r requirements.txt (line 10))
  Downloading https://files.pythonhosted.org/packages/db/12/e5198d6e10ead20acdbba5f6a7c22d153d8ea08946ea06e4580f6666cb52/slackclient-1.0.2.tar.gz
Collecting websocket-client==0.37.0 (from -r requirements.txt (line 11))
  Downloading https://files.pythonhosted.org/packages/a3/1e/b717151e29a70e8f212edae9aebb7812a8cae8477b52d9fe990dcaec9bbd/websocket_client-0.37.0.tar.gz (194kB)
    100% |████████████████████████████████| 194kB 1.9MB/s 
Collecting Werkzeug==0.11.11 (from -r requirements.txt (line 12))
  Downloading https://files.pythonhosted.org/packages/a9/5e/41f791a3f380ec50f2c4c3ef1399d9ffce6b4fe9a7f305222f014cf4fe83/Werkzeug-0.11.11-py2.py3-none-any.whl (306kB)
    100% |████████████████████████████████| 307kB 5.1MB/s 
Installing collected packages: click, itsdangerous, MarkupSafe, Jinja2, Werkzeug, Flask, PyYAML, pyaml, requests, six, websocket-client, slackclient
  Running setup.py install for itsdangerous ... done
  Running setup.py install for MarkupSafe ... done
  Running setup.py install for PyYAML ... done
  Running setup.py install for pyaml ... done
  Running setup.py install for websocket-client ... done
  Running setup.py install for slackclient ... done
Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 PyYAML-3.12 Werkzeug-0.11.11 click-6.6 itsdangerous-0.24 pyaml-16.9.0 requests-2.11.1 six-1.10.0 slackclient-1.0.2 websocket-client-0.37.0

# 一旦仮想環境から抜けます。
$ deactivate

local環境へLANの外からアクセスできるようにするNgrokをインストールします。

If you are running this project locally, you'll need to set up tunnels for Slack to connect to your endpoints. Ngrok is an easy to use tunneling tool that supports HTTPS, which is required by Slack.
github.com

qiita.com

Web API用のテストツールPostmanをインストールします。

You'll likely want to test events coming to your server without going through the actions on your Slack team. Postman is a useful tool you can use to recreate requests sent from Slack to your server. This is especially helpful for events like user join, where the workflow to recreate the event requires quite a bit of set up.
github.com

qiita.com

次回は、Slack側の準備をします。

ponsuke-tarou.hatenablog.com


f:id:ponsuke_tarou:20190106232448j:plain

はじめてのPythonでSlackとつながってみる

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Slack : Web版
    • ブラウザ : Chrome バージョン: 70.0.3538.102
    • curl : 7.54.0 (x86_64-apple-darwin18.0)
    • Python : 3.6.5

ponsuke-tarou.hatenablog.com

SlackAPIってなんだ?

api.slack.com

よくわからないでSlackのIncoming Webhooksを実際に使ってみます。

とりあえず概要だけ見ておきます。

Webhookとは?

  • アプリケーションの更新情報を他のアプリケーションへリアルタイム提供する仕組みや概念のこと。
  • イベント(リポジトリにプッシュなど)発生時、指定したURLにPOSTリクエストする仕組みのこと。

Webhookの説明を見ると「通知する、Webhookを送る」などの言葉が用いられているが、
これはPOSTリクエストのことを指している。
Webhookとは? - Qiita

じゃ、SlackのIncoming Webhooksって?
get.slack.help

1. Webhockする用のAppを用意する

  1. f:id:ponsuke_tarou:20181121234139p:plain
  2. f:id:ponsuke_tarou:20181121234258p:plain
  3. f:id:ponsuke_tarou:20181121234453p:plain
  4. f:id:ponsuke_tarou:20181121234745p:plain
  5. f:id:ponsuke_tarou:20181121234657p:plain
    [App Name]を入力 > [Department Slack Workspace]を選択 > [Create App]ボタンを押下
  6. f:id:ponsuke_tarou:20181121235053p:plain
    [Incoming Webhooks]を「ON」にする
  7. f:id:ponsuke_tarou:20181121235446p:plain
    同じページの下にある[Add New Webhoock To Workspace]を押下
  8. f:id:ponsuke_tarou:20181127190644p:plainf:id:ponsuke_tarou:20181127190702p:plain

2. Incoming Webhooksを設定する

Incoming Webhooksを設定する

以下サイトの[Incoming Webhooksのエンドポイントを取得する]に従ってIncoming Webhooksを設定する
qiita.com
f:id:ponsuke_tarou:20181127203106p:plain

ちょっと使ってみる

Webhoock URLをゲットする

f:id:ponsuke_tarou:20181127215902p:plain

いろんなプロトコルでデータ転送してくれる curl コマンドを使う

Windowsではインストールが必要
qiita.com

Termialでcurlコマンドを使ってメッセージを送ってみる
# -X <method> : HTTP メソッドの指定
# --data-urlencode name=content : contentをURLエンコードする
curl -X POST --data-urlencode "payload={\"text\": \"初めてWebhoockでメッセージを送信します。\" }" [コピーしたWebhoock URL]

f:id:ponsuke_tarou:20181127222910p:plain
メッセージが届いた。

3. PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる

Pythonのインターネットにアクセスできる外部モジュール「Requests」をインストールする

ponsuke-tarou.hatenablog.com

Requestsを使ってPythonでメッセージを送ってみる

slack_webhook.pyというPythonのファイルを作って実行すると簡単にできた。

import json, requests

WEB_HOOK_URL = "https://hooks.slack.com/services/"
WEB_HOOK_URL += "WebhookURLの後半"
requests.post(WEB_HOOK_URL, data=json.dumps({
    'text': 'PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる.',
}))
# 作ったコードを実行する。
python3 slack_webhook.py

f:id:ponsuke_tarou:20190105145837p:plain
送られてきたメッセージ

もう少し使ってみる

slack_webhook.pyというPythonのファイルを作って実行するともう少し楽しいメッセージが送信できた。

はじめてのPythonでSlackとつながってみる

f:id:ponsuke_tarou:20190105171241p:plain
もう少し楽しいメッセージが送信できる。

参考にしたサイト

qiita.com
qiita.com


うまく行かなかったこと

リクエストにTokenがなくて not_authed が返却されました。

よくわからないでブラウザのURL欄に https://otsecbsol.slack.com/api/conversations.createと入力してみました・・・。

{"ok":false,"error":"not_authed"}


f:id:ponsuke_tarou:20181128002041j:plain

Apacheを触ってみる

  • 環境
    • OS : macOS Mojave バージョン10.14.1
    • Apatche : 2.4.37 (Unix)

Apacheは、Webサーバです。

  • 正式名称 : Apache HTTP Server

Apacheという名前はインディアン部族、Apacheに対する敬意の念をあらわすため選んだ」らしいです。
Webサーバで利用されているアプリケーションで、Netcraft社によるとシェアはここ数年下がりつつあるとはいえそれなりにあります。
Web Server Survey | Netcraft

Webサーバは、HTMLファイルやそれに付随する画像などのファイルをクライアントコンピュータに配信するサーバコンピュータのことです。

https://eng-entrance.com/wp-content/uploads/2016/05/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2016-05-25-7.58.03.png
今更聞けない!Webサーバーの仕組みと構築方法

f:id:ponsuke_tarou:20181219233515p:plain
第8回 Webサーバーを作る(Apache) « shell-mag

http://www.atmarkit.co.jp/fjava/special/ejb01/zu03.gif
Webアプリケーションにおけるサーバ・サイドJavaの効果的な利用

Apacheの利点

  1. 多彩なプラットフォーム
    • UNIXWindowsIBMOS/2Mac OS Xなどで動作します。だから特別な環境を用意しなくったって今使っているものが使えちゃうんです。
  2. オープンソース
    • オープンソースのため、興味があれば誰でもソースコードを見ることができます。そのため、常に外部から多くの人の目でチェックされ、改良を続けることでApacheの安定性は高まっています。
    • オープンソースがゆえに、商用製品のような手厚いサポートを受けることはできませが、コミュニティなどやサイトが沢山あるので情報は容易く手に入るのです!
  3. 機能が豊富
    • Apacheは機能を積極的に追加・拡張・機能をモジュールとして分割し、ユーザが新機能を開発するためのAPIも公開しています。このAPIを利用した追加モジュールがユーザによって数多く作成され、公開されています。そのため有用な機能を提供するモジュールはApacheの配布パッケージに含まれることもあるのです。

インストールの方法

qiita.com

起動と停止の方法

ターミナルを使います。

# 起動する
$ apachectl start

# 停止する
$ apachectl restart

# 再起動する
$ apachectl restart

Apacheを起動してからブラウザで「http://localhost:80」を表示すると「It works!」と表示されます。
f:id:ponsuke_tarou:20181227133522p:plain

Apacheを設定してみる

どこに「It works!」が書かれているのでしょう?こういった情報はApacheの設定ファイルで確認できます。

設定ファイルの名前は「httpd.conf」です。

設定ファイルは、Macにデフォルトで入っているApacheの場合は「/etc/apache2/httpd.conf」です。ただ「etc」というディレクトリは「Finder」では見えないのでターミナルで開きます。

$ open /etc/apache2/

アクセスするポート番号をListenに設定します。

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
設定するポート番号の注意 : 80番はよく他のアプリケーションに使われています。

環境によっては「It works!」が表示されない事があります。原因は沢山あるのですが、1つにポート番号があります。

例えば、「Listen 80」と httpd.conf に設定したとします。これはApacheが 80番 のポートを使いますよってことです。

ところが、意外と他のアプリケーションが 80番を使っていてApacheが80番を使えず起動できないことがあります。
qiita.com

まずは現在使われているポート番号を調べます。
Macでは Network Utility を使います。
f:id:ponsuke_tarou:20181210211746p:plain

何のアプリケーションとポート番号がバッティングしているか判ったら方法は2つ
① 使っているアプリのポート番号を変更する
Apacheのポート番号を変更する

②の場合は、「Listen 80」の 80 を変更します。
「8080」あたりが無難です。

そして、Apacheを再起動するとポート番号のバッティングが治ります。

表示するファイルを格納するディレクトリをDocumentRootに設定します。

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/Library/WebServer/Documents"


「/Library/WebServer/Documents」を開いてみると「index.html」というファイルが入っています。ここに「It works!」が書かれています。

< html >< body><h1 >It works!</h1></body></html>
DirectoryIndexに設定されたファイルがデフォルトで表示されます。

ここまででDocumentRootに設定されたディレクトリにある「index.html」が表示されたことがわかりました。
この「index.html」を指定するのがDirectoryIndexになります。
http://localhost:80/」のようにファイル名が指定されない場合はDirectoryIndexに設定されたファイル名が返されて「http://localhost:80/index.html」となります。

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

r7kamura.hatenablog.com

f:id:ponsuke_tarou:20181219233806j:plain