Laravel 6 でCSV出力を実装する(レスポンスストリームにそのまま返す版)

LaravelでCSV出力を実装してみたので手順をまとめます。

動作確認はLaravel 6でしていますが、この記事の内容は5.6以降で利用可能です。

CSVのサイズが大きくなる場合は、コントローラはCSV生成タスクをバックグラウンドキューに入れて非同期ジョブでCSVを生成してS3などのストレージに追加、処理が完了したらファイルのURLを応答に含めて通知するというのが正しい実装な気がしますが、ここではCSVに含めるレコードが少なくファイルサイズが小さめな限定的なケースを想定し、CSVを生成しながらそのまま応答ストリームに流すような実装について解説します。

小さめと書きましたが、プロセスのメモリーを節約して実行するのでネットワーク環境と多重度が低くプロセスを長めに専有することを許容できるシステムであれば大量レコードでも使えるのでプロジェクトによっては大量レコードのダウンロードにも使える仕組みとなっています。

利用するLaravelフレームワークの機能を整理

まずサンプル実装に使うLaravelの機能について解説してみます。

ストリームを応答として返す

大容量のファイルをストリームで帰す場合は、streamDownloadメソッドを利用します。streamDownloadメソッドは、Laravel 5.6から導入されたメソッドです。

Laravelのドキュメント HTTP ResponsesのFile Downloads Streamed Downloads で説明されています。
“Laravel 6 でCSV出力を実装する(レスポンスストリームにそのまま返す版)” の続きを読む

Heroku SchedulerでLaravelのartisanコマンドを実行する

LaravelのartisanコマンドをHeroku Schedulerを使って、定期実行する手順に確認したのでまとめてみました。

Laravelのバージョンは、2019年9月時点での最新6.0で確認しています。

Heroku Schedulerのとは

Heroku Schedulerは、cronジョブ的な仕組みを提供するHeroku公式アドオンです。

ドキュメントによると実行間隔は10分、1時間、1日のみです。
この要件で問題なければ非常に便利な機能です。

実行時刻は正確ではないので、ジョブを正確な時刻に実行する必要がある場合はここで説明するSchedulerではなくCustom Clock Processを利用する必要があります。

また、Heroku Schedulerジョブで実行するタスクの実行時間について「Long-running jobs」には、実行時間が数分を超えるような長いタスクを実行する場合は、バックグラウンドキューに入れてワーカーDynoでタスクを実行するべきと書いてあります。
更に、スケジューラーで起動されたDynoは、次のスケジュール実行時間になると停止するとも書いてあります。
よって、基本的にはLaravelの場合QueuesをワーカーDynoで起動しておいて、スケジュールジョブではジョブをディスパッチするのみにするのが正しい実装になります。

しかし、この記事では、まずはHeroku Schedulerの動作の雰囲気を掴むため、Heroku Schedulerのジョブからシンプルなartisan commandを直接実行して動作を確認してみます。
“Heroku SchedulerでLaravelのartisanコマンドを実行する” の続きを読む

HerokuでLaravel 6のログをPapertrailに出力する

HerokuにデプロイしたLaravelアプリケーションのログメッセージをHerokuのログシステムに出力して、Papertrailに連携する手順と説明をまとめました。

Laravelのバージョンは、2019年9月時点での最新6.0で確認しています。

LaravelのログをHerokuのログに統合する

PHP Application Logging | Heroku Dev Center」によると、Herokuのログ管理システム(Logplexという)はstdoutおよびstderrに出力されるメッセージをログストリームとして集めます。

heroku logsコマンドで確認できるログメッセージは各Dynoからここに集められたログを見ているわけです。

そこで、Laravelの場合もstrerrにログが出力されるように設定します。
Herokuのドキュメントの「Laravel」に記載されている通り、環境変数LOG_CHANNELerrorlogをセットするだけでOKです。

環境変数LOG_CHANNELerrorlogをセットするコマンドは以下のとおり

$ heroku config:set LOG_CHANNEL=errorlog

“HerokuでLaravel 6のログをPapertrailに出力する” の続きを読む

Laravel Socialite でMicrosoft Graph (Office 365アカウント)認証する

