2022年 5月 の投稿一覧

Git for Windows でcore.useBuiltinFSMonitor=true is deprecatedのメッセージが表示される – core.fsmonitor=true を追加設定して解決

こんばんは、ウチイダです。

最近、VirtualBoxを使わなくてはいけない場面があります。

その時はWSLをオフにしているので、かわりにPowerShellやGit bashなどを使っています。

先日、git コマンドをPowerShellで利用したときに、以下のようなメッセージが表示されました。

hint: core.useBuiltinFSMonitor=true is deprecated;please set core.fsmonitor=true instead
hint: Disable this message with "git config advice.useCoreFSMonitorConfig false"

こんなの出ていたかな~と思いつつ検索してみると、2021年のリリースでgit for windowsに実験的に同梱されていたfs monitor を有効にするためのパラメータのようです。

現在は開発が進んで、実験的機能ではなく標準で提供されるものに位置付けられたので、パラメータの名称も変わって、古い方が非推奨になった…ということのようでした。

特に支障はないらしいのですが、毎回出てきてうっとうしいので、表示されないようにしたいと思います。

とりあえずメッセージに従って、fsmonitor の設定値をtrueにします。

> git config --global core.fsmonitor true

これでメッセージは表示されなくなりました。

ちなみに、fsmonitor というのは、gitコマンドの動作を高速化するために内部的に使われているプログラムだとのこと。

詳しく調べられませんでしたが、有効にしておいて問題はなさそうなので、いったんこのまま様子を見ようと思います。

以上です。あなたのお役に立てれば幸いです。

composer self-update がnot defined になってしまう – 最新版を別インストールする

こんばんは、ウチイダです。

ご依頼いただいている案件で、XserverにLaravelアプリケーションをデプロイするときにちょっとつまづいたのでメモしておきます。

Xserverにはもともとcomposer がインストールされているのですが、バージョンが古くてうまくいかないことが発生します。

サーバを立てたタイミングによるかもしれませんが、2022年5月時点で、以下のバージョンが動きます。

$ composer -V
Composer version 1.9.1 2019-11-01 17:20:17

v1系ですね…

最新はv2.3 なので、これだといろいろエラーが出てしまいます。

というわけでアップデートをかけたいのですが、self-updateができないように設定されていました。

$ composer self-update

  [Symfony\Component\Console\Exception\CommandNotFoundException]
  Command "self-update" is not defined.

レンタルサーバだし仕方ない。

というわけで、最新版をインストールします。

多くのサイトでComposerのインストールコマンドが紹介されているのですが、バージョンが古いものだと、ハッシュチェックでエラーになってしまうので、必ず公式サイトのコマンドを参照するようにしましょう…

https://getcomposer.org/download/

このページにインストールコマンドを掲載すると、時間がたったときにここを見ていただいた方をエラーに導いてしまうことになるので、あえて書かないことにします。

上記の公式サイトに掲載されている最新のコマンドでcomposer-setup.php を取得して、ハッシュも最新のファイルのものを利用してください。

あとはインストールするだけです。

/usr/bin には先住Composerがいるので、ここには配置できまん。

パスが通っている別のディレクトリに置くか、新たにパスを通したディレクトリに配置します。

今回はホームディレクトリ配下に.composer を作って、そこに住まわせることにしました。

同じルールでnodebrewとかもインストールされていたので、それに合わせる形です。

composer-setup.php には、インストール先を指定するオプションがついているので、これを利用しました。

$ php composer-setup.php --install-dir=~/.composer --filename=composer;

パスは通してくれなかったので、手動で追加しました。

$ echo "export PATH=$HOME/.composer:$PATH" >> ~/.bashrc

バージョンチェックをして、最新版になっていれば完了です!

$ composer -V
Composer version 2.3.5 2022-04-13 16:43:00

Xserverはレンタルサーバーのくせにいろいろカスタマイズできて便利ですが、ひと工夫必要な場面もあるので、落ち着いてデプロイ作業を行いたいですね。

以上です。あなたのお役に立てれば幸いです。

Laravel artisan でClassloader のエラーが発生 – composer dumpautoload でオートロード設定を更新

こんばんは、ウチイダです。

Laravel にいろいろなパッケージを追加していたところ、あるタイミングからartisan コマンドの実行で以下のようなエラーが発生するようになりました。

例ではEvent クラスの生成コマンドを試していますが、ほかのコマンドでも同様です。

$ php artisan event:generate

   ErrorException

  include(/var/www/html/vendor/composer/../../app/Events/Something.php): Failed to open stream: No such file or directory

  at vendor/composer/ClassLoader.php:571
    567▕  * @private
    568▕  */
    569▕ function includeFile($file)
    570▕ {
  ➜ 571▕     include $file;
    572▕ }
    573▕

      +2 vendor frames
  3   [internal]:0
      Composer\Autoload\ClassLoader::loadClass()

      +27 vendor frames
  31  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()

どうやら、Composerのオートロードがうまく動作していないようです。

Composerでのパッケージ追加中に、何かの操作をミスったか、composer.jsonの設定を間違えたようです。

以下のコマンドで修正をかけます。

$ composer dumpautoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: barryvdh/laravel-debugbar
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: spatie/laravel-ignition

# ... 他にもいろいろ表示されました ...

