OmniAICreator/Qiita-1.07M huggingface dataset:
ジェネリック型

ジェネリック型は型定義するための機能である。既存の型を変換して新たな型を作るときに便利。
（例）LatestInvoiceという既存の型を定義する。そこから'amount'の型をnumberに変換したLatestInvoiceRawという新たな型を定義し利用するコードは以下のようになる。

```TypeScript
interface LatestInvoice {
  id: string;
  customerId: string;
  dueDate: Date;
  items: InvoiceItem[];
}

export type LatestInvoiceRaw = Omit<LatestInvoice, 'amount'> & {
  amount: number;
};

const invoice: LatestInvoice = {
  id: '12345',
  customerId: 'ABC123',
  dueDate: new Date('2024-04-17'),
  items: [
    {
      description: 'Product A',
      quantity: 1,
      unitPrice: 100,
    },
    {
      description: 'Product B',
      quantity: 2,
      unitPrice: 200,
    },
  ],
};

const invoiceRaw: LatestInvoiceRaw = {
  id: invoice.id,
  customerId: invoice.customerId,
  dueDate: invoice.dueDate,
  items: invoice.items,
  amount: calculateInvoiceAmount(invoice),
};

function calculateInvoiceAmount(invoice: LatestInvoice): number {
  let total = 0;
  for (const item of invoice.items) {
    total += item.quantity * item.unitPrice;
  }
  return total;
}
VMWareのCentOS7でdestination host unreachableが出てから直した話

VMWare使っててyum installしようとしたらmirrorが見つからないとか出たのでping打ったら何も出ない！ということで5日くらい悩みました。単純なことでした。

VMWareのネットワーク設定をブリッジにしていたのですが、ブリッジを選ぶだけではだめなようで
アダプタの設定でWIFIを選ばないとちゃんとWIFIをつなげてくれない...という事実。

こちらも試しました。

https://qiita.com/tatsuya-k_net/items/48fba7c5b54ad3e0e29d

こちらも試しました。

https://qiita.com/gi-mo-8910/items/8341dc654958892125e7
小さいQRコードを検出する

この記事は以下のサイトを参考にしたものです．
https://zenn.dev/ijiwarunahello/articles/e1d26d393a02ec

# opencvでQRコードを検出する
通常の方法では，以下のコードで，QRコードを検出する．
```python
import cv2
import pyzbar.pyzbar

filename = "/path/to/image.png"

img = cv2.imread(filename)
res = pyzbar.pyzbar.decode(img)
print(res)
```
ただし，この方法では小さいQRコードが検出されないため，別の方法を考える必要がある．

# WeChatQRCodeで小さいQRコードを検出する
小さいQRコードを検出するにはWeChatQRCodeを使うのが良い．
WeChatQRCodeはopencv-contrib-pythonをインストールしておく必要がある．
```bash
$ pip install opencv-contrib-python
```

また，以下のサイトから，wechat qrcodeを動かすために必要なファイルをダウンロードしておく必要がある．
https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode

以下の4つのファイル．

* detect.caffemodel
* detect.prototxt
* sr.caffemodel
* sr.prototxt

```bash
$ cd /path/to/store/files
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/detect.caffemodel
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/detect.prototxt
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/sr.caffemodel
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/sr.prototxt
```

以下のコードで，QRコードを検出する．
```python
import cv2

filename = "/path/to/image.png"

img = cv2.imread(filename)
detector = cv2.wechat_qrcode.WeChatQRCode("/path/to/detect.prototxt", "/path/to/detect.caffemodel", "/path/to/sr.prototxt", "/path/to/sr.caffemodel")
img = cv2.cvtColor(cv2.COLOR_BGR2RGB)
data, points = detector.detectAndDecode(img)
print(data)
print(points) # QRコードの4隅の座標が格納されている
```
input fileにカーソルポインターを追加する

## 問題
inputタグのfileタイプにcssで以下を当ててもカーソルにならない
```style.css
cursor: pointer;
```

## 解決方法
以下のコードでOK
```style.css
input[type=file]::-webkit-file-upload-button { 
  cursor: pointer;
}
```

## 参考
以下サイトのコメント部分を参考にした

https://t-avant.blogspot.com/2015/05/blog-post_20.html
WSL2 に homebrew をインストールする

過去、会社のPCと自宅PCにぞれぞれ2回インストールしてますが、今日またインストールすることになりました

毎回公式サイト見ながらやっていたのですが、微妙に時間掛かるのでいい加減に手順をまとめて残しておこうかと思いメモ

# 日本語公式サイト

https://brew.sh/ja/

# インストール前準備

### homebrew を動かすのに必要なもの

- Linux 3.2 or newer
- Glibc 2.13 or newer
- 64-bit x86_64 CPU

### 下記コマンドを実行

```bash
sudo apt-get upgrade
sudo apt-get update
sudo apt-get install build-essential procps curl file git
```



### 参考ページ

https://docs.brew.sh/Homebrew-on-Linux

https://kazuhira-r.hatenablog.com/entry/2020/11/30/204027

https://packages.ubuntu.com/ja/focal/s390x/procps


# インストール

日本語公式サイトのこちらに載っているコマンドをコピーして実行

![スクリーンショット 2024-04-17 193205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/14670a9f-aa2f-fbaa-7cd1-f36a17b0a9cc.png)

## コマンド

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

下記が表示されれば正常終了

```bash
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/kazumacchi/.bashrc
    eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
- Install Homebrew's dependencies if you have sudo access:
    sudo apt-get install build-essential
  For more information, see:
    https://docs.brew.sh/Homebrew-on-Linux
- We recommend that you install GCC:
    brew install gcc
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh

```

# パスを通す

インストールは完了しましたが、パスを通すまでは homebrew を利用できません
パスの通し方もインストール時に教えてもらえます

Next Steps の箇所に、パスを通すのにコマンドが表示されています

```bash
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/kazumacchi/.bashrc
    eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
```

Run these two commands in your terminal to add Homebrew to your PATH: の下の2つのコマンドを実行します

:::note warn
上記のコマンドは僕の環境で表示されたコマンドのため、他の方は利用できません
自身のターミナルに表示されたコマンドを実行してください
:::


# ターミナルを再起動して homebrew バージョンを確認

正常に表示されればOK

```bash
brew --version
```

お疲れ様でした
ベイジアンABテストを自動でやってくれるGPTsを作ってみた

## ABテスト検証くんについて
職場のGPT4活用企画用に突貫で作成したベイジアンABテストの自動化をツールを公開します
以下はABテスト検証君の自己紹介です

https://chat.openai.com/g/g-gcvsNCXmm-abtesutojian-zheng-kun


## はじめに

ABテストは、ウェブデザインの改善、マーケティング戦略の最適化、製品機能の判断など、さまざまな分野で効果的な意思決定を支援する重要なツールです。しかし、伝統的なABテスト手法では、統計的有意性を得るためには大量のデータと長い時間が必要です。そこで、ベイジアン統計を用いたABテストが注目されています。

「ABテスト検証くん」は、ベイジアンABテストを簡単かつ効率的に実行するためのAI駆動ツールです。統計の専門知識がないユーザーでも、直感的な会話形式でABテストを設計し、実行結果を解析できます。

## 特徴

### 1. ユーザーとの対話によるパラメータ設定

ABテスト検証くんは、ユーザーの質問に答えることで必要なパラメータ（試行回数、成功回数など）を収集します。この対話形式は、ユーザーがテストの設計を理解しやすくするために最適化されています。

### 2. ベータ分布に基づく統計分析

収集したデータに基づき、ベータ分布を使用して各バリエーションの成功確率を推定します。これにより、AとBのどちらが優れているかをより確かに判断できます。

### 3. シンプルで明確な結果報告

結果は、確率的な言及とともに、信用区間を用いて視覚的にも分かりやすく提示されます。さらに、どのバリエーションが優れている可能性が高いか、統計的に有意な差があるかどうかも報告します。

## 使用例


#### ユーザー入力
Aの試行回数は2000回で成功数は160回です。
Bの試行回数は2000回で成功数は190回です。

#### ABテスト検証君
ありがとうございます。データを受け取りました。これでAとBの試行回数と成功数が揃いました。次に、ベイジアンABテストに基づいて統計分析を行います。

まずは以下のステップで進めます：
1. AとBの成功率の推定値を計算します。
2. 95%信用区間を算出します。

これに基づいて、AとBの平均成功率を見ていきましょう。計算を始めますね。

AとBの平均成功率とその95%信用区間は以下のようになりました：

- **Aの平均成功率**: 約8.04% (95% 信用区間: 約6.89% から 約9.27%)
- **Bの平均成功率**: 約9.54% (95% 信用区間: 約8.29% から 約10.86%)

次に、AとBの平均成功率に基づき、どちらがより高い成功率を持つ可能性が高いか、そしてそれに有意差があるかどうかを評価するためのサンプリングを行います。この手順で、両バリエーションの成功率の違いについてより詳細な洞察を得られます。

このステップに進んでもよろしいでしょうか？

#### ユーザー入力
続けて

#### ABテスト検証君
サンプリングによる結果は以下の通りです：

- **A > B の確率**: 約4.26%
- **B > A の確率**: 約95.74%
- **有意差**: あり

この結果から、Bの方がAよりも成功率が高い可能性が非常に高く、その差には統計的に有意な差があることが示されました。

次に、この結果に基づいて最終的な結論を述べ、AとBの成功率に関する確率密度関数を視覚化する手順に進むことができます。このステップに進みますか？それとも他に気になる点がありますか？

## 結論

ベイジアンABテストを活用することで、データの不確実性を明確に理解し、より情報に基づいた意思決定が可能です。ABテスト検証くんは、この複雑なプロセスを簡略化し、すべてのユーザーが統計的手法を活用できるように支援します。興味のある方はぜひ、このツールを使ってみてください。

---
スパースチェックアウトのやり方

```bat
REM .gitディレクトリのみがcloneされる
git clone --sparse --filter=blob:none --no-checkout [リポジトリURL]

