2016-06-22

FlysystemをLaravelで使う

開発サイトの規模が大きくなってきたり、よりセキュアなサーバー環境を整えるためにサーバーを「ウェブサーバー」と「データサーバー」で物理的に分割する場合があると思います。

そして、PHPでファイルをリモートで読み込み/書き込みをするためには「Flysystem」という有名なパッケージを利用すればとても簡単にできるのですが、今回はこの「Flysystem」をLaravel(5.2)で使う方法をお届けしたいと思います。

※ちなみに今回はSFTPを使ってリモートサーバーとの連携をしますが、Flysystemは他にもaws」や「Azure」、その他には「DropBox」との連携までサポートしています。


【環境】

Laravel 5.2
SFTPで自分のVPSへSFTPを使って接続

【インストール】

まずは composer でパッケージのインストールです。
ここではLaravelと統合されているものをインストールします。
(ちなみにGitHubはこちら)
composer require graham-campbell/flysystem
次に私の場合はSFTPでの接続ですので、Flysystemのサブパッケージをインストールします。
league/flysystem-sftp:^1.0
はい。これでインストールは完了です。


【準備】

いつものように ServiceProvider と aliases を config/app.php に設置しましょう。

(ServiceProvider)
 GrahamCampbell\Flysystem\FlysystemServiceProvider::class  


(Aliases)
 'Flysystem' => GrahamCampbell\Flysystem\Facades\Flysystem::class  


そして、以下のコマンドで専用の設定ファイルを publish します。
php artisan vendor:publish
実行すると、configフォルダの中に「flysystem.php」というファイルが作成されていると思いますのでこの中で接続情報を保存します。

※もしコマンドを実行しても flysystem.php が作成されない場合は、以下のコマンドを実行してからもう一度トライしてみてください。
  • composer dumpautoload -o
  • php artisan config:cache

では、実際の中身です。

今回はSFTPでの接続なので「SFTP」のエリアを探して、必要な情報を入力すればOKです。
変更する場所としては、

  • host(IPアドレスなど)
  • port(変えている場合)
  • username
  • password
  • privateKey(プライベート・キーファイルのパス)
  • root(リモートサーバーの保存したいフォルダパス)

あたりになるかと思います。

はい、これで設定は完了です。


【使い方】

(基本的な使い方)

使い方はとても直感的でシンプルです。
次の例は、「test.txt」というファイルを作り、さらにそこに「bar」という文字列を書き込む手準になります。

 \Flysystem::connection('sftp')->put('test.txt', 'bar');  

たったこれだけです。
では逆にその保存した内容を読み込んでみましょう。

 echo \Flysystem::connection('sftp')->read('test.txt');  

これで「bar」が表示されます。


(フォルダを指定して保存)

もし、フォルダを指定して保存したい場合はこのようになります。

 \Flysystem::connection('sftp')->put('test_dir/test.txt', 'bar');  

この場合は、test_dir/test.txt にファイルが保存されます。


(画像を保存)

これもテキストファイルなどとやり方はほぼ同じで、

 $content = file_get_contents(public_path('images/my_photo.jpg'));  
 \Flysystem::connection('sftp')->put('me.jpg', $content); 

とやればOK。
とてもシンプルです。

ちなみに、Laravelを使って保存した画像をサーバーから呼び出して表示するには以下のようにすればいいでしょう。

(コントローラ)
 public function flysystem_image() {  
      $image_contents = \Flysystem::connection('sftp')->read('me.jpg');  
      return response($image_contents, 200)->header('Content-Type', 'image/jpeg');  
 }  

以上、Laravel と Flysystem を使ったサーバーの連携方法でした。
ではでは!



2016-06-09

受信したメールをLaravelで受け取る

受信メールをPHPプログラムへ送り、メールを解析して送信元のメールアドレスや本文を取得してDBに保存ということをLaravel(5.2)をからめてやるにはどうすればいいかをメールサーバーをたてるところからやってみたので備忘録としてお届けします。
(はっきり言って作業内容は多かったです、、^^;)




【作業環境】

CentOS 6.7


【作業の手順】
  1. Postfix をインストール/設定
  2. ドメインのDNS設定
  3. Pecl(Pear)本体をインストール
  4. Pecl の mailparse をインストール、extensionの読み込み
  5. Laravelパッケージ「php-mime-mail-parser」をインストール
  6. LaravelにCommandを追加

【実際の作業】

では、ここからは実際の作業になりますが、全部書くと確実に長くなってしまいますので途中は参考にしたサイトを紹介しながらすすめていきます。

1. Postfix をインストール/設定

