OmniAICreator/Qiita-1.07M huggingface dataset:
命名規則の使い分け

# はじめに
みなさんこんにちは、あるいはこんばんは。Conte です。
普段何気なくつけている変数名や関数名。ですが、プロジェクトが進むにつれて、その重要性に気付くことはありませんか？ 今回は、開発の効率化やコードの可読性を高めるための命名規則についてまとめました。少しの工夫で、未来の自分やチームメンバが開発しやすいプロジェクトになるかもしれません。
また、Javaを使用したWEBアプリケーションでの利用例とともに、見てきます。(フロント・バック・DB含む)。
※ 用途はあくまで一例デス。PJにより使い分けて下さい。

# キャメルケース・ローワーキャメルケース
- 単語の先頭を大文字で繋げる
- 先頭は小文字
## 用途
- メソッド名
- 変数名

## 例
```
- isFirstName
- getName
- setName
```

# パスカルケース・アッパーキャメルケース
- 単語の先頭を大文字で繋げる
- 先頭は大文字

## 例
```
- UserName
- UserController
```

## 用途
- クラス名

# スネークケース・ローワースネークケース
- 単語の先頭をアンダーバーで繋げる
- 全て小文字
## 例
```
- user_id
- user_name
```

## 用途
- DBのテーブル名
- DBのカラム名 

# コンスタントケース・アッパースネークケース
- 単語の先頭をアンダーバーで繋げる
- 全て大文字

## 例
```
- DATE_FORMAT
- ADMIN_ROLE
```

## 用途
- 定数宣言 

# ケバブケース・ローワーケバブケース・チェインケース
- 単語の先頭をハイフンで繋げる
- 全て小文字

## 例
```
- user-name
- user-password
```

## 用途
- HTMLの要素名 (タグ名など)
- HTMLの属性名 （クラス名など）

# 最後に筆者からの命名アドバイス
単語は略して書かないことをお勧めします。自分だけ分かれば良いのは個人開発までです。
新規参画者のことを考えましょう。
## 例
- CD -> Code
- DT -> Date
愛読している技術雑誌

#　はじめに
愛読している技術雑誌を挙げたいと思います

## 愛読している技術雑誌
①日程ソフトウェア
②Software Design

## 感想
①の日経ソフトウェアは日経Linuxの廃刊で、日経Linuxの連載記事が日経ソフトウェアに移ったので愛読しています。
②のSoftware Designは現場で使える事例を紹介しているので、愛読しています。

# 最後に
電子書籍も調査しようと思います。
Docker学習メモ #1

Dockerの学習記録 # 1。

## Dockerfileとは？

コンテナイメージをビルドする際の、指示書。

