OmniAICreator/Qiita-1.07M huggingface dataset:
AP試験対策について

# はじめに

[こちら](https://search.app?link=https%3A%2F%2Fqiita.com%2Fjun2%2Fitems%2F17cf76f2038b8f938064&utm_campaign=aga&utm_source=agsadl1%2Csh%2Fx%2Fgs%2Fm2%2F4)の記事で概要を記載しましたが、試験対策編です。


数多く似たような記事はあると思いますが、たまたまこの記事が目に入った方ご参考いただければ幸いです。

# 勉強の期間

勉強開始は1月から開始しました。

1日の勉強時間はサボりも考慮すると1h程度であったと思います。
(ちゃんと記録していなかったので、DBスペシャリストではちゃんと記録取ります。) 
そこから考えますと、1×100日(程度) = 100h程度の勉強時間であったと思います。

内訳的には
(1) テキスト読み 40h
(2) AM対策 30h
(3) PM対策 30h

こんな感じであったかなと思います。

振り替えると午後対策がいまいちな気がするな〜という気がしましたが、合格したので自分にはあっていたのだな としておきます。

# 勉強方法・対策

(1) テキスト読み

正直合格したいだけ〜であればここまで時間をかける必要はないかなと思います。

体系的な知識を身に着けたいという目的の元受験しましたので、じっくり読んだ(注意力散漫なのもありますが) というところになります。

とにかく合格!という方はまずはPM対策の項目を読み実行してから対象の箇所のテキスト読みを行ってください。

(2)AM対策

ご存じ過去問道場を活用します。
過去5年分は9割以上取れるようにしてください。
解説は一回だけちゃんと読みましょう。
そうすると、ただ暗記するよりも早く覚えられます。

体感少なくとも2割~3割程度は見たことがある過去問から出ていたと思いますので、絶対取れる問題を増やしておくと後は4択を割と運よく当てるだけでも通ります。

いくら何でも全部わからないというのはないでしょうから、まずこの対策だけで十分でしょう。

(3)PM対策

2つあります。

1つ目は得意な問題を探してください。

苦行ですが過去3回分のPMの問題を全てといて、解けた感と実際の点数(予想)をまとめてください。

その内解けた感+実際の点数がよかったものをまずは選択して、後は解けた感を優先した方が良いかなと思います。
実際私もネットワークは解けた感が無くても点数はよかったのですが、避けました。

この作業がAPにおける大半を占めるかなと思います。

2つ目は2時間のテストに耐えられるように慣れてください。

問題を選択して模擬テストを何回も繰り返し行い、2時間の勉強時間・試験時間が当たり前に消化できるようにしてください。

実はこれ、私は受験時できてないです。

のちに受けたDBスペシャリストからの教訓になりますが、時間慣れもかなり重要だと思います。

本来であれば、選択した問題のクセや既出傾向なども体感しながら試験対策するとより良いと思います。 
が、1つ目の作業で適切な問題を選択すれば合格点までは持って行けそうだ。
後は当日の難易度・頭の切れ次第と考えこの時はここまで深堀しませんでした。
エンジニア歴が浅い方はここまで深掘りするとよいと思います。

# 終わりに

わたしのようなものが応用情報などとそんなそんな・・・・と思っていましたが、

経験値にものを言わせて何とかなるもんだなと思いました。

最後に私が選択したPMの問題と理由になります。

完全に決め打ちで臨んでいます。

* システムアーキテクチャ
* 情報システム
内容にあまり差はないと思っている。
点数が取りやすい問題が出やすいので選択。

* データベース
業務に使っているので相当な得点源であったため
トランザクションやSQLが多少わかっているだけでも十分点数が取れると思う。

* 組み込みシステム開発
経験値もあるが、所感としては未経験でもよく読めば解ける問題が多い。
身近なものとして置き換えて読むことができる為問題文が頭に入ってきやすい。
AP合格しました

AP受験しました

# はじめに

だいぶ期間が空きましたが2024年度4月のAPを受験してきました。

結果的には合格でした。

今回は受験しての所感やおすすめしたいこと、当日気を付けたいことなど、 おそらく記事を読んでいる方にとってはそこじゃないよ!というところなのだと思いますが 次回受験対策は記事を起こしたいと思いますので、概要編としてお目通しいただきたいと思います。

# 所感、難易度

合格したからというわけではないのですが、まず10年何かしらのエンジニアをやっている方であれば

対策を講じていればパスできると思います。 わたしも受験前・受験勉強前は難しい試験なのだから一度落ちてもいいや!と思っていたのですが、 試験対策を始めてからはたぶん行けそうだな〜と思って取り組んでいました。 それもそのはず。私はエンジニア15年生です。

DB・組み込みの経験があったのでそこを基軸とすることで得点源が2つあります。 インフラ系エンジニアの方であれば、多岐にわたって経験があるでしょうからもっと楽なのではないかと思いした。

もちろん落ちた方がどうこうというわけではもちろんありません。 私自身、余力が多少あったのは正しい方向で対策が取れたからというだけなのだと思います。 人によって向き不向きがあるでしょうが、対策編の記事も参考にいただければ幸いです。 

# 当日気を付けたいところ

何しろ私自身40手前のおじさんです。体力が持ちません。 体力というのも、姿勢が普段から悪くものを書く時の下を向いた姿勢を長時間続けると首・肩に痛みが走り、 集中力が散漫になっていきます。

まずお昼休みになったら肩のストレッチを入念に行い、試験中は可能な限り姿勢を良くして望み、 カンニングと疑われないように注意しながら、なるべく下向きにならないよう問題文を読む。 こういった経験は後に受験したDBスペシャリストの試験で活かされたと思います。

# 終わりに

いいから早く試験対策編見せてよ!という声が聞こえてきそうです。次回に記載いたします。
net useを使った認証方法

# はじめに
今までファイルサーバに接続するときはエクスプローラでパスを入力した後、「ネットワーク資格情報の入力」のポップアップが求められた際にユーザ名とパスワードを毎回入力し認証していました。
そこをバッチファイルを一つたたいて認証した後にファイルサーバに接続すれば楽なのでは！と思いました。

# バッチの中身
```
@ehco off

net use \\[共有フォルダのパス] /user:[ユーザ名] [パスワード]

exit
```
上記を記載したテキストファイルを「名前を付けて保存」から、拡張子を「.bat」に変更して保存します。そのバッチファイルを実行すると簡単にファイルサーバへの認証をすることができます。

このバッチファイルをタスクスケジューラに仕込むことでログイン時に自動で認証されるようにもできるのでさらに楽に認証することができます。気になった方は試してみてください。

# 参考
- 【net useコマンド】ファイルサーバに接続・切断｜Windowsコマンド
　https://fkgtinfo.com/2021/03/27/net_use/
 
- バッチファイル(BATファイル)とは？作り方や書き方を初心者向けに解説！
　https://it-trend.jp/development_tools/article/32-0040

- Windowsコマンド虎の巻 バッチ基礎
　https://windows.command-ref.com/basic-batch.html
IPv6基礎検定向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`IPv6基礎検定に出てきそうな問題を作ってください。`

### 問題1 [サブネット]
IPv6のサブネットプレフィックス長で、最も一般的なホストネットワークのサブネットマスクは何ですか?

A. /24
B. /48
C. /64
D. /96

<details>
<summary>解説</summary>
正解は C. /64
IPv6では、/64が最も一般的なサブネットプレフィックス長です。これにより：

ネットワーク部が前半の64ビット
ホスト部が後半の64ビット
膨大な数のホストアドレスが可能になる
ステートレスアドレス自動設定（SLAAC）と互換性がある

</details>

### 問題2 [アドレス種別]
次のIPv6アドレス fe80::1 は何のタイプのアドレスですか?

A. グローバルユニキャストアドレス
B. リンクローカルアドレス
C. マルチキャストアドレス
D. エニーキャストアドレス

<details>
<summary>解説</summary>
正解は B. リンクローカルアドレス
fe80::/10で始まるアドレスはリンクローカルアドレスで、同一ネットワークセグメント内でのみ有効です。主に以下の用途があります：

ルーター探索
自動設定
近隣探索プロトコル

</details>

### 問題3 [ヘッダ]
IPv6ヘッダのペイロード長フィールドは何を示していますか?

A. IPアドレスの長さ
B. パケットの合計長さ
C. データ部分の長さ
D. ヘッダの長さ

<details>
<summary>解説</summary>
正解は C. データ部分の長さ
IPv6ヘッダのペイロード長フィールドは、IPv6ヘッダの後に続くデータ部分（上位層プロトコルのデータ）の長さをバイト単位で示します。
</details>

### 問題4 [セキュリティ]
IPv6のIPsecは、デフォルトでどのように実装されていますか?

A. 完全に無効
B. オプションで有効
C. デフォルトで必須
D. 特定の状況でのみ有効

<details>
<summary>解説</summary>
正解は B. オプションで有効
IPv6では、IPsecはプロトコルの仕様に含まれていますが、デフォルトでは必須ではなく、オプションとして実装されています。各ノードは必要に応じてIPsecを有効にできます。
</details>

### 問題5 [アドレス]
グローバルユニキャストアドレスの先頭ビット001で始まるアドレス範囲は何ですか?

A. 2000::/3
B. fe80::/10
C. ff00::/8
D. ::1/128

<details>
<summary>解説</summary>
正解は A. `2000::/3`
2000::/3で始まるアドレス範囲は、グローバルユニキャストアドレスを表します。これらのアドレスはインターネット上でグローバルにルーティング可能なアドレスです。
</details>

### 問題6 [アドレス種別]
次のアドレス ff02::1 は何を意味しますか?

A. すべてのノードへのマルチキャストアドレス
B. すべてのルーターへのマルチキャストアドレス
C. リンクローカルアドレス
D. グローバルユニキャストアドレス

<details>
<summary>解説</summary>
正解は A. すべてのノードへのマルチキャストアドレス
ff02::1は、同一リンク上のすべてのノード（ホストとルーター）に送信されるマルチキャストアドレスです。これは、ネットワーク上のすべてのデバイスが受信するアドレスとして使用されます。
</details>

### 問題7 [セキュリティ]
IPv6のプライバシー拡張アドレスの主な目的は何ですか?

A. 帯域幅の節約
B. 通信の暗号化
C. トラッキングからの保護
D. パケット処理の高速化

<details>
<summary>解説</summary>
正解は C. トラッキングからの保護
プライバシー拡張アドレスは、デバイスのグローバルに一意の識別子を防ぎ、長期にわたるトラッキングから保護するために設計されています。これらのアドレスは定期的に変更され、デバイスのプライバシーを向上させます。
</details>

### 問題8 [アドレス範囲]
次のどのIPv6アドレス範囲がユニークローカルアドレス（ULA）を表しますか?

A. 2000::/3
B. fe80::/10
C. fc00::/7
D. ff00::/8

<details>
<summary>解説</summary>
正解は C. `fc00::/7`
ユニークローカルアドレス（ULA）は、fc00::/7からfdff:ffff:ffff:ffff:ffff:ffff:ffff:ffffの範囲で定義されています。これらのアドレスは、プライベートネットワーク内でのみ使用され、インターネットでルーティングされません。
</details>

### 問題9 [拡張ヘッダ]
IPv6の拡張ヘッダで、パケットの分割を管理するものは何ですか?

A. 経路制御ヘッダ
B. フラグメント拡張ヘッダ
C. 宛先オプションヘッダ
D. Authentication Header

<details>
<summary>解説</summary>
正解は B. フラグメント拡張ヘッダ
フラグメント拡張ヘッダは、大きなパケットを小さなフラグメントに分割し、異なる最大転送単位（MTU）を持つネットワーク間でパケットを転送できるようにします。IPv6では、ルーターはパケットの分割を行わず、送信元ホストがフラグメンテーションを行います。
</details>

### 問題10 [設定]
DHCPv6の主な動作モードはどれですか?

A. ステートフル
B. ステートレス
C. ハイブリッド
D. その他

<details>
<summary>解説</summary>
正解は C. ハイブリッド
DHCPv6には主に2つの動作モードがあります：

ステートフルモード：IPアドレスとその他のネットワーク設定を完全に提供
ステートレスモード：追加設定のみを提供

ハイブリッドモードでは、これらの機能を組み合わせて柔軟な設定が可能になります。これにより、ステートレスアドレス自動設定（SLAAC）と組み合わせて、より効果的なアドレス管理が実現できます。
</details>
IPv6基礎検定向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`IPv6基礎検定に出てきそうな問題を作ってください。`


### 問題1 (IPv6のアドレスタイプ)
次のうち、IPv6のアドレスタイプに該当しないものはどれですか？

A) ユニキャストアドレス
B) マルチキャストアドレス
C) エニキャストアドレス
D) ブロードキャストアドレス

