【Lumen】LINEの Messaging API を使って再度Botを作ったお話

投稿日: 2017/02/24

すっごい前にこんなメールがLINEからきました。

いつもLINEをご利用いただきありがとうございます。  
このメールは、LINE BOT API Trial Accountをご利用いただいている皆様へお送りしています。

〜 中略 〜  

つきましては、旧API トライアルアカウント「BOT API Trial Account」をお使いの皆さまには、
新しいトライアルアカウント「Developer Trial」のご利用をお願い致します。  
「Developer Trial」アカウントはLINE Business Centerからお申込みいただけます。  
LINE Business Center : https://business.line.me/  

〜 中略 〜  

なお、ただ今ご提供させていただいている「BOT API Trial Account」につきましては、
11月16日にアカウントの完全削除を予定しております。  

〜 中略 〜

ムムム、こ、これは僕のcoutry-botが削除されてしまう。
あの、僕と妻の2人しか友達のいないcoutry-botがぁっ!! … 今すぐ救済せねばぁぁ!!

と、思ったのは去年の話で既にcoutry-botは動かなくなっていました。
それでもいいかなぁなんて思っていたのですが、ちょっと腰を上げれば動かせる事が出来るのに、それをやらないのもアレじゃないですか。

というわけで、せっかく作ったbotなので新しく作り直してみることにしました。
※ ちなみに前作ったのは これ です

そして、前回と同じじゃつまらないということで以下を使って書きました。

続きを読んでみようかな…

Lumenでログを出力する(その2)

投稿日: 2017/02/23

現在、個人的にちょっとしたAPIをLumenで実装しています。

Lumenオシャンティ!! って感じで意気揚々とやっていたのですが、ログ周りに関して 前回 のやり方だと困った場面に遭遇しました。

そこで今回は、何に困ったのか、最終的にどうしたのかを綴ってみたいと思います。

※ Lumenのバージョンは前回と一緒です

何をしたかったのか

まず、前回何をしたかったのかというと

すべてのログを好きなHandler(Monolog)でコントロールしたかった

というものがありました。
※ 最初、ログの出し方すらつまずきましたが

そこで以下の方法を前回はとったわけです。
(前回は例として、NativeMailerHandler も使いましたが今回は省略します)

app/bootstrap.php を修正

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;

try {
    (new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

// ~ 略 ~

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

// $app->withFacades();

// $app->withEloquent();

/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

// これ
$app->singleton('log', function() {
    $handlers[] = (
        new RotatingFileHandler(
            storage_path("logs/app.log") // ログファイル名を変える
        )
    )->setFormatter(new LineFormatter(null, null, true, true));

    // ログのchannel名 を app にする
    return new Logger('app', $handlers);
});

// ~ 略 ~

return $app;

で、使う側はこんな感じにします。

$logger = app('log');
$logger->info('Hello Lumen!!');

こうすることによって任意の場所、好きなHandlerでログ(storage/logs/app-{Y-m-d}.log)を出すことが出来ました。

困ったこと

で、何に困ったかというと例外が発生した際です。
例外が発生した際にログを確認すると、見事にデフォルトの storage/logs/lumen.log が出力されているではあーりませんか。
storage/logs/app-{Y-m-d}.log にも書き出されていない

え、うそでしょ?マジで?誰がこのログ吐いているの?と、普通のエンジニアならそうなるわけで、えぇ、ソースを追ってみました。
※ 最初に追っとけよ
続きを読んでみようかな…

Lumenでログを出力する

投稿日: 2017/02/14

LumenでちょっとAPIを書いてみようと思い、とりあえずログにでも吐き出すかなぁとLog::info('Hello Lumen!!');と書いてみたら見事に怒られました。
まぁいちおう対応をしたわけですが、その際にLumenでログを吐き出すまでに行ったことをメモとして残しておきます。
(ちょっと素人の匂いが漂う内容かもしれません。。)

bootstrap/app.php$app->withFacades();を有効にするパターンと、コメントアウトのままログを吐き出すパターンを書いてみます。※Monologを直接使うパターンも

なお、Lumenのバージョンは

Lumen (5.3.2) (Laravel Components 5.3.*)

です。
続きを読んでみようかな…

PHPでバッチを書いてシェルで制御する

投稿日: 2017/01/31

このバッチがきちんと終わったら、あのバッチを動かしたい。なんて事はよくあると思います。今までそのへんの事はcronで制御していたのですが、バッチがクソ増えてきてスケジューリングがつらたん。。という状態になり、こうなったら一連の処理を行うバッチはシェルで制御した方が楽だよね、そうだよね、じゃあ調べてね、ってなった時のことを書きます。
※ ジョブ管理ツールとかは無しで
※ 制御するとかありますが、そんな難しいことではないです
※ ちょっと回りくどい感じで書いていますので出来れば最後まで読んでみてください

やりたいこと

バッチA (hoge.php) 実行

エラー無し → (No) → バッチ終了
↓ (Yes)
バッチB (piyo.php) 実行

やりたいことはこんな感じです。

最初に書いたシェル

#!/bin/bash

PHP_PATH=`which php`
BATCH_DIR="/your/batch/dir"

${PHP_PATH} ${BATCH_DIR}/hoge.php \
&& ${PHP_PATH} ${BATCH_DIR}/piyo.php

>/dev/null 2>&1 これ書く書かない問題は別とします

普通にシェルで制御するって言われるとこんな感じで、&&でつなげて実行する方法を思いつくのではないでしょうか。
でもね、これですんなりいけるバッチは、エラーがあった場合にきちんと異常終了(終了コード 0 以外を返却)するように作られているバッチだけなんですよね。
続きを読んでみようかな…

ベンチマークの結果をd3.jsで可視化してみた

投稿日: 2016/12/29

もういくつ寝るとお正月。今年もあっという間に年末になりました。
年末になると今年も色々あったなぁなんて思い出にふけるわけですが、色々という言葉にほとんどの出来事は濃縮されてしまって、過ぎたことは本当にどうでもよくなりますね。
こうして人は年をとっていくんだなと思います。

というわけで、以前書いた

を使ってベンチマークの結果をd3.jsで可視化してみました。
サンプルは こちら です。

仕組みとしては、

  • shimabox/SMBBenchmark でベンチマークの結果を配列で出力
  • shimabox/SMBArrayto で受け取った配列を json※ で出力
  • d3.jsで受け取った json※ をつかってグラフを描画

※ csvでもtsvでもよいです

という流れになります。

ソース

続きを読んでみようかな…

スポンサーリンク