OmniAICreator/Qiita-1.07M huggingface dataset:
Unitree L1 LiDARを動かす (ROS2)

# はじめに
こんにちは、kazuです。
少し前にUnitreeの4D LiDARなるものを(半分衝動)購入したので実際に遊んでみたいと思います

# 仕様
- ROS 1, ROS 2対応
- 12V駆動
- USB type-Cで接続
- LOAM(LiDAR Odometry and Mapping)はROS 1のみ
- 本体がくるくる回るタイプ(メカニカルスキャン)
- 角度は360°×90°
- 0.05m〜30m
- 21600 points/s
- imu内蔵
- 230gでめっちゃ軽い！
- お値段5万円〜 (安すぎ)
- 変な見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/d95a6fed-dfd2-e979-31fc-e0ece5d5760c.png)

# 導入
今回はUbuntu22.04,ROS 2 humbleで動かしたいと思います

## 1. SDKの導入
以下コマンドでSDKを入れます
```bash
cd
git clone https://github.com/unitreerobotics/unilidar_sdk.git
cd unilidar_sdk/unitree_lidar_sdk
mkdir build
cd build
cmake .. && make -j2
```
依存関係がないので正常なC++ならすんなり通ると思います

## 2. ROS2 pkgの導入
ビルド前にUSBの設定だけしちゃいます
LiDAR接続後以下コマンドでどこにつながったか確認します

```bash
$ ls /dev/ttyUSB*
/dev/ttyUSB0
```
今回はttyUSB0でした。

```bash
cd
cd unilidar_sdk/unitree_lidar_ros2
```
任意のテキストエディタで `./src/unitree_lidar_ros2/launch/launch.py` の15行目を変更します
できたら保存して、`unilidar_sdk/unitree_lidar_ros2` (srcがある所)で以下を実行します
```bash
colcon build
source install/setup.bash
```
# 実行
電源をいれるとわかりますがぷるぷるします

https://x.com/kzs321/status/1865585978972512542

```bash
ros2 launch unitree_lidar_ros2 launch.py
```
rviz2等で確認します

## Decay time = 0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/6e8bb4be-a951-38a3-7168-28dc51c0c4a4.png)


## Decay time = 0.5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/dc6877c4-7d0b-4514-f090-c6858b9d2f02.png)


## Decay time = 1.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/494d00ee-444a-abd1-1814-8bdf7aed631a.png)

## Decay time = 10.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/653826ef-dbc8-38c1-913c-b89794b4ad5d.png)

また、launch.pyの cloud_scan_numを1に設定しDecay time=0にすると面白いことができます

https://x.com/kzs321/status/1865583657349685550

# 検証結果
- 点群量が少ない！
- 点群中級者なら気づいたかもしれませんが、縦のラインで点取得してて面白い
- ROS 2で自己位置推定できないのは悲しいのでいつかチャレンジしたい
- ルンバとかの遅いロボットなら問題なさそう
- ぷるぷるする
- 遊び用3D LiDARとしてはコスパ最強！ :thumbsup: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/a2660f7c-c368-4cbc-bdd3-5e07805a161f.png)
なぜReduxを使用するのか？

### 1. React における「ローカルストレージ」の問題

- React のコンポーネント自体には state（状態）があり、これは各部屋にある小さなホワイトボードのようなものです。このホワイトボードはとても便利で、何かを書く（データを保存する）ことも、消す（データを更新する）ことも簡単です。

- しかし、複数の部屋がこのホワイトボードの内容を共有する必要があると、問題が発生します：

- 例えば、部屋 A に「ユーザーのログイン状態」が書かれている場合、部屋 B もユーザーがログインしているかどうかを知る必要があります。
- この場合、A 部屋から B 部屋に情報を渡す必要があります（props を使って）。でも、部屋がさらに増えて、A -> B -> C -> D というように、情報を渡し続けるのは非常に面倒です。

### 2. Redux が提供する「集中ストレージ」

- Redux の役割は、大きな倉庫を作り、すべての部屋（コンポーネント）が重要な情報をその倉庫に保存できるようにすることです。
- 各部屋が情報を必要とするときは、倉庫から直接取り出すことができ、情報を一つ一つ渡す必要はありません。

- 簡単な例を挙げてみましょう：

- あなたがコンビニを経営しているとしましょう。
- React の state の方法は、各レジ係（コンポーネント）が自分の現在の収支を記録することです。
- しかし、コンビニ全体の総収入を集計する場合、すべてのレジ係の記録を持ってきて、1つ1つ加算しなければなりません。
- Redux の方法では、すべてのレジ係（コンポーネント）が同じ帳簿（Redux 倉庫）に記帳します。そして、総収入を知りたいときは、帳簿を確認すれば良いのです。

### 3. Redux の核心機能

- Redux はいくつかのシンプルで強力な機能を提供します：

- **統一ストレージ（Store）**：中央の倉庫のようなもので、すべてのデータがここで一元管理されます。
- **アクション（Action）**：倉庫のデータを更新したい場合は、「アクション」を発行する必要があります。これは、何を変更するかを示す申請書のようなものです。
- **リデューサー（Reducer）**：すべての更新は事前に定められたルールに従って行われ、各変更が予測可能で管理可能であることを保証します。

### 4. Redux を使った実際のプロジェクトでの利点

- 例えば、あなたが eコマースサイトを開発しているとしましょう。以下の機能があります：

- ユーザーがログインした後、ショッピングカートにはユーザーのアイテム数が表示されます。
- 他のページ（例えば、注文ページ）でも、ユーザーのログイン状態やカートの内容を知る必要があります。
- ユーザーがカートページで商品を追加した場合、決済ページにもすぐにそのデータを更新しなければなりません。

- もし Redux を使わない場合、次のようにする必要があります：

- ショッピングカートページで state を更新します。
- その後、props を使ってデータを結算ページに渡します。

- しかし、Redux を使うと、次のように簡単になります：

- ショッピングカートページで「商品を追加する」というアクション（Action）を送信します。
- Redux はそのアクションに基づいて倉庫のデータを更新します（Reducer）。
- 他のページ（例えば、決済ページ）は自動的に最新のデータを取得します。なぜなら、それらは直接倉庫に接続しているからです（connect を通じて）。
Reactのカスタムフックについて

## カスタムフック

### 紹介

- Reactでは、**カスタムフック**を作成することで、複雑なロジックを再利用可能な関数として抽象化できます。
- カスタムフックは、`useState`や`useEffect`などのReactのフックを組み合わせて、状態管理や副作用の処理を行うカスタムのフックを作成します。

### 使用方法

カスタムフックは通常、`use`で始まる名前を付ける必要があります。これにより、Reactがそれがフックであることを認識します。

#### 例: カスタムフック `useLocalStorage`

```react
import { useState } from 'react';

// カスタムフックの定義
function useLocalStorage(key, initialValue) {
  // ローカルストレージから値を取得
  const saved = localStorage.getItem(key);
  const initial = saved ? JSON.parse(saved) : initialValue;
  
  const [value, setValue] = useState(initial);

  // 状態が更新された時にローカルストレージも更新
  const setStoredValue = (newValue) => {
    setValue(newValue);
    localStorage.setItem(key, JSON.stringify(newValue));
  };

  return [value, setStoredValue];
}

function Example() {
  const [name, setName] = useLocalStorage('name', 'John Doe');

  return (
    <div>
      <h1>こんにちは、{name}!</h1>
      <button onClick={() => setName('Alice')}>名前を変更</button>
    </div>
  );
}
```

### 特徴
- カスタムフックは再利用可能なロジックの集約であり、複数のコンポーネントで同じロジックを使いたい場合に便利です。
- フックの内部でuseStateやuseEffectを使い、状態や副作用を管理できます。
- カスタムフックはコンポーネントに依存せず、どのコンポーネントでも使えるため、コードの重複を減らすのに役立ちます。
### 注意点
- カスタムフックは通常、コンポーネントの外で定義し、コンポーネント内で使用します。
- カスタムフックもReactのルールに従い、コンポーネント内のトップレベルで使用する必要があります。
ReactのuseRefについて

## useRefとは

### 紹介

- `useRef` は React の Hook の一つで、関数コンポーネント内で参照（reference）を作成するために使用されます。
- 通常、DOM要素にアクセスしたいときに使われますが、状態の管理にも使用することができます。`useRef` はコンポーネントの再レンダリングをトリガーしません。

### 使用方法

- `useRef` を使うと、DOM要素に対して直接アクセスできる「ref」を作成することができます。
- `useRef` はオブジェクトを返し、その `current` プロパティを通じて参照したい要素にアクセスできます。