<details> <summary>解説</summary> 正解: D) ブロードキャストアドレス

IPv6ではブロードキャストアドレスは使用されず、ユニキャスト、マルチキャスト、エニキャストアドレスが使用されます。ブロードキャストの機能はマルチキャストアドレスで代替されています。 </details>

### 問題2 (ヘッダー形式)
IPv6ヘッダーには、どれだけの固定長のフィールドがありますか？

A) 8
B) 12
C) 16
D) 24

<details> <summary>解説</summary> 正解: A) 8

IPv6の基本ヘッダーは8つの固定フィールドから成り、その長さは常に40バイトです。固定フィールドには、バージョン、トラフィッククラス、フローラベル、ペイロード長、次ヘッダー、ホップリミット、送信元アドレス、受信先アドレスが含まれます。 </details>

### 問題3 (トラフィッククラス)
IPv6ヘッダーのトラフィッククラスフィールドは、どのプロトコルのQoS（Quality of Service）に対応しますか？

A) TCP
B) UDP
C) DSCP
D) ARP

<details> <summary>解説</summary> 正解: C) DSCP (Differentiated Services Code Point)

IPv6のトラフィッククラスフィールドは、QoS（Quality of Service）をサポートするために使用され、DSCPなどのプロトコルに対応します。 </details>

### 問題4 (ホップリミット)
IPv6のホップリミットフィールドは、IPv4の何に相当しますか？

A) TTL
B) TOS
C) フラグメンテーション
D) ソースルート

<details> <summary>解説</summary> 正解: A) TTL (Time to Live)

IPv6のホップリミットフィールドは、IPv4のTTL (Time to Live) フィールドと同じ役割を果たし、パケットがネットワーク内で何ホップできるかを制限します。 </details>

### 問題5 (フローラベル)
IPv6のフローラベルフィールドの役割は何ですか？

A) パケットの優先順位を決定する
B) パケットのフラグメンテーションを管理する
C) 特定の通信フローを識別する
D) 送信元アドレスと受信先アドレスを保存する

<details> <summary>解説</summary> 正解: C) 特定の通信フローを識別する

IPv6のフローラベルフィールドは、特定の通信フローを識別し、QoS（Quality of Service）を適用するために使用されます。 </details>

### 問題6 (次ヘッダー)
IPv6ヘッダーの次ヘッダーフィールドは、どのような役割を持ちますか？

A) トラフィックの優先順位を決定する
B) フローラベルを管理する
C) 次に処理すべき拡張ヘッダーや上位層プロトコルを指示する
D) 受信先アドレスを保存する

<details> <summary>解説</summary> 正解: C) 次に処理すべき拡張ヘッダーや上位層プロトコルを指示する

IPv6の次ヘッダーフィールドは、基本ヘッダーに続く拡張ヘッダーや上位層プロトコルを指示する役割を持ちます。 </details>

### 問題7 (アドレスの縮小表記)
IPv6アドレスの縮小表記に関して、次のアドレス"2001:0db8:0000:0000:0000:ff00:0042:8329"の正しい縮小表記はどれですか？

A) 2001:0db8::ff00:42:8329
B) 2001:db8::ff00:42:8329
C) 2001:0db8:0:0:0:ff00:42:8329
D) 全て正しい

<details> <summary>解説</summary> 正解: D) 全て正しい

IPv6アドレスは、連続するゼロセグメントを省略記号 "::" で置き換えることができ、複数の省略方法が存在します。したがって、A) B) C) の全てが正しい縮小表記です。 </details>

### 問題8 (デュプレックスモード)
IPv6ネットワークで、フルデュプレックスモードの利点は何ですか？

A) 同時に送信と受信ができる
B) 送信が優先される
C) 受信が優先される
D) 帯域幅の使用率が半分になる

<details> <summary>解説</summary> 正解: A) 同時に送信と受信ができる

フルデュプレックスモードでは、デバイスは同時にデータの送信と受信ができるため、ネットワーク効率が向上します。 </details>

### 問題9 (アドレスレンジ)
以下のうち、IPv6のグローバルユニキャストアドレスのレンジに該当しないのはどれですか？

A) 2001:db8::/32
B) 2000::/3
C) fe80::/10
D) 2400::/12

<details> <summary>解説</summary> 正解: C) fe80::/10

fe80::/10はリンクローカルアドレスのレンジであり、グローバルユニキャストアドレスには該当しません。 </details>

### 問題10 (グローバルユニキャストアドレスの範囲)
グローバルユニキャストアドレスの範囲に含まれるアドレスはどれですか？

A) 2001:0db8::/32
B) 3ffe::/16
C) fec0::/10
D) 2002::/16

<details> <summary>解説</summary> 正解: D) 2002::/16

A) 2001:0db8::/32 - これはドキュメンテーション用に予約されたアドレス空間であり、グローバルユニキャストアドレスではありません。

B) 3ffe::/16 - これは6to4トンネリングに使用される特殊なアドレス範囲であり、グローバルユニキャストアドレスではありません。 

C) fec0::/10 - これはサイトローカルアドレスの範囲で、グローバルルーティングには使用できません。

D) 2002::/16 - これは6to4トンネリングプレフィックスで、グローバルユニキャストアドレスの範囲に含まれます。

</details>
IPv6基礎検定向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`IPv6基礎検定に出てきそうな問題を作ってください。`

### 問題1 (IPv6アドレスの基本)
IPv6アドレスの長さは何ビットですか？

A) 32ビット
B) 64ビット
C) 128ビット
D) 256ビット

<details> <summary>解説</summary> 正解: C) 128ビット

IPv6アドレスは128ビットの長さを持ち、16ビット単位の8つのセグメントで表されます。IPv6は、IPv4の32ビットアドレス空間の制限を克服するために開発されました。 </details>

### 問題2 (IPv6アドレスの表記)
以下のうち、正しいIPv6アドレスの表記はどれですか？

A) 192.168.0.1
B) 2001:0db8:85a3:0000:0000:8a2e:0370:7334
C) 255.255.255.0
D) fe80::1ff:fe23:4567:890a

<details> <summary>解説</summary> 正解: B) と D)

IPv6アドレスはコロンで区切られた8つの16ビットセグメントで構成されます。B) と D) は正しい形式のIPv6アドレスです。A) と C) はIPv4アドレスの例です。 </details>

### 問題3 (リンクローカルアドレス)
リンクローカルアドレスのプレフィックスはどれですか？

A) fe80::/10
B) fc00::/7
C) 2001::/16
D) ff00::/8

<details> <summary>解説</summary> 正解: A) fe80::/10

リンクローカルアドレスは、同一リンク内でのみ有効なアドレスで、プレフィックスfe80::/10を持ちます。主に、自動設定やデバイス間の通信に使用されます。 </details>

### 問題4 (ユニークローカルアドレス)
ユニークローカルアドレスのプレフィックスはどれですか？

A) fe80::/10
B) fc00::/7
C) 2001::/16
D) ff00::/8

<details> <summary>解説</summary> 正解: B) fc00::/7

