OmniAICreator/Qiita-1.07M huggingface dataset:
Azure仮想マシンから外部に通信するときのグローバルIPアドレスを固定したい

# 概要
Azureのルーティングを設定して、外部への通信をAzureFW経由にしていたのだが、これをすると外部通信の際の接続元グローバルIPアドレスがAzureFWに紐づけたグローバルIPアドレスからランダムに選出され、固定ができないという問題に直面したので解決メモ。

外部に接続する際、グローバルIPアドレスを固定できないと、外部サービス連携時のIPアドレス制限ができない（設定が大変）なこともあり、これを固定したかったお話。

### 前提
- 仮想ネットワークのルーティングでデフォルトルートをAzureFWに向けている

### やりたいこと
- Azure仮想マシンが外部に接続する際のグローバルIPアドレスを固定したい
- でも外部から仮想マシンへの接続にはAzureFWを噛ませたい

# 方法

以下の2点を設定すればOK

- AzureネットワークのデフォルトルートをInternetに向ける
    - 独自にルーティング設定をしていなければ、基本的にはこの設定になってます。
- 仮想マシンのNICにパブリックIPアドレスを紐づける

ざっと調べてみた感じ、Azure仮想マシンの送信元グローバルIPアドレスの選出は以下のようになっている模様。

|仮想マシンへのPIP付与|デフォルトルート|送信元PIP|
|-|-|-|
|なし|Internet|ランダムで決定(再起動するまでは固定)|
|あり|Internet|仮想マシンのPIPで固定|
|なし|AzureFW|AzureF/WのPIPからランダム決定|
|あり|AzureFW|AzureF/WのPIPからランダム決定|

※ PIP -> パブリックIPアドレス

#### 固定したい場合はデフォルトルート->Internet + 仮想マシンへのPIP付与
<font color=blue>デフォルトルートがインターネットを向いていれば、仮想マシンにPIPを付与することで、外部に接続する際のグローバルIPアドレスもそれに固定が可能。</font>
ただし、この場合は外部への通信フィルタリングがNSG依存になるため、正しくNSGを設定しましょう。**<font color=red>初期設定では仮想マシン->Internetへの接続は全OPENになっています。</font>**

必要な通信のみをOPENにしたい場合、既定ルールのAllowInternetOutBondを別のルールで上書きして拒否するように設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420694/1fdc1fbd-7db9-42eb-8829-9659dc7b5c63.png)

#### AzureFW経由にすると現実的に固定できない
デフォルトルートをAzureFWに向けている場合、仮想マシンに付与されたPIPは無視され、AzureFWでSNAT変換が行われる。その際に選出されるグローバルIPアドレスは、AzureFWに紐づけられたPIPからランダムで選出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420694/e26756d3-7da4-07bc-af51-b36c8458a2d3.png)

<font color=red>AzureFWに紐づけられたPIPが1つの場合は疑似的に固定できるが、外部からのDNAT設定のため複数紐づけが必要な場合が多いため、そうなるとランダム選出になってしまう。また、ランダムになってしまうことで、どの仮想マシンからの通信か？が判別できなくなってしまいます。</font>

:::note warn
逆に言えば、Azureネットワークから出る通信も含めてすべてAzureF/Wで管理したい、ということになると送信元グローバルIPアドレスの固定や、特定ができなくなってしまいます。
:::

# 終わり
わかってしまえば簡単な話ですが、できればAzureF/Wを経由する状態でも特定のIPアドレスでSNATできるようにしてほしい･･･ MSさんなんとかなりませんかね！
【Unity】QuizUからみるUI Toolkitの設計【UI Toolkit】

# 自己紹介
どうも、自分の中でゲームクライアントエンジニアからゲームクリエイターに転職した大学生です。
自分の好きなものを作るぞ！！という感じです。

https://x.com/KaidoAtsuya

# 経緯
といっても、技術開拓が好きな俺氏新作ゲーム制作にRuntime UI Toolkitを使いたいと思ったので、今回は公式サンプルのUI Toolkitの設計を読み解く記事です。
uGUIと比較しつつコードリーディングの手助けを出来ればと思います。

## 注意
あくまで、個人的な意見も含まれています。

# １．MVPのPresenterはPureなC#
uGUIではPresenterはMonoBehaiourを継承することが一般的でした。
一方で、UI ToolkitではPureなC#を使うようです。

## 理由の考察
理由としては、Presenterに対応する~~UI DocumentコンポーネントからQueryしたUIを渡す~~Viewクラス（QuizUではScreen）を渡す必要があります。
uGUIではGameObjectとしてUIが存在したので、そこにアタッチする形でスクリプトとUIを紐づけることが出来ましたが
、それが難しいということですね。

加えて、PureなC#にすることでコンストラクタを利用でき、初期化漏れを回避することができます。

## （追記）Viewについて
以下の２で説明するScreenというものがViewの役割をしているようでした。
そのため、理由の考察部分は間違えていましたね。

ViewにVisual Elementを渡し、そのViewをPresenterに渡す形が正解のようです。
その初期化のためにUIManagerクラスが使われているようでした。
（UIManagerクラスはCanvasGroupの役割を担っており、全体のオンオフも行えるようになっています。）

# ２．基底クラスの製作
uGUIでも、以下のような基底クラスを使うことはよくありました。

```csharp:UIManagerBase.cs
using UnityEngine;

[RequireComponent(typeof(CanvasGroup))]
public class UIManagerBase : MonoBehaviour
{
    [SerializeField] private CanvasGroup _canvasGroup;
    
    public bool IsActiveSelf { get; private set; }

    public void SetViewActive(bool isActive)
    {
        _canvasGroup.alpha = isActive ? 1 : 0;
        _canvasGroup.blocksRaycasts = isActive;

        IsActiveSelf = isActive;
    }
    
    #if UNITY_EDITOR

    private void Reset()
    {
        _canvasGroup = GetComponent<CanvasGroup>();
    }

    #endif
}
```
そして、UI Toolkitでも同様の基底クラスを制作すると便利のようです。
「QuizU」ではUIScreenとして定義されています。

# ３．イベントの管理方法
『QuizU』では静的なクラスのActionに登録して、それを`EventRegistry`クラスのインスタンス化して登録するという手法を使っていました。
ほかのライブラリの話になりますが、やっていることは`MessagePipe`と近い形です（どこで渡されているか分かりにくい）

ただ、EventRegistryクラスはイベントを一気に解除することができとても良い方法だと思いました。

# まとめ
事実ベースで短めにまとめました。
基本的にPureな環境でUIを表示・非表示することができて、Pure C#過激派からするととても嬉しいかもしれませんね。
『QuizU』凄く良かったので、まだまだコードリーディングしたいと思います！
ChromeOS FlexのLinux環境でSVGエディターWEBアプリケーションのセットアップとビルド

:::note warn
この記事は初心者向けです
エンジニア向けの記事ではありませんのでご注意ください
:::

## 0.はじめに

私は、非エンジニアで初心者です。

ChromeOS Flexで以下のSVGエディターWEBアプリケーションを試そうとして手間取ったので備忘録を残します。

https://github.com/SVG-Edit/svgedit

こんな感じの画面のSVGエディターです。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/ee3aa982-6b4a-8316-f5dd-21001f190ada.png)

以下コマンドが並ぶだけです

## 1.セットアップとビルド手順

### 1-1.ChromeOS FlexのLinux環境（Debian11）を最新にする

Debian11ベースですがLXCコンテナ環境なので、素のDebian11とは異なるらしいです。

    sudo apt update
    sudo apt upgrade -y

### 1-2.node.jsとnpmインストール

node.jsは、元々はインストールされてませんでした。

    sudo apt install nodejs
    node -v
    sudo apt install npm
    npm -v

### 1-3.node.jsとnpmを最新安定版バージョンにする

aptでインストールされるnode.jsはかなりバージョンが低いので最新安定板にバージョンアップします。

    curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
    sudo apt-get install -y nodejs
    node -v
    sudo npm install -g npm@latest
    npm -v

### 1-4.SVG-editのインストール先のフォルダを作って移動

フォルダーは、事前にChromeOS標準のファイルアプリで作りました

    cd svged

### 1-5.SVG-editのリポジトリクローン
    
    git clone https://github.com/SVG-Edit/svgedit.git

### 1-6.svged配下のSVG-editのクローンしたディレクトリに移動

    cd svgedit

### 1-7.SVG-editのインストール

    npm install

### 1-8.SVG-editの説明にある通りのコマンドを実行

    npm run build --workspace @svgedit/svgcanvas
    npm run start

### 1-9."localhost:8000/src/editor/index.html"にてブラウザーで動作確認

### 1-10.ロリポで動かすためにビルド

ロリポップのレンタル共有サーバーでは、node.jsが動かないので事前にローカルでビルドが必要です。

    npm run build

