OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】Jacksonを使ってJSONを比較する

# TL;DR
- `Jackson`を使うことで、単純に文字列では比較できない`JSON`も比較できる
  - 単なる一致チェックにとどまらず、柔軟な比較も可能

# やりたいこと
以下のような、期待値の`JSON`が有ったとします。

```json:expected.json
{
  "foo": "foo",
  "bar": 1,
  "baz": true
}
```

一方で、`Java`上で得られる`JSON`は以下のような形式だったとします。

```java
String actual = "{\"bar\":1,\"baz\":true,\"foo\":\"foo\"}";
```

このような場合に、この2つが`JSON`として等しいことをテストします[^joukyou]。

[^joukyou]: 具体的には、大きな`JSON`の出力結果をテストする際に、期待値は整形済み`JSON`で管理したいが、出力は整形できないという状況で、この方法で比較を行いました。

# やり方
題の通り、`Jackson`を使ったやり方を紹介します。

`Jackson`では`readTree`で`JsonNode`という型を読み出せます。
これは`equals`を実装しているため、単純比較は特別な処理を書かなくても可能です。

```java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;;
import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class JacksonJsonTest {
  @Test
  void test() throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    String actual = "{\"bar\":1,\"baz\":true,\"foo\":\"foo\"}";

    JsonNode actualNode = mapper.readTree(actual);
    // ファイルからの期待値JSON読み込み
    JsonNode expectedNode = mapper.readTree(new FileInputStream("src/test/resources/expected.json"));

    assertEquals(expectedNode, actualNode);
  }
}
```

# このやり方の利点
調べた限り、このような比較を行うためのテスト用ライブラリなども有りそうでした。

それらに比べて`Jackson`が優れているのは、`Spring`等にデフォルトで導入されている点です。
`JSON`に関して何か処理が必要になった場合はまず導入されている`JSON`ライブラリで実現できないかから確認することをお勧めします。

また、`JsonNode`に実装されている関数を応用することで、ファジーな値比較や、特定プロパティのみの比較、特定プロパティの無視といった柔軟な比較も可能です。
このような機能性も利点の一つです。
【API】初心者のためのAPI解説！

# はじめに
未経験から入社して2年目となったエンジニアです。
1年目からFlutterのモバイルアプリ開発に参画しており、Flutterのプロジェクトと、DBのデータを取得するバックエンドのプロジェクトをAPIを経由する形で実装しておりました。

ただし、APIって何？？と聞かれた時に、毎回確信を持って回答ができないので、ここらで理解してみようと思います！

# 対象とする読者
* モバイルアプリ開発を行なっている方
* 初心者エンジニア
* APIについて理解を深めたい方
* APIに詳しい方

# APIとは

## とりあえずChatGPTに聞いてみた
Q: APIとは

A:
`API（Application Programming Interface）は、ソフトウェアアプリケーション同士が相互に通信・連携するためのインターフェースやプログラミングの手段を指します。これは、あるプログラムが他のプログラムと情報をやりとりする際の手順や規約を定めたもので、異なるソフトウェアコンポーネントが互いに通信できるようにするための枠組みです。`

`APIは、様々な形で提供されることがあります。ウェブ開発においては、ウェブAPIが一般的で、HTTPを通じてクライアント（たとえば、Webブラウザやモバイルアプリ）がサーバーにリクエストを送り、データを受け取る仕組みがあります。他にも、プログラムライブラリ、オペレーティングシステムのAPI、データベースのAPIなど、多くの場面で使用されています。`

とりあえず聞いたけれど、自分の中で大きな認識の違いはなかった。
開発者目線で言うと、**プロジェクト間で情報の連携を行うインターフェース**がAPIということになる。
つまりAPIを使用することで、広い意味で外部のプログラムを交えて開発することが可能になる。

イメージとしては、こんな感じ。(画像作成ツール知ってる方教えてください。。。)

![スクリーンショット 2023-11-30 23.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/2d6497a5-cd81-6e3d-b9ef-ceaa9ca3cb9b.png)


APIにもいくつか種類があるらしく、
プログラミング開発中に外部のライブラリを用いる際に使われる**ライブラリAPI**
DBへの接続やデータの取得をする際に使われえる**データベースAPI**
など、調べてみたら知らぬところでAPIが使われていました。
今回の記事では紹介しませんが、気になる人は調べてみてください。

## APIを使用することのメリットとデメリット

### メリット

#### ソフトウェア開発の効率化
これは、プログラミングを少し触ったことがある人なら言わずもがなと言うところでしょう。
公開されている外部のライブラリを取り入れることによって、数百行書かなくてはいけないところを、たったの数行で書けてしまいます。開発時間の短縮に繋がるので、大きなメリットと言えます。

#### セキュリティの向上
例を挙げるとSNSからのログイン認証を行うことができるAPIが存在しています。
ここについては、考え方の個人差があるかと思いますが、大手企業のSNS認証を取り入れることによって、ユーザ側の安心感も違いますし、0から作るログイン認証の欠陥による情報漏洩を防ぐことができるといった考え方もあります。

### デメリット

#### 定期的なメンテナンスが必要
連携先のサービスに仕様変更などがあった場合に、それに応じてアプリの修正が必要になります。
特にモバイルアプリ開発は、Webサイトと違い、変更を加えたバージョンのリリースまでに手間がかかるため、変更になるタイミングを把握し適宜適切な対応を行わなければなりません。
ここについては、痛いほど経験してきました。。。


# 最後に

最後まで読んでいただきありがとうございました！
Flutterについての記事やRTDBの記事についてもいくつかまとめているので、よかったら覗いてみてください！

https://qiita.com/suga_slj/items/7536534170ff862f3bdc

https://qiita.com/suga_slj/items/d740247537ea24a994ea
Rails6で、Webpacker::Manifest::MissingEntryErrorの解消

railsで、Gemのdeviseを使う時に、起こりがちのエラー Webpacker::Manifest::MissingEntryErrorの解消について。

よく、いろんな記事に載っている、以下のコマンドを実行してもエラーが解消されない。
rails webpacker:install
rails webpacker:compile


nodeのバージョンが20だったのですが、
14に下げることで治りました。

使用できるバージョンは以下のコマンドで確認。
n ls-remote --all

以下で、バージョンのダウングレードをする。
sudo n 14.0.0

すると、治りました。
【Unity】Bloomでパーティクルを光らせるためにHDRカラーを使おう

こんにちはっ🌟八ツ橋まろんです

UnityのBloom(ブルーム)とHDRカラーの話です。

Unityで「光らせる処理、発光処理」といえば、ポストプロセスのBloom機能を使いますね。Bloomは「画面中の明るいピクセルをぼかす画面エフェクト」です。

エミッションを設定したマテリアルは、Bloomが無い場合はただの白っぽい色で、Bloomを使うと明るく発光した見た目になります。↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f64a9d9d-0e17-8029-4848-1d79081c4338.png)

:::note info
発光表現には『Bloom(ブルーム)』が必要です
:::

さて掲題ですが、以下のような、パーティクル付きのシーンにBloomを適用すると、パーティクルよりも肌の方が光ってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f5dbb85e-c531-2c67-1db2-f6f383d89edf.png)

Bloomは明るいピクセルを光らせるので、キャラクターの肌とパーティクルの青では、キャラクターの肌の方が明るいという判定でパーティクルより光ってしまうのですね。↓↓↓↓
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/04ac6373-bdee-0930-9784-46b36f1008cb.png">

こういうとき、**『HDRカラー』** を使えば発光する青を表現できます。

通常のカラーはRGBが0-255の256段階で表します。

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/fad17a26-8cef-b270-bf43-c81d8a4b816a.png">

256は2の8乗です。8bit(=1byte)の2進数が0-255の256段階を表せます。

```
2進数は8bit(1byte)で0-255までを表せる
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
・
・
・
11111111 = 255
```

通常のカラーはRGBの情報を8bitずつ持っているのですね。

HDRカラーというのはRGBを8bitではなく10bitずつ持っています。画面に出力する色の上限は255ですが、Bloomの計算において255以上の数値で計算を行えるため、『明るい青をぼかす』ことができます。

:::note info
HDRカラーを使うことで、通常より明るい色を表現できます。
:::

Unityでは、HDRカラーはRGBの255に明るさのIntensityというパラメータを加えたものになっています。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/27df3432-aff1-05fa-803f-df8387f1a3c6.png">

残念ながらパーティクルにはHDRカラーを指定できる項目がありません。
Start ColorもColor Over Lifetimeも通常のカラーしか指定できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/55032ea0-02b6-fe09-66ab-4ad7dee2761f.png)

その代わり、パーティクル用のマテリアルのカラーがHDRカラーに対応しているので、ここを白にして、その明るさ(Intensity)を上げ、今回の場合はColor Over Lifetimeで青色を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/c6f5e656-4c6c-78ce-079a-64e760ed46a2.png)

:::note info
パーティクルにHDRカラー使う項目がないので、マテリアル側でHDRカラーを指定します
:::

ということで、HDRカラーを使うことでパーティクルがBloomで明るく光りました。↓↓↓↓
(肌が光らないようにBloomの閾値を上げています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/89fd28cf-0d15-261e-ce72-064a771cf6b1.png)

是非試してみてくださいっ！

それではっ🌟
【HTML/CSS】CSSグリッドにしょうもないミスで苦戦した話

# 結論からいうと
### 　　　　　　　　　　タグの戸締りはちゃんとしよう

