OmniAICreator/Qiita-1.07M huggingface dataset:
Macbookで設定ファイル（.zshrc）をGUIで開く

# はじめに
環境構築で遭遇、そしてつまづく環境変数やPATHの設定。
記憶から消えた頃にやってくるので、CLI時のviの操作が覚えられません。
viの操作を都度調べるのが億劫なので、GUIで編集するため備忘です。

# 手順
ホームディレクトリに移動します。
設定ファイル隠しファイルになっているので、`ls`だけでは確認できません。
`ls -a`で確認できます。

![EX01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902761/b2a8b2ce-9a78-89a2-8359-65a6a5d7843d.png)

あとは、`open .zshrc`で開く。
もちろん`open ~/.zshrc`の絶対パス表記でもOK。
ファイルの内容を編集して、保存します。

忘れがちなのは環境変数の反映です。下記で設定を反映させます。
```
source  ~/.zshrc
```

# おわりに
ポイントは設定ファイルがホームディレクトリの隠しファイルという点。
CLIの方が速いとわかっているものの、使いたいのは設定した先のライブラリなので、覚えるのを後回しにしてしまいます...。
c++をアップデートした際に正しくコンパイルできずセグメンテーションフォルトが起きる

## 問題の詳細



msys2でg++をアップグレードした際にc++のファイルをgit bashでg++コマンドを使いコンパイルし実行したところセグメンテーションフォルトが起きてしまった

デバックコンソールを参照したところlibstdc++-6.dllの読み込みの際にセグメンテーションフォルトが発生している模様

ただし、msys bashなどではg++コマンドで正しくコンパイルできる

以下の対処法を参考に修正するも解決せず

https://stackoverflow.com/questions/76495365/simple-hello-world-program-giving-segmentation-fault-in-vs-code
## 解決方法
git bash で
```
git update-git-for-windows
```

を実行しgitをアップグレードすることで解決

おそらく最新のgccをインストールしたのでバージョンの互換性あたりで問題が発生していたのかもしれない
GoogleCloud + WordPressで重いし表示がおかしいし詰みかけた話

次に同様のことがあったときのために覚え書きとして記録しておきます。
## 何がしたかったか
GoogleCloudの無料枠内でWordPressをデプロイしてサイト構築したかった。ドメインの設定は済んでいた。
## 何をしたか
GoogleCloudのマーケットプレイス 
 →WordPress（Google Click to Deploy）を選択してデプロイ。VMは無料枠内のものを選択した。
## 何が起こったか
* https://[サイトドメイン]/にアクセスしても表示に時間がかかり、やっと表示されてもcssが反映されない
* ログイン画面（https://[サイトドメイン]/wp-login.php）にアクセスしても同様。時間がかかりすぎて接続がタイムアウトしてしまうのでブラウザから管理画面にログイン出来ない。
##  解決方法
SSHでVMに接続してwp-cliを導入。
wp option listで設定を確認したところ、ブラウザでの管理画面の設定→一般「WordPress アドレス (URL)」「サイトアドレス (URL)」にあたる項目がhttp://[外部IPアドレス]のままだった。
~~~
wp option update siteurl 'https://[サイトドメイン]'
wp option update home 'https://[サイトドメイン]'
~~~
を使うことでブラウザから管理画面にアクセスできなくてもhttp→httpsに変更することができ、表示の不具合が解決した。
Web業界2年目で得た気づきと学び

# はじめに
2023/07から9ヶ月間プロジェクトに参画して得た学びや気づきを形にしたいと思いました。

# 経験したこと一覧
- アジャイル開発（スクラム）
- React
- Express
- Typescript
- Jest & RTL
- Playwright
- BrowserStack
- AWS

# 良かったこと・悪かったこと

Good

- 経験したことない仕事のスピード感を経験することができた
- 技術面で知識を得ることができた

Bad

- もっと事前にコードを読んで全体を把握すべきだった
- タスク着手前に不安要素を解消するまで質問するべきだった
- 自分以外のタスクの最新情報を知ろうとするべきだった

# 能力編
## できる人を見て得た気づき
- できる人はレスポンスが早い
    - 連絡をすると大抵5分以内に返信がくる。しかも的確。わかりやすい
    - 周知事項に対してもスタンプでリアクションをしている
- どんな仕事内容でも取りに行く
    - できます！やります！で自信を持って手を上げている
    - 詰まった時には、他のメンバーに協力を仰いでいる
- 多くのメンバーが自分ごととして話を聞いている
    - 会議中でも他人事としていない
- タスクに優先順位をつけて仕事をしている
- わからないことはその場で聞く（聞きづらい時でもその日中に解決）
- 受動的ではなく能動的
    - プロジェクト全体が見えているため、自分のタスクが終わっても次にやることを見つけて行動できている
- 問題解決能力が高い
    - １人で力が及ばない時は周りを巻き込んで問題解決に繋げている


## 学びと成長
- 作業に入る前に、わからないことがある時はその場で解消してから作業に着手できるようになった
- 説明を聞いて１度で理解できる量が増えた。説明された内容のイメージができるようになった
- 質問の仕方が少しうまくなった
    - 必要であればテンプレートを使用して質問できるようになった
