OmniAICreator/Qiita-1.07M huggingface dataset:
[Rust]トレイトでインターフェース的なものを実現する

## トレイトとは？

他の言語における「インターフェース」に近いもので、構造体や型などにメソッドを追加することができる機能です。トレイトを使うことで、対象のデータ型が特定のメソッドを持っていることを保証することができます。

:::note
おさらいですが、関数と違いメソッドは何かしらのオブジェクトのインスタンスに紐づいています。
オブジェクトにメソッドを持たせるだけであればトレイトは不要（`impl`で十分）ですが、そのメソッドの集合に名前を付けたり、あるデータ型がそのメソッドの集合を実装していることを保証したりするのであればトレイトが必要になります。
:::

## トレイトの宣言

`trait トレイト名 { ... }`の形で宣言します。ブロックの中には`fn`でメソッド（か関連関数）のシグネチャを列挙します。
ここで書くのはあくまでシグネチャ（引数名とその型、および戻り値）であるので、**メソッドの処理そのものは定義しません**。

:::note
厳密に言えば、処理を定義する（普通のメソッドのように実装する）と、それがデフォルトの処理になります。すなわち、トレイトの実装時にそのメソッドの実装をしなかった場合はデフォルトの処理のほうが呼ばれます。
:::

```rust
// トレイトの定義
trait Greet {
    fn greet(&self) -> String;
}
```

## トレイトの実装

`impl トレイト名 for データ型 { ... }`で対象のデータ型にトレイトを実装します。ブロックの中には、トレイトで定義されているメソッドを実装します。トレイトの方で要求されているのに実装していないメソッドがあるとコンパイルエラーになります（前述のデフォルト実装されているものを除く）。

```rust
// 構造体
struct Person {
    name: String,
}

// トレイトの実装
impl Greet for Person {
    fn greet(&self) -> String {
        format!("Hello, my name is {}!", self.name)
    }
}

// 使用例
fn main() {
    let person = Person {
        name: String::from("Alice"),
    };
    println!("{}", person.greet());
}
```


## トレイトとジェネリック型

ジェネリック型の条件として、特定のトレイトを実装していることを指定できます。

ジェネリック型は`<T>`の構文で定義しますが、`<T: トレイト名>`と書くと、その型`T`が指定したトレイトを実装していることを強制することができます。

```rust
// トレイトの定義
trait Summable {
    fn sum(&self) -> i32;
}

// トレイトを実装した構造体
struct Numbers {
    values: Vec<i32>,
}

impl Summable for Numbers {
    fn sum(&self) -> i32 {
        self.values.iter().sum()
    }
}

// ジェネリックな関数
fn print_sum<T: Summable>(item: &T) {
    println!("The sum is: {}", item.sum());
}

// 使用例
fn main() {
    let numbers = Numbers {
        values: vec![1, 2, 3, 4],
    };
    print_sum(&numbers);
}
```

### 引数にトレイトを要求するシンタックスシュガー

関数の引数の型があるトレイトを実装していることを強制したい場合、`fn 関数名<T: トレイト名>(引数名: &T)`と書くこともできますが、もっと簡潔にかけるよう、`fn 関数名(引数名: &impl T)`というシンタックスシュガーが用意されています。

```rust
// 簡潔な構文
fn print_sum_simplified(item: &impl Summable) {
    println!("The sum is: {}", item.sum());
}

// 使用例
fn main() {
    let numbers = Numbers {
        values: vec![1, 2, 3, 4],
    };
    print_sum_simplified(&numbers);
}
```

### 条件を増やす

ある型`T`が複数のトレイトを実装していることを強制したい場合は、トレイトを`+`で連結します。

```rust
// トレイトの定義
trait Displayable {
    fn display(&self) -> String;
}

// 構造体
struct Data {
    value: i32,
}

// 複数のトレイトを実装
impl Summable for Data {
    fn sum(&self) -> i32 {
        self.value
    }
}

impl Displayable for Data {
    fn display(&self) -> String {
        format!("Value: {}", self.value)
    }
}

// 関数で複数トレイトを要求
fn display_sum<T: Summable + Displayable>(item: &T) {
    println!("{}", item.display());
    println!("The sum is: {}", item.sum());
}

// 使用例
fn main() {
    let data = Data { value: 42 };
    display_sum(&data);
}
```

条件がもっと増える場合は、`<>`の中に書くのではなく、`where`句を使って別の行に切り出すこともできます。

```rust
fn display_sum_where<T>(item: &T)
where
    T: Summable + Displayable,
{
    println!("{}", item.display());
    println!("The sum is: {}", item.sum());
}

// 使用例
fn main() {
    let data = Data { value: 42 };
    display_sum_where(&data);
}
```

:::note
このトレイトの仕組みは、総じて他の言語におけるインターフェースと似ています。個人的によくハマるのが、`Copy`や`PartialEq`、`PartialOrd`、`Display`といった標準で用意されていてちょっとした処理にも要求されるトレイトを、独自の構造体に実装し忘れることです。
:::
seed llm




karakuri-lm-70b-chatをOpenAI互換のローカルサーバとして動かしてみた
https://qiita.com/takaaki_inada/items/3a22b982a3541e6f214c
>seed 1743075770)


Amazon Bedrockを利用して日本語だけで画像生成する
https://qiita.com/wadabee/items/d073238588d9022489cf
>フロントエンドの処理で、ランダムにseedを設定しながら画像生成のリクエストを行なっています。

【Fine-Tuning】Llama3を使ってモデルを作ってみた②
https://qiita.com/TM_AIbucho/items/30039bcc582d614c25b8
seed=3407


Apple silicon専用機械学習フレームワークでLLMのファインチューニングをやってみた
https://qiita.com/asamiKA/items/3fdf89771084e3625643
https://qiita.com/katayohe/items/4059f9d0ce15ed3e4c09
>--seed 42 

JMED-LLM を Amazon Bedrock ( Claude 3.5 Sonnet, Claude 3 Haiku ) で評価してみた

>seed: 42

LLMのイロレーティング2
https://qiita.com/nishiha/items/eeb6b6d96d3c8f660ffd
> seed = 100

tidyverse/elmer パッケージでLLMを利用
https://qiita.com/zgmfx20a/items/d0435bf3de43a3c41cbe
>seed = NULL,

N番煎じでGoogle Gemma-2 2B JPN-itとRinna社のGemma 2 Baku 2BをDatabricks Mosaic AI Model Servingで試す
https://qiita.com/isanakamishiro2/items/885219c81aee1e2aea04
>  self.seed = 123

N番煎じでQwen2.5をDatabricks Mosaic AI Model Serving上で試す
https://qiita.com/isanakamishiro2/items/c1857531174f893bafd2
>  "seed": 123
  
# REF
vLLMによるLLM推論速度の向上
https://qiita.com/Yorozuya59/items/c1dd1234d2d965f7a1ca
epoch llm




日本語LLMでジョジョっぽい言葉を作成してみた
https://qiita.com/ideos2040kyui/items/88c3fcf4a4fe0d09b3b8

>今回はbatch_size 1，学習率 ，epoch数 50で回しました．

LLM自身が自分をチューニングする手法：Self-Rewarding について
https://qiita.com/xxyc/items/76f62034cdc9c188a8a2
>３回（3epoch）の訓練を経て、その精度は約20％に向上し、

MetaのオープンソースLLM「Llama 3」を日本語版にファインチューニング（SFT）
https://qiita.com/bostonchou/items/bf4a34dcbaf45828f886
>num_epoch = 6 #3  # トレーニングの総エポック数を3に設定
具体的な例
num_train_data=1040, num_epoch=3 の設定は、num_train_data=5000, num_epoch=3 よりも良好な結果を得られました。これは、少ないデータ量で各データポイントが十分に学習されるためです。
num_train_data=1040, num_epoch=6 の設定は、さらに良好な結果をもたらしました。エポック数を増やすことで、データがより深く学習され、モデルの性能が向上しました。

LLMのトレーニングでよく調整するパラメータについて
https://qiita.com/xxyc/items/8f5c2a91df8ea71a9a93

>num_train_epochs=X：データセットの学習回数。（1epochは1回）

オープンソースのLLMをLoRAを用いてCPUのみでファインチューニングする
https://qiita.com/miyakz/items/8016f8b6916dca6224d6
>epoch=1で訓練しました。こちらの環境だと、約5日間かかりました。

機械学習のトレーニング結果を管理するツール:「wandb」 (Weights & Biases)
https://qiita.com/xxyc/items/f9593680c9beab4aa263
OACビジュアライゼーションのツールチップをカスタマイズする

# はじめに
OAC（**Oracle Analytics Cloud**）では、様々なビジュアライゼーションのパーツが用意されています。
これらを使用して、簡単にデータの可視化が実現できます。

ビジュアライゼーションには、たくさんのプロパティが準備されていますので、ドーナツ・チャートを題材にしていくつかのプロパティを紹介したいと思います。

※ この記事では OAC November 2024を使用しています。

# サンプルの作成
手持ちのデータセットを使用して、ドーナツ・チャートを作成します。
次に「プロパティ」アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4f8fba4e-3f17-641e-c990-ca87e3e94d1a.png)

たくさんプロパティがありますが、「一般」タブのなかの四角で囲った部分の設定を変更してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1437fec0-e87d-2c62-21e2-cf7ba9470c10.png)

