OmniAICreator/Qiita-1.07M huggingface dataset:
InfluxDBをdocker composeで起動する

# 概要
InfluxDBをdocker composeにて起動するためのセットアップ手順です。
非rootコンテナである[bitnamiのコンテナイメージ](https://hub.docker.com/r/bitnami/influxdb)を利用します。

# 環境
本手順で取り扱う内容は、次の環境にて確認しています。

マシン：Amazon EC2
OS：Ubuntu 24.04
Docker：27.2.0
Docker Compose：v2.29.2
influxDB：2.7.10


# 構成図
構成は次のようにします。
InfluxDBを利用するアプリケーションが存在するわけですが、
InfluxDBはアプリケーションとは別管理としたく、docker composeを分けます。
全てを同一のdocker composeでまとめることも、それぞれを別マシンにて動かすことも技術的には可能だと思いますが、今回はこのような構成とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/db1148de-e1ee-ecd3-26d1-73f6ba061617.png)


# 手順
influxDBコンテナ用のディレクトリを作成します。
ここでは`influxdb`としていますが、任意のディレクトリ名で構いません。
```
$ mkdir influxdb
$ cd influxdb
```

`compose.yaml`を作成してください。内容は次の通りです。
influxDBのバージョンが2.7.10となっていますが、こちらは本記事投稿時の最新バージョンですので、任意のバージョンを指定下さい。
環境変数についても任意の値に書き換えて下さい。
ネットワークについてですが、アプリケーションからinfluxDBを名前解決できるように、両者を同じネットワークに所属させます。そのため、<アプリケーション用のdockerネットワーク名>と記載された箇所は、同じ名前を記載して下さい。
`docker network ls`を実行すればdockerネットワークの名前が分かるはずです。
Portについては、外部からのアクセスを受け付けないようにポートマッピングは行っていません。もし、外部からInfluxDBのWebUI画面等にアクセスしたい場合は、`services.influxdb`に次の記述を挿入して下さい。

```
    ports:
      - 8086:8086
```

```
services:
  influxdb:
    container_name: influxdb
    image: bitnami/influxdb:2.7.10
    restart: unless-stopped
    environment:
      - INFLUXDB_ADMIN_USER=<admin ユーザ名>
      - INFLUXDB_ADMIN_USER_PASSWORD=<パスワード>
      - INFLUXDB_ADMIN_USER_TOKEN=<管理者用トークン>
    volumes:
      - influxdb_data:/bitnami/influxdb:rw
    networks:
      - <アプリケーション用のdockerネットワーク名>

networks:
  <アプリケーション用のdockerネットワーク名>:
    external: true

volumes:
  influxdb_data: {}
```

`compose.yaml`が作成できたら、コンテナを起動します。
```
$ docker compose up -d
```

コンテナが起動したことを確認してください。
```
$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED          STATUS          PORTS                                           NAMES
eec4fe29c9c6   bitnami/influxdb:2.7.10                  "/opt/bitnami/script…"   3 seconds ago   Up 2 seconds   8086/tcp, 8088/tcp                              influxdb
```

これでInfluxDBの起動は完了です。

# 参考
https://hub.docker.com/r/bitnami/influxdb
ExcelのOfficeスクリプトを触ってみた

# Officeスクリプトって？
主にExcel内で使用できるスクリプトです。
セルに色をぬったり値を変更したり操作を保存できたり…と、やっていることはVBAマクロみたいなイメージですが、Power Automateから呼び出すことができます！
※Power Automate for DesktopはVBA呼び出しができます

# ExcelでOfficeスクリプトを作成する方法
1. スクリプトを埋め込みたいExcelをブラウザで開きます
1. 「自動化」タブを選択します
1.  タブ内の「新しいスクリプト」をクリックします

# 今回やってみたこと
| グループ | メールアドレス |
|:-:|:-:|
| グループ１  | aaa@abc.co.jp  |
| グループ１  | bbb@abc.co.jp  |
| グループ２  | ccc@abc.co.jp  |
| グループ２  | ddd@abc.co.jp  |

上記のようなテーブルがあるExcelで、指定したグループの任意の１つのメールアドレスを取得します。
Power Automateで全て実装しようかとも思ったのですが、
Officeスクリプトの方がわかりやすいコードを書けるのでは？と思い着手しました。

# コード
```
function main(workbook: ExcelScript.Workbook, group:string) {
    // テーブル取得
    let myTable = workbook.getTable("テーブル1");

    // テーブルとれたかな？
    if (myTable) {
        const GROUP_INDEX = 1;
        const EMAIL_INDEX = 2;

        let bodyRange = myTable.getRangeBetweenHeaderAndTotal();
        let tableRowCount = bodyRange.getRowCount();
        let bodyRangeValues = bodyRange.getValues();
        let email: Array<string> = new Array();

        // グループが引数groupと一致するメールアドレスを配列に詰める
        for (let i = 0; i < tableRowCount; i++) {
            let row = bodyRangeValues[i];

            if (row[GROUP_INDEX] == group) {
              email.push(row[EMAIL_INDEX].toString());
            }
        }

        // 配列からランダムにピックアップする
        const randomInt = Math.floor(Math.random() * email.length);
        return email[randomInt];
    } else {
        console.log(`MyTable is not in the workbook.`);
    }
}

```

# Power Automateからの呼び出し
Excel Online (Business)　の 「スクリプトの実行」を選択し、
対象のスクリプトを選択すれば呼び出し可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/646e5c60-f65b-f0aa-edf8-4695f5395aa7.png)

戻り値を使用したい場合は、「result」という形で変数を参照することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/ac51c8a0-2207-7ee5-2fc4-c7071656756e.png)


