OmniAICreator/Qiita-1.07M huggingface dataset:
TikTokでよく見る「ドレミファソラシドゲーム」をつくろう

# はじめに

こんにちは！MYJLab Advent Calendar 2024、15日目の担当する3年の嶋岡です。

この記事では、TikTokでよく見る「ドレミファソラシドゲーム」を実際に作ってみます！

ドレミファソラシドゲームは、音声入力を利用してボールを操作し、指定された音程に合わせて障害物をクリアしていくというものです。

見たことがないって人は、「TikTok　ドレミファソラシドゲーム」で調べてみてください！

音声認識は、松田さんも紹介していたLibrosaというPythonのライブラリを使用します！

---

## 🎮 ゲームの概要

このゲームでは、音声の高さ（ピッチ）を利用してボールの高さを制御します。画面右側から流れてくる壁には音符に対応した穴が空いており、プレイヤーは正しい音を出してボールを穴に通過させる必要があります。

ゲームの要素は以下の通りです：

- **音符**: ドレミファソラシド（C3〜C4）
- **壁**: 音符に対応した穴が空いています
- **ボール**: プレイヤーが操作するオレンジ色の球体
- **クリア条件**: 全ての壁を正しい音符で通過する

---

## 🛠️ 使用技術

- **Python**: メインのプログラミング言語
- **Pygame**: ゲームの描画と基本的なイベント処理
- **SoundDevice**: 音声入力の処理
- **Librosa**: 音声のピッチ解析

---

## 📝 ゲームのコード構成

以下にゲームの主要な機能を簡単に解説します。

### 1. 音声入力とピッチ検出

ここでは**SoundDvice**ライブラリで音声を受け取り、**Librosa**でピッチ解析を行っています。

```python
def process_audio(indata, frames, time, status):
    global ball_y, is_audio_active
    energy = np.sum(indata[:, 0] ** 2) / len(indata)
    is_audio_active = energy > ENERGY_THRESHOLD 

    if is_audio_active:
        note = get_pitch(indata[:, 0], SAMPLING_RATE)
        if note and note in NOTE_POSITIONS:
            ball_y = NOTE_POSITIONS[note]
```

---

### 2. 壁の生成と移動

壁を管理するコードです。壁はリストで管理され、ゲームループ内で移動と描画を行います。

```python
walls = [{"x": SCREEN_WIDTH, "note": wall_order[0], "speed": -3, "bounced": False, "bounce_timer": 0, "cleared": False}]

for wall in walls:
    wall["x"] += wall["speed"]
    pygame.draw.rect(screen, BLACK, (wall["x"], 0, 50, SCREEN_HEIGHT))
    hole_y = NOTE_POSITIONS[wall["note"]]
    pygame.draw.rect(screen, WHITE, (wall["x"], hole_y - 25, 50, 50))
```

---

### 3. 衝突判定

ボールが壁の穴を通過したかどうかを判定します。

```python
if not wall["cleared"] and wall["x"] < ball_x + ball_radius < wall["x"] + 50:
    if not (hole_y - 25 < ball_y < hole_y + 25):
        wall["speed"] = 5  
    else:
        wall["cleared"] = True  
```

---

### 4. クリア画面とランキング

クリアした際の画面とランキングの保存機能です。

```python
def show_clear_screen(elapsed_time):
    ranking.append(elapsed_time)
    save_ranking(ranking)
    font = pygame.font.Font(None, 72)
    text = font.render("Game Cleared!", True, WHITE)
    screen.blit(text, (SCREEN_WIDTH // 2 - 200, SCREEN_HEIGHT // 2 - 100))
```

---

## 🎨 ゲーム画面

以下は、実際のゲームプレイ画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865891/41362a3e-1751-b350-2fb7-787df44dfc41.png)

---

## 🚀 動作デモ

ゲームのデモ動画をYoutubeにアップしたので、ぜひ見てください！

https://www.youtube.com/shorts/FjC6vjQ4Ajo
↑デモ動画

---

## 🏁 最後に

この記事を通じて、音声入力を活用したゲームの可能性に興味を持っていただければ幸いです。もしこのプロジェクトを試してみたい方がいれば、ぜひコードを改良してオリジナルのゲームを作ってみてください！

ソースコードは以下に公開しています：
https://github.com/shokkun47/Do-Re-Mi-Fa-So-La-Si-Do-Game

それでは、楽しいゲーム開発ライフを！
ポーリング機能実装時の注意点まとめ

# 結論
当たり前のことですが、下記を特に注意して処理の実装をしていく必要があります。
1. ポーリングを実行するためのAPI実行回数を極力減らす
2. バックエンド側でのデータベースへの接続を極力減らす

# 背景
チャット機能を実装しようとしており、管理画面上でユーザーからの新着メッセージをチェックする機能の実装が必要となりました。
本来WebSocket等つかった非同期処理を実装することが考えられますが、弊社では実績がなく検証からリリースまで想定よりも時間がかかる見込みだったことや、ポーリングであれば過去実績があり、リリースまで最短で実装できそう、ということでポーリングの処理を実装する方針に確定しました。

# 実装①：一旦実装してみる
下記の仕様で機能を実装しました。
* 3秒に1回APIをリクエストするようにループする
* バックエンド側では新着メッセージがあるかをデータベースに接続してチェック、あればHTMLを生成して返却、なければそのまま処理を終了

# 実装①の課題：接続回数の上限を設けていないので永遠とAPIを投げ続ける
当たり前ですね。画面をずっと開いていると3秒に1回永遠とAPIを投げ続けます。流石に上限を設けました。

# 実装②：APIをリクエストするループ処理を5分間を上限にする
ループ処理の上限を画面を開いてから5分間としました。5分経過したらAPIリクエストはストップします。

# 実装②の課題：5分間とはいえ、（3秒に1回のため）100回APIリクエストする処理になっている
そもそも3回に一回APIリクエストを投げる仕様がきつい。3秒に1回APIリクエストする処理を、5秒に1回や、10秒に1回に変更してもよかったが、根本解決にならない。

# 実装③：バックエンド側で、3秒おきに100回、新着メッセージがあるかチェックする仕様に変更
クライアント側からのAPIリクエストを1回に減らすことができる。さらに、データベースへの接続回数も1回に減らすことができる。

# 最終的な仕様
その後いろいろなユーザー側の課題等が発生する度にPDCAを回し、最終的にはこのような仕様となりました
1. クライアント側からは、1回APIリクエストを送る。
2. バックエンド側で、3秒おきに20回（1分間）新着メッセージがあるかチェックする
3. 1分後、APIリクエストが終了する。その1分間の間に、画面上の操作を何かしら行う（keydownやclick）と、再度APIリクエストを送る
4. 1分以上画面上の操作を何もしない場合、APIリクエストを終了する
5. 画面上の操作を何かしら行うと、APIリクエストを再開
6. 2~5の繰り返し

という仕様となりました。

ただAPIを投げ続けるだけでなく、バックエンド側で一定期間繰り返し処理を行うことで「APIリクエスト数が増える」「データベース接続が増える」課題を解決しました。
ポーリングはその仕様上サーバーへの負荷がかかってしまいがちのため、このようにして負荷を極力減らしていくことが必要です。安易に実装をするのではなく、（もちろんユーザーの意見も取り入れつつ）サーバーへの負荷を減らすような対応をしていきましょう。
新しいカードのスモールマルチプル

この記事は、**Microsoft Power BI Advent Calendar 2024** シリーズ2 12月20日担当分の記事です。

https://qiita.com/advent-calendar/2024/powerbi

# 1. はじめに

2024年11月のアップデートで**新しいカード**でも**スモールマルチプル**が使えるようになりました。試してみました。

# 2. 新しいカード
## 2-1. Microsoft Learn 1次情報

> 1 つのコンテナー内で複数のカードをグループ化できるため、各カードのすべてのコンポーネントを完全に制御でき、重要なデータ ポイントの包括的な概要が**ひとめ**でわかります。

https://learn.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-new-card

## 2-2. 新しいカードを作成
サンプルデータを使い、売上合計と粗利合計の**新しいカード**を作りました。それぞれの参照ラベルは前年比を設定しておきます。

![新しいカード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/5d4c7f28-7641-ee89-4748-3971a3de0e3d.png)

# 3. スモールマルチプル
## 3-1. Microsoft Learn 1次情報

> 現在、横棒グラフ、縦棒グラフ、折れ線グラフ、および面グラフでスモール マルチプルを作成できます。

https://learn.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-small-multiples

新しいカードの追記は未だのようです（2024年12月中旬現在）

## 3-2. スモールマルチプルを作成
先ほど作成した新しいカードの**スモールマルチプル**にディメンションテーブルとして用意していたCountryを入れてみます。

![スモールマルチプル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/95bf52d0-db2f-3320-4aff-e29d7a12693e.png)


すると、各Countryごとの売上合計と粗利合計と参照ラベルの前年比が展開されました。

![新しいカードのスモールマルチプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/6b0371b9-f84b-afc2-a3a0-4ab4af12b6fe.png)

簡単な操作で各Countryごとのカードが作れました。便利ですね！
しかし、情報量が増えるとどこを見て良いのか迷いますね🤔

# 3. コンテキストが重要

下記の参考記事はbullet chartの話ですが、コンテキストの重要性を学ぶことができます。
> * これらの販売は良いですか、悪いですか？
> * ビジュアルでは文脈も重要です。数字に意味を与えます

https://www.sqlbi.com/articles/building-bullet-charts-in-power-bi-reports/

売上合計・粗利合計のような数字だけでは `良し悪し` がわかりません。数字に意味を与えるコンテキストとなる**前年比**を強調して `良し悪し` をわかりやすくしてみましょう。具体的には`データ`と`参照ラベル`を入れ替えて、記号を変更します。これにより、どの国が前年より悪くなっているのか一目瞭然になりました😆

![新しいカードのスモールマルチプルrev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491213/aa8829cf-7e1b-778e-92cd-74a9bd258518.png)

# 4. まとめ
::: note
* 新しいカードでスモールマルチプルが使えるようになった。
* ビジュアルではコンテキストも重要。数字に意味を与える。
:::

