mysqlエクスポート&インポートをHerokuに

ClearDB

HerokuでClearDBを使ってる状況が前提になります

エクスポート

mysqldump -uUSER_NAME -pPASSWORD -h HOST -r dump.sql --single-transaction DB_NAME

インポート

mysql --host=HOST --user=USER --password=PASSWORD --reconnect heroku_xxxxxx < dump.sql

参考

WindowsでVirtualBox

仮想環境とは

ホストOS上にゲストOSを動かすことができます。 例えばWindows上にCentOSの開発環境を作るといった感じです

仮想環境の代表例

仮想環境の代表的なものにVMVirtualBox、Dockerがあります。 VMは商用、VirtualBoxOSSでスナップショットが取れるという特徴があるようです。 Dockerは最近でてきたものですがWindowsにはHyper-vがないと使えないようです。 ここではVirtualBoxを使ってWindows上でLinux環境を作ってみたいと思います。

Vagrantについて

仮想環境とは別にVagrantというのがありますが、これはVirtualBoxのフロントエンドみたいなものって感じですかね 例えばVirtualBoxだけだとISOを落としてとかネットワーク設定とかしないとダメですが、Vagrantはそういうのをコマンド一発でやってくれます。 ここにあるboxファイルを実行するだけで環境をセットアップできますがセキュリティの心配があるのでここでは使いません。 http://www.vagrantbox.es/

インストール

ここからVirtualBoxインストーラーをダウンロードしてWindowsにインストールします https://www.virtualbox.org/

CentOSイメージ

CentOSのISOイメージをダウンロードしておきます https://www.centos.org/

仮想環境を起動

VirtualBoxマネージャーから新規作成をクリック f:id:yonishiy:20161126205306p:plain

名前に「centos」って入れたところタイプとバージョンに適切なものを選んでくれました f:id:yonishiy:20161126205557p:plain

あとは適当に進み、インスタンスを作成します。 f:id:yonishiy:20161127123803p:plain

インスタンス起動時に先ほどダウンロードしたISOイメージを指定します f:id:yonishiy:20161127123817p:plain

ネットワーク設定

構成

ネットワークは少し時間がかかりました。 なのでここでいったんやりたいことを整理します。

  1. Windowsで仮想環境(CentOS)を動かしてます。
  2. WindowsCentOSもそれぞれ独立して外部ネットワークにつなぎたい
  3. WindowsからSSHを介してCentOSにつなぎたい

ここまでで出来ているのは1,2です。 仮想環境をこのような形にすれば1,2,3が実現します。 アダプターの構成は最終的にこうなります。

  • NAT,DHCPを介して外部とやりとりをおこなう口
  • ホストオンリーアダプター。sshの受け口。

GUI

3を対応するためにVirtualBoxGUI上から新しいアダプター(ホストオンリーアダプター)を追加しましょう eth0はすでにGUI上では出来ています。

CentOS

次に仮想環境側の設定をしましょう

  • eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
HWADDR=<macaddress>
GATEWAY="192.168.56.1"
  • eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
HWADDR=<macaddress>
NETWORK="192.168.56.0"
NETMASK="255.255.255.0"
IPADDR="192.168.56.2"

ホストオンリーアダプターのIPアドレスは以下の方法で確認できます。 ファイル→環境設定→ネットワーク→ホストオンリーネットワーク→アイテムをダブルクリック ここでは192.168.56.1でした。 これはGatewayに設定し、IPアドレスは192.168.56.2で設定します。

設定を反映し再起動します

$ ifup eth0
$ ifup eth1
$ shutdown -r now

sshでつなげてみましょう

$ ssh -A 192.168.56.2

参考

仮想環境VirtualBoxでのネットワークの設定 : アシアルブログ 密かなITエンジニアの備忘録:VirtualBoxのCentOS6.5にSSH接続できるようにする Virtualbox上のUbuntuにSSHで接続するための設定手順 | youria blog Vagrantって流行ってるらしいけど何が便利なの? | Developers.IO 11.1 ネットワーク・インタフェースについて 【Windows7(64bit)】VirtualBox+VagrantでCentOSの仮想環境構築 - Qiita VirtualBoxでNAT + Host-Only Network環境を構築する - Qiita Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する - Qiita CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール - Qiita

LaravelでFacebookログイン

Javascript使えば問題ないかもしれないんですがfacebookのPHPSDKを使う時はさっと使えません。
どうやらsdkでこんな「FBRLH_state」sessionidを使っててlaravelではうまく扱えない?
http://stackoverflow.com/questions/32029116/facebook-sdk-returned-an-error-cross-site-request-forgery-validation-failed-th

ちょっと探したところこんなソースがあったので使ってみる
https://github.com/SammyK/LaravelFacebookSdk

LaravelでのCSRF対策について

LaravelではデフォルトでCSRF対策がついてます。
なので逆に言えばCSRF対策を取らずにPostなどをおこなった場合は TokenMismatchException がスローされます。
これを避けるにはHTMLにトークンを埋め込む必要があります。

通常のテンプレートの場合

<form method="POST" action="post">
    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>