[Dockerfile作成時のルール](https://www.notion.so/Dockerfile-282ac99756724e24a8ca16435040af57?pvs=21) ※作成中

## イメージとは？

コンテナーの作成に使用される他のリソースに依存しない、単独でも実行可能なファイルのこと。

## コンテナとは？

ホスト上の他のプロセスと分離されているマシン上の**プロセス**のこと。
プロセスであることが肝。


# 流れ
Dockerfileでイメージを作成し、イメージを用いて、コンテナを実行する。

![dockerfile-image-container.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470238/a9af0236-5d1a-bdb1-a7a5-b2dc332cfb68.png)
symbol-bootstrap v1.1.11 をまっさらからインストール

symbol-bootstrap v1.1.10 から v1.1.11 へのアップデート手順は見つかるが、v1.1.11 まっさらからインストール手順が見当たらないので残しておきます。なお、本記事はまっさらの Debian に symbol-bootstrap をインストールする手順です。

### OSアップデート
```
$ su -
# apt update
# apt upgrade
# apt install vim curl ssh
```

### Debian デフォルト設定の20分サスペンドを停止
```
$ su -
# vim /usr/share/gdm/dconf/90-debian-settings
----
-# sleep-inactive-ac-timeout=1200
+sleep-inactive-ac-timeout=0
-# sleep-inactive-battery-timeout=1200
+sleep-inactive-battery-timeout=0
----
OS再起動して反映させる
# reboot
```

### Docker と docker-compose 1.29.2 をインストール
```
# apt install ca-certificates lsb-release
# mkdir -p /etc/apt/keyrings
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# apt update
# apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```

### symbolユーザーを作成しsudoグループに追加
```
# adduser symbol
New password:
Retype new password:
⇒あとはリターンをしておく
# cat /etc/group | grep sudo
# usermod -aG sudo symbol
# cat /etc/group | grep sudo
# exit
$ su - symbol
```

### symbolユーザーをdockerグループに追加
```
$ su -
# cat /etc/group | grep docker
# usermod -aG docker symbol
# cat /etc/group | grep docker
# exit
$ exit
設定を反映させるため再度ログイン
$ su - symbol
動作テスト
$ docker run hello-world
Hello from Docker!
⇒OK
```

### npmコマンドをインストール
```
$ curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
$ source ~/.nvm/nvm.sh
$ nvm install v16
$ npm -v
8.19.4
```

### symbol-bootstrap v1.1.11のインストール
```
$ su - symbol
$ git clone https://github.com/symbol/symbol-bootstrap
$ cd symbol-bootstrap
$ npm ci
$ npm audit fix
$ npm install -g .
$ symbol-bootstrap -v
⇒symbol-bootstrap/1.1.11 linux-x64 node-v16.20.2
$ symbol-bootstrap wizard
⇒適宜設定を行う
```
参考
https://symbol-community.com/ja/docs/5

### symbol-bootstrap wizard後に以下の設定を追記
```
$ vim custom-preset.yml
        host: <適宜>
        friendlyName: <適宜>
        maxUnlockedAccounts: <適宜>
        beneficiaryAddress: <ハーベストさせたいアドレス>
        minFeeMultiplier: 10                         # トランザクション手数料をお安く
        transactionSelectionStrategy: oldest         # 適宜
        maxChainBytesPerSyncAttempt: 50MB            # デカブロックの登攀設定
        messageSynchronizationMaxResponseSize: 5MB   # デカブロックの登攀設定
        blockDisruptorMaxMemorySize: 1000MB          # デカブロックの登攀設定

$ symbol-bootstrap start -p mainnet -a dual -c custom-preset.yml -d (初回のみの)
$ symbol-bootstrap healthCheck
$ symbol-bootstrap stop
$ symbol-bootstrap run -d (2回目から)
```
Googleが提供するAI プラットフォームVertex AIとGoogle AI Studioの機能比較

最近API経由で様々な基盤モデルをテストすることがあり、Googleが提供する似たようなAIプラットフォームの違いがわからなくなったので個人的に調べてみました。

# Googleが提供するAIプラットフォームの機能比較

Google Cloudが提供する Vertex AIとGoogle AI Studioは、どちらも強力な AI 開発プラットフォームですが、それぞれ異なる特徴と強みを持っています。この記事では、両プラットフォームの比較を行い、それぞれの特徴をわかりやすくまとめています。

### Vertex AI: 機械学習のあらゆる側面をカバーする包括的プラットフォーム

Vertex AI は、Google Cloud が提供する機械学習プラットフォームであり、データの準備からモデルのトレーニング、デプロイ、モニタリングまで、機械学習ワークフロー全体を包括的にサポートします。

**Vertex AI の主な特徴**

* **AutoML とカスタムモデル:** AutoML を使用してコーディングなしでモデルを構築できるだけでなく、TensorFlow や PyTorch などのフレームワークを使用してカスタムモデルを構築することも可能です。
* **多様なモデルタイプ:** 画像分類、物体検出、自然言語処理、時系列予測など、さまざまなタスクに対応する多様なモデルタイプを提供します。
* **MLOps 機能:** モデルのバージョン管理、実験トラッキング、パイプラインの自動化など、MLOps (機械学習オペレーション) 機能を備えており、モデルの開発と運用を効率化します。
* **スケーラビリティ:** 大規模なデータセットや複雑なモデルにも対応できるスケーラビリティを備えています。

**Vertex AI のユースケース**

* **需要予測:** 時系列データに基づいて製品やサービスの需要を予測し、在庫管理や販売戦略の最適化する
* **不正検知:** オンラインアクティビティなどの不正行為を検出し、リスクを軽減する
* **レコメンデーションシステム:** ユーザーの行動履歴や好みに基づいてパーソナライズされた商品やコンテンツを推薦する

### Google AI Studio（Gemini for Developers）: 生成AI 開発に特化した直感的なプラットフォーム

Google AI Studio は、Google が提供する生成 AI 開発プラットフォームであり、主に画像生成やテキスト生成などのタスクに特化しています。Imagen や Gemini などの Google の最新生成AI モデルを利用して、高品質なコンテンツを生成するアプリケーションを開発できる。

**Google AI Studio の主な特徴**

* **直感的なインターフェース:** コーディング経験が少ないユーザーでも簡単に利用できる直感的なインターフェースを備えている
* **強力な生成AI モデル:** Imagen や Gemini などの Google の最新生成AI モデルを利用して、高品質な画像やテキストを生成できる
* **コラボレーション機能:** チームでの共同作業をサポートする機能を備えており、モデルやデータの共有、実験結果の比較などが可能

**Google AI Studio のユースケース**

* **マーケティングコンテンツ生成:** 広告コピー、キャッチフレーズ、製品説明などを自動生成し、マーケティング活動を効率化
* **クリエイティブコンテンツ生成:** アート作品、デザイン、音楽などを生成し、クリエイティブな表現を支援
* **カスタマーサポート:** 顧客からの問い合わせに自動応答するチャットボットを開発し、カスタマーサポート業務を効率化
* **教育コンテンツ生成:** 教材、クイズ、学習ゲームなどを生成し、教育現場を支援

### Vertex AI vs. Google AI Studio 比較表

| 特徴 | Vertex AI | Google AI Studio |
|---|---|---|
| 対象 | 機械学習全般 | 生成AI |
| モデル構築 | AutoML / カスタムモデル | Google の生成AI モデル |
| インターフェース | コードベース / GUI | 直感的なGUI |
| 用途 | 多様な機械学習タスク | 生成AI アプリケーションの開発 |
| スケーラビリティ | 高 | 中 |
| カスタマイズ性 | 高 | 中 |

### まとめ

Vertex AI と Google AI Studio は、どちらも強力な AI 開発プラットフォームですが、それぞれ異なる特徴と強みを持っています。Vertex AI は、機械学習全般をカバーする包括的なプラットフォームであり、AutoML とカスタムモデルの両方をサポートしています。一方、Google AI Studio は、生成AI に特化したプラットフォームであり、直感的なインターフェースで簡単に生成AI アプリケーションを開発できます。

どちらのプラットフォームを選ぶかは目的や要件によって異なるため、機械学習全般に取り組みたい場合はVertex AIを、生成AI アプリケーションを開発したい場合はGoogle AI Studioを選択することをオススメします。
【BLOCS】テーブルタイプの入力画面を作る

# テーブルタイプの入力画面
複数件のレコードを一度に入力できる画面を、テーブルタイプの入力画面と呼びます。大量のデータを一度に入力したい時に便利です。

# テンプレートを作る
まず１件の入力画面のテンプレートを作ります。次に `data-loop` で入力フォームを複数件にして、テーブルタイプの入力画面にします。

```html:create.blocs.html
    <tbody data-loop=$books>
        <tr>
            <th>
                <label for="name">名前</label> *
            </th>
            <td>
                <input type='text' class='form-control' value='' id="name" name="name" />
            </td>
        </tr>
```

バリデーションは、ワイルドカードで項目を指定します。
```html
<!-- !books.*.name='required' data-lang='入力してください' --> 
```

```html
<!-- !books.*.name='required_with:books.*.price' data-lang='価格を入力してください' --> 
```

入力値は配列になるので、エラー表示には添字は `$loop->index` の指定が必要です。
```html:create.blocs.html
    <tbody data-loop=$books>
        <tr>
            <th>
                <label for="name">名前</label> *
            </th>
            <td>
                <input type='text' class='form-control' value='' id="name" name="name" required />

                <!-- !books.*.name='required' data-lang='入力してください' -->
                @error('books.'.$loop->index.'.name') <div class='text-danger'>{{ $message }}</div> @enderror
            </td>
        </tr>
```

# コントローラーで初期データを作る
コントローラーで初期データを作らないと入力フォームが表示されません。このように指定すると、初期状態で２件の入力フォームを表示します。

```php:app\Http\Requests\BookRequest.php
    protected function prepareCreate()
    {
        old('books') || $this->val['books'] = [[], []];
    }
```

# まとめ

今回は、テーブルタイプの入力画面を作りました。プログラマーの労力を減らせる工夫を色々と取り入れてBLOCSを開発しています。PHP初学者や、プログラムに苦手意識のある方に特にオススメです。最後まで読んでいただき、ありがとうございました！

# 関連サイト
1. [サービスサイト](https://blocs.jp)
2. [GitHub](https://github.com/blocs/blocs)
3. [Packagist](https://packagist.org/packages/blocs/blocs)
EACCES: permission deniedの解決方法

# 背景と問題
Reactの新しいプロジェクトを作り、`npm start`で実行したら以下のエラーメッセージが表示された。

```bash:bash
[eslint] EACCES: permission denied, mkdir '/Users/username/Documents/dev/react-teset-app/node_modules/.cache'
```

# 原因
上記のエラーメッセージは**ディレクトリの作成権限**がないため発生している。
（nodeの再インストールも試してみたがエラーはそのままだった。）

# 解決

ターミナルで以下のコマンドを実行することで解決できた。
下記のコマンドはプロジェクトディレクトリに適切な権限を設定している。

:::note warn 
ディレクトリのパスは各自で適切に変更して実行してください。
:::

```bash:bash
sudo chown -R $USER:$GROUP /Users/username/Documents/dev/react-teset-app
```

### コマンドの解説

- `sudo`

: スーパーユーザー（管理者）権限でコマンドを実行する。

- `chown`

: "change owner" の略で、ファイルやディレクトリの所有者とグループを変更する。

- `-R`

: "recursive" の略で、指定されたディレクトリのすべてのサブディレクトリとファイルに対して変更を適用する。

- `$USER:$GROUP`

: `$USER`と`$GROUP`は環境変数。通常、`$USER`は**現在ログインしているユーザーの名前**を、`$GROUP`は**ユーザーが属するデフォルトのグループ名**を表す。
この部分は、実行時に環境変数に設定された値に置き換る。
GitHub Copilotは微妙になってきたのかもしれない

個人的「質はともかく継続する」37日目です

## 激動のAI乱世時代

少し前まではChatGPTが頭ひとつ抜きん出ていましたが、いまやGeminiやらClaudeやらStable DiffusionやらたくさんのAIが出てきました。その性能は日々更新されており、昨日まではGeminiがいいスコアだったかと思えば今日はClaudeが上回る、ということが繰り返されている印象です。
そんな中、割と早めにサービスとして確立され、エンジニアから歓喜と悲鳴が上がったのがGitHub Copilot でした。少しコードを入れるとインテリセンスの如く続きを表示してくれるので、タブを連打でやりたいことができる。コメントにやりたいことを書くと、続きを予想してコードを出してくれる。コードを選択して「説明して」と聞くと、そのコードを説明してくれる。私も利用していますが、本当に便利なAIです。
...ですが、最近は利用回数が減ってきました。

## プログラミングに関すること以外も聞きたい

GitHub Copilotはプログラミングに特化したAIです。プログラミングに関すること、あるいはその周辺に関するGitHubに関することなんかも答えてくれます。
が、関係ないことは一切答えてくれません。当然と言えば当然なんですが、その判定がかなり厳しい印象があります。
また、割と直前にした質問を忘れがちな傾向も感じます。あるコードについて説明を求め、さらにその中のメソッドについて聞いて見たときに、「プログラミングに関することしか答えられない」と言われることがあります。
そして、プログラミングや開発をしている時に聞きたいのは、プログラミングに関することだけではありません。
変数名を考える時に、英語を知りたい時とかもありますし、考え方を確認したい時なんかもあります。
こういうときに、chatGPTやGeminiならば回答してくれますが、GitHub Copilotは答えてくれないことが多いのです。
一方で、chatGPTなんかもコードを書いてくれるし、GitHub Copilotと遜色ない回答を出してくれます。
こうなると、Copilotの利点があまり多くなくなってきます。入力補完は強力で便利ではありますが、VSCodeなんかだと代替となる拡張機能が出てきたりとか、cursorなんかもありますよね。

## プログラミング特化型AIはいらないのかもしれない

ということで、最近は汎用AIを使うことが多くなってきました。初めて使った当初はすごく便利でいいなぁと思っていたのですが、それ以外の汎用AIの進化が凄まじく、だんだんと見劣りしてきている印象です。
先ほども書きましたが、プログラミングに限らず答えてくれるAIのほうが、特化型よりも利便性も高く、コードも悪くない。
もはやプログラミング特化型AIはいらないのかもしれません。
もちろん、これからどんどんと進化する可能性もあります。
GitHub Copilotには頑張ってほしいなぁと思います。
Express.jsとPostgreSQLを使った基本的なサーバー構築

# Express.jsとPostgreSQLを使った基本的なサーバー構築
この記事では、Node.jsのフレームワークであるExpress.jsを使用して基本的なサーバーを構築し、PostgreSQLデータベースと連携する方法を紹介します。静的ファイルの提供、データの取得、データの送信方法について解説します。








![napkin-selection (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690843/f89a53d1-101a-aa45-74ae-38725847456e.png)


必要なnpmパッケージ
```terminal
npm install express pg
```
使用するnpmパッケージ
express: Node.js用のウェブフレームワークで、サーバーの構築に使用します。
pg: Node.js用のPostgreSQLクライアントで、データベース接続に使用します。

PostgreSQLデータベースに接続するための設定を行います。

```javascript
const { Pool } = require("pg");

const pool = new Pool({
  user: "your_db_user",
  host: "localhost",
  database: "your_db_name",
  password: "your_db_password",
  port: 5432,
});

module.exports = {
  query: (text, params) => pool.query(text, params),
};
```
サーバー設定 (server.js)
以下のコードをserver.jsに追加し、Expressサーバーを設定します。

```javascript
const express = require("express");
const path = require("path");
const DB = require("./db/db");
const app = express();
const port = 5000;

app.use(express.json());
app.use(express.static("./public"));

// ルートエンドポイントでindex.htmlを提供
app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname, "public", "index.html"));
});

// データベースからユーザーデータを取得
app.get("/new", async (req, res) => {
  try {
    const result = await DB.query("SELECT * FROM users;");
    console.log(result.rows);
    res.json(result.rows);
  } catch (error) {
    console.error("エラーが発生", error);
    res.status(500).send("エラー発生");
  }
});

// フォームデータの受け取り
app.post("/submit", (req, res) => {
  const { name, email, message } = req.body;
  console.log(name);
  console.log(email);
  console.log(message);
  res.send("データ獲得");
});
```
Postmanを使用して、 http://localhost:5000/submit にPOSTリクエストを送り、データがコンソールに出力されることを確認します。

# 【まとめ】
Express.jsとPostgreSQLを使用して基本的なサーバーを構築する方法について紹介しました。静的ファイルの提供、データベースからのデータ取得、フォームデータの受け取り方法についても解説しました。
Gitを理解する（概要）

みなさんこんにちは。hagixです。

前回の記事ではGitの詳細を説明する前に、
そもそも、バージョン管理システムとは何か、バージョン管理システムの歴史についてお話ししました。

今回はいよいよGitの仕組みについてお話ししたいと思います。

# Gitのコンポーネント
まずはGitを構成するコンポーネントについてお話しします。

Gitは、GitサーバとGitクライアントの２つのコンポーネントから成り立ちます。

```plantuml
node1 : Gitサーバ 
node2 : Gitクライアント
node3 : Git GUI
node4 : Git CUI
node1 <--> node2
node2 -- node3
node2 -- node4
node3 <-> node4
```
## Gitサーバとは
GitサーバはGitのリモートリポジトリが格納されています。
GitHubやGitLabといったサービスを使ってホスティングするほか、自分たちでGitサーバを構築することもできます。

## Gitクライアントとは
Gitクライアントは、Gitサーバ上のリポジトリをローカルにコピーしたり、コピーしたローカルリポジトリにさまざまな操作を加えることができます。
CUI/GUI両方が用意されており、GUIはCUIのコマンドラインを複数同時に実行するためのコマンドが用意されていたりします。

## リポジトリとは
ここで、リポジトリ、という言葉が出てきました。
Gitを理解する上で非常に重要な概念なので、後ほど詳細は説明いたしますが、
ここでは、すべての変更履歴が格納された箱のようなもの、と、いったん考えてください。

ここで重要なのは、Gitサーバに存在するリモートのリポジトリ（全ての変更履歴）を、Gitクライアントを使ってローカルにコピーし、ローカルリポジトリとして扱うということです。

CVSやSVNは中央のサーバを一つ立てて、そこに全ての変更点をコミットしていきました。
一方、Gitは、リモートのリポジトリをローカルにコピーし、コピーしたローカルリポジトリにさまざまな変更を加えたものを、リモートリポジトリにPushしたり、
また、ローカルに新しい空のリポジトリを作成し、リモートリポジトリにPushする、という使い方も可能となります。

これにより、中央との接続がない状態でも作業ができるなど、さまざまな利点を得ることが可能となります。

### ローカルリポジトリの構成
それでは、改めてリポジトリとは何かを見ていきましょう。
端末上で実際にGitのローカルリポジトリを作ってみたいと思います。

端末上のターミナルを開き、WORK_DIRECTORYを作った後、そこに移動してさらにindex.htmlを作ってください。
``` bash
mkdir WORK_DIRECTORY
cd WORK_DIRECTORY
echo "hello,Git" > index.html
```

続いて、git --versionと入力してみてください。
下記のようにバージョンが表示されましたか？
``` bash
MacBook-Air .git % git --version
git version 2.39.3 (Apple Git-146)
```
私の手元の端末はMacBookAirのため、Appleが用意したGitが入っておりました。
もし、入っていない場合は、下記のURLを参考に、Gitをインストールしてみてください。

https://git-scm.com/book/ja/v2/使い始める-Gitのインストール

Gitをインストールしましたら、続いて下記のコマンドを実行してください。
``` bash
git init
```
その後、下記のコマンドを実行すると、.gitというこれまでみたことのないディレクトリができているはずです。
``` bash
MacBook-Air WORK_DIRECTORY % ls -ltra
total 0
drwxr-xr-x   3 test  staff    96  7 14 20:32 .
drwxr-xr-x   9 test  staff   288  7 14 20:32 .git
drwxr-x---+ 35 test  staff  1120  7 14 20:33 ..
-rw-r--r--   1 test  staff    11  7 14 20:54 index.html
```
ここで表示される.gitこそが、リポジトリの実態です。

ここまでのお話で、バージョン管理システムはさまざまな変更履歴を管理するシステムとお話ししました。
変更履歴を管理するためには、管理する場所が必要です。
そして、Gitでは、その変更を管理する場所が、今回作成した.gitと場所なのです。

ここで作ったWORK_DIRECOTRYとその中に存在するindex.html、.git全てを合わせてリポジトリとして認識します。

また、Gitは、.gitが置かれているディレクトリに存在するファイルやディレクトリをワーキングツリーと呼び、Git配下にある資産として認識します。
今回の例で言いますと、index.htmlをワーキングツリーと呼びます。
ワーキングツリーが存在しない、つまり、.gitのみのリポジトリをベアリポジトリ、ワーキングツリーが存在するリポジトリを、ノンベアリポジトリと呼びます。

# まとめ
この記事では、Gitの概要についてお話ししました。
Gitを構成するコンポーネントは、GitサーバとGitクライアントの２種類があります。
GitクライアントはさらにGUIとCUIの２つが存在します。
さらに、Gitを理解する上で基本的な概念となるリポジトリについてお話ししました。
リポジトリとは、gitにおいて変更履歴を管理する場所であり、git initによって作られる.gitそのもののことです。

また、.gitと同列にあるディレクトリやファイルをワーキングツリーと呼び、GitはこれらのファイルをGit管理下にあるコンテンツとしてみなします。

Gitサーバはリモートリポジトリを、Gitクラインとはローカルリポジトリをそれぞれ持っており、基本的にローカルリポジトリに変更を加えたものを、リモートリポジトリに反映させるという方法をとっていくことになります。

次の記事では、ワーキングツリーに変更を加えてリポジトリに反映させます。
そして、.gitの中身を見ていくことで、さらに、Gitの詳細についてお話ししていきたいと思います。
Golangのスライスについて

# Golangのスライスについて
Golang（Go言語）では、スライスは非常に重要なデータ構造です。スライスは、配列の一部を参照する柔軟で強力な方法を提供します。この記事では、スライスの基本的な使い方とその特性について説明します。
## スライスの基本
スライスは、配列の一部を参照するためのデータ構造です。スライスは、配列の要素へのポインタ、長さ、および容量を持っています。以下は、スライスの基本的な宣言と使用方法です。
```go:例
package main

import "fmt"

func main() {
    // 配列を作成
    arr := [5]int{1, 2, 3, 4, 5}

    // スライスを作成
    slice := arr[1:4]

    fmt.Println("配列:", arr)
    fmt.Println("スライス:", slice)
}
```
```:結果
配列: [1 2 3 4 5]
スライス: [2 3 4]
```
このコードでは、arrという配列からsliceというスライスを作成しています。スライスは、配列の2番目から4番目の要素を参照しています。
## スライスの特性
#### 長さと容量
スライスには長さ（length）と容量（capacity）があります。長さはスライス内の要素の数を示し、容量はスライスの開始位置から配列の終わりまでの要素の数を示します。
```go:例
package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    slice := arr[1:4]

    fmt.Println("スライスの長さ:", len(slice))
    fmt.Println("スライスの容量:", cap(slice))
}
```
```:結果
スライスの長さ: 3
スライスの容量: 4
```
スライスの操作
スライスは、append関数を使用して要素を追加することができます。append関数は、新しいスライスを返します。
```go:例
package main

import "fmt"

func main() {
    slice := []int{1, 2, 3}
    slice = append(slice, 4, 5)

    fmt.Println("スライス:", slice)
}
```
```:結果
スライス: [1 2 3 4 5]
```
#### スライスのコピー
スライスをコピーするには、copy関数を使用します。copy関数は、コピーされた要素の数を返します。
```go:例
package main

import "fmt"

func main() {
    src := []int{1, 2, 3}
    dest := make([]int, len(src))

    copy(dest, src)

    fmt.Println("コピー元:", src)
    fmt.Println("コピー先:", dest)
}
```
```:結果
コピー元: [1 2 3]
コピー先: [1 2 3]
```
## まとめ
Golangのスライスは、配列の一部を柔軟に操作するための強力なツールです。スライスの長さと容量、appendやcopy関数を使った操作方法を理解することで、効率的にデータを扱うことができます。
ABC342Dを解いた


筆者はレート600前後の茶色コーダ

7/10開催のADTで登場した以下のABCの過去問題を解いていく

https://atcoder.jp/contests/abc342/tasks/abc342_d

ADT(ALL)のページ

https://atcoder.jp/contests/adt_all_20240710_3/tasks/abc342_d

# 実装コード

解説によるとそれぞれの数$A_i$を割り切れる最大の平方数$d_{A_i}$を使って$\frac{A_i}{d_{A_i}}$が同じやつを探すらしい。

最初に0の個数$c_0$を使って$S_0 = c_0\times(N-c_0)$を計算
`Counter`で同じ$\frac{A_i}{d_{A_i}}=b$の出現数$c_b$を出して、
同じ$c_b$の出現数$v_{c_b}$の数え上げをまた`Counter`で行って
その`Counter`の`dict.items()`の値$k,v_k$を使って $S_k = \_kC_{2} \times v_k$とした場合の
ans$=S_0+\sum_{k\ge2}S_k$を出力すればOK

…なんだけどすごい冗長的な説明になってしまった。とりあえずコードでニュアンスがわかればと思う。

```python
from collections import Counter
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def kth_root_floor(x, k=2):
    if x == 0:
        return 0
    n = x
    while True:
        t = ((k - 1) * n + x // (n ** (k - 1))) // k
        if t >= n:
            return n
        n = t

def div_seq(a):
    if a == 0: return 0
    d=1
    for b in range(1,a):
        b2 = b * b
        if a % b2 == 0:
            d = b2
        if b2 > a:
            break
    return a//d

def main():
    N = rI()
    A = rLI()
    Ad = [div_seq(a)  for a in A]
    c = Counter(Ad)
    cc = Counter(c.values())
    ans = (N-c[0])*c[0]
    for k,v in cc.items():
        if k < 2:
            continue
        ans += (k*(k-1))*v//2
    
    print(ans)
if __name__ == '__main__':
    main()

```


# まとめ
ABC342Dを解いた、解法には各数を割り切れる最大の平方数で割った後の数の組み合わせを列挙した。

# 感想
この問題の解法はシンプルだが、組み合わせを数え上げに居実装したコードの解説に苦労を要した。
もう少しスマートなコードを書いて説明のしやすさも求めていきたい。(こういう説明のしやすいコードを作ることが実際の開発現場で作ったコードの保守の話につながると思うので)

# 余談
自分が始めて参加したのはABC343なのでこれはその前の回の問題だったが、それに気づいたのは解き始めてからだいぶあとに問題ページ見たタイミングだった(A問題の名前には見覚えがあったので)
折り紙で万能チューリングマシンを作る！？ - 理論的な「折り紙コンピュータ」の設計

## はじめに

皆さんは「折り紙コンピュータ」という言葉を聞いたことがありますか？
最近、オーストラリアのメルボルン大学の研究者が、折り紙を使って理論上の万能チューリングマシン（UTM）を設計する方法を提案した論文を発表しました。この記事では、その研究内容と意義について解説します。

## 研究の概要

論文のタイトルは「An origami Universal Turing Machine design」で、著者はMichael Assis氏です。この研究の主な目的は、**折り紙を使って任意の計算可能な関数を計算できることを理論的に示す**ことでした。

## 折り紙コンピュータの仕組み

### 1. バイナリ状態の表現

折り紙コンピュータでは、データを以下のように表現します：

- 0と1の2進数を、折り目の層の順序で表現
- 平行な山折りと谷折りを使用
- 特定の方向を選択して定義

![Binary states](https://arxiv.org/html/2406.08490v2/extracted/5685164/states.png)

### 2. NANDゲートの実装

コンピュータの基本的な論理回路であるNANDゲートを折り紙で実装します。これには以下の要素が必要です：

- NAE（Not All Equal）クローズ：3つの入力信号を受け取り、それらが全て等しくない場合にのみ平坦に折れる構造
- リフレクターガジェット：入力信号を2つの出力信号に変換する構造
- 回転、複製、NOTゲートなどの新しいガジェット

これらを組み合わせて、NANDゲートの真理値表を実現します。

![NAND gate](https://levtech.jp/media/wp-content/uploads/2024/06/%E7%94%BB%E5%83%8F4.png)

### 3. メモリの実装

計算には記憶機能も必要です。研究では、D型フリップフロップレジスタを使ってメモリを構築する方法を示しています。
![Dflipflop](https://arxiv.org/html/2406.08490v2/extracted/5685164/dflipflop.png)

- NANDゲートとクロック信号を組み合わせて実装
- クロック信号は、一定間隔で状態が反転する折り目で表現

## 研究の意義

この研究は以下のような意義があります：

1. 折り紙が理論上、あらゆる計算可能な関数を計算できることを示した
2. 計算の本質や物理的実装の可能性について、新たな視点を提供
3. 折り紙の計算能力に関する理論的な証明を提供

## 限界と今後の展望

しかし、この研究にはいくつかの限界があります：

- あくまで理論的な証明であり、実用的なデバイスの製作を目指すものではない
- 無限の大きさの紙と無限のメモリが必要という前提がある
- 実際の計算効率は非常に低いと予想される

今後は、この理論をベースにしたより実用的な応用や、他の物理的媒体での計算モデルの探求などが期待されます。

## まとめ

折り紙コンピュータの研究は、コンピュータサイエンスの基本原理を新しい視点から探求する興味深い取り組みです。実用化は難しいかもしれませんが、計算とは何か、どのような物理的実装が可能か？
自分自身考えさせられる論文でした。


## 参考文献

1. Michael Assis, "An origami Universal Turing Machine design", arXiv:2406.08490v2, 2024
2. Seamless, 「"折り紙"コンピュータ」。折り目で「0」と「1」を表現しNANDゲート実装【研究紹介】, 2024
PRを出したブランチとmainブランチとのコンフリクトを解決する

# はじめに
つい最近PRを作成したときに、mainブランチとのコンフリクトが起きていたのですが、解決方法に少々苦しんだので共有しときます。

# 問題
リモートのmainブランチを取り込もうと以下のコマンドを実行したところエラーが発生して処理できなかったです。
```
git pull origin maim
```

# 解決策
以下のコマンドを実行する。<font color="red">**※作業したいブランチで**</font>
1. 最新の更新をoriginに持ってくる
    ```bash
    git fetch
    ```
2. 作業ブランチにマージする
    ```bash
    git merge origin/main
    ```
3. リモートに変更を上げる
    ```bash
    git push
    ```
このあとエディタに飛ばされるかもですが、Exit(Ctrl + x)してEnterすると行けます(デフォルトのコミットメッセージなので編集したければここで)。

# 参考
- この記事に助けられました。本当にありがとうございます

https://qiita.com/jyori112/items/27c5ac0624cec3aac93c

# 終わりに
正直原因は完璧に理解していないところが個人的にももやもやしてます。でも、今回の場合コンフリクトが起きているとpullのコマンドがうまく実行できないらしいです。マージの段階で自動的に終了させられているっぽいかなー。
【JetBrains】Database Tools and SQLでクエリを実行すると"SET autocommit = 0"が効かないとき


# 環境
mysql mariadb
JetBrains系IDE
RiderとPHPStormを常用していますが、他も同じ仕様だと思われる

# 問題
IDEAとかRiderとかでDBをGUIで操作できる「Database Tools and SQL」という超便利機能があります。
さっくり試したいときに多用しているんですが、autocommitを明示的に書いても効かない。

```sql
SET autocommit = 0;

-- テーブル作成
CREATE TABLE IF NOT EXISTS test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- データ挿入
INSERT INTO test_table (name) VALUES
    ('Test Name 1'),
    ('Test Name 2'),
    ('Test Name 3');
```



```text:別セッションで取得
+--+-----------+-------------------+
|id|name       |created_at         |
+--+-----------+-------------------+
|1 |Test Name 1|2024-07-01 02:47:40|
|2 |Test Name 2|2024-07-01 02:47:40|
|3 |Test Name 3|2024-07-01 02:47:40|
+--+-----------+-------------------+
```

# 対策
理由はわからないのですが、ここで"SET autocommit = 0;"を記述しても効かないみたいです。（たぶん↓の設定で上書きされている気がする）

勝手にcommitされたくない場合は以下の「Transaction control」を「Manual」にする必要がありました。

![スクリーンショット 2024-07-01 3.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/73e226f8-2b70-9bce-2a17-2fa1926e0711.png)

この設定をした上で**IDEを再起動**するとコンソール画面に「commit」と「rollback」のボタンが追加されます。

![スクリーンショット 2024-07-01 3.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/1f8a1668-0c52-2dee-8117-2ecb0e309cf1.png)

この設定を適用するとautocommitがオフになるようで、「SET autocommit = 0」を書かなくても暗黙的にcommitされることはありません。

# まとめ
結局「SET autocommit = 0」を書いても適用されない理由はわからなかった。
1行ずつ違うセッションで実行されているのかと思ったが、だとするとトランザクションがそもそも意味をなさなくなるので違う。

# 関係ありそうな公式フォーラム
https://intellij-support.jetbrains.com/hc/en-us/community/posts/205993349-Autocommit-setting-buggy
Excel VBA ユーザー定義関数で給与所得控除を計算する

## シート関数を使うと数式が長くなるので

国税庁のHPより、所得税の給与所得控除の金額を判定する表があったので、これを引用して、練習のためユーザー定義関数を作りました。

https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1410.htm

### シート関数で長々と数式を作った場合

A2セルに年収額を手入力すると、給与所得控除の金額を計算してB2セルにリターンするというものですが、IFSにANDをネストしても引数が多く、かなり長くなります。古いバージョンのExcelだとIFSが使えないので、IFを使うことになり、さらに恐ろしいことになります。

![給与所得控除 シート関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/50e44c15-f52a-71bc-8fce-8845db0a72d2.png)


### ユーザー定義関数でスタイリッシュに決めた場合

コード
```vb
Function CalcDeduction(ByVal Income As Long) As Long

Dim Deduction As Long

If Income <= 1625000 Then
  Deduction = 550000
End If

If Income >= 1625001 And Income <= 1800000 Then
  Deduction = Income * 0.4 - 100000
End If

If Income >= 1800001 And Income <= 3600000 Then
  Deduction = Income * 0.3 + 80000
End If

If Income >= 3600001 And Income <= 6600000 Then
  Deduction = Income * 0.2 + 440000
End If

If Income >= 6600001 And Income <= 8500000 Then
  Deduction = Income * 0.1 + 1100000
End If

If Income >= 8500001 Then
  Deduction = 1950000
End If

CalcDeduction = Deduction
  
End Function
```
実行結果

関数 CalcDeduction の後に引数（年収額）をひとつ入れるだけで、給与所得控除の金額が計算されます。

![給与所得控除 ユーザー定義 差し替え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/a3fe04de-cd6d-0d6e-e446-a0231f81309e.png)


参考URL

https://www.javadrive.jp/excelvba/sub/index6.html

### オチがひどい
国税庁HPをスクロールしたら・・・

![国税庁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/dcb7f852-4a64-a7fe-531c-170111795130.png)
実践的なバージョン管理の基礎  Gitを使った効率的な開発フロー

# はじめに
バージョン管理は現代のソフトウェア開発に欠かせない要素です。その中でも特に広く使われているツールがGitです。
本ブログでは、Gitの基本的な使い方を理解し、効率的な開発フローを実現するための方法を解説します！

# 対象読者
- Gitを初めて使う方
- 効率的なバージョン管理に興味のある方
- チーム開発を行うエンジニア

# 目次
1. Gitとは
2. Gitの基本コマンド
3. ブランチの活用方法
4. 効率的なGitフローの構築
5. トラブルシューティングとベストプラクティス

# 1. Gitとは
Gitは、分散型のバージョン管理システム（DVCS）です。ソースコードの変更履歴を追跡し、チームメンバーと効率的に協力することができます。

## Gitの基本概念
- **リポジトリ（Repository）**: プロジェクトの全てのファイルとその変更履歴を保存する場所。
- **コミット（Commit）**: 変更内容を記録する操作。
- **ブランチ（Branch）**: 並行して開発を行うための独立した作業領域。

# 2. Gitの基本コマンド
Gitの基本的なコマンドは簡単に習得できます。以下のコマンドを使いこなせるようになることが重要です。

## 初期設定
```bash
$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"
```

## リポジトリの作成とクローン
```bash
$ git init
$ git clone <リポジトリURL>
```

## 変更のステージングとコミット
```bash
$ git add <ファイル>
$ git commit -m "コミットメッセージ"
```

## プッシュとプル
```bash
$ git push origin <ブランチ名>
$ git pull origin <ブランチ名>
```

# 3. ブランチの活用方法
ブランチは並行して作業を行うための重要な機能です。開発中に新しい機能を追加する場合やバグを修正する際にブランチを作成することで、メインの作業に影響を与えずに進めることができます。

## ブランチの作成と切り替え
```bash
$ git branch <ブランチ名>
$ git checkout <ブランチ名>
```

## マージ
複数のブランチで行った変更を統合する際に使用します。
```bash
$ git merge <ブランチ名>
```

## コンフリクト解消
マージの際に競合が発生した場合、自分で競合箇所を修正する必要があります。修正が完了したら以下のコマンドで競合を解消します。
```bash
$ git add <修正ファイル>
$ git commit -m "コンフリクト解消"
```

# 4. 効率的なGitフローの構築
Gitフローとは、効果的にブランチやリリース管理を行うための開発プロセスのことです。

## Gitフローの基本
- **マスターブランチ**: リリースされる安定版コードが存在。
- **デベロップブランチ**: 次のリリースに向けた開発中のコードが存在。
- **フィーチャーブランチ**: 新しい機能開発のためのブランチ。
- **リリースブランチ**: リリース前の最終テストを行うためのブランチ。
- **ホットフィックスブランチ**: リリース後に見つかったバグを修正するためのブランチ。

## ブランチ戦略の実践
1. 新しい機能開発はフィーチャーブランチを作成する
2. 完了したらデベロップブランチにマージ
3. リリース準備が整ったらリリースブランチを作成
4. 最終テスト完了後マスターブランチにマージしリリース
5. バグが発生した場合ホットフィックスブランチを作成し修正してマスターブランチにマージ

# 5. トラブルシューティングとベストプラクティス
Gitには便利な機能が多くありますが、操作を誤ると簡単にトラブルが発生します。そのため、いくつかのベストプラクティスを押さえておくことが重要です。

## コミットメッセージの書き方
- 短く、具体的に。
- 最初の行は50文字以内、その後空行を入れて詳しい説明を記述。
- 変更内容を明確に伝えることがポイント。

## 定期的なプル
チームでの開発では、他のメンバーの変更を取り込むために定期的にリポジトリからプルすることが重要です。

## リベース vs マージ
リベースはコミット履歴を綺麗に保ちたい場合に有効ですが、注意して使う必要があります。
```bash
$ git rebase <ブランチ名>
```

## トラブルシューティング
もし操作を誤ってしまった場合、以下のコマンドが助けとなります。
- **リセット**: コミットを取り消したい場合。
```bash
$ git reset --hard <コミットID>
```
- **リバート**: コミットを巻き戻したい場合。
```bash
$ git revert <コミットID>
```

# まとめ
今回のブログでは、Gitの基本的な使い方を解説しました。効率的にGitを使いこなすことで、バージョン管理が一層楽になります。ぜひ、実践してみてください！

:::note info
さらなる詳細は公式ドキュメントをご覧ください: [Git Documentation](https://git-scm.com/doc)
:::
【競プロ】インストール無しのC++環境構築【随時更新】

## はじめに

こんにちは！！競技プログラミングをやっている高校生のButterFlvです！！この記事では管理者権限が使えない（≒インストールができない）環境でC++の競技プログラミングの最低限の環境構築のやり方を備忘録のような感じで書いていきます。（解説が割と雑なのでコメントで質問をいただければ返信します。また、気が向いたときに内容を詳しくしたりします。）

:::note info
C++の知識がほぼ０の人が解説しています。間違いなどあればコメントなどで指摘していただけるとありがたいです。
:::

:::note warn
この方法では最新版のgccが使えないかもしれません。
:::

## 対象としている人

* なんらかの事情で管理者権限で実行できず、インストーラが実行できない
* VSCodeを使っている
* C++を手元実行したい

## GCCダウンロード

MinGW の 7-zip 版をダウンロードし、解凍します。

詳しく解説されている方がいたので[こちら](https://qiita.com/k_maki/items/140f7c14482488891cf9)を参照して下さい。

また、7-zipの解凍方法は調べればたくさん解説があるので割愛します。CUI版がおすすめです。

:::note info
画像や説明を追加するかも。。。
:::

## GUIで環境変数の設定（パスを通す）

Windowsのタスクバーにある検索欄に「コントロールパネル」と入力するとコントロールパネルを開くことができ、そのウィンドウで「環境変数」を検索することで環境変数の設定画面を開くことができます。「Path」の編集を選択して```(mingw64を解凍したディレクトリ)\mingw64\bin\```を指定すればコマンドプロンプトで```g++```を使うことができます。

:::note info
画像を入れるかも。。。
:::

## AtCoder Library の導入

AtCoder Libraryをダウンロードしてきて解凍したものを```(mingw64を解凍したディレクトリ)\mingw64\lib\gcc\x86_64-w64-mingw32\(バージョン)\include\c++\```に置くと使えるようになります。


## おわりに

新しく勉強したことがあったときや、説明を詳しくするときに更新します。
SQL Server Reporting Services のインストール手順

# はじめに
タイトルの通り、SQL Server Reporting Services (SRSS) をインストールするための手順となっています。

本手順は、前提として 以下の SQL Server 2019 が導入されている環境に SRSS を導入する手順となっています。

https://qiita.com/carol0226/items/e408a4df8bcdf1852a20

本記事は、以下の公開情報の手順を元に作成しています。

**公開情報**

https://learn.microsoft.com/ja-jp/sql/reporting-services/install-windows/install-reporting-services?view=sql-server-ver15

# 導入手順
## 1. インストール資材のダウンロード
1. 以下の URL から インストーラーをダウンロードします。

https://www.microsoft.com/ja-jp/download/details.aspx?id=100122

2．以下から、インストーラーをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4c9929a6-7caf-3d9a-ea51-e255c60bb548.png)

3．**SQLServerReportingServices.exe** を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/faf9972d-b63c-9118-89ca-ec24c2bc0675.png)

:::note info
上記の URL は、以下の SQL Serer インストールセンター からリンクされています。
**SQL Server Reporting Services のインストール** からアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c258e56f-2509-550b-a93e-8c311331429b.png)
:::

## 2. SRSS のダウンロード
0. ダウンロードした **SQLServerReportingServices.exe** を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ce27247e-6e1c-ca82-61c4-11c5d86fd7f2.png)
　<br>
0. 以下の画面で **Reporting Services のインストール** の箇所をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/77b82be4-9e57-786f-7cff-8ace697bc4cb.png)
　<br>
0. ここで **プロダクトキー** の欄に SQL Server 2019 をインストールする際に控えておいた プロダクトキー を転記（貼り付け）して **次へ** を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7cc0b740-1545-f488-3bf1-a4a23cc7aa1f.png)

:::note warn
プロダクトキーが判らない場合は、再度 SQL Server のインストーラーを起動して 確認してください。以下の公開情報も参考になります。
:::

https://learn.microsoft.com/ja-jp/sql/reporting-services/install-windows/find-reporting-services-product-key-ssrs?view=sql-server-ver15
 
4．ライセンス条項を読んで **同意** 欄にチェックを入れて **次へ** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/87c26e9d-9d7c-3a6a-0771-cd11364e3a85.png)

5．以下の画面では、そのまま **次へ** を押して進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/518944db-60e1-c06c-6336-f82a415a1aa9.png)

6．以下の画面で **インストール** を押して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c704020f-251a-258d-5cb3-792ae2437091.png)

7．以下の画面になれば、インストールは完了です。**閉じる** を押して終了させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b7975ee9-0aff-6f6d-1bee-41089a5fb76c.png)

以上で SRSS の導入は完了です。おつかれさまでした。
【GitHub】ローカルのソースコードをGitHubで管理する

# 環境

```
$ git --version
git version 2.34.1
```

# 手順

- ルートディレクトリで下記コマンド実行

```shell
# 初期化
git init -b main
# ステージに追加
git add .
# コミット
git commit -m "First commit"
```

- リモートリポジトリ作成
    - URL をコピーする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/3fd9ac82-3e4d-fbc2-f7fb-ea59df0a5d10.png)


- ローカルで下記コマンド実行

```shell
# コピーした URL をリモートに設定
git remote add origin https://github.com/oiz-y/git-init-demo.git
# リモート設定確認
git remote -v
# プッシュ
git push origin main
```

# 参考

https://docs.github.com/ja/migrations/importing-source-code/using-the-command-line-to-import-source-code/adding-locally-hosted-code-to-github
33業種×エンジニア：パルプ・紙

## はじめに
未経験からのエンジニア転職を模索中。33業種それぞれでエンジニアはどのような働き方をしているのかが気になったので調べたことをまとめてみます。実際に現場で働いている方から見たらぬけ等あるかと思いますが、あたたかい目で見守ってください

## パルプ・紙×エンジニアの働き方の例
※パルプとは、紙を作るための原料。木材チップや古紙から繊維を取り出し、パルプは製造されています
![木々.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/f7dad8c4-e84e-a64f-a151-d1a5321b1b25.jpeg)

### 1. 材料開発エンジニア（Material Development Engineer）
- 役割：新しい紙製品やパルプ素材の開発を行い、性能向上やコスト削減を図る
- 具体例：リサイクルパルプの利用促進や、新しい合成繊維を取り入れた紙製品の開発
### 2. プロセスエンジニア（Process Engineer）
- 役割：製造プロセスの設計・最適化を行い、効率的な生産を実現する
- 具体例：パルプの製造工程の自動化や、エネルギー効率の向上を目的としたプロセス改善
### 3. 品質管理エンジニア（Quality Control Engineer）
- 役割：製品の品質を管理し、規格や基準を満たすようにする
- 具体例：紙の強度や吸水性などの品質試験を行い、不良品の発生を防ぐ
### 4. 環境エンジニア（Environmental Engineer）
- 役割：製造プロセスが環境に与える影響を評価し、環境保護対策を実施する
- 具体例：排水処理設備の導入や、製造過程での廃棄物の削減を行う
### 5. 製品開発エンジニア（Product Development Engineer）
- 役割：新しい紙製品の設計・開発を行う
- 具体例：新しいパッケージング素材や特殊用途の紙製品を開発する


### 世界大手の企業
- [インターナショナル・ペーパー（International Paper）](https://www.internationalpaper.com/)
世界最大級の紙・パルプ製品メーカーで、グローバルに事業を展開しています。

- [セッパ・パルプ・アンド・ペーパー（Sappi Limited）](https://www.sappi.com/)
高品質な紙製品と特殊素材を提供するグローバル企業。

- [ウドンガー（UPM-Kymmene）](https://www.upm.com/)
森林産業とバイオ製品の分野でリーダーシップを持つ企業。

### 日本の企業
- [王子ホールディングス株式会社（Oji Holdings Corporation）](https://www.ojiholdings.co.jp/)
総合的な紙・パルプ製品メーカーで、多岐にわたる製品ラインを持ちます。

- [日本製紙株式会社（Nippon Paper Industries Co., Ltd.）](https://www.nipponpapergroup.com/)
紙・パルプ製品の製造と新素材開発において革新的な企業。

- [北越コーポレーション株式会社（Hokuetsu Corporation）](https://www.hokuetsucorp.com/)
高品質な紙製品と特殊紙の分野で優れた技術を持つ企業。

## さいごに
実際の求人票をみて、「インフラエンジニア」「プラントエンジニア」「ICTシステム 開発事業」など確認できました。
まさに最先端という雰囲気が醸し出されていました。
パルプ・紙でエンジニアというイメージがなかった分こういう職種があるんだ、という衝撃を受けました。
クリーンアーキテクチャ 概要

## クリーンアーキテクチャとは

クリーンアーキテクチャは、ソフトウェア設計の原則とパターンを用いて、柔軟で保守性の高いシステムを構築するためのアプローチです。
主にRobert C. Martin（通称「Uncle Bob」）によって提唱されました。

このアーキテクチャの目的は、コードの可読性、再利用性、テストの容易さを向上させることです。

## 基本概念

クリーンアーキテクチャは、以下のような層（レイヤー）で構成されます。

※各々の解釈によって、命名など細かいところには違いがありますが、層の概念はいずれも同じです。

### 1. エンティティ（Entities）

- ビジネスルールやドメインオブジェクトを含む層
- システム全体の中心に位置し、他の層に依存しない

### 2. ユースケース（Use Cases）

- アプリケーション固有のビジネスロジックを含む層
- エンティティを利用して特定の操作や処理を行う

### 3. インターフェース（Interface Adapters）

- データの変換や、外部システムとのやりとりを行う層
- ユースケースやエンティティが理解できる形式にデータを変換するためのアダプタ

### 4. フレームワークとドライバ（Frameworks and Drivers）

- データベース、Webフレームワーク、UIなどの外部システムやツールを含む層
- アプリケーションの最も外側に位置し、他の層に依存する

## 依存関係のルール

クリーンアーキテクチャでは、依存関係は「内側」に向かってのみ持つことが許されています。
具体的には、外側の層が内側の層に依存することはあっても、内側の層が外側の層に依存してはいけません。

これは、「**依存性逆転の原則（Dependency Inversion Principle）** 」に基づいています。

### 依存性逆転の原則

依存性逆転の原則（Dependency Inversion Principle, DIP）は、ソフトウェア設計におけるSOLID原則の一つで、柔軟で保守性の高いコードを書くための重要なガイドラインです。

この原則は、オブジェクト指向プログラミングの依存関係の管理に焦点を当てており、特にモジュール間の依存関係を逆転させることで、システムをより柔軟にすることを目的としています。

#### 依存性逆転の原則の定義

依存性逆転の原則は、次の2つのルールで定義されます。

1. 高レベルモジュールは低レベルモジュールに依存してはならない。両者は抽象に依存すべきである。
2. 抽象は詳細に依存してはならない。詳細は抽象に依存すべきである。

#### 具体例

**悪い例（DIPに違反している例）**

```java
class Light {
    public void turnOn() {
        System.out.println("Light is on");
    }
}

class Switch {
    private Light light;

    public Switch(Light light) {
        this.light = light;
    }

    public void operate() {
        light.turnOn();
    }
}
```

この例では、 `Switch` クラス（高レベルモジュール）は `Light` クラス（低レベルモジュール）に直接依存しています。
この設計では、 `Light` クラスに変更があった場合、 `Switch` クラスも変更する必要があります。

**良い例（DIPに従っている例）**

```java
interface Switchable {
    void turnOn();
}

class Light implements Switchable {
    public void turnOn() {
        System.out.println("Light is on");
    }
}

class Switch {
    private Switchable device;

    public Switch(Switchable device) {
        this.device = device;
    }

    public void operate() {
        device.turnOn();
    }
}
```

この例では、 `Switch` クラスは `Switchable` というインターフェース（抽象）に依存しています。
具体的な`Light` クラスは、そのインターフェースを実装しています。

このように設計することで、 `Switch` クラスは `Light` クラスの具体的な実装に依存しなくなり、他の `Switchable` デバイス（例えば、`Fan` クラスなど）を簡単に追加できます。

## メリット

### 保守性の向上

コードの変更が一部に限定され、他の部分への影響を最小限に抑えることができます。
新しい機能の追加や既存の機能の変更が容易です。

### テストの容易さ

各層が独立しているため、ユニットテストが容易になります。
モックやスタブを使って外部依存を排除し、ビジネスロジックのテストに集中できます。

### 柔軟性と拡張性

新しいフレームワークやデータベースへの移行が容易です。
既存のビジネスロジックを変更せずに、UIやインフラストラクチャを変更できます。

### 再利用性

ビジネスロジックやユースケースが他のプロジェクトやコンテキストで再利用可能です。
再利用可能なコンポーネントを構築しやすくなります。

## まとめ

クリーンアーキテクチャは、ソフトウェアを柔軟で保守性の高いものにするための設計手法です。
各層が明確に分離され、依存関係が内側に向かうように設計されているため、コードの変更やテストが容易になります。

結果として、プロジェクトの長期的な成功と効率的な開発が可能になります。
33業種×エンジニア：繊維製品

## はじめに
未経験からのエンジニア転職を模索中。33業種それぞれでエンジニアはどのような働き方をしているのかが気になったので調べたことをまとめてみます。実際に現場で働いている方から見たらぬけ等あるかと思いますが、あたたかい目で見守ってください

## 繊維製品×エンジニアの働き方の例
![選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/3d00dac9-1db9-73bb-ccd4-25e2d79e821b.jpeg)

### 1. 材料開発エンジニア（Material Development Engineer）
- 役割：新しい繊維素材や化学繊維の開発を行い、より高性能な製品を実現する
- 具体例：新しい合成繊維の開発や天然繊維の改良を行い、耐久性、柔軟性、吸湿性などの性能を向上させる

### 2. プロセスエンジニア（Process Engineer）
- 役割：繊維製造プロセスの設計・最適化を行い、効率的な生産を実現する
- 具体例：紡績、染色、仕上げなどの工程を最適化し、生産コストの削減と品質の向上を図る


### 3. 品質管理エンジニア（Quality Control Engineer）
- 役割：製品の品質を管理し、規格や基準を満たすようにする
- 具体例：製品のサンプリング検査や生産プロセスの監視を行い、不良品の発生を防ぐ


### 4. 製品開発エンジニア（Product Development Engineer）
- 役割：新しい繊維製品の設計・開発を行う
- 具体例：市場調査や消費者のフィードバックを基に、新しいデザインや機能を持つ繊維製品を開発する


### 5. 環境エンジニア（Environmental Engineer）
- 役割：製造プロセスが環境に与える影響を評価し、環境保護対策を実施する
- 具体例：エネルギー消費の削減や廃棄物管理システムの導入を行い、持続可能な生産を推進する


### 世界大手の企業
- インビスタ（INVISTA）
世界最大級のナイロン、スパンデックス、ポリエステル製品のメーカーで、先進的な素材開発と製造プロセスの最適化に注力している

- [ライクラ（The LYCRA Company）](https://www.lycra.com/en)
スパンデックス繊維のリーディングカンパニーであり、ストレッチ素材の分野で革新的な技術を提供している

- [デュポン（DuPont）](https://www.lycra.com/en)
ケブラーやノーメックスなど、高性能繊維の開発と製造において世界的に知られている企業


### 日本の企業
- [東レ株式会社（Toray Industries, Inc.）](https://www.toray.com/global/)
化学繊維や炭素繊維の開発で世界的に有名で、多岐にわたる素材開発と製造プロセスの最適化に力を入れている

- [帝人株式会社（Teijin Limited）](https://www.teijin.com/)
高性能繊維や複合材料の分野で革新を続ける企業で、環境保護にも注力している

- [ユニチカ株式会社（UNITIKA Ltd.）](https://www.unitika.co.jp/)
合成繊維やプラスチック製品の開発・製造を行い、製品開発エンジニアが活躍している

## さいごに
実際に求人票を見てみるとシステム開発やデータエンジニア，DXプロジェクト推進担当者等が確認できました。実際に生産現場を見てきた人が強いであろう求人なんかもありました。衣食住の衣に当たる部分だから、×エンジニアによってどんな風に進化していくのか非常に興味があります。
ReactRouteDOM+ViteのVercelデプロイに苦労した

# 使用技術
* フロントエンド
    * Vite
    * React: `^18.2.0`
    * YamadaUI: `^1.4.3`
    * axios: `^1.7.2`
    * react-router-dom: `^6.23.1`

* バックエンド（※外部サーバ）
    * FastAPI

# React Router DOMでページルーティング
以下のような形でルーティングを定義していました。
```tsx:App.tsx
// ...
const App = () => {
    return (
        <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/about" element={<About />} />
            <Route path="/contact" element={<Contact />} />
        </Routes>
    );
}
// ...
```

# ViteProxy
外部のバックエンドサーバとやりとりするため、Proxyを活用することで、サーバ内アクセスで完結できます。これを`vite`側で制御できます。

```ts:vite.config.ts
//...
export default defineConfig({
    // ...
    server:{
        cors: false,
        proxy:{
            "/api": {
                target: "[バックエンドサーバのベースパス]",
                // target: "http://127.0.0.1:3000", // Debugging
                changeOrigin: true,
                secure: false,
                rewrite: (path) => path.replace(/^\/api/, '')
            }
        }
    }
})
```

上記のように定義することで、`[フロントエンドのベースパス]/api`以降のルートは全て`[バックエンドのベースパス]/`以降のルートにリダイレクトされます。

### 例 （`[front]` => `[back]`）
* `/api` => `/`
* `/api/get_about` => `/get_about`
* `/api/c/send_mail` => `/c/send_mail`

https://vitejs.dev/config/server-options#server-proxy

したがって、`axios`などでバックエンドにfetchする場合は、以下のように短いパスでアクセスできます。
```ts:callApi.ts
await axios({
    method: POST,
    url: `/api/${/**[バックエンドサーバのエンドポイント]*/}`,
    headers: {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json',
    },
    data: /** [リクエストjsonデータ] */
})
```

ローカル環境ならここまでで開発可能です。（バックエンドもCORSを通しておけば）
しかしVercelにデプロイする場合、また違う設定が必要になるようでした

# Vercelデプロイ
## ViteProxyを有効にしてあげる
そのままでは、ViteProxyは有効にならず、Vercel側で同じような設定をしてあげる必要があります。
```json:vercel.json
{ 
    "rewrites" :  [
        {
            "source": "/api/:path*",
            "destination": "[バックエンドサーバのベースパス]/:path*"
        }
    ] 
}
```
これで、ViteProxyが有効になり、同じようにリダイレクトされるようになります。


## React Router DOMが機能しない
そのままvite環境としてデプロイすると、`/`以外のパス（`/about`、`/contact`など）が全て`404 Not Found`になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092163/dfff3bc5-936f-07ef-2060-d8f832c961c6.png)

VercelがReactのサブページを認識できてないようです。
先ほどの`rewrites`プロパティにその旨を設定してあげます。これで各ルートがベースパスを認識できるようになり、解消されます。

```json:vercel.json
{ 
    "rewrites" :  [
        {
            "source": "/api/:path*",
            "destination": "[バックエンドサーバのベースパス]/:path*"
        },
        { 
             "source": "/(.*)", 
             "destination": "/" 
        }
    ] 
}
```

しかしこれにはトラップがありました。この設定によって、ViteProxyで設定した`/api`以降のルートは、全てReactRouterDOMのReactページだと認識されてしまうのです。
例えば、vercelデプロイ後の`/api/get_about`にアクセスしても、そんなページコンポーネントは存在しないので白紙のページが返ってきます。

## 解決策
めんどくさいですが、ReactRouterDOMのルーティングとViteProxyのルートを丁寧に書いてあげる必要があります。
ReactRouterDOMの場合は`destination`が`/`なので気をつけてください。

```json:vercel.json
{ 
    "rewrites" :  [
        {
            "source": "/api/:path*",
            "destination": "[バックエンドサーバのベースパス]/:path*"
        },
        { 
             "source": "/about", 
             "destination": "/"
        },
        { 
             "source": "/contact", 
             "destination": "/" 
        },
    ] 
}
```
別ドメインから遷移した際にセッションが消えるようにみえた原因


ドメイン A → ドメイン B → ドメイン A の画面遷移をするサイトでドメイン A に POST で戻ってきた際に、保存していたセッションが取得できない事象に遭遇した。


### cookie の `SameSite` 属性が原因だった。

https://learn.microsoft.com/ja-jp/microsoftteams/platform/resources/samesite-cookie-update#samesite-cookie-attribute-2020-release

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/e0665b18-589b-b3e8-0fca-8421bee78c68.png)

- chrome 80 からは Lax がデフォルトになっている
- 別ドメインから POST で遷移した際に、 cookie を使用するには `None` を指定する必要がある
- `None` にした場合には、 Secure 属性をつける必要がある
    - HTTPS でのみ動作する
- [chrome では `Lax` でも２分間であれば cookie を送信できる](https://developers-jp.googleblog.com/2020/02/2020-2-samesite-cookie.html#:~:text=%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%202%20%E5%88%86%E9%96%93%E3%80%81%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%20POST%20%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AB%20SameSite%20%E8%A8%AD%E5%AE%9A%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%20Cookie%20%E3%82%92%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
    - [今後変更になる可能性あり](https://chromestatus.com/feature/5088147346030592)


### symfony での対応方法

https://symfony.com/blog/new-in-symfony-4-2-samesite-cookie-configuration





## 参考

https://qiita.com/ahera/items/0c8276da6b0bed2b580c#20200209
SAP S/4 HANA 在庫/購買管理（MM）基本知識４：様々な調達プロセス

### 様々な発注形態
![様々な発注形態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/3918c2f9-2fa9-1300-301a-4f26c361ad00.png)
- 標準的な資材調達プロセスでは、物品を発注⇒納入後、自社在庫として管理するというシナリオを説明しましたが、この章では、これ以外の調達プロセスを説明します。また、自動購買発注機能や請求書照合自動登録機能も説明します。
- どのようなシナリオで発注するかについて、購買伝票明細の「明細カテゴリ」という区分を使って設定することができます。
- 以降では、SAP ERPで用意されている主要な明細カテゴリについて説明します。

### 品目外注（明細カテゴリ：L）
![品目外注.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/8856ddbb-0996-e6b7-fa69-45a30732c3d5.png)
- 外注先に対して、製品などの加工を依頼します。
- 加工に必要な部品は、自社から支給します。
	支給品を支給すると、仕入先支給在庫が増加します。
- 加工後、完成品（外注品）を納入してもらいます。
	外注品の納入と同時に、仕入先支給在庫から支給品が消費（出庫）されます。
- 外注先には加工賃を支払います。

### 仕入先直送（明細カテゴリ：S）
![仕入先直送.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/9b959d85-d09a-7c1d-df58-24f8b5732d9d.png)
- 得意先から受注を受けます。
- この受注品は自社から出荷するのではなく、仕入先から直接、得意先に納入してもらいます。
- そのために、購買発注伝票上では、納入先として直送先の得意先住所を指定します。
- 販売管理（SD）モジュールと連動させることで、受注登録により、仕入先直送用の購買依頼が自動作成されます。

### 受託品（明細カテゴリ：K）
![受託品.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/299e6196-dc22-3230-30ad-2c00235d2c18.png)
- 仕入先から納品された品目は、自社資産ではなく、預かり品として管理します。
- 生産等で必要になった時、この預かり品を使用（出庫）します。
- 支払は納入ベースではなく、使用量に応じて行われます。

### 在庫転送（明細カテゴリ：U）
![在庫転送.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/db159766-521f-7a40-7b1e-52bd7bd5d49a.png)
- 仕入先に対する発注ではなく、社内の別のプラントに出します。
- 受けたプラント側では、発注側のプラントに向けて出庫します。
- 発注側、出庫側、双方のプラントで入出庫の計画を連動させることができるというメリットがあります。

### 消費品目の購買
![消費品目の購買.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/183ef2a1-8784-a7a5-b7ab-b85c0eb51563.png)
- 消費品目を調達するためには、発注時（依頼時）に、費用計上先の勘定設定を行う必要があります。（消費とは、在庫品目（在庫評価する）として調達するのではなく、入庫時に勘定設定対象へ費用計上する調達方法です。）
- 例えば、事務用品や備品等を部門費用や特定の受注オーダーの費用として購入する、といった場合が当てはまります。購入した品物は在庫評価されません（棚卸資産ではない）。 
- 保管場所の在庫として管理されません。
- 品目マスタがない状態でのテキスト購買が可能です（この場合、品目コードは空白）。 

![消費品目の購買1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/259d2995-6d84-6ef1-d474-f0f02394bfd8.png)
- 消費品目と在庫品目の比較です。

### ERS（自動請求書照合登録）
![ERS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/4ba0d73e-2067-1839-f8db-8ca68fb52ec0.png)
- ERSとは、Evaluated Receipt Settlementの略です。自動請求書照合登録、入庫/請求自動決済などと呼ばれます。
- ERSは、仕入先から送られてきた請求書にもとづいて、マニュアルで請求書照合を行うのではなく、入庫基準で請求書照合を自動登録して、仕入先に対して支払予定を通知する場合等に利用されます。
- ERSは、購買発注伝票の「価格」、「支払条件」、「税コード」と入庫数量をもとにして、請求書の自動登録を行います。請求書照合が登録されると、財務会計（FI）モジュール側で買掛金が自動計上されます。

注）消費税率を当時図を作成した5%のままにしております。10%と置き換えて各自考えてください。

![ERS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/3e699149-3d60-f7db-1c6b-4de39c238867.png)
- ERS実行時、請求書照合登録対象の入出庫伝票を絞り込むため、プラント、入庫日付、仕入先等の条件を指定することができます。
- また、登録される伝票をどのような単位にまとめるか指定することができます。仕入先別、発注番号別、発注明細別、入出庫伝票別のいずれかにまとめることができます。
- 通常、ERSはバックグラウンドで定期的に自動実行します。したがって、購買担当者の作業を大幅に軽減することができます。
33業種×エンジニア：食料品

## はじめに
未経験からのエンジニア転職を模索中。33業種それぞれでエンジニアはどのような働き方をしているのかが気になったので調べたことをまとめてみます。実際に現場で働いている方から見たらぬけ等あるかと思いますが、あたたかい目で見守ってください

## 食料品×エンジニアの働き方の例
### プロセスエンジニア（Process Engineer）
- 役割：製造プロセスの設計・最適化を行い、生産効率を向上させる
- 具体例：新しい加工技術の導入や生産ラインの改善を行い、製品の品質を向上させつつコストを削減する

### 品質管理エンジニア（Quality Control Engineer）
- 役割：製品の品質管理を行い、規格や基準を満たすようにする
- 具体例：製品のサンプリング検査や生産プロセスの監視を行い、不良品の発生を防ぐ

### 食品安全エンジニア（Food Safety Engineer）
- 役割：製品の安全性を確保するためのシステムを設計・実施する
- 具体例：HACCP（危害分析重要管理点）プログラムの実施や、製造環境のモニタリングを行い、食品の安全性を保証する

### 製品開発エンジニア（Product Development Engineer）
- 役割：新しい食品製品の開発や改良を行う
- 具体例：市場調査や消費者のフィードバックを基に、新しいレシピの開発や既存製品の改良を行い、新商品を市場に投入する

### 環境エンジニア（Environmental Engineer）
- 役割：製造プロセスが環境に与える影響を評価し、環境保護対策を実施する
- 具体例：エネルギー消費の削減や廃棄物管理システムの導入を行い、持続可能な生産を推進する

## 食料品×エンジニアの例で該当するであろう会社
- 世界大手
ジョンソン・エンド・ジョンソン（Johnson & Johnson）、ネスレ（Nestlé）、クラフト・ハインツ（The Kraft Heinz Company）、ダノン（Danone）

- 日本大手
カゴメ株式会社（Kagome Co., Ltd.）、キッコーマン株式会社（Kikkoman Corporation）、味の素株式会社（Ajinomoto Co., Inc.）、日清食品ホールディングス株式会社（Nissin Foods Holdings Co., Ltd.）、サントリーホールディングス株式会社（Suntory Holdings Limited）

https://www.kagome.co.jp/

https://www.kikkoman.com/jp/corporate/

https://www.nissin.com/jp/about/

https://www.suntory.co.jp/company/?ke=ft


## さいごに
食料品業界におけるエンジニアの役割は、製品開発、生産プロセスの最適化、品質管理、安全性の確保、環境保護など、多岐にわたることがわかりました。がっつりパソコンを使用して…というイメージはなかなかつかめないです。採用情報を見ても何か違うのかな？工場で使う設備のシステムは外注が主だと思うので外注や関連会社を詳しく見ると何かヒントが得られそう
【TestRail】サービス紹介 / 他サービスとの比較 / 操作感

[記事投稿キャンペーン](https://qiita.com/official-events/5100659e9b4ffbcb941b)で話題になっている [TestRail](https://www.techmatrix.co.jp/product/testrail/index.html) を触ってみました。

本記事では、どういうサービスなのか、機能紹介、Excelやスプレッドシートといった表計算ツールとの比較、操作してみた所感についてまとめてみました。

※ 私自身、ディレクション業務・テスト業務への経験が乏しいので、参考になるような紹介ができているかわかりませんがご了承ください。

## どういうサービスなの？
> Webベースのテスト管理ツールのトップブランドであるTestRail。テストケースの管理やテスト結果の記録、チームでの情報共有など、Excelを使ったテスト業務に限界を感じていませんか？TestRailはシンプルで使いやすいUIを提供し、テストにかかるさまざまな管理コストの削減に貢献します。
> 
> [引用元：公式](https://www.techmatrix.co.jp/product/testrail/index.html)

テスト管理ツールを提供してくれます。

## 機能紹介
### 1. テストにかかわる情報を一元管理
テストデータや結果、エビデンスを一元管理できます。

JIRAやRedmineなどの課題管理ツールの入力や参照が可能、とのこと。

これが結構便利だなと思いました。
- テスト担当者（いわゆるテスター）が複数のツールの操作を覚える必要がない
- 使い方次第では、「要件」「テストシナリオ」「テスト結果」「エビデンス」「不具合チケット」「タスク管理」といったデータを一元管理できる

テストデータのイメージ
![テストデータのイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/d06223e1-d175-fd19-9d88-d4e42865b93d.png)

### 2. Webブラウザー上でテストケースを簡単に入力や編集可能
テストケースへの入力操作に対しての使い勝手がいいです。

- マークダウン記法対応
- ドラッグ&ドロップ操作によるファイルの添付
- 共同作業での入力が可能
- リアルタイム反映
- 変更履歴で誰が操作したかのログを確認できる

### 3. テストケースの管理項目をカスタマイズ可能
テストケースがデータとして持つ、フィールドのカスタマイズが可能です。

### 4. CSVやXMLで既存のテストケースをインポート
これは検証できてないんですが、他サービス（Excelやスプレットシート）で管理していたテストケースを一括で取込めるみたいです。

### 5. 外部連携（API）
Rest API が提供されているみたい。
https://docs.testrail.techmatrix.jp/testrail/docs/801/testrail-tutorial/tutorial-integration/

## 表計算ソフトとTestRailの比較
https://www.techmatrix.co.jp/product/testrail/excel_testrail.html

### 1. データの管理方法
#### Excelの場合
- テスト工程や担当者ごとにファイルやシートが増える
- テスト結果登録用、エビデンス登録用、進捗確認用などの管理単位でファイルやシートが増える

#### TestRailの場合
データの管理方法を統一・整理されます。

- ほしい情報へのアクセス性に優れる
- テストデータの変更履歴が見やすい

### 2. レポート作成が楽
#### Excelの場合
グラフや統計データ等、慣れていればサクッと作成できますが、まぁ時間かかりますよね。

#### TestRailの場合
テンプレートが用意されているので、途中経過や進捗の把握など、容易にレポートを作成することが可能です。

### 3. 他サービスとの連携
#### Excelの場合
Excelの場合、Office系のサービスとの連携は強いです。スプレッドシートもGASを使いこなせばですよね。

#### TestRailの場合
検証はできてないんですが、Redmineとの連携がかなり強力みたいです。

https://www.techmatrix.co.jp/product/lychee/index.html

## 操作感
[デモ版]()を用意してくれているみたいなので使ってみました。

### プロジェクトトップページ
プロジェクトトップページのイメージです。

![スクリーンショット 2024-07-14 19.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/8bbd4440-dc7f-e238-8978-6a19b092f96d.png)

プロジェクトのトップページから、アクティビティで誰ががんばってるのか確認できるのいいですね。

### TODOタブ
自身がアサインしているテストの確認ができるようです。
タスク管理って意味でも使いやすそう。

![スクリーンショット 2024-07-14 19.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/94e64de0-b8df-60fa-4429-a1980400f0c4.png)

### テストラン
「思ったより一元管理されている」という印象です。

![スクリーンショット 2024-07-14 19.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/f3e1055e-9905-33c2-e483-dfacd16aa884.png)

データ(テンプレート)のカスタマイズもできるということですので、結構使い勝手いいのかなと思います。

### マイルストーン
マイルストーンに含まれるテスト計画やテストランを表示できるそうです。
プロジェクトのリリースやスプリントごとでテスト計画の整理ができそうですね。

![スクリーンショット 2024-07-14 19.22.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/d06223e1-d175-fd19-9d88-d4e42865b93d.png)

## 所感
### 結構強力だなと感じました。
カスタマイズ性、柔軟な外部連携、データのアクセス性に優れているという印象です。

### ちょっとネックだなと思ったこと。
テストへの実務経験が乏しいのもあるかと思いますが、ツールへの学習コストが少し高いのかなと...。