# 参考
https://powerbi.connpass.com

https://qiita.com/ishiayaya/items/a2ae35e2cbd7376474ab
片付けよう！PCデータ大掃除のコツと注意点

# はじめに
今年も色々なことがありましたよね？物理的な大掃除はだけでなく、データの大掃除もして仕事納めをするにあたって、掃除場所と気をつける点をまとめてみました。

# 大掃除の効果
自分のPCなのにやたらと視界が騒がしかったり、ファイルを見つけづらかったりしてませんか？
もしファイルやフォルダを整理したら、不要なデータを削除して __ストレージを確保__ したり、 __ファイルが見つけやすく__ なったり、またPCの __パフォーマンスが向上__ したりするかもしれません！
大掃除は手間と時間がかかって大変ですが、やる価値はありマス。

# 大掃除の注意
PCの中には重要なファイルもたくさんあります。なので削除や移動をする場合には __内容をよく確認__ することが必要です。ファイルの名前に「最新」と付いているのが本当に最新版であるとは限らず、意外とよく分からないものが一番重要だったりすることもあります。
ただ、物理的な大掃除とは異なるのは、ファイルやフォルダの __バックアップ__ を取ることができることです。バックアップをとってから作業を開始しましょう、

# 大掃除する場所
ファイルやフォルダが乱立しがちで、大掃除をおすすめする場所は以下の通りです。
- ゴミ箱
- デスクトップ
- ダウンロードフォルダ
- 写真・動画
- ドキュメント
- アプリケーション
- 一時ファイル
- メールボックス

とりあえずやるとしたらおすすめなのは、 __デスクトップ__ です。
PCを開くたびに見る画面ですし、取り掛かりやすくやった感も得やすいです！

# おすすめの整理ルール

- フォルダ構成を決める
例: 「趣味」「お気に入り」「プロジェクト」など、大まかなカテゴリで整理。
- 年次アーカイブを作成
例: 古いデータは「2024年」などのフォルダにまとめて別保存

# おわりに
大掃除を機にPC内の環境を整え、新年をスムーズに迎えましょう！
高等学校「情報Ⅰ」とは何者か

理系大学生として研究生活を行いながら、教職課程を履修し教育実習に行ってきました。教科は情報です。情報科といえば来月行われる大学入学共通テストから新たに出題されるようになります。

# 情報科の歴史
教科「情報」は20年前には既に存在していました。2003年から情報活用の実践力を養う「情報A」、情報の科学的な理解を養う「情報B」、情報社会に参画する態度を養う「情報C」の3科目のうち1つを必履修としました。
その後「情報の科学」「社会と情報」の2科目の時代を経て、2022年度から高等学校普通科に通う全ての生徒が「情報Ⅰ」を履修する形に改められました。同時に発展的な内容を扱う科目として「情報Ⅱ」が設定されました(こちらは選択科目)。
![info_his.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/3e6f206c-6c9b-22b9-1bfe-df61d44dba37.png)

# 何が変わったか
私は高校生時代に「情報の科学」を履修しており、教育実習では「情報Ⅰ」を教えました。両者の無いように大きな差はありません。「社会と情報」ではアルゴリズムやプログラミングを扱っていなかったのですが、「情報の科学」では問題解決におけるコンピュータの活用としてプログラミングを扱っていました。そのため以前「情報の科学」を選択していた学校においては大きな混乱は無かったと思われます。「社会と情報」を選択していた学校にとってはプログラミングを扱う授業を一から作らなければならず、それも国公立大学を目指す生徒の受験に影響してしまうという事態になっています。
</br>
情報の配点をどうするかについては各大学で対応が割れています。[東進のデータ](https://www.toshin.com/shingaku_info/shinkatei/search.php)が詳細にまとまっていました。北海道大学などが試験は課すものの配点しないとしたことが話題になりました。そのときの記事が[こちら](https://www.yomiuri.co.jp/kyoiku/kyoiku/news/20230108-OYT1T50098/)。
私立大学でも共通テスト利用入試で情報を利用できる大学があります。こちらも[東進のデータ](https://www.toshin.com/shingaku_info/shinkatei/search2.php)が細かくまとめてありました。選択肢として情報が増えるので、情報が得意な生徒にとっては有利に働きそうです。

# 情報の出題は以前からあった？
独立した教科としての出題は来月行われる共通テストが初めてですが、数学②の科目として「情報関係基礎」の出題がありました。工業科や商業科の生徒が受験することを想定していたようです。
こちらは来月実施の試験までは旧課程学習者への経過措置科目として出題されますが、再来年からは出題されないようです。
[試作問題](https://www.dnc.ac.jp/kyotsu/shiken_jouhou/r7/r7_kentoujoukyou/r7mondai.html)などと比較すると出題傾向は異なりますが、腕試しぐらいにはなりそうです。

# 今後どうなる
入試科目になってどうなるかというのは、正直蓋を開けてみないと分からないと思います。
情報は私が高校生の頃は体験重視の授業だったのですが、入試科目になった情報で教育実習をしたらペーパーテスト重視になったように感じられました。どちらが良いのかは一概には言えませんが、教壇に立つなら情報の楽しさを伝えられる教師でありたいと考えています。
【AWS SAP】AWS Elastic Disaster Recovery (AWS DRS) と Amazon Data Lifecycle Manager (DLM) がどうしても覚えられない人向け

## AWS DRS (災害復旧)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746730/69854537-c5ac-1213-9057-00468672bf3a.png)

- 「DRSはDisaster（災害）に備えて、RegionをSwitchover」
- 災害時に、フェイルオーバー（Switchover）でシステム全体を復旧

    → 大災害の全体復旧 → アプリケーション丸ごと切り替え

---
## Amazon DLM (バックアップ管理)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746730/b06aa126-b9fe-d02a-6c82-421592332b5d.png)

- 「DLMはDiskのLifecycleをMaintain」
- EBSのスナップショットを効率的に管理・維持する
    
    → ディスクの寿命管理 → スナップショットの自動管理
## 違い
| No | 項目                     | AWS Elastic Disaster Recovery (AWS DRS)     | Amazon Data Lifecycle Manager (Amazon DLM)  |
|----|--------------------------|---------------------------------------------|---------------------------------------------|
| 1  | 主な目的                 | 災害復旧（Disaster Recovery）               | スナップショットの自動管理                  |
| 2  | 対象リソース             | サーバー全体（オンプレミスやAWSインフラ）   | EBSボリューム                               |
| 3  | 特徴                     | アプリケーションのフェイルオーバーと復旧    | 定期的なバックアップの作成・削除            |
| 4  | 主な用途                 | 障害や災害時にアプリケーション全体を復旧    | EBSのストレージ最適化とバックアップ運用     |
| 5  | 構成単位                 | サーバー単位                                | ボリューム単位                              |
| 6  | 使用するAWSサービス      | Amazon EC2、EBS、ネットワーク構成など      | Amazon EBS                                   |
| 7  | 自動化機能               | フェイルオーバー/フェイルバックの自動化     | スナップショットの作成・保持・削除の自動化  |
| 8  | 代表的なユースケース     | 別リージョンへの災害復旧                    | EBSスナップショットの管理                   |
| 9  | コストへの影響           | 災害復旧環境を構築するためコストが高め      | スナップショット管理でコスト最適化可能      |
| 10 | 利用開始の簡便性         | 比較的複雑（詳細な設計が必要）              | シンプルな設定で容易に開始可能              |
## まとめ
AWS DRSはアプリケーションごと丸替え、Amazon DLMはディスクの交換！
良いドキュメントを作るために気をつけたいポイント

## はじめに
いきなりですが皆さんはドキュメントを書くのが得意なほうでしょうか？
例えばプロダクトのREADMEや仕様書、社内マニュアル、Qiitaなどの技術発信系の記事など…ドキュメントを書く機会は多かれ少なかれあると思います。
私はドキュメントを書くのがとても苦手だなーと思っています😔
どう書いたらわかりやすいんだろう…と考えてムダに時間がかかりすぎてしまうこともしばしば…
書く機会以上に読む機会のほうが多いので、ほかの人のドキュメントを見て（理解しやすい文書構造だな）とか、（わかりやすい言い回しだな）と思うことがよくあります。
私も良いドキュメントを書けるようになりたいと思ったので「良いドキュメントの書き方」についてインプットしたことをまとめます。

参考：[エンジニアが一生困らない ドキュメント作成の基本](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E4%B8%80%E7%94%9F%E5%9B%B0%E3%82%89%E3%81%AA%E3%81%84-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90%E3%81%AE%E5%9F%BA%E6%9C%AC-%E4%BB%B2%E7%94%B0-%E5%B0%9A%E5%A4%AE/dp/4802614845)

## 個人的な結論
- 良いドキュメントを書くために気をつけたいポイント
    - できるだけ具体的に書く
    - 要点を先に言う
    - どこに何がかいてあるかわかりやすくする
    - 必要な情報だけを書く
    - ドキュメントは人対人のコミュニケーションの一つという意識を持つ

## 良いドキュメントってなに？
ドキュメントを読み書きすることは、何か目的を達成するための手段です。

書き手にとっての目的：何かを説明したり、報告したり、意見を伝えたり
読み手にとっての目的：必要な情報を得ること

この書き手と読み手の双方の目的を達成できることがドキュメントの役割。
そして良いドキュメントとは次のように定義できます。
- 必要な情報を正しく得られる
- 効率よく理解できる
- ポジティブに受け止められる

## 必要な情報を正しく伝えるために気をつけること
ドキュメントでは読み手に誤解なく情報を伝える必要があります。

具体的には下記を意識します。
- 明確な文章で書く
- できるだけ具体的に書く
- 誤解なく読める文章で書く

例えば「簡単に」「速やかに」「早めに」などは読み手によって解釈に差が出るような表現になります。また、「設定を確認してください」など設定がどうなっていればいいかがわからない表現も疑問を感じさせてしまう危険があります。
そのため**具体的な数字を使ったり、何をどうしてほしいかが伝わるような文章**に置き換えるとよいです。

例えば下記のような置き換え：
```
このMTGは早めに終わる予定です
👇️
このMTGは約20分ほどで終わる予定です
```
具体的な数字を使うことで曖昧さを排除できています

```
メールの設定を確認してください
👇️
メールのサーバー設定が「xxx」となっていることを確認してください
```
確認してほしい具体的な内容や手順を詳しく示すことで読み手が「何をどうすればいいのか」がわかるようになりました。


## 効率よく理解してもらうために気をつけること
まず、書き手はドキュメントをすべて読んでもらえるだろうと思ってしまいますが、実際には部分的に必要なところしか読んでもらえない事が多いようです。

確かに考えてみると、ライブラリのドキュメントや社内マニュアルのドキュメントを読むとき、必要な情報がありそうなところにあたりをつけ部分的に読んでいることがあるのではないでしょうか。
見出しをざっと眺めて、今必要としてる情報がありそうな章だけ読んだり。
検索キーワードをいれてヒットしたものからあたりをつけて読んだり。

このように読み手には目的があり、その目的が達成できそうな部分のみを読んでいる事が多いわけです。

そのためドキュメントを書く時は「流し読みされることを前提にして、それでも必要な情報が伝わる」ように意識することが大切です。
特に読み手は他にやることがある中でドキュメントを読んでいることが多いので**ドキュメントが「効率よく理解できる」状態にしてあると多くの人の時間が節約**できます。

具体的には下記を意識します。
- 要点を先に言う
    - 要点＋理由、説明、詳細のセットを心がける
- どこに何がかいてあるかわかりやすくする
    - アウトラインを整理し、内容が予想できる見出しをつける
- 話の流れを整理し、理解しやすくする
    - Aの話をしたあとにBの話、その後またAの話がでてくる、というような話がいったりきたりするような構造は読み手に負担がかかる
    - 書く前に全体を整理し順序立てて伝える
- 簡潔で読みやすい文章を書く
    - 一文一義（１つの文章に１つの意味）を心がける
    - ひとつの文章に含める情報をなるべく減らそうと意識することが大切
- 必要な情報だけを書く


## ポジティブに受け止められるよう気をつけること
ドキュメントでは情報を正しく効率的に伝えることを目指しますが読み手への心情を配慮することも大切です。
ドキュメントを書いて読んでもらうということは**人対人のコミュニケーションの一つ**です。
例えばプロダクトに関わるメンバーが増えたとき、できることならそのメンバーに良い印象を持ってもらいたいはずです。

ポジティブに受け止められるようにするには文章を肯定形で書くと効果的です。
同じ意味を伝える文章でも否定形と肯定形では受ける印象がまったく違います。

例えば下記の２文は同じ意味ですが、肯定形のほうがポジティブな印象を受けます。
```
「◯◯日までは対応できません。」
👇️
「◯◯日以降でしたら対応できます。」
```

また、肯定形で表現できる場合は、なるべく肯定形を使ったほうが文の意味がはっきりします。
読み手の行動を促したいときは、してもらいたい行動を具体的に書くと意味が明確になります。

逆に禁止事項などはあえて否定形で書くと効果的です。
「◯◯というファイルは編集しないでください」などです。

## さいごに
私自身、過去に素晴らしく整備されたドキュメントのおかげで作業がスムーズに進んだ経験があります。「これがあったおかげで助かった」と心底思いました。
ドキュメントは情報を伝えるだけでなく、読み手の行動を促したり、共通理解を深めたり、生産性を高めたり、未来の自分を救ったりするために重要なものだと感じています。
まだまだ試行錯誤中ですが、今回まとめたポイントを意識することで、より良いドキュメントを作れるようになりたいと思っています。
Google Geminiにネタをもらう話

# はじめに
Qiita Advent Calendar2024に今年から参戦していますが、
さすがに2週目からはネタが苦しいというか、記事のものが生まれにくい状況です。
せっかくGoogle Geminiが使えるので、ネタ出しからお願いしようという記事になります。
なお、Gemini Advancedをブラウザより使用しております。

# 使い方
Gemをみていると、「アイデア出しのプロ」なる、まさに求めていたGemがあったので、
まずは試してみます。
もちろん、プロンプトは「Qiitaのアドベントカレンダーのネタを考えて」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/2ac5c65b-a912-c2dd-4640-921f9ae8f0b4.png)

いつもどおり、質問が返ってきますね。
うーん方向性？それすら考えていないんですが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/7c4c1c85-48a4-3ce2-55bf-1aacfa267c67.png)

お、方向性が決まってない場合の質問もあるんですね。
素直に回答します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/88b5894d-37c2-64fc-1694-9052c505ad22.png)

