GitHubのgit://形式のURLは暗号化されていないのでサポートされなくなったらしい。

 

何かの手違いでローカルPCでbrew servicesが使えなくなった。(それ以外のbrewコマンドは使える状態)

原因は、git clone https://... が失敗するためだったぽい。https://でなくgit@github.com: <user-name>/<repository>.gitをURLに指定するとできた🎉🙌

そもそもgit clone https://できないのがよくなさそう😅

error文にもある通りhttps://github.blog/2021-09-01-improving-git-protocol-security-github/をみると、git://は暗号化されていないのでサポートされなくなったらしい。

$ brew services --help
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
fatal: remote error:
The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
Error: Failure while executing; `git clone https://github.com/Homebrew/homebrew-services /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services --origin=origin --template=` exited with 128.
Error: Failure while executing; `/usr/local/bin/brew tap homebrew/services` exited with 1.


# homebrew-services がない!!!
$ ll /usr/local/Homebrew/Library/Taps/homebrew
total 0
drwxr-xr-x 5 kin29 admin 160 4 29 17:25 .
drwxr-xr-x 5 kin29 admin 160 4 22 16:56 ..
drwxr-xr-x 17 kin29 admin 544 2 16 12:43 homebrew-cask
drwxr-xr-x 17 kin29 admin 544 2 16 12:43 homebrew-core
 


# git clone https://..だと失敗したので git@github.comを使うようにした。
$ git clone git@github.com:Homebrew/homebrew-services.git /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services --origin=origin --template=
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 1985, done.
remote: Counting objects: 100% (494/494), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 1985 (delta 338), reused 434 (delta 324), pack-reused 1491
Receiving objects: 100% (1985/1985), 545.80 KiB | 751.00 KiB/s, done.
Resolving deltas: 100% (893/893), done.
 

$ ll /usr/local/Homebrew/Library/Taps/homebrew
total 0
drwxr-xr-x 5 kin29 admin 160 4 29 17:25 .
drwxr-xr-x 5 kin29 admin 160 4 22 16:56 ..
drwxr-xr-x 17 kin29 admin 544 2 16 12:43 homebrew-cask
drwxr-xr-x 17 kin29 admin 544 2 16 12:43 homebrew-core
drwxr-xr-x 13 kin29 admin 416 4 29 17:25 homebrew-services //入った!

# 使えるようになったーーー!!!
$ brew services --help
Usage: brew services [subcommand]

Manage background services with macOS' launchctl(1) daemon manager.

If sudo is passed, operate on /Library/LaunchDaemons (started at boot).
Otherwise, operate on ~/Library/LaunchAgents (started at login).

Jest + TypeScript でテストできるようにする

 

 

TypeScriptのテストといえばJestなのかな?と思って導入してみました!
JavaScriptのみの場合は簡単だったんですが、TypeScriptの時はちょっと手こずったので残します😇

Jestとは❓

https://jestjs.io/docs/getting-started

導入手順📲

1️⃣ Jestをinstallする(JavaScriptテスト実行はここまででok👌)

$ npm install --save-dev jest
$ vi package.json //npm testでテスト実行できるようにする
{
  "devDependencies": {
    "jest": "^27.5.1"
- }
+ },
+ "scripts": {
+   "test": "jest"
+ }
}

$ npm test //JSのテスト実行できた〜🙌🙌🙌

