OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeにMermaid書ける環境を整える

## はじめに
[前回記事](https://qiita.com/kiii142/items/3a48795dbd4c0648b15c)でMermaidについて触れて、WEBで動くエディタのお話も書いたのですが、実際Markdownで資料作成するとなるとMarkdownを書いているエディタでそのままMermaid記法書いて出力できた方が楽ちんですよね。
ということで、今回はVSCodeでMermaidを扱える環境を整えていこうと思います。

## 前提：PC環境など
+ Mac OS 13.0
+ Visual Studio Code 1.84.2

最終的にはMarkdownのコードブロックにMermaid記法で記載をすると、プレビューに図表が表示されPDFで書き出す際にも図として書き出すことができる、という状態を目指します。
VSCodeに何も設定していないと以下画像のように書いたものがそのままコードブロックのプレビューとして表示されます。
![スクリーンショット 2023-12-10 23.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/996ef75e-4975-faaf-3f9b-d71f6943e712.png)


## 環境設定
Mermaidをプレビューする方法は2つあるのかなと思っています。
以下お好きな方を採用してみてください。

### 方法１：拡張機能 "Markdown Preview Mermaid Support" を導入する

https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid

VSCodeの拡張機能"Markdown Preview Mermaid Support"を導入します。
導入後はVSCodeのデフォルトのプレビュー機能でもMermaidの図をプレビューできるようになります。

![スクリーンショット 2023-12-10 23.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/bc2c1d85-b612-ccc2-61ae-19b884b81eb2.png)

設定からはテーマを選ぶことができ、
エディタがダークモード・ライトモードどちらであるかのそれぞれの場合に合わせて図のテーマを指定することができます。

![スクリーンショット 2023-12-10 23.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/db7e997a-7015-91f7-3f84-beecd2866b0e.png)

さてこのままMarkdownをPDF出力できる！かと思うと、そうでもなくて、Markdown-PDFで書き出そうとするとおそらくMermaid記法で書いたテキストがそのまま出力されてしまうので、~~そちらは明日以降の記事とさせてください。。後日リンク貼ります。~~

こちらの記事を参照し、Markdown PDFの設定行なっていただければと思います。

https://qiita.com/kiii142/items/632efae2cb6e953548f0



### 方法2：拡張機能 "Markdown Preview Enhanced" を導入する

https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced

[こちらの記事](https://qiita.com/kiii142/items/d28db5f0a0c24c95dc88#3-%E5%AE%8C%E6%88%90%E8%B3%87%E6%96%99%E3%82%92%E5%AE%8C%E6%88%90%E6%99%82%E3%81%AE%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%A7%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E8%B3%87%E6%96%99%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%81%84)で、Markdownをみたままプレビューできるからいいぞ！と言っていた拡張機能ですが、こちら、Mermaidをプレビューすることができます。

またこちらも設定からテーマを変えると、図のカラーテーマがちょっと変わります。
先ほどより若干選択肢少なめです。
資料に合わせて選んでみても良いかも？

![スクリーンショット 2023-12-10 23.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/29fa9211-b75c-8ab7-ba19-00d53b594e8d.png)

PDF出力もこちらはMarkdown Preview Enhancedの書き出し機能を使えば見たままのPDFを書き出すことができます。
プレビュー画面を右クリック>Export>Chrome(Puppeteer)>PDFと選択していくとPDF出力ができます。

## おわりに
拡張機能入れるだけで簡単に使えるようになるのでありがたいです！
Markdown Preview Enhancedを他の目的で使用されるのであれば、そちらの機能でMermaidもプレビューするのがいいのかな、そうでないなら方法１がいいのかな、と思っております。
土日に記事書き溜めしようと思っていたのですが、12月は家庭の用事が多くむしろ土日の方が忙しくて全然時間が取れないことに気づきました。。。日々コツコツ頑張ります。
MS-Windows で Milk-V Duo に接続する

「milk-V Duo First impression」
https://qiita.com/nanbuwks/items/2e704af9ea7d64480321

で最初の遊び方を紹介しましたが、MS-Windows の場合はちょっと設定を追加する必要があります。

# 環境

- MS-Windows10 Pro

他の Windows でも大体だいじょうぶなハズ

# USB ドライバを設定

こういったボードは USB ケーブルで電源供給しますが、 Milk-V Duo はそれだけではなく USB 経由で母艦とTCP/IP 接続します。

RNDIS 接続という方法を使うのですが、このドライバは明示的にインストールしないといけません。

公式ページでは、ドライバファイルを使ってインストールする方法が示されていますが、めんどくさいでね!
https://milkv.io/docs/duo/getting-started/windows-rndis-dirver

ここでは、Windows 内部に持っているドライバを使って接続する方法を説明します。

# デバイスマネージャ

Milk-V Duo を接続した状態で、デバイスマネージャから RNDIS に ⚠ マークがついていることを確認します。
右クリックして「ドライバーの更新」を押します。

v![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8be8b666-f9ee-1753-b468-0080883c891f.png)


「コンピューターを参照してドライバーを検索」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fa9f0bf9-d2fe-19fd-f19d-66f8d2865c45.png)

「コンピューター上の人用可能なドライバーの一覧から選択します」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4b177f44-46be-3dcc-7040-f0c5b7211fe7.png)
一覧から「ネットワークアダプター」を選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a43b08fe-49e7-b616-03fd-1d364b23a04a.png)

「Microsoft」の「リモートNDIS互換デバイス」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/772ff569-a745-d0d2-9049-f774264690e4.png)

インストールすると 192.168.42.1 に接続できるようになります。


# SSH で接続


Windows には 便利な SSH クライアントがいろいろありますが、なんでもいい場合はコマンドプロンプトから直接 ssh 接続ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f038242-0d93-f36b-88b5-a24c2a009091.png)


同様に scp なども使えますので操作・ファイル転送はなんとかなりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b4de6c85-8d88-6c71-e89e-9f0ee5c68eb4.png)
自衛官からエンジニアへ Elixirから始める Web開発 裏コラム vol.1

この記事は「Elixir Advent Calendar 2023」裏コラム記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、体育会系のりでちょっとずつ学ぶシリーズの裏側で、ちょっとマニアックなネタを本シリーズのような優しいコラムではない形式で綴っていこうかと思います。

それでは、いくぞ！

## 7.62mm から 5.56mmに弾丸が殺傷力を減らした理由

89式以降、最新式の20式でも5.56mm
```elixir
%{ 
   "名称" => "20式5.56mm小銃" ,
   "種類" => "小銃" ,
   "製造国" =>  "日本" ,
   "口径" =>	"5.56 mm" ,
   "銃身長" => "330 mm" ,
   "使用弾薬" =>	"89式5.56mm普通弾" , 
   "装弾数" => "30発" ,
   "作動方式" => "ガス圧作動方式" ,
   "全長" =>	"851 mm (銃床最小 779 mm)" ,
   "重量" => "3.5 kg" ,
   "発射速度" =>	"650 – 850発/分" ,
   "有効射程" =>	"500 m以上"
}
```

64式は7.62mmのフルサイズ
```elixir
%{ 
   "名称" => "64式7.62mm小銃" ,
   "種類" => "軍用小銃" ,
   "製造国" =>  "日本" ,
   "口径" =>	"7.62 mm" ,
   "銃身長" => "450 mm" ,
   "使用弾薬" =>	"7.62x51mm NATO弾" , 
   "装弾数" => "20発" ,
   "作動方式" => "	ガス圧利用（ロングストロークガスピストン式）、ティルトボルト式" ,
   "全長" =>	"990 mm （固定銃床式）" ,
   "重量" => "4.3 kg" ,
   "発射速度" =>	"500発/分" ,
   "有効射程" =>	"400 m以上"
}
```

銃弾の威力は、弾丸7.62mmの方が当然、殺傷力が高いです。
どれくらい高いかというと、マズルエナジーと銃弾が音速を超えるか、そして超えた場合には衝撃波の観点も踏まえて威力に影響が出ますが、今回は簡単にマズルエナジーにて計算することにしましょう。


マズルエナジーを計算する関数は以下になります。
```elixir

defmodule MuzzleEnergy do
  def calculate(mass, velocity) do
    0.5 * mass * velocity * velocity
  end
end
```

銃の精度にもよるので、初速は正確には出せないため、今回は7.62mmの初速を仮に 800m/s として計算してみます。

```elixir
MuzzleEnergy.calculate(7.62, 800)
2438400.0

MuzzleEnergy.calculate(5.56, 800)
1779200.0
```

約1.4倍くらいの差ですかね？ 
この違いで、殺傷力が大きく違ってくるようです。
では、なぜ殺傷力を落としたのか？

それは、1人をあやめる場合、戦場から１名いなくなるわけですが、1人を負傷させる場合、１名を助けるためや、介護するのに戦場から３名いなくなる計算をしてるので、あやめるよりも負傷させる方が兵士が減るという計算が成り立つわけですね。人の生き死にを計算するような時代が早く終われば良いですね。
Windowsの変換予測がクソだからGoogleの神完全無料変換予測に移行する話

# はじめに
12月に入ってから毎日JK（情報大好き高校生）を自称してきました。これ知り合いにばれたらめっちゃ恥ずかしいですね。どうも、えか太郎と申します。
# 導入方法
### １：インストーラーの入手
以下のgoogleのホームページからダウンロードしてください。ダウンロードするときに利用規約に同意することを求められます。オプションでGoogleにデータを送信するか聞かれますがそこはお好みで。

https://www.google.co.jp/ime/


