読者です 読者をやめる 読者になる 読者になる

bz0のにっき

quick and dirty prototype

Vagrant+PHP+NetBeans XDebugの設定

PHPデバッグの効率化・ソースコードリーディング促進の為に
XDebugを入れてみました。

環境

CentOS6.5
PHP5.6
Vagrant1.8.4
xdebug 2.5.0
netbeans8.0

Vagrant

IP:192.168.33.10
SSH:127.0.0.1:2222

サーバ側の設定

xdebugのインストール

yum -y install php-devel php-pear
pecl install xdebug

php.ini設定

/etc/php.ini

zend_extension=/usr/lib64/php/modules/xdebug.so

[XDebug]
xdebug.remote_autostart=On
xdebug.remote_enable=On
xdebug.remote_host=192.168.33.1
xdebug.remote_port=9000
xdebug.remote_log=/var/log/xdebug.log
xdebug.remote_mode=req
xdebug.idekey=netbeans-xdebug
xdebug.remote_handler=dbgp

zend_extensionで指定するxdebug.soのパスは
xdebugインストール完了のログに書いてあるのでそれを指定します。

Build process completed successfully
Installing '/usr/lib64/php/modules/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.5.0

xdebug.remote_hostには、VagrantのホストのIPを設定しますが
「192.168.33.10」を「192.168.33.1」にして下さい。

apacheの再起動

service httpd restart

NetBeansの設定

ツール > オプション > PHP > デバッグ
f:id:bz0:20170201011159p:plain

プロジェクト > 実行構成
f:id:bz0:20170201011438p:plain

リモート接続
f:id:bz0:20170201011615p:plain

ファイアウォールの許可

xdebugで利用しているポートを許可します。

NetBeansデバッグ実行

デバッグ実行してみると、下記のように
設置したブレークポイントで止まってくれるようになります。

f:id:bz0:20170201012438p:plain

軽量フレームワークSlimで開発する為のメモ

軽量フレームワーク Slimを使う

Slimという軽量フレームワークを使って開発をするときに
どういう風に作っていくべきか作法がわからなかったので
Skelton(土台)を下敷きに進めていくことにしました。

自分で色々試行錯誤するより、道筋が見えやすそうですし。


残念ながらPHP5.3環境なのでSlim2を使うことにしました。
https://github.com/aurmil/slim2-skeleton

※すみません、PHP5.5以上でしないと使えませんでした。
 ローカルの仮想環境が複数あり、間違えて5.6で試してました。。。

※PHP5.3でも、symfony/yamlのバージョンを2.0に落として
 プログラム内の配列が「[]」で書かれてるものを「array()」に書き直せば使えました。

どういう仕組みになってるのか把握する為に
中を少し読んでみたので、メモします。

skeltonの作成

composerをインストールした後に下記でスケルトン作成する

composer create-project aurmil/slim2-skeleton [your-project-name]

仕組み

全体像

f:id:bz0:20170127005247p:plain

index.php

/public/index.php
/project/public/でブラウザ叩くと初めに呼ばれるファイル

'cli-server' === PHP_SAPI

コマンドラインから起動したかをチェックする
http://qiita.com/ukisoft/items/8885a541a99f3b0e2e2e

bootstrap.php

/app/src/bootstrap.php
処理のメインとなるファイルです。

初期設定

/app/src/config.php
下記ファイルを読み込んでいる

/app/config.yml

時刻設定と、言語設定は変更した方がよさそう

default_timezone : 'Asia/Tokyo'
language_code : 'ja'

エラーログの扱い

/app/src/dependencies.php

・monologでログを出力する
・twigでエラー表示

ルーティング設定

/app/src/routes.php
slimによるルーティング

get,postパラメータの取得方法

$get  = $app->request->get();
$post = $app->request->post();

urlFor
http://blog.code-life.net/blog/2014/01/06/redirecting-slim-application-from-subdirectory/

basic認証ログアウト用のブックマークレット

試した環境

・htttp通信(セキュリティ的にどうなの?というのはありますが)
basic認証でログインすると、ユーザIDとパスワードのクッキーが設定される

