OmniAICreator/Qiita-1.07M huggingface dataset:
typespecをswaggerv2から生成する

# generate typespec from swagger v2

## 0. setup

```terminal
$ npm init -y
$ tree . -L 2 -I node_modules
.
├── README.md
├── assets
│   └── swagger.json // pet store
├── compose.yaml
├── dockerfile
└── package.json
```

dockerfile, compose.yamlは[qiita](https://qiita.com/ziima/items/4b681b78cf649e6e3cd3#0-setup-project)と同じ内容です。

[assets/swagger.json](https://petstore.swagger.io/)は[assets/swagger.json](https://petstore.swagger.io/)のsampleから取得しています。

## 1. 依存関係を作成する

[Autorest autorestcli](https://github.com/Azure/autorest/tree/main/packages/apps/autorest)を用いて、swagger v2からtypespecの環境を作成していきます。

```terminal
% npm install -D autorest
```

```package.json
"scripts": {
    "cli:autorest": "autorest"
  },
// 
"devDependencies": {
    "autorest": "^3.7.1"
  },
```


## 2. typespecの生成

[Autorest CLI autorest](https://github.com/Azure/autorest/tree/main/packages/apps/autorest)を利用して、
[@autorest/openapi-to-typespec](https://www.npmjs.com/package/@autorest/openapi-to-typespec)を参考にtspファイルを生成する。

```terminal
% npm run cli:autorest --  --openapi-to-typespec --input-file=./assets/swagger.json --use=@autorest/openapi-to-typespec@next --output-folder=./gen

% tree . -L 2 -I node_modules
.
├── README.md
├── assets
│   └── swagger.json
├── compose.yaml
├── dockerfile
├── gen
│   ├── main.tsp
│   ├── models.tsp
│   ├── routes.tsp
│   └── tspconfig.yaml
├── package-lock.json
└── package.json
```

--output-folderで指定した、gen以下にtypespecのコードが生成される。
70歳の挑戦... サーボ１個の２足歩行ロボットを作ってみた。タミヤの工作キットを参考に

　このような商品をこの価格で？経営者や技術者どうなってるの？
　最近、タミヤの重心移動歩行ロボット工作キット

https://www.tamiya.com/japan/products/70256/index.html

を知り、早速購入し作ってみました。厳しめの評価も見受けられますが、私はタミヤの凄さにあらためて驚かされました。
　モーターの回転を往復運動に変換し左右の重心移動を創り出し２足歩行を実現する。これに触発され、私もサーボモーター１個で自作してみたので報告します。先ずはその雄姿(エヴァンゲのような、どこが？)をご覧ください。

![２足ろぼ0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/15df8b17-252d-43a9-f56d-9170aa4fe267.png)

    上の２枚の写真...前方右から、後方右から
        ESP32ボード
        脚部の支点となる丸シャフト(3mm*100mm)位置やポリキャッブ止めの様子
        動作時電源用のUSBメスソケット
    下の３枚の写真...後方から写したもの
        サーボとその取り付け方
        重心移動の仕組み
        1.2mmプラバンの足部分（foot）の取り付け方と足裏の曲げ具合
        脚の前後開度制限ストッパー(金具)
　在り合わせの手持ち材料だけで構成しました。基本はタミヤのキットを踏襲し、駆動部分をそっくりサーボ機構に変更しただけです。使用した部品の一覧です。

    １．ESP32ボード（ArduinoIDE 2.3.2 で Heltec WiFi Kit 32 と認識するボード）
    ２．タミヤ ユニバーサルプレート 2枚セット【70157】
    ３．タミヤ ユニバーサルプレートL(210x160mm)【70172】
    ４．タミヤ ユニバーサルプレートセット [70098]
    ５．タミヤ ユニバーサル金具4本セット [70164] （2セット）
    ６．タミヤ トラック&ホイールセット [70100]
    ７．タミヤ ロングユニバーサルアームセット【70156】
    ８．タミヤ 1.2mm厚プラバン
    ９．Φ3mmビス（長さ6mm～12㎜）とナット多数
    10．Φ2㎜ビス、ナット2個組（電池ボックス固定に必要）
    11．単4*4本 乾電池ボックス
    12．USB 2.0メスソケット DIP 4Pアダプタコネクタ2.54mmはんだ付け基板
    13．厚手両面テープ少々(足であるプラバンを金具に貼り付けるなどに使用)
    *両足裏側の後方にタミヤのキット制作で余ったスポンジテープを貼り付け、滑らないようにしています。
　サーボの回転範囲や速度、脚の支点位置、乾電池Boxによる前後重心、足裏の曲面、脚前後開度の制限など細かな調整を施した結果、よちよち歩きが実現しました。タミヤキットを参考にしているので案外簡単に出来ました。
　左右に体を揺らしながら歩きます。両脚部はその重心に対して前方に回転軸があるので、例えば
 
     １．電池ボックスを右に振る、右に重心が移動、右脚に乗る
     ２．浮いた左脚が肩を支点に前方に回転、前に振り出される
     ３．電池ボックスを左に振る、左に重心が移動、左脚に乗る
     ４．ロボット全体が前進、同時に浮いた右脚が前に振り出される
この繰返しで歩いていきます。足裏を大きくしたので左右への傾きが大きくても倒れず、結構な復元力を有します。
　細かい部分や制作過程はとても文章化できませんし、動画をアップする能力も無いので悪しからず。Arduino IDE 2.3.2 でのスケッチはいたってシンプル、以下のようです。

```c:BiPedal_Walk_Servo.ino
#include <ESP32Servo.h>

// Servo
#define MIN_PULSE 1100 //800
#define MAX_PULSE 1700 //2000
const int SvPin = 12; // the number of the servo PWM pin
Servo myservo;
int pos = 0;

void setup() {
  myservo.setPeriodHertz(50);
  myservo.attach(SvPin,500,2400);
}

void loop() {
  
  for (int pos = 28; pos <= 170; pos += 1) { // 14 180
    myservo.write(pos);
    delay(8);
  }
  delay(70);
  
  for (int pos = 170; pos >= 28; pos -= 1) {
    
    myservo.write(pos);
    delay(8);
  }
  delay(70);
}
```
　最後まで見ていただきありがとうございました。
コンテナ vs バーチャルマシン：違いを徹底解説！どちらを選ぶべきか？

# はじめに
現代のソフトウェア開発や運用において、「コンテナ」と「バーチャルマシン（VM）」は非常に重要な技術です。どちらもアプリケーションを効率よく実行するための手段ですが、仕組みや使いどころは異なります。本記事では、コンテナとバーチャルマシンの違いを詳しく解説し、それぞれの利点やどの場面で使うべきかについて学んでいきます。

# コンテナとバーチャルマシンの違い
まず、コンテナとバーチャルマシンの違いを一言でまとめると、**コンテナはホストOSのカーネルを共有しているのに対し、バーチャルマシンはホストOS上に完全なゲストOSを動作させる**という点です。

この違いが、それぞれのメリットやデメリットを生み出します。以下で詳細に解説していきます。

## 1. コンテナとは？
コンテナは、ホストOSのカーネルを共有しつつ、アプリケーションを隔離して実行する軽量な仮想化技術です。コンテナを使うことで、必要なライブラリや設定を含めたアプリケーションの実行環境をパッケージ化でき、効率的にアプリケーションを展開できます。

### コンテナの特徴
- **軽量**：ホストOSのカーネルを共有しているため、OS自体の複製は必要なく、バーチャルマシンと比べて圧倒的に軽量です。
- **高速な起動**：コンテナは秒単位で起動し、リソースのオーバーヘッドが少ないため、スケーラブルな環境に最適です。
- **環境の一貫性**：開発環境から本番環境まで、一貫した環境を提供できるため、動作の不整合が少なくなります。
#### コンテナの例：Docker
コンテナ技術の中で最も広く使われているのが「Docker」です。Dockerでは、アプリケーションとその依存関係を「イメージ」としてパッケージ化し、それを「コンテナ」として実行します。

```bash
# Dockerコンテナの例
docker run -d -p 8080:80 nginx
```
このコマンドは、NginxのWebサーバーをコンテナとして起動し、ポート8080でアクセスできるようにします。起動は数秒で完了し、コンテナの停止・再起動も迅速です。

## 2. バーチャルマシン（VM）とは？
バーチャルマシンは、物理マシン上で仮想的に独立した「コンピュータ」をエミュレートする技術です。VMはホストOS上で仮想化ソフトウェア（ハイパーバイザー）を使い、その上にゲストOSを完全に動作させます。各VMは独自のカーネルを持ち、物理マシンと同様に動作します。

### バーチャルマシンの特徴
- **完全な隔離**：VMはホストOSから完全に独立して動作し、強力な隔離環境を提供します。セキュリティが重要な場合に優れています。
- **多様なOSの実行**：同じホストマシン上で異なるOS（例：Linux上でWindows）を実行することが可能です。
- **リソースのオーバーヘッド**：VMはフル機能のOSを実行するため、コンテナに比べてリソースの消費が大きく、起動にも時間がかかります。
#### バーチャルマシンの例：VirtualBox
以下の例は、VirtualBoxを使ってUbuntuの仮想マシンを起動する場合のイメージです。

```bash
# VirtualBoxを使ってUbuntuの仮想マシンを起動
vboxmanage startvm "Ubuntu VM"
```
この場合、完全なUbuntu OSが物理マシン上で仮想的に動作し、独立した環境で開発やテストが可能です。

# コンテナとバーチャルマシンの比較
|特徴	|コンテナ	|バーチャルマシン (VM)|
|---|---|---|
|起動時間|	数秒	|数分
|リソース消費|	少ない（軽量）	|多い（フルOSが動作）
|隔離の強度|	中程度（カーネルは共有）	|高い（完全に独立）
|OSの互換性|	ホストOSと同じカーネルのみ	|異なるOSも実行可能
|スケーラビリティ|	高い	|中程度
|主な用途|	マイクロサービス、クラウド環境	|異なるOS環境の実行、隔離が必要な環境
# 3. どちらを選ぶべきか？
### コンテナが適している場合：
- **軽量なアプリケーション**：コンテナは軽量かつ起動が速いため、マイクロサービスやクラウドネイティブなアプリケーションに適しています。
- **開発環境の統一**：開発から本番まで一貫した環境を提供したい場合は、コンテナが最適です。Dockerなどを使えば、どの環境でも同じように動作する保証が得られます。
### バーチャルマシンが適している場合：
- **異なるOSを実行する必要がある場合**：Linux上でWindowsを動かすなど、異なるOSを実行したい場合には、VMが有利です。
- **高いセキュリティや隔離が求められる場合**：VMは完全な隔離環境を提供するため、セキュリティが最重要である場合に適しています。
## 実際の活用例
### 1. コンテナの活用例：マイクロサービス
現代のクラウドネイティブアーキテクチャでは、コンテナを使ってマイクロサービスを展開するのが一般的です。各コンテナは独立したサービスとして動作し、ネットワークを介して他のコンテナと通信します。このアプローチにより、スケーラブルでメンテナンスが容易なシステムを構築できます。

### 2. バーチャルマシンの活用例：複数OSの実行
テストやデバッグを行う際に、異なるOSを同時に実行したい場合、バーチャルマシンがよく使われます。例えば、WindowsアプリケーションのテストをLinux環境上で行う場合、VMを使うことで独立した環境での検証が可能になります。

# まとめ
コンテナとバーチャルマシンは、いずれも重要な仮想化技術ですが、それぞれに適した用途があります。コンテナは軽量で高速な起動を求めるアプリケーションに適しており、バーチャルマシンは異なるOSの実行や強力な隔離を求めるシーンで活躍します。どちらを選ぶかは、プロジェクトの要件やリソースに応じて決定すべきです。

コンテナやバーチャルマシンを上手に使い分けることで、より効率的で柔軟な開発環境を構築できるでしょう。
AWSのknowledgebaseで同期ができないときの対処法

## AWSのナレッジベースでRAGを作ろうとしたらソースの同期でエラーを吐いたので忘備録

- ナレッジベースを作成し、データソースの同期ボタンを押すと以下のエラーが出ました。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/517d16db-7469-6d35-72b8-cb6a3182d43a.png)

>Data sync failed. There is an ongoing ingestion job for this data source with ID 〇〇〇>〇〇〇〇〇〇〇. Retry your request after the ingestion job completes.

- AWSのOpensearch serviceのコレクションのページを確認したところ、こちらにもエラーメッセージが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/60eb77f0-23eb-2d64-65ef-a2f75d4fdef8.png)

>Amazon OpenSearch Serverless は、リソースにアクセスするための必須の IAM 許可を要求します
2023 年 5 月 10 日以降、OpenSearch Serverless は、コレクションリソース用に 2 つの新しい IAM 許可を要求します。これらの 2 つの IAM 許可とは、「aoss:APIAccessAll」(Data Plane API アクセス用) と「aoss:DashboardsAccessAll」(ブラウザからのダッシュボードへのアクセス用) で>す。OpenSearch Serverless には、「aoss:APIAccessAll」(Data Plane API アクセス用) と「aoss:DashboardsAccessAll」(ダッシュボードアクセス用) の 2 つの IAM 許可を追加する必要があります。このアクションは 2023 年 5 月 9 日までに完了する必要があります。これらの 2 つの新しい IAM 許可を追加しないと、2023 年 5 月 10 日以降、403 エラーが発生します。

- どうやらKnowledgebaseのロールにポリシーをアタッチしなければダメな様子。

## 対処法
#### ナレッジベースのページでロール名を確認します。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/791f7a60-451a-8671-d8a7-5917150d7a1e.png)
#### IAMの画面に行きポリシーをクリック

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/22bec41c-2f56-5ba6-7b82-8807354916d0.png)

#### ポリシーの作成をクリック
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/77a17d08-a2bf-30dc-3dd1-573ad98b23e2.png)

#### JSONにして以下を入力します
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/30114f7b-45df-76d7-0055-e9d19d2259fe.png)


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "aoss:APIAccessAll",
                "aoss:DashboardsAccessAll"
            ],
            "Resource": "*"
        }
    ]
}
```
#### ポリシー名を付けて確認して作成
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/09b97433-9a16-e53a-d3a0-bfed10c17091.png)


#### IAMのロール画面に移動して、ナレッジベースのロールを探します。
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/2951d284-4bf5-f145-ffe3-1c3d144723ce.png)



#### 許可ポリシーのところから許可を追加→ポリシーをアタッチを選択
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/f4cfb1f9-74d0-148d-3834-dbfbfe7f0ff6.png)

#### 新しく作成したポリシーを選択
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/7e2c75f8-f92d-f600-b3a0-3c3a479482fc.png)

#### 許可を追加ボタンをクリック
![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/1e6c81dd-7919-faeb-742f-69a93b4dded3.png)
#### ナレッジベースのページに戻って同期をクリックすると同期が開始！
![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233734/4d5574f6-6cff-df39-b9be-561ec704515a.png)

以上
【初学者に向けて】TransformerモデルとGPTの関係についてメモ

# 1. Transformerの概要

　Transformerは、2017年にVaswaniらによって提案された自然言語処理（NLP）モデルのアーキテクチャで、「Attention is All You Need」という論文で発表されました。このアーキテクチャは、従来のRNN（リカレントニューラルネットワーク）やLSTM（Long Short-Term Memory）のようなシーケンシャル処理の代わりに、「自己注意機構（Self-Attention）」を使用することで、並列処理が可能になり、効率的に学習が行えるという特徴を持っています。

Transformerは以下の2つの主要な構造から成り立っています。

- エンコーダ：入力データを処理し、内部表現を生成します。
- デコーダ：エンコーダの出力を元に、新しいシーケンスを生成します（翻訳タスクなどに使用）

### ところで、エンコーダーとデコーダーの意味とは何でしょう?

　エンコーダーは、「**入力データを理解して、意味を圧縮して表現する部分**」です。例えば、文章をエンコーダーに入力すると、その文章が持つ意味を抽出し、重要な特徴をまとめます。
デコーダーは、「**そのエンコーダーがまとめた「意味」を基に、新しいデータを生成したり、元のデータに戻す役割**」をします。翻訳の例だと、エンコーダーが英語の文章を「意味」に変換し、デコーダーがその意味を使って日本語の文章を生成します。エンコーダーはデータを理解し、デコーダーはその理解を基に新しいデータを作る役割をします。※ここでは「暗号化」や「解読」とは少し違い、データの理解と再構成が中心となる考え方になるわけです。


# 2. GPTの概要

　GPTは、Transformerアーキテクチャのうち、デコーダ部分に焦点を当てて設計されたモデルです。OpenAIが開発したGPTシリーズ（GPT-1、GPT-2、GPT-3、GPT-4）は、Transformerのデコーダアーキテクチャを基にし、自然言語生成タスクに特化しています。

GPTは自己回帰型言語モデルで、次の単語を予測するタスクを繰り返し行うことで、文章を生成します。以下がGPTの重要な特徴です。

- 自己回帰モデル: GPTは「左から右に」次の単語を生成する自己回帰モデルです。つまり、与えられた単語列の次に来る単語を1つずつ予測し、最終的に文章全体を生成します。「**自己回帰型モデル**」というと、難しく聞こえるかもしれませんが、簡単に言うと「過去の情報を使って、次に何が来るかを予測する方法」です。たとえば、文章を作るとき、これまでに書いた単語を参考にして次の単語を予測していくような感じです。

GPTのようなモデルでは、文章を左から右に順番に見て、次に出てくる単語を一つずつ予測して文章を生成していきます。

- 事前学習とファインチューニング: GPTは大量のテキストデータで事前学習され、その後、特定のタスクにファインチューニングされることで、幅広いタスクに対応できます。

# 3. TransformerとGPTの関係

アーキテクチャの基盤: GPTは、Transformerのデコーダ部分に基づいており、その中心となるのが「自己注意機構（Self-Attention）」です。これにより、GPTは文脈を理解しながら次の単語を予測することができます。
    
- 方向性の違い: Transformerはエンコーダ・デコーダの両方を備えた構造ですが、GPTはデコーダのみを使ってテキスト生成を行います。エンコーダ部分はありません。
- タスクの焦点: Transformerは翻訳などの双方向的なタスクにも対応できますが、GPTは自然言語生成に特化しています。

# 4. BERTとの違い

 BERT（Bidirectional Encoder Representations from Transformers）は、Transformerのエンコーダ部分を利用しており、文脈を両方向から捉える双方向モデルです。これに対し、GPTはデコーダ部分のみを使い、文脈を左から右に読み取って次の単語を生成するという単方向のモデルです。

# まとめ
TransformerとGPTを違いを簡単にまとめると下記のようになります。

- Transformer: エンコーダとデコーダの両方を持つアーキテクチャ。翻訳タスクなど、広範な自然言語処理タスクに対応。
- GPT: Transformerのデコーダ部分を基にした自己回帰型モデル。特に自然言語生成（次の単語の予測）に強みを持つ。




**※一部生成AIを使用して、文字を生成しています**
User Access Policies


+ [ユーザーアクセスポリシー](https://help.salesforce.com/s/articleView?id=platform.perm_user_access_policies.htm&type=5)
+ [How to Troubleshoot User Access Policy Failures](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBmgm)


https://trailhead.salesforce.com/content/learn/modules/user-access-policies

# Create a User Access Policy

+ [Missing Permission Group and Group](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erwLg)

:::note
接続先が違った
:::
フリーワード検索

汎用性のあるロジックを作成するために、データの深さや構造に関係なくすべての値を再帰的に結合し、`search_string` を生成するアプローチを考えます。リストや辞書のネストがあっても対応できるように、再帰関数を使ってすべての値を抽出し、`｜` で結合するようにします。

以下はその実装例です。

```python
import json