前回の記事 「Laravel 5.8からMicrosoft Graph APIを利用する (公式ドキュメント編)」では、Micsoroft公式のチュートリアル ドキュメントに沿って、LaravelアプリケーションからMicrosoft Graph APIをOAuth認証プロバイダとして利用する手順について確認しました。

このチュートリアルは、OAuthの認証ロジックをleague/oauth2-clientを使って独自に実装していましたが、実際はLaravel公式のOAuth認証パッケージLaravel Socialiteを使いたいところです。

Laravel Socialiteは非常に多くの認証プロバイダーに対応しています。対応プロバイダーは、Socialite Providersで確認できます。
Microsoft Graphについてももちろん対応しています。

この記事では、Laravel Socialiteを利用してAzure ADのアカウントで認証を実装する手順について確認します。
Auth Scaffoldは使わず、つまりデータベース認証は使わずに、OAuth認証後にLaravel標準のAuthユーザとしてログインし、Auth middlewareを使って要認証のルーティングを保護する手順についても説明しています。

この記事に含まないこと

Azure ADに登録されたアカウントによる認証にのみフォーカスして説明しています。
Microsoft Graph APIを利用したデータの取得については説明しません。
よって、アクセストークンの更新についても言及していません。
“Laravel Socialite でMicrosoft Graph (Office 365アカウント)認証する” の続きを読む

Laravel 5.8からMicrosoft Graph APIを利用する (公式ドキュメント編)

LaravelアプリでOffice 365アカウントによるOAuth認証を実装するにあたって、公式ドキュメント PHP アプリで Outlook REST API を使用する方法 – Outlook Developer | Microsoft Docs の手順を確認してみたメモになります。

このブログの以前の記事「Office 365 REST APIを利用したRuby on Railsアプリの作成」でRuby on Rails版の確認をしていますが、そのPHP版になります。

公式ドキュメントでは、チュートリアル形式でAuthorization Code Flowの処理を一つ一つ実装し、詳細に解説していますが、実際には、これらの手順はLaravel Socialiteを利用すると簡単に実装できます。
そこで、この記事では、Azure ADにアプリケーションを登録し、チュートリアル サンプルを手元で動かし、手っ取り早くAzure ADに登録されたアカウントのアクセストークンをLaravelアプリから取得する流れを体感することができるようにまとめてみました。

Azure Active Directory 管理センター

Rails版の記事を書いていたのは2016年でしたが、その後新しいAzure ADの管理ポータル Azure Active Directory 管理センターがリリースされていました。

The new Azure AD Admin Console is GA!

2017年なのですでにだいぶ前ですね。

Azure Active Directory 管理センターには、直接 https://aad.portal.azure.com/ を開くか、Office 365の管理センターでAzure Active Directoryを選択して開くことができます。


“Laravel 5.8からMicrosoft Graph APIを利用する (公式ドキュメント編)” の続きを読む

Laravel 5.8 でのl5scaffoldの動かし方

LaravelにはRailsはCakePHPのようなScaffoldingがありません。
Laravel用のScaffoldパッケージはいくつかありますが、調べてみるとlaralib/l5scaffoldが最もよく使われているようです。
しかし、最後のコミットは2年前くらいで現在メンテナンスされていないようで、2019年8月時点でのLaravelのバージョン5.8では動きません。

最新版のコミットからパッケージをインストールして、1箇所ソールを修正すれば動きますので、対応した手順をまとめておきます。

‘laralib/l5scaffold’をインストール

composerでインストールします。

デフォルトのバージョンは1.0.10ですが、’dev-master’を指定すると、Laravel 5.4でIlluminate\Console\AppNamespaceDetectorTraitの名前がIlluminate\Console\DetectsApplicationNamespaceへ変更された点については対応されています。

$ composer require laralib/l5scaffold:dev-master --dev

Providerを登録

config/app.phpprovidersLaralib\L5scaffold\GeneratorsServiceProvider::classを追加します。

    'providers' => [
        ...
        Laralib\L5scaffold\GeneratorsServiceProvider::class ,
    ],

“Laravel 5.8 でのl5scaffoldの動かし方” の続きを読む

2019版 Laravel Homestead セットアップからhttpsによるアクセス手順まで

