OmniAICreator/Qiita-1.07M huggingface dataset:
GoでBOMを考慮したio.Readerを扱う

GoでBOM付きのUTF-8ファイルを扱う必要があったので、その時に知ったテクニックを共有したいと思います。

具体的に言えば、Excelでファイル形式を`「CSV UTF-8 (コンマ区切り) (.csv)」`として保存した際のCSVファイルを扱った時の話です。
（Excelや少し前のメモ帳などでUTF-8としてファイルを保存すると、BOM付きのUTF-8ファイルになります。[^1]）

[^1]: 最近のメモ帳はBOMなしUTF-8が標準になったようです。

## BOM(Byte Order Mark)とは

BOM(Byte Order Mark)というのは、Unicode系の符号化方式（UTF-8やUTF-16など）の場合に、どの符号化方式であるかが分かるように先頭に付ける数バイトのデータのことです。
より詳しい説明についてはWikipediaの[バイト順マークのページ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)などに譲ります。

このBOMというのはテキストデータの一部ではないので、プログラムで処理する時には、BOMということを認識した上で適切に読み飛ばす必要があります。

また厄介なことに、BOMがついていないケース（特にUTF-8）というのもあるため、一般的にはBOMがあってもなくてもうまく読み込めるような実装を求められることも多いでしょう。

## BOMを考慮してファイルを読み込む

さて、GoでBOMを考慮してファイルを読み込むにはどうしたらよいでしょうか。