REM さらにシャローコピーも（最速clone）
git clone --depth=1 --sparse --filter=blob:none --no-checkout [リポジトリURL]

REM チェックアウト対象のセット（それまでの内容を破棄して上書き）
git sparse-checkout set [ディレクトリ名]

REM チェックアウト対象の追加（それまでの内容を残して追加）
git sparse-checkout add [ディレクトリ名]

REM チェックアウト対象の確認
git sparse-checkout list
```
【セキュリティ入門】HTTP Flood DDoS攻撃

# HTTP Flood DDoS攻撃とは

HTTP Flood DDoS攻撃はDDoS攻撃の一種でHTTPリクエストを使用しサービス拒否を発生させる攻撃です。
HTTP Flood DDoS攻撃には主にHTTP GET攻撃とHTTP POST攻撃の2種類あります。

![http flood.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a19995af-7840-272b-5ffd-5b8cc6a4e999.png)

## HTTP GET攻撃

攻撃者が大量のGETリクエストをアプリケーションサーバーに送信します。
サーバーは大量のリクエストを処理しきれず最終的に他の正当なリクエストに応答できなくなります。

## HTTP POST攻撃

攻撃者は大量のPOSTリクエスをアプリケーションサーバーに送信します。
POSTリクエストではデータベース処理などサーバーのリソースを相対的に多く消費します。
結果、サーバーの処理の応力を飽和状態にしてサービス拒否を発生させます。

# 攻撃ツール

HTTP Flood DDoS攻撃のツール例を挙げます。

- [Saphyra-DDoS](https://github.com/H1R0GH057/Anonymous.git)
    - 2016年に確認された
    - 3,200を超える一意のユーザーエージェント文字列と300を超える一意のリファラーフィールド文字列が含まれている
- [HOIC](https://en.wikipedia.org/wiki/High_Orbit_Ion_Cannon)
    - GUIが用意されている
    - 最大 256 のドメインを同時に攻撃できる
    - 効果的な攻撃を開始するには最低 50 人のユーザーが必要であり、標的の Web サイトが保護されている場合は攻撃を継続するにはさらに多くのユーザーが必要
- [LOIC](https://ja.wikipedia.org/wiki/LOIC)
    - 2010年頃報告例が挙げられれた
    - pythonで書かれているが別言語バージョンもある

# 対策

対策の一例を挙げます。

- WAF
    - サービスや機器の導入
    - オープンソースのWAFとして[ModSecurity](https://en.wikipedia.org/wiki/ModSecurity)などがあります
- ロードバランサー
    - 負荷分散を行う
- CAPTCHA認証
    - 自動化された攻撃ツールの阻止

# 参考サイト

https://www.cloudflare.com/ja-jp/learning/ddos/http-flood-ddos-attack/

https://www.akamai.com/ja/glossary/what-is-an-http-flood-ddos-attack
経路積分を使った経路積分制御 ~モデル予測経路積分制御：MPPIの事前準備~

# はじめに
経路積分を使った経路積分制御が面白かったので紹介する。経路積分は、確率解析や量子力学などで登場する。それに対応するように、産業向けに最適化問題を設計したのが、経路積分制御である。


# 経路積分

経路積分をしらなかったが、緒方秀教先生と前野昌弘先生がわかりやすくまとめてくださっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/0756c2a8-3c2d-e1fe-1b99-674629c0544a.png)


- [緒方秀教先生、経路積分](https://www.youtube.com/watch?v=MCTPqvEZocM)
- [前野昌弘先生、経路積分とはなにか？１](http://irobutsu.a.la9.jp/movingtext/pathintegral1.html)
- [前野昌弘先生、経路積分とはなにか？２](http://irobutsu.a.la9.jp/movingtext/pathintegral2.html)
- [前野昌弘先生、経路積分とはなにか？３](http://irobutsu.a.la9.jp/movingtext/pathintegral3.html)

# 経路積分制御

経路積分制御は、経路積分におけるポテンシャルを工学の用途に適した関数に変更することで、産業応用を可能にした。

次の確率微分方程式を考える。

```math
dx_t = (f(x_t)+G(x_t)u_t)+B(x_t)dw
```

コスト関数を考える。

```math
\mathcal{L}(x_t,u_t) = c(x_t)+\dfrac{1}{2}u^T_t R(x_t)u_t
```

価値関数$V(x)$を考える。

```math
V(x)=\min_u\mathbb{E}\left[\phi(x_T)+\int_{0}^{T}\mathcal{L}(x_s,u_s)ds\right]
\tag{1}
```

ここで、

```math
BB^T = \lambda GR^{-1}G^T
\tag{2}
```

とおくと、最適制御入力は、

```math
u^\ast_t (x_t)= -R(x_t)^{-1}G(x_t)V_x
```


ステージコスト$S(\tau)$を下のように考える。

```math
S(\tau)=\phi(x_T)+\int_{\tau}^{t_f} c(x_t)dt
```

Feynman-Kac Lemmaを使えるようにするために、わざわざ$\Psi(\tau,x)$を下のようにおく。

```math
V(\tau,x)= -\lambda\log(\Psi(\tau,x))
\tag{3}
```

すると、式(1)の確率的HJB方程式と式(2)から、$\Psi(\tau,x)$の線形偏微分方程式が得られる。これにより、Feynman-Kac Lemmaが使えるようになり、Green関数$\Psi(\tau,x)$をえる。

```math
\Psi(\tau,x)=\mathbb{E}_{\mathcal{P}}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)\right)
\Psi(T,x_T)
\right]
```

式(3)を$x$について偏微分すると、最適入力を得る。

```math
u^\ast(\tau) dt= R^{-1}G^T(GR^{-1}G^T)^{-1}
\dfrac{\mathbb{E}_{\mathcal{P}}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)\right)Bdw
\right]}{\mathbb{E}_{\mathcal{P}}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)\right)
\right]}
```

近似することを考える。

```math
dw \simeq \sqrt{\Delta t}\varepsilon, \ \ \varepsilon\sim \mathcal{N}(0,I)
```

特に、$B$を下のようにおくと

```math
B=G\sqrt{\Sigma}
```

最適入力は、下のようになる。

```math
u^\ast(\tau)=
\dfrac{\mathbb{E}_{\mathcal{P}}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)\right)\sqrt{\Sigma}\varepsilon
\right]}{\mathbb{E}_{\mathcal{P}}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)\right)
\right]}
```

モンテカルロ法により、経路$x(t=\tau\rightarrow t=t_f)$をサンプリングすることを考え、近似して解く。

```math
u^\ast(\tau)\simeq
\dfrac{\sum_{i}
\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)^i\right)v_i\right]}

{\sum_{i}\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)^i\right)\right]}
```

```math
v_i\sim\mathcal{N}(0,\Sigma)
```

また、時刻$\tau$、経路$x(\tau\rightarrow t_f)$に存在する状態の共存程度は、下のようになる。

```math
\hat{\Psi}(\tau,x(\tau\rightarrow t_f)) \simeq \dfrac{1}{N}\sum_{i}^{N}\left[\exp\left(-\dfrac{1}{\lambda}S(\tau)^i\right)\right]
```



# モデル予測経路積分制御：MPPI

経路積分制御は、経路がStart地点とGoal地点が確定していることを想定しており、現実的ではない。そこで、経路積分制御をモデル予測制御の枠組みに落とし込んだのが、モデル予測経路積分制御（MPPI）である。下の記事がわかりやすい。

https://zenn.dev/takuya_fukatsu/articles/36c0d6911d18b7



# 参考文献
- [Information Theoretic Model Predictive Control: Theory and Applications to Autonomous Driving](https://arxiv.org/abs/1707.02342)
- [経路積分制御の講義資料](https://www.syscop.de/files/2023ws/mpcrl/lecture-10-Hannes_Jasper_MPPI.pdf)
[小ネタ] NewRelic のダッシュボード一覧を取得する

# 発端
ダッシュボードの棚卸しをするために、アカウントをまたがってすべてのダッシュボードを一覧化したかったんですが、CSV でダウンロードしたり NRQL の情報引き出し先エンティティがわからなかったため、 NerdGraph を使って解決しました。
本記事は、一覧化までの記録です。


# NerdGraph で NewRelic のダッシュボードを一覧化
ググって最初に検索に引っかかったのは `actor.dashboard` の方でしたが、ここには `liveUrls` という属性しかぶら下がっていませんでした。

`actor.entity(guid: String)` で GUID を指定したところ目的の情報が出力できたので、この一覧を取るには・・・ということで [actor.entitySearch](https://docs.newrelic.com/jp/docs/apis/nerdgraph/examples/nerdgraph-entities-api-tutorial/) にたどり着きました。

GraphQL クエリはこんな感じ。

```graphql:nr_dashboards.graphql
{
  actor {
    entitySearch(queryBuilder: {
      type: DASHBOARD
    }) {
      results(cursor: "<nextCursor値>") {
        nextCursor
        entities {
          ... on DashboardEntityOutline {
            name
            dashboardParentGuid
            permalink
            account {
              name
            }
          }
        }
      }
    }
  }
}
```

`dashboardParentGuid` が null になっているのがダッシュボード本体、 not null がダッシュボードのページを表します。
200 件を超えるとページングが発生するので、 2 ページ目以降はレスポンスで返ってきた `nextCursor` を指定する必要があります。

# TSV への加工
GraphQL のレスポンス (JSON) を以下のワンライナーで加工してスプレッドシートに貼り付けました。

```sh
$ jq -r '.data.actor.entitySearch.results.entities[] | [.name, .account.name, .dashboardParentGuid, .permalink] | @tsv' result.json
```
「System has not been booted with systemd as init system (PID 1). Can't operate.」のエラー解決


WSL2上にインストールしたUbuntuからsystemdにてdockerを起動しようとした際に、起動できず軽くハマってしまったため備忘として残します。

# 環境
- Windows11 
- WSL2
- Ubuntu 22.04.3 LTS
- Docker Engine


# エラー概要
WSL上のUbuntuにインストールしたDockerを起動しようとしたら以下のエラーが発生。
systemdがPID=1になっていないことが原因らしい。
```shell
XXX@XXX:~$ systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

