OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのDBクラス

## PHPでDBクラスを作成
PHPを最近触れたばかりなので慣習とかは分かり兼ねるのですが、DB接続するためのクラスは情報が少なかったので作りました。
最低限のDBを操作するメソッドを用意してます。
また、PHPは基本MySQLを使うことが多いかと思いますが、インターフェースを用意してます。本記事はMySQLの使用例のみ掲載してます。（今後更新するかもしれません。）

## インターフェース作成
```php:Idb.php
<?php
interface Idb {
    public function fetchAll($sql,$param = []);

    public function fetch($sql,$param = []);

    public function execute($sql,$param = []);
}
?>
```

## DB実装クラス作成
require_onceで作成したインターフェースを読み込んでください。
ホスト名・ユーザ名・パスワードは自身の環境に応じて設定してください。

```php:MySql.php
<?php
require_once('./Idb.php'); // インターフェース"Idb.php"のパス

class MySql implements Idb
{
    private $DB_DATABASE = 'host_name'; // ホスト名（自身の環境）
    private $DB_USER = 'user_name'; // ユーザ名（自身の環境）
    private $DB_PASS = 'user_password'; // ユーザパスワード（自身の環境）
    private $DB_OPTION = 'charset=utf8mb4'; // オプション
    private $pdo;

    public function __construct()
    {
        $dsn = "mysql:host=localhost;dbname={$this->DB_DATABASE};{DB_OPTION};";
        try {
            $this->pdo = new PDO($dsn, $this->DB_USER, $this->DB_PASS);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die('DB接続エラー:' . $e->getMessage()); 
        }
    }

    // データを取得するメソッド
    public function fetchAll($sql, $params = [])
    {
        $stmt = $this->query($sql,$params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    // データを1件取得するメソッド
    public function fetch($sql, $params = [])
    {
        $stmt = $this->query($sql,$params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    // データの挿入・更新・削除するメソッド
    public function execute($sql, $params = [])
    {
        $stmt = $this->query($sql, $params);
        return $stmt->rowCount();
    }

    // クエリ実行共通処理
    private function query($sql, $params = [])
    {
        try {
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        } catch (PDOException $e) {
            die('DBエラー: ' . $e->getMessage());
        }
    }
}
?>
```

## 使用例
require_onceでDB実装クラスを読み込んでください。
```php:hoge.php
<?php
require_once('./MySql.php'); // 実装クラスのパス

// インスタンス生成
$db = new MySql();

// レコード1件取得
$record = $db -> fetch("SELECT column1,column2 FROM table_name WHERE column1 = ?;", ['where1']);
// 出力
echo "{$record['column1']}\n";
echo "{$record['column2']}\n";

// 取得したレコード全て取得
$allRecord = $db -> fetchAll("SELECT column1,column2 FROM table_name;");
// 出力
foreach($allRecord as $arr){
    echo "{$arr['column1']}\n";
    echo "{$arr['column2']}\n";
}

// レコードの更新
$updateRecord = $db -> execute("UPDATE table_name SET column1 = 'hoge' WHERE column1 = ? AND column2 = ?;",['where1','where2']);
?>
```

WHERE句のように、変数をSQL文に入れる場合はプレースホルダを使用します。プレースホルダは第2引数で配列として渡し、SQL文のプレースホルダ"?"を先頭から順に、配列で指定します。
例えばレコードの更新においては、配列の要素0("where1")は"column1"に該当し、配列の要素1("where2")は"column2"に該当します。
プレースホルダが1つの場合（例：レコード1件取得）でも配列で値を渡し、プレースホルダがない場合（例：レコード全て取得）は引数を省略できます。
出力については他のサイトで多く紹介されている方法と同じなのでそちらを参考にしていただくとわかりやすいかと思いますが、カラム名で取得できたり幅広い使い方が可能です。

お役に立てたら幸いです。
mikanOS 4章

## 4.1 make入門

There are 4 targets.
all, clean, kernel.elf, %.o

If we execute `make` without target, `make all` is executed.


```
TARGET = kernel.elf
OBJS = main.o

CXXFLAGS += -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone \
            -fno-exceptions -fno-rtti -std=c++17

LDFLAGS  += --entry KernelMain -z norelro --image-base 0x100000 --static

.PHONY: all
all: ${TARGET}

.PHONY: clean
clean:
	rm -rf *.o

kernel.elf: $(OBJS) Makefile
	ld.lld $(LDFLAGS) -o kernel.elf $(OBJS)


%.o: %.cpp Makefile
	clang++ $(CPPFLAGS) $(CXXFLAGS) -c $<
```

```
source $HOME/osbook/devenv/buildenv.sh
make
cd ~/edk2
source edksetup.sh
build 
$HOME/osbook/devenv/run_qemu.sh Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /home/nonoka/workspace/mikanos/kernel/kernel.elf
```

makeとかcleanは実際のファイル名でないことを示すために、.PHONY宣言する。

- $<
必須項目の先頭の一つ

## 4.2 ピクセルを自在に描く

## 4.3 refactor of 4.2

- using宣言

using宣言を使うと基底クラスのメンバー関数をオーバーロードとして追加できる。
 ```
 using PixelWriter::PixelWriter;
 ```
 We use base constructor in a derived class.
 

- 配置new
一般的なnew: new クラス名で、ヒープ領域にインスタンスを生成。→これがOSの機能を使うからまだできない！→そこで配置newを使う！引数に指定したメモリ領域の上にインスタンスを生成。
After allocating memory, `new` constructor is called, while `malloc` is not.

operator keywordを使うことで自分で演算子を定義できる。

```
// #@@range_begin(placement_new)
void* operator new(size_t size, void* buf) {
  return buf;
}

void operator delete(void* obj) noexcept {
}
// #@@range_end(placement_new)
```

```
    pixel_writer = new(pixel_writer_buf)
        RGBResv8BitPerColorPixelWriter{frame_buffer_config};
```

  - void*：汎用ポインタ。アドレスの格納のみできる。

## 4.4 vtable
子クラスのインスタンスを親クラスのポインタに代入し、親クラスのポインタを介して子クラスの機能を呼び出す。→vtableという仕組みを利用。

クラスのメンバ関数を定義する際に、virtualキーワードをつけることで、その関数は仮想関数ということになり、vtableに追加される。一度vtableに追加されると、その子クラスでは特にvirtualをつけなくても仮想関数として扱われる。

Base class vtable
| 関数名 | 値 |
| ---- | ---- |
| VFunc1 | Base::VFunc1 |
| VFunc2 | Base::VFunc2 |

Sub class vtable
| 関数名 | 値 |
| ---- | ---- |
| VFunc1 | Sub::VFunc1 |
| VFunc2 | Sub::VFunc2 |

仮想関数を一つ以上含むクラスのインスタンスの先頭にはvtableのポインタが埋め込まれる。すなわちsubクラスのインスタンスにはSub::vtableのポインタが埋め込まれる。
SubのインスタンスをBaseとして使う場合でも、vtable自体はSub::vtableが利用されるため、意図した関数が呼び出される。

## 4.5 ローダの改良
下記のカーネルを読み込むためのメモリを確保する部分で、メモリの大きさを計算する部分が間違っている。
```
  UINTN kernel_file_size = file_info->FileSize;
```

- Loadセグメントでファイルサイズとメモリサイズが違う理由
.bssセクション(初期値なしのグローバル変数が配置されるセクション)を含んでいるから。
初期値がないということは初期値をファイルに記録しておく必要がないということだから、ファイル上では大きさ0、メモリ上では大きさを持つ変数となる。

- The structure of ELF

| structure of ELF |
| ---- |
| file header |  
| program header | 
| section body |
| section header |

- solution
1. カーネルファイルを一時領域に読み込む。
1. 一時領域に読み込んだカーネルファイルのプログラムヘッダを読み、最終目的地の番地の範囲を取得する。
1. 一時領域から最終目的地へ、LOADセグメントをコピーする。
モダンCSS：margin-inline

## Qiita使ってみるよ
元バックエンドからWebコーダー＆フロントエンドでブランクありのおじさんです。
色々技術アップデート中なので、ついでに今まで読み専(読む機会も少ない)だったQiitaもやってみようと思います。
## CodePen使ってみるよ
こちらも読み専(読む機会も少ない)だったcodePen。
今気軽に使えるサーバもないし、いい機会なのでアカウント作ってみました。
https://codepen.io/ysk9999
## とりあえずモダンCSS今日知ったやつ
margin-inline。
便利っちゃ便利だけどでてくるのが遅すぎた。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="PorOKmb" data-pen-title="css_margin-inline" data-user="ysk9999" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ysk9999/pen/PorOKmb">
  css_margin-inline</a> by ysk9999 (<a href="https://codepen.io/ysk9999">@ysk9999</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
職場の先輩を癒すワンコBotに取り組んでみた、の後日談

こんばんは！小売業で採用担当をしているミハタです

前回の記事を読んでいただきありがとうございます
とある優しい方に教えていただいたので、さっそく後日談を報告します！

https://qiita.com/mihatachisa/items/f455265543d32e413753

せっかく教えていただいた知識を身につけて、装備をアップしていきたいと思います☆


# 1.使用するツール
前回同様です
* Make
* LINE公式アカウント
* LINE Messaging API

# 2.実際の画面
改良したLINEBotの画面がこちらです↓

![改良画面.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/23d6c1a2-046f-fed8-8265-5ffa17f3c924.gif)


わーーー！！！
先輩を癒すワンコが現れました！！！（パチパチ）
たくさんの種類のワンコが出てきて嬉しかったですし、わたしも癒されました


# 3.作成手順
教えていただいて改良したMakeのシナリオ画面はこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/d8c98f99-75e5-716f-72ff-e886ae2b0c6b.png)


