CakePHP3のBookmarkerチュートリアルでエラー

MacのEl Capitanに開発環境をこさえて、ようやくCakePHPのチュートリアル始めたと思ったら、手順通りやってたのにMySQLでエラーが。

エラーが出たのは、/bookmarks/tagged/funny/cat/gifsのところ。

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #8 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cake_bookmarks.Tags.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

手順通りなのにエラーで困ってたら、どうも原因はMySQLのバージョンによるものらしい。HomebrewでMacに入れたのはVersion 5.7.10。

脱!ゆるふわMySQL – Qiita

5.7以降でsql_modeの初期設定が変更されたらしいです。my.cnfを変更して対応してもいいんですが

mysql – Disable ONLY_FULL_GROUP_BY – Stack Overflow

SET sql_mode = ''

でも対応できるようなので、config/app.php内にある

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        ...(省略)
        'init' => ["SET sql_mode = ''"],
    ],

initにセットして対応。無事、Bookmarkerチュートリアルが完了しますた!!

SSHサーバに公開鍵を設定する方法

SSHサーバに鍵を設定

[OpenSSH] SSHサーバにパスワードなしでログインする方法 – Life with IT

ローカルから公開鍵を送信

scp .ssh/id_rsa.pub username@hostname:~/id_rsa.pub

ログインしてから公開鍵を設定

ssh username@hostname

mkdir .ssh
chmod 700 .ssh/
cd .ssh
cat ~/id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
rm ~/id_rsa.pub

scpコマンドでエラーが出た場合

bash: scp: コマンドが見つかりません – リジェクトされました

bash: scp: コマンドが見つかりません
みたいなエラーが出た場合は、openssh-clientsがサーバに入ってないのが原因みたい。

sudo yum install openssh-clients

自分用EC2サーバ設定メモ

AWS EC2 Linux開発環境 構築メモ – Qiita

こちらの記事を参考に設定。

rootパスワード設定

ec2-userでログイン
sudo su –
passwd
新パスワードを設定
確認パスワードを入力
「all authentication tokens updated successfully.」と表示されたらOK

作業用ユーザーを作成

デフォルトのec2-user以外のユーザーを作成
su –
useadd user1
passwd user1
「all authentication tokens updated successfully.」と表示されたらOK
作成ユーザーにsudo権限を与える
usermod -G wheel user1
visudo
以下行のコメントアウトを外す
#%wheel ALL=(ALL) ALL -> %wheel ALL=(ALL) ALL

SSHポート番号変更

SSHポート番号変更

sshのデフォルト22番から変更
vi /etc/ssh/sshd_config
port 22 -> それ以外(3579とか)
service sshd restart #sshd再起動

セキュリティグループの変更

コンソールのセキュリティグループからインバウンド設定にポートを追加(or変更)
タイプ:カスタムTCPルール
プロトコル:TCP
ポート範囲:3579とか
送信元:マイIPなど、接続する用途に応じて

変更後のポートに対してsshログイン可能であることを確認

日本語設定に変更

cp /etc/sysconfig/i18n ~/i18n.org
sudo vi /etc/sysconfig/i18n
LANG=en_US.UTF-8 -> LANG=ja_JP.UTF-8

最新のソフトウェアにアップデート

sudo yum update -y

タイムゾーンの変更

タイムゾーンの変更

date #確認
cp /etc/localtime ~/localtime.org
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
date #変更を確認

再起動時にUTFに戻らないように

cp /etc/sysconfig/clock ~/clock.org
sudo vi /etc/sysconfig/clock
ZONE=”UTC” -> ZONE=Asia/Tokyo”
UTC=true -> UTC=false

システム全体に反映(全てのプロセスに反映するため)

sudo reboot

メール設定

mailコマンドをAmazon Linuxにインストールする方法 – Hive Color

デフォルトでmailコマンドがないのでmailxをインストール
(…ってsendmailで送ればいい?)
sudo yum install -y mailx
echo “body” | mail -s “subj” test@test.com #送信確認

メールアドレス設定

障害時の通知用