なるほど、普段の開発技術をベースに提案してくれんですね。
画面貼るのもあれなので、以下テキスト(引用)でGeminiさんの提案を貼ります。

>了解しました！C#系のアプリケーション開発をされていて、生成AIを使って楽に生活することに興味があるんですね。読者層は幅広く、多くの人に見てもらいたいとのこと、承知しました。
>
>それでは、Qiitaアドベントカレンダーのネタとして、以下のようなアイデアはいかがでしょうか？
>
>### アイデア1：C#開発者向け「生成AIでコーディングを効率化！」
>
>**内容:**
>
>* C#開発で役立つ生成AIツールを紹介
>* Visual Studio Codeの拡張機能やGitHub Copilotなど、具体的なツールの使い方を解説
>* 生成AIを使ったコーディングの効率化Tips、注意点などを紹介
>* 読者層：C#の開発者、特に生成AIに興味がある人
>
>**詳細:**
>
>* C#の開発でよく遭遇する課題を、生成AIでどのように解決できるか
>* 例えば、繰り返しコードの生成、テストコードの作成、ドキュメント作成などを自動化
>* 生成AIの活用事例を交えながら、具体的なコード例とともに解説
>
>### アイデア2：「生成AIで作る！C#アプリ開発の自動化」
>
>**内容:**
>
>* 生成AIを使って、C#アプリケーション開発の自動化に挑戦
>* 単純なCRUD処理やAPIのモック作成などを自動化する
>* 生成AIのAPIを利用したC#コードの生成方法を解説
>* 読者層：C#の開発者、自動化に興味がある人
>
>**詳細:**
>
>* 生成AIのAPI（OpenAIなど）と連携して、C#コードを生成する
>* 自動化のメリット・デメリット、注意点などを解説
>* 今後の展望として、より高度な自動化の可能性について言及
>
>### アイデア3：「週末をハッピーに！生成AIで家事効率化」
>
>**内容:**
>
>* C#開発者以外も楽しめる、生成AIの活用事例を紹介
>* 生成AIを使った家事の効率化、週末の過ごし方などを提案
>* 例えば、レシピ作成、買い物リスト作成、旅行計画などを自動化
>* 読者層：生成AIに興味がある人全般
>
>**詳細:**
>
>* 生成AIで家事のタスクを自動化し、空いた時間で趣味や家族との時間を楽しむ
>* 具体的なツールやサービスを紹介し、使い方を解説
>* 読者の共感を呼ぶような、個人的な体験談などを交える
>
>これらのアイデアはあくまで例なので、ご自身の経験や興味に合わせて自由にアレンジしてくださいね。
>
>何か気になるアイデアはありますか？ もしくは、他に何か要望があれば教えてください！

案は3つ提示いただきました。

週末のお休みにこの記事を書いているんですが、
休みの日にC#のこと考えたくない。。
というわけで、消去法で
- アイデア2：「生成AIで作る！C#アプリ開発の自動化」

で決まりました。が、できる気がしない。
もう少し深堀してみましょう。

# 終わりに
案を提示いただいて、まぁ良かったのですが、
一番納得できていないのが、 *何でGeminiを使った提案がないんだ* というところです。
Geminiの活用方法とか提案してくれよって思いました。
もう少し対話したら出してもらえるんでしょうが、今日はここまで。
複数の音ファイルのVolumeを一定量に調整する(MP3Gain)

# 背景

アプリ内の複数の音声ファイルで、ものによって音量が違うものがあることが判明した。これを一定量にしたいと考え、調査した。

# 使用技術

今回はMp3Gainを用いて行うことにした。調べた感じAdobe等色々なソフトがあったが、これが一番UIがシンプルで分かりやすかったので用いた。

# 使い方

以下のサイトからダウンロード。
https://forest.watch.impress.co.jp/library/software/mp3gain/

起動、調整したいファイルを追加する。
追加方法はファイルを画面上に直接ドラッグアンドドロップ、もしくはAddFile、AddFolderから選択で追加できる。
TrackAnalysisでTargetVolumeとどれくらい差があるかを表示。

![ee96051186468406359db556ab78ba24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654136/91e4f915-9b48-1235-c867-2c6c3bf26f09.png)
TrackGainでTargetVolumeとの差を埋めたものがファイルに上書きされます。
![5e3dd22522f7f19bee4d2e248eeeac92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654136/357596aa-af74-14bd-c452-086f1c4f1b8a.png)
検証したのに冗長ルータが本番環境では切り替わらなかった話

もう10年ぐらい前の話なので懺悔として記載します。
# 背景
まだ駆け出しのネットワークエンジニアだった私は、先輩から「こういうルータ作ったんだけど動作検証しといて」と資料一式を渡されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334234/1b20d168-52b8-6caf-4f13-b77376995afc.png)

店舗の重要性が増してきたため、店舗のWAN回線を冗長化したいという商談でした。既存環境の設計書やコンフィグもあり、追加WANルータのコンフィグも既に先輩が作ってくれていました。私は試験仕様書を書き、検証環境を組み、冗長化試験を行いました。特にコンフィグを訂正することもなく試験は完了したため、先輩に引き渡しました。なのに・・・本番環境ではうまく動かなかったのです。
# 直接の原因
詳細は覚えてない部分もありますが、一言で言うと「**顧客側の環境を検証で再現できていなかった**」ということに尽きます。確か経路情報だったと思いますが、コンフィグの中で顧客L3#1を直接指定しているところがあり、本来は追加ルータでは顧客L3#2に指定する必要がありました。その設定ミスにより経路情報が途絶えてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334234/19a3c8cc-0def-3f4f-16d6-60b7192b7fe1.png)
もっとも動作検証のときなので本番業務を停止した状態で行っており、たいした影響もなく、コンフィグを1行修正するだけで直りました。めでたしめでたし・・・・
だったらこんな記事書いてないんですよねえ（涙

