OmniAICreator/Qiita-1.07M huggingface dataset:
ARM版MacでVivadoとQuartusを動かす方法

## はじめに

本記事はVivadoとQuartuzをARM版Macで動かすための方法をまとめます。残念ながらVivadoもQuartusもMacにもARMにも対応していないため、異なるOSと異なるアーキテクチャを動かす必要があります。幸いにもMacではVMを使ってLinuxを起動することができ、Rosetta2を使うことでx86のバイナリを実行できます。この記事では、リンク集として残したいと思います。

## Vivado

### [M1 MacでVivadoが動いた！](https://qiita.com/jin0g/items/692fde40cd895b81f39e)

拙著の記事では、LimaというMac上でVMを簡単に管理と接続できるWSLのようなツールを使って、出来るだけ簡単にVivadoを動かすことを主眼としています。Limaを用いたarm64のVMの上にx86のコンテナを実行しています。セットアップは非常に簡単ですが、Lima上のVZが少し不安定な挙動を示します。速度は非常に快適で、合成速度もCore i9のサーバーと比較してM2のMacBook Airは60%ほどの速度が出ています。

### [vivado-on-silicon-mac](https://github.com/ichi4096/vivado-on-silicon-mac)

この方法は、ARM版MacでVivadoを動かす方法として最もメジャーな方法だと思います。DockerというLinux向けのコンテナ技術を活用し、Rosetta for Linuxも使ってVivadoを実行しています。arm64のVMの上にx86のコンテナを実行することで実現しています。インストールスクリプトも用意されているので、簡単に動かすことができるようです。USB接続も対応しているようです。

### [Running Vivado on ARM64 Mac using Rosetta 2](https://gist.github.com/sohnryang/ca5d2512f7c6e0bab87843dbf1a3708f)

この方法では、UTLというデスクトップ型のVMを管理するツールを使っています。Rosettaを使っていますが、コンテナ技術は使っておらず、arm64のLinuxのVMで直接動作しています。コンテナでx86のLinuxを起動していないため、他の方法よりわずかに軽量である可能性があります。ただしx86の依存関係のライブラリ周りが少し面倒なようです。

## Quartus

記事にしておいて今更すみませんが、完全な形でQuartusを動かす記事を見つけられませんでした。以下には試行錯誤をしたユーザーの記事を掲載します。方法が見つかったらこの記事をアップデートします。

### [M1 mac で Quartus が動いた](https://toms-log.blogspot.com/2021/03/m1-mac-quartus_21.html)

この記事では、QEMU版のDockerを通じてx86版のLinux上にQuartusを動かしているようです。QEMUはx86の完全なエミュレーションなので動作が非常に遅いです。

### [Can Quartus run on an M1 Macbook?](https://www.reddit.com/r/FPGA/comments/wr4vas/can_quartus_run_on_an_m1_macbook/)

海外の掲示板でもこの話題について盛んにディスカッションが行われています。Rosettaを使って試したユーザーがいるようですが、起動には成功していないようです。

### Dockerを使ってIntel公式イメージを実行する
公式のDockerイメージが配布されたので早速試してみました。以下のようなエラーが出てしまいます。特定のCPUでないと起動できないようになっているようです。
```text
The Quartus Prime software is optimized for the Intel Nehalem processor
and newer processors.
...
The Quartus Prime software will not function properly on this processor model.
```

## おわりに

いかがでしたか？各種CADソフトは、Dockerに公式対応してくれ！
payloadについて少しだけ調べた

業務の中でよくペイロードと聞いて、実は何者なのかよくわかっていなかったので、調べてみたメモ。

#### 様々なサイトを見て、出てきたペイロードの説明
* APIの固有情報。ペイロードを使用してシステム間で項目データをやり取りする。「JSON」「XML」といったデータ形式。
* ペイロードはメッセージ本体として知られています。
* パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いた、データ本体のこと
* ヘッダを除いた通信本体

なんとなく、HTTPでデータをやり取りするときの、データの本体を表すことはわかった。
Okta - Security - General

# はじめに

今回はSecurityの一般設定について以下を記載していきます。

# General
## Security notification emails
新規サインインやパスワード変更など特定の挙動が発生した際にユーザーにメールで通知することができます。

ユーザー自身の操作でもメールが通知されるため、正直メール通知はONにするか迷うところ。
- メール内に接続元IPなど記載されていても、ユーザー自身でメールを見て自分のIPなのか判別できないこともあります。
- その場合無駄に不安を煽ることになるのと、IT部門への無駄な問い合わせが発生する可能性があるためです。

メールで通知できる挙動は以下の通りです。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/b8c8ef73-bf93-3c9f-b07b-3b2daf0ab310.png)
    - New sign-on
    - Password changed
    - Authenticator enrolled
    - Authenticator reset
    - Report suspicious activity via email
        - Enabledにすることでユーザーへのメール本文に「不審なアクティビティの報告」というリンクが追加されます。
        - ユーザーがリンクをクリックすると、報告があったことがシステムログに記録されます。

## Organization Security
その他のセキュリティ設定という感じです。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/bc8819f0-c384-11f4-89e2-e75c716b0046.png)
    - Remember user on sign in 
        - ログインしたユーザーのUsernameを記憶し、次回のログイン時にログイン画面のユーザー名フィールドに自動的に入力した状態にしてくれるようになります。
    - Show option for "Keep me signed in"
        - ログイン画面に「サインイン状態を維持する」のチェックボックスを表示します。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/389cd5a6-d293-21b5-15c4-a8d34431b241.png)
    - Activation emails are valid for
        - Oktaへの招待メールの有効期間を設定します。
    - Enforce device binding for creating sessions
        - 何の設定だっけこれ。
    - Username match criteria on sign in
        - ログイン時に受け付けるユーザー名をメールアドレス全部もしくは@前までを許可するかを設定します。
        - Allow short matchを選択した場合、メールアドレスの@前の部分だけでもログインを許可します。
    - Users can view Recent Activity
        - エンドユーザーダッシュボードから最近のアクティビティを確認できるようにします。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/f90c9da9-4564-e54e-0944-4b2315e29ef0.png)
    - Use standard AMR value format
        - なんだっけこれ。

## User enumeration prevention
以前検証したけど全く覚えてなかったので、今回AuthenticationのチェックをON/OFF切り替えて動作を確認しました。
例えば会社のグローバルIPアドレス以外からのアクセスは拒否するなど、Global Session Policyで条件に応じて明示的に拒否するルールを設定している場合に関係してくるようです。

Global Session Policyで拒否されるべきIPからの接続であり、かつ正しいPWが入力された場合、設定ON/OFFで表示されるメッセージが異なりました。

ユーザーおよびパスワードが正しいことが分かってしまうので、設定をOFFにする理由はないと思います。
ONでよいです。


#### OFFの場合

| PW \ IP | 許可 | 拒否 |
|:-:|:-:|:-:|
| 正 | 正しくログイン | エラー2 |
| 誤 | エラー1 | エラー1 |

#### ONの場合

| PW \ IP | 許可 | 拒否 |
|:-:|:-:|:-:|
| 正 | 正しくログイン | エラー1 |
| 誤 | エラー1 | エラー1 |


#### エラーメッセージ
- エラー1
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/8091d1b3-7a8f-bf1d-5ea0-087fde595d2f.png)
- エラー2
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/e1942702-1e35-c308-5a50-7dfa4b0d8710.png)


## Okta ThreatInsight settings
不審なIPアドレスからのアクセスをログに記録したりブロックすることができるようです。
Oktaの推奨はブロックまでのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/a7c05da6-95a2-f1aa-afa5-d2c0ab3210a0.png)

直近の7日間の不審なIPアドレスからのアクセスログはDashboardのSecurity Monitoringから、以下のViewを選択することで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/11749684-1286-f570-7977-7d48a69647d1.png)


# さいごに
一度設定したら普段はあまり触らない箇所ということもあり、改めて設定項目を見るとあまり見覚えのない項目がありました。。。
なんだっけについては調べたら記事更新するかも？
今回はここまで。ありがとうございました。
ShemaSpy でデータベースのドキュメントを出力する