# 中心半径
ドーナツの穴の大きさのことです。
円の半径の何%にするかを指定します。デフォルトでは40%なので、80%にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/99a49504-0270-da48-0be4-3fbb65ea3f00.png)

値を小さくすると、穴の大きさも小さくなります。

# ツールチップ
ポイントしたときに、ポップアップするのがツールチップです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/bfb38314-454f-34c1-af9d-83fa22bdf5da.png)

このように、「ツールチップ」にたくさんのメジャーを配置してあると、ツールチップも賑やかになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4f3962e1-e059-cb14-483e-af81136d43be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4e4367a6-3174-a166-817a-9aa5b23ad406.png)

デフォルトでは、「ツールチップ」プロパティで「すべてのデータ」が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8eb7c5ea-df89-7c54-767f-66e768f16d4c.png)

「ツールチップ文法のみ」にすると、文法パネルの「ツールチップ」に配置したメジャーだけがツールチップに表示されます。
この例の場合、「注文数」と「製品カテゴリ」は表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/16559ddf-cdf3-fd7a-d660-a03988dfb07f.png)

「カスタム」にすると、カスタム・ツールチップの編集が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c731f3b1-4aca-5978-559b-2b848ce26f76.png)

色やフォントを変更したり、ビジュアライゼーションで使用されている列を追加したりすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6c6747b5-68ba-4a69-b603-bfe0eb8dcee8.png)

「プレビュー」で確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a37a8eba-5a47-ee83-7c97-287abc00e40a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/2ab04bed-2d27-e766-dc3e-beef20fcbd34.png)

# 選択効果
ドーナツの一部をクリックしたときの効果を設定できます。
デフォルトの「強調表示」は、クリックした部分が強調されます。
この例だと、オレンジの部分だけが選択されて強調されてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/02348c2c-95b5-0779-d434-023b3239d9a0.png)

「展開」にすると、クリックした部分が飛び出したような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e8abeb56-3c3d-349b-2873-0500158e5cb7.png)

# おわりに
プロパティには、特定のビジュアライゼーション・タイプに特有のものもあれば、ほとんどのビジュアライゼーション・タイプで共通のものもあります。
色々試してみてください。
git config --global --add safe.directory '...'やったのに、やっぱりダメな時

## 結論

- Git Bashか
- PowerShell

で実行しよう！

## エラーが出た！！

```bash
$ git fetch origin
fatal ...
...

   git config --global --add safe.directory '//xxx.xxx.xxx.xxx/...

...
```

じゃあコンソール出力でもコピペして・・・

```bash
$ git config --global --add safe.directory '//xxx.xxx.xxx.xxx/...'
$ git fetch origin
fatal ...
...

   git config --global --add safe.directory '//xxx.xxx.xxx.xxx/...

...
```

😢

## なんで？

windows環境でcmdつかってませんか？

cmdから実行するとセパレータが
```
¥¥
```
になってしまいます。

gitは
```
\
```
前提で動作するのでおかしなる。

ぽいですね。

## すでにCMDでやっちまったよ...

cmdで実行あとにGitBashなどで再実行入力しても、結果が上書きされないとかなんとか。

その場合は、
```
~/.gitconfig
```
から、該当（¥¥で確認すればすぐわかるはず）箇所を削除してから際実行で。
家庭で使うネットワークの基本用語まとめ

家のネット回線が遅いと思いつつ、
そもそも「プロパイダー？」「光回線？」って状態だったので
簡単に用語をまとめていきます。

---
### 光回線  
**【役割】**  
  - 光ファイバーケーブルを利用したインターネット回線のこと。
  - 家にネットを引き込む、インターネット回線そのもの。これがないとインターネットできない。
  - 家まで引き込まれた光回線を通じてインターネットに接続する。  
  - 光回線単体ではインターネットに接続できず、プロバイダー契約が必要。  
**【例】**  
  - NTTの「フレッツ光」、KDDIの「auひかり」、ソフトバンクの「SoftBank光」など。  
  - これらのサービスは光回線（NTTやKDDIなどの設備）を利用し、インターネット接続は契約したプロバイダーが提供する。  

---

### プロバイダー（ISP: インターネットサービスプロバイダー）
**【役割】**  
  - インターネットに接続するためのサービスを提供する会社。
  - インターネット接続サービスを提供する会社。
  - プロバイダーがいないと、回線が家まで来ていてもインターネットに接続できない。プロパイダーと契約しないと、ネットは使えない。
  - プロバイダーによって速度やサービス品質が異なるため、遅い場合はプロバイダーの変更も検討する。

**【例】**  
  - ドコモネット、OCN、ビッグローブ、など。
  - ドコモ光の場合、光回線（NTTの設備）を使い、ドコモネットなどのプロバイダーがインターネット接続を提供する。

---

### Wi-Fi
**【役割】** 
    - 無線でデバイスをインターネットに接続するための仕組みのこと。 
  - 光回線を「家の中で無線で利用できるようにする手段」
  - Wi-Fiそのものは物体ではなく、電波の仕組み（接続方法）。ルーターから出る電波を使って、スマホ・PCが接続する。Wi-Fiは仕組みなので、ルーターや回線そのものではない。
  - 電波が届く範囲や通信速度はルーターの性能や設置場所に依存する。
  
---

### ルーター
**【役割】**  
  - 家の中でインターネット接続を複数のデバイス（スマホ、PC、ゲーム機など）に分配する装置。
  - Wi-Fiの電波を飛ばして、無線でデバイスをインターネットに接続できるようにする。
  - 有線LANポートを備えており、ケーブルで直接接続することも可能。
  - 最新のルーター（例：Wi-Fi 6対応）ほど、通信速度や安定性が高い。
  - ルーターは物理的な「中継装置」に過ぎないので、接続元の回線速度が遅ければ、ルーターを良いものにしても速度改善には限界がある。
  
---

![Wi-Fi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3905096/f9ccebb2-9b56-7c4f-e52b-84c66105f34c.jpeg)
基盤の暴走談

# はじめ
情報機械システム工学科4年の水谷悠人です。
今回はロボコンの大会で使用された回路が暴走してしまったのでその原因について考えたいと思います。

# 起こったこと
説明が難しいので下の動画を見てください
<iframe width="560" height="315" src="https://www.youtube.com/embed/n7EDhD8OgNc?si=y5QJuTO6MEVWztZp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

基盤に100mmほど離れた場所から手をかざすとモーターが回りだしました。


# 基盤について
今回の現象を起こした基盤に使われている部品。
ロジックIC・FET・コンデンサ・ダイオード
この4種類しか使われていない単純な回路で通信用にXHコネクタ、直流電源用にターミナルブロックが使われていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926001/8d97215d-2ac1-5523-5bc9-c0ae6bd167db.png)


# 考察
なぜ手をかざすだけでモーターが回ってしまったのか？私の知識で2つの説を考えてみた。
①XHコネクタ(オス)のアンテナ化(出力)
②ICの内部が浮いてしまった

## ①XHコネクタのアンテナ化(出力)
この説が考えられる一番の理由がアルミ缶をかぶせると速度が上昇したことだ。これにより外部からの電波などによる影響は関係ないと考えられる。又、金属であればよく電波を反射する。このことから私はコネクタから指向性の高い電波が出してしまいその電波が障害物で跳ね返ることによって起きたのではないかと考えた。
しかし、この説はほぼあり得ない...
直流しか流れていない状態の回路において電波を出す要素がないからだ。
この回路は今までロボットが走ったりしてる状態で制御されていたのでノイズが高周波の交流信号となったとも考えられない。
よって、アンテナ化ではないはず

## ②ICの内部が浮いてしまった
この説ではトランジスタやFETのベースやゲートが静電気によって浮いてしまい電流が流れてしまう現象から考えられるものである。この現象はよくある話で企業さんなどでは徹底して静電気対策が行われているほどだ。
しかし、もし本当にこの現象が影響を与えているなら蓄電しすぎ問題がある。最初に見てもらった動画からわかるように回路と手は100mmほど離れている。
この距離放電するには何V必要かを計算すると
空気の絶縁耐力が 3[kV/mm]のため
V=3000×100=300,000[V]
30万Vなら実はあり得る数値なのだ。
実は冬の静電気でいたいのも数千~1万V流れているからだ。
ただ今回は金属を触った時にではなく空中放電なのでスパークの発生がないとおかしい
又、何度でもできる場合私たちに発電器官が備わっていることになる。
何よりもアルミ缶に反応することは100%ないので、静電気は関係なさそうである。

# 結論と対策
静電気や電波などの影響は関係なさそうだが、IC内部が浮いてしまった可能性はある。
今回何が原因だったのかはわからないが対策は出来る。ユニバーサル基盤ではなく、GNDベタができる基盤で作ればノイズなどに強くなる。静電気も金属を触るだけで対策できる。
なんでこうなったのかわかる人がいれば教えてください
ブラウザ拡張機能でコンテキストメニューを作る

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の15日目の記事です。

コンテキストメニューを作ります。

# コンテキストメニューとは

タブやページ上で右クリックした際に表示されるメニューのことです。
コンテキスト、つまり文脈や属性に対応したメニューが表示されます。

# 具体的なコード