[参考サイト](https://manabiya-sakura.com/information_technology/id=2263/)
    - 相手の状況を判断して、即座に対応しても欲しいか後回しで良いか含めた質問ができるようになりました
- 自分の作業に優先順位をつける意識ができるようになった
- 自分の以外の作業状況の最新情報を知る意識ができるようになった
- わからないことは他メンバーに相談するスピードが上がった
- 自分で考えるべきことか、他メンバーに相談する判断がつくようになった
- 自分の認識が不安な時は、他メンバーに聞くことを面倒くさがらなくなった


# 技術編
## できる人を見て得た気づき
- 「なぜ」を追求している
    - エラーが起きた際、原因追及を最下層まで追求している
- 情報源は、公式サイトかGitHubのIssue


## 学びと成長
- React・Typescriptの知識が高まった
- BFF(backend for frontend)の概念を知ることができた
- テストコードを書く意識がついた
    - テストを意識できるようになったことで、開発前に正常パターンだけではなく、準正常・異常パターンの意識ができるようになった
- BrowserStackの使い方を知ることができた

# まとめ
１年目は技術の向上ばかり考えていたのですが、２年目では1年目であまり意識しなかった能力面での力不足を痛感した期間でした。力不足ゆえ苦しいことも多々ありましたが、振り返り、言語化することで改めて大事な経験になったと実感することができました。

私はまだまだ「できる人」には程遠いと感じてはいますが、焦らず少しずつステップアップしたいと思います。

最後まで読んでくださりありがとうございました。
ViTのFFNに畳み込みを導入したモデル【LocalViT】


**原論文**
LocalViT: Bringing Locality to Vision Transformers
https://arxiv.org/pdf/2104.05707.pdf




# 結論
ViTのFFNに畳み込みを導入した．ViTが畳み込みの局所性も獲得して精度向上


# 概要
画像認識で局所性を持つモデルを作りたい．局所性は，画像の線，エッジ，形状のような物体の構造に関係する特徴を獲得して，画像には不可欠である．けど，最近のトレンドは，グローバル認識をするViTであり，ViTは局所的な認識が苦手．なので，局所性に優れたViTを提案する．そのために，ViTのFFNにDWConvを導入することで局所性を向上させる．

CNNは，局所性に優れているが，受容野を広げるためには層を深くする必要がある．受容野が制限されているCNNと浅い層からグローバル認識のViTを組み合わせて，互いの弱点を補うかのように認識させる．




# モデル構造



(a)は通常のFFN．(b)は提案する手法で，3次元で動作する．この1x1convは各ピクセルごとのチャンネル方向認識が可能で，各ピクセルの情報を集約する（トークン間の近接性が回復）．しかし，1x1Convだけでは，局所性を獲得しきれない．そこで，1x1convの間にDW3x3Convを導入する．

![スクリーンショット 2024-03-09 13.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/eafae633-623a-357e-a523-ea2309899a6d.png)


(c)で，Seq（2次元），Img（3次元）を示し，変換してる．1x1convに挟まれて，3x3DWConvがある．

![スクリーンショット 2024-03-09 13.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/178635eb-72db-f015-4573-06c43d84f0ea.png)


## クラストークンの行方
FFNの前に，クラストークンを切り離して，FFNに入力せず，FFNの計算後，特徴量にクラストークンを連結させる．


# 実験
1x1Convだけでも少し精度向上する．DWConvを入れるとさらに精度向上．

FFNで使用される活性化関数をReLU6からh-swishにすると精度向上

FFNにSENetを追加する精度向上

ViTの深い層にだけ畳み込みを導入した場合に精度低下，浅い層の畳み込みが有効．

FFNの拡張率は，でかい方がいい．



# まとめ
今回は，ViTのFFNに畳み込みを導入したモデル【LocalViT】について解説した．ViT+CNNは互いの弱点を補て良い結果になる．
2d-poolを使用したSENet【GSoPNet】





**原論文**
Global Second-order Pooling Convolutional Networks
https://openaccess.thecvf.com/content_CVPR_2019/papers/Gao_Global_Second-Order_Pooling_Convolutional_Networks_CVPR_2019_paper.pdf




# 結論
2d-poolを使用したSENetで，グローバル空間を考慮してチャンネル，空間の重要度付けが可能になる．


# 概要
画像認識モデルにCNNがあり，CNNに動的なパラメータを導入したSENetがある．SENetにより，特徴量の各チャンネルに対して，どのチャンネルが重要かを決めることができる．しかし，SENetは空間情報をGAPで1つの値に圧縮するため，空間にある重要な情報を取りこぼしてる可能性がある．そこで，GAPではなく2d-poolingとグループ畳み込みを使用して圧縮して，より空間情報を考慮した構造を提案する．


# モデル構造
モデル構造を下図に示す．主にResNetと同じ構造だが，各ステージの最後にGSoP Blockがある．そこで，チャンネルの重要度付けを行う．

![スクリーンショット 2024-03-09 12.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/febda2c0-37f7-2a87-ee77-42fac88aa644.png)



## チャンネルのGSoP Block
GSoP Blockを下図に示す．
まず，計算量削減のために1x1convでチャンネル数を小さくする（$h' \times w' \times c$）．
その後，（$X = h'w' \times c$）にreshape．以下の2d-poolingの式に導入して，$h'w'$が相殺されて，（$c \times c$）の特徴量を得る．


![スクリーンショット 2024-03-09 12.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/fdd29b25-93b1-8439-0294-8f3f3517e41f.png)

（$c \times c$）→（$1 \times c \times c$）にreshapeする．$1 \times c$のフィルタを使用して畳み込み（出力チャンネル4倍）を行う（$1 \times 1 \times 4c$）．

![スクリーンショット 2024-03-09 12.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/7c3dcc9b-f038-caea-c389-213a7db561df.png)

1x1convで（$1 \times 1 \times c'$）に戻して，シグモイド関数で値を(0~1)に制限する．これを使用して入力特徴量に要素積，重要度付けを行う．


![スクリーンショット 2024-03-09 12.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/3e24e1b4-a68f-bc89-f7ea-4e1e35903485.png)



## 空間のGSoP Block
最初にチャンネルを小さくするのではく，計算量削減のために，空間サイズを小さくする．
2d-poolingの式で，$c$を相殺して，（$h'w' \times h'w'$）の特徴量を得る．あとは，Cと$h'w'$が入れ替わるだけ．


→（$1 \times h'w' \times h'w'$）にreshap．$1 \times h'w'$のフィルタを使用して畳み込み（出力チャンネル4倍）を行う（$1 \times 1 \times 4h'w'$）．1x1convで（$1 \times 1 \times h'w'$）．reshapeで（$h' \times w' \times 1$）の特徴量を獲得する．シグモイド関数を通して，入力特徴に要素積で，空間の重要度付け．



## 2d-poolの利点
以下は畳み込みだけを使用した場合の計算領域である．黄色と青は違いに情報共有することはない（特に浅い層）．2d-poolは，空間情報を全て考慮して計算しているため，浅い層の段階でもよりグローバルな認識が可能になる．

![スクリーンショット 2024-03-09 12.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/70d722f5-a19d-730c-2dbb-c8bace35f76a.png)



# 実験

チャンネルのGSoPと，空間のGSoP，チャンネル+空間をした場合の精度．組み合わせてもいいけど，チャンネルGSoPだけでも十分．

![スクリーンショット 2024-03-09 13.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/63810245-9d81-87e9-9c73-37ed5ac1165b.png)


どの場所にGSoP blockを入れたらいいか検証して，各ステージ全てに入れた方がいい．

![スクリーンショット 2024-03-09 13.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/7fb139dd-fa3d-7df1-9d81-11ecc10ed5a3.png)




# まとめ
今回は，2d-poolを使用したSENet【GSoPNet】について解説した．CNNに動的なパラメータを採用するSENetの派生系で，より空間情報をうまく取り入れて計算する．さらに空間の重要度付けの方法も紹介されてた．結局，チャンネルの重要度付けが効果的である．
UE5 崩壊スターレイルの模擬宇宙に突入する演出を実装してみた(一部)。

# 概要
今回は崩壊スターレイルの模擬宇宙に突入する際、画面全体がぐわーんとなる演出を実装していきます。
＊最後のUI演出は実装しません。
![star.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/9017f9b8-b377-e022-4cb6-e862b250aa58.gif)

# 実装

### 「Set Field Of View」をアニメーション
まずはキャラクターを中心にしたカメラが後ろに引くような演出を実装してきます。
「Set Field Of View」をアニメーションさせてカメラの画角を変更して再現します。

「BP_ThirdPersonCharacter」BPに以下のノードを実装しましょう。
![SetFieldOFView.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/77c4e3db-b755-17d1-7bd1-ea438c2dd25f.jpeg)
7キーを設定しているのはテキトーです、お好きなイベントを設定してください。

タイムラインの設定は以下のように設定します。
![SetFieldOFViewAinmation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/1ac651ea-4746-1c55-3e57-6b8392ec0685.jpeg)

開始点は時間「0.0」値「90」です。
![SetFieldOFViewAinmationStart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/fe0aec81-3420-0736-7c7f-8339b2ce001b.jpeg)

終点は時間「1.0」値「150」です。
![SetFieldOFViewAinmationEnd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/728f282d-4c3b-f4df-57ac-3d795c881398.jpeg)

以下のような見た目になります。
![Zoom.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/23d6a040-446f-8a5e-8a8e-c2cf755525fd.gif)

### 逆魚眼レンズ
キャラクターを中心にしたカメラが後ろに引くような演出は実装できましたが、画面端が歪んだような演出が再現できていません。
再現するために逆魚眼レンズを実装していきましょう。

まずはポストプロセスマテリアルから実装しています。
ノードは以下のように作成します(Falloffは２に設定)。
![InvertFishEye.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/663a952e-5ff8-42d7-1f60-82c53c575903.jpeg)

次は「MPC_InvertFishEye」の「Intensity」をアニメーションしましょう。
前に作成したタイムラインに新しいトラックを作成します。
![IntensityAinmation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/018abcbf-b00d-c8e0-3ded-7b32deacdf3c.jpeg)

開始点は時間「0.0」値「0.0」です。
![IntensityAinmationStart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/77c7190b-7bcd-4f0b-d2b4-89e57d8588bd.jpeg)

終点は時間「1.0」値「1.0」です。
![IntensityAinmationEnd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/09ccc6fd-ccf9-0c8e-e7b8-edccaf8c8731.jpeg)

BPには以下のように設定してください。
![FinalBP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/f746d62f-643f-236c-8a60-11c072ccab41.jpeg)

# 結果
![ZoomAndInvertFishEye.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156053/f31c52c9-ac0c-b90a-9ca7-dc2f75c72bcc.gif)

# まとめ
おそらく再現できたと思います。

# 参照
https://zenn.dev/daichi_gamedev/books/unreal-engine-tutorial-2/viewer/blueprint2-timeline

https://www.youtube.com/watch?v=bz0ipJJlxxA
Vishwa CTF 2024 Writeup

今回は全く時間が取れず、1問のみ・・・

# Trip To Us (Web)

頑張ってフラグを見つけなさいとのこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/cb591916-43c7-0e89-76a7-c93fb4d0d348.png)
とりあえずClick Hereを押してみるとエラーページに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/30b1e251-fa84-c711-8c61-8bef5fb821e0.png)
ソースを見てみると、画像のalt属性に、ユーザエージェントをIITIANに変えろと書いてある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/b6776edc-6f40-7b5c-cf22-8772f7edc493.png)
というわけで、devtoolの「︙」アイコン → その他のツール → ネットワーク状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/a90c044a-29d8-f94f-4ab4-e69fbd3925be.png)
ここからユーザエージェントを変更することが出来る。
ブラウザのデフォルトを使用のチェックを外して、IITIANを入力してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/de76823b-44f7-6bbf-c3fe-1b72122a130f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/772434c8-598a-02f6-3955-6a26d34182d9.png)
この状態で再読み込みすると、ログインページに遷移した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/e03f5757-a780-9dd4-a9f8-4fbc5eabb007.png)
例によってソースを見ると、USE username as: adminとあった。しかしパスワードが分からない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/7bd6471c-ecbd-2f0a-a6f9-8939e352f40a.png)
これ以上ヒントが無いので、SQLインジェクションを試す。
パスワードに `' or '1' ='1` を入力してみるとフラグを得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/c61ab56a-2817-7356-556e-947ef86e1250.png)
大量のCSVデータをバルクインサート文に変換する

# 概要

大量のCSVデータをバルクインサート文に変換する方法を説明します。
この記事ではawkコマンドを使います。

# サンプルデータ

```text:sample.csv
1, "大阪府", 1000
2, "兵庫県", 800
3, "京都府", 700
4, "奈良県", 600
5, "和歌山県", 500
6, "滋賀県", 400
7, "三重県",300
```

サンプルデータをこんな形にしたい

```sql:insert.sql
INSERT INTO SAMPLE_TABLE VALUES
(1, "大阪府", 1000),
(2, "兵庫県", 800),
(3, "京都府", 700);
INSERT INTO SAMPLE_TABLE VALUES
(4, "奈良県", 600),
(5, "和歌山県", 500),
(6, "滋賀県", 400);
INSERT INTO SAMPLE_TABLE VALUES
(7, "三重県",300);
```

# バルクインサート文の説明

