OmniAICreator/Qiita-1.07M huggingface dataset:
【水曜日のダウンタウン】所持金5連続UP企画で適当に声をかけるとどうなるか、手計算で検証してみた

# 概要

詳細は[こちらの記事](https://qiita.com/smaruyama0115/items/ff18f01d853991ca3a0d)を御覧ください.
上記のページでは, シミュレーションを使って, 企画成功までの声掛け人数や, 企画成功率を求めていました.
すごい面白かったので, ぜひご覧ください.

https://qiita.com/smaruyama0115/items/ff18f01d853991ca3a0d

これを読んだ自分は, ｢これ, シミュレーションを使わずに手計算で解けるじゃん｣と思ったので, この記事を書きました.

# 成功確率について

声をかけた人を順番に①②③④⑤とします.
このとき, 5人の所持金の順序が, ①<②<③<④<⑤になる率が成功確率となります.
所持金が同率にならないと仮定すると, 5人の順序のパターンは5!=120通りあるので
```math
p_{成功}=\frac{1}{5!}\simeq 0.833 \%
```
となります.
元記事の成功確率が84%なので, 概ね正しい結果が得られました.

# 平均声掛け人数について

### 確率分布

先ほどと同じ考え方で, $n$人声掛けして失敗したときの確率を計算していきます.

仮に, 5人声掛けして失敗した場合の確率は
```math
\begin{align}
p(人数=5,成否=☓)&=p(①<②<③<④, ④>⑤)\\
&=p(①<②<③<④)-p(①<②<③<④<⑤)\\&=\frac{1}{4!}-\frac{1}{5!}
\end{align}
```
このようにして, ｢人数｣と｢成否｣の同時確率を求めると結果は下表のようになります.

|  人数 |  成否  | パターン | 同時確率 |
| ---- | ---- | ----| ----|
|  5  |  ○  | ①<②<③<④<⑤ | $\frac{1}{5!}$|
|  5  |  ☓| ①<②<③<④, ④>⑤|  $\frac{1}{4!}-\frac{1}{5!}$|
|  4  |  ☓| ①<②<③, ③>④|  $\frac{1}{3!}-\frac{1}{4!}$|
|  3  |  ☓| ①<②, ②>③|  $\frac{1}{2!}-\frac{1}{3!}$|
|  2  |  ☓| ①>②|  $\frac{1}{2!}$|

### 成功時の一回あたりの平均声掛け人数

成功時の平均声掛け人数$n_{成功}$は5になります. 
```math 
n_{成功}=5
```

### 失敗時の一回あたりの平均声掛け人数

失敗時の平均声掛け人数$n_{失敗}$は条件付き確率の期待値で計算でき
```math 
\begin{align}
n_{失敗}
&=\sum_{k=2}^5 k \cdot p(人数=k | 成否=☓)
\\
&=\sum_{k=2}^5 k \cdot \frac{p(人数=k , 成否=☓)}{p(成否=☓)}
\end{align}
```
のようになります.
1式目から2式目の変形で$p(A|B)p(B)=p(A,B)$を使用しました.
ここで分子の$p(人数=k , 成否=☓)$は上の表から, $p(成否=☓)$は$(5!-1)/5!$と求まるので, $n_{失敗}$は計算できます.

これを求めると
```math
n_{失敗}=\frac{320}{119}
```
となります.
### 成功するまでの累計平均声掛け人数

一応真面目に計算します......
成功するまで試行を繰り返すときの確率分布は幾何分布(負の二項分布)に従うことが知られています.
$k$回目で成功する場合の確率$\mathrm{Pr}(k)$は
```math
\mathrm{Pr}(k)=p_{成功}(1-p_{成功})^{k-1}
```
また, 幾何分布の期待値は
```math
\sum_k k\mathrm{Pr}(k)=\frac{1}{p_{成功}}
```
となります.

$k$回目の試行で企画が成功したとします. 
このときの累計声掛け人数の平均値$m_k$は
```math
m_k = n_{成功}+(k-1)n_{失敗}
```
となります.

よって成功するまでの累積平均声掛け数は
```math
\begin{align}
\sum_k m_k\mathrm{Pr}(k)
&=\sum_k \{n_{成功}+(k-1)n_{失敗}\}\mathrm{Pr}(k)
\\
&=(n_{成功}-n_{失敗})\sum_k \mathrm{Pr}(k) + n_{失敗}\sum_k k\mathrm{Pr}(k)
\\
&=n_{成功}-n_{失敗}+\frac{n_{失敗}}{p_{成功}}
\\
&=325
\end{align}
```
となります.
元の記事の声掛け人数が322人なので概ね正しい結果と言えます.

# まとめ
手計算で, シミュレーションと同じ結果が得られた. 
めでたい
【備忘用】GitHubに草が生えない場合（解決策と復元方法）

# はじめに
アプリ開発している際にGitHubに草が生えておらず、サポートとメールでやり取りしてなんとか解決したので、備忘用にまとめておきます！

# 原因
開発環境で名前とメールアドレスをGitHubのアカウントと紐付けていなかった為

# 調べ方
＜ターミナル＞
・git config --global user.name
・git config --global user.email
これでそれぞれ何も表示されなければ、紐づいていないようです。

# 解決方法
＜ターミナル＞
・git config --global user.name "githubの登録ユーザー名"
・git config --global user.email "githubの登録メールアドレス"
これをした後に再度
＜ターミナル＞
・git config --global user.name
・git config --global user.email
をして表示されていれば、その後のコミット分から草が生えます。
（--globalで設定しているので、おそらく２回目以降は不要だと思われます。）

# 変更前の分の草も復元したい
先ほどの手順で設定後からの分は反映されますが、それまでの分は反映されません。
サポートに確認したところ、
・リポジトリの一時コピーを作成し、その上でスクリプトを実行して、関連するすべてのコミットのメタデータを更新し、コラボレーターが次にプッシュする前に、変更をリポジトリのコピーにリベースする
・以前のコミットの作成者情報を更新するには、リポジトリの履歴を書き換える必要がありますが、リポジトリに複数の貢献者がいる場合は推奨されません
と回答がありました。
手順も載っていたのですが、かなり大変そうだと感じました。

メールアドレスを関連付けることで草が生えるということなので、自分のgithubアカウントのメールアドレスに「EC2 Default User」のメールアドレスを追加した結果、Contribution graphに履歴が復元されました。
ただこのやり方に問題がないか気になったのでサポートに確認したところ、
・技術的には有効なメールアドレスではありませんが、アカウントに追加できたため、そのアドレスを使用して行われたコミットがプロフィールに表示されています
と返ってきました。
メールアドレスとしては使えませんが、アカウントに追加自体はできるようです。
以下やり方です。

#### まず変更前のメールアドレスに何が使われていたのかを調べる
1.草が反映されていないコミットのページを開きます
2.URLの末尾に「.patch」を入力してENTER
3.開かれたページの上から2.3行目に以下のように書いています
From: EC2 Default User
 <デフォルトのメールアドレス>

#### GitHubアカウントに<デフォルトのメールアドレス>を追加する
1.GitHubの右上のアイコンボタンを押す
2.Settingsを押す
3.Emailsを押す
4.「Add email address」と書かれたフォームがあるのでそこに入力し「Add」を押して、最後に確認作業
（私の場合は携帯に確認のメッセージが届き、確認番号を入力しました）
５月開催のカンファレンス７選

## Google I/O 2023
開催日時：2023/05/10(水) 14:00～18:00
開催場所：オンライン＋[幕張メッセ]()

今年のイベントは 2023 年 5 月 10 日に開催され、ライブでは参加者限定となりますがバーチャルではどなたでも無料で参加できます。ライブ ストリーミングされる基調講演を視聴し、技術コンテンツや教材をオンデマンドで学んでください。登録は 3 月 7 日から始まり、無料で登録できます。

https://io.google/2023/intl/ja/

---

## Microsoft Build
開催日時：2023/05/24(水)～2023/05/25(木)
開催場所：オンライン＋オフライン

Microsoft Build は、世界中の開発者と Microsoft が関係を築くための毎年恒例の米国Microsoft主催のフラッグシップ イベントです。プロの開発者や業界の先駆者、最先端の技術者が一同に集まり、新しいテクノロジーについて学び、アイデアを共有し、未来を築くためのスキルを身につけることができます。
Microsoft 会長兼 CEO のサティア ナデラをはじめ、製品やエンジニアリングのエキスパートたちが、最新の技術情報をお届けし、未来を築くためにアイデアの共有とその質問にお答えします。AIによる新しい機会を発見し、知識とスキルを向上させましょう。

https://build.microsoft.com/en-US/home

---
## Qiita Conference 2023
開催日時：2023/05/17(水)～2023/05/19(金) 17:20～20:20
開催場所：オンライン

Qiita Conferenceは、日本最大級*のエンジニアコミュニティ「Qiita」が開催するオンライン技術カンファレンスです。
ゲストスピーカーによる基調講演、参加各社のスポンサーセッションで技術的な挑戦や積み重ねてきた知見を共有します。
ソフトウェア開発者が集まり、最新の技術や最先端の挑戦、ソフトウェアの未来についての考えや知見を共有し、つながる場を創出します。

https://increments.connpass.com/event/279734/

---
## オープンソースカンファレンス2023名古屋（セミナー）
開催日時：2023/05/20(土) 10:00～18:00
開催場所：オンライン

オープンソースカンファレンス（OSC）は、オープンソースの今を伝えるイベントです。

東京だけでなく、北は北海道、南は沖縄まで、年間を通じて全国各地で開催しています。

オープンソース関連のコミュニティや協賛企業・後援団体による、セミナーやプロダクトの展示などを入場・参加料が無料でご覧いただけるイベントです。

https://event.ospn.jp/osc2023-online-nagoya/

---
## オープンソースカンファレンス2023名古屋（展示会）
開催日時：2023/05/28(日) 11:00～16:00
開催場所：(名古屋市中小企業振興会館 3F 第2ファッション展示場)[https://www.nipc.or.jp/fukiage/]

オープンソースカンファレンス（OSC）は、オープンソースの今を伝えるイベントです。

東京だけでなく、北は北海道、南は沖縄まで、年間を通じて全国各地で開催しています。

オープンソース関連のコミュニティや協賛企業・後援団体による、セミナーやプロダクトの展示などを入場・参加料が無料でご覧いただけるイベントです。

https://event.ospn.jp/osc2023-nagoya/

---
## RESEARCH Conference 2023
開催日時：2023/05/27(土) 10:00～17:00
開催場所：オンライン＋[株式会社リクルート 九段下オフィス](https://www.google.com/maps/place/%E3%80%92102-0073+%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%8D%83%E4%BB%A3%E7%94%B0%E5%8C%BA%E4%B9%9D%E6%AE%B5%E5%8C%97%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%94%E2%88%92%EF%BC%96+%E4%B9%9D%E6%AE%B5%E5%9D%82%E4%B8%8AKs%E3%83%93%E3%83%AB/@35.6956761,139.7490825,18z/data=!4m6!3m5!1s0x60188c6a519e2959:0x9d3f196aca9058f2!8m2!3d35.6956733!4d139.7491968!16s%2Fg%2F11ddyztlww?hl=ja)

RESEARCH Conferenceは、リサーチをテーマとした日本発のカンファレンスです。より良いサービスづくりの土壌を育むために、デザインリサーチやUXリサーチの実践知を共有し、リサーチの価値や可能性を広く伝えることを目的としています。
今回のテーマは「SPREAD」です。リサーチの領域を広げる、取り組みを周囲に広げる、実践者同士のつながりを広げる…そういった意味を込めています。小さく始めたリサーチを、私たちはどのように広げていけるのでしょうか？多様なスピーカーの実践知には、きっと色々なヒントがあるはずです。本カンファレンスが参加者の皆様にとって、リサーチの取り組みをより広げるきっかけになることを願っています。

https://research-conf.connpass.com/event/278683/

---
## 危機管理カンファレンス2023春
開催日時
* 2023/05/25(木) 09:30～16:30
* 2023/05/26(金) 10:30～16:50

開催場所：オンライン

切迫する首都直下地震や南海トラフ地震、年々増加する気象災害、さらには不穏さが増す海外情勢と企業を取り巻くリスクは右肩上がりに増加し続けている。それぞれのリスクについてどのように対応するのか企業には決断が迫られている。危機管理カンファレンス2023春は、企業がどのようなリスクにどう対応するのか、BCP対策を講じるのか最新の動きや役立つソリューションを紹介します。

https://risk-conference.net/
新卒エンジニアのIT用語その2

その1はこちら
https://qiita.com/yata78/items/6cb21dd50fe122111c41

###### データマイニング

大量のデータを分析して傾向・法則を発見する手法

###### データサイエンス

データマイニングにより問題解決やビジネスに役立つ知見を得ること

###### インターネット

複数のネットワークで世界中をつないだもの

###### イントラネット

企業や組織内部限定のネットワーク

###### パケット通信

送受信するデータをパケットという単位に区切り一人ずつ送る方法

###### 回線交換

通信が始まってから終わるまで他の人が回線を使えないように通信する方法

###### ADSL

電話回線を利用した上りと下りの通信速度が異なるデジタル通信サービス

###### 光ファイバー

ADSLと違って距離が離れても通信速度が低下せず高速な通信サービス

###### LAN

自宅やオフィスなど内部用のネットワーク
（イントラネットとの違いがわからん）

###### WAN

より広いエリアで使われるLAN　東京から大阪間など

###### プロトコル

通信をする際のルール

###### OSI参照モデル

通信をするためのネットワークの基本的な考え方

###### IPアドレス

コンピュータの住所

###### ポート番号

コンピュータが利用するサービスを識別する番号

###### ドメイン名

サーバーが存在するネットワークを人間がわかりやすい形に変えたもの
～～～.co.jpなど

###### DNS

IPアドレスとドメイン名を対応させる仕組み

###### ルータ

ネットワークを構成する際に使用する中継器
OSI参照モデルのネットワーク層で使用する

###### スイッチ

ネットワークを構成する際に使用する中継器
OSI参照モデルのデータリンク層で使用する

###### DHCP

ネットワークにつなぐコンピュータにIPアドレスを自動的に与えるプロトコル

###### デフォルトゲートウェイ

ネットワークとネットワークの出入り口にあたる機器

###### NAT

グローバルIPアドレスに1つのプライベートIPアドレスを割り当てる

###### NAPT

IPアドレスとポート番号により複数のコンピュータが同時にインターネットに接続できる仕組み

###### パケット

ネットワーク層で使われるデータの送信単位

###### フレーム

データリンク層で使われるデータの送信単位

###### セッション

OSI参照モデルのセッション層で使われる利用者を識別する仕組み

###### コネクション

OSI参照モデルのトランスポート層で使われる利用者を識別する仕組み

###### SMTP

メールを送信するときに使われるプロトコル
送信者からメールサーバ　メールサーバとメールサーバ間で使用

###### POP

メールを受信するときに使われるプロトコル
受信者のパソコンにメールを保存

###### IMAP

メールを受信するときに使われるプロトコル
サーバーから直接メールを見る

###### クローラ

Webサイトを定期的に巡回し、情報や画像を収集していくソフトウェア

###### スケールアップ

コンピュータのハードウェアの性能を上げる方法

###### スケールアウト

コンピュータを複数並べて性能を上げる方法

### 最後に

知っている単語を記述するのがめんどくさくなったので全ての単語を書いてはいません！！
何か間違えていることがあったら教えてください
【自作アプリ】実装機能➀

#### --今回は最近実装中の機能について記載していきたいと思います。--
※そこまで大層なものではなく、工夫した点を記載。
・jspとservletを使ってsessionを飛ばしたい。自作アプリにログイン機能を付けたい。人など向けに投稿します。



##### 【最近の開発の進め方】
自作アプリの開発にて最近は毎日コツコツ実装をしています。少し前までは週に1回集中して開発を行うと言う事が多かったのですが毎日少しずつ進めることによって毎日のモチベーションにも繋がりますし、単純に思い出す必要がなくなるのでとても良いと感じました！

#### 【実装した機能】
主に２つ
➀ログインしているユーザーのidをsessionで飛ばしておく
➁ログアウトする際に飛ばしたsessionを削除しておく

sessionとは簡単に言えば「一定の期間情報を保持しておきたい時に使うもの」です。
これは大前提なのですservletを使用する時にリクエストスコープというものがあると思います。これはリクエスト毎に生成されるものでページの遷移は1回までしかデータの情報を保持する事ができません。ですのでsessionを使用することにより一定の期間複数ページでの情報の保持という事ができるようになります。

注意点・・sessionを切らないといつまでも情報が宙に浮いている状態でセキュリティ面でも危険な状態になってしまうので必ずログアウトする際はsessionを削除するようにすること。

##### 【sessionを設定】
```java
HttpSession session = request.getSession();
```

##### 【sessionの使用】
```java
//例
int user_id = (int)session.getAttribute("user_id");
```

##### 【session削除　２通り】

```java
//➀sessionのデーを全て削除したい時
session.invalidate();
```

```java
//➁sessionの一部のデータを削除したい時
session.remove.Attribute();
```

#### 【実際の動き】
トップ画面にてログイン中・・・
・ログイン中の「id」のデータを保持中
・右上のログアウトボタンを押下する

![トップ画面　第一期➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/aa17b00d-a04b-053b-d741-af4e0cf563e6.png)

#### ↓ログアウト(session.invalidate()が実行される)

![ログイン画面　第一期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/55df4c66-d614-d345-ae3a-e188fb78f8e6.png)

#### 【結局どういう時に使う？？？】
・上記のようにログイン情報を持っておきたい時
・その上でユーザー情報を変更(UPDATE)したい時に使用する
(UPDATEする際にユーザー情報を一意であるidでSELECTにて取得できるようにする為)
※一意かどうかはテーブル設計にもよる。

id(ログイン中のユーザー情報)を持っておくことはアプリを使用する上でかなり便利なので是非リクエストではなくsessionを使用するようにしてください。只、ログアウトする際は必ずsessionを切る(削除)するようにしてください！
AUTOSAR Methodology



68	Methodology for Classic Platform, https://www.autosar.org/fileadmin/standards/classic/22-11/AUTOSAR_TR_Methodology.pdf	https://qiita.com/kaizen_nagoya/items/daf3ca65932d40c99448

362	Requirements on Methodology for Classic and Adaptive Platform, https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_RS_Methodology.pdf
https://qiita.com/kaizen_nagoya/items/d48e8a26c831aa0197fd



>[RS_METH_00006] The methodology shall explain how to build an AUTOSAR
system 
Description:The methodology shall explain how to build an AUTOSAR system using the activities and work products. It should be like a user manual to help an organization efficiently apply AUTOSAR.
In particular, the methodology shall explain how to build a system consisting of classic and adaptive platforms.

A method should explain how to build an AUTOSAR system 
Description:A method should explain how to build an AUTOSAR system using the activities and work products. It should be like a user manual to help an organization efficiently apply AUTOSAR.
In particular, the method shall explain how to build a system consisting of classic and adaptive platforms.

A methodology should explain common concept that a method based on the methodology will success to achieve purpose and outcomes



709	Methodology for Adaptive Platform, https://www.autosar.org/fileadmin/standards/adaptive/22-11/AUTOSAR_TR_AdaptiveMethodology.pdf	https://qiita.com/kaizen_nagoya/items/6f65efc680ab81951daf	AP統合
データ品質チェックシート

## 欠損値のチェック

```sql
SELECT COUNT(*) 
FROM table 
WHERE column IS NULL;
```

結果が0より大きいと欠損値があるということになる

## 重複のチェック

```sql
SELECT COUNT(*) 
FROM (SELECT DISTINCT * FROM table) t;
```

結果が総行数よりも多い場合は、重複があるということ。

## 無効な値がないかのチェック

```sql
SELECT COUNT(*) 
FROM table 
WHERE column NOT IN (valid_value_1, valid_value_2, …);
```

結果が0より大きい場合は、テーブルに無効な値があることがわかる

## 無効なデータ型でないか

```sql
SELECT COUNT(*)
FROM table
WHERE CAST(column AS datatype);
```

特定の列を変換できない場合、カウントが1以上になるみたい

## データ範囲チェック

```sql
SELECT COUNT(*) 
FROM table 
WHERE column < min_value 
   OR column > max_value;
```

結果が1以上であれば、想定外の範囲のデータがあることになる

## 参照整合性チェック

```sql
SELECT COUNT(*) 
FROM table1 
WHERE column1 NOT IN (
    SELECT column2 FROM table2
);
```

参照整合性: 参照元と参照先の依存関係が正しく成立しているかという意味

結果が1以上であれば、参照元であるカラム1内に、カラム2の文字列がない。つまり、参照整合性がないということになる。

## ユニークかどうかチェック

```sql
SELECT COUNT(*) 
FROM table 
GROUP BY column 
HAVING COUNT(*) > 1;
```

あるカラムでグループ化して、グループ化した後のそれぞれのグループの列が1以上のものだけを取得している。

0より大きい結果があれば、そのカラムには重複があることになる。
## 参考文献

https://aebiddle.medium.com/mastering-data-quality-7-sql-queries-for-reliable-and-accurate-insights-7e2a8132d6d
Oracle Database 23c Free - Developer Releaseと戯れる（その1）

# はじめに
Oracle Database 23cでは、SQLがシンプルに書けるような変更が加えられています。
地味ですがちょっと嬉しい変更を試してみました。
PostgreSQLとOracleの両方を使っている方、PostgreSQLからの移行を検討されている方向けにも助かる変更かと思います。

# 1. FROM dual 句なしのSELECT文が利用可能に
これまでは、定数や計算式、sysdate等の関数、シーケンスの順序疑似列などをSELECT文で取得する際には**FROM dual**句が必要でしたが、Oracle Databse 23cでは**FROM dual**句なしでも実行が可能になりました。
```sql: 19c
SQL> SELECT sysdate FROM dual;
SYSDATE
-------------------
2023/04/22 07:03:29

SQL> SELECT sysdate;
SELECT sysdate
             *
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。


SQL> CREATE SEQUENCE seq1;
順序が作成されました。

SQL> SELECT seq1.nextval FROM dual;

   NEXTVAL
----------
	     1

SQL> SELECT seq1.nextval;
SELECT seq1.nextval
                  *
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。


SQL> 
```

```sql: 23c
SQL> SELECT sysdate FROM dual;

SYSDATE
-------------------
2023/04/22 07:04:33

SQL> SELECT sysdate;

SYSDATE
-------------------
2023/04/22 07:04:34

SQL> CREATE SEQUENCE seq1;

順序が作成されました。

SQL> SELECT seq1.nextval FROM dual;

   NEXTVAL
----------
	     1

SQL> SELECT seq1.nextval;

   NEXTVAL
----------
	     2

SQL>
```

# 2. GROUP BY 句で列の別名が利用可能に
これまではGROUP BY句で列の別名を使用することができませんでしたが、23cではGROUP BY句で列の別名が使用できるようになりました。
```sql: 19c
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
  2  FROM dba_tablespaces a, dba_data_files b
  3  WHERE a.tablespace_name = b.tablespace_name
  4  GROUP BY LOWER(a.tablespace_name)
  5  ORDER BY mb DESC;

TS				                       MB
------------------------------ ----------
sampleschema			           204800
sysaux				              3505.25
undotbs1			                 1195
data				                 1124
system				                 1061
dbfs_data			                  100
undo_7				               95.375

7行が選択されました。

SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
  2  FROM dba_tablespaces a, dba_data_files b
  3  WHERE a.tablespace_name = b.tablespace_name
  4  GROUP BY ts
  5  ORDER BY mb DESC;
GROUP BY ts
         *
行4でエラーが発生しました。:
ORA-00904: "TS": 無効な識別子です。


SQL>
```
23cでは、GROUP BY句で列の別名（ここではts）が使用できるようになりました。
```sql: 23c
SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
  2  FROM dba_tablespaces a, dba_data_files b
  3  WHERE a.tablespace_name = b.tablespace_name
  4  GROUP BY LOWER(a.tablespace_name)
  5  ORDER BY mb DESC;

TS				                       MB
------------------------------ ----------
sysaux				                  340
system				                  290
undotbs1			                  100
users					                5

SQL> SELECT LOWER(a.tablespace_name) ts, SUM(b.bytes)/1024/1024 mb
  2  FROM dba_tablespaces a, dba_data_files b
  3  WHERE a.tablespace_name = b.tablespace_name
  4  GROUP BY ts
  5  ORDER BY mb DESC;

TS				                       MB
------------------------------ ----------
sysaux				                  340
system				                  290
undotbs1			                  100
users					                5

SQL> 
```
これからvue3を学ぶ人におすすめの入門書

以下にVue 3を学ぶ人におすすめの入門書をいくつかご紹介します。

### [Vue 3　フロントエンド開発の教科書](https://amzn.to/43SsYXE "‌")

**TypeScript×Composition APIによる次世代Vueの開発手法がわかる！**

人気のWebフロントエンドフレームワーク「Vue.js」がバージョンアップして「Vue 3」となり、TypeScriptの標準採用、新機能Composition API、Vite、Piniaの搭載など、大幅に機能が更新・強化されました。それに伴い、Vue 3では、従来のOptions APIを利用したコンポーネント開発とは異なる開発手法が必要となります。本書では、Composition APIによるコンポーネント開発やPiniaによる状態管理、Vue RouterによるSPA開発、非同期処理やユニットテストなどを新機能を駆使して解説しており、Vue 3によるフロントエンド開発手法が1冊ですべて身に付く内容になっています。

### [『Vue.js 3 超入門』（掌田津耶乃） ](https://amzn.to/3L0g6WL "‌")

いま、Webの開発でもっとも注目されているソフトのひとつが「Vue.js」です。Vueを使うと「リアルタイムに動いているWebサイト」を作成できます。本書は、初心者や既存の入門書に挫折した人向けに、最新のVue.js3の使い方とアプリ作成のコツを、実際にプログラムを動かしながら学ぶ超入門書です。本書を一通り読めば、あなたも簡単なWebアプリの開発ができるようになります。巻末に未経験者も安心の「JavaScript超入門」を収録。

### [これからはじめるVue.js 3実践入門(山田 祥寛)](https://amzn.to/41JwuSK "‌")

いま学んでおきたいJavaScriptフレームワーク「Vue.js」のエッセンスを一冊に詰め込みました！

豊富なサンプルコードで試しながら理解できます！

Vue.js（ビュージェイエス）は、Webアプリのビュー（見た目）の部分に特化したシンプルなフレームワークです。既存のアプリに後乗せで導入したり、徐々に適用範囲を拡大したりすることが手軽に行えます。

シンプルな分、他のフレームワークと比べて学習コストが低く、HTMLとJavaScriptが一通りわかる人ならコードを理解するのも簡単です。

本書では、Vue.jsの中核である、ページを構成するUI部品「コンポーネント」をしっかりと解説し、さらには本格的なアプリ開発で必要となる要素までを網羅的に取り扱います。丁寧な解説でよくわかる、入門書の決定版です！

### [(無料)Vue.js 超入門 v3.2対応: 最初に手にしてよかった本](https://amzn.to/41wa1sh "‌")

JavaScriptを取り巻く環境はここ数年で劇的に変わりました。ターゲットは自分のようなエンジニアでありながら、モダンなJavaScriptに置いて行かれた、けれど学びたい人向けです。

プログラミング経験者にとって実際に動くものがあるというのは、土台を手に入れたようなものです。そこから応用や他の機能を試すことができます。入門書という一冊を通して、自分の土台作りができるものがあればいいなと思い執筆しました。

Vueを学ぶにあたって最初に手にして良かったと思っていただければ嬉しく思います。

### まとめ

以上がおすすめの入門書となります。初心者の方は、基礎的な知識からじっくりと学ぶことをおすすめします。また、Vue 3の公式ドキュメントも充実しているので、合わせて参考にしてみてください。
Raspberry Pi OS に Helm をインストールする方法

Raspberry Pi を使った Kubernetes クラスタの構築を行っている際に、 Helm のインストールが必要になったので、今回はその方法を紹介します。



# まえがき
一般的に紹介されている方法では、バイナリをダウンロードして利用したり、 `snapd` を利用する方法などが多いようです。
余計なものは増やしたくなかったので、 `apt` を利用して、インストールしていこうと思います。



# 環境
今回の環境は下記のとおりになります。

- 端末： Raspberry Pi 4 (8GB)
- OS： Raspberry Pi OS (64-bit)
- Debian version： 11.6
- Kernel version: 6.1



# Helm のインストール
apt に Helm のリポジトリを登録してインストールします。


## 事前準備
apt のパッケージ一覧の更新を行い、 Helm の apt リポジトリを利用するのに必要なパッケージをインストールします。
既にインストール済みの場合は省略して大丈夫です。

```shell
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
```


## Helm の公開鍵のダウンロード
Helm の公開鍵をダウンロードします。

```shell
sudo curl -fsSLo /etc/apt/keyrings/helm.asc https://baltocdn.com/helm/signing.asc
```

:::note info
公開鍵の保存場所について
apt 2.4以降、パッケージ管理されていない公開鍵は、 `/etc/apt/keyrings/` ディレクトリに保存することが推奨されています。
`Docker` や `Kubernetes` の公開鍵も上記のディレクトリに保存されていたので、今回はここに保存することにします。
:::

:::note info
公開鍵のフォーマットについて
apt 1.4以降、 ASCII Armored 形式の `.asc` ファイルも利用できます。
:::


## Helm の apt リポジトリを追加
Helm の apt リポジトリを追加します。

```shell
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/helm.asc] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
```


## apt のパッケージ一覧の更新
新しいリポジトリが追加されたので、 apt のパッケージ一覧を更新します。

```shell
sudo apt update
```


## Helm のインストール
Helm のインストールを行います。

```shell
sudo apt install helm
```


## Helm のバージョン確認
Helm のインストールがきちんとできているか確認するために、 Helm のバージョンを表示してみます。

```shell
sudo helm version
```

```shell
version.BuildInfo{Version:"v3.12.0", GitCommit:"c9f554d75773799f72ceef38c51210f1842a1dea", GitTreeState:"clean", GoVersion:"go1.20.3"}
```


# 参考文献
下記のサイトを参考にさせて頂きました。

https://helm.sh/ja/docs/intro/install/

https://zenn.dev/spiegel/articles/20220508-apt-key-is-deprecated

https://debian-handbook.info/browse/ja-JP/stable/sect.manipulating-packages-with-dpkg.html

<!-- EOF -->
Docker＆React環境にTailwind CSSが読み込まれないときの対処法

# TL;DR
DockerfileでconfigのCOPYを忘れていないですか？というお話。

# 環境
- ubuntu22.04
- react 18.2.0
- vite 4.3.0
- tailwindcss 3.3.1

# 対処法
https://tailwindcss.com/docs/guides/vite

Tailwind CSSの公式ドキュメント通りに進めていってもスタイルが適用されない場合は、Dockerfileに問題があるかも。

```dockerfile
FROM node:19 as Dev

WORKDIR /usr/app

COPY package*.json /usr/app/
COPY tsconfig*.json /usr/app/
COPY vite.config.ts /usr/app/
COPY index.html /usr/app/

// これ忘れてない？
COPY tailwind.config.js /usr/app/
COPY postcss.config.js /usr/app/

RUN yarn install

EXPOSE 5173
CMD ["yarn", "dev"]
```

Dockerfileで個別にCOPYをしている場合は、configファイルの追加を忘れないようにしましょう。

# おまけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359441/1b0fc4f3-839f-b3d5-5243-d026b0b0daa8.png)
ChatGPTと音声で会話するためのiPhoneショートカット2件

話題の会話型ＡＩチャットGPTと会話をはじめるショートカットを作ってみた! ユーザー登録は別途必要。

マイクをオンして音声で質問して、答えが返ってきたら、クリップボードにコピーして、次のショートカットでSiriにクリップボードを読み上げてもらう。
文字入力なしで会話ができる。ちょっと手間だけど。

ショートカット1
(ChatGPTを呼び出す)名前を変えないとダメですね。safariでチャットGPTを検索してしまいます。別の名前に改名が必要です。トッケビにしました。
![AF509CBF-A075-49DD-A33C-C980F76E7C14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151151/c9a15816-771b-0051-6cdc-d0f0a2a512e5.png)


ショートカット2
(クリップボードをSiriが読み上げる)
![967111BD-482B-4900-A6B6-AFB043F96C69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151151/0c2487c3-fe4e-18ea-6f22-af602a468e93.png)

以上
RustでRaspberry PiのCPU温度を取得しSQLiteに保存する


リポジトリ:https://github.com/misogihagi/raspberrypi-temperture):https://github.com/misogihagi/raspberrypi-temperture
バイナリ:https://github.com/misogihagi/raspberrypi-temperture/releases/download/v0.1.0/raspberrypi-temperture


Raspberry Piをずっと稼動させていてこれ熱暴走とか大丈夫か？と思いRustの練習も兼ねて作ってみました。

Raspberry Piでハードウェアが固定されているので
```
/sys/class/thermal/thermal_zone0/temp
```
を参照すればいいだけです。

もしほかのプロセッサやディストリビューションならどうなったか…

https://qiita.com/koara-local/items/1fac13704123717f5cc8

### 使い方
```
./raspberrypi-temperture 
```
で5秒ごとに温度をtemperature.dbに格納します。

### やってみる

そこそこ動かすとこんな感じでデータが取れます。
```
sqlite3 temperture.db "select * from monitor;"
```
> 39.008|1682099833
39.008|1682099838
39.546|1682100348
39.008|1682100353
40.084|1682100358
39.008|1682100363
38.47|1682100368
39.546|1682100387
38.47|1682100393
39.008|1682100398
39.008|1682100403
40.084|1682100408
39.008|1682100413
39.008|1682100418
39.546|1682100423

    
### ソース

```rust
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
use std::time::{SystemTime, UNIX_EPOCH};
use std::{thread, time};

const DB_PATH: &str = "./temperture.db";
const INTERVAL: u64 = 5000;
const TEMPERATURE_FILE: &str = "/sys/class/thermal/thermal_zone0/temp";

fn init() {
    let query = "
    CREATE TABLE monitor (temperature REAL, timestamp INTEGER);
";

    let path = Path::new(DB_PATH);
    if !path.is_file() {
        let connection = sqlite::open(DB_PATH).unwrap();

        connection.execute(query).unwrap();
    }
}

fn load() {
    let connection = sqlite::open(DB_PATH).unwrap();

    macro_rules! query {
        () => {
            "INSERT INTO monitor VALUES ({temperature}, {timestamp});"
        };
    }

    let mut f = File::open(TEMPERATURE_FILE).unwrap();
    let mut c = String::new();
    f.read_to_string(&mut c).unwrap();

    // 45678 -> 45.678
    let temperature = format!("{}.{}", &c[0..2], &c[2..5]);

    let start = SystemTime::now();
    let since_the_epoch = start
        .duration_since(UNIX_EPOCH)
        .expect("Time went backwards");

    let timestamp = since_the_epoch.as_secs();

    connection
        .execute(format!(
            query!(),
            temperature = temperature,
            timestamp = timestamp
        ))
        .unwrap()
}

fn main() {
    init();
    let ten_millis = time::Duration::from_millis(INTERVAL);
    loop {
        load();
        thread::sleep(ten_millis);
    }
}
```
PokeAPIを使用してAndroidアプリを作成 ～設計編～

# はじめに
この記事は、アプリ開発をするための設計編です。
開発をする前に軽く設計書を作成しておくことで、実装していく際に迷わなくなるというメリットがあるので、簡単なアプリでも設計書を作成することをオススメします。
ただ、今回のようなポケモンを表示する程度のアプリであれば、設計書は凝らなくて良いです。
凝ったものを作ろうとすると設計書の作成で躓いて、心が折れてしまいます。（途中で更新はありです！）

# アプリの概要
何をするアプリなのか、何を表示するのか、機能は何があるのかなどをざっくりとExcelなどに概要をまとめておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331610/3776f689-0e78-8d17-841d-31131c051979.png)

# 画面設計
画面の見た目を設計していきます。
以下は私が作成した例です。
左側にアプリ画面イメージと、右側にオブジェクトの説明を記載しています。
もっと凝りたい人はバリデーションなどを説明に追記してみても良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331610/74f43699-1832-9d4b-312e-ce9e8e521e67.png)

# 最後に
今回はアプリ開発をするための設計を行いました。
設計はなかなか難しい工程ではありますが、設計をすることで作りたいことが明確化されます。
もっと凝りたい人は、シーケンス図やクラス図などを作ってみても良いと思います。
初心者の方の参考程度になればなと思います。

つたない文章だったと思いますが、ここまで見ていただきありがとうございます。
~~次回、レイアウト編でお会いしましょう。~~
次回、プロジェクト作成編でお会いしましょう。
Cookpadのレシピから材料抽出してみた【スクレイピング】

# Pythonでのスクレイピング
この記事では, PythonのBeautifulsoupを使ったスクレイピングと, mecabを用いた形態素解析をしています.
これらのインストールが済んでいない場合はpip等でインストールしてください.(Macだとmecabのインストールにhomebrewが必要だったかも)

# 早速本題
```python:コード
import requests
from bs4 import BeautifulSoup
import MeCab

m = MeCab.Tagger('-Owakati')

url = "レシピのURL"
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')

recipe_title = soup.find('h1', class_='recipe-title').text.strip()
print(recipe_title)

ingredients_list = []
for ingredient in soup.find_all('div', class_='ingredient_row'):
    ingredient_quantity = ingredient.find('div', class_='ingredient_quantity')
    ingredient_name = ingredient.find('div', class_='ingredient_name')
    if ingredient_quantity is not None:
        ingredient_quantity = ingredient_quantity.text.strip()
        parsed_ingredient_quantity = m.parse(ingredient_quantity).rstrip('\n')
    else:
        parsed_ingredient_quantity = None
        
    if ingredient_name is not None:
        ingredient_name = ingredient_name.text.strip()
        parsed_ingredient_name = m.parse(ingredient_name).rstrip('\n')
    else:
        parsed_ingredient_name = None

    ingredients_list.append({'name': parsed_ingredient_name, 'quantity': parsed_ingredient_quantity})

print(ingredients_list)

```
この方法では, ingredients_listの中身は辞書型で表示されます.
ちなみにこれはChatGPTに聞きながら書きました.(この記事自体も, ChatGPTにコードを書かせたのも初だったりする)

# 少し解説
requestsを通じて, CookpadのwebページからHTMLのデータを取得して, その中からbeautifulsoupを使って, レシピのタイトルや材料一覧(材料名と分量)の要素を抽出しています.

例えば`recipe_title = soup.find('h1', class_='recipe-title').text.strip()`では, HTML内の見出し要素であるh1の中から, recipe-titleというクラスを探して, そこのテキスト部分のみを抽出している訳ですね.
find内のclass等の指定は, デベロッパーツールを使って実際のHTMLを覗く必要があります.

mecabについては, ここではあまり大きな効力はなかったと考えていますが, 例えば「たまねぎとにんじん」と記載があった際に「たまねぎ」「と」「にんじん」のように分けてくれてハッピーになれるときがあるかもしれません.

is not Noneについては, たまにレシピ内の材料に材料でない単語が混ざっていたりするので, とりあえず書いといたほうが適用範囲が増えるよって感じですね.

# このまま実験等のデータに使えるか
結論から言うと, 加工は必要だと思います.

まず, 今回は一つのURLのみからデータを取ってきていますが, 一つのレシピだけからのデータで済むことも中々ないと思います.

そうなると複数のレシピが必要になりますし, その中で「たまねぎ」と「玉ねぎ」等, 記事によって表記ゆれがあるため, そこも修正しないといけません. (これはreplaceとかが有効かもしれません)

私がぱっと思いつくだけでもこれくらいの課題点はありますし, 実際にはもっと変えるべき箇所はあると思います. 

# 最後に
スクレイピングについては, サイトの利用規約に目を通してから行ってください.
念のため, [cookpad利用規約](https://cookpad.com/terms/free)のURLのリンクを張っておきます.
Type Error:Failed to execute 'fetch' on 'window':Request with GET/HEAD method cannot have body.と出た際の対処法

自社のサービスのAPIを叩いていた時に、

Type Error:Failed to execute 'fetch' on 'window':Request with GET/HEAD method cannot have body.

というエラーが発生。
なんやこれは！(◎_◎;)

指定しているリクエストは、仕様書を見ている限りボディーありじゃないとデータの登録ができないのに、なんでボディーの設定関連でエラーになるんや！
という気持ちになりましたが

Request with GET/HEAD methodというエラーに着目。
あれ、ゲットメソッドを送ったことになっている。
fetch()は、デフォルトでGETメソッドになっていることが原因で、fetchはgetメソッドでoptionにbodyを登録できない。
options項目で
```javascript:doRestAPI.js
options:{
    method:'POST',
    body://リクエストしたい項目
}
```
とすればボディーにデータを入れてリクエストを送ることができます。
下記サイトに詳細が記載されていますので、ご活用ください。
https://developer.mozilla.org/ja/docs/Web/API/fetch

ちなみに最後の項目の終わりにカンマ（,）を入れるとエラーになるので
お気を🚨
デバイスの文字サイズの設定によってデザインが崩れるのを防止する

例えばこんなのがあったとして
```swift
import SwiftUI

struct Hoge: View {
    var body: some View {
        content
            .padding(30)
    }
    
    var content: some View {
        VStack(alignment: .center, spacing: 20.0) {
            Text("ABCDEFGHIJKL".uppercased())
                .font(.largeTitle.width(.compressed))
                .fontWeight(.bold)
            Text("「蚊に刺されると、かゆみを感じるのは唾液が原因である」というのは、実は誤解。蚊が吸った血液を注入するための唾液が原因で、かゆみを引き起こす。")
                .multilineTextAlignment(.center)
                .foregroundColor(.secondary)
                .fontWeight(.medium)
            Button {
            } label: {
                Text("へ〜")
                    .padding(.all)
                    .frame(maxWidth: .infinity)
                    .background(.cyan)
                    .cornerRadius(10)
            }
        }
        .padding(30)
        .background(.blue)
        .cornerRadius(10)
        .frame(maxWidth: 500)
    }
}

struct Hoge_Previews: PreviewProvider {
    static var previews: some View {
        Hoge()
    }
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/8feb5d7e-84d2-2f50-7e19-2891a6a6c8dc.png)


通常の文字サイズではいい感じのレイアウトだけど、
設定で文字を大きくするとレイアウトが崩れたり、文字が見切れたりすることがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/56c5a27e-8772-86ae-eac8-57bc6f9956be.png)

ちなみにこの画面はキャンバスの下の方のボタンから選択すれば表示できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/def168a7-3f16-6d1d-533d-cc78a773bf8c.png)

`XXX large`まではいい感じなので、それ以上大きくならないように、文字サイズを制限したい。

```swift
import SwiftUI

struct Hoge: View {
    var body: some View {
        content
            .padding(30)
            // こいつを追加
            .dynamicTypeSize(.xSmall ... .xxxLarge)
    }
    
    var content: some View {
        VStack(alignment: .center, spacing: 20.0) {
            Text("ABCDEFGHIJKL".uppercased())
                .font(.largeTitle.width(.compressed))
                .fontWeight(.bold)
            Text("「蚊に刺されると、かゆみを感じるのは唾液が原因である」というのは、実は誤解。蚊が吸った血液を注入するための唾液が原因で、かゆみを引き起こす。")
                .multilineTextAlignment(.center)
                .foregroundColor(.secondary)
                .fontWeight(.medium)
            Button {
            } label: {
                Text("へ〜")
                    .padding(.all)
                    .frame(maxWidth: .infinity)
                    .background(.cyan)
                    .cornerRadius(10)
            }
        }
        .padding(30)
        .background(.blue)
        .cornerRadius(10)
        .frame(maxWidth: 500)
    }
}

struct Hoge_Previews: PreviewProvider {
    static var previews: some View {
        Hoge()
    }
}

```

`XXX Large`以上の文字サイズになっていないことがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/24c7cb8f-f3c6-cab6-5fd6-2879eb9d4112.png)
【Swift】Mapとクロージャの省略記法を使って既存のコレクションを新しいコレクションに変換する方法

Swiftの学習を始めるにあたって、最初に公式のチュートリアル「iOS向けAppの開発」を行いました。
勉強している中で、こんな文が出てきてぱっと見イミわからん😵‍💫となりました。


`self.attendees = attendees.map { Attendee(name: $0) }`
  
  
  
調べてみたところ、無事理解したので、そのアウトプットも兼ねて記事を作成しました。

結論から言うとこのコードは既存のコレクション内の各要素を反復して変換を適用することにより、新しいコレクションを作成するものです。

ただ言葉で表すとわかりにくいと思うので、コードと共に例を挙げて順に説明していきます。

```DailyScrum.Swift
struct DailyScrum: Identifiable {
    let id: UUID
    var attendees: [Attendee]
    
    init(id: UUID = UUID(), attendees: [String], ) {
        self.id = id
        self.attendees = attendees.map { Attendee(name: $0) }
    }
}

extension DailyScrum {
    struct Attendee: Identifiable {
        let id: UUID
        var name: String
        
        init(id: UUID = UUID(), name: String) {
            self.id = id
            self.name = name
        }
    }
}
```
コードの全体像はこんな感じになります。DailyScrum構造体と、それを拡張して作成したAttendee構造体が定義されています。(説明を簡潔化するため、元のコードと変えている部分があります)

まず、DailyScrumがインスタンス化されるところから始まります。今回は引数として、たろう,じろう,さぶろうの配列を渡しました。
```ScrumView.swift
var dailyScrum = DailyScrum(atendees: ["たろう", "じろう", "さぶろう"])
```
インスタンス化される時、initが呼ばれ、変数に値が格納されます。
```swift
init(id: UUID = UUID(), attendees: ["たろう", "じろう", "さぶろう"]) {
        self.id = id
        self.attendees = attendees.map { Attendee(name: $0) }
    }
```

このとき、例の式が出てきます。右辺で何が起こっているのでしょうか。
引数attendeesに対してmapメソッドが使われています。

```swift
["たろう", "じろう", "さぶろう"].map { Attendee(name: $0) }
```

mapメソッドは配列の中身に全て同じ処理をしたいときに使われます。例えば、全員にさんをつけて`["たろうさん", "じろうさん", "さぶろうさん"]`という配列に変換したいときに使えます。

どのような処理をしたいかが後ろの`{ Attendee(name: $0) }`になります。
{}で囲まれた処理はクロージャと言ってブロックで囲んだ中にある処理を実行する自己完結型の機能です。

`Attendee(name: $0)`クロージャの中のこの式はAttendeeクラスをインスタンス化しています。
`DailyScrum(atendees: ["たろう", "じろう", "さぶろう"])`このDailyScrumクラスをインスタンス化するのと同じような操作と考えるとイメージがつきやすいです。

そして、最大の謎が`name: $0`これですよね。nameプロパティの引数として、渡されている`$0`、これは一体何なのでしょうか？

ヒントはクロージャの省略にあります。クロージャーは省略なしだと、以下のような形をとります。

```swift
{ (引数) -> 戻り値の型 in
    処理
 }
```

なので、今回の例だと、

```swift
{ (name) -> Attendee in
    Attendee(name: name)
}
```

引数nameを受け取って、そのnameでAttendeeインスタンスを作成するという操作を行なっています。
クロージャは戻り値の型を省略できます。その結果以下のようになります。

```swift
{ name in
    Attendee(name: name)
}
```
さらに引数自体(inも)も省略することができます。このとき、使いたい一つ目の引数を`$0`二つ目の引数を`$1`以下同様、、として使うことができます。つまり、、
```swift
{ Attendee(name: $0) }
```
あの最初に見た形になりましたね！私がわからん😵‍💫となった$0はクロージャによって省略された第一引数でした。

それがmapで繰り返し処理されるので、結果的にこのような新しい配列が作成されます。
```swift
[Attendee(name: "たろう"), Attendee(name: "じろう"), Attendee(name: "さぶろう")]
```
その配列が`self.attendees`つまり、DailyScrumインスタンスのattendeesという変数に格納されます。
結果的にこのようなインスタンスが作成されることになります。
```swift
var dailyScrum = DailyScrum(
attendees: 
    [
        Attendee(name: "たろう"), 
        Attendee(name: "じろう"), 
        Attendee(name: "さぶろう")
    ]
)
```
つまり、既存のコレクション`["たろう", "じろう", "さぶろう"]`はただの文字列の配列でしたが、mapを使って変換することにより、上記のようなAttendeeインスタンスの配列にすることができました。

mapとクロージャの省略を使うことでコレクションの変換を容易にすることができます。超長々と解説してしまいましたが、すごく~~長ったらしく~~丁寧に説明したので、同じところで詰まった人の手助けになれば幸いです。

参考：　https://developer.apple.com/tutorials/app-dev-training
出てきた箇所：5章Creating a navigation hierarchy、4節Creating a navigation hierarchy
pugとHTMLの違いについてまとめてみた！

# 概要
今日、友人からpugというものについて聞いたので今回はそれについてまとめようと思います。


# pugとはなんなのか
PugとはHTMLをより簡潔かつ効率的に記述できるテンプレートエンジン（動的なコンテンツを生成する際に使用されるプログラム）です。テンプレートエンジンは、静的なコンテンツ（HTML、CSS、JavaScriptなど）を、動的なデータ（データベースから取得した情報など）と組み合わせて表示することができます。これにより、同じ静的なコンテンツを使用して、様々な動的なコンテンツを生成することができます。

以下にpugの特徴をまとめたいと思います。

# pugの特徴

* タグの省略
HTMLでは、タグの開始タグと終了タグの両方を記述する必要があります。
しかし、Pugでは、タグの終了タグを省略することができます。例えば、以下のHTMLコードをPugに変換すると、以下のようになります。
```HTML.
<div class="container">
  <h1>Welcome to my website</h1>
  <p>This is a paragraph</p>
</div> 
```
<br><br>
```pug.
.container
  h1 Welcome to my website
  p This is a paragraph
```
このようにソースコードを大幅に短縮することが可能になります。cssに少し似ていますね。
<br><br>
* インデントによるネストの表現
HTMLでは、タグをネストする場合、開始タグと終了タグの位置を合わせる必要があります。しかし、Pugでは、インデントによってネストの深さを表現します。これにより、可読性が向上し、記述量が減ります。例えば、以下のHTMLコードをPugに変換すると、以下のようになります。
```HTML .
.container
  h1 Welcome to my website
  ul
    li Item 1
    li Item 2

```
<br>

```pug.
.container
  h1 Welcome to my website
  ul
    li Item 1
    li Item 2

```

タグを閉じる必要ないので便利ですね。（どこで終わっているのかわからなくなりそうだけど）

* 変数の展開
Pugでは、変数を使用してテンプレートを動的に生成することができます。変数を展開する場合、${}を使用します。例えば、以下のHTMLコードをPugに変換すると、以下のようになります。
```HTML.
<p>Hello, John!</p>
```
<br>

```pug.
p Hello, #{name}!
```
このようにpugではHTMLでは行えない変数の展開を行うことができます。

* コメントの書き方
HTMLでは、コメントを<!-- -->で囲みます。しかし、Pugでは、行頭に//を記述することでコメントを表現します。例えば、以下のHTMLコードをPugに変換すると、以下のようになります。
```HTML.
<div class="container">
  <!-- This is a comment -->
  <h1>Welcome to my website</h1>
</div>
```

<br>

```pug.
.container
  // This is a comment
  h1 Welcome to my website
```
自分はpugの記述法の方が慣れているのでありがたいですね。
<br>
# まとめ
 タグの表記を短縮化できたり使い方によってはとても便利な機能だということがわかりますね。
用途によって使い分けていこうと思います。
次の学習でも頑張ります。
モーダルを閉じるアニメーション

とにかく詰め込みまくった
- 透過のアニメーション
- スケールのアニメーション
- 回転のアニメーション
- ぼかしのアニメーション
- 移動のアニメーション

※わざとゆっくりにしてます
```swift
import SwiftUI

struct Hoge: View {
    @State var showModal = true
    
    var body: some View {
        modal
            .opacity(showModal ? 1 : 0)
            .scaleEffect(showModal ? 1 : 0)
            .rotationEffect(.degrees(showModal ? 0 : 30))
            .blur(radius: showModal ? 0 : 20)
            .offset(y: showModal ? 0 : 500)
    }
    
    var modal: some View {
        VStack {
            Button {
                withAnimation(.easeOut(duration: 10)) {
                    showModal = false
                }
            } label: {
                Text("閉じる")
                    .foregroundColor(.white)
            }
        }
        .frame(width: 300, height: 200)
        .background(
            RoundedRectangle(cornerRadius: 10)
                .foregroundColor(.blue)
        )
    }
}

struct Modal_Previews: PreviewProvider {
    static var previews: some View {
        Hoge()
    }
}
```

![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/4d094147-4c46-eaed-7c76-988ee5ba366d.gif)
Vue CLI と Vineの用途の違い

### Vue CLI

**Vue CLIは、Vue.jsアプリケーションの開発に必要な各種ツールを提供するCLI(Command-Line Interface)ツール**です。Vue.jsのプロジェクトを作成するためのテンプレートを提供し、開発に必要なWebpackの設定やBabelの設定なども自動的に行ってくれます。また、Vue.jsのアプリケーションをビルドするための機能も提供しています。Vue CLIは、Vue.jsアプリケーションの開発全般に使用されるツールとなります。

### Vite

一方、**Viteは、Vue.jsアプリケーションの開発時に必要な開発サーバーとビルドツールを提供するツール**です。開発時には、高速で軽量な開発サーバーを起動することができ、開発中のVue.jsアプリケーションの変更を即座に反映させることができます。また、ViteはVue.jsアプリケーションを効率的にビルドすることができます。Viteは、主にVue.jsアプリケーションの開発時に使用されるツールとなります。

つまり、Vue CLIはVue.jsアプリケーションの開発に必要なツールを提供し、ViteはVue.jsアプリケーションの開発時に必要な開発サーバーとビルドツールを提供するツールとなります。Vue CLIとViteは、共通の目的を持っていますが、それぞれ異なる用途を持っています。
#1 作成手順(予定・仕様等)(ハンドジェスチャーでドローンを操作する)

このシステムの作成手順(予定・仕様等)を記していきます。

使用する機材
・パソコン(Ryzen5 16GB Win11)
・Webカメラ(パソコンに搭載されていれば要らない)
・ドローン(DJI Tello )
・Arduino

使用する技術
・Python	→機械学習をするため
・C/C++	→Arduinoで超音波センサを使用するため
・ライブラリ多数(それぞれの記事で記載する予定)

今回作成するシステムはハンドジェスチャーに意味を持たせてそれにあったドローンの操作を行うといった物となっている。それに伴い必要となってくるソフトを作成していきます。

・データ収集
データ収集を行うがそれを学習モデルに流す際に今回はCPUで学習させることも考えると入力値は小さい方がいいと考える。

・データ学習
　「#0 リベンジ」でも記載したがConv2D層を使用するが重ね過ぎる最終システムの時に重くなるので調整が必要

・学習モデルを搭載させたシステム←目標システム

#2ではデータ収集器を作成していきたいと思います。
可変のSF Symbolsを使いこなす

値によって塗りつぶされ具合が変わるシンボルがちょこちょこあるので、これを使ってアニメーションを作ってみる

10%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/c72a0925-92fb-94a1-9930-943c3addfcc3.png)

80%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/f7284ea6-6b1e-ae35-1013-e9f90b3136f0.png)

Imageに`variableValue`を渡すと、可変シンボルであれば、その数値によって塗りつぶされ具合が変わってくれる
```swift
import SwiftUI

struct Hoge: View {
    var body: some View {
        Image(systemName: "timelapse", variableValue: 0.2)
            .imageScale(.large)
            .font(.system(size: 200))
    }
}

struct Modal_Previews: PreviewProvider {
    static var previews: some View {
        Hoge()
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/4ca53d25-73bd-89a5-127d-d36a8f6732e1.png)

あとはこの数値を時間経過で増減させればOK
```swift
import SwiftUI

struct Hoge: View {
    @State var time = 0.0
    let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        Image(systemName: "timelapse", variableValue: time)
            .imageScale(.large)
            .font(.system(size: 200))
            .onReceive(timer) { value in
                if time < 1.0 {
                    time += 0.1
                } else {
                    time = 0.0
                }
            }
    }
}

struct Modal_Previews: PreviewProvider {
    static var previews: some View {
        Hoge()
    }
}
```
![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/d3a0a42b-ae22-618b-5ead-e4fbb3a50cb0.gif)
[vue3] 状態管理ライブラリ Pinia の魅力

### Piniaとは

[Pinia](https://pinia.vuejs.org/ "‌")は、Vue.js 3向けの状態管理ライブラリです。Vue.jsでは、状態を管理するためにVuexが提供されていますが、PiniaはVuexとは異なるアプローチを取っています。Piniaは、Vuexと同様に、アプリケーションの状態を中央で管理することができますが、Vuexがオプションベースであるのに対して、PiniaはVue.jsのコンポジションAPIを使用して宣言的に状態を定義することができます。

Piniaの魅力は、以下のような点にあります。

### TypeScriptによる型セーフ

Piniaは、TypeScriptによる型安全性があります。つまり、アプリケーションの状態管理に関するすべての操作が、静的に型チェックされます。これにより、状態管理のコードの品質が向上し、バグが減ります。

### シンプルなAPI

PiniaのAPIは、非常にシンプルで直感的なものです。これにより、状態管理に関するコードの記述が簡単になります。また、Vue.jsのコンポーネントに簡単に統合できるため、アプリケーション全体の開発効率が向上します。

### 高度な機能

Piniaは、さまざまな高度な機能を提供しています。たとえば、アプリケーションの永続性をサポートするプラグインや、非同期アクションを処理する機能などがあります。これらの機能を使用することで、アプリケーションの開発効率が向上し、より高度な機能を実現できます。

### パフォーマンス

Piniaは、Vue.js 3のリアクティブシステムをベースにしており、パフォーマンスが非常に高いことが特徴です。また、フック機能を提供することで、状態の変更をトラッキングすることができます。これにより、無駄な再レンダリングを防止し、アプリケーションのパフォーマンスを向上させることができます。

以上のような点が、Piniaの魅力であり、Vue.js開発者にとって非常に魅力的な状態管理ライブラリとなっています。
電子メールを処理するソフトウェア

●電子メールを処理するソフトウェアには以下の3つがある

・MUA(Mail User Agent)
ユーザがメールを送受信するためのプログラム。
作成されたメッセージはSMTP（Simple Mail Transfer Protocol）を使用してMTAに渡されます。また、メールを受信する際はPOP（Post Office Protocol）やIMAP(Internet Message Access Protocol)を使用。

・MTA(Message Transfer Agent)
メールの配信と受信を行うプログラム。
MTAは受信したメールが自サーバ宛のメールかどうかを判別します。自サーバ宛のメールはMDAへ渡し、自サーバ宛ではないメールは他のMTAに転送。転送先のMTAはDNSサーバに問い合わせ（MXレコードを参照）して決めます。MTA間のメールの送受信はSMTPを使用。

・MDA(Mail Delivery Agent)
自サーバにあるMTAから受信したメールを、それぞれのユーザのメールスプールに配送するプログラ
Azure の無料アカウントで使えるサービス一覧


Azureにログインが必要なのですがAzureの無料アカウントに含まれるサービス一覧は以下で確認することができます。
[Free Services一覧](https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade?WT.mc_id=modinfra-0000-thmaure)

B1s（1vCPU, 1GB Memory, 4 GB SSD）の最小構成ですがVMも750H無料で使えます。アプリケーションを動かす手段としてAzure App ServiceもF1プランが使えるので個人目的で簡単に検証してみたいときには活用できそうです。
Next.jsで現在地周辺のジムとサウナを検索できるサイトを作りました。(PWAにしています)

今回、現在地周辺のジムとサウナを同時に表示できるマップサイト作成しました。

作った理由としては、自分自身がジムで筋トレしたり銭湯やサウナに言って疲れを癒したりするのが好きで作成しました。 このアプリの長所としては3つあります。

1.従来のグーグルマップより表示数が多い →Google Map API を使用してジムとサウナで限定しているため

2.いちいち検索かける手間が減る。 →自分自身、かなりのめんどくさがりなので、正直この機能は気に入っています。

3.PWAにしているので普通のMAPサイトと比べて操作性が良い →最初はNetlifyで公開していて操作していましたが、とても操作性が悪かったので、PWAにして操作性を向上させため、操作性はかなりいいです。 　実際に自分はジムや銭湯を探すときはこのサイトを利用することが増えました。

PWAと簡単に言うとスマホアプリのようなウェブサイトで従来のウェブサイトより、以下のようなメリットがあります。

● Android・iOSのどちらでもOK
● ストアに申請する必要がない
● ホーム画面にアイコンを設置できる
● 表示速度が優れている

つぎの画像のようにアプリとしても利用できます。Safariならホーム画面に追加とすると、アプリのように利用できます。

![Screenshot_20230421-175517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334713/a45536d3-45d2-74ae-46b8-e8f891ba667b.png)

![Screenshot_20230421-235014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334713/1190a9b8-b56c-24c7-ea90-3b62092cd325.png)


詳しいPWAの説明は以下のリンクが分かりやすいので共有します。
https://www.profuture.co.jp/mk/column/45348#:~:text=PWA%E3%81%A8%E3%81%AF%E3%80%81Web%E3%82%A2%E3%83%97%E3%83%AA,%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

以上がアプリの説明です。記事を見ていただきありがとうございました。

最後に使用技術を説明していきます。

・Next.js 
・Google Map API

ソースコード
https://github.com/kaede-hub/hurokinniku/blob/main/README.md
モダンなWebアプリを素早く作ることができる Vite の魅力

[Vite](https://github.com/vitejs/vite "‌")の魅力は、以下のような点にあります。

### 高速な開発サーバー

Viteは非常に高速な開発サーバーを提供しています。この開発サーバーは、Hot Module Replacement（HMR）を使用しており、ファイルを変更するたびにリアルタイムでビルドし、変更内容をブラウザに反映することができます。

### ゼロコンフィグレーション

Viteは、ゼロコンフィグレーションのアプローチを採用しています。つまり、追加の設定ファイルなしで、Vue.jsやReactなどのフレームワークをすぐに使用できるということです。

### 高速なビルド

Viteは、Rollup.jsをベースにしているため、非常に高速なビルドを提供しています。また、ES modulesを使用しているため、ツール自体が最適化されており、必要なコードのみをバンドルすることができます。

### プラグインシステム

Viteは、プラグインシステムを備えています。このプラグインシステムを使用することで、Viteの機能を拡張し、さまざまな機能を追加することができます。

以上のような点が、Viteの魅力であり、Vue.js開発者にとって非常に魅力的なツールとなっています。
UnityプロジェクトをGitHubで共有する方法（私用備忘録）

# GitHubのレポジトリをつくる
- [GitHub Desktopをインストールする](https://desktop.github.com/)
- GitHub Desktopで新しいローカルレポジトリを適当な場所に作成する
このとき、gitignoreからunityを選択する
- publish repositoryを選択する
このとき、keep this code privateのチェックを外してから実行する

# Unityのプロジェクトをアップロードする
- Unityの新規プロジェクトを、先ほどローカルレポジトリを作成したディレクトリで作成する
- GitHub Desktopを開くと変更が追加されているので、summaryに適当な名前を付けてcommit to mainを実行する

# Unityのプロジェクトをダウンロードする
- GitHubにアップロードされたファイルを「code」→「download ZIP」を実行
- ダウンロードしたZIPファイルを展開する
- Unity Hubを開いて「開く」→「ディスクから加える」を選択
- 先ほど展開したファイルが格納されているディレクトリを選択してプロジェクトを開く
再利用性可能なPandasコードの書き方

# TL;DR
- 書き下しが多いPandasにおいても頻出のパターンは存在
- メソッドチェーンを使って書くことで過去の資産を再利用
- よく使う処理は関数化して、pipeやapplyで適用

# 背景
データフレームとして有名なPandasはデータ分析やエクセルの代わりとして使われており、書き捨てられるコードばかりですが、意外と以前書いたことがあるコードに時間を割きがちです。 　
この記事では再利用可能性の観点から良いコーディングパターンを紹介します。  

## よくあるコード

![スクリーンショット 2023-04-21 22.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338264/0eaf5ab5-075f-84b3-4f79-8ccd32564005.png)
これを下記のようにするのがこの記事の目標
![スクリーンショット 2023-04-21 22.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338264/05eb8b02-7092-f3d7-6fa7-e041ac0cb325.png)


# 再利用のためのテクニック
## メソッドチェーンを使う
メソッドチェーンを使うことで、pandasの加工を構造的に行うことができます。  
```python 
df = (
    pd.read_csv('2016-2017_orig.csv', sep=";") #データセット読み込み
    .assign(upset_factor=lambda _df: # upset factorの計算
            vect_upset_factor(_df["rating_1"], _df["rating_2"], _df["player1_is_win?"]))
    .assign(num_of_set=lambda _df:_df.result.apply(lambda x: x.count("-"))) # セットカウント
    .loc[lambda _df:_df["rating_1"] <= _df["rating_2"]] # 選手1が常にレート上位になるように
    .loc[lambda _df: _df["age_1"]<= 25] # どちらの選手も25歳以下
    .loc[lambda _df: _df["age_2"]<= 25]
    .sort_values("upset_factor", ascending=False) # upsetfactorでソート
    .head(10)
)
```
上記のように、1行ごとに動作が規定されている順に読んでいくことで、何をしたいのかわかりいです。
また、すべての行が`lambda _df`で始まっており、名前がバインドされていないため、データフレームの名前が変わった場合においても問題なくコピペ等により再利用可能です。
また、メソッドチェーンを用いることによって途中の変数が必要なくなり、実行時間の高速化も期待できます。 

チェーンしすぎると読むのが難しくなるので、適度に関数化や分割しておく必要はあります。 

### メソッドチェーンを使う際に便利な関数 
| 関数名         | コメント             |
| ----------- | ---------------- |
| .loc         | コラムの絞り込みや、条件絞り込み |
| .assign      | 新しいコラムの挿入        |
| .sort_values | ソート              |
| .pipe        | 関数の適用            |
| .query       | 条件絞り込み           |
| .drop        | コラムの削除           |



## よく使う処理は関数化する 
ここではランキング下位の選手が上位の選手人勝ったときに高い数値になるupset factorというものを計算しており、この計算が頻発するものとします。 
その場合は、下記のように関数化しておくと便利です。関数化するときは、テストしやすいように数値などを直に変数に持っておき、その後で、`np.vectorize()`で関数をnumpy行列で呼び出せるようにしておくことによって、テスト効率と呼び出しの際の利便性を担保できます。
各変数にnumpy配列を入れて計算します。`vect_upset_factor(df["rating_1"], df["rating_2"], df["player1_is_win?"])`
```python
import bisect
def calculate_upset_factor(rate_1, rate_2, reverse):
    rate = [2**i for i in range(0,11)]
    rate_1_factor = bisect.bisect_right(rate, rate_1)
    rate_2_factor = bisect.bisect_right(rate, rate_2)
    if reverse:
        return rate_1_factor/rate_2_factor
    else:
        return rate_2_factor/rate_1_factor
vect_upset_factor = np.vectorize(calculate_upset_factor)
```


また、upsetfactorを計算して元のデータフレームに足すという動作自体が頻発するケースでは、`pipe`関数を挟むとより再利用しやすくなります。 
```python
def upset_factor_pipe(_df, col1="rating_1", col2="rating_2", rev_col="player1_is_win?"):
    return _df.assign(upset_factor=lambda _df: 
            vect_upset_factor(_df[col1], _df[col2], _df[rev_col]))
(
    pd.read_csv('2016-2017_orig.csv', sep=";")
    .pipe(upset_factor_pipe, "rating_1", "rating_2", "player1_is_win?")
)
```

# まとめ 
pandasであっても普段から構造化と再利用可能性を意識してコードを書くと、思ったよりも効率化できるので、ぜひ試してみてください。 
今回の記事では再利用性にのみ着目していますが、高速化するためのテクニックもあるので、うまく構造化しつつパフォーマンスを意識したコードがかけるとより良いと思います。
Ruby on RailsでJavaScriptのファイルを読み込む方法

<h1>・用意するファイル</h1>
・JavaScriptのファイル<br>
・html.erbファイル

<h1>・やること</h1>
まずJavaScriptのファイルを`アプリ名/app/javascript`に置く。

そしてhtml.erbファイルの<html>タグ内に
`<%= javascript_include_tag '読み込みたいJSのファイル名' %>`を入れる。

```Ruby:html.erb
<!DOCTYPE html>
<html>
#ここがJavaScriptを読み込むコード
<%= javascript_include_tag '読み込みたいJSのファイル名' %>
~~~~
</html>
```

これで読み込むことができる。

javascriptフォルダの中で任意のフォルダに入れたい場合は
`<%= javascript_include_tag '任意のフォルダ名/読み込みたいJSのファイル名' %>`
と書くことによってフォルダわけができる。

```Ruby:html.erb
<!DOCTYPE html>
<html>
#ここがJavaScriptを読み込むコード
<%= javascript_include_tag '任意のフォルダ名/読み込みたいJSのファイル名' %>
~~~~
</html>
```
[初心者向け] typescript の魅力

typeScriptはJavaScriptの拡張言語で、静的型付けやクラスベースのオブジェクト指向プログラミングなど、JavaScriptにはない機能を提供することで開発者にとって多くのメリットをもたらします。以下に、TypeScriptの魅力を初心者にもわかりやすく説明します。

### 静的型付け

TypeScriptは静的型付けをサポートしており、変数の型を事前に定義できます。これによって、コンパイル時に型エラーを検知できるため、実行時に起こるエラーを事前に防ぐことができます。また、コードの保守性が向上し、コードの品質を高めることができます。

### エディタの補完機能

TypeScriptは静的型付けによって、エディタの補完機能を活用することができます。変数の型が定義されている場合、エディタはその変数が持つプロパティやメソッドを予測して補完してくれます。これによって、開発者のタイプミスやメソッドの呼び出しのミスを防止し、開発の効率を向上することができます。

### オブジェクト指向プログラミング

TypeScriptはJavaScriptよりもクラスベースのオブジェクト指向プログラミングをサポートしています。これによって、コードの再利用性や拡張性を向上することができます。また、インターフェースやジェネリックスなどの機能を使うことで、柔軟なプログラミングが可能になります。

### JavaScriptとの互換性

TypeScriptはJavaScriptの拡張言語であり、JavaScriptの構文やライブラリをそのまま使用できます。また、TypeScriptのコードはJavaScriptに変換できるため、既存のJavaScriptプロジェクトにも導入しやすいというメリットがあります。

以上が、TypeScriptの魅力です。TypeScriptを使うことで、コードの品質を高め、開発の効率を向上することができます。また、JavaScriptの拡張言語であるため、既存のJavaScriptプロジェクトにも導入しやすいというメリットがあります。
ViveXRElite をunityで右目左目別々のものを映す方法

0.導入
WAVESDKのVRRigにはカメラが一つしかありません。
もちろんカメラが1つでも標準的な使い方であれば視差は自動で表現されます。
ですが、このままでは右目と左目に手動で別々のものを映すトリッキーな使い方が出来ません。

1.結論
カメラをRig内に一個追加して
MainCameraのTagetEyeをbothから映したいright/leftに設定して
追加したカメラのTargetEyeを上で設定した反対側left/rightに設定しましょう。

それからオブジェクトレイヤーにrightとleftを追加して
カメラのマスクでleft/rightがそれぞれ映らないようにチェック外しておいてください。

確認のために適当なCubeを同じ場所に置いてそれぞれright/leftレイヤーにして
赤と緑にでもしておいてください。

ViveXRElite被って右目と左目で違う色が見えてれば成功です。

2.注意
複数カメラ置いた時のデプスとかviewport rectとか弄っちゃダメです。
弄ったら追加したほうのカメラ描画がジャギってグリッチします。


これ見つけるのに一週間かかった。書いてるドキュメント一個もねえ！！！
righteye,lefteyeで分けといて欲しい。
カメラ二個用意してターゲットeye変えるだけとか気持ち悪くて使いにくい。