<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>STEP UP BLOG</title>
    <description>ステップアップしていくブログです。</description>
    <link>http://capella.3rin.net/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>Laravelの開発環境でカスタムエラーページを表示させないために</title>
      <description>Laravel 5.2対象。&lt;br /&gt;
Laravel 5.2では、&lt;br /&gt;
resources/views/errors&lt;br /&gt;
以下に&lt;br /&gt;
resources/views/errors/404.blade.php&lt;br /&gt;
resources/views/errors/500.blade.php&lt;br /&gt;
のようにHTTPステータスコードのビューファイルを置くことで、独自のエラーページを表示させることができます(ステータスコードでなくてもできますが)。&lt;br /&gt;
しかし、開発環境では小綺麗なエラーページでなく、どんなエラーがどこで起きたか知りたいのが常。&lt;br /&gt;
というわけで本番環境ではないときに、カスタムエラーページではなくLaravelのエラースタックトレース画面を表示させるにはどうすればいいか。&lt;br /&gt;
Laravel 5.2でのエラーハンドリングは、&lt;br /&gt;
app/Exceptions/Handler.php のHandlerクラスが取り扱っています。&lt;br /&gt;
このクラスはExceptionHandlerクラスを継承していて、ExceptionHandlerクラスにはrenderHttpExceptionメソッドといういかにもそれっぽいメソッドがあります。&lt;br /&gt;
このrenderHttpExceptionメソッドがカスタムエラーページを描画しています。&lt;br /&gt;
そこでrenderHttpExceptionメソッドをHandlerクラスでオーバーライドしましょう。&lt;br /&gt;

