developer's diary

最近はc#のエントリが多いです

laravel version 8.5.9 installしたときにインストールされるライブラリを調査

インストールコマンド

composer create-project laravel/laravel --prefer-dist ProjectName

インストール時のログ

ログを見る

username@servername:/var/www$ composer create-project laravel/laravel --prefer-dist ProjectName
Creating a "laravel/laravel" project at "./ProjectName"
Installing laravel/laravel (v8.5.9)
  - Installing laravel/laravel (v8.5.9): Extracting archive
Created project in /var/www/ProjectName
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals
  - Locking asm89/stack-cors (v2.0.2)
  - Locking brick/math (0.9.2)
  - Locking dnoegel/php-xdg-base-dir (v0.1.1)
  - Locking doctrine/inflector (2.0.3)
  - Locking doctrine/instantiator (1.4.0)
  - Locking doctrine/lexer (1.2.1)
  - Locking dragonmantank/cron-expression (v3.1.0)
  - Locking egulias/email-validator (2.1.25)
  - Locking facade/flare-client-php (1.3.7)
  - Locking facade/ignition (2.5.11)
  - Locking facade/ignition-contracts (1.0.2)
  - Locking fakerphp/faker (v1.13.0)
  - Locking fideloper/proxy (4.4.1)
  - Locking filp/whoops (2.9.2)
  - Locking fruitcake/laravel-cors (v2.0.3)
  - Locking graham-campbell/result-type (v1.0.1)
  - Locking guzzlehttp/guzzle (7.2.0)
  - Locking guzzlehttp/promises (1.4.0)
  - Locking guzzlehttp/psr7 (1.7.0)
  - Locking hamcrest/hamcrest-php (v2.0.1)
  - Locking laravel/framework (v8.27.0)
  - Locking laravel/sail (v1.3.1)
  - Locking laravel/tinker (v2.6.0)
  - Locking league/commonmark (1.5.7)
  - Locking league/flysystem (1.1.3)
  - Locking league/mime-type-detection (1.7.0)
  - Locking mockery/mockery (1.4.2)
  - Locking monolog/monolog (2.2.0)
  - Locking myclabs/deep-copy (1.10.2)
  - Locking nesbot/carbon (2.45.1)
  - Locking nikic/php-parser (v4.10.4)
  - Locking nunomaduro/collision (v5.3.0)
  - Locking opis/closure (3.6.1)
  - Locking phar-io/manifest (2.0.1)
  - Locking phar-io/version (3.0.4)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.2.2)
  - Locking phpdocumentor/type-resolver (1.4.0)
  - Locking phpoption/phpoption (1.7.5)
  - Locking phpspec/prophecy (1.12.2)
  - Locking phpunit/php-code-coverage (9.2.5)
  - Locking phpunit/php-file-iterator (3.0.5)
  - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
  - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.2)
  - Locking psr/container (1.0.0)
  - Locking psr/event-dispatcher (1.0.0)
  - Locking psr/http-client (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking psr/log (1.1.3)
  - Locking psr/simple-cache (1.0.1)
  - Locking psy/psysh (v0.10.6)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking ramsey/collection (1.1.3)
  - Locking ramsey/uuid (4.1.1)
  - Locking sebastian/cli-parser (1.0.1)
  - Locking sebastian/code-unit (1.0.8)
  - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
  - Locking sebastian/diff (4.0.4)
  - Locking sebastian/environment (5.1.3)
  - Locking sebastian/exporter (4.0.3)
  - Locking sebastian/global-state (5.0.2)
  - Locking sebastian/lines-of-code (1.0.3)
  - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
  - Locking sebastian/recursion-context (4.0.4)
  - Locking sebastian/resource-operations (3.0.3)
  - Locking sebastian/type (2.3.1)
  - Locking sebastian/version (3.0.2)
  - Locking swiftmailer/swiftmailer (v6.2.5)
  - Locking symfony/console (v5.2.3)
  - Locking symfony/css-selector (v5.2.3)
  - Locking symfony/deprecation-contracts (v2.2.0)
  - Locking symfony/error-handler (v5.2.3)
  - Locking symfony/event-dispatcher (v5.2.3)
  - Locking symfony/event-dispatcher-contracts (v2.2.0)
  - Locking symfony/finder (v5.2.3)
  - Locking symfony/http-client-contracts (v2.3.1)
  - Locking symfony/http-foundation (v5.2.3)
  - Locking symfony/http-kernel (v5.2.3)
  - Locking symfony/mime (v5.2.3)
  - Locking symfony/polyfill-ctype (v1.22.0)
  - Locking symfony/polyfill-iconv (v1.22.0)
  - Locking symfony/polyfill-intl-grapheme (v1.22.0)
  - Locking symfony/polyfill-intl-idn (v1.22.0)
  - Locking symfony/polyfill-intl-normalizer (v1.22.0)
  - Locking symfony/polyfill-mbstring (v1.22.0)
  - Locking symfony/polyfill-php72 (v1.22.0)
  - Locking symfony/polyfill-php73 (v1.22.0)
  - Locking symfony/polyfill-php80 (v1.22.0)
  - Locking symfony/process (v5.2.3)
  - Locking symfony/routing (v5.2.3)
  - Locking symfony/service-contracts (v2.2.0)
  - Locking symfony/string (v5.2.3)
  - Locking symfony/translation (v5.2.3)
  - Locking symfony/translation-contracts (v2.3.0)
  - Locking symfony/var-dumper (v5.2.3)
  - Locking theseer/tokenizer (1.2.0)
  - Locking tijsverkoyen/css-to-inline-styles (2.2.3)
  - Locking vlucas/phpdotenv (v5.3.0)
  - Locking voku/portable-ascii (1.5.6)
  - Locking webmozart/assert (1.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 105 installs, 0 updates, 0 removals
  - Downloading nesbot/carbon (2.45.1)
  - Downloading laravel/framework (v8.27.0)
  - Downloading facade/ignition (2.5.11)
  - Downloading laravel/sail (v1.3.1)
  - Installing doctrine/inflector (2.0.3): Extracting archive
  - Installing doctrine/lexer (1.2.1): Extracting archive
  - Installing symfony/polyfill-ctype (v1.22.0): Extracting archive
  - Installing webmozart/assert (1.9.1): Extracting archive
  - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.22.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.22.0): Extracting archive
  - Installing symfony/var-dumper (v5.2.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.22.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.22.0): Extracting archive
  - Installing symfony/string (v5.2.3): Extracting archive
  - Installing psr/container (1.0.0): Extracting archive
  - Installing symfony/service-contracts (v2.2.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.22.0): Extracting archive
  - Installing symfony/console (v5.2.3): Extracting archive
  - Installing psr/log (1.1.3): Extracting archive
  - Installing monolog/monolog (2.2.0): Extracting archive
  - Installing voku/portable-ascii (1.5.6): Extracting archive
  - Installing phpoption/phpoption (1.7.5): Extracting archive
  - Installing graham-campbell/result-type (v1.0.1): Extracting archive
  - Installing vlucas/phpdotenv (v5.3.0): Extracting archive
  - Installing symfony/css-selector (v5.2.3): Extracting archive
  - Installing tijsverkoyen/css-to-inline-styles (2.2.3): Extracting archive
  - Installing symfony/deprecation-contracts (v2.2.0): Extracting archive
  - Installing symfony/routing (v5.2.3): Extracting archive
  - Installing symfony/process (v5.2.3): Extracting archive
  - Installing symfony/polyfill-php72 (v1.22.0): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.22.0): Extracting archive
  - Installing symfony/mime (v5.2.3): Extracting archive
  - Installing symfony/http-foundation (v5.2.3): Extracting archive
  - Installing symfony/http-client-contracts (v2.3.1): Extracting archive
  - Installing psr/event-dispatcher (1.0.0): Extracting archive
  - Installing symfony/event-dispatcher-contracts (v2.2.0): Extracting archive
  - Installing symfony/event-dispatcher (v5.2.3): Extracting archive
  - Installing symfony/error-handler (v5.2.3): Extracting archive
  - Installing symfony/http-kernel (v5.2.3): Extracting archive
  - Installing symfony/finder (v5.2.3): Extracting archive
  - Installing symfony/polyfill-iconv (v1.22.0): Extracting archive
  - Installing egulias/email-validator (2.1.25): Extracting archive
  - Installing swiftmailer/swiftmailer (v6.2.5): Extracting archive
  - Installing ramsey/collection (1.1.3): Extracting archive
  - Installing brick/math (0.9.2): Extracting archive
  - Installing ramsey/uuid (4.1.1): Extracting archive
  - Installing psr/simple-cache (1.0.1): Extracting archive
  - Installing opis/closure (3.6.1): Extracting archive
  - Installing symfony/translation-contracts (v2.3.0): Extracting archive
  - Installing symfony/translation (v5.2.3): Extracting archive
  - Installing nesbot/carbon (2.45.1): Extracting archive
  - Installing league/mime-type-detection (1.7.0): Extracting archive
  - Installing league/flysystem (1.1.3): Extracting archive
  - Installing league/commonmark (1.5.7): Extracting archive
  - Installing laravel/framework (v8.27.0): Extracting archive
  - Installing filp/whoops (2.9.2): Extracting archive
  - Installing facade/ignition-contracts (1.0.2): Extracting archive
  - Installing facade/flare-client-php (1.3.7): Extracting archive
  - Installing facade/ignition (2.5.11): Extracting archive
  - Installing fakerphp/faker (v1.13.0): Extracting archive
  - Installing fideloper/proxy (4.4.1): Extracting archive
  - Installing asm89/stack-cors (v2.0.2): Extracting archive
  - Installing fruitcake/laravel-cors (v2.0.3): Extracting archive
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing psr/http-client (1.0.1): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing guzzlehttp/psr7 (1.7.0): Extracting archive
  - Installing guzzlehttp/promises (1.4.0): Extracting archive
  - Installing guzzlehttp/guzzle (7.2.0): Extracting archive
  - Installing laravel/sail (v1.3.1): Extracting archive
  - Installing nikic/php-parser (v4.10.4): Extracting archive
  - Installing dnoegel/php-xdg-base-dir (v0.1.1): Extracting archive
  - Installing psy/psysh (v0.10.6): Extracting archive
  - Installing laravel/tinker (v2.6.0): Extracting archive
  - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive
  - Installing mockery/mockery (1.4.2): Extracting archive
  - Installing nunomaduro/collision (v5.3.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive
  - Installing sebastian/version (3.0.2): Extracting archive
  - Installing sebastian/type (2.3.1): Extracting archive
  - Installing sebastian/resource-operations (3.0.3): Extracting archive
  - Installing sebastian/recursion-context (4.0.4): Extracting archive
  - Installing sebastian/object-reflector (2.0.4): Extracting archive
  - Installing sebastian/object-enumerator (4.0.4): Extracting archive
  - Installing sebastian/global-state (5.0.2): Extracting archive
  - Installing sebastian/exporter (4.0.3): Extracting archive
  - Installing sebastian/environment (5.1.3): Extracting archive
  - Installing sebastian/diff (4.0.4): Extracting archive
  - Installing sebastian/comparator (4.0.6): Extracting archive
  - Installing sebastian/code-unit (1.0.8): Extracting archive
  - Installing sebastian/cli-parser (1.0.1): Extracting archive
  - Installing phpunit/php-timer (5.0.3): Extracting archive
  - Installing phpunit/php-text-template (2.0.4): Extracting archive
  - Installing phpunit/php-invoker (3.1.1): Extracting archive
  - Installing phpunit/php-file-iterator (3.0.5): Extracting archive
  - Installing theseer/tokenizer (1.2.0): Extracting archive
  - Installing sebastian/lines-of-code (1.0.3): Extracting archive
  - Installing sebastian/complexity (2.0.2): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
  - Installing phpunit/php-code-coverage (9.2.5): Extracting archive
  - Installing doctrine/instantiator (1.4.0): Extracting archive
  - Installing phpspec/prophecy (1.12.2): Extracting archive
  - Installing phar-io/version (3.0.4): Extracting archive
  - Installing phar-io/manifest (2.0.1): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (9.5.2): Extracting archive

75 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

インストールされたライブラリを調査

package 内容 host
asm89/stack-cors (v2.0.2) アプリケーションを使用してhttp- {foundation、kernel}のクロスオリジンリソース共有を可能にするライブラリとミドルウェア。オリジン間リソース共有のためのW3C勧告の実装を試み ます。 github
brick/math (0.9.2) 任意精度の数値を処理するPHPライブラリ。 github
dnoegel/php-xdg-base-dir (v0.1.1) PHP用のXDGベースディレクトリ仕様の実装 github
doctrine/inflector (2.0.3) Doctrine Inflectorは、大文字/小文字および単数形/複数形の単語に関して文字列操作を実行できる小さなライブラリです。 github
doctrine/instantiator (1.4.0) このライブラリは、PHPクラスをインスタンス化するときにコンストラクターの使用を回避する方法を提供します。 github
doctrine/lexer (1.2.1) トップダウンの再帰下降パーサーで使用できるレクサーのベースライブラリ。 github
dragonmantank/cron-expression (v3.1.0) PHP cron式パーサーは、CRON式を解析し、実行が予定されているかどうかを判断し、式の次の実行日を計算し、式の前の実行日を計算できます。n個の一致する日付をスキップすることにより、はるか未来または過去の日付を計算できます。 github
egulias/email-validator (2.1.25) 複数のRFCに対して電子メールを検証するためのライブラリ。 github
facade/flare-client-php (1.3.7) PHPエラーをFlareに送信する github
facade/ignition (2.5.11) Ignitionは、Laravel5.5以降で実行されているLaravelアプリケーション用の美しくカスタマイズ可能なエラーページです。 github
facade/ignition-contracts (1.0.2) IgnitionとFlareでソリューションを表示するために使用されるインターフェイス github
fakerphp/faker (v1.13.0) Fakerは、偽のデータを生成するPHPライブラリ github
fideloper/proxy (4.4.1) 信頼できるプロキシを設定すると、リバースプロキシの背後にある場合に、正しいURL生成、リダイレクト、セッション処理、およびLaravelへのログインが可能になります。 github
filp/whoops (2.9.2) whoopsは、PHPのエラーハンドラフレームワークです。 github
fruitcake/laravel-cors (v2.0.3) Laravelにhttps://github.com/asm89/stack-corsを実装します github
graham-campbell/result-type (v1.0.1) 結果タイプの実装 github
guzzlehttp/guzzle (7.2.0) GuzzleはPHPHTTPクライアントであり、HTTPリクエストの送信を簡単にし、Webサービスとの統合を簡単にします。 github
guzzlehttp/promises (1.4.0) スタックサイズを一定に保ちながら、「無限の」Promiseチェーンを可能にする、Promiseチェーンと解決を繰り返し処理するPromises / A +実装。 github
guzzlehttp/psr7 (1.7.0) 完全なPSR-7 メッセージの実装、いくつかのストリームデコレータ、およびクエリ文字列の解析などの便利な機能が含まれています。 github
hamcrest/hamcrest-php (v2.0.1) Hamcrestは、もともとJava用に作成されたマッチングライブラリですが、その後、他の多くの言語に移植されました。hamcrest-phpはHamcrestの公式PHPポートであり、基本的にHamcrest用の元のJava APIの直訳に従いますが、いくつかの例外がありますが、ほとんどがPHP言語の壁にまで及びます。 github
laravel/framework (v8.27.0) Laravelは、表現力豊かでエレガントな構文を備えたWebアプリケーションフレームワークです。 github
laravel/sail (v1.3.1) Sailは、macOS、Windows(WSL2)、およびLinuxと互換性のあるLaravelのDockerを利用したローカル開発エクスペリエンスを提供します。Dockerを除いて、Sailを使用する前にローカルコンピューターにソフトウェアやライブラリをインストールする必要はありません。SailのシンプルなCLIは、Dockerの経験がなくてもLaravelアプリケーションの構築を開始できることを意味します。 github
laravel/tinker (v2.6.0) Laravel Tinkerは、Laravelフレームワークの強力なREPLです。 github
league/commonmark (1.5.7) 高度に拡張可能なPHP Markdownのパーサ github
league/flysystem (1.1.3) PHP用のファイルストレージライブラリです。これは、多くのタイプのファイルシステムと対話するための1つのインターフェースを提供します。Flysystemを使用すると、ベンダーロックインから保護されるだけでなく、どのストレージが適切であるかについて一貫したエクスペリエンスを得ることができます。 github
league/mime-type-detection (1.7.0) このパッケージは、finfoベースの実装を備えた汎用のmimeタイプの検出インターフェイスを提供します 。 github
mockery/mockery (1.4.2) Mockeryは、PHPUnit、PHPSpec、またはその他のテストフレームワークを使用した単体テストで使用するためのシンプルでありながら柔軟なPHPモックオブジェクトフレームワークです。 github
monolog/monolog (2.2.0) Monologは、ログをファイル、ソケット、受信ボックス、データベース、およびさまざまなWebサービスに送信します。以下のハンドラーの完全なリストを参照してください。特別なハンドラーを使用すると、高度なロギング戦略を構築できます。 github
myclabs/deep-copy (1.10.2) DeepCopyは、オブジェクトのディープコピー(クローン)を作成するのに役立ちます。これは、関連グラフのサイクルを処理するように設計されています。 github
nesbot/carbon (2.45.1) DateTimeの国際的なPHP拡張。 github
nikic/php-parser (v4.10.4) これは、PHPで記述されたPHP5.2からPHP8.0のパーサーです。その目的は、静的コードの分析と操作を簡素化することです。 github
nunomaduro/collision (v5.3.0) コマンドラインからアプリを操作するときに美しいエラーレポートを提供するように設計されたパッケージです。 github
opis/closure (3.6.1) すべてのクロージャーをシリアル化できるラッパーを提供することにより、クロージャーのシリアル化に関するPHPの制限を克服することを目的としたライブラリです。 github
phar-io/manifest (2.0.1) PHPアーカイブ(PHAR)からphar.ioマニフェスト情報を読み取るためのコンポーネント。 github
phar-io/version (3.0.4) バージョン情報と制約を処理するためのライブラリ github
phpdocumentor/reflection-common (2.2.0) 一般的なリフレクションクラス github
phpdocumentor/reflection-docblock (5.2.2) PHPDoc標準と100%互換性のあるDocBlockパーサーを提供します。このコンポーネントを使用すると、ライブラリはDocBlockを介して注釈のサポートを提供したり、DocBlockに埋め込まれている情報を取得したりできます。 github
phpdocumentor/type-resolver (1.4.0) 部分的なクラス名を解決しながら、指定された式の一連の値オブジェクトを返し、部分的な構造要素名を完全修飾構造要素名に解決した後、FQSENオブジェクトを返します。 github
phpoption/phpoption (1.7.5) PHPのオプションタイプを実装しています。 github
phpspec/prophecy (1.12.2) PHPオブジェクトモックフレームワーク github
phpunit/php-code-coverage (9.2.5) PHPコードカバレッジ情報の収集、処理、およびレンダリング機能を提供します。 github
phpunit/php-file-iterator (3.0.5) サフィックスのリストに基づいてファイルをフィルタリングするFilterIteratorの実装。 github
phpunit/php-invoker (3.1.1) タイムアウトで呼び出し可能オブジェクトを呼び出す github
phpunit/php-text-template (2.0.4) シンプルなテンプレートエンジン。 github
phpunit/php-timer (5.0.3) タイミングのユーティリティクラス github
phpunit/phpunit (9.5.2) PHPユニットテストフレームワーク。 github
psr/container (1.0.0) 共通コンテナインターフェース(PHP FIG PSR-11) github
psr/event-dispatcher (1.0.0) イベント処理用の標準インターフェース。 github
psr/http-client (1.0.1) HTTPクライアントの共通インターフェース github
psr/http-message (1.0.1) HTTPメッセージの共通インターフェース github
psr/log (1.1.3) ライブラリをログに記録するための共通インターフェイス github
psr/simple-cache (1.0.1) 単純なキャッシュのための共通インターフェース github
psy/psysh (v0.10.6) 最新のPHP用のインタラクティブシェル。 github
ralouphie/getallheaders (3.0.3) これはの単純なポリフィルです github
ramsey/collection (1.1.3) コレクションを表現および操作するためのPHP7.2以降のライブラリ。 github
ramsey/uuid (4.1.1) ユニバーサル一意識別子(UUID)を生成および操作するためのPHPライブラリ。 github
sebastian/cli-parser (1.0.1) CLIオプションを解析するためのライブラリ github
sebastian/code-unit (1.0.8) PHPコードユニットを表す値オブジェクトのコレクション github
sebastian/code-unit-reverse-lookup (2.0.3) コード行が属する関数またはメソッドを検索します github
sebastian/comparator (4.0.6) PHP値が等しいかどうかを比較する機能を提供します github
sebastian/complexity (2.0.2) PHPコードユニットの複雑さを計算するためのライブラリ github
sebastian/diff (4.0.4) 差分の実装 github
sebastian/environment (5.1.3) HHVM / PHP環境を処理する機能を提供します github
sebastian/exporter (4.0.3) 視覚化のためにPHP変数をエクスポートする機能を提供します github
sebastian/global-state (5.0.2) グローバル状態のスナップショット github
sebastian/lines-of-code (1.0.3) PHPソースコードのコード行をカウントするためのライブラリ github
sebastian/object-enumerator (4.0.4) 配列構造とオブジェクトグラフをトラバースして、参照されているすべてのオブジェクトを列挙します github
sebastian/object-reflector (2.0.4) 継承された属性と非公開の属性を含むオブジェクト属性の反映を許可します github
sebastian/recursion-context (4.0.4) PHP変数を再帰的に処理する機能を提供します github
sebastian/resource-operations (3.0.3) リソースを操作するPHP組み込み関数のリストを提供します github
sebastian/type (2.3.1) PHP型システムの型を表す値オブジェクトのコレクション github
sebastian/version (3.0.2) GitがホストするPHPプロジェクトのバージョン番号の管理に役立つライブラリ github
swiftmailer/swiftmailer (v6.2.5) PHP用のコンポーネントベースのメーリングソリューション github
symfony/console (v5.2.3) コンソールコンポーネントを使用すると、美しくテスト可能なコマンドラインインターフェイスを簡単に作成できます。 github
symfony/css-selector (v5.2.3) CSSセレクターをXPath式に変換します github
symfony/deprecation-contracts (v2.2.0) 非推奨通知をトリガーするための一般的な関数と規則 github
symfony/error-handler (v5.2.3) エラーを管理し、PHPコードのデバッグを容易にするツールを提供します github
symfony/event-dispatcher (v5.2.3) イベントをディスパッチしてリッスンすることにより、アプリケーションコンポーネントが相互に通信できるようにするツールを提供します github
symfony/event-dispatcher-contracts (v2.2.0) イベントのディスパッチに関連する一般的な抽象化 github
symfony/finder (v5.2.3) 直感的な流暢なインターフェースを介してファイルとディレクトリを検索します github
symfony/http-client-contracts (v2.3.1) HTTPクライアントに関連する一般的な抽象化 github
symfony/http-foundation (v5.2.3) HTTP仕様のオブジェクト指向レイヤーを定義します github
symfony/http-kernel (v5.2.3) リクエストをレスポンスに変換するための構造化されたプロセスを提供します github
symfony/polyfill-ctype (v1.22.0) ctype_*、ctype拡張子なしでphpバージョンを実行するユーザーに関数を提供します。 github
symfony/polyfill-iconv (v1.22.0) php.net / iconv関数のネイティブPHP実装を提供し ます github
symfony/polyfill-intl-grapheme (v1.22.0) Intl拡張機能からの Grapheme関数の部分的なネイティブPHP実装を提供します 。 github
symfony/polyfill-intl-idn (v1.22.0) Intl拡張子なしでphpバージョンを実行するユーザーに提供idn_to_asciiおよびidn_to_utf8機能します。 github
symfony/polyfill-intl-normalizer (v1.22.0) Normalizer、Intl拡張機能によって提供されるクラスのフォールバック実装を 提供 github
symfony/polyfill-mbstring (v1.22.0) Mbstring拡張機能の部分的なネイティブPHP実装を提供 github
symfony/polyfill-php72 (v1.22.0) PHP7.2コアに追加された関数を提供します。 github
symfony/polyfill-php73 (v1.22.0) PHP7.3コアに追加された関数を提供します。 github
symfony/polyfill-php80 (v1.22.0) PHP8.0コアに追加された機能を提供します。 github
symfony/process (v5.2.3) プロセスコンポーネントは、サブプロセスでコマンドを実行します。 github
symfony/routing (v5.2.3) ルーティングコンポーネントは、HTTP要求を一連の構成変数にマップします。 github
symfony/service-contracts (v2.2.0) ライティングサービスに関連する一般的な抽象化 github
symfony/string (v5.2.3) 文字列にオブジェクト指向APIを提供し、バイト、UTF-8コードポイント、および書記素クラスターを統一された方法で処理します。 github
symfony/translation (v5.2.3) 翻訳コンポーネントは、アプリケーションを国際化するためのツールを提供します。 github
symfony/translation-contracts (v2.3.0) Symfonyコンポーネントから抽出された抽象化のセット。 github
symfony/var-dumper (v5.2.3) 任意のPHP変数をウォークスルーするためのメカニズムを提供します。のdump()代わりに使用できるより優れた関数を提供します github
theseer/tokenizer (1.2.0) トークン化されたPHPソースコードをXMLに変換するための小さなライブラリ。 github
tijsverkoyen/css-to-inline-styles (2.2.3) PHP CssToInlineStylesは、HTMLをインラインスタイルのHTMLに変換するクラスです。 github
vlucas/phpdotenv (v5.3.0) 環境変数をから.envにgetenv()、$ENVそして$SERVER自動的にロードします。 github
voku/portable-ascii (1.5.6) これはPHP(PHP 7+)で記述されており、サーバー上で「mbstring」、「iconv」、またはその他の追加のエンコーディングphp-extensionなしで機能します。 github
webmozart/assert (1.9.1) この拡張機能の主な範囲は、Webmozart\Assert検証後にphpstanがオブジェクトのタイプを検出できるようにすることです。 github

気になったキーワード

Tidelift

オープンソースソフトウェアを継続的に保守してもらうためのマネタイズの仕組み

顧客→Tidelift→オープンソースソフトウェアのメンテナーの流れで報酬が支払われる

REPL

REPL (Read-Eval-Print Loop) とは、入力・評価・出力のループのこと。 インタプリタにおいて、ユーザーとインタプリタが対話的にコード片を実行できるもの。

FQSEN

完全修飾要素名 Fully Qualified Structural Element Name (FQSEN)

Optionタイプ

Optionタイプを使用すると、API開発者はより簡潔なAPIメソッドを提供でき、APIユーザーがこれらのメソッドをどのように使用するかを決定できます。

PSR-11

PSR-11では、依存性注入コンテナの共通インタフェースについて定義しています。

PSR

PSR(PHP Standards Recommendations = PHP標準勧告)とは、PHP-FIG(PHP Framework Interop Group = PHPフレームワーク相互運用性グループ)が策定しているPHPコーディング規約

ポリフィル

ポリフィルとは、最近の機能をサポートしていない古いブラウザーで、その機能を使えるようにするためのコード

UUID

UUID(Universally Unique Identifier)とは、ソフトウェア上でオブジェクトを一意に識別するための識別子

laravel8でsqlite使うときは空ファイルを事前に作成しておくこと

sqliteでmigrateしたときにエラーになって進まなかったので、調査しました。 本エントリは、その結果です。

事象

create-project でlaravelプロジェクトを作成して、.envを以下のように修正

DB_CONNECTION=sqlite
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=laravel
#DB_USERNAME=root
#DB_PASSWORD=

そして、migrate 実行

[username@hostname~/appname]$ php artisan migrate

以下のエラーが発生

  Database (/home/username/appname/database/database.sqlite) does not exist. (SQL: PRAGMA foreign_keys = ON;)

at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678

        // If an exception occurs when attempting to run a query, we'll format the error
        // message to include the bindings with SQL, which will make this exception a
        // lot more helpful to the developer instead of just the database's errors.
        catch (Exception $e) {
            throw new QueryException(
                $query, $this->prepareBindings($bindings), $e
             );
        }

対応

事前にデータベース用の空ファイルを作っておく

[username@hostname~/appname]$ touch database/database.sqlite
[username@hostname~/appname]$ php artisan migrate

参考

ドキュメントに書いてました。

readouble.com

国会会議録検索システム 検索用APIをPHPから触ってみる

前回の記事

mitsugeek.net

PHPのソース

<?php

$handle = curl_init();
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_URL,"https://kokkai.ndl.go.jp/api/speech?startRecord=1&from=2020-01-01&recordPacking=json&maximumRecords=1");
$result=curl_exec($handle);
curl_close($handle);

