OmniAICreator/Qiita-1.07M huggingface dataset:
IPアドレスの制限のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)




+ [制限内のIPアドレスからログインした状態で、制限外のIPアドレスからアクセスするとそのまま利用できてしまいます。一度ログアウトすると、ログインできなくなります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajuSm)

:::note
IPアドレスの制限ですが、セッション設定でも可能です。

https://help.salesforce.com/s/articleView?id=000386441&type=1

気になる設定があります。
こっちのセッション設定はどうなっていますか？

ユーザーがログインした IP アドレスをロックするには、[ログイン時の IP アドレスとセッションをロックする] を選択します。IP アドレスをロックすると、未承認ユーザーによる有効なセッションの乗っ取りを防止できます。

ユーザーがアクセス権を取得できる IP アドレスを [ログイン IP アドレスの制限] で定義された IP アドレスのみに制限するには、[すべての要求でログイン IP アドレスの制限を適用] を選択します。

この設定をオンにすると、クライアントアプリケーションからの要求を含め、各ページ要求でログイン IP アドレスの制限が適用されます。この設定をオフにすると、ユーザーがログインする場合にのみログイン IP アドレスの制限が適用されます。この設定は、ログイン IP アドレスが制限されたすべてのユーザープロファイルに影響します

[ログイン IP アドレスの制限] (Contact Edition、Manager Edition、Group Edition、および Professional Edition のみ) で [すべての要求でログイン IP アドレスの制限を適用] を選択した場合、ユーザーのログイン元の IP アドレスの範囲 (両端を含む) を指定します。範囲を指定するには、[新規] をクリックし、開始 IP アドレスと終了 IP アドレスを入力して、開始値と終了値を含む範囲を定義します。

https://help.salesforce.com/s/articleView?id=sf.admin_sessions.htm&type=5
:::


# 関連資料


+ [接続アプリケーションの信頼済み IP 範囲へのアクセス制限](https://qiita.com/Keiji_otsubo/items/198d27723b3ebec7b381)
+ [イベントログファイルのまとめ](https://qiita.com/Keiji_otsubo/items/2735a15e52e56ec0f281)
+ [インスタンスリフレッシュ](https://qiita.com/Keiji_otsubo/items/69b2ea7e8b92e577dd60)
+ [Salesforce でユーザーの確認コードをスキップする](https://qiita.com/Keiji_otsubo/items/2632c51d53203af5f12a)
+ [Certificate-Based Authentication 証明書ベースの認証を使用した組織へのログイン](https://qiita.com/Keiji_otsubo/items/851ebad1ccd51fff401c)
クロス条件の例

[レポートのまとめのまとめ](https://qiita.com/Keiji_otsubo/items/9c883d1e4bf0df549a2a)
[クロス条件 : レポート](https://qiita.com/Keiji_otsubo/items/2d4d0ff245a175650e56)
---------------------

+ [月ごとのアサインされていない従業員の把握](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLcpL)

アサインメンバーオブジェクトが無い従業員が表示出来ればいいですよね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/511adb4f-deb4-b2cb-037a-369acedde677.png)

アサインメンバーの202404が無い場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/51345c50-6c08-5ab7-8ced-f0006e619fed.png)


アサインメンバーの202403が無い場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a2b83fe-1186-faf3-5341-c4229b3d7704.png)


このようなレポートタイプを設定してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/84302bb7-3980-3246-64c7-603ebe65cc53.png)

+ [クロス条件の一つでも該当したら表示しない設定方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqm8F)

:::note
カスタムレポートタイプで契約との関係を「各「A」レコードには関連する「B」レコードが 1 つ以上必要です。」にします。

このようにしておけば、契約の無いAレコードは表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9be894cc-54d3-a858-ebe0-1533abc02c17.png)

この状態でクロス条件を使って、契約終了日が昨日以前で設定すれば、一致しないレコードは表示されなくなります。

A-001 には昨日より前の契約終了日と今日より先の契約終了日のレコードがあります。

A-002 には契約レコードはありません

A-003には今日より先の契約終了日のレコードがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d8879ed7-2f9b-9870-5179-81694c8c44cd.png)

今の設定では以下の部分が実現できてないですね。

→Aレコードは一つでも契約終了日が＜＝昨日に該当しない契約レコードがあるため、レポートには表示させない。

A-001は上記の条件ですが表示されています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8f5ff06e-3827-5b03-a3e9-6b13615d2f98.png)


もし契約オブジェクトが参照関係でなくて主従関係であれば、積み上げ集計項目を契約の終了日が今日以上の件数という形で設定しておくと、先の契約終了日のレコードの件数をカウントすることができます。

よって、この件数がゼロという条件を追加しておけば

→Aレコードは一つでも契約終了日が＜＝昨日に該当しない契約レコードがあるため、レポートには表示させない。

の要件を満たせると思います。

もし、参照関係であれば、スケジュールフローやスケジュールされたApexバッチを使って今日より先の契約終了日の件数をカウントするような処理が必要になると思います。

この部分は英語になりますがDLRSというツールでも可能だと思います。

Guide to Salesforce DLRS (Declarative Lookup Roll-Up Summaries)
https://www.salesforceben.com/guide-to-salesforce-dlrs-declarative-lookup-roll-up-summaries/
:::
コンテナDocker REST APIで立ち上げた際にコンテナ内にインストールされていない罠

DockerコンテナをREST APIで立ち上げようとした際に、UbuntuイメージをベースにnpmやJavaなどのプログラム言語の実行環境を整えたうえで作成しようと思いました。
そして、それらのインストールコマンド自体は、REST API側で用意されています。

```php
        $param = array(
            'Image' => 'ubuntu',
            'Cmd' =>[
                'apt-get update &&' . 
                ' apt-get install -y nodejs npm iptables php' . 
                ' apt-get install -y ruby' .
                ' apt-get install -y default-jre' .
                ' apt-get install -y python3' . 
                ' npm install -g typescript ts-node' .
                'npm start'
            ]
        );

        $url = 'http://host.docker.internal:2375/containers/create';
        $response = Http::withHeaders(['Content-Type' => 'application/json'])
            ->post($url, $param);
```

上記のように、まずImageをubuntuで指定し、Cmdの配列にインストールしたいものを書いていきます。
ここで、Node.js、TypeScript、Ruby、Java、Pythonの環境構築がされています。
これでコンテナが作成されました。
あとは起動させましょう。
ですが、コンテナ内にアクセスしても、nodeJSなどのファイルはインストールされていません。
実行することはできないです。

```
/bin/sh: 1: node: not found
```
となってしまいます。
じゃあもう一度aptを実行してみるかと思っても、実行されません。
なぜなのか

# aptは同時に走らせることはできません。

そもそも何が起きているのかというと、起動した時点でapt-get installが完了していません。
なので時間をかければnodeのバージョンが表示されるようになります。

# 解決策

そもそもリクエストボディで様々なインストールを行っても起動時にはすべてのパッケージなどがインストールされた状態で起動しません。
なので、Dockerfileに記述して、

```Dockerfile
FROM ubuntu:latest

# パッケージをインストールし、apt-getプロセスが完了するまで待つ
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt-get update && \
    apt-get install -y nodejs npm iptables php && \
    apt-get install -y ruby && \
    apt-get install -y default-jre && \
    apt-get install -y python3 && \
    npm install -g typescript ts-node

CMD ["bash"]

```
これを自分オリジナルのUbuntuイメージとしてビルドします。
それをAPIのImageで渡します。

```php
        $param = array(
            'Image' => 'original_ubuntu'
        );
```

ただし、この方法はローカルでビルドしてください。

以上が解決方法です。
ありがとうございました。
IsaacSimでロボット走行用の2D地図を作ってみる

