OmniAICreator/Qiita-1.07M huggingface dataset:
【入門】今さら聞けない生成AIと活用事例

## はじめに

株式会社イノベイティアのCEO、中畑です。

今回は生成AIについて、基礎の基礎から解説をします。

Twitter(X)もよかったらフォローしてください。

https://twitter.com/kiyo_innovatia

## おことわり

細かいAIの技術的な仕組みは、本記事では割愛します。

## 生成AIとは

生成AI (Generative AI)とは、様々なコンテンツを生成できるAI

### 生成AIの事例

- 画像生成
    - 生成AIテクノロジーを利用し、リアルな顔や風景画像などを生成する (Midjourney)
- テキスト生成
    - GPT-3やGPT4などのモデルが、与えられたプロンプトに対して、人間のように自然な文章を生成する
- 音楽生成
    - 生成AIが特定のスタイルやジャンルに基づいてオリジナルの音楽を生成する

### 従来のAIと生成AIの比較

|  | 従来のAI | 生成AI |
| --- | --- | --- |
| 学習の視点 | 情報の整理・分類・検索 | パターンや関係の学習 |
| 出力の目的 | 特定や予測 | 創造 |
| ビジネスインパクト | 決められた行為の自動化 | 新しいコンテンツの生成 |
| 学習データ | 具体的なデータセット | 構造化されていないデータセット |

### なぜ生成AIが注目されるようになったのか

キーワードとして「精度」「学習量」「スピード」「利便性」の4つが挙げられます。

#### 精度

質問に対する回答の精度や出力される文章表現の自然さ、入力条件にあった画像など出力されるものが様々なビジネスシーンで使えるレベルになりました。

#### 学習量

学習するためのデータ量が飛躍的に拡大して、モデルの精度が上がりました。

#### スピード

コンテンツ生成のスピードが早く、条件を入力するだけで簡単に文章や画像を生成してくれるようになりました。

#### 利便性

ChatGPTなどは、誰でも簡単に使うことができる。マニュアルなどが不要で操作性もかなり良いです。


## 生成AIのビジネスにおける活用事例

### エンジニア

- コード補完を提供し、エンジニアの開発効率が上がる (GitHub Copilot)
- 正しいコードかの判定は人間がやる必要がある
    - コードを0→1で書いてもらうよりもテストコードやレビューやリファクタリングでの利用が良い印象

### マーケティング

- 広告の文章やキャッチフレーズ、ブログ記事などマーケティングコンテンツの自動生成
- 顧客データをもとにAI分析を通じて最も効果的なマーケティング戦略を立案
    - GoogleアナリティクスからWebサイト内のユーザーの行動を分析し提案
- SNSやオンラインデータから新しいマーケティングキャンペーンの戦略を構築
    - 既存のSNSのバズった投稿などを読み込ませて新規にツイートを生成してもらう

### カスタマーサービス

AIを使用したチャットボットを作成することで24時間365日稼働させ、サポート担当の稼働工数を減らす

### セールス

- 様々なデータリソースから潜在的な顧客のリードを自動的に生成する
- 過去データをもとに将来の売上予測を作成

### 財務

- データを分析し、不正を未然に防ぐ
- キャッシュフローや利益の予測をする

## LLMとは

- 大規模言語モデル(Large Language Models、LLM)は非常に巨大なデータセットとディープラーニング技術を用いて構築された言語モデル
- 大規模とは「**計算量**」「**データ量**」「**パラメータ数**」を大幅に増やして構築したことからくる

### 大規模言語モデルの特徴 (Scaling Laws for Neural Language Modelsより)

パラメータ数が増えると、精度が高い言語モデルを生成することができます。

![スクリーンショット 2023-12-21 8.37.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633821/14c9087b-4773-8938-dcbe-e93b3c940e22.jpeg)

### 言語モデルとは

- 文章や単語の出現確率を用いてモデル化したもの
- 人間の自然な会話に対して高い確率を割り当て、文章として成立しない並び方には低い確率を割り当てる

### 大規模言語モデルの応用

- **文学と創作**
    - 文章生成が得意なので、作家は創造的なプロセスにより時間を割けるようになる。
- **医療業界**
    - 診断報告や医療文書の作成を自動化し、医師の書類作成作業の工数を削減し、より患者へのヘルスケアに時間を割ける
- **教育分野**
    - 個別の学生に合わせたカスタマイズされた学習資料を生成し、教育の個人化がより推進される
- **ビジネス分析**
    - 競合分析や戦略策定など数値的に複雑なタスクを支援する。具体的には大量のデータから考察をし、意思決定を補完する提案をする

### 大規模言語モデルの懸念点

- **データセキュリティとプライバシー**
    - 個人情報を含むデータでの学習が悪用されるとプライバシー侵害の可能性がある
    - 顧客データなどをそのまま載せてしまう
- **品質と信頼性**
    - LLMの生成する文章は品質が一貫していない場合があり、特定の専門家レベルの正確さを達成するのは困難
- **不可解な挙動**
    - LLMの動作がブラックボックスなので、どのように結果を出したのかを解析するのが難しい

### 最後に

Twitterでも最新のAI情報を発信しているので、ぜひフォローしてみてください。

https://twitter.com/kiyo_innovatia
画像から深度を推定できるZoeDepth【いろんなシーンに対応可能】

屋内屋外、様々なシーンの画像からメートル単位で深度を推定できます。