# 値を再帰的に取り出して '｜' で結合する関数
def recursive_collect_values(data):
    values = []
    
    if isinstance(data, dict):
        # 辞書の場合はすべてのキーに対して再帰的に処理
        for value in data.values():
            values.extend(recursive_collect_values(value))
    elif isinstance(data, list):
        # リストの場合はすべての要素に対して再帰的に処理
        for item in data:
            values.extend(recursive_collect_values(item))
    else:
        # 基本的な値（文字列や数値）はそのままリストに追加
        values.append(str(data))
    
    return values

# データの処理
data = [
    {
        "name": "test",
        "url": "https://github.com/test/test",
        "description": "test",
        "stars": 0,
        "tags": [
            {
                "tag1": "tag1のデータ",
                "tag2": "tag2のデータ"
            },
            {
                "tag1": "tag1のデータ",
                "tag2": "tag2のデータ"
            }
        ]
    },
    {
        "name": "test2",
        "url": "https://github.com/test/test2",
        "description": "test2",
        "stars": 0,
        "tags": [
            {
                "tag1": "tag1のデータ",
                "tag2": "tag2のデータ"
            },
            {
                "tag1": "tag1のデータ",
                "tag2": "tag2のデータ"
            }
        ]
    }
]

# 各データに対して search_string を追加
for item in data:
    collected_values = recursive_collect_values(item)
    search_string = '｜'.join(collected_values)
    item['search_string'] = search_string

