OmniAICreator/Qiita-1.07M huggingface dataset:
【第５回 キンドリルジャパン 伊藤雄哉さん】2024 Japan AWS Jr. Champions インタビュー企画

こんにちは！2024 Japan AWS Jr. Championsの[@yakisobapan](https://qiita.com/yakisobapan)です。

AWS Japanが6月に開催したAWS Summit Japanにて、2024 Japan AWS Jr. Championsが発表されました。Jr.Championsは、AWSを積極的に学び、アクションを起こし、周囲に影響を与えている若手エンジニア向けの表彰プログラムとなっております。Jr.Championsについて多くの方に知ってもらいたいため、表彰された方々にインタビューをしていきます。
第5回目は、キンドリルジャパンの伊藤雄哉さんです！

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

![clipped2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/e6ece3e4-f434-a90d-c55c-06ffc9c52579.jpeg)
# 質問１：これまでの経歴、現在の業務、AWSを知った経緯を教えてください。
2021年にIBMへ新卒入社後、同年9月にキンドリルとして分社化され、現在に至ります。
クラウドに限らず、プリセールスとしてお客様のIT方針の提案を行っております。中でも特に、AWSに関する提案活動やアーキテクトとしての業務を行っています。
AWSを知ったきっかけは、入社後研修において、クラウドサービスを用いた提案を行う際に、AWSを対象に選定し学び始めたことです。

# 質問２：Jr.Championsを目指した理由、選出につながったと考える活動があれば教えてください。
表彰プログラムを知った経緯は、社内でAmbassadorsに選出された方がおり、その方からJr.Championsプログラムを知りました。
身近にいたAmbassadorsに刺激を受けたことと、自身のキャリアアップ、スキルアップにつながると考えたためJr.Championsを目指しました。
プリセールスとしてAWSに関する提案を行っていく中で、案件実績を重ねたこと、社内のAWSコミュニティの運営・推進活動を中心として、アウトプットを積極的に行ったことが選出につながったと考えています。

# 質問３：Jr.Championsとして現在どのような活動をしていますか。
Jr.Championsに選出されたことで、AWSに関する業務依頼が増えたことです。
また、AWS Jamの開催を行いました。AWSの知識が少ない方向けの初級レベルから、ある程度知識がある方向けの中級レベルまで、スキル向上を手助けするイベントをリードしています。
加えて、来年以降のJr.Champions候補を育成する目的で、候補となるメンバーに向けて、アウトプットの機会を提供するような活動も行っています。
最近だと、他のJr.Championと共同で技術書の執筆を行っています！
[AWSへの冒険 クラウド移行のロードマップ - 技術書典マーケット](https://techbookfest.org/product/dhwqXi3GyBQvHNK7jpaAqF?productVariantID=mCSF8gJBULaKpQHi6NmJJx)


# 質問４：Jr.Championsに選出されてよかったことはありますか。
様々な面においてバイネームで声をかけてもらえることが増えました。
他のコミュニティ活動にも呼んでもらえるようになり、自身の認知度が上がったと感じています。
また、Jr.Championsの活動を通して、社外の方と交流することで、スキルアップにつながっていることもよかったと感じています。

# 質問５：Jr.Championsの活動で大変だったことはありますか。
声をかけてもらえることが増えたので、タスクが増えた時期はありました。
これは嬉しい悲鳴ですが（笑）
ただ、自身が興味のある分野なので、それを苦に感じることはないです！

# 質問６：今後の夢や目標はありますか。
大きく、以下2つがあります。
 - Top Engineers、Ambassadorsへと着実にステップアップしていくこと
 - 絶大な信頼をいただけるアーキテクトになること

# 質問７：Jr.Championsを目指す若手に向けてメッセージをお願いします。
Jr.Championsは、社外の若手エンジニアと関わることができる良い機会だと考えます。
選出に向けた準備は大変かもしれませんが、さらに上の表彰に向けた登竜門としては最適だと思います。AWSが好きな方は、ぜひ応募してください！

# 質問８：全体を通しての質問
## 好きなAWSサービスはなんですか。
AWS CDKです！
アーキテクトではあるものの、開発にも携わる機会があり、触っている中で好きになりました（笑）

## 枠が決まっている中で、社内でJr.Championsに選出されるにはどういった活動をされるのが良いと思いますか？
自身の強み、得意分野を活かして自発的に周りに影響を与えられるような活動をするのが良いと思います。
自分で何かしらリードをしていけるような方は、Jr.Championsとして活動していくのに適していると思います。


## 技術書のセールスポイントを教えてください！
クラウド移行を検討している方に向けて、移行時に考えるべき重要なポイントをピックアップして記述しています。
デベロッパー向けというよりは、これからクラウドを活用していきたいと考える方、またはクラウド利用者に向けて、クラウドの良さを知ってもらうという意図で執筆しているので、そこを踏まえて読んでいただけると良いかなと思います！

[AWSへの冒険 クラウド移行のロードマップ - 技術書典マーケット](https://techbookfest.org/product/dhwqXi3GyBQvHNK7jpaAqF?productVariantID=mCSF8gJBULaKpQHi6NmJJx)
# 最後に
伊藤さんは、アーキテクトとして培ったスキルを活かしてアウトプット活動を継続して行っている印象があります。
また、メンバー育成にも力を入れており、AWSの情報を発信する影響力も大きいと感じました。今後は、伊藤さんに憧れてJr.Championsを目指したという方も増えていくのではないでしょうか。
技術書についても、伊藤さんはじめ執筆メンバーのナレッジが集約されていて、とても勉強になりました。みなさんぜひご覧ください！

次回のインタビューもお楽しみに！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/11f43087-d1f2-2b67-da01-aae6bf890143.png)
GIHOZで同値分割テスト・境界値分析

# はじめに
GIHOZを用いて同値分割テスト・境界値分析を実践していきます.

# 同値分割
同値分割テストとは,**各同値パーティションから最低一つの代表値を選んで行うテスト**です.

その代表値には,範囲の中間値を選択することが多いです.

その他の代表地の選定方法として,
**デフォルトの設定値**や,**入力される頻度の高い値**などを選出します.

# 境界値分析
境界値分析とは,**仕様条件の境界となる値とその隣の値に対してテストを行うテスト技法**です.

境界値に着目するのは,**欠陥は境界に潜んでいる可能性が高い**からです．

# 同値分割テスト・境界値分析の例
以下の水族館の入館料金について,考えます.
この入館料金を判定する際の年齢を同値パーティションに分割し,境界値を求めていきます.

#### 水族館入館料
- 大人(16歳以上):2000円
- 小。中学生(7歳以上):900円
- 幼児(4歳以上):400円
- 乳児(4歳未満):0円

### 境界値
境界値は以下のように7つ考えられ,境界値分析の図は以下のようになります.
![スクリーンショット 2024-12-17 003441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/24647893-3357-af00-e6fe-acf21540375a.png)

### 境界値の追加
上図の場合,大人料金の上限値が明記されておらず,適切な上限値を定める必要があります.
また,負の数以下の値も考えるのが適当だと考えられるので,負の数以下の値も考えます.
すると,図は以下のように更新されます.
※無効同値パーティション(灰色)にするためには,「料金0円」などの名前を記入する箇所を右クリックすることで有効・無効の選択ができます.
![スクリーンショット 2024-12-17 010256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/cf19d06e-4753-4fb0-229d-83201ffa0601.png)


同値分割のテストケースは以下のようになります.
#### 同値分割
![スクリーンショット 2024-12-17 010333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/f17478ff-1904-5858-55ef-b0b7053e34fe.png)


境界値分析のテストケースは以下のようになります.
#### 境界値分析

![スクリーンショット 2024-12-17 010338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/74e90f15-c30c-6fda-a742-d48ecf29d094.png)


# 最後に
GIHOZを用いることで,境界を示した図を作るだけでなく,考えるべきテストケースも示してくれました.

ただ,一度最小値や最大値を定義した後に,それらを変更することができないことは不便に感じました.

次回は状態遷移テストについて実践していこうと思います.
HaskellでProjectEuler解いてみたら遅延評価の有り難みわかった

今回解いたProjectEulerの問題は45番の[こちら](https://projecteuler.net/problem=45)！
三角数、五角数、六角数のうち40755の次に共通する数を求める問題。

わたしのコードはこちら！
三角数、五角数、六角数の無限リストを定義。
あるリストの第一要素を他の2つのリストの第一要素を比べて、どちらかよりも値が小さかったらそのリストを前に進め、前に進めたリスト・２つのリストに対してもう一回調べる、という再帰的なgetCommon関数を定義。説明が下手😭

```Haskell: 45.hs
triangles :: [Int]
triangles = [n*(n + 1) `div` 2 | n <- [1..] ]

pentagonals :: [Int]
pentagonals = [n*(3*n - 1) `div` 2 | n <- [1..] ]

hexagonals :: [Int]
hexagonals = [n*(2*n - 1) | n <- [1..] ]

getCommon :: [Int] -> [Int] -> [Int] -> [Int]
getCommon (x:xs) (y:ys) (z:zs) 
    | x == y && y == z = x : getCommon xs ys zs
    | x < y = getCommon xs (y:ys) (z:zs)
    | y < z = getCommon (x:xs) ys (z:zs)
    | otherwise = getCommon (x:xs) (y:ys) zs

main :: IO ()
main = do
    let common = take 3 $ getCommon triangles pentagonals hexagonals
    print common
```

（ちなみに解答は1533776805）
```sh:
=> [1,40755,1533776805]
```

必要な値が参照されたときに初めて計算されるという特徴 遅延評価を活かして、効率良く解を求められている！😳（他の言語だと無限リスト作れなかったり、全部計算する必要があるから計算効率が悪かったりする）
すごい！！！！個人的革命😳❤️‍🔥
初めて技術書の誤植を報告する時に気をつけたこと

# きっかけ
ハンズオンで学べる書籍を試していたところ、エラーに遭遇。
何度か確認するもエラーは解消せず、書籍の誤植である可能性が高いと判断した。
筆者のGitHubリポジトリにあるコードを確認すると、書籍と差異があった。

# やったこと
* 書籍の出版社の公式サイトに行き、正誤表が公表されていないか確認
* 特に正誤情報がなかったため、お問い合わせフォームより連絡
* 問い合わせ文章には下記項目を記載
  * 書籍のタイトル
  * ISBNコード
  * 誤植のあるページ
  * 版数(初版第1刷だった)
  * エラー文章
  * 想定される正誤表

# 感想
個人的に気づきがあったのでブログにしてみました。
いつもたくさんの書籍で学ばせてもらっているので、こうした小さなことでも貢献できたら嬉しいです。
2024年のやらかしたこと

# はじめに
やらかしたことを紹介します
誰かが今後気を付けるきっかけになれば…

---

# やらかし1
## chownでrootディレクトリ以下のユーザーをすべて変えてしまった
多くの人がやったことあるやらかしですが、私もやりました
あっと思った瞬間は時すでに遅し
慢心NO

### やらかしコマンド
```shell
$ sudo chown –R myuser:mygroup / 
```
### やろうとしていたこと
```shell
$ sudo chown –R myuser:mygroup ./
```

### 言い訳(なぜ起こったのか)
1. リモート接続しており、ネットワークが重かった。そのため`./`と入力したつもりが、`.`が認識されず`/`になってしまった
1. 惰性でコマンドを叩いていた
    1. メモ帳にコマンド書いてコピペでコマンドを張り付けていなかった
    1. 画面に反映されるまで時間がかかっているのにも関わらす、入力されたコマンドを確認せずに、enterを押してしまった
    

### その後の対応
1. 上司に報告
1. rootユーザーで作業していたのでそのまま、以下を最低限出来るように復帰(関連ファイルのユーザーをroot:rootに戻す)
    * sudo
    * su
    * ssh 
<details>
<summary>コツ</summary>

```shell
$ systemctl start ssh
```
など行うと、どのファイルが原因で起動できないか教えてくれる場合がある
起動しても他のサーバーからsshできること、その後sudo,suができることを確認しないうちはログアウトしてはいけない

また、Sticky bitが変わってる場合もあるのでそこも確認

</details>

3. サーバー管理してる部署に謝罪して復帰のお願いをする


### 救われたポイント
* 検証サーバーだった
* リモートサーバーだったので復帰がしやすかった

### 再発防止策
* rootユーザーで作業しない
* `./`や`.`から始まる引数を指定しない
* どうしても上記で作業が必要な場合はメモ帳にコマンド書いてからコピペで貼り付ける
* できるのならサーバー破壊コマンドはエイリアスを設定する

 ### 同じことをやらかしてしまったら
 * 焦ってexitしない
     * rootユーザーで作業していたら助かる可能性があるため
 * 上司に報告
     * スピード命。引き延ばした分だけ取り返しがつかなくなるので、早く報告
 * チームメンバーや同じサーバーを使っているチームにrootユーザーで作業している人がいないか探す
     * 自分がrootで作業していなくても他の人がrootで作業していたら助かる可能性があるため

# やらかし2
## Ansibleでパーミッション指定を数字三桁で記載した
弁解の余地もございません

### やらかし
```
- name: Change file ownership, group and permissions
  ansible.builtin.file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 644
```

### 正しい記載
以下のどれかでmodeを指定
```
    mode: '0644'
    mode: 0644
    mode: '644'
    mode: u=rw,g=r,o=r
   
```

### 間違った指定方法だとどうなるのか
以下のようなパーミッションになった
```
--w----r-T   1 foo foo
```

### 間違った理由
* 公式ドキュメントを読んでいなかった

### 助かったポイント
* パーミッション変更したあとに、確認するタスクを入れていたので気づけた

# さいごに
間違えないことが大切ですが、どれだけ気を付けてても間違ってしまうことはあります
間違いに気付ける機会をつくる事と、間違ったときに何とかできるスキルも大切だと思いました
持ち物の概念をつくる　その5-1

「VキャスのVCIで◯ine◯raftっぽいもの作る Advent Calendar 2024」13日目

Vキャス内で、穴を掘って、石を砕き、木を切って、組み合わせて武器を作って、何なら出てくる敵を倒して・・・
そんなことをやりたいなぁっていう試みを12月でできるところまで行こうというカレンダーの13日目です！

情報表示板を持ち運べるようになったので、アイテムを受け取るという処理を今日は書いていきます。

# 持ち物の概念をつくる　その5

土と石と木のVCIの処理を変更していきます。
今までは、連続で叩いたら運べるようになるという処理にしていましたが、持ち運ぶというのは情報表示板VCIに任せて、設置するブロック自体の実態は、土と石と木のVCIに任せます。
2つのVCIでメッセージのやり取りをするという実装を考えます。

手順は以下の通り
① 持ち運ぶブロックを情報表示板VCIに追加
② 土と石と木のVCIから持ち運ぶブロックを削除し、回収用ブロックを追加
③ 土と石と木のVCIのコードを変更
④ 土と石と木のVCIにメッセージ送信記述を追加
⑤ 情報表示板VCIにメッセージ受取り記述を追加

今日は①と②をやります。

# 手順
## ① 持ち運ぶブロックを情報表示板VCIに追加

UnityからVCToolkitを開きます。
情報表示板のVCIをHierarchyで開き、Cubeを追加します。

Cubeの名前は、動かすためのブロックなので「move_block」としました。
また情報表示板の眼の前に出てくれれば掴みやすそうなので、情報表示板の正面に配置しました。
Grabbableにチェックを入れ、Use Gravityのチェックは外し、Is Kinematicにはチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/31d0d548-4f5a-1291-7a02-2dc77747d26a.png)

更に、ブロックの種類によって色を変えたりしたいので、専用のマテリアルを作成しておきます。
Assetsの領域で右クリックし、CreateからMaterialを選択してマテリアルを作成しました。
こちらの名前もわかりやすいように「move_block」として、Cubeにつけておきます。

ここまでやったら情報表示板VCIは再度VirtualCastに投稿し直しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/c4210923-fdd0-583e-2d7b-5015a7e2ec4f.png)


## ② 土と石と木のVCIから持ち運ぶブロックを削除し、回収用ブロックを追加
土と石と木のVCIにも変更を施します。
`_move`がつくブロックを、10個だけ残して消します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/0923776b-46ed-cf99-b3f9-5e22ecb5141f.png)
残した10個も動かすためではなく、触れたら回収できるというものにするので、`collect_block`に名称変更して、ナンバリングを1~10とつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/bd3a6c0d-696d-b35b-d6ed-c10828588e78.png)

