OmniAICreator/Qiita-1.07M huggingface dataset:
あの案件、どこまで進んでた？！Makeを使って、タスクの進捗を教えてくれるLINEBotを作成してみました

# どうなってましたでしょうか...:sweat:

こんにちは。製造小売業で製品開発をしているminamiです。
チームメイトたちと慌ただしくも、毎日楽しく活動をさせていただいてます。

発売日決まっちゃってるけど、まだ〇〇できてないじゃない！
「（出張先で）あの件、どうなってますか？」...どうなってたでしょうか...:sweat:

製品開発部隊は製品発売に至るまで、チームで動きます。
今回はそんなチームメンバのタスク進捗を簡単に確認しあえるようなツールができれば、と思いつくってみました:beginner:


※関連記事はこちら
https://note.com/minami00901/n/n8d593885c31c

## 目次
<ul>
  <li><a href="#tools">使用ツール</a></li>
  <li><a href="#achievements">できたこと</a></li>
  <li><a href="#next">もうちょっとやりたい</a></li>
  <li><a href="#references">参考文献</a></li>
</ul>

<h2 id="feature">使用ツール</h2>

・Make
・LINEBot
・GoogleSpreadSheet

<h2 id="feature">できたこと</h2>

LINEで商品の進捗を確認ができるように「進捗おしえてください」というLINEBotをつくりました。
タスク管理表はもともとエクセルで作成しているものがあるのですが、今回はそれをPCを開かずに、どこでも手軽に確認ができるよう、LINEBotにつなげてみました。

`※記事に紹介しているシートの内容はサンプルになります。`



・LINEに「商品名」を入力すると、「担当」「タスク」「メモ」（コメント）が返答されます。
※商品名を入力するときに、シートと同じように入力をしなければならないので、ちょっと注意が必要です。
・LINEに「メモ」を含むコメントを送ると、スプレッドシートへメモがされます:writing_hand_tone1:
⇒開発室や出張先などで上がるちょっとした要件を書き込んで、うっかりを防止します。

### シートサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048408/b6f904a4-01c0-435f-9eb9-fa577347e830.png)


### 実際に使ってみた画像です
https://x.com/minami00901/status/1915319764601495718


**Makeシナリオはこちら**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048408/e944f61b-a27f-4968-91f5-badeaa308d98.png)


こちらはLINEに「商品名」を入力すると、「担当」「タスク」「メモ」（コメント）が返答されるMakeシナリオ（モジュールとフィルターの詳細画像）です。
シートに記載されている「商品名」以外の言葉が入力されると、「対象商品がありません」と返答されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048408/d02a0467-5b2f-4f79-89ff-95e0f20b49ae.png)



こちら↓↓は下の部分、LINEに「メモ」を含むコメントを入力するとスプレッドシートにメモと日付スタンプを押し、「メモ完了！」と返答するMakeシナリオ（モジュールとフィルターの詳細画像）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048408/b255067a-ea78-4577-85ef-09d12542eaad.png)


<h2 id="feature">もうちょっとやりたい</h2>

文句を言わずにひたすら返信をくれるBotさんにお礼が言いたくなり、「ありがとう」と入力をしたところ、「対象商品がありません」と返されました:frowning2:
自分で作成しておきながら、生身のコミュニケーションも大切だな、と感じさせられます。

Make初心者:beginner:ほんとうはまだまだ沢山の機能があるのだと思います。
これから少しずつ出来ることを増やして、もっと便利にしていきたいです。

<h2 id="feature">参考文献</h2>

Aさんの暴走を止める勤怠通知とメモ機能のLINEBot

https://qiita.com/s053050g/items/ec57a6f0130a9c06c460

担当は誰？円滑に内線を繋げ！Makeを使って内線番号と勤務状況を教えてくれるLINE Botを作成！

https://qiita.com/tomona23/items/95157b7fa139f746c4d2

Qiita書き方メモ

https://qiita.com/sakekasunuts/items/c498654481e2c83497d3

スマートフォンの操作を録画！「動画キャプチャ」の方法と、困ったときの対処法【iPhone/Android別】

https://mobile.line.me/guide/article/0117.html#exStyle2
QN8065をArduinoで制御　DSP　FMラジオモジュール　

#はじめに
* DSPラジオでは久しぶりの投稿。QN8035の記事で、QN8065も投稿すると書いておきながら、放置していたので、本記事を投稿。
* 当時のノートを見ながら動作確認。一応、今回も動作は確認できました。
* 投稿内容は簡単になってます。
* 今回のCHIPは外部からクロックを供給する必要あるため、32.768kHzの水晶発振回路を利用しています。[他記事](https://qiita.com/dabodabo/items/87996b067e15a7e9b029)をご参照ください。
* 本CHIPはQN8035と似ていますので、QN8035の記事も参照願います。

#Chipについて
* QN8065はQN8035とほぼ同じです。違いは以下の2点。
    * 出力コンデンサが必要です。データシートには4.7μFと出ていますが適当な大きさで大丈夫だと思います。
    * 内部レジスタ：　QN8035では14hに書き込んでいたものを、01hに書き込めばよい。
* データシートが心許ない。Aitendoさんの商品ページにもリンクがあるのですが、内部レジスタの記載がない。どこかに詳細なデータシートはあるのでしょうか。

#使用したもの
* QN8065
* AitendoさんのDIP化基板 
* IC（QN8065)のデータシート　検索してください。
* パスコン　0.1μF　ピン2とピン6の間
* Arduino Uno互換機(ELEGOO)
* 32.768kHzの[水晶発振回路](https://qiita.com/dabodabo/items/87996b067e15a7e9b029)

#DIP化
* 適当な基盤を使ってください。パスコン（0.1μF）を空中配線しています。
* 画像は割愛。

#配線
| ピン | 機能 | ピン | 機能 |
|:-:|:-:|:-:|:-:|
| １  |アンテナ   | 8  | 音声右  |
| 2  |GND   | 7  | 音声左  |
| 3  |SCL   | 6  |VCC |
| 4  |SDA   |  5 |外部クロック  |
|   |   |   |   |
* 他のモジュールと同様にArduinoとつなぐだけ。電源は3.3Vを使っています。
* 外部クロックピンには、水晶発振回路からの出力を接続。
* 画像は割愛。

#I2C通信、Slaveアドレスについて
* Slave addressは"0X10"でした。
* I2C通信は、普通のコードで読み書きともOK。QN8035と同様に、各レジスタが1バイト。

#コード作成のポイント
* QN8035とほぼ同じなので、当該記事をご参照ください。レジスタ構成もほぼ同じと考えて良さそうです。
* QN8035で14hに書き込んでいたものを、本CHIPでは01hに書き込めばOKです。

#動作コード
* 特定の周波数を書き込むシンプルなコード。レジスタの書き込みにWhile文を使っています。

```
#include <Wire.h>

const unsigned int HW_Reg[]=
{                     
0x00,0x80, // initialize
0x00,0x01, // idle, seek0  
0x07,0x90, //80.0
0x0a,0x79, // 
//0x07,0xC2, //82.5
//0x0a,0x79, // 
0x00,0x11, // receive, seek0
0x01,0x07, //mute0,de50,vol 111
0xff,0xff,
};

void setup() {
  // put your setup code here, to run once:
Wire.begin();

int i=0;
while (HW_Reg[i] !=0xff) {
Wire.beginTransmission(0x10);          // slave address 0x10
Wire.write(HW_Reg[i]);      // Register i
Wire.write(HW_Reg[i+1]);      // data
Wire.endTransmission();     // Stop bit

i+=2;
delay(100);
}
}

void loop() {
}
```
#おまけ


* DSPチップを触るのは久しぶりでしたが、何とか動作確認もできました。ちゃんと音声が出てくるとやはりうれしいですね。
メモ取りアプリのすすめ

# はじめに
今年の抱負として，メモ取りアプリを使いこなしたい！という目標があり，その過程で数多あるメモ取りアプリの比較，そのすすめの備忘録です．
候補としてはOneNote, Notion, Obsidianの３つです．他にもあるとは思いますが

結論から申しますと，私は**Obsidian**を利用しています．ただ，万人受けするのは**OneNote**という気もします．

比較検討のため，他のメモ取りアプリをいくつかあげます．スマホアプリではなく，PC上で利用することを前提としております．

個人的なイメージは次の通りです．

・多機能比較
Obsidian > Notion > OneNote

・手っ取り早さ
OneNote > Notion > Obsidian

# 1. OneNote
OneNoteの魅力は以下の通り．

### メリット
1\. OneDriveによるクラウド上での自動保存
2\. オフライン，オンラインどちらとも使用可
3\. ほかの人との容易な共有
4\. 手書き機能
5\. 直感的な操作感

### デメリット
1\. MarkDownが標準搭載されていない
2\. オフライン環境でエラーといった問題が起こるらしい？
3\. ほかのメモ取りアプリと比べた時の機能のすくなさ

とはいえ，必要な機能は十分そろっているので私のようなMarkDownを使いたい！といった好みがないかたはよさそうです．

## 機能
多くの機能がありますが，知っておいて損はなさそうなもの示します．

### 共有
右上の共有ボタンから招待を送ることで共有できます．わかりやすい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670010/b012b7aa-a3b3-45f5-bcd0-c098714c1d45.png)

### PDF化
左上のファイルタブからpdfにエクスポートできます．

他にも多機能ですが，だいたいWordでできそうなことはできそうです．