```react
import React, { useRef } from 'react';

function Example() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={focusInput}>Focus the input</button>
    </div>
  );
}

### 特徴
- useRef の値は再レンダリングを引き起こしません。
- コンポーネントが再レンダリングされても、ref の値は保持されます。
- 状態としての管理には useState を使用し、useRef は主に DOM 操作やその他の参照を管理するために使用されます。
競馬予想AI作成 #1 コンセプト

## 動機
### 「せや！ＡＩにやってもらお！」
競馬を始めて数か月経ったものの、全然当たらない...。

精度を上げるには細かい相互作用に着目する必要がありそうだが、
そこまで時間をかけるモチベーションは無い...。

そこでＡＩになんとかしてもらおうと企むのであった。

## AIモデルのコンセプト
### あるコース条件における各馬の走破タイムを予測するモデル
競馬は上位に入る馬を当てるゲーム。当然、走破タイムが早いほど着順が上になるので
走破タイムを予測できれば着順も予測できる。

#### 懸念点
①かなり厳しい予測精度が求められる

走破タイムは0.1秒単位で記録されている。
予測の不確かさを±0.1～0.2秒以内に抑えないと着順が大きく変動してしまう。

②データが少ないレース条件では、予測精度が低くなると考えられる。
(例えば3200mのレースは国内では天皇賞(春)しかない)

#### 進め方
動機として「細かい相互作用の考慮をAIにやらせたい」というのがあるので
一旦、シンプルにレースデータから走破タイムを予測させるようなモデルを作ってみる。

使い物にならなさそうであれば別の案を考える。

↓イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955641/0359957f-268f-1381-b711-330eabb0e7f5.png)

次回はデータの準備をやっていきます
ReactのコンポーネントとuseStateについて

https://github.com/KyleAndKelly/ReactStepByStep/tree/main/react-basic


## Reactのコンポーネント

### 紹介

- コンポーネントはユーザーインターフェースの一部であり、独自のロジックと外観を持つことができます。コンポーネント同士は入れ子にしたり、複数回再利用したりすることができます。
- コンポーネントベースの開発により、開発者は積み木を組み立てるように、大規模なアプリケーションを構築できます。
-  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/a09acfc3-42f2-31a9-0423-998737a9087f.png)

### 使用方法

- Reactでは、コンポーネントとは頭文字が大文字の関数であり、その内部にコンポーネントのロジックとUI（ユーザーインターフェース）が含まれています。コンポーネントをレンダリングするには、タグとして記述するだけで済みます。
```react
function Son1(props) {
   console.log(props.name)
   console.log(props.age)
   console.log(props.isTrue)
   console.log(props.list)
   console.log(props.obj)
   console.log(props.funct)
   console.log(props.child)
}

function Son2(props) {
  console.log(props.children)
}

function Son3({onGetMsg}){
  const  sonMsg = "hello bro"
  onGetMsg(sonMsg)
}

function Son4(props){
  console.log("now in Son4")
  console.log(props.msg)
}

function Son5(){
  return (  <Son6/>)
}

```
## ReactのuseState
### 紹介

- useStateはReactのHook（関数）で、コンポーネントに状態変数を追加することを可能にします。これにより、コンポーネントのレンダリング結果を制御できます。
- 通常のJavaScript変数とは異なり、状態変数が変更されるとコンポーネントのUIもそれに応じて更新されます（データ駆動のビュー）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/966d8055-b73c-eb54-a4a1-c35b9314928e.png)
### 使用方法
- useStateは関数であり、戻り値は配列です。
- 配列の1つ目の要素は状態変数、2つ目の要素は状態変数を変更するためのset関数です。
- useStateの引数は`count`の初期値として使用されます。
```react
  const [count, setState] = React.useState(0)
```
- Reactでは、状態は読み取り専用と見なされ、常に置き換える必要があります。直接状態を変更してもビューの更新は引き起こされません。

 ```react
  const updateCount = ()=>{
    // count++ //not work
    setState(count+2)
  }
```
Snapshot Save

[Previous << Verify Signature](https://qiita.com/flowcadence/items/7ddd38a2546a5009d186)
[Next >> Development Tools](https://qiita.com/flowcadence/items/6930957249896c0ad5d0)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

FLOW CLIは、最新のfinalizedプロトコル状態(protocol state)のスナップショットを保存するコマンドを提供しています。
```ruby
flow snapshot save <output path>
```

<h1>Example Usage</h1>

```ruby
flow snapshot save  /tmp/snapshot.json --network testnet
```
<h3>Example response</h3>

```ruby
snapshot saved: /tmp/snapshot.json
```
<h1>Arguments</h1>

<h3>Output Path</h3>

* Name: `output path`
* Valid Input: any valid string path

プロトコルスナップショットJSONファイルが保存される出力パス。

<h1>Flags</h1>

<h3>Host</h3>

* Flag: `--host`
* Valid inputs: an IP address or hostname.
* Default: `127.0.0.1:3569` (Flow Emulator)

コマンドの実行に使用する Access API のホスト名を指定します。

<h3>Network Key</h3>

* Flag: `--network-key`
* Valid inputs: ホストの有効なネットワーク公開鍵の 16 進数文字列

コマンドを実行する時にセキュアなGRPCクライアントを作成するために使用するAccess APIのネットワーク公開鍵を指定します。

<h3>Network</h3>

* Flag: `--network`
* Short Flag: `-n`
* Valid inputs: the name of a network defined in the configuration (`flow.json`)
* Default: `emulator`

どのネットワークに対してコマンドを実行するのかを指定します。

<h3>Filter</h3>

* Flag: `--filter`
* Short Flag: `-x`
* Valid inputs: case-sensitive name of the result property.

結果から、唯一の値として取得したいプロパティの名前を指定します。

<h3>Output</h3>

* Flag: `--output`
* Short Flag: `-o`
* Valid inputs: `json`, `inline`

コマンド結果のフォーマットを指定します。

<h3>Version Check</h3>

* Flag: `--skip-version-check`
* Default: `false`

低速な接続を避けて処理を高速化するために、起動時のバージョンチェックをスキップします。

*Last updated on **Nov 26, 2024** by **Giovanni Sanchez***

翻訳元

https://developers.flow.com/tools/flow-cli/utils/snapshot-save


***
<b>[Previous << Verify Signature](https://qiita.com/flowcadence/items/7ddd38a2546a5009d186)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Snapshot Save)

<b>[Next >> Development Tools](https://qiita.com/flowcadence/items/6930957249896c0ad5d0)</b>
【JavaScript】JSDocって何？よく使うJSDocタグまとめ

# JSDocとは
JSDocコメントは**形式が決まった特別なコメント**です。
`@type`や`@param`などのJSDocタグを使ってコメントを書けます。

JSDocコメントを書くと、VSCodeなどのエディタがコメントの内容を別の場所で表示してくれたり、ソースコードから自動でドキュメントを生成したりできます。

ドキュメントはこちらです。

https://jsdoc.app

## 用途

JSDocコメントは以下のような場所に書くのがおすすめです。

- 汎用的に使えるクラス / 関数に書く
- ライブラリを制作する場合、ユーザーから見えるもの対して書く

## 書き方

例えば、引数`a`と`b`を足して返す関数`add`を例に見てみます。

まずは実装を書きます。

```js
function add(a, b) {
  return a + b
}
```

実装はできましたが、呼び出し側はこれがどんな関数なのかわかりません。
おそらく以下の疑問が生まれることでしょう。

- 引数`a`と`b`にはどのような型の値を入れるのか？
- 関数の戻り値は何なのか？

ここでJSDocの出番です。

JSDocコメントは対象となるもの（ここでは関数）の**前の行**に書きます。
また、`/** */`で囲む必要があります。

```js
/** これがJSDocコメント */
function add(a, b) {
  return a + b
}
```

囲んだ中には関数の説明を追加できます。

```js
/** 引数の値を足して返す */
function add(a, b) {
  return a + b
}
```

この説明は、例えばVSCodeのホバーしたときに出るツールチップに表示されます。
以下の画像では一番下の`add`という行にホバーしています。

![hover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588083/6299f4f0-e348-b294-2aff-ba0a48d42635.png)

JSDocでは、**JSDocタグ**と呼ばれる`@`から始まる文字列を使って、特定の形式で情報を書けます。

例えば関数の引数の説明には`@param`を使います。
`@param`は`@param {引数の型} 引数名 説明`という形式です。

```js
/** 
 * 引数の値を足して返す 
 * @param {number} a 足す数1
 * @param {number} b 足す数2
 */
function add(a, b) {
  return a + b
}
```

ここでは`a`と`b`の文字での説明と、これらは`number`であるという型の情報を追加しました。
型の情報はエディタのツールチップでも見れ、場合によっては戻り値の型を推論してくれることもあります。

![hover-param.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588083/1381a67a-b7bf-1044-6c0f-cfdc0f517a2f.png)

# 主要なタグ
ここでは、個人的によく使うJSDocタグをまとめておきます。

一覧は[ドキュメント](https://jsdoc.app)から見れるので、こちらも参考にしてみてください。

## [`@param`](https://jsdoc.app/tags-param)
関数 / メソッドの**引数**を説明するのに使えます。

- 構文: `@param {引数の型} 引数名 説明`
- 引数の数だけ書ける

```js
/** 
 * 引数の値を足して返す 
 * @param {number} a 足す数1
 * @param {number} b 足す数2
 */
function add(a, b) {
  return a + b
}
```

## [`@returns`](https://jsdoc.app/tags-returns)
関数 / メソッドの**戻り値**を説明するのに使えます。

- 構文: `@returns {戻り値の型} 説明`
- 基本的には一つの関数に一つまで

```js
/** 
 * 引数の値を足して返す 
 * @returns {number} 足した数
 */
function add(a, b) {
  return a + b
}

```

## [`@type`](https://jsdoc.app/tags-type)
**変数**の型や、クラスのフィールドの型を示すのに使えます。

- 構文: `@type {型}`
- その変数やフィールドの説明が先に来ることが多い

```js
class Book {
  /** 
   * 本のタイトル
   * @type {string}
   */
  title
}
```

## [`@example`](https://jsdoc.app/tags-example)
関数やクラスなどの**使用例**を示すのに使えます。

説明は、`@example`の次の行以降に**サンプルコード**を書く形となります。
また、Markdown形式で説明を書くこともできます。

```js
/** 
 * 引数の値を足して返す 
 * @example
 * add(1, 2) // 3
 * add(5, 1) // 6
 */
