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

PHPでの変数名の決め方

ルール1:変数名の前には$をつける

じゃぁ「$34」でいい?

ルール2:$の次はアルファベットかアンダースコアから始める

じゃぁ「$A-34」でいい?

ルール3:使えるのは「aからz」「AからZ」「_」(厳密にはもっとあります。)

じゃぁ「$A_34」でどうだ
PHP: 基本的な事 - Manual

ルール4:規約には従いましょう。

みんなてんでばらばらだったら他の人が見てさっぱり分からない・・・ただ、規約っていっぱいあるし・・・・。
なので基本的なマナーレベルは押さえましょう。

マナー1:大文字と小文字の違いだけの変数名を分けて使わない。

「$a_34」「$A_34」読む人も誤記なんだかわざとなんだか・・・分かりにくい。次に書く時だって・・・・間違いやすい。

マナー2:名前に明確な単語を選んで情報を詰め込む

「$A_34」は何に使うためにこの変数を作っているか不明です。
実は、自分の年齢をこの変数に入れたかった・・・のであれば「$myoldis34」みたいな。

マナー3:誤解されない名前にする

年齢は毎年変わります・・・今の年齢を表したければ「$nowmyold」な感じ。

マナー4:読みやすく単語の区切れが分かるように。

単語の区切り方は、Pascal形式とかCamelCaseとかスネーク形式とかいろいろあって規約ごとに違います。
ここは「_」でつなぐスネーク形式で「$now_my_old」な感じ。

f:id:ponsuke_tarou:20181210195305j:plain

超ざっくりPHPってこんなもの

PHPはWebページ作成するサーバサイドのプログラミング言語です。

PHPがないWebサイトを表示する流れ

  1. [www.sample.com/monkey.html]をロケーションバーに入力してEnter!
  2. ブラウザは「www.sample.com」さんへ「monkey.htmlをくれ」、っと要求します。
  3. 「www.sample.com」さんのApache(Webサーバプログラム)は、monkey.htmというファイルlを探してブラウザへ渡します。
  4. ブラウザはもらったmonkey.htmlをHTMLタグに従って表示します。

PHPがあるWebサイトだとWebサーバの中で「いろいろやって」くれます。

2. で要求されたファイルをPHPが「いろいろやって」造ってくれるのです。
3. にある、「www.sample.com」さんのApacheの中でただファイルを探すのではなく、
入力された情報や状態に合わせて「いろいろやって」くれます。

たとえば、
・ 入力された内容をデータベースに保存する(アンケートページや会員登録ページとか)
・ メールを送る(予約ページとか)
・ ユーザー情報から好みのページを造る(会員ページとか)

PHPは「フリー」です。

無料のフリー

PHPは、タダで手に入ります。
ライセンス料、サポート料、アップグレード料もダタです。
※. 個人使用でない場合や別途ツールなんかを使う場合は調べてくださいね。

自由のフリー

PHPオープンソースなので中身をだれでも参照できます。
ソースは見たくないけど機能の使い方は知りたいっていう時でも世の中の誰かが調べた情報がインターネットにたくさん散らばっています。
自由に使っていいんです!(ある程度のルールは守ってくださいね)

造るのに好きなものを自由に選んでいいんです!
OSはWindowsMac OSLinux、Slaris、Unixで使えます。特別な専用サーバを用意しなくても造れるんです!
Webサーバプログラムだって特別なものを用意しなくていいんです!
CGI規格をサポートしていれば、Apach、Microsift Internet InfomationServer ( IIS ) でもいいのです。
データベースもいろいろ選べます。
MySQLOracleMicrosoft SQL ServerSybasePostgreSQLといろいろあります。
ODBC規格のデータベースもサポート済みです。

PHPは情報がたくさんあります。

PHPは近年、たくさんのサイトで使われています。
個人のサイトから大きなサイトまでたくさん!
だから、書籍や雑誌、Webサイトなどでたくさんの情報を参考にできます。
ちょっと使うにも、お仕事で使うにも分からないことがあっても安心タイプです。

LDAP:なんとなくわかった気がしている言葉をはっきりと

LDAPとは、ディレクトリサービスを提供するサーバへアクセスするときに使うプロトコルです。

正式名称 : Lightweight Directory Access Protocol
TCPポート番号の「389」(ウェルノウンポート)を使ってサーバへ接続します

www.atmarkit.co.jp

thinkit.co.jp

X.500という規格の1つであるDAPというプロトコルを軽量化(Lightweight)したものです。