### 1-11.svgedit 配下にdistフォルダーができるのでその中身をロリポへアップロード

FTPソフトが必要です。（LinuxならFileZillaなど）
 
## 2.終わりに

書いてみると簡単だけど、悩んだので一応書きました。

以　上
【@/】Viteの`path.alias`を使っている環境でVSCodeの参照コマンド(F12)を機能させる

## 問題
`@/`パスエイリアスでviteのインポートを制御する場合は多いと思う。

ただ一つ問題があり、VSCode上で参照【F12】コマンドが使えなくなってしまう。
なんでや！

## 解決
しかし、調べてみるとさすがVSCodeというべきか、対策が用意されていた。
https://code.visualstudio.com/docs/languages/jsconfig

ネット上はWebpackを使用する場合の例が多いが、viteでもしっかりと利用できた。

```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es2017",
    "allowSyntheticDefaultImports": false,
    "baseUrl": "./",
    "paths": {
      "@/*": [
        "src/*"
      ]
    }
  },
  "exclude": [
    "node_modules",
  ]
}
```

>jsconfig.jsonはJavascriptルートに配置する

Vite環境の場合はだいたいプロジェクトルートに配置すれば良さそう。
wndows10 の静的IPアドレス設定周りについてのUIメモ

![PLACEHOLDER_cd74dd7d79ebcb7_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632930/92345b0b-52b8-e772-8e3c-8843b40b6ced.png)
![PLACEHOLDER_cd74dd7d79ebcb7_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632930/4662540d-c3d5-c004-90bf-6c4d5f177371.png)
![PLACEHOLDER_cd74dd7d79ebcb7_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632930/5effce90-38ee-2548-e9d0-c8c39a400906.png)
![PLACEHOLDER_cd74dd7d79ebcb7_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632930/7a745d27-9e07-a7a3-c04d-08ded301fc46.png)
![1ZgYsKZ6WqZzdj2ckKhR7DWUbyY5TXjLCPm9HLkHEmw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632930/460b32f4-b65f-229b-e947-2616dada446c.png)
【JavaScript】catchブロックでのエラータイプの検証

特定のエラータイプの時のみ処理したい場合。

```js
try {
    // ...
} catch (err) {
    if (err instanceof ErrorType) {
      err.errorType = 'ErrorType'
    }

    next(err);
  }
```

---
検索キーワード
エラータイプが一致するか エラータイプ 検証 条件文 条件 if catchブロック
MMdetectionのRTMdetで学習（カスタムデータ）

### 環境
・Windows11
・RTX 3060Ti
・CUDA11.8
・Python3.8

・環境構築はこちら
https://qiita.com/kappanda/items/46e94507f5a01abf3b14

・MMdetectionでRTMdetのモデル使用

### データセット
・カスタムデータセット（1クラス）
・データ形式はcoco
・フォルダ構造
　　├─coco
　　│  ├─annotations
　　│  │  ├─instances_train2017.json
　　│  │  └─instances_val2017.json
　　│  ├─train2017(train用画像のフォルダ)
　　│  └─val2017（valid用画像のフォルダ）


### 事前学習済みモデルの取得
mmdetection/pretrained_weightsフォルダを作成し、
そこにRTMDet-sのmodelをダウンロード
https://github.com/open-mmlab/mmdetection/tree/main/configs/rtmdet

### mmdetectionのコードを一部変更してカスタムCOCOデータに対応させる
こちらを参照

https://qiita.com/takekappa/items/37b616ec3e92f7697b8c



### Config作成
mmdetection\configs\rtmdet\rtmdet_s_8xb32-300e_coco.pyを開いて
一番下に以下を追記
```rtmdet_s_8xb32-300e_coco.py
load_from = "./pretrained_weights/rtmdet_s_8xb32-300e_coco_20220905_161602-387a891e.pth"
```
あとはbatchsizeとかnum_classesをいじりたいがrtmdet_s_8xb32-300e_coco.pyには記載するところなし
```rtmdet_s_8xb32-300e_coco.py
_base_ = './rtmdet_l_8xb32-300e_coco.py'
```
rtmdet_l_8xb32-300e_coco.pyのファイルがベースになっているようなのでそちらを開いて
32行目　num_classes=1に変更
```rtmdet_l_8xb32-300e_coco.py
    bbox_head=dict(
        type='RTMDetSepBNHead',
        num_classes=1,
        in_channels=256,
        stacked_convs=2,
        feat_channels=256,
```
113行目　batch_size=4
114行目　num_workers=4
119行目　batch_size=4, num_workers=4
に変更（8GB GPUではデフォルト値だとout of memoryのため）
```rtmdet_l_8xb32-300e_coco.py
train_dataloader = dict(
    batch_size=4,
    num_workers=4,
    batch_sampler=None,
    pin_memory=True,
    dataset=dict(pipeline=train_pipeline))
val_dataloader = dict(
    batch_size=4, num_workers=4, dataset=dict(pipeline=test_pipeline))
test_dataloader = val_dataloader
```

### いざ学習！
```
python tools/train.py configs/rtmdet/rtmdet_s_8xb32-300e_coco.py
```

するとエラーが出現
```RuntimeError: nms_impl: implementation for device cuda:0 not found.```

~~miniconda3/envs/openmmlab/Lib/site-packages/mmcv/ops/nms.pyの27行目でトラブっている模様
```nms.py
inds = ext_module.nms(
    bboxes, scores, iou_threshold=float(iou_threshold), offset=offset)
```

ですのでGithubを参考に（https://github.com/open-mmlab/mmdetection/issues/11437）
一部変更
```nms.py
# inds = ext_module.nms(
#     bboxes, scores, iou_threshold=float(iou_threshold), offset=offset)

inds = ext_module.nms(
    bboxes.to('cpu'), scores.to('cpu'), iou_threshold=float(iou_threshold), offset=offset)
```

### 再度学習！

動いた！
```
05/20 14:56:37 - mmengine - INFO - Epoch(train)   [1][8/8]  base_lr: 2.8068e-05 lr: 2.8068e-05  eta: 0:30:42  time: 0.7703  data_time: 0.3194  memory: 2035  loss: 2.3908  loss_cls: 1.4148  loss_bbox: 0.9759
05/20 14:56:39 - mmengine - INFO - Exp name: rtmdet_s_8xb32-300e_coco_20240520_145622
05/20 14:56:39 - mmengine - INFO - Epoch(train)   [2][8/8]  base_lr: 6.0099e-05 lr: 6.0099e-05  eta: 0:20:06  time: 0.5061  data_time: 0.1816  memory: 2035  loss: 2.3865  loss_cls: 1.4282  loss_bbox: 0.9583
```
シェル（bash）で０埋めする方法

# 環境
+ OS : CentOS Linux release 8.5.2111
+ bash : GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)

```console:実行結果
[root@centos85 work]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 work]# bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@centos85 work]#
```

# 1. printfを使って0埋め

### 1.1. 「512」の数字に対して、前ゼロ埋めして10桁で表示する場合
`printf "%010d" 512`

```console:実行結果
[root@centos85 work]# printf "%010d" 512
0000000512[root@centos85 work]#
```
### 1.2. 「512」の数字に対して、前ゼロ埋めして10桁で表示する場合（改行が欲しい場合）

`printf "%010d\n" 512`

```console:実行結果
[root@centos85 work]# printf "%010d\n" 512
0000000512
[root@centos85 work]#
```

### 1.3. 「512」の数字に対して、前ゼロ埋めして10桁を変数に代入
```console
IN_NUM=512
OUT_NUM=`printf "%010d" "${IN_NUM}"`
echo ${OUT_NUM}
```

```console:実行結果
[root@centos85 work]# IN_NUM=512
[root@centos85 work]# OUT_NUM=`printf "%010d" "${IN_NUM}"`
[root@centos85 work]# echo ${OUT_NUM}
0000000512
[root@centos85 work]#
```

# 2. Bashの変数参照機能を使う
### 2.1. 「512」の数字に対して、前ゼロ埋めして10桁で表示する場合
```console
IN_NUM=512
TMP_NUM="0000000000${IN_NUM}"
echo "${TMP_NUM: -10}"
```

```console:実行結果
[root@centos85 work]# IN_NUM=512
[root@centos85 work]# TMP_NUM="0000000000${IN_NUM}"
[root@centos85 work]# echo "${TMP_NUM: -10}"
0000000512
[root@centos85 work]#
```

### 2.2. 「512」の数字に対して、前ゼロ埋めして10桁を変数に代入

```console
IN_NUM=512
TMP_NUM="0000000000${IN_NUM}"
OUT_NUM="${TMP_NUM: -10}"
echo ${OUT_NUM}
```