# プロセスからPIDを確認
確認するとPID=1は、`/init`が実行されている。
```
XXXX@XXX:~$ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1824  1192 ?        Sl   11:29   0:00 /init
root        11  0.0  0.0   1812    84 ?        Ss   11:29   0:00 /init
root        12  0.0  0.0   1812    92 ?        S    11:29   0:00 /init
```

systemdの実体は`/sbin/init`のため、本来は`/sbin/init`がPID=1で実行されていないといけない。
```
XXX@XXX:~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Sep 20  2023 /sbin/init -> /lib/systemd/systemd
```


# 試したこと
以下の流れにて、原因を確認してエラーを解決した。

## WSL側でSystemdが有効になっているか確認
https://learn.microsoft.com/ja-jp/windows/wsl/systemd

上記サイトを参考に`/etc/wsl.conf`を確認。
systemdを利用するパラメータは設定されている。
```bash

[boot]
systemd=true

```

WSLを再起動すれば、有効化されると判断し、Powershellから以下コマンドを実行。
```Powershell
wsl --shutdown
```

再度、WSL上のUbuntuからsystemdが実行できるか確認したが、同じエラーが出力され解決せず。。。


## WSLのバージョンアップ
WSLのバージョンを確認していなかったため、バージョンを確認。
コマンドラインオプションが無効になっている。。。
```Powershell
 wsl --version
コマンド ライン オプションが無効です: --version
```

ここで、WSLをアップデートしていなかったことに気づき、WSLをアップデート。
```Powershell
wsl --update
```
WSLをアップデート後、WSLを再起動。
```Powershell
wsl --shutdown
```

PowershellからWSLのバージョンを確認。
```Powershell
wsl --version
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2

```
## Systemd動作確認
その後、プロセスからPIDを確認し、`/sbin/init`ファイルが実行されていることを確認。
```shell
XXX@XXX:~$ ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  4.8  0.0 167140 12608 ?        Ss   13:57   0:00 /sbin/init
root           2  0.0  0.0   2280  1304 ?        Sl   13:57   0:00 /init
```
systemdからDockerデーモンのステータスも確認。
以下から、問題なく実行できていることが確認できた。
```shell
XXX@XXX:~$ systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-04-17 15:44:42 JST; 3h 13min ago
TriggeredBy: ● docker.socket
```

無事、systemdを有効化させることができた。

# まとめ
普段、WSLを使用しないこともあり、軽くハマってしまいました。  
公式ドキュメントへの不十分な理解が原因であったことを認識し、今後はより注意深く取り組むように反省しています。
BCM3383をブートしてみた

以前ハードオフで108円で手に入れた、CATVのルーターをいじってみました。

このルーターはBCM3383を使ったものです。このチップはBroadcomのCATV用のMIPS SOCです。

シリアルのピンはハーフピッチでパターンが接続されてなかったので、使えるようにいじりました。

115200で以下のメッセージが確認できます。

```
BCM338332 TP0 346890
MemSize:            128 M
Chip ID:     BCM3383G-B0

BootLoader Version: 2.6.0-15-gac1e Release Gnu spiboot reduced DDR drive
Build Date: Mar 13 2015
Build Time: 15:41:05
SPI flash ID 0xc22018, size 16MB, block size 64KB, write buffer 256, flags 0x0
parameter offset is 40788

Auto tftp boot mode!! try to connect TFTP to doandload manufacture f/w!!

Signature/PID: 3383

Switch detected: 53125
ProbePhy: Found PHY 0, MDIO on MAC 0, data on MAC 0
Using GMAC0, phy 0

Enet link up: 1G full
Press any key within 0 seconds to abort tftp upgrade.
```

cfeやu-bootではないようです。何かキーを入力するとメニューが出てきます。

```
Main Menu:
==========
  b) Boot from flash
  g) Download and run from RAM
  d) Download and save to flash
  e) Erase flash sector
  m) Set mode
  s) Store bootloader parameters to flash
  i) Re-init ethernet
  k) Reconfig TFTP Info
  c) Back to Default
  v) Set tftp boot mode
  M) Set boot mode
  r) Read memory
  w) Write memory
  j) Jump to arbitrary address
  X) Erase all of flash except the bootloader
  z) Reset
```

ブートも作らないとだめかと思っていたのですが、いろいろ試したら使えそうなので、このブートを使うことにしました。

iやkでネットを設定してsして保存します。

freebsdのsys/mips/mips/locore.Sに一文字出力を入れます。

uartのアドレスは

shared/broadcom/include/bcm963xx/3383_map.h

というソースにあり、uartのレジスタの構成は

shared/broadcom/include/bcm963xx/bcm3383/uart.h

にあります。

```
GLOBAL(btext)
ASM_ENTRY(_start)
VECTOR(_locore, unknown)
        li      t0, 0xb4e00500
        li      t1, 0x55
        sw      t1, 0x14(t0)
```

これでビルドしてProgramStoreというプログラムでkbinをイメージにします。ProgramStoreはbroadcomのaeolusというレポジトリにあったのですが、64ビット環境でビルドするとおかしな動作になったので、直してZRouterに入れました。

ProgramStoreにたどりついたのはflashの中にあったecram_sto.binという文字列をgithubで検索したら、下記のページが出てきました。

https://github.com/jclehner/bcm2-utils/blob/9fbac2760362a518f95ed0aec24c3dd610acbe4e/doc/programstore.md?plain=1#L22

イメージをgコマンドでtftpして起動してみます。Switchの初期化が遅いのか電源投入後しばらくしないとネットワークが使えません。

```
TFTP Get Selected
Board TFTP Server IP Address [10.10.10.3]:  
Enter filename [freebsd.bin]: 


Destination: a5f00000

Destination: a5f00000
Starting TFTP of freebsd.bin from 10.10.10.3
Getting freebsd.bin using octet mode
......................................
Tftp complete
Received 2230045 bytes

Image 3 Program Header:
   Signature: 3383
     Control: 0001
   Major Rev: 8271
   Minor Rev: 8486
  Build Time: 2024/4/17 10:09:05 Z
 File Length: 2229953 bytes
Load Address: 80040120
    Filename: /tmp/freebsd.bin
         HCS: 3cd6
         CRC: 601643df

Store parameters to flash? [n] 
Performing CRC on Image 3...
CRC time = 48243367
Detected LZRW1/KH compressed image...decompressing...
Target Address: 0x80040120
Decompressed length: 3366416

Executing Image 3...




BOOT PARAM STRING(0x800008c4): HMXBLPA]BOOTMODE=normal;OFFSET=40788;

U
```

ブートできました。

BCM3383を使って面白そうなことしてる人見つけました。

https://stdw.github.io/cm-sdr/

どうもこれは、片側のThreadでecosが動いていて片側でLinuxが動いているシステムでecosを操っているようです。
JavaSilverに合格した話

# 受験背景
現在はC#をメインに仕事をしていて、Javaに触れる機会がなくなった
新卒から約5~6年Javaでの開発をしていて、
せっかくのJavaの知識を廃れさせたくないと思い受験を決意
JavaSilverはそこまで難易度も高くはない

# 勉強法
以下のみ黒本のみ
https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625

大体1日、2時間程度を土日以外の時間で勉強（基本的に土日は家族との時間に充てている）
約3ヶ月間続けた

触っていくうちにだんだん思い出してきて、他の参考書とかには手をつけず、黒本のみで対応できた
ただ問題を解いていくとJavaの構文も分かってくると思うので、個人的には他の参考書は不要に感じた

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516005/12a41cb0-4656-0589-e82c-64a7be701030.png)

特に問題なく合格することができた
ただ不正解のところが思っていたより多かったので復習が必要

# 今後の予定
次はJava　Goldを受験する予定
ただ他に基本情報も控えているため、いつ受験するかは未定
【シリーズすごいぞiQ-F】オムロン製調節計とプログラムレス通信する

## はじめに
オムロン社の回答ではiQ-F(FX5)と調節計E5□Cシリーズとはプログラムレス通信出来ないことになっています。
しかし、MELSEC-Qシーリズと同様に交信プロトコルの設定をMCプロトコル（形式4）とすることにより通信できるので設定方法を記載します。

:::note warn
FX5Uのファームウェアバージョンは1.060以降（2017/10更新）以上が必要です
:::

## 物理的な接続について
「E5□C デジタル調節計 通信マニュアル」に記載の「MELSEC-FXシリーズとの接続」を参照願います。

## 調節計の設定について
「E5□C デジタル調節計 通信マニュアル」に記載の「形E5□Cの設定」を参照願います。
その中で
+ プロトコル選択：MCP4
+ 通信速度：57.6（推奨）

 としてください。

 ## GX_WORKS3でのパラメータ設定
 通信に使用する485シリアルポートの設定を下記します。
+ プロトコル形式：MCプロトコル
+ データ長：7bit
+ パリティ：偶数
+ ストップビット：2bit
+ ボーレート：57,600bps
+ サムチェック：付加する
+ 局番設定：0
+ 伝文形式：形式4（XY 8進）
+ タイムアウト時間：1000ms（根拠無しE5□Cの受信待ち時間初期設定に合わせただけ）
+ 伝文ウェイト時間：10ms（10の倍数で設定、最小値とした）

## その他、プログラムレス通信の操作方法について
MCプロトコルを使用しているのでQシリーズに該当する項目を参照してください。

## ここだけの話
実はFX5Uのファームウェアバージョンが1.060より前でも通信速度を落とせばプログラムレス通信が可能でした。

ファームウェアが1.060となり、伝文ウェイト時間の設定が加えられたことによりフルスピードで通信が可能となりました。

## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
PrivacyTechNight #3「合成データ」セミナー参加報告