![zoe_depth (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2e893e36-f5bb-617b-e5d5-aaea9a04e591.png)![pexels-emre-can-acer-2079443.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2b85cdf7-d6be-838c-9676-b875b029a753.jpeg)

![zoe_depth (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d7e4afa4-05db-b281-b0a8-42fbfbb890ce.png)![pexels-ahmad-qime-2859016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2bcba5a6-da14-47cf-8473-0754ff50e23f.jpeg)


# 使用法

### Insall

timmとtorchのバージョンによっては実行時エラーになるので、以下を使います。

```shell
pip install timm==0.6.7
pip install torch==2.0.1

git clone https://github.com/isl-org/ZoeDepth.git
cd ZoeDepth
```

### 動作チェック

```shell
python sanity.py
```

### モデルロード

```python
import torch
from zoedepth.utils.misc import get_image_from_url, colorize

zoe = torch.hub.load(".", "ZoeD_N", source="local", pretrained=True)
zoe = zoe.to('cuda')
```

### 実行

```python
import cv2
from PIL import Image

img = Image.open("image.jpg")
depth = zoe.infer_pil(img)
colored_depth = colorize(depth)
cv2.imwrite('zoe_depth.png',colored_depth)
```

![zoe_depth (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a2a6267d-f377-d9d8-c652-fcacffb779c3.png)
![pexels-gül-işık-2668723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6c5c464b-ee36-461a-04f2-8953f4183572.jpeg)

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Salesforceでのテスト

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


# Snyk

+ [Snyk（スニーク）って、Salesforceでも使えるの？（前編）](https://qiita.com/Keiji_otsubo/items/def64ad9e061897c6cc2)
+ [Snyk（スニーク）って、Salesforceでも使えるの？（中編）](https://qiita.com/Keiji_otsubo/items/0383ff68b44f451c75da)
+ [Snyk（スニーク）って、Salesforceでも使えるの？（後編）](https://qiita.com/Keiji_otsubo/items/5e2ade6a1c3e91634866)
+ [更にSalesforceのApex クラスをスキャンしてみる](https://qiita.com/Keiji_otsubo/items/9df818c901a4f9b43e8e)

# T-DASH

+ [T-DASHを使おうと考えましたが、残念ながら...](https://qiita.com/Keiji_otsubo/items/ef8d5e6aff81a3a0287c)
+ [Salesforceで 画面のテスト自動化ができるのなら、試してみたい](https://qiita.com/Keiji_otsubo/items/5ba37884ba5ed832e0ee)
NanoPi R5S その後の状況

# NanoPi R5S のデバイスは認識するようになった

昨年の FreeBSD Advent Calendar で、 NanoPi R5S では FreeBSD は起動するだけでネットワークすら使えないという[記事](https://qiita.com/mina_im/items/4626ed7307a9e875ac3f)を書きました。
先月 FreeBSD 14.0 がリリースされましたのでどれくらいサポートされているか確認してみたところ、インストーラから確認した限りでは 2.5G の NIC も NVMe も見えるようになっていました。つまり、 PCIe が使えるようになっていそうです。

とはいえ、 UEFI は別途用意しなければなりませんし、その UEFI から SD card や NVMe は見えないので USB メモリからの起動が必要なのは変わっていません。欲を言えば eMMC が、せめて NVMe が UEFI から見えて起動できるとよいのですが。

ある程度デバイスが見えていたので、これは期待ができると思ったのですが...

# まずはインストールしてみる
インストーラが起動してデバイスが見えることが分かったのでまずはインストールをしてみます。
## UEFI を用意する
[こちら](https://personalbsd.org/download/UEFI-RK356x) から頂いてきました。
NanoPi R5S の UEFI はブランチが別になっていますが、 [リポジトリ](https://github.com/S199pWa1k9r/edk2-rk356x/tree/nanopi-r5s) を見る限りでは fork 元に[マージ](https://github.com/jaredmcneill/quartz64_uefi/issues/40)されそうな雰囲気です。
イメージをダウンロードしたら適当な SD Card に dd します。
## インストールする
インストールイメージは 	FreeBSD-14.0-RELEASE-arm64-aarch64-memstick.img を使いました。
これでインストーラが起動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/213989c6-2b0e-b5c1-cc1c-e50d1eda479b.png)
# eMMc も NVMe の挙動が変
インストール先として eMMC も NVMe も見えますが、インストールしようとすると挙動がおかしいです。
仕方がないので、別なインストール先の USB メモリを用意してそれにインストールしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/35812689-5c6f-7d43-603a-4e16a1062698.png)
_eMMC の mmcsd1p1 を消そうとすると許可がないらしい_

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/2ffb7e15-6868-6a22-41b5-3cfa3ebbe584.png)
_NVMe はパーティンションの作成ができるが commit すると失敗する_

# 起動してみる
起動すると、途中でシリアルの速度が 1.5Mbps になってしまうようで文字化けしますが、ログインプロンプトはまた 115200bps に戻るので操作は可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/c7d796a7-8562-5074-53c9-6df892f4ce26.png)
# PCIe の認識状況
NIC と NVMe はしっかり見えています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/82aae2f6-cbe3-8e26-f699-6cad89220fff.png)
# ネットワークまわりを見る
realtek-re-kmod をインストールして利用できるように loader.conf に設定すれば利用可能です。
DHCP で IP アドレスが割当たっており、もちろん通信も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/af2fb6b1-8c81-d751-71dc-9ceb315fbf48.png)
# NVMe は?
インストーラでは gpart が失敗していそうですが、手動で操作するとパーティションが作れます。
zfs も作れるのですが、容量管理がおかしくていくらでも書けてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/c4bb3174-8e44-2e38-4bc5-22e5e4158f6f.png)
_パーティションも作れるし zfs も作れる_

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/cf9989b3-2d0d-7112-659a-f095d634eb6a.png)
_NVMe の実容量を越えてもエラーにならず書けてしまう_

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913528/f51f1cbd-554e-08d3-4218-403d29aa0b87.png)
_UFS は newfs 直後なのにいきなり inode を使いきっている_

# まとめ
ネットワークまわりは動いてそうです。 ssh したり pkg install したりする分には問題は感じられませんでした。
ですが、Disk まわりは挙動がおかしいです。 eMMC はインストール時同様 gpart で操作ができませんでした。
ネットワークが使えるようになったので、 [pfsense](https://www.pfsense.org/) や [OPNsense](https://opnsense.org/) とかを入れてネットワーク機器として使うのがよいのかもしれません。
自社プロダクトをマーケティングフレームワークに当てはめてみる

この記事は デジタルキューブ ＆ ヘプタゴン Advent Calendar 2023 の12月21日分の記事として執筆しています。
https://qiita.com/advent-calendar/2023/digitalcube-heptagon
***
最近、保護猫の里親面談を終えて迎え入れの準備を進めている阿部です。
デジタルキューブには新卒入社した会社を5ヶ月で退職後、2023年9月1日付で入社しました。とても刺激的な毎日を送っています。

私は営業企画部に在籍しているので、本記事では自社プロダクトである Shifter の4C分析を行い、自身のサービス理解を深めるとともに少しでも見てくれた方に Shifter の良さを伝えられたらなと思っています。

そもそも4C分析とはということですが、顧客視点で自社の製品やサービスの価値を最大化するためのマーケティングフレームワークです。以下の4つの視点から製品やサービスを分析します。

![スクリーンショット 2023-12-21 7.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629941/ed540fbd-8114-66ec-2d38-cf1e0ecc4e30.png)

図. 4C分析とは？ 4P分析・3C分析・SWOT分析との違い/株式会社ベーシック
https://ferret-one.com/blog/4c#61be12895d04c54f93b33ec8-1623711116107


早速、下記のように整理してみました。Shifter には Static と Headless がありますが、今回は Static のほうです。
サービスサイト https://ja.getshifter.io/static 

![スクリーンショット 2023-12-19 23.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629941/3b1849de-63f3-942a-0c13-9945bb93cb91.png)

Shifter は SaaS のためお客様ごとの個別カスタマイズなどは難しいですが、メンテナンスフリーでありながら WordPress の脆弱性をカバーできるので、ユーザーがよりコンテンツの制作に集中できるようなサービスになっています。

最近ではお客様からの要望も多い、サポートメニューの拡充計画も練っており、お客様がよりプロダクト開発や営業活動にリソースを集中できるようなサポート体制を作っていきたいと考えています。

弊社には、Shifter の他にも Amimoto や FinanScope といったプロダクトもあるのですが、またこのような記事を書く機会をいただいた時のために、ネタとして残しておきます。

最後までお読みいただきありがとうございました。
2023年を良い形で締めくくれるように、最後まで走り切りましょう。
.vscode/tasks.json で ~/.bashrc が読み込まれない

## 状況

* 理由はよくわからない。
* ChatGPT に導かれるままに `~/.bash_profile` に書いたら動いた。
* なぜかわからない。
* `source /home/user/.bashrc` をいれても改善しない。
* `~/.bashrc` と `~/.bash_profile` の違いを調べても原因が理解できない

今回の事象と関連すると思われる何かかが議論されているけどわかりませんでした...

* [Environment variables defined in tasks.json::tasks.options.env do not overwrite existing environment variables #47985](https://github.com/microsoft/vscode/issues/47985)




## 環境変数を使う方法


### <font color="#5f9ea0">1. ~/.bash_profile に書き込む </font>
```~/.bash_profile
YOUR_WEBSITE_URL=http://localhost:8000
```
```js:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      // 立ち上がりが激重のため...
      "label": "chrome",
      "type": "shell",
      // connection refused を防ぐために sleep, curl する
      "command": "echo ${YOUR_WEBSITE_URL} && sleep 7 && curl ${YOUR_WEBSITE_URL}/page-title && google-chrome ${YOUR_WEBSITE_URL}/page-title && exit",
      "presentation": {
        "close": true
      }
    }
  ]
}
```



### <font color="#5f9ea0">2. options.env に書き込む</font>

`YOUR_WEBSITE_URL` が長かったので短くしました...

```js:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      // 立ち上がりが激重のため...
      "label": "chrome",
      "type": "shell",
      // connection refused を防ぐために sleep, curl する
      "command": "echo ${URL} && sleep 7 && curl ${URL}/page-title && google-chrome ${URL}/page-title && exit",
      "presentation": {
        "close": true
      },
      "options": {
        "env": {
          // NG: env が必要
          // "URL": "${YOUR_WEBSITE_URL}"
          // OK:
          "URL": "${env:YOUR_WEBSITE_URL}"
        }
      }
    }
  ]
}
```

## 参考

tasks.json で使う変数に関することが書かれています。

* [VS Codeの設定をキレイに変数置換【VS Code使い方①】 - Qiita](https://qiita.com/ShortArrow/items/dc0c8cacd696154510f1)
* [Troubleshoot Terminal launch failures - VS Code](https://code.visualstudio.com/docs/supporting/troubleshoot-terminal-launch)
(Postgre)SQLの概念と用語

<font color="Grey">*[(Postgre)[SQL concepts and terms](https://aiven.io/blog/postgresql-concepts-and-terms)の翻訳です。*</font>

2022年4月1日

# (Postgre)SQLの概念と用語

PostgreSQL®とSQL全般に関する用語集です。

## 制約


制約は、データベーステーブルのデータが正確で信頼できることを保証するために、そのテーブルのデータが従わなければならない規則を指定します。一般的な制約は `NOT NULL`、`UNIQUE`、`PRIMARY KEY`、`FOREIGN KEY`、`CHECK`、`DEFAULT` および `CREATE INDEX` です。


## データ型


例えば、整数、文字、日付、バイナリなどです。各カラムは名前とデータ型を持たなければなりません。


## 外部キー


外部キーは、2つのデータベーステーブルをリンクします。外部キー制約は、子テーブルのカラムを親テーブルの主キーカラムに関連付け、2つのテーブル間の関係を識別します。


## ジョイン


JOIN` 節は1つ以上のテーブルのカラムを結合して新しいテーブルを作成します。ANSI標準SQLでは、ジョインには `INNER`、`LEFT OUTER`、`RIGHT OUTER`、`FULL OUTER`、`CROSS` の5種類があります。


## 正規化


データの冗長性を減らし、整合性を向上させるために、データベースは一連の「正規形」に従って構造化することができます。正規化とは、カラムとテーブルの依存関係がデータベースの整合性制約によって強制されるように構成することを意味します。


## パーティショニング


パーティショニングは、大きなテーブルをより管理しやすくします。こうすることで、テーブルの整合性を保ちつつ、データのサブセットのみにアクセスしたり管理したりすることができます。


## プライマリキー


データベースのカラムに設定される制約で、そのフィールドが各レコード(行)を一意に識別することを保証する。その機能は、データの整合性を強制することである。主キーをクエリで使用すると、データへのアクセスが高速になります。


## リレーションシップ


[外部キー](#foreign-key)も参照。


## スキーマ


スキーマは、データベース内のデータの構成と、テーブル、プロシージャ、ビュー、ファンクション、インデックスのようなオブジェクトや要素間の関係を記述します。スキーマはそれが記述するデータベースオブジェクトの所有者であり、ユーザーはスキーマ自体の所有者になることができます。データベースは複数のスキーマを持つことができます。


## ストアドプロシージャ


ストアドプロシージャは、一般的に使用されるデータ検証、アクセス制御、その他のメソッドへのアクセスをアプリケーションに提供します。ストアドプロシージャはデータベースのデータ辞書に保持され、SQLプロシージャをいくつか組み合わせたものです。


## テーブル


データベース内のデータはすべてテーブルに格納されます。テーブルとは、データを行と列で整理するデータベースオブジェクトのことで、どちらかというとスプレッドシートのようなものです。個々のレコードは行で表され、そのレコードに含まれるフィールドは列(カラム)に分類されます。


各列は、[データ型](#data-type)、一意性など、そのフィールドに格納されるデータの種類を定義するプロパティを持つことができます。


(ただし、カラム型データベースではこの構成が反転します。


## トランザクション


トランザクションはデータベースに適用される作業の単位で、一連の操作を含む。


## トリガー


インベントリテーブルに新しいアイテムが入力されると、同様のアイテムが `prices`、`reviews`、`orders` の各テーブルに自動的に入力されます。


## ビュー


ビューとは、SQL文の結果に基づいた仮想的なテーブルのことです。この仮想テーブルは、単一のデータベーステーブルとまったく同じように操作したり問い合わせたりすることができます。


--


PostgreSQLについてもっと知りたい方は、Aivenブログの[PostgreSQLとは](https://www.aiven.io/blog/an-introduction-to-postgresql)をご覧ください。また、Aivenの<https://console.aiven.io/signup>からPostgreSQLのトライアルに申し込むこともできます！


## さらに読む


* リモートリードレプリカ - 何を、なぜ、[どのように](https://aiven.io/blog/postgresql-remote-read-replica)
* [PostgreSQL®の読み取り専用レプリケーションのために](https://aiven.io/blog/aiven-postgresql-read-only-replicas)
* [PostgreSQL® の接続プーリング](https://aiven.io/blog/aiven-postgresql-connection-pooling)
STM8のSPIで遊ぶ


目的
SPIのテスト

![o_cop874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/05d8e64a-db33-aacb-af18-8fad4e34fdb6.jpeg)




```c++


//SPI_TEST1_STM8_1


//インクルド
#include <SPI.h>


//定義
#define DW    digitalWrite
//#define s60() for(ii=0;ii<60;ii++)delay(1000);
#define s60() delay(1000);


//初期化
void setup() {

  int ii; //ループカウンター

  //debug
  delay(1000);pinMode(PD0, OUTPUT);DW(PD0,0);delay(1000);

  //SPIの開始
  SPI_begin();

  // SPIの初期化
  SPI_beginTransaction( SPISettings( 8000000, MSBFIRST, SPI_MODE0) );

} //setup


//メインループ
void loop() {

    SPI_transfer(0x00);
    SPI_transfer(0x00);
    s60();

    //1
    SPI_transfer(0x00);
    SPI_transfer(0x55);
    s60();

    //2
    SPI_transfer(0x00);
    SPI_transfer(0xaa);
    s60();

    //3
    SPI_transfer(0x00);
    SPI_transfer(0xff);
    s60();

} //loop


```
単純な大量のテストデータをMySQL Workbenchから登録する方法

IDが違うだけのデータでいいから大量のテストデータが欲しい時などに、以下の手順を踏めばサクッと大量データを登録できます。
# LOAD DATAのファイルのインポート設定
MySQL Workbenchで以下のコマンドを実行し設定がONになっているか確認する。
```
SHOW VARIABLES LIKE 'local_infile';
```
local_infileの設定がONになっていない場合、以下のコマンドを実行しファイルのインポートを有効化する。
```
SET GLOBAL local_infile = 1;
```
次にMySQL WorkbenchのMySQL ConnectionsからManage Server Connections の画面を表示して、 「Connection」タブの「Advanced」タブを選択します。
そうすると「Others」という入力項目があるので、そこに「**OPT_LOCAL_INFILE=1**」を追加します。

以上で設定は完了です。

# awkコマンドで大量のテストデータをCSV形式で作成
```test.awk
BEGIN {
    # ヘッダー行を出力
    print "user_id,user_name,age"

    value=",\"test_user\",20"
	# 1万件のテストデータを出力
    for (i = 1; i <= 10000; i++) {
    	print i value;
    }
}
```
出力するデータは実際に使用するデータベースのテーブルの定義に従って作成してください。
今回の例ではuser_id, user_name, ageカラムのあるユーザーテーブルのテストデータを作成しています。

上記のスクリプトを作成後以下のコマンドを実行してCSVファイルに出力。
```
awk -f test.awk > test.csv
```
そうすると以下のような内容のテストデータが大量に作成できます。
```
user_id,user_name,age
1,"test_user",20
2,"test_user",20
3,"test_user",20
~以下略~
```
# MySQL Workbenchからインポート
MySQL Workbenchで以下のコマンドを実行することで作成したCSVファイルのテストデータを一括でデータベースに登録できます。
```
LOAD DATA LOCAL INFILE '/Users/user1/Documents/test.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
```
作成したCSVファイルでダブルクォーテーションが使用されている場合は、**ENCLOSED BY** オプションを使用すると、指定した文字に囲まれたフィールドの値が正しく読み込まれ、フィールド値に含まれる区切り文字（例えば、カンマ）がフィールドの区切りとして誤って解釈されることを防ぐことができます。

**LOAD DATA LOCAL INFILE**や**LINES TERMINATED BY**はWindowsかMacで書き方や設定する内容が異なってくるので、それぞれの環境に合わせて設定してみてください。

以上で終わりです！
特定の語彙からtf-idfベクトルを作成する

# はじめに
ストップワード抽出をした後、その語彙のみを用いてtf-idfのベクトル化を文書に対して行う際のコードを備忘録として残します。
形態素解析にはfugashi, tf-idfの作成ではsk-learnを利用しています。

# 実装
## 形態素解析
```py
from fugashi import Tagger

def text_tokenizer_helper(tagger,text:str) -> list:
    ret = []
    for word in tagger(text):
        w = word.feature.lemma
        if w is None:
            w = str(word)
        
        ret.append(w)
    return ret

```
こちらのコードで形態素解析を行い、その基本形を返すようにします。この関数を使って文書の形態素解析を行いました。
例えば、文書集合があるときには以下のように扱うことができます.

```py
texts = # 文が要素となっているリスト
tokenized_text = []
for s in texts:
    tokenized_sentence = text_tokenizer_helper(s)
    tokenized_text.append(tokenized_sentence)
```
## tf-idfのベクトルの取得
ストップワードを取りいた後、tf-idfのベクトルを取得するために以下の関数を用います。
引数として対象とする文書(スペースで区切ったもの) と 使用する語彙のリストを渡します.

```py:
from sklearn.feature_extraction.text import TfidfVectorizer

def tf_idf_helper(corpus : list, vocabulary:list):
    vocabulary = {word: index for index, word in enumerate(global_word_list)}

    # TfidfVectorizer の初期化（独自の語彙を使用）
    vectorizer = TfidfVectorizer(vocabulary=vocabulary)

    X = vectorizer.fit_transform(corpus)
    return X.toarray()
```
このコードからTfidfVectorizer()にはvocabularyという引数に単語 : IDの辞書を渡すことで使用する語彙を決めることができるとわかりました。
【備忘録】pythonで辞書型のvalueでソートする.

以下のような辞書があったとします。
```py:
height = {"太郎" : 179, "次郎" : 159, "三郎" : 190, "四郎" : 163}
```
この辞書のキーを用いて並べ替えを行う。

```py
dict(soorted(height.items(), key = lambda x : x[1]))
```
また降順にするにはsorted関数の引数にreverseを持たせます。

```py
dict(soorted(height.items(), key = lambda x : x[1], reverse = True))
```
【seleniumクラスシリーズ】Byクラス



## はじめに
【seleniumクラスシリーズ】Byクラスに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
Seleniumの中で核となる機能の一つ。
再利用性と保守性が高く、様々なタイプのWeb要素を特定する際に有効なツール。


:::note info
押さえておくべき点
* Byクラスは、要素を特定するためのメソッド。
* Byクラスは複雑なセレクタや動的な要素（JavaScript）なども特定することができる。
* Byクラスは再利用性と保守性も高い。
* **<INS>要素の特定を行う場合は基本Byクラスを用いて要素の選択をするべき。**
* find_elementメソッドとチェーンして使うことが一般的。
* セレクタの種類が直感的で、理解しやすい。
* Byクラスは、Selenium WebDriverの核となる機能の一つ。
* Byクラスを利用する際にはインポートが必要。「from selenium.webdriver.common.by import By」
:::  
***


:::note warn
利用シーン
* ユーザー名やパスワード入力欄を特定する際に使用できる。
* ログインや送信ボタンなどを特定し、クリック操作を行える。
* ページ内の特定のリンクを選択するために使用できる。
* テーブルやリストから特定のデータを抽出する際に利用できる。
* フォーム送信後（例: IDとパスワード）のエラーメッセージを特定、取得し、その内容を検証する際にも利用できる。
* サイトのナビゲーションバーを操作する際に使用できる。
* 複数のタブ間を切り替える操作に利用できる。
* ポップアップやモーダルウィンドウの要素を操作する際に使用できる。
* 特定の要素が存在するかどうかを確認する際に使用できる。
:::  
***


:::note alert
注意点
* 動的に生成される要素の場合、セレクタが変更される可能性がある。
* 不適切なセレクタはパフォーマンスに影響を与える可能性がある。
* 複雑すぎるセレクタは、読みにくく、エラーの原因になる。
* アプリケーションの更新でセレクタが変更されることがある。
* 非表示の要素は、その状態では見つけることが困難であることがある。
:::  

***

## よく使うセレクタ一覧
### **<INS>By.id("element_id”)**
IDを使ったセレクタ
```
element_by_id = By.ID, "element_id"
```
***  

### **<INS>By.className("class_name")**
クラス名を使ったセレクタ
```
element_by_class_name = By.CLASS_NAME, "class_name"
```
***  

### **<INS>By.tagName("tag_name")**
タグ名を使ったセレクタ
```
element_by_tag_name = By.TAG_NAME, "tag_name"
```
***  

### **<INS>By.name("element_name")**
名前を使ったセレクタ
```
element_by_name = By.NAME, "element_name"
```
***  

### **<INS>By.linkText("link_text")**
リンクテキストを使ったセレクタ
```
element_by_link_text = By.LINK_TEXT, "link_text"
```
***  

### **<INS>By.partialLinkText("partial_link_text")**
部分リンクテキストを使ったセレクタ
```
element_by_partial_link_text = By.PARTIAL_LINK_TEXT, "partial_link_text"
```
***  

### **<INS>By.cssSelector("css_selector")**
CSSセレクタを使ったセレクタ
```
element_by_css_selector = By.CSS_SELECTOR, "css_selector"
```
***  
### **<INS>By.xpath("//tag[@attribute='value']")**
XPathを使ったセレクタ
```
element_by_xpath = By.XPATH, "//tag[@attribute='value']"
```
***  

### **<INS>By.xpath("//*[@attribute='value']")**
属性を使ったXPathセレクタ
```
element_by_xpath_attribute = By.XPATH, "//*[@attribute='value']"
```
***  

### **<INS>By.xpath("//*[contains(text(),'partial_text')]")**
テキスト内容を使ったXPathセレクタ
```
element_by_xpath_text = By.XPATH, "//*[contains(text(),'partial_text')]"
```
***  



## まとめ
様々な要素を特定するにはByクラスを使うって行うべき。
またフォームなどの送信によるエラーメッセージなども捉えることができる。

***
LookerStudioで時系列グラフを作る。

昨日の続き。

https://qiita.com/mountaincat/items/4991e35eddd4cbe52be4

とりあえずデータの接続と読み込みができたら、基本の時系列を作っていきますね。
Tableauと違って、線グラフと時系列グラフの仕様が異なるので注意が必要です。

:::note
グラフを追加　→　期間
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/8d87700a-d81e-455e-7452-38289f0752ce.png)

デフォルトでこんな感じで出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/e502a2b4-d903-9ac4-594a-304708cff996.png)

これじゃ意味わかんないので調整していきます。

指標をクリックして、消費金額(円)　を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/870c265d-1941-2db6-0c23-d14b99e1e256.png)

まだよくわからん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/e83f3aaa-6131-d509-c948-f34cc283f5e3.png)

内訳ディメンジョンを市区町村に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/1e1680ac-bae4-87b0-dc44-a7bc741625b3.png)

まだわからん。
日付の粒度が細かすぎるのと、月によってはゼロ円の消費金額があるのでみづらいよね。
たとえば7-8月にカニを買わないとか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/425ce16f-47b6-3efd-aa68-a5785c5ca938.png)

ディメンションを、年月単位にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/28e18fcd-c16d-aa10-ff7b-df44b3aeb720.png)

なんかそれっぽくなってきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/1003f0dc-a062-5e1d-7274-c89628cae499.png)

最後に、品目を選択できる　コントロール　を追加します。

Tableauでいうところの、フィルターにあたりますね。
※LookerStudioにはチャート別に適用できるフィルター機能がこれはまた別にあるのでややこしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/2f6a46f9-fd39-6fd0-0b14-4c31758659ec.png)

コントロールフィールドをクリックすると、何をコントロールしたいかを選択できます。
この例だと品目ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/790af68e-ae25-4f5c-a6ac-75c83af9ee34.png)

# 完成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/8dcaf087-e31b-2c52-211a-3453fe88329a.png)

コントロールを使って、2019，2020年の水戸市のまぐろ消費金額(円)データを見てみよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/df090120-577c-dcbe-7667-843b0dc32e55.png)


実際のダッシュボード、触ってみてくださいな。

[Qiita_家計調査](https://lookerstudio.google.com/reporting/f25225ad-dad9-44f0-89b5-755612ee6885/page/XWelD)
mindの研究 その46

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mindで生httpリクエストを取得せよ。

# サンプルコード

```

エラー検査とは
　エラー？
　ならば
　　エラー文字列で　重大エラー
　つぎに
。

メインとは
　ホスト名は　文字列
　ポート番号は　変数
　待ちソケットは　変数
　データソケットは　変数
　エラーコードは　変数
　文字列１は　文字列
　「localhost」を　ホスト名に　入れ
　40001を　ポート番号に　入れ
　「ホスト名 」を　表示し
　ホスト名を　表示し
　「 、」を　表示し
　ポート番号を　数値表示し
　「 番ポートで待つ。」を　一行表示する
　ホスト名と　ポート番号と　１個で　ｌｉｓｔｅｎし
　待ちソケットに　入れ　エラー検査し
　「ｌｉｓｔｅｎの後」で　このメッセージでスタック検査し
　「ｌｉｓｔｅｎ完。待ちソケット番号　=　」を　表示し
　待ちソケットを　数値表示し　改行する
　ここから
　　「ａｃｃｅｐｔします」を　一行表示し
　　待ちソケットで　ａｃｃｅｐｔし
　　データソケットに　入れ
　　エラー？
　　ならば
　　　「エラー：」を　エラー出力し　エラー文字列を　一行エラー出力し　打ち切り
　　つぎに
　　「ａｃｃｅｐｔ完。データソケット番号　=　」を　表示し
　　データソケットを　数値表示し　改行する
　　ここから
　　　「クライアントからのデータを待っています。」を　一行表示し
　　　データソケットから　ハンドル指定で一行読み出し　文字列１に　入れる
　　　データ終り？
　　　ならば
　　　　「[EOF]クライアントが終了しました。」を　一行表示し　打ち切り
　　　つぎに
　　　「データ　＝　」を　表示し
　　　文字列１を　一行表示し
　　　「HTTP/1.1 200 OK」を　文字列１に　入れ
　　　文字列１を　データソケットに　ハンドル指定で一行書き込みする
　　繰り返し
　　「データソケットをクローズします」を　一行表示する
　　データソケットを　ハンドル指定でクローズする
　　「待ちソケットをクローズします」を　一行表示する
　　待ちソケットを　ハンドル指定でクローズする
　　打ち切り
　繰り返し
　「終わります。」を　一行表示する






```

# 実行結果

```
>nama0
ホスト名 localhost 、40001 番ポートで待つ。
ｌｉｓｔｅｎ完。待ちソケット番号　=　-560
ａｃｃｅｐｔします
ａｃｃｅｐｔ完。データソケット番号　=　-564
クライアントからのデータを待っています。
データ　＝　GET / HTTP/1.1
クライアントからのデータを待っています。
データ　＝　Host: localhost:40001
クライアントからのデータを待っています。
データ　＝　Connection: keep-alive
クライアントからのデータを待っています。
データ　＝　Cache-Control: max-age=0
クライアントからのデータを待っています。
データ　＝　sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"
クライアントからのデータを待っています。
データ　＝　sec-ch-ua-mobile: ?0
クライアントからのデータを待っています。
データ　＝　sec-ch-ua-platform: "Windows"
クライアントからのデータを待っています。
データ　＝　Upgrade-Insecure-Requests: 1
クライアントからのデータを待っています。
データ　＝　User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
クライアントからのデータを待っています。
データ　＝　Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
クライアントからのデータを待っています。
データ　＝　Sec-Fetch-Site: none
クライアントからのデータを待っています。
データ　＝　Sec-Fetch-Mode: navigate
クライアントからのデータを待っています。
データ　＝　Sec-Fetch-User: ?1
クライアントからのデータを待っています。
データ　＝　Sec-Fetch-Dest: document
クライアントからのデータを待っています。
データ　＝　Accept-Encoding: gzip, deflate, br
クライアントからのデータを待っています。
データ　＝　Accept-Language: ja,en-US;q=0.9,en;q=0.8
クライアントからのデータを待っています。
データ　＝　Cookie: lb:user_data=eyJlbWFpbCI6bnVsbCwiaGV4X2NvbG9yIjoiIzYwQTVGQSIsImlkIjoibXJ3M200YW9qN2l6ajdraGg1NTVtcWlvNWl0aGlhN3kiLCJuYW1lIjpudWxsfQ==
クライアントからのデータを待っています。
データ　＝　
クライアントからのデータを待っています。
[EOF]クライアントが終了しました。
データソケットをクローズします
待ちソケットをクローズします
終わります。
```

以上。
【UEFN】Verseでポップアップダイアログ操作してみる

## 背景
UEFNの様々な島を制作して思ったことがあります。それはプレイヤーが分かりやすいようなチュートリアルやゲームの説明を島に配置していくのが面倒だと感じていました。そこで使えそうなデバイスだったのが``ポップアップダイアログの仕掛け``になります。

## やること
ポップアップダイアログのタイトルや詳細、各ボタンの名前設定、それぞれのボタンのイベント購読をやってみます。

### 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/CcTLwIYWSLA?si=ikyAU1T1o0Jzv8QK" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 実装

### 利用するDevice
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/37e6adac-598d-009d-015f-07195f869a55.png)

設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/8e1ab2e4-b1b7-44dc-cc5e-dc53d308fc36.png)
- 自動表示を無し
- 反応Typeを6ボタンにする。(ボタンを6個配置する。※最大6個まで)
- デフォルトの戻るボタンをボタン６に設定（ポップアップを閉じるボタンの設定）

### 全体コード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


popup_controller_device := class(creative_device):

    @editable
    Popup:popup_dialog_device=popup_dialog_device{}

    TitleText<localizes>(Text: string) : message = "{Text}"
    DescriptionText<localizes>(Text: string) : message = "{Text}"

    PopupText1<localizes>(Text: string) : message = "{Text}"
    PopupText2<localizes>(Text: string) : message = "{Text}"
    PopupText3<localizes>(Text: string) : message = "{Text}"
    PopupText4<localizes>(Text: string) : message = "{Text}"
    PopupText5<localizes>(Text: string) : message = "{Text}"
    PopupText6<localizes>(Text: string) : message = "{Text}"


    OnBegin<override>()<suspends>:void=
        Popup.SetButtonCount(6)
        Popup.SetTitleText(TitleText("TitleText"))
        Popup.SetDescriptionText(DescriptionText("DescriptionText"))
        Popup.SetButtonText(PopupText1("PopupText1"),0)
        Popup.SetButtonText(PopupText2("PopupText2"),1)
        Popup.SetButtonText(PopupText3("PopupText3"),2)
        Popup.SetButtonText(PopupText4("PopupText4"),3)
        Popup.SetButtonText(PopupText5("PopupText5"),4)
        Popup.SetButtonText(PopupText6("PopupText6"),5)
        Popup.Show()
        Popup.RespondingButtonEvent.Subscribe(OnResponding)
    
    OnResponding(Agent:agent,Index:int):void=
        Print("Popup Responding, Index: {Index}")
```

タイトルや詳細、ボタン名に表示するための``message型``変数を宣言。OnBeginでそれぞれの要素に``message``
を流し込んでいる。どのタイトルや詳細に関しては一つしかないので引数に``message``だけを入れる形になっていて、ボタンは``message``とそのボタンのインデックスを指定する形になっています。

``Popup.Show()``で表示するように設定して、``RespondingButtonEvent``を購読することでどのボタンと誰が押したかを取得できるようになっています。

## まとめ
チームの選択や流行りのボックスfightの役職選択にとても使えそうだと感じました。他にもチュートリアルやゲームの説明にも使えそうですね。

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/MehcNhyxdq
【JavaScript】Promise 〜 初めてのAPI操作 〜



初めまして、現在プログラミングスクールで学習中のやまちゃんと申します。
Reactを勉強してみたいなと思っていましたが、そもそもJavaScriptの基礎を
さらっとしか触れていなかったので勉強することにしました。

その中で非同期処理において大事だと言われるPromiseについて少し調べてみました。
今回はcatAPIを用いて猫画像を取得する非常にシンプルなコードで見ていこうと思います。

catAPIについては下記を参照ください！
[catAPI](https://thecatapi.com/)


※ この記事は「RUNTEQ Advent Calendar 2023」の21日目を担当した記事です。
*** 

:::note warn
現在プログラミング勉強中の初学者です。
内容に誤りや補足情報等ございましたら、コメント・DM等で
教えていただけると幸いです。
:::


#### そもそも非同期処理とは？
JavaScriptでは基本一つの処理が完了するまで他の作業はできませんが、
非同期処理は一つの作業をしている間に他の作業ができるようにした仕組みの事です。

参考記事
[非同期処理とは何か、何が嬉しいの？](https://qiita.com/yunity29/items/7ccc84d47e139340ecbc)


#### Promiseとは
Promiseとは非同期処理の結果を表すオブジェクトで成功時と失敗時の結果を扱うもので
可読性が上がるように導入されたものです。

Promiseには「Pending・Fulfilled・Rejected」の３つの状態(ステータス)を持っています。
**・Pending(保留中)**
初期状態で、成功も失敗もしていません

**・Fulfilled（履行済み）**
非同期処理が成功し、結果が利用可能になった状態
このステータスになると、resolveという関数が呼ばれ、通信が成功したことを意味します。

**・Rejected(拒否)**
非同期処理が失敗し、エラーが発生した状態
このステータスになると、rejectという関数が呼ばれ、通信が失敗したことを意味します。

Promiseの基本的な構文は以下です。
```
new Promise((resolve, reject) => {
  //成功 or 失敗するかの条件に基づいてresolveかrejectを呼び出す非同期処理を記述
}).then((response) => {
  // 成功時の処理(ステータスがresolve時の処理)  
}).catch((error) => {
  // 失敗時の処理(ステータスがreject時の処理)
}).finally(() => {
  // 成功/失敗に関わらず実行される処理
});

```

### Promiseを用いてcatAPIから猫の画像を取得していきます。
```
document.addEventListener("DOMContentLoaded", function () {
  document.getElementById("catButton").addEventListener("click", function () {
    fetchCatData();
  });
});

function fetchCatData() {
  fetch("https://api.thecatapi.com/v1/images/search") // APIから猫の画像を取得
    .then((response) => response.json()) //JSONデータを処理する
    .then((data) => {
      const imageUrl = data[0].url;   // 取得したデータから画像のURLを取り出す
      displayImage(imageUrl);
    })
    .catch((error) => console.error("Error:", error));
}

function displayImage(imageUrl) {
  const imageContainer = document.getElementById("imageContainer");
  imageContainer.innerHTML = `<img src="${imageUrl}" alt="Pet Image" />`;
}
```

#### いやいやPromiseがないやん！！！
実はこのfetch関数自体がpromiseを含んでいるのです。
Fetch関数はリクエストを送るとすぐにPromiseオブジェクトを返却し、このPromiseは
HTTPリクエストの結果(通信の成功か失敗か)を表します。
リクエストから返却される結果に基づいてPromiseの状態が決定される様です。

※下記fetch関数でリクエストを送った直後のコンソール画面です。

![スクリーンショット 2023-12-21 3.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623154/8d96fb1e-b246-a8ee-f461-60e9f53d020f.png)
確かにPromiseが返却されています！
PromiseStateのプロパティは"fulfilled"が返ってきています

実際に取得できた画像はこちらです。
ランダムに表示されるので見ていて飽きないですね！


![catImage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623154/f13249dc-0a4b-c24f-b783-0a6d0092c39e.gif)



*** 
#### まとめ
また現在ではPromiseを発展させた**async/await**を用いる事が多い様ですが、
Promiseが基本となってできています。
JavaScriptでの非同期処理とひと口に言っても構成される技術は多岐に渡り、理解するには
かなりの時間が要するなと感じました。

学習を進めていく中で非同期処理は必須だと思うので、今後アプリ開発などにも活かせていければと思います！



参考資料
[【ES6】 JavaScript初心者でもわかるPromise講座](https://qiita.com/cheez921/items/41b744e4e002b966391a)

[フェッチAPIの使用 MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch)
【seleniumクラスシリーズ】Selectクラス



## はじめに
【seleniumクラスシリーズ】Selectに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
seleniumのselectクラスはドロップダウンメニューを操作する時に使う時に使う便利なメソッドがたくさんあるクラス。

:::note info
押さえておくべき点
* SelectクラスはSeleniumでドロップダウンメニューを操作するために使用。（セルの中から一つを選ぶようなメニュー）
* <select>タグの子要素である<option>選択するための複数のメソッドがある。
* <option>テキスト、値、インデックスを選択できる。
* 複数選択可能なドロップダウンにも対応。
* オプションのリストを取得することが可能
* 選択されているオプションを取得するメソッドがある。
:::  
***


:::note warn
利用シーン
* ユーザー登録フォームの国籍選択など、ドロップダウンリストの操作が必要な場面。
* ECサイトでの商品カテゴリ選択。
* 検索フォームでの条件指定。
* 日付や時間の選択。
* 設定画面でのオプション選択。
:::  
***


:::note alert
注意点
* <select>タグ以外には使用できない
* カスタムドロップダウンやJavaScriptで作成されたドロップダウンには適用できない場合がある。
* ページが完全にロードされてからSelectオブジェクトを使う必要がある。
* 複数選択可能なドロップダウンでは、適切なメソッドを使用する必要がある。
* オプションを選択する際に、正確なテキスト、値、インデックスを指定する必要がある。
* Webドライバーとの互換性を確認する必要がある。
* ブラウザのバージョンによっては動作しない可能性がある。
:::  

***


## メソッド一覧
### **<INS>select_by_value(value)**
値によってオプションを選択。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.select_by_value('value_to_select')
```

### **<INS>select_by_index(index)**
インデックスによってオプションを選択。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.select_by_index(0)  # インデックス0で最初のオプションを選択
```

### **<INS>select_by_visible_text(text)**
 表示されているテキストによってオプションを選択。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.select_by_visible_text('Visible Text')
```

### **<INS>deselect_all()**
すべての選択を解除（複数選択の場合）。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.deselect_all()
```

### **<INS>deselect_by_value(value)**
値によって選択を解除。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.deselect_by_value('value_to_deselect')
```

### **<INS>deselect_by_index(index)**
インデックスによって選択を解除。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.deselect_by_index(0)
```

### **<INS>deselect_by_visible_text(text)**
表示されているテキストによって選択を解除。
```
select = Select(driver.find_element_by_id('select_element_id'))
select.deselect_by_visible_text('Visible Text')
```

### **<INS>all_selected_options**
選択されているすべてのオプションを返す。
```
select = Select(driver.find_element_by_id('select_element_id'))
all_options = [option.text for option in select.all_selected_options]
```

### **<INS>first_selected_option**
最初に選択されたオプションを返す。
```
select = Select(driver.find_element_by_id('select_element_id'))
first_option = select.first_selected_option.text
```

### **<INS>options**
利用可能なすべてのオプションを返す。

```
select = Select(driver.find_element_by_id('select_element_id'))
all_options = [option.text for option in select.options]
```
***

## まとめ
WEBサイトの自動化を行う上で、複数の選択肢がある中から、選択する場面などにこのselectクラスを使う。注意点を押さえて、メソッドを利用して選択する、または選択を解除することができるクラス。
***

:::note info
押さえておくべき点
* SelectクラスはSeleniumでドロップダウンメニューを操作するために使用。（セルの中から一つを選ぶようなメニュー）
* <select>タグの子要素である<option>選択するための複数のメソッドがある。
* <option>テキスト、値、インデックスを選択できる。
* 複数選択可能なドロップダウンにも対応。
* オプションのリストを取得することが可能
* 選択されているオプションを取得するメソッドがある。
:::
初ハッカソンで大失敗した話

Qiita初投稿です。拙い文章ですが読んでいただけると幸いです。

今回は技術初心者が4人集まり、「プリプリペンギンズ」としてP2HACKS2023 Post-PBL部門に初参加した失敗談です。
ハッカソンに参加したいと考えている人の参考になればうれしいと共に、同じような過ちを繰り返さないよう懺悔として残しておきます。

# はじめに

記事投稿時点での自己紹介から

 - 公立はこだて未来大学（北海道の情報系大学）の学部3年生
 - 普段は情報セキュリティ関連の論文、書籍を読み漁っている
 - アプリ開発については有志のチームでAndroidアプリ開発を1年ほど（週1の活動なので実質半年弱くらい...?）
 - 授業のPBLではUnityを触ったことあり
 - 今回開発したWebアプリに関しての技術スタックはゼロ

上記からもわかる通り、いわゆるプログラミング初心者です。ほかのチームメンバーに関しても、アプリ開発の経験は私と同じくらいの3人が集まりました。正直、大失敗するフラグはビンビン立っているのですが、力試し程度で今回参加させていただきました。（おそらく技術力に関して、Pre-PBL部門を含めた参加者全員の中で最も低かったのではないかと思っています。）

# 制作したアプリ
今回のハッカソンのテーマは「ひんやり」でした。正味、私はアイディア等を考えるのが苦手であり何も思いつきませんでしたが、アイディア出しが得意なチームメンバーのおかげで
**「ひんやり」×「ヒヤリハット」＝「ひんやりハット」**
というアプリを作ろう、とまとまりました。

アプリの概要は

 - 冬の車の運転におけるヒヤリハットを削減する
 - 路面凍結の可能性がある場合に通知
 - 直近のスケジュールに対して準備時間を表示
 - 1日を乗り切る格言をGPTを用いて表示
 - その他天気に関する情報を表示

という感じです。
本来、こういった記事では使用した技術や発表の感想等をつらつらと書き連ねるべきなのですが、今回は主テーマではないため省略させていただきます。

# 失敗談本編
単刀直入に述べると、私たちのチームでは十分な成果物を仕上げることはできませんでした。また、発表に関しても明らかな準備不足により、グダグダなものとなってしまいました。

なぜ、このような大失敗が起こってしまったのか、自分なりに考えてみたので以下にまとめておきます。

## 失敗その1
**チームメンバーが忙しすぎた**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341903/bc7245d5-c990-f52c-058a-bbd8dadbf02d.png)
▲チームメンバーのうちの1人のスケジュール

P2HACKSでは開発期間が9日間あるのですが、そのうちの5日間は上記のスケジュールとなっていました。私はキャリアセミナーに参加していなかったため、多くの開発時間があったのですが、ほか3人は参加していたため、上記に近いスケジュールとなっていました。上記スケジュールでは1日当たりの開発時間も1~2時間程度しか確保できず、開発に集中することはできませんでした。

また、忙しさ故チームメンバー間でのコミュニケーションも不足してしまいました。開発後半では、機能の詰めが甘く、実装に向けた話し合いを再度するといったことが起こってしまいました。期間の限られたハッカソンという場かつ、忙しさにより集まることが難しかった私たちのチームでは、いちはやく個人で開発するための開発環境を整えるべきでした。

これらの問題がありつつも、私は開発時間があったので、彼らの分もカバーできるよう頑張ろうとした矢先、次のことが起こりました。

## 失敗その2
**参加者のうちの1人がインフル感染**

私がインフルに感染しました。これにより、私の開発時間もほかのチームメンバーと同様に少なくなってしまい、結果として開発期間9日間のうち5日間はチームの稼働が少なくなってしまいました。

## 失敗その3
**デザインメンバーの不足**

これはハッカソン初参加ならではの経験不足からくる失敗なのですが、形ある成果物を出すためにはデザイナーというものが非常に重要な役割を果たしていることに気づきました。

また、ハッカソンでは発表において成果物をアピールする必要があり、スライドづくりや発表に工夫を凝らすためにもデザイナーが必要でした。

メンバーが決まった時からこの問題は上がっていたのですが、なんとかなるやろ精神で放置した結果、グダグダな発表となってしまったわけです。

# 学び
上記を踏まえて、ハッカソンに参加するにあたっての注意点は

 - 参加前に十分な開発時間を確保できるようにする
 - 形ある成果物を出すためにデザイナーは必ず確保しておく
 - 開発環境の構築、成果物の機能の詰めは早めに終わらせておく

であると私は考えています。

今回の失敗の原因は、上記の事項に詰まっていると思います。もちろん技術力不足であるため、時間やメンバーが十分であっても優勝できたかどうかはわかりませんが、少なくとも清々しく終わらせることができたのではないでしょうか。

私と同じく、学生で初めてハッカソンに参加してみようと考えている人もいると思います。また、大人の方でも技術っコミュニティに勇気ある一歩を踏み出して、開発イベントに参加しようとしている方もいると思います。そういった勇気ある行動で悔しい経験を少しでも減らすことに、本記事が役立ってくれればと考えています。

# 謝辞
最後に本来想定していた稼働ができなくなってしまった中、サポートしてくれたチームメンバーに感謝申し上げます。時間のない中頑張ってくれたのに、悔しい結果になってしまったこと申し訳ないです。そして誘ってくれてありがとう。悔しくはありますが良い経験になりました。

そしてp2hacksを支えた運営の先輩方やスポンサー企業様にも、このような有意義な経験となる場を用意して頂いたこと改めて感謝申し上げます。
さくらインターネットを中から支える人たちの特徴をあげてみた

# はじめに
さくらインターネットの仲間たち、彼らは社内でどんな風に振る舞っていると思いますか？
今日は、そんな彼らのユニークな一面や特徴を楽しみながらご紹介してみたいと思います。

# 声がでかい
政治力ではなく、実際に声がでかい！ 
まるで元気そのもの。始業はだいたい9:30、でもその時点ですでにデカい。
~~お酒でも入っているのかな？~~（冗談ですよｗ）

でもね、**そんなデカい声から元気をもらえる**んですよね～。

# 物腰が柔らかい
最初は「ヤバい、何考えているのか全然わからねぇ～！」って思うこともありました。スミマセンｗ

でもミーティングや会話を通じて、「あぁ、結構色々考えているんだなぁ」とか、議論がヒートアップした時には最後まで話を聞いて、双方が納得する折衷案を出してくれるんですよ。

そう、**話を最後まで聞いてくれるおかげで、こちらも話しやすくて**。
めっちゃ助かっています。

# 熱すぎるくらいに熱い
さくらインターネットの仲間たちは何かしら熱くなれるものを持っています。

例えば、エンジニアが好きな技術について語りだすと、まるでマシンガントーク。
質問すると10でも100でも答えてくれるし、「聞いてないことまで教えてくれる笑」。

それってなんか、子供が学校での出来事を「あのね、あのね」って話してくれる感じで、なんだかニコニコしちゃうんですよね。（オレは独身だけど）

そんな熱量を見せつけられると、**こっちまで熱くなれちゃうんだよなぁ～**。
ありがたい。

# 世話焼き
さくらインターネットではSlackを導入しており、その日のTODOやつぶやきのような投稿をしたりします。

誰かに聞くわけでもなく、「〇〇がうまくいかねぇ～」とつぶやくと、サッと現れて「こうやるといいよ」と教えてくれるんですよ！
（どんな検索機能を使ってるんだろう、毎回思っている）

そんなサポートを受けると、**自分もやろうって思えて、実際にやってみるとそれが広がって部署を超えた連帯感のようなものに繋がっている**気がするんですよね～。

# イイネマン
何にでもサムズアップ！ 

何にでもは言い過ぎかもしれないけど、だれかの「これやりたい」に対して「いいね」とか「やろうぜ」とポジティブなスタンプが大量に付く。

仮にイマイチなものであっても「とりあえずやってみよう」とか、「ここがネックだけど、こうしたらうまくいきそうだよね」という前向きな意見がもらえます。

前向きな意見をもらうと、**モチベーションが高いまま行動に移せるし、失敗しても次に繋げようって思える**んですよねぇ～。

# さいごに

さくらインターネットってこういう人たちに支えられているんだなぁ～というのが分かってもらえたら幸いです。

いい職場でしょ？
[Windows]  bash: pbcopy: command not found 対処法

エラー
bash: pbcopy: command not found
Windows では原則 pbcopy コマンドは使用できない。

解決方法
clip コマンドを使う。

例　sshキーのコピー
clip < ~/.ssh/id_rsa.pub

参考
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

https://dev.classmethod.jp/articles/github-mac-terminal-ssh-login/
manabaの小テストで偏差値を出そう

manabaで小テストを受けたら成績が公開されますが、その成績公開がちょっと楽しくなるかもしれないよってお話です。

![スクリーンショット (744).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/881f354e-879c-b468-2465-e4926cb2064f.png)

小テストの成績はだいたいこんな感じで公開されますが、ここで注目したいのは **平均** と **標準偏差** です。みなさんが大好きな **偏差値** は **平均** と **標準偏差** を使って算出できます。

##### 偏差値の式

~~~math
(偏差値) = \frac{(自分の点数) - (平均点)}{(標準偏差)} \times 10 + 50
~~~

**平均点** だった場合の偏差値が **50** であることは何となく知っていると思いますが、その根拠が上記の偏差値の式です。
**自分の点数 = 平均点** だった場合、**偏差値の式の第一項（ややこしい分数の部分）** が **0** になり、**50** が残ります。


##### 実際に計算してみる
上の、"第11回　小テスト" で25点だった場合

~~~math
(偏差値) = \frac{25 - 14.1}{6.1} \times 10 + 50
~~~

って感じで計算できて、**偏差値** はおよそ **67.9** になりました。優秀ですね。

別の回でも計算してみましょう。

![スクリーンショット (746).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/3a88fbad-d5db-d006-b304-7c2fd56911bf.png)

"第9回　小テスト" で25点だった場合、上と同じように **偏差値** を計算すると、およそ **59.3** になりました。同じ満点でも偏差値が随分と変わりました。なぜこうなるかですが、**平均** と **標準偏差** の違いによるものです。
~~偏差値はこの2つの値で計算するので当たり前っちゃ当たり前ですけど。~~

第9回と第11回の **平均** と **標準偏差** を観察すると、第11回は第9回と比べて **平均値が小さく、標準偏差の値が大きい** ことがわかります。
平均点の低いテストで満点を取ったときの方が **すごそう** ってなりますよね、だいたいそんなイメージで大丈夫です。そのイメージ通り偏差値も高くなります。

##### 標準偏差ってなに？
あまり馴染みがないかもしれない **標準偏差** ですが、標準偏差は分散と同じように **ばらつきの指標** としてよく用いられる値です。分散はばらついていればいるほど値が大きくなります、その程度の認識で大丈夫です。その **分散に√をつけたものが標準偏差** です。
~~~math
 標準偏差 = \sqrt{分散} 
~~~
**ばらつきが大きい→分散が大きい→標準偏差も大きい**
こんな認識で大丈夫です。

##### どっちがすげえの？

以上をふまえて第9回と第11回を比較してみます。
第9回
・平均点の値が大きい
→だいたいみんな点数高い
・標準偏差の値が小さい（ばらつきが小さい）
→みんな同じような点数
2つを合わせると、みんな同じような点数で、高得点であるということがわかります

第11回
・平均点の値が小さい
→だいたいみんな点数低い
・標準偏差の値が大きい（ばらつきが大きい）
→点数はバラバラ
2つを合わせると、みんなバラバラで、全体の点数は低めということがわかります

この2つの小テストで満点を取った場合、どっちの満点の方がすごく見えますか？
多分第11回の方がすごそうに見えますよね、大体そんな感じです。偏差値もそんな感じの値になります。
偏差値高い方が"すごい" のにはこんな背景がありました。

以上、偏差値を出してみようっていうお話でした。

以下、余談です。

##### 余談：平均の偏差値が 100 の世界
あまりよくない書き方をしましたが、自分の立ち位置が平均だった場合、値が **100** になるものがあります。
みなさんご存じの **IQ** という数字です。
###### IQの式
~~~math
IQ = \frac{(自分の得点) - (平均点)}{(標準偏差)} \times 15  + 100
~~~

式の形を観察すると、**分数のややこしい部分** が **偏差値の式** と似ています。
**IQの式** で **自分の得点 = 平均点** だった場合、値は **100** になります。
つまり、平均的な人の **IQ** は **100** になります。これが、**平均の偏差値が 100 の世界** です。

偏差値とIQはどちらも **分数のややこしい部分** が **0** になるときが **平均** となります。

極端なことをいうと、平均の偏差値は **50** でなくともよいわけです。
 **偏差値の式** の **+50** の部分を **0** にしてしまえば、**平均の偏差値は** **0** になり、平均点より高ければプラス、平均点より低ければマイナスの値になります。
なぜ平均の偏差値が **50** なのかは謎です、偉い人が適当に決めたんでしょう。

###### よくない書き方
あくまで **平均の偏差値** は **50** です。
見出しの **平均の偏差値が 100 の世界** というのは言葉のあやで、厳密には **平均の偏差値は** **50** 、**平均のIQは** **100** という表現が正しいのかなと思います。
未来を思い描こう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の２４日目

# 将来どうなっていたい？

- 今日は未来の話
- 今を精一杯生きるのは将来なりたい自分になるため
- 未来は自分が思い描いた形に近づく
- そのための努力を今している（はず）
- なら未来にもっともっと期待して、そのために必要な努力を組み立てる必要がありそう
- 努力が報われるとは限らないけど、努力しないで期待した未来は得られない
- 遠く高い未来の目標をしっかり立てて、そのために必要な努力を分解して考えれば、今何をするべきかが見えてくる（かもしれない）

# 老人会の語り

- 若い時は無限に時間があるように錯覚する
- 気がつけば時間が過ぎている
- 振り返るとその場しのぎの努力を一生懸命やってきた、つもりになっている
- 若い時に思い描いていた（理想ではないがなんとなくの）未来にたどり着いた時に、後悔と不安がやってくる
- １年後、５年後、１０年後、どうなっていたいのかのビジョンを若い時にもっと考えたほうがいい、というおじいちゃん語りｗ

本文はここまで。以下老人会の戯言ｗ


# イマジネーション（TDRのナレーション風）

ビジョンを持てとか言われてもぼんやりしちゃうし、実際ぼんやりしてたし、なんとなくでいいかなって思ってたらなんとなくになった。
これからの人にはもっと明確にビジョンを持って欲しいと思っているので、その案を提示したい。

## お金のこと

- 何歳までに年収をいくらにするか
- 何歳までにいくら貯金するか
- 余剰資金を作ってどのように資産形成するか。何歳までにいくらの資産を持つか
- 今ももちろん大事だけど、未来は（死ななければ）誰にでもやってくる。その時困らないようにするのが、将来の自分への義務だと考えよう
- そう遠くない未来に、あの時あれに注ぎ込まなければいくら手元にあったんだろうって後悔はたいていの人が通る道
- 株（直接金融）を始めるなら早いほうがいい

## 仕事のこと

- 何を自分の仕事にしたいのかを真面目に考えよう
- なりたい自分、目指したい自分のためになる仕事をしよう
- やりたいことがないって先送りは後で後悔するかもしれない
- 今やりたいことがないなら、できそうなこと、やってみようかなと思えるものを選んで、しばらくの間一生懸命取り組んでみよう。結果、違うなと思ったらやりたくないことが１つ見つかったわけだから、他のことに取り組めばいい
- エンジニアの仕事は楽しいけど、大変だったり辛いこともたくさんある。やりたい覚悟がないなら手を出さないことをおすすめする（Qiita見ててそんな人いないかｗ）

## 健康のこと

- 運動の習慣を作ろう。筋トレが全てを解決するとは思わないけど、体力があればたいていのことはなんとかなる
- 悪習慣を断ち切ろう。やめたほうがいいことは早いうちにやめたほうがいい（タバコは無理ｗ）
- 歯を大事にしよう。不摂生すると本当にいきなり折れる（マジでヤバい）

## 生活のこと

- お金のこととセットになるけど、家をどうするかは真剣に考えよう
- 賃貸にも持ち家にもメリデメがある。将来の自分が納得できる選択をしよう
- どんな生活をしたいのかを想像しよう。一軒家かマンションか。フローリングのおしゃれな部屋か畳の和室か。その生活を手に入れるために必要なことは何かを考えよう
- 寝室と浴室にはこだわりたい（願望）

## 人付き合いのこと

- 後を頼める友人をひとりはつくろう。もちろん何人いてもいいけど、心から信頼できる人ってそう何人もできない（よね？）
- 誰にでも丁寧に接するように心がけよう
- 駅でぶつかって喧嘩になった相手が取引先に務めてるなんてこともある
- 飲食店で店員さんに横柄な態度をとっているところを誰かに見られているかもしれない
- 社会とは人と人が関わることで構成されている、ということを理解してからがスタート

# 改善依頼

- 若い頃の後悔なんかあったらコメントで
- 理想の未来を生きてるぜってことがあれば
- ビジネス書的にはアファメーションとか思い込みの技術と呼ばれている範囲のことなので、ソレにまつわる何か
PicoRubyでMatz葉がにロボコンに挑戦

この記事は[mrubyファミリー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mruby-family)の12/21の記事です。

[しまねOSS協議会](https://www.shimane-oss.org/)の黒谷です。

しまねOSS協議会は、松江高専が主催する「[第1回Matz葉がにロボコン](https://www.shimane-oss.org/kani-robo/)」に共催団体として参画しております。Matz葉がにロボコンとは、スモウルビーや軽量Rubyを活用したこども向けプログラミングコンテストです。かにをモチーフにしたロボットを指定のコースで走行させて競います。詳しくは[公式サイト](https://www.shimane-oss.org/kani-robo/)をご覧ください。

この大会は小学生部門とオープン部門に分かれています。オープン部門は中学生以上の方はどなたでもご参加いただけます。ということで私も挑戦することにしました。そう、PicoRubyで！

この大会で使用するロボットは、多足歩行型もしくは車輪型で、大きさの制限（縦、横、高さが２５ｃｍ以内）、火気はNGですが、他に細かいルールはあまりありません。小学生部門向けに開催される松江高専の講習会では、松江高専で開発されたESP32のマイコンを使った基板、センサー、タミヤのインセクトシリーズのロボットが提供されます。私はRaspberry Pi PicoとPicoRubyを使って挑戦することにしました。

ベースになるロボットは、私の子供が作って、飽きて、放置していた[タミヤ ロボクラフトシリーズ　2チャンネル リモコン・クワガタムシ](https://www.tamiya.com/japan/products/71119/index.html)をもらって使うことにしました。

モーターを動かすためにはモータードライバーが必要だと聞き、[DRV8833 スマートカーロボット用1.5A 2チャンネルHブリッジDCギヤモータドライバコントローラボード](https://www.amazon.co.jp/gp/product/B071SJ4T9M/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)を購入しました。

ライントレースのために必要なセンサーとして、[TCRT5000赤外線反射センサーモジュール IR用バリアライントラック光電スイッチ ジャンパー線付き 、Arduinoスマートカーロボット用](https://www.amazon.co.jp/gp/product/B081RPJ44L/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)を購入しました。

Matz葉がにロボコンの競技ルールには、ピンポン玉くらいの大きさのボールを運び、所定のエリアで落とすと加点される、というルールがあります。松江高専から提供されるロボットでは、サーボモータを使って実現しています。私もサーボモータを使おうと思い、[SG90 9gマイクロサーボモーター180°RCロボットヘリコプター飛行機制御カーボートロボット制御ケーブル付き DIYエレクトロニクス デュポンケーブルを含む 5点セット](https://www.amazon.co.jp/gp/product/B0B2QW7WGY/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1)を購入しました。

Raspberry Pi Pico用に3V電池ボックスを、モータとサーボ、センサー用に4.5V電池ボックスをそれぞれ用意することにしました。Raspberry Pi Pico、ブレッドボード、タミヤのユニバーサルなどは家にあるものを使って、写真のようなロボットを組み立てました。

![robo-20231221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219745/fd0dee28-212e-79ff-b178-69674e0d304e.jpeg)

ロボットを動かすプログラムは、残念ながらまだ完成していませんが、現時点で動作を確認できていることを書いておきます。

* モータードライバーに信号を送ってモーターを正転・逆転させる

モータードライバ DRV8833はモーターを2個制御できます。ひとつのモーターをIN1,IN2につなぎ、OUT1,OUT2をRaspberry Pi PicoのGPIOにつなぎます。IN1、IN2とモーターの動作は以下のような関係になっています。

| IN1 | IN2 | モーターにかかる力|
|:---:|:---:|:-------------:|
|LOW  |LOW  |無|
|HIGH |LOW  |正転|
|LOW  |HIGH |逆転|
|HIGH |HIGH |ブレーキ|

ですので、以下のようなコードでモーターを正転させることができます。
```
in1.write 1
in2.write 0
```
もうひとつのモーターをIN3,IN4につなぎ、OUT3, OUT4をGPIOにつないで左右の足を動かせるようになりました。4.5V電池ボックスから電源を取り、ロボットを歩かせることができています。

* 赤外線反射センサーモジュールで値が読み取れる

PicoRubyのADCライブラリを使って値の読み取りができています。センサーをRaspberry Pi PicoのGPIO26(ADC0)につないで以下のようなコードで読み取れました。

```
require 'adc'

adc = ADC.new(26)

while true
  puts adc.read
  sleep 1
end
```
センサーを左右２つ取り付け、それぞれの値によって右に曲がったり左に曲がったりするプログラムのテストもうまくいっています。

* サーボモータが動く

このロボットを作り始めた当初はPWMライブラリはありませんでしたが、天才・羽角さんが作ってくださいました！
以下はR2P2のIRBでサーボモータを動かす実験の動画です。
https://x.com/kurod1492/status/1735231040174891303?s=20

まだプログラムとして組み込むところまでできていないのですが、以下のようなコードで90度→0度→90度→180度→0度と動かすことはできています。

[https://gist.github.com/kurod1492/645169d4987116fbaba226dd6a3da203](https://gist.github.com/kurod1492/645169d4987116fbaba226dd6a3da203)

羽角さんから他のコード例を教えていただいているので、動作を確認し、動きが良さそうなプログラムを作りたいと思います。

かっこよくライントレースをキメている動画を掲載したかったのですが、このブログ記事には間に合いませんでした。がんばって作成を進めたいと思います。

Matz葉がにロボコンの本戦は、2024年1月6日に島根県松江市の松江テルサで開催します。興味をお持ちになった方はぜひ観戦においでください。
理系大学4年生のプログラミング講師体験談

# 1. はじめに
私は理系大学の学部4年生で主に機械学習について研究・学習しています。この記事では私が講師として勤めているプログラミング教室での体験を共有したいと思います。

# 2. プログラミング教室の概要
https://bingo.jp.net/

**BINGO**は、小学生・中学生・高校生を対象とするオンラインのプログラミング教室です。

### 特徴
- **授業の個別化**：基本的な方針はありますが、生徒と好きなことを相談しながら一緒にロードマップを作成していきます。
- **職業体験**：学んでおしまいではなく、仕事まで実践する。
- **自由度の高さ**：生徒のやりたいことに合わせた講師が担当するので、生徒側も講師側もかなり自由度の高い教室になっている。

### 働こうと思った理由
私は工業高校の情報科出身で、初めはプログラミングが全く面白くありませんでした。しかし、ゲーム制作やブレットボードを使ってLEDで小規模なイルミネーションを作成した際に、自分のプログラムよって制作物が動いた瞬間に感動を覚えました。同じような感動や成就を挫折なく経験してもらいたいと思い、プログラミング講師として働くことを決めました。

# 3. 活動内容
BINGOでは月３コマ(１コマ1時間)の授業を実施しています。主に私が担当した授業は以下の通りです。

## 3.1 担当授業内容
**Python基礎・応用**
- Pythonの基礎文法
- 簡単なタイピングアプリを制作

**ゲームプログラミング**
- Roblox
- 簡単なアクションゲーム
    
https://corp.roblox.com/ja/

**教育番Minecraft[コマンド,Agentの制御]**
- ゲーム内でAgentの制御
- コマンドを駆使してダンジョン制作

https://education.minecraft.net/ja-jp

**競技プログラミング**
- JOI[情報オリンピック]
- Atcoder
- 基礎的なアルゴリズム

https://www.ioi-jp.org/joi?utm_source=google&utm_medium=cpc&gclid=CjwKCAiAvoqsBhB9EiwA9XTWGStwF7FYaWUZdQFdpyh1ECHkx3Jp8pey8r6xNZZ6nwtAWjjxE65D8RoCwQcQAvD_BwE


https://atcoder.jp/?lang=ja



競技プログラミングの授業は予習に要する時間が膨大です、1時間で授業を終わらせるのも難しい(笑)
JOI２次予選の後半の問題普通に解けないし...💦

## 3.2 競技プログラミングの夏休み講座の立ち上げ
競技プログラミングに取り組んでいる生徒には、JOI２次予選突破を目標としている生徒が多く在籍しています。BINGOの月3時間という授業時間では、目標達成が難しい状況にありました。そこで夏休み講座の立ち上げを企画しました。夏休みということもあって講師の確保が難しかったのですが、私の友人や教室長の協力もあり、なんとか実施することができました。結果的に90分×24コマの合計32時間の講座の時間を確保することができ、生徒のスキルアップにつなげることができました。

## 3.3 Github講座&共同開発イベント
BINGOには、中高生とは思えないほどプログラミングができる生徒が複数在籍しているのですが、マインクラフト以外の部門では共同開発ができていません。そこで、共同開発を促進するために **Github講座**&**共同開発イベント** の計画を進めています。

GitHub講座では、基本的なターミナルの操作からスタートし、ファイル管理システム、Git、GitHubに関する理解を深めるための講義資料を作成しています。これにより、スムーズに共同開発に取り組む準備を整えることができます。

講義資料の理解が進んだ段階で、実際に一定の期間を設けて共同開発を行います。協同開発を通じて、生徒たちには技術的なスキルを向上させると同時に、協力し合い、コミュニケーションを図ることでチームワークやプロジェクトマネジメントの能力も高めてほしいと思っています。また、将来的な展望として、講師陣と生徒たちが同じ目線で共同開発できる環境を築きたいと考えています。

# 4. 働いて良かったこと
### 成長の瞬間
プログラミング教室BINGOでの講師経験から得たことは多岐にわたり、まず、生徒たちとの交流を通じて、彼らの成長を目の当たりにすることができ、非常に充実した瞬間でした。

### 自分のレベルアップ
競技プログラミング夏休み講座では、生徒たちの要望に応えるため、私自身が挑戦しなければならない難易度の高い内容もありました。これが結果的に私の技術力向上に繋がり、大変有意義な経験となりました。

ちなみに競プロを教えるためにC++を１から勉強しました💦 普段はPythonユーザーです💖

### 自由度が高い
この教室の自由度の高さには大きな魅力があります。生徒たちと一緒にさまざまなことに挑戦できる環境が整っており、その中で共同開発イベントの企画も進めることができています。この自由度の高さが、私たち講師陣や生徒たちが新しいアイディアを取り入れ、積極的に学び続ける原動力となっていると思います。

# 5. さいごに
プログラミング教室BINGOでの日々は、本当に充実したものでした。生徒たちと共に成長していく経験は私にとってかけがえのないものとなっています。この素晴らしい環境で働けていることに感謝し、これからもBINGOでの活動を続けていきます。