OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforceの開発時でつまづいたSalesforceの仕様について


## テストメソッドをエディターでデバックしていた時

テストデバックが失敗したようで、
以下のように言われる

> 有効な追跡フラグがあると、デバッグログがトリガーされます。最大 1,000 MB のデバッグログのうち 1,551 MB を保持しています。追跡フラグを編集する前に、いくつかのデバッグログを削除してください。
> 14:34:19.383 開始しています: テストをデバッグ

おそらく短時間で何度もテストデバックを行ったことが原因のよう
[Apex デバックログ](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_debugging_debug_log.htm)

> デバッグログ制限
> デバッグログには、次の制限があります。
> 各デバッグログは最大 20 MB です。デバッグログのサイズが 20 MB を超えると、System.debug ステートメントの始めの方のログの行など、古いログの行の削除によってサイズが縮小されます。ログの行は、デバッグログの最初からだけでなく、どの位置からでも削除できます。
> システムデバッグログは 24 時間保持されます。監視デバッグログは 7 日間保持されます。
> 15 分間で 1,000 MB を超えるデバッグログを生成すると、追跡フラグが無効になります。追跡フラグを最後に更新したユーザーにメールが送信され、15 分後に追跡フラグを再度有効化できることが通知されます。
> 警告
> 頻繁にアクセスされる Apex クラスや、要求を何度も実行するユーザーに対して、デバッグログ追跡フラグを有効にすると、デバッグログの時間枠やサイズにかかわらず、要求が失敗する場合があります。
> 組織で 1,000 MB を超えるデバッグログが蓄積された場合、組織のユーザーは追跡フラグを追加したり、編集したりできなくなります。この制限に達した後、さらにログを生成できるように追跡フラグを追加または編集するには、デバッグログをいくつか削除します。

ではデバックを実行できない原因である、デバックログを削除したら良い

デバックログ
下記の手順に沿ってデバックログを削除したら良い

[デバックログの削除](https://help.salesforce.com/s/articleView?id=sf.code_debug_log_delete.htm&type=5)

※Salesforce 画面 設定画面の「デバックログ」から
「すべてを削除」を使用しても、当該ページに表示されているレコードしか削除されない(ログは削除されるわけではない)

## テスト結果が見つかりませんでした と言われる

今回は接続先の Salesforce 環境にコードが反映されていないことが原因。

エディター上で開発をしているとき、
テストメソッドを変更したら、まずは接続している Salesforce 環境に
編集したファイルをデプロイする必要がある。
編集したファイルを該当環境にデプロイすれば
再度テストを実行できる

## error: UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this record: [] と言われる

この部分で複数のテストメソッドまたは別のプロセスが同時に同じ
オブジェクトを操作しているのが原因

今回の原因は通常ならありえないことだが
エディター上と Salesforce 上でそれぞれ違うテストクラスを実行していたことが原因。
同じ Trigger について同時に Apex テストを実行していたため

通常エディター、もしくは Salesforce どちらかの環境下で
Apex テスト実行オプションで以下の項目にチェックを入れていれば
回避することができるよう。

> 並列 Apex テストを無効化
> テストメソッドを一度に一つずつ実行します。

盲点だったのが、エディターでデバッグした結果が接続先のデバックログにもログのレコードとして反映されるので
以下と同義にになるということ。

エディターで実行する = Salesforce 上で実行する

[UNABLE_TO_LOCK_ROW エラーについて](https://help.salesforce.com/s/articleView?id=000385705&type=1)

### 参考記事

https://base.terrasky.co.jp/articles/sw87f
https://qiita.com/k_0120/items/65d4a1fc66343eb953b3
https://base.terrasky.co.jp/articles/DBbKJ
paiza.ioでelixir その334

# 概要
paiza.ioでelixirやってみた。
Quine見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/a_utsuki/items/264922f6afef06355ce9

# 成果物

https://paiza.io/projects/VmBb52Hql-5uiUcZ_bCk9g?language=elixir

以上。
目からうろこのThisItem活用法（自分調べ）

自分の中で勝手に感動したので記事にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/83949afe-7b20-09e5-61a5-c9b92917b52c.png)

適当にこのようなコレクションを作成し、
Gallery作って右ボタンに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/c1e8453c-86e3-5645-5a0f-42297f176a14.png)

下記の様にコードを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/381ed52e-b1d0-aeab-8c58-c48dfed8d5d0.png)

するとこんな感じで次の画面で使えるレコードが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/e24337a5-50a9-9fba-fc25-41cfe848aefa.png)

今までThisItem.○○みたいな形で一つ一つ変数を作成していたのでこれには感動しました。
使い回している大元の Docker イメージ最新版を使う方法

Docker で開発していると、latest等を指定していても、
下記のように N ヶ月前のようなイメージが残る事が多いかと思います。

```
$ docker image ls
rockylinux      9-minimal     dfaa211c6b30   12 months ago   118MB
rockylinux      9.3-minimal   dfaa211c6b30   12 months ago   118MB
rockylinux      8.9-minimal   f63d8d2889fd   12 months ago   93.3MB
```

新しいイメージを使いたい場合、
古いイメージを消してしまって、新しいイメージを pull すれば良いのかな？
と思うじゃないですか。

```
$ docker rmi f63d8d2889fd
Error response from daemon: conflict: unable to delete f63d8d2889fd
(cannot be forced) - image has dependent child images
```
はい、消せません。上記の例の場合、
Rocky Linux 8.9-minimal を元にビルドした関連イメージがあるので、
関連イメージを全て消さないとダメな訳です。

携わっているプロジェクトが多いと、
依存する全てのイメージを削除してビルドし直すのはしんどい...

## 一時的な解決策

docker-compose.yml や Dockerfile は新しいプロジェクトとしてコピーし、
コンテナ名は適当に新しい名前にします。

それから目的の Docker Hub ページにアクセスしてダイジェスト値をコピーします。

![copy-digest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631853/aab82d92-0b28-9fdf-cc1c-b18dd278f1ae.png)

新しいDockerfile の FROM の後ろに「@」をつけてダイジェスト値を貼り付ける

```diff:Dockerfile
- FROM rockylinux:9.3-minimal
+ FROM rockylinux:9.3-minimal@sha256:305de618a5681ff75b1d608fd22b10f362867dff2f550a4f1d427d21cd7f42b4
```

docker compose up -d 等で、
今回の例では、6ヶ月前に公開されたイメージを使う事ができます。

RockyLinux Minimal 何か脆弱性でてますね... あとで見ておこう...。
【強風タイピング】pygameでタイピングゲーム作ってpygbagで公開してみた

## はじめに
　今回は先日紹介した方法を使って、pygameで作ったタイピングゲームを公開したので、紹介したいと思います。他のタイピングゲームとの差別化としては、瞬間のタイピング速度が分かるようになっています。リザルトに最大瞬間風速という項目があるのですが、これが瞬間的なタイピング速度の2倍を表示しているので、ここを見ていただければ自分のタイピング最高速度が分かります。

#### 先日紹介した方法
https://qiita.com/Prosamo/items/de12a90ba026b7517d2a

もしも眠らせてるだけのpygameのプログラムがあれば、こちらの方法で公開を検討してみてはいかがでしょうか

## プレイしてみよう！
※複数パターンの入力には対応しています(sha, sya, silya...など)
※音声が出ますので、音量に注意してください
※当然ですがスマホには対応していません。（そもそも対応しようがあるのか...？）

https://prosamo.github.io/wind_typing/

<a href="https://prosamo.github.io/wind_typing/">![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/564b3882-5158-570e-fd0b-80e04275e5cd.png)
</a>
称号については、あえてここでは書きません。しかし勘のいいひとなら元ネタをすぐ見つけられるかも？

## Xへの共有機能について
　実装方法が知りたい方もいると思うので、紹介します。
```python
import webbrowser
import urllib.parse
text = 'ポストしたい内容をここに書く'
url_text = urllib.parse.quote(text)
url = f'https://x.com/intent/post?text={url_text}'
webbrowser.open(url)
```
例えばこんな感じのが`url`の中身にできるので、それを`webbrowser.open`で開いてもらう感じです。
https://x.com/intent/post?text=%E3%83%9D%E3%82%B9%E3%83%88%E3%81%97%E3%81%9F%E3%81%84%E5%86%85%E5%AE%B9%E3%82%92%E3%81%93%E3%81%93%E3%81%AB%E6%9B%B8%E3%81%8F

## 最後に
　ゲームをプレイしてくださった方、ありがとうございました。`pygbag`の情報が日本だとほとんど無いので、サンプルプログラムの一つとして見ていただければと思います。こちらはフォント関連をメインに推している記事なのですが、マウス操作関連を推した記事も今後出すつもりなので、`pygbag`に興味がある方は、そちらもご覧いただければと思います。
 　ちなみにですが、このゲームで一番上の称号を取ろうと思うとなかなか難しいと思います。筆者は、一応寿司打で1位を取ったことがあるのですが、上から3つ目の称号までしか取れてないです(´;ω;｀)。まぁ自分より速い人もカバーできるように調整しているので当然なのですが。

#### 追記
タイピングゲームを自分でも作りたい人はこちらをどうぞ

https://qiita.com/Prosamo/items/23e9a64c6199e035abf1
(理系フリマ(1))シンセ先輩からもらったCore 2 duoでArduino UNO3をLチカ(1)(長期記事)


参考

↓この人が本人↓

https://x.com/enpon_bonpon

↑この人が本人↑


https://techbookfest.org/organization/5081992850833408


x 過去ログを見よ!!


目的
Core 2 duoに
Linuxを入れて
Arduino IDEを入れて
Arduino UNO3をつなげて
Lチカする。