ブックマークレット

ネットで探してみたのですが、クッキーを削除してくれるだけでAuthorizationヘッダが残ってログアウトできない
通常のセッションを消すブックマークレットばかりだったので、メモしておきます。

ブックマークレットの元となるJavascript

chromeのコンソールログでテストしながら書いていきました。

  //クッキー削除
  document.cookie = "ID=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/;";
  document.cookie = "PW=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/;";

  //authorizationヘッダをリセットする為にdummyを仕込む
  var url = window.location.href;
  url = url.replace("http://", "http://dummy@");
  window.location.href = url;

http://dummy@」の書き方は、下記記事を参考にさせていただきました。
PHPによる簡単なログイン認証いろいろ - Qiita


ブックマークレット

javascriptをminifyで圧縮
JSCompress: Minify Javascript Online / Online JavaScript Compression

名前空間を汚染しないように、(function(){})();で囲みます。
ブックマークレットを作るときのTips - Qiita

javascript:(function(){document.cookie="ID=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/;",document.cookie="PW=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/;";var url=window.location.href;url=url.replace("http://","http://dummy@"),window.location.href=url;})();

IEではセキュリティエラーが出て動きませんでした。
 basic認証をつけたlocation.hrefが原因なのではと思われます。

Postfixでメール送信の為の設定

サーバからメール送信したかったのでpostfixの設定からやってみました。

ゴールとしては、下記です。

  • SPFが「PASS」になる
  • DKIMが「pass」になる

環境

Postfix設定

下記設定を参考にしました。

メールサーバー構築(Postfix+Dovecot) - CentOSで自宅サーバー構築
[Postfix]SPFレコードを設定して携帯へメールを送信できるようにする | 本日も乙
Postfixをインストールしてメール送信してみる | 本日も乙

mx.kzz.bzをmyhostnameに設定する理由は、下記です。

1つのサーバで複数のサーバー(ウェブサーバー、メールサーバーなど)を運用する場合には、メールサーバー用に独自のホスト名を割り当てるようにします。

Postfix のインストールと設定 〜 CentOS6 | EasyRamble

myhostnameにメールサーバ用に独自のホスト名を割り当てた場合は
下記追記を忘れずに行います。

でないと、SPF認証ができずに「none」になってしまいます。

# sudo vim /etc/postfix/main.cf
sender_canonical_classes = envelope_sender
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# sudo vim /etc/postfix/sender_canonical 
@mx.kzz.bz @kzz.bz
 
# sudo postmap /etc/postfix/sender_canonical

# sudo service postfix restart

DNS設定

DNSの解説 for ビギナー

最終的に下記のようにしました。

ホスト名 TYPE TTL VALUE
kzz.bz A 60 133.242.184.146
mx.kzz.bz A 60 133.242.184.146
kzz.bz MX 60 mx.kzz.bz /10
kzz.bz TXT 60 v=spf1 +ip4:133.242.184.146 -all
_adsp._domainkey.kzz.bz TXT 60 dkim=unknown
kzz_20170108._domainkey.kzz.bz TXT 60 v=DKIM1; k=rsa; p=[公開鍵]

・メールサーバ用のドメイン(mx.kzz.bz)をIPと紐づける

ホスト名 TYPE TTL VALUE
mx.kzz.bz A 60 133.242.184.146


・@kzz.bzのメールを送受信するメールサーバのホストは「mx.example.com」だと
 メールクライアント(メール送信時)やメールサーバ(メール受信時)に教えてあげるための設定

ホスト名 TYPE TTL VALUE
kzz.bz MX 60 mx.kzz.bz /10


・kzz.bzが送り主のメールは、「133.242.184.146」から送られてきたものでなければ拒否してよいという設定

ホスト名 TYPE TTL VALUE
kzz.bz TXT 60 v=spf1 +ip4:133.242.184.146 -all


SPFが「pass」になりました。

Received-SPF: pass (mx.kzz.bz: domain of root@kzz.bz designates 133.242.184.146 as permitted sender)

