OmniAICreator/Qiita-1.07M huggingface dataset:
Rails開発時に導入したいVS Code拡張機能について

# 概要
こんばんは。 Rails開発歴3年のWebエンジニアです。

Rails開発時に導入したい`VS Code`の拡張機能をまとめました。
開発時の参考にしていただければと思います。

# Line up

まずは`Rails`開発をするのであれば導入しておきたい拡張機能をご紹介します。

### Ruby LSP

https://marketplace.visualstudio.com/items?itemName=Shopify.ruby-lsp&ssr=false#review-details

- `Ruby`専用の`Language Server Protocol`サポートで、コード補完やシンボルジャンプを可能にしてくれます

### Rails

https://marketplace.visualstudio.com/items?itemName=bung87.rails

- `Rails`プロジェクト向けに、コントローラやモデル間の移動・スニペット・補完などを実施してくれます

### ruby-rubocop

https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop

- コード規約に従っているかチェックしてくれます
- ルールに違反している箇所があればハイライトしてくれます。

### Ruby Solargraph

https://marketplace.visualstudio.com/items?itemName=castwide.solargraph&ssr=false#review-details

- `Ruby`コード解析・型補完・ドキュメント表示を強化してくれます

### GitLens

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens&ssr=false#review-details

- Git履歴やブレーム、変更箇所などをエディタ内で可視化し、Git操作を効率化してくれます

### endwise

https://marketplace.visualstudio.com/items?itemName=kaiwood.endwise

- `if`ブロックなどの`end`を自動的に補完し、コード整形をサポートしてくれます

### Rails Go to Spec

https://marketplace.visualstudio.com/items?itemName=sporto.rails-go-to-spec&ssr=false#review-details

- ModelやControllerで `Ctrl + Shift + y` をクリックすると、specを自動生成してくれる機能です
- レールに沿ったディレクトリにファイルを自動生成してくれるので便利です
- ただし、Request Specの自動生成には非対応

# その他

以下は`Rails`開発とは直接関連しませんが、
個人的にあったら便利と感じる拡張機能の一覧です。

### MySQL

https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-mysql-client2&ssr=false#review-details

- GUI上からMySQLにアクセスすることができる拡張機能
- 実データを画面上から確認することができるので、開発効率がアップします

### Japanese Language Pack for Visual Studio Code

https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja&ssr=false#review-details

- VS CodeのUIを日本語化し、操作性を向上してくれます

### Code Spell Checker

https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker&ssr=false#review-details

- typo を検出してハイライトしてくれます
- 英語力が弱い自分はお世話になっています（PRで指摘されると恥ずかしい...）

### ESLint

https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint&ssr=false#review-details

- JavaScript/TypeScript向けのコード規約チェックツールで、エラー箇所をハイライトして修正を促してくれます
- ReactやVueを利用する場合は導入しておきたいです

### Stylelint

https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint

- CSS/SCSS向けのコードチェック・自動修正により、スタイルシートの品質向上を支援してくれます
- スタイル修正を担当する場合は導入しておきたいです

### HTML CSS Support

https://marketplace.visualstudio.com/items?itemName=ecmel.vscode-html-css&ssr=false#review-details

- HTML内で記述したCSSクラスやIDをコード補完・プレビューし、フロントエンド開発を円滑化してくれます

### Tabnine

https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&ssr=false#review-details

- AIで入力中コードの補足を生成してくれます

### zenkaku 

https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku&ssr=false#review-details

- 全角スペースを可視化してくれます
- コード上に不要なスペースが入ることを防いでくれるので便利です

### GitHub Theme

https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme&ssr=false#review-details

- GitHubと同様のテーマをVS Codeに適用してくれます
- 見た目をカスタマイズできるのでテンションが上がります

# まとめ

以上です。
参考になれば幸いです！
オペレーター時代に連絡役でお客さんのＮＷでループを発生させた

## はじめに
これは、私が運用オペレーターをやっていた頃のお話です。
だいぶ前の話なので少し忘れかけていたり、話を一部ぼかしておりますので、辻褄が合わない、読みづらい箇所につきましてはご了承ください。

## 概要
ある日、お客様の拠点にてNW更改作業がありました。現地での配線はお客様で行い、NW機器の設定を保守チームがリモートで行い、オペレーター(私)はお客様と保守チームの間で連絡を行っておりました。
また、この時の連絡手段は全て電話で行っております。

## ループ発生
お客様から配線の完了連絡を受け取った私は、その内容を保守チームへ報告しました。しかし、この時点でお客様の配線が誤っていると保守チームから連絡を受けた私は、お客様へ保守チームからの指摘を伝えたつもりでしたが、誤ったポートを伝えていました。この時伝えた構成がたまたまループしていました。
お客様は私がお伝えした通りに配線を行い、再び完了連絡を受け取った私は保守チームへ報告し、保守チームは次工程の設定変更（ポート開放とかそんな感じです）を行った瞬間、私の手元に見たことがない量のアラート（ループが原因で一部NWがダウン）が飛んできました。また、ループが発生したことによりお客様のシステムが一部停止。この時、作業時間が業務後であり、停止したシステムは業務中のみ使用されるモノだったため、サービス影響はあまりなかったのが不幸中の幸いでした。
その後はなんやかんやで復旧し、お客様からの注意と再発防止策の報告しこの作業は終了しました。

## 原因と対策
### 原因
1.全てが口頭ベースの報告になっていた
2.作業前に構成を理解できていなかった
3.作業内容が分かっていなかった

### 対策
1.全てが口頭ベースの報告になっていた
口頭ベースはスピード感がある反面、聞き間違え、事実とは異なる解釈を行われる恐れがあります。
そのため、今回のように設定や構成変更を伴う作業を行う時は、必ず文字ベースで連絡を取り、認識齟齬が無いようにしましょう。

2.作業前に構成を理解できていなかった
3.作業内容が分かっていなかった
事前に構成を理解していれば、聞き間違えが発生した際に踏みとどまることができます。
また、作業前に作業に関わるメンバー全員で打ち合わせを行い、認識の祖語を解決させることでスムーズな作業を可能にすることができます。

## まとめ
今回、私がお伝えしたいのは末端のオペレーターも一歩間違えればお客様のシステムを停止させる危険性を秘めているということです。ですので、初心者エンジニアでオペレーターにアサインされた方には、是非、なぜこの作業を行うのか、自分たちが管理しているシステムの構成はどうなっているのかを一歩踏み込んで理解し、私のような失敗を起こさないことを願います。
EclipseはJAVAの救世主か

JAVAは言語の中で１０番目くらい使っている。C#、Lispよりはたくさん。
Eclipseは、Visual Code、Emacs, VZ、viよりも使っている。mi, さくらeditorの次くらい。

Eclipseを使っていて、JAVAのエラーがわからないのは悲しい。
Emacsを使っていて、LISPの使い方がわからないよりも悲しい。

Eclipseのキラーアプリケーションが出れば、まだ挽回の機会はあると思う。

# Eclipse
「基礎からわかるTCP/IP JAVAネットワークプログラミング」Eclipseでコンパイル。Wireshark(5)でデバッグ。ethernet(111) coding(82)
https://qiita.com/kaizen_nagoya/items/14519536b827fdadb32e

No Cask with this name exists. Did you mean one of these?　macOSにbrew caskでEclipseを導入する(５つの壁+1)　error(58)
https://qiita.com/kaizen_nagoya/items/b17f03db00aceee41a80

Eclipse Software Defined Vehicle SDV(13)
https://qiita.com/kaizen_nagoya/items/efd17fef462e30423a78



# JAVA
初めてのJAVA coding(149)
https://qiita.com/kaizen_nagoya/items/9e7ec2b172833b5758e4

「Java、Javascript」「インド、インドネシア」:別物と言う割に共通点は多い。仮説(89)
https://qiita.com/kaizen_nagoya/items/2c331ff6654d41d5e157

dockerで機械学習(87) with JAVA(1)「Machine Learning: End-to-End guide for Java developers」 By Richard Reese, Jennifer Reese, Bostjan Kaluza, Uday Kamath, Krishna Choppella
https://qiita.com/kaizen_nagoya/items/2d3a4f168b4c9a28b32e

第二章JAVAによるネットワークプログラミング,phttpd,三箇所でException収集 Ethernet(81) error(73) wireshark(26)
https://qiita.com/kaizen_nagoya/items/d1db78d3db0e90c0ff9f

ExcelとDB+JAVAの比較 coding(79)
https://qiita.com/kaizen_nagoya/items/aac9166fec2c333f4e94
社内コミュニティってめっちゃいい

一年を振り返る Advent Calendar 2024の22日目です。25日まであともうちょっと。全記事が短く粗々しくざっくりしてますが、最後まで走り抜けます。

転職してから今までの会社でなかったものがあるなぁ（あったんかもですが）と今振り返って思いましたが

そう、社内コミュニティです。


https://keen-inc.com/post/syanai-community

- 社内コミュニティとは「社員同士が何かしらの目的をもって集まっている集まり」のことです

とのこと。これ、社員同士が集まって目標を持って活動しているのですが、良いなぁと思ったのを3点ほど。
（いつかどこかでちゃんとコミュニティの良さみたいなものを書いてみようと思います。）