以下のように[transform.NewReader](https://pkg.go.dev/golang.org/x/text@v0.11.0/transform#NewReader)と[unicode.BOMOverride](https://pkg.go.dev/golang.org/x/text/encoding/unicode#BOMOverride)を利用すると、BOMを考慮した`io.Reader`（Goにおける入力ストリームのインターフェース）を簡単に得ることができます。[^2]

```go
// fallback := transform.Nop
fallback := unicode.UTF8.NewDecoder()
r := transform.NewReader(input, unicode.BOMOverride(fallback))
```

この`io.Reader`を使うと、次のような動作になります。

- BOMがない場合: `fallback`で指定した`Decoder`（この場合はUTF-8）で読み込む
  - `transform.Nop`を指定した場合は、何も変換されずにそのまま読み込む
- BOMがある場合: （BOMを解釈して）UTF-8, UTF-16BE, UTF-16LEを自動認識して読み込む
  - 読み込まれた文字列はUTF-8に変換される

BOMがあってもなくても気にせずに読み込める上に、UTF-16にも対応できます。

この方式の良いところは、`bufio`などを使って難しいコードを書かなくてよく、`fallback`の部分も引数に直接書いてしまえば、実質一行で対応できるところです。

### 補足: fallbackについて

`fallback`の部分には今回は`unicode.UTF8.NewDecoder()`を指定しましたが、**何も変換処理をしない**`Transformer`である`transform.Nop`を使ってもよいと思います。

その場合は、何も変換されずにそのままのバイト列として読み込まれるので、BOMなしのUTF-8であれば、そのままUTF-8として扱えます。
しかし、Shift_JISなどUTF-8以外のものを読み込んだ場合には、そのままShift_JISなどのバイト列として読み込まれてしまいます。

一方で、`unicode.UTF8.NewDecoder()`を指定した場合は、UTF-8以外のデータを読み込ませると、UTF-8に変換できない値については、文字化け時によく見かける「�」（`U+FFFD`）に変換されて、**UTF-8として妥当な文字列**として読み込まれます。

どちらも想定外のエンコーディングという点では同じですが、前者が得体の知れないバイト列として読み込まれるのに対して、後者は見た目上は文字化けしているとはいえUTF-8のデータとしては正しいバイト列として読み込まれる点が異なります。

このあとの処理で、読み込んだデータが（謎のバイナリ値ではなく）妥当な文字列であると想定してコードを書くなら、後者のほうが安全かなと個人的には思いました（どういう処理をするか、要件にもよると思います）。

[^2]: 共に[golang.org/x/text](https://pkg.go.dev/golang.org/x/text@v0.11.0)モジュールのものです。

### 完全なサンプルコード

上記のコードを利用したサンプルコードです。
処理内容に意味はありませんが、得られた`io.Reader`をそのまま気にせず扱えることがわかるかと思います。

```go
package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"

	"golang.org/x/text/encoding/unicode"
	"golang.org/x/text/transform"
)

func main() {
	// 標準入力か引数で指定されたファイルを入力とする
	input := os.Stdin
	if len(os.Args) > 1 {
		f, err := os.Open(os.Args[1])
		if err != nil {
			panic(err)
		}
		defer f.Close()
		input = f
	}

	// fallback := transform.Nop
	fallback := unicode.UTF8.NewDecoder()
	r := transform.NewReader(input, unicode.BOMOverride(fallback))

	csvr := csv.NewReader(r)
	for {
		record, err := csvr.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			panic(err)
		}

		fmt.Println(record)
	}
}
```

## さいごに

巷には以下のような面倒な処理を自作するサンプルコードやライブラリがたくさんあるのですが、今回色々調べてみて簡単に書けることがわかったので、この記事を書きました。

### 巷の手法

- `bufio`を使って先頭3バイトを`Peek`で覗く
- BOMに一致したら、そのエンコーディングの`Reader`を作って返す
- 一致しなかったら、そのまま`bufio.Reader`を返す
rootしかいないLinuxにユーザーを追加し、SSHをセットアップする

ConohaVPSを契約しDebian12を使用し始めたが、初期状態ではrootしかユーザーがいないため、ユーザーを追加する。
ついでに外部からSSHで接続できるように、設定を行う。

ユーザーはcoushとしているので、自身の環境に合わせて適時置換して欲しい。

## ユーザーの作成
※以下コマンドはrootでログインした状態で実行する。
~~~bash:bash
# ユーザーを追加する
useradd coush -m -U

# パスワードを設定する
passwd coush

# sudo を許可
usermod -aG sudo coush
~~~

## 公開鍵の作成
外部からSSHでログインできるようにしたいが、パスワードでログインできるようになっているとセキュリティ的によろしくない。そこで暗号鍵でのみログインできるように設定を行う。

まずはWindowsで鍵の作成を行う。なおこれは自分自身で1つ作って使いまわすとよい。鍵自体にはPC名・ID・メールアドレス・IPアドレスなどの情報は一切含まれないため、PCを何台も持っている場合は1つ作って全てのPCにコピーするといい。

WindowsのPowershell、Terminalから以下のコマンドを実行する。
~~~powershell:Windows PowerShell
ssh-keygen
~~~

実行すると、ユーザーフォルダ"C:\Users\coush\"の下に".ssh"というフォルダができ、中に id_rsa と id_rsa.pub にできる。
いずれも中身はテキストで、公開鍵である id_rsa.pub は見られても大丈夫だし、あちこちにコピーしていい。ただし秘密鍵であるid_rsaは決して盗まれてはいけない。

## Linuxに公開鍵を登録

さてLinuxに戻り、以下のコマンドを実行し、公開鍵を登録して秘密鍵でSSHログインができるようにする。rootユーザーのまま行う。
公開鍵をファイルで転送するのは面倒なので、ターミナルからechoを使って中身のテキストを直接ファイルに書き込む。

~~~bash:bash
mkdir /home/coush
mkdir /home/coush/.ssh

# 公開鍵を登録する
echo "id_rsa.pubの中身のテキスト" > /home/coush/.ssh/authorized_keys

# パーミッションをcoushに変更
chown coush: /home/coush -R
~~~

## SSHの設定変更

あとは、SSHの設定を変更する。sshが入っていなければ先に入れておく。
~~~bash:bash
apt install sshd -y
nano /etc/ssh/sshd_config.d/default.conf
~~~

内容を以下のように書き換える。
~~~conf:/etc/ssh/sshd_config.d/default.conf
# 鍵認証でのログインを行う
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# rootのログインを無効にする
PermitRootLogin no
# パスワード認証を無効にする
PasswordAuthentication no
~~~

設定を反映するには、sshを再起動する。
~~~
service sshd restart
~~~

外部からSSHでログインできることを確認したら、ユーザーの追加はこれで完了。

~~~PowerShell:PowerShell
ssh coush@xxx.xxx.xxx.xxx
~~~

パスワードを入れなくて済むのはめちゃめちゃ楽である。

## 一連の処理を行うスクリプト

以下の内容をadduser.shなど、適当な名前を付けて保存する。

~~~bash:adduser.sh
#!/bin/bash

# ユーザーの作成
useradd $1 -m -U

# パスワード登録
echo "ユーザー $1 のパスワードを登録してください"
passwd $1

# sudo を許可
usermod -aG sudo $1

# ホームフォルダの作成
mkdir /home/$1
mkdir /home/$1/.ssh

# SSH認証鍵の登録
echo "id_rsa.pubの中のテキスト" > /home/$1/.ssh/authorized_keys

# パーミッションの変更
chmod 700 /home/$1/.ssh
chmod 600 /home/$1/.ssh/authorized_keys
chown $1: /home/$1 -R

# SSH認証方式変更 公開鍵認証 有効・rootログイン禁止・パスワードログイン禁止
echo "
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin no
PasswordAuthentication no
" > /etc/ssh/sshd_config.d/default.conf

#処理終了
echo "ユーザー $1 の登録が完了しました"
~~~

rootで以下のようにして実行する。
~~~bash:bash
bash adduser.sh coush
~~~
[小ネタ] Terraform で Amazon SES のSMTPパスワード(IAMアクセスキー)を発行する際はSESと同じリージョンで発行しよう

## SMTPのパスワードを `ses_smtp_password_v4` に切り替えたらメール送信できなくなった

[Amazon SES](https://aws.amazon.com/jp/ses/) といえば、AWSのメール送信サービスですが、昔は日本リージョンがなく、米国リージョン(`us-east-1` など)を使うのが普通でした。

そんな米国リージョンの歴史あるSESを使っているサービスをTerraformで管理していたのですが、つい先日 [TerraformのAWSプロバイダ](https://github.com/hashicorp/terraform-provider-aws) を新バージョンに切り替えていた際に 「**`ses_smtp_password` が deprecated になっている**」 という警告が出ました。

```terraform
resource "..." {
  name  = "SMTPPassword"
  # !! ses_smtp_password は非推奨だよ （※最新版では削除） !!
  value = aws_iam_access_key.ses_mail_sender.ses_smtp_password
}
```

`ses_smtp_password` の代わりに [`ses_smtp_password_v4`](https://registry.terraform.io/providers/hashicorp/aws/5.8.0/docs/resources/iam_access_key) を使えとのことらしいので、そのまま切り替えると、

```terraform
resource "..." {
  name  = "SMTPPassword"
  value = aws_iam_access_key.ses_mail_sender.ses_smtp_password_v4
}
```

Terraform 上での変更はうまくいきましたが、**いざメールを送信しようとすると認証エラーで失敗するように**なってしまいました。なぜ？！

## `ses_smtp_password_v4` は `ses_smtp_password` と違ってAmazon SESのリージョンで発行する必要がある

`ses_smtp_password_v4` の発行元のリソースとなる `aws_iam_access_key` はそもそも、下記のように `ap-northeast-1` のリージョンで定義していました。

```terraform:Before
resource "aws_iam_access_key" "ses_mail_sender" {
  # プロバイダのメインリージョンは ap-northeast-1 (Tokyo)
  user = aws_iam_user.ses_mail_sender.name
}
```

`ses_smtp_password` では上記でうまくいくのですが、 **新しい`ses_smtp_password_v4` は発行するリージョンをAmazon SESのリージョンと同じにしないと機能しません。**

```terraform:After
resource "aws_iam_access_key" "ses_mail_sender" {
  # プロバイダのメインリージョンはAmazon SESと同じ us-east-1 (North Virginia)
  provider = aws.ses_region_provider

  user = aws_iam_user.ses_mail_sender.name
}
```

このことはAWSのドキュメントでも明記されています。

> **The credentials that you use to send email through the SES SMTP interface are unique to each AWS Region.**
> If you use the SES SMTP interface **to send email in more than one Region, you must generate a set of SMTP credentials for each Region** that you plan to use.
> 
> https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html#smtp-credentials-convert

**Amazon SESと同じリージョンでIAMアクセスキーを生成するようにしたところ、無事認証が通るようになりました。** 古いAWSのTerraform定義をアップグレードする際は気をつけましょう。

（別解としては、Amazon SESのリージョンを `ap-northeast-1` (Tokyo) に変更してもよかったと思います。）

## 参考

https://github.com/hashicorp/terraform-provider-aws/issues/10903
cscの作法 その412

# 概要
cscの作法、調べてみた。
AutomationElementの情報を取得するツール、やってみた。

# 参考にしたページ。

https://qiita.com/kob58im/items/995ec8dbe1d4a5160a20

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ff5121e2-74e4-8496-4235-1a591e8de4a8.png)


以上。
FlutterとNCMBで地図メモアプリを作る（その1: 画面の仕様とSDKの初期化）

スマートフォンと地図は相性が良いです。スマホは持ち歩いて使うのが基本ですし、位置情報などの情報も取得できます。

今回はNCMBとFlutterを使って地図上にメモできる地図メモアプリを作ります。地図はOpenStreetMapのものを利用し、タップした場所にメモと写真を残しておけるアプリです。

まず最初の記事では画面の説明とSDKの導入までを進めます。

## コードについて

今回のコードは [flutter_map_note](https://github.com/NCMBMania/flutter_map_note) にアップロードしてあります。実装時の参考にしてください。

## 利用技術について

今回は次のような組み合わせになっています。OpenLayersは地図ライブラリです。国土地理院APIは位置情報を住所に変換する、逆ジオコーディングに利用しています。

- Monaca
- Framework7
- OpenLayers
- 国土地理院API

## 仕様について

地図はOpenLayersを使い、OpenStreetMapを表示します。

## 利用する機能について

地図メモアプリで利用するNCMBの機能は次の通りです。

- データストア
    - データ登録
    - データ取得
- ファイルストア
    - アップロード
    - ダウンロード

## 画面について

今回は以下の3つのウィジェットがあります。

### MainPage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/89f65fad-c81e-cbdf-9df4-b364068b7d95.png)

地図と一覧、二つのタブを読み込むウィジェットです。

### MapPage

![8WYmE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c7af1bea-2538-9df7-be7f-e258b74be1c4.png)

[map](https://pub.dev/packages/map)を使って、OpenStreetMapを表示します。デフォルトは東京タワーの位置情報としていますので、位置情報取得のダイアログは使いません。

### NotePage

![DEqhO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6e1e732c-561f-6a6a-0f47-5fa0a671f854.png)


地図上のタップされた場所にメモおよび画像を記録するための画面です。

### ListPage

![ocziJ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6b637df2-1489-ae80-376e-e2bb384bdeec.png)


地図画面で表示しているメモを一覧表示する画面です。

### RowPage

一覧画面で利用する、各行で利用するウィジェットです。

### BubbleBorder

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/3edd3f78-ced1-b8a8-9ca5-aeb4533b2c5f.png)


地図で吹き出し表示を行うウィジェットです。

## SDKのインストール

flutterコマンドを使って各種ライブラリ・SDKをインストールします。

```
# 以下を追加済み
# flutter pub add ncmb
# flutter pub add map
# flutter pub add flutter_dotenv
# flutter pub add cached_network_image
# flutter pub add image_picker
# flutter pub add uuid
# flutter pub add http
# flutter pub add geolocator
```

### NCMBのAPIキーを取得

[mBaaSでサーバー開発不要！ | ニフクラ mobile backend](https://mbaas.nifcloud.com/)にてアプリを作成し、アプリケーションキーとクライアントキーを作成します。

### アセットの追加

`.env` をpubspec.yamlに追加します。

```yaml
flutter:
  assets:
    - .env
```

### .envファイルの作成

`assets/.env` を作成し、アプリケーションキーとクライアントキーを定義します。

```dart
APPLICATION_KEY=YOUR_APPLICATION_KEY
CLIENT_KEY=YOUR_CLIENT_KEY
```

## main.dartの修正

main.dartファイルを開いて、NCMB SDKの読み込みと初期化を行います。

```dart
// 記述してください
// NCMB SDKをインポート
import 'package:flutter/material.dart';
import 'package:ncmb/ncmb.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

Future main() async {
	await dotenv.load(fileName: '.env');
	  var applicationKey =
	      dotenv.get('APPLICATION_KEY', fallback: 'No application key found.');
	  var clientKey = dotenv.get('CLIENT_KEY', fallback: 'No client key found.');  // 言語設定
  await initializeDateFormatting("ja");
  runApp(const MyApp());
}
```

これでNCMBの初期化が完了します。

## まとめ

今回は地図メモアプリの仕様と画面、NCMBの初期化までを解説しました。次は[地図表示とメモの追加を実装します](https://qiita.com/goofmint/items/38b1fc9001de1a4b0e56)。
SQL関係の覚書

# はじめに
はじめてSQLを触ったので調べたことについてまとめました

# MySQL の操作

## MySQL の起動

### パスワード無しでログイン
```
mysql.server start --skip-grant-tables
```
## 実行
```
mysql -u root
```
## mySQL 状態確認

### バージョン確認
```
mysql> show variables like 'version';
```
### セッション統計情報の表示
```
mysql> show status;
```
### 現在の同時接続数を表示
```
mysql> show status like "Threads_connected";
```
## ユーザ状態確認、操作

### ログイン中のユーザ表示
```
mysql> select user();
```
### 現在ログイン中ユーザの権限確認
```
mysql> show grants;
```
## データベース状態確認、操作

### データベース一覧を表示
```
mysql> show databases;
```
### 使用するデータベースを選択（セミコロン不要）
```
mysql> use [db_name]
```
### データベースの作成
```
mysql> create database [db_name]
```
### データベースの削除
```
mysql> drop database [db_name]
```
## テーブル状態確認

### テーブル一覧を表示
```
mysql> show tables;
```
### テーブル一覧のステータス情報を表示
```
mysql> show tables status;
```
### カラム一覧を表示
```
mysql> desc [table_name];
```
### カラム一覧を表示、Collation 付き。
```
mysql> show full columns from [table_name];
```
### 特定テーブルのインデックスを確認
```
mysql> show index form [table_name];
```
## 退出
```
mysql> exit
```
## MySQL の停止
```
mysql.server stop
```
# 名前

テーブルの構造  
| A1 | B1 | C1 |  
| - | - | - |
| A2 | B2 | C2 |
| A3 | B3 | C3 |

カラム：縦の列 A,B,C  
レコード：横の行 1,2,3

クエリ：データベースに送る命令

# 操作

## 最後
```
;  
```
セミコロンをつける

## データの取得

### カラム

選択  
```
SELECT name1,name2  
```
全て  
```
SELECT \*
```
### テーブル
```
FROM name
```
### データだけを取得
```
WHERE column_name = name
WHERE colum_name LIKE "string"
```
#### ワイルドカード

**前**
```
WHERE colum_name LIKE "%string"
```
**両方**
```
WHERE colum_name LIKE "%string%"
```
**後**
```
WHERE colum_name LIKE "string%"
```
#### 否定の条件
```
WHERE NOT colum_name ~~~
```
#### NULL の取得
```
WHERE price IS NULL
WHERE price IS NOT NULL
```
##### 禁止
```
WHERE price = NUll
```
#### AND 演算子
```
WHERE colum_name1 = "string"
AND colum_name2 = "string2"
```
#### OR 演算子
```
WHERE colum_name1 = "string"
OR colum_name2 = "string2"
```
### データ並び替える
```
ORDER BY colum_name 並べ方
```
ORDER BY と WHERE は両立可能

#### 並べ方

**昇順**
```
ORDER BY colum_name ASC
```
**降順**
```
ORDER BY colum_name DESC
```
### 取得する件数

上から指定されただけ取得  
LIMIT ： データの件数  
ORDER BY と WHERE は併用可能

ORDER BY と併用するときは LIMIT を末尾に

### データ型
```
number  
"strig"  
"yyyy-mm--dd"
```
# 検索結果の操作

## 重複したデータを除く
```
SELECT DISTINCT(colum_name)
FROM ~~
```
## 四則演算
```
culom_name + number  
culom_name - number  
culom_name \* number  
culom_name / number
```
```
SELECT culom_name \* number
```

# まとめ
SQLをとりあえず動かすために調べました。


## 参考にしたリンク
- MySQLの環境構築
[progate : MySQLの開発環境を用意しよう（macOS）](https://prog-8.com/docs/mysql-env)

- MySQLの勉強
[qiita : Macでmysqlを扱う方法 @fuwamaki](https://qiita.com/fuwamaki/items/194c2a82bd6865f26045)
[progate : MySQLでデータベースを作成しよう](https://prog-8.com/docs/mysql-database-setup)
[progate : 学習レッスン SQL I](https://prog-8.com/lessons/sql/study/1)
[JavaDrive : ユーザーを作成する(CREATE USER文)](https://www.javadrive.jp/mysql/user/index1.html)
[JavaDrive : ユーザーの一覧や設定された権限などユーザーに関する情報を取得する](https://www.javadrive.jp/mysql/user/index11.html)
[JavaDrive : ユーザーに権限を設定する(GRANT文)](https://www.javadrive.jp/mysql/user/index6.html)
[JavaDrive : テーブルを作成する(CREATE TABLE文)](https://www.javadrive.jp/mysql/table/index1.html)
Llama2を動かしてみる

# 環境を用意する
[GitHub レポジトリ](https://github.com/facebookresearch/llama) を `git clone` します。
必要なライブラリ等をインストールします。


# モデルをダウンロードする
[フォーム](https://ai.meta.com/resources/models-and-libraries/llama-downloads/)から申請します。
数分でメールが送られてくるので、そこにあるダウンロードリンクをコピーします。以下のような URL です。

```txt
https://download.llamameta.net/*?Policy=...&Signature=...&Key-Pair-Id=...
```

最初に `git clone` したレポジトリの `download.sh` を実行すると URL を入力できるようになるので、そのままペーストして実行します。
その後、どのモデルをダウンロードするか選択できるので、必要に応じてダウンロードします。
その際、空白なしのカンマ区切りで入力するようにしてください。
何も入力せずにEnterを押すと、7B, 13B, 70B, 7B-chat, 13B-chat, 70B-chat の全てがダウンロードされます。

※ ちなみに Mac を使っているのですが、「リンクのアドレスをコピーする」で URL をコピーすると以下のような形の URL となってしまい、これを `download.sh` に入れて実行すると失敗するので、気をつけましょう

```txt
https://l.facebook.com/l.php?u=https%3A%2F%2Fdownload.llamameta.net%2F%2A%3FPolicy%3D...%26Signature%3D...%26Key-Pair-Id%3D...
```


# モデルを動かす
以下のコマンドで実行できます。`[MP]` となっている部分は `[size]` によります。
`--max_seq_len` は 4096 まで対応しているらしいです。
また、`--max_batch_size` は `example_text_completion.py` 中で同時に推論させる prompt 数に設定しておけば良いと思います。
ちなみに `--max_seq_len` と `--max_batch_size` に応じてキャッシュが割り当てられるらしいので、自分の使うデバイスの性能に合わせて設定してみてください。

| [MP] | [size] |
|:---:|:---:|
| 1 | 7b |
| 2 | 13b |
| 8 | 70b |

```sh
torchrun --nproc_per_node [MP] path/to/llama/example_text_completion.py \
    --ckpt_dir path/to/llama-2-[size]/ \
    --tokenizer_path path/to/tokenizer.model \
    --max_seq_len 1024 --max_batch_size 4
```


# 実行結果
日本語にどの程度対応しているのか見たかったので Few-Shot 和訳タスクをしてみます。
ちなみに **flirtatious man** というのはチャラ男みたいな意味らしいです。
推論には NVIDIA A100-PCIE-40GB を 1〜8枚使用しました。

```txt:7B
英語を日本語に翻訳してください：

        The Univresity of Tokyo => 東京大学
        diffusion models => 拡散モデル
        cute panda baby => かわいいパンダの赤ちゃん
        flirtatious man =>
> 誘惑した男
        a sweet smell => 甘い香り
        a 10-year-old boy => 10歳の少年
        a 5-year-old boy => 5歳の少年
```

```txt:13B
英語を日本語に翻訳してください：

        The Univresity of Tokyo => 東京大学
        diffusion models => 拡散モデル
        cute panda baby => かわいいパンダの赤ちゃん
        flirtatious man =>
> 軽口でいる男性
        a piece of cake => 簡単なこと
        the MIT => MIT
        AI researchers => AI研究者
        I want to be a good person => 私は良
```

```txt:70B
英語を日本語に翻訳してください：

        The Univresity of Tokyo => 東京大学
        diffusion models => 拡散モデル
        cute panda baby => かわいいパンダの赤ちゃん
        flirtatious man =>
> ナンパ男
        the best man in the world => 世界一の男
        a good man => 良い男
        a bad man => 悪い男
        a very good man => とても良い男
        a very bad man => 
```

7B/13B はまぁ......という感じがしますが、70Bはなかなか良さげな訳をしてくれそうですね！
他にも色々試した感じ日本語もそこそこ書けそうなので、期待できそうです！！！
pythonライブラリのzoneinfoとは

# はじめに

pythonでdatetimeライブラリを使用するときに見かけることがあるかもしれない[zoneinfo](https://docs.python.org/3/library/zoneinfo.html)、こんかいはこれが何なのか、どのように使われるのか、使用例とともにみていく。

# じゃあzoneinfoってなに？

zoneinfoはIANAのタイムゾーンデータベースをサポートした具体的なタイムゾーン実装を提供します。
（https://docs.python.org/ja/3/library/zoneinfo.html を参照）
IANAとは「Internet Assigned Numbers Authority」 の略でIPアドレスやドメイン名、の割り当てや標準化を行う組織のことです。つまりzoneinfoはIANAが管理している世界各地域の時間帯情報を収録したデータベースから時間データを持ってくることができることができるライブラリということになります。

# 実装例

```sample.py
from datetime import datetime
from zoneinfo import ZoneInfo

dt = datetime(2020, 10, 31, 12)
print(dt)
LA_dt = dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
print(LA_dt)
TOKYO_dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Asia/Tokyo"))
print(TOKYO_dt)

```
```
#実行結果
2020-10-31 12:00:00,
2020-10-31 12:00:00-07:00,
2020-10-31 12:00:00+09:00
```
実行結果から分かるようにオフセットが表示される。
Gitの基本

# はじめに
Gitについて知識が全くなかったので、用語の意味についてまとめました。

## 用語
### リポジトリ
- リモートリポジトリ  
        特定のサーバ上に設置して複数人で共有するためのリポジトリ
- ローカルリポジトリ
        ユーザーごとに配置される手元のマシンで編集できるリポジトリ

普段の作業はそれぞれのローカルリポジトリで行い、作業内容を共有するときにリモートリポジトリで公開する

### コミット
ファイルやディレクトリの編集作業をローカルリポジトリに記録するための操作
コミットを実行するごとにファイルが生成され、ファイルを編集した履歴やその内容を確認できる

### ワークツリー
ユーザーが編集している作業中のディレクトリ

### インデックス
作業場所であるワークツリーと、保存場所であるローカルリポジトリの間にインデックスがある

ワークツリーで編集したファイルをコミットしたい場合には一度インデックスに登録しないといけない
編集したファイルをリポジトリへコミットする前にインデックへ登録して仮置きしておくイメージ

### クローン
リモートリポジトリをローカルリポジトリに保存する（＝ダウンロード）
最初に行う作業

### プル
リモートリポジトリとローカルリポジトリの差分のみを保存する

### プッシュ
ローカルリポジトリにあるファイルをリモートリポジトリに送信して保存する機能

ローカルリポジトリにコミット　→ リモートリポジトリにプッシュ

### ブランチ
ファイルを編集履歴を分岐させて記録していく機能
メインのブランチとそこから分岐したブランチがある

編集を行うのは分岐したブランチ！！！！！！！

### マージ
複数のブランチを一つにまとめて、完成系に近づけることをマージ

### フェッチ
リモートリポジトリからファイルの最新情報を取得する操作
プルとは違い、ローカルのファイルを更新しない
リモートリポジトリのファイルをダウンロードしてプルするのか、ファイルの更新があったかどうかを確認する（フェッチ）のが違う
プル＝フェッチ＋マージ



# gitignore基本
gitignore とは Gitによる追跡から特定のファイルを除外するための設定を書き込むファイル

gitignore に記載された対象ファイルは git add の実行時に、インデックスに追加されない
→既に git add されてしまっているファイルは gitignore に関係なく追跡される

```
# インデックスからのみファイルを削除する（追跡対象からはずす）
git rm --cashed <FILE_NAME>

# ファイルの実体と、インデックスの両方を削除する
git rm 
```

# gitignoreの記法
## 特定のファイルを追跡対象から除外する
```
# どのディレクトリかを問わず、index.htmlを除外
index.html

# .gitignore が置かれたディレクトリ内のindex.htmlを除外
/index.html
```
## 特定のディレクトリを追跡対象から除外する
```
# 文字列マッチが見つかるパスを除外する
directory-a

# ディレクトリ配下（のすべてのパスを）除外する
directory-a/ 
```

## 特定の拡張子を無視する
```
*.jpg
*.png
```

# ワイルドカード
gitignoreでは、ワイルドカード「\*」および「?」が利用できる
「\*」は「/（スラッシュ）以外の文字列」、「?」は、「/（スラッシュ）以外の一文字」にマッチする


# まとめ
今回はgitとgitignoreについて調べてみました。初心者の人も苦手意識を持たずにgitを使いましょうね...

# 参考にしたサイト
https://tcd-theme.com/2019/12/what-is-git.html
https://www-creators.com/archives/1662
RedmineとGitHub Issuesのチケットを同期させる方法　例2つ

## RedmineとGitHub Issuesのチケットを同期させる方法

### プラグインを使用する方法

Redmineには、GitHubとの連携をサポートするプラグインがある

- **redmine_github_hook**
- **redmine-github**

プラグインをRedmineにインストールして設定

プラグインの設定
→GitHubのアクセストークン、リポジトリの情報などが必要


### Webフックを使用する方法

#### RedmineとGitHubのWebフック機能を使用

- **Redmineの管理画面**
チケットの変更や作成時に通知を受け取るためのURLを設定

- **GitHubのリポジトリ設定画面**
Webフックを追加

- **GitHubのWebフック設定**
RedmineのURLを指定
チケットの変更や作成時にイベントを送信するように設定
venv仮想環境がインタープリタとして認識されない

## はじめに
VscodeでPythonを動かす際に、venvで作成した仮想環境がインタープリタとして認識されず地味に手こずったので書き記します。

## 結論
venvコマンドで作成されるディレクトリを作業中のルートディレクトリ直下に配置する。
## 段落

### 詳細
以下のようなディレクトリ構成としていました。
```
test
└── test_2
    ├── test.py
    └── testenv
```

すると仮想環境を起動していてもインタプリーターが選択されず以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/9a6a103a-d5c9-3480-eb31-2fa7c82529d1.png)

選択にも表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/d53fe7eb-df8d-3236-0229-792814aa9d13.png)

### 改善後
以下のように仮想環境のディレクトリをルート直下に配置したところインタープリタとして認識されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/150284ed-3f62-439c-a1b8-d28ecb8fc5a9.png)

## おわりに
しょうもない結論ですが、少しつっかえていたので誰かの参考になれば幸いです。
[React]Router使い方

# Router

<br>

**router**はページを分けたいときに使います。
**router**を使用するには、まず**インストール**する必要があります。

<br><br>

> 初期セッティング

#### 1. まず**ターミナル**を開き、**コマンド**を入力します。
```terminal
npm install react-router-dom@6
```

<br><br>

#### 2. index.jsでタグを追加してください。
```react:index.js
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
    <App />
    </BrowserRouter>
  </React.StrictMode>
);
```

<br><br>


> ページ分け

url経路によって異なるページを表示したい場合は、Routeタグを使用することができます。
```react:App.js
import { Routes, Route } from 'react-router-dom'

function App(){
  return (
    <Routes>
      <Route path="" element={  } />
      <Route path="" element={  } />
    </Routes>
  )
}
```

<br><br>

pathにはurl経路、elementには見せるhtmlが入ります。

例
```react:App.js
    <Routes>
      <Route path="/study" element={ <div><p>studyページです</p></div> } />
      <Route path="/practice" element={ <div><p>practiceページです</p></div> } />
    </Routes>
```

<br>

サブ経路は "/名" でできます。
```react
 <Route path="/study" element={ <p>studyページ</p> } />
 <Route path="/study/math" element={ <p>mathページ</p> } />
 <Route path="/study/history" element={ <p>historyページ</p> } />
```

<br>

でも上よりはこちらの方がもっと見やすいですね。
これを**Nested routes**と呼びますけど、この時mathに入るとstudyページとmathページが**両方**出力されます。
```react
 <Route path="/study" element={ <p>studyページ</p> } >
    <Route path="/study/math" element={ <p>mathページ</p> } />
    <Route path="/study/history" element={ <p>historyページ</p> } />
 </Route>
```

<br>

でも今はhttp://localhost:3000/study/math　に入ってもstudyページしか出力されています。
**Nested routes**を使うためには**Outlet**タグを使わなければなりません。
そのためには上位パスのhtmlをコンポーネントに変更します。
```react
 function Study(){
  return (
    <div>
      <h4>studyページ</h4>
    </div>
  )
}
```

<br><br>

そして**Outlet**を**import**します。
上位パスのコンポーネントに**Outlet**タグを入れます。
**Outlet**には下位経路に**html**が入ります。
```react
import { Routes, Route, Outlet } from 'react-router-dom'


 function Study(){
  return (
    <div>
      <h4>studyページ</h4>
      <Outlet></Outlet>
    </div>
  )
}
```

<br><br>

ただ "/" だけなら**mainページ**です。
```react
 <Route path="/" element={ <p>mainページ</p> } />
```

<br>

**間違ったurl**を入力したとき見せるページは*です。
```react
 <Route path="*" element={ <p>404</p> } />
```

この中には他の**React**関数と同じく**div**とか**空いたタグ**で全体たぐを包んでください。


<br><br><br>

> ページ移動

じゃあurl経路で様々の**html**を見られますけど**url**に**直接**打つ方法以外にどう移動するのか。

<br><br>

#### 1. Link

**Link**は**a**タグと同じだと考えてもいいです。
文字を**クリック**すると移動します。
```react
import { Routes, Route, Link } from 'react-router-dom' //Linkを追加


<Link to="/">main</Link>
<Link to="/study">studyページ</Link>
```

<br><br>

### 2. useNavigate

まず**useNavigate**を**import**して関数を作ってください。
その関数を**onClick**に入れてください

```react
import { Routes, Route, Link, useNavigate } from 'react-router-dom' //useNavigateを追加

function App(){
  let navigate = useNavigate()
  
  return (
    <button onClick={()=>{ navigate('/study') }}>study</button>
  )
}

```


以上でポスティングを終わります。
【50歳でスクラムマスターにジョブチェンジ】 アジャイル社内開発はじめました

## はじめに

ジョブチェンジという表現は少々大げさでした 汗。

私は、2023年2月に船井総研デジタルに転職してきました。

入社後、認定スクラムマスターの資格を取得。
社内で草の根アジャイルの布教活動ところ、
部署の管理職の方から、社内開発をアジャイルで行ってみないかと声をかけていただき、
「素晴らしいチャンス！」と飛びつきました！

日々の生の経験やチャレンジ、発見を発信していけたらと思っています！



## なぜスクラムマスターを志そうと思ったか

私はこれまで長年SESエンジニアとして活動してきましたが、ここ数年はアジャイルの要素を取り入れた案件が増えてきました。
お客様の会社のアジャイル研修のお手伝いをさせていただいたこともあります。

そういった中で、前職で一緒にお仕事をさせていただいたスクラムマスターの方々の素晴らしいマインドと文化に感銘を受けました。
その経験から、スクラムマスターになることを志すようになりました。


## 最初にやったこと

私が取り組んだ最初のことは以下の通りです。

### 1. チームビルディング(というか人集めからｗ)
  
https://qiita.com/hiroyuki-abe/items/f68b92dff94d48d5ab15


### 2. 各種プロセス整備

https://qiita.com/hiroyuki-abe/items/b2eba7d426508687fcaf


### 3. コミュニケーション マネジメント

- ステークホルダーと
  - コミュニケーション不足に陥らないよう定期的に対話できる場を作っておこう。
  - コミュニケーション経路も十分に確保しておこう。(早く薄くと密にの両方)
  - 良い関係性で対話ができるよう、健全な関係の土台を作っておこう。
- チーム内
  - 心理的安全性を保証し、密に連携していけるよう、手厚く準備しておくことが重要。
    (コミュニケーションまわりが貧弱でチームのパフォーマンスが低下するのは絶対NG)
  - 些細なこともキャッチしていけるようにしたい。

### 4. 開発環境、インフラ準備
- アーキ選定
- 開発環境準備
  - devcontainer
  - ローカル実行環境
  - フロントエンド/バックエンドの枠組み
  - テストの枠組み
  - リポジトリ,CI/CD
- 実行環境準備(dev/stg)


これからもアジャイル社内開発の経験や知識をお伝えしていきますので、どうぞお楽しみに！
NASに商機到来　NASでLTO高速化

---

# 2023/07/18 商機到来 NAS
商機到来シリーズの投稿です。

## 商機発見

    **NASは、大容量です。磁気テープ媒体の低速なLTO一時的に高速化するのに便利です**

## LTOをどう使うか？
- 2度以上、LTOを読み出すなら、NASに移動した方が時間節約できる
- 費用かけずに、古いLTO(5より前)を読み込む必要があるなら、ヤフオクで買える
- 古いLTOは、HDDにしたほうが使い勝手がよい
- Docker でデータ処理もできる
Patch-Mix Transformer for Unsupervised Domain Adaptation: A Game Perspective


# 1. 概要
教師なしで学習時とは異なるドメインのデータに対して推論してうまく予測を合わせる研究をUnsupervised Domain Adaptation(UDA)と呼ぶ。UDAの研究領域では、昨今Vision Transformer(ViT)を用いた手法が多く提案されている。異なるドメインの特徴取得には、ViT内でCross-attentionを利用して共通する特徴の取得を目指すことが多い。しかし、Cross-attentionは学習サンプルに自動で割り当てる疑似ラベルの品質に大きく依存しており、ドメイン間にあまりに差があるとうまく学習できなかった。この研究では、ゲーム理論を用いてソースドメインとターゲットドメインを別に生成する中間ドメインでつなぎ、ドメインの種類が学習時と推論時に大きく異なってもViTでうまく学習・推論できるようにした。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/495c40d7-f300-33b6-11d1-a2043beddd87.png)
ゲーム理論に基づいて、ソースドメインとターゲットドメインの両方からパッチをサンプリングすることで中間ドメインの確率分布を構築し、クロスエントロピー(Cross Entropy: CE)を最大化するためにソースドメインとターゲットドメインのパッチを混ぜるPatchMixという新たな手法を提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8c38524e-84b4-052f-2844-cc3b78d70d93.png)
教師なしドメインアダプテーション(UDA)のプロセスを、1) PatchMixの確率分布、2) ViTの特徴抽出、3) 分類器、のプレイヤーに分けて考え、クロスエントロピー(CE)をMin-Maxゲームで解くことを考える。1) PatchMixはCEを最大化したい。2), 3) はCEを最小化したい。ナッシュ均衡(Nash Equilibrium)がゲームの解の安定点としてコスト設計を行っている。
また、ViTのアテンションマップを各パッチの重要度評価に使用しており、ラベルを再度重みづけすることでよりドメインに対して識別能力の高い特徴表現を得られるようにしている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ce991077-54e8-e4fa-7eda-938e8b6cb857.png)
4つのデータセットで評価実験を行っており、提案手法ではOffice-Homeデータセットで3.6%、Office-31データセットで1.4%、DomainNetデータセットで17.7%を達成し記録を更新した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Zhu_Patch-Mix_Transformer_for_Unsupervised_Domain_Adaptation_A_Game_Perspective_CVPR_2023_paper.pdf>

last updates: July 10 2023
[AWS Q&A 365][ECR]AWSのよくある問題の毎日5選 #97

# Q1: Amazon ECRはどのようなモニタリング機能を提供していますか？
A1: Amazon ECRは、サービスのクォータの可視化、アラーム設定、使用状況メトリクス、使用報告、リポジトリメトリクス、CloudWatchメトリクスなどのモニタリング機能を提供しています。これらの機能は、コンテナイメージリポジトリの使用状況とパフォーマンスを監視し、追跡するのに役立ちます。

# Q2: Amazon ECRでサービスのクォータを可視化し、アラームを設定する方法は？
A2: AWS Management Consoleを使用することで、サービスのクォータを可視化し、アラームを設定することができます。これにより、Amazon ECRサービスの上限と使用状況を簡単に監視し、特定の閾値に基づいて通知やアラームを設定することができます。

# Q3: Amazon ECRで利用可能な使用状況メトリクスは何ですか？
A3: Amazon ECRは、コンテナイメージリポジトリの使用状況を追跡し、分析するための使用状況メトリクスを提供しています。これらのメトリクスには、イメージのプッシュとプルの数、リポジトリのサイズ、リポジトリのスキャン状況などの情報が含まれています。

# Q4: Amazon ECRのCloudWatchメトリクスを有効にできますか？
A4: はい、Amazon ECRのCloudWatchメトリクスを有効にすることができます。CloudWatchメトリクスを有効にすることで、API呼び出しのレート、エラーレート、レイテンシなど、コンテナイメージリポジトリに関連する追加のメトリクスを収集し、監視することができます。

# Q5: Amazon ECRのメトリクスをどのように確認できますか？
A5: CloudWatchコンソールにアクセスするか、CloudWatch APIまたはCLIを使用してAmazon ECRのメトリクスを表示することができます。これらのメトリクスは、コンテナイメージリポジトリのパフォーマンスと使用状況についての洞察を提供し、情報に基づいた意思決定と最適化を可能にします。
[AWS Q&A 365][ECR]Daily Five Common Questions #97

# Q1: What monitoring features does Amazon ECR provide? 
A1: Amazon ECR provides monitoring features such as visualizing service quotas, setting alarms, usage metrics, usage reports, repository metrics, and CloudWatch metrics. These features help you monitor and track the usage and performance of your container image repositories. 

# Q2: How can I visualize my service quotas and set alarms in Amazon ECR? 
A2: You can visualize your service quotas and set alarms by using the AWS Management Console. This allows you to easily monitor the limits and usage of your Amazon ECR service and set up notifications or alarms based on specific thresholds. 

# Q3: What are the usage metrics available in Amazon ECR? 
A3: Amazon ECR provides usage metrics that allow you to track and analyze the usage of your container image repositories. These metrics include information such as the number of image pushes and pulls, repository size, and repository scan status. 

# Q4: Can I enable CloudWatch metrics for Amazon ECR? 
A4: Yes, you can enable CloudWatch metrics for Amazon ECR. By enabling CloudWatch metrics, you can collect and monitor additional metrics related to your container image repositories, such as API call rates, error rates, and latency. 

# Q5: How can I view Amazon ECR metrics? 
A5: You can view Amazon ECR metrics by accessing the CloudWatch console or by using the CloudWatch API or CLI. These metrics provide insights into the performance and usage of your container image repositories, allowing you to make informed decisions and optimizations.
PDPP:Projected Diffusion for Procedure Planning in Instructional Videos


# 1. 概要
例えば、料理の作り方や製品の組み立て方のような作業指示を動画で示すと直感的でわかりやすい。この研究では、動画の作業開始時刻のフレームと作業終了時刻のフレームが与えられると、中間でどんな作業を行えばよいのかを自動で推論し動作指示のテキストを予測する。従来手法では、中間フレームを教師データとして与え動作指示のテキストを予測していたが、この研究ではタスクのクラスラベルだけで実現した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/820ca0fa-ce3c-cef2-f611-0a25413d3bcd.png)

---


# 2. 新規性
動画の開始フレームと終了フレームだけから、作業内容の中間における動作指示のテキストを予測することができる。潜在空間のノイズから元の画像を復元する拡散モデルを動画の行動予測に拡張するアイディアが面白い。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e3a9d685-29dd-1ab7-ad69-7da3071b67db.png)
提案手法では拡散モデル(Diffusion model)を用いて、動作指示を直接予測するのではなく、拡散モデルからのサンプリングによって中間動作の時系列での確率分布を求めることで予測していく。従来手法のように中間作業の画像列は必要とせず、代わりに動画にタグ付けされたタスクラベルを利用しているため、アノテーションコストが削減できる。
また、拡散モデルはU-Net構造になっており、開始・終了フレームの特徴量、タスクラベルを分類した分類予測、行動計画、のそれぞれを結合(concatenation)した特徴量からデノイジングして任意の時刻の確率分布を予測する。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4542a326-9b70-5c3d-863e-a8586b4da8a7.png)
3つの公開データセットで評価実験を行っており、拡散モデルを用いた提案手法が複数の指標で最高性能を記録した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_PDPPProjected_Diffusion_for_Procedure_Planning_in_Instructional_Videos_CVPR_2023_paper.pdf>

last updates: July 10 2023
（ChatGPT)始めました。「会社に行きたくない。」他

(2023/08/10)タイトル変更しました。影響は、ないと思います。
仕事に行きたくない。→　会社に行きたくない。


英語のタイトル？が、自動的につきます。もしかしたら、時間によって異なりますか？
**正式名称を教えて下さい。**

# オリジナル　
「大学入試数学問題集成掲示板」様　内
https://mathexamtest.bbs.fc2.com/
コメント「いつも?の数学入試問題と、関係ありません。2023/07/15 (Sat) 05:31:44」より
**(以下は、上のバージョンアップです。)**
# ChatGPT 様からアドバイスをもらいました。
**以下、ないばっかりでした。** 私は、最後にアドバイスのお礼もしました。
(回答省略)質問は1行ずつです。右側は、自動タイトル？です。

数学の勉強をしたくない。
数学の試験を受けたくない。
学校に行きたくない。
会社に行きたくない。
仕事に行きたくない。　　　　　　　　　　　Unmotivated at work.
仕事をしたくない。
朝早起きしたくない。
食事の準備をしたくない。
ご飯の用意をしたくない。
洗濯をしたくない。
お風呂に入りたくない。　　　　　　　　　　Reluctant Bathing Tips.
ごみ捨てが面倒くさい。　　　　　　　　　　ゴミ処理の簡単な方法
食べ物の値段が上がって、生活が苦しい。　　食品価格の上昇に対処する方法
生活が苦しい。
大学入試数学問題が難しい。　　　　　　　　Hard University Math Problems.

アドバイス。ありがとうございました。　　　アドバイスへの感謝！

....頑張ってください。
ChatGPT 様より。以上

# 感想
・winmege および diffツールで、比較が必要です。
**・便利なアプリがあれば教えて下さい。**
Planning-Oriented Autonomous Driving

# 1. 概要
自動運転の実現には、認識→予測→計画というそれぞれのタスクを解くことがが必要とされるが、既存手法ではそれぞれのタスクに独立したAIモデルの提案に留まっていた。この研究では、走行計画を実現するために必要な認識機能と予測機能の優先順位付けを行い、自動運転用の大規模公開データセットで効果を検証した。

*Award Candidate: BEST PAPER AWARD

---

# 2. 新規性
画像を入力とした類似研究に比べて、最も精度の高い技術を提案している。LiDARなどのレーダー機器を使った場合よりも走行計画のタスクで精度がよく、より安価なカメラで安全な走行計画が実現できることを実証した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/aa952d89-5ea8-32c8-61f9-3137f9b7cc92.png)
また、MotionFormer/OccFormer/Plannerというトランスフォーマーベースのネットワークを提案しており、自車の周囲の物体がどういう軌跡をたどるのかを予測し、見えなくなっても補完できるようにしており、安全な走行計画が立てられるようにしている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c2605fe1-42da-d567-2b22-b42516334507.png)
安全な走行計画を実現するための機能として、物体のトラッキング(TrackFormer:MOTR,ECCV2022)、物体間の動き情報(Motion Former:this paper)、シーン全体の走行可能なエリアの検知(OccupancyFormer:this paper)、シーン全体の地図構築(MapFormer:Panoptic SegFormer,CVPR2022)のそれぞれをトランスフォーマーベースのモデルにより求める。ここで、トランスフォーマーのキー(K)とバリュー(V)が各ネットワークでシェアされ、全体のプランニングの最適化が図られる(Planner:this paper)。これにより、各モジュールの利点を最大限生かしつつシーン全体の視点から周囲の物体の移動状況を高次元空間で学習できるようになった。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c23aae5f-bc64-9503-2952-edc04f889ec3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/17e9ea97-3d17-5b1c-627e-00669acff48a.png)
データ数が多く難易度の高いnuScenesデータセットを用いて実験をしており、従来手法を上回る精度を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Hu_Planning-Oriented_Autonomous_Driving_CVPR_2023_paper.pdf>