# 事の発端
始めてホームページを作ってみようとHTMLとCSSを触り始め、~~楽すぎ本なんかなくても行けそうだわってくらい~~スムーズに制作が進んでいた。そんななかCSSでグリッド表示をしてみようと挑戦した矢先のことであった。
まず完成想定はこちら
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632168/f5f68304-5f67-c88a-8e63-cdd006b7e7da.png)
そしてこれを目指して打ち込んだ結果
![出来上がったもの.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632168/138aaf6b-4889-5b1e-70e2-73833792bf5e.png)
### そうはならんやろ！？
なぜか生まれる謎の空白が出来てしまった...

# なんでこうなったの？(解説)
この謎の空白を見てから私は様々なサイトを漁るも、何も出てこない。というかこの時は主にCSSにバグだと思っていたのでHTMLはまったく気にしていなかった。だがCSSのテストをしてみるとこれがうまくいった。「じゃあHTMLじゃん」ということで何とかたどりつけた。
バグ当初のHTMLとCSSの一部を以下に載せる。
```html:test.html
<div class="contalner">
    <div class="item">
        <h1>1</h1>
        <a>詳細はこちら<a>
    </div>
    <div class="item">
        <h1>2</h1>
        <a>詳細はこちら<a>
    </div>
    <div class="item">
        <h1>3</h1>
        <a>詳細はこちら<a>
    </div>
</div>
```
```css:test.css
.contalner{
    display: grid;
    grid-template-columns: 150px 150px 150px;
    gap: 15px;
    padding-left: 10px;
    padding-right: 10px;
    padding-top: 100px;
}
.item{
    background: rgb(0, 41, 221);
    color: #fff;
    padding: 10px;
}
```
皆様気づいただろうか、すごくしょうもないミスである。
#### ＜a＞のタグを閉め忘れているのだ
え、これであんなに変になるんだ。全く連想できなかったヒューマンエラーでした。

以下のコードが修正後です。CSSは変更なしです。
```html:test_ok.html
<div class="contalner">
    <div class="item">
        <h1>1</h1>
        <a>詳細はこちら</a>
    </div>
    <div class="item">
        <h1>2</h1>
        <a>詳細はこちら</a>
    </div>
    <div class="item">
        <h1>3</h1>
        <a>詳細はこちら</a>
    </div>
</div>
```
これで表示してみると理想と同じ画面が！やったー！
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632168/f5f68304-5f67-c88a-8e63-cdd006b7e7da.png)

# 結論
### 　　　　　　　　　　タグの戸締りはちゃんとしよう
最近は鍵の管理も甘くなっている自覚がありますが、htmlのタグも家の鍵も閉じることをしっかりと心がけましょう。注意不足のおかげで結構な時間をバグ取りに費やしてしまいました ~~、それが楽しいんだけどね！~~。ただこれを機に初めてQiitaに上げてみようってなったのは私として結構いいきっかけだったのかもしれない。という訳で最初の記事は本当にしょうもないミスに苦戦してしまったことでした、まだホームページ作りは終わってないので完成かミスに沼ったら投稿しようと思います！
prisma db pushした時の「All data will be lost?」の対処法

:::note
この記事は、Prisma使用中に「All data will be lost?」という警告メッセージが表示された際の対処法を解説します。
:::

こんにちは、株式会社KakuKakuのhamanoです。

Prismaを使用していた際、私は大きな失敗をしました。
それは、全データを失うという事態です。
使用中のデータベースが、テーブルの枠組みだけを残して空になってしまいました。

幸い、バックアップがあったので大きな損害は避けられましたが、その時は非常に焦りました。
今回は、そうした経験を生かして、皆様が同じような事態に陥らないように、この記事を作成しました。

# すでに「All Data will be lost?」で「Yes」を選んだ方へ
残念ながら、一度失ったデータは元には戻りません。
（データ復旧の方法をご存じの方は、ぜひ教えてください。）

# 実際に起こったケース
私は、Prismaを初めて使った時、
大量のデータが入っているモデルのカラム名を更新するために、モデルのスキーマを変更し、
以下のコマンドを実行しました。

~~~Bash
$ npx prisma db push
~~~

この時、以下のメッセージが表示されました。

~~~Bash
All data will be lost?
~~~

誤って「y」を選択し、すべてのデータを失いました。

# 「All data will be lost?」と聞かれた理由
新しいモデルを作成する際にはこの問題は発生しませんが、既存のモデルを更新する際には起こりえます。
PrismaやSQLで作成したモデルにデータを既に入れており、その後でフィールドの型定義や名前を変更しようとすると、既存のデータとの矛盾が生じ、データベースの初期化が必要になることがあります。

# 「All data will be lost?」と聞かれたらどうする？
データベース内のデータを保持したい場合は、「No」を選びましょう。
データを空にしても問題ない場合は、「Yes」を選択しても良いです。

## データを保持しつつモデルを更新したい場合
以降は「No」を選んだ人へお伝えします。

### カラム名を変更するには
私の場合、Azure Data Studioを介してSQLを使用してデータベースを修正しました。
Prismaを使用しているにも関わらずSQLに手を出すのは矛盾していますが、必要だと判断しました。
例えば、Userモデルのaccountカラムをemailに変更するには、

:::note warn
SQL Serverのコードです。ご注意ください。
:::

~~~SQL
EXEC sp_rename 'User.account', 'email', 'COLUMN';
~~~

この方法でカラム名を変更できます。

### 型定義を変更するには
型を変更する場合もSQLで対応します。
ただし、値が新しい型に適合するかを確認する必要があります。
例えば、VARCHARからINTへの変換をする場合、

:::note info
'123' → 123
'あいう' → 数値への変換不可
:::

:::note warn
SQL Serverのコードです。
:::

~~~SQL
ALTER TABLE ModelName
ALTER COLUMN ColumnName INT;
~~~

これにより、カラムの型を変更できます。

# SQLで直接変更する際の注意点
SQLでモデルを変更する場合は、必ずPrismaのスキーマも更新してください。
異なる場合は、後に大きな問題が生じる可能性があります。

# 最後に
最後までお読みいただきありがとうございます。
私たち株式会社Kakukakuでは、共に開発を進めるスタッフやパートナーを募集しています。
https://kakukaku.app/
10の割り算　割られる数が1000ぐらいまで正しい(おまけ2)


作成中　10の割り算　割られる数が1000ぐらいまで正しい(おまけ2)


目的
M0/M0+でいろいろな変換を高速化
する。
親切な人に頂いたプログラムを解析する


①最初と最後のシフトダウンは、誤差の丸め?
②xをxの上位16ビットと下位16ビットに分ける
③下位16ビット同士を掛ける
④下位、上位のたすき掛けをする
⑤上位16ビット同士を掛ける
⑥1回シフトする
⑦xの入力時に1回、定数で1回、リターンで1回、
合計3回シフトしている


https://note.cman.jp/convert/bit/


10進化する定数
3435973837(10進)
0xcccccccd(16進)
1100 1100 1100 1100 1100 1100 1100 1101(二進)


yhの値　1回シフトした値
0x6666
0110 0110 0110 0110

ylの値
0x6667
0110 0110 0110 0111


xが19の時の値
　定数3435973837(10進)
65283502903(10進)
1111 0011 0011 0011 0011 0011 0011 0011 0111(二進)

xが19(1/2の時9.5)の時の値　定数66666667(16進) 1717986919(10進)
15461882271(10進)
0011 1001 1001 1001 1001 1001 1001 1001 1111(二進)


![o_cop823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5af8e890-4528-dba6-1c40-82e3d0761838.jpeg)

![o_cop825.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2754a657-ef8a-bdfc-271a-7f352eecba79.jpeg)


元


```c++

#include <stdint.h>
uint32_t piyo(uint32_t x)
{
    x >>= 1;
    uint32_t xh = x >> 16;
    uint32_t xl = x & 0xffff;
    uint32_t yh = 0x6666;
    uint32_t yl = 0x6667;
    uint32_t z = xl * yl;
    z >>= 16;
    z += xh * yl + xl * yh;
    z >>= 16;
    z += xh * yh;
    return z >> 1;
}


```
【Docker x AWS】CLIで「Error saving credentials: error storing credentials - err: exit status 1, out:」エラーが出た場合

# エラー内容

いつものようにCLIログインをしたら以下のエラーが出てきました。

```
Error saving credentials: error storing credentials - err: exit status 1, out: `Post "http://ipc/registry/credstore-updated": dial unix backend.sock: connect: connection refused`
```

# 原因と解決方法

なんじゃこりゃ？と思い、調べてみると、、

Docker Desktopを起動していなかっただけでした...

エラーメッセージは、CLIログインコマンドを実行する際に、認証情報を保存するためのストレージが利用できないことを示しています。エラーメッセージの中には、`backend.sock: connect: no such file or directory`という部分がありますが、これはバックエンドのソケットファイルが見つからないことを示しています。

今回はDockerデーモンが起動していない（Dockerデスクトップを起動していない）ことが原因で、CLIが必要なバックエンドソケットファイルにアクセスできていなかったですが、調べていると`.docker/config.json`のパラメータに問題があるケースもあるようです。

```
cat ~/.docker/config.json
```

上記を実行すると、以下のように認証情報が見れます。

```json
{
	"auths": {
		"xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com": {},
		"xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com": {},
		"xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com": {}
	},
	"credsStore": "desktop"
```

`"credsStore": "desktop"`とは、CLIが認証情報（ログイン情報）を保存する方法のことで、`desktop`の場合は認証情報をデスクトップアプリケーション経由で保存している、と言うことを意味しているのだそう。
私の場合はDocker Desktopを使っているのでそう表示されています。