DAPはとても重かったので軽くしたそうです。
例えば、オープンソースLDAPであるOpenLDAPWindowsでよく使われるActive DirectoryなどにLDAPは実装されています。

ディレクトリサービスとは、ネットワークの情報を一元管理し情報提供などを行うサービスです。

ネットワーク内のユーザ情報や機器情報を管理して、参照・更新などを行うサービスです。
ユーザ名から部署や電話番号を検索したり、プリンターの情報を参照できたりします。

例えば、名前解決してくれるDNSオープンソースLDAPであるOpenLDAPWindowsでよく使われるActive Directoryなどがディレクトリサービスです。

https://www.kagoya.jp/howto/wp-content/uploads/kagoya1804-kgr1_50_dns02-.jpg
【図解】DNSサーバーとは?設定・変更と確認方法 | カゴヤのサーバー研究室

http://image.gihyo.co.jp/assets/images/admin/serial/01/ad-linux2017/0001/001r.jpg
第1回 認証統合の概要[Active Directory編]:Active DirectoryとLinuxの認証を統合しよう【2017年版】|gihyo.jp … 技術評論社

階層型にデータを管理するデータベースを使います。

リレーショナルデータベースとは違うのです。
ディレクトリサービスと設定によってはリレーショナルデータベースも使えます。
ディレクトリサービスのように更新より参照が多く組織などから情報を見つけていく場合は階層型のデータベースのが向いています。

http://software.fujitsu.com/jp/manual/manualfiles/M050000/B1WN4901/02/irepsrc/dit.gif
1.2.2 LDAPとは

https://www.turbolinux.co.jp/products/server/11s/user_guide/ldaptree02.jpg
Turbolinux 11 Server: ユーザーガイド

https://techinfoofmicrosofttech.osscons.jp/index.php?plugin=ref&page=LDAP%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%BB%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86&src=2_DIT%28DirectoryInformationTree%29.png
FrontPage - マイクロソフト系技術情報 Wiki

f:id:ponsuke_tarou:20181205000802j:plain

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

  • 環境

MacにPythone3をインストールしたので、ライブラリをインストールします。
ponsuke-tarou.hatenablog.com

インターネットにアクセスするライブラリは標準で「urllib」がありますが、「Requests」のほうが簡単らしいです。

はじめてのPythonなので簡単な方を選びます。

pipコマンドはPyPIからライブラリをインストールして設定までをしてくれるパッケージ管理システムです。

Pythone3.4以降であれば標準ではいっています。

PyPIは、Pythonでのサードパーティのライブラリを公開しています。

正式名称 : Python Package Index
読み方 : ぱいぱい
pypi.org

MacのPython3では「pip3」というコマンドになります。

$ pip3 --version
pip 9.0.3 from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (python 3.6)

$ pip3 --help

Usage:   
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible dependencies.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING,
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.
  --trusted-host <hostname>   Mark this host as trusted, even though it does not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in
                              PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine whether a new version of pip is available for
                              download. Implied with --no-index.

pip3コマンを使ってRequestsをインストールします。

# Requestsをインストール
$ pip3 install requests
Collecting requests
  Downloading https://files.pythonhosted.org/packages/ff/17/5cbb026005115301a8fb2f9b0e3e8d32313142fe8b617070e7baad20554f/requests-2.20.1-py2.py3-none-any.whl (57kB)
    100% |████████████████████████████████| 61kB 1.6MB/s 
Collecting idna<2.8,>=2.5 (from requests)
  Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 6.2MB/s 
Collecting urllib3<1.25,>=1.21.1 (from requests)
  Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
    100% |████████████████████████████████| 122kB 3.7MB/s 
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 4.2MB/s 
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://files.pythonhosted.org/packages/56/9d/1d02dd80bc4cd955f98980f28c5ee2200e1209292d5f9e9cc8d030d18655/certifi-2018.10.15-py2.py3-none-any.whl (146kB)
    100% |████████████████████████████████| 153kB 3.0MB/s 
Installing collected packages: idna, urllib3, chardet, certifi, requests
Successfully installed certifi-2018.10.15 chardet-3.0.4 idna-2.7 requests-2.20.1 urllib3-1.24.1
You are using pip version 9.0.3, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

# インストールされたことを確認する
$ pip3 list
Package    Version   
---------- ----------
certifi    2018.10.15
chardet    3.0.4     
idna       2.7       
pip        18.1      
requests   2.20.1    
setuptools 39.0.1    
urllib3    1.24.1    

pip3コマンドのバージョンが古い場合はアップグレードします。

qiita.com

