けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

PhpStorm+phpcsでシンタックスチェック

概要

PhpStormのデフォの機能だけでシンタックスチェック出来るかと思って色々探してみたが、見つからず。 諦めてphpcsをインストールしてそれを使ってシンタックスチェックをするようにしてみる。

手順

参考にした記事とまんま同じこと書いてるだけ。

Terminalでやること

composerをインストールする

phpcsをインストールするためにcomposerコマンドを使用するので、brewコマンドでcomposerをインストールする。

$ brew install homebrew/php/composer

phpcsをインストールする

composerコマンドでphpcsをインストールする。 システム全体で使用できるようにglobalにインストールする。

$ composer global require "squizlabs/php_codesniffer=*"

試しに実行してみる。

$ phpcs -i
The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz and PSR1

出来てるっぽいのでオッケー。 この後でPhpStormの設定をする際にphpcsのパスを入力する必要があるので、以下のコマンドでパスを確認しておく。

$ where phpcs
/Users/[ユーザ名]/.composer/vendor/bin/phpcs

PhpStormでやること

Languages & Flameworksの設定

"PhpStorm"->"Preferences"を開く。 サイドバーの"Languages & Frameworks"->"PHP"->"Code Sniffer"を選択する。 "Configuration"の右側にある"..."(何だこれ)をクリックする。 "PHP Code Sniffer (phpcs) path"欄の右側にある入力欄に先ほどのphpcsのパスを入力する。 "Validate"をクリックしてパスを検証、特に問題がなければ"OK"をクリックする。

PHP Code Sniffer validationの設定

"PhpStorm"->"Preferences"を開く。

サイドバーの"Editor"->"Inspections"を選択する。 "PHP"->"PHP Code Sniffer validation"の右側にあるチェックボックスにチェックを入れ、"Options"->"Coding standard"の右側にあるリロードマークをクリックし、選択欄から"PSR2"(ここに関してはお好みで)を選択する。

以上の設定でシンタックスチェックが行われるが、デフォだとどの箇所が規約に沿っていないのかが分かりづらいので、規約に沿っていない箇所の色を変えて分かりやすくする。 サイドバーの"Editor"->"Inspections"を選択する。 "PHP"->"PHP Code Sniffer validation"を選択した状態で、"Options"->"Show warnings as"の右側にある選択欄から"Edit Serverities"を選択する。 "+"ボタンをクリックしてお好みで色を設定し、"OK"をクリックする。

最後に"Preferences"ウィンドウ右下にある"OK"をクリック、これで準備OK。

試しに使ってみる

PSR2に準拠してない行の上にカーソルを合わせると怒られている内容を確認することが出来る。

参考

Laradock+PhpStormでXdebug

概要

Laradock+PhpStormな環境でXdebugを使う設定をするよ。

環境

手順

Laradockの設定、PhpStormの設定と順を追って設定していく。

Laradock

.envの設定

laradock/.envの項目を以下のように設定する。 もしかするとデフォで設定されてるかもだが、確認すべし。

WORKSPACE_INSTALL_XDEBUG=true
PHP_FOM_INSTALL_XDEBUG=true

php-fpmの、workspaceの設定

laradock/php-fpm/xdebug.inilaradock/workspace/xdebug.iniを以下のように設定する。

xdebug.remote_host=docker.for.mac.localhost
xdebug.remote_connect_back=0
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

xdebug.remote_portが9000だとphp-fpmと衝突するため、9001にしている。 あと他のサイトだとxdebug.remote_connect_backが1でも動作するっぽいけど、自分の環境だと動かなかったので0にしている。

スケジューラのコメントアウト

Laradockはデフォでスケジューラが組み込まれており、定期的にphp artisanなコマンドがcronで呼ばれるという罠が仕掛けられている(ちゃんとした使いみちは知らん)。 こいつはデバッガに引っかかってしまうため、呼び出されないように設定する。