cp /etc/aliases ~/aliases.org
sudo vi /etc/aliases
#root: marc -> root: test@test.com #変更
sudo newaliases #反映
cho test|mail root #送信確認

MacにHomebrewでjqをインストール

JSONを超絶に読みやすくする jq コマンド – WebAPIバリバリ使うor開発する人必須

awsコマンドでjsonを返すように設定したので、jsonを何とかしたい。どうやらjqという超絶便利なものがあるらしいので入れてみることに。

MacならHomebrewで入れるのが簡単。

brew update
brew install jq

多分これだけで入るはず…なんですが、自分は中途半端な理解でhomebrewを使っていたので面倒なことに。

以下余談

問題はbrew updateせずにインストールしようとしてエラーが出たこと。どうやらjq-1.4.tar.gzがダウンロードできない(404 Not Found)のが問題。そこで調べたら下記のURLにヒット。

brew で ffmpeg をインストールしようとしたら 404 エラーが出た – KRAKENBEAL RECORDS

なるほどjq.rbを修正するばいいのかと、下記のように修正。

vi /usr/local/Library/Formula/jq.rb

urlとsha1の値を修正して、brew install jqしたら無事(?)入りました。
その後、brew updateをしようとしたら下記のエラー。

brew update

error: Your local changes to the following files would be overwritten by merge:
    Library/Formula/readline.rb
Please, commit your changes or stash them before you can merge.
error: Your local changes to the following files would be overwritten by merge:
    Library/Formula/jq.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

どうやら内容が変更されてしまってることを怒られてる。やっぱり…適当にしちゃいけません。そもそも先にbrew updateしなきゃいけませんよね。

ヾ(o゚ω゚o)ノ゙brew updateでエラーでたった[Homebrew] – Qiita

上記サイトを参考に修正。homebrewのある場所に移動して、
fetchして、ローカルリポジトリをリモートの最新で上書きした。

cd $(brew --prefix) #多分 /usr/local に移動
git fetch origin
git reset --hard origin/master

これでbrew updateを実行したのと同じ状態になっているはず。ふぅ、これからは気をつけよう…というかちゃんと仕組みを理解しよう…

Amazon Web Service CLIのインストール&設定など(Mac)

勉強がてら試してみたかったので。基本的には公式サイトの手順通りですんなり。

OS:Mac OS X 10.9.5 Mavericks

念のためMacに入ってるpythonのバージョン確認。2.7.5でした。

python -V
Python 2.7.5

AWS CLI のインストールと設定 – Amazon Kinesis

pip のウェブサイトからインストールスクリプトをダウンロードして実行

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py

pip を使用して AWS CLI をインストール

sudo pip install awscli

ここまで手順通り。

AWS CLI の設定

CLIを使うための設定。メールアドレスとパスワードで入るAWSアカウントを普段使いするのは推奨されないらしいので、操作用に全権限を割り当てたIAMユーザーを作成。AWSコンソール画面上から、作成した管理用ユーザーを選択して「アクセスキーの作成」ボタンを押して「アクセスキーID」と「シークレットアクセスキー」を取得しておく。

aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE #アクセスキーID
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY #シークレットアクセスキー
Default region name [None]: ap-northeast-1 #デフォルトの地域。これは東京。下記URL参考
Default output format [None]: json #結果の種類。json/text/tableから選択

Regions and Endpoints – Amazon Web Services

この作業が完了すれば設定OK。コマンドが使えます。

ユーザー一覧を取得してみる

aws iam list-users

{
    "Users": [
        {
            "UserName": "MyUser",
            "PasswordLastUsed": "2015-12-01T09:05:24Z",
            "CreateDate": "2015-11-21T17:51:25Z",
            "UserId": "ABCDEXXXXXXXXXXXXXXXX",
            "Path": "/",
            "Arn": "arn:aws:iam::000001111122:user/MyUser"
        }
    ]
}

こんな感じで設定したjsonで結果が帰ってきます。IAMで使えるコマンドリファレンスは下記を参考にしました。

iam — AWS CLI 1.9.9 Command Reference

