OmniAICreator/Qiita-1.07M huggingface dataset:
無理やりED法でCrossEntropyLossを使ってmnist全体を学習する

https://qiita.com/malt03/items/99c09c226f7f54775072

この記事の続き
とにかく、ED法でCrossEntropyLossを損失関数に使った学習ができれば大きく可能性が広がるので、なんとか方法を模索している

# 結果
![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44356/c0acdf21-7368-46bd-35f5-2b90fa4f9332.png)

赤が損失値で、青が訓練データの正解率、緑がテストデータの正解率。
CrossEntropyLossを使ってとにかくまぁ学習ができた。正解率は93%程度なのでまぁ良さげ。

# 実装
https://github.com/malt03/ed-sandbox/blob/d235cb1c26cae542ecf64acb41ef987047952408/src/train_all_mnist.rs

```rust
pub struct Mnist {
    layer0: MultiOutputLayer<Sigmoid>,
    last_layer: MultiOutputLayer<PassThrough>,
}

impl Mnist {
    fn new() -> Self {
        let mut rng = StdRng::seed_from_u64(42);
        Mnist {
            layer0: MultiOutputLayer::new(&mut rng, 10, 784 * 2, 4),
            last_layer: MultiOutputLayer::new(&mut rng, 10, 4, 1),
        }
    }

    fn forward(&mut self, inputs: &[f64]) -> Vec<f64> {
        let x = duplicate_elements(inputs.into_iter()).collect();
        let x = vec![x; 10];
        let x = self.layer0.forward(x);
        let x = self.last_layer.forward(x);
        x.into_iter().map(|x| x[0]).collect()
    }

    fn forward_without_train(&self, inputs: &[f64]) -> Vec<f64> {
        let x = duplicate_elements(inputs.into_iter()).collect();
        let x = vec![x; 10];
        let x = self.layer0.forward_without_train(x);
        let x = self.last_layer.forward_without_train(x);
        x.into_iter().map(|x| x[0]).collect()
    }

    fn backward(&mut self, deltas: Vec<f64>) {
        self.layer0.backward(&deltas);
        self.last_layer.backward(&deltas);
    }
}
```

```rust
impl<ActivationFunc> MultiOutputLayer<ActivationFunc>
where
    ActivationFunc: DifferentiableFn<Args = f64>,
{
    pub fn forward(&mut self, inputs: Vec<Vec<f64>>) -> Vec<Vec<f64>> {
        let output = self
            .inner_layers
            .iter_mut()
            .zip(inputs.iter())
            .map(|(layers, inputs)| {
                layers
                    .iter_mut()
                    .map(|layer| layer.forward(&inputs))
                    .collect()
            })
            .collect();
        self.last_inputs = inputs;

        output
    }

    pub fn backward(&mut self, deltas: &Vec<f64>) {
        for (layers, delta) in self.inner_layers.iter_mut().zip(deltas.iter()) {
            for layer in layers {
                layer.backward(*delta, &self.last_inputs[0]);
            }
        }
    }
}
```

# 解説
実装はパッと見では良さそうに見えるけど、 `MultiOutputLayer` は全く関連しないネットワークを10個持っているだけなので、0から9までの数字を別々に学習しているに過ぎない。

https://qiita.com/Cartelet/items/a18e32348adc0c689db4#mnist-01%E5%88%A4%E5%AE%9A

こちらの記事でも先行で実装されており、同様に93%程度の精度が出ている。

# 所感
[前の記事](https://qiita.com/malt03/items/99c09c226f7f54775072)でも書いた通り、ED法では1次元空間での上下運動しか学べない。ED法のモデルでN個の出力を作るためには、N次元での山登りをしなくてはならない。
今回の実装で、兎にも角にもbackwardにdeltaをN個渡し、N次元での山登りをさせた。
引数はこれでいいはず。あとはこのN次元の勾配をモデルに反映させればいいだけなはずなんだけど…
vSphere自宅ラボ構築 5回: vCenterの構築

# 概要

本記事は自宅ラボ構築の第5回で、前回はDNSの展開までを行いました。
今回は仮想化基盤の管理サーバとしてvCenterを展開します。

## 全記事
- [1回: 構築する環境](https://qiita.com/strawberryjam/items/aea07bbe4f0857381448)
- [2回: ベアメタルへESXiをインストール](https://qiita.com/strawberryjam/items/be63410bdb316cc6e145)
- [3回: 仮想ルーター (VyOS) の構築](https://qiita.com/strawberryjam/items/8bd88e2d2a1ad14987db)
- [4回: DNS (Unbound) の構築](https://qiita.com/strawberryjam/items/2172da84253cd8233c89)
- 5回: vCenterの構築 ← 今ココ
- [6回: Nested ESXiでのvSphereクラスタ構築](https://qiita.com/strawberryjam/items/06c8240b3b30d7fe8e1e)


## 対象範囲
本記事では全体構成の以下赤枠の部分を構成します。
※黒くなっているところは未構築

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/82f81c16-649a-c4c7-16e5-22cf2f013ac9.png)

# vCenterの構築

## インストール

まずvCenterのインストーラーのISOをマウントして、インストーラーを起動して案内に従い進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/8e1f83cf-8e26-a3f6-87c9-f61cab492bdb.png)


行った設定はStage1は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/fea159a9-c338-2ebe-de8d-6c35bb873de4.png)

Stage2は以下としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/e0bb2c5d-d6f7-ce1e-28d8-9b6169a9b667.png)


ちなみにTinyサイズのスペックは以下のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/9cd8483b-9896-65e7-f16c-d235ee33d1d0.png)


デプロイが完了したらブラウザでアクセスしてログイン画面が表示されたらOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/646d09c9-8e7c-7947-1d83-e7e75d02cbac.png)

## vCenterの初期設定周り
vCenter上へのホストの追加等の初期設定周りを実施しておきます。

### データセンターとクラスタの作成
データセンターとクラスタを以下のように作成しておきます

- データセンター
    - Datacenter
- クラスタ
    - 01_MGMT
    - 02_WLD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/60bfd56f-45f8-8a12-a06b-e4f3cfa469a4.png)

### esxi-00の登録
01_MGMTのクラスタにesxi-00を登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/f3d7623a-5866-93f0-7e9e-072a216a8b84.png)

### フォルダの作成とマシンの移行
以下2つのフォルダを作成しておきます

- 01_MGMT
- 02_WLD

作成後esxi-00上の元々ある仮想マシンは「Discoverd virtual machine」フォルダに入っているため、01_MGMTに移動しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/42b00059-0d35-82c9-2753-059136fda398.png)

### ライセンスの登録
こちらは任意ですが、利用可能な検証用ライセンスがあるため登録しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/ad68015d-dde2-6e81-1525-6ce87f1415be.png)

一旦vCenterの初期設定はここまでとします。


# まとめ
今回はvCenterの展開を行いました。
細かい設定画面は省いていますが、基本的には展開先のESXiがきちんと構築されていれば案内通りでスムーズに展開できる感じです。
それでは次回が最後にNestedでESXiを立ててそれらをクラスタにしていきます。

**次の記事はこちら**

https://qiita.com/strawberryjam/items/06c8240b3b30d7fe8e1e
AWSでNATゲートウェイがこんなにも高額だと思っていなくて涙目

会社や組織でAWSを運用して、使っている人は多いと思いますが個人でシンプルな踏み台だけを設置して運用している人もいるかと思います。

私もその一人なのですが、「最近なんかAWSの請求が高いな？」と思って請求書をみたのですが

1.1万円!さすがに円安とはいえ、t2.microしか使ってないのに、なんでこんなに高いの？
たしかにt2.microの無料期間は終わっているとは思うけど高すぎじゃね？

| 私の24年3月の請求額|
| :--:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88316/73af24df-12de-e3e1-e17d-8996fd452114.png" width=500px>|

使っているインスタンスは以下の１つのみ

| key | value|
| :--:|:--:|
| instance | t2.micro |
| disk | 30 GiB (gp2) |

なのに、そんなに高いはずはない！
というので、ちゃんと`Billing and Cost Management`を見ることに

| Billing and Cost Management (3月分)|
| :--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88316/8c9d9b58-a921-c046-8422-8cfe9a254332.png" width=300px>|

となっていて、`EC2-Other`ってなんだよ！といつも思っていて見過ごしていたのですが、今日は今回はちゃんと見てやることに。

「EC2 その他」 →   「グループ化の条件」の「使用タイプ」を選択

[EC2-other]の内訳を見る方法はこちらが詳しい
* https://blog.serverworks.co.jp/cost-explorer-ec2-others

| EC2-otherの内訳|
| :--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88316/6c7ebec4-8e78-448b-69e8-2d436c52fcee.png" width=600px>|

と見てみると、このNATゲートウェイの高さよ！

実際、自分のVPCは以下のような構成になっていて、まったくNATゲートウェイを使っていないのに、VPCを作るときに一緒になんかノリでつくっちゃったまま放置して毎月、50ドル近くも払っていてびっくりしていました。

| 個人環境のVPC|
| :--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88316/1ceb3134-1692-e2fd-570c-0cb38976e862.png" width=600px>|