## はじめに
[PrivacyTechNight](https://privacytechnight.connpass.com/event/312694/)に参加し、金融、ヘルスケア、研究分野における合成データの最新動向と実用事例を学びました。この記事では、イベントにて話されていた、合成データの基本から業界別活用事例、今後の課題と期待についてまとめます。

## セミナー概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949790/896834c7-1271-4a62-9255-6127e2f0b17c.png)
出典：https://privacytechnight.connpass.com/event/312694/
### 開催日時
2024年4月16日（火）19:00-21:30
### 開催形態
オフライン
### 開催場所
LINEヤフー株式会社 22F オーディトリアム（東京都新宿区四谷一丁目6番1号 四谷タワー 受付:2Fオフィスエントランスホール）

## 合成データとは何か？
実際のデータセットの統計的特徴を模倣して生成されたデータです。元のデータと直接的な関係がないため、プライバシーを保ちながらデータ利用が可能です。類似するものとして、匿名加工情報があります。匿名加工の過程でデータ型(例：年齢19歳(int)->10代(string))や値域の変化が発生することがあります。合成データの場合は、実データと同様の処理が可能です。

## 発表1) ヘルスケア業界における合成データの事例
国外の事例が紹介されていました
- **ワシントン大学**: Covid-19診療データを合成データ化し、社外の分析者と連携して感染症対策を効率化。生データと同等の分析結果を得た。
- **MediData社**: 過去の治験データから対照群データを合成し、製薬のプロセスを効率化。
- **NHS Digital**: 検証・公開用に合成データを作成し、研究者に広く配布。作成された研究企画とプログラムは、審査に合格すれば、実データを用いた分析に進行。

### 感想
国外のヘルスケア分野では、医療データの社外提供や検証用データの配布、MediData対照群データの合成など、多岐にわたる用途で合成データが利用されています。合成データの安全な利用と効率化が特に進められている業界だと感じました。

## 発表2) 金融業界における合成データの活用事例
金融領域での合成データの活用事例として、以下が挙げられていました
- **ドイツの保険会社Provinzial社**: 部門間での機微なデータの合成データ化による連携を実現。連携時間を3か月短縮し、生データと比較して97%の精度を維持。
- **FDUAデータ分析コンペ**: 合成データを使用し、データ分析コンペを実施。従前は列名や値が匿名化されたマスキングデータでコンペを実施しており、金融のドメイン知識が活用できなかった。今回は列名と値が保持された合成データを用いており、金融のドメイン知識が利用できるようになった。

### 感想
金融業界では、特に内部データ連携としての応用が考えられていると感じました。また、ドメイン知識を使用することができる点は匿名加工データと比べて大きな利点だと考えます

## 発表3) LINEヤフーの差分プライバシー×合成データの研究事例
差分プライバシーや合成データに関する研究開発成果が紹介されていました
- **LINEスタンプのサジェスト機能**: LINEスタンプの推薦に際して、連合学習と差分プライバシー技術を利用した機械学習モデルを用いて、安全性を担保した。
- **差分プライバシー×合成データ**: GANによる合成データ生成の過程で得られる統計情報の安全性を差分プライバシーにより担保した。
- **著作権保護のための敵対的透かし**: 画像生成AIでデータが加工された場合に、事前に挿入された透かしが浮き上がり、著作権の主張及び意図しない二次創作を抑止。

### 感想
合成データは元のデータと紐付かないため安全と考えていました。ですが、その生成プロセスにおける統計情報の安全性を考える新しい視点が示されました。

## 発表4) 合成データの学会活動動向
- **データ合成技術評価委員会の設立**: ”データ合成技術の安全性・リスク評価、基準検討”と”適切なデータ合成技術の啓発・社会実装”の２つの活動を行う。
- **合成データの安全性・リスク評価**: リスクアセスメントツール「TAPAS」による合成データの安全性検証は有効であることが示された。一方で差分プライバシの安全性パラメータεを実験的に推定する機能の精度に課題あり。

### 感想
合成データの活用を進める中で、本当に合成データは安全なのか考えさせられる内容でした。社外データ連携のために、合成データが本当に社外に出しても良い安全なデータになっているか検証するための仕組みは作っていく必要があると感じました。

## パネルディスカッションのハイライト
- **合成データへの期待**: 
  - 社外連携のためには、合成データが本当に安全か検討が必要であるため、まずは社内での利活用に期待したい。
  - また、活用イメージを明確にするためのサンプルとして期待している。カタログ＋合成データをみることにより購入前に実利用のイメージができる。
  - データの匿名化時は、どのように活用されるかのイメージがないと、どのようは有用性を重視して加工すべきかわからないという課題がある。合成データを先に試用してもらい、利用目的を把握できれば、その利用目的に合わせた有用性を維持する加工ができる。
- **合成データの課題**: 
  - 合成データでも97%の精度がでるという話があったが、そのデータはほとんど加工されていない危ない合成データの可能性がある。安全な合成データかどうか判断するためにもリスクアセスメントツールが求められる。
  - 合成データを使うか、最終的な意思決定をユーザー企業がしなければならないことも課題として考えられる。医療や金融分野ではデータ活用がもともとされており、倫理審査委員会などがあるため実行へのハードルは低い。一方で、その他の分野では最終的な意思決定のハードルが高いのではないか。

## 終わりに
このセミナーを通じて合成データの潜在的なリスクと具体的な活用事例を深く理解できました。データプライバシーを保ちつつ新たなビジネス機会を創出する有力な手法として、課題は多いが、その可能性を感じました。
[nginxのenv設定]v1.9前後での設定の違い

# 経緯
nginxの環境変数の扱いに思ったより手こずったので、記録を残しておきます。

本番環境とステージング環境はほぼほぼ一緒なので、一緒の設定で、環境変数を使って使い分けられないかと思いました。

ただ、docker composeを用いているので、いつものようにenvファイル等で指定しても動かない...

# 解決法1
nginx　v1.9以前の設定です。
まず、nginx.confのtemplateファイルを作成します。
利用したい環境変数を、`${ENV_VAR}`のような形で指定します。

```nginx.conf.template
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream my-app-1 {
        server my-app-1:${PORT};
    }
```

そして、envsubstで置換します。注意点は、`nginx.conf`では、`$host`のような記述がデフォルトでサポートされており、envsubstではそれも環境変数として認識されてしまいます。置換する環境変数の値だけを変えたい場合は以下のように設定できます。

`envsubst '$$PORT' < nginx.conf.template > nginx.conf`


そして、docker composeで起動時のエントリポイントをこのbashを実行するように設定してあげます。

```yaml
version: '2'
services:
  nginx:
    image: nginx:alpine
    command: >
      /bin/sh -c
      "envsubst '
      $$NGINX_SERVER_NAME
      $$NGINX_UPSTREAM_HOST
      $$NGINX_UPSTREAM_PORT
      '< /etc/nginx/nginx.conf.template
      > /etc/nginx/nginx.conf
      && nginx -g 'daemon off;'"
    volumes:
      - ./nginx.conf.template:/etc/nginx/nginx.conf.template
    ports:
      - 8080:80
    environment:
      NGINX_SERVER_NAME: "test.example.com"
      NGINX_UPSTREAM_HOST: "hoge"
      NGINX_UPSTREAM_PORT: "80"

```

ちなみに、bashファイルを作成する方法もあります。

```sample.sh
#!/bin/sh

envsubst '$$PORT' < nginx.conf.template > nginx.conf
```

```yaml
version: '2'
services:
  nginx:
    image: nginx:alpine
    command: "chmod +x /docker-entrypoint.d/sample.sh"
    volumes:
      - ./nginx.conf.template:/etc/nginx/nginx.conf.template
      - ./sample.sh:/docker-entrypoint.d/sample.sh
    ports:
      - 8080:80
```

でも上記の方法だと、ステージングと本番で環境変数を渡すbashを別々に作らないといけないような気がします...

# 解決法２
のちに知ったのですが、dockerのnginxでは、 **v1.9以上** だと、自動的に`nginx.conf.tamplate`ファイルを、自動的に置換するスクリプトが動きます。

templateフォルダを作成し、`nginx.conf.tamplate`をtamplateフォルダ配下におきます。

そして、以下のように`/etc/nginx/templates`にマウントすることでenvsubstで処理されます。

```yaml
version: "3"
services:
  nginx:
    image: nginx:1.21.4
    volumes:
      - ./templates:/etc/nginx/templates
    ports:
      - "8080:80"
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80
      - PHP_HOST=php
```

置換されたファイルは`/etc/nginx/conf.d/`フォルダに作成されます。

# 最後に
実際にやってみて、やっぱり2番目の解決法が1番目と比べて楽でした。
バージョンアップ大切。

# 参考文献

https://qiita.com/suzu616masa4gm/items/df52437853cdd34c229f

https://book.st-hakky.com/hakky/how-to-use-env-var-nginx/

https://kdnakt.hatenablog.com/entry/2022/03/27/nginx-docker-template-with-envsubst

https://qiita.com/minamijoyo/items/63ae57b99d4a4c5d7987

https://zenn.dev/mizti/articles/ccb5f988de31c6
CBOWの仕組み

○単語をベクトルに直す
→単語の意味を詳しく表すために
○そのベクトルの平均を取る
→その単語すべてを含めるとどんな意味なのかを推測するため。つまり、文脈の意味を推察するため
○ベクトルの平均を取ったものと、予測される単語の内積をかける（予測される単語とは、20万くらいある単語のすべてのベクトル）
→ベクトルとベクトルの内積とは、それぞれのベクトルの「距離」を表すものである。（cosθに絶対値をかけている）
→つまり、内積を取ることで文脈と特定の単語の意味の「差」を知れる
○ここからsoftmax関数で確率に戻す
→活性化関数とは与えられた数値を分類しやすいようにできる関数のこと。
→中でもsoftmaxは出力した数値を確率に戻せる
こんな状況で設計書なんか作ってる場合じゃない！！

# こんな状況で設計書なんか作ってる場合じゃない！！

ってこと、エンジニアなら誰でも経験ありません？:frowning2:
言葉にできないくらい炎上している状況ってコトです。

ただ、そんな状態でも、~~PJのために~~　自分のためにも絶対に設計書は作った方が良いです。
だって、PJってどんなに短くても2~3ヶ月以上はかかるでしょ？
2ヶ月前の内容なんて覚えてます？
昨日の晩御飯も忘れているのに？

じゃあわざわざ設計書にせんでも、Excelにメモ書きでええやん！って？
**何のメモか絶対忘れるよ**
だって、昨日の晩御飯（以下略

まぁつまり、私は記憶ほど信じられないものはないって思ってるんです。
テスト前の「勉強してない」っていう友達の言葉くらい信じられないんです。
しかも自分だけの記憶ならまだしも、人の記憶なんて尚更です。
共通認識がブレないようにするためにも、絶対に **設計書っぽい何か** は必要です。

ただ、極限状態で「この設計は対応して、この設計は省く！」っていう選定までしてたら発狂しちゃいそうなので、この記事では「最低限、この設計はした方が良いよ！」という未来の私のために向けた提案です。（この記事を参考にする日が来ないことを祈っています）

もちろんPJの内容によって状況は変わってくるので、取捨選択はしてくださいね。

賛否両論あると思いますので、ご意見どしどし受け付けます:star2:
※ただし、打たれ弱いので優しくコメントしてね

:::note warn
警告
これはとっても炎上している案件に突っ込まれて困っている方向けの提案です。
ちゃんとした手順で案件を回せている方は、[IPAの設計](https://www.ipa.go.jp/archive/digital/tools/ep/ep1.html)とかを参考にしてね。

そもそも設計段階で炎上が見えている案件は、一生炎上している案件なので、スケジュール調整なり人員調整なり、設計に入る前の段階でアクションした方が絶対に良いですヨ。

設計に入る時間がないんじゃ！！っていう場合は...もうほんとご愁傷様です:sob:
あなたに500円玉を拾うような幸運が訪れることを祈っています:flushed:
:::

## :robot: テーブル定義 ※ER図でも可！:robot:
とりあえず、テーブル定義さえあれば...！
システム屋はなんとかできます:wink:

### 最低限必要な項目
・物理テーブル名
・物理名称
・データ型
・NULL許容
・PK

新規で作成する場合は、無理に外部キーやINDEXをつける必要はないです。
つけた方が、パフォーマンスが上がることは間違いなしですが、適切につけないと意味がないからです。
適当につけた外部キーが悪さすることもよくある話です。
炎上中で冷静に判断ができそうにない場合は、一旦おいておくも良いです。
特にINDEXは後からでもつけられますからね。

## :robot: API定義 :robot:
本当はSwaggerでオサレに仕上げたものを用意したいところですが...。
そんな余裕は全くないのでExcelなりMarkDownなりでパパッと作っちゃいましょう。

### 最低限必要な項目
・パス
・メソッド
・レスポンス形式
・用途
・リクエストパラメータ
・レスポンスパラメータ

本当はAPIを利用する画面名とか、パラメータサンプルとかあるととてもハッピーなのですが、作成の時間がないので省いています。
パラメータサンプルを記載しないかわりに、パラメータにはちゃんと型まで書いてくださいね。
APIを使う人が発狂しちゃうので...。

## :robot: デザイン図 :robot:
デザイナーに完全なデザイン図を作ってもらうのが一番ですが、難しい場合はワイヤーフレームでも可です。
システムに詳しくないクライアントとの意思疎通はデザインで行うと思ってください。
逆を言うと、クライアントが一番意思を持って指摘ができるのhデザイン周りです。
早めにクライアントがやりたいことを吸い上げる意味でも、デザインをある程度形にして提示する方が良いです。


## :robot: あれば尚よし！ :robot:
あったら、さらにハッピーになれる資料たちです。

・インフラ構成図
・画面設計書


# おわりに
PJの内容が濃ければ濃いほど、資料は絶対にあった方が良いです。
ただ、資料というのは作って終わりではないです。メンテナンスも必要になるのです。
PJが炎上している中で、開発やテストをしつつ、クライアントの無茶振りに頭を悩ませている中で、果たしてどれだけ資料を更新できるのか...。

更新されずに、誰にも見ることなく朽ちていく設計書たち:ghost:
キッパリ「この設計書は要るので作りましょう！他は要らないです！」と宣言しちゃいましょう。
使わないなら、作る必要はないのです。　

最後まで読んでくださって、ありがとうございました！
今日もどこかで頑張っているあなたに幸多からん事をお祈りしております！

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
GCPってどんなもの？　AWSを引き合いに出しつつメリットについてまとめ

# 今更ですがクラウドの概要を改めて整理
![スクリーンショット 2024-04-17 18.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/56d4dd54-c88f-f2c4-526b-78fa0a05b4ed.png)

## クラウドとは？
### クラウド ＝ 雲 ＝ インターネットもしくはサーバーを例えたもの。
最大の特徴はインターネットを通じてリモートの環境（データセンターに）でLinuxやWindowsのサーバーを立ち上げたり、データ保存ストレージ、機械学習を利用できること。

パブリック ＝ 要はインターネット
プライベート ＝ VPNなどで利用する企業内でprivate化されたもの
hybridクラウド ＝ publicとprivate両方使用するもの。
運用管理者はpublic↔︎private間でやり取りされるデータのセキュリティ管理に関する責任を負う。

### クラウドのメリット
* 最初にハードウェア購入の必要がない
* CPUやメモリーを瞬時にアップ/ダウングレードが可能
* 使っていない時はベンダーが24時間管理する必要がない
* コンソール上でボタン1つでCPUやメモリーの立ち上げが可能
* 実質無限にスケールアップが可能
* 使った分だけ課金（数年単位出の長期契約が不要）
* 物理的に離れた拠点での冗長化（電力・セキュリティ）が可能

### クラウド登場前
モニター、HD、マザボ、CPU、メモリー、LANケーブル、モニター、OSが入ったROMを購入する→ハードウェアに依存かつ自分達で管理
企業用のコンピュータにはモニター自体ない物も。
画像は拝借物。
![スクリーンショット 2024-04-17 18.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/a5c357af-4ab1-6589-325a-731545a8818d.png)

### クラウド登場後
クラウド上のサーバーなどにネットで接続→ハードウェアの購入やセットアップが不要
極端な話PC、スマートフォンでネットに接続さえすれば使用可能
サーバー等の管理もクラウドのサービスプロバイダに丸投げできる
増え続けるデータの保管を物理的なストレージにするのは非効率
データ保管場所の中心はクラウドへ。
ワークトランスフォーメーションの促進にも寄与。

::: note
* 社内規定で外部へ持ち出せない機密データ
* 連携システムが複雑なのでクラウドへの外部連携で却って遅延が生じる
* 元々保有していた知的財産やノウハウを手放したくない
上記のような事由でオンプレミスを敢えて選択するケースもあります。
:::

## 市場シェア
[ソースは2024年2月時点のもの](https://www.statista.com/chart/18819/worldwide-market-share-of-leading-cloud-infrastructure-service-providers/)
### AWS 32% 800億$
### Azure 22% 340億$
### GCP 11% 74億$

____
#### アリババクラウド　4%
#### セールスフォースクラウド 3%

## 3大パブリッククラウド概要
### AWS
![スクリーンショット 2024-04-17 18.59.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/f5df1528-44ab-79e1-d514-536ce6f47378.png)

シェア率ではぶっちぎり。
Amazonが自社で取り扱う商品管理用のインフラ基盤を活用し、保管できるデータ量は屈指。
100以上のサービスも利用可能です。

### GCP(Google Cloud)
![スクリーンショット 2024-04-17 18.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/b67fc19f-2ee6-11f8-4629-d584dfb7680b.png)

Amazonに対してGmailなどの自社サービス基盤をインフラとして活用。
ビッグデータの解析や機械学習、AI関連サービスなどが強みですね。
様々な形式での大量のDPを管理できるので業務管理や最適化をデータ中心で行いたい企業のニーズが高いようです。

### Azure
![スクリーンショット 2024-04-17 18.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/70001385-976d-f548-a94f-e608c7b85aad.png)

Microsoft365との互換性がウリ。
業務用PCとしてWindowsを導入している会社が多いので企業ニーズは高いでしょうね〜。
今回の投稿では割愛させていただきます。

#### → シェア率はAWS、今後の成長性はGCP？

## ベンチマークを参考にしてみる
[cockroach labs社による2021年のベンチマークテスト](https://atmarkit.itmedia.co.jp/ait/articles/2103/30/news111.html)
上記の3大クラウドを比較した結果、

#### オンライントランザクション処理：　GCPが最高点を記録してる。
#### ネットワークスループット：　GCP圧勝（他2つの3倍以上の数値！！）
#### レイテンシー：　AWSに軍杯が上がってる。

これだけだとどれを選ぶべきかの判断は難しいのではないでしょうか。
要件次第で柔軟に判断するのが最適解なんですかね。

## GCPの強み
Google検索・Gmail・youtube・Chrome・Google Maps、スプレッドシート…。
Googleのサービスを上げ出したらキリがないですね。
それだけ日常的に、世界規模で利用されているサービスから得られるビッグデータがGCP最大の強みです。
Big Queryをはじめとするデータ分析ツールが高評価なのも納得ですね。
データの可視化ツールやストリーミング処理など、データ中心での業務最適化を行うには真っ先に選択肢として上がるのではないでしょうか。

## 終わり
読んでいただきありがとうございました。
文章だけのまとめでは概念的な理解に留まるので、もう少し深掘った比較もしてみたいですね。
【Dockerの基礎】イメージとコンテナの違い

Dockerを何度か使用する機会があったのですが、イメージとコンテナの違いが自分の中ではっきりしないまま使用していました。
なので、これを機にイメージとコンテナの違いをまとめました。


# Dockerとは

そもそもDockerとは、アプリケーションをコンテナという独立したパッケージにまとめて、それを動かすためのプラットフォームです。
Dockerのイメージは下の図のような感じです。

<img width="400" alt="Dockerイメージ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/9e0e9c3e-1cf0-a92b-f0e3-86ce48fc4a55.png">

1つのホストOS上で他のアプリケーションとの競合を意識することなく実行できるという特徴があります。
また、パソコンのプログラミング環境を汚すことなく、他の様々な開発を行うことができます。


# Dockerイメージとは

簡単に言えば、**コンテナの設計図**です。
Dockerイメージをもとにして、Dockerコンテナを作成します。
Dockerイメージには、アプリケーション実行に必要な、設定ファイル・ライブラリ・アプリケーションがまとまっています。


# Dockerコンテナとは

Dockerコンテナは、Dockerイメージをもとに作成される**仮想環境**のことです。
コンテナは、コード・ランタイム（プログラムの動作に必要なソフトウェア）・システムツール・ライブラリなど、必要なすべてのものを含んでいるので、どの環境でも同じように動作します。
また、各コンテナは独立しているため、互いに影響を受けずにプログラムを動作させることができます。


# Docker起動までの流れ

基本的には、以下の流れでDockerを起動します。

|1. DockerHubなどのリポジトリからイメージを取得（pull）<br>2. イメージからコンテナを作成（create）<br>3. コンテナを起動（start）|
|-|

しかし、**手順2.3.はまとめて行うこともできます（run）**

### 1. DockerHubなどのリポジトリからイメージを取得（pull）
DockerHubからコンテナのイメージを取得します。
```
$ docker pull イメージ名
```
以下が実行例です。
```
//例
$ docker pull nvidia/cuda:11.3-cudnn8-devel-ubuntu20.04
```

### 2. イメージからコンテナを作成（create）
Dockerイメージからコンテナを作成します。
```
$ docker create --name コンテナの名前 イメージ名
```
以下が実行例です。
```
//例
$ docker create container nvidia/cuda:11.3-cudnn8-devel-ubuntu20.04
```

### 3. コンテナを起動（start）
コンテナを起動します。
```
$ docker start コンテナの名前
```
以下が実行例です。
```
//例
$ docker start container
```

### 2.3.コンテナを作成して起動（run）
Dockerイメージからコンテナを作成してコンテナを起動します。
```
$ docker run イメージ名
```
以下が実行例です。
```
//例
$ docker run nvidia/cuda:11.3-cudnn8-devel-ubuntu20.04
```
[状態管理ライブラリ] 状態管理ライブラリとは　<React.js>

# 状態管理とは
**アプリケーションの状態をデ－タとして表示し、そのデータの変更や更新を一元的に管理すること。**
**（UIの表示に関連するデータ、アプリケーションの動作を制御するデータ 等）**

# 状態管理のメリット
### 1. アプリケーションの予測可能性の向上
コンポーネント間のデータの受け渡しや、ユーザー操作に対するUIの反応などが、期待通りに動作する。
### 2. コードの保守性と拡張性の向上
状態に関連するロジックを一箇所にまとめることで、コードの重複を避け、変更の影響範囲を限定する。
### 3. デバッグの容易さ
状態管理ライブラリやフレームワークは、状態の変更履歴や現在の状態を追跡するためのツールを提供している。これにより、バグの原因特定やデバッグが容易になる。
### 4. チーム開発での効率性の向上
状態の定義や更新方法が統一されることで、コードの理解が深まり、コミュニケーションのコストが減る。

# 状態管理のメカニズム
### 1. データの保持と更新
- **状態の保持**：オブジェクトや配列などのデータ構造が使用され、このデータ構造は、アプリケーションの状態を表現する。
- **状態の更新**：特定の関数や メソッドを通して行われ、状態の変更を追跡しやすくなり、予期しない副作用を防ぐ。

### 2. 変数の管理方法
変数の管理方法には、大きく分けて2種類があります。
- **ローカルな状態**：特定のコンポーネントに属する状態。コンポーネント内でのみ使用され、他のコンポーネントからはアクセスできない。ローカルな状態の管理には、コンポーネント内のデータプロパティや、ReactではuseStateフックなどが使用される。
- **グローバルな状態**：アプリケーション全体で共有される状態。複数のコンポーネントから参照や更新が行われる状態であり、アプリケーション全体の動作に影響を与える。グローバルな状態の管理には、ReduxやVuexなどの状態管理ライブラリが使用される。


# 参考リンク
- [状態管理とは？フロントエンド・Web開発者が覚えたい仕組みや定義をわかりやすく解説！](https://jitera.com/ja/insights/32829)
- [React の状態管理ライブラリ9選](https://zenn.dev/kazukix/articles/react-state-management-libraries)
git add ~ push するとき用のバッチファイル

初回プッシュのときにしか必要ないコマンドも含まれてるけどもう最初で毎回手間取るのがめんどくさいので全部ひっくるめてやった。
あまり人間をなめるなよ。

```batch:push.bat
@echo off
cd %~dp0

git add -A
git commit -m %1

git config pull.rebase false
git pull --allow-unrelated-histories origin main
git push -u origin main
```

使い方：
引数にcommit message（ダブルクオーテーションで囲む） を書いて実行

例：
```batch
./push.bat [コミットメッセージ]
```
元医療職・Web制作者が本気でReactアプリ開発

## 自己紹介
今更になりましたがしっかりと自己紹介させていただきます。
私は現在32歳で**昨年の3月までの9年間、診療放射線技師として病院に勤務**していました。
しかし勤務がかなり激務なこと、家族との時間が取れないことを理由に、昨年4月からWEB制作を行うフリーランスに転身。
昨年1年間はShopifyを使用した ECサイト制作を学習＆業務していました。

Shopifyはノーコードでも作れるので、プログラミング言語である**Javascriptに関してかなり苦手意識**がありました...
しかしShopifyだけではなかなか差別化することが難しく、自分の価値を上げるためにも苦手なReact（Javascript）を学習開始しました。

Javascriptが苦手ということに加えて、子供も2人（怪獣みたいな体力お化けの男の子）いるので、自分の勉強時間もなかなか捻出できず...
何度か諦めそうになりましたが、それでもReactを用いて**アプリ制作、さらにはテスト・自動デプロイ**の実装もできました。

今回はこれまでの経緯を皆さんに共有するとともに、同じ境遇の人に少しでも勇気を分けられたらと思って記述します。

## [工程１]　超簡単なTodoアプリ制作
ちなみに今回はUdemyの講座に沿って学習を進めています。
その講座でまずは簡単な**JavascriptによるTodoアプリ**を制作しました。
この段階でWeb制作ではあまり使うことのない記述（map関数など）が出てきたため、早速調べまくりました。

**「まだ入り口なのにもうこんなに苦戦するのか...」**

と絶望したのを覚えています。

## [工程2] Reactによる学習記録アプリ開発
Udemyの学習でReactの基本を学習し終えた頃に、学習記録アプリを開発しました。
こちらは前回も記事を作成していますので、こちらをご覧いただければと思います！

https://qiita.com/gantarooou_js/items/715d211d5bae256939fe

## [工程3] Baasであるsupabaseを用いてデータベース作成
僕はsupabaseというツールを知るまでは、データベースは自分で構築しないといけないと思っていました。
しかし**このツールを用いることでコーディングをほとんど用いずにデータベースを利用**することができます！
ですがやはりここでもsupabaseとの連携方法など新しいことは調査が必要でしたので、かなり苦労しました...

## [工程4] Github Actionsを用いてFirebaseにデプロイ
かっこよく言っていますが、この過程にたどり着くまでに**デプロイという言葉も詳しくわかっていません**でした...
さらにいうとCI/CD、パイプラインという言葉も理解しておらず、実装方法を調査しようにもまずは言葉の意味を調べることから始まりました！

意味が分かっても次はGithub Actionsのコードの書き方がさっぱり分からず
「**これ本当に成長できているのか...**」
とネガティブになっていました。

## Jest・React-testing-libraryでテスト実行
こちらも「**テストって何？なんでやる必要があるの？**」から始まったので、以下の動画をみて勉強しました。

https://youtu.be/jcp8YX4AP08?si=IcQkDLn7bFme0paK

こちらのも例に漏れずJestの書き方を調べながら、進めたのでめっちゃ時間かかりました...
**全工程の中で一番高い壁だったと言っても過言ではありません。**
ちょうど仕事が忙しくなり、子供も夜寝てくれない時期が重なり、自分の勉強時間が全く確保できない時期でもありました。
**できないという感情ばかりが積み重なり、本当に落ち込んだ時期**でもあります。

しかし**アドバイスを受けたりして、なんとかデータベースと紐ついたアプリを完成**させることができました。

## ここまでたどり着いた秘訣
この記事を読んでいただいて、決してスムーズな道のりでないことはわかっていただけたと思います。
特に**仕事をやっていて育児もやっているという方は、自己学習でスキル習得というのは本当に大変**（というか無理なんじゃないか）と思います。

それでも僕がReactを含む周辺スキルを用いて、今回のアプリを開発できたのは**間違いなくJISOUのおかげ**です！
他のサロンだと質問をして返答が来るのに、遅いと翌日の夜・早くても２〜３時間後という感じ。
ですがJISOUだと質問すると**遅くても10分以内、早いと10秒後**という謎の速さで返答がきます！
あまり時間が取れない人にとって、返答時間が早いのは本当にありがたいです！！
返答が遅いと問題が解決するまでに、数日かかることもざらにあります。

ぜひ今「**Reactを勉強したい**」「**何かしらのスキルを身につけたい**」という方がいるのでしたら、**JISOUめっちゃおすすめ**です！
メンバーが多ければ私のモチベーションも上がるので、ぜひ一緒に頑張りましょう！！

https://projisou.jp/
離散フーリエ変換を、「普通のフーリエ変換、フーリエ級数」よりも先に勉強しましょう

実フーリエ級数などを先に勉強するよりも離散フーリエ変換のほうが簡単で役に立つのでこれを先に勉強したほうがいい。やさしいです。オイラーの公式を勉強しておくことー複素数の極座標表示での掛け算、などを知っておく必要がある。https://qiita.com/takaokotani/items/54dd78b20984cdac1f93

オイラーの公式のほうがsin,cosなどより単純でやさしいです。
https://colab.research.google.com/drive/1xpRfu1RkXvgDGXIC8dMJ2p5FyjWeL-r9#scrollTo=xkN0DGEhcruU
大学の先生の多くは三角関数の合成公式（高校生が記憶しているような）は書けないだろう。

まず物理エンジンの動画https://www.youtube.com/watch?v=7hzIhtbxhtM を見ておくこと。これは複素平面における離散フーリエ変換です。円が表すのは$e^{i\omega t}$です。この動画は正確に離散フーリエ変換を表現できています。

>**離散フーリエ変換の基本になるのは、以下の公式である**
Nを整数、nを任意の整数とする。このとき以下がなりたつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/6cab2282-bd51-f528-8dd7-a56ba2c58b17.png)
右辺はクロネッカーのデルタで、n=0のときにのみ１であり、それ以外のnではゼロになることを表す。証明は簡単であるーn=0のときは当たり前だし、ゼロでないときはこの和は等比級数であり
$1+e^{i 2\pi n/N}+e^{i 2\pi n\times 2/N}+e^{i 2\pi n\times 3/N}+...+e^{i 2\pi n\times (N-1)/N}$で等比級数の和の公式からゼロとなることがわかる。書き換えると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/3921f898-65a5-a6d4-2d86-9d0ea224526d.png)
となる。これが理解できていればフーリエ変換を理解するのは簡単である。

さらに書き直すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/803eba0c-64ba-3dd9-b3a1-ce03a9eb8d43.png)
と書けるから、以下のnで指定されるN個のベクトル（nを固定して成分を書くと）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/1fd9f726-91f9-29f9-7c75-d4b81f3959fc.png)
を考えたときに、それらの（複素）内積を考えたときの正規直行性を表していることがわかる。

これを用いれば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/0a2c981b-f28e-b2cf-3a64-275c8450e3aa.png)
となることがわかる。
ここで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/ea9261a6-cefb-de4f-0c3e-b79a47b38e00.png)
を導入した。これはfをフーリエ変換した量である。フーリエ変換はある特定の基底に対して内積を取る操作である（すなわち成分を抽出するということ）。

