OmniAICreator/Qiita-1.07M huggingface dataset:
（ほぼ）新入社員チームが（ほぼ）ハッカソンで最優秀賞受賞してみた

# watsonx Tech Challenge 2024 参加レポート

## イベント概要  
[watsonx Tech Challenge 2024](https://aitokukai.smartcore.jp/dxchallenge/watsonxtechchallenge2024)</br>
本イベントは、IBMのwatsonx(特にwatsonx.ai granite)を活用したハッカソンイベントで、AI技術を活用したソリューションを考えて発表するイベントでした。</br>

今回のイベントは、事前準備してから参加してもよいし、イベント中の２日間だけで取り組んでもよいという案内でした。</br>
なので私たちのチーム（6人中5人新入社員）は事前準備をして本番に臨みました。

## 参加の経緯
私が所属する部署では、生成AIや大規模言語モデル（LLM）を活用した業務効率化などに取り組んでいるので、実際に生成AIを活用した具体的なソリューションを考えたいと思い参加しました。
</br>
そこで今回のイベントは、

- **自分たちでLLMを活用したソリューションを考えることができる**
- **他チームのアイデア、発表を直接聞くことができる**

という点に魅力を感じ、参加を決めました。

- **期待していたこと**
    - watsonx.ai graniteの具体的な導入プロセスを学びたい
    - LLMを活用したソリューションのアイデア・ユースケースを得たい

## 良かった点
- **最優秀賞受賞**
  - チームで議論を重ねながらアイデアを具体的な形に落とし込み、発表に向けてしっかりと準備したことが評価されたのは非常に嬉しい結果でした。
- **自分が中心となって活動する経験**  
  - 今回はアイデア出しから技術選定、実装方針の策定、発表準備までのスケジュール管理やタスクの割り振りなど、自分が主導する形で進める場面が多く、プロジェクトをリードする良い経験になりました。
  - その中でマネジメントだけでなく、スライドでのプレゼンをよりわかりやすくするためのモック作成や、本番の発表も担当しました。
- **watsonx.ai granite実装面における課題感の把握**  
  - watsonx.ai graniteでのRAG実装時に、データストアの設計や検索精度のチューニングが必要であると学びました。

## 学んだ点
- **LLMを活用する際のデータ準備の重要性**
  - 適切なプロンプト設計や、ファインチューニングの工夫が必要であると理解しました。  
- **watsonx.ai graniteの強みと制約**
  - 強み：特定用途に適したモデル構築ができます。
  - 制約：データ量やチューニング方法によって精度に影響が出てしまいます。
- **発表におけるストーリー性の大切さ**
  - 技術的な話だけでなく、「なぜそれが重要か？」を明確に伝える必要があることを学びました。

## 改善が必要な点
- **スケジュール管理**
  - 事前準備中のスケジュール管理がうまくいきませんでした。</br>
作業を細分化できていないままスケジュールを設定してしまったため、ひとつのタスクに対して想像以上の時間がかかり、スケジュールが後ろ倒しになってしまいました。</br>
アイデア勝負のイベントとはいえ、アイデア出しに時間をかけすぎてその後のモック作成や発表準備の時間がかつかつになってしまいました。</br>仮にスケジュールを後ろ倒しにしたとしても、フェーズごとに絶対的なデッドラインを必ず考える必要があると学びました。
- **スキルの差**
  - 今回のイベントで言うと、準備期間なしで2日間だけの準備・発表では完敗していたと思います。</br>技術、プレゼンなどなど圧倒的にスキルが足りませんでした。日々の業務や定期的なイベント参加をすることで、スキルアップに繋げます。
- **RAG以外の技術検討**
  - 多くのチームでRAGを活用したチャットボットを発表していたので、流行りのAIエージェントはじめ、多くの技術を学び、実装できるスキルを身につける必要があると感じました。

## 次に活かしたいこと
- **IBM Cloudの活用**
  - AWSだけでなくIBM Cloudを活用したシステム構築のスキルを深め、業務への適用を進めていきたいです。
- **アイデアで終わらずに**
  - より実用的なユースケースを考えながら、実現に向けて取り組みたいです。

## 最後に
今回の watsonx Tech Challenge 2024への参加を通じて、AI技術はもちろんのこと、スケジュール管理の難しさや、AWS以外のクラウド技術の強み・弱みを理解する重要性を学びました。</br>
今回の経験を普段の業務に活かしていきます。
やっぱり公式は大事！esbuildとかいうライブラリで時間が消えた件

## esbuildで公式の大事さを認識したので共有します。

APIの新しい使い方として、React Queryがアツいと聞いたので、インストールしようと思ったら、自分ではどうしようもないエラーに遭遇したので、自戒と公式の重要性も兼ねて記事にします。

### 結論
自分では解決できない問題でした。公式が対応するのを待つ必要がありました。

### 問題に遭遇した経緯
React Queryを使おうと思って、以下のコマンドを叩いのが全てのはじまり

```
$ npm install @tanstack/react-query
```
そうするとこんなエラーがでました↓

```
removed 2 packages, changed 2 packages, and audited 402 packages in 2s

72 packages are looking for funding
  run `npm fund` for details

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
```
### 試したこと(ダメだったこと)
#### 1.npm audit fixを使う
```
$ npm audit fix 
```
変わらず同じエラーが....

#### 2.npm auditを叩いて原因究明
```
$ npm audit
```
すると....
```
# npm audit report

esbuild  <=0.24.2
Severity: moderate
esbuild enables any website to send any requests to the development server and read the response - https://github.com/advisories/GHSA-67mh-4wv8-2f99
fix available via `npm audit fix --force`
Will install esbuild@0.25.0, which is a breaking change
node_modules/esbuild
  vite  >=0.11.0
  Depends on vulnerable versions of esbuild
  node_modules/vite

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force
```
「ふむふむ、どうやらesbuildが悪さをしているようだ。んじゃ、esbuild0.25.0をインストールしてみっか」
と以下のコマンドを叩くと...

```
$ npm install esbuild@0.25.0
```

また、同じエラーが....

```
removed 2 packages, changed 2 packages, and audited 402 packages in 2s

72 packages are looking for funding
  run `npm fund` for details

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
```

### 3.node_modulesをクリーンリンストールする
仕方がないので、ライブラリを入れ直すことに....

```
$ rm -rf node_modules package-lock.json && npm install
```
すると....

```
emoved 2 packages, changed 2 packages, and audited 402 packages in 2s

72 packages are looking for funding
  run `npm fund` for details

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
```
どうじて......

## 原因.....
原因は、viteにありました...。

### package-lock.json
改めて、`npm audit`の内容をみるとviteが絡んでいたそうで、とりあえずviteの`package-lock.json`を見てみました。

``` package-lock.json
"node_modules/vite": {
      "version": "6.1.0",
      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
      "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "esbuild": "^0.24.2",
        "postcss": "^8.5.1",
        "rollup": "^4.30.1"
      },
```
これをみて鋭い方はお気付きでしょう。そうViteはセキュリティパッチが当たる前のesbuildしか対応していないのです。

Viteの公式Githubではissuesが立てられてました。

https://github.com/vitejs/vite/issues/19412

というように、viteが対応するのを「待て」ということでした。
これは他のブログなどには書かれていなかったため、やっぱり公式を確認するのは重要だよね、と再確認させられるものでした。
テストの進め方の、ちょっとしたポイント

こんにちは、へっぽこエンジニア見習いです。
この記事は、チャット進行型のアプリのテストをした際の、ほんとにちょっとしたポイントのメモです。
以下本文

●分岐の図表が用意されていない場合に、分岐元がわからなくなったら、
検証したい分岐先から、「逆に」分岐をさかのぼって見つける。
（もちろん、余裕があれば自分で分岐図を作ってしまうのが一番確実だし、チームにも先方にもありがたがられるだろうけど）

●選択肢がある場合、それが分岐元か否かに関わらず、
どれを選んだか記録しておくのが、本来は望ましいはず。
（総当たりする時間は取れないにしても）

●分岐元でない選択肢の場合、どの順で選んでいくかの原則（例えば、左から順に選んでいく、とか）を決めておくと、取りこぼしや、「あれ、さっきどれ選んだっけ？」の可能性を減らせるかも。
ネットワーク上のフォルダを検索する

## ネットワークドライブが見つからない場合、
ネットワーク探索がOFFとなっている可能性があります。
下図ネットワークと共有センターより、共有の詳細設定の変更をクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/c20d88b6-96a5-40af-8f01-5983c4a9df8b.png)

次に出てくる画面にて「ネットワーク探索を有効にする」にチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/28f45bef-362a-4b46-b4ab-a8549143157f.png)


それでもネットワークフォルダが見つからない場合は、SMB1.0が無効になっている可能性があります。
コントロールパネルからプログラム→プログラムと機能の中にある「Windowsの機能の有効化または無効化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/da55ba2a-2353-4284-b65c-4fd67025a1ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/1dbf426a-c382-437a-8181-650b48ea306e.png)


チェック後、OKを押し、PCを再起動してください。


## それでもつながらない場合

Windowsの資格情報にネットワークドライブのIPアドレスとID パスワードで登録しましょう。
するとみつかることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/dad3f35e-5594-485b-bc48-f2d246dea1ba.png)
新建PO的时候，自动关联采购信息记录