$result = json_decode($result);

var_dump($result);

結果

object(stdClass)#1 (5) {
  ["numberOfRecords"]=>
  int(106609)
  ["numberOfReturn"]=>
  int(1)
  ["startRecord"]=>
  int(1)
  ["nextRecordPosition"]=>
  int(2)
  ["speechRecord"]=>
  array(1) {
    [0]=>
    object(stdClass)#2 (21) {
      ["speechID"]=>
      string(25) "120414292X00120210122_000"
      ["issueID"]=>
      string(21) "120414292X00120210122"
      ["imageKind"]=>
      string(9) "会議録"
      ["searchObject"]=>
      int(0)
      ["session"]=>
      int(204)
      ["nameOfHouse"]=>
      string(9) "参議院"
      ["nameOfMeeting"]=>
      string(27) "国家基本政策委員会"
      ["issue"]=>
      string(7) "第1号"
      ["date"]=>
      string(10) "2021-01-22"
      ["closing"]=>
      NULL
      ["speechOrder"]=>
      int(0)
      ["speaker"]=>
      string(15) "会議録情報"
      ["speakerYomi"]=>
      NULL
      ["speakerGroup"]=>
      NULL
      ["speakerPosition"]=>
      NULL
      ["speakerRole"]=>
      NULL
      ["speech"]=>
      string(3400) "令和三年一月二十二日(金曜日)
   午前十一時四十一分開会
    ─────────────
   委員氏名
    委員長         大塚 耕平君
    理 事         衛藤 晟一君
                岩井 茂樹君
                宇都 隆史君
                江島  潔君
                小野田紀美君
                武見 敬三君
                中西 健治君
                中西  哲君
               三原じゅん子君
                難波 奨二君
                福山 哲郎君
                水岡 俊一君
                谷合 正明君
                山口那津男君
                松沢 成文君
                小林 正夫君
                小池  晃君
                木村 英子君
                ながえ孝子君
    ─────────────
  出席者は左のとおり。
    委員長         大塚 耕平君
    理 事
                衛藤 晟一君
                武見 敬三君
                水岡 俊一君
                松沢 成文君
    委 員
                岩井 茂樹君
                宇都 隆史君
                江島  潔君
                小野田紀美君
                中西 健治君
                中西  哲君
               三原じゅん子君
                難波 奨二君
                福山 哲郎君
                谷合 正明君
                山口那津男君
                小林 正夫君
                小池  晃君
                木村 英子君
                ながえ孝子君
   事務局側
       常任委員会専門
       員        秋谷 薫司君
    ─────────────
  本日の会議に付した案件
○理事補欠選任の件
○国政調査に関する件
○合同審査会に関する件
    ─────────────"
      ["startPage"]=>
      int(0)
      ["speechURL"]=>
      string(77) "https://kokkai.ndl.go.jp/#/detail?minId=120414292X00120210122&spkNum=0&single"
      ["meetingURL"]=>
      string(61) "https://kokkai.ndl.go.jp/#/detail?minId=120414292X00120210122"
      ["pdfURL"]=>
      NULL
    }
  }
}