# 1. はじめに
[Ubunutu22.04の環境下においてIsaac Sim+ROS2を試そうとしてハマったところ](https://qiita.com/bebebefu/items/a89694659e650665e5db)の記事においてUbuntu22.04の環境下においてIsaac Sim+ROS2の環境を構築しました。その記事おいては、ロボットに回転の指示をだして遠隔操作をしてみましたが、せっかくROS2が入っているので自律走行させてみたいと考えています。ただいきなり自律走行させるというのはハードルが高いため、まずはロボット走行用の2D地図を作成しようとしたのが今回の記事の内容になります。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
- ROS2: Humble
- Isaac Sim: 2023.1.1
- Nvidia Driver: 525.147.05 (525.85.05が推奨されていますが、私の環境ではインストールできませんでした)

# 3. 手順
Zennに投稿されているhardbakeさんの以下の記事（[[1]](#参考記事やサイト)）を参考に進めました。

https://zenn.dev/hardbake/articles/f9e49ee5357f3f

## 3.1 IsaacSimの起動とサンプルファイルの読み込み
[Ubunutu22.04の環境下においてIsaac Sim+ROS2を試そうとしてハマったところ](https://qiita.com/bebebefu/items/a89694659e650665e5db)（[[2]](#参考記事やサイト)）で記載した手順でIsaac Simを起動して、サンプルファイルの「omniverse://localhost/NVIDIA/Assets/Isaac/2022.2.1/Isaac/Samples/ROS2/Scenario/carter_warehouse_apriltags_worker.usd」を読み込みます。

読み込んだサンプルファイルは以下の図ように、赤枠で囲んだところにcarter_v1.usdがあり、傍らにはフォークリフトが2台と作業員2名がおり、少し遠くには棚とは別のところにパレットに積まれた箱があることが確認できます。

![サンプルファイル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/616d9b8b-58a4-b122-7e94-e3c128d7b3dd.png)

![サンプルファイル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/73e8f2b9-2937-1242-1cb1-6cbbc0333d45.png)

## 3.2 Mapの作成
[[1]](#参考記事やサイト)に記載を参考に、以下の手順を踏みました（ほとんどそのままの手順です）。

1.　画面上部のメニューバーからIsaac Utils -> Occupancy Mapを選択
2.　画面下部に表示されるOccupancy Mapの画面において、基準の座標となる"Origin"の座標を設定。本記事では(0,0,0.8)に設定しました。
3.　画面下部に表示されるOccupancy Mapの画面における"Upper Bound"のZ座標を本記事では1.0に設定しました。
4.　画面右のウィンドウにおいて、"warehouse_with_folklifts"、"Warehouse_Extras"、"Worker"、"Worker_2"を選択し、画面下部に表示されるOccupancy Mapの画面において、"Positioning"の"BOUND SELECTION"ボタンを押します。　
5.　画面下部に表示されるOccupancy Mapの画面における"CALUCULATION"ボタンを押します。
6.　画面下部に表示されるOccupancy Mapの画面における"VISUALIZE MAP"を押すと2Dマップの画像が以下のように表示されました。

![Screenshot from 2024-04-29 10-19-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/788bc461-c87e-0798-56d8-73d36eb85625.png)

作成された地図を見ると、地図の右側には棚に積まれた箱とフォークリフトがくっついた形で障害物として表示されているのが見て取れます。そして右下のところには、棚からちょっと離れたとこでパレットに積まれた箱も障害物として表示されていると考えられますが、ちょっと実物よりは小さく表示されているようにも感じます。また左側には棚から少し離れたところにあるフォークリフトも障害物として表示されています。ただworkerは何回地図を生成しても障害物としては表示されませんでした。

# 4. まとめ
[[1]](#参考記事やサイト)の記事にある手順で、私の環境でもロボット走行用の2D地図を作成できることを確認できました。ここで作成した地図を用いたロボット自律走行もできるらしいので、次回以降それを試してみたいと思います。

# 参考サイト
[1][Isaac SimでROSで使用するための2Dマップを作成する](https://zenn.dev/hardbake/articles/f9e49ee5357f3f)
[2][Ubunutu22.04の環境下においてIsaac Sim+ROS2を試そうとしてハマったところ](https://qiita.com/bebebefu/items/a89694659e650665e5db)

# 関連記事
[IsaacSimのROS2 Navigationを試してみる](https://qiita.com/bebebefu/items/d2437abba62493daf08e)　：ここで作成した地図による自律走行をしてみました。
【GAS】tsからjsファイルにバンドルしたコードをGASのエディタ上でデバッグできる状態に修正する

<!-- Qiitaの記事を書く -->

「TypeScript+clasp+esbuild」でGASのローカル開発を便利にしたものの、そのままではデプロイした後にGASのエディタでデバッグすることができないため、
GASのエディタに反映されるタイミングで、デバッグできる状態にする方法を紹介します。

## プロジェクト構成

```
.
├── dist/
│    ├── appsscript.json
│    └── main.js //バンドルされたファイル
├── src/
│    ├── main.ts
│    └── ... //他のtsファイル
├── .clasp.json
├── esbuild.js
├── package.json
├── tsconfig.json
└── updateFileContents.js //今回紹介するファイル
```

環境構築は以下の記事を参考にしています。
https://zenn.dev/funteractiveinc/articles/776b5812833475

## 問題点

バンドルされたmain.jsが以下の状態となっているため、そのままではGASのエディタでデバッグすることができません。

※バンドルとは、複数のファイルやモジュールを一つのファイルにまとめるプロセスのことを指します。

```javascript:main.js
let global = this;

"use strict";
(() => {
 // ここにmain.tsの内容がバンドルされる
})();
```

:::note warn
`(() => {`と`})();`が自動で付与されてしまう
:::

## 解決策1（手動修正）

GASのエディタ上で、`(() => {`と`})();`を削除する。

:::note warn
デプロイの度に手動で修正する必要があるため、めんどくさい😇
:::

## 解決策2（自動修正）

バンドル後に自動で`(() => {`と`})();`を削除し、その状態でデプロイする。

### 設定方法

以下のnodeファイルを作成する。（Copilotに生成してもらった）
※削除するだけだとインデントが気持ち悪いので修正してます。

```javascript:updateFileContents.js
import { promises as fs } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const filePath = join(__dirname, './dist/main.js');

async function updateFileContents() {
  try {
    let data = await fs.readFile(filePath, 'utf8');
    let lines = data.split('\n');

    const useStrictIndex = lines.findIndex(line => line.includes('"use strict";'));
    if (useStrictIndex !== -1 && lines[useStrictIndex + 1].trim() === '(() => {') {
      lines.splice(useStrictIndex + 1, 1); // "use strict"; の1行下の `(() => {` を削除
    } else {
      throw new Error('Could not find "(() => {" after "use strict";');
    }

    if (lines[lines.length - 2].trim() === '})();') {
      lines.splice(lines.length - 2, 1); // 下から2行目の `})();` を削除
    } else {
      throw new Error('Could not find "})();"" before the last line');
    }

    // 各行のインデントを修正
    let modifiedData = lines.map(line => line.replace(/^ {2}/, '')).join('\n');

    await fs.writeFile(filePath, modifiedData, 'utf8');
    console.log('File has been modified successfully.');
  } catch (err) {
    console.error('Error modifying the file:', err);
  }
}

updateFileContents();
```

で、以下の順でコマンドを実行すればOK

```
node esbuild.js
node updateFileContents.js
npm run push
```

**▼tips**
以下のようにしておけば、`npm run deploy`をコマンド実行するだけで上記の3つのコマンドが実行されます。

```json:package.json
{
  "scripts": {
    "build": "node esbuild.js",
    "push": "clasp push",
    "fix": "node updateFileContents.js",
    "deploy": "npm run build && npm run fix && npm run push",
  }
}
```
Javaで「ソースファイルのエンコーディングを指定してコンパイルする」の動作を確認してみた

# 概要

Javaで「ソースファイルのエンコーディングを指定してコンパイルする」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/encoding/index2.html

# 実装

以下のファイルを作成しました。
```JSample2_1.java
class JSample2_1{
  public static void main(String[] args){
    System.out.println("こんにちは");
  }
}
```

以下のコマンドを実行しました。
```
$ javac -encoding UTF8 JSample2_1.java 
$ java JSample2_1 
こんにちは
```

# まとめ

何かの役に立てばと。
ソーシャル メディアの状況をナビゲートする: SMMpanelReview のガイド

現在のデジタル時代では、ソーシャルメディアで強力な存在感を持つことが個人と企業の両方にとって非常に重要です。 ソーシャル メディア マーケティング (SMM) は、対象となる消費者とつながり、ブランド認知を構築し、会話を刺激するための強力な手段として発展しました。 ただし、オプションが豊富にあるため、理想的な SMM パネルを見つけるのは難しい場合があります。 SMMpanelReviews はそのニーズを満たします。 この投稿では、SMMpanelReviews を使用して理想的な SMM パネルを簡単に見つける方法を見ていきます。
https://smmpanelreviews.org/
![social-media-marketing-guide.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783472/f4571992-958f-16dd-3f77-89eebe9e5263.jpeg)


SMM パネルの認識:

SMMpanelReviews について説明する前に、SMM パネルとは何かを理解することが重要です。 SMM パネルは、ユーザーのソーシャル メディア プロフィールを向上させるために、「いいね！」、フォロー、コメントなどを提供するオンライン サービスです。 Facebook、Instagram、Twitter、YouTube、その他のプラットフォームでオンラインでの存在感やエンゲージメントを高めたいと考えている個人、インフルエンサー、企業、組織は、これらのパネルで対応します。

最適な SMM パネルを選択するのはどのくらい難しいですか?
SMM パネルは広く入手可能であるため、適切な SMM パネルを選択するのは難しい場合があります。 コスト、信頼性、サービス品質、顧客サポートなど、多くの変数が関係します。 さらに、選択肢が圧倒的に多いため、パネルの有効性と信頼性を評価することは困難です。

SMMpanelReviewsをここに置きます。

SMMpanelReviews のおかげで、ソーシャル メディア マーケティングはかつてないものになりました。 最新の SMM パネルの完全なディレクトリとして機能することで、顧客が十分な情報に基づいた選択を行えるようにするための大量の情報を提供します。 SMMpanelReviews は次のように手順を合理化します。

最新の更新: SMMpanelReviews は、ディレクトリを最新の SMM パネルで定期的に更新することで、消費者が市場で入手可能な最新の製品に確実にアクセスできるようにしています。
評価と評価: 読者は、他の顧客が残した本物の評価を閲覧することができ、さまざまな SMM パネルの信頼性と有効性に関する洞察に富んだ情報が得られます。 また、自分の経験を評価することもあり、他の人が十分な情報に基づいた決定を下すのに役立ちます。
オプション: SMMpanelReviews は単なるリスト以上のものを提供します。 代替手段も提供します。 特定の SMM パネルが要件に適していない場合は、プラットフォームが提案する他のオプションを検討することもできます。

SMMpanelReviews の使用:

SMMpanelReviews は使いやすく、簡単です。

参照: まず、SMM パネル ディレクトリを参照します。 提供されるサービスやプラットフォームの互換性など、ニーズに応じて選択肢を並べ替えます。
レビューを調べる: 実際のユーザーが投稿したレビューを調べます。 彼らの経験、喜びの程度、そして彼らが述べた可能性のある否定的な点に注意してください。
パネルを評価する: パネルを使用した後にパネルについてどう感じたかを示す評価を提供します。 あなたの意見は他の人が選択をする際に役立つかもしれません。
オプションを検討してください: 特定のパネルが満足できない場合でも、心配する必要はありません。 要件をよりよく満たす代替選択肢が SMMpanelReviews によって提案されます。
CSSアニメーション　keyframesの実装

# Keyframesを使った基本的なアニメーションの作り方

## はじめに

今回は、私がコーディングを学んできて「こういうのがやってみたかった！」と思えた"Keyframes"を使って要素に動きを付ける基本的な手法を学びます。

## 準備

まずはじめに、ブラウザ上で動作するシンプルなHTMLファイルを作成します。
今回は以下のコードを使用します。

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Keyframes Animation</title>
  <style>
    .box {
      width: 100px;
      height: 100px;
      background-color: red;
      animation-name: slidebox;
      animation-duration: 2s;
	  animation-timing-function: ease-in-out;
    }

    @keyframes slidebox {
            0% {
                transform: translateX(0);
            }

            50% {
                transform: translateX(200%);
            }

            100% {
                transform: translateX(0);
            }
        }
  </style>
</head>
<body>
  <div class="box"></div>
</body>
</html> 
```
このコードでは、赤い正方形が左から右へ200px移動するアニメーションを定義しています。

# 基本的なKeyframesの使い方

上記のコードで使われている@keyframesはKeyframesを定義するためのCSSルールです。moveという名前のKeyframesを定義しています。transformプロパティを使って、要素の位置を変化させています。

0%と100%はアニメーションの開始と終了時のステータスを示しており、50%はdurationで指定した秒数の、半分経過時点でのステータスを示しています。ここではtranslateX()を使って要素を水平方向に移動させています。

# イージングの追加

アニメーションにイージングを追加することで、動きがより自然になります。例えば、ease-in-outというイージングを使用することで、アニメーションがゆっくり始まり、ゆっくり終わるようになります。

```css
animation-timing-function: ease-in-out;
```

このように指定することで、アニメーションのスピードにも指示が出せます。


# まとめ

Keyframesを使った基本的なアニメーションの作り方を学びました。自分のコーディングで要素を動かすことが出来るとワクワクしますよね！
慣れてしまうと意外と簡単にできてしまうので、ぜひ今回用意したboxにいろんな動作を行わせてみてください:bulb:

下記URLは私が参考にさせていただいた記事です！
より詳しく種類が記述されているので、興味がわいた方はぜひご活用いただければと思います。

https://www.otwo.jp/blog/css_animation/
def reverseGPIO():

＜python関数例文＞
def reverseGPIO():
　　if led.value():
　　　　led.value(0)
　　else:
　　　　led.value(1)

＜解説＞
led.value()　=　None　
　　　　　　=  0 (上記例文ではLEDランプ消灯)
　　　　　　=  0.0
　　　　　　=  ''
　　　　　　=  []
　　　　　　=  ()
　　　　　　=  {}
　　　　　　=  set()
上記の場合、全てif False：とみなされます。

＜結果１＞
led.value() = 0 (LEDランプ消灯)の場合、
if False となり、
else:
　　led.value(1) (LEDランプ点灯)
が実行されます。

＜結果２＞
led.value() = 1 (LEDランプ点灯)の場合、
if True となり、
　　led.value(0) (LEDランプ消灯)
が実行されます。
力技で精度を良くする方法論

これは私が大学院卒業間際にたまたま見つけたSIGNATEというサイトでビギナー限定コンペなる物を発見した時にどうやって精度を上げようかと考えたときに作った考えです(5日目に思いつき実装してビギナーからIntermediateに昇格しました)。
タイトルの通り力技で、ループさせて毎回訓練データとテストデータを変えて精度のよさそうな機械学習アルゴリズムを何個か学習させてモデルと精度をリストに格納して精度の良かった上位何個かのモデルで予測させます。
# コーディング
## ライブラリのインポート
ここでは勾配ブースティング決定木とSVM(RBFカーネル)とランダムフォレストを使用します。
最後の精度の評価は正解率だけでなく再現率、適合率、F1全て見ます。
```Python3
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split as tts
from sklearn.metrics import classification_report
import pandas as pd
import scipy.stats as stats
```
## データの読み込み
ここではワインデータを使用します。
```Python3
df = pd.read_csv("wine.csv")
df.head()
```

## 説明変数と目的変数分けとリアルデータと訓練データ分け
リアルデータを用いて最後は予測します。
```Python3
y = df["Wine"]
x = df.drop("Wine", axis=1)
x_val, x_real, y_val, y_real = tts(x, y, test_size=0.3, random_state=100)
```
random_stateは後のfor文と重ならないように100に設定します。
またvalと付けている訓練データをさらに分割してここからモデルの構築と評価をします。

## ループして学習
modelsというモデルと精度を格納するリストを作成して勾配ブースティング決定木とSVMとランダムフォレストを使います。ここでrandom_stateはfor文のiを使って毎回訓練データとテストデータを変えます。
```Python3
models = []
for i in range(100):
    x_train, x_test, y_train, y_test = tts(x_val, y_val, test_size=0.3, random_state=i)
    model1 = GradientBoostingClassifier()
    model1.fit(x_train, y_train)
    model2 = SVC()
    model2.fit(x_train, y_train)
    model3 = RandomForestClassifier()
    model3.fit(x_train, y_train)
    models.append([model1, model1.score(x_test, y_test)])
    models.append([model2, model2.score(x_test, y_test)])
    models.append([model3, model3.score(x_test, y_test)])
```

## 上位三個のモデル
```Python3
models = sorted(models, key=lambda x : x[1], reverse=True)
print(models[0][1], models[1][1], models[2][1])
```
```
1.0 1.0 1.0
```
上位3個とも全て100%正解しているみたいです(心強い)。

## 上位三個のモデルを使った予測
予測では多値問題であるため最頻値を使います。2値問題の場合は中央値でも大丈夫ですが、万が一同じ数の陽性と陰性があった場合0.5になるので使うモデルの数は奇数個にしましょう。
```Python3
y_pred1 = models[0][0].predict(x_real)
y_pred2 = models[1][0].predict(x_real)
y_pred3 = models[2][0].predict(x_real)
y_pred = []
for i in range(len(y_pred1)):
    y_pred.append(stats.mode([y_pred1[i], y_pred2[i], y_pred3[i]])[0])
print(classification_report(y_real, y_pred))
```
```
              precision    recall  f1-score   support

           1       1.00      1.00      1.00        14
           2       1.00      1.00      1.00        19
           3       1.00      1.00      1.00        21

    accuracy                           1.00        54
   macro avg       1.00      1.00      1.00        54
weighted avg       1.00      1.00      1.00        54
```
見事に全部的中しました。

# まとめ
数の暴力すごい！
ただこれ標準化してないので多分上位3つは勾配ブースティング決定木かランダムフォレストでしょうね。
useContextを使っていないのにGenerating static pages (0/4)  [=   ]TypeError: Cannot read properties of null (reading 'useContext')がでた

## Generating static pages (0/4)  [=   ]TypeError: Cannot read properties of null (reading 'useContext')がでた
## 男もすなるQiitaといふものを、女もしてみむとてするなり
こんにちは。プログラム初心者のエラー解決日記です。
今回はタイトル通りuseContextを使っていないのにGenerating static pages (0/4)  [=   ]TypeError: Cannot read properties of null (reading 'useContext')
がでたので自分の試したことと最終的に解決した方法を残しておきます。

### 環境
React ^18
next 14.2.1
tailwindcss

### やったこと
・npmの依存関係の見直し
・ディレクトリ構造の見直し
・npm run buildのかわりにnext buildでの実行

### 直った方法
ディレクトリを置く場所を変えたら直りました。
自分は ~/AP/Javascript/　ディレクトリ直下においていたのですが試しにDownloadディレクトリ直下においたらエラーが起きなくなりました。
正直根本的解決にはなっていないのでわかる方いらっしゃったらお願いします・・・
初めての投稿なのでこうしたら見やすいよ！やもう少し環境について詳しく書いたほうがいいとこあるよ！などのアドバイスも大歓迎です！
Golang 基礎 - 環境設定からプロジェクト管理まで


### Golangのインストールと環境設定

Golang（通称Go）は、効率的なコンパイル言語で、並行処理やネットワークサービスの開発に適しています。まず、[Golangの公式サイト](https://golang.org/dl/)から対応するOSに合わせてインストーラをダウンロードし、インストールします。インストール後は、コマンドラインで`go version`を実行して、インストールが正しく完了したか確認しましょう。

Macユーザーの場合、Goのバイナリへのパスをシェルの設定ファイルに追加する必要があります：

```bash
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bash_profile
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.zshrc
```

### プロジェクトの初期設定

プロジェクトディレクトリを作成し、そこでGoのモジュールを初期化します：

```bash
mkdir go-test
cd go-test
go mod init go-test
```

#### モジュールとは何か？

Goのモジュールは、一連のパッケージを含むプロジェクトの単位です。`go mod init [name]`コマンドを実行することで、そのプロジェクトのrootとなり、`go.mod`ファイルが生成されます。このファイルには、プロジェクト名と使用しているGoのバージョンが記述されます。また、外部パッケージの依存関係も管理されます。

### Visual Studio CodeでのGo開発

Visual Studio Code（VSCode）でGo言語を効率良く扱うには、以下の設定を`settings.json`に追加します：

```json
"[go]": {
   "editor.defaultFormatter": "golang.go",
   "editor.formatOnSave": true
}
```

これにより、ファイルを保存する度に自動的にコードが整形されます。

### 静的解析ツール

`staticcheck`はGoのコードに対する静的解析ツールで、コードの品質やパフォーマンス問題を指摘してくれます。詳細なルールは[staticcheckの公式ドキュメント](https://staticcheck.io/docs/)を参照してください。

### シンプルなプログラムの作成

`main.go`ファイルを作成し、基本的なプログラムを記述してみましょう：

```go
package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}
```

このプログラムは`go run main.go`で実行可能です。また、バイナリファイルとしてビルドする場合は`go build -o app main.go`を使用します。

### 外部パッケージの利用

外部のパッケージを利用する例として、`.env`ファイルから環境変数を読み込む`godotenv`パッケージを使ってみましょう：

```go
package main

import (
    "fmt"
    "os"
    "github.com/joho/godotenv"
)

func main() {
    godotenv.Load()
    fmt.Println(os.Getenv("GO_ENV"))
}
```

もしパッケージが見つからない場合（エディタに赤線が表示されるなど）、`go mod tidy`を実行して依存関係を解決し、必要なパッケージをインストールします。このコマンドは`go.mod`と

`go.sum`を更新します。`go.sum`ファイルは、ダウンロードされた依存関係のチェックサムを保持し、データの改竄を防ぎます。
128bitセキュリティのメモ

# 128ビットセキュリティ

## 128ビットセキュリティとは
　異なる技術分類の暗号アルゴリズムについて同程度の安全性を持つかどうかを判断する目安として、“ビットセキュリティ（等価安全性ということもある）”という指標がある。
　具体的には、評価対象とする暗号アルゴリズムに対してもっとも効率的な攻撃手法を用いたときに、どの程度の計算量があれば解読できるか（解読計算量[ 13]）で表現され、鍵長[ 14]とは別に求められる。表記上、解読計算量が 2x である場合に“x ビットセキュリティ”という。例えば、共通鍵暗号においては、全数探索する際の鍵空間の大きさで 2x（x は共通鍵のビット長）、ハッシュ関数の例としては、一方向性で 2x、衝突困難性で 2(x/2)（x はハッシュ長）が解読計算量の（最大）理論値である。

　“ビットセキュリティ”による評価では、技術分類に関わらず、どの暗号アルゴリズムであっても、解読計算量が大きければ安全性が高く、逆に小さければ安全性が低い。また、解読計算量が実現可能と考えられる計算量を大幅に上回っていれば、少なくとも現在知られているような攻撃手法ではその暗号アルゴリズムを破ることは現実的に不可能であると予測される。
　そこで、暗号アルゴリズムの選択においては、“x ビットセキュリティ”の“x ビット”に着目して、長期的な利用期間の目安とする使い方ができる。

https://www.cryptrec.go.jp/report/cryptrec-gl-3001-3.0.1.pdf

## とりあえず覚えておいた方がいい表
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174900/78ce0668-b496-81a8-e8af-522547bb3aaf.png)

## エンジニアとして意識しておいた方がいい事
今後の新規構築は128 ビットセキュリティ以上のアルゴリズムで作成した方がいい。
※RSA-2048は特に注意

表にはないけど、RSAでの128ビット相当はRSA-3072になる。
同じ署名系だとECDSA(ECC)(楕円曲線)ならEDCSA-256。
【VPN Server】Proxmox LXC Container を使って IKEv2 接続したい

# はじめに
ふと自宅で VPN サーバーを建てようと思った時に、SoftEther VPN を使ったら Android の標準機能だけで VPN 接続ができなかった。どうやら Android 12 から L2TP/IPsec 接続が作成できなくなったらしい。  
そこで、調べたところ IKEv2 接続できるサーバーを建てればいいらしいということに行きついたので、やった工程のメモを記す。

自分の環境では Proxmox + LXC コンテナだったので、少し設定が必要だった。その設定も書いてみる。

# 環境
- Proxmox Virtual Environment 7.4-17
- ubuntu-22.04-standard_22.04-1_amd64
- Android 14

# 使用するサーバー構築プログラム
ほとんどこの手順に沿ってコマンド実行するだけ。

https://github.com/hwdsl2/setup-ipsec-vpn/tree/master

# LXC コンテナ環境で構築した際問題が起きた話
LXC コンテナでこの構築コマンドを実行すると、
`Failed to start Internet Key Exchange (IKE) Protocol Daemon for IPsec.`
というエラーが生じた。これと同じ症例の人が Issue で質問していて、そこに解決策があったのでそれを含めた構築手順を書く。

https://github.com/hwdsl2/setup-ipsec-vpn/issues/1014

# 構築開始
## Container 作成
いつも通りコンテナを作成するが、ここで一つ設定しなければいけない。
画像のとおり、`Unprivileged container` を切る必要がある。
後はご自由にコンテナ作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/7214bb1b-34a4-ac1d-ce5a-dc961552f015.png)

コンテナができたら、起動する前に以下の設定をコンテナのファイルに追記する。
ここでは `/etc/pve/lxc/101.conf` ファイルを例として挙げているが、コンテナの番号に応じてファイル名を変えましょう。
```/etc/pve/lxc/101.conf
lxc.cgroup.devices.allow: c 108:0 rwm
lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file
```

## サーバー構築プログラムを実行する
GitHub にも書いてある通り、このコマンドを実行することで VPN サーバーの構築が完了する。
ここで後で使う証明書ファイル (`vpnuser.p12`) が発行される。
また、`Server IP` も出力されるのでメモしておくこと。
```sh
wget https://get.vpnsetup.net -O vpn.sh && sudo sh vpn.sh
```

## ポート開放
ここで構築されるプログラムでは `UDP 500` と `UDP 4500` を使用するので、開ける必要がある。
今回は、Proxmox の管理画面から Firewall の設定と、ルーターのポートマッピング設定をすることでポート開放を行った。環境によってポート開放野やり方は違うと思うので割愛。

## おわり
ここまでくればすでに VPN サーバーとしての機能を果たすことができる。次に Android 12 以降のデバイスで、組み込みの VPN を使用して接続できるかを検証する。

# Android 端末で検証
手順はほぼ GitHub のガイド通り。

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#android

## 証明書 (`.p12`) をインストールする
1. サーバー構築プログラムを実行する」で生成された `.p12` ファイルを Android 端末に安全な方法で転送する。
1. 設定アプリを開く。
1. 「証明書」と検索し、「VPN とアプリユーザー証明書」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/c588130d-2b64-57ed-1ec5-9b7db6d9a3b2.png)
1. 先ほど転送したファイルを選択し、好きな名前を付けて端末にインストールする。

## VPN の設定をする
1. 「VPN」と検索し「VPN」を開く。
1. 右下の + ボタンから「VPN プロファイルの編集」を行う。
    - 名前: プロファイル名 (自由)
    - タイプ: `IKEv2/IPSec RSA`
    - サーバーアドレス: `Server IP` (メモしたやつ)
    - IPSec ID: `empty` などの適当な文字列 (バグで何か入力しないと保存できない)
    - IPSec ユーザー証明書: vpnclient (インストールした証明書名)
    - IPSec CA 証明書: vpnclient (インストールした証明書名)
    - IPSec サーバー証明書: `(サーバーから受信)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/58253f50-f8ff-c2d9-7066-675ff1bdfe35.png)
1. 保存すれば接続できるようになる！

# おわり
これで Android の標準機能で VPN が接続できるサーバーを建てられた！
他の端末の手順も GitHub に書いてあるので Android 以外でもぜひお試しあれ～

# 参考文献
https://qiita.com/silane1001/items/a96ce9300ed502954d07
【暗号化】E2EEってなんぞや


どうもこんにちは。

あかつきゆいとです。

今回は(逸般のエンジニアたちが)最近よく耳にするE2EEについて話していこうかなと思います。

## E2EEとは一言で

> エンドツーエンド暗号化は、通信経路の末端でメッセージの暗号化・復号を行うことで、通信経路上の第三者からのメッセージの盗聴・改ざんを防ぐ通信方式である。
by Wikipedia

ひとことで言うとこうなります。
流石にわからないと思うので、噛み砕いていきましょう。

## 端末縛りの暗号化である

**端末縛り** というのがどういうことか。

E2EEではデータを送信した端末とデータを受け取った端末以外では暗号を復号できず、読み取ることができません。

End to End(機械から機械へ)なので、当たり前ですね。

## 公開鍵暗号

どういう原理でそれが成り立っているのかを説明しましょう。

それを理解するには、公開鍵と秘密鍵の話がとても重要になってきます。

### 公開鍵

公開鍵は、みんなに公開する鍵です。
鍵なのに鍵なのに公開して良いって不思議ですよね？

この鍵は暗号化することだけできます。

- この鍵を使って暗号化はできますが、 **復号はできません** 。

この点、とても重要です。

### 秘密鍵

この鍵は、 **他の人に絶対に見せてはいけない** 鍵です。

この鍵は基本的に復号することだけできます。

この鍵で、暗号化することは **できません** 。

そもそも、この鍵の機能はそれぞれどういうものかをまず話さないといけませんね。

### 暗号化

暗号化はその名の通り、平文(暗号化前の文章)を暗号化して、読めなくすることです。

### 復号

復号は暗号文から平文を導くことです。

### 例

AliceがBobに暗号化されたメッセージを送信したいと考えました。

1. Aliceが公開鍵をBobに渡す
2. BobはAliceの公開鍵で暗号化する
3. AliceはBobから受け取った暗号文を秘密鍵で復号する

秘密鍵でしか復号できないから途中で暗号文と公開鍵が盗まれても大丈夫ですね。
秘密は守られます。

## E2EEでは

話を戻すと、E2EEでは、この公開鍵暗号の仕組みを使用して、各端末に秘密鍵を保持するので、その秘密鍵を持っている端末でしか、復号できないということです。

なので、End 2 End Encryptなのです。

近年では、

- Keybase(公開鍵基盤でもある)
- Telegram
- Signal
- LINE Letter Seeling(LINE/完全なE2EEではない)

といったところで使われています。

## 秘密鍵と公開鍵の秘密

なぜ、公開鍵で復号できないのか、それは、RSAやDSAなどといった暗号化アルゴリズムの話が出てきます。

それはそれでまた記事として書き上げますので、それまで少々お待ちいただければと思います。

## 結論

E2EEは真面目に安全なんで、みんな使いましょう！！
Google ColabでOllamaを使用して話題のCommand R+を動かしてみた

# はじめに
- この記事では、Ollamaを介してGoogle ColabでCommand R+を使用し、動作させる方法を解説します。
- 結論からいうと**ハードウェアアクセラレータをTPU v2を選択**したところ、なんとか動かせた感じでした。

## Ollamaとは
Ollamaは、LLama3やLLava、vicunaやPhiなどのオープンに公開されているモデルを手元のPCやサーバーで動かすことの出来るツールです。

https://ollama.com/

# Command R+とは
Command R+は、Cohereの大規模言語モデルです。数十億のパラメータを持つこのモデルは、自然言語処理やテキスト生成において優れた能力を発揮します。Commandモデルの強化版として、より複雑なタスクを処理し、精巧で正確な応答を生成します。長文要約、会話、創作など多様なタスクをこなし、その柔軟性とパフォーマンスの高さで、言語処理の分野で新たな地平を開いています。

https://cohere.com/

# 前提条件
- Google Colabのアカウントを登録している
- Goolge ColabのProを購読している

# デモの手順

## ノートブックを新規作成する
Google ドライブにご自身のアカウントでログインしてGoogle Colabノートブックを作成します。

## ランタイムタイプを変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a7a9c028-1b4f-12be-5eb1-3804dcce609f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/2708ad55-5e74-4e27-56a9-0dca1216a983.png)

- TPU v2を選択する。時間あたりにコンピューティング ユニット数が消費されるので、そこは注意してください。
- 他のGPU(A100 GPU, L4 GPUなど)を設定したが、以下のエラーになってしまった。
ggml_assert: /go/src/github.com/ollama/ollama/llm/llama.cpp/ggml-cuda.cu:60: !"cuda error"

## ノートブックに次のコードを追加して実行する。

### ollamaをダウンロードしてインストールする


```
!curl https://ollama.ai/install.sh | sh

!echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
!sudo apt-get update && sudo apt-get install -y cuda-drivers

import os

# Set LD_LIBRARY_PATH so the system NVIDIA library
os.environ.update({'LD_LIBRARY_PATH': '/usr/lib64-nvidia'})
```
### ollamaサーバを起動して、command-r-plusをpullする
```
!nohup ollama serve &
!ollama pull command-r-plus
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/d76eb4de-4d0b-d403-3251-062fb26afb98.png)

command-r-plusをpullするときに59GBのダウンロードするので、数十分の時間がかかるので注意してください。


### ollamaのpythonのライブラリからチャットして、レスポンスを出力する

```
import ollama
response = ollama.chat(model='command-r-plus:latest', messages=[
  {
    'role': 'user',
    'content': 'Why is the sky blue?',
  },
])
print(response['message']['content'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9767e23c-4835-7f2c-40de-8e506d818d18.png)

ここでも結果が出力されるまで、このときの状況では3分以上時間がかかりました。

# まとめ
- なんとか、動作させることはできたのですが、コンピューティング ユニット数の消費の状況を考えると、この環境では、他のLLMモデルで活用するほうがよさそうでした。

- Goolge Colabで**課金してみたがOllamaを使用してCommand R+を満足に動作させることはできなかった**。パラメータ数のすくないモデルで試すこととする。

# 感想
- Command R+を快適に試したいのであれば、まずは**Cohereの公式サイトのPlaygroudやAPI登録して、試すことをオススメする**。サクサクレスポンスが返ってきて、本質的に実力を体感できる。APIが有料になったときの、値段にもよるだろうが、あの精度、スピード感で使えるのは、素晴らしい！

- ローカルで環境構築するのに必要な情報など公式サイトなどをウォッチしていこうと思う。私は失敗したが、他にうまく環境構築できている人がいる、出てくると思うから。どんなスペックだと構築できるのか情報や、どんな環境パターンだと構築できるのか、しやすいのかを知りたい。

- LLMの実行に必要なインフラを確保する術も必要だということがわかった。ローカル、クラウドであったとしても。マシンスペック、Amazon Bedrockなど。

# 参考にした情報
- [OllamaをGoogle Colabで動作させる方法！](https://youtu.be/ljE6Ybs6Xes?si=AimDRSEbb-ZJS6ZU)
  動画で手順が丁寧に解説されていて、分かりやすかった。これをみて、パラメータ数の少ないモデルから試していくのをオススメします。
- [日本語にも対応したLLM「Cohere Command R(+)」の実力は？](https://pc.watch.impress.co.jp/docs/column/nishikawa/1582380.html)
【R】グラフの目盛りを任意の文字に変える

# はじめに

plot関数を使って折れ線グラフで日ごとの平均気温の変化を表現しようとした時に、「X軸を"4/1"のような形式の日付、Y軸を平均気温」に指定すると以下のようなエラーが発生します。

```r:
 plot.window(...) でエラー:  有限な 'xlim' の値が必要です 
 追加情報:  警告メッセージ: 
1:  xy.coords(x, y, xlabel, ylabel, log) で: 
   強制変換により NA が生成されました 
2:  min(x) で:   min の引数に有限な値がありません: Inf を返します 
3:  max(x) で:   max の引数に有限な値がありません: -Inf を返します 
```

X軸に1,2,3,...という連番形式で日付を入れるとどうにかグラフが出来上がりますが、これだと何日の気温なのかが分かりづらいです。
そこでグラフの目盛りを任意の文字（※ここでは日付）に変える方法を記事としてまとめてみました。

![line_graph_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/59403fd1-bff0-5ddd-493d-2bb19572ca7b.png)

# 解決方法

## 解決の糸口

* 上記のように、X軸として「4/1」などの日付を指定するとそもそもグラフを描画できないため、「まずX軸にダミーの値（※ここでは連番）を指定してグラフを描画して、後から目盛りを任意の文字に変える」という方法を探してみました。

## 実際のコード

* 実際のコードは以下のように、「最初にX軸の目盛りを消した散布図を作り、後からX軸の目盛りを付け足す」という方法になりました。
  * 「最初にX軸の目盛りを消した散布図を作る」際には、X軸にダミーの値（※ここでは連番）となる`df$no`を指定して描画しています。
  * X軸の目盛りを消す時は`xaxt="n"`、Y軸の目盛りを消す時は`yaxt="n"`を指定します。

```r:
# 連番、日付、平均気温のデータフレーム
df <- data.frame(
no = c(1,2,3,4,5,6,7,8,9,10),
date = c("4/1","4/2","4/3","4/4","4/5","4/6","4/7","4/8","4/9","4/10"),
temp = c(14.6,14.2,13.9,15.4,11.4,12.7,17.0,18.8,15.6,11.7)
)

# X軸の目盛りを消した散布図を作る。
plot(df$temp~df$no,
  xlab="", ylab="Mean Temperature", 
  cex=1,
  cex.lab  = 0.8,
  cex.axis = 0.8,
  xlim=c(0.5, 10.5), xaxp=c(0,10,10),  # X軸の範囲を指定する
  type="b",  # 折れ線グラフ
  xaxt="n")  # X軸を消す

# 後からX軸の目盛りを付け足す。
axis(side = 1,
  at = seq(1, 10, by=1), # X軸の目盛りの刻みを指定する
  cex.lab  = 0.8,
  cex.axis = 0.8,
  labels=df$date)
```

* 出来上がった折れ線グラフは以下の通りです。
  * ちょっと味気ないグラフですが、記事の冒頭のグラフと比べて日付が明確になっています。

![line_graph_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/069ef5fc-2105-8204-66c1-2ca21dc79a23.png)

# 参考URL

* [Rのグラフで軸の目盛りの刻み幅を変更する方法](https://tips-r.blogspot.com/2014/09/r.html)
* [Rでグラフに数値を表示したり、軸の目盛間隔、軸ラベルを変更する方法](https://toukeier.hatenablog.com/entry/%3Fp%3D826)
論理演算のNAND表現

## はじめに
ここ半年ほどTuring Completeにハマっています。
Turing Completeは論理回路を自分で設計して、最終的にCPUの完成を目指すゲームです。私はこのゲームでNAND演算とシフト演算、それとメモリにアクセスすることだけできるCPUを作りました。
## 本題
NANDだけで演算するための変換式を備忘録として残しておきます。
便宜上、NAND演算子は|とします。
### a = b
```math
a = (b|b)|(b|b)
```
### NOT
```math
\bar a = a | a
```
### AND
```math
a \cdot b = (a | b) | (a | b)
```

### OR
```math
a+b=(a|a)|(b|b)
```

### XOR
```math
a \oplus b=(a | (a|b))|(b | (a|b))
```

## おわりに
覚えておきたい式を発見したら追記します。
python初心者が勉強した結果

# はじめに

こんにちは、ハッピーエンジニアです。

＜本題の要約＞
この記事は僕がpython未経験の状態から案件に参画し、レビュアーから**読みやすいコード**と評価されるようになった方法をまとめました。

＜状況や目的、対象読者＞
この記事は、Python経験がない状態で案件に参画する方やPythonの学習を始めようとしている方向けの記事になっています。
- Pythonの経験はないけど、いつか実務で使ってみたい！
- どうやってPythonを学習していいかわからない！
- Pythonがどんな感じか知りたい！


# Pythonをどうやって学習したか
私はPythonを以下の方法で学びました。
1. Pythonの書籍を読む
2. 毎日コードを書く
3. 業務で積極的にコードに触る

## Pythonの書籍を読む
何も知らない状態からいきなりPythonを書くというのは難しいかもしれません。
少なくとも他言語の経験がない場合は、いきなり書くのはかなり難しいです。
インプットとアウトプットが重要なのでまずはインプットを行うのが良いかもしません。
***注意***
**インプットばかりではなかなかプログラミングができるようにならないのでしっかりアウトプットもしましょう**
では、どんな本がおすすめなのか。

個人的には本は2冊に分けて購入するのがいいのではないかと思っています。
1. Pythonの構造や性質について詳しく説明された本
2. Pythonの実装方法や文法について説明された本

**2** を選ぶ理由は説明するまでもないかもしれませんが、プログラミングを学習したい人にとって直接的なインプットとなる教材になります。
まずは、これを読みながら学習をするのが一番いいですね。
**1** をお勧めする理由はPythonがどの様な性質を持ったプログラミング言語かを知っているとの知らないのでは大きな違いがああります。
より良い学習やプログラミングを行いたいのであれば間違いなく知っていた方がいいです。

***必ずしも本で学習する必要はありません。いろいろな方法がありますので自分に合った方法を見つけるのがベストです***

## 毎日コードを書く
私はここが一番重要だと思います。
**本を読むだけではおそらくPythonを書けるようにはなりません。**
もちろん読まないよりは絶対読んだ方がいいです。
ただ、実際に自分でコードを書いてみることが大切です。
ここで個人的に大事にしているのが、最初の方はコピペをせずに自分で文字を打つということです。
これはあくまで個人的に大事にしていることなので無視してもらっていいのですが、自分で口ずさみながら実装することで今これを書くとこんな感じで動くんだろうなといった想像をする時間ができます。私はこの時間を大切にしています。
プログラミングに限らずですが、楽しく行う方が身に付くことも多いし、早いと思います。
毎日が難しくても2日に1回または3日に1回、最低でも週末に1回は必ず自分でコードを書く様にしましょう。
日々の積み重ねがかなり大切です。

## 業務で積極的にコードに触る
できれば実務でPythonを触りましょう。
個人で学習して業務でも実装ができればかなり強いです。
1日の実装時間が格段に上がるので成長スピードも上がります。
ちなみに、私はこのタイプでした。
ただし、全くPythonを触らずにいきなり実装だったのでかなりキツかったです。
そうならないためにもあらかじめ勉強しておくのはかなり重要ですね。

# 参考文献
なし

# 最後に
ここまでPythonの学習方法について書いたのですが、
大切なのは
毎日コードを書くこと
インプットとアウトプットを意識すること
インプットよりアウトプットを多めに取ること
です。
ここをしっかり意識すればいいコードが書けるようになります！
一歩ずつ頑張りましょう！
最後まで読んでいただきありがとうございます！
Python 'and' と '&' の違い

## ‘and’の仕様

左辺が真なら右辺を返し、左辺が偽なら左辺を返す。左辺が偽の時は、右辺を評価しない。（短絡評価）これにより、パフォーマンスの向上やエラーの回避ができる。

```python
# 凡例
0 and 1
1 and 1
1 and 0
1 and 2  # 出力:上から順に0,1,0,2

# エラー回避の例
lst = []
result = lst and lst[0]  # []は'False'扱いなので、andの左辺が処理されて、[]が出力される
```

## ‘&’の仕様

‘&’はビットごとのAND演算子である。整数やブール値のビット、numpy配列の各要素に対して、ANDを適用する。

```python
# 0bは2ビットを表す接頭辞
x = 0b1101  # 13
y = 0b1011  # 11

result = x & y
print(bin(result))  # 出力: 0b1001 (9)

# numpy配列に対する演算
a = np.array([0b01, 0b00, 0b11])
b = np.array([0b01, 0b01, 0b01])

result = a & b
print(result)  # 出力: [1 0 1]
```
VS CodeでGitに再入門してみる （リモートリポジトリも）

## はじめに

これの続きです。

https://qiita.com/satokawa_san/items/ed46b1db1bc125801854

リポジトリを作って、コミット、チェックアウトを体験しました。

## 参考書籍

https://www.amazon.co.jp/dp/B096TH798S

## GitHubでフォークしてクローン

### フォーク

わかばちゃんの本ではGitHubを使い始めるのに、まずエルマスさんのリモートリポジトリをフォークします。GitHubにログインしてアクセス。（アカウントは既に作っている前提）

https://github.com/elmas3/mao-seminar

本のとおりのリポジトリが本当にあるので嬉しい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/d4c7f6ea-8e1c-a441-5528-2cbfa74fadaf.png)

では、フォークします。6.4kというフォークの数が人気を物語っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/0c66094a-15a8-2af1-181b-76ad4b88b0ed.png)

押すと、こんな画面が出ます。デフォルトのままでいいのかな。このまま「create fork」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/c79da8c1-6d87-b1a9-105f-1f0feaa0f9fb.png)

しばらく待つと画面が変わって、自分のアカウントにできたリポジトリに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/70ccdf40-25d7-f2cd-9f13-533506811280.png)

### クローン

フォークしてきたリポジトリを自分のところにもって来ます。緑の「< > Code」ボタンを押すとこのように表示されますので、URLの横にあるコピーするアイコンをクリックしてURLをコピー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/b7a41e07-724f-c3fe-2ad3-943d4588a80c.png)

では、VS Codeを起動します。
デフォルトでは前回まで起動していたフォルダが開いてしまいますが（設定による）、まっさらな新規ウィンドウを開いてください。

そしてこちらをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/3ca42cf4-3326-d857-bcf8-febe3ce8316a.png)

Gitでリポジトリ管理する対象がないのでこのようになっています。
ここで、下のボタン、 **「リポジトリの複製」** をクリック。これがクローンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/2b3a7968-0231-4c4f-c6e1-6d14fa03b1b0.png)

コマンドいれるとこが開くので先ほどコピーしたURLをペースト。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/558b3596-8c8c-f48c-cc2f-0ea1d9f2c85c.png)

フォルダ選択ウィンドウが表示されます。ここで、リポジトリを作る場所を指定します。 **ここで選択したフォルダの下に、リポジトリのフォルダが作られます。** 選択したら、「リポジトリの宛先として選択」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/ed0a4c19-8cc4-a3ca-aa69-210217d9820c.png)

クローンしているようなメッセージが表示され少し待つと、このダイアログが表示されるので「開く」で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/007854e8-b139-3638-fc77-5b2ffc391ec2.png)

開けました。無事ローカルにリポジトリを持って来れました。
できたできた(^o^)/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/d77a12b0-2950-4653-630c-4e94720dcb7d.png)