## 横のつながりが増える
これは転職してから結構嬉しかったのですが、自担当しか知らない、かつ周りが忙しすぎてコミュニケーションがなかな取りにくいような状況を最初は過ごしてました。
コミュニティに誘っていただいてから、他の部署の人や、仕事で話に出てくる人とかとつながることができて、キャリア採用の人間としてはとてもありがたい場だなぁと思いました。


## 自己肯定感が上がる
これは人それぞれかもですが、コミュニティの中で不明点の相談のスレッドがあったりします。そこで気軽に相談したりできますが、逆に技術的な面で回答してあげて、かつ解決できたりするととても自己肯定感が上がっていいなぁと思いました。（テクニカルサポート時代に仕事でやってたことと同じ感覚。）
あとは自分から情報を発信することでコミュニティのみんなに何か新しいきっかけになるような知見を広げたりすることができるのもなんかいいなと思いました。
自分みたいに技術力もないし知見もないような人間からしたらそういうの発信してくれる人とてもありがたいと思っています。

## コミュニティ内で結構イベントがある
これは会社が大きいからできるのか、開催されるイベントが他社コミュニティとのコラボであったり、そもそも社内で開催するイベントの規模もデカかったりするので、普通に某社のやってるセミナーやんみたいな感じのイベントがあったりするのが良いなと思いました。
あと、会社と会社のつながりがあるので、その会社だからこそできるイベントみたいなものもあってよいなと思いました。

## まとめ
コミュニティ、いいね。
「駅着いた！帰宅時間は〇〇時〇〇分」の連絡をボタン１つで完結

毎日駅に着くたびに、奥さんへ帰宅時間を報告するのが我が家の掟。「駅着いた！帰宅時間は〇〇時〇〇分だよ〜」メッセージを、ボタン一発でLINEに送信できる仕組みを作っちゃおうじゃありませんか！その手段は、iPhoneのショートカットアプリです！

🍀 完成イメージ
通知されるメッセージはこんな感じ👇



![スクリーンショット 2024-12-11 21.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/67a9aba8-d42a-465d-b212-3412f32f15b1.png)


駅着いた！家に〇〇時〇〇分に帰るね！

## 📱 設定方法

①　ギャラリー　→「自宅」を検索　→　「自宅までの所要時間」を押す


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/3c2dd80d-c51d-7746-343d-07fc5343f03e.png" width=50%>




② 設定画面に従って以下の画面になるまで進める※ 最後のページで「設定をスキップ」を押す



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/28f04c03-45d5-8155-850a-85f31fc81a30.png" width=50%>

③ 全てのショートカットを再度押す「車」→「徒歩」に変更


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/ffaff25c-a9ff-3c52-4bbf-a8fc21c464ad.png" width=50%>



④ テキストに「メッセージを書く（ここ一番重要　心を込めて）」⑤ メッセージの項目を×を押して「LINE」に変更する（メッセージ送り主も設定）


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/20d85a06-06d1-8da7-aa6f-f0fe8cba6752.png" width=50%>



⑥ LINEに自動で通知される



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/98987618-8c70-816d-6e07-36b577888201.png" width=50%>







## 最後に

毎日、駅から大体10分ぐらい→時間を見る→LINE開く→今の時間＋10分計算→「〇〇時〇〇分に帰るね」と打つ。1日3分だとして、サラリーマンの１年間平均出勤日数は、240日間。

3分 × 240日 = 720分

240日間続けると、合計で720分、つまり12時間の時間が費やされることになります。12時間をこれで削減できます。設定ちょっとめんどくさいけどやってみる価値はあると思います！
【Advent Calendar 2024 #10日目】AWS学習〜生成AI/ML編〜 Amazon SageMaker

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の10日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
10日目は、Amazon SageMakerについてまとめます。

# Amazon SageMaker
あらゆるユースケースで高性能で低コストの機械学習 (ML) を実現する幅広いツールを統合した完全マネージド型サービス

https://aws.amazon.com/jp/sagemaker/

### SageMaker Ground Truth
- データにラベル (Ground Truth) を付与するアノテーション作業の支援サービス
- ラベルを付与するワーカーは，Amazon Mechanical Turk，外部ベンダ(AWS
Marketplace)，自社のプライベートチーム の3つから選択する

https://aws.amazon.com/jp/sagemaker/groundtruth/?nc=sn&loc=0

- また、専門スタッフが高品質のトレーニングデータセットを迅速に提供するも存在する

https://aws.amazon.com/jp/blogs/news/announcing-amazon-sagemaker-ground-truth-plus/

### SageMaker Data Wrangler
 - データ準備と特徴量エンジニアリングのプロセスを簡素化し、データ準備ワークフローの各ステップ (データの選択、クレンジング、探索、視覚化、大規模な処理など) を完了できる
 - Amazon SageMaker Studioで利用可能

https://aws.amazon.com/jp/sagemaker/data-wrangler/

### Amazon SageMaker Model Monitor
- 本番環境の機械学習 (ML) モデルを自動的にモニタリングし、品質の問題が発生したときに通知する

https://aws.amazon.com/jp/sagemaker/ml-governance/

### SageMaker Clarify
- 分析ジョブが実行され、特徴量の潜在的バイアスを検出する
- 潜在的バイアスのメトリクスと測定結果の説明を含む視覚的なレポートを出力し、バイアスを修正する手順を特定できる

https://aws.amazon.com/jp/sagemaker/clarify/

### Amazon SageMaker Feature Store
- 機械学習 (ML) モデルの特徴を保存、共有、管理するための完全に管理された専用リポジトリ

https://aws.amazon.com/jp/sagemaker/feature-store/

### Amazon SageMaker Canvas
- コーディング不要のビュアルインターフェイスであり、データの準備、高精度の ML モデルの構築とデプロイを可能にする

https://aws.amazon.com/jp/sagemaker/canvas/
#SQLの基礎

# SQLの基礎

SQL (Structured Query Language) は、リレーショナルデータベースを操作するための標準的な言語です。本記事では、SQLの基本的な構文や使用方法について解説します。データベース初心者向けに、よく使われるコマンドやその使い方を例とともに説明します。

---

## 1. SQLの基本
SQLは、以下のような操作を行うために使用されます：

- データの挿入 (INSERT)
- データの取得 (SELECT)
- データの更新 (UPDATE)
- データの削除 (DELETE)
- データベースやテーブルの作成と管理 (CREATE, DROP, ALTER)

---

## 2. テーブルの作成
データベース内でデータを保存するにはテーブルが必要です。以下は、テーブルを作成するための `CREATE TABLE` 文の例です：