私の場合はCentOSなので
sudo yum install postfix
でインストールしましたが、環境によって変更してください。
また、設定の方法は以下のページがとてもわかりやすいと思いますのでぜひ参考にしてみてください。


また、この記事の中にも紹介されていますが、設定が完了したら以下のサイトでセキュアチェックができます。


そして「/etc/aliases」をエディタで開き、以下のような振り分け設定を追加しましょう。

mail: "| /usr/bin/php /path/to/your/public/folder/example.com/artisan mail:parse"

意味としては

  • mail・・・はユーザー名。つまり、mail@example.comでメール受信した場合の設定ですよという意味です。
  • /usr/bin/php(以下略)・・・PHPを使ってLaravelのartisanを実行
  • mail:parse・・・実行するコマンド(「6.LaravelにCommandを追加」で作る独自コマンドです)

完了したら、 sudo postalias /etc/aliases でエイリアスをアップデートします。
そして、最後に sudo service postfix reload でpostfixをリロードで完了です。


2.ドメインのDNS設定

これも人によって記述が違うと思いますが私の設定は以下のようにしています。
mx mail.example.com. 10
a * 01.234.567.890
txt @ v=spf1 a:example.com ~all
2行目はIPアドレスです。
※ちなみにこれはサーバー設定ではなく、取得したドメインの管理サイトで設定をします。


3.Pecl(Pear)本体をインストール
sudo yum install php-pear
ここは戸惑いました。
Peclをインストールするにはpearをインストールするんですね。
(その昔、mecabをインストールしたことあるのに...)

なお、リポジトリを設定しないとパッケージが見つからないかもしれません。


4. Pecl の mailparse をインストール、extensionの読み込み
pecl install mailparse
でメール解析に必要な mailparse をインストールします。
ただ、もしかすると
The php-devel package is required for use of this command.
というエラーがでてインストールできないかもしれません。
そのときはエラーの表示にある php-devel をインストールしてからやってみてください。

では、インストールした mailparse を PHPが利用できるように設定をしましょう。
ファイルを作成する場所は php.ini の「Additional .ini files parsed」でリストに出てくるフォルダです。



たとえば、もし「/etc/php5/apache2/conf.d/05-opcache.ini」が表示されているとするなら「/etc/php5/apache2/conf.d」がそのフォルダになります。

ではここに mailparse.ini というファイルを作成し、以下の内容を保存します。
php extension=mailparse.so
はい。
これでmailparseの設定は完了です。
ウェブサーバーを再起動してもう一度 phpinfo を確認すると以下のようにmailparse が表示されているはずです。



5.Laravelパッケージ「php-mime-mail-parser」をインストール

これはとても簡単です。
composer で一気にインストールできます。
composer require php-mime-mail-parser/php-mime-mail-parser
ちなみに、パッケージがあるなら mailparse は要らないんじゃ?と思った方。
私もそうでした。
でも、実際は mailparse を前提にしたパッケージなのでやはり Pecl他は必要なんです。^^;

※GitHubのページはこちらです。


6.LaravelにCommandを追加

やっとここまで来ました。
コマンドの作成/設定方法は本家Laravelページで確認してください。

コマンドの中身は以下のようになります。
$parser = new Parser();
$parser->setStream(fopen('php://stdin', 'r'));
あとは、以下のような便利なメソッドが備わっているのでこれを使ってメールを思うように加工してください。
$to = $parser->getHeader('to'); // 送信先
$addressesTo = $parser->getAddresses('to'); // 送信先(配列)
$from = $parser->getHeader('from'); // 送信元
$addressesFrom = $parser->getAddresses('from'); // 送信元(配列)
$subject = $parser->getHeader('subject');  // 件名

$text = $parser->getMessageBody('text');   // 本文(テキスト)
$html = $parser->getMessageBody('html');   // 本文(HTML
$htmlEmbedded = $parser->getMessageBody('htmlEmbedded');   // データを含む本文(HTML
添付ファイル

添付ファイルの扱い方は以下になります。

(保存)
$parser->saveAttachments('/path/to/save/attachments/');

(ループ)
$attachments = $parser->getAttachments();
if (count($attachments) > 0) {
   foreach ($attachments as $attachment) {
      $filename = $attachment->getFilename();
      $path = '/path/to/save/attachments/'. $attachment->getFilename();
      $type = $attachment->getContentType();
   }
}

ということで、環境の違いもあるので全てを一気にやろうと思うとなかなか難しいかもしれませんがこんな感じで受信メールをLaravelで受け取ることができます。

お疲れ様でした。

【その他参考にしたページ】

