- 1. エラー: Array callback must have exactly two elements
- 2. なでしこ3はPythonより6.5倍速い!ベンチマークしてみました
- 3. 外部サービスからのイベントを受け取るよ(後編)、”RemoveEvent”
- 4. PHP ぼやき日記 2023-12-15
- 5. Twigで日付を計算する方法
- 6. 外部サービスからのイベントを受け取るよ(前編)、”Webhook”
- 7. React + PHPでreCAPTCHAv3を使いつつメールを送信するサンプル
- 8. PHPでOpenTelemetryを使ってトレースを収集する
- 9. PHPのマルチバイト関数で文字エンコーディング指定について
- 10. NFT関連の自動テストのアーキテクチャ
- 11. 【WordPress】ACFのDate Time Pickerを使って期間限定コンテンツを出す
- 12. 文字コードを理解する旅に行ってきました!(PHP/Shift_JIS/Windows-31J/UTF-8)
- 13. 指定した間隔で繰り返しジョブ実行、”Scheduler”
- 14. PHP ぼやき日記 2023-12-13
- 15. GitHub ActionsでPHPのCI環境作る(15分で)
- 16. サービスのセッションを切らさずにDockerコンテナを立ち上げ直す方法
- 17. PHP-MAMP(パッケージソフトウェア)
- 18. PHPでサポートされている文字エンコーディングについて
- 19. 【覚書き】PHPフレームワーク「Flow」におけるインターフェースをDIしたときの挙動について
- 20. タイムアウトが頻発して泣きを見た話
エラー: Array callback must have exactly two elements
このエラーが出たら、こんなミスをしているかもしれません。
![ero.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309843/c9454c7e-5c97-d7ca-1ee4-7a1aa320bbc0.jpeg)PHPは、echoの行でエラーが出て止まっていますが、
array_key_existsを使っていますから、$customerRanksは、キーをもつ配列なのです。配列から値を取り出すには、[]を使わないといけません。ただそれだけの、書きミスという事です。
“` membership.php
if(is_numeric($parameters[‘rank’]) && array_key_exists($parameters[‘rank’], $customerRanks))
echo “会員ステータス:”.$customerRanks($parameters[‘rank’]);
endif
“`これは
“`
$customerRanks($parameters[‘
なでしこ3はPythonより6.5倍速い!ベンチマークしてみました
なでしこの実行速度が話題になっていたので、久々に、手元にあるMacbook Pro(m1)でベンチマークしてみました。なでしこ3のPC版(Node.js版)と各種スクリプト言語を比較してみましょう。
# 再帰処理フィボナッチ勝負
まずはフィボナッチで試してみましょう。
## なでしこ3
なでしこ3.4.24で試してみました。
“`nadesiko:fib.nako3
●FIB(Nの)
もし、N<2ならばNで戻る。 ((N-1)のFIB)+((N-2)のFIB)で戻る。 ここまで。 (40のFIB)を表示。 ``` 実行してみると、下記のように4秒かかりました。 ``` time cnako3 fib.nako3 102334155 cnako3 fib.nako3 3.94s user 0.05s system 98% cpu 4.078 total ``` ## Python3 次に、Python 3.9.7で試してみます。速度には影響しないものの、タイプヒントも付けてみました。 ```python:fib.py def fib(n:int) -> in
外部サービスからのイベントを受け取るよ(後編)、”RemoveEvent”
[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の16日目の記事です。
## 外部サービスからのイベントを受け取るよ、”RemoteEvent”
[RemoteEvent](https://github.com/symfony/webhook)は、外部サービスからのイベントを『リモートからのイベント』とみなし、イベントを発火させるコンポーネントです。
### インストール
“`
composer require symfony/remote-event
“`### 使い方
Symfonyの偉い人は考えました。『Webhookって要はリモートからのイベントじゃん。』
webhookでSymfonyにアクセスされた時、それを`RemoteEvent`に置き換えてイベント発火させ、処理を行います。処理の流れはこんな感じです。1. 外部サービスのwebhookを解析する`RequestParser`を作る
1. 解析したリクエ
PHP ぼやき日記 2023-12-15
[前回](https://qiita.com/sj-i/items/ea5df5e11926406b56d1)
不定期に誰に向けるでもなく PHP に関する雑な殴り書きをしている。日付が変わってから変わる前の日付の奴だと言い張って投稿するくらいの雑さ加減。
# private class const あるから local const いらないんじゃない?って言われた
– https://phpc.social/@Crell/111574253159763975
– 俺もなんかそんな気もする
– あとなんかもう一人コメントくれた Russel のひとの[予見](https://phpc.social/@zimzat@mastodon.social/111574636631512790)が秀逸かつ辛辣で笑った
– いわく、「まず変数の使いまわしを防ぐよう皆デフォで使いはじめるよね」
– 「次は型宣言もつけようぜってなるよね、はい別 RFC」
– 「`$` が嫌いな連中も途中から気に入りはじめて、次の RFC は仮引数に定数を使えるようにする奴だろうね」
Twigで日付を計算する方法
## 概要
LaravelやPHPでTwigテンプレートを使用した際に、テンプレート内で日付の計算(加算、減算)をする方法## 使用方法
– `date_modify`フィルターを使用する
– `day`は日付型の値が代入されている変数
– `day`を基準日として加減算を行う
“`.twig
{#日加算#}
{{ day|date_modify(“+1 day”)|date(“m/d/Y”) }}{#日減算#}
{{ day|date_modify(“-1 day”)|date(“m/d/Y”) }}{#月加算#}
{{ day|date_modify(“+1 month”)|date(“m/d/Y”) }}{#月減算#}
{{ day|date_modify(“-1 month”)|date(“m/d/Y”) }}{#年加算#}
{{ day|date_modify(“+1 year”)|date(“m/d/Y”) }}{#年減算#}
{{ day|date_modify(“-1 year”)|date(“m/d/Y”) }}“`
### 応
外部サービスからのイベントを受け取るよ(前編)、”Webhook”
[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の15日目の記事です。
## 外部サービスからのイベントを受け取るよ、”Webhook”
[Webhook](https://github.com/symfony/webhook)は、外部サービスからのイベントをWebhookで受け取るコンポーネントです。
### インストール
“`shell
composer require symfony/webhook
“`### 使い方
メールサービスなどのSaaSなサービスは、サービス内で起こったイベントをきっかけに設定したWebhookを呼び出す機能があったりします。通常であれば、その受け取るWebhookを実装していくのですが、Webhookコンポーネントを使えば簡単に実装できます。
まず、Webhookを受け取った際の処理を行うConsumerを作っていきます。`ConsumerInterface`を実装します。
“`p
React + PHPでreCAPTCHAv3を使いつつメールを送信するサンプル
## 事前準備
– reCAPTCHAのサイト登録をしておく → https://www.google.com/recaptcha/admin
– 発行されたサイトキーとシークレットキーをメモ## フロント
– `react-google-recaptcha-v3`を入れて、`GoogleReCaptchaProvider`で囲っておく
– サイトキーは環境変数から読み込む
“`tsx
{props.children}
“`
– reCAPTCHAを使いたいところで ↓ の処理を行う“`typescript:Component.tsx
const { executeRecaptcha } = useGoogleReCaptcha();
…
const onClick = () => {
if (execute
PHPでOpenTelemetryを使ってトレースを収集する
こんにちは!
12月に入ると楽しいイベントが目白押しですね。クリスマスがやって来たと思ったらすぐ冬休みに入って、大晦日にお正月。遊びに行くも良し、家でゆっくり過ごすも良し、人それぞれ楽しみ方があると思います。しかし、そういった時期でもシステムが上手く動いてくれないとおちおち休んでいられません。普段からシステムの信頼性を高め、障害時にはすぐに復旧できる状態にしておくことが重要です。
ここでは、PHPでOpenTelemetryを使ってトレースを収集し、Google CloudのCloud Traceで可視化するまでの一連の流れをやってみます。
トレースとは何かについては、[以前書いたこちらの記事](https://qiita.com/atsu_kg/items/c3ee8141e4638957a947)の「分散トレースの重要性」「トレースの構成要素」のセクションを参照ください。
# 前提
PHP8.1
[open-telemetry/opentelemetry](https://packagist.org/packages/open-telemetry/opentelemetr
PHPのマルチバイト関数で文字エンコーディング指定について
# 概要
PHPのマルチバイト関数の引数として文字エンコーディング名を指定する際は、実際の文字エンコーディング名以外も指定することができます。
その際の挙動や指定方法についてまとめようと思います。> ※PHP8.2時点での仕様となります。
# 文字エンコーディング名の指定の種類
`mb_convert_encoding`のような文字エンコーディングを変換数関数ではfromとtoがあり、それぞれ指定できるものが異なります。
– fromとして指定できる文字エンコーディング名
– サポートされる文字エンコーディング名
– サポートされる文字エンコーディングのエイリアス名> ※ 未指定は不可
– toとして指定できる文字エンコーディング名
– サポートされる文字エンコーディング名
– サポートされる文字エンコーディングのエイリアス名
– 未指定(`null`も含む)
– `auto`> ※`auto`は複数エンコーディングを指定できる関数に限る
– その他
– `pass`## サポートされる文字エンコーディング名を指定
サポー
NFT関連の自動テストのアーキテクチャ
# STYLYとNFT
もう去年の話になりますが、2022年10月15日にSTYLYではNFT関連の機能が実装され、OpenSeaを介して、XR作品の取引が出来るようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/7989996a-6a3d-b185-68e2-adde3a87cea2.png)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/ef588a7f-735a-67f4-dc08-b0906b8a89e5.png)](https://vimeo.com/758951801)
現在、NFTとして出品する機能は提供されていませんが、MetaMaskと連携を行い、Ethereumのwalletと連携する機能があります。これによりSTYLYのXR作品のNFTのコレクションを表示できます。
![image.png](https://qii
【WordPress】ACFのDate Time Pickerを使って期間限定コンテンツを出す
期間限定でバナー画像を出すようなお仕事があったので作業メモ
# やること
ACF(Advanced Custom Fields)のDate Time Pickerを使って、WordPressの管理画面から開始日時と終了日時を設定し、その期間だけコンテンツを表示するようなものを作ります。
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/91f74470-f13e-7782-bece-ae4bdc4848ff.gif)# ACFで新規フィールドを作成して以下のように設定
![img1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288781/af966b9f-e645-d18a-d761-b8c6080c47c0.jpeg)フィールドラベルを`開始日時`
フィールド名を`start_date_time`
としました。フィールドタイプは`Date Time Picker`
カ
文字コードを理解する旅に行ってきました!(PHP/Shift_JIS/Windows-31J/UTF-8)
## はじめに
[MetapsAdventCalendar2023](https://qiita.com/advent-calendar/2023/metaps) 14日目の記事です🏃♂️
文字コード初心者が文字コードについて調べた記事になります。
(※主にShift_JIS,Windows-31J,UTF-8を少々)前半は、「文字コードとはなんぞや」から始まり、気になる用語を調べてまとめてみました。
後半は、Shift_JIS, Windows-31J, UTF-8の符号をPHPで出す方法と、
SJIS, Windows-31J, UTF-8の符号を出して、SJIS系なら2バイト文字をPHPで大雑把に分類してみるということをやってみました。本記事で利用したプログラムのGithubのリンクも記載しています。## 環境
・PHP: 8.1.25
・macOS: Sonoma 14.1.1
・iTerm2: Build 3.4.22## 文字コードを理解する上で役立った動画
下記動画は、なぜ「Unicodeが誕生したのか」及び、「Shift_JISでなぜ符号化する必要があ
指定した間隔で繰り返しジョブ実行、”Scheduler”
[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の14日目の記事です。
## 指定した間隔で繰り返しジョブ実行、”Scheduler”
[Scheduler](https://symfony.com/blog/new-in-symfony-6-3-scheduler-component)は、事前に指定したスケジュールでジョブを実行するコンポーネントです。
### インストール
“`shell
composer require symfony/scheduler
“`### 使い方
スケジュールに合わせてジョブを実行するには3つ必要になります。
– 送信する`Message`
– `Message`をハンドリングする`MessageHandler`
– スケジュールの設定をする`ScheduleProvider`Message, MessageHandlerの詳細については去年の[Messenger](https://
PHP ぼやき日記 2023-12-13
– [次回](https://qiita.com/sj-i/items/76ade0490d6c991871f5)
– [前回](https://qiita.com/sj-i/items/db793e09de33dd5e804d)不定期に誰に向けるでもなく PHP に関する雑な殴り書きをしている。日付が変わってから 13 日の奴だと言い張って投稿するくらいの雑さ加減。
# nielsdos のひとが FFI 周りをわりと見ている
– [この 1 年ちょいほどの間でめちゃくちゃコミット入れてる](https://github.com/php/php-src/graphs/contributors?from=2021-10-18&to=2023-12-13&type=c) [nielsdos のひと](https://github.com/nielsdos)が最近わりと FFI まわりも見ている
– https://github.com/php/php-src/pull/12916
– https://github.com/php/php-src/pull/12915
GitHub ActionsでPHPのCI環境作る(15分で)
# これは何?
GitHub Actionsを使ったPHPのCI環境のセット(静的解析テスト ⇒ ユニットテスト ⇒ E2Eテスト)を、できるだけ最小構成で作っていきます。
### 前提
– Docker
– 手元にDocker環境入っていない人は先に[インストール](https://www.docker.com/products/docker-desktop/)しておいてください
– node >= v20
– 自分は普段[Volta](https://volta.sh/)使ってますが何でもいいです### レシピ
1. DockerでPHPの環境作る(3分)
1. テスト対象の機能と画面作る(2分)
1. PHPStanで静的解析の設定(1分)
1. PHPUnitでユニットテストコード用意(2分)
1. PlaywrightでE2Eテストコード用意(3分)
1. GitHub Actionsでテスト実行(4分)
1. ブランチの保護(+α)それではやっていきましょう。
# 1. DockerでPHP環境作る(3分)
“`./docker-comp
サービスのセッションを切らさずにDockerコンテナを立ち上げ直す方法
EC2上にdockerでサービスを動かしていて、docker imageの中にソースコードを埋め込んでデプロイしていました。
その際に、デプロイ時にセッションが切れてしい毎回ログアウトされる問題があったので改善するようにしました。
言語はPHPを使っています。## 解決方法
解決方法としては、EC2のローカル上にセッションを保存してdockerのbuild時にマウントさせることで解決しました。
セッションを保存したいローカルのディレクトリを `/var/sessions` 、マウント先のdockerコンテナのディレクトリはデフォルトでセッションが保存される `var/lib/php/sessions` とします。予めローカルに`/var/sessions`ディレクトリを作ります。
“`
$mkdir /var/sessions
“`
次にdocker-compose.ymlファイルにマウントを書きます。
“`:docker-compose.yml
volumes:
– /var/sessions:/var/lib/php/sessions
“`
こうすることで
PHP-MAMP(パッケージソフトウェア)
MAMPでサーバー構築、種類別の特徴について。
・MAMP(Mac、Apache、MySQL、PHP):
対象プラットフォーム: 主にMac OSに対応しています。
コンポーネント:
Apache: ウェブサーバー
MySQL: データベースサーバー
PHP: サーバーサイドスクリプト言語・XAMPP(クロスプラットフォーム、Apache、MySQL、PHP、Perl):
対象プラットフォーム: クロスプラットフォームで、Windows、Mac、Linuxなど、複数のオペレーティングシステムで利用可能です。
コンポーネント:
Apache: ウェブサーバー
MySQL: データベースサーバー
PHP: サーバーサイドスクリプト言語
Perl: 汎用のスクリプト言語・LAMP(Linux、Apache、MySQL、PHP/Python/Perl):
対象プラットフォーム: 主にLinuxに対応していますが、他のプラットフォームでも構築可能です。
コンポーネント:
Apache: ウェブサーバー
MySQL: データベースサーバー
PHP/Python/Perl: サーバーサイド
PHPでサポートされている文字エンコーディングについて
# 概要
PHPでサポートされている文字エンコーディングについてまとめていこうと思います。
> ※PHP8.2時点での仕様となります。
# サポートされる文字エンコーディングについて
[サポートされる文字エンコーディング](https://www.php.net/manual/ja/mbstring.supported-encodings.php) で一覧を確認できますが、エイリアスも存在するためマニュアルでは一覧で確認することができないです。
下記の関数を組み合わせると一覧を確認することができます。
– [mb_list_encodings](https://www.php.net/manual/ja/function.mb-list-encodings.php)
– [mb_encoding_aliases](https://www.php.net/manual/ja/function.mb-encoding-aliases.php)## 非推奨となった文字エンコーディング
PHP8.2以降では「`QPrint`, `Base64`, `Uuencode`, `H
【覚書き】PHPフレームワーク「Flow」におけるインターフェースをDIしたときの挙動について
# 初めに
最近PHPのマイナーフレームワークFlowを触っているのですが、インターフェースをDIしたときの挙動について気になることがありました。
いろいろ調べてみたので分かったことをアウトプットします。# DIしたインターフェースのメソッドを呼び出すとどうなる?
Flowのソースを見てると、以下のようにDIしたインターフェースのメソッドを呼び出すような処理がありました。
“`php
class Hoge {
/**
* @Flow\Inject
* @var \Neos\Welcome\Service\Interface\FugaInterface
*/
protected $fugaInterface;public function hogeMethod()
{
$this->fugaInterface->fugaMethod()
}
}
“`最終的に“`fugaMethod()“`を呼び出していますが、“`$fugaInterface“`はインターフェースのため
タイムアウトが頻発して泣きを見た話
こんにちは。[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 13日目担当の[@cy-seiyan](https://qiita.com/cy-seiyan)と申します。
12日目は[@cy-naull](https://qiita.com/cy-naull)さんによる「[面倒な手作業をPythonに任せる](https://qiita.com/cy-naull/private/e693fcd53a835c247fa9)」でした。
自動化、本当に大切ですね。全て自動化してしまえば手作業で行ってた時間を別の事に使えますしメチャクチャ捗りますね。## 自己紹介
私は2018年にサイバードに入社をし、主にイケメンシリーズのサーバサイドエンジニアとして活動をしております。直近ではイケメンシリーズの1タイトルでサーバサイドだけでなく入社以前より業務経験を積みたかったUnityを使用したクライアントサイドも担当し某スポーツ選手の如く二刀流のエンジニアを目指しイケメンシリーズを支えております。