つづく！
https サーバー （IIS編）

# 初めに

既にIISでhttpサーバーを作っている環境でhttps接続を追加する方法を検討します。

---
# 証明書の準備

## 前提

正式対応する場合には、ルート証明書によって証明された証明書が必要になりますが、今回はテスト環境を想定し、自己証明書でやってみます。


## 自己証明書作成

Windowsの場合は管理者権限でPowerShellを開き、以下のコマンドを実行することでストアに自己証明書が格納されます。
```powershell
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My"
```
### ※ DnsNameについて

-DnsNameのパラメータの値はその証明書が証明するサイトを示すことになります。
そのため、IPアドレスの場合は、また別途証明書に工夫が必要ですが、次回以降に回します。

---
## IISの設定

IISで上記で作成した証明書をバインドします。

1. IISマネージャーを開く
1. サイトを選択
　対象のウェブサイトを選択する。
1. バインド
　右クリックから「バインドの編集」を選択します。
![001_menu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/e942d40c-9268-bece-a8a4-24e01913298e.png)

1. サイトバインドの追加
　「追加」をクリックします。
![002_add.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/ed9bdb1b-d529-8b76-3ad5-dd149f4cd8c9.png)

1. httpsにバインドする
　5-1. 種類にhttpsを選択する。
![003_add_bind.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/2a434325-5713-ff88-21ed-e28e95e10dd1.png)