PHPでPDF出力 ~ wkhtmltopdfを利用した「ええ感じ」のサンプル(htmlを利用)

wkhtmltopdfをインストール(Homebrew-cask利用)

wkhtmltopdfはバイナリ。バイナリな分速度は早いのですが、 環境に依存しますので、サーバによっては使えない場合が有ります。 (共有サーバとかだとインストールできない場合が多い、または難易度が上がります。)

brew cask install wkhtmltopdf

knplabs/knp-snappyの準備

プロジェクト用ディレクトリ作成

mkdir pdf-example3

ディレクトリに移動

cd pdf-example3

composerの準備

composer init

knplabs/knp-snappyのインストール

composer require knplabs/knp-snappy

画像埋め込みの確認用に猫の画像を検索してダウンロードしておく

ここで猫の画像を検索 visualhunt.com

f:id:mitsugi-bb:20200907230618p:plain
この猫の画像にしよう

名前はcat.jpgにしよう。

phpファイル作成

base64で事前に読み込んでおく。

<?php<?php

require './vendor/autoload.php';

$img = base64_encode(file_get_contents("cat.jpg"));
$html = <<< EOF
<style>
body {
    font-family: ipag;
    }
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    width:100%;
    border-collapse: collapse;
    border-spacing: 0px;
}
.left{
    text-align: left;
    border: solid 1px black;
    height:30px;
}
.right{
    text-align: right;
    border: solid 1px black;
    height:30px;
}
.center{
    text-align: center;
    border: solid 1px black;
    height:30px;
}
.decoration{
    text-decoration: line-through;
    border: solid 1px black;
}