# 結果を表示
print(json.dumps(data, ensure_ascii=False, indent=4))
```

### このロジックの説明:
1. `recursive_collect_values` 関数は、データが辞書であればその値を再帰的に処理し、リストであればその要素を処理してすべての値を収集します。
2. 数値や文字列などの単純な値はそのまま文字列に変換してリストに追加します。
3. 最終的にすべての値を `｜` で連結し、`search_string` として追加します。

### このアプローチのメリット:
- 任意の深さや複雑なネスト構造を持つデータにも対応可能。
- リストや辞書を問わず、すべてのデータを文字列として処理できます。
- 各項目の構造に依存せず、新しいフィールドが追加されても自動で処理します。

このようにして、将来的にデータ構造が変更されても再利用できる汎用的なロジックを作成しました。
Build a Bear-Tracking App with Lightning Web Components


https://trailhead.salesforce.com/content/learn/projects/lwc-build-flexible-apps

# Work with a Single Record

+ [必要な手順をすべて完了したにもかかわらず、提出時に「bearLocation」フィールドと「bearSupervisor」フィールドが抜けているという問題が発生しました](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erzyW)

:::note
皆さんの役に立つコメントに感謝します。皆さんがおっしゃったことをすべて確認したところ、誤って 2 つのファイルを作成していたことがわかりました。そのうちの 1 つに「bearLocation」がなかったので、それを削除して再送信しました。このチャレンジを無事に完了することができました。
:::
外部クライアントアプリケーション

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



# ヘルプ

+ [外部クライアントアプリケーション](https://help.salesforce.com/s/articleView?id=sf.external_client_apps.htm&type=5)

外部クライアントアプリケーションは、次世代の接続アプリケーションです。このパッケージ化可能なフレームワークにより、API とセキュリティプロトコルを使用して、サードパーティアプリケーションと Salesforce を統合できます。外部クライアントアプリケーションは、シングルサインオン (SSO) を提供し、OAuth プロトコルを使用してサードパーティアプリケーションを認証します。Salesforce と統合されたサードパーティアプリケーションは、カスタマーサクセスプラットフォーム、および他のプラットフォーム、デバイス、または SaaS サブスクリプションで実行できます。

接続アプリケーションと外部クライアントアプリケーションのどちらも、2 つの異なる種別の有効なユーザーが含まれます。まず、アプリケーションを開発するユーザーが、独自の Salesforce 組織で使用する場合でも、配布用にパッケージ化するユーザーです。他のユーザーは、配布されたアプリケーションを登録するか、組織で開発されたアプリケーションを管理する Salesforce 組織と連携するシステム管理者です。開発者とは異なり、システム管理者は、特定の組織でそれらのアプリケーションがどのように使用されるかに関するポリシーを設定します。これらの 2 つのロールは、ローカルアプリケーションで作業している同じユーザーに割り当てることもできますが、アプリケーションをパッケージ化して、異なる Salesforce 組織に配布するときに、これらのユーザーロールを分離することが重要になります。

接続アプリケーションは開発者とシステム管理者の両方の設定を対象とする 1 つのメタデータファイルで構成されていますが、外部クライアントアプリケーションの設定は複数のファイルにまたがります。各外部クライアントアプリケーションには、いくつかのヘッダーファイルと 1 つ以上のプラグインが含まれます。各プラグインには独自の設定ファイルとポリシーファイルがあります。開発者権限を持つユーザーは、設定ファイルで一般的なアプリケーション設定を制御します。設定ファイルは、最終的にパッケージ化され、登録者に配布されるプラグインの一部です。登録者組織のシステム管理者はアプリケーションポリシーを管理します。プラグインポリシーファイルはパッケージ化されず、システム管理者のローカル組織にのみ影響します。登録者組織のシステム管理者はアプリケーション設定を編集できません。


+ [接続アプリケーションと外部クライアントアプリケーションの機能の比較](https://help.salesforce.com/s/articleView?id=sf.connected_apps_and_external_client_apps_features.htm&type=5)

接続アプリケーションには、Salesforce データを外部アプリケーションに提供するためのフレームワークが装備されています。ただし、このフレームワークには、個別のユーザーロールを定義できなくなる、また接続アプリケーションをパッケージ化しづらくなるという側面があります。外部クライアントアプリケーションは、こうした欠点に対処しつつ、接続アプリと同様に外部アプリケーションとデータを接続するのに役立つように設計されています。

外部クライアントアプリケーションは、新世代の接続アプリケーションです。セキュリティを強化し、接続アプリケーションに影響する面倒なパッケージ化や配布の問題を解決するように設計されています。接続アプリケーションは Salesforce 開発の強力なツールとなっていますが、外部クライアントアプリケーションは第二世代 (2GP) パッケージ化を目的として設計されています。スクラッチ組織でのソース駆動型開発用に最適化されており、独自の開発者設定とシステム管理者が定義したカスタマイズ可能なポリシーを常に明確に分離することができます。最終的には、外部クライアントアプリケーションで、接続アプリケーションの使用事例の大半がサポートされるようになります。

外部クライアントアプリケーションを Salesforce に統合する場合、外部クライアントアプリケーションが最適なオプションかどうかを判断するには、使用可能な機能が示された次の表を使用してください。

+ [Summer 24 セキュリティと定義されたユーザーロールを維持しながら外部クライアントアプリケーションを作成](https://help.salesforce.com/s/articleView?id=release-notes.rn_security_eca.htm&release=250&type=5)

# まだ有効でない？

+ [Don't have 'Opt in to External Client Apps' button in the External Client App settings](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erzyHSAQ)
ACDLを提唱します。その13

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
式からグラフを生成します。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1e8f02d2-affe-9981-c334-6bc5330dc16c.png)


#  サンプルコード

```


function run() {
  var src = document.getElementById('src').value;
  var values = [];
  for(var x = -4; x < 5; x += .3)
  {
    eval(src);
    values.push({
      x: x, 
      y: y
    });
  }
  const spec = {
    '$schema': 'https://vega.github.io/schema/vega-lite/v2.json',
    'width': 300,
    'height': 300,
    'data': {
      'values': values
    },
    'mark': 'point',
    'encoding': {
      'x': {
        'field': 'x', 
        'type': 'quantitative'
      },
      'y': {
        'field': 'y', 
        'type': 'quantitative'
      }
    }
  };
  vegaEmbed('#vis', spec);
}





```

# 成果物

https://embed.plnkr.co/plunk/hmO2QWGQQJ0Njtl1


以上
cscの作法 その526

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
ヤフオクのページでコインローファーを入力してボタンをクリックせよ。

# 方針
- webbrowserを使う。
- edgeのエンジン使う。

# 参考にしたページ

https://qiita.com/Kujiro/items/7054cb8ac201e9ebd6e3


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/62c01fa7-99fe-dca0-afe8-5b337992aced.png)


# サンプルコード

```

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;