function add(a, b) {
  return a + b
}
```

VSCodeだと、ツールチップにこのように表示されます。

![example-vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588083/1c72514e-e1a8-acde-0bf6-5961cb16eda6.png)

## `@deprecated`
関数やクラスなどが**非推奨**であることを示すタグです。

- 構文: `@deprecated 説明`
- 説明には代わりに何を使うべきか書いておくと親切かも
- 非推奨である関数やクラスのフィールドごとに一つまで

```js
class Book {
  /** 
   * 本の著者 
   * @type {string}
   * @deprecated 代わりにauthorsを使うこと
   */
  author

  /** 
   * 本の著者の配列  
   * NOTE 著者は複数名いることもあるため、配列になっている
   * @type {string[]}
   */
  authors
}
```

VSCode上では、`@deprecated`なものを使おうとすると、名前の上に取り消し線が引かれます。

![スクリーンショット 2024-12-08 11.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588083/4cbbf92a-a6b6-5e0b-b15d-3c1bf6787030.png)
【OpenTK】GLSLに渡すMVP行列は転置しよう

# 注意
　記事を書いている人の線形代数・数学に関する理解は完全ではありません。よってこの記事は「こうすればうまくいく」というのを備忘録的なノリで書いただけのものと思ってください。
 
# OpenTK側とGLSL側の違い
　OpenTKでは行列が行優先であるのに対し、GLSLでは列優先となっています。
　例えば、頂点座標の各成分を$ (x_1, y_1, z_1) $だけ平行移動するためのモデル行列$M$は一般に以下のように表されます。
 ```math
 M=
 \begin{pmatrix}
 1 & 0 & 0 & x_1 \\
 0 & 1 & 0 & y_1 \\
 0 & 0 & 1 & z_1 \\
 0 & 0 & 0 & 1
 \end{pmatrix}
 ```
　これは列優先行列の場合であり、OpenTKの`Matrix4.CreateTranslation`メソッドにベクトル$ (x_1, y_1, z_1) $を渡して返される行列$M'$は
 
 ```math
 M'=
 \begin{pmatrix}
 1 & 0 & 0 & 0 \\
 0 & 1 & 0 & 0 \\
 0 & 0 & 1 & 0 \\
 x_1 & y_1 & z_1 & 1
 \end{pmatrix}
 ```
のような形をしています。これはOpenTKの扱う行列が行優先であるためです。
　したがって、GLSL内に行列を渡す際、転置してやる必要があります。$M'$の転置行列は$M$に一致します。ビュー行列、射影行列も同様です。
　バーテックスシェーダ内では以下のようにして普通に頂点座標を変換してやれば良いです。
 ```GLSL
 gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(position, 1);
 ```
　なお、OpenTK側で提供されているメソッドを利用せずに自分で行列を構築すれば、転置の必要はありません。(ただし、OpenTKのベクトルとの演算は上手く出来ない可能性があります)
Vue3 の公式ドキュメントを読んで基礎を学ぶ

Vue を業務で使い始めました。ちゃんと理解できていないところがあるので公式ドキュメントを読み直して勉強になったことを書き残しておく。

# 算出プロパティ (computed)
computed と watch のどちらを使うべきか悩むことが多かったが、公式ドキュメントに[ベストプラクティス](https://ja.vuejs.org/guide/essentials/computed.html#best-practices)が書いてあった。

- getter 関数は計算のみを行い、副作用がないようにする
  - getter の内部で他のステートを変更しない
  - 非同期リクエストを実行しない
  - DOM を変更したりしない

計算結果は読み取り専用として扱い、変更するなということらしい。computed では、値を計算して返すことだけ行う。

`reverse()` と `sort()` のような元の配列を変更するようなメソッド (ミューテーションメソッド) は、computed の副作用がないようにするという原則に違反してしまう。ミューテーションメソッドを使いたければ、元の配列のコピーを作成する。

```diff
- return numbers.reverse()
+ return [...numbers].reverse()
```

# v-for
特別な理由がない限り、`key` 属性を必ず指定する。[参考](https://ja.vuejs.org/guide/essentials/list.html#maintaining-state-with-key)

- コンポーネントを再描画できる
  - 当然再描画にはコストがかかるので、パフォーマンスが低下することがある。ステートレスな単純な要素の繰り返しであれば避ける。
- 一意なものにする

# ウォッチャー (watch)
computed と異なり、状態の変更に応じて副作用を伴う処理を実行する時に使う。リアクティブな状態の一部 (ref) が変更されるたびにコールバックを実行する

- 非同期処理 (API 呼び出し) を行う
  - 取得したデータでリアクティブなデータを更新する
  - wathch ではデータを返さない (return しない)
- 更新前と更新後の値が使える

# パスカルケース、キャメルケース、ケバブケースのどちらを使うか

コンポーネントのタグには、可能な限り PascalCase を用いる。[参考](https://ja.vuejs.org/guide/components/registration.html#component-name-casing)

```
// 推奨 (テンプレートの可読性が高まるため)
<MyComponent>

// ケバブケースでも書ける (非推奨)
<my-component>
```

props 名はキャメルケースを用いる。

```
defineProps({
  greetingMessage: String
})
```

子コンポーネントに props を渡すときには、常に kebab-case（ケバブケース）を用いて HTML の属性に揃えるのが慣例となっているらしい。[参考](https://ja.vuejs.org/guide/components/props.html#prop-name-casing)

```
<MyComponent greeting-message="hello" />
```

emit でも同じらしい

```
// emit 名はキャメルケース
<button @click="$emit('someEvent')">Click Me</button>

// 親側はケバブケースを使って購読する
<MyComponent @some-event.once="callback" />
```

# props

親のプロパティが更新されたときには子にも流れるが、その逆はない。親コンポーネントが更新されるたびに、子コンポーネント内のすべての props は最新の値に更新される。**子コンポーネント内で props の変更をしてはいけない。**(v-bind)

また子コンポーネントは、受け取った props のうち少なくとも 1 つが変更された更新する。

一方向バインディングと呼ぶらしい。[参考](https://ja.vuejs.org/guide/components/props.html#one-way-data-flow)

# v-model

双方向バインディングを実現する。`defineModel()` が返す値は ref なのでリアクティブな値になる。

inputを含むコンポーネントを作成する場合、今までは引数を定義するための props と、親コンポーネントへ値を受け渡す関数を定義するための emits、どちらも記述する必要があった。
DJコントローラーDDJ-FLX4を使ったElixirでのプログラム集

# DJコントローラーDDJ-FLX4とは

https://www.pioneerdj.com/ja-jp/product/controller/ddj-flx4/black/overview/

DJするためのUSB接続で使えるコントローラーです
DDJ-FLX4単体では音はなりません
ElixirでDDJ-FLX4をMIDIデバイスとして制御してみたい好奇心からはじめました
MIDIデバイスなので制御するだけならOS、言語問わず使えるはずです
但し、音の合成は専用のソフトが必要です
そのため、音の合成は実施してません


# DDJ-FLX4の通信仕様

MIDIメッセージ一覧

https://www.pioneerdj.com/-/media/pioneerdj/software-info/controller/ddj-flx4/ddj-flx4_midi_message_list_j1.pdf

こちらを見ればDDJ-FLX4の制御の方法がわかります

下記のコラムはUbuntu22.04で検証してます

# 基礎

https://qiita.com/t-yamanashi/items/38e4cd7124c4daac111f

https://qiita.com/t-yamanashi/items/24956ff7573f1cb78015

# 応用

https://qiita.com/t-yamanashi/items/0162f822b8cf968dd60c

https://qiita.com/t-yamanashi/items/90ab67186a68e85fc1bf

https://qiita.com/t-yamanashi/items/537b90d51809a2923f15

https://qiita.com/t-yamanashi/items/c75022fd68132c47030b

https://qiita.com/t-yamanashi/items/94245aacd99931f0a54c

https://qiita.com/t-yamanashi/items/98533314876feeafc23e

https://qiita.com/t-yamanashi/items/049837a8eb5046714d6c

# Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」シリーズ

https://qiita.com/t-yamanashi/items/fe2875d81710e2ddece8

https://qiita.com/t-yamanashi/items/e1d4299cc18310f79c57

https://qiita.com/t-yamanashi/items/87d734d7cf9f4b48b0ea

https://qiita.com/t-yamanashi/items/e817a9d8fbd9792c16b5

https://qiita.com/t-yamanashi/items/d648b9c183181aafd3a2

https://qiita.com/t-yamanashi/items/adc407d463b713623115

https://qiita.com/t-yamanashi/items/7b147ceab43fdb0fb195

https://qiita.com/t-yamanashi/items/548545e70b41f26c0cfc

https://qiita.com/t-yamanashi/items/4c6bc950bd1298cb6ddb

https://qiita.com/t-yamanashi/private/5eeb35ac2e62b2567a96
RUST製エディター「Zed」とは


# はじめに

この記事は、Qiita Advent Calendar 6日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

自分が初めてコーディングを始めたのは2年ほど前でした、その時から昨年ぐらいまではずっとVSCodeを使っていたのですが、この度実はメインのエディターをZedというものに変更しました。開発の経緯とかの話に関しては今回は省きますので、参考までに以下の記事を載せさせてもらいます。

https://qiita.com/naka_kyon/items/824fa867b55e17f780f9

ということで、ひとまず編集画面を見てみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/b7597a59-7abb-c98a-31ac-cdc24a745fdf.png)

非常にシンプルですね！ちなみに、この画面は昨日のQiitaのMarkdownを表示しています。

## 自分的な推しポイント

こっからは自分的になんでZedを推せるかについて語りたいと思います。

### 早い

これにつきます。僕のVSCodeの起動はめちゃくちゃ遅いんですよ。というのも、拡張機能をインストールし過ぎているっていうのもありますし、そもそもファイルの読み込みも遅いし、保存も遅いし、まあとにかく重い。というので途中から「あ〜これはもうそろそろ別のに乗り換える時期だなぁ」と思っていたところ、この前の記事とその前の記事で紹介したAlacrittyのことを思い出して、「あ、Rust製なら早いんじゃね！」と思っていたら感が的中。VSCodeは体感起動するまでにYouTubeの広告が一個終わるぐらいですが、Zedは起動するのにアイコン押したらコーヒーを飲む間もなく起動する感じです。

### クロスプラットフォーム

出ました、僕がうるさいぐらい永遠に言い続けていること。なんでそんなこだわるんでしょうかね。というのはさておき、Linuxで使えるだけでもありがたいんですけど、それ以上にArmのLinuxでも使えることは本当にポイント高いです。（参考までに、Asahiで動かしている様子を貼りつけておきます。）

![screenshot-2024-12-08-01-29-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/b10aa965-8434-242b-f3b0-23b9a3fa1aa3.png)

さて、問題はWindowsです。Windowsの場合は自分でビルドする必要があります。が、編集機能だけ欲しい場合にはめっちゃ簡単です。（アカウントログインの機能を入れようとしたらちょっとめんどくさい）

要求要件は以下のとおりです。

- Visual Studio (MSVC v*** - VS YYYY C++ x64/x86 build tools & MSVC v*** - VS YYYY C++ x64/x86 Spectre-mitigated libs (latest))
- Cmakeのインストール（[Cmakeのページ](https://cmake.org/download/)）

あとはぱぱっとビルド

```zsh
# Rustのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# リポジトリのクローン
git clone https://github.com/zed-industries/zed