### ２：インストーラーを実行
先ほどダウンロードしたインストーラーを起動してください。
それからは道なりにイエスとかしてください（クソ説明）
![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/1853ae56-2642-3143-fbb5-6a24f32bffc0.png)
このような初期設定が出ます。お好みでどうぞ。私は全部OKにしました。
### Windows側で有効にする
有効にするには画面右下の時計の左に表示
![スクリーンショット (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/9b9e0e89-9589-836e-54ce-e63918f53709.png)
# 使い心地
凄く快適ですね。特に二つ以上の文節が含まれるものを変換するときはとくにそれが顕著にみられます。Windowsの予測とは異なり最新のデータなんかもすぐに出てきます。例えば「じゅじゅつかいせん」と入力します。
#### 実例
Windowsで「じゅじゅつかいせん」と入力。

![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/6aff135b-7e91-9903-d7cb-d86153373927.png)

GoogleIMEで入力した場合

![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/66ea889e-ddee-2414-df49-caec3d3a4671.png)

素晴らしいです。比較的新しいデータも出てくるので重宝します。
# おわりに
本記事では「Google IME」の導入方法について解説しました。MicroSoft君にはもっと頑張ってほしいですね。（MicroSoft様にはいつもにお世話になっております。WindowsとかGitHubとかで。）
Vim の基本（初心者向け）

# はじめに
vim の基本について学習したので備忘録的にまとめます。
vim 初心者の方は参考にしていただけたら幸いです。

# vim とは
vimとはターミナル（CLI）から操作するテキストエディタです。
キーボードから手を離さずに（マウスを使わずに）編集ができ、効率よく作業ができます。
vimはインストールしないと使えないため、インストールするかVScomdeの拡張機能を使ってvscode内でvimが使えるようになります。
# カーソルの移動
vim はマウスで操作はしないため、基本的なカーソルを移動するにはh,j,k,l にて操作します。

|キー               | 説明              |
|:-----------------|------------------:|
|h                 |左             |
|j                 |下             |
|k                 |上             |
|l                 |右             |

# モード
vim にはモードが複数あり、モードを切り替えることによって移動や文字を打つことが可能になります。

# ノーマルモード
Vim を起動すると、ノーマルモードから始まります。
ノーマルモードを起点に各モードに遷移することができます。
カーソルの移動や削除などのコマンドを行うモードです。

# 入力モード
ノーマルモードから「i」を入力すると入力モード(INSERT)に移ります。
ファイルを編集するときなど、文字を入力するときに使います。

# ビジュアルモード
ノーマルモードから「v」を入力するとビジュアルモード(VISUAL)に移ります。
主に範囲指定をするときに使います。
「Shift+v」で行選択をしたあと、dを行うと一行丸々削除できたりします。

# コマンドモード
保存、終了、文字列置換など行うことができます。
ノーマルモードから「:」や「/」を入力するとコマンドモードに移ります。
「!」をコマンドの前につけると強制的に実行します。

# 基本的なコマンド
よく使う基本的なコマンドを紹介します。

|キー               | 説明              |
|:-----------------|------------------|
|x                 |１文字削除           　|
|dd                |一列削除             　|
|o                 |改行して入力モードにする　|
|yy                |今いる行をコピー        |
|u                 |一つ戻る           　　 |
|0                 |行頭に移動する          |
|$                 |行末に移動　　　　　　　　|
|dw                |１単語分を削除          |
|w                 |テキストを保存する       |
|q                 |vimの終了　　　　　　　　 |
|wq                |テキストを保存して vim を終了|
|q!                |テキストを保存せずに vim を強制終了|

# まとめ
vim コマンドの基本的な操作について備忘録的にまとめました。
今回記載した機能はあくまで一部であり、コマンドを含め他にも様々な機能があります。
本記事は足がかりとしていただいて、本格的に学習していただければと思います。
固定小数点16,16で遊ぶ2(乗算)(M0、M0+)

固定小数点16,16で遊ぶ2(乗算)(M0、M0+)

目的
センサーの値を計算する


x = 0x0002 8000  (2.5)
y = 0x0004 0000  (4.0)

結果を16ビット左シフトする

x * y = 0x000a 0000  (10.0)


プログラム


```c++



#define MUL(q,w) ((int)( (((long long)(q)) *  ((long long)(w)))>>16 ))

void setup() {
  Serial.begin(9600);

  int x = 0x00028000;
  int y = 0x00040000;

  Serial.print("x * y =");
  Serial.println(MUL(x,y),HEX);
}



```

結果


```

x * y =A0000


```
結局、PHP(Laravel)のPDF出力ライブラリはどれを使えばよいのか

# はじめに

PHPでPDFのライブラリを選定している時に、残したメモを記事化します。
かなり多くある中で、プロジェクトに合ったライブラリを探すのは時間がかかりました。
少しでも皆さんのライブラリ選定の判断材料になれば幸いです。

:::note warn
情報は2023年9月時点のものです。
:::

## 採用したもの

この中で最終的に私が選んだのは`mpdf/mpdf`のLaravelラッパーである`carlos-meneses/laravel-mpdf`です。
使用できるCSSに若干のクセがあるものの、基本的なHTMLやCSSは対応しており、ある程度の複雑なレイアウトにも対応できます。
特に便利だったのが、ページ番号や改ページ制御などを標準搭載している点です。
他にもバーコード発行機能などもある為、商品/在庫管理システムなどでも使えるのではないでしょうか。

https://github.com/mccarlosen/laravel-mpdf


## 各項目の情報源

- 個人的な評価
    - 選定するにあたり、基準を満たしているかどうか(選定基準は上記の「採用したもの」を参照)
- サポート
    - 現在も定期的なアップデートがされているか
- 利用者数
    - GithubのUsed byの数を参照
- 日本語の記事
    - リポジトリ名で検索した際に、ヒットした日本語記事の体感の数
- ライセンス
    - リポジトリのライセンス
- 最終更新日
    - 最終コミット日付を参照




# PHPのPDF出力ライブラリ

## KnpLabs/snappy
- 個人的な評価: ✕
- サポート: 〇
- 利用者数: 不明
- 日本語の記事: 普通
- ライセンス: MIT
- 最終更新日: 2023/01
- 特筆事項: composer以外にサーバー本体にライブラリをインストールする必要がある。(wkhtmltopdf)

https://github.com/KnpLabs/snappy

## dompdf/dompdf
- 個人的な評価: △
- サポート: 〇
- 利用者数: 100k
- 日本語の記事: 多い
- ライセンス: LGPL-2.1
- 最終更新日: 2023/01
- 特筆事項: 使用できるCSSに制限あり, 単純な表を表現するだけなら〇

https://github.com/dompdf/dompdf

## tecnickcom/TCPDF
- 個人的な評価: ✕
- サポート: ✕
- 利用者数: 21.3k
- 日本語の記事: 多い
- ライセンス: LGPL-3
- 最終更新日: 2022/12
- 特筆事項: サポート終了(新バージョンを開発中だが未完成)、HTMLで使えるタグに制限あり

https://github.com/tecnickcom/TCPDF

## mpdf/mpdf
- 個人的な評価: 〇
- サポート: 〇
- 利用者数: 25.7k
- 日本語の記事: 少ない
- ライセンス: GPL-2.0
- 最終更新日: 2023/05
- 特筆事項: CSSにクセがあるが、他のに比べそのままデザインを出力しやすい。共通ヘッダーやページ番号などの機能あり。今回は使わないが、奇数偶数ページだけの処理や、ブックマーク、バーコード発行機能なども標準で備えている

https://github.com/mpdf/mpdf

# 上記のLaravel版のラッパー

## barryvdh/laravel-snappy
- 個人的な評価: ✕
- サポート: 〇
- 利用者数: 4.7k
- 日本語の記事: 少ない
- ライセンス: MIT
- 最終更新日: 2023/04
- 特筆事項: snappyのLaravelラッパー

https://github.com/barryvdh/laravel-snapp

## barryvdh/laravel-dompdf
- 個人的な評価: △
- サポート: 〇
- 利用者数: 72.9k
- 日本語の記事: 普通
- ライセンス: MIT
- 最終更新日: 2023/02
- 特筆事項: dompdfのLaravelラッパー

https://github.com/barryvdh/laravel-dompdf

## elibyy/tcpdf-laravel
- 個人的な評価: ✕
- サポート: △
- 利用者数: 1.4k
- 日本語の記事: 少ない
- ライセンス: MIT
- 最終更新日: 2023/09
- 特筆事項: TCPDFのLaravelラッパー

https://github.com/elibyy/tcpdf-laravel

## carlos-meneses/laravel-mpdf
- 個人的な評価: 〇
- サポート: 〇
- 利用者数: 1.5k
- 日本語の記事: 少ない
- ライセンス: MIT
- 最終更新日: 2023/05
- 特筆事項: mpdfのLaravelラッパー

https://github.com/carlos-meneses/laravel-mpdf
InstanaのSmart Alert（スマート・アラート）で楽ちん監視開始

「Instanaって、（障害発生時の解析だけじゃなくて）監視に使えるんですか？」
こんな質問をお客様から頂く事もありまして、思ったよりもInstanaの機能って知られていないな、と思うこともあったりする2023年。
せっかくなので、締めくくりにSmart Alert（以後、スマート・アラート）が使われるように、紹介をしてみようと思います。

## Instanaで監視をする方法
Instanaで監視をする方法は以下があります。
1. （従来の）アラート
2. スマート・アラート

私はトラブルシュートを依頼されることが多く、システムの仕様を把握していない状況で、Instanaを使った監視、解析を始めるケースが多いです。
そのような状況では、まずはスマート・アラートを適用します。
これが思ったよりも役に立つことが多く、
1. アクセスが集中した際に発生する応答時間の悪化を検出
トレースを参照して原因究明を行い、短期間でサービスの質を向上させることに成功。
2. 外部サービスで不適に発生するエラーによって引き起こさせる応答時間の悪化を検出。
そのままトレースを参照して原因を究明。

と便利さを実感しています。
で、そのスマート・アラートですが、以下のような監視が可能です。

### 1. 応答時間の劣化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/2ae34a9d-8935-ff0b-c903-0dc064815a63.png)
システムの応答時間が急速に悪化した場合を検知します。

### 2. エラーの発生率
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/0a8dcd6f-4c5f-93ed-ee25-1fd23d2207bd.png)
アプリケーション内でのエラーの発生率の急増を検知します。

### 3. HTTPステータスコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/794179a1-447e-f5ed-a0db-0b3f3228e68a.png)
HTTP状況コードって耳慣れないですね。
こういう所の翻訳、、、うまく調整したいものです。
それはともかく、画像の通り5xx等のステータスコードを指定して、発生数の急増を監視することが出来ます。