### 課題点

前回、苦戦したのは画像APIを連携するところです
教えていただいた方（ここでは先生と呼んでしまいましょう）がおすすめしてくれたのは別のAPIです

random dog API (https://random.dog/woof.json)

こっちもかわいいワンコがたくさんいます　残業で疲れた心に沁みますね！

モジュールの設定の仕方も前回と類似しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/267fdc0a-1ca7-8b70-e6e0-84f9dd93b282.png)

大きく違うのは…そう！**JSONのモジュールを使うこと！**
HTTPとLINEの間にサンドしてあげるのです
個人的に、このJSONが超重要。テストに出すならここを空白欄にするレベルです

### JSONとは

JSONという言葉は知っていたのですが役割をよく理解しておらず
前回は使用していませんでした(^_^;)

JSON形式というのは、情報に含まれるさまざまな要素を整理し、見分けやすくしてくれるものです
HTTPのモジュールは文字列を返してくれるだけなので、もしJSONをサンドしないと…

![文字列.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/124232d6-8055-89ae-c992-5e1f7ecf6ac5.gif)


このような、怪しげな匂いのする文章が返ってきてしまいます

### 再チャレンジ！

かわいいワンコの画像をLINEで返信するために、LINEのモジュールはこのように設定↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/c0f18b2f-1d3e-b947-088f-f26ac1070cdd.png)

前回から変更したのは「Type」でimageを選択することと正しくJSONと連携させること
ちなみに先生が教えてくれたのですが
Original Content URは送られてきた画像をクリックした際に、表示される大きめの画像で、
Preview Image URLはLINEのUIに表示される小さめの画像　だそうです

へ～！そんな設定もできるんですね！　Makeって奥が深い

先生をはじめとした多くの方に教えていただき
冒頭のように無事、改良版を作成することができました！

お盆休み明け、ワンコに癒された先輩を見られることが今から楽しみです(⌒∇⌒)


# 4.次回
せっかく作成したLINE Botに、様々なモジュールをつけたりルーターで条件分岐を作って、より便利なツールにしたいと思います

次回もお付き合いお願いします　お疲れ様でした！



Qiita投稿のために参照した記事はこちら↓

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#emphasis
解いてみた。「Bランク：神経衰弱」

# 問題
[「Bランク：神経衰弱」](https://paiza.jp/works/mondai/b_rank_skillcheck_archive/concentration)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int nH = sc.nextInt();  // カード枚数（垂直方向）
        int nW = sc.nextInt();  // カード枚数（水平方向）
        int nN = sc.nextInt();  // プレイヤー人数

        int[][] anT = new int[nH+1][nW+1];
        
        // カード読み込み
        for (int h = 1; h <= nH; h++) {
            for (int w = 1; w <= nW; w++) {
                anT[h][w] = sc.nextInt();
            }
        }

        int nL = sc.nextInt();  // 記録の個数
        
        int[] anScore = new int[nN+1];  // n番目のプレイヤーの取得枚数
        int nTurn = 1;                  // 手番のプレイヤー番号
        int nRest = nW * nH;            // 場に残っている枚数

        // ゲームプレイ
        while (nRest > 0) {
            int na = sc.nextInt();
            int nb = sc.nextInt();
            int nA = sc.nextInt();
            int nB = sc.nextInt();
            
            if (anT[na][nb] == anT[nA][nB]) {   // カードの数が一致した。
                anScore[nTurn] += 2;
                nRest -= 2;
                // 同じ手番の人がプレイ
            } else {
                // 次の手番
                nTurn++;
                if (nTurn > nN) { nTurn = 1; }
            }
        }
        
        // 結果出力
        for (int n = 1; n <= nN; n++) {
            System.out.println(anScore[n]);
        }
    }
}
```

# 解説
## 標準入力からの数値の読み取り
### 数値（場のカード枚数（縦、横）、プレイ人数）の取得
Scanner インスタンスを作り、nextInt()メソッドで各数値を取得しています。
### カードの配置の取得
配列 anT[][] に格納していきますが、後々位置が、行（1〜H）、列（1〜W）で指定されることを考慮して、配列のサイズを anT[nH+1][nW+1] としています。
### 記録の数の取得
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。
## 実行前の初期処理
+ 各プレイヤーの取得した枚数を配列で用意
+ 手番（1〜N）を1に設定
+ 残り枚数を nW $\times$ nH に設定します。
##　ゲームの実行ループ
残り枚数が0より大きい間、while ループを回します
### 記録の取得
1枚目の行na、列nbと2枚目の行nA、列nBを、標準入力から取得します。
### カードの比較
anT[na][nb] と anT[nA][nB]を比較します。
#### 数字が一致した場合
+ プレイヤーの取得した枚数を +２ します。
+ 残り枚数を -2 します。
+ 手番はそのままです。
#### 数字が一致しなかった場合
+ 次のプレイヤーに手番を移動します。
## 結果の出力
プレイヤーの取得した枚数を表示します。
# その他
問題の性質上、カードを取り除く処理や、取り除かれたカードが選択されることは考えていません。
Dockerを使用したZabbixのインストール方法(Ubuntu)

Zabbixについて理解を深めたいと思ったので、今回はZabbixのインストールを行っていきます。
# 注意点
今回はローカルアクセスのみを対象としています。テスト環境として使用しているため、他のPCやデバイスからのアクセスは考慮しておりません。

# 実行環境
- OS:Ubuntu 22.04.4 LTS
- Docker Engine: 27.1.1, build 6312585
- Docker Compose: v2.14.2
# 必要なパッケージのインストール
Dockerをインストールするために必要なパッケージをインストールします。
```
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```
# DockerのGPGキーを追加
Dockerのインストールに使用するGPGキーを追加します。
```
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```
# Dockerリポジトリを追加
DockerのリポジトリをAPTソースリストに追加します。
```
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
# Docker Engineをインストール
Docker Engineをインストールします。
```
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
# Dockerのインストール確認
Dockerが正しくインストールされたかどうかを確認します。
```
sudo docker run hello-world
```
# Docker Composeのダウンロード
Docker Composeのダウンロード
```
sudo curl -L "https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
# 実行権限を付与
ダウンロードしたDocker Composeに実行権限を付与します。
```
sudo chmod +x /usr/local/bin/docker-compose
```
# Docker Composeのインストール確認
Docker Composeが正しくインストールされたか確認します。
```
docker-compose --version
```
# Dockerネットワークを作成
ZabbixとMySQLが通信できるようにDockerネットワークを作成します。
```
docker network create zabbix-network
```
# MySQLデータベースを起動
- デフォルトの文字セットとしてUTF-8を設定します。
- 「〇〇〇〇〇」「△△△△△」は任意のパスワードに置き換えてください。
```
docker run --name zabbix-db --network zabbix-network \
    -e MYSQL_DATABASE=zabbix \
    -e MYSQL_USER=zabbix \
    -e MYSQL_PASSWORD=〇〇〇〇〇 \
    -e MYSQL_ROOT_PASSWORD=△△△△△ \
    -e LANG=C.UTF-8 \
    -d mysql:8.0
```
# Zabbixサーバを起動
- Zabbixサーバコンテナを起動します。
- パスワードは先ほどと同じものを使用してください。
```
docker run --name zabbix-server --network zabbix-network \
    -e DB_SERVER_HOST='zabbix-db' \
    -e MYSQL_DATABASE=zabbix \
    -e MYSQL_USER=zabbix \
    -e MYSQL_PASSWORD=〇〇〇〇〇 \
    -e MYSQL_ROOT_PASSWORD=△△△△△ \
    -d zabbix/zabbix-server-mysql:latest
```
# Zabbixウェブインターフェイスを起動
- Zabbixウェブインターフェイスのコンテナを起動します。
- パスワードは先ほどと同じものを使用してください。
```
docker run --name zabbix-web-nginx --network zabbix-network \
    -e ZBX_SERVER_HOST='zabbix-server' \
    -e DB_SERVER_HOST='zabbix-db' \
    -e MYSQL_DATABASE=zabbix \
    -e MYSQL_USER=zabbix \
    -e MYSQL_PASSWORD=〇〇〇〇〇 \
    -e MYSQL_ROOT_PASSWORD=△△△△△ \
    -p 80:8080 \
    -d zabbix/zabbix-web-nginx-mysql:latest
```
# コンテナの状態確認
コンテナの状態を確認します。
```
docker ps
```
# Zabbixウェブインターフェイスにアクセス
ローカルのブラウザで以下のURLにアクセスします。
```
http://localhost
```
![zabbixログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/e894d920-01b5-10d0-a7f1-563151d7ff57.png)
- Username:Admin
- Password:zabbix
を入力すればログインが完了できます。
# 最後に
ここから、いろいろと設定していこうと思っています～
ゲームとかでも同じことを思いますが、触ることに慣れることが上達するための1番の近道だと感じます。
この機会にZabbixと仲良くなりたいと思います！
TinySeleniumVBAで別タブや別ウィンドウで開かれたEdgeを操作する方法