あとは連続になるように細かく分割するとかいうような話になるだけ。正規直行性の話は一般的な話で正規直行であれば、どんな関数系をとっても良いという話になる。フーリエ変換、級数の基礎はこれに尽きている。

数式、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/d140548b-81a4-9aef-ab50-2e5559039797.png)
がどうなってるか考えよう。$n$を連続だと思って描画すると物理エンジンの動画になる。$\hat{f}(m)$の位相と振幅が重要です。$N=1$だとどうなるか、$N=2$だとどうなるか...と考えていけばよいです。

大学などで教えるときにはまずオイラーの公式をしっかり使えるようにしてからこのストーリーで教えるのが早いし有効だと思える。

FastFourierTransformation:
https://www.momoyama-usagi.com/entry/math-seigyo14
ARC150 B - Make Divisible

公式解説に載っていなかったので。多分邪道で、公式解説の方が普通に筋がいいと思います。

# 問題
https://atcoder.jp/contests/arc150/tasks/arc150_b

## 概要
* $T$件のテストケースについて、以下の問題を解け。
    * 正整数$A,B$が与えられる
    * 非負整数$X,Y$で、$B+Y$が$A+X$の倍数となるようなものについて、 $X+Y$の最小値を求めよ。

## 制約
* $1 \leq T \leq 100$,
* $1 \leq A, B \leq 10^9$.