逆引き設定

「pass」にはなりましたが、逆引き設定してないので、対応します。
送信したメールが受信側でsoftfail となる場合の対処メモ - The Second Longest Day in My Life...

サーバは、さくらVPSの為コンソール画面から逆引き設定を変更します。
DNS逆引きレコードを変更する – さくらのサポート情報

DKIM設定

DKIMとは何か、利点については下記がわかりやすかったです。
FAQ | dkim.jp


設定は、下記を参考に行いました。
Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) | あぱーブログ

設定前のメールヘッダ:

domainkeys=neutral (no sig); dkim=neutral (no sig); header.i=@kzz.bz

設定後のメールヘッダ:

domainkeys=neutral (no sig); dkim=pass (ok); header.i=@kzz.bz

Virtualbox+Vagrantで開発環境を作る

ローカルの開発環境にする為に利用します。

環境

Windows7

バージョン

バージョンが新しいものを使うとエラーになり、対処が手間だったので
少し古いバージョンのものを利用しています。
VirtualBoxをVagrantで動かすエラーになる件 - Qiita

Download_Old_Builds_5_0 – Oracle VM VirtualBox

※5.0.30でも試してみましたが大丈夫でした。

Vagrant Versions | HashiCorp Releases

windows環境では、下記を選択します。
vagrant_1.8.4.msi


参考:Windows10 64bitにVagrant/VirtualBoxを導入する方法(2016年8月版まとめ) - MOERUZE Blog

A list of base boxes for Vagrant - Vagrantbox.es

設定

sshログイン

vagrant sshすることで、sshでログインするときに
必要なIPやユーザID・パスワードを確認できます。

vagrant ssh

Vagrantで共有フォルダを設定してみる - Qiita

アクシデント

キャッシュが消えない

jsやcssなどが、修正してもそれが反映されないということがありました。
httpd.confを修正すると直りました。
静的ファイルがキャッシュされる(ブラウザキャッシュじゃない場合) - Qiita

Gitの運用について

Gitの運用に関して

やったことのメモなので、まとまりなくてごちゃごちゃしてます。。。

ブランチごとの役割

通常の開発
  • featureブランチ→(マージ)developブランチ→(マージ)releaseブランチ→(マージ)master
  • メリット
    • 開発者のローカルで、featureブランチ作成して開発を進めることができる
    • releaseブランチで、開発とリリースの時差によるズレに対応できる(コンフリクトを解消する)
不具合が起きたら
  • hot-fixブランチ→(マージ)master
  • メリット
    • すぐにmasterにマージできるので素早く対処できる

Gitを最大限に活用できる「Git flow」で、効率よく開発を進めよう! | Git編:一歩踏み出すフロントエンド入門

ローカルでの開発

source-tree

ローカルでは、コマンド使わずGUIで。
git-flowの運用もボタン押すだけでブランチ生成してマージしてと
ほぼ自動でやってくれるので楽です。

sourcetree で Git Flow を使ってみる - 新しい日記

[エラー解決]hotfixのブランチを切ろうとしたときに出たエラー
fatal: Working tree contains unstaged changes. Aborting.

コミットし忘れが残っていると上記のようなエラーが出ます。


.gitignore

gitignoreの運用
.gitignoreについて - Qiita


gitignoreの自動生成
https://www.gitignore.io/

netbeans(PHP用のIDEとして利用してます):
netbeansメタデータリポジトリ対象から除外する
private ディレクトリには、システムにインストールされている IDE 専用の情報が含まれているため
NetBeansのbuild.xmlとnbprojectはSCMに突っ込んでヨロシ - marsのメモ

giboで自動生成:
http://qiita.com/tmknom/items/c4bcebe17d25381fa45d

.git

.gitディレクトリをサーバで公開されないようにします。
.htaccessをルートディレクトリに生成します。

RewriteEngine on
RewriteRule "(^|/)(CVS|\.svn|\.git)/" - [F]

リモートリポジトリ

BitBucket

リモートリポジトリに利用してます。

