OmniAICreator/Qiita-1.07M huggingface dataset:
for ... of 時に直接代入以外のアプローチによる 配列操作について

JavaScript には 参照変数 / 参照渡し はありませんが クロージャがありますので 変数への代入を反映することができます。

例えば 配列を for...of 中に 代入による対象の上書きをしたいとします。

その場合はどうしたらいいのでしょうか？

# 問 for ... of 上で 各要素に 1 を足した値を設定してください

```js
const array = [1,2,3,4,5];
console.log('before: %o', [...array]);
for(const a of array) {
   // TODO
}
console.log('after: %o', [...array]);
```

## 答1

array.values()が使われていたのを entries()にして key と value を取り出して 操作 するなら次の様になります。

```js
const array = [1,2,3,4,5];
console.log('before: %o', [...array]);
foreach(const [key, value] of array.entries()) {
   array[key] = value + 1;
}
console.log('after: %o', [...array]);
```

ただ、これは少々煩雑です。 元の array と key による操作を行う必要があります。

## アイディア

今回のアイディアはジェネレータ構文を用いた次のアプローチを提案します。

### 答2

Vue の ref の様に プロパティ getter / settter アプローチなら次の様な感じでしょうか………？

```js
const array = [1,2,3,4,5];
console.log('before: %o', [...array]);
for(const ref of iterator(array)) {
   ref.value = ref.value + 1;
}
console.log('after: %o', [...array]);
function* iterator(array) {
    for(const [key, value] of array.entries()) {
        const entry = Object.create(null);
        Reflect.defineProperty(entry, "value", {
            get: () => array[key],
            set: (value) => array[key] = value,
        });
        yield entry;
    }
}
```

### 答3

React の useState の様に 値と その setter を提供するアプローチなら次の様に書くことができます。

```js
const array = [1,2,3,4,5];
console.log('before: %o', [...array]);
for(const [state, setState] of iterator(array)) {
    setState(state + 1);
}
console.log('after: %o', [...array]);
function* iterator(array) {
    for(const [key, value] of array.entries()) {
        const setter = (value) => array[key] = value;
        yield [value, setter];
    }
}
```

以上。
【ChatGPT Canvas】わかったこといくつか


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

　今回は、Canvasでわかったことを書きます。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ニュースはないので
　　さっそく本題です。

　今回は、
　　Canvasの
　　　表示について、ですね。
***
　以下のことについて書いていきます。

　・Canvasの文字数制限
　・Canvasの表現方法
　・表現方法のON/OFF
　・ファイル読み込みでのやり方と注意
***
【Canvasの文字数制限】

　まず、無制限ではありません。

　テキスト／コードのモードは
　　関係なく、約30000文字です。

　おそらく、
　　もう少し入るでしょう。

　Perplexityによると
>文庫本の小説は一般的に10万文字程度が目安とされています。30,000文字の場合、短編小説に該当し、文庫本の約3分の1の長さです。ページ数に換算すると、1ページあたり600～800文字とすると、約38～50ページ程度になります。

　入るようで入らない？
　　感じがありますね😅
***
【Canvasの表現方法】

　Canvasの表現方法と言われても
　　わかりませんよね。

　コードモードは
　　Editorと同じです。

　では
　　テキストモードは？

　実は、単なるテキストを
　　表示しているわけではありません。

　Markdown記法で
　　表現されています。

　Markdown記法とは？

　HTMLを
　　マークアップ言語と呼びますが、
　　　命令の記述によって
　　　　あのような表示を
　　　　　ブラウザに指示しています。

　Markdown記法は
　　記号の記述によって
　　　Qiitaのような表示が
　　　　できるわけです。

　シンプルな記号で済むので、
　　Markdown記法は
　　　そのままでも読みやすいです。

　なお、LaTeX（数式・化学式）は
　　表現できません。
***
【表現方法のON/OFF】

　そんなMarkdown記法で
　　表現されているCanvasですが、
　　　その表現をON/OFFできます。

　できる、と書きましたが
　　実際には、Markdownの表記は
　　　見えませんし、いくつかは
　　　　そのままです。

　プレーンテキストに
　　なるわけではありません。

　華美な表現をしなくなる、
　　くらいに考えてください。

　やり方は、
　　“Markdown記法を✘✘✘してください”
　　　です。

　✘✘✘をON/OFFの
　　どちらかにしてください。
***
【ファイル読み込みでのやり方と注意】

　テキストファイルについてです。

　テキストファイルを
　　Canvasにそのまま読み込みたい、
　　　そんなときはこちら。

　手順
　❶ファイルをアップロード
　❷下記を入力
```Text:そのまま読み込みたいPrompt
これをCanvasにそのまま読み込んで。要約などは不要。
```
　❸送信

　これでふつうに読み込まれます。

　ただし、
　　改行の扱いが
　　　少々異なるのか、
　　　　複数行が一行になります。
***
　今のところ、
　　こんなところですね。

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

　今回は、ここまで。
enebularでnode-red その16

# 概要
enebularでnode-redやってみる。
クラウド実行環境でdatastore使ってみる。

# 嵌りポイント

データストアへの接続	
データストアへの接続を行う場合は"ON"にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/31b84ab3-3075-4429-da84-6feed5c8bffd.png)

以上
研修欠席者は誰だ？？パソコンを開かずにLINEで確認。

## 1.LINE Botに出会った
私はとあるスーパーマーケットで人事部をしております。
**自己紹介はnote**にて掲載しておりますので是非ご覧ください:sunny:
〔note〕（https://note.com/keita0308)
〔X〕（https://x.com/Av2Tuq)
業務で研修運営を行っているのですが、研修の欠席者を把握するのが大変です:thunder_cloud_rain:
欠席者には事前にGoogle Formsの回答をしてもらいます。
それを研修日直前で確認をして、欠席者の把握をしています。
しかしながら休日などを挟んでしまうと、欠席者の事前確認を忘れることがしばしばあります:sob:
パソコン起動しドライブにて確認すれば済む話なのですが、もっと簡単に確認出来たら便利ですよね:heart_eyes_cat:　
そんなことを考えていると、なんと最近**LINE Bot**というものに出会いました:clap:
勉強していると、意外と簡単にLINEで確認できるのではないかと思いました！！
これができたら、部署内の仲間も楽になるかも:thinking:

## 2.完成　欠席者確認Bot
### 1.使用ツール
・**Make**
・**Google Spread Sheets**
・**LINE**
### 2.完成LINE Botはこちら
https://x.com/Av2Tuq/status/1843489523570983211
### 3.Makeシナリオがこちら（シンプル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/9c70f74b-d1c2-3a6d-932a-954ab609d20b.png)
**ポイント：Google Formsの回答をGoogle ~~Spresd~~Spread Sheetsに変換したイメージから、スプレッドシート（仮）を作成しているため、様々な応用ができる。**
## 3.完成までの道程
### **1.Google Sheets【Search Rows(Advanced)】の作成**
自分のアカウントと連携。その後連携するGoogle ~~Spresd Sheets~~Spread Sheetsを選択。
**ポイント：Queryの箇所でselect * where B contains "{{1.events[].message.text}}"を入力。**
この作業を行うことで複数行からB列(研修日)の同じキーワードを引っ張ってくることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/6b0981f8-8fec-53ef-a7de-57e563b57846.png)
### **2.Tools(Set multiple variables)の作成**
リプライ時の日付の表記をMM/DD（ex.10/31）に変換します。
Toolsを使用しない場合は、かなり長い日付表記でリプライされ非常に見づらい結果となります。
※newlineは行が追加されるコードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/7d49cf5c-a00e-075a-1ff8-c1084645db75.png)
### **3.Tools(Table aggregator)の作成**
ここではリプライするテキストの選択をします。
（今回のBotは研修日、研修名、社員番号、氏名、部署、欠席理由をリプライするよう設定しています。）
**注意点：日付変換したものはTools-Set multiple variablesの中からチェックをするGoogle Sheets【Search Rows(Advanced)】の中の研修日をチェックしない**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/4e06c756-17b3-fb6f-84af-afbca84660ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/a9fc6afc-7d8b-3c9c-6197-133c5f21c6ab.png)
### **4.LINE(Send a Reply Message)の作成**
最後はかなりシンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/12d95744-77c5-9f8d-3cad-5749be5a157d.png)
## 4.今回の壁
最終のシナリオは非常にシンプルなものとなりましたが、
**Google ~~Spresd~~Spread Sheetsより複数行を引っ張ってくる方法**が
どうしても分からず挫折しそうになりました。
検索サイトで検索しても分からず、ChatGPTに聞いて色々試したが分からず、先輩にヒントを頂いて試しても分からず、最終は先生にご指導いただき壁を乗り越えました。
ご尽力くださいました皆さま本当にありがとうございました。