ブラウザをVBAで操作しているときに、別タブや別ウィンドウに遷移してしまうときがあると思います。
そんな時でもVBAから操作し続ける方法を備忘も込めて投稿します。

# 準備
前回の記事まででTinySeleniumVBAの導入はこちらをご覧ください。

https://qiita.com/y-hys/items/6baeb4435137e072a62a

# 実装
remote-debugging-portを開けた状態でここでは書いていますが、普通に、OpenBrowserした状態でも問題ないです。

検証用にポップアップ表示をするhtml、されるhtmlを作成。
別ウィンドウで表示されたテキストを取得するところまで実装してあります
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>FirstPage</title>
</head>
<body>
  <main>
    <button onclick=test()>ポップアップウィンドウを表示</button>
  </main>
  <script>
    const test = () => {
	  window.open("./popup.html", '_blank', 'width=800, height=600');
    }
  </script>
</body>
</html>
```

```html:popup.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PopupPage</title>
</head>
<body>
  <main>
	<span name="span-sample">スパンタグだよ</span>
  </main>
</body>
</html>
```

```VBA
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub TinySeleniumNewBrowser()
  Dim driver As New WebDriver
  driver.Edge "hoge\msedgedriver.exe"
  
  Dim cap As Capabilities
  Set cap = driver.CreateCapabilities()
  cap.SetOption "debuggerAddress", "127.0.0.1:9222"
  driver.OpenBrowser cap
  
  ' ポップアップ表示用のhtmlを表示
  driver.Navigate "fuga\index.html"
  ' 表示中のWindowHandleを保持
  Dim currentWindowHandle As String
  currentWindowHandle = driver.Execute(driver.CMD_W3C_GET_CURRENT_WINDOW_HANDLE)
  Sleep "1000"
  
  ' ポップアップウィンドウを表示
  driver.FindElements(By.TagName, "button")(0).Click
  ' WindowHandleのListを取得
  Dim windowHandleList As Object
  Set windowHandleList = driver.Execute(driver.CMD_W3C_GET_WINDOW_HANDLES)

  ' もともと開いていたWindowHandleと異なる場合は新しいWindowHandleを操作対象にする
  Dim windowHandle As Variant
  For Each windowHandle In windowHandleList
    If currentWindowHandle <> windowHandle Then
      Dim params As New Dictionary
      params.Add "handle", windowHandle
      Dim tmp As Object
      Set tmp = driver.Execute(driver.CMD_SWITCH_TO_WINDOW, params)
      Exit For
    End If
    
  Next windowHandle
  Debug.Print driver.FindElements(By.TagName, "span")(0).GetText
  driver.Shutdown
End Sub
```

適宜、この後はよしなに自動化してください。


~~答えにたどり着くのに2週間ほどかかってしまった。まだまだ勉強が足りないですね~~
Dev Containersか判定する方法を使ってdotfilesをより効果的に使う

## 結論

環境変数 `REMOTE_COTAINERS=true`かどうかでDev Containerかローカルの環境かを判定できる。

```shell
export | grep REMOTE_CONTAINERS
declare -x REMOTE_CONTAINERS="true"
```

---

## dotfilesでの応用例

> dotfilesとは: ホームディレクトリに配置してある，.から始まる設定ファイルを管理するリポジトリのこと。

自分の[dotfiles](https://github.com/RyosukeDTomita/dotfiles/blob/main/install.sh)リポジトリでは，Dev Containersで実行されるdotfiles installスクリプトに以下のようなif文を追加しています。

```shell
if [ "${REMOTE_CONTAINERS}" == "true" ]; then
    echo "REMOTE_CONTAINERS IS ${REMOTE_CONTAINERS}, THEN OVERWRITE SYMBOLIC LINKS"
    ln -sf ~/dotfiles/${f} ~/${f}
    echo "=====CREATE SYMBOLIC LINKS ${HOME}/dotfiles/${f} --> ${HOME}/${f}====="
```

普段自分のローカルの開発環境ではシンボリックリンクを使ってdotfiles配下の設定ファイルをホームディレクトリにリンクしているのですが，上書きオプション`-f`をDev Containers内でのみ使用することでDev Containersにもともとあった設定ファイルを上書きしてシンボリックリンクを作成しています。

---

## 補足

dotfilesをDev Containersで使う方法については以下を参照してください。

https://qiita.com/sigma_devsecops/items/79db1640d1a1cd82343d
Javaで「名前付き正規表現グループの使い方」の動作を確認してみた

# 概要

Javaで「名前付き正規表現グループの使い方」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index14.html

# 実装

以下のファイルを作成しました。
```JSample14_1.java
import java.util.regex.*;