.sample1 {text-decoration: none;}
.sample2 {text-decoration: underline;}
.sample3 {text-decoration: overline;}
.sample4 {text-decoration: line-through;}
.sample5 {text-decoration: underline dotted red;}

.color{
    background-color:black;
    color:white;
}
</style>


<table class="table">
<tr>
    <td class="left">text-align: left;</td>
    <td class="center">text-align: center;</td>
    <td class="right">text-align: right;</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">日本語</td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td"><table class="table">
        <tr>
            <td class="td" >test</td>
        </tr>
        <tr>
            <td class="td" >test</td>
        </tr>
    </table></td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td" colspan="2">colspan="2"</td>
    <td class="td" rowspan="2">rowspan="2"</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">fuga</td>
</tr>
<tr>
    <td class="td2" colspan="3">height:100px; colspan="3"</td>
</tr>
<tr>
    <td class="td2 color" colspan="3">改行<br>
brタグ<br>
で改行<br>
背景色変更<br>
フォントカラー変更<br>
</td>
</tr>
<tr>
    <td class="td3" colspan="3">改行<br>
brタグ<br>
で改行<br>
</td>
</tr>
<tr>
<td class="td2" colspan="3">

<div><span class="sample1">none</span> text-decoration: none;</div>
<div><span class="sample2">underline</span> text-decoration: underline;</div>
<div><span class="sample3">overline</span> text-decoration: overline;</div>
<div><span class="sample4">line-through</span> text-decoration: line-through;</div>
<div><span class="sample5">underline dotted red</span> text-decoration: underline dotted red;</div>


