OmniAICreator/Qiita-1.07M huggingface dataset:
全てのS3バケットのアクセス設定を確認する方法

# 概要
複数のS3バケットがどのようなアクセス設定になっているか確認する為の`Shell Script`を作成しました。備忘録も兼ねて、そのコードと出力方法を記載します。

# 手順
1． どのディレクトリでも良いので`sh`のファイルを作成する
```sh
touch check_s3_access_settings.sh
```

2． 下記のコードを`check_s3_access_settings.sh`に記載する
```check_s3_access_settings.sh
#!/bin/bash

# 出力ファイル名
output_file="check_s3_access_settings.csv"

# CSVファイルのヘッダーを作成
echo "Bucket Name,Policy Status,ACL Status" > $output_file

# 全てのバケットのリスト一覧を取得
buckets=$(aws s3api list-buckets --query "Buckets[].Name" --output text)

for bucket in $buckets; do
    # バケットポリシーをチェックして公開状態を確認
    policy_status=$(aws s3api get-bucket-policy-status --bucket $bucket --query 'PolicyStatus.IsPublic' --output text 2>/dev/null)
    
    if [ "$policy_status" == "True" ]; then
        policy_status="Public"
    else
        policy_status="Private"
    fi

    # バケットACLをチェックして公開状態を確認
    acl_status=$(aws s3api get-bucket-acl --bucket $bucket --query 'Grants[].Grantee.URI' --output text 2>/dev/null | grep -q "http://acs.amazonaws.com/groups/global/AllUsers" && echo "Public" || echo "Private")

    # 結果をCSVファイルに出力
    echo "$bucket,$policy_status,$acl_status" >> $output_file
done

# 処理完了メッセージを表示
echo "CSVへの記述が完了しました：$output_file"
```
- `>` : 上書きして新規に書き込む。ファイルがすでに存在する場合、その内容はすべて削除され、追加した記述内容のみが書き込まれる
- `>>` : 上書きをしない状態で、追加で書き込む。ファイルの最後に新しい内容が追加され、既存の内容は保持される
- `/dev/null` : 出力先として指定すると何も起こらない。また、入力元として指定しても何も入ってこないファイル
- `2>/dev/null` : エラーメッセージのみを無視し、通常の出力は表示される

3． コマンドを入力し、処理を実行する
```sh
sh check_s3_access_settings.sh

# 表示内容
CSVの記述が完了しました：check_s3_access_settings.csv
```

# 参考記事
- [Amazon S3 のバケットポリシー](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucket-policies.html)
- [アクセスコントロールリスト (ACL) の概要](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/acl-overview.html)
- [Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1](https://unix.stackexchange.com/questions/70963/difference-between-2-2-dev-null-dev-null-and-dev-null-21)
【API不要】Twitterのリストを無料で出力する方法(自分用メモ)

# はじめに

要素を特定できるクラスが全然なくて、多分、
人によってクラス名が違う可能性もありますので、他の方の環境でも動作することは保証できません。

# 何が問題か

ツイッターのリストって、エクスポートできないんですよ。
Twitter APIでリスト出力は可能なんですが、Basic以上のプラン契約が必要で、べらぼうにお金が必要なんですね。
ネットでリスト出力できるスクリプトも有料販売されていますが、私の場合、リストに登録しているユーザー数は100人程度なので、別にAPIやスクリプト使うほどのことでもないなと思いまして。
なんとか無料でできないかと模索した結果、できました。

# 実装

```javascript
let resultArray = [];

function processElements() {
    const elements = document.querySelectorAll('div.css-175oi2r[data-testid="cellInnerDiv"]');

    elements.forEach(element => {
        const linkElement = element.querySelector('a.css-175oi2r.r-1wbh5a2.r-dnmrzs.r-1ny4l3l.r-1loqt21');
        const userElement = element.querySelector('div.css-146c3p1.r-dnmrzs > span.css-1jxf684');

        if (linkElement && userElement) {
            const link = linkElement.getAttribute('href');
            const user_id = userElement.textContent.trim();

            if (!resultArray.some(item => item.link === link)) {
                resultArray.push({ link, user_id });
            }
        }
    });
}

function logResults() {
    console.log(resultArray);
}

window.addEventListener('wheel', () => {
    processElements();
    logResults();
});
```

# このスクリプトの仕組みについて

* マウスをスクロールするたびに実行します
* Twitterのリスト要素に対してループ処理をおこないます
* TwitterのアカウントリンクとアカウントIDをobjectにセットし、配列に格納します
* 当該のアカウントリンクをすでに追加済の場合は、配列にセットしません
* ループ処理完了後、コンソールログに配列を出力します

# 使い方

1. PCで、Webサイト版のTwitterに、ご自身のアカウントでログインします
    * ブラウザはChromeを推奨します。
1. 左サイドバーから三点リーダ(もっと見る)をクリックします
1. リストをクリックします
1. エクスポートしたい自分のリストをクリックします
1. リストを編集をクリックします
1. メンバーを管理をクリックします
    ![202408231127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/e8a8cb13-38cb-24ae-8e85-92fb86e71357.png)
1. 上記の画面の、一番上のユーザーが表示されている状態で、F12キーを押して開発者ツールを開きます
1. コンソール画面に、上の実装したスクリプトをコピペします
1. ゆっくり、リストの最後までマウススクロールします
    ![202408231136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/d63eeba9-dfcc-920d-0fa4-4f22d04d1235.png)
1. コンソールログにユーザーのアカウントリンク先と、アカウントIDがリストアップされるので、右クリック > Copy Object をクリックします
1. 後はそのリストをいい感じに料理してください

以上
TeamsからSharepointドキュメントの有無を教えてくれるBotを作った話

### はじめに
入社1ヶ月でちょっと偉い人から
「ちょいと君。あの件はどうなっとるかね？」
そんな一言で幕を開けた、**あの件**とは

### フローの概要
とある部署で、Teamsに品番を入力するとSharepointの共有リンクを
Teamsで吐き出してくれるというフローがある
共有リンクの中はコピーしたフォルダ群で、フォルダ名は品番となっている。

ただ、コピー元にフォルダが無かった場合は特に通知もなく
「なんのフォルダがコピーされなかったのか？」というのがわからないので
「コピーできなかったフォルダを通知してくれるフローを作ってちょ❤」というもの。

### で、結局何が問題なのか
前任者が既存フローのマニュアルを作っていないので
既存フローにアクションを追加しようとしたけど、諦めた。
＆PowerAutomateな～んもわからへん。という状態
とりあえず別でフローを動かすことにしました。

### 作ったフローの全体図
※途中の変数や配列化は省略しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/b3b90b48-6b36-2ef3-a8d9-1ab757b3f34a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/38706e98-173e-0ed6-daf2-38742f38ca78.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/4cf084ed-6007-e2b3-d8b3-eb48ffef16dc.png)

①Teamsのメッセージが来たらフロー開始
②Teamsメッセージをテキスト化する
③テキストした文字列から更に余計な文字列を取り除き、配列にする
④Sharepointの全品番フォルダ情報を引っ張ってくる
⑤全フォルダ情報のフォルダ名だけを配列化する
⑥ ３と５を突合する
⑦ ６の結果をTeamsに吐き出す

こんな感じです。
全フォルダが全部で2000件以上あるので、情報を引っ張るのにめちゃ時間かかります。
あと分岐をすると何故か失敗するので、分岐や並行処理は入れてないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/34ca2d56-7bd6-3b69-6b63-ca0c46646336.png)

弊社のユーザはみんな気長な人が多いので
「ぜんぜんだいじょうぶですよ～」と言ってくれる。（やさしい）
CopilotはAPIでHTTP応答だともっと高速化できますよ！みたいなアドバイスをしてくれる
まあ私らド素人は、「Power Automateではじめる業務の完全自動化」でも読んでなさいってこった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794369/bc7a91e4-ff9c-8c7c-3e08-2cd5d3fa3bc1.png)

https://www.amazon.co.jp/dp/4295017795

この本にはめちゃくちゃお世話になりました。
Terminal.appで簡単にMac OSのNFDをNFCに書き換える

この記事では、特定のディレクトリ以下のファイルがNFDかNFCかを判定するスクリプトと、特定のファイルやフォルダーの名前をNFDに書き換える方法を紹介する。目的はVisual Studio CodeのプロジェクトがあるパスにNFDが含まれているとき、Gitが正しく動作しない問題を回避するためだ。

GitのMac版はユニコードの結合に対応している[^precomposeUnicode]のでコマンドラインで使っているとトラブルに出くわすことはそれほど多くない。GitHubに濁点・半濁点を含む日本語名のファイルをアップロードしても、他のプラットフォームではNFCとして扱われるほどだ。しかしVisual Studio Codeは、プロジェクトフォルダーのパスにNFDが含まれていると、ステータスを正しく扱うことができなくなったりしてしまう。

そこで、アドホックな回避策ではあるけど、プロジェクトのルートディレクトリとその上位パスをNFCに書き換えてしまえばいい。というわけだ。

「ファイル名、フォルダ名に日本語を使わない」というよく知られた回避策が何より有効なことは書き添えておく。

