OmniAICreator/Qiita-1.07M huggingface dataset:
Anthropic consoleの新機能Prompt Improverを使ってみた

## はじめに
こちらの記事で概要を紹介したPrompt Improverを実際に使ってみました。

https://zenn.dev/shirochan/articles/1e8dcc6599b8a5

## 実践
### 準備
Prompt Improverとは任意のプロンプトを改善プログラムに通すと、最適化されたプロンプトが返されるという仕組みです。

任意のプロンプトを入力しどのように改善したいかという指示を与えます。

今回は任意のプロンプトと修正ポイントの指示は以下のような内容にして実践してみました。
```
この記事を日本語に翻訳して400文字程度にわかりやすく要約してください。

{{article}}
```
```
アウトプットが長すぎる。
日本語では理解しづらい文章になっている。
プロンプトは日本語で出力してください。
```

### 実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/e617ef8a-961b-0557-af05-56974ace052d.png)


最適化プロセスは、プロンプトを改善するための計画を作成することから始まっているようです。
こちらは英語の出力ですがどのような計画を立てているかが見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/a10810e7-787a-34d5-4d79-e6ab047a797e.png)

そして最初のドラフト案が作成されていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/5bc77eb9-e126-2e5e-82e6-16167f362821.png)

最初のドラフト案を見直し修正ポイントを見つけて修正していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/b92f0310-c774-95b0-b2f7-80c45d7539ae.png)

最終的な修正後、最適化されたプロンプトの最終ドラフトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/48391e13-bcd8-7791-aebf-8aec7a75e6c4.png)

6ステップ目で完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/0fd103d9-ef7f-e7a8-3495-518dd0b850fa.png)


最終的に仕上がったプロンプトがこちら。

```
あなたは、英語の記事を日本語に翻訳し、要約する優秀な翻訳者兼編集者です。以下の英語の記事を日本語に翻訳し、約400文字でわかりやすく要約してください。

まず、記事の内容を確認してください：

<article>
{{article}}
</article>

以下の手順に従って作業を進めてください：

1. 記事の主要なポイントを特定し、リストアップします。
2. 特定したポイントを日本語に翻訳します。
3. 翻訳したポイントを約400文字の要約にまとめます。
4. 要約の文字数を確認し、必要に応じて調整します。
5. 最終的な要約が読みやすく、自然な日本語表現になっているか確認します。

要約を作成する際は、以下の点に注意してください：
- 直訳を避け、日本語として自然な表現を使用してください。
- 重要なポイントを簡潔に伝えることに焦点を当ててください。
- 文章は読みやすく、わかりやすいものにしてください。

作業の各段階で、<翻訳と要約のプロセス></翻訳と要約のプロセス>タグ内にプロセスと考えをまとめてください。最終的な要約は<要約></要約>タグ内に記述してください。

それでは、作業を開始してください。
```

## 実際にプロンプトを使ってみた
今回は実際にこちらのURLの記事の英文を与えてテストしてみました。
https://www.anthropic.com/news/prompt-improver

出力された要約がこちらです。


> Anthropicは、AIモデル「Claude」のプロンプト（指示）を改善し、より効果的に活用するための新機能をAnthropic Consoleに導入しました。
新たに実装されたプロンプトインプルーバーは、既存のプロンプトを自動的に最適化する機能を提供します。具体的には、チェーンオブソート推論の追加による系統的な問題解決、XML形式での例示の標準化、例示の充実化、プロンプトの構造明確化などを行います。
また、プロンプトに例示を追加・管理する機能も実装され、入出力のペアを明確に示すことで、Claudeの応答品質を向上させることが可能になりました。さらに、プロンプト評価機能により、様々なシナリオでのテストと性能のベンチマークが可能になっています。
これらの機能により、多層分類テストでは精度が30%向上し、要約タスクでは単語数の遵守率が100%に達するなどの成果が報告されています。実際の導入事例として、技術系ナレッジベースをAIアシスタント化する企業Kapa.aiでは、これらの機能を活用してClaudeへの移行を効率的に実現しています。

# 関連書籍