```console:実行結果
[root@centos85 work]# IN_NUM=512
[root@centos85 work]# TMP_NUM="0000000000${IN_NUM}"
[root@centos85 work]# OUT_NUM="${TMP_NUM: -10}"
[root@centos85 work]# echo ${OUT_NUM}
0000000512
[root@centos85 work]#
```

# 3. その他

### 3.1. for文で1から10を2桁（出力される数値の最大桁数）で表示
`for i in $(seq -w 1 10);do echo ${i};done`

```console:実行結果
[root@centos85 work]# for i in $(seq -w 1 10);do echo ${i};done
01
02
03
04
05
06
07
08
09
10
[root@centos85 work]#
```

### 3.2. seqコマンドで1から10を0埋め10桁で表示
`seq -f '%010g' 1 10`

```console:実行結果
[root@centos85 work]# seq -f '%010g' 1 10
0000000001
0000000002
0000000003
0000000004
0000000005
0000000006
0000000007
0000000008
0000000009
0000000010
[root@centos85 work]#
```

### 3.2. seqコマンドで「512」を0埋め10桁で表示
`seq -f '%010g' 512 512`

```console:実行結果
[root@centos85 work]# seq -f '%010g' 512 512
0000000512
[root@centos85 work]#
```

---

以上
GPT_4oとpythonを活用した路線展開図の高速作図法

https://trianglelist.home.blog/2024/05/20/%e8%a1%a8%e8%a8%88%e7%ae%97%e3%82%bd%e3%83%95%e3%83%88%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%81%8b%e3%82%89dxf%e5%b1%95%e9%96%8b%e5%9b%b3%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b/
Cypher基礎

# Cypherについて
Cypherは、Neo4jのようなグラフ型データベースにおけるクエリ言語である。基礎文法を書いていく。

## ノードの作成
ノードはグラフの基本単位である。ノードを作成するには"CREATE"を使用する。以下は、"Person"というラベルをもったノードを作成する例。

```
CREATE (p: Person {name: "Alice", age:30})
```
- pはノードの変数名
- Personはノードのラベル
- {name: "Alice", age:30}はプロパティ

### 変数名とラベルの違い
- ラベル (Label): ノードのカテゴリやタイプを示すためのもの。ノードをグループ化し、効率的な検索や操作を可能にする。
- 変数名 (Variable): クエリ内でノードや関係を参照するための一時的な名前。クエリ内の特定の要素を識別し、操作するために使用。

## 関係の作成
ノード間の関係はグラフの重要な要素である。（エッジともいう）関係を作成するには、"CREATE"を使用する。以下は、"Alice"と"Bob"という二つのノード間に、"KNOWS"という関係を作成する例である。
```
CREATE (p1: Person {name: "Alice"})
CREATE (p2: Person {name: "Bob"})
CREATE (p1)-[:KNOWS]->(p2)
```
ここでは、"ノード(p1)とノード（p2）の間に[:KNOWS]という関係を持っている"ということを示している。

## ノードの検索
ノードを検索するには、"MATCH"を使用する。以下は、"Person"ラベルを持つ、"Alice" という名前を持つノードを検索する例。
```
MATCH (p:Person {name: "Alice"})
RETURN p
```

## 関係の検索
関係を検索するには"MATCH"を使用する。以下は、"Alice"が知っている人を検索する例。
```
MATCH (p1: Person {name: "Alice"})-[:KNOWS]->(p2)
RETURN p2
```
このクエリは、"Alice"が"KNOWS"という関係を持つすべてのノードを検索し、それらのノードを返している。
-  注意： ```MATCH (p1)-[:KNOWS]->(p2)``` でも動作するが、このクエリは、ラベルを指定せずに、任意のノードp1がKNOWS関係を持つノードp2を返すp1ノードのプロパティに名前Aliceが含まれていることを前提としているが、ラベルに依存しないため、他のラベル（例えば、Person以外のラベル）を持つノードも検索対象になる。

## ノードと関係の更新
既存のノードや関係を更新するには、"SET"を使用する。以下は、"Alice"の年齢を更新する例。
```
MATCH (p:Person { name: "Alice" })
SET p.age = 31
```

## ノードと関係の削除
ノードや関係を削除するには、DELETE文を使用する。以下は、"Alice"のノードとそれに関連するすべての関係を削除する例。
```
MATCH (p:Person { name: "Alice" })
DETACH DELETE p
```
- DETACH DELETEはCypherクエリ言語で使用されるキーワードで、ノードを削除する際にそのノードに関連するすべてのリレーションシップも同時に削除するために使われる。これにより、ノードを削除する前に手動でリレーションシップを削除する必要がなくなる。
- DELETEのみでノードを削除した場合、例えばノードp1を消した時、p1に関係を持つノードがあった場合、エラーが発生する。p1を削除した場合、p1に関係をもつ関係をまるごと消すために、DETACHを用いる。

## その他の基本操作
### プロパティの追加
```
MATCH (p: Person {name: "Alice"})
SET p.city = "San Francisco"
```
### プロパティの削除
```
MATCH (p: Person {name: "Alice"})
REMOVE p.city
```
Windows11 での scoop 導入エラー

Windows11 上に scoop で環境を作ろうと思って、いきなりつまずいた。
~~~
scoop install git
~~~
で、次のようなエラーが出てしまう。
~~~
ERROR Exit code was 1622!
~~~
検索したが、エラー自体は Windows 側で出しているようだった。
なかなか解決策が見つからなかった（のでココに書いているが）、
最終的に次のおまじないで解決
~~~
scoop config MSIEXTRACT_USE_LESSMSI true
~~~
本当はこれも古いらしく deprecated というメッセージは出たが、このおまじないをしたあとは順調に進んだ。
【TouchDesigner】タイムコードの受け取り備忘録

# 概要
オーディオインターフェースを介して、別会社の機材から送信されているタイムコードをTouchDesignerで受け取るときにうまくいかなかったのでメモしておきます。
タイムコードに関しては、同期させるために使う！くらいの知識しかありませんでした。

# 詳細
TouchDesignerにはタイムコードを簡単に処理できる便利な`LTC In CHOP`というものがあり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/1342f188-bc52-65d6-d04b-716116d863f0.png)

こんな感じで繋いだのですが、数字の更新がカクついたり止まったり挙動が非常に怪しくてどうしたもんかと調べたところ、
サンプリングレートとフレームレートの設定が大事そうなことを知り、

https://qiita.com/sunfish-shogi/items/4dc020954d46f0e998a6

`Audio Device In CHOP`の`Rate`を`48000`（単位は`Hz`）に、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/acaa8636-054c-52f8-454d-9945fd103c8b.png)

`LTC In CHOP`の`Input Frame Rate`を`29.97`（単位は`fps`）に、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/c136b6e7-57b4-800b-9775-903406a5ec7c.png)

すると滑らかに読み込めました。

`44100Hz`とか`59.94fps`とか、その時々で最適な数字は違うと思うので仕様を聞いておくと良いと思います。


# 終わりに
タイムコードを扱う人に幸あれ。
WiresharkでHTTPS通信を復号

(はてなブログから移行しました)

## 記事の内容
HTTPS通信の様子をWiresharkで見ると、パケットは暗号化されており、ApplicationDataとなっているだけでその中身を見る事ができません。
そこで、Wiresharkで復号された通信のパケットキャプチャができるようにします。

ここではcurlを使ってhttps通信をしている様子を見る方法を紹介しています。

## 環境

MacOS Monterey
Wireshark v3.6.5

## 処理内容

### 概要
HTTPS通信をする際に使う鍵情報がpre-master-secretというもので、このファイルをWiresharkと共有しておくことで復号した通信が表示されます。

### 流れ
①Wiresharkにpre-master-secretのパスを設定します。

Wiresharkを開いて、上部メニューバーの`Wireshark`->`Preferences`->`Protocol`->`TLS`を選択します。

`(Pre)-Master-Secret log filename`内に、ログのファイルを入力します。

(例)`/tmp/pre-master-secret.log`

②環境変数`SSLKEYLOGFILE`に`pre-master-secret`のパスを指定した状態で、curl通信を行います。

`$ SSLKEYLOGFILE=/tmp/pre-master-secret.log curl https://example.com/`

## 最後に
この設定を行うことで、Wiresharkを見てみると復号された通信を確認できます。

ちなみに、この通信内容をファイルに保存しても、復号された通信が保存されるわけではなく、暗号化されたものが保存されます。
エラー対処: CentOS6インストール後にネットワークに繋がらない

## エラーの流れ
VirtualBoxにCentOS6をインストールした後、

最初は問題なくネットワークにつながっていたのだが、yumなどを色々といじったからかネットワークがつながらなくなったので、そのエラー対処の流れをまとめた
<br>

## エラー対処の流れ
/etc/resolv.confを開く

`$ sudo`

`# vi /etc/resolv.conf`

その中には

`# No nameservers found; try putting DNS servers into your`

の文があった

ということで、DNSサーバの構築を行う