[^precomposeUnicode]: [git-config - Get and set repository or global options](https://www.git-scm.com/docs/git-config/2.14.6): core.precomposeUnicode

## NFD検出スクリプト

まず、NFDかどうかを検出するシェルスクリプトを紹介する。

```shell
#!/bin/zsh

RED='\033[0;31m'
GREEN='\033[0;32m'
NO_COLOR='\033[0m' 

# NFD形式かどうかをチェックする関数
is_nfd() {
    local filename="$1"
    if [[ "$(echo "$filename" | iconv -f utf-8-mac -t utf-8)" == "$filename" ]]; then
        # ファイル名はNFD形式です。
        return 0
    else
        # ファイル名はNFD形式ではありません。
        return 1
    fi
}

# 引数から対象ディレクトリパスを設定
target_directory="$1"

# 対象ディレクトリが存在しない場合は終了
if [ ! -d "$target_directory" ]; then
    echo "指定されたディレクトリは存在しません: $target_directory"
    exit 1
fi

# 対象ディレクトリ内の全ファイルを処理
find "$target_directory" -maxdepth 1| while read file; do
    # ファイル名を取得
    filename=$(basename -- "$file")
    
    # ファイル名がNFD形式かチェック
    if is_nfd "$filename"; then
        echo -e "${GREEN}[NFC]${NO_COLOR} $file"
    else
        echo "${RED}[NFD]${NO_COLOR} $file"
    fi
done
```

上記のコードを任意の場所に保存し（以下の例では```~/Document/Tools```に```NFD-detector.sh```という名前で保存する）、目的のフォルダで以下のように実行する。

```shell
% ~/Documents/Tools/NFD-detector.zsh ./

```

実行すると、以下のような出力が得られる。

![**[NFC]** ./
**[NFC]** .//従卒トム
**[NFC]** .//.DS_Store
**[NFC]** .//読書家アリス
**[NFC]** .//Three-Light-Year-Solitude
***[NFD]*** .//雲をあげる
***[NFD]*** .//海はどこにでも
**[NFC]** .//The-Year-of-the-Dragon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143865/22bdc4aa-ca06-07b2-795e-7691aa33ee03.png)

## NFDをNFCに書き換える

上記の例で「海はどこにでも」フォルダーの下は、VS Codeのソースコードコントロールが機能しない。そこで、このフォルダー名をNFCに書き換える必要がある。Terminal.appやVS Codeのターミナルを起動して、以下のように操作すると、NFDのフォルダー名をNFCに書き換えられる。

```shell
% ls -l
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:44 The-Year-of-the-Dragon
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:44 Three-Light-Year-Solitude
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 従卒トム
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 読書家アリス
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 雲をあげる
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 海はどこにでも

##   ↓lsからコピペ(またはコード補完)
% mv 海はどこにでも/ temp
##         ↓ターミナルで日本語入力・変換
% mv temp/ 海はどこにでも

```

これで「海はどこにでも」がNFCで保存される。Termina.appやVS Codeのターミナルで入力した文字はNFCを使っているためだ。

先ほどの検出スクリプトを使うと結果を確認できる。

![[NFC] ./
[NFC] .//従卒トム
[NFC] .//.DS_Store
[NFC] .//読書家アリス
[NFC] .//Three-Light-Year-Solitude
[NFD] .//雲をあげる
[NFC] .//海はどこにでも
[NFC] .//The-Year-of-the-Dragon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143865/35fbb328-d751-26ee-ffd0-292660215eda.png)

これで「海はどこにでも」をVS Codeのプロジェクトフォルダーに設定できる。

今のところ私は大きな問題に突き当たっていないが、ファイル名がASCIIで済むなら、ASCIIを使うようにしよう。
【Laravel】シンボリックリンクの適切な処理の仕方

## 1. シンボリックリンクが存在しているか確認する

### 確認方法
以下の手順でシンボリックリンクが存在されているか確認します。

**1.コマンド実行位置**
プロジェクトのルートディレクトリ（artisanコマンドが存在するディレクトリ）で実行します。

**2.以下のコマンドで、public/storageリンクが存在するか確認**

```
ls -l public/storage
```

リンクが存在する場合、以下のような出力が得られます。

```
lrwxrwxrwx 1 username group 23 Aug  1 12:34 public/storage -> ../storage/app/public
```
ここでpublic/storageが../storage/app/publicにリンクされていることが確認できます。
リンクが存在しない場合、
```
ls: cannot access 'public/storage': No such file or directory
```
といったエラーメッセージが表示されます。

## 2. シンボリックリンクが存在しない場合に作成する

### シンボリックリンクの作成
**1.コマンド実行位置**
引き続きプロジェクトのルートディレクトリで実行します。

**2.以下のコマンドでシンボリックリンクを作成**
```
php artisan storage:link
```
このコマンドを実行すると、```public/storage```に```storage/app/public```へのシンボリックリンクが作成されます。

### 実行後の確認
再度以下のコマンドを実行して、リンクが正しく作成されたことを確認します。
```
ls -l public/storage
```
正常にリンクが作成されていれば、リンクの詳細が表示されます。
```
例）lrwxrwxrwx 1 username group 23 Aug  1 12:34 public/storage -> ../storage/app/public
```

## 3. 留意点
### コマンド実行場所の重要性
`php artisan`コマンドは、Laravelプロジェクトのルートディレクトリで実行する必要があります。プロジェクトのルートディレクトリとは、`artisan`ファイルや`composer.json`ファイルが存在するディレクトリのことです。

### サーバー環境による制約
一部のサーバーやホスティング環境では、シンボリックリンクの作成が制限されていることがあります。特に、共有ホスティングなどでは管理者に相談が必要な場合があります。

### パーミッションの確認
`storage`および`public`ディレクトリのパーミッションが正しく設定されていることを確認してください。通常、これらのディレクトリにはWebサーバーが書き込み可能なように設定されている必要があります。
```
例）
chmod -R 775 storage
chmod -R 775 public
```

## 最後に
これで、シンボリックリンクの確認と作成ができるようになります。シンボリックリンクが正しく作成されていることで、storage/app/publicディレクトリに保存されたファイルがWebからアクセス可能になります。
YOUはどうしてエンジニアに！？

### この記事は<br>[YOUはどうしてエンジニアに！？](https://connpass.com/event/325074/)という<br>LTイベントで発表したスライドです。
---
# 遡ること11年前・・・
---
# 2013年 ワイ
---
# 30歳
---
# プログラミング実務未経験
---
# （勉強は1ヶ月くらいしたことあった）
---
# 学歴：高卒
---
# 職歴：正社員経験なし
---
# つまり「高卒フリーター30歳」
---
# 終わりきった経歴・・・！
---
# 当時は派遣社員
---
# コールセンターで<br>電話をとるお仕事をしていました
---
# エンジニアになろうと思ったきっかけ
---
# 当時、エレキギターのサイトを<br>見るのが好きなおじさんでした
---
# このギターって<br>どんな音がするんだろう
---
# 文字の説明を読んでも<br>よく分からない・・・
---
# クリックしたら音が出る<br>っていうサイトがあったらいいのにな
---
# 1つのギターでも<br>いろんなスイッチがあって<br>色んな音が出るから
---
# それを誰か<br>Web上で表現してくれたらいいのに
---
# なかったら、自分で作ればいい！
---
# でも作れない・・・
---
# コードなんて、ほぼ書けないから・・・
---
# ・・・そういえば！
---
# よめ太郎さんが<br>職業訓練校でWeb制作の<br>勉強したって言ってた・・・！
---
# ワイ「よめ太郎はん」<br>ワイ「ギターのサイト作ってや〜」
---
# 作ってくれた
---
# でも「クリックしたら音が出る」<br>みたいな高度な機能は<br>流石になかった
---
# ワイ「あの〜、よめ太郎はん？」<br>ワイ「クリックしたら音が出る機能も」<br>ワイ「作れそうかいな・・・？」
---
# よめ太郎「作れたら作るわ〜」
---
# 「行けたら行くわ〜」<br>的なノリ
---
# いつまでも進捗なし・・・
---
# しゃあない<br>ワイがJavaScriptとやらを<br>勉強するか・・・？
---
# 勉強してみた
---
# なんと1日で・・・！
---
# 「ギターぽちぽち触って音が出る」<br>機能を作れた！！！
---
# ※ただし、ググってコピペしただけ
---
# [ジャズマスター.jp](http://xn--yckccv7m2a3p.jp/)というサイトです！<br>ぜひ見てみてください！
---
# ワイ「欲しい体験は作れる・・・！」
---
# ワイ「ものづくり楽しい！」
---
# ワイ「プログラミング自体も楽しい！」
---
# ワイ「これを仕事にするしかない！」
---
# ドットインストールでWeb勉強！
---
# 派遣で働いていたコールセンターを<br>退職！
---
# 就職活動、開始！
---
# しかし・・・！
---
# 30歳・高卒・実務未経験！
---
# 正社員経験もなし！
---
# よって
---
# 書類審査50社落選！
---
# 「今回は誠に残念ながら落選・・・！」
---
# 「やめ太郎さんのご活躍を<br>お祈りいたします・・・！」
---
# お祈りメールばかり！
---
# 祈られすぎて・・・
---
# わしゃ神か！
---
# という妄想を抱くように・・・！
---
# っていうか、本当に<br>ワイの活躍を祈ってるなら・・・
---
# 御社が雇えばいいのに！
---
# それはさておき
---
# もう前職を辞めてしまっていたので<br>後がない・・・！
---
# この時期に妻（よめ太郎氏）も<br>妊娠・・・！
---
# 永遠に就活しているわけにも<br>行かないので・・・
---
# 正社員は諦めて・・・
---
# なんとか時給1,000円のアルバイトHTMLコーダーに・・・！
---
# 時給、激減！
---
# 娘ちゃん、誕生！
---
# 無限残業編、開始！！！
---
# その会社で頑張って・・・
---
# なんとか正社員登用されました！
---
# その後、2回ほど転職し
---
# 現在の会社（株式会社ゆめみ）に<br>落ち着きました
---
# 以上<br>「ワイはどうしてエンジニアに！？」<br>でした
---
# ご清聴ありがとうございました！
---
# 〜完〜
tf2初めて使うときに遭遇したエラー（備忘録）

# rqt_tf_treeをインストール時のエラー
* rqt_tf_treeのインストール
```
sudo apt install ros-humble-rqt-tf-tree
```

* ```ros2 run rqt_tf_tree rqt_tf_tree```を実行すると以下のようなエラーが出る。
```
qt_gui_main() found no plugin matching "rqt_tf_tree.tf_tree.RosTfTree"
try passing the option "--force-discover"
[ros2run]: Process exited with failure 1
```
# 解決方法
* 以下のコマンドを入力
```
rm ~/.config/ros.org/rqt_gui.ini
```
これで動くようになる。
IP-Adapter-Instructを試してみた

デモ、試してみるのがいい
https://huggingface.co/spaces/unity/IP-Adapter-Instruct

github　理論の説明
https://github.com/unity-research/IP-Adapter-Instruct

これは、画像を渡すと。その画像の、顔や、絵風・ポーズなどを、選んで別の画像を作れるみたいです。

　ですが、512サイズでチューニングされてるのか、大きくしてもうまくいかない。
## 結論
512サイズだと、まともに動くが、この品質だと継続して使うとは思わなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/04910a2b-fc45-7395-fde2-fc44fc577d79.png)

## 技術的な話
ZeroGPU環境でSpaceをクローンしたら1024サイズでも動きました。500秒とかに制限を変更すれば、2048でも生成可能かも。（ただ1024にしても、画質は良くなる一方、顔が増えたりして使えないです。)

ローカルでも、512サイズなら、VRAM 16GBで動きました。（ただSpacesモジュールを外してはいけません。(まれに落ちます。その場合、gradioアプリの再起動が必要です)

以下は試しましたが効果ありませんでした。
```
pipe.enable_attention_slicing()
pipe.enable_xformers_memory_efficient_attention()
pipe.enable_sequential_cpu_offload()
pipe.enable_model_cpu_offload()
```

### Connection errored out
Gradioとの接続が切れて起こるエラーですがサーバー側（ローカル）がメモリ不足で落ちるのが原因ぽいです。

それにしても、@spaces.GPU　がローカルでも影響する仕組みが不明です。
これが入っていると、CUDAに送っても、メモリエラーになりにくくなります。

### StableDiffusionベース
デフォルトの設定の
"stablediffusionapi/bracingevomix-v2"　等にかえると、多少、日本人ぽくなります。
pipeラインは、他にもあるので、いろいろなモデル試せるでしょう。
コンテナが嫌い？ だったらFreeBSDにしよう

# 私、コンテナ嫌いなんです
 世の中コンテナ大はやりですが、私、アレ嫌いなんですよ。
 * 構成を自分の思うとおりにしようと思うと余計な手間ばかりかかる。
 * 外部からのアクセスを受けたいときに同一ホスト内で別なネットワークを構成するのは手間。
 * UNIX系統のOSで同一の環境を作るのはそこまで手間じゃない。
 みたいな感じで自分的にはデメリットは多数あるけどメリットがほぼないのがコンテナだったりします。

 とはいえ、最近のアプリケーションは公開されてるインストール手順がいきなりdocker runチックなものになってたりしてマニュアル見るたびにげんなりしていました。

# portsコレクション
 UNIX系統のOSにはだいたいパッケージ管理システムがあるのですが、FreeBSDではバイナリをいきなりインストールできるpackageとソースコードをコンパイルなどしてインストールできるPortsコレクションがあります。
 で、このPortsコレクションでは可変パラメーターをインストール時に設定できたり、スクリプトだけでコンパイルなどがないものもバージョン管理できるなどバイナリパッケージでは手が届きにくいところにさっと手が届いたりします。
 https://docs.freebsd.org/ja/books/handbook/ports/

# コンテナだけの手順しか見当たらないものもportsには結構掲載されている
 NextCloudとかみんなコンテナでセットアップしているようですがコンテナがめんどくさい私にとっては敷居が高すぎます。それだけしかなかったら回れ右しているところです。

# いろいろインストール手順
## FreeBSDそのもののインストール手順は割愛
## セルフホストしたいサーバ
* NextCloud
```csh
 # cd /usr/ports/www/nextcloud/
 # make && make install
```
* Jellyfin
```csh
 # cd /usr/ports/multimedia/Jellyfin/
 # make && make install
```
 いずれも、make && make install です。依存関係があったら途中でインストールされたりパラメータ聞かれたりしますがそれだけです。
gyro_odometer error message

[0.500s] WARNING:colcon.colcon_core.package_selection:Some selected packages are already built in one or more underlay workspaces:
	'gyro_odometer' is in: /autoware/install/gyro_odometer
If a package in a merged underlay workspace is overridden and it installs headers, then all packages in the overlay must sort their include directories by workspace order. Failure to do so may result in build failures or undefined behavior at run time.
If the overridden package is used by another package in any underlay, then the overriding package in the overlay must be API and ABI compatible or undefined behavior at run time may occur.

If you understand the risks and want to override a package anyways, add the following to the command line:
	--allow-overriding gyro_odometer

This may be promoted to an error in a future release of colcon-override-check.
赤外線通信 SC2262IR、SC2272-L4

# プログラムなしで動く赤外線モジュール資料をまとめました。

赤外線送信ユニット基板　CNCルータで作成。ボタン電池駆動。
![IMG_4903.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/0c8a7b22-e11f-4078-ea25-0c55bd228d4f.jpeg)

赤外線受光ユニット　電源５V
![IMG_4901.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/07023b4e-7988-8070-c218-ae86ec45f2dd.jpeg)

:::note info
赤外リモコン送信IC：SC2262IR
赤外リモコン受信IC：SC2272-L4
赤外線受光ユニット　GP1UXC41QS
:::

# 送信側回路図
![赤外線LED送信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/4101fd8f-e34f-c31a-80a4-f67003a945e5.png)
**送信側のRoscは510kΩ。**　C1:0.1uF(パスコン)

# 受信側回路図
![赤外LED受信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/22d8a200-f413-4e41-e6f1-a25928ddede3.png)

**受信側のRoscは１MΩ。**　C1:0.1uF C2:100uF
トランジスタT2、T3、T4、T5は、オープンコレクタ端子で、DCモータなどを接続します。



:::note info
**送信器と受信機の通信速度の同期 Rosc抵抗値**
SC2262データシートより。

|SC2262|抵抗値|SC2272|抵抗値|
|:-----------|------------:|:------------:|:------------:|
||1.2M||220k|
||1.5M||270k|
||2.7M||330k|
||3.3M||680k|
||4.7M||820k|

この抵抗値ペアを採用することで、送信機と受信機の同期を取っていると思われます。

**今回は、この一覧のペア値ではなく、送信機510kΩ、受信機１MΩで動かしています。**
:::

# ブレッドボード配線 受信側
![赤外線ブレッドボード受信側.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/985535b8-9751-6f50-3d24-853494982b5e.jpeg)

受光モジュール:GP1UXC41QS
IC:SC2272-L4
C#で0埋めしない月や日を表示したかったら%を使おう

# 先に結論
~~タイトルの通り、月日を0埋めしないで表示したかったら`.ToString("%M-%d")`を使おう~~
0埋めしない月・日を単独で表示したかったら`.ToString("%M")`や`.ToString("%d")`を使おう
※コメントで指摘ありがとうございます。
# サンプルコード
```C#:title
using System;
/* // 現在日時を0埋めせず表示 */
/* System.Console.WriteLine(DateTime.Now.ToString("yyyy-%M-%d")); */
var sampleDate = new DateTime(2024, 8, 1);
// 月を0埋めせず表示
System.Console.WriteLine(sampleDate.ToString("%M"));
// 日を0埋めせず表示
System.Console.WriteLine(sampleDate.ToString("%d"));
```
出力結果
```
8
1
```
# 余談
今回仕事で初めてC#を使ったのだが、過去に使ってたJavaとフォーマット方法が異なったため、備忘録として残すことにした。Webで調べた限りだと`.Month`と`.Day`を結合する…みたいな結果しかなかった。0埋めしないで表示するケースはあまりないのだろうか…？
年は対象年が全て4桁だったため検証しなかった。3桁年を表示するみたいな案件に関わったら嫌だが、万が一…億が一関わることになったら調べて追記する。
(2024/08/26追記)
コメントで指摘があった通り、単独利用でない場合は`M-d`のような1文字表記で問題なかった。指摘に感謝すると共に、次回以降記事を書く前の検証をもっと十分に行うようにしていく。
【開催期間訂正】ANGEL Calendarを開催します！

# はじめに
この度、ANGEL Calendarの企画に参加しております！
記事一覧は下記のOrganizationアカウントの一覧をチェックしてみてください！
[2024-ANGEL-Dojo Organization](https://qiita.com/organizations/2024-angel-dojo)

# ANGEL Calendar運営からのお知らせ
こんちには！ANGEL Calendar企画運営メンバーのはらしまです！
[前回の記事](https://qiita.com/har1101/items/637ba82948aa7670fb9f)でふくちさんから下記の記事で紹介いただいたANGEL Calendarですが、開催期間が変更となりましたので訂正させていただきます。

:::note info
**【修正前】08/20(火)~09/20(金)**
**【修正後】09/01(火)~09/30(月)**
:::

# 注目ポイント
せっかくなので簡単にANGEL Calendarの魅力を2つお伝えします！！

### 様々な企業の方が参加！
今回の企画では、ANGEL Dojoの参加者の方の中からブログ投稿者を募り、**約30名**の方に立候補いただきました。AWSパートナー企業の方はもちろん、ユーザー企業の方にも参加いただいているため、様々な視点からの技術ブログを発信させていただく予定です！
投稿者につきましては、ブログへの投稿が初めての方や投稿に慣れている方もおりますし、本業としているレイヤも人によって大きく異なります。よりどりみどりな人材が準備を進めておりますので、どうぞお楽しみに！

### サボらずやります！毎日投稿
立候補いただいた方には、事前に投稿日を決めていただき、**締め切り駆動**で準備を進めていただいております。そのため、バラエティに富んだブログを（9月中は）毎日、皆さんにお届けいたします🥳
毎日の投稿を逃さず見たいよ！という方は、ぜひ[2024-ANGEL-Dojo Organization](https://qiita.com/organizations/2024-angel-dojo)のフォローもお忘れなく！

# 最後に
ANGEL CalendarはANGEL Dojo始まって以来、初の試みです。
期待と不安を背負いながらスタートとなりますが、自分の知識整理とともに読者の皆様へ少しでも有益な情報を届けられるよう、参会者一同、楽しみながら投稿していきたいと思います。
1か月間、どうぞよろしくお願いいたします！
GPT-4oファインチューニングモデルの追加：最新情報と成功事例の紹介

## 1. はじめに
皆さんおはようございます♪

詳しくは [https://note.com/kii_genai/n/nf5767cd49c1e](https://note.com/kii_genai/n/nf5767cd49c1e)もご覧くださいね♪

2024年8月に新たに登場したGPT-4oファインチューニングモデルは、OpenAIの技術にさらなる柔軟性と適応力を提供しています。これにより、ユーザーは自身の特定のニーズに合わせたモデルを簡単にカスタマイズでき、ドメイン特化型のAIシステムを構築することが可能になりました。特に、GPT-4oは、従来のファインチューニングに比べて高い精度を誇り、開発者にとっては特定のユースケースに最適化されたモデルを迅速に作成できるツールとなっています。

本記事では、GPT-4oのファインチューニングモデルに関する最新情報を深く掘り下げ、その特徴、料金体系、成功事例、ファインチューニングの具体的な手順などを詳しく解説します。

次の章では、まずGPT-4oのファインチューニングモデルが持つ具体的な特徴について詳しく見ていきます。

## 2. GPT-4oファインチューニングの特徴
GPT-4oファインチューニングモデルの最大の特徴は、カスタマイズの柔軟性と高い適応力です。開発者は、従来の「汎用的なAI」ではなく、特定のタスクやドメインに特化したAIを作成できるようになりました。このファインチューニングによって、以下のような大きなメリットが得られます。

- **無料トークンの提供期間**  
  OpenAIは、2024年9月23日までの期間限定で、1日あたり最大100万トークン分の無料ファインチューニングを提供しています。さらに、GPT-4o-miniの場合は、1日あたり200万トークンまで無料です。

- **コストの効率化**  
  ファインチューニング終了後はトークン単位での料金体系が適用され、学習に25ドル、推論（入力）に3.75ドル、推論（出力）に15ドルのコストが発生します。

- **カスタマイズの柔軟性**  
  AIのレスポンスの構造や会話のトーンを個別にカスタマイズ可能。従来のモデルとは異なり、学習に使用したデータはOpenAIの他のモデルに使用されません。

## 3. 料金体系の詳細
2024年9月23日までの無料トークン提供期間が終了すると、トークン単位での課金が行われます。具体的な料金は以下の通りです。

- **学習**: 100万トークンあたり25ドル  
- **推論（入力）**: 100万トークンあたり3.75ドル  
- **推論（出力）**: 100万トークンあたり15ドル

この料金体系は、無駄なコストを抑えつつ必要なリソースに対して効率的に支払うことができる設計となっています。

## 4. ファインチューニングの効果と成功事例
少量のデータでも効果的に学習でき、データプライバシーが保証されるGPT-4oのファインチューニングモデルは、多くの成功事例を生み出しています。

- **成功事例 1: Cosine Genie**  
  ソフトウェアエンジニア向けAIアシスタントを開発し、SWE-bench FULLベンチマークでState-of-the-Artの性能を達成。
  
- **成功事例 2: Distyl**  
  テキストからSQLクエリを生成するAIを開発し、BIRD-SQLベンチマークで1位を獲得。

## 5. ファインチューニングの手順
ファインチューニングは、OpenAIのダッシュボードとAPIを使用して行われ、以下のステップで進行します。

1. **データの準備**  
   タスクに適したデータを準備し、JSONL形式で整える。
   
2. **ダッシュボードの利用**  
   OpenAIのダッシュボードにアクセスし、ベースモデル（例: gpt-4o-2024-08-06）を選択。
   
3. **トレーニングデータの設定**  
   データをアップロードし、トレーニングの設定を行う。

4. **トレーニングの実行**  
   トレーニングを開始し、進行状況をモニタリング。

5. **カスタマイズモデルの利用**  
   完成したモデルをAPIを通じて利用し、実運用に適用。

## 6. まとめと今後の展望
GPT-4oファインチューニングは、特定のユースケースやニーズに応じたAIモデルをカスタマイズするための強力なツールです。今後、AI技術のさらなる発展と多様な業界での応用が期待されます。特に業界特化型ソリューションやプロダクティビティの向上が進展し、AIが私たちの生活やビジネスにますます浸透していくことでしょう。
部下の質問にきちんと答えるために自分のあいまいだった知識を改めて調べなおした#01



部下からもらった質問の中であいまいな回答しかできなかったことを後で調べて共有したものをメモとして。
# 要素の存在確認について
### Q :「jquery 要素 存在確認」で検索すると`.length`で確認する方法と`.size()`で確認する方法がヒットしたけどどっち使えばいいのか？
個人的にずっと`.length`使ってたんだけど部下に`.length`と`.size()`の違いをハッキリ説明できなかったので
「jquery length size() 違い」とかで検索してたらそもそもバージョン3.0以降では廃止になったらしいのでどっちがどっちとかではなかった。
一応廃止の情報を見つけるまでに`.size()`は非推奨となっていて、その理由が`.size()`のメソッド内で`.length`呼んでるから単純に数数えるなら`.length`でよくない？とのこと。

# `.lengt`hを使ったif文の書き方
### Q : なぜif文の条件が`num.length`じゃだめなのか。
```js
if (num.length) {
  // 処理
}
```
と書いていたので
```js
if (num.length > 0) {
  // 処理
}
```
に直してーって伝えようと思ったけど、そもそもなぜ`num.length`じゃいけないのか説明しないとと思い、
自分の中にふわーっと認識していたものを改めて整理。
・if文の条件で変数だけ指定する場合は返り値が`boolean`のもの。
・`.length`の返り値は`boolean`ではなく数値。
よってif文の条件を`num.length`じゃなくて`num.length > 0`で書いてほしい。

# 変数の定義
```js
const $hoge = $('.hoge');
```
### Q : この変数の先頭の$(ドルマーク)はなんのため？
Jqueryのオブジェクトだよーっていう印。
一目でjqueryの処理が加わるオブジェクトとわかるように。

# メソッドの記述について
```html
<div class="content-wrap">
  <div class="content"></div>
  <div class="content"></div>
</div>
```
```js
const $content = $('.content');
$content[0].text('hoge');
```
### Q : 1つめの.contentにテキストを追加したいのにエラーになる。
`$()`で要素を取得するとjquery用のオブジェクトになる。
jqueryオブジェクトに対してのメソッドの実行は問題なく実行されるが、
jqueryオブジェクトから取得した要素はjqueryオブジェクトに変換してあげないとエラーになる。
メソッドで取得した要素は対象外。`find()`や`first()`など。
メソッドは`.`で繋げて連続で使うことができる（メソッドチェーンという）。
```js
$('.content').get(0).text('hoge');
```
https://api.jquery.com/get/#get-index
コメント頂いたので修正しました、ありがとうございました:relieved:
正規表現の基礎


最近正規表現に関して学んだので、Qiitaに書いておきたいと思います✋


### 正規表現とは
wikiの説明だと、「文字列の集合を一つの文字列で表現する方法の一つ」となっています。

**文字列を検索、置換、検証等する際、複雑なパターンを指定するための方法**
の方がわかりやすいかもしれません。

- 特定の文字列が含まれる文字列
- 特定の文字列で始まる文字列
- 特定の文字列で終わる文字列
- 特定の文字列が連続して含まれる文字列
などそれぞれ行いたい表現方法があると思います。


### 正規表現の例
|記号  |説明  |例  |
|---|---|---|
|^ |行の先頭  |^a：文字列がa で始まる  |
|$ |行の末尾  |	a$：文字列がa で終わる  |
|. |任意の1文字  |a.b：文字列がa の後に任意の1文字、その後に b が続く  |
|* |0回以上繰り返し  |a*：a が0回以上繰り返される  |
|+ |1回以上繰り返し  |	a+：a が1回以上繰り返される  |
|? |0回または1回繰り返し  |a?：a が0回または1回繰り返される  |
|[] |文字クラス  |[abc]：a、b、c のいずれかの文字  |
|() |グループ化  |(abc)+：「abc」が1回以上繰り返される |

実際にこの表だけ見ても、ピンとこない方もいるかもしれないので、実際に正規表現が動くのか確認してみます。


https://rubular.com/
こちらのサイトは正規表現チェッカーの一つですが、こちらは主に Ruby 言語に基づいた、基本的な正規表現の構文は他の多くの言語と共有されています（JavaScript、Python、PHP、Java など）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/32c37af9-76ef-f024-c781-18a827980444.png)



### 正規表現の例にある行の先頭を実際に書いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/161d8ca4-2548-d5ca-3401-8c954e4e499c.png)
行の先頭を「あ」にするパターンを作り、「あんぱんまん」と記入すると、右側の結果にしっかり表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/48186e12-5dba-23af-a99f-3f3c2570642e.png)
仮に同じパターンで「カレーパンマン」と記入すると、表示されない。


めちゃくちゃ簡単な例ですが、文字列の制限ができています。


## 正規表現にはプログラミング言語によって変わる。


正規表現は、プログラミング言語によって、書き方が異なります。

例えば、カタカナのみの検索を記載する際、
Rubyの場合、
```
/[\p{katakana}　ー－&&[^ -~｡-ﾟ]]+/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/beaa5b03-e9dd-4974-4178-6f20145969d4.png)


Javascriptの場合
```
/^[ァ-ンヴー]*$/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/510a430b-4427-5e4f-e72e-626c55de5b49.png)



このように言語によって正規表現の書き方が違うというのが注意です。
※サイトが多くの言語対応のため、わかりにくいかもしれないですが、、


　　　　　


このように正規表現は、特定の文字列のパターンにすることができます。
統一じゃないのが、なかなか大変ですが、とても便利ですし、開発時によく使われることなどあるので、ぜひ調べてみてください！
【Excel】XLOOKUPなら左側からも取り出せる

こんにちはみなさんはXLOOKUP関数を使ったことありますか？
ぼくはVLOOKUPしか使ったことなかったのですがXLOOKUPなら左側からも取り出せるそうなので使ってみたいと思います
例として名前欄に氏名を入力すると該当番号にマイナンバーが表示される表を作っていきましょう

![スクリーンショット 2024-03-05 171321.png](https://storage.googleapis.com/topdowncom/content/5iwD08AcvJVtkcTIGk7RIVpsbQE2/488bd21a-ab0c-4b35-b42e-4cb35adaef43/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-03-05%20171321.png)
# VLOOKUP
```
=VLOOKUP(E3,B3:C7,2,FALSE)
```

![スクリーンショット 2024-03-05 171827.png](https://storage.googleapis.com/topdowncom/content/5iwD08AcvJVtkcTIGk7RIVpsbQE2/488bd21a-ab0c-4b35-b42e-4cb35adaef43/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-03-05%20171827.png)
> 検索するもの・・・E3
> vlookupの使用範囲・・・B3からC7
> B列を基準として2列目にあるC列から取り出す・・・2
> 完全一致で検索・・・FALSE

- 検索するものを範囲の一番左にしないといけない
- 取り出すデータは検索する列より右側にないと使えない
# XLOOKUP
```
=XLOOKUP(E3,B3:B7,C3:C7,,0)
```

![スクリーンショット 2024-03-05 171925.png](https://storage.googleapis.com/topdowncom/content/5iwD08AcvJVtkcTIGk7RIVpsbQE2/488bd21a-ab0c-4b35-b42e-4cb35adaef43/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-03-05%20171925.png)
> 検索するもの・・・E3
> 検索する範囲・・・B3からB7
> 取り出す範囲・・・C3からC7
> 見つからない場合はN/A・・・空白(初期値)
> 完全一致で検索・・・0

- B列を基準列としなくていいので左側の列からでも取り出せるようになった

例えば表の氏名とマイナンバーの列が逆だった場合
```
=XLOOKUP(E3,C3:C7,B3:B7,,0)
```
でマイナンバーの番号を取り出せる

![スクリーンショット 2024-03-05 164600.png](https://storage.googleapis.com/topdowncom/content/5iwD08AcvJVtkcTIGk7RIVpsbQE2/488bd21a-ab0c-4b35-b42e-4cb35adaef43/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-03-05%20164600.png)

# さいごに
読んでいただきありがとうございました！
今回は見つからない場合N/Aと表示される設定なのですが空白ではなく文字列を入力すればそのメッセージを表示させることもできるようです
XLOOKUPのちからってすげー！
VBAで将棋ゲームを作成してみよう　①初めてのマクロ作成と環境設定

最近何かとVBAを触る機会があり、感動しているので記事にしたいと思います。
知識として定着させるには、「人に教える」というのが1番だと感じているので今回は誰でも作成できることを優先したいと思います。
やはりトラブルシューティングできる人はかっこいいですよね〜♪
# 事前準備
- Excelを開く→名前をつけて保存→ファイルの種類を「Excel マクロ有効ブック(*.xlsm)」に変更してください。
- Excelのメニューから「ファイル」→「オプション」→「リボンのユーザー設定」→右側の「開発」チェックボックスにチェックをつけて「OK」をクリックしてください。
「開発」タブが追加されます。
- 「開発」→「Visual Basic」→「挿入」→「標準モジュール」を選択します。
# 9行×9列の将棋盤の作成
- 将棋盤は9×9のマスを使用するので、それを「・」で表現します。
- 下記のコードを先程の「標準モジュール」に貼り付けてください。
- 「ファイル」→「終了してMicrosoft Excelへ戻る」→「開発」→「マクロ」→「SetupShogiBoard」→「実行」を選択してください。
```
Sub SetupShogiBoard()
    Dim 行 As Integer, 列 As Integer
    For 行 = 1 To 9
        For 列 = 1 To 9
            Cells(行, 列).Value = "・"
        Next 列
    Next 行
End Sub
```
# コードの説明
```
Sub SetupShogiBoard()
```
- これから「SetupShogiBoard」という名前の仕事をします！という宣言です。
なので「SetupShogiBoard」は変更可能です。
- ()は引数を指定する場所ですが、今回は空です。
```
Dim 行 As Integer, 列 As Integer
```
- 「Dim」は変数を宣言するという意味です。変数とはデータを一時的に保存する箱だと思ってください。
- 今回は変数として「行」「列」としています。今回は分かりやすいように日本語を使用していますが、基本的には英語をオススメします。
- 「As」は省略可能ですが、何のデータ型が格納されてあるか分からなくなるのでエラーの原因になります。
- 「Integer」はデータの種類です。「行」と「列」の変数が整数を持つことを表しています。
- 「,」は複数の変数を一度に宣言することができます。
```
For 行 = 1 To 9
    For 列 = 1 To 9
        Cells(行, 列).Value = "・"
    Next 列
Next 行
```
- 「For」はこれから繰り返し処理をするという意味です。
今回でいうと、各セルに「・」を入れる処理です。
- 「For 行 = 1 To 9」
1行目から9行目まで一つずつ順に繰り返します。
- 「For 列 = 1 To 9」
1列目から9列目まで一つずつ順に繰り返します。
- 「Cells(行, 列).Value = "・"」は特定のセルに「・」を入れる操作です。
「Cells」:エクセルのセルです。
「(行, 列)」:行と列の番号を指定します。例えば「Cells(1, 1)」であればA1セルです。今回は繰り返し処理で指定してあります。
「.Value」:そのセルの中身(値)です。
「= "・"」:行と列で指定したセルに「・」をいれてくれます。
- 「Next 列」:現在の列の処理が終わったら次の列に進みます。
- 「Next 行」:現在の行のすべての列の処理が終わったら、次の行に進みます。
- 「End Sub」:この仕事終わり！ってことです。
# 実行結果
![将棋１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/dff778ab-7dd5-3baf-f815-6243b0243423.png)



# 今回はここまで
さて、ただセルに「・」が入っただけですが、見方を変えれば便利(?)だなと感じます。
次のステップでは、将棋らしくなってくると思います。
100-4：CSS基礎の学習（20/91）

# カリキュラム一覧
- <font color="FireBrick"><strong>レスポンシブウェブデザイン 認定講座　　　　　　　　　　　　　　←　今ココ</font>
- JavaScript アルゴリズムとデータ構造 (ベータ版) 認定講座
- フロントエンド開発ライブラリ 認定講座
- データ可視化 認定講座
- リレーショナルデータベース 認定講座
- バックエンド開発と API 認定講座
- 品質保証 認定講座
- Python を用いた科学計算 (ベータ版) 認定講座
- Python を用いたデータ分析 認定講座
- 情報セキュリティ 認定講座
- Python を用いた機械学習 認定講座
- Python を用いた代数学 認定講座

# レスポンシブウェブデザイン　認定講座の内訳
#### コース1
- [x] HTML の学習: 猫の写真アプリを作成する
- [ ] CSS 基礎の学習: カフェメニューを作成する <font color="FireBrick"><strong> ←　進捗：20/91step
- [ ] CSS 色指定の学習: カラーマーカーのセットを作成する
- [ ] HTML フォームの学習: 登録フォームを作成する
- [ ] 認定プロジェクト

#### コース2
- [ ] CSS ボックスモデルの学習: ロスコの絵画を作成する
- [ ] CSS フレックスボックスの学習: フォトギャラリーを作成する
- [ ] タイポグラフィの学習: 栄養成分表示ラベルを作成する
- [ ] アクセシビリティの学習: クイズを作成する
- [ ] 認定プロジェクト

#### コース3
- [ ] CSS 疑似セレクターの学習: バランスシートを作成する
- [ ] CSS 中級の学習: 猫のイラストを作成する
- [ ] レスポンシブウェブデザインの学習: ピアノを作成する
- [ ] 認定プロジェクト

#### コース4
- [ ] 技術ドキュメントページ認定プロジェクト
- [ ] CSS 変数の学習: 都市のスカイラインを作成する
- [ ] CSS グリッドの学習: 雑誌を作成する
- [ ] 認定プロジェクト

#### コース5
- [ ] CSS アニメーションの学習: 観覧車を作成する
- [ ] CSS Transform の学習: ペンギンを作成する
- [ ] 認定プロジェクト

# メモ
- xxx
Lispと自由の追求


![bandicam 2024-08-23 08-14-45-283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/01314717-d6fa-24d8-892d-8be9e16aa2c6.jpeg)

# 反響にびっくり
先日、「Lispの現代における意義」という小文を投稿しました。これは思いのほか反響がありました。英語版のreddit/lispで公表したところ、多数の意見とアップボートをもらいました。では日本語圏ではどうだろう？と思い、日本のQiitaに投稿してみたところ、トレンド入りし、多くの方に閲覧され、「いいね」もたくさんいただきました。

これはどういう現象なのでしょう？私は考え込みました。何が共感を生んだのでしょうか？

# 学校は苦手だった
私の個人的な経験ですが、学校という場所が心底苦手でした。特に高校生の頃はひどかったです。勉強はひどくつまらなく、私は大好きなロックミュージックに没頭していました。今でもエレキギターの腕前には自信があります。

ではなぜ、学校の勉強がつまらなかったのか？教科書通りのことをひたすら暗記し、訓練されるだけ。点数で競わされ、点数が取れないと教師からバカにされる。間違いや失敗は許されず、嘲笑される。学生時代は、勉強とは嫌なものをただひたすら我慢して凌ぐ訓練のようなものだと感じていました。会社の命令に絶対服従する企業戦士を育てるための予備校のように思えてなりませんでした。私は精神的にドロップアウトしていました。

# Lispは自由の象徴
そんな私が20歳くらいの頃にパーソナルコンピューターに出会い、それは知的なショックでした。そこには自由がありました。コンピューター上で思いつく限りのプログラミング実験を行い、気が付けば朝になっていたこともしばしばありました。題材の選択や解決方法はすべて自分次第で、自由そのものでした。我流ゆえに多くの失敗もしましたが、その失敗から多くを学びました。そこには一切の強制はなく、学ぶことが楽しいと初めて感じた瞬間でした。

そして、なかんずくLispはその自由の象徴でした。どんなプログラムを書こうとも、誰からも文句を言われません。Lisp処理系はひたすら私の疑問に答えてくれました。それが、今でもLispが大好きな理由です。

# 日本の未来は？
私には二人の息子がいます。私は彼らを育てるにあたり、できるだけ自由を重んじました。どんな職業につくのかも、すべて自由に選ばせました。「やりたいことをやりなさい」と言い続けてきました。

しかし、親子であっても個性は違うのかもしれません。彼らに聞いてみると、「特にやりたいことはない」のだそうです。それでも、普通に学校を卒業し、普通に社会人になりました。私が感じたような自由への渇望や、反骨精神でロックミュージックに熱中したような気持ちは、彼らにはないようです。そして、多くの日本の若者たちも同じようです。彼らは従順に組織に従い、どうせ政治なんて変わらないと思って選挙に行かない若者が多数います。

この状況に少し悲観的になることもありますが、まあ、なんとかなるのでしょう。Lispに出会ってから40年以上が経ちました。私にとってLispとロックミュージックは自由の象徴です。古臭いと言われながらも、Lispの普及活動に奔走しています。私は、いつかその努力が実を結ぶと信じています。
配列と型

```tsx
const TEST:ITest = {
  test1: 'Test1',
  test2: 'Test2',
  test3: 'Test3',
}

interface ITest {
  test1: string;
  test2: string;
  test3: string;
}

const valuesArray:ITest[] = Object.values(TEST);

console.log(valuesArray); // ['Test1', 'Test2', 'Test3']

const keysArray:string[] = Object.keys(TEST);

console.log(keysArray); // ['test1', 'test2', 'test3']

interface ITest2 {
  test1: string;
  test2: string;
  test3: string;
  type: Type1 | Type2 | Type3;
}

interface Type1 {
  type: string;
  type1_1: string;
  type1_2: string;
}

interface Type2 {
  type: string;
  type2_1: string;
  type2_2: string;
}

interface Type3 {
  type: string;
  type3_1: string;
  type3_2: string;
}

// ITest2の配列を作成
const testArray: ITest2[] = [
  {
    test1: 'Test1',
    test2: 'Test2',
    test3: 'Test3',
    type: {
      type: 'Type1',
      type1_1: 'Type1_1 Value',
      type1_2: 'Type1_2 Value',
    },
  },
  {
    test1: 'Test4',
    test2: 'Test5',
    test3: 'Test6',
    type: {
      type: 'Type2',
      type2_1: 'Type2_1 Value',
      type2_2: 'Type2_2 Value',
    },
  },
  {
    test1: 'Test7',
    test2: 'Test8',
    test3: 'Test9',
    type: {
      type: 'Type3',
      type3_1: 'Type3_1 Value',
      type3_2: 'Type3_2 Value',
    },
  },
];

// 検索するtypeの値を指定した配列
const searchTypes = ['Type2', 'Type3'];

// typeが一致するデータを格納する配列
const filteredArray: ITest2[] = testArray.filter(item => 
  searchTypes.includes(item.type.type)
);

console.log('Filtered Array:', filteredArray);

```
ExcelVBA

#シートから特定文言を含むセルを-に置換する。空白セルがあっても処理を続行させる

Sub ReplaceOUAndONWithDash()
    Dim ws As Worksheet
    Dim cell As Range
    Dim lastRow As Long
    Dim lastCol As Long
    Dim i As Long, j As Long
    
    ' 現在アクティブなシートを設定
    Set ws = ActiveSheet
    
    ' データがある最後の行と列を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    
    ' セルをループして置換
    For i = 1 To lastRow
        For j = 1 To lastCol
            Set cell = ws.Cells(i, j)
            ' セルが空白でない場合のみ処理を実行
            If Not IsEmpty(cell.Value) Then
                If InStr(1, cell.Value, "OU=") > 0 Then
                    cell.Value = Replace(cell.Value, "OU=", "-")
                End If
                If InStr(1, cell.Value, "ON=") > 0 Then
                    cell.Value = Replace(cell.Value, "ON=", "-")
                End If
            End If
        Next j
    Next i
    
    ' メッセージボックスで完了を通知
    MsgBox "完了しました。"
End Sub
ExcelVBA

##ユーザーシートのグループ名列にグループシートのグループ名が追加された場合、
グループシートの対象のグループ列へユーザーシートA列の名前を入れる。


Sub UpdateGroups()
    Dim wsUser As Worksheet
    Dim wsGroup As Worksheet
    Dim lastRowUser As Long
    Dim lastRowGroup As Long
    Dim i As Long, j As Long
    Dim userName As String
    Dim groupName As String
    Dim groupFound As Boolean
    Dim errorMsg As String
    Dim updateCount As Long
    
    On Error GoTo ErrorHandler
    
    ' シートを設定
    Set wsUser = ThisWorkbook.Sheets("ユーザー")
    Set wsGroup = ThisWorkbook.Sheets("グループ")
    
    ' ユーザーシートの最終行を取得
    lastRowUser = wsUser.Cells(wsUser.Rows.Count, 1).End(xlUp).Row
    
    updateCount = 0
    
    ' 各ユーザーを確認
    For i = 2 To lastRowUser ' 2行目から開始
        userName = wsUser.Cells(i, 1).Value
        groupName = wsUser.Cells(i, 2).Value
        groupFound = False
        
        ' グループシートの最終行を取得
        lastRowGroup = wsGroup.Cells(wsGroup.Rows.Count, 1).End(xlUp).Row
        
        ' グループシート内で一致するグループ名を検索
        For j = 2 To lastRowGroup ' 2行目から開始
            If wsGroup.Cells(j, 1).Value = groupName Then
                ' 一致するグループが見つかった場合、次の空セルに名前を追加
                wsGroup.Cells(j, wsGroup.Columns.Count).End(xlToLeft).Offset(0, 1).Value = userName
                groupFound = True
                updateCount = updateCount + 1
                Exit For
            End If
        Next j
        
        ' グループが見つからない場合
        If Not groupFound Then
            errorMsg = errorMsg & "行 " & i & ": グループ '" & groupName & "' が見つかりませんでした。" & vbCrLf
        End If
    Next i
    
    ' 正常完了のメッセージ
    MsgBox updateCount & " 件のユーザーが正常に更新されました。", vbInformation
    
    ' エラーメッセージがある場合に表示
    If Len(errorMsg) > 0 Then
        MsgBox "以下のエラーが発生しました:" & vbCrLf & errorMsg, vbExclamation
    End If
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

1. ボタンを配置
    * 「開発」タブをクリックし、ツールバーの「挿入」グループで「フォームコントロール」内の「ボタン（フォームコントロール）」をクリックします。
    * シート上でボタンを配置したい場所をクリックし、ドラッグしてボタンを描きます。
2. マクロの割り当て
    * ボタンを配置すると、「マクロの登録」ダイアログが表示されます。
    * 表示された「UpdateGroups」を選択し、「OK」をクリックします。
3. ボタンの名前を変更
    * ボタンに「ボタン 1」などのデフォルト名が表示されている場合、右クリックして「テキストの編集」を選択し、好きな名前（例:「グループ更新」）に変更します。
GitHub Actionsのワークフローで、ファイルを生成してリポジトリにコミット・プッシュ

## yaml

      - name: Commit and push changes
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "actions@github.com"


## リポジトリの設定を確認

リポジトリの設定にアクセスし、Settings > Actions > General に移動します。
Workflow permissions のセクションで、Read and write permissions が選択されていることを確認します。


## タイムゾーンの指定
ローカルとリモートで取得するデータの時間帯が異なる場合はtokyoを指定する。
ex)yfinance

```
import datetime as dt
import pytz

タイムゾーンを指定
timezone = pytz.timezone('Asia/Tokyo')
dt_now = dt.datetime.now(timezone)
print(f"Current time in timezone Asia/Tokyo: {dt_now}")
```
大人の夏休みの宿題

# 目的は、PythonでGmailに定期的に配信されてくる内容をスプレッドシートでリスト化し見やすくする
## ◎課題を解決するためには、下記の方法があると考える
### 
* メールからデータを取得する
* データを整形し、Googleスプレッドシートに書き込む

## 詳細なステップは下記の通り
* 依存ライブラリのインストール
* Google Sheets APIの設定
* スクリプトの作成とテスト
* 自動化の設定
* メールの取得
* メールの解析
* Googleスプレッドシートへの書き込み
* フィルタリングとラベリング
* 定期的な実行
* データの可視化

## 本日のゴール
* ステップ1：環境の準備と依存ライブラリのインストール
## 「メリット」
* 仮想環境の作成: 仮想環境を使うことで、プロジェクト内の依存関係を管理しやすくなります。仮想環境の作成とアクティベーションを行います。 但し、imaplibとemailはPython標準ライブラリであるため、追加インストールは不要です。
* gspreadとoauth2clientをインストールします。

## 実際にやったこと
*   pip install gspread oauth2client
*   https://gyazo.com/0dd21ca645c8102480ca4d30c30d5b8f

# 次回は、ステップ2：Google Sheets APIの設定です。
* やったことを順次記録していこうと思います。
Google Analyticsのリアルタイムレポートが反映されないときに確認すべきこと

表題について、網羅的に原因と対処法について書いている記事はいろいろあるので、基本的にはそれらを参考に確認作業すれば良いと思うが、私の場合はどこにも書かれていない原因だったので、ここで供養する。

# セキュリティソフトが原因だった
これが結論。
セキュリティソフトの保護機能を一時的に無効にしたところ、
表示できていなかったリアルタイムのデータが表示された。
あくまで私の場合の話ね。

英語でも書いておこう。

:::note info
**When Google Analytics real-time reports are not reflected
(When there is an alert about Http failure response 499)**

Suspect that security software may be the cause.
In my case, disabling that protection solved the problem.
:::



だいたい設定済みの既存のサイトでも、リアルタイムデータが見えない状態だったのだ。
今回新たにGA4を実装したサイトに問題があるわけではなく、あくまでアナリティクスのレポート画面における問題だったのだ。

## アラートが出ていた
リアルタムレポート画面にアクセスすると、画面の左下に以下のアラートが出ていた。
```
Http failure response for https://analytics.google.com/analytics/v2/realtime/venus/getData?{param} 499 OK
```
(パラメータ部分は省略している)

これはリアルタムレポート表示するためのデータが取れないってことだよね。
同じアラートが出ている人はいるようだった。

https://support.google.com/analytics/thread/273168795?hl=en
https://support.google.com/analytics/thread/276937503?hl=en

googleのコミュニティでいくつか投稿があがっていたが、いずれも解決してないようだった。
なので、解決したケースがあることをここに書き残しておこう。

なお、セキュリティソフトはその後すぐ有効に戻したが、正常に見える状態は続き、問題は再発しなかった。
USCIS Announces Second Random Selection for FY 2025 H-1B Cap

The U.S. Citizenship and Immigration Services (USCIS) recently published an important update about the FY 2025 H-1B Cap registrations. The agency will conduct a second lottery for the regular cap category. This outcome is set to affect prospective petitioners and beneficiaries competing for coveted H-1B visas in the United States.

Background

In March 2024, USCIS performed an initial random selection process for the fiscal year (FY) 2025 H-1B cap. This selection covered properly submitted electronic registrations, including beneficiaries eligible for the advanced degree exemption.

The initial filing period for these selected registrations for FY 2025 was from April 1, 2024, through June 30, 2024. However, the number of petitions filed did not meet the required quota for the regular cap.

The Update

USCIS has determined the need to select additional registrations to fulfill the FY 2025 numerical allocations. As a result, a second random selection process will take place soon, utilizing previously submitted electronic registrations. The prospective petitioners with registrations chosen in this second selection round will be eligible to file a petition for the respective beneficiary mentioned in the selected registration.

It’s crucial to note that this second lottery only applies to the regular cap, not the advanced degree exemption (master’s cap), as sufficient registrations were received for this category.

For all those who have been selected, the agency will update their myUSCIS accounts to include a selection notice, which will provide detailed information about when and where to file their petitions.

‍

Doesn’t this development offer renewed hope for many H-1B visa applicants who were unsuccessful in the initial lottery? We urge H-1B employers and prospective beneficiaries to stay updated on USCIS guidelines and timelines for the second round FY 2025 H-1B cap selection process.https://www.onblick.com/blogs/uscis-announces-second-random-selection-for-fy-2025-h-1b-cap
【iproute2】TUN/TAPとは


KlabのTCP/IPプロトコルソケット自作開発において、TUN/TAPデバイスの作成というのがあり、はじめましてという感じだったので理解を深めてみた。

# iproute2パッケージとは
Linuxにおけるネットワーク設定やルーティングの制御を行うためのコマンド群などを提供するパッケージです。GNU GPL v2の下で配布されています。
ネットワークの制御と監視を主な役割としており、具体的にはネットワーク設定(ipアドレスの付与等)、ルーティング設定、トンネル、帯域制御、ネットワークデバイスドライバなどその機能は多岐に渡ります。
同じような機能を持つものに、net-toolsというものが存在します。CentOS7から従来同じ役割を持っていたnet-toolsからiproute2が正式に採用される用になりました。(2014年頃の話)

ネットの記事などを探すと、ちょうどこの切り替わりの時期に、net-toolsとiproute2のコマンドの対応表などが多く出回っていることが確認できます。
https://enakai00.hatenablog.com/entry/20140712/1405139841

## TUN/TAPとは

:::note info
TUN (Network TUNnel): IPパケット(L3)フレームを仮想インターフェースに転送する。
TAP (Network TAP): Ethernetパケット(L2)フレームを仮想インターフェースに転送する。
→TAPはブリッジ生成に使われ、TUNはルーティングに使われる。

OSがTUN/TAPデバイスに送ったパケットは、そのデバイスに接続しているユーザープログラムに送信される。また、ユーザープログラムからTUN/TAPデバイスにパケットを送ることもできる。その場合、TUN/TAPデバイスはそれらのパケットをOSのプロトコルスタックに渡すので、OS側からはあたかも外部からパケットを受け取ったように見える。
(一部[Wikipedia](https://ja.wikipedia.org/wiki/TUN/TAP)より)
:::

　上記の資料を参照すると、TUN/TAPの主な利用シーンはトンネリングであるという記述があります。主に[VTun](https://vtun.sourceforge.net/)というトンネリングをアプリケーションに利用されているということが具体例として上がっていたことから、VPNの実装シーンにおいて用いられるという意味合いであると理解しています。
　TAPを利用することで、仮想のネットワークデバイス(Ethernetデバイス)とすることができ、物理メディアからパケットを受信する代わりに、ユーザー空間内でパケットの流れを処理することを可能とします。たとえば、tap0 で IPv6 を構成した場合、カーネルが IPv6 パケットを tap0 に送信すると、そのパケットはアプリケーション(VTun) に渡され、パケットの処理を行った後に通信相手へと返されるような処理となります。相手側のアプリケーションは受信したパケットを処理し、TAPデバイスに書き込みを行います。TAPデバイスはユーザー空間でのパケット処理を可能にすることで、トンネリングを実現させているということなのかなと思いました。

TUN/TAPの説明に関しては以下を参考とした。
https://docs.kernel.org/networking/tuntap.html
https://baturin.org/docs/iproute2/#ip-tuntap
https://ja.wikipedia.org/wiki/TUN/TAP

# TAN/TUPのコマンド集

## TUN/TAPデバイスを表示する
```
 ip tuntap show
```
ip tuntapで省略も可能


## rootユーザーにおけるTUN/TAP仮想デバイスの設定
```
ip tuntap add dev <interface name> mode <mode>
```

『interface name』において、例から一般的にtap0,tap1,tap2のように命名していくことが多そう。
『mode』 tun/tapのどちらかを指定する

## 一般ユーザーにおけるTUN/TAP仮想デバイスの設定
```
ip tuntap add dev <interface name> mode <mode> user <user> group <group>
```
『user』 任意のユーザー名(UID 1000以降が振られていく)

## TUN/TAPデバイスの削除を行うことができる
```
ip tuntap delete dev <interface name> mode <mode>
```
その他にもマニュアルを参照するといくつかの使用例が載っている。
[コマンド参照](https://baturin.org/docs/iproute2/#ip-tuntap)


## 使うシーン
今回においては、プロトコルスタックの実装だったので、OSのプロトコルスタックを通さないで処理を行いたい時などに使う。

## 最後に
以上のようなざっくりとした理解の後に、以下のようなサイトを見つけたが非常に参考になったので参照してみると良いかもしれないです。
https://syuu1228.github.io/howto_implement_hypervisor/part19.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778814/b097158b-dc70-fab0-91e9-a2f059c6c105.png)
(画像抜粋：[ハイパーバイザの作り方～ちゃんと理解する仮想化技術～ 第１９回 bhyveにおける仮想NICの実装より](https://syuu1228.github.io/howto_implement_hypervisor/part19.html))

・tap経由でパケット送信をする場合、パケットをwrite()システムコールで/dev/net/tunへ書き込むような処理を行なっている
・OpenVPNなどVPNソフトにおけるTAP/TUNの処理の理解
AzureでIPを固定したい時

## はじめに
こんにちは、ITコンサルをやっているまるやきです。
API制限で固定IPでの通信のみ許可されているときありますよね〜
煩わしいですが、セキュアなAPI通信を実現するためには仕方ないことです。
今回はAzure上で固定IPを設定する方法を解説していきます。

## 使用するAzureサービス
以下の3つを使用します。
- パブリックIPアドレス
- NATゲートウェイ
- 仮想ネットワーク

順番にそれぞれどのような設定で作成していくのか解説していきます。

## パブリックIPアドレスの作成
まずは固定するIPを作成していきます。
パブリックIPアドレス作成ページから作成ボタンをクリックしましょう。
設定は主に以下画像のIPアドレスの割り当てに気をつけましょう。
SKUをBasicに下げると動的も選べてしまいますが、この部分が静的になっていないと固定IPでなくなってしまいます。

:::note warn
2025 年 9 月 30 日に、Azure Basic パブリック IP は廃止されるので、どちらにせよ選択するのはおすすめしません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568119/b1f180ee-67a3-7aa7-ca92-080350904d78.png)
特段気にすること（可用性ゾーンやタイムアウト設定など）がなければ、必須事項を入力して、そのまま作成してしまって問題ありません。

作成したパブリックIPアドレスのページ（以下画像）に行き、「IPアドレス」が設定されていれば問題ありません。
「関連付け先」は私の画面だと表示されていますが、ご一緒に設定されている方は、表示されていません。
後からNATゲートウェイと連携するので、その際に「関連付け先」へNATゲートウェイのリソース名が表示されます。
![863F8C43-F3B2-433B-A228-CFCE5ADDF128_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568119/cd106a62-6740-aec9-88b3-31ddcb1e6d40.jpeg)

## NATゲートウェイの作成
次はNATゲートウェイを作成していきます。
NATゲートウェイ作成ページに行き、作成ボタンをクリックしましょう。
NATゲートウェイの作成は、以下のパブリックIPアドレスを選択する項目だけ気をつけましょう。
プルダウンをクリックすると、先ほど作成した静的IPアドレスが出てくるので、それを選択してください。
サブネットはこの後仮想ネットワークを作成した後に設定するので、一旦無視で作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568119/f1bd57d6-3e78-48e1-729a-ee250ed2ae09.png)

作成が終わったらパブリックIPの画面に行って、パブリックIPの最後で話題に出した「関連付け先」にNATゲートウェイのリソース名が表示されていれば問題ありません。

## 仮想ネットワークの作成
最後に仮想ネットワークを作成していきます。
今まで同様、仮想ネットワーク作成ページから作成ボタンをクリックします。
今回は少しややこしい画面が出ますが、基本いじらないので大丈夫です。
基本・セキュリティタブで必要事項を入力できたらIPアドレスタブに移動してください。
defaultサブネットを鉛筆マークをクリックして編集していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568119/39c92c1f-aa0c-5737-cd2e-c1950535600e.png)

鉛筆マークをクリックすると、メニューが出現するので、NATゲートウェイの項目のプルダウンをクリックし、先ほど作成したNATゲートウェイを選択して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568119/565fbcdf-dae8-e99d-900b-ea4ca6dbf12f.png)

こちらで設定は以上なので、タブを先に進めて作成しましょう。
固定IPを使用するための設定も以上になります！

## さいごに
今回はAzure上で固定IPを使うために実施することを紹介させていただきました。
例えばApp Serviceで固定IPを設定したい場合は、App Serviceのネットワークメニューから仮想ネットワーク統合を設定すれば、送信トラフィックのIPを固定化できます。
やりたいことに対して、使うサービスは多いもののやることは単純ですね。
これからVMやApp Serviceなどで固定IPを設定しないといけなくなった際の参考になれば幸いです。

最後まで見てくださってありがとうございます。
私はこんな感じの記事を自サイトにも投稿したりしなかったりしているので、よかったら閲覧していただけるととっても嬉しいです！！

https://www.yoshiki-maruya.com/
Eclipse Spring Tool Suite (STS)がEclipseにインストールされているか確認する方法

### Help→Eclipseマーケットプレイス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868071/3b0193e6-8643-c41d-c1dd-c2f9cceb8564.png)

### 検索欄にて、Spring Tool Suiteを検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868071/14031abe-bea4-8cd1-7e38-32f59e978f4b.png)

インストール済みとなっていれば、恐らくSTSは実装されているものと考えられます。
プラグイン確認方法がネット上にあまりなかったので、自分で進める時に少し困りました。

## STSとは何か
これはEclipseと別の機能ではなく、予めパッケージに内包されているものではないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868071/4d3fbb44-18f4-5efc-b947-6643c8c59b79.png)
https://willbrains.jp/
→Pleiades All in One Java Full Editio​n　を導入していれば、自動的にSTSの機能も実装されていると考えられます。
【paizaCランク】大きな数値を 3 けたごとにカンマ区切りで出力

Ruby学習のためにpaizaで問題集やスキルチェックをしています。

Dランクを飛ばしてCランクの問題集を挑戦し始めました。

標準出力メニューの問題集「大きな数値を 3 けたごとにカンマ区切りで出力」を解いて学んだこと、理解できていなかったことなど学習備忘録で記載していこうと思います。

## 問題
標準入力で与えられた数値を３桁ごとにカンマで区切って出力するという問題。

入力例
123456789

期待する出力
123,456,789

https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step6

## 自分が書いたコード
```
ary = gets.chomp.split("")
count = ary.size

i = 1

while i < count do
    print ary[i-1].to_i
    if i%3==0
        print ","
    end
    i = i + 1
end

print ary[i-1].to_i
```
### 書く前に考えたこと
どういう手順で解答に辿り着くか
①入力を受け取る
②一文字ずつ入力内容から取り出す
③何かしらのループ処理で３回取り出したらカンマを出力する
④最後の一文字はループを抜けてから出力する

### コードの解説
・入力をgetsメソッドで受け取ると文字列"123456789"となる。一文字ずつ出力するのに配列の方が扱いやすいと考え、splitで一文字ずつを要素にもつ配列として受け取った。
・ループ処理で処理回数を指定するためにcount = ary.sizeで配列の要素数をcountに代入。
・処理回数が3の倍数の時にカンマを出力するため、3の倍数回処理を行ったことがわかりやすいようiを1から開始した。
・ary配列から要素を1つずつ取り出し、to_iで数値型へ変換する。
・iが3の倍数、つまり3回処理を行ったごとにカンマを出力
・処理後にiに1を足し、i<count(今回の場合はiが9以下)の間、while文内の処理を続ける。
・8回目の処理が終わったら、while文を抜け、最後のary\[8](つまり9)を数値で出力して終了。

この処理コードで提出し、正解になった。

## 解答例
解答例より、pythonコードをchatGPT先生にrubyへ変換してもらったのが以下コード。
```
N = gets.chomp

N.length.times do |i|
  if i % 3 == 0 && i != 0
    print ","
  end

  print N[i]
end

puts
```
シンプル！

### 気づいたこと
・必ずしも数値型で出力する必要はなかった(問題文に答えの数値を出力と書いてあったため数値型にする必要があると思った)
・[]でインデックス番号を指定して一文字（一要素）ずつ処理ができるのは配列の場合だけだと思っていたが、文字列の場合も可能だと学んだ。
例）N = "Qiita"
    N[0] = "Q"
    N[1] = "i"
・while文は最後の文字出力がループを抜けてからになり、処理回数が決まっているためtimesの方がシンプルでわかりやすい。
・カンマをつける、つけないの判断（if文）を文字出力の前に行うという発想はなかった。インデックスが0から始まってもわかりやすい。（3の倍数の前にカンマをつける）

## こんな方法もある
```
def format_number(number)
  number.reverse.scan(/.{1,3}/).join(',').reverse
end

N = gets.chomp
puts format_number(N)
```

メソッドを作成、数値列を位の小さい方から3桁ごとに区切って戻している。
1〜3文字単位で区切るため、お金の表示などで使用できる。

## まとめ
自分の知っているコードで答えに辿り着くにはどうしたらいいか考える過程が楽しかったです。

Qiitaとpaizaコラボキャンペーン中だったのに、キャンペーン問題ではなく、普通の問題を解いてしまいました。