SAP 在 ME21N（创建PO） 时，在 PO 里输入以下字段时，SAP 会自动查找 EINA/EINE（采购信息记录）：

供应商 (LIFNR)
物料编号 (MATNR)
采购组织 (EKORG)
工厂 (WERKS，可选)

取得逻辑：
SAP 在 PO 里自动关联采购信息记录的逻辑：
先匹配 EINA 表的 供应商 + 物料 → 找到 INFNR
再匹配 EINE 表的 采购组织 → 确保 INFNR 适用
在 PO 里填充 INFNR，并自动带出供应商品番（IDNLF）、价格等信息

在ME12里可以修改，删除采购信息记录（EINA-IDNLF）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/044fce73-6dce-493d-8cec-77429f7af430.png)

实际案例
1.即便在创建PO时，修改了「仕入先品目コード」，在SAP表里面也不发生变化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/00cc494b-8947-4c86-9443-6e1b357dcc78.png)
2.根据PO查找購買情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/9eedf404-0e07-445e-92c7-41852b178283.png)
3.根据購買情報找到「仕入先品目」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/861c8088-2881-451f-a57a-664992fe2176.png)
4.在ME12里面修改「TEST」为「TEST_WANG」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/b78dfde3-42eb-496b-b65f-788dcf60d5eb.png)
5.再查看EINA-IDNLF，就变成了修改完的内容。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/c4c0da15-c99f-4e8c-a378-2efc1c76b1b6.png)
Windows にてログインユーザとして yt-dlp を使うメモ

# 最近になって以下のエラーになるときは

login しないとダウンロードできないようになった

> ERROR: [youtube] Sign in to confirm you’re not a bot. This helps protect our community. Learn more

# 事前準備

## 専用の Google Account を新規に作る
常用のアカウントでこれをやるのは危険です。

## yt-dlp をgithub からダウンロード
pip コマンドでインストールできるバージョンは、大昔のものです。

* https://github.com/yt-dlp/yt-dlp/releases

## Get cookies.txt LOCALLY 拡張を入れる
Opera browserを使うのがおすすめ。

* https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?pli=1


# ダウンロードする
## cookies.txt を取得する
専用の Google Account でYoutubeにログイン。そしてGet cookies.txt LOCALLY 拡張 を起動して、www.youtube.com_cookies.txt　ファイルを入手します。

## yt-dlp コマンドを実行
以下でダウンロードできるようになる。

> >yt-dlp --cookies www.youtube.com_cookies.txt  https://www.youtube.com/watch?v=▲▲▲

# おまけ
## ffmpeg を使って、音声のみを切り出す

まずはcodec をチェック

> $ ffmpeg -i hoge.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'hoge.mp4':
　Metadata:
　　major_brand　　 : mp42
　　minor_version　 : 0
　　compatible_brands: isommp42
　　encoder　　　　 : Google
　Duration: 00:10:29.01, start: 0.000000, bitrate: 547 kb/s
　Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 448 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
　　　Metadata:
　　　　handler_name　　: ISO Media file produced by Google Inc.
　　　　vendor_id　　　 : [0][0][0][0]
　Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
　　　Metadata:
　　　　handler_name　　: ISO Media file produced by Google Inc.
　　　　vendor_id　　　 : [0][0][0][0]
At least one output file must be specified

ここで注目すべきは、Audio: aac (LC) という部分です。そのため、出力ファイル名の拡張子は　aac　にしなければなりません。

> $ ffmpeg -i hoge.mp4 -acopy  hoge.aac

ここでもし拡張子を .m4a などした場合には、再エンコードが発生しますのでご注意を。。
卒論・修論 参考文献が本文に出てくる順番にならない[Latex]

## LaTeXでの参考文献番号の制御

論文や学術文書では，本文中で「〇〇[1]」のように参考文献を引用することが一般的です．しかし，LaTeXで文書を作成する際，意図しない順序で参考文献番号が振られることがあります．

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/8906a459-43d5-4aaa-ac7a-752c86ad98d4.png" alt="スクリーンショット 2025-02-12 16.24.30">

*図．参考文献を参照する例*


### 問題の発生

修士論文執筆中に，次のような問題に遭遇しました：

1. 本文での参考文献が[9]から始まる
2. 参考文献が本文に出てきた順ではなく，アルファベット順で並ぶ

### 解決への試み

この問題を解決するために，以下のLaTeXコマンドを試しました：

```latex
\bibliographystyle{junsrt}
or
\bibliographystyle{unsrt}
```

これらのスタイルは参考文献を引用順に並べるために推奨されていますが，
それでもうまく機能しませんでした．

### 最終的な解決策

問題の根本的な原因は，目次や図表のキャプションでの引用が参考文献の順序に影響を与えていたことでした．これを解決するために，以下のパッケージを使用しました：

```latex
\usepackage{notoccite}
```

このパッケージは，目次だけでなく図表のキャプションでの引用も参考文献の順序に影響を与えないようにします．

## 原因の詳細

修士論文や卒業論文では，通常，目次や図表目次を作成します．これらの目次で参考文献を引用すると，本文（第1章以降）での参考文献番号が，目次で既に使用された番号の後から始まってしまいます．

## まとめ

LaTeXで論文を作成する際，参考文献の番号が意図した通りに振られない場合は，`notoccite`パッケージの使用を検討してみてください．これにより，目次や図表目次での引用が本文の参考文献番号に影響を与えることを防ぐことができます．
初！「JAWS DAYS 2025」に企業サポーター＆スピーカーとして参加いたします！


# お知らせ

2025年3月1日（土）に池袋サンシャインシティにて開催されます
「JAWS DAYS 2025」にランチサポーター :rice_ball:及びスピーカーとして参加いたします:sunglasses::sparkles:

当社が、JAWS DAYSにサポーター、そしてスピーカーとして参加する機会を頂くのは**今年が初めて**です！これまで参加者として学ばせていただきましたが、今回はこのような形で関わることができ大変嬉しく思っています。

AWSを活用する仲間として知見を共有しながら、皆様とつながりを深められたらと思っておりますのでぜひセッションも覗いていただけたら嬉しいです！

# どうして化粧品メーカーが参画するの？

どうして化粧品メーカーがテックイベントのサポーターに..？と疑問に思われている方もいらっしゃるのではないでしょうか？:eyes:

その背景となる私達の思いは以下の記事に掲載しています！
ご興味ございましたらぜひお読みいただけたら嬉しいです:relaxed:

https://qiita.com/mizuki_jessie_POHD/items/4bb52d30d3c96abe0ad2

# 登壇セッションの紹介

