OmniAICreator/Qiita-1.07M huggingface dataset:
[Rust]main関数と変数の定義


## `main`関数

Rustファイル（`.rs`）を実行する際はエントリーポイントとなる`main`関数が必要です。

```rust
// ファイルの中にmainという関数が必要
fn main() {
  let msg = "Hello, world!";
  println!("{}", msg);
}
```

Cargoプロジェクトの場合、`src/main.ts`に`main`関数が無い状態で`cargo run`を実行すると以下のエラーメッセージが出ます。

```
error[E0601]: `main` function not found in crate `qiita_sample`
```

:::note
TypeScriptのファイルはどの関数からでも開始できます。

```ts:TypeScript
// 直に書いてもいいし・・・
const msg = "Hello, world!";
console.log(msg);

// 好きな関数名で定義してもいい
const hello = () => {
    const msg = "Hello, world!";
    console.log(msg);
}
hello();
```

```bash
# どちらにしてもファイル名だけ指定すれば動く
node index.ts
```
:::


## 変数の宣言

変数の宣言は`let`で行います。この方法で宣言した変数はimmutable（不変）です。

```rust
let x = 5; // 不変の変数
println!("The value of x is: {}", x);
```

後から変数を変更したい場合は`let mut`のように`mut`を付与します。

```rust
let mut y = 5; // 可変の変数
println!("The initial value of y is: {}", y);
y = 10; // 値を変更
println!("The new value of y is: {}", y);
```

:::note warn
TypeScriptでいうletは可変性がある（再代入が可能）ことに注意してください。
また、TypeScriptでは`const`を使って宣言しても代入以外での変更自体は可能でした（例：配列の`.push`）。

```ts
const arr = [1, 2, 3];
arr.push(4); // 配列に値を追加
console.log(arr); // [1, 2, 3, 4]
```

Rustにおけるimmutableはそれも不可能になるので注意しましょう。Rustにおける不変性はメモリ内部の値そのものが不変であることを意味します。
:::

Rustは静的型付け言語なので、各変数は型を持ちます。
基本的には型推論（宣言時の初期値から型を自動で割り当ててくれる）してくれますが、明示的に指定したい場合は`let <変数名>: <型名> = <初期値>;`の形を取ります。

```rust
let z: i32 = 42; // 明示的に型を指定
println!("The value of z is: {}", z);
```

:::note
ここの書き味はTypeScript（を含めた他の静的型付け言語）と似ていますね。
:::

## 型

Rustに用意されているいくつかの型を紹介します。

- `i8`, `i16`, `i32`, `i64`, `i128`: 符号付き整数
- `u8`, `u16`, `u32`, `u64`, `u128`: 符号なし整数
- `f32`, `f64`: 浮動小数点数
- `bool`: 真偽値
- `char`: 文字
- `&str`: 文字列スライス
- `String`: 可変長の文字列

:::note
TypeScriptでは数値を扱う場合は単に`number`とすることがほとんどでしたが、Rustでは性能とメモリの効率を考慮してサイズを詳細に指定できます。
:::

`char`は「文字」を表現するのであって、「文字列」を表現するのではないことに注意してください。文字列を表現したい場合は`&str`か`String`を使用します。

### `&str`

文字列を表現するプリミティブ型になります。どこかしらの領域に存在する文字列へのポインタなので`&`がついています（Rustでは`&`をつけるとポインタになります）。厳密に言えば、これはUTF-8のスライス（後日の記事で解説）になります。そのため、参照先が変更されるとこちらも変更の影響を受けます。

```rust
fn main() {
    let greeting: &str = "Hello, world!";
    println!("{}", greeting);
}
```

### `String`

`&str`が不変なスライス型であったのに対し、`String`型は文字列を格納するための可変な所有型であり、文字列の長さや内容を変更できます。`String`の中身はUTF-8の`Vec`になります（後日の記事で解説）。`String`を生成する際は通常、`String::from`メソッドや`to_string`メソッドを使用します。

```rust
fn main() {
    let mut greeting = String::from("Hello");
    greeting.push_str(", world!"); // 文字列に追加
    println!("{}", greeting);
}
```

### 相互変換

`&str`と`String`は相互に型変換が可能です。

```rust
fn main() {
    let static_str: &str = "I'm a &str";
    let string_obj: String = String::from(static_str);

    let slice_from_string: &str = &string_obj;
    println!("{} and {}", string_obj, slice_from_string);
}
```

:::note
正直筆者はこのあたりの文字列の仕様を理解しきれていません。`&str`が厳密な文字列への参照なのに対し、`String`が柔軟な文字列型である、という認識程度です。
気をつけなければいけないのが、`std::str`や`std::string`といった標準ライブラリが提供する関数が、元の文字列を操作したうえでオリジナルの参照を返すのか、新しくメモリ領域を確保して新しい参照を返すのかをきちんと把握するということです。

そう考えると、パフォーマンスはともかく無邪気に`string`を使えていたTypeScriptは考えることが少なくてサクッと書けたなぁという感想です。
:::


## 所有権やライフタイムについて

Rustの変数には「所有権」や「ライフタイム」といった独自の仕組みがあります。これらは（個人的には）非常にややこしいですが、こういう機構があるからこそ、Rustの高パフォーマンス性が実現できています（そのはず）。これらについてもこのアドベントカレンダーで順を追って取り上げていきます。
Ruby on Railsのデータベース関連のまとめ

テーブルやカラム作成やカラム追加、カラム削除、データ型変更について書いておきます。
変更に伴い、カラムのデータ型の確認やデータ削除などの付随作業も書いておきます。
仕様　Ruby on Rails　SQLite3 Ubuntu

# １.テーブル作成
## 1.1 命名規則

### 命名規則(テーブル名、カラム名共通)
* 大文字を利用しない
* ローマ字ではなく英語を使用する
* 複数の単語を使う場合は＿でつなげる。(hoge_example)
* 略語は使用しない(後々、何かわからなくなるため)

### 命名規則(テーブル名)
* 複数形を使う。(~s)
* 複数の単語を使う場合も、複数形を使用する。(hoges_examples)

### 命名規則(カラム名)
* ステータス(格納するデータ)を表す
* flgなどの略語を使用しない
* DATE型のカラムには名前を「受動態_on」(closed_on)
* TIMESTAMP型のカラムには名前を「受動態_at」(create_at)

## 1.2　データ型について
* string : 文字列
* text : 長い文字列
* integer : 整数
* float : 浮動小数
* decimal : 精度の高い小数
* datetime : 日時
* timestamp : タイムスタンプ
* time : 時間(年、月、日は変更できないデフォルト値)
* date : 日付
* binary : バイナリデータ(0,1)
* boolean : Boolean(true,false)

## 1.3 コマンド入力
ターミナルにて下記コマンドを入力。
```.console
rails g model User user_id:integer
```
rails g model テーブル名　カラム名:データ型
※モデル名は必ず最初を大文字にして、単数形にすること。
## 1.4 ファイル確認
db/migrate/作成日時_create_テーブル名.rb
```Ruby
def change
    create_table :user do |t|
      t.integer :user_id

      t.timestamps
    end
  end
```
 t.データ型　:カラム名
自動的に入力されるがされない場合もあるので注意。
## 1.5 コマンド入力
ターミナルにて下記コマンドを入力。
```
rails db:migrate
```
これでテーブルが作成が反映されました。

# 2 テーブル削除

## 2.1コマンド入力
ターミナルにて下記コマンドを入力。
```
rails d model User
```
rails d model テーブル名

## 2.2 コマンド入力
ターミナルにて下記コマンドを入力。
```
rails db:migrate
```
これでテーブルが削除を反映。

# 3 カラム追加
## 3.1　コマンド入力
ターミナルにて下記コマンドを入力。
```
rails g migration AddUser_idColumnsToUsers user_id:integer
```
rails g migration Add追加するカラム名ColunmsToテーブル名　カラム名:データ型
## 3.2 ファイル確認
db/migrate/作成日時_add_user_id_colunms_to_usres
```ruby
def change
    add_column :users, :user_id, :integer
end
```
add_column :テーブル名, :カラム名, :データ型

##  3.3コマンド入力
ターミナルにて下記コマンドを入力。
```
rails db:migrate
```
これでカラムの追加を反映。

# 4 カラムのデータ型確認

## 4.1 コマンド入力(データ型の確認)
ターミナルで下記コマンドを入力。
```
rails c
```
railsコンソールに入る。
```consolo
app(dev)>User.columns_hash['user_id'].type
=> :integer
```
=>:データ型
これで確認できます。
# 5 データ型の変更
## 5.1 コマンド入力
ターミナルで下記コマンドを入力。
```
rails g migration ChangeUserIdToStringInUsers
```
rails g migration Changeカラム名Toデータ型Inテーブル名

## 5.2 ファイル確認
db/migrate/作成日時_ChangeUserIdToStringInUsers
```Ruby
def change
    change_column :users, :user_id, :string
end
```
change_column :テーブル名, :カラム名, :変更後データ型

##  5.3 コマンド入力
ターミナルにて下記コマンドを入力。
```
rails db:migrate
```
これでカラムのデータ型の変更を反映。

# 参考元
https://qiita.com/genzouw/items/35022fa96c120e67c637


https://qiita.com/s_tatsuki/items/900d662a905c7e36b3d4
Denodo Platform 8から9へのメジャーアップデートの作業を検討してみた。

# Denodo 9.xが登場しました

Denodo 8が登場してからDenodo 9.0のメジャーアップデートまで比較的期間が長かったので、初めてメジャーアップデートをすることになるユーザが多いのかなと思います。Denodo Technologyが公開している記事を調査してメジャーアップデートを検討したので、これを記事とします。すごく簡単な記事ですが…。
なお、私はLinux環境で構築ばかりなのでWindowsサーバでの構築だと考慮するところが変わるかもしれません。

参考にしたのは公式のこちらのドキュメント：
Introduction to Upgrading
https://community.denodo.com/docs/html/browse/9.1/en/platform/upgrade/introduction_to_upgrading