正直、認識している人は常識かとは思いますが、会社は企業でAWSを使っている場合は、NATゲートウェイの値段なんか気にならない額（EC2などほうがもっと高い）かと思って見過ごしてしまいがちですが、個人（自腹）でやっていると正直この金額は高いので使ってない人は削除しましょー。
抵抗内蔵LEDのススメ

## 1. はじめに
テストツールの動作チェックやインジケータとしてLED（発光ダイオード）が欲しいとき、抵抗内蔵LEDが手軽で便利です。

## 2. 抵抗内蔵LED
マイコンの汎用入出力にLEDを接続する場合、電流制限の抵抗をLEDと直列に接続します[^1]。その抵抗をLEDに内蔵したのが抵抗内蔵LEDで部品点数の削減や配線の簡略化ができます。

例えば[ドライバ内蔵リレーモジュールキット](https://akizukidenshi.com/catalog/g/g113573/)（[秋月電子通商](https://akizukidenshi.com)）の制御信号のオンオフを見たい場合、SIGとGNDの配線に抵抗内蔵LEDを挿すだけで済みます。
![リレーモジュールの制御信号のインジケータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/f5a34639-dcca-f291-603f-a4121ecb9796.png)

秋月電子通商で扱っている[抵抗内蔵LED](https://akizukidenshi.com/catalog/c/cledinres_sgn/)の「5mm LED 12V（5V省電力版）」を5Vで点灯したときの様子を以下に示します。
![抵抗内蔵LED 点灯時](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/6cab2976-4a62-9ba0-c399-4421af626cef.png)

動画バージョンはこちら。
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Qiitaに記事を載せました。<br><br>抵抗内蔵LEDのススメ<a href="https://t.co/u5TxXhjojg">https://t.co/u5TxXhjojg</a> <a href="https://t.co/QUjhzrrz6h">pic.twitter.com/QUjhzrrz6h</a></p>&mdash; ka’s (@pbjpkas) <a href="https://twitter.com/pbjpkas/status/1785308822250434889?ref_src=twsrc%5Etfw">April 30, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

定格12Vですがインジケータとして利用するぶんには5Vで十分に明るいです。5Vで使用すると消費電流は約5mA[^2]とのことです。

## 3. LEDのちょっとしたヒント
LEDや（ラジアルリード型の）電解コンデンサのように極性のあるデバイスはリード（足）の長い方がプラス側です（電池の回路記号[^3]の長い方がプラス側なのと一緒です）。
![JIS C 0617 電気用図記号](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/39890ee7-266c-decd-6248-fe31d57104b0.png)

LEDのリードを切って短くするとき、次の順序で作業すると極性で迷わないです。

1. マイナス側を切る
2. マイナス側よりも若干長くなるようにプラス側を切る

![LEDリードの加工](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/08e97765-70a6-d0a1-f29c-a7c3b085d11e.png)

## 4. おわりに
抵抗内蔵LEDは外付けの電流制限抵抗なしにブレッドボードにそのまま挿して使えて配線も簡略化できるため持っていると便利です。

[^1]: 詳しくは「[ストップウォッチを使う性能テストを実ステップ300行に満たない自動テストシステムで自動化する - 3.3 LEDの電流制限抵抗の選定](https://qiita.com/pbjpkas/items/d525d7d19095d1e26452#33-led%E3%81%AE%E9%9B%BB%E6%B5%81%E5%88%B6%E9%99%90%E6%8A%B5%E6%8A%97%E3%81%AE%E9%81%B8%E5%AE%9A)」をご覧ください。

[^2]: 5mAはマイコンによっては許容電流を上回ります。例えば[Arduino UNO Rev.3](https://store-usa.arduino.cc/products/arduino-uno-rev3)はI/O pin一つあたりの定格電流は20mAで定格に収まっていますがルネサスの[H8/3048](https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/other-mcus-mpus/h8-family-mcus/h83048-16-bit-microcontrollers-embedded-512kb-flash-microcomputer-non-promotion#overview)は1端子あたりの出力Highレベル許容電流は2mAで定格を超えています。マイコンの仕様書で定格を確認されるのをお勧めします。

[^3]: 日本産業標準調査会の[JIS検索](https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html)や日本規格協会の[規格・書籍・物品検索](https://webdesk.jsa.or.jp/books/W11M0010/)でC0617で検索するとJIS C 0617（電気用図記号）で制定されている記号がわかります。
.DS_Storeを一括削除する

## 概要
- Mac環境で勝手にできたりする.DS_Storeは何か
- そして、どのように簡単に消せるか

## 何ものか
### まとめ
- macOSから自動で作られる記録ファイル（基本的にWindowsやLinuxなどの他のOSではないもの）
    - 特定のフォルダ内での表示設定や配置情報を保持するために使用
    -  具体的には、フォルダ内のアイコンの位置やサイズ、表示されるカスタム設定などが含まれる
- ファイル作成、コピペ、アイコンの配置を変更、表示オプションをカスタマイズしたりするなどで自動で作られる

### よくみられる現状
- リモートリポジトリまで混ざることが頻繁
- 隠しファイルでもあるので、結構面倒
- あちこちに隠れているので、一個づつ探して消すのも大変

## コード
ターミナルを開き、ディレクトリへ遷移し、以下のコードを入力します。
```ruby:zsh

find . -name '.DS_Store' -type f -ls -delete


```

## 解説
- find: 探してね
- .: 現在のディレクトリで
- -name '.DS_Store': .DS_Storeのファイルを
- -type f: 対象をファイルとして制限する。ディレクトリや他のフォーマットの場合は対象外になる
- ls:このコマンドを実行した後、ファイルリストを出力してくれます。省略すれば何も出ません
- -delete: 消せ！

現在のディレクトリを基準として、配下ディレクトリまで全ての.DS_Storeを探して一括削除するコマンドであります。

zsh, bashなどを使うVSCodeのターミナルでも実行できます。

## 例
[1]cd Documents
[2]コマンド入力
[3]大掃除⭐️

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/30a229d0-f1fb-5a12-c36a-e5d7aca881bb.png)
IDPで使用していたKeycloakのイメージを変更する（備忘録）

# はじめに

Keycloakの docker image が docker.io/jboss/keycloak からなくなってしまったので、別の場所 quay.io/keycloak/keycloak からイメージを入手するように構成を更新しました。

以下のページで使用している構成スクリプトです

https://qiita.com/keniooi/items/cfe2b8ef692b23500a15

https://qiita.com/keniooi/items/050b5ae0d8f50bf63c84


# Docker repository

はじめににも書きましたがレポジトリの移動にあわせて Dockerfileを更新します。

```
FROM jboss/keycloak
```

から

```
FROM quay.io/keycloak/keycloak
```

に変更します。


# Keycloak 起動時の引数

Dockerイメージを起動するときの引数に変更があったので修正します。

```
docker run -d -p 8080:8080 -p 8443:8443 --name kc liberty-idp -Djboss.bind.address.private=127.0.0.1 -Djboss.bind.address=0.0.0.0
```

から

```
docker run -d -p 8080:8080 -p 8443:8443 --name kc liberty-idp start-dev
```

にします。元イメージに構成を加えてるのでイメージ名は違いますが、使える引数はもとのイメージと同じです。


# kcadm.sh 

管理コマンドのパスが変わってしまっていたので、修正します。

```
/opt/jboss/keycloak/bin/kcadm.sh
```

から

```
/opt/keycloak/bin/kcadm.sh
```

に変わっていました。


# Keycloak Admin URL

管理用のURLが変わっていました。探すと以下のようなQAも見つかります。

https://stackoverflow.com/questions/71338147/keycloak-login-page-says-page-not-found

SHELL中だけではなくて、WAS,Libertynの構成中でも指定があったりするので、注意が必要でした。

```
http://localhost:8080/auth
```

から

```
http://localhost:8080/
```

で auth がなくなってました。auth があっても動作してくれるところもあるので混乱してしまいますが、直さないと動作しないところもあるので、修正が必要です。


# まとめ

同じような変更時に対応ができるように残して置きます。
【css】少し下に下がる日付フォームを調整したい

## 問題
input[type="date"]を使った時
iPhoneでサイトを確認すると
日付フォームだけ少し下に下がっている
これを修正したい

※検証ツールでレスポンシブでの確認では、下がっていない
※iPhone本体(safari/chrome両方)で見ると少し下がっている

## 解決方法
```app.sass
input[type="date"] {
    padding: 0.5em; /* 入力フィールドのパディングを調整 */
    vertical-align: middle; /* 垂直方向の中央揃え */
}
```

## gpt回答
input type="date" が少し下に下がる理由や、日付を入力すると元に戻る現象については、ブラウザやデフォルトのCSSスタイルに起因する可能性があります。
具体的な理由としては、以下の点が考えられます。

ブラウザのデフォルトスタイル:
各ブラウザは、input type="date" などの入力要素に独自のデフォルトスタイルを適用しています。これにより、同じ要素でもブラウザ間で見た目や挙動が異なることがあります。特に、日付入力はデフォルトでブラウザが提供するカレンダー型のUIを持ち、そのために若干のレイアウト調整が行われることがあります。

垂直配置の違い:
input type="date" は、そのデフォルトスタイルによって垂直方向に少し下に配置されることがあります。これはブラウザのデフォルトの配置によるものであり、一部のブラウザではカレンダーの表示や入力エリアのレイアウトを調整するために余白が設定されることがあります。

日付入力時の挙動:
日付を入力すると、通常はカレンダーUIが閉じて入力された日付が表示されます。この際、ブラウザは再度要素のレンダリングを行うため、少しのレイアウト変更が見られることがあります。

CSSの影響:
ページ全体のCSSスタイルや他の要素の影響も考えられます。他の要素との間に余白や配置の変更がある場合、input type="date" の配置も影響を受ける可能性があります。
これらの理由から、input type="date" の見た目や配置がブラウザによって異なることがあります。カスタムスタイルを適用してこれらの問題を解決する場合は、CSSを使用して要素を明示的にスタイリングすることが効果的です。例えば、マージンやパディングを調整して垂直方向の配置を制御することができます。

```
css
input[type="date"] {
    padding: 0.5em; /* 入力フィールドのパディングを調整 */
    vertical-align: middle; /* 垂直方向の中央揃え */
}
```
また、他の要素との配置やスタイルの整合性を確保するために、総合的なレイアウト設計を行うことも重要です。
MITRE ATT&CK Syncを使ってATT&CKのバージョン比較をする

# はじめに

2024年4月24日（日本時間）に、MITRE ATT&CKの最新バージョン15.0がリリースされた。
以前のバージョンとの比較を行う方法について調べた結果をまとめてみる。


# 直前のバージョンとの比較

以前のバージョンとの変更点は、version historyに書いてある。

https://attack.mitre.org/resources/updates/updates-april-2024/

変更箇所の詳細はchangelogを見ることで確認できる。


https://attack.mitre.org/docs/changelogs/v14.1-v15.0/changelog-detailed.html


図１：changelogによるT1136.003(Create Account:Cloud Account）のv14.1からv15.0の変更点の比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/4af4de12-6758-9aa7-9465-424be52d6e30.png)


# 直前のバージョン以前のバージョンとの比較

直前のバージョンとの比較だけでなく、それ以前のバージョンとの比較を簡単に行うツールとしてATT&CK Syncがある。

https://center-for-threat-informed-defense.github.io/attack-sync/

比較したいバージョンを指定することで、変更点のサマリーと詳細の変更箇所を確認することができる。

図２：ATT&CK Syncでのバージョン指定の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/1db7f7ae-87dd-b32e-617c-556df13ae9d0.png)



図３：変更箇所のサマリーの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/e79e59e7-890d-aa0f-d002-780871055a94.png)

図４：ATT&CK SyncによるT1136.003(Create Account:Cloud Account）のv14.1からv15.0の変更点の比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/eef770ee-94a4-fa14-19f7-0072fe0907a1.png)

さらに、直前のバージョンより以前のバージョンとの比較の例を示す。（図５）
図４と同じTechniqueを参照しているので、違いが確認できると思う。


図５：ATT&CK SyncによるT1136.003(Create Account:Cloud Account）のv10.0からv15.0の変更点の比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/a7da650a-a35a-0c2e-dff2-0345e0ba44c7.png)


# まとめ
MITRE ATT&CKのバージョンアップに伴う、変更箇所の確認手段としてATT&CK Syncを紹介した。
ただし、ATT&CK SyncがMITRE ATT&CKの最新バージョンリリース後、同バージョンに対応するまで数日を要した。

このような場合、ATT&CK Syncのソースコードが公開されているので、自身の環境にセットアップしておき、最新バージョンのデータだけダウンロードすることで同様のことができるようだ。こちらも試してみたい。


https://github.com/center-for-threat-informed-defense/attack-sync/wiki/Developers
Dockerで開発環境構築

- Docker v24

## はじめに
久しぶりにDockerで開発環境を構築する際に手間取ったため、備忘録として開発環境構築手順を残しています。
Docker Desctopのインストールなど、Dockerの利用準備は済んでいる前提です。

## 環境構築の流れ
1. `compose.yaml` を作成する
2. 追加操作が必要なサービス毎に`Dockerfile`を用意する
3. `docker compose up -d`でコンテナを確認

## 1. compose.yaml

いわゆる`docker-compose.yml`です。最新のDockerだと`compose.yaml`が推奨されているようなので、この記事ではそちらで統一しています。後方互換性があるのでどちらでも大丈夫です。

まずは`compose.yaml`を作成し、必要なサービス毎にコンテナを定義します。
↓はNuxt3とMySQLで作る場合の一例です。

``` yaml
name: my-project # プロジェクト名
services:
  # サービス名
  front:
    # コンテナ名を指定しない場合は{プロジェクト名}-{サービス名}-{連番}が自動で設定される
    container_name: my-project-front # コンテナ名
    build: docker/front # Dockerfileの場所
    volumes:
      # ホスト側のディレクトリをコンテナ側にマウント
      - ./src:/app:cached
      - nuxt_node_modules:/app/node_modules
    ports:
      # ポートフォワーディング
      - "3000:3000"
      - "24678:24678" # Nuxt3 HMR
    tty: true # コンテナ内でコマンドを実行するために必要
    environment:
      # 環境変数
      - HOST=0.0.0.0
      - port=3000
      - CHOKIDAR_USEPOLLING=true # Nuxt3 HMR

  mysql:
    image: mysql:8.0 # イメージ
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    ports:
      - 3306:3306
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  # ボリュームの定義
  nuxt_node_modules:
  mysql-data:
```

## 2. Dockerfile
次に作成時に追加操作が必要なコンテナに`Dockerfile`を用意します。
↓はNuxt3用Dockerfileの一例です。

``` dockerfile
# Node.jsのイメージを使用
FROM node:20-slim

# タイムゾーンを設定
ENV TZ Asia/Tokyo

# 作業ディレクトリを設定
WORKDIR /app

# パッケージをインストール
RUN apt-get update \
    && apt-get install -y \
    git \
    vim
```

## 3. コンテナを作成し、開始する
`docker compose up -d`コマンドは`compose.yaml`で定義したサービス用コンテナの構築、（再）作成、開始をまとめておこなってくれます。
`-d`オプションは`--detach`の略でバックグラウンドでコンテナを実行します。


## 用語

Dockerで使われる用語について、自分なりに簡潔にまとめています。

### Docker とは
アプリケーションを開発、配布、実行するためのオープンプラットフォーム。
コンテナ型の仮想環境を運用する。

### コンテナ
一つのOS上で、CPU・メモリ・プロセス空間などが独立した仮想環境。

### Dockerイメージ
コンテナ作成の元となるテンプレートファイル。

### Dockerボリューム
コンテナ上のデータを永続化するための場所。
コンテナが破棄されても消えないようにするため。

### Dockerfile
Dockerイメージにレイヤーを追加するためのテキストファイル。
ネット上に公開されているイメージだと足りない部分をDockerfileに追記する。

### Docker Compose
複数のコンテナを起動したりする Yamlファイル。
ここでフロント、DB、バックエンドコンテナのように記述しておくことでcompose up で即起動できるようになる。

## 参考URL
[Dockerドキュメント](https://docs.docker.com/reference/)
（メモ書き）exeファイルとは

exeファイルとは
Windows上で実行可能なファイル形式の一つ。
拡張子が「.exe」であるファイルの総称。
中身は機械語で書かれている。


先頭部分に「MZ」という文字列
シグネチャと呼ばれるもの
マシンを識別するためのフラグが格納されている


exeをデバッグするには
起動時のデバッグが目的なら、［F11］を押す。
効果的にデバッグを行うには、.exeのソースコードをVisual Studioで特定し、開く必要がある。
デジタル名刺（プレーリーカード）を自作してみた

# はじめに
注意点！
NFCカードを入手できなかったので、NFCシールをカードに貼り付けて作成しました。その点はご注意下さい。

# きっかけ

最近、IT系イベントで未来を感じる体験をしました。

セミナーの参加者同士での名刺交換を行った際に、
先方が謎のカード取り出して、そのカードを私のスマホで読み取ると、
先方のプロフィールページが表示されるというものでした。

↓こんな感じ
![IMG_0182.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/eca40771-b639-ecd1-7fa5-248414325f1e.jpeg)

挙動自体は、QRコードをスマホのカメラで読み取った時のように、
サイトのリンクがスマホ上部に表示され、先方のプロフィールページへ遷移できるというものです。

# 欲しい！！

新人研修で練習した、紙の名刺の受け取り方渡し方は、
これから近い未来で、カードの見せ方スマホのかざし方になったりするんだろうか。

というかセキュリティ心配だな。やばいサイトリンクを表示させてクリックさせる詐欺とか出てきそうだな。

など色々なことが頭を巡りましたが、

私も欲しい！ということで、
これは何？どこで入手できるの？を調べてみました。

# デジタル名刺（プレーリーカード）
この謎のカードは、デジタル名刺（プレーリーカード）と言って、
交通系ICカード等で使用されている、NFCという技術のものを使用しているらしい。

## 入手方法と価格
どこかのサイトから申し込むらしい。
価格は3000円ほどで、紹介制度でお安くなったりするらしい。

・・・・
へ〜。なるほどね。いつか申し込もう！
と存在自体を知ってからしばらく経ちました。

# X（旧Twitter）で見つけた「プレーリーカード自作できる」のポスト
え、なんだって？自作できる？
もう楽しそう。
ということで、作り方を調べました。

# 用意するもの
<dl>
  <dt>NFCカード</dt>
  <dd>カードでも、タグでも、シールでも　何でも良さそう</dd>
  <dt>NFC書き込み用アプリ</dt>
  <dd>スマホアプリ</dd>
</dl>

これだけ。簡単そうだ。

## NFCカード
そもそもNFCって何？というところで少々躓きましたが、

結果として私は以下を購入して使用しています。

https://www.biccamera.com/bc/item/10242837/

こっちも買いましたが書き込むアプリがAndroidのみだったので未検証です

https://www.biccamera.com/bc/item/2551933/

### 注意点
NFCの現物を扱う店舗が関東に少ないです。
私は今すぐにそれが欲しかったので、家店量販店やホームセンターを梯子しました。
その結果、今すぐに手に入るものが、
タグと呼ばれる円盤型の小さいシール形式のものだけだったので、
今回その形式での自作となりました。

取り寄せや宅配にすれば、カード型のものも手に入ると思われます。

## NFC書き込み用アプリ

多分何でも良いのだと思いますが、
私は「NFC Tools」というアプリを使用しました。

ちゃんとロック機能が実装されており、悪意のある人に上書きされないような対策がありました。

# 作成方法
1.NFC書き込み用アプリをスマホにインストール
2.表示したいプロフィールページのリンクをアプリに登録
3.アプリで書き込みボタンを押して、NFCをスマホに近づける。

以上！超簡単でした！

# 可能性は無限大
登録するプロフィールページは何でも大丈夫そう。
X（旧Twitter）でも、noteでも。
本物のプレーリーカードを使用している人たちは、各SNSへのリンクページみたいにしていた気がするので、それが便利かもです。

そして外側ですが（ここが私の本題）、これこそ何でも良いので色々作ってみました。
現実運用する際は、1つだけで良いので、
参加するイベントの目的に合わせたものを使用するとなお良いかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/339fefba-93d1-55bb-405e-fe4ad85012f9.png)

イベントで動き回る時は腕時計型にしてみるとかどうでしょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/476050a5-ddd7-b57b-2188-d024c48adfdf.png)

ちなみにこちら光ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/81a6b8d2-1fc0-64ff-f657-02ffd235c9e8.png)