# ビルド
cd zed
cargo run --release
```

アカウント機能をつけたい方は以下を参考にしてください。

https://zed.dev/docs/development/windows

これけど、見た感じWebの対応も予定しているんですかね、、、？

### 最低限の拡張機能は整っている

普通にまあまあの数の拡張機能はすでに用意されていますし、どうやらLSP(Language Server Protocol)に対応していますのでこれで何かと対応できそうです。

https://zed.dev/docs/extensions/languages

## VSCodeより物足りない感

さすがにVSCodeに比べたら最近できたエディターということもあって昨日が勢揃い！というわけにはいきません。そういうのを求めてる方は大人しくVSCodeを使うことをお勧めします。（例えば、Flutter開発のデバッグ中の〜とかそんな贅沢な機能はありません）

# 最後に

今回はZedに触れましたが、やっぱRustってすごいですね！個人的には今年はRustに惚れ込んだ年になっている気がします。来年はRustに手を出そうかな。
mindの研究 その90

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
AtCoderのwelcomeをやってみよ。

# サンプルコード
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。

```


メインとは
　文字列1は　文字列
　数値aは　変数
　数値bは　変数
　数値cは　変数
　合否は　変数
　単語1は　文字列
　単語2は　文字列

　文字列入力し　文字列1に　入れ
　文字列1を　数値変換し　数値aと　合否に　入れ
　文字列入力し　文字列1に　入れ
　文字列1から　単語切り出し　単語1に　入れ
　文字列1から　単語切り出し　単語2に　入れ
　単語1を　数値変換し　数値bと　合否に　入れ
　単語2を　数値変換し　数値cと　合否に　入れ
　文字列入力し　文字列1に　入れ
　数値aをつみ　数値bをつみ　数値cをつみ　加え　加え　数値表示し
　「 」を　表示し　文字列1を　表示する。
。



```

# 実行結果

```
c:\pmind>wel0
1
2 3
test
6 test
c:\pmind>
```

以上。
Laravel+Reactでwebサービスを作って公開した

独学でプログラミングの勉強をしていて、いつかはwebサービスを作ろうと
活動してきましたが、ついに完成したので作った後の振り返りや気づき、反省などを
書いてみたいと思います。

## どんなサービスを作った？
今回作ったサービスは<a href="https://eng-card.com/">"Engcard(エンカード)"</a>というサービスです。
どんなサービスなのかというと、"web上でオリジナルの英単カードを作って、英単語暗記のサポートをする"というサービスになります。
![engcard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/a7b16ea8-40a9-0402-8839-93e50dce414a.png)

## 作ろうと思った動機
自分が英語の勉強(TOEICがメイン)をしているのですが、
単語を覚える際に、ノートや紙で単語集みたいなのを作っていましたが
後から情報を書き足したり、編集するのにあたりノートや紙では不都合に感じる部分がありました。
アプリなどで単語帳を自作できるもの現存そしてますが、私の場合単語とその意味だけではなく、
品詞(動詞や名詞)などをプルダウンで選択して登録できるようにしたい、例文も登録したいなどという
要望を持っていました。しかし、そんなことできるサービスが自分で探した限りでは見つからす、
それなら自分で作ろうと思い立ちました。

## 機能
主な機能は下記の通りです。

<ul>
    <li>会員登録</li>
    <li>単語帳作成&単語カード作成</li>
    <li>暗記やクイズなどの学習モード</li>
    <li>学習状況ダッシュボード</li>
</ul>

【画面】
![eng-add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/292604c1-2128-33da-4b79-ca579b675399.png)
![card-edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/5cb582b2-4cb4-3b9e-11b6-be2c94abee38.png)
![eng-quiz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/ea4ce944-88b8-e7c2-89d8-d6b035d4ad14.png)
![eng-da.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/26ddc46b-47a2-f900-0dda-438b3e07a411.png)

当初は、単語のデータだけを登録して閲覧するだけくらいの
サービスで行くつもりでしたが、色々欲張って他の機能もつけてみました。


## 技術選定
### バックエンド
>Laravel breeze
    

### フロントエンド
>React(TypeScript)
### ライブラリ
<ul>
    <li>Inertia.js</li>
    <li>hashids/hashids</li>
    <li>react-chartjs-2</li>
</ul>

Laravel Breezeで、ビューをReactにするスターターキットで作っています。
また、TypeScripを採用しています。
会員登録、ログイン、パスワードリセットなどの機能とReactのビューも
セットアップ済みなので、Auth関連は画面のデザイン変更くらいしかやっていません。
あと新規登録時に、メール認証がしたったので、その機能の有効化をしたくらいです。

https://laravel.com/docs/11.x/starter-kits

Inertiaというライブラリが、Laravelでblade.phpでビューを書くのと
同じ感覚でReactにControllerから値を渡せるようにしてくれていて、
また、ルーティングも同様にControllerで表示するReactのビューを指定できます。
React側でのバックエンドとのデータ通信処理やルーティングの処理が不要となり開発が楽になります。

https://inertiajs.com/

詳細ページや編集ページにアクセスする際、idをそのままURLに含めるのが
セキュリティ的にイマイチかなと思い、hashidsで暗号化するようにしました。
グラフをダッシュボードで表示するのにはreact-chartjs-2を使っています。


## 振り返り
休日に独学で勉強しながら作っていたので、なんだかんだで1年半くらいにかかってしまいました。
また、当初は、laravelのスターターキットやInertiaを知らず、自力でLaravelにReactを導入したりしていて一度0から作り直した経緯もあり、事前の情報収集はしっかりするべきだったと反省しています。
また、Inertia自体もあんまり普及しているような技術ではないと後々気づいてしまったため、現在は
NEXT.jsでのリプレイスを検討中です。
ゲームプログラマのポエム

# ゲームプログラマのポエム

2024年12月8日(日) 10時28分38秒
良く晴れているので、今日はポエムにしておこう

## ポエム

時代が進むとポリゴン数は増えるし、ディスプレイの解像度は上がるし、色数は増えるし、当然テクスチャのサイズもゴリゴリ上がる

当然ストレージやネットワークからのロードには時間がかかりまくる。ここを速くしようとしてもそのうち限界が来る

そこである程度「誤魔化し」の知恵が必要になる

誤魔化すためには、今度は人体―目玉、視神経、脳味噌の処理―の理解が必要になる

意外と目玉とか視神経全体の解像度は高くないんだけど、その解像度は視界に対して一様ではなくて注意を向けている中心が高く、その周辺は低くなる

また、明暗(濃淡)の解像度は高いけど色じたいの解像度は高くない

それを利用して、明度情報はフル解像度にして色差の解像度を半分に落としてみても、意外と気づかれない(現役の時に使ったテク)

アーティストさんにも気づかれなかったのだから相当なのだ。当然ゲームデザイナーさんに気づかれるはずもない

また、静止しているならそのうち気付かれるけど、ゲームやムービーというのは大抵動いているため気づけない
停止する時は数フレーム遅れてからフル解像度、最高レベルの素材をロード！でもいい

ロード時間とかメモリが足りないなどの制約が出てきたときはこの辺の特性を突くッッ！
突きまくって誤魔化すッ！という対処も考える必要が出てくるのだッ！ホワチャァッ！

さらに「動き」について言うと、これも思ってるほど解像度が高くなくて、その間を脳味噌が補間している(補間できてなくても脳味噌が割と無理やりつじつまを合わせてくる)

ロード時間とかメモリが足りないなどの制約が出てきたときはこの辺の特性を突くゥ～！という対処も考える必要が出てくる(続く


目的は世界を忠実に表現する事ではなく「そう見せる(何となく違和感をなくす)」事なのだ

この辺の話になってくるとプログラマ脳だけではいいアイデアが出てこないので、他の職種のみなさまアーティストさんやゲームデザイナーさんやテクニカルアーティストさんやらと話し合ったほうが良かったりする

速度に難があるからってプログラマだけの問題ではないのだァッ！

でもプログラマも美的感覚というか、審美眼というか、自分が世界をどう見ているのか理解しよう！

さぁ、ゲームプログラマも、外に出て風景を見よう、歩こう！走ろう！限界まで走ろう！
走りながら周囲の風景を見よう！

晴れてる日、雨の日、昼と夕方と夜の風景の見え方にも気を付けて走ろう！にこやかに！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275040/fc6d35ab-79bf-068f-f17e-adcb3798d0ba.png)


でも夜に走る時は気を付けよう！な！！
ABC383回答メモ

# 0.はじめに
　今週はA問題から難しいと思っていたらC問題でブレーキ。
　結局ABしか解けず終了。
　全体的に低かったのか、レートはそこまで落ちず
　-4で629でした。ますます緑が遠のいていきます。

# 1. 	A - Humidifier 1
　この加湿器は穴が開いてて水が減ると言う問題ですが
　普通に加湿によって水が減るじゃダメだったのかな・・・。
　などと余計なことが気になりました。
　T毎の水の量さえ分かればいいので
　まず、1行目のTとVを基本とし
　2行目以降読み込むごとに、読み込んだTと
　前回のVから今回のT時点での水量を求め
　そこに今回のVを足すとしました。
　今回のT時点での数量を求める際に0以下にはならないように
　工夫するところがポイントかなとおもいました。

　https://atcoder.jp/contests/abc383/submissions/60507840


# 2.B - Humidifier 2
　え、Bでこれ・・・？
　と思う難易度で、まぁ配点も250ではありましたが
　なかなか難問でした。
　まぁ制約で、HとMが100までだったので多少冗長でも
　何とかなるかとの方針ですすめました。

　【考え方】
　　1.マップをもとに床の位置のタプル(x,y)をリストP1に格納
　　2.P1を2重ループで読み込んで加湿器を置く2か所の全組み合わせに対し以下チェック
　　　2-1.P1を先頭から読み込み２の2か所からそれぞれの距離がD以下だった場合
　　　　　セットSTにその場所を格納
　　　2-2.セットの長さが最大の物をansに格納
　　3.ansを出力して終了

　2のループを減らす工夫とかいろいろ出来そうでしたが、雑な実装でも
　ACとなりました。

　https://atcoder.jp/contests/abc383/submissions/60522762

# 3.C - Humidifier 3
　問題を見て、あーDFSね、はいはいと勝手に判断して
　とりかかるもTLEが消せず時間だけが過ぎて行きました。
　ダメもとでチャットGPTに高速化する方法を聞いたところ
　こういうのはDFSではなくBFSだよ。と言われ、変更案まで
　出してきたのでその通りにしたら、TLEが1個までにへりました。
　DFSでの試行錯誤時の余計なロジックを直したらTLEが消えましたが
　その時点で22:40:28と、ぎりぎり間に合いませんでした・・・・。

　https://atcoder.jp/contests/abc383/submissions/60544911


以上
ゼロから作るDeepLearning #3 -出力層のこと-

※以下の企画です

https://qiita.com/tatataichi/private/56936a028e625e62af8e

前回に続いてゼロつくやっていきます。
今回は3章-ニューラルネットワーク-の続きです。
前回は活性化関数のことをメインで学び、今回は実際に三層のNNを組んでいくという内容になりそうです。

それでは頑張っていきます〜

# 3章 ニューラルネットワーク
## 3層NN
ニューラルネットワークの計算は、**各ノードへの入力値に重みを掛けて総和を取る**だけ。
コードに落とし込むと、「各ノードへの重み×入力値の計算」を「ノード数×層」分繰り返すことになる。
ちょっと冗長なコードになりそうな印象だが、`numpy`ライブラリを用いれば割とキレイに書くことができる（僕も本書を読んで知った）。

```python:3層NN
def init_network():
  network = {}
  network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
  network['b1'] = np.array([0.1, 0.2, 0.3])
  
  network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
  network['b2'] = np.array([0.1, 0.2])
  
  network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
  network['b3'] = np.array([0.1, 0.2])

  return network