それでは、弊社メンバーが登壇させて頂くセッションを紹介します！
(JAWS DAYS2025サイトより抜粋）



## ①[XP時代のPCゲームがAWSで復活！～EC2でクラウドゲーミング～](https://jawsdays2025.jaws-ug.jp/sessions/C-3)

- エリア：TrackC
- 時間：12:00 ~ 12:20

#### セッション概要
> 皆さん、子供の頃に夢中になったPCゲームをもう一度プレイしたいと思ったことはありませんか？
そんな大人心（子供心？）をくすぐるテーマを題材に、現代のクラウド技術を使って懐かしのゲームをプレイするまでの道のりを一緒に楽しんでもらえればと思います！
このセッションでは、かつてWindows95～XPで動いていたゲームをAmazon EC2上でプレイするまでの過程と、その中で発生したトラブルや解決策を通して、EC2インスタンスの設定方法や互換性の問題と対処法について解説します。
さらに、後半ではビジネスの視点から、古いOSで動くシステムの潜在的な需要やレガシーシステムの維持管理の重要性についてもお話します。
趣味と実益を兼ねたカジュアルなテーマで、みんなで楽しみながら学びましょう！ どうぞお気軽にご参加ください。

## ②[生成AI×財務経理：PoCで挑むSlack AI Bot開発と現場巻き込みのリアル](https://jawsdays2025.jaws-ug.jp/sessions/A-9)

- エリア：TrackA
- 時間：15:10 ~ 15:30

#### セッション概要
> 生成AIの盛り上がりが止まらない昨今、昨年のAWS re:Inventでも生成AIに関連する話題が大きく注目されていました
しかし、実業務で生成AIを活用するにはまだ抵抗やハードルを感じる方も多いのではないでしょうか？
私たちは2023年から生成AIのPoCに取り組み、可能性を模索してきましたが、実務での活用には課題がありました。そんな中、財務経理部門との業務効率化プロジェクトの相談が舞い込んできました
本セッションでは、財務経理部門と進めたPoCを例に、生成AI Slackアプリ開発のプロセスや現場スタッフとのコミュニケーション、工夫、課題を赤裸々にお伝えします！ ぜひお気軽にご参加ください！

# イベント概要
開催日時： 2025年3月1日(土)
場所： 池袋サンシャインシティ 展示ホールA
主催： JAWS-UG（AWS User Group – Japan）
※詳細は公式サイトよりご確認ください

https://jawsdays2025.jaws-ug.jp/


# さいごに

後日、当日投影しました資料もQiita上で公開を予定しております！

当日は”非公式”キャラを身に着けた当社エンジニアが現地参加しますので、
ぜひお気軽にお声がけください:laughing:！

https://qiita.com/mizuki_jessie_POHD/items/f788e8651bdc45498ebc

# (おまけ)惜しくも見送りとなったCfXネタ

今回、CFX、CFPともにかなり倍率が高かったという話を耳にしました。弊社も複数エントリーしていましたが、惜しくも見送りとなったCfXネタの一部を公開します:dark_sunglasses:

当ネタは、どこかで必ず実現したいと思っていますので乞うご期待です！:smile:

■見送りCfX
> タイトル：企業横断型パネルディスカッション～うちのCCoEこんな感じです～（仮称）
> 
> クラウドの利用が当たり前となった時代。それはエンタープライズ企業においても例外ではありません。企業規模や業種にかかわらず、クラウドの特性をどう活用するか、が今後の成長を左右する重要なポイントとなっています。
> クラウド推進において重要な役割を果たすCCoE（Cloud Center of Excellence）。
> 本セッションでは、異業種の4社から集まったCCoEメンバーによるパネルディスカッションを行い、それぞれのCCoEの「リアル」を共有します。
> 各社が直面している課題や、実際に実施している取り組みの工夫、他社との違いを通じて見えてきた学びを議論することで、業界を超えた視点を持つきっかけを提供します。
> 具体的には以下のテーマを中心に議論を行います
> 
> • CCoE設立のきっかけと目的
> • 業種ごとの特性を活かした具体的な取り組み内容（ガイドライン策定、コスト管理、技術支援など）
> • 直面した課題とその解決策
> • 他社との比較で見えてきた改善のヒント
> 参加者は、他社の経験を参考にしながら、自社のCCoEの強化や課題解決に役立つ気付きを得ることができます。また、異業種のリアルな課題と成功事例を共有することで、枠を超えた学びとネットワークを広げる場を目指します。

# 弊社では一緒に働く仲間を募集中です！
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。

https://engineer.po-holdings.co.jp/
知ってる人だけが圧勝する！ 生成AIの最新動向と活用法【イベントレポート】

## はじめに
こんにちは、エンジニアコミュニティ LinuC Open Network （LiON）の運営事務局に参加させていただいております伊藤です！

今回は、LiONで毎月開催しているミートアップイベントにつきまして、生成AIをテーマに開催し、大変な盛況であったことをご報告させていただきます。

昨年12月に「エンジニアの価値を高める生成AIとの付き合い方」と題し、株式会社Link AI　代表取締役の安東竜平氏をゲストに迎えお話を伺いました。リアルのミートアップイベントで交流会も兼ねたものです。その内容が大変衝撃的で、参加者アンケートで満足度100％（参加者全員が5段階評価で5をつけました）という大好評。より深掘りしてほしいという声が多数寄せられたことから、翌月1月にもオンラインイベントとして、より多くの参加者を募って再度開催することとなりました。

https://lion.connpass.com/event/339154/



2回目は1月22日、「知ってる人だけが圧勝する！ 生成AIの最新動向と活用法」と題し、より深掘りした内容で実施しました。ほぼ満席に近く多くの方々から参加申し込みいただき、盛況のうちに終了しました。

https://lion.connpass.com/event/342155/

その後、LiONではこれからのエンジニアにとって、生成AIのスキルが大きな差別化要因となること、また生成AIの台頭によってOS等の基盤となる技術知識の重要性が益々増していくことを再認識し、コミュニティ内での生成AI活用に関する分科会活動をより強化していくこととなったのです。

2025年、ぜひエンジニアコミュニティ LinuC Open Network （LiON）で、一緒に生成AIの利活用を考えてみませんか？

https://linuc.community/


## イベント概要
今回のイベントは、ITエンジニアの成長と活躍を促すコミュニティ「LinuC Open Network（LiON）」が主催するオンラインイベントで、どなたでもご参加いただけるものです。講演を聴くだけではなく、参加者全員の自己紹介や、グループディスカッションも組み合わせた全員参加型イベントとなっております。LiONでは、こうした交流イベントをリアルとオンラインを交互に毎月開催しています。


今回のトークセッションは、「生成AIの最新動向と活用法」をテーマとして、ゲストに株式会社Link AI　代表取締役の安東竜平氏を迎えてお届けしました。

## イベントの様子（写真は12月のイベント時のもの）
### LinuC Open Network コミュニティのご紹介
まずはオープニングとして、私からコミュニティの紹介をさせていただきました。
LiONはLPI-Japan様のサポートのもと、有志によって運営される、ITエンジニアのためのコミュニティです。
エンジニアの成長と活躍を強力に後押ししていくことを目指しています。

![202412_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/060a211d-d8b0-48a4-b5d4-3be6a4e142a4.jpeg)


### トークセッション
ゲストスピーカーとして、株式会社Link AI　代表取締役の安東竜平氏を迎え、生成AIの最新動向や活用法についてお話を伺いました。

![202412_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/39fdbd97-5fe3-4aed-b14d-1693691a08c9.jpeg)

LiONの生成AI活用分科会を推進する安良岡氏も加わり、生成AIとの付き合い方についてディスカッションしました。

![202412_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/2b0c17f8-8332-4b26-b634-591eb01dc1c8.jpeg)



### 参加者自己紹介＆グループディスカッション
トークセッションの後は、参加者全員の自己紹介、そして相互交流の場となります。1月のオンラインの回では、zoomのブレイクアウトルームでグループに分かれてディスカッションします。


### おわりに
エンジニアコミュニティ LiONが開催したイベントについて報告させていただきました。LiONでは毎月このようなイベントを開催していますし、slackでエンジニア同士の交流が可能です。そして、エンジニアならどなたでも無料でご参加いただけます。興味を持っていただいた方は、ぜひLiONに参加してみてください。あるいは、来月以降のイベントにぜひご参加ください。

<br>
LinuC Open Network で皆様とお会いできるのを楽しみにしております。
<br>
<br>

https://linuc.community/
登録したユーザーの名前が配列で取得されてしまう解決方法について

# はじめに
登録しているユーザーの名前を取得しようとしましたが、名前が配列で取得されてしまうため、そちらの解消方法について共有させていただきます。

下記のように記述していました。
```tsx
const matchedName = users.
      filter((user) => user.user_id === searchUserId) // idが一致したﾕｰｻﾞｰを取得
      .map((user) => user.name); // その中の名前を取得

      setUserName(matchedName); // 取得した名前をセット
```


# 解決方法
こちらの記述で解決することができました。

```.tsx
const matchedUser = users.find((user) => user.user_id === searchUserId); 
// ユーザーを１つずつ取り出し、idが一致した最初のユーザーを取得

const matchedName = matchedUser ? matchedUser.name : ""
// 取得したユーザーがあれば、その名前を取得

      setUserName(matchedName); // 取得した名前をセット
```

# 終わりに
map()を使っているため、配列string[]で取得されてしまっていました。
<br>
[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
【Windows11/.NET Framework 3.5】オフライン環境のPCに.NET Framework 3.5をインストールする方法

Windows10やWindows11でオフライン環境のPCに、.NET Framework 3.5をインストールすることがしばしばあるのですが、インストーするために.NET Framework 3.5が必要という何とも奇怪なメッセージが表示されます。

このような場合、dismというコマンドを使用して強制的にインストールすることが可能です。

以下、その手順となります。


# インストール手順

<b>Step1</b>
使用しているOSのインストールディスクをPCにセットします。


<b>Step2</b>
Win+Xキーよりターミナル(管理者)を選択します。

![スタートメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014169/ed628097-e1e3-4b08-8686-8b86761ece39.png)
   </dev>
</dl>




<b>Step3</b> 
コマンドプロンプトが立ち上がったら以下コマンドを入力します。

```
Dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess
```
※Dドライブにインストールディスクが入っているものとします




<b>Step4</b>
インストールが始まるのでしばらく待ちます。
操作は正常に完了しましたと表示されたら以下コマンドを入力して
.NET Framework 3.5が有効になっていることを確認して完了です。
```
dism /online /get-featureinfo /featurename:NetFx3
```
ubuntu apt upgradeで not fully installed エラー (openssh-server)

### Ubuntu 24.04でapt upgradeを行った際に失敗したので、対策メモ
- #### 環境
Windows 11 24H2, wsl1, ubuntu 24.4.02

 - #### 症状
 updateは問題無く完了したが、続くupgradeではopenssh-serverがエラーで更新できない
 ~~~
 $ sudo apt update
Hit:1 https://ftp.riken.jp/Linux/ubuntu noble InRelease
        ...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
 ~~~
 ~~~
 $ sudo apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
Setting up openssh-server (1:9.6p1-3ubuntu13.8) ...
dpkg: error processing package openssh-server (--configure):
 installed openssh-server package post-installation script subprocess returned error exit status 10
Errors were encountered while processing:
 openssh-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
 ~~~
 - #### 解決策
   コマンド２つで問題無くエラーが解消された
1) 残った作業ファイル(post-installation script)を削除
   ~~~
   sudo rm /var/lib/dpkg/info/openssh-server.postinst
   ~~~
2) パッケージの再構築（構築が済んでいない全てのパッケージが対象）
   ~~~
   sudo dpkg --configure --pending
   ~~~

- #### 結果
  問題無くupgrade完了
   ~~~
   $ sudo apt upgrade
   Reading package lists... Done
   Building dependency tree... Done
   Reading state information... Done
   Calculating upgrade... Done
   0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
   ~~~
   別の方法として、apt full-upgradeを勧めるサイトもあったが、今回は効かなかった。

 
 下記を参考にしました
 https://unix.stackexchange.com/questions/638594/how-do-i-tell-apt-get-install-to-stop-trying-to-setup-openssh-server