# 影響範囲
この回線冗長化は、実は**全国の約300店舗**で同様の作業を行うものでした。
検証結果を持って、全300台のルータへは設定投入も完了しているうえに、既に**現地の設置担当者へ配送済み**なのでした。
つまりー、この設定ミスを修正するには、日本全国を回る必要があり・・・・？？！？！？？

# 回避策
さすがにそれは忍びねえということで、設置担当者への設置手順書を修正し、現地の接続動作確認前にコンフィグを修正してもらう手順を追加しました。大変ご迷惑をおかけしました・・・

# 原因の深堀り
+ **新規導入するWANルータの冗長機能検証ばかりに目が向いており**、既存顧客ルータを試験するという意識がなかった。そもそも、既存顧客L3がどういう状態であれば正常なのかということも理解できていなかった。（ルータを超えて疎通確認さえできればよいと思っていた。）
+ 顧客L3のコンフィグや設計書を貰えていなかったため、**検証環境の顧客L3想定ルータは、一般的なL3を想像してコンフィグを自作していた。** 当然、顧客L3と同一機種を用意する方法もお金も時間もなかった。
+ 検証環境では顧客想定ルータに試験PCを直接接続していたが、このときは経路情報の交換ができていなくても通信ができてしまう環境だった。本番環境ではさらにその先にL3があることで経路情報が必要となり、障害が発覚した。
### さらに深堀り
+ 既存環境や顧客環境は、**これまで担当してきた先輩がよく知っているのだから**貰った情報で問題ないだろうと思い込んでしまった。（実際には先輩も知らない部分があった）さすがに先輩に「この情報ほんとに合ってます？」と聞くわけにもいかず。顧客担当者とも面識がない状態だった。
+ 責任分界点があるのだから、自社のルータで障害が起きれば責任をもって対処するが、**顧客側で何か問題があったとしたらそれは顧客側で対処すべき、という甘えがあった。**
+ **開発環境の顧客側L3をどこまでこちらで検証すべきか？** という議論ができていなかった。そもそも社内検証であり、検証項目は顧客担当者にレビューしてもらうものでもなかった。
## その他の反省点
+ プロジェクトスケジュールの都合なのか、**社内検証をもってキッティングを開始**してしまっていた。そもそも先行店舗での実環境試験を行い、それにOKが出てからキッティングを開始すべきだった。

# その後どうしたか
### 責任分界点は切ったうえでなるべく踏み込む
お金を頂いて作業する以上、責任範囲を明確にすることは最重要ですが、その上でそこを踏み越えて相手環境にもお世話をするようになりました。いわゆる「ポテンヒットを無くす」というやつです。（まあ、どうせヒットが出ると怒られるのはこちらなので・・・
ベンダーつぎはぎだらけのネットワークで、全体設計者などどうせいないので、俺がネットワークの全体設計者だ！という気概だけは見せるようにしました。それが要因で次のお仕事を頂くこともありましたので、ありがたい限りです。
### 接続仕様書を書くようにした
こちらのネットワークの基本設計書とは別に、接続仕様書として、IPアドレスやHSRPのID、ルーティングプロトコルの仕様などを記載したものを作成するようにしました。相手側機器には、こちらが想定している顧客側パラメーター欄を設け、お客様 **（の技術担当者）** にレビューしてもらうようにしました。
不思議なことに、お客様の商談担当者がOKを出した設計書を、接続先機器の技術担当者が見ていないことがあります。なぜなら、その技術担当者も他社ベンダーの技術者であり、レビューしてもらうのに金がかかる（ことがある）からです。
接続仕様書として要点を抽出し、「このパラメータが合ってないと接続できませんよ」と暗に迫れば、商談担当者もさすがによくわからないままOKは出せません。関係が良ければ直接資料を修正してもらったり、そうでなければこちらでヒアリングした結果を埋めたりしました。埋まらなかったとしても「このパラメータはうちは認識していないまま作業をしてますからね、それが原因で障害が起きても知りませんよ」という逃げ道を作ることができました。こうして大人は汚くなっていくんだ・・・


# 所感
ネットワークの検証環境はアプリとは違って、全く同じ環境を作れるというのは稀です。物理的・金銭的な制約がありますし、WAN回線なんて顧客と同じものをいちいち自社に引くことはできません。かといって、お客様に全部用意しろというのも酷な話です。
どうしても本番環境でないと正確な試験ができない項目はありますが、だからといって検証環境は大体でいいやという考え方では検証の意味がありません。
なので、ファームは本番と同一にしますよ、この機器は同一プロトコルが使える機器で代用しますよというような論点をまとめ、試験仕様書の最初のページでは「検証環境では何が確認できて、何が本番でしか試験できないのか？」を記載し、社内にもお客様にも合意を取ります。
その中で、「いやそれは検証が甘いのではないか？」という意見が出れば、機器を用意するなり期間を設けるなり、交渉の余地ができます。また、本番接続試験で失敗したとしても、「ここは検証環境では検証できていない部分です」という説明ができれば、~~そこそこ見逃してもらえ~~お客様の負担も多少は減るのではないかなと思います。

よきネツエンライフを！
Boxに入社したばかりの私が「便利！」と感じたBox機能

# はじめに
皆様こんにちは！
クリスマスまで早いもので残り10日。一段と寒くなりましたね\:snowman:
本日は、Box Japanに入社して6ヶ月目の私がBoxにどっぷり浸かった会社生活の中で、「便利！使いやすい！」と感じたBox機能を4つご紹介します。
これからBoxをご利用される初心者の方にも使いやすい機能ばかりですので、ぜひ最後までお読みいただけると嬉しいです！

# 共有リンク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949933/6b79d311-8acf-9785-7205-85016b3e88ca.png)

最初に挙げさせていただいたのは、一番使っていると言っても過言ではない「共有リンク」。Box上にある特定のフォルダ、ファイルを共有するためのリンクのことで、ファイルを直接送るわけではなく、URLの形でコンテンツを相手に共有できることが特長です。
相手がBoxアカウントを持っていなくても共有できるので、**社外の取引先やお客様に資料を安全に共有したい**という場合に非常に便利な機能です。

実は、私はBoxに入社する前からPPAP対策で共有リンクを使っていました。共有リンクに出会う前は、共有したい資料を暗号化してメールに添付して、資料を修正したらまた再送して…という手間が発生していましたが、共有リンクはそんな手間は一切なし！
Box上で資料を修正しても共有リンクのURLが変更になることはないので、相手にURLを再周知する必要もありません。