def identity_Function(x):
  return x

def forward(network, x):
  w1,w2,w3 = network['W1'], network['W2'], network['W3']
  b1,b2,b3 = network['b1'], network['b2'], network['b3']

  a1 = np.dot(x, w1) + b1
  z1 = sigmoid(a1)
  a2 = np.dot(z1, w2) + b2
  z2 = sigmoid(a2)
  a3 = np.dot(z2, w3) + b3

  y = identity_Function(a3)

  return y
```

コードはみたまんまの内容だが、`a1 = np.dot(x, w1) + b1`という部分が割とミソで、行列同士の席やベクトルの内積をサクッと計算してくれる関数。
これで繰り返し文をエッサホイサと記述する必要がなくなる。ありがたい。

また、`identity_Function`という関数が最後に用いられている。
関数の中身を見ると、入力をそのまま出力に設定しているだけの謎関数に見えるが、これは後で出力層をイジイジするときに使うらしいのおいておく（これは恒等関数と言うらしい）

実行結果をみてみる。

```python:3層NNの実行
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
```

```terminal:実行結果
[0.31682708 0.69627909]
```

めっちゃ簡単！

## 出力層の設計
### 分類、回帰問題
出力層に用いていた恒等関数は回帰問題のときに用いて、分類問題のときに**ソフトマックス関数**というものを用いるらしい。

### ソフトマックス関数
まずは式から。

```math
y_{k} = \frac{\exp(a_{k})}{\sum_{i=1}^{n}\exp(a_{i})}

```

出力層への入力が$n$個あって、$k$番目の出力$y_{k}$を求めるという計算。
また、指数感の計算は桁数がとんでもない数になるので、コンピュータでそのまま扱おうとするとエラーになるらしい。
なので、**入力値の最大値を分母分子から引く**という処理を行う。
これは、**ある定数を分母分子に加えたとて、計算結果は変わらない**という特徴を活用している。証明式は本書内にあるので興味のある人は是非とも読んでみてほしい！（怠惰）
※入力の最大値を使うのは、なんかそういう流れがあるからってだけらしい

ということで、それらも踏まえてソフトマックス関数をコードに落とし込んでみる。

```python:ソフトマックス関数
def softmax(a):
  c = np.max(a) # 入力の最大値を確保
  exp_a = np.exp(a - c) #オーバーフロー対策
  sum_exp_a = np.sum(exp_a)
  y = exp_a / sum_exp_a

  return y