🚀 vscode.dev で開発を加速！💻 リモート・緊急対応・マルチデバイス活用法

# vscode.dev を活用した効率的な開発環境の構築
![スクリーンショット 2025-02-19 15.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637864/6273d227-34a9-47f0-9061-d46f28816a88.png)


https://vscode.dev/?vscode-lang=ja

**vscode.dev** は、Web ブラウザ上で動作する軽量なコードエディタで、手軽さと即時性が魅力です。この記事では、以下の3つの具体的な活用シーンについて解説します😊：

- **リモート協業環境の構築**
- **緊急対応プロトコルの実装**
- **マルチデバイス開発戦略**

これらを理解し、vscode.dev を最大限に活用する方法を学びましょう！

---

## リモート協業環境の構築

**vscode.dev** の最大の利点は、どこからでもアクセスできることです。特に **Live Share 拡張機能** を利用すれば、複数人でリアルタイムにコードを編集・レビューできます。

### **主要なポイント**

- **即時参加**  
  参加者はブラウザを開くだけでセッションに参加可能。環境構築の手間が不要です。
- **リアルタイム共同編集**  
  各メンバーが行った変更を瞬時に確認でき、スムーズなコミュニケーションが実現します。
- **効率的なレビューとデバッグ**  
  ペアプログラミングやコードレビューが簡単に行えます。

### **シンプルな図解**

```
      ┌────────────┐
      │ Developer A│
      └─────┬──────┘
            │
            ▼
   ┌─────────────────┐
   │ vscode.dev      │  ← Live Share セッション中
   └─────────────────┘
            ▲
            │
      ┌────────────┐
      │ Developer B│
      └────────────┘
```

### **サンプル手順**

1. vscode.dev を開き、Live Share 拡張をインストール。
2. コマンドパレットから **"Live Share: Start Collaboration Session"** を実行してセッションを開始。
3. セッション URL を共有し、他のメンバーを招待。

```
# コマンドパレットから実行
"Live Share: Start Collaboration Session"
```

これだけで、リモートでも効率的な共同作業が可能になります💻。

---

## 緊急対応プロトコルの実装

障害発生時には迅速な対応が求められます。vscode.dev を使えば、ブラウザ経由で直接リポジトリにアクセスし、その場で修正が可能です。これにより復旧時間を大幅に短縮できます🚨。

### **ワークフローの流れ**

```
[クラウド上のプロダクションリポジトリ]
                │
                ▼
         [vscode.dev で編集]
                │
                ▼
         [変更をコミット]
                │
                ▼
         [コードをプッシュ]
```

### **具体的な手順例**

1. ブラウザからプロダクションリポジトリにアクセス：  
   URL: `https://vscode.dev/github/YourOrganization/YourRepository`
2. 必要な修正を加える。
3. 以下の Git コマンドで変更を反映：

```
git add .
git commit -m "緊急対応：障害修正"
git push origin main
```

このシンプルなフローにより、トラブル対応時も迅速かつ正確に作業できます。

---

## マルチデバイス開発戦略

vscode.dev は PC だけでなく、タブレットやスマートフォンなどでも利用可能です。特に **iPad Pro と Magic Keyboard** の組み合わせでは、ほぼネイティブアプリ同等の操作性が得られます📱⌨️。

### **利用シナリオ**

- **移動中の開発**  
  出先でもすぐにコードにアクセスできるため、アイデアを書き留めたり簡単な修正作業が可能です。
- **タブレットをフル活用**  
  PWA (Progressive Web App) としてインストールすれば、デスクトップと同じような感覚で利用できます。

### **シンプルな図解**

```
    [iPad Pro] 
        │
        ▼ (PWA インストール)
[vscode.dev アプリとして起動]
        │
        ▼
[Magic Keyboard で操作]
```

### **インストール手順の概要**

1. Safari または Edge で vscode.dev にアクセス。
2. ブラウザメニューから **「ホーム画面に追加」** または **「アプリとしてインストール」** を選択。
3. インストール後、ホーム画面から起動して利用開始。

これにより、どんなデバイスでも快適な開発環境を構築できます。

---

## まとめ

vscode.dev はその軽量性と即時性から、多様なシーンで活躍します：

- **リモート協業環境**：Live Share によるリアルタイム共同作業。
- **緊急対応プロトコル**：ブラウザから直接コード修正。
- **マルチデバイス戦略**：PWA として利用可能な柔軟性。

これらの特徴を活用すれば、効率的かつ柔軟な開発環境を手に入れることができます。ぜひ vscode.dev を試してみてください！😊✨
【悲報】ChatGPTさん、自分が何のモデルかわかっていない

去年o1がリリースされた頃に、o1にo1の使い方を聞いたら、o1が何かも知らず、自分をGPT4と認識していた

![IMG_1749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977170/069de850-f50b-481a-882b-77e94e58e6d1.png)
![IMG_1750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977170/fecf20ea-431a-4024-987d-7e1f7ec41ca5.png)
![IMG_1751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977170/e88a9d42-0cb1-4cf6-b79f-4cd34b2b8bbd.png)
![IMG_1752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977170/81474859-3a53-45d8-b644-95ec492e8d95.png)

どうやらこのモデルはpre-trainedであり、o1の開発時に自身がo1であることを学習していないためにこういう事が起きるそうだ。

o3-mini-highで検索機能をオンにしても同じようなチャットとなり、自身をGPT4だと認識している。

https://chatgpt.com/share/67b57023-4684-8003-949b-66a5409c043e
↑チャット記録

検索はリアルタイムだと思っていた。リアルタイムならo3-mini-highについてのサイトは無数に存在しているはずで、自信をo3-mini-highと認識できずとも、o3-mini-highというモデルについての詳細は解説してくれるはずだ。しかし実際には「関連する情報は見つからない」と言ってくる。検索機能もpre-trainedなのか
![IMG_1753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977170/b4032944-6abf-4174-86b1-ac9c3e3c6616.png)

「リアルタイムで学習はできないか？」と訊くと、

リアルタイムで動的にトレーニングデータを取り込み、モデルを随時更新していく仕組みは、技術的にも運用的にも多くの困難が存在します。以下に主要な理由や問題点を挙げます。

1. 大規模モデルの再学習コスト
近年の大規模言語モデル（LLM）は数十億から数千億といった莫大なパラメータを持っています。これらを再度学習させるには膨大な計算資源（GPU・TPUクラスタ）、時間、コストがかかります。リアルタイムで新しい情報を学習させようとすると、そのたびに微調整（ファインチューニング）を行う必要があり、これが現実的なパフォーマンス・コスト面で大きなハードルとなります。

2. 継続的学習（Continual Learning）問題
LLMを継続的に学習させると、「忘却（Catastrophic Forgetting）」と呼ばれる問題が発生しやすくなります。これは、新たな知識を学習するときに、以前学習した知識を突然失ってしまう現象です。継続学習やオンライン学習を実現するためには、この忘却を最小限に抑えながら新情報を統合する高度な手法が必要です。
さらに、動的な環境下で情報が常に更新されていくと、モデルは「整合性」や「一貫性」を保ったまま知識ベースを拡張する必要があり、そのための手法開発はまだ研究途上といえます。

3. トレーニングデータの品質・検証
モデルに新しい情報をリアルタイムで与える場合、その情報源の信頼性・正確性を検証する工程が不可欠です。インターネット上の情報は玉石混交であり、フェイクニュースや誤情報、偏った情報が混在しています。これらを無差別にモデルへ取り込めば、モデルの出力品質や信頼性が著しく損なわれます。そのため、動的なトレーニングパイプラインを確立するには、データクリーニングや品質管理を自動的かつ厳密に行う高度な仕組みが求められます。

4. トレーニングと推論の切り分け
現在、LLMの運用は基本的に「トレーニングフェーズ」と「推論フェーズ」に明確に分けられています。モデルはトレーニング後に凍結された状態で、推論専用サーバーやエッジデバイスで利用されます。この分離は、インフラの最適化や安定稼働、スケーラビリティを確保する上で有利です。リアルタイムに学習を行うには、推論サーバー側でも継続学習が可能なインフラを用意する必要があり、その結果、複雑なアーキテクチャ設計やハードウェアの再構築が必要になります。

5. 安定性と検証期間の確保
新しい情報を逐次学習させると、モデルの挙動が頻繁に変化します。これにより、ユーザーや開発者がモデルの出力の安定性・信頼性を評価しにくくなり、品質保証（QA）や安全性評価、ポリシーコンプライアンス（有害な出力を防ぐ）などの観点から、サービス運用が難しくなります。モデルが一定期間安定した出力品質を維持するためには、トレーニングをある程度バッチ的に行い、公開前に品質テストを行う方が現実的です。

これらの要因により、リアルタイムで動的にトレーニングデータを取り込みモデル自体を更新する仕組みは、現状では非常に困難です。しかし、研究コミュニティや産業界は「オンライン学習」や「継続学習」、「パラメータ効率のよい更新手法（LoRAなど）」、「動的な知識ベースへのアクセス（Retrieval Augmented Generation）」といった方法で問題解決に向けた試みを進めています。今後の技術的進歩や計算資源・インフラの発展、アルゴリズムの改善により、徐々にリアルタイム学習に近い形態が実現される可能性があります。