また、掴めないようにするので、Grabbableのチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/91614387-76ed-1404-6a0a-28a5fd2a9396.png)

また、これらブロックは実態のブロックと1：１の数ではなくなったので、マテリアルの色を都度変えたりします。
そこで、マテリアルもブロックと同じ名前のものを合計10個作って同じ名前をつけて、同じ名前のブロックにつけておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/2d10c39a-7415-528a-1bed-bb06ec19b061.png)

ここまでできたら、土と石と木のVCIも再度VirtualCastに投稿し直しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222644/fac682ad-38e4-c7f0-dd3d-556e1be472e2.png)

# 終わりに
オブジェクト本体の変更はこれで終わりなので、明日はコードの変更を書いていきます。
VoIPとSIPを通じてRustを勉強する：RTCP作成編２(共通部作成パーサ編)

# はじめに
本記事は自分のためでしかないアドベントカレンダー2024の記事です。
記事は２５記事書くと思いますが期待はせずにお願いします

# RTCPパーサ
本日はRTCPのパーサを作っていきます
プロトコルは前日までのブログを見てください。

# パーサ
~~~
struct RtcpPacketParser<'a> {
    rtp_packet: &'a [u8],
}

impl<'a> RtcpPacketParser<'a> {
    pub fn new(rtp_packet: &'a [u8]) -> Self {
        let retval = RtpPacketParser {
            rtp_packet: &rtp_packet,
        };

        return retval;
    }

    fn version(&self) -> u8 {
        return self.rtp_packet[0] & 0b0000_0011;
    }

    fn padding(&self) -> u8 {
        return self.rtp_packet[0] & 0b0000_0100;
    }

    fn rc(&self) -> u8 {
        return self.rtp_packet[0] & 0b1111_1000;
    }
    fn pt(&self) -> u8 {
        return self.rtp_packet[1];
    }
    fn sequence_number(&self) -> u16 {
        return u16::from_be_bytes(self.rtp_packet[2..4].try_into().unwrap());
    }
}
~~~
以上です
グラフラプラシアン行列とは？

グラフラプラシアン行列（Graph Laplacian）は、グラフ理論やデータ解析、機械学習の分野で頻繁に使用される重要な概念です。グラフ構造に関連付けられた行列であり、クラスタリングやグラフ信号処理、ネットワーク分析などで活用されます。

## グラフラプラシアン行列の定義

グラフラプラシアン行列は、与えられた無向グラフに対して構築される行列で、以下の式で定義されます。
$$L = D - A$$

ここで、

- **L: グラフラプラシアン行列 ** 
- **D: 次数行列（Degree Matrix）**  
  グラフにおける各頂点の次数を対角成分に持つ行列です。  