`# yum -y install bind bind-utils`
<br>
これにより問題を解決する事ができた
SPSS Modelerの式ビルダーでClem関数や列を探す

SPSS Modelerの式ビルダーで先頭文字からClem関数や列を探すことができます。多くの関数や変数の中から先頭の文字を知っていれば比較的簡単に簡単にジャンプできます。


# 
関数をアルファベット順に並べて、先頭セルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/955e8bb7-2b90-e4c0-6659-4cee2b9f0e85.png)


「subst」と入力してみます。
「subst」から始まる関数が選択されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0fb8ba33-9132-552f-ae33-0f8ca72462de.png)

# 列検索
フィールドをアルファベット順に並べて、先頭セルをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dcd58658-e6b7-7ff4-d224-262c8edd14fa.png)

「j」と入力してみます。
「j」から始まるフィールドが選択されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/317098ab-62b9-fd08-51cb-bf372afcbddc.png)
CloudPractitioner に合格するためにやったこと

CloudPractitionerに合格しました。
やったことを備忘録として残しておきます。

受けた時の私のレベル感としては、実務経験は2年、基本情報取得済み、クラウド知識は0という感じです。
スコアは790で、合格までにかかった時間は20～30時間くらいだと思います。

## やったこと
1. [クラウド入門ウェビナー](https://resources.awscloud.com/cloud-practitioner-essentials-on-demand-training)を見る（倍速で90分くらい）
1.   [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403)を三周読みました。（15時間くらい）
合格するためだけなら一周やってすぐ問題に入ったほうが良いと思います。

1.[Udemy](https://www.udemy.com/share/101SaA3@rFuvj5hVQ3zn6ZtDP0pp0T8A9XN90vp5ui76KwoGzzS6x4L0L-kEN1eWxvEcoN-UVA==/)の問題を解きました。（8時間くらい）
試験前日の夜から解き始めて、正答率が6割くらいしかありませんでしたが間に合いました。
試験で頻出の問われ方があるので、そこを抑えれば受かる感じがします。
合格を第一目標にするなら問題を解く時間を多めにとったほうがよいと思います。

## 反省点
### 試験のリスケ
仕事が忙しく、想定していた勉強時間が取れなかったので、日程調整するべきでした。
試験24時間前なら日程調整できる。

### 手を動かして勉強するべき
今後AWSを触っていく機会があるので、実務にも活きるように手を動かして知識を習得したかったが、時間が足りず、テスト合格のためだけの勉強になってしまった。
試験が終わって余裕ができたので少し触ってみたい。
電話線無しでFAXを送る

# 現在トラブル発生中のため本記事の内容は参考になりません。解消でき次第修正予定です。

# 経緯
2024年5月20日
会社で某Faxサーバーメーカー製のFaxサーバーソフトウェアとメーカ推奨モデムを使っている。
このモデムはUSB接続で1台に4Chという代物で、16ポートのルーターより若干大きいくらいで大きいがモデムを４つ並べるよりはコンパクトというもの。サーバーソフトの保守切れと同時になぜかモデムとソフトセットでの更新（モデムは全く同じ物を高い価格で買いなおすという殿様商売っぷり）を勧められあまりの金額にびっくりしてそのまま使い続けていた。今回ようやくモデムを更新できてついでに無線化できたのでそれについて記そうと思う。もしかしたら、同じ会社のモデムで苦労している人がいたら参考になるかもしれない。
追記：まだ設定直後のため長期安定性、050番号からの発信に変わることの影響は未確認

# 対象
古いFaxサーバーをしつこく使っている人
送信先によって送信失敗が多くて困っている人

## 結論
結論から言うと、ＩＰ電話サービスを申し込んでソフトモデムをインストールしてＦＡＸを送るようにした。ということになる。
送信失敗が減るというのは自社内でのアナログ線区間が無くなるため音質が向上するためと思う。自社環境ではこれまでのモデムより10％から20％くらい送信時間が短縮されている感じである。（まあ3分いくらの課金なので通信料金の節約はあまりないが）

## 方法
ひと昔前はいろいろなＩＰ電話サービスがあったようだが、現状日本で信用できそうなサービスはほぼ楽天コミュニケーションズのサービスのみだと思う。楽天コミュニケーションズさんのＩＰ電話サービスはいろいろあるが、Ｂ２ＢＵＡ　ＯｐｅｎＧａｔｅサービスというのがそれである。どうやら、電話の主装置を通して楽天の回線で接続する場合と通常のインターネット回線から接続する場合でサービスが異なるらしく、自社では通常のインターネット回線を通してＩＰ電話を使いたい（というかそれしか選択肢がなかった）ので上記のサービス選定となった。
このサービスは一度使用を開始した後はチャンネル数の増減をWebでの申請で行えるところがよい。一つ不満があるとしたら、
通話時間の上限設定とか国外通話禁止などができないところ。万が一パスワードが漏れたりしたときにどんな請求になるか不安である。

これとソフトモデムとして
```https://www.t38faxvoip.com/```
が販売しているFaxVoipT38Modemを購入した。
（追記：このソフトは売り切りライセンスではあるのだが、ライセンスがPCに対しての発行となるため故障などでPCを変更するとライセンスを買いなおす必要（購入から1年以内なら再発行ができるらしいが）があるので注意。）
Linuxだとフリーのモデムソフトがあるのだが、今回は某FaxサーバーがWindowsServerで動作しており当面クライアントをそのまま使いたいため購入した。2週間の試用版で動作確認してからの購入である。
（ちなみにWindowsServerだと複数個のソフトモデムを同時に使用できるが通常のWinsowsPCだと1チャンネルのみしか使用できないらしい）
設定上ポイントがあるとしたらソフトモデムの設定画面で通信速度を4800にすること。そうしないと失敗が多くなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751683/b5065440-cb25-5173-0cce-1a326398ae0d.png)
ＩＰ電話でＦａｘを送っていた人は良く知っていると思うがもともとＩＰ電話はＦａｘ信号を送ることを考えて作られていないのでボーレートは最初から落としておかないと失敗が増える。
購入したソフトは仮想ＣＯＭポートとなるため某ＦａｘサーバーでＣＯＭ番号を登録すれば問題なくＦＡＸが送信される。

## 
実は最初は某Ｆａｘサーバーを使用継続せずWindosServerが持つＦａｘサーバー機能に入れ替える予定で某Ｆａｘサーバーの異文書送信機能と同じ処理をするタスクバープログラムは作成済なのだが、一気にいろいろやると大変なので１ステップいれている。某Ｆａｘサーバーを完全に置換できたときにはまた記事としてアップしようと思う。

# 注意
今回紹介したサービス、ソフトは自分で使ってみたというだけで、品質、セキュリティを保証するものではありません。もし同様のことをされる場合はご自分で確認してから御導入ください。
SPSS CADSのジョブでデータがない場合のグラフ出力を失敗にしない

# CADSのジョブでデータがない場合のグラフ出力は失敗になる。
SPSS Modelerではデータがない場合にグラフを作成するとエラーになります。

例えば以下のような「1=0」のような条件抽出はレコード件数が0になるため、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0e3d087c-4739-21aa-f0de-1c43fbfff700.png)

次のようなエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3e7239ae-ec25-ae58-ef1a-400e366282d5.png)

これをCADSのジョブとして実行してもやはり「失敗」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/78d78ca9-abaf-2ea3-f31f-a5e0c3502938.png)

しかし、CADSジョブが失敗すると通知しているような場合、レコードがないだけなら失敗とはみなしたくない場合も通知が届いてしまいます。

# データがない場合もグラフ出力を失敗にしない
このような場合、modelerスクリプトでグラフを実行してTry CatchをすることでModelerのエラーを無効にしてしまうことができます。「このスクリプトを実行」にチェックを付けておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a87c20ff-5302-42e0-3dd6-e3ac90ef155f.png)


「Try」ブロックで「run」を実行して、「except modeler.api.ModelerException」でキャッチする。
メッセージが「受け取ったレコードはありません。」であれば、エラーを無視する。
```python
import modeler.api
try:
    #print 1/0
    diagram = modeler.script.diagram()
    diagram.findByID("id66TXP66R24G").run(None)	# "X v. Y":plot
except modeler.api.ModelerException, e:
    print "An error occurred:", e.getMessage()
    if e.getMessage()==u'受け取ったレコードはありません。':
        print u"エラーを無視"
    else:
        print u"無視できないエラー"
        raise(e)
```

実行するとグラフ出力のアイコンは赤くなりますが、「デバッグ」をみると、意図通りExceptionをキャッチできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/870d0cba-555a-7318-d3c2-3c6a5a6256f9.png)

これをCADSのジョブとして実行すると「受け取ったレコードはありません。」はジョブステップのログに記録されますが、ステータスは「成功」になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/81bc12ef-c9e5-62e5-8483-de13e8a5d141.png)

