OmniAICreator/Qiita-1.07M huggingface dataset:
HHKB掃除してみた

# HHKB掃除してみた！

こんにちは、キーボードマニアの皆さん！今日は、愛用のHHKB（Happy Hacking Keyboard）をピカピカにするために掃除してみました。必要な道具と手順をご紹介します！

## 必要な道具
- キートップ引き抜き工具
- 重曹
- 水洗いするための深いボウル
![IMG_6873.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/74c71ec9-c9f6-f31d-4c98-7b0386f2f1ac.jpeg)
:::note info
キートップ引き抜き工具はamazonnで一番安かったやつを買いました。それでも全然イケちゃう。
:::


### 1. HHKBとキートップ引き抜き工具

![EAD4AA07-C571-48DF-8BFA-FBE731B5957E.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/11effe65-eb2a-2ad3-3f54-f34580c236c2.jpeg)


まずはこれがないと始まりません！HHKBとキートップ引き抜き工具を用意しましょう。工具を持つと、なんだかプロフェッショナルな気分になりますよね！

:::note alert
これで満足してしまう人が一定数います。握って満足するのではなくちゃんと実行に移しましょう。
:::


### 2. キートップ引き抜き中
![IMG_6549.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/0a32567b-93f7-a4a3-246f-28e07334218d.jpeg)

キートップを一つ一つ慎重に引き抜いていきます。これが意外と楽しいんですよね。次々に外れていくキートップを見ると、なんだか爽快な気分になります！

:::note warn
ここからグロ画像閲覧注意です。
:::
### 3. キートップ引き抜き終わり

![IMG_6552.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/ba3d6dc7-7ba6-1470-f767-48ae4187255c.jpeg)

無事に全てのキートップを引き抜き終わりました。まるでパズルのピースが全部そろった感じ。HHKBがこんなに素っ裸になるとは！ちょっとドキドキ。次はこのキートップたちをキレイにします！

:::note alert
汚すぎる。
:::
### 4. キートップを重曹水につける
![IMG_6553.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/dccb5b86-3edd-6adc-4030-76a4128eeb73.jpeg)


キートップたちを重曹水に浸けて、汚れをしっかり落とします。まるでキートップたちが温泉に入っているみたいですね。リラックスしてね、キートップたち！

### 5. キートップを乾かす
![IMG_6554.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/cf42eb58-490b-cb07-7734-036ffe1788b2.jpeg)


重曹水から取り出したキートップを乾かします。日向ぼっこさせると、キートップたちも気持ち良さそうです。焦らずじっくり乾かしましょう。

### 6. キートップを戻して完成
![D8D27117-AAB5-4FA3-AA49-7E21181527A3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/3b937478-e583-724a-8df9-2bb99da140d3.jpeg)

乾いたキートップを元の位置に戻して、作業完了！ピカピカになったHHKBが輝いています。まるで新品みたいですね！

## 終わりに

これでHHKBの掃除が完了しました。掃除してみると、キーボードがもっと好きになるかもしれません。皆さんもぜひ試してみてくださいね！次回もお楽しみに！
自己紹介

## はじめに

初めまして！れすです！今回の記事からアウトプット目的で投稿していこうと思います！iOSエンジニアを目指しています！

## Who am I?

HN: れす
Age: 19
Hobby: strategy game, music
Likes: iOS, Swift, SwiftUI

Twitter(X): https://x.com/ress_UoA
github: https://github.com/ressharu

## これから

iOS開発の経験がまだまだ浅いので、いっぱい技術を学びながらアプリを制作して経験を積んでいきます！
類似性ネットワークで簡易RAGを作ってみた

<a href="https://it.blogmura.com/ranking/in?p_cid=11119283" target="_blank"><img src="https://b.blogmura.com/it/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログへ" /></a><br />

# 汎用RAG

この2日間、コードの修正に苦労したけど、ようやく完成した。
特徴としてはこれまでモデル一つからの取り出しでしたが、これだとモデルの学習に時間がかかることから、モデルを分割して、自己、相互の類似性をネットワークで取得することにした。
当初のコードは５倍以上に膨らみ、ここでは掲載できません。

## 新システムの特徴

従来のRAGシステムでは、単一のモデルからデータを取り出していました。しかし、この方法ではモデルの学習に時間がかかるという課題がありました。そこで私は、モデルを分割し、自己および相互の類似性をネットワークで取得する新しい手法を開発しました。

開発には丸2日間かかり、コードは当初の5倍にも膨らみましたが、その甲斐あって素晴らしい成果が得られました。

## 類似性ネットワークの威力

この新システムの最大の利点は、クエリで直接ヒットしないデータでも、データ間の関係性から引き出せることです。例えば、買い物リストの例で考えてみましょう。

- 従来のシステム：
  特定の品名を入力すると、その品名を含む記録しか取得できません。

- 新システム：
  類似性ネットワークを使うことで、同じ店での他の買い物記録など、より広範囲のデータを取得できます。

つまり、直接的な単語マッチングだけでなく、関連性の高い情報も柔軟に取得できるようになったのです。

## 実用例：サザエさんの検索システム

具体的なイメージを掴んでいただくために、サザエさんのエピソードを例に説明しましょう。

1. 「サザエさんの買い物リスト」検索
   - 従来：サザエさんが実際に買い物をしているエピソードのみ表示
   - 新システム：マスオさんやカツオが買い物をしているエピソードも表示

2. 「サブちゃんのエピソード」検索
   - 従来：サブちゃんが直接登場するエピソードのみ表示
   - 新システム：サブちゃんに関連する話題やキャラクターが登場するエピソードも表示

3. 「堀川くんのエピソード」検索
   - 従来：堀川くんが登場するエピソードのみ表示
   - 新システム：堀川くんの性格や行動に関連するエピソードも表示

## まとめ

この新しいRAGシステムは、データ間の関係性を利用してより広範な情報を提供します。直接的なキーワードマッチングだけでなく、関連性の高い情報を得ることができるため、ユーザーにとってより有用な検索結果を提供できるようになりました。

今後は、このシステムをさらに改良し、より多くの分野で活用できるよう研究を続けていきたいと思います。皆さんも、新しい技術を活用して、より効率的な情報管理を目指してみてはいかがでしょうか？