例えば、
自分の好きなスポーツがわかりやすいようにおもちゃのボールに貼り付けても良いでしょうし、
AWSのイベントなら自身が好きなサービスのアイコンにしても良いでしょうし、
なんであれ、会話を広げられるようなものにすると良いかもですね。

ちなみに今私が使っている自作プレーリーカードはこんな感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/79ea8840-51b9-40be-ebb3-1a684047d86c.png)

名刺サイズ以下のアクリルスタンドを買ってきて、それにNFCタグを貼ると、
名刺入れにも入るし、使いやすいです。

また、100円ショップで名刺サイズのクリアカードが売っているのでそれもいい感じです。

https://jp.daisonet.com/products/4550480413938?_pos=7&_sid=3a81e1343&_ss=r
記述統計と推測統計

## 記述統計

記述統計とは、実際のデータ(母集団)からランダムにデータを抽出して、そのデータ（標本）の特徴を明らかにしていく分野です。
平均値や中央値などを計算して、前回の分布を描画に加えて、数値化を目指す。

## 推測統計

推測統計では、記述統計で分析したデータの特徴から母集団の特徴を推測する分野です。


![記述統計と推測統計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/15b874e1-dc59-db0d-7aab-f3461d2b3c03.png)

例1 
アンケート調査を実施した結果、「今の年収に満足している」と回答した男性は60%だった
→ **記述統計**