- この例では一度にインサートする行を３行とする。（実用の場合だと数千〜数万行とかになります）
- ３行ごとに「INSERT INTO SAMPLER_TALBE VALUES」を入れる
- CSVの各行を丸カッコで囲む
- CSVの行末はカンマですが、３行に達した場合はセミコロンにする
- 最後のCSV行はセミコロンで終える


# awkコマンドのサンプル
```awk
awk -v count=3 -v line_count="$(wc -l < sample.csv)" '
{
    # 1/3行毎に入れる
    if (NR % count == 1) {
        print "INSERT INTO SAMPLE_TABLE VALUES";
    }

    # 通常のカンマで終わる行、3/３行目と最終行は除く
    if (NR % count != 0 && NR != line_count) {
        print "(" $0 "),";
    }

    # 3/3行毎にセミコロンにする、最終行は除く
    if (NR % count == 0 && NR != line_count) {
        print "(" $0 ");";
    }

}
END {
    # 最終行は必ずセミコロン
    print "(" $0 ");";
}
' sample.csv
```
必要に応じてファイル出力をリダイレクトすればOK

# 変数説明

コマンドライン引数 -vで、一度にインサートする行をcountに設定します。
同様にsample.csvの総行数をline_countに設定します。
現在の行数がNRに入ります。
処理中のsample.csvの1行が$0に入ります。

# 最後に
awkコマンドはlinuxやMacに標準インストールされていることと、大量のデータでも高速に処理してくれる点が有難いです。
JavaScriptで動的に生成したタグの取得法

## 結論

```tsx
const data = document.getElementsByClassName('content')[0];
```

`getElementsByClassName`メソッドを利用して取得する。最後に0番目を指定しているのは、帰ってくる形がHTMLCollectionで取得できるから。この時に、0番目を指定すれば、要素を取得することができる。また、複数取得した時に`HTMLCollection`の形で帰ってきた場合は、配列に変換すればいいかと思います(もちろん場合による)。

```tsx
const data = Array.from(document.getElementsByClassName('content'));
```

## ダメなパターン

動的に生成した要素は`querySelector`では取得することはできない。NodeListには静的の概念が存在する。

## 参考記事