# 関連記事:
- [CHATGPTでチェックリストを作らせる](https://lifehacking1919.hatenablog.jp/entry/2023/07/01/090228)
- [次世代プロジェクト管理ツールの構想を練る（３）](https://qiita.com/EasyCording/items/1a5e977bd4d3a3ec5399)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/5e487d31-9593-b090-c177-66e950ecfcc4.png)
投稿 7 具体と抽象　2024/07/07

本日の勉強時間　2.5H



▪️具体：くわしい（若者に多い）

　　メリット：ミスへる（例えば、具体的な指示もらえたらミス減る）

　　デメリット：自由度減る

具体化：漠然とした物事をはっきりとした形にすること

具体的にどういうこと？？？＞＞＞5W3Hで具体化

▪️抽象：ざっくり（先輩に多い）

　　デメリット：理想論

抽象化：複数の情報に共通する要素を抜き出すこと

　　　　ここから、何が言えるのか、を繰り返し考えること。

も　　　のごとの全体つかんだり、第三者にイメージ伝える。

- 人間の知性っていうのは抽象化で成立　（言葉と数がまさにそれ）
- 抽象を嫌わないっていうのが大事。
- 抽象は概念。応用がきくけど、いろんな解釈される。
- 複数のものを共通の特徴でグルーピングし、同じとみなす

　　→一つの事象に学びを他の場面に応用

- たとえ話っていうのは、抽象→具体への翻訳作業
- 抽象レベルでの模倣は一番いい。具体レベルでの模倣はパクリになる。
- 具体的、抽象　往復運動大事

ーーーーーー大事！！！ーーーー

①他人ばかり抽象化しない

（例：ヨーロッパの人はこう、海外の人はこう、アジア人とかの決めつけ）

自分のことは具体病、他人のことは抽象病の思考になってしまいがち。

そんな時こそ、自分を抽象的に、相手を具体的に。

自分とは遠い立場、対立する立場の人を、より具体化する。

解像度高く理解できていない人を抽象化してまとめてしまう

人を解像度高く、具体化。

②本質マンに騙されるな

今後のために,,,

練習：真反対のものを抽象化して、一緒だと表現してみる。

例　愛、憎しみ　から＞＞＞＞期待　　と表現する。
AtCoder 勉強記録[C++] その13

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## C - Make Them Narrow
[C - Make Them Narrow](https://atcoder.jp/contests/abc361/tasks/abc361_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, k;
  cin >> n >> k;
  vec a(n);
  rep(i, n) cin >> a[i];
  sort(a.begin(), a.end());
  ll res = INT_MAX;
  rep(i, k+1){
    res = min(res, a[i+n-k-1] - a[i]);
  }
  cout << res << endl;
}
```
### 解法
`A`を昇順にソートしたとき、`A`の要素のうち`i`から`i+N-K`までの部分数列を考える。このとき`(i+N-K)`から`i`を引いた時の最小値を探索する。
## C - kasaka
[C - kasaka](https://atcoder.jp/contests/abc237/tasks/abc237_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  string s;
  cin >> s;
  ll n = s.size();
  ll x = 0;
  rep(i, n){
    if(s[i] == 'a') x++;
    else break;
  }
  ll y = 0;
  for(int i = n-1; i >= 0; i--){
    if(s[i] == 'a') y++;
    else break;
  }
  if(x == n) {
    cout << "Yes" << endl;
    exit(0);
  }
  if(x > y) {
    cout << "No" << endl;
    exit(0);
  }
  for(int i = x; i < n-y; i++){
    if(s[i] != s[x+n-y-i-1]){
      cout << "No" << endl;
      exit(0);
    }
  }
  cout << "Yes" << endl;
}
```
### 解法
先頭から連続する`a`の個数と末尾から連続する`a`の個数について考える。`a`は先頭に付け加えるため、末尾の`a`の個数より先頭の個数が多いときは必ず回文にならない。また、すべての要素が`a`の場合は必ず回文になる。それ以外の場合について、末尾の連続した`a`と先頭から連続した`a`を除いた文字列が回文だった場合、`a`を加えたら回文になる。
## C - Knight Fork
[C - Knight Fork](https://atcoder.jp/contests/abc239/tasks/abc239_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
vector<ll> movex = {1,2,1,2,-1,-2,-1,-2};
vector<ll> movey = {2,1,-2,-1,2,1,-2,-1};
int main() {
  ll x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  for(int i = 0; i < 8; i++){
    ll mx = x1 + movex[i];
    ll my = y1 + movey[i];
    if((x2 - mx)*(x2 - mx) + (y2 - my)*(y2 - my) == 5){
      cout << "Yes" << endl;
      exit(0);
    }
  }
  cout << "No" << endl;
}
```
### 解法
`x1`、`y1`から√5の距離になる格子点は8つしか存在しない。そのため、`x1`、`y1`を移動するための配列を用意しておきすべての格子点において`x2`、`y2`との距離が√5となるかを判定する。
## C - Yamanote Line Gam
[C - Yamanote Line Gam](https://atcoder.jp/contests/abc244/tasks/abc244_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

vector<bool> jud(2002, false);

int main(void) {
  ll n;
  cin >> n;
  while(1){
    for(int i = 1; i < 2*n+2;i++){
      if(!jud[i]) {
        jud[i] = true;
        cout << i << endl;
        break;
      }
    }
    ll a;
    cin >> a;
    if(a==0) exit(0);
    jud[a] = true;
  }
  return 0;
}
```
### 解法
無限ループを利用して実装する。相手の入力が0になったときループから抜けて終了する。
MongoDBをDocker上に構築してみる

NoSQLデータベースでドキュメント指向データベースであるMongoDBを試したことがなかったため、今回、Docker上にMongoDBを構築してみます。その後、MongoDBのデータの操作を見てみたいと思います。

## 構築環境
・Mac PC（Appleシリコン）
・ローカル環境にDockerはインストールされているものとします。

## Docker環境にMongoDBを構築する
Dockerファイルと初期データを登録するjsファイルを作成し、dockerコンテナを作成し、起動します。手順は次の通りです。

```
> docker network create net-mongo_test   # Docker ネットワークの作成

> docker network ls | grep net-mongo_test   # Docker ネットワーク作成の確認
56d8fc9f8ebb   net-mongo_test   bridge    local
```
```java:Docker file
FROM mongo:7.0-jammy

ENV LANG=ja_JP.UTF-8
ENV MONGO_INITDB_ROOT_USERNAME=root
ENV MONGO_INITDB_ROOT_PASSWORD=password

COPY init_db.js /docker-entrypoint-initdb.d/

EXPOSE 27017   # 接続ポート
```
```java:初期投入データ：init_db.js
db = db.getSiblingDB('db_employee_info');

db.employee.insertMany([
    {
        employeeName: '田村',
        age: 30,
        created_date: new Date(),
        updated_date: new Date()
    },
    {
        employeeName: '山田',
        age: 31,
        created_date: new Date(),
        updated_date: new Date()
    },
    {
        employeeName: '中山',
        age: 37,
        created_date: new Date(),
        updated_date: new Date()
    },
    {
        employeeName: '佐藤',
        age: 23,
        created_date: new Date(),
        updated_date: new Date()
    },
    {
        employeeName: '佐々木',
        age: 33,
        created_date: new Date(),
        updated_date: new Date()
    },
    {
        employeeName: '吉田',
        age: 35,
        created_date: new Date(),
        updated_date: new Date()
    }
]);
```
```
> docker build --no-cache --tag mongo-test:latest .   # コンテナイメージをビルドする

> docker images | grep mongo-test
mongo-test    latest     42b2c022be68   6 seconds ago     761MB

> docker run -d \
   --publish 27017:27017 \
   --name mongodb-test \
   --net net-mongo_test \
   --volume db_test_mongo:/data/db mongo-test   # コンテナを作成、起動する

> docker ps | grep mongodb-test
2516f7333eb9   mongo-test   "docker-entrypoint.s…"   30 seconds ago   Up 29 seconds   0.0.0.0:27017->27017/tcp   mongodb-test
```

これで、コンテナが作成され、起動された状態となりました。

## GUIツールを使用し、起動されたデータベースを確認する
データを確認・操作できるGUIツールが幾つかあります。その中で、無料で使用できるものが次のものです。
* MongoDB Compass　　https://www.mongodb.com/ja-jp/products/tools/compass
* Studio 3T（旧Robomongo） 　　https://studio3t.com/
* NoSQL Booster 　　https://nosqlbooster.com/home

今回は『NoSQL Booster』というものを使用しました。

インストールが完了したら、次のように接続先を入力し、MongoDBに接続します。
<B>mongodb://root:password@localhost:27017

![nosqlbooster_conn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763635/6db47006-b13f-73a5-8e09-f16ff565c540.png)

上記で作成された「employee」コレクションを開くと、データが表示されました。

![nosqlbooster_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763635/757d7bfa-b762-e4b1-2160-3eefea068709.png)

今回はここまでとします。
次回、データ操作などを試してみたいと思います。
使いやすいGUIツールがあれば、コメントをお願いします。
React 19 で head 要素を変更しやすくなるけど注意が必要そうな箇所

## この記事の概要

React 19 にて、`retun`の中で`head`にまつわるタグを指定すればちゃんと適用されます。
例えば`title`要素。

https://react.dev/reference/react-dom/components/title

ページごとに`title`を変えたいとき、これまでは react-helmet-async などを使っていたと思いますが、不要になりそうですね。

ドキュメントに書いてあること以外でも注意した方が良さそうな箇所を見つけたので記事にしました。

## html ファイル内に title がある場合の挙動

以下のような HTML があったとします。

```html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React + TS</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>
```

そして、このようなページを作ったとします。

```tsx
export function Home() {
  const title = "Home";
  return (
    <div>
      <title>{`${title} | React 19 head element test`}</title>
      <div className="page">
        <h1>{title}</h1>
        <p>This is home page</p>
      </div>
    </div>
  );
}
```

この場合、最終的に出力される`title`は次のようになります。

```html
<title>Home | React 19 head element test</title>
<title>Vite + React + TS</title>
```

ファイル内にある`title`を`head`内に配置するだけで、もともとあったものを置き換えはしないということです。

注意書きには「複数のコンポーネントから`title`をレンダリングしないでください」とありますが、コンポーネントに限らず 1 つにまとめるような機能は無いようです。

ページごとに`title`を設定するつもりの場合、HTML にある`title`は消しておく必要がありそうです。

## おまけ：ドキュメントにも書いてあるけどついでに説明

上の例では実施しているのですが`{変数} 文字列`の書式で`title`を指定しようとすると上手く反映されません。

``{`${変数} 文字列`}``の書式にする必要があります。

過去に書いたこちらの記事で少しだけ解説しているのですが、`{変数} 文字列`だとテキストノードが 2 つ生まれてしまっています。
`title`もあくまでコンポーネントの 1 つで、直下には 1 つの要素しか置けないようです。

https://qiita.com/xrxoxcxox/items/530109609e5f53f77661
EC2なんとなく振り返り

# AWS EC2について

## はじめに
Amazon Web Services（AWS）のElastic Compute Cloud（EC2）は、クラウド上でスケーラブルなコンピューティングリソースを提供するサービスです。EC2を使用することで、物理サーバーを購入・管理することなく、必要なときに必要なだけのコンピューティングリソースを利用できます。この記事では、EC2の基本的な概念、機能、利点、使用例について説明します。

## 目次
1. [EC2とは](#ec2とは)
2. [EC2の機能](#ec2の機能)
3. [EC2の利点](#ec2の利点)
4. [EC2の使用例](#ec2の使用例)
5. [まとめ](#まとめ)

## EC2とは
Amazon EC2は、クラウド上で仮想サーバー（インスタンス）を提供するサービスです。ユーザーは、インスタンスの種類、サイズ、数を選択し、必要に応じてスケールアップまたはスケールダウンすることができます。EC2は、オンデマンド、リザーブド、スポットの3つの料金モデルを提供しており、コスト効率の高い方法でコンピューティングリソースを利用できます。

## EC2の機能
- **インスタンスタイプ**: 汎用、コンピューティング最適化、メモリ最適化、ストレージ最適化、GPUインスタンスなど、さまざまなインスタンスタイプを提供。
- **スケーラビリティ**: 必要に応じてインスタンスをスケールアップまたはスケールダウン可能。
- **セキュリティ**: セキュリティグループ、ネットワークACL、キーペアなどのセキュリティ機能を提供。
- **ストレージ**: Amazon EBS（Elastic Block Store）やインスタンスストアを使用して、データを永続的に保存可能。
- **ネットワーキング**: VPC（Virtual Private Cloud）を使用して、ネットワーク設定をカスタマイズ可能。
- **オートスケーリング**: トラフィックの変動に応じて、自動的にインスタンスを追加または削除する機能。

## EC2の利点
- **柔軟性**: インスタンスの種類、サイズ、数を自由に選択でき、必要に応じて変更可能。
- **コスト効率**: オンデマンド、リザーブド、スポットの料金モデルを選択することで、コストを最適化可能。
- **高可用性**: 複数のリージョンとアベイラビリティゾーンにまたがるインスタンス配置により、高可用性を実現。
- **セキュリティ**: セキュリティグループやネットワークACLを使用して、インスタンスのセキュリティを確保。
- **スケーラビリティ**: オートスケーリング機能により、トラフィックの変動に応じて自動的にスケールアップまたはスケールダウン可能。

## EC2の使用例
### 1. ウェブサーバーのホスティング
EC2を使用して、ウェブサーバーをホスティングすることができます。以下に、基本的な手順を示します。

1. **インスタンスの起動**: AWSマネジメントコンソールにログインし、EC2ダッシュボードから新しいインスタンスを起動します。
2. **AMIの選択**: Amazon Linux、Ubuntu、Windowsなど、使用するAMI（Amazon Machine Image）を選択します。
3. **インスタンスタイプの選択**: t2.microなど、適切なインスタンスタイプを選択します。
4. **セキュリティグループの設定**: HTTP（ポート80）やHTTPS（ポート443）など、必要なポートを開放します。
5. **キーペアの作成**: SSHアクセス用のキーペアを作成し、ダウンロードします。
6. **インスタンスの起動**: 設定を確認し、インスタンスを起動します。
7. **ウェブサーバーの設定**: SSHでインスタンスに接続し、ApacheやNginxなどのウェブサーバーをインストール・設定します。

### 2. データベースサーバーのホスティング
EC2を使用して、データベースサーバーをホスティングすることができます。以下に、基本的な手順を示します。

1. **インスタンスの起動**: AWSマネジメントコンソールにログインし、EC2ダッシュボードから新しいインスタンスを起動します。
2. **AMIの選択**: Amazon Linux、Ubuntu、Windowsなど、使用するAMI（Amazon Machine Image）を選択します。
3. **インスタンスタイプの選択**: データベースの負荷に応じた適切なインスタンスタイプを選択します。
4. **セキュリティグループの設定**: MySQL（ポート3306）やPostgreSQL（ポート5432）など、必要なポートを開放します。
5. **キーペアの作成**: SSHアクセス用のキーペアを作成し、ダウンロードします。
6. **インスタンスの起動**: 設定を確認し、インスタンスを起動します。
7. **データベースの設定**: SSHでインスタンスに接続し、MySQLやPostgreSQLなどのデータベースをインストール・設定します。

### 3. バッチ処理の実行
EC2を使用して、バッチ処理を実行することができます。以下に、基本的な手順を示します。

1. **インスタンスの起動**: AWSマネジメントコンソールにログインし、EC2ダッシュボードから新しいインスタンスを起動します。
2. **AMIの選択**: Amazon Linux、Ubuntu、Windowsなど、使用するAMI（Amazon Machine Image）を選択します。
3. **インスタンスタイプの選択**: バッチ処理の負荷に応じた適切なインスタンスタイプを選択します。
4. **セキュリティグループの設定**: 必要なポートを開放します。
5. **キーペアの作成**: SSHアクセス用のキーペアを作成し、ダウンロードします。
6. **インスタンスの起動**: 設定を確認し、インスタンスを起動します。
7. **バッチ処理の設定**: SSHでインスタンスに接続し、バッチ処理のスクリプトをアップロード・実行します。

## まとめ
Amazon EC2は、クラウド上でスケーラブルなコンピューティングリソースを提供する強力なサービスです。柔軟性、コスト効率、高可用性、セキュリティ、スケーラビリティなど、多くの利点があります。EC2を使用することで、ウェブサーバー、データベースサーバー、バッチ処理など、さまざまな用途に対応することができます。
もっとソフトウェア見積もりの精度を高める

# 概要
本記事は[『ソフトウェア見積もりガイドブック 品質要件に応じた見積もりとは』](https://www.ipa.go.jp/archive/publish/qv6pgp0000000yho-att/000005132.pdf)
の5章の要約です

# テーマ
ソフトウェア見積もりの精度を向上させるには？

1.見積もりの前提条件のモニタリングとコントロール
2. 見積もり方法の継続的改善
3. 契約によるリスク解消

# 1.見積もりの前提条件のモニタリングとコントロールを行おう
なぜ前提条件のモニタリングが必要か。突然変わる場合があるからです。

## 見積もりの前提条件が後から変わるという問題
- 見積もりの前提条件が見積もりの後になって変わることがあります。前提条件が変わる状況は2種類に大別されます。
    - 1.当初想定していた前提が状況の変化に伴い変わってしまう
    - 2.そもそも前提が曖昧だった&実際のテストの段階で想定外の事象が顕在化する。(その結果、混乱)

- 前提条件の変化の具体例は以下の通りです。
    - 後続テスト工程になって、先行テストでのテスト漏れが判明
    - 設計および実装の遅延によりテスト期間が短くなる	
    - リグレッションテストが想定より不十分	
	- テストを実施しても欠陥が検出されない
	- テストをしても想定の期間内に欠陥の量が収束しない。そのため、テストの期間とコストが増加	
	- このように見積もりの当初は情報量が少ないため、見積もりの誤差が大きくなりがちです。そのイメージは不確実性コーン(上述の資料より引用)で表現されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/64caf7b9-60c0-d7b4-0ce7-9421d2cb5f56.png)

## 対処法
- まず、見積もりの前提条件が変わることによる見積もり結果の変動を、見積もりの計算方法で帳消しにすることは無理。		
- それゆえ、できることは、以下の3つです。
1. 見積もりの前提条件を明確にする
2. それを関係者と共有する
3. その上でモニタリングとコントロールを行う

# 2.見積もり手法の継続的改善
- 見積もり精度の向上のためには、実際の結果をもとにフィードバックループ(あるいはPDCAサイクル)をまわしていくことが必要である。	
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/008c146f-d9aa-7e17-a60c-9db5f2f1d3d0.png)

## フィードバックループの手順
1.見積もりの計算方法の確立と計算
- ここでは、リスクの洗い出しとその排除を含む。リスクとはテストの工数に影響する変動要因が、当初の想定よりも悪い方向に変化するリスクである。	

2.見積もりの予測値と実績の差異分析		

3-1.見積もり手順へのフィードバック(モデル改善、追加データ収集)	
3-2. プロジェクトマネジメントの方法へのフィードバック 
(見積もりは正確だったが、プロジェクトマネジメントに失敗して遅延した場合)

# 3.契約によるリスクを解消	
ここでの契約とは、ユーザーとベンダーの間のプロジェクトに関する契約。

## テストをめぐるユーザーとベンダーの役割分担	
- 要件の面での役割分担
    - ユーザーは要件(機能と非機能)を決定する。
    - その要件はテストの量と生産性に大きく影響する。そのため、ユーザーがテスト工数の大半を決める。		
    - 一方、その要件の決定のサポートをするのがベンダーである。ベンダーはシステム開発の知見があるため、実現可能性などの情報を提供する。
役割分担のイメージは以下の図
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/28e15432-f958-b125-b5e7-2dd11df8aa36.png)
		
- 次に、テストレベルの面から役割分担を見てみる。
    - 受け入れテストやシステムテストを主体となって進めるのはユーザーである。これらのテストは先行する単体テストの進め方などから影響を受ける。それゆえ、ユーザーが先行するテストの目標やプロセス設計を行い、ベンダーと合意をとるのが良い。		
- 設計と実装の品質に責任を持つのがベンダーである。しかし、これはテストの量と生産性に影響する。それゆえ、ユーザーはベンダーとテスト戦略を検討し、相互に合意をとることが重要である。そのテスト戦略では、ユーザとベンダーの役割と目標を明確にし、テスト量と生産性についてユーザーがコントロールする部分とベンダーがコントロールする部分を明確に定義する。そうすることで、最終的にテストのコストの低減やスケジュールの短縮を図れる。

　 テストレベルの観点での役割分担と品質に関する責任のイメージは以下の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/6ef1d613-bf86-6ef8-80fd-4d365469a9cd.png)
		
- **変動要因**に関するユーザーとベンダーの合意も重要。目標とする品質レベルだけでなく、テストの量と生産性への変動要因の中身を確認する。例えば、リグレッションテストの範囲が広いことをベンダーが確認したら、それをテスト見積もりに反映する。	
イメージは以下の図	
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/74ca8415-da1d-94d8-a2a8-1ee70d28b70b.png)


### 多段階契約によりテストの段階的な見積もりが可能
- たしかに多段階契約のデメリットとしては、契約作業の工数が増加することが挙げられる。しかし、メリットもある。開発を通して見積もりの前提条件が変わることを契約内容に織り込める。以下のような多段階契約は信頼性の高いシステムや、改修の影響範囲が見通せないシステムに向いている。

多段階契約と再見積もりのタイミングの一例は以下の図を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/d986a7df-cf49-8aaf-1ab5-0343d3d2b3f0.png)

### さいごに
豆腐メンタル系しくじりエンジニアは適切な見積もり方法を武装して心の平穏を保とう!!
[Dify] Difyで長いチャンクでのRAGをやりたいんだ。


## 長いチャンクでRAGをやりたいよね？

RAGの精度を上げるのに、チャンク大きさ自体を大きくするというものがありますよね。
それをDifyでもやりたいのです。
ただデフォルトでナレッジのセグメントサイズが１０００なのでできません。
今回はセグメントサイズを大きくする方法を紹介します。

:::note warn
注意
前提としてDify v0.6.12での操作方法です。
それ以前のバージョンや、レガシー版を使っている方は、docker/.envをdocker/docker-compose.yamlに読み替えて実装してください。

:::


## 最大セグメントサイズ変更方法
まずはdocker/.envのINDEXING_MAX_SEGMENTATION_TOKENS_LENGTHを変更したいセグメント数に変更してください。

```

# Maximum length of segmentation tokens for indexing
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=3000

```

Difyをローカルまたはセルフホスティングしている方は再起動してください。


Difyのナレッジを開き、設定したセグメントサイズで設定して見ましょう。

![スクリーンショット 2024-07-07 23.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/4d2129a7-7316-7da0-d57e-e11ace05221e.png)

確認プレビューをクリックしてもエラーが出ませんね。いい感じにいけました！これでDifyを使った激長チャンクでRAGができますね。



## 最後に

Xをやっているので気になる方はフォローお願いします。
https://x.com/hudebakonosoto
JetBrainsのIDEをコマンドで開けるようにする方法

# はじめに
JetbrainsのIDEもvscodeのcodeコマンドみたいに開けたら良いなと思ったので調べてみました。

# シェルスクリプトを生成してパスを調べる
### 複数のIDEがある場合
[JetBrainToolBox](https://www.jetbrains.com/ja-jp/toolbox-app/)をインストールします。

起動したら、右上のToolbox Appメニューをクリックして、そこから出てくる設定を押します。
![スクリーンショット 2024-07-07 23.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/81fe0340-f6ab-ab92-0189-3845bbeec3c9.png)

シェルスクリプトを生成するにチェックがつけられているか確認してください。
![スクリーンショット 2024-07-07 23.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/4d9a5620-eb77-44be-ae44-237d38d5c2ba.png)


今回はwebstormをコマンドで開けるようにしてみようと思います。
ToolBoxを起動したら出てくるインストール済みツールにあるwestormの`⋮`を選択します。
![スクリーンショット 2024-07-07 22.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/2a594d11-e5a0-9a3c-53bc-bde31603c4a2.png)

構成の下にシェルスクリプト名という場所が書いてあるので、そこにコマンド名を指定して、更新を押してください。
![スクリーンショット 2024-07-07 22.52.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/ea3c6272-c278-66b4-bcd7-542a196d9abc.png)

上の画像の場所と書かれている部分がパスとなリます。


### IDEを一つしか使っていない場合
WebStormを開いて、ツールを選択します。
![スクリーンショット 2024-07-07 22.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e720b072-5f5f-e854-aaee-f98fef236640.png)
コマンドラインランチャーの作成をクリックします
![スクリーンショット 2024-07-07 22.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/a58699f1-b6a5-daeb-af59-7aa872cd910c.png)
その後パスが表示されるのでそれを覚えておきます。


# 環境変数を設定する
次に環境変数を設定します。
シェルの設定ファイルを開いて
```
nano ~/.zshrc
```
下の行を追加します。
```
export PATH=$PATH:<ここにパスを書く>
```
ファイルを閉じたら
```
source ~/.zshrc
```
で設定を反映させます。

その後任意のディレクトリで下のコマンドを打てば開くようになるはずです。
```
webstorm　.
```

:::note
Toolboxであれば、シェルスクリプトを生成すると設定したパスの場所に溜まっていくので便利です。
:::

使っている方は参考にしてください。
rex0220 関連テーブルプラグイン 添付ファイル項目の画像表示

[rex0220 関連テーブルプラグイン](https://qiita.com/rex0220/items/973da400b31137f22d98)で、添付ファイル項目の画像表示を行う例です。

# 概要

[rex0220 関連テーブルプラグイン](https://qiita.com/rex0220/items/973da400b31137f22d98) Ver.27 で、添付ファイル項目の画像表示が追加されました。
添付ファイル項目の画像表示を行う例です。

初期表示では、先頭から 100個の画像を表示します。
101個以上の画像は、クリックするとファイルを取得して表示します。
画像をクリックすると、別タブに画像を表示します。

ページ(ページ内行数)設定してページ制御を行うとページ内のレコード数が制限されるので、画像数を100個以内にできます。

![2024-07-07_22h52_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/64d4af15-b9e4-0995-b521-837dc89611df.png)

# 操作例

![2024-07-07_23h20_57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/377ec200-2c2f-8436-70eb-c9ac6faa7166.gif)


# 関連テーブルプラグイン設定

「ページ」に、ページ内行数(10, 30, 50, 100)を指定するとページ制御表示になります。

![2024-07-07_23h06_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3e98d994-68ba-a502-2763-85467520ad23.png)

項目に添付ファイルのフィールドコードを指定して、形式に「image」を指定します。

![2024-07-07_23h07_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3325bf1e-b602-3b70-359e-a7ab30248d96.png)
jQuery　class属性操作の勉強

お疲れ様です。

昨日提出した課題はあのあと合格判定をいただきましたので、今日は次に進み、class属性の操作について勉強しましたので、自分用のまとめです。

【class属性操作のメソッド】
**addClass()**…指定要素にclass属性を追加
**removeClass()**…指定要素からclass属性を削除
**toggleClass()**…指定要素に対しclass属性追加/削除の切替
**hasClass()**…指定要素にclass属性があるか確認する

addClassメソッド
![71.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/c54d72fa-155a-dd48-236c-0253362c5f11.png)

removeメソッド
![74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/391e33a9-f417-5592-ad0f-fac8c8dd77a9.png)
![73.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/a8f3b64e-5e54-f6df-477f-620065df0996.png)

toggleClass/hasClassメソッド
![75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/237d08f5-3ec7-0e1d-919a-45794022ee00.png)
![76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/fac840f7-46ed-4882-47c5-7fdd7dac2563.png)

htmlにclassを書き足したりしなくても、このメソッドを使えば、jsでclassを追加が可能になります。

これらを使えるようになると、以前監視を使って作成した自己紹介ページの、画像がじわりと表示される部分も、activeClassを追加するなどの書き方に変えて、scrollなどのイベントと組み合わせれば表示も可能そうかもと、勉強しながら思いました！
やりたいこと次第かもしれませんが、コードは１つではないということですね:relaxed:
ざっくりGoのチャネルについて

# Goのチャネルについて

## はじめに
Go言語のチャネル（Channel）は、Goroutine間でデータをやり取りするための強力な機能です。チャネルを使用することで、Goroutine間の通信と同期を簡単に実装することができます。この記事では、チャネルの基本的な概念、使い方、利点、注意点について説明します。

## 目次
1. [チャネルとは](#チャネルとは)
2. [チャネルの使い方](#チャネルの使い方)
3. [チャネルの利点](#チャネルの利点)
4. [チャネルの注意点](#チャネルの注意点)
5. [まとめ](#まとめ)

## チャネルとは
チャネルは、Goroutine間でデータを送受信するためのデータ構造です。チャネルは型付きであり、特定のデータ型のみを送受信することができます。チャネルを使用することで、Goroutine間の通信と同期を簡単に実装することができます。

## チャネルの使い方
チャネルの基本的な使い方を以下に示します。

### チャネルの作成
チャネルは `make` 関数を使用して作成します。
``` go
ch := make(chan int)
```

### データの送信
チャネルにデータを送信するには、`<-` 演算子を使用します。
``` go
ch <- 42
```

### データの受信
チャネルからデータを受信するには、`<-` 演算子を使用します。
``` go
value := <-ch
```

### 例: 基本的なチャネルの使い方

``` go
package main

import (
	"fmt"
)

func main() {
	ch := make(chan int)

	// Goroutineでデータを送信
	go func() {
		ch <- 42
	}()

	// メインのGoroutineでデータを受信
	value := <-ch
	fmt.Println(value) // 出力: 42
}
```

### バッファ付きチャネル
バッファ付きチャネルは、指定されたバッファサイズまでデータを送信することができます。バッファがいっぱいになると、受信されるまで送信はブロックされます。

``` go
ch := make(chan int, 2)
ch <- 1
ch <- 2
```
### 例: バッファ付きチャネルの使い方
```go:main.go
package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 2)

	ch <- 1
	ch <- 2

	fmt.Println(<-ch) // 出力: 1
	fmt.Println(<-ch) // 出力: 2
}
```


### チャネルのクローズ
チャネルをクローズすることで、これ以上データが送信されないことを示します。クローズされたチャネルからデータを受信すると、ゼロ値が返されます。
```go
close(ch)
```

### 例: チャネルのクローズ
```go:main.go
package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 2)

	ch <- 1
	ch <- 2
	close(ch)

	for value := range ch {
		fmt.Println(value)
	}
}
```

## チャネルの利点
- **シンプルな並行処理**: チャネルを使用することで、Goroutine間の通信と同期を簡単に実装できます。
- **型安全**: チャネルは型付きであり、特定のデータ型のみを送受信するため、型安全性が高いです。
- **デッドロックの回避**: チャネルを適切に使用することで、デッドロックのリスクを低減できます。

## チャネルの注意点
- **ブロッキング**: チャネルの送信と受信はブロッキング操作であり、適切に設計しないとデッドロックが発生する可能性があります。
- **リソース管理**: チャネルを使用する際には、リソースの管理に注意が必要です。特に、不要になったチャネルはクローズすることが推奨されます。
- **バッファサイズの選定**: バッファ付きチャネルを使用する場合、適切なバッファサイズを選定することが重要です。バッファサイズが小さすぎると、頻繁にブロッキングが発生する可能性があります。

## まとめ
Go言語のチャネルは、Goroutine間でデータをやり取りするための強力な機能です。チャネルを使用することで、Goroutine間の通信と同期を簡単に実装することができます
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（49/100）

【49日目】
トピック 5：SAPS/4HANAでのプロセス指図（6/6）

≪問題49≫
品質管理部門が原材料ロットで逸脱を検出しました。不都合なことに、このロットは生産ですでに使用されています。影響を受けるすべての完成品在庫をどのようにして特定できますか。
（２つ選択）
□ロット決定を使用する。
□ロット継承を使用する。
□ロット情報コックピットを使用する。
□ロット使用先一覧を使用する。

≪解答≫
□ロット決定を使用する。
□ロット継承を使用する。
■ロット情報コックピットを使用する。
■ロット使用先一覧を使用する。

≪解説≫
◆ロット情報コックピットおよびロット使用先一覧は、ロット管理の情報システムです。
（1）ロット使用先一覧は、企業全体のロットの経路を文書化し、製造物責任の範囲内で使用されます。このレポートでは、品質上の理由などでリコールが必要なロットを検索することができ、トップダウン分析を使用してロットの取得元を特定し、ボトムアップ分析を使用してロットが移動した先を特定します。ロット使用先一覧は、ロット情報コックピットから開始することができます。
（2）ロット情報コックピットは、ロットデータの包括的な評価オプションを提供する中心的なツールです。ロットデータ（品目、在庫、有効期間データ、分類に保存されているスペックデータなど）の柔軟な選択を開始することができます。既存のロット機能（ロットマスタ、ロット使用先一覧、在庫状況照会、最小有効期間評価など）も統合されています。
◆ロット決定は、生産に必要な特定の品目規格を持つロットを割り当てる機能であり、在庫内のロットが検索され、特定の選択基準および検索方針に従って選択されます。
◆ロット継承は、生産時に構成品のロット情報を生産品のロット情報にコピー（継承）する機能であり、ロット情報のメンテナンスの省力化や入力ミスの削減が可能となります。
【Python】Excelのデータを別のブックにコピーする(範囲指定)

import openpyxl as px

#Book1.xlsxをwbに関連づける
wb = px.load_workbook('Book1.xlsx')

#Sheet1をwsに関連付け
ws = wb['Sheet1']

wb2 = px.load_workbook('Book2.xlsx')

ws2 = wb2['Sheet1']

#コピー元のSheet1(範囲指定:row=行,column=列)
for i in range(3,20):
 for j in range(1,3):
    copy = ws.cell(row = i, column =j).value
    
#コピー先のbブック、bシートにコピー元のデータを貼り付け
ws2.cell(row = i, column =j , value = copy)

wb2.save(filename = 'Book2.xlsx')
爆速デプロイで寄せ書きAPIサーバーを作った話

# 爆速デプロイで寄せ書きAPIサーバーを作った話

## はじめに

寄せ書きが急に必要になったとき、紙の寄せ書きではなくエンジニアっぽいデジタルな寄せ書きを作りたいと思ったことはありませんか？今回は、Cloudflare WorkerとHonoを使って、3時間で寄せ書きAPIサーバーを爆速デプロイした話をお伝えします。
![Screenshot 2024-07-07 at 22.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/569b4716-116d-a315-328c-447c5b896783.png)

## 使用ツール/技術

- **Cloudflare Worker**: 高速でスケーラブルなサーバーレス環境を提供
- **Hono**: 軽量でシンプルなWebフレームワーク

## 背景

ある日、チームのエンジニアが急遽退職することになり、送別の寄せ書きが必要になりました。エンジニアらしい寄せ書きにしようという話になり、デジタル寄せ書きを作成することに決定。しかし、時間は3時間しかありませんでした。

### 爆速デプロイの活用

前回の記事で紹介した爆速デプロイの手法[(前回の記事)](https://qiita.com/Shuhei-pp/items/007ccb96b346da1caaa7)を活用し、寄せ書きAPIサーバーを構築しました。作成したエンドポイントは以下の3つです。

#### 1. 寄せ書き一覧（ids）を取得するエンドポイント

```yaml
GET /yosegaki
```

![Screenshot 2024-07-07 at 22.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/2a8a88ca-20f4-3a18-26d5-beca7655e1fc.png)
#### 2. 寄せ書き詳細を取得するエンドポイント

```yaml
GET /yosegaki/:id
```

![Screenshot 2024-07-07 at 22.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/02691d94-0276-def3-6771-66012a14936c.png)
#### 3. UI用のエンドポイント（SwaggerとOpenAPI Zodを使用）

```yaml
GET /ui
```

![Screenshot 2024-07-07 at 22.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/569b4716-116d-a315-328c-447c5b896783.png)
寄せ書きのデータはJSONで管理しました。これにより、APIサーバーを迅速にデプロイすることができました。


## 結論

Cloudflare WorkerとHonoを使えば、APIサーバーのデプロイが非常に簡単かつ迅速に行えます。ぜひ試してみて、手軽さと効率性を実感してください。

## 参考記事

- [Cloudflare Workers Documentation](https://developers.cloudflare.com/workers/)
- [Hono GitHub Repository](https://github.com/honojs/hono)

---

この記事を参考に、あなたも手軽にAPIサーバーをデプロイしてみましょう！
JavaScriptの文法アウトプット①

# 投稿の経緯
自身の携わっている案件でフロントエンド周りの機能開発を行っているので、スキルアップのためにJavaScript関連のアウトプットを行います。
# 文法①
## オブジェクト
プロパティまたはキーと値をペアで管理する箱。

### プロパティ
値とペアで管理される名前のようなもの。

### キー
プロパティと同様の意味。

### 値
プロパティやキーとペアで管理されている数値、文字列等のデータのこと。
関数を設定することも可能。

### 参考例

#### オブジェクトの記法

```
const introduce = {
    name: 'hogehoge',
    greet: function() {
        console.log('初めまして!');
    }
}
```

#### 呼び出し方

```
console.log(introduce.name); 
> hogehoge
console.log(introduce.greet()); 
> 初めまして!
```

#### その他

##### ネスト記法が可能

```
const introduce = {
    name: 'hogehoge',
    greet: function() {
        console.log('初めまして!');
    }
    country: {
        japan: 'Tokyo'
    }
}
```

```
console.log(introduce.country.japan);
> Tokyo
```
10分でわかる物事の効率的な考え方（ロジカルシンキングのはじめかた）

最近、若手エンジニアの指導をしています。
その過程で、若手エンジニアの方々は、物事をうまく考えられていないなぁと思うことがあるので、どう考えればいいのか、私自身が実践していることをまとめました。


# 想定する読者
- 物事をうまく考えられない、まとめられない人
- 相手にうまく話を伝えられない人　
- ロジカルシンキングを使えるようになりたい人

などなど


# お伝えしたいこと
　この文章でお伝えしたいことは、下記の6つです。

- 書き出すこと
- 深堀りすること
- 分解すること
- 抜け漏れなく探すこと
- 事実に基づくこと
- 相手の立場になって考えること

　「事実に基づくこと」「相手のことを考えること」は、物事の考え方というよりかは、どちらかと言うと、相手に話すとき、相手に理解してもらうために押さえておきたいポイントです。自分の考えたことや調べたことを、他の人に話す機会が多いと思うので、加えました。


# 書き出すこと
- 頭の中で考えられる量は、ほんの少しなので、テキストに書き出す
- 文章にするとぱっと見でわかりにくいので、箇条書きにする

こちらは、特に解説することは無く、書いた通りです。


# 深堀りすること
- ある物事に対して、なんで？なんで？なんで？を繰り返すことで深堀りする
    - 何となく雰囲気で思っていることが、妥当かどうかを判断することができる
    - 誰かに突っ込まれたときに、受け答えをすることができる

<br>

　例えば、「お金持ちになりたい！」という人がいたとして、その理由を深堀りしてみます。
- お金持ちになりたい！　→　（なんで？）　→　働かなくて済むから
- 働かなくて済むから　→　（なんで働きたくないの？）　→　時間を自由に使いたいから
- 時間を自由に使いたいから　→　（なんで時間を自由に使いたいの？）　→　家族と過ごしたり、趣味に使いたいから
- 家族と過ごしたり、趣味に使いたいから　→　（なんで家族と過ごしたり、趣味に使いたいの？） → 家族のことが好きだし、趣味をやっていると楽しいから

　ここまで深堀りできると、お金持ちになることはすぐに達成できなくても、QOL（生活の質）を上げることはできそうです。
　自分の時間を増やしたいのであれば、リモートワークができる会社に転職するとか、フリーランスに転向してみるとか、あるいは、日々の時間の使い方を見直してみる、等の方法で実現できる可能性がありそうです。そうすれば、お金持ちになる前にQOLを上げることができるかもしれません。

　このように深堀りしていくと、今までなんとなく想像をしていただけで、気付くことのできなかった、本当の目的とか原因などに気付くきっかけになります。
　また、誰かに質問や指摘をされても、ちゃんと深く考えられているので、抜け漏れもなく、しっかりと答えることができます。


# 分解すること
- 大きな問題でも分解すれば、小さな問題になる

<br>

　例えば、「お金持ちになりたい！」という人がいたとして、その実現方法を分解して考えてみます。
- お金持ちになりたい！　→　株式投資をしてお金を増やす
- 株式投資をしてお金を増やす　→　新NISAを利用する
- 新NISAを利用する　→　証券会社に口座を開設する
- 証券会社に口座を開設する　→　どの証券会社が良いか比較検討する

　「お金持ちになりたい！」という漠然とした目標が、今日にでも始められそうな小さな目標になりましたね。
　「いや、ちょっと待て、考えが甘くない？」と思った方、その通り、これでは考えが甘いです。「お金持ちになる方法は1つじゃない」とか、「株が値下がりしたらどうなる？」「なぜ新NISA一択なんだ？」という疑問を持った方も多いでしょう。
　その対策として、次の「抜け漏れなく探すこと」を使います。


# 抜け漏れなく探すこと
- できる限り、関係する要素を抜け漏れなく挙げる

<br>

　抜け漏れなく探すことをMECEと呼びます。
 
　では、例えば「お金持ちになる方法」はいくつかあると思いますが、可能性の高そうなものをなるべく多く考えてみます。

- 起業する
- 出世する
- 株式投資をする
- 宝くじを買う
- ギャンブルに賭ける
- お金持ちに話を聞く
- YouTuber になる

　まだまだたくさん方法はあると思いますし、各項目をさらに深堀りすると、細かい項目が出てくると思います。
　挙げた方法それぞれに対し、メリット・デメリットを合わせて書くと、どの方法を選ぶのが（一番）良いか判断しやすくなります。項目を挙げれば挙げるほど、意外な良い方法が見つかったり、想定外のケースが減ったりするので、成功する確率を上げる（失敗する確率を減らす）ことができます。

　大谷翔平選手が使っていた目標達成シート（マンダラチャート）は、この「分解すること」と「抜け漏れなく探すこと」を、簡単にできるようにしたツールと言えるのではないかと思います。


# 事実に基づくこと
- 客観的な事実を集める
    - 客観的な事実に基づかない（自分の感覚など）と説得力が無い

<br>

　例えば「お金持ちになりたいなら、競馬でお金を増やすべきだ！！」と言う人がいても、多くの人は納得しないでしょう。なぜなら、多くの人は競馬でお金を増やすことは容易ではない、ことを感覚的に理解しているからです。ちなみに、公営ギャンプルの還元率を調べてみると、競馬の還元率は約75%と言われており、理論的に競馬に賭け続けると、掛け金の25%を失ってしまう計算になります。
 
　このように、自分の感覚など客観的な事実に基づかない考えは説得力にかけますが、信用できるデータなど客観的に判断できるものがあれば、信頼性が高まります。


# 相手の立場になって考えること
- 相手が理解しやすいように話をする
- 相手が知らない事柄や、専門用語を使わない。使うのなら説明する
- 相手にメリットが無いと（コスパやタイパに合わないと）、動いてもらえない

<br>

　例えば、小学2年生の男の子に「将来、お金持ちになりたい！どうすればいいの？」と聞かれたとき、
　「NISA口座を開設して、積立NISAでオルカンを買えばいいんだよ」と教えたとしても
　「にーさってなぁに？おるかんってなぁに？おいしいの？」となってしまうことでしょう。
　この場合、小学2年生の男の子にでもわかるように説明する必要があります。

　ビジネスにおける大原則は、相手に喜んでもらうことなので、相手の立場に立って物事を考えるのはとても大事なことだと言えます。

# 終わりに
　今回は物事の効率的な考え方をまとめました。この方法を応用すれば、問題を解決したり、相手を説得したりすることにも使えると思います。
　知っただけでは使えるようにならないので、もし「使えそうだな！」と思ってもらえたなら、積極的に活用してみたり、自分流にアレンジしたりして使ってみてください！
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（48/100）

【48日目】
トピック 5：SAPS/4HANAでのプロセス指図（5/6）

≪問題48≫
プロセス管理は、PP-PIとプロセス制御に関連するシステム間のインタフェース機能です。プロセス管理の機能として正しいものはどれですか。
（２つ選択）
□発行済プロセス指図からのプロセス指示を使用した制御レシピの受信。
□対応するプロセスオペレータまたはプロセス制御システムへのマスタレシピの送信。
□ピッキングリストの形式による、制御レシピの自然言語での表示。
□プロセス制御システムまたはPIシートからのプロセスメッセージの受信、チェック、および送信。

≪解答≫
■発行済プロセス指図からのプロセス指示を使用した制御レシピの受信。
□対応するプロセスオペレータまたはプロセス制御システムへのマスタレシピの送信。
□ピッキングリストの形式による、制御レシピの自然言語での表示。
■プロセス制御システムまたはPIシートからのプロセスメッセージの受信、チェック、および送信。

≪解説≫
◆プロセス管理は、PP-PIとプロセス制御に関連するシステム間のインターフェースです。構造が柔軟であり、完全自動化、部分自動化、および手動操作の行にリンクすることが可能です。
◆プロセス管理には、以下の機能が含まれます。
（1）発行済みプロセス指図からのプロセス指示を使用して制御レシピを受信する機能。プロセス指示では、実行するプロセスステップや、プロセスメッセージを使用して確認するプロセスデータなどを詳細に定義します。
（2）対応するプロセスオペレーターまたはプロセス制御システムへの制御レシピの送信機能。
（3）プロセスオペレーターが画面に表示および更新できるPIシートの形式で、制御レシピを自然言語で表示する機能。
（4）プロセス制御システムまたはPIシートからの実際のプロセスデータを含むプロセスメッセージの受信、チェック、および送信する機能。
【React】React Iconsで超簡単にイケてるアイコンを使う方法。

今回はReactプロジェクトで簡単にアイコンを利用できるライブラリ、React Iconsの使い方を紹介します。

## React Iconsとは？

React Iconsは、さまざまなアイコンパックをReactコンポーネントとして簡単に利用できるライブラリです。
これにより、Font AwesomeやMaterial Design Iconsなどの人気のあるアイコンパックを簡単にプロジェクトに取り込むことができます。

↓　イメージ（個人開発中のタスク管理アプリで使用してみました！）
![A57B5E08-7BC4-411F-8900-F04CB2B673F3_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/6d80e3c2-bcdf-cf38-35ef-fcff95cb25be.jpeg)

## インストール

```bash
npm install react-icons
```
もしくは、
```bash
yarn add react-icons
```

## 基本的な使い方

インストールが完了したら、Reactコンポーネント内でアイコンを使用できます。
今回はタスク管理アプリのヘッダーにMaterial Design Iconsのアイコンを表示したいと思います。

まず、使用したいアイコンをインポートします。

```jsx
import { MdOutlineTaskAlt } from "react-icons/md";
```

次に、インポートしたアイコンをコンポーネント内で使用します。

```jsx
function Header() {
  return (
    <header className="bg-blue-500 text-white py-4 px-10 md:px-20 font-bold ">
      <div className=" flex gap-3">
        <MdOutlineTaskAlt /> 　　　　←ここで使用しています。
        <h1 className=" text-3xl ">Task Manager</h1>
      </div>
    </header>
  );
}
export default Header;
```

これで、`<MdOutlineTaskAlt />`としてアイコンが表示されます。


![A57B5E08-7BC4-411F-8900-F04CB2B673F3_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/a4dd1fe0-f28d-9368-f891-2612fcd33cb2.jpeg)


## アイコンパックの一覧

React Iconsは、多くのアイコンパックをサポートしています。以下はその一部です。

- Font Awesome (`fa`)
- Material Design Icons (`md`)
- Typicons (`ti`)
- Github Octicons (`go`)
- Ionicons (`io`)
...など

各アイコンパックのプレフィックスを使用して、インポートするアイコンを指定します。

## サイズと色の変更

アイコンのサイズや色を簡単に変更できます。
React Iconsのコンポーネントには`size`や`color`といったプロパティが用意されています。

```jsx
import { MdOutlineTaskAlt } from "react-icons/md";

function Header() {
  return (
    <header className="bg-blue-500 text-white py-4 px-10 md:px-20 font-bold ">
      <div className=" flex gap-3">
        <MdOutlineTaskAlt size={35} color="white"　/>
        <h1 className=" text-3xl ">Task Manager</h1>
      </div>
    </header>
  );
}
export default Header;
```

この例では、アイコンのサイズを50pxにし、色をホワイトに設定しています。

## まとめ

React Iconsを使うことで、アイコンの利用が非常に簡単になります。
多くのアイコンパックをサポートしているため、プロジェクトのデザインに合わせたアイコンを簡単に見つけて利用することができます。

ぜひ、React Iconsを試してみてください！

## 参考サイト
https://react-icons.github.io/react-icons/
firebase init hostingでfirebase-toolsが使えなくなった

# はじめに

いままでfirebase-toolsを使ってReactのデプロイをしていたのですが、仕様が変わって困ったのでまとめます

# 問題

通常なら

```
$ firebase init
? Do you want to use a web framework? (experimental) (y/N) 
```

このように聞かれていたが、最新版のfirebaseをインストールしたら聞かれなくなってしまった

```
{
  "hosting": {
    "source": ".",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "frameworksBackend": {
      "region": "asia-east1"
    }
  }
}
```

このように普段なら設定していたのが使えなくなってしまったのでCDがうまくいかなくなった

# 解決方法

仕方ないので、

```
$ firebase init hositing
? What do you want to use as your public directory? dist
あとはEnter
```

そしてパイプラインではartifactでビルドしたディレクトリをデプロイのところにも共有するようにしたい

```yml
name: Scheduled deploy

on:
  push:
  workflow_dispatch:

env:
  VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
  VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "18"
      - name: Install dependencies
        run: npm install
      - name: Run build
        run: npm run build
      - name: Archive production artifacts
        uses: actions/upload-artifact@v2
        with:
          name: dist
          path: dist

  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Setup Node.js and cache
        uses: actions/setup-node@v2
        with:
          node-version: "18"
          cache: "npm"
      - name: Install firebase-tools
        run: npm install --save-dev firebase-tools
      - name: Decode Firebase service account key
        run: |
          echo "${{ secrets.FIREBASE_KEY }}" | base64 -d > ./firebase-key.json
          echo "GOOGLE_APPLICATION_CREDENTIALS=${{ github.workspace }}/firebase-key.json" >> $GITHUB_ENV
      - name: Change Firebase project
        run: ./node_modules/.bin/firebase use ${{ secrets.FIREBASE_PROJECT_ID }}
      - name: Download artifact
        uses: actions/download-artifact@v2
        with:
          name: dist
          path: dist
      - name: Deploy to Firebase Hosting
        run: |
          ./node_modules/.bin/firebase deploy --only hosting
        env:
          FIREBASE_CLI_EXPERIMENTS: webframeworks
      - name: Delete service account key
        run: rm $GOOGLE_APPLICATION_CREDENTIALS
        if: ${{ always() }}
```

ちなみに何故前はdistの共有が不要だったかというと、firebase-toolsがbuildとdeployを同時にしてくれていたから

# おわりに

仕様変更で困りましたが、パイプラインがより一般的な書き方になりました
AppIntentsのParameterで写真を読み込みたい

# 結論: IntentFileを使う
Parameterで写真を読み込みたかったのだが、Imageなどの型は対応していないのでIntentFileという型を使う必要がある。データの型なので、そのままでは画像としては使えない。UIImageに変換したりする必要がある。

```
//ParameterはIntentFile型
@Parameter(title: "Photo", supportedTypeIdentifiers: ["public.image"], requestValueDialog: IntentDialog("Choose a photo")) var photo: IntentFile

//データをImage型として読み込む
var image: Image?
let data = photo.data
if let uiImage = UIImage(data: data) {
    image = Image(uiImage: uiImage)
}
```

個人的にはこのような形で使った。
Go + クリーンアーキテクチャにおけるエラーハンドリング戦略

# はじめに
こんにちは！mizukoです！
先日[PaPut](https://paput.io)という個人開発のサービスをβ版としてリリースしました！

その際、今後の個人開発ライフのために基盤作りを行ったのですが、
エラーハンドリングの戦略も検討したので、アウトプットしていきたいと思います！

PaPutについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧いただけますと幸いです🤗

# 前提
- プロジェクトはクリーンアーキテクチャの構成
  （本記事で紹介するエラーハンドリング方法はどの様な構成でも使えると思いますが、私自身がこの構成でしか運用したことが無いのため、クリーンアーキテクチャを前提とさせていただいています。）

# 戦略
独自のエラーハンドリングにならないよう、シンプルに以下戦略で進めます...！
- errorの管理はプロジェクトルートにerrors/errors.goを作成し、一元管理する
- 全てerror型で扱い、error型をラップして新しい構造体を作るなどは行わない
- errorはerrors.Isで比較する

# errorを一元管理する
クリーンアーキテクチャにおいて、errorをどこで管理するかは悩ましいところです。
domain層で各entityに関連するエラーを定義するという方針も取れそうですが、

- 汎用的なerrorの置き場所に困る
- adapter層にだけ関わるerrorもドメイン層に置くことになる

などの点から、プロジェクトルートのerrors/errors.goに管理することにしました。

## 実際のソース
実際のソースは以下です。

```go
package errors

import (
	"errors"
	"fmt"
)

// 汎用エラー
var (
	ErrInvalidRequest        = errors.New("リクエストが無効です。")
	ErrInternalServerError   = errors.New("エラーが発生しました。")
	ErrInvalidRequestPayload = errors.New("リクエストの形式が不正です。")
)

// ユーザー関連エラー
var (
	ErrFailedCreateUser  = errors.New("ユーザーの作成に失敗しました。")
	ErrUserNotFound      = errors.New("ユーザーが見つかりませんでした。")
	ErrUserAlreadyExists = errors.New("既に存在するユーザーです。")
)

// 認証関連エラー
var (
	ErrUnAuthorized = errors.New("認証に失敗しました。")
)

func New(msg string) error {
	return errors.New(msg)
}

func Is(err, target error) bool {
	return errors.Is(err, target)
}

func NewNotFoundError(entity, id string) error {
	return fmt.Errorf("%s (ID: %s) が見つかりませんでした。", entity, id)
}

// 他にもあれば上記と同じように定義していく
```

トピックとしては以下です。
- error型を定数（変数）として定義する
- NewやIsなど、標準のerrorsパッケージをラップしている
    - Isなどを標準パッケージから使おうとすると、import時の名前が衝突してしまうため、使い勝手を考えてラップした
- NotFoudの様な「何が」があるようなエラーは、fmtでerrorを返す

# 利用例
例えば、以下のようにusecase層でエラーを返した場合
```go
user, err := i.UserRepository.FindByEmail(ctx, tokenData.Email)

// 既にユーザーが存在する場合はエラーを返す
if user != nil {
    return nil, errors.ErrUserAlreadyExists
}

if err != nil {
	return nil, err
}
```

adapter層で以下の様にチェックし、ハンドリングします。
```go
if err != nil {
	if errors.Is(err, errors.ErrUserAlreadyExists) {
		helper.HandleNotFound(c, err)
	} else {
		helper.HandleInternalServerError(c, errors.ErrFailedCreateUser)
	}

	return
}
```

これにより、sqlパッケージのエラー比較（例えば、sql.ErrNoRows）なども同じ使用感でエラーハンドリングできるため一貫した開発が行えます...！

# おわりに
Go + クリーンアーキテクチャで行うエラーハンドリング戦略について記載してみました！
より良い方法知っている有識者の方がいましたらぜひご指摘お願いします🙏
Goでアプリケーションでクリーンアーキテクチャを採用しており、エラーハンドリングについて迷っている人がいましたらぜひ参考にしてみてください！

冒頭でも記載しましたが、[PaPut](https://paput.io)というサービスのβ版をリリースしました！
是非手軽に使って、フィードバックいただけますと嬉しいです！
PaPutについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)もご覧ください！
htmlで単語ごとに改行してレスポンシブにする

# はじめに
今回は幅が狭くなったときに単語ごとに改行し、自然なレスポンシブデザインにする方法をご紹介します。

# 課題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/a4137487-b0a3-7dc6-b9e8-9a746c5a8acf.png)

上記のようにただテキストをならべると単語の途中で改行されてしまい、見栄えや可読性が悪いです。

# やり方
spanタグで単語ごとに囲うとレスポンシブ対応ができます。

```sample.html
 　　　　　　　 <div>
		<span>りんご</span>
		<span>すいか</span>
		<span>ぶどう</span>
	  </div>
```


さらに、spanタグに
`display: inline-block;`を付与します。

```globals.css
 span {
      display: inline-block;
}
```

そうするとspanタグごとに綺麗に折り返しすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/af60a955-f245-20a8-861e-1e6cc47e754b.png)

さらに改行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/a70dbe75-0944-1502-fe1e-cf7b139640b7.png)



# おわりに
いかがだったでしょうか。
簡単に綺麗な改行ができるので非常に使い勝手が良いです。
ぜひ試してみてください！
【Python】Excelのデータを別のブックにコピーする(単体)

import openpyxl as px

#aというExcelをwbに関連づける
wb = px.load_workbook('Book1.xlsx')

#aシートを関連付け
ws = wb['Sheet1']

#bというExcelをwbに関連づける
wb2 = px.load_workbook('Book2.xlsx')

#bシートを関連付け
ws2 = wb2['Sheet1']

#コピー元をaシートの任意のセル
copy = ws.cell(row = 3, column =1).value

#コピー先のbブック、bシートにコピー元のデータを貼り付け
ws2.cell(row =2, column =1 , value = copy)

#bブックを「copy4」で保存する
wb２.save(filename = 'copy4.xlsx')
Ubuntuをインストールしたらwifiが使えず、オフラインでどうにかしたい

# はじめに

WindowsからUbuntuに変更をしたらwifiが使えなくなっており、ドライバをいれないといけない
しかし有線LANをつなぐことができなかったので困りました

# 問題

https://releases.ubuntu.com/focal/

http://cdimage-u-toyama.ubuntulinux.jp/releases/jammy/

この2つを試しに入れてみたのだがなぜかwifiが使えない
PCのwifiがドライバに対応していないようで困ってしまった

# 解決方法

Ubuntuの最新版をいれることで無事解決
PCが新しいなら新しいやついれたほうがよさそう

https://jp.ubuntu.com/download

ちなみに24.04をいれました

# おわりに

PCのセットアップで一日が消えました
[TypeScript]コールバックのタイプは基本的にオプショナル

forEachのようなメソッドを使うと、以下のように`value`, `index`, `array`を持ったコールバックを使うことができる。このコールバックを型定義してみよう。

```ts
[10, 20, 30].forEach(
    (value: number, index: number, array: number[]) => {
        console.log();
    }
);
```

しかし、引数を省略して使う時も多い。ということは型に`?`をつけるべきでは？と思い、調べてみた。
```ts
// indexやarrayを使わないときも多い
[10, 20, 30].forEach(
    (value: number) => {
        console.log();
    }
);

// 全部省略することも
[10, 20, 30].forEach(
    () => {
        console.log();
    }
);
```

## 公式の型定義
TypeScript公式でforEachの型定義をしているところを見ると以下の通りである。
```lib.es5.d.ts
forEach(
    callbackfn: (
        value: T, 
        index: number, 
        array: readonly T[]
    ) => void, 
    thisArg?: any
): void;
```
`callbackfn`の引数を見てみるとオプショナルの`?`がついていないことがわかる。

## なぜ？
基本的にTypeScriptでは**コールバックの引数を全てオプショナル**だと決めている。
そのため、型定義の時には`?`をつけなくてもいい。

どちらかというと、読む時もコールバックの引数はオプショナルがついている前提で読む方がいい。

## 参考

https://github.com/microsoft/TypeScript/blob/main/src/lib/es5.d.ts
やむを得ずpre-commitを無視する方法

# はじめに

lintルールやコードフォーマットの統一のためにpre-commitを導入することがありますよね。

ルールに従えていないコードをコミットできないようにすることでコード品質を保つことができますが、たまにはルールが守れていないままコミットしたい時があると思います。

::: note warn
業務時間終了や作業引継ぎのタイミングなど、やむを得ないタイミングだけです。
それ以外で強制的にコミットするのは好ましくないと思います。
:::

# やり方

やり方は簡単なのですぐにできてしまいます。
すぐにできてしまうけれど、やむを得ないタイミングだけにしましょう。

```bash
git commit --no-verify -m "commit message"
```

通常の`git commit`に`--no-verify`をつけるだけです。
Laravelで例外処理のカスタマイズを行う方法について

# はじめに
Laravelを使ってアプリケーションを作る時に、例外エラーが起きたときのハンドリングを設定することがありました。
そのときに例外をthrowするとどういうルートで、どこでエラーをキャッチするのかなどを調べたので、この記事にまとめます。

## 例外処理をthrowする記述
```php
$res_data = [
'code' => ApiConst::STATUS_CODE_VALIDATE_ERROR,
'messages' => $errors,
];

throw new HttpResponseException(response()->json($res_data, ApiConst::HTTP_CODE_200));
```

## throwしたデータはどこに投げられるのか
HttpResponseExceptionをthrowすると、例外がLaravelの例外ハンドラ（App\Exceptions\Handler）に渡されます。具体的には、renderメソッドでキャッチされ、その内容がレスポンスとして返されます。

### 例外ハンドラ（Handler）での処理
```php
public function render($request, Throwable $exception)
{
    if ($exception instanceof HttpResponseException) {
        return $exception->getResponse();
    }

    // その他の例外処理...

    return parent::render($request, $exception);
}
```

## 例外がthrowする場所
### throwされた場所:
上記のHttpResponseExceptionがthrowされる場所（例えば、コントローラーやサービスクラス内）。

### 例外ハンドラ:
HttpResponseExceptionは、Handlerクラスのrenderメソッドでキャッチされます。このメソッドは、throwされた例外に基づいてレスポンスを生成します。

## 例外処理にカスタムを入れたい時
カスタム例外クラスを作成します。app/Exceptionsディレクトリに新しいクラスファイルを作成します。
```php
<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Support\Facades\Log;

class Handler extends ExceptionHandler
{
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    public function render($request, Throwable $exception)
    {
        if ($exception instanceof CustomException) {
            $res_data = [
                'code' => $exception->getCustomCode(),
                'message' => $exception->getMessage(),
            ];
            return response()->json($res_data, $exception->getCustomCode());
        }

        return parent::render($request, $exception);
    }

    public function report(Throwable $exception)
    {
        if ($exception instanceof CustomException) {
            Log::error('カスタム例外発生: ', [
                'message' => $exception->getMessage(),
                'code' => $exception->getCustomCode(),
            ]);
            return;
        }

        parent::report($exception);
    }
}
```

## まとめ
カスタム例外クラスの作成：app/Exceptionsディレクトリに新しい例外クラスを作成し、必要なプロパティとメソッドを定義します。

カスタム例外のthrow：アプリケーション内で適切な場所でカスタム例外をthrowします。

例外ハンドラのカスタム化：App\Exceptions\Handlerクラスのrenderメソッドとreportメソッドをカスタムして、カスタム例外を適切に処理します。

これらのステップを踏むことで、Laravelアプリケーションにおける例外処理をカスタマイズすることができます。
Loguruでログを取る①

# はじめに
業務で流用しているログのソースコードを読んだ時、
意味わからんかったのでloggingについて調べてたら
Loguru見つけたので使ってみたら
分かりやすくて楽やった♪

https://qiita.com/shotakaha/items/0fa2db1dc8253c83e2bb

# ログを取るについて

ご参考になれば嬉しいです:relieved:

https://qiita.com/i-am-misaki/items/eb1b4b3cb8d38ff113ec

# Loguruとは
>Loguruは、Pythonで楽しいロギングを実現することを目的としたライブラリです。

https://loguru.readthedocs.io/en/stable/

# インストール
```python
pip install loguru
```

# 使い方
```python
from loguru import logger

logger.debug("That's it, beautiful and simple logging!")
```

###### 結果(ターミナル)
![スクリーンショット 2024-07-07 174047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/98fecb50-9e6d-3e94-1f1f-50e1906cd197.png)

# level
```python
logger.trace("trace message")
logger.debug("debug message")
logger.info("info message")
logger.success("success message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")
```
###### 結果(ターミナル)
![スクリーンショット 2024-07-07 174714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/0dc1070a-a199-8d83-8fad-3da3e96f3a64.png)

# add()
#### ハンドラーやフォーマット設定
```python
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
```
- __sink__(sys.stderr, pathlib.Path 他) ----> 出力先
- __format__ ----> 出力内容
- __filter__ ----> ログに記録された各メッセージをシンクに送信するかどうかを決定するためのオプション
- __level__ ----> sinkに送信するレベル

# logger.remove()
ターミナルへの出力をなくす

```python
logger.remove()

logger.add("log/app.log", format="{time} {level} {message}", level="DEBUG")
logger.warning("warning message")
```
ターミナルに出力はされませんが、
app.logにはログが残る
![スクリーンショット 2024-07-07 220554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/641f81ee-a7bd-c695-e3cd-ef916bbad083.png)


# 続く
https://qiita.com/i-am-misaki/items/1487e56934aa6e776883
【個人開発の練習】プロジェクト管理アプリ

メモ書き
* ユーザー登録
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/bff0a6a8-02e8-4899-40e5-282190d16f13.png)
* 登録済みのユーザーを登録しようとした時の重複チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/ddf76d2d-7a4a-7a89-c37b-7e7b846a8f24.png)
Laravel Mixとは

# はじめに
Laravel Mixは、Laravelフレームワークに組み込まれたフロントエンドアセット管理ツールであり、Webpackの設定を簡素化するために設計されています。
Laravel Mixを使用することで、JavaScriptやCSSのコンパイル、バンドル、ミニファイをシンプルに行うことができます。

## Laravel Mixとは
Laravel Mixは、Webpackをベースにしたフロントエンドビルドツールで、直感的なAPIを提供することで、開発者が複雑なWebpackの設定を意識することなく、簡単にアセット管理を行えるようにします。

### 特徴
簡単な設定
多様なビルドタスク（JavaScript、CSS、Sass、Lessなど）
自動バージョニングとキャッシュバスティング
ブラウザの自動リロード機能

## 主な機能と使用例
JavaScriptのコンパイル
JavaScriptファイルをコンパイルして、ブラウザで使用できる形式に変換します。
```
mix.js('resources/js/app.js', 'public/js');
```

Sass/LESSのコンパイル
SassやLESSファイルをCSSにコンパイルします。
```
mix.sass('resources/sass/app.scss', 'public/css');
mix.less('resources/less/app.less', 'public/css');
```

## まとめ
Laravel Mixは、フロントエンドアセットの管理を簡単にするためのツールです。
Laravel Mixを活用することで、効率的なフロントエンド開発が可能になります。