- 1. 【PHP】西暦から和暦・和暦から西暦を算出する
- 2. 【攻略】ServBayでわずか3分でWeb開発環境を構築
- 3. 入力フォームの整数判定【PHP】
- 4. 線形探索法(リニアサーチ)
- 5. HEIC(HEIF)画像をJPEGに一括変換する
- 6. 非JS系フロントエンド環境でのパフォーマンス改善
- 7. 【PHP】西暦から干支・干支から西暦を算出する
- 8. 自動テストの更新日時を現在日時にするな学園
- 9. トラブル対応メモ:PHP画面から外部サーバへのファイル転送不良
- 10. PHP開発者が必要とする8つの必須ツール
- 11. 【PHP8.4】ついにPHPにプロパティフックが導入される
- 12. phpでJSONを生成してjsに渡す時の注意点
- 13. 今日の学び #1 2024-05-20
- 14. 最大値を探すアルゴリズム
- 15. 初心者向け!PHPを用いたWebアプリケーション作成(環境構築編)
- 16. Nextcloud に 私の顔認証モデルがテスト採用された
- 17. ChatGPTのAPIを使用して会話をする(React、PHP)
- 18. WordPressで検索結果から固定ページを除外する方法
- 19. メールヘッダーインジェクション
- 20. PHP 8.4の新機能の見通し
【PHP】西暦から和暦・和暦から西暦を算出する
[西暦から干支・干支から西暦を算出する](https://qiita.com/Kokusui/items/79da562e4e979aea1825 “西暦から干支・干支から西暦を算出する”)に続き暦ネタ。
#### 西暦→和暦
“`sei2wa.php
function sei2wa(string $datestr = NULL) {
//datestrで与えられた年月日(の属する暦年)の和暦年を返す ただし明治元年以降
//datestrを年だけにした場合はその年の1月1日の和暦を算出
//datestrが空欄の場合は今日の和暦
//datestrが日付として正しくない場合はNULLを返す
if ($datestr) {
$datestr = mb_convert_kana($datestr, ‘n’);
if (is_numeric($datestr)
&& preg_match(‘/^[12][089]\d{2}$/’, $datestr)
&& intval($datestr) >= 1868
&& intval($datestr) < 2
【攻略】ServBayでわずか3分でWeb開発環境を構築
> ServBayは、統合されたユーザーフレンドリーなローカライズされた[Web開発環境](https://www.servbay.com)を提供します。ServBayを使用すると、開発者は数分でローカル開発環境をセットアップできます。これは、PHPやNode.jsのようなインストールとメンテナンスの問題に効果的に対処し、テストエンジニアや小規模チームにとっても便利です。さらに、迅速な環境アップグレードと継続的なメンテナンスも可能にします。
このガイドは、ServBayのセットアッププロセスを簡単に理解できるように設計されています。初心者でも複雑さに悩むことなく、スムーズで簡単にServBayをデプロイできるようにします。
### 準備
まず、ServBayをダウンロードしてインストールする必要があります。ダウンロードする前に、システムが以下の要件を満たしていることを確認してください:
– オペレーティングシステム: macOS 12.0 Monterey以上
– プロセッサ: IntelまたはApple Silicon (M1/M2/M3) チップ
– ストレージ: 10GB以
入力フォームの整数判定【PHP】
# はじめに
bdrccです。
ポートフォリオに掲載する、PHPの制作物を作っています。
今回の記事は、フォームに入力された内容で四苦八苦した経緯を書いていきます。# 整数がほしい
パスワードの桁数と個数をフォームに入力し、PHPで実行することで、英数字から作成されたパスワードを、複数個自動生成するWebアプリを作成しています。
数字入力の枠のエラー対応を行いました。### 入力されていない 場合
-> HTML の inputタグに `required` を追加して対応
### 数値ではない または 負の数 の場合
-> PHP の `is_numeric(入力内容)` で判定可能ここまでは順調でした。
問題はここからです。桁数を6〜10、個数を1〜10としていたのですが、範囲内小数の場合、小数部分を切り上げて自動判断していました・・・。
# 対応
1.`is_int()` を使用
->文字列扱いで認識され、正しい自然数でも作動せず
2.`is_numeric() and \\$x==intval($x)` を使用
->無事、範囲内
線形探索法(リニアサーチ)
## はじめに
線形探索法についてまとめる
### 線形探索法(リニアサーチ)とは
先頭から順番に調べて探す探索アルゴリズム。
リニアとは一直線という意味。探索が片方からもう片方へ一直線に進んでいくイメージ。
検索エンジンで使われている。
探索効率はそれほど良くない。### 例
#### 対象データと探す値
以下の配列から5という整数データが入っているかを探す。
“`php
$array = [4, 2, 3, 5, 1];
“`#### フローチャート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/f0c94493-f474-1758-4309-abafc92af027.png)
HEIC(HEIF)画像をJPEGに一括変換する
# はじめに
iOS(11以降)では写真を撮影したときに、特に設定をしていなければHEIFと呼ばれる方式で画像を保存します。拡張子はHEICです。この方式は高画質かつファイルサイズが小さいので便利そうなのですが、Apple系のOS以外ではまだサポートが充実していません。今回はHEIC画像を一括(バッチ)でJPEGに変換する方法をいくつか試してみます。# Windows版ImageMagickを使う
ImageMagickは様々なフォーマットに対応したツールで、最近HEICを読み込めるようになりました。Windowsバッチで次のように書くと、batファイルを設置した場所と同じ階層のHEICファイルを全てJEPGに変換できます。PATHを通すことができない場合はImageMagickの場所をフルパスで書くことで実行できます。“`bat
for %%f in (*.HEIC) do (
start convert.exe “%%~nf”.HEIC “%%~nf”.JPEG
)
“`
この例はマルチプロセスで、処理するファイル数と同じ数のプロセスが実行されま
非JS系フロントエンド環境でのパフォーマンス改善
様々な制約により、ReactやVue、SvelteのようなナウいJS系フレームワーク(or ライブラリ)の導入が難しい場面があります。しかし、そういった状況であっても、サーバーサイドだけではなく、フロントエンドでのパフォーマンス改善を求められることもまたあります。奇縁により、私はそういった仕事が多く、知見が溜まってきたので皆さんにシェアしたいと思います。
## ルール1:自前のCSSは書かない、読み込ませない
BEMやFLOCSSのようなルールでなるべくCSSファイルを簡素化させたとしても、「CSSを書かない」より軽くなることはありません。
### じゃあスタイリングはどうしたらいい?
– 高速CDNで配布されているCSSフレームワークを使いましょう。ただし、React前提だよねみたいなCSSフレームワークが多いのでそのあたりのリサーチは入念に。自分はBootstrapを使っています。イケてるとは思わないですが、汎用性も高く、また読み込みパフォーマンスも及第点なので選んでいる感じです。
– それでも足りない場合はstyleタグを用いましょう。CSS in JSの展開後のイメ
【PHP】西暦から干支・干支から西暦を算出する
小ネタ。
PHPで西暦から十二支を出す必要があったので、ついでに十干十二支(干支=えと)を出す関数を作ってみた。#### 西暦→干支
“`getEto.php
function getEto(int $yyyy = NULL, bool $with_jikkan = TRUE) {
// yyyyに西暦を入れるとその年の干支(十干十二支)を返す
// yyyyが空のときは今年の干支
// 第2引数を0にすると十二支のみ返す
$yyyy = $yyyy ?: date(“Y”);
if ($yyyy > 0) {
$jikkan = [
‘庚’,
‘辛’,
‘壬’,
‘癸’,
‘甲’,
‘乙’,
‘丙’,
‘丁’,
‘戊’,
‘己’,
];
$juunishi = [
‘申’,
‘酉’,
‘戌’,
‘亥’,
‘子’,
‘丑’,
‘寅’,
‘卯’,
‘辰’,
‘巳’,
‘午’,
‘未’,
];
return ($with_j
自動テストの更新日時を現在日時にするな学園
# 学園校歌
自動テストを行う際は~更新日時に気をつけよ~
更新日時は過去にせよ~現在日時とするなかれ~
現在日時にするならば~データ作ったら少し待て~
更新前後のテストデータが~別となるデータを持て~
あぁわれら~われらの学園~
自動テストの更新日時を現在日時にするな学園~# ここから真面目な話
## 先に結論
MySQLの仕様として「更新前後の値が全く同じデータは更新したものとして扱われない」というのがあるため、更新日時が現在だったり実際のデータをコピーしたりして、テスト前後のデータが同じになってしまう状況は作らないようにすべきである
## いきさつ
PHP(Laravel)で作成していたプロジェクトのテストがべらぼうに多かったため、自動テストで対応することにした
なんとか全て作成し、いざテストするぞというタイミングで、特定のテストだけ失敗するという結果になった
それ以外の類似テストは全て合格だし、何ならデバッグモードで実施しても問題なかった。だが、デバッグモードでのテストと自動テストで結果が変わってしまっては自動テストの信頼性が低くなってしまう
さすがにこのエラーのためだけに
トラブル対応メモ:PHP画面から外部サーバへのファイル転送不良
いつものように基本的知識の不足ゆえ、久々にドハマりしてしまったのでメモ。
### (前提) ###
+ やりたいこと:PHPプログラム(Web画面)からexec関数を実行し、SCPを使って外部サーバへファイルをリネームしながら転送
+ SCPの実行に当たっては、本来は公開鍵方式でやるべきだが、相手先サーバの事情によりパスワード認証方式で実行せねばならない。
⇒シェルのexpectコマンドを使ってSCPを実行し、疑似対話イメージでパスワードを指定することにした。
“` shell
expect -c ”
set timeout 30
spawn /usr/bin/scp (転送元ディレクトリ)/hoge.txt root@(転送先サーバ):(転送先ディレクトリ)/hogefuga.txt
expect default { exit 10 } \”root@(転送先サーバ)’s password: \” ; send \”(転送先サーバパスワード)\n\”
interact
”
“`
### (発生した事象) ###
+ PHPプログラムを実行したところ、転送先サーバにリネ
PHP開発者が必要とする8つの必須ツール
PHP開発者にとって、ツールの選択はワークフローと生産性に大きな影響を与えます。ここでは、経験豊富なPHP開発者が開発を簡素化し、コード品質を向上させるためによく使用する必須ツールを紹介します。
Codeium
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782463/ed0e4004-c8e3-3066-872b-fecd83d2a472.png)[Codeium](https://codeium.com/)は、革新的なAI駆動のコーディングアシスタントで、PHP開発者のゲームチェンジャーです。開発環境にシームレスに統合され、リアルタイムでコンテキストに応じたコードの提案を提供します。このツールはコーディングタスクを加速し、ベストプラクティスを維持し、効率的でエラーフリーなコードを確保します。さまざまなコードリポジトリから継続的に学習することで、PHPコーディングを最新かつ業界標準に準拠させます。生産性とコード品質の向上におけるその利点は、すべてのPHP開発者のツールキットに
【PHP8.4】ついにPHPにプロパティフックが導入される
プロパティフックとは何なのかというと、これです。
“`php
class HOGE{
public string $tel{
set{
if(!ctype_digit($value)){
throw new ValueError(“電話番号は数値のみ”);
}
if(strlen($value) < 10){ throw new ValueError("電話番号は10文字以上"); } $this->tel = $value;
}
get{
return ‘電話番号は’ . $this->tel;
}
}
}$hoge = new HOGE();
$hoge->tel = ‘123456789012’; // OK
$hoge->tel = ‘abcdefghijkl’; // Uncaught ValueError: 電話番号は数値のみ
$hoge->tel = ‘123’; // Uncaught ValueError: 電話番号は10文字以上echo $hoge->tel;
phpでJSONを生成してjsに渡す時の注意点
jsonを生成する時に単純に
“`php
$json = json_encode($str);
“`としていないだろうか。単なる数値だけならこれでよいが、例えば、
“`php
$str[1] = “G’men ’75”;
$str[2] = ‘\2,800’;
$str[3] = ‘my name is “john”‘;
“`というような文字列をエンコードしてjavascriptに渡すとエラーになる。
“`php
$json = json_encode($str, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS );
$json = str_replace(‘\\’, ‘\\\\’, $json);
“`とするのがよい。
今日の学び #1 2024-05-20
## Laravel
### `TrimgStrings`ミドルウェア
リクエストの内容(主にPOSTのbody)は、標準のMiddleware(`TrimgStrings`)内のtrim関数によってトリミングされている。
(知らなかったのが恥ずかしい…)https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php
### `TransformsRequest`
リクエスト内容を書き換えるためのクラスで、これを継承すれば多階層になっているjsonの中身も再帰的に走査できる。
`transform`メソッドだけ弄れば最小の実装で済む。
`TrimgStrings`もこれを継承している。https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php
## その他読んだ記事
h
最大値を探すアルゴリズム
## はじめに
最大値を探すアルゴリズムについてまとめる
### 対象データ
5つの整数が格納された配列を処理対象とする。
“`php:data.php
$array = [12, 13, 11, 14, 11];
“`### フローチャート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/c1485c9f-0902-e7be-a60a-dfbadec50269.png)
### 解説
①変数`max`を用意する。
②`array[0]`のデータを変数`max`に代入し、暫定の最大値とする。
③変数`max`と`array[1]`を比較する
④`array[1]`の方が大きければこちらが新最大値となる。
⑤`array[1]`が変数`max`より大きくない場合は変数`max`に格納された`array[0]`が最大値の座をキープする。
⑥以降は同じ手順で繰り返す。
⑦変数`max`を出力する。
初心者向け!PHPを用いたWebアプリケーション作成(環境構築編)
# はじめに
こんにちは!社会人一年目の石川です。
記事をご覧いただきありがとうございます。
私は現在、PHPを用いた研修でWebアプリケーションの作成へと進もうとしています。
そこでPHPで最も人気のあるフレームワークの一つであるLaravelを使ってみたい!と思ったので記事にしました。:::note warn
注意
この記事はWindowsユーザー向けです。
:::## 目次
1. XAMPP
* [XAMPPとは?](#xamppとは)
* [XAMPPのインストール手順](#xamppのインストール手順)
* [XAMPPの動作確認](#xamppの動作確認)
2. Composer
* [Composerとは?](#composerとは)
* [Composerのインストール手順](#composerのインストール手順)
* [Composerの動作確認](#composerの動作確認)
3. Laravel
* [Laravelとは?](#laravelとは)
* [Laravelのインス
Nextcloud に 私の顔認証モデルがテスト採用された
Nextcloud の顔認証アプリケーションで使用するモデルに私の Taguchi model がテスト採用されたようです。
![nextcloud-facerecognition.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785306/8a6e239e-8cfd-6b73-5114-7adcdd80f24d.jpeg)
## Nextcloud の概略
>Nextcloudは、オンラインストレージの作成と使用のためのクライアント・サーバ型のソフトウェアである。機能的にはDropboxに似ているが、オフプレミスのオンラインストレージサービスは提供しない。Nextcloudはフリーかつオープンソースなので、誰でも自分のプライベートサーバ(英語版)にインストールして利用することができる。
>Dropboxのようなプロプライエタリなサービスとは異なり、Nextcloudのようなオープンアーキテクチャではアプリケーションの形でサーバに機能を追加することができ、ユーザーがデータを完全に自身の制御下に置く
ChatGPTのAPIを使用して会話をする(React、PHP)
# はじめに
今回オリジナルプロダクトの機能の一つとして、ChatGPTから五つの質問をしてもらい、その回答をChatGPTが解析することで、現在の感情を数値化してもらう。
といった機能を作成したので、そのコードを見ながら、どのように実装したかを振り返ろうと思います。**注意**:
自分の復習と、これからAPIを使用したい人にわかりやすく伝えようとコードを載せましたが、このコードは実際に使用できてはいますが、まだデプロイもしていない段階なので、セキュリティの考慮などのリファクタリングがされていません。そのことを念頭に置いていただければ幸いです。
# 開発環境
– LaravelにViteを使用してフロントエンドはReact
– バックエンドはPHP
– Visual Studio Code使用# 準備
– [公式サイト](https://platform.openai.com/api-keys)を参考にしてアカウントとAPIキーを取得
– Laravelを作成して、.envファイルにAPIキーを環境変数として記述# コード
まず最初はReactのフロントエンドから説明
WordPressで検索結果から固定ページを除外する方法
WordPressで検索結果から固定ページを除外する方法について解説します。
## **functions.phpに記述するコード**
“`php
function my_posts_search($search, $wp_query) {if ($wp_query->is_search() && $wp_query->is_main_query() && !is_admin()) {
$search .= ” AND post_type = ‘post’ “;
}
return $search;
}
add_filter(‘posts_search’, ‘my_posts_search’, 10, 2);
“`## posts_searchフィルターフックについて
`posts_search`はWordPressの検索クエリのSQL WHERE句をカスタマイズするためのフィルターフックです。このフィルターを利用することで、デフォルトの検索機能を拡張し、特定の条件に基づいて検索結果を絞り込むことが可能になります。
`posts_search`フィルタ
メールヘッダーインジェクション
## はじめに
メールヘッダーインジェクションについてまとめる。
### メールヘッダーインジェクションとは
メールヘッダーに不正なヘッダー情報を混入させることで、スパムメールなどを送信させる攻撃のこと。
### 例
以下のようなコードがあったとして、
“`php:mail_send.php
mb_send_mail(‘test@example.com’, $_POST[‘subject’], $_POST[‘body’],
“From: {$_POST[‘from’]}”);
“``”From: {$_POST[‘from’]}”)`の箇所に以下のような値を渡した時、
“`
test@example.com
Bcc: injection@example.com
“`新たなBccヘッダーが認識されてしまう。
(入力値を介して、ユーザーが勝手に送付先を忍び込ませることができてしまう。)メールヘッダーインジェクションのあるサイトは、スパムメールの踏み台にされる。
### 対策
メールアドレスの妥当性を検証する。
「`/\A\w+([-+.]\w+)*
PHP 8.4の新機能の見通し
## PHP 8.4の新機能
PHP 8.4は2024年11月21日にリリースされる予定です。プロパティフック、JITの改善、追加の括弧なしでのメソッドチェーンが含まれます。これは大きな変更です!
### プロパティフックRFC
現代のPHPの歴史の中で最大の変更の一つ:プロパティフックを定義する機能。
“`php
class BookViewModel
{
public function __construct(
private array $authors,
) {}public string $credits {
get {
return implode(‘, ‘, array_map(
fn (Author $author) => $author->name,
$this->authors,
));
}
}public Author $mainAuthor {