4年前の記事 Laravel homesteadを利用したLaravel 5 ローカル開発環境の構築 にLaravel Homesteadのセットアップ手順についてまとめましたが、久しぶりにLaravelを使う機会があったので、まとめ直してみました。

Windowsでもセットアップ可能なようにMacの手順と併記しています。

また今回はhttpsでのアクセスも可能なように、Homesteadから取り出した自己署名の認証局をPCにインストールする手順についてもまとめてみました。

前提条件の準備

VirtualBox 6.xのインストール

HomesteadはVirtualBoxのバージョン6.xに対応しています。
その他 VMWare、Parallels、Hyper-V にも対応しているようです。

ここではVirtualBoxを使います。
ダウンロードページからインストーラを入手してインストールします。 

Vagrantのインストール

Vagrantのダウンロードページからインストーラを入手してインストールします。

gitのインストール (なければ)

gitコマンドがインストールされていない場合(主にWindows)は、https://git-scm.com/downloads がらインストーラをダウンロードしてインストールします。
“2019版 Laravel Homestead セットアップからhttpsによるアクセス手順まで” の続きを読む

obnizを単3電池2本と5V昇圧 DC-DCコンバータ(TS61200)で動かす

以下の前回とその前の記事の続きで今回はDC-DC昇圧コンバータを使い電池2本3Vから5Vに昇圧してobnizを起動してみます。

秋月電子で買った昇圧DC-DCコンバータは大きな電流が流せずobnizを起動できなかったので、入力電圧が低くて多きな電流が流すことができるテキサス・インスツルメンツのTS61200という製品を使った昇圧モジュール超低電圧DC-DCコンバータモジュール(3.3V/5V)をストロベリー・リナックスで見つけたので試してみました。

低電圧入力でも大きな電流も確保できる昇圧コンバータを探してみると、テキサス・インスツルメンツのコンバータがいくつか見つかりましたが、それを自分で実装するのは素人にはハードルが高いのでストロベリー・リナックスのモジュールは扱いやすく大変便利です。送料もかかるので安くはないですが。

購入するとこんな感じでパッケージされてきました。


“obnizを単3電池2本と5V昇圧 DC-DCコンバータ(TS61200)で動かす” の続きを読む

3端子レギュレータを使った5V定電圧回路でobnizを動かしてみた

前回の記事「J1端子を使ったobnizの電池駆動について検証してみた」に引き続きJ1端子を使ってobnizを起動する実験の記録になります。

今回は、秋月電子通商で買ってきた 低損失三端子レギュレーター 5V500mA TA48M05F(S Q) を使って5V電圧を供給する電源回路を作成してobnizを起動してみます。

定電圧5Vの3端子レギュレーターはもっと安いのもありますが、このパッケージは、入出力のパスコンとして使うコンデンサも含まれているので使いやすいです。

パーツの配置図は以下のとおりです。

配置図に沿ってパーツを並べます。

次に、電池とobnizをつないで動作を確認してみます。
無事動きました。

前回の記事と同様に、電圧・電流計を入れて電圧と電流を測ってみます。
パーツはこのようにつなぎます。

電圧・電流計をつないでみると、電圧はおよそ5.1V 電流はおよそ110mAで動作していることが確認できました。

写真では、9V電池をつないでいますが、通常の単4電池 x 4の6V電源でもデータシートの通り問題なく動作しました。

J1端子を使ったobnizの電池駆動について検証してみた

先日コピペテックの記事に タミヤ カムプログラムロボットをobnizでラジコン化してみた を投稿しましたが、100円ショップのモバイルバッテリーがロボットにちゃんと収まってなかったりと完成度がイマイチでした。
そこでカムロボットに付いている電池ボックスからobnizに電源を供給できれば、もとの見た目を崩さずに完成度を上げられるのでは?と考え、5V電源作れれば良いんだろうと秋月電子から 5V出力昇圧DCDCコンバータを買ってきて試してみたところ、残念ながらobnizは起動せずでした。。
そこで、改めてobnizの電池駆動について検証してまとめてみることにしました。

obnizの動作電源について確認