</td>
</tr>
<tr>
<td class="td2" colspan="3">
画像挿入
<br>
<div>
 <img src="data:image/jpeg;base64,{$img}" width="300px"/> 
</div>
<br>

</td>
</tr>
</table>


EOF;

// wkhtmltopdfの位置をコンストラクタに渡す
$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf');

// encoding = utf-8をセット
$pdf->setOption('encoding', 'utf-8');

// PDFをブラウザに出力
header("Content-Type: application/pdf");
echo $pdf->getOutputFromHtml($html);

結果

f:id:mitsugi-bb:20201010145546p:plain

その他

tcpdfはこちら

tcpdfバージョンのエントリは以下より。

mitsugeek.net

dompdfはこちら

tcpdfバージョンのエントリは以下より。

mitsugeek.net

VSCode、Laravelのweb.phpでUndefined type 'Route' のエラーメッセージを消す方法を探す記録

問題

VSCodeでなみなみ線がつく。 f:id:mitsugi-bb:20201003111253p:plain

調べる

あった。 github.com

解決策

routes/web.phpの先頭に以下のコード追加

use Illuminate\Support\Facades\Route;

Authも使う場合はこちらも追加

use Illuminate\Support\Facades\Auth;

結果

無事なみなみ線が消えました。 f:id:mitsugi-bb:20201003111325p:plain