[ShemaSpy](https://schemaspy.org/) はDBのテーブル一覧やテーブル定義書などのドキュメントを html でかんたん出力できるツールです。

以下のようなドキュメントを出力できます。

https://schemaspy.org/samples/chinook/

![スクリーンショット 2023-12-05 0.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/a4d0144e-a6a8-fda8-f804-3e39a93b69ae.png)

### 使い方

DBは踏み台経由のことが多いので、ポートフォワーディングしながら接続する方法を記載します。踏み台が不要の場合は適宜読み替えてください。

#### 構成

![スクリーンショット 2023-12-05 0.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/b24816c7-a0ac-0f2b-4e52-628cee32ca6e.png)

#### ディレクトリ構成

```sh
.
├── output/ # 出力結果を格納
└── schemaspy.properties # 設定ファイル
```

#### 設定ファイル

今回は DB に MySQL を指定してます。他の DB にも色々対応しているので詳しくは以下のリンクを参照。

```yaml
# データベースの種類
schemaspy.t=mysql
# ホスト名
schemaspy.host=host.docker.internal # コンテナ内からlocalhostに接続する場合のホスト名
# ポート
schemaspy.port=33306 # ポートフォワーディングのポート
# データベース名
schemaspy.db=[DB-NAME]
# ユーザー名
schemaspy.u=[YOUR-USERNAME]
# パスワード
schemaspy.p=[YOUR-PASSWORD]
# スキーマ名
schemaspy.s=[DB-SCHEMA-NAME]
```

https://schemaspy.readthedocs.io/en/latest/started.html#configuration

#### ポートフォワード

以下のコマンドでセッションを確立します。ポートフォワードが不要であればこの手順はスキップで OK です。

```sh:
ssh -NL 33306:[DATABASE-IP]:3306 [YOUR-USERNAME]@[踏み台サーバのホスト]
```

**Nオプション**： セッションを確立状態にする
**Lオプション**： ローカルポートフォワーディングする。

#### 実行コマンド

テーブル数が多いと完了まで数時間かかります。気長に待ちましょう。

```sh

docker run --rm --net="host" \
  -v "./output:/output" \
  -v "./schemaspy.properties:/schemaspy.properties" \
  schemaspy/schemaspy:latest --debug
```
超消費電力なルータのNAS機能を検証！

# はじめに
えか太郎です。職業は自称JK
### なぜこれをしようと思ったか
自室のAP（アクセスポイント）を見たときに気づいちゃったんですよ。
![ZLmmk9CXqF2NxC8z_setting_xxx_0_90_end_800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/d58ef29d-8f66-2785-1d64-a1f3a2839338.png)
背面にUSB3.0あるやん！と
どうやら製品の仕様書によるとこのモデルはこのコネクタに刺したUSBをSambaで共有できるようです。簡単そうだったので、とりあえず余っているUSBメモリで試してみます。
### 目的
前回のJK生活2日目の記事でWindowsのファイル共有でNASを立てました。しかしWindowsアップデート中は使えず、また、電源を落とすことができなくなくなってしまい電気代がかかります。（電気代を払うのは私ではなく父ですが...)
であれば部屋にあるAPをNASとして運用は実用上耐えうるのかどうか検証したいです。

# NAS機能の設定
### 検証環境
ASUS社製のAC65U
APモードで運用しています。
### 具体的な方法
公式が一番わかりやすかったので省略します。

https://www.asus.com/jp/support/FAQ/1032403/

しかし悲しいことに使っていないUSBメモリはすべてUSB2.0でした。さすがに頻繁に使用するインストーラーを消してまでUSB3.0で試す気になれなかったので低速ですがUSB2.0で試します。まあそもそもUSB2.0よりもWi-Fiが早いことは私の環境ではほぼないので実質的には影響は少ないと信じることにします。

# 検証結果
一週間ほど使用してみてから結論を出したいと思います。ただ今のところWebGUIの設定はあまりやりやすいものではなくかなり手間取った。スマホからもアクセスできるように設定しないといけないという感想。
# 結論
しばらく使ってみてから追記します。頻繁にアクセスするものはルーター、長期保存バックアップはWindowsのように分けるといい感じかも。
AtCoder Junior League のすすめ

この記事は [筑波NSミライラボ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tsukuba-ns-mirailabo) 10日目の記事です。

## 自己紹介

えすぜろ (@Eszero) です。
競技プログラミングが好きな中学3年生です。
AtCoderの色は緑で、言語はPythonを使用しています。
また、AtCoder Junior Leagueでは、現在中3ランキング19位(92人中)です。20位以上を維持することを目標にしています。

## AtCoderについて