コンテキストメニューを追加し、クリックされたときに通知する拡張機能です。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-contextmenu@example.com"
        }
    },
    "manifest_version": 3,
    "name": "init-extention",
    "version": "0.1",
  
    "description": "コンテキストメニューサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },

    "background": {
        "scripts": ["background.js"]
      },
  
      "permissions": [
        "menus",
        "notifications"
      ]
}
```

`permissions`でコンテキストメニューに必要な`menus`を追加します。

:::note info
Mozillaの記事では`contextMenus`となっていますが、私の環境ではうまく動作しなかったため`menus`としています。
:::


```javascript:background.js
browser.menus.create(
    {
      id: "sample",
      title: "sample menu",
      contexts: ["page"],
    }
  );

function createNotification() {
    browser.notifications.create({
        type: "basic",
        iconUrl: browser.runtime.getURL("icons/icon-48.png"),
        title: "Clicked!",
        message: "クリックしました",
    });
}

browser.menus.onClicked.addListener((info, tab) => {
    console.log("clicked");
    if (info.menuItemId === "sample") {
        createNotification();
    }
});
```

`browser.menus.create`でコンテキストメニューを追加します。
`contexts`でどの属性で表示するメニューか指定します。ここでは`page`にしていますが、ほかにも`all`や`bookmark`などがあります。

# 参考

[コンテキストメニュー](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/user_interface/Context_menu_items)

[menus.ContextType](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/menus/ContextType)
支援現場見学の感想

## はじめに
QAエンジニアの @s_yk です。LITALICOワークス（就労移行支援事業所）の業務支援システムである、HARVESTの品質保証を担当しています。
先日、LITALICOワークスの支援現場を見学させていただく機会があり、その感想や気づきをまとめたいと思います。

:::note info
支援現場見学を企画してくださった @michiokay さんの記事はこちらです。
企画ありがとうございました！
[プロダクトチームが支援現場を見学してみたら](https://qiita.com/michiokay/items/7ab62fe172051a72ee03)
:::

## 前提
LITALICOのQAチームでは、ユーザーストーリーをベースにしたリスクの分析や、検証項目の洗い出しを行っています。

:::note info
ユーザーストーリーを用いたLITALICOのQA活動については、
@kazuis さんの記事で紹介されています！
[SaaSプロダクトでのユーザーストーリーを活用したQAプロセスのトリセツ](https://qiita.com/kazuis/items/a3a50b7e80f8abe19e7e)
:::

機能の概要や大枠の目的は、詳しいメンバーから説明を受けたり社内資料を調べたりしながら把握できるものの、改めてユーザーストーリーに落とし込もうとするとユーザーの業務をもっと知りたいなと感じることがあります。
「実際にこの機能を使うのはこういう役割の方かな」「この機能は支援の中でこんなふうに使われるのかな」など想像しながらユーザーストーリーを書き起こしていく中で、実際の業務を見て解像度を上げたい！と思っていたため、今回の支援現場見学の機会はとてもありがたかったです。

## 事前準備

見学前には以下の準備を行いました。
### 見学の申し込み
支援現場の負担にならないよう、見学に参加できる人数は各回ごとに決められています。2回目の抽選で無事に参加できることになりました。
### 質問の収集
見学の中ではスタッフの方への質疑応答の時間も設けられています。チーム内で見学に行くのは私が最初だったこともあり、チームメンバーからも質問事項を出してもらいました。
### 見学先の理解
普段のQA業務でもLITALICOワークスについて調べる機会はありますが、ついシステムを前提に考えてしまう、知識に偏りがある等の課題がありました。[LITALICOワークスのHP](https://works.litalico.jp/)やパンフレットを読み返すなど、支援現場見学を前提にLITALICOワークスの情報を改めてキャッチアップしました。

## 見学の感想・気づき
### 支援業務の解像度
プログラムの見学や質疑応答を通して、今まで想像で補っていた部分がかなりクリアになりました。質問にはとても丁寧にご回答いただき、QA業務に活かせる情報をチーム内に持ち帰ることができました。
また、事業所の環境や設備、雰囲気は行ってみて初めて感じることができたように思います。
気づきとしては、私自身は企業内で障がいを持つ社員のサポートを行っていた経験があるため、そのときのことも思い出しながらQA業務を行ってきましたが、場合によってはそれがバイアスになっていることを認識できました。
### QA業務へのモチベーション
実際にシステムを使っている方やその場面を知ることで、支援業務をよりよくする一助になりたいと改めて感じることができました。まだまだ自身の知識・経験の不足を感じる場面が多々ありますが、より一層前向きな気持ちで取り組んでいけそうです。
また、直接支援に携わる方々とお話できたことで、理想とする支援を一緒に実現したいという思いが強くなりました。

## まとめ
支援現場見学の企画・運営に携わってくださった皆様、見学を受け入れてくださった事業所の皆様、本当にありがとうございました！
今回の見学で感じたこと・学んだことをユーザーストーリーの作成をはじめとしたQA業務に活かしていき、利用時の品質を高められるよう努めていきたいと思います。
Microsoft Fabricのリアルタイムインテリジェンスを使って、データを即座に見える化しよう

## **Microsoft Fabricのリアルタイムインテリジェンスを使って、データを即座に見える化しよう！🚀**

Microsoft Fabricの**リアルタイムインテリジェンス**は、データが発生した瞬間にすぐに分析・視覚化できる強力なサービスです。「データが動いている今」を逃さずキャッチして、イベントドリブンのシナリオやストリーミングデータ、ログの処理を一気通貫でサポートしてくれるんですよ。

リアルタイムインテリジェンスが得意とするのは、**データの取り込み→変換→保存→分析→視覚化→自動アクション**までをシームレスにつなげること。これでデータに基づく素早い意思決定が可能になります。組織やチームの効率化・最適化にもバッチリ役立ちます。

---

### **リアルタイムインテリジェンスの主な機能✨**
- **データの取り込み・変換・保存**  
  さまざまなデータソースからデータをスムーズに取り込み、必要に応じて変換して効率よく保存します。

- **リアルタイム分析と視覚化**  
  データが動いているその瞬間をキャッチして、視覚的なダッシュボードやレポートで「見える化」します。Power BIとの統合でさらに直感的に。

- **データの追跡＆AI分析**  
  データのパターンや異常を監視し、AIで高度な分析や予測もサポート。異常を見つけたら即座に対応できます。

- **リアルタイムアクション**  
  条件やイベントに基づいて、即時にアクションを起こせる仕組み。例えば、特定のデータパターンを検出したらアラートを飛ばしたり、自動処理を実行したりできます。

---

### **主要コンポーネントはこれ！🛠️**
1. **リアルタイムハブ**  
   さまざまなデータソースを一つにつなげる「カタログ」的存在。データの探索や共有も簡単です。

2. **イベントストリーム**  
   コード不要でリアルタイムイベントをキャプチャし、変換して他の宛先にルーティングできます。幅広いデータソースに対応！

3. **イベントハウス**  
   時間ベースのデータ（ストリーミングイベント）を高速で処理する分析エンジン。複雑なクエリでもサクサク動きます。

4. **リアルタイムダッシュボード**  
   データを視覚化する対話型ツール。自然言語やCopilotを使って、データ分析をもっと簡単にします。

5. **アクティベーター**  
   データの変化にリアルタイムで対応して、アクションをトリガーします。アラート設定や自動処理が可能です。

---

### **どんな場面で使えるの？📊**
- **小売業**: 店内センサー情報をリアルタイムに分析して、在庫管理を最適化。  
- **金融業**: 異常な取引パターンを即検出してリスクを軽減。  
- **製造業**: IoTセンサーを使って機器の状態を監視し、予防保守を実現。  

---

### **Microsoft Fabricの強み💪**
- **統合されたワークフロー**: AzureやPower Platformとのシームレスな連携で、データの流れが超スムーズ。  
- **スケーラビリティ**: 小規模なチームでも、大規模なエンタープライズでも柔軟に対応。  
- **セキュリティ**: Microsoftのセキュリティ標準に準拠しているので安心して使えます。

---

**詳しく知りたい方はこちら👇**  
[Microsoft Fabric - Real-Time Intelligence](https://learn.microsoft.com/ja-jp/fabric/real-time-intelligence/)

データのリアルタイム活用で、ビジネスのスピード感を一気に上げちゃいましょう！🚀
Windowsでアセンブリ言語を扱う

<!-- Windowsでアセンブリ言語を扱う -->

※この記事は[Udon Advent Calendar 2024 - Adventar](https://adventar.org/calendars/10764)の17日目の記事です。

## はじめに

大学の実験でアセンブリ言語を扱う機会がありました。

自分のPCでアセンブリ言語を扱いたかったので、Windowsでアセンブリ言語を扱う方法をまとめてみました。

## MASMのインストール

[このページ](https://www.masm32.com/download.htm)からMASMをダウンロードします。

開いたら一番上の`Australia 1`をクリックし、ダウンロードします。

ダウンロードしたzipファイルを解党し、インストーラを起動します。基本的に全部クリックで進めて大丈夫です。

最後にちょっと時間がかかりますが、終了したらウィンドウを閉じます。

## 環境変数の設定

まずはパスを通します。環境変数`PATH`に`C:\masm32\bin`を追加してください。

インストールが完了しているかは以下のコマンドで確認できます。

```cmd
ml -v
```

また、以下の環境変数も設定します。

- `INCLUDE`に`C:\masm32\include`を追加
- `LIB`に`C:\masm32\lib`を追加

## サンプルプログラムの実行

以下のプログラムを作成します。

```asm
    include masm32rt.inc