　5-2. SSL証明書で選択をクリックする。
 　　先ほど登録しておいた証明書を選択する。
![004_ssl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/c77d9c23-62c3-e9a9-00bf-d2374d199e01.png)


## https接続
httpsで接続します。
証明書が信用されていないため、以下の画面になります。
![005_first_edge.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/21f79809-1a51-d0dc-679b-2d595b52ed2e.png)

その場合でも、「詳細」→「localhostに進む」で表示できます。


## 証明書の取り込み

サーバーPCで登録しておいた証明書をエクスポートします。
管理者権限のPowershellで以下のコマンドを実行します。
```powershell
$cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object { $_.Subject -like "*localhost*" }
Export-Certificate -Cert $cert -FilePath "(出力先ディレクトリ)\exported_certificate.cer"
```
※(出力先ディレクトリ)\exported_certificate.cerは任意のファイル名を指定して下さい。


## 証明書のインポート

上記で取り出した証明書をインポートします。
以下のコマンドで証明書マネージャーを開きます。
```shell
certmgr.msc
```
「信頼されたルート証明機関」→「証明書」で右クリックし、
すべてのタスク→インポートを選択します。
![008_import.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/06070375-f03f-a057-0e1b-1ffce9809c98.png)

![009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/8cb98fb2-f0a5-feb4-856d-847e9e5ff7ca.png)