```sql
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

### 解説
- `id`: 自動的に増加する主キー (PRIMARY KEY)
- `name`: 名前を格納する文字列列
- `email`: 一意性を保証するメールアドレス列
- `created_at`: レコードの作成日時を自動設定する列

---

## 3. データの挿入
データをテーブルに挿入するには `INSERT INTO` 文を使用します。

```sql
INSERT INTO users (name, email)
VALUES ('Taro Yamada', 'taro@example.com');
```

### 解説
- `users`: データを挿入するテーブル名
- `(name, email)`: 挿入する列
- `VALUES`: 実際に挿入する値

---

## 4. データの取得
データを取得するために `SELECT` 文を使用します。

```sql
SELECT * FROM users;
```

### 解説
- `*`: すべての列を取得
- `FROM users`: `users` テーブルからデータを取得

条件を指定してデータを取得することも可能です：

```sql
SELECT name, email FROM users WHERE id = 1;
```

### 解説
- `WHERE`: 条件を指定して絞り込み
- `id = 1`: `id` が1のレコードのみ取得

---

## 5. データの更新
データを更新するには `UPDATE` 文を使用します。

```sql
UPDATE users SET name = 'Hanako Yamada' WHERE id = 1;
```

### 解説
- `SET`: 更新する列と新しい値を指定
- `WHERE`: 更新する対象の条件を指定

---

## 6. データの削除
データを削除するには `DELETE` 文を使用します。

```sql
DELETE FROM users WHERE id = 1;
```

### 解説
- `DELETE FROM`: データを削除する対象のテーブルを指定
- `WHERE`: 削除する条件を指定

注意：`WHERE` を省略すると、すべてのデータが削除されるため注意が必要です。

---

## 7. データベースの基本管理
### データベースの作成

```sql
CREATE DATABASE my_database;
```

### データベースの選択

```sql
USE my_database;
```

### テーブルの削除

```sql
DROP TABLE users;
```

---

## 8. まとめ
この記事では、SQLの基本的な操作について解説しました。以下が主なポイントです：

- テーブルの作成と管理
- データの挿入、取得、更新、削除
- 基本的なSQL文の構文

SQLは多機能で、さらに高度な操作や最適化も可能です。まずは基本的な操作に慣れ、必要に応じて応用技術を学んでいきましょう。
私がおすすめするUdemy講座

# おすすめするUdemy講座

私が見たUdemyのおすすめ講座を紹介します。

## フロントエンド編

主にReactやNext.jsの開発についての講座を紹介します。

### 1. 【2024年最新】React(v18)完全入門ガイド｜Hooks、Next14、Redux、TypeScript

Webアプリケーションを作りたいけれど、何から始めればよいかわからない方に最適な講座です。この講座では、最近主流の **React** やそのフレームワークである **Next.js** を1から学ぶことができます。

- **時間**: 26.5時間の丁寧な解説
- **特徴**: ハンズオン形式で誰でも簡単に学習可能
- **おすすめポイント**:
  - 初心者がReactの基礎をしっかり学べる
  - 状態管理ツール **Redux** の理解に役立つ

特にReduxは大規模アプリケーション開発に欠かせない技術ですが難易度が高いので、この講座の該当部分だけ視聴する価値もあります。

:::note warn
1つ1つを完璧に理解しようとすると時間がかかります。7割程度理解できれば、残りは自作のアプリ開発を通じて補う方が効率的です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/69223a1c-fc1e-9cc5-bdd3-2b5441b922d8.png)

https://www.udemy.com/course/react-complete-guide/?couponCode=KEEPLEARNING

---

### 2. チャート式問題集のように学ぶ React・TypeScript・Tailwind CSS

この講座は、1つ目の講座を終えた後におすすめです。特に「作りたいアプリがない」という方に向けて、実践的な課題を通じて学べます。

- **特徴**:
  - チャート式課題形式で学ぶ
  - **Tailwind CSS** や **TypeScript** の活用法を解説

Tailwind CSSは細かなUI設定を可能にし、TypeScriptは型付けによりチーム開発での効率を向上させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/5154e0b7-3212-84e3-26f7-a9f0c3bb7271.png)

https://www.udemy.com/course/react-chart-app/?couponCode=KEEPLEARNING

---

### 3. Next.js × shadcn/ui × Supabaseで本格的なWebアプリ開発を学ぶフルスタック講座

ReactやNext.jsの基礎を理解した後、フルスタック開発を目指す方に最適な講座です。以下のスキルを習得できます：

1. **Prisma** を用いたデータベース操作（CRUD）
2. **shadcn/ui** を活用したUI構築
3. **NextAuth** を用いた認証機能の実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/5154e0b7-3212-84e3-26f7-a9f0c3bb7271.png)

https://www.udemy.com/course/nextjs-shadcn-fullstack-webapp-dev/?couponCode=KEEPLEARNING

## バックエンド編

バックエンドでは、Node.jsについての講座を紹介します。

### Node.jsで学ぶWebシステムとソフトウェア開発基礎！Node.js完全入門ガイド

この講座では、 **Node.js** を使ったバックエンド開発を学べます。

- **対象**: フロントエンドに続いてバックエンドを学びたい方
- **特徴**:
  1. Node.jsを用いたスクレイピング
  2. MERNスタック（MongoDB, Express, React, Node.js）を使ったフルスタック開発

また、Node.jsはJavaScriptで記述できるため、フロントエンドを勉強した人がバックエンドを勉強する際の学習コストが低いという利点があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/7ff609c4-1d07-b56c-a1e7-3bbf86b64d36.png)

https://www.udemy.com/course/nodejs-comp-guide/?couponCode=KEEPLEARNING

## GitHub編

チーム開発に欠かせないGitHubの講座を2つ紹介します。どちらも同じ講師による講座で、連続して受講することをおすすめします。どちらの講座も、図解がありGitHubのデータ構造がわかりやすく解説されています。

### 1. Git：はじめてのGitとGitHub

GitHubの基本をわかりやすく図解で解説しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/a47dc21d-509c-9ef6-c75c-728d46064d67.png)

https://www.udemy.com/course/intro_git/

### 2. Git：もう怖くないGit！チーム開発で必要なGitを完全マスター

より実践的な内容に進みたい方に最適です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/c4c53d97-268c-ca0e-fc45-75180c403786.png)

https://www.udemy.com/course/unscared_git/?couponCode=KEEPLEARNING

---

これらの講座を活用して、フロントエンド・バックエンド・チーム開発のスキルを効率的に習得しましょう！


:::note alert
Udemyの講座を見るだけで満足しがちですが、すべての講座を見終えた後に、簡単にアウトプットをすることで、知識の定着を図ることができます。自分で小さなプロジェクトを作るか、学んだ内容をブログなどで発信することをおすすめします。
:::
イベントレポート「女性エンジニア必見！LangChainとLangGraphによるRAG・AIエージェント［実践］入門」

お疲れさまです、みやもとです。

先日参加したオンラインイベントが楽しかったので、さっそくレポートを書いてみることにしました。
WAKE Careerさん主催「[女性エンジニア必見！LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://wake-career.connpass.com/event/336681/)」です。

https://wake-career.connpass.com/event/336681/

以前のイベントレポートを見てくださった方はお気づきかもしれません。
みやもとがエバンジェリストとして参加させていただいているコミュニティ「WAKE Community」の運営会社、bgrass株式会社の転職サービスがWAKE Careerですね。
タイトルで女性エンジニアを強調されていますが、ほとんどのオンラインイベントは性別問わず参加可能で今回も男性参加者がいらっしゃいました。

いつも通りの簡易レポートなので、詳細は後日アップロードされるであろうアーカイブをご参照いただけましたら幸いです。

## イベント概要
書籍『LangChainとLangGraphによるRAG・AIエージェント［実践］入門』をベースに著者の方々のLTやパネルディスカッションが行われました。
個人的にRAGは「興味はあるけど何に使ったらいいのかよくわからない」という感じ。
何か作るヒントになるかなーという期待を抱いての参加です。
あと個人的に、新卒の頃の資格試験ですごく頼りにしていた試験対策本の出版社さんが出された本なのでわりと無条件に印象が良いです。

### LT①：「なぜいまAIエージェントか？」
株式会社ジェネラティブエージェンツ取締役COO 吉田真吾さんのお話です。
ご自身がAIを組み込んで作った社内質問対応BOTのお話から始まり
* AIエージェントに関するここ数年の流れ
* LLMとAIエージェントの何がかみ合って発展しているのか
* なぜAIエージェントをLangChainで作るのか

といったお話をうかがいました。
LangChainについては「名前をよく聞くなー」という程度の知識しかなくRAGと同様にどう使ったものか想像がつかないものだったので、ここお話を聞いたことで少し興味がわきました。

## LT②：「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」
こちらも株式会社ジェネラティブエージェンツ取締役CTO 大嶋勇樹さんのお話。
プロフィールを拝見して、以前に参加した勉強会の主催コミュニティを運営してらっしゃる方と知りびっくりしました。
こちらはさらに本の内容に関するお話が深められた印象です。
先のLTでもふれられた「なぜLangChainなのか」というところに関して、「LangChainがLLMアプリケーション開発の幅広いユースケースを対象としている、翻ってLangChainを学ぶことがそのままLLMアプリケーション開発基礎を学ぶことになる」というお話になるほど！と納得。
「RAGはLLMを使った処理としては定番だからこそ精度が話題になる。精度改善を理屈だけで考えているとわからなくなるからハンズオンでやってみよう」というくだりも、「作って動かさないとわからん…」となりがちな私にとってはすごくありがたいお話でした。

### パネルディスカッション
ここからは登壇されたお二人に加えて、株式会社ジェネラティブエージェンツ代表取締役CEO 西見公宏さんと主催コミュニティからだむはさんによるパネルディスカッション。
テーマとして挙げられた話題やslidoで募集した質問への回答等、いずれも聞きごたえのあるお話ばかりでした。
印象に残ったのは
* LLMはなんでもできそうに見えてできないこともある。エンジニアはどこまでできるか見極めることが大事
* チャット型アプリケーションがLLMの代表的ユースケースになっているからこそプロンプトの良し悪しで成果が違う。でもプロンプトの書き方がすべてかというと違うのでは？
* AI含め新しい技術はいち早く使っていかないといざ利用したいときに何もわからない。日本ではそのリスクが軽視されやすい

というあたりのお話。
特にプロンプトの書き方に関して、私もプロンプトをいじって満足している節があったので「言われてみれば」と衝撃を受けました。

## イベント参加の感想
挑戦したことのない技術に関するお話はどれも新鮮ですが、今回は特に「聞いた話をもとに何かやってみたい！」という意欲がわいてきましたね。
趣味で作ったLINEBOTはいずれもRAGを使わないものだったので、これを機にRAGを使った何かを作ってみたいと思います。

何を作るかがまた思い浮かばないのが困ったところです。

## もっと詳しく知りたい方へ
「みやもとのレポートわかりにくい」「もっと詳しく知りたい」という方は、ぜひイベントアーカイブをご視聴ください。
WAKE Careerでは過去のイベントをアーカイブとして公開されていて、登録ユーザーが好きな時に見られるようになっています。
ログイン後、メニューの「アーカイブ」から過去のイベント動画を視聴できます。

https://wake-career.jp/

サービスの登録は諸事情でちょっと、という方は、ConnpassのWAKE Careerをフォローして直接イベントに参加してみちゃいましょう。
性別問わず結構気軽に参加できるイベントいっぱいありますよ！

https://wake-career.connpass.com/
回路設計ゲーム作ってみたい

# 前置き
書くの面倒なんでスキップ　タイトルにあるとおりだぽ
# 設計

ｼﾀﾐﾃﾈ　ｵﾗ

## コンポーネント　CPU
コンポーネント(関数みたいな？)をつなげ合わせて新しいコンポーネントを作れたりする
そのコンポーネントでCPUを作れる

![components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907325/2c73a958-a519-7603-3d79-7c4e43db3f5e.png)

上みたいな感じ

CPUも同じ感じ

アセンブリ言語とかもこれで再現したいと思います。

# 終わり
画像作ることで力尽きたので終わりにします()
今一度基礎からアウトプットしていこう。32bit・64bit編

# どうせ未来には128bitが出て、対応に追われているさ。
## 32bit・64bitの違い
結論：CPUの性能。32桁2進数か64桁2進数か。
##### 以下調べた内容
32bit処理CPUのPCに、64bitのOSをインストールすることは不可能。
64bit処理CPUのPCに、32bitのOSをインストールすることは制限があるが可能。

（苦しんだ実例）
　\Systemroot\System32\OpenSSH\ssh.exe・・・64bitのssh.exe(64bitOS)
　\Systemroot\SysWOW64\OpenSSH\ssh.exe・・・32bitのssh.exe(64bitOS)
　\Systemroot\System32\OpenSSH\ssh.exe・・・32bitのssh.exe(32bitOS)

 　\Systemroot\Sysnative\OpenSSH\ssh.exe・・・32bitアプリケーションが64bitのパスに仮想的に入れる。
　しかし32bitアプリは基本64bitのものを作動させることができないのであまり使えない。
　
・WOW64・・・Windows-On-Windows 64-bit
　64bit上のWinodows環境で32bitアプリを動作させるための技術。
　64bitOS内で実行できるようにした仮想環境。

### レガシー環境でしか得られない教訓があると思うのだ。
React + Vite環境にStorybookを入れてみる

# はじめに
以前の記事で勉強のためにReact+Vite環境を構築しましたが、合わせてStorybookも勉強したいなと思い、構築していく備忘録を残そうと思います。

https://qiita.com/mattsu_mocha/items/622f171a171558cec8bf

# 手順
実は以下のコマンドをルートで実行するだけで入れることができました。

```sh
$ npx storybook@latest init
Need to install the following packages:
storybook@8.4.7
Ok to proceed? (y) y
╭──────────────────────────────────────────────────────╮
│                                                      │
│   Adding Storybook version 8.4.7 to your project..   │
│                                                      │
╰──────────────────────────────────────────────────────╯
 • Detecting project type. ✓