# サンプル
#### ストリーム

https://github.com/hkwd/spssmodelerscript/raw/master/240520tryException/%E3%82%B0%E3%83%A9%E3%83%95%E8%A1%A8%E7%A4%BA.str

* テスト環境
    * SPSS Modeler 18.4
    * SPSS CADS 8.4
    * Windows Server 2019

# 参考
#### エラーの処理 - IBM Documentation 

https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=api-handling-errors


#### Pythonの例外処理（try, except, else, finally） | note.nkmk.me 

https://note.nkmk.me/python-try-except-else-finally/
乗法的積分と米田の補題

## 乗法的積分

リーマン積分の定義式を変形していくと次の結果が得られる．
```math
\begin{align}
    \int^b_a f(x) dx &= \lim_{n \rightarrow \infty}\frac{b-a}{n}\sum^n_{k=1}f\left(a + \frac{b-a}{n}k\right) \\
    & =\lim_{n \rightarrow \infty}\frac{b-a}{n}\sum^n_{k=1}\log e^ {\displaystyle f\left(a + \frac{b-a}{n}k\right)} \\
    & =\lim_{n \rightarrow \infty}\frac{b-a}{n}\log\prod^n_{k=1}e^ {\displaystyle f\left(a + \frac{b-a}{n}k\right)} \\
\int^b_a \log (f(x)) dx &= \lim_{n \rightarrow \infty}\frac{b-a}{n}\log\prod^n_{k=1}e^ {\displaystyle \log f\left(a + \frac{b-a}{n}k\right)} \\
    &= \lim_{n \rightarrow \infty}\frac{b-a}{n}\log\prod^n_{k=1}f\left(a + \frac{b-a}{n}k\right) \\
    &= \lim_{n \rightarrow \infty}\log\left(\prod^n_{k=1}f\left(a + \frac{b-a}{n}k\right)\right)^{\displaystyle \frac{b-a}{n}} \\
e^{\displaystyle \int^b_a \log (f(x)) dx} &= e^{\displaystyle \lim_{n \rightarrow \infty}\log\left(\prod^n_{k=1}f\left(a + \frac{b-a}{n}k\right)\right)^{\displaystyle \frac{b-a}{n}}} \\
    &= \displaystyle \lim_{n \rightarrow \infty}\left(\prod^n_{k=1}f\left(a + \frac{b-a}{n}k\right)\right)^{\displaystyle \frac{b-a}{n}}
\end{align}
```
この最後の式$e^{\displaystyle \int^b_a \log (f(x)) dx}$を乗法的積分と言い，$\displaystyle\int^b_a f(x) ^{dx}$と書き表す．
## ディラックのデルタ関数
ディラックのデルタ関数とは，形式的に
```math
\delta_a(x)=
\begin{cases}
    \infty & x = a, \\
    0      & x \neq a.
\end{cases}
```
で表される関数であり，
```math
\int_{-\infty}^\infty\delta_a(x) dx = 1
```
となるものをいう．
### 定理
```math
\int_{-\infty}^{\infty}f(x)\delta_a(x)dx = f(a)
```
### 証明
```math
\begin{align}
\int_{-\infty}^{\infty}f(x)\delta_a(x)dx &= \int_{-\infty}^{\infty}f(a)\delta_a(x)dx \\
    &= f(a)\int_{-\infty}^{\infty}\delta_a(x)dx \\
    &= f(a)
\end{align}
```
この性質をもとに乗法的積分においても同様の性質が成り立つことが分かる．
### 定理
```math
\int_{-\infty}^{\infty}f(x)^{\delta_a(x)dx} = f(a)
```
### 証明
```math
\begin{align}
    \int_{-\infty}^{\infty}f(x)^{\delta_a(x)dx} &= e^{\displaystyle \int_{-\infty}^{\infty}\log (f(x)^{\delta_a(x)})dx} \\
    &= e^{\displaystyle \int_{-\infty}^{\infty}\delta_a(x) \log (f(x))dx} \\
    &= e^{\displaystyle\log (f(a))}\\
    &= f(a)
\end{align}
```
## 米田の補題
ここで，tensor object と power object をそれぞれ次のように書き表す．
```math
\begin{align}
    XA & & X^A
\end{align}
```
また米田埋め込みを
```math
\begin{align}
    \Delta_A(X)&=\text{Hom}(X,A) \\
    \Delta^A(X)&=\text{Hom}(A,X)
\end{align}
```
と書き表す．
このとき次が成り立つ．
### 定理
函手$F:\mathbb{C}\rightarrow\mathbb{Set}$，$G:\mathbb{C}^{op}\rightarrow\mathbb{Set}$を考えると，
```math
\begin{align}
    F(A)&= \int{F(X)^{\displaystyle\Delta^A(X)X \in \mathbb{C}}} \\
    G(A)&=\int{G(X)^{\displaystyle\Delta_A(X)X \in \mathbb{C}}} \\
    F(A)&=\int{F(X){\displaystyle\Delta^A(X)}}{X \in \mathbb{C}} \\
    G(A)&=\int{G(X){\displaystyle\Delta_A(X)}}{X \in \mathbb{C}}    
\end{align}
```
これらは米田の補題と余米田の補題を表し，米田埋め込みと積分と乗法的積分はディラックのデルタ関数とエンドとコエンドの類似となっている．
タイムスライス

# タイムスライスを見ていみる
スケジューラが実行可能プロセスに```タイムスライス単位でCPUを使わせる```ことを実験によって確かめます
...
CPU時間を使う付加処理用の```プロセスを一つ、ないし複数同時に動かし```、次のような統計情報を採取します。
...
* ある時点で、論理CPU上では```どのプロセスが動作```しているのか。
* それぞれの```進捗はどれだけ```か。
...
並列度１、２、３それぞれで実験してみます。
```
for i in 1 2 3 ; do ./sherd.py $i ; done
```
## 並列度１
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/1f5af530-bbed-4887-ff14-80a024763348.png)

## 並列度２
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/6c07f6d7-8372-fbaa-9268-635e8290f058.png)

## 並列度３
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/64f6ee42-f922-76a3-de5d-2017f3ac72b4.png)

### 気づき
本当にジグザグに並列している。
横軸のメモリを見ても並列度が多くなるたびに大きくなるのでそれだけ時間がかかっているのがわかる。
初めて見た。

# タイムスライスの仕組み
並列度が```２の場合に比べて、３の場合の方が各プロセスのタイムスライスが短い```ことがわかります。実はLinuxのスケジューラはsysctlのkernel.sched_latency_nsパラメータの値（ナノ秒単位）で示した```レイテンシターゲットと呼ばれる期間に一度、CPU時間を得られる```ようになっています。
...
各プロセスのタイムスライスはkernel.sched_latency_ns / <論理CPU上で実行中または実行可能状態のプロセス＞[ナノ秒]
...
kernel.sched_latency_nsパラメータはカーネルv5.13には存在しません。v5.13以降をお使いの場合、rootのみがアクセスできる/sys/kernel/debug/sched/laten_nsが同じ意味を持つファイルです。
```
root@***********:***************# cat /sys/kernel/debug/sched/latency_ns
6000000

root@***********:***************# uname -r
5.15.0-107-generic
```
# タイムスライス変動の要素
* システムが```搭載する論理CPU数```
* 所定の値を超える論理CPU上で```実行中/実行待ち中のプロセス数```
* ```プロセスの優先度を表すnice値```

### nice値によるタイムスライスを見る
nice値はプロセスの実行優先度を```−２０から１９```までの間で設定する値（デフォルトは「０」）です。```−２０が一番優先度が高く、１９が低く```なります。
```
root@***********:***************# nice -n 5 taskset -c 0 ./inf-loop.py &
[1] 3441
root@***********:***************# sar -P 0 1 1
Linux 5.15.0-107-generic (***********) 	2024年05月20日 	_x86_64_	(1 CPU)

13時33分23秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
13時33分24秒       0      0.00     93.02      6.98      0.00      0.00      0.00
平均値:        0      0.00     93.02      6.98      0.00      0.00      0.00
```
```
%nice
                     Percentage of CPU utilization that occurred  while  exe‐
                     cuting at the user level with nice priority.
```
#### 出典
man sar
#### 和訳
優先順位の高いユーザー・レベルでの実行中に、CPUの使用率が低下した。
#### 出典
deepL

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/620843d2-86b2-df16-d17d-3a606f88406b.png)