例2
アンケートの結果をもとに、成人男性の平均年収を予測する
→ **推測統計**
[React Native] 画像をUploadするとsizeが0で保存される

### はじめに

Qiitaハッカソンの予選にてFrontend: React Native, Backend: Pythonという構成のアプリを開発しました。その際に画像をフロントエンドからバックエンドに正しく送信することができませんでした。解決するのに時間がかかったため共有したいと思います。

この記事での構成はReact Nativeと簡易的なNode.jsのServerです。

以下にリポジトリを作成しました。

https://github.com/shima8823/react-native-issue-upload-image

### 問題

“react-native-image-picker”というライブラリを使い画像を取得します。

以下のようにformDataにappend、fetchするとサーバー側で0バイトの画像が作成されます。

```tsx
let file = new File(
	[blob],
	fileName!, 
	{
		type: fileType as string,
		lastModified: new Date().getTime(),
	}
);
formData.append('file', file);
```

### 対処法

以下のname, uriプロパティを持ったオブジェクトをappend関数の第二引数に指定する。

```tsx
formData.append('file', {
	name: fileName!,
	uri: fileUri!,
}
```

React NativeのFileオブジェクトやBlobオブジェクトではuriプロパティが定義されていないので注意が必要です。

```tsx
interface File extends Blob {
  name: string;
  lastModified: number;
}

declare var File: {
  prototype: File;
  new (
    fileParts?: Array<Blob | string>,
    name?: string,
    options?: BlobOptions,
  ): File;
};
```

```tsx

interface Blob {
  readonly size: number;
  readonly type: string;
  slice(start?: number, end?: number, contentType?: string): Blob;
}

declare var Blob: {
  prototype: Blob;
  new (blobParts?: Array<Blob | string>, options?: BlobOptions): Blob;
};
```

### 理由

React Native 公式documentでは言及されているところを見つけられませんでした。

documentや該当するsource codeを見つけたらコメントで教えてください！

私の考えでは、セキリュティ上の理由からReact Nativeアプリではネイティブコード(Java, Objective-Cなど)を介してでしかローカルファイルシステムにアクセスできないので最低限のnameとuriを指定しネイティブコード側で変換していると思います。

### 終わりと宣伝

QiitaハッカソンにEngineMakerというシェアハウスのメンバー5人で出場しました。

結果は予選敗退となってしまいましたが、メンバーのほとんどが初ハッカソンでいい経験になったと思います。

EngineMakerはさまざまなエンジニアが住んでいて、イベントに参加したり開発の話をしたり日々面白いことをやっています。一度[もくもく会](https://enginemaker.connpass.com/)に来てみたら雰囲気がわかるかも！

[作成したアプリ](https://github.com/EngineMaker/share-engine)

[動作動画](https://x.com/chomado/status/1756597276120846750)

### 参考

https://reactnative.dev/docs/native-modules-intro
ブラウザで行う球状黒鉛鋳鉄品の黒鉛球状化率の測定の改良（凸包の最遠点対を求めて丸み係数を算出する方法に変更）

# はじめに
JIS G5502-2022 球状黒鉛鋳鉄品により黒鉛球状化率を算出する場合、次式の丸み係数

```math
丸み係数 = \frac{黒鉛の面積}{黒鉛の最大軸長を直径とする円の面積}　　　(1)
```

を使うことが規定されていますが、前回ご紹介したアプリ$^{(1)(2)}$では、次式で定義した丸み係数の近似値

```math
丸み係数の近似値 = \frac{黒鉛の面積}{黒鉛の最小外接円の面積}　　　(2)
```

を使って黒鉛球状化率を算出していました。
式(2)を使って求めた黒鉛球状化率は、式(1)を使う場合に比べて若干小さい値になる$^{(3)}$ため、今回は式(1)の丸み係数を使って黒鉛球状化率を求めるアプリを作成しました。

# 式(1)の黒鉛の最大軸長の求め方
式(2)の分母の **黒鉛の最小外接円** は、OpenCVの **cv.minEnclosingCircle()** という関数を使えば容易に求まりますが、式(1)の分母の**黒鉛の最大軸長**を求める関数はOpenCVにはありません。
今回作成したアプリでは、黒鉛の輪郭の凸包を求め、その座標値からキャリパ法により得られた最遠点対を最大軸長としています。なお、Python言語でOpenCVを使って作成したアプリ$^{(4)}$ においても、これと同じ方法で丸み係数を求めています。なお、最遠点対を求めるプログラムは$^{(5)}$を参考にして作成しています。

# 使い方
以下のサイトを立ち上げます。

https://repositoryfiles.github.io/nodularity_web_app-using-_convex/nodularity_web_app(using_convex).html

1. ブラウザ左上の表示が「準備完了」になれば使用できます（通信環境やパソコンの処理速度により、多少待つ場合があります）。
画像の幅に値を入力します。この値の設定についてはZIPファイルのREADMEを参照下さい。また、最小黒鉛の長さについてはJISの規定では10となっているので、変更は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/62ae4429-791a-9315-0fd7-4d90cf104f75.png)

2. 「ファイル選択」をクリックして、球状化率を評価する画像ファイルを読み込みます。画像ファイルはダウンロードしたZIPファイル中のサンプル画像を使うことも可能です。画像ファイルは複数選択することも可能です。読み込んだら少し待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/8b1199e6-70e0-6bff-01ff-33e7dbd91c39.png)

3. このような表示が出る場合、「許可する」をクリックすれば画像をダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/23170e9a-8d8f-01c7-6497-0dbbc140cb5a.png)