そもそもDenodoってなんぞや？データ仮想化ってなんぞや？という方は過去に弊社メンバーが書いている以下の記事を参照ください。
https://qiita.com/k_tym/items/d2bd2f59cdde269cd423

## メジャーアップデートの方法を3行で書くと

① 新規でDenodo 9.x環境を構築する。最新版までアップデートすること
② Denodo 8環境を最新版までアップデートしてからメタデータをエクスポートしてDenodo 9.xにインポートする
③ いろいろ設定しろ！キャッシュとかライセンスとか

こんな感じです。
新規でサーバから構築することがDenodo公式の推奨構成です。
これができない場合は既存のサーバのインストール先ディレクトリを変えてインストールすることもできると記載されています。この場合は同時起動する場合にリッスンするポートが重複するので注意とのこと。
半日メンテナンスタイム取れるなら同じサーバにインストールしたいですよね。
ミッションクリティカル的に使っていると公式の推奨構成がよさそうです。

## 通信要件

ドキュメントを確認した範囲では1つ減っているくらいなので、AWSでSGとかを追加で空ける必要はなさそうでした。今導入している環境では通信要件をガチガチに固める必要があるのでこれは助かります。でも机上でしか検証してないので、やっぱり検証必要ですよね。
以下のドキュメントで確認とりました。
### Denodo8.0 Default Ports Used by the Denodo Platform Modules
https://community.denodo.com/docs/html/browse/8.0/en/platform/installation/appendix/default_ports_used_by_the_denodo_platform_modules/default_ports_used_by_the_denodo_platform_modules
### Denodo9.1 Default Ports Used by the Denodo Platform Modules
https://community.denodo.com/docs/html/browse/9.1/en/platform/administration/default_ports_used_by_the_denodo_platform_modules/default_ports_used_by_the_denodo_platform_modules

## 実施手順

方針はわかるとしても細かいところをさらに検討する必要がありそうですね…。実施するならこんな感じかなというのを記載します。順序とかはもう少し詰めたほうがいいところがあるかもしれません。
商用でダウンタイム短くしたいので…とかあると細かい検討が入ると思います。

### ①新規でDenodo 9.x環境を構築する。最新版までアップデートすること
1. Denodo8環境に最新版までDenodoをアップデートして正常性確認（簡単な動作とエラーメッセージが出ない程度は確認）
2. Denodo8環境でメタデータをエクスポート
3. Denodo8環境のDenodoサービスを停止
新規でDenodo９構築している場合で可能であればサーバも止めてしまう。オンプレの場合はIPアドレス、ホスト名そのままにしたい場合が多いのではないかと思うのでこちらが無難か。hostsで名前解決していれば仮のIPアドレスでDenodo一旦動作するところまで確認してからDenodo 8環境をシャットダウンして切り替えがよさそうですね。

### ② Denodo 8環境を最新版までアップデートしてからメタデータをエクスポートしてDenodo 9.xにインポートする
4. Denodo9.x環境を構築して最新版までアップデートして起動。正常性確認する
6. （新規構築の場合は）Denodo9.x環境のIPアドレス、ホスト名を本番用にする。以降の作業はDenodo9.x環境の作業
7. サービス起動、正常動作確認
8. ライセンス本番適用確認
9. メタデータインポート 9.x環境
### ③ いろいろ設定しろ！キャッシュとかライセンスとか
10. データソース疎通確認
11. ビュー参照確認（最低でも各データソースごと）
12. スケジューラ・キャッシュサーバ動作確認
※③が多少前後しましたね…。

## Denodo 8 EOL
EOLはこちらを参照してください。
思ったよりもEOL近いんですよね…。
https://support.denodo.com/doc/denodo_support_guide.pdf
End of General Support Date:Jun 2026
End of Extended Support Date:Jun 2027

## まとめ
そろそろ作業量の見積もりしたくてこんな感じの調査結果をまとめてみました。
国内のSIerだと設定パラメータがっちり固めてとか、サーバ新規で作るのがとってもメンドクサイことが多いので圧倒的に同じサーバで別ディレクトリにインストールするほうに持っていきたいですね。
デメリットがポート番号重複以外に何があるのかはもう少し明確だといいのですが…。検証するしかないかな。

本格的にアップデートに取り組む際はDenodoのサポートにアドバイザリを依頼することをお勧めします。
Qiita記事はDenodo Japanの人がたまに見てくれるようなので記載に問題あればコメントお待ちしております。
refine、using メソッド

# refine、usingを使うと独自の変更の有効範囲（スコープ）を限定することができます
```rb
irb(main):001* module SpringShuffle
irb(main):002*   refine String do # refineメソッドを使ってrefinementsを適用するクラスを指定する
irb(main):003*     def shuffle
irb(main):004*       chars.shuffle.join
irb(main):005*     end
irb(main):006*   end
irb(main):007> end
=> #<refinement:String@SpringShuffle>
```
### userクラスのインスタンスが使うとエラーになる
```rb
irb(main):018* class User
irb(main):019*   using SpringShuffle # usingメソッドでrefinementsを有効にする
irb(main):020*
irb(main):021*   def initialize(name)
irb(main):022*     @name = name
irb(main):023*   end
irb(main):024*
irb(main):025*   def shuffled_name
irb(main):026*     @name.shuffle
irb(main):027*   end
irb(main):028> end
=> :shuffled_name
irb(main):029> user = User.new('Alice')
=> #<User:0x00000001094f83c8 @name="Alice">
irb(main):030> user.shuffled_name
=> "Aielc"
irb(main):031> 'Alice'.shuffle
(irb):31:in `<main>': undefined method `shuffle' for "Alice":String (NoMethodError)
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

# using以降だと使える
```rb
irb(main):001* module StringShuffle
irb(main):002*   refine String do
irb(main):003*     def shuffle
irb(main):004*       chars.shuffle.join
irb(main):005*     end
irb(main):006*   end
irb(main):007> end
=> #<refinement:String@StringShuffle>
irb(main):008> puts 'Alice'.shuffle
(irb):8:in <main>': undefined method `shuffle' for "Alice":String (NoMethodError)

puts 'Alice'.shuffle

irb(main):009> using StringShuffle
=> main
irb(main):010> puts 'Alice'.shuffle
ceAli
=> nil
```
# モジュールのメソッドを使うクラスを指定する
```rb
irb(main):008* module InterHello
irb(main):009*   refine Integer do
irb(main):010*     def hello
irb(main):011*       "hello"
irb(main):012*     end
irb(main):013*   end
irb(main):014> end
=> #<refinement:Integer@InterHello>
irb(main):015> 1.hello
(irb):15:in <main>': undefined method `hello' for 1:Integer (NoMethodError)

1.hello

irb(main):016> "1".hello
(irb):16:in <main>': undefined method `hello' for "1":String (NoMethodError)

"1".hello
   ^^^^^^

irb(main):017> using InterHello
=> main
irb(main):018> "1".hello
(irb):18:in <main>': undefined method `hello' for "1":String (NoMethodError)

"1".hello
   ^^^^^^

irb(main):019> 1.hello
=> "hello"
```
# 感想
refineで呼び出すクラスを指定して、usingでモジュールのメソッドの使用を許可する
Fedora Asahi Remix いれてみた

# はじめに

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

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

# 筆者について

現在高校3年生
（元）水泳部マネージャー
（元）生徒会長
（元）とある団体の代表

# 本編

皆さんはだいぶ前に有名になりましたAsahi Linuxというのを覚えてらっしゃるでしょうか？

https://asahilinux.org/fedora/

これですね、いつのまにかFedoraのRemixになっておりまして、Fedoraと同じようにDNFとかが使えるようになっていましたので、こちらめちゃめちゃ利用が便利になっています。

# デスクトップはGnomeかKDEか（もちろん他も可）

あんまり知らなかったんですけど、いつのまにかFedoraのデフォルトデスクトップ環境はKDEになっていたんですね。

https://gihyo.jp/article/2024/04/daily-linux-240405

ただ、個人的にKDEはあんまり好きじゃないです。いくつか理由があるのですが…。

- KDEがどうしてもWindowsのパクリに見えてしまってLinux感がない
- 自分にとってはLinux = UbuntuでUbuntuはGnomeを使っていた
- Gnomeの方がモダン感があると思っている

ということで、これらの理由からKDEはあんまり好きじゃないというかGnomeが好きだったので、Gnomeをインストールしました。

# インストール

以下をターミナルで実行するだけです

```bash
curl https://alx.sh | sh
```

とても簡単ですね！
ただ、いくつか問題にぶちあたりましたので共有しておきたいと思います。

## パーティションを分割できない

パーティションを分割できませんでした。どうやら以下の記事と同じようなものだったと記憶しています。

https://qiita.com/ueniki/items/3389c8820e1d63b1397d

ということで色々解決する策をしました。（First Aid、手動、など）しかし、どれもこれもうまくいきませんでした。最終的に僕がやった苦肉の策は、ディスクの全消去でした。これ、本当に１日がかりでは終わらなくてかれこれ完全に復旧するのに２週間近くかかったと記憶しています。まずMacのSSDをディスクユーテリティーから完全に消去して、クリーンインストールしなおした状態からすぐにAsahi Linuxをインストール、という流れです

https://support.apple.com/ja-jp/guide/mac-help/mchl7676b710/15.0/mac/15.0

苦肉の策でした、仕方ないですね。これでパーティションを分割することができました。

## Asahi のアップデート後に起動できなくなった

僕の場合はinitramfsがないと言われました。要は設定に失敗してたんですよね。ということで、grubのメニューから古いものを指定して起動し、initramfsの再構成をしました。

https://discussion.fedoraproject.org/t/initramfs-not-found/73065

## ChromiumやVSCodeの画質が荒い

これはどうやらXWaylandが原因らしいですね。ということで、Waylandで起動できるようにしたらいいです。ただここで問題なのはFctixと相性が悪いこと。この設定の回避は以下を参考。

https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland

## Apple Music Web/TVerとかが見れない

これはWidevineが入っていないのが原因です。Widevineのインストール方法は（一応リンク貼っておきます。）

```bash
sudo dnf install widevine-installer