#### 気づき
occurredが低下したと和訳するのか。わからん。
和訳を見るとこの時間このプロセスはcpuが優先度をどれくらい低下させたかというのを示し、プロセスが多くなるとniceの割合が分散するのだろう。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
タイムスライスのことが少し理解できた。
タイムスライスの時間だけCPUが割り当てられることによって複数のプロセスを同時に処理できる
【Swift 5.3+】少数をいろいろ丸めてみる まとめ


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【Swift】少数の丸め方あれこれ - rounded()<br>👉 <a href="https://t.co/mCgLGkH85v">https://t.co/mCgLGkH85v</a><a href="https://twitter.com/hashtag/Swift?src=hash&amp;ref_src=twsrc%5Etfw">#Swift</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1792414661784268930?ref_src=twsrc%5Etfw">May 20, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんなにあるけどどれを使ったらいいのかと思いました。

```swift
[5.2, 5.5, -5.2, -5.5, 0.51, 0.0, 0.03, 1.001]
  .forEach {
    print($0)
    print(".rounded()", $0.rounded())
    print(".rounded(.down)", $0.rounded(.down))
    print(".rounded(.up)", $0.rounded(.up))
    print(".rounded(.towardZero)", $0.rounded(.towardZero))
    print(".rounded(.awayFromZero)", $0.rounded(.awayFromZero))
    print(".rounded(.toNearestOrEven)", $0.rounded(.toNearestOrEven))
    print(".rounded(.toNearestOrAwayFromZero)", $0.rounded(.toNearestOrAwayFromZero))
    print()
  }
```

```
5.2
.rounded() 5.0
.rounded(.down) 5.0
.rounded(.up) 6.0
.rounded(.towardZero) 5.0
.rounded(.awayFromZero) 6.0
.rounded(.toNearestOrEven) 5.0
.rounded(.toNearestOrAwayFromZero) 5.0

5.5
.rounded() 6.0
.rounded(.down) 5.0
.rounded(.up) 6.0
.rounded(.towardZero) 5.0
.rounded(.awayFromZero) 6.0
.rounded(.toNearestOrEven) 6.0
.rounded(.toNearestOrAwayFromZero) 6.0

-5.2
.rounded() -5.0
.rounded(.down) -6.0
.rounded(.up) -5.0
.rounded(.towardZero) -5.0
.rounded(.awayFromZero) -6.0
.rounded(.toNearestOrEven) -5.0
.rounded(.toNearestOrAwayFromZero) -5.0

-5.5
.rounded() -6.0
.rounded(.down) -6.0
.rounded(.up) -5.0
.rounded(.towardZero) -5.0
.rounded(.awayFromZero) -6.0
.rounded(.toNearestOrEven) -6.0
.rounded(.toNearestOrAwayFromZero) -6.0

0.51
.rounded() 1.0
.rounded(.down) 0.0
.rounded(.up) 1.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 1.0
.rounded(.toNearestOrEven) 1.0
.rounded(.toNearestOrAwayFromZero) 1.0

0.0
.rounded() 0.0
.rounded(.down) 0.0
.rounded(.up) 0.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 0.0
.rounded(.toNearestOrEven) 0.0
.rounded(.toNearestOrAwayFromZero) 0.0

0.03
.rounded() 0.0
.rounded(.down) 0.0
.rounded(.up) 1.0
.rounded(.towardZero) 0.0
.rounded(.awayFromZero) 1.0
.rounded(.toNearestOrEven) 0.0
.rounded(.toNearestOrAwayFromZero) 0.0

1.001
.rounded() 1.0
.rounded(.down) 1.0
.rounded(.up) 2.0
.rounded(.towardZero) 1.0
.rounded(.awayFromZero) 2.0
.rounded(.toNearestOrEven) 1.0
.rounded(.toNearestOrAwayFromZero) 1.0
```

https://developer.apple.com/documentation/swift/floatingpointroundingrule

短いシンプルな

```Swift
.rounded()
```

でいいですかね。

# 🤔 参考
https://android.benigumo.com/20240520/swift-rounded/
【Javascript、Python】変数名で使える文字って結局何？

# 導入
最近の言語、意外と変数名にいろんな文字使えますよね？
結局何文字くらい使えるのか気になったのでまとめてみました。
javascriptはWindows11のFirefoxとEdge(結果は同じ)
pythonは動作環境なんて持っていないので、google colabです。
# 使える文字
pythonの方は若干ミスってますが(詳細は下)
予想は、Lが1文字目から使えて、Mが2文字目から使える感じかなと思っています。
記号系は`_`とか`$`とかを除き基本的に使えないのかなと思っています。

https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V4.01.00/CS+.chm/Editor.chm/Output/ed_RegularExpressions4-nav-2.html

## Javascript
```js
const character_usable_in_variable_name = new Map();
for(let $i = 1; $i<205745; $i++){
  try{
    eval(`${String.fromCodePoint($i)}=0`);
    character_usable_in_variable_name.set($i, String.fromCodePoint($i));
  }catch(e){
    
  }
}
console.log(character_usable_in_variable_name);
let str = '';
for($j of character_usable_in_variable_name.keys()){
  str += character_usable_in_variable_name.get($j);
}
console.log(str);
```
https://drive.google.com/file/d/13wqUXUBq7hanG8GRG-ane2zqbqShAT_s/view?usp=sharing
## Python
```py
character_usable_in_variable_name = []
for int in range(1000000):
  try:
    exec(chr(int) + '=0')
    character_usable_in_variable_name.append([int, chr(int)])
  except:
    0
#print(character_usable_in_variable_name)

str = ''
for i, j in character_usable_in_variable_name:
  str += j
print(str)
```
https://drive.google.com/file/d/1G84zQtJXpY85hiuxwL3MnacfIESQ3vng/view?usp=sharing

ちなみになぜ`#`が入っているかというと、
```python
#=0
```
でコメントアウトされ、エラーが一つも出ないからです。
その点javascriptではコメントアウトが二文字以上なのでこのようなことは起こらないですね。
あとコピーミスって改行が入っていますね。
# JSとPYで使える文字の比較
```js
const python_txt = [];
for($k of `#ABC...略`){python_txt.push($k)}

const javascript_txt = [];
for($j of character_usable_in_variable_name.keys()){
  target = character_usable_in_variable_name.get($j)
  point = python_txt.indexOf(target);
  if(point != -1) {
    python_txt.splice(point, 1);
  } else {
    javascript_txt.push(target);
  }
}
```
なぜ`split`ではなく`for-of`を使ったかというと、
`split`を使ってしまうと後ろのほうにいる"1文字表すのに2文字使う勢"が分割されてしまうからです
```js
`𲎯`.split('');
  //> Array [ "\ud888", "\udfaf" ]
```
## Javascript
https://drive.google.com/file/d/1BJmL0Z2iNY0-Wf-MWl9ira4W-fUxQWmo/view?usp=sharing

pythonは`'$'`使えないんですね(一文字目だけかも)
## Python
なし
# 最後に
雰囲気的に、jsはカテゴリがLなものは全部使えそうですね。
Pythonはunicode15.1のアップデートができていないような感じがします。
コンソールからChatGPT質問する簡易チャット(Node.js)

コンソールからChatGPT質問する簡易チャットです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/e2c279ea-a059-1058-23fa-a2c1b89db93c.png)


`.env`ファイルにAPIキーを記載してから実行してください

```:.env
OPENAI_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

jsソース
```js:index.js
/**
 * ChatGPTにconsoleから質問する簡易チャット
 * ・を.envにAPIキーが必要
 * $ npm i openai
 * $ node --env-file=.env index.js
 */
import * as readline from "readline";
import OpenAI from 'openai';

const openai = new OpenAI({
	apiKey: process.env.OPENAI_API_KEY
});

process.stdout.write('> ');
const stdin = readline.createInterface({
  input: process.stdin,
});

stdin.on("line", async (message) => {
    const completion = await openai.chat.completions.create({
        model: "gpt-4o",
        messages: [{ "role": "user", "content": message }],
    });
    console.log(completion.choices[0].message.content);
    process.stdout.write('\n\n> ');
});
```
OracleAPEXのローカルへの自動バックアップを構成する

# 初めに
OracleAPEXでは自動バックアップ機能がありますが、何かしらのエラーで復元出来ないことがあります。そのため別個でファイルを保存する方法を探した所、ローカル環境にアプリケーションファイルを保存できる方法を見つけたのでご紹介させて頂きます。

# 準備
まずクラウドウォレットファイルをAutonomous Databaseからダウンロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/91b3bd72-e906-98e5-3ab7-20989b04ae0d.png)

次にsqlclを使用するためファイルのダウンロードします。

https://www.oracle.com/jp/database/sqldeveloper/technologies/sqlcl/

ダウンロード完了後はCフォルダ直下に置き、システム環境変数のPathに以下のbinフォルダを通しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/d7ef9e9c-12ea-6a4b-5bce-4a5ccb90272b.png)

以下バッチファイルを作成して、必要パラメータを入力して実行します。