4. ブラウザにJIS法とISO法の黒鉛球状化率の計算結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/568d7ffd-6b61-d0d6-d948-0a30244d49aa.png)
ここに表示されている結果は、以前の記事$^{(3)}$の表のJIS法とISO法の結果とほぼ同値になっています（以前の記事$^{(3)}$と同じ画像ファイルを用いているため）。

5. ダウンロードの保存先に指定されているフォルダに画像ファイルが保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/852229ff-0979-d63f-e304-39b655416828.png)

6. ダウンロードされるファイル名と内容は次のとおりです。
- JIS法
    - ファイル名：元のファイル名+_result(JIS)_球状化率.jpg
    - 内容：JIS法で黒鉛の形状を色分けしたもの
（Ⅰ：赤、Ⅱ：紫、Ⅲ：緑、Ⅳ：水色、Ⅴ：青）
- ISO法
    - ファイル名：元のファイル名+_result(ISO)_球状化率.jpg
    - 内容：ISO法で黒鉛の形状を色分けしたもの
（青：ⅤとⅥ、赤：Ⅰ～Ⅳ）

ソースファイルはこちらにあります。READMEの注意事項を読んでお使いください。

https://github.com/repositoryfiles/nodularity_web_app-using-_convex

何かの参考になれば幸いです。

# 開発環境

- Windows11
- OpenCV.js 4.9.0

# 参考
(1) JIS G5502球状黒鉛鋳鉄品の黒鉛球状化率の測定（ブラウザ上で行う）

https://qiita.com/_Moony/items/276db838b77e45cf5435

(2) ブラウザで行う球状黒鉛鋳鉄品の黒鉛球状化率の測定

https://qiita.com/_Moony/items/90b9cdee33f6dc9057c4

(3) 球状黒鉛鋳鉄品の黒鉛球状化率と丸み係数について

https://qiita.com/_Moony/items/4a0b84bca07e21f4b0fa

(4) JIS G5502球状黒鉛鋳鉄品の黒鉛球状化率の測定ソフトを作ってみた

https://qiita.com/_Moony/items/2faf01955b7b88873066

(5) キャリパー法って響きがなんか好き

https://keiorogiken.wordpress.com/2017/12/14/%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%91%E3%83%BC%E6%B3%95%E3%81%A3%E3%81%A6%E9%9F%BF%E3%81%8D%E3%81%8C%E3%81%AA%E3%82%93%E3%81%8B%E5%A5%BD%E3%81%8D/
Amazon ECRのプライベートレジストリのDockerイメージのローカルでのPull/Push

## 概要
CodeBuildでビルドされているDockerイメージをローカルにPULLしたかった時の備忘録です。

## 結論
これだけです。ECRでログイン用のTokenを発行できます。12時間有効です。

```shell
$ aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
$ docker pull aws_account_id.dkr.ecr.us-west-2.amazonaws.com/repository:tag
```

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker-section.html

ちなみに、CodeBuild で Docker Image をビルドする手順にもありますね。

```yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

```


## 参考
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-pull-ecr-image.html

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/registry_auth.html
コードによる副作用を無くせ！「簡単・便利なLINQ」

![linq.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/3dedaff0-7709-972a-0add-1be82dce9392.jpeg)

エスプリフォートでは、業務内でのシステム開発以外でも、日々アンテナを張りながら仲間同士お互いに技術力を磨き合っています。
そして高めた技術力を顧客のために如何に生かしていくのかということを考え、顧客から頼られる存在としてあり続けています。

今回は副作用のないコードを書けて便利な「LINQ」をご紹介いたします。

# LINQとは
C#には、LINQ（リンク）という仕組みが用意されています。
バージョン3.0から適用することができます。

LINQを使用する利点の１つとして、配列やコレクションを扱う操作を「副作用なし」に扱う事ができる点にあります。

# 副作用とは？
『副作用』とは、「操作には直接関係しないが、その操作により値が変わる等の影響を与えてしまう」事を言います。

例えば、「配列の偶数インデックスと奇数インデックス毎の合計を算出するプログラム」を考えてみましょう。

## LINQを使用しない場合（副作用あり）
まずは、LINQを使用しない場合で書いてみます。

```C#:Sample_without_LINQ.cs
    static void Main(string[] args)
    {
        int[] ary = new int[] { 5, 10, 3, 4, 8 };

        int sum_gusu = 0;
        int sum_kisu = 0;
        for (int i = 0; i < ary.Length; i++)
        {
            if (i % 2 == 0) {
                sum_gusu += ary[i];
            } else {
                sum_kisu += ary[i];
            }
        }

        Console.WriteLine("総計（偶数） : " + sum_gusu);
        Console.WriteLine("総計（奇数） : " + sum_kisu);
    }
```

ここで注目すべきは、変数 i です。

変数 i は 変数 ary を先頭から順に走査するために使用されていますが、よく考えてみると **「合計を算出する」という本プログラムの本質とは、直接関係しません** よね。

加えて変数 i を定義することで、 **その値の変遷にプログラマは注意する必要があります。**

例えば、for文の i < ary.Length を i <= ary.Length と間違って記載してしまうと、実行時例外が発生してしまいます。

つまり、副作用が発生してしまっています。

副作用はプログラムに好ましくない影響を与える場合があり、またその取り扱いにも注意が必要になってしまいます。

## LINQを使用する場合（副作用なし）
では次に、LINQを使用した場合で書いてみます。

```C#:Sample_with_LINQ.cs
    static void Main(string[] args)
    {
        int[] ary = new int[] { 5, 10, 3, 4, 8 };

        int sum_gusu = ary.Where((_, i) => (i % 2 == 0)).Sum();
        int sum_kisu = ary.Where((_, i) => (i % 2 == 1)).Sum();

        Console.WriteLine("総計（偶数） : " + sum_gusu);
        Console.WriteLine("総計（奇数） : " + sum_kisu);
    }
```

ここでも 変数 i を使用してますが、LINQを使用しない場合と比べて、その役割が大きく異なります。

ここでの変数 i は、変数 ary のインデックスを参照します、という宣言として使用されているのみです。[^1]

さらに注目する点として、プログラマは、変数 i の値の変遷については、一切考慮する必要がありません。[^2]

LINQを使用する場合と使用しない場合、どちらがプログラムをする上で楽か、言うまでもありませんよね。

# まとめ
LINQを使用して副作用を無くす（減らす）ことで、プログラムを楽に、分かりやすく、安全に扱えるものにしていくことができますので、ぜひ積極的に活用していきましょう。

今回はC#でLINQによる例を見てみましたが、「副作用を無くす」ことは他にも多くの方法や観点がありますので、よりよいコードを書くためにも、より多くのことを取り入れていくこともご検討されてみてはいかがでしょうか。

[^1]:このように、LINQを使用したプログラムを書くと「宣言的」な記述になります。「宣言的」とは、「プログラムはこうなります」といった宣言をすることをいいます。

[^2]:LINQを使用することで構文は少しややこしくなりますが、プログラムが意図している事は分かりやすくなります。

https://www.esprit-fort.co.jp/


https://www.esprit-fort.co.jp/recruit/
AppleWatchで実機ビルド

最近AppleWatchを購入して、watchOS勉強中です。

早速Xcodeで実機ビルドをしよう！…と、試して意外にも時間かかってしまい、無事に実機ビルドできるまでの過程をまとめてみました。

## Xcodeのbuild schemes にAppleWatchが表示されない

'Watch-only App' でプロジェクトを作成
↓
早速実機ビルド試してみよう

…の手順で進めてました。

しかし、実機のAppleWatchがSchemeに表示されていない…
そもそも端末使ったビルドってどうやってたっけ？と、過去にiPhoneをビルドした時の思い出を巡らせながら（すっかり忘れてたけど…）アレコレ試してみました

*Schemeについては分からない方は、こちらのドキュメントを参考にしてください
https://developer.apple.com/documentation/xcode/customizing-the-build-schemes-for-a-project/
## ペアリング確認と別プロジェクト立ち上げ

iPhoneとAppleWatchはペアリングできている。
別プロジェクトを立ち上げ、'Watch App with New Companion iOS App' で作成して検証してみる。

 <img width="480" alt="product-app" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779616/3f564db0-2f0f-60d7-baa9-f5099cc0e8b2.png">

'Watch App with New Companion iOS App' のプロジェクトからiPhone/AppleWatchのターゲットを選択し、それぞれ選択してみた。↓こんな感じ

<img width="480" alt="select-schemes" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779616/02963a38-e47d-c314-0fac-4a01f7ea4e0d.png">

iPhone側の方では実機が選択できましたが、AppleWatch側のほうでは実機が出てこない…

## Xcode/AppleWatchを再起動

Xcodeを再起動してみましが、こちらもダメ。
AppleWatchを再起動してみたところ、デベロッパモードの許可画面が表示しました。

<img width="200" alt="watch-developer" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779616/d493588b-6a41-eb90-4e62-9be133b34137.png">

許可をONにした後、「これでビルドできる！」と喜んだ束の間、XcodeのSchemeを確認しましたが、実機AppleWatchは選択できず…

