OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel/Vue3/Inertia.js 部分的なリロードについて

## Inertia.jsについて

apiレスで、クライアント/サーバー間のデータの受け渡しができるinertia.jsですが、最近出たライブラリということもあってソースが少ないので少しまとめました。

## 部分的リロード

ページごと返すというのがデフォルト使用のinertiaですが、データを選択して、部分的に更新することも可能です。
inertiaのonlyメソッドを使いましょう。

### Controller

渡したいパラメーターを分離します。

``` DashboardController.php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
class DashboardController extends Controller
{

    public function __construct(Request $request){
        Log::debug("Constructor passed");
    }
    public function __invoke(Request $request){
        return Inertia::render('Mashboard', [
            'data' => $posts,
            'static_num' =>random_int(1, 10000), //ランダムな数を返す。
            'dynamic_num' =>random_int(1, 10000), //1から10000までの間
       ]);
    }
}

```

### View

:onlyを使って、更新したいデータを配列形式で渡します。

```dashboard.vue
<script setup>
import { Link } from '@inertiajs/vue3';
defineProps({
    static_num:Number,
    dynamic_num:Number,　//こいつだけを更新したい。
});

</script>
<template>

    <div class="text-[30px] flex flex-col justify-center items-center py-[100px]">
        <h2> Pertial reload test </h2>
        <p>動的な値:{{dynamic_num}}</p>
        <p>静的な値:{{static_num}}</p>
        <div class="text-center w-[680px] my-5">
            <Link href="/mashboard" :only="['dynamic_num']"> 
                <div class="border border-blue-300 my-3 bg-blue-200 rounded-full py-2 px-3">
                    <button>更新</button>
                </div>
            </Link>
          </div>
    </div>
</template>
```

### 結果

onlyで指定した変数だけ更新することができました。

ちなみに、更新のたびにControllerを通過しているのはLogによる裏付けで確認できます。
【Swift】最もシンプルな HTTP/S レスポンスボディ取得 (非同期処理含む)


「for」にこんな実力があるとは !

```swift
let url = URL(string: "https://wttr.in/?format=3")!
for try await line in url.lines {
  print(line)
}

// Kisarazu, Japan: ⛅️  +25°C
```

と思っていたら、String にもこんな力が!

```swift
print(
  try! String(contentsOf: URL(string: "https://wttr.in/?format=3")!)
)

// Kisarazu, Japan: ⛅️  +25°C
```

# 😅 つまらないので追記

![sc 2024-05-26 at 21.20.48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/fdc460e6-6baf-483d-4972-eb2e511fa7ee.gif)

https://gist.github.com/benigumocom/747d321bf35d4a354905145a42d3972c

ボディ は プレーンなテキストなので連続上書き後の最終行だけ。

非同期必須の cancel や exception は無視。



# 🧑🏻‍💻  参考

https://android.benigumo.com/20240109/url-lines/

https://qiita.com/chanzmao/items/306ce7dc4f29afb0550a
forex trading online course in india

Forex trading courses have become increasingly popular as individuals seek to tap into the vast opportunities presented by the foreign exchange market. These courses offer comprehensive education and training on how to trade currencies effectively, catering to both novice traders looking to enter the market and experienced traders seeking to refine their skills. From understanding the fundamentals of forex trading to mastering advanced technical analysis techniques, these courses provide a structured learning environment that equips participants with the knowledge and tools needed to navigate the complexities of the forex market.A typical forex trading course covers a wide range of topics designed to give participants a holistic understanding of the forex market. The curriculum often begins with an introduction to basic concepts such as currency pairs, exchange rates, and market dynamics. As participants progress, they delve deeper into topics such as technical analysis, fundamental analysis, risk management, and trading psychology. Advanced courses may also cover specialized trading strategies, algorithmic trading, and the use of trading software and tools. Throughout the course, participants are typically exposed to real-world examples and case studies to illustrate key concepts and principles.One of the key benefits of forex trading courses is the interactive learning experience they offer. Many courses utilize a variety of teaching methods, including lectures, workshops, simulations, and live trading sessions. This hands-on approach allows participants to apply theoretical knowledge in practical settings, honing their skills and building confidence as they progress. Moreover, courses often include access to online forums or discussion groups where participants can interact with instructors and fellow traders, sharing ideas, asking questions, and seeking advice in a supportive community environment.<a href="https://www.currencytrade.in/">forex trading course in india</a>  cater to a diverse range of learners, offering flexibility and accessibility to accommodate different schedules and learning preferences. Many courses are available online, allowing participants to learn at their own pace and from the comfort of their own home. Additionally, some courses offer flexible scheduling options, allowing participants to choose the timing and duration of their study sessions. This accessibility makes forex trading education accessible to individuals from all walks of life, regardless of their location or prior trading experience.
vue3 vite didn't resolve at build time, it will remain unchanged to be resolved at runtime

表題の通りのエラー

```
didn't resolve at build time, it will remain unchanged to be resolved at runtime
```

出ちゃったね！

css に background url を設定していると出るみたい。

```hoge.css
.sb-bg{
    width: 100%;
    height: 0;
    /* (画像の高さ / 画像の横幅) × 100 */
    padding-top: 47.804878%;
    background: url('/img/sb1.png');
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
}
```

とりあえずの解決として、以下のように画像ファイルだけ直接埋め込みにした。


```hoge.css
.sb-bg{
    width: 100%;
    height: 0;
    /* (画像の高さ / 画像の横幅) × 100 */
    padding-top: 47.804878%;
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
}
```

```hoge.vue
<div class="sb-bg" style="background: url('/img/sb1.png');"></div>
```

これで解決。
KMP (Kotlin Multiplatform)を用いてiOS/AndroidでQitta記事一覧を取得するアプリを作ってみた

## 完成アプリ
KMPを用いてiOS/Androidの両OSでQittaの記事一覧を取得するアプリを作成しました。完成のデモになります。

|iOS|Android|
|:-:|:-:|
|![QittaiOS.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/99cfa36f-da70-dc89-19c9-a3050f6aec84.gif)|![QittaAndroid.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/aa59cfad-94c3-d3a4-0018-3e149dd2dee2.gif)|

## KMPとは

> The Kotlin Multiplatform technology is designed to simplify the development of cross-platform projects. It reduces time spent writing and maintaining the same code for different platforms while retaining the flexibility and benefits of native programming.

公式ドキュメントの説明だと「Kotlin Multiplatformは、クロスプラットフォームプロジェクトの開発を簡素化するために設計されています。この技術は、異なるプラットフォーム向けに同じコードを書く時間とメンテナンスする時間を削減しながら、ネイティブプログラミングの柔軟性と利点を維持します。」と記載されています。

簡潔に言うとKotlinをベースにServerとAndroid,iOS,Desktop,Webでコードを共有して実装できる仕組みになります。これによりコードの再利用ができ開発効率の向上や保守の簡素化というメリットを享受できます。
本記事ではiOSとAndroidアプリのコードを共有化して実装を進めていきます

![スクリーンショット 2024-05-26 0.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/e941fa82-3b92-ddc8-1aaa-0dc21f528daf.png)

## KMPでどこまでコードを共有するのか
KMPではUI、Presentation,BUsiness/Domain, Data/Core全てを共有してiOS/Androidアプリを開発することができます。しかしながらKMPでUIを共有化すると各プラットフォームのネイティブなUIコンポーネントや機能をフルに活用できず、実現したいレウアウトが実装できないと言う問題が発生します。

そのため本記事では[Create a multiplatform app using Ktor and SQLDelightのチュートリアル](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html)に習ってUI部分とViewModelに関しては各プラットフォーム(iOS-SwiftUI, Android-Jetpack Compose)で実装しビジネスロジック部分をKMPで共通化して実装していきます。

## 本アプリの構造
図のような構造でアプリを開発しました。
各プラットフォームのViewを作成しそれぞれのViewModelを保持しています。KMPではQittaSDKとQittaAPIを持ちビジネスロジックとデータアクセスレイヤーを共通化しました。

![スクリーンショット 2024-05-26 1.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/df3f1f9f-d683-129d-0236-fe666633f981.png)