Installing dependencies...
```

インストールが完了したら自動でStorybookが起動してくれました。（初心者用ガイドまでついていて便利…）
![スクリーンショット 2024-12-11 21.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733722/3822a699-8225-344d-b7eb-d85c27c40876.png)
![スクリーンショット 2024-12-11 21.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733722/14b9b5e7-b032-034e-c52e-fe67b2505df3.png)
タイミーを支えるチャチなエンジニアリング

この記事は Timee Product Advent Calendar 2024 の15日目の記事です。

タイミーでエンジニアをしている甲斐です。

会社の看板の力というものはよいもので、私が転職して以降特に自分がすごくなったわけでもないのに弊社の力で外にアウトプットを出す機会をいただき、そのたびになんとかネタを捻り出していくつか登壇をこなしたりしました。

そしてさらなる機会としてアドベントカレンダーに声がかかり、社内からも「以前登壇したオブジェクト指向設計の話の続き書いてよ」と言ってくれる人がいたのですが、「最近自分技術的に大したことしてなくて書く事がねぇ〜」と頭を抱えるばかりの日々。ここで私は閃いた。
じゃあそれをネタにしよう。

というわけでジャンプが合併号に時々お出しする作者4コマではもはやお約束の領域になる「ネタがないネタ」で今回はお送りします。

## 今回一番言いたいこと

>何を言うか。下策をもって上首尾に至ったなら、上策から始めるよりも数段勝る偉業ではないか。
>
>〜Fate/Zero 征服王イスカンダル〜

もはや到底持たざるものには見えなくなったロード・エルメロイⅡ世の若かりし頃、ウェイバーに発破をかけた超有名なセリフですね。

生存バイアスと似たような形で、対外的なアウトプットって必然的にキラキラバイアスがあると思います。
当たり前の話で、会社組織なのですから大してオチもつかないような成功とも失敗ともつかないような話よりも輝かしい成功をお出ししたいものです。
そしてそのようなエピソードは耳目を集めるが故に羨望の眼差しで見つめられる宿命にあります。

しかし、世の中を支える仕事と言うのは輝かしく自慢できるようなものばかりではなく、めちゃくちゃ大事なのにすごく地味でアウトプット映えしなかったり、様々な事情でまだ世に出せなかったり、私のチームではMVPで価値を届けることが多く、1週のスプリントで実装する社内の人が扱うものともなれば必然的に設計も実装もシンプルになります。

結果、今のプロジェクトに一番必要なのはBooleanの判定クラスと多少のアソシエーションといくらかの文字列カラムがついたようなごくごく簡素なクラスでした、なんてことは日常茶飯事です。

## 小さく出すか最初に練るか
せっかくなので字数稼ぎに組織の話をして弊社の立ち位置について目線合わせをします。
例えばなんらかの機能を開発する際に、最初はシンプルに作ってから後から改善するか、時間をかけてみっちりと設計するか、2つの軸があります。

弊社の、特に私が所属するチームは前者に大きく傾いているのですが、これは1週間単位のスクラムを実施している点もそうですが、チームトポロジーで言うところのストリームアラインドチームであるために、自分たちの関心領域に関しては自分たちが一番の専門家であり、他チームの顔色を伺う必要がない、という組織的な構造があるため、ありふれた言葉でいうと縦割りが進んでいます。そのため、一度出したクラスの設計を変えることに関してもあまり影響がなく行うことができるのですが、私は転職の多い人間なので、そのような事情を適用できない組織についても経験があります。

例えば、社内が数人規模の開発チームで、一度開発した機能がそのまま独り歩きしてあれこれ使われてしまうような事情がある場合には、動き出してからの設計変更が難しくなります。そういう場合は最速のMVPに拘らず、一旦腰を据えて周りを巻き込んで設計を握っておいたほうがよいケースもありました。

## 未熟な作りは自分に跳ね返ってくる
そうはいっても、設計は二の次でいいや、と考えていると障害を起こしたり、つらいつらい運用オペレーションを担わされたりして報いを受けることになります。この重荷から逃れるために自分のやることに責任を持つ、というのがエンジニア自身がオーナーシップを持つということなのではないかと思います。

昔の百姓が重い年貢にブチ切れて一揆を起こしたように、「こんな運用作業やってられるか！」というつらみこそが設計や運用がどうあるべきかに思いを馳せる最大の動機づけとなります。ちなみにこの原稿は現在進行系でつらい運用作業の影響で執筆が遅延しています。

YAGNIに従うことで作りをシンプルに動きを身軽にしているわけなので、逆に言うと「いらないと思っていたものが必要になったらすぐに見直す」というアジリティが求められます。予想していなかった気付きに適応しながらも、予定にはしっかり間に合わせるということができるか、という修正の動きがどれだけできるかにアジャイルチームの完成度が問われている気がします。

なんだかアジャイルソフトウェアの開発論みたいになってきました。
つまり、私にとって直近の業務はアジャイルチームの一員としてプロジェクトに大してどれだけバリューを出せるかに注力してきたんだなと書いててわかってきました。

「自己組織化」なんて大仰で私にはまったく相応しくありませんが、「破綻した計画や運用につきあわされるのはまっぴらごめんだ」という最悪のケースに備えてプロジェクトに必要だと思ったことをやってるだけの行動をもしかしたらそう呼べるのかもしれませんね。




<!--
以下書くこと、

シンプルに実現すること
まさらっきさんの会話を活かす

boolean1個追加したとかすごいシンプルなコントローラで実装したとか
でも必要な価値の最短距離がそれだったら別にいいよね
-->
システムテストを行う際のバグ起票について

# はじめに
この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の12日目の記事です。

https://qiita.com/advent-calendar/2024/slj

みなさんこんにちは！
中途未経験で2021年1月にIT業界に入り4年目になったものです。

主にSESとしてずっとシステムテストの設計や実施を行っています。

今回、社内イベントの一環でQiitaの記事を投稿することになりました。
今までの業務で気にしていることの振り返りを行うと共に
初心者、中途未経験の方に向けて経験の共有を行いたいと思います。

## システムテストとは
仕様書に基づいて統合されたシステム全体が正しく動作するか検証するテストになります。
工程でいえば開発側で確認を行うリリース前最後のテストとなります。
即ち、テストをパスした成果物が実際に世の中に出るものとなるわけです。
その為、画面遷移や情報登録など基本的なバグや
表記揺らぎ、誤字脱字等の実動作にはあまり影響しない細かい差異も確認対象となるため、
細かく設計書と見比べながら業務を行う必要があります。
今までの過程で発見されなかった小さなバグを検知したときは今でもしたり顔になってしまいますね。

## バグについて
### ・バグが起きたままだと…
問題（バグ）を発見次第、起票を行う必要があります。
起票を行い、バグ修正が行われないと問題が起こったままリリースされてしまい
エンドユーザやクライアントが求める品質に達していない納品物がリリースされてしまいます。


### ・起票ツール、起票時に意識すること
バグ起票を行う際に使用するツールは現場によって異なる(Redmine、Jira等)と思いますが
基本的に抑えておくポイントは下記部分になります。

#### １．起票にかける時間はできるだけ短く
私は初現場に参画した際は不慣れな起票に時間を掛けてしまうことが多々ありました。
バグ起票に時間をかけすぎるとテスト実施があまり行えず予定数に達せない可能性があります。
現場によりますが、1つのバグ起票に15~20分で対応が行えると良いとされています。

#### ２．バグ箇所を分かりやすく記載する
早く起票を行っても問題個所が伝わらないと結局解消までの時間がかかってしまいます。
見ただけで修正を行えるような起票を目指しましょう。
・問題個所のエビデンス画像を用意、赤枠で囲う
・「どこ」で「なに」をすると「どうなる」を記載する

:::note
ログイン画面でクリアボタンを押下してもテキストボックス内の文言の消去が行われない
:::

#### ３．1つの起票でバグ観点は1つ
複数のバグを1つの起票で行うとバグの修正漏れが発生する可能性があります。
バグの原因に一つずつフォーカスして記載を行いましょう。

:::note alert
〇〇画面でクリアボタンが反応せず、進むボタン押下した際、想定しないページに遷移する
:::

:::note
〇〇画面でクリアボタンが反応しない
〇〇画面で進むボタン押下した際、想定しないページに遷移する
:::

# 結び
雑記ではありますが今までの業務で意識していたことを記載してみました。
振り返ってみると上記の基本的な考えが今も業務の根幹にある事を改めて感じました。

システムテストは初現場としてアサインされることもある現場です。
テストはコーディング等をあまり行わないため目立たない業務ですが、
サービスリリース前の最後のチェックを担っている業務の為、責任もあります。
ぜひ本投稿を参考にして考えていただければと思います。
CAP・SAPUI5開発PJに今日から配属された新人の自分へ送る記事

### 前書き
JavaのWebアプリ開発の経験を買われての配属から2年ちょっとが経ちました。
SAP未経験の自分が力を示せるのはここしかないと勢い込み、そしてぶつかったのがCAPです。
「SAP Cloud Application Programming Model」を略して呼称されるそれは、クラウドアプリを構築するフレームワークを指しています。

UI5は辛うじて分かりました。HTML・JavaScriptとして記憶に彼の面影があります。
CAPには注意してください。
何も知らずに関わるのは危険です。

この記事では心優しきチームメンバから授けられたサイトや、開発締切間際に穴が開くほど読んだドキュメントをまとめました。

あなたがもし、かつての自分と同じようにCAPに直面しているのであれば、この記事が役に立つかもしれません。


## Set Up SAP Business Application Studio for Development

https://developers.sap.com/tutorials/appstudio-onboarding.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936266/2563da42-ce27-7557-898f-c1f0a6e0d7d1.png)


まずはこちらをご覧ください。
開発環境「SAP Business Application Studio」を無料でセットアップします。
これより下の全てのチュートリアルはこのtrial環境で実施できるはずです。
この環境でCAPとSAPUI5を遠慮なく探っていきましょう。

## Build a Business Application Using CAP for Java

https://developers.sap.com/mission.cap-java-app.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936266/7a29c01e-b5cd-6f23-2d0c-5d8aa4f69676.png)


CAPアプリをJavaで作るチュートリアルです。
CAPアプリの何たるかを知るうえで大変役に立ちました。
特に「Add a Custom Event Handler」の章にてJavaがそっと現れたときは、Javaコーディングの余地有りと安堵した記憶があります。

また、このサイト「SAP Tutorials」には他にも素敵なチュートリアルが存在します。
探してみてください。


## UI5 Demo Kit

https://ui5.sap.com/#/topic/592f36fd077b45349a67dcb3efb46ab1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936266/9d60c750-9742-fc10-1324-76074fc27bb3.png)

SAPUI5のドキュメント、そして実装チュートリアルです。
フレームワークであるSAPUI5は、その名の通りUIを司ります。
Sampleタブで実際の部品を観察したり、その部品のソースコードをダウンロードしたりしましょう。

## capire

https://cap.cloud.sap/docs/get-started/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936266/c0c0f7ea-77aa-9d7b-69b9-fa48e3fbd4bc.png)

CAPのドキュメントです！
おそらくCAPと出会って日が浅いうちはあまり役に立ってはくれないでしょう。
ただし実際に解析・開発するようになればそうではありません。
このドキュメントが役に立ったり、役に立たなかったりします。
役に立たないときは概ね自分の知識足らずに依るので自己嫌悪しましょう。


## おまけ

https://chromewebstore.google.com/detail/deepl%EF%BC%9Aai%E7%BF%BB%E8%A8%B3%E3%81%A8%E6%96%87%E7%AB%A0%E4%BD%9C%E6%88%90%E3%83%84%E3%83%BC%E3%83%AB/cofdbpoegempjloogbagkncekinflcnj?hl=ja&pli=1

便利です。


### 後書き
ご覧いただきありがとうございました。
ひとまず上2つをご覧になれば、「何から始めればいいかわからない」という状態からは脱却できるのではないでしょうか。
CAP・SAPUI5に限らず新しいフレームワークと出会ったときには、まず作ってみることが一番理解へ繋がると私は信仰しています。
もしこの記事があなたの助けになれば幸いです。
Advent of code 2024 Day 11 Part 1 を Livebook で楽しむ

## はじめに

Advent of code 2024 Day 11 の Part 1 を解きます

問題文はこちら

https://adventofcode.com/2024/day/11

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

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day11_part1.livemd

## セットアップ

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

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

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

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

## 入力の取得

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

![スクリーンショット 2024-12-11 21.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f8f5e4bd-621a-615d-d947-432fc81dca95.png)

## 私の答え

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

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

入力例で考えてみます

```elixir
small_sample_input = "0 1 10 99 999"
```

まずは石を数値の配列にします

```elixir
stones =
  small_sample_input
  |> String.split(" ")
  |> Enum.map(&String.to_integer(&1))