ここで、IAMユーザー名をテストで適当につけてしまったけれど、コンソール画面からは変更できず、CLIからしか変更できないようなので丁度いい。変更してみることに。
IAM ユーザーの管理 – AWS Identity and Access Management

aws iam update-user --user-name MyUser --new-user-name hogehoge

–user-nameに現在のUserNameを、–new-user-nameに変更したいUserNameを指定してコマンドを叩けばOK。結果は特に返らず、コンソールから確認したら変更されてました。簡単!

その他使いそうなコマンド(課題)

下記のサイトを思いっきり参考にさせて頂きました。
AWS CLIでサービスの各種コマンドを動かしてみる(EC2編1: インスタンス) | Developers.IO

# インスタンス一覧
aws ec2 describe-instances

# インスタンスを開始
aws ec2 start-instances --instance-ids i-xxxxxxxx

# インスタンスを停止
aws ec2 stop-instances --instance-ids i-xxxxxxxx

# インスタンスを再起動
aws ec2 reboot-instances --instance-ids i-xxxxxxxx

# インスタンスを終了(消去)
aws ec2 terminate-instances --instance-ids i-xxxxxxxx

# インスタンスを作成、起動(指定したimage-idから)
aws ec2 run-instances --image-id ami-xxxxxxxx --min-count 1 --max-count 1

CakePHPのシェルでレベルに応じたコンソール出力を行う方法

CakePHPでシェルを使う際、コンソール出力をするにはプログラム中に$this->out($msg)を記述する。仕様は以下。

変数名 タイプ 説明 デフォルト
$message string|array 出力したい内容 null
$newlines int 出力後の改行数 1
$level int 出力レベル Shell::NORMAL

出力レベルとして指定できる値は、下記の3レベル。

フラグ 出力条件
Shell::QUIET 0 常に出力
Shell::NORMAL 1 未指定、quiet時に出力
Shell::VERBOSE 2 verbose指定時のみ出力

シェルの実行方法は次の通り。
cake shell_name [args]

オプション[args]に、出力レベルを指定することが可能。
指定しないとnormal(quietとverboseの間)になる。

cake shell_name --quiet             # quiet
cake shell_name                     # normal
cake shell_name --verbose           # verbose

シェル起動時に指定した[args]と、out()で指定した出力レベルにおける出力、非出力(×)を表にすると次の通り。

args Shell::QUIET Shell::NORMAL Shell::VERBOSE
–quiet 出力 × ×
(指定なし) 出力 出力 ×
–verbose 出力 出力 出力

結果はこんな感じに。

$this->out('Quiet message', 1, Shell::QUIET);
$this->out('Normal message', 1, Shell::NORMAL);
$this->out('Loud message', 1, Shell::VERBOSE);

cake shell_name --quiet
Quiet message

cake shell_name          
Quiet message
Normal message

cake shell_name --verbose
Quiet message
Normal message
Loud message

3レベルの使い分け方が自分にはいまいち分からないので、デバッグ時のみ確認したい値だけShell::VERBOSEを指定して、それ以外は未指定(Shell::NORMAL)でいいんじゃないかと思ってみたり。

MacbookのMagSafeアダプタが反応しなくなった時は…

コンセントから抜いて60秒待ちましょう。これで動くことがあります。自分のは動きました。

Apple Portables:MagSafe アダプタのトラブルシューティング – Apple サポート

MagSafeアダプタをどう抜き差ししても、軽く掃除しても反応しなくなって、バッテリー切れたらこのMacbookどないしよ…って思って試したら動きました。場合によってはアダプタの故障かもしれないけど、ひとまず数日間は元通り動いてるから良しとしましょう。こわいこわい。

VMware Fusion 5の仮想マシンでIPを固定する

ネットワークの基本的な知識がないので、いつもネット上の知識を鵜呑みにしてその場凌ぎで生きています…

現状

  • Macbookに入れたVMware Fusion 5の仮想マシン(CentOS6)を開発用サーバーにしている
  • 普段は家で開発してるけど、たまに外出先でもしたい
  • でも外だとIPが変わってしまって、sshのconfigやhostsの書き換えが面倒(やってられん)