### ショートカット
こちらもWordなどと似たものが多いですが，打合せや議事録等で個人的に使いそうなものを示します．調べたら[公式](https://support.microsoft.com/ja-jp/office/onenote-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-44b8b3f4-c274-4bcc-a089-e80fdcc87950)からショートカットキーが公開されているので一部参照しております．

https://support.microsoft.com/ja-jp/office/onenote-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-44b8b3f4-c274-4bcc-a089-e80fdcc87950

``Ctrl + v``といった一般的なものは載せておりません．

+ Ctrl + ←：左へ 1 単語分移動する
+ Ctrl + →：右へ 1 単語分移動する
+ F7：スペルをチェック（知らなかった...)

### ノートの書式
+ Ctrl + Alt + H：選択したテキストを強調表示
+ Ctrl + K：ハイパーリンクを挿入
+ Ctrl + L：現在の段落を左揃え
+ Ctrl キー + R：現在の段落を右揃え

### ページにアイテムを挿入
+ Alt + Shift + D：現在の日付を挿入
+ Alt + Shift + F：現在の日付と時刻を挿入
+ Alt + Shift + T：現在の時刻を挿入

### 書式
+ \- (ハイフン) + Space：箇条書き(-)
+ Ctrl + .(ピリオド)：箇条書き(ドット)
+ Ctrl + /(スラッシュ)：番号付きリスト

その他いろいろ，使いこなせるようになったら増やしていきたいですね

# 2. Notion
ここで比較対象としてあげましたが，個人的にうまくこなせていないのであまり説明ができません．Notionはオンライン環境前提のアプリです．私自身ノートパソコンを持ち歩くことが多く，オフライン環境で使いたいので相性がよくないというのが一番の理由です．

この状態で評価をすることは難しいので，使いこなせるようになってから改めて追記したいです．

Notionはコミュニティと繋がったり，ブログのような書き方ができるので，日記にはじめ読書記録・映画記録等で使っている方が多いイメージです．Notion APIが使えることも大きいでしょうか．
仕事でのコミュニティアプリとしても用いられていることも大きいと思います．

# 3. Obsidian
なんでもできる多機能アプリです．他の2つとは違いローカル環境で使うことを前提としたもので，圧倒的にプログラミング要素が多いのが特徴でしょうか．またもう１つの特徴でプラグインが豊富であることです．Visual Studio Codeで様々な拡張機能を探したり，試したりするのが好きな人は向いているかもしれません．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670010/7956d0fa-073b-488e-84f1-633c3fd3d437.png)
2025年7月時点では2,370プラグインがあるようです．おすすめはGit，Calender，rollover daily todosの３つ．

メリットとしては，数多く用意されているプラグインのおかげで他アプリ以上のことができること．
デメリットとしては，機能を理解するための敷居が高いことです．オンラインでのデータ同期を個人で設定する必要があるのも問題の1つです．そのため複数人との共有といった利用は向いておりません．
Obsidian Syncという有料のサービスを用いることで，同期が可能です．しかし無料で使いたい場合試行錯誤する必要があります．私はGitで管理をしております．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670010/34afb6e3-15c8-4317-90cf-4a057dd86bc2.png)
使っている様子

Obsidianは日記だけを書くことだけでも優秀だとは思いますが，読書メモ・技術メモ等による知識の蓄えに対して，分類の一元管理がほかのものより圧倒的にしやすいように感じます．プラグインによって使いこなせるというのもあります．
標準搭載されている機能だけでもかなり多いので実際に試してみることをお勧めします．

日々の記録をすぐに確認したい・今後に活用したいが，いままでのメモ取りアプリでは満足のいってない方は一度つかってみてもいいのではないでしょうか．
Arty A7で自作riscv-rv32iを動かす③　DRAMでIキャッシュDキャッシュ

# 始めに
　DRAMと接続してDキャッシュ版を公開して早くも半年、まだ納得いくところまでできていないですが、Cプログラムがそれなりに動いているので、I,Dキャッシュ双方が動作している版をmy-riscv-rv32i-dcにマージいたしました。これにより、命令とデータが同一DRAM上に搭載されて、CPUへのプログラムのアップロードがDRAMのみでの動作が可能となりました。

### 2025/5/21追記
・instruction RAM版でのいくつかのbug fixをしました。I,Dキャッシュのサイズを14ビット(arty A7 T100の場合)に設定すると、ctest/ 以下のほとんどのプログラムは動作するようになりました。しかし、I,Dキャッシュのサイズを8bitに絞ると動作しないものが出てきます。I,Dキャッシュ双方がスラッシングを起こすような条件で動作しない不具合がまだあるようです。

# レポジトリ

[https://github.com/yoshiki9636/my-riscv-rv32i-dc](https://github.com/yoshiki9636/my-riscv-rv32i-dc)

# 参考URL

[Tang PrimerまたはArty A7で自作riscv-rv32iを動かす](https://qiita.com/yoshiki9636/items/f6043556439b5df7d8ce)
[Arty A7で自作riscv-rv32iを動かす②　DRAMでDキャッシュのみ版](https://qiita.com/yoshiki9636/items/87a14f6bc71c84762c95)
[Arty A7でAXIバス簡略仕様でDDR3 SDRAMへ読み書きしてみる](https://qiita.com/yoshiki9636/items/aaf06d56749ad161fbcd) ※MIG設定の参考
[VivadoでMIG+DDR3のシミュレーションの走らせ方メモ&ModelsimでのMIGシミュレーションの走らせ方追加](https://qiita.com/yoshiki9636/items/804dd22848ad924fda85) ※MIGシミュレーション参考

# Ver 0.5の機能・制約
- 単純なダイレクトマップのIキャッシュおよびDキャッシュを実装
- キャッシュのラインサイズは16byte
- IキャッシュとDキャッシュのスヌープは未実装
　つまりプログラム実行中に命令を書き換えてもキャッシュに反映されない
- I/Oは4セットのRGB LED、12ピン
- 現在のクロック設定は200MHz/166.66667MHz/50MHz。かなり動作が遅いです・・・。
- uartモニターにzコマンド(Dキャッシュのパージ)を追加
- Uartでの表字をI/Oで実現
- interruptピンを使った外部割込み（単体）、mretの実装を追加
- illegal operations exceptionを追加
- privilegeはM-modeのみ
- fence系、ecall以外のecall系未実装
- gccのrisc-vツールチェーンでのベアメタルCの動作確認済み
※コンパイル方法はctest/cmpl.shを参考にしてください。
※ただし、newlibのlibc_nanoやlibm_nanoを用いた場合に、sprintfを用いた浮動小数点の表示がうまくいきません。ctest/内部の*_test2.cというものがそれに当たります。詳細原因究明中。
※dijkstra_test.cが動作しません。linux上では動作確認しているので、まだCPUにバグがあります・・・。

# 使い方
　特に変わっていないので、[githubページ]([https://github.com/yoshiki9636/my-riscv-rv32i-dc)のReadmeまたは、[前回のページ](https://qiita.com/yoshiki9636/items/f6043556439b5df7d8ce)を参考にしてください。

# 終わりに
　短い手抜きの記事でした。まだベアメタルCのテストで動かないものがあり、切り分けがだんだんと難しくなっています。モニタ機能を強化する必要があるのですが、一方手元のArty A7-35Tでは搭載資源を食い尽くしつつあり、T100へのアップグレードの必要性に迫られています。悩みは尽きません。あとタイマー等のインプリとかも必要になってくるので、ぼちぼちとやって行こうと思います。
ビジュアルスタジオコード(VSC)のダウンロード方法　

## VSCのダウンロード方法
<font color="#1e90ff">⒈　</font>ダウンロードページにアクセス🔍
　　https://code.visualstudio.com/Download

<font color="#1e90ff">⒉　</font>使用するOS(機器)に合わせてダウンロードボタンを押下する
　　<font color="#dcdcdc">(私はMacPCにダウンロードしたいので、Macのダウンロードボタンを押下)</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/77b6440c-37ed-40fd-af75-53fd7c6549fb.png)

<font color="#1e90ff">⒊　</font>ダウンロードが完了したら、そのフォルダを開く📂
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/3d9627f4-f562-478b-bf0b-1588566f2e22.png)

<font color="#1e90ff">⒋　</font>ダウンロードされたものを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/68fb7d55-3be4-464a-a24b-9e1a453d87d5.png)

<font color="#1e90ff">⒌　</font>Visual Studio Codeを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/047834e1-897c-4889-903a-22757f519b8c.png)

<font color="#1e90ff">⒍　</font>こんな感じの画面が表示されたらOK✨
![４VSC初期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/ec113c77-6e49-42ba-a56c-b10fd7cf2b7a.png)

## コーディングしてみる
<font color="#1e90ff">⒈　</font>ファイル> 新しいファイル　を開く
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/af4a9d50-db43-4984-a089-655d53367198.png" width=70%>

<font color="#1e90ff">⒉　</font>作成したい任意のファイル名を入力し、新しいファイル(<font color="#dcdcdc">test.html</font>)の作成を開く
<font color="#dcdcdc">ファイル名の例)　test.html</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/953b4e38-3f13-4ef9-8af0-0d64e4f52334.png)

<font color="#1e90ff">⒊　</font>ファイル名を確認し、[<font color="blue">ファイルの作成</font>]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/6cb65e86-a0cb-4c28-817b-760c6262e1e5.png)

<font color="#1e90ff">⒋　</font>新しいファイルの完成です✨
![3-4コーディング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/2c8b1a48-b644-426f-bdf4-eef0fae54513.png)

<font color="#1e90ff">⒌　</font>例えば、こんな感じで適当にコーディングして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/4bcfc8a0-5604-49e2-bd27-ffcd63e1f376.png)

<font color="#1e90ff">⒍　</font>作成したファイルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/a06b8c89-ff51-4080-aff6-939ca938b745.png)

