OmniAICreator/Qiita-1.07M huggingface dataset:
#92　Github Codespacesをつかってみる

# はじめに
先日、GitHub Codespacesの存在を初めて知りました（遅い）。これは便利そうだ！と思いさっそく軽く使ってみました。

# Github Codespacesとは？
GitHub Codespacesは、GitHubが提供するクラウドベースの開発環境です。開発者がコードを書くために必要なツールや設定をクラウド上にセットアップし、どこからでも簡単にアクセスできるようにすることができます。従来のローカル環境に依存せず、ブラウザさえあればどこからでも開発を開始できる点が大きな特徴です。

# GitHub Codespacesの主な機能
・クラウドベースの開発環境
GitHub Codespacesはクラウド上に完全な開発環境を提供します。これには、VS Codeベースのエディタ、ターミナル、デバッガーなどが含まれており、ローカルでの開発と同様の操作感を得ることができます。
<br>
・高速なセットアップ
コードスペースは、リポジトリの設定に基づいて自動的に構成されます。DockerfileやDevcontainer設定を使って、必要な依存関係やツールを事前にセットアップできるため、新しい開発環境を瞬時に立ち上げることが可能です。
<br>
・カスタマイズ可能な環境
各開発者が個別に環境をカスタマイズできるため、作業スタイルやプロジェクトのニーズに応じた開発環境を簡単に構築できます。
<br>
・シームレスなGitHub統合
GitHubと直接統合されており、リポジトリのクローン、ブランチの切り替え、プルリクエストの作成など、GitHubの操作が簡単に行えます。

# GitHub Codespacesの使い方
コードスペースの作成: GitHubリポジトリにアクセスし、「Code」ボタンをクリックすると、「Open with Codespaces」というオプションが表示されます。これを選択すると、指定されたリポジトリのコードスペースが作成され、すぐに開発を開始できます。
今回は試しにExpress.jsのプロジェクトをアップロードして実行してみようと思います。

<img alt='codespace-1' src='https://www.nxted.co.jp/blog/img/98/codespace-1.png'><br>
↓
<img alt='codespace-2' src='https://www.nxted.co.jp/blog/img/98/codespace-2.png'>


一度コードスペースが立ち上がれば、通常の開発作業を進めることができます。コードの編集、デバッグ、テストなど、VS Codeと同様の機能がクラウド上で利用可能です。

<img alt='codespace-3' src='https://www.nxted.co.jp/blog/img/98/codespace-3.png'>

Codespaces上のターミナルでアプリを起動させると以下のように表示されます。

<img alt='codespace-4' src='https://www.nxted.co.jp/blog/img/98/codespace-4.png'>

ブラウザーで開くと以下のように無事アプリが起動していました！便利！

<img alt='codespace-5' src='https://www.nxted.co.jp/blog/img/98/codespace-5.png'>

# GitHub Codespacesのメリット
①どこからでも開発可能
クラウド上に環境があるため、インターネット接続さえあれば、デバイスや場所を問わず開発が可能です。特にリモートワークや旅行中でも、安定した開発環境を提供できます。
<br>
②開発環境の一貫性
チーム全員が同じ開発環境を使用できるため、環境依存の問題を減らし、コードが「自分の環境では動くのに…」という問題を回避できます。
<br>
③迅速なセットアップ
新しいプロジェクトやオンボーディングの際に、煩雑なセットアップ作業を省略し、すぐに開発に集中できます。
<br>
④強力なパフォーマンス
GitHub Codespacesは、クラウドベースのため、ローカル環境に依存せず、高性能なサーバーリソースを活用できます。これにより、大規模なプロジェクトでも快適に開発が行えます。

# まとめ
今回は、GithubCodespacesの機能について軽く触れてみました。私自身Codespacesを初めて使い、そのポテンシャルの高さを実感しました。色々と便利すぎるぞ。他にもクラウドベースの開発環境サービス等はありますが、Githubと直接連携しているのがまた良いかなと。とても便利で、使い方など掘り下げていく必要性を感じました。
特に、リモートワークやチーム開発が増える中で、一貫した開発環境を迅速に提供できることは大きなメリットになるかと。クラウドベースの開発環境に興味がある方や、チームの開発効率を向上させたい方は、ぜひ一度GitHub Codespacesを試してみてください。
COUNTIFの結果が"#VALUE"になるエラーの解決法

こんにちは、きくはなです。
最近業務でExcelに触れる機会があったのですが、せっかくなので知見を共有します。

# 結論
SUM関数とIF関数を組み合わせた数式を代用する。

```
//変更前
=COUNTIF([Source]Sheet1!$A$1:$A$8,"a")

//変更後
=SUM(IF([Source]Sheet1!$A$1:$A$8="a",1,0))
```

# そもそものおはなし
COUNTIF関数は、配列から条件に合う要素の数をカウントできる関数です。
しかし、別シートや外部ブックを参照した場合、"#VALUE"が返されてしまうことがあるようです。
（原因はよく分かりませんでした...）

公式ドキュメントを参照すると、別の関数を組み合わせた代用式を用いることを推奨しています。

https://support.microsoft.com/ja-jp/office/countif-countifs-%E9%96%A2%E6%95%B0%E3%81%AE-value-%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-04a616cc-b119-4057-917f-b9b11f1f589d

https://learn.microsoft.com/ja-jp/office/troubleshoot/excel/formula-returns-value-error

# 詳細な解説
公式ドキュメントでは変更前と変更後の数式が提示されているだけなので、少し細かく分析してみましょう。

先ほどの例をもとに解説すると、
```
//変更前
=COUNTIF([Source]Sheet1!$A$1:$A$8,"a")

//変更後
=SUM(IF([Source]Sheet1!$A$1:$A$8="a",1,0))
```
COUNTIF関数は、配列から条件に合う要素の数をカウントできる関数です。
変更後の数式は、まずIF関数で条件に合う要素を1,それ以外を0に変換してから、SUM関数で合計しています。
1の集まりを、条件に合う要素分足すので、そのまま条件に合う要素の数になる、という仕組みですね。

余談ですが、SUMIF、COUNTBLANK関数でも似たような問題が起こるそうです。こちらについてもSUMとIFの組み合わせで解決可能なようです。

### SUMIF

```
//変更前
=SUMIF([Source]Sheet1!$A$1:$A$8,"a",[Source]Sheet1!$B$1:$B$8)

//変更後
=SUM(IF([Source]Sheet1!$A$1:$A$8="a",[Source]Sheet1!$B$1:$B$8,0))
```

### COUNTBLANK

```
//変更前
=COUNTBLANK([Source]Sheet1!$A$1:$A$8)

//変更後
=SUM(IF([Source]Sheet1!$A$1:$A$8="",1,0))
```
AWS Certified Cloud Practitionerを受けてみた

# AWS Certified Cloud Practitionerを受けてみた
2025年5月7日にAWSの認定資格の「AWS Certified Cloud Practitioner」通称CLFを受験しました。
その結果とどういう勉強をしたかをここに残します。
## なぜ受けたか
なんちゃってSEとして5年が経ってしまいました。このままではなにも自分の中にスキルが残せないと焦りを感じ、昨今のクラウドブームでインフラの技術に興味があったのでAWSの資格を取ろうと思いました。
要は焦りです。
## いつからどういう勉強を始めたのか
私が勉強を始めたのは2025年の1月末頃だったと思います。朝の通勤電車でUdemyの模擬試験をいきなりやり始めました。その時期は仕事もプライベートもとても忙しく、勉強は朝の電車内とたまに昼休みにしかやっていませんでした。
そんな片手間な勉強が2025年の5月頭まで続き、まじめに机に向かって試験対策をし始めたのは試験を受ける3日前位からです。
ちなみに私が使用したUdemyの講座は下記のものです。セールなら1500円で買えますので良ければ参考にしてください。
<https://www.udemy.com/course/aws-4260/?couponCode=ST6MT60525G2>
そんなこんなでやっと机に向かって間違えた問題や重要箇所の勉強し始めて3日目の5月7日。朝から勉強してましたが、いつ試験受けるか決めないと集中できなくなってしまったので、その日に自宅のPCでオンライン試験を申し込みました。16500円もする試験なのでそんな感じで受けるのは間違いだと思いますが、私はそういう人間なので。皆さんは後悔しないように準備しましょう。
ちなみに試験を受けるまでにUdemyの模擬試験と間違えた問題の復習、重要箇所の学習をネットで調べる程度の学習しかしておらず、模擬試験は本番相当試験が4つありますが、合格基準点の70%の正解をしたことは1度もありませんでした。本当になぜ試験を受けようと思ったのか考えられませんね(笑)
## 試験を受けてみて
結果的に言うと試験には合格することができました。1000点満点で700点が合格基準点。私の得点は731点で合格点ギリギリでした(笑)そりゃそうですよね(笑)
合格できた理由を自分なりに分析しました。
1つ目、Udemyの試験が少し難しかった。
Udemyの試験は選択肢がどれも似たようなサービスを並べてきていて毎回非常に悩んでいたのですが、本試験は割と選択肢で迷う設問は少なかったです。模擬試験で似たサービスの差別化をして覚えるのは大事ですが、初級試験なのでサービスの概要がわかる程度でも問題ないかもしれません。
2つ目、重要箇所をなんとなく理解していた。
CLF試験は初級試験でもあるので、AWSの基本理念やクラウドの考え方を重視した試験です。
「AWS Well-Architected フレームワーク」「クラウド導入フレームワーク」「グローバルインフラストラクチャ」の部分を唯一模擬試験以外で勉強しました。この部分はいくつも問われますので重点的にやっておくべきだと思います。
これらの理由が今回模擬試験で十分に点を取れていなくても合格できた理由だと思います。
## まとめ
実際に試験の勉強をしている中で様々なサービスの存在を知り、自分で使ってみたいという気持ちになっているので次のステップの資格取得の過程でサービスを実際に触っていこうと思います。
クラウドプラクティショナーは初級試験ですが、概念をしっかり学ばないと普通に落ちると思いますので皆さんは十分に準備して臨んでください。
ただ、私の記事を読んで意外と何とかなるという自信を持ってもらうのもうれしいことですのでほどほどに参考にしてくださいｗ
【Mac】shutdownコマンドの使い方