※以下に記載のIPは全てワタシの環境です。適宜読み替え願います!

今までVMwareのネットワーク設定を「ブリッジされたネットワーキング(自動検出)」にしてました。これだと、家のルーターにMacbook(192.168.24.53)と仮想マシン(192.168.24.60)が同じようにぶら下がった状態です。この状態で、仮想マシンのIPを192.168.24.60に固定して開発するのも、自宅にいる分には何の問題もありません。

…が、外出すると家のルーターは存在しません。192.168.24.***アドレスシリーズではなくなります。hostsも書きなおさなくてはなりません。面倒でやってられない!

なので、その時々のネットワークにぶら下げる形ではなく、Macから直接アクセスできる形でIPを固定しようと思ったのが今回の敬意です。例のように、ネット上の知識の力です。

VMware Fusion のゲスト(仮想)マシンのIPアドレスの固定化

設定手順

  1. VMware Fusionでネットワーク設定を「Macを共有」に
  2. 仮想マシンに割り振るIPを固定化する
  3. 仮想マシン側のIPアドレス設定を固定

VMware Fusionでネットワーク設定を「Macを共有」に

VMware Fusionで対象の仮想マシンの設定画面から、ネットワークアダプタ設定を開いて「Macを共有」にチェック。その際、下にある「詳細オプション」に書いてあるMACアドレスをコピーする。後で必要になります。

仮想マシンに割り振るIPを固定化する

ネットワーク設定の変更を有効にするために仮想マシンのOSを再起動(※多分必要)します。Mac側のターミナルで「ifconfig」コマンドを実行すると、「vmnet8」という「Macを共有」用のゲートウェイが確認できると思います。そこで、vmnet8に仮想マシンのIPを固定化して払い出す設定をします。

vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf

恐らく下記のような記述があるはず。

subnet 192.168.123.0 netmask 255.255.255.0 {
    range 192.168.123.128 192.168.123.254;
    option broadcast-address 192.168.123.255;
    option domain-name-servers 192.168.123.2;
    option domain-name localdomain;
    default-lease-time 1800;                # default is 30 minutes
    max-lease-time 7200;                    # default is 2 hours
    option netbios-name-servers 192.168.123.2;
    option routers 192.168.123.2;
}

このファイルの末尾に下記のような記述を追加します。ホスト名(vmnet8-centos)は、わかりやすい名前をつけておけばOKのはず。hardware ethernetは最初にコピーしておいた仮想マシンのMacアドレス、fixed-addressが払い出したいIPアドレスとなります。このMacアドレスの仮想マシンには、このIPを払い出すよーっていうことですね。ここで注意なのは、上で「range」に記載の通り「192.168.123.128〜192.168.123.254」は動的な払い出しに使用されるので、「192.168.123.3〜127」の間で割り振るのが良いでしょう。

host vmnet8-centos {
    hardware ethernet 00:0C:29:FC:1D:CA;
    fixed-address 192.168.123.100;
}

VMware Fusionの設定変更のため、VMwareを再起動してから(※仮想マシンではなく!)、仮想マシンを起動してifconfigコマンドを実行します。eth0のIPアドレスが上で設定したもの(192.168.123.100)になっていれば、正しくIPアドレスが払い出されていることでしょう。

仮想マシン側のIPアドレス設定を固定

ここまででも、Macから192.168.123.100のサーバーなり何なりにアクセス出来るようになっているはずです。自分の場合は、IP設定がブリッジ接続だった時のままになっていたため、phpでDNS接続エラーが発生してしまいました。

sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

IPADDR=192.168.123.100
NETMASK=255.255.255.0
GATEWAY=192.168.123.2

上記のようにIPADDRは今回設定したIPアドレス、GATEWAYはdhcpd.confに記載されていたdomain-name-serversのアドレスを指定しました。ここが古かったために、ドメイン解決できないといって怒られたんですね。あっ、設定を変更したら念のため(必須?)仮想マシンのOSを再起動しましょう。

まとめ