```

実行結果

```elixir
[0, 1, 10, 99, 999]
```

問題文の処理を何も考えずに実装します

`Integer.digits` は `123` を `[1, 2, 3]` にする関数です

`Integer.undigits` は `[1, 2, 3]` を `123` にする関数です

```elixir
blink = fn stone ->
  cond do
    stone == 0 ->
      [1]
    Integer.digits(stone) |> length() |> rem(2) == 0 ->
      digits = Integer.digits(stone)
      half_size = digits |> length() |> div(2)
      [
        digits |> Enum.slice(0, half_size) |> Integer.undigits(),
        digits |> Enum.slice(half_size, half_size) |> Integer.undigits(),
      ]
    true ->
      [stone * 2024]
  end
end
```

この処理を全ての医師に対して実行します

```elixir
Enum.flat_map(stones, fn stone -> blink.(stone) end)
```

実行結果

```elixir
[1, 2024, 1, 0, 9, 9, 2021976]
```

次の例を実行してみます

```elixir
stones =
  "125 17"
  |> String.split(" ")
  |> Enum.map(&String.to_integer(&1))
```

6回繰り返すので `Enum.reduce` で指定回数実行し、最後に長さを取得します

```elixir
1..6
|> Enum.reduce(stones, fn _, acc_stones ->
  Enum.flat_map(acc_stones, fn stone -> blink.(stone) end)
  |> IO.inspect()
end)
|> length()
```

標準出力

```elixir
[253000, 1, 7]
[253, 0, 2024, 14168]
[512072, 1, 20, 24, 28676032]
[512, 72, 2024, 2, 0, 2, 4, 2867, 6032]
[1036288, 7, 2, 20, 24, 4048, 1, 4048, 8096, 28, 67, 60, 32]
[2097446912, 14168, 4048, 2, 0, 2, 4, 40, 48, 2024, 40, 48, 80, 96, 2, 8, 6, 7,
 6, 0, 3, 2]
```

実行結果

```elixir
22
```

25 回繰り返します

```elixir
1..25
|> Enum.reduce(stones, fn _, acc_stones ->
  Enum.flat_map(acc_stones, fn stone -> blink.(stone) end)
end)
|> length()
```

実行結果

```elixir
55312
```

実際の入力に対して実行します

```elixir
stones =
  puzzle_input
  |> String.split(" ")
  |> Enum.map(&String.to_integer(&1))

1..25
|> Enum.reduce(stones, fn _, acc_stones ->
  Enum.flat_map(acc_stones, fn stone -> blink.(stone) end)
end)
|> length()
```

</details>

## まとめ

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

![aoc2024_day11_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0c3b13c0-109f-8e6d-2918-f3339f5a5422.png)

ここまでは簡単でした

お察しの通り、繰り返す回数が増えるととんでもない計算量になってしまうので、、、

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/60ad29e12c7793207bcc
Sequence Makerのインストール時にRuntimeエラーが出たときの対策

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerのインストールは非常に簡単ですが、インストール時にRuntimeエラーが出るときがあります。この記事ではそんな時の対策を紹介します。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## ランタイムエラー
実際のエラーはこんな感じです。

![Screenshot 2024-12-10 171949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/0a698a76-2c22-a161-4669-db79ee0bace6.png)

```
Setup
Sequence Maker requires Visual Studio 2010 Tools for Office
Runtime version 10.0.40820 or later.