class form1: Form {
	WebBrowser wb0;
	form1() {
		Text = "WebBrowser";
		ClientSize = new Size(600, 800);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 20);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
		const string FEATURE_BROWSER_EMULATION = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
		Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(FEATURE_BROWSER_EMULATION);
		registryKey.SetValue(Process.GetCurrentProcess().ProcessName + ".exe", 11001, Microsoft.Win32.RegistryValueKind.DWord);
		wb0 = new WebBrowser();
		wb0.ScriptErrorsSuppressed = true;
		wb0.Location = new Point(50, 50);
		wb0.Width = 500;
		wb0.Height = 700;
		Controls.AddRange(new Control[] {
			wb0
		});
		string url = "https://auctions.yahoo.co.jp";
		wb0.Navigate(url);
	}
	void btn1_Click(object sender, System.EventArgs e) {
		wb0.Focus();
		HtmlElementCollection inputs = wb0.Document.GetElementsByTagName("INPUT");
		foreach (HtmlElement element in inputs)
		{
			element.InnerText = "コインローファー";
		}
		HtmlElement button = wb0.Document.GetElementById("acHdSchBtn");
		button.InvokeMember("click");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}







```

以上
filter logic のまとめ

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



# NPSP

+ [Pitfalls with filter logic and report types.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifoNv)

:::note
The brilliant women in the Nonprofit AMA suggested adding a $0 payment to all in-kind donations as a work-around. It is lovely to know I wasn't doing anything wrong!
:::

# トレイルヘッド

+ [Filter Your Report : trailhead 商談](https://qiita.com/Keiji_otsubo/items/8eb54e0bb98d4126570e)
+ [Reports & Dashboards for Lightning Experience Case](https://qiita.com/Keiji_otsubo/items/b6310f455b38aa679aef)
+ [レポートの Logic Filter](https://qiita.com/Keiji_otsubo/items/12e8d53fe0a9e15cbe15)
アイコンを押してカウントアップ・カウントダウン

PowerAppsでアプリを作っていると
**カウントアップ・カウントダウン**
みたいな機能を付けたくなりますよね。
そんな時に使う方法を紹介します。

まず、下記の様にコントロールの設置・設定をします。
<img width="200" alt="コントロール配置" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/9f7f4aa5-73f3-92d7-62ab-a62d2c679073.png"><img width="200" alt="コントロール配置" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/68d22c9f-5ae9-b4b7-1453-872113115de6.png">

```
①TextInputコントロールを1つ、Iconコントロールを2つ配置
②TextInputコントロールのプロパティの`書式`を数値に変更
③TextInputコントロールのDefaultプロパティをコンテキスト変数locNumberと置く
```

この変数を増減させてカウントアップカウントダウンしたいので
それぞれの`Icon`コントロールの`OnSelect`プロパティを次の様にします。
```
アイコン1:UpdateContext({locNumber:locNumber+1})
アイコン2:UpdateContext({locNumber:locNumber-1})
```

これだけでも良いのですが、
直接数字を入力する事も想定すると

`TextInput`コントロールの`OnChange`プロパティを下記の様にします。
```
UpdateContext({locNumber:Value(Self.Text)})
```
これだけでも十分なのですがさらに丁寧に
コンテキスト変数locNumberの初期値を設定する為に
`Screen`コントロールの`Onvisible`プロパティを下記の様にします。
```
UpdateContext({locNumber:0})
```
これでなんかいい感じにカウントアップ・カウントダウン
手動入力ができる様になります。
Fletによる実機テスト

# Fletで開発すると・・・
実機テストも簡単に行える。
対象は、iOS、android、webブラウザ、デスクトップアプリ(Windows、Linux)
なんでもありでした。

# Android版Fletアプリ
以下のアドレスから、Android端末にアプリを入れる
https://play.google.com/store/apps/details?id=com.appveyor.flet&hl=ja

Flet run appname --android
で起動すると、接続先へのQRが表示されるのでAndroid端末でURLを読み取るとAndroid用のFletアプリが起動される。

# iOSアプリ版Fletアプリ
以下のアドレスから、iOS用アプリを入れる
https://apps.apple.com/us/app/flet/id1624979699


Flet run appname --ios
で起動すると、接続先へのQRが表示されるのでiOS端末でURLを読み取るとiOSアプリ用のFletが起動される。

# ブラウザ
特に何もいらない！
Flet run appname -w
でブラウザが起動される
表示されている、URLにブラウザからアクセスすれば複数人の動作もOK

# デスクトップアプリ
特に何もいらない！
Flet run appname

これを(テスト用アプリ)使ってしまえば申請不要なので・・・
野良アプリは増えるかも・・・
社内などで使用するならこれでOK・・・
（あくまでもテストの話ですよ）
[番外編 #6] 映像編集② モンタージュ理論

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
皆様お疲れ様です。
:movie_camera: 今回の **「番外編」** では前回の続きで<font color="c00000"> **「モンタージュ理論」** </font>について紹介いたします。

前回の投稿を見たい方はこちらをご覧ください！

https://qiita.com/aoiku/items/06059f13aa6782cb7ab8

## モンタージュ理論
そもそも「モンタージュ」とはフランス語:flag_cp:で <font color="c00000">**「組み立て」**</font>という意味であり、そこから転じて<font color="c00000">**「編集」**</font>という意味を持った言葉になります。

:::note info
すなわちモンタージュ理論は日本語に直すと<font color="c00000">**「編集理論」**</font>です
:::

### モンタージュ理論の歴史
これは、1920年代から30年代のソビエト映画界において生まれた理論であり、<font color="c00000">**レフ・クレショフ**</font>が**最初の提唱者**であると言われています。そのクレショフのもとで学んだセルゲイ・エイゼンシュテインが最初に発表した **「戦艦ポチョムキン」** はその最初の集大成です。

https://moviewalker.jp/mv13777/


レフ・クレショフは俳優のクローズアップショットの前に、異なった3**つのカット（死体、料理、赤ちゃん）** を挿入し、観客の反応を調査することで、全く同じ俳優のクローズアップショットの<font color="c00000">**意味が違って見える**</font>ことを実証しました。
![bangai0502_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/bc54d32d-6b51-f58a-1a4f-1fd624190edd.png)


:::note info
モンタージュ理論は、現在においても映像編集の基礎理論とされ、映像編集や演出を行う上で最低限知っておきたい要素であり、実際の映像作品でも実践されています。
:::

----
 **モンタージュ理論** の基本は、カットが<font color="c00000">**本来もっていなかった意味を付与**</font>したり、<font color="c00000">**つなぎ方によってカットの意味を変える**</font>といように、カットのもつ意味をつくり、<font color="c00000">**映像の文脈を作り上げる**</font>ことになります。

:::note info
言い方を変えるとするならば<font color="c00000">**「映像の文法」**</font>ともいえるでしょう
:::

１つ１つのカットが**単語**であり、そのつなぎ合わせ方、つまり**文法**によって、**全体の意味が決定される**という考え方ですね。

## おわりに
ちょっとしたまとめになります。

:::note info
モンタージュ理論は日本語に直すと<font color="c00000">**「編集理論」**</font>である
:::
:::note info
モンタージュ理論の基本は言い方を変えると<font color="c00000">**「映像の文法」**</font>ともいえる
:::

最後まで読んで頂きありがとうございました！
>> 参考
[CGクリエイター検定エキスパート　映像編集](https://www.cgarts.or.jp/books/cc/)
[クレショフ効果とは？「無意識の関連付け」がもたらす影響とマーケティングとの関係](https://x.gd/wzg3T)

>>過去の番外編はこちら
[#1 ばねのような動きを再現](https://qiita.com/aoiku/items/19cf51605f80c60d4004)
[#2 関節を動かしてみた](https://qiita.com/aoiku/items/c500c4cb65499d11027a)
[#3 軸回転をしてみよう](https://qiita.com/aoiku/items/24a63ba63349c07a235c)
[#4 イマジナリーライン](https://qiita.com/aoiku/items/586f74ac39e1c9e3f816)
[#5 映像編集① 目的]()
インフラエンジニアとしての初めての出張体験

お疲れ様です！今年4月にインフラエンジニアに転職し、参画して5ヶ月経ちました。
突然ですが出張に行ったので、今回はその出張の内容と、私が経験したことを機密事項に触れない範囲で共有したいと思います。

## 出張が決まるまでの経緯
突然出張先の上長から「そろそろ出張こよか？明日から来てくれ〜」というチャットが届きました。前々から出張あるかもとは聞いていましたが、、明日から？！え？？という展開。
いつも突然仕事を下さる上長なので慣れてましたが、流石に出張は驚きました。
しかも何をやるのか聞いてみたら「来てからのお楽しみ💕」という返答に慄きました。（お楽しみと言われた仕事は死にかけるフラグ）
ついに出張デビュー！という事で周りの方がここのホテルは安くて快適だった！とか、出張先の現場のセキュリティでここから入れないから誰さん呼べだの色々助言を頂きつつ、向かいました。

## 出張先の状況
出張先に着いてみると、そこには大量のネットワーク機器が並んでいました。なんとなく見覚えのある構成が目の前に展開されており、なんと私が意味不明なまま、言われるがままに作成した設計図が実際の構築物になっていたのです。自分が関わったプロジェクトが目の前で動いているという感動と同時に、責任の重さを感じました。

## 果たして私の役割は？
この出張は、私が作成した設計に基づいて構築された環境のテストを行うためでした。パケットトレーサーでチマチマといじっていたレベルのものではなく、実際のネットワーク構成の確認や性能テストを行うものでした。なんと生まれて初めて動かす実機が、お客さんに提供する本番機だったので、過去にあったお楽しみと言われた仕事を思い出し戦慄しました、、そこでやっと会えた上長は「いけるやろ〜頑張れ⭐️」と言われてやるしかなかったのです。。。

## テストを通じて得た学び
1. 手順書作りと情報共有

まず初日に1日かけて作業手順を教わりました。
私と同じ仕事をする方が4名いて、その方々と教わったのですが、意味不明の連続。
フレンドリーなメンバーだったので皆でわからないところ、わかるところを共有して手順書を作りました。
私はここ理解できたけど、ここは理解できなかった、この用語はなんだろう？などお互い共有出来たのは安心感がありました。あと自分の意見や見解を言って良いんだ！という自信につながりました。
教わった手順の中でこの作業を先にやった方が良くない？先に中身書き換えて機器に入れた方がこの作業いらないのでは？など現場の人も確かにそうした方が良いかも！となる場面もあり、業務効率化のためにも思った事は言った方が良いです。

前回の記事で手順書を作りましたが、手順書は複数の人で作れば作るほど、良いと思います。人間はあまりにも自分視点です。
多面的に作業をとらえるためにも、多くの人に共有、推敲していただきましょう。
今回はサーバー側の人がいた事が大きな学びでした。
普段はコマンド間違えてもあまり問題がなかったり、間違えたら最初からやれば大丈夫！ということが多かったのですが、サーバーの方は間違えたら死ぬ事が多いから、特定の人がわかる書き方は絶対に無し！暗黙の了解を絶対許さない！というスタンスでした。
適当にメモ書いとけば行ける！という人と暗黙の了解は絶許な方が居て、絶許な方本当に有難いです。
諸悪の根源は言葉が足りないに尽きます。

前回の手順書作りの記事はこちら

https://qiita.com/prelude_op3-2/items/ae8caed334f47b93b007

2.与えられるものが正解だとは限らない

初日は手順説明、手順書作成でなにも成し遂げられず、何しにきたんだろうか、、皆さんが親切だった、、で終わりましたが、2日目からはバリバリ作業をしました。

与えられたミッションは、構築した小規模ネットワークに擬似的にルーター、スイッチを接続して、上手く疎通できるか？抜栓した時のVLANの挙動、小規模ネットワークの上にあるボス機器と疎通できるか？というテストでした。
結線して、ルーター、スイッチに構築データを入れて、VLANの確認までしたところで躓きました。
なぜかボス機器にpingが届かないのです。
コマンドも間違えてない、入れた構築データの版はあってるし、結線も間違ってない、何が間違ってんだ？？となり、なんでも教えてくれるプロパーのお姉さんに頼んだら色々弄りながら頭を悩ませてました。
結果構築データの版は合ってるけど、構築データ自体が間違っていた事がわかったのですが、ここでつまづいたならばどこが間違っているのか？与えられた構築データは全て合っていると思い込んでいたのでずっと自分の工程が間違っていると考えてしまい、報告するまで時間がかかってしまいました。
また、自分で書いた設計図なのに理解出来てないのもあり、構築データがおかしいとは考えられなかったのも良くなかったです。
「当たったタイプが良くなかっただけだし、最初は誰も気づけない。やりながら覚えるもんや！！」と言ってもらえましたが、次の出張では自分で書いた設計図を理解して、テストを完走したいです。

## 最後に
初めての出張で何か成し遂げた訳ではないのですが、何かに納得はできました。
実際にネットワークとは結線、抜栓して、挙動を確認するもので、Tera Termやパケトレの画面の中を見ているだけではダメです。
プログラミングはやった結果がわかりやすくて、納得しやすいなと最近思います。
ネットワークは全体像が掴みづらく、終始何してんのかわかんないに陥るのですが、繋げたらアップした！という体験はとても大事で、これが網目のように張り巡らされてるんだ！土台じゃん！と一気に立体的に思えてきます。
基礎的な事が知りたい！ネットワークに納得してから色々やりたい！と思った私にはとても良い環境です。また、こんなにも初心者なのにとりあえずやらせて貰えることに感謝しかありません。
まだまだ出張に行くのでムキムキになって帰りたいと思います！！
ここまでお読みくださりありがとうございます！
アジャイル型開発における未完成の責任　東京地判令3.11.25（平30ワ25117）

請負型アジャイル開発は双方が開発に熟知して、相互に協力し合う事が重要です。
今回は片方がお金だけ出して、よく理解せず丸投げしてしまい訴訟まで発展してしまいました。

# 本文の記事
アジャイル型開発における未完成の責任　東京地判令3.11.25（平30ワ25117） - IT・システム判例メモ
https://itlaw.hatenablog.com/entry/2024/10/20/141111



以下に、X（発注者）とY（ベンダ）がそれぞれ注意すべきことや取るべき行動を箇条書きで示します。

# X（発注者）がするべきだったこと、注意すべきこと
- **仕様の明確化**: 開発前に具体的な仕様をしっかりと明確にし、合意を得ること。
- **進捗管理の徹底**: 定期的に進捗状況を確認し、必要に応じて仕様や要件を見直すこと。
- **コミュニケーションの強化**: ベンダとのコミュニケーションを密にし、意見や懸念を積極的に共有すること。
- **リスク管理**: 開発過程でのリスクを認識し、適切に管理するための計画を策定すること。
- **契約内容の理解**: 契約内容や条件について十分に理解し、不明点を解消すること。

# Y（ベンダ）がするべきだったこと、注意するべきだったこと
- **仕様の提案と確認**: 提供するソフトウェアの仕様について、発注者に具体的な提案を行い、確認を取ること。
- **追加費用の事前説明**: 追加開発が必要な場合、早期にその旨を発注者に説明し、合意を得ること。
- **プロジェクトマネジメントの強化**: 定期的な進捗報告やフィードバックを行い、発注者との認識を一致させること。
- **リスクの共有**: プロジェクトにおけるリスクを発注者と共有し、共同で解決策を考えること。
- **文書化の徹底**: 重要なやり取りや合意事項を文書化し、双方で確認することでトラブルを防ぐこと。 

これらの行動を取ることで、双方のリスクを軽減し、円滑なプロジェクト進行が期待できるでしょう。 

# 参考

[1] SPIRAL ナレッジサイト - 『要求定義』システム開発で設計前にすべきこと① (https://knowledge.spirers.jp/article/design/detail/9242)
[2] 政府CIOポータル - 6 非機能要件の定義 (https://cio.go.jp/sites/default/files/uploads/documents/jissen-guide_5.docx)
[3] デジタル庁 - デジタル・ガバメント推進標準ガイドライン実践ガイドブック (https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/e2a06143-ed29-4f1d-9c31-0f06fca67afc/d85eeb55/20240605_resources_standard_guidelines_guideline_05.pdf)
[4] 情報サービス産業協会(JISA) - プロジェクト健全性評価指標 利用ガイドライン (https://www.jisa.or.jp/LinkClick.aspx?fileticket=g%2FW%2FDYzWQzY%3D&tabid=66) 

# 製作
https://wrtn.jp


# 補足
アジャイル開発というのは
マラソンのように、スタート地点からゴールに到達するというものではなく、
**螺旋階段**のように機能を作ってからそれを確認をしてもらい、次の**螺旋階段**を登っていくというイメージです。

なので、発注者とベンダが重厚なコミュニケーションが必要となってきます。
Pythonで手書き数字を識別する人工知能を簡単につくってみた。＃Pythonの練習

# 事前準備

**手順1：4つのライブラリをインストール**

・scikit-learn:機械学習のライブラリ
・scipy:scikit-learnが計算するためにつかう科学計算のライブラリ
・numpy：画像データを数値リストに変換するためにつかう数値計算のライブラリ
・matplotlib:数値リストを画像として出力する
```
py -m pip install numpy
py -m pip install scipy
py -m pip install scikit-learn
py -m pip install matplotlib
```
# 学習用のデータを読み込む

## 学習用データを確認しよう
今回は教師あり学習に含まれるため、
学習をさせるには、手書きの数字と答えのペアデータが大量に必要ですが、sklearnにはすでに学習用のデータがあるため、これを使います。

では、どのような学習データが入っているのか、見てみましょう。

```digitsData1.py
import sklearn.datasets

