20190502のMacに関する記事は8件です。

一足遅れて Kubernetes を学び始める - 04. kubectl -

ストーリー

  1. 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
  2. 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
  3. 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
  4. 一足遅れて Kubernetes を学び始める - 04. kubectl -
  5. 一足遅れて Kubernetes を学び始める - 05. workloads その1 -
  6. 一足遅れて 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 created

Kubernetesでは、基本的にはマニフェストファイルを作成し、applyで適用するのが一般的のようです。それは、新規作成だけでなく、更新や削除も同様です。createreplace,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          13m

kubectlでは、どのリソース種類(pod,service,etc)で、どのリソース名なのかを教えてあげる必要があります。
また、フィルタリングする機能としてlabelがあります。

sample-pod-label.yaml
apiVersion: 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という直接編集する方法もありますが、一時的な対応のみに利用するべきとのことです。
せっかくの宣言的ファイルが意味ないですよね。

余談ですが、servicesvcという風に省略できたりします。
(備忘)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で全部出すという荒業も覚えました。(笑)

次回はこちらです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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アプリで落としてきます。)

手順

  1. 外付けUSB SSDケースにSSDを装着し「Mac OS拡張(ジャーナリング)」「 GUID パーティションマップ」でフォーマットします。
  2. Windows10がインストールされたPCに1.の外付けSSDをそのまま接続します。
  3. Windows10のディスクの管理からマウントされたSSDの第2パーティションを削除します。(EFIパーティションではない方。)
  4. 第2パーティションをNTFSでフォーマットします。EFI側はそのままにしておきます。
  5. WinToUSB 3.9を起動します。
  6. イメージファイルにWindows.isoファイルを指定し次へボタン。
  7. ディスクを選択でUSB接続された外付けSSDを選択します。(USB以外NGです。TB3ディスクは不可)
  8. WinToUSBのWizardでNextボタンを押していけば外付けSSDの完成です。
  9. Macに外付けSSDを繋ぎ変えてoptionキーを押しながら再起動で外付けSSDから起動します。
  10. 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で起動し起動セキュリティユーティリティを使って外部メディアからの起動を許可しておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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アプリで落としてきます。)

手順

  1. 外付けUSB SSDケースにSSDを装着しMacに繋いだのち「Mac OS拡張(ジャーナリング)」「 GUID パーティションマップ」でフォーマットします。
  2. Windows10がインストールされたPCに1.の外付けSSDをそのまま接続します。
  3. Windows10のディスクの管理からマウントされたSSDの第2パーティションを削除します。(EFIパーティションではない方。)
  4. 第2パーティションをNTFSでフォーマットします。EFI側はそのままにしておきます。
  5. WinToUSB 3.9を起動します。
  6. イメージファイルにWindows.isoファイルを指定し次へボタン。
  7. ディスクを選択でUSB接続された外付けSSDを選択します。(USB以外NGです。TB3ディスクは不可)
  8. WinToUSBのWizardでNextボタンを押していけば外付けSSDの完成です。
  9. Macに外付けSSDを繋ぎ変えてoptionキーを押しながら再起動で外付けSSDから起動します。
  10. 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のタイムマシーンなどを用意してもいいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macのターミナルで【Vue.js(Vue CLI 3系)】のvue コマンドを使えるようにするまでの話

そもそもなんでVue.js?

現在、WEBサイトのフロントエンド開発を主に仕事でしているのですが、フロントエンドエンジニアとしてJavaScriptのフレームワークのひとつぐらいまともにプログラミングできないとまずいよな〜と思ったのがきっかけです。
日本語のドキュメントもあり、フレームワークを調べてるときに比較的学習コストが少ないということで今回Vue.jsを選択しました。
現在は様々な機能が使えるVueCLIを使って開発するのがトレンドらしく、とりあえず触ってみよう的な試みです。

Vue.jsについてはこちらの記事に詳しく書いてありました。

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をインストール

App storeからXcodeをインストール

コマンドライン・デベロッパーツールをインストール

ターミナルから$ xcode-select --installコマンドを発行すると
以下のようにインストールを要求されて

$ xcode-select --install
xcode-select: note: install requested for command line developer tools

同時にポップアップが出てくるので"インストール"を選択し利用規約に同意します。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137343238332f61356335323066322d383938372d353435322d653039382d6164343934363935613039652e706e67.png

Homebrewをインストール

Homebrewの公式サイトからコードをコピペしてEnterを押します。
途中でEnterの入力/インストールユーザのOSパスワードの入力を求められるので入力して進んでください。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

インストールが確認するには以下のコマンドを実行できればインストールされたことになります。

$ brew doctor

nodebrewのインストール

$ brew install nodebrew

インストールを確認するには

$ nodebrew -v

情報が表示されたらインストールされてます!!

Node.jsとnpmのインストール

Node.jsの最新版をインストール

$ nodebrew install latest

Node.jsを有効にします。

nodebrew use 先程インストールしたNode.jsのver

nodeコマンドを使用するため、パスを通します。

#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 ~/.bashrc

npmはNode.jsとともにインストールされます。