## 5.最後に
かなりイメージに近いものはできましたが、まだまだ改善の余地はありそうです。
研修名だけではなく、研修日で検索をすることができたり、
はたまた、研修日になったら自動的に当日の欠席者をLINEに送信するなど、
様々な事象が作成できそうです。
しかしながら簡単そうな作業もかなり細かい工程を経る必要があることを知り、
今後も壁にぶち当たるだろうとも思いました。
そんなときは周りを巻き込み解決していきます。
**自分の学びは独り占めせず、誰かの役に立つよう頑張ります！！**
PowerAutomateで選択肢に表示されないM365グループに対する操作を行う

今回は大変皮相な理解に基づくテクニックのご紹介です。

# Problem

PowerAutomateのワークフローから とあるMicrosoft365のグループ（Active Directoryで管理されている配布リストなどと似ているが基盤が異なるアレ）に対する操作を行いたいが、アクションの入力の選択肢に当該グループが表示されない。

例えば「Office365グループ」コネクターの「グループメンバーの一覧表示」アクション。グループを選択するためのプルダウンリストには表示されるグループとされないグループがあり、後者を指定することができない：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ec242bb6-2d57-1cf5-02b4-a58b11693b9e.png)

入力が求められているグループIDは表示名やメールアドレスと異なり、通常一般ユーザーからは確認ができない。

# Solution

「Office365グループ」コネクターの「グループの一覧」アクションを利用して、表示名やメールアドレスをキーにして当該グループを検索。検索結果からグループIDを入手。それを使ってグループに対する操作を行う。

「行のフィルター」に`mail eq '...'`や`displayName eq '...'`などの条件を記述して対象グループを検索：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/50a38618-2d54-07eb-1ddf-9f8f16f2cb80.png)

この検索結果からグループIDが入手できる。これをキーとして使って「グループメンバーの一覧表示」をはじめとしたグループ操作を実行できる。
.pyを.exe化する方法

# 必要な物
- Pythonファイル　.py
- pip 環境
- nuitka
⚠️動作環境はpython3.4です 
# インストール
nuitkaをインストールします。

~~~ 
pip install Nuitka 
~~~
# 使い方

exe化したいpythonファイルのパスまで移動する

~~~:例/python/test.pyの場合
cd /python/
~~~
Nuitkaを実行
~~~
nuitka test.py 
~~~
# オプション
末尾に追加することでそれぞれのオプションを追加できる

```: コンソール画面を表示しない
--windows-disable-console
```
```: pythonがない環境でも動作する
--standalone
```
```: ファイルを一つにする
--onefile
```
```: tkinterを使用する
--enable-plugin=tk-inter
```
```:アイコンを指定する
--windows-icon-from-ico="*.ico
```
# 
nuitkaはpythonファイルをc言語としてコンパイルするためプログラムによってはできない場合もある。
特に`python環境がない場合`でも実行する場合は注意が必要。
スナップショットとバックアップの違い(メモ)

「スナップショット」と「バックアップ」はデータ保護の手法ですが、目的や動作に違いがあります。

### 1. **スナップショット (Snapshot)**  
- **定義**: スナップショットは、特定の時点におけるシステムやデータの状態を記録する一種の「写真」のようなものです。
- **特徴**:
  - *高速*: スナップショットは非常に短時間で作成できます。
  - *ストレージ*: ストレージの容量を節約するため、差分（変更があった部分）のみ保存されることが多い。
  - *復元*: すぐに以前の状態に戻せるため、システムのトラブル時に有効です。
  - *依存関係*: スナップショットは元のデータに依存しており、元データが削除されるとスナップショットも使えなくなる場合があります。
  
### 2. **バックアップ (Backup)**  
- **定義**: バックアップは、データの完全なコピーを作成し、別の場所に保存しておく方法です。
- **特徴**:
  - *データの完全なコピー*: バックアップは元データを丸ごと保存するため、完全な復元が可能です。
  - *復元*: システムがクラッシュしたり、データが失われた場合に元データ全体を復元できます。
  - *ストレージ*: 完全なデータコピーのため、スナップショットよりも多くのストレージを必要とすることがあります。
  - *独立性*: バックアップは元のデータに依存しないため、データが破損・削除されてもバックアップがあれば安全です。

### 簡単な違い
- **スナップショット**: システムやデータの特定の時点を素早く記録し、元データに依存します。
- **バックアップ**: データ全体のコピーを作り、独立した場所に保存して、長期的な保護に使われます。
Windowsアプリにダンプ吐かせる設定

## レジストリ設定
※Windowsをアップデートすると消えることがあるっぽい。その場合は再設定する。

レジストリエディタを起動し、以下のレジストリを選択
「`コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting`」

1. キーに`LocalDumps`が無ければ追加
2. `LocalDumps`に以下の値を追加
名前「`DumpFolder`」、種類「`展開可能な文字列`」、値「`C:\wer_dumps`」（出力先）
名前「`DumpCount`」、種類「`DWORD(32ビット値)`」、値「`3`」（出力先のダンプファイル保持数）
名前「`DumpType`」、種類「`DWORD(32ビット値)`」、値「`2`」（0:カスタム、1:ミニ、2:フル、※2だとファイルサイズ大きいので1でも良い？）

## その他ダンプ解析のための準備
### 必要なソフト
「`WinDbg`」をMicrosoft Storeから取得
### VC++アプリビルド設定(VC++アプリ開発中の場合)
ダンプ解析対象のアプリのビルド時に解析用のファイル群を出力させる設定
`「プロジェクト」-「プロパティ」-「構成のプロパティ」`
から以下を設定
`「リンカー」-「デバッグ」-「マップファイルの作成」`を「`はい`」
`「C/C++」-「出力ファイル」-「アセンブリの出力」`を「`アセンブリ コード、コンピューター語コード、ソース コード (/FAcs)`」


#### 解析
※出力されたmapファイル内の「Preferred load address is 00400000」をWindbgのTraceアドレスに足す。
例:0x123456 + 00400000 == 0x00523456

出力されたアセンブリコード上から00523456がありそうな場所(00523456なら0x523000など)をテキスト検索してみる。

～?HogeHoge@FugaFuga@@AAA@Z **00523400** f aaa.obj
～?HogeHoge2@FugaFuga2@@BBB@ZZ **00523700** f bbb.obj

ならaaa.objのHogeHogeだとわかる。
aaa.objのHogeHogeのアドレスは**0x00523400**からなので、obj内のアドレスは**0x00523456**-**0x00523400** == **56**

aaa.objのHogeHogeの0x56バイト目を出力されたアセンブリから探す。
【超初心者】curl コマンドとはなんぞや？！

# はじめに
paizaラーニングでPHPをはじめ、WEB開発を独学中のアラフィフ主婦です。

https://paiza.jp/works/web_tech/primer/beginner-webtech3/10603

↑の中で紹介されている

https://qiita.com/yasuhiroki/items/a569d3371a66e365316f

↑の記事を読んで疑問に思った箇所について調べた忘備録です。

# そもそもcurlコマンドって何？
「**コマンド（⁠command）**」とは、コンピューターの検索窓に「cmd」と打つと、立ち上がる黒い画面（コマンドラインツール）に、ユーザーがキーボードに決まった文字を打って**コンピュータやプログラムに与える命令**です。

https://qiita.com/KA_WA/items/c20fb3261c6d095b27a0

自分で考えた文字を打つのではなくて、すでにお決まりの命令文があるので、それを入力します。

:::note info
**curl** はその命令文の１つで、ウェブ上のサーバーとデータのやり取りをするためのものです。
:::

例えば、インターネット上のページやAPI（アプリケーションプログラミングインターフェース）から情報を取得したり、データを送信することができます。


## よく使うシーン
* ウェブサービスのAPIにデータを送信したり、データを取得したいとき。
* ウェブページやファイルをダウンロードしたいとき。
* HTTPのリクエストやレスポンスの内容を確認してデバッグするとき。


## 基本的な使い方

```PHP
curl [オプション] [URL]
```
ここで、URL はアクセスしたいウェブページやAPIのアドレスを指定します。

### 具体例
ウェブページの内容を取得 以下のコマンドで、指定されたURLの内容を取得できます。例えば、Googleのトップページを取得する場合：

![コマンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/027d1c65-2197-449f-85bd-15991c17287f.png)
コマンドとURLを入れてからEnterキーを押すと・・・
ずらずらとウェブページのHTMLソースコードが表示されます。

![curlコマンド　Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/6f38a1bc-d91c-7393-37dd-97974ba3d55d.png)

## よく使うオプション
### `-o` [filename]：ファイルのダウンロード
ファイルのダウンロード `-O` オプションを使うと、指定したURLからファイルをダウンロードできます。例えば、画像ファイルをダウンロードする場合：
```PHP
curl -O https://example.com/image.jpg
``` 
このコマンドを実行すると、カレントディレクトリ（今いるフォルダ）に image.jpg が保存されます。

### ` -I ` [URL]：ヘッダー情報の取得
` -I `オプションを使うと、ページのコンテンツではなくヘッダー情報だけを取得できます。これは、サーバーがどのような情報を返しているかを確認するために役立ちます。
```PHP
curl -I https://www.example.com
``` 
実行すると、HTTPステータスやサーバーの種類、コンテンツタイプなどが表示されます。

