【個人メモ】ツール、設定、技術サイト

# 【参考サイト】
■整形ツール
[WebToolBox（SQL、Json整形）](https://web-toolbox.dev/tools/sql-formatter
)

■変数名
[codic](https://codic.jp/engine)
[プログラミングの変数・メソッドの命名でよく使う英単語まとめ](https://arakan-pgm-ai.hatenablog.com/entry/2019/04/15/000000)

■判定
[PHP isset, empty, is_null の違い早見表](https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62)

■演算子
[PHPの演算子一覧：種類や使い方を解説（php8対応）](https://tagnote.net/php/language-operators-php/)

■[APIテスター](https://chromewebstore.google.com/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)

■[API Dog](https://apidog.com/jp/)

■[FireShot](https://chromewebstore.google.com/detail/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-firesh/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja
)

# 【Laravel保存処理】
■isDirty():データが更新されたかどうか確認
https://minory.org/laravel-isdirty-getdirty.html

■touch():モデルで更新日（updated_at）のみ変更する
https://pgmemo.tokyo/data/archives/1311.html

■save():更新データとの差分を見て更新するか決めてる

■update():更新データとの差分を見てないで更新

この時、もし$request->nameが既存データと同じデータだとしたら
save()
updated_atのカラムが更新されない

update()
updated_atのカラムが更新される
https://qiita.com/gomaaa/items/91e5cbd319279a2db6ec


■insertGetId()
テーブルにinsertしたデータのIDなどを取得する方法
https://goldenshield.hatenablog.com/entry/2018/10/21/154125

■updateOrCreate()
updateOrCreateメソッドを利用して登録・更新ロジックを共通化
https://zenn.dev/naonao70/articles/48d75bf2cc793e

■Pivotクラス(中間テーブルのモデル)
https://qiita.com/kkznch/items/72ff650737eff863e4d9

■Pivot中間テーブルに保存する方法【attach・sync・detach】
https://biz.addisteria.com/pivot_attach/




# 【DB関係】
■SQLのWHERE 1=1と WHERE 1=0
https://blog.hitsujin.jp/entry/2020/02/14/210000
※初期表示の時に、検索表示したくない時に1=0を使う。

■WITH句(副問い合わせ（サブクエリ）に名前を付けれる機能。
一時テーブルみたいなもの)
https://zukucode.com/2017/09/sql-with.html

■SQLトリガー
https://qiita.com/wanko5296/items/fa3620c48196acbd3ab6

■シーケンス
https://qiita.com/5zm/items/da82cec73e097d2a97d0

```sql
例)SELECT setval('シーケンス名', (SELECT MAX(id) FROM 対象テーブル))
```

■SQLの「EXISTS」（存在判定/相関副問合せ）
「EXISTS」とは、先ほども言いましたが「サブクエリ」を扱う仕組みです。そしてそのサブクエリは「SELECT文で取得した情報を、他のSELECTやUPDATE処理で使用すること」を指します。
https://itsakura.com/sql-exists

■CASCADE: 親テーブルの行を削除または更新し、子テーブル内の一致する行を自動的に削除または更新します。
[Laravelの外部キー制約でCASCADEを設定するときに使える新しいメソッド](https://qiita.com/aminevsky/items/0cd41d86f61b01ef8141)

■リストア：DBのデータを復元、修復、ダンプ：DBからデータを出力
→検証環境のDBをダンプして、ローカルのDBにリストアする

■DBのViewについて
SQLで利用されるビューは、「仮想テーブル」と考えてもらえば良いかと思います。
ユーザーが必要な部分だけを抜粋したり、各テーブルからユーザーがデータを参照しやすいように加工したビューを作成することが出来ます。

実体としてのデータは存在しませんが、ユーザーからはテーブル操作を行うのと同じ感覚で参照することが可能です。
→ビューの実体は「SELECT文」です。
https://style.potepan.com/articles/25504.html

■UNION(結果の結合：レコードの結合)
https://medium-company.com/sql-union/

■LEFT(文字列の切り取り)
https://sql55.com/t-sql/sql-server-built-in-string-function-1.php

■SQLでの変数名の使い方
http://www.code-magagine.com/?p=3092

■【MySQL】GROUP_CONCAT()を使ってみる
カラム名を文字列として、連結できる
https://www.softel.co.jp/blogs/tech/archives/3154

■MYSQLで「テキスト数字」を正しくソートできるようにする
https://office-obata.com/report/memorandum/post-5311/

■DBの実行履歴(実行中クエリの確認)
show processlist;

※kill プロセスID でクエリを強制終了できます。
https://www.wakuwakubank.com/posts/344-mysql-kill-query/

■INFULL関数
MySQLのIFNULL関数は、NULL値を他の文言に置き換えられる関数
https://style.potepan.com/articles/18643.html

```sql
SELECT IFNULL(カラム名, '置き換える値') FROM テーブル名;
```


■ROW_NUMBER関数
https://style.potepan.com/articles/23566.html#SQLROW_NUMBER

SELECT文の結果セットに対して、１〜の連番を振るための関数
```sql
ROW_NUMBER() OVER ( [ PARTITION BY [パーティションカラム], [パーティションカラム], ...] ORDER BY [ソートカラム], [ソートカラム], ... )
```

・パーティションカラム (PARTITION BY)
指定した場合は、結果セットをパーティションカラムで分割し、パーティション毎に１〜の連番を振ります。
パーティションカラムを指定しない場合、結果セット全体で１〜の連番を振ります。

・ソートカラム (ORDER BY)
パーティション内の行に連番を振る順序を指定します。ソートカラムの指定は必須で省略できません。

■CASE文
https://techplay.jp/column/1733

```sql
CASE 列名
    WHEN 値1 THEN 結果1
    WHEN 値2 THEN 結果2
    ...
    ELSE デフォルト結果
END
```

■MySQL の LPAD() 関数の使い方
```sql
LPAD(文字列, 長さ, 埋める文字)
LPAD(@str, 10, '0')
```

■COALESCE関数
指定したカラムがNULLだった場合にNULL値を指定した別の値に置き換えてくれる関数
https://programmingnote.jp/archives/1434
```sql
SELECT 
  id
  ,name
  ,price
  ,COALESCE(quantity,0) AS quantity 
FROM 
  purchase ;
```

◼️SQLチューニング
①駆動表を小さくする
②結合途中のデータの塊の範囲を小さくする（1回広げて条件を絞るのはNG）
③無駄な結合を省く
④インデックスが貼っている順にWhere、Order Byを指定
⑤検索インデックスがかかっていない箇所を見つけ対応


SQLで駆動表を小さくするためには、いくつかの方法があります。

__1. 必要なカラムだけを選択する__
必要なカラムだけを選択することで、駆動表のサイズを減らすことができます。不要なカラムを含めると、データ量が増え、パフォーマンスが低下します。
    ```sql
    SELECT column1, column2
    FROM table_name
    WHERE conditions;
    ```

__2. WHERE句を使ってデータを絞り込む__
WHERE句を使用して、必要なデータだけを抽出します。これにより、駆動表のサイズを減らすことができます。
```sql
SELECT column1, column2
FROM table_name
WHERE condition;
```

__3. JOIN句を適切に使う__
必要なデータを取得するために、JOIN句を適切に使用します。不要なテーブルを結合しないように気をつけます。


__4. インデックスを使用する__
インデックスを使用すると、クエリの実行速度が向上し、駆動表のサイズも減らすことができます。インデックスを作成する際には、頻繁にフィルタリングやソートに使用されるカラムに対してインデックスを設定します。


__5. サブクエリを使う__
サブクエリを使用して、一部のデータを事前にフィルタリングし、その結果をメインクエリで使用することで、駆動表のサイズを減らすことができます。
```sql
SELECT *
FROM (SELECT column1, column2 FROM table_name WHERE condition) subquery
WHERE additional_condition;
```

__6. 結合の順序を最適化する__
複数のテーブルを結合する際には、結合の順序を最適化することが重要です。一般的には、データ量が少ないテーブルを先に結合し、その後に大きなテーブルを結合することが推奨されます。


# 【Vscodeのプラグイン、設定】
■Trailing Spaces
テキスト内や文末にある、不要と思われる半角スペースに色をつけてくれる拡張機能です。

■空白文字(タブ、スペース)のエディター上での表示方法に関する設定
https://www.javadrive.jp/vscode/setting/index8.html

■タブキーを押したときにスペースに変換するのかに関する設定
https://www.javadrive.jp/vscode/setting/index9.html

■Better Comments（コメントをデコレーション）

■indent-rainbow（インデントの色付け）

■Japanese Language Pack for Visual Studio Code（Visual Studio Codeを日本語化する）
https://www.javadrive.jp/vscode/install/index4.html

■EvilInspector（テキスト内にある全角スペースを強調表示してくれる拡張機能）

■Git Graph（リポジトリのツリーをグラフィカルに表示）

■Todo Tree

■PHP Debug
※設定：【Laravel×Docker】XdebugでLaravelコンテナをデバッグ実行する方法
https://hiro8blog.com/how-to-debug-laravel-container-by-xdebug/#st-toc-h-6

※launch.jsonの設定

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            }
        }
    ]
}
```

■PHP Intelephense（PHPのコード補完やらコードチェック）
https://yama-itech.net/visual-studio-code-recommend-setting-php

※以下でエラー表示設定を行う
[VSCode拡張機能Intelephenseの更新によるUndefined type 'Route'(他クラス)のエラー](
https://qiita.com/AkiYanagimoto/items/047c3492749a407c2ace)

■PHP DocBlocker（Docコメントの入力を補完）
■php cs fixer（ファイルの保存時にPHPのファイルのフォーマット）
https://qiita.com/cflat0528/items/08814378a5cf0d0c107d

■Laravel Extension Pack
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245522/e27e1dc4-4ed5-9776-3264-59599d41141b.png)


# 【Cursor設定】
<Corsorの設定>
・ショートカット
command ＋　Shft ＋　L
command ＋　Shft ＋　K
→通常通りに修正


・カラー設定
https://qiita.com/miriwo/items/54fae5131dac2b9f640d

・使い方
https://zenn.dev/umi_mori/books/ai-code-editor-cursor/viewer/install

・Cursor・VSCodeショートカット集
https://zenn.dev/motonosuke/articles/548beaa830287c

.cursorrules
https://note.com/toki_mwc/n/n960a23b3c3de

・プロダクト開発に必要なもの全部繋げたらCursorが最強のプロダクトマネージャーになった
https://note.com/guchey/n/n773a2efd78cf

# 【Mac設定】
<初期設定>
・キーボードのcommand、Controlキーの反転
・CapsLockをかな英字の切り替え
・ディスプレイ ホットコーナーのショートカット
・マウスの速度
・Docの位置
・辞書の登録
・隠しフォルダの表示
・右クリック時：Vscodeで開く、新規ファイルを作成のショートカット作成
https://qiita.com/hiroyuki7/items/a3fcdf943c313473ecee
→ショートカットでCursorを開く

<アプリ>
・画面メモ：スティッキーズ

・クリップボード：Clipy

・画面分割のアプリ：ReacAngle

・圧縮アプリ：Keka

・スクリーンショット：LightShot

・KeyCluCask（チートシート）
https://50it.jeez.jp/archives/1528#toc3

・差分確認MAC(Macのマージツール)：CompareMerge
https://qiita.com/Labi/items/e35b944bd98c12e2050d

・ショートカット変更：Karabiner-Elements
https://qiita.com/TSY0SEC/items/fff6d9b0768882355493

・ターミナル： Warp
使い方
https://qiita.com/shun_sakamoto/items/a0c79083c97064a361f2

・SourceTree
http://sourcetreeapp.com/

・Sequel Ace
https://sequel-ace.com/

・2023年版 優良ツールまとめ　エンジニア
https://qiita.com/kokiiii/items/7d634e3c3b6c096a492b#hyperswitch--alttab



# 【Windowsツール】
TortoiseGit
サクラエディタ
WinMerge 
TeraTerm
7ZIP
A5:SQL Mk-2
heidisql
DBeaver
Eclipse（JAVA開発）
Cassava Editor（CSVエディター）
TresGrep （grepツール）



■APIの設定するときに考慮すべき点
①ログイン認証方法
・sunctamでは、「API認証」、「SAP認証」か
　・フロント側の設定あり
　　・「API認証」：ヘッダーにトークン
　　・「SPA認証」：セッションIDやCSRFトークン設定
　・バックエンド側の設定あり
　　・ミドルウェア、CORS、フロントとAPI側のドメインの確認
　　・デバッグ時の認証解除方法
　　・サーバーエラー時にレスポンス設定（デバッグ時のみエラートレースの返却）

②ディレクトリ構造の合わせ
・MVC ＋　サービス層　＋　リポジトリ層
・定数管理
・ベースファイルの作成（コントローラ、モデルなどの各クラスファイル）

③ルーティングの設定
・URIに合わせてルーティングはResourceファサード使うか？

④排他制御
・楽観ロック、悲観ロックどちらで行うか？
　・楽観ロック
　　・更新日時カラム、更新カウントカラムどちらか？
　　・フロント側：ヘッダーに読み込み設定？リクエストに含めるか？
　　・バックエンド：どこでバリデーション行うか？
　
　・悲観ロック
　　・占有ロック：競合が多発するとき使用、処理中のトランザクションが終わったら実行、レコードにアクセスできない、ロックがかかったままならバッチ定期実行でDB側のタスクKILLが必要（何秒経過しているかみる）
　　・共有ロック：競合があまり発生しないとき使用、エラーを返す
　　　・占有ロックの場合：トランザクションが終わるまで（コミット、ロールバック）参照できない。
　　　・共有ロック：他画面でレコードが参照できる