### 4. 呼び出し回数の想定外の減少
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/1de61ca4-e3e4-dbb8-78d7-0e4e4a0cc8e7.png)
何らかの理由によって、システムの利用量が減少したことを検知します。

### 5. 呼び出し回数の想定外の増加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/31665c50-5999-d116-92cd-ebe90cb82881.png)
SNSで話題になったり、攻撃を受けたりした場合のリクエストの急増を検知します。

## お奨めの使い方
### 1. まずは全体（グローバル）に適用
私のお奨めの使い方ですが、なんと！
「細かい設定は後にして、まずはしきい値のタイプに適応を選択できる、「応答時間の劣化」と「HTTPステータスコード」と「呼び出し回数の想定外の増加」を適用してみる。」
です。

スマート・アラートには「グローバル」と「非グローバル」がありまして、その名の通り、グローバルはそのInstanaの監視中の全てのアプリケーションに対して適用されます。
これを使って全体を一挙に監視します。
細かい条件などは後から考えます。
作るとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/c1bf585b-1a44-5cfb-7161-370f0490f057.png)

この際、以下に気をつけてください。
1. 「しきい値のタイプ」は「適応」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/00900db7-04df-5887-9d12-7e84b93498e3.png)
もちろん、値を明示できる場合は静的でも良いですが、いろいろ考えるぐらいなら「適応」を選択しましょう。

2. スコープは「各アプリケーション・パースペクティブのコンテキストでサービスごと」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/be584eae-2e56-f761-84f0-cf2642e807ab.png)

ここでの説明は割愛しますが、アラートチャネルの指定は忘れないでください。
これでInstanaを使った監視を始めることになります。
沢山アラートが飛んでくるか、少ないかは、システムの特性によります。

### 2. 慣れてきたらカスタマイズ
慣れてきたらカスタマイズをしましょう。
検出が敏感/鈍感すぎると思ったらしきい値を変更します。
あるいは特定のAPIだけ監視したい場合は、対象を絞り込んだアラートを新規作成します。
（この辺りを書き始めると長くなるので、また今度で。）

## さいごに
どうでしょうか？
カンタンに始められて、効果を実感できる機能だと思います。
このカンタンさがInstanaの魅力だと思います。

Instanaを使っていても、スマート・アラートを使っていないという方は、ぜひとも使ってみて下さい。
今まで見過ごしていたことに、気づきを得られるかも知れません。
Pybricksについて

# Pybricksとは