「そもそもAtCoderって何？」という人もいるのではないかと思います。
[AtCoder公式サイト](https://atcoder.jp/) から引用して説明すると、
> AtCoderは、世界最高峰の競技プログラミングサイトです。
> リアルタイムのオンラインコンテストで競い合うことや、
> 5,000以上の過去問にいつでもチャレンジすることができます。

コンテストは、最も頻度の多いものだと **AtCoder Beginner Contest (ABC)** が毎週土曜日に開催されています。

コンテストでは、解けた問題数やかかった時間に応じて順位が決まり、その順位から"パフォーマンス"という値が算出されます。

この"パフォーマンス"に応じて、参加者の"レーティング"という値が上がったり、下がったりします。

"パフォーマンス"はユーザーのあるコンテスト内での成績を示した数値、
"レーティング"はユーザーのAtCoder内での強さを示した数値というイメージです。

"レーティング"の数値に応じた色分けもあり、上から順に
**<font color="red">赤</font>・<font color="orange">橙</font>・<font color=#efe80a>黄</font>・<font color="blue">青</font>・<font color="cyan">水</font>・<font color="green">緑</font>・<font color="brown">茶</font>・<font color="gray">灰</font>・黒**  となっています。
僕が所属している緑色は上から数えると6番目の色だということがわかります。

## AtCoder Junior League (AJL)
ここからが本題です。

[**AtCoder Junior League (AJL)**](https://atcoder.jp/contests/ajl2023) とは、中高生のみが参加できる、学校別・学年別に順位がつけられるリーグです。
順位は、AtCoder上でのコンテストの成績に応じて計算される **スコア** によって決められます。

下の画像は高校部門の学校ランキングです。 (S高等学校が11位！)

![スクリーンショット 2023-12-06 0.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628175/8a2767b5-5a9f-741a-6e29-11fc0395c4a8.png)

2023/12/5現在、参加者は900名を超えており、多くの中高生と競うことができます。

### AJLをすすめる理由
- ライバルが見つけやすい
- 同じ学年の人と競える
- モチベーションが高めやすい

大学生や社会人 (中高生にとって年上) が多い競技プログラミングという世界で、同年代と競うことができるというのが一番の魅力ではないかと思います。

競技プログラミングには、数学的素養やプログラミングの経験が大きく関わるので、どうしても中高生にとって不利になりやすいです。
しかし、AJLでは近い年齢層の人と競い合うことができるので、知識量の差が少なく、モチベーションが高めやすいです。また、ライバルを見つけて互いに実力を高め合うことができると思います。

少し話が逸れますが、中高生が参加できる競技プログラミングの大会として [**情報オリンピック**](https://www.ioi-jp.org/) というものもあるので、興味があればぜひ調べてみてください。

### 注意点
AJLの順位表では **AtCoder ID、学校名、学年** がセットで公開されます。
このあたりの個人情報を載せたくないという方にはあまりおすすめできません...

## おわりに
ここまでAJLをすすめておいてなのですが、**今年のAJLはあと3週間ほどで期間が終わってしまいます。**

そのため、この記事を見て「参加したい！」と思った方は、今年のAJLはお試し的な感覚で参加していただけたらなと思います。
(おそらく来年も開催されると思うので...！)

この記事をきっかけに、競技プログラミングを楽しむ中高生、今後のAJLの参加者が
一人でも増えたら幸いです。
心理的安全性を測ってみたら、自分の弱さを見つめなおす事になった話

## はじめに
NSSOL Advent Calendar 2023　参加記事です。

https://qiita.com/advent-calendar/2023/nssol

 今参加している案件で心理的安全性の測ってみたのでそちらで得た学びをまとめてみます。

 ## 目次
 [チーム構成](#チーム構成)
 [心理的安全性](#心理的安全性)
 [アンケートの結果](#アンケートの結果)
 [結果を見ることへの恐怖](#結果を見ることへの恐怖)
 [これから](#これから)


 ## チーム構成
 私が参画している案件では、約２０人前後でチームを組んで開発を行っています。

 参画した当初ではこのような構成でした。
リーダー一人に開発メンバー全員が従っている形です。
リーダーを中心に大きくなったチームのため、リーダーへの依存度が高く、リーダーへの負荷もとても高かったです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172585/24881363-a842-abf5-2e46-cc829876084c.png)

現場の改善のため、チーム構成の変更を行いました。

一つの大きなチームを個別のチームに小分けしてスクラムを導入し、段階的にLeSS（Large Scale Scrum）に移行しました。
[チームトポロジー](https://www.ryuzee.com/contents/blog/14566)を参考にしたチーム構成になっています。
メインとなるストリームアラインドチームが３つあり、それを支えるイネーブリングチームがあります。
私はSMとしてチームに参画しつつ、PO、もう一人のSMと協働しています。おのおのが独自に動いていますが便宜上、これも小さいチーム（テックリードチーム）としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172585/f6641bdb-4836-18d1-7522-ada5eacd3307.png)

いきなりチームがこのような構成になったわけではなく、改善を進めながら徐々に変わっていきました。
チームの開発効率も少しずつ良くなってきたように感じています。
チームを変えていくとき、重視したものの一つが**心理的安全性**です。

## 心理的安全性
チームでの開発を進める際にもっとも重要なものの一つが、心理的安全性といわれています。
心理的安全性の重要性は下記のNSSOLの記事で説明されています。
　[外部：心理的安全性の測定方法とは? 現状を把握し改善につなげるために]　(https://www.marketing.nssol.nipponsteel.com/blog/hrtech/shinritekianzensei-04.html)

心理的安全性は７つの質問で計測することができるといわれています。
1.チーム内でミスを起こすと、よく批判をされる
2.チームのメンバー内で、課題や困難な問題やネガティブなことなどについて指摘し合える
3.チームのメンバーは、異質な意見を受け入れない、拒絶する傾向がある
4.チームに対して、リスクが考えられるアクションを取っても安全である
5.チーム内のメンバーに助けを求めづらい
6.チーム内に自分を意図的にだましたり、おとしめたりするようなメンバーはいない
7.チームで仕事するときには、自分のスキルが発揮できており、持ち味が活かされていると感じる

質問についての詳細は下記のNSSOLの記事で説明されています。
[外部：心理的安全性の測定方法とは? 現状を把握し改善につなげるために](https://www.marketing.nssol.nipponsteel.com/blog/hrtech/shinritekianzensei-03.html)


この７つの質問を完全匿名のアンケートにして、チーム全体・個別のチームを対象に行いました。計14問の質問に答えてもらいました。

## アンケートの結果
アンケートには以下のような傾向が現れました。
- チーム全体よりも、個別チームに対しての心理的安全性が高かった
- 1.3.6.は、チーム全体と個別チームの差も小さい。2.4.5.7.は大きく差があった
- 特に7.チーム全体で一つの仕事を行っているときに、自分のスキルや持ち味が発揮できていない

ある意味、想像していた通りの結果でした。
個別チームでコミュニケーションパスを閉じ、他チームとのコミュニケーションをある程度制限することで認知負荷は減りましたが、その分、チーム全体でのアクションにハードルができてしまいました。
個別チームを中心としつつも、チーム全体としての協働の形を模索していく必要があります。

チームとしての現状を認識することで新しい課題や目指す姿が見えてきました。
・・・


ここで当然の疑問が湧きます。
「昔はどうだったのだろうか？」「心理的安全性は良くなったのだろうか？わるくなったのだろうか？」と。

結果を言いますと、それはわかりません。
*昔の心理的安全性は計測できていないからです。*

## 結果を見ることへの恐怖

チーム改善を進める前から心理的安全性の重要性を理解し、アンケートの存在も把握していました。
計測することが重要であることも認識したうえで中々実行することができていませんでした。

心理的安全性を測ることができなかったのは、
自分が推し進めた改善によって心理的安全性の低い、働きにくい職場にしてしまっていないか、みんなは改善に不満を持っていないかという、事実に向き合うことが怖かったのだろうと感じました。

スクラム・LeSSを導入していながら、
SMの自分が価値基準の一つである「勇気」が足りなかったと感じています。

## これから

スクラムガイドの価値基準には、こうあります。
>スクラムチームのメンバーは、正しいことをする勇気や困難な問題に取り組む勇気を持つ。

チームの心理的安全性に向き合うのは正しいことであり、困難な問題であったと思います。
それに初めは向き合えなかったこと、そして向き合えるようになったこと、
チームと一緒に自分も成長していきたいと思います。
GA4でページごとのアクセス解析をしたいけど、クエリパラメータも一緒に表示したい。というときの解決法

## GA4でもクエリパラメータつきのデータが見たい
GA4でのアクセス解析時、独自につけたパラメータごとに数値の分析を行いたいというケースがあると思います。

今はなきUAでは、「行動>サイトコンテンツ>すべてのページ」から見れました。
GA4でも似たようなものが「エンゲージメント>ページとスクリーン」から見れますが、デフォルトのままだとページパスのみしかわからずクエリパラメータが表示できません。

クエリ文字列も一緒に表示したい場合は、
ページ右上の編集ボタンよりレポートの修正を行い、![スクリーンショット 2023-12-06 0.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110465/21faac41-1449-52a4-75ff-0a7d14cdfe51.png)


ディメンション>ディメンションを追加から
![スクリーンショット 2023-12-06 0.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110465/87802376-b367-d13b-b65b-5b83cb20e11a.png)


「ページパス+クエリ文字列」か、「ページロケーション」を選択するとクエリ文字列も含んだデータを表示してくれるようになります。

## ページロケーション/ページパス+クエリ文字列をデフォルトで表示されるように設定する
ただ、そのままではリロードされる度にもとに戻ってしまうのでデフォルトで表示したい場合はディメンション右の縦三点リーダーをクリックして「デフォルトに設定」をクリックしておくとデフォルトで表示されるようになります。![スクリーンショット 2023-12-06 0.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110465/76d54aea-e2d1-cc7e-64c8-cc86920a4828.png)

めでたし
プログラミング初心者が2年学習してみて

この記事は海洋大技術系サークル Advent Calender の8日目のものです

## 初めに
初めまして！私は東京海洋大学に通う2年生です
まず私について紹介してからプログラミングを学習した成果について話していけたらなと思います

## なぜプログラミングか

まず、どうしてプログラミングの学習を行おうと思ったのかについてですが、これは、私の両親がIT関係の会社で勤務していることが影響してきます。

特になりたいものがなかった私は、親の勧めで高校・大学に進学し(学力は低かったのでかなり苦労しました)、何となく自分もIT系の企業に勤めるんだろうなと考えていました。

ただ、ITに関する知識は全くなく、高校でもプログラミングの授業がありましたが、先生の書いたコードを書き写すだけというレベルでした笑

大学に進学してからは、将来について本気で考えるようになり、周りにプログラミング学習をするには最適な環境があり、何よりも自分で何かを作成することが楽しいと思ったため、プログラミングを本気で頑張ろうと思うようになりました！

## 何をしてきたか
続いて、何をどのように学習してきたかについて話していきます

#### 大学入学まで
高校に進学するまではプログラミングとは完全に無縁でした。
高校に進学してからも、情報系の授業はあったのですが、ただ先生の書いたコードを書き写して、何が何だか全くわからず、課題などは分かる人に教えてもらっていたような状態でした。

また、高校時代に先生からサーバーって何かわかる？って聞かれたことがあって、全くわからなかった僕はゲームみたいなやつ？って答えるレベルでした笑

#### 大学入学～1年の終わりまで

大学に入学し、授業でもPythonを用いてAtcoder やpaizaのコードテストを行う機会があり、元々数学が好きだった私はこれがとても楽しく、ある程度まとまった時間で問題についてじっくり考え、時にはネットで調べながら独学で進めていきました。

結果として、AtcoderはB問題までは自力で正解できるレベルになり、PaizaではBランクを取得することができました！

![スクリーンショット 2023-12-05 124539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620480/95997922-566c-e74f-2369-e6c386164563.png)

また、親の勧めでhtml, css を用いたwebページ作成方法を学びました。

１年のころから大学の講義で基本情報技術者試験に出るようなことも学んでいたので、良い機会だなと思い自分でも学習をするようになりました

#### 2年初め～夏ごろまで
このころに気になっていたプログラミングサークルの人からお声がけをいただき、一緒に切磋琢磨する人たちが欲しかったので現在所属しているプログラミングサークルに入りました

4月からは、サポーターズ様主催のハッカソンに参加させていただき、４月～８月の間で３回参加させていただきました

しっかり開発に参加できたのは8月の1回のみで、その時は先輩と後輩に頼りながらネットで必死に調べて何とかAPIと、一部の機能、データベースを作成しました

ブラウザで動くアプリで、使用言語はPython(FastAPI)です
(最初のほうは技術力がないうえにDockerやgit, githubについて何も知らなかったためコードが書けず、プレゼン資料の作成などできることを見つけて動きました)
参考　	[githubのリポジトリ](https://github.com/nepp-tumsat/hackathon_vol.6_api)

#### ２年夏～

この頃から基本情報・応用情報技術者試験の学習を始めました！(結果や詳細についてはこの後qiitaの記事に書く予定です)

また、夏ごろは大学の友達数人でオンラインで勉強会を行い、興味深かったこと・学んだことを発表するような場を設けて学習しました！

## 成長・結果
このように1年の頃からPythonを主にさわってきましたが、２年前と現在のITに関する違いは以下の通りです

・html, css, javascriptを用いて簡単なwebページを作成できる！

・チーム開発に必要なgit, githubの操作がある程度できる！
　(Dockerは調べながらだと理解できるレベルです)

・Pythonを用いたAPI・その機能の作成ができる！

・一定程度のアルゴリズムの理解・また、その使用

・Goの文法の理解ができる！
　(現在学習中のため、アプリ開発できるレベルには到達してないです)

・ITの知識が増えた！

:::note
もうサーバーって何？って聞かれても答えられます笑
:::

## おわりに
以上が2年間の歩み、成果になります
どうでしょうか？　個人的にはよくやった方ではないかと思います！

ただ、自分の作りたいアプリケーションを作れるレベルにはまだまだ到達できていないので、これからも仲間たちとともに切磋琢磨していきたいと思います！
(githubでは毎日1commit以上するように心がけています！)

また、実際の職場でどのようにコーディングが行われているのかや、大規模な開発を一度体験してみたいと思っているので、さらに技術力をつけてからインターンシップに参加したいと考えています！
PRML読破を支える神講座（Udemy）

# はじめに
機械学習を勉強する人が一度は耳にする「パターン認識と機械学習（通称PRML）」。
読んでみたいと憧れつつも、中身を見て絶望した人は少なくないと思います。
私も自主ゼミを開いて無理やり読み進めていたものの、担当箇所が下巻に移った時に「マジでなんもワカラン」と何度もくじけそうになりました。

今回は一応~~目で追った~~読了した私を支えてくれたUdemyの講座をご紹介します！

講座名：[ベイズ推定とグラフィカルモデル：コンピュータビジョン基礎1](https://www.udemy.com/course/computervision/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629975/ed50f69c-6b75-edd5-6eed-58d1da65bfc9.png)


# おすすめしたい理由

### 優しい解説が少ないPRML後半をカバー
「[学習内容](https://www.udemy.com/course/computervision/)」からいくつかキーワードをピックアップしました。
PRMLにいるあいつらがたくさんいますね！

* 最尤推定
* ベイズ推定
* EMアルゴリズム
* 混合正規分布
* ベイズ線形回帰
* Gaussian process regression
* グラフィカルモデル
* 条件付き独立
* forward-backwardアルゴリズム
* 確率伝播(belief propagation, BP)アルゴリズム
* 和積(sum-product)アルゴリズム

この講座の最も魅力な点は「**優しい解説が少ないPRML後半の内容に対応していること**」です。ネットには先駆者たちの資料が載っていますが、章が後半になるにつれほとんど本と同じことしか書かれていないことが多いため、この講座はPRML下巻を読む上で役立つことが多いと思います！
（ちなみに私は8章のグラフィカルモデルと13章の隠れマルコフモデルを理解するために該当箇所を視聴しました。）

本当に広範囲な内容を網羅しているのでぜひ一度コースの内容を覗いてみてください！
PRMLに限らず多くの統計・機械学習学習者の助けになるはずです。

### 研究者による懇切丁寧な解説
PRMLを読み終わった後に気づきましたが、講師は名古屋工業大学の[玉木教授](https://sites.google.com/nitech.jp/tamaki-lab/%E3%83%9B%E3%83%BC%E3%83%A0?authuser=0)です！これまた機械学習学習者（少なくとも私）が一度は憧れる「コンピュータビジョン　―アルゴリズムと応用―」「統計的学習の基礎」の翻訳に携わった方です。半透明になってスライドと一緒に映りながらこれでもか！と丁寧に教えてくれる玉木先生には感謝の言葉が尽きません。

### バグってる価格・評価
この講座はUdemyの他の講座と比較して相当ハードに理論を扱っていますが、**星4.9**(**1500件越え**)という超高満足な評価を受けています。さらに**無料**です。

# おわりに
私がPRMLを中古で入手した際、やたらと下巻が余っていたことを覚えています。実際に読んでみて下巻を売りたくなる気持ちは痛いほどわかりました。やはりPRMLはハードですが、「それでも挑戦したい！」と思う方はぜひこの講座を相棒にしてみてください！
solid_cacheについて調べてみた

## はじめに

この記事は[Ruby on Rails Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ruby-on-rails)の記事です。

## solid_cacheとは

`solid_cache`とは最近（具体的には2023年10月）に[最初のバージョンがリリースされた](https://rubygems.org/gems/solid_cache/versions/0.1.0)gemです。目的はRailsのcache storeの一つになることで、Redisなどを使わずRDBにキャッシュを保存することが特徴です。余談ながら、[initial commitは2022年11月](https://github.com/rails/solid_cache/commit/de56c1456f309f1df456c6be0482fe913d98239a)でしたので、約1年秘密裏に開発されていたことになります。

https://github.com/rails/solid_cache

## なぜRDBにキャッシュを保存するのか？

キャッシュをRDBに保存する動機付けについてはREADMEに書かれています。

> Using SQL databases backed by SSDs we can have caches that are much larger and cheaper than traditional memory only Redis or Memcached backed caches.
Testing on HEY shows that reads and writes are 25%-50% slower than with a Redis cache (1.2ms vs 0.8-1ms per single-key read), but this is not a significant percentage of the overall request time.
If cache misses are expensive (up to 50x the cost of a hit on HEY), then there are big advantages to caches that can hold months rather than days of data.

確かにキャッシュ自体の速度は低下するものの、キャッシュを安く大容量化できるのがメリットということのようです。最後の文にあるように、キャッシュを数ヶ月保持しておくことでキャッシュミス（約50倍の低速化）を回避できるということですね。

## どのようにRDBにキャッシュを保存するのか

RailsとRDBといえば当然`ActiveRecord`が思い浮かびます。solid_cacheもARのインターフェースを使ってキャッシュを保存しています。

https://github.com/rails/solid_cache/blob/main/app/models/solid_cache/entry.rb

このクラスにメインのロジックが書かれているようです。このクラスは`Record`抽象クラスを経由して`ActiveRecord::Base`を継承しています。

```ruby
def upsert_all_no_query_cache(attributes)
  insert_all = ActiveRecord::InsertAll.new(self, attributes, unique_by: upsert_unique_by, on_duplicate: :update, update_only: [ :value ])
  sql = connection.build_insert_sql(ActiveRecord::InsertAll::Builder.new(insert_all))

  message = +"#{self} "
  message << "Bulk " if attributes.many?
  message << "Upsert"
  # exec_query_method does not clear the query cache, exec_insert_all does
  connection.send exec_query_method, sql, message
end

def select_all_no_query_cache(query, values)
  uncached do
    if connection.prepared_statements?
      result = connection.select_all(sanitize_sql(query), "#{name} Load", Array(values), preparable: true)
    else
      result = connection.select_all(sanitize_sql([ query, values ]), "#{name} Load", nil, preparable: false)
    end

    result.cast_values(SolidCache::Entry.attribute_types)
  end
end
```

この2つのメソッドはキャッシュストアが実装するべきインターフェースである`write`や`read`の実装詳細です。ARの内部クラスを利用していたりして理解が少し難しいですが、詳細には踏み込まずとも`INSERT`や`SELECT`を実行しているのはわかります。

## まとめ

ということでsolid_cacheについて簡単に紹介しました。まだ新しいプロダクトであり、今後様々な改善が導入されることでしょう。実用例についてはすでに37Signals社のHEYがあるようですが、こちらも今後増加が見込まれます。

コードの行数は短く読みやすいので、コードリーディングの題材としても使えるかもしれません。今回この記事を書くに当たってコードを読んでいたところ、小さな改善ができそうだったので[PRを送ってみた](https://github.com/rails/solid_cache/pull/107)のですが、新しいプロダクトではこういうことが出来るのも良いですね。
マッピングパーティー用の地図をLibreOfficeで作る

# マッピングパーティー用の地図とは
* [マッピングパーティー](https://kotobank.jp/word/%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC-1711955)で現地調査する際、現地で見つけたものをメモするための地図です。
* 「マッピングパーティーする＝地図が描いていない場所」なので見た目は拘らなくてOK。
* マッピングパーティー後に「[まち歩きマップメーカー](https://armd-02.github.io/mapmaker/)」などで綺麗な地図を作ってみよう。 

# 地図の縮尺に気をつけよう
* 「地図の縮尺」には気をつけよう。あまり広域で地図を作ったら場所を特定出来なくなる。

![Sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/8ef3e364-eff1-e3e8-c679-8a5f841134ef.png)

* 寺社仏閣など、数m間隔で記念碑や案内板などが設置されている場合、縮尺1/400がおすすめ。
* 逆に、数十m間隔でまばらに地物がある場合、縮尺はもっと大きくしても良い（1/1000など）

# マッピング対象が複数ある場合
* マッピングパーティーの場所が数か所あるなら、場所毎に地図を分けて作るのがおすすめ。
  * 例えば、商店街とお寺をマッピングする場合、商店街とお寺の地図で2枚分けて作る。
* 複数箇所をマッピングする場合、1枚目に広域地図を追加するのも良い（全体が分かる）

![1枚目の広域地図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/51a1b89a-2b2d-3f74-a46a-c8cef2c1c366.png)

# 地図画像をダウンロードする
* 地図画像は当然のことだけど、[OpenStreetMap](https://osm.org)から範囲を指定してダウンロード。
* 以下の通り、画面右側の下から3番目のアイコンを押すと範囲と縮尺を指定出来る。
* 画像を使う時は「© OpenStreetMap contributors」と隅に書いておくこと（重要）。

![範囲と縮尺を指定してダウンロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/0a33f8f0-b445-9098-f090-be03bf7955b3.png)

# LibreOfficeで地図を作って印刷する
* 私はLibreOffice ImpressでA4縦のサイズ指定をした上でスライドを複数枚作っている。
  * マッピング場所（複数）と表紙（全体の広域地図）で4～5枚で印刷することが多い。
* 広域地図を1枚目に載せる場合は、カラー印刷がおすすめ。
  * カラーは分かりやすいのと、成果発表の時に編集前後の違いを比較しやすいので。
* 現地調査時にメモするための2枚目以降の地図はグレースケール画像に変換すること。
  * メモする時は赤ボールペンで書くと分かりやすい。カラーだとメモが見難くなる。
* 別にPowerPointでも出来ますが、LibreOfficeならWindows以外でも作業出来るので便利。
* あと、Impressならサイドウィンドウからぱぱっと色モードが変更出来るので便利。

![スクリーンショット 2023-12-05 234206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/fc136494-30fe-4baf-032f-ebcc46fc4258.png)

# 印刷前の最終確認
* 地図の隅に「© OpenStreetMap contributors」と書いているか確認すること。
  * 複数地図を印刷する場合、最後にコピーライト表記をまとめて記載しても良い。
* 地図にマッピング対象の名称を書いておく（何ページからと説明しやすくなるため）。
* 地図の隅に縮尺（1/400や1/800など）を書いておくと、少しは伝わりやすいかも。

![タイトルと縮尺、コピーライト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/65118e7a-b415-9360-5941-2f2c14676d39.png)

# そういった訳で
* マッピングパーティー用の地図をLibreOfficeで作る方法を説明させて頂きました。
* 現地調査する時、特に初心者が何処に困るか考えて、工夫が出来るといいですね。
* マッピングに慣れると地図が無くても良くなるけど、初心者にはハードルが高い。
* みなさんの地域でもマッピングパーティーが開かれますように。

# 参考サイト
* [[OSM]地図を切り出して印刷する方法](https://medium.com/openstreetmap-tips-japan/osm-%E5%9C%B0%E5%9B%B3%E3%82%92%E7%94%BB%E5%83%8F%E3%81%A8%E3%81%97%E3%81%A6%E5%88%87%E3%82%8A%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95-34d73268931e)
* [はじめてからのOpenStreetMapガイド](https://learnosm.org/ja/)
* [諸国・浪漫](https://countries-romantic.connpass.com/)
活躍する新卒エンジニアの特徴

# はじめに
HRBrainでは、2023年4月から本格的に新卒エンジニアを受け入れ始めました。
現在は2024年4月入社のみなさんも内定者インターンとして働いており、総勢10人以上の若手メンバーが活躍しています。

そんな方々のうち、特に活躍しているなと感じる人たちの特徴をまとめることにしました。

# 特徴1: まず手を挙げてやってみる
新卒エンジニアは、基本的に未経験の仕事に出会うことになります。もちろん学生時代にインターンを複数社経験した人もいますが、それでも初めての領域は多いはずです。

新卒の方に限らず、未経験者が経験者になるためには未経験なタスクに挑戦する必要があります。

先輩から明確にタスクを渡されたときはもちろん、それ以外にも突発的な調査やバグfixなど、誰かがやらないといけないけど宙に浮いたタスクにも積極的に手を上げ、まず経験の幅を広げるということに執着している人は活躍しています。

![IMG_0571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67253/89c41796-979f-14eb-c1b9-99086bbde184.jpeg)

上記の写真は、社内で実施された新規事業プランコンテストで入賞したチームです。入賞したメンバーのうち4人は2023年4月入社の新卒メンバーでした。

自ら手を上げて挑戦する行動により良い結果が生まれた事例です。

# 特徴2: 正解を探すのではなく、より良い道を切り開く
学生時代と社会人時代の大きな違いは、正解の有無です。

例えばテストでは決められた正解があり、回答が正しいかどうかは採点されることで即座に正解か不正解かが分かります。

社会人になると、正解が無い世界に変わります。あるのは今よりもより良いかどうかだけです。上司がOKを出すかどうかが正解不正解に見えるかもしれませんが、その上司がOKと言っても更に上の上司がNGを出すケースもよくあります。全員のOKを目指すとどこかでデッドロックにハマってしまいます。

決まった正解を探そうということではなく、自分はこれがベストだと考えたのでこれで進めます！という勢いと、より良い成果を得るために素直に指摘を受け取る姿勢でいられる人が成長しています。

![スクリーンショット 2023-12-05 23.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67253/e3c8e51d-676f-0311-cb8a-dafc9826294d.png)

上記は、2024春に新卒で入社予定の内定者インターンメンバーからのメッセージです。

内定者インターンメンバーたちでLTをするイベントを企画したが、思うように参加者が増えず困ったときの一手として私に声をかけてくれました。

正解が無い中で、より良い結果を得るために工夫してアクションを起こした良い例です。

# 特徴3: 周囲の人を巻き込む
先程の事例もそうですが、活躍している人は物怖じせず周囲の人を巻き込むのが上手です。

例えば、「お忙しいと思いますが、教えてほしいのでお時間ください！」と先輩の時間を確保し、アドバイスを一旦まず聞くだけ聞いて、「ありがとうございました！」と気持ちよく去っていきます。

そのアドバイスのうち本当に活かせる部分はわずかかもしれませんが、自分だけで悶々と考えるのではなく広く成長のための材料を集めることができる人は早く成長しています。

自分の成長のためだけでなく、より良い結果を得るために周囲の人を巻き込むケースもあります。

![スクリーンショット 2023-12-06 10.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67253/71cd8333-fde5-a120-e7b9-d7e46173aa06.png)

上記も2024の春に入社予定の内定者インターンメンバーの発信です。

アドベントカレンダーをきっかけに、開発組織だけでなく全社を巻き込んでいます。

自ら手を挙げた上でより良い結果を得るために周囲のメンバーを巻き込んでおり、素晴らしいチャレンジだと思います。

# さいごに
活躍する新卒エンジニアの特徴として、3点を記載しました。

が、これは新卒エンジニアだけに限らない思います。

積極的に未知の機会に飛び込み、より良い方法を探り、周囲の環境からフィードバックを得て次のチャレンジに挑むというサイクルが回せる人は、老若男女問わず成長し続けて活躍できるはずです。

貪欲に成長し活躍したい方は、会社が急成長して未知の挑戦チャンスがたくさん広がっているHRBrainにぜひ興味を持ってほしいです。

https://www.hrbrain.co.jp/recruit
個人開発のタスク管理でJIRAを使ってみる

### はじめに

個人開発で、githubのイシューを使用していましたが、JIRAが個人で登録できることを思い出し、個人開発での使用は意味がないけれど思い出しついでに使ってみました。

### JIRAにサインアップする

https://www.atlassian.com/ja/software/jira?&aceid=&adposition=&adgroup=143040581685&campaign=19324540445&creative=663266931354&device=c&keyword=jira&matchtype=e&network=g&placement=&ds_kids=p74609436365&ds_e=GOOGLE&ds_eid=700000001558501&ds_e1=GOOGLE&gad_source=1&gclid=Cj0KCQiAsburBhCIARIsAExmsu6PV0b3-XbGkOQdEJt_kra7VFWrHTu6HLxPAH4-jNAd12hCi5xCkMQaAnzwEALw_wcB&gclsrc=aw.ds

個人でも無料で使用できました。

### デフォルトのボードの設定を変更する

![スクリーンショット 2023-12-05 23.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/4e91b05f-72a8-52ac-6a5d-d38552013c12.png)

![スクリーンショット 2023-12-05 23.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/a160c271-5050-0edb-0778-fab8359d25dc.png)

デフォルトの設定が変更できます。

### ボードの名前の変更

![スクリーンショット 2023-12-05 23.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/372843c6-e608-1821-332f-154b02ba4786.png)

ボード名をクリックすれば変更できます。

### タスクの作成

![スクリーンショット 2023-12-05 23.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/6218f843-9195-6380-8378-0fc77befc510.png)

作成をクリックすると、詳細を入力できるので入力したら作成を押せば、簡単にタスクが作成できます。
※作成後のタスクを削除した場合、例えば「task-1」を削除すると、「task-1」はそのまま残ってしまい、次に作成するチケットは「task-2」になってしまいます。

### ボード

![スクリーンショット 2023-12-05 23.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/a743bc69-3dec-1dcc-10e3-91a5ec5ae5a9.png)

作成したチケットは、ボード上に表示され進行状況が確認できます。
タスクの詳細にgithubのプルリクを貼り付け、該当のプルリクがどれなのかが分かりやすくできたりします。

### まとめ

もっとできることが多かったような気がするので、使用したらまた更新します。
デスクワークの人は痔に気を付けてほしい

タイトルの通りです。

## ９月中旬　切れ痔発症
会社のトイレにて
これまでも軽く切れたかな？という事はあったが
今回は明確に"""感じた"""のと、痛み~pain~があったため

直後はそこまでだったが、その後半日以上痛みが持続し
椅子にまともに座る事すら出来ないレベルに発展

## ９月下旬～　病院
薬局で尻に注入するアレを購入し
治癒を試みるが、良くなる気配がない上に
更に悪化し、毎朝トイレで３０分～籠る事態に

という訳で約１週間後、病院へ

医者に症状を伝え、ベッドに横になりカメラを突っ込まれる
撮った写真を見せてもらったが盛大に出血し切れていた

整腸剤、抗炎症剤、漢方、ステロイド軟膏を処方され帰宅

２週間後にまた来てくれと告げられる

## 10月初旬　戦いの日々
この２週間、全く良くなる気配がなく、QOLが終わりのように下がり
痛みの余り、休日は半日以上横になり痛みに耐えるという日々が続いていた

労働中も痛みがあるが、仕事をしない訳にはいかないので
円座クッション（真ん中に穴が開いてるやつ）を購入し、職場の椅子に導入
が、そもそも座ると痛いので結局、椅子の上に正座して仕事をする始末

そして２週間が経過、病院へ
問診のち、カメラにて検査
出血は無くなったので、前よりはよくなってるね～と言われる
しかし、痛み自体は全く変わっていないので
血が出てよいうが出ていまいがという気持ちだった

## 10月中旬　純潔を失う
問診、検査が終わり、薬を貰って帰ろうとした所、医者が

「この後、時間ありますか？」

―――ドックン

経験上、良くない予感がした

「時間あるなら、ブジーって治療をやろうと思うんだけど」
「だいぶ楽になると思うから」

ブジーという聞いた事もないワードに不安を煽られる

そして別室へ連れていかれ、ベッドに横向きに尻丸出しの状態で寝かされる


### ブジーとは→[■](https://www.1day-surgery.jp/20170401/)

まず、指で＊を広げられた後、滑りをよくする潤滑剤のようなものを入れられる
私は横になっていて見えないが、感覚的には上のリンク先にあるような
写真の器具を入れられたのは感じた

リンク先では１０～１５分とあるが、自分が通院している所では３０分程度、挿入され放置

女の子に、されて、しまいました

## １０月下旬～１１月下旬　この治療について
医者の話によると、切れ痔は排便の度に切れるので
痛みで括約筋が常に緊張状態になってしまい狭窄、つまり狭くなる
→狭い状態で便を出す→また切れるという悪循環になる

その緊張状態を器具を挿入することによって和らげ、改善を試みる、という治療との事
慢性的だと手術適応みたいだが、自分は急性だったのでこの治療でなんとかなるみたいだった

そしてここから週１で通いこの治療を受ける事となる

で、この治療だが、ずっと同じ径の器具を使用するのではなく
少しずつ径の大きさを上げていき、緊張状態をほぐしていくという感じだった

１週間、２週間、３週間...

明らかに径が大きくなっているのが自分でもわかり
普通に痛かった、が
やはり人間とは慣れるもので、異物感があり不快なのは変わらないが
回を重ねるごとに、痛みは消失していった

このブジーという治療、効果は劇的で、目に見えて痛みが軽減した

## １２月初旬～
これを書いている現在（いま）
まだ通院しこの治療は続いている
痛みは既にほぼ無く、たま～に軽く切れてピリッとした痛みがあったりする程度
痛みも３０分～くらいすれば消失
数ヶ月前に比べれば９割方、治癒したのではないだろうか

果たしていつ終わるのだろう

## まとめ
切れ痔発症には色々な原因があるようだが
大多数は便秘による硬い便によって引き起こされるとの事

自分は便秘ではないが、普段余り水分を取らないため、便が硬い自覚はあったのでおそらくそれと
辛い物が好きなので、これも一つの要因かもしれない
唐辛子に含まれるカプサイシン等は、ほぼ消化吸収されないので肛門にダイレクトアタックらしい

これも良く聞く話だが、やはり座りっぱなしも肛門周りがうっ血し
痔を発症するリスクが高まる（どちらかというとこちらはいぼ痔だが）
数時間ごとに立って少しでも歩くなどし、発症のリスクを減らそう...



デスクワークの方はくれぐれもお気を付け下さい...
【Git】部分的にコミットする方法

# はじめに
gitを利用してシステム開発している際に、ファイル単位ではなく行単位でコミットしたい場面があったので調査した内容を簡単にまとめてみます。なお、vscodeで開発しています。

# 行単位でコミットする方法
1. コミットしたい対象を行単位でドラッグし、選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382528/7ce56484-b901-0d02-b7d8-56c893eccb0c.png)

1. 選択した後に、ctrl + k押下し、Ctrl+Alt+sを押下し、ステージにあげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382528/3b02d936-7bca-3bb2-4bdf-6115c610dae4.png)

1. コミットメッセージ入力後、「Commit」ボタン押下し、コミットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382528/a600f245-59a2-6d40-c80c-0278e5e88074.png)

# おわりに
今後、開発を進めていく際に、コメントや値を確認するコードはコミットしたくないが一部部分はコミットしたい場面が出てきた際は、今回の手順に従って部分的にコミットしていこうと思いました。また、部分的にコミットすることで、コミットへのハードルが下がりより細かなコミットに繋がるのではないかと個人的に思いました。

# 参考記事
https://blog.masuyoshi.com/vscode-git-%E8%A1%8C%E5%8D%98%E4%BD%8D%E3%81%A7%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E5%86%86%E6%BB%91%E3%81%AB%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95/
（小ネタ）Tone.jsでタイトなリズムを刻む

[Tone.js](https://tonejs.github.io) は、Web Audio API を簡単に扱うためのライブラリです。    

UIに関する機能は持たずに完全に音を出すことに特化しており、サンプルプレイバックや簡単なシンセサイザーも扱えるので、Webアプリに効果音をつけるだけでなく、これ1つで複数の楽器を使ったアンサンブル音源を構成することも可能です。    

また、BPMでテンポ指定可能なスケジューラーも用意されているので、シーケンサー的なものも簡単に作れます。    

今回は、Tone.jsのスケジューラーのちょっとした小ネタを紹介したいと思います。（ホント小ネタですいません）

### リズムがバタつく！？（→正しくコードが書けてないだけ）

下記のようなコードを書いたところリズムがめちゃくちゃバタつきました。

```.js
const sampler = new Tone.Sampler({...}); // ← wavデータなどを読み込んでサンプラーを作成。詳細は割愛。

Tone.Transport.scheduleRepeat((time) => {
  sampler.triggerAttackRelease("C1","1n");
},"16n");
```

[（デモ）バタついている様子](https://capp.mz4u.net/test/before.html)

上記コードでは、コールバックが一定のインターバルで正確に呼び出されないと、正確なリズムを刻むことはできませんが、上記コードを書いた時の私は「コールバックは正確なインターバルで呼び出されるだろう。」という勝手な幻想を抱いていたようです。

実際には、**コールバックはタイマー割り込みのように一定のインターバルで正確に呼び出されるわけではない！** ということのようです。    

そういえば、そうでした。    

### どうすれば正確になる？

コールバックのタイミングは正確ではありませんので、コールバックから即時再生するような音源呼び出しをするのではなく、**「音を鳴らすタイミングを予約する」** 機能を使って、近い未来の時間へ再生を予約する必要があるようです。    

`Tone.js` では、`xxx.triggerAttackRelease()` の第3パラメータに(今より未来の)時刻を設定すれば、その時に音を鳴らしてくれます。この機能を使えば解決です！     

そして、実は `Tone.Transport.scheduleRepeat()`に設定したコールバック関数のパラメータとして、次のTick時刻が渡されますので、この時刻を`xxx.triggerAttackRelease()` の第3パラメータに設定すれば良いだけです。

というわけで、下記のように修正してみました。    

```.js
const sampler = new Tone.Sampler({...}); // ← wavデータなどを読み込んでサンプラーを作成。詳細は割愛。

Tone.Transport.scheduleRepeat((time) => {
  sampler.triggerAttackRelease("C1","1n",time);
},"16n");
```

[（デモ）バタつきが治った様子](https://capp.mz4u.net/test/after.html)

簡単でしたね！    

### まとめ

Tone.js でタイトなリズムを刻むには、`xxx.triggerAttackRelease()` の第3パラメータをちゃんと設定しましょう。というお話でした。

### 参考情報

（tone.jsの `Transport` もおそらく内部で利用しているであろう）`setInterval`や`requestAnimationFrame` などを使ったスケジューラが一定のインターバルで発火されない状況や、そうした状況を前提として `AudioContext.currentTime` などを用いた正確なリズムを刻む方法については  @toyoshim さんが 丁寧に解説してくれていますので、ぜひ参考にしてください。    

例えば、Web Audio と Web MIDI を同期させたい、といったユースケースを実現しようとすると必須の内容が解説されています。

- [Web Audio / Web MIDI にまつわる時間管理の話（１） - Webにおける3種類の時刻](https://qiita.com/toyoshim/items/98f11b74ccd60af34859)
- [Web Audio / Web MIDI にまつわる時間管理の話（２） - 絶対時間と演奏時間](https://qiita.com/toyoshim/items/69dce2c58f72418b3d19)
- [Web Audio / Web MIDI にまつわる時間管理の話（３） - メトロノームからMBT時刻の取得まで](https://qiita.com/toyoshim/items/dd80295c12e6d02314d3)
[bash]ワンライナーで、コマンドの結果を検索パターンとしてgrepする（プロセス置換）

# 背景（やりたかったこと）

毎障害時に、MySQLのProcessListにAWS EMRのインスタンスからのIPが存在しているかどうかを調べる（謎）手順がありました。
しかし、一覧取得して1つずつgrepしている現状の手順に嫌気がさしてきたので、ワンライナーでの実現方法を調べました。

# 結論
```
mysql -h${hostname} -u${username} -p${password} -e "select * from information_schema.processlist;"|grep -f <(aws emr list-instances --cluster-id ${cluster id} --instance-states RUNNING|jq -r '.PrivateIpAddress')
```


# 取得順序
## 1. ProcessList取得方法
mysqlコマンドで以下のようにselectする
```
mysql -h${hostname} -u${username} -p${password} -e "select * from information_schema.processlist;"
```

https://dev.mysql.com/doc/refman/8.2/en/information-schema-processlist-table.html

## 2. EMRのインスタンスをIP一覧を取得する
awd cliで取得可能
```
aws emr list-instances --cluster-id ${cluster id} --instance-states RUNNING|jq -r '.PrivateIpAddress'
```

https://docs.aws.amazon.com/cli/latest/reference/emr/list-instances.html

# 2で取得した一覧をgrepの検索パターンとする
プロセス置換 + grep -fで実現可能

grep -f

https://yuinore.net/2017/04/linux-grep-pattern/

これは`プロセス置換`という機能で実現できているらしい

https://techblog.raccoon.ne.jp/archives/53726690.html

以上より、結論のコマンドができあがりました。
【TypeChallenge】extends と infer

https://mosya.dev/type-challenges/

このサイトで Type Challenges の洗礼を受けてきました。初級編のクリアにあたって必要だった知識を公開していこうと思います。

# 型の定義のしかた
```ts
type Hoge<T: Fuga> = いろいろな定義
```
まず、Type Challenges における型定義はだいたいジェネリクスを用いることになります。左辺のジェネリクスで定義した型を右辺でこねくり回すイメージです。

## extends
```ts
T extends U
```
$T$ が $U$ に代入可能であることを表します。
ジェネリクスの制約としての文脈ならば、$T$ は $U$ の性質を満たすと言い換えられそうです。

```ts
type Hoge<T extends any[]> = いろいろな定義
```
例えば上のような `extends` の使い方をすれば、$T$ が配列であることを強制できます。

また、Conditional Types ではもっぱら条件分岐の条件式として扱われます。
```ts
T extends U ? X : Y
```
$T$ が $U$ に代入可能なら $X$、それいがいなら $Y$ になる型です。

## infer
```ts
type PromiseUnwrap<T extends Promise<any>> = T extends Promise<infer U> ? U : never
```
実際にジェネリクスに型を突っ込んだときに評価されて出てくる型を扱うのが `infer` です。
`Promise` 型の何か $T$ を突っ込み、実行時に中身の `U` を評価します。

型推論と呼ばれる機能なのですが、推論ですから、評価の対象が必要なキーワードです。上の定義のように `extends` での代入で型を抽出するのに使うことができます。

# おわり
難しすぎ！
M5Stick CPlus で用いる画像のフォーマットを調べる

M5Stick CPlus では、[drawBitmap() 関数](https://lang-ship.com/reference/unofficial/M5StickC/Class/M5Display/#bitmapconst-8bit-drawbitmap) や、[drawXBitmap() 関数](https://lang-ship.com/reference/unofficial/M5StickC/Class/M5Display/#xbitmap-drawxbitmap) で画面に画像を描画することができる。
そこで、今回はこれらの関数が扱う画像のフォーマットを調べてみた。

# サンプルプログラム

```platformio.ini
[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
lib_deps = m5stack/M5StickCPlus@^0.1.0
```

```src/main.cpp
#include <M5StickCPlus.h>

const uint8_t data[1024] = {
  0x80, 0xc0, 0x0f, 0x03, 0x81, 0x83, 0xc3, 0xff,
  0x80, 0xc0, 0x0f, 0x03, 0x81, 0x83, 0xc3, 0xff,
};

uint8_t data2[1024], data3[1024], data4[1024];

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  for (int i = 0; i < 64; i++) {
    data2[i] = 0xff;
    data3[i] = i;
    data4[i] = i % 2 == 0 ? (1 << (i / 2 % 16)) : (1 << (((i / 2 + 8) % 16)));
  }
}

void loop() {
  M5.update();
  if (M5.BtnA.wasReleased()) {
    M5.Lcd.fillScreen(TFT_BLACK);
    M5.Lcd.drawXBitmap(60, 60, data, 8, 8, TFT_WHITE);
    M5.Lcd.drawXBitmap(60, 120, data, 12, 8, TFT_WHITE);
    M5.Lcd.drawXBitmap(60, 180, data, 16, 8, TFT_WHITE);
  }
  if (M5.BtnB.wasReleased()) {
    M5.Lcd.fillScreen(TFT_DARKGREY);
    M5.Lcd.drawBitmap(60, 60, 8, 8, data2);
    M5.Lcd.drawBitmap(60, 120, 12, 8, data3);
    M5.Lcd.drawBitmap(60, 180, 16, 8, data4);
  }
}
```

# 描画結果

画面を60倍のマイクロスコープで拡大し、撮影した。

## drawXBitmap による描画

Aボタンを押すと、上から順に以下の図形が描画された。

![drawXBitmap 横幅8](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/f0cdc914-abf8-0c3d-47a1-8ec9c57ef43f.jpeg)
![drawXBitmap 横幅12](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/2b4e94df-2ed7-9490-2b3f-432bce59590b.jpeg)
![drawXBitmap 横幅16](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/b1b62938-d3c7-4431-94a7-a45d0be5887a.jpeg)

## drawBitmap による描画

Bボタンを押すと、上から順に以下の図形が描画された。

![drawBitmap 横幅8](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/e9af1245-4889-cd0f-b5ff-1ddca12fb48a.jpeg)
![drawBitmap 横幅12](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/20421207-8c73-c8b7-16df-3605a808e344.jpeg)
![drawBitmap 横幅16](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/c20595b8-f935-9089-4199-c98d4123f93f.jpeg)

# 画像のフォーマット

プログラムと描画結果から、画像のフォーマットは以下のようになっていると推測できる。

## drawXBitmap

* 1ピクセルを1ビットで表し、「1」は描画する、「0」は描画しない (または背景色で描画する) を表す。
* 画像は1行を (横幅を8で割って切り上げた数)バイトで表す。
* 各行のデータをまとめて、上の行から下の行の順でデータを並べる。
* 1行のデータは、左のデータから右のデータの順で格納する。
* 1バイトの中では、左のデータをLSB、右のデータをMSBで表す。
* 横幅が8の倍数でないときは、最後のバイトの右のデータを捨てる。

## drawBitmap

* 1ピクセルを2バイトで表す。各ピクセルはデータを符号なし・16ビット・リトルエンディアンの整数とみなし、下位5ビットで青の輝度、真ん中の6ビットで緑の輝度、上位5ビットで赤の輝度を表す。
* 画像は1行を (横幅×2)バイトで表す。
* 各行のデータをまとめて、上の行から下の行の順でデータを並べる。
* 1行のデータは、左のデータから右のデータの順で格納する。
GitHub Actionsでトークンを受け取る方法

この記事は、[GitHub Actions Advent Calendar 2023](https://qiita.com/advent-calendar/2023/github-actions) の21日目です。

:::note info
この記事はGitHub Actionsを作成する基礎的な知識があることを前提にしています。
:::

GitHub Actionsを作成しているときに、トークンが必要なこと (PRに書き込むなど) をしたいと思うことは少なくないはず。
そんなときにトークンを取得しようと思っても、JavaScript ActionやDocker Actionなどからは直接Secretsにアクセスすることができません。
というわけで、結論。

# inputでトークンを受け取る
inputではデフォルト値を設定することができます。なので、デフォルト値としてSecretsから取得したGitHubトークンを与えればよいのです。

```yaml:action.yaml
inputs:
  github_token:
    description: Token with issue write permission. Do not specify this.
    required: false
    default: ${{ github.token }}
```

これでトークンを受け取ることができます。意図しない値が設定されることを避けるため、説明には「設定するなよ」と書いておきましょう。

JavaScript Actionでトークンを受け取る例です。

```javascript
const core = require('@actions/core');
const token = core.getInput('github_token');
```
軽深演習 #25 賢くなりたいですか？

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 25日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　賢くなりたいですか？
普段私たち使ってる言語を圏論として扱うことには少しずつ始まっています。「範疇文法の構文解析についての圏論的な視点」がそれです。今回あつかう題材は、質問というさらに難しい領域です。

図式で書くと、こんな感じですね。
```mermaid
flowchart LR
A[賢く]-->B[なりたい]-->C[ですか]
```

この質問は、非常に面白いです。私は、あった人によくしています。現在は、賢い人の判定方法としてつかっています。明るくはいと答えた人、もしくは明確な理由で否定的な人は賢いと判定します。賢いフリをしているだけの人は、この質問には曖昧な回答します。

この図式で、圏として、射はなにかを厳密に定義はとてもできないですが、グロタンディークの**何でもいい**を適用すると見えてくることがあります。賢いの部分は広範囲に置き換えることができます。

```mermaid
flowchart LR
A[仕事ができる人に]-->B[なりたい]-->C[ですか]
```

置き換えると**なりたい**がそぐわないときもあります。適宜、変えましょう。

```mermaid
flowchart LR
A[いい仕事を]-->B[したい]-->C[ですか]
```

### 演習 賢い　の文言を入れ替えて　効果的な質問をつくってみてください

賢くなりたいですか？　と質問すると、はっとしたり、笑ったりします。現時点ではなぜそうなるかはよくわかりませんが、かなり効果的な質問のようです。いろいろバリエーションを作ってみましょう。
Snykマスコット犬”Patch”への愛を語ろう（その２）

## まえがき

マスコット犬パッチにさらに、またさらに愛を！
[愛を語ろう（その１）](https://qiita.com/nikosun/items/7855d5af8a5e79d8b189)に続き、（その２）へようこそ。

どうやら2023年8月の International Dog Dayの記事は以下にあるのですが、あなたが警備犬なら？クイズと共に、短い犬のルーブ動画まであって、Snykは犬への愛が溢れてますね。
Snyk Blog- [What kind of (security) dog are you?](https://snyk.io/jp/blog/what-kind-of-security-dog-are-you/) 

### マスコット犬パッチへの愛をさらに語ろう

さて（その１）でも参照した、このページ2022年のDog Dayのページに戻ります。

Snyk Blog - [Celebrate International Dog Day with #DevelopersBestFriend](https://snyk.io/blog/celebrate-international-dog-day/)


![Snyk-blog-dog-day-patch-evol.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48672/be039d37-3ef9-87db-7199-f7adc7bcd7c0.jpeg)


この画像のすぐ上にある文章からの引用です。

*The logo required several iterations before we landed on what Patch looks like today. 
…（中略）it gave us the anchor idea to use the ears as part of the logo’s font.*

（意訳）ロゴの犬は変更を繰り返して今のPatchになった。変遷の中で耳の形がロゴのフォントの形のアイディアにも埋め込まれた。

…ということはつまり、マスコット犬パッチの耳の斜めカットと、Snykのフォントの斜めカットは同じ角度なのか？それとも違うのか？

犬好きの皆さんなら、これはすごく気になりますよね？確かめてみたいですよね（念押し）

### プレスキットがしっかりあってステキ

はい、それでは確かめてみましょう。ロゴはSnyk公式のこちらからお借りしました。
Snyk - [Press kit - Download Snyk assets](https://snyk.io/press-kit/)

SVGやEPSのベクトルデータもしっかりあって、さすが！（好感度アップ）
私いつもこれ言ってるんです。ロゴが大切なら、中途半端にビットマップの解像度低めなやつじゃなくて、しっかりとベクトルのデータ渡しましょうよ。そのために、ロゴ使用ガイドラインを決めたんだから！とね。

さて、そんな私なので、ロゴは軽々しく扱ってはならぬことは、重々承知しております。しかし！それよりマスコット犬パッチへの愛が暴走しております。このままだと気になって夜も安心して眠れません。犬の代わりに羊を数えてもきっとダメでしょう。

道で犬を見るとすぐに駆け寄ってしまう、犬がセキュリティホールの私です。


![snyk-patch-ear-angle-720(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48672/07cc451b-3018-e5d5-0c6a-ed46754babe7.gif)


やってしまいました。こんなGIF動画を作って、オコられたらどうしよう。
でも心配するより、まず行動を起こすことが大事！ってどこかで聞いた気がするの。

## パッチとフォントの斜めカット比較

とても細部までキレイなデータで、感心しました。
プレスキットには、色やフォーマットごとに整理された形で、使いやすくデータが格納してあり、すぐに確認の作業ができました。

### 結論はいかに？そして…

もうGIF動画でもご覧のとおり、角度は違いました。こちらから向かって左側パッチの右耳の部分で、デザインソフトで比較してみました。

ここで、さらに気づいたことがありました。それはパッチの耳の外側は、直線でなくほんの少し曲線でした。そういう意味でも、角度の比較になりませんでした。

そして… Snykのマスコット犬パッチへの理解が、さらに！もっとさらに深まりました。
何事も理解が深まると、それに対する愛も深くなりますよね。

## セキュリティ関連の記事について

セキュリティ関連の記事は、そもそもその性格上、公開できるデータを見つけたりするのが難しい。運よく仕事上で公開OKなコードがあったりすることはなかなか無いでしょう。

私が当初CI/CDパイプラインで記事を書こうとしてた当初の構想は、個人で作る予定のJAMstackサイトを実験台にするつもりでした。
しかし考えてみたら、規模は小さいし、当然複雑でもないし、最新のオープンソースライブラリを使うので、セキュリティ上の問題もほぼ無い。つまり全くネタにもならない…。

勝手に誰かの比較的大きく複雑なレポジトリなどを、Snykでチェックして、ほ〜ら脆弱性あったよ！などと記事にできませんからね。

この機会に（何度も繰返し恐縮ですが）DevSecOps関連の記事、やってみたブログなど、けっこう読みました。中には、ワザと脆弱性を含んだコードを入れて、Snykで実験・確認するみたいな記事もどこかで読みました。その辺の難しさがあるのだな、と感じました。

### さいごに

2023年のクリスマスも、終わりですね。まさか3つも記事を書いてしまうとは！

日本時間で12月26日の夕刻に、まだ書いているこの投稿ですが、これで安心して新年を迎えられそうです。

Merry Christmas and Happy New Year 2024 !!
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.15.7／OTP26で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の22日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 26 [erts-14.2.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、Elixir 1.16.0とさほど変わらないようです

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=746
:ok
```

# 限界確認

25万プロセスもElixir 1.16.0と変わらないようです

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=1942
:ok
```
Ecto.QueryのPreload

https://hexdocs.pm/ecto/Ecto.Query.html#preload/3

from句に含めて書いたり、

```elixir
Repo.all from p in Post, preload: [:comments]
```

下記のように書くこともできます。

```elixir
Post
|> preload(:comments)
|> select([p], p)
```
Swiftで複数画面で使えるFloating Action Buttonを実装する

## はじめに
この記事はSwiftを使ってFloating Action Button（Xのような浮いてるボタン）を実装する方法を紹介します！Storyboardに直接おけばいいやん〜と思う方もいるかもしれないですが
* 複数のViewControllerに同じボタンを置きたいとき
* TableViewの上に重ねてボタンを置きたいとき

など、この記事で紹介するやり方が役にたつ場合もあることでしょう( ◠‿◠ )

## 環境
* Xcode15.0.1 
* Swift5

## 完成図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741705/fa2910be-1a02-7c63-4a61-5fea9d48510c.png" width="300">

## 開発の手順

ボタンを配置したView Conroller Classを作成し、このClassを他のView Controller Classで継承します。


## 1. 親Classの作成
普通にViewControllerを作る時と同じようにファイルを作成し、コードでボタンを配置します。長くなるので`setupButton`としてまとめました。これをViewDidLoadで呼び出します。

```Swift: CommonUIViewController
import UIKit

class CommonUIViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupButton()
    }
    
    private func setupButton(){
        let button = UIButton(type: .system)
        let image = UIImage(systemName: "plus", withConfiguration: UIImage.SymbolConfiguration(pointSize: 32, weight: .bold))
        //↑"+"マークの大きさを調整している
        button.setImage(image, for: .normal) //ボタンの画像を"+"マークに指定
        button.tintColor = .white //ボタンの中にある"+"マークの色を指定
        button.backgroundColor = .black //ボタン自体の色を指定
        button.layer.cornerRadius = 30
        button.addTarget(self, action: #selector(commonButtonTapped), for: .touchUpInside)
        
        
        button.frame = CGRect(x: self.view.frame.size.width - 76, y: self.view.frame.size.height - 150, width: 60  , height: 60)
        self.view.addSubview(button)
    }

    //今回はボタンを押した時に新規投稿画面へ画面遷移するようにしています。
    @objc func commonButtonTapped(){
        let nextVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AddTask") as! AddTaskViewController
        nextVC.modalPresentationStyle = .fullScreen
        self.present(nextVC, animated: true, completion: nil)
    }
    
}
```
コードでパーツを配置したことがなければ[この記事](https://qiita.com/gaku2n/items/fa095276ab2d75cc8797)が参考になります。


## 2. 子Classでの継承
継承するClassに先ほど作成した親Classを指定します。この時に注意するのが、もともと継承していた`View Controller`は消すということです。
親ClassがすでにViewControllerを継承しているので同じクラスを2回継承することになり、エラーとなってしまいます！

```Swift: OtherViewControllers
class CalendarViewController: CommonUIViewController {
    ...
}
```

これで、ボタンを配置したクラスを継承したViewControllerにはボタンが現れるようになります！

## まとめ
継承できるClassとして作成することで複数の画面に同じボタンを配置できるだけでなく、タップした時の処理も統一できるのがいいですね！
これを機にStoryboardを使っている人もコードでのパーツ配置に挑戦してみましょう！
Supervisor経由で25万プロセス起動する負荷を現代PC＋Elixir 1.16.0／OTP26で試す

この記事は、[Elixir Advent Calendar 2023 シリーズ12](https://qiita.com/advent-calendar/2023/elixir) の23日目です

---

【本コラムは、5分で読めます】　※各ライブラリをお試しいただく場合は各自次第で

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記コラムで行っている「Supervisor経由で10万プロセス起動する負荷」を現代PC＋最新Elixirで試すシリーズです

https://qiita.com/piacerex/items/294b45e8f2f1ee4c2f8f

# 実施PC／Elixir／OTP

- PC
  - CPU：i9-9900K 3.60GHz
  - メモリ：64 GByte

```
Erlang/OTP 26 [erts-14.2.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Elixir 1.16.0 (compiled with Erlang/OTP 26)
```

# ソースコード

```elixir
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link( processes ) do
		start = Timex.now()
		servers = 1..processes |> Enum.map( &( worker( PassGenServer, [], id: &1 ) ) )
		Supervisor.start_link( servers, strategy: :one_for_one )
		IO.puts( "Spent Milliseconds=#{Timex.diff( Timex.now(), start, :milliseconds )}" )
	end

	def cat( parameter, name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), { :cat, parameter } )
	end

	def pwd( name \\ "0" ) do
		GenServer.call( :global.whereis_name( name ), :pwd )
	end
end

defmodule PassGenServer do
	use GenServer

	def start_link() do
		{ :ok, pid } = GenServer.start_link( __MODULE__, "" )
		#IO.puts( "--- PassGenServer.start_link() PID=#{inspect pid} ---" )
		{ :ok, pid }
	end

	def handle_call( :pwd, _from, _state ) do
		{ :ok, result } = File.cwd()
		{ :reply, result, "" }
	end

	def handle_call( { :cat, path }, _from, _state ) do
		{ :ok, result } = File.read( path )
		{ :reply, result, "" }
	end
end
```

# 実施結果

10万プロセス生成に、元コラムでは18秒ほどかかっていた処理が、0.7秒で終わるようになっています

```diff_elixir
iex> PassSupervisor.start_link(100000)
Spent Milliseconds=733
:ok
```

# 限界確認

30万プロセスでSystemLimitエラーになりました

```diff_elixir
iex> PassSupervisor.start_link(300000)

23:11:01.371 [error] Too many processes


** (EXIT from #PID<0.226.0>) shell process exited with reason: shutdown: failed to start child: 262022
    ** (EXIT) an exception was raised:
        ** (SystemLimitError) a system limit has been reached
            :erlang.spawn_opt(:proc_lib, :init_p, [#PID<0.227.0>, [#PID<0.226.0>, #PID<0.218.0>], :gen, :init_it, [:gen_server, #PID<0.227.0>, #PID<0.227.0>, PassGenServer, "", []]], [:link, :monitor])
            (stdlib 5.2) proc_lib.erl:192: :proc_lib.spawn_opt/4
            (stdlib 5.2) proc_lib.erl:358: :proc_lib.start_link/5
            (basic 0.1.0) lib/basic.ex:24: PassGenServer.start_link/0
            (stdlib 5.2) supervisor.erl:420: :supervisor.do_start_child_i/3
            (stdlib 5.2) supervisor.erl:406: :supervisor.do_start_child/2
            (stdlib 5.2) supervisor.erl:390: anonymous fn/3 in :supervisor.start_children/2
            (stdlib 5.2) supervisor.erl:1258: :supervisor.children_map/4
```

確か、Erlangの設定で解除できたハズですが、パッと思い出せないので、今度、解除してみます

25万プロセスは大丈夫なようです

```diff_elixir
iex> PassSupervisor.start_link(250000)
Spent Milliseconds=1960
:ok
```