```

ソフトマックス関数の特徴としては、出力の総和が1になるという点。
これで何が言いたいかというと、これは「**各出力の発生確率に置き換えられる**」ということ。
だからソフトマックス関数は分類問題に用いられるということみたい。

```python:ソフトマックス関数の動作
a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y)
```
```terminal:実行結果
[0.01821127 0.24519181 0.73659691]
```
```python:ソフトマックス関数の出力総和
np.sum(y)
```
```terminal:実行結果
1.0
```

ここまでやっといて「え？」となったのが、ニューラルネットワークで分類問題を推論するときは、ソフトマックス関数を省略するらしい。草
というのも、指数関数を用いても**入力された値のそもそもの大小関係は変わらず、単調増加するだけ**なので、重たい計算しなくても**最大値を取るだけで**大丈夫だってことらしい。
まぁたしかに。

# まとめ
今回は出力層に用いる関数について学んだ。
ソフトマックスとか恒等関数とか、忘れかけていたものを改めて理解できて良かった。
次回はいよいよMNISTデータを用いてのテストになる。
**こんな牛歩進捗で、月内に終わる気がしない**。
では、次回も頑張ります〜〜
システム運用最適化：スケーラビリティと移行戦略

# 導入

こんにちは、もんすんです。

ITインフラやアプリケーション開発において、**「スケーラビリティ」** や **「移行戦略」** といった言葉が使われることがあります。
これらは、システムを効率的に運用・拡張するために重要な考え方です。

今回は、それぞれの概要と実際の利用例について備忘録の意味を込めつつ、解説していきます。

# スケーラビリティとは？

**スケーラビリティ**とは、システムが増加する処理量や負荷に対応する能力を指します。
例えば、自分が運営しているウェブサイトへのアクセス数が急増した場合、そのアクセスをスムーズに処理するには**システムを拡張する必要**があります。
この<font color="red">拡張が容易に行えるかどうか</font>が、システムのスケーラビリティに関わります。

スケーラブルなシステムを構築するためのアプローチとして、以下の2つが挙げられます。

## 1. 水平スケーリング(Horizontal Scaling)

**水平スケーリング**では、サーバーやコンテナなどの「数」を増やして負荷に対応します。
追加のサーバーを用意し、処理を複数のサーバーで分散させるイメージです。

- **利点**:
    - リソースを簡単に追加・削減できる柔軟性がある。
    - サーバーが1台ダウンしても、他のサーバーが処理を続けることで高可用性を確保できる。
- **例**:
    - クラウド環境での自動スケーリング(AWSのAuto ScalingやGoogle CloudのInstance Groups)。
    - コンテナ技術を使ったKubernetesの負荷分散。

## 2. 垂直スケーリング(Vertical Scaling)

**垂直スケーリング**は、既存のサーバーの性能を向上させる方法です。
CPUやメモリを増強して、1台のサーバーでより多くの処理をこなせるようにします。

- **利点**:
    - 既存のシステム構成を大きく変更せずに対応可能。
- **制約**:
    - サーバー自体の物理的な限界があるため、拡張性に制約がある。
- **例**:
    - データベースサーバーのメモリ増設や高性能CPUの導入。

# 移行戦略とは？

システムを効率的に運用するためには、**環境の変更(移行)** が必要になることがあります。
オンプレミス(自社保有のサーバー)からクラウドへの移行がその一例です。

このような移行を成功させるための計画を**移行戦略**と呼びます。

## 主な移行戦略

1. **リホスト(Rehost / Lift and Shift)**  
    現在のシステムをほぼそのまま新しい環境に移行する方法です。
    移行が迅速に行える一方で、新環境のメリットを十分に活用できない場合があります。
    
2. **リプラットフォーム(Replatform)**  
    一部を最適化し、新しい環境に適応させる方法です。  
    例: アプリケーションをクラウド用に再構成し、データベースをクラウドネイティブなサービスに移行。
    
3. **リファクター(Refactor)**  
    アプリケーションを再設計し、新しい環境の機能を最大限活用します。
    開発コストが高くなる可能性がありますが、システムの性能向上や柔軟性の向上が期待されます。
    
4. **リパーチェス(Repurchase)**  
    既存システムをクラウドサービスに置き換える方法です。
    現在のニーズに合ったソリューションを採用できます。
    
5. **リテイン(Retain)**  
    現在の環境にシステムをそのまま残す方法です。
    移行が難しい場合や、現環境での運用が適切な場合に選択されます。
    
6. **リタイア(Retire)**  
    必要のないシステムを廃止し、コストを削減します。

# 最後に

システムのスケーラビリティを高めることで、ビジネスの成長に伴う負荷に柔軟に対応できます。
水平スケーリングと垂直スケーリングを適切に組み合わせることで、効率的なシステム運用が可能です。

また、移行戦略を計画する際には、ビジネス要件や現状のインフラを考慮し、最適な方法を選択することが重要です。

これらの考え方をしっかりと理解し、システムの要件に最適な選択を行っていきましょう！
【初心者向け】例外を無視しないで！例外処理の基礎知識

# 導入

こんにちは、もんすんです。

プログラミングを学んでいく中で、**例外処理**は避けて通れない重要なテーマです。

プログラムが実行中に予期しない問題が発生することはよくありますが、その際にどう対処するかがプログラムの安定性に大きく影響します。
今回は、初心者にも分かりやすく、例外処理の基本とその正しい使い方を解説していこうと思います。

例外を適切に処理する方法を理解することで、より堅牢で信頼性の高いプログラムを書くことができるようになります。

# 例外について

## 例外とは何か？

プログラムを実行しているときに発生する「予期しない問題」が**例外**です。
これらは、プログラムが正常に動作するために予測していなかったエラーや問題のことを指します。
プログラムが正しく実行されるためには、こうした例外を適切に処理することが必要です。

例えば、以下のような状況で例外が発生することがあります。

- 存在しないファイルを開こうとしたとき(例: `FileNotFoundException`)
- 0で割り算をしたとき(例: `ArithmeticException`)
- ネットワーク接続が切れたとき(例: `IOException`)

これらの問題が発生した際、そのままプログラムが進んでしまうと予期せぬ動作を引き起こし、大きなトラブルの原因になります。
例えば、計算結果が不正確になったり、システムがクラッシュしたりする可能性もあります。

そのため、**例外を適切に検出し、処理を行うことが重要**です。

### 例外を無視してはいけない理由

例外が発生した場合、その目的は「**何か問題が起きたことを知らせる**」ことです。
しかし、以下のように例外を無視してしまうコードを書くと、この目的が失われてしまいます。

```java
try {
    // 例外が発生する可能性のある処理
} catch (Exception e) {
    // 空のcatchブロック：何もしない...
}
```

これは、「**火災報知器が鳴っているのに、それを無視する**」のと同じです。
本当に火事が起きているのかを確認せずに警報を無視してしまえば、後で大きな被害につながるかもしれません。

プログラムにおいても、例外を無視すると、その原因がわからずにバグや障害を引き起こす可能性が高くなります。

このような実装は**品質の低いコード**と見なされがちです。
例外が発生した理由を適切に理解し、その後の処理を考えることが、良いプログラムを作るための基本です。

## 正しい例外処理の基本

例外が発生したときに、どのように対応するべきかを理解しておくことは非常に重要です。
適切な例外処理を行うことで、プログラムの安定性を保ち、エラーが発生した場合でも、ユーザーに与える影響を最小限に抑えることができます。

正しい例外処理の基本としては、以下の3つが挙げられます。

1. **例外を記録する**
    例外が発生した場合、その内容をログに残すことが重要です。
    これにより、後から問題を追跡しやすくなり、原因特定や修正作業が迅速に行えます。
2. **適切な処理を行う**
    例外が発生した場合、ただちにエラーを報告するだけでなく、適切な処理を行うことが大切です。
    例えば、ネットワーク接続のエラーが発生した場合は再試行を行ったり、データベース接続の失敗時には再接続を試みたりすることが考えられます。
3. **例外を無視する理由を明確にする**
    例外を無視する必要がある場合でも、その理由をコメントで明確にすることが重要です。
    無視する理由をコードに残しておけば、後からコードを見たときにその判断が正当であったかどうかを確認できます。

### **例外を無視してもよい場合の例**

例外を無視してもよい場合もありますが、その場合でも必ず理由をコメントで記述しておくことが大切です。

例えば、ファイルを閉じるときに発生した例外を無視することは一般的です。
もしファイルを閉じる際にエラーが発生しても、すでに必要なデータを読み取っていれば、プログラムにとって大きな問題にはならないからです。
とはいえ、その理由を明確にしておくことは、後でコードを確認したときに理解しやすくします。

```java
try {
    fileInputStream.close();
} catch (IOException ignoredError) {
    // ファイルのクローズが失敗しても問題ないので無視する
}
```

このコードでは、ファイルを閉じる操作が失敗してもそれがプログラムの流れに影響しない場合に例外を無視しています。
しかし、コメントでその理由を記載することで、後からコードを見た開発者がその判断を理解できるようにしています。

## 例外処理の具体例

実際のプログラムでよく見られる例外処理の例を紹介します。

以下は、タイムアウトが発生した場合にデフォルトの値を使用する例です。
もし計算が1秒以内に完了しなければ、デフォルト値を返すようにしています。

```java
Future<Integer> futureTask = executor.submit(() -> calculateValue());
int result = 10; // デフォルト値