laradock/workspace/crontab/laradockを以下のようにコメントアウトする。

# * * * * * laradock php /var/www/artisan schedule:run >> /dev/null 2>&1

これ確か前の勉強会の時にサボさんが言ってた奴だよな...。

dockerイメージの再構築

以下のコマンドを入力してdockerイメージを再作成する。

$ docker-compose build workspace php-fpm

PhpStorm

Languages & Flameworksの設定

"PhpStorm"->"Preferences"を開く。 サイドバーの"Languages & Frameworks"->"PHP"->"Servers"を選択する。 "Languages & Frameworks"の"+"をクリックする。

各項目の設定を以下のように行う。

  • "Name": laradock(なんでもよい)
  • "Host": localhost
  • "Port": 80
  • "Debugger": Xdebug
  • "User path mapping": チェックを入れる
  • パスマッピング(ローカルPCとdockerでリンクされるプロジェクトのパス)
    • "File/Directory": ローカルPC上のlaravelプロジェクトのパス
    • "Absolute path on the server": docker上のlaravelプロジェクトのパス

Debugの設定

"PhpStorm"->"Preferences"を開く。 サイドバーの"Languages & Frameworks"->"PHP"->"Debug"を選択する。 "Xdebug"項目中の項目を以下のように設定する。

  • "Debug port": 9001

PHP Remote Debugの設定

"Run"->"Edit Configurations..."を開く。 サイドバーの"Defaults"->"PHP Remote Debug"を選択する。

各項目の設定を以下のように行う。

  • "Filter debug connection by IDE key": チェックを入れる
  • "Server": laradock("Language & Framework"で付けた名前)
  • "IDE key(session id)": PHPSTORM

以上で設定終わり。

実行してみる

PhpStormで任意のコードにブレークポイントを仕掛ける。 ブラウザからそのコントローラに対応するページにアクセスすると、PhpStormのデバッガが反応してくれる。

参考

macにDockerをインストール

概要

mac上でdockerを動かしたい。 brewコマンドでdockerをインストールするとdocker単体しかインストールされないため、brew caskコマンドでdockerをインストールする。

環境

手順

Docker.appのインストール

以下のコマンドでDocker.appをインストールする。

$ brew cask install docker

この時点ではdockerコマンドを叩いても使用できない。

$ docker --version
zsh: command not found: docker

Docker.appを起動

Docker.appを起動する。 色々設定した後にdockerコマンドが使用できるようになる。

$ docker --version
Docker version 17.09.1-ce, build 19e2cf6

感想

dockerよくわからんまま使ってるので少し勉強しないといけんなー。

「モブプログラミングでワイワイする会 その2.5」に参加して

[TDDYY会] モブプログラミングでワイワイする会 その2.5

2017/12/26(Tue)

YWT

Y

  • モブプログラミング
    • ある問題に対して皆で協力して挑む
    • PCと画面は一つずつで、ドライバー(PC操作する人)が一人、それ以外はナビゲータ
  • テスト駆動開発
    • 何をどうテストするか定義し、テストに沿って実装する
  • FizzBuzz問題
    • 3の倍数のときに"Fizz"を出力
    • 5の倍数のときに"Buzz"を出力
    • 15の倍数のときに"FizzBuzz"を出力
  • 動作をToDoリストとして列挙する
    • ToDoリストの更新はどのタイミングでもよい
  • タイムライン
    • 時間軸(横軸)に沿って何をやったか洗い出す
    • その時間毎の自分のモチベーションの上下を縦軸に線を描く

W

  • モブプログラミング楽しい
    • 考える時間はなるべくなくして、手を動かしながら考える
    • みんなでワイワイできる
    • 話し合いながら進めることで、お互いの知識をシェア出来て非常に良い
  • テスト駆動開発
    • 先にテストを書くことで何を実装するのかが明確になる
    • テスト書くの面倒と思っていたが、モブプログラミングと組み合わせると楽しい
    • 単体テストの方法は分かったが、結合テストの方法がちょっとよくわからん