<font color="#1e90ff">⒎　</font>このように表示の確認ができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663360/060dd9e1-cc77-4e45-99ad-6d39110f63fb.png)
　
　
　
  最後までご覧いただき、ありがとうございました♪
Bottlesで.NET Framework 4.8が動かない件

# はじめに
思いつきでLinux環境に自作Windowsアプリを使ってみようとしたら動きませんでした。
本記事ではこの解決方法を記します。

# いきさつ
どうやら[Bottles](https://usebottles.com/)というwine用の仮想環境があるようです。
`venv`のように環境ごとにパスが存在しており、一つのOS上に複数の環境を作ることができます。
せっかくなので使ってみたのですがなぜか動きません。
Linux+wine, macOS+wineでは動いたアプリだったので確実にBottlesが原因です。

# 結論
- 仮想環境作成時に存在するMonoと、手動でインストールした.NET Framework 4.8が干渉していた
    - ランナーは`sys-wine-10.0`を選ぶ
    - 仮想環境からMonoをアンインストールする
    - そして.NET Framework 4.8をインストールする
- 実はエラーメッセージはデバッガのウインドウに出ている
    - デバッグウィンドウはユーザが操作しない限り表示されない
    - いつの間にかデバッガが使えなくなってしまった（Bottlesの自動アップデートのせい？）

※Bottelsのインストール方法は紹介しません。

# 前提条件
- CPU: x86_64
- OS: Ubuntu 24.04.2 LTS Desktop
- 実行環境: Bottles 51.21

# 動かない
実際のアプリは載せられないので雑にテスト用のアプリを作りました。見ての通りの動作です。
``` csharp
using System.Windows.Forms;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageBox.Show("kuso");
        }
    }
}
```
Windowsでは当然動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/f41f1ff7-a442-47cc-80ca-97718cff3ba0.png)


Bottlesの仮想環境は下記の設定、名前以外は全部デフォルトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/f23b5b38-0c0a-4aef-bfa2-2fe9880bf050.png)

依存関係には
- cjkfonts
- .NET Framework 4.8

をインストールしておきます。ごく普通の構成です。

テストアプリ実行してみてもロードメッセージが出るだけで何も起きません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/b62f4769-d93e-4d9d-a418-05bcb2e6e9ed.png)

エラーメッセージはデバッガに出ていたのですが、いつのまにかデバッガが起動しなくなっていました。
仮想環境の違いではないため、Bottles自身が自動アップデートして動作が変わった可能性があります。

# ちゃんとしよう
動く環境を新しく作ります。ランナーを`sys-wine-10.0`に変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/4fa55e69-a8ce-4b94-b703-37e4183b9c2e.png)

システムツール類も文字化けするので`cjkfonts`だけインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/f2fe6609-3e5b-400b-89f2-26bdb0717c43.png)


「レガシーwineツール」から「アンインストーラー」を表示します。
すでにMonoの類が存在しています。
下記を削除します。
- Wine Mono Runtime
- Wine Mono Windows Support

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/37cda66a-b5db-4e8b-b906-6b8531dd2e5d.png)

`dotnet48`をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/c3f76efa-6c8c-4dac-ac84-8706a4b1709f.png)

Bottlesから実行ファイルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/b1207e22-8d67-4253-9c70-a2a8d310e1ee.png)

動いた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104731/ae0320ae-82fa-4483-9b0f-9009d23dcffe.png)


# 終わりに
wineとか使わずに普通にネイティブ環境で実行したほうがいいよ。
【Unity】投稿まとめページ

# Unity投稿まとめ

なんだかんだ言って、自分で手を動かして納得しないと理解が出来ないので整理しておきます。