last updates: July 6 2023
Renderable Neural Radiance Map for Visual Navigation

# 1. 概要
資格情報を頼りにしたナビゲーションを実現する新たな手法として、Renderable Neural Radiance Map(RNR-Map)を提案している。この手法では、カメラで撮影した2D画像からシーンの3Dをリアルタイムで構築しつつ、任意のカメラ位置によって画像の描画が可能な特徴マップ(Neural Radiance Map)に変換しているため、例えばロボット応用で画像情報を使った位置特定やナビゲーションが可能となる。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2f82b84b-9e7b-ce30-a4bb-581f22fbc65c.png)
2D画像から3Dシーンを構築する際に、グリッドに区切りピクセル単位で画像特徴を取得して、高次元特徴を位置座標に埋め込んでおくことで、どの位置にどのような視覚的な特徴があるかシーン全体で判別できるようにした。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ff19ef25-f927-4990-6b2c-9a0299d9af15.png)
現在自分がいる位置がどこかを知るために、入力の画像からCNNベースで特徴量を取得し、マップ全体の特徴データベースから類似する箇所を検索する。
このとき、提案手法で予め位置と紐づけておいた視覚特徴を用いることで高精度に位置予測ができるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/bc76ecf2-3358-e273-b5a6-9d0cb0ff9b19.png)
例えば、目的地の画像を設定すると3Dシーンの中から目的地の位置が高精度に推定できるので、現在位置から目的地までのナビゲーションが実現できる。3Dシーン全体の視覚特徴がピクセル単位で位置に紐づいているので目的地までの位置のスコアリングができるため、ナビゲーションも可能となっている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/50e005fa-b427-332c-2cd5-de468729b8c9.png)
実環境のノイズを含む環境で撮影されたNRNSデータセットを用いて評価しており、難易度の高い曲がりくねった道のシナリオでは、65.7%の成功率を達成しており、従来手法に比べて、18.6%の精度向上を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Kwon_Renderable_Neural_Radiance_Map_for_Visual_Navigation_CVPR_2023_paper.pdf>

