OmniAICreator/Qiita-1.07M huggingface dataset:
p5play で Chain Collider（vertex mode）のグループを作ってみる

この記事は [p5play の Group](https://p5play.org/learn/group.html) の仕組みで、以下の「Chain Colliders」のグループを作ってみる、という内容の記事です。

●p5play : Sprite ＞ Chain Colliders
　https://p5play.org/learn/sprite.html?page=11

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6beed3a1-3c1a-1893-8fd9-a527efd54fb4.png)

## p5play の Group のサンプル
p5play の Group のサンプルを見ていると、　グループ化している対象は円・矩形など、基本図形のみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ff351b60-ee7d-fb2b-73c8-fca5bde7bcab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/460f3482-c29e-5ae4-674b-5811f0423698.png)

このグループを作る仕組みで、冒頭の Chain Collider を使えると良さそうな状況があり、今回の内容を試してみました。

### 基本図形のグループを作る方法
基本の図形を使う際は、以下のような書き方ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2bc2d0a3-63e4-df98-f36c-70357e6310d1.png)

処理の内容は「グループを作る ⇒ 共通のパラメータを設定」という流れです。

その他に、グループ共通のパラメータを設定する中にランダムな価を使うと、例えば以下のように画面内に個々の図形を散りばめることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bde1a1e6-eab1-9fee-625c-fa5f4edb4140.png)

それ以外にも、グループを作成した後に以下のような処理を行うことで、個別のスプライトへの追加設定を行えるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c7dfa5e3-2827-f186-e047-1c1226dad40f.png)

また、以下のように i というインデックスを使って、個々の図形で異なるパラメータの設定ができるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/777bc9b8-b2d7-7b5b-ff49-20aa91afe1d0.png)

## p5play で Chain Collider（vertex mode）の Group を作る
それでは本題です。

Chain Collider の vertex mode は、new Sprite() という処理を行う際に、座標の組みの配列を設定して使います。これをグループ作成後に設定するのは難しそうです。

そこで、グループを作成した後に new Sprite() による個別設定を行う、というやり方を使ってみることにします。

処理の流れは、「グループの作成 ⇒ 個別の床の座標を指定」とします。また、draw() の中で、特定の床の色を後から変化させる、というのも試してみました。

それを実装したものが以下です。

```javascript
let floors;

function setup() {
  new Canvas(300, 400);
  strokeWeight(5);

  floors = new Group();
  floors.collider = "static";
  floors.color = color(190, 200, 220); // 灰色

  new floors.Sprite([
    [20, 40],
    [100, 90],
    [150, 150],
  ]);
  new floors.Sprite([
    [250, 150],
    [100, 300],
    [50, 300],
  ]);
}

function draw() {
  background(50);

  floors[0].color = color(
    (frameCount / 2) % 120,
    150,
    ((frameCount / 4) % 120) + 120
  );
}
```

上記を実行した結果、以下のように床を描画することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/afe663a8-9c15-698e-bc17-e124c30d728e.png)

これだけだとグループの仕組みを使った恩恵があまりないですが、以下の記事に書いていた衝突判定などを組み合わせると今回の実装内容が活きてきそうです。例えば、個々の床と別のオブジェクトとの衝突時に、衝突が行った床だけ何らかの変化を生じさせる、というのを簡単に実装できそうです。

●p5play の 2つのスプライトのグループ間で「Collisions and Overlaps」の仕組みを扱う - Qiita
　https://qiita.com/youtoy/items/6d56327bd3a1d232cb9b
SENetのFC層をカーネル畳み込みに変更【ECA-Net】


**原論文**
ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
https://arxiv.org/pdf/1910.03151.pdf


# 関連研究
SENet
https://qiita.com/wakayama_90b/items/96527dfbbeb1e2ee06c5


接続数の関しての説明
https://qiita.com/wakayama_90b/items/dc1b8969da0fd6999b1d





# 結論
SENetのFC層をカーネル畳み込みに変更した．FC層のチャンネル数は圧縮せずに，接続数を減らして，計算量削減すると良い．



# 概要
画像認識分野で，CNNに動的なパラメータを導入したSENetがある．しかし，SENetで空間情報を集約してFC層を通す際に計算量削減のため，チャンネル数を1/8や1/4に圧縮する．しかし，このチャンネル数を削減することは有効でない．そこで，チャンネルを削減せずに，局所的なカーネルサイズの範囲を集約することにより，計算量を削減しながらも有効な方法を提案する．

SENetは，空間情報も考慮して計算する派生手法があるが，計算量が重い．この論文は軽量で計算できる．





# モデル構造

主にSENetと同じ構造である．

入力特徴量（$H \times W \times C$）の空間情報（$H \times W$）をGAPにより圧縮して（$1 \times 1 \times C$）．チャンネル方向のカーネル（下図ではk=5）範囲の情報を集約して，FC層の出力する．カーネルはストライドする（$1 \times 1 \times C$）．いわゆる，適応的なカーネルサイズを持つ1次元畳み込み？．σはsigmoid関数で値を（0~1）に制限して，入力特徴量に要素積する．これで，重要なチャンネルが強調される．



![スクリーンショット 2024-03-09 19.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/00c9c45b-6f68-108e-074a-1f1fc54c2ae2.png)


## SENet
ちなみにSENetは（$1 \times 1 \times C$）からFC層で（$1 \times 1 \times C/r$）チャンネル数を削減している．これが良くない．あと，全てのチャンネルにまたがって計算することは不要．

![スクリーンショット 2024-02-07 10.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/7580988e-71c7-65bd-a435-3f5199552294.png)

# 実験
- SE-Var
    - 1 GAP→シグモイド
    - 2 各チャンネルの重みを独立に学習．（接続が各１）
    - 3 1層のFC層（全てのチャンネルに接続）
3は2と比較して，少し精度向上しているが，3のパラメータが大きすぎる．2は，ほとんど接続されていないが，チャンネルを圧縮した通常のSEnetと比較して，精度向上している．圧縮するのではなく，接続数を減らすことが有効であることがわかる．

- SE-GC
SE-GCは，チャンネルをG個のグループに分割して，それぞれでFC層をする．いい感じ．

- ECA
ECAは，今回提案する手法で，近傍k個の情報を集約してFC層する手法が有効である．

![スクリーンショット 2024-03-09 19.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/36909c59-1f5a-73d2-a5bc-36565951c41c.png)


## チャネル重要度の可視化


各クラスに対するチャンネルの重要度を可視化する．最初の層では，どのクラスも同じような感じだけど，最後の方は各クラスで重要なチャンネルがバラバラになる．
最初の方は，局所的な境界や角を認識するから，どのクラスでも同じような感じであり，中層になると，意味情報の学習を好み，チャンネルの重要度が各クラスで変化していく．
上記の結果は、ECAによって重要なチャンネルを選択できていることを示す．


![スクリーンショット 2024-03-09 19.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/7f1dd6b7-bade-88a4-28d5-c123e5e1bd9a.png)


# まとめ
今回は，SENetのFC層をカーネル畳み込みに変更【ECA-Net】について解説した．チャンネル数は圧縮せずに接続数を減らして，計算量削減すると良い．
仕様書作成方法

1.基本設計書を読んで、
画面側 ->
1. まず、画面のスクショを貼り付け
2. UIコンポ―ネット部分ちゃんと一つずつで説明する
3. API部分説明

バッチ ->
1. 起動タイム
2. ロープとか、基本設計書に従って詳細的に説明する

API ->
1. HTTPメソッド 説明する GET/POST/DELETE とか
2. バッチと同じ
3. どのようなデータが返すちゃんと説明する
【Vue3】バージョン3.4から安定版となった「defineModel」が超便利


2023年12月28日、Vue.jsの最新バージョン「3.4」がリリースされました。

今回のアップデートで安定版となった`defineModel`が超便利なので、紹介したいと思います。

https://blog.vuejs.org/posts/vue-3-4

## 用途

コンポーネントを使用する際、`v-model`に親コンポーネントで定義したデータ（`ref` / `reactive`）を指定する際に使用します。

たとえば以下のように、テキストフォームのコンポーネントを作成して、親コンポーネントで定義したref（`username`）をそのまま`v-model`に指定するような状況ですな。
```vue:親コンポーネント
<template>
  <div>
    <TextInput v-model="username" />
  </div>
</template>

<script setup>
import { ref } from "vue";
import TextInput from "./TextInput.vue";

const username = ref("");
</script>
```