T

  • テストの方法について勉強する
  • テストをするためのモジュールについて調べておく
  • 次回のtddyy会も開催する

参考

Atomエディタで特定の行を自動インデントするキーバインド

概要

Atomエディタでコーディングをする際、特定の行をよしなにインデントするようにctrl-iキーバインドを割り当てる。

環境

手順

Atom」->「Preferences」->「Keybindings」を開く。

Keybindingsのページ上部にあるリンク「your keymap file」をクリックしてキーマップ用のファイル(~/.atom/keymap.cson)を開く。

開いたファイルに以下のコードを追記する。

'atom-text-editor':
    'ctrl-i': 'editor:auto-indent'

考察

コーディング中にctrl-iで中々よい感じにインデントされるようになった。 tabキーを押すのって結構面倒なので、これで楽になれそう。

Laravel開発環境の簡単構築

概要

前回の記事(PHP7.1+Laravel5.x+Nginx+php-fpmな仮想環境構築)の改良版。

ホストOSとゲストOSで共有フォルダを設けて、ホストOS側でファイルを編集できる開発環境を作る。 共有フォルダを用いることで、ホストOS側でIDEを使ったファイル編集が可能になり、ゲストOSはDBのmigrate以外は基本的に触らずにLaravelプロジェクトページを開くことが出来る。

リポジトリは以下の通り。

github.com

環境

ホストOS

ゲストOS

構築手順

ホストOS(mac)での準備

composerをインストールする

laravelコマンドをインストールするのに使用する。

$ brew install homebrew/php/composer

laravelインストーラをダウンロードする

Laravelプロジェクトを作製するためのlaravelインストーラをダウンロードする。

$ composer global require "laravel/installer"

laravelコマンドを実行するためのパスを通す。

$ echo "path=(${HOME}/.composer/vendor/bin ${path})" >>${HOME}/.zshrc

.zshrcを再読込みする。

$ source ~/.zshrc

ここまででLaravelプロジェクト作製用コマンドの準備が完了した。

ゲストOS(仮想マシン)の用意

リポジトリをcloneする

リポジトリを公開してるので、まずはそこからcloneする。

$ git clone https://github.com/kkznch/laravelvm.git

仮想マシンを起動する

cloneしたリポジトリ内でvagrantコマンドを使って仮想マシンを起動する。 --provisionオプションはVagrantfile内で指定したプロビジョニング用のコマンドを実行する。 今回は中でansibleコマンドを実行している。

$ cd laravelvm
$ vagrant up --provision

SSH接続のための設定をする

起動した仮想マシンSSH情報を設定ファイルに追記する。

$ vagrant ssh-config >> ~/.ssh/config

この時点ではIPアドレスとポート番号がデフォルトのままなので、書き換える。

$ emacs ~/.ssh/config
Host laravelvm
  HostName 192.168.16.132 # 変更部分
  User vagrant
  Port 22 # 変更部分
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/kkz/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

ここまでで仮想マシンSSH接続ができるはず。

Laravelプロジェクトを作成する

仮想マシンリポジトリ内にあるsharedフォルダを共有フォルダとして仮想マシン内部の/var/wwwにマウントする。

また、仮想マシン/var/www/laravel/publicをドキュメントルートとしているため、sharedフォルダ内にlaravelという名前でLaravelプロジェクトを作成すればよい。

$ pwd
/path/to/laravelvm
$ ls
Vagrantfile playbook shared
$ cd shared

以下のコマンドでLaravelプロジェクトが作製される。

$ laravel new laravel

接続確認

ブラウザで以下のURLにアクセする。

http://192.168.16.132:9000

LaravelのTopページが表示されればOK。

Laravelプロジェクト編集