last updates: July 6 2023
Photon Fusion Addressables プレハブ登録

Fusionでは、Fusionはネットワークスポーンを行う前に、プレハブを登録する必要があります。

プレハブにNetwork objectをアタッチ

![スクリーンショット 2023-07-19 13.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/82374d26-d4b8-5502-fd6b-123ea3c1f7fa.png)

Network Project Config で確認してみましょう。
Network Project Config　> Prefabs の頭に「A」になったら、OK。
![スクリーンショット 2023-07-19 13.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/49ffd7fa-8e09-eb1c-787b-8b6c8a59b098.png)
[Servicenow][Employee Center] topicsとcontentの紐づけ

# topicsとcontentの紐づけ
設定手順の例を簡単にまとめます。

## 環境
- Version：Tokyo

## 設定手順
OOTBのままだとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/06d16400-f5bd-101a-f856-b52f9bd9f522.png)

1. [Taxonomies]と検索し、編集したいtaxonomyを開く。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/d82a17f8-415c-fdd5-f092-d983b6550770.png)
1. 編集したいTopicをクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/898da3f4-10a3-faa0-a2be-4003e744d440.png)
1. [Child Topics]タブの[New]ボタンをクリックし子Topicを作成する。（子Topicが不要なら省略）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/e7ed3523-0242-b6b2-667d-16606ddb2e3e.png)
1. contentを紐づけたいTopicをクリックする。
1. [Connected Content]タブの[New]ボタンをクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/94fc608d-2fd4-141e-82cc-b2aee54b4d2d.png)
1. 必要項目を入力する。今回は事前に作成したサービスカタログをTopicに紐づける。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/90b5ba99-5c8a-2129-9a90-4531947a3465.png)
1. [Preview template]をクリックし、実装内容を確認する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/bfaa2ce5-7859-9ef5-0419-8f84a9c09938.png)