以上で信用されて表示されるようになります。
スマホからミュージックファイルを移行する

## きっかけ
某PC不要でスマホにCDを取り込める製品・アプリを使用して音楽を楽しんでいたところ、
スマホのストレージが逼迫してしまったためどうにかデータを保持したま移行を行いたかった

:::note warn
　製品としては下記作業は非推奨のため、
　移行が完全に完了するまでは、移行元のファイルは消さずに作業する
:::

## 作業環境
　■PC
　　 OS：windows11
　■スマホ
  　　HW：Redmi Note 10T
  　　OS：android　Ver13

## 作業工程
### 0.事前準備
#### 0-1.移動すべきファイルがどこにあるのかを確認する
 　スマホの画面から[設定]-[アプリ]-[アプリを管理]を開き、左上の・・・を開き、プロパティ画面を開く

#### 0-2.APK名を確認する
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783250/92451701-f476-521f-db5b-75b1cbc7300f.png" width="250">
    
### 1.ファイルの移動
#### 1-1.確認した移行するファイルのあるフォルダを開く
　フォルダパス：内部共有ストレージ\Android\data\《APK名》\files\Music
　開くの下図のように表示される
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783250/4dd13c6a-7a3f-819a-e96d-006106a95bbf.png" width="500">

:::note info
PC・スマホどちらからも作業可能(そう)だが、この後拡張子を変更等があるためPCの方が作業が行いやすいと思われる
:::

