americandog1993の日記

プログラマー歴半年のメモ

CakePHPでマイグレーションしてみる

mysqlに入って直接createせずにcakeコマンドでテーブルを作ってみる。

環境

CentOS7
CakePHP3
MySQL 5.7

マイグレーション

ブログチュートリアルのarticlesテーブルをマイグレーションしてみる。

$ bin/cake bake migration CreateArticles id title:string body:text created modified
2017-08-14 10:54:00 Error: [PDOException] SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'id' in /var/www/html/blog_tutorial/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 338

idカラムは最初からあるのでカラム設定する必要ないっぽい。
というか入れるとすでにあるんですけどってエラーになる。
やり直し。

$ bin/cake bake migration CreateArticles title:string body:text created modified

できたマイグレーションファイルが以下。

<?php
use Migrations\AbstractMigration;

class CreateArticles extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('articles');
        $table->addColumn('title', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('body', 'text', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }
}

createdとmodifiedはカラム名だけで察してくれて勝手に設定してくれる様子。
これを実行するには

$ bin/cake migrations migrate

と叩く。
これでテーブルが生成される。

補足 ブログチュートリアル注意点

このテーブル設定のままブログチュートリアル

INSERT INTO articles (title,body,created)
    VALUES ('タイトル', 'これは、記事の本文です。', NOW());
INSERT INTO articles (title,body,created)
    VALUES ('またタイトル', 'そこに本文が続きます。', NOW());
INSERT INTO articles (title,body,created)
    VALUES ('タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', NOW());

のクエリを実行しようとするとmodifiedカラムのNOT NULLに引っかかる。
その場合は以下のINSERT文に直して対応。

INSERT INTO articles (title,body,created,modified)
    VALUES ('タイトル', 'これは、記事の本文です。', NOW(), NOW());
INSERT INTO articles (title,body,created,modified)
    VALUES ('またタイトル', 'そこに本文が続きます。', NOW(), NOW());
INSERT INTO articles (title,body,created,modified)
    VALUES ('タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', NOW(), NOW());

補足2 Herokuでマイグレーションする

$ heroku run bash

でHerokuのコマンドラインに入れるので、

~ $ bin/cake migrations migrate

と叩く。

MySQL日本語対応

初期設定で日本語をINSERTすると文字化けする。

環境

CentOS7

my.cnf設定

$ sudo vi /etc/my.cnf

以下を加筆。

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8

MySQL再起動。

$ sudo systemctl restart mysqld

設定確認。

$ mysql -u root -p
mysql>status
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8

文字コードがutf8になっていればOK。

CakePHP HerokuでHelloWorld

とりあえずHelloWorldまで。

環境

ローカル vagrant CentOS7
公開 Heroku

ローカル環境構築

VirtualBoxのCentOS7にCakePHPを導入する - Qiita
CakePHP環境構築。
HerokuToolbeltインストールにはrubyが必要 - americandog1993の日記
HerokuToolbeltも入れておく。

HelloController.php

手元の『CakePHP3入門』を見ながら書いた。

$ touch src/Controller/HelloController.php
// src/Controller/HelloController.php

<?php
namespace App\Controller

class HelloController extends AppController {
    public $name = 'Hello';
    public $autoRender = false;
    public function index(){
        echo "Hello World";
    }
}

routes.php

ルーティング設定。

// config/routes.php