Bladeを使ったテンプレートの場合

<form method="POST" action="post">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Monolog

Monolog とは

MonologはPHPのロギングライブラリでSymfony2やLaravelで採用されています。
使ってみるとすごく便利でしたのでおすすめです^^
https://github.com/Seldaek/monolog

基本的な使い方

これもcomposerで管理するときはこんな感じ

$ composer require monolog/monolog

もしくはcomposer.jsonでこんな感じ

{
    "require": {
        "monolog/monolog": "@stable"
    },
}

ここはドキュメント通りです

<?php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// add records to the log
$log->debug('this is debug');
$log->warning('this is warning');
$log->error('this is error');

StreamHandlerの第二引数で閾値を決めることができます。
この場合は warning と error ログが出力され debug ログは出力されません。

Handler

いくつかのハンドラーを紹介します

Handler -
StreamHandler ログファイルにログを出力します
RotatingFileHandler ログを出力するとともに1日のログを別ファイルにします
SwiftMailerHandler ログ発生時にメールを送信します
FingersCrossedHandler ある一定のレベルを超えたらログを出力します。

pushHandlerを使うことでこれらのハンドラーを組み合わせて使うことができます。

一定のログレベルを超えたら詳細にログを出力する

FingersCrossedHandlerを使うことで、ERRORが発生したらINFOレベルのログもすべて出力する。といった使い方ができます。

$logger->pushHandler(
    new FingersCrossedHandler(
        new RotatingFileHandler($logging_path, 2, Logger::INFO),
        new ErrorLevelActivationStrategy(Logger::ERROR)
    )
);

さらに

ERROR以上のログが落ちた場合はINFOログ以上を出したいが、NOTICEログは常に出したいという場合があると思います。

FingersCrossedHandler の constructor を見ると、常にログを落とす最低限のログレベルを指定できるようです。
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/FingersCrossedHandler.php

    /**
     * @param callable|HandlerInterface       $handler            Handler or factory callable($record, $fingersCrossedHandler).
     * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
     * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
     * @param Boolean                         $bubble             Whether the messages that are handled can bubble up the stack or not
     * @param Boolean                         $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
     * @param int                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered
     */
    public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null){}

こんな感じでいけると思います。

$logger->pushHandler(
    new FingersCrossedHandler(
        new RotatingFileHandler($logging_path, 2, Logger::INFO),
        new ErrorLevelActivationStrategy(Logger::ERROR),
        0,
        true,
        true,
        Logger::NOTICE
    )
);

エラーログのレベルについて

システムのエラーログのレベルは RFC5424 の Syslog に合わせるとよさそうです。
http://tools.ietf.org/html/rfc5424

数字が小さいほど重要なログになります。

Code Level -
0 Emergency システムが機能しない
1 Alert 直ちに何らかの対応が必要
2 Critical 予期しない例外が発生。何らかの対応が必要
3 Error エラー。即時対応は必要ないケースが想定される
4 Warning 実行には問題ないが予期しないエラー
5 Notice 正常だが重要なログ
6 Informational 有益な情報
7 Debug デバッグログ

Redis

Redis とは

Redis(remote dictionary server) はオンメモリのKVSです。
オンメモリなのでmemcacheのように高速で、さらにソートなどの便利機能がついてます
格納できるキーやバリューもバイナリ文字列が使えます
http://redis.io/

Mac に Redis をインストール

brewを使います

$ brew install redis

redis 起動

$ redis-server

$ redis-cli

キー

バイナリセーフな文字列が使えます。
なので画像もキーにできる。
512MBまでOK

データタイプ

Redisがサポートするのは文字列だけではなく、次の7種類のデータタイプをサポートします。

Strings

バイナリセーフな文字列。なので画像も保存できるようですね。
これも512MBまでです。
使い方

// 格納
> set <KEY> <VALUE>

// 取得
get <KEY>

> set mylist a
OK

> get mylist
a

Lists

配列みたいなものです(正確には Linked List)
使い方

// 格納
rpush <KEY> <VALUE>

// 取得

> rpush mylist A
(integer) 1

> rpush mylist B
(integer) 1

> lrange mylist 0 -1
1) "A"
2) "B"

Hash

使い方

hmset <HashName> <KEY> <VALUE> ...

> hmset myhash name tarou birthday 19860101
OK

> hmget myhash name
1) "tarou"

> hmget myhash birthday
1) "19860101"

Sets

順序をもたないユニークなバリューの集合体。だそうです。
ソートはされてません

> sadd myset 1 2 3
(integer) 3

> smembers myset
1) "1"
2) "2"
3) "3"

Sorted Sets

ソートされたSets
Sets と同じものとしてもいいのかもしれません

> zadd myscores 120 john
(integer) 1
> zadd myscores 110 paul
(integer) 1
> zadd myscores 100 george
(integer) 1
> zadd myscores 80 ringo
(integer) 1

> zrange myscores 0 -1
1) "ringo"
2) "george"
3) "paul"
4) "john"

> zrevrange myscores 0 -1
1) "john"
2) "paul"
3) "george"
4) "ringo"

Bitmaps

Hyperloglogs