インターネットの通信を安全にするIPsec

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

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

  1. IKEIPsecの鍵交換のためのプロトコルであり,ポート番号80が使用される。
  2. 鍵交換プロトコルとして,HMAC-SHA1が使用される。
  3. トンネルモードを使用すると,暗号化通信の区間において,エンドツーエンドの通信で用いる元のIPのヘッダを含めて暗号化できる。
  4. ホストAとホストBとの間でIPsecによる通信を行う場合,認証や暗号化アルゴリズムを両者で決めるためにESPヘッダでなくAHヘッダを使用する。

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

インターネットの通信で使われるプロトコルをIPといいます。

  • 正式:Internet Protocol = Internet(インターネット) + Protocol(手順)

https://www.infraexpert.com/studygif/ipsecz13.gif
IPsec - AH・ESP・IKE

プロトコルとは、パソコンなどの機械同士が通信するときのお約束ごとのことです。

https://www.infraexpert.com/studygif/networking12.gif
ネットワーク - プロトコルとは

インターネットの世界には危険がいっぱいです。

ponsuke-tarou.hatenablog.com

IPsecは、IPでの暗号化技術を使って安全にインターネットを使うための通信プロトコルです。

  • 正式:Security Architecture for IP または IP Security Architecture = Security(安全) + Architecture(構造) + for IP(IPのための)

IPsecは、認証とカプセル化と鍵交換のプロトコルを組み合わせています。

それぞれのプロトコルで種類はいろいろ選べます。

https://networklessons.com/wp-content/uploads/2015/08/ipsec-framework-protocols.png
IPsec (Internet Protocol Security)

https://i2.wp.com/www.bilisimonline.net/wp-content/uploads/2016/06/IPsec-framework.png?resize=620%2C330
IPSec (Internet Protocol Security) |

IPsecで「どんなプロトコルアルゴリズムを使うよ」という合意をSAといいます。

  • 正式 : Security Association = Security(安全) + Association(つながり)

共有鍵暗号方式をIPsecでは使っていて、そのアルゴリズムはいろいろ選べます。だから、SAでどんな物を使うかきっちり定義しておきます。

SAが確定するとSPIという32bitの整数が割り当てられ、IPsecで通信する時はこのSPIをいつもくっつけて暗号化のアルゴリズムやどんな鍵かの情報などがわかるようにします。
  • 正式 : Security Pointer Index = Security(安全) + Pointer(指針) + Index(索引)

http://image.itmedia.co.jp/ait/articles/0011/27/pc-phase.gif
http://image.itmedia.co.jp/ait/articles/0011/27/pc-key.gif
IT管理者のためのIPSec講座 (2/3):技術解説 - @IT

使う共通鍵を交換してSAの合意を取る鍵交換プロトコルが、IKEです。

  • 正式 : Internet Key Exchange = Internet(インターネット) + Key(鍵) + Exchange(交換する)

https://www.ipa.go.jp/security/pki/images/image081.png
PKI関連技術に関するコンテンツ

https://tech.nikkeibp.co.jp/it/article/COLUMN/20071012/284162/zu11s.jpg
https://tech.nikkeibp.co.jp/it/article/COLUMN/20071012/284162/zu12s.jpg
攻略編:全体をつかんで逆から見る,日経NETWORK流で理解しよう | 日経クロステック(xTECH)

IKEは、SAを合意するときも鍵を交換するときもISAKMP(Internet Security Association and Key Management Protocol / Internet SA と 鍵管理プロトコル)というプロトコルを使い、ISAKMPメッセージ専用のUDPの500番のポートを使います。

データはESPという入れ物に入れて暗号化して送ります。

  • 正式 : Encapsulating Security Payload = Encapsulating(カプセル化している) Security(安全な) + Payload(データ伝送されるパケットのヘッダー部を除いたデータの本体)

データが改ざんされていないことを確認できるようにMACというデータを付加します。

  • 正式 : Message Authentication Code = Message(メッセージ) + Authentication(認証) + Code(コード)
  • 日本語 : メッセージ認証コード

http://image.itmedia.co.jp/ait/articles/0011/27/pc-mac.gif
IT管理者のためのIPSec講座 (3/3):技術解説 - @IT

https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/MAC.svg/512px-MAC.svg.png
MAC(メッセージ認証コード)とは - CubicLouve

MACは送信元で鍵と任意のデータで作られたハッシュ値です。送信先で同じ鍵と任意のデータでハッシュ値を作って受信したものと比較して認証を行います。
このやり方をメッセージダイジェストといいます。