Router::scope('/', function (RouteBuilder $routes) {
    /**
     * Here, we are connecting '/' (base path) to a controller called 'Pages',
     * its action called 'display', and we pass a param to select the view file
     * to use (in this case, src/Template/Pages/home.ctp)...
     */
//  $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/', ['controller' => 'Hello', 'action' => 'index']);

Herokuデプロイ設定

Herokuデプロイの設定は以下を参考に。
CakePHP3をHerokuで動かす設定 - Qiita

$ heroku config:add CAKE_ENV="heroku"

config/bootstrap.php

// Load an environment local configuration file.
// You can use a file like app_local.php to provide local overrides to your
// shared configuration.
//Configure::load('app_local', 'default');
if (isset($_ENV['CAKE_ENV'])) {
    Configure::load('app_' . $_ENV['CAKE_ENV'], 'default');
}

Procfile

Webサーバとルートディレクトリの設定。

$ touch Procfile
$ vi Procfile
web: vendor/bin/heroku-php-apache2 webroot

デプロイ

$ git init
$ heroku create アプリ名
$ git add .
$ git commit -m "first commit"
$ git push heroku master

HerokuToolbeltインストールにはrubyが必要

環境

vagrant CentOS7

エラー

CentOS7にheroku toolbeltをインストール - Qiita
これ見ながらphp開発環境でherokutoolbelt入れようとしたらエラー。

/usr/bin/env: ruby: そのようなファイルやディレクトリはありません

Cloud9利用時やRoR開発では引っかからなかったが、HerokuToolbeltを動かすにはどうもrubyが必須っぽい。

ruby導入

CentOS 7でのRuby on Rails動作環境を構築する - Qiita
Rails開発しない場合はリンク先のruby -vまででOK。
まだgit, wgetを入れてない場合は、あらかじめ、

$ sudo yum install git
$ sudo yum install wget

しておく。

rubyが入った状態で

$ heroku version

でheroku導入を確認できる。

~/.ssh/configに接続先VPSを登録

環境

CentOS7

動機

$ ssh -p 22 user@xxx.xxx.xx.xx

毎回これを打つのに嫌気が差してきたので。

接続先登録

.sshディレクトリ下のconfigファイルで設定できる。
自分の場合は最初の状態でconfigファイルがなかったので作成した。

$ sudo touch ~/.ssh/config
$ sudo vi ~/.ssh/config

以下の形式で設定する。

Host myvps(任意の名前)
    HostName xxx.xxx.xx.xx(IPアドレス。ドメイン設定済の場合はドメイン名でも良い)
    User username(接続先VPSのユーザ名)
    Port 22(ssh接続で使うポート番号)
    IdentityFile ~/.ssh/id_rsa(秘密鍵)

これで楽にログインできるようになる。

$ ssh myvps

ライブ中、観客がバンドにスマホで野次を飛ばせるWebアプリを作った

趣味でアマチュアロックバンドをやっている。
活動歴だけは無駄に長いが、無名のバンドなので、ライブでは客がシーンとしていることも少なくない。
MCでレスポンスを求めても、何も返ってこないことがよくある。

それは、こちらの演奏とか、パフォーマンスとか、喋りに原因があるのかもしれないが、自分は楽観的なので、「客側がシャイなのだろう」と考えている。
実際、アマチュアバンドのライブのあの微妙な空気の中で、客席側から声をあげるのはけっこう勇気のいることだと思う。

そこで、シャイな人でもライブ中に周囲へ感情を表現できるようなWebアプリを作ってみた。

コンセプト

  • スマホを使って匿名でバンド側に野次を飛ばせる。
  • 野次は会場全員が見ることができる。
  • ダウンロードの手間がかかるのでネイティブアプリにしない。URLにアクセスするだけで使えるWebアプリ。
  • ユーザ登録とか客の面倒になる機能は一切入れない。シンプルに作る。

使用技術

作ったWebアプリ

テキスト野次
テキスト野次。直球の命名である。
f:id:americandog1993:20170805000930g:plain
まず、バンドが演奏するステージ側にスクリーンを設置する。
スクリーンにはステージ側表示用のライブページを表示させておく。

客が使う投稿用のページでは過去の投稿ログを見れる。対して、ライブページでは最新の投稿1件のみ表示させている。
ステージ上のスクリーンには、1つの投稿を大きく表示した方が見やすいと考えたためである。

投稿された野次はAjax通信で毎秒更新表示される。

使ってみた感想

実際に先月7月にライブで使ってみた。
ライブハウスの壁一面にURLから生成したQRコードを張り出し、観客への利用を促した。
全員とはいかなかったが、4割くらいの人がQRコードをスキャンしてくれていたように思う。

演奏中はほとんど野次は投稿されなかった。
投稿されるのはほとんどがMCの間だった。
少しウケを狙ったりすると、ツッコミが投稿されたりして面白かった。
スベったらスベったで「スベってる」「クソつまらない」等と投稿されてそれでウケたりするので、試みとしては割と成功だったかなと思っている。

今後のライブでも改良しながら使っていきたい。

Herokuアプリにお名前comで取得したドメインを設定

Herokuアプリにドメイン設定

調べるとたくさん出てくるが記事ごとに言ってることが若干違う。
これはHerokuのドメイン設定方法が何度か変更されていることが原因と思う。
右往左往して結局Heroku公式ドキュメントを参考に設定できた。
本記事は2017年8月時点ではこれでいけたよという覚書。
ちなみにサブドメイン付きの設定方法なので注意。

前提

お名前comでドメイン取得済
Herokuアプリデプロイ済
Herokuツールベルトインストール済

Heroku側設定

アプリのディレクトリで以下のコマンドを叩く。

$ heroku domains:add www.yourdomainname.com

注意としては、ドメインの頭にwww.を付けてaddすること。
設定を確認。

$ heroku domains

するとDNS Targetを確認できる。
DNS Targetはお名前com側の設定で必要になる。
現時点の仕様ではwww.yourdomainname.com.herokudns.comと出るはず。

お名前com側設定

お名前comにログイン。
使用するドメインDNSレコード設定画面に入る。
ここでDNS Targetを使う。

www CNAME www.yourdomainname.com.herokudns.com

を追加。
なお、お名前comのネームサーバを利用するにチェックを入れておくこと。
これで設定登録する。

待つ

数時間〜1日待つと設定したドメインでつながるようになる。

いくら待ってもつながらない場合

自分は最初うまくいかなかった。1週間待ってもつながらなかったのだ。
DNSまわりは素人にはややこしく、いろいろ原因は考えられるが、自分の場合はお名前com側設定の不足だった。

【重要】[お名前.com] ドメイン 情報認証について | ドメイン取るなら ドメイン取得 最安値 1円!|ドメイン取るならお名前.com

お名前comから来る認証メールを確認していないだけだった。とんだ凡ミス。
これが迷惑メールに振り分けられており、受信に気づかなかった。
認証を済ませると3時間ほどでつながるようになった。