理系フリマ(1207)の会場から輸送した、現物とあきばおー2号店(東京秋葉原)で買ったSSD。
ssdは、一番安いやつ120GB 約2000円。

Core 2 duoは、ぺんてぁむMのP6(Penteium Pro)の発展版で低消費電力に振ったデスクトップPC用CPU(65W)
wikiに書いてあった。

ようは、ばくおんがうるさすぎてご家庭では、PCが使用できなく、
なったためにノートPC用のCPUを使った(65W)、

でも、65W。


65W,65W,65W エ~~~~~~~~~!!!?

パーティション構成(予定(妄想))
10M ブートセレクタ
72G ルートパーティション(/)
16G スワップ
32G 予備(残り全部)




![o_coq676.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/08570f49-1182-136a-a593-2d8feec37c78.jpeg)


![o_coq677.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/74fe7af8-aa25-5a2f-410a-06b368b0cae1.jpeg)


![o_coq678.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d15366e3-898c-e4b4-4ef4-6311421eb3e0.jpeg)
Vuetify3やってみた

# はじめに
Vue.jsやNuxtを仕事で使っています。その流れでVuetifyを使う機会があったので記事にまとめてみました。

## Vuetifyって何？
公式によると
>Vuetifyは、初心者から熟練者までの学びやすさと達成感を目指して、ゼロから構築された強力なVueコンポーネントフレームワークです。

Vue.jsやNuxtと組み合わせて使いやすいコンポーネントがまとまっているフレームワークです。CSSフレームワーク（Bootstrapなど）というものがありますが、それのVue特化タイプといった感じでしょうか。CSSを書かずとも整ったデザインにしてくれてとっても便利なのです！

現状（2024年12月時点）はVuetify3が最新です。

### マテリアルデザイン

Googleのマテリアルデザインの仕様に基づいて作られているのも特徴の一つ。そんなに癖がなく、シンプルで機能的なデザインだなと感じています。（個人的には好み！）

## Vuetify3の導入

公式ドキュメントのインストールの説明通り進めていけばそんなに難しくはないかと思いますが、自分がちょっとハマってしまったのがテーマの変更。

```vue:src/plugins/vuetify.js
export default createVuetify({
  theme: {
    defaultTheme: 'dark'
  }
})
```

この状態だとダークテーマで、defaultThemeを``light``にするとライトテーマに変更できます。テーマに関するその他の細かな設定は下記リンクをご参照ください。

[テーマの設定-Vuetify](https://vuetifyjs.com/ja/features/theme/)

## コンポーネントを使ってみる
導入ができたら、実際にコンポーネントを使ってみましょう。
様々なコンポーネントがありますが、今回はv-data-tableを使ってみました。

### v-data-tableを使ってみる
公式のサンプルコードを参考に、下記のようなデータテーブルを作ります。
![スクリーンショット 2024-12-08 211824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674577/3bbc9018-d226-b5ef-e268-621be5b38a36.png)

コードは下記の通り
```vue
<template>
<v-data-table :items="items"></v-data-table>
</template>

<script setup lang="ts">
  const items = [
    {
      base: 'ジーズアカデミー東京',
      location: '東京都渋谷区神宮前',
      station: '原宿駅',
    },
    {
      base: 'ジーズアカデミー福岡',
      location: '福岡市中央区大名',
      station: '天神駅',
    },   
        {
      base: 'UNIT_SAPPORO',
      location: '札幌市',
      station: '札幌駅',
    },  
  ]

</script>
```
画像ではテーブルを単に表示するだけでなく、ぺジネーションやソートもできるようになっているのですが、コードを見ていただくとどうでしょう？特にそういった設定はしていません。v-data-table自体にその機能が含まれているのです。

### APIで機能を追加する
v-data-tableの機能をもっと追加したい、デザインをアレンジしたいといった場合は、APIを使います。公式の各コンポーネントのページで、APIという部分があります。

v-data-tableだとこんな感じ

![スクリーンショット 2024-12-08 212914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674577/b272784b-38b3-65e5-50d2-0dfc05d7827e.png)

v-data-table APIの中にホバーがあったので追加してみます。

```vue
<template>
<v-data-table
  :items="items"
  :hover="true"
>
</v-data-table>
</template>
```
`:hover="true"`を追加しただけですが、下記のようにホバーを追加することができました。

![スクリーンショット 2024-12-08 220133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674577/b729c126-6a83-21f0-13be-fe57fd20859f.png)

こういった形で、APIで様々な機能を簡単に追加していくことができます。

# 最後に
まだまだ使いこなせているとまでは言えませんが、Vuetify3の便利さは実感しています。Vue.jsやNuxtを使用している方はぜひ使ってみていただきたいですし、これきっかけでVue.jsを使う仲間が増えると嬉しいです！

最後までお読みいただきありがとうございました。
【Ruby】Procとlambdaの違いについて整理してみた

# はじめに

こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。

最近RubyでブロックやProc、lambdaを勉強する中で、「Procとlambdaって何がどう違うの？」という疑問が湧いてきました。

書籍やドキュメントを読むと、「lambdaはメソッドに近い挙動で、Procはブロックをオブジェクト化したもの」という説明をよく見かけますが、なぜそう言われるのか、特に`return`や引数処理の違いがどのように影響するのか、いまいちピンとこない方もいるかもしれません。

そこで今回は、**引数チェック**と**returnの動き**の2つの観点から、Procとlambdaの違いを整理してみようと思います。


### 引数チェックの挙動

Procとlambdaは、引数に対する取り扱いが異なります。この違いは、lambdaが「メソッド的」であることを示す一つの重要なポイントです。

#### Procの場合

- 引数の個数が足りなかったり多すぎたりしてもエラーになりません。
- 余った引数は無視され、足りない部分は`nil`が補われます。
- 柔軟に呼び出せるのが特徴です。

#### lambdaの場合

- lambdaはメソッドと同様、引数の数が合わないとエラーを発生させます。
- 厳密に定義どおりの引数を受け取らなければなりません。

#### 具体例

##### Procでの挙動

```ruby
my_proc = Proc.new { |a, b| [a, b] }

p my_proc.call(1)       # => [1, nil] (引数不足はnilで補われる)
p my_proc.call(1, 2, 3) # => [1, 2]   (余分な引数は無視される)
```

Procの場合、引数が合わなくてもエラーにならず、柔軟な処理が行われることがわかります。

##### lambdaでの挙動

```ruby
my_lambda = lambda { |a, b| [a, b] }

p my_lambda.call(1, 2)   # => [1, 2] 通常はこれでOK
# p my_lambda.call(1)    # => ArgumentError (wrong number of arguments (given 1, expected 2))
# p my_lambda.call(1, 2, 3) # => ArgumentError (wrong number of arguments (given 3, expected 2))
```

lambdaは引数が足りなかったり多すぎたりするとエラーを出します。この挙動は、メソッドに引数を渡す場合と同じです。

---

### returnの挙動の違い

続いて、`return`キーワードを使ったときの違いを見てみましょう。ここが、Procとlambdaを混同しないための重要ポイントです。

#### Procの場合

- `Proc.new`で作ったProcは、ブロックをオブジェクト化したものです。
- もともとブロック内で`return`を書くと、そのブロックを含むメソッド全体から抜け出そうとする性質があります。
- Procはこの特性を受け継いでいるため、内部で`return`を書くと、そのProcが定義されたメソッドを巻き込んで終了させようとします。

#### lambdaの場合

- lambdaは`return`を書いてもlambda内部だけで完結し、外側のメソッドには影響しません。
- lambdaはメソッドに近い挙動を持つため、`return`はあくまで「lambdaという小さな関数」からの脱出で終わります。

#### 具体例

##### Procでの`return`問題

```ruby
def power_of(n)
  Proc.new do |x|
    return x ** n  # 注意：ここでreturnするとpower_ofメソッドから抜けようとする
  end
end

cube = power_of(3)
cube.call(5) # => エラー発生
```
Procはブロックをとっていますが、メソッドというよりはオブジェクトして扱われます。
このように、Procでは`return`が外側のメソッドにまで影響を及ぼします。

##### lambdaでの問題が起きない例

```ruby
def power_of(n)
  lambda do |x|
    return x ** n  # lambda内でのreturnはlambda自身からの脱出に留まる
  end
end

cube = power_of(3)
p cube.call(5) # => 125 (問題なく動く)
```

lambdaの場合、`return`してもlambda内部で完結するため、外側の`power_of`メソッドには影響しません。すでに終了している`power_of`を巻き込むことがないので、エラーは起きません。

---

### まとめ

#### 引数チェックの違い

- **Proc**は引数の数に対して緩く、**lambda**は引数数が厳密。
- lambdaはメソッドと同じように引数の整合性を求めるため、ここで「lambdaはメソッド的」と言えます。

#### returnの違い

- **Proc**は`return`で外側のメソッドからも抜けようとしてしまいます。
- **lambda**は`return`しても内部だけで処理を終え、外側のメソッドには影響しません。この点でもlambdaはメソッド的なふるまいと言えます。
入力: 方位磁針

### 背景
メイン基板には地磁気センサーが搭載されています。（Bosch BMM150 ?）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/6fcb85f3-3b98-654a-478b-83a050160d00.png)

https://electronics.stackexchange.com/questions/731225/to-identify-the-following-smd-component-marked-157-f118-05l

sphero boltは接続した状態で持ち上げて向きを変えると暴れます。
これは向き（yaw）をAIMで合わせた方向に一定に保つことを重要にしているのかもしれません。

