2016年1月27日水曜日

Laravel5のRequestクラス覚書き

Laravel5のリクエストの扱い方、よく忘れるので覚書き。

Requestクラスを「$request」に格納した場合

◼︎リクエストの全入力取得
$request->all();

◼︎url取得
$request->url()

◼︎bodyの内容をそのまま取得
$request->getContent();

◼︎json取得
$request->json()
parameterBagクラスのインススタンスが返ってくる。
$request->json()を「$parameterBag」に格納した場合

・全てのパラメータ取得
$parameterBag->all();
・特定のパラメータ取得
$parameterBag->get('id');

2015年12月28日月曜日

laravel5のメンテナンスモードをカスタマイズする方法

laravel5では下記のコマンドでメンテナンスモードに切り替えることができますが
php artisan down

メンテナンスモードに切り替えた際の挙動の変更方法がマニュアルで見つけることができなかったので、その方法を記載します。

====================================
1.ミドルウェアを生成
php artisan make:middleware CheckForMaintenanceMode

2.app/Http/Kernel.phpのCheckForMaintenanceModeのパスを変更
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode'
→'App\Http\Middleware\CheckForMaintenanceMode'

3.app/Http/Middleware/CheckForMaintenanceMode.phpを修正
<?php namespace App\\Http\\Middleware;
use Closure;
use Illuminate\\Contracts\\Routing\\Middleware;
use Illuminate\\Contracts\\Foundation\\Application;
use Illuminate\\Http\\Request;

class CheckForMaintenanceMode implements Middleware {
 
 protected $request;
 protected $app;

 public function __construct(Application $app, Request $request)
 {
  $this->app = $app;
  $this->request = $request;
 }