npmがインストールしたか確認

$ npm -v

Node.jsがインストールしたか確認

$ node -v

バージョンが表示されればOKです!!

Vue CLI(Vue.js)のインストール

npm install -g @vue/cli

vueコマンドを使うためのパスを確認

npm bin -g
#/Users/xxxxxxx/npm/bin

vue コマンドを使用するためにパスを通す

$ export PATH=/Users/xxxxxxx/npm/bin:$PATH

vueのインストールを確認

$ vue --version

バージョンが表示されればOKです!!

おしまい

とりあえず、Vueを動かす環境づくりはこんな感じでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[環境構築編] 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/cask

JDK のインストール

下記でインストールできる。

sh
$ brew cask install java

sbt のインストール

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 World

IntelliJ IDEA 連携

私は IntelliJ で開発しているのでこちらの IDE と連携するための設定もついでにしておく。

Plugin のインストール

Plugin はひとまず下記の2つをインストールした。

SDK の設定

「File」 → 「Project Structure」 → 「Project SDK」

インストールしたバージョンを指定してください。

お疲れ様でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでのVSCodeの導入手順とおすすめ設定、拡張機能(Mac)

はじめに

Unityを使う際、デフォルトではスクリプトエディタとしてVisual Studioが設定されていますが、「VSCode便利だよ」と先輩エンジニアの方に勧めて頂いたので導入してみました。結果、色々カスタマイズできて便利だったので、備忘録として導入手順とおすすめ設定をまとめてみました。

VSCodeのインストール

下のリンクからダウンロードし、インストールする。
Download Visual Studio Code

Unityの設定

デフォルトのスクリプトエディタをVSCodeに変更する

[Unity] → [Preferences] → [External Tools] → [External Script Editor] → [Browse]
finderが開くので「Visual Studio Code.app」を探してきて選択する。

[External Script Editor]に「Code」と表示されていればOK。
スクリーンショット 2019-05-02 3.27.56.png

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


VS Codeのミニマップの表示/非表示を切り替えるには

.metaファイルを非表示

デフォルトだと.metaファイルが表示されて邪魔なので非表示にします。

[Code] → [Prefarences] → [Settings]
で設定画面を開く。

・Files:Exclude

の項目に以下を追加してOKを押す。

**/*.meta

スクリーンショット 2019-05-04 21.34.17.png

拡張機能

C#

必須。C#が使えるようになる。

C# FixFormat

C#の自動整形ができるようになる。

Japanese Language Pack for Visual Studio Code

VSCodeの日本語化。

vscode-icons

ファイルとかフォルダにアイコンがついて見やすくなる。

Bracket Pair Colorizer

メソッドとかの{}を階層毎に色分けしてくれる。

zenkaku

コードに混ざった全角をわかりやすくしてくれる。

Debugger for Unity

デバッガー機能が使えるようになる。
image.png

C# XML Documentation Comments

sammaryを一瞬で表示できるようになる。

MonoBehaviour Snippets

Startメソッドとかを一瞬で書けるようになる。

Classy Naming

変数を新しく作るときに、変数名の候補を表示してくれる。

C# Extensions

C#のクラスを作れたりとか色々できる。

Rainbow CSV

csvを列ごとに色分けしてくれる。

参考

今日からUnity + Visual Studio Codeを用いた快適な開発生活(随時更新中)
VSCodeのオススメ拡張機能 24 選 (とTipsをいくつか)
VS CodeでUnityプログラミングしてる僕が入れてる拡張機能

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Homestead MailHog を利用する

Laravel 簡単なアプリケーション作成(2)

イベントを利用して会員登録時にメールを送る機能を追加

Laravelを利用して簡単なアプリケーションを作成する手順

今回はイベントを使用して会員登録時にメールを送信する機能を追加する

イベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。

環境

前回までの環境を利用する

手順概要

  1. メール送信設定
  2. イベントとリスナーファイルの設定
  3. リスナークラスの実装

メール送信設定

Homesteadに同梱される"MailHog"というSMTPサーバを使用する。

管理画面は
http://homestead.test:8025 にアクセスすることでGUI表示できる。

sampleapp/.env を編集

sampleapp/.env
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

リスナーファイルの設定

通常、イベントとリスナーの実装が必要だが、イベントはLaravelに含まれるものを利用するためリスナーのみ実装する。
下記ファイルに追加してリスナーを定義する。

app/Providers/EventServiceProvider.php
protected $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);
        });
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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$

ユーザ登録の実装

ユーザ登録機能の実装を通じてリクエストの受信とバリデーション機能(検証、認可)に関して学ぶ。

手順概要

  1. データベース準備
  2. 認証/登録機能のコードを確認、ルーティングに追加
  3. 登録画面を作成

データベース準備

ユーザ情報を登録するテーブルを作成する。テーブル作成にはマイグレーション機能を利用する。

マイグレーション機能とはデータベースのスキーマ作成やデータ投入などをプログラムコードを使って処理する機能。

マイグレーションを行うためのファイルは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.php
Route::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/ 以下に直接変更を加えず、オーバライドしておこう

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む