OmniAICreator/Qiita-1.07M huggingface dataset:
Tableauの学習者のアサインと育成方法の種類と比較

いくつかのユーザー会で各社の事例をヒアリングしたうえで、社内でTableauユーザーの育成方法について考える機会があったため、これを個人的な所感も含めて整理してみました。規模や拡大状況によって最適な方法は異なるため、必ずしも1つの方法が他の方法より優れているわけではありませんが、各方法の特徴やポイントを比較することで、自社に最適なアプローチを選択するための参考にしていただけるかと思います。

## 意識すべきポイント

Tableauの学習・育成を進める際に重要なことは、**「馬を水辺に連れて行くことはできても、水を飲ませることはできない」** という点です。つまり、強制的に教育を進めても、学ぶ側のモチベーションや実際の業務で活用できるかどうかは、結局のところ本人の意欲や適性に依存する部分が大きいということです。無理に教育を押し付けても時間の無駄になりがちなので、**適切な環境やモチベーションを整えること**が成功のカギとなります。

## 各育成方法の比較

以下に、Tableau学習者のアサインと育成方法をいくつかのパターンに分けて比較しました。

|   | 1. アサイン | 2. マス向け | 3. 1to1 | 4. 折衷案 |
|---|---|---|---|---|
| **概要** | アサインされた人が仕事として行う | 有志を募る社内セミナー | イケてる人を選出、パワーユーザーを育てる | 有志に限定ワークショップBootCamp形式 |
| **メリット** | 仕事として行うため、コミットできる | 文化があれば、集まって大規模に進めることが可能 | 個別に丁寧に育てることで確実に広がる | 定期的に実施することで参加者が増え、確実にアウトプットが作れる |
| **デメリット** | スケールしづらく、少数精鋭でないと成立しない。異動や退職時のリスクが大きい | 文化がない場合、参加者が少なく成果が上がりづらい（例えば500名が参加しても実際に活用するのは2～3名） | スケールの速度が遅い | 運営コストが比較的かかる |

### 1. アサイン方式

- **概要**: 特定のメンバーをアサインし、彼らに業務としてTableauを学ばせる方法です。例えば、データ分析の担当者や新しい業務に必要なスキルとしてTableauを学習させるケースです。
- **メリット**: アサインされた人は業務として取り組むため、コミットメントが高くなります。自分の担当業務として学ぶことで、学びが実践に繋がりやすいです。
- **デメリット**: アサインされるメンバーが限られるため、スケールがしづらく、組織全体に広げるのは難しい場合があります。また、異動や退職などでリスクが大きくなりがちです。

### 2. マス向け方式

- **概要**: 社内で有志を募り、大規模な社内セミナーや勉強会を実施する方法です。多くの社員が参加する形式で、一定の文化が根付いていれば広く浸透させることが可能です。
- **メリット**: 文化があれば集まる人が多く、大規模に進めることができます。組織全体に広げやすいですが、その成果が一部に留まる可能性もあります。
- **デメリット**: 文化がないと参加者が少なく、実際に学んだ内容を活かす人が少なくなることがあります。例えば、500名が参加しても、実際に活用するのは数名にとどまることがあります。

### 3. 1to1方式

- **概要**: 特定のメンバーを選出し、個別に丁寧にTableauのスキルを育成する方法です。特にパワーユーザーを育てて、社内での活用範囲を広げることを目的とします。
- **メリット**: 1人1人を大事に育てることで、口コミや口伝で確実に知識を広めることができます。育成が行き届くため、学習効果が高くなります。
- **デメリット**: 個別での学習になるため、スケールの速度が遅く、数多くの社員に迅速に広めることが難しいです。

### 4. 折衷案

- **概要**: 1to1方式とマス向け方式の中間を取った形式で、有志を募って限定的にワークショップやBootCampを開催する方法です。複数回行い、参加者が増え、一定のアウトプットを作り出すことを目指します。
- **メリット**: 定期的に実施することで参加者を増やし、確実に成果物（アウトプット）を作ることができます。個別育成の要素を取り入れつつ、ある程度スケールさせることが可能です。
- **デメリット**: 運営コストやリソースの確保が比較的かかるため、長期的に続けるには一定の体制が必要です。

## 最適な方法を選ぶために

上記の方法に優劣はなく、会社の規模や現状の文化、リソースに合わせて最適な方法を選ぶことが大切です。どの方法を選んでも、**教育の強制は避け、学ぶ意欲を引き出すことが重要**です。個人的には、**折衷案**が最もコストパフォーマンスが高いと感じており、適切な運営とアウトプットを作ることで確実に成果を出せると思います。
Pythonで実行中の関数と変数の名前を簡単に取得する

# 環境
Python3.6以降

# 取得する方法

例外処理などを書くときにで関数や変数を決め打ちして書き出すこともできるが、関数や変数の名前に変更があるとめんどい。

```Python3
def hoge(fuga):

    raise ValueError("hoge関数のfuga変数の値がおかしい。")
```

なので、vscodeなどのエディターを使い、関数や変数の名前を一括して変更できる機能に期待して次のように書く。
何もインポートする必要はない。

```Python3
def hoge(fuga):

    f_name = hoge.__name__
    v_name = f"{fuga=}"[:f"{fuga=}".find("=")]

    raise ValueError(f"{f_name}関数の{v_name}変数の値がおかしい。")
```

関数名のみ`inspect`をインポートすることで次のように書ける。この場合、関数名を書き換える際にエディターの名称を変更する機能を使う必要もなくなる。

```Python3
import inspect

def hoge(fuga):

    f_name = inspect.currentframe().f_code.co_name
    v_name = f"{fuga=}"[:f"{fuga=}".find("=")]

    raise ValueError(f"{f_name}関数の{v_name}変数の値がおかしい。")
```
Tableauってなんだ

※この記事は [クラウドワークス グループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/crowdworks) シリーズ1の6日目の記事です。
# はじめに
10月からクラウドワークスにjoinして早２ヶ月。社内でもちょいちょいTableauという単語が聞こえてくるのでTableauって何だっけ？を記事にします。
[Tableauのミッション](https://www.tableau.com/about/mission-values)は"We help people see and understand data" = 「人がデータを視覚的に理解することを助ける」であり、その主な機能はデータベースやExcel、CSVなどをデータソースとしたグラフやダッシュボードの作成です。
ダッシュボードと聞くとガリガリコードを書いて画面を作るのかいと思うかもしれませんが、基本的なものであれば全てマウス操作だけ作ることができます。

# 基本的な操作
Tableauの操作を言葉で説明するのは困難なので、簡単なグラフを作成する様子を動画で紹介します。

<iframe width="1057" height="595" src="https://www.youtube.com/embed/7YCkz8S3j3Q" title="俺のデータ" vq=highres frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

動画は若干カットしていますがデータの読み込みからグラフの作成まで等倍速です。
業務で使う場合には、データベースへ接続して、体裁を整えて、作ったものをTableau Cloudへパブリッシュしてと他にやることが増えますが、他のBIツールと比較してもシンプルかつ直感的に作業できるツールです。

# データ加工ができる
Tableauの主な機能はデータの可視化ですが、演算やマスタの引き当てなどを行えます。そのいくつか機能をピックアップして紹介します。
### 計算フィールド
Tableauの編集画面でサクッと計算項目を追加できる機能です。四則演算はもちろん、[さまざまな関数](https://help.tableau.com/current/pro/desktop/ja-jp/functions.htm)が用意されています。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066866/efbfa8b5-f2ec-ba6e-4dff-8f389869b804.gif)
### Prepフロー
データのクリーニングを事前に行う機能です。
データの結合や計算項目の追加をやはりマウス操作を基本として行うことができます。また、作成したフローはData Managementオプションを購入することで定期処理することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066866/0119e2a6-9936-9d74-7b2d-a4fd4092b384.png)

### カスタムクエリ
TableauからデータベースやDWHへ接続した場合に、クエリの結果をデータソースにできる機能です。
データベース側で分析用のViewやテーブルが用意されていることが望ましいですが、独自にデータをクエリしたい場合などに便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066866/81279d94-9abe-beed-1106-9268f6057fc3.png)

# 気をつけること
ここまで、マウスで簡単に作れてデータの加工もなんでも出来ちゃうぜ！と書いてきましたが、何でもできるからこそ気をつけることがあります。
### 作り込みすぎない
Tableauで複雑にデータの加工を行うと、その加工が正しいのか検証が困難になり、それっぽい何かを表示するダッシュボードを量産することになります。フィルタや簡単な集計に抑え、表示する値がどのように算出されているか確認できる状態を目指しましょう。

### 無闇にデータを追加しない
データパイプラインはおおよそ上流から下流へ一方向に構築されます。例えば、手元のExcelデータを横から追加したり、分析用に自分専用のマスタを紐づけたりすると、その値の正しさは担保されなくなります。信頼されたデータソースを元に分析しましょう。

### 相談しよう
やりたいことはあるが、用意されているものでは不十分そんなこともあるでしょう。そんなとき他の人も同じことに困っていたりする可能性もあります。問題提起をしてデータマートの改善を図りましょう。

# まとめ
個人的かつ短期的なタスクにおいてはTableauをガンガン使って作業を効率化することは有効ですが、KPIダッシュボードなどチームで中長期的に利用する場合は運用が必要になります。
また、TableauはExcelやPPTのようにツールでありシステムではありません。作成したダッシュボードをソースコードで管理することはできないので、誰がダッシュボードを改修できるか、閲覧制限はどうするか、棚卸しやバックアップは,,,と決めなくてはいけない運用がたくさんあります。
企業へ導入する際には、CoEを組織するなど負債を抱えにくい体制で望みたいですね♪

タイトル回収：
Tableauってなんだ → 正しく使えば超便利なBIツール
MySQL でテーブルサイズを調査する手順

# これなに

RDS インスタンスのランニングコストを節約したいと思って、どのテーブルサイズが大きいのだろうと調べた時のメモです。
わりとみなさんご存知の内容だと思いますし、説明も十分では無いと思うので参考程度にご覧いただければと思います。


# 調査手順

### MySQL に接続