- **A: 隣接行列（Adjacency Matrix）**  
  グラフにおける辺の接続関係を表す行列です。

### 隣接行列Aの定義

無向グラフ$G = (V, E)$ の隣接行列Aは次のようになります。
```math
A_{ij} = 
\begin{cases}
1 & (i, j) \in E \\
0 & (i, j) \notin E
\end{cases}
```

ここで E はグラフのエッジ集合、V は頂点集合です。

### 次数行列Dの定義

次数行列 \(D\) は、以下のように対角行列で表されます。

$$
D_{ii} = \text{deg}(v_i)
$$

ここで $\text{deg}(v_i)$ は頂点 $v_i$ の次数（隣接している辺の数）を表します。

これらを用いることで、

$$
L = D - A
$$

が得られます。

---

## グラフラプラシアン行列の性質

### 1. 固有値とクラスタリング
グラフラプラシアン行列の固有値や固有ベクトルは、グラフのクラスタリングや分割に関連しています。特に、**スペクトルクラスタリング**に用いられます。

- スペクトルクラスタリングでは、固有ベクトルを用いてデータポイントをクラスタに分けることができます。

### 2. スペクトルギャップ
固有値の間にあるギャップ（スペクトルギャップ）も、グラフ分割の性質を示します。これにより、グラフの分断やクラスタリングの精度を解析できます。

### 3. 非負定値性
グラフラプラシアン行列 \(L\) は常に非負定値行列です。そのため、固有値がすべて非負であるという性質があります。

### 4. 連結性との関係
グラフが連結である場合、Lの固有値の最小値は0となります。つまり、
$$
\lambda_0 = 0
$$

が成り立ちます。そして、固有値0の数は連結グラフの個数を表します。

---

## 応用例

### 1. スペクトラルクラスタリング
グラフラプラシアン行列の固有ベクトルを用いて、データをクラスタリングする手法です。特に、隣接関係があるデータポイント群を分割するのに適しています。

### 2. ネットワーク分析
ソーシャルネットワークや通信ネットワークの解析において、ラプラシアン行列を使用することで、ネットワークの構造や中心性の評価が可能になります。

### 3. グラフ信号処理
グラフ信号処理では、ラプラシアン行列を用いて信号解析やデータ処理を行います。例えば、信号のノイズ除去やデータ圧縮に使用します。
DXライブラリとC++を使ったゲーム制作1　Scene.hの下地

今日から一か月半くらいの時間をかけてアクションシューティング2Dゲームを制作していこうと思います。題名はまだ決めていませんが美少女が銃火器をぶっ放す系のゲームにしていこうと思います。使用するのはDxLib.vc140です。
今回はゲームプレイシーンの下地を投稿しておきます。

class GameplayScene
{
public:
    //定数などを入れる場所
private:
    //データメンバを入れる場所
public:
	// コンストラクタ
	GamePlayScene();

	// デストラクタ
	~GamePlayScene();


// 操作
public:
	// 初期化処理
	void Initialize();

	// 更新処理
	void Update(const GameLib::InputDevice& inputDevice);//インプットデバイスでキーボードを使えるようにしておく

	// 描画処理
	void Render();

	// 終了処理
	void Finalize();

 }

しっかりコメントを書いておいたほうが後々助かると思います。
VoIPとSIPを通じてRustを勉強する：RTCP作成編２(共通部作成)

# はじめに
本記事は自分のためでしかないアドベントカレンダー2024の記事です。
記事は２５記事書くと思いますが期待はせずにお願いします

# RTCPパーサ/ビルダ
本日はRTCPのビルダを作っていきます
プロトコルは前日までのブログを見てください。
(12/17追記：wipなのでご注意ください)

# コード
~~~
pub struct RtpBuilder<'a> {
    version: u8,
    padding: u8,
    rc: u8,
    pt: u8,
    length:u16,

impl<'a> RtpBuilder<'a> {
    pub fn new() -> Self {
        RtpBuilder {
            version: 0,
            padding: 0,
            rc: 0,
            pt: 0,
            length:0,
        }
    }
    fn version(mut self, version: u8) -> Self {
        self.version = version;
        self
    }
    fn padding(mut self, padding: u8) -> Self {
        self.padding = padding;
        self
    }
    fn rc(mut self, marker: u8) -> Self {
        self.marker = marker;
        self
    }
    fn pt(mut self, payload_type: u8) -> Self {
        self.payload_type = payload_type;
        self
    }
    fn length(mut self, sequence_number: u16) -> Self {
        self.sequence_number = sequence_number;
        self
    }


    fn build(&self, rtp_packet: &mut [u8]) {
        rtp_packet[0] = self.version;
        rtp_packet[0] |= self.padding << 2;
        rtp_packet[0] |= self.rc << 3;
        rtp_packet[1] = self.pt;
        rtp_packet[2..4].copy_from_slice(&length.to_be_bytes());
        }
    }
}

~~~

# 終わりに
記事が手抜きになっていますね。。。
仕事が炎上しているので。。。
土日に記事執筆がんばります。。。
なんとか25記事書きたい。。。
event.stopImmediatePropagation() について