スイッチサイエンスのobnizで仕様を確認すると

  • 動作電圧: 5V(microUSB or J1ピン)
  • 動作電流: 平均 170 mA(Wi-Fiにつながり、BLEはスタンバイ、外部に何もつながっておらず、OLED使用中の場合)

とあります。

結論から言うと、秋月のモジュールでobnizが起動しなかったのは、流せる電流の負荷をオーバーしていて電圧も下がってしまっていたからです。

電池で5Vかつ170mA以上の電流を供給可能な電源の作成方法

モバイルバッテリーでのUSB給電はどうしても場所を取るので、5Vかつ170mA以上の電流を供給可能な電源を作成して、J1端子を利用してobnizを電池駆動するを考えてみると、以下のような方法があります。

  1. 電池のみで5Vの電源を作る
  2. 9V電池など5V以上の電源から3端子レギュレータを使用して5V電源を作る
  3. 5V以下の電源、電池1本1.5Vまたは2本3.0vなどから昇圧DCDCコンバーター・モジュールを使用して5V電源を作る
  4. 9V電池など5V以上の電源から降圧DCDCコンバーター・モジュールを使用して5V電源を作る

この記事では、まず1の電池での動作を確認してみます。
次回以降の記事では、2.の3端子レギュレータ、3.昇圧DCDCコンバーター・モジュールを使った場合について検証結果をまとめる予定です。
4.の降圧DCDCコンバーター・モジュールについては2.と概ね同じなので試していません。

obnizのJ1コネクタの使い方

obnizでUSB以外から給電する場合、USBコネクタ横のJ1コネクタを使います。

今回J1ピンにつなぎやすくするために以下のようにL字コネクタをはんだ付けしました。

表側からみて + のシルクが付いている方をVCCについてない方をGNDにつなぎます。

電源電圧・電流の計測

obnizに電源をつないだときに、電圧5Vが維持できていること、電流がどのくらい流れていか確認したいので、電源と電流が同時に計測し表示できる計測器をAmazonで購入してみました。

パネル取付け型DCデジタル電圧計電流計 赤青 100V 10A バルク品 323円

とても安いですがちゃんと動きます。
(デジタルマルチメーターなどが手元にあれば、それで代替可能です)

この計測器は、電流は10mA単位で細かくは計測できませんが、おおよその消費される電流と電圧が5Vを維持できているかは確認できますので、今回の用途としては十分です。

使い方は、類似商品 デジタル電圧計&電流計 (DC 100V 10A) 【赤V&黄A】 のページに詳しく書いてありましたので、こちらを参考につないでいきます。

電池のみ5V電源でobnizを起動

最終的には、電池一本で動作させることが目標ですが、J1端子の使い方を確認するため確実に5V電源とそこそこ電流を供給できるであろう構成を調べたところ、ラズパイなどの5V電源のマイコンを電池駆動させる方法についていくつかの記事を見つけました。
ラズパイを起動するには電流500mAくらい必要らしいですが、ニッケル水素電池1.2v x 4本を使うとちょうど5Vを超えたくらいの電圧になり電源として使えるらしいです。
obnizはラズパイほどの電流は必要ないので、確実に起動しそうです。

ニッケル水素電池と電池ボックスは、秋月電子で以下のものを買ってきました。

この単4 x 4本の電池ボックスはコンパクトかつスイッチ付きで便利おすすめです。

電圧・電流の計測器も含めて以下のようにつなぎます。

電圧・電流計は、左の赤黒が太い線になります。

無事、obnizが起動して、wifiに繋がることを確認できました。

起動後電圧は5.2V、電流はおよそ110mAで落ち着いています。
意外と小さな電流で動いています。

モーター起動時の電流

今回は、通常のモーターをobnizから動かすことを目的としているので、さらにモーターを動かせるかも確認してみます。

以下のようにobnizの0と1にDCモーターをつないで、プログラムはobnizのサイトのSDK パーツライブラリ DCMotorあたりを動かしてみます。

モーターを動かしたときの電流の大きさの変化はこんな感じです

モーター起動時、電流は一時的に150mAくらいの大きさになり、その後50mA程度で安定するようです。
カムロボットはモーター2つなので、400mAくらいの電流を流すことができる必要がありそうだということがわかりました。