ponsuke-tarou.hatenablog.com

SPIMAC・通信のシーケンス番号をAHというパックにして通信する時パケットにくっつけます。

  • 正式 : Authentication Header = Authentication(認証) + Header(先頭部)
HA自体には暗号化機能はなく、入れ物です。

https://www.cs.odu.edu/~cs779/IPv6/security/img004.GIF
Authentication Header (AH)

http://www.cs.ru.nl/~ths/a3/html/h8/8-27s.jpg
A3 H8 Network Security

https://image.slidesharecdn.com/ipsecandvpn-160313101807/95/ipsec-and-vpn-40-638.jpg?cb=1457865892
IPSec and VPN

f:id:ponsuke_tarou:20181020222446j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

セキュリティを意識したプロトコル達

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

暗号化や認証機能を持ち,遠隔にあるコンピュータを操作する機能をもったものはどれか。

ア. IPsec イ. L2TP ウ. RADIUS エ. SSH
平成26年秋期問11 SSH|情報処理安全確保支援士.com

IPsecは、IPでの暗号化技術を使った安全なインターネット用の通信プロトコルです。

ponsuke-tarou.hatenablog.com

L2TPは、送信情報を運ぶトンネルのプロトコルです。

  • 正式 : Layer 2 Tunneling Protocol

ponsuke-tarou.hatenablog.com

https://beginners-network.com/image/vpn_l2tp_ipsec_1.gif
L2TP/IPsec - ネットワーク入門サイト

RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。

  • 正式 : Remote Authentication Dial In User Service
  • 読み方:ラディウス、ラディアス

流れは、

  1. 不正なクライアントやサーバが使えないように、クライアントとサーバの間に共通暗号鍵を設定します。
    • この共通暗号鍵を「Shared Secret」といいます。
  2. クライアントから送られてきたユーザの情報で、サーバは認証を行います。
    • クライアントが送る情報を「Access-Requestメッセージ」といいます。
  3. サーバは、認証を行い結果をクライアントへ送信します。
サーバが送る応答 パケットの種別 意味
アクセス許可 Access-Accept 認証結果がOK
アクセス拒否 Access-Reject 認証結果がNG
アクセスチャレンジ Access-Challenge 不正アクセスを防ぐために
再度パスワードの入力などを要求

SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。

  • 英語:(Secure:安全) + (Shell:コマンド入力を受け付けて解釈するプログラム)

Telnetも別のコンピュータと通信するプロトコルですが、暗号化はしていません。

残念なことに、暗号化していないのでのぞき見し放題です。

https://img-en.fs.com/images/ckfinder/ftp_images/tutorial/telnet-protocol.jpg
https://community.fs.com/blog/which-client-software-is-better-for-telnet-and-ssh.html

そこでSSH!通信経路が暗号化されているのでインターネットなどを経由しても安全に通信できます。

http://www.tku.ac.jp/~densan/local/ssh/ssh-telnet.gif
SSHの利用方法

SSHプロトコルには、「SSH1」と「SSH2」の2種類があります。

SSH1は、RSA公開鍵暗号方式を使います。
SSH2は、DSA公開鍵暗号方式を使います。が、RSA公開鍵暗号が使えるようになり「SSH2でRSA公開鍵暗号を使う」がおすすめです。
RSAは特許の問題から使用が制限されており、特許問題を回避するためにDSAを採用したSSH2が登場したという背景があるものの特許は2000年9月で失効し、SSH2でもRSAを利用して認証できるようになりました。

SSHするには、接続先でsshdが動いている必要があります。

sshdはクライアントからの接続を受けつけて、鍵の交換・暗号化・認証・コマンド実行・データ交換をしてくれます。
種類は、OpenSSHSSH Tectia Server・Reflection for Secure IT等々・・・いろいろあります。

接続元でSSHしてくれるソフトウェアをSSHクライアントといいます。

種類には、OpenSSHPuTTY・Tera Term・Poderosa・RLogin・SSH Tectia Client・Reflection for Secure IT・WebSSH等々・・・すごくいろいろあります。

f:id:ponsuke_tarou:20181014235443j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

根性で不正ログインを頑張るブルートフォース攻撃

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

共通鍵暗号の鍵を見つけ出す,ブルートフォース攻撃に該当するものはどれか。

  1. 1組の平文と暗号文が与えられたとき,全ての鍵候補を一つずつ試して鍵を見つけ出す。
  2. 平文と暗号文と鍵の関係を代数式に表して数学的に鍵を見つけ出す。
  3. 平文の一部分の情報と暗号文の一部分の情報との間の統計的相関を手掛かりに鍵を見つけ出す。
  4. 平文を一定量変化させたときの暗号文の変化から鍵を見つけ出す。