## あ行
[【Unity(2021)】一定時間待ってから別の画面に遷移したい](https://qiita.com/o_chan_t/items/683c851407b40b37a173#unity2021%E4%B8%80%E5%AE%9A%E6%99%82%E9%96%93%E5%BE%85%E3%81%A3%E3%81%A6%E3%81%8B%E3%82%89%E5%88%A5%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%AB%E9%81%B7%E7%A7%BB%E3%81%97%E3%81%9F%E3%81%84)


## は行
[【Unity(2021)】ビューが開かれたときに何かしたい](https://qiita.com/o_chan_t/items/683c851407b40b37a173#unity2021%E3%83%93%E3%83%A5%E3%83%BC%E3%81%8C%E9%96%8B%E3%81%8B%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E4%BD%95%E3%81%8B%E3%81%97%E3%81%9F%E3%81%84)

## D
[【Unity(2022)】[DOTween]UIオブジェクトを滑らかに消す方法：右スライド＋アルファフェード＋縮小アニメーションの統合](https://qiita.com/o_chan_t/items/683c851407b40b37a173#unity2022dotweenui%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AB%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95%E5%8F%B3%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%95%E3%82%A7%E3%83%BC%E3%83%89%E7%B8%AE%E5%B0%8F%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%B1%E5%90%88)
<iframe width="560" height="315" src="https://www.youtube.com/embed/yzN7f3V7Zrw?si=fcc1qxnKeJvlXvAm&amp;start=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## F
[FungusにおけるSprites（スプライト）機能の使い方まとめ](https://qiita.com/o_chan_t/items/a102e667f2c33665a7cc)

## G
[【Unity(2021)】GameObjectリストを一定間隔で順番に表示する](https://qiita.com/o_chan_t/items/683c851407b40b37a173#unity2021gameobject%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E4%B8%80%E5%AE%9A%E9%96%93%E9%9A%94%E3%81%A7%E9%A0%86%E7%95%AA%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
キーコードを表示したり、式の値を16進、8進、2進、10進で表示したり、ASCII-CODE表を表示したりするターミナルアシスタント


キーコードを表示したり、式の値を16進、8進、2進、10進で表示したり、ASCII-CODE表を表示したりするターミナルアシスタントです。
^Aでアスキーコード表示、`:`で式の評価をして各進数で表示、キーのタイプでキーコードを表示します。
^Cでquitです。

```assist.py
#!/usr/bin/python3
import sys,tty
import termios

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    ch = sys.stdin.read(1)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

while True:
    print("-"*70)
    key=getch()
    if key==chr(3):
        break
    k=ord(key)
    print(f"{key} : 0x{k:02X} 0o{k:03o} 0b{k:08b} {k}" ,flush=True)
    if key==chr(1):
        for i in range(256):
            print(f"{'\''+chr(i)+'\'' if 0x20<=i<=0x7e else ('^'+chr(0x40+i)+" " if i<=0x1f else ' . ')} : 0x{i:02X} 0o{i:03o} 0b{i:08b} {i:>3d}  ",end='')
            if i%2==1:
                print("")
        print("")
    if key==':':
        print("expression: prefix 0x - hexadecimal 0o - octal 0b - binary none - decimal")
        a=input(":")
        c=eval(a)
        print(f"{c} : 0x{c:016X} 0o{c:024o}")
        print(f"0b{c:064b}")

exit(0)

```

`chmod +x assist.py`で実行権限を付け、`./assist.py`で実行して下さい。

この際作っておこう。eval()は便利ですなあ。
【Fish】PATHを管理する方法

## 追加

`fish_add_path`コマンドを使用することで、`$PATH`に新しいディレクトリを追加できます。

```fish
fish_add_path path ...
```

### オプション

- `-a` または `--append`: コンポーネントを変数の末尾に追加します
- `-p` または `--prepend`: コンポーネントを変数の先頭に追加します（デフォルト）
- `-g` または `--global`: グローバルな `fish_user_paths` を使用します
- `-U` または `--universal`: ユニバーサルな `fish_user_paths` を使用します（デフォルト）
- `-P` または `--path`: `$PATH` を直接操作します
- `-m` または `--move`: 既存のコンポーネントを追加されるべき位置に移動します
- `-v` または `--verbose`: 使用された `set` コマンドを表示します
- `-n` または `--dry-run`: 実行せずに使用される `set` コマンドを表示します
- `-h` または `--help`: このコマンドの使い方に関するヘルプを表示します

### 新しいディレクトリを`$PATH`に追加する

新しいアプリケーションをインストールした後、そのバイナリを`$PATH`に追加するには、次のようにします。

```terminal
fish_add_path /opt/mycoolthing/bin
```

### ユーザーのローカルバイナリを優先する

`~/.local/bin`を最初にチェックさせたい場合は、次のようにします。

```terminal
fish_add_path -m ~/.local/bin
```

### グローバルな`fish_user_paths`を使用する

複数のディレクトリをグローバルに追加するには、次のようにします。

```terminal
fish_add_path -g ~/.local/bin ~/.otherbin /usr/local/sbin
```

### `$PATH`の末尾に追加する

フォールバック用のディレクトリを`$PATH`の末尾に追加するには、次のようにします。

```terminal
fish_add_path -aP /opt/fallback/bin
```

### 現在の作業ディレクトリの`bin`を追加する

現在の作業ディレクトリの`bin/`を追加するには、次のようにします。

```terminal
fish_add_path -v bin/
```

### HomebrewでインストールしたRubyのパスを追加する

HomebrewでインストールしたRubyのバイナリを`$PATH`に追加するには、次のようにします。

```terminal
fish_add_path /usr/local/opt/ruby/bin
```

## 削除

### パスを確認する
以下のようにパスの一覧を確認できます。

```terminal
$ echo $fish_user_paths | tr " " "\n" | nl
     1  /usr/local
     2  /usr/sbin
     3  /usr/local/bin
     4  /home/username/.nodebrew/current/bin
     5  /home/username/.pyenv/shims
     6  /home/username/.pyenv/bin
     7  /home/username/.yarn/bin
```

### パスを削除する
`set -e`, `set --erase`を使用してパスを削除できます。
インデックスを指定して特定のパスを削除します。
インデックスは`0`からではなく`1`からです。

```terminal
set -e fish_user_paths[1]
```

複数のパスを削除する場合には指定するべきインデックスが変更されるため、`echo $fish_user_paths | tr " " "\n" | nl`で確認する必要があります。
タダで”もらったMacBook Air M2 (24GB/512GB) のお話

# 現実は小説よりも奇なり

ある日、業界の先輩――「謎の大人」からの何気ない一言がきっかけだった。

> 「もう使わんくなったMacBook Airあるから、いる？」

と送られてきたLINEに、私は思わず「そんな怪しい話あるかい！」と返したものの、数日後には玄関先に小包が届いていた。封を切るとそこにあったのは、まぎれもなくMacBook Air M2。本物の“タダ案件”に心の準備もできぬまま、私はいつの間にかApple製品の世界に引きずり込まれていた。

手元にやってきたのはスペースグレーの筐体に24GBメモリ、512GBのSSDを詰め込んだモデルだ。持ち上げた瞬間、これまで愛用してきた15インチのWindowsノートよりも軽い感触がある。

そんな中の体験記である。

## 以下本編

これまで私は、surface laptop 5 (16GB/512GB) を使用してきました。大体2年ほどです。それ以前もwindows機を使用してきました。

Surface Laptop 5での苦労を経て、ついに手にしたMacBook AirですがWindows機と比べて、一番最初に感じたのは次のようなメリットでした。

### すぐに使えるUNIX環境とHomebrewの便利さ  
MacBookでは、ターミナルを開けばすぐに`bash`や`zsh`が使えるだけでなく、Homebrewがサポートされているため、`brew install`でほぼすべての開発ツールやライブラリを一発で導入できます。Windows時代にWSLや仮想マシンの設定に四苦八苦していた時間はもう過去のものです。後輩などに教える際に、環境構築のためにWSLを導入することが多々あり、場合によっては数時間かかっていたので、この点はとても素晴らしいと思います。

### ネイティブSwift開発の快適さ  
以前はWindows上でSwiftを動かすことができず、iOSアプリ開発に取り組むことができませんでした。具体的には、ハッカソンに出たとき、Mac環境が数人しかいなかったので、途中で開発を断念し、別の言語とフレームワークにリプレイスしました。なので、自分の手元にMac環境があるのはとても楽しみなことでした。

Swiftネイティブ環境の恩恵で、今後自分のモバイルアプリ開発のフローがスムーズになり、アイデア検証のサイクルが格段に速くなることを期待しています。

### Apple製品間のシームレス連携  
iPhoneで取りかけのメモをそのままMacで編集できるHandoff、AirDropによるワイヤレスファイル転送、AirPodsの自動切り替え、さらにApple Watchでの自動ロック解除など、Appleデバイス同士の連携機能が日常の作業フローを途切れさせません。クリップボード共有や連続性カメラを使えば、iPhoneで撮影した写真をすぐにドラッグ＆ドロップで貼り付けられるなど、UI/UXの統一感が徹底されていることを実感します。

### 圧倒的なバッテリー持続力  
エディタ、ターミナル、ブラウザを使った通常の開発作業で10時間以上、Zoom会議を2時間連続で行っても残量80％を維持できるバッテリー性能は、外出先やカフェでの作業に大きな安心感をもたらします。電源アダプタを探す手間がなくなり、一日中ケーブルレスで集中できる頼もしさは、まさにモバイルワークの理想形でしょう。（これまでだいぶ酷使してきているので、Windows機は6時間程度しか持たなかったので、劇的に改善されました。）

--- 
ここまで快適さをまとめましたが、ここでややネガティブな点も述べたいと思います。

###  キー配列
windowsに慣れていたのもあって、いくつかの独自なキー配列に悩まされました。とくに、`ctrl`と`command`が特にそうです。しかし、実際には数日苦労しただけなので、使い続けていれば何も問題ないと思います。自分は特にキー配列の設定を弄ったりはしませんでした。

## まとめ

今回は憧れだったMacBook Airを無料で手に入れてしまった話でした。かなり珍しい体験をしたと自分でも感じています。このノートパソコンは単なる道具ではなく、将来を期待してもらって託されものだと思って、今後は開発のみならず学業（および研究活動）も頑張っていこうと思います。
お読みいただき、ありがとうございました。
【Java】文字列操作・整形まとめ10選

# はじめに
2年目になって配属された業務でJavaを本格的に触り始めたものです。
業務内で文字列操作をするタイミングが少し多かったのでどんなものがあるのか調べました。
本記事では調べた中でよく使いそうと思ったもの、個人的に知らなかったものを備忘録としてまとめています

##  空白・タブ・改行の除去
```java
String s = "  \t Hello \n ";
String cleaned = s.trim();  // 前後の空白除去
String noSpaces = s.replaceAll("\\s+", "");  // 全ての空白・改行除去
```

## 数字かどうかチェック
```java
String input = "1234";
boolean isNumeric = input.matches("\\d+");  // true
```

## 桁区切りの数値文字列に変換（3桁カンマ）
```java
int number = 1234567;
String formatted = String.format("%,d", number);  // "1,234,567"
```

## パディング（0埋めなど）
```java
int id = 42;
String padded = String.format("%05d", id);  // "00042"
```

## 大文字・小文字変換
```java
String s = "Java";
s.toLowerCase();  // "java"
s.toUpperCase();  // "JAVA"
```

## 文字列の一部をマスク
```java
String phone = "09012345678";
String masked = phone.replaceAll("\\d{4}$", "****");  // "0901234****"
```

##  文字列の結合
```java
String[] names = {"Tanaka", "Sato", "Suzuki"};
String joined = String.join(", ", names);  // "Tanaka, Sato, Suzuki"
```

## 区切り文字で分割
```java
String csv = "apple,banana,grape";
String[] items = csv.split(",");  // ["apple", "banana", "grape"]
```

## 正規表現を使った置換
```java
String text = "abc123xyz";
String replaced = text.replaceAll("\\d+", "***");  // "abc***xyz"
```

## HTMLエスケープ / アンエスケープ（Apache Commons）
```java
import org.apache.commons.text.StringEscapeUtils;

String html = "<div>Hello</div>";
String escaped = StringEscapeUtils.escapeHtml4(html);  // "&lt;div&gt;Hello&lt;/div&gt;"
```

## おまけ：StringBuilderで高速連結
```java
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
String result = sb.toString();  // "Hello World!"
```
※Stringだと連結するたびに新しいオブジェクトが生成される関係でコストがかかるらしい。

## 参考リンク
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html

https://www.baeldung.com/java-string-operations

https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/StringEscapeUtils.html
Hexapdfを使って、rubyでpdf をゼロから生成する (Windows)

有名な Prawn PDFだと、日本語およびWindowsの扱いが悪いので…

* https://hexapdf.gettalong.org/documentation/basics/creating-a-pdf-from-scratch.html

# はじめの一歩

まずはIPAフォントを使って日本語を表示されるように


``` hello.rb
require 'hexapdf'

doc = HexaPDF::Document.new
doc.config['font.map'] = {
  'IPA' => { none: 'ipagp.ttf' }
}

page = doc.pages.add		# A4ページが生成 (A4 は 595 x 842 ポイント)。

canvas = page.canvas
canvas.font('IPA', size: 30)
canvas.text("Hello 日本語", at: [20, 400])	# 左下が原点

doc.write("hello-world.pdf")

```

# フォントの色を変える

RGBで指定する。
> canvas.font('IPA', size: 22).fill_color(0, 128, 255) #RGB

# 長方形を配置する

テキストとグラフィックは、同じレイヤーに配置できません。レイヤーを分けましょう

* rectangle()の最後が.fill だと塗りつぶし、.strokeだと境界線を描写します。

``` box.rb

# メインレイヤーに、グレーの塗りつぶし長方形
canvas = page.canvas
canvas.fill_color(222, 222, 222).rectangle( 0,660, 300, 680 ).fill	#[開始x, 開始y, x太さ ,y太さ] 

# 上側レイヤーに文字を書く
canvas_up = page.canvas(type: :overlay)	
canvas_up.font('IPA', size: 13)
canvas_up.text("Hello 日本語", at: [20, 400])

``` 

# 複数ページPDFを、個別のPDFファイルに分割

``` split.rb
doc = HexaPDF::Document.open("input.pdf")
len = doc.pages.length

len.times do |i|
	p i
	newdoc = doc.duplicate()
	i.times do newdoc.pages.delete_at(0) end		# 自分より前ページを削除
	(len - i).times do newdoc.pages.delete_at(1) end	# 自分より後ページを削除
	
	newdoc.write("splitted_#{i}.pdf")
end

``` 

# ページサイズやフォントをいろいろ変えてみる

Composerメソッドが楽だと思う。これはタイプライタ方式で、上から下にスクロールしながら印字していく。

```ruby
# ページサイズはポイント指定
# 余白は[上下,左右]
HexaPDF::Composer.create('out.pdf', page_size: [0,0,327,560], margin:  [4,36] ) do |pdf|
	pdf.document.config['font.map'] = {
		'IPA' => { none: 'C:\Windows\Fonts\ipagp.ttf' }, 
		'Noto' => { none: 'C:\Windows\Fonts\NotoSerifJP-VF.ttf'}
		}

	pdf.style(:base, font_size: 20, text_align: :center, font:"IPA")	# デフォルトフォント
	pdf.text("Hello 日本語")

	pdf.new_page  
	pdf.text("ここは 二ページ目だよ", text_align: :right, font: "Noto", font_size: 13 )	# フォントを変えて
	pdf.text("\n")
	pdf.text("行を置いて　文字を入れたりも", text_align: :center)
    pdf.text("このページは #{pdf.document.pages.length} ページ目だよ")
end

```

* https://hexapdf.gettalong.org/documentation/api/HexaPDF/Composer.html#method-c-new

## 任意の場所に、任意のアイテムを配置する
Composerメソッドを使っている途中で、任意の場所に配置したくなった時はCanvasを呼び出す

```ruby
HexaPDF::Composer.create('out.pdf') do |pdf|
	pdf.image("background.png") 
	pdf.canvas.image("human.png" , at:[30,10] ,width: 270) 	# 左下が原点
end
```
mybatis自分用メモ

■公式ドキュメント
https://mybatis.org/mybatis-3/ja/sqlmap-xml.html

■BaseTypeHandler.java
https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/type/BaseTypeHandler.java

■DoubleTypeHandler.java
https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/type/DoubleTypeHandler.java


■nullとDouble
https://stackoverflow.com/questions/54858285/how-to-read-null-value-for-a-number-column-from-oracle-using-mybatis

■
■how-to-insert-null-manually-in-mybatis-insert-query
https://stackoverflow.com/questions/19828950/how-to-insert-null-manually-in-mybatis-insert-query

■
https://stackoverflow.com/questions/5388778/insert-default-value-when-null-is-inserted


mybatisは内部でjdbcを使っている
「右端を固定して、左端を動かす」タイプのしゃくとり法・Sliding Windowの実装テンプレート

以前、しゃくとり法・Sliding Windowの実装テンプレートに関する記事を書いたことがあります。

https://qiita.com/neko_the_shadow/items/8339caf6f04f27255fa9

この記事では「左端を固定して、右端を動かす」タイプについて書いたのですが、問題によっては「右端を固定して、左端を動かす」ほうが適切なことがあります。そこで、本記事では、後者の「右端を固定して、左端を動かす」テンプレートを紹介したいと思います。

```
int left = 0;
for (int right = 0; right < n; right++) {
  【rightを1進める (ex. sum+=a[right])】

  while (【条件を満たすか? (ex. sum<k)】) {
    【この時点で[left, right]は条件を満たす最大になっているので、処理を行う】
    【ex. ret+=n-right】
    
    【leftを1進めるための前処理 (ex. sum-=a[left])】
    left += 1;
  }
}
```

leftとrightは閉区間になっていることに注意しましょう。また、問題によっては、while句の条件判定の際、`left <= right`のチェックを行う必要がある場合があります。

__利用例 : LeetCode 2537. Count the Number of Good Subarrays__

https://leetcode.com/problems/count-the-number-of-good-subarrays

```java
import java.util.HashMap;
import java.util.Map;

public class Solution {
  public long countGood(int[] nums, int k) {
    Map<Integer, Integer> d = new HashMap<>();
    int pair = 0;
    long ret = 0;

    int n = nums.length;
    int left = 0;
    for (int right = 0; right < n; right++) {
      pair += d.getOrDefault(nums[right], 0);
      d.put(nums[right], d.getOrDefault(nums[right], 0) + 1);

      while (pair >= k) {
        ret += n - right;
        d.put(nums[left], d.get(nums[left]) - 1);
        pair -= d.get(nums[left]);
        left += 1;
      }
    }

    return ret;
  }
}
```
超簡潔に例外のベストプラクティスまとめ

# はじめに
先日、Javaの例外について基礎知識をまとめたのですが、その際に「Effective Java 第3版」よりベストプラクティスをまとめた記事を発見しました。
https://masahosono.dev/posts/effective-java-3rd-edition-chapter-10

本記事ではこのサイトで簡潔にまとまっているベストプラクティスをさらに簡潔にまとめておきます。

# ベストプラクティス
## 項目69：例外は例外的な状況でのみ使う
例外を「通常のフロー制御」に使うのはNG。

ループ処理で ArrayIndexOutOfBoundsException を使うのは典型的な悪例。

💡 ポイント： if や hasNext() などで予防できる場合は例外を使わない！
## 項目70：回復可能な状況にはチェック例外を使う
ユーザーの操作や外部環境（ファイル/ネットワーク）で回復可能なら チェック例外（例：IOException）。

バグやプログラミングミスは 実行時例外（例：NullPointerException）。

💡 判断基準： 呼び出し側がどうにかできるならチェック例外！


## 項目71：チェック例外は控えめに使う
例外が多すぎるとAPIの使い勝手が悪くなる。

対処方法が明確でないなら、実行時例外でもいい。

💡 やりがち注意： 「全部 throws Exception」は避けよう！
## 項目72：標準の例外を再利用する
IllegalArgumentException、IllegalStateException などを積極的に使う。

無意味な独自例外を量産しない。

###### 例：
```
if (value == null) {
    throw new IllegalArgumentException("value must not be null");
}
```
## 項目73：抽象化に適した例外を投げる
低レベルの例外（例：SQLException）をそのまま公開しない。

意味のある独自例外に包んで再スロー。
###### 例：
```
catch (SQLException e) {
    throw new DataAccessException("DB処理に失敗しました", e);
}
```
💡 読みやすいAPI ≒ 例外も明確
## 項目74：スローするすべての例外を文書化する
@throws タグでJavadocに明記。

例外の意味・発生条件・対処方法を記載。

💡 読みやすいAPI ≒ 例外も明確
## 項目75：例外に有益な情報を提供する
例外メッセージには「なにが」「なぜ」ダメなのかを書く。

可能なら原因のオブジェクト・値も含める。

💡 悪い例： "Error!"
💡 良い例： "無効なID: 'abc123'. 数字のみを期待していました。"
## 項目76：例外発生時にもオブジェクトの不変条件を保つ
処理の途中で例外が起きても、オブジェクトが壊れないように設計する。

コンストラクタやセッターでの注意が必要。

💡 ヒント： 状態変更は最後にまとめて行うのが安全。


## 項目77：例外を黙って握りつぶさない
catch ブロックが空 or ログだけでは危険。

原因の特定が困難になり、バグが埋もれる。

💡 最低限： ログ + 再スロー or ユーザー通知
家庭内LANがちょー調子悪くなった話

# ここ最近、自宅のネット環境が非常に悪くなりました。

例を上げると有線のPCからPingコマンドを8.8.8.8向けに打つと
3割ほどがパケットロスしたり遅延が増大して通信が不安定になると言う感じです。

自宅の環境は以下です。

auひかり(1Gbps)→ONU→HGW→TPLinkGigaHub→メインPC、サーバー機、Nintendo Switch

HGWから有線で繋いでいる別のPCも通信が不安定になっていたので
根本の原因はauひかりから貸与されているONUとHGWかと思っていました。

これら2つをauひかりに連絡して交換してもらいましたが、
HUBを噛ませると不安定のままでした。

あまりパソコンをいじれない期間が続いたのでサーバー機の電源を切って放置しました。

つまりHUBと通信している対象はメインPCのみとなりました。

この状態でPingコマンドを打つと全くのパケットロスもなく遅延も正常なもの(8ms)でした。

直ったのかと思い、サーバー機をつけると急に通信が遅くなりました。

Pingコマンドを打つと149msだの10msだの急に不安定になり、
ついにはパケットロスも再発しました。

これはさすがにHUBが悪さをしていると思うようになり、何台で通信が不安定になるか
検証を行いました。

## 検証

検証内容はメインPC、Nintendo Switch、サーバー（4台仮想化）を同時につけ、
メインPCから " Ping 8.8.8.8 -t " 、SwitchでSplatoon3、
サーバーはただつけただけにしました。

その結果は、メインPCとSwitchだけの状態では安定し、
サーバーをつけるととても不安定になりました。

## 検証結果

TPLink LS1008Gは3台以上で通信を行うと
異常な遅延とパケットロスが発生する。

これはやはり家庭用ということもありデータのやり取りに耐えられなく
なったものだと考えられます。

が、公式サイトには中小規模事務所等に向いているとあり、
さすがにこれを使うのは難しいかなという風に思いました。

Twitter上で " TPLinkはゴミ " と言ったような投稿を
たまに見かけなんの恨みがあるんだよ（）と思ったこともありましたが、
いまの私だったら大きな声で " TPLinkはゴミ！！！ " という謎の自信があります（）

## TPLinkはゴミ
やはりTPLinkは高負荷に耐えられないようです。
今後はYAMAHAのルーターを購入してこのゴミを早急に置き換えようと
決意をし、今はヤフオクでRTX1200を漁っています。

ゴミのAmazonリンクを貼っておきます。(アフェリエイトじゃないよ）
https://amzn.asia/d/b5uNTTy

Twitter→ https://x.com/yama3394
電話番号がすぐわかる！初心者が作るLINEBOT

こんにちは。プログラミングのプの字も分からない全くの素人です。
普段は経理部でパソコンと向き合っていますが、プログラミングは全く触ったことがありませんでした。

そんな私が手を出したのがLINEBOT。初心者の私でも最低限の応答をしてくれるようになったので
本記事にて紹介をします。


<ul>
<li><a href="#feature">使用ツール</a></li>
<li><a href="#how-to-use">できたこと</a></li>
<li><a href="#reviews">もうちょっとやりたいこと</a></li>
<li><a href="#reviews">感想</a></li>
</ul>
 
<h2 id="feature">使用ツール</h2>

・<strong>Googleスプレッドシート</strong>
・<strong>LINEBOT</strong>

<h2 id="feature">できたこと</h2>


店舗番号を入力すると店舗情報を返してくれるBOTを作成しました。


https://x.com/daikindayon/status/1915387612531188147

業務上店舗に電話をすることが非常に多いのですが
電話番号を毎度検索することが手間に感じていたことがきっかけで作成をしてみました。



Makeシナリオがこちら。


![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/4be8305a-5f57-4d6c-8fd2-384d4dd758ad.png)




Googleスプレッドシートを活用することで
全店舗のデータから対象店舗を抽出するシナリオが作成できました。


<h2 id="feature">もうちょっとやりたいこと</h2>


①店舗名からも抽出できるようなシナリオを作りたいです。
　スプレッドシートをAPIに変換すれば対応可能かも・・・？
 
 ②店舗の位置情報がわかるURLが表示されるようにしたい。
 　店舗住所とマップのAPIをうまいこと連携させれば可能？


<h2 id="feature">感想</h2>
時間と技術が欲しい！！
もっといろいろ試してみたい！そんな気持ちです。

デジタルの第一歩を踏み出すことができたので、あとは進むのみ！

頑張ります！
pythonでweblioスクレイピング③(google spreadsheetに出力)

:::note warn
断り
これは4年ほど前に書いた記事です。
当時は別のアカウントで公開していましたが、アカウントを移行することになったので、こちらに改めて投稿しています。
内容は学部生の頃に書いたもので、コードもだいぶ拙いところがあると思いますが、その点はご容赦ください。
:::
最終回
スクレイピング結果をgooglespreadsheetに出力できるようにする。

# 断り
この記事を書こうとした段階でGoogleCloudPlatformの無料トライアル期間が終わってしまい、細かい説明ができなくなってしまいました。参考にした動画とコードだけを載せておきます。

https://youtu.be/fFSGPciIkfI

https://youtu.be/uBy7F4Wd9cE

```python:scraping.py
import json
import getpass
import requests
from bs4 import BeautifulSoup
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import json
import pandas as pd
import re
import time
import pprint

N = 250 #取得数

#jsonファイルを使って認証情報を取得
SCOPES = ["https://spreadsheets.google.com/feeds",
          'https://www.googleapis.com/auth/spreadsheets',
          "https://www.googleapis.com/auth/drive.file",
          "https://www.googleapis.com/auth/drive"]
SERVICE_ACCOUNT_FILE = 'jsonfileのpath'
SHEET = 'スクレイピング結果を出力するgooglespreadsheetの名前'

credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_FILE,SCOPES)
gs = gspread.authorize(credentials)

SPREADSHEET_KEY = 'sheetのkey(urlの中にあるやつ)'
worksheet = gs.open_by_key(SPREADSHEET_KEY).worksheet(SHEET)


bookmark_path = '\\Users\\PCのユーザ名\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Bookmarks'

with open(bookmark_path,encoding = 'utf-8_sig') as f:
    bookmark_data = json.load(f)

bookmarks = bookmark_data['roots']['bookmark_bar']['children'][0]['children'][0:N]

def get_weblio_url(bookmark):
    if 'Weblio' in bookmark['name']:#Wは大文字
        return bookmark['url']

urls = filter(lambda url:url is not None, list(map(get_weblio_url,bookmarks)) )
pprint.pprint(urls)

for url in list(urls):
    try:
        r = requests.get(url)
        bsObj = BeautifulSoup(r.content,'lxml')
    except: 
        print("urlが無効だ")

    meaning = []
    err_url = []
    origin = bsObj.find_all("span",{"class":"content-explanation ej"})

    try:
        meanings = ','.join(str(origin).split('  ')[-1].split('<')[0].split('、')[0:3])
    except:
        err_url.append(url)
        print('失敗' + err_url[-1])
        print("htmlが無効だ")
        continue
    eng = url.split('/')[-1]
    eng = re.sub(r"[^a-zA-Z0-9]"," ",eng)

    pprint.pprint(eng + ':' + meanings)
    new_row = [0,eng,meanings]
    worksheet.append_row(new_row,table_range='A1')
    time.sleep(10)



```
pythonでweblioスクレイピング①(ブックマークからURL取得)



:::note warn
断り
これは4年ほど前に書いた記事です。
当時は別のアカウントで公開していましたが、アカウントを移行することになったので、こちらに改めて投稿しています。
内容は学部生の頃に書いたもので、コードもだいぶ拙いところがあると思いますが、その点はご容赦ください。
:::


# 動機
netflixで洋画を見たり、英語のサイトで知らない単語が出てくるたびに、調べてブックマークするけど、復習をしないのでブックマークの数だけどんどん増えていく。なんとかしたいな

# 全体像
長くなりそうなので全３回に分ける
１．ブックマークからurl取得
２．urlをもとにスクレイピング,1と2を連結
３．(おまけ)スクレイピングした情報をgooglespreadsheetに出力

# 今回
1. 単語をブックマークして、一つのフォルダにまとめる
2. 1のフォルダからurlを取得
3. 単語をスクレイピング
3. googlespreadsheetにまとめる

# [1-1]下準備
weblioをブックマークして一つのフォルダにまとめておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1637183/cd79fce6-1c13-dee7-3ece-cf7770e2cfa2.png)
このようにブックマークバーの一番初めに置いておくと楽かもしれません。
ちなみに、場所はどこでもいいのですが、後でブックマークのpathを指定するのでわかりやすい場所がいいと思います
# ブックマークのデータの格納場所 確認
この確認はしてもしなくても問題ないとは思いますが、確認したい人は以下のコマンドで確認してください

windowsの場合コマンドプロンプトから
```
C:\Users\user>cd AppData\\Local\\Google\\Chrome\\User Data\\Default
C:\Users\user\AppData\Local\Google\Chrome\User Data\Default>dir
```
とするといろいろ出てきますが、その中に
```
2022/05/27  22:08           472,473 Bookmarks
```
のようなものがあるのでブックマークのデータの格納場所が
```
'\\Users\\{username}\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Bookmarks'
```
であることが確認できます。
エクスプローラから確認する場合には、隠しファイルを表示する必要があります

また、まっくの場合は
```
/Users/{ユーザ名}/Library/Application Support/Google/Chrome/Default/Bookmarks
```
となるようです。

# コード
とりあえず全文(PCのユーザ名は変更してください)
```python:getURL.py
import json

bookmark_path = '\\Users\\PCのユーザ名\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Bookmarks'

with open(bookmark_path,encoding = 'utf-8_sig') as f:
    bookmark_data = json.load(f)

bookmarks = bookmark_data['roots']['bookmark_bar']['children'][0]['children']

def get_weblio_url(bookmark):
    if 'Weblio' in bookmark['name']:#Wは大文字
        return bookmark['url']

urls = filter(lambda url:url is not None, list(map(get_weblio_url,bookmarks)) )
print(list(urls))

```
# ブックマークからURL取得
```python:getURL.py
bookmark_path = '\\Users\\PCのユーザ名\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Bookmarks'

with open(bookmark_path,encoding = 'utf-8_sig') as f:
    bookmark_data = json.load(f)

```
jsonファイルを開いてbookmark_dataという変数に代入します。pythonではjsonファイルを辞書型で扱うことに注意してください。
print(type(bookmark_data))
として確認してみてください。
#

```python:getURL.py
bookmarks = bookmark_data['roots']['bookmark_bar']['children'][0]['children']
```
ブックマークフォルダの内容をbookmarksに代入します。(僕の場合は[1-1]で見せたweblioというフォルダ)
['bookmark_bar']['children'][0]['children'] は

['bookmark_bar'] 　・・・ ブックマークバー
['children']　　　　・・・ の中の

[0] 　　　　　　　・・・ ０番目のフォルダ
['children']　　　　・・・ の中の

のように読むと目当てのフォルダを指定しやすいと思います。
#
```python:getURL.py
def get_weblio_url(bookmark):
    if 'Weblio' in bookmark['name']:#Wは大文字
        return bookmark['url']
```
関数を定義します。
名前の中に'Weblio'という文字が入って入ればブックマーク先のURLを返すといった関数です。
こうすることで、weblio以外をブックマークしてしまった際、エラーを防げます。
#
```python:getURL.py
urls = filter(lambda url:url is not None, list(map(get_weblio_url,bookmarks)) )
```
さっき定義した関数を使ってweblioのurlのみ取得します

# 参考
https://www.lifewithpython.com/2018/06/python-check-google-chrome-bookmark-data.html
はじめてラズパイを買う前に見てほしい記事！

大好きなラズパイについてまとめてみたので、買う前に是非見て欲しいです！
随時更新したい。

# ラズパイについて知る
そもそもラズパイってなに？ってところから
ラズパイは簡単にまとめるとこんな感じです。

:::note info
Raspberry Piとは？
Raspberry Pi（ラズパイ）は、イギリスで開発された、ARMプロセッサを搭載した小型コンピューター。日本語では略称としてラズパイとも呼ばれる。
:::


## ラズパイの種類について

ラズパイの種類は大まかに分けて3つあります。

1. __Raspberry Pi 5 / 4 / 3 などの無印シリーズ__
パソコン用途向け
モニターやキーボードを繋いでちょっとしたPCの代わりに使える
性能が高いので値段も高い。(10000円くらい)

2. __Raspberry Pi Zeroシリーズ__
同じくパソコン用途にできるが全体的に性能は控えめ、値段は無印より相当安い。(3000円くらい)

3. __Raspberry Pi Picoシリーズ__
マイコン、例えると計算機のような役割になる。電子工作向け、値段は安すぎる。(2000円くらい)

個人的に初心者におすすめしたいのは Raspberry Pi Picoシリーズ
安価でそれっぽいものが作れます。

## なにを作りたいか ？

ラズパイにはいくつかの種類がありますが、
選ぶときに一番大切なのは「自分が何を作りたいか」です！

例えば防犯カメラをつくるとすると、
一番適正なのがRaspberry Pi Zero W シリーズ
超小型でWi-Fiが内蔵されていて動画撮影に向いています。

もし簡単なサーバーを立ち上げたいなら、一番安価なPicoでも十分です。

スーパーコンピューターなど処理が大きいものは無印一択です。
高性能なCPUとRAMを備えています。


## 買うならどこ ？

ラズパイを買うなら日本の正規ショップで買うのがおすすめです。
理由としては下記の3つがあります。
- 技適マークが付いている
- 日本語でわかりやすい
- すぐ届く

おすすめの正規代理店はこちら　↓↓

__秋月電子通商__

https://akizukidenshi.com/catalog/default.aspx

__スイッチサイエンス__

https://www.switch-science.com/?srsltid=AfmBOopYnL9Jqkcl606zqXA8STEGNI_nUDAsVRcJ1J8-57KnP4j0Pvow

__KSY__

https://raspberry-pi.ksyic.com/main/index


アリエクとかAmazonでも売っていますがパチモン掴まされたりするので正規の場で買うのがおすすめ。
秋葉原に店舗があります。お時間合う人ぜひいってほしいです。ちなみに私はまだ行けていません。

## 用語いろいろ
- __ピン（GPIOピン）__
Raspberry Pi に付ける（付いている）小さな金属の棒のこと。
ピンをつけると LEDを点灯／点滅させたり、液晶ディスプレイを接続して文字を表示させたり、気温／湿度センサーを接続してその値を読み込ませたり、モーターを回すこともできます。
- __はんだ（はんだ付け）__
はんだとは、金属同士をくっつけるための材料で、熱で溶かして部品とピンを繋げます。
Raspberry Pi本体にはピンがついてないモデルがあるのでそういうときは「はんだづけ」して、ピンをつける必要があります。

__初心者は「ピンヘッダ実装済み」などの表記が書かれているものを買うのがおおすめ。__
はんだ付けを楽しみたいならいいけど、余計な手間や費用がかかります。



## 〆
作りたいもの、ではなくどのラズパイを使うか、とかでも選んでもいいかもしれません。
私は名前がかわいいので断然Pico派です。

みなさんも、自分にぴったりの一台を見つけてみてください。
よきラズパイライフを〜
【小ネタ】RaspberryPiが特定のシャットダウン方法で起動しなくなる問題の忘備録

# 概要
RaspBerryPi 4B Bookwormにおいて、少なくともKioxiaのSDカードを使用している場合、高確率で発生します。

sudo shutdown now をするとOSが破損し起動しなくなります。再インストールで対処できます。

# 原因 
おそらくshutdown now の場合SDカードへの書き込みが終わる前に電源が切れるためです。
試したことはありませんが、コードを引き抜いても同じだと思われます。

# 対処法
以下の方法を使う

- sudo shutdown -h now
- systemctl poweroff
- sudo poweroff
- GUIからシャットダウン

一番おすすめなのはsystemctlを使う方法です。
AWS CDK v1 vs v2 比べてみました 🧱

## はじめに

本記事は、AWSインフラ構築のマジックツール「`CDK（Cloud Development Kit）`」の `v1` と `v2` の違い についてサクッと知りたい方に読んでもらえればと思います！

## 目次

1. [CDKってそもそも？](#-cdkってそもそも)
2. [CDK v1とv2の違いを比較](#-cdk-v1とv2の違いを比較)
3. [なぜv2が生まれたのか？背景と設計思想](#-なぜv2が生まれたのか背景と設計思想)
4. [今から始めるならどっち？](#-今から始めるならどっち)
5. [v1からv2への移行ステップ](#-v1からv2への移行ステップ)
6. [まとめ](#-まとめ)
7. [参考文献](#-参考文献)

## 🧐 CDKってそもそも？
CDK（Cloud Development Kit）は、AWSのリソースをプログラミング言語で定義できるツール。
 裏側では `CloudFormation` が動いていますが、開発者目線では **AWSのIaCを爆速で組める魔法のフレームワーク** です。

## 🆚 CDK v1とv2の違いを比較

| 比較ポイント | CDK v1 | CDK v2 |
|------------|--------|--------|
| リリース時期 | 2019年 | 2021年末 |
| パッケージ構成 | リソースごとに分割（例：@aws-cdk/aws-s3）| すべて統合（aws-cdk-lib）|
| 初期セットアップの複雑さ | 高い（依存管理が面倒）| 低い（aws-cdk-lib一発）|
| バージョニング | モジュールごとにズレることがある | 一括管理でバージョンが統一される |
| サポート状況 | 2023年以降はメンテナンスモード | アクティブ開発中 |
| 新機能の提供 | なし（v1には今後追加されない）| 新機能・アップデートはv2中心 |

📢 v2は「すべてを統合してシンプルに」した設計で、開発者のUXを爆上げしています！

## 🧬 なぜv2が生まれたのか？背景と設計思想
`v1で`は、例えばS3を使いたいだけでも下記のようなパッケージ地獄が発生していました..

`npm install @aws-cdk/core @aws-cdk/aws-s3 @aws-cdk/aws-iam` ...この構成、依存関係がバラバラになりやすく、CDKのバージョンが微妙にズレてバグの温床に…。

💡 `v2`では **「全部まとめて `aws-cdk-lib` にしようぜ！」** という英断が下され、シンプルかつ安全な開発が可能になったとのこと。

## 🔍 今から始めるならどっち？
普通に `v2` 一択です。

### ✅ v2を選ぶべき理由
* ドキュメント・サンプルコードがすでに `v2` 前提
* 最新サービスや機能は `v2` にしか追加されない
* `npm/yarn` の依存地獄からの解放
* 長期的な保守を考えると圧倒的に安心


🏷️ `v1` はもう積極的には使わないほうがよい（新規プロジェクトでの利用は非推奨）

## 🔁 v1からv2への移行ステップ
### Step 1：依存を整理
```bash
npm uninstall @aws-cdk/core @aws-cdk/aws-s3 ...
npm install aws-cdk-lib constructs
```
### Step 2：インポート文を修正
```bash:v1
import * as s3 from '@aws-cdk/aws-s3';
```

```bash:v2
import * as s3 from 'aws-cdk-lib/aws-s3';
```

### Step 3：`cdk.json` の context を見直す（v1特有の設定があれば削除）

### Step 4：`cdk synth` & `cdk deploy` で動作確認！

## 🎉 まとめ
CDKを使うなら今後はv2一択：`v2` は**未来のCDK**
v1 ⇨ v2移行も手軽にできる。

## 💫 参考文献
* [v1 AWS CDK から v2 AWS CDK への移行](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/migrating-v2.html)
composer上におけるAirflowの特徴・比較



## 🔷 Apache Airflow とは？
Apache Airflow は、定期実行・依存関係を持つ処理を管理するためのワークフローオーケストレーターです。タスクを DAG（有向非巡回グラフ）として定義し、Pythonコードで柔軟にワークフローを構築できます。

### ✅ 主な特徴
- DAG（Directed Acyclic Graph）による依存関係の可視化と管理
- Pythonベースの柔軟なタスク定義
- スケジューリング（cron相当）
- タスク失敗時のリトライやアラート通知
- Web UIによる可視化と操作
- ロギング、メトリクス、セキュリティの統合

## 🏗️ Cloud Composer とは？
Cloud Composer は、Google Cloud が提供する Apache Airflow のマネージドサービスです。Airflow のインストール・構成・スケーリング・モニタリングなどの煩雑な管理を GCP が代行してくれます。

### ✅ Cloud Composer のメリット
- Airflow 環境のセットアップ不要（すぐ使える）
- GCP サービス（BigQuery、GCS、Pub/Sub など）とシームレスに統合
- スケーラブルなインフラ構成（GKE上で稼働）
- セキュリティ（IAM、VPC、Secret Manager 連携）
- Web UIでワークフローの可視化とモニタリング

## 🔄 Airflow / Composer で実現できること
- データパイプラインの自動化（ETL/ELT）
- 機械学習パイプラインの構築（学習〜推論）
- データ転送や整形、通知などのオーケストレーション
- ストレージやDBのトリガー処理
- スケジュールに沿った定期バッチの実行

## 📂 GitHub + GCS + Composer の実践構成(実際の開発例)
1. GitHub で DAG を含むワークフローファイルを管理
2. GitHub Actions などで GCS に同期
3. Composer は GCS 上の DAG を読み込んで実行

この構成により、コード管理・自動デプロイ・CI/CD が実現できます。

## ⚠️ 注意点：Airflowは「分散処理エンジン」ではない
Airflowは**分散処理エンジン**（例えば、SparkやBigQuery）のように大量データを処理するわけではなく、**タスク単位での並列実行**を行うオーケストレーターです。

| ✘ よくある誤解 | ✔ 正しい理解 |
|----------------|--------------|
| AirflowがSparkみたいに大量データを並列に処理する | Airflowは「**処理を並列に“実行”させるスケジューラー**」 |
| Airflowが分散データ処理をする | Airflowは「**タスクを投げて指示する指揮官**」、処理そのものは他ツールが担当 |

### ✅ Airflowの並列処理の正体
Airflowは「複数のタスクを**同時に動かす**（=並列実行）」ことができます。例えば：
```python
task_a >> [task_b, task_c, task_d]
```

この場合、task_b〜task_dは並列で実行されます。

Airflowは1つ1つのタスクは基本的に「シングルスレッド」

データの並列処理（分散MapReduce的な処理）はSpark、BigQuery、Dask、Rayなどに任せます。

つまり、並列に実行されるタスクはそれぞれ独立したプロセスで動作し、そのタスクの中身をどう実行するかはOperatorが担います。




## ⚖️ 他のワークフローツールとの比較

| ツール名             | 特徴                              | メリット                                             | デメリット                                                    |
|----------------------|-----------------------------------|------------------------------------------------------|---------------------------------------------------------------|
| Airflow (Composer)   | DAGベース、Python、拡張性◎        | 柔軟な処理定義、GCP連携◎、大規模対応                 | 学習コストやや高、セットアップ手間（Composerで解消）          |
| Prefect              | Python製、フロー志向、UI優秀       | タスク間依存が柔軟、エラー処理強力                    | DAGより抽象度高く初心者には取っ付きにくい                    |
| Luigi                | タスク依存と実行に強み             | 軽量で自前構築しやすい                                | UIやスケジューラが弱い、GCP連携が薄い                         |
| Dagster              | 型付きDAG、開発者体験重視          | 開発支援ツールが豊富、テストしやすい                 | 学習コスト高め、Airflowほどの採用実績はまだ少ない            |
| Kubeflow Pipelines   | ML特化、Kubernetes連携             | 機械学習向けに最適化、GPU対応                         | MLに特化しすぎて汎用性に欠ける                               |


## 参照記事
https://airflow.apache.org/docs/

https://cloud.google.com/composer/docs?hl=ja
Mac買い替え時のデータ移行と初期化に苦戦した話

# 経緯
Intel Macもそろそろサポートの終わりを考える時期になったので、一気に最新M4 Macまで買い換えました。
その時に、データの移行後にはまった点と、旧Macの初期化ではまった点について、自分の備忘＋もし誰かの役に立てればと書こうと思います。

# 先に結論
* 日本語入力ソースはデータ移行前にOS標準は残しておくこと
* プライベートWi-Fiアドレスは端末の初期化が終わるまでOFFにしておくこと
* 初期化する前に外部メディアからの起動を許可に設定しておくこと
* 16GB以上のUSBメモリはあるといい
* 初期化するMac以外にもう１台Macを用意しておくこと（今回は買い替えだったので本当によかった）

それではそれぞれについて書いていこうと思います。

と、その前に、データ移行について旧マシンのストレージは1TB、新マシンは512GBと容量が **減った** ため、Timemachineのバックアップデータから移行ができるのか不安でしたが、使用量が新マシンの容量を超えていなければ問題なかった様です。（そりゃそうだわな）

# 日本語入力について
Google日本語入力以外を入力ソースから削除していたため、キーボードの入力ができないと言う状態になりました。
キーボードの不具合？を考えましたが、ログイン画面からパスワードは入力できたので、ソフトウェアの問題と判断できました。
結論としては、入力ソースでOS標準の「日本語-ローマ字入力」を追加することで、入力ができる様になりました。

# プライベートWi-Fiアドレスについて
データ移行時に設定も一緒に移行していたために発生したのだと思いますが、Wi-FiのMACアドレスが新・旧で重複していた様です。
それに気づいたのは、旧Macを初期化するためにAppleが公開している情報 [Mac を売却、譲渡、下取り、リサイクルする前にやっておくべきこと](https://support.apple.com/ja-jp/102773) に従って進めた時でした。

どこで間違えたのか、OSの再インストールがインターネット越しのインストールとなりました。
で、この作業が最後の最後で毎回「-2003F」でエラー終了する。
その１つの原因がMACアドレスの重複で通信が不安定になっていたことです。
新Macで勝手にWi-Fiの接続先が変わっていたり、初期化中の旧MacでSSIDとパスワードが合っているにも関わらず接続画面が進まなかったりとおかしな動作をしていました。
新MacでプライベートWi-Fiアドレスを無効にしたところ、どちらのMacも安定しました。

# 外部メディアからの起動を許可について
通信が安定したにも関わらず、インターネットからのOSインストールは引き続き失敗します。（同様に-2003F）

あれこれ調べて、USBメモリにOSインストーラーを入れてそこからインストールすればいいと言う結論に至ります。

で、この「外部メディアからの起動を許可」と言う設定です。
こんな設定があったなんて知らなかったのですが、これが許可されてないとUSBメモリからOSをインストールすることができないらしい。
そして、この設定をするリカバリモードに入ることすらできない状態になっていることにこの時気づきました。（Command + Rで起動してもインターネットからのOSインストール画面になってしまう）

# 16GB以上のUSBメモリについて
リカバリモードに入れて、設定を操作できる場合はUSBメモリにOSのインストーラを入れて起動すればいいのですが、そのインストーラーのサイズが大きいため最低16GBのUSBメモリが必要となります。

# 初期化するMac以外にもう１台Macを用意しておくについて
USBメモリでOSインストーラーを作るためにはもう１台Macが必要です。（ファイルシステムをMacOS拡張にして作成するため、Linuxでできるのかは定かではないですが、Macがあった方が確実です）

また、最新のM4 Macを買ってしまったため、このMacではMacOS15（Sequoia）より前のOSをダウンロードできません。
こちらの [macadmin-scripts](https://github.com/munki/macadmin-scripts) にお世話になりました。
こちらのツールを使って新Macで対応していないバージョンのインストーラーをダウンロードできました。

ただ、リカバリモードには入れないのでUSBメモリから起動はできず、インターネットからのインストールも失敗すると言う完全に詰んだ状態となっています。

そこで、最終手段で新Macに旧MacをDFUモードで接続し、Apple configuratorで復元をする方法です。
結局この方法で、復元をした後からリカバリモードに入ることができる様になり、その後インターネットからのインストールも成功し、無事初期化が完了できました。

# 最後に
OSを消去して以降インターネットからのインストール時は、電源を切っても勝手に起動してくるし、ファンは全力で回っているしでどうなることかと思いました。
何となくできるから大丈夫と過信することなく、必要な下調べと準備はした上で対応をしましょうとあらためて感じました。
アンパンマンに学ぶ『IPSec』：バイキンマンの盗み見を防げ！

みんな大好きアンパンマンの世界で、**インターネット通信の安全**を守る「IPSec（IP Security）」をストーリー仕立てで学びます。

「アンパンマン＝セキュリティヒーロー」の目線で、IPSecの主要な機能である**認証**と**暗号化**をわかりやすく解説します！

---

## 🎭 登場キャラクター（ネットワーク版）

| キャラクター     | ネットワーク上の役割             |
|------------------|----------------------------|
| アンパンマン     | セキュア通信を行いたいクライアント |
| ジャムおじさん   | 通信相手（サーバー）              |
| バイキンマン     | 通信を盗み見ようとする攻撃者       |
| カレーパンマン   | 途中のルーター（第三者中継）        |

---

## 🕵️‍♂️ エピソード：秘密のメッセージ

ある日、アンパンマンがジャムおじさんに「新しいあんこのレシピ」を送ることにしました。

ところが、**その通信経路にはバイキンマンが潜んでいて、盗み見をしようとしています。**

> 🍞 アンパンマン：「レシピがバレたら大変だ！ 安全な通信手段を使わなきゃ！」

そこで登場するのが……  
✨ **IPSec（IP Security）**！ ✨

---

## 🛡️ IPSecとは？

IPSecは、インターネット上の通信を**安全に行うためのプロトコルスイート**です。  
IPレベル（ネットワーク層）でデータを**暗号化**したり、**改ざん検知**や**認証**を行います。

アンパンマンはこの技術を使って、バイキンマンの攻撃を防ぐ作戦に出ます。

---

## 🧱 IPSecの構成要素をキャラで説明！

### ✅ 1. **AH（Authentication Header）**：改ざんを防ぐ

- **アンパンマンの封筒に「印鑑（署名）」を押して送る**
- バイキンマンが途中で中身を書き換えようとしても、「印鑑が違う」とすぐにバレる

📌 特徴：**データの認証と完全性を保証（暗号化なし）**

---

### ✅ 2. **ESP（Encapsulating Security Payload）**：中身を守る

- **アンパンマンがレシピを「鍵付きの箱」に入れて送る**
- バイキンマンが見ようとしても、**中が見えない！開けられない！**

📌 特徴：**暗号化 + 認証で安全性抜群！**

---

## 🔐 通信の流れ（トンネリング）

アンパンマンが「IPSecトンネルモード」で通信します：


- **バイキンマンはパケットを盗んでも、中身が読めず改ざんも不可！**
- 「レシピは守られた！」

---

## 📌 モードの違い

| モード           | 説明                             |
|------------------|----------------------------------|
| トランスポートモード | 端末間通信で使う（PC対PCなど）       |
| トンネルモード     | ルータ間通信で使う（VPNなど）         |

アンパンマンとジャムおじさんの通信は、間にカレーパンマンがいるので**トンネルモード**！

---

## 📘 まとめ

- **IPSecは「通信内容を暗号化し、改ざんを防止する」ための技術**
- AH：改ざん検知（署名）／ESP：暗号化＋署名
- VPNや企業間通信などで幅広く活躍

---

## 🎓 この話から学べること

- セキュリティの基本は「**中身を見せないこと（暗号化）**」と「**正しい相手か確認すること（認証）**」
- IPSecは**ネットワーク層レベル**でのセキュリティを提供する
- **ESPがメインで使われている**（特にVPN）

---

🍞 **「ぼくがIPSecパンマンだ！」**  
みんなの通信を、安全に守るヒーローになろう！