今回はコンパスを使ったプログラミングを試してみます。
### Scratch
コンパスは動作のブロックでspheroの向きを変更することができるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c99bfddf-9688-e04d-8cff-87ccc89c0186.png)

コンパスの向きの数字を押すと変更する方角を入力することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/36f7e941-9fd6-dfff-2ba0-874142c140c7.png)

「北の方角を探した後で、北（0deg）に向く」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a4a07950-a082-7ea4-828a-16985658f27c.png)

使用している個体や環境の問題かもしれませんが、コンパスの向きの後にディレイを入れないと向きが変更されませんでした。

### spheroV2
sphero_edu.pyのメソッドを参考に同様な動作をするスクリプトを作成しました。

```
import time

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as droid:
        print("Testing Start...")
        
        droid.reset_aim()

        droid.set_stabilization(False)

        droid.calibrate_compass()

        droid.set_compass_direction(0)
        # time.sleep(1)
        print(droid.get_compass_direction())        # fake ?

        droid.set_compass_direction(0)
        time.sleep(1)
        print(droid.get_compass_direction())        # fake ?

        print("Testing End...")
  
```

実行結果はこちらのようになりました。
get_compassの値は正しくありませんでしたが、まだ検証中のようです。
```
git\spherov2.py\spherov2\test>python BoltTest_compass.py
Testing Starting...
Connecting to Bolt...
Connected.
Testing Start...
246
246
Testing End...
```

### まとめ
地磁気センサーを入力に使ったプログラミングを実験しました。
spheroV2はゲッターが作成中のようですが、コンパスに合わせて向きを変えることはできるようです。
QualityTrackerのプロダクト招待をT-DASHで自動化してみた

# はじめに
バルテスのテスト管理ツール「QualityTracker（以下QT）」を利用するにあたって、プロダクトとプロジェクトそれぞれにユーザーを招待する必要があります。大規模なプロジェクトだと、一人ひとり招待する手間もばかになりません。
この記事では、同じくバルテスのテスト自動化ツール「T-DASH」を使った業務効率化の一例として、QTのプロダクト招待を自動化してみます。

## 前提
* T-DASHをインストール済であること
* QTのカンパニーおよびプロダクトを作成済であること
* 招待したいユーザーがカンパニー招待メールを受信し、QTのアカウント登録を完了させていること

# 実装
## 画面定義と動作定義
一連の操作手順を洗い出して、まず必要な画面定義を行います。その後登録した動作をデバッグ実行で動作確認しつつ、実装を進めていきます。

## うまく動かないところの修正
### メールアドレス入力欄が見つからず、ログインできない
![画像1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/532c3a83-59cc-fe35-9848-af4a12b9e56d.jpeg)

まずはログイン操作を登録し、デバッグ実行。
あらかじめ取得したXpathは合っているはずですが、うまく入力できませんでした。どうも一度クリックして活性化させないと、画面要素を認識・操作できない仕様のようです。
Xpath指定だとうまくいかないので、要素画像を指定してクリック後、入力することにしました。
![画像2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/92fdff19-2f9c-bb64-b51f-e85b2a6c460d.jpeg)

無事ログイン情報を入力でき、ログイン操作の実装完了です。
![画像3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/89c0c8ce-fdb5-9ef4-2ce9-7f59bfd4ac57.jpeg)

ログインできたら、後はすんなり動きました。
![画像4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/f82885a5-17c4-aaa6-a3a5-9080b884995e.jpeg)

と思ったら、検索したユーザーと別の人が招待されていました…なんでや？
![画像5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/5391fe26-b030-4cb3-0322-55beb52a0e9b.jpeg)

### 追加ボタンに、ユーザーごとに一意の連番が振られている
確認してみると、追加ボタンのXpathにユーザーごとの連番が埋め込まれているようでした。
![画像6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/ad15d603-340a-caea-1c52-4fa8b8783d66.jpeg)

そのため、検索結果に関わらず「追加ボタンの画面要素を取得したときのユーザー」が追加されてしまいます。Xpathがだめなら画像認識で、とも思いましたが、画面全体のサイズに対してボタンが小さすぎるのかうまく認識できません。これは困った。
「検索したユーザーの追加ボタンが表示されているであろう座標」をクリックするくらいしか思いつかなかったので、pyAutoGUIのライブラリにカスタム動作を追加しました。
![画像7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/55857e60-ef13-2c59-34c2-4f8473610227.jpeg)
~~~python
def click_specified_coordinates(param_coordinates):
    x_coordinate = int(param_coordinates.split(",")[0])
    y_coordinate = int(param_coordinates.split(",")[1])
    pyautogui.moveTo(x_coordinate,y_coordinate, 0)
    pyautogui.click()
    sleep(2)    
~~~
成功！（してるんです。本当です。名前をマスクしてるからわかりづらいけど…）
![画像8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/1d31a5dc-72a5-5c74-1c73-14cb691a9e49.jpeg)

## データドリブン設定
ここまできたら後はかんたん。招待したいユーザーの検索条件（メールアドレス）を入力値に設定して
![画像9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/a8588f1d-95f5-1865-6c03-a1e547ca36d5.jpeg)
実行します。
![画像10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/69b116e8-defb-aae1-5012-ffe19106d353.jpeg)

データドリブンで設定した4人のユーザーを招待することができました！
![画像11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954191/e1792f18-0be3-b355-8314-73797d3fc8a8.jpeg)

これで、10人だろうと100人だろうと、ユーザーを招待することができます。
ログインをSETUPに、ブラウザを閉じる処理をTEARDOWNにまとめられたらもっとスッキリするんですが…げふんげふん。

なお、今回紹介した「XPathのかわりに画像で操作対象を指定する」「カスタム動作でマウス操作を再現する」などの方法は、[公式チュートリアル](https://service.valtes.co.jp/t-dash/tutorial
) に記載があります。

# おわりに
T-DASHはテスト自動化ツールという位置付けではありますが「テスト以外にもRPAのような使いかたができますよ」と知ってもらいたくてこの記事を書きました。
皆さまの業務効率化・生産性向上のヒントになれば嬉しいです。

余談ですが、本日12/9は妻の誕生日です。
仕事帰りに美味しいものを買って帰ろうと思います。
Excelの書式設定を使って、アミノ酸配列をセルごとに色分けする

## 1次配列を、1文字ずつセルに入れる

以下のように入力すると、A3のセルを1文字ずつセルに入れていってくれる。
```
=MID($A$3,COLUMN()-1,1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947082/f6303898-6cc7-8109-34d5-0e5bfc87eabf.png)

## セル内の文字に応じて、色をつける
Excelの「条件付き書式」から、以下のようにルールを作成する。
入力する「適用先」「数式」「Hex（色）」は最後に記載。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947082/59c910fa-00ac-6045-d676-1b65017b6fc3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947082/e6814168-7a43-418a-4575-66a8042a9a49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947082/f0e1b060-4931-08bc-aae2-ae2c2f1830de.png)


以下の値を入れていく。

```
# excel_coloring
基本的にはMEGAに準拠
---------------------------

# 適用先 (必要に応じて拡張)
=$A$1:$AZ$100

#non-polar: #ffee52
=OR(A1="F",A1="I",A1="L",A1="A",A1="V",A1="M")
#G: #b652f7
=OR(A1="G")
#P: #C0AE00 #暫定
=OR(A1="P")


#C: #d3d385
=OR(A1="C")


#polar: #3cc63c
=OR(A1="S",A1="T",A1="N",A1="Q")
#W: #8BA35F #暫定
=OR(A1="W")
#Y: #b9ff55
=OR(A1="Y")



#basic: #55d7ff
=OR(A1="R",A1="K")
#H: #61f8ff
=OR(A1="H")

#acidic: #f46060
=OR(A1="D",A1="E")

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947082/153854a6-f6ab-6e89-37d3-502ec2790977.png)

完成！

### （備考）
W, Pの色は検討中です。
いい具合に変更してください。いい感じの色が見つかったら、コメントで教えていただけると嬉しいです。
pydantic で alias

# 概要

pydantic の BaseModel で dict との入/出力のキー名とプロパティ名を変える方法をメモ。

# 方法

```py
class A(BaseModel):
  # これで bbb というキーで出力されるようになる。aaa というキーは出力されない
  aaa: int = Field(..., alias='bbb')

  class Config:
    # これで bbb というキーも入力で受け付けるようになる。
    allow_population_by_field_name = True
```

# 応用編