釈迦に説法だと思いますが、一応 MySQL の接続コマンドをメモしておきます。
`-h`, `--port` オプションは任意なので、ご自身の環境に合わせてカスタムしてください。

```zsh
> mysql -u ユーザー名 -h ホスト名 -- port ポート番号 -p
```

### テーブルサイズ調査クエリ

`information_schema` データベースを使用してテーブルのサイズ情報を取得できます。
クエリは以下の通りです。

```sql
SELECT 
    table_schema AS `Database`, 
    table_name AS `Table`, 
    table_rows AS `Rows`,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS `Size (MB)`
FROM 
    information_schema.TABLES
WHERE 
    table_schema = 'データベース名称'
ORDER BY 
    (data_length + index_length) DESC;
```


取得したクエリ結果は以下のようなものです。
参考程度にご覧ください。

```sql
mysql> SELECT
    ->     table_schema AS `Database`,
    ->     table_name AS `Table`,
    ->     table_rows AS `Rows`,
    ->     ROUND((data_length + index_length) / 1024 / 1024, 2) AS `Size (MB)`
    -> FROM
    ->     information_schema.TABLES
    -> WHERE
    ->     table_schema = 'su3_database'
    -> ORDER BY
    ->     (data_length + index_length) DESC;
+--------------+--------------------+---------+-----------+
| Database     | Table              | Rows    | Size (MB) |
+--------------+--------------------+---------+-----------+
| su3_database | sent_email_history |   41965 |   1167.23 |
| su3_database | user_settings      |   52319 |   1110.16 |
| su3_database | user_accounts      | 3189785 |    410.77 |
+--------------+--------------------+---------+-----------+
3 rows in set (0.02 sec)

mysql>
```


# さいごに

結構忘れがちなので個人的にメモしておきました。
繰り返しになりますが、わりとみなさんご存知の内容だと思いますし、説明も十分では無いと思うので参考程度にご覧いただければと思います。
Tableauの費用対効果の説明のヒント　～成果創出編～

# Tableauの費用対効果の説明のヒント　～成果創出編～

Tableauの費用対効果の説明は、特にユーザー会などでしばしば議論になり、説明する側としても難しい点があります。今回は、その中でも**成果創出**という視点に焦点を当てて、どのように費用対効果を説明すればよいかをまとめてみました。

## 成果創出の視点で費用対効果を考える

費用対効果を議論する際、ただ「目の前の人が喜んでくれるか」や「使ってくれる人が多いか」という視点で捉えるのではなく、**分析・可視化を通じてどれだけの成果を生み出せるか**という視点を持つことが非常に重要です。これを意識することで、単なる作業効率の向上にとどまらず、実際に経営にどう貢献するかというゴールに近づくことができます。

私は以前、目的設定を簡単に行ってしまっていたこともありますが、その結果として**最終的な成果を見落とすことが多かった**と感じています。分析結果を出すことだけに意識がいきがちですが、その結果が**経営指標や会社の戦略にどう影響を与えるか**を考え直すことが大切です。

## DIVAフレームワークを使った目的設定

ここで紹介したいのが、データ分析の仮説を立てるための**DIVAフレームワーク**です。このフレームワークでは、データ分析の目的を整理する際に重要なのは、**得られる価値（Value）**と**得られる成果（Achievement）**を明確にすることです。

- **Value（価値）**: 作成した可視化（Viz）が直接的に生み出す成果を指します。例えば、営業データの可視化によって、特定の営業チームがどの製品を優先的に売るべきかを把握できるようになるといった、具体的な利点です。
- **Achievement（成果）**: 可視化が最終的に**経営指標にどのように影響を与えるか**を指します。たとえば、営業戦略の改善により**売上がどれだけ増加するか**、**利益率がどれだけ改善されるか**という結果です。

## ValueとAchievementの違い

作り手の視点では、どうしても**Value**（作った可視化がどれだけ使いやすいか、正確か）に目が向きがちです。しかし、**Achievement**の観点から見ていくことで、最終的に**どれだけの利益向上に繋がるか**を意識し、優先すべき分析課題やプロジェクトを判断できます。

例えば、営業データの分析で「どの製品が売れるか」を可視化することは**Value**としては非常に高いですが、これが**営業戦略全体を改善し、最終的に利益にどれだけ貢献するか**という視点を持つことで、より**戦略的なリソース配分**ができるようになります。

## 経営指標への影響を意識する

特に重要なのは、**Achievement**（成果）の視点を持つことで、Tableauによって得られた成果が単なる作業効率化にとどまらず、会社全体の経営指標や戦略にどう貢献するのかを明確にすることです。

作り手としては、時に「分析結果が素晴らしいものだ」と思い込んでしまうこともありますが、実際には**その成果が会社の戦略や経営指標にどれだけ寄与するか**が最も大切なポイントです。**利益向上、コスト削減、戦略的意思決定**にどう繋がるかを常に意識して作業を進めることが、費用対効果を最大化するために重要です。

## リソース配分を意識したプロジェクト選定

DIVAフレームワークを用いて、**Value**と**Achievement**を踏まえてより効果の高いプロジェクト選定を行うことで、**限られたリソースを効率よく配分**できます。Tableauの設定や分析可能な人は社内で限られていることが多いため、どのプロジェクトにリソースを投入するかを、**経営指標への影響**を基に優先順位をつけることが非常に重要です。

例えば、ある営業チームの売上分析が必要だとしても、それが**全体の利益に与える影響**が小さい場合、そのプロジェクトに時間をかけることが費用対効果に見合わない可能性があります。一方で、全社的な利益改善に直結する分析であれば、**リソースを優先的に割くべきです**。

## まとめ

Tableauの成果創出における費用対効果の説明は、単に「どれだけ効率が上がったか」を示すだけでは不十分です。重要なのは、その**成果が経営指標や戦略にどれだけ貢献するか**を明確にすることです。**DIVAフレームワーク**を使って、得られる価値（Value）と経営指標への影響（Achievement）を整理し、リソース配分を最適化することで、費用対効果を最大化できると考えています。分析の目的を整理し、実際の成果がどのようにビジネスに貢献するかを意識することが、成功に繋がるでしょう。
【Go】任意の型を受け取るメソッド、interface{} とジェネリクスの活用

Goで構造体のメソッドを作成する際に、引数として任意の型を受け取れるようにする方法はいくつかあります。主に以下の2つの方法が考えられます。

1. **空のインターフェース `interface{}` を使用する方法**
2. **ジェネリクス（型パラメータ）を使用する方法（Go 1.18以降）**

それぞれの方法について詳しく説明します。

---

## 1. 空のインターフェース `interface{}` を使用する方法

Goでは、`interface{}` はすべての型を満たすため、任意の型の引数を受け取ることができます。ただし、`interface{}` を使用すると型安全性が失われるため、受け取った値を使用する際には型アサーションや型スイッチが必要になる場合があります。

### 例：

```go
package main

import (
    "fmt"
)

// 構造体の定義
type MyStruct struct{}

// メソッドの定義
func (m *MyStruct) PrintValue(value interface{}) {
    switch v := value.(type) {
    case int:
        fmt.Printf("整数: %d\n", v)
    case string:
        fmt.Printf("文字列: %s\n", v)
    default:
        fmt.Printf("その他の型: %v\n", v)
    }
}

func main() {
    m := &MyStruct{}

    m.PrintValue(42)          // 整数: 42
    m.PrintValue("Hello")     // 文 字列: Hello
    m.PrintValue(3.14)        // その他の型: 3.14
}
```

### ポイント：
- `interface{}` を使用することで、任意の型を引数として受け取ることができます。
- 受け取った値を使用する際には、型アサーションや型スイッチを利用して具体的な型に変換する必要があります。

---

## 2. ジェネリクス（型パラメータ）を使用する方法（Go 1.18以降）

Go 1.18から導入されたジェネリクスを使用すると、型安全性を保ちながら任意の型を扱うことができます。ジェネリクスを使用することで、コードの再利用性が向上し、型に依存したロジックを明確に記述できます。

### 例：

```go
package main

import (
    "fmt"
)

// 構造体の定義
type MyStruct struct{}

// ジェネリックメソッドの定義
func (m *MyStruct) PrintValue[T any](value T) {
    fmt.Printf("値: %v\n", value)
}

func main() {
    m := &MyStruct{}

    m.PrintValue(42)          // 値: 42
    m.PrintValue("Hello")     // 値: Hello
    m.PrintValue(3.14)        // 値: 3.14
}
```

### ポイント：
- メソッドに型パラメータ `[T any]` を追加することで、任意の型 `T` を受け取ることができます。
- ジェネリクスを使用することで、受け取る型に対する型安全性が保たれます。
- `any` は `interface{}` のエイリアスで、任意の型を表します。

---

## まとめ

- **`interface{}` を使用する方法**はシンプルですが、型安全性が低く、値を使用する際に型アサーションが必要です。
- **ジェネリクスを使用する方法**は型安全性が高く、より柔軟かつ再利用性の高いコードを記述できます。ただし、Go 1.18以降が必要です。

---

