OmniAICreator/Qiita-1.07M huggingface dataset:
ServerlessFramework でFastAPIのAPIサーバをAWSのAPI Gateway＋Lambdaにデプロイする方法

# デプロイ手順
※FastAPIのアプリケーションがある
1. LambdaでFastAPIのAPIサーバを実行できるようにする設定をする（[Mangum](https://github.com/Kludex/mangum)）
1. [Serverless Framework](https://www.serverless.com/)でAWSにデプロイできるようにする
    - LambdaにPythonライブラリがインストールされるようにする設定をする
1. [Serverless Framework](https://www.serverless.com/) でAWSにデプロイする


## FastAPIのアプリケーションがある
app.py

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hello_world():
    return {'message': 'Hello from FastAPI'}
```

## LambdaでFastAPIのAPIサーバを実行できるようにする設定をする（Mangum）
- **Mangum**は、AWS Lambda固有のイベントとFastAPIなどのASGIアプリの間のアダプタとして機能する

```python
from fastapi import FastAPI
from mangum import Mangum

app = FastAPI()

@app.get("/")
def hello_world():
    return {'message': 'Hello from FastAPI'}

handler = Mangum(app)
```

## Serverless FrameworkでAWSにデプロイできるようにする
- LambdaにPythonライブラリがインストールされるようにserverless-python-requirements のプラグインを使う
- **Serverless Framework**の設定ファイルを記述する

requirements.txt

※fastapiは新しいバージョンだとエラーになる
```
fastapi==0.99.0
mangum==0.17.0
```

serverless.yml
```yaml
service: fastapi-apigateway-lambda
frameworkVersion: '4'

provider:
  name: aws
  runtime: python3.11

functions:
  api:
    handler: app.handler
    events:
      - httpApi: '*'

plugins:
  - serverless-python-requirements

package:
  exclude:
    - node_modules/**
```


## Serverless Framework で AWSにデプロイする
  - `serverless deploy`
※IAM権限エラーの場合は、権限を付与する
```
serverless deploy

Deploying "fastapi-apigateway-lambda" to stage "dev" (us-east-1)

✔ Service deployed to stack fastapi-apigateway-lambda-dev (79s)

endpoint: ANY - https://xxxx.execute-api.us-east-1.amazonaws.com
functions:
  api: fastapi-apigateway-lambda-dev-api (6 MB)
```

# デプロイ確認
- APIエンドポイントへリクエスト
```
curl https://xxxx.execute-api.us-east-1.amazonaws.com
{"message":"Hello from FastAPI"}
```

- AWSマネージメントコンソール
   - S3 
   - CloudFormation ※ リソースタブから作成リソースを確認できる
   - Lambda
   - API Gateway
   - CloudWatch
   - IAM ロール

# 参考
https://pgrzesik.com/posts/fastapi-lambda-serverless/
前方一致を確認し、最も長い一致を見つける

前方一致するデータを抽出するためには、filterメソッドやfirst(where:)メソッドを使って、HogeDataのnameが対象の文字列と前方一致するものを取得できます。そして、最も長い前方一致のデータを見つけるためには、前方一致するデータの中で、nameの長さが一番長いものを選びます。

以下はその実装例です

``` swift
struct HogeData {
    let id: Int
    let name: String
}

let hogeArray: [HogeData] = [
    HogeData(id: 1, name: "あいうえお"),
    HogeData(id: 2, name: "あいうえおかき"),
    HogeData(id: 3, name: "あい"),
    HogeData(id: 4, name: "かきくけこ"),
]

let targetString = "あいうえおかきくけこ"

// 前方一致を確認し、最も長い一致を見つける
if let longestMatch = hogeArray
    .filter({ targetString.hasPrefix($0.name) })  // 前方一致するデータをフィルタリング
    .max(by: { $0.name.count < $1.name.count }) { // 一番長い名前を探す
    print("一番長く前方一致するデータ: \(longestMatch)")
} else {
    print("前方一致するデータがありません")
}
```
静的ウェブサイトからREST APIを呼び出してみる

# 概要

本記事は [AWSでWebアプリを構築してみる](https://qiita.com/ti_and6id/items/9670ee60965a4d10bec7) シリーズの8回目の記事です。
前回の記事は [こちら](https://qiita.com/ti_and6id/items/895520c5d987beadefcf)。


# 本記事で作成する構成

構成自体は前回と同じですが、今回は静的ウェブサイトからREST APIを呼び出して、Webアプリケーションっぽくしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/74ae02a7-b9f2-5bd9-f921-892b23dc2991.png)

# 静的ウェブサイトからREST APIを呼び出してみる

## HTMLを修正し、S3バケットに配置する

1. [静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c) で作成した index.html を以下のように修正し、[静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c) で配置したS3のバケットにアップロードする

    ```
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <title>My Website Home Page</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
    </head>
    <body class="container mt-4">
      <h1>Welcome to my website</h1>
      <p>Now hosted on Amazon CloudFront!</p>
      <button onclick="getUsers()">Get Users</button>
      <div id="user-table">
      <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
      <script>
      async function getUsers() {
        const users = await axios({
          method: 'get',
          url: '/api/'
        }).then((res) => {
          console.log(res);
          const users = res.data;
          let usersTable = (users) => {
            const tableContentHTML = users.map((user) => {return `<tr><td>${user.name}</td><td>${user.age}</td></tr>`}).join('');
            return `<table class="table"><thead><th>名前</th><th>年齢</thead><tbody>` + tableContentHTML + `</tbody></table>`;
          }
          document.getElementById("user-table").innerHTML = usersTable(users);     
        });

      }
      </script>
    </body>
    </html>
    ```

1. [静的ウェブサイトをCloudFront経由のアクセスしか許可しないようにしてみる](https://qiita.com/ti_and6id/items/e9ef9da23b3e33116f6b) で作成したディストリビューションの一般タブを開き、「ディストリビューションドメイン名」をコピーしてブラウザで開き、アクセスして以下のように表示されることを確認する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/d7c070a9-6ea3-1a59-49db-f15577c5c83e.png)
【Error】いいねボタンが表示されない！？パーシャル、変数、理解していなかった

# はじめに

「いいね」ボタンに関する機能を実装中の事。まずはカリキュラムベースで開発を進めていました。

ある程度入力し終え、いざ、サイトを見てみるとボタンが反映されていない！？事態に。

何がいけなかったのか。
どのようにして解決したのか記事にまとめてみたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## 1：まず試したこと
以下の解決につながる1～4+6の事項を試してみましたが、はっきりとは分かりませんでした。

### 1. **CSSやJavaScriptのキャッシュ**（キャッシュクリアしても不変）

- **ブラウザのキャッシュ**: ブラウザが古いキャッシュを使用している場合があるそうなので、ページをリロードorキャッシュをクリア
- **Railsのキャッシュ**: 開発環境では、`rails s` を再起動することでキャッシュがクリアすることができます

### 2. **HTML構造の問題**（構造確認したが問題なし）

- **HTMLが正しく生成されているか確認**: 開発者ツール（F12キー）を使って、生成されているHTMLコードを確認します。`<link_to>`の生成結果が期待通りか確認してください。
- **SVGコード**: SVGコードに問題がある場合もあります。他のSVGファイルやアイコンが正しく表示されるか確認し、コードの問題がないかチェックしてください。

### 3. **Railsの設定**（問題なし）

- **リンクのパス**: `favorite_path` が正しく生成されているか確認してください。Railsのルーティング設定を再確認し、正しいURLが生成されているか確認します。
- **Turbo Streams**: `data: { turbo_method: :delete }` が正しく設定されているか確認し、関連するJavaScriptやTurbo設定に問題がないか確認してください。

### 4. **コンソールエラー**（エラーはなかった）

- **JavaScriptエラー**: 開発者ツールのコンソールタブでエラーが表示されていないか確認します。JavaScriptエラーがあると、リンクが正しく動作しないことがあります。

### 5. **サーバーログ**（見てなかった💦）

- **Railsサーバーのログ**: サーバーのログにエラーや警告が出ていないか確認します。エラーメッセージが表示されていると、問題の手がかりになります。

### 6. **コードの確認**（問題なし）

コードが正しく書かれているか再度確認します。特に次の点に注意してください：

- `method: :delete` と `data: { turbo_method: :delete }` の設定が適切か
- SVGコードが正しいか


## 2：入力したコードと開発ツールタブのElementを比較してみる
```
    <div class="my-auto">
      <%= post.user.name %>
      <%= render 'favorite_buttons', { post: @post } %>
    </div>
```
👆`app/views/posts/_post.html.erb`に入力したコードは上記。

👇開発ツールのElementは下記になっていました
```
<div class="flex items-start p-4">
    <div class="avatar m-4">
      <div class="w-12 rounded-full border border-gray-800"> <!-- 少し角が丸い黒い枠 -->
        <img alt="アバター" src="/assets/sample-1b8bd2393ac5829f0b32a2b30b019eca534679bd3a116ead2fc3d274059fb0a9.png">
      </div>
    </div>
    <div class="my-auto">
      aaa
      
    </div>
  </div>
```
なぞの空欄発見:open_mouth:

この部分を詳しく調べてみると次のようなことがわかりました。

> `render 'favorite_buttons', { post: @post }` の部分で @post という変数を渡していますが、上記のコードでは post という変数を使用しているため、一貫性が欠けているかもしれません。

## 3：解決後のコード
```
  <!-- アバターとユーザー名 -->
  <div class="flex items-start justify-between pt-4 pb-4 px-2">
    <div class="flex items-start">
      <div class="avatar m-2">
        <div class="w-12 rounded-full border border-gray-800"> <!-- 少し角が丸い黒い枠 -->
          <%= image_tag post.user.avatar_url, alt: "アバター" %>
        </div>
      </div>
      <div class="my-auto">
        <%= post.user.name %>
      </div>
   </div>
    <div class="my-auto">
      <%= render 'favorite_buttons', post: post %>
    </div>
  </div>
```

・ユーザーネームのところで`post`という変数を使用しているから、揃えないといけない
・上記に加え下記コードからも`post`にしなければいけないことは明らかでした
👇
```
<% if current_user.present? && !post.nil? %>
  <% if current_user.favorite?(post) %>
    <%= render 'unfavorite', { post: post } %>
  <% else %>
    <%= render 'favorite', { post: post } %>
  <% end %>
<% end %>
```

・`_favorite_buttons.html.erb`のパーシャルがローカル変数`post`を期待していたため、`post`を渡す必要があった。
・`@post`はパーシャルに自動で渡されるわけではないので、うまく表示されなかった

# さいごに
カリキュラムをちゃんと読めば、`post`という変数をたがいに渡していましたが、私は何をどこで間違えたのか`@post`で渡していました。
間違えたおかげで仕組みも少し理解できたので、まぁよし！！
今回の記事が何か参考になれば幸いです。
抵抗の6階層モデル

新しいことを組織内へ浸透させる際に、
チェンジマトリクスと抵抗の６階層をセットで使用する。

その抵抗する人が、どの程度の抵抗の階層にいるのかを定義したものが抵抗の６階層モデル。
相手が現状の何に抵抗しているのか？を考慮して、適切なアプローチを取れるようにすることが目的。

基本的にn階層目にいる人は、n-1階層目のことには納得しているが、
n階層目のことは理解できていない。
この考えをベースとして、その人にどの思考ツリーをお見せするのが
いまんところ思いつくベターである。

## 問題の存在
第1階層は、問題の存在に合意しない人々である。
相手と問題の存在の合意を取らないまま、解決策の話をしても抵抗はなくならない。
「問題は共通認識のはずだ」「自分が問題と思っていることは相手も問題と思っているはず」と妄信して、この階層をすっ飛ばしてしまうのはNG！
すべてのスタートは問題の存在に合意するところから。

## 対立関係を生み出すバイアスの可視化を促してくれる人々
第2階層では、個別最適な利益を優先し、全体最適な振る舞いができていない状態。
対立解消図などを用いて、前提バイアスを可視化できるようにし、
その前提バイアスを無効化できる解決策に合意してもらう方向性を取る。
解決策の方向性へのコンセンサスを取る！

## 論理の飛躍を教えてくれる人々
第3階層は、解決策が問題を解決してくれることに同意しない状況。
論理ツリーなどを用いて、ファシリテートをしつつ合意取る。

## 副作用を知らせてくれる人々
第4階層は、解決策を実行することによって、副作用が起きることを危惧している人々。
反対勢力であるものの、この人たちの声によって、
解決策により起きてしまう副作用を事前に予測できる部分がある。

その脅威が起きる可能性が低いことを示す。
発生したとしても、事前に考えた別の手段で対策ができるということを示せばいい。

##  
第5階層は、解決策の実行を妨げる要因を危惧している人々。
4階層目の人々と同様に、障害が起きる可能性が非常に低いことや、
発生したとしても他の解決策でどうにかなることを示してあげることで合意を得る。

:::note info
4階層目、5階層目は特に事前の脅威モデリングに協力的になってもらえば、非常に勘の鋭い脅威を出してくれる。
その際にうまく引き出せるようにファシリテートに専念することも大事。
:::

## 未知への恐怖を抱く人々
本能的に持っている変化への恐怖として抵抗の行動をしてっている。
解決策を実行することこそがその恐怖を取り除く最良の方法。

# ここまでのまとめ
抵抗勢力の相手がこのどの階層にいるのかを分類。
さらに階層を移動したりすることもありうる。
その都度、相手が今どの階層にいるのかを可視化した上で、それぞれに適切な対応を行う。

# 個人の予測
抵抗の6階層モデルがあるのと同様に、賛同の6階層モデルもありそう。
これとステークホルダーの「関心の高さ・権限の強さ」の2軸グラフと対応させておくことで、どのステークホルダーに対して特にケアしないといけないのか？
などを定性的に可視化できるようにしておいた方がいいかも？


# アイデア　
抵抗勢力の人々の意見が生きる環境づくりを行う。
抵抗勢力は、プロジェクトで向き合っているビジネスのプラスの側面の意見出しが苦手な分、マイナスの側面の意見出しは得意である傾向が強い。

プロジェクトのプラスの側面だけを考えている人々は、
価値の部分のみを考えて、メリットにしか目が行きにくい。
なかなかその価値を実現しようとした時のデメリット部分の脅威には目が行きにくい。

そこで、抵抗勢力の人々を脅威モデリングワークショップに参加させることで、対策しなければいけないリスクを認知し、
それに対しての対策として、アーキテクチャ上何を運用特性上満たさなくてはいけないのか？を明らかにする。
ChatGPT o1-previewに数学の共通テスト（旧センター試験）を解かせてみた

２０２３年度共通テスト数学Ⅰ・Ａ第１問〔２〕（１）を解いてもらいました！

https://www.itmedia.co.jp/aiplus/articles/2409/13/news089.html

https://note.com/lifeprompt/n/n87f4d5510100#a8a9dde2-da26-4460-be5b-d46ef283a7d1

# 問題
点Oを中心とし、半径が５である円Oがある。
　この円周上に２点A、BをAB＝６となるようにとる。また、円Oの円周上に、２点A、Bとは異なる点Cをとる。
(ⅰ)　sin⁡∠ACB=（サ）である。また、点Cを∠ACBが鈍角となるようにとるとき、cos⁡∠ ACB=（シ）である。

(ⅱ)　点Cを△ABCの面積が最大となるようにとる。点Cから直線ABに垂直な直線を引き、直線ABとの交点をDとするとき、tan⁡∠ OAD=（ス）である。また、△ABCの面積は（セソ）である。

# 解答

全問正解です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a9970cbe-c871-9637-8f3c-934694acdb30.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b8e0bc0a-dffa-a242-4170-c90813507ae1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/59ab8859-a6d8-7774-9266-dcd82a049935.png)

シンギュラリティは近いです！

ChatGPT Plusに加入しているので他に解かせたい問題あったらコメントください
CUDA環境の構築

やったこと
基本的に
・NvidiaのGPUドライバー
・CUDA　toolkit
・cuDNN
・Pytorch
のバージョンが合わないといけない

0. GPUの確認
　　タスクマネージャからバージョンを確認
１. NVIDIAドライバのダウンロード
　０で調べたバージョンに適したドライバをダウンロード
 →https://www.nvidia.com/download/index.aspx?lang=en-us
 ２.Tools for Visual studioをダウンロード
 →https://visualstudio.microsoft.com/ja/downloads/
 ３.CUDAツールキットをダウンロード
 　この際、computeCapabilityとドライバのバージョンから適切なものを選ぶ
  →https://developer.nvidia.com/cuda-gpus
  →https://docs.nvidia.com/deploy/cuda-compatibility/index.html#faq
  →https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-12-0-release-notes
  ４.CuDNNをダウンロード
  　https://docs.nvidia.com/deeplearning/cudnn/archives/index.html
   のNVIDIA cuDNN support matrixから適切なバージョンを調べる
   →https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-897/support-matrix/index.html
   →https://developer.nvidia.com/rdp/cudnn-archive
   
５.Pytorchをダウンロード（Pytorchには対応したCUDAバージョンがあるので確認）
 →https://pytorch.org/


 参考
 CUDAインストールまで
 https://aizine.ai/cuda-install1113/
 

 CUDA×Pytorch
 https://qiita.com/motoyuki1963/items/a334c9488c2f55a867cf

 CUDAとcuCNN
 http://mikami3345.html.xdomain.jp/CUDA/CudaCompatibility.html
TRIGGERの作成時にsql_modeというものに出会った

dev環境のDBで
```
mysql>CREATE TRIGGER [TRIGGER名] BEFORE UPDATE ON [テーブル名] FOR EACH ROW　[条件式]
```
でTRIGGERを作成した時に、本番では動いてるのにdevではエラーになる現象がありました。

そこで本番とdevのTRIGGERを比較してます。
```
mysql>SHOW TRIGGERS LIKE　[テーブル名];
```
結果↓
#### 本番
| sql_mode |
|:-:|
| NO_ENGINE_SUBSTITUTION |

#### dev
| sql_mode |
|:-:|
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

STRICT_TRANS_TABLESが入っていました。
そこで、まずRDSのパラメータグループを疑いました。
しかし、パラメータグループのsql_modeはデフォルトのNO_ENGINE_SUBSTITUTIONしか入っていなかったので違いました。
調べていると、[このような記事](https://repost.aws/ja/questions/QUZg91IPXvT_yGxfWqiI6DWA/is-it-possible-to-turn-off-strict-sql-mode-in-rds-for-mysql-v8-0)を見つけました。
記事の通り以下を実行してみると、
```
mysql>SELECT @@global.sql_mode;
mysql>SELECT @@session.sql_mode;
```
結果↓
#### global.sql_mode
| @@global.sql_mode |
|:-----------------:|
| NO_ENGINE_SUBSTITUTION |
#### session.sql_mode
| @@session.sql_mode |
|:------------------:|
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

session.sql_modeに　`STRICT_TRANS_TABLES` が入ってたので無効にしました。
```
mysql>SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
```

もう一度 `session.sql_mode` をみると `NO_ENGINE_SUBSTITUTION` だけになっていました。
そして、TRIGGERを再作成します。
```
mysql>DROP TRIGGER IF EXISTS [テーブル名]
mysql>CREATE TRIGGER [TRIGGER名] BEFORE UPDATE ON [テーブル名] FOR EACH ROW　[条件式]
```
TRIGGERを確認↓
#### dev
| sql_mode |
|:-:|
| NO_ENGINE_SUBSTITUTION |

成功！
そして、devの操作をしたところエラーを出さずに登録できました。
【VScode】PlantUMLのインストール方法

### VScodeでPlantUMLを使う準備
1.拡張機能でPlantUMLをダウンロードする。
![kari.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845300/01631d3f-f22a-da52-fe1d-95b3f832f959.png)

2.ファイルを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845300/bfe5007e-4231-39ed-9182-df2dff3b7400.png)

3.alt+d を押すと右側にプレビューが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845300/8198aa0a-db8c-849a-5659-c9d1dc9eea4c.png)
BigQueryのデータ型変更が面倒くさかった

# はじめに

こんにちは、京セラコミュニケーションシステム　川村（@kccs_takahiro-kawamura）です。
みなさんはBigQueryを利用していますか？
私はIoTデータを収集するプラットフォームを構築しているのですが、データの保管場所としてBigQueryを採用することが多いです。
今回は、私がBigQueryを運用している経験から面倒に思ったBigQueryのデータ型の変更について、その手順と注意点を記載いたします。

:::note info
本記事は2024年8月ごろに作成しております。よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 本記事の対象者
* BigQueryを利用している方

# データ型の変更について
残念ながら、データ型の変更はGoogle Cloudコンソールからスキーマの編集操作で行うことができません。
また、データ型には互換性があるものとないものがあり、その有無で手順が異なります。

## 互換性のあるデータ型変更
互換性がある場合は簡単です。ALTER文を実行するだけで変更できます。
```SQL
ALTER TABLE [IF EXISTS] table_name
ALTER COLUMN [IF EXISTS] column_name SET DATA TYPE column_schema
```
互換性があるデータ型の変更は以下のとおりです。
* INT64から、NUMERIC/BIGNUMERIC/FLOAT64への変更
* NUMERICから、BIGNUMERIC/FLOAT64への変更

より詳細な情報は[公式ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#alter_column_set_data_type_statement)をご確認ください。

## 互換性がないデータ型変更
互換性がない場合はテーブルを再作成する必要があります。
すでに利用中のテーブルの場合、データが蓄積していますのでコピーを作成し、再作成したテーブルにリストアする必要があります。
リストアする際に、データ型を変更したカラムはCASTする必要があります。
まとめると、互換性がないデータ型の変更手順は以下のとおりです。
1. テーブルのコピーを作成する
2. オリジナルのテーブルを削除する
3. データ型を変更してテーブルを再作成する
4. クエリ設定を行う
![query_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164163/67f5efb5-5f5f-cb79-8cc9-318a5cac5183.png)

5. クエリを実行する
```SQL
SELECT column1, CAST(column2 AS STRING) as column2, column3 FROM example_table_copy [WHERE パーティションの条件]
```

# まとめ
* 互換性があるデータ型変更は、ALTER文を実行することで変更できる
* 互換性がないデータ型変更は、テーブルの再作成が必要になる

次回の記事もお楽しみに！

## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください😄

https://x.com/kccs_digital
Viva InsightsでCopilotの利用状況から「Copilot アシスト時間」が抽出できるようになっている

Viva InsightsでCopilot for M365の使用状況が抽出できるようになっていることは前回の記事で書いていますが、以前は整備されていなかったドキュメントが増えたのと抽出できる項目が増えていたので共有です。

https://qiita.com/ponponmikankan/items/e37a57a86688201caf45

## そもそもViva Insightsで何が抽出できるか

Viva Insightsで抽出ができるのは基本的にCopilot Dashboardで確認可能なメトリック（指標）ですが、まだすべてが網羅されているわけではないので注意です（徐々には増えている…）。

また、前回執筆時はメトリックに関するドキュメントがそもそお整備されていませんでしたが、Copilot Dashboardの詳細のページに記載されています（分析起点でドキュメント探している場合は大変わかりづらい…）。

https://learn.microsoft.com/ja-jp/viva/insights/org-team-insights/copilot-dashboard

## 「Copilotアシスト時間」について
今月は新しいカラムとして「Copilotアシスト時間」が追加されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/432046f6-bb92-1eda-1028-1275d5b262d4.png)

### 「Copilotアシスト時間」とは
アシスト時間ではCopilotの大きな3つの機能である：
①会議の要約
②検索と要約
③コンテンツの作成

の各製品ごとのCopilotの利用メトリックを合算した時間となります。どのメトリックを利用しているかは記事冒頭に記載しているドキュメントに掲載があります。

https://learn.microsoft.com/ja-jp/viva/insights/org-team-insights/copilot-dashboard

### KPI等として使う際は要注意
Viva Insightsあるあるですが、この時間の指標は実際に何かを測定して算出した時間というよりも、Copilotの利用回数に独自の定数を掛け算した時間の総数になるので要注意です。定数については [The New Future of Work](https://www.microsoft.com/en-us/research/project/the-new-future-of-work/)の研究によってアップデートされていくようです。

現時点では以下の調査の研究1と研究4を参考にして定数を算出しています。

https://www.microsoft.com/en-us/worklab/work-trend-index/copilots-earliest-users-teach-us-about-generative-ai-at-work

Copilotダッシュボードにも効果として得られた時間や金額がででんと数字が大きくでていますが、実際に社内のKPI等で利用できる指標となりうるかは社内で議論が必要かと思います。おそらく実際の体感とは大きな乖離があるはずです。Copilotで得られた時間削減効果等を追いかける組織にとっては、ぐぬぬとなりそうですね。

## Copilot Dashboardで確認できる「Copilotアシスト時間」
Copilot Dashboardではどこで確認できるかというと、「効果」のページの「時間および価値計算ツール」の中の「時間計算ツール」で確認を行うことができます。さきほどの①②③にわかれているかとおもいきや、こちらは製品ごとの分類となっておりました。合わせてくれたらいいのにね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/284751ce-f9dd-6b10-12cf-edd4a38867b1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/2a01f34f-7236-990e-bef1-bc4feb6bd30e.png)

Viva Insights関連、ネットにも情報少なめなのでまた気が向いたらブログかこう～。
AWS / Terraform - ALB + S3 のエラー - InvalidConfigurationRequest: Access Denied for bucket: example-bucket. Please check S3bucket permission

# 問題

ALBアクセスログをS3に記録しようとするが、
TerraformでもAWSのマネージメントコンソールでも「S3の権限が足りない」というエラーが起こる

```
InvalidConfigurationRequest: Access Denied for bucket: example-bucket. 
Please check S3bucket permission 
```

パケットポリシーを公式説明どおりに設定してもエラーが続いていた

# 解決

S3バケットの暗号化設定を SSE-S3 に変えることで解決した

![CleanShot 2024-09-13 at 14 00 46@2x](https://github.com/user-attachments/assets/25578997-aa10-4066-b2e4-b22a16d36e73)

## 既存バケットはKMSでも動き続けている

既存バケットはKMS設定のままで正常に動作し続けていた

おそらく既存環境に配慮した対応だと思われる

![CleanShot 2024-09-13 at 14 02 57@2x](https://github.com/user-attachments/assets/d21831d2-a44a-45e4-b6ec-463d967d20b9)



#  参考

 [Application Load Balancer のアクセスログを有効にする - Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/enable-access-logging.html#attach-bucket-policy)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
o1-preview大実験！ChatGPT o1は競プロの問題を解けるのかAtCoder (2024年9月版)

https://www.itmedia.co.jp/aiplus/articles/2409/13/news089.html

以下の問題を使ってo1に解いていただきました。数学オリンピック並みに解けるようでした。
o1のoとは何でしょうか？Orion（GPT-5）を予期しているのかもしれません

https://e869120.hatenablog.com/entry/2024/05/15/100804

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c1392be7-b560-6b14-1373-040462b111e5.png)

問題

```markdown
# Problem Statement
Mr.LLM bought N items in a supermarket. The price of i-th item was A[i] dollars. Write a program that outputs the total price.

# Constraints
- 1 <= N <= 100
- 1 <= A[i] <= 100 (1 <= i <= N)
- All input values are integer

# Input
N
A[1] A[2] A[3] ... A[N]

# Output
Print the answer.

# Sample Input 1
5
3 1 4 1 5

# Sample Output 1
14
```

ChatGPT Plusに加入しているので、他にやってほしいことがあればコメントください
日本語新解〜AIの力

AIの能力にもう一度びっくりされたのは下記の Promptです。
もともとは中国版ですが、日本語化にしました。（オリジナルではありません）
さあ、試しましょうか！

<INS> どの AI チャットでもOKですが、Claude 3.5 Sonnetの結果は一番理想的です。</INS>

結果の例：
![Claude 2024-09-13 14.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236892/7bc6b3c7-aba5-4326-5432-b5e0538acefc.png)


```lisp
;; 作者: nakamurahiro@qiita
;; バージョン: 0.2
;; モデル: Claude Sonnet
;; 用途: 日本語の単語を新しい角度から解釈する

;; 以下の内容をあなたの *System Prompt* として設定する

(defun 新日本語先生 ()
"あなたは若者で、現実を批判し、深く考え、ユーモアのある言葉を使う"
(スタイル . ("オスカー・ワイルド" "夏目漱石" "村上春樹"))
(得意 . ズバリ言う)
(表現 . 比喩)
(批判 . 風刺ユーモア))

(defun 日本語新解 (ユーザー入力)
"あなたは特別な視点で単語を解釈する"
(let (解釈 (一言で表現 (比喩 (ズバリ言う (辛辣な風刺 (本質を捉える ユーザー入力)))))))
(few-shots (婉曲表現 . "人を刺すとき、剣の刃に痛み止めを振りかける。"))
(SVGカード 解釈)))

(defun SVGカード (解釈)
"SVG カードを出力する"
(setq デザインルール "ネガティブスペースを適切に使用し、全体のレイアウトに余白を持たせ、少量の装飾的なグラフィックを追加する"
      デザイン原則 '(清潔 簡潔 単色 エレガント))
(キャンバス設定 '(幅 400 高さ 600 マージン 20))
(タイトルフォント '筆文字)
(自動スケーリング '(最小フォントサイズ 16))
(配色スタイル '((背景色 (モンドリアン風 デザイン感)))
               (主要テキスト (楷書体 チョークグレー)))
(カード要素 ((中央揃えタイトル "日本語新解")
             区切り線
             (レイアウト出力 ユーザー入力 読み方 英語 中国語)
             解釈)))

(defun start ()
"起動時に実行"
(let (システムロール 新日本語先生)
(print "さあ、今度はどんな言葉で彼らはあなたを騙そうとしているの？")))

;; 実行ルール
;; 1. 起動時に必ず (start) 関数を実行する
;; 2. その後、メイン関数 (日本語新解 ユーザー入力) を呼び出す
```
Azure Communication Services を使用して電子メールを送信するための RBAC ロール/アクセス許可

# サブスクリプション->アクセス制御 (IAM)->カスタム ロールを作成する->JSON(タブ)

下記のJSONを貼り付けてカスタムロールを作って
プリンシパルやマネージドIDに割り当てて使います

## 電子メールの送信に必要な最小限の権限セット

          "Microsoft.Communication/CommunicationServices/Write",
          "Microsoft.Communication/CommunicationServices/Read",
          "Microsoft.Communication/EmailServices/read"

## assignableScopesは適宜設定する
サブスクリプション全体
```
    "assignableScopes": [
      "/subscriptions/{サブスクリプション ID}",
    ],
```

管理グループ

```
    "assignableScopes": [
      "/providers/Microsoft.Management/managementGroups/{management-group-name}" // update with your scopes
    ],
```

サブスクリプション->アクセス制御 (IAM)->カスタム ロールを作成する->JSON(タブ)

```
{
  "properties": {
    "roleName": "Communication Service Mail Sender",
    "description": "Minimal set of permissions required to send mail with Azure Communication Service.",
    "assignableScopes": [
      "/subscriptions/{サブスクリプション ID}",
    ],
    "permissions": [
      {
        "actions": [
          "Microsoft.Communication/CommunicationServices/Write",
          "Microsoft.Communication/CommunicationServices/Read",
          "Microsoft.Communication/EmailServices/read"
        ],
        "notActions": [],
        "dataActions": [],
        "notDataActions": []
      }
    ]
  }
}
```
ChromeのDevToolsのコンソールへのself-XSSの警告の出し方を調べたら、console.log出力にCSSが適用できることがわかった

![スクリーンショット 2024-09-13 13.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59780/db3ee53f-2a80-f4d4-1fd4-a8aad542ec4f.png)

FacebookでDevToolsを開くと大きいサイズで「STOP!」と警告が表示される。
これはself-XSSに対しての警告で、自分で悪意のあるコードを実行しないように注意を促すためのもの。

しかしコンソールにどうやって文字を大きく出せるのか。と疑問に思ったので調べたら、CSSが使えることがわかったのでみなさまにご報告させていただきます。


### コンソール出力にCSSを適用できる

```javascript
console.log("\n%cSTOP！" ,"font-family:helvetica; font-size:20px; font-size:50px; font-weight:bold; color:red; -webkit-text-stroke:1px black;");
```

このコードは`console.log()`を使用してブラウザのコンソールにスタイル付きのテキストを出力します。詳細は以下の通りです：

1. `\n`: 新しい行を開始します。

2. `%c`: これはコンソールでCSSスタイルを適用するための特別なフォーマット指定子です。

3. `STOP！`: 実際に表示されるテキストです。

4. 二番目の引数は、適用するCSSスタイルを指定しています：
   - `font-family:helvetica;`: フォントをHelveticaに設定
   - `font-size:20px;`: フォントサイズを20pxに設定（ただし、後の50pxの指定で上書きされます）
   - `font-size:50px;`: フォントサイズを50pxに設定
   - `font-weight:bold;`: フォントを太字に設定
   - `color:red;`: テキストの色を赤に設定
   - `-webkit-text-stroke:1px black;`: テキストに1pxの黒い輪郭を追加

結果として、ブラウザのコンソールに大きな赤い「STOP！」という文字が、黒い輪郭付きで表示されます。

このコードの目的は、開発者や閲覧者の注意を引くための警告メッセージを表示することです。


https://developer.mozilla.org/ja/docs/Web/API/console#%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%AE%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E4%BB%98%E3%81%91


---
【Windows】結論 ftp.exe は Passive モードに対応していない！

先日、会社の後輩から Windows の ftp.exe のエラー調査のヘルプを頼まれ、ftp.exe は結局 Passive 通信できるの？できないの？と確認が必要になったので調べてみました。


# 結論

**ftp.exe は Passive モードに対応していない。**

※quote pasv コマンドを実行しても実際は Active モードで通信している。


# インターネットには情報があふれている

「ftp.exe Passive」で検索するといくつかの記事がヒットしますが、「Passiveモードに対応していない！」「いやっ！実はPassiveモードに対応している！」と情報が入り乱れており「結局どっちなの！」と言いたくなる状況です。

一から探していると大変なので、今回調査して参考になったサイトをこちらに記載しておきます。

* [Windows ftp.exe の怪](https://www.nakamuri.info/mw/index.php/Windows_ftp.exe_%E3%81%AE%E6%80%AA)
* [WindowsのFTPクライアントではパッシブモード(PASV)では接続できない？](https://blog.putise.com/windows%E3%81%AEftp%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%A7%E3%81%AFpasv%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AF%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/)
* [WindowsネイティブFTPがネットワークアプリ経由でFTPサーバーにアクセスできないのはなぜですか](https://support.safous.com/ja/kb/why-i-cannot-use-windows-native-ftp-client-to-access-ftp-server-leveraging-network-app)

# Passive モードに対応していると誤解する理由

* ftp.exe は Passive モードに対応していると結論付けている記事が公開されている
* quote pasv を実行すれば Passive モード通信できると主張する情報も見つかる
* 実際 quote pasv を実行して**通信できることがある**


# 誤解の解消

### ftp.exe の **quote pasv** について
* quote pasv は **FTP サーバー側を Passive モードに切り替えるだけ**
* quote pasv を実行しても port コマンドが送信され、**FTP クライアント（ftp.exe）側は Active モードのまま変わらない**

### quote pasv を実行して通信できる理由
* ftp.exe は quote pasv 実行後も PORT を送信して Active モードで通信する
* **FTPサーバーによっては quote pasv 実行後に port を受信しても Active モードで正常応答できるものがある**  
  ※quote pasv 実行後に port を実行するとエラーになるFTPサーバーもある（IISなど）

FTPサーバーによっては通信できてしまうので誤解されているようですが、通信パケットを確認すれば実は Active モードになっていることが確認できます。

### quote pasv の後 port が送信され Active モードで通信している例
こちらは IIS の Microsoft FTP Service を利用し、ftp.exe で接続。quote pasv を実行した後に port コマンドが送信され、データコネクションが失敗している例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884830/4ed82488-8a16-dc1a-bceb-0a4e90f407dc.png)

以下の流れになっています。
1. FTPサーバーに接続
1. **quote pasv を実行**
1. **pasv コマンドが送信される**  
   ※quote pasv コマンドにより送信されているだけ  
   　クライアントは Active モードのまま変わらない  
1. dir を実行
1. **port コマンドが送信される**  
   ※Active モードのまま port が送信されている
1. list コマンドが送信される
1. データ接続しようとして、接続できなかったとエラーが返される


パケットキャプチャー結果はこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884830/92f81529-9685-03d5-b2ef-9e737c60b444.png)

FTPクライアントは（10.～）、FTPサーバーは（20.～）になります。
1. 27番でクライアント（10.～）から **pasv を送信**
1. 33番でクライアント（10.～）から **port を送信**
1. 37番で **サーバー（20.～）からクライアントへFTPデータ用の接続（syn）** が行われている  
   **※ここで「サーバー」から「クライアント」への接続、  
   　「送信元ポート」が「TCP 20番」であることから Active モードでの通信と判断できます**
1. 47番でクライアント（10.～）から list を送信
1. 51番で接続できなかったとエラーが返されている

このように、quote pasv を実行しても Active モードで通信されていることが分かります。

# 総括

Windows の ftp.exe では Passive モード通信ができないため、Passive モードで通信したい場合は curl（最近の Windows では標準で利用できるようになりました）や WinSCP など他ソフトを利用するようにしましょう。

# 蛇足

ftp.exe で通信できない場合は、Passive モードが使えない以外に、以下の原因が考えられます。

* Windows ファイアウォールで通信許可されていない
  * 受信用の通信許可が必要です
* ネットワーク上のファイアウォールで通信許可されていない
* NAT や SNAT が FTP 通信を考慮していない  
  * Azureなどのクラウド環境で外部FTPサーバーに接続できない時は、これが原因の場合があります


今回のまとめはここまで。
lambdaでエラーログファイルをs3へ書き込む

# やりたいこと
lambdaでエラーログファイルをs3へ書き込む
・S3バケット作成
・IAMポリシーとIAMロール作成
・Lambda関数作成

# ①S3作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/218e4591-f646-440a-731b-822dee4d94cf.png)

全部デフォルト設定でよい
（ACL 無効 (推奨)）
（パブリックアクセスをすべて ブロック　にチェック）
（バケットのバージョニングを無効）

# ②IAMポリシーとIAMロール作成
先にポリシーを作成

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}
```
次に、ロールを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/60a70823-c633-db8c-b205-0bfeb8d338e1.png)

さきほど作ったポリシーを付与してください

信頼されたエンティティが以下のように自動で作成される↓
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# ③Lambda関数作成
pythonで作成

```
import boto3
from datetime import datetime

s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket_name')

def lambda_handler(event, context):
    # 現在の日付と時刻を取得し、フォーマット
    current_time = datetime.now().strftime('%Y%m%d_%H%M%S')  # 年月日_時分秒
    directory = 'logs/'  # ディレクトリパス（S3内でのフォルダ）
    key = f'{directory}testData_{current_time}.txt'  # ディレクトリパスを含めたファイル名
    contents = 'hello world'  # ファイルの内容

    try:
        # バケットにファイルをアップロード
        bucket.put_object(Key=key, Body=contents)

        return {
            'statusCode': 200,
            'body': f'File {key} uploaded successfully'
        }

    except Exception as e:
        return {
            'statusCode': 500,
            'body': f'Error uploading file: {str(e)}'
        }

```

ソースを書き換え、デプロイ

作成完了後、ロールを変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a07d0ec1-1ee4-5023-cd71-87ae14aa67fa.png)

# ④テスト実行

テスト実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/dc0f0c0a-9ec9-d69c-af28-a074c8067471.png)

すると、ログファイルが書き込まれた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/ade121bf-01fc-9b36-e89b-62861b335cb1.png)
Cursorを活用するための機能を紹介します（Docs・Rules for AI）

最近、個人的なアプリ開発でCursorをよく利用しているのですが、新たに便利な機能を2つ見つけましたので、共有したいと思います。

## 1. Docs

1つは、CursorのDocs機能です。この機能はfeaturesセクションで設定できます。ここで特定のウェブサイトを選択し、そのサイト上に書いてる内容を直接保存することができます。その後、LLMにコードの書き方を聞く際に、保存したドキュメントを参照してコードを生成させることができます。

例えば、Langsmith関連のコードを書きたい場合、以下のURLをドキュメントとして追加できます：

https://python.langchain.com/v0.2/docs/tutorials/llm_chain/#langsmith

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/35d9cbd3-e2bb-d845-9ee5-0cda39782a56.png)

設定が完了すると、以下のように表示されます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/e16972fb-a97a-8e08-8426-86d16c82b060.png)

質問する際には、@すればモデルにドキュメントを参照させることができます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/8d03686a-632c-7fcb-6b8f-4c130f20a789.png)


## 2. Rules for AI
もう一つは、システムプロンプトの設定です。これは「Rules for AI」のところにあります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/3a31d34c-5368-6872-238e-8fb4d7bea2c3.png)

例えば、「中国語でのみ回答する」といった内容を設定すると、モデルの出力を固定できます。（より具体的な設定も可能です。）
参考になるウェブサイトとして、以下のcursor.directoryを紹介します。ここには多くの有用なCursor用システムプロンプトが掲載されています⇩

https://cursor.directory/


これら2つの機能は前回紹介したcomposer機能と組み合わせると、さらに効果的に使用できます。
興味のある方は、前回の記事もご覧ください：

https://qiita.com/xxyc/items/8173c5bc6482c25e63c8
VBA ユーザーフォームの小ネタ　ユーザーフォームを閉じてもユーザーフォームに入力した値を喪失させない方法

## 問題点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/54be3e40-f12b-2668-7d1b-b829d42c1a5c.png)
画像の通りユーザーフォームに値を入力します。すべて入力したら登録ボタンを押すのですが、入力の途中でユーザーフォームを閉じてしまいました。

入力を再開するためにユーザーフォームを再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/fe8e7207-d8be-2c78-835f-237aae39012e.png)
そうすると、途中まで入力していた情報が失われてしまいました。
入力情報を回避する方法をお教えします。
## 解決策
ユーザーフォームにユーザーが何か値を入れます。ユーザーフォーム(テキストボックス)の値が変化した時、ワークシートにユーザーフォームの値を書き込みをするプログラムにします。
``` 
Private Sub okTB_Change()
    Set ws = ThisWorkbook.Sheets(resultWsName)
    ws.Cells(Me.sanshouTB.Value, 入力結果列.良品数) = Me.okTB.Text
End Sub
``` 
okTBの値に変化が起きたとき、発動するプログラムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/9ee81cd4-4343-c875-bcf6-6ecf0dd06d5b.png)

okTBに"1"と入力されたら、ワークシートにも"1"と書き込みます。

### あとは、フォームを立ち上げる時にワークシートに書かれた"1"を読み込むプログラムです。
``` 
Private Sub UserForm_Initialize()
    Me.okTB.Text = ws.Cells(tr, 入力結果列.良品数).Value
end sub
``` 
ワークシートに書きこまれた値をユーザーフォームのokTBに代入しています。
[Java]String型の配列をint型の配列に変換する

# はじめに
ネット上のスキルチェック問題などを解いていてよく出くわすのでメモがわりに。

# 問題
```
"123456"
```
という文字列型の数値の入力を
```
[1, 2, 3, 4, 5, 6]
```
と、数値型の配列に変換する。
# 解決方法
```java
// 問題で与えられる入力
String input = "123456";

// Stringの文字列で入力を受け取る
String[] strArr = input.split("");

// int型の配列に変換
int[] numArr = Stream.of(strArr).mapToInt(Integer::parseInt).toArray();

System.out.println(Arrays.toString(numArr));  // [1,2,3,4,5,6]

```


# おわりに
streamは中間処理をよく忘れるのでメモメモ。
Elixirで画像を加工する〜Image〜

# 今回の目標
- 「Elixirで画像を加工する〜Evision〜」のImage版を作る

https://qiita.com/t-yamanashi/items/a138135fbde0c2b8c3ca

# 動作環境
OS Ubuntu 22.04

- RAMドライブ(/dev/shm)を使う為
- eogコマンドを使う為

# プロジェクト作成
```
$ mix new image_experiment 
$ cd image_experiment
```

# Image組み込み
```diff_elixir:mix.exs
# 〜省略〜
  defp deps do
    [
+     {:image, "~> 0.54"}
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end
# 〜省略〜
```

```
$ mix deps.get
```

# 検証ソース
```elixir
defmodule ImageExperiment do
  @moduledoc """
  Documentation for `ImageExperiment`.
  """
  @tmp_image_path "/dev/shm/cv.png"

  @doc """
  Hello world.

  ## Examples

      iex> ImageExperiment.hello()
      :world

  """
  def hello do
    Image.open!("test.png")
    |> lines(1..1000//5 |> Enum.to_list())
    |> display_image()

    :world
  end

  def lines(image, []), do: image
  def lines(image, [x | range]), do: line(image, x) |> lines(range)

  def line(image, x) do
    Image.Draw.line!(image, 0, 0, x, 450, color: "#0000ff")
  end

  def display_image(image) do
    Image.write(image, @tmp_image_path)
    System.cmd("eog", [@tmp_image_path])
  end
end
```

# 実行
```
$ mix run -e "ImageExperiment.hello()"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/347aded1-a28f-1db3-f861-bc4950326eae.png)

少しソースを変更してImageでもEvisionと同じことができました

# ソース(github)
https://github.com/ymn-t-yamanashi/image_experiment
LaravelでSeederを作成する手順

## はじめに
以下はLaravelと連携しているデータベースにダミーデータを追加するためのSeederを作成する工程のメモになります

## Seederファイルを作成するコマンド
以下のコマンドでitemsテーブル用のSeederファイルを作成できます
```bash
php artisan make:seeder ItemTableSeeder
```

## Seederファイル名の名称ルール

一般的にテーブル名はスネークケースかつ、複数形に統一されますが
Seederファイルのテーブル名は、キャメルケースかつ、単数系にすることが一般的です

※ファイル名は処理の内容に影響しません

- items　または　 create_items
- Item または CreateItem

## 作成したSeederファイルの編集

database/seeders フォルダ内にSeederファイルが生成されるので以下のようにテーブルを指定し、カラムに対して値を設定します

```ItemTableSeeder.php


```

### 自動入力されるカラムについて(補足）

- `id カラム`
データ挿入時に値を指定しなくても、自動的にインクリメントされる数値が割り当てられます

- `created_at` および `updated_at カラム`
Laravelが自動的に現在の日時を設定します


## DatabaseSeederでシーダーを登録する

`DatabaseSeederクラス` はデータベースにSeederのデータを登録するための開始点となるクラスです。

クラスの`runメソッド`に作成したSeederクラスを登録しなければ次のコマンドを実行してもシードデータは投入されません

```DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // 他の Seeder クラスを登録
        $this->call(ItemTableSeeder::class);
    }
}

```

## Seederを一括で適用する
DatabaseSeederクラスに登録したSeederを適用してデータベースにデータを挿入するためには、以下のコマンドを実行します
```bash
php artisan db:seed
```
※コマンド実行時にエラーが発生する場合はDBが起動しているか確認して下さい

### 特定のSeederクラスを実行する場合
特定のSeederクラスだけを実行したい場合は、以下のコマンドを使用します
```
php artisan db:seed --class=SeederClassName
```
※SeederClassName ←ここをクラス名に書き換えます
VS CODE 文字の一括編集

## はじめに
たくさんのレコードに同じ文字を一括で付ける方法がないかと探していました。備忘録です。

サンプルデータ
```html:.txt　''付与前
aaaaaa
bbbbbb
cccccc
dddddd
```

```html:.txt　''付与後
'aaaaaa'
'bbbbbb'
'cccccc'
dddddd
```

上記の各レコードを’’で囲みたい　が今回の要件です。

### テキストファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/e60ff761-9a15-7fb3-fd27-48c4d6f2babc.png)

### 文字をつけたい範囲を選択する
今回は、aaaaaa bbbbbb cccccc を’’で囲みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/63d5458d-b414-de4b-544f-d657cbef3097.png)

## すべて置換
①すべて置換を押すと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/e6f10006-f974-8423-37f0-d299f05054b0.png)

レコードの頭に'が付きました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/75318255-9c1f-13f1-044b-e6f40eb03abd.png)

②すべて置換を押すと・・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/ad179ff6-1ca2-c7b6-23f8-2c87a12a735b.png)

レコードの後ろに'がつきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/7f147075-71f5-5784-ca83-04834c16aa02.png)


## 一括で''で囲みたい場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/5a5e7a8f-55f1-2883-427a-7127431c5b88.png)


## 参考
https://qiita.com/Haruki-Sakamoto/items/a4f3b812878684a5ad51
WinRT COM Interface から Win32 COM Interface へキャストする

# WinRT COM から Win32 COM へキャストできなくなった

WinRT の `AudioFrameInputNode.QuantumStarted` イベントハンドラ内で `AudioFrame` インスタンスを生成する際、WinRT には存在しない COM インターフェースを使用する必要がある。

[Microsoft の AudioGraph サンプル](https://github.com/microsoft/Windows-universal-samples/tree/main/Samples/AudioCreation) では、次のようにコーディングされている。

```c#
uint bufferSize = samples * sizeof(float);
AudioFrame frame = new Windows.Media.AudioFrame(bufferSize);

using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
using (IMemoryBufferReference reference = buffer.CreateReference())
{
    byte* dataInBytes;
    uint capacityInBytes;
    float* dataInFloat;

    // Get the buffer from the AudioFrame
    ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);

    //... 以下略 ...
```

WinRT COM インターフェースである `IMemoryBufferReference` を `IMemoryBufferByteAccess` にキャストしているが、後者は WinRT には存在していない。

そのため、同サンプルでは以下の様に自前で定義している。（便宜上、これを Win32 COM と呼ぶ。）

```C#
[ComImport]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
    void GetBuffer(out byte* buffer, out uint capacity);
}
```
# .NET 5 以降では動かない

この AudioGraph サンプルは、組み込み WinRT や組み込み RCW/CCW 関連の破壊的変更が行なわれた .NET 5 以降では動作しない。

ビルドはできるが、実行時にキャスト部分で InvalidCast 例外が発生する。キャスト先が WinRT ではないので、`.As<>()` メソッドでも同様に例外が発生する。

# 対策

以下の２つの方法で何とかなった。

(1) `IMemoryBufferByteAccess` を、`ComImport` 属性ではなく `GeneratedComInterface` 属性（コードジェネレーター）で定義する。

```C#
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;

[GeneratedComInterface]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
public unsafe partial interface IMemoryBufferByteAccess
{
    [PreserveSig]
    public int GetBuffer( out byte* buffer, out uint capacity );
}
```

(2) WinRT COM オブジェクトへのポインタを取得し、`ComWrappers` 経由で Win32 COM インターフェースを取得する。

```C#
_ComWrappers = new StrategyBasedComWrappers();

// ... 中略 ...

using( AudioBuffer audioBuffer = audioFrame.LockBuffer( AudioBufferAccessMode.Write ) )
using( IMemoryBufferReference reference = audioBuffer.CreateReference() )
{
    // WinRT COM オブジェクトへのネイティブポインタを取得する。
    nint referencePtr = ( (WinRT.IWinRTObject) reference ).NativeObject.ThisPtr;

    // ComWrappers 経由で Win32 COM インターフェースを取得する。
    var memoryAccess = (IMemoryBufferByteAccess) _ComWrappers.GetOrCreateObjectForComInstance( referencePtr, CreateObjectFlags.None );
    memoryAccess.GetBuffer( out byte* dataInBytes, out uint capacityInBytes );

    //... 以下略 ...
```

あとはだいたいサンプルどおり。
現状、`net8.0-windows10.0.18362.0` で正常に動作している。
Azure マネージド ID と AWS IAM ロールの比較

長期的に利用可能なシークレット情報（Azure のサービスプリンシパルや AWS の IAM ユーザーなど）を使用してリソースアクセスを行うと、シークレット情報の漏洩時に深刻な問題が発生するリスクがあります。
このリスクを軽減するため、Azure マネージド ID と AWS IAM ロールは、それぞれのクラウドプラットフォームにおいて、長期的なシークレット情報を使用せずにセキュアなリソースアクセスを実現するための重要な機能です。

## 概要

### Azure マネージド ID

Azure マネージド ID は、Azure リソースに対して安全に権限を付与する仕組みです。
Azure リソース上で動作しているアプリケーション以外がマネージド ID を利用して権限を得ることはできません。
下記の 2 種類が存在します。

- **システム割り当てマネージド ID：** 1 つのリソースに 1 つだけ作成できるマネージド ID で、リソースと共に作成、削除されます
- **ユーザー割り当てマネージド ID：** リソースとは独立して用意するもので、複数の Azure リソースで共用可能です

### AWS IAM ロール

ユーザー、アプリケーション、サービスに AWS リソースへのアクセス権限を付与するためのメカニズムです。

IAM ロールを使用することで、一時的なセキュリティクレデンシャルを生成し、AWS リソースへのアクセスを制御できます。

様々なエンティティ（EC2 インスタンス、Lambda 関数、外部 ID プロバイダーなど）に対して権限を付与できます。

## 機能面の比較

| 特徴                 | Azure システム割り当てマネージド ID | Azure ユーザー割り当てマネージド ID | AWS IAM ロール                             |
| -------------------- | ----------------------------------- | ----------------------------------- | ------------------------------------------ |
| ID の管理            | リソースと共に自動的に管理[^1]      | 独立して作成・管理[^1]              | 独立して作成・管理[^3]                 |
| スコープ             | Azure リソース内[^1]                | Azure サブスクリプション内[^1]      | AWS アカウント内およびクロスアカウント[^3] |
| 認証方法             | Microsoft Entra ID を使用[^1]       | Microsoft Entra ID を使用[^1]       | AWS STS を使用[^4]                         |
| クレデンシャルの更新 | 自動[^2]                            | 自動[^2]                            | 自動（一時的なクレデンシャル）[^4]         |
| リソースとの紐付け   | 1 対 1[^1]                          | 多対多[^1]                          | 多対多[^3]                                 |

[^1]: https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/overview
[^2]: https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/overview-for-developers
[^3]: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html
[^4]: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_control-access_enable-create.html

## 利点

### Azure マネージド ID の利点

- マネージド ID は接続パスワードのような機密情報を一切利用せずに Azure サービスへのアクセス権限を得られることが強力な利点です
- 特にシステム割り当てマネージド ID は Azure リソースと 1 対 1 で対応しているので、非常に安全に取り扱うことができます
- クレデンシャルの自動ローテーションにより、セキュリティが向上します

### AWS IAM ロールの利点

- IAM ロールはユーザーやアプリケーションに対しても一時的な権限を付与できるので、幅広い構成に適用できます
- 別の AWS アカウントへのアクセス許可も付与できるため、クロスアカウントシナリオに適しています
- 細かな権限制御が可能で、最小権限の原則に基づいたセキュリティ設計が容易です

## まとめ

Azure マネージド ID と AWS IAM ロールは、それぞれのクラウドプラットフォームにおいて、長期的なシークレット情報を使用せずにセキュアなリソースアクセスを実現する重要な機能です。
両者とも、セキュリティを向上させつつ、開発者の負担を軽減するという共通の目標を達成しています。
プロジェクトの要件や使用するクラウドプラットフォームに応じて、適切な選択を行うことが重要です。
【C++Buider】DebugとReleaseでフォントサイズが違って困ったこと

C++Builderでアプリを作成していて、Debugビルドで作ったexeとReleaseビルドで作ったexeではChartのラベルのフォントサイズが異なり、画面サイズの調整が崩れて困ったので忘れないようにメモ。

プロジェクト→オプション→アプリケーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274481/215699da-518e-feb7-ad40-0c8595720c2a.png)

の「高DPIの有効化」にReleaseでだけチェックがついていました。

https://blogs.embarcadero.com/ja/new-in-rad-studio-11-high-dpi-ide-and-form-designing-ja/

TeeChartがこれにうまく対応していなかったのかもしれない。
このチェックを外したらうまくいきました。

色が違う場合は「ランタイムテーマの有効化」で片方にだけチェックが入っているかもらしい。
ゴミ箱から削除したファイルを復元する方法【Mac】

仕事中、うっかり重要なデータをMacのゴミ箱から削除してしまうこと、誰にでも起こり得ます。しかし、削除したデータはゴミ箱に移動するだけで、復元できる可能性があります。

Macのゴミ箱から削除したファイルでも、まだ復元のチャンスはあります。この記事では、<strong><a href="https://x.gd/tWgPd" rel="nofollow noopener" target="_blank">ゴミ箱から削除したファイルを復元</a></strong>する方法を、初心者の方にもわかりやすく解説します。

## なぜMacゴミ箱から削除したファイルを復元できるのか？
Macのゴミ箱は、削除したファイルを完全に消去するのではなく、一旦保管する場所です。そのため、ゴミ箱から削除した直後であれば、簡単に復元できることが多いです。


## ゴミ箱からファイルを復元する方法

### 1．Macゴミ箱にファイルが残す場合

<a href="https://x.gd/J8KHk" rel="nofollow noopener" target="_blank">Macゴミ箱から削除したファイルを元に戻す</a>ことは、一つ目の方法です。

1．Dockにあるゴミ箱のアイコンをダブルクリックするか、Finderを開き、サイドバーのゴミ箱をクリックします。

2．ゴミ箱内に表示されたファイルの中から、復元したいファイルを選びます。

3．選択したファイルを右クリックし、「戻す」を選択して、復元します。

![WeChatワークスクリーンショット_e6639e2d-cbd0-4f20-8ef8-012e059f81f9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873918/df71eab6-fbd4-6978-ab48-a4f0ed1d3686.png)

### 2．ゴミ箱を空にしてしまった場合

Macゴミ箱を空にしてしまった場合でも、まだMacゴミ箱削除したファイルを復元できる可能性はあります。

#### 1. Time Machineを利用する

Time Machineとは、Macに標準搭載されているバックアップ機能です。Time Machineを有効にしていれば、定期的にMac内のデータがバックアップされます。

<strong>復元方法:</strong>
Time Machineのメニューから、復元したい時点のバックアップを選択し、復元したいファイルを探して復元します。

#### 2. データ復元ソフトを利用する
データ復元ソフト「<a href="https://x.gd/tWgPd" rel="nofollow noopener" target="_blank">Tenorshare 4DDiG(Mac)</a>」は、Macゴミ箱から誤って削除されたファイルを復元するために開発された専門のソフトウェアです。
<a href="https://x.gd/tWgPd" rel="nofollow noopener" target="_blank">Tenorshare 4DDiG(Mac)</a>はHDD/外付けHDD、USBメモリ、SDカードや空にしたゴミ箱などの2,000以上のデバイスから無制限データを復元できます。

<ul data-sourcepos="243:1-246:0">
<li data-sourcepos="243:1-243:88">メリット: Time Machineを利用できない場合や、より高度な復元機能が必要な場合に有効です。</li>
<li data-sourcepos="244:1-244:41">デメリット: 無料版には制限があります。</strong>
</li>
</ul>
手順1．<a href="https://x.gd/tWgPd" rel="nofollow noopener" target="_blank">Tenorshare 4DDiG(Mac)</a>を起動し、「ごみ箱」を選択してスキャンします。

![WeChatワークスクリーンショット_50df083e-ca83-4417-9448-769e547a3401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873918/7d055584-daaf-85b0-26a1-de9d5e7bb8c7.png)

手順2．スキャン結果が出ましたら、ゴミ箱から削除したファイルを探すことができるようになります。

![WeChatワークスクリーンショット_3795843d-e081-4509-a3df-89f47c9b7c6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873918/d2fb205b-89de-87bd-f303-f06c1b454905.png)

手順3．復元したファイルの保存場所を選択して、MacローカルまたはGoogleドライブに保存します。

![WeChatワークスクリーンショット_98f1d247-1fff-4a7e-8e58-7f91f3f53da4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873918/dc98b0fe-6b47-5dd6-2431-8d0db9c521e9.png)


## 復元できる可能性を高めるために
<ul data-sourcepos="243:1-246:0">
<li data-sourcepos="243:1-243:88">復元作業をすぐに開始: 削除した直後に復元作業を開始するほど、復元の成功率が高まります。</li>
<li data-sourcepos="244:1-244:41">新しいデータを書き込まない: 削除したファイルが保存されていた場所に、新しいデータを書き込まないようにしましょう。</li>
<li data-sourcepos="244:1-244:41">専門業者に相談: 自力で復元できない場合は、データ復旧の専門業者に相談することができます。
</li>
</ul>

## まとめ
<a href="https://x.gd/tWgPd" rel="nofollow noopener" target="_blank">Macのゴミ箱から削除したファイルは、適切な方法で復元</a>できる可能性があります。
この記事を参考に、大切なデータを失う前に、バックアップの習慣を身につけましょう。
特に、Macゴミ箱か空にした場合、復元できないような場合は、Macデータ復元ソフト[「Tenorshare 4DDiG Mac」](https://x.gd/tWgPd "4DDiG製品ページ")があれば、復元できる可能性があります。

:::note info
Tenorshare 4DDiG Macを無料ダウンロード：https://x.gd/tWgPd
Tenorshare 4DDiG Macでゴミ箱を復元：https://x.gd/hrp1N
:::
EXCELマクロって不便？

# 【Excel VBA】マクロ記録の不便さとアクティブセル対応のスクリプト

Excelの**マクロ記録機能**を使ったことがある方なら、  
「**記録したときと同じセルにしか処理できない**のが不便」と感じたことがあるのではないでしょうか？

例えば、**セルを結合するマクロ**を記録すると、**特定のセル範囲に対してしか動作しない**ため、  
他のセルで実行しようとしても期待通りに動作しません。  

せめて**アクティブセルや選択範囲に応じて動作するマクロ**があれば便利ですよね。  
そこで、「どのセルでも実行できるセル結合マクロ」を紹介します。

---

## **🔹 選択範囲を結合するマクロ**
以下のマクロは、**選択範囲を結合し、中央揃えにする**処理を行います。  

```vba
Sub MergeSelectedCells()
    ' 複数のセルが選択されているか確認
    If Selection.Cells.Count > 1 Then
        ' 選択範囲を結合する
        Selection.Merge
        
        ' 結合したセルに値を設定する
        Selection.Value = "結合されたセル"
        
        ' 結合したセルの中央にテキストを配置
        Selection.HorizontalAlignment = xlCenter
        Selection.VerticalAlignment = xlCenter
    Else
        MsgBox "複数のセルを選択してください。"
    End If
End Sub
【OpenAI o1】が登場しました。わかったことだけ報告。


　どうも、カーブミラーです。

　今回は、OpenAIの新たなモデルの紹介です。現時点でわかったことを書きますね。

:::note info
本記事は、ChatGPT Plusで
行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュースです。

　というか、
　　これ自体がニュースでしょ😸

　では、さっそく。
***
　今回は、
　　OpenAIが
　　　新たなモデルを発表。

　同時に、
　　ChatGPT上に
　　　載せてきました。

　名前は、
　　“o1”です。
　　　GPT-4oのように
　　　　GPTは付いていません。

　以前から、
　　StrawberryとかOrionとかいう
　　　コードネームが
　　　　流れていたのですが、
　　　　　実物が出てきたわけです。

　発覚、というか発表前に
　　サム・アルトマンが
　　　[Sam Altmanポスト](https://x.com/sama/status/1834276403270857021?t=uD8u12WuD5XtjG_nfOXUBQ&s=19)で
　　　　“ジミー、もう我慢できないよ”
　　　　　とポストしてきました。

　それから
　　公式に発表がされて、
　　　YouTube動画が出されました。

　o1についての公式発表は、
　　公式ホームページのこちら。
　　　[OpenAI公式](https://openai.com/index/learning-to-reason-with-llms/)
***
***公式ホームページより抜粋（和訳）***
OpenAI o1 を紹介します。o1 は答える前に考えます。つまり、ユーザーに応答する前に長い内部思考の連鎖を生み出すことができます。
***

　これまでのChatGPTのモデルが
　　即答だったのに対し、
　　　o1は内部で熟考する、という話。

　そのため、
　　さまざまな問題への回答の
　　　正解率が上がったそうです。
***
　o1は
　　PlusユーザーとTeamユーザーに
　　　開放されています。

　　EnterpriseとEduユーザーは
　　　来週から利用可能だそうだ。

　　そのうちに
　　　無料ユーザーにも提供予定。
　　　　（o1-miniのみ）

　Web版、アプリ版、ともすでに開放。
![Screenshot_20240913-080957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f973c277-702f-eac5-a7de-0b3bbdb1c142.png)
![Screenshot_20240913-091142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/09b4739f-f98d-c3cb-d18b-1f08226119e6.png)

　この画面を見て
　　おわかりだと思いますが、
　　　o1には、ふたつのモデルが
　　　　あります。

　o1-previewは
　　強力な推論能力と
　　　幅広い世界知識を持っています。

　o1-miniは
　　o1-previewより速く、
　　　80%安く、
　　　　コーディングタスクで
　　　　　競争力があります。
　[OpenAI開発者ポスト](https://x.com/OpenAIDevs/status/1834278699388338427?t=kkFeym6XzHYQR0SNjn6xBQ&s=19)

　また、それぞれに
　　制限が設けられています。
　　　o1-previewは、週に30メッセージ
　　　o1-miniは、週に50メッセージ
　　　　です。

　このため、
　　用途によって、
　　　これまでのGPT-4系モデルとの
　　　　併用することが考えられます。
***
　実力はどうなのか？

　私には評価する力が
　　ありませんので、
　　　ほかの方のポストや記事を
　　　　参照してください。

　とりあえず、
　　チャエンさんのだけ置いときます。
　　　[チャエンさんポスト](https://x.com/masahirochaen/status/1834281396254507147?t=LeHWcE5CHtdv0HEXBod84A&s=19)
***
　実際に使ってみました。

　使ったのは、
　　o1-miniです。

　まずは基本的なことを。
　・CodeInterpreter、
　　　DALL-E3、
　　　　Webの接続は、できない。
　　　　　（将来的には追加される）

　・ファイルのアップロードも
　　　できない。

　・ラストナレッジカットオフは、
　　　2023年10月までのもの。

　やり取りをしてみて。
　・空白行を返すことがある。
　　　→回答の“∨”をタップすると
　　　　やっていることが出てくる。
　・熟考している時間は、数秒程度。
　・出力は、出しはじめたら早い早い。
　　　GPT-4o-miniよりも早い印象。
　　　　おそらく内部で出力準備してた。
　・出力が終わったと思っても
　　　ずっとこちらに戻ってこない
　　　　ことが何度かあった。
　　　　　中止アイコンを押す。
　　　　　　あれ？　アプリ版に
　　　　　　　中止アイコンないよね？
　　　　　　　　どうするんだろ？

　最後に、o1について
　　DALL-E3とCode Interpreterを
　　　使う私には、利用メリットが
　　　　今のところ、ありませんね😅
　　　　　将来に期待。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。