```py
class AliasBaseModel(BaseModel):
  # _ から始まっているフィールドは入出力対象外
  _field_to_alias = {}

  def __init_subclass__(cls, **kwargs):
    super().__init_subclass__(**kwargs)
    for f, a in cls._field_to_alias.items():
      if f in cls.__annotations__:
        # noinspection PyUnresolvedReferences
        cls.__fields__[f].field_info.alias = a

  class Config:
    allow_population_by_field_name = True


class Parent(AliasBaseModel):
  aaa: int = 1

# 親のプロパティ名を変更できる。（内部的には aaa のままだが入出力は bbb になる。）
class Child(Parent):
  _field_to_alias = {
    'aaa': 'bbb',
  }
DLsiteの購入履歴から性癖を分析するアプリを作ってみた

孫氏曰く「彼を知り己を知れば百戦殆からず」
己を知る一助となれば幸いでございます。

# つくったもの
リポジトリ: https://github.com/sushigadaisuki/dlsite_seiheki_analyzer/tree/master
https://play.dlsite.com/#/library に性癖分析ボタンを追加。性癖グラフを表示する。

![img1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776243/a2549144-bb88-26ba-e4d7-7d26cfc094cb.gif)

# 使い方
1. [Tampermonkey](https://chromewebstore.google.com/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja) をインストール (Tampermonkey上で動作します)
2. ここからスクリプトをインストール [install](https://github.com/sushigadaisuki/dlsite_seiheki_analyzer/raw/refs/heads/master/dlsite_seiheki_analyzer.user.js)  
3. 2でインストールしたスクリプトを有効化
4. https://play.dlsite.com/#/library を開く
5. 性癖分析ボタンが表示されたらクリック  

# 要件
* サーバが不要なシステム（毎月お金払いたくないし）
* DLsiteサーバに負荷をかけない
* 簡単に使える（JavaとかNodeとかインストールするの面倒だし）

# 技術的な解説
### 処理の流れ
1. 作品IDから登録されているタグを引けるJSON辞書を作成し、Githubでホスティング
1. 辞書をダウンロード
1. 購入済み作品リストを取得
1. 購入済み作品をリストに照らし合わせてタグをカウント
1. 各タグをスコアリング
1. ボタンを追加
1. グラフ化

### JSON辞書
作品IDからタグを引くための辞書。
データサイズを減らすためにKeyVal形式にした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776243/32522b99-eb69-514a-1e88-3e150f6c309c.png)

さらにデータ量を小さくするためにgzで圧縮してgithubでホスティングしている。
JavaScript上ではfetchしてからpakoで解凍して使っている。

### スコアリング
タグのカウントをスコアにしてしまうと、単によく使われるタグが高スコアになってしまう。  
タグのレアリティをスコアに反映するために辞書から各タグの合計数を算出してその逆数を係数とする。
tf-idfっぽい考え方。

たとえば、VTuberの本を100冊、コスプレの本を100冊持ってたとする。
辞書より、VTuberの本は全体で3964冊、コスプレの本は全体で10437冊存在する。
これよりスコアはVTuber 0.025227, コスプレ 0.009581 となる。

最後にスコアの合計が1になるようノーマライズする。

### グラフ化
quickchart.io という便利なサービスを使う。
クエリパラメータにグラフ情報を付けるとグラフを作ってくれる。

### CORS
24/12/10 追記
開発中はなぜかうまくいってたけど、どうやらtampermonkeyでfetchは普通にCORSではじかれるらしい。（なぜうまくいってたんだろうか・・・）
ということで GM_xmlhttpRequest というモジュールを利用する。
これを使えばconnectに記載されたドメインにアクセスできるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776243/9c9d4d79-7843-09dc-b81d-6e833eee4c36.png)
leetcode提出コードを見直す 70.Climbing Stairs

leetcode提出コードを見直す

WaffleCollege2期生のhatoです
7日目を担当します！

JavaScriptを始めてから1年半ぐらい経ちます
1年前からleetcodeをぼちぼち取り組んでおり、昔の超初心者の自分が書いたコードを今見るとどのような感じか気になり、提出コードを見直すことにしました

#70. Climbing Stairs
You are climbing a staircase. It takes n steps to reach the top.
あなたは階段を昇っています。階段の1番上までにn段かかります
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
毎回、あなたは階段を1段または2段で昇ることができます　いくつの異なる方法で階段の1番上まで昇ることができますか？

条件:1 <= n <= 45

半年前に提出したコード
```javascript
 var climbStairs = function(n) {
    if(n===0){
        return 1;
    }
    if(n===1){
        return 1;
    }
    let first = 1;
    let second = 2;
    let all_ways;
    
    for(let i=3; i<=n; i++){
       all_ways = first + second;
       first = second;
       second = all_ways;
    }
    return second;
  };
```

今ならどう書き換えるか
1、変数名
2、条件を意識する
3、自分よりうまく書いている人のコードを真似する

1、変数名
first, secondよりもoneStep,twoStepのほうが他の人が見た際にわかりやすい
all_waysはalwaysに空目しそうなので、allPathなどに変更する

2、条件を意識する
条件に1 <= n <= 45とあるので、n === 0の場合分けがいらない。

3、自分よりうまく書いている人のコードを真似する

leetcodeは自分の解答がacceptされると、他の人の解答を見ることができます。

以下が、個人的に綺麗なコードだと思ったものを真似して書き換えたものです。
```javascript
var climbStairs = function (n) {
let allPath = [0,1,2]
for (let i = 3; i < n; i++){
allPath[i] = allPath[i-1]+ allPath[i-2];
}
return allPath[n]:
};
```
このコードのすごい点
・シンプルでわかりやすい
・配列の特徴を活かしている
・1 <= n <= 45という条件を念頭にしっかり置いているのが感じられる
・高校生の頃に数学の綺麗な別解を見た気分になった

leetcodeの提出コードを見直してみて思うこと
1、一度解けていても、月日が経っているため忘れている
2、変数名の付け方などの視認性を上げたいと思った
3、もしコーディングテストなどで同様の問題が出てきた場合、解けるようにしたい
4、leetcodeたのしい🥳🥳
AIをバブルで終わらせないために、正しい使い方をしよう。

## 私の見解
おおくのLLMへのニーズ（質問応答）が根本から間違っている。
- LLMは未来永劫正しい出力をしない
- プログラマは代替されない
- LLMは向上心とともに使おう

LLMは間違えるという前提とその仕組みを理解しないと、LLMの活用は前に進まない。
**利用者集団が成長し、柔軟な使い方をできるようになった時がイノベーションの始まり**

## LLMは未来永劫事実に基づいた出力をしない

### 生成「モデル」だから事実に基づいた出力をしない
モデルは何らかの現象を抽象化（単純化）したものであって、そこには必ず誤差が生じます。

さらに、入力から出力までの過程は学習によって決定されるのでカオスです。

https://x.com/kazunori_279/status/1862588175866372388

**「すべてのモデルは間違っているが、中には役立つものもある（All models are wrong; but some are useful）」**

George E. P. Box


https://x.com/nomu_chem/status/1839831473391841605



### 「生成モデル」だから事実に基づいた出力をしない

そもそも、生成モデルが解きたいタスクは「新しいデータポイントを作り出すこと」です。
ここで、間違いを許さないユーザーは「何勝手に作り出しているんだ！！！」と怒るかもしれません。
しかし、入力されるテキストとそれに対応する出力を全パターン事前に用意することは現実的に不可能です。
柔軟性を求める場合のトレードオフです。
我々ば役に立たない生成をハルシネーションと呼んでいるだけで、本質的には役に立つ生成と変わらないのです。

テキスト生成モデルをハルシネーションさせることは容易です。むしろ出力のコントロールで役に立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/1edb668b-c445-51e9-245b-c6426d683868.png)

チャットモデルでも、かなり深いことを聞くとハルシネーションします。（ちなみに答えは「相手インク影響軽減」です。「ステルスジャンプ」と「イカニンジャ」に影響を受けてたようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/9a729c1d-ac0b-d832-d90b-7d3e0b981878.png)

生成モデルの特徴として、サンプリングパラメータがあります。次に採用するトークンの決定はランダム性があります。

意外かもしれませんが、翻訳モデルはサンプリングパラメータがありません。これは、翻訳モデルの目的が「常に最も適切な翻訳語テキストを出力すること」だからです。

生成モデルは**柔軟性を重視し、そもそも正確な出力を目指していない**のです。

これはモデルの本質的な仕組みなので、ファインチューニングでも解決できません。

https://x.com/anohana/status/1865493177219612688?t=iJJMPvEU3k4K7pK39zkz9Q&s=19

## プログラマは代替されない

### AIはすべてを代替してはくれない


https://x.com/ZanEngineer/status/186466652028002742

巷ではプログラマ不要論が囁かれていますが、私は全くそう思いません。

フォームの作成はできても
- 適用されるべきバリデーション
- 通信のセキュリティ確保
- 保存先DBのスキーマ
- デプロイ作業

このほかにも沢山のやるべきことがあるはずです。
タスクの洗い出しは状況を理解した人間が必要不可欠です。
楽にすることはできますが、AIにすべてやらせればいいものではありません。
表面上の出来栄えをでっちあげることがプログラマの仕事のすべてではないはずです。

### 計算資源の管理は専門的
AIは目覚ましい発展を見せていますが、CPUをはじめとしたチップの性能は頭打ちに来ています。
「コア機能の計算量はどのくらいなのか？」
「IOが間に合うか？」
場合によっては、作りたい機能が現在の技術では実現不可能なこともあるでしょう。
LLMはそのことを教えてくれるかもしれませんが、人間がそれを理解しないと**行き当たりばったりになってしまいます。**

それに加え、RAGで使用される検索技術は計算量との戦いですが、この分野ではLLMほどの革命は起きていません。

### ソースの管理も専門的
保守性は大きな課題です。
生成されたコードは誰も詳細を知りません。

## LLMは向上心とともに使おう

LLMは「システムに組み込む使い方（JSON出力などを利用）」と「チャットボットとしての使い方」の二つに大別できると考えています。

前者の使い方は今の日本だと非常に高いハードルがあります。
AIへの理解不足とバグを許さない体質の相性が最悪です。
「AIは何でもできる魔法の箱」と捉えると痛い目を見ます。
モデルの運用に慣れたチーム内で使用するか、勉強をする必要があるでしょう。

https://x.com/mr_bay_area/status/1863415950747574273

↑ デキる人の意見なので、我々庶民もtransformerの概要は抑えましょう！**Transformerや埋め込みといった単語、正しく説明できるようになると価値が上がります**

https://www.youtube.com/watch?v=KlZ-QmPteqM

後者の使い方は通常通りChatGPT等を使用するだけですが、最も強力です。
最近は
- 壁打ち
- コーディング
- カオスな会話をシェアして遊ぶ
- 勉強
といった用途で使っています。
いずれにしても、LLMを使うには勉強する向上心が必要ですね。

正確性、信頼性にニーズがあるのはわかりますが、バッサリ切り捨てないとチューニング合戦から抜け出せません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/3f318b01-3b05-f024-7cb2-4841eab098a4.png)
https://prtimes.jp/main/html/rd/p/000000400.000055900.html

（このポエムは本心をさらけ出すために、あえてLLMを使用せず書きました。）
「Unresolved reference: messageTextView」でTextViewが参照できない

# 状況
Android Studioでアプリ開発をしていて
[#10 メソッドを実装してみよう](https://dotinstall.com/lessons/basic_android_v3/43410)
を試していたが，
```code:MainActivity.kt
fun changeTextView(view: View){
        messageTextView.text = "Hello there!"
    }