#### 1-2.ほしいファイルを別のフォルダに移行する
 　  ここまででデータの退避は完了！

 ### 2.移行先で聴くための準備
　今回変更したいファイルが100個を超えるためコマンドラインから作業をする
  
#### 2-1.拡張子を変更する
  　拡張子.flacでCDからスマホに取り込んでいたため「.flac」に変更する
  　rename 00000000 00000000.flac

  　画面から操作する場合はファイルの名前を選択し、「00000000」を「00000000.flac」にする

:::note info
拡張子を付けることでPC側が音楽ファイルと認識し、CDを取り込んだ時に設定した情報が見えるようになる
:::

#### 2-2.情報を抜く
　powershellを開き情報を抜く
抜き方は、下記リンク先を参照するかChatGPTに聞く　(力尽きた)
　
   [PowerShellを使ってサイズや更新日時、バージョンなど、ファイルのプロパティ情報を取得する方法](https://www.haruru29.net/blog/how-to-get-file-information-using-powershell/)
 
#### 2-3.あとはタイトル名や、フォルダ階層を自分が見やすいように修正して完成！

## あとがき
  これで、スマホの容量逼迫は改善されるはず...
   副産物としてファイルの情報収集が行えるようになったので、
   今度は抜いた情報を修正してアルバム名とか発売日とか一括変換できるようにしたいな
【CSS】特定の子要素にホバーしていない場合のみスタイルを適用する方法

以下のように記述すると特定の子要素にホバーしていない場合にのみスタイルを適用できます。

```css
div:not(:has(要素:hover)) {
  
}

```

以下の場合、子要素のボタンにホバーしていなければ`div`の背景色が青になる

```css
div:not(:has(button:hover)) {
  background: #0000ff;
}

```
Webマークの削除エラーへの対処法

業務で使用しているVisualStudioでビルド時にエラーが発生する

# 症状

https://qiita.com/miltood/items/67f3a673f9784193779b

C++/cliでフォームアプリケーションを作成している際、ボタンにアイコン画像を埋め込む作業で上記のエラーが発生

ボタンのプロパティ[image]に画像を指定
ボタンに画像が表示されたので、ビルド
ビルドエラー発生
という流れ

上記記事を参考にして、エラーを起こしているresxファイルのプロパティを確認
しかし、
![スクリーンショット 2024-05-02 212649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746814/04ece215-1962-7a20-b462-595ea411c561.png)
属性の下にセキュリティ項目がない
ググると、このエラーの解決策はこのセキュリティ項目の設定変更なので、このままではどうしようもない
色々とやってみたが、結果は変わらず
さらに色々と調べたところ、気になる情報を発見
よくよく考えてみると、開発環境はネットワークドライブで共有していた
どうやら、共有フォルダやらネットワークドライブやらだと、画像リソースの指定時にこのエラーが出てしまうことがあるらしい

# 解決策
開発Slnのフォルダを一度、ネットワーク環境からローカル環境に移す
これは単純にフォルダごとデスクトップに移動させた
もう一度、ビルド
元のネットワーク環境に戻す
これだけ

ビルド時にresxに画像の埋め込みが行われるので、ビルド後は普通に画像が表示される
Cursorの機能

## New AI Project(削除)
### 概要
AI Projectを作成できる。アプリの機能説明を入力するだけで、自動でプログラミングしてくれる
### 使い方
1. 「ファイル」＞「New AI Project」を押下する。
※日本語化している場合は、「ファイル」＞「ファイルを開く...」
1. 「What do you want to build?」にアプリの機能の説明を入力し、「Next」ボタンを押下する。
1. 「Parent Folder」と「Project Name」を入力し、「Done」ボタンを押下する。

## プログラムの生成・編集
### 概要
プログラムの生成や編集したい内容を文章で入力することで、AIがその通りにプログラミングしてくれる
### 使い方
2. 生成・編集したい箇所を選択した状態で「Ctrl+K」を押下する。
2. 生成・編集したい内容を入力し、「Enter」を押下する。

## AIとチャット
### 概要
AIとチャットで、プログラムの相談ができる(どうしたいか等)。
### 使い方
3. 「Ctrl+L」を押下する
3.  相談内容を入力し、「Enter」を押下する

## @ Symbols
### 概要
チャットで「@」を指定することで、参照したいファイルを効率的に指定できる。
### 使い方
4. 「Ctrl+L」でチャット画面を表示する。
4. 「@」を入力し、参照したい対象を選択する。

## Codebase Answers
### 概要
コード全体に対して AI に質問できる。
### 使い方
5. 「Ctrl+L」でチャット画面を表示する。
5. 質問を入力し、「with codebase」ボタンを押下する。

## Docs
### 概要
AIのサードパーティライブラリの理解を向上させ、チャットや「Ctrl+K」 で、ドキュメントの使用や自動的に情報収集をすることができる。
### 使い方
6. 「Ctrl+L」でチャット画面を表示する。
6. 「@」を入力し、「Docs」を押下する。
6. 「+Add new doc」を押下し、読み込ませるサイトのURLを入力する。
6. 「@」を入力し、「Docs」で、読み込ませたドキュメントを指定する。
### 関連
@LibraryName
@Add

## Auto-Debug
### 概要
自動でバグを検知し、修正方法を提案してくれる。
### 使い方
7. プログラムを実行する
7. 「Debug with AI」ボタンを押下する。

## Fix Lints
### 概要
Lintエラーを検知し、修正案を提案してくれる。
### 使い方
Lintエラーにカーソルをあて、「Fix」ボタンを押下する。
Power Automate で使用している処理・テキストを横断検索する🔍

## はじめに
Power Automate を活用してフローが増えてくると、特定の通知をどのフローが行っているのか、あるいは特定の処理がどのフローに含まれているのかを把握するのが難しくなってくるかと思います。
「この通知はどのフローから来た？」「この条件を変更したいけど、どのフローだっけ？」
といったシーンでタイトルや記憶を頼りにひとつひとつフローを開けて確認をする、、、といった作業をされている方も多いのではないでしょうか。
**せっかくのPower Automate。検索作業も自動化しませんか？**
本記事では、Power Automate の処理をPower Automate を使って検索する方法についてご紹介します。

Azure Logic Apps を使用されている方はぜひこちらの記事もご覧ください↓

https://qiita.com/SnorlaxDX/private/7360c240c23677162754


## フローの作り方

### フローの全体像

フロー自体は比較的シンプルで、そんなに難しいアクションはありません。
ざっくりした流れは、 **フローの一覧を取得 → フローの詳細を取得 → 検索したい文字列が含まれるか分岐** となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/81f9a6bf-eb77-68dd-d815-5e8b45e59ddf.png)