.code
main:
    print "Hello, Assembly Language!", 13, 10
    exit
end main
```

最初の行でインデントが必須らしいので注意します。

作成したら、そのディレクトリで以下のコマンドを実行します。

```cmd
ml /c /coff test.asm
```

これにより、``test.obj``が生成されます。次のような表示が出ると成功です。エラーが起きるとその旨が書いてあります。

```cmd
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: test.asm

***********
ASCII build
***********

```

次はこのオブジェクトファイルをリンクします。

```cmd
link /SUBSYSTEM:CONSOLE test.obj
```

これにより、``test.exe``が生成されます。

```cmd
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

```

エラーが発生すると、やはりその旨が表示されます。

最後に実行します。

```cmd
test.exe
```

以下のような表示が出れば成功です。

```cmd
Hello, Assembly Language!

```

## batファイル化

使ったコマンドをいちいち打つのは面倒なので、batファイルを作成します。

```bat
@echo off

ml /c /coff %1.asm
link /SUBSYSTEM:CONSOLE %1.obj
%1.exe
```

名前は適当に決めます。例として``abuild.bat``とします。

パスが通っているディレクトリにbatファイルを配置し、以下のように引数を与えて実行することでコンパイル・リンク・実行することができます。

```cmd
>abuild test
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: test.asm

***********
ASCII build
***********

Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Hello, Assembly Language!

```

## おわりに

以上により、アセンブリ言語がWindowsで使えるようになりました。

アセンブリ言語は低級言語に分類されます。機械語にかなり近いですね。そのため扱いが難しいです。

もし、アセンブリ言語を使う機会があれば、ぜひ試してみてください。

ではまた、明日の記事でお会いしましょう。

## 参考文献

[MASM32アセンブラの使い方①｜Uccyan](https://note.com/uccyan/n/nde8c0dee92b1)
ブラウザ拡張機能でサイドバーを作る

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の14日目の記事です。

サイドバーを作る方法を記載します。

# サイドバーとは

ブックマークや履歴などを表示する際にブラウザの左側に出てくる画面のことです。

# 具体的なコード

Javascriptは使用せずに、シンプルにサイドバーを表示するだけの拡張機能を作ります。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-sidebar@example.com"
        }
    },
    "manifest_version": 2,
    "name": "init-extention",
    "version": "0.1",
  
    "description": "サイドバーサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },
  
    "sidebar_action": {
      "default_title": "Sample Sidebar",
      "default_panel": "sidebar.html",
      "default_icon": "icons/icon-48.png"
    },

    "permissions": [
      "tabs",
      "notifications"
    ]
}
```

`sidebar_action`でタイトル、使用するHTMLファイル、アイコンを指定します。


```html:sidebar.html
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <meta name="color-scheme" content="dark light">
  </head>

<body>
    <h1>サンプルサイドバー</h1>
    <p>これはサンプルサイドバーです</p>
</body>

</html>
```

表示したいHTMLを作ります。

このような形でサイドバーが作られます。

![サイドバー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/2cce19f1-2914-c2b6-785e-753566b2d984.png)

# 参考

[サイドバー](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/user_interface/Sidebars)
Create Emulator Snapshot