##  すぐにシャットダウン

```terminal
sudo shutdown -h now
```

## すぐにスリープ

```terminal
sudo shutdown -s now
```

## すぐに再起動

```terminal
sudo shutdown -r now
```

## 10分後に再起動

```terminal
sudo shutdown -r "+10"
```

## 午後2時にシャットダウン

```terminal
sudo shutdown -h 1400
```

## 2025年5月10日午前11時30分にリブート（入力フォーマット：YYMMDDHHMM）

```terminal
sudu shutdown -r 2505101130
```

## 参考

https://keith.github.io/xcode-man-pages/shutdown.8.html
#91　AWS Certified DevOps Engineer Professional (DOP-CO2) 受験録

# はじめに
今回は、AWS DOP-CO2（AWS DevOps Engineer Professional）に合格した体験についてシェアしたいと思います。
この資格を目指す方々の参考になれば幸いです。

# 結果
スコアは850点で合格でした。合格基準が750点なので、余裕を持って合格することができました。
また、各セクションのスコアにおいても「コンピテンシーを満たしている」という評価を得ることができ、非常に満足のいく結果でした。

・試験結果
<img alt='dop-result' src='https://www.nxted.co.jp/blog/img/97/dop-result.png'>
・試験詳細
<img alt='dop-result-detail' src='https://www.nxted.co.jp/blog/img/97/dop-result-detail.png'>

# 勉強の始まり
私がAWS DOP-CO2の受験を決意したのは、これまでにAWSのアソシエイトレベルの3つの試験（ソリューションアーキテク、デベロッパー、システムオペレーター）に合格し、さらに知識を深めたいと考えたからです。AWSでのDevOpsエンジニアとしてのスキルをさらに磨くことを目指し、このプロフェッショナルレベルの資格に挑戦しました。

