PHP関連のことを調べてみた2022年12月11日

PHP関連のことを調べてみた2022年12月11日

for文の追加によってテスト環境が停止しかけた話【PHP】

# 0.はじめに
SaaSの開発・保守運用をしています。
今日は、**たった数行の改修**で、大規模サービスのテスト環境が全て停止しかけた話をします。

# 1.経緯

PHPで書かれたシステムの改修時に発生した問題になります。

“`php
for ($i = 0; $i <= $num; $i++) { // ~~~数百行に渡る処理 } ``` 上記のような処理があり、`$num`にはユーザーが任意で入力した1~100の値が入ります。 この処理の内部を改修する事になりました。 ```php for ($i = 0; $i <= $num; $i++) { // ~~~数百行に渡る処理 for ($i = 0; $i <= 3; $i++) { // ~~~簡単な処理 } // ~~~数百行に渡る処理(PDOを介したデータベースへのインサート処理) } ``` 大雑把な内容はこのような改修になります。 この時点で何が起きるかは分かると思いますが、外側のループ変数に使われる`$i`は、内部ループに入った時にリセット

元記事を表示

徳丸本の Docker 実習環境を M1/M2 Mac で1から構築した

先日、徳丸本(正式名称: [安全なWebアプリケーションの作り方 第2版](https://www.amazon.co.jp/dp/4797393165/))の[実習環境 Docker 対応バージョンが公開](https://wasbook.org/)されました。

こちら、M1/M2 Mac にも対応したものになっています。

リリース内容を確認してみましたが、既存の部分からの変更点のみの環境構築となっています。
ということで、さっそく1から新規で M1 Mac 環境に構築した方法の記録です。

## 前提条件

初心者向けではありません。
ある程度の知識がある方向けに、簡略化して記載しています。

Homebrew などを使い、できる限りコマンドで構築します。
~~いちいちスクショを貼るのがめんどくさいので。~~
`brew –version` などで、 `brew` コマンド実行できるか確認しておきましょう。

“`zsh
user@MMacBook-Air ~ % brew –version

Homebrew 3.6.14-73-g11cdffb
Homebrew/ho

元記事を表示

新入社員向け技術研修でテストの講義・ハンズオンを行いました

## はじめに

弊社では、今年度からエンジニア職の新入社員向けの技術研修を
社員が講師となり、講義・ハンズオンを行うという取り組みがあり、
その際に私はソフトウェアテストについて、講義・ハンズオンを担当しましたので
それについて簡単にご紹介できればと思います。

https://tech.excite.co.jp/entry/2022/06/17/124710

資料とハンズオンのリポジトリは公開していますので、
興味のある方は是非ご覧ください。

資料: https://speakerdeck.com/excitejp/2022nian-du-xin-zu-ji-shu-yan-xiu-sohutoueatesuto-jiang-yi
ハンズオン: https://github.com/keijiro-okamura/unittest-handson-2022

## 全体の流れ
当日は講義10分、ハンズオン80分くらいの配分で行いました。
今回はハンズオンでのユニットテストを触ってもらう事と、実際に実務で使えるテクニックの体験
をしてもらいたかったので、座学はかなり少なめな配分と

元記事を表示

PHP Enum(列挙型)基礎 対話編

# Enum(列挙型)とは?

*[PHP: 列挙型の概要 – Manual](https://www.php.net/manual/ja/language.enumerations.overview.php)*
> 列挙型(Enumerations) または Enum を使うと、 開発者は取りうる値を限定した独自の型を定義できます。 これによって、”不正な状態を表現できなくなる” ので、 ドメインモデルを定義する時に特に役立ちます。

# つまり、どう使う?

– システム開発会社A社では、血液型占いのWebアプリを開発する事となった。
– A社での実績が多いことから、言語にはPHP、フレームワークにはLaravelが選択された。
– このWebアプリの会員登録部分の実装を、「後輩エンジニアくん」が担当することとなった。
– ユーザーは、会員登録の際、血液型を登録する。

先輩エンジニアくん(先)「進捗いかが?」
後輩エンジニアくん(後)「なんとなく実装のイメージはついてるんですが、方式で迷っている部分がありまして…」

先「どこ?」
後「血液型の部分はラジオボタンなのですが、選択肢

元記事を表示

Symfony Formを利用したフォームの作成について解説

[Symfony Advent Calendar 2022](https://qiita.com/advent-calendar/2022/symfony) 13日目の記事です✨
昨日は @77web さんの「Symfony World 2022 Winter day2参加レポ」でした!

今回は前回書いた記事「[Symfony Formを利用したフォームの作成について解説](https://qiita.com/mako5656/items/85b18f8e8fb8cb622f2b)」のフォーム箇所に絞って詳しく解説していきます!

## 前回の振り返り

①プロジェクトの作成

“` zsh
$ composer create-project symfony/website-skeleton hello-symfony6
“`

②フォームに必要な3つのファイル作成

– src > Controller > HelloController.php
– template > hello > index.html.twig
– src > Entity > Person.php

元記事を表示

APCuのTTLの仕様を深堀り

本記事は、[サムザップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sumzap) の12/11の記事です。

APCuは、PHP用のインメモリのkey-valueストアです。
主にキャッシュ用に使われ、キャッシュ期間を指定するためのTTL(Time to Live)、つまりデータの保存期間を決めることが出来ます。
今回はこのTTLについて、実装を見ながら細かい仕様を探ります。

## 結論
TTLの期限切れには2種類ある。
– エントリーTTLに基づくハードな期限切れ
– グローバルTTLに基づくソフトな期限切れ

ハードに期限の切れたデータは、データにアクセスすると消えたものとして扱われる。
ソフトに期限の切れたデータは、データにアクセスはできるが、いつでも消え得る。

ただし、どのデータもメモリを掃除するキッカケが無ければ、メモリに居座り続ける。


まずは、TTLと期限切れの概念について確認します。

## 2種類のTTL

APCuには2種類のTTLが存在します。

– [`php.ini`

元記事を表示

サクッとメールを送る、”Mailer”

[Symfony Component Advent Calendar 2022](https://qiita.com/advent-calendar/2022/symfony-component)の11日目の記事です。

## 最初に
[Symfony](https://symfony.com)はPHPのフレームワークのひとつです。しかし、公式サイトの説明文には

> Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)

と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、S

元記事を表示

大規模レガシーアプリにPHPStanを適用する時のTIPS

この記事は[ラクスAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus) 11日目の記事です。

最近、業務でPHPStanの導入を検討しており、まだ途中経過ですが、躓きや期待できそうな点などを書いておきます。

# PHPStanとは
PHPの静的解析ツールで近年人気のツールです。
PHPStanの詳細については世の中にたくさん情報があるのでここでは割愛しますが、かいつまんで特徴を言うと下記のような感じです。

– [解析レベル(0~9)](https://phpstan.org/user-guide/rule-levels)を設定でき、徐々に厳しく設定することができる
– [解析時に無視するエラーの定義ファイル(baseline)](https://phpstan.org/user-guide/baseline)を作成できる
– 一部動的に解析を行うため、PHPをコードとして解釈した上で問題となる箇所も指摘する
– [カスタムで解析ルール](https://phpstan.org/config-refe

元記事を表示

「商大タクシー」というタクシー相乗り募集サービスを作った話

## はじめに
はじめまして!文系からバックエンドエンジニアを目指して就職活動中のYuです。
今回、「商大タクシー」というWebアプリを作成したので紹介したいと思います!
URL貼っておくので良かったら覗いてみてください!!技術面でのアドバイス等ありましたら教えていただけると嬉しいです。
[商大タクシー](https://shodaitaxi.space)
## どんなサービスか?
### 概要
小樽商科大学の学生向けのタクシー相乗り募集サービスです。駅から大学まで一緒にタクシーに乗るメンバーを簡単に見つけることができます!

### なぜ作ったのか?
小樽商科大学には、見ず知らずの学生同士がタクシーに一緒に乗って大学へ向かうというタクシー相乗り文化がありました。(参考記事:https://www.chukei-news.co.jp/news/2019/05/20/OK0001905200f01_05/ )しかしコロナ禍で授業が完全オンラインとなったことで、この文化は途絶え、対面授業になった現在も多くの学生がタクシーではなく満員のバスで登校するようになってしまいました。このタクシー相乗

元記事を表示

DoctrineとEloquent比較大全10: 複雑な条件での絞り込み(2) QueryBuilder

day10の今日は、LIKE, IN, IS NULLを使った複雑な条件での絞り込みのやり方を見ていきます。

## Doctrine

“`php
getRepository(Book::class)
->createQueryBuilder(‘b’);
$exprHelper1 = $qb1->expr();
/** @var array $book

元記事を表示

歴史あるPHPプロダクトで少しでも開発を楽にしたい

## はじめに

古いPHPで書かれた古いプロダクトの保守をしているといろいろと大変なことがあります。
例えば、メソッドや変数に型情報がないためコードを読んだり書いたりするのにも以下のようなことから一苦労です。

– コード補完がきかない
– コードジャンプもきかない

少しだけ手間をかけることで、ちょっとでもコードを読み解きやすくしたいと思います。

## 環境

ご長寿

– PHP 5.3
– Symfony 1.4
– Doctrine 1.2
– PhpStorm

PhpStorm は素の状態です

## PHPDoc を書く

### PHPDoc とは

https://www.phpdoc.org/

簡単に言うと、メソッドやクラスなどに定義上明記されていない情報を特別な記法でコメントに書くことで IDE などが解析しやすくするものです。
機械が解析できるようにすることで、ドキュメントを自動生成できるようになります。

この記事では変数の型やその説明が書ける、と理解してもらえれば良いです。

実際に書いてみましょう。

### メソッドに書く場合

メソッド

元記事を表示

Traitって何よ!

:::note
この記事は、OPENLOGIアドベントカレンダー2022 10日目の記事です。
:::

## はじめに

rikutoです!
1年ほど前に、エンジニアにキャリアチェンジすると同時にオープンロジにジョインしました。

普段は主にPHPを使っているのですが、今回は僕が抱いたTraitに関する疑問を記事にしてみました。

## Traitの存在意義がわからん

PHPにはTraitという機能があります。
よく見る説明でもありますが、簡単にいえばクラスの一部分を部品にしてコピペできる機能です。

めちゃ簡単な例を考えます。
ボタンを押すと数字が1増えていく、カウンターを模したクラスをつくってみます。

“`php:AddCountTrait
trait AddCountTrait
{
public function addOne(): void
{
$this->count += 1;
}
}
“`

“`php:Counter
class Counter
{
use AddCountTrait;

public

元記事を表示

Laravel(APIモード)のControllerからModelのメソッドを呼び出したい

今までクエリをControllerに直接記述していましたが、Modelに移行することにしました。
Controllerでは極力指令を送るだけにして、可読性を上げることが目的です。

## 目次
– 現在の実装
– 実装したいこと
– ControllerからModelのメソッドを呼び出す方法(実装)←ここに結論あります
– 解説

それではやっていきます!
## 現在の実装
– ユーザーテーブル(`User`)
– お知らせテーブル(`Notificaton`)
– 既読管理の中間テーブル(`NotificationUser`)
が今回の主役です。
現在、ログイン時にお知らせを表示しており、表示した中に次回以降表示しないボタンを設置しています。
チェックして閉じると、中間テーブルにリクエストがPOSTされます。
次回お知らせを表示する際には、**NotificaitonControllerにクエリビルダを直接記述し**、表示制御を行っています。ここを改善するのが今回のテーマです。
※今回は中間テーブルを作成するための`migration`や`Model`の記述内容は割愛させていただきま

元記事を表示

読書ログアプリケーションの作成(独学エンジニア レッスン6より)

# 目標
今回やること
* Webアプリケーションを作成する

タスクばらし
* 必須知識
* 設計・テーブル作成
* [登録ページ] HTMLで表示する
* [登録ページ] 読書ログを登録する
* [登録ページ] CSSでスタイルを整える
* [トップページ] HTMLで表示する
* [トップページ] 読書ログの一覧を表示する
* [トップページ] CSSでスタイルを整える

# 必須知識
目的
* PHPで開発するにあたって必須な知識を学ぶ

開発の基本順序
* 設計→テーブル作成→HTML→ロジック処理→CSS

Composer
* 現状の課題
機密データがソースコードにベタ書き
ソースコードを誰かに見られたら機密データが漏洩し、データが流出する

* 解決策
ライブラリを使用して、機密データを別途管理できる仕組みを入れよう

* ライブラリ
使いたい部品が入っている道具箱
特定の機能を提供するコードをひとまと

Laravelでphp artisan系コマンドを実行すると、「Could not open input file」と表示される。

php artisan系コマンドを実行した際に、「Could not open input file」と表示された際は、
自分のLaravelプロジェクトディレクトリ配下に移動していないことが原因と考えられます。

なのでcdコマンドで移動してから、再度php artisan系コマンドを実行してみて下さい。

PHP Unix タイムスタンプを取得する

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の10日目の記事です
:::

# 概要

– PHPにて現在時刻のUnixタイムスタンプを取得する方法をまとめる。

# 方法

– 組み込み関数の`microtime()`を使う。
– 下記の様に記載すると完全な実行時のUnixタイムスタンプを返す。

“`php
microtime();
“`

– 当該関数に特に引数を渡さないと下記の様にmsecとsecの値が返される。secは1970年1月1日の0時00分00秒からの経過秒数、msecは更に細かいマイクロ秒部分を表しているらしい。
– デフォルトだと`msec sec`と返されてしまい、マイクロ秒も含むUnixタイムスタンプ値を取得したいときは戻り値の2つを連結する手間などがある。
– そんな時は引数にtrueを与えよう。`sec.msec`のように値を連結し、少数点の値でタイムスタンプを取得する事ができる

座標と向きについて

# 前書き
https://github.com/pmmp/PocketMine-MP

PocketMine-MPというオープンソースソフトウェアを用いるとプラグインという形でModのようなものが開発・導入できるようになり、それを用いた画期的なサーバーやプラグインが今、世界中に転がっています。そんなプラグインは、プレイヤーの動きを制御したり、オリジナルなMobを製作したりと、多種多様です。
今回はそのなかでもプレイヤーの動きを制御する座標関係の面にフォーカスして書き綴っていきます。

:::note warn
ここから先はPocketMine-MPのAPIの関数などを出しつつ解説していきます。
:::

 
# 前提事項の確認
Minecraftの世界では三次元空間が用意されており、その空間内でプレイヤーが移動したりしています。
首の向きや角度は $x-z$ 及び $xz-y$ 平面に落とし込んだ際の極座標として考えられます。
## X, Y, Z
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws

ミノ駆動本を読んで、保守しやすい成長し続けるコードを書ける自分になる。 – 第1章 悪しき構造の弊害を知覚する

# はじめに

現在、 **[#ミノ駆動本](https://twitter.com/hashtag/%E3%83%9F%E3%83%8E%E9%A7%86%E5%8B%95%E6%9C%AC?src=hashtag_click)** こと **『良いコード/悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方』** を読み進めています。

https://gihyo.jp/book/2022/978-4-297-12783-1

今回は、 **「第1章 悪しき構造の弊害を知覚する」** を読んで学んだ内容について記事にします。
第1章でまずは悪い例を知りましょう、という位置付けの章です。

ただ読むだけでなく、以前取り組んでいたブラックジャックのソースコードを練習の舞台(良い具合に修正が必要なコードに仕上がっているはず…)として、ミノ駆動本で学んだ内容を元にチェック、修正するというアウトプットをしていこうと思っています。

https://qiita.com/ryamate/items/f77efb0888bb025e5f5b

ブラックジャックの PHP で書いたソー

よく使うクラスをサクッと作成、”Maker Bundle”

[Symfony Component Advent Calendar 2022](https://qiita.com/advent-calendar/2022/symfony-component)の10日目の記事です。

## 最初に
[Symfony](https://symfony.com)はPHPのフレームワークのひとつです。しかし、公式サイトの説明文には

> Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)

と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、S

サービスをAzureからGCPに移行した話

:::note info
“[ゆるWeb勉強会@札幌 Advent Calendar 2022](https://adventar.org/calendars/7513)” 9日目の記事です。
:::

# サービス移行の経緯

[2022年11月28日をもってPHP7.4がEOL](https://www.php.net/supported-versions.php)となりました。さらに以降のPHP8からはWindowsでのサポートがされないようになりました。

Azure App Service(Windows)でもPHP7.4以降のランタイムは選択できず、さらにAzureはEOLとなったバージョンを積極的に廃止しているので、サービスがダウンしないように対応する必要がありました。

ここでGoogle Cloud Platform(以後 GCP)に移行することになったのは、かねてからAzureのオートスケールの速度に不満があり、社内で「Google App Engine(以後 GAE)の方が速い」という実績があったので、GCPに移行を目指すことになりました。

ちなみにその時の私は