ユニークローカルアドレスは、限定された範囲内で使用されるIPv6アドレスで、プレフィックスfc00::/7を持ちます。プライベートなネットワークアドレスに相当します。 </details>

### 問題5 (マルチキャストアドレス)
IPv6のマルチキャストアドレスのプレフィックスはどれですか？

A) ff00::/8
B) fe80::/10
C) 2001::/16
D) fc00::/7

<details> <summary>解説</summary> 正解: A) ff00::/8

IPv6のマルチキャストアドレスは、プレフィックスff00::/8で始まり、特定のグループにデータを送信するために使用されます。 </details>

### 問題6 (グローバルユニキャストアドレス)
IPv6のグローバルユニキャストアドレスのプレフィックスはどれですか？

A) fe80::/10
B) fc00::/7
C) 2000::/3
D) ff00::/8

<details> <summary>解説</summary> 正解: C) 2000::/3

グローバルユニキャストアドレスは、インターネット上で一意に識別されるアドレスで、プレフィックス2000::/3を持ちます。 </details>

### 問題7 (アドレス自動設定)
Stateless Address Autoconfiguration (SLAAC)を使用してIPv6アドレスを自動設定する際に使用されるプロトコルは何ですか？

A) DNS
B) DHCPv6
C) NDP
D) ARP

<details> <summary>解説</summary> 正解: C) NDP (Neighbor Discovery Protocol)

SLAACを使用する場合、NDPがデバイスにIPv6アドレスを自動的に割り当てるために使用されます。 </details>

### 問題8 (デュアルスタック)
デュアルスタック環境では、以下のどれが正しいですか？

A) 同時にIPv4のみ使用
B) 同時にIPv6のみ使用
C) 同時にIPv4とIPv6を使用
D) IPv4とIPv6はどちらも使用しない

<details> <summary>解説</summary> 正解: C) 同時にIPv4とIPv6を使用

デュアルスタック環境では、デバイスが同時にIPv4とIPv6の両方を使用して通信することができます。 </details>

### 問題9 (IPv6のトランジション技術)
IPv6への移行を容易にするための技術はどれですか？

A) NAT44
B) NAT64
C) BGP
D) OSPF

<details> <summary>解説</summary> 正解: B) NAT64

NAT64は、IPv6のホストがIPv4のインフラストラクチャと通信できるようにするトランジション技術です。 </details>

### 問題10 (IPv6のトンネリング)
IPv6トラフィックをIPv4ネットワーク上で転送するための技術はどれですか？

A) MPLS
B) GRE
C) 6to4
D) IPSec

<details> <summary>解説</summary> 正解: C) 6to4

6to4は、IPv6トラフィックをIPv4ネットワーク上でトンネリングするために使用される技術で、IPv4インフラを活用してIPv6の展開をサポートします。 </details>
1つのgithubソースで複数のWebAppをデプロイする

表題の通りです。用途は特にないですが、Japan WestリージョンでBasic(有償)のWebAppをデプロイした後、Japan EastリージョンのFreeで同じような動作をするか確認したかったのでメモします。

### 結論：同じようにWebAppをデプロイし、同じように設定をする

以上です。試しに4つのWebAppをデプロイして1つのgithubソースを指定しましたが、問題なく動作しました(※一部問題あり。後述)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/70e4a84e-1756-a15e-3984-3cc31e2617c0.png)

### 問題点

- 4つのデプロイが走るので、一部失敗したりします
- WindowsのFree Tierは上手く動かなかったです
    - これがアプリの問題か、WindowsのFree Tierのせいなのかはわかりません
    - 試しにWindowsのBasic Tierでやってみると問題なく動きました

### 結論

同じWebAppを複数のリソースで動かしたいんや！という目的には微妙に使いづらいです。というか、その目的って謎だし、負荷対策ならロードバランサやWebAppのリソース増強などで対応すべきですね。
AtCoder Beginner Contest 157A - Duplex Printingメモ（python）