try {
    result = futureTask.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignoredError) {
    // 計算結果を取得できない場合、デフォルトの値を使う
}
```

このコードでは、`futureTask.get` がタイムアウトを起こす可能性があります。
そのため、`TimeoutException` や `ExecutionException` が発生した場合には、デフォルト値(この場合は `10`)を使うという処理を行っています。

このように、例外が発生した場合に何をすべきかを事前に設計し、その処理をコードに組み込むことで、システム全体の安定性を高めることができます。

# 最後に

例外処理は、プログラムが正常に動作し続けるために不可欠な要素です。
例外を無視せず、適切に処理することで、エラー発生時にも安定した動作を保つことができます。

これらを意識し、より堅牢で信頼性の高いプログラムを書くことを心がけましょう！
データベースインデックスとは？

# 導入

こんにちは、もんすんです。

データベースを使っていると、データの検索速度が遅くなることがありますよね。
その原因の一つは、**データ量が増え、検索対象のテーブル全体をスキャンしなければならない**ためです。
これを解決する方法の一つが<font color="red">「データベースインデックス」</font>です。

この記事では、インデックスの仕組みや使い方についてわかりやすく説明します。

# データベースインデックスについて
## まず、インデックスとは？
インデックスは、本で言うところの「索引」にあたります。
辞書や参考書の索引を使うと、目的のページをすぐに見つけられるように、データベースのインデックスも特定の列を素早く検索できる仕組みです。

例えば、テーブルの中に100万件のデータがあるとします。

この中から「特定のユーザーID」を探したいとき、インデックスがないとデータベースは全てのデータを1件ずつ調べる必要があります(これを**フルテーブルスキャン**と言います)。  
しかし、ユーザーIDにインデックスを作成すると、効率的に絞り込みができるため、検索速度が格段に上がります。

## インデックスの仕組み
インデックスは、指定した列のデータを整理し、データベースが効率よくアクセスできるようにした「別のデータ構造」です。

多くの場合、**Bツリー**という仕組みが使われており、インデックスは**実際のデータの「参照先」** を記録します。  
これにより、データベースは必要なデータをすぐに見つけられるのです。

## インデックスを使うときの注意点
便利なインデックスですが、無制限に使えるわけではありません。
適切に使わないと、逆にデータベースの性能を下げてしまうこともあります。

1. **ストレージ容量が増える**  
   インデックスは別のデータ構造を作るため、ストレージを消費します。
   たくさんインデックスを作ると、ディスクの使用量が増えます。

2. **書き込み操作が遅くなる**  
   データを追加・更新・削除すると、同時に<font color="blue">インデックスも更新</font>されます。
   そのため、頻繁に変更されるデータにはインデックスを貼りすぎない方が良いです。

3. **適切な設計が必要**  
   インデックスはどこにでも貼れば良いわけではありません。
   使いどころを間違えると効果が薄くなることがあります。

## インデックスを貼るべき場所
では、どのような列にインデックスを貼ると効果的なのでしょうか？

以下に具体例を挙げます。

### 1. 検索条件でよく使う列
例えば、`WHERE`句で絞り込みを行う列です。 
```sql
SELECT * FROM users WHERE user_id = 12345;
```
ここでは`user_id`にインデックスを貼ると検索速度が向上します。

### 2. テーブル結合に使う列
テーブルを結合する際に`JOIN`で使う列にインデックスを貼ると、効率が良くなります。たとえば、以下のクエリでは`user_id`にインデックスを貼ると効果的です。  
```sql
SELECT * FROM orders 
JOIN users ON orders.user_id = users.user_id;
```

### 3. 並び替えや集計に使う列
`ORDER BY`や`GROUP BY`で使う列もインデックスを貼ると処理が高速になります。  
```sql
SELECT * FROM products ORDER BY price ASC;
```

### 4. 一意性が必要な列
`UNIQUE`制約がある列(例：メールアドレス)には自動でインデックスが貼られます。
この特性を理解しておくと良いかと思います。

### 5. 選択性が高い列
**重複が少な**く、検索対象が絞り込まれる列(例：ユーザーIDやメールアドレス)にインデックスを貼ると効果的です。

## インデックスを貼るべきでない場合
逆に、インデックスがあまり役に立たない場合もあります。

- 値の種類が少ない列(例：性別やフラグ)  
  `男・女`や`有効・無効`のような値しかない列にインデックスを貼ると、返される行数が多すぎて効果が薄いことがあります。

- 更新が頻繁な列  
  毎秒のように値が変更される列にはインデックスを貼ると書き込み速度が遅くなります。

# 最後に
データベースインデックスは、クエリのパフォーマンスを大幅に向上させる便利な仕組みです。
ただし、適切な場所に貼ることが重要です。  

インデックスの仕組みを理解して、データベースの性能を最大限引き出しましょう！
SME日記その8 __arm_new("za")について調べる

[ArmのScalable Matrix Extension (SME)を試す](https://zenn.dev/mod_poppo/articles/arm-scalable-matrix-extension)で示されているSMEによる行列乗算を実行するには，`__arm_new("za")`に相応する前処理・後処理を行う必要があるので，`__arm_new("za")`について，ドキュメントを読んでみました．

SMEシリーズ

- [Apple Silicon M4はM3シリーズからScalable Matrix Extension (SME)命令などが足されている](https://qiita.com/zacky1972/items/69fd802fd41ae4d7d469)
- [SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension(SME)のベクトル長(SVL)を取得する](https://qiita.com/zacky1972/items/231fd22a1fdef15d4108)
- [SME日記その2: Apple Silicon M4にはCVTW命令は備わっていない？](https://qiita.com/zacky1972/items/a4fc98614df085586175)
- [SME日記その3: Apple Silicon M4にどの命令が実装されているかをsysctl hwの実行結果とドキュメントから推測する](https://qiita.com/zacky1972/items/427035001554cb9768bc)
- [SME日記その4 Streaming SVE modeでCNTWを実行してみる．](https://qiita.com/zacky1972/items/3182fa1693983846205d)
- [SME日記その5 Streaming SVE modeでCNTWを実行してみる Part 2](https://qiita.com/zacky1972/items/b7b5dd456fe021b30eb2)
- [SME日記その6 Streaming SVE modeでsvcntw()とsvcntsw()を実行してみる](https://qiita.com/zacky1972/items/7d4ec630d54564ebb9b3)
- [SME日記その7 svcntw()とRDSVL命令の実行結果の関係性を考察する](https://qiita.com/zacky1972/items/48cf7577e254b8c3a0b6)

## `__arm_new("za")`に関するドキュメント

https://clang.llvm.org/docs/AttributeReference.html#arm-new

> __arm_new
> 
> Supported Syntaxes
> 
> * GNU
> * C++11
> * C23
> * `__declspec`
> 
> Keyword
> 
> * `#pragma`
> 
> HLSL Annotation
>
> `#pragma clang attribute`
> 
> `__arm_new`
>
> The `__arm_new` keyword applies to function declarations and specifies that the function will create a new scope for state S.
> 
> The attribute takes string arguments to instruct the compiler for which state to create new scope. The supported states for S are:
> 
> * `"za"` for Matrix Storage (requires SME)
> 
> For state `"za"`, this means that:
> 
> * the function requires that the target processor implements the Scalable Matrix Extension (SME).
> * the function will commit any lazily saved ZA data.
> * the function will create a new ZA context and enable PSTATE.ZA.
> * the function will disable PSTATE.ZA (by setting it to 0) before returning.
>
> For `__arm_new("za")` functions Clang will set up the ZA context automatically on entry to the function and disable it before returning. For example, if ZA is in a dormant state Clang will generate the code to commit a lazy-save and set up a new ZA state before executing user code.
> 
> `__arm_new` キーワードは関数宣言に適用され、関数が状態 S の新しいスコープを作成することを指定します。
>
> この属性は、どの状態に対して新しいスコープを作成するかをコンパイラに指示する文字列引数を取ります。S でサポートされている状態は次のとおりです。
>
> * マトリックス ストレージの場合は `"za"` (SME が必要)
>
> 状態 `"za"` の場合、次のようになります。
>
> * 関数では、ターゲット プロセッサが Scalable Matrix Extension (SME) を実装している必要があります。
> * 関数は、遅延保存された ZA データをコミットします。
> * 関数は新しい ZA コンテキストを作成し、PSTATE.ZA を有効にします。
> * 関数は、戻る前に PSTATE.ZA を無効にします (0 に設定)。
>
> `__arm_new("za")` 関数の場合、Clang は関数に入るときに ZA コンテキストを自動的に設定し、戻る前に無効にします。たとえば、ZA が休止状態にある場合、Clang は遅延保存をコミットし、ユーザー コードを実行する前に新しい ZA 状態を設定するためのコードを生成します。

## 考察と将来課題

そうすると，次の処理それぞれをどのように行うかを調べれば良さそうです．

> * 関数は、遅延保存された ZA データをコミットします。
> * 関数は新しい ZA コンテキストを作成し、PSTATE.ZA を有効にします。
> * 関数は、戻る前に PSTATE.ZA を無効にします (0 に設定)。

次にこれらについて調べていきます．
Chromeboook に R と RStudio をインストールする

## 1. はじめに
Chromebook に、次の記事で紹介したツールを使って、R の開発環境を構築してみました。

https://qiita.com/Mitz-TADA/items/499feff855bccc9cb022

## 2. R のインストール
まずは
```bash
# パッケージリストの更新とプログラムパッケージのアップデート
sudo apt update && sudo apt upgrade -y
```
次の (1),(2) どちらか一つの方法でインストールしてください。
### (1) 記事で紹介した rig を使ってのインストール
```bash
# rig のリポジトリの署名キーの追加
`which sudo` curl -L https://rig.r-pkg.org/deb/rig.gpg -o /etc/apt/trusted.gpg.d/rig.gpg

# rig のリポジトリの追加
`which sudo` sh -c 'echo "deb http://rig.r-pkg.org/deb rig main" > /etc/apt/sources.list.d/rig.list'

# rig のインストール
`which sudo` apt update
`which sudo` apt install r-rig
```
```bash
# 最新の R のインストール
rig add release
```
```bash
# R のバージョン確認
rig list
```
### (2) 通常のインストール後、P3M のリポジトリ設定と pak のインストール
```bash
# 最新の R のインストール
sudo apt install -y r-base
```
```bash
# R のバージョン確認
R --version
```
```bash
# R の起動
R
```
```r
# P3M リポジトリ設定用.Rprofileファイルの作成
my.Rprofile <- 'local({
  repos <- c(P3M = "https://packagemanager.posit.co/cran/__linux__/bookworm/latest")
  options(repos = c(repos, getOption("repos")))
})
'
cat(my.Rprofile, file = ".Rprofile", append = TRUE)
```
```r
# pak のバイナリビルドパッケージのインストール
install.packages("pak", repos = sprintf(
  "https://r-lib.github.io/p/pak/stable/%s/%s/%s",
  .Platform$pkgType,
  R.Version()$os,
  R.Version()$arch
))
```
```r
# R の終了
q()
```
## 3. RStudio のインストール
ローカルの deb ファイルのインストール時に、依存ファイルも同時にインストールしてくれる gdebi を使ってインストールします。
```bash
# gdebi のインストール
sudo apt install -y gdebi-core
```

https://posit.co/download/rstudio-desktop/

から、Debian 12 用の deb ファイルをダウンロードします。
- ダウンロードリンクを２本指タップして、保存先を「Linux ファイル」フォルダにする
- 次のコマンドのファイル名は、ダウンロードしたファイル名に変更
```bash
# RStudio のインストール
sudo gdebi rstudio-2024.09.1-394-amd64.deb
```
## 4. tidyverse のインストール
pak を使ってインストールします。

R または RStudio を起動して、
```r
pak::pak("tidyverse")
```
### 5. 最後に
ご利用は自己責任でお願いします。
「データベースマイグレーション」って何だっけ？

# 導入

こんにちは、もんすんです。

皆さんはデータベース、使っていますか？

**データベースマイグレーション**は、データベース構造(スキーマ)を安全かつ効率的に変更するための手法です。

今回は、そのマイグレーションの概要や目的などについて解説します。

# データベースマイグレーション

## データベースマイグレーションとは？

データベースマイグレーションは、データベーススキーマを現在の状態から新しい状態に移行するプロセスを指します。
このプロセスを通じて、以下のような変更が行われます。

- テーブルやカラムの追加・削除
- データ型の変更
- 制約(キーやインデックスなど)の追加・変更
- データの移動や分割

マイグレーションは、アプリケーションのコードと連携しながら、**開発・テスト・本番環境すべてでスキーマの整合性を保つ**のに役立ちます。

## なぜマイグレーションが必要なのか？

ソフトウェアの開発過程では、要件の変更に伴ってデータベース構造の修正が頻繁に発生します。
しかし、スキーマを直接編集する行為には、以下のリスクを伴います。

- データの損失
- 環境間でのスキーマ不一致
- 変更履歴の不明確化

マイグレーションを採用することで、これらのリスクを最小限に抑えることごできます。
それにより、以下を実現することができます。

- **安全性**: データを失うことなく変更を適用
- **可視性**: 変更履歴の追跡とチーム間の共有
- **再現性**: どの環境でも同じ変更を自動適用可能