こんな感じに表示される。
※EC画面に反映されるまでかなりのタイムラグがある（キャッシュなどが残っているためかな？）。
Choromeのシークレットウィンドウなどを用いると変更内容がすぐに確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/ff94ac4c-d11b-208e-04e7-ae81d3bc24d5.png)
ConQueR: Query Contrast Voxel-DETR for 3D Object Detection

# 1. 概要
2D画像の物体検出をトランスフォーマーを使って予測するモデルにDETR(DEtection TRansformer)があり、画像内の物体の位置とクラスを同時に予測することができる。さらに3Dに拡張した三次元物体検出の研究も進んでいるが、後処理でポイントクラウドのように3D点群を使った物体検出の方が精度が高かった。この研究では、DETRによくみられる誤検出を抑制し、シンプルなネットワークで高精度な3D物体検出を実現している。

---

# 2. 新規性
ポイントクラウドの3D点群を入力とした3D物体検出技術の精度において最高性能を更新した。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c9c8f7e7-a0cc-86c9-ed15-95bea666400e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8bc4c099-c3bf-165e-216f-3c9cc98e8b9a.png)
DETRではシーン内の物体数よりも大きな数の候補数をデフォルトで設定しているため、実際の物体が無いところに対しても予測されてしまい、推論中に多くの誤検出が生じた。そこで、誤検出が局所的かつ多重に重なりを持つことに着目し、正解位置(GT:緑枠)に対してハンガリアンマッチングで最もマッチした候補(青枠)と、残りのマッチしなかった候補(灰枠)とをペアにして対比損失(Contrastive Loss)を求めることで、誤検知を抑制している。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1c252fd6-9d64-4cf8-3d8c-08066fd4fbb1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8647fb82-6304-edcf-1954-3db8198db8e8.png)
既存手法に比べ誤検出を60%削減し、自動運転タスクでよく用いられるWaymoデータセットで71.6 mAPH/L2を達成しており、従来手法よりも2.0 mAPH/L2以上精度向上した。
*mAPH/L2: mean Average Precision(mAPH)は平均適合率を示しており、L2は3D位置の誤差をユークリッド距離を使って求めたもの。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Zhu_ConQueR_Query_Contrast_Voxel-DETR_for_3D_Object_Detection_CVPR_2023_paper.pdf>