ABC157Aを解いて間違えたのでメモします。以下常体。
## 問題
[AtCoder Beginner Contest 157A - Duplex Printing](https://atcoder.jp/contests/abc157/tasks/abc157_a)
## 考察
答えは与えられた`n`を`2`割り切り上げた数。
そのために、与えられた`n`をなんらかの数字を足して`2`で割り切れる数、つまり`2`の倍数にすることを考える。
奇数を2にの倍数にするには`+1`すればよい。つまり、`2`で割った切り上げは`n+1`で求められる。また、pythonの`//`演算子は切り捨てなので偶数を`+1`して`//2`の操作をしても偶数をそのまま`//2`の操作をしたことと結果は変わらない。
## ACコード
```py
def printer(n):
    return (n+1)//2 
n=int(input())

print(printer(n))
```
Advent of code 2015 Day 16 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 16 の Part 1 と Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/16

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day16_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day16_part2.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 16 の入力を取得します

![スクリーンショット 2024-11-29 20.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/392709c4-6bb1-372d-7ad0-0c8c361d1787.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

入力を正規表現でパースします

```elixir
sue_list =
  puzzle_input
  |> String.split("\n")
  |> Enum.with_index(1)
  |> Enum.map(fn {row, index} ->
    Regex.scan(~r/[a-z]+: [0-9]+/, row)
    |> Enum.into(%{}, fn [item] ->
      Regex.named_captures(~r/(?<name>[a-z]+): (?<number>[0-9]+)/, item)
      |> then(fn %{"name" => name, "number" => number} ->
       {String.to_atom(name), String.to_integer(number)}
      end)
    end)
    |> Map.put(:index, index)
  end)
```

実行結果

```elixir
[
  %{index: 1, children: 1, vizslas: 7, cars: 8},
  %{index: 2, children: 5, akitas: 10, perfumes: 10},
  %{index: 3, pomeranians: 4, vizslas: 1, cars: 5},
  ...
]
```

問題文内の MFCSAM の出力を定義します

```elixir
mfscam =
  %{
    children: 3,
    cats: 7,
    samoyeds: 2,
    pomeranians: 3,
    akitas: 0,
    vizslas: 0,
    goldfish: 5,
    trees: 3,
    cars: 2,
    perfumes: 1
  }
```

各スーおばさんについて、 MFCSAM と同じ項目のものは全て同じ値になっているか、をチェックし、該当するスーおばさんの番号を取得します

```elixir
sue_list
|> Enum.find(fn sue ->
  sue
  |> Map.delete(:index)
  |> Enum.filter(fn {key, _} ->
    mfscam
    |> Map.keys()
    |> Enum.member?(key)
  end)
  |> Enum.all?(fn {key, value} ->
    Map.get(mfscam, key) == value
  end)
end)
|> Map.get(:index)
```

</details>

### Part 2

<details><summary>回答</summary>

項目によって値の比較条件が変わっただけです

```elixir
sue_list
|> Enum.find(fn sue ->
  sue
  |> Map.delete(:index)
  |> Enum.filter(fn {key, _} ->
    mfscam
    |> Map.keys()
    |> Enum.member?(key)
  end)
  |> Enum.all?(fn {key, value} ->
    scam_value = Map.get(mfscam, key)
    cond do
      Enum.member?([:cats, :trees], key) ->
        scam_value < value
      Enum.member?([:pomeranians, :goldfish], key) ->
        scam_value > value
      true ->
        scam_value == value
    end
  end)
end)
|> Map.get(:index)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![mfscam.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/aaa729c7-44ff-c7a1-6719-2648efeeb794.jpeg)

問題文が無駄にややこしいだけで、問題としては素直に解くだけでした
夜更かししてしまうプログラマー向けの夜更かし対策

## 夜更かしは体に毒ってばぁちゃんが言ってた
つい夜更かししてしまうプログラマーのあなたへこのコードを授けます。
```javascript:寝ろ
const ばぶ宮ちょこみん = {
    スマホ: {
        充電: () => console.log("スマホを充電中..."),
        アラーム設定: () => console.log("アラームを設定しました。"),
    },
    寝る時刻: 11,
    寝る: function () {
        this.スマホ.充電();
        this.スマホ.アラーム設定();
        console.log(`おやすみなさいᵕ  ̫ ᵕ`);
    },
    夜更かし: function (夜更かし時間) {
        this.寝る時刻 += 夜更かし時間;
        console.log(`寝る時刻を${this.寝る時刻}時に変更しました。`);
    },
};
ばぶ宮ちょこみん.夜更かし(2); // 寝る時刻を13時に変更しました。

function 夜更かし禁止令() {
    console.log("★夜更かし禁止！");
    Object.defineProperty(ばぶ宮ちょこみん, "夜更かし", {
        value: function () {
            console.warn("夜更かし禁止って言ったよね！？");
            this.寝る();
        },
    });
}
夜更かし禁止令();

ばぶ宮ちょこみん.夜更かし(2); // 夜更かし禁止って言ったよね！？
```
### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863474/9f549a58-ca88-6da6-ca08-867fcbeafad4.png)
クロスアカウントで DynamoDB の既存テーブルにサクッと import する

# いきなり結論

以下の CLI ツールで既存テーブルに対してもサクッと import 出来ました！

https://github.com/awslabs/dynein

### インストール

[awslabs/dynein - Installation](https://github.com/awslabs/dynein?tab=readme-ov-file#installation)


### エクスポート
[dy-export](https://github.com/awslabs/dynein?tab=readme-ov-file#dy-export)

コピー元アカウントにて
```
dy export -t TestTable -o test-table-data.json
```
ローカルにファイルが出力されます。

### インポート
[dy-import](https://github.com/awslabs/dynein?tab=readme-ov-file#dy-import)

コピー先アカウントにて
```
dy import -t TestTable -i test-table-data.json
```


# 経緯など

クロスアカウントで DynamoDB テーブルをデータ移行(エクスポート/インポート)する機会があり、割と簡単に出来たので備忘のため記事に残しておきます。

まず、手段の選択肢の１つとして以下を検討しました。

https://aws.amazon.com/jp/blogs/news/amazon-dynamodb-can-now-import-amazon-s3-data-into-a-new-table-jp/

しかし、タイトルにもあるとおりこれは「新規テーブル」のみ有効でありこれはパスしました。

次にこちらも検討しましたが、

https://aws.amazon.com/jp/blogs/news/implementing-bulk-csv-ingestion-to-amazon-dynamodb/

import 対象 CSV ファイルの要件が面倒そうなので一旦置いておくことにしました。

他を探していたところ、上記のツールにたどり着いたと言うわけです。

# おわりに

他の手段が今回のユースケースにはなかなか適合しないなか、dynein を使えばいとも簡単にサクッと出来て感謝ですmm
仮想化ソフトの活用：VirtualBoxを使った仮想化技術で、無料ツールから始める手軽な環境構築

## はじめに
VirtualBoxは、Oracleが開発した無料の仮想化ソフトウェアで、1台の物理マシン上で複数のオペレーティングシステムを動作させることができます。

:::note warn
**WindowsやLinuxをはじめ、幅広いプラットフォームに対応しており、仮想マシンを作成することで多様なOS環境を簡単に構築できます。**
:::

この記事では、VirtualBoxの基本機能や使い方、導入のメリットについて解説します。

## VirtualBoxの主な特徴

現在、私の自宅環境では以下のようにLinux、Windows Server2022、Windows 10の3つのOSをVirtualBox上で動作させています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5b0b9e4d-03f2-eb73-b297-b2618b47d33e.png)

なお、自宅環境の詳細については過去の記事で図解付きでまとめています。興味のある方はぜひご覧ください。

https://qiita.com/free-honda/items/bdce257a3407e1bb43b5

### 多くのOSをサポート
VirtualBoxは、WindowsやLinuxだけでなく、BSD系OSや古いOSも仮想化できるため、幅広いニーズに応えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c3fb48cd-4056-bb28-5cfb-b7209cb11a37.png)

### 無料で利用可能
オープンソースライセンスで提供されているため、個人・企業を問わず無料で利用できます。

### スナップショット機能
仮想マシンの現在の状態を保存し、簡単にその時点に戻すことができます。これにより、システム変更やテスト時のリスクを大幅に軽減できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9e067e09-4b40-de6e-b4ef-69610ea94a1d.png)

### 柔軟なネットワーク設定
ブリッジ接続やNAT、ホストオンリーアダプタなど、多様なネットワーク構成を柔軟に設定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/682b840a-6d4a-5ed6-07f8-652cb9546443.png)

### クロスプラットフォームの互換性
仮想マシンのイメージを他のホストOSに移行することができるため、異なる環境間でもスムーズな作業が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1ddec7a7-5e25-fdb7-64ee-eb39f8b2d1e3.png)

## VirtualBoxを活用するメリット
### コスト削減
実際のハードウェアを購入する必要がなく、仮想環境でテストや開発を行えるため、経費を大幅に抑えることができます。

### 安全性の向上
実験的な操作やウイルス検証などをホストOSから隔離された環境で実施できるため、リスクを最小限に抑えることが可能です。

### 時間の節約
環境構築が迅速に行えるため、テストや検証にかかる時間を大幅に短縮できます。

## VirtualBoxのインストールと基本設定
### ダウンロードとインストール
VirtualBoxの公式サイト（VirtualBox公式サイト）からインストーラをダウンロードし、ガイドに従ってインストールします。

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

### 仮想マシンの作成

VirtualBoxを起動し、「新規」ボタンをクリックし、仮想マシンの名前やOSタイプを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/97c022a1-b431-c2d9-b047-a0f08924827a.png)

メモリサイズと仮想ディスクの容量を設定では、必要なリソースを指定し、仮想環境の基礎を整えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/42d97165-928c-905c-7bd3-68e773fc0d61.png)

### ゲストOSのインストール
作成した仮想マシンを起動し、インストール用のISOファイルを指定してゲストOSをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a2dfdbdc-3307-5375-d0f3-09d8b7b898fd.png)

私の場合、以下のサイトから「AlmaLinux OS」のISOファイルをダウンロードして使用しています。

https://almalinux.org/ja/

AlmaLinuxを採用した理由については、以下の記事に詳しくまとめています。興味のある方はぜひご覧ください。

https://qiita.com/free-honda/items/835300a0a18b206352cc

## まとめ
VirtualBoxは多機能でありながら無料で利用できる、非常に優れた仮想化ソフトウェアです。

:::note warn
**テスト環境の構築や学習、開発など幅広く活用でき、ITエンジニアや学生にとって欠かせないツールです。**
:::

この機会に、VirtualBoxを活用して仮想環境を構築し、効率的で安全な作業環境を整え、思い切ってたくさん挑戦し、失敗を糧に学ぶことをおすすめします！

## 参考記事

https://www.kagoya.jp/howto/it-glossary/server/virtualbox/

https://linuc.org/study/column/3196/

https://www.sejuku.net/blog/72833
docker compose でPostgreSQL

## docker-compose でPostgreSQLを立ち上げ、ポート番号を変更してみる

### インストール（例）

```
dnf -y remove podman runc
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
dnf --enablerepo=docker-ce-stable -y install docker-ce
systemctl enable --now docker


wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64

chmod +x /usr/local/bin/docker-compose
```

### ディレクトリ構成（例）
```
├ db （/var/lib/postgresql/data）
└ docker-compose.yml
```

### docker-compose.yml の内容
```
services:
  postgres:
    image: postgres:15.8
    container_name: postgres
    ports:
      - 15432:5432
    restart: always
    environment:
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./db:/var/lib/postgresql/data
```
image： 15.8のバージョンを指定
ports： 15432は外側のポート番号。ここにクライアント側から接続する
volumes： 右側のディレクトリが、実体のどこになるかという風に記載する
　./db:/var/lib/postgresql/data　：PostgreSQLのデータが入る場所

### 起動
```
docker-compose up -d postgres
```

### 接続例
```
psql -U postgres -h 127.0.0.1 --port 15432
```
注：-h localhostだとうまくつながりません。（ネットワーク経由にならない模様）

### 停止
```
docker-compose down
```
仕事を辞めてFlutter大学に入った話

### 入社5年目の会社を辞めた
　2020年のコロナが始まる頃に大学を卒業して東京から地元の電機機器メーカーに設計・開発エンジニアとして就職しました。業務はメインの電機設計をしながら基幹システムのデータ移行に携わりExcel、VBA、PowerAutomate、Pythonと順に業務の合間を見つけてChatGPTを活用しながら勉強し業務の効率化にも従事してきました。そして2024の7月中旬に退職しました。
　今回は詳しい経緯を割愛しますが気になる方は以下のリンクで読んでみてください。
https://note.com/lehm_lab/n/n0d610ac93344

### Flutter大学に入る（7月末）
　仕事を辞めて以前から作りたかったアプリの開発に取り組もうと思い開発言語を調べていくと「iOS」と「Android」の両方を同時に開発出来る「Flutter」に辿り着きました。僕が作ろうとしていたアプリは複雑な物でも無かったのでネイティブである「Swift」や「Kotlin」で最新の機能を使用する必要が無いと判断したのもあります。そうしてYouTubeで「Flutter」について調べていると「Fluter大学」を知りました。いわゆるオンラインサロンで趣味のスノーボード系オンラインサロンに入っていたのでコミュニティの大切さは知っていたため入るのに抵抗はありませんでのでそのまま入会しました。

### 8月（1ヶ月目）
　7月30日に入会してすぐに1on1ミーティングがあり大学内の雰囲気や利用方法について分からない事を聞く機会がありました。有料制の良いところはやっぱり人が良いことで変な人がいません。
　そして大学内では個人開発しているアプリを発表する機会があり計画段階からリリース済みまでのアプリについて自分以外の人の話を聞くことが出来ます。僕はやる気が続くか心配だったので8月末の個人開発発表会に立候補して締め切り間を持って取り組む事にしました。
　その結果もあってか1つ目のアプリについてはリリース出来ていないものの知人のデータ待ちで、それが完成すればリリース出来るところまで行って発表できました。

### 9月（2ヶ月目）
　9月はFlutterから少し離れてPythonで「ボートレース自動購入ソフト」の開発を再開しました。Pythonは前職で使いっていたものの1ファイルで完結するレベルだったので、Flutterで培ったオブジェクト指向言語の書き方がこの時の開発では大いに役に立ちました。それがあったからこそ途中で止まっていたソフトのコードをリファクタリングしながらPythonでデスクトップソフトの開発を完了する事で出来ました。
　その間にもFlutter大学ではオンライン交流会や個人開発発表会があったので参加しつつアプリ開発について知見を広めてはいました。
　しかし、9月末に趣味のスノーボードで左手首を骨折して手術する事になってしまいました。

### 10月（3ヶ月目）
　10月は手首を骨折して最初はギプスで様子を見ていたものの経過が悪く、手術をする事になりそのまま入院したりと勉強している所ではなくなってしまいました。キーボードを触ろうにも左手に痺れが残っていて長時間触ると痛くなるのでUdemyで動画学習したり大人しく寝て、食べてで回復を待ちました。
　その間もオンライン交流会や個人開発発表会は怪我をしていても参加出来るので参加して交流を深めました。そして後半からは質問ZOOMの切り抜きを手伝って大学内コインを貯めてコードレビュー＆相談プランに応募出来る様に活動しています。

### 11月（4ヶ月目）
　11月に入り手首も良くなってきたので徐々にリハビリもかねてアプリのリファクタリングや本で体系的に学習していると、とりあえずChatGPTで書いたところや雰囲気で書いたところの問題点が見つかって復習していました。
　そんなこんなで次のアプリが思いつかないまま11月も後半になったところで自己完結できる2つ目のアプリをスノーボード関係で思いつきました。2つ目ともなると画面が少ないのもあり2週間ほどで形にすることが出来たので今回はリリースまで行きたいと思います。

### 今後の目標
　今後の目標としてはFlutterに限りはしませんがプログラマーとして継続的に仕事がもらえるレベルまで能力を上げて行きたいと思います。定期的にFlutter大学内で求人はあったりしますが「実務経験〇〇年」という条件があるため初心者には厳しい世界と思いつつ、仕事を辞めた時に目標として冬にスノーボードをするためにワーケーションをしながらの生活が出来る様になりたいです。

### さいごに
　Flutter大学に入ってからの体験談について書きましたが普通に入って良かったです。地方に住んでいると「Flutter Ninja」や「Flutter Kaigi」などのイベントやオフ会が東京で行われるので参加出来ないのが残念ですが、出来る範囲で活動は続けて行こうと思います。
install JupyterHub on Ubuntu22.04

# TL;DR

* Littlest JupyterHub (Local Network Only)
* use Ubuntu 22.04 (vagrant)

# setup ubuntu

https://portal.cloud.hashicorp.com/vagrant/discover/bento/ubuntu-22.04

```
vagrant init bento/ubuntu-22.04 --box-version 202407.23.0
```

```sh:Vagrantfile
  # config.vm.network "private_network", ip: "192.168.56.2"
```

https://qiita.com/osamu_0/items/7161ffff0a5a67ca943f#%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9Avagrantfile


# install the Littlest JupyterHub

https://tljh.jupyter.org/en/latest/install/custom-server.html

```
sudo su -
apt update
apt install python3 python3-dev git curl
```


```
curl -L https://tljh.jupyter.org/bootstrap.py | python3 - --admin <admin-user-name>
```

# login

http://192.168.56.2

Username:`<admin-user-name>`に入力したユーザ名
Password:今決める
AWS SAAにCloudTechを使ってギリギリ合格した勉強法と反省

## 使用教材
 - CloudTech 53H3
 - SAA黒本 9H50
 - 分類不明SAA対策 3H34
 - pingt 2H56

## 勉強方法
CloudTech中心。230問を２周解いて解説読んだ後はひたすらランダム問題で演習。  
黒本は電車でぼーっと読んでただけ。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/174db44a-e10d-b476-08d3-6d6c1a5a102d.png)

## 反省
Cloudtechは本番とそっくりな問題がたくさん出るというネットの体験談をいくつか見て、鵜呑みにした結果本番は１段階要件が深い問題ばかり出た。  
CloudTechと同じだから脊髄反射で答えれる問題は２・３問程度だった。  
もう一回受けるとしたら100時間学習して、CloudTech以外の教材も組み合わせると思う。
【BizRobo!】DAで文字の入力が出来ない時の対処方法

# はじめに
みなさん。初めまして。
普段はBizRobo!を用いてお仕事をしています。

今回はBizRobo!のDAで文字を入力した際に、入力出来ない事象の解決方法を
ご紹介したいと思います。

# 事象とは？
BizRobo!で文字入力をする際に、ごく稀に文字入力出来ないことが起こります。
それはとあるステップを使うと起こります。
DAステップ限定で使用できる<strong>フィールドにテキストを入力</strong>です。
私はよくSAPなどで経験した覚えがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/21b14b04-2a19-c034-0348-3639a4449d10.png)

# 解決方法
まずやり方を変えましょう！
たしかに人が行う時は、入力したい箇所をクリックして、その後に文字を入力します。
が、今回はそれを行わない別のやり方です。

<strong><font color="red">クリップボードを経由して文字入力を行う</font></strong>

このやり方でやってみてはいかがでしょうか。

では、やり方をご説明します。

# 処理の解説
<dl>
<dt>①「Set Clipboard」ステップを設定する</dt>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/a794b9bd-247c-4710-5bce-4627a347f8a1.png)

<dl>
<dt>②入力したい文字をComponentに設定する</dt>
<dd>設定する文字は変数でも手入力でも何でもOKです！</dd>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/41e0a0ee-3f50-3ad6-5c92-3f338750eae2.png)

<dl>
<dt>③フィールドでキープレスから「フィールドに貼り付け」を選択</dt>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/aa1cade5-25a8-2099-557a-0ac2c193dd0e.png)

<dl>
<dt>④入力する箇所をクリックする</dt>
</dl>

以上で設定は終了ですので、後は実行するだけです。

:::note info
set clipboardと貼り付けの間に「Guarded Choice」で少し（0.5秒）ほど
待機を挟むのをオススメします！
ロボットの処理が早くクリップボードに貼り付けが出来ていない事象を抑えるためです。
:::

:::note warn
クリックを先に行っても全く問題ございません。
私が書いているのはあくまで一例です。
:::

# さいごに
ぜひ参考にしていただければ幸いです。
【Laravel Blade × TailwindCSS × VScode】保存時のフォーマットを有効化しclassの順序を揃える

## はじめに
LaravelのBladeテンプレートにTailwindCSSを導入する機会があり、フォーマッターを導入しようとしたところ少し設定が必要だったので、備忘録として記事にしました！
フォーマッターはPrettierを使用し、TailwindCSS導入済みを前提に進めます。

## 使用したもの
・Laravel 11 Bladeテンプレート
・TailwindCSS
・Prettier
・Node.js
・VScode

## Prettier導入でできること
・classの順序を揃えてくれる！見やすい！楽！最高！
　→存在しないclassを指摘してはくれないけど、先頭に持ってきてくれるのでミスを見つけやすい！
・classが重複していた場合、解消してくれる！さすが！

## なぜ追加の設定が必要なのか
PrettierのTailwindCSSフォーマットは、デフォルトではBladeテンプレートに対応していないため。

## ざっくり設定方法まとめ
1. VScodeの拡張機能「Prettier」をインストール
1. Nodeで「Tailwind用Prettier」「Blade用Prettier」プラグインをインストール
1. Prettierの設定ファイルを作成
1. VScodeのフォーマット設定を変更する

## VScodeの拡張機能「Prettier」をインストール
題名そのまま、「Prettier-Code formatter」をインストールします。
Prettierと検索すると色々出てきますが、公式をインストールしてください！

## Nodeで「Tailwind用Prettier」「Blade用Prettier」プラグインをインストール
node_modulesに以下のプラグインを追加します。バージョンは導入時のものです。
・prettier-plugin-tailwindcss（0.6.8）
・prettier-plugin-blade（2.1.19）
```bash
npm install -D prettier-plugin-tailwindcss
npm install -D prettier-plugin-blade
# devに保存
```
## Prettierの設定ファイルを作成する
Prettierの設定ファイル「.prettierrc」をLaravelプロジェクト直下に作成します。
このファイルに、使用するプラグインとBladeファイルをフォーマットの対象にする旨を記載します。
```json:.prettierrc
{
    "tailwindConfig": "tailwind.config.js",
    "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-blade"],
    "overrides": [
        {
            "files": ["*.blade.php"],
            "options": {
                "parser": "blade"
            }
        }
    ]
}
```

:::note
特定のファイルやディレクトリをフォーマットの対象から外す設定も可能です！
「.prettierignore」ファイルをLaravelプロジェクト直下に作成し、その中に無視したいファイルやディレクトリを書くだけでOK！
```:例
**/.git
**/node_modules
package.json
package-lock.json
```
:::

## VScodeのフォーマット設定を変更する
VScodeのフォーマット設定をPrettier仕様に変更します。
VScodeの設定から手動で変更もできますが、おすすめはVScodeの設定ファイルを作成し設定する方法です！
複数人での開発やPCが変わったときも自動で設定してくれるので楽！
今回は、設定ファイルを作成する方法で進めます。

###### ◆VScodeの設定用のディレクトリ「.vscode」と設定ファイル「setting.json」を作成
　**<プロジェクトルート>/.vscode/settings.json**
 　※ディレクトリの場所は上記でないとだめなので注意！
 
:::note
VScodeの設定は「ユーザー」と「ワークスペース」の2種類あり、上記の「.vscode」ディレクトリは「ワークスペース」の設定を保存する場所です。
設定の優先度は「ワークスペース」の方が高いです。
:::

###### ◆「setting.json」の中身
```json:setting.json
{
    "prettier.confgPath": "./php/.prettierrc",
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "prettier.prettierPath": ".php/node_modules/prettier",
    "prettier.ignorePath": "./php/.prettierignore",
    "prettier.documentSelectors": [
        "**/*.blade.php"
    ],
    "[blade]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    }
}
```

◎設定内容(コードの上から順に)
・Prettier設定ファイルのパス指定
・VScodeのエディタデフォルトフォーマッターに「拡張機能のPrettier」を設定
・保存と同時にフォーマットする設定を有効化
・「プラグインのPrettier」ディレクトリのパス指定
　※インストールした２つのプラグインはこのディレクトリに入っています
・フォーマット対象外設定のファイルパス指定(作成してなければ、なしでOK)
・BladeファイルをPrettierフォーマットの対象に設定
**・Bladeファイルの設定。BladeファイルのデフォルトフォーマッターをPrettierに設定**

:::note warn
Bladeファイルの設定で、デフォルトフォーマッターをPrettierに設定しないとフォーマットが効かないので注意！！！
:::
以上で設定は完了です！！！！

## VScodeを再起動
VScodeを再起動して、Bladeファイルがフォーマットされるか確認します！
お疲れ様でした～～～！！

:::note
ちなみに下記のコマンドで、プロジェクト内のPrettierフォーマット対象ファイルを一気にフォーマットできます。
```bash
npx prettier . --write
```
:::
KinoLink で Livebook に OGP 対応のリッチなリンクを表示する

## はじめに

Qiita で記事に `https://piyopiyoex.connpass.com/` と URL を書き込むと、以下のように画像入りのリッチなリンクになってくれます

https://piyopiyoex.connpass.com/

このようなリンチなリンクを Livebook に表示するため、 KinoLink を作りました

https://github.com/RyoWakabayashi/kino_link

ノートブックでの利用例はこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/kino/kino_link.livemd

## OGP とは

画像入りのリンクには OGP (Open Graph Protocol) という規約が利用されています

https://ogp.me/

Web サイトに以下のように `meta` タグを入れておくことで、 SNS 等にリンクを表示するための情報を提示します

```html
<html prefix="og: https://ogp.me/ns#">
<head>
<title>The Rock (1996)</title>
<meta property="og:title" content="The Rock" />
<meta property="og:type" content="video.movie" />
<meta property="og:url" content="https://www.imdb.com/title/tt0117500/" />
<meta property="og:image" content="https://ia.media-imdb.com/images/rock.jpg" />
...
</head>
...
</html>
```

## セットアップ

ノートブックのセットアップセルで KinoLink をインストールします

```elixir
Mix.install([
  {:kino_link, "~> 0.1"}
])
```

## リンクの表示

`KinoLink.new` に URL を渡すことでリッチなリンクを生成します

```elixir
KinoLink.new("https://piyopiyoex.connpass.com/")
```

![スクリーンショット 2024-11-29 20.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/837b913e-1368-569b-af1c-3b6f3f8130b7.png)

OGP に対応していない Web サイトの場合は `title` タグからタイトルを取得して表示します

```elixir
KinoLink.new("https://livebook.dev/")
```

![スクリーンショット 2024-11-29 20.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ba083413-a0f1-379d-0b33-bc1d8dc4f730.png)

## スマートセル

スマートセルを使えば URL を貼り付けて実行するだけでリンクを生成できます

![kino_link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b90aabc9-000e-7414-1d73-b3c289e6075b.gif)

## 仕組み

Elixir の ogp モジュールを利用しています

https://github.com/goofansu/ogp/

## まとめ

Livebook をプレゼンテーションや説明資料として使う際に活用できます

:::note info
リンクのデザインは Qiita をリスペクトしました
:::
Arduino UNO R3、フィボナッチ数列で遊ぶ(M5NanoC6との比較の為)




参考

https://ichiken-engineering.com/arduino-uno-r4-minima_k

https://botao.co.jp/topics/creative/2468/

続き

https://qiita.com/caa45040/items/59fde4177afce46ab844


x 過去ログを見よ!!
x ArduinoUNO3の互換機
x NanoC6,StampS3用にUSBシリアル対策をした。起動時のウエート
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。


目的

フィボナッチ数列の意味が分かっていないが
ベンチマークとして有名な為にいろいろ遊ぶ

最終的にM5NanoC6に単精度浮動小数点があるかないかを調べる


結果

![o_coq664.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/09a1c52a-f593-0a18-9d7b-f23532369ec7.jpeg)


![o_coq659.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c8988230-5d40-8b1b-db49-85b57cb6cffe.jpeg)





プログラム

```c++


//値が100,000を超えるまでのフィボナッチ数列を生成する作業を500,000回繰り返すのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
void loop() {
  unsigned long x;
  unsigned long prevx;
  unsigned long temp;
  unsigned long start_time, end_time;
  unsigned long time;
  start_time = millis();
  for (unsigned long a = 0; a < 500000; a++) {
    x = 1;
    prevx = 0;
    while (x < 100000) {
      temp = x;
      x = prevx + x;
      prevx = temp;
#if DEBUG
      Serial.println(x);
#endif
    }
  }
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.println(x); //最後の値の出力
  Serial.print("StartTime:");
  Serial.print(start_time);
  Serial.print(" EndTime:");
  Serial.print(end_time);
  Serial.print(" Time:");
  Serial.println(time);
  delay(1000);  //1秒待機
}


```
オフショア開発チームとオフラインで「露天風呂」のふりかえりを実践した。

こんにちは。KDDIアジャイル開発センターのtakateinです。アドカレ6日目ですね！

先日、オフショア開発先のベトナムにある企業さんへ訪問する機会を頂いたので、チームビルディングをしてきました。

スクラムマスターとして「露天風呂」の振り返りを実践したのでこの記事に書いていこうと思います。

※ちなみに去年は「熱気球」の振り返りをしてました。
https://qiita.com/takatein/items/e1b9bdb69e061a6da875

# "オフショア" とは？
そもそもオフショアって何？ってなる方もいると思うので説明しておきます。

オフショア ＝ off shore = 離れた 岸 
ってことで、"**海外のシステム開発ができる企業**"をパートナーとして、開発を委託することを指します。
日本のIT業界は人材不足と言われてますし、委託されている企業さんは日本でも多い印象です。

図にすると以下のような感じです。
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553613/d0e80c13-005f-6023-2f93-ec95d8be2920.png)