https://sboersma.nl/blog/setting-up-postfix-and-pipe-incoming-emails-to-laravel




2016-05-25

【無料】サイトが落ちていないか監視

サイトの運営を行っている人間からすると一番怖いのは「サイトが落ちる」こと、つまり訪問者がアクセスしてもページにエラーが出て表示がきちんとできていない状態です。

こうなってしまうと、もんろん訪問者は(もしかすると舌打ちしながら)すぐに違うページへ移動してしまいほぼ二度とはやってくることはないと思います。

そのためサイトが落ちていないかどうかは定期的にチェックをするべきですが、さすがに毎日毎日となるとなかなか面倒なもの。

そこで、そういう時にはサイト監視サービスを使ってみましょう。
インターネット上には制限こそあるものの無料でも利用できる監視サービスが幾つか存在しているので、その中から一つをご紹介したいと思います。

名前は「Uptime Robot」です。

まずは以下が3つの特徴になります。
  • 最短5分ごとにサイトをチェックできる
  • https でのアクセスも可能(他のサービスでは有料のところもあります)
  • 無料でも使える(最大50ページまで監視が可能)
では登録と設定方法を見ていきましょう。


【ユーザー登録】

まず、ユーザー登録ページ へアクセスしユーザー登録します。


上から、
  1. 氏名
  2. メールアドレス
  3. パスワード
になります。

入力して「Sign-up」をクリックすると入力したメールアドレスに本登録用のURLが書かれた以下のようなメールが届くのでこれ(clicking hereの部分)をクリックしてください。


これでユーザー登録は完了です。


【設定】

では、早速ログインページからログインしたら、まずは設定をしましょう。
ページ上部にある「My Settings」をクリック。


1.タイムゾーン

ページ中程にあるタイムゾーンを東京へ変更しUpdateをクリック。


 ※もしサイトからのお知らせメールが必要ない場合は「Inform me about new features and updates (no more than twice a month).」のチェックを外しておきましょう。

また、通知を受け取りたいメールアドレスが他にもある場合は以下を参考にして追加しておきましょう。

2.通知先メールアドレスの追加

「Add Alert Contact」 をクリック。 

 以下のようなダイアログが表示されるので
  1. Alert Contact Type を E-mail に設定
  2. Friendly Name は区別しやすい好きな名前を入力
  3. E-mail に通知先メールアドレスを追加
  4. Create Alert Contactを クリック


【監視サイトの追加】 

 ホーム画面に戻って「+ Monitor」をクリック。


 以下のようなダイアログが表示されるので監視したいサイトの各種データを入力します。


  1. Monitor Type ・・・ HTTP(s)を選択
  2. Friendly Name ・・・ 区別しやすい名前
  3. URL (or IP) ・・・ 監視したいページのURL
  4. Monitoring Interval ・・・ 何分毎にページをチェックしたいか?
  5. (任意)Authentication Settings ・・・ おそらくページ監視時に送信するデータがある場合に利用できるものだと思いますが、通常は必要ないでしょう。
 (通知先メールアドレス)

 あとは通知したいメールアドレスにチェックを入れて「Create Monitor」をクリックすれば完了です。
もし他にも登録したいURLがある場合は同じ作業を繰り返し行ってください。

もしサイトが落ちていたら通知がきますし、ホーム画面で統計データを見ることができます。

以上、サイト監視ができる Uptime Robot の紹介でした。
皆さんもぜひ一度試してみてください。

私がフェイスブック・アプリを削除した理由と対処

私は2012年からフェイスブックを利用しています。始めたころ私はカナダのバンクーバーに語学留学中で、初めて登校したとき先生から「友達とやりとりするようになるから(英文を書く習慣がつくから)絶対登録しなさい」と言われ半ば嫌々登録したのを覚えている。

まだその頃は周りではミクシィをやっている人が多く、フェイスブックをやってるよ、という人はまだ少なかった。

それがあれよあれよという間にフェイスブックの知名度が日本でも高くなり、そのうちミクシィよりもフェイスブックのアプリを開く時間の方が多くなってしまった。(私の場合、帰国後もカナダで会った友達のニュースを仕入れるにはフェイスブックに頼るしかなかったというのも大きな理由の一つだ)

ちなみに私は今でも1〜2日ぐらいの頻度でフェイスブックをチェックする。

ただ、それでもフェイスブックのアプリはこの度アンインストールしてしまった。

理由は2つ。

まず、あまりハイスペックとはいえない私のスマートフォンではフェイスブックのアプリをアップデートする際はとても時間がかかり、また不具合なのかもしれないがアップデートこの後は再起動をしなければいけない場合もあった。