# はじめに
[現代の JavaScript チュートリアル](https://ja.javascript.info/)を読んでいる時に`event.stopImmediatePropagation()`という見慣れないイベントを見かけたので、今回はそれについて調べてみました。

## `event.stopImmediatePropagation()`とは

> stopImmediatePropagation() は Event インターフェイスのメソッドで、呼び出されている同じイベントの他のリスナーを抑止します。
>
>同じ要素で、同じ種類のイベントに複数のリスナーが装着されている場合、追加された順番に呼び出されます。もし、そのような呼び出しの最中に stopImmediatePropagation() が呼び出された場合、残りのリスナーは呼び出されなくなります。

https://developer.mozilla.org/ja/docs/Web/API/Event/stopImmediatePropagation

`stopPropagation()`とかなり似たように思えますが、`stopPropagation()`とは決定的な差があるようです。

「stopPropagationはバブリング(親要素のイベントハンドラ実行)を止める」に対し、「stopImmediatePropagationはバブリングを止め、かつ現在の要素で登録されている他のハンドラの実行もさせない」ということです。

参考に、簡単な例をCodePenで作成したのでみていきましょう

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="bNbgBZg" data-pen-title="stopImmediateProp" data-user="hikagami0210" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hikagami0210/pen/bNbgBZg">
  stopImmediateProp</a> by hikagami (<a href="https://codepen.io/hikagami0210">@hikagami0210</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<details><summary>長いのでコードは折りたたみます</summary>

```js
// 背景
const base = document.getElementById("base");
base.addEventListener("click", () => alert("baseのクリックイベント"));

// nomalのボタン
const btn = document.getElementById("noStop");
btn.addEventListener("click", () => alert("normalのクリックイベント"));

// stopPropagationのボタン
const stopPropBtn = document.getElementById("stopProp");
stopPropBtn.addEventListener("click", (event) => {
  event.stopPropagation();
  alert(`stopPropagationのクリックイベント`);
});
stopPropBtn.addEventListener("click", () =>
  alert(`stopPropagationのクリックイベント 2`)
);

// stopImmediatePropagationのボタン
const stopImmediatePropBtn = document.getElementById("stopImmediateProp");
stopImmediatePropBtn.addEventListener("click", (event) => {
  event.stopImmediatePropagation();
  alert(`stopImmediatePropagationのクリックイベント`);
});
stopImmediatePropBtn.addEventListener("click", (event) => {
  event.stopImmediatePropagation();
  alert(`stopImmediatePropagationのクリックイベント 2`);
});
```

</details>

nomalのボタンは背後のbaseまでクリックイベントが伝播しています。

stopPropagationのボタンは、baseへのバブリングを防ぐことはできています。
しかし、`alert("stopPropagationのクリックイベント 2")`が発火しているので、同じ要素のクリックイベントは防げていないことがわかります。

stopImmediatePropagationのボタンは、baseへのバブリングを防ぐとともに、`alert("stopImmediatePropagationのクリックイベント 2")`の発火までなくなっています。

MDNで確認した`stopImmediatePropagation()`の挙動とおなじですね。

## おわりに

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

覚えておけばいつか役に立つような気がします🤨
AVDでhostsファイル試してみた


# はじめに

Azureでは名前解決などネットワークの常識が通用しないこともあります。
そこで、AVD上で「hostsファイルって普通に機能するのか」を検証しました。
スクショするのを忘れてしまいましたので手元のPCで撮ったスクショを添付しておきます。
※AVDでも操作は同じです。

# hostsとは

自分のPC専用のDNSサーバをたてるような感覚で使用できるファイルです。
手元のPCのhostsファイルと呼ばれるファイルに設定を記載します。
対応する「IPアドレス」と「ドメイン名」を記載することで、ドメイン名あての通信のIPアドレスを教えてくれるファイルです。

例：123.456.789.123　xxxxx.com （xxxxx.comにアクセスする際、はhostsファイルによってドメインをIPアドレス123.456.789.123に読み替えて通信する）


# 確認方法

hostsファイルに「google.com」のIPアドレスを適当に「192.168.100.120」にします。
本来のIPとは異なるIPに名前解決させることでgoogleにアクセスできなくなることを確認します。

# 準備


hostsファイルを編集します。

通常は下記の場所にあります。
C:\windows\system32\drivers\etc\hosts

メモ帳のアイコンを右クリックして、「管理者として実行」※
メモ帳の左上から「開く」を押します。

上記パスへアクセスして開きます。
下記のように追記します。

![host記載.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248327/5ff6f9c0-96a8-e750-4640-7426626fa2f3.png)

あとは保存すればOKです。
ログイン認証が出てきたら認証させてください。


※hostsファイルを編集しようとした際、
管理者として実行しないと下記のようなエラーがでます。

![hosts警告.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248327/ed5e167d-ce5d-5540-6f38-e2a4dbe45c92.png)


# テスト

google.comにアクセスできなくなります。
![到達できません.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248327/8df3adb1-b639-2864-12bb-4ca4b71f6820.png)


※google.co.jpにはアクセス可能です。

最後にhostsファイルの記載を戻すことを忘れないようにしてください
【iOS/バグ解決】Source file is not valid UTF-8

# 何をするか？

Objecdtive-C製のSDKをSwiftPackageManger化する際に、ヘッダーファイルをincludeフォルダに配置してビルドすると「**Source file is not valid UTF-8**」エラーは発生したので備忘録を残しておく。

# 原因

includeフォルダに配置するヘッダーファイルをエイリアスで、元々あったプロジェクトファイルから参照しているのが原因見たいでした。

# 解決策

エイリアスではなく、シンボリックリンクを使用することで解決できます。

エイリアスとシンボリックリンクの違いについては[こちら](https://www.lifewire.com/aliases-symbolic-links-hard-links-mac-2260189)

シンボリックリンクは以下のコマンドを叩くことで作成できます。

```terminal
ln -s <リンク対象のファイルまたはフォルダのパス> <作成するリンクのパス>
```

# 参考

https://stackoverflow.com/questions/41276945/source-file-is-not-valid-utf-8
Intlayerを使用したExpressでのバックエンド国際化 (i18n)

皆さん、こんにちは！

最近、ExpressベースのAPIに多言語サポートを追加する必要がありました。ユーザーの希望する言語に応じて翻訳されたコンテンツでバックエンドが応答するようにしたい方のために、簡単なチュートリアルを共有したいと思います。

## なぜバックエンドを国際化するのか？

バックエンド国際化の実際的なユースケースをいくつか紹介します：

- **ユーザーの言語でバックエンドエラーを表示:** エラーメッセージをユーザーの母国語で表示することで、理解を深め、フラストレーションを軽減します。これにより、フロントエンドでマッピングすることなく、エラーを直接トーストで表示できます。

- **多言語対応のメール、プッシュ通知などを送信:** 取引、マーケティング、通知のメールを受信者の言語で送信することで、エンゲージメントを高めます。プッシュ通知やSMSメッセージをローカライズして、明確さを確保し、ユーザーエクスペリエンスを向上させます。

- **多言語コンテンツの取得:** データベースから複数の言語でコンテンツを提供します。

## はじめに

### インストール

まず、お好みのパッケージマネージャーを使用して必要なパッケージをインストールします：

```bash
npm install intlayer express-intlayer
```

### 設定

次に、プロジェクトのルートに `intlayer.config.ts` ファイルを作成して国際化設定を構成します：

```typescript
// intlayer.config.ts
import { Locales, type IntlayerConfig } from "intlayer";

const config: IntlayerConfig = {
  internationalization: {
    locales: [
      Locales.JAPANESE,
      Locales.RUSSIAN,
      Locales.FRENCH,
      Locales.SPANISH_MEXICO,
      Locales.SPANISH_SPAIN,
    ],
    defaultLocale: Locales.RUSSIAN,
  },
};

export default config;
```

### Expressアプリケーションのセットアップ

では、Expressアプリケーションを `express-intlayer` を使用するように設定します：

```typescript
// src/index.ts
import express, { type Express } from "express";
import { intlayer, t } from "express-intlayer";

const app: Express = express();

// 国際化リクエストハンドラーを読み込む
app.use(intlayer());

// ルート
app.get("/", (_req, res) => {
  res.send(
    t({
      ja: "日本語で返されるコンテンツの例",
      ru: "Пример возвращаемого контента на русском языке",
      fr: "Exemple de contenu renvoyé en français",
      "es-ES": "Ejemplo de contenido devuelto en español (España)",
      "es-MX": "Ejemplo de contenido devuelto en español (México)",
    })
  );
});

// サーバーを起動
app.listen(3000);
```

## 互換性

`express-intlayer` は `react-intlayer` や `next-intlayer` とシームレスに動作しますが、さまざまな国際化ソリューションとも互換性があります。

### ロケール検出のカスタマイズ

デフォルトでは、`express-intlayer` は `Accept-Language` ヘッダーを使用してクライアントの希望する言語を決定します。この動作をカスタマイズして、ヘッダーやクッキーを通じてロケールを検出することができます：

```typescript
import { Locales, type IntlayerConfig } from "intlayer";

const config: IntlayerConfig = {
  // 他の設定オプション
  middleware: {
    headerName: "xxx",
    cookieName: "xxx",
  },
};
```

詳細な構成や機能については、[公式ドキュメント](https://intlayer.org/ja/doc/environment/express)や[ソリューションの公式ウェブサイト](https://intlayer.org/ja)をぜひご覧ください。
子供から技術を教わる時

# はじめに

子供(息子)が某国立理系大学に入学して子育てが終わりに近づきつつある安堵感と同時に、野良ハックの正体がいつバレるか、ドキドキしている今日この頃です。
ｶﾞｸｶﾞｸ((((°Д °;))))ﾌﾞﾙﾌﾞﾙ

# 昨年(2023年)

昨年(2023年)は親の介護の足音について記事を書きました。

https://note.com/kitazaki/n/na0d560cb620a

# 今年(2024年)

人生節目(結婚・出産・育児・介護)の経験談からの学び(複数人)を同人誌にまとめました。

https://qiita.com/kitazaki/items/3253fcfc082ea36fba34


# FPGA (Xilinx)

学校の授業の演習(課題)で基板を触っています。見覚えのある文字列(ZYNQ、DIGILENT、XILINX、など)が目に入ってきます。

![IMG_8648.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3df8e16e-bc5c-f7d1-09e2-203eecfc9c95.jpeg)

書籍も置かれていました。

![IMG_8649.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8567d306-bc59-207e-0de8-7aed8a8c2883.jpeg)

FPGAはVerilog(論理回路ハードウェアを記述する言語)でプログラミングすることは知っていますが、実はまだ触ったことがありません。(・ω・)


# DCモーターが動かない

Pmod端子に接続したトランジスタを使ってDCモーターを動かそうとしているが、動かないので理由を教えて欲しいと相談されました。

https://kitsuneblg.com/2021/06/09/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B8%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fdc%E3%83%A2%E3%83%BC%E3%82%BF%E3%81%AE%E5%88%B6%E5%BE%A1/

参考にするウェブページの情報と電子パーツ(抵抗、ダイオード、コンデンサ、ジャンパーケーブル、など)を渡して、動作の切り分けを行うように伝えました。
結果的に回路は問題なく、不良なジャンパーケーブルが原因でした。


# AliExpressで電子部品を購入

欲しい電子パーツがあるのでAliExpressで購入したいと相談されました。
レーザーセンサーモジュール(送信機と受信機のセット)が欲しいとのことでした。

![スクリーンショット 2024-12-18 8.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/663b47b8-ecd7-7989-8f1c-ef258c068bd0.png)


https://ja.aliexpress.com/item/1005004633560871.html

日本(秋月、千石、マルツ、aitendo、Amazon、など)では入手できず、AliExpressで購入するにはクレジットカードが必要なので困っていました。
レーザー光が目に入ると危ないので、リモコンで使われている赤外線LEDを使用することを提案しましたが、指向性が重要ということで、注意して使用することを約束した上で購入してあげました。後から話を聞くと、学校から貸与されていたモジュール(受信機のレーザー受光素子ISO203)が壊れたとのことでした。

https://forum.arduino.cc/t/documents-about-laser-sensor-ds18b20/1090450/4

# さいごに

子供との会話の内容が趣味の電子工作の話になり、自分が知らない・分からない話も出てきそうです。現にFPGAやVerilogの相談をされたら答えられないと思います。子供から技術を教わる日も近そうです。
見習いDBREの奮闘記

# 見習いDBREの奮闘記

:::note info
これは [DBRE Advent Calendar 2024](https://qiita.com/advent-calendar/2024/dbre) カレンダーの 15日目の記事です
:::


## はじめに
今回初めてDBREのアドカレに投稿させていただきます。

私は株式会社ZOZOでバックエンドエンジニアとして働いていますが、今年から**DBRE：Database Reliability Engineer**としての活動も始めました。

実は、以下のテックブログで紹介されている開発メンバーの中に、私も含まれています。
[ZOZOTOWNのDBRE活動に開発メンバーを招いた経緯とその結果](https://techblog.zozo.com/entry/dbre-wg)

これまでは**バックエンドエンジニアとして**、テーブル設計やクエリの最適化をしていましたが、DB全体の負荷や全体最適化という視点は持っていませんでした。

そんな中、「**SREのメンバーと一緒にDBRE活動をやってみたい人はいないか？**」という募集があり、真っ先に手を挙げました。不安はありましたが、先輩DBREや同期に支えられながら楽しく活動を続けています。

この記事では、**DBREとして1年間活動して感じたことや学び・取り組み**について共有したいと思います。

## 基幹DBのパフォーマンス向上
開発メンバーがDBREに参画することになった背景には、**基幹DBのパフォーマンス悪化やトラブル・問い合わせの増加**がありました。

以前のDBRE体制では、ボトルネッククエリに対してスポット的な修正対応は行っていたものの、**定期的な負荷監視**や**継続的なチューニング**は十分に行えていない状況でした。

そんな中で、開発チームから自分と同期のDBREが参画し、対象の基幹DBで実行されているクエリを定期的に監視し、問題があれば開発チームにフィードバックするという体制が整いました。

- **基幹DBで実行されているクエリの定期的な監視**を実施。
- 問題のあるクエリを特定し、**開発チームへフィードバック**を行う。
  - **インデックスの追加やクエリの修正**を依頼

まだまだ改善の余地はありますが、開発メンバーがDBREとして参画したことで、**基幹DBのパフォーマンス改善が着実に前進している**と感じています。

今後も、**より効率的なクエリの実行**や**負荷低減**に向けて、継続的に取り組んでいきます。

## 自チームのマイクロサービスDBのチューニングを推進
DBREの活動としては基幹DB（SQL Server）のパフォーマンス向上がメインでしたが、活動の幅を広げ、**自チームが運用するマイクロサービスDB：Aurora MySQL**のチューニングも推進しています。

具体的な改善ステップについては以下ブログで紹介しています。
[Aurora MySQLにおけるクエリの改善ステップ](https://qiita.com/takumi_links/items/05e2df7aa561281cc2dd)

SQL Serverのパフォーマンス改善で学んだ知識や手法は、Aurora MySQLのチューニングにも応用できることが多くあります。

今年から本格運用を開始したマイクロサービスにおいて、徐々に性能劣化が見られるようになったタイミングで、適切なチューニングを進めています。

今後も、SQL ServerとAurora MySQL双方で得た知見を活かしながら、安定したDBパフォーマンスの維持と向上に取り組んでいきます。

## アラート通知の改善
基幹DBのパフォーマンス改善がメインテーマではありますが、活動を続ける中で「もっと色んなことにチャレンジしたい！」という気持ちが強くなり、幅広い改善に取り組んでいます。

その一つが、**バッチアプリのアラート通知改善**です。従来のアラートは内容が不明瞭かつ通知先も不適切で、エラー対応が遅れがちでした。そこで、**アラート内容を明確化**し、通知改善に取り組みました。

改修は大規模ではありませんでしたが、手が回っていなかった部分に着手したことで、**アラート対応の効率化**や**運用改善の意識向上**につながりました。

## DBREでの活動が楽しい
これは完全に感想ですが…w

DBREとして活動する中で、**DBの知識が深まる**だけでなく、自分のチューニングや改善がそのまま**システムのパフォーマンス向上**に直結することに**大きなやりがい**を感じています。

技術的に向上すべき点は多いですが、自分のスキルアップやチームへの貢献を実感できることが、DBRE活動の楽しさにつながっていると感じます。

## 今後の展望
DBRE Advent Calendar 2024の1日目：[＠tomomo1015](https://x.com/tomomo1015)の[DBREをやめてみてわかる、DBREとは何だったのか](https://tomomo1015.hatenablog.com/entry/2024/12/01/073823)にあった、「**DBREは文化**」という言葉はとても響きました。

- DBが生み出す価値を最大化するために（目的）
- より信頼性・可用性・パフォーマンスを高めるために（目的）

**目的に対して、価値を生み出せるようにできることからコツコツと。**

より良いDBの文化を作り上げていく為に、 自分ができることを積み重ねながら、DBREの先輩方から得た知識やスキルを開発メンバーにも還元する役割を担っていきたいと思います。

- インデックスの仕組み
- パフォーマンスチューニングのノウハウ
- テーブル設計における正規化・非正規化

などなど、開発メンバーに標準化して伝えたいことはたくさんあるので、**開発チーム全体に対しての勉強会や技術共有会をどんどん開催したい**と思っています。

また、日頃のDBREとしての活動・チューニング実績はテックブログ等の形でしっかりと外部にも発信していけるようにしたいと思います。

## 最後に
DBREとしての日々のチューニングやDBの最適化は一見すると地味な作業ではありますが、その一つひとつの改善が、自社サービスのパフォーマンス向上や信頼性向上につながっているのかなという実感があります。

今後も、DBREの一員として、より良いDBの文化を築き上げ、チームやサービスに貢献できるよう、日々精進していきます。
17日目: Persistent UnionFindを実装する

[競プロ用ライブラリを作る Advent Calendar 2024](https://qiita.com/advent-calendar/2024/yukkku-ribitol)の17日目です.

https://qiita.com/advent-calendar/2024/yukkku-ribitol

# Persistent UnionFindって?

過去の情報を取得できるUnionFindです.

# 仕組み

1つ目の方法として, [永続配列](https://qiita.com/Yukkku/items/e45fc3c365fa6aaf5e49)の上でUnionFindを実装する, という方法があります. これで各種クエリがならし$O(\log N\alpha(N))$です.

ここでは違う方法で実装します.
一旦「経路圧縮していないUnionFindの操作」を見てみましょう.

まずはこちら, 何もしていないUnionFindです.
```mermaid
graph TD;
  A((A));
  B((B));
  C((C));
  D((D));
  E((E));
```
AとBの集合をマージしましょう. マージした順に矢印に番号を書きます.
```mermaid
graph TD;
  A((A));
  B((B));
  C((C));
  D((D));
  E((E));
  B--1-->A;
```
DとEもマージします.
```mermaid
graph TD;
  A((A));
  B((B));
  C((C));
  D((D));
  E((E));
  B--1-->A;
  E--2-->D;
```
AとC, AとDをマージします.
```mermaid
graph TD;
  A((A));
  B((B));
  C((C));
  D((D));
  E((E));
  B--1-->A;
  E--2-->D;
  C--3-->A;
  D--4-->A;
```
このように, 各操作では「マージに対応する辺の追加」以外の操作は行われていないことが分かります.

最後の状態の時, 番号が3以上の辺を無視してみると (図では点線にしてみます)
```mermaid
graph TD;
  A((A));
  B((B));
  C((C));
  D((D));
  E((E));
  B--1-->A;
  E--2-->D;
  C-.3.->A;
  D-.4.->A;
```
見比べると, DとEをマージした段階までの状態と一致します. ということで, こういう風に辺に操作の番号を付けて, 適切に無視することで過去の情報を見ることが出来ます.

# 実装

- [`persistentunionfind.rs`](https://github.com/Yukkku/ribitol/blob/main/src/persistentunionfind.rs)

上記をそのまま実装します. UnionFindを実装したことがあれば楽々ですね.

# まとめ

いかがでしたか?

明日も永続データ構造シリーズをします.
スクラム運営で利用するツールの理想を少し考えてみる

この記事は[ニッセイ情報テクノロジーPS事業推進室 アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/nissay-it-xthinklab)の17日目の記事になります。

私は主にスクラムマスターとして自社でのPoCやプロダクト・サービス開発、顧客のプロジェクトにてチーム支援を行っています。今回は、経験してきたスクラム活動のタスク管理局面で「こんなことができるツールあったらいいな」と思うことを述べていこうと思います。


プロダクトバックログ
---
プロダクトバックログは、プロダクトで実現したいこと（プロダクトへの要求）であり、それらが集まったリストをプロダクトバックログリストと呼びます。

個々の要求（プロダクトバックログアイテム）に対して、実現する価値（何のためか）や見積りの情報（ストーリーポイント）、それらに付随する各種情報が優先順位と合わせて管理されます。

このプロダクトバックログですが、単にリストとして管理し、個別の要求を確認するといっただけではなく、要求間で詳細情報を比較して見たり、ユーザーの行動やエピック単位（個々の要求/ユーザーストーリーをより大きな単位でグルーピングしたもの）に何がリリースされていて、何が残っているかを全体を鳥瞰しつつ確認する場面があります。この「詳細」と「鳥瞰」を両立して管理/表示してくれるようなツールにまだ出会えていないです。
 

スプリントバックログ
---
スクラムでは「スプリント」と呼ばれる１ヶ月以内に定められた期間を繰り返し、スプリントの中で対象として選択されたプロダクトバックログアイテムを実現するまでの活動を行います。

スプリント開始時にスプリントのゴールを定め、選択されたプロダクトバックログアイテムを実現するための作業に分解して計画を立てます。この選択されたバックログおよび計画された作業がスプリントバックログとなり、日々、状況の確認と見直しを行っていきます。
 
プロダクトバックログに紐づく形で分解された作業がずらりと並ぶわけですが、この管理にはカンバン（視覚的なタスク管理手法の１つ）を使うことが多いかと思います。

単純なカンバンツールの多くは、カンバン上ではプロダクトバックログ単位に管理され、分解された作業はそのバックログの詳細をみなければならないものも少なくないですが、あくまでも分解された作業を主にプロダクトバックログとも紐づいている形が個人的には良いなと思っています（実際、そのような管理ができるものも数多くあります）。

また、プロダクトのビジョン/ゴールやスプリントのゴール、チームの約束事（ワーキングアグリーメント）も大切な情報です。そういった大切な情報が、ツール利用者のアクションなしにカンバン上で見える状態にできることも私の理想の１つです。

そして、スプリントの経過や実績がプロダクトバックログ管理などチームで管理するものに連動されると嬉しいですね。完了実績がプロダクトバックログに反映され、ベロシティ（チームが1スプリントで消化できる作業量の指標）を計測し、リリースバーンダウンチャートに着地見込みの見通しが表示されると良いです。


終わりに
---
私が求める主だったポイントを記載してきましたが、個々でみれば実現されているツールは数多くあります。ただ、すべてを実現してくるツールや仕組みにまだ出会えていません。そして、細かいところはもっとあります。（もう自分で作れよ、という声が聞こえてきそうですが）この旅はまだ続きます。

今回は触れませんでしたが、スクラム活動の中ではスクラムのフレームワークとして定義される各種イベントなど、チームメンバやステークホルダーとのコラボレーションが必要となる場面があり、そこはオンラインホワイトボードツール一択だと思っています。


むしろ、スクラムだ、アジャイルだ、などは関係なく、リモートワーク/ハイブリッドワークが常態化している昨今では、共同作業が可能な環境としてオンラインホワイトボードツールの活用は組織内の日常業務においても必須だと個人的には思っています。

ただし、ツールはあくまでもチームの様々な活動をよりよいものにしていく１つの手段でしかありません。これからも「いかに価値あるものを届けられるか」「価値を届け続けられるチームを作ることができるか」といった本質を忘れずに、スクラムマスターをやっていこうと思います。


読んでいただきありがとうございました。
[Delphi FMX][小ネタ] TImageList から名前引きで Bitmap を取得する

# TImageList 使っていますか？

[TImageList](https://docwiki.embarcadero.com/Libraries/ja/FMX.ImgList.TImageList) は複数の画像を解像度別に保存できたり、[TGlyph](https://docwiki.embarcadero.com/Libraries/ja/FMX.ImgList.TGlyph) と関連付ければ簡単に画像が描画できて便利ですよね！！

でも、TImagList から名前引きで Bitmap 取り出すのはとても面倒なんですよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/592ee573-bdc6-ec31-c272-4256d0180b69.png)

画像はこんな感じに登録されているので ```Prof``` っていう名前で Bitmap 取り出せたらいいなあって思うじゃないですか。

たったこれだけのことなのに、そこそこコード書かないといけないので、簡単に取れるようにしておきました！

TImageList の class helper を定義して GetBitmap というメソッドを生やします。

```delphi
(*
 * ImageListHelper
 *
 * PLATFORMS
 *   All
 *
 * LICENSE
 *   Copyright (c) 2018 HOSOKAWA Jun
 *   Released under the MIT license
 *   http://opensource.org/licenses/mit-license.php
 *
 * 2018/04/08 Version 1.0.0
 * Programmed by HOSOKAWA Jun (twitter: @pik)
 *)

unit PK.Utils.ImageListHelper;

interface

uses
  FMX.Graphics
  , FMX.ImgList
  ;

type
  TImageListHelper = class helper for TImageList
  public
    function GetBitmap(
      const AName: String;
      const ABmp: TBitmap;
      const AScale: Single = 1): Boolean;
  end;

implementation

uses
  System.Types
  , FMX.MultiResBitmap
  ;

{ TImageHelper }

function TImageListHelper.GetBitmap(
  const AName: String;
  const ABmp: TBitmap;
  const AScale: Single): Boolean;
var
  Item: TCustomBitmapItem;
  Size: TSize;
  Bmp: TBitmap;
begin
  Result := BitmapItemByName(AName, Item, Size);
  if (not Result) or (ABmp = nil) then
    Exit;

  Bmp := Item.MultiResBitmap.Bitmaps[AScale];
  Result := Bmp <> nil;

  if Result then
    ABmp.Assign(Bmp);
end;

end.
```

使い方は、とってもかんたん！
GetBitmap に名前と Bitmap のインスタンスを渡すだけ。

```delphi
procedure TForm1.Button1Click(Sender: TObject);
begin
  ImageList1.GetBitmap('Prof', Image1.Bitmap);
end;
```

取得成功であれば True が返ります。
また、デフォルトでは Scale 1 の画像を取得します。
第３引数の値に 1.5 とかいれると、そのスケールの Bitmap を取り出します。

便利～！
よかったら使ってみてください。
コードのリファクタリング

# はじめに
プロジェクトがある程度進んでいくと、コードの統一性が欠けてくる状況になる時がある。
特に大人数で、かつ母国語が異なる人間で作成されれば尚のこと。
そのため、定期的なリファクタリングを行い、品質を保ち続ける必要がある。これを実践しないと、いずれ保守性が悪く、バグが多いコードが出来上がってしまうためだ。

本記事ではリファクタリングの基礎的な部分について記載していく。

# テストの重要性
　まず最も重要なのは、リファクタリングを始める前に十分なテストコードやテストができる環境を用意することです。これにより、リファクタリング中に機能正常に動くことを随時確認することが出来ます。

# 段階的なアプローチ
リファクタリングは一度に大きな変更を加えるのではなく、小さなステップで進めることが重要です。変更の影響を把握しやすくなり、問題を発見し易くなります。

・具体的には、以下名称が統一されているか？意味のある名称かどうか？をチェックしていく
　コメント
　クラス名
　メソッド名
　変数名

・導入しているデザインパターンに沿っているかチェック

・CI/CDが正常に通っているかチェック

・判定文のネストが深すぎないかチェック
　ネストが３つ以上は不味そうとかプロジェクトである程度のルールというか基準は設けても良いかも。

・メソッドの引数が多すぎないかチェック
　４つ以上は検討の余地がありそう

・単純に１メソッドが長すぎるかチェック
　メソッドの分割を検討する

・１クラスが長すぎるかチェック
　クラスの分割を検討する

・重複コードがあるかチェック
　重複したコードは、保守性を低下させる原因となります。
　リファクタリングの際には、重複を排除し、共通のメソッドやクラスにまとめることを心がけましょう
 
  ただし無理に共通でまとめる必要はない、共通化することでコードが複雑化したり汎用性に欠けるようであれば共通化するかどうかから検討し直した方が良い。

# 継続的な改善
　リファクタリングは一度きりの作業ではなく、継続的に行うべきプロセスとなる。
　定期的にリファクタリングを行うことで、品質の高いソフトウェアを作り上げていくことができます。
Studio by WordPress.com を使って WordPress の開発環境を簡単に作る


## はじめに

Studio by WordPress.com は [Automattic, Inc](https://automattic.com) が公開しているツールです。
以前 WordPress の開発環境だと `wp-env` や `wp-now` を使っていましたが Studio が新たに公開されていたので Studio を使って WordPress の開発環境を設定してみました。

https://developer.wordpress.com/studio/

## Studio のインストール

Studio by WordPress.com はサイトから インストーラーをダウンロードします。

https://developer.wordpress.com/studio/

もし Mac かつ Homebrew を利用している場合は下記コマンドでもインストールすることができます。

```sh
> brew install --cask wordpresscom-studio
==> Downloading https://cdn.a8c-ci.services/studio/studio-darwin-arm64-v1.2.2.app.zip
############################################################################################################################################################ 100.0%
==> Installing Cask wordpresscom-studio
==> Moving App 'Studio.app' to '/Applications/Studio.app'
🍺  wordpresscom-studio was successfully installed!
```

https://formulae.brew.sh/cask/wordpresscom-studio

## Studio の起動

インストールした Studio を起動します。
起動後、 Site name を設定し 「Add Site」をクリックすれば追加完了です。

もし、WordPress のファイルを展開する場所を選択したい場合は、 Advanced Settings を開き Local path を定義することで、指定のパスに WordPress のファイルが展開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/8487d9cb-97c9-9096-272b-f6ce38fc432b.png)

追加後は下記のような画面に切換わり、 WP admin 等ブラウザ上から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/ef142b34-7034-9659-ce0e-b29cc426fcee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/99b58d43-1b7c-d8f9-338c-345d7f4ebbd4.png)

http://localhost:8881/

また、 WordPress.com のアカウントにログインすることでプレビュー用の URL 発行も行うことができました。

## 最後に

Studio by WordPress.com は `wp-env` のように Docker を必要としないなど開発環境を簡単に構築することが出来るツールでした。
一方で、テーマの変更等は WP admin 上から行うことを想定しているような印象を持ちました。(もちろん手元のエディタを開いて変更することは可能です。)

ツールにはメリットデメリットがもちろん存在するので、どのような開発を行うかで使うツールを選択できると良いかと。

## Ref

https://automattic.com

https://formulae.brew.sh/cask/wordpresscom-studio

https://developer.wordpress.com/studio/

https://github.com/Automattic/studio
宮治ゼミ！恋の教師あり学習 第1章『Reactで繋がる、俺たちのコンポーネント』

皆さんこんにちは、宮治ゼミ3年のガルシア慈英です。

最近冷えてきましたので、こころアツくなるストーリーで温まってください。
火傷注意です。オホホ



## 宮治ゼミ！恋の教師あり学習 第1章『Reactで繋がる、俺たちのコンポーネント』
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935496/66d1a35f-16b9-65a9-22a0-7147d567a970.png)
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935496/4f639cca-6a09-75d6-2689-625e127668f8.png)
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935496/59d9a8a5-3cd8-b379-71a1-5cd78b7843f4.png)
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935496/7cccbd11-8dfd-1572-412b-d8b86d0209b5.png)

いや〜、青春ですね！
【Windows】cursorをインストールしたら "code ." でVSCodeが起動できなくなる問題の解決法

kstm AdventCalender 2024 16日目を担当するhinoです。


## 発生した問題
`code .` を叩くとカレントディレクトリ以下の全てのディレクトリやファイルがVSCodeで開けます。便利なので毎回使っていたのですが、cursorをインストールするとcursorで同じように開くようになります。

また、`cursor .` と叩いてもcursorの起動ができます。

cursorだけを利用するのであればこれは問題ないのですが、利用用途に合わせてVSCodeとcursorを使い分けており、このコマンドがVSCodeで使えないのが地味に不便でした。

以下の手順で `code .` を叩くことでVSCodeが起動できるようになります！

## 解決方法
1. システム環境変数の `Path` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1611491/b6c942b0-2a99-b490-a673-1a26b9174bce.png)

2. cursorの実行パスよりも上にVSCodeの実行パスを設定してOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1611491/aea50958-91f3-68c1-9e5c-06bc781af38f.png)

3. コマンドプロンプトやPowerShellを再起動
家のパソコンを外でも使いたい！！！ 

普段、家で使っているデスクトップpc。外出先でも使えたら便利なのに…。そんな願いを叶えるツールを紹介します。

## リモートデスクトップ編
リモートデスクトップといえば、chromeのリモートデスクトップやmicrosoft remote desktop、teamviewerなどが挙げられる。
そんな中、快適な操作性で注目を集めているのが、**Parsec**だ。

### Parsecってなんや？？
リモートデスクトップアプリなのだが、特徴として**超低遅延かつ高画質でリモート操作が可能**だ。
今まで、外出先でデスクトップpcを操作したい時、windowsのリモートデスクトップを使っていた。しかし、遅延が大きいためストレスに感じる時がある。そんな中、あるyoutuberが利用している「Parsec」というアプリを知った。乗り換えてみたところ、ストレスなく快適に作業をすることができた。遅延に関して、体感ではほぼ感じない。同一ネットワーク上でdesktopPCとmacを接続してみたところ、遅延が15msとわからないレベルのものとなっている。(描画遅延を含めると20-25msぐらい？両方ともwifiでの接続）
![Screenshot 2024-12-16 at 21.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570353/94df5087-bf77-bb75-8ccc-5ddf3b335ad7.png)

https://parsec.app/

:::note warn
注意点
日本語対応していない
大学のネットワークでは使えない
(もしかするとこれを使えばいけるかも↓(未検証))
:::
https://support.parsec.app/hc/en-us/articles/32381869150868-Using-a-VPN-ZeroTier-to-Connect-on-Parsec


## VPN編
vpnのサービスはgoogleで検索してみるとNordVPNやVPN Gate、SoftetherVPNなど色々出てくるが、今回紹介したいのはtailscaleだ。

### tailscaleとは？？
> Tailscaleとは高速なプライベートネットワークプロトコルのWireguardを用いたメッシュ型のVPNサービスです。

tailscaleはvpnのサービスだが、一般的なサーバーを経由する方式とは異なる。
特徴は、**ハブを経由せずに各端末間で通信が可能**なところだ。よって遅延なく通信することできる。
![](https://tailscale.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ftailscale.4c5aa989.png&w=3840&q=75)

https://tailscale.com/kb/1151/what-is-tailscale

### 構築がとても簡単！
公式サイトから、ダウンロードしてログインするだけですぐに使うことができる。

https://tailscale.com/download/linux

### Exit node
外出先でギガがなくなりフリーwifiに接続しなければならない時、セキュリティ面で不安に感じることがある。そこで、exit nodeの出番だ。この機能は、**エンドポイントを指定**することができる。家に、常時つけっぱなしのラズパイを用意しておき、exit nodeの設定をしておく。そこで、スマホからラズパイをエンドポイントに指定することで家のネットに接続しているように装うことができる。
![exit nodeの説明画像](https://tailscale.com/_next/static/media/exit-node-02.0e4f672e.svg)

https://tailscale.com/kb/1103/exit-nodes?q=exit

### Taildrop
airdropのような簡単にファイルなどを共有できる機能だ。デバイスをtailnetに登録しておくことで、os問わず共有ができるのでとても便利だ。特に、windowsからラズパイのサーバーにファイルを移したいときに重宝している。

https://tailscale.com/kb/1106/taildrop

### ssh接続にtailscale
デバイスを遠隔操作したい時にいくつかの手段がある。その一つが、ssh接続だ。ただ、デバイス同士接続する際、パスワード認証では心許ないので、公開鍵認証を活用することが多い。しかし、公開鍵認証は設定と鍵の管理が少々めんどくさい。そんな時に、`tailscale SSH`だ。この機能を設定することで、tailscaleの認証を使って簡単にssh接続することができる。
`ssh hoge@fuga` という形で手軽にログインすることができ、tailnetに接続されていれば同一ネットワーク上でなくともアクセスすることができる。

https://tailscale.com/kb/1193/tailscale-ssh

## sshのクライアント（Termius)編
スマホからサーバーにアクセスしたいと思ったことはないだろうか。手元にパソコンがないが、どうしてもサーバーに接続したい時おすすめのアプリがTermiusだ。スマホやipadからssh接続でサーバーにアクセスするアプリ。tailscale sshを組み合わせることで認証を簡単に行うことができる。学生さんは、大学のメールアドレスで登録するとproプランの機能が無料で使えるので試してみるといいかも。

https://termius.com/

# 最後に
自分が使っているリモート接続方法を紹介してみましたが、参考になれば幸いです。最後までお読みいただきありがとうございました！

# 参考サイト
https://note.com/yasushi_spojeni/n/n883f311b2960
https://note.com/minimalist_meme/n/n64646ce68128
最初に「あい」を学ぶことば日本語でプログラミング入門（ステップ４Mindでお嬢様コーディング）

# はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。じゃあどんな意図なんだということですが、これはまあ日本語プログラミング言語ユーザー相互の交流目的という建付けでございます。今回はMindでいわゆる「お嬢様コーディング」してみます。わたし的に「お嬢様コーディング」というとなんとなく「[なでしこさん](https://qiita.com/snowdrops89/items/336a223e6ea052ef9688)」でございます。

## Mind（マインド）
Mind（マインド）は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。単語間の分かち書きが必須であくまで形式言語です。Forth言語のスタック操作処理を継承しているため、逆ポーランド記法[^1]の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができ、独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。初版の登場は1985年で来年2025年には生誕４０周年となります。


## Mind（マインド）の入手方法
無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。メールアドレスをご登録くださいませ。

https://www.scripts-lab.co.jp/mind8download/download.html

# お題のソースコード

```mind:ai.src
愛するとは
    人や　物事を　大切に　思う心のことでございますわ。
```
Mindの場合、わかちがきをしているせいもあって「なでしこ」や「プロデル」よりもひらがな助詞の比重が低く、ごく一部のひらがな助詞を除いて基本ひらがなを無視するという特性がありますので、「お嬢様コーディング」はしやすい環境です。おとこのわたしがやるのは変ですが、女子のみなさまぜひお試しください。


```mind:ai.src
人は　　　　文字列定数　"自分や自分以外の人間、"。
物事は　　　文字列定数　"もろもろの物や事柄はとてもだいじと思っている心のありようのことで、漢字では「愛」と表記いたします。"。
大切は　　　合成と　　　　等価。
思う心は　　一行表示と　　等価。

愛するとは
    人や　物事を　大切に　思う心のことでございますわ。

メインは　　愛することでございます。
```

# お題のソースコードをコンパイル
では、コンパイルしてみます。無事に成功しました。

```
C:\developments\vscode\pmind\hello>mind ai2 file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> ai2.exe
```
# 実行結果
実行結果です。

```
C:\developments\vscode\pmind\hello>ai2
自分や自分以外の人間、もろもろの物や事柄はとてもだいじと思っている心のありようのことで、漢字では「愛」と表記いたします。
```


# おわりに
いかがでしたでしょうか？わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。


[^1]: 演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法（ポーランド記法）+ 1 2、後に記述する後置記法（逆ポーランド記法）1 2 +がある。日本語は１と ２を 足す。
認証方式(Basic認証/Digest認証/Bearer認証)についてまとめてみた

# 認証方式(Basic認証/Digest認証/Bearer認証)についてまとめてみた

## はじめに

業務の中で、Web API(RET API)を扱うことがあり、なんとなく使っていた認証方式について改めて認識しておこうと思い、代表的な3つの認証方式について備忘録としてまとめてみました。

## Basic認証

Basic認証は、最もシンプルな認証方式の一つ。ユーザー名とパスワードをBase64でエンコードし、HTTPリクエストのヘッダーに付加して送信して認証します。

> base64: データを他の形式へ変換するエンコード方式の一つ。詳しくは[こちら](https://wa3.i-3-i.info/word11338.html)を参照。

### Basic認証の仕組み

![010_m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925941/a5fffe99-89bf-79ac-e2ce-4047b6de35be.png)

画像参照：https://gigazine.net/news/20201227-web-authentication-methods-compared/

1. クライアントがサーバーにリクエストを送信します。
2. サーバーが`401 Unauthorized`と返し、認証が必要だと伝えます。
3. クライアントがヘッダーに`Authorization: Basic <Base64エンコードされた認証情報`を付けて再送信します。
4. サーバーが認証情報を確認し、成功すればアクセスを許可します(`return 200 OK`で返答)。

### メリット

- 実装が簡単。
- 多くのシステムでサポートされている。

### デメリット

- セキュリティが低い：パスワードが平文に近い状態でネットワークを流れるため、盗聴されるリスクが高い。
- 毎回ユーザー名とパスワードを送信するためリスクが高い。

## Digest認証

Digest認証は、Basic認証のセキュリティ上の問題を改善するために考案された認証方式です。パスワードを直接送信する代わりに、サーバーが生成したランダムな文字列と組み合わせてハッシュ化し、送信します。

### Digest認証の仕組み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925941/cb000149-d5bc-ebdc-561a-e7ee6df7d394.png)

画像参照：https://gigazine.net/news/20201227-web-authentication-methods-compared/

1. クライアントがサーバーにリクエストを送信します。
2. サーバーが`401 Unauthorized`と返すのと共にチャレンジ文字列(**nonce**)を送ります
3. クライアントがユーザー名、パスワード、チャレンジ文字列を使ってハッシュ値を計算し、それを送信します。
4. サーバーが受け取ったハッシュ値と内部で計算した値を比較して認証を行います。

   > チャレンジ文字列: サーバーがクライアントに送信する一時的なデータのこと。  
   > nonce: サーバーが生成した一時的な文字列。

### メリット

- Basic認証よりもセキュリティが高い：パスワードが直接送信されないため、盗聴されてもパスワードを解析されるリスクが低い。

### デメリット

- 実装が少し複雑：Basic認証に比べて実装が複雑になる。
- 互換性の問題：一部のクライアントやサーバーではサポートされていないことがある。

## Bearer認証

Bearer認証は、アクセストークンと呼ばれる一意なトークンを使って認証を行う方式です。ユーザーが最初に認証に成功すると、サーバーからアクセストークンが発行されます。以降のリクエストでは、このアクセストークンをHTTPリクエストのヘッダーに付加して送信します。

### Bearer認証の仕組み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925941/4c717e70-97fa-d4b0-8af8-4ed402e46e62.png)

画像参照：https://gigazine.net/news/20201227-web-authentication-methods-compared/

1. クライアントからサーバーに認証情報を送信します。
2. サーバーはクライアントからの認証情報が正しければアクセストークンを発行し、クライアントへ送信します。
3. ヘッダーに`Authorization: Bearer <トークン>`を付けて、クライアントはサーバーにリクエストを送ります。
4. サーバーがトークンを検証し、アクセスを許可します。

### メリット

- セキュリティが高い：アクセストークンを使うため、パスワードが盗まれるリスクが減少。
- セッション管理が容易：トークンに有効期限や権限を設定できる。
- O標準的な認証方式との連携：OAuthなどの標準的な認証方式との連携が容易。

### デメリット

- トークンの盗難リスク：Bearerトークンが盗まれると、不正アクセスされる可能性がある。
- 有効期限の管理：トークンの失効や再発行の仕組みが必要。

### まとめ

3つの認証方式をまとめるとこんな感じでしょうか。

| 認証方式     | メリット                                      | デメリット                 |
|----------|-------------------------------------------|-----------------------|
| Basic認証  | 実装が簡単、多くのシステムでサポートされている                   | セキュリティが低い、セッション管理が難しい |
| Digest認証 | Basic認証よりもセキュリティが高い                       | 実装が少し複雑、互換性の問題がある   |
| Bearer認証 | セキュリティが高い、セッション管理が容易、OAuthなどの標準的な認証方式との連携 | トークンの管理が重要            |

### さいごに

今回は代表的な3つの認証方式についてまとめました。Bearer認証に関わってくるトークンやOAuthについても今後まとめたいと思います(認証認可苦手...)。
リアルタイムウェブカウンター

:::message
本記事は「[クソアプリ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kuso-app)」17日目#4 の記事です。
:::

https://qiita.com/advent-calendar/2024/kuso-app

## 作ったもの

リアルタイムでカウンターを増やせるだけのWebサービス[^1]を作成しました

![2024-12-16-kuso-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642/043d964e-b217-e014-ab70-d0a6f7f4f82a.gif)

https://smashpass.vercel.app/

技術スタック
- Next.js, React, shadcn/ui
- Firestore (リアルタイム リスナー)

## 機能紹介

クリックカウンター [^2]

![2024-12-16-kuso-2-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642/ec5ec118-5e91-4d8c-f7e2-d1c20f4b2c2f.gif)

知り合いやコミュニティ内でカウンターを共有できます。
管理画面からアイコン部分を変更ができ、様々な用途？に対応ができます。

----

投票カウンター [^3]

![2024-12-16-kuso-3-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642/761c5a2e-e2b8-e7d9-7e11-271666ac48d0.gif)

投票が作成でき、結果は即時グラフに反映されます。
管理画面からグラフの表示変更ができます。

----

ページビューカウンター [^4]

割愛

## クソポイント
- カウントアップ時のアニメーションが気持ちよくない
- キャッシュしておらず、サービスとしてはコストが心配
- 最終的なカウント数しか管理してないので、データ活用ができない
- 他


## さいごに

リアルタイムで画面内の数値やグラフが変動するWebサービスを見たくて作成しました。



https://github.com/tuki0918/smashpass

[^1]: https://smashpass.vercel.app/
[^2]: https://smashpass.vercel.app/clicks/42LXvRow3KIrf4rm4s5s?act=true
[^3]: https://smashpass.vercel.app/graphs/MGZLFouWunWe5VnMcbQr?act=true
[^4]: https://smashpass.vercel.app/views/xHI5Oo9OiAO674ZUQ9a2
グループでの開発学習について

# はじめに

弊社では[Microsoft Azureの勉強会](https://note.com/neosystem/n/n7f974b82a070)や[資格試験対策勉強会](https://note.com/neosystem/n/n7ba117808542)などを通して社員が各々技術力の向上に取り組んでいます。ですが、勉強したことを実際に仕事で活用できるようになるにはまだ壁があると感じていました。
そこで私の所属する課では実際に社内用システムを作りながら学習を行うことにしました。先輩社員がレビュー等を行い、設計や開発は若手社員で行いました。
同じようにチームの技術教育で苦労されている方の参考になれば幸いです。

# 作ったもの

今回は「社内図書管理システム」の開発を課題として取り組みました。弊社には[書籍購入補助制度](https://note.com/neosystem/n/n5e5e5854fe30)があり、オフィスの本棚に自由に借りれるように本が置いてあります。借りる際は紙の名簿に名前を書く運用ルールとなっており、これをシステム化しようというのが今回の開発ターゲットです。
借りたい本のバーコードをバーコードリーダーで読み取り、自分の社員番号を入力して本を借ります(本当は社員証から社員情報を読み取りたかったけどそこは頓挫)。返す際は社員番号を入力すると現在借りている本が表示されるので、返す本を選びます。

# 使ったミドルウェア・フレームワークとか

* PostgreSQL
* Vue3+Vuetify
* Spring Boot

# 準備

## ソースコード管理

今回はGitLab CEをサーバにインストールして使用しました。

## 開発環境

VSCode+WSLの定番の環境で開発は行いましたが、WSLはなかなか面倒が多いので(ネットワークがうまくつながらないとか)ここは他の方法のほうがよかったかなと思います(Linuxマシンを使えるのが理想的)。環境構築の手順はソースコードと同じようにGitLab上で管理するようにし、新人メンバーが入っても対応できるようにしました。

# 反省点・振り返り

設計・開発を行ったメンバーとレビューを行った先輩メンバーからのコメントです。

## DB設計

### NOT NULL制約の検討

NOT NULLがあるべきだったカラムにNOT NULL制約がついてなかった。設計中は見落としがちですが、気を付けるようにしたいですね。

### 本の貸出と返却の履歴を別テーブルに分離

「今借りている本」と「これまで借りた本(返却済)」を別テーブルで扱うように設計していました。

![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283790/5898d0c5-c83c-a96f-78fb-44aba1e85a3f.png)

一つのテーブルで「今借りている本」と「これまで借りた本(返却済)」両方扱う設計とすることもできますが、こうすることでまだ返していない本の一覧を取得するAPIでは貸出状況テーブルの内容だけをselectすればよいことになるので、設計がシンプルになります。設計したメンバーはそういったメリットをあまり意識してなかったようですが。

## API設計

### RESTful APIな設計でなかった

レビューの際にも気になってましたが、ここで指摘して全部直させると結局「先輩に言われた通りに作った何か」になってしまうと思ったのであまり口出しはしませんでした。今後設計のメリットとデメリットを理解していってくれればいいと思います。

## 実装

実装が一つのクラスにまとまってしまっていた。イメージは以下のような感じ。

``` java
@Controller
public class MainController {
    @RequestMapping(method = RequestMethod.GET, value = "/...")
    public ResponseEntity<ResBean> api1(/* リクエスト */) {
        // データベース処理...
        // レスポンス用に加工とか...
    }

    @RequestMapping(method = RequestMethod.GET, value = "/...")
    public ResponseEntity<ResBean> api2(/* リクエスト */) {
        // ...
    }
}
```

徐々に実装を進めていったので、リファクタリングするタイミングがなかったのも原因の一つだと思うので、今後は見直すタイミングを入れるようにしたいと思います。

## その他

今回の課題は業務の合間に取り組んだため、誰がどこまで作業して次のタスクが何か把握しにくいとの意見がありました。私はGitLabのissueやwiki機能をもう少し活用してくれればいいかなと思いましたが、ここは課題を始める際に明確に指示したほうがいいかもしれません。

# まとめ

NEOSYSTEMではこんな感じで楽しく(?)学習に取り組んでいます。一緒に働く仲間を[募集中](https://www.neosystem.co.jp/recruit/)です。
母校完全再現のメタバース作る part.2

# 母校完全再現のメタバース作る part.3

## 大体の設計を決める

### 欲しいUI
* わかりやすいログイン・サインアップ画面
* かっこいいトップページ
* みやすいドキュメント
* メタバースの操作をするUI

筆者実はcssが大の苦手なので、react-Bootstrapを使うことにした。

### 実行時にフロントエンドで保持・管理するマクロな情報
* ログイン情報
* メタバースのUIの設定
* アバターのワールド座標
* デバイスの処理能力・画面の大きさ

これらの情報はcontextに保存することにする。

### 使用する"思想"

バリバリオブジェクト指向で行きたい。
欲しいクラスは、、
* User class
* World class
* Device class

これらをglobalContext classにラップして、
Reactのcontextとして保存する。

### バックエンドから動的に欲しい情報
* ログインするための情報
* メタバースの他のプレイヤーの座標・アバターのモデル
* メタバース内の動的な要素の差分データ

### データベースに求める要件
- リアルタイム性
- 同時接続性
- できれば無料

→Firestore databaseを選択しフロントエンドから直接繋ぐ
→SkyWay SDKを利用してクライアント同士を直接繋ぐ

# 結論
SkyWay SDKとfirestore databaseの2段構成で行きたいが
複雑化しないか心配