- 投稿日:2019-05-02T22:22:29+09:00
一足遅れて Kubernetes を学び始める - 04. kubectl -
ストーリー
- 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
- 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
- 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
- 一足遅れて Kubernetes を学び始める - 04. kubectl -
- 一足遅れて Kubernetes を学び始める - 05. workloads その1 -
- 一足遅れて Kubernetes を学び始める - 06. workloads その2 -
前回
一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -では、RaspberryPiの環境にKubernetesを導入しました。無事、動作確認ができたので、さっそく学習していきたいです。
参考
「Kubernetes完全ガイド」を読んで進めてみます。ソースコードはこちら
※ オリジナルはこちら以前の投稿では、入門 Kubernetesを参考にしていましたが、Kubernetes完全ガイドの方が網羅的に学べて良かったで、そちらを使いました。
kubectl
Kubectl is a command line interface for running commands against Kubernetes clusters
※ https://kubernetes.io/docs/reference/kubectl/overview/
kubernetesを操作するためのCLIです。
よく使うものを私なりに整理し、入門時に最小限覚えておけば良いものをまとめました。
1. apply
pi@raspi001:~ $ cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - name: nginx-container image: nginx:1.12 EOF pi@raspi001:~ $ kubectl apply -f sample-pod.yaml pod/sample-pod createdKubernetesでは、基本的にはマニフェストファイルを作成し、
apply
で適用するのが一般的のようです。それは、新規作成だけでなく、更新や削除も同様です。create
やreplace
,delete
といったCLIもありますが、apply
でも同様の操作ができるため、使い分ける必要はあまりありません。ただし、注意点として、apply
で登録したマニュフェストファイルは履歴として保存されていますが、フィールドを削除した場合はデフォルト値に設定されます。(まあ、そりゃそうだと思います)※ Kubernetes: kubectl apply の動作
2. set, get
pi@raspi001:~ $ kubectl set image pod sample-pod nginx-container=nginx:1.13 pod/sample-pod image updated pi@raspi001:~ $ kubectl get pod sample-pod NAME READY STATUS RESTARTS AGE sample-pod 1/1 Running 1 13mkubectlでは、どのリソース種類(
pod
,service
,etc)で、どのリソース名なのかを教えてあげる必要があります。
また、フィルタリングする機能としてlabel
があります。sample-pod-label.yamlapiVersion: v1 kind: Pod metadata: name: sample-pod labels: env: prod app: sample spec: containers: - name: nginx-container image: nginx:1.12
pi@raspi001:~ $ kubectl get pod -l env=prod No resources found. pi@raspi001:~ $ kubectl apply -f sample-pod-label.yaml pod/sample-pod configured pi@raspi001:~ $ kubectl get pod -l env=prod NAME READY STATUS RESTARTS AGE sample-pod 1/1 Running 0 7m23s更に詳細の情報が必要な場合は、
describe
を使います。pi@raspi001:~ $ kubectl describe pod sample-pod Name: sample-pod ...
※
edit
という直接編集する方法もありますが、一時的な対応のみに利用するべきとのことです。
せっかくの宣言的ファイルが意味ないですよね。余談ですが、
service
をsvc
という風に省略できたりします。
※ (備忘)kubectl コマンドでの短縮リソース名3. debug
pi@raspi001:~ $ kubectl exec -it sample-pod /bin/sh # exit pi@raspi001:~ $ kubectl logs sample-pod pi@raspi001:~ $ kubectl cp sample-pod.yaml sample-pod:/var/sample-pod.yaml pi@raspi001:~ $ kubectl port-forward sample-pod 8888:80 Forwarding from 127.0.0.1:8888 -> 80 Forwarding from [::1]:8888 -> 80どれも
pod
に対する操作なためリソース種類の指定はありません。どれも開発時に必要が迫られれば使う感じですね。99. top
こちら、どうしても動作できませんでした... ??
今はそこまで必要としないので、一旦見送ります。
calico
だかflannel
とかが関係しているっぽいのですが、理解が浅いため未解決です。お片付け
pi@raspi001:~ $ kubectl delete pod sample-pod pod "sample-pod" deleted複数のpodを扱っているなら、
delete
よりもapply --prune
の方が良いですが、今回は単体podなので、直接delete
しました。おわりに
入門当初は、どれほど覚えなくてはいけないのかと不安になっていたのですが、
蓋を開けてみると、そこまで多くはありませんでした。(まだ知らないものは多いと思いますが)
規則性として、 リソース種類とリソース名を指定する習慣にも徐々に慣れてきました。
面倒なときは、kubectl get all
で全部出すという荒業も覚えました。(笑)次回はこちらです。
- 投稿日:2019-05-02T17:39:26+09:00
Mac mini 2018にWindow10をインストールする手順
Mac mini 2018にWindow10をインストールしたときのメモです。
用意するもの
- Mac mini 2018(恐らくほかのMacでも同じだと思われる。)
- Windows10がインストールされたPC(VMアプリを使ってもできそうだがSSDのマウント周りで壁にあたる。)
- 外付けにするM.2 SSD (Samsung 970 evo 1Tで成功しました。)
- 外付けUSB SSDケース (ali express等で売られているUSB3.1ケースなど。2000円位)
- 外付けM.2ケース (eGPUケースで代替可能。USBケースのままでもよいが速度的に不利なので最後にこれに変更。)
- WinToUSB 3.9 (3.9で成功しました。)
- Windows.isoファイル。(MSのサイトからこのファイルをダウンロードして落とします。)
- WindowsSupport (Bootcampのドライバ類。osxのbootcampアプリで落としてきます。)
手順
- 外付けUSB SSDケースにSSDを装着し「Mac OS拡張(ジャーナリング)」「 GUID パーティションマップ」でフォーマットします。
- Windows10がインストールされたPCに1.の外付けSSDをそのまま接続します。
- Windows10のディスクの管理からマウントされたSSDの第2パーティションを削除します。(EFIパーティションではない方。)
- 第2パーティションをNTFSでフォーマットします。EFI側はそのままにしておきます。
- WinToUSB 3.9を起動します。
- イメージファイルにWindows.isoファイルを指定し次へボタン。
- ディスクを選択でUSB接続された外付けSSDを選択します。(USB以外NGです。TB3ディスクは不可)
- WinToUSBのWizardでNextボタンを押していけば外付けSSDの完成です。
- Macに外付けSSDを繋ぎ変えてoptionキーを押しながら再起動で外付けSSDから起動します。
- Windows10が起動したのちbootcampで落としたWindowsSupportのドライバーを入れます。(固まる場合あり。デバイス毎に個別に入れなおした方がよい。)
SSDの高速化
- USB3.1はすでに規格が古くなってしまった感があります。USB4に移行されるらしい。 amazon.comなどで売られている外付けM.2ケースを使った方が良いとおもいます。 速度が2800MB/s位でます。
- GPU用の大型eGPUケースを外付けM.2 SSDドライブにすることも可能です。M.2対応のPCIexのカードを入れます。
T2チップの問題
- 外付けSSDから起動するためにはT2のセキュリティを解除する必要があります。 Mac起動時にcommand+Rで起動し起動セキュリティユーティリティを使って外部メディアからの起動を許可しておきます。
- 投稿日:2019-05-02T17:39:26+09:00
Mac mini 2018に繋げたSSDにWindow10をインストールする手順
Mac mini 2018に繋げたSSDにWindow10をインストールしたときのメモです。
MacでWindows10を使う場合にMac内部のSSDにbootcampを使ってでもできますがディスクを分けて外付けにした方がosxのディスクを減らす必要がなくなるため利点があると思います。
iPhoneアプリのプログラミング環境はOSXが必須になるためどうしてもMacが要ります。
Windowsの方がよい場合もあるため両OSのプログラミング環境があれば隙なしです。どんな言語もプログラミング環境がないと先に進めないため絶対的な用意が必要になります。
よりよいプログラミング環境こそがビジョンへの最善の近道な気もします。Mac mini 2018になってからCPUが劇的に良くなったためビルド時間なども改善されました。
用意するもの
- Mac mini 2018(恐らくほかのMacでも同じだと思われる。)
- Windows10がインストールされたPC(VMアプリを使ってもできそうだがSSDのマウント周りで壁にあたる。)
- 外付けにするM.2 SSD (Samsung 970 evo 1Tで成功しました。)
- 外付けUSB SSDケース (ali express等で売られているUSB3.1ケースなど。2000円位)
- 外付けM.2ケース (eGPUケースで代替可能。USBケースのままでもよいが速度的に不利なので最後にこれに変更。)
- WinToUSB 3.9 (3.9で成功しました。)
- Windows.isoファイル。(MSのサイトからこのファイルをダウンロードして落とします。)
- WindowsSupport (Bootcampのドライバ類。osxのbootcampアプリで落としてきます。)
手順
- 外付けUSB SSDケースにSSDを装着しMacに繋いだのち「Mac OS拡張(ジャーナリング)」「 GUID パーティションマップ」でフォーマットします。
- Windows10がインストールされたPCに1.の外付けSSDをそのまま接続します。
- Windows10のディスクの管理からマウントされたSSDの第2パーティションを削除します。(EFIパーティションではない方。)
- 第2パーティションをNTFSでフォーマットします。EFI側はそのままにしておきます。
- WinToUSB 3.9を起動します。
- イメージファイルにWindows.isoファイルを指定し次へボタン。
- ディスクを選択でUSB接続された外付けSSDを選択します。(USB以外NGです。TB3ディスクは不可)
- WinToUSBのWizardでNextボタンを押していけば外付けSSDの完成です。
- Macに外付けSSDを繋ぎ変えてoptionキーを押しながら再起動で外付けSSDから起動します。
- Windows10が起動したのちbootcampで落としたWindowsSupportのドライバーを入れます。(固まる場合あり。デバイス毎に個別に入れなおした方がよい。)
- 10.で起動時に固まる場合はリカバリモードに入ったのちこのコンピュータを初期状態に戻すでOS丸ごと初期化します。
SSDの高速化
- USB3.1はすでに規格が古くなってしまった感があります。USB4に移行されるらしい。 amazon.comなどで売られているThunderbolt3対応の外付けM.2ケースを使った方が良いとおもいます。 速度が2800MB/s位でます。ビルドも早くなります。
- GPU用の大型eGPUケースを外付けM.2 SSDドライブにすることも可能です。M.2対応のPCIexのカードを入れます。
T2チップの問題
- 外付けSSDから起動するためにはT2のセキュリティを解除する必要があります。 Mac起動時にcommand+Rで起動し起動セキュリティユーティリティを使って外部メディアからの起動を許可しておきます。外付け起動が使えないというのは開発環境にとっては悪でしかない気もします。物理的なメディアを超えたクローンが取れないからです。テスト環境で元環境を壊したくない場合があります。
Samsung 970 evoと970 evo plus
- 最近970 evo plusがリリースされたのですがこれはMac OSで使用するとクラッシュします。まだ解決できていない? 今回SSDは970 evoの方にしました。 信頼があるSSDを使った方があとでソースが全部消えてなくなったという事故を減らせます。 最低限ソースコードのバックアップ対策は必要です。 Macのタイムマシーンなどを用意してもいいと思います。
- 投稿日:2019-05-02T17:19:46+09:00
Macのターミナルで【Vue.js(Vue CLI 3系)】のvue コマンドを使えるようにするまでの話
そもそもなんでVue.js?
現在、WEBサイトのフロントエンド開発を主に仕事でしているのですが、フロントエンドエンジニアとしてJavaScriptのフレームワークのひとつぐらいまともにプログラミングできないとまずいよな〜と思ったのがきっかけです。
日本語のドキュメントもあり、フレームワークを調べてるときに比較的学習コストが少ないということで今回Vue.jsを選択しました。
現在は様々な機能が使えるVueCLIを使って開発するのがトレンドらしく、とりあえず触ってみよう的な試みです。Vue.jsについてはこちらの記事に詳しく書いてありました。
環境セットアップのための予備知識
OS環境 Mac OS 10.13.6(High Sierra) VueCLI 3系をインストールするにあたり、以下のようなサイトを参考にしました。
10分で始めるVue.js(基本編)
Vue CLI 3 をインストールしプロジェクトを作成する方法
Homebrewからnodebrewをインストールして、Node.jsをインストールするまで、、、。
いきなり、なじみのない言葉が、、、npm、homebrew、nodebrew、Node.js????
ということで調べて自分なりの解釈でざっくりと以下のように理解しました。
Node.js
WEBブラウザ以外でjsを動かすための環境のひとつ。
サーバサイドで動くJavaScriptのことでサーバサイドJavaScriptと呼ばれることもある。
従来のjavascriptととの違いは実行環境(内部的に構築されてるみたい)とライブラリからなっている(最初の時点である程度のモジュールが組み込まれているらしい)Homebrew
Macのターミナル用の※パッケージ管理システム
※パッケージ管理システムとは
ターミナル用のAppleストアやgoogleストア的なもの。それらが目的に応じていろいろ用意されている。
Ruby→gem/PHP→compser/などnpm
タスクランナー/モジュール(webpackやbrowserifyなど)などの開発環境系のパッケージ管理するためのもの
nodebrew
node.jsのversion管理するためのパッケージ管理システム
パッケージはそれぞれ、依存関係にあり、Vue.jsをインストールするための流れはざっくりこんな感じ
HomebrewをインストールするためにX codeをインストール
↓
nodebrewをインストールするため、Homebrewをインストール
↓
Node.jsとnpmをインストールするため、nodebrewをインストール
↓
VueCLIをインストールするため、Node.jsとnpmをインストール
(node.jsをインストールする際にnpmをインストールされる)↓
ようやく、VueCLIをインストール
セットアップ
それではいきましょうw
X codeをインストール
コマンドライン・デベロッパーツールをインストール
ターミナルから$ xcode-select --installコマンドを発行すると
以下のようにインストールを要求されて$ xcode-select --install xcode-select: note: install requested for command line developer tools同時にポップアップが出てくるので"インストール"を選択し利用規約に同意します。
Homebrewをインストール
Homebrewの公式サイトからコードをコピペしてEnterを押します。
途中でEnterの入力/インストールユーザのOSパスワードの入力を求められるので入力して進んでください。$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"インストールが確認するには以下のコマンドを実行できればインストールされたことになります。
$ brew doctornodebrewのインストール
$ brew install nodebrewインストールを確認するには
$ nodebrew -v情報が表示されたらインストールされてます!!
Node.jsとnpmのインストール
Node.jsの最新版をインストール
$ nodebrew install latestNode.jsを有効にします。
nodebrew use 先程インストールしたNode.jsのvernodeコマンドを使用するため、パスを通します。
#zshの場合は echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.zshrc #bashの場合は echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.bashrc先程追加したパスが動くようになり、nodeコマンドが使えるようになります。
#zshの場合は $ source ~/.zshrc #bashの場合は $ source ~/.bashrcnpmはNode.jsとともにインストールされます。
npmがインストールしたか確認
$ npm -vNode.jsがインストールしたか確認
$ node -vバージョンが表示されればOKです!!
Vue CLI(Vue.js)のインストール
npm install -g @vue/clivueコマンドを使うためのパスを確認
npm bin -g #/Users/xxxxxxx/npm/binvue コマンドを使用するためにパスを通す
$ export PATH=/Users/xxxxxxx/npm/bin:$PATHvueのインストールを確認
$ vue --versionバージョンが表示されればOKです!!
おしまい
とりあえず、Vueを動かす環境づくりはこんな感じでした。
- 投稿日:2019-05-02T15:20:41+09:00
[環境構築編] scala入門にあたってやったこと[Mac]
流れ
scala の開発環境構築のためにはまず、 jdk が必要らしいのでこれを入れる。
その次に、ライブラリ管理や scala のバージョン管理をしてくれる sbt というものを入れ環境構築をしていく。
最後に IDE と連携するための設定をする。
Mac に JDK を入れる
バージョンは適当に新しめのやつを入れた。とりあえず動いているっぽいので多分大丈夫だと信じてる。
JDK を入れるには brew を使った。ここでは brew のインストール方法については述べないので、各自入れてほしい。公式ページに行ったらすぐ入れられるはずだ。
brew に cask リポジトリの追加
リポジトリの追加は tap コマンドでできる。
brew update
で更新してから入れる。sh$ brew update $ brew tap caskroom/cask入れたリポジトリを確認する。
sh$ brew tap caskroom/caskJDK のインストール
下記でインストールできる。
sh$ brew cask install javasbt のインストール
sbt のインストールも brew から行える。
sh$ brew install sbt実行確認
sh$ sbt console [info] Loading project definition from ~/src/github.com/IkezoeMakoto/etc-trial/scala/app/src/project [info] Loading settings for project src from build.sbt ... [info] Set current project to demoProject (in build file:~/src/github.com/IkezoeMakoto/etc-trial/scala/app/src/) [info] Starting scala interpreter... Welcome to Scala 2.12.7 (OpenJDK 64-Bit Server VM, Java 12.0.1). Type in expressions for evaluation. Or try :help. scala> 1 + 1 res0: Int = 2 scala> "Hello World" res1: String = Hello WorldIntelliJ IDEA 連携
私は IntelliJ で開発しているのでこちらの IDE と連携するための設定もついでにしておく。
Plugin のインストール
Plugin はひとまず下記の2つをインストールした。
SDK の設定
「File」 → 「Project Structure」 → 「Project SDK」
インストールしたバージョンを指定してください。
お疲れ様でした。
- 投稿日:2019-05-02T02:13:22+09:00
UnityでのVSCodeの導入手順とおすすめ設定、拡張機能(Mac)
はじめに
Unityを使う際、デフォルトではスクリプトエディタとしてVisual Studioが設定されていますが、「VSCode便利だよ」と先輩エンジニアの方に勧めて頂いたので導入してみました。結果、色々カスタマイズできて便利だったので、備忘録として導入手順とおすすめ設定をまとめてみました。
VSCodeのインストール
下のリンクからダウンロードし、インストールする。
Download Visual Studio CodeUnityの設定
デフォルトのスクリプトエディタをVSCodeに変更する
[Unity] → [Preferences] → [External Tools] → [External Script Editor] → [Browse]
finderが開くので「Visual Studio Code.app」を探してきて選択する。[External Script Editor]に「Code」と表示されていればOK。
VSCodeのおすすめ設定と拡張機能
設定
自動保存
[File] → [Auto Save]にチェックをつける。
自動整形
[Code] → [Prefarences] → [Settings]
で設定画面を開く
下記3つの項目にチェックをつける。・Format On Paste
→ペースト時に自動でフォーマット
・Format On Save
→ファイル保存時に自動でフォーマット(自動保存では整形してくれないので、手動で「cmd+S」する必要あり)
・Format On Type
→入力した行を自動でフォーマットまた、後述の拡張機能「C# FixFormat」をインストールする。
これを入れて置かないと自動整形が働かないので注意。ミニマップを非表示
横に出てくるやつです。個人的にいらなかったので非表示にしました。
[Code] → [Prefarences] → [Settings]
で設定画面を開く。
以下の項目のチェックを外す
・Editor › Minimap: Enabled.metaファイルを非表示
デフォルトだと.metaファイルが表示されて邪魔なので非表示にします。
[Code] → [Prefarences] → [Settings]
で設定画面を開く。・Files:Exclude
の項目に以下を追加してOKを押す。
**/*.meta
拡張機能
C#
必須。C#が使えるようになる。
C# FixFormat
C#の自動整形ができるようになる。
Japanese Language Pack for Visual Studio Code
VSCodeの日本語化。
vscode-icons
Bracket Pair Colorizer
zenkaku
Debugger for Unity
C# XML Documentation Comments
MonoBehaviour Snippets
Classy Naming
C# Extensions
Rainbow CSV
参考
今日からUnity + Visual Studio Codeを用いた快適な開発生活(随時更新中)
VSCodeのオススメ拡張機能 24 選 (とTipsをいくつか)
VS CodeでUnityプログラミングしてる僕が入れてる拡張機能
- 投稿日:2019-05-02T01:43:32+09:00
Homestead MailHog を利用する
Laravel 簡単なアプリケーション作成(2)
イベントを利用して会員登録時にメールを送る機能を追加
Laravelを利用して簡単なアプリケーションを作成する手順
今回はイベントを使用して会員登録時にメールを送信する機能を追加するイベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。
環境
前回までの環境を利用する
手順概要
- メール送信設定
- イベントとリスナーファイルの設定
- リスナークラスの実装
メール送信設定
Homesteadに同梱される"MailHog"というSMTPサーバを使用する。
管理画面は
http://homestead.test:8025 にアクセスすることでGUI表示できる。sampleapp/.env を編集
sampleapp/.envMAIL_DRIVER=smtp MAIL_HOST=localhost MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=nullリスナーファイルの設定
通常、イベントとリスナーの実装が必要だが、イベントはLaravelに含まれるものを利用するためリスナーのみ実装する。
下記ファイルに追加してリスナーを定義する。app/Providers/EventServiceProvider.phpprotected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'App\Events\Event' => [ 'App\Listeners\EventListener', ], 'Illuminate\Auth\Events\Registered' => [ 'App\Listeners\RegisteredListener', ], ];sampleappディレクトリに移動し、下記コマンドを実行してリスナークラスを作成する。
app以下にListenerディレクトリが生成され、EventListener.php, RegisterListener.phpが生成されている。$ php artisan event:generate Events and listeners generated successfully! $生成されてるか確認
$ ls app/ Console Events Exceptions Http Listeners Providers User.php $ tree -L 1 app/Listeners/ app/Listeners/ ├── EventListener.php └── RegisteredListener.php 0 directories, 2 files $リスナークラスの実装
Listeners/RegisteredListenered.php に処理を追加
Listeners/RegisteredListenered.php<?php namespace App\Listeners; // add for mailer use App\User; use Illuminate\Auth\Events\Registered; use Illuminate\Mail\Mailer; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class RegisteredListener { private $mailer; private $eloquent; /** * Create the event listener. * * @return void */ public function __construct(Mailer $mailer, User $eloquent) { $this->mailer = $mailer; $this->eloquent = $eloquent; } /** * Handle the event. * * @param Registered $event * @return void */ public function handle(Registered $event) { $user = $this->eloquent->findOrFail($event->user->getAuthIdentifier()); $this->mailer->raw('会員登録完了しました。', function($message) use ($user){ $message->subject('会員登録メール')->to($user->email); }); } }
- 投稿日:2019-05-02T00:32:04+09:00
Laravel 簡単なアプリケーション作成(1)
Laravel 簡単なアプリケーション作成(1)
Laravelを利用して簡単なアプリケーションを作成する手順
環境
前回作成したsampleappを流用する。
作成する画面、機能の概要
ID URL 機能 1 /home トップ画面表示 2 /auth/register ユーザ登録およびメール送信 3 /auth/login Login 4 /auth/logout Logout トップ画面の作成
http://homestead.test/home にアクセスしたらTop画面が表示されるようにする。
ディレクトリ構成
(base) mbp:sampleapp username$ tree -d -L 1 . ├── app ├── bootstrap ├── config ├── database ├── public ├── resources ├── routes ├── storage ├── tests └── vendorルーティング定義追加
routes/web.php// add Route::get('/home', function(){ return view('home'); });TOP画面のHTML作成(新規作成)
resources/home.blade.php<html> <head> <meta charset='utf-8'> </head> <body> Hello! World! </body> </html>http://homestead.test/home にアクセスしたらTop画面が表示される.
テストフレームワーク PHPUnit を試してみる
Laravelには、PHPを代表するテストフレームワークである「PHPUnit」が同梱される。
以下の2つのテストを行う。
- トップ画面のHTTPステータスコードが200
- トップ画面のレスポンスに"Hell! World!"の文字列が含まれていること
テストコードファイルの作成
(base) mbp:sampleapp username$ pwd /Users/username/code/sampleapp (base) mbp:sampleapp username$ php artisan make:test HomeTest Test created successfully. (base) mbp:sampleapp username$生成されたテストファイル
tests/Feature/HomeTest.php<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class HomeTest extends TestCase { /** * A basic feature test example. * * @return void */ public function testExample() { $response = $this->get('/'); $response->assertStatus(200); } }以下に変更、追加
tests/Feature/HomeTest.php<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class HomeTest extends TestCase { /** * A basic feature test example. * * @return void */ public function testExample() { $response = $this->get('/home'); $response->assertStatus(200); } public function testBody(){ $response = $this->get('/home'); $response-> assertSeeText("Hell! World!"); } }トップ画面のテストを実行
(base) mbp:sampleapp username$ pwd /Users/username/code/sampleapp (base) mbp:sampleapp username$ vendor/bin/phpunit tests/Feature/HomeTest.php PHPUnit 7.5.9 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 100 ms, Memory: 14.00 MB OK (2 tests, 2 assertions) (base) mbp:sampleapp username$ユーザ登録の実装
ユーザ登録機能の実装を通じてリクエストの受信とバリデーション機能(検証、認可)に関して学ぶ。
手順概要
- データベース準備
- 認証/登録機能のコードを確認、ルーティングに追加
- 登録画面を作成
データベース準備
ユーザ情報を登録するテーブルを作成する。テーブル作成にはマイグレーション機能を利用する。
マイグレーション機能とはデータベースのスキーマ作成やデータ投入などをプログラムコードを使って処理する機能。
マイグレーションを行うためのファイルはdatabase/migrationsにある。databaseディレクトリの内容
(base) mbp:sampleapp username$ tree database/ database/ ├── factories │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ └── 2014_10_12_100000_create_password_resets_table.php └── seeds └── DatabaseSeeder.php 3 directories, 4 filesマイグレーションファイル
2014_10_12_000000_create_users_table.php<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } }マイグレーション実行
vagrantで仮想環境にログイン
# cd ~/Homestead # vagrant ssh # cd ~/code/sampleapp/ vagrant@homestead:~/code/sampleapp$ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table vagrant@homestead:~/code/sampleapp$MySQLに接続して作成したテーブルを確認する
vagrant@homestead:~/code/sampleapp$ mysql --host=localhost --user=homestead --password=secret homestead mysql: [Warning] Using a password on the command line interface can be insecure. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show tables from homestead ; +---------------------+ | Tables_in_homestead | +---------------------+ | migrations | | password_resets | | users | +---------------------+ 3 rows in set (0.00 sec) mysql>認証/登録機能をルーティングに追加
登録処理はコントローラーで処理する。コントローラーはMVCアーキテクチャを構成する要素の1つ。
サービス利用者からの入力、受信結果を返却するためのビューの選択、生成などを担う。登録処理はRegisterControllerクラスの showRegistorationForm メソッドと registor メソッドで行う。
ルーティング定義の追加
routes/web.phpRoute::get('auth/register', 'Auth\RegisterController@showRegistrationForm'); Route::post('auth/register', 'Auth\RegisterController@register');登録画面の作成
resources/views/auth にregister.blade.php として保存
resources/views/auth/register.blade.php<html> <head> <meta charset='utf-8'> </head> <body> <h1>ユーザ登録フォーム</h1> <form name="registform" action="/auth/register" method="post"> {{csrf_field()}} 名前:<input type="text" name="name" size="30"><span>{{ $errors->first('name') }} </span><br /> メールアドレス:<input type="text" name="email" size="30"><span>{{ $errors->first('email') }} </span><br /> パスワード:<input type="password" name="password" size="30"><span>{{ $errors->first('password') }} </span><br /> パスワード(確認):<input type="password" name="password_confirmation" size="30"><span>{{ $errors->first('password_confirmation') }} </span><br /> <button type='submit' name='action' value='send'>送信</button> </form> </body> </html>TOP画面を変更する
resources/views/home.blade.php<html> <head> <meta charset='utf-8'> </head> <body> Hello! @if (Auth::check()) {{\Auth::user()->name}}さん @else ゲストさん<br /> <a href="/auth/register">会員登録</a> @endif </body> </html>TOP画面にアクセスし、ユーザ登録フォームが表示されることを確認する。
試しに適当な値を入力し、送信ボタンを押し、 /home のページにリダイレクトされ、ログイン後の画面が表示される事を確認する。最後に、DBに登録されたデータを確認してみる。
vagrant@homestead:~$ mysql --host=localhost --user=homestead --password=secret homestead mysql: [Warning] Using a password on the command line interface can be insecure. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select * from users; +----+-----------------+----------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ | id | name | email | email_verified_at | password | remember_token | created_at | updated_at | +----+-----------------+----------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ | 1 | xxx | xxxx.com | NULL | xxxxx| NULL | 2019-05-01 08:44:24 | 2019-05-01 08:44:24 | +----+-----------------+----------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ 1 row in set (0.00 sec) mysql>ユーザ認証
ログイン機能とログアウト機能を実装する
ルーティング追加
routes/web.php// Login Form Route::get('/auth/login', 'Auth\LoginController@showLoginForm'); Route::post('/auth/login', 'Auth\LoginController@login'); // Logout Route::get('/auth/login', 'Auth\LoginController@logout');ログインフォーム実装
resources/views/auth/login.blade.php<html> <head> <meta charset='utf-8'> </head> <body> <h1>ログインフォーム</h1> @isset($mesage) <p style="color:red">{{$message}}</p> @endisset <form name="loginform" action="/auth/login" method="post"> {{csrf_field()}} mailaddress: <input type="text" name="email" size="30" value="{{old('email')}}"><br /> password: <input type="password" name="password" size="30"><br /> <button type='submit' name='action' value='send'>Login</button> </form> </body> </html>TOP画面にログアウト機能を追加
views/home.blade.php<html> <head> <meta charset='utf-8'> </head> <body> Hello! @if (Auth::check()) {{\Auth::user()->name}}さん<br /> <a href="/auth/logout">Logout</a> @else ゲストさん<br /> <a href="/auth/login">Login</a><br /> <a href="/auth/register">会員登録</a> @endif </body> </html>ログアウト後の遷移先を変更する
/app/Http/Controllers/Auth/LoginController.php に以下のメソッドをオーバライドする
/app/Http/Controllers/Auth/LoginController.php// Override public function logout(\Illuminate\Http\Request $request) { $this->guard()->logout(); $request->session()->invalidate(); // return $this->loggedOut($request) ?: redirect('/'); return $this->loggedOut($request) ?: redirect('/home'); }元は sampleapp/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
に定義されるメソッドだが、vendor/ 以下に直接変更を加えず、オーバライドしておこう