状態遷移から知る有限オートマトン
- 前回の勉強内容
- 今回の勉強内容 : 状態遷移図を使って有限オートマトンを知る
- 無効と有効の状態遷移をテストする状態遷移テストというものがあります。
- オートマトンは、入力から内部の状態と規則に従い結果を出力する仮想的な自動機械です。
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : 状態遷移図を使って有限オートマトンを知る
勉強のきっかけになった問題
次の表は,入力記号の集合が{0,1},状態集合が{a,b,c,d}である有限オートマトンの状態遷移表である。長さ3以上の任意のビット列を左(上位ビット)から順に読み込んで最後が110で終わっているものを受理するには,どの状態を受理状態とすればよいか。
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
図はマルチタスクで動作するコンピュータにおけるタスクの状態遷移を表したものである。実行状態のタスクが実行可能状態に遷移するのはどの場合か。
- 自分より優先度の高いタスクが実行可能状態になった。
- タスクが生成された。
- 入出力要求による処理が完了した。
- 入出力要求を行った。
平成23年秋期問20 タスクの状態遷移|基本情報技術者試験.com
状態遷移表は、発生する可能性のあるイベントと状態の組み合わせから生じる結果を示す遷移をテーブルで表したものです。
- 英語 : state table
- 無効な遷移と、有効な遷移の両方を示します。
- 特徴
- 「できないこと」を洗い出せる
- 仕様があいまいな個所に潜む欠陥を発見できる
- 全ての状態と全てのイベントを組み合わせるので、仕様のあいまいな個所を特定できる
- 状態遷移図の不備を見つけることができる
次の表は,文字列を検査するための状態遷移表である。検査では,初期状態をaとし,文字列の検査中に状態がeになれば不合格とする。
解答群で示される文字列のうち,不合格となるものはどれか。ここで,文字列は左端から検査し,解答群中の△は空白を表す。
ア. +0010 イ. -1 ウ. 12.2 エ. 9.△
平成18年春期問9 状態遷移表|基本情報技術者試験.com
図は,偶数個の1を含むビット列を受理するオートマトンの状態遷移図であり,二重丸が受理状態を表す。a,bの正しい組合せはどれか。
回答群
平成25年春期問3 オートマトンの状態遷移図|応用情報技術者試験.com
状態遷移図と状態遷移表は、各メリットを合わせてお互いを見合わせながら整理することでテストケースを洗い出す事ができます。
状態遷移図では動作を想定しながら作るので「できること」に着目しがちですが、状態遷移表は状態とイベントを網羅的に組み合わせるので「できないこと」にも気が付けるのです。
性格が違うのだからどちらかあればいいってわけではないのですね。
オートマトンは、入力から内部の状態と規則に従い結果を出力する仮想的な自動機械です。
- 英語 : automaton
入力と状態の数がある程度決まっているのが有限オートマトンです。
- 別名 : 有限状態機械
有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である。
デジタル回路やプログラムの設計で使われることがあり、ある一連の状態をとったときどのように論理が流れるかを調べることができる。有限個の「状態」のうち1つの状態をとる。ある時点では1つの状態しかとらず、それをその時点の「現在状態」と呼ぶ。
何らかのイベントや条件によってある状態から別の状態へと移行し、それを「遷移」と呼ぶ。それぞれの現在状態から遷移しうる状態と、遷移のきっかけとなる条件を列挙することで定義される。
有限オートマトン - Wikipedia
図で表される有限オートマトンで受理される文字列はどれか。ここでは初期状態を,受理状態を表す。
ア 01011 イ 01111 ウ 10111 エ 11110
平成18年秋期問11 有限オートマトン|基本情報技術者試験.com
勉強のきっかけになった問題も状態遷移図を書いてみるとわかりやすいです。
次回の勉強内容
ページング方式におけるページインだけの処理の割合
- 前回の勉強内容
- 今回の勉強内容 : ページング方式の基本用語を理解したい。
- ページング方式とは、メモリ領域をページと呼ばれる一定の大きさの領域に分割し、物理的なアドレスとは別に仮想的なアドレスを割り当てて管理する方式です。
- アクセスしようとした領域が物理メモリではなく仮想メモリにある場合に発生する割り込み処理をページフォールトといいます。
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : ページング方式の基本用語を理解したい。
ページング方式とは、メモリ領域をページと呼ばれる一定の大きさの領域に分割し、物理的なアドレスとは別に仮想的なアドレスを割り当てて管理する方式です。
物理メモリが不足した時に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
ページング方式の仮想記憶を使うとプログラムやデータを不連続な主記憶に割り付けることができます。
細切れのメモリ空間を連結して一つの連続した空間として利用したり、補助記憶装置(ハードディスクなど)上にも仮想的なメモリ領域を確保することで、物理メモリの容量を超えてメモリ空間を利用することができます。
アクセスしようとした領域が物理メモリではなく仮想メモリにある場合に発生する割り込み処理をページフォールトといいます。
- 英語 : page fault
ページング方式の仮想メモリにおいて、プロセスがアクセスしようとしたページが物理メモリ上に無く、仮想メモリにあるときに仮想メモリを管理する制御装置が発する例外あるいは割込処理をページフォールトといいます。
このページフォルトは、エラーっぽい名前だけれどとかでとか来た時に表示される通知やお知らせ的な存在です。
そのページフォルトをOSさんが検知して物理メモリに必要なページを読み込んでくれます。
リストラ的にページフレームを追い出すことをページアウトといいます。
- 別名 : スワップアウト
ページング方式では「プロセスが使ってる部分は物理メモリ、使ってない部分は仮想メモリを使う」「仮想メモリはページというカタマリで使われていく」、そして「使ってなかった部分を使うときは仮想メモリから物理メモリを使うようにする」ことがわかりました。
が、物理メモリが空いていればいいけど、空いていなかったらどうするんだろう?
物理メモリが空いていなかったら、どれかのページを追い出すんです!
どのページフレームを追い出すかってのはアルゴリズムによって違います。
逆にデビュー的にページをページフレームに読み込むことをページインとかスワップインといいます。
次回の勉強内容
SQLインジェクション
- 前回の勉強内容
- 今回の勉強内容 : SQLインジェクションの対策を学ぶ
- SQLインジェクションとは、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。
- 入力値で仕込んでデータが再利用されたときに効力を発揮するセカンドオーダーSQLインジェクション
- シングルクオーテーションを使わないSQLインジェクション
- マルチバイト文字の問題
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : SQLインジェクションの対策を学ぶ
勉強のきっかけになった問題
SQLインジェクション対策について,Webアプリケーションの実装における対策とWebアプリケーションの実装以外の対策として,ともに適切なものはどれか。
情報セキュリティスペシャリスト 平成28年秋期 午前Ⅱ 問17
SQLインジェクションとは、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。
【2】SQLインジェクションによる顧客情報流出 ― 不正アクセスの横綱!| Webサイトセキュリティ対策入門 by WAF「Scutum」プロジェクト
対策 : SQLを埋め込むところで特殊文字を適切にエスケープ
' → ''
\ → \\
今夜分かるSQLインジェクション対策:Security&Trust ウォッチ(42) - @IT
入力値で仕込んでデータが再利用されたときに効力を発揮するセカンドオーダーSQLインジェクション
たとえアプリケーションが常にシングルクオートをエスケープしていても、 攻撃者はなおも、データベース中のデータがそのアプリケーションで再利用さ れるときにSQLをインジェクトすることができます。
- 例えば・・・
- 攻撃者がアプリケーションに登録して、ユーザ名「admin'--」、 パスワード「password」のユーザ名を作る
- アプリケーションはシングルクオートを正しくエスケープして、INSERT文が作られる
- insert into users values ( 123, 'admin''--', 'password', 0xffff)
- 攻撃者がパスワードを変更する
- update users set password = '" + newpassword + "’ where username = '" + rso ( "admin'--") + "'"
- 最初にせっかくエスケープしたのに次には・・・・されず・・・クエリが生成される
- update users set password = 'password' where username = 'admin'--'
- 攻撃者は、admin'-- というユーザを登録することによって、admin のパスワードを自由にセットできる
対策 : データベースでのアクセス権は最小限に留める
不正なSQLがWebアプリから送られても最小限のアクセス権だけを与えることで被害を軽減できます。
シングルクオーテーションを使わないSQLインジェクション
SQLインジェクション対策というと、「'」の扱いばかりが注目されるが、「'」を使わなくても成立する攻撃もあります。
- 例えば・・・
- SELECT name FROM user where uid = '$uid' AND age > $age
- 渡される$uidと$ageの特殊文字は、適切にエスケープ!が、こんなものがきたら・・・
- $uid:ueno
- $age:31 UNION…
- SELECT name FROM user where uid = ' ueno ' AND age > 31 UNION……
- UNION以降のSQLも実行されてしまう・・・
- 対策 : 問題は、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の呼び出し方 - QiitaPreparedStatement prep = conn.prepareStatement("SELECT * FROM employee WHERE name=?"); prep.setString(1, "山田");
マルチバイト文字の問題
- 例えば・・・入力値「\x97' OR A=A」をエスケープ処理すると「予' OR A=A」になる
次回の勉強内容
パイブライン処理での危険がパイブラインハザード
- 前回の勉強内容
- 今回の勉強内容 : パイブライン処理での危険を学ぶ
- パイブラインハザードは、パイプライン処理を止めたりやり直さなければならなくなり効率が悪くなることです。
- ハザードの種類は、原因によって分けられます。
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : パイブライン処理での危険を学ぶ
勉強のきっかけになった問題
パイプライン方式のプロセッサにおいて,パイプラインが分岐先の命令を取得するときに起こるハザードはどれか。
- 構造ハザード
- 資源ハザード
- 制御ハザード > 正解
- データハザード
パイブラインハザードは、パイプライン処理を止めたりやり直さなければならなくなり効率が悪くなることです。
- 英語 : pipeline hazard
マイクロプロセッサ(MPU/CPU)のパイプライン処理で発生する問題の一つです。
ハザードの種類は、原因によって分けられます。
制御ハザードは、分岐命令によって先取りした命令が無駄になることです。
- 別名 : 分岐ハザード
- 例えば・・・
- 条件分岐で実行の流れが二つに分かれる場合、条件の評価を待たずに先行して片方の分岐の命令群をパイプラインに投入することになるが、条件を評価した結果もう一方に分岐することが確定した場合、パイプラインの内容を破棄して正しい分岐の命令群を投入しなおさなければならない。
- 分岐命令を実行した場合、次に実行される命令は、分岐が成立した場合と不成立の場合の2通りがある。分岐が成立しないと仮定して命令を先取りすると、分岐が成立した場合に先取りした命令をキャンセルし、改めて分岐が成立した場合の命令を実行しなければならない。
制御ハザードによって先取りした命令のキャンセルが発生し、ムダになったクロック*1のことをインターロック*2もしくはストール*3という。
解決方法
- 分岐先が判明するまで先取りしない
- 常に分岐が不成立(あるいは成立)と仮定して先取りを進める
- 場合によってはストールが起こることを容認する。
データハザードは、命令が直前の命令の実行結果を使用する場合に発生します。
ある命令が直前の命令の処理結果を利用するような場合に、実行結果を待たなければパイプラインが進められない状況が発生します。
解決方法
- NOP命令を挿入する
- コンパイラによってソフトウェア的に実現される
- データハザードを検知したら実行結果を次の命令に直接たわしてしまう
- 演算装置によってハードウェア的に実現される
構造ハザードは、CPU内部の資源の衝突によって発生します。
複数の命令をパイプラインで並行に処理する過程で、同じタイミングで同じハードウェア資源にアクセスしようとするなど競合が発生し、処理がつっかえることがあります。
- 例えば・・・
- 命令Aがメモリへの書込を行っているのと同じタイミングで後続の命令Bがメモリの読込をしようとするとメモリアクセスがバッティングします。バッティングしないようにするために命令Bは1クロック処理を遅らせる必要があります。これにより1クロック分遅延します。
解決方法
- ハードウェア的に回避することは可能。
- しかし完全に構造ハザードを起こさない構成はコストの上昇を招く。
- 構造ハザードの確率が低ければ、コスト上昇を抑えるために、多少の構造ハザードを無視するのが現実的である。
次回の勉強内容
勉強中・・・
*1:CPUの動作基準となる時間の単位で、このクロックの整数倍の時間をかけて命令を実行していきます。命令パイプライン中の1ステージの実行には最低1クロックかかるので、4ステージ構成の命令パイプラインでは、1個の命令を実行完了するためには、最低でも4クロックの時間が必要となります。CPUをはじめとしたコンピュータの各回路は、一定の時間で刻まれるクロック信号に歩調を合わせながら処理を行っています。 このクロック信号は、非常に正確な時間間隔でパルス(非常に短い時間の間だけ変化する電流)を発生する水晶発振器によって生成されます。
*2:安全装置・安全機構の考え方の一つで、ある一定の条件が整わないと他の動作ができなくなるような機構のこと。
*3:命令パイプラインでは、除算命令のように命令の処理完了に長い時間がかかる場合、パイプラインに次の命令を取り込むのを待つ必要がある。この問題の解決策としてパイプラインの各段階が忙しいことを示せるようにして、パイプラインをインターロックして次の命令がステップを進まないように止めなければならない。これがストールであり、分岐のように中断以前の処理が無駄になる場合にはストールに加えて無駄となった処理時間分も加わり、これらがインターロックのロスとなる。
パイプライン処理の基本を学ぶ
- 前回の勉強内容
- 今回の勉強内容 : パイプライン処理の基本を学ぶ
- パイプライン処理とは、マイクロプロセッサの高速化手法の一つです。
- スーパースカラは、複数のパイプラインで並列に命令を処理できるようにする機構です。
- スーパーパイプラインは、パイプラインの段階を細分化して多くすることで並走できる命令数を増やします。
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : パイプライン処理の基本を学ぶ
パイプライン処理とは、マイクロプロセッサの高速化手法の一つです。
プロセッサ内での命令処理は、複数の段階を順次行います。
- 処理の段階
- 命令の読み込み(フェッチ)
- 解釈(デコード)
- 実行(エグゼキュート)
- 結果の書き込み(ライトバック)
通常は、前の命令のサイクルが完全に終わらないと、次の命令を処理し始めることはできません。
パイプライン処理は、各段階の処理を独立して動作させることで、前の命令のサイクルが終わる前に次の命令を処理し始められます。
パイプライン処理には種類があります。
レンダリング処理の高速化に特化しているのが、グラフィックスパイプラインです。
- 英語 : Graphics pipeline
- 別名 : レンダリングパイプライン
3次元コンピュータグラフィックスで、3次元から2次元のデータを作る多段階の過程全体をパイプライン処理によって高速化しています。
スーパースカラは、複数のパイプラインで並列に命令を処理できるようにする機構です。
並列実行可能な複数の命令を,複数の演算器(パイプライン)に振り分けることによって並列に実行する。
平成31年春期問8 スーパスカラの説明はどれか|応用情報技術者試験.com
スーパーパイプラインは、パイプラインの段階を細分化して多くすることで並走できる命令数を増やします。
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
次回の勉強内容
Dos攻撃とDDos攻撃はサーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。
- 前回の勉強内容
- 勉強のきっかけになった問題
- Dos攻撃とDDos攻撃は、サーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。
- 攻撃には、「フラッド型」「脆弱性型」「マルチベクトル型」があります。
- OSI参照モデルのネットワーク層、トランスポート層が攻撃に使われやすいです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
マルチベクトル型DDoS攻撃に該当するものはどれか。
- 攻撃対象のWebサーバ1台に対して,多数のPCから一斉にリクエストを送ってサーバのリソースを枯渇させる攻撃と,大量のDNS通信によってネットワークの帯域を消費させる攻撃を同時に行う。
- 攻撃対象のWebサイトのログインパスワードを解読するために,ブルートフォースによるログイン試行を,多数のスマートフォンやIoT機器などの踏み台から成るボットネットから一斉に行う。
- 攻撃対象のサーバに大量のレスポンスが同時に送り付けられるようにするために,多数のオープンリゾルバに対して,送信元IPアドレスを攻撃対象のサーバのIPアドレスに偽装した名前解決のリクエストを一斉に送信する。
- 攻撃対象の組織内の多数の端末をマルウェアに感染させ,当該マルウェアを遠隔操作することによってデータの改ざんやファイルの消去を一斉に行う。
Dos攻撃とDDos攻撃は、サーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。
1つのIPアドレスから攻撃を仕掛けるのが、Dos攻撃です。
- 英語 : Denial(否定・拒絶) of Service attack
- 日本語 : サービス拒否攻撃
F5アタックは、一人でF5ボタンを押下し続ける寂しい攻撃です。
- 別名 : F5攻撃、F5連打攻撃
ブラウザでF5を押すと、画面をリロードしてくれます。しかもキャッシュ保存せずに。
なので、画面のデータを全部サーバへ要求します。
そしてF5を猛烈に連打するとサーバに負荷をかけることができます。
複数のIPアドレスから攻撃を仕掛けるのが、DDos攻撃です。
- 英語 : Distributed(分散型の) Denial of Service attack
- 日本語 : 分散型サービス拒否攻撃
DDos攻撃では、ボットネットが使われます。
外部からの遠隔操作に従って処理を実行するプログラムがボットです。それがたくさん集まったのがボットネットです。
残念ながら、自分のパソコンやスマホにボットが入ってしまうとDDos攻撃の加害者となります。
Miraiは、ランダムなIPアドレスを生成してtelnetポートにログインを試行し工場出荷時の弱いパスワードを使っているIoT機器などに感染を広げるとともにC&Cサーバからの指令に従って標的に対してDDoS攻撃を行うマルウェアです。
- 読み方: ミライ
IoTデバイスを狙うマルウェア「Mirai」とは何か――その正体と対策:超速解説 Mirai - TechFactory
感染した端末上でIPアドレスをランダムに走査し、新たな標的を見つけます。そして、工場出荷時のデフォルト値や単純なID/パスワードの組みによる辞書攻撃によって、標的IoT端末のtelnetポートへのログインを試みます。この動作を繰り返して、ボットネットを拡大していきます。Miraiが構築したボットネットは、過去最大級の規模のDDoS攻撃を引き起こしています。
情報処理安全確保支援士平成30年秋期 午前Ⅱ 問11
攻撃には、「フラッド型」「脆弱性型」「マルチベクトル型」があります。
フラッド型は、大量データを送りつけて処理しきれなくなるようにします。
サービス妨害攻撃 --- DoS,DDoS,smarf,SYNフラッド,DNS amp | 日経クロステック(xTECH)
OSI参照モデルのネットワーク層、トランスポート層が攻撃に使われやすいです。
第7層 | アプリケーション層 |
---|---|
第6層 | プレゼンテーション層 |
第5層 | セッション層 |
第4層 | トランスポート層 <- 反射型DDoS攻撃 / DNSリフレクタ攻撃 |
第3層 | ネットワーク層 <- ICMP Flood攻撃 |
第2層 | データリンク層 |
第1層 | 物理層 |
反射型DDoS攻撃は、トランスポート層でDNSサーバやNTPサーバを反射に使ってパケットを増幅させる攻撃です。
- 別名 : リフレクション攻撃、DrDoS攻撃(Distributed Reflection Denial of Service attack)
ICMP Flood攻撃は、ネットワーク層のICMPを利用して回線を過負荷にさせる攻撃です。
ICMP Flood攻撃に該当するものはどれか。
答. pingコマンドを用いて大量の要求パケットを発信することによって,攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害する。
情報セキュリティスペシャリスト平成27年秋期 午前Ⅱ 問10
次回の勉強内容
Laravelのプロジェクトを作ってみる。
Laravelをインストーラを使わないでインストールします。
Composer Create-Projectでインストールします。
$ composer create-project --prefer-dist laravel/laravel {プロジェクトの名前}
コマンドの説明です。
利用可能なリポジトリにある既存のパッケージを複製して自身のパッケージにしたい(パッケージをフォークしたい)
$ composer create-project [vendor]/[package]
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による依存パッケージが配置される # 省略
動かして画面を見てみます。
# 開発サーバをhttp://localhost:8000として起動します。 $ php artisan serve Laravel development server started: <http://127.0.0.1:8000>
http://localhost:8000/にブラウザでアクセスするとLaravelの画面が表示されました。
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
サービスマネジメントシステムの規格はJIS Q 20000です。
- 前回の勉強内容
- 今回の勉強内容 : JIS Q 20000って何?
- ITサービスマネジメントは、ITシステムによる利用者が必要とするサービス提供を管理することです。
- ISO/IEC 20000は、ITサービスマネジメントシステムに関する国際規格です。
- 次回の勉強内容
前回の勉強内容
今回の勉強内容 : JIS Q 20000って何?
勉強のきっかけになった問題
ITサービスマネジメントの情報セキュリティ管理プロセスに対して,JIS Q 20000-1(サービスマネジメントシステム要求事項)が要求している事項はどれか。
ア. CMDBに記録されているCIの原本を,セキュリティが保たれた物理的又は電子的に格納庫で管理しなければならない。
イ. 潜在的な問題を低減させるために,予防処置をとらなければならない。
ウ. 変更要求が情報セキュリティ基本方針及び管理策に与える潜在的影響を評価しなければならない。
エ. 変更要求の受入れについての意思決定では,リスク,事業利益及び技術的実現可能性を考慮しなければならない。
ITサービスマネジメントは、ITシステムによる利用者が必要とするサービス提供を管理することです。
- 英語 : IT Service Management
- 略称 : ITSM
- ITシステムを開発・運用することが業務の主目的になりがち・・・
- 利用者視点が不足してしまい、ユーザーの満足度向上に課題になってしまう
- だから、利用者視点でITサービスの提供を考える <<< ITサービスマネジメント
- ITシステムの開発・運用は、ITサービスを提供するための手段
- ビジネス環境や情報技術の変化に合わせて改善を続けていく
ITサービスマネジメントシステムは、ITサービスマネジメントをPDCAサイクルに基づいて維持管理と継続的改善を行っていくための仕組みです。
- 略称 : ITSMS
ITSMSの構築
ITSMS(ITサービスマネジメントシステム)とは - 情報マネジメントシステム認定センター(ISMS-AC)
ITサービスマネジメントシステム(ISO/IEC20000): 品質向上のための取り組み | NECネクサソリューションズ
ITサービスマネジメントにおける成功事例体系化した書籍群をITILといいます。
- 英語 : Information Technology Infrastructure Library
サービスの企画・構築・運用というシステムライフサイクルに沿って、5つのカテゴリに分類されています。
- サービス・ストラテジ
- サービス・デザイン
- サービス・トランジション
- サービス・オペレーション
- 継続的なサービス改善
ITILとは – システム管理者なら押さえておきたい、ITIL用語解説 | ITサービス管理ソリューション「SmartStage|スマートステージ」
ISO/IEC 20000は、ITサービスマネジメントシステムに関する国際規格です。
ISO/IEC 20000の日本版が、JIS Q 20000です。
JIS Q 20000は、2部構成になっています。
JIS Q 20000-1は、サービス提供者に対する要求事項が定義されています。
- サービスマネジメントシステムの一般要求事項
- 経営者の責任 / 他の関係者が運用するプロセスのガバナンス / 文書の運用管理 / 資源の運用管理 / SMS の確立及び改善
- 新規サービス又はサービス変更の設計及び移行
- 一般 / 新規サービス又はサービス変更の計画 / 新規サービス又はサービス変更の設計及び開発 / 新規サービス又はサービス変更の移行
- サービス提供プロセス
- サービスレベル管理 / サービスの報告 / サービス継続及び可用性管理 / サービスの予算業務及び会計業務 / 容量・能力管理
- 情報セキュリティ管理 : 以下を特定するために変更要求を評価しなければならない
- 新たな情報セキュリティリスク、又は変化した情報セキュリティリスク
- 既存の情報セキュリティ基本方針及び管理策への潜在的影響
- 関係プロセス
- 事業関係管理 / 供給者管理
- 解決プロセス
- インシデント及びサービス要求管理
- 問題管理 : 潜在的な問題を低減させるために,予防処置をとらなければならない。
- 統合的制御プロセス
- 構成管理 : CMDBに記録されているCIの原本を,物理的又は電子的にセキュリティが保たれた書庫で管理しなければならない。
- 変更管理 : 変更要求の受入れについての意思決定では,リスク,事業利益及び技術的実現可能性を考慮しなければならない。
- リリース及び展開管理
JIS Q 20000-2は、実践のための規範が定義されています。
次回の勉強内容
YAMLって何?
YAMLは、データ構造の書き方です。
入門Python3のサンプルコードでYAMLに触れてみます。
これが、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.
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) $
思い出の一枚
Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。
- 前回は、Slack-Python-Onboarding-Tutorial をできるようにローカル環境に必要なものを準備しました。
- チュートリアル用のSlack AppとBotユーザーを作成します。
- 作ったBotにイベントを登録します。
- 環境変数にアプリの資格情報を設定します。
- 認証の設定を行います。
- 思い出の一枚
前回は、Slack-Python-Onboarding-Tutorial をできるようにローカル環境に必要なものを準備しました。
今回は、Slack-Python-Onboarding-Tutorialをできるように Slack側の準備をします。
チュートリアル用のSlack AppとBotユーザーを作成します。
新規にSlack Appをapi.slack.comで作ります。
作ったAppがSlackと対話できるようにBotユーザを作ります。
作ったBotにイベントを登録します。
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]を変えます。
環境変数にアプリの資格情報を設定します。
チュートリアルの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") # 省略
認証の設定を行います。
- 左サイドのメニューにある[OAuth & Permissions]からページを開いて[Redirect URLs]を設定します。
- [Add New Redirect URL]ボタンを押下してRedirect URLを入力し、[Add]ボタンで追加します。
- Redirect URLには、{Ngrokで表示されているURL} + {app.pyのthanksメソッドのルートである/thanks} の値を設定します。
- {Ngrokで表示されているURL}は、起動のたびに変わるのでその都度[Change]ボタンで[Request URL]を変えます。
- [Save URLs]ボタンを押下して保存します。
思い出の一枚
PythonのウェブフレームワークであるFlaskを学ぶ。
Flaskは、Pythonのウェブフレームワークです。
- 和英 : (flǽsk)〔実験で使う〕フラスコ〔ウイスキーなどの〕フラスコ瓶
Flaskは、Bottleと同じくらい簡単に使えるが、Facebook認証やデータベース統合など、本格的なウェブ開発で役に立つ様々な拡張を備えている。
ウェブフレームワークは、クライアントからの要求とサーバの応答を処理してくれます。
Python Webフレームワーク Django vs Pyramid vs Flask 2015年12月 - Qiita
WSGIライブラリのwerkzeugとjinja2が入っています。
WSGIとは、PythonでのWebサーバとWebアプリケーションをつなぐインターフェースを定義した仕様です。
- 正式名称 : Web Server Gateway Interface
- 読み方 : ウィズギー
- 定義 : PEP 333 -- Python Web Server Gateway Interface v1.0 | Python.org
WSGIはJavaにおけるJava Servelet APIと同じように,WebサーバとWebアプリケーション間の汎用的なインターフェースを定義しています。WSGIを利用することで,WebサーバとWebアプリケーションの実装を切り離すことができ,WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになりました。
gihyo.jp
本を見ながら実際にFlaskを使ってみます。
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用のテンプレートエンジンです。
テンプレートの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
Slack-Python-Onboarding-Tutorial をできるように必要なものを準備する。
- 前回は、Incoming webhooksでメッセージを送ってみました。
- Incoming webhooksではない方法でメッセージを送れるようにSlack-Python-Onboarding-Tutorialをやりたいとおもいます。
- Pythonをインストールします。
- チュートリアルのリポジトリをクローンします。
- 仮想環境を準備します。
- local環境へLANの外からアクセスできるようにするNgrokをインストールします。
- Web API用のテストツールPostmanをインストールします。
- 次回は、Slack側の準備をします。
- 環境
前回は、Incoming webhooksでメッセージを送ってみました。
Incoming webhooksではない方法でメッセージを送れるようにSlack-Python-Onboarding-Tutorialをやりたいとおもいます。
Onboardingは、新規メンバへの教育的なことです。
今回は、チュートリアルに必要なものを準備します。
Pythonをインストールします。
パッケージ管理ツールの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 ドキュメント
チュートリアルのリポジトリをクローンします。
# コピーした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で仮想環境を作ります。
# クローンしたディレクトリへ移動します。 $ 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
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
はじめてのPythonでSlackとつながってみる
- SlackAPIってなんだ?
- 1. Webhockする用のAppを用意する
- 2. Incoming Webhooksを設定する
- 3. PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる
- うまく行かなかったこと
- 環境
SlackAPIってなんだ?
よくわからないでSlackのIncoming Webhooksを実際に使ってみます。
とりあえず概要だけ見ておきます。
Webhookとは?
Webhookの説明を見ると「通知する、Webhookを送る」などの言葉が用いられているが、
これはPOSTリクエストのことを指している。
Webhookとは? - Qiita
じゃ、SlackのIncoming Webhooksって?
get.slack.help
1. Webhockする用のAppを用意する
2. Incoming Webhooksを設定する
Incoming Webhooksを設定する
以下サイトの[Incoming Webhooksのエンドポイントを取得する]に従ってIncoming Webhooksを設定する
qiita.com
3. PythonでIncoming Webhooksを使ってSlackにメッセージを送ってみる
Pythonのインターネットにアクセスできる外部モジュール「Requests」をインストールする
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
もう少し使ってみる
slack_webhook.pyというPythonのファイルを作って実行するともう少し楽しいメッセージが送信できた。
はじめてのPythonでSlackとつながってみる
うまく行かなかったこと
リクエストにTokenがなくて not_authed が返却されました。
よくわからないでブラウザのURL欄に https://otsecbsol.slack.com/api/conversations.createと入力してみました・・・。
{"ok":false,"error":"not_authed"}
Apacheを触ってみる
Apacheは、Webサーバです。
- 正式名称 : Apache HTTP Server
「Apacheという名前はインディアン部族、Apacheに対する敬意の念をあらわすため選んだ」らしいです。
Webサーバで利用されているアプリケーションで、Netcraft社によるとシェアはここ数年下がりつつあるとはいえそれなりにあります。
Web Server Survey | Netcraft
Webサーバは、HTMLファイルやそれに付随する画像などのファイルをクライアントコンピュータに配信するサーバコンピュータのことです。
インストールの方法
起動と停止の方法
ターミナルを使います。
# 起動する $ apachectl start # 停止する $ apachectl restart # 再起動する $ apachectl restart
Apacheを起動してからブラウザで「http://localhost:80」を表示すると「It works!」と表示されます。
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 を使います。
何のアプリケーションとポート番号がバッティングしているか判ったら方法は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>