## AppleWatchのデベロッパーモードを確認
ググりつつ色々な記事を読んでみると、AppleWatchの「設定」→「プライバシーとセキュリティ」にデベロッパーモードがあるとのこと。端末を早速調べてみたけど表示されていない！！　何故だ…

## XcodeのSigining & Capabilitesを確認


ここまでで、Simulatorでビルドを試してなかったことに気づく。

Simulatorを選択してビルドしてみましたが、プロジェクトをXcodeで開いて、TARGETS　→　Sigining & Capabilites を確認してみて、Signing for "⚪︎⚪︎" requires a development team.と開発証明書が無かった件。(証明書の作成については省かせていただきます🙏)

とりあえず、Developerアカウントを作成して、Accountsに追加しました。

<img width="480" alt="select-accounts" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779616/90a6fcd0-aa29-d2c6-4463-d588cf5bc397.png">

Sigining の Team を 'None' から、作成したAccountに合わせました。
その後、無事ビルドが成功。

ビルド後に Scheme を確認しましたが、それでもやっぱり実機AppleWatch選択できないよね…



## 結局のところ時間が経ったら実機ビルドできた
プロジェクトを立ち上げて
関連する公式ドキュメントやフォーラムを探してみたり、色々な記事を読んでみたりとアレコレ試して3日が経過…

まさか実機ビルドするだけにこれだけ時間がかかるものなのか…!?
と意気消沈した矢先、Schemeに実機AppleWatchが登場。（どういうこと…!?）

<img width="480" alt="scheme-watch" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779616/001ad88c-0b8a-5ab9-c064-c0ad8ef79a0c.png">

AppleWatchの開発は不安定とは聞いたことあるけども、なぜ実機ビルドできるようになったのかが解明できず…
うーん、時間が経てば出現するものなのか？🧐

実機ビルドができるようになった後で、AppleWatchの「設定」→「プライバシーとセキュリティ」にデベロッパーモードが存在していました。（watchOSは不安定？）

'Watch-only App'と'Watch App with New Companion iOS App'の両方でSchemeに実機端末が表示され、ビルドできたので結果良し！

## 参考記事

https://developer.apple.com/documentation/xcode/running-your-app-in-simulator-or-on-a-device#Select-a-build-scheme-and-run-destination

https://forums.developer.apple.com/forums/thread/747784

https://qiita.com/yoshitaka/items/84c85d3f023dee879242
コミット履歴の確認とコミットを元に戻す方法

# 1.コミット履歴の確認
```
git reflog
```
↑を入力
# 2.コミットを戻す方法
```
git reset --hard リセットしたいコミットID
```
例えば・・・
```
git reset --hard HEAD@{1}
```
「git reset」はコミット履歴には残らないため、リモートリポジトリに「git push」して既に公開しているものに対して行うと、存在するはずのコミットがなくなって不整合が生じ他のメンバーなどがコミットできなくなってしまいます。

そのため、できるだけ「git push」前のローカル側にある時に使うようにします。
# 3.コミットを戻すもう一つの方法
```
git revert リセットしたいコミットID
```
gitに履歴が残るため「git push」した後でも使えます。


引用：https://kuku81kuku81.hatenablog.com/entry/2022/10/03_git_how_to_reset_commit#%EF%BC%91%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E7%A2%BA%E8%AA%8D
カプセル化

## はじめに

カプセル化について整理する。

### カプセル化とは

クラスの機能のうち使い手に必要ないものを隠すこと。

### アクセサーメソッド

カプセル化の典型例として、プロパティを隠蔽するためにアクセサーメソッドを使用する例。
セッター(`setBase`, `setHeight`)では与えられた引数が負数の場合には例外を発生させている。

```php:TriangleFigure.php
<?php
class TriangleFigure
{
    private float $base;
    private float $height;

    public function __construct()
    {
        $this->setBase(1);
        $this->setHeight(1);
    }

    public function getBase(): float
    {
        return $this->base;
    }

    public function setBase(float $base): void
    {
        if ($base <= 0) {
            throw new Exception('baseは整数で指定します。');
        }
        $this->base = $base;
    }

    public function getHeight(): float
    {
        return $this->height;
    }

    public function setHeight(float $height): void
    {
        if ($height <= 0) {
            throw new Exception('heightは整数で指定します。');
        }
        $this->height = $height;
    }

    public function getArea(): float
    {
        return $this->base * $this->height / 2;
    }
}
```

### なぜアクセサーメソッドを使うのか

アクセサーメソッドを使わずに、プロパティにそのまま外からアクセスできると以下のような弊害がある。

#### 読み書きの許可/禁止を制御できない

プロパティはインスタンスの状態を管理するための変数であるため、取得や変更に何らかの制限を課したい。
プロパティがpublicだと外から自由に取得/変更できてしまう。

#### 値の妥当性を検証できない

型宣言で一定のガードは掛けられるが、詳細なチェックを課すことができない。
外からプロパティを参照するメソッドにチェックを課すことはできるが、これはコードの保守性から望ましくない。

#### 内部状態の変更に左右される

外からプロパティを参照するメソッドが複数ある場合、プロパティの状態を変更すると(型をfloatからintに変えたり等)、そのプロパティを参照する全てのメソッドが影響を受けてしまう。
Discordスラッシュコマンド, Interaction Object の "guild_locale", "locale" について

## やりたかったこと
- スラッシュコマンドにて、表示言語を導入サーバーに適したものに自動設定したい
- 受信したパラメタで判定に使える値を探したい