## 解説
まずは $A \geq B$の場合について。これは簡単で、$B$が$A$に等しくなるように$Y=A-B$とし、$X=0$としたときが$X+Y$が最小になる。ほとんど自明だが、$X > 0$と仮定すると $A \geq B$より $A+X > B$. このとき、$Y$を最小にするには $A+X=B+Y$として1倍の倍数にするほかないが、この時$Y=A+X-B$となり明らかに当初の$X=0$としたときの$Y=A-B$よりも大きくなってしまう。そのため、単に$A-B$を出力すればよい。

難しいのは $A < B$のとき。この問題を解く上で許容される計算量について考えてみると、$1 \leq T \leq 100$の条件から、1テストケースあたり最大で$O(10^7)$程度が求められる[^1]。したがって、$O(A)$や$O(B)$の解法は許容されない。

## Aが100000以下のとき
一旦計算量を無視して愚直な解法について考えてみる。
最も簡単な解法は、$X$を固定すれば$B+Y$が$A+X$の倍数になるような最小の$Y$は簡単に求めることができる[^2]ので、$X$を全探索することだろう。$X$をどの範囲で探索すればよいかについてだが、$X=0$のとき、最小の$Y$は $(A-B \mathrm{mod} A) 
 \mathrm{mod} A$で求めることができる。これは明らかに$A$で上から押さえることができるので、$X+Y$の最小値は最大でも$A-1$であることがわかる。したがって、$X$について$0$から$A-1$までの範囲を全探索すれば、$X+Y$の最小値を$O(A)$で計算できる。
 この方法では$A$が大きいときに対応できないので無意味に思えるが、少なくとも$A \leq 10^5$のような範囲では、明らかに有効といえる。つまり、$10^5 \leq A$ のときに他の方法で高速に$X+Y$の最小値を求めることができればよい。