### 参考リンク
- [Go言語公式ドキュメント - インターフェース](https://golang.org/doc/effective_go.html#interfaces)
- [Go言語公式ブログ - ジェネリクスの導入](https://go.dev/doc/tutorial/generics)
FeetechServo(STS3215)をROS2から動かす(足回りとしても使えるよ)

## はじめに

高専ロボコンで、機械班からサーボモーターを使いたいとの申し出があったので開発。
弊部のサーボモーターの制御・回路周りはロステクしたので新規開発。
せっかくなので知見として残しておきます。

---

※この記事は@srs様の[ROS2講座11 FeetechServo(STS3215)を動かす](https://qiita.com/srs/items/5664b3adfea889763a98)を大いに参考・引用させていただいています。心から感謝申し上げます。

## STS3215の仕様について


### サーボ本体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884184/6c9da8f9-13dc-e088-9dd4-2d3c2ddb921d.png)

### サーボ用インターフェイスボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884184/7ed14464-ef12-ef73-3933-f8985d243098.png)

---

- このサーボの強み
  - 安い(¥3000)
  - **__ROS2から制御できる__**
  - **__駆動角制限なし(無限回転可能)__**
  - UART/PWM両方の制御が可能
  - 4.0~7.4Vの幅広い駆動電圧 **(configから無理やり変更可能)**
  - 19.5kgf・cmのそこそこなトルク
  - 小さい(長辺：45.23mm 短辺：24.73mm 高さ：35mm)



サーボの購入元：[秋月電子](https://akizukidenshi.com/catalog/g/g116312/)
インターフェイスボードの購入元：[秋月電子](https://akizukidenshi.com/catalog/g/g116295/)

↑のリンクに中国語のデータシートがあるので頑張って読もう！

...っていうのも酷なので設定するところだけ説明します！

## 初期設定

windowsPCで秋月のリンクからダウンロードしたものの中に`FD.exe`があるのでそれを起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884184/fa7801ea-aeab-3a31-92e9-0cbff92c7291.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884184/a462abd2-bc56-c980-eac9-4a8220d2fcda.png)

:::note warn
複数のサーボをつなげた状態で設定してもいいが、IDがかぶっていると通信不可になるのでひとつずつ設定するのが無難。
:::


- 手順
0. USBとV1をつないで電源電圧をかける。
1. 左上COM(n)を選択
2. BaudRで`1000000`を選択(100万bps)
3. open
4. Search→少し待つ
5. サーボをつなげていて、電源電圧を与えていれば下の表に出てくるのでそれを選択
6. 上のリボンから`Programming`を選択
7. ↑の画面になるので、下の表のValueの通りに変更(書いていないところは変更しなくてok)

|Address|Memory|Value(変えるところ)|Area|R/W|
|:-:|:-:|:-:|:-:|:-:|
|5|ID|好きな数字[0~255]|EPROM|rw|
|6|Baudrate|(詳細は下へ)|EPROM|rw|
|9|Min Position Limit|0|EPROM|rw|
|11|Max Position Limit|0|EPROM|rw|
|33|Work Mode|(詳細は下へ)|EPROM|rw|

**Work Mode(一番大事)**:
|Value|機能|備考|備考2
|:-:|:-:|:-:|:-:|
|0|多回転位置制御モード|-32236~32237の範囲で動作<br>(普通のサーボのモード)|デフォルト
|1|等速回転モード|無限回転可能<br>角度制御はできない|足回り用
|2|PWMモード|PWMで動かすモード|


Baudrate:
|Value|rate[bps]|備考|
|:-:|:-:|:-:|
|0|1000000|デフォルト
|1|500000|
|2|250000|
|3|128000|
|4|115200|
|5|76800|
|6|57600|
|7|38400|

:::note warn
4未満(115200bps未満)にすると動作が不安定になります。
RaspberryPi 3A, 4B, Nucleo-F446REではデフォルトの1000000bpsで問題ないと思います。
:::

## 回路周り

こんな感じに青色のやつを剥ぎ取ってXTコネクタなどをつけるのが無難。

![20241101_172312.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884184/99681a8e-b742-2196-2d3e-26138c97ed02.jpeg)

ROS2から動かす場合はUSBを直接つなげればOK
マイコンから動かす場合は5芯のやつをつなげればOK
(DTRは何も繋げなくてOK)

スイッチは必ず5V側に倒しましょう。

これで終わり。かんたん！！

# 制御周り

## マイコンからの場合

秋月のファイルにArduino用ライブラリがあるのでそれを適当に改造して使う。
Mbedで使いたい場合もちょっと改造すればOK.
例：`Serial --> BufferedSerial`

## ROS2からの場合 

まず前提として先人@srs様の[ROS2講座11 FeetechServo(STS3215)を動かす](https://qiita.com/srs/items/5664b3adfea889763a98)をかならず見てから使用してください。
ほとんどがこのプログラムを改良したものになります。
(最初のworkmode[1]に対応させただけ・ちょっと機能追加しただけ)

#### 事前準備

[ROS2講座11 FeetechServo(STS3215)を動かす #事前準備](https://qiita.com/srs/items/5664b3adfea889763a98#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)を参照。

#### コード

下を参照。

https://github.com/nekodamasi34/feetech_controller


`ROS2 topic echo joint_states`でフィードバックの情報が読めます。

改良点はトルクを切る(手で回せる)状態にしたり、なんかいろいろできるようにしてあります。
適当コードですがどーぞ
初心者による技術論文執筆のQ&A

### 本資料のターゲット
本稿は学部論文を執筆する方に向けて書いています。筆者がアカデミックな領域を知らないのであくまで初心者の忘備録です。

筆者は2021年に1年掛けて研究活動した結果を、翌2022年～2023年に掛けて論文として執筆しました。執筆自体の期間は2022/12/29～2023/2/3の5週間ほどです。研究は業務と並行しながらで、執筆は主に業務外の時間を使って書きました。

簡単な機械学習プログラミングの習得をテーマに学習の手法について、「**機械学習プログラミングのスキル習得における集団学習の有効性**」として情報処理学会様に掲載して頂きました。

https://www.ipsj.or.jp/dp/contents/publication/56/S1404-U03.html

:::note info
技術論文と銘打ってますが、筆者の執筆論文はバリバリ文系論文だと思います。
:::
この論文執筆で得た知見をもとに、これから学部論文を執筆される方のヒントになれば幸いと考え、本稿を書いています。
本稿では、下記のような一問一答式で、技術論文執筆において参考になりそうな情報を記載しています。

## Q.楽に論文を終わらせるにはどうしたらいいか。
### A.担当教授に素直に何度もアドバイスを求めたほうがよいです。
できれば最初からやる気MAXで居たほうが結果楽です。足繫く研究室に通い、教授とコミュニケーションを試みるのが最も楽に論文を終わらせる方法だと思います（楽に終わらせられるとは言ってない）。
ほとんど何もせず締切が見えてくるような万事休すな状況でもアクション起こせば温情ですくってもらえることがあります（体験談）。


## Q.泥臭いのは嫌だ！スマートに楽するならどうしたらいい？
### A.先輩の研究を譲り受けて、先人たちの論文を参考に書くのが楽だと思います。
そんなスマートな人は本稿のようなトピックスは目にしないと思います。


## Q.何から書いたらいいかわからん
### A.論文作成穴埋めシートなるものを提供している方がいらっしゃいます。これを埋めると何が足りていないかわかります。

https://readingmonkey.blog.fc2.com/blog-entry-563.html

穴埋めシート直後に「**あなたは論文が書けないのではない、研究ができないのだ**」という正論置きパンチがあるので存分に食らうといいと思います。


## Q.データなんかねえよ。
### A.ないのはワラント（データと主張の紐づけ）のほうではないですか。

筆者が論文執筆中に強虫モンブランが流行っていました。
筆者も歌詞に大いに共感しましたが、突き詰めて考えると主張を無条件に肯定してくれる最高に便利なデータがない、というだけでした。

本当にデータがない人は執筆に取り掛かれていないと思うので、多分データと主張を紐づける箇所が足りないのだと思います。

これも前述ブログ著者のくるぶし（読書猿）様曰く、ワラントというデータと主張を紐づける根拠や説明が論証の1つであるとのことです。

>およそ論文ならば、主張を言いっぱなしにするのでなく、主張を証拠に基づいて論証しなくてはならない。
>論証の基本フォーマットはつぎの３つで構成される（論証の三角形）。
>・クレーム（主張）
>・データ（主張を支える事実）
>・ワラント（データと主張を結びつけ、データによってどのように主張が根拠付けられるかを示す説明）
> (引用：https://readingmonkey.blog.fc2.com/blog-entry-563.html)

論文に取り掛かろうとするとき、何らかの仮説に基づき、データと呼べるものを集めていると思うのですが、その仮説をいかに立証にたるデータとして主張に紐づけるのか、という工程が論文の肝だと感じました。

具体的にはデータの正当性の立証の上で、研究の正当性を論じる、というやり方です。
また同ブログ様より引用いたします。
（引用であるが読みやすさのため本稿の著者による文字の強調を施している）

>**A. このデータは正しい**
>・（クレーム）このデータは正しい（得られたデータは信頼に値する）
>・（データ）データの収集方法（実験手続、測定方法、統計処理の方法、実験回数など）…論文のMethods & Materials
>・（ワラント）（データ収集方法が確立されている場合省略されることが多い）
> 
>**B.この研究は正しい**
>・（クレーム）論文全体の主張（検証命題）は正しい（｢XXのモデルとよく一致した(あまり一致しなかった)｣など）
>・（データ）得られたデータ…論文のRsults
>・（ワラント）データから言えること（推論）…論文のDiscussion
> (引用：https://readingmonkey.blog.fc2.com/blog-entry-563.html)

データを集めるにあたり立てた仮設を立証することが、研究の正しさの立証を補完します。
但し、メインとなるのは研究の主張がなぜ正しいといえるのか（ワラント・推論）の部分で、データによる立証はあくまで推論を支える足場です（だからデータは大事ですがすべてを立証してくれるわけではないです）。


## Q.論文用の文章の書き方がわからん
### A.山内志朗 著「ぎりぎり合格への論文マニュアル」が参考になります。

基本作法、出典や参考文献、注釈の書き方などはもちろん「すぐに使えるフレーズ集」は読んでて楽しいですし、実際いくつか使いました。
執筆開始前に一通り読みましたが、テクニックよりも心構え的な内容のほうが心に残りました。
新書で文章も短く明瞭でわかりやすくて面白いので、できれば全部読んでからテクニックを使ったほうが、山内志朗氏も本望ではないかと思われます。

https://amzn.asia/d/ch6WvJj

※アフィリエイトリンクではありません。

## 終わりに
本稿があまり有益な記事である実感はございませんが、論文執筆自体は楽しかった記憶がございます。
書いた文字数は2万文字（400字詰め原稿用紙50枚程度）で、中学生の時に書いたオリジナル小説の同原稿用紙20枚の記録を大きく上回る結果となり、大変満足しています。
学部論文は2～4万字位が多いそうなので、筆者の体験は学部論文よりライトなものだったようです。

末筆ではございますが、現在進行形で執筆されている方がおられましたら、陰ながら応援しております。どうか最後まで頑張ってください。
オブジェクト指向プログラミング関連の用語

# クラス
>クラスは一種のデータ型です。`「オブジェクトの設計図」`とか`「オブジェクトの雛形」`と呼ばれたりすることもあります。`Rubyではオブジェクトは必ず何らかのクラスに属しています`。クラスが同じであれば、保持している属性（データ項目）や使えるメソッドは（原則として）同じになります。

* クラスに属する同じメソッドを使うことができる

# オブジェクト、インスタンス、レシーバ
>クラスをもとにして作られたデータの塊をオブジェクトと呼びます。場合によってはオブジェクトではなくインスタンスと呼ぶこともあります。
...
また、メソッドとの関係を説明する場合には、オブジェクトのことをレシーバと呼ぶこともよくあります。
>```rb
>user = User.new("Alice", Ruby", 20)
>user.first_name
>```
>「ここでのfirst＿nameメソッドのレシーバはuserです」。
...
「レシーバ」は「メソッドを呼び出された側」というニュアンスを出したい時によく使われます。

* クラスから生成されるものをオブジェクト、インスタンス、レシーバと呼ぶ

# メソッド、メッセージ
>```rb
>user = User.new("Alice", Ruby", 20)
>user.first_name
>```
>2行目ではuserというレシーバに対して、first_nameというメッセージを送っている」。
...
レシーバとメッセージという呼び方は、Smalltalkというオブジェクト指向言語でよく使われる呼び方です。RubyもSmalltalkの影響を受けている部分があるので`ときどきレシーバとメッセージという用語が使われる場合があります`。

* オブジェクトがレシーバでそれを操作する人間がメソッドというメッセージを送るor付け足すことによって返答が返ってくる

# 状態（ステート）
>`オブジェクトごとに保持されるデータのことを「オブジェクトの状態（もしくはステート）」`と呼ぶことがあります。例えば、「信号機オブジェクトの現在の状態は赤です」と言った感じです。また、`Userクラスが持つ「名前」や「年齢」と言ったデータも、オブジェクト指向の考え方で言うと、「Userの状態」`に含まれます

# 属性（アトリビュート、プロパティ)
>オブジェクトの状態(オブジェクト内の各データ)は外部から取得したり変更したりできる場合があります。
>```rb
>user.first_name = "アリス”
>```
>このようにオブジェクトから取得（もしくはオブジェクトに設定）できる値のことを属性（もしくはアトリビュートやプロパティ）と呼びます。

https://gihyo.jp/book/2017/978-4-7741-9397-7
DHCPのない環境下でのwin11のセットアップに必要なネットワークの設定メモ

# はじめに
業務でwindows11のセットアップが必要になりました。少し特殊な環境で、DHCPサーバーがなく、IPアドレスやDNS情報が降ってこないネットワーク上でのセットアップでした。
もちろん、IPとDNSの設定ができればNAT経由でインターネットに接続できる環境です。
回避手段を思いつくのに少し時間がかかったので、メモを残しておきます。
(同様の問題を抱える人がどれだけでてくるか、わかりませんが・・・)

# 結論
netshコマンドでipアドレスとDNSの設定を入れてください。
この1文で納得できる方は以降の文章は読まなくても大丈夫です。

# 環境

| 項目　 | 詳細 |
| :-- | :-- |
| OS | windows 11 |
| バージョン | 24H2 |
| セットアップ日 | 2024-11-12 | 

# 具体的な手順

## コマンドプロンプトの起動
国を選択した後のネットワークの接続の画面で、`shift + F10` でコマンドプロンプトを起動します。

## アダプターの確認
下記のコマンドで使用するインターフェースの名前を確認します。
多くの場合は` "イーサネット” `になると思います。

> netsh interface ip show config

## ipアドレスとGWの設定
下記のコマンドでホストのアドレスとGWの情報を設定します。
アダプタ名の前後に` " ` が必要になります。要注意です。

> netsh interface ip set address "アダプタ名"  static <IPアドレス> <サブネット> <デフォルトゲートウェイ>

例)
> netsh interface ip set address "イーサネット"  static 192.0.2.10 255.255.255.0 192.0.2.1

## DNSサーバーの設定
下記のコマンドでDNSサーバーを設定します。

> netsh interface ip set dns "アダプタ名"  static <IPアドレス> 

例)
> netsh interface ip set dns "イーサネット"  static 1.1.1.3

## 確認
下記のコマンドで上記の設定が入っているか、確認してください。

> netsh interface ip show config

また、適当なサーバーへpingを打って、インターネットに接続できているか、確認します。

> ping www.google.com

問題がなければ`exit`で抜けてください。

## 次に進む
ネットワークの接続の画面に戻り、`次へ`を選択し、セットアップを続けます。


# おわりに
dnsサーバーを設定しなくてもdnsを引けることがあります。
しかし、明示的に設定するまではセットアップを続けることはできませんでした。
このあたりはハマりポイントなのかなと思います。
最近では `OOBE/Bypass`を使った、ローカルアカウントでのセットアップもできなくなったという話もちらほら耳にします。
もう少し分かりやすくなってくれれば...
atcoder練習(2024.11.12)

# キーワード
Divide and Conquer, zip, 実行時間

# 問題
https://atcoder.jp/contests/abc378/tasks/abc378_b

AtCoder 市では、N 種類のゴミを定期的に収集しています。
i(=1,2,…,N) 種類目のゴミは、日付を q<sub>i</sub> で割ったあまりが r<sub>i</sub> の日に収集されます。

Q 個の質問に答えてください。
j(=1,2,…,Q) 番目の質問では、d<sub>j</sub> 日に t<sub>j</sub> 種類目のゴミが出たときに、次にそれが収集される日を答えてください。

ただし、i 種類目のゴミが出た日が、i 種類目のゴミが回収される日であった場合、そのゴミは同じ日に収集されるとします。

制約
1≤N≤100
0≤r<sub>i</sub> < q<sub>i</sub> ≤ 10<sup>9</sup>

1≤Q≤100
1≤t<sub>j</sub> ≤N
1≤d<sub>j</sub> ≤ 10<sup>9</sup>

入力はすべて整数

入力
入力は以下の形式で標準入力から与えられる。

```
N
q1 r1
q2 r2
...
qN rN
Q
t1 d1
t2 d2
...
tQ dQ
```
出力
Q 行出力せよ。
j(1≤j≤Q) 行目には、j 番目の質問に対する答えを出力せよ。


```:入力例1
2
7 3
4 2
5
1 1
1 3
1 4
1 15
2 7
```
```:出力例1
3
3
10
17
10
```
解説
- 1 番目の質問：
  1 種類目のゴミが 1 日以降に初めて回収されるのは 3 日です。
- 2 番目の質問：
  1 種類目のゴミが 3 日以降に初めて回収されるのは 3 日です。
- 3 番目の質問：
  1 種類目のゴミが 4 日以降に初めて回収されるのは 10 日です。
# 回答
```py
N =int(input())
qr = [map(int, input().split()) for _ in range(N)]
q, r = zip(*qr)

Q = int(input())
td = [map(int, input().split()) for _ in range(Q)]
t, d = zip(*td)

for idx in range(Q):
    qi = q[t[idx] - 1]
    ri = r[t[idx] - 1]
    di = d[idx]
    
    next_collect = di + ((ri - di % qi) + qi) % qi
    print(next_collect)
```

# 参考

# 備考
- まず問題文を理解するのが難しかった。自然言語でコミニュケーションされている以上、自然言語で理解して、それをアルゴリズムに認識して、それをプログラム言語にするという三段階の構成がある。
- 実行時間制限に直面した。next_collectのところをwhileで書いていて、時間がかかっていた。やっぱりループを加えると計算時間は格段に増える。
- 入力例を通して、自分で問題文を確認して、頭の中の過程をよく理解することが、先述の自然言語での理解→アルゴリズムにするのに一助となる。
- 今回は入力の受け取りと、何種類かの認識、それに関する変数の取得、日にちの計算、それぞれを分割して個別に考えることでわかりやすくなった。「Divide and Conquer」めちゃんこ大事！
Markdownで行間を広げられない

# はじめに
まだQiitaに投稿を始めて間もないですが、投稿する際に遭遇した問題と解決策について少しずつまとめていこうと思います。

# 問題
Qiitaで記事を投稿しようとした際に、上の行と間隔を空けたいのにいくら改行を入れても行間を広げることができずに困っておりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818349/2d7e9b8e-5169-ce64-b573-22921aa00090.png)

# 解決策
改行前にスペースを入れておくことで解決できました。
改行だけでは行として認識してくれないようです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818349/731d59c9-0ff6-fce9-2cba-0fd2ed4243a6.png)

# 追加情報
上記の方法でも一応出来はしたのですが、追加で調べてみたところ、＜br＞というコードを入れるのが正しいやり方のようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818349/8202d1af-a541-e2bd-ed2e-210b4f652e5d.png)
AIモデルの3つの利用方法と必要なデータ量の違い

## はじめに
　AI（機械学習）の使われ方は大きく3つに分類でき、目的に応じて必要なデータ量も異なります。この記事では、それぞれの使い方と必要なデータ量について詳しく説明します。

## 内容
### 1.モデルのパラメータを学習する方法

　AIモデルを特定のタスクやドメインに最適化するため、データを用いてモデルのパラメータを学習する方法です。この場合、ファインチューニングやゼロからの学習（スクラッチ学習）も含まれます。

**特徴**: モデルの性能向上や、特定の用途に合わせた精度を得るために、データを使ってモデルのパラメータを更新・学習します。事前学習済みモデルがない場合や、より専門性の高いデータが必要なケースに適しています。

**必要なデータ量**: 数千～数百万件程度の大量のデータが求められ、データが豊富であればあるほどモデルの精度が向上します。

**例**: 医療診断や需要予測など、企業独自のデータでゼロからモデルを構築するケース。また、画像分類モデルのファインチューニングを行う場合も含まれます。


### 2.事前学習済みモデルの特徴量抽出機能を利用する方法

　事前学習済みモデルをそのまま活用し、パラメータの更新は行わず、データから抽出される特徴量（ベクトル）を利用する方法です。これにより、少量のデータでも高い効果を得られるのが特徴です。

**特徴**: 事前学習済みモデルが持つ特徴量抽出機能を使って、分類やクラスタリングなどのタスクに適用します。モデルのパラメータは固定されたまま、データの特徴だけを活用するため、新規データ準備の負担が少ないです。

**必要なデータ量**: 数百～数千件のデータで十分で、少量のデータでも効果的に機能します。

**例**: 顔認証やテキストのテーマ分類など、特定の特徴を利用したタスクに最適です。


### 3.事前学習済みモデルをそのまま利用する方法

　モデルのパラメータを変更せず、事前学習済みモデルをそのまま使用する方法です。この場合、学習やファインチューニングが不要で、少量のデータで即座に利用できるのが特徴です。

**特徴**: 事前学習済みモデルをそのまま利用し、新しいデータへの適応や調整が不要です。少量のプロンプトデータだけで有用な結果を得られるため、データ準備が非常に手軽です。

**必要なデータ量**: 最小限のデータ（数件～数十件）で十分です。

**例**: ChatGPTの質問応答やDALL-Eによる画像生成など、幅広いタスクに即座に対応できるシーンに適しています。


### 各方法のスケール感とデータ量のまとめ

　1つ目の方法は特定ドメインに特化したタスクのために大量のデータを必要とし、2つ目は特徴量抽出のために少量のデータで済みます。3つ目は新規データがほぼ不要で、すぐに使える汎用的な方法です。これらの分類は、AIをどのように活用するかを決める際の指針になります。使用する目的やデータの量に応じて、適切な方法を選択しましょう。

## まとめ

　AIの活用には、それぞれの方法に適したデータ量や学習方法が存在します。モデルの学習や特徴量の抽出、事前学習済みモデルの利用という3つのアプローチを理解することで、目的に応じた最適なAI利用が可能となります。
BigQuery Tips 日付を取得するUDF

SQLを書いて日付範囲を変更して確認していきたい時に、日付変更箇所が複数ある場合UDFを使うと楽になる。
tempをつけるとその名の通り一時的に関数が作成される。

```sql 
create temp function start_date() as (TIMESTAMP('2024-01-01 00:00:00'));
create temp function end_date() as (TIMESTAMP('2021-01-02 23:59:59'));

with item_master as (
    select
        item_id
        ,category
        ,create_date
    from 
        item_master
    where 
        create_date between start_date() and end_date() 
)

select 
    tran.item_id 
    ,item_master.category
    ,tran.price
    ,tran.create_date
from 
    tran
        left outer join 
    item_master
        on tran.item_id = item_master.item_id
where 
    create_date between start_date() and end_date() 
```
※SQLは適当です

ちなみにtempをtemporaryと書いても問題ない。
Lambda（Node.js）のDockerイメージをデプロイしてみた。（その４，ECRへ登録とLambdaの実行）

# はじめに
LambdaをDockerイメージでデプロイする方法を、調査する機会があったので自分の備忘用にメモ書きを残します。

実行環境は、前回から引き続きになります。
今回は、ECRにデプロイしてLambdaとして動作させる所をメモ書きします。

# AWS CLIを利用できるようにConfigureを実施

ECR関連を操作できるアクセスキーを用意して、configureする
```shell
aws configure
```
+ アクセスキー：払い出した物
+ シークレットキー：払い出した物
+ Default Region：ap-northeast-1
+ Default 出力フォーマット：json

# ECRにデプロイする

```shell
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 【AWSアカウントID】.dkr.ecr.ap-northeast-1.amazonaws.com
```
「Login Succeeded」と出力されれば成功。

# ECRにリポジトリを作成する
```shell
aws ecr create-repository --repository-name deploy_test --region ap-northeast-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
```
出力されるJSONの内、「repositoryUri」の値をメモする。

# Dockerタグをリポジトリを紐づける
```shell
docker tag deployproject:test1(ビルドの時に使用したタグ) 
     【AWSアカウントID】.dkr.ecr.ap-northeast-1.amazonaws.com/deploy_test(先の手順でメモした「repositoryUri」)
     
```

# ECRでイメージの登録
```shell
docker push 【AWSアカウントID】.dkr.ecr.ap-northeast-1.amazonaws.com/deploy_test:latest
```

# Lambdaのコンテナイメージを使用して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/3c92060d-8bd8-06ef-3512-1a6bd034d64d.png)

# まとめ
コンテナからデプロイするとソースは勿論閲覧できない。
いわゆるLambdaの「環境変数」や、「一般設定」、実行IAMロールは変更可能でした。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。
AWSのLambda開発関連で、ライトな開発や、ちょっと、こんな事を自動化したい！等も、お気軽に問い合わせください。

https://www.cs-cloud-aid.com/
OneDriveはファイルオンデマンドに（同期モード）

### オンデマンドでファイルを有効にする方法
Files On-Demand が有効になっていない場合は、デバイスで OneDrive にサインインしていることを確認します。 

OneDrive の設定を開きます。(通知領域で OneDrive クラウド アイコンを選択し、[OneDrive のヘルプと設定] アイコン 、[設定] の順に選択します。)

**[同期とバックアップ ]** に移動し、**[詳細設定]** を展開し 、**[すべてのファイルをダウンロードする]** をクリックします。

するとオフラインでもPC内でファイルが保持されて、OneDrive同期をOFFにしてもファイルがなくなることはありません。

でもこれはバックアップの使い方なのでPCのストレージを少なくしたい方は初期設定の同期モードでご使用ください。
【Ruby】each_indexメソッドとselectメソッドの性質の違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
現在`Array`クラスを勉強中ですが、その中でも`each_index`メソッドと`select`メソッドの意外な違いを発見したので記事にしようと思いました

# `each_index`メソッドとは
まず、`each_index`メソッドについて簡単に説明します。
`each_index`は、<strong>配列の各インデックスを順に処理するためのメソッド</strong>です。
通常、配列のインデックスに基づいた操作を行う際に便利ですが、重要な点は、<strong>新しい配列を作成する機能を持たない</strong>ということです。

```ruby
a = [10, 20, 30, 40, 50]
a.each_index do |index|
  puts "インデックス: #{index}, 値: #{a[index]}"
end
```
このコードでは、各インデックスを順に取得し、対応する要素を出力しています。
しかし、この操作は元の配列を参照するだけで、新しい配列を作成する機能はありません。
そのため、もし特定の条件に基づいて要素を抽出し、新しい配列に格納したい場合は、<strong>空の配列を初期化して自分で要素を追加する処理を記述する必要</strong>があります。

### (補足)each_with_indexのほうがこの場合はわかりやすい
コメントいただいたので補足として加えておきます。上記のように要素とインデックスを使用する場合は`each_with_index`を使用した方がわかりやすいです
```ruby
a = [10, 20, 30, 40, 50]
a.each_with_index do |value, index|
  puts "インデックス: #{index}, 値: #{value}"
end
```

each_indexを用いて特定の条件に一致する要素を集める場合は以下のように書く必要があります
```ruby
a = Array.new(100) { |i| i + 1 }
a3 = [] # 新しい配列を初期化

a.each_index do |index|
  if a[index] % 3 == 0
    a3 << a[index] # 条件を満たす要素を新しい配列に追加
  end
end

p a3
```
この例では、3の倍数を抽出して新しい配列a3に格納しています。
`each_index`は新しい配列を作成する機能を持たないので、上記のように、新しい配列を作成する際は自分で初期化する必要があります。

### (補足)上記の場合はeachのほうがシンプルでわかりやすい
上記のコードを`each_index`で書いてしまいましたが、`each`のほうがこの場合はシンプルで保守性も考えたら適切かなと思いました
```ruby
a = Array.new(100) { |i| i + 1 }
a3 = [] # 新しい配列を初期化

a.each do |x| 
  if x % 3 == 0 
    a3 <<x # 条件を満たす要素を新しい配列に追加 
  end
end

p a3
```

# `select`メソッド
次に、`select`メソッドについて見ていきましょう。
`select`は、<strong>配列の各要素を順に評価し、条件を満たす要素を新しい配列にまとめて返す</strong>イテレータメソッドです。
`select`は内部で新しい配列を自動で作成し、条件に一致する要素を格納して返してくれるため、<strong>新しい配列の初期化が不要</strong>です。
`select`を用いて特定の条件に一致する要素を抽出すると以下のようになります
```ruby
a = Array.new(100) { |i| i + 1 }
a3 = a.select { |i| i % 3 == 0 }
p a3
```
このコードでは、`select`メソッドが自動で3の倍数を集めて新しい配列を生成し、`a3`に代入しています。
`select`を使用することで、簡潔に記述でき、余分な初期化や要素の追加処理が不要になります。

# `each_index`と`select`の違いをまとめると
### 目的の違い
`each_index`は配列のインデックスに基づいた処理を行うためのメソッドであり、元の配列を操作する用途に向いています。
新しい配列を作成する機能は持たないため、別途配列を初期化する必要があります。
`select`は、特定の条件に一致する要素を集めて新しい配列を返すことが主な役割です。そのため、新しい配列を自動で作成して返す仕様になっています。

### 実装の違い

`each_index`では、要素を集めたい場合、自分で新しい配列を初期化し、<<で要素を追加する手間が必要です。
`select`では、条件に一致する要素を自動的に新しい配列に格納して返してくれるため、初期化不要で簡潔な記述が可能です。

# まとめ
`each_index`と`select`は、用途や性質が異なるメソッドですが、それぞれ適した場面で使用することで効率的な配列操作が可能です。
特に、新しい配列を作成する際の初期化の有無について理解することで、コードの記述がスムーズになります。
事前に知っておくことで、余計なコードを書く手間が減り効率のよいコードを書くことができるようになります。
続けやすい社内LT会の作り方 〜30分でできる！カジュアルな技術共有のすすめ〜

## はじめに

「社内でLT会を始めてみたいけれど、続けられるだろうか？」
「皆忙しい中で、時間を割いてもらえるだろうか？」

社内で技術共有の場を作りたいと思いつつも、このような不安を抱えている方も多いのではないでしょうか。本記事では、株式会社ダイアログが実践している「小さく始めて、無理なく続ける」LT会の運営方法をご紹介します。

## 設計の基本方針：小さく、カジュアルに

私たちが最も重視したのは、「継続できる形」を作ることです。具体的には、以下のポイントに注力しました。

### 1. 時間は30分

- 隔週木曜の15:30〜16:00に開催
- 発表10分×2名＋質疑応答
- 短時間なので予定が組みやすく、発表準備の負担も最小限

### 2. リモート開催

- フルリモートのメンバーも参加しやすい
- 移動時間が不要
- 録画を共有することで、後から視聴も可能（資料として蓄積し、後のドキュメント化にも活用）

### 3. 持ち回り制

- 毎回2名が発表し、負担を分散
- 全員に発表の機会があり、聴講のみの参加もOK

## 運営のポイント

### 発表内容の指定はざっくり

持ち回りで発表をしていくにあたり、発表内容は
「技術」と「仕事」に関わることならなんでもOK!! としました。

個人的に学んでいる内容の発表や、カスタマイズ案件で遭遇した問題の対処法など


### 進行スケジュール
```
15:30 
 開始
 発表①（10分）
 質疑応答（5分）
    
15:45
 発表②（10分）
 質疑応答（5分）
16:00 終了
```


### 最小限の運営タスク

- 発表順の管理（初回に抽選し、Slackで告知）
- 当日の進行役
- フィードバックフォームの共有（Googleフォーム）

運営自体も「小さく」始めることで、継続的な実施が可能になります。進行役の負担が少ないのもメリットです。

## つまずきやすいポイントと対策

### 1. 発表者の急な予定変更

- 発表順の変更や代打で柔軟に対応
- 調整が難しい場合は、発表順を後ろに回す
- 短時間のイベントなので、調整がしやすい

### 2. フィードバックの収集

- Googleフォームで簡単に収集
- 回答率を上げるために、事前共有とGoogle Meetのコメントで積極的に告知
- フォームの項目は最小限に（回答者氏名、各登壇者への感想や疑問点など）
- 数値評価（満足度など）はあえて除外

### 3. 参加率の維持

- カレンダーへの定期予定の登録
- 録画を共有し、後からでも視聴可能に

## 発展的な活用

このカジュアルなLT会は、より大きな技術共有の取り組みへの「入り口」としても機能します。

- チーム内の関心事を把握
- 詳細な勉強会のテーマ発掘
- 新しい技術への興味喚起

## 効果と手応え

### 1. 技術共有のハードル低下

- 発表への抵抗感が減少
- 質問や議論がしやすい雰囲気の醸成

### 2. チームの相互理解

- メンバーの関心事や取り組みの理解
- 新しい技術のキャッチアップが容易に

### 3. コミュニケーションの活性化

- 技術的な対話の増加
- チーム全体での知見の共有

## まとめ：小さく始めて、着実に育てる

勉強会を企画すると、つい多くの準備や作り込みをしたくなります。しかし、まずは「続けられる形」で始めることが重要です。私たちの例では、

- 30分という短い時間設定
- 2名の持ち回り制
- シンプルな運営方法

これらの小さな工夫が、継続的な技術共有の文化づくりにつながっています。まずは小さく始めて、チームの状況に合わせて少しずつ改善していく。このアプローチで、あなたのチームに合った技術共有の場を作ってみませんか？

## おまけ：現在検討中の改善案

- テーマ別シリーズの企画
- 録画アーカイブの活用方法の整理
- より活発な質疑応答の促進

---

※本記事は、実際の運営経験に基づいて執筆しました。各組織の状況に合わせて、適宜アレンジしていただければ幸いです。
Databricks extension for Visual Studio Code にて Databricks Workspace への同期先を Git フォルダにする方法

## 概要

Databricks extension for Visual Studio Code にて Databricks Workspace への同期先を Git フォルダにする暫定対応を共有します。2024月11月12日時点では、同期先を Git フォルダに設定する方法がなかったため、既存のフォルダを削除して同名の Git フォルダを設定することで対応できました。拡張機能に Git フォルダにする機能がつく可能性もあるため、本方法は暫定対応として捉えてください。

Git フォルダに変更する理由は、ルートディレクトリを Python のパスに登録するためです。

> ルート ディレクトリはパスに自動的に追加されるため、Git フォルダーのルート ディレクトリからインポートするときに、パスを手動で追加する必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c2c09024-ec1a-ab71-49de-67659d6bf614.png)

引用元：[Git フォルダーまたはワークスペース ファイルから Python モジュールをインポートする - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/delta-live-tables/import-workspace-files)


## 対応手順

### 1. Visual Studio Code にて左側タブにある Databricks -> `Open link externally`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b8319c89-d25b-fd99-07fd-74e18e895d6e.png)

### 2. 同期先の Databricks Workspace のフォルダに移動し、１つ上のディレクトリに移動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9fff26d7-508e-a7f4-cdb1-a8848ab96f7e.png)


### 3. 既存のフォルダ名を別の名前（例：`__files`）に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/39a2028b-4132-fdc0-7334-ddae7733f677.png)

### 4. 同名（例：`files`）の Git フォルダを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/66d3fe4b-1c5f-3e6e-b8fd-408478072d00.png)

Git リポジトリのURL には暫定対応として下記の URL を設定しています。Databricks Repos 上に Sync した際に利用されいる URL です。

```text
https://github.com/databricks/databricks-empty-ide-project
```

### 5. Visual Studio Code にて`.databricks/bundle/dev/sync-snapshots`配下のファイルを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/78de4c54-7cc5-f9ba-8e3a-ad63b6818957.png)

### 6. Visual Studio Code にて、 Workspace Folder の同期を実施

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/add70407-94d7-159b-ff99-03744e6b7f4c.png)

### 7. Databricks Workspace 上でコードが同期されていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/10d6f7cb-2074-414d-2c49-9f5d37e8692d.png)
どんなライブラリを選べるのか？

# はじめに

最近、会社でどのアドミンパネルを選択するかというテーマが出ました。

これまでメンテナンスが停止されたアドミンパネルライブラリを使用し、さまざまな厄介な問題に直面した経験があるため、将来を見据えた適切なライブラリ選定の重要性を感じています。

ライブラリを選定する際に考慮すべきポイントについて、いくつか役立つ基準を整理してみました。

#### 参考：laravel admin panelの種類

- https://nova.laravel.com/
- https://filamentphp.com/
- https://orchid.software/
- https://moonshine-laravel.com/
- https://lean-admin.dev/
- https://voyager.devdojo.com/
- https://backpackforlaravel.com/
- https://adminlte.io/
- https://craftable.pro/

# 本論

## アドミンパネルを使用する理由

アドミンパネルは、ビジネスを始めるタイミングで迅速に成果物を提示できるため、事業の初期拡大や新しい機能を披露する際に素早く作成できるという利点があります。

## アドミンパネルの問題点

アドミンパネルを利用した開発は、ソースコードの大部分がアドミンパネルの提供する機能に依存しているため、後に別のアドミンパネルに移行したり、アドミンパネルを使用しない開発方法に変更するのが難しい場合があります。

アドミンパネルを使用すれば迅速に開発を進めることができます。その速度感に慣れてしまって早い開発を期待しますが、カスタム機能を開発する際にかなりの時間を要することがあります。

また、使用しているライブラリのメンテナンスが終了すると、ドメインの問題解決に時間を割くべきところを、セキュリティ問題やバグ修正に時間を費やさなければならなくなる時が来ます。

アドミンパネルが提供しない新機能を開発しなければならない場合、通常の開発方法では対応できず、アドミンライブラリに依存した形での開発を強いられるため、新機能の開発が困難になることがあります。

ライブラリを活用したコードの構造を改善するよりも、ライブラリの動作を改ざんして望む機能を実現するケースも多くなり、開発者の基本的なスキルが向上するというよりは、小手先のテクニックに依存した開発方法が増える可能性が高まります。

## ライブラリ選定の基準

使いやすいか？ 自分が知っている技術に馴染みがあるか？ 多機能であるか？ という点も重要な基準ですが、できる限り長期にわたって安心して使用できるライブラリを選ぶこともとても重要です。

### 長期にわたるメンテナンスの重要性

どのようなソフトウェアでも、継続的にメンテナンスが行われなければ、セキュリティの問題やバグが解決されない問題が発生します。ライブラリの利用者は、これらの問題を解決できない、または解決が困難な場合があり、問題解決に多くの時間を費やす可能性があります。

長期間にわたってセキュリティパッチが提供され、機能の継続的な開発が行われるプロジェクトを使用することが望ましく、長年にわたりフィードバックを受けてバグが少なく、優れたユーザー体験を提供するライブラリを選ぶのが良いです。

### コミュニティで活発に話題にされ、議論されているかを確認

コミュニティで活発に議論され、広く使われているプロジェクトであり、人気があることが重要です。これは、問題が発生した場合に多くの人がさまざまな解決策を模索するため、問題解決が容易になる可能性が高いからです。

開発が停止した場合にコミュニティから批判を受けるほどの影響力を持つプロジェクトであるべきです。開発を続けなければならない十分な理由があるほど良いです。

### 有料プランを考慮する

有料プランがあり、多くの人がその有料プランを利用してメンテナーが十分な収益を得られるプロジェクトであるかを考慮することが重要です。ユーザーが増加し続け、継続的な発展と拡張の動機があるプロジェクトかどうかを見極めましょう。これにより、メンテナーが開発を継続する動機付けとなります。

有料プランは思ったほど高額ではありません。オープンソースを選んだ場合、開発者がカスタム機能を開発したり、不十分なドキュメントで使い方を習得したり、ライブラリのコードを解釈するのにかかる時間を、有料プランが提供する機能で大幅に短縮できるため、結果的に有益な場合が多いです。

### 主要メンテナーの姿勢を確認する

主要なメンテナーが責任感を持ち、プロジェクトに対する長期的なビジョンを持っているかを確認することが重要です。また、自分に何か問題が起こった場合に備えた計画を明らかにしているか、コミュニティで積極的に意思表示やコミュニケーションを行っているかどうかも考慮しましょう。RedditやX.comなどでの活動や発言をチェックしてみましょう。

### プロジェクトが依存する技術を確認する

古いライブラリやレガシー技術に基づいて構築されている場合、あるいは全く人気がない技術に依存している場合、または適切なデザインパターンや戦略を備えていない場合、メンテナーがメンテナンスを続けることが難しくなり、プロジェクトを放棄することがあります。可能な限り有望な技術や、よく知られ将来性のある技術の上に構築され、メンテナーが楽しくプロジェクトを開発できる構成になっているかを確認しましょう。

### 技術的な価値や魅力があるか？

十分に構成されたプロジェクトであり、その価値に惹かれて挑戦するだけの魅力があれば、既存のメンテナーが開発を中断したとしても、他の人々がこのプロジェクトを引き継ぎ、発展させる可能性があります。

### 開発が停止された場合にユーザー側でコアソースを改善できるか？

もし導入したアドミンライブラリの開発が停止された場合、使用者が容易にプロジェクトを改善できるかどうかを考える必要があります。

ライブラリのソースコードをプロジェクトに段階的に取り込むことができるか？ライブラリを使用して作成した既存のソースコードを廃棄せずに改善できるか？ライブラリを使わない方向への段階的な移行が可能か？などを検討すべきです。

### ライブラリが提供するドキュメントや機能が、より優れた開発者になるための指針となるか？

ライブラリの機能を学ぶことが、より優れた開発者になるために役立つ内容か？ドキュメントやコードを学ぶことで、開発者としての知識や視点が広がるかを考慮しましょう。

# 最後に

それぞれのライブラリについてこれらの点を調査することは、多くの時間を要する作業です。

上記で述べたすべての要件を満たすライブラリを見つけることはできません。長所と短所を考慮して、総合的な判断をした上で選択するようにしましょう。

現在はどの管理パネルを導入するかを判断する段階ではないため、この程度に整理しておきます。
LeetCodeを1日1題解いてみる (day13)

13日目に取り組んだ問題はこちら！

# 70. Climbing Stairs

https://leetcode.com/problems/climbing-stairs/description/

## 問題文
You are climbing a staircase. It takes n steps to reach the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

## 僕の回答

```py
class Solution:
    def climbStairs(self, n: int) -> int:
        result = [0] * (n+1)
        result[0] = 1
        result[1] = 1
        for i in range(2, n+1):
            result[i] = result[i-1] + result[i-2]
        return result[n]   
```

## 配列を使わない回答例

```py
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        a, b = 1, 2
        for i in range(3, n + 1):
            a, b = b, a + b
        return b
```

### コメント
このアルゴリズムは高校数学の確立漸化式で習ったので、思いつくことができてよかった！
ただ、僕の方法だと、`n=0`の時に正しく動作しないので、最適ではないと思った。

### 次の問題はこちら!
https://qiita.com/h_y_s_d/items/4996056eaa3a777c6d9c
アラートの状態を正確に把握するためにアラートのタイトルをカスタマイズしよう！

New Relicの**アラートのタイトルをカスタマイズ**して、分かりやすいタイトルにすることで、**問題をこれまで以上に正確に把握**できるようになります！

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年7月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202407 "New Relic アップデート(2024年7月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::

# 何ができるの？
今回の機能で出来ることは以下記事で紹介しておりますのでご確認ください！
本記事では**テンプレートの設定例を紹介**します。

https://qiita.com/ktst79/items/5bbf88fb5e49a6b70216

# テンプレートの仕様について
タイトルテンプレートを設定する際に考慮が必要な点は以下になります。

- 文字数制限： タイトルテンプレートの最大文字数は256文字
- フォーマット：タイトルテンプレートは[Handlebars](https://handlebarsjs.com/guide/)のフォーマットを使う必要があります
- 信号喪失インシデント: [信号喪失](https://docs.newrelic.com/jp/docs/alerts/create-alert/create-alert-condition/create-nrql-host-not-reporting-conditions/)によってトリガーされたインシデントの場合、デフォルトのタイトルが常に使用されます。

# 試してみよう
エラーログを検出するアラートコンディションを例に設定を試してみます。
例えば、以下のデフォルトタイトルでアラートのインシデントが通知されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/76d8744b-9286-be12-40ef-6788a226364e.png" width="60%">

テンプレートを設定してみます。
テンプレートでは、インシデントが発生した際にイベントとして記録される```NrAiIncident```の属性値をHandlebarsのフォーマットで定義します。

https://docs.newrelic.com/jp/docs/alerts/create-alert/condition-details/incident-event-attributes/

例えば、 アラートコンディションの名前 ```conditionName```、アラートコンディションの条件にマッチするエンティティの名前 ```entity.name```、インシデントのプライオリティ ```priority```をテンプレートで定義する場合は、以下の様に記述することになります。

```:テンプレート設定例①
[{{priority}}][{{conditionName}}] 影響受けたホスト - {{ entity.name }}
```
例えば、上記のテンプレートを設定すると以下のようにインシデントのタイトルが設定されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0d07b82e-daf2-7e0a-7811-da735c9fa18e.png" width="60%">

InfraStructureで観測しているホストやAPMで観測しているアプリケーションに付与されているタグの属性値を含めることもできます。例えば、ホストに付与されている、EnvとTeamのタグをテンプレートに含めてみます。
```:テンプレート設定例②
[{{priority}}][{{conditionName}}] 影響受けたホスト - {{ entity.name }} 環境 - {{tags.env}} 
 担当チーム - {{tags.team}}
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/56aedd5c-5238-9f06-47f9-2f7f88a76944.png" width="70%">

本番環境で影響が出ており、担当チームがどこかがタイトルを見るだけで、直ぐに把握できます。

```:テンプレート設定例③
[{{priority}}][{{conditionName}}] 影響受けたホスト - {{ entity.name }} 環境 - {{tags.env}}   担当チーム - {{tags.team}} 閾値 - {{thresholdDuration}} 秒間で{{threshold}} 件以上検出
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/d29b3ea0-b310-7447-519b-3e2d5418c583.png" width="70%">

設定している閾値を変数で取り出し、タイトルに含めることもできます。


# まとめ
本記事では、New Relicのアラートのタイトルをカスタマイズする際の設定例を紹介しました。タイトルからアラートの状態を正確かつ迅速に把握できるようになりますので、是非ご活用ください！

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年7月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202407 "New Relic アップデート(2024年7月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
Vue.jsでProvide Injectする際の値変更の時の備忘録

## 経緯
Vue.jsで子コンポーネント(injectしている側)側で値を変更しようとしたらコードレビューの際に指摘された。
どうやらベストプラクティスは親コンポーネント(Provide)側で値を変更する関数を書き、子コンポーネントでその関数を呼び出すことらしい。
参照:
https://ja.vuejs.org/guide/components/provide-inject
``` vue:Provide(親)コンポーネント内部 
<script setup>
import { provide, ref } from 'vue'

const location = ref('North Pole')

function updateLocation() {
  location.value = 'South Pole'
}

provide('location', {
  location,
  updateLocation
})
</script>
```


```vuejs:inject(子)コンポーネント内部 
<script setup>
import { inject } from 'vue'

const { location, updateLocation } = inject('location')
</script>

<template>
  <button @click="updateLocation">{{ location }}</button>
</template>
```

## 結論
ドキュメントをしっかり読もうと思いました。。
LogicApps(Vnet統合)とTableStorageの連携時のエラー対応

#### 初めに
お久しぶりです。ぼちぼちブログ投稿を再開していきたいと思います。今回は、LogicApps(Standard)からコネクタを使用してTableStorageへアクセスができないトラブルにハマっていました。私の知見不足が原因で、その点についてSRへ確認しましたのでその情報をここで共有できればと思います。

## 今回の構成は？
以下、プライベート通信を想定した構成となっています。
    
■ LogicAppsの構成
+ Standard構成
+ Vnet統合
+ 割当てロール（ストレージアカウント共同作成者、ストレージテーブルデータ共同作成者）

■ StorageAccountの構成
+ ファイアーウォールは有効
+ プライベートエンドポイントを作成
+ 「信頼されたサービスの一覧」からの通信を許可

## どんなエラーが発生したか
状況：ロジック アプリ (Standard)でAzureTableStorageのコネクタの使用時に、テーブルの選択でエラーが表示される。同じ手順で、ロジックアプリ(従量課金)使用時にはエラーは発生しない。
使用したコネクタ：Azure Table Storage(エンティティの取得 (V2))
エラー内容：以下
~~~ エラー内容
Error executing the API - https://management.azure.com/subscriptions/(サブスクリプションID)/resourceGroups/(リソースグループ名)/providers/Microsoft.Web/sites/(LogicApps名)/hostruntime/runtime/webhooks/workflow/api/management/dynamicInvoke 詳細な診断情報: x-ms-client-request-id は 'XXXXXX'です。
~~~

## 解消方法
組み込み (built-in) コネクタの [Azure Table Storage] コネクタを使用することで回避可能。
設定方法については以下参考にしてください
[MS公式ブログ | built-in (組み込み) タイプのコネクタを利用する](https://jpazinteg.github.io/blog/LogicApps/vnetIntergration/#built-in-%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF-%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B)

参考資料では「アプリ内」と記載されていますが私の環境では「In-app」と記載されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/23218fa1-f04a-500d-45e1-60c7ca8fa771.png)

## なぜエラーが発生したのか
コネクタには主に「built-inタイプのコネクタ」と「Azureコネクタ」の２種類があります。プライベートネットワークでの通信を使用してリソースへアクセスする際は、コネクタの選択に注意する必要があります。各コネクタの特徴を以下にまとめておきます。
+ built-inタイプのコネクタ：今回の前提のように、Vnet統合を使用して実行する場合はプライベートネットワーク経由でTableStorage等のリソースにアクセスをする場合に使用。種類がAzureコネクタと比較して少ないので注意
+ Azureコネクタ：パブリック経由での通信を行うLogicAppsの構成をとる場合はを使用可能。種類が豊富

それぞれのコネクタの実行環境の違いが、根本の要因です。
以下各コネクタを使用した通信時のイメージ図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/3be3cfb0-ec51-ab7d-bd9c-339fb00c12ca.png)


+ (<font color="blue">青線</font>)built-inコネクタはAzureLogicAppsホストランタイムと同じ環境で実行されます。そのため、プライベートネットワーク経由での通信が可能です。
+ (<font color="green">緑線</font>)Azureコネクタは共有環境で実行されます。そのため、マネージドコネクタの送信IPアドレスを介してパブリックネットワーク経由で通信が必要です。

## なぜ従量課金プランでは通信できたのか
従量課金プランのLogicAppsからパブリックネットワーク経由でアクセスしていたTableStorageへの通信は、StorageAccountの以下ネットワーク設定によってスルーされており通信ができていました。
>「信頼されたサービスの一覧」からの通信を許可

従量課金プランでは「Microsoft.Logic」というリソースタイプで通信をします。このリソースタイプは「信頼されたサービスの一覧」に含まれます。一方でStandardプランの場合は、「Microsoft.Web」というリソースタイプで通信をしますが、こちらは「信頼されたサービスの一覧」には含まれておらず、StorageAccountのファイアーウォールで拒否された形となっておりました。

#### まとめ
Vnet統合を使用しているLogicAppsについては、基本的にbuilt-Inコネクタを使用しましょうという学びとなりました。また、Standard構成は基盤としてWebappsが動いているということが今回のリソースタイプの一件で良く伝わったかと思います。

#### 参考文献
[MSLearn | Azure Logic Apps (Standard) での組み込み操作と Azure コネクタの違い](https://learn.microsoft.com/ja-jp/azure/connectors/compare-built-in-azure-connectors#considerations-for-virtual-network-integration)
AIを使った画像認識と天気情報取得

# 目的
弊社株式会社エニプラでは、チームで1年を通じて何かやってみたいテーマを決め
学習や研究を通じ、12月に成果物の発表をすることとなっております。
そして我々のチームは近年様々な分野で研究が続けられているAIを、1年を通じて学びながら
最終的に成果物を発表できるようなテーマが何かないかを検討し、
次の2つをテーマにチーム内で分担して進めることに決定しました。

・画像認識
・天気情報取得

また、プログラミング言語はPythonを使用して進めることにしました。

## 画像認識
### 成果物
人物の画像を写真を取り込むと、顔の部分のみを切り出して写真の人物の情報を
学習します。そして、複数人物が映った画像を取り込むと
先程学習した人物をのみを認識させることに成功しました。
![画像認識.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866587/34e8c9a2-cbd9-3fb6-6eb8-36bfd7e1c084.jpeg)
※イメージ図

### 所感
時間の制約上もあり、今回の成果物ということになりましたが、
時間があればもっと良いものができたかもしれないという手ごたえがあるので来年以降、
またチャレンジする機会があれば試してみたいという気持ちになりました。

## 天気情報取得
### 成果物
地域を入力することにより、その地域の現在の天気情報を取得し
音声で出力させることに成功しました。
![天気.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866587/61658892-799a-1e55-afb2-81fd0b53ab9b.png)
※イメージ図

### 所感
今回は天気情報の取得を行いました。
pythonで天気情報を取得することは初めてだったので
どの情報を取得するか・また欲しい情報を取得するにはどういったコードを
書けばいいのか調べながら作成していくことが、大変でしたが面白かったです。
今回は都市の天気と気温の取得でしたが、いずれは取得した天気情報を使用して
天気予報ができるものを作成できたらと思います。

# おわりに
今回AIを扱ってみて、予想以上に調べものやコーディングに時間を取られてたため、
今回できた成果物に対してこの成果物を使ってこういうことをしてみたい！などの
意見もあり、時間があればもっと面白いことが出来るのではないかと感じました。
また、この1年を経て培ったAIやPythonのナレッジやスキルを
実際の業務に活用してみたいです。

# 参考にさせていただいた記事
・ OpenCVの新しい顔認識を試してみる
 (https://qiita.com/UnaNancyOwen/items/8c65a976b0da2a558f06)

・天候・気温予測サービス "OpenWeather" のAPIを活用する
 (https://qiita.com/K_Nemoto/items/51e124b3628106c6ef0a)

・Pythonでお手軽音声合成が可能なgTTSモジュール
 (https://qiita.com/milky04/items/e8878c29edaef8980bd7)
【ChatGPT】“Logic-of-Thought”をほかの方が使っていましたのでご紹介。


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

　今回は、“Logic-of-Thought”をほかの方が使っていましたのでご紹介します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　ニュースはないので、
　　さっそく本題です。

　今回は、
　　以前に紹介しました
　　　“Logic-of-Thought”を
　　　　ほかの方が使っていましたので
　　　　　ご紹介します。

　以前、紹介。
　　[【ChatGPT】“Logic-of-Thought”とは？](https://qiita.com/kabumira/items/f2a416c7c90b202687fe)

　今回の方のポスト。
　　[あるるさんポスト](https://x.com/chatgptair/status/1855913369670398359?t=JtuvisPtQ12-hZwa1ATYpw&s=19)

　この方は、
　　ChatGPTを中心に
　　　AIツールを使っておられる方です。

　以前、紹介したPromptは
　　日本語でした。

　今回のポストで提示されたPromptは
　　英語です。

　内容は、ほぼ同じ。

　こちらが、そのPrompt。
```Text:英語版LoTのPrompt
Process this file using Logic-of-Thought to extract logical structures and systematically convert it into JSON.
```
　DeepL翻訳
>このファイルをLogic-of-Thoughtで処理して論理構造を抽出し、体系的にJSONに変換する。

　ポスト内では
　　これまでに作成していた
　　　Promptに下部に
　　　　このPromptを追加するようにと
　　　　　書かれていました。

　ところが
　　日本語をごらんのように
　　　ファイルを処理する形に
　　　　なっています。

　ファイルがない場合は
　　どうすればいいのでしょうか？

　こちらのPromptを
　　ご利用ください。
```Text:英語版LoTのPrompt（改）
This problem is processed by Logic-of-Thought to extract the logical structure and systematically convert it to JSON.
```
　DeepL翻訳
>この問題はLogic-of-Thoughtによって処理され、論理構造を抽出し、体系的にJSONに変換される。

　まぁ、
　　“ファイル”を“問題”に
　　　しただけなんですがね😅

　注意なのですが、
　　これはあくまで
　　　JSONを作成するだけです。

　作成されたJSONを
　　利用する場合は、
　　　さらにPromptを必要とします。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【超基礎】JavaScriptにおける配列の操作とコールバック関数

## 前提
この記事はPython,C,C++がちょっとだけ書ける、読める筆者がProgateでのJS学習を通して、はえ～と思ったことをまとめたものになります。従って、**なんだそれ当たり前だろ**みたいなことしか書かれていませんので悪しからず。

ちなみに生成AI頼りの個人開発をした際，JavaScriptを使いましたのである程度はわかっているつもりですが、自分で書かないと気づけない厳密な部分は何もわかっていないです。

記憶定着用のアウトプットに近いものになりますので、誤っている部分があれば訂正していただけると幸いです。。

https://prog-8.com/courses/es6

 ### 筆者の技術力
 - C,Python (基礎文法~ポインタ、アルゴリズムの授業、研究での使用など)
 - HTML,CSS,JS (大半を生成AIに支援してもらったため読めるが書けない)
 - C++ : (AtcoderのD問題をたまにギリギリ完答できる程度)

## 配列の操作
### push
配列の末尾に値を追加する。
```JavaScript:push
const numbers = [1,2,3];

numbers.push(4); //=>[1,2,3,4]
numbers.push("five"); //=>[1,2,3,4,"five"]
```
### findとfilter
- `find`を使うと条件と合致する**最初の要素**が、`filter`を使うと**すべての要素**が新しい配列として返ってくる。
- 条件と合致する要素が見つからなかった場合、`find`では`undefined`が、`filter`では空の配列として`[]`が返される
```JavaScript: findとfilter
const numbers=[1,2,3,4,5];

//find
const foundNumber = numbers.find((number) => {
    return number >= 3; //=> 3
    });

//filter
const foundNumbers = numbers.filter((number) => {
    return number >= 3; //=> [3,4,5]
    });
```
### forEach
- 配列の各中身について、処理を行う。
- 配列の各要素に対して順次処理を行うが、**新しい配列は作成しない**。
- forEach関数の引数として関数が入り、これを**コールバック関数**と呼ぶ
```JavaScript:forEach
numbers.forEach((number) => {console.log(number);});
```
### map
- 配列のすべての中身に対して処理を行い、新しい配列を作る
- returnが必須

 https://qiita.com/yuu_7_ns/items/d80c67efad395238e11d
```JavaScript:map
const numbers=[1,2,3,4,5];

const numbersPlusOne = numbers.map((number) => {
    return number+1; //=> [2,3,4,5,6]
    });
```
### コールバック関数
- 関数の引数として関数を渡す。
- 渡すときは関数を参照として渡し、"()"は不要である
```JavaScript:コールバック関数
const print = () =>{
    console.log("Hello World!");
}

const call = (callback) => {
    console.log("コールバック関数を実行します");
    callback(); //print関数をcallback関数として実行。
}

call(print); //print関数をcall関数に渡す。()は不要
```
:::note info
関数を直接引数に埋め込むこともできる
```JavaScript
call(() => {
    console.log("Hello World!");
    });
```
:::

### 引数のやり取り
コールバック関数がパラメータを持つ場合は、下のようにコールバック関数を渡した先の関数内で引数を指定する。
``` JavaScript
const call = (callback) => {
    callback("太郎"); //引数を渡す。
}

call((name) => { //パラメータを持つコールバック関数
    console.log(`私の名前は${name}です。`); //=> 私の名前は太郎です。
    });
```

## まとめ
コールバック関数の動作等に癖があり、とっつきずらいイメージがありましたが、少しは自分の中に落とし込めたのではないかと思います。

当方初学者なため、認知のずれや、モダンな開発現場ではもう使わない表現などがありましたらコメントで指摘していただけると幸いです。😸