OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft 365 の拡張を考えてみた

# 背景

Microsoft 365 Copilot で楽になる :laughing:  
とか思ってたら、申請する前に受付停止して、いまだに使えない。

Azure OpenAI Service なら無償枠でも結構使えるので Logic APps とかで使ってた。

で、ふと、無いなら、まぁ作ってみればいいんじゃね？と思った際の失敗の記録

# 結論

すでに選択肢としては、Office Add-in (Chrome Extension) なんですね。

結構前からだったみたいで、VSTO で知識とまってたので驚き。
まずは、chrome-extension を学ぶかな


## VBA、VSTO、Office-Add-in(Chrome-extension) の比較

| 技術         | 利点                                         | 欠点                                         | サポート終了日               |所感|
|--------------|--------------------------------------------|--------------------------------------------|------------------------------|-|
| **VBA**      | - 簡単に学べる<br> - Officeアプリ内で直接実行 | - パフォーマンスが低い<br>- クロスプラットフォーム非対応 | 現在もサポート中 :thinking:             |サポート終了してない・・ので、Office操作するならこれしかないような・・ :sweat_smile: |
| **VSTO**     | - 高度な機能を提供<br>- .NET Framework 4.7(4.8) | - Windows専用<br>- 開発環境が複雑         | 2025年3月17日までサポート予定[[VSTO](https://learn.microsoft.com/en-us/visualstudio/vsto/visual-studio-tools-for-office-runtime?view=vs-2022)] | まだいけるかと思ったら、すでに退役軍人|
| **Office アドイン** | - クロスプラットフォーム対応<br>- Web技術を利用 | - 機能が制限される場合がある<br>- 学習曲線がある | 現在もサポート中            |ってことで、これしかない :sun_with_face: |

# 詳細

## VBA

久しぶりにやってみたら、以下問題があった
- IDE 古すぎ
- IED Shift-jis だが、内部動作は UTF8 で文字化けの中で開発が必要
    - 要するに外部で開発して、読み込んだほうが楽。Copilot に作らせればまぁいける
- フォームもやっぱり古臭くて・・動いても操作感がいや・・

## **VSTO**

ってことで、久しぶりにやってみるかと、VBA のあとに移植させようとしたら・・
- すでにサポート切れ :sweat_smile: 

一応開発はできそうだったけど・・切れたってわかった以上は、社内展開はなぁ・・と断念

## **Office アドイン**

最終的に、これに流れてきた
ということで、

- chrome extension で、まずはLLM操作アプリを作ってみよう

Copilot 君がいい感じに作ってくれるんだけど、これ、公開とか共有がまだわかってない :sweat_smile: 

# あとがき

組織が、office add-in を許可してるとは思えない・・

が、嘆いててもしょうがないので、一度作ってみるか・・ってのが現状 :sweat: 


# 参考

https://learn.microsoft.com/en-us/visualstudio/vsto/visual-studio-tools-for-office-runtime?view=vs-2022

https://learn.microsoft.com/ja-jp/office/dev/add-ins/overview/office-add-ins
『Riderで「dotnet run file.cs」をサポートして欲しい』ってIssueを建てたから「いいね（Vote）」して欲しい

Issueはこちら。

https://youtrack.jetbrains.com/issue/RIDER-126336/Support-dotnet-run-file.cs

---

2025年後半にリリース予定の.NET 10では、プロジェクトを作らずともC#のソースファイル単体を実行できるようになる予定です。

※ 2025年6月現在、.NET 10はPreview 5がリリースされ、試すことが可能です。

https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/

この機能、次の理由でとても魅力的に感じています。

* 初学者のC#入門への敷居が下がる
* SDKなどのサンプルコードの掲示・実行に便利
* 書き捨てのコードを実行するのが便利
* ちょっとした便利コードを管理するのが楽

---

ところで昨年2024年、Riderは非商用利用が無償化されました。そのため初学者に「C#をやり始めるためのツール」として、Riderを非常にすすめすくなりました。

https://blog.jetbrains.com/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use/

https://blog.jetbrains.com/ja/blog/2024/11/28/webstorm-rider/

また、「プロジェクトを作らないC#単一ファイル」は初学者がC#をやり始めるための機能として、とても良さそうです。

残念ながら現時点のRiderは、「プロジェクトを作らないC#単一ファイル」で、便利なコード編集機能や実行機能をサポートしていません。Riderが「プロジェクトを作らないC#単一ファイル」をサポートすることは、C#とRiderの利用者を増やすために、とても価値があるなと思いました。

---

そこで「Support dotnet run file.cs」というIssueを、YouTrack（JetBrainsの課題管理ツール）に建てました。

https://youtrack.jetbrains.com/issue/RIDER-126336/Support-dotnet-run-file.cs

次のJetBrains 公式ブログの日本語版には、

https://blog.jetbrains.com/ja/2019/07/03/1954/

次のような説明があります。

> Vote（いいね）ボタン– Vote(いいね）ボタンをクリックすると２つのことが実現されます。１つはJetBrainsがIssueの優先順位を知るために役立ちます。もう１つはIssueの更新があると通知されるようになります。JetBrainsのチームはIssueの優先順位を評価する際、1)vote数、2)内部的な調査結果 3) Issueの複雑度とIssue解決によるメリットの大きさ  等を考慮するため、vote数の多いものが必ずしも実現されるとは限りません。しかしながら、voteはユーザーの要望を知る上で非常に重要な要素ですので、同じようなIssueで困っている場合や同じような機能拡張を希望する場合、ぜひご活用ください。


「いいね！」が多ければ、必ずサポートされるわけではありません。しかし、開発チームに要望・需要を伝えることで、価値ある機能が早く届いたり、隠れた価値ある機能が実装されたりするかもしれません。

みなさん、もし賛同してくれるならYouTrack（JetBrainsの課題管理ツール）にログインして、

https://youtrack.jetbrains.com/issue/RIDER-126336/Support-dotnet-run-file.cs

にいいね（Vote）をしてもらえるとうれしいです。
4カ月+αで応用情報技術者を目指す(途中の)話