### ` -X POST ` ` -d `[data][URL]：
POSTリクエストの送信 フォームやAPIにデータを送信したいときは、`-X POST` と `-d` オプションを使って、POSTリクエストを送ることができます。例えば、APIにデータを送る場合：
```PHP
curl -X POST -d "name=John&age=30" https://example.com/api
``` 
このコマンドは、name=John と age=30 というデータを指定されたAPIに送信します。

### ` -s ` [URL]：
`-s` オプションは、「サイレントモード（silent mode）」を意味します。このオプションを使うと、通常の進行状況（プログレスバー）やエラーメッセージが非表示になります。つまり、-s を使うことで、実行中の詳細な情報を出力せずに、必要な結果（例えば、リクエストしたデータ）だけを表示することができます。

#### 例
通常、curl コマンドを使ってファイルをダウンロードすると、進行状況が表示されます。
```PHP
curl https://example.com/file.zip
```
これを実行すると、以下のように進行状況が表示されます：
```PHP
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   150    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0

```
しかし、-s オプションを付けて実行すると：
```PHP
curl -s https://example.com/file.zip
```
この場合、進行状況の情報が表示されず、出力だけが得られます。例えば、ファイルをダウンロードしている場合は、進行状況を表示せずにダウンロードが進行します。

##### 使うシーン

 *    スクリプトで curl を使用して自動化を行うときに、不要な進行状況のメッセージを抑えたいとき。
 *    ログを簡潔にしたいときや、出力を解析しやすくするために、必要な情報だけを取得したいとき。
 *    エラーメッセージも非表示にしたい場合。

#### `-s` と `-S` の併用
`-s` オプションを使うと、エラーメッセージも抑制されるため、何が起こっているかわかりにくくなることがあります。そこで、エラーメッセージだけは表示したい場合には、`-s` と `-S` を併用します。
```PHP
curl -s -S https://example.com/file.zip
```
この場合、進行状況は表示されませんが、何かエラーが起きたときにはエラーメッセージが表示されるようになります。

## その他よく使うオプション
*  `-L`：リダイレクトを自動的に追跡します。リダイレクトされるページの場合、リダイレクト先のURLに自動で移動してくれます。

*  `-u` [username:password]：基本認証が必要なサイトに対して、ユーザー名とパスワードを指定してアクセスします。


# まとめ
`curl`は、シンプルなコマンドラインツールですが、HTTPリクエストやファイルのダウンロードなど、さまざまな用途で使える便利なツールです。
生成AIでFFRPGプログラムは生成できるのか？ - ⑥生成AIを使用するにあたって

本記事では生成AIを使うにあたって
+ 注意点・リスク
+ 参考になりそうなURL等
をまとめとして記載します。

# 生成AIとどう付き合うべきか
#### 生成AIを使用するにあたってのリスク
**1.機密情報の漏洩**
生成AIは性能向上のために入力したデータを学習材料として使用してしまうことがありえます。
そのため生成AIに機密情報や社外秘情報を与えてしまうと、生成AIサービスを使用している他のユーザーに情報が漏洩する可能性があります。
**2.著作権等の権利侵害**
生成AIの中には、インターネット上の情報を元に生成するものがあります（ChatGPTなど）。
インターネット上の情報は著作権者の表示がはっきりしないものがあったり、無断転載・引用している情報も公然と公開されているため、これらを情報ソースとして生成AIが利用してしまうケースがあります。
そのため意図せず著作権・プライバシーの侵害につながる場合もあります。
**3.情報の真偽性**
インターネット上の情報や蓄積された情報を元に生成AIが作成するため、情報が正しいかどうかの保証はありません。
そのため根拠や裏づけを精査して使用する必要があります。
**4.雇用の減少・人間の知能の衰退**
生成AIを使用することで、普段から人間が行っていた作業をAIが行うようになり雇用の減少が見込まれます。
さらにAIに頼ることで自ら考えることが少なくなり、知能の衰退につながる可能性もあります。
**5.責任の所在**
誤情報の拡散や不適切な内容の生成が行われた場合に、開発者・ユーザー・AIのどれに責任を負ってもらうのかが不明瞭になります。
倫理や道徳を考えて情報の拡散や生成を行う必要があります。

#### リスクを鑑みてどう使うべきか？
+ AIが生成した回答、出力物を編集・精査せずそのまま使用するのは避ける
+ 調べ物に使用する場合は回答を元に裏取りを必ず行う
+ プログラムコードを生成してもらった場合はコーディングの参考にする程度にとどめ、生成されたソースをそのまま使うのは極力避ける
+ 個人情報、機密情報等、入力していい情報なのか確認してからプロンプト入力を行う


# 生成AIの使用にあたり参考になりそうなもの
#### プロンプト・エンジニアリングについて
以下のページを参考にしました。

**深津式プロンプト・システムでChatGPTを最大限に活用する方法**
https://note.com/discovery_ai/n/nb42d8fba539d

**【ChatGPT】個人的お気に入りプロンプトまとめ**
https://qiita.com/ryome/items/6b04cfdc25a2559902c8

**初学者に贈る、プロンプトエンジニアリング入門 LLMを“効率的”に使うためのテクニック**
https://logmi.jp/tech/articles/329114

**【ChatGPT】プロンプトエンジニアリングの基本から応用まで**
https://www.seraku.co.jp/pr-site/newtonx/column/01.html

#### IBMi向けの言語モデル
+ RPG Copilot
[RPG Copilot](https://chatgpt.com/g/g-x8QeWrCoP-rpg-copilot)というRPGコーディングに特化したChatGPTの言語モデルが存在します。
（記述などは英語ですが日本語でプロンプトを書いても問題なく対応してくれます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/d54e34fa-6bbd-e52f-e300-95cb51b70fa8.png)

　Safuraiというところが作成元で、他の言語でもいくつか同様の言語モデルがリリースされているようです。
　https://www.safurai.com/gpts
　使ってみて今のところ通常のChatGPTでコード生成した場合とあまり使い勝手は変わらないように感じます。。アップデートに期待しましょう！

+ 言語モデルの探し方
ChatGPTにサインアップすると色々な言語モデルを検索することができます。
https://chatgpt.com/gpts
IBMiやAS400といったワードで検索すると色々と言語モデルが出てきますので、試してみるのも良いかと思います。<b>※使用は自己責任で！</b>
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/cec1f74d-2ce0-f062-9780-68e9d0ac7609.png)
Railsでモデルのバリデーションを回避するためのhidden_fieldの使い方

# はじめに
ユーザー登録画面を作成する際、presence: trueバリデーションを設定しているフィールドがフォームに含まれていない場合、バリデーションエラーが発生します。今回は、モデルを変更したくないけど、登録機能だけは完成させるためにバリデーションエラーを回避するために、hidden_fieldを使う方法を紹介します。



# 問題
以下のように、presence: trueのバリデーションが設定されたモデルを使っているとします。

```
class User < ApplicationRecord
  validates :username, :email, :password, :phone_number, :address, :gender, presence: true, on: :create
  validates :email, length: { maximum: 255 }, format: EMAIL_FORMAT, uniqueness: { case_sensitive: false }, allow_blank: true
  validates :password, length: { within: 6..128 }, allow_blank: true
  validates :username, length: { maximum: 100 }
  validates :phone_number, length: { maximum: 15 }
  validates :address, length: { maximum: 255 }
  validates :gender, inclusion: { in: %w[male female other] }
end
```
このバリデーションでは、username（ユーザー名）、email（メールアドレス）、password（パスワード）、phone_number（電話番号）、address（住所）、およびgender（性別）が必須となっています。しかし、性別をフォームに含めずに登録したい場合、バリデーションエラーが発生します。



# 解決方法：hidden_fieldを使ってバリデーションを回避する
hidden_fieldを使って、性別（gender）にデフォルト値を設定することで、バリデーションエラーを回避します。

##### 実装例
以下のように、フォームにhidden_fieldを追加してgenderにデフォルト値（例えば 'other'）を渡します。
```
= form_with model: @user do |form|
  = form.label :username
  = form.text_field :username

  = form.label :email
  = form.email_field :email

  = form.label :password
  = form.password_field :password

  = form.label :phone_number
  = form.telephone_field :phone_number

  = form.label :address
  = form.text_field :address

  // hidden_fieldを利用して性別フィールドにデフォルト値を渡す
  = form.hidden_field :gender, value: 'N/A'

  = form.submit '登録'
```

# 注意点
もしフォームにその項目が本当に必要ない場合は、モデルのバリデーション自体を見直すのが良いですが、特定の条件下でそのフィールドを無視したい場合には、hidden_fieldで回避する方法が便利です。

# まとめ
hidden_fieldを使って、フォームに存在しないフィールドにデフォルト値を設定することで、バリデーションエラーを回避することができます。この方法は、フォームの見た目をシンプルにしながら、バリデーションを適切にパスするための有効な手段です。
AWS CLIでCloudFrontの設定を変更するスクリプト

