OmniAICreator/Qiita-1.07M huggingface dataset:
Multiple commands produce '/Users/ユーザー名/...<省略>... .stringsdata' を解決する．

# TL;DR;
- `Targets -> Build Phases -> Compile Sources` でファイル名が重複しているものを特定して，一方のファイル名を変更する．
# 経緯
急にビルドが通らなくなり，以下のエラーが出る．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534163/2eb01f6e-b802-5be6-ab73-607436f17a13.png)

```
Multiple commands produce '/Users/ユーザー名/...<省略>... AAA.stringsdata'
```
~~何もしてないのに．．．~~

# 解決
`Targets -> Build Phases -> Compile Sources` でファイル名が重複しているものを特定して，一方のファイル名を変更する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534163/fd40a40d-2242-8c6d-348a-7a672c14dc41.png)

# 余談
- [こちら](https://stackoverflow.com/questions/69476019/multiple-commands-produce)を見た感じ， `Info.plist` が重複しているケースもあるようなので，その場合は， `Targets -> Build Phases -> Copy Bundle Resources` にて該当するファイルを消すと動作するケースがあるかもしれない．
投稿 53 PHPにおけるfor文、foreachの違い 2024/08/22

本日の勉強時間　0.5H


foreach と for 文は、PHPで配列やコレクションを繰り返し処理するためのループ構造ですが、それぞれ異なる使い方と特性がある。

どのように動いているのか？？？ foreach文は、for文と違って、番号ではなく、中身をひとつずつ取り出して、表示するということができます!!!!


<b>▪️foreach 文</b>
目的: 配列やオブジェクトの全要素を簡単に反復処理するために使う。


```
foreach ($array as $value) {
    // $value を使った処理
}
```
または

```
foreach ($array as $key => $value) {
    // $key と $value を使った処理
}
```
特徴:
配列の全要素を簡単に処理できる。
配列のキーと値の両方にアクセス可能。
配列のサイズやインデックスを気にせずに使える。

例:
```
$fruits = ["apple", "banana", "cherry"];
foreach ($fruits as $fruit) {
    echo $fruit . "\n";  // 出力: apple\nbanana\ncherry
}
```
<b>▪️for 文</b>
目的: 特に繰り返し回数が決まっている場合や、インデックスを使った繰り返し処理に便利です。


構文:
```
for (initialization; condition; increment) {
    // 繰り返し処理
}
```

特徴:
繰り返し回数や条件を自由に指定できる。
インデックスを使って配列の要素にアクセスできる。
条件に基づいたループ制御が可能。
例:
```
$fruits = ["apple", "banana", "cherry"];
for ($i = 0; $i < count($fruits); $i++) {
    echo $fruits[$i] . "\n";  // 出力: apple\nbanana\ncherry
}
```

違いのまとめ


<b>foreach:</b>
配列やオブジェクトの要素を簡単に処理するのに適している。
インデックスやサイズを考慮せず、要素だけを取り扱うことができる。
<b>for:</b>
繰り返し回数やインデックスが必要な処理に適している。
配列やコレクションのインデックスを操作する際に使う。
Catapult Tools を使ってみる

## Docker をインストールする
Windowsならこちら。

https://www.docker.com/ja-jp/products/docker-desktop/

## docker-compose を書く
```docker-compose.yml
services:
  server:
    container_name: symbol-server
    image: symbolplatform/symbol-server:gcc-1.0.3.7
    command: /bin/bash
    environment:
      - LD_LIBRARY_PATH=/usr/catapult/lib:/usr/catapult/deps
    tty: true
```
`container_name`は分かれば何でもいいです。
`image`は bootstrap でも使用されているイメージです。
`command`ないと即終了してしまうので`bash`を待ち受けにします。
`environment`catapult系が使うライブラリへパスが通ってないので通します。
`tty`これも即落ちしないようにするためのもの。

## コンテナ起動
```bash
docker compose up -d
```



## Catapult Tools を使う
アドレス作成ツールのヘルプを表示してみる
```bash
docker exec -it symbol-server /usr/catapult/bin/catapult.tools.addressgen -h
```

テストネットのアドレスを一個作成
```bash
docker exec -it symbol-server /usr/catapult/bin/catapult.tools.addressgen -c 1
```

他にも色々あります。使える！ってやつは、そんなにないだろうけど…
```plaintext
catapult.tools.address     catapult.tools.linker   catapult.tools.statusgen
catapult.tools.addressgen  catapult.tools.nemgen   catapult.tools.testvectors
catapult.tools.benchmark   catapult.tools.network  catapult.tools.verify
catapult.tools.health      catapult.tools.ssl      catapult.tools.votingkey
```
詳しくはヘルプを見て。

## コンテナ停止
```bash
docker compose stop
```
rex0220 計算式プラグイン テーブル合計割合計算

[rex0220 計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、テーブル合計割合計算を行ってみます。

# 概要

テーブル数値の合計で、割合計算を行います。
kintone 標準の計算項目では、循環参照エラーとなって設定できない計算ですが、計算式プラグインでは問題なく設定できます。

割合の計算式： IF(売値合計,売値/売値合計)
売値合計の計算式： SUM(売値)

※割合の値が売値や売値合計に影響しないので、循環参照にはなりません。

![2024-09-12_18h59_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ace53f53-918f-3503-ed18-72935898bbaa.png)

100行の例

![2024-09-12_19h11_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/41b9a8c1-c89f-5d78-765a-b592c930967f.png)


# アプリ設定

割合は、小数が続くので表示桁数を制限します。

割合　小数点以下の表示桁数：5

# 計算式プラグイン設定

テーブル行が多い場合の対策として、「非同期計算」をチェックします。

![2024-09-12_19h12_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/33b0920e-a203-7eeb-e875-22d2de2d610a.png)

```.js
OPTION: 非同期計算

// テーブル.#:番号 NUMBER
ROWNO(テーブル)+1

// テーブル.割合 NUMBER
IF(売値合計,売値/売値合計)

// テーブル.参考価格 NUMBER
ROUNDDOWN(割合*価格合計)

// 売値合計 NUMBER
SUM(売値)

// 価格合計 NUMBER
SUM(価格)
```
「いい感じにして」は指示でも言語化でもない

## 本の情報
**タイトル**
すごい言語化-「伝わる言葉」が一瞬で見つかる方法
**著者**
木暮 太一 

## 本の内容
日本人(日本語)は、読み取る力を重視して「言語化」の練習を行っていない傾向にある。
そのため、言語化せずに仕事をすることになりがちだが、実際は誰でも言語化を身に着けることができる。

* 言語化とは
>自分の頭の中にあるものを、言葉に置き換えて、『誰か』に理解してもらうこと

「どう伝えるか」の技術ではなく、「何を伝えるか」を明確な言葉にする技術。
見えていなかったものを見えるように / 考えられるようにすることに、言語化の意味がある。

* 言語化するには
伝えたい内容と伝えたい相手を明確にする。
言葉の定義を明確にしながら内容を組み立てていく。
ビジネスで言えば、「どんな価値を提供できるのか」「なぜ他社ではないのか」「なぜ自社は信頼できるのか」「どのように価値を提供できるのか」「相手にどんな行動をとってほしいのか」を伝えていく。

言語化で、自分の考えていることを言葉にして伝えることで、あらゆるシーンに良い影響を与えていくことができる。


## ためになった点
* 言語化の価値
ビジネスの強みや自己の課題といった要素が、言語化されたことで認識できるようになった例が紹介されていた。
言語化というとあくまでも個人の頭の中を明確にするのみというイメージだったが、人々に共通の内容を認識させることができるという点が大きな強みであると感じた。
* 言語化は言葉にすることではない
「いい感じに資料を作成して」という指示は、言葉にはしているが言語化ではないという記載があった。
この場合は「いい感じ」が何を指すのかわからず、その点で言語化ができていないという指摘がされていた。
ただ言葉にするだけだと結局理解ができない状態を生んでしまうので、言葉の定義を明らかにして共通の認識を持って初めて言語化ができたと言えるのだと感じた。

## まとめ
書籍としては、ビジネスでの実用に沿った形で言語化の説明がなされている本でした。
「これは言語化ではない」といった旨の具体的な記載が複数あり、言語化の目指すべき姿は何なのか というところがイメージしやすい内容でした。
プロキシって？

## proxy

代理の意。クライアントの代わりになってアクセスする役割を担うシステムを言います。

例としては HTTP プロキシ。ブラウザ等の HTTPクライアントの代わりになって Web サイトにアクセスし、結果をクライアントに返します。

他には NRPE プロキシ。監視サーバである Nagios の代わりになって被監視環境にアクセスし、取得した結果を監視サーバである Nagios に返します。

## HTTP プロキシ

プロキシ利用の場合と利用しない場合では、HTTPヘッダの情報に違いが生じます。

HTTPプロキシを利用しない場合 -> origin-form
HTTPプロキシを利用する場合 -> absolute-form
HTTPSプロキシを利用する場合 -> authority-form

https://securesky-plus.com/engineerblog/1836/

プロキシを利用するためには、HTTPクライアントに対し、明示的にプロキシサーバの情報を受け渡してやる必要があります。

* curl の場合 -> `-x (proxy-host):(proxy-port)`
* Guzzle (php) の場合 -> `proxy` オプション
* ブラウザの場合 -> 設定メニューからプロキシ情報を入力
pushとpull_requestどちらでも実行するgithub actionsをpull_requestだけ効率化するconcurrency例

# 前提
例えば以下のような、PRのイベントでもマージ後のpushでも実行するgithub actionがあるとする

```
on:
  push:
    branches:
      - develop
      - feature/**
      - main
  pull_request:
```

ここから更に、以下の要求を満たしたい

- PRへのpushなどのイベントのときは、古い実行を取り消して新しい実行だけにしてCI待ち時間を効率化したい
- ただし `branches` へのpushイベントのときは、不整合が起きないように毎回新しいactionを全部実行するままにしたい

# 方法

```
concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
  cancel-in-progress: true
```

`github.workflow`: ワークフロー名
`github.event.number || github.sha`: on pull_requestならPR番号が入っているので、PRでグループ化される。on pushならそれがundefinedになり `github.sha` が使われ、pushのたびに別グループになる

# 参考
https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-concurrency-and-the-default-behavior

# 余談
```
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
```

でも、[github.head_refはPRのときだけhead branch名が入る](https://dev.classmethod.jp/articles/how-to-get-a-ref-branch-within-a-workflow-execution-in-github-actions/) ので同等のことができるかもしれない
HPLT Bert for Japaneseは『雪国』の冒頭をどうトークナイズするのか

Ona de Gibert, Graeme Nail, Nikolay Arefyev, Marta Bañón, Jelmer van der Linde, Shaoxiong Ji, Jaume Zaragoza-Bernabeu, Mikko Aulamo, Gema Ramírez-Sánchez, Andrey Kutuzov, Sampo Pyysalo, Stephan Oepen, Jörg Tiedemann『[A New Massive Multilingual Dataset for High-Performance Language Technologies](https://aclanthology.org/2024.lrec-main.100)』を横目に、日本語[LTG-BERT](https://doi.org/10.18653/v1/2023.findings-eacl.146)モデル「[HPLT Bert for Japanese](https://huggingface.co/HPLT/hplt_bert_base_ja)」を見つけたので、とりあえずトークナイザを試してみることにした。ただ、内蔵のtokenizer.jsonが古くて、transformersを4.39.3まで戻す必要があった。Google Colaboratoryだと、こんな感じ。

```
!pip install 'transformers<4.40'
from transformers import AutoTokenizer
tkz=AutoTokenizer.from_pretrained("HPLT/hplt_bert_base_ja")
print([tkz.decode(t) for t in tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]])
```

私(安岡孝一)の手元では、以下の結果が出力された。

> ['[CLS]', '国', '境', 'の', '長', 'い', 'トン', 'ネル', 'を', '抜ける', 'と', '雪', '国', 'で', 'あっ', 'た', '。', '[SEP]', '夜', 'の', '底', 'が', '白', 'く', 'なっ', 'た', '。', '[SEP]']

各トークンがかなり短いので、国語研長単位との間で矛盾は無さそうだ。[HPLT](https://hplt-project.org/models/llm)は75種類の言語に挑戦してるらしいけど、LTG-BERTって本当に精度あがるのかしら。
tailwindCSS使ってポートフォリオ的なやつ模写

## 以下サイト(Youtube)を参考に作業
https://youtu.be/82cN8zwDhbY
まんまこれを実践しただけですが、作業概要＋学びを書いておきます。

## vite tailwind reactを検索
https://tailwindcss.com/docs/guides/vite
### viteとは
https://envader.plus/course/9/scenario/1091
> Viteはnpmやyarnよりも更に起動速度が速くなったビルドツールです。

ははーんおじさん全然わからんけどパッケージ的なやつでいいのかな？

## pjフォルダ作成
```
npm create vite@latest react-twndcss-pj -- --template react
```
* npm create vite@latest
  * viteの最新版で環境作成
* --template react
    * Reactテンプレを使って

みたいな感じ。
## tailwindCSSインストール
```
npm install -D tailwindcss postcss autoprefixer
```
* postcss autoprefixer
installのオプションで、postcssでプレcss系のコンパイル的なことをしてくれる。そのうえでautoprefixerはオートプレフィクス(ブラウザ間ハックのやつ。-webkit的な)をしてくれる。
インストール時にこれをやっておくだけで、実際の記述はシンプルにベースのcss書くだけで良いみたい。すげー。
```
npx tailwindcss init -p
```
* -p
-postcssの略で、これを指定するとインストール時にtailwind.config.jsを生成してくれる。
```
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
```
生成されたtailwind.config.jsに上記の記述を追加し、jsやtsxなどを反応させる。

## src/index.cssからtailwindのインポート
```
@tailwind base;
@tailwind components;
@tailwind utilities;
```
これでtailwindのプロパティをclassNameに記述するとそれが反応してコンパイルされ、cssが出力される。

## tailwindの1stインプレッション
### 直感的で覚えやすいやつ
| tailwind | CSS |
|:-:|:-:|
|absolute|position:absolute;|
|bg-white|background-color:white;|
|font-bold|font-weight:bold;|
|bottom-0|bottom:0;|
|box-border|box-sizing:border-box;|
|gap-4|gap:4px;|
|p-6|padding:6px;|
|text-center|text-align:center;|

### 便利で恩恵を感じるやつ
| tailwind | CSS |
|:-:|:-:|
|mx-auto|margin-inline:auto;|
|px-4|padding-left:4px;padding-right:4px;|
|py-8|padding-top:8px;padding-bottom;8px;|

px-4などは省略っぷりがエグい上、直感的で明瞭。素晴らしい。

### 何か微妙に感じるやつ
* items-center
  * fl-y-autoとかcol-centerとか
* justify-between
* justify-center
  * jst-btwn、jst-cntrとか
* flex
* flex-col
* flex-wrap
  * flx、flx-col、flx-wrとか(微妙かｗ)

### 意味はわかるけど一瞬考えてしまうやつ
* md:flex-row
* lg:grid-cols-3
  * mdとかlgのブレイクポイントがわからん
* bg-gray-100
* text-gray-600
  * "gray"がどの程度の色相なのか
  * 100がどの程度の彩度なのか
* grid
* grid-cols-1
  * シンプルにgrid慣れてない
* text-2xl
* text-4xl
  * 素のcssでもx-largeとかって使ったことないし、2xlと4xlがそれぞれどのくらいの上げ幅なのかがわからん
* w-full
    ・width:100%とか100vwってこと？

### わからんやつ(さすがに調べた)
* h-screen
  * height:100vh
* container[tailwindcss.com](https://tailwindcss.com/docs/container#using-the-container)
  * デフォルトでwidth:100%、あとはブレイクポイント毎にmax-widthが切られるみたい。
* rounded-lg [tailwindcss.com](https://tailwindcss.com/docs/border-radius#rounded-corners)
  * 大きめ(感覚ｗ)の角丸(border-radius)。-lg0は.5rem(≒8px)
  * rounded-sm＜rounded＜-md＜-lg＜-fullの順に大きくなり、-fullは100%
* shadow-md[tailwindcss.com](https://tailwindcss.com/docs/box-shadow#adding-an-outer-shadow)
  * こちらも中程度の影(box-shadow)。具体的には以下のよう(AI談)
```
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
```

## 成果物
https://github.com/ysk9999/react-tailwind-test

* 今更だけどこれって意味あるのか…？
* htmlで見れないのかな？

## 所感とか
* 回ごとのテーマが複数あって混在してると学習の軸がぶれて効率が悪い気がしてきた。今回だとtailwind、vite(npm)、React(実は次回も混在してる)。
* 今のところTwitterBootstrapとの違いが分からない。メリデメ比較したい
* mx-auto、py-autoあたりは便利だなあ。flex、justify-content:between、align-items:centerあたりもワンタッチでなんとかできん？VSCodeのスニペットみたいなノリで。

## 次回予告
Reactでtodoアプリ作ります。
サンプルアプリあるあるらしいのを作ったあと知って萎えてる笑
統計検定2級　難易度が高い過去問解説　2016年11月問8　解説

Zennで私が記事にしていた内容の転写です。

---
## はじめに
この記事は統計検定2級の取得を目指す方向けに構成されています。

## 問題の趣旨
3変数の確率変数の期待値と分散と相関係数に関する問題です。2ひねりから3ひねりくらいしていて、かつ2016年以前にこのような問題は出ていないので難しく感じます。
ですが、やっていることは基本の組み合わせです。

## 前提
標準化された$Xi (i=1,2,3)$とそれらの平均$Y$です。ここから

$$
E(Xi) = 0, V(Xi) = 1
$$

が成り立ちます。
問は、X1, Yの相関係数を求めます。2変数の相関係数$ρ$は

$$
ρ=\frac{cov(X1,Y)}{\sqrt{V(X1)V(Y)}}
$$

ここまではたいていの人はたどり着きます。

## 解説
V(Y)の値を求めます。

$$
V(Y)=V(\frac{X1+X2+X3}{3})
$$
分散の性質

$$
V(kx) = k^2V(x), k=定数
$$
より、

$$
V(Y)=\frac{1}{9}V(X1+X2+X3)
$$
$$
V(Y)=\frac{1}{9}(V(X1)+V(X2)+V(X3)+2cov(X1,X2)+2cov(X2,X3)+2cov(X3,X1))
$$

&nbsp;
標準化されていて、かつ$X1,X2,X3$は無相関なので、
&nbsp;

$$
2cov(X1,X2)+2cov(X2,X3)+2cov(X3,X1) = 0
$$

&nbsp;
かつ標準化されているのですべての確率変数は1なので
&nbsp;

$$
V(Y)=\frac{1}{9}*(1+1+1) = \frac{1}{3}
$$
&nbsp;
次にcov(X1,Y)を考えます。公式より、
&nbsp;

$$
cov(X1,Y)=E[(X1-μ_{1})(Y-μ_{Y})]
$$

&nbsp;
標準化されているので、平均μはゼロですね。したがって
&nbsp;

$$
cov(X1,Y)=E(X1Y)
$$

$$
E(X1Y)=E(X1)*E(Y)
$$

$$
E(Y)=E(\frac{X1+X2+X3}{3}) = \frac{1}{3}(E(X1)+E(X2)+E(X3))
$$

&nbsp;
以上から$E(X1Y)$は整理すると
&nbsp;

$$
\frac{1}{3}(E(X1^2)+E(X1X2)+E(X1X3))
$$

&nbsp;
ここで、
&nbsp;

$$
E(X1)*E(X1) \neq (E(X1))^2
$$

ですので注意です。

$$
E(X1)*E(X1) = E(X1^2)
$$

こちらが正解です。


&nbsp;
ここまできて$E(X1^2)$ってどうやって計算するんだ？となった方が多いかと思われます。ここで使うのが、
&nbsp;

$$
V(x) = E(x^2) - (E(x))^2 
$$

&nbsp;
この公式です。合格するだけなら、$E(x^2)$がきたらこの公式を用紙に書いておけばいいと思います。
&nbsp;

前提より、$E(X1)=0$ですので、$(E(X1))^2$もゼロです。したがって

$$
V(X1) = E(X1^2)
$$



&nbsp;
$E(X1X2)$や$E(X1X3)$は前提からゼロですね。これらををまとめると右辺は$V(X1)$しか残らないので、$cov(X1,Y)$は、
&nbsp;

$$
cov(X1,Y)=\frac{1}{3}
$$

&nbsp;
これで相関係数を計算する各パーツがそろいました。それぞれ数値を当てはめると、

$$
ρ=\frac{cov(X1,Y)}{\sqrt{V(X1)V(Y)}}=\frac{\frac{1}{3}}{\sqrt{\frac{1}{3}}}=\sqrt{\frac{1}{3}}=0.577...
$$


&nbsp;
こちらが答えとなります。
FVMでFlutterの複数バージョンを管理する

## 1. この記事で学べること
macOS下で[FVM（Flutter Version Management)](https://fvm.app/)を使用してFlutterのバージョンを複数管理できること。

なぜ複数管理が必要かというと、
1. プロジェクト毎に違うバージョンを使うことがある
1. 現在使用しているバージョン、最新バージョンやβバージョンを試していくと管理が大変である

こうした理由から複数管理できるものを最初から入れておいたほうが良い

## 2. FVMのインストール
Homebrewを使用してインストールする。
```
$ brew tap leoafarias/fvm
$ brew install fvm
```

## 3.環境変数の設定
コマンドを使えるように設定する
```
$ echo 'export PATH="$PATH:$HOME/fvm/default/bin"' >> ~/.zshrc
$ echo 'alias flutter="fvm flutter"' >> ~/.zshrc
$ source ~/.zshrc
```

## 4.FVMの確認
実行できるか確認する
```
$ fvm doctor
```
結果
```
FVM Doctor:                                                                                                  
-----------
(略)
```

## 5.Flutterのインストールできるバージョンの確認
```
$ fvm releases
```

結果
```
┌───────────────────┬──────────────┬──────────┐
│ Version           │ Release Date │ Channel  │
├───────────────────┼──────────────┼──────────┤

(略)

│ 3.22.0            │ May 13, 2024 │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.22.1            │ May 22, 2024 │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.22.2            │ Jun 6, 2024  │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.22.3            │ Jul 18, 2024 │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.24.0            │ Aug 6, 2024  │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.24.1            │ Aug 21, 2024 │ stable   │
├───────────────────┼──────────────┼──────────┤
│ 3.24.2            │ Sep 4, 2024  │ stable ✓ │
└───────────────────┴──────────────┴──────────┘

Channel:
┌─────────┬─────────┬──────────────┐
│ Channel │ Version │ Release Date │
├─────────┼─────────┼──────────────┤
│ stable  │ 3.24.2  │ Sep 4, 2024  │
└─────────┴─────────┴──────────────┘
```

## 6.Flutterのインストール
```
$ fvm install 3.24.2
```

## 7.globalバージョンの設定
ローカル環境のバージョンを設定する
```
$ fvm global 3.24.2
$ flutter --version
```

結果
```
Flutter 3.24.2 • channel stable • https://github.com/flutter/flutter.git
略
```

## 8.プロジェクト毎のバージョン設定
設定したいプロジェクトの階層に移動して以下を実行
```
$ fvm use 3.22.3
$ flutter --version
```

結果
```
Flutter 3.22.3 • channel stable • https://github.com/flutter/flutter.git
略
```

## 9.インストール済みのバージョンの確認
```
$ fvm list
```
結果
```
┌─────────┬─────────┬─────────────────┬──────────────┬──────────────┬────────┐
│ Version │ Channel │ Flutter Version │ Dart Version │ Release Date │ Global │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┤
│ 3.24.3  │         │ Need setup      │              │              │        │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┤
│ 3.24.1  │         │ Need setup      │              │              │        │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┤
│ 3.19.3  │ stable  │ 3.19.3          │ 3.3.1        │ Mar 8, 2024  │ ●      │
└─────────┴─────────┴─────────────────┴──────────────┴──────────────┴────────┘
```

## 10.インストール済みのバージョンの削除
```
$ fvm remove version
```

## 11.最後に
[mise](https://github.com/jdx/mise)などの管理ツールもあるので、そのうち試します。
AWS SignerとLambdaによるコード検証

## AWS Signer
**コードをデジタル署名と照合して検証**し、コードが変更されていないこと、信頼できるパブリッシャーからのものであることを確認できる**完全マネージド型のコード署名サービス**。

## AWS Singnerの料金
AWS Singnerの料金は**無料**。

## AWS SignerとLambdaの併用
AWS Signer を AWS Lambda と併用して、AWS 環境へのデプロイ前に機能やレイヤーが変更されていないことを確認することで、**悪意のある攻撃者から組織を保護できる**。
つまり、信頼できるコードのみを Lambda 関数で実行するようにできる。


署名付きコードパッケージを関数にデプロイすると、Lambda によって以下のの検証チェックが実行される。
| 検証内容 | 詳細 |
|:-----------:|:------------|
| 整合性  | コードパッケージが、署名されてから変更されていないことを検証する|
| 有効期限 | コードパッケージの署名が有効期限切れになっていないことを検証する |
| 不一致 | 署名が存在するかどうかと、Lambda 関数用に許可された署名プロファイルのうちの 1 つでコードパッケージが署名されていることを検証する |
| 失効 | コードパッケージの署名が無効でないことを検証する |

::: note warn
コンテナイメージとして定義された関数では、コード署名はサポートされない。
:::

## Lambda関数でのコード署名の設定
1.バージョニングを有効にして S3 バケットを作成。
2.AWS Signer を使用して署名プロファイルを作成し、プラットフォームに Lambda 、署名プロファイルの有効日数を指定する。
3.署名プロファイルを使用して、Lambda で署名設定を作成。

::: note warn
署名設定で、想定していたデジタル署名と一致しないアーティファクトが見つかった場合、「警告」(ただしデプロイは許可) または「強制」 (デプロイをブロックする) のいずれかの対処方法を指定する必要。
:::
サブクエリについて

# サブクエリとは（服問い合わせ）
- SQLの中に登場するSQLのこと


## メリット
- 複数のSELECT文を１つにまとめて記述できる
- 複雑なテーブル結合を使わずに記述できる

## デメリット
- SQL文の複雑化
- 通常のSQL文よりも処理時間がかかる場合が多い

## 例
### テーブル
![スクリーンショット 2024-09-12 17.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/5bf13cfe-bb3f-690c-551c-5f157d970303.png)

### クエリ
```
select 費目, 出金額 
from 家計簿 
where 出金額 = 
　(
　　select max (出金額) from 家計簿
　)
```
### 結果
![スクリーンショット 2024-09-12 17.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/c1c71045-b093-ef7f-f343-e06f2174f4f0.png)

- select文内にselect文が存在する
    - 処理の流れ的には、2つ目のselect文から始まり、その結果をwhere文で検索条件を指定
    - その後、１つ目のselect文が走る


# IN句での副問い合わせ
## 例

```
select * 
from 家計簿集計 
where 費目 
in (select distinct 費目 from 家計簿);
```

## 結果
![スクリーンショット 2024-09-12 18.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/2948f9e5-ef8c-7a33-24e4-a10ff7b41803.png)

# FROM句での副問い合わせ
## 例
```
select sum(sub.出金額) as 出金額合計 
from ( 
 select 日付, 費目, 出金額 
 from 家計簿 
 union 
 select 日付, 費目, 出金額 
 from 家計簿アーカイブ 
 where 日付 >= '2018-01-01' 
 and 日付 <= '2018-01-31'
 ) as sub
```

## 結果
![スクリーンショット 2024-09-12 18.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/f5016196-aae0-acda-bfd6-93a224150e61.png)

- from句の副問い合わせについては別名をつけてあげる方がわかりやすい（例内の'sub')
MAMP6からMAMP7にアップデートしたらデータベースが消えたのを復元する方法

最近MAMP6からMAMP7にアップグレードしたら、ローカルのデータベースが消えました。

![localhost : localhost | phpMyAdmin 5.2.1 2024-09-12 17-43-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293564/66e8fb91-363d-afe2-abf9-a0aa428b0f5c.jpeg)


確か、MAMP7からMySQL8に対応したって書いてた。。。これは。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293564/5bf7ac5c-1c61-4afa-d0f0-52fb5a9f2aa0.png)
参照：[MAMP](https://www.mamp.info/en/mac/ "MAMP")


MAMPの管理画面を見るとMySQL5系かMySQL8どっちを使うか選べるようになってた。
MySQL5のデータベースを使うように選択すると。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293564/e0299555-9d43-44b7-e956-21ad6a2a8863.png)


問題なくこれまで使っていたデータベースが見られました。
`wordpress_test`がちゃんといるね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293564/aae8e9a4-b590-b253-64c3-5553a56b5749.png)



#### ちょっと補足
MAMPだとデータベースが消えて困るという事象がよくあるので、念の為絶対残しておきたいデータベースはアップデートする前に下記のコマンドでバックアップを取っておくことをおすすめします
```
cd /applications/MAMP/library/bin
./mysqldump -u root -p データベース名 > /Applications/MAMP/htdocs/データベース.sql
```
ニューラルネットワークモデル①

## 2層フィードフォワードニューラルネット
ニューロンモデルは入力空間を線で分けるという単純な機能しかない。
これを、素子としてたくさん組み合わせることで強力な力を発揮する。
このようにニューロンの集合体のモデルを**ニューラルネットワークモデル**という。

今回は信号が逆戻りする経路がなく、一方にのみ流れる**フィードフォワードニューラルネット**を考える。

```plantuml
@startuml
left to right direction

rectangle 入力層 {
    usecase x0
    usecase x1
    usecase "x2(ダミー=1)" as x2
}
rectangle 中間層(1層) {
  usecase "b0|z0" as a0
  usecase "b1|z1" as a1
  usecase "z2(ダミー)" as a2
}
rectangle 出力層(2層) {
  usecase "a0|y0" as f1
  usecase "a1|y1" as f2
  usecase "a2|y2" as f3
}

x0 --> a0
x1 --> a0
x2 --> a0

x0 --> a1
x1 --> a1
x2 --> a1

a0 --> f1
a1 --> f1
a2 --> f1

a0 --> f2
a1 --> f2
a2 --> f2

a0 --> f3
a1 --> f3
a2 --> f3
@enduml
```

矢印が複雑になっているが、入力層に対してw00, w01, w02を重みとした出力が中間層(1層)になる。
その中間層にv00, v01, v02を重みとした出力が出力層(2層)になる。

入力値x0, x1の2次元に加えてダミーデータのx2から中間層2つのニューロンに情報が伝えられる。
このとき、i番目の入力からj番目のニューロンへの重みをwjiと書くことにするとj番目のニューロンの入力総和をbjとする。

```math
b_{j} = \sum_{i=0}^{2} w_{ji} x_{i}
```

この入力総和をすぐも井戸関数に通すことで、中間層ニューロンの出力zjを得る。

```math
z_{j} = h(b_{j})
```

シグモイド関数をδ()ではなく、h()にしたのは今後にシグモイド関数以外の特別な関数を使うことがあるため。
入力総和から出力を決定する何らかの関数という意味で、**活性関数**と呼ぶ。

この中間層の出力で、出力層のニューロンの活動が決まる。中間層j番目のニューロンから出力層k番目のニューロンへの重みをvkjで表し、出力層k番目のニューロンの入力総和akは

```math
a_{k} = \sum_{j=0}^{2} v_{kj} z_{j}
```

このz2は、常に1の値を出力するダミーニューロンである。

出力層の出力ykはソフトマックス関数を使って
```math
y_{k} = \frac{e^{a_{k}}}{\sum_{l=0}^{2} e^{(a_{k})}} = \frac{e^{(a_{k})}}{u}
```
になる。つまり、
```math
u = \sum_{l=0}^{2} e^{(a_{l})}
```
になる。

出力ykの和y0+y1+y2が1となり、確率的な解釈が可能になる。

より一般的に、入力次元をD、中間層のニューロンの数をM、出力次元をKとする。

中間層の入力総和
```math
b_{j} = \sum_{i=0}^{D} w_{ji} x_{i}
```

中間層の出力
```math
z_{j} = h(b_{j})
```

出力層の入力総和
```math
a_{k} = \sum_{j=0}^{M} v_{kj} z_{j}
```

出力層の出力
```math
y_{k} = \frac{e^{a_{k}}}{\sum_{l=0}^{K-1} e^{(a_{l})}} = \frac{e^{(a_{k})}}{u}
```

ただし、ダミーニューロンの値を含めるとD+1, M+1になる。
【Ruby】sub・gsub・tr で文字を置換しよう！（tr と gsub の相違点）

## 概要
subなどのメソッドを使用すると任意の文字を置換可能
stringのみ可能

~~~ ruby
text = "今日はピクニックに行けなかった..."

# 引数を指定することで文章を置換
text = text.sub("行けなかった...", "行った！")

p text

# result
"今日はピクニックに行った！"
~~~

~~~ ruby
# 直接要素につけることも可能
p "hamburger".sub("burger", "ster")

# result
"hamster"


# Integerには不可能なので注意
p 4444444.gsub(4, 0)

# result
=> : undefined method `gsub' for 4444444:Integer (NoMethodError)
~~~

## sub
**sub(第一引数, 第二引数)**
・初めに第一引数にマッチした文字列だけを第二引数の値に置換
・再代入必要


~~~ ruby
text = "ハンターハンター"

text = text.sub("ハンター", "モンスター")

p text

# result
"モンスターハンター"
~~~

## gsub 
**gsub(第一引数, 第二引数)**
・第一引数にマッチした文字列を全て第二引数の値に置換
・再代入必要


~~~ ruby
text = "ハンターハンター"

text = text.gsub("ハンター", "モンスター")

p text

# result
"モンスターモンスター"
~~~
<br>

下記のように書くと便利
~~~ ruby
text = "あなたの負けです"

text = text.gsub(/あなた|負け/, "あなた" => "私", "負け" => "勝ち")

p text

# result 
"私の勝ちです"
~~~

## sub!
**sub!(第一引数, 第二引数)**
・破壊的にsubを行う
・元の値を変えるため再代入不必要


~~~ ruby
animals = "cat dog rabbit"

# subは再代入しない限り元の変数は変わらない
animals.sub("cat", "human")
p animals

# result
"cat dog rabbit"


# sub!は元の変数自体を変える
animals.sub!("cat", "human")
p animals

# result
"human dog rabbit"
~~~

## tr
**tr(第一引数, 第二引数)**
・基本的にはgsubと同じ
・再代入必要
・<font color = "red">**一文字づつ置き換える** </font>


~~~ ruby 
p "グッドモーニング".tr("モーニング", "イブニング")

# result
"グッドイブニング"


# 全て大文字に揃える
p "aBCdEfgHi".tr('a-z', 'A-Z')

# result
"ABCDEFGHI"


# メールアドレスを半角化
email = "ＴＥＳＴ−ｍａｉｌ＠ｅｘａｍｐｌｅ．ｃｏｍ"
p email.tr("０-９ａ-ｚＡ-Ｚ．＠−", "0-9a-zA-Z.@-")

# result
"TEST-mail@example.com"
~~~


## trとgsubの相違点
**同じ点**
・文全体を置換できる

**違う点**
・変更の途中経過
・変更の方法

~~~ ruby 
# oo → in に直接変えている
p "food".gsub("oo", "in")

# 「o → i」「o → n」を順番に読み込む、今回は「o → n」が最後に読み込まれたのでoは全てnになる
p "food".tr("oo", "in")

# result
"find"
"fnnd"
~~~

もっと詳しく数字で

~~~ ruby
# gsubでは...
p "1000001".gsub("00", "0")    # [00 -> 0] なので「　00 00 0 -> 0 0 0 」 

p "1000001".gsub("00", "0a")    # [00 ->　0a] なので「 00 00 0 -> 0a 0a 0」

p "1000001".gsub("00", "0ab")    # [00 -> 0ab] なので「 00 00 0 -> 0ab 0ab 0」

p "1000001".gsub("100", "0ab")    # [100 -> 0ab] なので「 100 -> 0ab 」

# result
"10001"
"10a0a01"
"10ab0ab01"
"0ab0001"


# trでは...
p "1000001".tr("00", "0")     # 1️⃣[0 -> 0] 2️⃣[0 -> 0]（変更点上書き)　変更するのは:[0 -> 0]
                              # 「 0 0 0 0 0 -> 0 0 0 0 0 」
                              
p "1000001".tr("00", "0a")    # 1️⃣[0 -> 0] 2️⃣[0 -> a]（変更点上書き)　変更するのは:[0 -> a]
                              # 「 0 0 0 0 0 -> a a a a a 」 
                              
p "1000001".tr("00", "0ab")   # 1️⃣[0 -> 0] 2️⃣[0 -> a]（変更点上書き)　変更するのは:[0 -> a]
                              # 「 0 0 0 0 0 -> a a a a a 」 
                              
p "1000001".tr("100", "0ab")  # 1️⃣[1 -> 0] 2️⃣[0 -> a] 3️⃣[0 -> b]（変更点上書き)　
                              # 変更するのは:[1 -> 0] [0 -> b] 
                              # 「 1 0 0 0 0 0 1 -> 0 b b b b b 0 」 

# result
"1000001"
"1aaaaa1"
"1aaaaa1"
"0bbbbb0"
~~~

<br>
:thinking:

ややこしい

個人的には
・特定の一文字 → 一文字の場合（例：¥ を \　にする）は　<font color="red">**tr**</font>
・普段使い、二文字以上の場合（例：要素2つ以上 "\n\n" を要素1つ "\n" にする）は　<font color="red">**gsub**</font>
Slack: `files_upload_v2`でアップロードしたファイルに対してスレッドで返信する


# 環境
* Python 3.12.4
* slack_sdk 3.32.0


# 内容
Slackでスレッドに返信する場合、タイムスタンプ（`ts`）を取得して、それを`chat_postMessage`の引数に渡します。

```python:sample1.py
from slack_sdk import WebClient
import os
client = WebClient(token=os.environ['SLACK_API_TOKEN'])
channel_id = "YOUR_CHANNEL_ID"

response = client.chat_postMessage(channel=channel_id, text="parent message")

thread_ts = response["ts"]
print(f"{thread_ts=}")

client.chat_postMessage(channel=channel_id, text="thread message", thread_ts=thread_ts)
```

```
$ python sample1.py
thread_ts='1726125065.150719'
```

`files_upload_v2`メソッドでファイルをアップロードして、それに対してスレッドを返信する場合は、以下のように`ts`を取得する必要があります。

```python:sample2.py
from slack_sdk import WebClient
import os
client = WebClient(token=os.environ['SLACK_API_TOKEN'])
channel_id = "YOUR_CHANNEL_ID"

response = client.files_upload_v2(channel=channel_id, file="hello.txt")
thread_ts = response["file"]["shares"]["public"][channel_id][0]["ts"]
print(f"{response["file"]["shares"]=}")

client.chat_postMessage(channel=channel_id, text="thread message", thread_ts=thread_ts)
```

```
$ python sample2.py
response["file"]["shares"]={'public': {'YOUR_CHANNEL_ID': [{'reply_users': [], 'reply_users_count': 0, 'reply_count': 0, 'ts': '1726125462.396909', 'channel_name': 'YOUR_CHANNEL_NAME', 'team_id': 'TEAM_ID', 'share_user_id': 'SHARE_USER_ID', 'source': 'UNKNOWN'}]}}
```

なお、`files_upload_v2`メソッドのレスポンスは　https://api.slack.com/methods/files.completeUploadExternal APIのレスポンスになります。


# 分からなかったこと
`files_upload_v2`メソッドのレスポンスに対して、`response["file"]["shares"]`の結果が空dictのときがありました。
再現条件が分からなかったため、原因は不明です。
`response["file"]["shares"]` APIの説明を簡単に探してみましたが、見つかりませんでした。
Rustで関数オーバーロードをする

# やりたいこと
Rustで関数の引数によって処理を分ける

トレイトを使い、引数にトレイト境界を持たせる実装は色々なところで議論されている。

今回実装したのは、引数の型だけでなく、引数の個数でも実装を変える方法だ。

```rs
trait Print {
    fn print(&self);
}

impl Print for &str {
    fn print(&self) {
        println!("&str: {}", self);
    }
}

impl Print for i32 {
    fn print(&self) {
        println!("i32: {}", self);
    }
}

impl Print for (&str, i32) {
    fn print(&self) {
        let (s, i) = self;

        println!("&str: {}, i32: {}", s, i);
    }
}

macro_rules! print {
    ($($value: expr),+) => {
        {
            ($($value),+).print()
        }
    };
}

fn main() {
    print!("str");
    print!(10);
    print!("str", 10);
}
```

タプルにトレイトを実装し、マクロを使って引数をタプルにしてメソッドを実行することで、引数の個数による実装を分けている。
H2コンソールでデータベースの新規作成ができなかった時

# H2コンソールで新規データベースの作成ができなかった時にやったこと

備忘録

Windows

データベースをjavaでいじる練習をするときに

H2 Consoleでいつものように
jdbc:h2:tcp://localhost/~/〇〇で接続を押して

新しいデータベースを作成しようとしたら
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/a04747b2-474e-8dfb-5a3a-3aa5898498b2.jpeg)
警告文が出てきて作れなかった。

前は作れたのになぜなんだ・・・
とりあえずデータベースが作れないと進められない！

分からないなりに調べてみると黄色いアイコンの
H2 database Engine ってやつで新しくデータベースを作れるみたい
![イトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/d6a60f30-6d76-fa5b-5eb0-2593d0c75d7b.jpeg)
こいつはH2コンソールを立ち上げるとインジケーターに出てくる

これを右クリックしてCreate a new databaseをクリック
![トルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/90b67fb6-12f9-4641-3857-d8354b1541a5.jpeg)

このようなウィンドウが出てきます。
それぞれに入力していきます。
![なし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/fdd6f5c2-f981-2fab-df80-1d1b78d506c3.jpeg)


Database path：に入力する値
C：⇒User⇒PCの名前のフォルダのアドレスをコピーして貼り付け
![ルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/79563b7b-dadb-a5a6-7ee9-d549013cddc8.jpeg)

前回エラーが出ずデータベース作成できた時、
ここにデータベースのファイルが作成されてたみたい。
![し.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/59b8a684-c214-d4b8-fa8f-9d2c681c7def.jpeg)

全部入力出来たらCreateを押して完了！

Database was created successfully.と表示され
指定したパスにデータベースのファイルができていればOK

名前をhogeにしていれば "hoge.mv.db"ができてるはずです。


では、
jdbc:h2:tcp://localhost/~/hogeで接続してみる。
![あ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884251/34819611-f12b-3f5c-5a8b-99d0dc0c1f9b.jpeg)

やったー！

初心者の方で練習用のデータベースが作れないとか
同じような現象がおこった方は試してみてください。
今日の関数: TRIMMEAN

COPILOTに聞いた今日の関数です。


TRIMMEAN 関数は、データセットの外れ値を除外して平均値を計算するために使用されます。
これにより、極端な値の影響を受けにくい「有意義な平均値」を求めることができます。

使用例:
=TRIMMEAN(A1:A10, 0.2)

この例では、範囲 A1:A10 のデータから上位と下位の 20% を除外して平均値を計算します。

メリット:
外れ値の影響を減らすことで、より信頼性の高い平均値を得られます。
データのばらつきが大きい場合に特に有効です。
[応用情報技術者試験]マルウェアについて

## はじめに
はじめまして、エンジニアのkeigoです！

本記事では、「応用情報技術者試験」合格のための学習のアウトプットを兼ねて、
分かりやすく整理して書いていこうと思います。

今回のテーマは「マルウェアについて」です！

代表的なマルウェアとその特徴をまとめてみました！

では、一緒に頑張りまっしょい！

## 代表的なマルウェア

### ワーム
寄生せずに独自に活動し、ネットワークを使って他のコンピュータに感染する。


### トロイの木馬
かの有名なトロイの木馬。通常は有用なプログラムとして動作するが、きっかけを与えられると不正な行為を行うマルウェア。**寄生や感染はしない**


### スパイウェア
個人情報やアクセス履歴などを収集するマルウェア。
名前の通りスパイ！


### ボット
外部から遠隔操作することを目的としたプログラム。ネットワークを介して指令を受けると一気にDDoS攻撃などを行う。**C&Cサーバー**から指示が送られる。この一連のネットワークを**ボットネット**という。


### ルートキット
ログの削除やプロセスの隠ぺい、バックドアの作成など、目的達成のための機能をまとめたパッケージ


### バックドア
ウイルスが作成するシステム上の抜け道のこと。ポートの設定変更などを行い不正侵入を容易にしたりする。


### ランサムウェア
最近KADOKAWAがやられたやつ。コンピュータ内のデータやシステムを暗号化して使用できなくして、複号することを条件に身代金を要求する。実際に金を払ってもデータが取り戻せるかは分からない。ニコ動に曲を上げていたことがあったので、衝撃でした。。

### キーロガー
キーボード操作のログを記録するプログラム。何を入力したか筒抜けー！

### エクスプロイトキット
OSやソフトウェアの脆弱性を攻撃するために作られたプログラム（エクスプロイトコード）を複数まとめたもの。


### マクロウイルス
ワードやエクセルなどでのプログラミング機能「マクロ」で作成されたウイルス。


### 偽セキュリティ対策ソフト
一見普通のセキュリティソフトかと思いきや、偽のセキュリティ警告などを表示してそれを解決するために有償版の購入を勧めたり、有償サポートの購入を勧めたりするもの。



## 全般的な対策
### セキュリティ対策ソフト
いわずもがな

### セキュリティパッチ
OSやアプリケーションにセキュリティーホールがあったとき、開発元が修正プログラムを配布しているあれ。大事なんだけど、めんどくさがってアップデートしない人多いよね！

### コンペア法
検査対象のハッシュ値を安全な原本のハッシュ値と比較して検査対象が感染していないかどうかを検出。
キーワードは「比較」！

### チェックサム法
あらかじめ検査対象にマルウェア感染していない保証情報を不可しておいて、不整合があれば検出。
ここでいう保証情報は、ハッシュ値、デジタル署名、チェックサム（データを数値にして足したものを付加して送信し、受信側はそのチェック用数値とあっているかを検出）などがある。


### ビヘイビア法
仮想環境のサンドボックスでプログラムを実行し、マルウェアの引き起こす行動が見られれば検出！


## おわりに

今回は、マルウェアについて確認していきました。
今の時代、PCやスマホは持っていて当たり前！便利だけれどもその分リスクもあることを知ることが大事ですね！
攻撃用にパッケージ化されたものなんかが闇の世界では普通に取引されているらしく、IT知識のない人でも簡単にセキュリティ攻撃ができてしまうんですね！おそろしや
自分の身を守るためにも、セキュリティは覚えておこう！

明らかな誤りがありましたら、ご連絡いただけたらありがたいです。

では、応用情報技術者試験の学習、引き続き頑張りましょう！
AWS備忘録

VPCをまたがってリソースを使う方法
1.VPCピアリング
　2つの教室間にドアを作るイメージ
2.AWS Transit Gateway
　複数のVPCをまとめてつなぐハブのようなもの
3.VPCエンドポイント・プライベートリンク
　独自のサービスなどの限定的なものをインターネットを介さずに直接使用できる
4.VPN接続・AWS Dirct Connect
　自分の家や会社とAWSを安全に接続する

スケジュールドリザーブドインスタンス
　週一回金曜日などの定期的な使用を行うとき
 
AWS System Manager
　大量のリソース（DBやコンピュータ）を一括管理してくれる。

AWS ダッシュボード
　AWSのすべてのサービスに直接アクセスしてリソースを作成・管理
Turbo でフレームを更新した後、別コントローラーの Trubo をコールする

## はじめに
勉強中のため、誤りやもっといいやり方があるかも知れません。
その場合は、ご指摘いただけますと幸いです。

また、可能な限りわかりやすく記載するつもりですが、不明瞭な点、追記した方がいい点などがございましたら、合わせてご指摘願います。

## この記事の目的
「AのTurboを呼び出した後に、Aで取得した値を使って、BのTurboを呼び出したい」という目的を果たします。
`connect()`が無限に呼び出されたりして、なかなか完成形に持っていけなかったので備忘録を兼ねて残します。

## view の定義
変数名などは、適当に付けています。
下記から `a-turbo` をコールします。
```slim
  = f.association :call, collection: hoge, required: false, include_blank: false,
                  input_html: { data: { action: "change->a-turbo#replace" } }
```

`a_turbo_frame` を更新した後、後続する `b_turbo#replace` を `a_turbo_controller.js` から呼び出します。
```slim
    =  turbo_frame_tag 'a_turbo_frame'
        = select_tag 'テスト', options_from_collection_for_select(hoge_a, :id, :name),
                     id: 'turbo_a'

    =  turbo_frame_tag 'b_turbo_frame'
        = select_tag 'テスト', options_from_collection_for_select(hoge_b, :id, :name),
                     id: 'turbo_b'
```

## a_trubo_contoller.js
イベントリスナーを設定するだけで大丈夫です。
```javascript
  connect() {
    // 特に設定することはありません。
  }

  replace() {
    Turbo.visit(url, { action: "replace", frame: 'a_turbo_frame' });

    // turbo フレームがロードされ終わってから、一度だけ発火するイベントを作成します。
    document.addEventListener('turbo:frame-load', () => {
      const event = new CustomEvent("replaceTurboB", {
        bubbles: true,
        cancelable: true,
        detail: { turboAValue: document.getElementById("turbo_a").value }
      });
      document.dispatchEvent(event);
    }, { once: true });
  }
```

## b_trubo_contoller.js
イベントリスナーを設定するだけで大丈夫です。
```javascript
  connect() {
    document.addEventListener("replaceTurboB", this.replace.bind(this))
  }

  replace () {
    Turbo.visit(url, { action: "replace", frame: 'b_turbo_frame' });
  }
```
Deno Deploy CORS

```typescript
Deno.serve((req: Request) => fetch(req.url.slice(30), req).then(res => new Response(res.body, {...res, headers: {...Object.fromEntries(res.headers), 'access-control-allow-origin': '*'}})))
```



test
```js
await fetch('https://availability.deno.dev/https://httpbin.org/post', {method: 'POST', body:new URLSearchParams({a:100})}).then(r=>r.json())
```
ニューロンモデル

## ニューラルネットワークモデル・ディープラーニング
```plantuml
@startuml
frame 機械学習(教師あり学習) {
    storage 線形回帰モデル
    storage 線形基底関数モデル
    storage ロジスティック回帰モデル
    storage サポートベクターマシン

    frame ニューラルネットワークモデル {
        storage 2層フィードフォワードネットワーク
        storage 畳み込みネットワーク
        storage 全結合型ネットワーク
        
        frame ディープラーニング(深層学習) {
            storage 10層フィードフォワードネットワーク
            storage 畳み込みネットワーク.
            storage 全結合型ネットワーク.
        }
    }
}
@enduml
```

ディープラーニングは機械学習の一手法であり、ニューラルネットワークモデルと呼ばれる脳の神経ネットワークからヒントを得たアルゴリズム。
その中でも層を多く使ったモデルをディープラーニングと呼んでいる。

まずは、ニューラルネットワークモデルの構成要素であるニューロンモデルを理解する。

## ニューロンモデル
ニューロンモデルは、脳の神経細胞からヒントを得た考案された数理モデルである。

脳神経細胞は軸索というケーブルで繋がっており、軸索から電気的なパルスを他の脳神経細胞へ伝達する。
このとき、軸索はシナプスというインターフェースを介してパルスの伝達を神経細胞へ伝達する。
他の神経細胞からパルスを受け取ると膜電位と呼ばれる電気的なレベルを上げ下げする。
どれくらい上がるのか、どれくらい下がるのか、入力を受け取るシナプスの状態をシナプス伝達強度という。
膜電位がある一定の値を超えると、神経細胞はパルスを発信し、パルスは軸索を伝って次の神経細胞へ伝達する。

このような脳神経細胞の挙動を単純化した数理モデルがニューロンモデルになる。

入力値がx0, x1の2次元でx2はダミーの1であると想定する。
```plantuml
@startuml
left to right direction
usecase "0～1の値" as val
rectangle 入力 {
    usecase x0
    usecase x1
    usecase "x2(ダミー=1)" as x2
}
rectangle 入力総和 {
  usecase a0
}
rectangle 出力 {
  usecase "確率を求める近似値 y0" as f1
}

x0 --> a0
x1 --> a0
x2 --> a0

a0 --> f1
f1 --> val
@enduml
```

①
```math
a = w_{0} x_{0} + w_{1} x_{1} + w_{2} x_{2}
```
入力総和aは、入力xにwを掛けた数の和で求める。
それぞれの入力に対するシナプス伝達強度(重み、荷重)をw0, w1とし、これらを掛け算し、すべての入力で和をとり、定数w2を加えたものを入力総和(膜電位、ロジット)aとしている。

②
```math
y = δ(a) = \frac{1}{1 + e^{-a}}
```
入力総和aにシグモイド関数を通して出力yを求める。
aが0より大きければ大きいほど、出力は1に近い値を、0より負の方向に大きければ大きいほど、出力は0に近い値となる。
このとき出力yはニューロンの出力値となる。

このようにニューロンモデルはロジスティック回帰モデルと同じような式になる。

このため、交差エントロピー誤差と勾配の式は似た式を取る。

**交差エントロピー誤差**
```math
E(W) = - \frac{1}{N} \sum_{n=0}^{N-1} \{t_{n} \log y_{n} + (1 - t_{n}) \log (1 - y_{n}) \}
```

**勾配**
```math
\frac{δE}{δw_{i}} = \frac{1}{N} \sum_{n=0}^{N-1} (y_{n} - t_{n}) x_{ni}
```

これにより、パラメータの学習則は以下になる。
```math
w_{i}(t+1) = w_{i}(t) - α \frac{δE}{δw_{i}}
```
Next.jsのAPI返答を確認するコンポーネント

# なにこれ
Next.jsのAPIをとりあえずテストしたいってときに使えるコンポーネントです。
毎回作るのめんどくさいのでこの辺に置いておきます。
Axiosを使用しています。
他、APIのリンクやpostの中身などは適宜置き換えてください。

# コンポーネント
どっかにこのコンポーネントを配置し、`page.tsx`内で使用してください。
```tsx
import { useState, ChangeEvent, FormEvent } from 'react';
import axios from 'axios';

export default function APITester() {
    const [username, setUsername] = useState<string>('');
    const [response, setResponse] = useState<string>('');

    const handleSubmit = async (e: FormEvent) => {
        e.preventDefault();
        try {
            const res = await axios.post('http://localhost:3000/api/myapi', { username });
            setResponse(res.data.message);
        } catch (error) {
            console.error('Error submitting form', error);
        }
    };

    const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
        setUsername(e.target.value);
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <input
                    type="text"
                    value={username}
                    onChange={handleChange}
                    placeholder="Enter username"
                />
                <button type="submit">Submit</button>
            </form>
            {response && <p>Response: {response}</p>}
        </div>
    );
}
```

# おまけ(route.tsのテンプレ)
何処のサイトもそれなりに作りこんでるめんどいのしかないので、
サクッとしたものが欲しい人は取っていってください。

投げられたusernameにhelloの文字列を足して返すだけのものです
例：aaa -> aaahello

```ts
import {NextRequest, NextResponse} from "next/server";

export async function POST(req: NextRequest) {
    const { username } = await req.json();
    const response = `${username}hello`;
    return NextResponse.json({ message: response });
}
```
Web3jsを利用してウォレットを実装してみる　＃０ウォレット作成

# テーマ設定
Web3jsを利用してウォレット新規作成機能を実装してみる。

# 前提環境
+ Node.js がインストールされている。
+ Web3.js ライブラリがインストールされている。

### web3のインストール
```bash
npm install web3
```

# 実装
以下の内容でcreate_wallet.jsファイルを作成してください。
 ```js
const { Web3 } = require('web3');

// Web3.js インスタンスを生成
const web3 = new Web3();

// 新しいウォレットを作成
const newWallet = web3.eth.accounts.create();

console.log('New Wallet Address:', newWallet.address);
console.log('Private Key:', newWallet.privateKey);
 ```

 # 実行
  ```
node create_wallet.js
  ```

### 結果の例

```
New Wallet Address:0xDf728219CaD179C4ee0FF4C4F76Aa323B96BeC27
Private Key: ************************
```
【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。④

* * *
※本記事は2024年9月9日時点の内容です。
この記事は私がfree5GCとリアルgNB(ローカル5G用小型基地局= Small Cell）を使ってiPhone接続を試す機会があり、その過程をまとめたものです。
free5GCのインストールについては基本的には全てfree5GCプロジェクトのWEBサイトを参考に進めました。

https://free5gc.org/

インストールしたバージョンは以下の通りです。
OS　: 　Ubuntu 20.04.6 LTS
Linux Kernerl　:　5.4.0-193-generic
free5GC　:　v3.4.2
<br>
過去記事はこちら
[① Ubuntuインストール編](https://qiita.com/Takashi_Eifuku/items/133b26da9013f35cdf68 "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。①")
[② free5GCインストール編](https://qiita.com/Takashi_Eifuku/items/c13b8ecb499f1a3b3c38 "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。②")
[③ free5GC設定変更編](https://qiita.com/Takashi_Eifuku/items/f89b6ddffc9969de3f5a "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。③")

<br>

# iPhoneをローカル5Gで使うために… (SUCI SIM)

### 1. SUCI SIMについて
iPhone, iPad は IOS17からプライベートネットワークに対応しました。

https://support.apple.com/ja-jp/guide/deployment/depac6747317/web

ローカル5Gは5G SAですが、Appleの5G SA セキュリティとプライバシーの要件には以下の記載があります。
> プライバシーの秘匿: SUCI（Subscription Concealed Identifier）では非Null保護スキームを使用する必要があります。これは、TCA 2.3.1および3.1仕様で説明されているように、SIM上のSUCI計算またはME SUCI計算のいずれかによって実現できます。詳しくは、3GPP技術仕様33.501を参照してください。
>
> ユーザデータの機密性: ユーザデータを不正なアクセスから保護するため、Null暗号化には対応していません。
>
>  [Apple webサイトより]

SUCI暗号化の保護スキームには現状以下3種があるのそうですが、

- Null Scheme　（ID = 0x0)
- Profile A　（ID = 0x1)
- Profile B　（ID = 0x2)
※他、0x3 ~ 0xFは予約されている。

プライバシー要件として、上記保護スキームのうち「Null Scheme」には対応しておらず「Profile A」か「Profile B」の保護スキームを使う必要があるようです。
※SUCI保護スキームの詳細については3GPP TS33.501を参照ください。

という事で、iPhoneをローカル5Gネットワークで使用しようとする場合にはSUCI保護スキーム「Profile A」か「Profile B」に設定されたSIMを準備します。
<br>
### 2. SUCI保護スキーム用プライベートキーとパブリックキーの生成
SUCI SIM作成にあたり、SIMと5G Coreに設定する暗号鍵を生成する必要があります。これはOpenSSLで生成しました。
今回はProfile Aで進めました。3GPPによると、Profile Aの暗号化アルゴリズムはCurve25519です。

以下のコマンドでプライベートキーを生成。
```
openssl genpkey -algorithm X25519 -out <Path & filename>.key
```
\<Path & filename>部分はkeyファイルをexportする場所とファイル名を指定します。

（例）openssl genpkey -algorithm X25519 -out /root/ProfileA_private.key
<br>
次に生成したプライベートキーファイルからプライベートキーとパブリックキーを確認します。
```
openssl pkey -text -in <上で生成したプライベートキーのフルパス>
```
プライベートキーとパブリックキーが16進数64桁でそれぞれ表示されますのでメモします。
SUCI SIM作成にはこのパブリックキーが必要で、一方free5GCにはプライベートキーとパブリックキー両方を設定します。
※SIM調達方法については別途記事にするつもりです。
<br>
### 3. free5GCへキー設定
メモしたプライベートキーとパブリックキーをfree5GCに設定します。
SSH接続後、udmcfg.yamlを編集します。
```
cd /root/free5gc/config
vi udmcfg.yaml
```
SUCI profileのProfile Aの部分にプライベートキーとパブリックキーを入れて保存します。
入力の際にはデフォルトでキーが記載されていますのでそれにならって同じように16進数64桁をコロンなしで入力します。
![SUCI profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883115/0993ceae-c98c-1dde-8ed4-ac9de42be3af.png)

<br>
以上で設定完了です。

次記事ではgNB接続の過程についてまとめる予定です。

https://qiita.com/Takashi_Eifuku/items/c1a8d63d820960036139
【ポエム】Win11に移行できないPCをどうするか？

# これはポエム記事です

・Windows10のサポート期限が2025年10月で切れます。
・Windows11へ移行しましょう。
・Windows11に移行できないPCはどうしよっかなー。

 ・・・というお話。
# Windows11に移行できないPC is 何？
・intel 第8世代(CoffeeLake)よりも古いPCは、Windows11へのアップグレードが出来ません。
・これは、intel製CPUにメルトダウン脆弱性という、メモリーの中身を盗み見できる欠点が見つかっていて、第7世代(KabyLake)もしくはそれ以前のCPUでは、脆弱性を緩和もしくは対策できないことがわかっているからです。
・それ以外にも、セキュリティモジュール、TPM2.0 対応の要件がありますが、第8世代以降のCPUではBIOSで対応出来るので、基本的に、CPU要件だけ見ていればOKです。

・AMD製 CPUの場合は、Ryzenの初代のみ、Windows11アップグレード要件を満たすことが出来ません。


# 1.　本体ごと買い換える。

・OK。問題なし。すべてはお金で解決できるんです。

# 2.　マザーボードとCPUを交換する。

・自作する人はこれが可能です。ノートPCでは無理です。
・それまで使っていたWindows10にMSアカウントでログインしているなら、OSライセンスがMSアカウントに紐付けられています。
・そうでない場合はMSアカウント・ログインに一時的に切り替えましょう。

手順は、
・CドライブのSSDを（念のためクローンしておくとして、それを）新しく買ったマザーに取り付けて起動する
・設定->更新とセキュリティ->ライセンス認証
・ライセンス認証のトラブルシューティング、「ハードウェアを交換しました」

これでライセンス紐付けの移行はだいたい完了します。
・古いマザボはLinuxサーバーなどに活用します。

補足：
・Win10を新規導入して、MSアカウントログインでOS紐づけ移行することも出来ます。
・元のC:ドライブがMBRパーティションだったり、OS起動出来なかった時はそうします。
・OSライセンスが、リテールもしくはDSP版ではなく、SLP（メーカーHWプリインストール）の場合はライセンス移動は出来ません。

# 3.　2025年10月以降もWindows10のまま使う。

・おそらくChrome等ブラウザはサポート切れ後１年～３年程度はWindows10のサポートも続ける可能性は高いです（なぜなら有償サポートでWindows10は残るからです）。
・が、Windows10有償サポートプログラムを受けないのであれば、ノーガード戦法は絶対にお勧めできません。

# 4.　Windows11アップデートのCPU縛りをRufusで回避する。

・https://forest.watch.impress.co.jp/library/software/rufus/

こいつと、MSのMediaCreationTool(Win11)でDLしたWin11 23H2 ISOファイルを使って、
Windows11 のインストールUSBを作成します。

Rufusは、USB作成時にインストーラーのカスタマイズダイアログが出るので、
・セキュアブート及びTPM要件を削除
で、CoffeeLake以前のPCのアップグレードが可能となります。

将来的には 新しいISOファイルで、要件削除が出来なくなる可能性はありますが、
現在のところ、23H2 のISOファイルを使用する限り、TPM要件(CPU要件)をスキップして
アップグレードできるようです。(USBを挿して、setup.exeを起動する)

# 補足説明
・CPUおよびTPM2.0要件をスキップしてアップグレードしたWindows11は、MSの将来のアップデートで使えなくされる可能性は、ゼロではありません。
（その可能性はそれほど高くはなさそうですが・・・）

# MSにディスエーブルされたら・・・
塞がれた時点でマザボを捨てて考える、でもいいんじゃあ？（無責任

# CPUおよびTPM2.0要件って、ほんとに要るの？
説明しよう：
・Win10はTPM+メルトダウン無しCPUの縛りはないけど、みんな普通に使ってんじゃん。
・Win11でMSがセキュアOS作りたかったのは理解。
・だけどAndroidサポート無くなってAndroidのアプリストア消滅した時点でTPMとかいらねんじゃね？
なぜかというと、AndroidアプリのエミュレータがWindows11から削除されてしまい、アプリストアのセキュリティ担保条件など事実上無くてもいいんじゃ状態になってしまったから。【要検証】（まあほんとはストアアプリのセキュリティは大事なんですけどね、お金払う場所なんで・・・）

・もちろん、メルトダウン脆弱性持ちとTPMセキュリティモジュール（パスワード保管場所ですね）なしの状態のWindows11を使うことになりますので、それなりのリスクは想定して使用する前提です。

（今のWindows10だと、まさにその状態なんですけど、みんなダイジョブ？？？・・・）

- :
- あと、Win11だと、やたらBitLockerによるC:ドライブ暗号化を勧めてきますけど、TPMモジュールあるいはintel PTTによる仮想TPMモジュールを装備できない場合は、PC起動時にBitLockerのキーをUSB刺して教えてあげるか手で撃ち込まないとPCが起動しないという意味不明パソコンになるので気を付けてください。





# 5.　Windows以外のOSへ移行する。

例えば、 Nobara Linux などは、いかが？

https://nobaraproject.org/

https://japan.zdnet.com/article/35223571/


# 6.　Windows11 24H2 のISOではRufusによる要件削除が出来ない。

かわりに、管理者権限で、
```
D:> setup /product server 
```
だとアップグレード可能になっているようです。

（24H2 プレビュー版では封じられていましたので、いずれ封じられる可能性も・・・）

https://pc.asobu.co.jp/upgrade-to-windows11/

・・・と、書きましたが、
「Rufus 4.6」で「Windows 11 バージョン 24H2」のアップグレード制限回避が可能に （窓の杜）

だそうです。
まさに、イタチごっこしてますね

- Microsoftが改めてWindows 11の要件であるTPM 2.0の重要性を説く
- https://pc.watch.impress.co.jp/docs/news/1645176.html
Kubernetesについて簡単にまとめました

## はじめに
Kubernetesとはコンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのオーケストレーションプラットフォームです。
コンテナを使用するときに、複数のコンテナを効率的に管理することが難しくなります。
そういったことを解決するために開発されたツールです。

## Kubernetesの主な役割と特徴
### 1.自動化されたコンテナ管理：
Kubernetesは複数のコンテナが分散されたクラスタ上で正しく動作できるよう自動的に管理します。
これはコンテナのデプロイ、停止、再起動などのタスクが含まれます。


### 2.スケーリング：
トラフィックが増加したとき、Kubernetesは自動的にコンテナの数を増やしたり、需要に応じてアプリケーションをスケーリングしてくれます。
逆にトラフィックが減少したときには不要なリソースを開放することができます。


### 3.自己修復機能：
Kubernetesは、失敗したコンテナを自動的に再起動したり、異常な状態のコンテナを停止したり、健全な状態に戻るまで監視と修復を行ってくれます。


### 4.ロードバランシング:
Kubernetesは複数のコンテナに対して自動的にトラフィックを均等に分散させ、負荷を効率的に分散してくれます。

### 5.宣言的なインフラストラクチャ：
Kubernetesではアプリケーションの望ましい状態をマニフェストファイルに記述します。
Kubernetesはその状態に合わせてシステムを自動調整してくれます。


### 6.クラスタ構成
クラスタと呼ばれるノードの集合で動作します。
クラスタには以下のようなコンポーネントがあります。

#### マスター
クラスタ全体を管理する役割を持ち、スケジューリング、ノードの監視、状態管理を行います。

#### ワーカーノード
実際にコンテナを実行するノードです。
ワーカーノード上にはコンテナを管理するkubeletやネットワーク設定を行うkube-proxyなどのコンポーネントが稼働します。
環境構築何も分からん

『セイト先生が教えるプログラミング入門』で、環境構築でツボったので、『はじめてつくるReactアプリ with TypeScript』に転進しました（そのときの記事：https://qiita.com/5hvn5vk3/items/501147bc30999788ce33
）。が、またもや環境構築でツボりました。

なので、課題を「環境構築」に設定し、とりあえず以下のことをやってみることにします。

・nvm, Node.js, npmを一旦全部消す
・教科書に書かれているNode.js, npmのバージョンを確認して、同じものを入れてみる
・その上で、教科書のサンプルファイルを、必要な部分だけ編集してそのまま使ってみる
# 追記（9月12日）：１冊目の環境構築に再挑戦
Node.js, npmのバージョンを教科書に合わせるべく、コマンドプロンプトで次のコマンドを打ち込みました（Windows）。
```
nvm install 20.5.0
```
```
nvm use 20.5.0
```
次いで、CursorのTerminalでViteの導入をやり直します。これも教科書のバージョンに合わせました。
```
npm create vite 5.10
```
```
npm install
```
```
npm run dev
```
どの段階でやったかは忘れましたが、 `package.json`, `package-lock.json`の
```json
      "devDependencies": {
        "vite": "^5.0.8"
      }
```
の `"^5.0.8"` はTerminalの表示に合わせて `"^5.0.10"` に変えておきました（やる必要があったのかは分かりません）。
そして最後に、Firebaseのセットアップをやり直しました。すると、日報アプリが無事動きました。

# 追記（9月13日）：最終節「Firebase Hosting」
Terminalに `firebase login` と打ち込んだところ、「このシステムではスクリプトの実行が無効になっている」というセキュリティ・エラーが出たので、どうすればいいのかBingのCopilotに尋ねました。
Cursorを「管理者として実行」で開き、Terminalに次のコマンドを入れておく必要があったようです。
```
Set-ExecutionPolicy RemoteSigned
```
これで1冊目はひとまずクリア。
【備忘録】「Windows updateで修復する」を実行するどうなるか

この記事では、以下のような場合を想定しています
・Windows 11 home を使用している

# 背景
先日、Windows Updateがうまく動かず、何を試しても解決しない状況に直面しました。いろいろ試してみましたが、どれも効果がなく、最終的に「Windows Updateで修復する」という強硬手段に踏み切りました。

この「Windows Updateで修復する」機能の素晴らしい点は、個人データやアプリがそのままの状態で、Windowsを修復できることです！

「本当にそうなの？」と思った方、私も同じ疑問を持っていました。そこで、実際に「Windows Updateで修復する」を行った結果をここに記録しておきます。

# 「Windows Updateで修復する」の結果
結果はなんと…… **ほぼ全て引き継がれました！**  データも消えず、インストールしたアプリもそのまま残っていました。

ただし、 __Dockerが動かなくなってしまいました。__ そこで、私の対処方法をここに記しておきます。

## Dockerが動かない！
私は普段からDockerを使用しています。環境は以下の通りです。

・Windows 11 Home
・Docker for Desktop

しかし、Dockerを起動しようとした際に、以下のエラーメッセージが表示されました。

Something went wrong: wsl listing distorts; wsl -l -v -all

？？？ナニガオコッタノ

### 1. WSLの動作を確認
まず、そもそも WSL（Windows Subsystem for Linux）が正常に動いているのかを確認しました。設定の検索バーでWindows System for Linux　を検索して、ペンギンさんのアイコンをクリック。WSLの状態を確認すると、修復、リセット、再インストールのいずれかを試すように促される画面が表示されました。


### 2. 修復をためす
修復やリセットのオプションを試してみましたが、いずれも効果がありませんでした。最終的に、 **WSLの再インストール** を行うことにしました。

### 3. 結果
再インストール後、WSLも正常に動作し、Dockerも無事に起動するようになりました！

# まとめ
「Windows Updateで修復する」は非常にありがたい機能です。 **Windowsを再インストールしながらもデータが消えない** という理想的な形でシステムを修復できます。ただし、Dockerのように一部のアプリケーションで問題が発生する可能性もあるので、その点は念頭に置いてから実行しましょう。
PoCアンチパターンの簡単な対策



## 良いPoCとは

結果が意思決定の材料となるもの。とりあえずこれを達成すれば前には進む。



## アンチパターン一覧


参考

https://www.moderntimes.tv/articles/20240313-01PoC/#:~:text=PoC%E3%81%AF%E9%80%9A%E5%B8%B8%E3%81%AE%E9%96%8B%E7%99%BA,%E3%82%8B%E3%83%AA%E3%82%B9%E3%82%AF%E3%81%AB%E7%9B%B4%E9%9D%A2%E3%81%99%E3%82%8B%E3%80%82



### ドメイン、タスク、リソースの関係性を把握できていない

解法が変な方向に行く。



### 過度なリップサービスによる失敗

検証方法を期間中に変えると結果の解釈が難しくなる。



### 解決方法を不必要に複雑にする

これに陥る場合、多くの場合仮説が間違っている。





## 簡単な対策

事前登録制度を真似するだけでいい。

- 実施目的を事細かく書く
- 仮説の内容とその根拠を明確にする
    - 「AIだからできそう」は仮設の根拠にならない
- 実施方法をガチガチに固めて変更しない
    - 材料が調達できない場合は素直にあきらめる
- 本開発に進む条件設定を事前に行う

### 絶対避けよう

- 多重検定
  - その試行錯誤、多重検定になってない？
- データリーク
  - あまりに良すぎる結果は疑おう
超シンプル！書籍管理アプリ作ったよ！

# はじめに
書籍管理アプリって色々あるけど機能がモリモリ過ぎて「もっとシンプルでいいんだけどな〜」って、思ったことありませんか？
例えば、感想を記載できたり、Amazonの購入リンクがあったり、評価できたり。

今回作ったアプリ「DuplesS（読み方：デュプレス）」は、持ってるかどうかだけ分かる書籍管理アプリです！

是非、使ってみてください！

https://apps.apple.com/jp/app/dupless/id6504234469


# 使い方
使い方は簡単！
画面下のバーコードリーダーを押下して、本のバーコードをスキャンするだけです！
持ってない本なら、リストに追加されます。
持ってる本なら、所持していることを示すポップアップが表示されます。

これだけ！

![‎for6.7.‎002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808248/71d874f2-1d0e-abea-1baa-02d33c774792.png)



# 悩み事
アップデート案に「手動入力の実装」があります。
バーコードをスキャンしても、データを取得できない場合があるので、手動入力は必要かなとは思うのですが、DuplesSではISBNを基に所持しているのかどうかを判定しているので、ISBNの入力が必須になります。
ISBNは13桁の数列なのでそれを必須入力にするのはどうなのか？と思い、現在は実装しておりません。
やっぱ必要かなぁ？


# アプリ名とアイコンについて
#### アプリ名
TimelessやPricelessのような、「⚪︎⚪︎を超越する」という意味を込めて「Duplicate（重複） + less（を超越する） = DuplesS（重複を超越する）」としました。
すごい細かいですけど末尾が「S」の理由は「ss」だと「重複を超越するがコンセプトなのにアプリ名が重複してるじゃん！」って自分ならツッコむなと思ったので、末尾だけ大文字にしました。
#### アイコン
緑から青へのグラデーションにしました。
込めた意味は、グラデーションは緑から青に移ろい、青から緑に移ろい、常に同じ色は存在しない。
つまり、重複していないことを表しているなと思い、グラデーションにしました。


おわり
匿名配送で理解するプロキシサーバー

## はじめに
プロキシという技術の理解を深めるために匿名配送を例にプロキシについてまとめたいと思います。

※本記事はプロキシの流れがイメージできることを目的としています。詳細なニュアンスや意味が本来と異なる場合があります。

## 登場人物
出品者(サーバー)
購入者(クライアント)
フリマアプリ(プロキシサーバー)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/ab8d1138-17c1-2c37-a8bb-36ffc19780b7.png" width="400">


## プロキシとは
プロキシとは「代理」という意味をもちます。今回はフリマアプリがプロキシとなります。

フリマアプリは購入者と出品者の間に入って荷物の発送、送金等を中継するサーバーのことです。具体的には、購入者が直接出品者に送金するのではなく、一旦フリマアプリに送金(リクエスト)し、フリマアプリがその送金をサーバーに転送します。そして、フリマアプリからの荷物(レスポンス)をフリマアプリと提携している運送業者(プロキシサーバー経由)で購入者に返します。


## プロキシのメリット
**・匿名性の確保**
この仕組みによって、購入者は直接出品者とやりとりせず、自分の住所(IPアドレスなど)の個人情報が出品者に漏れることを防ぎます。

**・キャッシュ機能で高速化**
すでに入力している住所情報や支払情報(キャッシュ)を使用することで取引がスムーズになります。10年以上前ですがあるオークションサービスでは住所や入金先のやり取り、入金確認、発着確認を毎回行っていました。当時はプロキシとしての役割を果たしていなかったと振り返って感じました。

**・アクセスログの確認**
どの商品を買ったのか、閲覧(アクセスログ)したのかを保存しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/9ede90a2-6763-fccb-9aa4-f3baf234d5df.png" width="300">


## プロキシのデメリット
**・プロキシから重要な情報などが漏れるリスク**
プロキシに限らずですが個人情報漏洩リスクがあります。

## プロキシの種類
通信のながれにおいては大きく分けて2つ、フォワードプロキシとリバースプロキシです。
今回の匿名配送においてはフォワードプロキシとリバースプロキシ両方の役割がありました。

### フォワードプロキシ
役割 : 購入者の代理として送金等を出品者に送る
位置 : 購入者側に配置
用途 : 購入者の匿名性を保つなど

### リバースプロキシ
役割 : 出品者の代理として送金を受け取り、適切な購入者に転送する。
位置 : 購入者側に配置
用途 : 負荷分散、セキュリティ強化、キャッシュによる高速化

![スクリーンショット 2024-09-12 6.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/61880dec-3300-1027-11a9-aa4d6b5018af.png)

## まとめ
新しいこと、知らないことを理解する時はイメージできることが大切だと思っています。この記事がそんなイメージの一助になれば幸いです。


## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/


参考URL

https://www.splashtop.co.jp/knowhow/49/