last updates: July 6 2023
（ChatGPT)FreeCADのために使ってみた。

以下、省略ばっかりです。**問いによって、アウトプットが変わります。**

# 3点を通る円の場合
2通りでやってみた。
```
FreeCAD 空間上の3点を通る円のおすすめのマクロを探しています。
FreeCAD 空間上の3点を通る円のマクロ
```
(抜粋)
上の行
残念ながら、私のデータベースには2021年9月までの情報しか含まれておらず、...

下の行
＞マクロを実行すると、3つの点を通る円が表示されるはずです。...
＞FreeCADのバージョンによっては動作しない可能性があるため、...
```
<class 'AttributeError'>: 'Part.Plane' object has no attribute 'Center'
```
https://github.com/CadQuery/cadquery/issues/363

＞#1〜#30 30通り？

https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle


```
freecad の円を透明にするマクロ
```


# 3点を通る平面の場合 
(2023/07/27追加)
```
FreeCAD 空間上の3点を通る平面のマクロ
```

# 球を書きたい場合
2通りでやってみた。
```
freecadで半径1の球の書き方
freecadで半径1の球をマクロの書き方
```
(省略)
**いいですねえ。**




# 未整理

https://blog.freecad.org/2023/01/16/the-rotation-api-in-freecad/

https://www.programcreek.com/python/example/89886/FreeCAD.Rotation
PixHt-Lab: Pixel Height Based Light Effect Generation for Image Compositing