## CloudFrontの設定は、ちょっぴり面倒くさい

CloudFrontの設定をする場合、特定の項目のみを設定するのではなく、設定用のjsonを丸ごと流し込む方式を取ります。

```bash:更新コマンド。オプションでjsonを読み込んでいる
aws cloudfront update-distribution \
  --id $DISTRIBUTION_ID \
  --distribution-config file://updated-config.json \
  --if-match $ETAG
```

jsonを作り込むのが面倒くさいので、スクリプトにして実行する方法を紹介します。

## 前提

AWS CLIコマンド、jqコマンドが使える環境であることを前提とします。

## 設定スクリプト

以下のように実行します。jqコマンドは抽出の他、フィールド編集も簡単にできるので良いですね。

```bash
# 設定対象の指定
DISTRIBUTION_ID=<CloudFrontディストリビューションID>

# 設定取得
aws cloudfront get-distribution-config --id $DISTRIBUTION_ID > dist-config.json

# アップデート用設定ファイルを作成
# ※WebACLIdフィールド (WAF設定) を変更する例です。更新したい内容に応じて編集してください
jq '.DistributionConfig | .WebACLId = "<WAF_ARN>"' dist-config.json > updated-config.json

# ETag取得
ETAG=$(jq -r '.ETag' dist-config.json)

# 設定変更の実行
aws cloudfront update-distribution \
  --id $DISTRIBUTION_ID \
  --distribution-config file://updated-config.json \
  --if-match $ETAG

```

## 参考

- [update-distribution — AWS CLI 2.18.1 Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/update-distribution.html)
時計ICの時間合わせプログラム簡易型(DS1307)(M5NanoC6)


HHとMMに適切な値を書いて実行して終了
戻りは、なし


いろいろ
最初は、立派な入力システムを書いていたが
だんだん、めんどくさくなり、スクリプト的に
実行したら終わりに落ち着いた。



プログラム

```c++



//I2C_DS1307_SET_TIME_M5NanoC6_1

#include <Wire.h> //I2C library

#define ADDR    0x68  // 2進数 1101000

char    data_read[8]; //i2cバッファー

#define HH  10
#define MM  05

void setup()
{
  Wire.begin(); //uno

//i2c書き込み
  Wire.beginTransmission(ADDR);

  Wire.write((char) 0    ); //0 レジスターの位置は0
  Wire.write((char) 0    ); //1 秒
  Wire.write((char) ( MM /10)*16+( MM %10) ); //2 分
  Wire.write((char) ( HH /10)*16+( HH %10) ); //3 時

  Wire.write((char) 3    ); //4 曜日
  Wire.write((char) 1    ); //5 日
  Wire.write((char) 1    ); //6 月
  Wire.write((char) 0x20 ); //7 年

  Wire.endTransmission();

} //end setup

void loop()
{

} //loop



```
Java基礎文法Part10

今回は文字列の比較について記事にしていと思います。

1. 基本的な文字列の比較方法
Javaでは、== 演算子と .equals() メソッドを使って文字列の比較ができますが、これらには重要な違いがあります。

== 演算子による比較
== 演算子は、オブジェクトの「参照」を比較します。つまり、2つの文字列が同じメモリ上の場所を指しているかどうかをチェックします。

```java
String str1 = "Hello";
String str2 = "Hello";

if (str1 == str2) {
    System.out.println("同じオブジェクトです");
} else {
    System.out.println("異なるオブジェクトです");
}
この例では、str1 と str2 は同じ文字列リテラル "Hello" を参照しているので、== は true を返します。しかし、新しく作成されたオブジェクトの場合、たとえ内容が同じでも==演算子は false を返す可能性があります。

java
String str1 = new String("Hello");
String str2 = new String("Hello");

if (str1 == str2) {
    System.out.println("同じオブジェクトです");
} else {
    System.out.println("異なるオブジェクトです");
}
```
この場合、str1 と str2 は異なるオブジェクトとして作成されているため、== の比較結果は false になります。

.equals() メソッドによる比較
.equals() メソッドは、文字列の内容自体を比較します。== 演算子のように参照を比較するのではなく、文字列の中身が同じかどうかをチェックするため、文字列の値を比較する際にはこちらを使用するのが正しい方法です。

```java
String str1 = new String("Hello");
String str2 = new String("Hello");

if (str1.equals(str2)) {
    System.out.println("同じ内容の文字列です");
} else {
    System.out.println("異なる内容の文字列です");
}
```
この場合、str1 と str2 の内容が同じ "Hello" なので、equals() は true を返します。

2. 大文字と小文字を無視した比較
Javaでは、文字列の大文字・小文字を無視して比較したい場合があります。その場合は、equalsIgnoreCase() メソッドを使います。このメソッドは、大文字と小文字の違いを無視して文字列の内容を比較します。

```java
String str1 = "hello";
String str2 = "HELLO";

if (str1.equalsIgnoreCase(str2)) {
    System.out.println("大文字小文字を無視して、同じ内容の文字列です");
} else {
    System.out.println("内容が異なります");
}
```
この例では、str1 と str2 は異なる大文字・小文字の組み合わせですが、equalsIgnoreCase() を使うことで、両方とも同じ内容とみなされて true を返します。

3. 文字列の順序を比較する
文字列の順序を比較する場合は、compareTo() メソッドを使います。このメソッドは、2つの文字列を辞書順（アルファベット順）で比較します。

結果が 0 の場合、2つの文字列は同じです。
結果が正の値（例: 1）の場合、最初の文字列が辞書順で後に続きます。
結果が負の値（例: -1）の場合、最初の文字列が辞書順で前に来ます。

```java
String str1 = "apple";
String str2 = "banana";

int result = str1.compareTo(str2);

if (result == 0) {
    System.out.println("同じ文字列です");
} else if (result < 0) {
    System.out.println("str1はstr2より前にあります");
} else {
    System.out.println("str1はstr2より後にあります");
}
```
この場合、"apple" は "banana" よりも辞書順で前に来るため、compareTo() は負の値を返します。

4. Nullの取り扱い
文字列を比較する前に、null の可能性も考慮することが重要です。equals() メソッドを使う場合、文字列が null の場合にエラーが発生しないように、先に null チェックを行うか、null の可能性がない側から equals() を呼び出すのが安全です。

```java
String str1 = null;
String str2 = "Hello";

if (str2.equals(str1)) {
    System.out.println("同じ内容の文字列です");
} else {
    System.out.println("内容が異なります");
}
```
この例では、str2 の側から equals() を呼び出しているので、str1 が null でもエラーは発生しません。

まとめ
Javaで文字列を比較する方法は、状況によって使い分ける必要があります。

==: オブジェクトの参照が同じかどうかを比較（基本的に使わない）。
.equals(): 文字列の内容が同じかどうかを比較（最も一般的）。
.equalsIgnoreCase(): 大文字・小文字を無視して文字列を比較。
compareTo(): 文字列の順序を比較。
nullチェック: 比較前に null の可能性を考慮。

今回は文字列の比較について記事にしてみました。
時計で遊ぶ。(シリアル出力)(M5NanoC6)



x 過去ログを見よ!!
x 時間合わせは、別


目的
DS1307のテスト


結果

![o_coq495.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c273ad54-c8cf-dc7c-a814-3fe7cd615b2c.jpeg)

![o_coq496.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4b7dadee-22e8-9eb0-116b-6820b036fb42.jpeg)


プログラム


```c++


//I2C_DS1307_M5NanoC6_1


//インクルド
#include <Arduino.h>
#include <Wire.h>   //I2C


//定義
// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000


//初期化
void setup()
{

  //シリアルの初期化処理
  Serial.begin(9600);
    
  //i2cの初期化処理
  Wire.begin(); // 1 2 NanoC6

} //setup


//メインループ
void loop()
{

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  char data_read[16] = {0x88, 0x88, 0x88}; //データバッファー
  int ii = 0;
  while (Wire.available())  {   // 要求より短いデータが来る可能性あり
    data_read[ii++] = Wire.read();       // 1バイトを受信
  }//while
  delay(1);

  //表示変換する パック二進化十進を文字列にする
  char cn1[16];  //桁
  cn1[0] = '0' + (data_read[2] >> 4);  //0 時 上位
  cn1[1] = '0' + (data_read[2] & 0xf); //1 時 下位
  cn1[2] = ':';
  cn1[3] = '0' + (data_read[1] >> 4);  //2 分 上位
  cn1[4] = '0' + (data_read[1] & 0xf); //3 分 下位
  cn1[5] = ':';
  cn1[6] = '0' + (data_read[0] >> 4);  //4 秒 上位
  cn1[7] = '0' + (data_read[0] & 0xf); //5 秒 下位
  cn1[8] = 0;

  Serial.println(cn1); //時刻を表示する

  delay(1000); //1秒待つ

} //loop



```
rex0220 計算式プラグイン 日付と日時