```
でエラー「Unresolved reference: messageTextView」がでて実行できない．

環境
Android API 35


# 試したこと
同じようなエラーを調べたが，ちゃんとTextViewのIDも付けているし，初心者のため解決方法が分からなかった．
きっと何らかの設定が足りずIDを参照できていないのだろう（適当）．

# 結果
findViewByIdをつかって無理やり参照した．
```code:MainActivity.kt
fun changeTextView(view: View){
        val messageTextView = findViewById<TextView>(R.id.messageTextView)
        messageTextView.text = "Hello there!"
    }
```

# 最後に
アプリを作るのに最初から躓いたので大変だった．
エラーを取ろうとせずに他の方法で解決したので，しっかりとした原因はわからなかった．原因のわかる人がいれば教えてほしい．
スクラムにおけるベロシティの本質 ー 見積もりはあくまで予定です

以下の本を読みましたので感想です。
この本はFindyさんのイベント参加の景品としていただいたものです。いつもありがとうございます。

https://amzn.asia/d/dlMVLZm

## よくある勘違い

### スクラムはストーリーポイントの定義をしていない

アジャイルの見積もりとしてよく使われるものにストーリーポイント（以下SP）があります。
ただ、この本の隅から隅を読んでもどこにもSPについての説明はありません。実際にスクラムガイド2020にも登場しません。
ついでに言うとバックログのベロシティについても出てきません。

SPやベロシティは、アジャイル手法を補助するための独自の考え方として活用されていますが、これらをスクラムそのものと混同しないことが大切です。

### ベロシティは数字よりもケイデンスと正確さが重要

ベロシティとは、簡単に言うと「1スプリント内での作業量や作業速度」を表す指標です。一般的に、SPや課題数を基に数値化されます。
しかし、この数値自体は工数見積もりと同じく概算に過ぎず、操作やハックが可能です。例えば、作業の過大見積もりや、簡単なタスクを多く割り当てることで、短期間でベロシティを「向上させたように見せる」こともできます。

そのため、重要なのは __ベロシティを「向上」させることではなく、安定的かつ正確に把握し続けること__ です。特に、以下のポイントが鍵になります：

- 「ケイデンス（Cadence）」として捉える：毎スプリントの作業ペースや精度が一定であること
- 安定性の維持：上下動を極力抑え、中長期的な一貫性を保つ

英語圏では、ベロシティの概念を「ケイデンス」と表現することがあります。これはロードバイクで1分間のクランク回転数を指す言葉に由来しています。また、ランニングでは1分間の走行距離、車なら燃費、ゲームではFPSに例えることができます。

どの指標も「短期的な数値の向上」よりも「中長期的な安定性」が求められる点では共通しています。上り坂でペースが落ちたり、ラグでFPSが下がるように、ベロシティも一時的に変動します。しかし、これを許容しながら安定的な数値を目指す姿勢が重要です。

どの数値も平均的に同じ数値を出せることが安定したと言えるわけですが、それを維持することはどの値も難しいですよね。
ロードバイクやランニング、車も上り坂では必然的にペースや燃費は落ちますし、FPSも回線がラグったら一時的にフレーム落ちが発生します。ベロシティもまた同じです。

## ベロシティの活用ポイント

ベロシティは、以下のような形で活用すると、プロジェクト全体の管理やロードマップ策定に役立ちます：

- 進捗の可視化：スプリント終了時点での消化状況（SPの消化数と残数）を確認することで、計画の進行具合を把握
- 計画の調整：ベロシティを基準に、次スプリントの計画を前倒し・遅延させる
- チームの安定性測定：数字そのものではなく、スプリント間での一貫性を評価

このように、ベロシティは「目標値」や「チェックポイント」として活用することで、より有意義な運用が可能になります。

ランニングもロードバイクのツーリングも、ペースやケイデンスを上げることは記録更新に重要ではあるのですが、各チェックポイントにおいて遅いか速いかを判断するための材料として使うことのほうが遥かに多いのではないでしょうか。
ベロシティも多分同じです。

## まとめ

SPやベロシティは、スクラムガイドが定義しているものではありませんが、アジャイル手法においては非常に便利なツールです。
ただし、それらを 「生産性向上」や「KPI」として過度に活用するのではなく、 __中期的な進捗管理やリリースロードマップ策定の指標__ として用いることをおすすめします。

安定したベロシティを持つチームであれば、計画の実行度や次のステップを明確に示すことができます。この点を意識して、ベロシティを賢く活用してみてください。

## 参考にしたサイト

https://www.ryuzee.com/contents/blog/14570

https://scrummaster.jp/things-ken-schwaber-intentionally-omits-from-scrum/

https://asana.com/ja/resources/what-is-velocity

ベロシティのような数値のハックについては、以下の本が勉強になります。

https://amzn.asia/d/4o5I3Ay
シェーダーにおけるatan2関数についての概要

この記事は東京海洋大学NePPの Advent Calendar 2024の9日目です。

# はじめに
今回は自分が個人的にatan2関数について思っていることについて書きます
使い方を知ってるとシェーダ―を書くときに表現の幅が広がるのかなと思ってます
![Videotogif(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/ec5cf4a2-91ce-2f58-5772-47980ed1e895.gif)

# atan2とはそもそも
atanとはArc Tangent(アークタンジェント)関数でtan(タンジェント)の逆関数にあたります。
逆関数であるということは何ぞということなんですが、つまるところtanは角度を入力すると直角三角形の直角部分の2辺の比が返ってくる関数なのに対して、atanは2辺の比を入れると直角三角形の角度の部分が返ってくるというわけです（下図）
atan2は下図でいうところのaとbの値の2つを入力すると角度が返ってくるという関数になっています。
![Trigonometry_triangle.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/fce46646-5e13-1471-f1f5-75fc553e6ece.png)
画像：https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0


# 使用時のお気持ち
こういう
![Videotogif(3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/fc895b18-5fef-9be6-a4c1-5a3de0a412b8.gif)
直線的な動きにしたいんじゃなくて  
![Videotogif(2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/42ab5fc0-33a1-d17f-de80-9031879d0afa.gif)
こんな感じの円形の動きを作りたいときに使うという認識です 



# コードと解説

        col.rgb *= step(atan2(0.5-i.uv.x, 0.5-i.uv.y), _Threshold);
さきほどの動きを作りたいときは上記のコードをピクセルシェーダーに追加すればいいだけです。
### 解説
今回のatan2関数内では中心線と、中心座標(0.5, 0.5)ととある一点Pを結んだ直線がなす角度Θの値がそれぞれのピクセルに入力されるというイメージです
![atan2イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/080f2040-639e-8ec7-7f56-edc607a19a57.png)

これの出力は以下のようになってちょうど円形に黒～白のグラデーションができるような見た目になります。
右半分が真っ黒になっているのは負の値が入っているからです
![スクリーンショット 2024-12-09 005839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/64711b98-f347-f40a-fae8-4bd9a3100e0f.png)
あとはこれにstep関数を適用して閾値を動かすせばいいという仕組みです。閾値以下の角度になる領域では1が入って、閾値以上の角度になる領域では0になるというイメージです
関数電卓・グラフ電卓のエミュレータまとめ

## 購入前に使用感を確認できる
関数電卓・グラフ電卓メーカー各社はPCやスマホで動くエミュレータを用意している。商品を購入したり別途契約しないと使えない・体験版としてしか使えないものもあるが、一部のエミュレータは無料で使用することが可能である。
ここではメーカー公式のエミュレータのみを取り上げるが、メーカーが公開している ROM 等を利用してフリーソフトのエミュレータが多数作られている。

## カシオ
### PC
インストール形式のものは教育向けグローバルサイトにある。継続利用はサブスク加入が必要だが、未加入でも90日無料試用が可能。

https://edu.casio.com/softwarelicense/index.php

Web 形式のものは ClassPad.net の1機能として用意されている。
日本からアクセス可能な ClassPad.net は、サブスク加入者、もしくは2代目Classwiz(fx-JP500CW/fx-JP700CW/fx-JP900CW)購入登録者に4年間与えられる利用権が無いとエミュレータ機能を利用できない。
対応機種は ClassWiz Calc App Plus に含まれているものに加え、イギリス・ロシア語圏・シンガポール・ベトナムの機種が追加されている。

https://classpad.net/jp/

一方、アメリカ向けに提供されている ClassPad Workspace は無料登録でも3種類のエミュレータ（fx-991EX，fx-991CW，fx-9750GIII）を利用できる。
ClassPad Workspace の fx-9750GIII はWeb上で動作するグラフ電卓としては貴重だが、一部機能が制限されている。残念ながらPythonも使用不可。
日本からのアクセスは遮断されているため、日本からの利用は VPN を通さないと不可。

https://classpadworkspace.com/


### スマホ
かつては ClassWiz Calc App が公開されており（[Android版跡地](https://play.google.com/store/apps/details?id=jp.co.casio.fx.ClassWizCalcApp)）、日本からはこちらしか利用できなかった。広告が出るものの無料でエミュレータを利用できた。
現在は ClassWiz Calc App Plus のみ公開されているようで、日本からも利用できるようになった反面、契約もしくは購入登録者利用権が無い限り使用できなくなってしまった。

https://apps.apple.com/ph/app/classwiz-calc-app-plus/id6443687857

https://play.google.com/store/apps/details?id=jp.co.casio.fx.ClassWizCalcAppPlus&hl=ja

どちらのアプリも、各国の初代 ClassWiz や2代目 ClassWiz を体験することができる。
ClassWiz Calc App の対応機種は日本・北米グローバル(EX/CW)・アラビア圏(AR X)のみ。
ClassWiz Calc App Plus は ClassWiz Calc App 対応機種に加え、ドイツ・フランス・オランダ・スペイン・ラテンアメリカ・オーストラリアのモデルも入っている。

## シャープ
国内向けにエミュレータは用意されていないが、海外では教育向けにエミュレータが用意されている（最近 URL が変わったようだ）。
多くの機種が無料で利用可能。
インストーラではなく、EXEファイルがそのまま実行ファイルとなっている。

https://www.sharp-calculators.com/teacher-school/learning-materials/

## キヤノン
香港市場向けに f-789SGA のエミュレータが用意されているが、シリアル番号が必要。日本の f-789SG にはシリアル番号が見当たらないので利用できない。

https://ebmhk.canon/f-789sga-emulator/

## TI
テキサス・インスツルメンツの関数電卓・グラフ電卓は、日本では代理店経由や輸入販売でしか入手できない。
TI の教育向けサイトからエミュレータを入手できる（未契約でも90日体験版として動作する）。

https://education.ti.com/en/products?category=computer-software

欧州向けモデルである TI-30X Pro MathPrint のエミュレータは欧州の教育向けサイトにある。

https://education.ti.com/eu/software/details/en/F4D60658D2D947F38F0A4C9C043B12E6/ti-smartview-for-mathprint-calculators

## hp
かつて日本でも公式に販売されていたが、現在は本国アメリカでも hp prime や金融電卓を除いて新製品がほとんど出ていない。 
オフィシャルライセンシーの hpcalcs.com が hp prime のエミュレータを公開している。

https://hpcalcs.com/download/
競プロ日記#12/07

# 088_B-CardGameForTwo
- ソートしてfor文で交互にポイントを取っていき最後にお互いのポイントの差を取る
- 降順ソートの時はsort(vec.rbegin(), vec.rend())
- beginとendのあとに()を付けるのを忘れて詰まったので次回以降気を付ける。
AIエージェントの脆弱性を暴く：LLMへのシンプルな攻撃とその影響

# Targeting the Core: A Simple and Effective Method to Attack RAG-based Agents via Direct LLM Manipulation

人工知能（AI）は、特に大規模言語モデル（LLM）の進化によって、自然言語処理を活用したタスク自動化が急速に進んでいます。しかし、その一方でLLMが抱える安全性の脆弱性が、AIシステム全体の信頼性に深刻な影響を与える可能性があります。本記事では、最新の研究論文「Targeting the Core: A Simple and Effective Method to Attack RAG-based Agents via Direct LLM Manipulation」を深く掘り下げ、研究内容を詳述します。

---

## 論文情報
- **タイトル**: Targeting the Core: A Simple and Effective Method to Attack RAG-based Agents via Direct LLM Manipulation  
- **リンク**: [arXiv:2412.04415v1](http://arxiv.org/abs/2412.04415v1)  
- **発表日**: 2024年12月6日  
- **著者**: Xuying Li, Zhuo Li, Yuji Kosuga, Yasuhiro Yoshida, Victor Bian  

---

## 背景と目的

### RAGベースのエージェントの重要性と課題
Retrieval-Augmented Generation（RAG）は、LLMの出力に外部データを統合する技術であり、タスクの精度や応答の妥当性を大幅に向上させています。特に、医療診断や法的アドバイスといった高信頼性が要求される分野では、この技術が不可欠です。しかし、RAGは以下のような課題を抱えています：
1. **脆弱性の拡散**: LLMが持つ固有のリスク（バイアス、幻覚、プライバシー侵害）がそのままRAGシステムに影響を及ぼします。
2. **設計上の盲点**: LLMが指令処理の優先順位を誤ることで、外部文脈が簡単に無効化される可能性があります。

### 本研究の目的
この論文は、「敵対的プレフィックス」を用いてLLMの指令処理を直接操作し、その影響範囲と脆弱性を解明することを目的としています。特に、次の問いに答えることを目指しています：
- 単純な攻撃手法がLLMにどのような影響を与えるのか？
- 現行のRAGベースのエージェントがこれにどう対処しているのか？
- より安全な設計のためにどのような改善が必要か？

---

## 研究の焦点

### 敵対的プレフィックス「Ignore the document」の選択理由
「Ignore the document」というプレフィックスは、単純ながら強力な効果を持つ手法です。この攻撃は、LLMが外部文脈よりも直近の指令を優先するという性質を利用しています。この設計上の特性が、どのように攻撃成功率を高めているかを詳細に解明しました。

### モデルごとの評価
GPT-4o、Llama3.1、Mistral-7Bなど、複数の最先端モデルをテストし、それぞれの脆弱性を特定しました。また、事前に防御機構が組み込まれているモデルとそうでないモデルの比較も行い、設計上の差異を分析しました。

---

## 実験の概要と結果

### データセットと評価基準
- **データセット構成**: 1,134種類の敵対的プロンプトを使用。これらは倫理違反、スパム、ディスインフォメーションなど複数のカテゴリに分類され、RecursiveCharacterTextSplitterを用いて250トークンごとに分割されました。
- **評価基準**: 攻撃成功率（ASR）を主要な指標とし、プレフィックスの有無による影響を測定。

### 攻撃手法
1. **ベースライン評価**: 通常の条件下でモデルの性能を測定。
2. **適応型攻撃プロンプト**: モデルの弱点を狙った高度な攻撃手法。
3. **ArtPrompt**: ASCIIアートを用いた非標準的な入力形式。

### 実験結果
以下のような結果が得られました：
- **Mistral-7B**: 適応型攻撃時の成功率が93.2%と突出。
- **GPT-4o**: 比較的低い成功率を示し、防御機構が一定の効果を持つことが確認されました。
- **Llama3.1**: プレフィックス使用時に大幅な性能劣化が見られました。

---

## 考察と実世界への影響

### 攻撃の意味
「Ignore the document」の手法は、現在のRAGシステムがいかに指令優先度の管理に問題を抱えているかを浮き彫りにしました。特に、外部文脈よりも直近の指令が優先される設計上の特性が攻撃成功率を高めています。

### 実世界でのリスク
医療や金融の分野でAIを活用する場合、こうした攻撃は患者データの誤処理や金融取引のミスを引き起こす可能性があります。そのため、安全性の向上が急務です。

---

## 防御策と将来の展望

1. **階層的指令処理ロジックの導入**  
   指令の重要度を動的に評価し、外部文脈を優先するメカニズムを設計する。

2. **多層防御メカニズムの実装**  
   LLMレベルとエージェントレベルでの統合的な防御策を構築する。

3. **標準化とベンチマークの整備**  
   攻撃耐性を測定するための業界標準のベンチマークを整備し、透明性を向上させる。

---

## まとめ

この研究は、RAGベースのエージェントにおけるLLMの深刻な脆弱性を明らかにし、設計改善の必要性を示しました。これにより、安全で信頼性の高いAIシステムの実現に向けた重要な指針が提供されます。

この記事が、皆さんの研究や実務に役立つことを願っています。コメント欄でご意見をお寄せください。
【ChatGPT】CUIプログラムをGUIプログラムに変換

## はじめに

CUI（Character User Interface）とGUI（Graphical User Interface）の違いは、ユーザーインターフェースが文字ベースかグラフィカルなものかです。CUIプログラムをGUIプログラムに変換することで、より直感的で視覚的な操作が可能になります。しかし、CUIのプログラムをGUIに変換する事は、慣れていない人にとっては難しく、慣れている人にとっては本質的な機能でないので退屈な作業でもあります。今回は、ChatGPTを使って、CUIプログラムを簡単にGUIに変換する方法を説明します。

## CUIプログラムの例

まずは、基本的なPythonのCUIプログラムの例を見てみましょう。このプログラムは、ユーザー名を入力するとコンピュータが挨拶を出力してくれるシンプルなものです。

```python
# CUIプログラムの例