母国語は通じないのですが、プログラミング言語を通じてやりとりが出来るのが凄いですね。

# 露天風呂(ふりかえり)

FIY：
https://miro.com/app/board/uXjVMU1q3PY=/?moveToWidget=3458764577147418655&cot=10

とりあえず、見た目はこんな感じになります。
![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553613/5b49b052-b66c-c650-10b2-bd91a52dc721.jpeg)

採用した理由は2つあって、、、
1. **「良い意見」の付箋を貼りさらにもっと良い意見が出ること**
→Yes,and の形式なのでチームビルディングにもってこいの手法

2. **日本文化を紹介すると盛り上がるから**
→実際に、ベトナムチームの人の大半が「露天風呂」を知りませんでした。


### この手法について
まるで、露天風呂に入ったかのように心が温まるエピソードを共有でき、
さらに未来の夢まで話すことができる。

### 手順
1. 露天風呂画像を用意する
2. お風呂のところに、最近心が温まったエピソードを書いていく
3. 絶景の部分（富士山など）に、未来に目指したいエピソードを書いていく

### 実施結果

振り返りの範囲「ここ最近のチーム内について」

#### 温泉部分に出た意見

- 「いつも急な依頼を助けてくれてThank you!!!」
- 「日本メンバーのみんなとプライベートでも遊びたいよ」
- 「日本のみんなとアニメや漫画や音楽の話をできたのが嬉しい！」
- 「BridgeSEには本当に感謝している。ビジネスや技術のことも知っていてすごい。」
- 「新技術の実装は楽しい！日本の企業は古い技術を使いがちな傾向なのって本当ですか？」

