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

平成28年春期問24 JIS Q 20000-1が要求している事項|情報処理安全確保支援士.com

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
思い出の一枚

次回の勉強内容

勉強中・・・・

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.0.1 documentation

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

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

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

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

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を使ってみる

Webhockってなんなのさ!

qiita.com

SlackのIncoming Webhooksってなんなのさ!

get.slack.help

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

f:id:ponsuke_tarou:20181121234139p:plainf:id:ponsuke_tarou:20181121234258p:plainf:id:ponsuke_tarou:20181121234453p:plainf:id:ponsuke_tarou:20181121234745p:plain

f:id:ponsuke_tarou:20181121234657p:plain
[App Name]を入力 > [Department Slack Workspace]を選択 > [Create App]ボタンを押下
f:id:ponsuke_tarou:20181121235053p:plain
[Incoming Webhooks]を「ON」にする
f:id:ponsuke_tarou:20181121235446p:plain
同じページの下にある[Add New Webhoock To Workspace]を押下
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