digits = sklearn.datasets.load_digits()

print("データの個数＝",len(digits.images))
print("画像データ＝"+"\n",digits.images[0])
print("何の数字か＝",digits.target[0])
```

＃datasets.load_digits() は、Scikit-learnライブラリで提供されている関数で、手書き数字（digits）のデータセットをロードするために使用します。

#### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873642/d24dfaed-60f5-ae1a-bca4-66fdc1c88b30.png)

#0から9までの手書きの数字が8×8ピクセルの画像として提供されておｒ、0が一番明るい色になります。

## matplotlibを用いて、数値データを画像化しよう

```digitsImage1.py
import sklearn.datasets
import matplotlib.pyplot as plt

digits = sklearn.datasets.load_digits()

plt.imshow(digits.images[0], cmap="Greys")
    #数値データをグレーの濃淡画像にする。
plt.show()
    #作ったがぞうを表示する。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873642/b0fe2485-2f51-d4b3-04bc-0e7e7ca5b62e.png)

# 数値予想プログラムを作ってみよう
プログラムの内容は以下になります。
imageToData関数は数字の画像を数値リストに変換し、それを受け取ったpredictDigits関数がどの数字化を予測します。
```predictDigits.py
import sklearn.datasets
import sklearn.svm
from PIL import Image  # Imageモジュールをインポート
import numpy

# 手書き数字のデータセットを読み込む
digits = sklearn.datasets.load_digits()

# 画像ファイルを数値リストに変換する。
def imageToData(filename):
    grayImage = Image.open(filename).convert("L")  # 画像をグレースケールに変換
    grayImage = grayImage.resize((8, 8), Image.LANCZOS)  # LANCZOSを使用

    numImage = numpy.asarray(grayImage, dtype=float)
    numImage = 16 - numpy.floor(17 * numImage / 256)
    numImage = numImage.flatten()

    return numImage

# 数字を予測する
def predictDigits(data):
    clf = sklearn.svm.SVC(gamma=0.001)
    clf.fit(digits.data, digits.target)

    n = clf.predict([data])
    print("予測=", n)
data = imageToData("2.png")  # ここで画像を指定
predictDigits(data)  # 予測を実行
```