というチャットが返ってきた。
道のりは長いが、この継続学習を実現してみたいものだ。
初投稿

# はじめに
こんにちは、みなさん

技術関連の記事を書くにあたり、まずはQuitaの使い方を慣れるための初投稿として、私の経歴、興味のある技術分野について共有します。

# 目次
1. 経歴と専門分野
1. 興味のある技術
1. まとめ

# 経歴と専門分野
<dl>
  <dt>概要</dt>
  <dd>学生時代：大学院時代にVR/AR/MRの人間工学に基づいた研究に従事</dd>
  <dd>現在：インフラ系の会社で3年間フルライフサイクルを経験</dd>
</dl>

# 興味のある技術
<dl>
  <dt>主な興味分野</dt>
  <dd>インフラ系、データ分析、生成AI etc.</dd>
</dl>

# まとめ
今後はアウトプットの練習として、このブログを使っていきたい。
（文言とか苦手なので、生成AIの力を今後は使う予定）
EKSでAWS Load Balancer Controllerが突然起動しない？原因はAmazon Linux 2023を使ってるからかも

## TL;DR

- EKSのコンソール画面からノードグループを追加するとき、AMIタイプタイプをAmazon Linux 2023にすると AWS Loadbalancer Controllerが立ち上がらなくなることがある
- 原因は、Amazon Linux 2023から、IMDSv2が必須設定になっておりIMDSv1が使えない
- とりあえずノードグループを作成するときはAmazon Linux 2で作っておくのが良さそう

## 発生したこと

開発用のEKSクラスターでは、コスト削減のためにスポットインスタンスのみ利用してきました。
ある程度時間がかかるジョブのテストを行うために、オンデマンドインスタンスで新たなノードグループを追加し、スポットインスタンスを利用するノードグループを削除しました。

すると、AWS Loadbalancer ControllerのPodが立ち上がらなくなりました。
ログには以下のようなエラーログが。

`failed to introspect region from EC2Metadata, specify --aws-region instead if EC2Metadata is unavailable`

## 原因調査

### IMDS

AWS EC2インスタンスにはIMDS（Instance Metadata Service）というものがあります。
これは、EC2インスタンスのメタデータを取得できるものです。

このIMDS経由でIAMロールの一時的な認証情報をとることができるというのがポイントです。

IMDSには２つのバージョンがあります。

- IMDSv1（旧バージョン）
HTTPリクエストでメタデータに直接アクセス可能（curl http://169.254.169.254/latest/meta-data/）
セキュリティ上のリスク（サーバーサイドリクエストフォージェリ（SSRF）攻撃の可能性）

- IMDSv2（セキュリティ強化版）
セッションベースのトークン認証を導入
PUT リクエストでトークンを取得し、そのトークンを使ってメタデータを取得

### IMDSのホップ制限

IMDSv2のPUTリクエストは、ネットワークホップの上限が１となっています。
EC2の中で動くコンテナからのリクエストはネットワークホップが２になってしまうため、認証情報をとることができなくなっています。

### IMDSv2の強制

調べてみると、EC2インスタンスのAMIタイプにおいてAmazon Linux 2では、IMDSv1もサポートしていますが、Amazon Linux 2023からはIMDSv1が使えなくなっている様子。
なので認証情報が取れなくなってしまったわけですね。

ノードグループを新たに追加するときに、デフォルト設定が変わっているのでした。

EC2の管理画面で、どうなっているか確認できます。

AMIタイプタイプにAmazon Linux 2023を指定したインスタンスは、IMDSv2しか使えない

![Screenshot 2025-02-19 at 12.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133157/0dedd3ee-54c6-4b57-a24a-935dc51b03a8.png)

AMIタイプにAmazon Linux2を指定したインスタンスは、IMDSv1も使える

![Screenshot 2025-02-19 at 12.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133157/23c6bf1e-24d5-4933-b21b-32aa7c12d718.png)

## 解決策の調査

### 根本的な解決策

根本的な解決策としては、IMDSv2のホップ制限を増やすことです。

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.7/deploy/installation/#using-the-amazon-ec2-instance-metadata-server-version-2-imdsv2

https://zenn.dev/danimal141/articles/ff0e603bf21af2

しかし残念ながら、EKSのコンソールをぽちぽちしてノードグループを作る際には変更することができません。

> 既存インスタンスについて、PUTリスポンスホップリミットの設定を変更することができます。
> 現在、PUT 応答ホップ制限の変更をサポートしているのはAWS CLI と AWS SDK のみです。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-IMDS-existing-instances.html

### パッチ的な解決策

とりあえず、EKSでノードグループを追加するときにはAMIタイプタイプにAmazon Linux2を使い続けましょう。

![Screenshot 2025-02-19 at 12.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133157/202aeb4b-987d-491d-8a27-f05ca5accbb2.png)
Pythonのクラス定義におけるsuper()について説明してみました

Pythonのクラス定義におけるsuper()について説明してみました

学校で各種言語のプログラミングを教えています．
Pythonのクラス定義におけるsuper()についてよく理解できずに悩んでいる人が多いように思いますので，使っている教科書から抜粋します．