計算式プラグインでは、日付項目と日時項目で計算処理に違いがあります。
テーブル内の日付項目と日時項目で最大値を取得してみます。

# 概要

日付項目は、計算時に数値として扱いますが、
日時項目は、計算時に文字列として扱います。

対応日付："2024-10-08" -> 1728313200
対応日時："2024-10-08T01:00:00Z" -> "2024-10-08 10:00"

日付のMAX 値を取得する場合は、MAX(対応日付)　とします。
日時のMAX 値を取得する場合は、MAX_STR(対応日時)　とします。

![2024-10-08_10h03_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/74599b1e-2c16-e2b5-c49e-be9f20316c2f.png)

## MAX と MAX_STR 

MAX と MAX_STR は、下記のような違いがあります。
MAX は、数値以外を無視します。

MAX("12","2") -> "12"
MAX_STR("12","2") -> "2"

MAX("12a","2a") -> ""
MAX_STR("12a","2a") -> "2a"

※MAX_STR は、文字列比較ですので、
先頭の文字から比較して "1" と "2" では、 "2" が大きいため
MAX_STR("12a","2a") -> "2a" になります。


# アプリ設定

![2024-10-08_10h08_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b6b3970d-dc31-4058-d9ce-7453f7cbe8e6.png)


# 計算式プラグイン設定

![2024-10-08_10h06_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/38483377-ef8c-6159-a94c-3a49c877851d.png)

```.JS
// 最新対応日付 DATE
LASTIF(対応日付, 対応日付)

// 最新対応日時 DATETIME
LASTIF(対応日時, 対応日時)

// 最新対応内容 SINGLE_LINE_TEXT
LASTIF(対応日付, 対応内容)

// MAX日付 DATE
MAX(対応日付)

// MAX日時 DATETIME
MAX_STR(対応日時)

// MAX対応内容 SINGLE_LINE_TEXT
LASTIF(対応日時==MAX日時, 対応内容)

```
DjangoでNone判定をして、HTMLの表示を切り替える方法（JavaScript活用）

## 問題の発生
Djangoのテンプレートで値がNoneだった場合、その情報をもとにHTMLの表示を切り替えたいことがある。例えば、データがあった場合は、試合結果を表示するようにし、データがない場合は、「データがありませんでした」と表示するようにしたい。
今回は以下のようにしたい
・match_countの値がnoneだった場合、match_count_sentenceのdisplayをnoneとする。
・match_countの値がnoneだった場合、match_result_sentence_noneのdisplayをblockとする。
```HTML
<p id="match_result_sentence">{{ match_count }}戦でした。</p>
<p id="match_result_sentence_none">試合がありませんでした</p>
```

## 解決策
pタグ自体にmatch_countの値を埋め込み、その値で判断する。

## 手順

1.pタグに値を埋め込む
```HTML
<p id="match_result_sentence" data-match-count="{{ match_count }}">{{ match_count }}戦でした。</p>
```
:::note info
`data-match-count="{{ match_count }}"`をつけることによりpタグに値を埋め込むことができる
:::


2.javascriptを以下のように記述
```javascript
window.onload = function() {
    //各要素を取得
    const match_result_sentence = document.getElementById('match_result_sentence')
    const match_result_sentence_none = document.getElementById('match_result_sentence_none')
    //属性から値を取り出す
    const match_count = match_result_sentence.getAttribute('data-match-count')
    //値がNoneだった場合の処理
    if(match_count === 'None'){
        match_result_sentence.style.display = "none"; //試合結果の表示を消す
        match_result_sentence_none.style.display = "block"; //試合がない場合のメッセージを表示
    }
}
```
:::note info
`match_result_sentence.getAttribute(取り出したい値)`で値をとりだすことができる。
:::

## 学んだこと
・HTMLのタグに`data-名前='値'`をつけることによりそのタグに値を埋め込むことができる。
・javascriptで`変数名.getAttribute(変数のdata-タグ)`とすることにより、値を取り出すことができる。
・結果として、値に応じてHTMLの要素を動的に表示/非表示にする方法を理解した。

これを応用すれば、Djangoから取得した値に応じて柔軟にUIを変更することができそうだ
【超初心者】コマンドラインツールの呼び出し方

# はじめに
paizaラーニングでPHPをはじめ、WEB開発を独学中です。

＃03:curlコマンドで、Web APIを呼び出そう
https://paiza.jp/works/web_tech/primer/beginner-webtech3/10603
の中で紹介されている

 curl コマンド 使い方メモ - Qiita
https://qiita.com/yasuhiroki/items/a569d3371a66e365316f
↑の記事を読んで疑問に思った箇所について調べた忘備録です。

# コマンドラインツールの呼び出し方

コマンドラインツールを呼び出すためには、まずターミナルやコマンドプロンプトを使用します。OSによって呼び出し方が異なるので、それぞれのOSごとに手順を説明します。
## Windowsの場合
Windowsでは、コマンドラインツールを呼び出すために「コマンドプロンプト」や「PowerShell」を使用します。

### コマンドプロンプトの呼び出し方：
1. 　スタートメニューを開きます。
1. 　検索ボックスに「cmd」と入力し、エンターを押します。
1. 　これで黒いウィンドウが表示されます。これがコマンドプロンプトです。

### PowerShellの呼び出し方：
1. 　スタートメニューを開きます。
1. 　検索ボックスに「powershell」と入力し、エンターを押します。
1. 　PowerShellが起動します。ここでもコマンドを入力できます。

#### `curl` の実行
コマンドプロンプトやPowerShellを開いたら、そこで以下のように `curl` コマンドを入力できます：
```
curl https://www.example.com
```

## macOSの場合
macOSでは「ターミナル」というアプリを使用してコマンドラインツールを呼び出します。
### ターミナルの呼び出し方：
1. 　Finderを開きます。
1. 　アプリケーション > ユーティリティ > ターミナルの順に進みます。
1. 　または、Command + Spaceでスポットライト検索を開き、「ターミナル」と入力してエンターを押します。

これでターミナルが起動し、コマンドを入力できる状態になります。
#### `curl` の実行
ターミナルに以下のように `curl` コマンドを入力します：
```
curl https://www.example.com
```

## Linuxの場合
Linuxでも「ターミナル」を使いますが、ディストリビューション（例：Ubuntu、Fedoraなど）によって若干異なるかもしれません。多くのLinuxディストリビューションにはデフォルトでターミナルがインストールされています。

### ターミナルの呼び出し方：
1. 　アプリケーションメニューから「ターミナル」を探してクリックします。
1. 　または、Ctrl + Alt + T のキーボードショートカットを使ってターミナルを開くことができます。

#### `curl` の実行
ターミナルに以下のように `curl` コマンドを入力します：
```
curl https://www.example.com
```

## 補足：`curl` コマンドのインストール
* Windows では、`curl` はWindows 10以降のバージョンにはすでにインストールされていますが、古いバージョンの場合、別途インストールが必要かもしれません。
* macOS と Linux では、ほとんどの環境で `curl` がデフォルトでインストールされています。

# まとめ
1. WindowsではコマンドプロンプトかPowerShellを使い、macOSとLinuxではターミナルを使ってコマンドラインツールを呼び出します。
1. コマンドラインを開いたら、`curl`などのコマンドを直接入力して実行できます。
Fessでインデックスされた情報をすべて削除する方法

一括削除
システム情報→検索で、
インデックスからすべてのドキュメントを削除したい場合は、「*:*」と入力して検索「このクエリですべてを削除」ボタンをクリック
することで削除されます。 検索条件を指定して対象のドキュメントだけを削除することも可能です。
メール認証を強化する！SPFとDKIMの設定方法ガイド

# はじめに
メールを送信する際、送信者が正しいドメインの所有者であることを証明するための仕組みとして、**SPF**と**DKIM**があります。これらを設定することで、スパムやなりすましメールを防ぎ、送信したメールが正しく届く確率を高めることができます。本記事では、SPFとDKIMの基本的な設定方法と、その重要性について解説します。

# SPFとは？
**SPF（Sender Policy Framework）** は、ドメインのDNSに「このドメインから送信を許可されたメールサーバーはどれか？」を定義する仕組みです。これにより、他のサーバーが偽装してメールを送ることを防ぎます。

# DKIMとは？
**DKIM（DomainKeys Identified Mail）** は、メールにデジタル署名を追加する技術です。署名を検証することで、受信側のサーバーが送信者が偽装されていないことを確認できます。DKIMは、公開鍵暗号方式を使用して送信ドメインの正当性を証明します。

# SPFの設定方法

SPFを設定するには、ドメインのDNSに**TXTレコード**としてSPFポリシーを追加します。以下の手順でCloudflareを使用したSPFの設定を説明します。

## 1. SPFレコードの書き方
SPFレコードは、以下のように記述します。

```txt
v=spf1 a mx include:example.com ip4:xxx.xxx.xxx.xxx -all
```