sudo widevine-installer
```

# 最後に

今回はFedoraのインストールをしてみました。次回は、最近話題のあのデスクトップ環境をインストールしてみたいと思います。
Qiita Advent Calendar 2024 投稿記事一覧

# Qiita Advent Calendar 2024 に今年も参加するぞ！
こんにちは、テラりんです。
さて、今年も今年とて、Advent Calendarは完走賞を狙って「個人的なまとめ Advent Calendar 2024」というカレンダーに毎日投稿していこうと考えています。（去年よりネタも少なかったりするので期間中に新しいこと色々チャレンジしていきたいと思います）

https://qiita.com/advent-calendar/2024/0_terarin_0-individualrun-24

その記事一覧を毎日以下に追加していきますので、全ての記事にご一読いただけると幸いです。

## 学校の文化祭で進行状況を表示したかった話

投稿日：12/01・1日目

https://qiita.com/0_terarin_0/items/28fe900d0110f2b79340

## Fedora Asahi Remix いれてみた

投稿日：12/01・2日目

https://qiita.com/0_terarin_0/items/44c446f09f682b57227b
OpenAI APIキーをKaggle Notebook上で安全に使う方法



# 0. 事前準備
- Kaggle Notebookの取り扱いに習熟していること
- OpenAI APIキーを取得していること（参考：[OpenAI APIの使い方講座【公式Quickstart】](https://qiita.com/Isaka-code/items/b50983796636503b44c5)）

:::note warn
- APIキーは、流出厳禁です。APIキーが表示されている状態では、間違ってもKaggle Notebookを公開しないようにしましょう。
:::


# 1. Kaggle Notebookを立ち上げる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/c4974aad-a797-fa8b-570b-a95c17ba2ea2.png)


# 2. 左上のメニューから、`Add-ons` > `Secrets` をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/1ed4cdf4-3ce5-9e56-99fe-267b9a4ef816.png)



# 3. 右側にバーが出現したことを確認し、バー下部の`Add Secret`をクリック

※すでに私は`OPENAI_API_KEY`を設定済みなので表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/25ce52c5-dc6e-c6d4-4cda-ecbd36e2b515.png)

# 4. `LABEL`に`OPENAI_API_KEY`、`VALUE`にOpenAI APIキーの値を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/6845eb72-10aa-857a-e890-fa0ed456ed4c.png)

# 5. `OPENAI_API_KEY`のチェックボックスがチェック済みであることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/d6e3b5b3-52f4-c0cb-9b83-17a0fe235fff.png)

# 6. `Code Snippet`をコピー（`Copy to clipboard`をクリック）し、Kaggle Notebookに貼り付ける

```python
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
secret_value_0 = user_secrets.get_secret("OPENAI_API_KEY")
```


:::note warn
- OpenAI APIキーを使用する場合は、`Internet on`が有効になっている必要があります。ソリューション提出時には使用することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/f772ff3e-1873-b339-3931-ae953592cb53.png)
:::

以上の手順により、OpenAI APIキーをKaggle Notebook上で安全に使うことができます。
Amazon EBS、新CloudWatchメトリクス「VolumeAvgReadLatency」「VolumeAvgWriteLatency」を提供開始

# 概要
EBSボリュームの平均読み取り・書き込みレイテンシを監視し、ボトルネック特定やパフォーマンス改善が可能

- VolumeAvgReadLatency
- VolumeAvgWriteLatency 

CloudWatchでダッシュボード作成や通知・アラーム設定が可能
追加料金なし、全AWSリージョンで利用可能
メトリクスが取れるのは [Nitro インスタンス](https://docs.aws.amazon.com/ja_jp/ec2/latest/instancetypes/ec2-nitro-instances.html) のみである点に注意（一敗）

## VolumeAvgReadLatency
Amazon EC2インスタンス接続EBSボリュームの平均レイテンシを計測
Multi-AttachボリュームはInstanceIDディメンションで特定可能
Nitroインスタンス対応、ECS・Fargateは対象外

## VolumeAvgWriteLatency
Amazon EC2インスタンス接続EBSボリュームの平均レイテンシを計測
Multi-AttachボリュームはInstanceIDディメンションで特定可能
Nitroインスタンス対応、ECS・Fargateは対象外

# 負荷かけて検証
負荷かけます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/b123459f-e5f8-55ec-3e27-f707d5abe6a5.png)
負荷かけてWriteのみ増加していることが無事確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/73925513-0a5a-8d2a-81fa-af9388af1058.png)
StreamSets（ストリームセット）についての簡単な説明

# この記事について
- この記事は[IBMが提供する製品に関する情報やナレッジを共有する Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ibm_data_ai_automation)の12月6日分として記載しています。

![スクリーンショット 2024-12-05 13.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/793c48b4-338f-5786-37b0-193d243209e7.png)


# StreamSets（ストリームセット） について

- StreamSets は、ストリーミングデータによるデータパイプラインを構築するために使用できるソフトウェアです
- 管理画面はSaaSまたはCP4Dにて提供されており、データ処理するソフトウェア部分は個別のサーバにインストールする形式を取っています

- 以下、動画を作成しましたので、ひとまず最初の1分だけでも見ていただけますと幸いです。
- https://video.ibm.com/recorded/134196927

--
- [オンラインドキュメント](https://docs.streamsets.com/portal/platform-controlhub/index.html)
- [コミュニティサイト](https://community.streamsets.com/)

- [IBMによるStreamSets買収のニュース（2024年7月）](https://jp.newsroom.ibm.com/2024-07-09-IBM-Completes-Acquisition-of-StreamSets-and-webMethods,-Bolstering-its-Automation,-Data-and-AI-Portfolios)


# デモの説明

- 以下がデモ用のStreamSetsのストリーミングデータのパイプラインの画面です
![スクリーンショット 2024-12-05 13.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/793c48b4-338f-5786-37b0-193d243209e7.png)

- デモ画面に出ているアイコンの意味は、以下のとおりです

1. データソース（kafka）
1. リスクスコアリングサービス
1. リスクスコアのフォーマット
1. IBM Cloud Object Storage
1. ハイリスクスコアの選択
1. 低リスクスコアデータの破棄
1. 分析用DBとしてのPostgreSQL

---

- このデモの流れとしては、以下の通りです
1. データソース（kafka）からデータがストリーミング配信されます
1. リスクスコアリングサービスにより、リスクスコアが付与されます
1. 2.で付与されたリスクスコアのうち、不要な項目を削除します
1. S3互換のオブジェクトストレージに全量をファイル（parquet形式）として保管しバックアップします
1. 予め設定されている閾値により、ハイリスクスコアとそれ以外を分けます
1. ハイリスクでないスコアのデータを破棄します
1. ハイリスクなデータを分析用DB（PostgreSQL）に突っ込みます

---

- 上記のようなストリーミングデータのパイプラインを構築することで、データ分析者は7.の分析用DBにてハイリスクなデータについてタイムリーに分析することが可能となります
---
- 安価なオブジェクトストレージにファイル形式で全量データを保管しておくことで、なにかあった時の為に別途分析することも可能です
---
- 以下のようにデータの件数やスループット、各処理箇所での処理時間なども確認できます

- 各処理部分での処理時間の比率
![スクリーンショット 2024-12-05 16.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/78dad05b-f704-257b-7c10-9bd196d3b3ed.png)

--- 
- 各データ経路でのデータの流量

![スクリーンショット 2024-12-05 16.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5a49d23b-6254-2686-7bb8-a05b1b93ce16.png)
ITの資格を取るとこんな良いことが起こる！個人と会社のメリットを紹介

資格を学習・取得した際に感じたメリットを実務視点を通して私が体感した順にご紹介します。漠然と目指すのではなく、明確な目的と得られる報酬を把握することでモチベーション向上になれば幸いです。

# 個人と会社のメリット(AIによる要約)
・(個人) スキルの証明や体系的な知識習得が可能。
・(個人) キャリアアップや昇進、給与アップにつながる。
・(個人) 過去の経験を振り返り改善点を見つけられる。
・(会社) ベンダーとの関係強化やプロジェクト受注競争力の向上。
・(会社) 社員育成、チーム強化、企業ブランドの向上に寄与する。


# 資格を取るとこんな良いことが起こる(個人編)
**・専門スキルの証明**
資格取得の一番のメリットです。
どんなプロジェクト経験や勤続年数があっても、実際のスキルと比例するかといわれると判断は難しい部分です。しかし対応する資格を取得することで、ある程度のスキルセットを機関が証明するため明確なアピールになります。またグローバルなベンダー（Microsoft・AWSなど)であれば、世界で同じ資格制度のため転職での優位性も国内外問わず有効でしょう。

**・スキルの体系的な習得**
資格を取得した結果だけでなく、取得までのプロセスもメリットです。
資格取得をする上で学習は避けられず、短期間に体系的な知識をインプットしたい際に有効です。エンジニアだけでなく営業やマネージャーといったロールでも、技術やツールの存在と使い方を知っておいていざという時にすぐ刀を抜けるように準備しておくことが大事です。そういった知識の差がスムーズなプロジェクト推進や細かい配慮に顧客打合せの際に光るのだと思います。

**・経験の見つめ直し**
プロジェクト経験で得た知識を反省・強化します。
過去のプロジェクト経験が製品ベンダーの考えるベストプラクティスに沿っているかや、イレギュラーな使い方で慣れてしまっていないかを学習を通して客観的視点から見つめ直すことにも役立ちます。初めて取り扱った製品の知識振り返りとしても非常に有用です。

**・昇進・給与アップ・インセンティブ付与**
頑張って成果を出したら、ご褒美を期待しましょう。
難関資格を取得した際や1年間のMBO(目標設定)で指定した資格を取得した際には、間違いなく昇進・給与アップ査定の材料として非常に効果的な要素となります。普段のプロジェクトはチーム成果ですが、資格は完全に個人成果になりますので他者と差をつけやすい要素なのが特徴です。

# 資格を取るとこんな良いことが起こる(会社編)
**・製品ベンダーとのアライアンス強化**
最も大事にすべきパイプラインを強化します。
ベンダー（Microsoft・AWSなど)の製品を取り扱う以上、ベンダーとは強固なつながりを持っておくことが成功のカギといえます。ベンダーから案件の引き合いや各種セミナーの共催など自社に有利に働く要素をより多く流してもらうためのアピール素材として使用できます。
Microsoftを例にすると、特に特定の分野の深い知識・技術を持つことを示すAdvanced Specialization制度には特定のMCP（Microsoft認定資格）保有数が基準に達していることを求められています。
https://partner.microsoft.com/ja-jp/partnership/specialization

**・プロジェクト受注競争力の向上**
受注競争に優位を保ち続けましょう。
資格保有者がいる企業は競争で有利に立てます。特に公共事業や大規模案件などでは、技術力を証明する資格保持者の人数が評価基準になることがあります。またコストやスケジュールなど提案で他社と差をつけることが難しい場合に、企業の技術力や専門性の高さを客観的な基準でアピールすることができます。

**・人材育成・チーム強化** 
プロセスと成果を共有して良い雰囲気を伝播させます。
資格を持つ社員が中心となり他の社員へのトレーニングや技術共有を行うことで、チーム全体のスキル向上や資格取得への動機づけに繋がります。優秀な人材がいる組織としての力を蓄えることができます。

**・企業ブランディングの強化**
優秀な人材がいる企業はそれだけで魅力です。
資格保有者を抱えることは「技術者を育成し最新技術を取り入れる企業」としてのイメージアップに貢献します。エンジニアにとって技術的な学びを支援する文化は非常に重要視されており、同程度の資格を持った優秀な人材自ら興味をもって応募してくるといった好循環を生みやすくなります。結果的に資格取得は採用コストの圧縮にも陰ながら貢献していると考えることができます。

# まとめ
ここまでメリットを理解したら、是非資格取得に挑戦してみてください。
たとえ失敗してもそのプロセスは無駄ではなく、むしろスキルの体系的な習得と現在の理解度を図ることができたと考えると同時に、本気でチャレンジしたことを誇りに思うべきです。
また、組織でもこのチャレンジを称賛し合う雰囲気を作り、取得した成果は評価に繋げて、個人の力から組織力強化を目指すことが大事と考えます。

以上、資格を取ることで起こる個人と会社のメリットのご紹介でした。

（余談）
もし「何から勉強して良いかわからない…」「どんな試験体系かわからない…」など具体的な資格取得のプロセスにお悩みの方は、私の出している別の記事で少しご紹介していますので是非参考までにご覧ください。
https://qiita.com/tipsfromhiroya/items/ac6a3cffd0413ed92212
カリキュラムは「体験＋座学」で取り組める「いいお題」を考える

## はじめに

技術を学ぶとき、知識だけでなく実際に手を動かして体験することが重要です。
VPSを用いた実習形式のカリキュラムについて紹介します。
目的は、「体験と座学を組み合わせることで、実践力を養う」ことです。

## お題
2024年度は、ネットワーク周りの解像度を高める目的でこのようなお題を出しました。

**「VPSに自分のホームページを作成して公開する」**  

## お題に含まれる実習内容の概要  

おおまかに、以下のステップを通じて学びを深めていくことができます。  

1. VPSをレンタルする
VPSを選ぶ際、事前に便利な設定が施されていない「素のサーバー」を選びます。
例えば、ファイアウォールの設定やSSL証明書の自動インストールが最初から有効になっているものは避けましょう。初期設定を自分で行うことで、セキュリティの基本や設定の仕組みを理解するきっかけになります。  

2. サーバーの初期設定を行う
   - SSH接続を確立します。この際、認証方式として公開鍵認証を採用し、秘密鍵の強度を高める重要性を学びます。  
   - root権限ではなく一般ユーザー権限を利用する理由についても理解します。  
   - ファイアウォールを有効化し、必要なポートのみを開ける設定を行います。加えて、パスワードログインの禁止など、基本的なセキュリティ対策を施します。  

3. HTTPサーバーの構築と公開
   - HTTPサーバーをインストールし、設定を行います。  
   - ローカルで作成したHTMLファイルをサーバーにアップロードし、自分のページを公開します。  
   - HTTPS接続を有効にするため、SSL証明書の取得と設定を行います。  
   - 独自ドメインを取得し、DNS設定を行います。  

## 座学との連動  

実習を進める中で、「なぜその手順を行うのか」「どうしてこの設定が必要なのか」を書籍から学びます。
たとえば以下の書籍が役立ちました。
- 『[ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識](https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84TCP-IP%E3%80%81LAN%E3%80%81%E5%85%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%88%B8%E6%A0%B9/dp/4822283119)』  
- 『[Webを支える技術 HTTP、URI、HTML、そしてREST](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042/ref=tmm_pap_swatch_0?_encoding=UTF8&dib_tag=se&dib=eyJ2IjoiMSJ9.vyj0oG9baMuEZ_ddcog6rkToMycMFZzcDQZx9l58_i9qrcgo4_UH8U1Ipo2v_rNyWQcms_DJCeLknS7w2nMmEIYGdsPJYaDhWKlPBR_Up8Ooj3KspC8SMrG7vcI9aRUbDSQfinwgpz51Zhu1-tyXpXPG_v5lGleut3TofLp-C7nzHv9WnJfGhjQM8gbjGiGZLiui7DQCUZ8YpdUxDF6bFPb4pBnT_bZnR892mnX4yzfX1aWoADbeaEUWSMiivdCyc-47V5N7GGp6n4xI0aZfCc2ajbqOvX_CVM6ySE0L9ic.7KFYxRpYb7C8-Y5DmGCsqhxKzq-uzewih3n04dNEoCw&qid=1733133146&sr=8-1)』  


## カリキュラム設計のポイント  

同じ内容でも異なるアプローチで取り組むことで、深い理解が得られます。

たとえば、一周目はApacheでHTTPサーバーを構築し、二周目はNginxで同様の作業を行う、といったバリエーションを取り入れることができます。
今年はUbuntu OSでこのカリキュラムをおこないましたが、OSを変えてみるというのも面白いかも知れませんね。

## 実践型カリキュラムの価値  

体験を通じて得た知識は、実務でも役立ちます。
座学のみでは得られない「実際に使えるスキル」が身につきます。

またこれはチャレンジ中の話になりますが、組織内でカリキュラムを内製化することで、実務の実態にフィットした内容へアップデートし続けることができると考えています。今後も他社のプログラミングスクールや研修内容を参考にしつつ、自分たちに合った形で進化させていきたいと思います！  


## 参考

https://qiita.com/KNR109/items/ac51f7eeace9d1b7b81b


https://bootcamp.fjord.jp/practices

https://runteq.jp/curriculum
.git/objectsってなんぞ？

# はじめに
Gitのバージョン管理の本質を理解する上で、.git/objectsディレクトリは非常に重要な役割を果たします。今回は、この部分にフォーカスした理解を記事にまとめます。

# Gitオブジェクトの種類
Gitには4つの主要なオブジェクトタイプがあります

1. Blob（ブロブ）
2. Tree（ツリー）
3. Commit（コミット）
4. Tag（タグ）

## 1. Blob（ブロブ）
ファイルの内容そのものを保存するオブジェクトです。ファイル名や属性は含まず、純粋なデータのみを保存します。

## 2. Tree（ツリー）
ディレクトリの構造を保存します。ファイル名、パーミッション、各ファイルやサブディレクトリへの参照を含みます。

## 3. Commit（コミット）
プロジェクトの特定の時点のスナップショットを表現します。

## 4. Tag（タグ）
特定のコミットオブジェクトに名前をつけたオブジェクトです。リリースのバージョンなどでtagをつけた際に保存されます。

# オブジェクトの保存方法
オブジェクトの保存は以下の方法で行われます。
1. オブジェクトのデータをzlib圧縮
2. SHA-1ハッシュを生成
3. .git/objects/[ハッシュ先頭2文字]/[残りのハッシュ] として保存

# 実際にオブジェクトを確認してみる
実際にコマンドでそれぞれのオブジェクトを確認してみましょう。

### 1. Gitリポジトリを初期化する
```bash
mkdir git-internals-demo
cd git-internals-demo
git init
```

### 2. ファイルを作成する
```bash
echo "hogehoge" > test.txt
mkdir tests
echo "hogehoge" > tests/test1.txt
```

### 3. ファイルをステージングエリアに追加する
```bash
git add test.txt
```

:::note info
`add`した地点で`blob`オブジェクトが作成され保存されます。

ここで今回保存した内容を確認してみましょう。
```bash
hash=$(git hash-object test.txt)
git cat-file -p $hash
```

`hogehoge`と表示されるはず。
また、`tree .git`でコマンドを叩いてみても、`.git/objects`の中に新しくファイルが生成されているのが確認できると思います。
:::

### 4. 作成したファイルを全てコミットする
```bash
git add .
git commit -m "Check Git object for tests"
```
:::note info
`commit`すると`tree`オブジェクトと`commit`オブジェクトが作成され、保存されます。

今回も内容を確認してみましょう。
```bash
# 最新のコミットハッシュを取得
commit_hash=$(git rev-parse HEAD)

