OmniAICreator/Qiita-1.07M huggingface dataset:
Explanation of MACsec and MKA Protocols implementation and configuration guidelines, AUTOSAR 1067, R23-11, AP

Explanation of MACsec and MKA Protocols implementation and configuration guidelines

https://www.autosar.org/fileadmin/standards/23-11/AP/AUTOSAR_AP_EXP_MACsec.pdf

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# Release Overviews
Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7
# terms
Short Name(Abbreviation / Acronym)|Description:
|:--|:--|
AN|Association Number
CA|Secure Connectivity Association
CAK|Secure Connectivity Association Key
CKN|Connectivity Association Key Name
DA|Destination Address
EAP|Extensible Authentication Protocol
ICV|Integrity Check Value
KaY|MAC Security Key Agreement Entity
MACsec|Media Access Control Security
MKA|MACsec Key Agreement protocol (IEEE Std 802.1X)
MKPDU|MACsec Key Agreement Protocol Data Unit
MPDU|MACsec Protocol Data Unit
PAE|Port Access Entity
PN|Packet Number
PSK|Pre-shared Key
SA|Secure Association or Source Address, as applicable
SAI|Secure Association Identifier
SAK|Secure Association Key
SC|Secure Channel
SCI|Secure Channel Identifier
SecTAG|MAC Security TAG
SecY|MAC Security Entity
SL|Short Length
SSCI|Short Secure Channel Identifier
TLV|Tag-Length-Value

# Reference

[1] Glossary AUTOSAR_FO_TR_Glossary
https://www.autosar.org/fileadmin/standards/23-11/FO/AUTOSAR_FO_TR_Glossary.pdf
[2] Requirements on MACsec AUTOSAR_FO_RS_MACsec
[3] IEEE Standard for Local and metropolitan area networks-Media Access Control (MAC) Security
https://ieeexplore.ieee.org/document/8585421
[4] IEEE Standard for Local and Metropolitan Area Networks–Port-Based Network Access Control
https://ieeexplore.ieee.org/document/9018454
[5] Specification of Manifest AUTOSAR_AP_TPS_ManifestSpecification
[6] The AES-CMAC Algorithm https://www.rfc-editor.org/info/rfc4493

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01初稿　　20231203
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
開発チームの心理的安全性を高めるためにやっていること6選