[Pybricks](https://pybricks.com/)は、マイコン内蔵のLEGOブロックとそれに繋がるモーターやセンサー類を MicroPython で制御するための環境です。

![スクリーンショット 2023-12-10 22.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/871c21d3-abb6-b1d5-a494-775a4892ad24.png)

最初は LEGO Mindstorms EV3 で動く [debian](https://www.debian.org/) である[ev3dev](https://www.ev3dev.org/)で動く MicroPython として [LEGO 公式](https://pybricks.com/ev3-micropython/)としてリリースされました。マイコン用というよりは、むしろ Unix 版が乗っかっている感じです。

その後、Pybricks コミュニティでは他の STM32 マイコン内蔵で OS レスのブロック用に MicroPython 移植を進め、今では次のものがサポートされています。

* LEGO Boost シリーズ
* LEGO CITY シリーズ Powered Up 搭載もの
* LEGO Technic シリーズ Control+ 搭載もの
* LEGO MINDSTORMS Robot Inventor
* LEGO Spike プライム
* LEGO Spike ベーシック

# 開発環境

Pybricks では感発環境として Web ブラウザ上で動作する [Pybricks Code](https://code.pybricks.com/)を提供しています。

![スクリーンショット 2023-12-10 22.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/042d283d-ae27-60b9-cc9f-1e138de4c158.png)

ファームウェアのインストール、スクリプト作成、スクリプトの転送、REPL はすべてこの環境で行えます。ファームウェアのインストール、スクリプトの転送、REPL接続はWeb　ブラウザの WebBluetooth を使って BLE 経由で行われます。

ドキュメントもこの環境から参照できます。

※　ドキュメントの[私家版和訳](https://pybricks-api-ja.readthedocs.io/ja/latest/index.html)もあります。

# プログラミング可能な LEGO ブロック

[次回](https://qiita.com/inachi/items/4ab52ff28ce9806bf6c0)、Pybricks でプログラミング可能なLEGOブロックとそのスペックについて紹介します。
セキュリティの舞台裏のハッカーたち

「ハッカー」という言葉が出ると、ほとんどの人は即座にサイバー犯罪者を連想します。しかし、ハッカーは多様な個人を含む広範なスペクトルを持っており、ハッキング自体はシステム管理者の許可なしに行う場合を除いて、本質的に違法ではありません。実際、多くの企業や組織は、システムとインフラのセキュリティ向上のためにハッカーのサービスを利用しています。これらのハッカーは一般に、彼らの動機と違法活動の有無に基づいて「ホワイトハット」、「グレーハット」、「ブラックハット」、「レッドハット」と呼ばれ、それぞれ異なるタイプに分類されます。

![ハッカーたちの物語](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/708528a3-ef49-4a4c-f117-94f70da6374e.png)


## ホワイトハットハッカー：
ホワイトハットハッカーはサイバーセキュリティの領域において重要な要素です。いくつかの企業はセキュリティエキスパートとして雇用し、デジタルアセットを保護します。Ethical hacker（倫理的ハッカー）とも呼ばれ、彼らは潜在的な脅威と脆弱性を特定する重要な役割を果たし、これによりサイバー犯罪活動やデータ侵害を防ぎます。ホワイトハットハッカーはコンピュータインフラの評価に知識と専門知識を活用し、主にペネトレーションテスターとして活動します。これらの専門家は、システムの脆弱性とセキュリティの弱点を発見するために努力し、厳格な倫理規定に従います。


## ブラックハットハッカー：
ブラックハットハッカーは一般にサイバー犯罪者に該当することが多いです。これらの個人もまた深い知識と専門知識を持っていますが、それを悪意のある目的に使用します。ブラックハットハッカーは個人または財政的な利益を意図してコンピュータやシステムに侵入するなど、違法な活動に従事します。彼らの行動は情報の窃取にとどまらず、データの改竄や破壊を含むことがあり、これにより大きな損害と財政的損失を引き起こします。

さらに、ブラックハットハッカーは悪意のあるソフトウェア、通常はマルウェアと呼ばれるものを作成し、配布することで悪名高いです。これらのツールを使用してセキュリティの強化されたコンピュータやシステムへの不正アクセスを試み、結果的に世界的な規模でサイバーセキュリティを脅かしています。

ホワイトハットハッカーとブラックハットハッカーの最も重要な違いの1つは、ホワイトハットハッカーが常にシステムオーナーの明示的な許可の下で操作するということです。これは彼らの行動がシステム管理者によって認可され、完全に合法であることを意味します。彼らはセキュリティの向上のためにスキルを使用し、潜在的なサイバー脅威に対抗するために組織の防御を強化するのに役立ちます。

## グレーハットハッカー：
倫理的なジレンマが存在するように、グレーハットハッカーと呼ばれるハッカーも存在し、ホワイトハットとブラックハットの中間地帯を占めています。グレーハットハッカーは、ホワイトハットとは異なり、システムオーナーの同意なしにコンピュータシステムの脆弱性を積極的に探求します。彼らがそのような脆弱性を発見すると、通常は特有のアプローチを採用します。

グレーハットハッカーは問題を特定した後、通常は特定の行動をとります。これらの脆弱性をシステムのオーナーに報告し、それに対処し問題を修正する機会を提供します。システムの脆弱性を探求しますが、その行動が合法か非合法かは明確ではありません。彼らは発見した脆弱性を報告し、修正の機会を提供する一方で、時には倫理的な疑問が浮かび上がります。

## レッドハットハッカー
レッドハットのハッカーは、積極的な手段を使ってブラックハットハッカーを制止するハッカーを指します。彼らは基本的には邪悪ではないけど、悪者たちを止めるためにできる限りのことをやります。自分から行動を起こすことも辞さないんです。サイバー犯罪者やサイバーアタッカーのサーバーを攻撃し、そのリソースを壊す等手段を選ばないんです。

レッドハットハッカーは、よく仮想世界のロビンフッドと呼ばれています。彼らは勇敢なアウトローのように、犯罪者やアタッカーが被害者から奪ったものを奪い返すことにためらいません。そして、ロビンフッドとその仲間たちのように、奪われた物を自分たちで保持することはありません。その代わりに、それらを元の所有者に返します。

## 終わり
ホワイトハットハッカーはセキュリティ強化に貢献し、ブラックハットハッカーは悪意ある活動に従事します。グレーハットハッカーは倫理上のジレンマに位置する中、報告と修正の機会を提供します。彼らによる攻防は企業や組織にとってサイバーセキュリティ対策の指針作成に繋がり、進化するサイバー環境において彼らの役割と影響が変容し続けることが予測されます。
ABAP Programing Contest 

ABAPプログラミングコンテスト

標準受注伝票登録・変更プログラムを下記要件に従って作成しなさい。

１、ユーザがSAPGUI画面から、ローカルPC、または所定のアプリケーションサーバーファイルディレクトリからExcelファイル(csv等フラットファイルは不可)を読み込みして、標準受注伝票の登録、変更が可能にする事
２、アップロードするExcelファイルの伝票項目は現段階未定のため、受注伝票の全ての項目を動的に取捨選択ができるようにファイルレイアウトを設計する事
３、登録・変更対象の受注伝票タイプは標準受注、デビ・クレ、返品、見積、引合を対応可能にする事。
4、受注伝票登録・変更を本実行する前に、シミュレーション機能が必要で、シミュレーション結果をALVレポート画面にて確認し、エラー情報と対象レコードがわかるようにする事
５、1回の受注登録・変更処理では1万レコード以上の伝票明細が処理できる事、10万レコード以上の場合はバックグランド実行が可能にする事
6、受注伝票にカスタム拡張項目があっても対応できるように設計する事

但し、6番要件はオプションとさせていただきますので、チャレンジャーの裁量にお任せいたします。

当該コンテストはあくまでABAP開発者間の知識、知見共有のために、個人名義で開催させていただきます。
上記要件を全て達成出来た方はどなたでも応募可能です。達成した方には当方から実装機能およびソースコード確認後、報奨金として10万円差し上げますが、先着3名までとさせていただきます。
なお、当該コンテストは予告なく終了することがありますので、ご了承のほど宜しくお願いします。
固定小数点16,16で遊ぶ1(加算、減算)(M0、M0+)



固定小数点16,16で遊ぶ1(加算、減算)


目的
センサーの値を計算する


x = 0x1000 2000
y = 0x3000 4000


x + y = 0x4000 6000

y - x = 0x2000 2000


プログラム


```c++


void setup() {
  Serial.begin(9600);

  int x = 0x10002000;
  int y = 0x30004000;

  Serial.print("x + y =");
  Serial.println(x+y,HEX);

  Serial.print("y + x =");
  Serial.println(y-x,HEX);
}

void loop() {
}

```


結果


```

x + y =40006000
y + x =20002000



```
ABC332をPythonで（A~D）

AtCoder Beginner Contest 332

https://atcoder.jp/contests/abc332

# A問題
問題文の通りに書く
```python:A
n, s, k = map(int, input().split())
sums = 0
for _ in range(n):
    p, q = map(int, input().split())
    sums += p * q

if sums >= s:
    print(sums)
else:
    print(sums + k)
```
# B問題
丁寧にシミュレーションをする
```python:B
k, g, m = map(int, input().split())

a = b = 0
for _ in range(k):
    if a == g:
        a = 0
    elif b == 0:
        b = m
    else:
        if a + b <= g:
            a += b
            b = 0
        else:
            b -= g - a
            a = g

print(a, b)
```
# C問題
ロゴ入りを$i$枚買ったとしてシミュレーションをする
途中で破綻しなかったらそれが正解

```python:C
n, m = map(int, input().split())
s = input()

def solve(t):
    a, b = m, t
    for s_i in s:
        if s_i == "0":
            a, b = m, t
        elif s_i == "1":
            if a > 0:
                a -= 1
            elif b > 0:
                b -= 1
            else:
                return False
        else:
            if b > 0:
                b -= 1
            else:
                return False
    return True

for i in range(n + 1):
    if solve(i):
        print(i)
        exit()
```
# D問題
まず縦横のスワップは他方に影響を与えない
よって縦横でスワップの局面と回数と全て調べて
Bと一致できるか全探索する
```python:D
from collections import deque

h, w = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(h)]
b = [list(map(int, input().split())) for _ in range(h)]

def calc(n):
    q = deque()
    q.append([i for i in range(n)])
    check = set()
    check.add((i for i in range(n)))
    cnt = 0
    # print(n, s, t)
    data = dict()
    while q:
        new_q = deque()
        while q:
            a = q.popleft()
            if cnt not in data:
                data[cnt] = []
            data[cnt].append(a)
            for i in range(n - 1):
                a_i = a[::]
                a_i[i], a_i[i + 1] = a_i[i + 1], a_i[i]
                if tuple(a_i) not in check:
                    check.add(tuple(a_i))
                    new_q.append(a_i)
        q = new_q
        cnt += 1

    return data

d1 = calc(h)
d2 = calc(w)

def check(p1, p2):
    for i in range(h):
        for j in range(w):
            if a[p1[i]][p2[j]] != b[i][j]:
                return False
    return True

INF = float("inf")
ans = INF
for k1, v1 in d1.items():
    for k2, v2 in d2.items():
        if any(check(p1, p2) for p1 in v1 for p2 in v2):
            ans = min(ans, k1 + k2)

print(-1 if ans >= INF else ans)
```
SpringフレームワークにおけるBean定義の使い分け

# 1. はじめに
Springフレームワークを用いたアプリケーション開発をする中で、Bean定義の使い分けがわからずに調べた内容を記事としてまとめます。


# 1.  3種類のBean定義
Springにおいて、Bean（ビーン）の定義はアプリケーションのコンポーネントをSpringのDIコンテナに登録する手段です。Beanの定義には3つの方法があります。

## 1.1 アノテーションベースのBean定義
使用場面: 自動検出によってBeanをスキャンしてコンテナに登録する場合。
特徴: @ComponentScanアノテーションを使用し、特定のパッケージ以下のコンポーネントをスキャンしてBeanとして定義される。
```java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // 何も定義しなくても、スキャンされたコンポーネントが自動的にBeanとして登録される。
}
```

## 1.2 JavaベースのBean定義
- 使用場面: Java構成クラスを使用してBeanを定義する場合。
- 特徴: @Configurationアノテーションが付いたJavaクラス内で@Beanアノテーションを使用して定義される。
```java
@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
```

## 1.3 xmlベースのBean定義
- 使用場面: 伝統的なアプローチで、設定を外部のXMLファイルに定義する場合。
- 特徴: XMLファイルにBeanの設定が書かれる。コンテナの設定ファイル（通常はapplicationContext.xml）で定義される。
```xml
<bean id="myBean" class="com.example.MyBean">
    <property name="property1" value="value1" />
</bean>
```

# 2.  Bean定義の使い分け
まず、アノテーションベースとJavaベースを比較します。
アノテーションベースの長所は大量のBean定義が簡潔にできることです。各Implクラスにアノテーションを付けるだけなので、開発者の負担は大きくありません。短所としては、開発者が作成したクラスにしか使えないことです。例えば、データベース接続を管理するDataSourceインターフェースのImplクラスはライブラリを活用しますが、ライブラリのソースコードを改変することはできないため、アノテーションをつけられません。
対して、Javaベースの長所は、このようなライブラリが提供するImplクラスでもBean定義できることです。ライブラリのImplクラスをコンストラクタとして呼び出し、戻り値で返せばBean定義することができます。短所は、大量に定義する負担が大きいことです。

このため、開発者が作成したImplクラスのBeanを定義する際はアノテーションベースの定義、ライブラリのクラスを定義する場合はJavaベースの定義を使えばよいとわかります。

最後に、xmlベースのBean定義ですが現在あまり使われていません。なぜならばxmlベースはJavaベースの下位互換であるためです。xmlベースの長所短所は上記のJavaベースのものと同じですが、xmlベースの場合は、クラス名を文字列で記述するため間違えの温床となるためです。

# 3.おわりに
Bean定義の使い分けを整理することができました。Springフレームワークの理解に貢献できたら幸いです。
ABC332回答メモ

# 0.はじめに
　久々に冠無しで日曜日開催というイレギュラーな感じでしたが
　内容はなかなか難しく、ABCでやっとでした。
　E問題の福袋は何も入っていなくてもよいという前提が
　納得いかなかったです。（それがあっても無くても解けませんが。）
　メモを取るほどの問題でなかったですが一応記載しました・・・。

  ちなみに土曜日のARCも参加したのですが、記事にできるほどの成果もなく
　レートダウンしております。


# 1.A - Online Shopping
　なかなかややこしい問題。
　素直に全商品の購入代金を求めてから
　最後に送料かかるかを計算して回答でACでした。

　https://atcoder.jp/contests/abc332/submissions/48365658

# 2.B - Glass and Mug
　これもややこしい問題。
　とはいえ、問題に書いている手順を素直に実装するだけで
　特にひねりのない感じの問題でした。
　3番目のケースの時、グラスに一部残っているパターンを
　取りこぼさないか位がポイントかなと思います。


　https://atcoder.jp/contests/abc332/submissions/48371174

# 3.C - T-shirts
　この問題もややこしいだけで、特にひねりなく解けました。
　ロゴ入りTシャツを足りなくなったら買うという体で
　足りない分を集計していけば特に悩むことなく解けました。

　https://atcoder.jp/contests/abc332/submissions/48378466


 以上
"Higher Orderメッセージ"でCollectionの更なる高みへ

## 概要
Collectionには、"Higher Orderメッセージ"なる機能が存在します。
"Higher Orderメッセージ"に対応しているCollectionメソッドを動的プロパティのように記述して処理を短くかけるというものです。
何のこっちゃと思うので例を書いてみます

## 例1
```php
$users = User::all();

//before
$users->each(function (User $user){
    $user->archive();
});

//after
$users->each->archive();
```
beforeを"Higher Orderメッセージ"で書き直したのがafterになります。

「`$users`の単一の要素を`each`で繰り返します。その際に`archive`をします。」

みたいな書き方。

## 例2
mapの場合だと

```php
$users = User::all();

//before
$users->map(function (User $user){
    $user->profile;
});

//after
$users->map->profile;
```
みたいな感じ。勿論チェーンで通常のコレクションメソッドを繋げて書けます。
ユーザー達の画像コレクションの内、最初のレコードを取得する例を挙げてみましょう。


```php
$users = User::all();

//before
$users->flatMap(function (User $user){
    $user->images;
})->first();

//after
$users->flatMap->images->first();
```
こんな感じに通常のコレクションを後ろから生やす事が出来ます。
`flatMap->images`の段階で出来上がるのはimageオブジェクトのフラットなコレクションですからね。

一応
```php
$users->flatMap->images->map->user;
```
みたいにチェーンで繋げて動かす事も可能なようですが、`first`は上手く動作しませんでした。
## 対応しているメソッド
average、avg、contains、each、every、filter、first、flatMap、groupBy、keyBy、map、max、min、partition、reject、skipUntil、skipWhile、some、sortBy、sortByDesc、sum、unique、takeUntil、takeWhile

## 参考
https://martinjoo.dev/laravel-higher-order-collections
[Ubuntu 22.04] pyenvを用いたwxpython対応Pythonインストール 

## はじめに
プログラム開発でwxpythonを用いるためwxpythonを使用できるPython環境を構築している。これはpyenvと共にPythonをインストールする。Ubuntu 22.04でpython環境構築で必要なライブラリが少し変わっている様だったのでメモ書き。

## pyenvインストール
pyenvインストールについてはネットで検索される情報でよい。pyenvインストールに必要なライブラリをターミナルを使ってインストール。
```terminal:terminal
$ > sudo apt install -y build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev git
```
pyenvのクローンをコピー
```terminal:pyenv
$ > git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
.bashrc内に下記を追記
```terminal:.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
ターミナルより下記コマンドでpyenvを有効化
```terminal: terminal
$ > source ~/.bashrc
```
さらに下記でバージョンが表示されれば設定終了
```terminal: terminal
$ > pyenv -v
pyenv 2.3.35（バージョンNo.はインストールされているものによる）
```
pyenvのアップデートを簡単にする場合は
```terminal: terminal
$ > git clone https://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update
```
ターミナルで
```terminal: terminal
$ > pyenv update
```
と入力するとアップデートされる。

## wxpythonインストール準備
wxpythonインストールに必要なライブラリをインストール。Ubuntu 22.04 Ltsの場合は下記。最近tk-devを別途インストールしなければならなくなった。
```terminal: terminal
$ > sudo apt-get install -y libgtk2.0-dev libgtk-3-dev libjpeg-dev libtiff-dev libsdl1.2-dev libgstreamer-plugins-base1.0-dev libnotify-dev freeglut3 freeglut3-dev libsm-dev libwebkitgtk-6.0-dev tk-dev
```
[こちら](https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-22.04/ "wxpython")からwxpythonが対応しているpythonバージョンを確認しておく。2023年12月ではpython 3.11まで対応している。

## Pythonインストール
pyenv経由でインストールできるpythonパッケージを確認。
```terminal: terminal
$ > pyenv install --list 
```
個人的趣味でバージョン番号のみのパッケージを使用。バージョン3.11での最新は3.11.7なのでこれを選択。小数点2桁目の数値が10以上の場合、wxpythonのビルドが失敗することがあるので要注意。
wxpython用インストールにはconfigure optionが必要なため下記でインストール。
```terminal: terminal
$ > env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.11.7
```
インストール終了後このpythonを使用できるようにグローバル化する。
```terminal: terminal
$ > pyenv global 3.11.7
```
ターミナルでpythonバージョンを確認できればインストールされている。
```terminal: terminal
$ > python -V
Python 3.11.7
```
Proxy経由のネット環境にある場合、pipでエラーが出ることがある。この場合は~/.configディレクトリにpipディレクトリを作成し、そこに下記内容のpip.confファイルを作成する。
```terminal: ~/.config/pip/pip.conf
[global]
proxy = http://proxy.ip:port/
trusted-host = pypi.python.org
               pypi.org
               files.pythonhosted.org
```
多分これでpipが通る。

## wxpythonインストール
念のためpythonのpip, setuptools, wheelをアップデートする。
```terminal: terminal
$ > pip install --upgrade pip setuptools wheel
```
ターミナルから下記でwxpythonをインストール
```terminal: terminal
$ > pip install wxpython
```
ソースコードがダウンロード、ビルドされてからインストールされるため時間がかかります。

## 最後に
通常より面倒な手続きが必要です。お疲れ様でした。
Goでcsv

アドベントカレンダー10日目。
csvファイルの扱いについてです。

以下のCSVファイルを用意しておきます。
```bash
cat app/day10/sample.csv
Name,Age,City
Alice,25,New York
Bob,30,Los Angeles
Charlie,35,Chicago
```

## 読み取り
```go
package main

import (
	"encoding/csv"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("app/day10/sample.csv")
	if err != nil {
		return
	}
	defer file.Close()

	r := csv.NewReader(file)
	for {
		record, err := r.Read()
		if err != nil {
			return
		}
		fmt.Println(record)
	}
}
```

```bash
$ go run app/day10/main.go
[Name Age City]
[Alice 25 New York]
[Bob 30 Los Angeles]
[Charlie 35 Chicago]
```
思ったより短い記述で読み取りができました。
リストとして出力されています。
TreasureDataクエリ専用のCLI

仕事でTreasureData CDPを使うことになった。CLIが欲しいのでしらべたら [ToolBelt](https://toolbelt.treasuredata.com/) があった。ToolBeltだと色々できるが、ただ自分がtrino clientに慣れたので、query専用のCLIが欲しかった。調べたところ以外とあまりなかったので、作ってみた。

基本的にのイメージはコマンドラインからコマンドを受け、TreasureDataのRest APIを叩いて結果を表示する。それだけ。

最初に、PythonのCmdモジュールを使ってみた。基本のところができたがやはり物足りない。自由にキーボードでカーソルを動かしたり、マルチラインでクエリを編集したり、ヒストリーをもどしたり欲しくなった。

調べたところ、 [Prompt Toolkit](https://python-prompt-toolkit.readthedocs.io/)　が良さそうかったのでベースを CmdモジュールからPrompt Toolkitへシフトした。

他にSQL分の解析も必要なので、当初はシンプルな正規表現で頑張ろうとしたがやはり限界があるので、[sqlparse](https://pypi.org/project/sqlparse/)　へシフトした。

結果として、個人的に便利なものができた https://github.com/bachng2017/tdq

#### インストール方法
```
pip3 install --user tdq
```

#### tdqのサンプル
画面サンプル
![tdq_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/6a521a37-afcd-4f0c-5d6d-5544f78474ec.gif)


### 参考
- https://python-prompt-toolkit.readthedocs.io
オープンソースへの取り組みについて

この記事は[Dynatrace Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dynatrace)の10日目の記事になります。

本記事ではDynatraceのオープンソースへの取り組みについて紹介していきます。

# OpenTelemetry

まず1つ目が[OpenTelemetry](https://opentelemetry.io/)になります。OpenTelemetryについては改めて紹介不要と思いますが、簡単にいえばベンダー非依存のAPIやSDKなどからなるオブザーバビリティフレームワークです。
Dynatraceは過去5年間におけるコントリビューション数では4位につけるなど非常に活発に貢献活動をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/f76e1090-a0b3-314d-667b-a59c286c81f3.png)
https://opentelemetry.devstats.cncf.io/d/5/companies-table?orgId=1&var-period_name=Last%205%20years&var-metric=contributions

# Keptn

2つ目が[Keptn](https://lifecycle.keptn.sh/)です。**キャプテン**と発音するのが正しいです。
クラウドネイティブ環境におけるの継続的デリバリーと運用の自動化のためのオープンソースのコントロールプレーンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/ca9f6d3c-e4df-658a-0ba4-45b9817077a0.png)

# OpenFeature

3つ目が[OpenFeature](https://openfeature.dev/)になります。
ソースコードを変更することなく、製品やサービスの特定の機能やコードパスの動作を有効化、無効化、変更することを可能にするソフトウェア開発手法であるフィーチャーフラグをベンダーに依存しないオープンな仕様です。
OpenFeatureは、開発者がアプリケーションでフィーチャーフラグを使用するための一貫した、統一されたAPIを提供します1。これにより、フィーチャーフラグの完全な使用が可能となり、フィーチャーフラグシステムが必要となります

上記3つに関しては、どれもCNCFのIncubating Projectsに名前が載っているので知っている方も多いのではないでしょうか。

# W3C Trace Context

今回の記事で紹介する最後が[W3C Trace Context](https://www.w3.org/TR/trace-context-1/)になります。

W3C Trace Context自体は分散トレースを実現するために必要なコンテキスト情報を伝搬するための標準HTTPヘッダーと値に関するフォーマットを定義するものです。
Dynatraceも標準ではこの仕組みを利用して、トレースコンテストの伝搬を行っています。また、OpenTelemetryにおける標準仕様もこのW3C Trace Contextを利用しています。

# その他

他にもDynatraceの設定を簡単にコード化できる[Monaco]()などがあります。

今回は簡単にですが、Dynatraceが取り組んでいるオープンソースプロジェクトについて紹介をしました。
さらにDynatraceのオープンソースへの取り組みが気になった方は、[dynatrace engineeringのページ](https://engineering.dynatrace.com/open-source/)もぜひご確認ください。
【移植】fzfのwiki(Example)に記載されているユーティリティ

完全に出遅れで、今頃ファジーファインダーを使いはじめて便利だったので、fzfのwiki(Example)に記載のfdaとfdr(linux版)をPowerShell(Windows)に移植してみました。
PowerShellのスクリプトのプログラミングははじめてだったので、ものすごくコード量少ないのに、エラー出まくりで半日時間が溶けてしまった(＠_＠;)

https://github.com/junegunn/fzf/wiki/Examples

以下、PowerShellへの移植版です。(Windowsでのみ、動作確認しています)
注) WSLでは動きません
```powershell:PowerShell
# fda - including hidden directories
function global:fda() {
  $_Dirs = Get-ChildItem -Recurse -Directory 2>nul
    | foreach {
      $_.FullName | Resolve-Path -Relative
    }

  $_Dirs = $($_Dirs | Sort-Object 2>nul | fzf +m) && cd ($_Dirs)
}

# fdr - cd to selected parent directory
function global:fdr() {
  param (
    [String] $Path
  )

  if ($Path -eq "") {
    $_Path = Convert-Path .
  }

  $script:_Dirs = @()
  $script:_Qualifier = Join-Path (Split-Path $_Path -qualifier) "\"

  function get_parent_dirs {
    param (
      [String] $Path
    )
  
    if ($Path -eq "") {
      $_Path = Convert-Path .
    }

    if ($_Path -ne $_Qualifier) {
      $_Path = Convert-Path (Split-Path $_Path)
    }

    If ((Get-Item $_Path).PSIsContainer) {
      $script:_Dirs += ($_Path)
    } Else {
      return
    }
  
    If ($_Path -eq $_Qualifier) {
      For ($i = $script:_Dirs.Count; $i -ge 0; $i--) {
        Echo $script:_Dirs[$i]
      }
    } Else {
      get_parent_dirs ((Get-Item $_Path).FullName)
    }
  }

  $DIR=$(get_parent_dirs (Get-Item $_Path).FullName | fzf)
  cd $DIR
}
```

上記のコードをPowerShellのプロファイルとして登録することで、PowerShellを起動したときに自動で読み込み、コマンドが使えるようになります。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4

登録方法はPowerShellの初学者向けに簡単に説明すると

まず、$PROFILE変数で登録されているプロファイルのパスを確認してください。

```powershell:PowerShell
$PROFILE | Select-Object *
```
* すべてのユーザー、すべてのホスト - $PROFILE.AllUsersAllHosts
* すべてのユーザー、現在のホスト - $PROFILE.AllUsersCurrentHost
* 現在のユーザー、すべてのホスト - $PROFILE.CurrentUserAllHosts
* 現在のユーザー、現在のホスト - $PROFILE.CurrentUserCurrentHost
* 現在のユーザー、現在のホスト - $PROFILE

$PROFILE変数は上から4つと、ショートカット的に使える$PROFILEがあり、特に理由がなければ、最後の$PROFILEを使えば良いでしょう。

次に、メモ帳で$PROFILEで指定されているプロファイルのファイルを開き、このページの最初に記載のコードをまるっと貼り付け(既存のコードがある場合は追記)て保存後、メモ帳とPowerShellを終了してください。

```powershell:PowerShel
notepad $PROFILE
```

そして、おもむろにPowerShellを開くと、問題がなければ "fda" と "fdr" の2つのコマンドが使えるようになっているはずです。

使い方は説明するまでもないかもしれませんが、"fda"の方は、あいまい検索でカレントディレクトリ配下のディレクトリへ移動できます。
"fdr"については、カレントディレクトリからドライブのルートディレクトリに向かってディレクトリがリストアップされるので、こちらもあいまい検索でディレクトリ移動できるというものです。
タイトルにもあるように、コマンドの内部でfzfを呼んでいるので、操作自体fzfそのものです。

いつになるかわかりませんが、気が向いたら他のコマンドも移植するかもしれないので、自分で移植するのが面倒という人は気長に待っていると、そのうちコードが降ってくるかもしれません(笑

それでは、次の投稿でお会いしましょう。
さいごまでお読みいただき、ありがとうございました。
ChatGPTにアプリを作ってもらう２

# この記事について

自分用のwebアプリをChatGPT(3.5) に全部作ってもらおうとしている途中。前回は [こちら](/nistake/items/0836daca666d9f304f08)。

また重くなってきたのでセッション切替記念に、次のプロンプト。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12729/38b70231-b8cf-d409-3a29-cb3327c48c87.png)

以下、このプロンプトの結果。Qiita用に出力を再整形したこと以外は無編集。

---
# 書籍感想アプリの開発冒険

## 第1章: プロジェクトの舞台裏
ある日、中学生の冒険者が、「書籍感想アプリ」の開発に挑むことになりました。彼は先輩冒険者（ChatGPT）と連携し、アプリの冒険に乗り出すことに。

### 問題発端
彼は最初、Vuexを使ってフィードバックメッセージを管理しようとしましたが、プロンプトの中で明確な指示がなく、混乱が生じました。

#### 中学生冒険者:
「vuexの導入は見送ります。App.vue でページ遷移したときにフィードバックメッセージを消去するのもいったん見送ります。」

### 問題点:
プロンプトが不十分で、Vuexの導入やメッセージの消去に関する具体的な指示がなかった。

## 第2章: メモの冒険
次に、Firebaseを使ってメモの取得を試みました。しかし、エラーや表示されない問題に遭遇しました。

### 問題再発
中学生冒険者はFirebaseのコードを修正しましたが、期待した結果が得られませんでした。Firebaseからのデータが正しく取得できないことがわかりました。

#### 中学生冒険者:
「結果は次のように表示されているので、this.memos の要素数は常に０です。」

```javascript
Copy code
[__ob__: Observer]
length: 0
```

### 問題点:
Firebaseからのデータ取得がうまくいかず、データが正しくロードされていない。

## 第3章: バトルの続き
その後、Vuetifyを導入しようとしたところ、Vuetifyが正しく初期化されていないエラーに直面しました。

### 問題連発
中学生冒険者はVuetifyの初期化エラーに苦しんでいましたが、そのエラーは主に開発環境でのものであり、本番環境では問題ないことが分かりました。

#### 中学生冒険者:
「エラーメッセージを見ると、gapi（Google API）関連の問題があるようです。」

### 問題点:
開発中の問題であり、本番環境で発生する可能性が低い。ただし、理解には時間がかかった。

## 結末
冒険の果て、中学生冒険者はVuexを諦め、FirebaseとVuetifyのエラーは開発中の問題であることを理解しました。プロンプトが不十分な点や、理解に誤りがあった点が冒険を難しくしましたが、成長の機会となりました。

#### 中学生冒険者:
「次はもっと具体的なプロンプトを心がけよう。そして、一度理解した内容も振り返って確認する大切さを学びました。」
SVG画像をWebサイトに埋め込むJavaScriptを作るスクリプトを作ってみた

# 動機

同僚がAWSのアイコンを表示するためのCSSを吐き出すスクリプトを作っており、ラスタ画像をbase64してたので、それに対して僕がbase64するとサイズ3割増になるのでSVGを埋め込むJavaScriptを用意する方が良いのではと返しました
そんなことを言いつつ、まず言い出しっぺがとりあえず実装してみようと思いました

AWSのアイコンに限らず汎用的にSVG画像を処理するものを作ってみました

# やったこと

## 基本的な流れ

- SVG画像は内部的にはXMLなので読み込んだSVG画像からSVGタグの内容を抽出する
- ファイル名をベースにしたものをキーとして、上記の内容を値として保持する
- 上記のオブジェクトを読み込んでDOM構築後にタグにSVGを設定していくJavaScriptを出力する

## 成果物

https://github.com/m-m-n/svg-js

# 何故SVGを使うのか

- 拡大縮小に強い
- インラインSVGならCSSで装飾もできる

# 工夫した点

特にこれと言った点はないですが[deno](https://deno.com/)でサクっと実装できて良かったです
[ここ](https://github.com/m-m-n/svg-js/blob/main/scripts/index.ts#L11)で第二引数のMIMEを `image/svg+xml` にしてたらエラーになったのが唯一の罠でした
他は素直にやりたいことの通りに書けたと思います
エンジニアと子育て小学生編

## エンジニアと子育て

エンジニアにも子育てする時が来る

そんなエンジニアのはじめての子育て小学生編を考えてみた


## 小学生に求めること

大都市圏だと中学受験が標準なのかも知れない。

そんな話を聞くことのほうが多い。

私自身は中学受験していないけど、きっと中学受験で学力の底上げをすることは良いことなのかも知れない

## 中学受験で燃焼しきってしまう

中学受験で燃焼しきってしまうという話を聞く。

長い人生なので、何もそこで燃焼しきらなくても良いとは思うだろうが、中学受験をしている小学生の話を聞く限り、勉強漬けで燃焼し切るんだろうなと感じる。

中学受験だけではないのだけれども、入学後も自分で勉強を出来る子が、進学したほうが良いのだろうなと思う。

## 中学受験の有無に関わらず小学生とどう接するか

正直自分にできるかと言われればそれは難しい話だが、子育てというのは子供を邪魔しないことだと思う。

これは自分に置き換えればわかりやすいけど、勉強しろと言われても勉強したくはならないからだ。

ただ、勉強しろと言わなかったら、本当に勉強しない子の方が大多数なので、勉強しろと言わないという選択肢はないと思う。

そんな中、小学生とどう接していくかについて、やはり邪魔しないことだと思う。


## 東大入った子インタビュー

東大は言った子のインタビューで、子供の頃勉強しろと言われなかったという逸話がある。

これは事実であるが真実ではないと思う。

つまり、元々自分から勉強できる子だから勉強をしただけだと思う。

これは、サッカー好きだからずっとサッカーしてたとか、走るの早かったから陸上やってたとかと同じで、何かしらの成功体験ありきで、勉強するのが日常になったのだと思う。

## 親との軋轢

結局親との軋轢は、やらされる感かも知れない。

親としては勉強をしておいたほうが良いからそう言うのだが、親も、親業が初めてなので、うまく伝えることができない。

また、親業が初めてかどうかに関わらず、正直仕事していていっぱいいっぱいで、落ち着いて伝えることができない。

そんななか、中学に入ってしまうと取り返しがつかなくなると思う。

つまり、小学校の頃は、ギリギリ親が勉強をさせて、やるという選択を取ってくれる、本当にギリギリの段階なんだと思う。

だからこそ、中学受験後に燃焼し切る子が現れる。

そうならないためには、やはり邪魔しないことだと思う。

とても難しいし、ここで語り切るには足りない。

でも、邪魔しないことが大切。

## 邪魔しないことって何？

本当になんだろうなと思う。

邪魔してはいけないけど、ゲーム三昧の子供を放おって置いてもいけない。

邪魔してはいけないけど、宿題はさせないといけない。

邪魔してはいけないけど、色んな選択肢を常に提案する必要はある。

つまり、親子の関係性が大切なんだと思う。

ざっくりしてきたなって思った人、親子の関係性なんてそれぞれなんで、一言で言い表すなら、親子の関係性としか言いようがない。

つまり、10数年に渡って、あきらめず、提案し続け、邪魔しないようにして、親と一緒だったらちょっとうざいけど、一緒にいたら楽しいから、言うこと聞いてあげようかなぐらいの良い関係を保つことを目標にして、小学校時代を過ごす必要があると思う。

## 一言で言い表すなら

一言で言い表すなら、お父さん大好きって、言ってくれるような関係。

それはとても難しいし、100%親の努力にかかっている。

できているかと言われると、できているとは言い難い。

それでも、意識するかどうかだけでも違うと思う。

## 起業・転職・フリーランス・プログラミング研修・エンジニア採用コンサルティングのご相談


https://park.jp/service_menu/2491


- 60分の人生相談を行っております。
- 企業の方は初回限定割引はご利用できません。
- 企業向けDXコンサルティングは年間契約でお受けしております。


https://park.jp/service_menu/2491



## 自分でもサービスを販売したい方へ

副業として無形のサービス提供をする場合、できるだけ手数料を下げて、安心して支払ってもらうスキル販売ショップサービス、【PARK】のご紹介です。

- クラウドワークスが運営
- 販売手数料 3%・決済手数料 3.5% + 40円/件
- サービスを提供する予定がなくてもストレスを減らす方法で使える（⇠重要）
↓ご登録はこちらから↓

[クラウドワークス運営スキル販売ショップPark](https://park.jp/?outer_ref=INV-BU076T "クラウドワークス運営のスキル販売ショップPark")
プロダクトマネージャになる方法

## ご挨拶
みなさん、こんにちは。2023/10/1からyuriCargoというスマホアプリのプロダクトマネージャとして雇われました。私の経験を記載することで皆さんのこれからのキャリアを考える一助になればと思い投稿いたします。

### Who am I
２０年ほど（株）日立製作所でソフトウェア開発者として働いた後、スタートアップの（株）dotDに転職しProject Managerとして２年間ほど過ごしました。その後、（株）デンソーに転職して２か月ほど過ごしました。

### なぜプロダクトマネージャとして転職したか
前職のdotDでは、Project Managerとして顧客のシステム開発をサポートしていました。お客様からはそれなりに評価していただき充実した毎日を送ってはいたものの、ソフトウェアエンジニアとして技術力を磨く時間を取りづらく、今一度、エンジニアとして手を動かしたいと思い、プロダクトマネージャ職を募集していたデンソーに転職しました。

### プロダクトマネージャ転職時に見られたこと
大きく分けて以下の３つを面接時に面接官から評価されたと思っています。
1. 人間性
    - 自組織に合うキャラクターの人間かを見られました。これは組織やyuriCargo開発メンバーになじめるかを見られたと思います。例えば、一緒にご飯を食べに行きたいか、等。
1. 技術力
    - yuriCargo開発メンバーと技術的な部分で会話が可能かを見られました。過去に起こった問題に対してどうしたらよかったかを議論し、技術力の面で会話が成り立つかを見られました。
1. ラインマネジメント
    - 年齢や経験も踏まえて、プロダクトマネージャとしてだけではなく、部下を管理・育成することが出来そうかのラインマネジメントについても見られました。過去に部下を育成・評価したことがあるかを問われました。

### プロダクトマネージャ転職後に自分が大事にしていること
正直、自分が正しくプロダクトマネージャを実行できているかはよく分かりません。私がいなくてもプロダクト開発は回っていきます。（入社前はその状態であった訳ですし。。）
数々のソフトウェア開発の現場を見てきた私の経験を活かして、メンバーがうすうす気づいているけど言えないプロダクト開発上の弱い部分を指摘し一緒に改良していくよう頑張っています。
プロダクト開発業務はうまく機能しているように見えるため、開発部隊の技術サポートではなく、営業部隊と開発チームをつなぐ部分を意識して動いています。プロダクトは顧客の課題を解決するためのものと思っていますので、積極的に顧客との打ち合わせに出て顧客の顕在・潜在ニーズを把握し、営業部隊の開発チームへのリクエストが開発チームに伝わりやすくするよう支援しています。
顧客に対しても開発メンバーに対してもロードマップを提示するというのが、私の思うプロダクトマネージャのお仕事になります。まだ道半ばですが、今後はロードマップを作成することで、営業部隊も開発チームも夢の持てるプロダクト開発・営業をしていけるようにしたいと思っています。


### 参考リンク
- yuriCargoホームページ
    - https://yuricargo.com/
- DENSOのyuriCargoニュースリリース
    - https://www.denso.com/jp/ja/news/newsroom/2020/20201015-01/
【Ruby Gold3.1詰まったシリーズ】配列の添字演算子について

# はじめに
今回は配列に関する内容です。配列の添字演算子については、GoldではなくSilverの範囲だろうと油断していたら突然試験に出てきて理解があっているか不安になったのでまとめてみます。

# 確認してみた
環境はruby2.5.3です。
配列[1,2,3,4,5,6,7,8]から[4,5,6]のみを取得する方法として、下記を実行する。
~~~ruby
ary = [1,2,3,4,5,6,7,8]
ary[3..-3]
ary[3..5]
ary[3...6]
ary[3...-2]
ary[3,3]
~~~
すると、
~~~
irb(main):001:0> ary = [1,2,3,4,5,6,7,8]
=> [1, 2, 3, 4, 5, 6, 7, 8]
irb(main):002:0> ary[3..-3]
=> [4, 5, 6]
irb(main):003:0> ary[3..5]
=> [4, 5, 6]
irb(main):004:0> ary[3...6]
=> [4, 5, 6]
irb(main):005:0> ary[3...-2]
=> [4, 5, 6]
irb(main):006:0> ary[3,3]
=> [4, 5, 6]
~~~
全ての結果が[4,5,6]となった。
各取得方法の詳細については下記となっています。

ary[3..-3]：3番目から-3番目までの要素（一番最後を-1として最初に近づくにつれて-1される）までを取得する
ary[3..5]：3番目から5番目までの要素を取得する
ary[3...6]：3番目から5番目までの要素を取得する（6番目は含まない）
ary[3...-2]：3番目から-3番目までの要素を取得する（-2番目は含まない）
ary[3,3]：3番目から3個分の要素を取得する

# おわりに
確認した結果、添字演算子での添字指定方法は少なくても5パターン存在することが分かりました。各パターンの理解がごちゃごちゃになった時の整理にこちらの記事をご活用いただければ幸いです。誤り等ありましたらご指摘いただけますと助かります！

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

https://bokunonikki.net/post/2018/0506_rubyexam_builtin_library/
自分用のChatGPT-4アプリ作成

## はじめに
無料で利用できる生成AIツール ChatGPT、Microsoft Bing!、Google Bardでも十分すごいのですが、有料版であるChatGPT-4を使用したいと思い自分用のアプリ作成を目指します。
ChatGPT Plusだと$20/月なので、少しでも安く使いたいという考えからのチャレンジです。

## ChatGPTの料金
いろいろ詳細に説明してくれているサイトがあるのでざっくりと

|サービス  | |料金  |説明  |
|---|---|---|---|
|Plus  || $20/月  |GPT-4モデルが利用できる  |
|GPT-4 Turbo　|入力  |$0.01/1000トークン  ||
|GPT-4 Turbo　|出力|$0.03/1000トークン||
|Vision |Low resolution | 85トークン/画像 ||
|Vision |通常|765トークン/画像|画像のサイズによって可変|

GPT-4 TurboはAPIで利用できるサービスで、使用した分だけ料金が発生します。
お試しだけなら断然こっちかなと

### トークン
公式の説明によると1000トークンが750ワード、35段落ぐらいとのこと。

## ChatAPIを使用してみる
OpenAIのアカウントを作成して、「API」へ進みます。

![範囲を選択_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/d7e4eaf4-359b-fde0-6557-e0cb4c23bed7.png)

Playgropudを起動
![ツールチップ_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/db75205d-d50e-1c05-2143-11e77e4acab5.png)

PlaygroundをChatにすると、以下のような画面になります。
![ワークスペース 1_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/3538e80e-3f92-007d-2261-ed7149b82f1e.png)

|#|項目|説明|
|---|---|---|
|①|Playground| Assinstants、Chat等が選択できます。とりあえずChatにしてみます。|
|②|SYSTEM|GPTにどういうことをさせたいのかを書くところのようです。出力フォーマットなども指定できるようです|
|③|USER|質問する文章を記入するところです。|
|④|Add message|過去の質問と回答を記入することで、文脈みたいな効果がもたせられるのかと思います。若干課金が気になります。|

ちょうど調べたいことがあったので、入力して使ってみました。回答が役に立ったかどうかは微妙でした。。。
![範囲を選択_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/a6bf5977-378d-65e7-4f8d-197e01bcd3d0.png)

２往復ぐらいしたところで、料金をしらべてみました。$0.10（約15円）上昇しました。
意外とすぐにクレジットを使いきってしまうかもです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/59671ce9-95a1-23e7-bbec-e20632947c11.png)

すでにWebアプリとして利用できる状態なので、一旦はここまでにして、どういう風に使用するのが自分的によいのか考えていきます。もっと慣れてきてから自分用のアプリを作ることにします。
「Alt」＋「Esc」でアプリを切り替えられると開発効率が爆増する

# はじめに
こんにちは。qiitaに投稿されている記事ってタグがつけられるじゃないですか。「JK」のタグを世界で一番使っているのってどうやら僕みたいですね。Contribution数では負けていてもJKブランドでは負けません。どうもえか太郎です。
閑話休題
前回私はキーの割り当てを変更することで開発効率を爆上げしようとしました。次はめっちゃ便利なショートカットキーの紹介です。けっこうマイナーだと思うのでぜひ知ってほしいです。
# 本題
このショートカットはアプリを切り替えます。正確にはタスクバーに起動と表示されているアプリの右側の起動しているアプリが表示されます。例えば以下の例だとChromeの次にVScodeが表示されます。

![スクリーンショット (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/64398b63-d01f-2229-726d-18370d8e3fe3.png)

## 「Alt」＋「Esc」とは？
みなさんアプリを切り替えるときは「Alt」＋「Tab」を押すと思います。しかしウェブ開発をするときって最低エディタとブラウザさえあれば問題ありませんよね。複数のアプリの中からえらんで切り替えたい場合は無難に「Alt」＋「Tab」のほうが早いと思います。
#### 要するに（全然要せてないが）論より証拠ですので試してみてほしい。
このショートカットはタスクバーにとまっているアプリを切り替えることができます。Qiita君は動画を乗せさせてくれないらしいので今Windowsを使ってる人は今すぐ押してみてください。複数アプリを開いてあれば別のアプリに表示が切り替わります。

## 
# 応用編
前回私は「カタカナひらがな・ローマ字キー」をバックスペースに充てたのでいまもともとあったバックスペースキー使ってないんですよね。これにアプリ切り替え充てたら開発効率めっちゃ上がりました。エディタとブラウザを開発中は行き来するのでこれは良いハックだと思います。もはやキーぼーっどの配列が私にしか使いこなせないような配列になってきたな...

# おわりに
このショートカット意外と知られていない説を感じたので書いておきました。僕が井の中の蛙であるだけかもしれませんが。
リポジトリ管理者はapproveなしでマージできるようにしようとしたら少しハマった話

# はじめに
個人開発用のリポジトリを作成し、`Branch protection rule`を設定していた時の話です。
設定項目が間違っており、意図した挙動になっていなかったのを解消しました。

# やりたかったこと

「**リポジトリ管理者(CODEOWNERS)は、approveなしでマージできるが、それ以外の人はapproveなしでマージできないようにしたい**」です。

# 設定方法
まず最初にどのような`Branch protection rule`を設定すれば、実現できるかを記載します。
その後に、自分がなぜハマったのかを書いていきます。

## 意図した挙動になる設定

Branch protection ruleで設定した項目は以下の通りです。
- Require a pull request before merging
    - Dismiss stale pull request approvals when new commits are pushed
    - Require review from Code Owners

必要な設定は以上で十分でした（[CODEOWNERS](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners)ファイルは後で追加しています）。

## 余計に設定したことで意図しない挙動になった項目

### Require approvals

リポジトリ管理者なら突破できると思い込んで設定していましたが、この設定によってリポジトリ管理者でもマージできなくなりました。

### Lock branch

```
Branch is read-only. Users cannot push to the branch.
```
という説明を流し見して、設定されたブランチに直プッシュできなくするだけだと思い込んでました。
Branch is read-only.とあるのでマージもできなくなりますよね、と。

# 終わりに
この辺りを普段触らないので、予想以上に原因特定に時間がかかりました。
最終的にやりたいことができたのでよかったです。
kubernetesリソースのラベルをうまく使いたい

## 目的
- CKAを趣味で取ろうとちびちび勉強している。その備忘録。

## kubernetesリソースにラベルをつける
`selector`以下の`matchlabels`でkey-value形式でつけられる

```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
   name: replicaset-1
spec:
   replicas: 2
   selector:
      matchLabels:
        tier: front-end
```

## labelでkubernetesリソースを絞る
kubernetesリソースはkey-value形式で`label`をつけることができる。以下のように`label`を用いて絞り込みできる

①`env`ラベルの値が`dev`のpodを取得
```bash
$ kubectl get pod --selector env=dev
```

②`tier`ラベルの値が`frontend`のリソースを取得
```bash
$ kubectl get all --selector tier=frontend
```

③`env`ラベルの値が`dev`かつ`tier`ラベルの値が`frontend`のpodを取得
```bash
$ kubectl get pod --selector tier=frontend,env=dev
```
2023 大谷選手 / 打撃データ コース別の打球スピード

今季の大谷選手の打撃結果、コース別の打球スピードを確認する。<br>データは、pybaseballから取得。取得コードは以下。

# データ取得のコード

    !pip install pybaseball
    from pybaseball import statcast
    import pandas as pd
    df = statcast(start_dt='2023-03-30', end_dt='2023-12-31')
    df_ohtani = df[df['batter'] == 660271]

以下にグラフを表示していく。コードは省略。

ストライクゾーンは仮で設定している。以下参照<br><https://hide.ac/articles/LHdcE7uLM>

# 全球の結果　※ビンの数を8に設定


- 各ビンの位置：`plate_x`と`plate_z`の値に基づき、打球がプレートのどの位置に落ちたかを示します。
- 各ビンの色：そのビン内の全ての打球の速度の平均値に基づいて色分けされています。色のスケール（カラーバー）は打球速度の平均値を反映しています。

このヒストグラムは特定の打球位置における打球速度の分布を視覚的に表しており、各ビンの色がそのエリアでの平均打球速度を示しています。

![](https://pbs.twimg.com/media/GA-mP5-asAAvOGB?format=png\&name=900x900)

# 球種ごとの結果　

![](https://pbs.twimg.com/media/GA-mWtFaEAApCMY?format=png\&name=4096x4096)

*   チェンジアップ (CH)
*   カーブボール (CU)
*   カッター (FC)
*   フォークボール (FO)
*   フォーシームファストボール (FF)
*   ナックルボール (KN)
*   ナックルカーブ (KC)
*   スクリューボール (SC)
*   シンカー、2シーム (SI)
*   スライダー (SL)
*   スラーブ (SV)
*   スプリッター (FS)
*   スイーパー (ST)

# カウント別の結果

![](https://pbs.twimg.com/media/GA-mce5boAA92l-?format=png\&name=900x900)

***

vs 右、vs 左 とかも違いありそうだけど。また今度。
高速化手法 重要度別まとめ

プログラムの高速化をする手法はいろいろありますが（個人的）重要度別でまとめてみました。
この記事では各手法について細かくは述べず、概要にだけ触れます。
（適宜更新予定）

## はじめに
高速化に取り掛かるにあたって下記2点が重要だと思います。
* 始めから高速化しようとしない。
* テストを整備する。

高速化の解説記事で言うのも何ですが、高速化は手法によっては可読性を下げたりデバッグの難易度を高めたりすることがあります。
基本的にはある程度仕様通りに動くようになるまでは、高速化を考えすぎるよりも可読性を重視して書くのがセオリーだと思います。
ただし手法によっては設計段階から検討すべきものもある（並列化など）ため、性能要件が厳しい場合等には注意が必要です。

そして高速化に着手する際にはテストがきちんと整備されていることが重要です。
もちろん対象にテストが整備されているという状況ばかりでは無いと思いますが、安全に高速化するためには部分的にでもテストを追加することで、安全に様々な手法を試すことが出来ます。

## 重要度高
### 並列化
昨今のコンピュータのリソースを鑑みると、並列化は最も汎用性が高い高速化手法であると思います。
組み込み等でリソースが限られている場合は例外ですが、通常のPCレベルのリソースでも細かい施策をちまちまやるより効果がある場合が多いです。

ただよく知られている通り並列化は排他処理をきちんと行わなければ発見しにくいバグの原因になりかねず、デバッグも複雑になります。
高速な動作が要求される場合には設計段階から並列化を見越した設計を行う必要があります。
そうした設計が行われていないアプリケーションを後から並列化対応するのはそれなりに難易度の高い作業になります。

ただ、ソフトウェア全体ではなく部分的な並列化という手法もあります。
C/C++でよく使われるOpenMPを使うとループを手軽に並列化出来たりと、全体の設計を見直さずとも一部の重い処理を手軽に並列化できます。
ただもちろん並列化されたループ間での排他処理は考える必要がありますし、むやみにこの手法を乱用しスレッドを作りすぎれば、むしろスレッド作成のオーバーヘッドにより速度が下がる場合もあります。
速度とリソース消費量をこまめに検証しつつ少しずつ適用していくのが良いと思います。

### I/Oアクセスの最適化
一般的にRAMに比べるとストレージへのアクセス、すなわちファイルの読み書きは遥かに遅いです。
外部のポートとの通信、ネットワークの通信等、ここではまとめてI/Oアクセスと呼ぶことにしますがこれらはさらに遅くなります。
アクセス1回につきオーバーヘッドが発生するような場合には、まとめてやるようにするだけでかなり改善します。
ファイルの読み書きであれば1バイトずつループで回すよりも必要なサイズをまとめて読み書きしたり、書き込む情報をRAMに貯めておいて、ある程度貯まった時点でまとめて書き込みを実行するなど、アクセスする回数を減らす工夫を行うと良いと思います。

また、明らかに1アクセスに時間がかかることが分かっている場合には、そこで処理を待つのではなく可能であれば平行処理や並列処理などで先に他の処理を進める手段も有効となります。（ただし設計段階でアクセスと処理の進め方について十分に検討しておく必要があります。）

## 重要度中
### 計算量オーダーを下げる
大きなデータを処理する際に計算量オーダーを下げるのはとても大切ですが、重要度を中としたのは難易度がそれなりに高いと思うからです。
ソートなど、有名なアルゴリズムであればあえて遅いアルゴリズムを採用している場合などありえないでしょうし、そもそも基本的なアルゴリズムはライブラリを使うのが普通で自前で用意することは無いでしょう。

完全に独自のアルゴリズムに対し、計算量を下げるアルゴリズムを探すのはそれだけで1つの研究テーマになることもあるぐらい難易度が高いと思います。
よって基本的には「世の中で似たようなアルゴリズムが既に研究されていないか」ということを探すことになると思います。

なお、入力データが少ない場合には計算量オーダーを下げても必ずしも高速化するわけではないことを以下で解説していますのでよろしければご覧ください。

https://qiita.com/kilohii/items/dd28ca615f408acd4a19

### 事前計算
ルックアップテーブルなどに代表される「事前に計算出来るものはやっておく」という考え方です。
計算が重い場合や、重くはないが呼び出し回数が多いところに着目するのが基本となります。

### 近似の利用
数学的な方法により近似を行うことで計算が高速化する場合があります。
よく使われる近似：
```math
(1+x)^n\simeq1+nx\quad(|x|\ll1)
```
```math
\sin\theta\simeq\theta\quad(|\theta|\ll1)
```
ただし、近似の精度については問題ないかよく検証する必要があります。

### 適切な型の選択
変数の型として何bitを選択するかにより速度が変わる場合があります。
近年のPC向けCPUであればdoubleの代わりにfloatを選択する意味は（速度的な面では）ほぼ無いとされますが、環境により差がある部分です。
機械学習等でGPUを利用する場合、GPUのアーキテクチャにより得意とする精度が異なる場合があります。

## 重要度低
### コンパイルの最適化
コンパイラ型の言語に限定されますが、C/C++で言えば
* 関数のinline化やマクロ化
* const修飾子付与
* 一時変数の削減
* 除算を乗算に置き換える

等々、定番とされるテクニックは多数あります。
ただ現代のコンパイラは最適化が優秀なため、これらの施策は手間の割りに効果がほとんどない（最適化により既に行われている）場合が多いように感じます。
古いコンパイラを使っている、何らかの事情で最適化を切っている場合などに最終的なチューニングの目的で使うのが良いかと思います。
関数のinline化やマクロ化はデバッグがやりにくくなりますし、一時変数の削減も本来名前がつけられるべき値から名前が無くなるなど、可読性への影響があります。
デメリットも多いため、既に十分に検証されたコードに対し、最後の一手ぐらいで行うのが良いでしょう。
可読性を犠牲にするような変更をする場合、その旨をコメントやコミットログに詳細を残しておくことである程度後任者のメンテナンス性の助けにもなります。