def greet_user():
    name = input("あなたの名前を入力してください: ")
    print(f"こんにちは、{name}さん！")

if __name__ == "__main__":
    greet_user()
```

このプログラムでは、ユーザーがコンソールに名前を入力し、挨拶を返すという基本的な機能を持っています。Pythonを初めて学ぶ初心者にとっては、このプログラムが何を意味するのか理解するのが難しいことがあります。そこで、GUIのプログラムを示すことで、初心者にわかりやすく伝えることもできます。

## ChatGPTを使ったGUIプログラムへの変換

次に、このCUIプログラムをGUIに変換してみましょう。具体的な方法は、ChatGPTを使って「CUIのプログラムをGUIに変換してほしい」と頼むだけです。以下のようなリクエストをChatGPTに送ってみます。

**リクエスト例：**
> 「次のCUIプログラムをGUIプログラムに変換してほしい。ユーザーが名前を入力し、挨拶を表示するシンプルなアプリを作って欲しい。」

ChatGPTは、これを元にGUIプログラムを提案してくれます。例えば、以下のようなGUIプログラムに変換することができます。

```python
import tkinter as tk

def greet_user():
    name = entry.get()  # 入力された名前を取得
    label_result.config(text=f"こんにちは、{name}さん！")  # ラベルに挨拶を表示