---- 
#### 絶景部分に出た意見

- 「BridgeSEの方が負担になっていないか心配」
- 「今、対応している実装が仕様通りに対応すると難しい。もっと技術側を優先してどうにかならないのか？」
- 「英語を理解しているが、喋るのは難しい・・・」
- 「バックエンドの開発をやっているがフロント側の開発をやって、新しい言語を学んでみたい。」

### 感想

チームみんなで温泉入りてぇ～～～～～～～～～～～～～～～～～！

## その他

去年の出張のvlog📹が以下のリンクから観れます！作曲＋撮影＋編集全部やったので楽しかったです。
今回の旅のイメージ掴みやすそうなので是非見てください！

https://youtu.be/llAlWdKAEKs
[Rust]Cargoという便利なツールを知る

## Cargoの役割

Rustでアプリケーションを開発する際、Cargoというツールを利用することがデファクトスタンダードとなっています。このツールは、Rustアプリケーションのビルドを行ったり、他のライブラリへの依存関係を管理したりします。

Cargoは`cargo`コマンドを使って利用します。公式のインストーラを使ってインストールした場合は、Cargoも同時にインストールされています。以下のコマンドでインストールされていることを確認できます。

```bash
cargo --version
```

:::note
JS/TSプロジェクトでは公式のビルドシステムというのは無く、何かしらのバンドラツール（例：Vite）を頼ることになります。
ライブラリの依存関係は公式のnpmやサードパーティーのyarn・pnpmを使うことが一般的です。
Rustにおいてはそのどちらも公式ツールとして機能提供されていることが特徴的です。
:::

## `cargo new`

Cargoを使うには、そのプロジェクトが、前提となる構造に従っている必要があります。`cargo`には、その構造通りにプロジェクトを作成するサブコマンドが用意されています。

以下のコマンドで、カレントディレクトリの配下に新しいプロジェクトディレクトリを作成できます。

```bash
# qiita-sampleの部分は任意
cargo new qiita-sample
```
コマンドを実行すると、カレントディレクトリに`qiita-sample`というディレクトリが生成され、その中に必要なファイルやディレクトリが生成されています。

`cargo new`によって生成されるのは以下のものです（厳密にはGitの初期化も行われるので`.git`や`.gitignore`も含まれますが、ここでは省略します）。

- `Cargo.toml`
- `src`ディレクトリ

### `Cargo.toml`

Cargoプロジェクトの設定ファイルです。パッケージ名やバージョン、依存関係を管理します。

:::note
Node.jsプロジェクトにおける`package.json`のようなものです。
:::

### `src`ディレクトリ

ソースコードが格納されるディレクトリです。Cargoは基本的に`src`ディレクトリ配下のソースコードをビルド対象にするので、新規にファイルを追加する場合は`src`ディレクトリ配下に作成しましょう。

`src`ディレクトリの中には`main.rs`が生成されています。Cargoでは、`src/main.rs`がエントリーポイントになります。`cargo new`直後の`src/main.rs`の中身は以下のようになっています。

```rust:src/main.rs
fn main() {
    println!("Hello, world!");
}
```

## `cargo build`と`cargo run`

プロジェクトディレクトリ（前項でいう`qiita-sample`ディレクトリ）で以下のコマンドを実行すると、プロジェクトをビルドします。

```bash
cargo build
```

このコマンドによるビルド成果物は`target/debug/qiita-sample`に生成されます。このファイルを実行すると、`src/main.rs`の`main`関数の処理を実行できます。

```bash
root@k4nd4windows:/work/rust/qiita-sample# ./target/debug/qiita-sample
Hello, world!
```

ビルドと実行を同時に行いたい場合は以下のコマンドでそれが可能です。

```bash
cargo run
```

Cargoによるコンパイルは、ソースコードに変更があったときに行われるため、すでに`cargo build`によってコンパイル済みのバイナリがあり、そのときとファイルが変わっていなければ、コンパイルのフェーズは実行されません。