## マイグレーションの実装戦略

マイグレーションには主に以下の2つの方法があります。
それぞれの特徴と利用シーンを見ていきましょう。

### 1. 状態ベースマイグレーション

- **概要**
    - 現在のデータベーススキーマと望ましいスキーマを比較し、その差分を適用するアプローチ
- **利点**
    - 一括での変更適用が容易
    - データベース全体の状態が明確
- **欠点**
    - 現在の状態を正確に把握する必要がある
    - 複雑な変更には不向き
- **利用シーン**
    - 初期開発段階
    - シンプルなスキーマ変更

### 2. 変更ベースマイグレーション

- **概要**
	- 小さな変更単位(操作のリスト)を積み重ねて、データベースを新しい状態に移行するアプローチ
- **利点**
    - 変更履歴の追跡が容易
    - 大規模プロジェクトや長期間の開発に適合
- **欠点**
    - 過去の変更が膨大になると管理が複雑化
    - 適用順序に注意
- **利用シーン**
    - 長期運用のプロジェクト
    - チーム開発で頻繁なスキーマ変更が発生する場合

## マイグレーションツール

マイグレーションには専用のツールを使用します。
以下に代表的なツールを紹介します。

| ツール                  | 特徴                                    |
| -------------------- | ------------------------------------- |
| **Flyway**           | シンプルかつ軽量、変更ベースのマイグレーションに最適 |
| **Liquibase**        | 状態ベースと変更ベースの両方をサポート。XMLやJSON形式の管理が可能 |
| **Django ORM**       | Pythonアプリケーション向けの組み込みマイグレーションツール |
| **Rails Migrations** | Ruby on Railsに最適化されたツール |

ちなみに私は、業務では、`Flyway`しか使ったことはありません。
`Rails Migrations`は個人開発で少しだけ触りました。

## マイグレーションの落とし穴と対策

マイグレーションは便利な手法ですが、適切に実施しないと問題を引き起こす可能性があります。

### **よくある課題**
1. 誤った操作でデータを失う可能性がある
2. 環境間で適用される状態が異なり、スキーマが不一致な状態になる
3. 特定ツールに依存しすぎることにより移行が困難化する

### **対策**
- 重要なデータのバックアップを常に取得する
- 本番環境に適用する前にテスト環境で十分なテストを実施する
- 変更内容や意図を明確に記録しておく
- プロジェクトのニーズに合ったツールを選定する

# 終わりに

データベースマイグレーションは、アプリケーションの成長に伴い、スキーマを安全に変更するための不可欠なプロセスです。
データベース管理の効率化やスムーズな開発を実現するために今回の記事を参考にしてもらえたらと思います。

マイグレーションを活用して安定した開発環境を構築していきましょう！！
ガントチャートを実現する


+ [社内で現在動いているイベントが一目でわかるような、カレンダー形式の一覧を作成したいと考えております。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000OfiT)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/05f00d33-d757-cccf-7547-b580bebe829a.png)

:::note
うまく探せなかったのですが、ガントチャート風にカレンダーを表示する質問を以前見たように思います。ただ標準機能では難しいと思います。
と言ってもカスタムコンポーネントでもかなり難しいと思います。（少なくとも私はできません）

Java Scriptのライブラリーをうまく使えるのならLWCでカスタムコンポーネントを作成できると思います。
:::

# 資料

https://trailhead.salesforce.com/content/learn/projects/set-up-salesforce-scheduler/salesforce-scheduler-get-started
浮動小数点型の罠：金銭計算で起こりうる誤差とその解決策

# 導入

こんにちは、もんすんです。

プログラミングでは、金銭計算を行う場面がよくありますよね？？
しかし、**浮動小数点型(`float` や `double`)を使った金銭計算には注意が必要**です。
<font color='red'>浮動小数点型</font>と文字を見て、ドキッとした方、少なくはないはずです。

今回は、浮動小数点型の問題と、その解決方法についてわかりやすく解説します。

# 浮動小数点型について
## なぜ浮動小数点型が金銭計算に向かないのか？

`float` や `double` は、**科学計算**や**工学計算**のために設計されたデータ型です。
それらは非常に大きな範囲の数値を効率的に扱えますが、<font color='red'>**正確に小数を表現できない場合があります**</font>。

例えば、次のコードを実行してみましょう。

```java
public class MoneyCalculation {
    public static void main(String[] args) {
        System.out.println(1.03 - 0.42); // 結果: 0.6100000000000001
        System.out.println(1.00 - 0.90); // 結果: 0.09999999999999998
    }
}
```

コメントアウトにも示していますが、それぞれ **0.61** と **0.10** となってい欲しいところ、表示される結果は少しずれています。
これは、浮動小数点型が内部で<font color='red'>数値を2進数として扱う</font>ため、<font color='blue'>10進数の小数を正確に表現できない</font>からです。

例えば、0.1や0.3などは2進数で無限に続く小数になるため、丸め誤差が生じます。
2進数の場合、0.1は`0.00011001100110011... (繰り返し)`となり、0.3は`0.01001100110011... (繰り返し)`となります。
その結果、浮動小数点型を使った計算では、期待通りの結果が得られず、誤差が蓄積することがあります。

こういった誤差が、正確な計算が求められる金融関連、つまり金銭計算に大きな影響を与えてしまうのです。

## 金銭計算の正しい方法

では、正しい金銭計算はどうやって実現すればいいのでしょうか？
正確な金銭計算を行うためには、以下の方法を検討しましょう。

#### 1. `BigDecimal` を使う
`BigDecimal` は高精度な数値計算をサポートするクラスです。
**10進数の固定小数点形式**で数値を表現してくれます。
つまり、演算は10進数ベースで行われるため、2進数特有の丸め誤差が発生しません。

`BigDecimal`は、以下のように使用します。

```java
import java.math.BigDecimal;

public class MoneyCalculation {
    public static void main(String[] args) {
        BigDecimal funds = new BigDecimal("1.00");
        BigDecimal price = new BigDecimal("0.10");
        int itemsBought = 0;

        while (funds.compareTo(price) >= 0) {
            funds = funds.subtract(price);
            itemsBought++;
        }

        System.out.println(itemsBought + "個の商品を購入しました。");
        System.out.println("残金: $" + funds);
    }
}
```

**出力:**
```
10個の商品を購入しました。
残金: $0.00
```

この方法により、浮動小数点型の誤差がなくなり、正確な結果が得られます。

#### 2. **整数型(`int` や `long`)を使う**
金額をドルや円ではなく、**セントや最小単位で管理**する方法です。

この方法は処理が高速でシンプルです。

```java
public class MoneyCalculation {
    public static void main(String[] args) {
        int funds = 100; // 1ドルをセントで表現
        int price = 10;  // 1個10セント
        int itemsBought = 0;

        while (funds >= price) {
            funds -= price;
            itemsBought++;
        }

        System.out.println(itemsBought + "個の商品を購入しました。");
        System.out.println("残金: " + funds + "セント");
    }
}
```

**出力:**
```
10個の商品を購入しました。
残金: 0セント
```

整数型を使う場合は、計算前後に単位(ドル→セント)を意識する必要がありますが、精度が高く計算も高速です。

### どの方法を選ぶべきか？

1. **`BigDecimal`**  
   - **メリット:** 高精度、丸め制御が可能
   - **デメリット:** 記述が煩雑で、計算がやや遅い
   - **適用例:** 金融計算やビジネスロジック

2. **整数型(`int` や `long`)**  
   - **メリット:** シンプルで高速
   - **デメリット:** 桁数制限がある(`int` で約9桁、`long` で約18桁)
   - **適用例:** 小規模な金額計算や性能が重視される場合

# 最後に

今回紹介したように、浮動小数点型(`float` や `double`)は、金銭計算には向いていません。
正確さが必要な場合は、**`BigDecimal`** を使うか、**整数型で金額を最小単位に変換して計算**しましょう！
作業中のGithubアカウントを表示する【Starship】

# Overview 🔍
個人と仕事で、Githubアカウントを使い分けることがあります。

どちらのアカウントで作業中か、わかると便利です。


私の愛用する「Starship」をカスタムし、以下の表示を追加します（`edit by ~~~`）

![スクリーンショット 2024-12-08 9.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/42e822a3-089d-e252-02aa-52fc4f783d29.png)

### Github アカウントの使い分け 🐾

こちらの記事で完璧です。

https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts



### Starship 🚀

ターミナルの表示をリッチにし、作業効率を高めるツールです。

macOS / Windowsをはじめ、様々なOSで使用可能。

導入方法はこちら↓↓↓

https://qiita.com/kohki_takatama/items/6858b23a5d3d9cd3e2da

# 設定方法 ⚙️

簡単です。

1. Starshipの導入
1. 上記記事に基づき、githubアカウント連携を行う
1. `~/.config/starship.toml`を開く（無ければ作成）
1. 以下の内容を追加

```toml:~/.config/starship.toml
# プロンプトのフォーマット
format = '$all$custom.gituser'

[custom.gituser]
description = "Git user name"
command = "git config user.name"
style = 'bold yellow'
format = 'edit by [$symbol($output )]($style)'
when = "git rev-parse --is-inside-work-tree >/dev/null 2>&1"
```

gitレポジトリであれば、githubアカウントが表示されているはずです。
![スクリーンショット 2024-12-08 9.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/42e822a3-089d-e252-02aa-52fc4f783d29.png)

# おわりに
Starshipオススメです！ぜひ使ってみてください 🚀

なお、本記事の内容は個人環境で行ったものです。
もしできないことがあれば、QiitaもしくはXにてコメントいただけますと幸いです。