# コミットオブジェクトを確認
git cat-file -p $commit_hash
```

出力として以下のようなものが出ると思います
```bash
tree <tree_hash>
author Your Name <your.email@example.com> 1733133160 +0900
committer Your Name <your.email@example.com> 1733133160 +0900

Check Git object for tests
```

今回の出力で得られた`<tree_hash>`を確認してみましょう
```
# コミットオブジェクトを確認
git cat-file -p <tree_hash>
```
出力として以下のようが得られたのではないでしょうか
```
100644 blob <blob_hash>    test.txt
040000 tree <subtree_hash> tests
```
:::

### タグの作成
```
# タグの作成
git tag -a v1.0 -m "Version 1.0 tag"
```
:::note info
tagオブジェクトの確認
```bash
tag_hash=$(git rev-parse v1.0)

# タグオブジェクトを確認
git cat-file -p $tag_hash
```
出力として以下のようが得られたのではないでしょうか
```
object <commit_hash>
type commit
tag v1.0
tagger Your Name <your.email@example.com> 1733133967 +0900

Version 1.0 tag
```
:::


# 参考

https://git-scm.com/book/ja/v2/Gitの内側-Gitオブジェクト
AIF-C01 / AWS Certified AI Practitionerに2日で合格するための勉強方法

## はじめに
つい先日、AI Practitionerに合格したので勉強方法について書きたいと思います。

私は試験の2日前まで予約したことを忘れており、キャンセルしようかとも思ったのですが、「プラクティショナーだしいけるっしょ！」と舐めていたので2日間の勉強で受験しました。

結果ギリギリもギリギリの合格でした。
試験には合格したものの、機械学習についての理解はあまり深まらなかったので時間がある方はしっかり勉強することをお勧めします。最後に私が「時間があればやっておけばよかったこと」も紹介するので、ぜひ参考になれば嬉しいです。


![スクリーンショット 2024-12-02 18.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490844/1b76d1ca-537d-5ad8-54fe-ca1f8d7249ea.png)

## 前提
私の機械学習の知識はほぼ0からのスタートでした。
ただ、1ヶ月ほど前にAWSパートナー限定のセミナーを受講していたので、「教師あり学習」「教師なし学習」など簡単な概念は理解していました。
また試験ガイドを確認し、どのような知識が必要とされているかやどのAWSサービスが出題されるかを確認しました。

[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf
)

## 勉強方法
### 1日目

AWS Skill Builderの模擬試験を2周しました。
模擬試験は20問しかないですが、どのような問題が出題されるかを把握することができました。

[Exam Prep Official Practice Question Set: AWS Certified AI Practitioner (AIF-C01)](https://explore.skillbuilder.aws/learn/course/internal/view/elearning/19791/Exam-Prep-Official-Practice-Question-Set:-AWS-Certified-AI-Practitioner-AIF-C01-Japanese-)


### 2日目

2日目はUdemyの問題集をひたすらぶん回しました。

[AIF-C01 / AWS Certified AI Practitioner 模擬試験（4回分）＋補足問題＝340問](https://www.udemy.com/course/aws-certified-ai-practitioner-certification-55-4/?srsltid=AfmBOorpXmoP7NtFzFonEjlbxdhKOa_JRkb3enLiW0KRCbTVxoqrUwaY&couponCode=CMCPSALE24JP)

いつも試験勉強ではCloud Licenseを使用しているのですが、AI Practitionerの問題がまだ用意されていなかったため、udemyの問題集を購入しました。

本番でも割と類似の問題が出題されたように思います。私は時間がなく65 * 1.5回分しか解けませんでしたが4回分きっちりできたらこの問題集だけで十分合格可能だと思います。

## 時間があればやっておけばよかったこと
### AWS Skill Builderのコンテンツを受講

AWS Skill Builderには[「StandardExamPrepPlan:AWS Certified AI Practitioner(AIF-C01)」](https://explore.skillbuilder.aws/learn/lp/2193/standard-exam-prep-plan-aws-certified-ai-practitioner-aif-c01)というコンテンツがあります。
全体で18時間37分とかなりボリュームがありますが、機械学習とそれに関連するAWSについて体系的に学ぶことができるコンテンツになっています。

### G検定の書籍を読む

AI PractitionerはAWSのサービスより機械学習の基礎が問われることが多かったです。
なので機械学習についてG検定の書籍から学習してもよかったなと思いました。
合わせてG検定を取得するのも良さそう。


## おわりに
今回は時間がなかったので「試験に合格するための勉強方法」になってしまいましたが、
これから機械学習の知識が業務で必要になってくるので改めてしっかり勉強しようと思いました。

2025/2/15までに合格するとEarly Adopterのデジタルバッジがもらえるみたいなのでぜひ受けてみてください！
整数が続く？有理数列について


## はじめに
 はじめまして.九大理学部数学科2年の郡司泰生と言います.自主ゼミは数学をいろいろ(ただ最近は体調を崩していてほとんでできていませんが)と物理だと量子論をやっています.哲学なんかも前期はやっていましたし今も自分で哲学書を読むことはあります.
 ただ今日は思いっきり数学をしますがどうぞお付き合いください.具体的に何をするかというと, そんなに知名度は高くない気がしますが, ゲーベル数列という数列を紹介します.この数列はあとで定義しますが, 明らかに有理数なのはわかるのですがなぜか整数がそれなりに続くという不思議な数列です.これは一般化もあってそれもかなり面白いのですが,まずは普通のゲーベル数列について考えようと思います.前提知識は高校数学以上のものはほとんどなくて大丈夫ですが, 分数の合同式について慣れているとわかりやすいかもしれません.(ご存じなくても大丈夫な気がします)

 ## ゲーベル数列とは
 まず最初にゲーベル数列というものを紹介します.


 #### 定義1(ゲーベル数列)
 次の初項と漸化式で定義される数列 $(g_n)$ をゲーベル数列という.
 
   $g_o=1 \quad  g_n=\dfrac{1+g_0^2+g_1^2+\cdots g_{n-1}^2}{n} \quad (n=1,2,\cdots)$ 
 
 このように定義された数列 $(g_n)$ は明らかに有理数列なわけですが, $g_1=2$, $g_2=3$, $g_3=5$, $g_4=10$, $\cdots$ というようになんと $g_{42}$ まで整数が続くのです.そして $g_{43}$ で初めて整数ではなくなります. 
 
 #### 定理2
 ゲーベル数列 $(g_n)$ に対して
   $g_1,g_2,\cdots, g_{42} \in \mathbb{Z}$ , $g_{43} \notin \mathbb{Z}$
 
 
 今回はこの事実を証明したいと思います.

 ## 整数性の証明
 さて, ゲーベル数列の整数性をどのように証明しようかと思うわけですが, その前にひとつ漸化式を少し変形した形を用意します.

 #### 補題3
 ゲーベル数列 $(g_n)$ に対して, 以下が成り立つ.

   $(n+1)g_{n+1}=g_n(n+g_n)\quad (n=1,2,\cdots)$

 これは定義1の式を少しいじくるとわかります(興味のある方は自分で証明してみてください).

 そして本題ですが, まず, 素数 $p$ に対して,$\mathbb{Z}_ {(p)}=\\{{\frac{a}{b}\in \mathbb{Q} :p\nmid b  \}\\}$ という集合を考えます.つまり有理数のうち, 分母が $p$ で割り切れないようなもの全体をとってきます.なんでこんなものを考えるかというと, 任意の素数 $p$ に対して $g_n\in \mathbb{Z}_{(p)}$ であれば $g_n\in \mathbb{Z}$ と言えるからなんです！つまり, $g_n$ を既約分数表示したときに分母が2でも3でも5でも, $\cdots$ どんな素数でも割り切れないならそれは整数しかないということですね.これがこの証明の肝の部分で, 個人的にかなり面白いところだと思っています(最初は理解に苦しみましたが笑).そしてこの方針は補題で示した漸化式を逐次用いることでうまくいきそうです.

 ・$p>43$ のときは明らかに補題の漸化式の形から $g_n \in \mathbb{Z}_{(p)}$ $(n=1,2,\cdots ,42)$がわかりますね($g_1=2$ と漸化式より帰納的に $1\leqq n \leqq 42$ のときは $n+1$ で割っても分母に43より大きい素数 $p$ は出てこないですね).
 
 ・$p=43$ のときは $g_{42}$ までは同様に心配ないですが $g_{43}$ が整数かどうかは計算してみないとわからないです(実際整数ではなくなります).
 
$p<43$ のときは何回か $p$ で割らないといけないポイントが出てきて少し大変です.
 ・まず $23\leqq p \leqq 41$ のときは $n=p$ のときだけ $p$ で割れるかを考えないといけないので心配です.このあたりから(分数の)mod計算をしないといけないですが,これは個別に計算することで問題ないことがわかります(これ以降はさすがに計算機を頼りましょう).
 
 ・$p=17,19$ のときは $n=p$ , $n=2p$ のときまで考えないといけません( $2p<42$ なので).ただひとつ今まで通りにいかない部分があって, mod $p$ で計算すると, $n=p$ のときに $g_p\in \mathbb{Z}_{(p)}$ までは言えても mod $p$ で何と合同かまでわからないと $n=2p$ のときまで計算することができません泣. なのでここでは mod $p^2$ を考えます. これでこの問題は解消されています(ここは興味ある方は実際手を動かしてみてほしいです).そしてこの場合も $g_n\in \mathbb{Z}$ $(1\leqq n \leqq 42)$ がわかります.

 ・$p<17$ のときはさらに $p$ で割り切れるポイントが出てくるのでもう少し大変になります. $p=13$ なら $n=p$ , $n=2p$ , $n=3p$ の3通り出てくるのでmod $13^3$ を考えます.これは $p=11$ でも同様で, $p=7$ のときは $n=6p$ まであるのでmod $7^6$ , $p=5$ だと, $g_{25}$ のときに $g_{24}(24+g_{24})$ が5で2回割り切れるかをcheckしないといけないので, 同様に計算するとmod $5^9$ で考えればよいとわかります.つまりmod計算の指数部分は 42! が $p$ で割り切れる(最大の)回数ということがわかります.ということで $p=3$ のときはmod $3^{19}$ , $p=2$ のときはmod $2^{39}$ で考えればよいとわかります.
 (ただ例えば $p=7$ のときには $n=7$ 以降は mod $7^5$ , $n=14$ 以降は mod $7^4$ というように指数を落として考えて問題ないので少しは計算が楽になっていきますね)

 以上まとめると, 任意の素数 $p$ にたいして $g_1, \cdots ,g_{42} \in \mathbb{Z} _ {(p)}$ つまり $g_1, \cdots ,g_{42} \in \mathbb{Z}$ が言えたことになりますね.そして $g_{43}$ が整数でないことは『せいすうたん1』計算結果が載っているので興味のある方は是非手に取ってみてください.ここまで読んでいただいてありがとうございました.

 ## 参考文献
 [1]  小林銅蟲 , 関真一朗 , せいすうたん1: 整数たちの世界の奇妙な物語, 日本評論社,2023, pp.30-36
PIM

# PIM(Protocl Independent Multicast:プロトコル非依存マルチキャスト）
>マルチキャスト・ルーティング・プロトコルの中には、送信者からグループ内のメンバーへの経路を与える`マルチキャスト・スパニングツリーを構築するものがある。これに用いられているプロトコルがPIM`である。PIMにはいくつかのバリエーションがある。

### デンス・モードPIM(Dense Mode PIM:デンス・モード・プロトコル非依存PIM)
>`枝刈りされたリバース・経路・フォワーディング・ツリー`が作られる。これは、データ・センター・ネットワークで多数のサーバーへファイルを配布する場合など、メンバーがネットワーク全体に分散している状況に適している。

### スパース・モードPIM(Sparse Mode PIM:スパース・モード・プロトコル非依存PIM）
>`スパース・モードPIMで構成されるスパニング・ツリー`は、コア・ベースのツリーと同様である。これは、コンテンツ・プロバイダが自身のIPネットワーク上でTV映像を契約者にマルチキャストするような状況に適している。

### SSM PIM(Source-Specific Multicast PIM:ソース固有マルチキャスト向けプロトコル非依存 PIM)
>`一つの送信者からグループに対して通信を行う場合に最適化`されている。グループ・メンバーが二つ以上のASにまたがる場合には、マルチキャスト経路を構成するため、BGP向けのマルチキャスト技術かトンネリングが必要である。

* マルチキャスト・スパニングツリー
* リバース・経路・フォワーディング・ツリー

上２つはネットワーク層より下の層のものだと考えるので今は調べない。

* データ・センター・ネットワーク

https://qiita.com/masatom86650860/items/36e3a7dddfd532b58a2e

* コンテンツ・プロバイダ
>インターネットを介してデジタルコンテンツの配信サービスを行う業者のこと。ニュースなどの情報配信をはじめとして、画像や動画、音楽、電子書籍、と配信されるコンテンツはさまざまである。また、さまざまなコンテンツをジャンルごとに用意して、ポータルサイトとして運営するサービスもある。特にスマートフォンなどのモバイル端末に向けたゲームや音楽配信が盛んに行われ、巨大企業に成長している事業者もある。

https://www.ntt-west.co.jp/business/glossary/words-00765.html#:~:text=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%82%92%E4%BB%8B%E3%81%97%E3%81%A6%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E9%85%8D%E4%BF%A1%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%A1%8C%E3%81%86%E6%A5%AD%E8%80%85%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%81%AA%E3%81%A9%E3%81%AE%E6%83%85%E5%A0%B1%E9%85%8D%E4%BF%A1%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E7%94%BB%E5%83%8F%E3%82%84%E5%8B%95%E7%94%BB%E3%80%81%E9%9F%B3%E6%A5%BD%E3%80%81%E9%9B%BB%E5%AD%90%E6%9B%B8%E7%B1%8D%E3%80%81%E3%81%A8%E9%85%8D%E4%BF%A1%E3%81%95%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AF%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%BE%E3%81%9F%E3%80%81%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%AB%E3%81%94%E3%81%A8%E3%81%AB%E7%94%A8%E6%84%8F%E3%81%97%E3%81%A6%E3%80%81%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%82%E3%81%82%E3%82%8B%E3%80%82%E7%89%B9%E3%81%AB%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E7%AB%AF%E6%9C%AB%E3%81%AB%E5%90%91%E3%81%91%E3%81%9F%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%84%E9%9F%B3%E6%A5%BD%E9%85%8D%E4%BF%A1%E3%81%8C%E7%9B%9B%E3%82%93%E3%81%AB%E8%A1%8C%E3%82%8F%E3%82%8C%E3%80%81%E5%B7%A8%E5%A4%A7%E4%BC%81%E6%A5%AD%E3%81%AB%E6%88%90%E9%95%B7%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E4%BA%8B%E6%A5%AD%E8%80%85%E3%82%82%E3%81%82%E3%82%8B%E3%80%82

# 感想
マルチキャスト・スパニングツリーを構築するためのPIMというプロトコル。
それぞれのネットワーク構成に対して種類が違う。
【計算量】なぜ O(max(n, m)) を O(n + m) と書けるのか？その理由を解説！

# はじめに
証明に入る前に、そもそも、計算量が $O(\max(n, m))$ や $O(n + m)$ で表されるような具体例はあるのでしょうか。

Python で書かれた以下の関数 $f(x)$ を見てみてください。関数 $f(x)$ は正整数 $x$ が与えられたときに $\displaystyle\sum_{1\le k \le x} k$ を返す関数です。例えば $x = 4$ のときは $f(4) = 1 + 2 + 3 + 4 = 10$ となるので $10$ を返します。

```python: 関数 $f(x)$
def f(x):
    total = 0
    for k in range(1, x + 1):
        total += k
    return total