# 1. 概要
光の影やライティング効果をコンピュータグラフィックスで計算しようとすると物理モデルベースのレンダラーや3Dのジオメトリ(幾何構造)情報が必要になる。これを2D画像だけで解こうとすると、圧倒的に3Dのジオメトリ情報が不足しているため、近年の手法では各ピクセルに対してDNN(Deep Neural Network)で高さ情報を予測し、ソフトな影や反射の生成に成功している。しかし、従来研究では表現できる影や反射が大きく制限されていた。

---

# 2. 新規性
ピクセル単位で高さを予測するだけではなく、3D空間にマッピングすることで前景背景がうまく再構築でき、より写実的で多様なライティング効果を得られるようになった。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/eeaa402a-a0ca-0b57-24a3-85c18ef1bdb6.png)
前景物体と背景画像を入力として、
1) 各ピクセルの高さを予測する
2) ピクセルの高さの特徴量をもとに、2.5次元の空間を構築する
3) 2.5次元のシーンに対してライティングや影などの効果をレンダリングする

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/04a7c73d-37e1-208f-8f8c-5855a7a50383.png)
GUIを提供しており、前景と背景の画像からリアルな影やライティング効果をレンダリングできる。左図は背景に前景を張り付けただけのもの、右図を周囲のコンテキストを反映して前景物体に影やライティング効果を付与したもの。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Sheng_PixHt-Lab_Pixel_Height_Based_Light_Effect_Generation_for_Image_Compositing_CVPR_2023_paper.pdf>

last updates: July 6 2023
[openFrameworks] macOSでビルドするたびにカメラ利用の許可とかを聞かれないために

わずらわしいですよね. あれ. 表題の件.

で, 解決策は Signing & Capabilities で Signing をきちんと指定してあげるだけ.
なんですが, oFだとPG使いますよね. PG使うとそこらへんの設定吹き飛んじゃいますよね.

ということでちょっと一手間加えてレトルト食品を美味しく変身させちゃおうっていう.

---


`scripts/templates/osx/Project.xcconfig` の最後に

```
// #include? "./UserDefined.xcconfig"
#include? "./App.xcconfig"
```


を追加. 
ファイル名は好きなものに変えても良いです.


で, プロジェクトディレクトリに 
`UserDefined.xcconfig`
 `App.xcconfig` を作成して次のような内容を記入.

```
CODE_SIGN_STYLE = Automatic
DEVELOPMENT_TEAM = XXXXXXXXXX
CODE_SIGN_IDENTITY = Apple Development
```

`DEVELOPMENT_TEAM` は https://developer.apple.com/account#MembershipDetailsCard 辺りで確認してください.

以上.

----

追記:
`UserDefined.xcconfig` という名称で書きましたが次期バージョンからは同じ意味のファイルとして `App.xcconfig` がデフォルトで追加されます.
ので, 今から `App.xcconfig` にしておくと幸せになれそうですね.
ChatGPT Code interpreterの導入ガイド

code interpreterの導入ガイドです。

1.ChatGPT Plusに契約する。（月額20ドル）
2.ChatGPTのSettingを開く
3.Beta fuaturesを開く
4.Code interpreterを有効化する。

code interpreterの具体的な使い方について、まとめてる方はいらっしゃったので、今回は簡潔にChatGPT Plusで利用可能なCode interpreterの導入について解説します。

1.ChatGPT Plusに契約

まずは、ChatGPTの画面を開きましょう。
![スクリーンショット 2023-07-19 131506.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515701/cc71423f-8455-0f4e-8b2a-745999ff0957.jpeg)

左のメニューバーに「Upgrade to Plus」があります。
こちらから、ChatGPT Plusにプラン変更ができます。
料金は、月額20ドルです。
![スクリーンショット 2023-07-19 131456.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515701/cc547ec7-e967-053a-10a3-4b8f37303811.jpeg)

2.ChatGPTのSettingsを開く
左下の「…」をクリックします。
Settingsを押してください。

3.Betafueaturesをクリックします。
code interpreterにチェックをいれます。

4.Code interpreterの有効化
GPT-4でcodeinterpreterにチェックをいれます。

以上が、ChatGPT Plusで利用できるCode interpreterの始め方・導入ガイドです。
Code interpreterでは、ファイルをアップロードすることができます。

アップロードできるファイルは、テキストファイル以外に画像ファイルや動画ファイルです。