# 例: 画像を読み込んで数字を予測する
今回は無料アプリのMediBang Paintを使用し、下図のようなpng画像を自分で書き、実際に予測できるか見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873642/5ea78690-791b-ec5b-29d2-583e8dd0c212.png)

結果は、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873642/dfa32265-730f-f6aa-e2f2-7244be03bc09.png)

***きちんと予測できてますね！***

今回は以上です！ありがとうございました！
2024/10/21主にITとかセキュリティの記事

【CVE-2024-9201】Prestashop用seurにSQLインジェクションの脆弱性、緊急度の高い対応が必要(10/18)
https://xexeq.jp/blogs/media/topics16308

OMAがサイバーセキュリティインシデントを報告、業務は影響なしと保証(10/19)
https://jp.investing.com/news/company-news/article-93CH-899167

日本無線のアカウント乗っ取り事件に学ぶサイバーセキュリティ強化策
https://cybersecurity-park.com/3191/

ベトナム企業がサイバーセキュリティギャップを埋める取り組みとは？(10/18)
https://news.3rd-in.co.jp/article/5b203f3c-8d49-11ef-9948-9ca3ba083d71#gsc.tab=0

EV車狙う、QRコード詐欺(クイッシング)が増加中(10/19)
https://news.mynavi.jp/techplus/article/20241019-3047075/

WEP(Wired Equivalent Privacy)とは？意味をわかりやすく簡単に解説(10/18)
https://xexeq.jp/blogs/media/it-glossary2499

FBIが「ビットコインETF承認」の偽ポスト投稿者を逮捕(10/18)
https://crypto-times.jp/news-fbi-fake-btc-etf/

WEP64とは？意味をわかりやすく簡単に解説(10/18)
https://xexeq.jp/blogs/media/it-glossary2501

ブラウザのパスワード保存機能、実は危険！？Keeperで安全管理を始めよう(10/18)
https://qiita.com/pdc-ujoy/items/cfea51762b37194d714f

米国 CISA ソフトウェア部品の透明性の枠組み：共通ソフトウェア部品表（SBOM）の確立（第3版） (2024.10.15)(10/19)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/10/post-8815ed.html

【最新】ホワイトハッカーになるためには(10/18)
https://zenn.dev/qitaaa/articles/eeb5228dae2d61

WEPキーとは？意味をわかりやすく簡単に解説(10/18)
https://xexeq.jp/blogs/media/it-glossary2502

WEP128とは？意味をわかりやすく簡単に解説(10/18)
https://xexeq.jp/blogs/media/it-glossary2500

米国 CISA FBI 意見募集 「製品セキュリティの悪き慣行」(10/19)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/10/post-0493ce.html

総選挙を前に「日本企業を狙った」サイバー犯罪がさらに活性化...特に「狙われる」業界とは？(10/19)
https://news.yahoo.co.jp/articles/bf9609eec51b02d48b0b3c7c259662a813a01cf6?source=rss

Web分離とは？意味をわかりやすく簡単に解説(10/18)
https://xexeq.jp/blogs/media/it-glossary2498

NymVPN vs VPN vs Tor vs I2P vs dVPN: それぞれを比較してみよう(10/18)
https://qiita.com/pseudonym2/items/3212f4873622b588636a

「グレート・ファイアウォールを突破せよ」　中国に「真相」を(10/18)
https://www.epochtimes.jp/2024/10/257729.html

【2024年令和最新版】エンジニアが読むべき名著 【ハッカー精神】(10/19)
https://zenn.dev/qitaaa/articles/2ae5f31270b9ee

ロシア系ハッカー集団 日本の自治体サイトなどサイバー攻撃か(10/18)
https://www3.nhk.or.jp/news/html/20241018/k10014613281000.html

YouTubeが「カメラで撮影」表示機能を開始、動画の真正性を視覚化しユーザーの信頼性向上へ(10/18)
https://xexeq.jp/blogs/media/topics16456

パスワードを忘れた。こんなシーンから解放されます！ パスワードの自動入力と暗号化保存デバイス「パスポケ」(10/19)
https://ascii.jp/elem/000/004/228/4228711/?rss

ラトビア大統領「隣国ロシアの暴力工作が激化」
本社コメンテーター　秋田浩之(10/19)
https://www.nikkei.com/article/DGXZQOCD1766F0X11C24A0000000/
【Flutter】大量のimport文を一つにまとめる

# 概要

Flutterの開発を進めていると、dartファイルの冒頭に記述するimport文が多くなってしまうことがあります。
また、複数のdartファイルに同じimport文を組み込んでいる場合、追加や削除などの同期をとるのが面倒になります。

![スクリーンショット 2024-10-21 2.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908792/376577a5-0292-32ac-e92a-3d17bd629db6.png)

# 解決策
解決策として、「import」でなく「export」を用いる方法をご紹介します。
例として、「main.dart」に「example1.dart」〜「example3.dart」の３つのファイルをimportしたい場合を考えます。

### Before

```dart:main.dart
import 'example1.dart';
import 'example2.dart';
import 'example3.dart';
```

通常はこのように３行の記述が必要です。

### After

```dart:main.dart
import 'barrel.dart';
```
```dart:barrel.dart
export 'example1.dart';
export 'example2.dart';
export 'example3.dart';
```

mail.dartとは別に、importをまとめるファイル（今回はbarrel.dart）を作成し、そこにexport文でexample1〜3を記述しました。こうすることで、main.dartではexample1〜3をimportしたのと同じ意味になります。
main.dartの３行を１行に短縮することができました。


# やってしまいがちなミス


```dart:main.dart
import 'barrel.dart';
```
```dart:barrel.dart
import 'example1.dart';
import 'example2.dart';
import 'example3.dart';
```

barrel.dartにexportでなくimport文を記述してしまうとエラーになります。
dartではファイルをまたいで二重でimportすることはできません。
docker composeのインストールでこけた話

<h2>環境</h2>

windowsOS
gitbash

<h2>行った操作</h2>

`pip`の存在確認を兼ねてバージョンを確認

```bash
pip -V
```

`docker compose` のインストール

```bash
pip install docker-compose
```

ここで以下のエラーが発生

```bash
~ほげ長いので省略~
Collecting docker-compose
Using cached docker_compose-1.29.2-py2.py3-none-any.whl.metadata (4.7 kB)
Collecting PyYAML<6,>=3.10 (from docker-compose)
Using cached PyYAML-5.4.1.tar.gz (175 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... error
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> [65 lines of output]
running egg_info
writing lib3\PyYAML.egg-info\PKG-INFO
writing dependency_links to lib3\PyYAML.egg-info\dependency_links.txt
writing top-level names to lib3\PyYAML.egg-info\top_level.txt
```

`PyYAML`のインストールで失敗
<h2>対処法</h2>
調べたところ以下2つのバージョンがダメそうなのでそれぞれアップデート、再インストールしてみる

（1）`setuptools`のアップデート
```bash
pip install --upgrade pip setuptools  setuptools　
```

（2）`PyYAML`の再インストール
```bash
pip install PyYAML==5.4.1 --no-build-isolation
```

再度`docker compose`をインストール

```bash
pip install docker-compose
```

<b>成功！</b>

<h2>終わりに</h2>

バージョン管理を怠ったに尽きる。
同じようなエラーの場合もバージョンに依存していることが多いと思うので、再インストール、アップグレードしてみて下さい

<h3>参考</h3>