# 自己紹介
こんにちは、napoano365です。私は、LTSリンクの社内開発チームに所属しており、IT人材とIT案件をマッチングさせるサイト[「アサインナビ」](https://assign-navi.jp/)をはじめとする複数のウェブサービス開発や社内ITシステムの導入を担当しています。

私たちのチームは組織の拡大と積極的な採用により、毎年多くの若手エンジニアが増加しています。これら新しいメンバーの迎え入れや成長を支援するために、私たちは**心理的安全性のあるチーム環境**を重視しています。この記事では、私がチーム作りにおいて重要視しているポイントをいくつかご紹介します。

# やっていること
### 1.メンバーへ接するときは「みんな、同期」の気持ちで臨む
上司や部下という関係ではなく、「みんな自分の同期だ」くらいの気持ちで、接しています。自分が特別優れているわけでもなく、マネジメントもあくまで仕事上の役割分担だと考えています。若手メンバーにも独自の知識や視点があります。そういった多様性を尊重し、自分に足りない部分は素直にメンバーを頼り、対等に接することを心がけています。

### 2.情報の十分な提供
新メンバーには、プロジェクトの背景や経緯をきちんと伝えるようにしています。アニメや漫画の第1話を知らずに、途中から視聴を始めても、ストーリが全く頭に入ってこないように、プロジェクトの全体像を理解するためには、前提となる情報が必要です。若手が質問しやすい環境を作り、必要な情報を主体的に共有しています。
※私に限らず、既存メンバーの多くが世話焼き好きで、よく個別に1on1を実施して、じっくり対話している様子を見かけます。

### 3.悩みの共有
仕事の進捗上悩んでいることや困っていること、緊張していること不安なことなど、"自分の弱い部分"を包み隠さず自己開示しています。先輩が"弱さ"を赤裸々にしながらも、周囲と協力しながら課題解決している姿を見ることで、若手も自己開示しやすくなり、周囲を頼りやすくなり、チーム全体にオープンなコミュニケーションが促されていくと考えています。

### 4.価値観の押し付けを避ける
「こうしてください」という強制力をもった指示をできるだけ避けています（ただし、緊急を要する場合や、その人が大きな間違いを犯しそうな場合を除きます）。メンバーそれぞれに、独自の知識と経験があり、自分なりに最善の答えを見つけています。頭ごなしに否定することは避け、まずは共通の前提条件を整え、その上で一緒に問題解決の道を模索します。「こういう懸念があるのだけど、どう思う？」といった形で意見を交換し、皆で課題を共有し納得できる決定を目指します。こうすることで、細かい指示がなくても、チーム全体としての行動の方向性が一致し、チームワークがスムーズに機能するようになることが多いです。

### 5.期待値と役割の伝達
チーム全体の最適化を目指して、各メンバーに「今のチーム状況であれば、あなたには〇〇な行動を期待している」を個別に伝えています。ただし、これは「必ずこう動いてください」という指示とはせず、行動するか否かは本人に委ねています。単に「こうしたら助かる」という形で伝えるに留めています。自分に対する期待値を理解することで、メンバーはより自信を持ち、積極的に行動するようになります。またメンバーがチーム内で評価を得やすくなることで、自己肯定感が高まり主体的なアクションが増えていきます。
（注） 成果はそのメンバーのものであって「実は裏で自分が指示出ししていたんですよ〜」といった自己顕示欲を出してしまうと、カッコ悪くなる気がしています。若手メンバーの成功を素直に喜び、その応援者であることが大切だと考えています。

### 6.素直なコミュニケーションを大切にする
「ありがとう」や「ごめんなさい」といった素直なコミュニケーションを大切にしています。感謝の言葉を伝えることで、メンバーの自己肯定感が高まります。特に若手は、自分の仕事が成果につながっているか、自分は成長しているか、について不安を抱えがちだと感じます。そのため、何か貢献してくれたら、きちんと「ありがとう」と伝えることで、彼らの自信が育つように心掛けています。自己肯定感のコップが溜まるにつれて、その人本来の強みが発揮されやすくなると考えています。

同時に、「すいません」「ごめんね」「自分が間違っていた」といった謝罪の言葉も大切にしています。このような誠実さは、チームメンバーに敏感に感じ取っているものです。逆に、然るべき場面で謝罪しないときの先輩のズルさや逃げの姿勢は、その場では問題にならずとも、積もり積もってチーム内のハレーションが生まれることもあります。落ち度があれば、その場で真摯に対応して、信頼回復に努めています。

当たり前のコミュニケーションを当たり前に行うことで、良好なチームを築いていけると考えています。先輩や既存メンバーの行動が、若手メンバーに引き継がれ、脈々と組織文化を形作っていくため、その模範となる言動を、まずは自分が体現して見せていくことが重要だと考えています。

# まとめ
この記事をお読みいただきありがとうございます。
チーム作りは一つの正解があるわけではなく、状況によりに変化し続ける領域であり、
いろいろ試しながら、眼の前のチームにしっくりくる方法を探していくのが一番かと思います。

私が共有した考え方や行動が、皆さんのチーム作りに少しでも役立つことを願っています。
何か参考になる点があれば、ぜひ実践してみてください。
自作スマートホームをしようとしたらダイキンのエアコンの解析に苦戦した

## はじめに
わたしはN高等学校7期生で「大宮キャンパス」に通学しています。
今回は、とある人の「大宮キャンパスをスマートホーム化する」プロジェクトで
電子工作分野の制作を手伝ったときの苦戦話です。

## 大宮キャンパススマートホーム化の大まかな概要
室温や湿度などを取得してアレコレしたい
大宮キャンパスの照明、エアコンをWEB上から制御したい(現状はリモコンのみ) **←今回はこれ**

私はREST API的な何か()を使い制御する**赤外線リモコン** 兼 **室温計**を作るのを担当。
そして、まずは簡単にできそうな赤外線部分から作りはじめた。**←フラグ**

## まず考えたこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121927/b567df94-737a-11d2-4f45-6eb2a34a80f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121927/b8728e95-2f65-74ec-3718-f70385ef465b.png)

「IRremoteでリモコンの信号を解析すれば一発やん。」

Arduino UNOを使い解析してみる→
なぜかどのボタンを押しても同じ信号が出力されている(????????)

***これはリモコンのせいなのか、マイコンのせいなのか***

### →結論から言ってしまえば、マイコンのせいだった。
というのもダイキンのリモコンの信号長？はIRremoteが対応していない長さだったらしい。

### 解決策
https://github.com/crankyoldgit/IRremoteESP8266/issues/1886

色々探してみるとESP8266用のIRライブラリはダイキンのリモコンも標準対応しているっぽい
なのでこっちのライブラリを使うだけであっさり解決した。


### おわり
実はこれ1日で書いてるので内容薄くて申し訳ない
本当はもっと色々やってるけど書ききれないのでまた書きます
ありがとうございました
Istio Operatorが非推奨になっていた件

## Istio Operatorとは

Istioのコントロールプレーンをインストールし、継続的に更新するための設定方法として開発されたものです。
MySQL Operatorなどと同じような雰囲気です。
Istioのコントロールプレーンの運用において必要な項目を自動化するためのKubernetesのカスタムコントローラーです。

Isitoにおいては、管理の選択肢として以下のものが上げられます。

- Istioctl(https://istio.io/latest/docs/setup/install/istioctl/)
- Helm(https://istio.io/latest/docs/setup/install/helm/)
- Istio Operator(https://istio.io/latest/docs/setup/install/operator/)

## どのようなものか

```
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: default
  hub: gcr.io/istio-testing
  tag: latest
  revision: 1-8-0
  meshConfig:
    accessLogFile: /dev/stdout
    enableTracing: true
  components:
    egressGateways:
    - name: istio-egressgateway
      enabled: true
```

こちらは、[公式ドキュメント](https://istio.io/latest/docs/reference/config/istio.operator.v1alpha1/)から引用した、IstioOperatorについて記述したyamlの例です。

リソースを使用すると、使用する Istioインストール設定プロファイル、IstioのDocker Image(gcr.io/istio-testing)、グローバルメッシュ設定、およびゲートウェイやパイロットなどの各コンポーネントの設定を構成できます。

Operatorパターンなので、当然ですが必要な設定についてこのIstio Operator Resourceに保存しておき、実際にIstioをその状態に向かわせているのは、Istio Operator Controllerの方です。
Istio Operator Controllerは、istiod, ingress, egressなどを設定します。

## ところが、、、

公式によると、
https://istio.io/latest/docs/setup/install/operator/

> Istioctl および Helm のインストール方法を優先してください。新しい Istio インストールに IstioOperaor を使用することはお勧めしません。IstioOperaor は引き続きサポートされますが、新しい機能のリクエストは優先されません。

とのこと。API CentricにIstioを管理する唯一の方法であるIstio Operatorが非推奨となってしまいました。

最低限宣言的に構成の管理をすることIstioctlでもできるようです。


```
# my-config.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: /dev/stdout

$ istioctl install -f my-config.yaml
```

このようにmy-config.yamlを作成すれば宣言的な管理はできるそうですが、`kubectl apply -f`コマンドで実行したいですよね。

Helmやistioctlでのインストールが一般的になっていたんですね〜。
Elixirのチャットアプリを実装解説〜①設計編〜


この記事は、[Elixir Advent Calendar 2023 シリーズ7](https://qiita.com/advent-calendar/2023/elixir)の3日目です。

---

今年話題になったChatGPT。
ChatGPTクローンアプリをElixirで実装しようという動機がありました。

実装時にちょうどよい[参考記事](https://fly.io/phoenix-files/building-a-chat-app-with-liveview-streams/)を見つけたので、数回に分けてマイペースに紹介＆解説します。

https://fly.io/phoenix-files/building-a-chat-app-with-liveview-streams/

# 概要
本記事は、チャットアプリの機能要件とElixirでの実装方法を記載します。

# チャットアプリに求める機能

- テキストの送信
    - FORMで十分
- テキストを保持できるチャットルームの作成
- チャットルームではデフォルトで最新10件を表示
  - スクロールで過去のチャットを表示
- テキスト送信後、AIによるテキスト生成＆その受信（API通信）
- 送信されたテキストはリアルタイムで更新
- 上記を１つのページ

## Elixirによる実装方法

上記を実装する際に採用する方法は以下の方法が考えられます。
難易度の高い要素技術については後ほど解説します。

- ただのFORM
    - テキストの送信
    - テキストを保持できるチャットルームの作成
- Liveview Streams
    - チャットルームではデフォルトで最新10件を表示
      - スクロールで過去のチャットを表示
- Pub/Sub
    - チャットルームでは自分以外もテキストを送信可
    - 送信されたテキストはリアルタイムで更新

# 技術解説

## Liveview Streams
Phonix Liveviewを使うことで動的なページ（SPA）をElixirだけで作ることができます。
その中でも量が多いデータ表示をするときには、Liveview Streamsを採用します。
これはPhoenix 1.7, Livewview 0.18.16以降で利用できます。
Liveview Streamsが来る2023年2月までは、ページ要素の追加/削除などを行う公式の方法はなかったようです。

### 参考記事
- [Phoenix 1.7 とともに LiveView Streams がやってきた](https://blog.emattsan.org/entry/2023/02/27/200000)
- [Phoenix Dev Blog - Streams](https://fly.io/phoenix-files/phoenix-dev-blog-streams/)

## PubSub とは

Publish（発行）とSubscribe（登録／購読）を合わせた言葉です。
Pub/Subパターンとして知られています。
イベントを発行して、登録してる人にイベントを非同期で伝達します。
前述したLiveview Streamsもこのパターンに当てはまります。

この機能でやりたいことは、いわゆる通知システムです。
「チャンネルを登録して、ベルマークを押して通知が来るようにしてね！」ってやつです。

この仕組みを使って「チャットルームを開いている人に、他の人のチャットを通知」します。

# おわりに
チャットアプリの要件とElixirによる実装方法を紹介しました。

本記事で伝えたLiveview Streamsは、Elixirでリリースされた機能のうちの１つです。
他にもたくさんあるので気になる人は@piacerexさんの下記記事をご覧ください。
「[2023年末のElixirが出来ること③Elixir本体／Phoenix／LiveView編（最新Elixirのキャッチアップや、アドカレのネタ探しに読んでください）](https://qiita.com/piacerex/items/8cd483159c93d0f05bd7#liveview-018--020)」

後日、本記事の実装編をお送りします。
AWS Lambda のソースコードを S3 から取得する技術検証

# やりたいこと

- API 開発を体験できるハンズオンシステムを作る
- ハンズオンの動作環境を提供するだけなので、ソースコードは単一ファイルで良い
- プログラミング初学者を対象にしたいので、なるべく簡単な操作でデプロイしたい
- 開発体験のために、デプロイ時間を極力減らしたい

# 考えた実現方法

- AWS Lambda + Lambda Web Adapter で動かす
- Docker イメージはハンズオンに参加する人全部共通
- ソースコードは S3 にアップロードする
- S3 にアップロードして、Lambda の更新をすると変更が反映される

# 解決するべき問題

- 共通の Docker イメージで環境変数を指定することで関数の動きを変えることが出来るか？

# 作成したもの

start.sh で S3 からファイルをダウンロードして動かす。Lambda は `/tmp` 以外は書き込めないのでその点だけ注意。  
これで、Lambda の環境変数に S3 のパスを指定すると任意のプログラムを動かすことが出来る。

```Dockerfile:Dockerfile
FROM python:3.11.2-slim as base
WORKDIR /app

COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.1 /lambda-adapter /opt/extensions/lambda-adapter

RUN --mount=type=cache,target=/root/.cache/pip \
    --mount=type=bind,source=requirements.txt,target=requirements.txt \
    python -m pip install -r requirements.txt

COPY start.sh ./start.sh

EXPOSE 8080
CMD ["./start.sh"]
```

```sh:start.sh
#!/bin/bash

# S3 から main.py をダウンロード
aws s3 cp "$S3_PATH/main.py" /tmp/main.py

# main.py を実行
flask --app /tmp/main run --host=0.0.0.0 --port=8080
```

```txt:requirements.txt
awscli
Flask
```

```python:main.py
from flask import (Flask, jsonify)

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def hello():
    return jsonify(status=200, message='hello world')
```

# まとめ

開発体験の良いハンズオンシステムを作るための技術的な課題はクリアできた。  
このシステムについてはまた別途記事を作成する予定。
横着したいRustのデバッグ in VSCode

VSCodeでrustのデバッグってできるのかな？って気になったのでやってみました。実用的に使えるかは今後の私にかかっている気がします。

## 本題
デバッガはcodelldbを利用します。

少し古いですが、こちらを参考にしました。
https://qiita.com/84zume/items/377033ab6b6aee2a68d7

どうやらcargoでプロジェクトを作成してるとかなり楽にデバッグできる(`launch.json`を自動生成してくださる)みたいなのですが、私はcargoを使ってない環境でやりたかったので自分で`launch.json`を書くことにしました。

コンパイルは手動でやる予定でしたが`tasks.json`を使えば自動化できそうだったので使ってみることにしました。

### launch.json
```
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Rust for compiled files",
            "program": "./${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "rust_build",
            "postDebugTask": "rm_file"
        }
    ]
}
```
コンパイルは`rustc`で行うんですが(のちの'tasks.json'に記載)、デフォルトでファイル名を取得してくれるので、そのまま利用するようにしました。
pretaskとposttaskでコンパイルとコンパイル後のファイル(呼び方がわからない)の削除を指定してます。参考資料2からそのまま持ってきました。

### tasks.json
```
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "rust_build",
            "command": "rustc",
            "args": [
                "${file}",
                "-g"
            ],
            "group": "build", 
            "presentation": {
                "reveal": "never"
            }
        },
        {
            "type": "shell",
            "label": "rm_file",
            "command": "rm",
            "args": [
                "-rf",
                "${fileBasenameNoExtension}",
            ],
            "group": "build",
            "presentation": {
                "reveal": "never"
            }
        }
    ]
}
```
2つのtaskで構成されてます。上がrustcでのコンパイル、下がコンパイル後のファイルの削除です。rustcでのコンパイル時に`-g`オプションを追加することでデバッグの情報を含めてくれるそうです。これがないとbreakpointが使えませんでした。

## しめ
これでdebuggerをつかってbreakpointで止まったり、変数の内容を確認できるようになりました。
普段はpythonを使っているのと、lldbのことを知らなかったことが相まっていまいち使いこなせてないです。とりあえず、変数の中身は見れるようになったので一旦目標達成とします。
今後も使うならコマンドを覚えないといけないですね。

参考資料
1. https://qiita.com/84zume/items/377033ab6b6aee2a68d7
2. https://qiita.com/keitean/items/56a7e37577a6b05d0a81
コンパイルしたファイルを削除するtaskを追加しとくのは結構いいなと思いました！
3. https://doc.rust-lang.org/rustc/command-line-arguments.html
ArgoCD SSO連携 SAML2.0編

この記事は、[CyberAgent Group SRE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ca-sre)の5日目の記事です。

# はじめに
技術本部 サービスリライアビリティグループ（SRG）の石川 雲（@kumo_rn5s）です。

SRG（Service Reliability Group）は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
SRGでは以前から技術記事を執筆していますが、Google検索での最適化を施していないため、あまり知られていないようです。より多くの方に当社の記事を読んでいただくために、本記事の主要部分をSRGのサイトで是非ご覧ください。

本記事は、ArgoCDの数少ないSAML2.0連携について、ArgoCDコミュニティ内のSAML連携現状と連携事例を紹介するものです。

## ArgoCDのSSO連携について

ArgoCDは、Kubernetes環境向けの宣言型GitOps連携ツールです。弊社では、ArgoCDのGA前から導入し、複数のプロジェクトでArgoCDを利用しています。

ArgoCDのインストール後、初期設定に利用される全アクセス権を持つデフォルトユーザ `admin` が設定されます。この `admin` ユーザは、初期設定後は使用せず、代わりにローカルユーザへの切り替え、またはSSO統合の設定が推奨されています。

ArgoCDではSSOを設定するために、主に2つの方法があります。

1. **組み込みDex Connector**
    
    現在のプロバイダがOIDCをサポートしていない場合 ( 例: `SAML` 、 `LDAP` ）、またはDexの機能を活用したい場合(例: 属性マッピング)に適しています。DexもOIDCをサポートしています。
    
2. **既存のOIDCプロバイダ**
    
    Github、Auth0、Microsoft、Keycloak、Google、Oktaなど、既に使用しているOIDCプロバイダがある場合に適しています。


### ArgoCDとの連携には、どれがいい？

一般的に、既存のADやLDAPを持つ企業内環境では、多くのシステムがSAML 2.0のみに対応しているため、SAML 2.0が適しています。しかし、ArgoCDでSAML 2.0の連携をサポートしているDex Connectorは、SAML 2.0自体を非推奨としています。内部ネットワーク外での使用では、**SAML 2.0とArgoCDの連携はできるだけ避けるべき**です。

......

残りの内容については、ぜひSRGのサイトでご確認ください。

https://ca-srg.dev/b812f5c7612746f88f5200f5c5b566f0
THE FRUGAL ARCHITECT の法則に対してのアドバイス

# THE FRUGAL ARCHITECT

この記事は弊社のアドベントカレンダー２日目です。
ラスベガスからの移動で日付変更線を跨いじゃったので、なんかづれてますが、まぁ緩めに。

https://qiita.com/advent-calendar/2023/htb-dev-team

## 法則とアドバイス

Werner の Keynote の中で紹介された「THE FRUGAL ARCHITECT」に対しての理解を落とし込んでいきたい。

法則の詳細に関しては、以下のページについてまとめられている
(ページをするロールするとメモを書き書きするアニメーションがかわいい)

https://thefrugalarchitect.com/

このWebサイトに記載されていないが
Keynote の中では、各法則のお話をした後に、アドバイスとしての一言が添えられていたので、まとめておく

### English

| # | LAW | ADVISE|
|:-|:-|:-|
| Ⅰ | Make Cost a Non-functional Requirement | Consider cost at every step |
| Ⅱ | Systems that Last Align Cost to Business | Pay off your debts |
| Ⅲ | Architecting is a Series of Trade-offs | Align your priorities |
| Ⅳ | Unobserved Systems Lead to Unknown Costs | Define your meter |
| Ⅴ | Cost Aware Architectures Implement Cost Controls | Establish your tiers |
| Ⅵ | Cost Optimization is Incremental | Continuously optimize |
| Ⅶ | Unchallenged Success Leads to Assumptions | Disconfirm your beliefs |

### 日本語

訳は難しい、、

| # | LAW | ADVISE|
|:-|:-|:-|
| Ⅰ | ”コスト” とは非機能要件である | あらゆる段階で"コスト"を考慮する |
| Ⅱ | 長持ちするシステムにはコストとビジネス視点が必要 | 負債を返済せよ |
| Ⅲ | アーキテクチャはトレードオフの連続である | 優先順位に寄り添おう |
| Ⅳ | 観測しなければコストはわからないまま | メーターを定義しよう |
| Ⅴ | コスト管理と調整ができるアーキテクチャ | 階層を設定せよ |
| Ⅵ | コストの最適化は段階的に | 継続的な最適化を |
| Ⅶ | 挑戦なき成功は思い込みを生む | あなたの信念を否定せよ |

YouTube のスクショと合わせて残しておきます

https://youtu.be/UTRBVPvzt9w?si=euAb-f1Auvmy9llP

##　Consider cost at every step

あらゆる段階で"コスト"を考慮する

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/41b4451d-23fa-97e8-08ad-ab8dca4b81f2.png)

"コスト" は全体的なリソース管理上の割り振り。くらいのニュアンスな気がだんだんしてきた

##　Pay off your debts

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/7d364721-cef0-ad80-400d-f80fd8845491.png)

## Align your priorities

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/457653c6-273a-abfd-d614-53f51f048eed.png)

## Define your meter

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/4972f869-cebf-9343-5fff-f239ffb98446.png)

ここの「メーター」が訳しづらい気がするけど、アムステルダムの電気メーターの話から着地しているので、ダッシュボードとかそれくらいの意味だと思われる

## Establish your tiers

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/8719d727-6911-5541-a32e-2c59c554392d.png)

Tiers　もそのまま階層って訳がしっくり来てない

## Continuously optimize

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/b3738fb3-7fab-7ace-8d9f-f577a7c397a5.png)

## Disconfirm your beliefs

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/2fd2d5af-4eba-165a-ad21-ca3642e3dfe5.png)


# まとめ

アドバイスだけ並べて見てるとなかなかグサっと刺さるものがありますね。
特に「Your」がこんだけ並んでると、
「それぞれのビジネス環境によって、ここの話は変わってくるから、ちゃんと話し合えよ！」
って言われているような気がします。

そして、見直してたら、法則ごとにまとめても後で振り返る時に良さそうな気がしてきたので、次はそんな感じにしようかな。と
(小ネタがスルーされていたのが、ちょっと悲しかったので、そういうのもわかる範囲で補足していきたい)
JetpackComposeのHorizontalPagerを使ってみた。

今回はHorizontalPagerを使用してみました。

今回は下記1.4.0での実装方法です。
```
"androidx.compose.foundation:foundation:1.4.0"
```

# サンプルコード
```HorizontalPagerSample.kt
const val PAGE = 3
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun HorizontalPagerSample() {
    val pagerState = rememberPagerState(initialPage = 0)
    Box(
        modifier = Modifier.fillMaxSize()
    ) {
        HorizontalPager(
            state = pagerState,
            pageCount = PAGE
        ) { page ->
            Column(
                verticalArrangement = Arrangement.Center,
                horizontalAlignment = Alignment.CenterHorizontally,
                modifier = Modifier
                    .width(300.dp)
                    .height(200.dp)
                    .background(
                        color = Color.Gray,
                        shape = RoundedCornerShape(8.dp)
                    )
            ) {
                Text(text = "ページ数： $page")
            }
        }
    }
}
```

こちらがシンプルなHorizontalPagerの使用方法です`pageCount`がページ数を設定します。
シンプルに書けるので、Composableのメリットですね！

# 実行結果

![qiita_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/0250cddf-f710-ab09-893d-88968d8f48e8.gif)
PythonでBMIを計算する

はじめに
-
初めまして、社会人1年目の新妻と申します。

私は現在、システムエンジニアとして開発支援業務をしています。

今回は、健康診断の結果があまりよろしくなかったため、今までの知識を活かして簡単にBMI計算プログラムを作りました。

計算までの流れ
-
ユーザーに体重と身長の入力を求めます。
入力された身長はセンチメートルからメートルに変換されます（100で割る）。
BMIを計算します。BMIは体重を身長の2乗で割ったものです。
計算されたBMIが特定の範囲に応じて、「痩せ型」、「標準体型」、「肥満(軽)」、「肥満(重)」のいずれかに分類されます。
最後に、計算されたBMIと分類結果が表示されます。
このコードは、ユーザーが入力した体重と身長に基づいて、BMIを計算し、それに応じて体型を判定するプログラムです。

コード
-
```Python
# BMI判定プログラム
weight = float(input("体重(kg)は？:"))
height = float(input("身長(cm)は？:")) / 100
bmi = round(weight / (height ** 2))
if bmi < 18.5:
    result = "痩せ型"
elif (bmi >= 18.5) and (bmi < 25):
    result = "標準体型"
elif (bmi >= 25) and (bmi < 30):
    result = "肥満(軽)"
else:
    result = "肥満(重)"
print("BMI: " + str(bmi))
print("判定: " + result)1001
```
出力結果
-
```:痩せ型
体重(kg)は？:50
身長(cm)は？:170
BMI: 17
判定: 痩せ型
```
おわりに
-
今回は学生時代に作っていたものを再現してみました。学生時代に比べて暇な時間にプログラムを作る習慣がなくなりましたが、この機会に少しづつ増やしたいと思います。
閲覧いただきありがとうございました:bow_tone1:
MinecraftでMODを作る

この記事は[Life is Tech ! Advent Calendar 2023](https://qiita.com/advent-calendar/2023/life-is-tech?fbclid=IwAR1xKCMEFixbRab3ZhsLurKO32i3FjkCkNmDOdz7nGc6zeFuVS1rZL95rcI)の4日目の記事です！

## はじめに
普段**高知県**(テストに出るよ！！！)でメンターをしています、Minecraftコースメンターのけーちゃんと申します！

Minecraftコースのメンターは色んな所にいるのに、普段Minecraftでどうやってプログラミングをしているのか知らない人は結構多いのではないでしょうか？？
そこで、私たちMinecraftコースのメンターが普段どんなことをしているのかざっくりと紹介しようと思います！！

## Minecraftプログラミングコース
今まで散々Minecraftコースと言ってきましたが、正式名称は**Minecraftプログラミングコース**です。
長いのでメンターやメンバーからはマイクラコース・Minecraftコースなどと呼ばれることが多いですね。
この記事でも以降はマイクラコースと呼びます。

## Minecraftって何？
Minecraftは世界で一番売れているゲームとも言われています。
Minecraftでは冒険・建築・農業などをすることができ、本当に自由に遊ぶことができます。自由すぎて逆に何をしたらいいかわからない、という人もいるくらい。
サーバーを立てればマルチプレイをすることもできます☺️

![2023-06-20_0.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629707/a3f8509e-22f0-449b-7335-179cd856f338.png)

もちろん普通に遊んでも楽しいんですが、普通に遊ぶだけだと段々飽きてきたり…><
そこでMinecraftに様々な要素を追加するMODが登場します。
詳しくは マイクラ MOD などと調べてもらえるとわかると思いますが、本当に様々なことができるようになります。

マイクラコースでは、ブロックやアイテム、MOBを追加したり、より便利にプレイできるような機能を追加したり...といったMODを作成しています。

## MODを作る
### 普段どうやってMODを作っているの？
それでは早速本題、どうやってMODを作っているのかに触れていきたいと思います。
折角なので、マイクラコースのメンターやメンバーが普段見ている画面でも見てみましょう。こんな感じです。

![スクリーンショット 2023-11-29 23.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629707/149cdc32-f82e-f5b8-612c-90653e6c76c5.png)

意外かもしれませんが、マイクラコースではこの画像のように沢山のコードを書いています。使用している言語はJavaです。
基本的なプログラミングの知識や、Javaに関する知識、さらにMinecraft特有のコードを理解して書く力が必要になってくるわけです。難しいね！！！！

### MODのアイデアはどうやって考えているの？
アイデアの考え方はいくつかあります。
まず、自分が欲しいと思ったものを作ること。
プレイを便利にするためのものでも、PvPに使うためのブロックでも、とにかく自分があったらいいなぁと思ったものを作っています。
私がこれまでに作ったMODで言うと、ウーパールーパーが大好きなので、虹色に色が変化するゲーミングウーパールーパーなんかを作ったりしました。
かわいいね。🌷

![画面収録 2022-08-21 13.06.35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629707/7cbfc40d-df8a-c704-d8da-5b7694b402ad.gif)

インターネット上では、世界中の人々が作成したMODが配布されています。
YouTubeなどでそういったMODを使っているマイクラ実況を見て、似たようなMODを作ることもあります。

他にも、アニメやゲームに出てくるものを再現してみたりとか。
MOBを捕まえるこういうMODとかね(何とは言いません)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629707/363c5986-6f8b-0017-e127-869412c5d274.png)

### コードはどうやって書いている？
アイデアが思いついても、そのアイデアを実装できるコードを書けないとMODは作れません。
でも、MinacraftのMODの書き方って、インターネットで調べてもあまり出てこないんですよね。
仮に出てきても、日本語の記事なんてほとんどないんです。
じゃあどうやってコードを書いているの？と思う方もいるかもしれません。

マイクラメンターたちは、Minecraft内部のコードを読み解き、これまで得た知識と結びつけてコードを書いています。
内部のコードを読み解くと言いましたが、これも簡単ではありません。
コードの量も膨大だし、1箇所読んだだけでは意味がわからないことなんてよくあること。
それでも根気強く内部のコードを読み、様々なMODを作っています。
慣れてくるとコードを読み解くのも楽しいですし、意味の分かる部分が増えて嬉しくなります🥰

## 最後に
いかがでしたか？
マイクラコースについて、MODについて、少しでも興味を持ってもらえたらとても嬉しいです！ぜひぜひマイクラコースに遊びにきてね！！
以降のアドベントカレンダーでは、MODについての記事を書くメンターも何人かいるみたいなのでそちらもお楽しみに！！

こういう記事を書くのは初めてだったけど楽しかった〜！！！またやりたいな☺️
useLayoutEffect使ってみた！！

## はじめに
React Hooksの中には`useLayoutEffect`がある。らしい。。。触ったことがなかったので、理解するために記事にしていきます。

## useLayoutEffectって何？？
公式ドキュメントを読んでみる。
![スクリーンショット 2023-12-03 18.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/4d038b65-9325-47bb-2e42-13248ccf6c3c.png)
パフォーマンスに影響出るから、useEffectを優先して使ってとのこと。

・パフォーマンス的に影響があるらしい。
・ブラウザが画面を再描画する前に発火するuseEffectのバージョンです。

→同期的にやっているのかな？？

https://react.dev/reference/react/useLayoutEffect

## 実装と挙動
いいサンプルがなかったので、zennの乗っていた記事を参考にさせてもらいました。

useEffectは0→100なのでチラつきが見えます。ただ、useLayoutEffectではチラつきがないです。

![random.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/2ddf28e4-33f5-41dc-6643-886a054e602e.gif)


```tsx
import React, { useEffect, useLayoutEffect, useState } from 'react';

function App() {

  return (
    <>
      <EffectExample />
      <LayoutEffectExample />
      </>
  );
}

export default App;


function EffectExample() {
  const [count, setCount] = useState(0);
  const onClickZero = () => setCount(0);
 
  useEffect(() => {
    if (count === 0) setCount(100)
  }, [count])

   return (
     <div>
       <p>useEffect実行：{count}</p>
       <button onClick={onClickZero}>0にする</button>
     </div>
   );
}


function LayoutEffectExample() {
  const [count, setCount] = useState(0);
  const onClickZero = () => setCount(0);
 
   useLayoutEffect(() => {
    if (count === 0) setCount(100)
   }, [count])

   return (
     <div>
       <p>useLayoutEffect実行：{count}</p>
       <button onClick={onClickZero}>0にする</button>
     </div>
   );
}

```


## 参考文献
https://react.dev/reference/react/useLayoutEffect

https://zenn.dev/reds/articles/496a3624edb3b9
stringが使えないと思ったらインクルードパスの設定が間違ってた話

# 環境

Macです

# 何があったか

``` cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    cout << s << '\n';
}
```

(例えば)これを書いて、以下のエラーが出ました。
```
error: aggregate 'std::string s' has incomplete type and cannot be defined
   5 |                 string s; cin >> s;
```

# 修正方法

これ、実は、<code>bits/stdc++.h</code>の中にあった<code>string</code>と<code>atcoder/string</code>が競合していたことによるエラーです。

まず、<code>open ~</code>を実行し、Finderで隠しファイルも表示させます。そして、.zshrcを修正します。
最初、自分は以下のようになってました。

```
export PATH="/usr/local/sbin:$PATH"
# Python3
export PATH="/usr/local/bin:$PATH"
alias python="python3"
alias pip="pip3"
# ac-library
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/　非　公　開　/includes/"
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/　非　公　開　/includes/atcoder/"
# boost
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/opt/homebrew/opt/boost@1.83/include/"
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/opt/homebrew/opt/boost@1.83/include/boost/"
```

これの
```
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/　非　公　開　/includes/atcoder/"
```
の行を削除します。この行があったことにより、atcoder内のヘッダ(dsu.hppなど)がatcoder/をつけずにインクルードできるようになっていました。さらに、CPLUS_INCLUDE_PATH内の優先順位がstringよりatcoder/stringの方が先に見つかるようになっていたので、bits/stdc++.hをインクルードしたときにstringではなくatcoder/stringがインクルードされていました。
Amazon Inspector の Amazon EC2 向けエージェントレス脆弱性評価

# 概要

- 今まで
SSM エージェントをインストールして EC2 インスタンスを評価

- 新機能
SSM エージェントがインストールされていない EC2 インスタンスに対しても Inspector エージェントレススキャンを行うことでができる。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-inspector-agentless-assessments-ec2-preview/


# 設定

- ハイブリッドスキャンモードを選択するだけで、エージェントレススキャンを有効にできる。


# スキャンの仕組み

- Inspector が EBS ボリュームのスナップショットを取得し、インスタンスからソフトウェアアプリケーションインベントリを収集し、脆弱性評価を実行する。

- SSM エージェントがインストールされている EC2 インスタンスについては今まで通り、エージェントベースのスキャンが行われる。
  
- SSMエージェントがインストールされていない　EC2 インスタンスについては自動的にエージェントレススキャンが行われる。


# やってみた

※ バージニア北部で行っています。

Inspector > 設定 > EC2 scanning settings より 「ハイブリッド」　を選択するだけです。

![スクリーンショット 2023-12-03 17.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/09a46364-8aec-a74b-86d8-2f7e3837422a.png)

EC2 インスタンスは、RHEL_8 を起動しておきました。

Inspector > 設定 > アカウント管理 > インスタンス より実行結果を確認してみると、`Agentless` で動作していることが確認できました。

![スクリーンショット 2023-12-03 18.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0d7b0898-4253-7b1a-f8ac-08b7c18a91aa.png)
文系出身エンジニアのこれまでの振り返り

# はじめに
本記事は、[集まれ文系エンジニア！ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/liberal-arts-engineer)の3日目の記事となります。
なんか面白そうなAdvent Calendarだったので、参加させていただきます。
私自身、文系出身のエンジニアで、これまでの振り返り記事とか書いたことが無かったので、いいタイミングかなと思い、書いていこうと思います。

# 経歴
私の経歴は、「 **普通科高等学校卒業→経営学部の大学を卒業→人材派遣会社の営業職→人材派遣会社のインフラエンジニア→クラウドに特化したSIer→金融系の情報システム部** 」という経歴で、純度100%の文系出身エンジニアです✿
文系大学を出た後、人材派遣会社の営業職に就職したが、労働量/疲労に給料が見合っていないと感じ、エンジニアに転身し、今に至ります。

# 仕事内容
今までやってきた仕事は、主にインフラエンジニアです。
サーバの構築～運用であったり、AWSクラウド関連の各種作業を中心に行ってきました。
具体的にいうとこんな感じです。(ぱっと思いついたやつを書いてます)

■オンプレタスク

- Oracle Databaseの環境構築～運用保守
- 監視ツールZabbixの導入対応～運用保守
- VMware ESXiの導入対応
- Windows環境でのWEBアプリケーションの構築
- Linux環境でのWEBアプリケーションの構築

■AWSタスク

- CloudFormationを用いた環境構築の自動化対応
- コスト削減対応
- オンプレ⇆AWSの通信設定
- AWS Network Firewallを用いたセキュリティ設定

■その他タスク

- Datadogの導入対応
- NewRelicの導入対応

など

オンプレ2年、AWS(他クラウド含む)4年ぐらいの経歴です。
運用保守の経験が多いので、環境構築する際は、運用ができるだけ楽できる設計を意識してます。


# 資格
次に、資格について書いていこうと思います。
AWS資格は、一応12個全てコンプリートしてます。
詳細については、下記の記事で書いていますので、興味がある方がいれば～

https://qiita.com/yes_dog/items/f47f99ca0c492c5e6d5c

その他にも、LPIC1やOracleDatabaseBronzeなども持ってます。

# 技術好きを強要する風習について
話が変わりますが、新規参入者向けに、この業界で気を付けるべきことについても書いていこうと思います。
この業界にいると、「 **技術が好きではないと続けられない** 」と言う方が一定数いますが、私は全然技術が好きではないです。
必要な知識を日々勉強してはいますが、「業務で必要だから勉強している＋自身の市場価値を高めるために勉強している」にすぎません。
なので、新規で文系職種からエンジニアに転身を考えている方は、**技術が好きは必須ではない**と思っていただいて大丈夫です。あくまで、技術を好きになった人の方がこの業界に長くいれる可能性が高いという意味なので。。。
この業界は、心を傷つけられる機会が多かったり、胃がキリキリとしてしまう場面が多かったりするので、離職率は他の業界と比べると多いかなという印象です。なので、先人たちは「技術を好きになったほうがいい」と言っています。もちろん、技術が好きであれば、趣味と称して勉強したりすることもできるので、その方が伸びやすいという意味もあります。
技術が好きになるのが望ましいのであって、好きじゃないと続けられないは断じて違います。
今の時代、色々な人が自由に情報発信できる時代なので、たくさんの情報が飛び交っており、中には個人的主観をあたかも正の情報のように発信される方もいらっしゃいます。
なので、「エンジニアを目指している」or「エンジニアになり立て」の方は、全ての情報を鵜呑みにするのでなく、自身に適切な情報のみを取り込むようにしましょう。
(特にエンジニア界隈には、変人/変わり者が多くいますので)

# 新しく入ってくる文系エンジニアにむけて

文系未経験の人がこの業界に入り、心をつぶされてしまって退陣する人をたくさん見てきました。
なので、私から今後参入する未経験の文系エンジニアに以下の3点の言葉を贈らせていただきたいと思います。

- ①他人と比べすぎない
- ②怒られた内容をいつまでを引きずらない　※寝て、次の日にはリセットする。
- ③ストレス発散手段を見つける

今、この業界はどこも人手不足なので、入っていただいた方には長く続けてくれることを切に願っております。
ストレスをため込みすぎずに適度に発散して、長く働いてくれたら幸いです。
Bye～
複雑なDeepLinkをJetpackComposeで実装するPart4

# はじめに
今回は、複雑なDeepLinkが来たときやDeepLinkの内容によってホーム画面で出しわけないといけない時の実装を紹介していきます

### 本文
最後はMainNavGraphの実装です。
```kotlin:MainNavGraph
@Composable
fun MainNavGraph(
    navController: NavHostController,
    // sealdClassでどの画面に遷移するのかを引数でもらいます
    navigateScreenType: NavigateScreenType,
) {
// 何もNavGraphをセットしてない状態でゲットを呼ぶとExceptionが帰ってくるので、その時は何もリンクがなかったとしてホーム画面を表示するのみにします
    val startDestination = try {
    // ホーム画面で表示するダイアログ等がDeepLinkにあるときはNavGraph自体を更新しないとホーム画面に変更が通知されないので強制的にNavGraphを変更します
        if (navController.graph.startDestinationRoute == BottomBarNav.homeRoot) {
            when (navigateScreenType) {
                NavigateScreenType.HogeLink, -> {
                    DeepLinkNav.hogeRoot
                }
                NavigateScreenType.fugaLink -> {
                    DeepLinkNav.FugaRoot
                }
                else -> {
                    BottomBarNav.homeRoot
                }
            }
        } else {
            BottomBarNav.homeRoot
        }
    } catch (e: Exception) {
        BottomBarNav.homeRoot
    }
    NavHost(
        navController = navController,
        startDestination = startDestination,
        modifier = modifier
    ) {
    // 最後にネストナビゲーションをNavHostに登録します
        homeNavGraph(navController, navigateScreenType)
        hogeNavGraph(navController, navigateScreenType)
        fugaNavGraph(navController, navigateScreenType)
    }
}
```
これで、ホームViewで各種遷移処理を実装すれば問題なく表示できると思います
### 最後に
今回でが最終パートになります
１つの記事で書くには大きい内容だったのでいくつかパート分けになってしまい読みづらい点はあるかと思いますが、どなたかのお役に立てれば幸いです
【Android】Bluetoothについてのメモ

#
Android Bluetooth API を介した Bluetooth 機能へのアクセスが可能で、
Androidでは他のBluetooth端末とワイヤレスでデータの交換ができます。
具体的にできることは以下です。


* 他の Bluetooth 端末をスキャンする
* ペア設定された Bluetooth 端末のローカル Bluetooth アダプタを問い合わせる
* RFCOMM チャンネルを確立する
* Service Discovery を使用して他の端末に接続する
* 他の端末とデータを送受信する
* 複数の接続を管理する


# Permission
開発の中でBluetoothを使用するには　パーミッションの許可が必要で
AndroidManifestに

```
  <uses-permission android:name="android.permission.BLUETOOTH" />
　　　　<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
　　　　<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  ```

  この三つを追加する必要があります。

  一つ目の**BLUETOOTH**　はBluetooth通信を実行するために必要。(接続のリクエスト、接続の受け入れ、データの転送など)
  2つ目の**ACCESS_FINE_LOCATION** はユーザーの位置に関する情報についてのパーミッションで
端末から、そして店舗や施設などの場所で使用される場合があります。
（Android バージョン9以下の場合は　**ACCESS_FINE_LOCATION**の代わりに**ACCESS_COARSE_LOCATION **を使います。）
三つ目の** BLUETOOTH_ADMIN**は、アプリ内からBluetoothの設定を操作したりする場合に必要です。


以上の準備をしたのちに　端末の検知には**BluetoothAdapter**というものを利用するようなので、次回以降に記事にできたらと思います。

# 参考

https://developer.android.com/reference/android/bluetooth/BluetoothAdapter


https://developer.android.com/guide/topics/connectivity/bluetooth?hl=ja
メロンの皮の呪いを見てみた（多変量）

・　ガウス分布（正規分布）
・　中心に観測点が多いイメージ（低次元）
・　高次元のガウス分布になるとメロンの皮みたいになる





### 次元の呪い

機械学習では「次元の呪い」と呼ばれるものがあって、高次元になると、データが奇妙な振る舞いをしたり、扱いが難しくなったりするらしいんです。でも、わたしは３次元空間に住む、３次元の人なので、高次元のことは目で見ることができませんし、頭の中で想像するのも難しいですよね。
<br>




自分がふだん、研究の解析で扱うのは（次元削減して）３－４次元くらいにしてます。理由はいろいろあって、現実の小規模データを扱うことが多いので、たとえば、気温が変われば条件が変わる、ロットが変われば条件が変わる、でもなんとかしたい、となると、変数が少なめで「あ、ここかな？」っと思うあたりを調節するとなんとかなる、というニーズも結構あります。
<br>

### メロンの皮とは

高次元のデータの性質の一つに、「メロンの皮」というのがあります。ふだん、真ん中らへんが多い印象のガウス分布ですが、多変量のガウス分布で、次元がたくさんになってくると、中心からの距離が大きくなってくるんですね

<br>

言われてみれば、100個もある、全部の変数がみんな真ん中あたりの観測点なんて、そもそも確率から考えて起こりにくいですよね。
そこで、どんな風になるのかと思って、ちょっとGIFアニメ、作ってみました。
<br>

<img width="480" alt="animation of histogram" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/4f2d0d55-294e-c157-4cae-a56703566c4e.gif">


<br>
<br>

こちらは、多次元ガウス分布の観測点1000個を、変数の数を変えて、10個とか、100個とか、1000個とか作ったときの、原点からの距離をまとめたものです。ヒストグラムが、右へ動いているのがわかります。次元が増えると、どんどん中心（＝原点）から離れていくんですねー
<br>

<img width="480" alt="animation of a growing circle that shows distance from the origin" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/f4746914-fa16-df6c-2fc0-fcf9219be0ba.gif">


<br>

上手いこと円の上の観測点が乗っているイメージを作るのに、どうしようかな、と思って調べてみて、ベクトルとベクトルの角度を出してみたんですが、なんか意外と全然狭かったので、-pi から piに無理やり広げて、あたかも円の上に乗っているようにしてみました。

まるで、メロンの皮みたいにうすいですね


<br>

もちろん、各観測点は、実際には、10 20 100とかの多次元空間の（超）球にごろごろ分布しているはずで、中心からの距離が遠くなるって言っても、そもそもそれがイメージできないので、円で描いてみました。

<br>

異常検知で、ホテリング統計量と言って、分布の中心から観測点までの距離を求めたりすることがありますが、低次元ではそういう方法が使えるけど、高次元では中心がスカスカになってくるので、それが使えなくなってくるんですかね。

なので、マスクメロンの網目みたいに、球面上での位置関係のほうが重要になってくるという　

網目の頂点が観測点のイメージですね（3次元のマスクメロンの場合）

<br>

<img width="480" alt="multi gaussian distribution" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/883cbb61-0534-0df9-4253-33ab581f1125.png">


今回は、上の例のように互いに独立した多次元ガウス分布で作りましたが、次回は、変数同志に相関がある場合の「メロンの皮」も、見てみます！
<br>
<a href = "https://qiita.com/emikosh/items/be6a1b02fdc3f8293d69">次回「デコポンの皮の呪い」へ</a>
<br>
<br>
fly.ioのPostgreSQLに外部から接続する方法

無料のデータベースとしてrender.comのPostgreSQLを使用していました。しかし、[render.comの無料枠](https://render.com/docs/free#90-day-limit)だと90日経過するとデータベースが削除されてしまうという問題点があります。そこで、fly.ioのPostgreSQLを使用することにしました。ただ、fly.ioのPostgreSQLに外部から接続するには以下の通りIPv4の割り当てを行う必要がありますが、IPv4の割り当てには**2ドル/月**かかりますのでご注意ください。

# PostgreSQLの作成
以下のコマンドを実行しデータベースを作成します。
```
fly postgres create
```
アプリ名として「? Choose an app name (leave blank to generate one):」という質問が出てきますがここでは「example」という名前を設定したとして説明していきます。
作成が完了するとusernameやpasswordが表示されますのでメモしておきます。

# IPv4の割り当てなど
IPv4を割り当てます。このとき、「月2ドルかかりますが良いですか？」というような質問が出てきますが、Yesと答えます。
```
fly ips allocate-v4 --app example
```
IPv6を割り当てます。
```
fly ips allocate-v6 --app example
```
そして、以下のコマンドを実行するとfly.tomlが作成されます。
```
fly config save --app example
```
fly.tomlがあることを確認して、以下のコマンドを実行します。
ここでは、バージョン14を指定します。
```
fly deploy . --app example --image flyio/postgres:14
```
以上で外部から接続可能となります。

:::note info
公式ドキュメントではconnection stringは以下のとおりであると説明されています。
```
postgres://{username}:{password}@{hostname}:{port}/{database}?options
```
usernameとpasswordは先ほどメモしたとおりのものです。hostnameはここでは「example.fly.dev」となります。自分の場合は{database}に該当する部分がありませんでした。私は{database}に相当する部分をPOSTGRES_DBという環境変数を用いていましたが、POSTGRES_DB=''という指定をしました。しかし、これではうまくいきませんでした。そこで、コードにおいて、データベース名の指定自体を削除することでうまく接続できました。
:::

# 参考
https://fly.io/docs/postgres/getting-started/create-pg-cluster/

https://fly.io/docs/postgres/connecting/connecting-external/
【メモ】Laravelでuseを利用したインポートがうまくいかなかった件

## 概要
- use 文は正しいはずが、あるはずのクラスがないと怒られた。
- 引数なしのindex()メソッドの場合は正常に動いた。
- ファイル名のタイポが原因であった。

## 詳細
```sh:エラーメッセージ
ReflectionException: Class "App\Http\Requests\StoreCardFormatRequest" does not exist in file /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ResolvesRouteDependencies.php on line 81
```
要は、**StoreCardFormatRequest**というクラスがないと怒られている。

useなどに関しては、問題ないと判断し下記コマンドを実行したところskipしたと警告が発生した。
```sh:コマンド
dump-autoload

Generating optimized autoload files
Class App\Http\Requests\StoreCardFormatRequest located in ./app/Http/Requests/StorCardFormatRequest.php does not comply with psr-4 autoloading standard. Skipping.
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
```
エラー内容についてChatGPTに確認したところ
>エラーメッセージによれば、StoreCardFormatRequest クラスのファイル名がPSR-4のオートローディング規約に違反しています。PSR-4は、クラス名とファイル名が一致していることを要求します。この場合、ファイル名が StorCardFormatRequest.php となっており、e が抜けているためにクラスが見つからないというエラーが出ています。

とのことであった。
実際に確認したところ、ファイル名のタイポを修正し忘れていた。

タイポを修正したところ実際に稼働するようになった。

## まとめ
Laravelはワンコマンドでファイルの作成やクラスの外枠を創れる半面、タイポの修正には注意が必要であると感じた。ひとまず同じようなエラーが発生したときは、オート―ディングを試してみようと感じた。
Uターンから始めたJAWS-UG地域支部

# 概要
昨年までは専門支部(Media-JAWS)への一般参加がメインだったが、
今年関東から地元にUターンしたのを機に
運営側として地域支部であるJAWS-UG TOHOKUへの参加や
積極的に各種JAWS-UGへの参加をするようになった。
似たような境遇の方への参考になればと記事としてまとめる。

# Uターンの経緯
岩手で生まれ、就職で関東に出てきて15年ほど働く。
元々地元でITの仕事をしたかったのですがスキルや知識もなく、
また地方での案件は限られていたので一度東京で実績を積み地元に帰れたらなと学生の頃から考えていた。
予定より少し遅くなった感はあるが、
2023年03月に地元にUターンで転職することができた。

# 運営として地域支部への参加
地元へのUターンを機に下記の思いを抱き東北の運営に加わった。
・東北、岩手のエンジニアの輪を盛り上げたい
・知り合いを増やしたい
・おいしいお酒を飲みたい

また、仙台を中心とした活動だけではなく、
休眠していたいわて支部をリブートし盛岡でのオフライン開催を行うことができた。

# おもな今期の活動内容

## JAWS-UGいわて 2023 第1回
いわてリブート初回。県内外から15名参加。
EC2 + RDSを使ったハンズオンを実施。

ハンズオンのやり方は手順を公開して各自のペースで取り組んでもらったが、
講師を用意し参加者と手順を共有するやり方をとった方がよかったと反省。

ただ、リブート初回で人が集まったのと、
オフラインイベントをやり切ったのが何よりも収穫。

## JAWS-UG 東北 〜東北エンジニアの祭典〜
秋田での開催。36名参加。
各種LTがメインの大型オフラインイベント。
若松さんのおかげで東北外からも多くの人があつまった。
また来年も秋田で開催したい。
このイベントのおかげで多くの知り合いができた。

当日他イベント(フェス)と重なり、ホテル難民が。
地方のイベントは特にホテルの確保が課題と認識。

## JAWS-UGいわて 特別編 Media-JAWSコラボ LT会
盛岡での開催。29名の参加。
4マスと呼ばれたメディア系にフォーカスした回。
Media-JAWSの三浦さん、加我さんの協力のもと
地方の事例と全国の事例でうまくコラボができたと思う。

地方の人にとっては専門支部とコラボして特化したイベント開催も需要ありそうな気がした。

## JAWS-UG TOHOKU サーバレスハンズオン 勉強会
仙台での開催。17名での参加。
Step Functinsのハンズオンを実施。
また、福井さんをお招きしサーバーレスの講義もしていただく。

前回のハンズオンの反省も踏まえ、参加者と同時に作業を進める形式に変更。
前回よりうまく進めることができたが、講師も専門の方用意した方がわかりやすくていいのではと思った。

# 地域支部の運営をして感じたこと
・地域支部は特にオフライン開催で交流を深めるのが大事だと実感。
　→地元の人は地元の知り合いを作るきっかけになる。県外の人は旅行感覚で参加することができる。

・地方の人はなかなか東京に行ってイベント参加するのは難しいので、
　県外の有名な人やAWSのSAさんをうまく連れてきて登壇してもらうとよい。
　→地方にいながら、新しい情報を仕入れできる環境作ることも地域支部の役目かと。

・コミュニティ活動する際はFaceBook、Xのアカウントは必須。
　→交流は単発で終わらず、継続できるのが大事。

・有料の会場を使う場合は会場スポンサー枠を募るのもあり。
　→割り勘でワンコインならいけるが、それ以上になってくると。。。

・懇親会の会場手配は気を遣う。
　→ドタキャンのキャンセル料どうしよう。。。

・沼口さんを巻き込めばハンズオンも気軽にできる。バウチャーの手配、講師(SA)さんの手配。
　→初心者のきっかけづくりにはハンズオンが良さそう。

・イベントの写真は大事
　→最初は運営することで手いっぱいだったが、徐々に写真を残す余裕も生まれてきた。

・地方開催は他のイベントと被ってないことを確認。
　→ホテルの争奪戦になっちゃう。覚悟の上で地方のお祭り系イベントと同時開催にするのはありかも。

・ITにとらわれず趣味(サッカー、サウナ、キャンプなど)の知り合いが増えた
　→懇親会の交流は大事。

# 来期取り組みたいこと
・東北外のイベントにも積極的に参加したい
・特にいわての運営メンバーを増やしていきたい
・今年開催していない、青森、山形でイベント開催したい
【ROS2/CNN】からあげ先生が作ったAIルンバをROS2で動かしてみた

# はじめに
この記事は、からあげ帝国アドベントカレンダー4日目の記事です。

https://qiita.com/advent-calendar/2023/karaage

4日目にして初Qiita投稿ぽいので、からあげ帝国についての情報を貼っておきます。
[からあげ先生](https://twitter.com/karaage0703)を中心としたコミュニティです。 (食べ物のから揚げが好きな人が集まっているわけではないです。多分。でもからあげにレモンをかけることをほのめかすと怖いです。)

https://karaage.hatenadiary.jp/entry/2022/11/30/073000


https://karaage.hatenadiary.jp/entry/2023_karaage_ac


# 何をしたか
以下の本で紹介されているAIルンバ (CNNを使用した画像認識で自動走行するルンバ)をROSで動かせるようにしました。

https://karaage.hatenadiary.jp/entry/2020/12/11/073000

作ってみたものの動く様子は以下です。

https://x.com/ko1_baseba11/status/1731231047097229349?s=20

ソフトウェアは以下で公開しています。

https://github.com/koichirokato/motion_by_cnn


# 流れ
以下の流れで最終的にロボットをCNNで動かします。

1. 環境の用意
1. データ収集
1. モデル作成
1. 予測＆ロボットの動作

## 環境の用意
ROS2を使用します。カメラ付きの移動ロボットまたは何かしたのシミュレーション環境を用意してください。今回はTurlebot3のシミュレーション環境の前提で説明します。

```
cd ~/ros2_ws/src
git clone https://github.com/koichirokato/motion_by_cnn
cd ~/ros2_ws
colcon build --symlink-install --packages-select motion_by_cnn
```

## データ収集
今回はTurtleBot3のHomeという環境を使います。

https://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/

### Gazeboの立ち上げ

```bash
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
```

### 操作用ノードの立ち上げ

```bash
ros2 run turtlebot3_teleop teleop_keyboard
```

### 画像収集用ノードの立ち上げ

```bash
ros2 run motion_by_cnn save_images.py --ros-args -r /image:=/camera/image_raw
```

画像収集用ノードは、ロボットのカメラからのデータを2秒ずつ画像ファイルとして保存します。上限はソースコード内で100枚としています。
適当にロボットを操作してデータを集めましょう。


## モデル作成(学習)
集めたデータをgo,stopでラベリングしましょう。画像データをそれぞれのフォルダに割り振ります。
ロボットが進めそうな場合はgoとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/55c911a8-5925-0fc0-7417-f8c8f3e8fcd5.png)

それに対してロボットが止まるべき場合はstopとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/a7e23fbf-9c3c-d742-16cb-78cef6b2f51b.png)


ラベリング済みの画像データをもとに、まさにからあげ先生の書籍にある通りにCNNの分類器を作成しました。
書籍内では以下のようにじゃんけんの判断でもCNNが使われていました。

https://www.taketoketa.com/entry/2021/03/31/173010

書籍を購入していない方向けですと、以下のような画像分類のモデルを作成します。

https://di-acc2.com/programming/python/10378/

# 予測＆ロボットの動作
分類器の作成が完了したのちに、
model.h5ファイルと、labels.txtファイルをROSノードを実行するディレクトリにおいて以下を実行すると最初に見せた動画のようにカメラ画像のウィンドウが立ち上がってロボットが動き始めます。

### Gazeboの立ち上げ

```bash
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
```

### 画像認識&ロボットの動作用ノードの立ち上げ

```
ros2 run motion_by_cnn move_by_cnn.py --ros-args -r /image:=/camera/image_raw
```

# 最後に
終わりです。ルンバはもっていないですが実機でも動かしてみたいですね。

# 参考

https://www.amazon.co.jp/exec/obidos/ASIN/4296108409/karaage0703-22/
超小型ゲーム機 Thumby を手持ちのパーツで再現してみた：その①

# Thumby について

少し前に一部で話題になったゲーム機に [Thumby](https://thumby.us/)というものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/e8de51c5-a220-2d31-8c0e-5a30e04e84c5.png)

[TinyCircuits](https://tinycircuits.com/)という小さな機器ばかり出している会社が、遊べるキーホルダーとして[クラウドファウンディング](https://www.kickstarter.com/projects/kenburns/thumby-the-tiny-playable-keychain)で資金調達。目標額200万円程度であったところを3000万円ほど調達して、製品化しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/bdb67b98-934d-9257-773e-0e914b20fc0d.png)

ゲーム機としての実用的かはともかく、実際にゲームがいくつか搭載されていて遊べるようになっています。

それにしても、こんな安い目標額で製品を出せるとは、それなりに低コストで作れるものであろうと、ちょっと調べてみました。

# ハードウェア

[Raspberry Pi Pico](https://www.raspberrypi.com/products/raspberry-pi-pico/)と同じマイクロコントローラ RP2040 を搭載ています。

回路図は[ここ](https://github.com/TinyCircuits/ASM4008-TinyCircuits-Thumby/blob/main/design_files/ASM4008-Rev5.pdf)から入手できます。

![スクリーンショット 2023-12-03 18.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/f8c33632-df33-01b0-74ea-266c14d7c7bc.png)

思ったとおり、比較的単純な回路で、大部分は RP2040 にボタンスイッチ、 OLED ディスプレイ、圧電スピーカーが繋がっただけのようなものです。

# ソフトウェア

ソフトウェア開発環境は[ Web で提供](https://code.thumby.us/)されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/eafe1887-f3d7-acc1-1d0d-9d2571a1d5ed.png)

シミュレータも搭載された結構本格的な開発環境です。開発言語は MicroPython で、ゲーム開発用APIも MicroPython で提供されています。

同環境には投稿作品をダウンロードする仕組みもあって、バンドルされているゲーム以外のものもダウンロードしてきて遊べます。（私はこの作品群を見ていて、SSD1306 OLED でグレイ色を表示する裏技を知りました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/608a10a8-cf83-3a38-d56c-dd2c9aa59297.png)

ブロックプログラミングもできるので、TinyCircuits社はプログラミング教育用としても Thumby をプッシュしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/b46420a9-6c46-f66a-cbe9-890a918e1962.png)


そして、開発環境のコードはAPIも含めて[GitHubで公開](https://github.com/TinyCircuits/TinyCircuits-Thumby-Code-Editor)されています。

# ここからが本題

ここまで調べてみて、これは手持ちのパーツで Thumby を再現できそうだなと思い、実践してみました。ですが、続きは[次回](https://qiita.com/inachi/items/3c3c7e599127815b48e9)で。
SidekiqをActiveJob経由で使うべきか

実務でRailsアプリケーションを扱っており、非同期処理の実装でSidekiqを扱うことになりました。
Sidekiqを直接扱うパターンとActiveJob経由で扱うパターンの2通りあることを知ったため、それぞれのメリット/デメリットを調査しました。


## 参考にした記事
本記事を書くにあたり以下の記事を参考にさせていただきました。

https://techracho.bpsinc.jp/hachi8833/2023_03_06/127675

## はじめに
RailsアプリケーションへのSidekiqの導入手順は割愛します。
まず、Sidekiqを直接扱うパターンとは、以下のようにSidekiq:Workerモジュールを直接includeしたジョブクラスを定義した実装を指します。

```ruby
class BackgroundJob
  include Sidekiq::Worker
  Sidekiq_options queue: "default"

  def perform(id)
    # 非同期実行したい内容
  end
end
```

一方で、ActiveJob経由で扱うパターンとは、以下のようにApplicationJobを継承したジョブクラスを定義する実装を指します。

```ruby
class BackgroundJob < ApplicationJob
  queue_as :default

  def perform(an_active_record_object)
    # 非同期実行したい内容
  end
end
```


## メリット/デメリット比較
| |Sidekiqを直接扱う  |ActiveJob経由で扱う  |
|---|---|---|
| **メリット**  |・高パフォーマンス<br/>・Sidekiq固有機能が利用可  |・引数にオブジェクトを指定可能<br/>・他のキューイングへの移行コスト小|
|**デメリット**  |・引数にオブジェクトを指定不可<br/>・他のキューイングへの移行コスト大<br />  |・Sidekiqの固有機能を使えない<br/>  |

比較ポイントとしては大きく3点です。

### 1. パフォーマンス面
[ActiveJobの公式ドキュメント](https://github.com/sidekiq/sidekiq/wiki/Active-Job#performance)によると、ActiveJobを介さずSidekiq等のキューイングをそのまま使用する場合、ジョブをRedisにpushする速度が2~20倍向上するとされています。

またSidekiqには[バルクキューイング](https://github.com/sidekiq/sidekiq/wiki/Bulk-Queueing)という、同じジョブ大量に実行したい場合に効率的にキューイングできる仕組みもあります。ActiveJob経由で利用する場合はこうしたSidekiq固有の仕組みも利用できなくなります。

### 2. 引数の自由度
[公式ドキュメント](https://github.com/sidekiq/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple)によると、Sidekiqに渡せる引数は 文字列、整数、浮動小数点数、真偽値、null（nil）、配列、およびハッシュとされており、オブジェクトを渡すことはできません。
そのため、ジョブの中で特定のActiveRecordオブジェクトに対する処理を実施したい場合は、以下のように引数でそのオブジェクトのIDを渡してジョブの中で検索をしてやる必要があります。

```ruby
class BackGroundJob
  include Sidekiq::Worker

  def perform(user_id)
    user = User.find(user_id)
    user.do_hoge
  end
end
```

一方でActiveJobはGlobalIDという仕組みをサポートしているため、以下のように引数にActiveRecordオブジェクトを直接指定することができます。

```ruby
class BackGroundJob < ApplicationJob
  def perform(user)
    user.do_hoge
  end
end
```



### 3. 他のキューイング(Shoryuken, Delayed_job等)への移行コスト
Sidekiqを直接扱う場合は、ジョブクラスにSidekiq固有のコードを書いていくことになるため、他のキューイングへの移行時のコストが大きくなります。一方でActiveJob経由の場合は、バックエンドのキューイングに関わらずコードは同じになるため、他のキューイングへの移行は行いやすくなります。ただし、キューイングを切り替えることはそこまで頻繁には起きないと考えられるため、そこまでメリット(デメリット)にはならないかと考えています。



## 最後に
上記の参考記事では、SidekiqかActiveJobかの二者択一ではなく共存させるのも一つの方法だと述べられています。私もこの考えに賛成です。

ハイパフォーマンスが求められるジョブやバルクキューイング等のSidekiq固有機能を利用したい場合は直接利用、ハイパフォーマンスは求められず引数にオブジェクトを指定したほうが実装がシンプルになる場合はActiveJob経由、のように使い分けられるとよいかと思います。
【Resonite】基本操作

# 基本操作
VRSNS「Resonite」の基本操作を確認するためのメモ書きです。

| 操作     | 説明   | 動画 |
|----------|--------|----------------|
| プライマリ| ・ボタンを押す<br>・アイテムに作用する | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/b90dc04a-5651-550f-86fa-a9a237025384.gif" width="400"> |
| セカンダリ|・ジャンプ(Index以外)<br>・特定のアイテムを装備してる時は専用の動作 |![セカンダリ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/0c9b8b9f-e157-fac0-69a0-7d59978c31b0.gif)|
| グラブ | ・アイテムを持つ|![グラブ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/d06651b0-7bf5-775f-6b54-aaa6a38671f9.gif)|
| コンテキストメニュー| ・移動方法変更などのメニューを表示<br>・特定のアイテムを装備してる時は専用のメニューが追加で表示<br>※リングメニューと呼ばれることもある|![コンテキストメニュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/a8a45fa6-e264-6d02-6a6c-3960212c04d4.gif)|
| ダッシュメニュー | インベントリや設定などのメニューを表示<br>※ダッシュメニューは他人に見えない|![ダッシュメニュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/6dae534c-89fe-1b77-1ded-a1e3befa6bdf.gif)|

#### 各コントーラーの対応
<details>
<summary>Oculus</summary>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/1b0b1bbf-f90c-70b6-f0d8-a4703dc2ef91.png" width="700">

</details>

<details>
<summary>Index</summary>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/4b5cf3c6-2096-4131-6bde-f7065fc85306.png" alt="Panel_Controller_Index" width="700">
</details>

<details>
<summary>VIVE</summary>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/b932bc87-30ab-59c9-941a-8d520ef6216e.png" width="700">
</details>

<details>
<summary>WinMR</summary>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507262/33b4fb4b-3c2f-78ba-9374-6f61e37b5900.png" width="700">

</details>

<details>
<summary>デスクトップ（キーボード）の操作</summary>

| 操作     | 割り当て   |
|----------|------------|
| プライマリー | 左クリック |
| セカンダリー | Rキー      |
| グラブ       | 右クリック |
| コンテキストメニュー | Tキー またはホイールクリック |
| ダッシュメニュー | Escキー  |

</details>

# その他
 - より詳しい操作を知りたい方
https://wiki.resonite.love/035415610b4b4700859a169e38cfa789

 - この記事について
    この記事は「Resonite Advent Calendar 2023（その２）」の３日目の記事として書かれました。
    https://adventar.org/calendars/9005
第一世代　起動音変更

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の6日目です。

:::note
業務外の個人的な検討活動です。
:::

ers-11xは起動中に「ピロリン、ピロリン」といった機械的な音が繰り返し生成されます。
一方でAiboPet's AiboHack SiteにあるBender Aiboは何やら英語をはなしつつバウバウ言っています。
https://www.aibohack.com/111/index.html

ここではメモリースティックに入っているデータを比較して、起動音を変更してみました。

#### メモリースティックの内容を確認
下記の場所にあるBOOT.wavを再生してみると、起動中の音声でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/bbdc94ea-d1b3-87d4-9d14-30d37e0ba075.png)


#### 音声を作成
今回はVOICEVOXのずんだもんに「ナウローディング」と言ってもらいました。
https://voicevox.hiroshiba.jp/

:::note alert
警告
この記事について作者はいかなる責任も負いません。
置き換えるファイルはバックアップを取ることをお勧めします。
:::

作成した音声をaudacityを使い、wavファイルに変換し、メモリースティックに入れました。


#### 起動実験
ずんだもんが「ナウローディング」と繰り返し発声しているようになりました。

https://youtu.be/7FVprgCOicw
【AtCoder】 AtCoder Beginner Contest A~C問題の傾向と対策 part2

# はじめに
　この記事では、AtCoder Beginner Contest(以下、ABC)の出題傾向をまとめています。part2では、ABC226~230を、そして今後はABC300までを予定しています。[【AtCoder】 AtCoder Beginner Contest A~C問題の傾向と対策 part1](https://qiita.com/darake/items/dd66663b80f6974cd8a9)の続きです。

 # 対象者
　・これから競技プログラミングを始める人。
　・プログラミングの基礎をある程度学んでいる人。(具体的には、[AtCoder Programming Guide for beginners (APG4b)]("https://atcoder.jp/contests/APG4b")がなんとなく分かる程度)
　・AtCoderのレートが灰色~茶色ぐらいの人。

 # 使い方
　添付資料は 2つ あります。A,B問題とC問題でグラフや資料の内容を変えています。A,B問題はプログラムの基礎、C問題はテーマ別に分類しています。
　1つ目のグラフは、25回のうち、何回出題されたかが分かります。特に これを勉強しようというのが決まっていないなら、参考になる と思います。
　2つ目の資料は、対象の問題を解く為に、どういう知識や考え方が必要なのかをまとめています。これは、問題が解けなかった時、何が分かっていて、何が分かっていないのかを知るために使ってください。 例えば、「この問題はオーバーフローが分かれば解けた。でも解けなかったのは、intは知ってたけどlong longについての充分な知識がなかったからだ。intとlong longで表現できる数値はどれくらい？同じ知識が必要な別問題を解いてみよう。」とすれば、不足知識を定着させることもできると思います。

# 資料
①

![part2_A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/34efbe27-538d-b34d-cbf7-d4b62056989a.jpeg)

![part2_B.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/12058e11-3cca-a019-02d9-85de73fc1a23.jpeg)

![part2_C.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/bd5c1b50-5b35-ec64-28c6-61ccb4df868f.jpeg)

②
![part2_226-235.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/7614b0e4-8e61-c5ec-0a25-8cf878b225c3.jpeg)

![part2_236-245.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/cf1f827e-5690-0b89-a98b-3facf39356bc.jpeg)

![part2_246-250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/15f7ecbd-910b-e600-dd7e-5e745d359ccb.jpeg)
---------------------------------------
　以上になります。