[querySelectorAll() は動的に生成・削除された要素をキャッチしない - Qiita](https://qiita.com/n_haruka/items/cfe7b285955f98fb9af6)
【Unity】指向性スピーカーの実装例

AudioSource の向きで音量や聞こえる距離が変わるコンポーネントを作りました。
AudioSource が AudioListener に向くほど、大きく遠くまで聞こえるようになります。
声やスピーカーにご利用ください。

``` DirectionalAudioSource.cs
using UnityEngine;

public class DirectionalAudioSource : MonoBehaviour
{
    [SerializeField] private AudioSource audioSource;
    [SerializeField] private Transform audioSourceTransform;
    [SerializeField] private Transform listenerTransform;
    [SerializeField] private AnimationCurve curve = new AnimationCurve(new Keyframe[2] { new Keyframe(0f, 0f), new Keyframe(1f, 1f) });
    [SerializeField, Range(0f, 1f)] private float minVolume = 0.25f;
    [SerializeField, Range(0f, 1f)] private float maxVolume = 1f;

    private float maxDistance;


    private void Start()
    {
        maxDistance = audioSource.maxDistance;
    }
    void Update()
    {
        if (listenerTransform == null && FindAudioListener()) return;
        UpdateVolume();
    }

    public void UpdateVolume()
    {
        var volume = Mathf.LerpUnclamped(minVolume, maxVolume, curve.Evaluate(GetVolume()));
        audioSource.maxDistance = volume * maxDistance;
        audioSource.volume = volume;
    }
    private float GetVolume() => Vector3.Dot(audioSourceTransform.forward, (listenerTransform.position - audioSourceTransform.position).normalized) * 0.5f + 0.5f;
    
    public void SetAudioListener(AudioListener audioListener) => listenerTransform = audioListener.transform;
    public bool FindAudioListener()
    {
        var listener = FindObjectOfType<AudioListener>();
        if (listener == null) return false;
        listenerTransform = listener.transform;
        return true;
    }
    
#if UNITY_EDITOR
    private void OnValidate()
    {
        if (audioSource == null)
        {
            audioSource = GetComponent<AudioSource>();
            if (audioSource != null) audioSourceTransform = audioSource.transform;
        }
    }
#endif
}
```
MTUを調べる

# MTUを調べてみた
MTU(Maximum Transmission Unit)、いわゆる、ネットワークにて一度に遅れるパケットサイズ（ここではIPパケット）の調査したときのメモ。

## 何を調べる？
デフォルトは1500バイトである。OSごとに設定できる下限、設定したときにパケットが分割されるか、、を調べることにした。

## 結果
### Windows
netshコマンドでMTUサイズを変更できる。
```
C:\WINDOWS\system32>netsh interface ipv4 set interface 6 mtu=575
パラメーターが間違っています。

C:\WINDOWS\system32>netsh interface ipv4 set interface 6 mtu=576
OK

C:\WINDOWS\system32>netsh interface ipv4 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------

  6          35         576  connected     イーサネット
```
最低値は576バイトのようだ。次に、MTUを1280バイト（後述）に設定する。
```
C:\WINDOWS\system32>netsh interface ipv4 set interface 6 mtu=1280
OK

C:\WINDOWS\system32>netsh interface ipv4 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------

  6          35        1280  connected     イーサネット
```
この状態で、1300バイト指定のpingを実行する。
```
C:\WINDOWS\system32>ping -l 1300 192.168.10.1

192.168.10.1 に ping を送信しています 1300 バイトのデータ:
192.168.10.1 からの応答: バイト数 =1300 時間 =25ms TTL=63
...
```
このときのWiresharkで取得したネットワークキャプチャデータは下記となる。
![pingWin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f3f4cc8e-912e-1a55-db22-ba2c44e1e01a.png)
分割されている。Ethernetヘッダを含めたサイズが1290バイト、IPパケットは1276バイト(1290-14)となっている。MTU=1280と指定したはずだが、４バイト差がある。

### Mac
![MTUatMac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/2e9bd312-8b2b-77b3-91d6-338654d3275e.png)
MacでのMTU指定は簡単である。最小が1280。なので、さきほどのWindowsの検証でも、MTU値として1280を用いた。
```
$ /sbin/ifconfig en107
en107: flags=863<UP,BROADCAST,SMART,RUNNING,SIMPLEX> mtu 1280
...
```
ifconfigでも、MTU=1280となっている。1300バイトのpingを実施。
```
$ /sbin/ping -c 4 -s 1300 192.168.10.1
PING 192.168.10.1 (192.168.10.1): 1300 data bytes
1308 bytes from 192.168.10.1: icmp_seq=0 ttl=63 time=340.437 ms
...
```
Wiresharkで取得したネットワークキャプチャデータは下記となる。
![pingMac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5ff17b34-2e0d-2fd0-d38e-43a63766d302.png)
ここでも、Ethernetヘッダを含めたサイズが1290バイト、IPパケットは1276バイト(1290-14)となっており、４バイトの差がある。また、ICMPのデータサイズが、1292バイトとなっているところがよくわからず、、、。

### Linux(lubuntu)
まずバージョン情報。
```
$ cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
```
```
$ sudo ip link set dev enx00011b0c2a33 mtu 1
$ ip link show dev enx00011b0c2a33
2: enx00011b0c2a33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1
...
```
というわけで、MTUの最小値として、”1”が設定できる様子。次に、MTU=1280とする。
```
$ sudo ip link set dev enx00011b0c2a33 mtu 1280
$ ip link show dev enx00011b0c2a33
2: enx00011b0c2a33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1280 
...
```
1300バイトのpingを実施。
```
$ ping 192.168.10.1 -s 1300 -c 4
PING 192.168.10.1 (192.168.10.1) 1300(1328) バイトのデータ
1308 バイト応答 送信元 192.168.10.1: icmp_seq=1 ttl=63 時間=14.4ミリ秒
```
”1300(1328)”と見える。”()”の表記は不明。Wiresharkで取得したネットワークキャプチャデータは下記となる。
![pingLinux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/129ac950-cac7-7e4c-cdb6-cd358aae55e8.png)
ここでも、Ethernetヘッダを含めたサイズが1290バイト、IPパケットは1276バイト(1290-14)となっており、４バイトの差がある。また、ICMPのデータサイズが、1292バイトとなっているところが、Macと同じ。MacもUnix系だからか、、？

## 終わりに
いずれにせよ、MTUサイズにより、クライアントOSでもパケットが分割されることを確認。微妙な差については、未調査。
配列にディクショナリを設定できた(VBScript)

複数のディクショナリが欲しいときに便利なので検証内容を残す


# 配列にディクショナリを生成する
```vb:dicsArray.vbs
Dim dicsArray(2)

set dicsArray(0) = CreateObject("Scripting.Dictionary")
set dicsArray(1) = CreateObject("Scripting.Dictionary")
set dicsArray(2) = CreateObject("Scripting.Dictionary")

dicArrays(0).add "dog","ポチ"
dicArrays(1).add "cat","レオ"
dicArrays(3).add "rabbit","キナコ"
```

これを応用すると関数で複数のディクショナリを返すことができる
```vb:dicsArrayFunc.vbs
Public Function getDictionaries(num, infoArray)
    Dim dicArrays()
    Dim cnt, i

    '指定数の配列要素を生成する
    ReDim dicArrays(num)

    '指定数のディクショナリを生成する
    for cnt = 0 to num
        set dicArrays(cnt) = CreateObject("Scripting.Dictionary")
    Next

    'ディクショナリにキーを追加する
    For i = 0 to ubound(infoArray)
        For cnt = 0 to num
            dicArrays(cnt).add infoArray(i,0),infoArray(i,1)
        Next
    Next

    '配列なのでSetは付けない
    getDictionaries = dicArrays

End Function

Dim dicArrays
Dim dic1,dic2,dic3,dic4
Dim cnt
Dim infoArray(2,1)

'ディクショナリに展開する情報を生成する
infoArray(0,0) = "dog"
infoArray(0,1) = "ポチ"
infoArray(1,0) = "cat"
infoArray(1,1) = "レオ"
infoArray(2,0) = "rabbit"
infoArray(2,1) = "キナコ"

dicArrays = getDictionaries(3,infoArray)

'実際に使うときは普通のオブジェクト変数の方が使いやすいかも
Set dic1 = dicArrays(0)
Set dic2 = dicArrays(1)
Set dic3 = dicArrays(2)
Set dic4 = dicArrays(3)

'検証用
For cnt = 0 to 3
    msgbox Join(dicArrays(cnt).keys,vbCrLf) & vbCrLf &Join(dicArrays(cnt).items,vbCrLf)
Next
```

VBSだと処理に時間がかかるので何度も同じ関数を呼び出すより時短になると思う
自宅インフラにいろんなものを導入してどうだったか(その2)

> 前回の記事の続きになります。
https://qiita.com/wancom/items/19dc87d7b478c567455a
タイミング的にそろそろかなということでどうぞお楽しみ(?)ください！
~~（投稿するの忘れてたなんて言えない…）~~

ここ2年ぐらいでかなり自宅インフラを充実させてきましたが、色々と良かったこと、微妙だったことなどが見えてきました。
今回はその辺りを思いつくままに挙げてみようかなと思います。
インフラ周りはそこまで強いわけではなく、自己流なのでお手柔らかにお願いします:bow:

## 11. 良かったこと：ラズパイも併用する
通常のサーバーは仮想基盤に載せていますが、インフラ周りのサーバーは仮想基盤に載せるわけにいきません。オンプレのルーターや、監視系はラズパイを使用することで、仮想基盤に何かあっても独立して稼働できるようにしてあります。
現状はDNSサーバーやNetboxなどは仮想基盤に載っていますが、メンテナンスで全停止した時にちょっと困ったのでこれも早めに外に出したいと思います。

## 12. 微妙だったこと：ラズパイをファイルサーバーにする
NASを導入する前の名残ですが、ラズパイ4でファイルサーバーを構築しました。HDDというのもあるのだと思いますが、IOのスループットがあまり出ず、大量のデータ転送が遅いという問題がありました。
今でも夜間にサーバーのバックアップをしていますが、かなり時間がかかっています。
一方で最近ラズパイ5を手に入れたので改善されないかちょっと期待しています。
（ちなみにUbuntu22.04が対応していないかったので、24.04待っています。）

## 13. 良かったこと：IX2207を導入した
勉強も兼ねてルーターのIX2207を中古で購入しました。
思ったよりも使い勝手が良く、元々BGPでルーティングを組んでいた自宅ネットワークにスムーズに追加できたり、知り合いとトンネルを張って通信させたり、VLANが話せるので直接スイッチに刺して色々したりと予想以上に楽しむことができました。
まだ何かできそうでワクワクしています。

## 14. 良かったこと：BGPでルーティングを構成した
元々、実験用に色々なネットワークを構築することは予想できていたため、勉強や実験も兼ねてBGPでルーティングを構成し、柔軟にネットワークを増減できるようにしました。
思った以上にネットワークが増えていったので、結果的に良かったと思っています。

## 15. 微妙だったこと：ネットワークを増やしすぎた
ネットワークが増えることでルーターなどを用意する必要があり、また、それに付随するリソースの管理なども必要になるため、手間がかかります。
構成を見直して、ちょっとネットワークを減らそうかと考えています。

## 16. 微妙だったこと：OSPFを使用しなかった
当時は、OSPFはおろか、BGPも詳しくなかった（勉強のために使ったぐらいなので…）ため、とりあえず簡単なBGPで構築してみるか、と言って始めました。
最近、他の人とトンネルを張り、BGPで経路交換するようになったため、自宅のネットワークとの両立が難しくなってきています。
外部との通信はBGPで、自宅のネットワーク内はOSPFで、ということで今後OSPFへ移行できたらと考えています。

## 17. 良かったこと：インターネット回線を2本引く
色々あり、インターネットを2回線引くことになりました。
結果的に、
- 一方の回線が落ちてももう一方の回線で続けられる
- 回線近くでメンテナンスが行える

ということで良かったと考えています。（一方でコストもなかなかですが…）

## 18. 良かったこと：OpenVPNでトンネルを張る
外からのリクエストはVPSで受け取り、OpenVPNのトンネル経由で自宅ネットワークまで引き込む構成にしています。
これは、グローバルIPアドレスが不安定であること、IPoEの関係でポート開放に制限があることからこのような構成にしています。グローバルIPアドレスを隠せるという点もメリットですね。
元々外から自宅ネットワークに入れるようにする目的でOpenVPNサーバーを構築していましたが、使っている中でIPアドレスが突然変わっても接続を維持できることが判明しました。これにより別回線に切り替えてIPアドレスが変わっても通信断を発生させずにサービスを提供することができます。
また、若干ですが、パケットの圧縮も効くらしく、細い回線でも大容量の通信が行えるようです。
OpenVPNは予想外の副産物が多かったです。

## 19. 良かったこと：LANケーブルを自作する
今まで使っていたケーブルが不調になるケースがあり、また機材も増えてきた結果、LANケーブルが足りなくなってきました。
そこで、以前知り合いからもらったLANケーブルを使って一通りケーブルを自作しました。ぴったりの長さで作ることができるので綺麗にまとまり、見栄えが良くなりました。
個人的にはだいぶ満足ということで良かったことにしています。

## 20. 良かったこと：3ピンでロック付きのしっかりした電源タップを買う
元々普通の電源タップを使っていたのですが、根本にスイッチがあるという、サーバー用としては致命的なものでした。
そこで抜け防止機構付きのアース付きの電源タップを購入しました。電源が切れないという安心感と、綺麗に横並びで刺さっているという見た目もいいポイントです。

# あとがき
前回の記事に詰め込むのは難しいと判断し、はみ出したものを第二弾ということで公開してみました。
前回同様、本当にただ書き出したに近いのでお見苦しいところもあったかもしれません。
今回も誰かの参考になったらいいなと思っています。
誤字、間違い等ございましたらご指摘いただけますと幸いです。
typed-query-selector について調べてみる


# 1. 背景
querySelector(),querySelectorAll()で型が```Element```,```NodeListOf<Element>```になって毎回型チェックをするのが手間だなと感じていました。

```ts
const a = document.querySelectorAll('div#app');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/9b28505b-d3df-51c4-bcc8-0b581a0c63d6.png)


以下の記事でtyped-query-selectorというライブラリを知りました。

https://yurika1202.com/post/coding/queryselector-type/#typed-queryselector

# 2. typed-query-selector

https://github.com/g-plane/typed-query-selector

querySelector,querySelectorAllの型推論を向上させたライブラリです。

https://github.com/g-plane/typed-query-selector/blob/main/parser.d.ts

上の型定義ファイルを見るとreadmeに記載されていた
>querySelectorとquerySelectorAll関数は、TypeScript 4.1のテンプレート・リテラル型を活用することで、より良い型付けができるようになった

が理解できると思います。

## 2.1.install
```terminal
npm i -D typed-query-selector
```

ビルドツールやトランスパイラを使用されてる場合はこれだけで設定完了です。

## 2.2.使ってみる

### querySelector
```ts
import 'typed-query-selector';

const a = document.querySelector('div#app');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/cbbaa975-5901-b9be-bb7e-284f128f5422.png)

### querySelectorAll

```ts
import 'typed-query-selector';

const a = document.querySelectorAll('div#app');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/bca0d483-f33f-4066-1c6b-18550e79d2c4.png)

## 2.3. 対応しているユースケース

### class属性, id属性, 疑似class, その他属性
```ts
import 'typed-query-selector'

document.querySelector('div.container') // ==> HTMLDivElement

document.querySelector('div#app') // ==> HTMLDivElement

document.querySelector('input[name=username]') // ==> HTMLInputElement

document.querySelector('input:first-child') // ==> HTMLInputElement```
```

### 組み合わせ
```
import 'typed-query-selector'

document.querySelector('body div') // ==> HTMLDivElement

document.querySelector('body > form') // ==> HTMLFormElement

document.querySelector('h1 + p') // ==> HTMLParagraphElement

document.querySelector('h2 ~ p') // ==> HTMLParagraphElement
```

## 2.4. Strictモード

Strictモードではセレクタ・パーサは入力文字列に対して追加の構文チェックを行います。
構文エラーがあった場合、戻り値の型はElementではなくneverになります。

```ts
import 'typed-query-selector/strict'