参考

www.kakistamp.com

qiita.com

karukichi-blog.netlify.app

PHPでPDF出力 ~ dompdfを利用した「ええ感じ」のサンプル(htmlを利用)

dompdfの準備

プロジェクト用ディレクトリ作成

mkdir pdf-example2

ディレクトリに移動

cd pdf-example2

composerの準備

composer init

dompdfのインストール

composer require dompdf/dompdf

load_font.phpの準備

curl https://raw.githubusercontent.com/dompdf/utils/master/load_font.php --output load_font.php

IPAフォントのダウンロードと解凍

curl https://ipafont.ipa.go.jp/IPAfont/IPAfont00303.zip --output IPAfont00303.zip
unzip IPAfont00303.zip 

フォントの追加

php load_font.php ipag IPAfont00303/ipag.ttf
php load_font.php ipagp IPAfont00303/ipagp.ttf  
php load_font.php ipam IPAfont00303/ipam.ttf 
php load_font.php ipamp IPAfont00303/ipamp.ttf

画像埋め込みの確認用に猫の画像を検索してダウンロードしておく

ここで猫の画像を検索 visualhunt.com

f:id:mitsugi-bb:20200907230618p:plain
この猫の画像にしよう

名前はcat.phpにしよう。

phpファイル作成

imgタグはどうもネットワーク経由で取得しているらしく、URLが必要だった。 ローカルのファイルを利用する場合は、base64を利用することでうまくいく。 今回はローカルファイルで対応した為、base64で事前に読み込んでおく。

<?php
require_once "vendor/autoload.php";

use Dompdf\Dompdf;

$img = base64_encode(file_get_contents("cat.jpg"));
$html = <<< EOF
<style>
body {
    font-family: ipag;
    }
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    width:100%;
    border-collapse: collapse;
    border-spacing: 0px;
}
.left{
    text-align: left;
    border: solid 1px black;
    height:30px;
}
.right{
    text-align: right;
    border: solid 1px black;
    height:30px;
}
.center{
    text-align: center;
    border: solid 1px black;
    height:30px;
}
.decoration{
    text-decoration: line-through;
    border: solid 1px black;
}

.sample1 {text-decoration: none;}
.sample2 {text-decoration: underline;}
.sample3 {text-decoration: overline;}
.sample4 {text-decoration: line-through;}
.sample5 {text-decoration: underline dotted red;}