## 実装
Githubで公開していますので参考にしてみてください。
[kmm-qitta-list](https://github.com/tomoakiWeb/kmm-qitta-list)

KMPの環境設定に関してはこちらの[公式ドキュメント](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-setup.html#possible-issues-and-solutions)を参考にすることができます。

# Kotlin Multiplatformプロジェクト構成図

```plaintext
Kotlin Multiplatform Project
│
├── /composeApp
│   ├── commonMain
│   │   └── すべてのターゲットに共通するコード
│   ├── androidMain
│       └── Android専用のコード
│
├── /iosApp
│   └── iOSアプリケーションとしてビルドされるXcodeプロジェクト
│
└── /shared
    ├── commonMain
    │   └── すべてのターゲットに共通するコード
    ├── androidMain
    │   └── Android専用のコード
    └── iosMain
        └── iOS専用のコード
```
#### /composeApp
/composeAppフォルダは、Compose Multiplatformアプリケーション全体で共有されるコードを保存するためのフォルダです。主にUIコンポーネントや、Composeに関連するロジックが含まれます。本プロジェクトではAndroidのUIUIやViewModelに関する実装とAndroidManifest.xmlでAndroidのアプリ全体をしています。

#### /iosApp
/iosAppフォルダはiOSアプリケーションとしてビルドされるXcodeプロジェクトです。Xcodeで開きビルドすることができます。
#### /sharedフォルダ
/sharedフォルダは、プロジェクト内のすべてのターゲット間で共有されるコードを保存するためのフォルダです

## 参考文献
[Ktor と SQLDelight を使用してマルチプラットフォーム アプリを作成する](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html)
[Kotlin マルチプラットフォーム](https://kotlinlang.org/docs/multiplatform.html)
WriteBlob Failed `/var/www/html/hoge/storage/ai/00072-2005651837.png' @ error/png.c/MagickPNGErrorHandler/1642

表題の通りのエラーが出た。

ということで修正しましょう。


storageのパーミッションを変更

```
chmod -R 777 storage
chown -R your storage
```


今後のために以下もやっておきましょう。

参考
https://syuntech.net/php/laravel/laravel-log_permission-denied/



ユーザーグループの作成、追加
```
groupadd laravel
gpasswd -a root laravel
gpasswd -a nginx laravel
chown -R :laravel ./storage
chown -R :laravel ./bootstrap/cache
```

出力されるログ・ファイルのパーミッションを変更

```/config/logging.php
'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
    'days' => 14,
'permission' => 0664,  /****追加***/
],
```

出力されるファイルのグループ変更

```
chmod 2755 storage
```
第12回SQLコンテスト全完したので勝手に解説する（ネタバレあり）

# はじめに

SQLコンテストという、1時間以内にSQL(SQLite3)に関する問題を4問回答して速さを競うコンテストについて、全問正解できたので勝手に解説します。
直近で行われたのは4/19〜4/22の第12回です。これから取り組む人はネタバレ注意です。

https://topsic-contest.jp/contests/contest012

## 筆者スペック

IT系？勤務5年目。データサイエンス系業務（が長め）（~~最近は意味不明な業務~~）
SQL実務4年間くらい（ユーザ側でSELECT文メイン）。AP/DB持ち

# 解説

## 問題1

> 部門テーブル(DEPARTMENT)に、以下の内容で2件のデータを挿入しなさい。（以下略）

`INSERT`文の問題でした。
私は業務上`INSERT`文をほぼ使わないので、構文を調べるところから始めました（ロスタイム）が、、構文コピペで解答できました。
ちなみにSQLコンテストは`SELECT`文では難しい問題が出ますが、`INSERT/UPDATE/DELETE`は簡単な内容が多い気がします。
（お試しの画面で結果が確認しにくい＆普通INSERT系は表計算ソフトで確認しながら投入していくと思うので、当然といえば当然ですが・・・）

## 問２

> 社員テーブル(EMP)に登録されている、各社員の社員英字名(EMP_ENG_NAME)の先頭から10文字を表示しなさい。ただし、半角スペースは文字数にはカウントしないで取り除いて表示すること。また、社員英字名が未入力(NULL)の場合は、CUTOUT_STRに'未入力'と表示すること。（以下略）

文字列を操作して`SELECT`しなさいという問題でした。
要件を読むのが面倒くさいのですが、`substr()`や`replace()`などの関数を使えれば比較的シンプルにできました。
SQLは言語によって細かい動作が若干違ったりしますが（`show tables`と`\dv`みたいな）、文字列操作は大体同じなので、そこそこ短時間で解ける気がします。

## 問３

> 2024年4月1日時点の商品テーブル(ITEM)と2023年12月31日に商品テーブルをコピーして作成した商品履歴テーブル(ITEM_HISTORY)がある。
この2つのテーブルを比較して、2023年12月31日から2024年4月1日の期間に、追加、更新、削除されたデータを表示しなさい。（以下略）

`SELECT`と`JOIN`の問題でした。
多くの回答者は`LEFT OUTER JOIN`して、追加のテーブル・更新のテーブル・削除のテーブルを3つ作っていたのですが、私は`FULL OUTER JOIN`でくっつけて1度で処理していました。

私は、複数テーブルを紐づける際、気軽に`FULL OUTER JOIN`を使うのですが、業務的によく使っていたから経験あり＆考えるのに慣れているだけで、普通は`LEFT OUTER JOIN`を複数回やったほうが将来的な保守性の面では良さそう・・・と思いました。
個人的には良問だと思っています。テーブルをゴチャゴチャ紐づけていって色々なテーブルから情報を取るのがSQLだと思っているので。。

## 問４

> 売上テーブル(SALES)より、2024年3月1日から28日までの4週間分のデータを集計し、売上件数と売上金額合計(SALES_AMT)の一日当たりの平均値を曜日別に表示しなさい。（中略）金額は3桁ごとにカンマを入れ、最後に'円'を付けること。（以下略）

SQLコンテストにまれによくある、SQLで文字列の表示形式をゴリゴリ変えさせる問題でした。
表示形式は別言語、どちらかというとUIに近い側で操作した方が良いとは思いますが、**SQLiteで何とかする**という縛りプレイだと思い、心を無にして取り組んでいます

SQLiteだと表示形式は`printf()`で色々カスタマイズできる模様ですが、CASE文を用いて手動でカンマを入れる回答が多かったです。
私は「対象期間3/1〜3/28のうち、データがない日があると変なことになりそう」と思い込んで、`WITH RECURSIVE`構文を使って最初に日付のリストを作ったりしていましたが、模範回答を見ると不要そうでした。（ロスタイム）

# 完走した感想

問題4はめんどくさかったものの、全体的に簡単だった気がします。実際、満点回答者が結構いました。
私は金曜日の仕事終わりに取り組んだのですが、4位（42:41）と最高順位でした。。
ブドウ糖がキマったのかな（？）

（下書きにあるのを忘れていて上げるの遅くなりました、、）
daemon.json編集後にdockerサービスが起動出来なくなった時の対処

構築してからしばらく経っている俗に言う負債サービス環境調査時のメモです。

/etc/docker/daemon.jsonの中身をいじっていたらdocker起動しなくなって、全記述削除してみてもサービス起動せずハマった。

daemon.json自体が存在すると中身が空でもダメらしい

journalのログを確認してみると

```
# journalctl -xe
Sep 15 20:06:51 xxxxxxxxxx.ap-northeast-1.compute.internal dockerd[1248]: unable to configure the Docker daemon with file /etc/docker/daemon.json
```
daemon.jsonファイルでdaemonの構成が出来ない的な表示を確認


```
# rm -f /etc/docker/daemon.json
# systemctl reset-failed docker.service
# systemctl start docker.service
```
一度削除して起動で解決しました


※ 確認したdockerバージョン

```
# docker --version
Docker version 19.03.2, build 6a30dfc
```
【Swift】構造体とクラスについて

# はじめに
Swiftの構造体とクラスに関して、差異等を含めて簡単にまとめたいと思います。

# 構造体とクラス

## 構造体

### 定義構文
構造体の定義構文は下記の通りとなります。
```swift
struct 構造体名 {
    // 変数や関数を定義する
}
```

### 使用例
使用例は下記の通りとなります。
```swift
struct HogeStruct {
    var hoge: Int = 0

    mutating func hogeFunction() {
        hoge += 1
    }
}

var hogeStruct1: HogeStruct = HogeStruct()
hogeStruct1.hogeFunction()

//構造体は値型なので、hogeStruct1と別のインスタンスが代入される
var hogeStruct2: HogeStruct = hogeStruct1 
hogeStruct2.hogeFunction() 

print(hogeStruct1.hoge) //1が出力される 
print(hogeStruct2.hoge) //2が出力される
```

* `.`を付けることで、構造体内の変数や関数にアクセスすることが可能です。
* 構造体において、構造体内の関数から構造体内の変数の値を変更する場合、`mutating`を付与する必要があります。
* 構造体は値型なので、`hogeStruct1`と`hogeStruct2`は別のインスタンスを持つため、互いに干渉することはありません。

### 値型について
値型とは、変数や定数が代入されるとき、関数に渡されるときに値がコピーされる型のことを指します。

使用例でのコードの場合、下図の通り`hogeStruct1`が持っているオブジェクト(インスタンス)をコピーしたものが`hogeStruct2`に代入される動作となります。
コピーされたオブジェクト(インスタンス)が代入されるため、`hogeStruct2`内の変数値が変更されたとしても、hogeStruct1に影響を与えることはありません。

![スクリーンショット 2024-05-26 16.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326710/8bb8c12f-8ddd-60e3-63f4-3e724b5b0aa2.png)


## クラス

### 定義構文
クラスの定義構文は下記の通りとなります。
```swift
class クラス名 {
    // 変数や関数を定義する
}
```

### 使用例
使用例は下記の通りとなります。
```swift
class HogeClass {
    var hoge: Int = 0

    func hogeFunction() {
        hoge += 1
    }
}

var hogeClass1: HogeClass = HogeClass()
hogeClass1.hogeFunction()

// クラスは参照型なので、hogeClass1と同じインスタンスの参照が代入される
var hogeClass2: HogeClass = hogeClass1
hogeClass2.hogeFunction()

print(hogeClass1.hoge) //2が出力される 
print(hogeClass2.hoge) //2が出力される
```

* `.`を付けることで、構造体内の変数や関数にアクセスすることが可能です。
* クラスの場合、構造体とは違いクラス内の関数からクラス内の変数の値を変更する場合、`mutating`を付与する必要がありません。
* クラスは参照型なので、`hogeClass1`と`hogeClass2`は同じインスタンスであるため、互いに干渉しあいます。

### 参照型について
参照型とは、オブジェクト(インスタンス)が置かれている場所を保持する型のことを指します。
使用例でのコードの場合、下図の通り`hogeClass1`が参照しているオブジェクト(インスタンス)と同じオブジェクト(インスタンス)の参照が`hogeClass2`に代入する動作となります。
`hogeClass1`と`hogeClass2`は同じオブジェクト(インスタンス)の参照を保持するため、どちらかがクラス内の変数の値を変更すると、もう一方のクラス内の変数の値も変更されてしまいます。

![スクリーンショット 2024-05-26 16.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326710/d4347cda-65b6-d58e-1a4a-4bde8a82966c.png)


## クラスの追加機能について
クラスには構造体にはない以下4点機能があります。

* 継承により、親クラスの特性を継承することが可能
* 型キャストを使用すると、クラスインスタンスの型をチェックして解釈する
* デイニシャライザを使用すると、クラスインスタンスは割り当てられたリソースを解放可能
* 参照カウントを使用すると、クラスインスタンスへの複数の参照が可能

クラスは上記追加機能等により複雑になりやすいので、基本的には構造体の使用が推奨のようです。


# 参考文献
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures/
HonoでReactをやる

# Honoとは

最近、ちまたで人気のWebフレームワークHono🔥
少しづつYoutubeでも取り上げられたりと人気が出てきています。

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


日々最新のバージョンがリリースされ、色々試していくうちにReactと一緒に開発している日本語での情報が少ないと思い自分の備忘録用に書いていく。

基本的な開発環境構築に関しては、以下の記事を参考にしてもらうと良いと思います。

https://zenn.dev/yusukebe/articles/0c7fed0949e6f7

https://qiita.com/RuruCun/items/c4cc6afb19e670d5bed6

# 環境構築
ファイルの作成
```
npm create hono@latest my-app
```
設定の選択
```
? Which template do you want to use?
    aws-lambda
    bun
    cloudflare-pages
❯   cloudflare-workers
    deno
    fastly
    lagon
    nextjs
    nodejs
    vercel
```
プロダクトが作成されたら、プロダクトのディレクトリへ移動して、以下２点をインストールします。
```
npm i  react react-dom
npm i --save-dev @types/react @types/react-dom
```

インストールが完了したら、`package.json`の中身に上記の内容がきちんと保存できているか確認してください。
バージョンに関しては記事を作成した時点での最新のものになっています。
```package.json
{
  "scripts": {
    "dev": "wrangler dev src/index.ts",
    "deploy": "wrangler deploy --minify src/index.ts"
  },
  "dependencies": {
    "hono": "^4.3.11",
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  },
  "devDependencies": {
    "@cloudflare/workers-types": "^4.20240403.0",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0",
    "wrangler": "^3.47.0"
  }
}
```

今回はファイル名を`.ts`ではなく`.tsx`を使用したいので、ファイル名を変更します。
それに伴い、`package.json`も併せて変更させてください。

# いざ実装へ
前述の変更が終わったら、初期状態のコードから以下のコードに変えてみましょう。

```index.tsx
import { Hono } from 'hono'
import { renderToString } from 'react-dom/server'
import React from 'react'


const app = new Hono()

app.get('/', (c) => {
  return c.html(
    renderToString(
    <html>
      <body>
        <h1>Hello</h1>
      </body>
    </html>
    )
  )
})

export default app
```

上記のコードに変更したら、今度は、`npm run dev`を実行して、`http://localhost:8787`が立ち上がり以下の挙動が出るか確認しましょう。

![スクリーンショット 2024-05-26 14.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633642/bac3853f-cc06-a4d8-34e1-52131c775e9c.png)

画像のように無事Helloと表示されてれば無事実行されていることが確認できます。

## 補足
今回の内容は下記のようなディレクトリ構成がになります。
```
.
├── README.md
├── node_modules
├── package-lock.json
├── package.json
├── src
│   └── index.tsx
├── tsconfig.json
└── wrangler.toml
```

# 感想
これを行い始めた頃、どうしたことか、`npm i --save-dev @types/react @types/react-dom`の操作を忘れてしまい焦りました　笑
深夜に確認するものじゃ無いですね！
リモートサーバーとのディレクトリ同士の差分があるかどうか判定する方法

# 結論：rsyncコマンドの`--dry-run`オプションを使います。

## コマンド
以下のコマンドの出力結果でファイルのリストが出てきたらdiffがあります。
(rsyncコマンドは同期を行うコマンドで--dry-runオプションをつけていれば、実際に同期は行われません)
```bash
rsync --dry-run -av -e ssh {ローカルパス} リモートホスト:{リモートパス}
```
例：
```bash
kubota_akihiro:test20240326 $ rsync --dry-run -av -e ssh /Users/kubota_akihiro/Documents/2019/ root@ubuntu.local:/home/ubuntu/Documents/2019/
building file list ... done
20240526_Sun.txt

sent 135957 bytes  received 26 bytes  38852.29 bytes/sec
total size is 24477449  speedup is 180.00
```

# 考察

- diffの結果を見るには、以下の記事のようにループを回して、１つずつdiffをとる必要がありそうです。
実務で使えるdiffのまとめ #diff - Qiita
https://qiita.com/nakamura-tsuyoshi/items/8bc850e8cc13e96d1a12

- `rsync --dry-run ~`の有無によって、処理を分岐したい時
```bash
file_list=`rsync --dry-run -av -e ssh /Users/kubota_akihiro/Documents/2019/ root@ubuntu.local:/home/ubuntu/Documents/2019/ \
| sed -n "/building file list ... done/,/sent/p" \
| sed "/building file list ... done\|^$\|sent/d"`
```
のようにするとfile_listに修正するファイルリストが出力されるので、これを用いて、
```bash
if [ -n "$file_list" ]; then
  echo "diffがある時の処理"
else
  echo "diffがない時の処理"
fi
```
として分岐します。

- rsyncとscp(cp)の違い
rsyncとscp(cp)変わらないではないかと思っていましたが、この--dry-runコマンドが使える点が大きく異なります。これで、リモートサーバーとのdiffがあるかどうかがわかります。
[JavaScript] mapメソッドとは

# まとめ

#### `map`メソッドとは
> `map()` は Array インスタンスのメソッドで、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。オブジェクト指向プログラミングにおいて、プログラム上の手続きの対象を抽象化する概念である。
※[mdn web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

つまり、**配列の各要素に対して指定した関数を実行し、その結果を新しい配列として返すメソッドです。このメソッドは、元の配列を変更せず、新しい配列を返します。**

# 目次
- [基本構文](#基本構文)
- [`for`文と`map`メソッドの比較](#`for`文と`map`メソッドの比較)
  - [`for`文](#`for`文)
  - [`map`メソッド]()
  - [比較結果](#比較結果)
- [活用例](#活用例)

# 基本構文
配列`numbers`の値を`num`としてコールバック関数`num => num * 2`に渡し、新たな配列`doubled numbers`として返している。

~~~JS:JavaScript
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(num => num * 2);

console.log(doubledNumbers); 

//出力結果　[2, 4, 6, 8, 10]
~~~


# `for`文と`map`メソッドの比較
## `for`文

~~~JS:JavaScript
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = [];

for (let i = 0; i < numbers.length; i++) {
  doubledNumbers.push(numbers[i] * 2);
}

console.log(doubledNumbers); 

//出力結果　[2, 4, 6, 8, 10]
~~~

## `map`メソッド

~~~JS:JavaScript
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(num => num * 2);

console.log(doubledNumbers);

//出力結果　[2, 4, 6, 8, 10]
~~~

## 比較結果
### コードの簡潔さ
`for`文：ループの初期化、条件チェック、インクリメントの構文が必要で、やや冗長です。
`map`メソッド：ループの内部ロジックを隠すため、コードがより簡潔で読みやすくなります。

### 不変性
`for`文：元の配列を変更しないように注意する必要があります。
`map`メソッド：新しい配列を返し、元の配列を変更しません。

### 関数型プログラミングのスタイル
`for`文：命令型プログラミングのスタイルに近く、手続き的です。
`map`メソッド：関数型プログラミングのスタイルに沿っており、より宣言的です。


# 活用例
`map`の第一引数outputは配列`members`で定義した中身です。
また、第二引数は`index`は配列`members`各要素のインデックス番号です。
各配列にアクセスして、処理（加工）をして、新たな配列を作成していることがわかります。

~~~JS:JavaScript
const members = ["Aileen", "Bob", "Cindy", "David", "Ema"];

const team_members = members.map((output, index) => {
  return `${index + 1}番目は${output}`;
});

console.log(team_members);

//出力結果　["1番目はAileen", "2番目はBob", "3番目はCindy", "4番目はDavid", "5番目はEma"]
~~~


# 参考リンク
- [mdn web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
- [【JavaScript入門】配列処理をするmap()の使い方とMapオブジェクトの解説！](https://www.sejuku.net/blog/21812)
技術力を高めようと考えたわけ

# 現状と自己紹介について

* ITインフラを主にしている企業に転職したばかり
* 新卒で入った企業ではフロントエンドでwebアプリ開発のプログラマーをしていた
* 一度異業種を挟んだもののもう一度ITの世界でやっていきたいと思い再びIT業界に戻ってきた

* コマンドプロンプトやWindows関連の
技術（ActiveDirectory等）を触っている。

* 個人開発で今[react,typescript]を使用している
→外部の機能（API）を自分のプログラムと連携させるのに躓いている

# 技術力を高めようと思ったきっかけについて

* 今行っている技術をオフラインで環境構築している際に
エラーが出てその問題の解決に時間がかかっていること
→問題解決力を上げたい！

* 個人的に作りたいサービスとゲームを作りたいと考えているから


# 個人的に作りたいサービス・アプリとは

１コミュニケーションを円滑にするデバイスもしくはアプリの開発
２リズムゲームを作ること

## １について思い至った経緯について

* youtubeでAPDという話を聞くときに言葉の把握がしにくいという症状があるのを知った。
* 自分自身も説明や会話の中でよく聞き返してしまうことや聞いているときに何と話しているのか聞く言葉を飛ばしてしまうことがある。
→耳だけでなく視覚的に情報や言葉を取り入れられたら良いと考えたため

以上の２点から耳が聞こえにくい人に対して円滑にコミュニケーションがとりやすくなる機器やアプリを作りたいと考えました!

## 問題解決力と技術力向上の為に行動

１エラーや問題が起こった際に自力で解決できるようにしていきたい+自分が作りたいものがスムーズに作れるようになりたい

行動しようと考えた際にアウトプットをしまくるという記事を発見！
→https://qiita.com/Sicut_study/items/79838a4b8ec36bc3a961

この記事を読んでいた際に**JISOU**というコーチングサービスがあることを知って参加させていただいています。

今後react開発・勉強とアプリのリリースに向けて自分自身前進していきます！

## さいごに目標について

* 短期
プログラミングの基礎力をつけ、自力でアプリを即座に作れるようになること

* 中期
コミュニケーションを円滑にするデバイスもしくはアプリの開発でプロトタイプのものを作成すること

* 長期
１プロトタイプを作成したものを試行錯誤してサービスとして提供できるようにする
２プログラミングのことだけではなく自由に時間をコントロールして使えるように
なりたい
PowerShell で行を指定して PATH の［削除・置き換え・追加・挿入］を行う

**※パス名自体に ;（セミコロン）が含まれる場合は、以下の方法はうまくいきません。**
**※プロセススコープで変更するので、現在の PowerShell セッションにのみ影響を与えます。**

~~~PowerShell:PowerShell
# 環境変数の PATH から PSCustomObject を作成
$PATH = ConvertFrom-String -Delimiter ";" $Env:Path
# 表示
$PATH

# 存在しないディレクトリを検出
$PATH.PSObject.Properties | Select-Object -Property Name, Value | Foreach-Object {"$($_.Name): $($_.Value)",[System.IO.Directory]::Exists($_.Value),""}

# 任意のパスを削除する
$rm = "P10"
$PATH.PSObject.Properties.Remove($rm)

# 任意のパスを置き換える
$mv = "P1"
$replacePATH = ""
$PATH.$mv = $replacePATH

# 任意のパスを末尾に追加する（変数 $add は既存の key(Name) と被らないように）
$add = "P100"
$addPATH = ""
Add-Member -InputObject $PATH -MemberType NoteProperty -Name $add -Value $addPATH

# 任意の位置にパスを挿入する（ $Position-1 :１行目を０として数え始めるため）
$listPATH = [System.Collections.ArrayList]$PATH.PSObject.Properties.Value
$Position = 3
$insertPATH = ""
$listPATH.Insert($Position-1, $insertPATH)
$newPATH = ($listPATH -join ";").Trim(";")

# $Env:Path を置き換える新しい文字列を準備
if ([String]::IsNullOrWhiteSpace($newPATH)) { $newPATH = ($PATH.PSObject.Properties.Value -join ";").Trim(";") }
# 任意のパスを追加する
$addPATH = ""
$newPATH += ";$addPATH"

# 環境変数 PATH を更新
$Env:Path = $newPATH
~~~
公式ドキュメントを読め。Qiitaを開くな。

# はじめに

**公式ドキュメントを読め！Qiitaを使うな**

このような発言はネットで時々見かけるような内容であり、ある程度プログラミングができるような方を中心に見かけるイメージのあるものです。

私はこの発言を見るたび思うことがあります。

<font color="red">**Qiitaに投稿すべき内容を多くの人が間違っているからこのような発言が生まれている**</font>

今回は、「公式ドキュメントを読むべき理由」「Qiitaが適切な場合」「Qiitaに投稿すべき内容」について書いていきます。

# 公式ドキュメントを読め

「公式ドキュメントを読め」

これは私として気持ちがものすごくわかります。
公式ドキュメントにはだいたいの知りたい内容については書かれていますし、1次情報になるので情報が正確です。

QiitaやZennなどに解決方法がないかを時間を書けて調べるくらいならいきなり**公式を見たほうが早く解決することも多いです**。

その一方で「公式ドキュメントより先にQiitaを見る人の気持ち」もものすごくわかります。

公式ドキュメントには難しい内容がたくさんありますし、どこに何が書いてあるのかもわかりづらいことも多いです。

**「公式ドキュメントを読め」は完全に同意はできず、「公式ドキュメントを使うタイミングを見極めるべき」と考えます**

# Qiitaを読むべきタイミング

私がQiitaやZennなどを使うべきと思うのは、

**知りたい内容が一般的に知られているものであり、問題に多くの人が**

ということです。たとえばHTMLやCSS、Railsなどはメジャーな技術なので多くの人がQiitaに投稿をしています。
また、エラーなどもだいたいは調べるとすぐにヒットします。
このようなQiitaに記事が見つかりそうなものに関しては、Qiitaを使って解決するほうが早く解決できます。

**調べたい内容に対して多くの人が同じことで躓いてそうなイメージがあるものであればQiitaを使うのが早いです**

逆に、知りたいことが抽象的であったり、かなり複雑であったり、本質的なこと(言語仕様)が知りたいのであれば公式ドキュメントを読むほうが早くなります

# Qiitaに投稿すべきこと

とはいっても、Qiitaで早く調べられるかも知れませんが公式にも確実に同じ内容は乗っています。

Qiitaを使わずに公式ドキュメントを使うような習慣をもてば、ドキュメントのどこをみれば解決できるのかがわかるのでQiitaで調べるのと同様の速さで調べることも可能です。

**現在はChatGPTなどのAIもやり方をすぐ教えてくれます。**

<font color="red">**公式ドキュメントやAIの登場で、Qiitaははより価値が減ってしまっているように思えます**</font>

このように思えてしまうのは、**Qiitaに投稿するべき内容を多くの人が間違えているからです**

Qiitaに技術的な内容を載せても、公式ドキュメントを読んだほうが的確です。AIで調べて方が早く的確に返してくれます。

Qiitaに技術的な内容を載せることが時代に合わなくなっているように思えます。では、どんなことをQiitaに投稿すればよいのでしょうか？？

<font color="red">**あなたの考えや体験を投稿するのがQiitaの使い方なのです**</font>

体験や経験はどんなにAIが発展しても誰かが書かない限り増えるものではありません。もちろん公式ドキュメントにのっていることでもありません。

**多くの人は誰かの体験や考えから「気づき」を得て学びます**

考えや経験には大きな価値があります。
これらを投稿して多くの人に読んでもらえるのが「Qiita」なのです。

今後より「技術」で記事を書くことの価値は下がってきてしまいます。しかし、「考え」「体験」を知りたいというニーズがなくなることはありません。

**ぜひともQiitaには「考え」「体験」を記事にして投稿していただけるとよいのかなと考えます**

# おわりに

Qiitaに考えや経験を書けといいましたが、書いてみるとわかりますがかなり大変です。考えを書くということは自分のふわっと考えていることを伝わるように「言語化」しないといけないわけです。

この言語化が難しいことこそが、Qiitaにそのような記事が少ない原因になっています。

多くの人があなたの体験を知りたいと考えています。
ぜひともこの記事をみて気づきを得た人はまずはあなたのことについて記事を投稿してみてください。

ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。

また明日の記事でお会いしましょう！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp
[備忘録] Railsアプリケーションでtailwind.cssが読み込まれないとき

## 起こったこと
railsアプリケーションでcssがうまく読み込めなかった
error内容はこんな感じ
```:
The resource ファイル名 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.
```

## 試したこと
### 1. ブラウザのキャッシュクリア
効果なし

### 2. tailwind.css の再ビルド
いったん `app/assets/builds` 配下のファイルを削除 (今回は`tailwind.css`)
```
$ rails assets:clobber
```

その後 tailwind.css を再びビルド
```
$ rails tailwindcss:build
```

`app/assets/builds/tailwind.css` が再生成され、cssが読み込まれるようになった

## 余談
今回ちゃんと原因を調べずに、とりあえず読み込めないならrebuildしてみよう、で解決してしまった。
時間のある時にでも原因を探ってみようと思う。

## 参考
https://qiita.com/MIDO-ruby7/items/2e5aa81d0d3d609a53e4#6tailwind-css%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%E3%81%AE%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F-1

https://github.com/rails/tailwindcss-rails
YOLOv10: リアルタイムのEnd-to-Endオブジェクト検出手法

## はじめに

- 本論文では、リアルタイムのEnd-to-Endオブジェクト検出手法であるYOLOv10を提案しています。
- YOLOv10は、高速かつ高精度なオブジェクト検出を可能にし、自動運転やロボット制御など幅広い応用が期待されます。

---

なんJ式論文解説はこちら。

https://hamaruki.com/lets-talk-about-the-latest-improvements-in-yolov10/

## 論文の背景

### オブジェクト検出とは

オブジェクト検出とは、画像内の物体の位置と種類を特定するタスクです。以下のような応用先があります。

- 自動運転車における歩行者や障害物の検出
- 工場での製品の欠陥検査
- 監視カメラでの不審者の検出

### リアルタイムオブジェクト検出の重要性

多くの応用では、高速な処理が求められます。例えば、自動運転車では遅延が致命的な事故につながる恐れがあります。したがって、高精度を維持しつつ、リアルタイムに動作するオブジェクト検出手法の開発が重要な課題となっています。

### 既存手法の課題

既存のオブジェクト検出手法には以下のような課題がありました。

- 精度と速度のトレードオフ: 高精度な手法は処理速度が遅く、高速な手法は精度が低い傾向にある。
- 後処理の複雑さ: Non-Maximum Suppression (NMS) などの後処理が必要で、End-to-Endでの学習ができない。
- モデル設計の非効率性: モデルの各コンポーネントが最適化されておらず、冗長な計算が含まれている。

## 研究の方法と結果

### Consistent Dual Assignmentsによる NMS-free な学習

![file](https://hamaruki.com/wp-content/uploads/2024/05/image-1716708193535.png)

提案手法の主なアイデアは、図2に示すように、2つの検出ヘッドを用いることです。

1. One-to-many ヘッド: 学習時に豊富な教師信号を与える役割。1つの物体に対して複数の候補を割り当てる。
2. One-to-one ヘッド: 推論時に高速な処理を実現する役割。1つの物体に対して最適な1つの候補のみを出力する。

学習時は2つのヘッドを同時に学習し、推論時はOne-to-oneヘッドのみを使用します。これにより、NMSが不要となり、高速でEnd-to-Endな推論が可能になります。

さらに、Consistent Matching Metricを導入することで、2つのヘッドの学習の整合性を高めています。具体的には、One-to-oneヘッドの教師信号が、One-to-manyヘッドの最適解に近づくように設計されています。

### 効率性と精度を重視したモデル設計

提案手法では、YOLOアーキテクチャの各コンポーネントを効率性と精度の観点から最適化しています。

#### 効率性の改善

- 軽量な分類ヘッド: 回帰ヘッドに比べて分類ヘッドの計算量が大きいことに着目し、Depthwise Separable Convolutionを用いて軽量化。
- Spatial-channel decoupled downsampling: ダウンサンプリングの際、チャネル数の増加と解像度の削減を分離することで、効率的な特徴量の圧縮を実現。
- Rank-guided block design: 特徴量のランクに基づいて、冗長な計算の多いブロックをよりコンパクトなものに置き換える。

#### 精度の改善

- Large-kernel convolution: 受容野を広げるために、一部の層でカーネルサイズの大きな畳み込みを導入。
- Partial self-attention (PSA): Self-attentionの計算コストを抑えつつ、グローバルな特徴の統合を可能にするPSAモジュールを提案。

### 実験結果

![file](https://hamaruki.com/wp-content/uploads/2024/05/image-1716708453775.png)

COCOデータセットでの評価実験により、以下のような結果が得られました。

- 図1左: 同程度の精度では、YOLOv10-SはRT-DETR-R18の1.8倍の速度を達成。
- 図1右: 同程度の速度では、YOLOv10-XはYOLOv8-Xより0.5% AP高精度。
- YOLOv10-BはYOLOv9-Cと同等の精度で、46%の速度向上を達成。

## 結果の意義と応用可能性

### リアルタイムオブジェクト検出の高速化と高精度化

提案手法は、推論速度を大きく向上させつつ、高い精度を維持することに成功しました。これにより、リアルタイム性が重要な応用でのオブジェクト検出の実用性が大きく高まると期待されます。

### End-to-Endな学習による利便性の向上

NMSが不要なEnd-to-Endの学習を実現したことで、ユーザーにとっての利便性が向上します。後処理のためのハイパーパラメータ調整が不要になり、システムの実装が容易になると考えられます。

### モデル設計の指針の提供

効率性と精度を重視したモデル設計の各アイデアは、オブジェクト検出以外のタスクにも応用可能と考えられます。本研究で得られた知見は、様々な深層学習モデルの設計に役立つでしょう。

## まとめ

- YOLOv10は、リアルタイムEnd-to-Endオブジェクト検出の新たなSOTAを達成しました。
- Consistent Dual AssignmentsによるNMS-freeな学習と、効率性・精度を重視したモデル設計が主なアイデアです。
- 高速かつ高精度な検出が可能になり、自動運転などの応用で大きな貢献が期待されます。
- 今後は、モデルの大規模学習などにより、さらなる性能向上を目指します。

## 参考サイト

https://arxiv.org/abs/2405.14458v1

https://chatgpt.com/g/g-FArNlZonK-ronj-v1-6-1
ITパスポート 経営戦略

・経営戦略
内部環境や外部環境の変化に適応しながら、競合他社との激しい競争に勝ち抜くための方針を、経営理念や経営ビジョンに基づき決定すること

・全社戦略
企業全体の方向性を決める戦略

・コアコンピタンス
競合他社には真似できない自社独自の技術やノウハウ

・ベンチマーキング
自社の製品やサービスを継続的に測定して、競合他社や先進企業と比較すること

・M&A
企業の買収、合併
・垂直統合
別工程を担当する企業同士が統合すること
・水平統合
同業他社同士が統合すること

・TOB
株式の公開買い付け
・MBO
経営陣による自社の買収
・EBO
一般従業員による自社の買収

・アライアンス
企業同士の連携、企業提携とも呼ばれる
・OEM
相手先の商標やブランドで製品を製造し、供給する生産提携
・ジョイントベンチャ
企業同士が共同出資して新しい企業を設立する
・CVC
自社の事業と関連のあるベンチャー企業に投資し、自社の事業との相乗効果を図る形態
・ベンチャーキャピタル
急成長が見込めるベンチャー企業やスタートアップ企業に投資してリターンを狙う投資会社

・アウトソーシング
自社の業務の一部または全部を外部の業者に委託する形態
・オフショアアウトソーシング
海外の企業に外部委託する形態
・ファブレス
自社では工場をもたずに他の企業に生産委託する形態

・事業戦略
事業ごとに進むべき方向性を示した戦略
・コストリーダーシップ戦略
低価格で勝負する戦略。
・集中戦略
限定された顧客層や商品、地域などに絞って勝負する戦略
・差別化戦略
価格以外で、他では簡単に模倣できないもので勝負する戦略
・同質化戦略
同様の商品をぶつけて違いによる優位性をなくす戦略
・ブルーオーシャン戦略
競争のない新たな市場を開拓する戦略

・プロダクトポートフォリオマネジメント（PPM）
自社の事業や製品を、市場の成長率と自社の市場占有率から負け犬、問題児、金のなる木、花形の四つのカテゴリに分類し、分析する手法
共に低い負け犬、成長するには投資が必要な問題児、占有して資金を創る金のなる木、共に高い花形

・SWOT分析
企業の経営環境を、内部環境である強みと弱み、外部環境である機会と脅威の四つのカテゴリに分類し、分析する手法

・3C分析
自社、競合、顧客・市場の三つのカテゴリに分類し、分析する手法

・ファイブフォース分析
自社の取り巻く脅威を競合企業、新規参入の脅威、代替品の脅威、売り手の交渉力、買い手の交渉力の五つのカテゴリに分類し、分析する手法

・VRIO分析
経済価値、希少性、模倣可能性、組織という四つのカテゴリに分類し、分析する手法

・バリューチェーン分析
企業の事業活動を機能ごとに主活動と支援活動に分け、製品やサービスの付加価値は、どの活動で生み出されているかを分析する手法

・アンゾフの成長マトリクス
事業の成長戦略を市場と製品の２軸に、それぞれ既存と新規を区分して、市場浸透、製品開発、市場開拓、多角化の四つのカテゴリに分類し、分析する手法

・ビジネスモデルキャンバス
ビジネスモデルを成立させている要素を、９つに分けて分析する手法

・規模の経済
事業を絞り大量に仕入れて大量に生産、販売することでコストを削減する考え方
・範囲の経済
複数の事業を行いつつもその基盤を共通化することでコストを削減する考え方

・デジタルトランスフォーメーション（DX）
デジタル技術を活用して、業務プロセスを改善するだけでなく、製品やサービス、ビジネスモデル、さらには組織そのものを変革すること
【朗報】YOLOv10、非NMSで爆速＆高精度のオブジェクト検出が可能に【画像認識】

真面目な解説はこちら

https://hamaruki.com/yolov10-real-time-end-to-end-object-detection-method/

---


1 **風吹けば名無し＠無断転載禁止** (ﾜｯﾁｮｲ 3b8d-yNM5) sage 2024/05/25(土) 21:38:01.45 ID:7Hn0Abcr
新しいYOLOv10ってオブジェクト検出の精度と速度がすごいらしいで。非NMSのトレーニングもできるらしいし。

2 **AI初心者** (ｱｳｱｳｳｰ Sacf-/E1x) sage 2024/05/25(土) 21:39:42.71 ID:VztQbNzl
＞＞1 
YOLOってなんなん？オブジェクト検出ってどういうこと？

3 **コンピュータビジョン研究者** (ﾜｯﾁｮｲ 93e1-hy7k) sage 2024/05/25(土) 21:40:58.30 ID:JkLoQwEr
＞＞2 
YOLOは「You Only Look Once」の略で、画像やビデオから物体をリアルタイムで検出するアルゴリズムや。高速で精度が高いのが特徴やね。

4 **AI初心者** (ｱｳｱｳｳｰ Sacf-/E1x) sage 2024/05/25(土) 21:42:10.22 ID:VztQbNzl 
＞＞3
へー、すごいな。でも新しいバージョンで何が変わったんや？

5 **深層学習エンジニア** (ｵｲｺﾗﾐﾈｵ MM47-1Chi) sage 2024/05/25(土) 21:43:45.91 ID:F2GhijKl
＞＞4
YOLOv10では、NMSを使わない一貫性のあるデュアルアサインメント戦略を導入して、推論の効率を向上させてるんや。これにより、トレーニング時に豊富な監督信号を得つつ、推論時のNMSの必要がなくなるんやで。

6 **データサイエンティスト** (ｴｰｲﾓ MM7f-nyjP) sage 2024/05/25(土) 21:45:22.39 ID:DeFrStUv  
しかも、全体的なモデル設計の見直しで、計算の無駄を大幅に削減して、性能も向上させてるんや。例えば、YOLOv10-SはRT-DETR-R18と比べて1.8倍速くて、パラメータ数も2.8倍少ないんや。

7 **AI初心者** (ｱｳｱｳｳｰ Sacf-/E1x) sage 2024/05/25(土) 21:47:30.33 ID:VztQbNzl
＞＞5
デュアルアサインメントって何？どうやってNMSを使わんの？

8 **機械学習研究者** (ﾜｯﾁｮｲ 1f8d-3cN5) sage 2024/05/25(土) 21:49:01.12 ID:G2h5KjVr
＞＞7
デュアルアサインメントは、トレーニング時に一つの真実データに対して複数のポジティブサンプルを割り当てる方法と、単一のポジティブサンプルを割り当てる方法を組み合わせたものや。これにより、NMSがなくても高い精度を保つことができるんや。

9 **コンピュータビジョン研究者** (ﾜｯﾁｮｲ 93e1-hy7k) sage 2024/05/25(土) 21:50:35.41 ID:JkLoQwEr
＞＞7
NMS（Non-Maximum Suppression）は、検出結果の中から最も信頼度が高いものを選び、その周りの重複した検出結果を削除する手法や。YOLOv10では、NMSを使わずに推論を行うために、新しいマッチングメトリックを導入してるんや。

10 **ディープラーニング開発者** (ﾜｯﾁｮｲ 6a8d-rjM6) sage 2024/05/25(土) 21:52:10.45 ID:Pz3wGkLc
＞＞9
具体的には、デュアルアサインメントと一貫したマッチングメトリックを使うことで、トレーニング時に得られる豊富な監督情報を保ちながら、推論時には不要な予測を抑制できるんや。これにより、エンドツーエンドで効率的な検出が可能になるんやで。

11 **AI初心者** (ｱｳｱｳｳｰ Sacf-/E1x) sage 2024/05/25(土) 21:53:45.89 ID:VztQbNzl
＞＞10
なるほど、理解したわ。YOLOv10の他の改良点は何があるんや？

12 **機械学習エンジニア** (ﾜｯﾁｮｲ 1f8d-3cN5) sage 2024/05/25(土) 21:55:01.28 ID:G2h5KjVr
＞＞11
モデルの設計も大きく改善されてるで。軽量な分類ヘッド、空間チャンネル分離ダウンサンプリング、ランクガイドブロック設計などの導入で、計算の無駄を減らし、効率的なアーキテクチャを実現してるんや。

13 **データサイエンティスト** (ｴｰｲﾓ MM7f-nyjP) sage 2024/05/25(土) 21:56:22.11 ID:DeFrStUv  
＞＞11
さらに、大きなカーネル畳み込みや部分的な自己注意機構も追加されてるで。これにより、モデルの性能を向上させつつ、計算コストを抑えることができるんや。

14 **AI初心者** (ｱｳｱｳｳｰ Sacf-/E1x) sage 2024/05/25(土) 21:57:45.11 ID:VztQbNzl
＞＞13
へー、それってどうやって具体的に性能を向上させてるんや？

15 **コンピュータビジョン研究者** (ﾜｯﾁｮｲ 93e1-hy7k) sage 2024/05/25(土) 21:59:01.32 ID:JkLoQwEr
＞＞14
大きなカーネル畳み込みは受容野を広げることで、小さな物体の検出能力を向上させるんや。また、部分的な自己注意機構はグローバルな情報を効率的に取り入れることで、全体の精度を向上させるんやで。

16 **まとめ職人** (ﾜｯﾁｮｲ 8d5f-hgG4) sage 2024/05/25(土) 22:00:35.22 ID:TyLzQbN5
【まとめ】
- YOLOv10は高速で精度の高いオブジェクト検出アルゴリズム
- 非NMSトレーニングの導入で効率的な推論を実現
- デュアルアサインメントと一貫したマッチングメトリックによりNMS不要
- モデル設計の改善で計算の無駄を削減し、性能を向上
- 大きなカーネル畳み込みと部分的な自己注意機構で精度向上

これでみんなもYOLOv10の強さがわかったやろか。

## 参考サイト

https://arxiv.org/abs/2405.14458v1

https://chatgpt.com/g/g-FArNlZonK-ronj-v1-6-1
生成AIを活用し付箋アプリのタスクキルバッチを作成

## はじめに
Windows標準アプリ「付箋」を日々使っているのですが
半角入力が出来なくなったりといったケースが結構な頻度で発生します。
原因としてはIMEの相性の問題だったり、のようですが根本原因は分からず
アプリ再起動すれば解決することは分かっています。
しかし、１日に複数回発生することもあり、その都度タスクマネージャーから強制終了して・・・が不便なのでバッチファイルを作成することを考えました。

本記事では生成AI（claude、chatGPT）の力を借りて実行しながら詰まったところなどをまとめていきます。
Qiita初投稿のため、温かい目で読んでいただければ幸いです。

## 前提条件
本記事を読むにあたって、筆者の前提情報は以下です。
* プライベートでコマンドプロンプトの利用はIPアドレス出力(ipconfig)くらい
* Linux(Ubuntu)の業務経験が数年あるためコマンド入力は苦手ではない
* 生成AIはchatGPTよりclaudeのほうが好み

## タスク終了するために必要な手順
* 実行アプリのプロセスID（PID）を特定
* PIDを指定してプロセスを終了（キル）

### コマンドプロンプト上で実行していく
#### タスクキルコマンド「taskkill」
タスク終了させるコマンドが「taskkill」ということは認識していました。
taskkillを用いたコマンドを生成AI（claude）に質問しました。

1\. プロセスIDを取得
```bat:
rem 入力
>tasklist /fi "imagename eq Microsoft.Notes.exe"
rem 結果
イメージ名          PID
=================== ====
Microsoft.Notes.exe 1234
```
2\. プロセスをキルする
```bat:
rem 入力
>taskkill /pid 1234
rem 結果
成功：PID 1234 のプロセスに強制終了のシグナルを送信します
```

##### PIDを変数の形で保持したい
tasklistではPIDをメモして覚える必要があります。
バッチ実行では変数のような形で保持したいため、その旨を生成AI（claude）に質問します。

#### wmicコマンド
1\. まずは、PIDのみを取得するコマンド

```bat:
rem 入力
>wmic process where "executablepath like '%Microsoft.Notes.exe%'" get processid
rem 結果
ProcessId
1234
```

2\. PIDを変数(notesPid)に格納するコマンド

```bat:
rem 入力
>for /f "tokens=2 delims==" %a in (
'wmic process where "executablepath like '%Microsoft.Notes.exe%'" get processid
/value') do @set notesPid=%a
rem 結果
>echo %notesPid%
1234
```

##### タスクキル実行
PIDを変数として格納できるようになったので、タスクキルを実行してみます。
```bat:
rem 入力
>taskkill /pid %notesPid%
rem 結果
成功：PID 1234 のプロセスに強制終了のシグナルを送信します
```

##### 強制終了されない
成功かと思いきや、タスクマネージャーの状態をみると「中断」となっています。
taskkillでは強制終了ではなく、上記結果のメッセージ通り
終了させるための信号を送り、段階的に終了していくようです。

すぐに強制終了させたいので、生成AI（claude）に質問します。

##### wmicコマンドでのプロセス終了
PIDを取得するために用いたwmicコマンドで終了させるためのコマンドがあったようです
```bat:
rem 入力
>wmic process %notesPid% terminate
rem 結果
(xxx:Win32_Process.Handle="1234")->terminate() を実行しています
メソッドが正しく実行しました。
出力パラメーター
instance of __PARAMETERS
{
        ReturnValue = 0;
};
```

## バッチファイル作成・実行
今までコマンドプロンプト上で実行していましたが、バッチファイルを作成して実行してみます。

1\. バッチファイル作成
```bat:killStickyNotes.bat
for /f "tokens=2 delims==" %a in (
'wmic process where "executablepath like '%Microsoft.Notes.exe%'" get processid
/value') do @set notesPid=%a
wmic process %notesPid% terminate
```

2\. バッチファイル実行
・・・タスクが終了されません。
生成AI（claude）と数回やりとりしても解決しないため
生成AI（chatGPT）に聞いてみます。
終了することができました！

```diff_batchfile
- for /f "tokens=2 delims==" %a in ('wmic process where "executablepath like %Microsoft.Notes.exe%'" get processid /value') do @set notesPid=%a
+ for /f "tokens=2 delims==" %%a in ('wmic process where "executablepath like %%Microsoft.Notes.exe%%'" get processid /value') do @set notesPid=%%a
```

上段がclaude、下段がchatGPT。
%% と二重に書く必要があるのは、コーディングでも詰まるときがあるエスケープシーケンスの類なのか。

## タスク起動
終了することができたので、ついでに起動もしてみます。

```bat:
rem 入力
> start "" "C:\Program Files\WindowsApps\Microsoft.MicrosoftStickyNotes...\Microsoft.Notes.exe"
rem 結果
アクセスが拒否されました。
```

起動できないので、生成AI（claude）と何十回とやりとりした内容が以下（一部誇張）

* Program Files\WindowsAppsフォルダ下の実行ファイルは特別な手順が必要
* PowerShell(PS)なら実行できるかも
* PSのバージョンが古いのでは？
* PSでなんでも実行できるわけではない
* あきらめて！

ということで諦めました。メインの目的（タスクキル）は達成したので、タスク起動は別の記事に・・・（多分書かない

## あとがき
ここまで読んでいただきありがとうございました！
次は技術に関する投稿ができれば、と考えています（現時点でネタはない）
[PhotonFusion2]InvalidOperationException: Error when accessing NetworkObjectStatus. Networked properties can only be accessed when Spawned() has been called.

# 概要
このエラーはPhotonFusion2にて[Networked]属性を付けたネットワークプロパティへSpawnedの前にアクセスした場合などに発生します。
# 本文
例えば以下のようなコードを書いた場合エラーが発生することがあります。
```cs
    [Networked]
    public bool IsGrabbed { get; set; }
    void Update()
    {
        if (IsGrabbed)
        {
            Debug.Log("grabbed.");
        }
    }
```
対象のオブジェクトをNetworkRunner.Spawn()で生成する時、もしくはオブジェクトが内包されたシーンが生成される時に、ちゃんと生成される前にアクセスするとエラーが発生します。

```cs
    [Networked]
    public bool IsGrabbed { get; set; }
    public override void FixedUpdateNetwork()
    {
        base.FixedUpdateNetwork();
        if (IsGrabbed)
        {
            Debug.Log("grabbed.");
        }
    }
```
オブジェクトのnullチェックをするのも一つの手ですが、Update()内でアクセスせずFixedUpdateNetwork()でアクセスするようにするとエラーは出なくなります

# 補足
リンク
[photon公式Discussion](https://forum.photonengine.com/discussion/20615/error-networked-properties-can-only-be-accessed-when-spawned-has-been-called)
最小限で理解するDecoratorパターン

## はじめに
デコレーターパターンを調べていると、抽象クラスが登場し必要以上に複雑化していると感じました。
ここではデコレーターパターンの本質を最小限のサンプルコードを用いて解説したいと思います。

## デコレーターパターンとは
- デコレーター...装飾者
- 装飾対象オブジェクトを飾り枠で装飾することによって機能の拡張ができる
- **飾り枠と装飾対象を同一視する**（同じインターフェースまたは抽象クラスを実装・継承する）ことによって、クライアントは違いを意識することなく使える
- デコレーターの実装クラスは、装飾対象のインスタンスをフィールドにもつ
## メリット
- 既存のオブジェクトに変更を加えず、機能を動的に追加できる
- デコレーターを組み合わせて多様な機能を実現できる
- 責務を分離できる
## デメリット
- デコレーターが多重の場合、処理の順序を理解するにコストがかかる
- デコレーターによっては順序に依存するものがあり、適切な順序を考慮する必要がある
## シンプルな例を試してみる

- お題：プレーンテキストを様々なHTMLタグで装飾してみる
- 登場人物
  - Text.ts...装飾される対象のインターフェース
  - PlainText.ts...Textインターフェースの実装。装飾対象オブジェクト
  - BoldDecorator.ts...bタグ（太字）で装飾する。装飾対象をフィールドにもつ
  - ItalicDecorator.ts...iタグ（斜体）で装飾する。装飾対象をフィールドにもつ
### クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325245/9a9a107d-3eb7-16f7-a20c-2d05b7603995.png)

```ts:main.ts
import { Text } from "./Text";
import { PlainText } from "./PlainText";
import { BoldDecorator } from "./Decorators/BoldDecorator";
import { ItalicDecorator } from './Decorators/ItalicDecorator'

let text: Text = new PlainText("Hello, World!");
console.log("デコレーターなし: " + text.format());
text = new BoldDecorator(text);
console.log('Boldのみ: ' + text.format());
text = new ItalicDecorator(text);
console.log('Italic + Bold: ' + text.format());
```

```ts:Text.ts
export interface Text {
    format(): string;
}
```

```ts:PlainText.ts
import {Text} from "./Text";

export class PlainText implements Text {
    private text: string;
    
    constructor (text: string) {
        this.text = text;
    }

    public format(): string{
        return this.text;
    }
}
```

```ts:Decorators/BoldDecorator.ts
import { Text } from "../Text";

export class BoldDecorator implements Text {
    private component: Text;
    
    constructor(component: Text){
        this.component = component;
    }
    
    public format(): string {
        return `<b>${this.component.format()}</b>`
    }
}
```

```ts:Decorators/ItalicDecorator.ts
import { Text } from "../Text";

export class ItalicDecorator implements Text {
    private component: Text;
    
    constructor(component: Text){
        this.component = component;
    }
    
    public format(): string{
        return `<i>${this.component.format()}</i>`
    }
}
```

実行結果：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325245/2b7591cd-2241-5e45-6fbd-857402cc5cc1.png)

## おわりに
もはや雑なメモになってしまいましたが、個人的に以下のポイントを押さえておくと理解しやすいと感じました。
- デコレーターの実装クラスは装飾対象をフィールドにもつ
- デコレーターと装飾対象は同じインターフェースまたは抽象クラスを実装・継承する
【Python環境構築】Homebrew＋pyenv＋venvでPythonの環境構築（2024.5）

## はじめに
- Pythonプロジェクトを始める環境を作りたい
（Flaskなどを使用し、APIサーバーを立てたい）
- エディターはVSCodeを使う想定
- M1 Macを使用

## 使用したもの
- `Homebrew`
    - pyenvを管理
- `pyenv`
    - python, conda, forgeなどpythonを管理
- `venv`
    - pythonの仮想環境を構築
- `pip`
    - 仮想環境内でのPythonライブラリ（flask, numpy, pandasなど）を管理

## 参考
- 環境構築の手順
    - **[Python｜pyenv、venvでPython開発環境を構築する](https://kazukim-ai.com/pyenv-for-python-environment/)**
- 各ツールの役割
    - **[Pythonの開発環境の3つの観点をおさえよう](https://zenn.dev/os1ma/articles/935f6e653f1052)**
- VSCodeでFlaskプロジェクトを始める
    - [**FlaskをVisual Studio Codeで動かしデバックする**](https://marusankakusikaku.jp/python/library/flask/flask-on-vs-code/)
safariでページ遷移時にsendbeaconメソッドを使ってリクエストが送れていなかった件（javascript）

## やりたかったこと
自分がしたかったととしては、サイト内でユーザーが操作した情報（クリック・どの画像を見た）を取得して、ページ遷移するときにブラウザ側からデータを送信して、情報を保存したかった。


## 行ったこと
まず、ブラウザ上でjavascript（具体的にはVue.js）を使って、変数にユーザーの操作情報を保存しました。
それをページ遷移するときに下記のメソッドを実行して**sendbeacon()メソッド**を使って送信しました。
```
function sendBeacon(data, url) {
     const formData = new FormData();
     Object.keys(data).forEach((key) => {
         if (data[key] !== undefined && data[key] !== "" && data[key] !== null) {
             formData.append(key, data[key]);
         }
     });
     return navigator.sendBeacon(`${url}`, formData);
}
```

## 発生した問題
Chromeでは問題なく送信がされて、DBにデータが保存されているのが確認できたが、safariで試すとDBにデータが保存されていませんでした。

## 原因について
原因について調べてみると可能性としてSafariではsendbeacon()を使ったページ遷移じのリクエスト通信には以下のような制限があるとわかりました。

### ページ遷移時の制限
Safariでは、ページ遷移時にsendBeacon()メソッドが呼び出された場合、そのリクエストがキャンセルされることある。
これは、Safariがページ遷移時にリソースを節約するために行う最適化の一部のようです。

## 解決策
解決策としてはsendbeacon()メソッドではなく**fetch()メソッド**を使用してデータの送信を行うようにしました。
fetch()メソッドには「keepalive」というオプションがあります。
「keepalive」オプションは、ページ終了後のリクエストを許可するのに使用されるもので、trueを設定することで、ページが終了してもリクエストが送信されます。

参照記事:https://developer.mozilla.org/ja/docs/Web/API/fetch#keepalive

```
function sendFetch(data, url) {
     const formData = new FormData();
     Object.keys(data).forEach((key) => {
         if (data[key] !== undefined && data[key] !== "" && data[key] !== null) {
             formData.append(key, data[key]);
         }
     });

    // fetchメソッドを使用してデータを送信
    return fetch(`${url}`, {
        method: "POST",
        body: formData,
        keepalive: true,
    })
}
```
fluentdを使ってログを複数の送信先に送りたい

## やりたいこと
Dockerログを2箇所（今回はCloudWatchとSlack）に送信する。
加えて、CloudWatchにはそのままログを、Slackにはエラーログのみフィルタリングして送信する。

※具体的には、LaravelコンテナのシステムログをDockerログに統合し、それをCloudWatchとSlackそれぞれに送信したいです。ただし、Slackにはエラーログのみ（フィルタリングしたもの）を送信します。

## 構成
docker-composeを使い、LaravelとFluentdのコンテナを立て、LaravelコンテナからFluentdコンテナにログを送信する構成にしました。

## composeファイルを作成
LaravelコンテナとFluentdコンテナを作成し、Laravelコンテナ側でloggingの設定を行い、Fluentdコンテナにログを送るように設定します。
```
# ローカル用のdocker-composeファイル
version: "3.9"
services:
  laravel:
    image: xxxxxxxxxxx（PHP・Laravelがインストールされているイメージ）
    ports:
      - 8080:80
    networks:
      - test
    depends_on:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: "localhost:24224"
        tag: "{{.Name}}"
    tty: true
    environment:
      - TZ=Asia/Tokyo
  fluentd:
    build:
      context: ./
      dockerfile: fluentd/Dockerfile-fluentd
    networks:
      - test
    volumes:
      - ./fluentd/dev-fluentd.conf:/fluentd/etc/fluent.conf
      - ./fluentd/log:/var/log/fluent
    ports:
      - "24224:24224"
networks:
  test:
    driver: bridge
```

## はじめにやろうとしたこと
ポート24224に送信されてきたログをFluentdで受け取り、CloudWatchにそのまま送信し、その後フィルタリングをかけてSlackにはログ内に「error」という文言が含まれているログのみ送信するようにしました。
そのために下記のconfファイルを作成しましたがうまくいきませんでした。
```
# Dockerログ（ログの収集元）
<source>
    @type  forward
    port  24224
</source>

# CloudWatchにログ送信（1つめ）
<match laravel**>
    @type cloudwatch_logs
    region us-west-2
    log_group_name docker-logs
    log_stream_name laravel_log
    auto_create_stream true
    <buffer>
      flush_mode interval
      flush_interval 5s
    </buffer>
</match>

# エラーログのフィルタリング
<filter laravel**>
  @type grep
  <regexp>
    key log
    pattern /error/i
  </regexp>
</filter>

# Slackへログの送信（２つめ）
<match laravel**>
  @type slack
  webhook_url https://hooks.slack.com/xxxx
  flush_interval 5s
  message_keys log
</match>
```

## うまくいかなかったところ
2つのログ送信先に一つのログを送りたかったのですが、matchの仕様上1つめのmatchで送信処理が実行されると、そこで処理が終わってしまい、次のフィルタリングと、もう一方のmatchの送信処理が行われませんでした。

## 解決策
1つめのmatchの処理の中でstoreを使って、処理を2つに分けることにしました。
1つめのstoreではCloudWatchへのログ送信を行い、2つめのstoreではSlackに送信するためのフィルタリングと新たな「slack」というタグ発行を行い、そのタグに対してもう一つのmatchの処理を動かしました。

## fluentdの設定ファイル（完成形）
```
# Dockerログ（ログの収集元）
<source>
    @type  forward
    port  24224
</source>

# ログの送信
<match laravel**>
  @type copy

  # CloudWatchにログ送信
  <store>
    @type cloudwatch_logs
    region us-west-2
    log_group_name docker-logs
    log_stream_name laravel_log
    auto_create_stream true
    <buffer>
      flush_mode interval
      flush_interval 5s
    </buffer>
  </store>

  # エラーログのフィルタリング
  <store>
    @type rewrite_tag_filter
    <rule>
      key log
      pattern /ERROR/
      tag slack
    </rule>
  </store>
</match>

<match slack>
  @type slack
  webhook_url https://hooks.slack.com/xxxx
  flush_interval 5s
  message_keys log
</match>
```
クラメールの連関係数

## クラメールの連関係数
・連関の強さを表す指標
・$\chi^2$を0~1に標準化した値

このクラメールの連関係数は相関係数と同様な考えで、$\chi^2$ではどれくらい強い値なのか比較しづらいため、標準化して0~1で表したものになります。
式にすると以下のようになります。
```math
V = \sqrt\frac{\chi^2}{(min(a, b) -1)N}　
```
※min(a,b)は行数a, 列数bのうち小さい方である


![分割表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/507bca46-b0c7-c4f0-a7fa-c14c465b6e96.png)

$\chi^2$=35.53
a =2
b=2
min(a,b)=2
N=100

```math
V = \sqrt\frac{35.53}{(2 -1)100} = 　0.59
```


**Pythonで実践**

2つのarrayを引数に渡して、クラメール連関係数を返す関数を作成する
```
# クラメールの連関係数を求める関数
def cramers_v(x, y):
    # 分割表を作成
    cont_table = pd.crosstab(x, y)
    # カイ二乗を求める
    chi2 = stats.chi2_contingency(cont_table, correction=False)[0]
    
    min_d = min(cont_table.shape) - 1
    n = len(x)
    
    # クラメールの連関係数
    v = np.sqrt(chi2/(min_d*n))
    
    return v


cramers_v(df['sex'], df['time'])
```
結果
0.20523129613344476
RAGでは「巨人の星」を理解しているのか

# はじめに

LLMを使ったRAGが大流行です。
そこで気になったのがRAGでのLLMは日本語をどの程度理解してくれているのか、です。

日本に住む平均的な人であれば
「私は巨人の星が好きです」
に対して以下の２つの文
①「私は漫画が好きです」
②「私は星が好きです」
があれば、①の方が類似度が高いと判断できるでしょう。

「巨人の星」は「漫画」の一つであり、「巨人の星」の上位概念の一つは「漫画」だからです。

いや、年代によっては「巨人の星」を知らないかもですが。

# intfloat/multilingual-e5-large

では
「私は巨人の星が好きです」
に対して以下の２つの文
①「私は漫画が好きです」
②「私は星が好きです」
の類似度をmultilingual-e5-largeで比較してみます。

## 比較１

「私は巨人の星が好きです」
と
①「私は漫画が好きです」

の比較結果（ベクトルのコサイン類似度）は
```
0.8799271583557129
```
でした。

次に

「私は巨人の星が好きです」
と
②「私は星が好きです」

の比較結果（ベクトルのコサイン類似度）は
```
0.9378243684768677
```
でした。

## 考察１

あらら... multilingual-e5-large ではこの文を正しく比較はできないようです。
multilingual-e5-large では固有名詞を含む文に対しての「類似度」の判定が難しいのだと思われます。

# 対策

固有名詞である「巨人の星」を別の語で置き換えてみましょう。
国語辞書に「巨人の星」の定義は無いと思われるので、みんな大好きWikipediaを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/b9e74aa0-23c0-344b-97a0-85b2659701a6.png)

Wikipediaには以下の文がありました。

```
『巨人の星』（きょじんのほし）は、原作：梶原一騎・作画：川崎のぼるによる日本の漫画作品。
```

この定義を基に

「巨人の星」→「原作：梶原一騎・作画：川崎のぼるによる日本の漫画作品。」

に置き換えて比較してみましょう。（※「星」という文字も消してあります）


## 比較２

「私は（原作：梶原一騎・作画：川崎のぼるによる日本の漫画作品。）が好きです」
と
①「私は漫画が好きです」

の比較結果（ベクトルのコサイン類似度）は
```
0.8921971321105957
```
でした。

次に

「私は（原作：梶原一騎・作画：川崎のぼるによる日本の漫画作品。）が好きです」
と
②「私は星が好きです」

の比較結果（ベクトルのコサイン類似度）は
```
0.8658530712127686
```
でした。

## 考察２

おお、比較の結果が逆転しました。

つまり「固有名詞を含む文を multilingual-e5-largeを用いて類似度を計算すると、固有名詞の意味が反映されていないようであるが、固有名詞を「固有名詞を説明する文」に置き換えると、結構いい感じで類似度を出してくれる可能性が高い」ということではないかと思います。


---

以上。
BlackDuck で Flutter プロジェクトをスキャンする

会社で BlackDuck が使えるようになったので、Flutter のプロジェクトをスキャンしてみました。
その時に設定した最低限の設定を残したいと思います。（最適ではない。まだ入り口。。。）

# 環境
- Synopsys Detect デスクトップアプリを利用
- PC: Macbook Pro / Sonoma 14.4.1
- Android Studio : Jellyfish | 2023.3.1 (Build on April 13, 2024)
- Xcode : v15.3
- Flutter : v3.19.6
- Dart : v3.3.4

# Synopsys Detect の設定
## Synopsys Detect
ツールの設定画面にあります。
### dart
Flutter 関連の設定。[flutter] は Flutter をインストールしているパス。
| 名前 | 値 |
|--|--|
| dart Executable | [flutter]\bin\dart |
| flutter Executable | [flutter]\bin\flutter |

### detector
| 名前 | 値 |
|--|--|
| Detector Accuracy Requirements | NONE |
  * ALL のままだと、`Accuracy Not Met` エラーがでる


## 新規スキャン設定
| 名前 | 値 |
|--|--|
| スキャンのタイプ | ソースディレクトリ |
| スキャンモード | インテリジェント |
| スキャンするディレクトリ | Flutter プロジェクトのルート |

### プロジェクト設定
| 名前 | 値 |
|--|--|
| Project Group Name | 割り当てられたグループ名を使用 |
| Project Name | yaml に書かれているプロジェクト名 |
| Version Name | yaml に書かれているバージョン |

### スキャン設定
| 名前 | 値 |
|--|--|
| Detect Search Depth | 30 |
| Snippet Matching | SNIPPET_MATCHING |
| Signature Scanner Copyright Search | ON |
| Signature Scanner License Search | ON |
| Upload source mode | ON |
| Offline Mode | OFF |

# スキャン結果
私のプロジェクトでは大量にコンポーネントが発見されました！

# まとめ？
今回は初めての BlackDuck で、最初はコンポーネントが見つからなかったり、エラーが出てスキャンが完了しなかったので、とりあえずコンポーネントを見つけつつエラー無く終了するまでの設定を残しました。

今後は大量に出てきたコンポーネントやリスクなどに、どう対応していくか学んでいくことになるかと思います。
先は長い。。。