```
@echo off

chcp 65001

set sqlcl_path=sqlcl\binのファイルパス
set config_path=クラウドウォレットファイルパス
set database_name=データベース名
set pass=パスワード
set connect=admin/%pass%@%database_name%_high
set sql_path=@export.sql

set date_path=%date:~0,4%%date:~5,2%%date:~8,2%
set time_tmp=%time: =0%
set time_tmp=%time_tmp::=%
set folder_path=%time_tmp:~0,4%

cd %sqlcl_path%

sql.exe -S -cloudconfig %config_path% %connect% %sql_path%

for /f %%a in ('dir /a-a /b ^| findstr -i f') do (

     mkdir %date_path%\%folder_path%

     Powershell Compress-Archive -Path %%a -DestinationPath %date_path%\%folder_path%\%%a.zip -Force

     rmdir /s /q %%a

 )

)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/28a50929-c3ba-5f97-1798-e3e32e4e45c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/0d80760e-270c-9839-5351-26e8258c0751.png)


無事ローカル環境に保存出来ました。

分割してファイルを保存しているので、ページ単位で復元が可能となります。
タスクスケジューラを使用すれば日次バックアップも可能となります。

これで以上となります。
見て下さりありがとうございました。
[Google Cloud Text-to-Speech API(V1)] Javaで長時間実行オペレーションをキャンセル・削除する

Cloud Text-to-Speech API V1(Java)を使用して、
長時間実行オペレーションをキャンセル・削除する方法についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Cloud Text-to-Speech API(V1)] JavaでText-to-Speech APIを使ってみる](https://qiita.com/doran/items/9edbd7d4ed11c5c4ec5f)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[オペレーションをキャンセル](#1-オペレーションをキャンセル)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[オペレーションを削除](#2-オペレーションを削除)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. オペレーションをキャンセル
指定した長時間実行オペレーションをキャンセルします。

### 1.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(TextToSpeechLongAudioSynthesizeClient client = getTextToSpeechLongAudioSynthesizeClient();
        OperationsClient op = client.getOperationsClient()){
    
        String opName = String.format(
                        "projects/%s/locations/%s/operations/%s", 
                        "プロジェクトID","ロケーションID","オペレーションID");
        op.cancelOperation(opName);
    }
}
```

#### 1.2.1. HTTPリクエスト
POST:　https:\//texttospeech.googleapis.com/v1/operations/projects/{プロジェクトID}/locations/{ロケーションID}/operations/{オペレーションID}:cancel
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容
レスポンスはありません。

## 2. オペレーションを削除
指定した長時間実行オペレーションを削除します。

### 2.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(TextToSpeechLongAudioSynthesizeClient client = getTextToSpeechLongAudioSynthesizeClient();
        OperationsClient op = client.getOperationsClient()){
    
        String opName = String.format(
                        "projects/%s/locations/%s/operations/%s", 
                        "プロジェクトID","ロケーションID","オペレーションID");
        op.deleteOperation(opName);
    }
}
```

#### 2.2.1. HTTPリクエスト
DELETE:　https:\//texttospeech.googleapis.com/v1/projects/{プロジェクトID}/locations/{ロケーションID}/operations/{オペレーションID}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストボディ
リクエストボディはありません。

### 2.3. レスポンスの内容
レスポンスはありません。

<br>
<br>
おしまい。。
現在未経験の私が書く未経験者のための指南書

幾年先のみなさんこんにちは。

私はこれから２０２４年５月１９日からProgateに１ヶ月のみ課金しHTML並びCSSを勉強している１年間休学中の文系大学４年生の２２歳です。
語るようなことは多くないので自己紹介はこれくらいにして。
早速ですが宣言します。

”私はこの知識量からのしあがり、大学を卒業する頃には必ず自分の理想通りの仕事をして生きていきます”

経験者、知識者の方からすれば稚拙で知識もない文章になるかと思います。また阿呆の一人が出てきたぞ。すぐ挫折するんだろうそう思われるでしょう。
でも私には関係ないのです。それはこの文章を綴るにあたり想定済みのこと。

ですが私は綴り続けます。
なぜなら、この指南書は
こんな自分と全く同じ境遇や生活をしている人、燻っている人、一歩目を踏み出すことが出来ない人の背中を押す文章になることを確信しているから始めるのです。

お前の文章なんか誰にも響かない。誰も読まないそう思われるかもしれません。
でも大丈夫、今、あなたが読んでくれているから。私のこの時間は決して無駄じゃなかったと言うこと。

まぁ、そんな感想をたくさん貰えるくらい、いつか多くの人に見られたいものです
【初心者】paiza でプログラミングを習得してみる

皆さんはプログラミングの習得は
どのように行いましたか？

私のイメージでは参考書を購入して
お持ちの PC に開発環境を入れる形式が
多いのかなと思います。

今回は paiza ラーニングというサイトで
プログラミングを 1 から習得する形式について
紹介してみようと思います。

学生時代にこのサイトへとたどり着いていれば
人生は変わっていたかもしれないと思うほど
このサイトはプログラミングの習得に向いています。

是非皆さんのお子さんに紹介してみてはいかがでしょうか？
(この記事は読者の方がお子さんに紹介する事を目的としています)

すごく簡単にプログラミングを習得することができます。

***

アカウント作成について

アカウント作成は
Google アカウントがあれば
簡単に登録できます。

いくつかの項目に答える必要がありますが
住所など個人を特定できる情報の入力欄はありません。

気軽に登録頂けると思います。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/1c3d90cf-f359-b5b4-2820-3fe18f3c2cd2.png)


***

習得できる言語について

習得できる言語は非常に多いです。

多いですがプログラミングを習得したい場合は
完全無料のレッスンに限られると思います。

ここでは Python3入門編 を受けてみたいと思います。

私は昔 java のレッスンを見てみましたが
これならば初心者でも簡単に習得できるだろうという
分かりやすさでした。

***

レッスンを受けてみる

まず Python3入門編 のレッスンを開いてみると
次の項目が確認できます。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/8f5166be-4bce-639f-50b5-255554b0b515.png)

10 種類の項目が確認できますが
Python入門編7: 関数を理解しよう
を開いてみます。

すると chapter1 ～ chapter7 に
分かれていることが確認できます。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/73421b23-7996-2140-8ea1-457e9930a167.png)

chapter2 を開いてみます。
すると次のような画面になります。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/58034553-d556-9aae-6bcf-fed24bb43844.png)

左上の画面で説明動画(機械音声？)を見ながら
右上の画面でコードを入力して
右下の画面で結果を見る事ができます。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/8ce8198f-c495-1e48-ad34-b85fc5656091.png)


1 画面で動画を見ながら
プログラミングを同時にできるのは
とても習得しやすいと思います。

参考書や開発環境のインストールが必要ないため
簡単にプログラミングを学ぶことができます。

また、習得した内容は
練習問題が大量にあるため
習得した気分で終わらずに
習得することができます。

***

以上 paiza でプログラミングを
習得する流れを紹介しました。

この記事は皆さんが皆さんのお子さんに
プログラマーの道を紹介する事を
目的としています。

このサイトで習得できるのは
基礎の部分だけかもしれませんが
プログラミングを体験する事は
将来の選択肢の幅を広げる
きっかけになるかもしれません。

少なくとも私は
子供の頃にこのサイトを知りたかったです。

皆さんの子供の将来の選択肢が
増える事を祈っています。

閲覧ありがとうございました。
Fortran 文字列型にUFT-8の日本語を使用する際の考え方

## 環境

OS: Ubuntu-22.04.04 LTS on WSL2
コンパイラ: gfortran version 11.4.0

## 結果

```fortran
program char
    use, intrinsic :: iso_fortran_env
    implicit none
    character(len=10) :: string_list(5)

    ! 𢎭=UTF-8で4byte格納の難読漢字
    string_list = [character(len=10) :: "abc", "あいう", "あいうえお", "𢎭", "🍺"] 

    print *, string_list(2) ! あいう
    print *, string_list(2)(1:4) ! あ�
    print *, string_list(3) ! あいう�
    print *, string_list(4) ! 𢎭
    print *, string_list(4)(1:3) ! �
    print *, string_list(4)(1:4) ! 𢎭
    print *, string_list(5)(1:3) ! �
    print *, string_list(5)(1:4) ! 🍺