## バージョン3.3までの記述
バージョン3.3までは、propsとして`modelValue`を受け取り、更新する際にはemitの`update:modelValue`に更新後の値を渡して実行するような形で記述していました。

記述が複雑で、何をやっているのかも分かりにくく、個人的にあまり好きではないコードでした。

```vue:子コンポーネント（TextInput.vue）
<template>
  <input type="text" v-model="model" />
</template>

<script setup>
import { defineProps, defineEmits, computed } from "vue";

const props = defineProps(["modelValue"]);

const emit = defineEmits(["update:modelValue"]);

const model = computed({
  get: () => props.modelValue,
  set: (inputted) => emit("update:modelValue", inputted)
});
</script>
```
または
```vue:子コンポーネント（TextInput.vue）
<template>
  <input
    :value="props.modelValue"
    @input="emit('update:modelValue', $event.target.value)"
  />
</template>

<script setup>
import { defineProps, defineEmits } from "vue";

const props = defineProps(["modelValue"]);

const emit = defineEmits(["update:modelValue"]);
</script>
```

## バージョン3.4からの記述 / `defineModel`を使用した記述
`defineModel`を使用した場合、恐ろしくシンプルになります。

コンポーネントで、`defineModel`メソッドを実行し、何かしらの変数（`username`）に格納します。あとは、フォームの`v-model`に作成した変数を指定するだけで、完成です！

かなりシンプルになりますね。
```vue:子コンポーネント（TextInput.vue）
<template>
  <input type="text" v-model="model" />
</template>

<script setup>
const model = defineModel();
</script>
```

### 複数の`v-model`を指定
`defineModel`には、引数を渡すことができます。第一引数として渡された文字列は、モデル名として使用されます。

親コンポーネントで使用する際に`v-model:モデル名`のように指定することで、紐付けるモデルを指定することができます。これを利用することで複数の`v-model`を扱うことができるので、とても便利です。

:::note info
指定するモデル名は重複してはいけないという点に注意してください。
:::

```vue:子コンポーネント（TextInput.vue）
<template>
  <input type="text" v-model="username" />
  <input type="number" v-model="age" />
</template>

<script setup>
const username = defineModel("username");
const age = defineModel("age");
</script>
```

```vue:親コンポーネント
<template>
  <div>
    <TextInput v-model:username="username" v-model:age="age" />
  </div>
</template>

<script setup>
import { ref } from "vue";
import TextInput from "./TextInput.vue";

const username = ref("");
const age = ref(0);
</script>
```
WindowsのHDD空き領域を定期的にCloudWatchメトリクスに送信する [容量監視]

# ソースコード

```bat:DiskSpaceToCloudWatchMetrics.bat
@echo off

SET AWS_PROFILE_NAME=your_profile_name
SET CWM_AWS_REGION=ap-northeast-1
SET CWM_NAMESPACE=your_namespace
SET CWM_DIMENSION_NAME=your_dimension_name
SET CWM_DIMENSION_VALUE=your_dimension_value

for /f "tokens=1-5* usebackq" %%i in (`wmic logicaldisk get size^,freespace^,caption ^| findstr "C:"`) do (
    call :setFreeSpace "%%j"
    call :setTotalSpace "%%k"
)

echo FREE_SPACE=%FREE_SPACE%
echo TOTAL_SPACE=%TOTAL_SPACE%

aws cloudwatch put-metric-data --metric-name DiskFreeSpaceBytes --namespace %CWM_NAMESPACE% --value %FREE_SPACE% --dimensions %CWM_DIMENSION_NAME%=%CWM_DIMENSION_VALUE% --region %CWM_AWS_REGION% --profile %AWS_PROFILE_NAME%
aws cloudwatch put-metric-data --metric-name DiskTotalSpaceBytes --namespace %CWM_NAMESPACE% --value %TOTAL_SPACE% --dimensions %CWM_DIMENSION_NAME%=%CWM_DIMENSION_VALUE% --region %CWM_AWS_REGION% --profile %AWS_PROFILE_NAME%

exit /b 0

:setFreeSpace
    type "%~1" >nul 2>&1
    if %ERRORLEVEL% neq 0 (
        @set FREE_SPACE=%~1
    ) else (
        REM echo
    )
exit /b 0

:setTotalSpace
    type "%~1" >nul 2>&1
    if %ERRORLEVEL% neq 0 (
        @set TOTAL_SPACE=%~1
    ) else (
        REM echo
    )
exit /b 0
```

# タスク スケジューラの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/3becc236-3f12-8f7d-bca6-101f29829e1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/ef6a1cfe-ae57-c8ae-5ee9-41a655d7e607.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/9b714e95-3759-81be-e0ee-9674a9529f47.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/9d8e63cc-aef3-4c17-2d03-ad7b146861f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653543/d8508857-9cc8-329a-9dbd-64c3c8cf2fae.png)
Self-Attentionをマルチスケール畳み込みに変更【SegNeXt】


**原論文**
SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation
https://proceedings.neurips.cc/paper_files/paper/2022/file/08050f40fff41616ccfc3080e60a301a-Paper-Conference.pdf




# 結論
セグメンテーションのためのViT構造をした畳み込みモデルを提案する．ViTのSA部分をマルチスケールの畳み込みに置き換える．


# 概要
画像認識分野で，CNNとViTがある．セグメンテーションタスクでは，高画質画像を扱うこと，局所的な認識が必要な点からCNNの方が有効である．けど，ViTは画像認識分野で有効なので，ViTの構造を移植して，ViTの形をした畳み込みモデルを提案する．


セマセグの性能向上条件
- Transformer系のモデルは強力
- 様々のサイズの認識対象を処理する必要
- 空間情報の優先順位付け
- 高画質画像を扱うので計算量を小さくする必要がある


# モデル構造
下図にモデル構造を示す．
ResNetなどで使用される階層型のモデル構造である．
（a）にステージの全体像で，Attentionでマルチスケールの畳み込み，FFNでローカルな畳み込みをする．（b）にAttention（マルチスケールの畳み込み）の構造を示す．それぞれを1x1で挟んでる（チャンネル認識）．
ステージ間は畳み込みでダウンサンプリングする．


![スクリーンショット 2024-03-09 18.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/f3919797-ec2b-610c-1d09-4058fec84149.png)


## マルチスケールの畳み込み

まず，5x5DWConvする．その後，カーネルサイズの異なるDW畳み込みを並列に計算して，それぞれの要素和→1x1Conv（Channel Mixing）する．出力したAttと入力のFの要素積をする（いわゆるSENetなどで使用される動的な重みを持つゲート構造である）．この要素積により，入力特徴量のどこの部分が重要なのかを表現できる．

※ゲート構造にsoftmaxを使用しない

並列した畳み込み，例えば，7x7カーネルの畳み込みは計算量削減のために7x1と1x7に因数分解して畳み込みを行う．因数分解した畳み込みはカーネルのサイズが7x1と細長くなるため，画像の直線的な情報を集約する．セマセグでは，人や電柱など，直線的なオブジェクトがあるので有効に動作する．




![スクリーンショット 2024-03-09 19.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/aa1a29c7-3403-6d1a-dffa-c4732ad8013d.png)



## デコーダー
デコーダがエンコーダーのステージ1から4までの特徴量を集約するSegFormerとは異なり，SegNeXtは，(c)のように，最後の3つのステージからの特徴量しか受け取らない．これは，SegNeXtが畳み込みに基づいているためである．ステージ1の特徴量には低レベルの情報が多すぎるため，性能が低下する．

![スクリーンショット 2024-03-09 19.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/d5606668-717b-3e8c-0d95-3f82fc2921fb.png)






# 実験
セグメンテーションで良い精度になる．
![スクリーンショット 2024-03-09 19.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/c7c5bf66-fe0b-eac7-0e90-c00d14b7694d.png)



# まとめ

今回は，Self-Attentionをマルチスケール畳み込みに変更【SegNeXt】について解説した．SAをマルチスケール畳み込みに置き換えることで，動的なパラメータを持つ受容野の大きい畳み込みモデルが完成した．ViTに寄せた構造だけど，計算は畳み込みなので，計算量が大きくなりすぎない．
WSL2 Ubuntu-22.04でVSCodeがターミナルから起動できない問題