[●super()の解説部分（PDF）](http://www.k-techlabo.org/www_python/PythonOopSuper.pdf)

テキスト本体の最新版は[こちらの記事](https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)で配布しています．

super()について，多くの書籍では単に「スーパークラスを意味します」程度の解説にとどまっています．コードを書く上でsuper()が何を意味するのかが正確にわからないという方，ご参考まで．
【意訳】T1595:Active Scanning

リハビリも兼ねた自習用にATT&CKを（自分にとっての）わかりやすさ重視で意訳・超訳してみようと思います。いつか追いつけたらいいな。

[Reconnaissance -> Active Scanning](https://attack.mitre.org/techniques/T1595/)

| 原文 | 意訳・超訳 |
|:--|:--|
|Adversaries may execute active reconnaissance scans to gather information that can be used during targeting. Active scans are those where the adversary probes victim infrastructure via network traffic, as opposed to other forms of reconnaissance that do not involve direct interaction.|攻撃者は、偵察のためにアクティブスキャン/動的スキャンを実行し、標的の選定に使用可能な情報を収集します。アクティブスキャンとは、攻撃者が直接ネットワークトラフィックをやり取りすることで攻撃対象となるインフラストラクチャを探査するスキャンのことです。一方で、直接トラフィックをやり取りしないスキャンはパッシブスキャン/受動的スキャンと呼ばれています。|
|Adversaries may perform different forms of active scanning depending on what information they seek to gather. These scans can also be performed in various ways, including using native features of network protocols such as ICMP.|攻撃者は必要な情報に応じて、様々な形（⇐プロトコルレベルの1つ下のメソッドレベルのお話だと思われます）でアクティブスキャンを実行します。また、ICMPのようなネットワークプロトコルの標準機能を含め、様々な方法（⇐プロトコルレベルのお話だと思われます）でスキャンを行います。
|Information from these scans may reveal opportunities for other forms of reconnaissance (ex: Search Open Websites/Domains or Search Open Technical Databases), establishing operational resources (ex: Develop Capabilities or Obtain Capabilities), and/or initial access (ex: External Remote Services or Exploit Public-Facing Application). |スキャンによって収集した情報により次のような機会が明らかになる場合があります：<ul><li>さらに別の形での偵察（例：Search Open Websites/Domains、Search Open Technical Databases）</li><li>攻撃活動のためのリソースの確立（例：Develop Capabilities、Obtain Capabilities）</li><li>初期アクセスの確立（例：External Remote Services、Exploit Public-Facing Application）</li></ul>|


さて、何日続くか？
Railsのメモ化の正しい使い方

## メモ化

Railsの「メモ化」というテクニックを使うことで、重い処理を複数回呼び出すことなく値を保持させ続けることができます。

```
  def foo
    @foo ||= #重い処理 
  end
```

これによって、一度 foo を呼び出すと、その後も foo メソッドを呼び出した際には初回の値が記憶され続けるので重い処理が走らなくて済みます。
パフォーマンス向上において非常に有効なテクニックではありますが、正しい使い方を理解していないと危険なテクニックであるとも言えます。

## いつまで記憶されるの？

これを理解していないと、めちゃめちゃバグを起こし散らかします。
結論を言うと、「そのクラス内の処理が終了するまで」です。
以下に具体例を挙げて解説していきます。

### バグコード

カレンダーのスケジュールに関する通知を送る実装を例に、解説します。
- calendar 1 - N schedules（カレンダーに紐づくスケジュール）
- calendar 1 - N users（カレンダーをフォローしているユーザー）

```ruby
      def call!
        return if calendars.empty?

        calendars.each do |c|
          target_schedules = schedules(calendar_id: c.id)
          next if target_schedules.empty?

          target_users = users(calendar_id: c.id)
          next if target_users.empty?

          send_messages(target_users, target_schedules)
        end
      end

      private

      def calendars
        @calendars ||= # GET calendars
      end
      
      def schedules(calendar_id:)
        @schedules ||= # GET schedules by calendar_id
      end
      
      def users(calendar_id:)
        @users ||= # GET users by calendar_id
      end
```

Q. このコードを実行すると、どんなバグが起こるでしょうか？？

A. calendarsの先頭要素のカレンダーに関するスケジュールのみが、calendarsの先頭要素のカレンダーをフォローしているユーザーに、calendars.count回通知が飛ぶ。😱

### 改善したコード

```ruby
      def call!
        return if calendars.empty?

        calendars.each do |c|
          target_schedules = schedules(calendar_id: c.id)
          next if target_schedules.empty?

          target_users = users(calendar_id: c.id)
          next if target_users.empty?

          send_messages(target_users, target_schedules)
        end
      end

      private

      # クラス内で値は常に同じであるため、メモ化で良い。
      def calendars
        @calendars ||= # GET calendars
      end

      # ここでメモ化は行わない
      def schedules(calendar_id:)
        # GET schedules by calendar_id
      end

      # ここでメモ化は行わない
      def users(calendar_id:)
        # GET users by calendar_id
      end
```

改善したコードはこうなります。これで正しい通知が飛ぶようになりました🎉
（実際は、クエリの数を考えると最初に一気に取得してループ内でフィルタリングするのが一番いいです。メモ化の解説のためこの形で掲載してます）

## まとめ

メモ化は同一クラス内の実行開始〜実行終了まで同じ値を保持され続けます。
なお、この実装のあるクラスが終了すると、メモ化に使用していたメモリが解放されて、再度同じクラスが走った際にはまた新しい値で保持されます。

いわゆる、「クラス内定数」と思ってもいいかもしれません。

パフォーマンス向上のためには欠かせないテクニックですが、とりあえず使うのは危険です。ちゃんと使う理由を明示して使うように心がけましょう。

## 参考
https://qiita.com/isaka1022/items/1c98a92097d074544a42
Pythonの非同期処理（async，await）について説明してみました

学校で各種言語のプログラミングを教えています．
Pythonの非同期処理（async，awaitの構文）の意味がよく理解できずに悩んでいる人が多いように思いますので，使っている教科書から抜粋します．

[●非同期処理（async，await）の解説部分（PDF）](http://www.k-techlabo.org/www_python/PythonAsyncAwait.pdf)

テキスト本体の最新版は[こちらの記事](https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)で配布しています．

マルチスレッド，マルチプロセスについては割と理解しやすいと思いますが，非同期処理に関してよく理解できない方，よろしければご参考まで．
ローカルでビルドしたNext.jsコンテナをリモートのDockerで起動してみた

## はじめに

### 概要

* ローカルでビルドしたNext.jsコンテナをリモートのDockerで起動したい。

かつ

* リモートでコンテナをビルドしたくない。
* ファイルの転送にクラウドを使いたくない。

という場合の手順をまとめました。

:::note warn
ファイルの転送にクラウドを使いたくない場合は、[「Docker Hubを使わない方法」](#Docker-Hubを使わない方法)をご覧ください。
:::

### 環境

#### ローカル

* Windows 11
* Docker Desktop 4.37.1
* Next.js 15.1.5

#### リモート

* Windows 11
* Docker Desktop 4.37.1

## Docker Hubを使う方法

### 準備

ローカル・リモートのDocker Desktopを起動する。

### ローカルでの作業

#### 1\. コンテナからイメージを作成する。
```
docker commit （コンテナID） （新しいイメージ名）:（新しいタグ名）
```
```bash:例
docker commit aaaaa test_image:latest
```
コンテナIDはDocker Desktopで確認できます。

#### 2\. Docker Hubでプライベートリポジトリを作成する。

#### 3\. Docker Hubにログインする。
```
docker login -u （Docker Hubのユーザー名）
```
```bash:例
docker login -u user
```
この後パスワードを聞かれます。

#### 4\. イメージにタグをつける。
```
docker tag （イメージ名）:（タグ名） （Docker Hubのユーザー名）/（プライベートリポジトリ名）:（新しいタグ名）
```
```bash:例
docker tag test_image:latest user/private-rep:latest
```

#### 5\. イメージをDocker Hubにプッシュする。
```
docker push （Docker Hubのユーザー名）/（プライベートリポジトリ名）:（タグ名）
```
```bash:例
docker push user/private-rep:latest
```

#### 6\. Docker Hubからログアウトする。（任意）
```
docker logout
```

### リモートでの作業

#### 1\. Docker Hubにログインする。
```
docker login -u （Docker Hubのユーザー名）
```
この後パスワードを聞かれます。

#### 2\. Docker Hubからイメージをプルする。
```
docker image pull （Docker Hubのユーザー名）/（イメージ名）:（タグ名）
```
```bash:例
docker image pull user/test_image:latest
```

#### 3\. Docker Hubからログアウトする。（任意）
```
docker logout
```

#### 4\. イメージからコンテナを起動する。
```
docker run -d -p （外部のポート番号）:（コンテナ内のポート番号） --name （新しいコンテナ名） （イメージ名）:（タグ名）
```
```bash:例
docker run -d -p 3000:3000 --name test_container test_image:latest
```

### 確認

ローカルで
http://（リモートのIPアドレスまたはホスト名）:（外部のポート番号）
にアクセスすると、アプリが表示されます。
 
## Docker Hubを使わない方法

### 準備

ローカル・リモートのDocker Desktopを起動する。

### ローカルでの作業

#### 1\. コンテナからイメージを作成する。
```
docker commit （コンテナID） （新しいイメージ名）:（新しいタグ名）
```
```bash:例
docker commit aaaaa test_image:latest
```
コンテナIDはDocker Desktopで確認できます。

#### 2\. イメージをtarファイルとしてエクスポートする。
```
docker save -o （ローカルの保存先のディレクトリパス）/（新しいファイル名）.tar （イメージ名）:（タグ名）
```
```bash:例
docker save -o /tmp/test_image.tar test_image:latest
```

#### 3\. tarファイルをリモートマシンに転送する。
今回はリモートデスクトップに接続してローカルから手動でコピー＆ペーストしましたが、以下のコマンドでも実行できるそうです。
```
scp （ローカルの保存先のディレクトリパス）/（ファイル名）.tar （リモートのユーザー名）@（リモートのIPアドレスまたはホスト名）:（リモートの保存先のディレクトリパス）
```
```bash:例
scp /tmp/test_image.tar user@123.456.7.890:/tmp
```

### リモートでの作業

#### 1\. tarファイルをイメージとしてインポートする。
```
docker load -i （リモートの保存先のディレクトリパス）/（ファイル名）.tar 
```
```bash:例
docker load -i /tmp/test_image.tar
```

#### 2\. イメージからコンテナを起動する。
```
docker run -d -p （外部のポート番号）:（コンテナ内のポート番号） --name （新しいコンテナ名） （イメージ名）:（タグ名）
```
```bash:例
docker run -d -p 3000:3000 --name test_container test_image:latest
```

### 確認

ローカルで
http://（リモートのIPアドレスまたはホスト名）:（外部のポート番号）
にアクセスすると、アプリが表示されます。

## 参照

https://nextjs.org/docs/app/building-your-application/deploying

https://chatgpt.com/

https://docs.docker.jp/index.html

https://www.kagoya.jp/howto/cloud/container/dockerhub/
bm25s-j: bm25sの日本語対応版作った

## 0. はじめに

本記事では、[bm25s-j](https://github.com/kitfactory/bm25s_j) の紹介をします。  
本家の[bm25s](https://github.com/xhluca/bm25s) を日本語対応に改良したもので、PyPI に登録済みのため、インストールも簡単です。

## 1. bm25s の特徴
PythonでBM25アルゴリズムの高速、低依存、低メモリ実装を提供するように設計されています。Python で最も人気のある BM25 実装である rank-bm25 (シングルスレッド設定) を基準にした、 Elastic との クエリ数の比は以下のようになるそうです。

__bm25sのベンチマーク結果:本家画像__

![benchmark](https://bm25s.github.io/assets/comparison.png)

## 2. bm25s-jでの対応

### 2.1. 日本語形態素解析

日本語の文章も適切にトークン化できるよう、`janome` を利用しています。これにより、英語だけでなく日本語文書に対しても高い検索精度を実現しています。また、日本語のストップワードを取り込んでいます。

### 2.2. Windows環境対応

従来の bm25s は、メモリ使用量取得に Unix の `resource` モジュールに依存していましたが、Windows環境ではメモリ使用量を正確に取得できるよう、`psutil` パッケージを利用しています。

## 3. サンプル

### 3.1. インストール

インストールはpipで行う事が可能です。

```bash
pip install bm25s-j
```

### 3.2. サンプルコード

以下は、魔法少女まどか☆マギカに登場する暁美ほむらに関するWikipediaの情報をコーパスを使い、bm25s-j で検索を行うサンプルコードです。

```python
import bm25s

# ほむらの情報を含むコーパス例
corpus = [
    "暁美 ほむら（あけみ ほむら）は、テレビアニメ『魔法少女まどか☆マギカ』に登場する架空の人物です。",
    "ほむらはタイムリープを繰り返し、悲劇的な過去を持つ魔法少女です。",
    "物語の中で、ほむらは大切な使命を帯び、運命に立ち向かいます。"
]

# 日本語用のトークナイザーにより、コーパスをトークン化（stopwordsに"japanese"を指定）
corpus_tokens = bm25s.tokenize(corpus, stopwords="japanese")
print("コーパスのトークン:", corpus_tokens)

# BM25 インスタンスを作成し、コーパスのトークン化結果からインデックスを構築
retriever = bm25s.BM25()
retriever.index(corpus_tokens)

# クエリ例：「ほむらは誰？」
query = "ほむらは誰？"
query_tokens = bm25s.tokenize(query, stopwords="japanese")
print("クエリのトークン:", query_tokens)

# 検索を実行し、上位2件の結果を取得
results, scores = retriever.retrieve(query_tokens, corpus=corpus, k=2)
for i in range(results.shape[1]):
    doc, score = results[0, i], scores[0, i]
    print(f"Rank {i+1} (score: {score:.2f}): {doc}")
```



## 参考記事

本プロジェクトの発端・参考となったのは、  
[kun432 さんのZenn記事](https://zenn.dev/kun432/scraps/5ae46c49a92bcb)です。  
この記事をきっかけに、bm25s の素晴らしさに触発され、日本語対応を強化した bm25s-j が生まれました。

## 将来？

現在はインストールの簡便さからjanomeを使用しました。ただ、bm25sの高速さを遺憾なく発揮できてはいないと思うので、そのあたりかな。。。

## まとめ
[bm25s-j](https://github.com/kitfactory/bm25s_j) は、BM25 による優れた検索アルゴリズムと、簡単なインターフェースを提供します。
また、PyPI に登録済みで誰でも簡単にインストール可能です。
Amazon Bedrock Knowledge Bases の Metadata 活用に関する注意点

## はじめに

Amazon Bedrock の Knowledge Bases（以下、Bedrock KB）は、検索精度を向上させるためにメタデータ（Metadata）を活用できます。しかし、公式ドキュメントには明記されていない **制約や注意点** があり、試してみると予想外のエラーに遭遇することがあります。

本記事では、実際に検証した Bedrock KB のメタデータ関連の制約や、検索時にメタデータを適切に活用する方法について解説します。

## 1. メタデータの定義と制約

Bedrock KB では、ソースデータと同じ名前の `.metadata.json` を作成し、メタデータを追加できます。例えば、公式ブログ記事では以下のように記述されています。

> 各ゲームのメタデータには、`.metadata.json` というサフィックス (例: `s3://$bucket_name/video_game/$game_id.csv.metadata.json`) が付き、以下のスキーマを持っています。
>
> ```json
> {
>   "metadataAttributes": {
>     "id": number,
>     "genres": string,
>     "year": number,
>     "publisher": string,
>     "score": number
>   }
> }
> ```
>
> [公式記事](https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-now-supports-metadata-filtering-to-improve-retrieval-accuracy/)

しかし、実際に試すと **`id` は使用できない** ことが判明しました。

### **許可されていないメタデータキー**

`id` を含む `.metadata.json` をアップロードすると、次のエラーが発生します。

```
Encountered error: Ignored x files due to invalid metadata attribute key. Check that the attribute keys does not contains any unavailable key name. Then retry your request.
```

このように、公式記事のサンプルとは異なり、`id` というキーを使用するとエラーになります。代わりに、`documentID` などのフィールド名を活用する必要があります。

### **メタデータのサイズ制限とデータ型**

公式ドキュメントでは明確に記載されていませんが、実際の動作検証や [Repost AWS](https://repost.aws/) での調査により、次のような制約がある可能性があります。

- **メタデータ JSON のサイズは 10KB 未満にする必要がある**
- **許可されるデータ型は以下の 4 種類のみ**
  - `boolean`（真偽値）
  - `string`（文字列）
  - `double`（浮動小数点数）
  - `integer`（整数）
  - `null` 値は許可されない

## 2. メタデータを検索時に活用するには？

### **デフォルトではメタデータは検索に影響しない**

Bedrock KB にメタデータを追加しても、**デフォルトではメタデータを考慮せずに検索が行われる** ため、意図した結果を取得できないことがあります。

例えば、以下のように subCategory = "機能について" というメタデータを付与していても、検索時にこの条件を適用しなければ結果には反映されません。

```json
{
  "metadataAttributes": {
    "subCategory": "機能について"
  }
}
```

実際に、`subCategory = "機能について"` で検索した際に取得されたチャンクは `その他のお知らせ` に関連するものであり、意図した `機能について` のデータではありませんでした。これは、検索時にメタデータが自動的に考慮されないことを示しています。

![matadata_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953141/0e58c3de-4976-4eaf-8ec8-ee8900106343.png)

そのため、**検索時にメタデータを活用するためには、明示的にフィルタを設定する必要があります**。

### **メタデータを検索に適用する方法**

#### **AWS SDK を使用する場合**

```python
import boto3

bedrock = boto3.client("bedrock")

response = bedrock.retrieve_and_generate(
    knowledgeBaseId="your-knowledge-base-id",
    retrievalConfiguration={
        "retrievalFilter": {
            "subCategory": "機能について"
        }
    },
    query="ECの秘密を教えて"
)

print(response)
```

このように **`retrievalFilter` に `subCategory` を指定** することで、指定したメタデータを持つコンテンツのみを検索対象にできます。

## **まとめ**

Amazon Bedrock Knowledge Bases のメタデータには **公式に明記されていない制約が存在** するため、適切に活用するには注意が必要です。

- `metadataAttributes` の中で **`id` は許可されていない**
- **メタデータ JSON のサイズは 10KB 未満にする必要がある**
- **`boolean`、`string`、`double`、`integer` のみが許可されるデータ型**
- **デフォルトではメタデータフィルタリングは適用されない**
- **検索フィルタを設定しない場合、条件を原文に含めるのが有効**
- **検索時に `retrievalFilter` を設定することでメタデータを活用可能**

Bedrock KB を活用する際は、これらのポイントを意識して設定を行いましょう！
【R】gtでPNG形式エクスポート時のトラブル

gt()で作成したtableを、PNG形式でエクスポートすることが多いが、新しいChrome（Chrome 132以降）ではうまく出力できないみたい。

以下のようなエラーが出た。
```
! Failed to start chrome. Error:
Old Headless mode has been removed from the Chrome binary. Please use the new Headless mode (https://developer.chrome.com/docs/chromium/new-headless) or the chrome-headless-shell which is a standalone implementation of the old Headless mode (https://developer.chrome.com/blog/chrome-headless-shell).
```

Rコンソールで
```
options(chromote.headless = "new")
```
としておけば大丈夫。

---
Chrome 132 以降で削除されたheadless mode
https://developer.chrome.com/blog/removing-headless-old-from-chrome
Apple Vision Pro ですりガラスのUI背景を作成する方法

# 3行で要約

* Polyspatial 2.0.0-pre.9 以降からすりガラスエフェクトを Unity アプリで使用可能に
* 作成は ShaderGraph -> PoliSpatial Background Blur を利用
* UI 背景用途意外にも利用可能

# はじめに

![grass_ui.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/990dafee-490c-479f-b001-d94880988ace.jpeg)

Graffity で Unity エンジニア兼テクニカルアーティストとして働いている Muraishi です。

Unity を使って Apple Vision Pro のアプリを作成する際、長らく、あの特徴的なすりガラスの見た目の UI は SwiftUI を利用しないと出来ませんでした。

ですので、UGUI による自由な UI 開発となると、どうしても他のアプリとのトンマナを合わせることが難しかった部分がありましたが、Polyspatial 2.0.0-pre.9 以降に、Shader Graph を利用して、あの特徴的な UI 背景を作成することが可能になりました。

今回の記事は、Apple Vision Pro ですりガラスのUI背景を作成する方法をご紹介します。

# Shader Graph ノード全体図

![grass_ui.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/839a8ea7-cd9d-414a-97f4-aa5cca7700f4.jpeg)

# 作成方法

1. UI 用画像に下のような、すりガラスの濃い部分を黒に着色したものを用意します。  ![ui_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/83f4bf24-c2db-4f15-ad85-be10258cf6f6.jpeg)

1. Create -> Shader Graph -> URP -> Sprite Unlit Shader Graph で、Shader Graph 用シェーダーを作成します。
1. Graph Inspector から、Alpha Clipping にチェックを入れます（後に説明する PoliSpatial Background Blur が半透明に対応してないため）。
1. UI テクスチャ用の Texture 2D プロパティを用意し、Node Settings の Reference を _MainTex とします（UGUI の Image コンポーネントの Source Image から画像を参照するため）。  ![main_tex.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/7fdd3d75-2c2f-4dd8-aa92-78a6da1463d4.jpeg)
1. Sample Texture 2D ノードと、PoliSpatial Background Blur ノードを作成し、それらを Add ノードで繋いで Base Color, Alpha にそれぞれ接続します。  ![node.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/b0f1bf06-ba00-470c-af1d-3e045321ff6f.jpeg)
1. 作成したシェーダーを参照したマテリアルを用意し、UI背景用の Image コンポーネントに使用テキストと一緒にバインドします。  ![image_component.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/5dabff9b-25a2-42e8-ac9c-963f715b6052.jpeg)
1. Unity 側では概要内容はプレビュー出来ませんので Play To Device などで 表示内容を確認します。  ![preview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/32bf1ee6-c4f6-43de-b153-96ccb81bd3eb.jpeg)

# 補足

* Shader Graph 内でノードとして独立していますので、 UI だけではなく、例えば 3D モデルなどにも適用可能です（左: Lit, 右: Unlit）。  ![cube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794543/b34e1748-1d51-4092-844d-ade912d4ccdd.jpeg)
12. Integer to Roman 解答例・解説

# 問題内容
数字を入力したら、ローマ数字の表記に変換して出力するようにしなさいというもの。

# 解答例
```python:sample
class Solution:
    def intToRoman(self, num: int) -> str:
        num_map = {
            1:"I",
            5:"V",  4:"IV",
            10:"X",  9:"IX",
            50:"L",  40:"XL",
            100:"C",  90:"XC",
            500:"D",  400:"CD",
            1000:"M",  900:"CM"
        }

        r = ''

        for n in [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]:
            while n <= num:
                r += num_map[n]
                num -= n
        return r
```

# 解説
上のコードはmap定義の部分とrの行、そしてfor文という３つに分かれています。

例えば、3749という数字を自力でローマ数字に変換するとき、
「３は千の位だからＭＭＭ、７は百の位だから……」
というふうに考えると思います。

この考え方をそのままプログラムに書き起こそうとすると大変なので、
「その数字が1000以上であれば千の位に数字がある」
というように考えるところがこの問題のポイントです。

それぞれのローマ数字に対応する数字が比較をする際に必要なため、mapで整理しています。

```python
r += num_map[n]
num -= n
```
そして条件に合致すれば出力の文字列に追加し、入力された数字から引いてしまえば重複なく更新することができます。
Codewars 6 kyu Find the odd int

# Codewars 6 kyu Find the odd int
https://www.codewars.com/kata/54da5a58ea159efa38000836/python
Task
Given an array of integers, find the one that appears an odd number of times.
There will always be only one integer that appears an odd number of times.

# Verbalization
Roop integer in seq (use for i in range seat(seq))
Count each integer of seq (use count())
Select integer of occurring odds time (use if count() % 2 == 1 ) and return integer which occurred odds times.


# Code 
```py
def find_it(seq):
    for i in set(seq):
        if seq.count(i) % 2 == 1:
            return i
```
Power Apps テキスト入力で検索機能を実装してみる Search関数

# はじめに
Power Appsでデータを検索する際は `Filter` 関数を使って検索することが多いと思います。
本記事では `Search` 関数を使用して部分一致を用いた検索を行う方法を解説します。

## Search関数とは？？
`Search` 関数は指定したキーワードが含まれるデータを取得するための関数です。
ギャラリー内のデータを検索して表示させたい時に便利です！

**Search関数の基本構文**
```ruby:書き方
Search(データソース, 検索文字列, 検索対象列1, 検索対象列2, ...)
```
+ データソース...検索対象データ (DataverseやSharePointリストなど)
+ 検索文字列　...ユーザー側が指定する検索文字列
+ 検索対象列　...検索を実行する列(複数指定が可能)

## 基本的な使い方
**単一の列を検索対象に設定**
ここに Dataverseで作成したテーブル `社員名簿テーブル` があります。
各列の名称はそれぞれの通りです。
`TextInput1` プロパティにキーワードを入力すると 'フルネーム' 列から部分一致するレコードのみをフィルターしてくれるように設定します。
ギャラリーコントロールを置き `Items` に `Search` 関数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/ca1f394d-ee9a-46eb-a6cc-0bf2026fc328.png)

数式は以下のとおりです↓↓
```ruby:書き方
Search(社員名簿テーブル,TextInput1.Text,フルネーム)
```

では、この `TextInput1` プロパティに `田中` というキーワードを入力して
`フルネーム` に `田中` を含むレコードのみ検索してみましょう。


**検索結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/0242ba05-d77d-4cb6-bba1-107c3bf9b7b7.png)

ご覧のように `田中` がフルネームに含まれるレコードのみが自動でフィルターがかかりました。
このようにして単一の列を対象にキーワード検索を行うことが可能です。

**複数列を検索対象に設定**
先ほどは `フルネーム` 列のみを検索対象に設定しましたが、今度は `部署` も検索対象に設定してみましょう。

書き方は先ほどの数式に引数で `部署` の列を加えるだけです。
```ruby:書き方
Search(社員名簿テーブル,TextInput1.Text,フルネーム,部署)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/dfc7829d-407e-4dec-bf92-4bf5a606fc9c.png)

このように先ほどは `フルネーム` のみで検索可能でしたが `部署` の列でも検索がヒットするようになりました。

## メリットとデメリット
**メリット**
`Search` 関数は **部分一致** の設定を行いたいときに非常に便利です。
また、複数列を対象に検索も行うことができ、構造も非常に簡単なので比較的扱いやすい関数となっています。

**デメリット**
複雑な条件には向いていないため、その場合は `Filter` 関数を使う方が良いでしょう。
データ件数がかなり多い場合には遅延が発生することもあります。

## まとめ
今回は簡単な検索機能として `Search` 関数について解説を行いました。
複雑な条件でない場合は設定しやすいので使いこなせると非常に便利だと思います。
`Filter` 関数と使い比べて用途に合わせた実装をしてみてください！
Google「Looker Studio」を使ってレポート作成作業を効率化

## レポート作成を効率化したい・・・
こんにちは、所属企業で広告運用を担当している鈴木です。

月初になると、クライアント向けのレポート作成業務に膨大な時間を取られてしまう・・・というのは広告運用者あるあるだと思いますが、
まだ使ったことがないという方がいたら是非お試しいただきたいのが、Googleの「Looker Studio」です。

# 「Looker Studio」とは
![スクリーンショット 2025-02-18 135222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/0009bdb3-998a-4708-97aa-445d1aa56b15.png)
広告運用者にはすでにお馴染みのツールかと思いますが、改めて「Looker Studio」とは、
Google Cloudが提供する、完全クラウドベースのBIツールで、簡単にビジネスデータを可視化、レポート化することが可能です。

特にGoogle関連の様々なサービスとはシームレスな連携が可能で、
Google広告やGoogleアナリティクスの分析業務、レポート作成業務はかなりを自動化、効率化することができます。

## Google広告との連携方法
![スクリーンショット 2025-02-18 140629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/317a5983-d01f-4ee3-8152-053b7f7519e4.png)
ホーム画面左上の「作成」からデータソースをクリックします。

![スクリーンショット 2025-02-18 140709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/21dd79b6-3b09-402a-ba4e-4046a06bcda2.png)
データソースにGoogle広告を設定します。

![スクリーンショット 2025-02-18 140815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/94948f49-a570-4c63-8764-c23d63ea294f.png)
広告アカウントを選び、「アカウント包括フィールド」を選択、最後に右上の接続をクリックします。

これで、Google広告との連携は完了です。

### まとめ
簡単に連携可能で、一度設定しておけば毎月のレポート作成もかなりの時短になること間違いなしです。
未体験の方はぜひ一度お試しください。

以上、鈴木でした。
【Google広告】レスポンシブ検索広告の「地域の挿入」機能

## サービス名×地域名
こんにちは、所属企業で広告運用を担当している鈴木です。

レスポンシブ検索広告で、「サービス名×地域名」のキーワードに合わせた見出しを作成するというのはよくあるケースだと思いますが、
15個しか設定できない見出しの中で、たくさんの地域名を入れるのは現実的ではありません。

地域に合わせて見出しを出し分けたい場合はどのように対応するべきか、
今回は出し分けを可能にする機能について書いていきたいと思います。

# 「地域の挿入」機能
![スクリーンショット 2025-02-18 122521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/3cc93d04-c8b6-4c7d-b6dc-343b21fa0ba1.png)
レスポンシブ検索広告には「地域の挿入」という機能があり、これを使用することによって、
ユーザーの所在地や関心のある地域に合わせて、見出しに該当する地域名を挿入することが可能になります。
また、見出しだけではなく説明文にも使用可能です。

設定方法は非常に簡単で、まず、見出しの入力欄に「{ (波カッコ)」を入力し、「地域の挿入」を選択します。

![スクリーンショット 2025-02-18 122549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/bd39631a-c2e9-4b32-a8f9-d795bba4ce8e.png)
次に、住所の形式を市区郡・都道府県・国名の中から選択します。
この際、地域の範囲は、キャンペーンの地域ターゲティングで設定している内容が参照されます。

そして最後に、デフォルトのテキスト(※現在地が取得できない、地域名で見出しの文字数がオーバーしてしまうなど表示が難しい場合に使用されるテキスト)を入力し、
適用をクリックします。

これで、

「横浜市のスポーツ用品店なら」
「渋谷区のスポーツ用品店なら」
「札幌市のスポーツ用品店なら」

というような出し分けが可能となります。

### まとめ
ユーザーに合わせて最適な内容の広告を表示することは、クリック率の向上という観点で非常に重要なポイントとなります。
ぜひ取り入れてみてください。

以上、鈴木でした。
ARMに最新Rubyをインストールできない。

https://github.com/rbenv/ruby-build/discussions/2101
↑この人と同じopensslとpsychまわりでエラーが発生して最新Rubyをインストールできない。

opensslのバージョン古くするとか色々ためしてだめだったので
↓に従ってHomeBrewをIntelのディレクトリから移行。
https://dev.classmethod.jp/articles/20240407-migrating-library-installed-with-homebrew-from-x8664-to-arm64/
python3.8だけ移行ができなかったが多分影響ないので気にしない。

今回以外にも、度々Intelのディレクトリ構造でインストールできないということがあった。
移行後はまったく問題なくRubyをインストールすることができた。