# 実践した勉強方法
1, [Cloud License](https://cloud-license.com/)の問題集
3回解きました。これにより、試験の出題傾向やよく問われるポイントを把握することができました。
<br>
2, Udemyの模擬試験とハンズオン
各模擬試験を2回ずつ解きました。これにより、試験環境に慣れ、時間配分や回答のスピードを調整することができました。
<br>
・模擬問題集
[【DOP-C02対応 2025年版】AWS認定 DevOpsエンジニア プロフェッショナル 問題集【2回+α 205問】](https://www.udemy.com/course/dop-c02-2024aws-devops)
※実際に利用したのは[2024年版]になります。
<br>
・ハンズオン
[AWS Certified DevOps Engineer Professional 2024 - DOP-C02](https://www.udemy.com/course/aws-certified-devops-engineer-professional-hands-on/)
<br>
3, AWS公式の問題:
[AWSが提供する公式のサンプル問題（20問）](https://aws.amazon.com/jp/certification/certification-prep/)を解きました。これにより、公式な出題形式や質問のパターンを確認することができました。
個人的な意見として難易度は本試験と同等かそれ以上で、上記の模擬問題集より難易度は高い印象を受けました。


# 試験当日
以前にAzureの試験を自宅で受験したことがあったため、今回も自宅受験を選択しました。
Azureの試験の際に自宅受験でも特に問題なかったのですが、今回は受験に使用するソフトウェアがフリーズしたり、
やたら反応が悪くなったりと、集中を保つのが非常に難しかったです。
このトラブルのせいで？すべての問題を解き終えたのは試験終了3分前でした。。。汗
自宅で受験できることはとても便利はありますが、こういったトラブルの際に対応が難しくなってしまうので、極力テストセンターで受けるのをお勧めします。
今回のトラブルの原因は分かりませんが、次回以降はテストセンターで受験しようと思っています（笑）

# 感想
3時間という長時間の試験は、集中力を保つのが非常に難しかったです。問題文や選択肢の文章が長く、一つ一つの問題に対して慎重に取組む必要がありました。
さらに本番では模擬試験や練習問題では見たことのないような問題も多数出題され、正直なところ、解答しながら受かるかどうか冷や冷やしていました。
試験全体を通じ、これまで学習してきた知識を総動員し、未知の問題に対しても論理的に考え、解答を導き出す力が求められる印象を受けました。

# おわりに
2025/5でソリューションアーキテクト-アソシエイトの有効期限が切れてしまうため、次回はAWS Solution Architect – Professionalを受験予定です
AWS Solution Architect – Professionalを受験した際には、またここで受験結果や学習方法についてシェア出来たらと思います！
MacのFinderからターミナルをショートカット一発で開きたい

MacのFinderからすばやくターミナル開きたいですよね。

以下の設定をすれば、Macのショートカット一発で選択したフォルダをカレントディレクトリにターミナルが開けます。
（macOS13:Ventura以降なら対応できるはず...）

1. システム環境設定 > キーボード > キーボードショートカット > サービス > ファイルとフォルダ > 「フォルダに新規ターミナル」をON
2. 右側をクリックしてショートカットキーを登録
（画像では「Command + Shift + E」を当てています）

![スクリーンショット 2025-05-07 22.03.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/0a362a7f-95e1-4473-aff5-4098d0459ed2.png)
 ↓ 
![スクリーンショット 2025-05-07 22.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/3e187760-6234-4266-957e-985d16e0a776.png)

ショートカットキー１発で開けました！
![スクリーンショット 2025-05-07 22.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/fed6847a-1e6b-491d-b145-1349ace77add.png)

Windowならエクスプローラで「Ctrl+L」 → 「cmd」入力で選択したフォルダをカレントディレクトリにしてシェル開けますよね。
あいさつ 大渕凜とは誰ですか

# 自己紹介
## こんにちは
はじめましての方ははじめまして。
私は**大渕凜**と申します。
*パラレルデザインエンジニアを自称しています*

## 何をしていますか
公立大学法人**長岡造形大学**に所属する大学生です。
専攻はテクノロジー・体験デザイン。趣味で映像もやっています。
普段はArduinoとかDavinci Resolveを触っています。

## 創作に対するスタンス
自分で何かものを作るというのは苦しいこともありますが基本楽しいですね。
この世界に対する自分の解釈とか思考を再構築することですから、時々沼にハマってしまいますが。最終的にできた成果物と、それに対する評価をまた自分の経験に取り込むことで、自分も、この世界も、より面白い未来に一歩近づくでしょう。それを信じて私は今日も何かを思考しています。
そんなことより手を動かすべきと大学のスタッフに言われました。大正論ですね。

## 最近のおはなし
2025年春現在、JavaScriptと中国語(普通話)の2つの言語を勉強中です。
またStudio Oneも使い始めました。

# 私を取り巻く環境
## サークル
TECH☆TECHというサークルを運営しています。
TECH☆TECHは電子工作やメディアアート、PC関連のアレコレについて学生同士でサポートしながら作品を作る「先端メディア表現サークル」です。
興味がある方は`@nid_techtech`までDMをください

## 執筆環境
普段のメモや日記、見通しを立てるなどにObsidianというテキストエディタを使っています。
ObsidianにはPublishというテキストをそのままWebサイトとして公開するプラグインがあるのですが、サブスクの値段が高いのでQiitaに移行しました。
昔Publishで書いた記事をQiitaに移植する作業を順次進めつつ、新しい記事もQiitaで書いていきます。

## SNS
TwitterおよびInstagramは`@rinfromniigata`です。

# そんな感じ
よろしくお願いします。
【Jest】ReferenceError: TextEncoder is not definedエラーが発生する

# はじめに
テストを実行しようとした際に、表題のエラーが発生しました。

# 問題

```shell
● Test suite failed to run

    ReferenceError: TextEncoder is not defined

      1 | import { useEffect, useState } from "react";
    > 2 | import { useNavigate, useParams } from "react-router";
        | ^
      3 | import { getUserById } from "../utils/supabaseFunctions";
      4 | import { User } from "../domain/user";
      5 | import { Box, Button, Card, CardBody, Heading } from "@chakra-ui/react";

      at Object.<anonymous> (node_modules/react-router/dist/development/index.js:9351:15)
      at Object.<anonymous> (src/cards/UserCard.tsx:2:1)
      at Object.<anonymous> (src/__tests__/userCardComponent.spec.tsx:2:1)
```

# 原因
`react-router`を導入している環境で、Jestを実行しようとしたため

テスト環境で react-router を使用する際に、`TextEncoder`というグローバルオブジェクトが定義されていないことが原因でした。
TextEncoder は通常ブラウザ環境で利用可能ですが、Node.js の Jest テスト環境ではデフォルトで定義されていません。

### TextEncoderとは

**MDNより引用**
>TextEncoder はコードポイントのストリームを入力として受け取り、 UTF-8 のバイトストリームを出力します。

文字列をUTF-8形式のバイトデータに変換するものと理解しました。

# 解決方法
`jest.setup.ts`に`TextEncoder`と`TextDecoder`のポリフィル（特定の機能が実行環境に存在しない場合、その機能を後から追加するためのコード）を追加する

```diff_typescript::jest.setup.ts
import "@testing-library/jest-dom";
import { config } from "dotenv";
+ import util from "util";

config();

+// eslint-disable-next-line @typescript-eslint/no-require-imports
+global.TextEncoder = util.TextEncoder;
+// eslint-disable-next-line @typescript-eslint/no-require-imports
+global.TextDecoder = util.TextDecoder;
```

# おわりに
今回、初めて使用するライブラリを使ったプロジェクトに対してテストすることに挑戦しています。
新たなエラーにたくさん出会いそうです。

# 参考
https://qiita.com/masa_code/items/799c028fb7b56d6661a2

https://developer.mozilla.org/ja/docs/Web/API/TextEncoder
ストリーム処理用オープンソースDB「RisingWave」の2025年4月アップデート速報

## プロダクトアップデート

### RisingWave Cloud

* **Kafkaソースウィザード**
  パイプラインのセットアップをより簡単にするため、Kafkaソースウィザードを刷新しました。この新しいワークフローでは、トピックを自動取得し、サンプルレコードからスキーマを生成しますので、手動での確認が不要になります。また、key、partition、timestampといったメタデータフィールドも、テーブルカラムとして直接取り込めるようになりました。

* **テーブル詳細ページ**
  テーブルの詳細情報（主要なメトリクス、設定、スキーマ概要など）を確認できるようになりました。このアップデートにより、RisingWaveでは、Sources、Sinks、Materialized Views、Tablesといった主要データオブジェクトすべてに詳細ページが用意されています。

### RisingWave Database

* [Postgres 17からのCDC取り込み](https://docs.risingwave.com/ingestion/sources/pg-cdc)をサポート（パブリックプレビュー提供中）
* 共有ソースの[並列度変更を中断なしで実行可能](https://docs.risingwave.com/sql/commands/sql-alter-source)になりました。以前は、並列度がCNに固定され、変更には再起動が必要でした。
* Iceberg連携をさらに強化し、多様なユースケースに対応：

  * RisingWaveは[JDBCカタログとして機能](https://github.com/risingwavelabs/risingwave/pull/21400)し、外部エンジンからIcebergテーブルをクエリ可能になりました。
  * Icebergテーブルを[S3やGCSに加えてAzure Blob上でもホスト可能](https://docs.risingwave.com/integrations/destinations/apache-iceberg)になりました。

## ドキュメント更新情報

* RisingWaveの新機能である[Elastic Disk Cache](https://docs.risingwave.com/get-started/disk-cache?utm_source=hs_email)について解説。ローカルディスク（NVMeやEBS）をキャッシュ拡張として活用することで、S3アクセスコストを削減し、大規模なストリーム処理ワークロードのパフォーマンスと効率を向上させます。
* RisingWaveは[データベース分離、リソースグループ、クロスデータベースクエリ](https://docs.risingwave.com/operate/workload-isolation-interaction)をサポートしており、複数ワークロードの強力な分離と柔軟なデータアクセスを実現します。
* RisingWaveとApache Flinkの[機能別比較表](https://docs.risingwave.com/faq/risingwave-flink-comparison)では、SQL機能、データ型、ストリーミング操作、システム機能の違いを詳細に比較しています。
* [エンドツーエンドのレイテンシーパフォーマンスガイド](https://docs.risingwave.com/performance/troubleshoot-e2e-latency)では、RisingWaveにおけるレイテンシーに影響する要因と、低レイテンシーと高スループットをバランスよく最適化する方法を紹介しています。
* RisingWaveは、Apache Icebergとの多様な連携方法を提供しています。外部Icebergテーブルの読み書き、Iceberg形式でのネイティブデータ保存、Amazon S3テーブルをIcebergカタログとして使用するなどの方法があり、[こちらのドキュメント](https://docs.risingwave.com/iceberg/overview)で統合内容を包括的にご覧いただけます。

## 最新ブログ投稿

* [RisingWaveにおけるIcebergテーブルエンジンの紹介：SQLでストリーミングデータをIceberg管理](https://www.risingwave.com/blog/risingwave-iceberg-table-engine/)
* [DatabentoとRisingWaveでリアルタイムにスプーフィング検出](https://www.risingwave.com/blog/spoofing-detection-databento-risingwave/)
* [RisingWave設立4周年：ストリーム処理民主化のその先へ](https://www.risingwave.com/blog/risingwave-turns-four/)
* [RisingWave v2.3のハイライト](https://www.risingwave.com/blog/highlights-of-risingwave-v23/)
* [RisingWaveにおけるワークロード分離：データベース分離、リソースグループ、クロスDBクエリ](https://www.risingwave.com/blog/workload-isolation-in-risingwave/)

## 今後のイベント

* **5月8日（オンライン）**
  「DIY Streaming Lakehouse on Iceberg：ブログ記事では語られない真実」
  ![截屏2025-05-07 下午3.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/141da9be-f146-4958-9b1a-62e763879349.png)


* **5月20〜21日（ロンドン）**
  Current London
  ![截屏2025-05-07 下午3.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/e4fd4cf4-6779-4ae1-b777-42ef3d0b1e9b.png)
Gitでレビュー時にチェックアウト→サンプルソース作成→ドラフトPR作成の手順

# はじめに
PRレビューでサンプルソースのドラフトPRを作ることがあります。

コマンドをすぐ忘れちゃうので、この流れをメモっておこうかと思います。

# シチュエーション
レビュー依頼が来たー！
あ、ソース量が多いからチェックアウトしてみたいなー。
あれ？ここの部分は、うーん。

よし、サンプルソースを作ってドラフトPRをお見せしようー！

# やりたきことの流れ
１．チェックアウト
２．チェックアウトしたブランチからさらにブランチを作成
３．作成したブランチにスイッチ
４．ファイルを修正してプッシュ
５．ドラフトPRを作成

# 事前準備
GitHub上で、feature/review-A ブランチを作成

# やってみる
## リモートのブランチを取得
```
git fetch
git checkout feature/review-A
```
## ブランチを作って、ファイルを修正して、プッシュ
```
git branch feature/review-A-refactor
git switch feature/review-A-refactor
echo 'modify' >> review-A-refactor.txt
git add review-A-refactor.txt
git commit -m 'modify'
git push origin feature/review-A-refactor
```
## ghコマンドでドラフトPR作成
```
gh pr create
※ Submit as draft を選択
gh pr view --web
```
vscodeで自己完結型の単一ファイルのexeをコンパイルする方法(vb.net)

VS Codeで**VB.NETの自己完結型単一ファイルのEXE**をコンパイルする方法を紹介します。

### **1. プロジェクトの作成**
まず、VB.NETのプロジェクトを作成します。

```sh
dotnet new winforms -lang vb -o MyApp
cd MyApp
```

### **2. `vbproj` ファイルの設定**
プロジェクトファイル (`MyApp.vbproj`) を開き、以下の設定を追加します。

```xml
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>
</Project>
```

### **3. EXEファイルのコンパイル**
以下のコマンドを実行して、自己完結型の単一ファイルEXEを作成します。

```sh
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
```

### **4. 出力ファイルの確認**
発行されたEXEファイルは、以下のディレクトリに生成されます。

```
MyApp\bin\Release\net8.0\win-x64\publish\MyApp.exe
```

このEXEファイルは**.NETランタイムなしで動作**します。

### **参考情報**
詳しい手順は、[Qiitaの記事](https://qiita.com/michimichix521/items/236d176156e5d9b4743c)や[Microsoftの公式ドキュメント](https://learn.microsoft.com/ja-jp/dotnet/core/deploying/single-file/overview)を参考にしてください。
LoRaとかマイコンとか｜技術系ブログやってます🐬

# はじめまして、ぽんたです 🐬

LoRaやマイコンを中心に、ちょっと変わった技術ネタや電子工作の記録をまとめている  
「しゃちらぼ」というブログを運営しています。（最近始めました）

---

## 🛠 普段やっていること

- Lora通信モジュールのファームウェアの設計・実装  
  および、そのモジュールを使った自作ボードの開発  
- その他、マイコン関連のファームウェア開発  
- Arduino / Python / Markdownまわりの小ネタの共有  
- 個人ブログの技術運用（WordPress＋自作変換スクリプトなど）

---

## 💬 Qiitaでは…

- 「しゃちらぼ」の記事を技術寄りに再構成したものや  
- 開発中に得た知見、マイコンやLoRa関連のノウハウ  

などを投稿していく予定です！

---

## 🔗 ブログ「しゃちらぼ」

👉 [しゃちらぼ - Shachi-lab](https://blog.shachi-lab.com/)

ブログでは、AIアシスタントの「ろらたん」と一緒に  
ゆる〜く楽しく技術話を投稿しています。

Qiitaではちょっとだけ真面目寄りになるかもしれませんが、よろしくお願いします！

---

## 📘 次回予告

次回の投稿では、

> **Pythonの正規表現で絵文字がうまくマッチしない！？**  

という話題をお届けする予定です 🐍✨
Iteratorの罠 - コールバックが実行されるタイミング・例外処理

今回、Iteratorの`.map()`等の例外処理に苦戦したので、それを通してIteratorのメソッドの実行タイミングについて書き残します。

:::note warn
この記事ではTypeScriptを使っています。
JavaScriptを使っている人は
頑張って型宣言を外してください。
:::


## Iteratorとは？

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Iterator

イテレータープロトコルに準拠するオブジェクトで、色々とメソッドがあって便利です。
TypeScriptでは`IteratorObject<T>`にあたります。
(`Iterator`だとイテレータープロトコルになる)

このオブジェクトを返すメソッドが意外と多く、
`Array.values()`や`Map.keys()`、`Set.values()`など色々とあります。
(こちら`.prototype`が省略されています)

## 失敗するサンプルコード
```ts
function addSamaToNames(names: IteratorObject<string>){
    return names.map(e => {
        if(e.toLocaleLowerCase() === "google")
            throw new Error("生理的に無理です");
        return `${e}様`; // 豪華にテンプレートリテラルを使う
    })
}

const names = new Set<string>();
names.add("Microsoft");
names.add("Microsoft");
names.add("Microsoft");
names.add("Qiita");
names.add("Microsoft");
names.add("GitHub");
names.add("Yahoo");
names.add("Google");

try{
    var samas = addSamaToNames(names.values());
}catch{
    // addSamaToNamesでのエラーはここで受け止めたい
    throw new Error("ブロックされました。");
}

console.log(samas.toArray().join("、"));

```

こちら、try-catch文の所で、`addSamaToNames`の
`names.map`のコールバックが投げる`生理的に無理です`という本音を隠して
例外を投げてほしいのですが、なぜか`console.log`の段階で例外が発生してしまい、
本音が漏れてしまいます。

## なぜ失敗する？

なんと、これらイテレーターのメソッドは遅延的に計算するんです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Iterator/map#%E8%A7%A3%E8%AA%AC

遅延的というのは、`.map`をした時点では実行されず、`.toArray`などで必要になった際計算する仕組みのことです。
これのおかげで無限イテレーターに`.map`を使えるそうです。

そのため、`addSamaToNames`の`names.map`の時点では例外が起こらず、
`toArray`の時に計算してしまい他の所で例外を解き放ちます。

## 対処法

ただ単に、そのメソッド内で`toArray()`をするだけです。`Array.from()`も可。

```ts
function addSamaToNames(names: IteratorObject<string>){
    return names.map(e => {
        if(e.toLocaleLowerCase() === "google")
            throw new Error("生理的に無理です");
        return `${e}様`; // 豪華にテンプレートリテラルを使う
    }).toArray();
}

// ~~~

console.log(samas.join("、"));

```

以上です。誰かの役に立てますように。
PowerQueryの一番簡単な解説、テーブル（リスト）にもとづいて文字列の置換や動的に列の追加を行う方法について


    List.Accumulate(リスト, 対象,(累積値,現在値) => 処理)
    
    //つまり
    List.Accumulate(元ネタリスト, 元ネタ,(処理を積み重ね,現在のリストの項目、値) => 行いたい処理)

ポイントは　(処理の積み重ね,現在のリストの項目、値) => です

テーブル、リストを使用した文字列の置き換えについて

まずは置き換え前、置き換え後の文字を入力したテーブルを作成してください
置き換え前|置き換え後
です
テーブル名は　置き換えリスト　としてください

次に　テータ　タブの　テーブルまたは範囲から　でクエリに取り込んでください
取り込んだテーブルのクエリ名が　置き換えリスト　となっている事を確認してください←

    //このコードは処理を行いたいテーブルのクエリに記述してください
    元ネタリスト = List.Buffer(Table.ToRows(置き換えリスト)),
    //処理を行いたいテーブルの最後のステップ名を　元ネタ　に変える、テーブルあるいは処理を行いたい、コードの最後のステップ名を　元ネタ　に変えてください
    連続処理 = Table.AddColumn(元ネタ,"完成",each
    List.Accumulate(元ネタリスト, [対象の列の列名（適せん変更してください）],(処理を積み重ね,現在のリストの項目) =>
     Text.Replace(処理を積み重ね,現在のリストの項目{0},現在のリストの項目{1})))
in
    連続処理

以上
なぜできるのか？

連続処理 = Table.AddColumn(元ネタ,"完成",each
List.Accumulate(元ネタリスト, [文字列]←　ここにTable.AddColumnの　each で　テーブルの1行丸ごと引き渡され、[文字列]列が指定されているからです

VBAの　For each、Power AutomateのApply to each、繰り返し処理に出てくる言葉です

    (処理を積み重ね,現在のリストの項目) =>
    処理を積み重ね,現在のリストの項目{0},現在のリストの項目{1}

は好きに変えて頂いてもかまいません

    (処理を積み重ね,現在のリストの項目) =>

は無名関数と引数といいます（少なくともPowerQueryでは）

列の動的な追加について

        //注意
        列名ネタ帳 = List.Buffer(置き換えリスト[置き換え前]),
        繰り返し = List.Accumulate(
        列名ネタ帳, 元テーブル,
        (列を追加したテーブル, 現在の列名) => Table.AddColumn(列を追加したテーブル, 現在の列名, each　～各行に対してなにか行いたい処理～))

リストの名前を　列名ネタ帳　としました

列の文字列にリストの文字が含まれているか確認する方法

例えば　[文字列]列にリストの、
「いづれかの項目」が「含まれていたら」、
「含まれていた項目」を行に記入したい、
という場合はList.selectとList.Combineという関数が使用できます。

        //注意
        チェックリスト = List.Buffer(置き換えリスト[置き換え前]),
        チェック = Table.AddColumn(元ネタ,"チェック",each
        List.Combine(List.Select(チェックリスト,(x) => [対象の列の列名（適せん変更してください）],x))

List.AnyTrue と　List.Transform　を駆使すれば　if then で　"○"　を記入する事も出来ます
Linucレベル１勉強メモ　＃２４

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.9
locateコマンドが利用するファイル名データベースを更新するコマンドを記述してください。

（解答）updatedb

（解説）locateコマンドは、あらかじめ作成されたファイル名データベースに基づいて検索します。ファイル名データベースの更新にはupdatedbコマンドを使います。このコマンドを実行するにはrootユーザーの権限が必要です。

ファイルの検索に使われるコマンド
* locateコマンド
あらかじめ作成されたデータベースに基づいて、指定されたパターンに一致するファイルを作成します。findコマンドよりも高速に動作します。
locate 検索パターン
* updatedb コマンド
locateコマンドは、あらかじめ作成されたファイル名データベースに基づいて検索するので、findコマンドよりも高速に動作します。しかし、当然ながらデータベースの更新後に作成・変更されたファイルは見つけることができません。データベースを更新するには、updatedbコマンドを実行します。
書式　updatedb [オプション] 
-e パス　でデータベースに取り込まないパスを指定する。
いろんなアルゴリズム"00.00.00.11"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.11

# ReferenceID

# センチネルによる線形探索（sentinel linear search）
* 最後の一要素分だけ探索しなくて良いので，線形探索より微小だが速くなる
```python:
def sentinelLinearSearch(l, x):
    n = len(l)
    last = l[n - 1]
    l[n - 1] = x
    
    i = 0
    while (l[i] != x):
        i += 1

    l[n - 1] = last
    if ((i < n - 1) or (l[n - 1] == x)):
        return i
    else:
        return -1
```

# 使用方法
```python:
l = [2,6,1,8,10,7,3,5]
print(sentinelLinearSearch(l, 8)) # 3
```
いろんなアルゴリズム"00.00.00.10"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.10

# ReferenceID

# 二分探索（binary search）
```python:
def binarySearch(l, x):
    low = 0
    high = len(l)

    while low <= high:
        mid = low + (high - low) // 2
        if l[mid] == x:
            return mid
        elif l[mid] < x:
            low = mid + 1
        else:
            high = mid - 1
    return -1
```

# 使用方法
```python:
l = [2,6,1,8,10,7,3,5]
print(binarySearch(l, 8)) # 3
```
マイグレーションシステムの仕組みについて

## はじめに

Recursionでマイグレーションシステムの仕組みを理解したので、復習用にメモとして残しておく。

## 1. 管理構成

マイグレーションは以下の2つで管理されている。

- **マイグレーションフォルダ**
    
    実行対象のマイグレーションファイル（PHPクラス）を保存する場所。ファイル名には日付を含めて昇順で並ぶようにする。

    
- **マイグレーションテーブル**
    
    データベース内で、実行済みのマイグレーションファイルのファイル名を記録するテーブル。
    

この2つを比較することで、どのマイグレーションが未実行なのかを判断する。

---

## 2. migrate の流れ

1. `migrations` テーブルから「最後に実行されたマイグレーションファイル名」を取得する。
2. フォルダ内のすべてのマイグレーションファイルを取得し、ファイル名の昇順にソートする。
3. テーブルに記録されたファイルが、フォルダ内の何番目のファイルなのか（インデックス）を調べる。
4. そのインデックスの次から最後までのファイルを、順に `up()` 実行していく。
5. 実行が終わるたびに、`migrations` テーブルにそのファイル名を INSERT して記録する。

※ テーブルに実行履歴が一切なければ、最初のファイルからすべて実行される。

---

## 3. rollback の流れ

1. `migrations` テーブルから「最後に実行されたマイグレーションファイル名」を取得する。
2. フォルダ内のマイグレーションファイル一覧を取得し、昇順にソートする。
3. 該当ファイルが何番目のファイルか（インデックス）を調べる。
4. そのインデックスから逆方向（デクリメント）に `down()` を実行していく。
5. 実行が終わるたびに、`migrations` テーブルからそのファイル名を DELETE して履歴を消す。

※ rollback の実行回数は引数で指定できる（デフォルトは 1 回）。

---

## 4. 命名ルールと注意点

- マイグレーションファイル名には日付（またはソート可能な接頭辞）を含める。
- ファイルはフォルダ内で昇順にソートされて実行される。
- クラス名はファイル名を元に動的に生成されるため、命名規則に従う必要がある。
- `up()` / `down()` メソッドの中で、スキーマ変更を行う SQL クエリを記述する。

---

## 5. この設計の利点

- 実行状態を DB 側で正確に管理できる（ファイルの存在だけでは判断しない）。
- 実行・巻き戻しがコマンド1つで可能。
いろんなアルゴリズム"00.00.00.0f"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.0f

# ReferenceID

# 線形探索（linear search）

```python:
def linearSearch(l, x):
	for i in range(len(l)):
		if l[i] == x:
			return i
	return -1
```

# 使用方法
```python:
l = [2,6,1,8,10,7,3,5]
print(linearSearch(l, 8)) # 3
```
Seeed Studio XIAO ESP32C3でフルカラーLEDテープを光らせる

![IMG_9618（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/8f2af960-a055-4138-a1a0-0b22a68f9ecd.jpeg)

# はじめに
Seeed Studio XIAO ESP32C3を使って、TapeLEDを光らせる方法の紹介です。
Arduino UNOからESP32への乗り換えです。

# 環境
Mac OSX 13.4.1
Arduino 2.2.1
Seeed Studio XIAO ESP32C3

https://ssci.to/8348

# 手順
①Arduino IDEをインストールし、基本設定を開く。
②追加ボードマネージャのURLに
http://drazzy.com/package_drazzy.com_index.json
を追加する。（不要かも）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/b85e9f8f-93e9-4e19-b7ba-2667ad9793a1.png)
③ボードマネージャからesp32で検索して、下のやつ(3.2.0)をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/9c738724-b9c8-489d-b095-5df893fc6c07.png)
④ボード(board)とポート(port)を選択する
ESP32C3 Dev Module
XIAO_ESP32C3
DFRobot Beetle ESP32-C3
などを試して、いずれも動作した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/576e998b-7486-4621-b3c9-3058fdd4429f.png)


```c++:arduino
#include <Adafruit_NeoPixel.h>
#define PIN 10
#define NUMPIXELS 4

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}

float th = 0;
void loop() {
  pixels.clear();

  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, sin(th)*128+128));
    pixels.show();
  }
  th+=0.01;
  delay(1);
}
```

# 接続
GND同士を接続
LEDの5V端子は、XIAOのVUSB端子(5V)か3.3V。幸い3.3Vでも動作した。
信号線は10番ピン

# 困った（メモ）
ボードマネージャでseeeduinoと検索して、出てくるやつをインストールしてから、
ボード選択で、
SEEED SAMD>Seeeduino XIAO
を選ぶと、書き込みエラーで進めない。
こちらのほうが、コンパイルが速いきがするので、使いたいのだが無理。


本稿でのコンパイル時間は20秒。
書き込みは10秒。




# メモ
XIAOは、たくさん種類があってわかりにくい。
XIAO SAMD21：これが基本
XIAO XIAO ESP32-C3：LiPoバッテリー充電可。リセットボタンあり。Lチカ用のLEDなし。

https://www.seeedstudio.com/xiao-series-page


DFRobot Beetle ESP32-C3

https://ssci.to/10088
【初学者】🌐 JavaScript 学習まとめ

# 🌐 JavaScript 学習まとめ
今日は初めてJavaScriptについて学びました。
本日の内容についても自分なりにまとめみようと思います。

## 🔰 まずは基本のキ：JavaScriptの基礎文法
### 変数宣言
JavaScriptでは以下の3つの方法で変数を定義できます。

- var：古い。再宣言・再代入が可能
- let：再代用のみ可
- const：定数。再代入不可

```js
let name = "Alice";
const age = 20;
```

## 出力とテンプレートリテラル
デバッグや動作確認でよく使うのが console.log()。
テンプレートリテラル（`文字列${変数}`）を使うと、文字列内に変数を埋め込めて便利。
```js
console.log(`Hello, ${name}`);
```

## 条件分岐・ループ
```js
if (age >= 20) {
  console.log("成人です");
}

for (let i = 0; i < 5; i++) {
  console.log(i);
}
```

## 📦 関数まわりの書き方いろいろ
### 関数宣言と関数式
```js
function greet() {
  return "Hello";
}

const sayHi = function() {
  return "Hi";
};
```

### アロー関数と即時関数
```js
const add = (a, b) => a + b;

(function() {
  console.log("即時実行される関数");
})();
```
## 🧱 オブジェクトとメソッド
JavaScriptではデータをオブジェクトとして扱うことが多いです。
```js
const user = {
  name: "Alice",
  greet: function() {
    return `Hi, I'm ${this.name}`;
  }
};
```

## 🖼 DOM操作とイベント処理（ブラウザで動かす）
ブラウザでHTMLを操作したいときはDOM（Document Object Model）を使います。

###要素の取得
```js
document.getElementById("main");
document.getElementsByClassName("box");
document.querySelectorAll(".item");
```

### イベント処理
```js
document.getElementById("btn").addEventListener("click", function() {
  alert("クリックされました！");
});
```
その他便利なもの

- this：呼び出し元を指す
- innerHTML：HTMLの中身を取得/更新
- setAttribute, removeAttribute：属性の追加・削除
- debugger：開発者ツールで処理を止める（デバッグ用）

## 🔄 同期・非同期通信とAJAX
- 同期処理：上から順に処理。待ち時間があると固まる。
- 非同期処理：待ち時間の間に他の処理を実行。

## 📝 最後に
JavaScriptはとても柔軟で、学びやすく、奥が深い言語です。
1日でかなりの量をインプットしましたが、まずは「動かしてみる」ことが何より大事ですね。

これから実践で触れながら、少しずつ自分のモノにしていきたいと思います！
いろんなアルゴリズム"00.00.00.0e"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.0e

# ReferenceID

# 幅優先探索（breadth first search）
```python:
def breadthFirstSearch(graph_dict, start, goal):
	# graph_dictは有向グラフ
	# keyがparent、valueがchildren
	# 親ノードが一つのみの場合

	queue_list = [(start, [start])]
	visitedNode_list = []

	flag = False
	path = None

	while True:
		if not queue_list:
			flag = False
			break
		node,path = queue_list[0]
		queue_list = queue_list[1:]
		
		if node == goal:
			flag = True
			break
		if node not in visitedNode_list:
			visitedNode_list.append(node)
			for child in graph_dict[node]:
				if child not in visitedNode_list:
					queue_list.append((child, path + [child]))

	if flag:
		return path
	else:
		return None
```

# 使用方法
```python:
graph_dict = {
    1:[2,3],
    2:[4],
    3:[5,6,7],
    4:[8],
    5:[],
    6:[9],
    7:[],
    8:[],
    9:[]}
print(breadthFirstSearch(graph_dict,1,9)) # [1, 3, 6, 9]
# visitedNode_list = [1, 2, 3, 4, 5, 6, 7, 8]
```
Cursor AIエディタの初期設定と活用術：インストール後にやるべき5つのステップ


<h2>導入：Cursorをインストールしたけど、何から始めればいい？</h2>
<p>最近話題のAIコードエディタ「<strong>Cursor</strong>」をインストールしてみたものの、どのように使い始めればよいか迷っていませんか？</p>
<p>本記事では、Cursorを最大限に活用するための初期設定や活用術を、エンジニア目線でわかりやすく解説します。</p>

<h3>Cursorとは？AI時代の新しいコーディング体験</h3>
<p><strong>Cursor</strong>は、<strong>Visual Studio Code（VS Code）</strong>をベースに開発された<strong>AI統合型コードエディタ</strong>です。</p>
<p>主な特徴は以下の通りです：</p>
<ul>
  <li><strong>AIによるコード補完</strong>：コードの文脈を理解し、適切な補完を提案。</li>
  <li><strong>自然言語でのコード編集</strong>：英語や日本語での指示に基づいてコードを生成・修正。</li>
  <li><strong>コードベースのインデックス化</strong>：プロジェクト全体を把握し、関連性の高い提案を実現。</li>
</ul>
<p>これにより、従来のエディタとは一線を画す、効率的なコーディング体験を提供します。</p>

<h3>よくある課題とエラー：初期設定でつまずかないために</h3>
<p>Cursorを使い始める際に直面しがちな課題やエラーには以下のようなものがあります：</p>
<ul>
  <li><strong>ネットワーク関連の問題</strong>：企業ネットワークやVPN環境下で、HTTP/2が利用できずAI機能が正常に動作しないことがあります。</li>
  <li><strong>AIの誤動作</strong>：AIが意図しないコードを生成したり、既存のコードを破壊するケースが報告されています。</li>
  <li><strong>プロジェクトルールの未設定</strong>：AIに明確な指示を与えないと、期待通りの動作をしないことがあります。</li>
</ul>
<p>これらの問題を回避するためには、適切な初期設定とルールの整備が重要です。</p>

<h3>初期設定と活用術：Cursorを使いこなすためのステップ</h3>
<p>Cursorを効果的に活用するための初期設定と活用術を以下にまとめました：</p>
<ol>
  <li>
    <strong>HTTP/2の無効化</strong><br>
    企業ネットワークやVPN環境下で問題が発生する場合、HTTP/2を無効化してHTTP/1.1にフォールバックすることで解決できます。<br>
    <pre><code>設定方法：
1. Cursorを開く
2. Cmd/Ctrl + , を押して設定を開く
3. 検索バーに「HTTP/2」と入力
4. 「Disable HTTP/2」を有効にする</code></pre>
  </li>
  <li>
    <strong>YOLOモードの活用</strong><br>
    YOLOモードを有効にすることで、AIが自動的にテストを実行し、エラーを修正するまで繰り返すことができます。<br>
    <pre><code>設定方法：
1. Cursorの設定を開く
2. 「YOLOモード」を検索
3. チェックボックスをオンにする</code></pre>
    このモードでは、AIが自動的にテストを作成・実行し、成功するまでコードを修正します。
  </li>
  <li>
    <strong>プロジェクトルールの設定</strong><br>
    プロジェクトごとにルールを設定することで、AIの動作を制御できます。<br>
    <pre><code>設定方法：
1. プロジェクトのルートディレクトリに .cursor/rules/ ディレクトリを作成
2. その中にルールファイル（例：core.mdc）を作成
3. ルールファイルにプロジェクト固有の指示を記述</code></pre>
    これにより、AIがプロジェクトのスタイルや規約を遵守するようになります。
  </li>
  <li>
    <strong>AIとの対話方法の工夫</strong><br>
    AIに対する指示は具体的かつ明確に行うことが重要です。<br>
    <pre><code>例：
「この関数をリファクタリングして、可読性を向上させてください。」</code></pre>
    また、@記法を使って特定のファイルや関数を参照することで、AIにコンテキストを提供できます。
  </li>
</ol>

<h3>ベストプラクティスと注意点：AIとの協調開発を成功させるために</h3>
<ul>
  <li><strong>明確な指示を与える</strong>：AIには具体的なタスクや期待する結果を明示的に伝えましょう。</li>
  <li><strong>小さなタスクに分割</strong>：大きな変更は小さなタスクに分割し、段階的に進めることでエラーを減らせます。</li>
  <li><strong>ルールの活用</strong>：プロジェクトルールやユーザールールを設定することで、AIの挙動を制御できます。</li>
  <li><strong>定期的なレビュー</strong>：AIが生成したコードは必ずレビューし、必要に応じて修正を加えましょう。</li>
  <li><strong>バージョン管理の活用</strong>：AIによる変更を追跡するために、Gitなどのバージョン管理システムを活用しましょう。</li>
</ul>

<h3>まとめと今後の展望：Cursorを使いこなして生産性を向上させよう</h3>
<p>Cursorは、AIを活用した新しいコーディング体験を提供する強力なツールです。</p>
<p>適切な初期設定と活用術を身につけることで、開発効率を大幅に向上させることができます。</p>
<p>今後もAI技術の進化とともに、Cursorの機能も拡張されていくことが期待されます。</p>
<p>ぜひ、Cursorを使いこなして、より効率的で快適な開発環境を手に入れましょう。</p>
物理学者がLLMを語る系を読みたかった!!【知能とはなにか】読書メモ・要約

## 記事の内容
今回は、『知能とはなにか　ヒトとＡＩのあいだ』という本を紹介します。

 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281138/d52bdac7-7243-48f8-9187-64b53385de68.png)

https://amzn.to/3YxhZlE


 

知能という現象を物理学者が語る。

知能やAIを物理学者が語る言説こそ、ちょうど私が今求めていたものでした！！

現在の生成AIを深く知るためにも必読の一冊です。

本書の一部を要約します。


## 要約
本書の一部を要約します。

メインメッセージはこちら。

* 知能とは現実世界のシミュレーターである。
* 生成AIは、 非線形非平衡多自由度系の一種である。


### 大規模言語モデルの中身

大規模言語モデルには２つの要素をもつ。

基盤モデルを作った後に、それを個別の問題に適用（転移学習と呼ぶ）する。

基盤モデルは、文章の一部を隠して穴埋め問題を当てさせる、二つの文章が続いているかどうかを判定する、などによって作る。基盤モデルは、単語の地図の獲得に成功している、と解釈できる。特徴は、文脈依存的な地図の獲得、である。


例

プログラミング

 
> 学習したテキストの中に、プログラムとその機能の説明がセットになった文書があることで「機能」と「プログラム」の関係を学習するとともに「この機能を実現するプログラムを書く」という文章の後には、その機能を実装したプログラムが書かれていることが多いといった関係性がある、という二つのことを学んだ結果だと思われる。

 

 

chatGPTなどの大規模言語モデルは、「人間と会話して違和感ない返答をすること」という転移学習をしたものだと言われている。

大規模言語モデルは、驚くほどの高パフォーマンスを発揮する。ゆえに、 高パフォーマンスには「知能」などいらなかった、と考える研究者が多い。

　

### ヒトの知能の定義
「ヒトの知能」は、大脳の機能である。つまり、大脳という臓器ありきの定義だ。ハードとソフトは切り離せない、という立場である。脳でなければヒトの知能は作り出せない。

脳は周囲の環境を再現するシミュレーター。
わかりやすい例が錯視だ。

脳の活動が非線形非平衡多自由度系であることは、すでに実験的に実証されている。だから、生成AIと似ている。
 


### 世界のシミュレーターとしての生成AI


* 非線形

1たす1が2にならない世界

ほとんどの現実はこれ。



* 非平衡

変化の少ない静的な状態ではないこと。

ほとんどの現実はこれ。




* 多自由度系

たくさんの要素があること。

ほとんどの現実はこれ。




---
非線形非平衡多自由度系は再現、予測が難しい。ゆえに、現実世界を表す概念として物理学者が盛んに研究していた。

多数のダイナミカルモデル（現在の状態が未来を決まるという特徴をもつシステム）が、同じ現実をシミュレーションできる。雲の生成原理を厳密に勿体無いシステムが、雲のようなものを生成できてしまう。

これは、生成AIと共通である。

LLMは、トークンの地図という形で、仮想世界をシミュレーショている。つまり、生成AIは、ダイナミカルモデルを学習で構成することにほかならない。


### 生成AIと比較して、なぜ人間の脳は少ないサンプルで学習できるのか

いくつかの仮説はあるが、まだ分からない。



### 脳によるシミュレーションは、生成AIと比べて、特別正確なものではない

速度や加速度という概念は、あるタイプの生物種たちが進化の過程で獲得した概念にすぎない。

より現実を正確に表している量子力学では、古典力学の概念は通用しないことがある。そして、動物の脳は量子力学をシミュレートできるような知能を発達させられなかった。


> 非常に正確な、しかし胡乱な世界シミュレーターである古典力学をこれまたシミュレートできる機械学習が作れるということはとりもなおさず、（十分に正確な）世界シミュレーターとしての「知能」の可能性は無限にあり、人間の脳と生成ＡＩやＬＬＭはその無数にある世界シミュレーターのたった二つのリアライゼーションに過ぎないと思うのが、もっとも妥当な見解である可能性が非常に高いということなのである。



### 今後の知能研究


知能研究はヒトの知能の研究である、ではなく、知能の研究は、「世界シミュレーターをどう作るのか」になる。今後は、ヒトの脳でも、現在の生成AIでもない知能が開発されるだろう。

たとえば、量子力学を前提とした世界をシミュレートできる知能が開発される可能性がある。




### 生成AIは意思を持った自律的な存在にらならない


> すでに非線形非平衡多自由度系においては自律的なダイナミカルシステムであっても固定点（静止）、リミットサイクル（なにかの繰り返し）、そしてカオス、以外の軌道はないことが確立された事実として判明している。この３つでは人類を脅かすような自律的な心を持ったシステムは構成できないのはあまりにも明らかだろう。


> 私に言えるのは今の生成ＡＩ、基盤学習＋転移学習という枠組みはどんなに高度に発展したように見えても所詮は非線形非平衡多自由度系の枠内の話であり、その外側に出て行かない限りは、固定点でも、リミットサイクルでもカオスでもない動力学は実現できるはずもなく、したがって自律した意識を持って人類の脅威になったりは決してできないだろう、ということだけだ。





### 自我の有無と知能の高低は分けて考えるべき


> ここで混同すべきではないのは、知能の仕組み、シミュレーターとしての知能という観点は自我や自律の有無とは別物だ、ということだ。自我や自律はないが、知能のシミュレーターとしては人間型はあり得るし、逆に生成ＡＩとは全く違うアーキテクチャ（たとえば人工生物を使ったアーキテクチャ）であれば、自我を獲得し、自律的に振る舞う現実シミュレーターが登場する可能性は否定しない。要は、自我の有無と知能の高低は独立して論ずべき命題なのである。




## 関連記事

https://www.buchinuku.work/entry/2024/4/25

https://www.buchinuku.work/entry/2024/4/27
Wayland  で困ったときのTips


# 環境

- Ubuntu 24.04 LTS

# マウスカーソルを含めた画面キャプチャ

マウスカーソルを含めたキャプチャを行うために長らく使ってきたGIMP。
しかしながら GIMP2系だと　Wayland で スクリーンキャプチャ ができない。

今どきは OS 付属のスクリーンキャプチャツールを使い、「ポインターを表示」指定をするとマウスカーソルを含めてキャプチャできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/26a57c85-79e5-4334-906f-57cea93bb6d4.png)

# ウィンドウ拡縮ができない

ウィンドウのエッジをドラッグしての、ウィンドウサイズ変更ができないことがある。
WineHQ上で動かすKindle 、Genymotion などバーチャル環境関係で起こりやすい感じ?

どういうわけか、自動ログインを解除すると拡縮ができるようになる。

あるいは、ウィンドウタイトルバーを右クリックで「サイズを変更」で拡縮できる。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0cfce57d-9281-4026-ae9b-ceb76affaa8f.png)


# ウィンドウタイトルバーが出ない

- ウィンドウを移動したいのにタイトルバーをがなくてドラッグできない
- タイトルバー右クリックしてメニューを出したいのにタイトルバーが無い

このようなときは、Superキーを押しながらマウスの右クリックを押す。
Githubに公開されているリポジトリをcloneし、自分のリポジトリへpushする方法

エンジニアのひよっこなので、備忘録として残します:hatching_chick:
知識がついてきたら書き直していきたいなというところ...:relieved:

# やりたいこと
Githubに公開されているソースコードに、コメントを書きながら理解したものをgithubで管理したいなと思ったため、cloneし、それを自分のリポジトリで管理したい。

# 手順まとめ
1. リポジトリをクローン
2. 自分で作成したリポジトリのSSHを取得
3. リモートのURLを自分で作成したリポジトリのSSHに変更
4. commitし、SSH経由でpush

# 実際にやった手順詳細
## 1. 取ってきたいリポジトリをclone
クローンしたいリポジトリのURLを取ってくる。
（ここでは例として[OpenAIの公開しているもの](https://github.com/openai/openai-java/tree/docs/function-calling-example)を参考にします）

githubページはこちら↓

https://github.com/openai/openai-java/tree/docs/function-calling-example

![スクリーンショット 2025-05-07 19.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772599/b631234f-0443-4b36-aa11-28bd766347e3.png)

githubページの緑色のcodeのところのHTPPSをコピーすれば大丈夫。

クローンしてきたものを置きたいディレクトリへ移動した後に次のコマンドを実行。
```ssh
git clone <cloneしたいリポジトリのhttpsをここにコピペ> 
```

## 2. 自分のGithubページでリポジトリを作成
作成したらSSHまたはHTPPSをコピーできるところがあるので、それを控えておく。

:::note warn
**注意点**
SSHの方をコピーすること。HTTPSだとエラー？を吐いちゃうので...？
:::

参照↓

https://docs.github.com/en/get-started/git-basics/about-remote-repositories#cloning-with-https-urls


以降は「`<最初に作成したリポジトリのSSH>`」と表記することにします。

## 3. cloneしてきたものを確認する
次のコマンドで確認が可能。

```
git remote -v
```

:::note info
:pencil2: **メモ**
`git remote`：登録されているリモート名を一覧表示
`-v`：各リモート名に対して「fetch（取得用）と「push（送信用）」のURLも詳細に表示
:::

実際に確認した様子
```ssh
$ git remote -v
origin	https://github.com/openai/openai-java.git (fetch)
origin	https://github.com/openai/openai-java.git (push)
```

URLはclone元のものになっていることが確認できる。

## 4. リモートのURLを作成したリポジトリに変更する
リモートのURLの変更コマンドは以下の通りらしい↓

```
git remote set-url origin <最初に作成したリポジトリのSSH>
```

実際に確認した様子
```ssh
$ git remote set-url origin git@github.com:<作成したリポジトリ名>.git
$ git remote -v
origin	git@github.com:<最初に作成したリポジトリのSSH> (fetch)
origin	git@github.com:<最初に作成したリポジトリのSSH>.git (push)
```

## 5. first commitし、SSH経由でpush
全部をaddして...
```
git add .
```
コミットメッセージを書いて...

```
git commit -m "first commit"
```
あとは現在のブランチを確認して
```
git branch
```
ブランチ名を確認してpush！
```
git push origin <確認したブランチ名>
```

以上の手順でうまくいった。
まだまだgitについては勉強中なので、間違ったところ等あればコメント・ご指摘していただけると幸いです。

# 参考記事
非常にわかりやすい記事があったので、感謝の気持ちも込めて掲載させていただきます。
ありがとうございました。

https://qiita.com/SR_midori/items/52730907c1cddeb78b4d
WSL上でDockerを使う場合、Windows側ディスク容量が圧迫されることへの対処

# 概要

WSLでDockerを使っているとWindows側のディスクを圧迫していく。その時の解消方法を以下にメモする（2025/05/02時点の方法）

基本的には1.と2.の手順で不要なものを削除し、3.で仮想ディスクを圧縮させれば良さそう。

## 環境

```txt
エディション	Windows 11 Home
バージョン	24H2
WSL バージョン: 2.4.13.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5716
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26100.3915
Description:    Ubuntu 24.04.2 LTS
Docker version 28.1.1, build 4eba377
```

## 1.不要なDockerイメージの削除

* docker imageの`<none>`を削除する。WSLにかかわらずDockerを使う場合は定期的に`docker images`コマンドを実行して`<none>`があれば以下のコマンドを実行して削除する。
    * `<none>`以外は通常の`docker rmi`コマンドなどで削除すればよい。

```bash
docker rmi $(docker images -q --filter "dangling=true")
```

## 2.Docker build cacheの削除

* 以下の記事参照

https://qiita.com/hyt-sasaki/items/e2cbc4cfb5ae698de498


## 3.WSLファイルの開放

* 上記2つの手法を実行しただけではWSLの仮想ディスクは肥大化したままなので、以下の記事を参考にディスクの圧縮する。

https://01futabato10.hateblo.jp/entry/2022/12/02/095031
2025 年版 フレームワーク徹底比較

## ③ 2025 年版 フレームワーク徹底比較  
### ―― LangChain / AutoGen / CrewAI / Semantic Kernel / LangGraph


# 2025 年版 エンタープライズ AI エージェント フレームワーク徹底比較
*Published 2025-05-07*

## TL;DR
- **LangChain** が依然デファクト、だが **AutoGen・CrewAI** がプロダクション投入例を増やし勢力図が変化。:contentReference[oaicite:9]{index=9}  
- **Semantic Kernel** は Microsoft Stack との親和性、**LangGraph** は複雑フローで台頭。:contentReference[oaicite:10]{index=10}  

---

## 1. 一覧比較表

| Framework | 強み | 弱み | 典型ユースケース |
| --- | --- | --- | --- |
| **LangChain** | 圧倒的エコシステム／コミュニティ | バージョン互換に難 | 汎用 RAG, PoC |
| **LangGraph** | グラフワークフロー, チェックポイント | 学習コスト | 多段業務フロー |
| **AutoGen** | マルチエージェント自動協調 | リソース消費 | 要件定義書生成 |
| **CrewAI** | “役割ベース”実装が簡単 | 実運用例が少ない | マーケ分析 |
| **Semantic Kernel** | Planner + Memory, C# 対応 | Python コミュニティ小 | Outlook/Teams 連携 |
| **LlamaIndex Agents** | ローカルモデル指向 | DB, Tooling不足 | オフライン環境 |

> **選定指針**  
> 1️⃣ **PoC スピード重視** ➜ LangChain  
> 2️⃣ **大規模ワークフロー** ➜ LangGraph ⟺ AutoGen  
> 3️⃣ **Microsoft 365 連携** ➜ Semantic Kernel  
> 4️⃣ **低コスト・ローカル** ➜ LlamaIndex Agents  

---

## 2. ディシジョンツリー

```text
ROI>要件↑
       ├─ 3rd-party SaaS統合? ─ Yes → LangChain
       │                            │
       │                            No
       │          複雑フロー? ── Yes → LangGraph or AutoGen
       │                            │
       │                            No
       No → セキュリティ重視? ─ Yes → Semantic Kernel
                                 │
                                 No → CrewAI
````

---

## 3. “選んだあと”に注意すべき落とし穴

1. **アップデート頻度** : LangChain v0.2→0.3 で Breaking Change 多発([Medium][4])
2. **ランタイムコスト** : AutoGen/CrewAI は内部で複数 LLM 呼び出し＝トークンコスト急増
3. **監査要件** : EU/US での監査ログ義務 → Semantic Kernel / LangGraph のチェックポイント機能が有利

---

## 4. ケーススタディ：社内ヘルプデスク自動化

| 機能       | 推奨 FW           | 理由                         |
| -------- | --------------- | -------------------------- |
| FAQ 回答   | LangChain       | Retriever + Template がシンプル |
| チケット起票   | Semantic Kernel | Planner で「起票→ステータス確認」自動化   |
| SLA 超過監視 | LangGraph       | ループ & Retry のフロー制御が容易      |

---

## 5. まとめ

> 2025 年の時点では “**一択**” など存在しない。
> **機能要件 × 運用体制 × コスト** を掛け合わせて **最小構成 → 拡張** がベストプラクティスだ。
> まずは *PoC 2 週間 → 学びを横展開* のリズムで始めよう。
lang graph 基礎ガイド


## ② LangGraph 基礎ガイド  
### ―― グラフベース AI ワークフロー構築の第一歩

# LangGraph 基礎ガイド  
グラフベース AI ワークフロー構築の第一歩
*Published 2025-05-07*

## TL;DR
- **LangGraph** は LangChain 上に載る *状態遷移グラフ* ライブラリ。分岐・ループ・チェックポイントを“当たり前”にする。:contentReference[oaicite:5]{index=5}  
- ノード＝処理、エッジ＝条件付き遷移なので、複雑なマルチエージェントアプリでも破綻しにくい。:contentReference[oaicite:6]{index=6}  

---

## 1. Chain から Graph へ：モデルの違い
| Model | 特徴 | 向き不向き |
| --- | --- | --- |
| Chain (LangChain) | 直列処理・例外時はスコープ外 | 1質問1回答, 単純 RAG |
| **Graph (LangGraph)** | DAG / ループ / マージ可 | 要件ヒアリング → 分析 → 再質問のような対話型業務 |

---

## 2. アーキテクチャ超速レビュー

```text
[Start]─┬─> Node A ─> Node B ─> End
        └─> Node C ---┘
````

* **ノード**：`Runnable` or Python 関数
* **エッジ**：True/False/スコア分岐
* **チェックポイント**：各ノード後の JSON 状態を自動永続化（S3 / Redis など）([LangChain AI][2])

---

## 3. 5 分クイックスタート

```python
# pip install langchain langgraph openai
from langgraph.graph import StateGraph
from langgraph.schema import State

class MyState(State):
    query: str
    answer: str | None = None

def retriever(state: MyState):
    # ベクトル検索など
    return state.model_copy(update={"answer": "Dummy answer"})

def summarizer(state: MyState):
    # LLM で要約
    return state

g = StateGraph(MyState)
g.add_node("retrieve", retriever)
g.add_node("summarize", summarizer)
g.set_entry_point("retrieve").connect("retrieve", "summarize")
app = g.compile()
print(app.invoke(MyState(query="会社のペインは?")))
```

> 📝 **実務 Tip**
>
> * `State` を Pydantic v2 で定義すると自動スキーマ生成
> * ループ処理は `graph.add_conditional_edge` で実装可([Zep - AI Agent Memory][3])

---

## 4. Enterprise Best Practice

1. **小さくモジュール化** : “聞く ➜ まとめる ➜ 提案する” を 3 ノードに
2. **永続化バックエンド** : まずは SQLite → 本番は DynamoDB など
3. **Observability** : LangSmith / OpenTelemetry 併用でトレース可視化

---

## 5. まとめ

> LangGraph を使うと「*業務フローを絵に描いて、そのまま動かす*」が現実になる。
> Semantic Kernel の Planner と組み合わせれば、“LLM が計画 → Graph が実行” の二段ロケットも可能だ。
semantic kernel入門

## ① Semantic Kernel 入門

### ―― エンタープライズ AI エージェント開発の青写真

# Semantic Kernel 入門  
エンタープライズ AI エージェント開発の青写真
*Published 2025-05-07*

## TL;DR
- **Semantic Kernel (SK)** は Microsoft 製のオープンソース SDK。Planner／Memory／Function Calling を軸に *「業務プロセス ⇄ LLM」* を橋渡しする。 
- **強み** : 拡張性・プラグイン経済・エンタープライズ指向のロードマップ。
- **典型用途** : FAQ Bot→社内ドキュメント検索→自律タスク実行と段階的に拡張できる。  

---

## 1. なぜ今 Semantic Kernel なのか
- *エンタープライズ要求*（監査ログ／セキュリティ／冪等性）が盛り込まれた設計。  
- プラグインは **OpenAI Functions 相当** のインターフェース。C#・Python・Java に同一 API。:contentReference[oaicite:2]{index=2}  

---

## 2. コアコンポーネントざっくり図解

| コンポーネント | ひとこと説明 | 主な役割 |
| --- | --- | --- |
| `Kernel` | DI コンテナのようなハブ | モデル設定・メモリ設定を一元管理 |
| `Semantic Function` | ⭕ *=`prompt + schema`* | GPT 呼び出しを型安全に |
| `Planner` | ゴール駆動のタスク分解 | “LLM に計画させる” |
| `Memory` | `key-value` or `vector` | 過去対話・外部文書を検索 |
| **接続先** | SQL / Blob / Qdrant など | Memory Connector で差し替え可能 |

---

## 3. 5 分で動かす：Planner + Memory

```python
# 1) pip install semantic-kernel openai
from semantic_kernel import Kernel, MemoryStore
from semantic_kernel.planning import BasicPlanner

kernel = Kernel()
kernel.add_text_completion_service("gpt", "gpt-4o", api_key="YOUR_KEY")

# Memory: 社内手順書を登録
kernel.memory = MemoryStore.from_texts(
    texts=["手順1: ...", "手順2: ..."], namespace="ops-doc"
)

planner = BasicPlanner(kernel)
goal = "今週の運用タスクをリストアップしてください"

plan = planner.create_plan(goal)
print("## PLAN\n", plan.generated_plan)
result = planner.execute_plan(plan)
print("## RESULT\n", result)
````

> 🔍 **ポイント**
>
> * `MemoryStore` は後で Redis / Azure AI Search へ差し替え可
> * `generated_plan` をログに残せば**監査証跡**になる

---

## 4. 企業導入パターン

### 🥉 ★★★ Phase 1 ― FAQ Bot

社内規程 PDF ➜ Embedding ➜ Memory ➜ QA

### 🥈 ★★★★ Phase 2 ― Smart RAG

Planner で「なぜそう答えたか」を根拠リンク付きで生成

### 🥇 ★★★★★ Phase 3 ― 自律エージェント

Planner + 外部 API Plugin（JIRA, ServiceNow）で半自動チケット解決

---

## 5. ロードマップと今後

* **Small Model Support**: 社内 GPU 上で LLama 3 を走らせる公式レシピ予定([Microsoft for Developers][1])
* **マルチエージェント協調 API**: “複数 Planner をオーケストレーション” 機能を開発中

---

## まとめ

> Semantic Kernel は *「LLM を業務フローに埋め込む標準ライブラリ」* を目指す。
> **Planner × Memory** が動けば、次は *ログ設計* と *権限管理* を考えよう！
【WEB系フリーランス→システム開発会社】転職して1年、感じたことや学んだことなど

# はじめに
どうも、web系からシステム開発にジョブチェンして１年の@kaiparuです。

私はもともとWEB系フリーランスとして6年間活動していたんですが、1年前にご縁があってシステム開発会社に転職しました。

「フリーランス→会社員」って、逆のパターンの話はよく聞くけど、実際どうなの？って思う方も多いかもしれません。
この記事では、実際に会社員になってみて感じたこと、良かったことやちょっとしんどかったこと、生活の変化などをリアルにお話ししていきます！

- フリーランスから会社員になろうか迷っている人
- 今まさに転職活動中の人
- 会社員だけど、独立もちょっと気になっている人

そんな方の参考になればうれしいです！

# 転職したきっかけ

きっかけは、正直「ちょっと疲れたなぁ…」という気持ちでした。
フリーランスって自由な反面、孤独だったり、将来の不安がじわじわ溜まってきたりするんですよね。

「今月は仕事が多くてよかったけど、来月はどうだろう…？」

って、常に不安との戦いで。

それに、自分のスキルも「このままでいいのかな？」って考えることが増えてきました。  
もっとチームでの開発を経験したり、中〜大規模な案件に関わってみたい！と思うように。

「思い立ったが吉日」ってことで、ノリと勢いで転職エージェントに登録したのが、転職活動のスタートでした。

# 転職活動について

転職活動を始めたのは2024年2月の中頃でした。
無理のないペースで始めたつもりが、3月の頭には内定が出てて、想像よりも早く決まりました！

フリーランス時代の実績があったおかげか、興味を持って話を聞いてくれる会社が多く、ありがたかったです。
ただ、「どんな働き方をしたいか」っていう軸はちゃんと決めてて、**リモートOK**なのと、**副業OK**なところを条件にしてました。

というのも、実は副業で**爬虫類（ボールパイソン）のブリーダー**をやってるのと、**犬を2匹飼ってる**んですよね。
できるだけ今まで通り、ペットたちと一緒に過ごす時間を大切にしたかったので、副業OKとリモートワークOKは必須条件にしてました。

あと、私は大学を中退していて就活の経験がなかったので、面接はめちゃくちゃ緊張しました…。 
でも実際受けてみたら、思ったよりフランクな雰囲気の会社が多くて、ほっとしました。 

聞かれた内容も

「フリーランス時代にどんなことが大変だった？」
「どうやって乗り越えたの？」

みたいな話が多かったです。

それと、「これからどんなふうに成長していきたいか」っていうキャリアの話もけっこう聞かれました。
ここは自分でもしっかり考えておくと、面接でも話しやすくなると思います！

# 入社してみて

### 良かったこと

- **チームで開発する楽しさ**
    - ひとりでやるのも嫌いじゃなかったけど、相談できたりレビューし合えたりする環境って、ほんとありがたい！  
    - 自分の意見を言ったり、他の人の視点を取り入れることで、より良いものが作れる実感があります。
- **成長を実感できる**
    - 周りにすごい人がたくさんいて、自然と刺激をもらえるし、自分もがんばろうってなる。
    - 自分ではキャッチできなかった情報や技術も、みんなでシェアしてくれるので、学びがどんどん増えます！
- **新しい技術に触れる機会が増えた**
  - フリーランス時代は慣れ親しんだ技術を使うことが多かったけど、今はチームで技術選定するから、自然と新しいことにもチャレンジするようになりました。
- **生活が安定した**
    - 固定収入の安心感、めちゃくちゃ大きいです。笑  
    - 保険や年金の支払いも会社がやってくれるし、厚生年金にも加入できて、将来のことを考えると安心感が増しました。
- **土日祝休み**
    - フリーランスのときも平日稼働にしてたけど、なんだかんだ土日にも仕事してたので、「完全オフの日がある」って、想像以上にうれしい！

### ちょっとしんどかったこと

- **技術スタックの違い**
  - 今まではWeb中心だったけど、入社してからはTypeScriptやAWSなど、ちょっと違う技術がメインで勉強の日々。
  - でも、逆に新しい技術に触れるチャンスでもあるので、今は楽しんでいます！
- **コミュニケーションスタイルの違い**
  - フリーランス時代は、週1で打ち合わせして、あとは一人で作業って感じでマイペースに進められていた。
  - 今は日常的にチームとやりとりするスタイルで、作業時間もなるべくチームメンバーに合わせるようにしています。
  - 最初は「こんなにチャット送って大丈夫？」って緊張しましたが、慣れてくると「ひとりじゃない」って心強さもあります！

# 生活の変化

### 変化したこと
- **休みの日にしっかり休める**  
  - 「休みだけどちょっと仕事しとくか…」みたいなことがなくなって、しっかりリフレッシュできるようになりました。  
  - 趣味の時間や友達との時間を大切にするようになりました。
- **メリハリがついた**
  - フリーランス時代は仕事とプライベートの境目が曖昧だった。
  - 今は業務時間とプライベートがきっちり分かれてて、仕事終わりは完全にオフモードに切り替えられるように。

### 変わらないこと
- **リモートワーク**
  - フリーランス時代からリモートワークをしていて、今も変わらずリモートで働いています。
  - チームメンバーと直接会う機会は少ないですが、オンラインでのコミュニケーションがしっかりとれているので、特に不便さは感じてません。
- **副業も続けている**
  - 会社の方針として副業がOKなので、時間の使い方に気をつけながら、副業のブリーダー業も続けています。

# まとめ

フリーランスから会社員への転職、最初は正直すごく不安でした。  
「ちゃんとやっていけるかな…」「会社のルールとかついていけるかな…」ってドキドキだったけど、1年経った今は「飛び込んでみてよかった！」って思ってます。

もちろん、フリーランスにも会社員にも、それぞれ良さがあると思います。  
自由で気ままな働き方ができるのはフリーランスの強みだし、チームで協力しながら作る楽しさや、安定した暮らしがあるのは会社員ならでは。

どっちが正解！とかじゃなくて、自分のライフスタイルや価値観に合った働き方を選ぶのがいいと思うし、私はその両方を経験できてすごくよかったなと思ってます。
これからもその経験を活かして、もっと良いエンジニアになれるようにがんばります！

ここまで読んでくれてありがとうございました！  
なにか気になることがあれば、気軽にコメントで聞いてください。
【自分用メモ】IT用語

ソフトのお仕事していたら出てきた用語をまとめていきます。
なお、組込み開発で出て気がちな用語は[【自分用メモ】組込みに関する用語](https://qiita.com/yingwuteng516/items/5900cf0c4fa759eccea9)にまとめています。


# ソフトウェア開発 

## プロファイル
主にIT分野の標準化された企画などで定められた、共通の技術仕様やプロトコルをまとめたもの。
「設定情報」「属性情報」は、総じてプロファイルと言われる。
参考：[goo辞書](https://dictionary.goo.ne.jp/word/プロファイル/)
参考：[ZenfoneGo取り扱い説明書 SIMフリースマホ(非公式)](https://mocchis.net/archive/497/)


## ターミネーションバイト(termination byte)
終端文字のこと。


# Git

## チェリーピック(cherry-pick)
ブランチ間で特定のコミットをマージしたいが、全部はマージしたくない時に使う。
参考：[【Git】cherry-pickで解決](https://qiita.com/okmtz/items/62aa5a25f75b1754a861)
いろんなアルゴリズム"00.00.00.0d"

[知恵の館の目次](https://qiita.com/rionQ/items/0ba7a700620a1d617bc6)
# 立ち位置・仕様
* いろんなアルゴリズムをコピペできるように記録するのみ
* 最適化が目的でない
* たまにメモとして解説を残す
* 最低限でまとめる
* データを抽出しやすいように個別のIDを付与
* あるアルゴリズムにおいて、他のアルゴリズムが登場する際にはそのIDを付与
* IDは16進数表記
* なるべく最低限なパッケージで実装
* なるべく特殊なオブジェクト型は使用しない

# TargetID
00.00.00.0d

# ReferenceID

# 深さ優先探索（depth first search）
```python:
def depthFirstSearch(graph_dict, start, goal):
	# graph_dictは有向グラフ
	# keyがparent、valueがchildren
	# 親ノードが一つのみの場合
	stack_list = [start]
	visitedNode_list = [start]

	flag = False

	while True:
		if not stack_list:
			flag = False
			break
		node = stack_list[-1]
		if node == goal:
			flag = True
			break
		children_list = graph_dict[node]
		child = None
		for c in children_list: 
			if c not in visitedNode_list:
				child = c
				break
		if child == None:
			stack_list = stack_list[:-1]
		else:
			visitedNode_list.append(child)
			stack_list.append(child)
	if flag:
		return stack_list
	else:
		return None
```

# 使用方法
```python:
graph_dict = {
    1:[2,3],
    2:[4],
    3:[5,6,7],
    4:[8],
    5:[],
    6:[9],
    7:[],
    8:[],
    9:[]}
print(depthFirstSearch(graph_dict,1,9)) # [1, 3, 6, 9]
# visitedNode_list = [1, 2, 4, 8, 3, 5, 6, 9]
```