Package manifest generated successfully.
Generated optimized autoload files containing 5207 classes

再度、Event クラスの生成を試したところ、うまくいきました。

$ artisan event:generate
Events and listeners generated successfully.

以上です。あなたのお役に立てれば幸いです。

Laravel Http クライアントで、Gzipのデータを取得したい

こんばんは、ウチイダです。

Amazon Ads API を利用して、広告費用を最適化するアプリケーションの開発をご依頼いただきました。

ドキュメントが今のところ英語しかないので、頑張って読み解きつつ進めています。

https://advertising.amazon.com/API/docs

LaravelでAmazon Ads APIとの通信部分を実装しているなかで、広告パフォーマンスのレポートデータをダウンロードする部分で少し苦労したのでメモしておきます。

Amazon Ads API では、クリック数や広告経由の売り上げなどの情報を取得するために、以下の手順を踏む必要があります。

  1. レポートデータの生成をリクエスト
  2. 最大15分ほど、レポートデータが生成されるのを待つ
  3. レポートデータが生成されたら、Amazon S3からダウンロードする

3でダウンロードされるデータがgzipで圧縮されていたので、うまくレスポンスを受け取るのに少し工夫が必要でした。

ちなみに、手順1, 2はLaravel Httpのドキュメントを見ながら結構簡単に実装できました。

https://readouble.com/laravel/9.x/ja/http-client.html

実際にうまく動作したコードは、以下のような感じです。

// 冒頭で、Http ファサードを読み込んでおく
use Illuminate\Support\Facades\Http;

$response = Http::
    withHeaders([
    'Content-Type' => 'application/json',
    'Amazon-Advertising-API-ClientId' => 'CLIENT_ID', // あらかじめ取得したClient IDを設定
    'Amazon-Advertising-API-Scope' => 'PLOFILE_ID', // あらかじめ取得したProfile IDを設定
])
    ->withOptions(['decode_content' => 'gzip']) // ★gzip形式での受け取りする
    ->withToken('ACCESS_TOKEN') // あらかじめ取得したアクセストークンを設定 WithToken() がBearer の記述など行ってくれる
    ->get("https://advertising-api-fe.amazon.com/v2/reports/{$reportId}/download"); // あらかじめ発行リクエストしたレポートのIDを設定

dump($response->body()); // gzip のバイトデータそのまま表示してみる
dump(gzdecode($response->body())); でコードしてもともとのデータを表示する

downloadのエンドポイントは、存在するレポートデータのIDに対してリクエストされたら、リダイレクトしてAmazonS3 バケットに配置されたデータを返してくれます。

Content-typeはapplication/jsonにしつつ、gzipのデータを取得するように設定する必要があります。

ポイントはwithOptions()でgzipのデータを受け取ることを記述している点です。

‘decode_content’ で指定できるのですね。

この設定値はLaravelのドキュメントには記載されていなくて、Guzzle のドキュメントを見る必要がありました。

https://docs.guzzlephp.org/en/stable/request-options.html#decode-content

ちなみに、ヘッダー内に書く場合は以下のようになります。

// 冒頭で、Http ファサードを読み込んでおく
use Illuminate\Support\Facades\Http;

$response = Http::
    withHeaders([
    'Content-Type' => 'application/json',
    'Amazon-Advertising-API-ClientId' => 'CLIENT_ID', // あらかじめ取得したClient IDを設定
    'Amazon-Advertising-API-Scope' => 'PLOFILE_ID', // あらかじめ取得したProfile IDを設定
    'Accept-Encoding' => 'gzip' // ★ここにgzipを指定
])
    ->withToken('ACCESS_TOKEN') // あらかじめ取得したアクセストークンを設定 WithToken() がBearer の記述など行ってくれる
    ->get("https://advertising-api-fe.amazon.com/v2/reports/{$reportId}/download"); // あらかじめ発行リクエストしたレポートのIDを設定

withOptions() がなくなってチェインするメソッドが減ったので、今回の場合であればこっちの方がすっきりします。

withToken()も、Bearer の記述をコード内に書けばwithHeaders() に含めることができるので、もっとまとめてしまうこともできます。

ウチイダ的にはwithToken() を使う方が楽なので、このままにしています。

以上です。あなたのお役に立てれば幸いです。

Git で、ファイルの一部の変更のみコミットしたい – git add -p

こんばんは、ウチイダです。

ここしばらく、10名くらいのグループで開発する案件で、デプロイ内容の確認などを行う役割を任せていただいてます。

それ以来、gitのいろんな機能を活用する機会が増えました。

その中でも、しばしば利用するのに毎回忘れてしまうのが「ファイルの一部分の変更だけコミットする」というもの。

コマンドラインから簡単にできます。

# 指定ファイルの変更内容ごとに、add するか確認する
$ git add -p filename

git add -p でファイル名を指定すると、変更箇所(hunk) ごとにコミットステージに乗せるかを確認してくれます。

今回のコミットに含めたい部分はy, それ以外はn を入力していきます。

あとはいつもどおりにコミットすればOKです。

実装内容の切り戻しや、プロダクション環境へのリリースに際して、コミットは細かくしてあったほうが便利だなと最近実感しています。

RevertやCherryPickの操作をするときに、細分化してある方が結果的に楽なんですよね…

以上です。

あなたのお役に立てれば幸いです。