### 前半の詳細
- トリガーは`手動でフローをトリガーします`を選択します。
 `入力の追加`から、テキストを選択してください。これはトリガーする際に検索値を入力するために使用します。
- `管理者としてのフローの一覧を取得(V2)`アクションを追加し、検索したい環境を選択します。
- `変数を初期化する`アクションを追加し、適当な名前を付けてアレイを選択します。この変数は、検索結果のフロー名を格納するために使用します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/6c48327d-3259-d30d-e5d4-d5093b630746.png)



### 後半の詳細
- `フローの取得`アクションを追加し、フローを検索したい環境を選択しFlow欄には管理者としてのフローの一覧を取得(V2)の`フロー名`を選択します。
- `条件`を追加し、「`string(outputs('フローの取得'))` **次の値を含む** トリガーの`入力`」を指定します。
- True に `配列変数に追加`を追加し、変数の初期化で設定した名前と、`フローの表示名`を選択します。
- 最後に、変数の中身を可視化するために`作成`アクションに作成した変数を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/1d795ec1-6a44-9b7a-5570-bdd6e9a01a44.png)


:::note info
「フローの取得」で取得したフローの内容はJSON形式となっているため、そのままでは検索が上手く機能しません。そのため、条件分岐のところではフローの取得結果を文字列に変換して比較しています。
:::