:::note
`cargo build`には`--release`というオプションが存在します。このオプションを付与すると、プロダクションリリース向けに、より最適化されたバイナリを生成します（サイズが小さくなり、高速になる）。ただし、その最適化フェーズによってコンパイラ時間は増大します。
開発時により早いサイクルでビルドしたい場合は単に`cargo build`を、最終的なプロダクションリリースをするときは`cargo build --release`を実行します。
:::

### `cargo check`でコンパイラエラーだけ検証できる

`cargo build`や`cargo run`を実行したときに、例えばソースコードに誤りがあるとコンパイラエラーが出力され、そうでないときはビルドやバイナリの実行まで進みます。コンパイラエラーが存在するかどうかのみを検証する（＝検証に成功すればそこでコマンドが終了してよい）場合は`cargo check`というコマンドを使用します。

```bash
cargo check
```

:::note
`cargo check`の具体的なユースケースを考えてみましたが、例えばGit hooksを組み合わせてコミット前に実行し、コンパイルエラーが発生しないソースコードを保証する、などがあるでしょうか。
似たようなケースを過去のNode.jsプロジェクトでやっていた経験があります。
:::
WireMockをdockerで起動

https://wiremock.org/docs/standalone/docker/

あるプロジェクトでweb-apiのmockをWireMockで記述しているのがあったため、ローカルの開発環境においてこのmock定義ファイルを適当なサーバで動かしたい、となった。この場合、WireMockをdockerで起動してホストのマッピング定義ディレクトリをマウントするのが手軽そうである。

以下はwslでの例。

```sh
docker run -it --rm  \
-p 18080:8080  \
--name wiremock  \
-v /mnt/c/Users/kagami/Documents/(中略)/wiremock:/home/wiremock  \
wiremock/wiremock:3.9.2
```
トップレベルはmainというobject

# irbですでにobjectクラスになっている
>Rubyでは`クラス構文やモジュール構文に囲まれていない一番外側の部分のことをトップレベル`と言います。よって、上のコードの「ここはどこ？」の答えは`「rubyのトップレベル」`になります。irbを起動した直後にいる場所もやはりトップレベルです。トップレベルにはmainという名前のObjectクラスのインスタンスがselfとして存在します。つまり`「私は誰？」の答えは「Objectクラスのインスタンス」`になります。
```rb
irb(main):008> self
=> main
irb(main):009> exit
hyoudoumasatomo@mbp ~ % irb
irb(main):001> self
=> main
irb(main):002> self.class
=> Object
```
# ファイルで実行
```
p self
p self.class

class User
  p self
  p self.class
end
*****/user.rb (END)
```
```rb
*********@mbp ~ % ruby *******/user.rb
main
Object
User
Class
```
>トップレベルでもpメソッドやputsメソッドが問題なく呼び出せるのは、selfがObjectクラスのインスタンスであり、ObjectクラスがKarnelモジュールをincludeしているから

https://gihyo.jp/book/2017/978-4-7741-9397-7
max/msp max8 max9 入門

max8 max9の入門記事　動画です。

https://youtube.com/playlist?list=PLXmTCzMLyGqebll7Q18BOHhkl-N7jSV7R&feature=shared

https://youtube.com/playlist?list=PLXmTCzMLyGqfDY3uv7CnwHeEI2rsYtfbK&feature=shared


https://note.com/ysuie_o/m/m7602d52de55c

https://note.com/ysuie_o/m/m1f95e0c636a2
Next.js 15に関する変更点のまとめ

# Next.js 15がリリースされました。
Next.js 14がリリースされたのが昨日のような気がしますが、すでにNext.js 15がリリースされました。
今回記事ではNext.js 15では以前と比べて何が変更されているのか確認したいと思います。

```
以下の内容は'https://nextjs.org/blog/next-15'を参考し、その内容を省略したものを記載しております。
```


### Next.jsとは？
Next.jsはVercelが開発したReactのフレームワークで、SSRやCSR、API Routingなどの最適化機能などをサポートします。