> テキストファイル（.txt）
画像ファイル（.jpeg, .jpg, .png, .gif, .bmp など)
動画ファイル（.mp4, .avi, .movなど）
CSVファイル（.csv）
Excelファイル（.xls, .xlsx)
PDF ファイル（.pdf)
ZIPファイル（.zip)
Pythonスクリプト（.py）
Jupyterノートブック（.ipynb）
GIFファイル（.gif）。
>[ホワイトペーパー｜マーケMEMO　Code interpreterの使い方やできることとは？ChatGPTにファイルをアップロードできる](https://www.marke-media.net/whitepaper/code-interpreter-chatgpt/ "Code Interpreterにアップロードできるファイルとは？")


以上が、Code interpreterの始め方でした。


最後までご覧頂き、ありがとうございます。他の記事では、WordPressのCocoonで特定カテゴリーを新着記事から非表示にする方法を解説しています。

https://qiita.com/whitepaper/items/c398f6180678a7a1b09d
MacOS + Rider + Google日本語入力の組み合わせの環境でバックスラッシュを入力できない場合の対処方法


# はじめに
表題の環境でスクリプトを書く際、デフォルトの設定では半角モード中にバックスラッシュを入力できないため、対処方法を記録します。


# 対処方法

RiderのKeymapの設定から `FileMember` のショートカットを削除、または他のキーに割り当てする。
※本来Option +　¥マークで入力できるのですが、デフォルトでこの操作が割り当てられているためバックスラッシュを押せなくなっているようです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/68c02eeb-2f30-701b-b441-f1196bc57087.png)

# 対処後のバックスラッシュ入力方法

Optionキーを押しながら¥マークを押す。

以上
[Servicenow][Employee Center] topicsの作成

# topicsの設定
設定手順の例を簡単にまとめます。

## 環境
- Version：Tokyo

## 設定手順
OOTBのままだとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/06d16400-f5bd-101a-f856-b52f9bd9f522.png)

1. [Taxonomies]と検索し、Topicを設定したいTaxonomyを開く。
2. [Child Topics]タブの[New]ボタンをクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/fb0e1773-0576-4b27-43cf-492f1974ee1a.png)


3. 必要事項を入力し、Submitする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/ec8d1d1d-3501-6766-328a-459b7857559c.png)


EC画面の見た目はTopicを作成しただけだと特に変化なし。
Topicを表示させるためにはcontentを紐づける必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/5912cc88-bfae-4ba6-acb2-7f8ca200550d.png)
DockerでPHPの勉強環境を構築してみた

# はじめに
みなさん、環境構築ってめんどくさくないですか？
僕はめんどくさいです。

本を使ってPHPの勉強をする機会があったのですが、環境構築をしたくなかったのでDockerを用いることにしました。

# やること
『PHP7+MariaDB/MySQL　マスターブック』では、XAMPPというパッケージを使用するのですが、Dockerにて環境を再現します。
- PHP：7.4を使えるようにする
- Apacheを使えるようにする
- MariaDBを使えるようにする
- この本ではメールを用いるためメールサーバを立ち上げる

注意：この記事ではXAMPPに似た環境を構築する手順を示すのみであり、詳しい解説等はしません（今後追記していくかは未定）

# 動作環境
M1 MacBook Air(MacOS 13.1)
Docker

# ファイル構成
```
PHP
├ php
│  └ dockerfile
├ mysql
│  ├ init/
│  └ mysqld_charset.cnf
├ source/
└ docker-compose.yml
```

# composeファイル

まずはすべての基礎となるcomposeファイルを記述していきます
apacheについては、[php:7.4-apache](https://hub.docker.com/layers/library/php/7.4-apache/images/sha256-18b3497ee7f2099a90b66c23a0bc3d5261b12bab367263e1b40e9b004c39e882?context=explore)というPHP:7.4とapacheをひとまとめにしたコンテナイメージがあったのでそれを使います

```yml:docker-compose.yml
version: '3'
services:

  #php用コンテナ
  php:
    container_name: php-apache
    build: ./php
    volumes:
      - ./sorce:/var/www/html
    ports:
      - 8080:80
    depends_on:
      - mysql

  #MariaDB用コンテナ
  mysql:
    container_name: mariaDB
    image: mariadb:latest
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/init:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=admin

  #mailコンテナ
  #メールアドレス：nobody@example.com
  mail:
    container_name: mail
    image: djfarrelly/maildev
    ports:
      - "1080:80"
      - "1025:1025"
```

# source/
ここには表示させたいphpファイルを置きます

# php/
ここには`php-apache`コンテナの設定用ファイルを置きます

```dockerfile:dockerfile
FROM php:7.4-apache

RUN apt-get update && apt-get install -y libonig-dev && \
apt install -y ssmtp && \
docker-php-ext-install pdo_mysql mysqli mbstring

RUN apt-get install -y --no-install-recommends libc-client-dev libkrb5-dev \
    && PHP_OPENSSL=yes docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
    && docker-php-ext-install imap

ENV APACHE_DOCUMENT_ROOT /var/www/html/htdocs

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
```

この`dockerfile`で必要なドライバやモジュール類のインストールとapacheの設定は完了します

# mysql/
ここには`mariaDB`コンテナの設定用ファイルを置きます
今回、必要事項は`docker-compose.yml`に必要事項は書いてあるので`dockerfile`は必要ありません

代わりにMariaDBの設定用ファイルを置きます
```conf:mysqld_charset.cnf
[mysql]
default-character-set=utf8mb4
[mysqld]
character_set_server=utf8mb4
character_set_filesystem=utf8mb4
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
init_connect='SET collation_connection = utf8mb4_general_ci'
skip-character-set-client-handshake
```
これによりMariaDBで日本語を扱えるようになります

## init/
ここにはDB起動時に読み込ませたいSQlファイルを置きます

# 完成
以上で完成です！
あとはこれをDockerで起動させるだけでXAMPPと同じようなPHP開発環境を構築することができます。

# 参考

## php:7.4-apache
https://hub.docker.com/layers/library/php/7.4-apache/images/sha256-18b3497ee7f2099a90b66c23a0bc3d5261b12bab367263e1b40e9b004c39e882?context=explore
## maildev
https://hub.docker.com/r/djfarrelly/maildev

https://qiita.com/shogogg/items/6098fd2a4ee0291ec739
VBAで、配列に要素が含まれているかを調べる関数

# はじめに
VBAで、配列の中に指定の要素が含まれているかを確認する関数の備忘録です。

# 結論
対象の値と一致しているかどうか、要素の中を1から順に確認していきます。1から順に調べていくため、配列の要素数が多くなると時間がかかってしまうことに注意してください。予想としては1万個ぐらいになってくると時間がかかることが体感的にわかってきそうです。

# サンプルコード
```vb
Sub 検証()
    Dim arr(1 To 5) As Long
    arr(1) = 3
    arr(2) = 1
    arr(3) = 4
    arr(4) = 1
    arr(5) = 5

    Debug.Print (InArray(1, arr))
    Debug.Print (InArray(5, arr))
    Debug.Print (InArray(6, arr))
    Debug.Print (InArray(9, arr))
End Sub

'配列に含まれているかを調べる
Private Function InArray(ByVal value As Long, ByRef arr() As Long) As Boolean
    Dim i As Integer
    For i = LBound(arr) To UBound(arr)
        If arr(i) = value Then
            InArray = True
            Exit Function
        End If
    Next
    
    InArray = False
End Function
```

### 結果
```
True
True
False
False
```

# 補足
`InArray`関数を宣言するところで`Private`と記述しています。これを付けることで、エクセルのワークシートの関数候補から表示されなくなるようです。しかし、関数名を直接入力すれば使用はできるようなのでそこは注意が必要です。
詳しくは、下記の記事が参考になります。

https://www.excel-chunchun.com/entry/20211011-worksheet-function-4

以上です。
erbで関数的にコードの再利用を行う

erbは他言語含め有名なテンプレートエンジンと比較すると特別な構文がとても少ない。

jinja系でいうところのmacro、pugとかでいうところのmixinの機能は最低限ほしいと感じることはないだろうか。

実は特別な構文など用意しなくてもerbではその辺の要件を簡単に満たせる

## macro, mixin的なものが不要な理由

jinja系だとHTML snippetの関数的な再利用方法としてmacroがある

こんな感じだ

```jinja
{% macro foo(title, content) %}
<details>
  <summary>{{ title }}</summary>
  <div>
    {{ content }}
  </div>
</details>
{% endmacro %}

{{ foo('最寄駅について', '大崎駅まで徒歩5分、大崎広小路駅まで徒歩6分です') }}
```

これをerbで書くとこんな感じで書ける

```erb
<% foo = lambda do |title, content| %>
<details>
  <summary><%= title %></summary>
  <div>
    <%= content %>
  </div>
</details>
<% end %>

<%- foo.call('最寄駅について', '大崎駅まで徒歩5分、大崎広小路駅まで徒歩6分です') %>
```

escape回りが二重にならないように気を付ける必要はあるがlambdaでできてしまう。

なんならblockを渡せばインラインなembed的なこともできる

```erb
<% foo = lambda do |title, &block| %>
<details>
  <summary><%= title %></summary>
  <div>
    <%- block.call %>
  </div>
</details>
<% end %>

<%- foo.call('最寄駅について') do %>
  <ul>
    <li>大崎駅まで徒歩5分</li>
    <li>大崎広小路駅まで徒歩6分'</li>
  </ul>
<% end　%>
```

といった感じにも書ける。

rubyの柔軟さの上に立っているerbには特別な構文などさほど必要になるケースはないのかもしれない。