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の開発環境を作るといった感じです
仮想環境の代表例
仮想環境の代表的なものにVMやVirtualBox、Dockerがあります。 VMは商用、VirtualBoxはOSSでスナップショットが取れるという特徴があるようです。 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マネージャーから新規作成をクリック
名前に「centos」って入れたところタイプとバージョンに適切なものを選んでくれました
あとは適当に進み、インスタンスを作成します。
インスタンス起動時に先ほどダウンロードしたISOイメージを指定します
ネットワーク設定
構成
ネットワークは少し時間がかかりました。 なのでここでいったんやりたいことを整理します。
ここまでで出来ているのは1,2です。 仮想環境をこのような形にすれば1,2,3が実現します。 アダプターの構成は最終的にこうなります。
GUI
3を対応するためにVirtualBoxのGUI上から新しいアダプター(ホストオンリーアダプター)を追加しましょう 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/
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"