- [プログラミング知識ゼロでもわかる プロンプトエンジニアリング入門](https://amzn.to/4hPB1eX)
- [大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書](https://amzn.to/3CzGGWs)
- [ChatGPTを使い尽くす！　深津式プロンプト読本](https://amzn.to/4fRwqH8)
Weztermの設定ファイルを分ける方法

weztermの設定を`wezterm.lua`に全部書いていたのですが、流石に見づらいので変更しようと思います。

# weztermのいじり方

weztermのいじり方はこの記事で紹介しています。

https://qiita.com/maooz4426/items/cd1b15a38f4bf166b8f8

# 設定ファイルの分け方。

下のようなディレクトリで分けようと思います。

```zsh:zsh
.
├── colors
│   └── custom.lua
└── wezterm.lua
```

色の設定をcolorsディレクトリに`custom.lua`を作成してそこにカラースキーマ等を記述したとしようと思います。

下のように`custom.lua`を作成します。


```lua:custom.lua
local config = {}

local custom = {
    -- カラー設定
    purple = '#9c7af2',
    blue = '#6EADD8',
    light_green = "#7dcd5d",
    orange = "#e19500",
    red = "#E50000",
    yellow = "#D7650C",
}

-- カラー設定
config.colors = {
    foreground = 'silver',
    selection_fg = 'red',
    cursor_bg = custom.blue,
    cursor_fg = "white",
    cursor_border = custom.purple,
    tab_bar = {         
        inactive_tab_edge = "none",
    },

    ansi = {
        'black',          -- 0: Black
        custom.red,      -- 1: Custom Red
        custom.purple,   -- 2: Custom Purple
        custom.light_green, -- 3: Custom Light Green
        custom.blue,     -- 4: Custom Blue
        custom.yellow,   -- 5: Custom Yellow
        'teal',           -- 6: Custom Cyan
        'silver',         -- 7: Custom White
      },
      brights = {
        'grey',     -- 8: Custom Bright Black
        'red',      -- 9: Bright Red
        'lime',     -- 10: Custom Bright Green
        'yellow',   -- 11: Bright Yellow
        'blue',     -- 12: Bright Blue
        'fuchsia',  -- 13: Custom Bright Magenta
        'aqua',     -- 14: Custom Bright Cyan
        'white',    -- 15: Bright White
      },
}

return config
```

空のテーブルを作成してそれを返すようにします。

次に`wezterm.lua`を以下のようにします。

```lua:wezterm.lua
local wezterm = require 'wezterm'
local config = wezterm.config_builder()

function merge_config(config, new_config)
	for k, v in pairs(new_config) do
		config[k] = v
	end
end

local colors = require("colors/custom")
merge_config(config, colors)

return config
```


`config_builder()`部分は、設定することができるkeyがあるかどうかをバリデーションしてくれる特殊なユーザーデータ型を返していて、configはテーブル構造になっています。

```lua:lua
local config = wezterm.config_builder()
```

設定ファイルごとに返していたテーブルに設定されたキーから、`config_builder()`で作成されたテーブルのキーに対して上書きするようなメソッドを下のように作成します。

```lua:lua
function merge_config(config, new_config)
	for k, v in pairs(new_config) do
		config[k] = v
	end
end
```

`require`をつかって、ディレクトリとファイルの名前を指定することで返したテーブルを変数に代入することができます。
```lua:lua
local colors = require("colors/custom")
```

これを先ほど作った関数に入れることで、設定を上書きすることができます。
```lua:lua
merge_config(config, colors)
```

# weztermの設定ファイル

私が作成した設定ファイルは下にあります。
ぜひ参考にしてください。

https://github.com/maooz4426/wezterm-dotfiles
【ガチ初心者】VSCodeのModern Fortran拡張機能でfortlsのパスを設定する

 コンピュータ関連の系統立った知識はなく、行き当たりばったりで問題を解決している大学院生です。
 諸事情でリモートマシンの vscode の設定を全削除してしまって、また Modern Fortran の設定をする際に少しだけ苦労したのでメモ。

 リモートマシンはlinuxの何かです。こまかいことはわからない。

 # なぜ、fortlsのパスを通すべきなのか
 ガチ初心者の人は、そもそも fortls とは何ぞや。という感じだと思います。私もあんまりよく分かっていないので、説明しません。しかしながら、fortls のパスを通しておかないと、下のエラーメッセージが vscode を起動するたびに出てきてむかつきますよね？Disabel fortls とすれば、パスの設定をせずともこのメッセージが出てこなくなると思いますが、情報社会からのリタイアを宣言しているようで悔しいです。というわけで、このメッセージが出ない様にするために、 fortls のパスを通しましょう。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986754/43d0b35b-3e45-9d25-807d-c406f8de5dca.png)

# 方法
 vscode fortls path とかで検索すると、setting.json がどうのとか出てきますが、ガチ初心者の人はすぐにブラウザバックして、おとなしく設定を開いてください。"Ctrl+,"でもいいですし、 左下の歯車でもOK. 設定タブが開けたら、検索欄に"Fortran"と入れてください。すると、以下のようになるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986754/71fc9178-1106-32b6-9803-434a51710610.png)

「ココ」と示した箇所に、fortlsの絶対パスを書けばすべてが解決します。

 # パスはどこ？
 人によると思いますが、pipでfortlsをダウンロードした私の場合は、/home/username/.local/bin/fortls でした。
 エラーメッセージをよく読むと、fortls のバイナリファイルの場所を教えてくれと言っているので、/bin に入っているfortlsを指定すればいいですよね。私はずっと~/lib/python3.X/site-packages/fortlsを指定し続けて、全然うまくいきませんでした。
 アプリケーション？というのは、実行ファイルと、それを補助するファイルで成り立っているんですね。前者は/bin, 後者は/libに入っているそうです。また一つ賢くなった。

 # fortlsでできること
 あんまりよく分かっていないとは言いましたが、一応少しは活用しています。
 * サブルーチンor関数にジャンプする機能
 * 組み込み関数の説明
 * 自動入力
 こいつらは fortls を入れた恩恵ですよね？それすらもよく分かっていない。

 おわり
Jetson向けのperfをビルドする

# まとめ

配布されてなかったので[ビルドできるようにしました](https://github.com/uzuna/jetson-misc/tree/main/perf-tool)。

## prefとは

[パフォーマンスカウンタを使用したプロファイリングののためのツール](https://perfwiki.github.io/main/)です。
アプリケーションのパフォーマンスチューニングで計測をするためには使えます。
ところでprefのカウンタはlinuxに深く依存している、というかLinuxのツールであり、カーネルバージョンにあったバイナリが必要です。

Ubuntuなどでは``apt install linux-tools-`uname -r` ``のようにカーネルバージョンを指定してinstallができたりしますが、Jetsonでは配布されていなかったりします。
自前でビルドが必要です。

### Jetsonにおけるprefのビルド

prefはL4Tのソースコード、カーネルのツール郡の中に含まれています。
`Linux_for_Tegra/source/kernel/<kernel-dir>/tools/perf`
自前でカーネルの変更をしている場合はこちらを一緒にビルドしても使えます。

ですが、それだけではすべての機能がつかえるわけではありません。
パフォーマンスカウンタとしてアクセスできる機能や、計測結果を処理するためにpythonなどスクリプトと連携するなどができ、そのためには実機の中で然るべきライブラリとともにビルドをすることで機能が使えます。

### perf with flamegraph

可視化として[flamegraph](https://www.brendangregg.com/flamegraphs.html)が使いたいです。
perfにもこの機能は取り込まれておりpythonと合わせてビルドをする必要があります。
ファイルの配置はカーネルビルドとほとんど同じなので[R35,R36についてはMakefileで配置可能にしています](https://github.com/uzuna/jetson-misc/tree/main/perf-tool)。

Jetson上にcloneして、適切なパッケージをinstallして、ビルドをすることで有効なperfが作れます。

```sh
sudo apt install libdw-dev libdwarf-dev python3-dev 

make -C perf-tool build
```

スクリプトは適切なパスへのは位置も必要なので、すべてを`/opt/perf`への配置という形でdebパッケージを作れるようにしています。
debを作るのに[go-bin-deb](https://github.com/mh-cbon/go-bin-deb)を使っています。


計測と表示は以下のとおりです。d3-flame-graph(同梱のindex.html)で`stacks.json`を開けばflamegraphが見れます。

```
# イベントにアクセスするために権限付与
sudo sysctl kernel.perf_event_paranoid=0

# record
/opt/perf/perf record -a --call-graph dwarf -F 99 <application command>

# export Flamegraph(stacks.json) from perf.data
/opt/perf/perf script report flamegraph -f json
```
【ChatGPT】ADHDのメリットをPromptに組み込んでみた。


　どうも、カーブミラーです。

　今回は、ADHDのメリットをPromptに組み込んでみました。もとのニュースがあります。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　ニュースもないので、
　　さっそく、本題です。

　今回は、
　　ADHDのメリットを
　　　Promptに組み込んでみました。

　GIGAZINEさんのニュースで
　　興味深いものがありましたので、
　　　そこから、Promptを作りました。
[ADHDの特性をハックして生産性を爆上げする方法](https://gigazine.net/news/20231116-hack-adhd/)

　まずは、
　　ウェブ検索で
　　　ADHDのメリットを調べて、
　　　　それをもとにPrompt作成を
　　　　　依頼しました。

　こちらが
　　ChatGPTが
　　　検索した結果です。
>ADHD（注意欠如・多動症）は、一般的に注意力の欠如や多動性、衝動性といった特性が知られていますが、これらの特性は適切に活かすことで以下のようなメリットとなることがあります。
>
>1. 高い創造性と独創的な発想力 ADHDの特性を持つ人は、独自の視点や新しいアイデアを生み出す能力に優れていることが多いとされています。 ​​
>
>2. 強い集中力（過集中） 興味のある事柄に対しては、非常に高い集中力を発揮し、長時間にわたり作業に没頭できることがあります。 ​​
>
>3. 高いエネルギーと行動力 多動性や衝動性は、エネルギッシュで行動的な性格として現れ、新しい挑戦や変化を積極的に受け入れる力となります。 ​​
>
>4. 柔軟な思考と適応力 注意が散漫になりやすい特性は、同時に複数の情報や視点を取り入れる柔軟性を持ち、変化する状況への適応力を高める要因となります。 ​​
>
>5. レジリエンス（回復力） 困難や挫折を経験する中で、それを乗り越える力が養われ、精神的な強さや回復力が高まることがあります。 ​​
>
>これらの特性は、適切な環境やサポートがあれば、個人の強みとして活かすことが可能です。​​

　これを作成に
　　使った結果が
　　　こちらのPromptになります。
```Text:ADHDメリット問題解決Prompt
「＊＊＊」

上記の問題に対し、ADHDの以下の特性（高い創造性、強い集中力、高いエネルギー、柔軟な思考、レジリエンス）を活用した解決策を提案してください。また、それぞれの特性がどのように役立つかを具体的に説明してください。
```

　＊＊＊に問題点を書き入れてください。

　これを使うと
　　以下の項目が出力されます。
　　　1. 高い創造性
　　　2. 強い集中力
　　　3. 高いエネルギー
　　　4. 柔軟な思考
　　　5. レジリエンス
　　　最後にまとめ

　アイディアを求めたところ、
　　なかなか面白いものが
　　　出力されました。

　また、Promptの最後の
　　“また、それぞれの特性がどのように役立つかを具体的に説明してください。”
　　　は不要かもしれません。
　　　　余分な説明が出るので
　　　　　私は削除して使いました。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
裂肛エンジニアのAWS認定 DOP受験記録😁✌️

この度
 - AWS Certified DevOps Engineer - Professional(以下DOPと記載)

に合格しましたので、勉強方法や試験の有益性について記録します。
※守秘義務に抵触しないよう、出題された問題に関する内容は記載していません。

## 前提
既に以下認定資格を取得している状態で受験しました。

 - AWS Certified Cloud Practitioner(CLF)
 - AWS Certified Solutions Architect – Associate(SAA)
 - AWS Certified SysOps Administrator - Associate(SOA)
 - AWS Certified Developer - Associate(DVA)
 - AWS Certified Solutions Architect - Professional(SAP)

## 受験動機
SOAの期限が切れそうだったので、SOAとDVAの上位資格であるDOPを取得して更新を図るために受験をしました。

結構しんどいので次回の更新については悩み中です

## 受験回数
1回

## 得点
![スクリーンショット 2024-11-17 20.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715905/3e6c67fc-4797-2c65-7c83-fa121624d093.png)


## 勉強方法
### 総勉強時間
30-40時間程
ほぼ業務の休憩時間と通勤時間のみです。試験前日のみ自宅でも勉強しました。

### 使用した教材
 - CloudTech クラウドテック
   - ほとんどこの教材が合格に寄与したと思います。<br>不正解選択肢についてもそれぞれが何故駄目なのかを考えられる方であればこれだけでいいと思います。
 - ブラックベルト
   - Codeシリーズなど、よく取り扱われるものの全く触ったことのないサービスについてはこれで知識補充しました。

## 勉強の進め方
最初からCloudTechの問題を解き進めていきました。
CloudTechの問題約200問を3周しました。
また、解いている最中に自分の知識・理解が浅いと思ったサービスについては通勤中ブラックベルトを参照しました。

## 感想
勉強を通じて運用の自動化・効率化をどう実現するか学ぶことができ、有用だったと感じました。

一方CI/CDについては現在Github Actionsを使用するケースが多い印象があるため
役に立つかはプロダクトに大きく依存すると思います。

これからCI/CDを構築したい、あるいはすでにCodeシリーズを使用している方にとっては有益だと思います。

正直なところは僕の場合はCI/CDの分野についてはそこまで役に立たないと感じました。
MySQLのPartitionテーブルを調査するSQL

# MySQLのPartitionテーブルを調査するSQL

MySQLのPartitionテーブルを使用している場合、各パーティションに含まれる行数を調べたり、全体の行数を取得することができる。これはデータの分布状況を確認する際や、パフォーマンスの最適化に役立つ。以下に、Partitionテーブルの行数を調べるSQLクエリとその解説を紹介する。

## Partitionテーブルの行数を調べるSQL

```sql
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'your_database_name'  -- データベース名を指定
    AND TABLE_NAME = 'your_table_name'   -- テーブル名を指定
UNION ALL
SELECT
    'TOTAL' AS PARTITION_NAME,
    SUM(TABLE_ROWS) AS TABLE_ROWS
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'your_database_name'  -- データベース名を指定
    AND TABLE_NAME = 'your_table_name';  -- テーブル名を指定
```

### クエリの説明

1. **INFORMATION_SCHEMA.PARTITIONS**:
   - `INFORMATION_SCHEMA.PARTITIONS`は、MySQLでパーティション情報を取得するためのメタデータが格納されているテーブルだ。これを使用して、各パーティションに関する情報を取得できる。

2. **SELECT PARTITION_NAME, TABLE_ROWS**:
   - `PARTITION_NAME`: 各パーティションの名前を取得する。
   - `TABLE_ROWS`: 各パーティションに含まれる行数を取得する。注意点として、この行数は概算であり、必ずしも正確ではないことがある。

3. **WHERE句**:
   - `TABLE_SCHEMA = 'your_database_name'`: 調査対象のデータベース名を指定する。
   - `TABLE_NAME = 'your_table_name'`: 調査対象のテーブル名を指定する。

4. **UNION ALL**:
   - `UNION ALL`を使って、各パーティションの行数に加えて、全パーティションの合計行数も取得する。

5. **SUM(TABLE_ROWS)**:
   - 全パーティションの行数を合計するために`SUM`関数を使用する。

## 実用例

### 1. パーティションの行数を確認する

たとえば、大量のデータが格納されたパーティションテーブルがある場合、各パーティションにどの程度のデータが分散されているかを確認できる。

```sql
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'sales_db'  -- データベース名を'sales_db'に指定
    AND TABLE_NAME = 'sales_data';  -- テーブル名を'sales_data'に指定
```

### 2. 全体の行数を取得する

各パーティションの行数に加えて、全体の行数も確認する場合は、上記のクエリ全体を使用する。

```sql
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'sales_db'
    AND TABLE_NAME = 'sales_data'
UNION ALL
SELECT
    'TOTAL' AS PARTITION_NAME,
    SUM(TABLE_ROWS) AS TABLE_ROWS
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'sales_db'
    AND TABLE_NAME = 'sales_data';
```

### 注意事項

- **TABLE_ROWSの精度**: `INFORMATION_SCHEMA.PARTITIONS`の`TABLE_ROWS`は概算値を返すことがある。正確な行数が必要な場合は、実際のクエリを使用してデータを集計することを検討する。
- **パーティションの種類**: パーティションの種類によっては、データの分布が異なることがあるため、パフォーマンスやストレージ使用量を最適化する際に役立つ情報となる。
走り続けているエンジニアになろう

## 主旨
- 情熱をもって走り続けているエンジニアはミドル以上になっても十分に結果をだせる。

## 想定する読者
- ミドル以上のエンジニア
- 中途採用の業務を行なっている担当者

## 本文
ミドル以降のエンジニアを中途採用しようとする企業の場合、こういう心配をしながら、面接にのぞんでいると推測する。「このエンジニアは、仕事に情熱をもって取り組んでくれるだろうかと」


エンジニアといっても人それぞれである。

学卒・院卒の採用だったら、大学名などでフィルタリングして、
期待通りでも期待はずれでも、採用担当者の責任にはならないと思われているだろう。
しかしミドル以上の人員の採用では、採用の結果が期待はずれだったら、採用担当者の責任をとわれやすいだろう。だから、ミドル以上の採用に対しては慎重になりやすい。

人事だけしか経験していない人事の担当者の場合、どうしても、他の人の判断が気になる。
トップの方針とかに敏感だし、募集している実務の内容に何が必要かは異分野すぎて、他の人の判断を仰がなくてはならない。
それでいて、多数の応募書類の中から、事前の絞り込みをしなくちゃいけない。

ミドルのエンジニアといってもいろんな人がいる。
・チームの取りまとめに徹している人
・その分野の最新を調査し、利用可能な実装を利用し付けている人
・その分野の標準的な流儀の変化をきちんとトレースし続けている人
・若い人から学ぶことができる人

またこういう人もいるだろう。
・最新の技術動向にうとい人
・何かをきちんとやり遂げることができない人
・同じ失敗を何度繰り返しても気にしない人
などなど

それらの状況のため、ミドル以上の採用に躊躇（ちゅうちょ）する場合もあるだろう。

採用担当者にとっては、前者の人であることが伝わることがうれしい。

## ソフトウェアエンジニアの場合
- OSSのライブラリや学会の論文を調べて、その結果を技術ブログにすることができる。
- 業務と関係なしに開発しているコードを公開することもできる。
- 職業的にコードを書いている場合には、その会社の方針が全てだ。
- もし可能ならば、可能な範囲はオープンソース化するように働きかけるのも手だ。
- 多大な成果をOSSのコミュニティから得ているのだから、それもありだろう。
- 意味のある技術の発信はできる。
そういった意味のある発信を積み重ねていくことだ。


## 新しい分野を学び続けている実績を示していこう
- ミドルのエンジニアは、新しい技術分野を取り込んでいくのが苦手だというように思っている人が多い。
- 実際苦手な人もいるだろう。
- しかし、あなたがそうでないことをわかるようにしておこう。

## 仕事を離れて実現したい野望はあるか
- 実現したい野望に対して、何を実際に行動しているのか
- 行動を何もしていないならば、それは野望と言えない。
- 行動している人は、開発課題を自走できるエンジニアである可能性が高くなる。

## エンジニアとしての美意識はあるか
- あることを成し遂げるためには、そのための行動の指針が必要になる。
- その行動様式は、証明されたような明解なものではない。
- しかし、自分のエンジニアとしての取り組みを成功するものにしていくためには、そういったものが必要になる。
- いくつか選択肢があって、不十分な情報を元に判断しなければならないときに、何を選択するかというものだ。

## 自分の成果を大事にしよう。
- 誠実に課題に取り組もう
- 引き継ぎを大事にしよう。

## 走り続けているエンジニアは、別の場所でも走れる。
- 走り続けているエンジニアであれば、これからも走り続けてくれることが期待できます。
- そういう部分が伝われば、一緒に仕事に取り組んでくれると期待できます。

## 自分の判断が間違えている可能性を常に念頭におこう
- 正しい判断だけができる人なんていやしない。
- 間違えた判断をしてしまうことも多い。
- 自分の何気ない発言が、他の人を無自覚に傷つけてしまうことも多い。
だから、自分の判断が間違えている可能性を常に念頭におこう。

## 助けを求めること
業務上の課題を独力ですべて解決できることはない。
　課題のいくつかは、あなたひとりではどうしようもないところにある。
　機械学習だったら、学習・評価用のデータセットの取得。
　ユーザーサイドからの要望の明確化には、営業からの情報も必要だろう。
　ビジネス上の価値と、その時点での技術が可能にしていることとは、常にかけはなれている。
## 走り続けているエンジニアは、もっと先にたどり着ける。
- 「その分野の技術の進展がすごい」
　それって、あなたも成し遂げたかったことですよね。
　それが今実現されていることを喜びましょう。
　そして、それを利用してもっと先にすすむことを考えましょう。

## 次の場所で走り続けるためには
- 走り続けているエンジニアであることを示すこと
- 新しいことを学び続けていることがわかるようにすること
#### 走り続けているエンジニアであることが、わかってもらえるためには
- StackOverFlowに質問をなげたり、回答したりしよう。
- よく使っているライブラリに不具合があったら,Issureを書こう。

#### 採用者視点に適合するエンジニアであることが書類上でも伝わりやすくするように職務経歴書を書いてあるか

[良いエンジニアを採用するための方法論](https://qiita.com/dorarep/items/b9f7f6ff6e1bc344cf0a)

## まとめ：中途採用を通りやすくするためのポイント
- [ ] 自分の関わったもので、外部発表されているものを示そう。
	- [ ] そのうちのどこに関わったかを示そう。
	- 世の中に公開されている製品のどこを開発したなどのわかりやすい成果があれば、それを記載する。そういうものを開発したチームの一員であることで、親しみを感じてもらう。
	- [ ] 特許・論文があれば示そう。
	- 特許や論文は、その人が自分で開発のループを回していけるエンジニアであることを伝えるのに重要。
- [ ] 自身のGithub や 技術ブログがあれば示そう
- [ ] StackOverFlow に質問をなげたり、回答していたりする場合には、その時のアカウントを示そう。
- [ ] - その分野を取り組んでいく上での十分なバックグラウンドを持ち合わせてることを伝えること。
- [ ] 採用者視点に適合するエンジニアであることが書類上でも伝わりやすくするように職務経歴書を書いてあるか
    -[良いエンジニアを採用するための方法論](https://qiita.com/dorarep/items/b9f7f6ff6e1bc344cf0a)



###### 法的には
[募集・採用における年齢制限禁止について](https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/topics/tp070831-1.html)

> なお、求人票は年齢不問としながらも、年齢を理由に応募を断ったり、**書類選考**や面接で年齢を理由に採否を決定する行為は法の規定に反します。

私見：書類選考の時点では、職務経歴書だけにしてはどうだろうか。
その人の職務上の実績に対して集中できるはずだ。
AIのことを知る為にG検定に挑戦する

# AIのことを知る為にG検定に挑戦する

## なぜG検定に挑戦するのか
理由はシンプルで、**既にそういう時代** だからです。
AIのことを理解し、それを上手に活用できるようになれないと、今後どんどん時代に置き去りにされかねません。（そう思ってます）
ただ、私はAIのことなんか全然知らないので、いきなりやってみると言っても腰が重いのが現実です。。。
なので、ここで挑戦することを宣言して、頑張って行動に移していこうと思います。

## そもそもG検定とは
HPから引用
> G検定とは、一般社団法人日本ディープラーニング協会（JDLA）が実施する、AI・ディープラーニングの活⽤リテラシー習得のための検定試験です。 AI・ディープラーニングに関わる全ての方が受験対象です。 AI・ディープラーニングについて体系的に学ぶことで、「AIで何ができて、何ができないのか」「どこにAIを活用すればよいか」「AIを活用するためには何が必要か」が理解でき、データを活用した新たな課題の発見やアイデアの創出が可能になる、デジタル施策の推進に自信が持てるようになるなど、あなたのビジネスやキャリアの可能性が飛躍的に広がります。

https://www.jdla.org/certificate/general/

つまり、AIについて基礎的なことを理解していると証明できる資格ぽい。

公式ページから過去問の例題を見たが、どうやら4択問題で暗記ゲーという感じだった。
> 以下の文章を読み、空欄に最もよく当てはまる選択肢を1つ選べ
人工知能は有限の処理能力しかないため、現実に起こりうる問題すべてに対処することができない (　) がある
A）フレーム問題
B）ブラックボックス問題
C）シンボルグラウンディング問題
D）最適化問題

## 勉強方法
### 勉強方法
では実際にどういう方法で勉強していくのかというところを考えていきましょう。
サクッと調べてみた感じ、一般的なのは、書籍や過去問サイト、動画学習があるぽい。

今回は書籍を購入して勉強してみようと思う。
購入するのは「最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版」です。
評価数もそこそこあって、評価も良いので安心ですね。
https://amzn.asia/d/3bMQnab

### 記録方法
あとは、勉強の記録を残して復習できるようにもしていきたいですね。
記録ツールはNotionを使ってみようと思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842690/a7dcfee7-9702-3e87-f45a-2e834a43a9e5.png)
こんな感じで日別の記録を取っていきます。

## 今後のスケジュール感
### 受験日
まずはいつ頃受験するんだって話ですね。
一般的に、2～3か月前から勉強を始めて、30～50時間程度で合格している人が多いようです。
大体1週間で4～5h勉強している換算ですね。
ただ私は暗記が凄い苦手なので、少し期間は長めに設定したいと思います。
4～5か月くらいで設定してみましょう。
そうなると、G検定は年6回(1, 3, 5, 7, 9, 11月)に開催しているらしいので、**2025年5月**を目標に考えてみます。

### 大日程
とりあえず、受験日の目途は立てられたので、次はそれに向けてざっくりと大日程を考えてみます。

- 12月中に、書籍を1週する
- 1月からは実際に問題に取り組む
- できなかった所は書籍等で確認する
    - これらを繰り返す

一旦こんな感じで勉強やっていきます。
次回は12月中にまた投稿します。

以上。
パケット溢れ防止のアルゴリズム

### リーキー・バケツ・アルゴリズム
>そこに小さな穴の空いたバケツを想像してみてほしい。水がバケツに入る速度にかクァラズ、バケツから出る水の流速は一定値Rである。

>ネットワークへ流入するパケットのシェイピングやポリシングに用いることろができる。各ホストは、リーキー・バケツを備えたインターフェースを介してネットワークへ接続し、バケツに空きがあるときだけ、パケットをネットワークに送りことができるようする。

> バケツが満タンの状態の時に送られたパケットは、キューに追加されてバケツに空きができるまで待たされるか、破棄される。

>前者のキューへの追加は、ホストのオペレーティングシステムによるトラフィック・シェイピングの過程で行われる

>後者はパケットの破棄は、プロバイダのネットワーク・インタフェースのハードウェアにおけるトラフィック・ポリシングの過程で行われる

### トークン・バケツ・アルゴリズム
>水道の蛇口から流速Rで水がバケツに入れられており、バケツの容量が、Bであるとする。

>パケットを送信するためには（バケツに水をれるのではなく）バケツから水、つまり一般に中身と呼ばれるトークンを取り出せるようにしなければならない。バケツには一定数以上のトークンBを貯めることができず、バケツが空になったら、さらにトークンが届くまで待たなければ、次のパケットを送ることが出来ない。

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

# 感想
この２つのアルゴリズムを理解するとサーバーなどにも活用できそうな内容だった。
これ以降に説明されているグラフがあるが、読み方がわからないので理解できない。
DatabricksのDelta Live Tables (DLT)

> **[DatabricksでSparkとDelta Lakeワークロードを最適化するための包括的ガイド](https://qiita.com/taka_yayoi/items/cd199691569fef069a9d)のコンテンツです。**

[Comprehensive Guide to Optimize Data Workloads \| Databricks](https://www.databricks.com/discover/pages/optimize-data-workloads-guide)のセクション[Delta Live Tables (DLT)](https://www.databricks.com/discover/pages/optimize-data-workloads-guide#delta-live)の翻訳です。

:::note warn
- 本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
- 2023年時点の内容です。一部情報が古いものがあります。
:::

Delta Live Tables(DLT)によって、[Databricksのレイクハウスプラットフォーム](https://www.databricks.com/jp/product/data-lakehouse)で高品質なデータをデリバリーする、高信頼のバッチとストリーミングデータパリプラインの構築と管理を容易にします。

DLTは、宣言型パイプライン開発、自動データテスト、監視と復旧のための深い可視性によって、データエンジニアリングがETL開発や管理をシンプルにする手助けをします。

![](https://www.databricks.com/en-website-assets/static/255e9acce7a52fb13ff220bf8682aa87/22896.png)

# データパイプラインの構築と維持を容易に

Delta Live Tablesによって、SQLやPythonでエンドツーエンドのデータパイプラインを容易に定義します。サイロ化されたデータ処理ジョブを手動で繋ぎ合わせるのではなく、シンプルにデータソース、変換ロジック、データの目的の状態を指定します。パイプラインにおける全てのデータの依存関係を自動で維持し、環境から独立したデータ管理によってETLパイプラインを再利用します。バッチあるいはストリーミングモードで処理を行い、それぞれのテーブルに対してインクリメンタルかコンプリートな処理かを指定します。

![](https://www.databricks.com/en-website-assets/static/255e9acce7a52fb13ff220bf8682aa87/22896.png)

# 自動のデータ品質テスト

Delta Live Tablesは、後段のユーザーに高品質なデータを提供することで、高精度で有用なBI、データサイエンス、機械学習を確実なものにする助けとなります。事前に定義したエラーポリシー(失敗、削除、警告、データの検疫)でデータ品質エラーを回避し、検証や一貫性チェックを通じて不適切なデータがテーブルに流れ込むことを回避します。さらに、あなたのデータがどのように進化しており、どこで変更が必要になるのかに関する洞察を得るために、データ品質の時間変化を監視することができます。

![](https://www.databricks.com/en-website-assets/static/b184e5e2423f5e32d0c05080fda5b080/22897.png)

# 効率的な計算資源のオートスケーリングを通じたコスト効率の高いストリーミング

Delta Live Tablesの強化オートスケーリングは、変動が激しく予測できないストリーミングワークロードに対応するために設計されています。エンドツーエンドのSLAを維持しつつも、必要なノード数にのみスケールアップし、不必要な出費を避けるために使用率が低いノードを安全にシャットダウンすることで、クラスターの使用率を最適化します。

![](https://www.databricks.com/en-website-assets/static/e8df1c58b46bc48b3ae87e26546f5176/22898.png)

# パイプラインの監視と観測可能性に対する深い可視性

オペレーションの統計情報とデータリネージをビジュアルで追跡するためのツールを用いて、パイプラインのオペレーションに対する深い可視性を獲得します。自動エラーハンドリングと容易な再実行でダウンタイムを削減します。シングルクリックでのデプロイメントとアップグレードでメンテナンスをスピードアップします。

![](https://www.databricks.com/sites/default/files/inline-images/alert-icon.png?v=1688736447)

- DLTは、クラスター、オートスケール、失敗時のリトライ、そのほかの調整をバックグラウンドで行いつつも、ユーザーがビジネスロジックの記述にフォーカスできるようにするマネージドのETLフレームワークです。このため、ユーザーがSparkのチューニングやクラスターの設定やチューニング([こちらのセクション](https://qiita.com/taka_yayoi/items/040b13029ef92f8c365d)をご覧ください)、Deltaのメンテナンスタスクなどに気を取られることのないように、可能な限りデータエンジニアリングのワークロードでDLTを使うことをお勧めします。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
エンドポイントURLの末尾は「z」にしないほうがよい

# はじめに

Cloud Runにデプロイしたbackendサービスに対しリクエストを送った際，突如404エラーが出て驚きました．今回はその経緯を記載しようと思います．結論，原因としては，「Cloud Runの既知の問題」に記載されている「`z`」に関してでした．

https://cloud.google.com/run/docs/issues?hl=ja


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/2763bcb7-8781-88cf-17df-049dfa980532.png)


___末尾が z のパス。予約済みのパスと競合しないように、末尾が z のパスを避けることをおすすめします。___


# お題

簡単なAPIを作成し，ローカルとCloud Runでデプロイしたときの挙動の違いについて確認します．それぞれエンドポイントのURLで挙動の違いを確認します．


## 簡単なAPIを作成

以下のように2つのエンドポイント(`/health`と`/healthz`)を作成しました．

```python:main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/health", description="Health check", status_code=200)
def health() -> dict:
    """Health check endpoint

    Returns:
        dict: Health status
    """
    return {"health_check": "OK"}


@app.get("/healthz", description="Health check", status_code=200)
def healthz() -> dict:
    """Health check endpoint

    Returns:
        dict: Health status
    """
    return {"health_check_with_'z'": "OK"}
```

## ローカルで挙動確認

ローカルのDockerでバックエンドのサーバーを起動してエンドポイントにアクセスすると，問題なくどちらのエンドポイントからもレスポンスが返ってきます．

```bash
curl -X 'GET' \
  'http://0.0.0.0:8080/health' \
  -H 'accept: application/json'
```

```bash
{"health_check":"OK"}                                                    
```

```bash
curl -X 'GET' \
  'http://0.0.0.0:8080/healthz' \
  -H 'accept: application/json'
```

```bash
{"health_check_with_'z'":"OK"}
```


# Cloud Runで挙動確認

Cloud Runにデプロイし，それぞれのエンドポイントにアクセスしたところ以下のようになりました．冒頭に述べたように，エンドポイントURLの末尾を`z`にすると，404エラーとなってしまいます．

### /health → 200

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/c6c33e39-2750-8fb8-2b15-f4eb7e4e485f.png)


### /healthz → Error 404

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/6d877309-a894-d1df-9a3f-5daeebc643f2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/04d2d474-125e-874b-6a23-6438576ef938.png)


# まとめ

今回はCloud Run利用時に直面した内容を記載しました．このような仕様があることを知らなかったので備忘として残しておきます．今回の件は，オープンソースのサービスを自分たちでホスティングし，ヘルスチェックをしたときに発覚しました．偶然気づくことのできた内容ですが，今後バックエンドの実装をする際はこのことも意識しながら扱いたいです．


# 参考

- [Cloud Runの既知の問題](https://cloud.google.com/run/docs/issues?hl=ja)
Gitでの開発ブランチをマスターブランチにマージする手順

## Gitでの開発ブランチをマスターブランチにマージする一般的な手順 with claude-3.5-sonnet
#### 1. マスターブランチに切り替える
```bash:Bash
git checkout master
```
##### 2. マスターブランチを最新の状態に更新
```bash:Bash
git pull origin master
```
#####  全ての変更をステージングエリアに追加
```bash:Git
git add -A
# ステージングされた変更を確認
git status
# 特定のファイルのみ追加
git add filename.txt
# 特定のディレクトリの変更のみ追加
git add src/
# 対話的に変更を選択して追加
git add -i
# 変更をコミット
git commit -m "全ての変更をコミット"
```
#### 3. 開発ブランチをマージ
```bash:Bash
git merge development  # developmentは開発ブランチ名
```
#### 4. コンフリクトがある場合は解決する
#### 5. マージした変更をリモートリポジトリにプッシュ
```bash:Bash
git checkout master
```
#### 6. リモートリポジトリに変更をプッシュ
```bash:Bash
git push origin master
```
#### 7. feature ブランチが不要な場合は削除
```bash:Bash
git branch -d feature-***
```
## 安全に作業するための追加のヒント
#### 1. マージ前にブランチの状態を確認
```bash:Bash
git status
```
#### 2.問題が発生した場合にマージを取り消す
```bash:Bash
git merge --abort
```
# タグをつける
```bash:Git
# 注釈付きタグ（推奨）を作成
git tag -a v1.0.0 -m "バージョン1.0.0をリリース"
# 軽量タグを作成（メッセージなし）
git tag v1.0.0
# 特定のコミットにタグを付ける
git tag -a v1.0.0 9fceb02 -m "バージョン1.0.0をリリース"
```
## タグをリモートリポジトリにプッシュ
```bash:Git
# 特定のタグをプッシュ
git push origin v1.0.0

# すべてのタグをプッシュ
git push origin --tags
```
### その他の便利なタグコマンド
```bash:Git
# タグ一覧を表示
git tag
# タグの詳細情報を表示
git show v1.0.0
# タグを削除
git tag -d v1.0.0
# リモートのタグを削除
git push origin --delete v1.0.0
```
【Ruby on Rails】引数付きrakeタスクの実装

# はじめに
今回は、引数つきrakeタスクの基本的な実装方法や注意点等書いていきます。
rakeとは、linuxにおけるmakeタスクと同じような動作をするrubyのビルドツールです。rakeファイルに一連のタスクを定義し、実行することができます。
コマンドラインやソース上から呼び出すことが可能です。

# 実装方法
まず、rakeファイルを作成します。コマンドライン上から下記を実行してください。

```ruby
rails g task sample_task
```

そうすると、lib/tasks配下にsample_task.rakeが生成されているはずです。今回はこちらのファイルにタスクを定義していきます。

では、ファイルの中身を実装していきましょう。引数を与えて、任意の文章を表示するタスクです。

```ruby
 #タスクの名前空間を定義
namespace :sample_task do
 #タスクの説明を記述
 desc '任意のテキストを表示'
  task :show_text, ['text'] => :environment do |task, args|
 #argsはHashとして扱われる
   p args.text
  end
end 
```

:environmentをつけてRails環境を明示しないとうまく実行できないようなので注意しましょう。
上記が記述できたら、正しくrakeタスクとして認識できているか確認したのち、実行していきます。

```ruby
#現在利用可能なrakeタスクの一覧を表示。rake sample_task:say_hello[text]があることを確認
rake -T

#rakeタスクを実行。Hello Worldと表示されれば成功
rake sample_task:show_text['Hello World']

#--traceオプションを付けると実行時の詳細なログを表示することができます。
rake sample_task:show_text['Hello World'] --trace
```

では、複数の引数を与えたい場合はどうでしょう？実装していきます。

```ruby
namespace :sample_task do
 desc '任意のテキストを表示'
   #引数「first_text」と「second_text」を与える
   task :show_text, ['first_text', 'second_text'] => :environment do |task, args|
   #Hashとして扱い、値を取り出し
   p args.first_text + ' ' + args.second_text
  end
end
```

実行しましょう。

```ruby
#現在利用可能なrakeタスクの一覧を表示。rake sample_task:say_hello[first_text, second_text]があることを確認
rake -T

#rakeタスクを実行。Hello Niffyと表示されれば成功
rake sample_task:show_text['Hello','Niffy']
```

これが、複数の引数を与えるrakeタスクの基本的な実装方法です。
注意点としては、コマンドラインから実行する際、引数の間にスペースがあるとうまくいきません。スペースは入れずに実行しましょう。

```ruby
#失敗パターン 
rake sample_task:show_text['Hello ', 'Niffy']
```

# 終わりに
 以上が基本的な引数つきrakeタスクの使い方です。(間違えているところありましたら申し訳ありません、、！)
今後もRubyについての記事投稿していきたいと思いますので、よろしくお願いいたします。
dmenu 字が小さい

<h1>私の結論: rofiを使う</h1>
<h3>
i3を使おうってなら、ノートPCも想定されるだろうに
</h3><h3>
dmenu 字が小さいんじゃあああ
</h3><h3>
rofiを使うことにした。私はManjaroで使ってるけど、Ubuntuでも大丈夫
</h3><h3>
やったこと⇣
<ol><li>
dmenuをアンインストール、こんなの要らん : pacman -Rns dmenu
</li><li>
rofiをインストール : pacman -S rofi
</li><li>
テストしてみる,termで : rofi -show drun
</li><li>
~/.config/i3/configのdキーをdmenuからrofiに変更</li></ol>


</h3><h3>
[スクリーンキャプチャ]
</h3>
簡単にアプリが作れる！bolt.newを試してみた

## bolt.newとは
ブラウザ上でフルスタック Web アプリケーションのプロンプト入力、実行、編集、デプロイを可能にする AI 駆動の開発ツールです。
自分のPCに環境構築しなくてもすぐにアプリ開発が始められるということで実際に試してみました！

## 利用手順
まず、[こちら](URL "https://bolt.new/")にアクセスします。
利用にはサインインが必要です。私はGitHubアカウントを持っているため、GitHubアカウントでサインインして利用を開始しました。（それ以外にメールアドレスで登録する方法もあるようです）
![スクリーンショット 2024-11-04 2.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844485/63b391d4-1fa3-0067-dcac-ac462c3a7224.png)

## プロンプトを入力する
「XのようなSNSを作成して」と指示を出してみました。
![スクリーンショット 2024-11-04 1.47.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844485/456b5122-04be-c122-5f9a-3f17cf12e06a.png)
すると、コードの生成が始まり…
![スクリーンショット 2024-11-04 1.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844485/fe3cb66f-cd3f-58e4-5ddf-ed18739fc5a0.png)
あっという間にそれらしいものが完成したようです！
![スクリーンショット 2024-11-04 1.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844485/47bccc7b-3ca0-8edd-4323-ebcbc03401b7.png)

## デプロイしてみる
画面右上の「Deploy」ボタンを押すと、AIが自動的にNetlifyを選択してデプロイを実行し、URLを発行してくれました！（Netlifyへのログインは不要でした）
![スクリーンショット 2024-11-04 1.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844485/62ebfa87-8c89-2d17-676d-737d99c45ee2.png)

## 利用してみた感想
* 作成されたアプリは投稿機能のみで、他の機能は実装されていないようでした。追加で指示を出して、機能をさらに作成していく必要がありそうです。とはいえ、たった数分でここまでのものが完成してしまうことに驚きと、満足感がありました！
* 今回、無料版で試しましたが意外とすぐに利用回数の制限に達してしまいました。色々試してみたい方は有料プランにアップグレードするのがいいかもしれません。（料金プランは[こちら](URL "https://stackblitz.com/pricing")）
トラフィック・シェイピング

https://qiita.com/masatom86650860/items/c6626c95cf965d41b9fa

### どういう技術か？
>ネットワークに流入するデータ・フローの平均レートとバースト性を制限するための技術である。
p374

### この技術の目的は？
>アプリケーションがそれぞれの要求に応じて、バースト性を持つものも含む多様なトラフィックを送信できるようにしつつ、`ネットワークのトラフィックパターンを単純かつ利用しやすい形式で記述`することである。

#### トラフィックパターンとは？
>トラフィック解析と呼ばれる手法で、たとえパケットが暗号化されていて中身がわからなくても、パケットの流れるパターンを調べることで情報を得ようとするものである。
p785

### 顧客とプロバイダの合意
>ユーザーとネットワーク（顧客とプロバイダ）はネットワークに流入するデータ・フローのトラフィック・パターン（すなわちシェイプ）について合意を取る必要がある。要するに顧客がプロバイダに「私の`トラフィック・パターンはこのような形ですが、処理してもらえますか`」と聞くようなものである。

* 顧客とプロバイダの合意によって僕らはネットワークにパケットを送信できる
* トラフィックパターンの形をプロバイダに提示しなくてはいけない

#### SLA(サービスレベル契約）
>顧客が取り決められた範囲でパケットを送信している限り、プロバイダはそのパケットを素早く届けることを約束すると言うもの

### 顧客がSLAを守っているかを監視
>顧客が取り決めを正しく守っていることをどうやって伝えるのか、顧客が取り決めを守っていない時にどう対処するのか、と言う問題が出てくる。と効き目を守らずに送信されたパケットは、ネットワークによって破棄されることもあれば、優先度を下げて転送されることもある。トラフィック・フローを監視することを、`トラフィック・ポリシング`と呼ぶ。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
リッチテキストエディタ【Quill】を導入してみた。

# はじめに
弊社では社内ツールに各メンバーの
プロフィールを見られるWebアプリケーションがあります。

固いツールではなく、各々がプロフィール写真や自己紹介を登録できます！
個性が出るので見ていて楽しいものになっています😊

今回、自己紹介文の中でより知ってもらいたいポイントを強調できるように
リッチテキストエディタを導入しようと考えました。

1番お伝えしたいことはページ下部にありますので
最後までご覧ください！

# 導入方法
主に
1. CDN
2. 公式からダウンロード
3. NPMでインストール


我々はVue.jsを使用しているので3.を用いました。

具体的な導入方法は
[公式サイト](https://quilljs.com/docs/quickstart)

と、
過去の私の投稿
[jQueryより簡単！Vue.jsでスムーススクロールを導入してみた。](https://dev.startialab.blog/uncategorized/a143)

にお任せしようと思います😃

# 導入したら

私は今回、以下のようにオプションをセットしました。

```javascript
editorOption: {
    theme: 'snow',
    modules: {
        toolbar: [
            ['bold', 'italic', 'underline'],
            [{ 'color': [] }, { 'background': [] }],
            [{ 'font': [] }],
            [{ 'align': [] }],
            [{ 'list': 'ordered'}, { 'list': 'bullet' }],
            [{ 'indent': '-1'}, { 'indent': '+1' }],
            ['blockquote', 'code-block'],
            [{ 'size': ['small', false, 'large', 'huge'] }],
            [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
            ['clean']
        ]
    },
    placeholder: '自己紹介を入力してください。',
 }
```

するとこんな見た目で表示されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895140/9a936db6-d3f7-76a8-3b4b-095adf4297d1.png)

Quillの導入はここまで。

もう1点大事なのは、
保存したリッチテキストが正しくプロフィール画面で表示されることですね！！

# ここでハマった
自分のプロフィール画面を見てみるかと思ったところ、
ほとんど反映されていない！

そこで、
プロフィール画面にQuillのCSSが読み込まれていること　→　読み込まれている
プロフィール画面にもQuillを導入しreadonlyにしてみる　→　これもうまくいかない
をやってみました。

# 解決方法

これでした！！

```javascript
 <div class="ql-snow">
    <div class="ql-editor" v-html="ここに出力"></div>
</div>
```

CSSを適用するには
1. ql-snow
2. ql-editor

の順番でクラスをラップしてあげる必要があります。

また、リッチテキストエディタを用いた内容を保存、表示する場合は
__クロスサイトスクリプティング対策のサニタイズを忘れないようにしてください！__


今回は以上です。
貴方の一助になれば幸いです😄
Qiita Conference 2024 Autumn 一部参加メモ

# Day１

## 1. 大企業の人事業務を20年以上支えてきた「超巨大ソースコード」の保守改善を支える技術の数々

- 数千万行の大規模なソースコード
- 技術面とマネージド面の両方からのアプローチ
  - なるだけ分割してモジュール化したいが業務単位を考慮して分割すべき
  - 保守＝小さなモダン化を常に取り入れる（ミドルウェアの更新など）
  - CI/CD
  - 弱点特化研修：テスト研修など

## 2. エンジニアのための効果検証入門

- 広告の効率・効果の数理モデル化を生業としてる発表者
- 因果推論：機械学習とは異なり、識別＆推定から成る。ここ数年Pythonライブラリが充実
  - 識別：A/Bテストのようなもの
    ```math
    \displaylines{
    事実（影響があるパターン）- 反事実（影響がないパターン）
    }
    ```
  - 機械学習と異なり正当性を数値化できず、方法論で根拠づけする必要がある
    - 柔軟な事業方針転換が必要不可欠

## 3. 20分で一緒に考える、モダンQAエンジニア像

- QAエンジニア：テスト・メトリクス作成。モニタリング
  - 機能性・パフォーマンス・セキュリティをどのように力配分するかをリードする
- テスト作成：プロダクトを熟知している人が網羅的にパターンを落とし込む

# Day２

## 1. エンジニア創業者が語る、ユーザー中心のプロダクトづくり

- PLG戦略：広告ではなくユーザのレビュー媒介で広める
  - 個人・法人区分けなくフリーミアム移行で売り上げ向上・プロセスの共通化/効率化
      - フリートライアル：一定期間だけ無料
      - フリーミアム：一定条件内で基本無料
  - 機能改善をブログで発表する
  - 利用期間・条件に応じたメール配信
  - バリューメトリクス向上

## 2. 賢く選ぶ！脆弱性診断の最適な選び方ガイド

- 外部の診断ベンダ
  - 価格重視：外部診断ツールの結果を流用している場合がある
  - 品質重視
  - 顧客対応重視

## 3. 野良 API を５分で保護 API にして不幸な API 根絶を目指す取り組み

- 野良API
  - 認証処理がAPIごとに異なる
  - アクセス許可するエンドポイントがバラバラ
  - ドキュメントがない
- ゲートウェイの代わりに宣伝自社製品を介して保護

## 4. プログラミング言語デザインケーススタディ
  - オープンクラス：Rubyは、基本クラスの挙動を変えられる
  - ターゲティング・コミュニティ・継続が重要。Rubyは拡散まで１０年かかった
  - 既存の人気言語の書き方に寄せることで参入障壁を下げる。保守・革新のバランスが重要



# 感想
Qiita Conferenceは今回が初参加であったため、Qiitaのサービス内容と何か紐づいているのかと思ったが実際はそうでもなかった。
全体の半分ぐらいが、キャリアにおける精神論であったり、各人の自社サービスの宣伝であった印象。
PLG戦略やバリューメトリクスといった新たな概念を知ることができた。生成AIに「○○のサービスのバリューメトリクスを考えて」と質問することにより短い質問で的確な回答を得られるので、新たな概念や専門用語は積極的に取り入れていきたい。
LLMの概念空間と人間の脳

こんにちは。普段は産婦人科医をしつつAIの医学応用に関する研究をしています。
以前ED法がにわかに話題になった時、以下のような記事をQiitaで書かせていただきました。

https://qiita.com/obgynengine/items/cd31cf9d03949d5aadbf

その際に、大脳の機能局在についても言及しました。
>大脳皮質には機能局在があり、役割ごとに運動野、言語野、視覚野などの野（Area）があります（確かブロードマンの分類では全部で46野だったと思います）。それらを機能単位でまとめたものが前頭葉や側頭葉、後頭葉などの葉（Lobe）です。この構造はなにも学習が始まっていない、胎内の赤ちゃんの頃からある程度構造として作られており、3歳くらいまで発達はしますが機能局在として大きくは変わりません。ニューラルネットの論理で考えれば、バックプロパゲーションにせよ誤差拡散にせよ、学習をしてから野や葉を分化していくほうが合理的であるような気がします。人間の学習なんて小規模なデータセットで都度学習を行うようなものですから、学習前のモデルにすでにこのブロックは画像用、このブロックは言語用、このブロックは体を動かす用と決めておくのは非効率な気がします。複数のLLMのマージのようなものなのかもしれませんが、46個のLLMをマージするよりもう少しうまい方法があるような気がしてなりません。それにもかかわらずこのように予め機能局在が分かれていることを考えると、仮にED法が生物の学習の主な学習方法であったとした場合、学習前のモデルにすでに特定のブロックを特定の用途のために使うと決めておく方がいいシステムがあるのかもしれません。

そして先日、以下のような記事を目にし、ものすごくびっくりしました。

https://ledge.ai/articles/llm_conceptual_structure_sae

スパース・オートエンコーダー（SAE）という技術を用いて大規模言語モデル（LLM）の内部構造を調べたところ、LLMの内部構造は「概念」を表現する特徴点が「原子(atom)」「脳(brain)」「銀河(galaxy)」の3つのスケールで組織化されており、生物の脳構造と類似しているという主張です。
この報告が真だとすると、人間の脳はニューロンの集合からなるLLMで、ブロードマンの分類は自然発生的に生じた可能性があるためです。
元素がシリコンか炭素かの違いであって、ニューラルネットが高度化するとどのようなニューラルネットであっても似たような機能を持つ部分同士が集まってクラスター化され、効率的な機能局在が自然発生するということが再現されたことになります。
そうすると遺伝子というものはAI用語でいうところの知識蒸留のような機能を持ち、子を成すということが教師-生徒間の転移学習というモデル化ができることになります。
そうであれば赤ちゃんの頭に最初からある程度の機能局在があることも自然なように思います。

この仮説が正しい場合、おそらく機能局在は各入力に近い位置に集まると考えられます。
人間の脳をものすごく単純化すると、耳から得た音声信号は側頭葉で、視覚情報は後頭葉で処理され、嗅覚と味覚は脳神経(Ⅰ、Ⅸ、Ⅻ)で、触覚や深部感覚は脊椎を通して頭頂葉に集められ、前頭葉で判断を下すことで意思決定を行うといわれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1981722/199a9f57-f7c1-4520-8bee-131120f02214.png)
https://pathologycenter.jp/als/neuroanatomy/neuroanatomy6.html

これをLLMで再現すると、おそらく音声入力をつかさどる領域は音声入力に近い位置に、ビジョンをつかさどる領域は画像入力に近い位置に、文字情報をつかさどる領域は文字入力に近い位置にあるのが合理的なはずです。
人間が言語をしゃべる場合①話の意味を理解して②舌や喉を動かし発語するという2ステップがあり、①は感覚言語野(Welnicke野)、②は運動言語野(Broka野)と呼ばれます。①が聴覚領域と視覚領域にまたがるように配されていることもこの証左となるでしょう。
まだ読み込めていないですが、先のLLMの機能局在もたぶんそのように近い機能は近い位置に来ているんじゃないでしょうか。

余談ですが、脳梗塞などで脳にダメージを受け言語がしゃべれなくなることを「失語」といいますが、この失語にもパターンがあり、「言葉として発語できるが支離滅裂で意味を成さない」失語を「Welnicke失語」、「意味は通るが言葉として発語できない」失語を「Broka失語」といいます。由来は上記の機能局在です。

何が言いたいのかというと、おそらく今後のマルチモーダル化においては、LLMへの入力系統を完全に分離してしまうほうが人間の脳に照らして考えると正しい設計になる可能性があるということです。
人工知能とはよく言ったもので、生理学や解剖学から学ぶことはまだおおいのかもしれません。
Azure Data Factory から Databricks Repos 内のノートブックをブランチ指定して呼び出す

## はじめに

[Azure Data Factory](https://learn.microsoft.com/ja-jp/azure/data-factory/introduction) ではパイプラインにより [Azure Databricks](https://learn.microsoft.com/ja-jp/azure/databricks/introduction/) のノートブックを実行できます。

なお、[Repos](https://learn.microsoft.com/ja-jp/azure/databricks/repos) 内のノートブックを呼び出すと、下図のように、事前に設定されたブランチが採用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/eceda475-ac57-8792-a280-e241fac824e7.png)

今回は、Data Factory の Web アクティビティを利用して Databricks Repos 内のノートブックをブランチ指定して呼び出す回避策を説明します。

## 手順

### 1. Databricks アクセストークンの発行

Databricks ワークスペースの設定画面でアクセストークンを発行します。この値は後ほど利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/526df329-31ce-0f76-8165-f069916753b3.png)


### 2. Databricks Repos ID の確認

Databricks ワークスペースにて、該当の Repos フォルダにて下図のように `Git...` をクリックして Git 編集画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/59683d90-d82c-c5fe-0e0e-a8aaf7646ef4.png)

`Settings` タブにて Repos ID を確認できます。この値も後ほど利用します。

<img width="600" alt="スクリーンショット 2022-09-23 13.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/25a12589-04be-f96f-9e19-8e1d54de1d24.png">

なお、Repos ID は 以下のように [API](https://docs.databricks.com/api/azure/workspace/repos/list) でも確認可能です。

```console
$ curl -X GET \
  -H "Authorization: Bearer <手順1で取得したアクセストークン>" \
  https://adb-XXXXXXXXXX.XX.azuredatabricks.net/api/2.0/repos
```

### 3. Data Factory の設定

Data Factory Studio にて 2 つのアクティビティを定義します。

1 つ目の Web アクティビティで以下のように設定をし、[API](https://docs.databricks.com/api/azure/workspace/repos/update) で Repos のブランチを変更します。

| 項目 | 値 | 
|:----------:|:------------:|
| URL       | `https://adb-XXXXXXXXXX.XX.azuredatabricks.net/api/2.0/repos/<手順2で取得したReposID>`      | 
| Method     | `PATCH`      | 
| Body       | `{"branch": "<ブランチ名>"}`        | 
| Headers1         | `Authorization: Bearer <手順1で取得したアクセストークン>`        | 
| Headers2       | `Content-Type: application/json`      | 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/48780927-99e1-cf42-a80a-f59917eced02.png)

2 つ目の Databricks ノートブックアクティビティで以下のように設定をし、実行するノートブックを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/52b0c647-bde9-732b-6317-97ad781e6f51.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/43e78d06-3ea3-3db1-f19c-09c0ea2ce4c2.png)

### 4. Data Factory パイプラインの実行

パイプラインを実行して、2 つのアクティビティが成功することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/466d4c68-3d52-3b69-07f9-b53a102c721b.png)

Databricks ワークスペースにおいては、ノートブック実行の出力結果を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/7d21bd73-cc1b-3c73-017f-284acbd43424.png)

また、Repos のブランチも Web アクティビティにより元々の `main` から `sub` に変更されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/8364f638-2b6a-8a0b-37d9-dbe01a35041b.png)


## おわりに

Data Factory から Databricks Repos 内のノートブックをブランチ指定して呼び出す方法を説明しました。

あくまで回避策であり、Web アクティビティと Databricks ノートブックアクティビティの間でブランチが変更された場合は対処できないことにご注意ください。
DeltaとSparkのキャッシュ - ワークロードをスピードアップするためにキャッシュを活用

> **[DatabricksでSparkとDelta Lakeワークロードを最適化するための包括的ガイド](https://qiita.com/taka_yayoi/items/cd199691569fef069a9d)のコンテンツです。**

[Comprehensive Guide to Optimize Data Workloads \| Databricks](https://www.databricks.com/discover/pages/optimize-data-workloads-guide)のセクション[Data Caching — Leverage Caching to Speed Up the Workloads](https://www.databricks.com/discover/pages/optimize-data-workloads-guide#data-caching)の翻訳です。

:::note warn
- 本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
- 2023年時点の内容です。一部情報が古いものがあります。
:::

[DeltaキャッシュとSparkキャッシュ](https://docs.databricks.com/ja/optimizations/disk-cache.html)は、ワークロードを高速にするために活用できる2つの異なるキャッシュのタイプがあります。

# 1. Deltaキャッシュ

:::note info
Deltaキャッシュは、現在ではディスクキャッシュに[名称変更](https://learn.microsoft.com/ja-jp/azure/databricks/optimizations/disk-cache#delta-cache-renamed-to-disk-cache)されています。
:::


[Deltaキャッシュ](https://learn.microsoft.com/ja-jp/azure/databricks/optimizations/disk-cache)(ディスクキャッシュ)は、高速な中間データフォーマットを用いて、ノードのローカルストレージ(SSDドライブ)にリモートファイルのコピーを作成することで、データの読み込みを加速します。

- デフォルトでDeltaキャッシュが有効化されている高速化インスタンス(Azureクラウドであればメモリー最適化カテゴリの*Standard_E16ds_v4*やストレージ最適化カテゴリーの*Standard_L4s*など)を使いましょう。
- SSDドライブを持つそのほかのインスタンスファミリー(Azureクラウドにおけるコンピュート最適化カテゴリーの*Fsv2-series*など)のワーカーでもDeltaキャッシュを有効化することができます。明示的にDeltaキャッシュを有効にするには、以下の設定を行います:

    ```
    set spark.databricks.io.cache.enabled = true
    ```

# 2. Sparkキャッシュ

`cache()`や`persist()`メソッドを用いることで、SparkはSparkデータフレームの中間計算結果を[キャッシュ](https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence)する最適化メカニズムを提供し、以降のアクションで再利用することができます。同様に、[CACHE TABLE](https://spark.apache.org/docs/latest/sql-ref-syntax-aux-cache-cache-table.html)コマンドを用いてテーブルをキャッシュすることもできます。キャッシュされるデータをどこに格納するのか(メモリー、ディスク、メモリーとディスク、シリアライズ有無など)を選択できる[キャッシュモード](https://spark.apache.org/docs/latest/rdd-programming-guide.html#which-storage-level-to-choose)が存在します。

![](https://www.databricks.com/sites/default/files/inline-images/alert-icon.png?v=1688736447)

- Sparkキャッシュは、同じデータフレームに対して1つ以上のSparkアクション(count、saveAsTable、writeなど)が実行される際にのみ有用です。
- Databricksでは、Deltaキャッシュが優れた性能改善をもたらすので、SparkキャッシュではなくDeltaキャッシュを使うことをお勧めします。ディスクキャッシュに格納されているデータは、Sparkキャッシュに格納されているデータよりも高速に読み込み、操作することができます。これは、ディスクキャッシュでは、効率的な解凍アルゴリズムを用いており、whole-stage code generationを用いた更なる処理に最適なフォーマットでデータを出力するためです。
- 計算資源を多く必要とするワークロード(joinや集計処理のような多数のワイドな変換処理)では、特に繰り返し同じテーブルからデータを読み込む際にはDeltaキャッシュによるメリットを享受することになります。これらのワークロードでは、常にDeltaキャッシュが有効化されたインスタンスを使いましょう。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
国際電話番号に適合した電話番号が入力できる入力文字変換処理を作成する


# クリアしたい課題！

国際電話番号もしくは日本の電話番号の入力を可能にしつつ、不要な文字は入力できないような入力文字変換処理を作りたい！

https://www.android.com/intl/ja_jp/articles/282/

# 今回扱わない話題

実務で使用するためにはバリデーションとセットで使用する必要があると思うが、バリデーション部分は扱わない。


# やってみた

```svelte
<script>  
    let value = '';  
  
    const convertToTel = (value) => {  
        // 全角文字の場合は半角にする  
        value = value.replace(/[０-９]/g, (s) => {  
            return String.fromCharCode(s.charCodeAt(0) - 65248);  
        });  

			  // 数字もしくは+以外は空文字変換する
        value = value.replace(/^[^0-9+]/, '');  
  
        // 最初の1文字が+または数字であることを確認  
        if (/^[+0-9]/.test(value)) {  
            // 最初の1文字を保持し、それ以外の非数字文字を削除  
            const firstChar = value.charAt(0);  
            const rest = value.slice(1).replace(/\D+/g, '');  
            return firstChar + rest;  
        }  
        return value;  
    };  
  
    $: value = convertToTel(value);  
</script>  
  
<h1>電話番号を入力して下さい！</h1>  
<input type="tel" bind:value={value} />  
<p>{value}</p>  

```

[デモ](https://svelte.dev/playground/8a1d28e176724535a2f13956b34bea33?version=5.2.2)


# まとめ
汎用的に使用できそうなロジックなので、記事にまとめてみた。
国際電話番号はなかなか馴染みがないので、記憶に残っていた実装でもある。
超速で暗号化するアルゴリズム

今回は byte 配列を
超速で暗号化する手法を考えたため
紹介したいと思います。

この手法で暗号化した byte 配列を
AES で暗号化する事で
暗号化キーの総当たりによる突破が
困難になると考えています。

AES をより強固にするための
手法と考えていますので
AES での暗号化は必須と思われます。

超速で動作するため
AES の直前に実施しても
動作は遅くならないハズです。

***

紹介するコード

```csharp: 超速で暗号化するコード
public static void MyEncryptByteArray(byte[] byteArray)
{
    for(long i = 1; i < byteArray.Length; i += 2)
    {
        byteArray[i] = (byte)(byteArray[i] + byteArray[i - 1]);
    }
}

public static void MyDecryptByteArray(byte[] byteArray)
{
    for (long i = 1; i < byteArray.Length; i += 2)
    {
        byteArray[i] = (byte)(byteArray[i] - byteArray[i - 1]);
    }
}
```
やっている事はシンプルで
2 要素につき 1 回直前の要素を
足しているだけです。

復号化はその逆をします。

見て分かる通り操作が少ないため
かなり高速で動作するハズです。

しかしながら byte 配列を見ただけでは
どのように暗号化されているかは
分からないハズです。

サーバーサイドなど
コードを解析できない箇所で実施した場合は
強力な暗号化と言えるハズです。

なのでセキュリティとしては
実施する価値があると考えています。

やろうと思えば
「3 要素につき 1 回にする」
「開始インデックスを変える」
「足す・引くを逆にする」
等の調整を行う事もできます。

設定でオーバーフローを許可しない場合は
byteArray[i] = (byte)(255 - byteArray[i]);
にして下さい。

***

以上、私が考えた
暗号化のアルゴリズムを紹介しました。

高速で動作させる事だけを
目的としたコードなので
「暗号化を処理速度の関係で実装していない」
「暗号化を強化したい」
と言った場合に、ご利用頂けると幸いです。

この記事が皆さんの開発の助けになれますように。
閲覧ありがとうございました。
バースト性とは

### バースト性
>電話網の場合、125マイクロ秒ごとに８ビットでサンプリングされる。しかし、データ・ネットワークのトラフィックはバースト性（busty)を持つ。例えば、`圧縮技術を用いたビデオ会議のようにトラフック・レートが変化`したり、コンピュータがタスクを切り替えた場合には、それに伴って`トラフィックの受信レートも不均一になることも多い`。トラフィックのバースト性は、`バッファをいっぱいにしてしまいパケットロスも誘発`するため、`帯域が一定のトラフィックよりも取り扱いが難しい`。
p374

* 圧縮技術、コンピュータのタスクの切り替え時に起こる

#### トラフィックレートの変化
>ホストが送り出したパケットの数がネットワークの容量を下回っている場合は、`実際に届けられるパケットの数と送信パケットの数は比例関係`にある。送信パケット数が2倍になると、送り届けられるパケット数も2倍になる。しかし、ネットワークの容量の限界に近づくと、時折、`トラフィックがルータのバッファからあふれ、一部のパケットが破棄されてしまう`。
このパケットロスによってネットワークの容量が一部消費されるので、`送り届けられたパケット数が理論値を下回る`ことがある。
p366

* 単位時間あたりのパケットの数が増減することをバースト性というと考える
* パケットロスとは`ルータのバッファからあふれ、一部のパケットが破棄されてしまう`こと
* バースト性はバッファをいっぱいにする

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
mainブランチとの差分のみを対象にlarastanを実行できるようにする


# 解決したい課題


larastanというコードの静的解析をしてくれるとても便利なライブラリがあり日常の開発で重宝している。

https://github.com/larastan/larastan

しかし、開発規模が大きくなるにつれてコマンド実行に時間がかかるようになってしまった。
必要な箇所を静的解析しつつも、コマンド実行時間を減らしたい！というアプローチをしてみた！

# 結論

この方法で課題を解決できた！

1. git diffコマンドを使用し、mainブランチとの差分ファイルを取得。
2. その中でphpファイルのみ抽出
3. 対象のphpファイルのみ、静的解析

```
git diff --name-only --diff-filter=ACMRTUXB origin/main | grep -E '\.(php)$$' | xargs ./vendor/bin/phpstan analyse -c phpstan.neon
```

# 詳しい解説

gpt-4oに解説してもらった！

このコマンドは、Git リポジトリの `origin/main` ブランチと現在のブランチの間で変更された PHP ファイルに対して、PHPStan を使用して静的解析を行うものです。各部分の役割を詳しく解説します。  
   
### コマンドの詳細  
   
1. **`git diff --name-only --diff-filter=ACMRTUXB origin/main`**:  
    - `git diff`: Git リポジトリ内の変更を表示するコマンド。  
    - `--name-only`: 変更されたファイル名のみを表示するオプション。  
    - `--diff-filter=ACMRTUXB`: 特定の種類の変更に限定するフィルター。  
        - `A`: 追加されたファイル。  
        - `C`: コピーされたファイル。  
        - `M`: 修正されたファイル。  
        - `R`: リネームされたファイル。  
        - `T`: タイプ変更されたファイル。  
        - `U`: 未マージのファイル。  
        - `X`: 不明なファイル。  
        - `B`: ペアを壊したファイル。  
    - `origin/main`: リモートブランチ `origin/main`。  
  
   この部分は、`origin/main` ブランチと現在のブランチの間で追加、コピー、修正、リネーム、タイプ変更、未マージ、不明、ペアを壊した変更のあったファイル名を取得します。  
   
2. **`| grep -E '\.(php)$$'`**:  
    - `|`: パイプ。前のコマンドの出力を次のコマンドに渡す。  
    - `grep -E '\.(php)$$'`: `grep` コマンドを使用して、正規表現に一致するファイル名をフィルタリングします。  
      - `-E`: 拡張正規表現を使用するオプション。  
      - `'\.(php)$$'`: `.php` 拡張子で終わるファイルをマッチさせる正規表現。  
  
   この部分は、変更されたファイルの中から PHP ファイルのみを抽出します。  
   
3. **`| xargs ./vendor/bin/phpstan analyse -c phpstan.neon`**:  
    - `xargs`: 標準入力から引数を構築するコマンド。  
    - `./vendor/bin/phpstan analyse`: PHPStan を使用して静的解析を行うコマンド。  
    - `-c phpstan.neon`: PHPStan の設定ファイルとして `phpstan.neon` を使用するオプション。  
  
   この部分は、抽出された PHP ファイルに対して PHPStan を実行し、静的解析を行います。  
   
### 流れのまとめ  
   
1. **変更ファイルの取得**:  
   - `git diff --name-only --diff-filter=ACMRTUXB origin/main` コマンドで、`origin/main` ブランチと現在のブランチの間で追加、コピー、修正、リネーム、タイプ変更、未マージ、不明、ペアを壊した変更のあったファイルを取得します。  
   
2. **PHPファイルのフィルタリング**:  
   - `| grep -E '\.(php)$$'` コマンドで、変更されたファイルの中から `.php` 拡張子のファイルのみをフィルタリングします。  
   
3. **PHPStanによる静的解析**:  
   - `| xargs ./vendor/bin/phpstan analyse -c phpstan.neon` 


# まとめ
今後他コマンドでも応用が効きそうな解決方法なので記事を残しておく！
このコマンドのおかげで、ちょっとした業務中のストレスが緩和できたので嬉しみ！
_ アンダーバーが出ない

もし間違ってたらコメントしてください。

linuxで日本語も入力できるのに、
キーボードの記号もちゃんと対応してるのに、
_　が出ない・表示されない。。。なあんて事あるよね

まず、それってターミナルとかvimとかじゃない?
試しにFirefoxのアドレスバーで _ を入力してみよう。
そこでは _ を入力出来たらフォントの問題かもしれない。

firefoxでの設定からフォントを調べ、ターミナルの設定にも同じものを選択してみて。

Droid Sans Mono Regularとか。
設定画面のプレビューでは16進豆腐が出たりするけど大丈夫。
一旦設定してみて