## 問題

うっかりホームディレクトリを吹き飛ばし、環境構築し直したら問題がおきた。

VSCode内のターミナルから`code`コマンドを使用すると、`Unable to connect to VS Code server`で失敗しまうのだ。

なぜか通常のターミナルからは起動できる。

## 解決

下記ISSUEコメントにある通り、`loginctl enable-linger $(whoami)`で解決する。

[Unable to connect to VS Code server: Error in request - ENOENT /run/user/1000/vscode-ipc-\*.sock · Issue #157275 · microsoft/vscode · GitHub](https://github.com/microsoft/vscode/issues/157275#issuecomment-1890408573)
WordPressダッシュボードをセキュアにする方法について

## MFAとは
MFAとは多要素認証のことです。知識、所有、生体のいずれかの情報を掛け合わせて認証を行う仕組みです。Google Authenticatorなどは、パスワード認証(知識)+パスコード(所有)で行われる多要素認証です。

## パスキーとは
パスキー(passkeyまたはpasskeys)とはFIDOアライアンスという団体が標準化した新しい認証方法です。Webサービスなどで認証する際にパスワードを入力することを必要としません。公開鍵暗号を用いてチャレンジというものを暗号化した上でサーバに送って、サーバ側はそれを復号化します。パスワードを送る必要がないのでフィッシングサイトなどに誤って送ってしまう危険性もないです。

## WordPressにMFAを導入する方法
https://inasan.tech/wordpress-with-mfa/

## WordPressにパスキーを導入する方法
https://inasan.tech/wordpress-passkeys/
VisualStudio2022でUnityのインテリセンスが出なかった話

# VisualStudioでUnityのインテリセンスが出なかった話

パソコンを新調していざ作るぞ！！！と意気込んだはいいものの、
「インテリセンスが出ない…無理や…」と思いいろいろ検索して試してみてもダメでした…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3739900/5cac382b-6195-e68b-6828-1b1cded8ebe1.png)

ちゃんとエディター設定しとるやろがい！！
なぜでないんじゃ？

# 結局悪いのはセキュリティソフトだった…

「Windowsセキュリティ　→　スマートアプリコントロール」をオフにしたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3739900/b42844c6-1718-3ab4-0715-a87a3dd266cb.png)
でたぁ！（ドラえもん風）

これでやっと快適に作れますね！
やったー！！

この事象で困っている人はセキュリティソフトが邪魔している可能性もあるので、
確認する価値ありですね！
また何か気が付いたら書きます～
Node.js でタイプスクリプトを導入する早見表

## 概要
- 新規プロジェクトを始める際に簡単に導入ができるようにコピペ用のスターターを作成する

## 1. フォルダ作成とnpmの初期化
```sh
# フォルダの作成
mkdir myproject
# 作成したフォルダに移動
cd myproject
# npm の初期化
npm init -y
```
## 2. TypeScriptのインストール
```sh
# コンパイラの導入と型定義の追加
npm install --save-dev typescript @types/node
```
## 3. TypeScriptの設定ファイルの作成
```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "esModuleInterop": true,
    "strict": true
  },
  "include": [
    "./src/**/*.ts"
  ],
  "exclude": [
    "node_modules",
    ".history"
  ]
}
```

## 4. コンパイルスクリプトの追記
```json:package.json
"scripts": {
  "build": "tsc",
  "start": "node dist/index.js"
}
```

## 5. コンパイルと実行
```sh
npm run build
npm start
```
Azure Container Appsのコンテナアプリが簡単に停止できるようになった

何気なくAzure Container Appsのコンテナアプリ管理画面を眺めていたら、いつの間にか「停止」ボタンが実装されていることに気づきました。

![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/6edc03ed-e6ab-7cae-0b4b-aa4504f069ac.png)

前はなかったよなぁ、と2023年12月に取得していた画面キャプチャと見比べてみました。
やはり前まで「停止」ボタンはありませんでした。Status欄も増えてますね。

![99.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/18936229-0a6b-66e5-ddd3-3be8bcb8d579.png)

というわけで早速試してみました。
まずはコンテナのスケーリングを「1-1」設定にして、コンテナを起動状態にしておきます。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/da5facf6-f4ca-dca4-9738-eeec3d0f3e2a.png)

概要ページから「停止」ボタンを押してみます。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/af0d56cd-4d7b-86ea-d496-79c054a14c26.png)

確認画面が出てきます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/fb826952-bfba-7014-350f-1dc1b6b8a65e.png)

数秒で止まりました。StatusはStoppedになりました。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/3ed3cdd0-7009-e09e-38a4-c8bb6a709f37.png)

リビジョンの画面から確認します。
実行の状態は「停止」、レプリカの合計数は「0」になりました。
ちゃんとコンテナは停止状態（課金されない状態）にできていそうです。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/84db0fff-8608-9460-946c-1ccf94a7aa0e.png)

これまではAzure Portalからは停止ができなかったので、課金を抑えようと思うと「0-1」スケールに切り替えて0スケーリングさせておく必要がありました。検証目的で使いたい時だけ起動したいのであれば、今後は停止ボタンから止めるのが良いですね。
Gitで作成したタグを付け直したい

# 1. はじめに
* Gitでタグを追加した時に名前の間違いに気づき即修正したい
* ローカル、リモートリポジトリ両方で修正したい

# 2. 開発環境
* Git

# 3. Gitコマンド
* ローカルリポジトリのtagの削除
```git tag -d Prototype1.0.0```

* リモートリポジトリへpush
```git push origin --delete Prototype1.0.0```

* ローカルリポジトリにtagを追加
```git tag -a Prototype1.0.1```

* リモートリポジトリへpush
```git push origin --tags```

# 4. 注意事項
* 基本は名前を間違えないようにして実施しないようにする

# 5. 参考文献

https://zenn.dev/heyhey1028/articles/9ae35cf35c410d

https://qumeru.com/magazine/528
19mmポールのスチールラックに25mm用の後付け回転テーブルを取り付ける

# はじめに
ラックの内容物を試行錯誤している内に、後付けラックが付けば死にスペースを活かせるのでは？ となることはわりとある。
ただ、後付けラックって25mm用のものばかりで、寸法から違うのでなんともならない（と思う）。
![IMG_2231.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/527fd64d-e24e-2f03-cf25-1fd4d60e5209.jpeg)
しかしここに、回転テーブルとかいう1本のポールしか使わない棚があるじゃないか。19mm用のものは、、ないが。

でもまあ、ポールの径しか違い無いんだからなんとかなるんじゃね？ などと思い工作して1〜2週間経過しても問題なく機能しているので投稿。

# 準備する物
+ 19mmのスチールラック
+ 後付け回転テーブル
+ 厚さ3mm幅良い感じのゴム
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/54741429-31f4-c882-f4ce-0b95509b384e.jpeg)（幅30mmだと少し足りない。多分50mmがベスト？）
+ 念のためビニールテープ

このために19mmのスチールラックを用意するというのは何か間違っているので、準備する物に含めない方が適切かもしれない。

# 作業
準備がシンプルすぎて何をしたかはバレバレだと思う。
+ ゴムを60mmくらい（ポール外周長さ）に切る
+ はめる
![IMG_2233.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/4430d89a-f347-1438-25d2-4d304b21f189.jpeg)
+ 閉じる
+ 余ってるゴムで数mmの破片をいくつかつくり、上から隙間埋めする
+ 棚を付ける
+ 下側を念のためビニテで固定
![IMG_2240.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731833/248dcea2-e1f4-ab79-8618-a20aba1d57a3.jpeg)

完成！
雑！
ビニテ、正直ゴム部分の真下しか留めてないからマジで意味ない説ある。

# 結果
19mmのスチールラックに25mm用の回転テーブルを付けられる！

# 最後に
当然、想定されたの使用方法ではないので耐荷重は推して知るべし。
あまり重い物を載せてはならない。
JAR実行でApache POIが非常に遅くなる原因を調べる

# 1. はじめに
* EclipseでApache POIを実行すると早いけど、JARファイルから実行すると非常に遅くなる
* 遅くなる原因を解決したい