:::note info
共有リンクをより詳しく知りたい方はこちらをチェック！
・Box Support記事：**[Boxの共有方法とフォルダ構成の基本](https://support.box.com/hc/ja/articles/28011866230803)**
・Box Japan公式YouTube：**[メールの添付ファイルから脱却！：Box活用動画メール添付ファイル編](https://youtu.be/iT1D5Yw5Xgg?feature=shared)**
:::

# バージョン管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949933/e26476ea-075d-6a97-ba72-68dd507205e1.png)

便利と感じた機能2つ目は**バージョン管理**です！
Boxでは、ファイルのバージョンも管理することができ、ファイル名にバージョン番号を付けるようなマニュアル管理は一切不要となります。
Boxのプレビュー画面左上にあるバージョン番号をクリックすると、画面右側でバージョン履歴が表示されるようになっており、過去のバージョンをプレビュー・ダウンロードできたり、過去のバージョンに戻せたり、ということができます。

Boxでは当たり前のように備わっているバージョン管理機能。この機能を知る前の私は、ファイルを更新するたびにファイル名末尾にバージョン番号を記入し、古いファイルを別フォルダに退避して管理したり、更新前後のファイルを見比べて内容の差異を確認したり…と地味に負荷がかかっていました。働き方がかなり変わったと実感できる機能の1つです。

## アノテーション(注釈)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949933/ce7d4f76-be0d-7f06-bfee-0cc9056b940d.png)
便利と感じた機能3つ目は、**アノテーション(注釈)** です！
Boxプレビュー画面上で、画像やテキストの一部を指定し、コメントを残すことができる機能です。チームメンバーに資料のレビューを依頼された時、自分で作成した資料に忘れないようにコメントを残しておきたい時に大活躍する機能です。Boxのプレビュー画面上に書き込んでいるだけで資料に直接書き込んでいるわけではないので、「修正後にコメント消し忘れた…」なんてことがないのも安心かつ便利に使える特長です。

私自身、この機能に出会う前はメールやチャットに該当の資料を添付して、指摘事項を箇条書きして、フィードバックしておりました。が、指摘漏れがある場合は再送したり、きちんとフィードバックが反映されているかメールやチャットの内容と突き合わせて確認しなければならなかったりとかなり時間がかかっていたなと思います…
アノテーション(注釈)を使えば、今まで時間をかけていた資料のレビュー作業がかなり短縮されます！
もし、皆さんの中でメールやチャットを使ってフィードバックされている方がいらっしゃれば、ぜひアノテーション機能を使ってみることをおすすめします。

## Box Notes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949933/4aecfa99-4d76-5fb4-9428-808c37900bb1.png)
続いて４つ目にご紹介するのは、**Box Notes**。
皆さまの中でも既にお使いの方、多いかもしれません。私自身も仕事中必ず開いている、かなり重宝している機能です。
PCのメモ帳やWordのような使い方ができるドキュメント作成機能で、Box上で作成でき、Box上に自動保存されます。誰でも簡単に見出しや吹き出しなどを挿入して情報を整理することができ、何より複数メンバーとの共同編集が可能なことも本機能の特徴となります。

Box Notesを使う前は、それこそPCのメモ帳やWordを愛用していたのですが、Box Notesを使い始めて便利！と思ったのは何といっても「自動保存」でき、「スムーズに共同編集」できること。会議をする際に、Box Notesがあれば複数人で同時に意見や決まったことを書き込むことができ、1人で議事録を取って後から関係者に共有するよりも格段に作業効率が上がるなと実感しています。

## 最後に
いかがでしたでしょうか？
ここまでは、Box歴が短い社員の目線から記事をお届けしましたが、Box Japan公式noteでは、Box社員全員に聞いた好きなBox機能トップ5を知ることができます。

Box Japan公式note： **[「社内に聞いてみた！Box社員の好きなBox機能」](https://note.com/boxjapan/n/n84686e4b4b0c)**

Box利用歴にかかわらず愛されるBox機能が分かるかも\:bulb:
こちらもぜひご参考にしてみてくださいね！
toio と 3Dプリンタの組み合わせ： toio にかぶせて使えるモデルを出力してみた時の記録【toio-3】

この記事は、「[toio Advent Calendar 2024](https://qiita.com/advent-calendar/2024/toiotomo)」の 14日目の記事です。

- [2024年の展示イベントで見た toio が使われている作品の一部：利用されている技術【toio】 - Qiita](https://qiita.com/youtoy/items/af2a286061ec4c36fbd7)
- [toio で何かのキャラクターを動かす・生き物の見た目【toio-2】 - Qiita](https://qiita.com/youtoy/items/76131dec7722723ca085)

## はじめに
今回の記事の内容は、以下の記事に登場していた 3Dモデルなどの話です。

●ｾﾞﾝﾏｲﾁｬﾝ → Cubeboy for toio → ｾﾞﾝﾏｲtofuﾁｬﾝ - Qiita
 https://qiita.com/kenichih/items/e1554399719697f5952e

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ba7273fa-ccd2-9129-4dde-a749e51ef006.png)

具体的には [MakerWorld で公開されている「Cubeboy for Toio by hako85」](https://makerworld.com/en/models/83786
)になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/93bd69bc-8300-6e64-d8c4-c1b950551650.png)

## 出力
こちらを、「Bambu Lab A1 Mini」＋「Bambu Lab AMS lite」の組み合わせで出力してみました。 

AMS lite の 1回の出力で、複数の色を扱える機能は使ってないですが、ある色から別の色に切り替えるのを自動で行ってくれる操作を活用しました。

PCソフトで、フィラメントの色の変更やデータの送信を行ったのですが、ネットワーク越しに 3Dプリンタが置いてあるのとは別の部屋から行っています（出力完了したものを取りに行く際は移動が必要ですが）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/14e1148c-3022-9d9b-5092-ecc4041c3b07.png)

### 出力結果など
#### 出力したものに関するコメント
出力したものは、いくつか X でポストしたりしました。

そのうちの １つは、このような形でコメント・リポストしてもらえました。

https://x.com/UtaAoya/status/1867862231968616452

#### 今ある 4色全部で出してみた
最終的には、以下のように 4色全てで、個々のものは単色ですが出してみました。

https://x.com/youtoy/status/1867904815692677163

#### 出力中の様子の動画
ピンク色のものを出力している時は、途中の様子を少しだけ動画にとりました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/YW6bEBCLwQI?si=TxXow8EX07GRJFiR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

さらに、フィラメントは 4色あるので、別のバリエーションも増やしています。

## 過去に別の場所・機会で出力したもの
toio用に設計されたもので、今回のものとは別の 3Dモデルを、別の機会で出力していたことがありました。以下のようなものを出力しました。

https://x.com/youtoy/status/1791762236593283418

こちらは、上記の Qiita の記事を書いていた林さんが、Thingiverse で公開されているモデルの 1つです。

●Designs - Thingiverse
 https://www.thingiverse.com/ken1hayashi/designs

## 余談
今回の記事を書くにあたり、自分が「3Dプリンタ」という文言を含めて X にポストしているものを検索していました。

その際、いつか出力しようと思ってポストしたものの、忘れているものがでてきたのでここでメモしておきます。

### GitHub関連
どうやら、GitHub の中の人が（個人として？）公開している 3Dモデルがあるようです。
こちらは、技術コミュニティ・モノづくり界隈のつながりから、ある時に得ていた情報です。

https://x.com/youtoy/status/1718241777071853826

●martinwoodward/octolamp: A 3D printed, GitHub infused, smart light
 https://github.com/martinwoodward/octolamp/tree/main

●martinwoodward/PumpkinPi: Spooky build status indicator
 https://github.com/martinwoodward/PumpkinPi

これはぜひ試してみたいところです。

### ダイソー・光りもの関連
ダイソーのとあるアイテムと組み合わせて使う 3Dモデルです（サイズなどが合えば、ダイソーのもの以外でも大丈夫かと思いますが）。

https://x.com/shi78ge/status/1589981877657808896

●shi78ge/Snowman-Light
 https://github.com/shi78ge/Snowman-Light

ちょうど、今の季節に良さそうです。
ISUCONに初参加しました

この記事は [クラウドワークスグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/crowdworks) シリーズ1 の 23日目の記事です。

エンジニアをしている @sunakan です。

2024年12月8日(日)にISUCON14がありました。
会社の同僚と2人チームで、ISUCONに初参加しました。
この記事はISUCON初参加の振り返り・反省・感想になります。

## ISUCONとは

当日お題となるアプリケーションを高速化してスコアを競う大会です。
スコアはISUCON用のベンチマーカーが用意されており、どこのボトルネックがスコアに繋がるかは毎年変わりそうです。

また、他の項目としては以下のようになっています

|項目|内容|
|:---|:---|
|賞金|100万円※|
|時間|10:00~18:00(8h)|
|人数|1~3人で1チーム|
|言語|当日いくつか用意されている(例:Go,Ruby,...etc)|
|参加方法|2ヶ月前くらいに参加登録イベントがあるので、チームの代表がそれに登録する(メンバーは後で調整可能)|

※3位までは賞金が出たり、企業賞や言語賞もあったりなかったりします。詳細は [isucon14の受賞チームおよび全チームスコア](https://isucon.net/archives/58837992.html) をご覧ください

## 素振り・学習方法

主に学習方法として以下の方法を取りました。

- 過去問の他の方の回答コードを読んで真似る
- [達人が教えるWebパフォーマンスチューニング](https://gihyo.jp/book/2022/978-4-297-12846-3)の勉強会へ参加

## 結果：追試によりFAILでした(スコア:2,333)

終了してからしばらくは540位くらいだったのですが、追試で落ちていました。

## 競技に利用したリポジトリ

https://github.com/isucon-sunabayashi/isucon14

## 競技中の戦略やツール等

### インメモリキャッシュを積極的に利用

過去問の他の方の回答で勉強していると、「インメモリキャッシュ強すぎない？」というお気持ちになり、ガンガン使っていこうということにしました。

しかし、追試でFAILになっていました。
原因は「6.データ保持NG : 追試における負荷走行により作成されたデータが、再起動後に取得できませんでした」 とのこと。ちゃんとDBにもINSERT/UPDATEをしていたつもりですが、もしかしたら `ON UPDATE CURRENT_TIMESTAMP(6)` でインメモリキャッシュがうまくいかなかったかもしれません。（細かい原因は特定できずじまいです）

### Go言語を採用

近年のISUCONではGo言語の利用率が高く、テクニックなどはGo言語を前提に説明されている記事が多く、素振りもGo言語で行っていたためです。
そのため、本番もGo言語で対応しました。

### モニタリングツールは利用無し

NewRelicなどは、メトリクスの取得間隔が大きいのでやめました。
Prometheus等を利用してCPU使用率の取得などを検討していましたが、準備不足でやめました。

### ログやスロークエリを分析するのに `alp` と `pt-query-digest` を利用

[達人が教えるWebパフォーマンスチューニング](https://gihyo.jp/book/2022/978-4-297-12846-3) でも紹介されていた2つのツールを使いました。

理由としては勉強時も同ツールを使っており、慣れていたためです。
各種ツールに関しては、説明を省きます。

## 振り返り・反省

### 1時間で目標の1回目のベンチマークを回せた

最初はお決まりのことをするので準備がしやすく、最初の目標である11:00までに1回目のベンチマークを回せたのは良かったです。

もっと自動化を駆使して30分くらいで1回目のベンチマークを回せるようにしたいです。

### モブ形式ですると尚良かったかもしれない

戦略的にインメモリキャッシュを多用するつもりでしたので、最初から分業でやっていました。（結局はそれが原因で、追試にFAILしていましたが）
インメモリキャッシュのプログラミングで夢中になってしまい、もったいなかったです。
せっかくのチーム戦で初参加でしたので、1手1手丁寧に確認しながらできると良かったなと振り返って思います。

### インメモリキャッシュ用のコードのデバッグに時間をかけすぎた

DBに都度クエリを発行せずに済むように、メモリにデータを保存しておくインメモリキャッシュは最初から戦略に入れていたものの、ベンチマーク前のデータの整合性がおかしかったりして、printデバッグで時間を溶かしてしまいました。
次はもっと練度を上げて臨みたいです。


### 最後の仕上げとしてログをOFFするのを忘れていた

スロークエリログなど、チューニング用にログ類を有効化したままでした。
0点は回避したかったので、残り20分くらいは確実に点数が残るようにしたのはいいものの、ログを無効化するくらいはできたかなと思います。

### DBのindexが効いてないことに気づいたのは終了30分前位で、原因は競技中はわからなかった

17:30頃(終了30分前)にpt-query-digestのスロークエリをEXPLAINしてみると、index貼ったはずなのに効いてないことに気づきました。
ローカルからリモートに対してindexを貼っていたのですが、DBに入って直接index貼った後ベンチマークを回すとindexがなくなっていることに気づきました。
原因は競技中わからずじまいでした。
競技終了後に `DROP TABLE` がベンチマーク前の初期化時に行われていたことに気づきました。
indexはDBに直接貼るのではなく、マイグレーション用のSQLに貼るべきでした。


## 感想

難しかった & 疲れましたが、それ以上に楽しかったです。
オンライン参加でしたが、LIVE中継による参加者の熱量はとても刺激になりました。
次があることを願って、来年は入賞できるよう素振りをたくさんしたいです。
GAS-kintoneメモ

# GAS~kintone連携

```JavaScript
const appId = "100"; 
const apiToken = "---"; 
const subdomain = "---"; 
const book = SpreadsheetApp.openByUrl(
    'https://docs.google.com/spreadsheets/d/xxxxxx/edit?gid=0#gid=0'
);

const FLAG = 4
function myFunction() {
  const sheet = book.getSheets()[0];
  const data = sheet.getDataRange().getValues();
  data.splice(0, 1);

  for (let i = 0; i < data.length; i++) {
    const row = data[i];

    if (row[FLAG] == 1) {
      continue;
    }

    console.log(row[2]);

    addKintoneRecord(row);

    //ヘッダは抜いている。
    const cell = sheet.getRange((i + 2), (FLAG + 1));

    console.log(row[0])
    // console.log(cell.getValue());

    cell.setValue(1);

  }
}

function addKintoneRecord(row) {

  const url = `https://${subdomain}.cybozu.com/k/v1/record.json`;

  // Replace with the data you want to add to the Kintone app
  const recordData = {
    "文字列__1行_": { value: row[1] },
  };

  const payload = {
    app: appId,
    record: recordData
  };

  const options = {
    method: "post",
    headers: {
      "X-Cybozu-API-Token": apiToken,
      "Content-Type": "application/json"
    },
    payload: JSON.stringify(payload)
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const result = JSON.parse(response.getContentText());
    Logger.log("Record Added: %s", result);
  } catch (e) {
    Logger.log(e.stack)
  }
}
```
Zoom定例会議に遅れず参加できるようになる方法 (Mac)

## はじめに
毎日のHuddleや、毎週X曜日の定例などタスクに集中していると忘れてしまうことありませんか？
そんなつい忘れがちな定例会議に遅れず参加するため、会議zoomを自動で起動する設定をしたので書いていこうと思います。

## 手順
#### Automatorの設定
まずAutomatorを起動して、Calender Alarmを設定していきます。
下の画面でCalender Alarmを選択して、Choose。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/64159008-2833-52e8-0ce4-dc8d1fc4b1b0.png)
その後の画面で"Run Shell Script"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/e3d0c004-772e-7f1e-f324-248ce6b400a7.png)
ここに、会議のzoomを開くためのスクリプトを登録していきます。zoomのパスワードとDialを確認して、以下のスクリプトをコピペしてください。
```bash
open "zoommtg://zoom.us./join?confno=${YourDial}&pwd=${YourPass}"
```
パスワードは招待リンクに埋め込まれている、暗号化されたものでも大丈夫そうです。
アラームを会議名などわかりやすい名前で登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/90e97fdd-75ce-4d48-217e-bc37d576df79.png)

#### Calendarの設定
Calendarを開くと、Automatorの枠が追加され、今日の日付に先ほど設定した会議が入ります。
あとはrepeatの設定を変更し、時間を会議の前にアラームが動くようにするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/e402fc91-40e1-bbcc-12de-efe2fa5b25f8.png)

ちなみに設定したAlarmは以下のディレクトリで確認することができます。
```bash
ll ~/Library/Workflows/Applications/Calendar
total 0
drwxr-xr-x@ 3 araiWorks  679754705    96B 12 14 18:00 test huddle.app
```
## 最後に
zoomを開くだけでなく、他にもたくさんAutomatorで自動化できそうですね!
参考になれば幸いです🍏
DockerでWordPressを試してみる②

# はじめに
WordPressはよく聞きますが、仕事として触ったことはありませんでした。
縁あって、触る必要がでてきましたので、簡単にどんなものか勉強がてら試してみます。
前回は、dockerを立ち上げて、設定画面が表示されたところまで。

# WorkPressのインストール
設定画面で必要情報を入力していきます。
まぁ、おためしなので適当です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/55bb6911-782d-d2b0-bb6c-647e8007edef.png)

んで、「Install WorkPress」を押下！
秒で完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/669d58ac-7798-07a4-d3e5-c2322d904cac.png)

そのままログインすると、ダッシュボードが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/e4d18e3c-944b-218b-1251-2d5dea534c79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/5590213d-6fac-ae9b-67a0-360227dfbc5e.png)

# WorkPressのテーマインストール
もうこの段階で記事は書けるのですが、
テーマを設定してみます。
いくつかサイトを参考にしましたが、Cocoonというのが良いということで、入れてみます。
https://wp-cocoon.com/downloads/

<br/>

手順は簡単で、上記サイトよりダウンロードしたzipファイルを、左側メニューの
Appearance > Themes を押下し、Add Themes右側の「Upload Theme」を押下し、
ダウンロードしたファイルを選択するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/2092d8c2-a4e1-c353-91d6-c71e2d4b7c88.png)

# WorkPressに記事を投稿
では、引き続き記事を書いていきます。
上部メニューの「+」から「post」を押下すると、新規記事作成画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/8742c771-616f-febf-7efb-109f41796b3d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/f6bf0b5f-8cd0-4748-ac37-3c3b881d9272.png)

とりま適当なタイトルと内容を書いたら、
右上にある「publish」を押下で完了です。
特にマニュアルとか見ていないですけど、直感的に操作できるのはいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/50991975-c6a7-5d3f-8126-7a95594add5b.png)

では、仮想マシン(AlamaLinux)のipアドレスをブラウザに打ち込むと…
それっぽい作りになっていますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/3b12d7ad-7b00-c80c-5118-888dc642b67f.png)

いったん必要最小限のものはできたので、
次回はこれをFirebaseにアップロードしたいと思います。
ROS2のrobot localizationが実機でodomを出力しない

# 状況
環境：ros2 humble
[Navigating Using GPS Localization](https://docs.nav2.org/tutorials/docs/navigation2_with_gps.html)を試していた．
※githubにあるnavigation2 tutorialのhumbleブランチではnav2_gps_waypoint_follower_demoパッケージは準備されていないので，rollingブランチから直接持ってきた．

「2- Setup Navigation system」の
```
ros2 launch nav2_gps_waypoint_follower_demo gps_waypoint_follower.launch.py use_rviz:=True
```
まで実行するとシミュレーションが立ち上がり，robot_localizationにより，
base_footprint->odom 
odom->map
のtfをパブリッシュさせることができた．

:::note warn
nav2のhumbleバージョンではfollowGpsWaypoints(wps)メソッドがまだ実装されていないので，「3- Interactive GPS Waypoint Follower」以降は実行できない．
:::

これを実機のセンサデータでlocalizationしてみたい．
しかしなぜかtfがパブリッシュされなかった．

# 原因
nav2_gps_waypoint_follower_demoのlauchファイルを書き換えたため，parameterの{"use_sim_time": True}を消し忘れていた．
上手くいかなかったrobot_localizationを立ち上げるlaunchファイルの中身
```code:dual_ekf_navsat.launch.py
---（省略）
    return LaunchDescription(
        [
            launch_ros.actions.Node(
                package="robot_localization",
                executable="ekf_node",
                name="ekf_filter_node_odom",
                output="screen",
                parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
                remappings=[("odometry/filtered", "odometry/local")],
            ),
            launch_ros.actions.Node(
                package="robot_localization",
                executable="ekf_node",
                name="ekf_filter_node_map",
                output="screen",
                parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
                remappings=[("odometry/filtered", "odometry/global")],
            ),
            launch_ros.actions.Node(
                package="robot_localization",
                executable="navsat_transform_node",
                name="navsat_transform",
                output="screen",
                parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
                remappings=[
                    ("imu/data", "imu/data"),
                    ("gps/fix", "gps/fix"),
                    ("gps/filtered", "gps/filtered"),
                    ("odometry/gps", "odometry/gps"),
                    ("odometry/filtered", "odometry/global"),
                ],
            ),
        ]
    )

```

robot localizationはセンサデータのトピックのtime stampを見る．
今回はセンサデータのtime stampは現実の時間になっている．
しかしuse_sim_time=Trueにしたせいでrobot_localizationはシミュレーションの時間を使うことになり，センサデータはlocalizationの考慮に入れられなかった．
よってtfがパブリッシュされなかったと考えられる．

# 反省
robot_localizationに関する情報がほぼ英語で理解が薄かったため，どこが悪いのか探すのにとても時間がかかってしまった．
シミュレーションでは動くのに実機のデータでは動かない場合，
time stamp関連
サブスクライブするトピック名
などをチェックしてみてほしい．
VertiTab - サイドパネルの縦型タブ v2.14.0

こんにちは皆さん！VertiTabが v2.14.0 にアップデートされました！

Chromeブラウザで究極のサイドバータブ管理を体験しましょう。便利な新機能が盛りだくさん！

インストールはこちらから: 

https://chromewebstore.google.com/detail/chejfhdknideagdnddjpgamkchefjhoi?hl=ja


- プレミアム版
  - 🪄 AIスマートグループ化を追加
  > ![AIグループ化](https://static.rabbitpair.com/public/assets/guide/ai_grouping_1.gif)

- 最近アクセスしたタブ機能を追加し、最後にアクセスした5つのタブを表示。ショートカットキー「r」または下部ナビゲーションにクイックナビゲーションを追加
 > ![最近アクセスしたタブ](https://static.rabbitpair.com/public/assets/guide/show_recently_accessed_tabs.gif)

- クイックスイッチタブショートカットを追加。1秒以内に番号を入力して対応する番号のタブに切り替え

 > ![クイックスイッチタブ](https://static.rabbitpair.com/public/assets/guide/num_quick_switch_tabs.gif)

- ツリー型タブメニューオプションを追加：
  - ホバー時にアイコンを表示。有効化時、ツリーノードにホバーするとアイコンが表示されます
  - リストの高さと左インデントのカスタム調整
- グループの背景色の透明度調整
- Shiftキーでタブを複数選択、右クリックメニューを追加
  - リンクをコピー
  - タイトルをコピー
  - Markdown形式でコピー（タイトルとリンク）

### 変更

- 高度なピクチャーインピクチャーを最適化
  - 字幕がサポートされている場合、デフォルトで有効
- 自動スナップショット、プレミアム版は最大20、無料版は最大5
- カスタムメニューに「すべてのメニューを展開」を追加

### 修正

- 切り替え後にページが自動的にスクロールダウンする問題を修正
- プレミアムユーザーとしてログインした後もプレミアム期限切れポップアップが表示される問題を修正（機能には影響なし）
- 高度なピクチャーインピクチャーを最適化し、Disney+の字幕が正しく表示されない問題を修正



---
PowerShellを利用してmp4を手軽に圧縮する方法

SlackやDiscordなどにmp4の動画を共有したいとき、サイズがやたら大きくて困る時がありました。そんなときに役に立つスクリプトを紹介します。

## 前提条件

圧縮処理にはFFmpegを使用します。FFmpegがインストールされていない場合は、Chocolateyを使って簡単にインストールできます。

```powershell
# 管理者権限でPowerShellを開き、以下のコマンドを実行
choco install ffmpeg -y
```

## 単一の動画ファイルを圧縮する

1つのmp4ファイルを圧縮する場合は、以下のコマンドを使用します：

```powershell
ffmpeg -i "input.mp4" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "compressed_output.mp4"
```

実際の使用例：
```powershell
ffmpeg -i "講義動画.mp4" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "圧縮済み_講義動画.mp4"
```

## フォルダ内の全mp4ファイルを圧縮する

フォルダ内にある全てのmp4ファイルを一括で圧縮する場合は、以下のコマンドを使用します：

```powershell
Get-ChildItem -Filter "*.mp4" | ForEach-Object { ffmpeg -i $_.FullName -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k ("compressed_" + $_.Name) }
```

## 特定のファイル名パターンに一致する動画を圧縮する

例えば、「lecture」という文字列を含むmp4ファイルのみを圧縮する場合：

```powershell
Get-ChildItem -Filter "*lecture*.mp4" | ForEach-Object { ffmpeg -i $_.FullName -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k ("compressed_" + $_.Name) }
```

## 圧縮設定のカスタマイズ

### パラメータの説明

- `-c:v libx264`: H.264コーデックを使用
- `-crf 23`: 品質設定（値の範囲: 0-51）
  - 低い値 = 高品質・大きいファイルサイズ
  - 高い値 = 低品質・小さいファイルサイズ
  - 18-28が一般的な使用範囲
- `-preset`: エンコード速度と圧縮効率のバランス
  - 選択肢: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
  - 速い = 大きいファイルサイズ
  - 遅い = 小さいファイルサイズ
- `-c:a aac`: 音声コーデック
- `-b:a 128k`: 音声ビットレート

### カスタマイズ例

#### 高品質優先の設定
```powershell
ffmpeg -i "input.mp4" -c:v libx264 -crf 18 -preset veryslow -c:a aac -b:a 192k "high_quality_output.mp4"
```

#### サイズ重視の設定
```powershell
ffmpeg -i "input.mp4" -c:v libx264 -crf 28 -preset medium -c:a aac -b:a 96k "small_size_output.mp4"
```

#### 処理速度重視の設定
```powershell
ffmpeg -i "input.mp4" -c:v libx264 -crf 23 -preset veryfast -c:a aac -b:a 128k "fast_process_output.mp4"
```
AWS Babelfishとは

# 学習前
ベビーフィッシュ？

## AWS Babelfish（バベルフィッシュ）とは
- 正式名称は「Babelfish for Aurora PostgreSQL」
- Microsoft SQL ServerのアプリケーションをほぼそのままAmazon Aurora PostgreSQLで実行できるようにする機能

## 何が良いの？
- 既存のSQL Serverアプリケーションやツールを大幅な修正なしでAuroraに移行することができる

## 特徴
- Microsoft SQL Server互換性
    - T-SQL（Transact-SQL）クエリやストアドプロシージャをサポート
    - Microsoft SQL Server固有のデータ型や関数、構文も対応
- 低コストな移行
    - アプリケーションコードやデータベーススキーマの大幅な変更を必要とせず、移行コストを削減
    - 高額なSQL Serverライセンスを節約可能
- Amazon Aurora PostgreSQLの性能とスケーラビリティ
    - Auroraの高性能、高可用性、スケーラブルなデータベース環境を利用可能
    - 従量課金制でコスト効率の高いデプロイ
- 既存ツールとの互換性
    - SQL Server Management Studio（SSMS）やその他のSQL Serverツールをそのまま使用可能

# ユースケース
- SQL Serverからクラウドへの移行
    - コスト削減とクラウドのスケーラビリティを活用したい企業向け
- レガシーアプリケーションのモダナイゼーション
    - 古いSQL Serverアプリケーションを廃止せず、現代のインフラ上で運用を継続
- ライセンスコスト削減
    - 高額なSQL Serverライセンスの回避
# 実行手順
1. Aurora PostgreSQLクラスターを作成
    - AWSコンソールまたはCLIでAurora PostgreSQLクラスターを立ち上げる
2. Babelfishを有効化
    - クラスター作成時にBabelfishオプションを有効化
3. SQL Serverデータの移行
    - データ移行ツール（例: AWS DMS）を使用してデータをAuroraに転送
4. 接続設定
    - SQL ServerクライアントをAurora PostgreSQLに接続するためのエンドポイント設定

## 注意点
- BabelfishはSQL Serverの全ての機能に対応しているわけではない（例：CLR機能には非対応）
- PostgreSQL特有の機能を利用する場合、SQL Serverとの互換性を維持するための調整が必要

# まとめ
- Microsoft SQL Serverのアプリケーションをほぼそのまま修正せずにAmazon Aurora PostgreSQLで動作させることを可能な機能
Vertex AI Vector Search のパフォーマンス検証 vol.1

vol.2 があるかはわからない。

### 検証方法
下記条件の元、query 数を増やしながら近傍探索を実行し応答時間とスループットを確認した。
- embedding の次元数: 128
- index 内の embedding 数: 約 4,000,000
- 取得する近傍 embedding 数: 30
- index をホストする node 数: 1

※ [VPC ネットワーク ピアリング接続](https://cloud.google.com/vertex-ai/docs/vector-search/setup/vpc?hl=ja#vpc-network-peering-setup) は設定していない。

### 結果
query 数ごとの応答時間とスループットは以下の通り。
query 数を 100,000 まで増やすと `None Stream removed` が発生するようになった。
[VPC ネットワーク ピアリング接続](https://cloud.google.com/vertex-ai/docs/vector-search/setup/vpc?hl=ja#vpc-network-peering-setup)を設定したり、index をホストする node の数を増やせばパフォーマンスを改善できる。

| query 数 | 応答時間 [sec.] | スループット [query 数/sec.] |
|:-:|:-:|:-:|
| 1 | 0.16 | 6 |
| 10 | 0.17 | 58 |
| 100 | 0.23 | 434 |
| 1,000 | 0.67 | 1,499 |
| 10,000 | 5.04 | 1,982 |
| 100,000 | - | - |

### 使用コード
`NUM_TOTAL_QUERIES` を変えながら以下のコードを実行した。

```python
import time
import numpy as np
from tqdm import tqdm
from google.cloud import aiplatform_v1


API_ENDPOINT="xxxxxx.xxxxxx.vdb.vertexai.goog"
INDEX_ENDPOINT="projects/xxxxxx/locations/xxxxxx/indexEndpoints/xxxxxx"
DEPLOYED_INDEX_ID="xxxxxx"
QUERY_VECTOR_DIM = 128
NUM_NEIGHBORS_TO_SEARCH = 30
NUM_TOTAL_QUERIES = 1
# NUM_TOTAL_QUERIES = 10
# NUM_TOTAL_QUERIES = 100
# NUM_TOTAL_QUERIES = 1000
# NUM_TOTAL_QUERIES = 10000
# NUM_TOTAL_QUERIES = 100000


# Configure Vector Search client
client_options = {
  "api_endpoint": API_ENDPOINT
}
vector_search_client = aiplatform_v1.MatchServiceClient(
  client_options=client_options,
)

# Prepare request
queries = []
for _ in tqdm(range(NUM_TOTAL_QUERIES)):
    datapoint = aiplatform_v1.IndexDatapoint(
        feature_vector=np.random.rand(QUERY_VECTOR_DIM).astype(np.float32),
    )
    query = aiplatform_v1.FindNeighborsRequest.Query(
      datapoint=datapoint,
      neighbor_count=NUM_NEIGHBORS_TO_SEARCH
    )
    queries.append(query)
request = aiplatform_v1.FindNeighborsRequest(
    index_endpoint=INDEX_ENDPOINT,
    deployed_index_id=DEPLOYED_INDEX_ID,
    queries=queries,
)

# Execute nearest neighbor search
start_time = time.time()
_ = vector_search_client.find_neighbors(
    request
)
end_time = time.time()     
consumed_time = end_time - start_time
throughput = NUM_TOTAL_QUERIES/consumed_time

print("performance stats")
print("="*20)
print("consumed time [sec]")
print(f"{consumed_time:.2f}")
print("-"*20)
print("throughput [query/sec]")
print(f"{throughput:,.0f}")
```
TCPサービス・モデル

>TCPサービスは送信者と受信者にソケット(socket)と呼ばれるエンド・ポイントを生成して利用する。各ソケットは、ホストのIPアドレスとポート(port)と呼ばれるローカルな16ビットのソケット番号（アドレス）を持つ。ポートはTSAPのTCP名である。TCPサービスを利用するには、返信マシン上のソケットと受信上のソケット間でコネクションを明示的に確立する必要がある。

### ソケットはコネクションは両端のソケット識別子により識別する
>ソケットは、同時に複数のコネクションを収容することができる。言い換えると、二つ以上のコネクションが同じソケット上で動作してよい。`コネクションは両端のソケット識別子(socket1,socket2)により識別`され、仮想回線番号や他の識別子は、利用されない。

### inetdは複数ポートを割り当て実行すべき時だけアクティブにする
>ブート時に、FTPデーモンを21番ポートに、SSHデーモンを22番ポートに、のように個別に割り当てることも可能であるが、デーモンはたいていアイドル状態であるので、割り当てたメモリが無駄になる。そこで、通常行われるのが、`一つのデーモン(UNIXではinetd(internet deamon))を通常立ち上げ、それに複数のポートを割り当てる方法`である。最初にコネクションが入ってくると、inetdは新しいデーモン・プロセスをクォークし、それに要求を処理される。このようにして、`inetd以外のデーモンは、それが実行すべき時だけアクティブ`になる。inetdは、どのポートを使うべきかについては、コンフィギュレーションファイルを利用して知る。80番のように要求が頻繁に来るポートのデーモンは常駐させ、他ポートはinetdが管理するように設置する

### TCPは各コネクション二つずつ持っている
>TCPコネクションは全二重で、ポイント・ツー・ポイントである。全二重とは、トラフィックが同時に両方向に流れることができるという意味で、ポイント・ツー・ポイントは各コネクションが必ず二つのエンド・ポイントを持つということである。TCPはマルチキャストやブロードキャストをサポートしない。

### TCPはバイトストリームであり受信プロセスでは、送信プロセスがどのように書いたかは判断できない。
>　TCPコネクションは、`バイト・ストリームであり、メッセージ・ストリームではない`。`メッセージの境界はエンド・ツー・エンドで保存されない`。例えばもし送信プロセスが四つの512バイトのデータをTCPストリームに書いたとしよう。これらのデータは、受信プロセスでは、四つの５１２バイトの固まり、二つの1024バイトの固まり、一つの2048バイトの固まりなどのように受け取られる。`受信プロセスでは、送信プロセスがどのように書いたかは判断できない`。
 UNIXのファイル・アクセスもこのような特性を持つ。ファイルの読み取り側は、ファイルがブロック単位で書き込みされたのか、バイト単位なのか、あるいはすべてのが一度に書き込まれたのかは分かり得ない。これと同様にTCPソフトウェアはバイトがどうのような意味を持つかわからないし、分かろうともしない。バイトはただのバイトである。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

### 感想
* バイトストリームとは？
* メッセージストリームとは？
未経験の人が転職活動でエンジニア職に行きたいなら‥

### ポートフォリオをしっかり書くこと！！！


今回、この投稿で皆さんが言ってくれていると思いますが、まさしく鍵は「ポートフォリオ」です。

初めは、自分のWEBサイトがないといけないかな？ポートフォリオのために何か作らないと！と思って、転職活動自体を後回しにしていましたが、
「転職活動のためになにか作らないといけない。」ということはありません。　私は、以下２つを職務経歴書に貼りました。

① kaggle

https://www.kaggle.com/risakashiwabara

② qiita

https://qiita.com/riicon72/items/97ac1c630e152f9deb66


たったこれだけです。
それで、営業職　→　社内開発エンジニア　になりました。
エンジニアでも一概に異なりますが、この２つでも「エンジニア職に行かせてください」と言えるように、本気で取り組みました。

## 具体的にしたこと

主に行ったのはこちらです。

① kaggleのNotebookをExpertにする
② kaggleのDatasetをMasterにする
③ Notebookを「初心者がデータを可視化したい時にみたい、Notebookにする」
④ 全体的に、色や画像を入れて見やすいようにする
⑤ 海外の人ともコミュニケーションとっているアピールするために毎日discussionでコメントする
⑥ Discodeのコミニュティー内で連絡取り合うようにする
⑦ コメントしてくれたら、絶対コメントし返す


## 今、全力で取り組んでいることでいいんです

あ、でも取り組むのは他の人に見せられるものですよ（会社の機密文書をポートフォリオにはしてはいけないです）

エンジニアになる方々は、勉強は当たり前で、学びを勉強と思っている人も少ないです。そんな面接官に「何時間で勉強しました」「何ヶ月で習得しました」よりも「こんなことかできます」「これ作ったことあります」の方が意外とささるかもしれないです。

ここまでqiita見てくれている方でなら、情報吸収能力は高いと思います。
応援しています！
Android15の重要そうな差分まとめ

# はじめに
Android14が出てきたのがつい先日のように感じますが、もうAndroid15がリリースされましたね。
Android14ではフォアグラウンドサービス関連の差分が多かった認識なのですが、15ではどうでしょうか？
先んじて重要そうな差分を備忘録的にまとめておこうと思います。

# 最小ターゲットSDKバージョンの引き上げ

> Android 15 では、 24 未満の targetSdkVersion はインストールできません。

https://developer.android.com/about/versions/15/behavior-changes-all?hl=ja&utm_source=chatgpt.com#minimum-target-api-level

とのことです。
Android7である24でも2016年なので、8年前以上・・・
これを機に最小バージョンをしっかり見直してもらうのも良いと思います。

# フォアグラウンドサービスの変更
今回のバージョンでもフォアグラウンドサービスに関しての差分がいくつかあります。

### 1. 新しいサービス種別の追加

> Android 15 では、新しいフォアグラウンド サービス タイプ mediaProcessing が導入されています。

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja#mediaprocessing-fgs-type

とのことで、15より**mediaProcessing**という新たなフォアグラウンドサービス種別が導入され、メディアファイルのダウンロードや変換時にバックグラウンドでの処理が可能となります。
ただし、過去24時間で合計6時間の実行制限がありますので、この点については注意が必要です。

### 2. BOOT_COMPLETEDブロードキャストレシーバーに関する制限

> BOOT_COMPLETED ブロードキャスト レシーバに対する新しい制限事項がリリースされます フォアグラウンド サービスの場合。BOOT_COMPLETED レシーバーは、API 呼び出しを起動できない フォアグラウンド サービスのタイプを使用できます。

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja#fgs-boot-completed

特定のサービス種別（該当の種別は以下）は、**BOOT_COMPLETED**ブロードキャストを受信しても起動できなくなります。 

- dataSync
- camera
- mediaPlayback
- phoneCall
- mediaProjection
- microphone

以前はアプリが**SYSTEM_ALERT_WINDOW**権限を保持している場合には特例的にフォアグラウンドサービスを起動することが可能でしたが、15よりこの特例に関する条件がかなり限定的になります。
Android15では上記権限に合わせて表示可能なオーバーレイウィンドウの対応が必要になります。
フォアグラウンドサービスを起動する前にまず**TYPE_APPLICATION_OVERLAY**ウィンドウを起動し、そのウィンドウを表示する必要があります。

また、Android14でも同様だったと思いますが、アプリが上記要件を満たさずにバックグラウンドからフォアグラウンドサービスを起動しようとすると、システムは **ForegroundServiceStartNotAllowedException**をスローする点に注意です。

# インテントのセキュリティ強化

> Android 15 では、インテントをより安全かつ堅牢にするために、新しいオプションのセキュリティ対策が導入されています。この変更は、悪意のあるアプリによって悪用されるおそれのある潜在的な脆弱性やインテントの不正使用を防止することを目的としています。Android 15 では、インテントのセキュリティに関して、主に 2 つの改善点があります。

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja&utm_source=chatgpt.com#safer-intents

以前のバージョンアップでもインテントに関する修正を含んでいることがありましたが、Android15でも2点差分がある点に注意です。

### 1. ターゲットのインテント フィルタに一致させる
特定のコンポーネントをターゲットとするインテントは、ターゲットのインテントフィルタの仕様に正確に一致する必要があります
基本的に一致していないことの方が現状では珍しい気がしますが、受信側と送信側できちんと揃える必要があります。

### 2. インテントにはアクションが必要
アクションのないインテントは、インテントフィルタと一致しなくなります。
当然と言えば当然なのですが、アクティビティやサービスを起動する際には、明確に定義されたアクションをインテントに設定するようにしましょう。

# ウィンドウインセットの変更

> Android 15 のウィンドウ インセットに関連する変更点は 2 つあります。エッジ ツー エッジがデフォルトで適用されます。もう 1 つは、システムバーのデフォルト構成などの構成の変更です。

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja#window-insets

差分は二つありますが、重要なのは前者であるエッジツーエッジがデフォルトでつく点ですね。
デフォルトで設定されてしまうということは、適切にインセットを処理しないとUI要素がシステムバーの背後に隠れる可能性があります。

エッジツーエッジを対応しているプロジェクトと対応していないプロジェクトで確認すべき観点が異なるので、以下該当する方を熟読し早めにご確認いただくことをオススメします。

エッジツーエッジ対応済み

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja#already-edge-to-edge

エッジツーエッジ非対応

https://developer.android.com/about/versions/15/behavior-changes-15?hl=ja#already-edge-to-edge

# さいごに
今年も残すところ半年、早過ぎる・・・
sshキーの作成方法

ゴール
---
・sshキーのペアを作成する

私は、さくらのVPSサーバーで登録するために作成しました。
SSHを登録すると以下のような操作が可能になります。

・CyberDuck等のFTPソフトで安全にサーバへファイル送信できる(SFTP)
・ターミナルから遠隔でサーバを操作できる
```
# 接続例
% ssh ユーザ名@ホスト名 -p ポート番号
```

手順
---
### .sshフォルダに移動
ターミナルを起動し、以下の手順で実施してください。

<details><summary>使用コマンド解説</summary>
pwd : Present Working Directory, 作業ディレクトリの表示<br>  
cd : Change Directory, ディレクトリを移動<br>
mkdir : Make Directory, ディレクトリ作成<br>
ssh-keygen : 恐らくssh key generate, 公開鍵と秘密鍵のペアを作成<br>
ls : list, ディレクトリ内のファイルを列挙<br>
cat : concatenate(つなぐ), ファイルの中身を表示 
</details>

```
# ホームディレクトリにいるか確認
% pwd
/Users/ユーザ名

# .sshに移動
% cd .ssh

# 以下の表示が出れば正しく実行できている
% pwd
/Users/ユーザ名/.ssh
```

以下のエラーが出た場合
```
# .sshファイルまたはディレクトリが見つかりません
cd: no such file or directory: .ssh

# .sshフォルダを作成
% mkdir ~/.ssh
```
---
### sshキーを作成
```
# ファイル名をid_rsaに設定
# -fオプションでファイル名を設定
% ssh-keygen -f id_rsa
```
質問は全てEnterを押しました
(恐らくファイルを開く際のパス設定をするかどうかや,ファイル名などの項目?)

```
# sshキーが作成されたか確認
% ls
id_rsa		id_rsa.pub

# 公開鍵の中身を確認
% cat id_rsa.pub
ssh-ed25519 鍵の文字列 ユーザ情報やメールアドレス等
```

---
参考
[sshキー(秘密鍵・公開鍵)の作成と認証　流れ]
https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d