平成25年秋期問9 ブルートフォース攻撃|情報処理安全確保支援士.com

不正アクセスや不正ログインする攻撃はよくあります。

scan.netsecurity.ne.jp

tech.nikkeibp.co.jp

www.pixiv.net

攻撃 手法
ブルートフォース攻撃 パスワードをどんどん変えて正解を探す
リバースブルートフォース攻撃 IDをどんどん変えて正解を探す
パスワードリスト攻撃 ヒントを仕入れてIDとパスワードを推測して正解を探す
パスワードスプレー攻撃 IDとパスワードをどんどん変えて正解を探す

ブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してパスワードや鍵を見つける攻撃です。

  • 別名:ブルートフォースアタック、総当たり攻撃
  • 英語 : (brute force:力ずくの) + (attack: 攻撃)

辞書ツールやら考えられるすべての情報を使って文字列の組み合わせを全て試していく、根性の攻撃です。
パスワードの文字数や文字種が少ないと被害にあいやすいです。

f:id:ponsuke_tarou:20181010210728p:plain
ブルートフォースアタック(総当たり攻撃)とは?そのやり方・実際にかかる時間・対策方法は?

独立行政法人情報処理推進機構セキュリティセンターが、パスワードに使用している文字の種類別に解読の所要時間をまとめたもの
https://japan.norton.com/blog/wp-content/uploads/2017/11/brute-force-attack-01.png
ブルートフォースアタックとは?実験から分かる危険性と有効な4つの対策

リバースブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してIDを見つける攻撃です。

  • 別名:リバースブルートフォースアタック、逆総当たり攻撃
  • 英語 : (reverse:逆の) + (brute force:力ずくの) + (attack: 攻撃)

世の中には、規定回数パスワードを間違えるとロックされるアカウントロックというものがあります。
残念なことに、IDを変えていくのでアカウントロックされにくいです。
ブルートフォース攻撃の逆で、パスワードに固定文字列を使ってIDを変えながら試していきます。

http://www.ne.senshu-u.ac.jp/~proj28-19/tobe/goku-main/image-s/blue-reverse.png
リバースブルートフォース攻撃

f:id:ponsuke_tarou:20201005214643j:plain
新潟県月岡温泉したしみの宿東栄館のお部屋-松風

パスワードリスト攻撃は、どっかで仕入れた情報をもとにIDとパスワードを推測して攻撃します。

  • 別名:リスト型攻撃、パスワードリスト型攻撃、アカウントリスト攻撃、リストベース攻撃、リストベースアタック、リストアタック

いろんなサイトで同じようなIDやパスワードを使っていると被害にあいやすいです。

https://www.trendmicro.com/content/dam/trendmicro/global/ja/security-intelligence/research-reports/threat-solution/access/figure-accountlist-20130910.png
アカウントリスト攻撃 | トレンドマイクロ

https://www.asobou.co.jp/blog/wp-content/uploads/2016/09/a51b890d351455b0845e3f4ea5214711.jpg
【情報セキュリティ】パスワードリスト攻撃の手法と対策 : ビジネスとIT活用に役立つ情報

https://www.netone.co.jp/knowledge-center/blog-column/files/knowledge_takumi_060_1.png
F5 BIG-IPとMcAfee SIEMによるパスワードリスト攻撃対策ソリューション | ネットワンシステムズ

パスワードスプレー攻撃は、ブルートフォース攻撃リバースブルートフォース攻撃をいい感じに合わせています。

  • 別名:low-and-slow攻撃

japan.zdnet.com

決まった期間に決まった回数ログインに失敗するとアカウントロックがかかります。
だから、「パスワードを固定していろんなIDを試す」をひたすら繰り返します。
アカウントロックされたら別のIDでまた試します。
ついでに、不正を検知されないようにIPアドレスを変えたり、時間をずらして実行したりします。

https://stat.ameba.jp/user_images/20180404/20/mongol-sky/00/2d/j/o0461021814164100079.jpg?caw=800
不正ログインを狙った「パスワードスプレー」攻撃への注意を呼び掛け | IoT-sky

https://cybersecurity-jp.com/wp-content/uploads/2019/03/img_30629_1.png
パスワードスプレー攻撃とは?仕組みと被害の特徴、対策方法について徹底解説

f:id:ponsuke_tarou:20181010224357j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com