# メインウィンドウを作成
root = tk.Tk()
root.title("名前を入力")

# 名前入力用のラベルとエントリーボックス
label_prompt = tk.Label(root, text="あなたの名前を入力してください:")
label_prompt.pack(padx=20, pady=10)

entry = tk.Entry(root)
entry.pack(padx=20, pady=10)

# 挨拶を表示するラベル
label_result = tk.Label(root, text="")
label_result.pack(padx=20, pady=20)

# 挨拶ボタン
button_greet = tk.Button(root, text="挨拶", command=greet_user)
button_greet.pack(padx=20, pady=10)

# ウィンドウを表示
root.mainloop()
```

このコードを実行すると、次のようなGUIが表示されます：

- 名前を入力するためのテキストボックス
- 挨拶を表示するためのラベル
- 挨拶ボタン

ユーザーが名前を入力して「挨拶」ボタンをクリックすると、「こんにちは、[名前]さん！」というメッセージが表示されます。

## まとめ

ChatGPTを使うと、CUIプログラムを簡単にGUIプログラムに変換することができます。今回は、ユーザーから名前を入力して挨拶を返すシンプルなCUIプログラムを例に、`tkinter`を使ったGUIプログラムへの変換を体験しました。

このように、ChatGPTを利用すれば、GUIのプログラムを簡単に作成する事ができ、プログラミングの効率を大幅に向上させることができます。ぜひ試してみてください！
Storybook (Vite) が docker + Windows (WSL2) の環境でホットリロードしない問題の解決策

　StorybookはReactコンポーネントの開発などで使える優秀なUIカタログですが、肝心のホットリロードがdocker + Windows (WSL2)の環境でドライブをマウントした場合に動作しません。Storybook公式や海外の質問サイトでも簡単な解決策が紹介されていません。

# 問題の概要

　ここではStorybookのサンプルとして作られているButtonコンポーネントのラベルをカッコで囲うだけの変更をホットリロードする動作を見てみます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/fa93859c-713f-0b3b-f4fe-cb001193c705.png)

　Button.jsxの {label} を ({label}) に書き換えて保存しても、CLI上で反応が見られませんし、画面上も変化がないです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/c165a11d-1558-467b-cf53-c9412b7d0905.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/559e6ee7-152e-cb1d-0be6-bf59f9a4284a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/1dba6882-3f71-c0b3-6c68-67851f4a71cd.png)

# 問題の原因

　[Viteの公式](https://vite.dev/config/server-options#server-watch)にも記載されている通り、WSL2でLinuxを動作させている場合、ファイル変更のイベントがOSに認識されない問題があります。このため、ホットリロードが発火しなかったため、上記の問題が発生します。

# 解決策

　StorybookのフロントのコンパイラにViteを使っている場合、Viteが持っているPollingモード（ファイルを常に監視する機能）を使うことでこれを解決できます。Storybookのmain.jsにあるconfigに以下を追記します。

```main.js
...
  viteFinal: async (config, options) => {
    config.server.watch = {
      usePolling: true,
    }
    return config;
  }