# 2. 開発環境
* Apache POI 
* Eclipse
* Java

# 3. 原因
* 生成されるJARに必須ライブラリをパッケージすると遅くなるらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/100d51b9-f280-7034-bc4a-f43eb983f376.png)

https://stackoverflow.com/questions/65773278/apache-poi-extremely-slow-when-exporting-runnable-jar-with-package-option-in-ecl

# 4. 解決方法
* サブフォルダに必須ライブラリをコピーすると改善した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6d181613-5bc0-b841-48c9-7fcc1a0da50c.png)

# 5. 参考文献

https://stackoverflow.com/questions/65773278/apache-poi-extremely-slow-when-exporting-runnable-jar-with-package-option-in-ecl
ローカルSAとDWConvはよく似てる【dynamic DWNet】



**原論文**
On the Connection between Local Attention and Dynamic Depth-wise Convolution
https://arxiv.org/pdf/2106.04263.pdf





# 結論
ローカルSAとDWConvの情報集約範囲は似ているので，ローカルSAをローカルSAに似せた動的なDWConvへ置き換える．


# 概要
画像認識分野でCNNやViTがある．それぞれのモデル構造がどのような位置の情報を取り入れているかを下図に示す．


- (a) 通常の畳み込み
- (b) グローバルSA
- (c) DWconvとローカルSA
- (d) チャンネルMLP（FFN）と1x1Conv
- (e) 全結合層MLP

![スクリーンショット 2024-03-09 18.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/1c4995ea-e51c-467e-bce7-6c5d1d18f782.png)



(c)のDWConvとローカルSAの違いは，静的か動的なパラメータを持っているかの違いである．なら，動的なパラメータを持つDWConvは，ローカルSAとほとんど一緒なんじゃない？の動機で，SwinのローカルSAの構造を動的なパラメータをもつDWConvに置き換える．これにより，計算量が削減でき，精度向上する．



# モデル構造
SwinのローカルSAの構造を動的なパラメータをもつDWConvに置き換える．動的なパラメータは主に2つある．1つめは，SENetのように，空間情報をGAPで圧縮して，各チャンネルの重要度付けを行う（SE）．２つめは，動的なカーネルで，より関連度の高い画素の情報を集約するために，正方形のカーネルを変化させる（オフセット）．



# 実験
dynamic DWNet（SE導入）．i-dynamic DWNet（オフセット導入）のImageNet精度は良い結果．

![スクリーンショット 2024-03-09 18.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/0de75078-bf8f-1477-c904-827ef19a7aa5.png)




# まとめ
今回は，ローカルSAとDWConvはよく似てる【dynamic DWNet】について解説した．ローカルSAは，畳み込みに寄せて設計しているので，畳み込み側がさらにSAに寄せて，置き換えた．SAの計算が大きいので計算量削減に良い．
Eclipseでスクラッチブックを使用してみる

# 1. はじめに
* Javaで開発中にちょっとしたコードを試したい
* EclipseのScrachBookを使用したい

# 2. 開発環境
* Eclipse All in One
* Java

# 3. スクラッチブックの作成
* 新規作成からスクラッチ・ページを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/9d040b6f-ffcc-1764-d98d-0a07d0725500.png)

# 4. サンプルコード
## 4.1. 事前準備
* スクラッチページで右クリックをして、インポートの設定を選択する必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8875c871-2c3a-da8c-21d5-eac548527ed1.png)

* 必要なインポートを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/22c38364-e318-456d-d983-9fc80cb92307.png)

## 4.2. ソースコード
```java:
// import
// java.util.Arrays
// java.util.List

// code
List<String> list = Arrays.asList("a", "b", "c");

// Listに含む場合
System.out.println(list.contains("a"));

//Listに含まない場合
System.out.println(list.contains("z"));
```

## 4.3. 実行方法
* 実行する行を選択してから実行を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b72b6ee0-0a55-a927-1632-6898645cd748.png)

```
// 実行結果
true
false
```

# 5. 参考文献

https://sw-dev-blog.symmetric.jp/archives/10
Pythonで「type関数の使い方(オブジェクトの型を取得する)」の動作を確認してみた

# 概要

Pythonで「type関数の使い方(オブジェクトの型を取得する)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/function/index7.html

# 実装

以下のファイルを作成しました。
```sample.py
print(type("str"))
print(type(100))
print(type(14.5))
print(type(7.0 + 5j))
print(type([1, 2, 3]))
print(type((1, 2, 3)))
print(type({1:"A", 2:"B", 3:"C"}))
print(type(True))
print(type(None))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
<class 'str'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'bool'>
<class 'NoneType'>
```

# まとめ

何かの役に立てばと。
MatrixGaming