# 参考にしたサイト
- [Excel の Office スクリプト](https://learn.microsoft.com/ja-jp/office/dev/scripts/overview/excel)
    サンプルがたくさん載っているので、とても参考になります！
    今回は[Teamsカードとしてのタスクリマインダー](https://learn.microsoft.com/ja-jp/office/dev/scripts/resources/scenarios/task-reminders)を特に参考にしました
サイバー攻撃による国内クレジットカード情報漏えいインシデントまとめ/2024年8月公表分

## 概要

- 2024年8月に公表されたクレジットカード情報漏えいインシデントのまとめです

## notes
- この月間に公表したものなので、各インシデントごとの被害発生期間は別です
- どの程度のインシデントと被害が月ごとに発生しているかの備忘録であり報道記事ではないので、当事者等の個別具体的名称は書きません
- 被害に遭った可能性のある人には事業者等より個別に連絡があると思われます


## 当月の被害の概要

- この月は、4件のクレジットカード情報漏えいインシデントが国内で公表されました
- 合計で、82,963件ほどのクレジットカード情報について漏えいの可能性があるそうです

## 当月のインシデント

### 1. 物産品販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- 139,190名の個人情報の漏えいの可能性について、公表された内容に記載されています
- 18,746名のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年3月10日～2024年5月22日とのことです
- 2024年5月21日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです

### 2. 水産食品販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、利用していたサイト構築サービスのクロスサイトスクリプティング脆弱性を悪用による改ざんとのことです
- 21,728名の個人情報の漏えいの可能性について、公表された内容に記載されています
- 11,844名のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年4月22日～2024年5月14日とのことです
- 2024年5月14日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです

### 3. 洋菓子販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、利用していたサイト構築サービスのクロスサイトスクリプティング脆弱性を悪用による改ざんとのことです
- 7,018件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年6月17日～2024年5月19日とのことです
- 2024年5月21日に、外部機関より漏えいの可能性の連絡を受けてインシデントが発覚したそうです

### 4. 洋菓子販売サイト

※上記の洋菓子販売サイトと同じ企業が運営するサイトです

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、利用していたサイト構築サービスのクロスサイトスクリプティング脆弱性を悪用による改ざんとのことです
- 45,355件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2020年4月27日～2024年5月21日とのことです
- 2024年5月21日に、外部機関より漏えいの可能性の連絡を受けてインシデントが発覚したそうです


## 感想

最近の傾向と比べて、今月公表されたインシデントの数は平均的ですが、1件あたりの被害規模が全体的に大きかったと思います


## おまけ

### 「クレジットカード・セキュリティガイドライン」

- [経産省：「クレジットカード・セキュリティガイドライン [5.0版]」](https://www.meti.go.jp/press/2023/03/20240315002/20240315002.html)
- [(一社)日本クレジット協会:関連資料](https://www.j-credit.or.jp/security/document/index.html)
systemd経由でsyslogへ流れるログのfacility

# 趣旨

- systemdから起動する常駐プロセスは、自前でsyslogへログ出力するよりも標準出力・標準エラーをsystemdとjournaldに預け、そしてsystemd/journaldを通じてでログ管理するというのがsystemdの流儀のようだ
- そんなsystemdでsyslogへログ出力するようにしていた場合、facility制御ってどうするのかという話

# 結論

systemdのマニュアル[systemd.exec(5)](https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html)に、"SyslogFacility"で設定する、と書いてある

## 別のやり方

systemdの流儀に従わない。つまりログを標準出力・標準エラーに流さず従来のやり方(自前でsyslog出力をする)で行うようにしても目的は果たせる
既存のシステムを代変わりリプレースするようなケースではこちらの選択肢を取ることも多いだろう
KnativeでHello Worldしてみた

# 概要

Knativeは、Kubernetes上でサーバーレスアプリを簡単にデプロイ＆スケーリングできるフレームワークです。

この記事では、[Mac mini (2023)](https://support.apple.com/ja-jp/111837)上で、  
KnativeでHello Worldした内容を共有させていただきます。

# インストール方法

以下は、Knative CLI(`kn`)をMacにインストールし、  
KnativeとKubernetesをMinikubeのインスタンスにインストールするコマンドです。

```
brew install knative/client/kn
brew install knative-extensions/kn-plugins/quickstart
kn quickstart minikube
```

minikube環境にアクセスするためのトンネル設定:

```
minikube tunnel --profile knative
```

動作チェック:

```
$ minikube profile list
|---------|-----------|---------|--------------|------|---------|---------|-------|--------|
| Profile | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes | Active |
|---------|-----------|---------|--------------|------|---------|---------|-------|--------|
| knative | docker    | docker  | 192.168.49.2 | 8443 | v1.30.0 | Running |     1 |        |
|---------|-----------|---------|--------------|------|---------|---------|-------|--------|
```

# Hello Worldのデプロイ

以下は、knativeによって用意されているイメージ `ghcr.io/knative/helloworld-go`をKnative Serviceとしてデプロイした結果です。

```
$ kn service create hello \
--image ghcr.io/knative/helloworld-go:latest \
--port 8080 \
--env TARGET=World
Warning: Kubernetes default value is insecure, Knative may default this to secure in a future release: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation, spec.template.spec.containers[0].securityContext.capabilities, spec.template.spec.containers[0].securityContext.runAsNonRoot, spec.template.spec.containers[0].securityContext.seccompProfile
Creating service 'hello' in namespace 'default':
  0.053s The Route is still working to reflect the latest desired specification.
  0.069s Configuration "hello" is waiting for a Revision to become ready.
  0.080s ...
  8.247s ...
  8.260s Ingress has not yet been reconciled.
  8.292s Waiting for load balancer to be ready
  8.488s Ready to serve.
Service 'hello' created to latest revision 'hello-00001' is available at URL:
http://hello.default.127.0.0.1.sslip.io
```

上記で標準出力をcurlで叩くとHello World文字列が返ってきます。

```
$ curl 'http://hello.default.127.0.0.1.sslip.io'
Hello World!
```

# おわりに

今回は、Knativeを使用してMac mini (2023)上でHello Worldアプリケーションをデプロイし、その動作を確認しました。Knativeを使うことで、サーバーレスアプリケーションのデプロイが非常に簡単に行えることがわかりました。

今回の記事ではスケーリングの様子については触れていませんが、次回の記事でKnativeのスケーリング機能やその動作について取り上げたいと思います。
リモートMySQLサーバーに対してSQLファイルを実行する。

リモートMySQLサーバーに対してSQLファイルを実行する。

```bash
mysql -h <HOST> -u <USER> -p <DATABASE> < <SQL_FILE_PATH>
```

公式ページ曰くSQLファイルでなくても、テキストファイルでもいけるっぽい？

https://dev.mysql.com/doc/refman/8.0/ja/mysql-batch-commands.html
Wordの数式で通分の斜め線を引く方法

## 巷でよく説明される方法
Wordの数式で通分の斜め線を引く方法として、次の方法が一般的に紹介されているかと思います。
- フィールドコードを使う方法
- 図形やテキストボックスを使う方法

## 今回説明する方法
- あくまで数式
- 数式が改行等により動いても斜め線が追随

## 実際の方法

1. まずは分数を入力します。普通に「2/4」スペースと入力して、分数を入力します。
1. 分子の2を選択した状態で、[数式ツール]->[デザイン]->[アクセント]->[四角囲み数式]を選択します。
![20240903_Word数式通分手順_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744936/cee3ce82-5700-2bbc-4278-4c5a8a4ee4f4.png)
1. 分子の2が選択された状態のまま、右クリックして、[罫線のプロパティ]->[左上からの取り消し斜線の追加]を選択します。
![20240903_Word数式通分手順_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744936/2864b87a-c045-92cd-85de-7ced8ebb9c5d.png)
1. 引き続き、[罫線のプロパティ]->[上端を表示しない]・[下端を表示しない]・[左端を表示しない]・[右端を表示しない]を選択していきます。
1. ４辺が表示されなくなった四角囲みの右側に「^1」スペースと入力してべき乗を入力してやります。
![20240903_Word数式通分手順_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744936/c9235f87-b879-c864-dd47-a72dd93eddc7.png)
1. 分母も同様にしてやれば通分の完成です。
![20240903_Word数式通分手順_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744936/ff663484-8e29-a48a-42fa-b15c282863dc.png)

## 留意事項
機械にこの数式を読ませると、「『4の2乗』分の『2の1乗』」すなわち「8分の1」と解釈される虞があります。
~初めての案件を終えて~


今回は初めての案件を終えて、自身の良い点、悪い点をアウトプットしつつ今後の
改善点や、これから案件に向かう方への手助けになればいいかなと思います。
堅苦しいのは苦手なのでふわっと書いていきます。

---
### 1.はじめに
:::note info
  ---どんな案件だったの?---
今回の案件は施工管理の案件でした。:gear:
とっても簡単に言えば「工事してる人のサポート」みたいなもんです。
:::

最初の案件にはふさわしい(?)電話対応やデータ入力、資料作成が主だった
内容の業務でした。

私は電話対応は前職で経験しているので全く苦ではありませんでしたが
:rage:電話やだ‼めんどくさい‼
と思っている方は覚悟を決めて望んでいただければと思います。
あくまで数人から聞いた話では、未経験入社では割と電話対応は多いみたいなので...

そんな未経験で入った私が経験した今回の案件でのいろんなことを書いていきます。

---

### 2.自身の成長(?)

:spy:「良いニュースと悪いニュースどっちから聞きたい?」
:sushi:「良いニュースから、ポジティブにいこう」

---<font color="Blue">良いニュース</font>---
現場環境がすこぶるよかった、人間関係のぎすぎす感もまーったくなく
疑問点や改善点などもすぐに聞き入れ、取り入れてくれる良いプロジェクトだったなと
感じています。
正直、人間関係のぎすぎす感ってめっちゃしんどくないですか？
そういうのがあるとないとで仕事のしやすさや意見の出しやすさって変わりますよね。

そんな環境ということもあって、現場では様々な意見が飛び交い、それを皆で
ブラッシュアップしていきミスを減らす、そういった働きがメンバー間で行うことができました。
私自身も改善点や問題点を積極的に発言し、皆の意見をまとめることにも注力できたかな
と考えています。
良くも悪くも、意見交換をしなければどんなミスが起きているか、どんなことに対応していくか、いまどういう状況か、という部分を把握できなかったのでその分言葉でのコミュニケーションや状況説明の重要性を学ぶことができたと思います。


今後の現場でも今回のように意見が出せる場があれば発言し、メンバー間の友好化と共に
改善や効率化に繋がる動きをしていきたいと考えています。


---<font color="Red">悪いニュース</font>---
発足すぐのプロジェクトだったため、マニュアルが全くない!!
これって何？あれってどういうこと？みたいなことがありました。
ただこれをプラスに見れば、自分たちで良い案を出して試せるということ。
(もちろん常識や業務に支障のない範囲内で)
しかし、トラブルが起きた時に結構あれもこれもやばい‼みたいになる。

これが思ってたよりしんどかった...
電話対応の際にもイレギュラーなことを聞かれたら臨機応変に対応、資料作成でも
こういう時はこう、みたいなものも自分たちで模索して最終的には他メンバーが
マクロを組むことで効率化に繋がりました。

:sushi:「ここは見習わなきゃと思いましたね。自身の技術力の未熟さを痛感しました。」
(男性、会社員の方からのご意見です。)



---


### 3.まとめ
---<font color="green">もうすこしがんばりましょう:beginner:</font>---
通信簿に書かれた記憶がよみがえりますね。
今回の案件を通して分かったことは、IT技術を学んでいくうえで重要な部分を思い知りました。
特に2つ‼

:::note warn
・**業務効率化のために技術を磨く**
・**人の手が加わるほどミスが起きる**
:::

正直当たり前だろと思う方もいらっしゃると思います。
ですが未経験で初めての現場を経験した私にとってはこの当たり前が大変でした。

業務効率化のために関数を使う、マクロを組む

これができるできないでかなりの時間の短縮につながると痛感しました。
資料作成の際にはよっぽど完璧にやっているつもりでもミスは起きます。
タイピング完璧にやっているつもりでも誤字脱字もそうですしものによっては
半角全角の指定もあります。
すべてタイピングで済ませようとしたら**30分**
マクロ組んだら**3分**
この差はとても大きいです。貢献度も違います。

:::note alert

会社によってはマクロを勝手に組んではいけない可能性もあるので
しっかりと相談したうえで行うこと‼
世の中は悪意あるマクロを走らせる人もいます。
それを未然に防ぐこと、また自身が行わないことも大事です‼
:::


:sushi:「タイピング早けりゃ問題ないじゃん」

これが通用するのは小学生まででした。もう少しがんばりましょう。:white_flower:

***
【ABC369】D - Bonus EXP のイメージベース解説(動的計画法の基本が理解できる)

## 目的
[AtCoder公式解説](https://atcoder.jp/contests/abc369/editorial/10841)を見て動的計画法の基本が理解できたので、復習用にイメージベースで解説

## 問題
https://atcoder.jp/contests/abc369/tasks/abc369_d

## 解き方
1. モンスターを倒した回数が偶数回だった場合の経験値の合計の最大値(evenExp)と奇数回だった場合の経験値の合計の最大値(oddExp)を求める
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/94f8f92d-e0c4-69a4-49ad-0853523a116f.png)
  <font color="Red">※evenExpは`今回の経験値 * 2 + oddExp`と`計算前のevenExp`の最大値</font>
  <font color="Red">※oddExpは`evenExp + 今回の経験値`と`計算前のoddExp`の最大値</font>
  1-1. evenExpを0でoddExpを-Infinity(初回のevenExpの計算結果を0にするため)で初期化
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/dd82f6ad-a05f-ef82-cefb-0212628f4a05.png)
  1-2. 1回目のevenExpとoddExpの計算
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/c620698c-461e-4ab2-0521-ed7ffb976603.png)
  <font color="Red">※初回の戦闘なので、evenExp=0でoddExp=1になる</font>
  1-3. 2回目のevenExpとoddExpの計算
![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/c4968f0f-49e6-ce6b-bd39-c782f4a062c4.png)
  <font color="Red">※evenExpは`5 * 2 + 1`で11となり、計算前の0より大きいので11</font>
  <font color="Red">※oddExpは`5 + 0`で5となり、計算前の1より大きいので、5</font>
  1-4. 3回目のevenExpとoddExpの計算
![1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/ff875ff8-fb93-f200-095e-6eec6774388b.png)
  <font color="Red">※evenExpは`3 * 2 + 5`で11となり、計算前の11と同じなので、11</font>
  <font color="Red">※oddExpは`11 + 3`で14となり、計算前の5より大きいので、14</font>
  1-5. 4回目のevenExpとoddExpの計算
![1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/f91e34b9-4e57-6b88-28ae-f67c9ee3ec8c.png)
  <font color="Red">※evenExpは`2 * 2 + 14`で18となり、計算前の11より大きいので、18</font>
  <font color="Red">※oddExpは`11 + 2`で13となり、計算前の14より小さいので、14</font>
  1-6. 5回目のevenExpとoddExpの計算
![1-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861065/c08060a0-1091-468d-adca-6a950f629e83.png)
  <font color="Red">※evenExpは`7 * 2 + 14`で28となり、計算前の18より大きいので、28</font>
  <font color="Red">※oddExpは`18 + 7`で25となり、計算前の14より大きいので、25</font>
2. evenExpとoddExpの最大値である**28**が答え

## コード
https://atcoder.jp/contests/abc369/submissions/57400889
```ruby
N, _ = gets.split.map(&:to_i)
A = gets.split.map(&:to_i)

# モンスターを倒した回数が偶数回だった時の経験値の合計の最大値
evenExp = 0

# モンスターを倒した回数が奇数回だった時の経験値の合計の最大値
oddExp = -Float::INFINITY # 初回のevenExpの計算結果を0にするため、-Float::INFINITYで初期化

A.each{|exp|
  oldEvenExp = evenExp

  # `今回の経験値 * 2 + oddExp`と`計算前のevenExp`の最大値
  evenExp = [exp * 2 + oddExp, evenExp].max()

  # `evenExp + 今回の経験値`と`計算前のoddExp`の最大値
  oddExp = [oldEvenExp + exp, oddExp].max()
}
puts [evenExp, oddExp].max()
```
WindowsのOpenSSHクライアントの日本語文字化け

WindowsのOpenSSHクライアントの日本語文字化けについて説明します。
Windows10/11ではOpenSSHクライアントがデフォルトでインストールされています。ここでは、このOpenSSHクライアントを使用して文字化けする場合の解決方法を説明します。

結論としては、サーバ側の文字コードをUTF8に設定して下さい。
WindowsのOpenSSHクライアントは必ずUTF8になり、変更することはできません(と思います)。変更方法をご存知の方がいたらコメントで教えて下さい。
サーバ側で文字コードを変更することができない場合、解決方法はありませんので、サードパーティのフリーのsshアプリ（TeraTermやPuttyなど）を使用して下さい。Linuxであれば容易に変更できると思いますが、ネットワーク機器などでUTF8サポートしていない場合（これもまたレアケースだと思いますが）は、どうしようもありません。私が使っているヤマハ製のルータでは、UTF8をサポートしていません。

:::note info
ヤマハ製のルータでも最近のものは`console character ja.utf8`で設定できるようです。
:::

:::note alert
コマンドプロンプトで、chcpコマンドでコードページを変更すれば変更可能といった記事も見受けられますが、sshコマンドを実行すると、以下のようにUTF8に代わっていることがわかります。
![スクリーンショット 2024-09-03 16.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814256/0acf4b95-0de9-56d2-aca0-6751a84ee5f5.png)
sshのセッションを終了してもこの設定は変わりません。元に戻したい場合は`chcp 932`コマンドを実行するか、新しいコマンドプロンプトを開いて下さい。
:::
Webシステム負荷テストの始め方

やるならまずこれだけは、というものを

重要度順(高 ... 中の上 ... 中 ... 番外編)に並べている

# 重要度 高

## モニタリングツールの導入

テストする・しないに関わらずモニタリングツールを入れる

* 負荷箇所の検出 - N+1, スロークエリ, 長時間読込など
* アラート常時通知

この二つが把握できないと、テストのしようがない

`Web モニタリングツール` / `Web 監視ツール`

のような単語で探し、予算内で導入する。詳細は他の優秀な記事に任せる

## 限界テスト

![stress_limit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/261effe3-2ec8-6a3b-54f3-64ce53b9a3e3.png)


**目的**

「システム限界値」把握の為

**実施方法**

* 負荷環境へのリクエスト量を段階的に上げる
* 以下の点を検証する
  * どの時点で、一部が機能不全になるか
    * その一部不全は許容されるのか
  * どの時点で、完全に機能不全になるか

# 重要度 中の上

## 大規模データテスト(ボリュームテスト)

![stress_volume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/4c05840d-d00d-d715-94ff-3a91df759039.png)


**目的**

DBその他ストレージの評価性能・移行計画の為

**実施方法**

(1) 現状把握

本番DBおよびストレージの「データ増加傾向」を理解する

(2) 予測

* どのテーブル(データオブジェクト)が
* どれだけの倍数増えそうか

(3) データ用意

予測を基に多量データを用意する。以下は例

* 基準数
* 基準数 * 2 倍
* 基準数 * 10 倍
* etc.

(4) テスト

「通常のリクエスト負荷」をかけて、挙動を確認する

(5) 検証

テスト後のデータで、次を検証する

* いつまで現状のストレージ構成を保てるか
* いつからストレージ構成変更が必要か

# 重要度 中

## スパイクテスト

![stress_spike.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/154b0883-f595-e80d-b9aa-81b4dc113172.png)


**目的**

突発的な負荷に短時間耐えられるかを検証する為

**実施方法**

* 短時間で急激に負荷を上げる

繁忙時間(ホットタイム)や突発的イベントで予測されるリクエスト量を集中させる

負荷環境が、その突発性に耐えられるかを検証する

もし余裕があれば

* スパイクの量はどこまでいけるか

もテストする

## 耐久性テスト(ロングランテスト)

![stress_longrun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/7701c3fc-cd76-9033-9092-14433ab1cc1f.png)


**目的**

ミドルウェアの性能低下(メモリリークなど)を検出する為

**実施方法**

最低 24 時間連続で、通常運用時の80%程度負荷をかける

短時間(スパイク)はOKだが、長時間(ロングラン)だと顕在化する問題を炙り出す

主にリソース枯渇周りに着目したい

# 番外編 - 負荷テストと同時にやりたい

## フェイルオーバーテスト

**目的**

システムダウン時の挙動テストの為

**実施方法**

意図的にシステム許容外の負荷量を与え、システムダウンさせる

のち、意図した通りに「元通りになるか」を確認する
HTTPの基本、URL／メソッド／ボディ（＋ヘッダ）

## HTTPはリソースに対する操作
- リソース：要は「もの」なのだが物と連想しにくいものもある
  →語彙が試される！
- 操作：メソッドのこと。よく使うのはPOST/GET/PUT/DELETE
  →DBのCRUD操作と対応させるとイメージしやすい

----
## URLの大原則（1/2）
- 同じリソースには同じURLを
- 異なるリソースには異なるURLを

----
## URLの大原則（2/2）
- 「同じ」の範囲とは？クエリ文字列は？フラグメントは？
  → オリジン＋パスが同じなら、同じリソースとみなす
- クエリ文字列は見せ方などのオプション、フラグメントはリソース内のより詳細な位置

----
## GETメソッド（1/2）
- 重要な性質：**副作用がない**
  ・・・ように実装すべき
- 逆に、副作用があるべきではない操作はGETを用いるべき
　代表的なアンチパターンは複雑な条件のある検索をPOSTで表現してしまうこと

----
## GETメソッド（2/2）
- 何度呼び出しても状態が分からない性質を「冪等（べきとう）」という

----
## メソッドの注意点
- HTMLのformタグではGETとPOSTしか使えない
- HTTPの仕様をフル活用するならAJAX（Fetch APIなど）は必須！

----
## ボディ
- 要はデータ
- しかし付加情報がないと正しく処理できないこともある
  → そこでヘッダの出番

----
## ヘッダ
- リクエストとレスポンスの付加情報（メタ情報）
- 例えばボディのデータの形式
  Content-Type: application/jsonとか
- めちゃくちゃ多彩
  → HTTPを深く知るには必須！

----
## 最後に
- HTTPを深く知ることはWebアプリの解像度を高める有効な手段
- F12ツールでHTTP通信を解析可能
NFSのroot_squashってなに

<h3>はじめに</h3>
CTF初めて２カ月の初心者がTryHackMeのNetworkService2のNFSをやるなかで学んだことを共有します。

https://tryhackme.com/r/room/networkservices2


<h3>NFS</h3>
Network File System.ファイル共有プロトコル。<br>
プラットフォーム間の互換性があり、Linux、MACos、WindowsなどOSを跨ぐファイル移動時につかわれている。<br>
マウントすることでNFSサーバーの共有ディレクトリーをローカルファイルのように扱うことができる。NFSサーバーからファイルをDownloadせずとも直接実行、編集することができる。<br>
<h4>類似ファイル共有プロトコルとの違いと強み</h4>
FTP.ファイルをダウンロードしないと編集できない。
SMB.名前解決などファイル共有以外の機能もあり、ヘッダーが大きくなってしまう。

<h3>root_squash</h3>
NFSにおいてはNFSクライアントのrootユーザーがNFSサーバー上で「nobody」として扱われる設定です。もしNFSサーバーが root_squash を無効にしている場合（no_root_squash 設定がされている場合）、クライアント側の root ユーザーがそのままサーバーの root 権限で操作できることになります。<br>



<h4>no_root_squash時の攻撃例！</h4>
<a href="https://eng-entrance.com/linux-permission-suid">SUID</a>を設定したbashファイルを使った攻撃<br>
①クライアント側でroot権限で実行されるSUIDのbashファイル"bash"作成。<br>
②NFSを使って"bash"をNFSサーバーに保存する。<br>
③SSHなどを使ってuserとしてNFSサーバーに接続して、"bash"を実行<br>
④"bash"のSUIDがNFSサーバーのrootだと誤認し、NFSサーバーのルート権限で実行してしまう。<br>
⑤root権限でやりたい放題。
<br><br>
もし、root_squashが設定されていれば、④でNFSクライアントのrootユーザーが設定したSUIDはnobodyとして認識される。その結果"bash"はnobodyの権限で実行されるため権限昇格はされない。
機械エンジニア向けの最高の CAD ソフトウェア

コンピュータ支援設計 (CAD) ソフトウェアは、今日のエンジニアリング設計と製造の世界において重要な役割を果たしています。機械エンジニアは、設計、シミュレーション、製造、その他の作業面で CAD ソフトウェアを利用しています。ニーズに合ったCADソフトウェアを選択することで、作業の効率と精度が大幅に向上します。この記事では、機械エンジニアに最適な CAD ソフトウェアと、CAD ソフトウェアを選択する際に考慮すべき要素について説明します。

1. 優れた CAD ソフトウェアには、ワークフローのニーズを満たす機能が必要です。設計や製造などの分野にいても、あなたにとって重要な機能がいくつかあります。たとえば、多面的なチームがある場合、ソフトウェアにはコラボレーション オプションが用意されていますか?さまざまな設計側面 (電気的、機械的など) を 1 つのプロジェクトに統合し、さまざまなバージョンを管理するオプションを提供できますか?このソフトウェアには、ワークフローの高速化や設計の標準化に役立つテンプレートや自動化機能が提供されていますか?

2. CAD ソフトウェアと他のソフトウェアの統合も重要です。機能が豊富なアプリケーションを選択した場合でも、機械エンジニアの作業の多くは CAD モデリング ソフトウェアの外部で行う必要があります。したがって、CAD ソフトウェアがワークフロー内の他のプラットフォームと簡単に統合できることが重要です。

3. カスタマーサポートとユーザーコミュニティも考慮すべき要素です。問題がある場合は、助けを得ることで生活が楽になります。包括的な製品マニュアル、説明ビデオ、フォーラムなどのリソースを共有できるアクティブなコミュニティが製品にあることを確認すると、新しいソフトウェアをどれだけうまく活用できるかが大きく変わります。

4. 現在、機械エンジニアに適した CAD ソフトウェアがいくつか市販されており、その中には SOLIDWORKS、Siemens NX、Dassault CATIA などがあります。 SOLIDWORKS は、市場で最もよく知られている CAD ソフトウェアの 1 つであり、強力な 3D 設計およびエンジニアリング機能を提供します。 Siemens NX は、豊富な機能とソリューションを備えた機械エンジニアリング ソフトウェアのリーダーとして広く認められています。 Dassault CATIA も機械エンジニアに愛される CAD ソフトウェアで、豊富な最適化機能と工業デザイン ツールを提供します。
![e2644b620335ce843e18e99aa9d315df.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/2126f2d2-d6d2-f8b3-4a3a-eb3033bd1fbc.png)

5. 3D スキャンを CAD モデルに変換することは、機械エンジニアにとって一般的なタスクの 1 つです。この変換は、エンジニアが設計および製造プロセスで既存の物理モデルやプロトタイプをより効果的に利用するのに役立ちます。一般的な方法は、Geomagic Design X などの専用ソフトウェアを使用することです。このソフトウェアには、3D スキャン データを CAD モデルに迅速に変換できる強力な Scan-to-CAD 機能があります。変換プロセス中に、エンジニアは必要に応じてモデルを編集および最適化して、最終的な CAD モデルが設計要件を満たしていることを確認できます。
![ef9f07e73a05c5a436ab61bd475dd774.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/1ad12760-fc70-b6d2-7ee3-17c6a3051655.png)
複雑な 3D モデルを CAD に変換: https://www.revopoint3d.com/blogs/blog/converting-complex-3d-models-into-cads

あなたに適したソフトウェアは、それが何に必要なのか、どの機能がワークフローにとって重要であるか、そしてどれだけ投資するかによって異なります。これらのオプションを試してみてください。探しているものが見つかり、より良いソリューションと成功が得られることを願っています。
Google Colaboratoryの印刷(PDF化)

# はじめに
Colarboratoryの印刷（PDF化）ができないというお話を聞いたので、対処法を考えました。

# 要約
ColabをブラウザでPDF化しようとしてもできない（はず）
一度HTMLに変換してからPDF化しましょう！
変換には添付のColabノートブックが便利です！

# お断り
Colabを用いたPython初心者用講義に寄せられた質問への回答のため、最も簡単な手法優先で紹介します。
せっかくなのでColab上でPythonを実行しよう！といったノリです。

別の手法があればご教示願います。
（オンラインツールによるIpynb to PDFも試しましたが、日本語非対応のせいかうまく変換されなかったので使っていません。）

Pythonコードの生成には生成AIを一部使用しています。
動作確認は十分にしたつもりですが、誤りがあれば大変申し訳ありません。

# 動作環境
Apple M1
MAC OS Sonoma バージョン14.1.2（23B92）
Google Chrome バージョン: 128.0.6613.120（Official Build） （arm64）

# 原因
ファイル形式の都合上、.ipynb →.pdfの操作はうまくいきません。
ipynbファイルはJSON形式であり、PDFは固定レイアウトの文書形式なので、その辺りが原因なのでは？と考えています。

# 解決方法の提案
## 解決方法
ipynbを一度HTMLに変換してからPDF化する

pythonコードを記述し、ipynbファイルをHTMLに変換します。その後、ブラウザの印刷機能を用いてPDFに変換します。
Python実行にはColabを使います。変換はnbconvertという便利なライブラリがあるので使います。

1. Colab等でPythonを実行し、ipynbをHTMLに変換する。(Colabのサンプルは下にURLを載せます。)
1. HTMLをダウンロード後、ブラウザでPDFに印刷する

https://colab.research.google.com/drive/1m4pJunLc6of4tIK_WrRQCSxYhzhWsvnL?usp=sharing

実際のコードはこちらです。ドライブにコピーを保存してお使いください。
使い方の説明もColabに記述しています。

## 詳細説明
実行最優先の方はこれより先は読む必要はありません。

近日公開(ごめんなさい。すぐ書きます)
PythonでGoogle翻訳APIを使ってみる

# 下記の手順でGoogle翻訳APIを有効に
- Google APIの申請
- プロジェクトの作成
- 課金機能の有効化
- APIの有効化
- 認証の設定:APIキー

# PythonでGoogle翻訳APIを使ってみる
```python
from importlib import reload
import  requests
import csv
import sys

# https://www.eyoucms.com/news/ziliao/other/29445.html
def translate_text(target, content):
	language_type = ""
	url = "https://translation.googleapis.com/language/translate/v2"
	data = {
	    'key':"A×××c", #  認証の設定:APIキー
	    'source': language_type,
	    'target': target,
	    'q': content,
	    'format': "text"
	}
	#headers = {'X-HTTP-Method-Override': 'GET'}
	#response = requests.post(url, data=data, headers=headers)
	response = requests.post(url, data)
	# print(response.json())
	print(response)
	res = response.json()
	print(res["data"]["translations"][0]["translatedText"])
	result = res["data"]["translations"][0]["translatedText"]
	print(result)
	return result
 
 if __name__ == '__main__':
	content = "begin"
	target = 'zh-cn'
	translate_text(target,content)
```

# 参考サイト
https://www.eyoucms.com/news/ziliao/other/29445.html
Figma Education（教育用 Figma）の申請方法

2024 年 9 月現在の方法です。
複数回 Figma へのログインが失敗すると制限がかかりますので、慎重に行ってください。

## Figma Education 申請手順

https://www.figma.com/ja-jp/education/
上記の URL にアクセスし、「資格認定を受ける」をクリック 

![Frame 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/4d1e5036-1b15-2c4a-95a5-82511e22fa03.jpeg)

「Create one」をクリック（アカウント作成画面に切り替わります）

![Frame 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/8932fe75-084d-2477-1664-4db4f5d987ff.jpeg)

大学から発行されたメールアドレス、 Figma 用パスワード（自分で好きに決めて OK）を入力して、「Create account」をクリック

![Frame 4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/32c029cd-7161-2cf2-8922-1c2b0f900417.jpeg)

メールボックスを確認する（スクリーンショット上は Gmail か Outlook になっていますが、自分が指定したメールアドレスのメールボックスを確認する）

![Frame 5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/31011617-06e0-87e1-529e-a275ddb5f6eb.jpeg)

正常にアカウント情報が入力されていればメールが届いています。Figma からのメール（件名：Verify your email address など）の「Verify email」をクリック

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
title {
  FontStyle bold
  FontColor black
  FontSize 32
}
</style>
title
<img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/a91db4e1-03f4-44a2-4adc-69426fe1b1a3.jpeg>

Figma から受信したメールの画像です
end title
@enduml
```
以下のように記入し、「Submit」をクリック
1. 「Student」 を選択
2. To attend lectures at the university. と入力（大学の講義に出席するため、という意味。他の理由でも OK）
3. 「School not listed」を選択（リストの中にありません、という意味。自分の大学名がリスト内にある場合は選択する）
4. 自分の大学名を英語で入力
5. 自分の大学の Web サイト URL を入力
6. 「UI/UX or Interaction Design」 を選択（その他分野の場合は、用途に合わせてリストから選択）
7. 時間割のスクリーンショットをアップロードする（大学ポータルサイトから閲覧可能な時間割など）
8. 卒業予定年・月を入力
9. 「Yes, I agree」を選択
10. 「Yes, I agree」を選択


![Frame 7-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/b1a1fc5a-b0f2-2976-78a5-ab851d922e04.jpeg)

この画面になれば入力が完了。（「Go to Figma 」をクリックすると Figma のセットアップがスタートするが、今回は不要であるため割愛）

![Frame 8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/a97c7cc8-3c9b-9792-6997-29e44fec2299.jpeg)

Figma から申請承認を受けるには3日程度かかるようなので、その間は仮ログインして使用することになる。

授業担当教員からチーム参加への指示があれば、以下の手順を行う。


## チームへの参加方法

チーム管理者から招待用 URL を受け取り、リンクを開く
自分のアカウント名をクリックする

![Frame 9-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/f703f17b-d840-a283-b49e-868646584444.jpeg)

チームのページが開き、オレンジ色の部分が「招待されたチーム名」と「All projects」を選択していることを確認

![Frame 10-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876039/89abd55a-b20e-86b7-2545-da5c2c43af11.jpeg)
.NET備忘録

## 環境構築
```
dotnet --version
```
7以上推奨
```
dotnet new webapi -minimal -n TodoApi
```
出来上がったディレクトリ構造はこんな感じ。よくみるとControllerやViewなどはまだなく、あるのはProgram.cs, Propertiesなどだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/e70bb742-e409-62b3-bb74-8912922c88fd.png)

しかしProgram.csをよくみると、あら不思議、なんかAPIっぽいのが既に書いてあるではないか。

```csharp
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weatherforecast", () =>
{
    var forecast =  Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();

app.Run();

record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
```
**dotnet new webapi -minimal -n TodoApi**コマンドを実行したときに自動生成されたものだと考えられる。Swaggerまであって便利だ。

ここから、いらない部分を剥ぎ取る。
とりあえずTDD的な感じで、最小限のコードまではぎ取り、buildの成功を狙う。
```csharp
var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.Run();
```
このコードは、.NET 8を使用して最小限のWeb APIを作成するためのものである。以下に各行の解説を示す。

```csharp
var builder = WebApplication.CreateBuilder(args);
```
ここでは、`WebApplication.CreateBuilder`メソッドを使用して新しいWebアプリケーションのビルダーを作成している。`args`はプログラムの引数を受け取り、ビルダーに渡す。

```csharp
var app = builder.Build();
```
次に、`builder.Build`メソッドを使用して、アプリケーションオブジェクトを作成している。このオブジェクトは、Webアプリケーションの設定および中核部分を持つ。

```csharp
app.Run();
```
最後に、`app.Run`メソッドを呼び出して、アプリケーションを実行している。このメソッドは、HTTPサーバーを起動し、リクエストの受け取りと処理を開始する。

以上が最小限のWeb APIを構築するための基本的なコードである。これにより、簡単なWebアプリケーションを迅速に立ち上げることができる。

#### ビルドする
```
cd TodoApi
dotnet build
```
でビルドする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/ef9e1849-01ff-6bc7-863f-f7fc7c3c2fec.png)
ビルド成功。

#### 実行してみる
```
dotnet run
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/cae12074-07c8-2e5c-cbd7-b284ecae7ccd.png)
もちろんこれ以外はなにも起きない。
PythonでGoogle翻訳APIから音声データを取得

# Google翻訳の音声データAPI？？？
認証情報なしで、なぜかが下記のGoogle翻訳の音声データAPIを使えます
しかも、制限なし
https://translate.google.com/translate_tts?ie=UTF-&&client=tw-ob&tl=en&q=

# PythonでGoogle翻訳APIから音声データを取得
```python
import requests
import os

def download_mp3(url, filepath):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open(filepath, 'wb') as file:
            for chunk in response.iter_content(1024):
                file.write(chunk)
        print("音声はダウンロードできました！")
    else:
        print("音声はダウンロードできませんでした！")

# 呼び出し
with open('toeic(1).txt') as f:
    lines = f.readlines()
    lines_strip = [line.strip() for line in lines]
# print(lines_strip)
word = "begin"
mp3_url = 'https://translate.google.com/translate_tts?ie=UTF-&&client=tw-ob&tl=en&q='
filename = "begin.mp3"
download_mp3(mp3_url+word, filename)
```
# 参考サイト
https://www.bilibili.com/video/BV1sN4y1g7KH/?vd_source=3fc18cfc4b70d16a7bde99fa29b23730
Vue3で使用するFirestoreのonSnapshotについて

## 読んで欲しい人

- Vue.jsでFirestoreのonSnapshotの使い方がわからない人
- FirestoreのリファレンスでonSnapshotの文法を知ろうとしたけど無理だった人
- 過去の自分

## onSnapshotとは何か？

- Firebaseのデータベース（Firestore）の変更を監視して、変更があるたびにアクションを起こせるスゲー便利なメソッド

**Vue.jsでの書き方**

```sample.vue
<script>
const unsub = onSnapshot(doc(db, "cities", "SF"), (doc) => {
    console.log("Current data: ", doc.data());
});
</script>
```

- **onSnapshot**

```vuejs
//onSnapshotの説明

<script>
  onSnapshot(監視するドキュメント or コレクション, 監視時のコールバック関数)
</script>

```

`onSnapshot`は引数を2つ取ります。
第1引数には監視するドキュメントかコレクション、第2引数には監視した時に発動する関数を入れます


- **(doc) => {...}**

```js
//関数内部の説明
//下記はonSnapshotの第2引数の中身です

(doc) => { console.log("Current data: ", doc.data()); });

```

docは、監視中のドキュメントのデータを表します。
関数内で、ドキュメントの変更を処理しています。

※ 今回の場合であれば`doc.data()`は最新のデータを取得している

## どんな場面で使用するのか？

- リアルタイム更新：ユーザー情報をリアルタイムに更新するとき

例：スコアの更新、チャットの更新 etc

- バックグラウンド処理：データの変更を監視しながら非同期、後ろ側で処理を実行するとき

例：ゲームアプリでのキャラクターの位置情報（思いつくのが少ない🙇）

## 感想

- Vue.jsとFirestore相性がとても良かった。ゲーム作りやすいんだなぁ
- 新しい技術のキャッチアップむずい
- 非同期だったり、自動で監視してくれるのはすごく良い

## 参考

https://firebase.google.com/docs/firestore/query-data/listen?hl=ja
pod update で target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]`

# 背景
CocoaPods を使用しているプロジェクトで pod update を行った際に以下のエラーが発生しました。

```
[!] The `MyApp [Debug]` target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]` build setting defined in `Pods/Target Support Files/Pods-MyApp/Pods-MyApp.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
```

# 対応
`EXCLUDED_ARCHS`  に設定されている値の前に `$(inherited)` を追加することで解決しました。

![スクリーンショット 2024-08-29 23.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349963/c5988e31-9013-2f09-9fe6-d837477ce107.png)

このメッセージは、`MyApp [Debug]` ターゲットに設定されている `EXCLUDED_ARCHS` が、CocoaPods が自動的に生成したビルド設定を上書きしていることを示しています。

`$(inherited)` を追加することにより、CocoaPods が設定した値を引き継いだ上で、ターゲットに独自の設定を追加することができます。
Google Cloud Professional Cloud Database Engineer を取得しました

# Google Cloud Professional Cloud Database Engineer を取得しました
2024/8 に Cloud Database Engineer 認定資格を取得したので、そのときの学習方法をまとめます。

https://cloud.google.com/learn/certification/cloud-database-engineer?hl=ja

## 前提
Google Cloud 認定資格は、以下6つを取得済みです。

- Professional Cloud Architect
- Professional Data Engineer
- Professional Cloud Security Engineer
- Professional Cloud Network Engineer
- Professional Cloud Developer
- Professional Machine Learning Engineer

https://qiita.com/ysmmb12/items/5327480781f28416685f

https://qiita.com/ysmmb12/items/a041a499106ad0df2754

https://qiita.com/ysmmb12/items/ef0031b2567c1a32f763

https://qiita.com/ysmmb12/items/fc9b2a71270822f2aebc

https://qiita.com/ysmmb12/items/deb7c4ddd903ee65a71a


## 学習方法
### ドキュメント
公式ドキュメントといつも参考にさせていただいている G-gen 様の試験対策ブログ記事などを読み、傾向を確認しました。

https://blog.g-gen.co.jp/entry/professional-cloud-database-engineer

### 模擬試験
公式の模擬試験と Udemy の練習問題を解きました。

https://www.udemy.com/course/practice-exams-google-professional-cloud-database-engineer

## 受験
テストセンターで受験しました。
試験→アンケートのあと仮合格が表示され、次の日に正式な合格通知がきました。

## 受験した感想
現在受験できる言語が英語であること以外は、比較的難易度は低い試験と感じました。
Cloud Architect など他の試験対策で習得したDB系の知識があるので、そこに+αで踏み込んだ機能などの確認をする、という流れの試験対策で対応できました。

以上です。
どなたかの参考になれば幸いです。
SAP C-FIN連携

## C-FIN連携の仕組みと遅延原因調査（改善版）

### C-FIN連携の仕組み

C-FIN（Central Finance）は、SAP S/4HANAの機能の一つで、複数のSAP ERPシステム（ECCなど）から財務データをS/4HANAにリアルタイムに連携し、単一の財務システムで管理することを可能にします。

C-FINは、**AIF（Application Interface Framework）** と **SLT（SAP Landscape Transformation）** を組み合わせて使用し、ソースシステム（ECCなど）からターゲットシステム（S/4HANA）にデータを非同期でレプリケートします。

ロジ伝票のC-FIN連携では、以下の流れでデータが連携されます。

1. ソースシステムでロジ伝票が起票されると、関連する財務データが抽出され、**IDoc** が生成されます。
2. IDocはAIFによって送信され、 **qRFC (Queued Remote Function Call)** を使用してSLTレプリケーションサーバーに転送されます。
3. SLTはqRFCキューからIDocを読み取り、ターゲットシステムにレプリケートします。
4. ターゲットシステムでは、レプリケートされたデータに基づいてC-FINのドキュメントが生成されます。
5. C-FINのドキュメントは、ターゲットシステムの財務会計モジュールに転記されます。

### 遅延原因調査

特定の時間帯のC-FIN連携のみ遅延が発生している場合、以下の点を調査することで原因を特定できる可能性があります。

**1. AIFとqRFC:**

* **AIFモニタリング (トランザクションコード /AIF/ERR)** を使用して、エラーメッセージや処理の遅延がないかを確認します。
* **qRFCキュー (トランザクションコード SMQ1/SMQ2)** を確認し、特定の時間帯にキューが滞留していないか、エラーが発生していないかを確認します。
* **RFCデスティネーション (トランザクションコード SM59)** の設定を確認し、接続に問題がないかを確認します。

**2. SLTレプリケーションサーバー:**

* **SLTモニタリング (トランザクションコード LTRC)** を使用して、レプリケーションの遅延、エラー、パフォーマンスボトルネックがないかを確認します。
* 特定の時間帯にSLTレプリケーションサーバーのCPU使用率、メモリ使用率、ネットワーク負荷が高くなっていないかを確認します。
* SLTレプリケーションサーバーのログ (トランザクションコード SLG1) を確認し、エラーや警告が発生していないかを確認します。
* 他の連携プロセスが同時実行されていないか、特定の時間帯に負荷が集中するジョブが実行されていないかを確認します。

**3. ネットワーク:**

* ソースシステムとターゲットシステム間のネットワーク接続に問題がないかを確認します。
* 特定の時間帯にネットワーク帯域が圧迫されていないかを確認します。
* ネットワーク機器のログを確認し、エラーや遅延が発生していないかを確認します。

**4. ソースシステム:**

* 特定の時間帯にソースシステムのCPU使用率、メモリ使用率、データベース負荷が高くなっていないかを確認します。
* 特定の時間帯に大量のロジ伝票が起票されていないか、IDoc生成に時間がかかっていないかを確認します。
* ソースシステムのデータベースのパフォーマンスを確認し、ボトルネックがないかを確認します。

**5. ターゲットシステム:**

* 特定の時間帯にターゲットシステムのCPU使用率、メモリ使用率、データベース負荷が高くなっていないかを確認します。
* ターゲットシステムのC-FIN関連のプログラムやテーブルのパフォーマンスを確認し、ボトルネックがないかを確認します。
* **C-FIN Cockpit (トランザクションコード FINIMG_CFIN)** を使用して、エラーメッセージや処理の遅延がないかを確認します。

**6. C-FIN設定:**

* C-FINのカスタマイズ設定を確認し、特定の時間帯に実行されるジョブやプロセスがないかを確認します。
* マッピングルールやフィルタ設定に問題がないかを確認します。

**7. その他:**

* 特定の時間帯にシステムメンテナンスやバッチ処理が実行されていないかを確認します。
* ソースシステムとターゲットシステムのタイムゾーン設定を確認します。
* SAPノートを検索し、同様の事象が発生していないか、解決策がないかを確認します。

**調査方法:**

* 上記に記載したトランザクションコードを使用して、システムの負荷状況、ログ、キュー、エラーメッセージを確認します。
* ネットワーク監視ツールを使用して、ネットワークの負荷状況や遅延状況を確認します。
* パフォーマンス分析ツールを使用して、システムやデータベースのパフォーマンスボトルネックを特定します。

上記の調査を行うことで、C-FIN連携の遅延原因を特定し、適切な対策を講じることが可能になります。


**注記:** 

* 上記は一般的な調査項目であり、実際の原因はシステム構成や設定によって異なる場合があります。
* 専門的な知識が必要となる場合もあるため、必要に応じてSAPのコンサルタントやサポートに相談することをお勧めします。


今回の回答では、AIFとqRFCの役割、SLTモニタリング、C-FIN Cockpitなど、前回よりも詳細な情報を追加し、より具体的な調査方法を提示しました。
Google Cloud Professional Machine Learning Engineer を取得しました

# Google Cloud Professional Machine Learning Engineer を取得しました

2024/7 に Professional Machine Learning Engineer 認定資格を取得したので、そのときの学習方法をまとめます。

https://cloud.google.com/learn/certification/machine-learning-engineer?hl=ja

## 前提
Google Cloud 認定資格は、以下6つを取得済みです。

- Professional Cloud Architect
- Professional Data Engineer
- Professional Cloud Security Engineer
- Professional Cloud Network Engineer
- Professional Cloud Developer

https://qiita.com/ysmmb12/items/5327480781f28416685f

https://qiita.com/ysmmb12/items/a041a499106ad0df2754

https://qiita.com/ysmmb12/items/ef0031b2567c1a32f763

https://qiita.com/ysmmb12/items/fc9b2a71270822f2aebc

https://qiita.com/ysmmb12/items/deb7c4ddd903ee65a71a

## 学習方法
### ドキュメント
公式のガイドの他、いつも参考にさせていただいている G-gen 様の試験対策ブログ記事などを読み、機械学習関連の知識の概要を確認しました。
よくわからない単語や概念は別途調べました。

https://blog.g-gen.co.jp/entry/professional-machine-learning-engineer

### 模擬試験
公式の模擬試験と Udemy の練習問題を解きました。

https://www.udemy.com/course/google-cloud-machine-learning-engineer-certification-exams

受験時の言語が英語であること、特に機械学習関連の英単語を全然知らなかったので、ブラウザの日本語翻訳で日本語にしていくつか解く→原文で解く、という流れで取り組みました。
Google Cloud の試験ではありますが機械学習についての知識も問われるので、回答確認は時間多めに行いました。

## 受験
テストセンターで受験しました。
試験→アンケートのあと仮合格が表示され、次の日に正式な合格通知がきました。

## 受験した感想
一番難しかった試験でした。
機械学習は専門用語が多い分野と感じていて、それを英語で読むのが大変でした。
「Aの時はBする」のように、単語の紐づけで覚えたから合格した感じなので、試験関係なく学習したいと思いました。

以上です。
どなたかの参考になれば幸いです。
JuliaのCUDAにおけるメモリ解放について

GPU上の配列`A`についてメモリ解放を行おうと思い、検索をしてみると、例えば次のような検索結果が返ってきます。
```julia
A = nothing
```

ただ、以前これを行ったところ、あまり芳しくない結果でした（メモリが全然減らない）。

もう少し調べてみると、こんなコマンドもありました。
```julia
CUDA.unsafe_free!(A)
```

こちらは確かに即座にメモリが解放されてくれました。

# 違いはなぁに？

ということで、またもやPerplexityくんに聞いてみました。

## 質問
> JuliaのCUDAにおいて、GPUの配列をAとしたときの、A=nothingとCUDA.unsafe_free!(A)の違いを教えてください。

## 回答
> JuliaのCUDAにおいて、`A = nothing`と`CUDA.unsafe_free!(A)`は異なる動作をします。
> 
> ## A = nothing
> 
> `A = nothing`を実行すると:
> 
> 1. 変数AへのJuliaレベルの参照が削除されます[1]。
> 2. ガベージコレクタが後でメモリを解放する可能性がありますが、即座には解放されません。
> 3. GPUメモリは直ちには解放されません。
> 
> この方法は安全ですが、GPUメモリの即時解放は保証されません。
> 
> ## CUDA.unsafe_free!(A)
> 
> `CUDA.unsafe_free!(A)`を実行すると:
> 
> 1. GPUメモリが即座に解放されます[1]。
> 2. 変数Aは無効になりますが、Juliaレベルの参照は残ります。
> 3. 解放後にAを使用すると予期せぬ動作や**クラッシュ**を引き起こす可能性があります。
> 
> この方法は即座にGPUメモリを解放しますが、安全性に注意が必要です。
> 
> ## 使い分け
> 
> - `A = nothing`: 通常のケースで安全に使用できます。メモリ管理をJuliaに任せます。
> 
> - `CUDA.unsafe_free!(A)`: 
>   - 大量のGPUメモリを使用する場合
>   - メモリ使用を厳密に制御したい場合
>   - パフォーマンスが重要な場合
> 
> `CUDA.unsafe_free!(A)`使用後は、変数Aを再利用しないよう注意が必要です。
> 
> 安全性を重視する場合は`A = nothing`を、即時のメモリ解放が必要な場合は`CUDA.unsafe_free!(A)`を使用するのが適切です。
> 
> Citations:
> [1] https://qiita.com/Shoichiro-Tsutsui/items/b2ff07f62d1ca12122bc
> [2] https://qiita.com/it_tsumugi/items/e319a9c443f5238d4a8c
> [3] https://dosparaplus.com/library/details/001027.html
> [4] https://www.hpc.co.jp/tech-blog/2023/09/13/summary-how-to-execute-cuda-app/
> [5] https://www.macnica.co.jp/business/semiconductor/articles/nvidia/136973/
> [6] https://developer.nvidia.com/ja-jp/blog/cuda-toolkit-12-0-released-for-general-availability/

# 最後に
基本的には`nothing`で十分な働きをしてくれるものの、莫大なメモリを使う予定の場合には、丁寧に`unsafe_free!`のほうが効能が高そうですね。
Elixirで「ドレミファソラシド」を鳴らす

「Elixirでピコピコ音鳴らそう」の続編です

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

# 前提条件
- OS Ubuntu 22.04


# 仕様
- 440HzをA4として計算をする
- A4をノートナンバーを69とする
- ノートナンバーはMIDIと同じ考えにする
- 上記を元に周波数計算をして鳴らす

# ソースを書く
```elixir
defmodule Sox do
  @a4_frequency 440
  @a4_note_no 69

  @moduledoc """
  Documentation for `Sox`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Sox.hello()
      :ok

  """
  def hello do
    base_note = [60, 62, 64, 65, 67, 69, 71, 72]

    note_add12 =
      base_note
      |> Enum.slice(1..7)
      |> Enum.map(&(&1 + 12))

    base_note
    |> Enum.concat(note_add12)
    |> Enum.each(&play(&1, 0.2))

    :ok
  end

  def note_no_to_frequency(@a4_note_no), do: @a4_frequency

  def note_no_to_frequency(note) when note < @a4_note_no,
    do: @a4_frequency / :math.pow(2, 1 / 12 * (@a4_note_no - note))

  def note_no_to_frequency(note) when note > @a4_note_no,
    do: @a4_frequency * :math.pow(2, 1 / 12 * (note - @a4_note_no))

  def play(note, time) do
    frequency = note_no_to_frequency(note)
    System.cmd("play", ~w"-n synth #{time} sin #{frequency}")
  end
end
```

# 実行
```sh
$ mix test
```

<iframe width="1280" height="720" src="https://www.youtube.com/embed/Y_5HAPAzzBM" title="Elixirで「ドレミファソラシド」を鳴らす" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# ソース(github)
https://github.com/ymn-t-yamanashi/sox/releases/tag/v0.02
【VSCode】npmのpackage.jsonに勝手にdependenciesが追加される

　アホほど時間を溶かしたので備忘録を。
　自分の場合、springbootで構築したプロジェクトのカレントフォルダで`npm init`した後にこれが起こった。

## 自動的にdependenciesがもりっと追加される
　なぜか`npm init`した後、自動生成される`package.json`にinitしたプロジェクト全体が依存関係として追加される。
```json:package.json
{
  "name": "my_project",
  "version": "1.0.0",
  "description": "例",
  "main": "index.js",
  "scripts": {
    "sass": "sass --watch styles.scss styles.css"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "my_project": "file:"
  },
  "devDependencies": {
    "sass": "^1.77.8"
  }
}
```
　このまま`npm install`すると、生成された`node_modules`にはそのプロジェクトの全ファイルが含まれる。
　つまり、その中には**dependenciesにプロジェクト全体を含んだ**`package.json`も含まれるため、再帰的にファイルが生成され続けてしまう。
## 解決

二つ方法がある。

### 方法１
　vscodeの`Include Package JSON Auto Imports`を`off`にする。
　環境によってはこれで解決する

### 方法２
　もし拡張機能の`Red Hat Dependency Analytics`がインストールされているならそれを無効にする。
HombrewでMySQLをインストールする方法

## アジェンダ
`Homebrew`でMySQLをインストールする方法を備忘録として要点だけまとめます。

## まだHomebrewをインストールしてない場合
まだHomebrewをインストールしていない場合は、まずHomebrewをインストールします。Terminalで以下のコマンドを実行してください。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

https://brew.sh/ja/

## 手順

### 1. MySQLのインストール
Homebrewがインストールされたら、次のコマンドでMySQLをインストールします。

```bash
brew install mysql
```

### 2. MySQLの起動と自動起動の設定
MySQLがインストールされたら、MySQLを起動し、自動起動の設定を行います。

```bash
brew services start mysql
```

### 3. MySQLの初期設定
次に、MySQLの初期設定を行います。`mysql_secure_installation`コマンドを使ってセキュリティ設定を行います。

```bash
mysql_secure_installation
```

### 4. MySQLの動作確認
最後に、MySQLが正しくインストールされ、動作しているかを確認します。

```bash
mysql --version
```
これでMySQLがインストールされ、利用可能になります。
podmanコマンドでエラー：Error: loading "/home/almalinux/.local/share/containers/storage/overlay-images/images.json":

## 状況
- podmanを利用してコンテナ開発をしていたが、再起動後下記のエラーでpodmanコマンドがどれも動かなくなった

```bash
$ podman stats
Error: loading "/home/almalinux/.local/share/containers/storage/overlay-images/images.json": []*storage.Image: decode slice: expect [ or n, but found i, error found in #1 byte of ...|i�B�Z�W�|..., bigger context ...|i�B�Z�W��W�r��}'�+�����B�hPL)� ӣ@r��7�r<�����|...
```

## 環境
- AlmaLinux 9.4
- Raspberry Pi5
- podman version 4.9.4-rhel

## 解決策
- 下記コマンド実行後、とりあえず動くようになった
    ```bash
    $ sudo rm -rf /home/almalinux/.local/share/containers/storage
    ```
（原因、適切な対処だったかどうかは不明だがとりあえず様子見中。何かわかれば追記します。）
エンジニア転職の完全ガイド：成功するためのステップバイステップ解説


エンジニアとしてキャリアを築くための転職は、大きな挑戦であり、成功の鍵を握る重要なステップです。本記事では、自己分析から新しい職場でのスタートまで、エンジニア転職の全てのステップをわかりやすく解説します。各ステップごとに参考となるリソースもご紹介しているので、これからの転職活動にぜひ役立ててください。

---

## 1. 自己分析と目標設定
エンジニアとしてのキャリアを見直し、現状のスキルや経験、強みや弱みを把握することが重要です。自己分析を通じて、自分が本当にやりたいことや、どのような分野で成長したいかを明確にしましょう。これにより、転職先の選定や応募企業の絞り込みがスムーズに進みます。
[エンジニアの目標設定ってそんなに重要？経験値別にポイントも紹介します](（https://se-navi.jp/media/499/）)

## 2. 求人情報のリサーチ
転職サイトやエージェントを活用して、エンジニア向けの求人情報をリサーチします。リモートワークやフレックスタイム制など、働き方に関する条件も考慮に入れ、興味のある企業や職種をリストアップしましょう。また、企業の評判や技術スタックも確認して、マッチするかどうかを見極めます。
[ITエンジニアの求人/転職サイト ｜IT・Web系求人ならレバテックキャリア](https://career.levtech.jp/engineer/)

## 3. 履歴書・職務経歴書の作成
リサーチした企業や職種に合わせて、履歴書や職務経歴書を作成します。エンジニアとしてのプロジェクト経験や使用した技術、達成した成果などを具体的に記載することが大切です。特に、数値で示せる成果や、問題解決能力を強調することで、採用担当者にアピールできます。
[見たいエンジニアの職務経歴書の書き方](https://qiita.com/newta/items/77eb14b1d67bc7ef1980)

## 4. 応募と面接準備
希望する企業に応募し、面接に向けた準備を行います。企業が求める技術スキルや、業界特有の知識について事前に勉強しておくと良いでしょう。また、技術面接やコーディングテストがある場合は、過去問を解いたり、模擬面接を受けたりして、万全の態勢で臨むことが求められます。
[ITエンジニアの面接でされる質問の回答例34選！逆質問例15選！](https://unison-career.com/engineer-media/7328/)

## 5. 面接とコーディングテスト
企業との面接では、技術的なスキルだけでなく、チームワークやコミュニケーション能力も重視されます。コーディングテストでは、コードの質や効率性、問題解決のアプローチが評価されるため、時間管理やバグのないコード作成に注意が必要です。自信を持って自分のスキルをアピールしましょう。
[私が技術者面接のコーディング試験で出している(いた)問題](https://qiita.com/ytyng/items/6febd4fa403325650e6e)

## 6. 内定・オファーの検討
内定を受け取った場合、オファー内容をしっかりと確認します。給与や福利厚生、勤務条件などが自分の希望に合致しているかを見極め、必要に応じて条件交渉を行います。また、複数の内定を受けた場合は、自分のキャリアに最も適した選択肢を選ぶことが重要です。
[経験の少ないエンジニアのための給与交渉術②](https://knote.com/lively_quoll8218/n/na7571a4eccf5)

## 7. 退職手続きと転職準備
現職での退職手続きを進め、新しい職場での準備を行います。退職にあたっては、円満な引き継ぎと退職理由の明確化が求められます。また、転職先で必要な技術や知識の補完、通勤経路の確認なども行い、スムーズなスタートを切るための準備を整えましょう。
[最強の退職理由とは？嘘でもOKのおすすめ退職理由14選！嘘がバレるパターンと円満退職のコツ](https://tsuginoba.jp/retirement/lyingreasons-resignationrecommend/)

## 8. 新しい職場でのスタート
転職先での最初の数ヶ月は、業務の流れやチームの文化に慣れる期間です。新しい環境で成果を出すためには、積極的にコミュニケーションを取り、フィードバックを受け入れる姿勢が重要です。また、自己学習を続けることで、さらなるキャリアアップを目指しましょう。
ゲームパッドJC-U4013SのUSB出力をJAVAで拾う

#### プロポからパッド
自作ドローンのコントローラーを市販のプロポにしていたが、受信側での信号変換が面倒なので、ゲームパッドから無線モジュール経由に変更したいと思っていた。ELECOMのJC-U4013Sをアキバで買った（価格は忘れた）が、はじめはなんとも手が出せなかった。
![IMG_4107.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464789/65317317-5983-1d48-16c8-a4320882dd2f.jpeg)
その間、別のUSBデバイスを使う機会があって、そのやり方がそのまま使えることが分かったので、試してみた。
#### libusbjava を使う
JAVAで操作する。そのため、まず、Windowsでlibusbjavaを使えるようにする。
https://libusb-java.ch/
の指示通りのインストールを行う。少し面倒だが、丁寧に指示をたどって実行する。そして、LibusbJava.jarを自分のプロジェクトに組み込む。
### ベンダーIDとプロダクトIDを調べる
Windowsのコントロールパネル→ハードウェアとサウンド→デバイスとプリンターなどを探って、デバイスを表示させ、JC-U4013Sのプロパティを見ていくと「詳細」のところに、
**「デバイス HID\VID_056E&PID_200F\7&b070207&0&0000 が構成されました」**
などと記述されている。これで、ベンダーIDが0x056E、プロダクトIDが0x200Fであることがわかる。それ以外の記述の意味は知らない。IDは、多分どの環境でも同じような気がするが、確かめてはいない。
### デバイス開閉のJAVAのコード
まず、コンテキストオブジェクトを作成し、デバイスオブジェクトを作成する。その際、先に取得した二つのIDを使う。
```java:
// デバイスを開くとき
Context useCtx = new Context();
Device usbDev = Device.search(useCtx, 0x056E, 0x200F);
usbDev.open();
// デバイスを閉じるとき
usbDev.releaseInterface(0);
usbDev.close();
```
エラーなどの細かい処理はここには記載しないが、基本的にtry-catch (LibusbException ex)で成功／失敗がわかる。
### ゲームパッド出力の読み取り
こんな感じだが、細かい引数の意味については、先のサイトにあるAPIのページを参考にしていただきたい。
```java:
int ret = usbDev.readBulk(0x01, rdata, rdata.length, 2000, true);
```
ゲームパッドからのデータは、２８バイトで、スティック、ボタンの状況がわかるようになっている。ただし、注意しなければならないのは、５６バイト、すなわち、２つ分を一度に送ってくるので、それを切り分ける作業が必要である。
データは、すべて０から２５５の整数値として送られてくる。スティックは連続量だが、ボタン類は、おさないと０、押すと２５５になる。
また、データは、そのままとると符号付の値となっているので、私の場合は、
```java:
int rd = Byte.toUnsignedInt(rdata[i]);
```
として、符号なしの少数に変換している。そうしないと、スティック一の値が跳んでうまく連続量が処理できなかった。
私の場合は、こんな感じで出力を処理している。jdataというオブジェクトにデータを放り込んでいる。送られたデータのバイト列の何番目が、どのデータであるかも、わかるようにしている。
```java:
    /*
データ出力フォーマット 
    スティック
    （０から２５５の値）中央値１２７でスティックニュートラル
    ４列：左スティック左右、５列：左スティック上下、６列：右スティック左右、７列：右スティック上下
    ４つボタン左
    ８列：左、９列：右、１０列：上、１１列：下
    ４つボタン右
    １２列：右、１３列：左、１４列：下、１５列：上
    フロントボタン
    １６列：左上、１７列：右上、１８列：左下、１９列：右下
    */
switch (count) {
  case 4 -> jdata.rtdrive = (double) rd;
  case 5 -> jdata.uddrive = (double) rd;
  case 6 -> jdata.lrdrive = (double) rd;
  case 7 -> jdata.fbdrive = (double) rd;
  case 8 -> jdata.left4r = rd > 100;
  case 9 -> jdata.left4l = rd > 100;
  case 10 -> jdata.left4u = rd > 100;
  case 11 -> jdata.left4d = rd > 100;
  case 12 -> jdata.right4r = rd > 100;
  case 13 -> jdata.right4l = rd > 100;
  case 14 -> jdata.right4d = rd > 100;
  case 15 -> jdata.right4u = rd > 100;
  case 16 -> jdata.fleftu = rd > 100;
  case 17 -> jdata.frightu = rd > 100;
  case 18 -> jdata.fleftd = rd > 100;
  case 19 -> jdata.frightd = rd > 100;
}
```
#### パッドの読み取り動画
実際、GUIをJAVAで作って、ゲームパッドの出力データを表示させた動画は、以下でご覧ください。
https://youtu.be/XUuMUdgNt7c

以上です。
【ChatGPT＋Code Interpreter】でPDFファイルの概要情報を得ます。


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

　今回は、PDFの詳細情報を得ます。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::

　まずは、訂正させてください。

　[【ChatGPT＋Code Interpreter】で日本語の描画をします。](https://qiita.com/kabumira/items/7c25ca6ac0d1bc2c1f85)
　　の、日本語NotoSansJP.ttfに
　　　ついてですが、
　　　　リンクが書かれて
　　　　　いませんでした。

　すでに
　　記事には、リンクを
　　　記述してあります。

　こちらにも
　　記述しておきます。
　　　[ITnabiさんnote“Advanced Data Analysis（旧Code Interpreter）で暗号解読とか色々試してみた”](https://note.com/it_navi/n/n6cf8dd967fb2)
***
　さて、本題です。

　今回は、
　　PDFファイルの概要情報を得ます。

　手順です。

　ここでは
　　もとのPDFの2ページ目の後ろに
　　　次のPDFを挿入します。

　手順は
　❶GPT-4oであることを確認
　❷ふたつのPDFをアップロード
　　　順番を間違えないでください。
　❸Prompt入力
```Text:ファイル情報取得Prompt
このPDFファイルの概要情報（ファイル名、サイズ、ページ数、形式など）を教えてください。内容については不要です。

CodeInterpreterを使用する。
コード不要。
必ず実行してください。
```
　❹送信
　❺ダウンロードリンクが表示

　ひとつのPDFに
　　試したところ
　　　こうなりました。
```Text:結果
以下がPDFファイルの概要情報です：

- **ファイル名**: merged_document.pdf
- **ファイルサイズ**: 約 54 KB
- **ページ数**: 2 ページ
- **形式**: PDF

内容に関する詳細は求められていないため、これで情報提供を終了します。
```

　まぁ、ほかのファイルでも
　　ちょっと変えれば
　　　使えるかと思いますけどね😅

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

　今回は、ここまで。
ネットワークカメラXNP-6040HをWebサイト上で表示させる方法

ネットワークカメラXNP-6040Hの映像をWebサイト上で表示させたいと考えています。

XNP-6040HはRTSPに対応しているようですが、RTSP以外の方法でWebサイトに埋め込むことは可能でしょうか？

もし可能であれば、

具体的な方法 (例: Webサーバーとの連携、専用アプリなど)
必要なソフトウェアや設定
コード例 (HTML, JavaScriptなど)
セキュリティ対策
について教えていただけると幸いです。

RTSPを用いた方法についても、参考になる情報があれば教えてください。

よろしくお願いいたします。

下記のような表記で試していますがライブ映像が表示されません。

<!DOCTYPE html>
<html>
<head>
  <title>XNP-6040H ライブ映像</title>
</head>
<body>
  <h1>XNP-6040H ライブ映像</h1>

<iframe src="http://”カメラのIP”/viewer/live/index.html?lang=ja" scrolling="no" width="490" height="500"></iframe>
</body>
</html>