Download and install it from
http://www.microsoft.com/en-us/download/details.aspx?id=48217.
Then re-run the Sequence Maker setup program.
```

このエラーはSequence Makerが「Visual Studio 2010 Tools Office Runtime」が必要なのでインストールしてね、ということを言っています。ちなみに、ほとんどのPCではこのランタイムが入っているので、このエラーが出るのは比較的レアです。

## ラインタイムのインストール
ランタイムを検索してインストールします。

https://www.google.com/search?q=Visual+Studio+2010+Tools+Office+Runtime

リンクが切れるかもしれませんが、このあたりです。

https://www.microsoft.com/ja-jp/download/details.aspx?id=105671

## Sequence Makerのインストール
ランタイムのインストールが終わったらSequence Makerをインストールしましょう。今度はエラーが出ずにインストールが完了するはずです。
Sequence Makerのインストールについてはこのあたり参照。

https://qiita.com/sequencemaker/items/83505706777b24c70206

## まとめ
今回はSequence Makerインストール時のランタイムエラーについて解説しました。エラーが出てしまってもメッセージをよく読めばやるべきことが書かれているので、焦らず💦に対応しましょう。
個人的Vimチートシート

### はじめに
普段はVimを使っていないが、たまに必要な時がある。
いつも忘れるので、個人的なお気に入りのコマンドをメモする。

### 行削除
dd

### 1文字削除
x

### 行先頭
0
^

### 行末尾
$

### 前のコマンドを繰り返し
.

### 前の文字の先頭へ移動する
b

### 次の文字の先頭へ移動する
w

### 次の文字へ移動しつつ、そこまでの文字を削除する
dw

### undo
u

### undoをundo
ctrl-r

### 削除して編集モードに入る(終わった後に編集モードに入る版)
c
例: cw: 次の単語の先頭まで削除して、編集モードに入る

### カーソルがある単語を消す
diw(delete inner word)

### 新しい行を下に作成して編集モードに入る
o

### 新しい行を上に作成して編集モードに入る
O

### vimで開いたpathが、ディレクトリがないせいで保存できない時
:!mkdir -p %:h
%: 現在編集中のファイルのパス
:h: ファイルパスからディレクトリ部分を取得
mkdir -p: 必要なディレクトリ階層をすべて作成

### カーソルの位置を1つ元に戻す
``(バッククォート2つ)

### ファイルの最後に移動する
G

### 検索する
/ -> 入力 -> エンター(検索して最初のヒットののち、ノーマルモードなのでciwなどで編集を開始できる)
-> n(nを押すたびに次のヒットしている箇所へカーソルが移動する)

### 対応するカッコへ移動する
%

### 行頭でインサートモード
I

### zshでvim
GPT-4oのキャンバス機能でテストファーストfizzbuzz実装をやってみた話

# テストから先に実装できるようになるにはどうすればいいの？

はい。最近出たo1 proに訊いてみました。長いので折りたたみますね。

<details><summary>o1 proさんの回答</summary>

**結論として:**  
TDDやテストファースト開発を身につけるには、小規模で明確なタスクから練習する「コードカタ」やワークショップ形式のトレーニングを行い、**テストで仕様を明文化する習慣**を体に染み込ませることが効果的だ。また、ペアプロやモブプログラミング、既存コードへのテスト導入など、段階的なアプローチをとることで、徐々にテストを書くことが「自然な流れ」になるよう意識的なトレーニングを重ねていくと良い。

**詳細:**  

1. **コードカタや演習問題から始める**：  
   「FizzBuzz」などの極めて単純な問題でテストファーストを練習する。最初は超シンプルなロジックとテストで「テストを書いてから実装を行う」流れそのものに慣れる。  
   これらの演習を反復することで、テストから書くことへの心理的障壁が下がる。

2. **ペア・モブプログラミング**：  
   経験のあるエンジニアと一緒にペアプロでTDDを実践する。隣でテスト書きの流れを見せてもらいながら、自分も習慣を学ぶことで、自分一人でやるより早くコツを掴む。  
   モブプログラミング（3人以上のチームで1つのマシンを共有しながら進める開発）も有効で、テストファーストの思考プロセスを共有できる。

3. **段階的な導入**：  
   いきなり大規模な機能をテストファーストで作るのはハードルが高いので、まずは既存機能の一部だけテストする、バグ修正用の小さな関数からテストを先に書いてみる、など、スモールステップで慣らしていく。

4. **テスト設計の基礎学習**：  
   単なる「テストコードの書き方」だけでなく、テスト設計の基本（境界値分析、同値分割、正常系・異常系の考え方）を学ぶことで、「実装前にテストケースを洗い出す」ことが自然にできるようになる。

5. **ツール・環境整備**：  
   pytestやunittest、mypyなどを導入した整った環境で開発してみる。補助ツールが整っていると、テストを書いたり実行したりが手軽になるため、最初の敷居を下げる。

**コード例：シンプルな演習（FizzBuzz）のTDDテストファースト例（Python）** 

```python
# コメント：下記はテストファーストでFizzBuzzを実装する際の練習例。
# コメント：最初にテストを書く → テストが失敗 → 必要最小限の実装 → テストパス、のサイクル。

from typing import (
    Any,
    List,
    Dict,
)
import pytest

def fizzbuzz(
    number: int,
) -> str:
    """
    コメント：実装は後から書くので、ここではダミーで空文字を返しておく（TDD初期段階）
    """
    return ""

@pytest.mark.parametrize(
    "number,expected",
    [
        (1, "1"),
        (2, "2"),
        (3, "Fizz"),
        (5, "Buzz"),
        (15, "FizzBuzz"),
    ],
)
def test_fizzbuzz(
    number: int,
    expected: str,
):
    """
    コメント：先にテストを書いて、FizzBuzz仕様を明文化
    - 3で割り切れると"Fizz"
    - 5で割り切れると"Buzz"
    - 3と5両方で割り切れると"FizzBuzz"
    - その他は数字文字列
    """
    result: str = fizzbuzz(number)
    assert result == expected, "FizzBuzzの出力が期待と異なる"
```

最初に上記テストを書く → テストを実行して失敗させる → fizzbuzz関数内を修正してテストが通るようにする流れを繰り返すことで、「テストで仕様を定義してから実装」というプロセスを自然に習得できる。

こうした簡単なトレーニングを繰り返せば、自然と実務でも「まずテストでゴールを決め、それから実装」という思考にスイッチしやすくなる。

</details>

なるほど、良いことを言います。たしかにfizzbuzzのように仕様が完全に決まっている関数でテストファーストができないのでは他でテストから書くというのは難しいでしょう。

ではあとはこの「コード書く→テストを実行して失敗させる→修正する...」繰り返しプロセスをどう学習者に提供するかですね。

ということでやってまいりましたGPT-4oさんのキャンバス。実は使ったことがなかったのですが、これがまた便利というかテストファースト実装の勉強のためにできたんじゃないかと思えるくらいジャストフィット。以下がデモ画像になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/eeSXUrk5QvQ?si=zktBOpgSXqSUg70C" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

(そもそもこのデモ、人間はテストから書き始めてないじゃんというツッコミはさておき) 「テストが通りません。どうすればいいですか」とかなり丸投げしても適切に回答していることがわかります。エラーをはっきり伝えられない場合でも (fizzbuzz程度なら) 適切に対応してくれることがわかります。対応が適切どころかほぼネタバレになってしまっていますが、ここはシステムプロンプトなどで対応の領域でしょう。

これ個人的にびっくりしたんですが、適切にmainを書くと (これもエラーぶん投げてGPTに書いてもらいましたが) キャンバスでunittestが実行できるんですね。標準ライブラリの強みが出ています。pytestはだめでした。

キャンバスで実行しなくてもいちいちGPTに「テストを実行して」と投げれば実行結果とそこで見つかったバグを教えてくれます。キャンバスで実行した場合、テストなのにどこでfailしたか現時点ではわからないという状況なのでGPTにお願いするほうが丸いでしょう。

ということで、GPT-4oのキャンバス機能でテストファースト実装の練習ができる、でした。
Azure: azd cli で利用している .env を利用する方法

# 背景

azd cli を使っているときに、その環境変数を利用したいなと思った
で、どうやって使えばいいかをメモした記録


# 結論

<code>[python-dotenv](https://pypi.org/project/python-dotenv/)</code> を使うだけ

install して、

```python: install
pip install python-dotenv
```

あとは使うだけ

```python: use .env
from dotenv import load_dotenv

dotenv_path = os.path.join(".azure", "{azd environment name}", ".env")
load_dotenv(dotenv_path)

# あとは、適当に環境変数の取得するだけ
AZURE_SEARCH_SERVICE = os.getenv("AZURE_SEARCH_SERVICE")

```

## 一応説明

基本、azd environment 設定ファイルは、以下のようなフォルダに保存されている

```powershell:  
.azure
 + {azd environment name}
     + .env
     + config.json