&lt;pre class=&quot;&amp;ldquo;brush:plain&amp;rdquo;&quot;&gt;/**
 * Render the given HttpException.
 *
 * @param  \Symfony\Component\HttpKernel\Exception\HttpException  $e
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function renderHttpException(HttpException $e)
{
    if (!App::environment('production')) {
        return $this-&amp;gt;convertExceptionToResponse($e);
    }

    return parent::renderHttpException($e);
}&lt;/pre&gt;
&lt;br /&gt;
上記をHandler.php内に記述すれば、本番環境以外でカスタムエラーページが表示されなくなります。&lt;br /&gt;
という感じで快適なLaravelライフを(^人^)</description> 
      <link>http://capella.3rin.net/Entry/51/</link> 
    </item>
    <item>
      <title>サーバが増えるとつらい</title>
      <description>最近行なった七面倒な作業にサーバ10台以上にSSL証明書をインストールするというものがありました。&lt;br /&gt;
めんどー！泣&lt;br /&gt;
sshログインして証明書を更新してApacheを再起動して、と1台目のサーバで作業した時点でこれは大変だと気付いたので、インストール用のシェルプログラムを書いて出来る限り自動化したのですが、それでもそこそこの時間がかかりました。&lt;br /&gt;
サーバ毎に確認も必要で、なんですべてのサーバに証明書を置かないといけないのかと。。。&lt;br /&gt;
こういう複数サーバ構成だと、やはりロードバランサーにSSL証明書を起きたいものです。&lt;br /&gt;
即ちELB。(E)えげつないほど(L)楽ちんで(B)便利なロードバランサーことELB。&lt;br /&gt;
ELB使うと楽ですよね。&lt;br /&gt;
AWSにロックインされてしまいますが。&lt;br /&gt;
操作もシンプルですし、唯一リダイレクトループにさえ気をつければこれほど便利なサービスはないと思います。&lt;br /&gt;
ELBを使えばSSL証明書もELBに置きさえすればいいのでサーバ毎のインストールは必要ありません。&lt;br /&gt;
というわけで、これから規模の大きいサーバ構成にしたいときはAWSをメインに検討していきたいですね。</description> 
      <link>http://capella.3rin.net/Entry/50/</link> 
    </item>
    <item>
      <title>CentOS6以前とCentOS7でのよく使うコマンドのメモ</title>
      <description>主にWebサーバを動かすときによく使うコマンドを挙げています。&lt;br /&gt;
&lt;br /&gt;
・サービス一覧&lt;br /&gt;
CentOS6以前&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ chkconfig --list&lt;/pre&gt;
&lt;br /&gt;
CentOS7&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ systemctl list-units --type=service&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
・サービスの状態、起動、停止、再起動(例:httpd)&lt;br /&gt;
CentOS6以前&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;# service httpd status
# service httpd start
# service httpd stop
# service httpd restart&lt;/pre&gt;
&lt;br /&gt;
CentOS7&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;# systemctl status httpd.service
# systemctl start httpd.service
# systemctl stop httpd.service
# systemctl restart httpd.service&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
・ファイアウォール&lt;br /&gt;
CentOS6以前&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;# iptables -nvL
# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT&lt;/pre&gt;
&lt;br /&gt;
CentOS7&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;# firewall-cmd --list-services --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent&lt;/pre&gt;
&lt;br /&gt;
firewalldはサービス名で追加削除できるのでわかりやすいですね。</description> 
      <link>http://capella.3rin.net/Entry/49/</link> 
    </item>
    <item>
      <title>Font Awesome</title>
      <description>仕事でFont Awesomeを使ってます。&lt;br /&gt;
Font AwesomeはフリーのWebアイコンフォントです。&lt;br /&gt;
商用利用可能です。&lt;br /&gt;
&lt;a href=&quot;http://fontawesome.io/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;http://fontawesome.io/&lt;/a&gt;&lt;br /&gt;
味気ない業務サイトも見出しやメニューなどにアイコンが付くと、とたんにフレンドリーに見えてきます。&lt;br /&gt;
使い方も簡単です。&lt;br /&gt;
&lt;a href=&quot;http://fontawesome.io/examples/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;http://fontawesome.io/examples/&lt;/a&gt;&lt;br /&gt;
アイコンの種類も豊富で日々増えています。&lt;br /&gt;
だいたい欲しいアイコンは揃っています。&lt;br /&gt;
&lt;a href=&quot;http://fontawesome.io/icons/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;http://fontawesome.io/icons/&lt;/a&gt;&lt;br /&gt;
バッテリーアイコンなど残量に応じて11種類のアイコンが用意されています。&lt;br /&gt;
これさえあれば他に何も要らないレベルです。&lt;br /&gt;
もうアイコンだけで会話ができるレベルです。&lt;br /&gt;
サイトにもう一味わかりやすさを求めているときに活用してみてはどうでしょうか。</description> 
      <link>http://capella.3rin.net/Entry/48/</link> 
    </item>
    <item>
      <title>MySQLのSQLプロファイリング</title>
      <description>MySQLの実行が遅いときはチューニングが必要です。&lt;br /&gt;
MySQLのSQLチューニングですが、基本中の基本がexplainです。&lt;br /&gt;
スロークエリログで見つけた遅いSQLをexplainで実行して、適切なインデックスが使用されているか調べるのが、まずはチューニングの第一歩です。&lt;br /&gt;
それでも高速化したいSQLのどこが遅いのかわからないときはSQLのプロファイリング情報を調べます。&lt;br /&gt;
プロファイリングは以下のようにして表示できます。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;mysql&amp;gt; SET PROFILING = 1;
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; SELECT ...
...
...
117 rows in set (6 min 54.15 sec)

mysql&amp;gt; SHOW PROFILE;
+------------------------------+------------+
| Status                       | Duration   |
+------------------------------+------------+
| starting                     |   0.000246 |
| checking permissions         |   0.000004 |
| checking permissions         |   0.000003 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000005 |
| Opening tables               |   0.000030 |
| System lock                  |   0.000005 |
| Table lock                   |   0.000094 |
| optimizing                   |   0.000032 |
| statistics                   |   0.000051 |
| preparing                    |   0.000033 |
| Creating tmp table           |   0.000026 |
| executing                    |   0.000003 |
| Copying to tmp table         |   0.161709 |
| Sorting result               |   0.000767 |
| Sending data                 |   0.002630 |
| removing tmp table           |   0.000008 |
| Sending data                 |   0.000007 |
| init                         |   0.000112 |
| optimizing                   |   0.000022 |
| statistics                   |   0.000041 |
| preparing                    |   0.000030 |
| Creating tmp table           |   0.000066 |
| executing                    |   0.000003 |
| Copying to tmp table         |   0.050874 |
| converting HEAP to MyISAM    |   0.033028 |
| Copying to tmp table on disk | 103.846074 |
| Sorting result               | 158.297312 |
| Sending data                 | 151.018799 |
| end                          |   0.000026 |
| removing tmp table           |   0.807298 |
| end                          |   0.000016 |
| query end                    |   0.000004 |
| freeing items                |   0.000045 |
| removing tmp table           |   0.000009 |
| freeing items                |   0.000010 |
| removing tmp table           |   0.000004 |
| freeing items                |   0.000005 |
| removing tmp table           |   0.000006 |
| freeing items                |   0.000033 |
| removing tmp table           |   0.000007 |
| closing tables               |   0.000011 |
| logging slow query           |   0.000002 |
| logging slow query           |   0.000006 |
| cleaning up                  |   0.000007 |
+------------------------------+------------+
50 rows in set (0.00 sec)&lt;/pre&gt;
&lt;br /&gt;
上記のように調べたいSQLを実行した後にSHOW PROFILEします。&lt;br /&gt;
これはJOINの多いSQLを実行したときですが、めちゃくちゃtmpテーブルを作ってますね。。。&lt;br /&gt;
この場合はそもそもJOINがここまで必要とするテーブル構成でいいのか疑問となってきます。&lt;br /&gt;
また、&quot;Sorting result&quot;に時間がかかっているのでORDER BYかもしくはGROUP BYがボトルネックとなっていると思われます。&lt;br /&gt;
これ以外に手軽にできるチューニングというと、あとはバッファサイズの変更でしょうか。これはサーバスペックなどとにらめっこしながら適正値を探っていかないとなりません。&lt;br /&gt;
という感じで、今回はMySQLのSQLプロファイリング情報を調べてボトルネックを突き止めるということをまとめてみました。</description> 
      <link>http://capella.3rin.net/Entry/47/</link> 
    </item>
    <item>
      <title>既存PHPに後から拡張モジュールをインストールする</title>
      <description>既にインストールされているPHPに後から拡張モジュールを追加しないといけない場合があると思います。&lt;br /&gt;
そのようなときの拡張モジュールのインストール手順です。&lt;br /&gt;
今回は例としてzipモジュールをインストールします。&lt;br /&gt;
PHPを新しくインストールするときならば--enable-zipをconfigureオプションとして指定すればいいのですが、この場合既にPHPはインストールされているのでそうもいきません。&lt;br /&gt;
尚、PHPをソースコードからコンパイル、インストールした場合で、HTTPサーバはApacheです。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ cd /usr/local/src/php-5.x.xx/ext/zip&lt;/pre&gt;
&lt;br /&gt;
PHPソースコードのディレクトリにはextという拡張モジュールのソースコードが入っているディレクトリがあるので、extの中の該当するモジュールのディレクトリに移動します。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ sudo /usr/local/bin/phpize
$ sudo ./configure --with-php-config=/usr/local/bin/php-config
$ sudo make
$ sudo make test
$ sudo make install
$ sudo vi /usr/local/lib/php.ini
+ extension=zip.so
$ sudo service httpd restart
$ php -i | grep zip
Registered PHP Streams =&amp;gt; compress.zlib, php, file, glob, data, http, ftp, zip, phar  
gzip compression =&amp;gt; enabled
bzip2 compression =&amp;gt; disabled (install pecl/bz2)
zip
Libzip version =&amp;gt; 0.10.1&lt;/pre&gt;
&lt;br /&gt;
以上となります。&lt;br /&gt;
configureでphp-configのエラーが出る場合は--with-php-configでphp-configのパスを指定してあげます。&lt;br /&gt;
簡単ですね。&lt;br /&gt;
という感じで気軽にモジュールは追加していったらいいと思います(外す場合はphp.iniのextension記述を削除すればいいので)。</description> 
      <link>http://capella.3rin.net/Entry/46/</link> 
    </item>
    <item>
      <title>PsySHでPHPのREPL</title>
      <description>RubyやPythonなどと同様にPHPにもREPLがあります。&lt;br /&gt;
それがPshSHです。&lt;br /&gt;
REPLとは&quot;Read Eval Print Loop&quot;の略で対話型の実行環境を指します。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://psysh.org/&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;http://psysh.org/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ありがたいことに最新のLaravel5.3では自動でインストールされます。&lt;br /&gt;
入ってなくてもcomposerを使えば簡単にインストールできます。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ composer require psy/psysh:@stable&lt;/pre&gt;
&lt;br /&gt;
まずは起動してみます。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ ./vendor/psy/psysh/bin/psysh 
Psy Shell v0.8.0 (PHP 7.1.0 &amp;mdash; cli) by Justin Hileman
&amp;gt;&amp;gt;&amp;gt; help
  help       Show a list of commands. Type `help [foo]` for information about [foo].      Aliases: ?                     
  ls         List local, instance or class variables, methods and constants.              Aliases: list, dir             
  dump       Dump an object or primitive.                                                                                
  doc        Read the documentation for an object, class, constant, method or property.   Aliases: rtfm, man             
  show       Show the code for an object, class, constant, method or property.                                           
  wtf        Show the backtrace of the most recent exception.                             Aliases: last-exception, wtf?  
  whereami   Show where you are in the code.                                                                             
  throw-up   Throw an exception out of the Psy Shell.                                                                    
  trace      Show the current call stack.                                                                                
  buffer     Show (or clear) the contents of the code input buffer.                       Aliases: buf                   
  clear      Clear the Psy Shell screen.                                                                                 
  history    Show the Psy Shell history.                                                  Aliases: hist                  
  exit       End the current session and return to caller.                                Aliases: quit, q               
&amp;gt;&amp;gt;&amp;gt; &lt;/pre&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&amp;gt;&amp;gt; $arr = [1,2,3];
=&amp;gt; [
     1,
     2,
     3,
   ]
&amp;gt;&amp;gt;&amp;gt; 1 + 2;
=&amp;gt; 3
&amp;gt;&amp;gt;&amp;gt; function square($x) {
... return $x*$x*$x;
... }
=&amp;gt; null
&amp;gt;&amp;gt;&amp;gt; square(4);
=&amp;gt; 64&lt;/pre&gt;
&lt;br /&gt;
というようにインタラクティブにPHPを実行できます。&lt;br /&gt;
試してみてはいかがでしょうか。&lt;br /&gt;
それではよいお年を。</description> 
      <link>http://capella.3rin.net/Entry/45/</link> 
    </item>
    <item>
      <title>privateの罠</title>
      <description>最近ハマった挙動について書きます。&lt;br /&gt;
コードを見たほうが早いので以下にコード。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&amp;lt;?php

class ClassA
{
    private $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this-&amp;gt;member_variable;
    }
}

class ClassB extends ClassA
{
    private $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this-&amp;gt;member_variable;
    }
}

class ClassC extends ClassA
{
    private $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a-&amp;gt;getMemberVariable().&quot;\n&quot;;
echo $b-&amp;gt;getMemberVariable().&quot;\n&quot;;
echo $c-&amp;gt;getMemberVariable().&quot;\n&quot;;&lt;/pre&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ php test.php 
A
B
A&lt;/pre&gt;
&lt;br /&gt;
$c-&amp;gt;getMemberVariable()で&quot;C&quot;が返ってくると思ったら&quot;A&quot;でした。。&lt;br /&gt;
&quot;C&quot;を返すには以下のようにprivateをprotectedに変えるとできます。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&amp;lt;?php

class ClassA
{
    protected $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this-&amp;gt;member_variable;
    }
}

class ClassB extends ClassA
{
    protected $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this-&amp;gt;member_variable;
    }
}

class ClassC extends ClassA
{
    protected $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a-&amp;gt;getMemberVariable().&quot;\n&quot;;
echo $b-&amp;gt;getMemberVariable().&quot;\n&quot;;
echo $c-&amp;gt;getMemberVariable().&quot;\n&quot;;&lt;/pre&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ php test.php 
A
B
C&lt;/pre&gt;
&lt;br /&gt;
子クラスから親クラスのメソッドを呼んで、そのメソッド内でprivate変数を呼ぶと親のprivate変数になるんですね。&lt;br /&gt;
理屈がわかればなるほどなんですが、どこがおかしいのか見つけるのが意外と難しかったです。。</description> 
      <link>http://capella.3rin.net/Entry/44/</link> 
    </item>
    <item>
      <title>rsyncのスラッシュありなしの注意点</title>
      <description>rsyncでたまに大きいディレクトリを同期し終わってから失敗したとならないための注意。&lt;br /&gt;
同期元にスラッシュをつけるかつけないかの話です。&lt;br /&gt;
以下、例です。&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ ls
.  ..  dst  src
$ ls src
.  ..  a.txt  b.txt  c.txt
$ ls dst
.  ..
&lt;/pre&gt;
&lt;br /&gt;
スラッシュあり&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ rsync -avh src/ dst
sending incremental file list
./
a.txt
b.txt
c.txt

sent 226 bytes  received 72 bytes  596.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  a.txt  b.txt  c.txt&lt;/pre&gt;
&lt;br /&gt;
スラッシュなし&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;$ rsync -avh src dst
sending incremental file list
src/
src/a.txt
src/b.txt
src/c.txt

sent 240 bytes  received 73 bytes  626.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  src
$ ls dst/src/
.  ..  a.txt  b.txt  c.txt&lt;/pre&gt;
&lt;br /&gt;
スラッシュがあると中のファイルだけを同期させますが、スラッシュがないとディレクトリごと同期させるようになります。&lt;br /&gt;
目的によりますが、気をつけないと想定していないディレクトリ構成となって同期してしまうので注意しましょう。</description> 
      <link>http://capella.3rin.net/Entry/43/</link> 
    </item>
    <item>
      <title>html5のdownload属性</title>
      <description>Webサイトから何かファイルをダウンロードさせたいとき、例えば、&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&lt;a href=&quot;sample.pdf&quot;&gt;ダウンロードサンプル&lt;/a&gt;&lt;/pre&gt;
&lt;br /&gt;
のようにリンクを貼った場合、ファイルの種類によってはダウンロードではなくブラウザで表示するかたちになります(PDFなど)。&lt;br /&gt;
気を利かせて開いてくれたのはうれしいけれど、今見たいわけじゃないんだブラウザ君。&lt;br /&gt;
というわけでそんなときに便利なのがhtml5で仕様が作られたdownload属性です。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developer.mozilla.org/ja/docs/Web/HTML/Element/a&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;https://developer.mozilla.org/ja/docs/Web/HTML/Element/a&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&lt;a href=&quot;sample.pdf&quot; download=&quot;&quot;&gt;ダウンロードサンプル&lt;/a&gt;&lt;/pre&gt;
&lt;br /&gt;
のように書くと、リンク先が明示的にダウンロードされるようになります。しかも&lt;br /&gt;

&lt;pre class=&quot;brush:plain&quot;&gt;&lt;a href=&quot;sample.pdf&quot; download=&quot;ダウンロードサンプル.pdf&quot;&gt;ダウンロードサンプル&lt;/a&gt;&lt;/pre&gt;
&lt;br /&gt;
のように書くと、ダウンロードするときのファイル名までも指定できます。&lt;br /&gt;
便利！！&lt;br /&gt;
しかも！！&lt;br /&gt;
一部のブラウザまたの名をSafariやIEではこの属性は使えません！！&lt;br /&gt;
早く対応してください＞＜</description> 
      <link>http://capella.3rin.net/Entry/42/</link> 
    </item>

  </channel>
</rss>