- install方法は以下になります。
```
コマンドを入力した後、質問に答えるとinstallと同時に構成することができます。
npx create-next-app@latest <プロジェクト名>
    ✔ Would you like to use TypeScript? … Yes  #TypeScriptの使用有無
    ✔ Would you like to use ESLint? … Yes  # ESLintの使用有無
    ✔ Would you like to use Tailwind CSS? … Yes  # Tailwind CSSの使用有無
    ✔ Would you like your code inside a `src/` directory? … No  # src/ directory使用有無
    ✔ Would you like to use App Router? (recommended) … Yes  # App Router使用有無
    ✔ Would you like to use Turbopack for next dev? … No  # Turbopack使用有無
    ✔ Would you like to customize the import alias (@/* by default)? … No  # `@/*` 以外経路別称の使用有無
```

# 変更点
- 自動化されたUpgrade CLI
    - Next.js 15では`@next/codemod`CLIで自動的にコードベースを変更するようになりました。
ただ、細かいコードまでは変更されないので追加で確認作業が必要になります。

- 非同期リクエスト API
    - dataリクエストがいらないコンポーネントを非同期で処理し、初期ロード速度を早くする方向に変更されました。（paramsやsearchParamsなどのAPIが非同期になりました。）

- Caching Semantics
    - GETリクエストやクライアントナビゲーションの基本キャッシング設定が改造されました。
    - TanStack Queryのようなライブラリーキャッシング機能と中腹しないです。
    - force-static

- React 19へのサポート
    - React19との互換性をサポートし、React18とも一部下位互換が維持されます。

- <Form> Component
    - <form>要素を拡張した最適化コンポーネントで、提出経路をプレパッチし、提出データをクエリーストリングで保存します。

- Turbopack Dev安定化
    - next dev --turboモードが安定し、より高速な開発環境と反応速度を提供します。

- 静的ルート表示機能
    - 開発中に、ルートが事前レンダリングされているかどうかを画面の右下隅に表示します（⚡ Static route）。

-非同期処理後のコード実行API（unstable_after）
ストリーミングが完了した後、非同期的に追加の作業を処理できる新しいAPIです。
まだ安定していないため、参考程度に使用することをお勧めします。

- /instrumentation.js APIの安定化
    - サーバーライフサイクルを監視し、パフォーマンスのモニタリングやエラートラッキングを行うことができます。

- TypeScript設定サポート
    - TypeScriptを使用した設定ファイルをサポートし、自動補完や型安全性も保証されます。

- セルフホスティングの改善
    - キャッシュ制御ヘッダーへのさらなる制御と、画像最適化のパフォーマンス向上が実現しました。

- セキュリティ強化
    - サーバーアクションが公開エンドポイントとして露出するのを防ぐ機能が追加され、セキュリティが強化されました。

- 外部パッケージバンドルの最適化
    - 外部パッケージをバンドルするための設定オプションが追加されました。

- ESLint 9のサポート
    - ESLint 9をサポートし、最新のルールを反映し、互換性を維持します。

- ビルドおよび開発パフォーマンスの改善
    - 静的ページ生成の最適化と、サーバーコンポーネントのHMR（Hot Module Replacement）機能の強化が行われました。

# 最後に。。
Next.js15で変更されたのがすごくたくさんあってびっくりしました。特にReact19に合わせてupdateされたのでこれからReact19と合わせて使用することのが楽しみでございます。

引き続きよろしくお願いします。
適応型ソフトウェア開発とはなにか

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 3日目です。

## 適応型ソフトウェア開発とはなにか

適応型ソフトウェア開発とは、変化の多い環境に対応しながら価値を最大化することを目的としたソフトウェア開発手法である。計画重視よりも柔軟性を重視し、反復的な開発プロセスを採用することが特徴だ。

アジャイル開発手法の一部として扱われることが多く、ユーザーや市場のフィードバックを迅速に反映することを重視する。

主な要素として、チームの協調、変化への適応、継続的な改善が挙げられる。

## 参考にした書籍
今回取り組むにあたって、きちんと性質を理解したかったので、書籍を頼ることにした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629928/ef1f4642-d9e8-7802-ea9c-d1ee65415c27.png)

https://amzn.asia/d/3UYMhtn


## ジム・ハイスミス
どうやらジム・ハイスミス氏が考案したフレームワークであるらしく、彼はアジャイル宣言にも名をつられているレジェンドでもあった。

彼の思考が非常にフレンドリーに記述されているのだが、その内容がとてもメタファーに満ちており、私は共感の連続だった。

その結果、結構彼に心酔し、リスペクトするまでに至る。


この書籍を適切に使いながら、適応型ソフトウェア開発への理解を深めていった。
スクラムからASD開発に変えたのはなぜか

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 2日目です。

## スクラムフレームワークをやめた背景

もともと筆者はスクラムフレームワークを用いたアジャイル開発を行っているチームに属していたが、スクラムフレームワークをやめる判断を下す必要が生まれた。

そもそもスクラムフレームワークを利用していた背景には、アジャイルといえばスクラム！というある種の思考停止が混じっていたことが根本的な原因でもある。

しかし、今回はより具体的に何が通用しなくなったのかを解説していきたい。

### 通用しなくなった要素: バックログを作成できない

まずは現象として、バックログを作成できない状態に陥ったことだ。

そもそもスクラムは作るべきものに集中して取り組む必要がある。
その集中に対して優位性をもっているのがスクラムフレームワークだ。

しかし、今回筆者はこの「作るべきものに集中する」というところに行きつく、前段の部分で頓挫してしまった。

#### とん挫した理由
作るべきものが明確に決めづらい商材を取り扱うことになったことも大きい。

それはどんなものだったかというと、１つの機能というより、全体を包括的にまとめ上げる機能だ。

私たちが全体を考えずに、価値提供を進めることもできたが、どうしても全体の足並みを揃えながら進める必要がある難しい商材だった。

私たちがあゆみを進めようとすると、別のところで問題が発生したり、ほかのチームからの緊急度の高い要望が差し込まれたりと集中できる状況下になかった。

そんな中でも価値を提供しなければならないというつらさがあり、スクラムフレームワークの一番大切なバックログが様々な文脈単位で乱立することになっていった。


#### 明確な完了基準を持ちにくい
このようなあちこちから差し込まれてくるタスクが、単発で完了できるものならまだよかった。

実際に差し込まれたタスクというのは、非常に文脈的なもので、背景やコンテキストを意識しなければならないハイコンテキストなタスクが多かった。

それ１つに対して、明確な完了の定義を作ること自体もとても労力がかかってしまう。

そのため、タスクを完了させるために必要なタスクがバックログへ大量に詰め込まれた。


#### 見積もりが難しい
そんな完了の定義や見通しを立てることが困難なバックログに対して、ストーリーポイントという概念で数字を割り振り、見通しを立ててみることはやってみたが、全然あてにならない。

でもスクラムフレームワークを取り扱っているものだから、しっかりとそのプランニングには時間をかけてしまっていた。

そして、特に何の進捗もでないまま、レトロスペクティブに突入し、次の見通しもわからないままイテレーションだけは回している。

そんな状態がずっと続いていた。

### いつまでも進捗が出ない。
このいつまでも進捗が出ない状況というのは、とても苦しいものだ。

自分たちの無力感がとても辛かったり、ほかのチームが輝いてみえてくる。

そんなときに、このままではいけないとやり方を改めることにした。

これがきっかけだった。


## 適応型ソフトウェア開発
ここでフレームワークを変えてみることで、スクラムフレームワークでは見えづらくなっていた進捗を明らかにすることができるのかもしれないと考え、別のフレームワークを試してみることにした。

今回選定したのは「適応型ソフトウェア開発」である。


結論から述べるが、私たちはスクラムフレームワークから適応型ソフトウェア開発に乗り換えることで、以下の観点において救われた。

### 見通しを立てやすくなった
スクラムとは別の「状態」に対する哲学を持っているこのフレームワークを用いると、見通しが立てにくい状態でもマイルストーンを適切に置き、前に進んでいる実感を持つことができるようになった。

### 自分たちの「状態」を把握しやすくなった
自分たちが陥っている「状態」、つまり適応地形をしっかりと把握することができるようになり、認知負荷が軽減されていくことになった。

### フォーカスではなく、マルチタスクで動くことが求められる
１つに集中する形ではなく、あちこちの文脈や視点から１つの価値に向かって取り組んでいく方法が、私たちを取り巻いているカオスを乗りこなすためには有効だった。

このように、スクラムからフレームワークを乗り換えるだけでも、成果を実感できるようになることが分かった。

次の記事から本格的にASD開発について述べていく。
なぜ今古のアジャイルフレームワークを学ぶのか

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 1日目です。

## アジャイルフレームワークはたくさんある

新しい取り組みだったり、最新トレンドは数多く生まれている昨今だが、向き合うべきは常に「人」に対する課題が多い。

そんな中で数々進化していく最新を追いかけるもの素晴らしい体験だと思うが、私は人と違う方向に進んでみることを選んだ。

それは、古の考え方を現代でも使えないかを検討することである。

## 昔から人に向き合ってきた歴史がある
アジャイルの歴史もまだまだ人類史からするとまだまだ浅いものだ。
その中で生み出された古のフレームワークも根本的な課題は人に紐ついたものであり、現代の私たちと悩み事は変わらない。

そんな中で最新だけを追いかけるのはもったいないなと考えたことが発端である。
特に私がシンパシーを感じた古のフレームワークがある。

それが適応型ソフトウェア開発。Adaptive Software Developmentだ。

## なぜ気に入ったのか
適応型ソフトウェア開発の何にシンパシーを感じたのかというと、私自身が適応力を大切にしている人間だったからだ。

### 適応力の強化
世の中何が起きるかわからない。だからこそその瞬間に適応して進化していく。

漫画ブルーロックにおける潔与一の考え方に非常に共感することが多く、自分のエンジニアとしてのプレイスタイルも極めて類似している。

そして、このフレームワークを編み出した、ジム・ハイスミスという爺さんも私と同じプレイスタイルなのだと感じることが多かった。


### メタファーの活用
適応型ソフトウェア開発では、たくさんの勘違いをしながら進めることでより適応力を上げていくことができる面白い仕組みだ。

ジム・ハイスミスという爺ちゃんは、山上りとプロダクト開発を照らし合わせ、勘違いを駆使しながら学びをシンクロさせていくスタイルだった。

私もメタファーが好きだ。
漫画とんかつＤＪ揚太郎のように、なんでもかんでもこじつけて学びに変えていく癖が私も持っている。

そんな思考の癖がプラスに働く珍しいフレームワークだった。
こんな私の自然な思考がばっちりとハマる開発思考が存在するなんて思ってもみなかった。

使いこなしたい。
そう強く思ったため、この１年間適応型ソフトウェア開発に徹底的に向き合ってきた。

このアドベントカレンダーでは、その学びをできる限り言語化していきたいと考えている。
正解の「転職」を探すのではなく、「転職」を正解にする気持ちの話

この記事は、[転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしよう by 転職ドラフト Advent Calendar 2024](https://qiita.com/advent-calendar/2024/engineering-careers-2) の 10日目の記事です。

## 転職は不安だ

転職を考えるとき、すごく不安だったことを覚えている。
今の暮らしを手放して、想像の上にある新しい暮らしを始めるきっかけの行為なのだ、それはもう不安である。

筆者は、過去に３度転職を行っているが、総じて不安は付きまとっていた。

実際転職を決行した数は３回だが、頭をよぎった瞬間は多々ある。
実際に決心した機会と、そうではない機会で何が違ったのかを振り返ったとき、とても大切な気づきがあったので、その気づきについてこの記事ではまとめていく。

転職を考えている誰かに届けばいいな。


## 筆者について
私は34歳のフロントエンドエンジニアであり、チーム開発などではリーダーポジションをすることが多い。
住環境としては、地方都市から東京の企業へフルリモートで業務を進めている。

エンジニアキャリアとしては、早いもので12年目となる。
12年のエンジニアキャリアを振り返ったとき、転職が頭をちらついた瞬間は１度や２度ではない。

## 転職を考えたとき

転職を考えるきっかけはいろいろあったが、私が感じたきっかけの多くは以下の２つに分類されることが多かった。

1. 面倒だな...逃げ去りたい...と思う気持ちが湧いたとき
1. 周りの景色がちっぽけに見えてきたとき


### 面倒・逃げ去りたいと思う気持ちが湧いたとき
現状に漠然とした不満や恐怖があり、この場から逃げたい・離脱したいと考えたときに、私は転職が頭をちらついたことが多々ある。

自分の身を守るために環境から離れようとする意識が働いているのかもしれない。
この気持ちを持った時、転職先には「救い」を求めて、転職活動を始めることが多かった。


### 周りの景色がちっぽけに見えてきたとき
自分の想像を超えてこなかったり、イメージ通りに物事が進んでいく状態だったり、自分が何か挑戦的な行動をとれる機会がとても少なくなってしまったときに、私は危機感に駆られて転職が頭をちらついたことがある。

危機感の根源は、自分のエンジニアスキルが市場価値を失ってしまうのではないか？という漠然とした不安だと思う。
この危機感を持った時、転職先には「挑戦」を求めて、転職活動を始めることが多かった。


## 「救い」と「挑戦」
転職のきっかけが「救い」によるものか、それとも「挑戦」に駆られているものなのかによって、転職に対する気持ちがまるで異なっていた。


### 転職先に「救い」を求めていた時

結果論だが、私はこの気持ちで転職活動を行っているとき、須らく転職はとん挫した。
事実この「救い」をもとめた転職活動は何一つうまくいったことがない。

#### うまくいかなかった原因
大前提として、誰かに自分の環境を変えてもらいたい気持ちだったり、他人に自分の行動をゆだねていることが多かった。

その結果として、転職中の面接で自分自身の志望動機を語る必要があるが、そのエピソードがとても軽薄で、一緒に仕事をしたいと思ってもらえるものではなかったと思う。

実際にこの気持ちのまま転職をしたとしても、人や環境のせいにしてしまったりしていただろう。

一言でいうなら、私にとって正解の転職先を必死になって探してしまうのだ。
ここに行けば、私は大丈夫だ。正解なんだ。そういう気持ちで行動してしまうとあまりよくなかった。

しかし、私は３度転職をしているが、どのような時に転職できているのだろうか。
それは、挑戦を追った時だ。

### 転職先に「挑戦」を求めていた時

前述したとおり、挑戦を求めているとき、市場価値に焦りを抱えていることが多かった。

自分の市場価値を上げるために手っ取り早いことは、できることを増やすことや有効な経験を得ることが重要だ。そのような経験や技術は与えてもらうものではなく、勝ち取るものなのだと考えている。

挑戦を追っているとき、どんな挑戦をしたいのか、どんな人材に成長して市場価値を高めたいのかをしっかり考えてイメージを持っていることも多く、面接での志望動機を語る際にも熱量を込めて話すことができたりする。

救いを求めているときとは異なり、私の「技術」・「経験」・「市場価値」にとって、この転職を必ず正しかったと言ってやる。という覚悟があった。

事実、挑戦を追いかけて転職した先で今過ごしているが、正解だった。私は正しかったと胸を張って言うことができる。

転職を考えているとき、何を求めて転職をしようとしているのかを自分に問うてみることで、その活動は自分にとってどういうものなのかを知ることができそうだ。


## まとめ

転職のきっかけはいろいろあるが、何を求めているのかを知ることがとても大切である。

特に「救い」を求めているときには、その転職は必要なものなのかを少し考えてみるとよいかもしれない。

挑戦を求めているときには、その気持ちにブレーキをかけてはいけないと思う。
必ず成功に変えるんだという覚悟があるなら。

転職は簡単な決断ではない。
だからこそしっかりと自分と向き合うことが大切だ。

:::note info
正解の転職先を探すんじゃない。
自分の判断を正解に変えることが重要だ。
:::


最後まで読んでくれてありがとう。
転職を考えている人の何かのきっかけになれたらと切に願っている。