保存して実行してください。
https://qiita.com/berry-clione/items/259fb147be386be9ce04
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RGB Background Color Change</title>
<style>
  body {
    margin: 0;
    padding: 0;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .color-change {
    width: 300px;
    height: 300px;
    transition: background-color 0.5s ease-in-out;
  }
</style>
</head>
<body style="margin: 0;">
  <canvas id="q"></canvas>
<div class="color-change"></div>

<script>
  var width = q.width = window.innerWidth; // ブラウザ画面の幅
  var height = q.height = window.innerHeight; // ブラウザ画面の高さ
  window.onresize = function(){
    width = q.width = window.innerWidth;
    height = q.height = window.innerHeight;
  }
  var fontS = 15
  var letters = Array(256).join(1).split('');
      // Matrix rainで降らせる文字（日本語を入れてもよい）
  var matrix = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789@#$%^&*()*&^%";

    var draw = function () {
      q.getContext('2d').fillStyle=`rgba(0,0,0,.05)`;
      q.getContext('2d').fillRect(0,0,width,height);
      q.getContext('2d').fillStyle=`rgb(${red},${green},${blue})`;
      letters.map(function(y_pos, index){
      text = Math.floor( Math.random() * fontS );
      text = matrix[Math.floor(Math.random() * matrix.length)];
      x_pos = index * fontS;
      q.getContext('2d').fillText(text, x_pos, y_pos);
      q.getContext('2d').font = `${fontS+2}px 'Monaco'`; // MonacoはMacOS標準搭載のフォントらしい。コメントアウトするとcanvasデフォルトのフォントとなる
      letters[index] = (y_pos > 0 + Math.random() * 1e4) ? 0 : y_pos + fontS;
      });
    };
  setInterval(draw, 30); // Matrix rainが降ってくる速さ
  // JavaScript to change background color
  const div = document.querySelector('.color-change');
  let red = 255;
  let green = 0;
  let blue = 0;
  let r = true;
  let g = true;
  let b = false;
  let step = 1;

  function changeColor() {
    if(!g){
      if(green > 0){
        green-=step;
      }else{
        //赤0緑0青255
        r = true;
      }
    }else{
      if(green < 255){
        green+=step/2;
      }else{
        //赤255緑255青0 １番 赤→黄色→緑→アクア→青→紫→赤
        r = false;
        g = true;
      }
    }

    if(!r){
      if(red > 0){
        red-=step;
      }else{
        //赤0緑255青0　緑→アクア→青
        b = true;
      }
    }else{
      if(red < 255){
        red+=step;
      }else{
        //赤255緑0青255
        b = false;
      }
    }
    if(!b){
      if(blue > 0){
        blue-=step;
      }else{
        //赤255緑0青0
        g = true;
      }
    }else{
      if(blue < 255){
        blue+=step;
      }else{
        //赤0緑255青255
        g = false;
      }
    }
    
    div.style.color = `rgb(${red}, ${green}, ${blue})`;
  }

  setInterval(changeColor, 10); // Change color every 50 milliseconds
</script>

</body>
</html>

```
ABC300以降のグラフ問題を総復習したい

# はじめに
グラフに苦手意識があるのでグラフ精進をしようと思います．
直近のグラフ出題をまとめている人が調べた限りいなかったので
自分でまとめました．

# グラフ
※ 範囲はABC300以降のC~F問です．
　 範囲を広げてほしい方がいれば言ってください
[ABC302-E - Isolation](https://atcoder.jp/contests/abc302/tasks/abc302_e)
[ABC303-E - A Gift From the Stars](https://atcoder.jp/contests/abc303/tasks/abc303_e)
[ABC304-E - Good Graph](https://atcoder.jp/contests/abc304/tasks/abc304_e)
[ABC305-E - Art Gallery on Graph](https://atcoder.jp/contests/abc305/tasks/abc305_e)
[ABC305-F - Dungeon Explore](https://atcoder.jp/contests/abc305/tasks/abc305_f)
[ABC309-D - Add One Edge](https://atcoder.jp/contests/abc309/tasks/abc309_d)
[ABC311-C - Find it!](https://atcoder.jp/contests/abc311/tasks/abc311_c)
[ABC318-D - General Weighted Max Matching](https://atcoder.jp/contests/abc318/tasks/abc318_d)
[ABC324-F - Beautiful Path](https://atcoder.jp/contests/abc324/tasks/abc324_f)
[ABC328-E - Modulo MST](https://atcoder.jp/contests/abc328/tasks/abc328_e)
[ABC333-D - Erase Leaves](https://atcoder.jp/contests/abc333/tasks/abc333_d)
[ABC334-E - Christmas Color Grid 1](https://atcoder.jp/contests/abc334/tasks/abc334_e)
[ABC335-E - Non-Decreasing Colorful Path](https://atcoder.jp/contests/abc335/tasks/abc335_e)
[ABC338-F - Negative Traveling Salesman](https://atcoder.jp/contests/abc338/tasks/abc338_f)
[ABC341-F - Breakdown](https://atcoder.jp/contests/abc341/tasks/abc341_f)

# やり方
とりあえず，スクレイピングで「グラフ」が含まれる問題を抽出しました．
なのでグリッドとかグラフ問題に帰着が必要な問題は拾えていませんすいません，，
拾う判定を入力形式とか解説まで広げたらもっと増えると思うので，
暇なときにやろうと思います．

```python

# Atcoder ABCの問題ページにアクセスする
# 特定のワードが含まれる問題をcsvファイルに出力する

import requests
from bs4 import BeautifulSoup
import csv
from time import sleep
import random

# 問題に含まれるワードを入力
# string = input('input word: ')
string = 'グラフ'
file_name = 'graph.csv'

# 参照範囲を設定
list = []
for num in range(300,350):
    for level in ('c','d','e','f'):
        
        # アクセス前に1秒前後待機
        sleep(random.uniform(0.8, 1.2))
        url = 'https://atcoder.jp/contests/abc' + str(num) + '/tasks/abc' + str(num) + '_' +level

        try:
            response = requests.get(url)
            response.raise_for_status()  # ステータスコードが200でない場合は、エラーを発生させる

            # BeautifulSoupオブジェクトを作成し、HTMLを解析
            soup = BeautifulSoup(response.text, 'html.parser')

            # 問題文を取得
            title = soup.find('span', class_='h2').text.split('\t')[3][:-1]
            elements = soup.find('div', class_='part').find_all()

            for element in elements:
                for row in element:
                    if string in row:
                        print(f'[ABC{num}-{title}]({url})')
                        list.append([num,level,title,url])
                        break
                else:continue
                break

        # urlが存在しないときは無視
        except requests.exceptions.RequestException as e:
            print(f"URL {url} にアクセスできませんでした: {e}")

with open(file_name, 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['num','level','title','url'])
    for num,level,title,url in list:
        writer.writerow([num,level,title,url])
```
白で囲まれた領域・クラックを埋める【道具としての OpenCV 画像認識】

# 本記事でできること
元画像
![image_with_black_hole.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/55f3524b-e7ec-03ff-adc3-8dcc43e5e080.jpeg)

白埋めした画像
![Screenshot from 2024-03-09 18-01-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/30a3378d-91d1-f1a8-90d4-71eecb984354.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 白で囲まれた領域・クラックを埋める
画像認識フィルターで対象物体を認識するとき、たとえば白い対象物体の中央にロゴやイラストなどがある場合、色や明るさでフィルターすると、中央部分が黒く欠けてしまう場合があります。この欠けをなくしたいケースがあります。また、対象物体のキズやクラックを認識してその画像領域を白く塗りたいこともあります。本記事では、白で囲まれた領域を白く塗って埋めるプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
cv::Mat fill_black_hole(const cv::Mat& image) {
    cv::Mat filled_image = convert_grayscale(image);
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(filled_image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
    for (int i = 0; i < (int)contours.size(); i++) {
        cv::drawContours(filled_image, contours, -1, cv::Scalar(255), -1);
    }
    return filled_image;
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

cv::Mat convert_grayscale(const cv::Mat& image) {
    const int grayscale_channel_num = 1;
    if (image.channels() == grayscale_channel_num) {
        return image.clone();
    }
    cv::Mat gray_image;
    cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
    return gray_image;
}

cv::Mat fill_black_hole(const cv::Mat& image) {
    cv::Mat filled_image = convert_grayscale(image);
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(filled_image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
    for (int i = 0; i < (int)contours.size(); i++) {
        cv::drawContours(filled_image, contours, -1, cv::Scalar(255), -1);
    }
    return filled_image;
}

int main(void) {
    std::string file_path = "../data/image_with_black_hole.jpg";
    const cv::Mat loaded_image = load_image(file_path);

    const cv::Mat filled_image = fill_black_hole(loaded_image);

    cv::imshow("window", filled_image);
    cv::waitKey(0);
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
31x31：大きいカーネルの畳み込みは有効か？【RepLKNet】



**原論文**
Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs
https://openaccess.thecvf.com/content/CVPR2022/papers/Ding_Scaling_Up_Your_Kernels_to_31x31_Revisiting_Large_Kernel_Design_CVPR_2022_paper.pdf


# 結論
カーネルサイズ31の畳み込みは，受容野が大きくて有効である．また，受容野の広い認識をするViTと同じような認識特性を持つようになった．


# 概要
画像認識モデルでCNNとViTがある．ViTはなぜ高精度なのか？いくつかの研究では，Multi-head SAが重要な役割を果たしていると考えられている．他にも，帰納的バイアスが小さいことや動的なパラメータを持つことなどが言われている．この論文では，ViTの大きな受容野に注目する．

通常のCNNモデルの場合は，stem以外で大きなカーネルは採用されない．受容野の大きい畳み込みはどのような良い点があるのだろう．以下に結果の傾向をまとめる
- 大きなカーネルでも効率的に動作する
- 大きなカーネルはスキップ接続が重要である
- 小さなカーネルで際パラメータ化し，最適化される
- ImageNetで有効，下流タスクも有効
- 小さな特徴マップでも大きなカーネルが有効

従来研究で，モデルの深さや幅，解像度を大きくしてみる．けど，カーネルについては無視されてる現状．




# 大きいカーネルの利点
利点を以下に示す．


## 大きなカーネルでも効率的に動作する
通常大きいカーネルは計算量が増えて，遅くなるが，DWconv（深さ方向の畳み込み）で大幅に改善する．
RepLKNetでは，カーネルサイズを[3, 3, 3, 3]から[31, 29, 27, 13]に増加させても，FLOPsは18.6%，パラメータ数は10.4%増加するだけで許容範囲である．


## 大きなカーネルはスキップ接続が重要である
DWConvのカーネルを3×3から13×13に置き換える．大きなカーネルを使用するモデルのスキップ接続を外すと極端に精度低下する．スキップ接続によるアンサンブル効果がなくなるから．


## 小さなカーネルで際パラメータ化し，最適化される

7x7convと3x3convを並列に学習する．学習後，3x3convとBVパラメータを7x7Convに統合する．小さなカーネルの情報を継承することは，グローバルとローカルの情報を集約できて精度向上する．

![スクリーンショット 2024-03-09 17.34.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/5e7f7337-1dd3-77e1-0144-a73850d381d2.png)


## ImageNetで有効，下流タスクも有効
カーネルサイズが[3, 3, 3, 3]から[31, 29, 27, 13]に増加すると，ImageNetの精度は0.96%しか向上しませんが，ADE20KのmIoUは3.12%向上する．その理由の考察
- 物体検出では有効需要や（ERF）が重要
- 受容野が広がって，認識特性が形状重視になったから，物体検出で有効
- 形状重視が下流タスクで有効（だからViTは下流タスクで有効）
- CNNはテクスチャ重視だが，カーネルサイズ大きくすると形状重視になる




## 小さな特徴マップでも大きなカーネルが有効
13x13の特徴マップでも7x7の畳み込みが有効である．一般的に，カーネルサイズが大きくなると、CNNの並進等価性（位置のずれ）は厳密には保たれなくなる．
赤い範囲の情報は，出力でも赤い範囲に情報が残り，位置のずれに有効となる訳ではない．



![スクリーンショット 2024-03-09 17.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/3fd1e692-4776-2a7f-930c-115d9a8fa291.png)



# モデル構造
モデルはSwinを参考にMSAの部分をカーネルの大きい畳み込みに置き換える．
stemと各ステージ間は畳み込みでダウンサンプリングされる．RepLK Blockで広いカーネル．ConvFFNでチャンネル方向の認識をする．







![スクリーンショット 2024-03-09 17.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/83a4b33a-14ea-790e-4412-3438577cfa2e.png)




# 実験
いろんなカーネルサイズで実験した．

![スクリーンショット 2024-03-09 17.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/5ae77a54-f437-4c7e-48e6-1f36140c1c3f.png)


広いカーネルは，小さいカーネルとは対照的に画像の形状を重視する傾向にある．これは，ViTと同じ傾向で，広い受容野は認識対象のテクスチャでなく形状を重視する傾向である．




# 議論
受容野は，層ではなく．カーネルサイズに比例する．受容野を大きくしたくて，層をむやみに増やすと，最適化の複雑さをもつ．なので，単純にカーネルサイズを大きくした方が効率的に受容野が大きくなる．

下図で，ResNetの101層と152層の受容野はほとんど変わらない．けど，カーネルサイズを13，31と増やすと受容野が大きくなる．

![スクリーンショット 2024-03-09 17.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/a5c8cf1b-249b-65fa-f71b-8040352967d9.png)



# まとめ
31x31：大きいカーネルの畳み込みは有効か？【RepLKNet】について解説した．ViTの受容野が広いので受容野の広い畳み込みをしたら，ViTと同じような認識特性になる．ローカル認識とグローバル認識どちらも大切．
Dockerでngrokを使いたい！



# はじめに

- ハンズオン[^1]イベントを開催したい。
- 題材の都合上、サーバーを外部公開したい。
- よって、ngrok[^2]を使用する。できればngrokの操作は最小限にしたい。
- もともとdockerは使用する予定

ということで、ngrokもdockerの中に入れちゃえ！ということに。

無事動いたので、備忘録として残します。

[^1]: ハンズオン：実際にコードを書きながら学ぶこと

[^2]: ngrok：自分のPC上で動くサーバーに、そのPC以外からもアクセスできるようにするやつ

# ngrok in Docker

```yml:docker-compose.yml
services:
  apache:
    image: httpd:2.4
  ngrok:
      image: ngrok/ngrok:latest
      environment:
        NGROK_AUTHTOKEN: ${NGROK_AUTH}
      command: ["http", "apache:80"] # "apache"サービスはデフォルトで80番ポートにて稼働
      depends_on:
        - apache
      ports:
        - "4040:4040"
```

はい。これです。解説していきます。

## 使用した docker image
- 検証用に表示するサーバーはapacheを利用しています。imageの名前は`httpd`です。
  ```yml
    apache:
      image: httpd:2.4
  ```
（このコードでの`apache`はサービス名であり、なんにでも書き換えて大丈夫です。`web`や`hoge`など）
<br>

- ngrokのイメージは公式と、そうでないものがありました。
  最初は公式でないものを使用しましたが、コンテナを再起動するとバグったため、公式のものを使用。
  公式のマニュアルは[こちら](https://ngrok.com/docs/using-ngrok-with/docker/)
  ```yml
    ngrok:
        image: ngrok/ngrok:latest
  ```

## ngrok その他

- 認証設定
  ```yml
        environment:
          NGROK_AUTHTOKEN: ${NGROK_AUTH}
  ```
  
  環境変数[^3]として、authトークン[^4]の設定をしています。
  `${NGROK_AUTH}`というのは、`.env`という同じ階層のファイルで定義しています。
  
  ```:.env
  NGROK_AUTH=あなたのauthトークン
  ```

- apacheとngrokをつなげる
  ```yml
        command: ["http", "apache:80"] # "apache"サービスはデフォルトで80番ポートにて稼働
  ```
  これで、ngrokが提供する公開URLへアクセスすると、apacheサービスの80番ポートへ転送されるようになりました。
  （apacheサービスは80番ポートでサーバーへのアクセスを受け付けています。）

- apacheの後にngrokを実行する
  apacheサービスを作った後にngrokサービスを作るようにします。
    ```yml
          depends_on:
            - apache
    ```

- localhostへのアクセスをngrokへつなぐ
  ```yml
        ports:
          - "4040:4040"
  ```
  非常にややこしいんですが、前半の`4040`は「このPCの4040番ポート」を指し、後半の`4040`は「ngrokサービスの4040番ポート」を指します。
  具体的に、`localhost:4040`へのアクセスが、ngrokサービスの4040番ポートへのアクセスになります。
  （ngrokサービスは4040番ポートでサーバーへのアクセスを受け付けています。）

[^3]: 環境変数：プロジェクト全体で使う、変数に入れたデータ
[^4]: authトークン：認証用文字列。「この文字列を知ってるってことは、通していい人だ！」って判断してもらう。

# おわりに

以上、ざっくりとした説明でした。

興味ある方はやってみてください。おそらくどんなdocker containerも外部公開できるようになるはずです。
VScodeのエディター背景に薄っすらショートカット一覧表を表示する(拡張機能不使用)

VScodeのショートカットキーあんまり覚えてないけど毎回Ctrl+K Ctrl+Rでショートカットのヘルプを開くのもめんどくさいなぁ…
ということでVScodeの背景に常に薄っすらショートカット一覧が表示されるようにしました。
拡張機能を勝手にインストールできない会社の業務用PCでも使えるよう拡張機能は使わず実現します。

# 表示例
こんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570689/5d15c948-0dcf-c3af-d31f-fa58e7131d09.png)

日本語版のVScodeショートカット一覧は[こちら](https://qiita.com/aoi70/items/d61d5cf9030ac3ce55f0)の画像に階調反転・透過処理したものを使わせていただきました。

#### 使用するショートカット一覧画像
※透過処理・階調反転・透明度調整済のためほぼ真っ白に見えます
![VScode_shortcutKey_transparent_negate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570689/9f455bd5-63ae-e39b-71a0-8354cdc6ce78.png)

# 表示手順: CSSを編集する
**注：CSS編集前にファイルのバックアップを取っておくことをおすすめします。**
ファイルを書き換えた後は、VScode立ち上げ時に以下のような警告がでるようになります。
表示が出るだけで私は特に不具合なく使えていますが、CSSの編集は自己責任でお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570689/0890fd48-020b-23d2-b87b-dee34e4423c9.png)

1. `workbench.desktop.main.css`を開く
VScodeインストール先の`\Microsoft VS Code\resources\app\out\vs\workbench\workbench.desktop.main.css`に入っているはずです。

1. 末尾に以下の設定を追加
```css
.monaco-editor,.monaco-editor-background {
    background: url(画像ファイルのパス) no-repeat;
    background-position:right top;
    background-size:contain;
}
```

これでエディター部分に背景画像が表示されるようになるはずです。

# おまけ
上記では画像自体に透明度調整をかけていますが、普通に手持ちの風景画像とかを表示したい場合はCSSで透明度調整することになると思います。
その場合は`opacity`を設定して透明度を調整するとよいと思います。`opacity: 0.7;`くらいがちょうどいいかも？
ただ、この場合はエディター部分全体が薄っすら透明になるので背景以外の文字なども多少見た目が変わります。

拡張機能を使うのであれば「壊れている可能性が～」の警告も出ませんし、透明度の設定も不要になるので、何らかの理由で拡張機能を入れられないという人以外は素直に拡張機能を使うのがベターだと思います。

一応、拡張機能を使って背景画像にショートカット一覧を表示したいという人向けに不透明度調整なしの画像も貼っておきます。※これもほぼ真っ白に見えると思います
![VScode_shortcutKey_transparent_negate_origin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570689/41da3b09-ffb6-a6b2-6705-6d86ce51c52b.png)

# 参考URL
- [Visual Studio Code キーボードショートカット一覧（チートシート）](https://qiita.com/aoi70/items/d61d5cf9030ac3ce55f0)
- [Visual Studio Codeでフォントサイズをいい感じにする](https://qiita.com/tkyaji/items/45d5f88047e99c29dda2)
- [VSCodeとターミナルに背景画像を加えたらプログラミングがちょっと楽しくなるよ](https://qiita.com/samuraibrass/items/da38aab503f576629211)
- [Visual Studio Code のデバッグコンソールとかに背景画像を設定したい](https://od10z.wordpress.com/2018/12/31/set_vscode_debugconsole_bgimage/)
- [workbench.colorCustomizationsを用いた痛Visual Studio Code化](https://artfulplace.hatenablog.com/entry/2017/05/21/115110)
pf.confでalias設定したIPアドレスを対象外にする

弊社システムにパケットフィルタを導入する際、alias設定したIPアドレスと派生元のIPアドレスの通信（実質自分から自分へのパケット）が遮断されて困った。
解決方法を見つけたので、備忘録として残す。

## 前提
- OS：QNX Neutrino
- パケットフィルタはpfで実施
- システムは固有のIPアドレスを持つ複数の機器で構成されている
- 顧客環境によって、一部の機器はスタブに置き換えて最低限の機能だけを模擬する
- 各スタブはメインマシン上で動作し、alias設定した固有IPアドレスを割り当てられる

## 結論
- インターフェース名に「:0」オプションを付けて、エイリアスをパケットフィルタの対象外にする
`:0		   Do not include interface aliases.`

https://man.freebsd.org/cgi/man.cgi?pf.conf(5)

- 例えば以下のように記載すれば、alias以外のIPアドレスだけをブロックできる
```pf.conf
block on if1    -> aliasを含めて、if1内の全IPアドレスに適用
block on if1:0  -> aliasを含まない、if1内のIPアドレスに適用
・・・以下、if1の必要ポートのみ開ける処理を記載・・・
```
生成AI関連で逮捕された海外の事例を見てみる

# 導入

現在、生成AIが一般人に簡単に使えるようになったことで、その素晴らしさが至るメディアで語られている。そこで、一度立ち止まってその素晴らしさがどのように悪用されているのかにも注目してみたい。


## 海外Webサイトの記事

**➀  Florida Middle Schoolers Arrested for Allegedly Creating Deepfake Nudes of Classmates**

https://www.wired.com/story/florida-teens-arrested-deepfake-nudes-classmates/

**題名:**
フロリダの中学生が同級生のディープフェイクヌード画像を作成した容疑で逮捕される
**記事内容要約:**
フロリダ州の10代の少年2人が、同級生のAIで生成したヌード画像を共有した容疑で逮捕された。これは、AIで生成したヌード画像の共有で刑事告発された初の事例と見られる。


**➁  5 Beverly Hills middle school students expelled following AI-generated nude photo scandal**

https://www.cbsnews.com/losangeles/news/5-beverly-hills-middle-school-students-expelled-following-ai-generated-nude-photo-scandal/

**題名:**
AIが生成したヌード写真スキャンダルを受け、ビバリーヒルズの中学校の生徒5人が退学処分に
**記事内容要約:**
ビバリーヒルズの中学校で、生徒のAIによるヌード写真のスキャンダルが発覚し、関与した5人の生徒が退学処分となった。被害に遭った生徒は16人に上る。

**➂　Revealed: the names linked to ClothOff, the deepfake pornography app**

https://www.theguardian.com/technology/2024/feb/29/clothoff-deepfake-ai-pornography-app-names-linked-revealed

**題名:**
明らかになった：ディープフェイクポルノアプリ「ClothOff」に関連する名前
**記事内容要約:**
「Clothoff」というディープフェイクAIポルノアプリの開発者の名前が明らかになった。このアプリは、著名人や一般人の画像をヌードに変換することができる。

**➃　State, local organizations fighting AI-related child sex crimes in Arkansas**

https://www.5newsonline.com/article/news/crime/ai-generated-child-abuse-arkansas/527-206898d4-99c7-448c-ab1e-f19f5366866a

**題名:**
アーカンソー州で、州と地方の組織がAI関連の児童性犯罪と戦う
**記事内容要約:**
アーカンソー州で、AIが生成した児童虐待画像を所持していた男が逮捕された。この事件は、AIが児童虐待コンテンツの作成に悪用される可能性を示している。




**⑤　New Jersey police tell public to ignore AI-generated story about Christmas shooting that never happened**

https://www.nydailynews.com/2023/12/27/fake-shooting-ai-generated-story-new-jersey/

**題名:**
ニュージャージー州警察、クリスマスに関するAIが生成した話を無視するよう市民に呼びかけ
**記事内容要約:**
ニュージャージー州で、AIが生成した銃撃事件のニュース記事が拡散され、パニックを引き起こした。この偽ニュースは、AIの悪用による誤情報の拡散の危険性を浮き彫りにした。



**➅　Magician Created AI-Generated Biden Robocall In New Hampshire For Democratic Consultant, Report Says**

https://www.forbes.com/sites/zacharyfolk/2024/02/23/magician-created-ai-generated-biden-robocall-in-new-hampshire-for-democratic-consultant-report-says/?sh=3cf7eece447f

**題名:**
報告によると、マジシャンが民主党コンサルタントのためにニューハンプシャー州でAIが生成したバイデンのロボコールを作成
**記事内容要約:**
あるマジシャンが、民主党コンサルタントのために、AIで生成したバイデン大統領のロボコールをニューハンプシャー州で行ったと報じられた。これは、AIが政治的な影響力を持つ可能性を示唆している。

### 生成AI絡みの逮捕事例を調べてみると

調べた限り、生成AIを使用して、同級生の顔に画像生成を使ってフェイクの体を付け加えることでの嫌がらせや脅し、いじめに関する記事が圧倒的に多かった。新しい技術が出てきたとき、非倫理的で悪意のある活用は逮捕や検挙によって社会で顕在化する。それが、技術の危険性の警報を鳴らす。そこから、法や規制が整備されていて、技術は社会の中で地位を確立するが、顕在化した問題がこれらの記事で挙げられた内容となっている。

他にも、児童虐待の画像生成、AIの悪用による偽記事の作成・拡散などがある。これらも一つの傾向としてみると、全体的にフェイク情報のクオリティが高く、それを作るコストも低くなっているということに尽きる。

フェイク情報を作ってはダメだし、そのようなトラブルに巻き込まれることに気を付けないといけない。
Windows１１で、なぜかvisual studioのhelloworldがビルドできなかった解決策

購入したばかりのWindowsにおいて、なぜかvisualstudioのhelloworldがビルドできなかった。
エラー文は、「指定したパスが見つからない」というエラーだった。
結果として、指定されたUserフォルダの中に、「.exe」実行ファイルが見つからないというエラーだった。

アンダーラインのファイルがでデバッグフォルダに生成されないエラー。
![wto0pp8n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3739806/b6aa90ba-3604-7e35-bd2d-6121eace7167.png)


解決策・
原因はおそらく、Windows１１から追加された下記システム

「スマート アプリ コントロール」←こいつ

この設定が原因で、対象のフォルダにアクセスできず、exe実行ファイルが作成できなかった。
この設定をoffにしたところビルドできた。

この設定をoffにしていいのかと心配になると思うが、ノートンセキュリティなどに加入しているなら
いらない機能だ。


自分もまだ初心者なので、分からないことが多いが、助けになれば幸いです。
日本語化したいバージョンのUnityに日本語のモジュールを入れる

## 事前準備
環境構築がまだの方は以下を参考にしてください。

https://qiita.com/KM9973/items/2ef2a852add2a07e9db4

## Unity Hubの設定
### Unity Hubから`日本語化したいUnityのバージョン`のメニューを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/7c143dab-f7cb-a48f-d061-4aba4bd000cd.png)

### 表示されるメニューから`モジュールを加える`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/a044e80e-3dc6-df7b-b70d-d6cf25ea6eb0.png)

### 表示されるモジュールの中から日本語を選んで加える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/fc802e94-a454-c6f1-546a-f67e0fc91b9e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/fbf01684-1b60-242a-b1e9-a6eed6b7cb93.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/dfb92b94-301f-4754-56e0-61de74ace0f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/f2f5a141-804d-4931-a3c5-4243db911264.png)


## Unity Editorの設定

### Unity Hubのプロジェクトをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/7086e927-6726-3670-32ca-d5fe46913cf6.png)

### 表示されたプロジェクトの中から1つ選んでUnityを開く
`Unity Editor`が立ち上がって開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/37aa9a33-c2ed-058e-1d56-7f331afc7bf7.png)

### Unity Editorのメニューからeditをクリックしその後preferencesをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/f6d99b0f-de10-42e5-e00a-4964a89988a0.png)

### languageを選んでクリックする
### Editor Languageを日本語にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/9c368888-4a38-d5b5-d381-3c86f86ebf04.png)

### 日本語に変わらないときは・・・
言語が日本語に設定できたのに、`Unity`の表示が英語のままの場所がある場合には、一度`Unity`を再起動すれば日本語になります。
Centosにmysqlをインストールし初回接続

#### 初めに
LAMP開発でよくあるcentos + mysqlの環境構築

#### 環境
 - Centos 7.9.2009
 - インストールされたmysql: 8.0.31 for Linux on x86_64（MySQL Community Server (GPL)）


##### 手順
 - レポジトリ作成
 ```
 yum localinstall http://dev.mysql.com/get/mysql80-community-release-el6-7.noarch.rpm
 ```

 /etc/yum.repos.d配下にレポジトリが生成されたのを確認
 ```
 ls -al /etc/yum.repos.d | grep mysql
 ```
**mysql-community-debuginfo.repo**
**mysql-community-source.repo**
**mysql-community.repo**

 - インストール
 ```
  yum install -y mysql-community-server
  ```

 - 初回（デフォルト）パスワードでのログイン
 Linuxのディストリビューションによる違いはあるが首記の環境だとroot用のパスワードが自動生成される。
 /var/log/mysqld.logに出力されるので
 ```
 grep "temporary password" /var/log/mysqld.log
 ```
 で検索。
 下記のような感じで出力されているので
 A temporary password is generated for root@localhost: <自動生成されたパスワード>

  - 初回ログイン
  ```
  mysql -u root -p<自動生成されたパスワード ※オプションの間にスペース不要>
  ```
   - ログインしたらパスワードを変更
  ```
  ALTER USER 'root'@'localhost' IDENTIFIED with 'mysql_native_password'BY <新しいパスワード>;
  ```
  
   - 新しいパスワードでログイン
   ```
   exit;
   ```
   で抜けてから

   ```
   mysql -u root -p<新しいパスワード>
   ```
   で確認

   ##### このあとusersテーブルの確認・更新やgrant文の実行はあるが、一旦初期構築は終了
リベンジ！！Transformerの代替えを目指す新機構：SanokaLayer

# はじめに
私は今回、Transformerの性能を出来るだけ維持したまま計算量を減らしました。RTX2060-6GBモデルで現実的な時間内で学習させることができるレベルになりました。
ぜひ読んでください！
# 本文
最初に数式っぽい物を載せときます。
### 数式
これがSanokaLayerです。
※行列積は使いません。この式の配列同士の乗算は、同じ位置の要素で乗算をします。
$N(x) = 正規化関数$
$LinearBlock(x) = Linear(GELU(Linear(x)))$
$W_{q,k,v,o} = Linear(x)$
$AttentionBlock(q, k, v) = W_o(softmax(W_q(Q) W_k(K))W_v(V))$
$u_t = 入力$
$x_t = 潜在変数$
$y_t = 出力$

$h = AttentionBlock(N(u_{t-0}),N(x_{t-1}),N(x_{t-1}))$
$y_{t-0} = LinearBlock(N(h)) + u_{t-0}$
$x_{t-0} = h + x_{t-1}$

### 解説
まず、この式は状態空間モデル(SSM)をベースに開発されました。この式の特徴としてはまず、潜在変数の更新関数
$h_{t-0} = AttentionBlock(N(u_{t-0}),N(x_{t-1}),N(x_{t-1}))$があります。
この更新関数は、Attentionの内部動作的に、Qをフィルターとみなすと、QでVをフィルタリングするような形になります。
Qに入力を持ってきて、KVに潜在変数を使うことで入力に応じて潜在変数を変化させるような形式になります。
そしてこの式の最もユニークな点としては、潜在変数の更新時にも残差結合を適用していることです。私はRNNの形をとった機構の性能が低い原因を勾配消失・爆発にあると考えました。RNNは見方を変えれば時間が進むごとに層が深くなるとも取れます。![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619971/bae9ac95-9ee5-6ec3-140d-d3f20bf185ef.png)
![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619971/537fe2dc-689b-37f9-3ba2-8603a4a03896.png)
なので、勾配消失・爆発を起こさずに勾配を伝える為に残差結合を適用しました。
$x_{t-0} = h + x_{t-1}$
$y$を出力するのは、残差結合を採用した全結合層のブロックです。
### 性能
私の保有しているリソースの関係上、ベンチマークをまだ実行出来てませんが、軽くファインチューニングして完成した会話AIの実際の出力を載せときます。
~~~
Q> ラインちゃんのお母さんは誰？
A> ままは配信だよ！

Q> ラインちゃんの彼女は？
A> それは秘密だよ！

Q> チョコチップクッキーは好きですか？
A> いいもいいよ！
~~~
Qが質問（人間）
Aが回答（AI）です。
このAIの全結合層は入力も出力も512次元で、447万トークンしか事前学習に使用しておらず、RTX2060-6GBモデルで10時間しか合計で学習させていないので性能が低いのはご了承ください。
しかし、RTX2060程度のGPUで10時間学習させるだけでこの性能なら、リソースが限られる個人開発LLMのアーキテクチャとしては優秀なのではないかと思います。
# 最後に
前回の失敗作は忘れてください....本当にイキっちゃって申し訳ないです。
今回はLLMとして運用したので、最低限の性能は確実にあります。サンプルコードは近いうちにGitHubに上げときます。
[mac] シフトの予定をGoogleカレンダーに登録していくアプリ [ショートカットApp]

# 1. なぜ作ろうと思ったのか
妻の職場はシフト制で、なおかつそのシフト表は紙管理であり、
妻のスケジュールを把握して、さらにそれに応じた子どもの送迎のスケジュールを
自分のGoogleカレンダーに反映するのがめちゃ大変だったから。

# 2. どんなものを作ったのか
Appleのショートカットアプリを使って、アプリでシフトを入力したら、その内容に基づいてGoogleカレンダーにスケジュール反映してくれるプログラム。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/406ad861-1222-e634-0ed3-4a1ccf98a964.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/c72efee6-6440-b2f6-2276-5d5678d70c0a.png)

<details><summary>いつからいつまでのシフトを入力するか設定する画面</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/ad8eadad-f2f6-8f4c-4f90-d5963bc98aaf.png)
</details>

<details><summary>シフト入力画面</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/7bacdca3-f7bc-2b90-4aea-10ffeaf52f4b.png)
</details>

<details><summary>Googleカレンダーに、アプリで入力した通りに予定を反映</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/e1b718ea-240c-71a9-98f8-2bd510a82fc8.png)
</details>



# 3. ショートカットアプリの入手 と カスタマイズ方法
## 手順1.ショートカットアプリの入手
はじめに、こちらをクリックして、ショートカットを入手します。
[保育士シフト登録アプリ](https://www.icloud.com/shortcuts/192bc1f7987d47d8a35b6e0e129d510c)

また、純正のカレンダーに登録先のGoogleカレンダーを読み込んでおいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/2aeffdc3-ad35-6b64-41de-f10f462c78c9.png)

## 手順2.ショートカットアプリの編集画面から登録先のGoogleカレンダーを指定する
登録先のカレンダーを指定する詳細画面を出す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/6fe1c3ca-8305-66f6-189f-023a6f1372c4.png)

登録先のGoogleカレンダーを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/554a5720-e45e-4ccb-dd40-be537b1458d6.png)

## 手順3.「送り」「迎え」の時間帯設定
こちらはオプションです。使わない場合はブロックごと削除してしまえばOKです。
使用する場合は、条件設定、時刻設定、カレンダー指定をすべての条件分岐で行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463767/9ec4b009-d437-4aaf-33c6-ec6753982e30.png)

（おわり）