class JSample14_1{
  public static void main(String[] args){
    String regex = "(?<pref>^.*(?:都|道|府|県))(?<ward>.*区)";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher("東京都港区赤坂");
    if (m.find()){
      System.out.println(m.group());
      System.out.println(m.group("pref"));
      System.out.println(m.group("ward"));
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample14_1.java 
$ java JSample14_1 
東京都港区
東京都
港区
```

# まとめ

何かの役に立てばと。
CodeMirror6を用いたHTMLエディターの導入

## 概要
Ruby on Railsをベースとしたアプリ制作時に、Codemirror6の導入で苦戦したため、導入方法をまとめました。

Codemirror6は公式マニュアルに`Getting Started`のセクションが無く、どこを見たらいいのか分からないので、初心者にはかなりとっつきにくい文献という印象でした。

結論として、以下の`Bundling Example`のセクションを見ながら進める事でEditor構築することが出来たので、こちらの流れに沿って説明します。

https://codemirror.net/examples/bundle/

また、今回の説明ではRuby on Railsを使用していますが、Codemirrorの実装は基本Javascriptしか触ってないので、本記事を読むために必要知識はJavascript（+ Node.js）となります。


## エディターの導入
### 1. CodeMirror＆HTMLパッケージのインストール
公式文書ではJavascript用エディターを導入していますが、今回私はHTML用エディターを実装したいので、HTMLのパッケージをインストールします。

※任意の言語をサポートする場合は、@codemirror/lang-xxx（xxx:言語名）のパッケージを指定してください。

まずは以下のコマンドで、CodeMirror6のコアパッケージをインストールします。
```
npm i codemirror @codemirror/lang-html
```

`codemirror`
CodeMirror6のコアパッケージ

`@codemirror/lang-html`
このコマンドは、エディターにHTMLのシンタックスハイライトや補完機能を追加するパッケージを導入します。CodeMirrorの設計は、コアエディタを拡張モジュールを追加する方針であるため、HTMLに特化した機能を使うためにこのモジュールを導入しています。

---
### 2. Rollupの導入
まずは以下のコマンドでこのコマンドは、Rollupをプロジェクトにインストールします。

```
npm i rollup @rollup/plugin-node-resolve
```

`rollup`
Rollupは、モジュールバンドラと呼ばれるツールで、JavaScriptモジュールを1つのファイルにまとめる役割を果たします。
codemirror6のコード量は莫大なため、必要な機能のみを選択してファイルボリュームを減らすための施策としてRollupの使用が推奨されています。

`@rollup/plugin-node-resolve`
このプラグインは、RollupがNode.jsのモジュール解決アルゴリズムを使って、node_modulesディレクトリ内のパッケージを見つけられるようにするためのものです。

---
rollupの導入が終わったら、次はコードを実際に記載する作業場を用意するため、`editor.mjs`を作成します。
作製場所は任意のjavascriptファイル保管場所で良いのですが、今回はルートディレクトリに保管した場合で説明します。

`editor.mjs`を作ったら、以下のコードを実行しましょう。
```
node_modules/.bin/rollup editor.mjs -f iife -o editor.bundle.js -p @rollup/plugin-node-resolve
```

この時はまだ`editor.mjs`に何も記入していないので、同じルートディレクトリに空っぽの`editor.bundle.js`が作られます。
ここまで出来れば、rollupの動作確認は完了です。

HTMLファイルでjavascriptを呼び出す際は`editor.bundle.js`を読み込むようにしておきましょう。

```
例：<script src="editor.bundle.js"></script>
```

## 3. エディターの構築
いよいよエディターの構築に入ります。
`editor.mjs`に以下のコードを書きます。

```
import { EditorView, basicSetup } from "codemirror";
import { html } from "@codemirror/lang-html";

let editor = new EditorView({
  extensions: [basicSetup, html()], // HTML用の言語モードを追加
  parent: document.body, // HTMLのbodyタグを認識してエディター追加する
});

```

あとはコード実行すれば、bodyタグの後にエディターが構築されるはずです。
`editor.mjs`を更新しているので、rollupの実行も忘れずに行いましょう。
```
node_modules/.bin/rollup editor.mjs -f iife -o editor.bundle.js -p @rollup/plugin-node-resolve
```

ここから以下ページなどを参考にしつつ、スタイルを設定する事で、よりエディターらしい形になっていきます。

https://codemirror.net/examples/styling/

今回の記事は基本のエディター構築までを取り扱いましたが、特にCodemirror6はチュートリアルが無いので、基本的にはExampleを読み進めて必要な機能を実装していく事で学びが深まると思います。
AozoraEpub3をnode.jsに移植


　AozoraEpub3とは青空文庫形式のテキストをEPUBに変換することができるソフトウェアである。Javaで書かれているので動作させるのにJavaが必要となる。昔はJavaで書けばどこでも動くと言われていたがいまはJavaScriptでブラウザ上のほうがどこでも動きがする。

https://github.com/kyukyunyorituryo/AozoraEpub3

　Javaで動くのになぜJavaScriptにするかというと、Javaに起因するインスールの失敗のコメントがよく見つかる。Java8のサポート期間が延長されたので、それ以降のバージョンに移行する人がいない。けれどJavaの開発主体は17や21が多い、17や21はOpenJDKなのでJDKやJREを自分でインストールする必要がある。ソフトウェア制作者がインストーラーを作ってJREを同梱させればいいのだけど、インストーラーで作成されたexeとjarとで動作が変わるのでうまく動かない。

### 目標
* CLIの部分をnode.jsで書いて同じような動作を可能にしたい。
* rollupでjsやフォントなどまとめてブラウザ上で動かしたい。
 
### 現状
　今年のはじめぐらいから、ChatGPTの手を借りながらAozoraEpub3をnode.jsに書き換えていた。問題点は長いコードは分割しないといけないこと。Javaではクラスごとに書かれているので、コードの分割すると違う意味なることがある。意味が通るように分割すると今度は結合するのがめんどくさくなる。

 　同じコードを書き換えできているかの確認にdiffを使っているので大きくコードを書き換えることができなかった。
 
 jsでは関数型で書いていたので、Javaのオブジェクト指向的な書き方が移植するときにあまり見慣れない書き方になる。「引数だけ異なって名前は同じメソッド」がJSではだめなので条件分岐をする必要がある。chatgptが吐いたコードは別のメソッドを作っただけだった。

jsではJavaのライブラリが同じ名前じゃないので似た機能のライブラリを探す必要がある。たまに存在しないライブラリがあるように見せたコードを出力する。使っているライブラリを置き換える必要がある。

* common compress、jszip
* unrar、node-unrar-js
* velocity、ejs
* juniversalchardet、encoding.js
* imageio、jimp
* uuid

### ファイル構造の問題
node.jsで同じファイル構造にすると、設定ファイルの変更がやりにくい。

### どの箇所を移植し終えたか
最低限のAozoraEpub3の部分だけ抽出してJSに移植しているが、どの箇所を移植し終えたかをメモっておく。
　はじめはcommonjsで書いていたが、パッケージ化するときにes moduleに書き換えた。
 
「下記のJavaコードをコメントは書き換えないで、es moduleに書き換えて。」という指示が一番しっくり来た。読ませたコードに今度は「テストコードを書いて」と指示したりもした。
テストコードをChatGPTに書かせるがmochaを使ったもので慣れていなかったのであまり使いこなせていない。


そのまま使う
* chuki_alt.txt
* chuki_ivs.txt
* chuki_latin.txt
* chuki_tag.txt
* chuki_tag_suf.txt
* chuki_utf.txt

* presets
* template　velocityからejsに書き換えた

まだ
* AozoraEpub3.java
* AozoraEpub3Applet.java

書き換え中
* converter　
* image
* info
* swing
* util
* web
* writer

converterフォルダー　
* AozoraEpub3Converter.java constructorが重複している。
* AozoraGaijiConverter.java　確認済みやや不安
* GlyphConverter.java　未使用
* JisConverter.java　確認済み
* LatinConverter.java　確認済み
* PageBreakType.java 確認済み
* RubyCharType.java　確認済み

imageフォルダー
画像の情報の扱いはだいぶ違う
* ImageInfoReader.java　画像編集をJimpにunrarとunzipを書き換え
* ImageUtils.java

infoフォルダー
は書き換え済み
* BookInfo.java
* BookInfoHistory.java
* ChapterInfo.java
* ChapterLineInfo.java
* CoverEditInfo.java
* GaijiInfo.java
* ImageInfo.java　sharpにするかjimpにするか
* ProfileInfo.java
* SectionInfo.java

swingフォルダー
はGUIを作るときまでまとう

* JConfirmDialog.java
* JCoverImagePanel.java
* JProfileDialog.java
* JTocTable.java
* NarrowTitledBorder.java

変換はしたけどライブラリをどのように使う。ログツールはライブラリを使ってもいいが書き換えるのが面倒。Detectorは文字コード判別だがencoding.jsにエラー処理を書いた。log4js-nodeを入れようかな。

utilフォルダー

* CharUtils.java
* Detector.java
* FileNameComparator.java
* LogAppender.java

writerフォルダー
* Epub3ImageWriter.java 
* Epub3Writer.java　ejsとjszipで圧縮しようかと
【React】Markuplintの導入方法

## 導入のためのコマンドを実行する

以下のコマンドを実行し、

```terminal
$ yarn dlx markuplint --init
✔ Which do you use template engines? · React (JSX)
✔ May I install them automatically? (y/N) · true
✔ Do you customize rules? (y/N) · false
✔ Does it import the recommended config? (y/N) · true
```

`Which do you use template engines?` はカーソルを合わせ、スペースで選択します。

## 設定ファイルを編集する

上記のコマンドが完了すると `.markuplintrc` が生成されます。

```json:.markuplintrc
{
  "specs": {
    "\\.[jt]sx?$": "@markuplint/react-spec"
  },
  "parser": {
    "\\.[jt]sx?$": "@markuplint/jsx-parser"
  },
  "extends": [
    "markuplint:recommended"
  ]
}
```

`extends` を `markuplint:recommended` から `markuplint:recommende-react` に変更します。

次に `package.json` の `scripts` に `markuplint` を追加します。

```json:package.json
  "scripts": {
     "lint:jsx": "markuplint \"./**/*.tsx\"",
  },
```

以下のコマンドを実行し正常に動作するか確認します。

```terminal
yarn lint:jsx
```

## 参考

https://markuplint.dev/ja/docs/guides

https://markuplint.dev/ja/docs/guides/presets
VSCode、CodeCommitでgit commit/pushを操作する



## 間違えてたこと
wslなのでssh_configはwsl側で作っていたが、vscodeがwindowsの`C:\Users\user\.ssh\config`を見ていた
->原因はvscodeのgitがwindowsのgitを使っているためと思われる。なので秘密鍵とかは一式windows側に設置しないとだめと思われる。`.gitconfig`もかも
## C:\Users\user\\.ssh\config
```bash
UserKnownHostsFile ~/.ssh/known_hosts

Host git-codecommit.*.amazonaws.com # codecommitを扱うときはこれでよい
    User XXXXXXX # AWS CodeCommit の SSH 公開キーのSSH キー ID
    IdentityFile ~/.ssh/id_rsa # awsのec2にログインする鍵（と一緒にしている）
```

その後、普通にできる。
git cloneもwsl側にしなくても大丈夫だった。
Userは指定しないと、デフォルトec2-userでcodecommitにアクセスして失敗する
LambdaのRubyでGitLabにリポジトリを作成、削除する


## ruby版
AIにシェルからlambda用に変換してもらったらあっさり動いた。
RubyでGitLabにリポジトリを作成、削除する機能です。

### リポジトリ作成
- https://github.com/tmoritoki0227/gitlab_project_create/blob/main/create_project.rb
- https://github.com/tmoritoki0227/gitlab_project_create/blob/main/projects_and_branches.txt

### リポジトリ削除
- https://github.com/tmoritoki0227/gitlab_project_create/blob/main/delete_project_all.rb
【学習記録　2024-08-13】　　　JavaScript

## 教材を使用する
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：1h
- primitive値がどのようにオブジェクトとして扱われるか
- parseInt()とtoString()を使って2進数を扱う方法
- 丸め誤差など

## 所感
　今回はNumberオブジェクトの内部的に動きについて学習しました。気づいたらこのコースも折り返し地点を過ぎていたので残り後半も駆け抜けたいと思います！早くReactを触りたい！！!笑
class=とclass:の違い

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## class=
HTMLにおける属性の書き方。要素にクラス名を直接指定している。
タグに使う。

## class:
ヘルパーメソッドにオプションを渡す時。
タグではなくヘルパーメソッド自体にどのようなCSSを使いたいかを指定している。
Laravelを用いた開発でgit pullすると500 Server Errorになった話と対処法

Laravelを用いたチーム開発をしていたときに、IDE上にErrorやWarningは出ていないのにローカルでページを確認すると500 Server Errorが表示されて困惑していたときの話です。
また、その際に行った対処の方法を誰かの助けになればと思い、記録として残します。
(※初めての技術記事投稿のため、間違い等がある場合はご指摘いただけますと幸いです。)

# 開発環境
OS : Ubuntu 24.04 (WSL2上で利用)
IDE : JetBrains PhpStorm 2024.2
Docker : Docker Desktop 4.33.1
バックエンド : Laravel 10.47.0
フロントエンド : React 18.2.0
バンドラ : Vite 5.0.0

# 発生した問題
チームで開発していたプロジェクトのmainブランチをpullし、ホットリロードで更新された画面を確認すると500 Server Errorが表示された。
このとき、コンフリクトがあったわけでもなくIDE上でErrorやWarningもない状態だった。
Dockerやホットリロード機能は常に起動しており、pull前にページが表示できていたことは確認していた。
(※同様にmainブランチをpullしていた他のメンバーにページが表示できるか確認したところ、問題なく表示できていたため自分側に問題があると考えた。)

# 問題の原因
結論、git pullによるファイルの追加や変更に伴って一部PHPファイルのパスに変更が生じ、pull以前でComposerのautoload機能により作成されていた「PHPのファイルパス状況を整理した情報」と、「現在のPHPファイルのパス状況」の食い違いが原因だった。

# 対処方法
Composerのautoload機能で利用するファイルパス情報を最新にすることで解決できる。
具体的な方法として、composer.jsonを置いている階層で以下のコマンドを実行する。
```
composer dump-autoload
```

# おわりに
今回発生した問題ではコードにErrorやWarningが発生していなかった、かつpullしてきたコード自体や他のメンバーの環境にも問題がなかったため、原因の特定が非常に難しかった。
また、Composerに対する理解が浅かったことに起因した問題であったが、“ファイルパスが食い違った”場合に何らかのErrorを表示することは可能なのだろうか。

### 参考資料
https://getcomposer.org/doc/

https://getcomposer.org/doc/03-cli.md#dump-autoload-dumpautoload
SOAP通信の参考資料まとめ（随時更新）

# はじめに

仕事でSOAP通信を使用することになり、1から学習しなければならなくなった。
実務において、参考になったサイト・書籍を順次、記事に残していく。
私と同じように、SOAP通信の初学者のヒントになれば、嬉しい。

# 書籍

| No | リンク | 備考 |
|:-- |:-- |:-- |
| 1  | [SOAP/UDDI/WSDL Webサービス技術 [基礎と実践] 徹底解説](https://gihyo.jp/book/2002/4-7741-1616-5)  | SOAP，WSDLを体系的に学ぶことができるオススメの本。<br> 以下の章を読めば、必要な基礎知識を一通り学ぶことができると考える(リンクの技術評論社の［目次］より抜粋する)。<br>・第2章　XMLの概要 <br> ・第3章　SOAPの概要 <br> ・第4章　SOAPメッセージのフレームワーク<br> ・第5章　SOAPメッセージのエンコーディング規則 <br> ・第9章　WSDL文書の基本構造 <br><br> 注意点としては、SOAP 1.1をベースに本書が記述されていること。SOAP 1.2を使用する場合、コラムに記載されているSOAP 1.1とSOAP 1.2の差異も確認する必要がある。|
|   |   |   |


# サイト

| No | リンク | 備考 |
|:--|:--|:--|
| 1  | [W3C SOAP仕様](https://www.w3.org/TR/soap/)  | SOAP仕様を標準化しているW3Cのサイト  |
|   |   |   |

# ツール

| No | リンク | 備考 |
|:-:|:-:|:-:|
| 1 | [Soap UI](https://www.soapui.org/tools/soapui/)  | よく利用されるSOAP通信のテストツール(OSS)  |
|   |   |   |
繰り返し二乗法【競技プログラミング】

# はじめに
- 今日は疲れているから、あまり時間をかけたくないけど、1個くらい投稿したかったので、簡単だけどswiftで対応していないべき乗計算の関数pow(a,n) = (a^n)を作ることとする。
- わざわざ関数を作るまでもねえだろ、暇人！と思うじゃん？
- 意外と奥が深い、というほど深くもないけど、目からウロコな感じはあるから、紹介するね。

# べき乗計算の計算量(シンプル版)
- 深く考えず、本能の赴くままにコードを書くとこんな感じ
```swift
func pow(_ a:Int,_ n:Int)->Int {
    var ans = 1
    for i in 0..<n {
        ans *= a
    }
    return ans
}

print(pow(11,3)) // 1331
print(pow(3,33)) // 5559060566555523
```
- はい終了...んなわきゃない。
- まあ、間違ってはないけど、間違ってはないんだけど、これだと効率面で駄目なのね。
- 例えば、現実で使う場面があるかどうか分からないけど、nが$10^{10}$の場合は、計算できるだろうか？
- もちろん、数が大きくなりすぎて、Intでは桁が足りないという問題はあるから、`mod998244353`で計算する前提としても、計算量が競技プログラミングの標準的な目安である$10^8$を大きく超えてしまうため、計算が出来ないよね。

# 繰り返し二乗法
- 「繰り返し二乗法」とは、べき乗計算の計算量を減らす方法の名前です。
- 例えば、nが0〜255の範囲の数字の時、nは下記のように書ける。なお、i0～i7はそれぞれ0か1。
- $ n = 1×i0 + 2×i1 + 4×i2 + 8×i3 + 16×i4 + 32×i5 + 64×i6 + 128×i7 $
- 具体例を言えば、127 = 1+2+4+8+16+32+64 と書けるよね。
- pow(7,127)を解く場合、最初のアルゴリズムを使うと、計算量は127となるけど、127 = 1+2+4+8+16+32+64 となることを利用して、下記のように計算量を削減できる。
    - まず、分解します。
        - $7^{127} = 7^{1+2+4+8+16+32+64} = 7^1×7^2×7^4×7^8×7^{16}×7^{32}×7^{64}$
    - べき乗計算をそれぞれ行います。
        - $7^1 = 7$ -- ①
        - $7^2 = (7^1)^2$ -- ②
        - $7^4 = (7^2)^2$ -- ③
        - $7^8 = (7^4)^2$ -- ④
        - $7^{16} = (7^8)^2$ -- ⑤
        - $7^{32} = (7^{16})^2$ -- ⑥
        - $7^{64} = (7^{32})^2$ -- ⑦
    - 上記の①〜⑦を乗じます。
    - 上記の例だと、計算量は2×7 = 14 となり、当初アルゴリズムによる127から大幅に削減できたよね。このアルゴリズムを繰り返し二乗法と呼びます。
- 実際にコードを書く。もちろん、大きな数字に対応できるよう、`mod998244353`表示にするね。
- 比較用にシンプル版の`mod998244353`表示のコードを書くと
```swift
func pow(_ a:Int,_ n:Int)->Int {
    var ans = 1
    let mod = 998244353
    for i in 0..<n {
        ans *= a
        
        //mod998244353
        if ans > mod {ans = ans % mod}
    }
    return ans
}

print(pow(11,3)) // 1331
print(pow(3,33)) // 478528062
print(pow(7,127)) // 561762571
```
- 繰り返し二乗法のコードを書くと
```swift
func pow(_ a:Int,_ n:Int)->Int {
    var ans = 1
    var x = a
    var i = n
    let mod = 998244353
    while i > 0 {
        if i % 2 == 1 {ans *= x}
        x *= x
        i >>= 1
        
        //mod998244353
        if ans > mod {ans = ans % mod}
        if x > mod {x = x % mod}
    }
    return ans
}

print(pow(11,3)) // 1331
print(pow(3,33)) // 478528062
print(pow(7,127)) // 561762571
```
- うむ、大成功！
- ところで、「`mod998244353`って、なんじゃらほい？」と思った人がいたら、[modの公式](https://qiita.com/kei_tnk/items/4a643b2f47d2aa919a1b#mod%E3%81%AE%E5%85%AC%E5%BC%8F) を参考にしてほしい。

# さいごに
- 計算量は最初のアルゴリズムでO(n)だったのに対し、繰り返し二乗法では、O(log n)となり、高速化が図れる。c++やpythonで実装されているpowでは繰り返し二乗法を取り入れているから、swiftでシンプルな累乗計算してしまうと、計算量で差を付けられてしまうので注意。
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（20/100）

【20日目】
トピック2：総勘定元帳（4/20）

≪問題20≫
各品目に割り当てられるローレベルコードの用途は何ですか。
（２つ選択）
□設計BOMの副明細を特定するために設計デザインで使用される。
□品目が計画される順序を決定するためにMRPで使用される。
□原価を求める方法を決定するために原価積上で使用される。
□代替構成品目の優先度を決定するためにATP（Available-to-Promise）で使用される。

≪解答≫
□設計BOMの副明細を特定するために設計デザインで使用される。
■品目が計画される順序を決定するためにMRPで使用される。
■原価を求める方法を決定するために原価積上で使用される。
□代替構成品目の優先度を決定するためにATP（Available-to-Promise）で使用される。

≪解説≫
◆BOMを登録する際に、システムによって各品目にローレベルコードが自動的に割り当てられます。このコードは、MRPおよび原価計算で使用されます。
◆ローレベルコードには、以下の機能と用途があります。
（1）MRPにおいて、品目の計画順序を決定するために使用されます。
（2）原価を積み上げる際のロールアップ方法を決定するために使用されます。
（3）品目が複数の製品や複数の生産レベルで使用される可能性があることを考慮します。
（4）品目が使用される最下位の展開レベルを示し、その品目の合計所要量が収集されます。
学習のモチベーションが落ちてきた時に考えること

# はじめに
最近就活に向けて本格的に個人開発の学習をしたり、開発のアルバイトをするようになりました。がやはりモチベーションを保ち続けるのはなかなか難しい...
今回は自分のモチベーションが下がってしまう原因とモチベーションが下がってきた際に最近やるようにしていることを書いていきます。
# 自分はどんな時にモチベーションが下がるのか
自分がどんな時にモチベーションが下がるのか振り返ってみた結果、以下のような時にモチベーションが下がることがわかりました。

- エラーの解決などで実装がなかなか進まない時
- 周りが爆速で成長しているのに自分の成長が実感できない時
- バイト等で時間を取るのが難しい時

# モチベーションを回復させるためにやっていること
### １. 自分の目標を振り返る
自分の目標を振り返るのはモチベーションを回復させるために非常に有効だと思います。
自分の場合は、
- 短期目標(比較的達成しやすい目標)
- 中期目標(ちゃんと頑張れば達成できそうな目標)
- 長期目標(現状では現実的ではないが達成したい目標)


の3つ目標を設定し定期的に見直すようにしています。
### ２. 学習曲線を信じる
同じくらいの年代でもものすごくクオリティの高いアプリを開発していたり、爆速で成長してる方を見るとネガティブなマインドになってしまうがあります。そんな時自分の場合は学習曲線を意識するようにしています。有名な話ですが、学習の成果というのは学習の時間に比例して上がっていくものではありません。

![学習曲線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279945/d76d6ca2-d6c6-292c-ce9b-4ac6f338e845.png)

このグラフのように人によって学習効果が出てくる時期というのは異なるので、自分もいつか急激に成長できることを信じて毎日コツコツ学習するようにしています。

### ３. とにかく少しでも学習してみる
どんなにやる気が出ない時でも少しはPCの前に座るようにしています。例えば今エラー等で詰まっている実装がある時に自分が何を実装したくて何がわかっていないのかをnotionとかに書き出すだけでも次の作業に入りやすくなる気がします。また一般的には1日でたくさん勉強して次の日勉強しないより、少なくても毎日決まった時間しっかり学習する方が良いとされています(分散学習というらしい)。

### ４. 周りの人達の頑張りを見る
やる気が全く出ない時にXやQiitaでたくさんアウトプットをしている人をみるのもおすすめです。シンプルに自分も頑張ろうという気持ちになります。
### ５. ちゃんと休息をとる
大人の平均的な集中力持続時間は50分程度と言われてるように、基本的に長時間の作業は効率が悪いと思います。外で散歩したり、自分の趣味の時間を設けてリフレッシュすることで作業効率が上がるようになった気がします。

# おわりに
今回は自分のモチベーション対策について書きました。モチベーションの保ち方は人それぞれだと思うので何かおすすめの方法があったらコメントで教えてください。引き続き頑張っていきましょう💪

# 参考
参考にさせていただいた記事を一部載せておきます。

https://qiita.com/Sicut_study/items/aad3c38ab0fd1df894b2

https://qiita.com/ryoheiiwamoto/items/d70653757022e237710d

https://studyhacker.net/start-studying
wsl内からlocalhostを叩いたときに、welcome to nginxが表示される

## きっかけ
「WEBパフォーマンスチューニング ISUCON」という本を参考に、abコマンドを使って`localhost`にアクセスしようとしたところ、WSL（Windows Subsystem for Linux）環境内からアクセスした際に問題が発生しました。具体的には、アクセスログにリクエストが記録されず、意図した動作が得られませんでした。試行錯誤の結果、解決策を見つけたので、共有します。

## 1. curlでlocalhostを叩いてみる

まず、問題の再現と原因を特定するために、`curl`を使って`localhost`にアクセスしてみました。

### WSL内からのアクセス
以下のコマンドでWSL内から`localhost`にアクセスした結果です。

```bash
curl -v localhost
```

出力は以下の通りです：

```bash
*   Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.18.0 (Ubuntu)
< Date: Tue, 13 Aug 2024 13:15:47 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Thu, 08 Aug 2024 05:17:10 GMT
< Connection: keep-alive
< ETag: "66b454d6-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
```

この結果から、`localhost`はWSL内で実行されているNginxサーバーのデフォルトページにアクセスしていることがわかります。

### ホストのWindows側からのアクセス
次に、Windowsホスト側から`localhost`にアクセスした結果です：

```bash
curl -v localhost
```

出力は以下の通りです：

```bash
詳細: GET http://localhost/ with 0-byte payload
詳細: received 33313-byte response of content type text/html;charset=utf-8

StatusCode        : 200
StatusDescription : OK
Content           : <!DOCTYPE html>
                    <html>
                      <head>
                        <meta charset="utf-8">
                        <title>Iscogram</title>
                        <link href="/css/style.css" media="screen" rel="stylesheet" type="text/css">
                      </head>
                      <body>
                        <div clas...
```

ここでは、Windows側で実行されているWebサーバー（ISUCONサイト）にアクセスできていることが確認できます。

## 2. 問題の特定と解決策

### 問題
WSL内から`localhost`を叩くと、WSL内で実行されているサービスに接続されるため、Windowsホスト側で実行されているサービスにはアクセスできません。この違いは、WSLとWindowsホストが異なるネットワークスタックを持っているために発生します。

### 解決策
WSL内からWindowsホストで実行されているWebサーバーにアクセスするためには、`localhost`ではなく`host.docker.internal`という特別なドメイン名を使用します。このドメインは、Windowsホストを指し示し、WSL2やDockerコンテナからホスト側のサービスにアクセスする際に利用できます。

具体的には、以下のコマンドを使用します：

```bash
curl -v http://host.docker.internal/
```

これにより、WSL内からWindowsホスト上で実行されているサービスにアクセスでき、ホスト側のWebサーバーの応答を得ることができます。

## 3. 原因

この問題は、WSLとWindowsホストが異なるネットワークスタックを使用していることに起因しています。WSL2では、WindowsホストとWSL2インスタンスがそれぞれ独自のIPアドレスを持つため、`localhost`がWSL2インスタンス自身を指すようになり、ホスト側のサービスに直接アクセスできなくなります。

Microsoftが提供している`host.docker.internal`は、この問題を解決するための手段であり、WSL2からホスト側のサービスにアクセスするためのシンプルな方法です。

## 4. まとめ

WSL内からWindowsホストで動作しているサービスにアクセスする際には、`localhost`ではなく`host.docker.internal`を使用することで、ホスト側のサービスに正しくアクセスできます。これにより、WSL内での開発やテストがよりスムーズに行えるようになります。もし同様の問題に遭遇した場合、この手法を試してみてください。


<br><br>
**記事を執筆するにあたり、生成AIを使用しました。**
yukicoder No.83 最大マッチング　解説

[問題文](https://yukicoder.me/problems/no/83)

# 解説
まず、答えは最大$10^{10^4\times 5}$にもなる。よって、愚直に整数を一個一個試していく方法では到底間に合わない。
ここで考えよう。
まず、桁はできるだけ大きくしたい。なぜなら、桁が大きいほうがその分数字も大きくなるからである。
よって、できるだけ**マッチ棒を使わない**数字を探す。今回の場合それは$1$となる。
$1$を作るのにマッチ棒は$2$使うので、$1111$...$11$と$1$が$\lfloor \frac{N}{2}\rfloor$続く整数が答え...とはいかない。
なぜなら、$N$が奇数だった時に$1$本余ってしまうからである。
これを有効活用する方法はマッチ棒を$3$本ちょうど使い、かつ$1$より大きい数字でないとならない。
この条件を満たすのが$7$。
よって、$N$が奇数なら$1$を一つ$7$に変えればよい。
もちろん、$117$などよりも$711$の方が大きいので、最初の1桁目を$7$にすればよい。
実行時間は$O(N)$なので、十分高速。

# C++での解答例
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int N;cin>>N;
  if(N%2==1){
    cout<<7;
    N-=3;
  }
  while(N!=0){
    cout<<1;
    N-=2;
  }
  cout<<endl;
}
```
React公式ドキュメントを読む

## UIの記述
### 初めてのコンポーネント
- コンポーネントとはUIの構成部品である
- HTMLタグを組み合わせて構造化されたコンポーネントを作成できる
- 下記HTMLタグの組み合わせを`<TableOfContents />`としてコンポーネント化して再利用できる
```react
<article>
  <h1>My First Component</h1>
  <ol>
    <li>Components: UI Building Blocks</li>
    <li>Defining a Component</li>
    <li>Using a Component</li>
  </ol>
</article>
```

#### Reactコンポーネントの定義
- マークアップを添えることができる JavaScript関数と定義する
- コンポーネントは下記のような見た目となる
```react
// export default"がJavaScriptの構文
// "function Profile() { } "と書くことでProfileという名前のJavaScript関数を定義する
// JSXマークアップである"img"タグをreturnする
// JSX（JavaScript XML）は、JavaScriptの構文拡張で、JavaScriptファイル内にHTMLのようなコードを記述できるようにするもの
export default function Profile() {
  return (
    <img
      src="https://i.imgur.com/MK3eW3Am.jpg"
      alt="Katherine Johnson"
    />
  )
}
```
:::note warn
名前は`Profile`のように大文字から始めなければ動作しません
:::

- 下記のようにコンポーネントを使用する
```react:App.js
// "section"は小文字なのでHTMLタグと解釈される
// "Profile"は大文字なので独自コンポーネントと解釈される
function Profile() {
  return (
    <img
      src="https://i.imgur.com/MK3eW3As.jpg"
      alt="Katherine Johnson"
    />
  );
}

export default function Gallery() {
  return (
    <section>
      <h1>Amazing scientists</h1>
      <Profile />
      <Profile />
      <Profile />
    </section>
  );
}
```
- 最終的にブラウザが解釈するUI構成
```html
<section>
  <h1>Amazing scientists</h1>
  <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
  <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
  <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
</section>
```

#### コンポーネントのネストと整理方法
- 同じファイルに複数のコンポーネントを書いておくことも可能
- コンポーネントは、1 回しか使わないような UI コードやマークアップであっても、それらを整理するために有用
Laravel 学習(アプリ構成)

## はじめに
Laravelのアプリ構成について学んだことを記載していきます。

Laravelで作成されたプロジェクトはファイルやフォルダが多いので、
chatGPTに使用頻度の高いものをピックアップしてもらいました。
※現状ほぼchatGPTの回答を使っています。
　学習を進めていく中で更新していく予定です。

## アプリ構成

### 1. **app/**
   - **概要**: アプリケーションの主要なビジネスロジックが含まれるディレクトリです。
   - **主要サブディレクトリ**:
     - **Models/**: アプリケーションのデータベースのエンティティを表すEloquentモデルが配置されます。例: `User.php`。
     - **Http/Controllers/**: ユーザーのリクエストを処理するコントローラが配置されます。例: `HomeController.php`。
     - **Http/Middleware/**: リクエストがコントローラに渡される前に実行されるミドルウェアが配置されます。例: `Authenticate.php`。
     - **Providers/**: サービスプロバイダーが配置されます。アプリケーションの設定やサービスの登録を行う場所です。例: `AppServiceProvider.php`。

### 2. **routes/**
   - **概要**: アプリケーションのルーティング設定が含まれるディレクトリです。
   - **主要ファイル**:
     - **web.php**: Webアプリケーションのルーティング定義が書かれます。一般的なHTTPリクエスト（GET, POST, PUT, DELETEなど）のルートを定義します。
     - **api.php**: APIリクエストのルーティング定義が書かれます。`/api`プレフィックスのついたルートがここに記述されます。

### 3. **resources/views/**
   - **概要**: アプリケーションのビュー（テンプレート）が含まれるディレクトリです。
   - **主要ファイル**:
     - **Bladeテンプレートファイル**: LaravelのテンプレートエンジンであるBladeで記述されたファイルが含まれます。例: `welcome.blade.php`。ビューはユーザーに表示されるHTMLを生成します。

### 4. **config/**
   - **概要**: アプリケーションの設定ファイルが含まれるディレクトリです。
   - **主要ファイル**:
     - **app.php**: アプリケーションの基本設定が書かれています。アプリケーション名、タイムゾーン、ロケールなどが設定されます。
     - **database.php**: データベース接続の設定が書かれています。データベースの種類や接続情報などをここで管理します。

### 5. **database/migrations/**
   - **概要**: データベースのスキーマを管理するマイグレーションファイルが含まれるディレクトリです。
   - **主要ファイル**:
     - **マイグレーションファイル**: データベースのテーブルやカラムの作成・変更を定義するファイルが含まれます。マイグレーションを実行することで、データベーススキーマが自動的に更新されます。

### 6. **public/**
   - **概要**: Webサーバーが公開する静的ファイルが含まれるディレクトリです。
   - **主要ファイル**:
     - **index.php**: アプリケーションへのすべてのリクエストがこのファイルにルーティングされます。Laravelアプリケーションのエントリーポイントです。
     - **CSS、JavaScript、画像ファイル**: 静的なフロントエンドリソースがここに配置されます。

### 7. **storage/**
   - **概要**: アプリケーションによって生成されたファイルを保存するディレクトリです。
   - **主要サブディレクトリ**:
     - **logs/**: アプリケーションのログファイルがここに保存されます。例: `laravel.log`。
     - **app/**: アプリケーションが生成するファイルがここに保存されます。

### 8. **vendor/**
   - **概要**: Composerでインストールされた外部ライブラリが含まれるディレクトリです。
   - **主要サブディレクトリ**:
     - **autoload.php**: オートローダーのファイルです。外部パッケージを自動的にロードするために使用されます。

### 9. **artisan**
   - **概要**: LaravelのCLI（コマンドラインインターフェース）ツールであるArtisanを実行するためのスクリプトです。Artisanを使ってマイグレーション、シーディング、ルートリストの確認など、多くのタスクを自動化できます。

## 参考

上記ディレクトリの詳細や他のディレクトリについては下記サイトがわかりやすかったです。

https://qiita.com/shuntaro11/items/2a9153f3cacdd1169268
yukicoder No.82 市松模様　解説

[問題文](https://yukicoder.me/problems/no/82)

# 解説
まず、具体例を考える。
なお、実際のコードに合わせるため左上を$(0,0)$とする。
> $W=3,H=3,C=$'$B$'のとき
  $(1,1)=$'$B$'
  $(0,1)=$'$W$'
  $(2,2)=$'$B$'

これで分かったかもしれないが、この問題は **パリティ（偶奇）** について考える問題になっている。
具体的に言うと
> $a\hspace{1mm}mod \hspace{1mm}b=0$なら$C$
$a\hspace{1mm}mod \hspace{1mm}b=1$なら$C$じゃないほう

こんな感じに実装すればよい。
なおパリティの問題は競プロ頻出なので覚えておこう。
各$(i,j)$の構築は$O(1)$かかるので、実行時間は$O(HW)$。よって、十分高速。

# C++での解答例
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int W,H;char C;cin>>W>>H>>C;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      if((i+j)%2==0)cout<<C;
      else cout<<(char)('W'+'B'-C);
    }
    cout<<endl;
  }
}
```
障害切り分けに使える ブラウザの仕組み雑学

# 誰のための記事か？

Webフロントエンドの学習を始めたが
ブラウザの仕組みを学んだことがなく
障害切り分けに役立つ知識を3分くらいで得たい人向けの記事です。

# ブラウザの構成要素6つ

![img](https://cou929.nu/docs/how-browsers-work/_images/layers.png)
出典: [web.dev](https://web.dev/articles/howbrowserswork?hl=ja#translation)

*補足：レンダリングエンジンについて
狭義ではブラウザエンジンの一部がレンダリング(描画)エンジンです。
広義では同じものとして扱われることもあるため、ここでは「ブラウザエンジン」として扱います。

## 1.UI（ユーザーインターフェース）
ブラウザのUIを構成する要素、

意外にもUIに関する標準化などは存在しないため、
慣習などによって現代のブラウザのUIは作られています。

そのため特定ブラウザには存在する機能やボタンが、
別のブラウザでは存在しないということも考えられるため、
**ブラウザごと** に違いがあることは覚えておくとよいでしょう。

#### [起こりうる障害]
- PC変更時、昔はあったボタンがなくなった
- Webの特定機能が使えなくなった
⇒ Webアプリではなくブラウザが変わった？
⇒ 珍しいブラウザを使用している？

といった仮説を立てることができます。

続いて、ブラウザエンジンの違いを見ていきましょう。

## 2.ブラウザエンジン（レンダリングエンジン,HTMLレンダリングエンジン)
https://en.wikipedia.org/wiki/Browser_engine

HTMLとCSSを解析し、表示するための機能などを含む要素です。
**各ブラウザ**において最も大きな違いはここにあると言えるでしょう。

### 著名なブラウザにおけるエンジンの違い
#### [ブラウザエンジン(ブラウザ名)]
- Blink（Google Chrome, Microsoft Edge, Opera）
- WebKit（Google Chrome*IOS ,Safari）
- Gecko（Firefox）

#### [起こりうる障害]
- EdgeとOperaでは正常なのにFirefoxだけ表示がおかしい
- Operaでは描画が正常だが、Safariの端末ではUIが崩れる など
⇒ レンダリングエンジンの違い？

などが考えられるでしょう、
次に、ネットワーク関係の違いを見ていきます。

## 3.ネットワーク接続機能
HTTPリクエストなどを行うネットワーク関連の構成要素です。
使用するプロトコルは同じですが、実装方法は **ブラウザごと** に異なります

#### [起こりうる障害]
- なぜか特定端末だけネットワーク周りが正常に動作しない
- ほとんどの端末は正常なのに一部だけ動作しない端末がある　など
⇒ ネットワーク実装の違い？

などの仮説を立てられます。
続いて、UIバックエンドを見ていきます。

## 4.UIバックエンド
基本的なUI(テキストなど)を構成する要素、描画は **OS** によって異なります。

#### [起こりうる障害]
- なぜか特定OSのユーザーだけフォントがはみ出る
- ブラウザは一緒なのに、端末を変更したら文字が読みにくくなった
⇒ OSによる違い？

といった仮説を立てられます。

次にJavaScriptエンジンについて見ていきましょう。

## 5.JavaScriptエンジン
https://ja.wikipedia.org/wiki/JavaScript%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3

JavaScriptのコードを実行するための要素です。
**ブラウザごと**にエンジンの違いがあります。

### 著名なブラウザにおけるJavaScriptエンジンの違い
#### [JavaScriptエンジン名(ブラウザ名)]
- V8 (Google Chrome, Microsoft Edge)
- SpiderMonkey(Firefox)
- JavaScriptCore (Google Chrome*IOS, Safari)

#### [起こりうる障害]
- なぜか特定のブラウザだけページ表示が遅い
- とある関数が特定ブラウザでは動作しない
⇒ JavaScriptエンジンによる違い？

などの仮説を立てることができるでしょう。

## 6.データストレージ
キャッシュやCookieなどを保存する役割を持つ要素です。

#### [起こりうる障害]
- 古い情報が表示される
- たまに挙動が消える
⇒ キャッシュやCookie？

といった仮説を立てることができます。

　
以上、障害発生時の早期解決につながれば幸いです。
外付けSSDにMac経由でiPhoneのバックアップを取る設定の仕方

# 背景
手持ちのMacのディスク容量が小さいので、iPhoneのバックアップで容量が圧迫されて困っていた。そこで外付けSSDにiPhoneのバックアップを取るように設定を変更した。その手順を備忘のために記録しておく。実はこれまでも何回か同じことをやっているのだが、PCを新しくするたびに色々と調べてはピッタリな情報がなかなか出てこないので、次からはこの記事を参考にしたい。（2024/8/13）

# 手順
### 1. SSDの任意のフォルダ内にBackupという名前のフォルダを作成する
SSD内に適当にフォルダを作成し、その中に、Backupという名前のフォルダを作成する。

### 2. ターミナルにフルディスクアクセスの権限を与える
システム設定→プライバシー→フルディスクアクセスからターミナルにチェックを入れる。
これをしないと下でシンボリックリンクの作成時に権限が無いというエラーになる。

### 3. シンボリックリンクを作成する
/Users/{ユーザー名}/Library/Application Support/MobileSyncフォルダ内に、先ほど作ったBackupフォルダのシンボリックリンクを作成する。
以下のコマンドで作成できる。

ln -s /Volumes/{SSDの任意のフォルダ}/Backup "/Users/{ユーザー名}/Library/Application Support/MobileSync"

### 4. 後は通常のバックアップをすればバックアップがSSDに保存される。

## 注意事項
/Library にもApplication Supportというフォルダが存在するが、シンボリックリンクを作成するのはここではなく、/Users/{ユーザー名}/Library の下のものであることに注意。
HuggingfaceのLocal Apps and Hardwareとは

まとめると、登録すると、自分のハードの状況がわかるかも？

そしてアプリの場合は、リンクに出るようになる。(どれも今使ってないので便利さは不明)

## 例
ハードを登録すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/4a46b495-a112-1a99-e730-117d1da5fb68.png)

アプリを登録すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/791499ff-0fac-6713-b815-ffdb282b518f.png)
CODESYS OPCUA Client データソースマネージャー

この前作成したラズパイのOPCUA ServerはUa Expertを使っていたが
Client側もCODESYSで接続してみる。
https://qiita.com/1994koki/items/45ca298d50511feb8498

データソースマネージャーを使うものと使わないものがあり、
データソースマネージャーを使う方が簡単だろうと思いこっちを
使ってみたがセキュリティ有だからかうまく動かすことができなかった。
失敗したけど乗せておく。

# データソースマネージャー
オブジェクト追加からデータソースマネージャーを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/3d2c679b-9ce4-bf9c-6259-d0a20da797a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/093ea1cf-0314-5ee9-ac97-61364744c3c0.png)
作成すると下図のようにOPCUAServerを聞いてくるので
ラズパイのアドレスとセキュリティ設定と認証をユーザー名にして認証（図では何も書いてないが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/83090111-3388-97a1-0bac-272afe2ea667.png)
NEXTを押すとパスワードも聞かれるので入力
Ua Expert同様最初はエラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/a258069e-0c51-7718-ad77-e88bd8315957.png)
ラズパイ側のセキュリティにてTrustefdに入れて
CODESYS側でもう一回データソースの初期化を行った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/848c23ca-1527-7a19-868e-2939f45df46f.png)
ここでデータを読み出せたのでこれで終了と思っていたが、運転するとエラーになっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/f7e5c056-5c83-13c9-8ba7-8643510302ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/da48142c-0951-7bf4-4597-5d8265cc4232.png)
証明書の所でうまくいっていないような気がして
いろいろ触ってみたけど繋がらなかったので諦めました。
AtCoder Beginner Contest 157

## A - Duplex Printing

https://atcoder.jp/contests/abc157/tasks/abc157_a

### 解説

- n / 2 + n % 2 で求められる

### 実装例（C++）

```cpp
#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;

    int result = n / 2 + n % 2;

    cout << result << endl;
}
```

## B - Bingo

https://atcoder.jp/contests/abc157/tasks/abc157_b

### 解説

- Aを保存する二次元配列と印がついているかの二次元配列を作成する
- 判定の部分は自由に書いた（効率は良くない）

### 実装例（C++）

```cpp
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<int>> a(3, vector<int>(3));

    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            cin >> a[i][j];
        }
    }

    int n;
    cin >> n;

    vector<vector<bool>> bool_a(3, vector<bool>(3));

    for (int i = 0; i < n; i++){
        int b;
        cin >> b;
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                if (a[i][j] == b) {
                    bool_a[i][j] = true;
                }
            }
        }
    }

    bool ans = false;

    for (int i = 0; i < 3; i++) {
        if (bool_a[i][0] && bool_a[i][1] && bool_a[i][2]) {
            ans = true;
        }
        if (bool_a[0][i] && bool_a[1][i] && bool_a[2][i]) {
            ans = true;
        }
    }

    if (bool_a[0][0] && bool_a[1][1] && bool_a[2][2]) {
        ans = true;
    }
    if (bool_a[0][2] && bool_a[1][1] && bool_a[2][0]) {
        ans = true;
    }

    if (ans == true) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
}
```
Laravel の laravel と framework の違い

数年ぶりに Laravel に触れて、禿げそうなくらい詰まったポイントがあるので備忘がてらまとめておきます。

# 結論

- [laravel/laravel](https://github.com/laravel/laravel) リポジトリは Laravel プロジェクトのスケルトンコード
- [laravel/framework](https://github.com/laravel/framework) リポジトリはいわゆる依存ライブラリ

# なんでそういう話が気になったのか

とあるプロジェクトを担当することになり Laravel のコードベースを眺めていたが、あまりに久しぶりだったので、何が Laravel のコードで何が開発フェイズで追加されたコードかわかりませんでした。

しかも Git 管理もされておらず 💩 履歴を追うこともできず。。。

ということで [Creating a Laravel Project](https://laravel.com/docs/11.x/installation#creating-a-laravel-project) した commit に対して現状のソースコードの Pull Request を作成して差分から開発フェイズで追加されたコードを特定しようとしました。

ところが思ったより差分が多く、かつ、これはスケルトンコードやろってものも差分として見えてしまいました。

案の定 `composer.lock` の laravel/framework にも差分が出ていました。
しかし [Creating a Laravel Project](https://laravel.com/docs/11.x/installation#creating-a-laravel-project) では `laravel/laravel` のバージョンは指定できますが `laravel/framework` のバージョンは指定できません。

ここで 1 時間以上時間を溶かし、禿げかけました 💩

しかし、以下のドキュメントを見たりして上記結論を導き出したのであった！

- https://getcomposer.org/doc/03-cli.md#create-project
  - create-project コマンドは doing a git clone/svn checkout followed by a composer install of the vendors. と等価でっせ的な内容
- https://github.com/laravel/laravel/pull/6188
  - この PR で laravel/laravel のスケルトンコードを修正していた

# 感想

なんか PHP 久しぶりすぎて詰まっちゃったので、どなたか同じ疑問持ってる方の参考になったら嬉しいです！
Happy Coding!