一般的にはデスクトップアプリケーションを介して保存および取得した方がセキュリティ的に良いでしょう。
ただし、ここを削除したり、もしくはこの`json`ごと削除することで、エラーが消えた、という記事もいくつかありました。

## 参考
`credential store`については、公式ドキュメントで以下のように記載がありましたので、ご参考までに。
[docker login](https://docs.docker.com/engine/reference/commandline/login/#credentials-store)

ログインすると、そのコマンドが`$HOME/.docker/config.json`に認証情報を保存する、とあります。本エラーになった場合はその辺が関係してくると思われます。

> You can log into any public or private repository for which you have credentials. When you log in, the command stores credentials in $HOME/.docker/config.json on Linux or %USERPROFILE%/.docker/config.json on Windows, via the procedure described below.

>The Docker Engine can keep user credentials in an external credential store, such as the native keychain of the operating system. Using an external store is more secure than storing credentials in the Docker configuration file.


> You need to specify the credential store in $HOME/.docker/config.json to tell the docker engine to use it. The value of the config property should be the suffix of the program to use (i.e. everything after docker-credential-). For example, to use docker-credential-osxkeychain:
{
  "credsStore": "osxkeychain"
}
If you are currently logged in, run docker logout to remove the credentials from the file and run docker login again.
【4日目】OSS連携してみたい！(2)C++でAutowareのmsgをサブスクライブ

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)4日目の記事です。  

OSS連携を試みるため、ROS2の簡単なモジュールを数回に渡って作っていきたいと思います。

https://qiita.com/Massy0127/private/6c0f330699ae29507396

の続きです。

# ROS2でモジュール作成
前回、ROS2のチュートリアルを使って自作パブリッシャーとサブスクライバーでHelloWorldを行いました。

今回はAutowareのメッセージをサブスクライブして、サブスクライブしたことを表示するデモを行いたいと思います。