 public function handle($request, Closure $next)
 {
  if ($this->app->isDownForMaintenance() && 
   !in_array($this->request->getClientIp(), [\'【通したいIP】\']))
  {
   return response(\'Be right back!\', 503);
  }

  return $next($request);
 }
}
====================================
後は、CheckForMaintenanceMode.phpを適宜修正するだけです。



■参考サイト
https://laracasts.com/discuss/channels/general-discussion/laravel-5-maintenance-mode

2015年12月5日土曜日

mysqlでランダムに1行、行ロックをかける方法

シリアルコード、当選番号などあらかじめテーブルに入れておき、後からユーザー情報と
ひも付けたいというケースあると思います。
そんな時、昇順にロックしていくと行ロックがかぶる可能性が上がるので、ランダムに
行ロックかけたいですよね。

そこで、mysqlでランダムに1行、行ロックかける方法記載します。

まず、簡単にテーブル作成から

下記のSQLでテーブルを作成
create table serials(id int AUTO_INCREMENT, code varchar(20),user_id int, INDEX(id)) ENGINE=InnoDB;

下記のSQLでレコードを作成します。
insert into serials (id,code,user_id) values (1,'a',null);
insert into serials (id,code,user_id) values (2,'b',null);
insert into serials (id,code,user_id) values (3,'c',null);
insert into serials (id,code,user_id) values (4,'d',null);
insert into serials (id,code,user_id) values (5,'e',null);

下記のSQLでランダムに1行だけロックすることができます。

begin;
select * from serials AS a inner join (select id from serials order by rand() limit 1 ) AS b on a.id = b.id for update;
→◯


ちょっとはまったので、失敗談記載します。

begin;
select * from serials order by rand() limit 1 for update;
→×


これだと、テーブル全体にロックかかります。
posgresだったらいけるんですが・・・


idをサブクエリで指定し、行ロック。

begin;
select * from serials where id = (select id from serials order by rand() limit 1) for update;
→×

これ、恐ろしい結果になります。

id=で指定して言うので取得できる行は1行かと思いきや、複数行selectされます。

serialsテーブルの各行、各行でselectが走り、毎度、比較するidが変わるようですね。


ちなみに、inner join で行ロックする方法AUTO_INCREMENT付けてない場合、行ロックになりませんでした。

2015年11月27日金曜日

半角英数記号の正規表現

半角英数記号の正規表現の覚書き。

http://e-words.jp/p/r-ascii.html

asciiコード表より下記の正規表現で行けます。
※半角SPは含みません。

^[!-~]+$

$value = 'hoge';

if (preg_match('/^[!-~]+$/', $value)) {

    echo 'match';

}

知ってると便利なlinuxコマンド

知ってると便利なlinuxコマンド

▼パーミッション保持したまま圧縮
tar cvzfp xxxxx.tar.gz ディレクトリ名
※rootで行わないとオーナー情報が保持されない。

▼パーミッション保持したまま解凍
tar xvzfp xxxxx.tar.gz
※rootで行わないとオーナー情報が保持されない。

▼CPU負荷率監視
vmstat 1
si スワップに書き込んでる
so スワップから読み出し
※メモリが足りてない
wa cpu待機状態になっているパーセンテージ
※通常0%、テーブルロックなどでパーセンテージが上がる

▼実行中プロセス
ps auxf | less

▼ディレクトリ内、文字列検索
find . -type f -name "*.*" | xargs grep "hoge"

▼ファイル日付変更
touch -d "2015/2/18 00:00:00 am"

▼リアルタイムでファイルの末尾を表示
tail -f hoge.log
※デバックで便利

2015年11月26日木曜日

phpでutf8文字コード表を出力

phpでUTF8文字を出力するプログラムです。

<table border>
<?php
$i = 0;
print \'<tr>\';
print \'<td></td>\';
print \'<td></td>\';
while ($i < 16) {
 print \'<th>\' . $i . \'</th>\';
 $i++;
}
print \'</tr>\';
// 1バイト文字出力
$oneByte = 0;
$num = 0;
while ( $oneByte < 128) {
 if ( bcmod($num , 16) == 0) {
  print \'<tr>\';
  print \'<th>\' . dechex($num) . \'</th><th>\' . $num . \'</th>\';
 }
 echo \'<td>\' . chr($oneByte) . \'&nbsp;</td>\';

 if (bcmod($num , 16) == 15 ) {
  print \'</tr>\';
 }
 $oneByte++;
 $num++;
}
// 2バイト文字出力
$twoByte = 194;
while ( $twoByte < 224) {
 $twoByte2 = 128;
 while ( $twoByte2 < 192) {
  if ( bcmod($num , 16) == 0) {
   print \'<tr>\';
   print \'<th>\' . dechex($num) . \'</th><th>\' . $num . \'</th>\';
  }
  echo \'<td>\' . chr($twoByte) . chr($twoByte2) . \'&nbsp;</td>\';
  if (bcmod($num , 16) == 15 ) {
   print \'</tr>\';
  }
  $twoByte2++;
  $num++;
 }
 $twoByte++;
}
// 3バイト文字出力
$threeByte = 224;
while ( $threeByte < 240) {
 if ( $threeByte == 224 ) {
  $threeByte2 = 160;
 } else {
  $threeByte2 = 128;
 }
 while ( $threeByte2 < 192) {
  $threeByte3 = 128;
  while ( $threeByte3 < 192) {
   if ( bcmod($num , 16) == 0) {
    print \'<tr>\';
    print \'<th>\' . dechex($num) . \'</th><th>\' . $num . \'</th>\';
   }
   echo \'<td>\' . chr($threeByte) . chr($threeByte2) . chr($threeByte3) . \'&nbsp;</td>\';
   if (bcmod($num , 16) == 15 ) {
    print \'</tr>\';
   }
   $threeByte3++;
   $num++;
  }
  $threeByte2++;
 }
 $threeByte++;
}
?>
</table>

2015年11月25日水曜日

postgresでロックされてるテーブルを確認する方法

postgresでロックされてるテーブルは下記のSQLで確認できます。
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode
FROM pg_locks l
        LEFT JOIN pg_class c ON l.relation=c.relfilenode
        LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;

SELECT * FROM pg_stat_activity where procpid IN (SELECT pid FROM pg_locks GROUP BY pid);