以上で設定は完了です。試しにMacのWi-Fiを無効にしてネットワークから切断しても、ちゃんと仮想マシンに繋がる!これでいつでも開発できます…うぅ。

上で設定した内容もざっくりは分かるんですが、知識がどれもこれも中途半端なのですね。ちゃんと勉強しなきゃと思いながら、なんやかんや今日に至ります。よくない。

Mac OS X MavericksのPHPでmcrypt拡張を有効にする

Mac OS XのMavericksでComposerを使用しようとしたら、「mcryptねーよ!」って怒られたので、mcrypt拡張を有効にするまでの顛末。基本的には下記のサイトを参考にして進めました。

Mac Lion PHP mcrypt brew | 見なかったことにしてください

手順

  1. homebrewでmcryptをインストール
  2. mcryptの拡張モジュールをコンパイル&インストール
  3. PHPでmcrypt拡張を有効にする

homebrewでmcryptをインストール

(homebrewが入っている前提で)下記コマンドでmcryptをインストールすればOK。

brew install mcrypt

mcryptの拡張モジュールをコンパイル&インストール

下記コマンドでMacに入っているPHPのバージョンを確認。自分の場合は「PHP 5.4.24」でした。

php -v

PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

次に、入っているPHPのバージョンに合わせたソースのダウンロードURLをPHP公式から探します。拡張子は「tar.gz」のファイルで。

PHP: Releases

URLが分かったら、下記コマンドのURL、バージョン部分を置き換えて実行。(PHPをダウンロード&解凍して、mcryptディレクトリに移動します)

curl --location -s http://nl3.php.net/get/php-5.4.24.tar.gz/from/nl1.php.net/mirror  | tar -zx
cd php-5.4.24/ext/mcrypt/

次にmcrypt拡張のコンパイルとインストールを行う…その前に、phpizeが使えるかを確認します。ちなみに自分の場合は使えませんでした。

phpize -v

Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

こんな感じでPHP Api Versionが表示されれば使えるはずです。使えない場合、下記を参考にしてphpizeを使えるようにして下さい。

Mac OS X Mavericksでphpizeを使用する方法 | ぢぇんのブログ

ここまで準備が出来たら、mcrypt拡張をコンパイル&インストールします。

cd php-5.4.24/ext/mcrypt/
phpize
./configure
make -j6
make test
sudo make install

PHPでmcrypt拡張を有効にする

MacのPHPはデフォルトでphp.iniを参照していないので、php.iniを参照するようにdefaultファイルからコピーして編集します。php.ini.defaultファイルをコピーしてphp.iniを作成し、viエディタでphp.iniにmcrypt拡張を有効にする記述を追加したのち、apacheを再起動します。

php.iniの編集は、「;extension=****」が並んでいる部分の最後らへんに、「extension=mcrypt.so」の行を追記してファイルを上書きすればOKです。

sudo cp /etc/php.ini.default /etc/php.ini
sudo vi /etc/php.ini
sudo apachectl restart

下記コマンドを実行して、「mcrypt support => enabled」の記述があればインストール完了です。

php -i | grep -i mcrypt

Mac OS X Mavericksでphpizeを使用する方法

Mac OS X Mavericksでphpのmcrypt拡張をインストールする際、phpizeが必要になったので、phpizeが使用できるようになるまでの手順をメモ。

手順

  1. Xcode Command Line Toolsのインストール
  2. autoconfのインストール

Xcode Command Line Toolsのインストール

ターミナルで下記コマンドを入力すると、「xcode-selectコマンドを実行するにはコマンド・デベロッパー・ツールが必要です。ツールを今すぐインストールしますか?」と確認が出るのでインストールする。

xcode-select --install

autoconfのインストール

homebrewを使用してautoconfをインストールする。homebrewが入っていれば、通常は下記コマンドでインストールするだけでOK。

brew install autoconf

なんだけど、Mountain LionからMavericksにOSをアップデートした際にbrewでインストールしたコマンドのパスがなぜか通らなくなってしまっていたので、一度アンインストールしてからインストールしました。

brew uninstall autoconf
brew install autoconf

以上の2つで、phpizeが使用できるようになります(はず)