```

これから、標準入力として $2$ つの正整数 $n, m$ が与えられるとします。関数 $f(x)$ を使った次の $2$ つのプログラム $P, Q$ を考えてみると、（直感的には）プログラム $P$ の計算量は $O(\max(n, m))$ 、プログラム $Q$ の計算量は $O(n + m)$ と見積もれます。

```python: プログラム $P$
# 関数 f(x)
def f(x):
    total = 0
    for k in range(1, x + 1):
        total += k
    return total

# 標準入力
n = int(input())
m = int(input())

if n > m:
    print(f(n))
else:
    print(f(m))
```

```python: プログラム $Q$
# 関数 f(x)
def f(x):
    total = 0
    for k in range(1, x + 1):
        total += k
    return total

# 標準入力
n = int(input())
m = int(input())

print(f(n))
print(f(m))
```

# 証明
$O(\max(n, m))$ を $O(n + m)$ と書き表しても良いことをこれから証明します。
$n \gt m$ と $n \le m$ の場合分けで示します。
- $n \gt m$ のとき
    - $\max(n, m) = n$ となるので、$O(\max(n, m)) = O(n)$ が言えます。 
    - $m \lt n$ の両辺に正の定数 $k$ を掛けると、$km \lt kn$ となります。両辺に $kn$ を加えると、$kn + km \lt kn + kn = 2kn \le 3kn$ すなわち、$k(n + m) \le 3kn$ が成り立ちます。 $O$ 記法の定義より、$O(k(n + m)) = O(n + m), O(3kn) = O(n)$ なので、$O(n + m) = O(n)$ が言えます。 

以上より、$n \gt m$ のときは $O(\max(n, m)) = O(n + m)$ が成り立ちます。

- $n \le m$ のとき
    - $\max(n, m) = m$ となるので、$O(\max(n, m)) = O(m)$ が言えます。 
    - $n \le m$ の両辺に正の定数 $k$ を掛けると、$kn \le km$ となります。両辺に $km$ を加えると $kn + km \le km + km = 2km$ すなわち、$k(n + m) \le 2km$ が成り立ちます。 $O$ 記法の定義より、$O(k(n + m)) = O(n + m), O(2km) = O(m)$ なので、$O(n + m) = O(m)$ が言えます。 

以上より、$n \le m$ のときは $O(\max(n, m)) = O(n + m)$ が成り立ちます。

したがって、$O(\max(n, m))$ を $O(n + m)$ と書き表しても良いことが分かります。
【真っ黒計画】Keyball44を黒色で統一する

# はじめに
自作キーボード界隈で大人気のKeyball44。その美しいフォルムをさらに引き立てるために、「真っ黒化」に挑戦する手順を記録します。

# Keyball44を黒化させる方法
私がKeyballをかっこよく黒化するために落ち着いた方法は下記の通り。
- マッキーペンで白い基盤を塗装
- 黒化キットを購入

この2つだけである。

## 塗装という選択肢
まず最初に思いついたのは、トッププレートやミドルプレートなどの白いパーツを黒く塗装する方法でした。しかし、塗装には以下のような問題点があります：

- 塗装の際に失敗するリスク
- 塗装用の道具を揃える手間と塗装する時間的コスト
- 塗装が剥げることで見た目が悪くなる可能性

これらのデメリットを考えると、どうしても気が進みませんでした。

## 黒化キットとの出会い
そんなとき、Keyball44を愛用している同僚から「黒化キットが販売されている」という情報を教えてもらいました。

早速ネットで調べてみると、なんと本当に黒化キットがメルカリで販売されているではありませんか！

ただ、正直なところ、最近のメルカリの評判を聞くと少し不安がありました。
しかし、出品者であるファドさんの評価は非常に良く、何より「キットなので手間いらず」という点に強く惹かれ、購入を決断しました。

そして届いた黒化キットを使ってみると、これが大当たり！
手間なくKeyball44を黒化することができ大満足でした。

この経験から、「同じようにKeyball44の黒化に興味を持っている方々に役立つ情報をシェアしたい」と思い、この記事を書くことに至りました。

# 黒化キット

👇私が購入した黒化キットはこちら👇

https://jp.mercari.com/item/m82595169383


👇私が購入した黒化キットの販売者はこちら👇

https://jp.mercari.com/user/profile/874664970

## 黒化キットの内容
今回私が購入した黒化キットの内容は下記の通りです。

- 左手用ミニマルケース
- 左手用トッププレート（大）
- 左手用トッププレート（小）
- 左手用ミドルプレート
- 左手用OLEDカバー
- 右手用ミニマルケース
- 右手用トッププレート（大）
- 右手用トッププレート（小）
- 右手用ミドルプレート
- 右手用OLEDカバー
- 34mmトラックボールケース
- トラックボール用の黒セラミックボール×3個

真っ黒にしたかった私は下記オプションも付けちゃいました笑

- ミニマルケース用黒ネジ×34個
- トラックボールケース用黒ネジ×2個
- TRRSジャック保護パーツ

これで全15パーツが送られてくることに！
うん、控えめに言って楽しみすぎる！

## 組み立て
購入後数日で発送され、すぐに手元に到着しました！
さあ、いざ組み立て勝負！
![IMG_1629.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/483db914-572c-ed88-2b22-081ee4db84cf.jpeg)

と言っても、黒化キットの組み立てはとても簡単で、普通にKeyball44を組み立てるときと全く同じでした。

まず、トッププレートとミドルプレートにネジとスペーサーを付けてっと。

![IMG_1630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/937f4662-5ac1-9879-b323-b415d7ac778a.jpeg)

おお〜！ピッタリ！

![IMG_1631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/0e653d0e-bc56-d6bf-9d96-9afd4e3707db.jpeg)

次は、キースイッチを付けて、トラックボールも付けた感じがこんな感じです。

![IMG_1635.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/dd095ad0-ac7d-40c3-c00e-ccfd3e76da9c.jpeg)

すごい！

![IMG_1636.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/f8f18af4-9f94-da8c-61de-817afd427456.jpeg)

いや、めちゃめちゃ真っ黒じゃん！！！

TRRSジャックのところの保護パーツが地味にめっちゃいい。
白い基盤を絶妙に隠してくれるし、OLEDカバーもいい感じに補強してくれる。

![IMG_1634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/ef52a87d-d5ae-7da3-2519-b79612451a87.jpeg)

このオプションはめちゃ当たりだったな笑

# 最後に
Keyball44黒化の旅は、ファドさんの「黒化キット」のおかげで、手間を最小限に抑えながら、想像以上の仕上がりで着地することに成功しました。

黒いパーツが生み出す統一感と高級感に大満足です！

これで真っ黒なKeyball44のベースが完成したので、次は「キーキャップを探す旅に出ようかな」なんて思っています笑

Keyballのカスタマイズは終わりなき旅ですね！
それでは、あなたのKeyball44ライフがさらに充実したものになることを願っています！
データセンターネットワークとは

>データセンターネットワークとは、アプリケーションの実行やデータの処理などを行うために、`スイッチやルーターなどのデバイスを接続するネットワーク`です。データセンター ネットワークは、企業がビジネス目標を達成できるかどうかにおいて重要な役割を果たします。この記事では、データセンターネットワークはどんなものかについて紹介します。
>
>### 1 データセンターとは
>データセンターとは、`エンタープライズサーバーを安全かつ高可用性で実行するための専用施設の総称`です。サーバーを稼働させるために必要なネットワーク機器やセキュリティ機器も導入されている場合が多いです。
データセンターネットワークは、`スイッチ、ルーター、その他のハードウェアコンポーネントで構成`されます。これらの製品には、人工知能 (AI)、機械学習、ファイアウォール、管理および自動化ソフトウェアが搭載されており、ネットワーク運用を簡素化し保護し、アプリケーションの実行とデータの処理に必要な接続とセキュリティを提供します。
>
>### 2 データセンターネットワークの機能
>2.1 安定運行を支える
サーバー間の連携を通じて大量のデータを処理する場合には、当然のことながら困難が生じます。大規模なシステムであるため、いずれかの時点で障害が発生する可能性が高くなります。
>
>障害が発生した場合、`障害の原因を迅速に特定し、データセンターのサービスを維持し、安定した運用を確保`できます。さらに、`サーバー間の広範で低遅延の通信を提供`します。
>
>...

https://www.ruijie.co.jp/blog/corporate-network-data-center_1765953946459213826.html#:~:text=%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3,%E3%81%AE%E9%80%9A%E4%BF%A1%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# エンタープライズサーバー
>エンタープライズ・サーバーは、企業全体に渡って中核となるビジネス・データを管理し、キーとなるビジネス・アプリケーションをサポートするシステムです。

https://www.ibm.com/docs/ja/db2-for-zos/13?topic=environments-enterprise-servers#:~:text=%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%E3%83%BB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E3%80%81%E4%BC%81%E6%A5%AD%E5%85%A8%E4%BD%93%E3%81%AB%E6%B8%A1%E3%81%A3%E3%81%A6%E4%B8%AD%E6%A0%B8%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%AE%A1%E7%90%86%E3%81%97%E3%80%81%E3%82%AD%E3%83%BC%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%BB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A7%E3%81%99%E3%80%82

# 感想
サービスを提供するサーバーが安全、可用性を高めたネットワーク
unity1week「ちゅう」の参加記録

# 初めに

[CYBIRD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cybird) 5日担当の @kanachaです。
恋愛シミュレーションゲームのアプリ開発・保守をしております。2年ぶりのアドベントカレンダー参加です。
4日は(@kyukkyu81)さんの[テキスト生成AIに極小コードでひたすら励まし癒してもらう（無料でな）](https://qiita.com/kyukkyu81/items/3ede686c3e8dd7d7f8fc)でした。

# unity1weekとは
https://unityroom.com/unity1weeks
Unityを使って1週間でゲームを作るイベントです。
・ゲームを期間内に投稿(遅刻可)
・投稿者同士で作品に点数を付けたりコメントを記入できる仕組み有り

結構前に作ったゲームなのですが、個人的に気に入っているのでご紹介したいと思います。
この時のイベントのお題は「ちゅう」でした。

今回は2Dで作成しました。
私は普段はUnityで2D、uGUIを扱っているのですが、業務では恋愛シミュレーションゲームの開発をしており、こういった動的なアクション要素のある？ゲームをあまり作る機会が無いので、unity1weekという場で色々学ばせていただきました。

# 完成したゲーム

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101551/1db18a57-eda8-16e5-48dd-882488de7a4e.png)


【操作方法】
[マウスまたはキーボード]
クリック長押し or Zキー長押し: ネズミ前進

---

【紹介文】
ネズミの「チューチュー」を操作して
ネコの「ニャンニャン」から逃げながらチーズを集めろ！
・何もしていない間、チューチューはクルクル回転します
・ボタン長押しでチューチューは向いている方向へ直進します
・チューチューは画面の外に当たると跳ね返ります
・チーズを食べると得点です
・ニャンニャンに当たるとゲームオーバーです

チーズは2種類
・普通のチーズは100点
・スーパーチーズは200点
・スーパーチーズを食べると少しの間だけ無敵のスーパーチューチューに
・スーパーチューチューでニャンニャンをふっとばせ！

高得点のコツ
・跳ね返りを利用する
・あまり前に出過ぎない
画面右側(ネコが出てくるトコロ)に寄っていると逃げ遅れてしまいます

画面右側にチーズが偏ってしまったら
スーパーチーズが出現するまで左側で待機するのも手

---

「チューチューパニック」
↓作ったゲームはこちら
https://unityroom.com/games/chuchupanic

# 工夫したところ

・ランキングを実装してみた
https://blog.naichilab.com/entry/webgl-simple-ranking
こちらの機能をお借りしました、導入めちゃくちゃ簡単...ありがたや
ランキング機能があると「遊んでくれてる！」というフィードバッグを得られるのが良いですね！スコアアタックゲーとして最低限楽しめるものになるように調整も頑張りました。

・親オブジェクトを変化させても子が影響を受けないようにする
https://tsubakit1.hateblo.jp/entry/20140602/1401721171
ネズミの子オブジェクトだけ回転やスケールを変動させないようにしたかったため。

・初めてパーティクルを自作してみた
とか言いつつ、細かい調整以外はテンプレをパクるくらいしかできませんでした...Unityのパーティクルは奥が深い...

・目立つサムネイルにした
前回参加した時に感じたのが、作品一覧から探すと自分のゲームが全く見つからなくて、せっかく作ったのにクリックされなかったら、そもそも遊んでもらえない問題を解決するためにサムネを改善してみました。
今回はキャラクターのネズミをドアップにしたgif画像を作成、LICEcapで撮ってからPicGIF Liteで編集しました。

# おわりに

最初はネコから逃げるだけのゲームを考えていたのですが、
チーズを集めて得点が入るようにすればゲームの幅が広がるんじゃないか？なんかすごいチーズを取ったら無敵になって逆にネコを倒せると面白いんじゃないか？みたいに次から次へとアイデアが出てきて、楽しんでゲームを作っていました。

ゲーム作りで学んだ知識や経験はそのまま業務でも活かせていると感じます。

[CYBIRD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cybird)
(https://qiita.com/advent-calendar/2024/cybird) 
明日は、（@cy_yusuke_ito）さんの「オープンソースのウイルス対策ソフトを使ってみた」です。
お楽しみに！
ディスク使用量の確認（連載第9回/25回）

# はじめに
システムのディスク使用量を定期的に確認することは、ストレージの管理とパフォーマンスの維持において重要です。ここでは、`df` と `du` の基本的な使い方を紹介します。

# コマンド説明
#### `df` - ファイルシステムのディスク使用量の確認

`df` コマンドは、ファイルシステム全体のディスク使用量を表示します。

***主なオプション***
-h : 人間が読みやすい形式で表示（KB、MB、GBなど）
-T : ファイルシステムのタイプを表示
```powershell
# 例
df [オプション]
# この例では、人間が読みやすい形式でディスク使用量を表示します。
df -h
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/sda1        50G   25G   23G  52% /
  tmpfs            2G   1.1G  900M  55% /run
  /dev/sda2       100G   60G   35G  64% /home