- **v=spf1**: SPFレコードのバージョン
- **a**: ドメインのAレコードに登録されているIPからの送信を許可
- **mx**: ドメインのMXレコードに登録されているメールサーバーからの送信を許可
- **include**: 外部の送信サーバー（例：Gmail）の認証を許可
- **ip4**: 特定のIPアドレスからの送信を許可
- **-all**: 許可されていないサーバーからのメールを拒否

これにより、送信元の認証が強化され、メールの信頼性が向上します。

## 2. Cloudflareでの設定手順
1. Cloudflareにログインし、SPFを設定するドメインを選択します。
2. 「DNS」タブをクリックし、「Add record」を選択します。
3. 以下のように入力します：
   - **Type**: `TXT`
   - **Name**: ドメイン名（例：`@`）
   - **Content**: `v=spf1 a mx ip4:xxx.xxx.xxx.xxx ~all`
4. 設定を保存します。

これで、SPFの設定が完了です。しばらく時間がかかることがありますが、DNSが反映された後、SPFが正しく設定されているかを確認できます。

# DKIMの設定方法

DKIMを設定するには、公開鍵をDNSに追加し、メールサーバー側で署名の設定を行います。ここでは、Cloudflareでの設定手順を紹介します。

## 1. DKIMの公開鍵の取得
DKIMを設定するために、メールサーバー側で公開鍵と秘密鍵を生成する必要があります。これらの鍵は、メールサーバーの管理画面や`openssl`コマンドで作成できます。

```bash
openssl genrsa -out private.key 2048
openssl rsa -in private.key -out public.key -pubout -outform PEM
```

## 2. 公開鍵をDNSに追加する
公開鍵をDNSの**TXTレコード**として追加します。

### 設定例:
- **ドメイン名**: ドメイン名（例：`@`）
- **セレクタ名**: `default`

## 3. Cloudflareでの設定手順
1. Cloudflareにログインし、対象のドメインを選択します。
2. 「DNS」タブをクリックし、「Add record」を選択します。
3. 以下のように入力します：
   - **Type**: `TXT`
   - **Name**: `<セレクタ名>._domainkey.<ドメイン名>`
   - **Content**: 公開鍵（例：以下の形式）

    ```txt
    v=DKIM1; k=rsa; p=<公開鍵>
    ```
4. 設定を保存します。

---

# SPFとDKIM設定の確認

設定が完了したら、SPFとDKIMが正しく機能しているか確認することが重要です。以下のツールを使用して、SPFとDKIMの設定が正しいか確認しましょう。