とはいえ、[こちらの記事](https://qiita.com/h_bog/items/368543a4b10b356db0e5)のほぼ丸写し、今回丸写しだと動かなかったので一部改造しただけです。

# 環境作成
[前回記事](https://qiita.com/Massy0127/private/6c0f330699ae29507396)と、[こちらの記事](https://qiita.com/h_bog/items/368543a4b10b356db0e5)を参考にROSのモジュールを作成。
今回はPathがメッセージとしてパブリッシュされていない様子のため、PathWithLaneIdのメッセージをサブスクライブしてメッセージを受領したことを確認するように改造。

```path_subscriber.hpp
#ifndef PATH_SUBSCRIBER_HPP_
#define PATH_SUBSCRIBER_HPP_

#include <rclcpp/rclcpp.hpp>
#include <autoware_auto_planning_msgs/msg/path_with_lane_id.hpp>

using PathWithLaneId = autoware_auto_planning_msgs::msg::PathWithLaneId;

class PathSubscriber : public rclcpp::Node
{
public:
    PathSubscriber();

    void topicCallback(const PathWithLaneId::ConstSharedPtr msg);

private:
    rclcpp::Subscription<PathWithLaneId>::SharedPtr sub_path_;
    PathWithLaneId::ConstSharedPtr path_;
};
#endif // PATH_SUBSCRIBER_HPP_

```

```path_subscriber.cpp
#include "path_subscriber.hpp"
#include <memory>

using PathWithLaneId = autoware_auto_planning_msgs::msg::PathWithLaneId;
using std::placeholders::_1;

PathSubscriber::PathSubscriber() : Node("path_subscriber")
{
    sub_path_ = create_subscription<PathWithLaneId>("behavior_planning/path_with_lane_id", 10, std::bind(&PathSubscriber::topicCallback, this, _1));
}

void PathSubscriber::topicCallback(const PathWithLaneId::ConstSharedPtr msg)
{
    path_ = msg;
    RCLCPP_INFO(this->get_logger(), "I heard");
}

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<PathSubscriber>());
    rclcpp::shutdown();
    return 0;
}
```



以下の通り、ビルドされ正常終了することを確認。
![Screenshot from 2023-11-30 21-54-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/3b7b2aad-c4c2-229a-c8aa-e6f0f7ea8139.png)

# 実行
docker上で以下を実行
```
#AWSIMの起動
$ bash run_awsim.sh
#Autowareのビルド、起動
$ bash clean_build.sh
$ bash run_autoware.sh
```
以下のメッセージが出力され、Autowareのメッセージをサブスクライブしていることを確認しました。
![Screenshot from 2023-11-30 23-29-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/d2b513df-0ff7-d5e3-a193-3fec3edfaba8.png)





# 今後の予定
1.Autowareのメッセージをパブリッシュし、既存のAutowareがサブスクライブするようにする。
2.OSS連携もできるように変更する。
という流れで行きたいと思います。
Xで最新の技術を追うのが日課の話

# なんだかもうAIとか生成モデルだの基盤モデルがどう進歩してるんだかよくわからん
※この記事は東大電気電子情報系EEICのアドベントカレンダーとして寄稿しています

やれ新アーキテクチャだのSOTAだの新技術がうんたらで凄いだのOpenAIDevDayだので情報が忙しいですよね, でも僕らは情報系なので逸般の誤家庭にあるようなパソコン(メモリ256GB以上)さえあれば最新技術でもGitHubにあるようなOSSなら動かすことができます。

今回はXを活用して最新技術を追う方法をみんなに伝授したいと思います。

# 1. Developerをフォローしろ
フォローするなら間違いなく実際に最新技術を扱ってフォローしている人間をフォローするのがおすすめです。彼らは絶対にGitHubを添えてツイートをしてくれます。
以下は僕のフォロー欄です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/06cff5a7-c034-efa4-ad64-03510bd4591c.png" height=75% width=75%>
一人ぐらいフォローを返してくれてもいいと思います。

# 2. 技術系のツイートは必ず時間があればGitHubで動かしてみろ
ちょうど今もTLを眺めていたら技術系のツイートが流れてきました, 早速確認してみましょう‼️

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/d1f1e5d5-73df-b88d-18d2-4b0245edd7ef.png" height=75% width=75%>

なるほど, これはRetrieval(LLMのHallucinationを低減し, 正しい情報を引き出す手法です)に関する検証リポジトリのようですね‼️早速動かしてみましょう‼️
<h2> .... </h2>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/9cdba9df-b200-cf19-f384-31c7c0c16343.png" width=75% height=75%>

# また新たな技術が流れてきました‼️
こんどはLLMでPCを自動操作するといった技術です‼️AGIに近づくための画期的な研究開発物ではないでしょうか❓リポジトリもあります, 早速動かしてみましょう‼️ 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/3d97bbf8-8dd3-0f2b-24c9-220e5b40e1a0.png" width=75% height=75%>

<h2> .... </h2>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/c9c0c76e-764e-c799-2768-3ac36057c247.png" width=75% height=75%>

# いかがでしたか?
Xを使っているエンジニアのみなさんはただ流れている技術を受け身に追うだけではなく, 実際にリポジトリに足を運んでみてはいかがでしょうか❓
技術がどれだけ話題になっていても、実際に動かしてみるとそれほど大したことがない場合もあります。
技術の進歩が早くても, 実際に動かしてみた経験は大切だと思います。
実際に動かしてみて技術を肌で感じることで, 最新技術の実態を確かめましょう‼️

# 追伸
OPENAIのAPIKEYをください
[iOS] サウンド再生時のバックグラウンド音声のコントロール方法

# はじめに
動画を再生する画面の実装にあたり、バックグラウンドで流している音楽等のサウンドに干渉した場合の調整方法に調べました。

# 環境
Xcode15

# 内容
アプリのバックグラウンド再生されているオーディオのコントロールには、`AVAudioSession`を使うことで実現できる。

`AVAudioSession`でiOSのオーディオセッションの管理ができ、アプリがどのようにオーディオを扱うかをシステムに伝えることができる。

```swift
import AVFoundation

func configureAudioSession() {
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(.playback, mode: .default)
        try audioSession.setActive(true)
    } catch {
        print("Audio Session configuration failed.")
    }
}
```

## [setCategory](https://developer.apple.com/documentation/avfaudio/avaudiosession/category)

セッションカテゴリを設定することで一連のオーディオ動作を定義することができる。
`Category`は必須で必要。`Mode`, `RouteSharingPolicy`, `CategoryOptions`を設定することでより細かい定義ができる

```swift
func setCategory(
    _ category: AVAudioSession.Category,
    mode: AVAudioSession.Mode,
    policy: AVAudioSession.RouteSharingPolicy,
    options: AVAudioSession.CategoryOptions = []
) throws
```

### [AVAudioSession.Category](https://developer.apple.com/documentation/avfaudio/avaudiosession/category)

[`ambient`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616560-ambient)
サウンドの再生が主要ではないアプリのカテゴリ
他のアプリの音声が自分の音声と混ざる
サイレントスイッチを使用すると、音声が聞こえなくなる

[`multiRoute`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616484-multiroute)
オーディオ データの個別のストリームを同時に異なる出力デバイスにルーティングするためのカテゴリ

[`playAndRecord`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616568-playandrecord)
VoIP（Voice over Internet Protocol）アプリなど、音声の録音（入力）と再生（出力）を行うカテゴリ
サイレントスイッチを設定もしくは画面をロックした状態でもオーディオは継続される

[`playback`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616509-playback)
録音された音楽やその他のサウンドを再生するためのカテゴリ
サイレントスイッチを設定し画面をロックした状態でもオーディオは継続される

[`record`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616451-record)
再生音声を消音しながら音声を録音するカテゴリ
セッションがアクティブである限り、システム上のすべての出力を無音にする効果がる
予期しないサウンドが再生されるのを防ぐ必要がなければ、`playAndRecord`を使う
電話やアラームなど、ミキシング不可能なオーディオセッションの中断を防ぐことはできない

[`soloAmbient`](https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616488-soloambient)
デフォルトのカテゴリ
画面ロックとサイレントスイッチによって消音される
ミキシングを許可するには、`ambient`を使う

## [setActive](https://developer.apple.com/documentation/avfaudio/avaudiosession/1616627-setactive)

指定されたオプションを使用してアプリのオーディオセッションをアクティブまたは非アクティブにできる。

他のオーディオセッションの方が優先順位が高く（電話など）、どちらのオーディオセッションもミキシングを許可していない場合、セッションのアクティブ化には失敗する。

```swift
func setActive(
    _ active: Bool,
    options: AVAudioSession.SetActiveOptions = []
) throws
```


[`notifyOthersOnDeactivation`](https://developer.apple.com/documentation/avfaudio/avaudiosession/setactiveoptions/1616603-notifyothersondeactivation)

自分のアプリのオーディオセッションを停止したことを、システムが他のアプリに通知することを示すオプション
`setActive`にfalseを渡してオーディオセッションを非アクティブにする時のみ使うオプション

# おわりに
ドキュメントを読むとユースケースごとに細かな設定ができそうな印象でした。
デフォルト値と必須な設定項目を把握したらあとはユースケースごとに調整するのが良さそうです。

# 参考

https://developer.apple.com/documentation/avfaudio/avaudiosession/2887480-setcategory

https://developer.apple.com/documentation/avfaudio/avaudiosession/2887480-setcategory

https://qiita.com/From_F/items/1994853ff90824b6bd2f
結局GPT-3.5 vs GTP-4 どっち使えばいいの？

OpenAI社の比較、推奨情報が乗っているので、まとめてみました。

https://platform.openai.com/docs/guides/text-generation/completions-api

>Which model should I use?
>We generally recommend that you use either gpt-4 or gpt-3.5-turbo. Which of these you should use depends on the complexity of the tasks you are using the models for. gpt-4 generally performs better on a wide range of evaluations. In particular, gpt-4 is more capable at carefully following complex instructions. By contrast gpt-3.5-turbo is more likely to follow just one part of a complex multi-part instruction. gpt-4 is less likely than gpt-3.5-turbo to make up information, a behavior known as "hallucination". gpt-4 also has a larger context window with a maximum size of 8,192 tokens compared to 4,096 tokens for gpt-3.5-turbo. However, gpt-3.5-turbo returns outputs with lower latency and costs much less per token.
>We recommend experimenting in the playground to investigate which models provide the best price performance trade-off for your usage. A common design pattern is to use several distinct query types which are each dispatched to the model appropriate to handle them.

## GPT-4
* より複雑なタスクをこなせる
* ハルシネーションが起こる可能性がより低い
* テキストだけではなく画像も処理できる

## GPT3.5
* 応答速度が速い
* 安い（GPT-4の1/10）

### 価格の比較（1ドル150円計算）
* 1000トークンあたりの費用
* 1トークンは日本語だと1文字、英語だと１単語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/bdbed6af-4789-1588-4857-d714deffe2bc.png)
* `1106`や`preview`のほうが安い
### 頭の良さの比較
https://arxiv.org/abs/2303.08774
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/702c71be-2d72-9a65-a98a-8fd8867c3bff.png)
* どの科目でもGPT-4のほうが結果がよい

# 結論
* 結果重視ならGPT-4
* コストを気にするならGPT-3.5
* トークンのカウントは以下からできる
    * https://platform.openai.com/tokenizer
    * 出力トークンも費用が掛かる点に注意
これであなたもWebエンジニア！dojoやってます！

私どもの部署ではDENSOグループ社員向けに、2ヶ月間で アジャイル開発、クラウド、Web サービス開発の実践的な基礎を学ぶ研修（dojo）を開催しています。今回、dojoについて紹介したいと思います。


## 研修概要
- 目的
    - クラウド開発経験の少ない社員に、座学＋実践を含めた研修を実施し、第一線で活躍してもらう
- 期間
    - 2023/11/1～12/28（終日）
- 対象
    - DENSOグループ社員
    - クラウド及びアジャイル開発を学びたい方
- 内容
    - 座学（11月）
        - アジャイル開発概要
        - プログラミング
            - HTML, CSS, JavaScript, Ruby, Rails, SQL ...
        - クラウド
            - AWS, CI/CD, IaC, Git, Docker ...
    - 実践（12月）
        - 4～5人のチームに分かれて、スクラムでWebアプリ制作
            - インセプションデッキ、ユーザストーリーマップ作成
            - スプリント期間は 2～3日で、合計 7スプリント
- その他
    - 研修はオンラインとリアルの混成
    - 年に2回程度開催。今回は第6期。今後も継続予定。

## 特徴
- コンセプトは "自ら学ぶ"、"仲間と高めあう"、"講師はそれをサポートする"
- dojo卒業生が講師を務める
- dojoをプロダクトとして捉え、受講生からフィードバックを得て即時 or 次期に向けて改善を繰り返す
- 受講生には毎日振り返りを実施いただき、学んだことを定着させたり、チーム活動の改善点について議論いただく

## 講師としての苦労　⇒　対応事例
- 受講生のチームビルディング（研修序盤はチームメンバ同士が遠慮がちで活発な議論はできていない。笑いも少ない。）
    - ⇒　チーム活動は極力リアルで実施。結局は時間が解決するのかもしれない。
- オンライン研修での受講生の反応・理解度の把握
    - ⇒　zoomのリアクションを表示してもらう。個別に問いかけて思いを引き出す。
- プログラミング未経験者と詳しい方が混在している状況で、受講生全員の満足度を上げること
    - ⇒　未経験者には手厚いサポート、詳しい方には考える機会を提供する。

## 最後に
特にプログラミング未経験の受講生にとっては、毎日新しいことに触れて頭をフル回転させるため、毎日疲れ切ってしまうと思います。が、これを乗り越えた先には、Webエンジニア・ソフトウェアエンジニアとしての入口に立てると考えてます！
オークファングループ（開発部）のご紹介 2023

# はじめに
お疲れさまです。もしくは、初めまして。
オークファングループ開発部 @aucfan-nodake です。

ノリと勢いで始まった会社としての参加も6年目となりました。

エンジニアは、モノを作ってなんぼ、とは私は思っていますが、
チームとして、会社として活動するためには「言葉」などを介してのコミュニケーションは重要であり、様々な人を想定しつつ「言葉」を考え、使うことは大切なことだと考えています。

この場がメンバーにとって、定期的なアウトプットの場となると共に、
組織外の人たちにとって、何かしら参考になる情報を拾える場になれば幸いです。


## オークファングループとは
「[オークファングループ](https://aucfan.co.jp/ "オークファングループ")」は、ネットショッピングやオークションの相場、統計価格比較サービス [オークファン](https://aucfan.com/ "買うときも売るときもオークファン - Yahoo!オークションや通販サイトの価格データで適切な相場を検索") を運営する会社「オークファン」と、国内最大級のBtoB卸売仕入れプラットフォーム [NETSEA](https://www.netsea.jp/ "国内最大級の商品掲載数｜問屋・卸売・卸・仕入れ専門サイト【NETSEA】") を運営する会社「シナビズ」を中心としたグループです。

起業からしばらくオンラインのサービスを中心として走ってきましたが、最近では、オフラインの取引や海外に目を向けた動きもできてきました。

### 開発部は
そんなサービスを守り育てるために、日々システムの運用保守を行ない、ときには新しいサービスの立ち上げなども行う 30～40名ほどの部署になります。

特徴になるか、、人数はそれなりに居るのですが、9チーム存在したり、MGRが一部兼任していたり少人数のチームが居たり。
実際の活動としては、小さなチームの動き、責任範囲や裁量が大きくなりがちだったりするでしょうか。

また、事業会社なので、会話する相手はエンジニアだけに限定されず、いろんな人と会話できたりするのは、好きな人は楽しいかもしれません。
※ただ現状では、集中できるという長所もありつつリモートでの活動が多く、開発部同士での対面でのコミュニケーションは少ないです。（Zoom などでのオンラインでの MTG など仕事でのコミュニケーションやそこからこ溢れ話はありますが）

## 明日から
開発部のメンバーが、それぞれの立場、経験から記事を投稿してくれます。

記事の内容に興味を持っていただき、楽しく読んで頂ければとても嬉しく思います。
また、頂いた反応やコメントにより、その記事の先に進んで行けることを期待しています。

今回は以上となりますが、今月も、今後も宜しくお願い致します。



# おまけ
文字だけだと寂しいので、[決算説明会資料](https://pdf.irpocket.com/C3674/MH4b/Jjx3/KYMq.pdf "決算説明会資料")から、上記２つのサービスの紹介ページと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/68d5d8b3-c47c-fe4a-c476-6c4010bb629d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/da1dc223-c5b4-2bcd-183b-df5050a88e58.png)


最近の会社の動きとして `オフラインの取引や海外` に取り組んでいきます、
というのが見えそうなページを引っ張っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/eaefe469-bcdc-4ebf-de2d-691e4e5464cc.png)

ご参考まで ;)
すぐやる人になるための本

# はじめに
社会人一年目・エンジニア未経験の拓海です。
技術的にわからない事が多いので、今回は技術ではなくビジネス書籍について書いていこうと思います。

#### なぜこの本を読もうと思ったのか...
今までは学生だったので後回しにしても時間があり取り返すことができましたが、社会人となりやる気が起きなくてもやれる人になりたいと思いこの本を読んでみました。

# すぐやる人になるための本


この本にはやる気にならなくてもやれる人になるために37個のコツを書いていました。
37個のコツすべてを書くには少し長すぎるので大きく分けて以下の5の項目について紹介します。

>1. 行動に初速をつける
>2. 行動ブレーキの外し方
>3. 行動マインドの作り方
>4. 時間の使い方
>5. 行動思考の身につけ方

##### 1. 行動に初速をつける
行動に初速をつけるとは、とりあえず行動に移すということです。
物事を考えすぎて計画を練ってから行動に移そうとして終わって結局やらずじまいで終わってしまう事が多いので、とりあえず量をこなしそのあとに質を高めていくことが大切になります。
##### 2. 行動ブレーキの外し方
行動ブレーキとは、集中して作業をしていたのに人から話しかけられたり、予想外のトラブルでパニックになったりすることで、集中力を奪われ、思うように行動できなくなることを言います。
このブレーキを取るのに以下の２つの方法があります。
1. 原因を特定して、阻害要因を排除する
2. 目的にフォーカスすることで、阻害要因の影響を小さくする

この２つが行動ブレーキを外す際に大切なことになります。
##### 3. 行動マインドの作り方
すぐにできる人はポジティブなゴールをイメージすることが多く、先延ばしにする人はネガティブなイメージが多いとのことです。
人の性格や能力に関係なく、物事の見方１つでネガティブからポジティブに変換することができるそうです。
##### 4. 時間の使い方
自分の時間の使い道を、投資（学びや経験etc）、消費(食事や睡眠etc)、浪費(無目的に過ごす時間etc)といった三つのカテゴリーにわけ家計簿のように時間をチェックすることによりすぐにやる人になるために大切になります。

##### 5. 行動思考の身につけ方
マイナスの状態をゼロに戻すゼロベース行動とプラスの価値を生み出すプラス行動の二種類になりゼロベース行動をとセットで「本当はどうしたいか」考えることが行動思考を身に着けるのに必要になります。
# 最後に

私はこの本を読むまで後回しにすることが多々あったのですが、この本と出会い「すぐやる人」になるためのコツを知ることができたので、今後この知識を活用し生活をしていきたいです。
今回記事に書いた内容はほんの一部しかかけていないので興味を持っていただけたのなら「やる気に頼らずすぐやる人になる37のコツ」という本を読んでみてください。
省庁や自治体のPower BIレポート公開が熱い

## はじめに
![corporate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/71820f52-e893-7c87-300e-c278220d011d.png)　コロナが少しずつ明けてきた2023年、省庁や自治体のホームページ等でPower BIレポートを閲覧することが多くなったと感じています。
私が確認したところからいくつか紹介します。

## デジタル庁

 複数の取り組みに関するボードがあります。
「[政策データダッシュボード一覧](https://www.digital.go.jp/resources/govdashboard)」 デジタル庁（ https://www.digital.go.jp/resources/govdashboard ）

 代表的なKPIをはっきりと大きく出して、詳細版として仔細もみせていく、埋め込みと全画面の両方のリンクがある、など見せ方いいですね。

 ## 東京都
 令和５年度予算より、[TOKYO予算見える化ボード](https://www.zaimu.metro.tokyo.lg.jp/zaisei/yosan/r5.html)
 毎年、わかりやすさが向上しているように思います。 今年のものの「R5予算案の主な事業」/「予算の8つの柱」の見せ方、好きです。具体的に何をやっていくのか、絞りながら施策を見せていくの、いいですね。アプリ感あります。

 ## 世田谷区

 ### 予算の見える化ボード

 [予算の見える化ボード | 世田谷区ホームページ](https://www.city.setagaya.lg.jp/mokuji/kusei/004/001/003/d00203489.html)
 納税したお金がどのように使われているのか、はっきり説明していだけると心もすっきりしますね。


### 世田谷区財務諸表の見える化ボード
 [新公会計制度に基づく財務情報の公表について | 世田谷区ホームページ](https://www.city.setagaya.lg.jp/mokuji/kusei/004/003/d00151362.html)

 BS、PL、CF等がはっきり示されています。Excel、Word中心に見せる民間企業がほとんどの中、アクセスしやすい形で見せていくのは進んでいますね。

 ## [参考] 世田谷区さんの取り組み関する

 [Udemyでの学びを起点に新たな区民サービスを提供。DX推進で重要な現場の理解を得るコツとは？｜東京都世田谷区のUdemy活用事例【前編】｜行政DX通信](https://note.com/udemy_government/n/n7ee74f2b80b7)

 専用アプリからPower BIレポートに移行した例のお話もありなるほどと感じました。

 ## [参考] Web公開とWeb公開の抑止

Microsoftの公式ドキュメントと以前（2020年12月）の私のQiitaです。

https://learn.microsoft.com/ja-jp/power-bi/collaborate-share/service-publish-to-web?WT.mc_id=DP-MVP-5004418

https://qiita.com/ishiayaya/items/faddbe227cea8df674b2


## おわりに
![dashboard (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/8d73910e-4e37-b8f8-9a38-7fc93d38f262.png)　今年（2023年）は一般的にPower BIレポートを目にすることが多くなってきたと感じます。2024年は省庁・自治体等に限らず、さらに多くなるといいなと感じています。 [noteのキーワードで「Power BI」を検索](https://note.com/search?q=Power%2BBI&context=note&mode=search)してみても、結構なヒットがありますね。前はここまでじゃなかったなぁと思います。
大体０から始めるRuby入門その2 　~ゲームを作る~

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の２日目です。
# 簡単なゲームを作る
簡単な数あてゲームです。
数字を入力し、決められた数よりも大きいか小さいか、あるいは正解かを判断する例のあれです。
これを作るにあたって、数字を入力する部分、if文について学んでいきます。
# 数字を入力できるようにする
数字を入力するには「gets」を使うようです。
また、入力後にEnterを押した際改行がされるのを防ぐために「chomp」というのをつけるそうです。
さらに、入力した文字を数値に変えるために「to_i」を用いるようです。
全て組み合わせて、実際にやってみた結果がこちら
↓コード
```
puts "ある人は"
getter =gets.chomp
puts "ある人は"+getter+"です。"
```
出力
```
C:\Users\xxxxx\Desktop>ruby Advent2023.rb
ある人は
人間
ある人は人間です。
```
さらに、入力した文字を数値に変えるために「to_i」を用いるようです。
さっきのやつにくっつけたら
```
Advent2023.rb:3:in `+': no implicit conversion of Integer into String (TypeError)
        from Advent2023.rb:3:in `<main>'
```
このようなエラーが出ます。これは、int型からstring型に変換できない？エラーが出ています。
いずれにしても、int型が認識されているので、ちゃんと数値に置き換わっています。
# if
条件式を作っていきます。
条件式は、if 〇〇 then 〇〇の感じで作れるそうです。
else ifはelsifとかくようです。
最後にendをつけ忘れないようにすればOKみたいです。
試しに、入力された数値が5以下なら「A」、そうでなければ「B」を出力するようなコードを書いていきます。
```
Getter=gets.chomp.to_i
if Getter<=5 then
   puts "A"
else
   puts "B"
end
```
結果
```
C:\Users\xxxxx\Desktop>ruby Advent2023.rb
3
A

C:\Users\xxxxx\Desktop>ruby Advent2023.rb
8
B
```
いい感じになってきました
# ランダムに数字を選ぶ
ランダムに数字を選ぶようにしてみます
ランダムは、randを使うようです。
randの中でも用途によっていろいろあるみたいです。
今回は１から100まで（0を含まない）ようにしたいので、
```
rand(1..100)
```
と書きました。
# 終わるまで処理を実行する
続いている間は終わらないようにします。今回の場合は数字を入力して大きいか小さいか判定した後また数字が入力できるようにします。whileを使うそうです。
while 条件
やりたいこと
end
みたいな感じで書くようです。nextで先頭に戻り、breakで強制終了します。
やりながら覚えます。
さっきまでの知識を組み合わせて、
↓書いたコード
```
Ans=rand (1..100)
puts "数値を入力してください"
ch =gets.chomp.to_i
while Ans!=ch do
  if Ans>ch then
    puts "もっと大きいです"

  elsif Ans<ch then
    puts"もっと小さいです"

  end
  ch =gets.chomp.to_i
end
puts"正解！("+Ans.to_s+")"

```
while横の条件を'Ans=ch'としたらうまく動きませんでした。
!とかdoをつけるとうまくいくようです。
！は条件を逆にする？みたいです（今回はAnsとchが同じ'ではない'間繰り返す）
doは、{}と同じ意味らしいです。
whileを使うときに使われ、endまでの中をwhileで実行するみたいです。

ちなみに、動かした結果はこうなりました

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">アドベントカレンダー用　２　数当てゲーム <a href="https://t.co/6Nuybc01Ua">pic.twitter.com/6Nuybc01Ua</a></p>&mdash; ある暇な人 (@Aruhimanahito) <a href="https://twitter.com/Aruhimanahito/status/1730225751843017095?ref_src=twsrc%5Etfw">November 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちゃんと動いています。よかった。

# 感想
if文の使いかたや文字の入力、ランダムの使いかたを学びました。
なかなかしっかり動かせたので満足です。



参考

https://style.potepan.com/articles/28419.html

https://www.javadrive.jp/ruby/if/index7.html

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/rand.html

https://www.javadrive.jp/ruby/for/index1.html
firebase の schema 定義ライブラリ比較

# firebase の schema 定義ライブラリ比較

firebase の realtime database, firestore の schema 定義のためのライブラリを探す・比較するついでに記事にまとめてみた.

対象となるのは以下のものたち

- [fireschema](https://github.com/yarnaimo/fireschema)
- [fireorm](https://fireorm.js.org/#/) ([github](https://github.com/wovalle/fireorm))
- [firemodel](https://firemodel.info/) ([github](https://github.com/forest-fire/firemodel))

||スター数|最終更新|最新ver| weekly DL|
|--|:--:|:--:|:--:|:--:|
|fireschema|262|2022/1/8|v5.0.0-36|357|
|fireorm|536|2023/3/8|0.23.3|5,566|
|firemodel|3|2021/7/7|0.59.7|33|

:::note info
2023/12/1 時点
:::

使うなら fireorm カナ
【Rails7】jsbundling-railsを用いたモジュールバンドラーの比較

# はじめに
**Rails7系**から`Webpacker`が非推奨になり、`importmap-rails`や`jsbundling-rails`で`JavaScript`を管理するようになりました。今回は`jsbundling-rails`を用いたモジュールバンドラーの比較を少しまとめてみました。

# jsbundling-railsとは
`jsbundling-rails` は、`Webpack` や `esbuild`、`rollup` といったモジュールバンドラーの使用をサポートする Gemです。



# 比較

| | esbuild | rollup | webpack |
|---|---|---|---|
| ビルド速度 | 高速 | 低速 | 低速 |
| CommonJSモジュール対応 | ○ | △（要プラグイン） | ○ |
| ES6対応 | ○ | ○ | △（要Babel） |
| TypeScriptのトランスパイル | ○ | △（要プラグイン） | △（要プラグイン） |
| JSX構文のトランスパイル | ○ | △（要プラグイン） | △（要Babel） |


# 考察
特筆すべきは、`esbuild`の速度です。
他2つと比較すると、100倍以上の差があるような[事例](https://esbuild.github.io/faq/#benchmark-details)もあるそうです。
他を比較しても、`CommonJSモジュール`と`ES6`に対応しています。また、`TypeScript`と`JSX構文`のトランスパイルもサポートしています。これらの特性は、大規模なプロジェクトで高速なビルドを必要とする場合や、`TypeScript`や`JSX`を頻繁に使用する場合に有効かと思いますが、特段理由が無ければ、モジュールバンドラーに関しては`esbuild`を使う方向で問題ないのではないかと思います。


# 参考

https://github.com/rails/jsbundling-rails



https://qiita.com/megane42/items/bf85746b9cefaf38f473
3回目のRuby技術者認定試験Gold 3.1で合格した話

# はじめに
2023年11月上旬に2回目のRuby Gold受験し68点で落ちた（[落ちた話はこちら](https://qiita.com/Takaharu_01/items/5da7f656f1e317dc0bc4)）ので、2023年11月下旬に3回目受けました。
結果は82点で合格したので、2回目受験から今回の3回目受験までの期間取組んだこと等をまとめてみます。

# 試験当日までにやったこと
1. [Ruby技術者認定試験合格教本](https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
    1. 基礎力確認問題を解く
    1. 模擬試験を解く
1. [ctc問題](https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html)を解く
1. [模擬問題集](https://github.com/ruby-association/prep-test/blob/version3/gold_ja.md)を解く
1. [Ruby Gold3.0記事](https://qiita.com/heysan/items/82bdfb7af4325f05e0e5)を参考に[Ruby技術者認定試験Gold 3.1で2回落ちた話](https://qiita.com/Takaharu_01/items/5da7f656f1e317dc0bc4)の不足部分を補う

2回目受験から3回目受験まで2週間の期間があったのですが1週間程勉強できていなかったため、復習として1.Ruby技術者認定試験合格教本 を着手しました。基礎力確認問題・模擬問題・ctc問題の正答率をほぼ100%の正答率に仕上げた後、2の模擬問題集は90%位に仕上げました。また、Ruby技術者認定試験Gold 3.1で2回落ちた話の不足部分については、2回目受験した後に少し調べてたことと模擬問題の内容で補っていました。
反省点としては1週間勉強しない期間を作るのではなく、先に模擬問題集とRuby技術者認定試験Gold 3.1で2回落ちた話の不足部分の理解に徹底した方がよかったのかなと思いました。（計画してたのですが、実行に移せなかったので、今後の資格試験受験で生かしていきたいと思います）

# 出題問題の内容
覚えている範囲をざっくり記載していきます
- includeした時にincludedが呼ばれる
- 〜eof、-eof、＋eofの出力の違い
- 配列の要素の取り方（silverの範囲）
- pribate、public、protectメソッドのスコープ
- instance_variableの実行結果
- include、content、=~、matchの挙動
- superでの引数受渡
- catch、throw、break、returnの挙動
- 例外クラスの最上位
- ナンパラ_0、_1を利用するのか？
- filter_mapの挙動
- アクセッサメソッドの使い方
- ＄0でファイル名を呼び出す
- rationalの表し方、1/5r
- 可変長変数の説明
- take.lazy、taka.to_aの使い方...

# おわりに
3回目でなんとか合格できてほっとしました。（正直今回のテストはこれまでよりも難易度高かった気がするので、75点以上取れているかとても不安でした...）Ruby試験を通して、体系的に勉強できRubyのメソッドなのかrailsのメソッドなのか区別がついているように感じています。また、既存コードを理解する際に躓くことが少なくなった気がしています。Rubyに関しては、[メタプログラミング](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/487311743)を読んだり試験問題解いたりして、定期的に復習していければと思います。今回の試験で学習習慣がついたため、このままの勢いで次はAWS系の資格にも挑戦していきます！

# 参考記事
https://qiita.com/Takaharu_01/items/5da7f656f1e317dc0bc

https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1

https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html

https://github.com/ruby-association/prep-test/blob/version3/gold_ja.md

https://qiita.com/heysan/items/82bdfb7af4325f05e0e5
英語学習に最適な映画再生体験を作るためのAWS MediaConvert設定

## はじめに
こんにちは、GlobeeでCTOをやっています上赤です。
[Globee Advent Calendar](https://qiita.com/advent-calendar/2023/globee)3日目の記事です。
abceedで英語学習に最適な映画再生体験を作るために、AWS MediaConvertの設定を色々調整しましたので、それについて話します。

## 英語学習に最適な映画再生体験とは
abceedでは、映画を使って効率的に英語学習を行ってもらうために、様々な機能を付けています。

![1700401325215-U2CLBK2V5N.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49019/f76baed5-b006-5851-4700-c7db63f73f8e.jpeg)


* 日英同時字幕
* 速度変更
* フレーズ単位の解説語注
* フレーズ単位のシーク/リピート
など、様々なものがありますが、この記事では主に<b>フレーズ単位のシーク/リピート</b>が関わってきます。

### フレーズ単位のシーク/リピートのための要件
まず大前提として、フレーズとフレーズの隙間は非常に短く、<b>0.01秒単位で正確にシーク</b>できないと、フレーズの開始位置とぴったり合わせることができません。

![スクリーンショット 2023-11-30 22.36.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49019/a76c8baf-3380-cd7e-808a-89183bd24217.png)

また、1フレーズの長さは短いものだと1秒ぐらいなので、フレーズリピートをすると最短1秒ごとにシークが行われることになります。この時、シークのレスポンスが悪いと、非常にユーザー体験が悪いです。
例えば、1回のシークに0.1秒かかる場合なら10秒間に8~9回ぐらいリピートできるところが、1回のシークに1秒かかる場合、10秒間に4~5回ぐらいしかリピートできなくなります。
逆に、ある程度大きな秒数でシークする場合は、レスポンスが多少悪くてもそこまでストレスではないです。(これは普通の動画サービスと同じ)

なので、<b>ストリーミング環境下で、0.01秒単位のシークを正確かつレスポンス良くする</b>、というのが他のサービスにはない要件でした。それを踏まえてAWS MediaConvertの設定をどういじったかを紹介します。

## 具体的な設定

### SegmentLength 
`"SegmentLength": 1`
デフォルト値は10秒ですが、そうすると短い範囲でのシークのレスポンスがやや悪かったので、1秒単位でセグメント化しています。

### SegmentLengthControl/ManifestDurationFormat 
`"SegmentLengthControl": "EXACT"`
`"ManifestDurationFormat": "FLOATING_POINT"`
この設定にしないと、アプリ側でのシークが0.1秒単位でずれてしまうことがあったので、厳密なシークができるようにこの設定にしています。

### AbrSettings
具体的な設定数値は割愛しますが、一般的な動画サービスよりも若干通信速度に対する画質値を落としています。
リリース後のアンケートで、画質よりもシークのレスポンスを求める人の方が多かった、というのが理由です。
もちろん、アプリ上で「高画質」の設定にすれば通信速度に関わらず高画質の動画を見ることも可能にしてあります。

### SegmentControl
`"SegmentControl": "SINGLE_FILE"`
AndroidのExoPlayerでファイルダウンロードをする際に、SEGMENTED_FILESの設定だとやたら遅かったので、単一ファイルにしてあります。単一ファイルにしてもシークのレスポンスには体感余り差はありませんでした。

### その他主要設定
iOS/Android/Webの全てで配信する必要があるので、出力グループはCMAFにして、S3上に格納するファイルサイズを減らしています。Live配信は行わないのでエンコード時間に対する要件は緩く、品質チューニングレベルはマルチパス HQにしてあります。

## まとめ
動画エンコード周りを本格的に触るのは今回始めてだったので、求められる要件が達成できるかどうかは割と不安でしたが、そこまで大きなハマり無く達成できて良かったです。
AWS MediaConvertはソースをS3に置いたまま実行できるので、非常に扱いやすいですね。

abceedでは、人の学習効率を最大化する、という観点で色々な機能を作っています。
映画の英語学習体験もそうですが、他サービスには無い独特な機能を作ることが多いので、エンジニアとしても楽しめる環境かと思います。

現在アプリ/Web/サーバーエンジニア/PjMなど、ほぼすべての開発ポジションを募集中です！
ちょっとでも興味持った人は以下からカジュアル面談をご検討ください。色々お話します！
[採用ページ](https://globee.notion.site/Globee-d184eefc3561480292481299c64b04bc)
新規開発したらオーバースペックだった件、原因は意外なところにあった

## この記事で伝えること

・要件定義の大切さ
・運用不振でも、開発したことに自信を持つこと
・毒親やパワハラを引きずってないか自問する

### 注：この記事で伝えていないこと

・技術情報
・コピペして使えるコードサンプル
・要件定義書の具体的な書き方

## 出来事の経緯

### 開発したシステムは電子入場管理システム

システムの開発理由と目的は、社内スタッフと現場イベントスタッフの

* コスト削減
* 業務効率化
* 紙チケットの転売防止

以上を目的としていた。しかし会社の業績が風前の灯火だったため、このシステムを作ったところで直接の売上につながらないことは明らかだった。

しかし「クライアントの言うことは絶対」という空気感も感じていたため、開発することに。

LAMP環境にLaravelとBreezeを使い、コスト削減・業務効率化・転売防止を実現するため仕様を策定した。

本来ならSMS認証を入れたかったが、クライアント側で稟議が通らず。

それでも入場チケットを転売や譲渡されづらいよう、現場スタッフが不正利用しないよう、私なりに懸命に取り組んだ。

クライアントに進捗報告もマメに行い、おおむねよい評価もいただいていた。

### その結果は...

開発物は大きな納期遅れもなく納品。

クライアントとは業務委託契約を締結し、開発と開発物の最低限フォロー以外しないことにした。

会社を去って1ヶ月たった頃。クライアントから連絡があった。

:::note warn
「現場導入したが結果が思わしくない。この要件でシステム改修してほしい」
:::

私は要件を確認し、その内容に私は怒りの感情が込み上げてきた。


### 課題解決どころか墓穴を広げるクライアント

具体的な内容は、

:::note alert
* チケットのメール認証廃止
* スクリーンショットを配布させないために実装した表示時間期限を10秒から60分に伸ばす
* 同一チケットを再認証したらエラー表示するのではなく、メッセージつきで認証OK画面を出す
:::

つまりクライアントの要件を満たすために頑張って実装した不正対策は無駄だったのだ。

それどころかクライアントは不正リスクを容認し、最悪売上が落ちる選択を取ろうとしているように見えた。

**「ふざけるな！これじゃ転売譲渡し放題じゃないか」**

このままでいいのか。

：

私は冷静になり、そして気づいた。

「開発者は言われたとおりに実装すればいいし、相手がシステムを使って生じた損害に負い目を感じることはない」と。

なぜ私がその境地に達することができたか？

この先の文章が社内SEされている方のお役に立てれば幸いです。


## この出来事の本質的な原因は？

### 開発初期のドキュメント共有が不十分

当時この案件を進めていたときは要件定義書・外部設計・内部設計を作らずに進めていた。

まともなIT企業ではまず開発内容を文字とビジュアルで明確にして残る形にするのだが、

社内SEはいきなりカイハツしがちなので、いきなりステーキよろしく後々問題になりかねない。



### クライアントとのパワーバランス

いかにクライアントと対等な立場、安全な距離間をとれるかが開発者として問われる。

クライアントのオフィスに常駐して働いていたときは「経営者視点を持て」「他部署のトラブルを自分ごとととらえよ」という社風があった。

これはマネジメント職を目指すなら関係あるが、開発のスペシャリストには必須ではないのでは。

:::note info
開発で結果を出したことに自信を持っていいし、その後の運用で結果が出なかったことを過度に憂うのもどうかと思う。
:::

しかしインハウスSEだと他部署の運用不振が給料やボーナスに響いたり自分の責任に感じてしまうこともあるのでは？

私は「要件どおりに作ったが稼働後の運用成果が上がらない」社内システムをいくつも担当し、閑古鳥が鳴く様子を見てきた。


### 私自身が毒親の毒を抱えながら仕事していた

私はかつて毒親のもとで育った毒親育ちで、他人との適切な距離のとりかたを学べないまま育った。

これが災いして過度にフレンドリー（かつDVな）上司や企業に当たることが多かった。

今回のクライアントも、実は過去トラウマになるような経験があった。

あるときクライアントの会社に所属していたとき社長本人から電話がかかってきて

**「俺の指示は常に最優先だ！すぐやってすぐ報告しなきゃダメだろ！次から改めろ」**

と激しい口調で言われ脅された経験がある。

この経験がもとで「社長の言うことは絶対」という不健康な信念をもつきっかけとなった。

当時、毒親育ちごっこの延長をやっているとは気づかずに。


## この出来事から学んだ点は？

### 要件定義を残す、動画と音声も活用する

:::note info
要件定義書を作って残したり会議を録画録音しておくことで、気まぐれ仕様変更されないように対処することが可能。
:::

なぜなら開発者と営業（場合によっては現場）とでは、言った言わないトラブルが生じやすいからである。

また相手によっては文章やビジュアルだけでなく、口頭で伝えないと届かない場合があるので厄介。

この点についても今後は、AI動画生成ツールを使った音声入りドキュメントで営業系の人とのミスコミュニケーションが減らせると個人的には期待している。


### 技術を磨くだけでなくメンタルも磨く

:::note info
メンタルを磨くことで仕様変更や人間関係のストレスや想定外を減らし、生産性を高められる効果も期待できる。
:::

メンタルを磨かないと仕様変更のたびに心折れて「やってらんねー！」と暴飲暴食・衝動買いの原因になり給料日前にお金がない悩みを抱えやすくなる。



### 依存関係を手放す

:::note info
「クライアントの言うことが絶対」かつ時間やお金の自由を奪う毒親のような存在になっていないか、定期的に関係を見直す。
:::

また私含めITエンジニアは他人をあてにしない傾向があるが、もし同業者でメンタリング（カウンセリングやコーチング）できる人がいれば活用しないのはもったいない。

かくいう私も転職や人間関係を社外メンターに相談したりモデリングできる人を見つけてから状況が変化していったので参考になれば幸いです。


## ここまで読んだあなたに

もし親や上司やクライアントとの人間関係に辛さを感じたり、なぜかブラック企業に当たりやすいと感じているなら、私が作った「毒親育ち診断プログラム」も活用してみてください。

[診断はこちら（結果確認は会員登録要、すべて無料）](https://blog.yamato.website/custom/ch20231117/)
Tor経由でPythonを使う

# 眠いので素のLinuxでやる
## インストール
- Ubuntuであることを前提とする

```bash
sudo apt install tor -y
pip install PySocks
```

## 起動
- localhost:9050でバックグラウンド起動させる

```bash
tor&
```

## 確認
```bash
# まじIP
curl -sL ipinfo.io

# Tor経由
curl -sL --socks5 127.0.0.1:9050 ipinfo.io
```

## Python経由で使う

```python
import requests

def get_ip_info(proxy=None):
    url = 'https://ipinfo.io'
    proxies = {'http': proxy, 'https': proxy} if proxy else None
    
    try:
        response = requests.get(url, proxies=proxies)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")
        return None

result_without_proxy = get_ip_info()
print(result_without_proxy)

proxy_address = 'socks5://127.0.0.1:9050'
result_with_proxy = get_ip_info(proxy=proxy_address)
print(result_with_proxy)
```

## 次
コンテナ化
【Rust】Result と Option の相互変換

よく使う型変換の tips です。

# Result -> Option
```rs
let res: Result<&str, &str> = Ok("hogehoge");

assert_eq!(Some("hogehoge"), res.ok());
```

`Err` は `None` になります。

# Option -> Result
```rs
let opt = Some("fugafuga");

assert_eq!(Ok("fugafuga"), opt.ok_or("error!"));

let opt: Option<&str> = None;

assert_eq!(Err("error!"), opt.ok_or("error!"));
```

`ok_or` の引数には `None` のときに `Err` としてとる値を記述する必要があります。


# Option, Result を安全に unwrap
```rs
let opt = Some("hogehoge");

assert_eq!("hogehoge", opt.unwrap_or("fugafuga"));

let opt = None;

assert_eq!("fugafuga", opt.unwrap_or("fugafuga"));

let res: Result<&str, &str> = Ok("hogehoge");

assert_eq!("hogehoge", res.unwrap_or("fugafuga"));

let res: Result<&str, &str> = Err("error!");

assert_eq!("fugafuga", res.unwrap_or("fugafuga"));
```

`unwrap_or` は `unwrap` 失敗時に使われるデフォルト値を設定して `unwrap` する関数です。

# おわり
`or` より `or_else` の方がパフォーマンス的に推奨されますが、`or_else` は定数の代わりに関数書かないといけないのでちょっと敬遠しがちです。
Google Cloudアップデート (11/23-11/29/2023)

### GKE: [Nov 22, 2023](https://cloud.google.com/kubernetes-engine/docs/release-notes#November_22_2023)
- Linuxカーネルの権限昇格の脆弱性(CVE-2023-5717)が見つかってContainer-Optimized OS, Ubuntu両方が影響を受けているよ

### Datastream: [Nov 22, 2023](https://cloud.google.com/datastream/docs/release-notes#November_22_2023)
- PostgreSQL向けの接続でクライアント証明書を利用しない場合はSSL/TLS接続ができるようになったよ！

### Confidential Computing: [Nov 22, 2023](https://cloud.google.com/confidential-computing/confidential-vm/docs/release-notes#November_22_2023)
- Confidential SpaceでSplit Trust Encryption Tool (STET)が使えるようになったよ！

### Sensitive Data Protection: [Nov 21, 2023](https://cloud.google.com/dlp/docs/release-notes#November_21_2023)
- BigQueryの行数に対して%で上限を設定している場合、設定よりも多くの行をスキャンする可能性があるので、ハードリミットを設定したい場合は行数で指定してね

### AlloyDB for PostgreSQL: [Nov 22, 2023](https://cloud.google.com/alloydb/docs/release-notes#November_22_2023)
- AlloyDB Auth Proxyクライアント1.5.0で2023/11中以前のインスタンスに接続できない不具合が見つかったよ
  - クライアント1.4.1を使うかDBのフラグを更新

### Application Integration: [Nov 23, 2023](https://cloud.google.com/application-integration/docs/release-notes#November_23_2023)
- [Hubspotトリガ](https://cloud.google.com/application-integration/docs/configure-hubspot-trigger)がプレビューになったよ！

### SAP: [Nov 27, 2023](https://cloud.google.com/solutions/sap/docs/release-notes#November_27_2023)
- SAP向けのGoogle Cloud Agentの新しいバージョンリリース

### Vertex AI: [Nov 24, 2023](https://cloud.google.com/vertex-ai/docs/release-notes#November_24_2023)
- インプットに対してトークンのリストを取得できるComputeToken APIがプレビューになったよ！

### Anthos Service Mesh: [Nov 27, 2023](https://cloud.google.com/service-mesh/docs/release-notes#November_27_2023)
- Managed Anthos Service Mesh:
  - 1.17がrapidチャネルに、1.16がstableチャネルにロールアウトされたよ！
  - Gateway API Automated Deploymentを利用している場合、将来的に1.18がrapidチャネルにロールアウトされた際にはpodのリスタートが不要になるよ！

### Batch: [Nov 27, 2023](https://cloud.google.com/batch/docs/release-notes#November_27_2023)
- リザーブしたVMでジョブを実行するためのドキュメントが追加sれたよ！

### Cloud Asset Inventory: [Nov 27, 2023](https://cloud.google.com/asset-inventory/docs/release-notes#November_27_2023)
- 新しいリソースタイプの追加

### Application Integration: [Nov 29, 2023](https://cloud.google.com/application-integration/docs/release-notes#November_23_2023)
- Database PersistenceがLocal loggingに名前が変わって、asyncモードがプレビューになったよ！
- me-central2で利用できるようになったよ！

### Anthos: [Nov 28, 2023](https://cloud.google.com/anthos/clusters/docs/bare-metal/latest/release-notes#November_28_2023)
- 1.16
  - 1.16.3リリース
    - kubernetes 1.27
    - メトリクス系の証明書のTTLが伸びたよ
    - 1.15~1.16.3までをselective worker node pool upgradeで利用できるようになったよ！
    - 複数の修正とCVE対応

### Migrate to Containers: [Nov 29, 2023](https://cloud.google.com/migrate/containers/docs/release-notes#November_29_2023)
- v.1.15.0:
  - 1.4.0リリース
    - 複数の改善とバグフィクス
    - websphere-traditionalプラグインがdeprecatedになったよ (12/2023まで利用可能)

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートは追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Kernel Samepage Mergin (KSM) ＠Proxmox で仮想基盤のメモリ使用量が3分の1になった！

Kernel Samepage Merging (KSM) は、Linux カーネルによって提供されるオプションのメモリ重複排除機能であり、Proxmox VE ではデフォルトで有効になっています。
同じOSが複数動いている仮想環境でメモリ使用量の最適化出来ます。

今回、ふとしたことからこの設定を変更して挙動を見ることが出来たのでメモしておきます。

# 環境
- Proxmox VE 8.1.3 x 3台のクラスタ （[ISOファイルのダウンロード](https://proxmox.classact.co.jp/trial/)）
  - メモリ128GB
  - 1ノードあたり、12GBのメモリを割り当てたWindows11の仮想マシンが7台

# 経緯
3台のProxmoxVEクラスタで同じ量のVMを動かしているのに、1台だけメモリ容量が少なくて『なんでだろ？』と思っていました。
ある時ノードのサマリ画面で`KSM sharing`がメモリ使用量の少ないノードだけ40GB程になっており、他の2台は0GBでした。

![proxmox_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/29509610-0142-40c8-c23d-e6e045d4d217.png)

『同じ設定のはずなのにKSMの状況が違う？』と思い調べてみることにしました。


# やってみたこと
- まずは実際にKSMが有効かどうかを調べることにしました。
  ```bash
  cat /sys/kernel/mm/ksm/run
  ```
  ※出力が 1 ならば、KSMは有効になっています。0 の場合は無効です。

  ★結果、状況が示す通り、1台は1、他2台は0でした。

- Proxmoxのフォーラムを検索すると[ジャストな話題](https://forum.proxmox.com/threads/ksm-keeps-disabling.111758/)が！
どうやら`/etc/ksmtuned.conf`の設定値`KSM_THRES_COEF=20`によってKSMが動作の開始タイミングが変わるようです。
- フリーメモリがこの割合以下になった場合にKSMが動作を開始するための閾値です。デフォルトは20％です。`KSM_SLEEP_MSEC`と`KSM_NPAGES_MAX`も合わせて以下のように設定しました。
  - `KSM_THRES_COEF=99`
    - 上記の通り、フリーメモリがこの割合以下になった場合にKSMが動作を開始するための閾値。Default 20　→　99
  - `KSM_SLEEP_MSEC=50`
    - KSMスキャン間のスリープ時間。大きいサーバでは短くすることが推奨らしい。Default 100　→　50
  - `KSM_NPAGES_MAX=1250`
    - KSMによってスキャンされるページ数の最大値。Default 1250　→　5000
    ```bash
    vim /etc/ksmtuned.conf
        KSM_THRES_COEF=99
        KSM_SLEEP_MSEC=50
        KSM_NPAGES_MAX=1250
    ```
- 上記のように`/etc/ksmtuned.conf`を書き換えたら`ksmtuned`サービスを再起動します。
  ```bash
  systemctl restart ksmtuned
  ```
- KSMが有効かどうかを確認します。
  ```bash
  cat /sys/kernel/mm/ksm/run
  1　　※有効になっていることが確認できた
  ```
- 少し待っていたらみるみる`KSM sharing`の値が増え、メモリ使用量が減っていきました。
メモリ使用率65%程だったものが20%程まで圧縮され、心躍りました！！
![proxmoxve_memory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/f5a6a98c-b425-853c-19ba-55ca5ae8cf0e.png)

# 注意点
以下ProxmoxのWikiより

---
KSM はメモリ使用量を削減できますが、VM をサイドチャネル攻撃にさらす可能性があるため、セキュリティ リスクも伴います。調査によると、KSM の特定の特性を利用することで、同じホスト上の 2 番目の VM を介して、実行中の VM に関する情報を推測できることがわかっています。

したがって、Proxmox VE を使用してホスティング サービスを提供している場合は、ユーザーに追加のセキュリティを提供するために、KSM を無効にすることを検討する必要があります。さらに、KSM の無効化が法的要件となっている場合があるため、国の規制を確認する必要があります。

---

しかし、、リスクの少ない環境であれば、
沢山の同じOSのVMを稼働させる時に、この効率化はめちゃめちゃ魅力的だと思いました！
第一世代　カプラに使うACアダプタを変更する

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の2日目です。

1日目にバッテリーをカプラーに改造しました。AC電源に市販の可変式直流電源を使用していましたが、aiboを入手したときにACアダプタがついていたことを思い出しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/32664ea3-4e86-fd25-3d24-0b2334cc1fa1.png)


魔改造は元の素材を可能な限り使いまわすことが重要だと個人的には考えているので、電源に同梱されていたACアダプタの流用を検討しました。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 部品調達
ACアダプタのコネクタと電圧調整のためのステップダウンコンバータが必要です。

##### ジャック
プラグの寸法を測ったところ、6.5/4.4mmというサイズのようです。
ネット検索したところEIAJという規格の近いサイズがEIAJ電圧区分5（EIAJ#5)の場合は定格18Vとあり、1.5V超過していました。
仕方ないので、ノートパソコン用と謳っていた同サイズのジャックを購入しました。
https://ja.aliexpress.com/item/1005001936315183.html

##### ステップダウンコンバータ
1日目の実験で安定動作のために3Aは必要なようなので、仕様が近い適当な大きさのコンバータを購入しました。
これによって19.5Vを7.5Vに変換することができます。
https://ja.aliexpress.com/item/1005004711759481.html

#### 動作確認
写真を撮り忘れてしまったのですが、1日目の結果と同様、動作することを確認できました。