> test
> jest

 PASS  ./sum.test.js
  ✓ adds 1 + 2 to equal 3 (2 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.48 s
Ran all test suites.

2️⃣ TypeSciptでもJestでテスト実行できるようにする

TypeScriptだと以下のエラーが出たので調整する

$ npm test

> test
> jest

 FAIL  ./ts-sum.test.ts
  ● Test suite failed to run

    Jest encountered an unexpected token

    Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.

    Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

    By default "node_modules" folder is ignored by transformers.

    Here's what you can do:
     • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
     • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/configuration
    For information about custom transformations, see:
    https://jestjs.io/docs/code-transformation

    Details:

    /Users/kin29/jest-test/ts-sum.test.ts:1
    ({"Object.":function(module,exports,require,__dirname,__filename,jest){import { TsSum } from "./ts-sum";
                                                                                      ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1728:14)

 PASS  ./sum.test.js

Test Suites: 1 failed, 1 passed, 2 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.04 s
Ran all test suites.

tscコマンドをinstallする

//tscコマンドをinstall
$ npm i typescript -g
$ tsc --version
Version 4.6.2

//tsconfig.jsonを作成
$ tsc -init

Created a new tsconfig.json with:                                                                                       
                                                                                                                     TS 
  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig.json
$ npm install --save-dev ts-jest @types/jest typescript
$ jest --init //jest.config.tsを作成

The following questions will help Jest to create a suitable configuration for your project

✔ Would you like to use Typescript for the configuration file? … yes
✔ Choose the test environment that will be used for testing › node
✔ Do you want Jest to add coverage reports? … no
✔ Which provider should be used to instrument code for coverage? › v8
✔ Automatically clear mock calls, instances and results before every test? … no

📝  Configuration file created at /Users/kin29/jest-test/jest.config.ts

$ vi jest.config.ts
- // transform: {}
+ transform: {
+   '.*\\.(ts)$' : '/node_modules/ts-jest',
+ },

TypeScriptでもテスト実行できるようになった〜🎉🎉🎉

$ npm test

> test
> jest

 PASS  ./sum.test.js
 PASS  ./ts-sum.test.ts

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.741 s
Ran all test suites.

さいごに

GASでテスト書きたいのでちょっと触ってみました!
次回はGAS+Jestでテスト書いた記事かければいいなーっと思っています💡

追記:書きましたー!!!

GASのテスト(Jest)を書く!!!

【超小ネタ】GitHubでよく使う検索方法

🗂ファイル名を指定して検索したい時

filename:file_name
ex.) filename:composer.json

 

🍙言語を指定して検索したい時

language:LANGUAGE
ex.) language:php

 

🔎ざっくりいろんな検索をしたいとき

https://grep.app/search

↑のサイトは、外部ライブラリを使っていて具体的な使い方を知りたくて他の人どうやって使ってるんだろ🤔って思った時によく使っています。

GitHubの検索より使いやすくて、目的のものを見つけれる気がします。

 

 

 

GASのconsole.logとLogger.logの違いって何だ?

 

GoogleAppScript(GAS)のconsole.logとLogger.logの違いを検証します!

エディターから実行した時

→ 特に違いは分かりませんでした 🤔

 

トリガーで実行した時

→ Cloud のログを見るとログレベルに違いがありました

console.log→デバック(DEBUG)、Logger.log→情報(INFO)

 

リファレンスで比較

▷Class Logger

https://developers.google.com/apps-script/reference/base/logger#log(Object)

Logger.getLog()で今までのログを取得できる!!!(clearもできる)

(ログレベルはINFO)

 

▷Class console

https://developers.google.com/apps-script/reference/base/console

ログレベルを使い分けれる!!!(日本語なのチョットキモイ)
– 🔴ERROR(エラー)     : console.error()
– 🟠WARNING(警告)  : console.warn()
– INFO(情報)                : console.info()
– DEBUG(情報)            : console.log()

console.info()とconsole.log()は違いがわからない🤔

 

 

【超小ネタ】CircleCIへのssh接続にハマった

 

GitHubのCIにCircleCIを使っていて、途中でjobが失敗した時CIの中身見たくてsshで接続したくなりますよね💡
例えば、「ディレクトリ配置うまくいってるかなー」「このパッケージちゃんとインストールされてるかな」とか… 🤔

その時、わたしがハマったポイントとしては、、、

\ ssh接続に使うid_rsaはGitHubのもの /

ということでした!

 

1.Rerun Job with SSHする

 

2. 出力されたIPにssh接続する 👈ここでハマった

↑に表記されている通り$ ssh -p 64535 [IP]とするとpermission deniedになってしまい、ssh接続できずハマっていました。

$ ssh -p 64536 [IP]
The authenticity of host '[IP]:64536 ([IP]:64536)' can't be established.
ED25519 key fingerprint is SHA256:xxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[IP]:64536' (ED25519) to the list of known hosts.
user@[IP]: Permission denied (publickey).

 

私のローカルでは、GitHubのid_rsaを~/.ssh/id_rsa_githubに置いてます。
そのため-i ~/.ssh/id_rsa_githubで指定してあげるのが正解でした😇

ssh -i ~/.ssh/id_rsa_github -p [発行されたport] [発行されたip]

 

Use the same SSH public key that you use for your VCS-provider (e.g., GitHub).
と親切に説明してくれてるのを、素直に受け止めればこんなことにはならなかったでしょう…

 

普段Symfony書いているPHPerがLaravel入門してみた

 

お久しぶりです!年末年始にゆる〜くLaravelを触ってみました。
普段はSymfonyを書いているので、比較してみました。

間違っていることや補足コメントくれると嬉しいです!!

https://github.com/kin29/example-laravel-app

migrationファイル

  • Laravel: SQLではない。
  • Symfony: SQL。

コマンド

  • Laravel: php artisan ~
  • Symfony: php bin/console ~
    個人的にartisanっていう単語がなかなか覚えられない🤯

ルーティング

  • Laravel: routes/以下にルーティング定義をする。これによりControllerを作成しなくともルーティング設定ができる。

ref: https://readouble.com/laravel/8.x/ja/routing.html

  • Symfony: Controllerに直接ルーティング定義ができる。yamlによるルーティング定義もできる。

ref: https://symfony.com/doc/current/routing.html

PHPStormのコード補完

フォームリクエスト

  • Laravel: FormRequestを作る(Illuminate\Foundation\Http\FormRequestをextends)
$ php artisan make:request StorePostRequest

実際のdiff: https://github.com/kin29/example-laravel-app/commit/b50df00ccd299284c9207be38c03ebe7ac38914e

  • Symfony: FormTypeを作る(Symfony\Component\Form\AbstractTypeをextends)
$ bin/console make:form

データと移入

  • Laravel: seederというアプリケーション実行に必要なデータを投入できる。factoryでも大量のデータ投入ができる
$ php artisan make:seeder UserSeeder
$ php artisan make:factory PostFactory

ORM

  • Laravel: Eloquentモデル(Eloquent ORM)
$ php artisan make:model Flight //model作成
  • Symfony: Entity(Doctrine ORM)
$ bin/console make:entity //Entity作成

 

ぺチコン2021レポート〜1日目〜

 

今年もぺチコンに参加させてもらいました!(オンライン)
オンラインなので👶がいる私には参加しやすかったです〜
YouTubeでアーカイブも残ってるのもありがたいです!何度も見直しますね(きっと)

今回初めてDiscordも活用させていただきました。リアルタイムでいろんな達人の方々が補足してくれるのでめちゃくちゃ勉強になりました!!!
また、会社のスポンサーツアーにもちょこっと出させてもらいました〜🙌

\ ぺチコン2021のタイムテーブルはこちら /
https://fortee.jp/phpcon-2021/timetable

コロナと落ち着いたら、またオフラインで参加したいです🥺
\ 過去のぺチコンレポートをどうぞ /
https://kin29.info/tag/phpcon/

気になったトークのメモ

🟡PHPにおけるコーディング規約と自動整形

コーディング規約の重要性を再確認させてもらいました。

php-cs-fixerとphp_codesnifferの違いについての理解は曖昧だったので、Discord上での解説もあり超納得でした!

php-cs-fixer → 書式しか見ないが全てを自動修正できる

php_codesniffer → 構造も見るのでeraly exitとかも違反にできるが、全ては自動修正できないより厳しくできる

🟡独自フレームワークPHPアプリケーションの改善戦略

auto_prepend_fileっていう設定ができるの初知りでした!auto_prepend_fileについて別記事書いたので良かったらみてください。

PHPのauto-prepend-fileを設定して、symfony/var-dumperを使ってみる

🟡PHPer が知るべき MySQL クエリチューニング

SQL苦手系PHPerなのでめちゃくちゃ勉強になりました。EXPLAINの見方はよく知らなかったので、わかりやすい説明で大変理解できました!

会社の技術ブログで実際に手を動かしてEXPLAIN使って見たレポを書いたので良かったら見てください。
https://tech.quartetcom.co.jp/2021/10/07/phpcon-2021-report/

🟡PHPで学ぶオブジェクト指向プログラミング入門

いい声なので動画貼っておきます。https://youtu.be/gdCE-UGqeSM?t=18952
変数名、関数名だけでも抽象化は表現できる!
複雑さ=条件分岐 → わかりやすくする=条件分岐を減らす
異なるものを同じように扱う事=ポリモーフィズム
JankenGameのコードはdisplayLangResolverを追加したい!って思ってしまいました。
Smalltalkっていう言語のOOP流派もある(←普段使わない方)
ポリモーフィズムは3つある。サブタイプポリモーフィズム/パラメトリックポリモーフィズム/アドホックポリモーフィズム
いつも通り、成瀬さんの説明はめちゃくちゃわかりやすいです。DDDの本読みました!
「OOPって何?なんでいいの?」って聞かれたらおすすめしたいトークです。

🟡ドメインをモデリングして PHP コードに落とし込む

新原さんも声もいい☺️https://youtu.be/gdCE-UGqeSM?t=23609
例題のドメインがワクチン接種なのが現代的!でコードも見れてわかりやすかった!

モデリング→複数の視点(俯瞰でみるかその中の要素でみるか)、手法で徐々に形にしていく
– ユースケース図 …システム化の範囲、ユーザが見えてくる
– 用語集の作成(ちょっと面倒) …項目は用語/英語表記/内容。英語表記があることでコード上での表記ゆれを防ぐ。解釈のずれがなくなるのでおすすめとのこと。
– 概念モデル図 …クラス図。多重度がわかる。用語を適当にばーっと並べて線で結ぶことからはじめて、徐々にブラッシュアップしていく感じ。
UML図ちゃんとは書いたことない。。。💦

ドメインモデル実装
– 1ドメイン = 1クラス
– POPO(Plain Old PHP Odject)、プレーンなPHPで作成
– クラス名やメソッド名にドメインモデル用語を使う
– setterを作らない方が良い …ドメインロジックによってプロパティ値を変更する

日本語クラスは作ったことないのでやってみたい!PHPStormはバリバリ対応してるらしい。

モデリングしてコードを実装することで理解が深まる、コードを書いてて気づくことが多いのはめちゃわかる!
→モデリングの一環としてコードを書くことと、結構良い!テストで実行検証できるのも良い🙆‍♀️

ステータスの状態遷移図もあると便利。
Enumは型としても使える、日本語も使える!
まずは、用語集→ユースケース図が良さそう、用語集でドメイン知識の認識を合わせることが重要💡
図やドキュメントのメンテは? → Wikiレベルで良い、とりあえずあれば嬉しい。

何度も見返したいトークでした!!!🙇‍♂️

🟡【IMO】コードレビューって難しいよね

IMO=in my option 私の意見では
わたしもレビューされる方が好きです。
レビューしてもらうとその分学びが増える感じが好きです。
pullpanda使ったことないので、使って見たいと思いました!
https://pullpanda.com/

さいごに

二日目レポートも書きます!(きっと)

PHPのauto-prepend-fileを設定して、symfony/var-dumperを使ってみる

 

ぺチコン2021を見ていて、初めて知ったビルドインのオプションを知りました!
\ auto-prepend-fileです! /
今回はそれを使って開発を便利にしていきたいと思いますー🙋‍♂️

教えてくださったスライドはこちらです、ありがとうございます!
https://speakerdeck.com/tzmfreedom/original-framework-php-kaizen?slide=22

簡単にできる事を説明すると、独自関数などを定義したファイルをスクリプト実行前に読み込ませることができます!
それにより、デバック関数を独自に作成して、それをスクリプト内に仕込んでデバックするみたいなことができて便利みたいです。

auto-prepend-fileとは?

https://www.php.net/manual/ja/ini.core.php#ini.auto-prepend-file

auto_prepend_file string
メインファイルの前に自動的に付加されるファイルの名前を指定します。 このファイルは、require 関数のコール時と同様に読み込まれます。 このため、include_path が使用されます。
特別な値 none を指定すると、ファイルを前に追加する機能は無効となります。

逆に、auto_append_fileというのもあるみたいです。

🚨注意

auto-prepend-fileauto_append_fileもexit();が使われるようなスクリプトでは、使用できないとのことです。私はここの中身みたいなーって時は、var_dump($hoge);exit();としちゃってたので注意しないとでした。そういうときはdd($hoge);を使うといいみたいですね。

symfony/var-dumperが使えるようにauto-prepend-fileに追加してみる

Symfonyの公式にも掲載されていました!
https://symfony.com/doc/current/components/var_dumper.html#the-dump-function

In order to have the dump() function always available when running any PHP code, you can install it globally on your computer:

  1. Run composer global require symfony/var-dumper;
  2. Add auto_prepend_file = ${HOME}/.composer/vendor/autoload.php to your php.ini file;
  3. From time to time, run composer global update symfony/var-dumper to have the latest bug fixes.

 

1.composer global require symfony/var-dumper;

PHP8.0.3でやっていきます。

$ php --version
PHP 8.0.3 (cli) (built: May 27 2021 13:40:53) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies
    with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans


$ composer global require symfony/var-dumper;
Changed current directory to /Users/shigaayano/.composer
Using version ^5.3 for symfony/var-dumper
./composer.json has been created
Running composer update symfony/var-dumper
Loading composer repositories with package information
Updating dependencies
Lock file operations: 3 installs, 0 updates, 0 removals
  - Locking symfony/polyfill-mbstring (v1.23.1)
  - Locking symfony/polyfill-php80 (v1.23.1)
  - Locking symfony/var-dumper (v5.3.8)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 3 updates, 31 removals
  - Removing symfony/stopwatch (v5.1.2)
  - Removing symfony/service-contracts (v1.1.5)
  - Removing symfony/process (v5.1.2)
  - Removing symfony/polyfill-php73 (v1.11.0)
...

2.php.iniにauto_prepend_file = ${HOME}/.composer/vendor/autoload.phpを追加

php -r "echo phpinfo();" | grep "php.ini"でphp.iniの場所を確認して、最終行とかに追記します。

ちゃんと適用されてるか心配だったので、確認して見ます。
設定されてるみたいです。

php -r "echo phpinfo();" | grep "auto_prepend_file"
auto_prepend_file => /Users/xxx/.composer/vendor/autoload.php => /Users/xxx/.composer/vendor/autoload.php

3.実際に使ってみる

まず、dd($hoge);を使って見ます。
今回、コントローラ内でdd($form)でFormの中身を見たかったのですが、dump後にexitされるためdumpが出力された後はレスポンスも表示されません。

次に、dump($hoge);を使って見ます。
exitされないため、レスポンスがいつも通り表示されてSymfony Profiler > Debugからdumpを確認できます。

 

プロジェクト内のコードを変更せず使えますし、便利なので今後も開発で是非使っていこうと思います🙌!

参考:
https://zenn.dev/kitar/articles/790933413a3090116be8

Constructor property promotionを使ってみる!(PHP8から使えるやつ)

 

お久しぶりです…そろそろ更新頻度上げていきたいと思っております🙇‍♂️

今回はPHP8から使えるようになった、Constructor property promotionを使って見たので、差分と使って見た感想をまとめてみます。

Constructor property promotionとは?

https://www.php.net/releases/8.0/en.php#constructor-property-promotion

👆のPHP7→PHP8の差分を見ての通り、簡潔に言うとコンストラクタの引数にすべてを詰め込めます。コンストラクタの引数にプロパティ定義、初期値もかけちゃいます。

実際にDj-Kin29で適用した差分

詳細: https://github.com/kin29/dj-kin29/pull/34/files

before

class DefaultController extends AbstractController
{
    private AuthHandler $authHandler;
    private GetTopTrackService $getTopTrackService;
    private CreatePlaylistService $createPlaylistService;

    public function __construct(
        AuthHandler $authHandler,
        GetTopTrackService $getTopTrackService,
        CreatePlaylistService $createPlaylistService
    ) {
        $this->authHandler = $authHandler;
        $this->getTopTrackService = $getTopTrackService;
        $this->createPlaylistService = $createPlaylistService;
    }

after

class DefaultController extends AbstractController
{
    public function __construct(
        private AuthHandler $authHandler,
        private GetTopTrackService $getTopTrackService,
        private CreatePlaylistService $createPlaylistService
    ) {
    }

このコード見てて気づきましたが、AbstractControllerをextendsするのやめたいなーと思いました。

使って見た感想

👆のコードを見ての通り、6行もコードが減りました!!!スッキリさせたい私的には大変いい感じです。
慣れるまでは違和感がありましたが、実際に使ってみるとなんだかんだすぐ慣れそうな気がしました。
TypeScriptのコンストラクタの書き方と似てます 💡

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicudata.67.dylibのエラーでPHP7.4が突然使えなくなった話



ある日、突然MacでPHP7.4.9が使えなくなりました😭😭😭
結構ハマりましたが、お戻りになってきてくれました🙌

結論

icu4cが69.1にあがってしまっていた。
→ brewで67.1を入れ直して、シンボリックリンクを貼ればok

エラー内容

$ php --version
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicudata.67.dylib
Referenced from: /Users/user_xxx/.phpenv/versions/7.4.9/bin/php
Reason: image not found
Abort trap: 6

とりあえず/usr/local/opt/icu4c/lib/libicudata.67.dylibが本当にないのか、
/usr/local/opt/icu4c/lib/以下を確認。
→現在のシンボリックが69.1しかないので、67のシンボリックリンクを作りたい。。。🤤

$ ll /usr/local/opt/icu4c/lib/
total 137024
drwxr-xr-x 28 user_xxx staff 896 4 8 09:10 .
drwxr-xr-x 12 user_xxx staff 384 5 27 17:27 ..
drwxr-xr-x 6 user_xxx staff 192 4 8 09:10 icu
-r--r--r-- 1 user_xxx staff 28672096 5 27 16:15 libicudata.69.1.dylib
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.69.dylib -> libicudata.69.1.dylib
-r--r--r-- 1 user_xxx staff 28665232 4 8 09:10 libicudata.a
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.dylib -> libicudata.69.1.dylib
-rw-r--r-- 1 user_xxx staff 2726984 5 27 16:15 libicui18n.69.1.dylib
lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicui18n.69.dylib -> libicui18n.69.1.dylib
...

1.brewでicu4cの67をいれる。

brew tap-newとかbrew extractを使うやり方をしらなくてハマりました。

$ brew tap-new kin29/taps #「kin29」の部分はなんでもokです
Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/.git/
[main (root-commit) 58a4f09] Create kin29/taps tap
3 files changed, 88 insertions(+)
create mode 100644 .github/workflows/publish.yml
create mode 100644 .github/workflows/tests.yml
create mode 100644 README.md
==> Created kin29/taps
/usr/local/Homebrew/Library/Taps/kin29/homebrew-taps

When a pull request making changes to a formula (or formulae) becomes green
(all checks passed), then you can publish the built bottles.
To do so, label your PR as `pr-pull` and the workflow will be triggered.
$ brew extract icu4c kin29/taps --version 67
==> Searching repository history
==> Writing formula for icu4c from revision e2c833d to:
/usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/Formula/icu4c@67.rb
$ brew install kin29/taps/icu4c@67
==> Installing icu4c@67 from kin29/taps
==> Downloading https://github.com/unicode-org/icu/commit/715d254a02b0b22681cb6f861b0921ae668fa7d6.patch?full_index=1
Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/0dd175e315a7eee5f9fb42af4e03d2130e3a3aa130db4d2b32a58b1c88d87251--715d254a02b0b22681cb6f861b0921ae668fa7d6.patch
==> Downloading https://github.com/unicode-org/icu/releases/download/release-67-1/icu4c-67_1-src.tgz
Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/5652b331b5400231692d0879d41522870a20598d8771342b622d543c2ed99ca0--icu4c-67_1-src.tgz
==> Patching
==> Applying 715d254a02b0b22681cb6f861b0921ae668fa7d6.patch
patching file source/common/uassert.h
==> ./configure --prefix=/usr/local/Cellar/icu4c@67/67.1 --disable-samples --disable-tests --enable-static --with-library-bits=64
==> make
==> make install
==> Caveats
icu4c@67 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides libicucore.dylib (but nothing else).

If you need to have icu4c@67 first in your PATH, run:
echo 'export PATH="/usr/local/opt/icu4c@67/bin:$PATH"' >> /Users/user_xxx/.bash_profile
echo 'export PATH="/usr/local/opt/icu4c@67/sbin:$PATH"' >> /Users/user_xxx/.bash_profile

For compilers to find icu4c@67 you may need to set:
export LDFLAGS="-L/usr/local/opt/icu4c@67/lib"
export CPPFLAGS="-I/usr/local/opt/icu4c@67/include"

For pkg-config to find icu4c@67 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/icu4c@67/lib/pkgconfig"

==> Summary
🍺 /usr/local/Cellar/icu4c@67/67.1: 258 files, 71.8MB, built in 4 minutes 47 seconds

icu4c@67がインストールされたことを確認!

$ ll /usr/local/Cellar/ | grep icu
drwxr-xr-x 4 user_xxx staff 128 5 27 16:15 icu4c
drwxr-xr-x 3 user_xxx admin 96 5 29 18:04 icu4c@67
$ ll /usr/local/opt/ | grep icu4c
lrwxr-xr-x 1 user_xxx admin 20 5 27 16:15 icu4c -> ../Cellar/icu4c/69.1
lrwxr-xr-x 1 user_xxx admin 23 5 29 18:09 icu4c@67 -> ../Cellar/icu4c@67/67.1 #今回追加分

2.シンボリックリンクを貼る⚠️

ln -s [パス] [リンク名]です。私はパスとリンク名の指定が逆と勘違いしていて、ハマりました💦
(間違えたらunlink [リンク名]で削除できます。)

$ cd /usr/local/opt/icu4c/lib/
$ ln -s ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib libicuio.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib libicui18n.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib libicuuc.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib libicudata.67.dylib
$ ln -s ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib libicutest.67.dylib
$ ln -s ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib libicutu.67.dylib

シンボリックリンクが貼れていることを確認します。

$ ll /usr/local/opt/icu4c/lib/ | grep 67.dy
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:11 libicudata.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicui18n.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 48 5 29 22:08 libicuio.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicutest.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 46 5 29 22:09 libicutu.67.dylib -> ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib
lrwxr-xr-x 1 user_xxx staff 48 5 29 22:09 libicuuc.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib

 

PHP7.4お戻りになってくれたー😭😭😭ありがとう🎊

php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

 

助けてくれてありがとうございました🙇‍♂️
ref: https://www.tohuandkonsome.site/entry/2021/05/21/173612