## 実行&結果

トリガーの際に、検索したいテキストを入力してフローを実行します。今回は特定のメールアドレスを指定しました。
実行結果を確認し、フローの末尾にある「作成」を見ると、ヒットしたフローのタイトルが確認できます。今回は２件のフローが結果として出ました。
実際にそれぞれのフローを確認してみると、メールの宛先に指定していたり、メンショントークンを取得したりといったアクションに使用していることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/b8ae92b5-de6d-dc85-6dcd-d099d9d18bdb.png)

:::note info
### 何を検索している？
フローの内容はコード（JSON）で取得します。コードにあるテキストにヒットしたものが検索結果として確認できます。
    例えば、「共有メールボックスからメールを送信する」アクションの場合は、下図のようなコードになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/d2d44489-df8b-5e6f-0c39-c7b40b1556d5.png)
:::

## ○○を検索したい！
### Teams チーム・チャネルを検索したい！
Teams チャネルやチームを検索する場合は、テキストではなくIDでの検索が必要となります。
実際のフローに行き、コードのプレビューを選択するとGroupIDやchannelIDが確認できますので、このIDを検索の際に入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/a345c287-914d-bbc1-ea8d-ff4b92542763.png)

### 接続を検索したい！
何かしらのアクションやテキストだけでなく、接続を検索したいという場合もあるかと思います。
このフローでは接続名での検索が出来ない為、接続を確認したい場合はUIから行くことをおすすめします。
Power Automateのページから「接続」→「この接続を使用するフロー」で、接続が使用されているフローを閲覧することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/80a599c9-7780-1d62-11b2-2504c9d7192c.png)

## おわりに
本記事では、Power Automateを使用し、自動的にフローの検索を行う方法をご紹介しました。
シンプルなフローで複数のフローの中から特定の条件にマッチするフローを見つけ出すことができます。日々多くのフローを管理し、悩まれている方にお役に立てば幸いです。
KaggleのLBとCVで相関のあるデータセットの作り方(Probe)

KaggleのLLM系のコンペでは、コンペのホストから提供されるデータがほとんどないor全くない場合が多いです。
そんなとき、サブミッションした時のLB(リーダーボード)のスコアと、手元で検証した時のCVのスコアで相関のあるデータセットが手元に作れれば、よりスコアの改善に役立てることができます。(サブミットによってKaggle側のデータがどのようなものかを探る行為をProbeと呼ぶらしいです)
今回はそのようなデータセットの作り方を紹介しようと思います。

# まずは品質をあまり気にせず大量のデータと集める
ChatGPTのAPIなどを利用して大量のデータを作ります。
ただしコンペの参加者の方々が、自分の作ったデータセットを公開してくれることが多いので、それらを拝借するのが手っ取り早いと思います。
なお、この時点でそこまで高い品質のデータは求めていません。
明らかに形式が間違っていたりするようなデータでなければとりあえずOKです。
玉石混交みたいな感じのデータセットになるイメージです。

# いくつかのモデルでサブミットをした時のスコアを控えておく
ここでは例として、`model_A`と`model_B`と`model_C`と`model_D`と`model_E`のような５種類のモデルを使ってそれぞれをサブミットして、そのそれぞれのLBでのスコアを得ることができたとします。
以下のようにして、モデルとそれをサブミットした時のLBのスコアを対にした辞書を作成します。
```python
scores = {
    # key→サブミットした時に使ったモデル
    # value→サブミットした時のスコア
    model_A: 0.71,
    model_B: 0.68,
    model_C: 0.70,
    model_D: 0.68,
    model_E: 0.65
}
```

# 集めたデータ群からLBとCVで相関のあるデータ群を抽出する

基本的なアイデアとしては、
「サブミットした時のスコア」と「ローカルデータでのスコア」
の差が小さくなるように、ローカルデータの抽出を繰り返して洗練していくイメージです。

実装例としては以下のようになります。
```python
def fitness(features, targets):
    """
    各モデルでサブミットを行った時のスコアと、
    そのモデルでサンプルデータの推論を行った時のスコアの差の累積値を計算する。
    """
    score_losses = np.array(list(scores.values()))

    # 各モデルで部分集合の推論をした時の損失を計算する。・・・①
    predicts = np.array([model.predict(features) for model in scores.keys()])
    local_scores = metric(np.array(predicts - targets))

    return np.abs(local_scores - score_losses).sum()


def find_best_sample(all_collected_data : pd.DataFrame, sample_size: int = 100, iterations: int = 500):
    """
    集めた全てのデータセット(all_collected_data)の中から、Kaggle側のデータと似ている部分集合を抜き出す。
    """
    best_sub_data = None
    best_loss = float('inf')

    for _ in range(iterations):
        # all_collected_dataからランダムに部分集合(sub_data)を取り出す。
        sample_indices = np.random.choice(len(all_collected_data), sample_size, replace=True)
        sub_data = all_collected_data.loc[sample_indices]
        features = sub_data["特徴量"]
        targets = sub_data["正解"]

        # 上記のfitness関数を使って、部分集合sampleの損失を計算する。
        current_loss = fitness(features, targets)

        # 現在の部分集合の損失が暫定で1番小さくなったら、現在の部分集合をベストなものとして更新する。
        if current_loss < best_loss:
            best_loss = current_loss
            best_sub_data = sub_data
            best_idx = sample_indices

    return best_sub_data, best_loss, best_idx

```
上のコードについては[ここ](https://www.kaggle.com/competitions/llm-prompt-recovery/discussion/494362)を参考にさせていただきました。

`fitness`関数の①ではscikit-learnのモデルのインターフェース風に推論を行って損失計算していますが、適宜目的に沿って書き換えれば所望のデータセットを作ることができます。
言うまでもないことですが`all_collected_data`もデータフレームである必要はありません。