```

ってことで、
<code>.env</code> のパスを 生成して

> dotenv_path = os.path.join(".azure", "{azd environment name}", ".env")

設定を読み込ませたら、

> load_dotenv(dotenv_path)

あとは使うだけ

# あとがき

調べた後で気付いたけど、azd deploy する python アプリ内で普通に使ってた
にも拘らず、install library 名を間違えてしまったという愚か者 :sweat: 

https://qiita.com/baku2san/items/ccadca60ab19ca465be1
【Java】Javaの基本を覚える

## JDK(Java Development Kit」)とは
Java言語でソフトウェア開発を行うのに必要なツールを一つにまとめたパッケージ。各OS用のものが用意されている。また、JREも含まれているので、JREを個別にセットアップしなくてOK。
ちなみにJavaの実行環境で、異なるプログラミング言語のコンパイラでコンパイルされた実行可能ファイルは処理できないい。

## JRE(Java Runtime Environment)とは
JREは、Javaアプリケーションを実行するための環境を提供する。hava11からは単体配布はされていない。

## IDE(Integrated Development Environment)とは
ソフトウェア開発に必要なツールをまとめて提供してくれるソフト。Eclipseなど。IDEをインストールしても、JDKが同時にインストールされるわけではない。また必ずしも先にJDKのインストールが必要ではない。

## Javaプログラム実行の流れ
Javaプログラムは以下の流れで実行していく

①コンパイル
**javacコマンド**を利用して、ソースファイルをコンパイルする。コンパイルすることで、JVM(Java Virtual Machine)が解釈できるクラスファイルが生成される。
コンパイラはコンパイルをする際に、コードを実行する対象のプラットフォームを考慮しない。あくまでJVMが読みこめる形式に翻訳するだけ。そのため実行環境で動作できるかのテストは行わず、各プラットフォームで実行できる形式にコードを翻訳するのはJVMの役割。

コマンド
```
javac ソースファイル名.java
```

クラスファイルは中間ファイルであり、特定のOSに依存しない。

②実行
**javaコマンド**でプログラムを実行する。Javaは必要に応じて必要なクラスファイルを読み込む。

コマンド
```
java ソースファイル名
```

## ソースコードの直接実行
javacを実行せずに、直接javaコマンドでプログラムを実行することをソースコードの直接実行という。この時、クラスファイルは生成されない。つまりメモリ上のみでコンパイルが行われる。

コマンド
```
java ソースファイル名.java
```

## javacコマンドの応用
以下のソースを用意する。

```ruby:Java(A.java)
package a;
import b.B;

public class A{
	public static void main(String[] args){
		B b = new B();
	}
}
```

```ruby:Java(B.java)
package b;
public class B{
	
}
```

以下のコマンドを実施する。
```
javac a/A.java
```

これでAクラスだけでなくBクラスのクラスファイルも生成される。これはAをコンパイルすることで、Aクラスが依存するBクラスも自動的にコンパイルされるから。


## ガベージコレクタ
Javaコードを実行している間、JVMではガベージコレクタが任意のタイミングで稼働し、プログラムが使用しなくなったメモリ領域を解放する。このガベージコレクタはスレッドで稼働し、優先度は低いため基本的にメモリが圧迫されると稼働する。

:::note info
**スレッド**
プログラム上で複数の処理を同時に動かす仕組み。複数のスレッドから同時に呼び出されても正常に動作するプログラムのことを 「スレッドセーフ」 であると表現する
:::

## イミュータブルとミュータブル
イミュータブルとは**後から変えられないこと**を言う。Javaでもイミュータブル(不変)なオブジェクトを作成する場面はある。イミュータブルなオブジェクトの特長は以下。

* どのメソッドもオーバーライドできない
* どのメソッドもフィールドの値を変更できない
* 全てのフィールドをfinalかつprivateにする
* staticなメソッドを提供しない
* 参照型のフィールドで使用するgetterメソッドで参照を戻さず、新しいコピーを作って戻す。setterも同様

## まとめ
* JDKとはJavaでソフトウェア開発を行うのに必要なツールを一つにまとめたパッケージ
* JREとはJavaアプリケーションを実行するための環境を提供するソフトウェア
* IDEとはソフトウェア開発に必要なツールをまとめて提供してくれるソフト
* Javaプログラムはコンパイルを行ってクラスファイルを生成してから実行する
* コンパイルはjavacコマンド、実行はjavaコマンドを使う
* Javaではガベージコレクタが任意のタイミングで稼働し、プログラムが使用しなくなったメモリを解放する
* イミュータブルなオブジェクトは後から帰ることができない
ExcelをPDFに変換する方法あれこれ

# はじめに
案件で必要になりExcelをPDFに変換する方法を色々調べたので、その結果をざっくりまとめておきます。個別の変換方法に関する解説記事は結構あるんですけど、まとめ記事的なのは意外とないんですよね。

# WebAPI

月あたりの変換件数が数万件までは標準の従量課金プランがあって、それを超える場合はカスタマイズ契約が必要になるというパターンが多いです。スモールスタートできるのが嬉しいです。

細かくは説明しきれないので、代表的なAPIサービスへのリンクだけ貼っておきます。

### Adobe

https://developer.adobe.com/document-services/apis/pdf-services/

### ConvertAPI

https://www.convertapi.com/xlsx-to-pdf

### Nutrient

https://www.nutrient.io/api/converter-api/

### Cloudmersive

https://cloudmersive.com/convert/xlsx-to-pdf-api

# サードパーティライブラリ

中には無償のものもありますが、基本的に有償です。変換回数の制限は無いことが多いですが、その分だけ初期費用やランニングコスト（ライセンス更新・サブスクリプション）は大きくなりがちです。

各プログラミング言語に様々なライブラリがありますが、C#のいくつかをピックアップするにとどめます。

### Spire.XLS for .NET
https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html

### Aspose.Cells for .NET
https://products.aspose.com/cells/net/

### Syncfusion
https://www.syncfusion.com/document-processing/excel-framework/net/excel-to-pdf-conversion

### Excel to PDF .Net
https://sautinsoft.com/products/excel-to-pdf/

### GemBox.Spreadsheet
https://www.gemboxsoftware.com/spreadsheet

# LibreOffice

オープンソースのオフィスソフトウェアであるLibreOfficeを使ってコマンドラインでPDF変換を行うこともできます。無料なのでとりあえず試してみると良いと思います。ただ、あんまりきれいには変換できない印象です。

やり方は以下の記事に簡潔にまとまっています。

https://qiita.com/mingchun_zhao/items/bb7166b808bfbccf39fa

環境構築が少しめんどくさいですが、コンテナを使えば楽できそうですね。

https://github.com/aletc1/examples-convert-pdf-azure-functions

# COMオブジェクト

COMオブジェクトは、プログラムからExcelなどのアプリケーションを操作するための仕組みです。動作するためにはExcelがインストールされている必要があります。そのため、例えばAzure FunctionsなどのPaaS環境では以下のコードは失敗するのでご注意ください。

Excelのライセンスさえあれば追加費用無しで変換できるので、ローカル環境での作業自動化などに適しています。ここではPowerShellとC#だけ例示しますが、Pythonでもwin32comを使えば同じことができます。

### PowerShell

メインの処理はこんな感じです。
```powershell
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Open($inputFilePath)
$workbook.ExportAsFixedFormat(0, $outputFilePath)
```

### C#

Visual StudioでプロジェクトにCOM参照を追加し、
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601327/363a1e93-52d2-5ebb-cb61-b5cac7631b9e.png">

`using Microsoft.Office.Interop.Excel`した上でこんな風に書きます。
```csharp
var excel = new Application();
var workbook = excel.Workbooks.Open(inputFilePath);
workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, outputFilePath);
```

# PowerAutomate × OneDrive

PowerAutomateのOneDriveコネクタを使用する方法もあります。個人のMicrosoftアカウントを使うので、これも個人利用向けのやり方です。ノーコードでできるのでお手軽なのが良いところ。

2024年12月現在、OneDriveコネクタでのファイルの変換はプレビュー機能です。最新の状況は[公式ドキュメント](https://learn.microsoft.com/ja-jp/connectors/onedrive/)をご参照ください。

ちょっとお金はかかりますが、Logic Appsでも全く同じことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601327/0abc0f6a-ce9a-c913-42bb-d31da5731e5b.png)

# おわりに

ExcelをPDFに変換する方法についてざっと紹介しました。何かの助けになれば幸いです。

念のためですが、実際に動作確認を行って期待通りに変換されるかを必ず確認するようにしてください。僕も色々と試してみましたが、及第点の出来栄えになった方法は半数にも満たなかったです。

他にもおすすめの方法があればぜひコメントで教えてください。無料で高品質で商用利用OKな変換方法、実はどこかにあったりしないんですかね。
命名規則がごっちゃになるので調べ直してみる

お疲れさまです、みやもとです。

今年はちょくちょくLINEBOTを作ったりしていたのですが、記事を書くたびに間違えては直ししていたことがありました。
変数やメソッドの命名です。

## なんとなくで覚えて混同
みやもとは普段仕事でJavaを使っています。
LINEBOTをいじるときはPythonを使います。

この状態のせいなのか、LINEBOTを動かすために書いたコードのメソッド名とか変数名がうっかりJavaっぽくなる。

```python:イメージ
'''
Pythonのメソッドってキャメルケースだっけ？
'''
def generateAiMessage(message: str, response_mime_type: str, system_prompt: Optional[str]) -> str:
    # Gemini AIモデルを生成
    genai.configure(api_key=gemini_api_key)
    # チャットの応答を生成
    model = genai.GenerativeModel(
        "gemini-1.5-flash",
        system_instruction=system_prompt,
    )
    
    # チャットの応答を生成
    response = model.generate_content(
        message,
        generation_config={"response_mime_type": response_mime_type})
    return response.text