ホストOS(mac)にインストールされているIDEでLaravelプロジェクトを開き、コードを編集していく。 このとき、IDEにPhpStormを使っていれば楽になれる(デバッグ的な意味で)。 ファイル編集後はブラウザから上記URLにアクセスするだけでページが更新されているのが分かる。これが非常に楽ちん。

考察

仮想マシンは起動しておくだけでいいし、編集もローカルのIDEを使用して出来るのでかなり良い。 ただ、データベースの更新などを行う際は仮想マシン内で操作を行う必要がある。

参考

PHP7.1 + Laravel5.x + Nginx + php-fpmな仮想環境構築

概要

vagrant仮想マシンを立ち上げ、ansibleでPHP7.1 + Laravel5.x + Nginx + php-fpmな環境を構築する。

時間のない人向け

リポジトリは以下に公開している。

github.com

以下のコマンドをぽちぽちっとすれば動く。

$ git clone https://github.com/kkznch/laraveltestvm.git
$ cd laraveltestvm
$ vagrant up
$ ansible-playbook -i playbook/inventory/hosts playbook/provisioning/setup.yaml

あとは以下のURLにアクセスするだけ。

http://192.168.16.132:9000

環境

ホスト

ゲスト

構築手順

vagrantでOS起動、SSHログインまで

boxファイルを追加する

boxファイルをインストールする。

$ vagrant box add bento/centos-7

boxファイルがインストールされたか確認する。

$ vagrant box list
bento/centos-7 (virtualbox, 201710.25.0)

Vagrantfileを設置する

vagrantファイルを設置したいフォルダに移動する。

$ mkdir /path/to/laraveltestvm
$ cd /path/to/laraveltestvm

Vagrantfileを作成する。

$ vagrant init bento/centos-7

作成されたファイルを確認する。

$ ls
Vagrantfile

Vagrantfileを編集する

Vagrantfileをエディタで開いて編集する。

$ emacs Vagrantfile
# coding: utf-8
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    # 使用するboxファイル
    config.vm.box = "bento/centos-7"

    # ゲストOSのホスト名とプライベートIP
    config.vm.define "laraveltestvm" do |lvm|
        lvm.vm.network "private_network", ip: "192.168.16.132"
    end

    # ゲストOS毎に異なる公開鍵を使用しない
    config.ssh.insert_key = false
end

vagrantでOSを起動する

以下のコマンドでOSを起動する。

$ vagrant up

SSHの設定をする

vagratで使用するSSHの設定を表示する。

$ vagrant ssh-config >> ~/.ssh/config

# 以下の内容が.ssh/configに書き込まれる
Host laraveltestvm
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/kkznch/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

これをそのまま書いても指定したIPアドレス(192.168.16.132)でログインできないため、HostNamePortの欄を書き換える。

$ emacs ~/.ssh/config
Host laraveltestvm
  HostName 192.168.16.132
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/kkznch/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

SSHの接続確認をする。

$ ssh laraveltestvm
[vagrant@localhost ~]$

ansibleで構成管理する

構成管理用フォルダを作成する

ansible実行時に指定するファイルを格納するフォルダを作成する。

$ cd /path/to/laraveltestvm
$ mkdir -p playbook/{inventory,provisioning}

inventoryはansibleで構成管理する対象を指定するファイルを置く場所、provisioningは構成管理の内容を記述するファイルを置く場所。

構成管理対象ホストを指定する

構成管理の対象となるホスト名を指定する。 ホスト名には先程~/.ssh/configに指定した名前laraveltestvmを指定すること。

$ emacs playbook/inventory/hosts
[laraveltestvm]
laraveltestvm

[laraveltestvm]は構成管理対象のグループ名、laraveltestvmは構成管理対象となるホスト名が入る。 今回は単一のホストに対してのみ構成管理を行うため、グループ名とホスト名は同じにしてる。

構成管理内容を作成する

PHP + Laravelな環境を構築するための構成管理内容を記述したファイルを作成する。