[Previous << Deploy a Project](https://qiita.com/flowcadence/items/36250ceb2e557abc1a92)
[Next >> Execute a Script](https://qiita.com/flowcadence/items/54a8e1a7b9518a251353)

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

Flow CLIには、エミュレータのスナップショットを作成するコマンドが用意されています。スナップショットはブロックチェーンの履歴における特定の時点であり、後でその時点の状態にリセットすることができます。これは、初期状態を設定してテストを実行し、初期状態に戻すテストを行う場合に便利です。

コマンドの構文は以下です。
```ruby
flow emulator snapshot create|load|list {name}
```

<h1>Example Usage</h1>
<h3>Create a new snapshot</h3>

現在のブロックに、`myInitialState`という名前で新しいエミュレータのスナップショットを作成します。
```ruby
> flow emulator snapshot create myInitialState
```

<h3>Load an existing snapshot</h3>

以前に作成したスナップショットにジャンプするには、loadコマンドと名前を組み合わせて使用します。
```ruby
> flow emulator snapshot load myInitialState
```

<h3>List all existing snapshots</h3>

以前に作成し、ロードが可能なすべての既存のスナップショットをリストアップするには、次のコマンドを実行します。
```ruby
> flow emulator list
```
エミュレータの使用方法についてさらに詳しく知りたい場合は、[リポジトリのREADME](https://github.com/onflow/flow-emulator)をご覧ください。

<h1>Flags</h1>

<h3>Emulator Flags</h3>

[ここにあるエミュレータのフラグ](https://github.com/onflow/flow-emulator#configuration)を何でも指定できます。指定したフラグはエミュレータのサービスに適用されます。

<h3>Configuration</h3>

* Flag: `--config-path`
* Short Flag: `-f`
* Valid inputs: valid filename

設定ファイルのファイル名を指定します。`-f` フラグを複数回使用することで、複数の設定ファイルを指定することができます。

<h3>Version Check</h3>

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

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

*Last updated on **Dec 6, 2024** by **Alex Ni***

翻訳元

https://developers.flow.com/tools/flow-cli/deployment/emulator-snapshot

***
<b>[Previous << Deploy a Project](https://qiita.com/flowcadence/items/36250ceb2e557abc1a92)
</b>

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

<b>[Next >> Execute a Script](https://qiita.com/flowcadence/items/54a8e1a7b9518a251353)</b>
オーバーオールレトロスペクティブで議論を活性化させるために行っていること

こんにちは！SmartHRでバックエンドエンジニアをしているtkkrです！

私の所属している基本機能の開発チームでは、LeSS(Large-Scale Scrum)を導入してプロダクトの開発を行っています。
今回は、これまで我々がオーバーオールレトロスペクティブで効果的に改善をするために行ってきた工夫について紹介します。

LeSSに興味をお持ちの方のヒントになれれば幸いです！

## 参加形態について

プロダクトオーナー, スクラムマスター, LeSSマネージャー, 各チームのマネージャーは固定で参加し、これに加えて各チームの開発者がオーバーオールレトロスペクティブに参加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177949/be944907-4573-f5e3-04af-70882102e6cd.png)

各チームの開発者の参加形態は、LeSSに関わる全員のシステムへの継続的な議論への参加と議論のしやすさのバランスを取るように試行錯誤した結果、各チームから2名の代表者が参加し、代表者はローテーションするという形態で開催する形に落ち着いています。
これまで、3パターンの参加形態の変遷があったので、順を追って紹介します。

### パターン1: 全員参加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177949/c156c4f8-5aaf-bc5e-2203-4bdb93839672.png)

[大規模スクラム Large-Scale Scrum(LeSS) アジャイルとスクラムを大規模に実装する方法](https://amzn.asia/d/hIz1rFf)によると、```開発チームからは代表者が参加する```旨の記載がありますが、全員がLeSS全体に関心を持ち、全員の発言をシステムに取り入れたいという背景のもと、全員で参加をするようにしていました。

しかしながら、発言者が特定の人に偏ってしまったり、ファシリテーションの難易度が高いことで、現実的にLeSS全体のシステムに対しての改善が動きづらい状態となってしまっていました。

### パターン2: 各チームから代表者を1名選出し、ローテーションで参加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177949/9dcfbbb3-e721-fcda-bf84-a40d9cd565b0.png)


パターン1の対応策として、思い切って参加者の人数を減らしました。特定の人にシステム全体への関心が偏ることを避けるために、ローテーション制を導入し、代表者は各チームに議論の内容を持ち帰るという運用にしています。

参加者が減少したことで、参加者全員が満遍なく発言の機会を持てるようになり、ファシリテーションの難易度も減少しました。
一方で、週次で参加者がローテーションしてしまい引き継ぎが発生するため、スプリントをまたいだ継続的な議論がしづらいという課題がありました。

### パターン3: 各チームから代表者を2名選出し、ローテーションで参加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177949/be944907-4573-f5e3-04af-70882102e6cd.png)

継続的な議論を続けるため、各チームの代表者を2名にし、代表者は2スプリントにわたって参加するように互い違いにローテーションをして必ず2スプリントにわたって参加する人がいる形式にしました。
また、各チームで積極的に発言する人を明示することで、参加人数が増加することによるファシリテーションの難易度の増加も抑制するようにしています。

これにより、全体のシステムへの関心と継続的な議論とファシリテーションの難易度の減少を両立させることが出来はじめています。

## 会の進行について

進行面では下記の3点を取り入れています
- アイスブレイク
    - おすすめの飲食店の紹介
    - 各チームのGoodの共有
- チェックアウト
    - 各チームに共有する内容の確認

### アイスブレイク

参加者によってオーバーオールレトロスペクティブへの慣れ具合は様々なため、アイスブレイクは入念に行っています。

#### おすすめの飲食店の紹介

まずは発声練習も兼ねて、おすすめの飲食店を各自紹介します。
夕方に開催しているため、とてもお腹が減ります。

#### 各チームのGoodの共有

各チームで直前に行ったレトロスペクティブで話題になったGoodを共有するようにしています。
明るい内容の共有をすることで、アイスブレイク的な効果も狙いつつ、お互いのチームの状況を知り、システム全体で再現性を持てそうな取り組みを把握するきっかけとするための取り組みです。
システム全体に関するProblemについては本編の振り返りで取り扱います。

### チェックアウト

#### 各チームに共有する内容の確認

チェックアウトとして、その回で議論をした内容を確認し、各チームに代表者が持ち帰る内容の整理をします。
代表者のチームへの共有の準備の負担を下げることと、共有内容の質の向上を狙いとしています。

## まとめ: より効果的な改善をしていくために取り組もうとしていること

参加形態や進行内容の工夫をすることで、オーバーオールレトロスペクティブにおいて議論を行い、スムーズに進行ができるようになってきました。

一方で、改善するべき課題が見つかりづらかったり、実験のインパクトが感じづらかったりと、検査・適応の質に関してはまだ改善の余地が大きそうに感じています。

因果ループ図を用いるなど、システム全体を正しく捉える取り組みを実践していくことで、より効果的な継続改善を行い、もっとうまく大規模システムと付き合っていけるのではないかと考えています。
cf. [システム思考 - Large Scale Scrum (LeSS)](https://less.works/jp/less/principles/systems-thinking)
Javaで「UNICODE_CHARACTER_CLASSフラグ(Unicodeバージョンの定義済み文字クラスとPOSIX文字クラスを有効にする)」の動作を確認してみた

# 概要

Javaで「UNICODE_CHARACTER_CLASSフラグ(Unicodeバージョンの定義済み文字クラスとPOSIX文字クラスを有効にする)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index25.html

# 実装

以下のファイルを作成しました。

```JSample25_1.java
import java.util.regex.*;

class JSample25_1{
  public static void main(String[] args){
    String target1 = "A B";
    String target2 = "A　B";

    String regex = "A\\sB";
    Pattern p1 = Pattern.compile(regex);

    Matcher m1_1 = p1.matcher(target1);
    System.out.println(target1 + ":" + m1_1.find());
    Matcher m1_2 = p1.matcher(target2);
    System.out.println(target2 + ":" + m1_2.find());

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS);

    Matcher m2_1 = p2.matcher(target1);
    System.out.println(target1 + ":" + m2_1.find());
    Matcher m2_2 = p2.matcher(target2);
    System.out.println(target2 + ":" + m2_2.find());
  }
}
```

以下のコマンドを実行しました。

```
$ java JSample25_1 
A B:true
A　B:false
---- ----
A B:true
A　B:true
```

# まとめ

何かの役に立てばと。
VoIPとSIPを通じてRustを勉強する：DTMF作成編(下調べ)

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

# DTMFをRustで実装するに当たり
本日はDTMFをRustで実装するための下調べをやっていきたいと思います。
完全新規で実装するわけではなく、Asteriskなどでも使われている
[spandsp](https://github.com/jart/spandsp/blob/master/src/dtmf.c)を流用していきたいと思います。
各周波数を分解し、パワースペクトルを算出して検出を行っています。
具体的な説明は次の記事でやっていきたいと思います。

# おわりに
spandspなどをRustで実装していくと面白いかも。
インフラ設計の原則 ①

# 自己復旧の設計

分散システムでは、ハードウェア障害やネットワークの一時的な問題など、さまざまな障害が発生する可能性があります。これらの障害に備え、アプリケーションを自己復旧できるように設計することが重要です。以下に、自己復旧を実現するための推奨事項をまとめます。

## 推奨事項

### 1. 非同期で通信する分離コンポーネントを使用する

コンポーネント(フロントエンド、バックエンド、データベースなど)間の依存性を減らし、連鎖的な障害を防ぐため、イベント駆動の非同期通信を採用する。

##### AWS サービス例

- Amazon SQS：
  コンポーネント間の非同期メッセージングを実現し、システムの結合度を低減する

- Amazon SNS：
  イベント駆動の非同期通信をサポートし、複数のコンポーネントへの通信を可能にする

### 2. 失敗した操作の再試行

一時的なネットワーク障害やデータベース接続の問題に対処するため、再試行ロジックを実装する。

##### AWS サービス例

- AWS SDK：
  AWS SDK には自動再試行機能が組み込まれており、設定により再試行回数や待機時間を調整できる

### 3. リモートサービスの保護 (サーキットブレーカー)

継続的な障害時にシステム全体への影響を最小限に抑えるため、サーキットブレーカーパターンを使用して、失敗する可能性が高い操作を一時的に停止する。

##### サーキットブレーカー：

1. 通常 (クローズ状態)：
   - システムはリモートサービスや依存するコンポーネントに通常通りリクエストを送信
   - リクエストが成功すればそのまま動作
2. エラー発生時 (オープン状態)：
   - 一定回数の失敗が発生すると、リクエストを停止 (オープン状態)
   - オープン状態では、一定期間リクエストを遮断して、エラーを防ぐ
3. 回復確認 (ハーフオープン状態)
   - オープン状態が一定時間経過した後、少数のリクエストを再試行
   - 成功すれば通常状態に戻り、失敗すれば再度オープン状態に遷移

##### AWS サービス例

- AWS Lambda と AWS Step Functions：
  Lambda でサーキットブレーカーの各ステップで実行される処理ロジックを実装し、Step Functions でサーキットブレーカーパターン全体の状態遷移や分岐を管理する

### 4. 重要なリソースの分離 (バルクヘッド)

システムを独立したグループに分割し、1 つの部分での障害が全体に影響を与えないようにする。

##### AWS サービス例

- Amazon ECS や Amazon EKS：
  コンテナを使用して、異なる機能を持つサービスを分離し、1 つのサービスの障害が他に影響を与えないようにする

### 5. 負荷平準化

キューを使用して作業項目を非同期的に処理し、突然のトラフィック増加によるバックエンドサービスへの負荷を平準化する。

##### AWS サービス例

- Amazon SQS：
  キューイングを利用して、突発的なリクエスト増加時にも負荷を平準化する
- Amazon Kinesis：
  リアルタイムデータストリーミングを処理し、負荷分散する

### 6. フェイルオーバーの実装

障害発生時に別のインスタンスやリージョンに自動的に切り替える仕組みを構築し、高可用性を確保する。

##### AWS サービス例

- Amazon Route 53：
  ヘルスチェックとフェイルオーバー機能を使用して、障害発生時にトラフィックを健全なエンドポイントに自動的に切り替える

- Amazon RDS のマルチ AZ 配置：
  データベースの高可用性を確保し、障害児に自動フェールオーバーを実行する

### 7. 失敗したトランザクションの補正

分散トランザクションを避け、個別のトランザクションで構成し、失敗時には補正トランザクションで元に戻す。

##### AWS サービス例

- AWS Step Functions：
  分散トランザクションの各ステップを管理し、失敗時には補償アクションを実行する

### 8. 実行時間の長いトランザクションにチェックポイントを設ける

長時間の操作が失敗した場合、チェックポイントから再開できるように設計します。

##### AWS サービス例

### 9. 障害時の機能低下

完全な停止を避け、制限された機能でも提供し続けることで、ユーザーへの影響を最小限に抑える。

例：

- Graceful Degradation の設計：
  重要度の低い機能を一時的に停止し、コア機能の提供を継続することで、ユーザーへの影響を最小限に抑える

### 10. クライアントの制限と問題のあるユーザーのブロック

過度の負荷をかけるユーザーを一時的に制限し、継続的に問題を起こすユーザーはブロックすることで、全体の可用性を維持する。

##### AWS サービス例

- AWS WAF：
  特定の IP アドレスやリクエストパターンに基づいて、悪意のあるトラフィックをブロックする
- Amazon API Gateway：
  スロットリング設定を行い、過剰なリクエストを制限する

### 11. リーダーの選択の使用

タスクの調整役を動的に選出し、単一障害点を排除する。

##### AWS サービス例

- Amazon DynamoDB と Amazon ElastiCache：
  分散システム内でリーダー選出を行う際に、これらのサービスを使用してリーダー情報を管理する

### 12. フォールト挿入によるテスト

意図的に障害を発生させ、システムの回復性を検証する。

##### AWS サービス例

- AWS Fault Injection Simulator：
  意図的に障害を発生させ、システムの耐障害性を検証する

### 13. アベイラビリティゾーンの活用

アベイラビリティゾーンを利用して、デプロイメントの冗長性と高可用性を確保する。

##### AWS サービス例

- マルチ AZ 配置：
  Amazon EC2、Amazon RDS、Amazon S3 などのサービスでマルチ AZ 配置を行い、障害時にもサービスの継続性を確保する
14章 マルコフ連鎖

## 例題
### 14.1
回答の通り

### 14.2

\[1\]  
推移確率行列Qは下記のように表される。
$Q=\begin{pmatrix}
1/3 & 1/3 & 1/3 \\\\
1/6 & 1/2 & 1/3 \\\\
2/9 & 12/9 & 2/3 \\\\
\end{pmatrix}$

\[2\]  
$π_2
=π_0Q^2=(4/27, 8/27, 5/9)$
これは$4/27+8/27+5/9=1$を満たす

\[3\]  
定常分布が存在するとき、$π_i\=π_{i+1}\=π_iQ$より$π_i\=π_iQ$が成立する

$π_i=(a_i,b_i,c_i)$とおいて、これを解くと、$π_i\=(1/6,1/3,1/2)$が得られる。

よって定常分布$π$が存在する。

### 14.3

\[1\]  
状態空間は$S\={0,1,2}$、初期確率は$π_0\=(0,1,0)$である。また、遷移確率Qは下記のように表せる。  
$Q=\begin{pmatrix}
0 & 0 & 1 \\\\
0 & 1-\theta & \theta \\\\
1-\theta & \theta & 0 \\\\
\end{pmatrix}$

\[2\]  
尤度L(θ)は下記のように計算できる。  
$L(θ)\=(1−θ)×θ×(1−θ)×1×θ×(1−θ)×(1−θ)\=θ^2(1−θ)^4$
$\log{L(\theta)}=2\log(\theta)+4\log(1-\theta)$
右辺を微分して
$\frac{2}{\theta}-\frac{4}{1-\theta}=\frac{2-6\theta}{\theta(1-\theta)}$
これが0となるのは$θ=1/3$のとき

\[3\]  
$π\=πQ$を解くと、$a\=1/4$が得られる。
VoIPとSIPを通じてRustを勉強する：DTMFとは

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

# DTMFとは
電話機には0〜9,#,*がついています。
あれを押すと決められた周波数の音で信号を送受信することができます。
これを一定時間相手側が受信して1,2が押下された、などと検知します(50msくらいかな？)。

# 雑な図
|低群/高群(Hz)   |1209   |1336   |1477   |1633   |
|---|---|---|---|---|
|697   |1   |2   | 3  | A  |
|770   |4   |5   |6   | B  |
|852   |7   |8   |9   | C  |
|941   |*   |0   |#   | D  |

# 検出方法
信号をフーリエ変換で周波数に分けて検出します。
今回は少ない周波数に限られているので簡単に検出する方法としてgoertzelアルゴリズムがあります。

# 次回以降
DTMFの信号検出アルゴリズムをRustで実装したいと思います。

# おわりに
本格的な記事作成は忙しいのであとにします。すみません。。。
詳しく知りたい方はググってください。。。
Add Project Contracts

[Previous << Start Emulator](https://qiita.com/flowcadence/items/877ef913d31e57413692)
[Next >> Deploy a Project](https://qiita.com/flowcadence/items/36250ceb2e557abc1a92)

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

<h1>Add a Contract</h1>

プロジェクトにコントラクトを追加するには、`flow.json`ファイルの`"contracts"`セクションを更新します。

コントラクトはキーと値のペアで指定され、キーはコントラクト名、値はCadenceソースコードファイルの場所です。

例えば、以下の設定では、`FooContract.cdc`ファイルから`Foo`コントラクトを設定に追加します。

```ruby
{
  "contracts": {
    "Foo": "./cadence/contracts/FooContract.cdc"
  }
}
```

<h1>Define Contract Deployment Targets</h1>

コントラクトが一旦追加されると、1つまたは複数のデプロイ先を割り当てることができます。

デプロイ先とは、コントラクトがデプロイされるアカウントのことです。普通のプロジェクトでは、コントラクトはネットワークごとに1つのデプロイ先があります（例：Emulator、Testnet、Mainnet）。

デプロイ先は、`flow.json`ファイルの`"deployments"`セクションで定義されます。

ターゲットはネットワークごとにグループ化され、各ネットワークは、ターゲットのアカウントからコントラクトリストに対するマッピングです。複数のコントラクトを同じターゲットのアカウントにデプロイすることが可能です。

例えば、以下は`Foo`コントラクトと`Bar`コントラクトを`my-testnet-account`アカウントにデプロイするやり方です。

```ruby
{
  "contracts": {
    "Foo": "./cadence/contracts/FooContract.cdc",
    "Bar": "./cadence/contracts/BarContract.cdc"
  },
  "deployments": {
    "testnet": {
      "my-testnet-account": ["Foo", "Bar"]
    }
  }
}
```

*Last updated on **Dec 6, 2024** by **Alex Ni***

翻訳元

https://developers.flow.com/tools/flow-cli/deployment/project-contracts

***
<b>[Previous << Start Emulator](https://qiita.com/flowcadence/items/877ef913d31e57413692)
</b>

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

<b>[Next >> Deploy a Project](https://qiita.com/flowcadence/items/36250ceb2e557abc1a92)</b>
GitHub Pagesでog:image設定した画像が公開されないとき

沼ったけど、自分の場合は以下が原因でした。

NG例
```
<meta property="og:image" content="img/og-image-top.png" />
```

正解例
```
<meta property="og:image" content="https://sotanengel.github.io/image-webp-converter-wasm/img/og-image-top.png" />
```

相対パスじゃダメなんですね〜

検証に使ったサイト

https://sotanengel.github.io/image-webp-converter-wasm/
Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」　その7 対策をする、そしてプロジェクトを3分割のつづきddj_server 編

ddj_clientのつづきです

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

基本的には下記のソースのddj_serverを見てください

https://github.com/ymn-t-yamanashi/ddj_block/releases/tag/v0.04

実施していることは
- `mix phx.new ddj_server --no-ecto --no-html` でプロジェクト生成
- `mix phx.gen.socket Ddj` でソケット生成
- `mix phx.gen.channel Ddj` でchannel生成
- channel ddj:lobby 追加
- handle_in "new_msg" 追加

# プロジェクト生成

```bash
$ mix phx.new ddj_server --no-ecto --no-html
$ cd ddj_server
```

結果

https://github.com/ymn-t-yamanashi/ddj_block/commit/6ed716ca9eb359a6e761e82fb903f69917d8fa39


# ソケット生成

```bash
$ mix phx.gen.socket Ddj
```

結果

https://github.com/ymn-t-yamanashi/ddj_block/commit/ce34ddc7834bc83c37d1c3b9be33906595af8926

# channel生成

```bash
$ mix phx.gen.channel Ddj
```

結果

https://github.com/ymn-t-yamanashi/ddj_block/commit/95b5d1a32d35f13fed3714467cfb6b8c6e6ec2e2

# channel ddj:lobby 追加

```diff_elixir:ddj_server/lib/ddj_server_web/channels/ddj_socket.ex
# 省略
  # See the [`Channels guide`](https://hexdocs.pm/phoenix/channels.html)
  # for further details.

+  channel "ddj:lobby", DdjServerWeb.DdjChannel

  # Socket params are passed from the client and can
  # be used to verify and authenticate a user. After
# 省略
```

# handle_in "new_msg" 追加

```diff_elixir:ddj_server/lib/ddj_server_web/channels/ddj_channel.ex
#　省略
+  def handle_in("new_msg", %{"body" => body}, socket) do
+    broadcast!(socket, "new_msg", %{body: body})
+    {:noreply, socket}
+  end
  # It is also common to receive messages from the client and
  # broadcast to everyone in the current topic (ddj:lobby).
#　省略
```

これで、ddj_serverは完成


つづく

https://qiita.com/t-yamanashi/items/548545e70b41f26c0cfc
初めてデータベースを触る方向けのデータベース豆知識 🫛

最近のプロジェクトでデータベースを本格的に触る前までは、データベースの知識が深くなかった。実際データベースを動作しながら役に立った最も基本的で重要な議論を整理してみた。

## データとデータベースとは？
**データ**とは、単純に集められた値や情報を指します。一方で、情報処理システムの発展に伴い、実世界の膨大なデータを効率的に保存し、操作できるように設計されたものが**データベース**です。

**テータベースの最も大事な特徴は**
1. リアルタイムアクセシビリティ：必要なデータにすぐアクセス可能であること
2. 継続的な変化：データが常に更新され続けること
3. 同時共有：複数のユーザーが同時にデータを利用可能であること
4. 内容による参照：データ内容に基づいて情報を検索できること

:::note info
例:
オンラインショッピングサイトでは、顧客情報や購入履歴などのデータをデータベースに保存し、リアルタイムで商品の在庫や購入履歴を確認できます。
:::

## データーベース設計
データベース設計は、以下の3つの段階で行います：

1. **概念設計**: 現実世界のデータとその関係を抽象化してERモデル(Entity-Relationshipモデル)で表現します。
    - 例: 学生と講義の関係を「学生が講義を受講する」といった形で図解。
2. **論理設計**: ERモデルをリレーションモデル（テーブル形式）に変換します。
    - 例: 「学生」テーブルと「講義」テーブルを作成し、それらを「受講」テーブルで結びます。
3. **物理設計**: 実際のデータベースソフトウェアに基づいて物理的なストレージやインデックスを設定します。

**スキーマ（Schema)** とは、データベースの構造を定義する青写真や設計図のようなものです。データベースに保存されるデータの論理的な構造や制約条件を説明し、テーブル、ビュー、インデックス、リレーション、トリガー、ストアドプロシージャなどを含みます。簡単に言えば、データベースの「設計とルール」を定義したものです。

```sql
-- スキーマの定義:
CREATE SCHEMA company;

-- スキーマを利用したテーブル作成:
CREATE TABLE company.employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    department VARCHAR(50),
    salary INT
);

-- スキーマを利用したクエリ:
SELECT * FROM company.employees;
```


## データベース管理システム（DBMS)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777735/350d108e-b6a2-fe52-af16-7dc7779f9903.png)
**データベース管理システム（DBMS）** は、データベースを効率的に管理するためのソフトウェアシステムです。以下のような機能を持ちます：

- **DDL(データ定義言語)**: データベースの構造を定義します
``` sql
CREATE TABLE customer (
    id SERIAL PRIMARY KEY,      -- idはカラム名、PRIMARY KEYはドメインでidをuniqueに設定
    name VARCHAR(100) NOT NULL, 
    age INT,                    
    address VARCHAR(255),       
    remarks TEXT                
);
```
- **DML (データ操作言語)**: データの操作（挿入、取得、更新、削除）を行います
``` sql
-- 1. INSERT: データ挿入
INSERT INTO customer (name, age, address, remarks)
VALUES ('山田太郎', 28, '東京都港区', '常連客');

-- 2. SELECT: データ取得
SELECT * FROM customer;

-- 3. UPDATE: データ更新
UPDATE customer
SET age = 36, remarks = 'リピーター'
WHERE name = '佐藤花子';

-- 4. DELETE: データ削除
DELETE FROM customer
WHERE name = '鈴木一郎';
```
- **DCL(データ制御言語)**:データベースを適切に共有し、正確性を維持するために使用される言語です。
```sql
-- 特定のユーザーにテーブルへのアクセス権限を付与
GRANT SELECT, INSERT ON employee TO user123;

-- ユーザーのアクセス権限を取り消し
REVOKE SELECT, INSERT ON employee FROM user123;
```

DBMSを使用することで、効率的なデータ管理、データの一貫性維持、アクセス権限管理が可能となります。

## データベースモデリング
1. 概念モデル - ERモデル(Entity-Relationshipモデル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777735/bfbf11de-0c7e-3b3c-9a7e-b8a837085c19.png)

2. 論理モデル - 関係モデル
- 現実世界の情報を二次元テーブル（リレーション）の形式で表現する
    - データベースは複数のリレーションで構成される
    - **リレーション** = **リレーションスキーマ** + **リレーションインスタンス**
    - リレーションの特徴
        - 1つのリレーションには重複するタプルが存在しない
        - 順序を持たない
        - 属性間には順序がない
            - すべての属性値は原子的な値である

## トランザクション管理
トランザクションとは、データベースにおける一連の操作の単位です。トランザクションの信頼性を確保するためには、ACID特性が必要です：

:::note info
A: 原子性　：トランザクションの結果は完了か処理していないの結果になる
C: 一貫性　：トランザクション後、データベースは一貫した状態を維持すること
I : 独立性　：複数のトランザクションは互いに影響を与えずに実行されること
D: 永続性　：	トランザクションが完了した後、その結果は永続的に保存されること
:::

## 注意点🐛
カラム名はダブルクォートで囲む必要があり、文字列はシングルクォートで囲みます📝🤷‍♀️

``` sql
SELECT "name" FROM customer WHERE "address" = '横浜';
```
特にDBクライアントツールにこだわりがなければDBeaverをお勧めしたい件

# はじめに

- 現状さまざまなDBクライアントツールが存在しますが、個人的にはこちらの"DBeaver"が一番使いやすいと感じました
- 基本的な使用方法などはネット上に情報が溢れておりますので、私の個人的な意見や使用方法などを中心に紹介できればと考えました

https://dbeaver.io/

- DBクライアントツールとは？
    - データベースの操作、管理を行うためのソフトウェアです
    - データベース管理者や開発者がデータベースにアクセスしやすくなり、データベース管理の効率化を図ることができます

### 結論 - なぜおすすめ？

1. 無料で十分な性能がある
2. マルチプラットフォームであること
3. 頻繁にアップデートされ続けている
4. [Eclipse](https://www.eclipse.org/)と同じようなUIのため経験者であれば直感的に操作できる
5. 書き込み権限やトランザクションを独自に設定ができる
    - 例えばSQLでデータの書き込みを実行した際の結果画面で影響を及ぼしたレコード数が不自然であれば簡単にロールバックできます
6. その他カスタマイズ性が高い
    - 私は書き込み権限のあるものは見た目が危険色になるように設定しました
7. ER図を確認できる
8. ネットの情報が多い


### 導入
DBeaverのダウンロードはこちら

https://dbeaver.io/download/

## DBeaverの使い方

### 新しい接続

1. 画面左上「新しい接続」をクリック
2. 新しい接続タイプを選択する画面で(例)「MySQL」→「次へ（N）」をクリック
3. 接続設定画面
    1. 「Server Host：」にエンドポイントを入力
    2. 「ユーザー名:」の欄にマスターユーザー名
    3. 「パスワード：」の欄にマスターパスワードを入力
    4. 「テスト接続」をクリック
    5. 「接続の詳細（名前、種類、...）」をクリック

4. 一般画面
    1.「接続名：」の欄に任意の名前を記入
        - 例) {App name}_readonly
    2.「接続タイプ：」の欄にドロップダウンメニューより任意のタイプ（名前、色）を選択
    3.「説明：」の欄に任意のコメントを記入
        - 私はソースコードのDB接続設定箇所のファイルパスなどを書いておりました
    4.「セキュリティ」で読み取り専用の設定(DBクライアント側で書き込みを行わない場合)
    5.「テスト接続（T）」→「終了」クリック

### バックアップ（テーブルのコピー）
- 制約やデータの複製が期待通りに動かないことがございましたので、
私はSQLエディタを開き下記のSQLで実施しております
```SQL
-- コピー元と同じ構造の空テーブルを作成
-- CREATE TABLE 新テーブル名 LIKE 元テーブル名;
CREATE TABLE shops_20230202 LIKE shops;
-- コピー元テーブルから新テーブルへデータをコピー
-- INSERT INTO 新テーブル名 SELECT * FROM 元テーブル名;
INSERT INTO shops_20230202 SELECT * FROM shops;
```

### 指定したカラムが使用されているテーブルを検索 
- カラムの検索機能はないようでしたので私はこちらのクエリを実行しております
```SQL
SELECT 
	table_name 
FROM
	INFORMATION_SCHEMA.COLUMNS 
WHERE 
	column_name = '（例）is_test' 
;
```

## まとめ
- 元々別のDBクライアントツールを有料プラン(会社負担)で使用しておりましたが、上記の理由でDBeaverを無料で使用した方が間違いなく良いと感じました
- 現在使用しているDBクライアントツールに満足していない、もしくはどちらのDBクライアントツールを使用すれば良いか迷われている方の参考になれば幸いです！

## 余談
- 個人開発および以後の業務で特にDBクライアントツールの指定がございませんでしたら、DBeaverを使用し続ける予定なので、気になった箇所などがございましたらこちらの記事を更新します
- 少数のレコードの更新はSELECT文の結果画面から直接編集することはありますが、
私は基本的にエディタでSQLを実行しております
- 何かバグや気になる点など発生した場合などはこちらからIssueを作成すれば良いかと存じます

https://github.com/dbeaver/dbeaver/issues

## こちらのページを度々参考にさせていただいております:bow:

https://qiita.com/hiroga/items/34ac29b2a81b7f64eb1f

https://dev.classmethod.jp/articles/dbeaver-csv-export-automation/

https://teratail.com/questions/7q7ejecknih5ls

https://qiita.com/12345/items/48f6856e32fd618ea307

https://wonwon-eater.com/dbeaver-shortcut/

https://dbeaver.com/docs/wiki/SQL-Formatting/
【C#】Task<ActionResult<IEnumerable<T>>>型を戻すメソッドの単体テスト方法

## はじめに

みなさま。WebAPIを使っていますでしょうか？
SPAを使用するとほぼ必ず使うことになるWebAPIについて、C#で作成するときにはAsp.net CoreのWebAPIを使って下記のような形実装することが多いと思います。
※下記の例はVisual Studioのスキャフォールディング機能で自動実装したものです。

```csharp
// GET: api/Students
[HttpGet]
public async Task<ActionResult<IEnumerable<Students>>> GetStudents()
{
    return await _context.Students.ToListAsync();
}
```

ただそうなった時に１つ問題になるのが「単体テスト時にどうするか？」です。
具体的には`Task<ActionResult<IEnumerable<Students>>>`型の戻り値をどうやってテストすればいいのかという点になります。

今回は単体テスト時に`Task<ActionResult<IEnumerable<T>>>`の戻り値から扱いやすい`List<T>`へ変換してテストする方法をご紹介します。

## この記事で扱わないこと

- APIの作成方法
- MSTestの記載方法
- APIのレスポンスがOKか？NotFoundか？などの検証
- DBや外部に依存している箇所のモックについて

## 環境

- Windows11
- Visual Studio 2022
- .NET 8

## 本題

テスト対象のAPIについてよくある戻り値である`Task<ActionResult<IEnumerable<T>>>`を想定します。

:::note warn
実際にDBにつながっているとモックとかが面倒になるので新規のリストを返すように書き換えてありますが挙動としては一緒です。
:::

```csharp
[HttpGet(Name = "GetRecords")]
public async Task<ActionResult<IEnumerable<StudyRecord>>> GetAllStudyRecords()
{
    return new List<StudyRecord>{
        { new StudyRecord { Id = 1, Title = "Test1", Time = 1 } },
        { new StudyRecord { Id = 2, Title = "Test2", Time = 2 } },
        { new StudyRecord { Id = 3, Title = "Test3", Time = 3 } }
    };
 }
```

この時の`GetAllStudyRecords`の戻り値をブレークポイントで止めて確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/9cae204c-ae46-458f-a7da-377eb3d409e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/6577e7ce-3358-fc24-6b8a-105d9372e5cd.png)

`result.Result.Value`にアクセスすればうまくいきそうですね！
それではコードを修正して確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/9737a325-a271-f001-d238-7a6033985596.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/41bbad52-ebd0-f608-85ff-994d2130d581.png)

意図通り`List<T>`型で取り出すことができました。
やり方さえ分かっていれば２行に分ける必要もないので１行にまとめてもいいと思います。

またそもそもメソッド実行時に`await`を付けると戻り値が`ActionResult<T>`型になるため`.Value`を付けるだけでリストの取得ができるようになります(おそらくこっちのほうがメジャー？)。

:::note info
注意点としてその際にはテストメソッドの戻り値を`void`から`Task`型に変えないとテストエクスプローラー上で実行したときに実行結果を受け取ることができません。
:::


## 終わりに

戻り値の内容の検証ができるように変換する方法を紹介しました。レスポンス結果の検証方法についてもいつか記事にしたいです。

## 参考

https://learn.microsoft.com/ja-jp/aspnet/core/web-api/action-return-types?view=aspnetcore-8.0

https://learn.microsoft.com/ja-jp/aspnet/core/mvc/controllers/testing?view=aspnetcore-9.0

※Web API 2のテスト

https://learn.microsoft.com/ja-jp/dotnet/architecture/microservices/multi-container-microservice-net-applications/test-aspnet-core-services-web-apps
【tailwindcss】tailwindcssのクラスユーティリティをベースにスタイルを作る

### やりたかったこと

tailwindcssが用意している`top-*`をベースにして、新しいtailwindcssクラスユーティリティを作りたい。


tailwindcssが用意している`top-*`クラスユーティリティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/82137118-ebc1-418b-0390-32af7122e302.png)

こんな感じで`top-*`クラスユーティリティをベースとしたカスタムクラスユーティリティを作りたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/560c3b78-976c-e710-d2e2-661bfc223410.png)

```tsx:使用例
<div className="panel-top-80"></div>
```
```css:出力されるcss
/*top-80をベースにして".react-flow__panel.top."というセレクタを付与してCSS出力する*/ 
.react-flow__panel.top.panel-top-80 {
    top: 20rem;
}
```

### 設定方法
```js:tailwind.config.js

import defaultTheme from "tailwindcss/defaultTheme";
import forms from "@tailwindcss/forms";

/** @type {import('tailwindcss').Config} */
export default {
    //...省略...
    
    plugins: [
        //...省略...
        
        function ({ addUtilities, theme }) {
            const topValues = theme("spacing");

            const customTopUtilities = Object.entries(topValues).reduce(
                (acc, [key, value]) => {
                    acc[`.react-flow__panel.panel-top-${key}`] = {
                        top: value,
                    };
                    return acc;
                },
                {}
            );
            // ユーティリティを追加
            addUtilities(customTopUtilities, ["responsive"]);
        },
    ],
};

```

`acc[`.react-flow__panel.panel-top-${key}`]`と指定すると、最後のピリオド区切りの要素（`panel-top-${key}`）が表示名になる
サンフランシスコでWAYMOの自動運転タクシーに乗ったら途中でエラーに遭遇できてお得だった

## サンフランシスコ市街につくまで
今年はre:Inventに参加することができていて、ラスベガスに12/6朝まで滞在していました（8時-10時の早朝セッションまで聞けたのは良かった。結構人も少ないしNew Launchのセッションも多い）

その後、メンバーがツアーに参加させてもらっている某社ツアーの追加コンテンツに参加するために、サンフランシスコに移動、空港近くのホテルにチェックインしたあと、市内に向かうタクシーの中での会話が最初のきっかけです。

運ちゃん「仕事なにしてんの？」

ぼく「プログラマーっす」

運ちゃん「おー、マジで！じゃあAIとかやってんの？」

ぼく「まぁすこし」

運ちゃん「そかそか、Teslaの自動運転はマジ走りづらいよ、あいつら車を車と思わないで運転しやがるから（急加速、急停車する的な意味合い）運転しづらいったら無い。それと比べるとWAYMOはいいぜ」

ぼく「え、WAYMO走ってるん？」

運ちゃん「結構前から走ってるよ。最初はひどい運転だったけど、かなり改善してる。いまは大分ましだよ、まぁ俺のほうがうまいけどなHAHAHA～！！」

実際すごいうまい運ちゃんで、20分そこそこの道のりだったのにUBERの予測時間マイナス5分で到着してました。レーン移動が完璧で、渋滞をスルスルすり抜けていった。すげえ。

そして実際にサンフランシスコ市内で、名物の路面電車の写真でも取ろうかとウロウロ歩いていると、、、確かにいっぱいいる。奴が。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/105fff2f-e9ff-b5db-87f4-0d580590ee84.png)


それではまぁ乗ってみようかと、軽く調べたら、特に国籍関係なく、以下のアプリを使えばエリア内に置いては普通に使えるとのこと。

## 呼んでみよう、、、おおっと？？
というわけでアプリを開き、目的地を設定します。もともとタクシーで目的地には到着していて、時間つぶしに歩いていたので、そこから目的地にまで戻るのに。徒歩でも5分くらいなので、完全に乗ることが目的ですが。

そうすると、まずはピックアップポイントを指定されます。どうも大通りではなくちょっと折れた小道などを停止地点に選ぶ様になっているようで、ちょっと歩いてピックアップポイントへ。

そうして案内された場所なんですが、、、なんか人いっぱい集まってない？？
どうもホテルの従業員がストライキをしているようで、どう考えても乗れるようなスペースはありません。え？？これどーすんの？

と思ったら、そのへんもモニターして判断するようで、ピックアップ地点の手前の更に細い小路でWAYMOくんは止まっておりました。この辺の判断はどういうふうにやってるんでしょうね。

まぁとりあえず、乗り込みます。

## 乗り込んで、いざスタート。
まず乗り込むと、タブレット上で乗車に関する説明が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/8192a740-991e-90a2-0789-30475fd54501.png)


完全自動だから何してもいいよ、途中で出たくなったらこのボタン出して外に出てね、など。
さらにシートベルト締めてないとスタートできない旨をいわれて慌ててベルトをつけます。（ちなみにこのときに慌ててスマホを置いたときにビデオ録画が切れていたのに気づかず、ひたすら何も取れていないカメラを車内で回していました、、、）

そのときにルートが示されますが、結構な遠回り。どうも後でサンフランシスコ在住の方に聞くと、ルートはある程度決まっているらしく、安全だったりデータが溜まったりしているルートのみを使うようになっているらしく、最短経路というよりは運転しやすい経路を選ぶらしい。（これはこれで人間らしいよね）

## 順調順調、と思っていたら？
さて、WAYMOくん、スタートするとまずは件のストライキの場所をうまく避けて、そのまま大通りに抜けていきます。サンフランシスコの町は自転車もあればバス（しかもトロリーバス！）もあり、かなり自動運転には難しい場所のはずです。実際去年深センで自動運転体験したときは、運転手付きで、かつ最後の停車部分などは運転手が操作してましたからね、、、

というわけで順調に行ってるじゃん、、、と思っていたら交差点でいきなり停止！

どうも画面を見ると、センサー値に異常が出たからエンジニアがモニタリングをしている、、、と出ています。なんですと？？？
信号が青になっても道路の真ん中で停車したまんま、ハザードは自動で焚かれていますが特に路肩に寄せるわけでもないので、前から後ろからとんでもないクラクションを鳴らされます…

ひええ、、、

ちなみにタクシーには非常脱出のボタンついているので、こういうときにはもう出ていくものかもしれないんですが、車がビュンビュン行き交う交差点で車から飛び出すというのもそれはそれで自殺行為ですよね、ということで1-2分車内で待つことにしました。

そのあと状態は回復し、なんとか走り出しました。

これはちょっとヒヤッとしましたが、あくまで実験プロジェクトでもありますし、安全第一でこのような状況はFail Safeでやっているんでしょうね。

## とはいえすごい
とはいえ、この自動運転タクシーやはりすごくて、一番感心したのはルートの終盤にハザードを焚いた車の後ろにつけたときです。

ハザードが焚かれたことで、まずWAYMOは隣のレーンから追い抜かすことを選択し、実際そのようにハンドルを切りかけます。

しかしそのあと、その車はハザードを焚いたまま再加速しました。

そうするとWAYMOはそれに応じるように追い越しをやめてそのまま後ろにつく動きを見せます。

ところがやっぱり前の車は止まるらしく改めて減速、そこでWAYMOはあきらめて車線変更し、そのまま抜いていったのでした。

このうごき、かなり人間的に見えたんですよね。なんか感動しました。


## 思っていたよりもWAYMOすごい
そのあとのサンフランシスコでの会合でも、ちょうどWAYMOの話が出て、WAYMOのユニークさが話題になりました。

WAYMOのすごいところって、車に対して後付できるところっぽいんですよね。たしかに今回の車もセンサーだらけではありましたが、中身は完全なJugarでした。WAYMO自身も車を作るということはかんがえておらず、あくまで自動運転技術を作る会社ということです。

WAYMO自身は創業が2016年、かなり地道に自動運転をやってきた中で、ようやくここまでこぎつけているんですね。冒頭にも書きましたが、Uberの運ちゃんにも認められているというのも含めて、すごい人間らしいAIなのかなとおもいます。実際に人間の中にはいるAgent的なAIを考えると、こういうスタンスになるとは思うんですよね。

非常に面白かった、良い体験でした！