end program char
```

出力を見ると`character`型はC言語と同様に8bitを１要素として機械的に取り入れて、機械的に出力しているようです。  
UTF-8で、あるフォントに設定したコンソールに出力した際には、UTF-8に対応する文字フォントがあれば文字化けするこなく出力されるといった感じでしょうか。  

`あいうえお`の場合はそれぞれ24bitなので、Fortranでは15文字としてカウントされ`character(len=10)`に明示的に変換される際に`え`の途中まで格納された形になる。  
`𢎭`という一部の難読漢字ではUTF-8で4byte格納になっているので4文字として格納される。  
`🍺`という絵文字もUTF-8で4byte格納なので4文字分。

## 方針

実用的には、基本日本語は24bit(3文字)で決め打ち、32bitになるもの(一部の難読漢字や絵文字)は入らないものとしてあつかう（絵文字を入れるなと注意書きに書く）といった感じでしょうか。

## 終わりに

Fortranを使用する人は日本語を扱うことはあまりないと思われますが、一応書きました。
OracleAPEXでメタデータから項目を一括置換する

# 初めに
OracleAPEXでアプリケーション内のアイテム名を一括置換したい時、sqlを全て修正したい時がありました。その際にエクスポートしたメタデータを書き換えてから取り込むことで一括置換が出来たので方法を紹介したいと思います。

# 前提
対話モード・レポートのtest111とテスト111という項目を置換しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ec772b18-a0ff-d44b-5a60-228a17117f47.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/c3318524-df45-1558-55ec-9ef09c32a80b.png)


# 準備
一括置換したい対象のアプリケーションからSQL形式でエクスポートを行います。
この際、「複数のファイルに分割」のオプションをOFFにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/46b2bd58-908d-26a0-54a1-b32e83973a5c.png)

出力したファイルで検索を掛けて「test001」の方は見つけられましたが、test002の方はASCIIで変換された形になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/26748b71-7f63-b9ad-a922-95284a141da7.png)

この場合以下のSQLを実行することで変換後と変換前の値を取得することが可能になります。

```
SELECT UNISTR ('変換前に戻したい文字列') FROM DUAL;

SELECT ASCIISTR('変換したい文字列') FROM DUAL;
```
\30C6\30B9\30C8111を入れて実行し「テスト111」が取得出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/e4644ea2-2b7b-8a5b-9c53-f03b1d39dc96.png)


日本語を置換したい場合は以下のようにASCIIに変換して置換することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/d27bbdd2-91e6-e41c-5c0f-dca0969c544c.png)

対象の一括置換を行いファイルを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/9d2c9afa-ad3a-ca36-716e-ee63dd83ea49.png)

アプリケーションのインポートを行い、値が変更されていることを確認出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6b23dfcc-b68d-c5ab-0079-17385ab72b0c.png)


以上となります。
見て下さりありがとうございました。
New Relic のアラート条件のオン・オフが簡単に！

# New Relicの最新アップデートにより、アラート条件の管理がこれまで以上に簡単かつ直感的に！ 
今回のアップデートでは、アラート条件のオン・オフを素早く切り替えできる新機能が導入されました。ユーザビリティを重視したこの改善により、効率的なモニタリングと迅速な対応が可能になります。これから詳細にその機能を見ていきましょう。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート(2024年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202402 "New Relic アップデート(2024年2月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

# 今回のポイント
アラート条件（Alert conditon）の管理を簡単にする機能強化は、次の3つです。

## 1\. 全てのアラート条件の有効・無効状態を一覧で把握
　アラート条件の一覧で、現在設定されている全てのアラート条件の有効・無効状態が一目で分かるようになりました。これにより、現在の設定状態を把握しやすくなり、必要に応じて有効・無効を切り替える対応が可能です。
![条件の有効・無効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/01b0e943-9b8c-fc0f-3772-facba1b56330.png)


 
## 2\. 全てのアラート条件の有効・無効状態をトグルで簡単設定！
　新たに追加されたトグル機能により、各アラート条件の有効または無効を、一覧画面から直接切り替えることができるようになりました。この直感的なインターフェースでアラートの設定を素早く変更できます。
![有効無効の切り替え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/f56eea63-37fe-fbaf-5d47-f98e4b7f4526.png)


　アラート条件の詳細画面からトグルで有効・無効を切り替えることも可能です。
![有効無効_詳細画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/5a41589c-e001-1efa-045d-7c92587c5d22.png)

 
## 3\.アラート条件が変更された日時や変更した担当者が確認可能に
　アラートの条件が最後に変更された日時およびその変更を行った担当者の情報が、詳細画面で確認できるようになりました。Alert Condition の詳細画面の Additional details に記載されています。
![最終変更履歴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/7259c7f1-da17-30f5-b58d-716218e0db43.png)


有効・無効を切り替えた場合も最終更新として記録されます。

# New Relicのアラート条件管理機能は進化しています
今回ご紹介した機能強化により、アラートの設定と管理がより直感的になり、システムの異常をいち早く捉えることが可能です。これらの新機能を活用して、システム監視の精度を高め、運用の効率化を図りましょう。New Relicの最新情報や活用方法に興味のある方は、ぜひNew Relic株式会社のQiita Organizationをフォローし、最新のアップデートやチュートリアルをチェックしてください。

 :::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
:::note info

無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)

:::
最大値を探すアルゴリズム

## はじめに

最大値を探すアルゴリズムについてまとめる

### 対象データ

５つの整数が格納された配列を処理対象とする。

```php:data.php
$array = [12, 13, 11, 14, 11];
```

### フローチャート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/c1485c9f-0902-e7be-a60a-dfbadec50269.png)

### 解説

①変数`max`を用意する。
②`array[0]`のデータを変数`max`に代入し、暫定の最大値とする。
③変数`max`と`array[1]`を比較する
④`array[1]`の方が大きければこちらが新最大値となる。
⑤`array[1]`が変数`max`より大きくない場合は変数`max`に格納された`array[0]`が最大値の座をキープする。
⑥以降は同じ手順で繰り返す。
⑦変数`max`を出力する。
【ChatGPT＋DALL-E3】セッションをまたいでキャラを継承するには


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

　今回は、セッションをまたいでキャラを継承するには、という内容です。

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

　さっそく、本題です。

　セッションをまたぐと
　　同じキャラを使いたいのに
　　　変わってしまうことが
　　　　多々ありますよね。

　それは
　　とても残念なことです。

　今回は、
　　セッションをまたいでも
　　　キャラを継承する、と
　　　　いうものです。

　もちろん、
　　完璧にはなりません。
　　　（防波堤😅）

　それでも
　　今のところ、
　　　ふたつのキャラを
　　　　やりましたが、
　　　　　いい感じです。
***
　実は、
[こんにちは GPT-4o](https://openai.com/index/hello-gpt-4o/)
　　の“機能の探索”にあるサンプルに
　　　画像の一貫性を
　　　　保つものがありました。

　しかし、
　　これは、
　　　画像だけをアップロードする
　　　　だけでした。

　これから示すものは
　　そこから、もう一段上のものに
　　　なるかと思います。
***
　ではさっそく手順を
　　お伝えいたしましょう。

　最初のセッション
　❶キャラの画像をダウンロード
　❷キャラの画像のPromptをコピー

　新たなセッション
　❸❶をアップロード
　❹“この画像は以下のPromptで生成されました。”と入力（まだ送信しない）
　❺❷のPromptをペースト
　❻送信

　これで
　　ChatGPTに
　　　キャラを学習させます。

　あとは
　　普段の指示をしていくだけです。
***
　ちなみに
　　解析でもある程度は
　　　できます。

　しかし、
　　昨日（2024/05/19）の記事
[【ChatGPTアプリ】無料版で画像解析できる！](https://qiita.com/kabumira/items/f5038b3068148e2bc2c2)
　　　こちらでも書きましたが、
　　　　黒人なのに、特徴として
　　　　　抽出できずに、
　　　　　　Promptを作成しても
　　　　　　　当然ながら、
　　　　　　　　黒人になりません。

　また、画像をアップロードして
　　そのキャラのポーズを変える
　　　Promptを使う方法も
　　　　ありますが、
　　　　　一貫性がある、
　　　　　　とは言えません。

　ところが上記の方法であれば、
　　Prompt内に、若い黒人女性と
　　　書かれているので、
　　　　描画しても、大丈夫です。

　もちろん完璧に、とは
　　いきません（防波堤😅）

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

　今回は、ここまで。
json文字列をMapに変換する方法

``` 変換.json
{
  "name": "John",
  "age": 30,
  "address": {
    "street": "1234 Elm St",
    "city": "Somewhere",
    "zip": "12345"
  },
  "phoneNumbers": [
    {"type": "home", "number": "123-456-7890"},
    {"type": "work", "number": "098-765-4321"}
  ]
}
```

``` Main.java
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // JSON文字列の定義（ネストされた構造を含む）
        String json = "{\"name\":\"John\", \"age\":30, \"address\":{\"street\":\"1234 Elm St\", \"city\":\"Somewhere\", \"zip\":\"12345\"}, \"phoneNumbers\":[{\"type\":\"home\", \"number\":\"123-456-7890\"}, {\"type\":\"work\", \"number\":\"098-765-4321\"}]}";

        ObjectMapper mapper = new ObjectMapper();
        try {
            // JSON文字列をMapに変換
            Map<String, Object> map = mapper.readValue(json, Map.class);

            // 変換結果のMapを出力
            System.out.println("Converted Map: " + map);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```