```

#### `du` - ディレクトリやファイルのディスク使用量の確認
`du` コマンドは、特定のディレクトリやファイルのディスク使用量を表示します。

***主なオプション***
-h : 人間が読みやすい形式で表示
-s : 合計のディスク使用量のみを表示
-a : ファイルとディレクトリの両方の使用量を表示
    
```powershell
# 使い方
du [オプション] [ファイルまたはディレクトリ]
```
```powershell
# この例では、/home/user ディレクトリの各サブディレクトリおよびファイルのディスク使用量を表示します。
du -h /home/user
  4.0K    /home/user/Documents
  1.2G    /home/user/Music
  700M    /home/user/Videos
  2.5G    /home/user
```

# おわりに
ディスク使用量の確認は、ストレージの最適化と必要なメンテナンスを行うために重要です
次の記事では、アーカイブと圧縮について説明します。

https://qiita.com/yu1016/items/5b0ac83b936446c340d8

一覧

https://qiita.com/advent-calendar/2024/pig
UIUXについて知ろう

# はじめに
アドベントカレンダー1日目でUIUXの本を読んだ感想を紹介しましたが、そもそもUIUXってなんだっけ？というのを再確認していきたいと思います。

https://qiita.com/mattsu_mocha/items/443e57a2a54d34286af5

# UIUXとは？
UIUXとは、 **UI（ユーザーインターフェース）** と **UX（ユーザーエクスペリエンス）** の略です。

それぞれが何を指しているのか見ていきましょう。

## UIとは？
Webサービスやアプリケーションなどにおいてユーザーの目に触れるすべての要素を指します。

画面上に表示されているボタンやフォントなど、ユーザーの視覚に触れる全ての情報や見た目、さらにユーザーが操作するためのインタラクティブな要素も含まれます。例えば、ボタンの配置やナビゲーションメニューの構造などもUIの一部です。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733722/65cf2fe1-194f-767f-47e3-f7881ea96c9e.png" alt="UI">

## UXとは？
ユーザーが製品やサービスを使用する際に感じる全体的な体験や満足度を指します。

使いやすさ、効率性、満足感、感情的な反応などが含まれます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733722/4ac06eac-2cf4-bad9-5869-e13a840b16a0.png" alt="UX">

## UIUXの関係性
UIUXはそれぞれが独立しているわけではなく密接に関係しています。

良いUIは使いやすさを提供し、良いUXはその使いやすさを通じてユーザーに満足感を与えます。両者が連携することで、ユーザーにとって魅力的で効果的な製品やサービスが実現します。

ただし、個別に優れたUIであっても全体のバランスが悪いと良いUXにはつながらないので、全体の一貫性が大事になってきます。

## UIUXを改善すべき理由
UIUXは最終的には **サービス成長・売上** につながってくるため非常に重要な役割を担っています。

例えばECサイトをイメージしてみましょう。検索機能が使いやすければほしい商品にすぐ辿り着けますし、商品ページに画像・説明・レビュー等があれば商品に対して信頼感を持ちやすくなります。結果、使うユーザーが増えて売上につながります。

このようにUIUXを改善することは事業に携わる人間として誰でも意識しておいた方が良いものだと思います。

# おわりに
UIとUXは単独ではなく、互いに補完し合うことでユーザーにとって魅力的な体験を提供します。開発時にもUIUXを意識できると良いなと思いました。
モバイルアプリについて学ぼう

今回はモバイルアプリについて学びます。

総務省が出した
「情報通信メディアの利用時間と情報行動に関する調査報告書<概要>」

https://www.soumu.go.jp/iicp/research/results/media_usage-time.html

「調査結果概要」の資料を見るとスマートフォンの利用者が多いですね。
その中でもLINEやYouTubeの利用率が高いことがわかります。

人々に普及しているモバイルアプリとは何なんでしょう？
調べて、学んでいきたいと思います。

# モバイルアプリとは
モバイルアプリとは、「モバイルアプリケーション」を略した言葉です。
モバイルアプリはOS(パソコンの操作やアプリなどを使うために必要なソフトウェア)によって入手方法が異なり、iPhoneやiPadはApp Storeから、AndroidはGoogle Playからダウンロードして利用できます。
モバイル端末に最適化された操作性や、特定のタスクを遂行するための機能を備え、その用途は幅広くゲームや写真投稿、動画編集など、そのジャンルは数多く存在します。

# モバイルアプリの種類の例
![スクリーンショット 2024-12-02 18.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031833/842747ac-6f21-5cdb-d704-92d68c8babe7.png)

- <strong>SNS(ソーシャル・ネットワーキング・サービス）アプリ</strong>
インターネットを介して、人と人との繋がりの場を提供
例：TikTok、Instagram、X

- <strong>エンターテイメントアプリ‍</strong>
映画、音楽、動画などのエンターテイメントコンテンツを提供
例：YouTube、ニコニコ動画、Netflix

- <strong>キャッシュレス決済アプリ</strong>
お札や小銭などの現金を使用せずにお金を払う手段を提供
例：PayPay、楽天ペイ、au PAY

他にもLINEなどのメッセージアプリ、GoogleMapsなどのナビゲーションアプリ、など様々な種類があります。

# モバイルアプリの分類
モバイルアプリは大きく分けて4つ
- ネイティブアプリ
- Webアプリ
- PWA（プログレッシブウェブアプリ）
- ハイブリッドアプリ

前回、学んだWebアプリもモバイルアプリの仲間だそうです！

# モバイルアプリの主なデメリット
- 使用するにはダウンロードする必要がある（使用前にインストールというステップが必要）
- ストアの審査に通らないとユーザーに配信できない
- 新機能追加やエラー修正の際に、新しいバージョンとして更新する必要がある
- モバイル端末によって使用出来る機能が限られている

# モバイルアプリの主なメリット
- ホーム画面にアプリのアイコンが置かれるのでわかりやすく、使用しやすい
- コミュニケーションをとるための機能がある
- 起動が早く、通信速度も速い
- ストア経由の課金処理などを簡単に行える
- 他のアプリと連動しやすい

# 最後に
今回はモバイルアプリについて学びました。
学ぶまで「Webアプリ」と「モバイルアプリ」の２つだと思っていましたが、大きく分けると４つもあることに驚きました。

次回は「ネイティブアプリ」「PWA」「ハイブリッドアプリ」について学びたいと思います。
AmazonConnectで顧客プロファイルの同期って考えるベストプラクティス


## 👋 はじめに

Amazon Connect Customer Profilesを使った顧客データの同期では、**APIスロットリング対策**や**パフォーマンス最適化**が膨大なデータを効率的に扱い、エラーを回避しつつ安定した同期を行うための重要な要素と思っています。

この記事では以下を詳しく解説します：
- **リアルタイムとバッチ処理の同期パターン**
- **Amazon Connect Customer Profiles APIの活用例**
- **スロットリング回避のリトライロジック**
- **LambdaとEventBridgeの実装例**



---

## 📋 目次
1. 顧客プロファイル同期の概要
2. リアルタイム同期の設計と実装
3. バッチ同期の設計と実装
4. スロットリング対策とモニタリング
5. ベストプラクティスとまとめ

---

## 1. 顧客プロファイル同期の概要

Amazon Connect Customer Profilesは、異なるシステムの顧客データを統合し、コンタクトセンターでの対応効率を向上させます。以下の方法でデータ同期を設計できます。

### **同期パターン**
| パターン      | 適用シナリオ                | メリット              | デメリット            |
|---------------|-----------------------------|-----------------------|-----------------------|
| リアルタイム同期 | 高頻度/低レイテンシデータ更新 | 即時性が求められる場合 | コスト増加           |
| バッチ同期    | 大量のデータ処理             | 定時処理で十分な場合   | レイテンシが発生する |

---



## 2. リアルタイム同期の設計と実装

### **アーキテクチャ概要**
リアルタイム同期の設計では、**外部システム（例：CRM）からのイベント**をトリガーにして、Amazon EventBridgeを介し、Amazon Connect Customer Profiles APIを呼び出す構成です。

1. **外部イベント送信**  
   外部システム（例: CRM）が顧客情報の更新イベントを送信します。
2. **Amazon EventBridge ルール設定**  
   イベントを受け取り、Amazon Lambdaをトリガーするルールを設定します。
3. **Amazon Lambda**  
   イベントデータをAmazon Connect Customer Profiles APIに渡します。
4. **Amazon Connect**  
   顧客データをプロファイルに同期します。

---

### **バッチ同期の設計と実装**

### **アーキテクチャ概要**
バッチ同期の設計では、**Amazon S3に保存されたデータ**を基に、Amazon Lambdaでデータを処理し、Amazon Connect Customer Profilesに同期する構成です。

1. **データ生成**  
   バッチ処理用のデータを定期的に生成し、Amazon S3に保存します。
2. **Amazon S3イベント通知**  
   新しいファイルが保存されるたびにイベントを発生させます。
3. **Amazon Lambda**  
   イベント通知を受け取り、S3内のデータを処理してAmazon Connect Customer Profiles APIに同期します。
4. **Amazon Connect**  
   顧客データをプロファイルに反映します。

## 4. スロットリング対策とモニタリング

### **スロットリング対策**
APIスロットリングを回避するため、リトライロジックを実装します。

```python
import asyncio
import random