- **SPF確認ツール**:
  - [MXToolbox - SPF Lookup](https://mxtoolbox.com/spf.aspx)
  
- **DKIM確認ツール**:
  - [DKIM Core Key Checker](https://dkimcore.org/tools/keycheck.html)
  - [MXToolbox - DKIM Lookup](https://mxtoolbox.com/dkim.aspx)

# まとめ

SPFとDKIMを設定することで、メール送信者のドメインの信頼性を高め、スパムやなりすましメールのリスクを大幅に減らすことができます。正しい設定を行い、定期的に確認することで、安全なメール環境を維持しましょう。

# その地
https://qiita.com/blue_islands/items/287a5a38cd0b8542d742
全てのチェックボックスをチェック、または解除するjs

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>チェックボックス一括切り替えサンプル</title>
    <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; padding: 20px; }
        form { border: 1px solid #ddd; padding: 20px; margin-bottom: 20px; }
        button { margin-bottom: 10px; }
    </style>
</head>
<body>
    <h1>チェックボックス一括切り替えサンプル</h1>
    
    <form>
        <button type="button" class="js-toggleAllCheckboxes">全てのチェックボックスを切り替え</button>
        <br>
        <input type="checkbox" id="item1" name="item1">
        <label for="item1">アイテム1</label><br>
        <input type="checkbox" id="item2" name="item2">
        <label for="item2">アイテム2</label><br>
        <input type="checkbox" id="item3" name="item3">
        <label for="item3">アイテム3</label><br>
        <input type="checkbox" id="item4" name="item4">
        <label for="item4">アイテム4</label><br>
    </form>

    <script>
    function toggleAllCheckboxes(element) {
        const form = element.closest('form');
        if (!form) return;

        const checkboxes = form.querySelectorAll('input[type="checkbox"]');
        const allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked);

        checkboxes.forEach(checkbox => {
            checkbox.checked = !allChecked;
        });
    }

    document.addEventListener('DOMContentLoaded', function() {
        const toggleButtons = document.querySelectorAll('.js-toggleAllCheckboxes');

        toggleButtons.forEach(button => {
            button.addEventListener('click', function() {
                toggleAllCheckboxes(this);
            });
        });
    });
    </script>
</body>
</html>
```
[ChatGPT API] Temperatureの設定で生成に多様性を添える

## これはなに？

このガイドでは、ChatGPT APIの生成に多様性を添えるためのパラメータ「Temperature」について説明する。Temperatureは、生成AIが作成する文章の創造性と予測不能性を調整するためのパラメータであり、この値を変更することで生成される話題や文章の導き方が大きく変わる。

### Temperature

生成する文章の言葉の選択における複雑さを調整するパラメータ。値が低いほどコントロールされた凡庸な文章が作られ、値が高いほど創造性の高い、不確定な言葉が生成される。

## 対象読者

- 生成AIの度合いを控えたい開発者
- テキスト生成の平衡を探している人
- 自然な対話や記事生成に関心のあるAIエンジニア

## ゴール

- Temperatureの基本的な仕組みを理解し、どのように対話に影響を与えるかを例を通して把握する。
- 対話や記事生成において、方向性の控えられた生成か、より創造的な生成かを意図的に選択する方法を学ぶ。

## TL;DR

**Temperature** は、生成される言葉の選択を調整するためのパラメータで、値が低いほど正確性が高く、値が高いほど創造性が高い。これにより、文章の平衡をとることが可能。

## Temperature の使い方

**用途**
生成される文章の創造性や予測不能性を制御するために使われる。たとえば、より正確で一貫性のある話語や記事を生成したいとき、または良い意味で不確定性を加えたいときに便利。

**数値の範囲**

- 値の範囲: 0.0 から 1.0
- 0 の場合、生成は非常に決定論的で、例えば分析や使用する場合に適している。値が高いほど不確定性が高くなり、より創造的で多様な答えが生成される。

**具体例**

- Temperature = 0.2 の場合:\
  「東京は日本の首都です。大きな都市で多くの人々がいます。」\
  （正確さを重視した主要な情報のみを生成）

- Temperature = 0.8 の場合:\
  「東京は活気に満ちた大都市で、豊かな文化、高層ビル、そして伝統と現代の驚くべき融合があります。」\
  （より創造的で複雑な表現）

- Temperature = 1.0 の場合:\
  「東京はネオンの光、隠れた神社、ストリートフード、そして終わりのない発見の渦であり、他にはない場所です。」\
  （極めて創造性が高く、言葉が大きく変わる）

## 参考文献

- [OpenAI API ドキュメント](https://platform.openai.com/docs/api-reference/chat/create#chat-create-temperature)
Terraformの文字列で ${ をそのまま表示したい

Terraformの文字列に`${...}`シーケンスを使うと、式を評価して文字列として設定します。文字列として`${`をそのまま表示したい場合は、どのように設定したら良いのでしょうか？

## 結論
`$`を2つ続けて入力します。
```hcl
"... $${...} "
```


## 文字列補間の基本

Terraformでは、文字列内で変数や式の値を埋め込むために、**文字列補間**（String Interpolation）という機能を使用します。この機能は`${...}`シーケンスを用いて実現されます。

例：

```hcl
locals {
  name = "Sumomo"
}

output "greeting" {
  value = "Hello ${local.name}!"
}
```
この出力結果は次のようになります：

```
Hello Sumomo!
```
この場合、`${local.name}`は`Sumomo`に置換され、出力は`"Hello Sumomo!"`となります。

## ${ をリテラルとして使用する方法

しかし、時には`${`をそのまま文字列として使用したい場合があります。このような場合、**エスケープシーケンス**を使用する必要があります。

Terraformでは、`${`をリテラルとして表現するために、`$`を重ねて`$$`と記述します。

使用方法は以下の通りです：

```hcl
locals {
  name = "Sumomo"
}

output "greeting" {
  value = "Hello $${local.name}!"
}
```

この出力結果は次のようになります：

```
Hello ${local.name}!
```



この結果から、`$${`を使用することで`${`をリテラルとして扱えることが分かります。


## まとめ

Terraformでは`$${`を使用することで、文字列補間とリテラルの`${`を区別し、意図した通りの文字列を生成できます。

## 確認をした環境
- Terraform 1.9.2

## 参考
https://developer.hashicorp.com/terraform/language/expressions/strings#escape-sequences
【基本情報】独学マラソン ページングアルゴリズム Day 8

その人よりもその人のことを理解する姿勢を忘れないこと

:::note worn
この記事は自分用の備忘録です。
:::



# メモリとは
- データを一時保存する場所
- CPUが直接アクセスして、データを素早く取り出せる記憶装置
- メモリ足りないと動作がとっても遅くなるよ
- 自作PC作る時にうまくささってないことが多いやつ
    - 結構勇気いる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/61c311cf-9fbf-3fe6-8f92-cea6f4a040c9.png)

# 仮想メモリとは
- メモリがいっぱいになったとき、データを一時的に保存するために使われる
- 実態はハードディスクだから読み書き速度はメモリよりも遅いので、避難させたデータを使う時はそれなりに重い
    - メモリ増設しなくても増やせるやんラッキーは間違いである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/1a828a09-4556-e638-20a0-bb6f379c91de.png)


# 仮想メモリのページングアルゴリズム FIFO / LFU / LRU
データ（ページと呼ぶ）をメモリに戻したり（ページイン）仮想メモリに入れたり（ページアウト）するときに、「あまり使われてないページはどれなのか」を判別する方法が3つあるらしい

### FIFO (First In First Out)
- 最初にページインしたページを仮想メモリにページアウトさせるよ

### LFU (Least Frequently Used)
- 使われた回数が最も少ないページを仮想メモリにページアウトさせるよ

### LRU (Least Recently Used)
- 最後に使われてから最も時間が経過しているページを仮想メモリにページアウトさせるよ

# 例えば
前提
- ハードディスクのページ構成はA,B,C,Dの4ページ
- メモリは3ページ
- プログラムはA→B→B→C→Aときて、次にDが使われる

### FIFOの場合
- 最初にページインしたのはAなので、Aが仮想メモリに入って、メモリはDに置き換わる

### LFUの場合
- Cが一番使われていないので、Cが仮想メモリに入って、メモリはDに置き換わる

### LRUの場合
- 最後に使われてから一番時間が経っているのはBなので、Bが仮想メモリに入って、メモリはDに置き換わる



# 感想
仮想メモリをいくら増やしても処理が全然軽くならなくて「おかしいなぁ」と謎だったのが今更理解できた


# 参考

https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/mastering_tech/fifo_lfu_lru/
ubuntu でapache2を動かして動画サーバーにする、他に  mouseポインタサイズ


## 1) apache2 動画サーバー

```


./comment-out.bat /etc/apache2/apache2.conf 
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>
<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>
<Directory /var/www/>   ###################################★
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
	Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf







# du /var/www/
16	/var/www/html
20	/var/www/



# mount /dev/sda1 /ma1


# ls /ma1/html/douga/
マ.mp4   ニ.mp4  



ln -s /ma1/html/douga/  /var/www/html/douga


systemctl restart apache2

```

これにて　スマホから

![１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/185785b3-cd93-a16e-8ab5-a079fe425e0f.jpeg)





## 2） 　マウスのサイズを大きくする

「設定」＞「アクセシビリティ」

![Photo Marker_20241008_081107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/898cc6d6-221c-10ac-4834-0d7109cfa479.jpeg)





## 番外

自分は　夢をみる
その夢を現実と思っている
しかし
夢の中で　更に夢をみることはできない

|ちょうど仮想pcから更に　仮想化ができないのと　おんなじかな？|
|:---
|明菜　夢の中でさらに夢の中へいってみたいとおもいませんか〜

https://www.youtube.com/watch?v=gpJVylGN1gY&list=PLfw_M-2Kl7rDjH33EoIGuGmMRjrYGFAV_
特殊文字の扱い



+ [How to delete records with special characters?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifvqu)

消せないらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/15382862-8ca6-c1f4-d662-30901749e199.png)

:::note
Maybe the encoding is not UTF-8

3.Encode Special Characters: Use the percent encoding format (%XX), where XX is the hexadecimal code of the special character. You can find online tools or resources to help you convert the special character to its hexadecimal code.

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

# 000000000000000AAAの扱い

+ [エクスポートサービスで抽出したAccount IDについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KAojf)

:::note
Idの先頭3桁でオブジェクトを特定できます。000はEmptykeyみたいですね。

 Salesforce Empty Key Id - 000000000000000AAA

https://www.fishofprey.com/2011/06/salesforce-empty-key-id.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f26136d4-efce-862b-2f85-151d7008977b.png)

https://www.fishofprey.com/2011/09/obscure-salesforce-object-key-prefixes.html#google_vignette

Salesforceの内部側の値みたいでです。

Apexなら Nullで指定しておけばこのIdを使用しないでOKみたいですが、

Java Script(おそらくデータローダもこれ）はこの値になるようなことが解説されています。

どうしてこのような仕様なのかは私では分からないです

Force.comで参照項目無しの場合に指定するID文字列

https://salesforce.stackexchange.com/questions/115978/empty-key-random-string-on-export
:::
Salesforce の「すべてのデータの表示」権限のみを選択した場合に使用できないオブジェクトはどれですか?



+ [Which objects are not available when you select only the View All Data permission for Salesforce?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ervxF)

Salesforce カタログ ソースに対して「すべてのデータの表示」権限のみを選択した場合、次のオブジェクトを抽出することはできません。

+ CategoryData
+ ContentDocumentSubscription
+ ContentNotification
+ ContentTagSubscription
+ ContentUserSubscription
+ ContentVersionComment
+ ContentVersionRating
+ ContentWorkspaceSubscription
+ CorsWhitelistEntry
+ EmailCapture
+ FeedPollChoice
+ FeedPollVote
+ OrgDeleteRequest
+ OrgDeleteRequestShare
+ PlatformStatusAlertEvent
+ PromptAction
+ PromptActionShare
+ PromptError
+ PromptErrorShare
+ SetupAssistantStep
+ TopicUserEvent

「すべて表示」権限と「すべて変更」権限には違いがあります。詳細については、以下の記事を参照してください。すべてのタイプの統合に API ユーザーを使用することをお勧めします。


+ [“View All” and “Modify All” Permissions Overview](https://developer.salesforce.com/docs/atlas.en-us.securityImplGuide.meta/securityImplGuide/users_profiles_view_all_mod_all.htm)

+ [ユーザプロファイル権限の説明](https://help.salesforce.com/s/articleView?id=000386319&type=1)
Azure Stack HCIで適用可能な更新プログラムを確認する

# 本記事について
久しぶりにAzure Stack HCIクラスターを起動していたところ正常性アラートで適用可能な更新があるとの通知メールが届きました。
これまでAzure Stack HCIでの新しい更新のリリースは能動的に検知できないと思っていたのですが、
いつの間にか通知機能が提供されたのか、これまで自分の環境で動作できていなかったのか・・・。
ということで、適用可能な更新プログラムの通知機能を確認してみたいと思います。

# 適用可能な更新プログラムが通知される仕組み
## 概要
適用可能な更新プログラム提供の通知はAzure Stack HCIの正常性アラート機能で提供されていました。
正常性アラート機能はAzure Monitorのアラート処理ルールを設定することでメール通知等を設定できます。

正常性アラートではクラスターのヘルスサービスが検知したアラートを検出するようです。

## ヘルスサービス
ヘルスサービスは既定で有効化されており、クラスターグループ"SDDC Management"に属する
クラスターリソース"Health"によって管理されています。

ヘルスサービスが検知する障害情報はこちらにリストされていますが、
現時点では適用可能な更新があることに関する情報は記載がないようです。
ちなみに更新の通知における"FaultType"は"Microsoft.Health.FaultTyle.Cluster.UpdateAvailable"という名前で検知されていました。
[Microsoft Learn | ヘルスサービス　エラーの表示](https://learn.microsoft.com/ja-jp/azure-stack/hci/manage/health-service-faults#coverage)

# 更新プログラムの通知情報
## メール
アラート処理ルールでメール通知を設定していると以下のメールが飛んできました。
例によって英文のメールにはなりますが、メール件名と本文から対象のクラスターと適用可能な更新プログラムが存在することが読み取れる内容です。
Azure Monitorのアラートで設定できる重大度は警告（Severity 2）になっています。
![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/72b8ad0b-dcb9-120c-80bc-1135e5406583.png)

## Azure Portal
Azure PortalではクラスターのAlerts画面とAzure Monitorのアラート一覧で確認できます。
こちらの情報をもとにアラートメールが飛んでいますので、基本的にはメールと同じ内容が表示されています。
![portal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/735c7063-48ad-e94b-0d5e-9f9957c603c6.png)

## サーバノードでの確認
サーバノードではGet-HealthFaultコマンドを実行することでヘルスサービスが検知している情報が確認できます。
"Minor failure"扱いで適用可能な更新があることがこちらでも確認できます。
![get-healthfault.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/2c2a607f-c83b-dc81-81d9-01728d8b5eaf.png)

また、サーバノード上のイベントログでは"Microsoft-Windows-Health/Operational"にEvcen ID: 8496として障害情報が５分おきに出力されています。
こちらに障害情報として適用可能な更新があることが出力されています。
![eventlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481267/db363d73-9892-08ea-6d81-66ca1a63bac7.png)

# まとめ
Azure Stack HCI 23H2では毎月の品質とセキュリティ更新、約四半期ごとのベースラインビルドの更新が提供されています。
今回確認したように適用可能な更新の有無はヘルスサービスにて検知され、Azure Monitorの仕組みで発報できることが確認できました。
Go言語のプログラムの中でJavaSciptを実行する方法

# はじめに

TWSNMPシリーズを開発している時、Go言語で開発したプログラムの中でユーザーが入力した何等かのスクリプトを実行して結果をGo言語側に戻した場面がありました。
その時使ったottoというパッケージ

https://github.com/robertkrimen/otto

の紹介です。


# インストール

```terminal
$ go get github.com/robertkrimen/otto/otto
```

# サンプルプログラム

ottoのGitHUBのトップページにあるサンプルを、まとめて実行可能にしたものです。

```go:main.go
package main

import (
	"log"

	"github.com/robertkrimen/otto"
)

func main() {
	// JavaScript仮想マシンの作成
	vm := otto.New()
	// スクリプトの実行
	vm.Run(`
			abc = 2 + 2;
			console.log("The value of abc is " + abc); // 4
	`)
	// 変数をGo言語からJavaScriptに渡す
	vm.Set("def", 11)
	vm.Run(`
			console.log("The value of def is " + def);
			// The value of def is 11
	`)
	// 文字列変数の場合
	vm.Set("xyzzy", "Nothing happens.")
	vm.Run(`
			console.log(xyzzy.length); // 16
	`)
	// JavaScriptの実行結果をGo言語で受け取る
	value, _ := vm.Run("xyzzy.length")
	{
		// value is an int64 with a value of 16
		l, _ := value.ToInteger()
		log.Println(l)
	}
	// エラー処理
	value, err := vm.Run("abcdefghijlmnopqrstuvwxyz.length")
	if err != nil {
		// err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined
		// If there is an error, then value.IsUndefined() is true
		log.Println(err, value.IsUndefined())
	}
	// 関数の登録
	vm.Set("sayHello", func(call otto.FunctionCall) otto.Value {
		log.Printf("Hello, %s.\n", call.Argument(0).String())
		return otto.Value{}
	})
	vm.Set("twoPlus", func(call otto.FunctionCall) otto.Value {
		right, _ := call.Argument(0).ToInteger()
		result, _ := vm.ToValue(2 + right)
		return result
	})
	// 関数の実行
	result, _ := vm.Run(`
    sayHello("Xyzzy");      // Hello, Xyzzy.
    sayHello();             // Hello, undefined

    result = twoPlus(2.0); // 4
`)
	log.Println(result)
}

# 実行結果

```terminal
$go run main.go
The value of abc is 4
The value of def is 11
16
2024/10/08 07:16:54 16
2024/10/08 07:16:54 ReferenceError: 'abcdefghijlmnopqrstuvwxyz' is not defined true
2024/10/08 07:16:54 Hello, Xyzzy.
2024/10/08 07:16:54 Hello, undefined.
2024/10/08 07:16:54 4

```

# 余談

TWSNMP FC/FKではポーリングの結果を判定するために使っています。
Go言語の処理で取得した値をJavaScriptの変数に渡して判定しています。gNMIのように取得した値がJSONの場合には、otto側でパースできるので便利です。

![2024-10-08_06-23-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/dd31852e-cf10-b03c-cf6e-d7d026a55cd8.png)

のような感じです。

この機能で、より複雑な判定ができるようになっています。
ファイルのプレビュー


+ [ファイル共有アーキテクチャがレコードに対してどのように機能するかご存知ですか?](https://qiita.com/Keiji_otsubo/items/195755c2a34391e1f8f6)
+ [コンテンツファイルのプレビューの問題](https://qiita.com/Keiji_otsubo/items/cc85696b3a3105840305)

# プレビュー

+ [全てではないのですが一部のエクセルにてSalesforce上でプレビュー表示をすると一部、欠損が発生する場合があります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqItb)

:::note
以下の場合はうまく機能しないようです。

 

Excel:

+ 特殊な書式 (複雑な表、埋め込みグラフ、影など)。
+ 非表示の列または行。
+ 不必要にデータセットを超えて拡張される表またはセルの書式。
+ 数式

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

+ [添付ファイルのプレビューが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ervxA)

これを試しても解決しない

+ [スキャンされた PDF のプレビューに関する問題の解決](https://help.salesforce.com/s/articleView?id=000382573&type=1)

:::note
PDFファイルにはプレビューで表示できない細かい制限があるようです。

英語のヘルプは先程までは開いていたのですが、日本語にしようとしたら全く機能しなくなりました。

PDF:

Large numbers of pages. Exact number is dependent on their content but if the count is high (100+) it may cause the preview generation process to timeout.

Note: The number of pages generally has more impact on preview generation than actual file size. Although the file may be under the recommended 25 MB limit, the process may not be able to generate a preview.

A large number of shapes may cause the file to be too complex to render.
Check boxes or interactive forms do not always render properly in preview mode.
Scanned documents with multiple shading gradients and complex shapes.
Dynamic/Interactive PDF such as XFA PDF cannot be previewed in All interfaces and thus is not supported. This type of file needs to be downloaded by you in order to view it properly.
 

https://help.salesforce.com/s/articleView?id=000387545&language=en_US&type=1

プレビューで表示できないPDFの場合はどうしようもないので一旦PCに保存してPDFを表示できるツールで見るしかないと思います。

使ったことは無いですが、ブラウザの拡張機能も利用できるかもしれません

[PDF Viewer](https://chromewebstore.google.com/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm?hl=ja&pli=1)
Insufficient Permissions "Activities" component



+ [Insufficient Permissions "Activities" component - and YES, default Activities View = Activity Timeline, other ideas?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Sq5Q6)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/daf9e723-b1ce-f219-941b-d1210dd30221.png)

:::note
Found the answer - there is a second setting under your Profile: 

Why is my activity timeline not showing in Salesforce?

Click on your avatar or picture to View Profile. Select Settings. Under Display & Layout, click Record Page Settings. Select Activity Timeline as your Default Activities View.
:::

+ ["Activity" and "Task" is gone..](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ig65Q)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/add5b38c-0936-47ab-fa99-4f2a32e21e12.png)
Route 53でのドメイン取得と、ACMで証明書発行するときの詰まりどころ。

## はじめに

Route 53でドメインを取得し、ACM(AWS Certificate Manager)で証明書をプロビジョニングするときに私が詰まったところをまとめおきます。

今回は特に基礎的なところですが、「同じ落とし穴に落ちないように、次の人のために穴を埋める」ことは大切なので記事にしました！

## Route 53でのドメイン取得

### ドメインの検索には「最上位ドメイン (TLD) 」を含める。

ドメインの末尾のところ（`.com`）によってドメインの維持費が異なるので、安いドメインを買いたいな〜と思って、ドメイン名の一部だけを検索しても、狙った最上位ドメインが出てこない場合があります。

例えば、2024/10時点で一番安い`.click`ドメインが欲しい場合。

`hogehoge202410123`のように検索しても、
![スクリーンショット 2024-10-08 4.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/3cd9197f-0ad0-60e9-d29d-26eab6aa3abd.png)

欲しい`.click `ドメインの候補はでませんでした...

![スクリーンショット 2024-10-08 4.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/08d35401-b986-f2f1-744c-eafe77164024.png)

こういったケースは最上位ドメインを含めて検索すると良いです！
![スクリーンショット 2024-10-08 4.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/7855b118-2310-e39d-5b64-1cf12ff40a49.png)

![スクリーンショット 2024-10-08 4.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/680b7d82-69ab-0184-cd78-7511d24a743c.png)

記事にしているときに気付きましたが、最上位ドメインを省略すると、自動で`.com`が付与されている模様。

## ACMでの証明書プロビジョニング

### CNAMEレコードは手動で登録しなくてもいいよ！

ドメイン所有者であることの証明のために、CNAMEレコードの登録が必要ですが、手動で設定する必要はなく、ボタン一つで登録できたりします。

![スクリーンショット 2024-10-08 4.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/5088b7ca-b9ef-5649-11cc-4e4a30d4918f.png)
### 時間かかる場合があるよ。

昨日証明書のステータスが`発行済み`になかなかならず、1時間くらい苦戦しましたが、結局諦めて放置していれば、4時間後くらいに`発行済み`になっていました。

これまで何度か別会社のドメインでプロビジョニングしたときは数分で`発行済み`になっていた経験が邪魔してしまいました。

最大72時間検証してくれるので、72時間経過し、タイムアウトした場合は何か手順の不備があると考えてよさそうです。

時間がかかる原因はCNAMEの反映に時間がかかっていることが原因の模様で、反映の確認はそれぞれ`dig` `nslookup`コマンドで確認可能です。

* Mac/Linux
~~~console
$ dig +short _867f5f30655f04455bb2905tea23b69902.xxx.click
~~~

* Windows
~~~console
nslookup -type=TXT _867f5f30655f04455bb2905tea23b69902.xxx.click
~~~

## まとめ

基礎的な内容なことでしたが、もしお役に立てれば嬉しいです！