const element = document.querySelector('div[test') 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/77da9441-e7ff-ac62-98e2-8ada61bf9604.png)

:::note
全ての子構文エラーを検出できるとは限らないとのことです。
パーサーが非常に複雑になり、コンパイルのパフォーマンスが低下する可能性がある為だそうです。
:::

## 2.5. parser単体でも使える
```ts
import type {
  ParseSelector,
  StrictlyParseSelector, // or use the strict parser
} from 'typed-query-selector/parser'

type MyElement = ParseSelector<'form#login'> //HTMLFormElement 
```

# 最後に
querySelector,querySelectorAllを使用するなら入れて損はないと思いました！
strictモードの構文チェックも良いなと思いました

# 参考
- [【TypeScript】 HTMLElementに関する型推論](https://tech.012grp.co.jp/entry/2021/01/19/145339)
- [querySelectorで取得したDOM要素に型を定義する](https://yurika1202.com/post/coding/queryselector-type/#typed-queryselector)
畳み込みがあれば，ViTの位置埋め込みいらない【PEG】


**原論文**
CONDITIONAL POSITIONAL ENCODINGS FOR VISION TRANSFORMERS
https://arxiv.org/pdf/2102.10882.pdf



# 結論
畳み込みがあれば，ViTの位置埋め込みいらない．


# 概要
画像認識モデルにViTがある．ViTは画像情報全てを並列で処理する構造であり，画像の位置情報を考慮しない構造になっている．これを解決するために位置埋め込みをする．ViTで採用される位置埋め込みの方法は，絶対位置埋め込みは，異なる周波数の正弦波関数で表現される．この位置埋め込みは効果的だが，テスト時に画像サイズが異なると，異なるサイズの位置埋め込みを使用しながら評価される．それを解決するためにSwinは，相対位置埋め込みを提案するが，余計な計算コストがかかり，絶対位置と比較して，精度低下する可能性がある．

また，全てのパッチに同じ位置埋め込みを追加するため，画像の位置ずれに弱くなる（位置埋め込みが，ここの位置重要だよって照準を固定してる．位置がずれたら重要だよってところの照準がずれる）．
そこで，畳み込みを入れて，位置埋め込みの問題点を全て解決する．



※畳み込みはフィルタの移動で位置ずれに強い構造を持ってる．





# モデル構造
モデル構造を下図に示す．(a)で示すViTと(b)の提案手法の変更点は，位置埋め込み（PE）の位置が違う．CPVTは1つのエンコーダーを通してから，位置埋め込みをする．さらなる改善として，(c)はクラストークンを削除している．
PEGを使用する際に最後のMLPを各ヘッドのGAPにする方が精度良い．


![スクリーンショット 2024-03-09 11.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/665d2ad4-1c8a-4abc-41ba-a30e391d71dd.png)





## 条件付き位置埋め込み
位置埋め込みの成功条件が3つある．
- 入力画像にあった位置埋め込みで位置ずれに強い
- テスト時に画像サイズが変化しても問題ない
- ある程度の絶対位置を提供する能力を持つ

これは，局所的な関係を特徴付けることで全て解決する．


## 位置エンコーディング生成器（PEG）
PEGを下図に示す．2次元特徴量を3次元に治して，$3 \times 3$の畳み込みで局所認識．その後，2次元に戻す．**これだけ**．畳み込みは位置のずれに強い構造であり，実験的に畳み込みの構造によって位置情報が保たれる．


![スクリーンショット 2024-03-09 11.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/750f74ed-9753-8e7a-83ed-a69820a0f680.png)




# 実験
## 畳み込みは位置情報を保つのか
noneは位置埋め込みなし．2段目に重みをランダムで固定した畳み込み（PEG）を使用した場合，精度向上した．これは，畳み込みの導入によって精度向上していない（畳み込みの学習してないから）．畳み込み構造を導入することで，位置が保存されて精度向上する．

また，1（12x）は，学習可能な1x1Convを2層した場合で実験した場合，精度は上がらない．これは，空間的な認識をしていないから．学習可能な3x3Convを使用した場合が位置も保存できるし，局所的な認識ができるので良い．


![スクリーンショット 2024-03-09 11.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/842e9121-a830-6071-4095-ba7578fe076e.png)



## 1層目のEncorderの後にPEGを入れる理由
実験的に良いことが分かった．これは，よりグローバルな畳み込みができるから良くなったと考えられる．0が1層目Endorderの後，-1がEncorder前である．

よりグローバルな畳み込みが有効なのであれば，Encorder前の-1の位置でカーネルが27でも問題ない．つまり，グローバルな畳み込みが有効である．

![スクリーンショット 2024-03-09 11.57.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/57eb3795-d530-e499-ec5b-36b0ceb91576.png)



# まとめ
畳み込みがあれば，ViTの位置埋め込みいらない【PEG】について解説した．位置埋め込みは，なんか難しい感じで，位置を保存とか言ってたけど，畳み込みで代用できるならシンプルでいい．CNN+ViTのモデルも位置埋め込みは使用していなくて，CNNは位置埋め込みの代わりになる．
HTML: iframeを使った手品

## onload属性内部ではiframe自身を指すobjectを省略可能
```html
<iframe onload="style.border='2px solid red';className='css'">
```
勿論他にも色々な属性を参照できる。
## 再帰処理?
```html
<iframe onload="id++<9&&(outerHTML+=id)">
```
`iframe`の`id`は既定値で空文字。加算処理で0としても扱える。当然`outerHTML`は`iframe`のものを指す。
面白い事にonloadの処理を反復している。ただの反復ではなく再帰処理ッポイのだ。
## setIntervalのようなsetTimeout
```html
<iframe onload="setTimeout(a=>srcdoc=++id,50)">
```
`50`を`0`や`1`のような極端に低い値にするとbrowserがerrorを起こすかも。最悪の場合熱暴走を起こして死に至る。
## 危険な永久再描画
CPUに高負荷がかかり続けます。browserが逝くかerror起こして止まるか…。ろくな結末を迎えない事は確かである。
```html
<iframe onload="src='data:,iframe'">
```
```html
<iframe onload="srcdoc='iframe'">
```
## 無限の入れ子
これまた危険なhtml。ある程度描画したところで強制停止するかも。
```html
<iframe onload='srcdoc=outerHTML'>
```
```html
<iframe onload='contentWindow.document.write(outerHTML)'>
```
## CodePenもどき
画面左端のiframeにhtmlを描画、その右のtextareaにhtml記述、その右のtextareaにcss記述、その右にJavaScript記述。textareaのonchange eventを起点にして再描画処理。
```html
<iframe onload='id++<3?outerHTML+=`<textarea onchange="f[${id}]=value;f.srcdoc=f[3]+\`<script>\${f[1]}</script><style>\`+f[2]"rows=9>`:id="f"'>
```
【競プロ向け】bits/stdc++.hをプリコンパイルしてコンパイルを高速化しよう

## はじめに
C++で競技プログラミングをする人はよく使うであろう「#include\<bits/stdc++.h>」ですが、これを使用するとコンパイルに少し時間がかかるようになります。この問題は、ヘッダファイルをあらかじめコンパイルしておくことで解決することができます。具体的には、約2秒かかっていたコンパイルが約0.5秒で終わるようになりました。
なお、この記事よりも

https://www.ochappa.net/posts/pre-c-bs

の方がよりシンプルです。まずはこちらを読んだ方がいいかもしれません。
## 前提
基本的なC++の環境構築は出来ているものとします。具体的には、#include\<bits/stdc++.h>を使用したコードが正常にコンパイルして実行できる状態です。

## 手順
### bits/stdc++.hを探す
bits/stdc++.hがどこにあるかを探します。WSLを使用している場合、「/usr/include/x86_64-linux-gnu/c++/11/bits」にあると思います。
見つからなければ、以下の記事を参考に探しましょう。

https://shunniita-landfill.hatenablog.jp/entry/2023/07/30/183639

### bitsディレクトリに移動
cdコマンドなどを使用してbitsディレクトリに移動しましょう。
```shell
cd /usr/include/x86_64-linux-gnu/c++/11/bits
```
### stdc++.hをプリコンパイルする
普段使っているオプションをつけて、stdc++.hをプリコンパイルします。
```shell
sudo g++ (普段使っているオプション) stdc++.h
```
例えば、筆者は普段
```shell
g++ -o ! testfile.cpp -D BLUEBERRY -Wall -I /home/blueberry/atcoder_codespace/ac-library-master/
```
でコンパイルしていますので、
```shell
sudo g++ -D BLUEBERRY -Wall -I /home/blueberry/atcoder_codespace/ac-library-master/ stdc++.h
```
となります。sudoが必要なことに注意です。
なお、このやり方では一つのコンパイルオプションにしか対応できませんが、複数のコンパイルオプションに対応することもできます。以下の記事が参考になると思います。

https://qiita.com/DaikiSuyama/items/e502e09a1090f4a2cee3#4-bitsstdch%E3%81%AE%E3%83%97%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB

### 動作確認
ここからは、普段使っているディレクトリに戻って大丈夫です。普段と同じようにコンパイルして、コンパイルが速くなっているかを確かめましょう。きちんと確かめたい場合、-Hオプションを付けることで、どこからincludeされているかを調べることができます。

https://scol.hatenablog.com/entry/2022/04/30/173545

手順は以上となります。

## 注意点
**include\<bits/stdc++.h>はファイルの先頭に書きましょう。** 筆者が詰まった原因はここでした。using namespace stdなどをincludeよりも上に書いていると正常に動作しません。
うまくincludeされない場合、includeが一番最初に入っていないか、コンパイルオプションが間違っている（ヘッダファイルのプリコンパイル時のオプションと一致していない）可能性が高いです。
【ChatGPT（Web版）】が動かなくなった方へ。試してみて。


　どうも、カーブミラーです。

　今回は、ChatGPTのWeb版が動かなくなった方に、試して欲しいことです。

:::note info
本記事は、ChatGPT（無＆有）
で行なっております。画像はあ
りません。　　　あしからず。
:::

　まずは、悲報。

　悲しい知らせが
　　昨日（2024/03/08）ありました。

　あのドラゴンボールの
　　作者の鳥山明先生が
　　　今年、3月1日に
　　　　お亡くなりになりました。

　昨日、発表されました。
　　急性硬膜下血腫だそうです。

　個性的な世界観と
　　ドラえもん以来の
　　　科学技術に触れられた
　　　　素晴らしいマンガ家でした。

　心から
　　御冥福を
　　　お祈りいたします。
***
　もうひとつ
　　訃報が届きました。

　『ちびまる子ちゃん』の
　　まる子役の声優である
　　　TARAKOさんが急死。
　　　　原因不明とか。

　心から
　　御冥福を
　　　お祈りいたします。
***
　もうひとつ
　　訃報？です。

　動画生成AIの
　　Soraですが、
　　　すぐに提供できる段階ではない
　　　　そうです。
[OpenAIのSoraチームリーダー言及](https://twitter.com/SuguruKun_ai/status/1766241964679442606?t=kTT24v28s5O5eQNtiYn7Rg&s=19)

　ちょっと期待していたので、
　　ガッカリですね。
***
　さて、
　　本題です。

　ChatGPTのWeb版が
　　動かなくなった方に
　　　試してみて欲しいことです。

　昨日（2024/03/07）の朝から
　　入力を受け付けなくなり、
　　　チャットができない状態に
　　　　なりました。

　原因としては、
　　OpenAIが
　　　多要素認証機能ほかを
　　　　追加した影響、と
　　　　　言われています。
[OpenAI X-Twitter Account](https://twitter.com/OpenAI/status/1765835660852674944?t=JpYOYH_ro6F7z4LSWnBkNg&s=19)

　とにかく、
　　動かせる状態に
　　　しておきましょう。

　まずは、
　　再度ログインを
　　　やってみてください。

　それで
　　ダメなら
　　　次です。

　問題が
　　出ている人の
　　　だいたいが、
　　　　ブラウザが
　　　　　Chrome系でした。

　Edgeでは
　　問題なく動いている、とのこと。

　そこで
　　Chromeのクッキーを
　　　削除します。

　やり方を
　　示します。

　ただ、これは
　　アプリの場合なので
　　　多少、場所が違う可能性は
　　　　ありますので、
　　　　　ご注意を。

　メインメニュー
　　→設定
　　→プライバシーとセキュリティ閲覧
　　→履歴データの削除

　ここまで来たら
　　“Cookieとサイトデータ”のみ
　　　チェックを入れて、
　　　　“データを削除”ボタンをタップ

　戻って、
　　再度ログインしてください。

　すると、
　　黒バックの人は、白バックに
　　日本語が、英語表記に
　　　なっています。

　そう、
　　そうした設定は
　　　Cookieに書き込まれて
　　　　いたのです。

　履歴は
　　影響ありません。

　設定で
　　これらを
　　　直してください。

　これで
　　作業できるはずです。

　X-Twitterでも
　　そう、報告がありましたので。

　　――――――

　ちなみに
　　設定に
　　　いくつか項目が
　　　　増えています。

　一般タブ
　　・多要素認証
　　・データアナリスト～

　スピーチタブ
　　音声に、誰を設定するのか。
　　　つまり、音声出力が可能です。

　ビルダープロフィールタブ
　　内容が多くなっています。

　一応、
　　チェックしておいた方が
　　　よろしいかと思います。

　　――――――

　これで
　　みなさんが
　　　ChatGPTに
　　　　戻れることを
　　　　　願います。

　今回は、ここまで。
***
　追加情報。

　上記のやり方で、
　　一時的に直ったが
　　　また、ダメになった方は
　　　　以下を試してください。

　ChatGPTの
　　設定の一般タブで
　　　ロケールがありますよね。

　それを
　　一番上の“自動検出”にして
　　　再度ログイン。

　これで
　　直る、とのこと。

　私もこれで直りました。
バッチ処理とは

### 初めに

Webサイト開発の際に他の方がバッチ処理の実装を担当していたが、バッチ処理の実装というのがどのようなものなのかいまいち理解できていなかったため、まとめてみる。

### 結論

・バッチ処理とは、一括でまとまった処理をすること。
・バッチ処理の実装とは、一括でデータを収集したり、データを登録するために、プログラムなどを作成することを指す。

→そのプログラムにはデータの取得方法や、登録方法、どのような形式で、どの段階で処理を行うか、処理に失敗したときの対応などを記載する。
Google日本語入力で「きょう」をYYYMMDD形式にする方法

## 結論

Google日本語入力の辞書ツールで以下のように単語を登録する

- 読み
    - DATE_FORMAT
- 単語
    - {YEAR}{MONTH}{DATE}
- 品詞
    - 名詞

例）
一番下に登録している行です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/2ea4baf5-cd54-2cad-9217-1350712b087f.png)


登録すると、以下のように「きょう」の変換候補にYYYYMMDD形式が登場しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/ec0f4133-4675-d86b-f183-1de91ffd7100.png)

### YYYYMMDDが使われるシーン

今日の日付をファイル名につけることはよくあります。バックアップファイルなどにもつけます。社内の開発プロジェクトなどはバージョン管理システムを使うでしょうが、社外向けの資料などはYYYYMMDDを付けてファイルのタイムスタンプに依存しない形でいつのデータかを保持するのがいいでしょう。

ちなみに私は今日が何日なのかを記憶しておらず、ファイル名に日付をつけるたびに普段は閉じてるタスクトレイの日付を確認したり、スマートウォッチのめちゃくちゃ小さな日付を確認しているのが億劫でした。

### YYYYMMDD形式で変換できるIMEが少なかった

数年前に調べていたのですが、最初からYYYYMMDD形式があるのはATOK（有料）だけでした。YYYYMMDDではなくYYYY/MM/DDやYYYY-MM-DDなどはGoogle日本語入力やMS-IMEにもあるのですが、ファイル名にスラッシュは付けれないし、そもそもファイル名が無駄にながくなるのが嫌。ハイフンやアンダースコアのような記号はファイル名本体と日付の間の区切りに使いたいところ。

いい方法がないので「毎日今日の日付を辞書登録すればいい派」もいます。
https://everyday-level-up.com/pc-technique/%E6%97%A5%E4%BB%98%E3%82%92yyyymmdd%E5%BD%A2%E5%BC%8F%E3%81%A7%E5%85%A5%E5%8A%9B

以下の記事がかかれてる2016年時点でも、YYYYMMDDが使えるのはATOK(有料）だけという結論です。
https://www.bousaid.com/2016-11-27-123310/

### クリップボードマネージャーではYYYMMDD入力できないの？

クリップボードマネージャーのメインの機能はクリップボード履歴を管理することなのですが、日付などの自動入力にも対応しています。ただし、Windows上のエクスプローラー上でファイル名を変更しようとすると、いちどフォーカスが外れてしまって部分的にファイル名を変更できないという問題がありました。フォーカスを外さずに文字を入力するという点ならやはりIMEの機能としてほしいところ。

またWindosの標準機能で「ウィンドウズキー + v」でクリップボード履歴機能が備わったという点でも、クリップボードマネージャーのありがたみが減っていました。

### mozcはどうなの？

Google日本語入力のオープンソース版であるmozcならどうでしょう。探してみるとずばり日付入力のオプションがドキュメントとして記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/725311d7-ddce-ea24-80f5-a435aeed4f5d.png)
https://github.com/google/mozc/blob/master/docs/configurations.md

じゃぁ、このmozcをWindowsにインストールしようとして探してみてもWindowsバイナリは配布していない。いずれもWindows上でのビルド方法ばかりです。ビルド方法をみると、Visual Studio（VSCodeじゃない本物のVisual Studio）が必要だったり、英語版のWindowsの仮想環境を作らないとダメだとか、作業ステップが多くて心が折れそう。

mozcのドキュメント上では試験的な機能として紹介されているとはいえ、ひょっとしたらGoogle日本語入力でも同じ機能がリリースされてるんじゃないかと思いました。ここはあてずっぽう。

### Google日本語入力のバージョンとmozcのバージョンを比較してみよう

Google日本語入力のバージョンは「ばーじょん」を変換すると出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/5e2d3cc4-64b7-20e3-6528-4a253f7a03a3.png)

私の手元のGoogle日本語入力は`GoogleJapaneseInput-2.28.5050.0+24.11.9`だった。最新版の2.29.5330.0+24.11.9が2024年2月3日リリースなので比較的最新版に近い。

一方で、mozc上で日付フォーマットが加わったのがこちらのIssueで、2021年10月。
https://github.com/google/mozc/issues/518#issuecomment-932734085
既に2年たってるので、プロダクト版に移植されていてもおかしくはない。

ということで、mozcのドキュメントにしたがってGoogle日本語入力にもDATE_FORMATを辞書に登録したら同じ機能が使えましたよという話です。

### ありがとうございます

Google日本語入力開発チームのみなさまありがとうございます。食べ放題ではない店で食べ放題をごちそうしてもいいくらい感謝しています。
ローカルSAとグローバルSAを繰り返すモデル【Twins】



**原論文**
Twins: Revisiting the Design of Spatial Attention in Vision Transformers
https://proceedings.neurips.cc/paper_files/paper/2021/file/4e0928de075538c593fbdabb0c5ef2c3-Paper.pdf


# 関連研究
Swin（ローカルSA）
https://qiita.com/wakayama_90b/items/8fcedaaae7c8f4d94abd


PVT（グローバルSA）
https://qiita.com/wakayama_90b/items/77c4c6857210b73e24b8

条件付き位置エンコーディング（CPE）
https://qiita.com/wakayama_90b/items/20f6f93acbd6520b37a5




# 結論
ローカルSAとグローバルSAを繰り返す．



# 概要
画像認識モデルでViTはCNNと比較して，グローバルな認識が可能．しかし，ViTは計算量が膨大なため，特に高画質タスクには適さない．それを解決するためにローカル範囲でSAをするSwinがあるが，グローバル認識ができる利点を潰してしまう．
そこで，グローバルなSA（GSA）とローカルなSA（LSA）を組み合わせることにより，計算量を抑え，グローバルとローカルの両方の認識により精度を向上させるモデルを提案した．






# モデル構造（Twins）
モデル構造の全体図を下図に示す．SwinやPVTと同じ4ステージ構造で，PEGは位置埋め込みである．ViTに採用される位置埋め込みには，絶対位置エンコーディングが採用されている．しかし，同じく4ステージ構造であるPVTの絶対位置エンコーディングの性能があまり好ましくない傾向にある．そこで，Twins-PCPVTは，条件付き位置エンコーディング（CPE）を採用する．



※Swinの相対PEをCPEに置き換えても良くない．これは，Swinがシフトウィンドウを使用しているため，CPEとうまく動作しないのではないかと推測

==============================================================

Transformer Encorderの中身を下図の右に示し，LSA→GSAを繰り返す．このローカルとグローバルを交互にすることでいい性能を獲得する．




![スクリーンショット 2024-03-09 9.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/a6f1a27f-cae6-9159-7896-bee3be1d64b8.png)



## 局所グループ化自己注意（LSA）
特徴量を空間方向に$m \times n$の大きさに分割する．青で示す分割範囲の$m \times n$範囲でSAする．
実際には，3次元の特徴量$H \times W \times C$なので，分割して$m \times n \times C$．これをMulti-headにするので，1headの入力は$m \times n \times C/h$になる（$h$はヘッド数）．LSAは2次元で動作するので，$mn \times C/h$で計算する．

※局所グループ化自己注意（LSA）だけを使用した場合，は精度が落ちる．だから，グローバルSAが必要


![スクリーンショット 2024-03-09 9.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/a54f9ba9-8d44-838f-cc97-42ed98853ed2.png)





# 実験
モデルの比較でTwinsは，PVTよりローカルに強く．Swinよりグローバルに強い．この両方のいいところ取りで，精度向上．


また，PVTはよりスリムで深いデザインを好み，Swinはより広く浅い．この違いにより、PVTはスウィンに比べてトレーニングが遅い傾向にある．



# まとめ
ローカルSAとグローバルSAを繰り返すモデル【Twins】について解説した．ローカルとグローバルの交互の認識は有効であることがわかった．ローカルSAをローカル認識である畳み込みに置き換えたモデルのある．それもいいモデル．ViTは，グローバルなことが利点だけど，ローカルと組み合わせることで，計算効率と性能も良くなる．
インシデント管理

インシデント管理の流れについて、自分なりにまとめてみました。

# インシデント管理の対応フロー

```plantuml
start
:インシデントの検知;
:インシデントの記録;
:インシデントの分類;
if (インシデントかサービス要求か) then (インシデント)
  if (重大インシデントか) then (yes)
    :重大インシデント対応へ;
    stop
  else (no)
    :インシデントの診断;
    if (解決可能か) then (yes)
    else (no)
      :エスカレーション;
    endif
    :インシデントの解決;
    :インシデントのクローズ;
  endif
else (サービス要求)
  :サービス要求管理へ;
  stop
endif
stop
```

# インシデント対応の項目

## インシデントの検知

監視からのアラートやユーザーからの問い合わせにより、インシデントを検知します。

## インシデントの記録

チケット管理などのインシデントの管理システムに、インシデントを登録します。

## インシデントの分類

インシデントを対象のカテゴリに分類したり、優先度（緊急度と影響度）を判定したりします。ここの判別で顧客要求や重大インシデントかどうかの判別を行い、その場合はそれぞれのプロセスを引き継ぎます。

## インシデントの診断

インシデントの内容を調査し、解決可能かを診断します。

## エスカレーション

インシデントを内部では解決できない場合、他の部署にエスカレーションします。

## インシデントの解決

インシデントの解決策を適用し、インシデントを解決します。

## インシデントのクローズ

インシデントをクローズします。

# インシデント対応外部の対応

## 重大インシデント対応

インシデントの内容が事業に影響を与えるような影響度の大きいものであった場合、重大インシデントに移行します。重大インシデントの手順を予め決めておき、それに従って対応します。

## サービス要求管理

インシデントの分類の結果、インシデントではなく顧客要求であった場合は、
サービス要求管理にて管理を行います。
Speech-to-text について勉強①モデルとAPIを探す

## 背景

SEとして働きながら、最近自社のエンジニア採用に少し携わることがあります。

採用担当からこのような声があります：
自分は技術に関する知識がないので、応募者のスキル感が把握しずらいです。
技術リーダーは忙しいくて、技術面接のスケジュールを調整が難しい、そもそも、現場と会話する機会がそこまでがないので、ほしい人物像は未だに分からないです....

中小企業ですので、大手みたいにどんどん採用をプロにソースアウトの経費がないし、コーディング試験を導入するもかなりお金をかかります。エンジニアを育つのが大事ですが、会社はただのエンジニアの集団ではないので、会社の中の一人一人を大事にして、成長させるのが重要ではないかと思いました。人事採用担当も重要な一員なので、もちろん育成しないといけないです。

しかし、自分はあくまでちょっとおせっかい性格をもつエンジニアですし、採用に関する知識当然不足です。自分が何かできるかを考え挙句、Speech-to-textを使って、面接の振り返りできるサービスを作ってみになりません。

## 設計
面接官と応募者のオンライン面接の会話をテキストへ変化、記録、分析、面接官へフィットバックします。


## Speech-to-text と　ASR
ASR:  Automatic Speech Recognition
Speech-to-text : 文面通り、会話をテキストに変換する技術


NVIDIAさんのモデル：
https://developer.nvidia.com/blog/how-to-build-domain-specific-automatic-speech-recognition-models-on-gpus/

https://github.com/NVIDIA/NeMo

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617964/80de6475-b48f-26e3-5647-4010ea5bf60a.png)