# 注意
実は私、[某教育機関](https://www.kosen-k.go.jp/)で情報処理を学んでいます。
つまり記事タイトルの __+α__ というのは記事執筆初期段階でいうと、3年2カ月分の情報系の基礎学習を指しています。
正直言って基礎も基礎レベルの内容なので応用情報を受けようという人にとっては誤差だと思いますが、「4カ月だけって言ってたじゃないか嘘つき！」って言われても悲しいので予め書いておきます。

# はじめに
[諸事情](https://www.npa.go.jp/about/recruitment/ippansyoku_cyberdigital_saiyo.html#01)により、現在(令和7年6月15日)からおよそ4か月後(令和7年10月12日)の応用情報に合格しないと将来の夢を絶たれることが判明しました。
なので勉強しなきゃなんですけど、モチベ上げるためというのもありつつ、自分の状況が単純に面白いので、記事にしとくことにします。

とりあえず以下のゆるふわ計画を立ててみました
| 1 | 2 |
|:-:|:-:|
| 1日目 | [応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)で様子見 |
| 1か月目まで | [キタミ式イラストIT塾　応用情報技術者](https://amzn.asia/d/iuFYAeX)を参考本として読破 |
| 2か月目まで | 午前対策 |
| 3か月目まで | 午後対策 |
| 4か月目まで | フル形式模試 |

# 過去問道場で様子見
現在の知識でどれくらい解けるのか、様子見のために[応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)をちょっと解いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4114286/3d4657e3-4021-42c7-b452-09496915fff6.png)
とりあえず25問解いてみて正解は12問、正解率は48%
50問くらい解いておいた方が良いかもだけど、夜も遅いしここまで。
解いてみた感想としては、2割くらいが日本語が読めれば解ける問題、3割くらいが情報系の授業で出てきた内容、3割がマネジメント系の知らん話、残りの2割が深めの情報処理の話って感じでした。
まあまあ初日にしては解けた方なんじゃないでしょうか。

# 参考書を読破
 [キタミ式イラストIT塾　応用情報技術者](https://amzn.asia/d/iuFYAeX)、実際に買ってみたら本格的な国語辞典くらいあってビビりました。約940ページですってよ奥さん。怖いわね。
 1日30ページくらい読まないといけないペースってことで、サボり防止のために自分はNotionで進捗を管理することにします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4114286/7317d9cb-3bbe-49dd-9334-a5928130ff13.png)

最近のAIは優秀で、「1冊の本を何ページから何ページまで読んだかカレンダー形式で管理したい」っていうとすぐにこんな感じで出してくれます。
初日は過去問道場やったりQiita記事書いたりしなきゃだから進捗0だけど、仕方ないね。
まあボチボチ読んでいきます。

# 午前対策
7月中旬ごろ予定
# 午後対策
8月中旬ごろ予定
# フル形式模試
9月中旬ごろ予定

# 最後に
合格出来たらいいな
commitを別のbranchに移したい時→`git rebase --onto`

# はじめに
Git で作業していると、作成したコミットを間違ったブランチで作成してしまったり、特定のコミット群を別のブランチに移動させたい、といった状況に遭遇したことはありませんか？そんな時に役に立つのが， `git rebase --onto` です．

この記事では、`git rebase --onto` がどのようなコマンドで、どのようにコミットを別のブランチに移動させるのか、具体的な使用例を交えて詳しく解説します。

# `git rebase --onto` とは？

`git rebase` は、一連のコミットを別のブランチに「再適用」するためのコマンドです。そして、`--onto` オプションは、この再適用の「移動先」をより詳細に指定できる機能を提供します。

基本的な構文は以下のようになります。

```bash
git rebase --onto <新しいベース> <移動したいコミットの開始地点> <移動したいブランチ>
```

それぞれの引数は次の意味を持ちます。

- `<新しいベース>`: コミットを再適用する新しい基点となるコミットまたはブランチ。
- `<移動したいコミットの開始地点>`: 再適用したいコミット群の「直前のコミット」。このコミット自体は移動されません。
- `<移動したいブランチ>`: 移動したいコミットが含まれるブランチ。通常は現在のブランチを指定します。

このコマンドは、`<移動したいコミットの開始地点>` から `<移動したいブランチ>` までのコミットを切り取り、それらを `<新しいベース>` の上に貼り付ける、というイメージです。


### 注意点とヒント
- **コンフリクト**: コミット先を移動するためコンフリクトが起きる可能性があります。
- **強制プッシュ**: 既に共有リポジトリにプッシュ済みのコミットに対して `rebase` を行うと、履歴が書き換わるため、他の開発者との間で問題が発生する可能性があります。このような場合は、`git push --force-with-lease` または `git push --force` が必要になりますが、チームメンバーと十分な連携をとってから実行してください。
- **コミットハッシュの変更**: `rebase` はコミットを「再作成」するため、移動したコミットのハッシュ値は変更されます。
- **`git reflog` の活用**: `rebase` を実行して意図しない状態になってしまった場合でも、`git reflog` コマンドを使用すると、過去のHEADの移動履歴を確認し、元の状態に戻すことができます。
今日から使えるgit worktree：初心者向けやさしい解説と活用例

# 今日から使えるgit worktree：初心者向けやさしい解説と活用例

---

## 1. はじめに

Gitで複数のブランチを切り替えながら作業していると、「作業中の変更をstashしないといけない」「急なバグ修正で今の作業を中断したくない」といった悩みがよくあります。  
そんなときに便利なのが**git worktree**です。この記事では、git worktreeの基本から、初心者でもすぐに使える活用例まで解説してみました。


## 2. git worktreeとは？

**git worktree**は、1つのリポジトリから複数の作業用ディレクトリ（ワークツリー）を作成し、それぞれで異なるブランチを同時に扱えるGitの公式機能です。  従来のGitでは、1つのディレクトリで1つのブランチしか作業できず、ブランチを切り替えるたびに変更内容を退避する必要がありました。  

git worktreeを使えば、複数のブランチを独立したディレクトリで同時に作業できるので、作業効率が大きく向上します。


## 3. git worktreeのメリット・デメリット

### メリット

- 複数のブランチを同時に並行して作業できる
- ブランチ切り替え時にstashや一時コミットが不要
- 緊急対応やレビュー用の一時的な作業環境をすぐ用意できる
- ディスク容量を節約できる（リポジトリをフルクローンしなくてよい）

### デメリット・注意点

- 作業ディレクトリが増えるので、管理がやや煩雑になる
- 間違ったディレクトリで作業してしまうリスクがある


## 4. git worktreeの基本操作

### ワークツリーの追加

新しいワークツリーを作成して、別ブランチで作業したい場合は以下のコマンドを使います。

```bash
git worktree add  
```

例：  
`git worktree add ../fix-bug fix-bug`  
（fix-bugブランチを../fix-bugディレクトリに展開）

### 既存ブランチのワークツリー追加

まだ存在しないブランチの場合は、自動的に新規ブランチが作成されます。

:::note info
指定したブランチ名が存在しない場合、git worktree addはベースブランチ（デフォルトは現在のHEAD）から新しいブランチを作成してワークツリーを作ります。必要に応じて -b オプションで新規ブランチ名を明示できます。
:::


### ワークツリーの一覧表示

```bash
git worktree list
```

### ワークツリーの削除

作業が終わったワークツリーは、以下のコマンドで安全に削除できます。

```bash
git worktree remove 
```


## 5. 活用シーン・具体例

### 新機能開発とバグ修正の並行作業

新機能の開発中に「バグ修正の依頼」が来た場合、worktreeでバグ修正用のディレクトリを作成し、そちらで修正作業を進められます。  
これにより、現在の作業内容をstashする必要がありません。

### レビューやテスト用の一時環境

プルリクエストの内容を自分の環境でテストしたいとき、worktreeでそのブランチをチェックアウトすれば、メインの作業ディレクトリを汚さずに確認できます。

### モノレポでの複数モジュール開発

フロントエンドとバックエンドを同時に開発したい場合、worktreeでそれぞれのブランチを展開し、並行して作業できます。

:::note info
実際のところ、「1つの大きなリポジトリの中で複数のworktreeを使う」という運用もあり得ると思います。
:::

## 6. よくあるトラブルとその防止策

- **ディレクトリ名の工夫**  
  どのブランチの作業ディレクトリか分かるように、ディレクトリ名にブランチ名を含めるのがおすすめです。

- **誤操作防止**  
  作業前に`git branch`や`git status`で、今どのブランチ・ディレクトリで作業しているか確認しましょう。

- **不要なワークツリーの削除**  
  使い終わったワークツリーは`git worktree remove`で整理しましょう。

:::note info
補足事項

- 安全面での補足
    - ワークツリーを「削除」しても、作業ディレクトリのみが消され、コミット済みの内容やリポジトリ本体は削除されません。ただし、未コミットの変更は失われるため注意が必要です。
- worktreeの制限事項
    - 1つのブランチは同時に複数のワークツリーでチェックアウトできません。
        - ※[git worktree公式の制限事項の説明](https://git-scm.com/docs/git-worktree#_limitations)
:::

## 7. まとめ・次のステップ

git worktreeを使えば、複数のブランチを同時に安全かつ効率的に管理できて、stashや一時コミットの手間が減って緊急対応やレビューもスムーズです。  まずは小さなプロジェクトで試してみてはいかがでしょうか。

さらに詳しく知りたい方は、[公式ドキュメント（英語）](https://git-scm.com/docs/git-worktree)も参考にしてみましょう。
初心者がAmazon Q CLIでゲーム作ってみた

# **Amazon Q CLIとは？**
AWS（Amazon Web Services）が提供する 開発者向けの AI アシスタントです！！！
https://aws.amazon.com/jp/builders-flash/202505/q-developer-cli-app-development/

今回はこちらを使って、簡単なゲームを作っていきます。

# なぜゲーム制作に挑戦しようと思ったのか？
会社の先輩から以下キャンペーンのことを聞き、AWSのTシャツが欲しく参加することにしました。
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

では、実際にゲームを作っていきましょう！！！

# ゲーム作成
今回はこんなゲームを作成します。
### ★一人17歩で高得点を目指そう！★
17歩とは、「賭博堕天録カイジ」に登場する麻雀ゲームです。
①二人のプレイヤーが向かい合い、それぞれのプレイヤーは自分の目の前の山を開く。
②3分の制限時間で34枚の中から13枚を使って満貫以上の聴牌を作る
③聴牌形ができたら順番に、余った21枚の牌を1枚ずつ切り出していき、ロンされた方の負け。
④17巡が終わってもロンができない場合は流局

■今回作成するゲームのルール
①136牌の中から34牌がランダムで配られる
②制限時間3分で14牌を選び、役を作る
③役に応じた得点をゲット
④これらを3回繰り返し、合計得点を競う

まずは、これらをAmazon Q CLIにインプット。
![スクリーンショット 2025-06-14 130750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108673/112348c7-d471-42b1-937f-732880f99eff.png)

できたものがこちら↓
![スクリーンショット 2025-06-14 131343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108673/23327a01-22a1-410a-a73e-1ff1c47bffb8.png)

ん～～～～。いろいろ想定と違ったので追加インプット。
![スクリーンショット 2025-06-14 131940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108673/546de4e2-f540-4e41-86be-ff044c6151f8.png)

こんな感じで10回くらいやり取りし、完成品がこちら↓
![麻雀役作成ゲーム 2025-06-14 15-07-27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108673/397206a4-f64b-4644-822e-3da5117d3a3a.gif)

まだまだ改良点があり出来栄えとしては一翻ですが、役満級の体験ができました。

完。
【Day13】機能実装！フレームに記載するExif情報を編集できるようにする（前編）

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)
[【Day3】まずはフロントだけ開発環境を構築する](https://qiita.com/midorigame/items/9de27ba72aaef504a833)
[【Day4】バックエンドの開発環境を整えつつ、マルチコンテナ対応のDevcontainerにする](https://qiita.com/midorigame/items/5b95374cd85f715a6498)
[【Day5】お試し実装！ファイルをアップロードしてバックエンドで処理する](https://qiita.com/midorigame/items/9663f0063b95b501c08a)
[【Day6】Docker Desktopが起動しなくなり泣きながら原因調査する](https://qiita.com/midorigame/items/d07df1caf05267d0609d)
[【Day7】画像にフレームとExif情報を付けてみる](https://qiita.com/midorigame/items/e2d85ce8dd7a5bcb5daf)
[【Day8】フロントに表示する画像のサイズを小さくする](https://qiita.com/midorigame/items/f7f5f9b14fb79259c716)
[【Day9】フロントエンドとバックエンドをそれぞれデプロイする](https://qiita.com/midorigame/items/4c8037024e667ff1105b)
[【Day10】結局コンテナ1つで開発する方が楽かもしれない](https://qiita.com/midorigame/items/60b484b2007c3aab474b)
[【Day11】アプリが一通り完成！！](https://qiita.com/midorigame/items/38ddccc09f0625aaebd6)
[【Day12】FastAPIのコードをリファクタリングする](https://qiita.com/midorigame/items/72ed91ff9add5504fab9)

## 前回やったこと

前回はバックエンドで使っているPythonのAPIをデファクトスタンダードな構成になるようにリファクタリングしました！

## 今回やったこと

新規機能として「画像を選択時にブラウザ上にExif情報を表示させて自由に編集できる」という機能を実装しようとしました！

### 実装背景

今までは画像をバックエンドに送信したら自動的にその画像からExif情報（カメラやレンズのモデル名、シャッタースピードなど）を取得してフレームに記載していました。

普通のデジタルカメラだと問題ないですが、私はデジタルカメラ以外にもフィルムカメラも使います。

フィルムカメラだと現像の都合上、撮影した写真にExif情報を付与することはできません。
そこでフィルムカメラの写真をアップロードするときは手動でExif情報を記入できるようにしたいのです！

### 進捗

こんな感じで画像を選択するだけで、一部のExif情報を表示できるようにしました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/50efcb9e-2e65-4914-b4a8-af24b1992b25.png)

しかし、見ての通り、UIはぐちゃぐちゃです。
また、これらのExif情報を編集はできてもAPIへのリクエストに加えること、バックエンドで受け取ったExif情報で上書きすることもできていません。

つまり、今日は全然進捗なしです！！！！！

### 本日のコミット

今日の実装内容です！全然進捗なくて悲しい！！！！

https://github.com/midorigameee/React-Image-Generator/commit/f7da2375da62ea61153b626d39959c40f7d8d275


## 気づいたこと、学び

先日、バックエンドはリファクタリングしましたが、フロントエンドは全く手を加えられていません。
そこを蔑ろにして新規機能を実装しようとした結果、頭が混乱して実装がよりカオスになってしまいました。

やはり定期的なリファクタリングは大事ですね。。。

また、今までは開発に使用するブランチが実質1つだけだったのですが、そのせいで今回のような明らかに作成途中をpushできませんでした。

急遽トピックブランチを切って対応しましたが、本来なら開発中のブランチと機能開発のブランチは分けるべきですね。
機能実装欲が高まりすぎて周りが見えてないですね！！！！！！

今後は開発中のブランチは分けて、デプロイ用のブランチにPR作ってマージするような運用にします！
ゆくゆくはPRのプレマージのタイミングでテスト実行するなどのCI/CDの仕組みを作っていきたいですね。


## おわりに

今日は進捗がしょぼめな一日でした。

リファクタリングしてないソースに新機能を追加するのは大変危険だということを身に染みて痛感しました。

「ああ！これも実装したい！！この機能もやりたいな！！！！」だけで突き進むのはダメ！絶対！！
でもモチベが高まってるのは良いこと！！！！
2025第一回東大本レ第三問を解いてみた

|2025年第一回東大本レ第三問|
|:-|
|数列$\lbrace a_n\rbrace$を$$a\_n^2=\sum\_{k=1}^n a\_k,~a_n>0,~n\in\mathbb{N}$$で定める．|
|(1)$a\_1,~a_2$を求めよ．|
|(2)${}^\forall n\in\mathbb{N},~a\_n\le \frac{n+\sqrt{n}}{2}$を示せ．|
|(3)$\lim\_{n\to+\infty}\frac{a\_n}{n}$を求めよ．|

(1)
$a_1=1,~a_2=\frac{1+\sqrt{5}}{2}\cdots(\underline{\text{答}})$

(2)$\underline{Proof}$
$n\in\mathbb{N}$とする．このとき，
```math
\begin{aligned}
    &a_{n+1}^2-a_n^2=\sum_{k=1}^{n+1}a_k-\sum_{k=1}^na_k\\
    \iff&a_{n+1}^2-a_n^2=a_{n+1}\\
    \iff&a_{n+1}=\frac{1+\sqrt{1+4a_n^2}}{2}\quad(\because a_{n+1}>0)
\end{aligned}
```
である．
$n$に関する数学的帰納法によって，与えられた不等式を証明する．
- $n=1$のときは自明．
- $n$のとき，$a\_n\le\frac{n+\sqrt{n}}{2}$を仮定すると，
```math
\begin{aligned}
    &n\le n+1\\
    \iff&2n\sqrt{n}\le 2n\sqrt{n+1}\\
    \iff&1+n^2+2n\sqrt{n}+n\le n^2+2n\sqrt{n+1}+n+1\\
    \iff&1+(n+\sqrt{n})^2\le (n+\sqrt{n+1})^2\\
    \implies&\sqrt{1+(n+\sqrt{n})^2}\le n+\sqrt{n+1}\\
    \implies&\sqrt{1+4a_n^2}\le n+\sqrt{n+1}\quad(\because\text{帰納法の仮定})\\
    \iff&\frac{1+\sqrt{1+4a_n^2}}{2}\le\frac{n+1+\sqrt{n+1}}{2}\\
    \iff&a_{n+1}\le\frac{n+1+\sqrt{n+1}}{2}
\end{aligned}
```
が成立し，$n+1$のときも成立する．$\therefore$ok．$\square$

(3)
まず，次の主張を証明する．
|claim|
|:-|
|${}^\forall n\in\mathbb{N},~\frac{n-\sqrt{n}}{2}\le a\_n$|

$\underline{Proof}$
$n$に関する数学的帰納法によって証明する．
- $n=1$のときは自明．
- $n\ge 2$のとき，$\frac{n-\sqrt{n}}{2}\le a\_n$を仮定すると，
```math
\begin{aligned}
    &n\le n+1\\
    \iff&-2n\sqrt{n+1}\le-2n\sqrt{n}\\
    \iff&n^2-2n\sqrt{n+1}+n+1\le 1+n^2-2n\sqrt{n}+n\\
    \iff&(n-\sqrt{n+1})^2\le 1+(n-\sqrt{n})^2\\
    \implies&n-\sqrt{n+1}\le \sqrt{1+(n-\sqrt{n})^2}\quad(\because n\ge 2)\\
    \implies&n-\sqrt{n+1}\le\sqrt{1+4a_n^2}\quad(\because\text{帰納法の仮定})\\
    \iff&\frac{n+1-\sqrt{n+1}}{2}\le\frac{1+\sqrt{1+4a_n^2}}{2}\\
    \iff&\frac{n+1-\sqrt{n+1}}{2}\le a_{n+1}
\end{aligned}
```
が成立し，$n+1$のときも成立する．$\therefore$ok．$\square$

以上より，
```math
{}^\forall n\in\mathbb{N},~\frac{n-\sqrt{n}}{2}\le a_n\le \frac{n+\sqrt{n}}{2}
```
であり，
```math
\frac{n-\sqrt{n}}{2n}\to \frac{1}{2},~\frac{n+\sqrt{n}}{2n}\to \frac{1}{2}\quad(n\to+\infty)
```
より，はさみうちの原理より，$\lim\_{n\to+\infty} \frac{a\_n}{n}=\frac{1}{2}\cdots(\underline{\text{答}})$

## はさみうちの原理の証明

$n\to+\infty$でのはさみうちの原理も証明しておきましょう．

|はさみうちの原理|
|:-|
|$a\_n\le b\_n\le c\_n$で，$a\_n, c\_n\to \beta~(n\to+\infty)$であれば，$b\_n\to \beta~(n\to+\infty)$|

$\underline{Proof}$
仮定から，
```math
\begin{aligned}
    &{}^\forall \epsilon_1>0, {}^\exists N_1=N_1(\epsilon)>0~\text{s.t.}~n_1>N_1\implies \beta-\epsilon_1<a_n<\beta+\epsilon_1\\
    &{}^\forall \epsilon_2>0, {}^\exists N_2=N_2(\epsilon)>0~\text{s.t.}~n_2>N_2\implies \beta-\epsilon_2<c_n<\beta+\epsilon_2
\end{aligned}
```
が成立している．
任意の$\epsilon>0$に対して，$N>0$を$N=\max\lbrace N_1(\epsilon), N_2(\epsilon)\rbrace$ととる．このとき，$n>N$なる全ての$n\in\mathbb{N}$に対して，
```math
\begin{aligned}
    b_n-\beta&\le c_n-\beta<\beta+\epsilon-\beta=\epsilon\\
    b_n-\beta&\ge a_n-\beta>\beta-\epsilon-\beta=-\epsilon
\end{aligned}
```
即ち
```math
-\epsilon<b_n-\beta<\epsilon
```
が成立する．$\therefore$ok．$\square$
FlutterアプリでiPadの向きをLandscapeのみに固定する際の注意点（Xcode設定）



FlutterでiPadアプリを開発していて、**特定の画面向き（例：Landscape）に限定したい場合**、いくつかの方法がありますが、以下のような問題にぶつかりました：

* `SystemChrome.setPreferredOrientations` など**コード上で制御しても、実機で効かないことがある**
* **シミュレーターではうまく行くが、ビルドしてTestFlightにアップロードする段階でエラーが出る**

## ✅ 成功した方法

**Xcodeの `Runner > General > Deployment Info` セクションでチェックボックスを使って設定すること。**

以下のように、`Landscape Left` と `Landscape Right` のみにチェック：

![Screenshot 2025-06-15 at 14.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794078/6a427050-f334-42ed-b118-aeef7c133a00.png)


## ⚠️ 注意点

このチェックを外すと、Xcodeは自動的に `Info.plist` の以下のチェックを外した行の項目を**削除**します。

```xml
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
```

Landscape以外を無効にしたままアーカイブしようとすると、アーカイブまではできるが、**App Store Connectへのアップロード時に「全方向サポートしていない」とエラーが出て絶望**することがあります。実際何度もここにきて絶望しました。いけそうに見えて最後で落とすのです。

## ✅ 解決策（順番が重要）

1. **開発中・動作確認時**は `Info.plist` に上記の4方向すべてを記述しておく
2. `Xcode > Runner > General` のチェックボックスも全方向にしておく
3. アーカイブ直前にチェックボックスで `Landscape` のみに変更
4. **その後** `Info.plist` に自分で `<array>` 内を4方向すべてに戻す
5. 保存し、**その状態でアーカイブ**

この順番でやるのが非常に重要です。
これにより、実機でのLandscape固定、かつApp Storeアップロードも成功します。

---
unity　画面いっぱいにUI画像をつくる

Unityが「AspectRatioFitter」という便利コンポーネントを用意済み
このコンポーネントを使えばプログラミング不要で画像をスクリーンいっぱいに表示させることが可能。

UI画像を表示するためにCanvasとImageの作成
今回はUI画像を扱うため、Canvasコンポーネントを使います。

AspectRatioFitter をセットします。
Aspect Modeを Envelope Parent に設定します。

16:9の長方形画像を使う場合
Aspect Ratioには使用する画像の比率をセットする
今回は16:9の画像なので、 16 ÷ 9 をしましょう。
答えは 1.77778
【Rails】joins・preload・eager_load・includesの違いと使い分け

RailsのActiveRecordで関連データを扱いたいとき、`joins` や `includes` など、いろいろなメソッドがありますよね。

でも、どう使い分けたらいいのかよく分からない…と疑問に思う方も多いのではないでしょうか。

この記事では、そのような初心者向けに `joins` / `preload` / `eager_load` / `includes` の違いと使い分け方をまとめました。

# 前提
この記事でのモデル関係は以下の通りです。
```ruby
class Book < ApplicationRecord
  belongs_to :author
end

class Author < ApplicationRecord
  has_many :books
end
```
# メソッドの違い
後述しますが、joinsは主にテーブルを結合する目的で、preload・eager_load・includesは主に関連付けをeager loading（一括読み込み）する目的で使われます。

## joins
```ruby
books = Book.joins(:author)
```

```sql
SELECT books.* FROM books
INNER JOIN authors ON authors.id = books.author_id;
```

関連テーブルを INNER JOIN します。

関連付けの一括読み込みはされないので、`book.author` を呼ぶと毎回SQLが発行されるため、N+1問題が起きます。

```ruby
books.each do |book|
  puts book.author.name  # ← N回クエリが発行される（N+1問題）
end
```

つまり joinsは、関連テーブルを `where` などで使うことができるが、N+1問題に注意が必要です。

※なお、関連テーブルを INNER JOIN ではなく LEFT OUTER JOIN する場合は、`left_outer_joins` メソッドを使うこともできます。

## preload
```ruby
books = Book.preload(:author)
```

```sql
-- 本のデータを取得
SELECT * FROM books;

-- 取得した本のデータの author_id（例: 1, 2）に該当する著者を取得
SELECT * FROM authors WHERE id IN (1, 2);
```

テーブル結合せず、メインのテーブルと関連テーブルごとに別クエリを発行します。

関連付けの一括読み込みがされるので、`book.author` を呼んでもN+1問題は発生しません。

```ruby
books.each do |book|
  puts book.author.name  # ← 追加のSQLは発行されない
end
```

つまり preloadは、関連テーブルを `where` などで使えないが、N+1問題は発生しません。


## eager_load
```ruby
books = Book.eager_load(:author)
```

```sql
SELECT
  books.id AS t0_r0,
  books.title AS t0_r1,
  books.author_id AS t0_r2,
  authors.id AS t1_r0,
  authors.name AS t1_r1
FROM books
LEFT OUTER JOIN authors ON authors.id = books.author_id;
```

関連テーブルを LEFT OUTER JOINする。

関連付けの一括読み込みがされるので、`book.author` を呼んでもN+1問題は発生しません。

```ruby
books.each do |book|
  puts book.author.name  # ← 追加のSQLは発行されない
end
```

つまり eager_loadは、関連テーブルを `where`などで使うことができ、N+1問題も発生しません。

## includes
```ruby
books = Book.includes(:author)
```

Railsが内部的に preload または eager_load を自動選択します。

ただし、includesの自動選択は意図しないクエリになることもあるため、できれば eager_load や preload を明示するのが望ましいと考えられます。

# joinsやpreloadを使うメリットは？
一見、eager_load だけで良さそうに思えるかもしれません。
でも、joins や preload にもシンプルさやパフォーマンスの観点からのメリットがあります。

## joins を使うメリット

### 検索条件にだけ関連テーブルを使いたいときに最適
例：`Book.joins(:author).where(authors: { name: "夏目漱石" })`
`book.author.name` など関連付けは使わないけど、関連テーブルで絞り込みたいだけならこれで十分です。

### 無駄なデータを取らないため軽量
eager_load のように全カラムを取得するのに比べ、joins は `books.*` だけ取得できるため、SQLがシンプルで速いことがあります。

## preload を使うメリット

### N+1を防ぎつつ、JOINを避けられる
たとえば、JOINによって結果セットが大きくなりそうな場合は、1本のクエリで全てを取得するよりも、preload を使ってクエリを分けた方がパフォーマンスが良くなることがあります。

### JOINによる副作用を避けたいとき
JOINを使わず別クエリで関連データを取得して紐付けるため、JOINによる副作用（例えば関連レコードがない場合でもNULL行が混ざるなど）を避けることができます。

# 基本的な使い分けの目安
| 状況 | 選ぶメソッド |
| - | - |
| 関連テーブルで絞り込みをするが、関連付けは使わない | joins |
| 関連テーブルで絞り込みをしないが、関連付けは使う | preload |
| 関連テーブルで絞り込みをするし、関連付けも使う | eager_load |
| Railsに自動判定させたい | includes |
googleworkspace chrome の名前を変更

# chromeの文字列を変更

![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/c65b55db-5df1-45d8-ac3a-ab89d92231fd.png)


上記の感じで設定の欄に文字列を入力することで変更可能。
てか、なんで最初は空欄なのに仕事用とか表示されるんだよ。
画像生成AIで作成した画像をTripo AIで3D化してWordpress上で3D表示させる方法を解説します。

![GtewTvsaMAAhMxo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990962/d97d7ab4-dd32-42ac-8d4c-5280969297f6.jpeg)

# 画像生成AI ChatGPT

こちらはChatGPTの有料版で作成したガラス製のバナナの画像です。この画像を3Dモデル化してWordpress上で3D表示させるのが今回の記事の目的です。

## Tripo AI
一枚の画像から3Dモデルを生成するソフトはオープンソースを含めて沢山ありますが、今回はスタンドアローンで利用するのが簡単なTripo AIを使用していきたいと思います。
https://studio.tripo3d.ai/home

* Googleアカウントでログイン可能です
* 生成した画像をサイトにアップロードしてください
* GLBファイルを作成して下さい
* GLBファイルをダウンロード

 ![バナナai.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990962/713b0c90-6406-4806-8673-d389f30b3d5f.png)

 ## Wordpress上での作業に移行します。
 ### 3D Viewerという名前のプラグインをダウンロードしてください
 * グーテンベルグエディタのModel Viewerブロックを展開してください
 * GLBファイルをWordpressにアップロードしてください
 * Model Viewerブロックで3D表示させたいGLBファイルを選択してください
 * お疲れさまでした。これで3D表示の完成です。
 ![Gte3sVXbIAAq4gd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990962/e89af472-0506-4c04-bcb8-a4df7fb9743a.jpeg)

 こちらが実際に動作させているWordpressの記事のURLです
 https://smartphone.spider-insight.com/uncategorized/113/
シンプルなRAGチャットシステムをLangChainで作る

# はじめに

LangChainで初めてRAGシステムを完成させた時のアウトプットを記事にしました。

## 対象読者

- RAGに関する最低限の知識があるけど、実装方法のイメージがつかない人
- LangChainについてこれから学習する人
- LangChainの勉強始めたけど複雑でよくわからなくなってきた人
- 勉強したこと全部忘れた来週の僕

# 作成したRAGの概要

社内ドキュメントなどの非公開ファイルをシステムにアップロードして、その内容について質問を投げると回答してくれるAI
今回はNaive RAGと呼ばれるもっともシンプルな構成ですので、精度が高いとは言えませんがRAGとして機能はします。
`質問入力 → 検索 → 回答生成 → 出力`

# 構成

AWSを使用しました。

- Lambda
  - 一連の処理を実行
- S3
  - ファイルのアップロード先
- Open Search
  - ベクトルデータベース
  - S3のデータをベクトル化したものを格納（S3と同期した状態）
- Bedrock Knowledge Base
  - インデックス生成
  - 検索
  - 指定したLLMモデルによる回答文の生成

## 準備

- S3を作成
- S3のバケットポリシーにシステムからのアクセス権限（"s3:GetObject","s3:PutObject","s3:ListBucket"）を付与
- Bedrockのコンソール画面からKnowledgeBaseを作成
  - 作成したS3を紐付け
  - ベクトルデータベースにOpen Searchを選択
   ![スクリーンショット 2025-06-13 18.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/f0655434-1ff9-4b67-b048-9f7d13590cd2.png)

- ナレッジベースIDを確認（後で使用）

# RAG実装

RAG検索と回答生成の部分のコードを上から順にまとめます。

## LLMモデルを定義
BedrockのClaudeモデルを使用するために、ChatBedrockConverseを使用しました。
[ChatBedrockConverseの公式APIリファレンス](https://python.langchain.com/api_reference/aws/chat_models/langchain_aws.chat_models.bedrock_converse.ChatBedrockConverse.html)

```Python
llm = ChatBedrockConverse(
    model="apac.anthropic.claude-3-5-sonnet-20241022-v2:0",
    region="ap-northeast-1", # 東京リージョン
    temperature=0.1, # 低い値でより決定論的な応答を生成
    max_tokens=4096, # 最大トークン数
    maxRetries=2, # エラー時の再試行回数
    verbose="true", # 詳細なログ出力
)
```

同じようにLLMを定義するものとして[ChatBedrock](https://python.langchain.com/api_reference/aws/chat_models/langchain_aws.chat_models.bedrock.ChatBedrock.html)もありますが、こちらと比較してChatBedrockConverseは、インターフェースが標準化されていてストリーミング応答などできることが多いみたいです知らんけど。

## プロンプトを定義

今回は会話（チャット）形式でメッセージのやり取りをするため、過去の会話履歴を都度渡す必要があります。
ユーザには見えないシステムプロンプトと、ユーザが入力したメッセージであるユーザプロンプトを設定します。

```python
prompt = ChatPromptTemplate.from_messages([
    ("system", "以下のコンテキスト情報を使って質問に答えてください。\n\nコンテキスト: {context}"),
    ("user", "（１つ目の質問）"),
    ("assistant", "（１つ目の回答）"),
    ("user", "{question}") # questionは２つ目の質問が入る変数
])
```

もしチャット形式ではない場合、以下のように`PromptTemplate`を使用できます。
```python
prompt = PromptTemplate.from_template("以下の食材でレシピを考えてください。食材: {ingredient}")
```
`{ingredient}`の部分は変数として設定できます。この場合、実行時に引数として渡します。

## リトリーバを定義

RAG検索を実行するリトリーバの設定をします。
こいつがRAGの核となる部分です。

```python
retriever = AmazonKnowledgeBasesRetriever(
    knowledge_base_id="（ナレッジベースID）", # ここで検索先を指定
    region_name="ap-northeast-1",
    retrieval_config={
        "vectorSearchConfiguration": {
            "numberOfResults": 10 # 検索結果の件数
        }
    },
)
```

## Chainの定義

ここでLangChainの真骨頂、チェーンを作ります。
これまで定義した各クラスをひと繋がりの処理にまとめます。

```python
chain = (
    {"context": retriever, "question": RunnablePassthrough()} 
    | prompt 
    | llm 
    | StrOutputParser()
)
```

RunnablePassthroughは入力値をそのまま出力させる役割があります。質問と一緒に回答を出力させるときに使えます。
StrOutputParserは出力のテキスト部分を抽出してくれるものなので使うことが多そうです。

## Chainの実行
あとは実行するだけ
```python
result = chain.invoke({"question": "社内規定について教えてください"})
```

# おわり

思いの外あっさりできました。
やはりAWSとLangChainが優秀ですね。
実際はこのままだと精度が不安なので、検索前と後に整形やフィルター処理などをいれたいです。
昔のパソコンがLBA方式のHDD読み込みに対応しているか確認する方法

## 背景
POCKET8086という8086実機を所有しています。
CF(コンパクトフラッシュ)からMS-DOSを起動して使うのですが、誤ってMS-DOSを消してしまい起動できなくなりました。
QEMU上で仮想HDDへMS-DOS起動をインストールし、CFへ書き込んだのですがうまく動きませんでした。
そこでMBRを確認したところ（以下記事参照）、どうもLBA方式のHDD読み込みに対応していないようにみえたため、検証をすることにしました。

以下に関連する記事を載せます。
[MS-DOSのMBRの処理を追う](https://qiita.com/earthen94/items/9b5773ccaac1cd5008ec)
[QMSDDOS(MBR)の修復　未解決(備忘録)](https://qiita.com/earthen94/items/af8ea5b266606937fdd7)
[QEMU上で仮想HDDへMSDOSをインストールする](https://qiita.com/earthen94/items/7491ac22a98e4ae823c9)

## 検証用コード
```
org 0x7C00

start:
    xor ax, ax
    mov ds, ax
    mov es, ax
    
    ; LBA読み込み機能に対応しているか調べる(BIOS拡張機能)
    mov ah, 0x41        ; BIOS拡張サービスの有無を確認する機能
    mov bx, 0x55AA      ; 仕様で必須
    mov dl, 0x80        ; 調べたいHDDの番号（0x80=一つ目のHDD）
    int 0x13            ; BIOS呼び出し
    jc no_lba_support   ; CF=1なら非対応
    
    cmp bx, 0xAA55      ; 正常終了時：BIOSは BX=0xAA55 を返してくる
    jne no_lba_support  ; 不一致ならば非対応
    
    test cl, 1          ; CLレジスタの最下位ビット（Bit 0）を確認
    jz no_lba_support   ; CL[0]=0，ならば非対応
    
    ; 到達=LBA対応
    mov si, msg_supported
    call print_string
    jmp $
    
no_lba_support:
    mov si, msg_not_supported
    call print_string
    jmp $

; 文字列出力
print_string:
    lodsb
    or al, al
    jz .done
    mov ah, 0x0E
    int 0x10
    jmp print_string
.done:
    ret


msg_supported db 'LBA is supported.', 0x0D, 0x0A, 0
msg_not_supported db 'LBA is NOT supported.', 0x0D, 0x0A, 0

times 510-($-$$) db 0
dw 0xAA55
```

## CFへの書き込み
```
nasm -f bin lbatest.asm -o lbatest.bin
qemu-system-i386 -hda lbatest.bin ##書き込む前にQEMUで動作確認

lsblk
sudo dd if=lbatest.bin of=/dev/sdb bs=1M count=1 conv=notrunc
```

## 8086実機
非対応と表示されました。
![webwxgetmsgimg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/05c81ed8-d3c5-45fb-8721-35dfedb48640.jpeg)

## ThinkPad-X280
対応していると表示されました。
※エミュレータではなくBIOSの設定を変更し、直接起動しています。
![default.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/cc8a152d-b398-4efa-a240-2f7200ef34ba.jpeg)
![default(1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/5d804277-5c66-40b0-b499-faa5b8f923ed.jpeg)

## 結果
MBRがLBA方式でOSでVGR(ブートローダ)を読み込もうとしていたためにMS-DOS起動できなかったようです。
【UiPath】AssignアクティビティでTryParseを使う時の第２パラメータはNothingでいいという話

## TryParseメソッドとUiPath

UiPath（VB.Net）では、数値型や日付型のTryParseメソッドを使うことで、指定の文字列を数値や日付に変換することができるかを確認できる。

VB.NetでこのTryParseメソッドを使う場合、パラメータが2つ必要である。1つ目は変換できるかを確認したい文字列。2つ目は変換した値を格納する変数で、変換できない場合は0等が入る。また、このメソッド自体はBoolean型を返す。

UiPathでもパラメータが2つ必要なのは同じである。ただし、Assign（代入）アクティビティで使う場合、変換できる場合でも、2つ目のパラメータの変数に値は入らない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/4cc98366-4696-4201-b4e1-2d534b4df391.png)

実際にワークフローで確認してみよう。文字列型変数`valA`に数値へ変換できる文字列（123）を格納し、`Int32.TryParse`メソッドを使って結果を`isNumber`、第2パラメータを数値型変数`valB`に渡す。なお、`valB`が変更されないことを確認するため事前に値を入れておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/042a8c73-6d1d-4276-a7b5-ed7629d96857.png)

結果はこちら。TryParseメソッドがTrueを返しているが、変数`valB`の値は変わっていないことがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d7746399-e3bd-4790-82e8-8f01d95f9e84.png)

変換に失敗しFalseが返った場合でも変数`valB`の値は変わらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/a9d40bb4-7890-4c8d-9f92-1c35ddc96e95.png)

要は第2パラメータには何入れても変わらない。「第2パラメータ指定しなければいいでは？」と思われるかもしれないが、残念ながら必須のため省略するとエラーになってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/084e217a-b7d1-4f1d-b38c-f0efe301b19b.png)

前置きが長くなったが、ここでようやくタイトルに返って「AssignアクティビティでTryParseを使う時の第２パラメータはNothingでも入れておけばいい」という話になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/e72a598a-46b8-4efd-aeeb-0bf640df7170.png)

変換できる場合だけ別の変数に変換した値を格納したい時は、If（条件分岐）アクティビティなどを使って、TryParseの結果にTrueが返る時だけParseメソッドを使って変換した値を代入すればよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c9850d52-6555-4f68-a4d0-51a0f9e4b37b.png)

ちなみにInt32型のTryParseの場合はNothingでなくても適当な数字を入れておけばエラーにはならない。ただ、1とか7とか入れると知らない人から見れば「なんだこれ」となるのは間違いないので、入れるとしても少なくとも0にしておくべきだろう。NothingであればInt32型だけでなくDateTime型などでもエラーにならないので、個人的にはそちらをオススメしておく。

### TryParseの第2パラメータを活用したい場合
Invoke Method（メソッドを呼び出し）かInvoke Code（コードを呼び出し）アクティビティを使うと第2パラメータを活用できる。VB.Netをゴリゴリに活用する環境の場合は、こちらの記事を参考にしてトライしてみてほしい。

https://qiita.com/a_mimizuku_sn/items/44fbf3f961bcccb4fe3c#integertryparse

## 動作環境
UiPath.System.Activities v25.4.2
ハッキングやってみたかったのでKali Linux入れてみたら、Bootできなくて泣いた話(Kali 環境構築 初心者向け)

---

こんにちは、にいろです。エンジニアしてます。
最近見たラザロで、女の子がハッキングめっちゃしててかっこよかったので、ハッキングの技術同人誌を買ってみました。

🔗 [ハッキング・ラボの冒険 初心者のサーバー侵入チャレンジ（BOOTH）](https://hack.booth.pm/items/6833516)

ちなみに昔、この人のハッキングラボ買ったんですけど、分厚すぎて積読期間1年を得て、挫折し、売り飛ばしてしまいました❤️

でも、こちらの薄い本でもできるはず！

---

## ■ MacでKali Linuxの環境構築、やっていきます！
今回は環境構築まで！

### ✅ Kali Linux をダウンロードするまで。

途中まではこちらを参考にしました！
参考：
🔗 [【初心者向け】MacでKali Linux環境構築してみた（Qiita）](https://qiita.com/royal_straight_flush/items/4e9fd831159056e2a449)

>brewは使える前提なので、ない人はこちらから
https://brew.sh/ja/

まずは仮想マシンアプリ「UTM」をインストール。

```bash
brew install --cask utm
```

### 💡Tips: `--cask`とは？

| 方法                           | 用途                  | 例                                   |
| ---------------------------- | ------------------- | ----------------------------------- |
| `brew install パッケージ名`        | CLIツールなど（ターミナルで使う系） | `brew install git`                  |
| `brew install --cask パッケージ名` | GUIアプリ（ウィンドウを持つアプリ） | `brew install --cask google-chrome` |


この辺、意識せず使っていた...

---

### 🔸 UTMとは？

**UTM** は、macOS上で**仮想マシン**を動かせるアプリです。
>WindowsやLinuxなどのOSを、Macの中でまるごと動かせます。
内部的には **QEMU** というオープンソースの仮想化ツールをベースにしていて、UIがとてもシンプルで使いやすいです。

...だそうです。
MacでVMを使うならこれって感じらしい。

---

### ❗ Kaliのバージョンが古かったので…
先ほどの参考にしていたサイトは、Kaliのインストール画面が違ったので(バージョン？)
Kaliインストールは以下を参考しました。
🔗 [MacでKali Linuxを最新版で導入する方法（2023年版）](https://fickle-it.net/2023/06/kali-linux-download-install/)

途中で**ドメインの設定**が出てきましたが、そこは「空欄」のままにして進めました（デフォルトでOK）。

---

## 🧠 Bootってなんやねん！！！

インストールが完了したあと、起動（Boot）してください
↑これが何もわからず、、、、、一旦VMを停止して色々みてみる

![スクリーンショット 2025-06-15 19.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038438/3b759f39-b142-4893-9128-dec7af77e3fa.png)

---

## 💿 Bootできない！？ → ISOが刺さりっぱなしでした

### ISO（インストーラ）がついたままだと、本体のKaliが起動できません。

つまり、「インストーラ起動モードのまま」だったらしい。

### 🔧 ISOを外す方法（UTM）

1. **起動中の仮想マシンを停止**（シャットダウン）
2. 仮想マシンが「停止済み」であることを確認

   * 右上に ▶（再生マーク）が出ていればOK！
3. UTMの左メニューで Kali Linux を選択
4. 右パネルの下の方にある「CD/DVD」項目を探す
5. そこに `kali-linux-2025.2-installer-netinst-amd64.iso` が表示されているはず
6. 右端の「小さな v ボタン（紫）」をクリック
7. 「消去」または「取り出す（Eject）」を選ぶ
   ※ 私の環境では「消去」でした！
8. CD/DVD スロットが「空」になればOK！

---

## 🎉 無事起動できた！！
bootってそういうことかーという感じでした。
無知無知の無知。
それじゃあ本体が起動しないのも当然っすね。

とりあえず環境構築終わってうれし〜〜〜〜〜〜〜〜！！！！


---
Raspberry Pi 4Bで自宅サーバー入門-①OSインストール

ふとサーバーをたてたいなと思い、入門してみます
初めてなので記録もかねてゆるゆる書いていこうと思います

次回→[Raspberry Pi 4Bで自宅サーバー入門-②ネットワーク設定]()

まずはOSインストールから

## 使うもの
* Raspberry Pi 4B (RAM:4GB, ROM:32GB)
* モニター
* マウス
* キーボード
* micro SDカード
* SDカードリーダー
* LANケーブル

* OSはUbuntu Server 24.04

## 手順

### 0. micro SDカードに使用したいOSを入れる
最小構成にしたいためUbuntu Server 24.04にしました
https://www.raspberrypi.com/software/ からraspbery pi osをダウンロード・起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953070/d5361f53-eea2-4f09-9441-bae82e9a0fba.png)
Raspberry Piデバイス→Raspberry Pi 4
OS→other general os>Ubuntu server 24.04
ストレージ→挿したのを指定
「次へ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953070/b94a8353-e080-4b1a-8a4d-94bfacfaaf82.png)
この時点でユーザ名などいろいろ設定できるみたいです　
ユーザ情報、ssh認証を設定しました。

### 1. ラズパイにいろいろ繋げる
→電源を入れたらどこからかパチパチ音が聞こえるがだけど大丈夫なのか...

### 2. OSインストール(Ubuntu)
手順0で書き込んだSDカードをラズパイに挿入する
電源を入れてCLI画面が表示され、設定したユーザネーム/パスワードでログインできたら完了！
※OSインストール時にユーザ情報を設定していない場合、初期ユーザ名/パスワードはubuntu/ubuntuです

次回→[Raspberry Pi 4Bで自宅サーバー入門-②ネットワーク設定]()
OpenAIのAPIキーの取得してみた

## はじめに
最近よく話題になるChatGPTなどの生成AI。  
「開発にも取り入れてみたいな」と思ったものの、API連携とかよくわからない…。

ということで、まずはAPIキーを発行してみるところから始めてみました。

調べてみると、個人で使う場合にも「組織名？」「課金？」「請求先住所って英語で書くの？」と、  
ちょっと戸惑うポイントがいくつかあったので、備忘録も兼ねて記事にまとめます。

## 概要
本記事では、OpenAIのAPIを利用するために必要な初期セットアップ手順を解説します。  
ChatGPT APIを使った開発を始めるためには、事前にアカウント作成・APIキー発行・課金設定などの準備が必要です。

具体的な手順は以下の通りです

- OpenAI アカウントの作成
- APIキーの生成
- クレジットカード情報の登録とチャージ設定（課金）

## OpenAIのアカウントを作成

### 1. OpenAIの公式サイトにアクセス

https://openai.com/ja-JP/api/

### 2. 「APIプラットフォーム」をクリックし、アカウントを作成

既にアカウント作成済の場合はそのままログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/180f41cc-8f3d-4fa4-8566-52037eaa9153.png)

### 3. 組織名の入力

個人利用であれば`Personal`や任意の名前で問題ありません。

![スクリーンショット 2025-06-15 16.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/964bff3e-3386-4b5c-9056-7cf076b6cbb4.png)



## APIキーを生成

### 1. ダッシュボードから「API Keys」を選択

左のメニューから「API Keys」をクリックします。

### 2. 「+ Create new secret key」 をクリック

新しいキーの作成画面が表示されます。

### 3. 任意のキー名を入力し、APIキーを生成

今回はあくまでテスト用のため、`test`という名前で作成しました。

### 4. 表示されたAPIキーを安全な場所に保存

※このキーは**一度しか表示されないため注意してください**。
必ず安全な場所にコピーして保存しておきましょう。

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/c76f9cc9-0cd5-4639-a128-e576e5267b5d.png)


## クレジットの購入(課金設定)

OpenAI APIは前払い制なので、最初にクレジットをチャージする必要があります。

### 1. 設定から「Billing」を選択

「Add payment details 」をクリックし、支払い設定を開始します。

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/66a2f1f6-a7dd-44d1-add5-6e9d28fadf3a.png)


### 2. クレジットカード情報を入力

請求先住所は、クレジットカードに登録されている住所と一致させてください。

### 3. 初回クレジット購入金額を入力

- 初回の課金額を指定します
- 学習用途の場合は自動チャージをオフにしておくと安心です（必要に応じて後で変更可能です）

![スクリーンショット 2025-06-15 17.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/525d53fa-bb9e-4022-8404-504fffd757bd.png)

## おわりに
この記事では、ChatGPT APIを使う前段階の「APIキー取得」までの流れをまとめました。

まだ実際にAPIと連携してはいませんが、キーの準備と課金設定まで完了すれば、
自作アプリなどからの接続・実装ができる状態になります。

今後は、FlaskとOpenAIのAPIを連携させて、色々試してる予定です。
同じように手探りで試してみたい方の参考になればうれしいです！
AWS Certified Machine Learning - Specialty(MLS-C01) を更新しました

# はじめに
AWS認定コンプリートを目指すべく、MLS-C01を更新しました。

# AWS Certified Machine Learning - Specialty(MLS-C01) とは
[この辺](https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/)を参照ください。

# 教材
## 講義
1. [Exam Readiness: AWS Certified Machine Learning - Specialty (MLS-C01) (日本語)
](https://explore.skillbuilder.aws/learn/courses/629/exam-readiness-aws-certified-machine-learning-specialty-mls-c01-ri-ben-yu)
    - 公式版、無償です。
## 問題集
1.[Cloud License](https://cloud-license.com/exam/mls/)
    - いつものです。
    - 308問(選択式:44x7問)です。
    - これだけでOKかと。
1. [CloudTech](https://kws-cloud-tech.com/)
    - 最近流行りだしています。
    - 2025/6/12から問題を刷新しています。
    - 以前の問題の方が役立ちましたが6/15に非公開となりました。
    - 以前はCloud Licenseに近かったですが、大分変ってしまいました。

# 結果&感想
Cloud LicenseだけでOKです。
[Android]root化したPixel9のアップデート

root化したPixel9にアップデートをあてる手順の備忘録です。
# 0.前提条件
+ root化済（bootloader unlock + Magisk導入）のPixel9を使用しています
+ アップデートする前のAndroidバージョンは14、ビルド番号はAD1A.240530.047です
+ アップデート後はAndroid15、ビルド番号AP4A.241205.013です
+ 今回の作業はWindowsで行いました。Macもほとんど同じ作業ですが、一部用語が異なる場合、読み替えてください

そもそものroot化は以下の記事を参考にしてください。
https://qiita.com/momorito/items/d8839ca81080844760de

# 1.必要なファイル
## (1)アップデート前のビルド番号のfactory image内に含まれているinit_boot.img
[Nexus デバイスと Pixel デバイスのファクトリー イメージ](https://developers.google.com/android/images?hl=ja)から、現在のバージョン（今回ならばビルド番号AD1A.240530.047）と同じfactory imageをダウンロードします。ダウンロードして解凍（展開）したfactory image内のzipファイルを再び解凍（展開）し、その中に入っているinit_boot.imgを、adbのパスが通っているフォルダに格納しておきます。

## (2)アップデート後のビルド番号のfactory image内に含まれているinit_boot.img
上と同じく[Nexus デバイスと Pixel デバイスのファクトリー イメージ](https://developers.google.com/android/images?hl=ja)からアップデート後のバージョン（今回ならばビルド番号AP4A.241205.013）と同じfactory imageをダウンロードします。ダウンロードして解凍（展開）したfactory image内のzipファイルを再び解凍（展開）し、その中に入っているinit_boot.imgを、Pixel9内の自分でわかりやすいフォルダ（私の場合はとりあえずDownload）に格納します。（後でMagiskでパッチをあてるため。）
# 2.手順
大まかな手順は下記のとおりです。
1.init_boot.imgを通常に戻す
2.通常どおりPixel9をアップデートする
3.Magiskでinit_boot.imgにパッチをあて、Pixel9に適用する

## (1)init_boot.imgを通常に戻す
Pixel9をPCとつないで、コマンドプロンプトからbootloaderに入ります。
```
adb reboot bootloader
```
bootloaderに入ったら、下記コマンドからinit_boot.imgを通常のものに戻し、再起動します。
```
fastboot flash init_boot_a init_boot.img
fastboot flash init_boot_b init_boot.img
fastboot reboot
```
##  (2)通常どおりPixel9をアップデートする
Pixel9本体から、設定→システム→ソフトウェアのアップデートでアップデートします。
※前述の[Nexus デバイスと Pixel デバイスのファクトリー イメージ](https://developers.google.com/android/images?hl=ja)からOTAをダウンロードし、sideloadする方法もありますが、今回は割愛。

## (3)Magiskでinit_boot.imgにパッチをあて、Pixel9に適用する
アップデートが済んだら、Pixel9の任意のフォルダ（今回はDownload）にアップデート後のinit_boot.imgを入れておきます。

Magiskを開いて、「インストール」→「パッチするファイルの選択」で事前に用意しているinit_boot.imgを指定し、「はじめる」を押します。
少しの間処理が走り、「All done!」が出たら終了です。init_boot.imgが入っていたフォルダに、「magisk_patched-********.img」というファイルが作成されているはずなので、ファイルを作業用のPCのadbパスが通っている場所に移します。

再びPCとPixel9を接続し、bootloaderにアクセスします。
```
adb reboot bootloader
```
bootloaderに入ったら、下記コードでinit_bootをflashします。
（Magiskでパッチを当てたファイルを、init_boot_aとinit_boot_bの両方にflashします。）
無事終了したら、再起動します。
```
fastboot flash init_boot_a magisk_patched-********.img
fastboot flash init_boot_b magisk_patched-********.img
fastboot reboot
```
これで、rootedなPixel9のアップデートは終了です。
新機能追加で既存機能を壊さないためのポイントを考える

新しい機能の開発において既存のコードを変えてしまうことがある。
変えてしまうというのはおかしいか。必要なら変更は必要だ。

でも基本は既存のコードを変えずに、新しい機能はそれに順応するように作るべきである。

新しい機能を開発する時に意識するべきポイントをまとめる。
そうすることで他への影響を可能な限り減らすことができるからだ。

# Open / Close原則を意識する

クラスやモジュールは拡張に対して柔軟にする。
変更は既存部分は変更が加わらないように設計にする。


# 変更箇所の依存関係を把握する

修正対象のコードが他の機能から呼ばれていないか確認をする。
例えば既存関数を変更する場合はその関数を利用している別機能がないかを調査。
必要なら影響を受ける箇所も修正・テストする。

    
# 変更は小さく局所的に
一度に大規模な改修を行わずに機能ごとに変更範囲を限定する。

変更が小さいほどレビューやテストが容易になる。
結果として不具合発生時も原因を特定しやすくなる。


# 既存のルールに合わせる
チームで既に決まっているコーディング規約やプロジェクト固有のスタイルがあれば新しいコードもそれに揃える。

# テストを取り入れる
バグやデグレを防ぐことができる。

# コミットの粒度とメッセージ
1コミットには1つの意味のある変更だけを意識する。
タスクを分けて整理をすることでレビューと調査がしやすくなる。

# ロジックの責務分離
コントローラやBladeビューにビジネスロジックを書きすぎないようにする。

複雑な処理はモデルのメソッドやサービスクラス（app/Services等）に委譲する。
コントローラは「入力の受け渡しと結果のビューへの引き渡し」に専念させる。

ビューには極力生PHPコードを埋め込まない。
必要なデータはコントローラで用意して渡すようにする。

# フレームワークの機能を尊重する
Laravelが提供する標準機能はなるべくそのまま使う。
独自拡張や上書きは慎重に。
Laravelのコアを直接書き換えたり、本来の使い方から逸脱した利用はしない。


不得意なもの、意識しなければいけないものはカレンダーに書いて朝仕事に取り掛かる前に読んでいる。
癖付けていく！！
window10で.batファイルをタスクバーにピン留めする覚書

.batのショートカットを作成する
↓このままではドラッグしてもタスクバーに登録できない
ショートカットを右クリック →「プロパティ」
↓
cmd.exe /c ←これをリンク先の先頭につける
cmd.exe /c "フルパス\あなたのバッチファイル.bat"
このじょうたいでドラッグすればタスクバーにピン留めできる


*「プロパティ」→「アイコンの変更」
でアイコンかえられるよ
【Go言語】WebフレームワークEchoとPostgreSQLを使ったCRUD処理

# 参考にした記事

今回は、こちらの記事を参考にしました。

見た目はほぼ同じですが、違う点は下記です。
■データベースにPostgreSQLを使用していること
■`論理削除`から`物理削除`に変更していること

以上の2点を踏まえて、また備忘録として記載していきます。

https://qiita.com/technoscape/items/4624f98df9b7c7d67bd4#go--echo--gorm%E3%81%A7todo-web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%9C%80%E9%80%9F%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F


# サンプル
## 登録
![Go1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/304f6e84-2ffc-04c7-38ff-c4b107a26cd4.png)


![Go2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/418388b4-cdeb-a507-d5f2-3644649d68d0.png)

![Postgres登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/521155d7-64a6-81b2-ca89-1cfdd158e971.png)

## 更新

![Go3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/13ef0fa9-7fad-87a5-954b-58045ce1fd3e.png)

![Go4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/e8440b93-073c-6748-1649-0ff9fe15a9d5.png)


![Postgres更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/b7286d56-cf40-5c72-daee-1d8ca3c6107c.png)

## 削除

![Go5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/a466feb1-5535-5119-86d5-abd4a026084d.png)








# 参考にしたサイト
■Deleted_at(論理削除と物理削除)

gorm.DeletedAt と Delete をあれこれ検証してみた [GORM]

https://tomi-no-tubuyaki.com/programming/go-ini/

https://gorm.io/docs/#Install

https://gorm.io/ja_JP/docs/connecting_to_the_database.html

https://qiita.com/ume-bar/items/91182bf1f0ed5968e9eb

https://qiita.com/technoscape/items/332b61ad48a50b1d172d

https://qiita.com/taka23kz/items/cb7ae9ac6cf343b3dec2

https://qiita.com/hiro9/items/e6e41ec822a7077c3568

https://qiita.com/technoscape/items/4624f98df9b7c7d67bd4#go--echo--gorm%E3%81%A7todo-web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%9C%80%E9%80%9F%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F

https://ramble.impl.co.jp/7371/


https://www.youtube.com/watch?v=STP4f1Ue33w

https://gorilla.github.io/

https://qiita.com/shioccii/items/72529ed888117e665186

https://medium.com/@kataras/how-to-use-iris-and-postgresql-for-web-development-e8c46d72f1e6

https://edwinsiby.medium.com/performing-crud-operations-in-postgresql-with-go-42657761125c

https://techwasti.com/building-a-rest-api-with-gorm-echo-framework-and-postgresql-in-go

https://www.golanglearn.com/golang-tutorials/golang-crud-rest-api-with-echo/

https://blog.stackademic.com/golang-crud-rest-api-with-echo-a1599b35fe4f

https://qiita.com/syukan3/items/bc92475c6c795128b9dc#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB

https://qiita.com/kaino5454/items/ed679c20af786758892f

https://qiita.com/kaino5454/items/ed679c20af786758892f
code server＋tailscaledで自宅のcode serverを外出先から使えるようにする

## 前がき
外出先からipadなどでvs codeを動かせるようにしたい。そこで、vs codeのOSS版をサーブできるcode serverをMacにホストし、それにVPNから接続できるようにする。VPN接続は、操作が簡単な上に公開IP割り当てやポート解放の必要がないtailscaleを採用した。

## 動作環境
ホストマシン：Mac mini m1、クライアントマシン：ipad。
ホスト、クライアントともにtailscaleが使える必要あり、ホストはcode serverをホストできる必要あり。

## 動作手順

### tailscaleでデバイス登録

まずはtailscaleでユーザー作成(googleやappleのアカウント連携)する。その後ホスト・クライアントともにアプリDLとログインを行い、自分のtailscale環境にマシンを登録していく。画面に従えば簡単だったので詳細は割愛。[tailslaceのマシン一覧](https://login.tailscale.com/admin/machines)

### ホストマシンにtailscaleのSSL証明書を登録

Mac限定？かもしれないが、前の手順でホストマシンにtailscaleを入れるとき、apple storeからのダウンロードを推奨され、そのままだとCLIからtailscaleのコマンドが打てない。以下のコマンドでエイリアスを作成しtailscaleコマンドを打てるようにする。(ログアウトしても使えるようにするには~/.zshrcに追記)

```bash
alias tailscale='/Applications/Tailscale.app/Contents/MacOS/Tailscale'
```

tailscaleでは、デフォルトでMagic DNSという機能が搭載されており、[tailslaceのマシン一覧](https://login.tailscale.com/admin/machines)からホストマシンを選ぶとすでにdomain名がついていることがわかる。(もちろんVPN接続していないマシンからは接続できない)　これだけでも

証明書発行

```bash
tailscale cert [tailscale magin dnsでマシン(mac)に割り当てられたドメイン]
```

### code server

code server ダウンロード

```bash
curl -fsSL https://code-server.dev/install.sh | sh
```

configファイルからパスワードを確認　or 変更

```console
% cat ~/.config/code-server/config.yaml
bind-addr: localhost:8080
auth: password
password: [ランダムな文字列]
cert: false
```

サービスを登録
```bash
brew services start code-server 
```

tailscaleでサーブ。
```
tailscale serve --bg --set-path=/ 8080
```
【パンダ本トラブルシュート】VirtualBoxにKali Linuxをインストールするまで

ハッキングを2時間で始める本　を読んでいる。
環境構築だけで2時間以上かかったので記録に残しておく。

# 環境
Windows11　Home
x64

# KaliLinuxのダウンロード
Kali Linuxのダウンロードしたところ、WindowsDefenderでウイルス検出の表示が出てダウンロード完了しなかった。
WindowsDefenderを一時的に無効化したところ、ダウンロード完了。

# VirtualBoxのダウンロード、インストール
ダウンロードはできた。
exeを起動すると、すぐに中断。
Microsoft Visual C++ 2019 を先にインストールしてくれという内容らしい。
こちらから　サポートされている最新の Visual C++ 再頒布可能パッケージ　とやらをダウンロード
https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170
自分のPCのアーキテクチャがx64であることは、以下を参考にして調べた。
https://www.cc-camp.com/search-windows-cpu-architecture/

パッケージのインストールができたらしく、PCの再起動を求められたので再起動。

VirtualBoxのexe起動してみると今度はインストールが完了。

# Kali Linuxのインストール
再起動でWindowsDefenderが有効に戻っていてダウンロードファイルを展開できなかった。
その際ダウンロードしたファイルも消えた。
改めてWindowsDefenderを無効にしてダウンロード＆インストール再開。

KaliLinuxをVirtualBoxに入れるところまではできた

# VirtualBox内のKaliLinuxの起動
エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/4c95ffef-d32b-4d80-a466-921b0bf55744.png)

https://nissy-lab.com/blogs/virtualbox-error-in-supr3hardenedwinrespawn/
リンクを参考に作業。
ターミナルのアイコンを右クリックし、「管理者として実行」を選択。
「sc.exe start vboxsup」を実行。
起動できるようになった。

# 最後に
これでVirtualBoxからKaliLinuxを起動することができた。
「Ajax通信できますか？」から考える伝えることの大切さ

# はじめに
現在、案件探し中のフリーランスエンジニア（３年目）です。先日、新しいエージェントに登録した際、自分のスキルの説明で気付いた「できる・できない」じゃない大事な伝え方を考えました。

# 久しぶりの案件探しで、よみがえるトラウマ
私は「Ajax通信できますか？」という質問が苦手です。「Ajax通信」は初めての業務委託先で「できない」と答えたことでとても嫌な思いをし、嫌いな存在となっていました。そこからAjax通信について理解を深める努力もせず、「きっと非同期通信のかなり難しい技術なんだろうな」と思っていました。
そして久しぶりの案件探しで、「Ajax通信できますか？」と聞かれました。あの頃から何も変わっていない私は、単純に「できません」とだけ答えた結果、スキルのアピールが十分にできず、案件紹介に影響が出ていると感じています。

# なぜ「できません」と答えたのがまずかったのか
Ajax通信にもチャレンジしてみるか、と重い腰を上げた本日、自分がものすごく悲惨な勘違いをしていたことに気がつきました。**Ajax通信が「jQueryでよく使われていた非同期通信」であることを初めて知った** のです。つまり、エージェントは「非同期通信ができるか？」と聞いていたのです。これに対して、今なら全く違った返答ができます。**「jQueryを使わないで非同期処理ができます」** とか **「fetchでエラー処理にtry-catch使ってます」** とか答えていれば、全く違った結果になったと思います

### Ajaxのトラウマからの解放
ここで自分が今まで行ってきた非同期処理を振り返ります。
 * CMSを導入していないサイトで、**一覧ページから読み込んで最新コンテンツを表示。** （jQueryの.load()でHTMLまるごと取得）
 * fetch を使った非同期通信で、**try-catchによるエラーハンドリングを実装。** APIサーバーが落ちていたときユーザーに「取得できませんでした」と表示。
 * **ユーザー情報をデータベースに登録・取得・更新・削除する一連の非同期処理** を、supabase.from(...).insert() などの関数を使って実装。
 * ブラウザの**ローカルストレージにJSON形式でデータを保存** し、画面に反映するToDoアプリを開発

非同期処理、めちゃくちゃ身近でした。ちゃんとスキルの棚卸しをすれば、自信がつく。もっとアピールできる。胸を張って自分のスキルを説明できるようになりました。

# モダンJSで勝負したい
### 自分のこれからのキャリアを考える
ES6以前のエラーとバグと隣り合わせだったJavaScriptにとても苦しみました。先人のコードを読み解き、エラーを解消する。そんな現場で苦しんだ中、ES6のJavaScriptとTypeScriptのエラー処理が素晴らしく、めちゃくちゃに感動しました。

「Ajaxできますか？」という質問には、**jQuery主体の開発現場で働けますか** と暗に聞いているようにも感じます。
私は、モダンな現場で働きたい。jQuery主体の現場は、もしかしたらモダンじゃない可能性が高い。
「jQueryを使わないで、JavaScriptで非同期処理ができます」と言えれば、**開発環境や考え方の違いがはっきり見え、ミスマッチが減らせれるのでは** と思いました。

# ちゃんと伝えればきっとうまくいく
エージェントは「非同期通信ができるか」を聞きたかっただけかもしれません。
私はなんだかすごそう...と思って知らない単語をそのままにしてしまう傾向があります。例えば「Vanilla JS」とか「フルスクラッチjs」とか。でも**言葉を理解すれば、自分のできることに当てはめることができます。**
私は普段からJavaScriptでマークアップをしています。もうずっと前から**jQueryは使っていないので、ライブラリを使わないでJavascriptを書いています。** これってきちんと説明しなければ、伝わりません。「できる・できない」じゃなくて「やっていること」を伝えるのが重要だと感じました。

単語にとらわれず、**できることを正しく説明できる** と、自分のスキルをより具体的に伝えられます。
* 自分の成果物を**非エンジニアに向けて文章で説明できる** こと
* 知ってる**ワードを並べて伝えた気持ちにならないこと**
* できないじゃなくて**できることを伝えること** 

# おわりに
わたしは「Ajax通信ができません」と伝えたことで、自分のスキルを十分に説明することができませんでした。
自分の言葉で、自分がやってきたことを説明できていれば、違った結果になっていたと思います。
この考え方が、あなたのキャリアをより良い方向に導くヒントとなれば嬉しいです。