.color{
    background-color:black;
    color:white;
}
</style>


<table class="table">
<tr>
    <td class="left">text-align: left;</td>
    <td class="center">text-align: center;</td>
    <td class="right">text-align: right;</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">日本語</td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td"><table class="table">
        <tr>
            <td class="td" >test</td>
        </tr>
        <tr>
            <td class="td" >test</td>
        </tr>
    </table></td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td" colspan="2">colspan="2"</td>
    <td class="td" rowspan="2">rowspan="2"</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">fuga</td>
</tr>
<tr>
    <td class="td2" colspan="3">height:100px; colspan="3"</td>
</tr>
<tr>
    <td class="td2 color" colspan="3">改行<br>
brタグ<br>
で改行<br>
背景色変更<br>
フォントカラー変更<br>
</td>
</tr>
<tr>
    <td class="td3" colspan="3">改行<br>
brタグ<br>
で改行<br>
</td>
</tr>
<tr>
<td class="td2" colspan="3">

<div><span class="sample1">none</span> text-decoration: none;</div>
<div><span class="sample2">underline</span> text-decoration: underline;</div>
<div><span class="sample3">overline</span> text-decoration: overline;</div>
<div><span class="sample4">line-through</span> text-decoration: line-through;</div>
<div><span class="sample5">underline dotted red</span> text-decoration: underline dotted red;</div>


</td>
</tr>
<tr>
<td class="td2" colspan="3">
画像挿入
<br>
<div>
 <img src="data:image/jpeg;base64,{$img}" width="300px"/> 
</div>
<br>

</td>
</tr>
</table>


EOF;

$dompdf = new Dompdf();

$dompdf->loadHtml($html);

$options = $dompdf->getOptions(); 
$options->set(array('isRemoteEnabled' => false));
$dompdf->setOptions($options);

$dompdf->setPaper('A4', 'portrait');
$dompdf->render();

$dompdf->stream("example.pdf", array("Attachment" => true));

結果

f:id:mitsugi-bb:20200908004730p:plain
urlを開くとファイルダウンロードが行われる
f:id:mitsugi-bb:20200908004751p:plain
PDFの読み込み結果

その他

tcpdfはこちら

tcpdfバージョンのエントリは以下より。

mitsugeek.net

wkhtmltopdfはこちら

wkhtmltopdfバージョンのエントリは以下より。

mitsugeek.net

PHPでPDF出力 ~ tcpdfを利用した「ええ感じ」のサンプル(htmlを利用)

tcpdfの準備

プロジェクト用ディレクトリ作成

mkdir pdf-example

ディレクトリに移動

mkdir pdf-example

composer初期化

composer init

tcpdfインストール

composer require tecnickcom/tcpdf

IPAフォントダウンロード、解凍

curl https://ipafont.ipa.go.jp/IPAfont/IPAfont00303.zip --output IPAfont00303.zip
unzip IPAfont00303.zip 

tcpdfに日本語用フォント追加

php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipag -f 32 -i ./IPAfont00303/ipag.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipagp -f 32 -i ./IPAfont00303/ipagp.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipam -f 32 -i ./IPAfont00303/ipam.ttf 
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t ipamp -f 32 -i ./IPAfont00303/ipamp.ttf

画像埋め込みの確認用に猫の画像を検索してダウンロードしておく

ここで猫の画像を検索 visualhunt.com

f:id:mitsugi-bb:20200907230618p:plain
この猫の画像にしよう

名前はcat.phpにしよう。

phpファイル作成

それなりに、HTMLは色々と盛り込んでみました。

<?php

// composerでインストールしたライブラリを参照する
require_once('./vendor/tecnickcom/tcpdf/tcpdf.php');

// 用紙の方向、用紙サイズを指定する
$tcpdf = new TCPDF('P', "pt",'A4');
$tcpdf->SetMargins(5, 5, 5); //マージン無効
$tcpdf->SetFont('ipag', '', 10);
$tcpdf->setPrintHeader(false);
$tcpdf->setPrintFooter(false);
$tcpdf->AddPage();

$html = <<< EOF
<style>
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    border-collapse: collapse;
    border-spacing: 0px;
}
.left{
    text-align: left;
    border: solid 1px black;
    height:30px;
}
.right{
    text-align: right;
    border: solid 1px black;
    height:30px;
}
.center{
    text-align: center;
    border: solid 1px black;
    height:30px;
}
.decoration{
    text-decoration: line-through;
    border: solid 1px black;
}

.sample1 {text-decoration: none;}
.sample2 {text-decoration: underline;}
.sample3 {text-decoration: overline;}
.sample4 {text-decoration: line-through;}
.sample5 {text-decoration: underline dotted red;}

.color{
    background-color:black;
    color:white;
}
</style>


<table class="table">
<tr>
    <td class="left">text-align: left;</td>
    <td class="center">text-align: center;</td>
    <td class="right">text-align: right;</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">日本語</td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td"><table class="table">
        <tr>
            <td class="td" >test</td>
        </tr>
        <tr>
            <td class="td" >test</td>
        </tr>
    </table></td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td" colspan="2">colspan="2"</td>
    <td class="td" rowspan="2">rowspan="2"</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">fuga</td>
</tr>
<tr>
    <td class="td2" colspan="3">height:100px; colspan="3"</td>
</tr>
<tr>
    <td class="td2 color" colspan="3">改行<br>
brタグ<br>
で改行<br>
背景色変更<br>
フォントカラー変更<br>
</td>
</tr>
<tr>
    <td class="td3" colspan="3">改行<br>
brタグ<br>
で改行<br>
</td>
</tr>
<tr>
<td class="td2" colspan="3">

<div><span class="sample1">none</span> text-decoration: none;</div>
<div><span class="sample2">underline</span> text-decoration: underline;</div>
<div><span class="sample3">overline</span> text-decoration: overline;</div>
<div><span class="sample4">line-through</span> text-decoration: line-through;</div>
<div><span class="sample5">underline dotted red</span> text-decoration: underline dotted red;</div>


</td>
</tr>
<tr>
<td class="td2" colspan="3">
画像挿入
<br>
<div>
 <img src="cat.jpg" width="300px"/> 
</div>
<br>

</td>
</tr>
</table>


EOF;

$tcpdf->WriteHTML($html, true, 0, false, true, 'L');
// 出力用バッファの内容を消去
ob_end_clean();
$tcpdf->Output("test.pdf", "D");

結果

URLを開くとファイルがダウンロードされます。

f:id:mitsugi-bb:20200907231027p:plain
ダウンロードの様子