```

中途半端に覚えているせいなのか、全部が同じ方式で統一されているならまだしもメソッド名はJavaっぽい、変数名はPythonっぽいみたいにごっちゃになることも多い。

アドベントカレンダーのネタに困ってきたこともあり、ざっくりでも自分で調べてみることにしました。

:::note warn
今回はがんばってオフィシャルのドキュメントにあたってみていますが、かなりかいつまんで解釈しているので不正確なところもあると思います。
あまりにもあかん解釈があればそっとご指摘いただけると幸いです。
:::

## Pythonのスタイルガイド：PEP8
Pythonの勉強を始めた際、コーディング標準があるのを見た記憶があります。
おぼろげな記憶ではありましたがどうにか[PEP8](https://github.com/python/peps/blob/main/peps/pep-0008.rst)にたどり着きました。さっそく命名に関するあたりの記述を見てみましょう。

https://github.com/python/peps/blob/main/peps/pep-0008.rst

実際に命名に関して定義されているのは「Prescriptive: Naming Conventions」あたりからですかね。

* 小文字のl(エル)、大文字のO(オー)、大文字のI(アイ)を1文字で変数に使うのは紛らわしいからやめよう
* パッケージの名前は小文字を使おう
* クラス名はCapWards式（単語の頭文字のみ大文字）にすること
* 例外もクラスにするのでクラスと同じルール
* メソッド名と変数名は小文字、単語区切りはアンダースコア
* 定数は全部大文字、単語区切りはアンダースコア

ほかにもこまごまありましたが、現時点で私がコードを書く上で必要なのは上記かなと思ったので割愛します。

## Javaのスタイルガイド
じゃあ次はJavaだ。
スタイルガイドを探したところ、大きく出てきたのは２つありました。
ひとつはGoogleのGoogle Java Style Guide。

https://google.github.io/styleguide/javaguide.html

もうひとつはOracleのCode Conventions for the Java TM Programming Language。

https://www.oracle.com/java/technologies/javase/codeconventions-contents.html

どちらも広く使われているようなので、両方見比べながらいこうと思います。
前者は[5 Naming](https://google.github.io/styleguide/javaguide.html#s5-naming)、後者は[9 - Naming Conventions](https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html)を見てざくっとまとめました。

* パッケージ名は小文字とピリオド
* クラスは名詞で、単語の始まりのみ大文字
* メソッドは動詞、単語区切りは最初の文字を大文字にして区別
* 定数は名詞で大文字、単語区切りはアンダースコア
* パラメータ含む変数は名詞で小文字、単語区切りは最初の文字を大文字にして区別

## 比較と雑なまとめ
ざっと調べたところで表にしてみました。
命名規則は[こちら](https://qiita.com/shota0616/items/4ac7a8696b3f6ccbe2bc)を参考に書いてます。

| 対象 | Python | Java |
|:-:|:-:|:-:|
| パッケージ | ドットケース[^1] | ドットケース |
| クラス | パスカルケース | パスカルケース |
| 例外 | パスカルケース | パスカルケース[^2] |
| メソッド | スネークケース | キャメルケース |
| 定数 | アッパースネークケース | アッパースネークケース |
| 変数 | スネークケース | キャメルケース |

[^1]:Pythonのパッケージ名は小文字と書かれていましたが、インポート時の記載を見るとこっちかなと。
[^2]:Javaは例外に関して書かれていませんでしたがPythonに合わせて分けました。

並べてみた感じ、とりあえずは変数とメソッド名だけ気を付ければ良さそうですかね。
今後間違えないように気を付けたいと思います。
shared_contextとは

### Using shared_context

#### 近くのどちらか一方の共有例のコンテキストで査定されるブロックを定義するために使うexapmple groupは,ローカルではexample groupのinclude_contextを使って、またグローバルでは`config.include_context`を使っいます
>Use shared_context to define a block that will be evaluated in the context of example groups either locally, using include_context in an example group, or globally using config.include_context.

#### メタデータの一致によってshared contextsを暗黙的に含むとき、普通の方法は全体のグループのcontextにあるexample group上のメタデータを一致の定義することです。
>When implicitly including shared contexts via matching metadata, the normal way is to define matching metadata on an example group, in which case the context is included in the entire group. 


### Background
Given a file named “shared_stuff.rb” with:

```rb
RSpec.configure do |rspec|
  # This config option will be enabled by default on RSpec 4,
  # but for reasons of backwards compatibility, you have to
  # set it on RSpec 3.
  #
  # It causes the host group and examples to inherit metadata
  # from the shared context.
  rspec.shared_context_metadata_behavior = :apply_to_host_groups
end

RSpec.shared_context "shared stuff", :shared_context => :metadata do
  before { @some_var = :some_value }
  def shared_method
    "it works"
  end
  let(:shared_let) { {'arbitrary' => 'object'} }
  subject do
    'this is the subject'
  end
end

RSpec.configure do |rspec|
  rspec.include_context "shared stuff", :include_shared => true
end
```

>### Declare a shared context and include it with include_context
>Given a file named “sharedcontextexample.rb” with:
```rb
require "./shared_stuff.rb"

RSpec.describe "group that includes a shared context using 'include_context'" do
  include_context "shared stuff"

  it "has access to methods defined in shared context" do
    expect(shared_method).to eq("it works")
  end

  it "has access to methods defined with let in shared context" do
    expect(shared_let['arbitrary']).to eq('object')
  end

  it "runs the before hooks defined in the shared context" do
    expect(@some_var).to be(:some_value)
  end

  it "accesses the subject defined in the shared context" do
    expect(subject).to eq('this is the subject')
  end

  group = self

  it "inherits metadata from the included context" do |ex|
    expect(group.metadata).to include(:shared_context => :metadata)
    expect(ex.metadata).to include(:shared_context => :metadata)
  end
end
```
>When I run rspec shared_context_example.rb
>
>Then the examples should all pass.

https://rspec.info/features/3-13/rspec-core/example-groups/shared-context/#:~:text=Use%20shared_context%20to,should%20all%20pass

# 感想
* モジュールのようにcontextや変数を使うことができる
* .metadataでメタデータを使って引用する
* 実践で使ってみたいな
* テストの方針を組み立てないと簡単に作ることが出来なさそう

メタデータを使って結局なんで使うのか忘れた
Notion formula 2.0で繰り返し処理 (for / while)

# Notion Formula 2.0には繰り返し処理はない

JSでいうところのfor文やwhile文などはNotion Formulaにはふくまれていない。

https://www.notion.com/ja/help/formula-syntax

では繰り返し処理はどうすればよいのか、という内容。

# 基本形：繰り返し用のリストを作る

Notion Formulaにはfor文やwhile文などはないが、リストに対して`map()`などで各要素に対して処理を行うことができる。

そこでリストさえ用意できれば、繰り返し処理ができることになる。

```notion formula
count, 100,
list, "x".repeat(count).split("").map( /* 任意の処理 */),
```

このようにしてrepeat()とsplit()を組み合わせることで特定回数繰り返し処理をするための空のリストをつくることができる。元の"x"の文字列は完全に無視してしまうのがポイント。

```notion formula: 繰り返し処理のために0から10の数列を作る
/* 繰り返し処理のために0から10の数列を作る */
count, 10,
list, "x".repeat(count).split("").map(index),
```

map()内で`index`を使うことでいろいろ応用ができる。

# 応用：繰り返し処理＋条件判定するには？

事前に繰り返す回数が分かっているときは回数分の要素数のリストを作ればよいが、
問題は何回繰り返せばよいのかわからない場合。

`while(cond){/*...*/}` や `for(var i = 0;i<count;i++){if(cond)break;}`

のように途中で条件判定して抜ける、などをやりたい場合。

Notion Formulaでは無限ループは作れない。
なので条件を満たすまでずっと処理を続ける、は困難。

ただし、100とか1000とか多めに繰り返し回数を確保しておき、
それぞれの要素一つ一つに判定をかける、は可能。

```notion formula
list, [ /*...*/ ],

/* 最初に条件を満たす、ならこれでOK */
index, list.findIndex(cond),

/* 各要素それぞれで判定する */
tested, list.map(current == cond ? true : false),
```

# もっと応用：条件を満たす要素の数を数えるには

```js:JSでこういうのをNotion Formulaでやりたい
let count = 0;
for(let i=0; i < length; i++){
    if(cond) count++;
    if(count > 10) break;
}
```

Notion Formulaは変数の宣言はできるが、再代入はできない。
そのためカウンター変数的な、ループの外側に置かれる変数みたいなことができない。

前回と同様にtrue/falseのリストを作る。

```notion formula
/* 元のリスト */
list, [ /*...*/ ],
/* それぞれの要素を判定 */
tested, list.map(current == cond ? true : false),
```

各要素に対してリストからその要素までのtrueの数をmap()とslice()とfilter()を組み合わせて数える。
これがカウンター変数の代わりになる。

```notion formula: 各要素までのtrueの数が並ぶリストを求める
countedList, tested.map(
    tested.slice(0, index).filter(current == true).length()
),
```

あとはこの数えたリストに対してfindIndex()することで、
最初のリストでどの要素が条件を満たすのかがわかる。
これはJSなどでカウンター変数が条件を満たしたときの繰り返し処理と同様のことができる。

```notion formula
/* 条件を10回満たした要素のindexを求める */
index, coundedList.findIndex(current > 10),
/* 元の条件を10回満たした要素 */
target, list.at(index),
```

最初に用意したリストの数の分だけ処理が走るので、やや非効率だが、
繰り返し処理の途中抜けなどができないので、ある程度は仕方ない。