class RetryHandler:
    def __init__(self, max_retries=3, base_delay=1.0):
        self.max_retries = max_retries
        self.base_delay = base_delay
    
    async def execute_with_retries(self, func, *args, **kwargs):
        for attempt in range(self.max_retries):
            try:
                return await func(*args, **kwargs)
            except Exception:
                delay = self.base_delay * (2 ** attempt) + random.uniform(0, 0.1)
                await asyncio.sleep(delay)
                if attempt == self.max_retries - 1:
                    raise
```

### **モニタリング**
CloudWatchメトリクスを活用し、同期処理のパフォーマンスを監視します。
```python
class MetricsManager:
    def __init__(self, namespace):
        self.cloudwatch = boto3.client('cloudwatch')
        self.namespace = namespace

    def put_metric(self, name, value, unit='Count'):
        self.cloudwatch.put_metric_data(
            Namespace=self.namespace,
            MetricData=[{
                'MetricName': name,
                'Value': value,
                'Unit': unit
            }]
        )
```

---

## 5. ベストプラクティスとまとめ

### **ベストプラクティス**
- **APIスロットリングに配慮**したリトライロジックを実装。
- **リアルタイムとバッチ同期を使い分け**て最適化。
- **モニタリングを徹底**し、障害検知を迅速化。

### **まとめ**
効率的で安定した顧客プロファイル同期をもっといいものになる。。はず

---