しかも幸か不幸かフェイスブックの開発スタッフはとても熱心で、ことあるごとにアプリをアップデートしてくれるからやっかいだった。

さすがにもう毎回作業するのが面倒になり、自動でアップデートしない設定にもしてみたが結局はこの理由が大きく、アプリを削除してしまった。

そして、もう一つの理由はバッテリーの消費だ。

以下の記事だとフェイスブック・アプリによって電池消耗が20%も増えると書かれてある。


携帯式バッテリーは過去に持っていたが紛失して以降全く使っていない私にとってはこれも都合が悪いものとなってしまった。

【アプリ削除後の対処】

では、今でもフェイスブックを開く私がとった対処とはなんだったのか?

もうお気づきかもしれないが、そう、PCと同じくスマートフォンのブラウザでログインすることにしたのだ。

こう書くと「いちいちブラウザを開いてフェイスブックを検索し、さらにログイン情報まで入力するのは面倒すぎる」という意見があるのかもしれない。そのとおりだと思う。

なので、この問題を以下のようなテクニックで対処した。

  1. まず初めてブラウザでフェイスブックにログインする場合にパスワードを保存するかと聞かれると思うのでこれを保存する。(以降、ログインする必要はなくなる)
  2.  ログインしたらブラウザのメニューの中からホームスクリーンにショートカットを作成する。
これで今までのアプリと同じようにアイコンをタップするだけでフェイスブックにログインした状態でブラウザがURLを開いてくれるというわけだ。

では、使用感はどうか。
残念ながらやはりネイティブアプリの方が動きはスムーズだ。フェイスブックがその昔HTML5を利用したアプリ開発をやめた理由がよくわかる。

ただし、とは言ってもブラウザの方も進化していることは確かで、そこまでイライラさせられることがないというのも事実だ。私のようなライトなフェイスブックユーザーであればなんの問題もないかと思う。

さらにこれはまだ未確認だが、私が使っているChromeは現在プッシュ通知にも対応しているそうなのでもしかしたら「今日はお友達のお誕生日ですよ」などと通知をしてくれるのかもしれない。
ということで、フェイスブックはまだもう少し続けそうだが、アプリの方はもう使わないようになりそうだ。

と、いっても最近は世界中の友達もフェイスブック自体をやらなくなってきているし、私自身が最後にフェイスブックに投稿したのももう半年ほど前になる。

だからといって、Lineのタイムラインに移行するつもりもないのでそのうち本格的にSNSは卒業するかもしれない。

今後SNSがなくなることはないだろうが、一時期ブームになったのはやはりそういう時代だったから、というのが私のSNSに対するものの捉え方だ。

2016-05-24

n倍でループ【PHP】

PHPに限らずプログラムで開発をするよく使うものの一つに for() ループがあると思います。
今回はいつもとは少し変わったループの仕方を紹介したいと思います。

通常でしたら、以下のように $i++ インクリメントを使って1ずつ変数を追加していくパターンを使うかと思います。
for($i = 0 ; $i < $count ; $i++) {
    // ここで何かの処理
}

もしくは逆に $i-- を使って変数を減らしていく方法もたまに使うのではないでしょうか。
for($i = 5 ; $i > 0 ; $i--) {
    // ここで何かの処理
}

では、今回は for() ループを nの倍数ずつループさせる方法はどうなるでしょうか。
いろいろな方法があると思いますが、ひとつの答えとしては以下のようなものもあります。
$n = 3;
$count = 15;

for ($i = 0; $i < $count; $i+=$n) {
   echo $i ."\n";
}

実行結果としては、以下になります。
0
3
6
9
12
ではひとつずつ中身を見て行きましょう。


$n = 3
これは何倍ずつループするかです。
つまりループを3、6、9...という形にしたい場合は「3」になります。

$count = 15;
最大値はいくらかになります。
つまり、もし15を含めたい場合は $count = 16; に変更するか
for() 内の $i < $count$i <= $count へ変更する必要があります。

ここまでは通常の for() ループを同じですね。
では次。

for ($i = 0; $i < $count; $i+=$n) {}
  1. $i = 0 ・・・初期値が0
  2. $i < $count ・・・ 最大値
  3. $i+=$n ループのたびに倍数を追加
ここが今回の特徴的な部分です。 
$i++ の代わりに $i+=3 を使ってループ内の変数を倍数にしています。

はい。
短いですが、以上解説でした。


【終わりに】
通常はあまりこのようなループを使うことは無いでしょうし、だとすると「正直可読性悪いんじゃ、、、?」と言われると確かにそのとおりですが、これもひとつのアイデアなのかなと思い紹介してみました。(もしかすると結構使われてるのかな?)