$ emacs playbook/provisioning/setup.yaml
# Playbook
---
- hosts: laraveltestvm
  become: yes
  user: vagrant
  tasks:
    - name: add yum repository
      yum: name="{{ item }}" state=latest
      with_items:
        - epel-release
        - http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    
    - name: yum basic install
      yum: name="{{ item }}" state=latest
      with_items:
        - zip
        - unzip
        - git
        - mysql
        - nginx

    - name: yum php install
      yum: name="{{ item }}" enablerepo=remi-php71 state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-pdo
        - php-gd
        - php-mysql
        - php-xml
        - php-fpm

    - name: modify php.ini
      replace:
        dest: /etc/php.ini
        regexp: "{{ item.regexp }}"
        replace: "{{ item.replace }}"
      with_items:
        - { regexp: "^;date.timezone =", replace: "date.timezone = Asia/Tokyo" }
        - { regexp: "^expose_php = On", replace: "expose_php = Off" }
        
    - name: modify php-fpm config file
      replace:
        dest: /etc/php-fpm.d/www.conf
        regexp: "{{ item.regexp }}"
        replace: "{{ item.replace }}"
      with_items:
        - { regexp: "^user = apache", replace: "user = nginx" }
        - { regexp: "^group = apache", replace: "group = nginx" }
        - { regexp: "^listen = 127.0.0.1:9000", replace: "listen = /var/run/php-fpm/php-fpm.sock" }
        - { regexp: "^;listen.owner = nobody", replace: "listen.owner = nginx" }
        - { regexp: "^;listen.group = nobody", replace: "listen.group = nginx" }        
        
    - name: start php-fpm
      systemd:
        name: php-fpm.service
        state: restarted
        daemon_reload: yes
        enabled: yes
      
    - name: make nginx config file for laravel
      copy:
          dest: /etc/nginx/conf.d/laravel.conf
          mode: 0644
          content: |
            server {
              server_tokens off;

              root /var/www/laravel/public;
              
              listen 9000;
              server_name _;

              location / {
                index index.php index.html;
                try_files $uri $uri/ /index.php?$query_string;
              }

              location ~ \.php$ {
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;                  
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              }
            }            

    - name: start nginx
      systemd:
        name: nginx.service
        state: restarted
        daemon_reload: yes
        enabled: yes

    - name: install composer
      command: "{{ item }}"
      with_items:
        - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
        - php composer-setup.php
        - php -r "unlink('composer-setup.php');"
        - mv composer.phar /usr/local/bin/composer

    - name: create laravel project
      command: /usr/local/bin/composer create-project --prefer-dist laravel/laravel /var/www/laravel
      
    - name: change the owner of laravel project
      file:
        path: /var/www/laravel
        owner: nginx
        group: nginx
        recurse: yes

    - name: change the permission of laravel project
      file:
        path: /var/www/laravel/"{{ item }}"
        mode: 0755
        recurse: yes
      with_items:
        - storage
        - bootstrap/cache

ansible-playbookコマンドを実行する

ansible-playbookコマンドを実行して先程作成した仮想環境の中の環境を構築する。

$ ansible-playbook -i playbook/inventory/hosts playbook/provisioning/setup.yaml

...[省略]

PLAY RECAP ************************************************************************************************
laraveltestvm                  : ok=13   changed=12   unreachable=0    failed=0

5分〜10分くらい時間がかかるかも。

接続確認

ブラウザで以下のURLにアクセスする。

http://192.168.16.132:9000

考察

Laravelに繋がらないよふぇ〜的なのはほとんど権限周りが原因だと思う。 大体は以下のが怪しい。

  • /var/run/php-fpm/php-fpm.sock
    • オーナー及びグループは nginx になっているか?
  • Laravelプロジェクトフォルダ
    • プロジェクトフォルダ以下のオーナー及びグループは nginx になっているか?
    • プロジェクトフォルダ直下のstorage及びbootstrap/cacheフォルダのパーミッション755 になっているか?

参考