## 受信パラメタ調査
- [Interactions(Developer Portal資料)](https://discord.com/developers/docs/interactions/receiving-and-responding#interactions) の中に記載がある[Interaction Object](https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object)　内の"guild_locale"と"locale"が目的のものに近そう

### locale
> Selected language of the invoking user

### guild_locale
> Guild's preferred locale, if invoked in a guild

→ preferred_locale

> the preferred locale of a Community guild; used in server discovery and notices from Discord, and sent in interactions; defaults to "en-US"


## 設定箇所

### locale 「ユーザー設定」→「言語」
ここは自分で設定した記憶があるので迷わなかった。

![locale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781648/f8c1920a-e0b5-7142-4be3-9db7bdf90f49.png)

![lang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781648/80ad8dea-c0f4-edd7-91f2-3597d2c93f10.png)

### guild_locale 「サーバー設定」→「コミュニティ　概要」→「サーバーの第一言語」
以下については普段「フレンドサーバー」でテストしていたので設定が見つからず困った。
後述するが「フレンドサーバー」を「コミュニティーサーバー」に変更して変更できた。

![スクリーンショット 2024-04-30 20.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781648/1c7e0a8d-7682-c3ce-f25c-ba762aba3d9a.png)

![スクリーンショット 2024-04-30 20.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781648/d9ceb27f-5154-1da4-a74b-dab81d199e8d.png)

## 「フレンドサーバー」と「コミュニティーサーバー」
[サーバータイプ(ヘルプセンター）](https://support.discord.com/hc/ja/articles/14078261239831-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%97)

先述したが、"guild_locale"は「コミュニティーサーバー」でのみ設定可能。
フレンドサーバーでは常にでファオルトの"en-US"固定となる模様。

## 結局どうするか
- フレンドサーバーに導入してもらうこともあるだろうから、"guild_locale"だけで判定はできない。
- localeはサーバー管理者だけが実行するサーバー、初回サーバー管理者が起動するサーバーでは有効か。
- 初回起動時に"locale"で判定し、後からサーバー管理者が設定変更できるような仕様にすることにした。

## 注意とお願い
- ここら辺仕様が今後変わりそうな気がします。2024.04.30現在の情報である点ご注意ください
- そもそも間違っていたり、もっと良い方法があればご指摘いただけるとありがたいです🙇

## 追記1(2024.04.30 22:00)
- 言語＝利用場所（タイムゾーン）ではない
- 例）en-US を米国としても東部と西部では差が激しい
- 場合によっては政治的な配慮が必要なケースが生じる可能性
- あくまで目安として設定し、まよったらデフォルトのen-USにしておく
指差呼称ノススメ

　新社会人のみなさん、GWはうまくリフレッシュできていますか？　入社してから１ヶ月も経ち、少しずつ仕事に慣れてきていることと思います。

　仕事に慣れることは良いことで、余裕が出てくる分見えるものが増えて仕事が面白くなってくるかもですね。ただ人間慣れてくると事故や失敗もつきものです。確認を怠ったり手順を省略して作業を進めてしまい、思わぬミスやインシデントを発生させてしまう…といったことも、よくあるケースです。

　今回はこの問題を回避するためのちょっとした手段「**指差呼称**」を紹介＆おすすめします。
　みなさんの役立つちょっとしたライフハックになれば嬉しいです。


## 指差呼称（しさこしょう）とは

　このように四字熟語の形で聞くことは余りないかもしれませんが、ひらたく言えば“**指差し声出し確認**”になります。Wikipediaでは「[指差喚呼](https://ja.wikipedia.org/wiki/%E6%8C%87%E5%B7%AE%E5%96%9A%E5%91%BC)」（しさかんこ）とあり、いろいろな業界で呼び方があるようです。

　電車の運転手さんが出発前に「〇〇ヨシ！」と指差ししながら大きな声でチェックしていますよね。あれです。
この指差呼称ですが単純な目視と比べて**間違い防止の効果がある**と、上記Wikipedia記事でも紹介されています。また、[厚生労働省のこちらのページ](https://anzeninfo.mhlw.go.jp/yougo/yougo72_1.html)でも効果が紹介されています[^mhlw]。

[^mhlw]:『職場のあんぜんサイト - 指差呼称』 - https://anzeninfo.mhlw.go.jp/yougo/yougo72_1.html

何も鉄道などの交通や工事・工場などの現場に限った話でもなく、私たちのIT現場でも活用することができる手段です。
私も何かの作業アクションをする場合に行っており、経験的ではありますが、指を差し声に出すことで意識をフォーカスさせ、”正しい状態が何か”というのを考えながら作業を進められています。


## どういう時に使う？

　メールなどで誰かに何か送る時、ITシステムの運用作業時、部屋や場所を出る時去る時、そういった時に少しでいいので指を差して、小さくていいので声を出して確認するとよいでしょう。
　この時「何を」チェックして「どうあるべきか」を意識するとよさそうです。指差すものを目視し、声に出して照合することで、間違っていないことを”頭”と”体”で確認します。

　何か作業をする時には、この”指差呼称”でチェックしながら進めてみましょう。
 いくつか例となるシチュエーションをあげてみましたので参考にしてください。

<table>
<caption>【チェックの例】</caption>
<thead><tr>
  <th>何で, どこで</th>
  <th>チェック対象</th>
  <th>どうあるべき</th>
  <th></th>
</tr></thead>
<tr>
  <td>メールなど</td>
  <td>宛先／内容／添付ファイル</td>
  <td>メールアドレスが間違いがない ／ 文面・表現などが問題ない ／ 正しい添付ファイルである </td>
  <td rowspan="5"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/a64f8698-4fef-03a3-557c-136bfc39a540.png" alt="ヨシ‼️" /></td>
</tr>
<tr>
  <td>SlackやTeamsなど</td>
  <td>発言場所（チャネル） </td>
  <td>目的のチャネルやチーム、宛先・人物である</td>
</tr>
<tr>
  <td>システム運用作業</td>
  <td>作業場所／作業内容</td>
  <td>接続先・実行場所が目的のホストである ／ 実行しようとしているコマンドが手順書通りである ／ 実行した結果が手順書の想定どおりである</td>
</tr>
<tr>
  <td>防犯対策・忘れ物対策など</td>
  <td>戸締り／忘れ物</td>
  <td>鍵かけ、窓閉め、火の始末がなされている ／ チェックリスト通りである　／ 持っていくものが揃っている ／ 忘れものがない</td>
</tr>
<tr>
  <td>SNS投稿</td>
  <td>アカウント／投稿内容</td>
  <td>目的のアカウントである ／ 情報漏洩していない ／ コンプライアンス遵守している</td>
</tr>
</table>


## 注意点

### これだけで事故は無くならないよ

当然のことながらこの指差呼称するからといってミスや間違いがなくなるわけではありません。大前提ですが、ベースとなる他の防止手順・措置・対策といったハード面の対策や、教育・意識づけといったソフト面での対策と組み合わせることで効果が期待できます。[^paper]

[^paper]: 妨害音声がある場合の指差呼称の効果を調べた論文で、このようなことが述べられていました。「作業と無関係な音や声が存在する環境において指差呼称を行うことが懸念される場合，指差呼称を行う者は，指差呼称の意義を理解し，動作だけでなく，考察で述べたような心のはたらかせ方まで習慣化している必要があるということである．日常生活の中で指差呼称を行うことは，習慣化をもたらすとともに，より指差呼称の意義に気づく機会を増やすことにつながるだろう」（松井　裕子,篠原　一光,内藤　宏,彦野　賢（２０１１) 『[妨害音声に対する指差呼称の効果 ― 業務としての指差呼称経験の影響 ―](https://www.inss.co.jp/wp-content/uploads/2017/03/2011_18J014_020.pdf)』 6.

### 形骸化させないように

形骸化なりやすい行為でもあります。漫然とやってしまうと、ミス防止の効果もなく、まさに現場猫のような「ヨシ！」となってしまいます[^chuui2yoshi]。

[^chuui2yoshi]: 『[システム障害対応の教科書](www.amazon.co.jp/dp/4297140128)』（木村誠明著）では、（指差呼称について）「『失敗のメカニズム　忘れ物から巨大事故まで』にて著者の芳賀繁氏は、実験によりヒューマンエラーが1/6になることを確認しています。（中略）一方で、指差呼称への過度な期待は、個人責任への転嫁や形骸化を招くことにも注意を促しています。」（p109）と引用しており、指差呼称の支持はしつつ注意喚起もしています。

### 忙しい時ほど慌てずに

指差呼称の効果の１つに、気持ちの落ち着かせや状況の整理、というのもあると思います。
何かを急いで行わなくてはならない時に、慌ててそれを進めるのは事故を誘発させやすい状況です。指差呼称で作業に一呼吸入れながら進めることで、焦りからくるミスの防止に多少の効果が期待できそうです。

（おわり）
自分が生後何か月なのか計算するコードを実装する

# はじめに
datetime型を使用した計算をすることがあると思います（例えば日付の差分や指定した日数経過後に日付など）。
私は自分が生後何日か、何か月なのかを求めてみようと思いdatetime型を使っていたのですが、
datetime型だけだと月の差分が求められなかったので備忘メモとして残したいと思います。

# やりたいこと
自分が生後何日・何か月なのか計算させたい

# 結論
日にちの減算の計算はdatetime、月の減算の計算はrelativedeltaが良さそう

# 動作環境
Windows11
Google Colaboratory

# 日時の差分と月の差分を求める
当初は```datetime.now() - datetime(任意の日付)```で日時の差分を求めることができるので、月の差分も一緒に求められるのではと思っていました。
ところが、実行してみて中身を確認すると分かるのですが、以下のように日、秒、マイクロ秒の差分は取得できるのですが、月の差分は取得できませんでした。

```
how_many_days_old = datetime.now() - datetime(year=2014, month=10, day=25)
print(how_many_days_old)
---------------------------------------------------------------------------
datetime.timedelta(days=3475, seconds=40337, microseconds=557785)
```
公式ドキュメントを確認したところ、日、秒、マイクロ秒、分、時間、週は取得できるようですが、月は取得できないようでした。

https://docs.python.org/ja/3.12/library/datetime.html#datetime.timedelta

## 月の差分を求めるにはrelativedeltaが必要
そこで調べたところ、dateutilというサードパーティーライブラリのrelativedeltaをimportすると月の差分を求められるようでした。
```pip install python-dateutil```でインストールして早速使ってみようと思います。

以下ドキュメント

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

# サンプルコード
```Python
from datetime import datetime

from dateutil.relativedelta import relativedelta

# 試しにPyLadies Tokyoができた日を入力
birthday = datetime(year=2014, month=10, day=25)

# 生後何日
how_many_days_old = datetime.now() - datetime()
print("あなたは生後" + str(how_many_days_old.days) + "日です")
# 生後何ヶ月
how_many_old_relativedelta = relativedelta(datetime.now(), birthday)
how_many_months_old = (
    how_many_old_relativedelta.years * 12
) + how_many_old_relativedelta.months
print("あなたは生後" + str(how_many_months_old) + "ヶ月です")

-----------------------------------------------------------------------
実行結果
あなたは生後3475日です
あなたは生後114ヶ月です
```
ネット上に在る複数の日付や月の差分を求められるツールを使用して確認したところ合っていました。
**日付の差分を求めたい場合はdatetime**、**月の差分を求めたい場合はdateutil.relativedelta**を使用すると良さそうです。

コード全文はこちら

https://github.com/yuuka51/python_library_trial_example/blob/main/datetime/my_birthday.py

# 所感
生後何日かの計算結果については、日付計算ツール等を使って確認したのですが、
時間があったらテストコードも実装してみたいと思います。
おそらくモックを使わないと確認できなさそうなのでまた記事にしたいと思います。


# 参考

https://python.civic-apps.com/add-month-relativedelta/
【Python】エラー「decimal.DivisionUndefined」とは？DivisionByZeroとの違い

# 概要
あまり見かけないPythonのエラー`DivisionUndefined`に遭遇したので解説します。

# サンプルコード

以下のコードを実行します。

```py
from decimal import Decimal

sample = Decimal(0) / Decimal(0)
print(sample)
```

すると結果は以下の通り。

```
    sample = Decimal(0) / Decimal(0)
decimal.InvalidOperation: [<class 'decimal.DivisionUndefined'>]
```

# 解説
`'decimal.DivisionUndefined'`ってなんだ？って思って検索すると、これは除算の際に分子にも分母にも0(ゼロ)を連携した際に発生するエラーとのこと。

> This occurs and signals invalid-operation if division by zero was attempted (during a divide-integer, divide, or remainder operation), and the dividend is also zero. The result is [0,qNaN].
引用元：　https://tedboy.github.io/python_stdlib/generated/decimal.DivisionUndefined.html

似たようなエラーに`decimal.DivisionByZero`があると思います。
どちらも0による除算を試みた際に発生するエラーですが、`decimal.DivisionByZero`の方は分子が0でない場合に限ります。非ゼロの数値を0で除算しようとした時にのみ発生するエラーです。

一般的には0を0で割るケースなどあまりないので、`DivisionByZero`の方が見かけるのかもしれません。
擬似要素（::before ::after）が効かない！！！

### 頻出なのに毎回調べては忘れてしまう問題、擬似要素が効かない問題！！！！

初歩的なことですが、よく忘れてしまう問題なので覚書メモです。

一番最初に確認して欲しい点として、
```
<br>
<img>
<hr>
<input>
<select>
```

上記の人たちに擬似要素をつけようとしてはないか...
（私の場合ほぼほぼこれで解決となります。外側にdivをつけて解決！）

**特に``<img>``に擬似要素をつけたいことが多く、**
ここを重点的に覚えておきたいがためだけに記事を書きました。

**`<br>`,`<img>`,`<hr>`,`<input>`,`<select>`に擬似要素は効きません！！**

---

他の救済方法として、下記も記載しておきます。
* `content: "";`でcontentプロパティを指定する
* `display: block;` or `display: inline-block;`にする
* 親要素に`position: relative;`指定をする
* z-indexを確認する

上記を確認すれば、大抵は擬似要素が効くようになります。
**img要素**には気をつけましょう。。。
Nextjs の fetch を type safe(型安全) にする

## はじめに

Nextjs で [fetch](https://nextjs.org/docs/app/api-reference/functions/fetch) を使う際に、型安全にするために zod を使ってみました。
json を取得する際に、型を定義して、それに基づいてバリデーションを行うことができます。

## 環境

- Next.js: `14.2.2`
- zod: `^3.23.5`

## 背景

Nextjs で ラップされた[fetch](https://nextjs.org/docs/app/api-reference/functions/fetch) を使う際に、型安全にしたいけど、`json()`を使うと型が`any`になってしまうので、zod を使って型安全にしたいと思いました。

## zod とは

[zod](https://zod.dev/) は、スキーマを使って型を定義し、それに基づいてバリデーションを行うライブラリです。

## zod の例

```ts
import { z } from "zod";

const UserSchema = z.object({
  name: z.string(),
  age: z.number(),
});

const user = {
  name: "John",
  age: 30,
};

const parsed = UserSchema.safeParse(user);

if (!parsed.success) return parsed.error;

console.log(parsed.data); // { name: 'John', age: 30 }
```

## zod で safeParse できない場合

例えば、`age` が `string` だった場合、以下のようなエラーが出ます。

```ts
import { z } from "zod";

const UserSchema = z.object({
  name: z.string(),
  age: z.number(),
});

const user = {
  name: "John",
  age: "30", // string になっている
};

console.log(UserSchema.safeParse(user));
// { success: false, error: [ZodError [ { message: 'Invalid input', path: [ 'age' ], ... } ] }
```

## 1. よくある fetch で json を取得するコード

```ts
const res = await fetch("http://localhost:3001/user/1");

const user = await res.json();
//    ^? user any
```

このままでは`user` の型が `any` になってしまいます。

## 2. 自分で型を定義して、`as`を使うパターン

```ts
type User = {
 name: string;
 age: number;
}

const res = await fetch("http://localhost:3001/user/1");

const user = await res.json() as User;
//    ^? const users: User
```

この方法もありますが、`User` の型が変わった場合、全ての箇所を修正する必要があります。

## 3. zod を使って型安全にする

```ts
import { z } from "zod";

const UserSchema = z.object({
  name: z.string(),
  age: z.number(),
});

const res = await fetch("http://localhost:3001/user/1")
  .then((res) => res.json())
  .then(UserSchema.safeParse); // any → User

if (!res.success) return res.error;

const user = res.data;
//    ^? const user: { name: string; age: number; }
```

このように、[safeParse](https://zod.dev/?id=safeparse) を使うことで、型安全 ＆ 自分の欲しいデータの形で運用 ＆ エラーハンドリングを行うことができました。

## 参考

[Matpocock](https://www.youtube.com/@mattpocockuk) さんの動画だったと思うのですが失念しました。。。すみません
NeurIPS2023の量子化論文 (2)

# 概要

この記事では、[NeurIPS2023](https://neurips.cc/Conferences/2023)の量子化論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/dbeabba0de9cd8ccd362)

[^1]: 画像や数式は論文から引用しています。

# Towards Efficient and Accurate Winograd Convolution via Full Quantization

- 概要：Winogradと量子化の組合せの改良
- 新規性：Winogradを初めてフルで量子化するアルゴリズムを提案した。

# Intriguing Properties of Quantization at Scale

- 概要：LLMのPTQによる量子化後の精度改善
- 新規性：Activationの外れ値を抑制するアルゴリズム
- キモ：オプティマイザのパラメータ数を変えて試した。Fig. 1.

# Pruning vs Quantization: Which is Better?

- 概要：枝刈りと量子化でどちらが効率的にパラメータ数を削減できるかを比較した。
- 研究機関：Qualcomm
- 新規性：多くのケースでは量子化の方が良いことを実験で示した。(Fig. 4, Table 1)


# PackQViT: Faster Sub-8-bit Vision Transformers via Full and Packed Quantization on the Mobile

- 概要：ViTの全て8bit以下のQAT
- 新規性：SnapdragonのCPUでDeiT-Tが30ms,SwinTransformerで80ms (INT4)
- キモ：Long tail対策でlog2量子化する。
Softmaxの底を2にしてシフト演算で高速化する。
ArmのCPUのSIMD命令を使ってINT4を高速実行する。


# CAP: Correlation-Aware Pruning for Highly-Accurate Sparse Vision Models

- 概要：ViTやCNNのVisionモデルに対するStructured pruningの改良
- 新規性：枝刈りで、重みと精度の相関を正確に扱える。
- キモ：OBSベース。重みのフィッシャー行列を使ってロスを最小化する。

# おまけ

## Birder: Communication-Efficient 1-bit Adaptive Optimizer for Practical Distributed DNN Training

- 概要：分散学習向け1bitオプティマイザ
- 新規性：SGDやAdamの2〜6倍速い
- キモ：(4)(5)式。SignSGD同様に、ワーカ内で共有する情報を勾配±1に量子化する。
初代Raspberry PiをWi-Fiにつなげてみた

## はじめに
今回はRaspberry Piをネットワークにつなげてみます。Raspberry Pi本体に有線LANのポートはあるものの、有線LANケーブルをつなげるとかさばってしまうので、今回はWi-Fiに接続してみます。

## 事前準備
家電量販店でUSBで接続できる無線LANアダプタをいろいろと探してみたのですが、対応OSにLinuxと表記されているものは見つかりませんでした（家庭でLinuxをデスクトップに使用している人は少ないでしょうから、やむなし）。
動作確認済み機器が比較的他のアダプタより多かった以下の写真のIODATAのWN-G300Uを購入しました。
![berry017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/d17dae80-95b1-b943-cb26-e3c9b1562b9d.jpeg)

## 設定
この無線LANアダプタをUSBハブに接続し、Raspberry Piを起動後に以下のコマンドを LXTerminalに入力します。

`$ sudo lsusb`
```
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 007: ID 04bb:0948 I-O Data Device, Inc. WN-G300U Wireless LAN Adapter
```

Raspberry Piで無線LANアダプタを認識できているようです。
初代Raspberry PiでWi-Fiに接続するためには以下の2つのファイルに設定を追加する必要があります。
* /etc/network/interfaces
* /etc/wpa_supplicant/wpa_supplicant.conf

■/etc/network/interfaces
```
auto wlan0               // 電源起動時にネットワークデバイスとして認識
allow-hotplug wlan0      // 抜き差しを検知
iface wlan0 inet dhcp    // DHCPで接続
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf  //設定ファイルはこちら
iface default inet dhcp
```

■/etc/wpa_supplicant/wpa_supplicant.conf
```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="********"　　　　　　// ESSID
    psk="********"             // 暗号化キー
    proto=WPA2                 // 暗号化プロトコル
    key_mgmt=WPA-PSK           // 暗号化キーの管理方法
    pairwise=CCMP              // ユニキャスト用暗号化方式
    group=CCMP                 // ブロードキャスト／マルチキャスト用の暗号化方式
}
```

## ネットワーク接続確認
上記の設定を記述したのち、Raspberry Piを再起動します。
`$ sudo reboot`
そうするとRaspberry Piの再起動時に以下の通りDHCPサーバからACK応答が返ってきていることが分かります。
![DSC01155.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/2e627208-f110-92fc-e351-01abe5f31871.jpeg)

Raspberry Piを起動後に以下のコマンドを LXTerminalに入力します。
`$ ifconfig`
![DSC01154.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/d6a4169e-794d-7c87-81fe-80b5b9999077.jpeg)
無事にDHCPでIPアドレスが割り振られているようです。

## 終わりに
無線LANアダプタは消費電力が大きすぎるのかraspberry PIは熱暴走してKernel panicになったり、USBハブにつないでもdeviceが見つからなくなったりすることがありました。冷却するように工夫しないといけないかもしれません。