huggingfaceさんのモデル：
https://huggingface.co/transformers/v4.4.2/model_doc/speech_to_text.html

IBMの製品：
https://www.ibm.com/jp-ja/products/speech-to-text?utm_content=SRCWW&p1=Search&p4=43700075836183462&p5=p&gad_source=1&gclid=CjwKCAiAi6uvBhADEiwAWiyRdozN-zT78U93MDQQJ6EYFgjXUC5BEB1JsIHxEkNY5jRDfh8YTO8u7RoCghMQAvD_BwE&gclsrc=aw.ds

Google AI
https://cloud.google.com/speech-to-text?hl=ja
APIの利用可能
https://cloud.google.com/speech-to-text/docs/reference/rest

OpenAIさんはもちろんAPIを提供しています
https://platform.openai.com/docs/guides/speech-to-text
https://github.com/openai/whisper

Amazonさんの製品：
https://aws.amazon.com/jp/transcribe/?p=pm&c=transcribe&z=4

MicroSoftさんの製品：
https://speech.microsoft.com/portal/speechtotexttool
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/whisper-overview

より早いモデルもあります。
https://github.com/SYSTRAN/faster-whisper

## モデルの選択

ついでにcudaも勉強したいので、GPUを使って、faster-whisperでより自社のシチュエーションにあるものを作りたいと思いました。
Phoenix環境構築をmacでやろう 2024/3/9

