americandog1993の日記

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

Macでssh-copy-id

Linuxssh-copy-idが楽すぎるのでMacでも使いたい時のメモ。

環境

OSX EICapitan

手順

要するにLinuxssh-copy-idスクリプトをコピーしてくればいいだけだった。

$ curl https://raw.githubusercontent.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
$ chmod +x /usr/local/bin/ssh-copy-id

よくわからないgithubから落としたくない場合は自前の仮想Linuxからスクリプトを探してコピーする。

$ which ssh-copy-id

whichを叩けば場所がわかる。

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の間だった。
少しウケを狙ったりすると、ツッコミが投稿されたりして面白かった。
スベったらスベったで「スベってる」「クソつまらない」等と投稿されてそれでウケたりするので、試みとしては割と成功だったかなと思っている。

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