今回は以上です。




2016-05-19

開発者のブラウザ「Blisk」を使ってみた感想

ウェブ開発をしていて時々必要となってくる要件にPC、モバイルともに対応可能な「レスポンシブ・デザイン」というものが増えてきました。現在はPCが家になく、スマホだけ持っているという人も多くいるため、「モバイル・ファースト」に主眼をおいておられるクライアント様も多くいらっしゃいます。

そこで、今回紹介するのは「Blisk」というブラウザです。
このBliskは「開発者のためのブラウザ」 と銘打っているだけあって、ひとつの画面の中でスマートフォンやタブレットの画面を確認することができるとのことでした。
忙しい時期ですが、業務の効率化を考えて時間を割いて少し体験してみました。


【ブラウザの外観】


必要なものだけが用意されている印象です。余計なものは必要ではない開発者としてはありがたいと思いました。
ちなみに左側からスマートフォンやタブレットを選択するとすぐに画面が切り替わります。
また、左側のエミュレーター部分ではマウスは黒丸に変更されタップやスワイプの動作となります


【操作感】

エミュレーターでよくある表示が遅くなることやひっかかりを感じることはほぼありませんでした。
(私の場合はVirtualBoxで実行したので通常のWindowsでしたらまた違っているかもしれません)

ただ、サイトによっては違うのかもしれませんが、スライダーなどの横スワイプが効かなったことが残念でした。
また、モバイル対応していないページでは通常のブラウザとして利用できるのは好感がもてました。
別のブラウザを開いて検索する必要はありませんので。

もちろん開発者ツールも使えます。



【設定できるスマートフォン/タブレット機種】
  • IPhone 4
  • IPhone 5
  • IPhone 6
  • IPhone 6 Plus
  • Nokia N9
  • Galaxy S3
  • Galaxy S4
  • Nexus 4
  • Nexus 6
  • Nexus 7
  • Nexus 10
  • IPad mini
  • IPad Air Retina
これだけそろっていれば必要なものは揃っているのではないでしょうか。


【今後の開発予定】

これが少し楽しみですが、どうやら以下のように画面のビデオ録画機能を予定しているようです。



 【実行環境】

現在までのところ windows のみしかありませんがMac、Linux版も予定しているようです。


【Bliskを使ってみて】

全体的に使いやすくていいソフトだなと思いました。
モバイル主体の開発があれば利用してみてもいいかなという感じですが、今のところ windows版のみとのことでしたので、私のLinuxの開発環境だといちいち VirtualBox を開かなくてはいけません。私にとってはここがネックになってきそうです。

とりあえずのところはキープですかね。
ではでは〜(^^)



2016-05-14

wp-cli をさくらのVPSにインストール

以前よりここのブログとはまた別テーマの新ブログを開始しようと考えていたため、wordpressを以前から利用しているさくらのVPSへインストールしてみました。
早速ログインしてみるとプラグインを更新しろとのメッセージを発見したので実行しようとすると、FTP(or STFP)の情報が必要だとのことでした。

ただ、私のサーバーはセキュリティ上の理由からFTPは使っておらず、SFTPも公開鍵ファイルでログインする形になっています。。

途方にくれていたところターミナルから実行できる wordpress のクライアントバージョン「wp-cli」というものが存在するということだったので早速インストールしてみました。
本記事はそのインストール手順と主要なコマンドのまとめになります。



【サーバー環境】
さくらのVPS(CentOS 6.7)


【インストール手順】
インストールといっても実際はファイルをダウンロードして権限を設定し、適当な場所に設置するだけです。
実際には以下になります。


1. wp-cli をダウンロード
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
※curlコマンドが利用できない場合は先にインストールが必要です。


2.権限の設定
chmod +x wp-cli.phar
※環境によっては sudo が必要かもしれません。


3.パスが通っているフォルダへ移動
sudo mv wp-cli.phar /usr/local/bin/wp
※環境によって、/usr/local/bin/ の部分を変更してください。


はい!
これで wp *** というコマンドが利用可能になっているはずです。
まずは以下のコマンドを実行してインフォメーションを見てみましょう。
バージョン情報などが表示されるはずです。
wp --info


【主要なコマンド】

1.wordpress本体のアップデート
wp core update

2.(全ての)プラグインのアップデート
wp plugin update --all

3.テーマのインストール
wp theme install "wp castle"

その他のコマンドは こちら をご覧ください。
そのうち、時間ができたらもっと多くのコマンドをまとめてみたいと思います。

ではでは。