# Aが100000より大きいとき
この場合には、先ほどの$X$で全探索する方法は使えない。$O(A)$の解法は計算量が大きくなりすぎてしまうからである。ここで、前提条件から$A < B$であり、なおかつ$B \leq 10^9$であることを思い出そう。ここからわかることは$B/A$が最大でも$O(10^4)$くらいで収まるということである。改めてこの場合で$X=0$を仮定する。この時、$B+Y$が$A$の倍数になるということだから、ある正の整数$r$を用いて、$B+Y=rA$と書ける。式変形をすると $Y=rA-B$となり、この時$Y$を最小にしたいのだから$r$は$rA-B$が$0$以上となるような最小の$r$を選ぶのが妥当である。これはまさに$B/A$とオーダーが等しいわけで、$r$はどれだけ大きくても$O(10^4)$で押さえられることになる。
したがって、各$r$について$X+Y$の最小値を$O(1)$で求められるなら、$r$の全探索が間に合うことになる。
実際、以下の議論から、$r$を決め打ちしたときの最も$X+Y$を小さくするような$X$と$Y$を$O(1)$で求めることができる。
$r$を決め打ちしたとき、$Y+B$が$X+A$の倍数になるという条件から、以下の等式が成り立つ。
```math
Y+B = r(A+X).
```
これを$Y$について解くと$Y=rA+rX-B$となる。ここで$Y$が非負という条件から$rA+rX-B \geq 0$が成り立つ必要がある。これを$X$について解くと、$X \geq (B-rA)/r$となる。ここでさらに$Y=rA+rX-B$について考えると、$Y$は$X$の一次関数になっており、その傾きは正だから、$Y$は$X$について単調増加する。したがって、$X$がとりうる最小の時に$Y$も最小となり、このときが$X+Y$も最小となる。したがって、$X$の最小値を求めれば、$r$を決め打ちしたときの$X+Y$の最小値もわかることになる。
$X \geq (B-rA)/r$は、$B-rA < 0 $のときに$X$が非負の条件から$X=0$とするのが最適であることに注意すれば、各$r$について$X+Y$の最小値を$O(1)$で求められる。したがって、$r$について全探索すれば$r$は最大で$O(10^4)$程度だから十分高速に$(X+Y)$の最小値を求められる。

# 結論
$A$が$10^5$くらいよりも小さいか大きいかで場合分けをする。
* 小さいなら$X=0$のときの$X+Y$が$A$で押さえられることに注目して、$X$について$0$から$A-1$の範囲で全探索を行う
* 大きいなら、$B/A$が最大でも$O(10^4)$程度で押さえられることに注目し、$B+Y$が$A+X$の$r$倍になるとして$r$について全探索を行う

## 提出コード
https://atcoder.jp/contests/arc150/submissions/52455015

# 注釈
[^1]: $O(10^9)$程度の計算量が許容されると仮定して。
[^2]: $X$を決め打つと$A+X$の方が一意に定まる。このとき $B+Y$が$A+X$の倍数になるような最小の$Y$は、$(A+X-B\mathrm{mod}(A+X)) \mathrm{mod} (A+X)$で求めることができる。
OpsRamp Gateway のアップデート方法

本記事では、OpsRamp Agentのアップデート方法について説明します。

# 概要
OpsRampでは、OpsRamp Gatewayをポータルからアップデートすることができます。

https://docs.opsramp.com/platform-features/gateways/updating-gateways/

::: note warn
パーミッションセット「Gateway Firmware Upgrade」を許可する必要があります。
:::

# 設定方法
Setup > Resources > マネジメントプロファイル の マネジメントゲートウェイからアップデートすることができます。
対象のGatewayの「ファームウェアのアップグレード」欄の「Allow」をクリック後、「Actions」欄の「Update Now」をクリックするとアップデートが開始されます。
また、対象のGatewayにチェックを入れ、上部メニューの「許可する」をクリック後「今すぐアップデートする」をクリックすると複数台同時にアップデートすることができます。
![gateway-update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/ef2e8f82-01ed-4788-8f19-969c9c246c28.png)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
カスタムフック入門: Reactで再利用可能なロジックを作成する

React のフックは、関数コンポーネント内で状態やライフサイクルなどのReactの機能を接続するためのものです。

カスタムフックはこれらのフックを組み合わせて、独自の再利用可能なフックを作成する方法です。