ファイルを開くとこんな感じに。

f:id:mitsugi-bb:20200907231211p:plain
PDFの読み込み結果

参考

qiita.com

その他

dompdfはこちら

dompdfバージョンのエントリは以下より。

mitsugeek.net

wkhtmltopdfはこちら

wkhtmltopdfバージョンのエントリは以下より。

mitsugeek.net

WSL + Ubuntu + PHP + xdebug + Visual StudioCode + PHP DebugでPHPの学習環境構築

前提
  • OSがWindows 10 Proであること。
  • WSLを有効化していること。
  • WSLにUbuntuインストール済みであること。
  • WSLのUbuntuにPHPインストール済みであること。
  • ローカル環境にVisual Studio Codeインストール済みであること。

Ubuntuにphp-xdebugをインストール

sudo apt install php-xdebug

php-xdebugの設定ファイルを修正

vi で設定ファイルを開く

sudo vi /etc/php/7.2/cli/conf.d/20-xdebug.ini

設定ファイルの内容を以下のように修正

zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_autostart = 1

Visual Studio CodeにPHP Debugをインストール

赤色の枠の部分をクリックしていく。

PHP Debugをインストールする様子
PHP Debugをインストール

Visual Studio CodeにインストールしたPHP Debugの設定

設定ファイル(.vscode/launch.json)は、歯車マークをクリックして開けられる

PHP Debugの設定ファイルの開き方
PHP Debugの設定ファイルの開き方

設定ファイル(.vscode/launch.json)を以下のように修正

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "php local debug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                "/mnt/c":"c:/"
            }
        }
    ]
}

準備OK!デバッグ実行してみよう。

  • 赤〇で囲った虫を押下。
  • オレンジで囲ったところをクリックしてブレークポイントを指定
  • 緑で囲ったところを「php local debug(ここはlaunch.jsonに指定したnameが表示される)」に変更して再生ボタンを押下
  • 水色で囲った部分にターミナルを表示しておく(ここでプログラムの実行を行う)

PHP Debugの準備
PHP Debugの準備

プログラムは以下の通り

<?php

echo "hello\n";
echo "hello\n";

$test = "test";

$number = 100;

$number2 = 200;

$number3 = $number + $number2;

プログラム実行してみる。

wsl php echo.php

PHP Debugのブレークポイントで止まった様子
PHP Debugのブレークポイントで止まった様子

ブレークポイントで止まった。

ステップオーバーしてみる。

赤〇で囲ったのアイコンをクリックして、1行ステップオーバー(プログラムが1行進む)

ステップオーバーの様子
ステップオーバーの様子

オレンジ色で囲ったところで変数の中身も確認できる。

感想

apacheをインストールする必要もなく、 簡単にできた。

こんな感じでPHPがステップ実行できると、 プログラム初級の部分(変数・演算・分岐・ループ・関数)で躓きにくくなるかもしれない。

改めて、Visual Studio Code の凄さを実感。

これが無償で利用できるなんて。。。

参考

togetter.com

togetter.com

togetter.com

参考にしたサイト

Setting up PHP for development on Windows Subsystem for Linux in Windows 10 | Tim Anderson's IT Writing

POP3を利用してメール受信する際に重複を防ぐ仕組み。「UIDL」を利用する

メールの受信処理でメール受信をトリガーにコマンド実行できない場合は、cronでx分単位で定時バッチを実行するのが一般的だと思います。

その際に受信したデータをメールサーバに残したままだと、何度も処理済みのデータを受信する羽目になってしまいます。

今回はそれをどうやって防ぐかという内容。

結論

「uidl」を利用します。

参考:重複せずに POP サーバからメールを受信する仕組み UIDL

PHPでUIDLを確認

ライブラリは「Net/POP3.php」を利用してます。

<?php
require_once 'Net/POP3.php';

$pop = new Net_POP3();
$pop->connect(HOST, PORT);
$pop->login(USER, PASS);
$messages = $pop->getListing();

foreach($messages as $message){
    var_dump($message);
}

結果

array(3) {
  ["msg_id"]=>
  string(1) "1"
  ["size"]=>
  string(5) "74529"
  ["uidl"]=>
  string(35) "494902.IMUdeXl3re8levBIsfglvt47mt4w="
}

array(3) {
  ["msg_id"]=>
  string(1) "2"
  ["size"]=>
  string(5) "34529"
  ["uidl"]=>
  string(35) "494932.IMUdeXl3re8erev4Is2vter7mt4w="
}

getListingで取得した結果を単純に回してvar_dumpしているだけですが、["uidl"]が確認できました。

あとはこれを処理後にDBに保存して、次回DBを参照した際に存在すればスキップすればいいだけですね。超簡単だ。

Microsoft Translatorに登録。クラウドを利用して翻訳プログラムを簡単に作る。

Microsoft Translatorって何?

Microsoftが提供する機械翻訳のAPIです。 Windows azure(マイクロソフトが提供するクラウドサービス)のMarketplace(データの方)にあります。

ということで登録しました。

月額2,000,000文字まで無料で利用できるようなので登録しました。

f:id:mitsugi-bb:20140105192859p:plain

試してみる。

↓のような感じにAPIを試す画面が存在します。

f:id:mitsugi-bb:20140105193301p:plain

初めまして。私はmitsugeekです。

↓↓↓Translator実行!↓↓↓

How do you do. I am mitsugeek.

単にこれだけだと、Google翻訳や、Yahoo翻訳等のWeb上の翻訳と変わりないです。

Webで利用できる翻訳サービス一覧

WEBの翻訳サービスって結構あるんですね。

何が嬉しい?

何が良いかというと自分のアプリケーションに翻訳機能を組み込める所です。 Googleも同様のサービス(Google Translate API)を行ってますが有料です。

プログラムから呼び出してみる。

手っ取り早くPHPで実行しました。

<?php

const APPID = 'プライマリ アカウント キーを入力';
$input_text = '初めまして。mitsugeekです。';
$to = 'en';

$ch = curl_init('https://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate?Text=%27'.urlencode($input_text).'%27&To=%27'.$to.'%27');
curl_setopt($ch, CURLOPT_USERPWD, APPID.':'.APPID);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
$result = explode('<d:Text m:type="Edm.String">', $result);
$result = explode('</d:Text>', $result[1]);
$result = $result[0];

echo $input_text." -> ".$result;

結果。

f:id:mitsugi-bb:20140105201714p:plain

コマンドで実行。

[root@localhost html]# php mst.php
初めまして。mitsugeekです。 -> How do you do. It is mitsugeek.