プライベートリポジトリが作れて容量無制限で5ユーザまでなら
無料で利用できる点がよいです。

※2GB以上はプッシュできないですが。

Bitbucket - プロフェッショナルチーム用 Git ソリューション | Atlassian
GithubとBitbucketのストレージ周りのお話 - Qiita

webhook

webhookを利用して、プッシュされたらサーバへ自動プルされるようにしています。

Bitbucket や GitHub で自動デプロイするためのサンプル PHP スクリプトを拾って改造してみた - アルケミスタの住人

git clone

webhookのリクエストを受け取ったphpファイルが、git pull実行するシェルファイルを実行するという
仕組みになるので、phpを動かす「apache」ユーザで「git clone」します。

※他のユーザで実行してしまうと、ファイル権限がなくて更新できない事がある為

# su -s /bin/bash apache
# git clone git@bitbucket.org:xxxx.git
git cloneでエラー
fatal: could not create work tree dir 'xxxxxxxx'.: ????????

ディレクトリの書き込み権限がなかったことが原因でした。
参考:http://d.hatena.ne.jp/oggata/20120601/1338509023

linuxでのファイルバックアップ関連

Linuxでのファイルバックアップ関連についてメモしておく

環境

CentOS 6.5

圧縮

1.どの圧縮方法を選択すべきか

gzip: 一般的な圧縮率。
bzip2: より強力な圧縮。時間がかかる。バックアップとしてはこれが一般的とのこと。
xz: LZMA2 アルゴリズムを使用する。7z の親戚。 Linuxカーネルソースとか巨大なソース等の圧縮に採用されている。最近のディストリならたいてい標準で入っている。圧縮率は bzip2 よりも優位だがより CPU、メモリリソースを消費する。
正直時間がかかる割に bzip2 よりサイズがでかくなるパターンがたまにあるので注意。
最近流行にのって単発の圧縮ならこれをよく使ってる。
zip: あんまり使わないなあ。。。

圧縮展開系のコマンドのまとめ - Qiita

2.コマンド実行

bzip2で圧縮

一般的にはバックアップはbzip2を使うようなので、これでやってみる。

tar cvjf [output.tar.bz2] [input]

例)
tar cvjf /var/www/html/output.tar.bz2 /var/www/input

  • 「/var/www/html/output.tar.bz2」のところは圧縮ファイル名(パス)を指定
  • 「/var/www/input」は圧縮したいディレクトリ・ファイルのパスを指定

bzip2がない場合は、インストールする。
yumで入れられるので簡単。

CentOSでbzip2が解凍できないエラー · 1000g

〇日前に作成したファイルを削除

サーバの容量にも限りがある為、〇日分だけ残してそれ以前のファイルを
削除したい場合は、下記のようなコマンドが使えます。

find /var/www/xxx/ -mtime 7 -exec rm -f {} \;

圧縮と7日以前に作られたファイルを削除するbashです。

#!/bin/sh
DATESTR=`date +%Y%m%d`

#圧縮
tar cvjf /var/www/test/${DATESTR}.tar.bz2 /var/www/html/a1

#7日以前のものは削除
find /var/www/test/ -mtime 7 -exec rm -f {} \;

参考)リモートサーバへのコマンド実行

rsyncコマンドで他サーバへバックアップした後に、バックアップ先の
ファイルを圧縮したい場合にリモートサーバへのコマンド実行を行うことがありそうなのでメモ。

sshコマンド

ssh コマンド | コマンドの使い方(Linux) | hydroculのメモ

大きいファイルを圧縮していると、レスポンスがかえってこずに
処理途中で接続が切れてしまう事があるようなので、下記を設定してなるべく切れないようにする。

クライアント側(接続元)の ~/.ssh/config に以下を記述する。

Host *
ServerAliveInterval 60

ssh コマンド | コマンドの使い方(Linux) | hydroculのメモ

moshコマンド

接続が切れても自動で繋ぎなおしてくれるmoshというコマンドもあるよう。
mosh コマンド | コマンドの使い方(Linux) | hydroculのメモ