この記事では、カスタムフックの基本的な作成方法と、具体的なカスタムフックの例を通じてその使い方を解説します。

## カスタムフックとは？

カスタムフックは、Reactの標準フック（useState, useEffect, useContextなど）を組み合わせて新しく作成されたフックです。これにより、コンポーネント間で状態管理や副作用のロジックを簡単に共有できるようになります。

## カスタムフックの作成方法

カスタムフックは、通常の関数ですが、その名前はuseで始まる必要があります。これはReactがフックと認識するための命名規則です。

## 基本的なカスタムフックの例

以下の例では、useCounterというカスタムフックを作成し、カウンター機能を実装しています。

```jsx
import { useState, useCallback } from 'react';

export const useCounter = (initialValue = 0) => {
  const [count, setCount] = useState(initialValue);

  const increment = useCallback(() => setCount((x) => x + 1), []);
  const decrement = useCallback(() => setCount((x) => x - 1), []);
  const reset = useCallback(() => setCount(initialValue), [initialValue]);

  return { count, increment, decrement, reset };
}
```

利用例

```jsx
import { useCounter } from "./hooks/useCounter";

export default function Counter() {
  const { count, increment, decrement, reset } = useCounter(10);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
      <button onClick={reset}>Reset</button>
    </div>
  );
}
```

この例では、useCounterフックを利用して、カウンターの状態とそれを更新する関数を提供しています。これにより、同じカウンターロジックを他のコンポーネントでも簡単に再利用できます。

## カスタムフックの利点

- **ロジックの再利用:**

カスタムフックを使用することで、異なるコンポーネント間で状態管理や副作用のロジックを簡単に共有できます。

- **コンポーネントのシンプル化:**

複数のフックや複雑なロジックをカスタムフックにまとめることで、コンポーネント自体は見通し良く簡潔に保てます。

- **テスタビリティの向上:**

独立したロジックを持つカスタムフックは、単体でテストしやすくなります。

## まとめ
カスタムフックはReactアプリケーションの設計において非常に強力なツールです。

これを利用することで、コードの再利用性を高め、メンテナンスの効率を向上させることができます。

是非、この機能を積極的に活用して、よりクリーンで管理しやすいコードベースを目指しましょう。
Basic認証の実装

こんにちは。
エンジニア歴1年ちょっとの新米バックエンドエンジニアです。
今回はbasic認証でちょっと躓いたのでその備忘録です。

## basic認証のかけ方
### .htaccessファイルの作成
まずは上記の2つのファイルを作成します。

.htaccessファイルに下記のコードを追記
```.htaccess
AuthUserFile "/home/フルパス.htpasswd"
AuthName "Please enter your ID and Password." 
AuthType Basic 
require valid-user 
```
**AuthUserFile**
認証に使用されるパスワードとユーザー名が書いてある.htpasswdファイルのフルパスを指定します。
（フルパスの調べ方は後述）

**AuthName**
ユーザーに表示されるメッセージを編集できます。
このままでも大丈夫です。

**AuthType**
使用する認証タイプの指定を行います。
大文字小文字を正確に区別する必要があるので注意して記述してください。

**Require valid-user**
.htpasswd ファイルに記載されているユーザーに対してアクセスを許可する設定です。

## .htpasswd ファイルの作成
次に.htpasswd ファイルの作成を行います

```.htpasswd 
username:password
```
.htpasswdファイルには認証で使うユーザー名とパスワードを記載します。
パスワードは[パスワード暗号化ツール](https://www.luft.co.jp/cgi/htpasswd.php) を使って暗号化しましょう。

## フルパスの調べ方（PHP）
PHPを使ってフルパスを調べる方法を紹介します。
中々フルパスへの調べ方が分からなくて苦戦しました:frowning2:
まず、**path.php**（任意のファイル名）を作成し、以下のコードを記述
```path.php
<?php
$htpasswdPath = __DIR__ . '/.htpasswd';
echo $htpasswdPath;
?>
```
path.phpをサーバーにアップロード後、path.phpにアクセスするとフルパスが出てくるのでそちらを全部コピーして **.htaccess**ファイルに追記します。

## サーバーにファイルをアップロード
:::note warn
.htpasswdをアップロードする際は必ず.htaccessで指定したディレクトリの直下に配置してください。
:::


また、.htaccessファイルですが認証をかけたいディレクトリに配置してください。

**例）管理者画面のみにbasic認証をかけたい場合**
```
web
├ assets
│ ├ js
│ │ ├ main.js
│ │ └ vendor.js
│ └ css
│ 　 └ style.css
//adminフォルダ直下に.htaccessを設置
├ admin
│ ├ .htaccess
│ └ info
│ 　 ├ hoge.php
│ 　 └ admin.php
└ index.html
```
adminフォルダ直下に.htaccessファイルを配置することで管理者画面にアクセスしたときのみにbasic認証がかかるようになりました。

## まとめ
今回はbasic認証について簡単にですがまとめてみました。
かなり手こずりましたが、1人ですることができたので良かったです。
同じように苦戦している人の参考になれば幸いです。
決定理論とは

# 決定理論とは

不確実性の状況下で得られた情報（データ）からどのような行動をとるか、統計学的に決定する理論のことです。

## 目的

決定理論は「不確実性の状況下で人々にとっての最良の意思決定を特定する」ことを目的としています

## 具体例

例えば、授業で宿題チェックを行うかどうかという**不確実性**の中で、宿題をやるかどうかの**意思決定**をするとしましょう

そうすると、以下の状態、意思決定、結果の関係に表せると思います

| 状態                     | 意思決定           | 結果                             |
| ------------------------ | ------------------ | -------------------------------- |
| 宿題チェックされた       | 宿題をやった       | やってきたことが評価されて嬉しい |
| 宿題チェックされなかった | 宿題をやった       | 無駄な労力を割いてしまい悲しい   |
| 宿題チェックされた       | 宿題をやらなかった | 評価が下がって悲しい             |
| 宿題チェックされなかった | 宿題をやらなかった | 無駄な労力を割かずに済んで嬉しい |

以上のように不確実な状況に対して自身がどんな意思決定をしたら結果が最良になるかを決定する理論が決定理論です

# 決定理論の定量的な測り方の例

## 期待効用理論（Expected Utility Theory）

この理論は、効用と呼ばれる結果に対する重みづけ（嬉しさの度合い）を決定し、それが起こる確率を掛け合わせるつまり、期待値を求めることで自身にとって最良の意思決定を行う手法です

### 例

先ほどの宿題の例を用います
確率と重みを以下のように定義してみましょう

| 状態                     | 状態が起こる確率 |
| ------------------------ | ---------------- |
| 宿題チェックされた       | 0.6              |
| 宿題チェックされなかった | 0.4              |

| 意思決定           | 結果                             | 重み（嬉しさの度合い） |
| ------------------ | -------------------------------- | ---------------------- |
| 宿題をやった       | やってきたことが評価されて嬉しい | 10                     |
| 宿題をやった       | 無駄な労力を割いてしまい悲しい   | 14                     |
| 宿題をやらなかった | 評価が下がって悲しい             | 8                      |
| 宿題をやらなかった | 無駄な労力を割かずに済んで嬉しい | 20                     |

#### 宿題をやった時の期待値

0.6 * 10 + 0.4 * 14 = 11.6

#### 宿題をやらなかった

0.6 * 8 + 0.4 * 20 = 12.8

#### 結果

この場合
`宿題をやった時の期待値 < 宿題をやらなかった`
といった結果が出たため、宿題をやらないのがその人にとっての最良の結果ということになります

# 参考文献

https://avilen.co.jp/personal/knowledge-article/decision-theory/

https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E7%90%86%E8%AB%96
512次元で512ｘ511/2個の単語を表現できる？

NNでは潜在空間として低い次元をつかうことになる。たとえば512次元空間ですべての単語を表現したい。このとき単語表現を512次元空間にできるだけ分離しやすい形で配置する必要がある。

512次元で、 $V=${$\bf e_i$|$\bf e_i$の成分の２つのみが$\sqrt{1/2}$でほかはゼロ\}を考えると、$V$には（符号を除いて）512x511/2個の要素がある。2xReLU(${\bf e}_i \cdot {\bf e}_j - 1/2)$はi=jでのみ1となる。その意味で512x511/2$\sim$12万個のベクトルは分別できている。

位置もエンコードしたいなら位置情報ベクトル${\bf p}_i$を${\bf e}_i+{\bf p_i}$と言う形で加算する必要がある。A x ReLU((${\bf e}_i+{\bf p}_i) \cdot ({\bf e}_j+{\bf p}_j) - B)$を考え、適当にA,Bを選ぶことで、近傍にある同一単語だけが値を取るような関数も作れる。${\bf p}_i$はベクトル要素の全てにわたって（複素表示での）絶対値が一定であるような形で並進対称性を持たせてブロードにいれこんであるので、${\bf e}_i$と${\bf p}_j$はおよそ干渉しない（${\bf e}_i \cdot {\bf p}_j$は十分に小さい）と考えられる。位置情報ベクトルはブロードに入れ込んであるのでNNに対してロバストに情報を維持できる。（ノイズに強いとされる）拡散スペクトル通信とも何か似ているようにも思える。

逆の味方をすると、そもそも2進数では512次元なら$2^{512}$の情報を持たせることはできる。NNにおいては情報を連続空間の上に配置することで学習を可能にしている（んだと思う）。線形空間をRELUで領域分割していくことでこれが可能となる。

* https://www.math.is.tohoku.ac.jp/~munemasa/documents/20181206.pdf
には、４次元でも「角度が６０度以上」は定義できて、角度が６０度以上になるように球面上に何個の点を配置できるか？という問題が意味を持つ。2013 年に Musin によって24 個であることが示された。とある。

* https://jp.mathworks.com/matlabcentral/answers/1653560-how-to-generate-m-almost-mutually-orthogonal-vectors-of-dimensionality-n-where-m-n
という記事を見つけたがあんまりよくわからない。