[Install Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
[Docker Compose のインストール](https://docs.docker.com/desktop/install/windows-install/)
[PyYAML Documentation](https://pyyaml.org/wiki/PyYAMLDocumentation?form=MG0AV3)
[Python Packaging User Guide](https://packaging.python.org/en/latest/?form=MG0AV31)
terraform apply 実行時、「Still destroying...」が出続けて完了しない問題に対するトラブルシューティング

# 用語
IGW: インターネットゲートウェイ

# 注意
そもそも、`terraform apply`を実施する前に、state コマンド([tfmigrate](https://github.com/minamijoyo/tfmigrate))を適切に使っていれば、このようなエラーは起きないです。

# 目的
「Still destroying...」のエラーが無限に続くときの対処法を知る。


# 結論
下記を順番に実行する。
**(1)** `terraform apply`を強制終了する。
**(2)** DynamoDB のロックを解除する。
**(3)** `terraform refresh`を実行する。 ※ 今回は必要なかったが、強制終了したので、インフラ操作が一部行われたものの、それが tfstate に反映されていないという事態が起きてしまっている可能性があるため、同期しておく。また、そのような事態が起きたとき、これで解決できるという保証はないため、その時は、別のトラブルシューティングを始めてください。
**(4)** `tfmigrate apply` を実行する。

# 説明
## エラーを見てみる。
下記のように、IGW を新しいのに置き換えるという実装をした。新しい IGW はモジュールで読み込んでいる。

**変更前**
``` aws_internet_gateway.tf
resource "aws_internet_gateway" "tf_my_igw" {
  vpc_id = aws_vpc.tf_my_vpc.id

  tags = {
    Name = "MyInternetGateway"
  }
}
```
``` aws_route.tf
module "default_route" {
  source                 = "./modules/route"
  route_table_id         = module.rt_defalut.route_table_id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.tf_my_igw.id
}
```
**変更後**
``` aws_internet_gateway.tf
module "igw_normal" {
  source = "./modules/internet_gateway"
  vpc_id = aws_vpc.tf_my_vpc.id
  name   = "MyInternetGateway"
}
```
``` aws_route.tf
module "default_route" {
  source                 = "./modules/route"
  route_table_id         = module.rt_defalut.route_table_id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = module.igw_normal.internet_gateway_id
}
```
そして、`terraform apply`を実施すると、下記の「Still destroying...」が無限に表示される。
```
Plan: 1 to add, 1 to change, 1 to destroy.
aws_internet_gateway.tf_my_igw: Destroying... [id=igw-XXX]
module.igw_normal.aws_internet_gateway.m_igw: Creating...
aws_internet_gateway.tf_my_igw: Still destroying... [id=igw-XXX, 10s elapsed]
aws_internet_gateway.tf_my_igw: Still destroying... [id=igw-XXX, 20s elapsed]
...
```

## エラーの原因
`terraform apply`を実行すると、IGW を置き換えるときに、IGW の削除 > IGWの作成の順番で行われるが、IGW は VPC 内の Public なリソースに依存されているため、削除できないのが原因である。

## 対処法
(1)
`terraform apply`を強制終了する。
(2)
DynamoDB のロックを解除する。(tfstate をリモートで管理している前提)
下記のようにコマンドでIDを取得してもいいが、直接AWSコンソールに見に行ってもOK。
```
$ aws dynamodb scan --table-name terraform-my-lock-table --query "Items[*].Info.S" --output json | jq -r '.[] | fromjson | .ID'
XXX
$ terraform force-unlock -force XXX
```
(3)
下記のマイグレーションファイルを用意して、`tfmigrate apply` を実行してから、`terraform apply`を実行する。
``` tfmigrate/20241020182000_move_igw_to_module.hcl
migration "state" "move_internet_gateway" {
  actions = [
    "mv aws_internet_gateway.tf_my_igw module.igw_normal.aws_internet_gateway.m_igw"
  ]
}

```
【Ruby】スクリプト言語とコンパイル言語

# はじめに
本日は前回のオブジェクト指向に続きスクリプト言語とコンパイル言語について説明していきたいと思います。
聞いたことはあったが具体的にそれが何を指すのかはまったくわかっていなかったので、ほかのタイプの言語の違いに触れながら説明していきます

# スクリプト言語とは
プログラミング言語は大きく分けてスクリプト言語とコンパイル言語の2つに分けられます。
スクリプト言語とは、実行時に逐次的※に命令を処理する言語のことを指します。
※逐次的というのは順を追ってプログラムが実行されることを指します
`Ruby`や`Python`、`JavaScript`などが代表的なスクリプト言語です。
これらの言語はインタプリタと呼ばれるプログラムによって1行ずつ読み取られ、逐次実行されます。
スクリプト言語の特徴は以下の通りです。
* プログラムのソースコードが逐次的に解釈され、その場で実行するインタプリタ型を採用
* コンパイルを経ずにコードを書いてすぐに実行できるため、スクリプト言語は開発スピードが早い
* コードを実行しながら動作確認をしやすい環境（例: `Ruby`の`IRB`や`Python`の`REPL`）が提供されることが多く、デバッグが簡単

`Ruby`や`Python`のような人気の言語がスクリプト言語といわれています。
続いてメリットとデメリットについてみていきましょう
### スクリプト言語のメリット
1. 逐次的に実行できるため、コードを書いたらすぐにテストでき、素早く結果を確認できる
2. インタプリタが環境さえ揃っていれば、異なるプラットフォームでも同じコードが実行できるため、開発者はOSの違いを気にせずにプログラミングが可能(柔軟性が高い)
3. 簡単な文法で、初心者がプログラミングを学ぶのに適している言語が多い
### スクリプト言語のデメリット
1. インタプリタが逐次的に命令を解釈するため、コンパイル済みのプログラムに比べて実行速度が劣る
2. コンパイル言語と異なり、実行時に初めてエラーが発生することが多いため、大規模なプログラムでは予期しないエラーが途中で起きる可能性がある
3. 高度な最適化やパフォーマンスが要求される大規模なシステムでは、スクリプト言語の実行速度やメモリ使用量の問題がネックになることがあるため、大規模プロジェクトには不向きな場合もある


# コンパイル言語とは

一方コンパイル言語は、ソースコード全体を一度に機械語に変換してから実行する言語です。`C言語`や`Java`,`Fortran`などがこれに該当します。
これらの言語はコンパイラと呼ばれるプログラムによってソースコードが機械語（実行ファイル）に翻訳され、その実行ファイルがコンピュータ上で実行されます。
大学のときに`Fortran`を使っていたことがあるのですが、コンパイルエラーによくなっていたのでとても懐かしく感じますｗ
なお、コンパイル言語の特徴は以下の通りです
* 実行前に一度コンパイラを通してソースコードを機械語に変換するので、実行時の速度が高速になることが多い
* コンパイル時にプログラム全体を解析するため、タイポや構文エラーなどが事前に検出されエラーの検出が早くなる
* コンパイル後は、独立した実行ファイルが生成されるため、他の環境に移植しやすい

つづいてコンパイル言語のメリットデメリットを見ていきましょう

### コンパイル言語のメリット
1. 実行速度が速い
これは特徴にも書いてあるので重複しますが、一覧で見れるように書いています。
2. 独立した実行ファイルを作成できる
これも特徴にかいてあるメリットです。
これにより、依存ライブラリやインタプリタがインストールされていない環境でも、プログラムを実行可能です。
3. リソース効率が良い
コンパイルされたプログラムは、直接ハードウェアで実行される機械語に変換されているため、メモリやCPUの使用効率が良いです。
特に、大規模なシステムやリソース制約の厳しい環境では、この効率性が重要になります。
4. 事前にエラーを検出できる
コンパイラはプログラム全体を事前に解析し、構文エラーや型の不整合、未定義の変数などのエラーを実行前に検出します。
これにより、プログラムの品質を事前に確認できるため、実行時にエラーが発生しにくくなります。
特に、大規模プロジェクトでは、コードの整合性を保つために、コンパイル時のチェックが有効です。

### コンパイル言語のデメリット
1. コンパイル時間がかかる
プログラムを実行する前に、ソースコード全体をコンパイルする必要があるため、大規模なプログラムではコンパイルに時間がかかることがあります。これにより、コードを書いた後のフィードバックサイクルが遅くなる可能性があります。
また、開発中に頻繁にコードを変更する場合、毎回コンパイルが必要になるため、インタプリタ型の言語に比べて反復的な開発に向いていない部分もあります。
2. プラットフォーム依存性
コンパイルされた実行ファイルは、特定のプラットフォームに依存することが多いです。
例えば、Windowsでコンパイルされた実行ファイルは、LinuxやmacOSではそのまま動作しません。このため、複数のプラットフォームで動作させるには、各プラットフォーム向けに再コンパイルする必要があります。
移植性の確保が必要なプロジェクトでは、この点が負担となることがあります。


# 結局どっちがいいの？
どちらかが優れているからこっちを使おうというよりは、ケースに応じて使い分けるのがいいのかと思います。
アプリケーションという面でスクリプト言語とコンパイル言語を比べてみましょう。
スクリプト言語はWeb開発や自動化に適しています。
Webサーバーやバックエンドの開発では、`PHP`、`Python`、`Ruby`などのスクリプト言語がよく使われます。また、システム管理や自動化スクリプト、データ解析などのタスクにもスクリプト言語がよく利用されます。
例: Webサイトの開発（`Ruby on Rails`、`Django`、`Node.js`）、サーバーサイドスクリプト、データ解析スクリプトなど。

一方でコンパイル言語はシステム開発やハードウェアに近い部分で使用されることが多いです。
低レベルの制御が必要なシステム（例: オペレーティングシステムやデバイスドライバ）では、`C言語`や`C++`のようなコンパイル言語が適しています。
また、高パフォーマンスが求められるゲーム開発やハードウェア制御もコンパイル言語が強みを発揮します。
例: 組み込みシステム、ゲーム開発、OS開発など。
Montreal Forced Alignerを使って音素アライメントをしてみた

# Montreal Forced Alignerを使って音素アライメントをしてみた

## はじめに

研究に使用しているデータセットに **音素ラベル** が含まれていなかったため、**Montreal Forced Aligner (MFA)** を使って音素アライメントを試してみました。

データセットには、各発話に対応する `.wav` ファイルとその発話内容`.txt`が含まれていますが、音素ラベルが付与されていないため、MFAで音声データとテキストデータを基にアライメントを試してみました。




## 環境構築

環境構築には、GitHubで提供されているDockerfileを使用しました。

https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner
```bash
git clone https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner.git
cd Montreal-Forced-Aligner
docker build -t mfa-aligner .
```

docker runの際にはデータセットのディレクトリをマウントします。



## 音素辞書の作成

音素アライメントを行うには、まず音素辞書が必要です。これはg2p（Grapheme-to-Phoneme）モデルを使って作成しました。`.wav`ファイルと同じディレクトリに発話ラベル`.txt`ファイルも配置します。音声`.wav`に対する発話ラベル`.txt`のファイル名は同じになるようにします。

以下のコマンドを使用して、英語のg2pモデルをダウンロードし、音素辞書を作成しました：

```bash
# g2pモデルのダウンロード
mfa model download g2p english_us_mfa

# 音素辞書の作成
mfa g2p /path/to/wav english_us_mfa /output/path/hoge.txt
```

## 音素アライメントの作成

音素辞書と音声ファイルを用意したら、次は実際の音素アライメントを行います。以下のステップで進めました：

1. 音響モデルのダウンロード：

```bash
mfa model download acoustic english_mfa
```


2. 音素アライメントの実行：

```bash
mfa align /path/to/wav /hoge.txt english_mfa /output/forcedalign
```

このコマンドでは、先ほど作成した音素辞書（`hoge.txt`）を使用しています。

## まとめ
![アライメント結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824615/ba31a4a2-de6f-0bcc-18f4-8e64c7ef6152.png)


Montreal Forced Alignerを使用することで、既存のWAVファイルに対して音素アライメントを行うことができました。
Pythonで理解する微分の基本 - 数値微分の実装

微分は、変化の速度を測る重要な数学的概念です。物理やデータ分析、機械学習など、幅広い分野で利用されるため、理解しておきたい重要なテーマです。この記事では、Pythonを使って微分の基本概念を数値的に理解する方法を紹介します。

## 微分の定義

まず、微分の定義をおさらいしましょう。関数 $f(x)$ の微分 $f'(x)$ は次の式で定義されます。

$$f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}$$

この式は、関数 $f(x)$ が $x$ の近くでどのように変化するかを示しています。今回は、この定義をPythonで数値的に実装し、視覚的に理解できるようにしていきます。

## Pythonで数値微分を実装してみる

Pythonでは、数値微分を簡単に実装することができます。関数 $f(x) = x^2$ を例に、数値微分を計算してみましょう。

### 実装コード

```python
import numpy as np
import matplotlib.pyplot as plt

# 関数f(x)の定義 (例: f(x) = x^2)
def f(x):
    return x**2

# 数値微分を計算する関数
def numerical_derivative(f, x, h=1e-5):
    return (f(x + h) - f(x)) / h

# xの値
x_values = np.linspace(-10, 10, 400)

# f(x)とf'(x)の値を計算
f_values = f(x_values)
f_prime_values = [numerical_derivative(f, x) for x in x_values]

# 結果をプロット
plt.figure(figsize=(10, 6))
# 元の関数f(x)
plt.plot(x_values, f_values, label="f(x) = x^2")
# f'(x) (微分)
plt.plot(x_values, f_prime_values, label="f'(x) = 2x", linestyle='--')
plt.title("Function and its Derivative")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()
```

### コードの説明

1. `f(x)` は、関数 $f(x) = x^2$ を定義しています。二次関数を使って、シンプルに微分の変化率を確認します。
2. `numerical_derivative(f, x)` は、関数の数値微分を計算するための関数です。微小な値 `h` を使って、微分の定義を近似的に計算します。
  、つまり 0.00001 という意味です。このような小さい h を使うことで、微分の近似をより正確に計算することができます。

ただし、h を小さくしすぎると、計算誤差（丸め誤差）が増える可能性もあります。h = 1e-5 は、多くの数値微分の場面で適切なバランスを提供する値としてよく使われます。
3. `x_values` で、-10から10の範囲のx値を生成しています。
4. `f_values` と `f_prime_values` では、関数 $f(x)$ とその微分 $f'(x)$ の値をそれぞれ計算しています。
5. 最後に、`matplotlib` を使って、元の関数 $f(x)$ と微分 $f'(x)$ をグラフにプロットしています。

1e-5 とは？
1e-5 は、科学記数法で書かれた数値表現です。これは以下を意味します：
$$1 \times 10^{-5}$$
つまり、0.00001 という非常に小さな数値を表しています。
数値微分における 1e-5 の役割
数値微分を行う際、このような小さな値を h として使用することで、微分の近似をより正確に計算することができます。
pythonCopydef numerical_derivative(f, x, h=1e-5):
    return (f(x + h) - f(x)) / h)
    
注意点
ただし、h を小さくしすぎると、計算誤差（丸め誤差）が増える可能性もあります。h = 1e-5 は、多くの数値微分の場面で適切なバランスを提供する値としてよく使われます。


### 結果

上記のコードを実行すると、次のようなグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910017/2a9f8ea7-5dcb-613a-9931-092429c1c80b.png)


* 青い線が元の関数 $f(x) = x^2$
* オレンジ色の破線がその微分 $f'(x) = 2x$

これによって、関数の傾き（変化率）がどのように変わっていくのかを視覚的に確認することができます。

## まとめ

この記事では、Pythonを使って数値微分を実装し、微分の基本概念を視覚的に理解する方法を紹介しました。微分は、機械学習やデータ分析の多くのアルゴリズムで重要な役割を果たすため、今後さらに理解を深めていきたいところです。

興味を持った方は、他の関数でも同様に数値微分を試してみてください。
Ansible Tips: blockに対するtagsなどの指定はinclude_tasksなどにおいて呼び出し先にも継承される

Ansible playbookが意図通り動かないことがあったため、原因を確認したことの備忘

# 元の処理(OK)
以下のような処理があった。
```
- name: 処理1
  foo: 
  tags: allways

- name: 処理2
  bar: 
  tags: allways

- name: 処理3
  loop: [tasks1, tasks2, tasks3]
  include_tasks:
    file: "{{ item }}.yml"
    apply:
      tags: "{{ item }}"
  tags: always
```
tags: alwaysが全タスクに付いていたので纏めようとした。

# tagsをblockで集約(→NG)
```
- tags: always
  block:
  - name: 処理1
    foo: 

  - name: 処理2
    bar: 

  - name: 処理3
    loop: [tasks1, tasks2, tasks3]
    include_tasks:
      file: "{{ item }}.yml"
      apply:
        tags: "{{ item }}"
```

しかし、--tags tasks2などにより実行処理を制御しようとしても、tasks1, tasks2, tasks3 全ての処理が実行されてしまう挙動となった。

# 原因
blockでのtagsなどの属性指定は、include_tasksなどではapplyをつけていなくとも呼び出し先にも継承されてしまう為。

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html#grouping-tasks-with-blocks

Note
All tasks in a block, including the ones included through include_role, inherit directives applied at the block level.

# 教訓: blockでinclude_tasksなどを使う際、blockの属性は子孫にも引き継がれることに注意
基数ソート(Radix Sort)

# 基数ソートとは


- 各ビットを最下位ビットから順に操作する**LSB**(Least Significant Bit)、各ビットを上位から操作する**MSB**(Most Significant Bit)が存在する
- 比較を行わない非比較アルゴリズムで、データ全体を比較するのではなく、桁ごと、ビットごとに処理していく
- 同じ値を持つ要素の順序はソート前の状態を保つため、安全なソート



# 利点

- 安定した計算時間
- ビットごとに処理されるので、要素自体の大きさに左右されない

# 欠点
- 計算量はデータのビット数に依存するため、桁数が多い場合、計算量が増える

計算量

最良時間計算量：**O(n * k)**
最悪時間計算量：**O(n * k)**
平均時間計算量：**O(n * k)**

# ソートアルゴリズム具体例

以下は、筆者が作成した基数ソートを用いた数字の並び替えプログラムです。

[GitHubリポジトリはこちら](https://github.com/koyochan/Radix_sort)

# 可視化デモ & 参考文献


![radix_sort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814349/93aa958b-eb95-d20f-202c-12c79389a9fb.gif)


https://medium.com/nerd-for-tech/putting-the-rad-in-radix-sort-d7c3be4fdbdf
【PowerApps】SharePointリストの添付ファイルを一覧表示する方法

<iframe width="600" height="400" src="https://www.youtube.com/embed/_lb9ksjTs7k?si=Ugo6_sofgmCw_0gO" 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>
↑動画でも解説しています。

## SharePointリストの添付ファイルを一覧表示する方法について
PowerApps上でリストの添付ファイルを表示しようとすると、はじめはやり方が分からなくて手間取ってしまいます。
そこで自分なりに一番簡単な方法を考えたところ、
やはりギャラリーinギャラリーが一番だという結論に至りました。

よく使う方法は、リストを垂直ギャラリーで表示し、その中に水平ギャラリーで添付ファイルの一覧を表示する方法です。

垂直ギャラリーを配置して、１つ目のアイテムを選択した状態で、水平ギャラリーを配置します。
すると垂直ギャラリーの中に、水平ギャラリーが入ります。

水平ギャラリーのItemsには
```
ThisItem.添付ファイル
```
もしくは
```
ThisItem.Attachments
```
を設定します。※環境によって列名が違います。

すると、水平ギャラリーには添付ファイルに添付されているファイルが一覧表示されるようになります。
ファイル名を表示したいならテキストラベル等を配置し、
```
ThisItem.DisplayName
```

## ギャラリーから選択して添付ファイルをブラウザで表示する方法
ボタン等からブラウザで表示するには

OnSelectプロパティに
```
Launch(ThisItem.AbusoluteUri)
```
とすれば、ブラウザでファイルを表示することができます。
このままだとOfficeファイルはダウンロードになってしまうので、
```
Launch(ThisItem.AbusoluteUri & "?&web=1")
```
とすると、Officeファイルもブラウザで開けるようになります。
私は常に & "?&web=1"を付けるようにしています。

逆にダウンロードしたい場合は、
```
Download(ThisItem.AbusoluteUri)
```
と記載します。