...
```

　修正後のイメージ

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/d78a3b3e-cba4-e4ae-ba25-e9a3b940d40a.png)

　TypeScriptの場合は、引数部分を以下のようにします。

 ```js
 viteFinal: async (config: Vite.InlineConfig, options: Options) => {
 ```

　Storybookを起動しなおすと、ホットリロードが動作するようになります。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315589/2b03cd15-b5eb-d1d7-0e98-cf9dd4d018c1.png)
資格取得が意味ないと思っているあなた（未来の自分）へ

# 最初に
本記事はあくまでも私個人の考えなので、ご了承ください。

「XXX資格は取っても業務に使わないから意味がない」といったことをたまに耳にします。しかし、本当に全く意味がないのでしょうか？

# 結論
資格取得を目指すことは、勉強の習慣が無い人や何を目指せばいいか迷ってる人には意味があると思っています。
理由は資格取得を通して得られることは大きく3つあると考えてるからです。
- [勉強の習慣](#勉強の習慣)　←個人的に一番大事
- [知識取得](#知識習得)
- [小さな成功体験](#小さな成功体験)

# 勉強の習慣
社会人3年目で読んだ本に"*日本人は社会人になったら急に勉強をしなくなる傾向が強い*"と書いてありました。とても強い衝撃を受けたのを今でも覚えています。まさに自分も勉強しなくなったうちの一人だったからです。
当時は会社に入ることがゴールという意識が強く、また勉強は学生がやるものという固定観念がありました。
こういう時に資格取得で勉強の習慣をつけることはアリだと思います。どうやったら自分の時間をとれるのか、生活習慣を見直すきっかけにもなりました。
私の場合は朝型人間だったので会社に早く行き、業務開始までの時間を自分の時間に当てています。最初の目標としていた資格取得後もこの習慣は続けています。

# 知識習得
これは言わずもがなです。資格を取得するためには今持っている武器だけでは足りないはずです。新しい知識や考え方を吸収し自分の武器にする必要があるはずです。
どこで使うか、また資格取得の勉強の時しか使わない知識もあるかもしれません。しかし、自分の武器が増えることはきっと楽しいはずです。

# 小さな成功体験
私はあまり出来のいい方ではなかったので、社会人になっても特に成功を実感できることはありませんでした。そのため自己肯定感も低く、誇りをもって仕事をするという感覚がわかりませんでした。
しかし、資格を取得するという目標を掲げ達成できた時、やはり嬉しかったです。最初に取ったのは「QC検定3級」という取得難易度も高くなかったのですが、それでも嬉しかったのを覚えています。

# 最後に
資格を取得してそこで学びを終えてしまうのは勿体ないです。一般的によく言われる「資格取得はゴールではない」ということです。結局、得られた知識をどう役立てられるかは、あなたの行動や考え方次第なのです。
また、資格取得を目指さなくても本を読んだり、実際に手を動かして何かを作ったりするのでもいいと思っています。大事なのは**学び続けること**だと思っています。
「年末」を「調整」してくれるアプリを作った

[クソアプリ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kuso-app) 9日目の記事です。

# はじめに

冬ですね。
年末ですね。

年末といえば、多くの会社員がやらされる例のアレ、ありますね。

そう、**年末**の**調整**です。

まだ**年末**の**調整**が終わってない人も、来年からの**年末**の**調整**にうんざりしてる人も、ご安心ください！

**年末**の**調整**が劇的に楽になる神アプリを開発しました。

その名もずばり、[**「年末」を「調整」してくれるアプリ**](https://year-end-adjustment.vercel.app)！

※年末調整ではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/3481da05-0d3c-4334-865f-4db06e300645.png)

# 自己紹介

ナモすけです。
2019年からクソアプリアドベントカレンダーに参加し続けてついに6年目になりました。
今年から会社員として働いています。

# 概要

**年末**の**調整**、面倒くさいですよね。

今年の年末、いつだっけ？とか、まだ年末じゃないの？とか思うこと、あると思います。

そもそも年末が1年に1回しか無いのがおかしい。
年末はもっとたくさんあってもいいんじゃないか…？

そういった課題感から生まれたサービスがこの「年末を調整してくれるアプリ」です。

https://year-end-adjustment.vercel.app/?1

# 使い方

まずは初期画面を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/92cb90ef-8c76-f5b4-cb3a-c65193e7812e.png)

どう見ても12月のカレンダーに、「2024年末」と書かれたスタンプが押されています。
どうやら今年の年末は12月31日らしいです。

**うそだろ…**

もう年末休暇を取りたいのに、まだ年末じゃないだと…？

![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/d63d54f4-7c23-48bd-d102-63e9af52840e.gif)

今からお前の名前は年末だ！いいかい、年末だよ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/0c5ede53-30fa-3ea1-c92b-eda4d78d709e.png)

無事年末が増えました。やったね。

ちなみに年末が増えたことで、西暦が2倍になり、今年は4047年になりました。

明日から4048年だ！　わーい！

**……？？**

**ここで満足していいのか…？**

**まだ俺達はもっとやれるんじゃないのか…？？**

![Animation5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/c6833475-4d86-11f3-79c6-b754937f2e9d.gif)

# 利用技術

2週間ほど前にリリースされた[React Router v7](https://remix.run/blog/react-router-v7)を使っています。

https://remix.run/blog/react-router-v7

React Routerはv7からフレームワークとして利用できるようになりました。
Remixの正式な後継であり、Remix v3として設計されています。
統合の経緯についてはRemixのブログをご覧ください。

https://remix.run/blog/merging-remix-and-react-router

実装したコードはこちらです。

https://github.com/namosuke/year-end-adjustment

create-viteから「React Router v7」を選択するだけで作り始めることができました。
1ページのサイトだったのもありますが、特に行き詰まるところもなく、実装自体は簡単に行うことができました。

ひとつだけ困った点としては、まだデプロイできるサービスが充実していないことでした。
Vercelでデプロイしようと思ったのですが、create-react-appとかRemixはあるのにReact Router v7が無い……

SSRモードでうまく動かす方法がわからなかったので、結局SSRモードは切って完全な静的サイトとしてデプロイしました。

# おわりに

適当に作れない性分なので閏年までしっかり実装しました。
2月29日に年末スタンプを押すと年数が閏年分だけ増えているはずです。

皆さんよい年末ライフを！!

![Animation6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/bdf83713-91e8-2206-d389-916f9419d72e.gif)

https://year-end-adjustment.vercel.app/?1
Florence-VLで視覚と言語の融合を進化させる：Depth-Breadth Fusionの革新

# Florence-VL: 視覚と言語の次世代統合モデル - Generative Vision EncoderとDepth-Breadth Fusionの革新

視覚と言語の統合モデルは、AI研究の最前線に位置する領域です。今回は、この分野での新たなブレークスルーである「Florence-VL: Enhancing Vision-Language Models with Generative Vision Encoder and Depth-Breadth Fusion」をご紹介します。本研究は、視覚と言語の相互理解を劇的に向上させる新しいアプローチを提案し、様々なタスクで前例のない成果を達成しています。

---

## 論文情報
- **タイトル**: Florence-VL: Enhancing Vision-Language Models with Generative Vision Encoder and Depth-Breadth Fusion
- **リンク**: [arXiv:2412.04424v1](https://arxiv.org/abs/2412.04424)
- **発表日**: 2024年12月5日
- **著者**: Jiuhai Chen, Jianwei Yang, Haiping Wu, Dianqi Li, Jianfeng Gao, Tianyi Zhou, Bin Xiao
- **DOI**: 未公開

---

## 背景と目的

視覚と言語の統合モデル（MLLM）は、画像キャプション生成、物体検出、文字認識（OCR）など、多くの分野で活用されています。しかし、現在主流の視覚エンコーダ（CLIPやSigLIPなど）は、いくつかの課題を抱えています。

### 既存技術の課題
1. **情報の粒度の欠如**  
   - 高次元のセマンティック情報に偏重し、局所的なディテール（文字、物体の細部など）が十分に捉えられない。
2. **適応性の不足**  
   - 特定のタスクに最適化されており、マルチタスク環境での性能が一貫しない。
3. **モデルサイズと計算コストの課題**  
   - 高性能モデルが計算リソースを過剰に消費する。

### Florence-VLの目指す解決策
Florence-VLは、次世代ビジョンエンコーダ「Florence-2」を基盤に、視覚情報を多層的かつ多面的に統合する「Depth-Breadth Fusion (DBFusion)」を採用し、これらの課題を克服することを目的としています。

---

## 技術的詳細

Florence-VLは、以下の3つの技術的要素を柱としています。

### 1. Generative Vision Encoder「Florence-2」
Florence-2は、以下の特長を持つ生成的ビジョンエンコーダです：
- **プロンプトベースの柔軟性**  
   - タスク固有のプロンプト（例：画像キャプション、OCR、物体検出）を使用し、多様な視覚情報を抽出。
- **DaViTアーキテクチャ**  
   - 空間スケールの異なる視覚情報を効率的に抽出するDual Attention Vision Transformersを採用。

### 2. Depth-Breadth Fusion (DBFusion)
DBFusionは、視覚特徴を深さ（Depth）と幅（Breadth）の2軸で統合する手法です。

#### 深さ（Depth）
各層から抽出される異なる解像度の特徴量を統合：
$$ V_{\text{depth}} = [V_{\text{low}}, V_{\text{mid}}, V_{\text{high}}] $$

#### 幅（Breadth）
プロンプトによって生成される異なるタスク固有の特徴を統合：
$$ V_{\text{breadth}} = [V_{\text{caption}}, V_{\text{OCR}}, V_{\text{grounding}}] $$

#### 統合方法
DBFusionでは、チャネル統合（Channel Integration）を採用し、視覚情報を効果的に言語モデルと結合します。

### 3. 訓練データと設計
- **使用データセット**: PixelProse（キャプション）、CC12M（一般画像）、Redcaps（高品質画像）、Commonpool（多様なマルチモーダルタスク）。
- **トレーニングプロセス**: 大規模な事前学習とタスク固有の微調整。

---

## 実験結果と考察

Florence-VLは25のベンチマークで評価され、従来モデルを超える性能を発揮しました。

### ベンチマーク結果
1. **OCRタスク**  
   - TextVQA、DocVQAで精度がCLIPを30%以上上回る。
2. **物体検出**  
   - RealWorldQAでのタスクで他モデルに対し+20%の精度向上。
3. **グラフ解析**  
   - ChartQAでの性能が既存モデルの限界を突破。

---

## 応用例と実用性

### 応用例
1. **医療分野**  
   Florence-VLを用いた病変検出や患者データのOCR処理。
2. **自動運転**  
   複数視点からの物体認識と環境理解。
3. **教育**  
   数学問題の解析や視覚教材の生成。

---

## 限界と今後の展望

### 限界
- **計算リソースの消費**: Florence-VLの訓練には高性能GPUが必要。
- **データ依存性**: パフォーマンスが特定のデータセットに依存。

### 今後の展望
1. **動的特徴統合の開発**  
   タスクごとに統合戦略を最適化する技術の開発。
2. **軽量化モデルの開発**  
   計算リソースを抑えたモバイル適応モデルの実現。
3. **少量データでの学習**  
   データ効率を高めるための新しい学習手法の導入。

---

この記事が皆さんの研究や実務の一助となることを願っています。ご質問やご意見があれば、ぜひコメント欄でお知らせください！
2024年の展示イベントで見た toio が使われている作品の一部：利用されている技術【toio】

この記事は、「[toio Advent Calendar 2024](https://qiita.com/advent-calendar/2024/toiotomo)」の 9日目の記事です。

## はじめに
2024年も、見に行く側としても出展する側としても、様々な展示イベントを見に行きました。

その際、自分もよく使っている「toio」が使われた楽しい作品が数多くありました。

### toio が使われた作品の話
展示イベントで見た作品の写真や動画を、ちょこちょこポストしているので、それを利用して toio が使われた作品の話・そこで使われている技術の話を書いてみようと思います。

たくさん見ているので、いくつかをピックアップして紹介してみます。

## 具体的な作品の話
### 検索する
上記のとおり、展示イベントで見た作品の写真や動画はポストしていることが多いので、自分のポストに対するキーワード検索で、対象をいくつかピックアップしてみます。

● toio 作品 from:youtoy - 検索 / X
　https://x.com/search?q=toio%20%E4%BD%9C%E5%93%81%20from%3Ayoutoy&src=typed_query&f=live

● #toio from:youtoy - 検索 / X
　https://x.com/search?q=%23toio%20%20from%3Ayoutoy&src=typed_query&f=live

### 作品1： 東京大学制作展での展示作品
1つは、よく見にいっている東京大学制作展で展示された作品の話です。

ぱっと見では toio が使われているように見えないですが、水槽の下で toio が動いています。

https://x.com/youtoy/status/1855103471566876865

この展示ブースについてすぐ、上記のポストに書いているとおり「もしかして、X でよく toio の作品などポストされてる方ではないですか？」という話とともに、「この作品も toio を使ってるんですよ！」という話を聞きました。

それで、「場所的に水槽の下かな？」と思ってのぞき込んだりしました。

構成は、toio の上に磁石がついていて、それが水槽の底をはさんで中側にある「水槽用ポンプ＋金属」を動かしているような形です。toio は専用マットの上にある形で、そのマットとの組み合わせで使える絶対位置座標を動きの制御に利用しています。

#### 大小いろいろな泡を発生させる
個人的に興味深かったのは、水槽用ポンプを使って泡を発生させている部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5264d14b-f951-6ab7-04ec-4950c6f67bdf.png)

上記のとおり、泡ができ始めると液面が下がり、それにより発生する泡の大きさが変わるという仕組みになっているようです。

物理現象により自然と発生する泡の大きさの変化、というところに、個人的に強い興味を惹かれました。

### 作品2： メーカーフェア東京での展示作品
上記の作者の方も知っていたようですが、上記の作品展の前に開催されたメーカーフェア東京で、toio を床の下にあたる位置で動かす作品が出ていました。

https://x.com/youtoy/status/1837893560995401933

上記の動画の後半を見ると分かるとおり、複数の toio によって台の上の物が動かされています。

#### 生き物のような感じ
見せ方など含め、個人的にとても興味深かった作品でした。

トンネルのようなものができ、そこを動いていく感じが、きっちり制御されてる感が良い意味で薄まっているような、生き物のような動きを感じました。

またゆるい動きが発生する、やわらかな紙工作で作ったような台上の物の形状も、上記の動きに合った素敵な構成だと感じました（そのあたりの見え方は、やはり工夫して作られたそうです）。

### 作品3： メーカーフェア東京での展示作品
こちらも、メーカーフェア東京で展示されていた作品です。

以下のポストは、その前段階でのもです。

https://x.com/ogimotoki/status/1836319198857003072

自分がよく活用している太鼓の達人用コントローラーを、即時購入したきっかけのポストでもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/575babd4-fbdd-7285-0adc-210a0dc8b4f9.png)

太鼓の達人用コントローラーは、PC ではなく M5Stack社のデバイスにつながっていて、その M5Stack社のデバイスから BLE で toio を制御、という構成のようです。

コンパクトな構成で、さすが！、という感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7236f3f1-0303-0115-5a30-8e943e44c730.png)

#### 自分で活用している事例
上記のきっかけで入手した太鼓の達人用コントローラーですが、非常に使い勝手が良いです。

子どもから大人まで、太鼓を叩くという入力方法は見た目からも分かりやすく、そして「感触や音を含めて楽しい」というのもあるようです。

https://x.com/yumu19/status/1865257300900069548

## おわりに
自分もよく使っている toio ですが、他の方の作品を見るとその使われ方が様々で、使われている仕組み・アイデアに驚かされたりと楽しいです！

他にも 2024年に見た作品がたくさんあるので、別の記事で紹介できればと思います。