この記事は 3/9開催「[piyopiyo.ex #28：Phoenixのローカル環境構築をやってみる会](https://piyopiyoex.connpass.com/event/309652/)」のための記事です。

以下、目次です。
* asdfのインストール
* erlangのインストール
* elixirのインストール
* PostgreSQLのインストール
* Phoenixのインストール
* アプリケーション実行（`mix phx.server`）

## asdfのインストール（Homebrew & bash）

asdfはプログラミング言語などをバージョン管理できるツール。
asdfのGetting Startedから、Mac&zshのインストール方法をピックアップしています。

https://asdf-vm.com/guide/getting-started.html

homebrewでasdfをインストール
```
brew install asdf
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.zshrc
source ${ZDOTDIR:-~}/.zshrc
asdf --version
```

## erlangとそれに必要なライブラリのインストール

```
asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
brew install wxwidgets
brew install openjdk
echo 'export PATH="$(brew --prefix openjdk)/bin:$PATH"' >> ${ZDOTDIR:-~}/.zshrc
source ${ZDOTDIR:-~}/.zshrc
brew install fop
```

erlangの最新版をインストール

```
asdf install erlang latest
asdf global erlang latest
```

## elixirのインストール

```
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
asdf install elixir latest
asdf global elixir latest
```

## PostgreSQLのインストール

インストールできるバージョンを調べる

```
brew search postgresql
==> Formulae
postgresql@10                postgresql@12                postgresql@14 ✔              postgresql@16                postgrest
postgresql@11                postgresql@13                postgresql@15                qt-postgresql
```

バージョンを指定してインストール
```
brew install postgresql@14
```

postgresの起動
```
brew services start postgresql@14
```

## Phoenixのインストール

```
mix archive.install hex phx_new
```

### Phoenixアプリ作成＆起動

Phoenix PJ作成
```
mix phx.new hello
〜中略〜
Fetch and install dependencies? [Yn] Y # <-依存関係をインストール
* running mix deps.get
* running mix assets.setup
* running mix deps.compile

We are almost there! The following steps are missing:

    $ cd hello

Then configure your database in config/dev.exs and run:

    $ mix ecto.create

Start your Phoenix app with:

    $ mix phx.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phx.server
```

```
cd hello
mix ecto.create # <- DBの作成
mix phx.server # <- Phoenix PJ起動
```

localhost:4000 にブラウザでアクセス

![スクリーンショット 2024-03-09 9.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/b2b761ef-d9b5-f101-e4bb-ad0c045659c5.png)

## mix ecto.setupでエラーになる場合

config/dev.exsに記載されているpostgresユーザーがDBに存在していない可能性があります。
下記記事を参照ください。

https://qiita.com/nako_sleep_9h/items/9d80f6cadfe341581df6#postgresql%E3%81%ABdevexs%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E7%99%BB%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%97%E3%82%88%E3%81%862022610%E8%BF%BD%E8%A8%98
Python requestsで画像ファイルをダウンロード

pythonのwebスクレイピングで、結局requestsでいいことが判明したので書いていく。
# やり方
テキストや、画像はそれぞれurlを持っている。そいつをrequest.get()にわたすと、データを返してくれるので、それをファイルに書き込めばおｋらしい。
### コード
```websc.py
import requests

tag=画像のurl
responce=requests.get(tag)

with open('newfile','wb') as savefile:
    savefile.write(responce.content) 
```
.contentがついている意味は自分でもわかっていない。
画像のurlは、右クリックで、「画像のリンクをコピー」でわかる。
書き込まれたファイルのファイル拡張子を画像のものに変更して開けば、ダウンロードしたやつが見られる。
細長いpoolingでグローバル情報獲得【Strip Pooling】






**原論文**
Strip Pooling: Rethinking Spatial Pooling for Scene Parsing
https://arxiv.org/pdf/2003.13328.pdf



# 結論
細長いpoolingで無駄のないグローバル情報を獲得できるよ．


# 概要
画像認識分野において，空間情報を集約するPoolingは，遠くにある情報を捉えるのに有効である．しかし，一般的に使用されるPoolingは，正方形の範囲の情報を集約する方法で，下図に示す緑の範囲は，様々なオブジェクトの情報が含まれており，Poolingの範囲を大きくすると，それだけ無駄な情報を一緒に計算してしまう．そこで，細長い範囲のPoolingを提案する．下図の赤で示す範囲をPooling範囲とすることで，無駄な情報を取り入れずにより長距離の情報を取り入れて計算できる．
例えば，自動車カメラのデータの場合，電柱や車線など，直線的なオブジェクトが多くあり，この手法が有効である．



![スクリーンショット 2024-03-09 8.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/0541c146-ff8c-e26b-e2bc-a2362eb73835.png)






# モデル構造

## Strip Pooling Module（SPM）
縦方向のpool（紫）と横方向のpool（赤）をする．紫は，縦の情報を1つの値になるので，出力が（$1 \times W$），赤は，横の情報を1つにするので（$H \times 1$）．それぞれ畳み込み層を通し，拡張して（$H \times W$）．それらの要素和→1x1Conv→sigmoid（値を0~1）して入力と要素積．これによって，入力特徴量に長距離poolを活用した空間の重要度付けができる．


![スクリーンショット 2024-03-09 9.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/211021eb-f71b-b5b9-7c63-52dfc9bf3593.png)




## Pyramid Poolingと組み合わせる
下図の(a)にPyramid Poolingを示す．サイズの違う範囲をpoolして，スケールアップでサイズを合わせて，要素和→Convする．これは，(b)に示すStrip Poolingとは対照的に，局所的な情報を取り込む構造である．この(a)と(b)を組み合わせることにより，グローバルとローカルの情報を考慮でき精度向上する．


![スクリーンショット 2024-03-09 9.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/d8ac73f2-c49d-e2bd-8b9b-8d42aabefc42.png)






# 実験
セグメンテーションタスクで良い結果．建物や人工物のような直線的なオブジェクトに強い．



# まとめ
細長いpoolingでグローバル情報獲得【Strip Pooling】について解説した．縦と横の軸を別々に認識させる方法は，たくさんあるよね．この技術を空間の重要度付けに使用した．
LaravelとInertia(Vue3)で多言語化対応

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回は、LaraveとInertia、Vue.jsを使って、日本語、英語、中国語の3言語がボタンでクリックで切り替えができる機能を作成しようと思います。


# vue-i18n をインストールする

多言語化対応に必要なvue-i18nをインストールします。
公式サイトは以下URLです。

https://vue-i18n.intlify.dev/


下記のコマンドでインストールします。
```
npm install vue-i18n@9
```

# 言語ファイルの作成
`resources/js/lang`フォルダを作成し、その配下に`message.js`ファイルを作成します。
ファイルの中身は以下のようにします。

```js:message.js
export default {
    ja: {
        hello: 'こんにちは'
    },
    en: {
        hello: 'Hello!'
    }
    zh: {
        hello: "欢迎",
    },
}
```

こうすると、Vue側で`{{ $t('hello') }}`という感じで表示できるようになります。
Vueで表示できるように各ファイルを修正します。

```js:app.js
import { createInertiaApp } from "@inertiajs/vue3";
import { resolvePageComponent } from "laravel-vite-plugin/inertia-helpers";
import { createApp, h } from "vue";
import { createI18n } from "vue-i18n";　　　//←　追加
import "../css/app.css";
import "./bootstrap";
import messages from "./lang/messages.js";   //←　追加
const i18n = createI18n({    //←　追加
    locale: __locale,        //←　追加
    messages,                //←　追加
});

createInertiaApp({
    resolve: (name) =>
        resolvePageComponent(
            `./pages/${name}.vue`,
            import.meta.glob("./pages/**/*.vue")
        ),
    setup({ el, App, props }) {
        return createApp({ render: () => h(App, props) })
            .use(i18n)     //←　追加
            .mixin({ methods: { route } })
            .mount(el);
    },
});
```

現在の言語が何かを__localeに保存しています。

```html:app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    @vite('resources/js/app.js') @inertiaHead  @routes
    <script>    　　　　　　　　　　　　　　　　　　　　//←　追加
        var __locale = '{{ app()->getLocale() }}'    //←　追加
    </script>    　　　　　　　　　　　　　　　　　　　　//←　追加
  </head>

  <body class="font-sans antialiased">
    @inertia
  </body>
</html>
```
これで、`{{ $t('hello') }}`をVue側で書くと表示されるようになりました。
ボタンを押して言語を切り替えられるようにします。
まずは、Vue側に切り替えのボタンを用意する。今回は、3言語なので3つボタンを作成しました。
```html
<div>
    <a v-bind:href="route('lang.change', 'en')">
        <div class="">英語</div>
    </a>
</div>
<div>
    <a v-bind:href="route('lang.change', 'ja')">
        <div class="">日本語</div>
    </a>
</div>
<div>
    <a v-bind:href="route('lang.change', 'zh')">
        <div class="">中国語</div>
    </a>
</div>
```

次に`route('lang.change')`を作成していきます。

`routes/web.php`に言語変更をするための処理を作成するために、以下を追記します。

```php
Route::get('/greeting/{locale}', function($locale) {
  　session()->put('locale', $locale);
  　return redirect()->back();
})->name('lang.change');
```
`session()->put('locale', $locale);`で言語を切り替え、`return redirect()->back();`でもとのURLにリダイレクトするようにします。

これでボタンを押したときに言語を切り替えることができるようになりました。


# おわりに

やり方が違ったり、もっといいやり方、認識が間違っているよというようなことをお気づきの方は、はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。


# 参考文献

https://jitaku.work/it/category/web-development/vue3-laravel/multilanguage/
https://zenn.dev/blancpanda/articles/jetstream-vue-i18n