OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPT有＋DALL-E3】生成画像がふたつ出る。それに品質が悪い。


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

　今回は、たまに生成画像が、ふたつ出てくることを話題にします。対処方法も書きますよ。

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

　まずは、
　　ChatGPTのニュースから。

　プラグインが
　　なくなります。
　　　使われていた方は
　　　　注意をしておいてください。

　まず、
　　画面上部の
　　　GPT-3.5とGPT-4を
　　　　切り替えるところから
　　　　　項目が削除されました。

　そのため、
　　新たなセッションでは
　　　プラグインが
　　　　使えなくなりました。

　プラグインを
　　使っていたセッションでは
　　　まだ使えるそうです。

　ただ、それも
　　４月９日まで
　　　という制限があります。

　そして、
　　４月９日以降には、
　　　利用できなくなります。

　プラグインの多くは
　　GPTsに移行の対応を
　　　済ませているそうです。
　　　　そちらをご利用ください。
***
　本題です。

　たまに画像が二枚、
　　生成されてきます。

　品質が良ければ
　　ありがたいのですが、
　　　ガクンッと音がするくらい
　　　　質が落ちます。

　若い女性が
　　おばちゃんに
　　　なったりw

　最初のころの
　　DALL-E3は
　　　四枚の画像を
　　　　出力していました。

　それが二枚になり、
　　一枚になったのです。

　それが
　　忘れたころに
　　　二枚で出てくるわけです。

　これは
　　一種のハルシネーションか
　　　あるいはDALL-E3が
　　　　飽きてきてのものなのか……

　ともかく、
　　品質の悪い画像を出されても
　　　お金を出しているのですから
　　　　気分が悪いですよね。
***
　実は、
　　内部にプロンプトがあって、
　　　そこに画像は一枚だけに
　　　　するように書かれています。

　“n=1”と。

　これをそのまま
　　こちらのプロンプトの最後に
　　　書けば、二枚描画は
　　　　されなくなるわけです。

　まぁ、
　　これを書かなくても、
　　　二枚出てきたら、
　　　　リトライすれば
　　　　　いいだけの話
　　　　　　なんですけどねw

　でも
　　二枚出したくない人は
　　　必ず追記するようにしましょう。
　　　　単語登録をしておけば
　　　　　入力の手間が減りますよ。

（2024/03/23 n=1と指定しても）
（二枚出ることもありました。🙇）

***
　ちなみに、
　　ただ“n=1”と入れて送信すると、
　　　“なっていませんでしたか。
　　　　　失礼しました”的な
　　　　　　メッセージを
　　　　　　　出してきます。

　セッションはじめは
　　n=1が有効になっていますから
　　　セッション全体にこれで、
　　　　という感じには
　　　　　ならないので、
　　　　　　都度指示する
　　　　　　　必要があるでしょう。

　それから
　　“nが画像数ならば、多くすれば”と
　　　考えるかと思いますが、
　　　　一枚の出力になります。

　画像を生成（n=2）してから、
　　今のnは
　　　いくつかを
　　　　尋ねました。

　生成画像は
　　ひとつだけでした。
***
***user***
n=?

***ChatGPT***
（和訳）
DALL-E で画像を生成する場合、パラメータ `n` は与えられたプロンプトに基づいて生成する異なる画像の数を指定します。 例えば `n=2` と設定すると、DALL-E は同じプロンプトに基づいて 2 種類の画像を生成するように指示します。

***user***
でも、一枚しか描画されませんでした。

***ChatGPT***
（和訳）
誤解を招いたことをお詫びします。 画像を2枚（`n=2`）要求したにもかかわらず、生成された画像は1枚だけでした。 これは画像生成プロセスの制限によるものかもしれません。 通常は、要求された枚数の画像が生成されるはずです。 今後のリクエストでは、この点に正しく対処するようにします。 より多くの画像が必要な場合は、1枚ずつ生成するか、指定された枚数で再試行します。

***user***
では、二枚描画して

***ChatGPT***
（やっぱり一枚）
***

　やはり
　　DALL-E3側でも
　　　制限しているようですね。

　それでも
　　たまに二枚出てくるのは
　　　DALL-E3のバグ的なもの
　　　　かもしれませんね。

　もともとは
　　四枚だったものが
　　　二枚になって……
　　　　それがDALL-E3の中のどこかに
　　　　　残っているのでしょう。
***
　本記事が
　　みなさんの
　　　作品制作の糧に
　　　　なれば、幸いです。

　今回は、ここまで。
（ぴえん）Excelの自動保存ファイルをうっかり消してしまうので自動バックアップする

PCが予期せぬシャットダウンをした時など、Excelは自動保存ファイルから回復してくれる機能があり便利ですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/cbe75b86-5293-feaa-f1ac-ec984c60e63e.png)

でもたまにやってしまうのですが、「自動回復しますか？」ウインドウをうっかり閉じてしまって、「回復できない！ぴえん！」というシーンです（私だけでしたらすみません）。

今回はその自動回復ファイルを自動バックアップしようという件になります（ややこしい）。

# スクリプト

1分おきにC:\Users\＜ユーザー名＞\AppData\Roaming\Microsoft\Excelの中にあるファイルを、Dドライブに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/941489cb-1783-6da4-a767-48722e134013.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d295d54c-e202-9948-1e5b-c89f8c1f6e4d.png)


```.ps1
$sourceFolder = "$env:USERPROFILE\AppData\Roaming\Microsoft\Excel"
$destinationFolder = "D:\Excel Auto Backup"
$excelFiles = Get-ChildItem -Path $sourceFolder -Filter "*.xlsx"
$logFilePath = Join-Path -Path $destinationFolder -ChildPath "backuplog.txt"

foreach ($file in $excelFiles) {
    $timestamp = Get-Date -Format "yyyyMMdd HH:mm:ss"
    $backupActivity = @()

    $sourceFilePath = $file.FullName
    $destinationFilePath = Join-Path -Path $destinationFolder -ChildPath $file.Name
    if (Test-Path -Path $destinationFilePath) {
        if ((Get-FileHash -Path $sourceFilePath).Hash -ne (Get-FileHash -Path $destinationFilePath).Hash) {
            Copy-Item -Path $sourceFilePath -Destination $destinationFilePath -Force
                $activity = " '$($file.Name)' は上書きバックアップされました。"
                $backupActivity += $timestamp + $activity
        }
        else {
                $activity = " '$($file.Name)' は変更がなかったのでバックアップされませんでした。"
                $backupActivity += $timestamp + $activity
        }
    }
    else {
        Copy-Item -Path $sourceFilePath -Destination $destinationFilePath
                $activity = " '$($file.Name)' 新しいバックアップが作られました。"
                $backupActivity += $timestamp + $activity
   }
       $backupActivity | Out-File -FilePath $logFilePath -Append

}
```
# 手順
1. 上のPS1スクリプトをドキュメントフォルダなどに保存します。

2. タスクスケジューラに登録します。以下のコピペでOKです。
```.ps1
$scriptPath = "$env:USERPROFILE\Documents\ExcelBackup.ps1"
$taskName = "ExcelBackupTask"
$taskDescription = "3分おきにExcelをバックアップ"
Register-ScheduledTask -TaskName $taskName -Action (New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument "-File `"$scriptPath`"") -Trigger (New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 3) ) -Description $taskDescription -User "SYSTEM"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/95eb2a55-a054-9a9a-4ba7-de59fdaad58f.png)

# 結果のイメージ
ログも同じフォルダに出力されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/98530e8a-dcdc-c30d-0c3c-69d742d40ac0.png)

# 注意点
・自動回復ファイルは、Excelを開きなおしたときに初めて生成されるようで、すぐに消してしまうと1分もないのでバックアップが間に合わないかもしれません。
・PCのパフォーマンスに影響がなければタスクを5秒おきとかにすればよいと思います。（New-TimeSpan -Seconds 5）
・5秒のタスクを24時間回すのが気になる場合は、「Get-ProcessでExcelプロセスが存在した場合に初めて実行する」スクリプトにしても良さそうです。
nohupを用いてstreamlitをバックグラウンドで動かしていたらIDが迷子になった！時の対処法

# 「nohupを用いてstreamlitをバックグラウンドで動かしていたらIDが迷子になった！時の対処法」

こんにちは、すぎもちです。今回は、バックグラウンドで`streamlit`アプリを動かす際に`nohup`コマンドを使用しているときに起きがちな問題、それは「プロセスIDがわからなくなった！どうしよう？」という状況の対処法について、備忘録として残しておきたいと思います。

### 問題の発生

`streamlit`を含む様々なアプリケーションをバックグラウンドで動かしておきたいとき、私たちはしばしば`nohup`コマンドを利用します。例えば、こんな感じで：

```bash
nohup streamlit run app.py &
```

このコマンドは、ターミナルが閉じても`streamlit`アプリが止まらないようにしてくれます。非常に便利ですが、問題が一つ。ターミナルを閉じたり、PCを再起動したりすると、「あれ、動かしていたあのアプリ、どうやって止めればいいんだっけ？」という状況に陥りがちです。

特に、`streamlit`のようにポートを占有して動作するアプリケーションの場合、新たにアプリを起動しようとすると「そのポートは既に使用されています」というエラーに遭遇することがあります。そんな時に、バックグラウンドで動いているアプリのプロセスID（PID）を見失ってしまっては、対処が難しいですよね。

### 対処法

では、バックグラウンドで動いている`streamlit`のプロセスIDをどうやって見つけ出すのか。解決策は、実にシンプルです。

ターミナルで以下のコマンドを実行します。

```bash
ps ax | grep streamlit
```

これにより、現在実行中の`streamlit`プロセスの一覧が表示されます。表示された情報の左側にある数字が、そのプロセスのIDです。

例えば、こんな出力があったとしましょう。

```bash
12345 pts/1    S      0:00 nohup streamlit run app.py
```

この場合、`12345`がプロセスIDになります。これを知った上で、以下のコマンドでプロセスを終了させることができます。

```bash
kill 12345
```

これで、バックグラウンドで動かしていた`streamlit`アプリを無事に終了させることができます。

### まとめ

`nohup`で`streamlit`をバックグラウンドで動かしているときに、プロセスIDを見失った！という状況に陥った際は、`ps ax | grep streamlit`コマンドが非常に役立ちます。この備忘録が、同じような状況に直面した方の一助となれば幸いです。

皆さんの開発生活が少しでも楽になることを願っています。それでは！
AレコードとCNAMEレコード使い分けと注意点

## Aレコードとは

ホスト名とIPアドレスを直接関連付けるために使用する。
Aレコードにホスト名とIPアドレスを記載することで、WEBサイトのドメイン名とWEBサーバのIPアドレスのマッピングが可能となる。

所謂名前解決と呼ばれるものである。
IPv4ではAレコード、IPv6ではAAAAレコードと使用するレコードが異なる。
クライアントから対象のWEBサーバのIPアドレスに接続するためには、Aレコードに記載したホスト名を指定する。

|  | NAME | CLASS | RDATA |
|:-:|:-:|:-:|:-:|
| 1  | example.com.  |  IN A |  192.0.2.1 |

## CNAMEレコードとは
DNSレコードの1つ。ドメインの別名を接続先のドメイン名に関連付けるために使用する。
別名を複数設定することができ、それらを接続先のドメインにリダイレクトできる。あらかじめAレコードを設定する必要がある。

|  | NAME | CLASS | RDATA |
|:-:|:-:|:-:|:-:|
|1   |example.com.   | IN A  | 192.0.2.1  |
| 2  |rep1example.com.   | IN CNAME  |example.com.   |
|   3|rep2example.com.  | IN CNAME  |example.com.   |


### CNAMEレコードを使用するメリット
サーバ更改などでホスト名を変更するとき切り替えが容易になる。
Aレコード（ホスト名）を直接指定すると、接続元でホスト名を記載したプログラムや設定ファイルを全て改修しなければならない。
CNAMEレコードを使用することで、接続元で記載している別名をそのまま使用でき、Aレコードのホスト名やCNAMEレコードのホスト名を変更することで対応できる。


## 注意点
CNAMEレコードで指定したドメインに対して、MX（メール交換）レコードやNS（ネームサーバ）レコードで同じドメインを指定することはセキュリティの観点から避けるべき。
例えば1つの物理サーバでWEBサイト、DNS、メールを運用するとき、以下のようにレコード間で同じドメインを指定することがある。



**良くない例**
|  | NAME | CLASS | RDATA |
|:-:|:-:|:-:|:-:|
|1   |example.com.   |IN NS   |dns.example.com.   |
|2   |example.com.   |IN MX 10  | mail.example.com.  |
|3   |dns.example.com.   |IN A   |192.0.1.2   |
|4   |mail.example.com.   |IN CNAME   |dns.example.com.   |
|5   |rep1example.com.   |IN CNAME   |dns.example.com.   |


上記の良くない例だと、外部のDNSから対象ホストのIPアドレスを検索できない可能性があり、トラブルの元となる。
以下のように、MXやNSに設定するホスト名に対し、AレコードでIPアドレスを設定することでトラブルを防げる。

**良い例**
|  | NAME | CLASS | RDATA |
|:-:|:-:|:-:|:-:|
|1   |example.com.   | IN NS  |dns.example.com.   |
|2   |example.com.   |IN MX 10   |mail.example.com.   |
|3   |dns.example.com.   |IN A   |192.0.1.2   |
|4   |mail.example.com.   |IN A   |192.0.1.2   |
|5   |rep1example.com.   |IN CNAME   |mail.example.com.   |





### 参考文献
[AレコードとCNAMEレコード](https://academ-aid.com/qualif/ipa/dns-record)
[CNAMEレコードの注意点](https://www.ntt.com/business/services/network/internet-connect/ocn-business/ocn/customer/set_up/dns_12.html)
Windows上Subline Text3 javascript実行させる

概要
---
Subline Text3上で、.jsファイルをビルド実行させる方法を説明します。

Node.js を[インストール](https://nodejs.org/en/download)
---

- Node.jsバージョンなど選択してダウンロードします。
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/e1455de1-4e3f-a360-343b-b5c87a97e2de.png)
- ダウンロードしたファイルをクリックして、インストールします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/be16a9ea-c3f9-6c27-8d59-5d3926bb63d7.png)
- ライセンス同意して次のボタン押して、インストールまで進みます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/a125b875-0a82-5efe-2074-69452defb5e1.png)

- インストールが終わったら、正常にインストールされているかを確認します。
- まず、Windows スタートボタンを右クリックし、メニュから Windows PowerShell起動します。
 ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/6c3e2e4b-6141-e424-e229-1f66c6f5fe38.png)
 - 次は node --version を入力して、正常にバージョン番号が出てきたら問題ありません。
 ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/35138958-f8c9-8f04-b946-9a8cf7a0e3eb.png)

Subline TextからNode.Jsパッケージをインストールと設定
---

- Package Control : Install Package からNodejsを入力してインストールします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/b118e9da-1e80-8b41-dcba-e05d9f832a46.png)

- ツール -> ビルドシステム から Node.Jsが選択できますので、選択します。
- C:\Users\名前\AppData\Roaming\Sublime Text 3\Packages\Nodejsフォルダにある **Nodejs.sublime-build**のwindows設定の部分を次のように編集します。

      略...
      "windows": {
           "shell": true
      }
      略...

- jsファイルで console.log("ありがとう！"); コードをビルド実行して問題なかったら完成です。文字化けなどのが起きたら、次の対応をします。

Subline Text日本語文字化けに対応
---

- Package Control : Install Package からjapanizeを入力してインストールします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159490/f15c02ea-94fc-c2f2-b3ea-15bf79a98f2f.png)

適用手順  
- ...\Sublime Text 3\Packages\Japanizeにインストールされている*.jpファイルを、...\Sublime Text 3\Packages\Default にコピーします。**※Defaultフォルダがない場合は作成してください。**

- コピーしたファイルをオリジナルのファイル（.jpが付かないファイル）と置き換えます。（念のため、オリジナルのファイルが有る場合は.orgなどを付けて保管しておきましょう。）  
- ...\Sublime Text 3\Packages\Japanize\Main.sublime-menu（.jpが付かない方）を、...\Sublime Text 3\Packages\User にコピーします。すると、他のプラグインで上書きされてしまっているトップメニューも日本語化されます。

**注: ちゃんと反応しない場合、Subline textを再起動したりして、やり直してみてください！。**


参考
---
[Windows 10へNode.jsをインストールする](https://qiita.com/echolimitless/items/83f8658cf855de04b9ce)
[Node.jsとSublimeText3を連帯させたい](https://nekotheshadow.hatenablog.com/entry/2015/01/12/125410)
[テキストエディタ「Sublime Text3」でプログラミング 日本語文字化け](https://www.pictbio.com/tips/1416.html)
Kubernetes: kubectlで環境変数をセットしたり削除したりする方法

Kubernetesでは、`kubectl` コマンドラインツールを使用して、デプロイメントに環境変数を設定したり、既存の環境変数を削除したりすることが可能です。

本稿では`kubectl set env`を使ってデプロイメントの環境変数を操作する方法を紹介します。

## 1. デプロイメントの作成

まず、検証用にサンプルとしてnginxのデプロイメントを作成します。

```bash
kubectl create deployment nginx-deployment --image=nginx
```

このコマンドは、`nginx` イメージを使用して `nginx-deployment` という名前のデプロイメントを作成します。

## 2. 環境変数の設定

次に、デプロイメントに環境変数を設定します。

```bash
kubectl set env deployment/nginx-deployment FOO=1 BAR=2
```

この操作により、`FOO` と `BAR` という2つの環境変数がそれぞれ値 `1` と `2` で設定されます。

## 3. 環境変数の一覧表示

設定された環境変数を一覧表示して、設定が正しく行われたことを確認します。これも`set env`ででき、`--list`オプションを伴わせます。(`set`なのに`get`できるところが直感と反しますが、一応これが表示機能となっています)

```bash
kubectl set env deployment/nginx-deployment --list
# Deployment nginx-deployment, container nginx
FOO=1
BAR=2
```

## 4. 環境変数の削除

不要になった環境変数を削除します。以下の例では、`FOO` 変数を削除しています。

```bash
kubectl set env deployment/nginx-deployment FOO-
```

よく見てほしいのですが、環境変数名の後ろにマイナス`-`がついています。これが削除するという意味になります。

削除後、環境変数を再度一覧表示して、削除が反映されていることを確認します。

```bash
kubectl set env deployment/nginx-deployment --list
# Deployment nginx-deployment, container nginx
BAR=2
```

## 5. デプロイメントの削除

最後に、検証用に作成したデプロイメントを削除します。

```bash
kubectl delete deployment nginx-deployment
```

## 注意点

ここで紹介した方法は、`spec.template.spec.containers[].env` の内容を操作するものであり、`envFrom` を使用して設定された環境変数には影響を与えません。`envFrom` は、環境変数をコンフィグマップやシークレットから一括で設定するための機能です。
クエリシリーズ > 連想配列

https://paiza.jp/works/mondai/query_primer/query_primer__map_easy

辞書をつかった問題だと直感してたのだけど、自分自身ちょっと忘れてたので前に書いた記事にコメントくれてたのを思い出したので下記で復習（ありがとうございます）

https://qiita.com/Atsulabo/items/081ef794c729bb6709e6

辞書を作るにはdict。これ勉強。
これを思い出す前に{}の内包表記でなんとかしようとしてました。。。
というわけで、

```py
N,K = map(int,input().split())
A =  dict(input().split() for _ in range(N))
#次の連想配列のために出力
#{'1': 'Sin', '2': 'Sakura', '3': 'Kayo', '4': 'Yui'}
for _ in range(K):
    print(A[input()])
```

こうですね。
しかしですね、今回は辞書、ではなく連想配列。なので、
ちょっと違うんですね。。。
あれ、連想配列って辞書だよね？たしかエクセルでマクロやってたときもそう学んだはず。。。。
でも解答見る限り、タプルと集合？ですね。。。
出力がちょっと上のと違います。
なのでこの場合出力には工夫が必要ですね。

```py
#違う書き方
roster = {(x, y) for x, y in [input().split() for _ in range(N)]}
#でもちょっと違う出力になる
#{('3', 'Kayo'), ('4', 'Yui'), ('1', 'Sin'), ('2', 'Sakura')}
```

ちょっと私流で書き直してみます
でもあんまりかわらんな。

```py
N,K = map(int,input().split())
A =  {(x, y) for x, y in [input().split() for _ in range(N)]}
for _ in range(K):
    q = input()
    for num, ID in A:
        if num == q:
            print(ID)
```

できれば次までいきたかったけど、時間なのでこれまで。
超基本のエラー対処法

# はじめに

「うまく動かない」時、僕が普段意識しているであろうことを書き連ねていきます。

Railsを中心に説明（雑）をしていきます。よろしくお願いします。

# とにかくログに出す！

Railsだと`p`あるいは`puts`メソッドを使い、変数やリクエストやらをログに出力します。

`p`と`puts`の違いは基本気にしなくていいです。うまくいかないときはもう片方を使ってください。そのうち慣れます。

```rb
puts "---------------"
puts arg # 変数
puts "---------------"
```

こんな感じで書くと見やすいです。

# とにかくログを読む！

## どこを見るの？
ログは、例えば`docker compose up`したところに流れます。
`docker compose up -d` と、`-d`オプションをつけるとログが見づらくなります（たぶん。使ったことない）。

## 何を見るの？
特にRailsの場合は、
- <font color="LimeGreen">「どのHTTPリクエストがきているか」</font>
  `GET` / `POST` など・・・それは意図しているもの？
- <font color="LimeGreen">「どのコントローラーの、どのアクションが呼び出されているか」</font>
  それは意図しているもの？
- <font color="LimeGreen">「長いログ」の見方</font>
  大体はおしりの方ではなく、最初の方に「何が問題か」が書かれています。
  もしくは、単に無駄の多い処理であることもあります。その場合は、マストではないですが改善するのが良きです。なんだってシンプルな方が良いものです。

# ページに表示されてるエラーを見る

当然ですが、念の為。
こちらも、頭の方に表示されているのがだいたい問題の核心です。
後ろの方は読まなくていいことが多いです。

# 問題点を分離する

どこが問題かを特定するのは大事なことです。
ここでも`p`が役立ちます。

```rb
def action
  # 処理1...
  puts "---------------"
  puts "1 ok"
  puts "---------------"
  # 処理2...
  puts "---------------"
  puts "2 ok"
  puts "---------------"
  # 処理3...
  if hoge
    puts "---------------"
    puts "if hoge"
    puts "---------------"
  else
    puts "---------------"
    puts "else"
    puts "---------------"
  end
end
```

こんな感じで書くと、どの処理が実行されているかがわかります。
どこかが実行されないはずです。

逆に、どれも正常に表示されるなら、以下のように考えます。
- 別のファイルに問題がある
- そもそもの設計や認識が間違っている（プログラミング自体は正常に動いている）
- どこかの変数の中身が間違っている（とにかくログに出す！を試す）
# おわりに

n番煎じのネタな上、超基本的なことばかりでしたが、大体はこれの応用だと思います。

これらで解決できないときは、個人的には地力が足りてないのかなと思います。

地力が足りない・・・
- これからやろうとしていることがよくわかってない
- メソッドの挙動を勘違いしてる（特にRailsは裏側で動くことが多いので）

このような状態ですね。

Q. 地力が足りないときは？
A. 経験あるのみです。
メソッドの挙動なんて間違いながら覚えるもんだし、
やろうとしてることがわからないのは当たり前だと思ってます。
とにかくやってみて、「これでよかったのか」「これじゃだめだったのか」と知る。

振り返りがうまい人はより深く考えられるのでしょうし、そうなりたいと思いますが、
今のところは答え見てでもなにか進めて、経験として残っていることを願うのみです。
まあ、全部覚えるなんて無理なので、どんどん進んでます。

良い振り返り方、「やろうとしてることがわからない」時のタスク分解方法を知っている方がいれば教えて下さい🙇‍♂️

思いもよらず偉そうなことを書いてしまいました。
自分自身の迷いにも効くな・・・

お読みいただきありがとうございました。

次は何を書こうかしら・・・
PowerShell5から７にアップデートする。



基本的にはここに乗っている手順でアップデートした結果を書いています。
最新は公式ドキュメントを参照してください。

https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#msi

## アップデート方法

```
# インストールできるPowerShellの確認

PS C:\Users\masas> winget search Microsoft.PowerShell
名前               ID                           バージョン ソース
------------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.4.1.0    winget
PowerShell Preview Microsoft.PowerShell.Preview 7.5.0.2    winget

# インストールの実行
winget install --id Microsoft.Powershell --source winget

# パスの追加
$Env:Path += ';$env:ProgramFiles\PowerShell\7'

```

ターミナルアプリからPowerShellが起動できればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/bc9b650c-a2dc-57f1-dd5a-6fce28800e36.png)

## 補足

- PowerShell5までは「Windows PowerShell」という名称のアプリになっていてPowerShell7はWindowsという単語が消えているので別物らしい

- Microsoft StoreやMSIインストーラ形式でも配布しているので、コマンド形式に慣れていない人はインストーラからインストールするとよいかもしれない
SPSS CADSのジョブでmodeler scriptを実行する

SPSS CADSでmodeler scriptを実行したいことがあります。

例えば以下のようなストリームは
* Step１でtemp1.csvを出力して、
* Step2でそのtemp1.csvを入力にして、output.csvを出力したい

ので、modeler scriptで実行順序をシリアルに指定して実行します。

CADSのジョブでもこのmodeler scriptを実行したい場合には、「このスクリプトを実行」にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6376a7f2-9f9b-6e95-5eed-2d66495c727d.png)

そしてジョブステップにストリームを追加し、「全般」タブで「ストリームの実行」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dd041ced-14ff-80a7-6146-3c74e583f993.png)

なお、「このスクリプトを実行」にチェックが入っていた場合は、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/172efa8e-8aa7-f54d-cbe4-aa16792c6cb1.png)

「全般」タブで「ストリームの実行」を選ぶと、実行する枝を選ぶことになります。これだとシリアル実行ができないので、スクリプトで実現したように、temp1.csvが終わってからoutput.csvを実行するという動作が実現できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1b10bf3e-4060-5ef0-42dc-354af6fcc5d9.png)


また、一度ジョブステップを作った後に、「このスクリプトを実行」と「このスクリプトを実行」を入れ替えた場合、一度ジョブステップを削除して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9efbdc9e-9efd-e4d9-f35f-d8e909978505.png)
追加しなおしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/96aedc16-2ec8-47cb-05ad-22c5e73718a5.png)

#環境とサンプル
* 環境
    * SPSS Modeler 18.4
    * SPSS CADS 8.4
    * Windows Server
* サンプルストリーム

https://github.com/hkwd/spssmodelerscript/raw/master/240321scriptExec/scriptexec.str
生成AIで機械学習を学ぶ

# 生成AIで機械学習を学ぶ
最近何かと話題の生成AI
自分も生成AIで何かやりたいと感じ、今回機械学習の学ぶ手助けを得ようと思いまとめた。
# 機械学習を漠然とやりたいという気持ち
あまり機械学習に触れてこなかった身としてはどのように勉強を始めれば良いかわからず
結局手を付けることなく今までを過ごしてきてしまった。
生成AIによって前処理、特徴量エンジニアリング、評価を実践して身に着けることができたのでその内容を共有していきたい。
# 何から始めればいいか
簡単です、生成AI（ChatGPT,Genimi）に次のように聞いてあげます。
「私は機械学習の初学者です。実戦経験もなく、1から機械学習を学びたいです。１か月の期間で段階を踏んで学びたいです、週ごとにやるべきことを教えてほしい。」
このように聞くだけで週ごとに何をやれば機械学習についての知識が身についていくかがわかります。
あとは言われたとおりに行うだけで機械学習を実践しながら学ぶことが可能になります。
# 所感
生成AIはすべての学習のハードルを下げてくれる素晴らしいツールになります。
コードの学習も上記のように行えば身につくこと間違いなし。
生成AIを使いこなすかどうかが今後の業務効率や新しい知識の取得のカギになると思います。
PleasanterのAddResponseの使いどころ

# 前置き
Pleasanterのサーバスクリプトに、"AddResponse"という物があります。 
[マニュアルリンク](https://pleasanter.org/manual/server-script-context-add-response)  

いろいろできそう？と思いつつ、いまいち使いどころが見えなかったのですが、業務の中で活用できる場面があったのでまとめてみます。

# 実装要件
以下のような要件でテーブルを作ることを考えました
- 一覧のガイドにリンクを設定する
- マークダウンを使う
- リンクは別タブ別ウィンドウで開きたくない

ざっくり画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/bb0c8bc0-1a02-5a42-0201-9db0a5807d0e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/0a095c8a-d204-45f1-f726-31abb928f6aa.png)

# 課題
単純にマークダウンでリンクを指定すると、target="_blank"となってしまうため、これを、なんとか"_self"に置き換える必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/10474b0c-f100-6ee4-e911-c458dc05a312.png)

# 実装案
まず、スクリプトの[$p.events.on_grid_load](https://pleasanter.org/manual/script-events-on-grid-load)で、targetの値を変更する方式を考えてみました。

実装したコードは以下

```javascript
$p.events.on_grid_load = function () {
    var aTags = document.querySelectorAll("#Guide h2 a");
    aTags.forEach(function(aTag) {
      aTag.setAttribute("target", "_self");
    });
}
```

これが、うまく機能せず。理由はおそらく、$p.events.on_grid_loadでスクリプトが実行するタイミングでは、ガイド欄がレンダリングされ切っていないためか、変更が反映されませんでした。

その他、いろいろ試してみるもスクリプトで実現するのはどうも難しそうです。

# 改善案
そこで、サーバスクリプトのAddResponseで実装することを考えてみます。つまり、サーバ側から、強制的にガイド欄のhtmlを書き換えてみればと。

```javascript

try {
    if(context.Action === 'index'){
        let value = '';
        value += '<div id="Guide">',
        value += '<div class="markup applied">'
        value += '<div class="md">'
        value += '<h2 id="リンク１">'
        value += '<a href="https://pleasanter.net/fs/items/10887620/index" target="_self">リンク１</a>'
        value += '</h2>'
        value += '<h2 id="リンク２">'
        value += '<a href="https://pleasanter.net/fs/items/10120862/index" target="_self">リンク２</a>'
        value += '</h2>'
        value += '</div>'
        value += '</div>'
        value += '</div>'

        context.AddResponse('ReplaceAll','#Guide',value);
    }
} catch (e) {
    context.Log(e.stack);
}

```
基本的に、マークダウンで指定した時とほぼ同じhtmlで、targetの部分だけ置き換えています。  
最後の「context.AddResponse('ReplaceAll','#Guide',value);」で、ガイド欄ID"#Guide"指定で、htmlをごっそり置き換えます。

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/a8aebbf9-4834-2060-3eca-5d775c5e5338.png)

できました。

使い込めば、かなり自由自在にレイアウトできそうです。
MSバウチャーチケット無料ゲットのチャンス（2024/4/20まで）

### Microsoft Learn AI Skills Challenge
今年もやってきましたね。
Microsoftの企画で期間内に対象トレーニングをすべて完了させると、
バウチャーチケットが無償でもらえます。

https://www.microsoft.com/ja-jp/cloudskillschallenge/ai/officialrules/2024?ocid=aisc24_csc_fabric_email_ad

#### コース一覧

* Microsoft Learn AI Skills Challenge：Azure OpenAIで次世代アプリ構築（AI-102）
* Microsoft Learn AI Skills Challenge：Azure AIの基礎（AI-900）
* Microsoft Learn AI Skills Challenge：Fabricアナリティクス エンジニア（DP-600）
* Microsoft Learn AI Skills Challenge：Azure機械学習（DP-100）

#### チャレンジ期間
日本時間ですと 2024年4月20日の深夜1時までです。
一緒に頑張りましょう！
JSON(MAP<String, Any>)のシリアライズをkotlinとswiftで比較

# Swift

```swift
struct Configuration: Decodable {
  let id: String
  let name : String
  let age: Int
  enum CodingKeys: String, CodingKey {
    case id = "id"
    case name = "name"
    case age = "age"
  }
  static func create(_ dictionary: [String: Any]) -> Configuration? {
    guard let json = try? JSONSerialization.data(withJSONObject: dictionary),
      let instance = try? JSONDecoder().decode(Configuration.self, from: json)
    else {
      return nil
    }
    return instance
  }
}

let response: Map<String, Any> = getXXXFromRepository()

let result: Configuration = Configuration.create(response)
```

**ポイント**

- JSONからデコードしたい型は`Decodable`プロトコルに準拠する
- `CodingKey`を実装してキーを定義する必要がある


# kotlin



```kotlin
@Serializable
data class Configuration(
    @SerialName("id") val id: String,
    @SerialName("name") val name: String,
    @SerialName("age") val age: Int,
)

val response:Map<String, Any> = getXXXFromRepository()
val result: Configuration = Properties.decodeFromMap<Configuration>(map = response)

```

**ポイント**
以下のステップを踏む
１. アプリレベルの`build.gradle`のpluginに以下を記述
 ```gradle
plugins {
    id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.0' apply false
}
```
２. モジュールレベルの`build.gradle`のpluginに以下を記述 
```gradle
plugins {
    id 'org.jetbrains.kotlin.plugin.serialization'
}
```

３. dependenciesに以下を記述
```gradle
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-properties:1.7.1")
}
```

- `data class`に`@Serializable`アノテーションをつける
- キー属性に`@SerialName`を指定してキャメルケースを`_`へ変換できる
sign-up前やログイン前に記述するbefore～～

アプリのコントローラーは各コントローラー名の前にapplication_controllerを通ってから処理をしていく。

そのためbefore～～はこの`application_controller`の中に記述する。

```ruby
before_action :authenticate_user!
```
上記の意味は
#### ログインしていないユーザーをログインページの画面に促すことができる。

 ```ruby
 before_action :configure_permitted_parameters, if: :devise_controller?
 
  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end

```
#### deviseを使った新規登録をする際に使用。
例えば新規登録でemail,passwordだけでなく名前を追加で新規登録させたい場合に使う。（email,passwordはデフォルトで入っているので記述の必要はなし）permit下の処理名一覧
[![Image from Gyazo](https://i.gyazo.com/3b6d40b78f4ccd04471999760323c84b.png)](https://gyazo.com/3b6d40b78f4ccd04471999760323c84b)
Node.js: 現在時刻を改ざんして、日時が絡むテストを簡単にする方法

時間に依存する機能を持つアプリケーションのテストは、しばしば複雑で時間を要する作業です。「24時間後にログアウトしていること」といったテストのために1日待つのは辛いものがありますね…。

システムの時計を変更することなく、特定の日時でコードが正しく動作するかをテストする方法はないでしょうか。

ここでは、`libfaketime`を利用してNode.jsのアプリケーションで時間を自由に操る方法をご紹介します。

### libfaketimeとは

`libfaketime`は、プロセスに報告される現在日時をマシンのシステムクロックとは異なる値に偽装することを可能にするライブラリです。これは、**システムコールに介入**し、ユーザーが定義した日時を返すことで実現します。システム全体の日付を変更せずに、特定のプロセスだけのシステム日付を変更することが可能です。テスト環境で時間を操作し、特定の時点でのアプリケーションの動作を確認するのに非常に便利です。

### Dockerを使用したlibfaketimeのインストール

Node.jsのアプリケーションで`libfaketime`を使用するには、まずDockerイメージに組み込む必要があります。以下は`libfaketime`をAlpine LinuxベースのNode.jsイメージに組み込むための`Dockerfile`の例です。

```dockerfile
# libfaketimeをビルドするためのステップ
FROM alpine:3.18 AS builder
RUN apk add build-base git
RUN git clone --depth 1 --branch v0.9.10 https://github.com/wolfcw/libfaketime /usr/local/src/libfaketime
WORKDIR /usr/local/src/libfaketime
RUN make && make install

# Node.jsイメージの準備
FROM node:21-alpine
COPY --from=builder /usr/local/lib/faketime/libfaketimeMT.so.1 /lib/faketime.so
ENV LD_PRELOAD=/lib/faketime.so
ENTRYPOINT ["node", "-e"]
CMD ["console.log(new Date())"]
```

この`Dockerfile`では、最初に`libfaketime`のビルドを行い、その後、ビルドしたライブラリをNode.jsのイメージにコピーしています。`LD_PRELOAD`環境変数を設定することで、Node.jsプロセスが`libfaketime`を使用するようになります。

### Dockerイメージのビルド

以下のコマンドを実行して、先ほどの`Dockerfile`からDockerイメージをビルドします。

```sh
docker build . -t fakedemo
```

### 現在日時を改ざんしてみた

ビルドしたDockerイメージを使用して、時間を操作しながらNode.jsアプリケーションを実行できます。

以下のコマンドは、システムの現在時刻から1年後の日時に改ざんした状況を作り、そのうえで毎秒現在時刻をコンソールに出力しますJavaScriptを実行します。

```sh
docker run --rm -it -e FAKETIME=+1y fakedemo 'setInterval(() => console.log(new Date()), 1000);'
```

出力例（実行日が2024年3月21日の場合）:

```
2025-03-21T01:02:15.882Z
2025-03-21T01:02:16.883Z
2025-03-21T01:02:17.885Z
2025-03-21T01:02:18.886Z
```

上の結果を見てみると、`+1y`が作用して日時が1年後になっています。秒数は進んでいることから、`+1y`のような指定にすることで日時は固定せず現在のものを使えることが分かります。


日時の指定は絶対時刻(常に固定)や相対時刻(始まりだけ指定)といった様々な指定ができます。詳しくはドキュメントをご覧ください。

https://github.com/wolfcw/libfaketime


`libfaketime`を活用することで、時間に依存する複雑なテストも、より簡単かつ正確に実施することができるようになります。
MacOS上でDockerをREST APIを用いて操作するやり方

今回はMacOS上で開発をするうえで、DockerをREST APIを用いて操作する際のやり方を紹介していきたいと思います。

DockerはREST APIを用いてDockerコンテナ自体の立ち上げから停止などの様々な動作を執り行うことができます。
まず最初に、Dockerの設定を変更する必要があります。
![スクリーンショット 2024-03-21 9.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998838/290120a1-4d34-c5d8-4410-8c54918bc27e.png)

まず最初にPreferencesをクリックします。
そうすると設定画面が表示されますので、その画面の
![スクリーンショット 2024-03-21 9.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998838/782082f3-4c0e-b12d-ad7b-28fe3d43f9a9.png)

Docker Engineの項目をクリックしてください。
その後、JSON形式で設定が表示されるので、そこのhostsのところを

```JSON
  "hosts": [
    "unix:///var/run/docker.sock"
  ],
```

となっているので、

```JSON
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2375"
  ],
```

となるように、します。
こうすることで、HTTPリクエストを受け付けるようになり、REST APIでの操作が可能になります。
ただし、これは全てのリクエストを受け付けるようにするものなので、場合によっては`0.0.0.0`となっているところを`127.0.0.1`等して調整する必要があります。

その後、Dockerを再起動してください。
次に、Dockerを動かすためにsocatをMacOS上にインストールしてください。
Homebrewがあるので、そこでインストールしてください。

```
brew install socat
```

でインストールできます。
その後、TCPでLISTENするようにコマンドを打ちます。

そのコマンドが下記です

```
socat TCP-LISTEN:2375,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock
```
で、DockerとホストOSが2375番のポートでやり取りができるようにしました。
ちなみにこのコマンドを実行すると、そのターミナルは使えなくなりますので、新しく開いてください。

※上記のコマンドはセキュリティ上リスクをはらみます。
もしMacOSを本番環境に使う場合はこのコマンドを実行するのは推奨されません。

次に、APIを叩きます。
Linuxでは、

```
http://IPアドレス:2375/containers/create
```
と叩きます。もちろん複数のMacOSでやり取りをする場合は別ですが、今回はホストOSにもう一台Dockerコンテナを立ち上げる前提です。

その場合はIPアドレスの箇所を

```
host.docker.internal
```
に書き換えて叩いてください。

以上です。
ありがとうございました。
JavaScriptのsortについて

JavaScriptのsortについて、結果が出力されるまでの動きが理解できていなかったので記事にしました。
まだ経験が浅いため、認識に間違いがありましたらコメント頂けますと幸いです。

下記コードは引数として' 'で区切られた値の中から最も短い文字列の値を出力するコードです。
コードを実行した際に出力される結果は'5'となります。

```diff_javascript
function shortest(str) {
  let splitWord = str.split(' ').sort(function(a, b) {
    let result = a.length - b.length
    return result
  });
  return splitWord[0].length
}
console.log(shortest('osaka aomori akita kanagawa'))
// console.logの出力結果は'5'
```

a, bには配列に変換された'osaka aomori akita kanagawa'が入ってきます。

```diff_javascript
sort(function(a, b) // 2行目

a         |b
ーーーーーーーーーーーーーーーーーーーー
osaka(5)  |aomori(6)   // 1回目
osaka(5)  |akita(5)    // 2回目
aomori(6) |akita(5)    // 3回目
osaka(5)  |kanagawa(8) // 4回目
aomori(6) |kanagawa(8) // 5回目

// ()の中は文字の長さ
```
入ってきたデータを元の文字列の長さをもとに計算をします。
1回目　'osaka'の方が1文字少ないので、['osaka', 'aomori']の順となります。
2回目　'0'となるので、['osaka', 'akita']が並列の順となります。
3回目　'aomori'の方が1文字多くなるので['osaka', 'akita', 'aomori']の順となります。
4回目　'osaka'の方が3文字少ないので、'osaka', 'akita'よりも後に並ぶことが確定します。
5回目　'aomori'の方が2文字少ないので、'aomori'よりも後に並ぶことが確定します。
結果 　 splitWordは['osaka', 'akita', 'aomori', 'kanagawa']となります。

```diff_javascript
let result = a.length - b.length // 3行目

result
ーーーーーーーーーーー
-1 // 1回目　　['osaka', 'aomori']
0  // 2回目 ['osaka', 'akita']
0  // 3回目 ['aomori', 'akita']
-3 // 4回目 ['osaka', 'kanagawa']
-2 // 5回目 ['aomori', 'kanagawa']
```

['osaka', 'akita', 'aomori', 'kanagawa']に並び変えられたインデックス'0'の文字数を取得すれば、最も短い文字列の値を求めることができるようになります。

以上です。
JavaScriptで数値計算---二分法とニュートン法

# 要するに

前回の記事のJavaScriptを実行できるWebサイトを使って
汎用的な方程式の数値的開放である二分法とニュートン法について解説する。
これらはあらゆる$f(x)=0$を解ける、つまり汎用的な数値的解放として代表的な２つである。
JSでのコーディングの例として数値計算の例として代表的な$\sqrt(2)$を求める問題を取り上げる。

### Github
これらはgithub,ioのページとして公開している。それらへのリンクは解説のあとにつけておく
github自体へのリンクは[ここ](https://github.com/T-Yasusi/t-yasusi.github.io)である

## 二分法
ある２つの値、$x_0,x_1$、としそれらの関数の値がそれぞれ正と負であるとする。
その時、必ず$x_0$と$x_1$の間に答え(解)がある。
なので、その平均$x_{center}=\frac{x_0+x_1}{2}$を新たな値として範囲を狭めていく方法である。
解が求まったという条件は$x_0$と$x_1$のが十分小さいとする。
JSの数値型は倍精度浮動点少数でありその最小の差は$1$で大体$10^{-16}$程度とされている。
しかしあまりに小さく取ると収束しないという問題があるので大体、半分の乗数の$10^{-8}$が用いられる。

これをコーディングするとこのようになる。
```js:byselection.js
const n=2;
const func=x=>{ return x*x-2; };
let x0=0, x1=n;
let y0=func(x0), y1=func(x1);
let counter=0;

while( Math.abs(x0-x1)>1.0e-8 ){
    counter++;
    if( y0*y1>0 ) throw new Error('!!! Byselection same sign !!!');
    const x_c=0.5*(x0+x1);
    const y_c=func(x_c);
    if( y_c*y0<0 ) x1=x_c;
    else x0=x_c;
    output.log('Iteration =', counter, ' f(', x_c, ') =', y_c);
}

```
解く方程式は`func=x=>{ return x*x-n; };`であり、これは$x^2-2=0$を解いている
この方法では誤差$|x_0-x_1|$は1ステップで半分にしかならないので収束は遅いが必ず小さくなるので安定的と言われる。

![Peek 2024-03-21 09-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567691/e9914b99-9b84-59eb-d762-8583cf227922.gif)

これは[JavaScript実行テストページ---二分法グラフ付](https://t-yasusi.github.io/js-test.html?src=byselection_wGraph.js&run)で実行できる。

## ニュートン法
ニュートン法はある、値$x_0$で$f(x)$を一次近似してその解を$x_1$を次の値として更新していく方法である。
一次近似なので微分を使い傾きを求める、これは微分を発明したニュートンが発明したためこの名前になった

JSの関数は第一級オブジェクトなので他の関数に引数として渡すことが出来る。
そのため、微分は以下のようにモジュール化出来る。
```js:diff.js
export default {
    forward: (f, x, dx=1.0e-8)=>{ return (f(x+dx)-f(x))/dx; },
    central: (f, x, dx=1.0e-8)=>{ return (f(x+0.5*dx)-f(x-0.5*dx))/dx; },
    backward: (f, x, dx=1.0e-8)=>{ return (f(x), f(x-dx))/dx; }
}
```

これらを数式で表すと
$f'(x_0)_{forward} \sim \frac{f(x+dx)-f(x)}{dx}$

$f'(x_0)_{central} \sim \frac{f(x+0.5dx)-f(x-0.5dx)}{dx}$

$f'(x_0)_{backward} \sim \frac{f(x)-f(x-dx)}{dx}$
となる上から前方、中心、後方差分法と言われるもので微分の定義式の$dx \rightarrow 0$を微小量で近似したものである。
前方、後方差分の誤差はdxの一次のオーダーで中心差分では$dx$の二次のオーダーになる。

この微分をdiffモジュールとするとニュートン法は以下のように実装される。

```js:newton.js
const n=2;
const func=(x)=>{ return x*x-n; };
let x0=n;
let x1=x0-func(x0)/diff.central(func, x0);

let counter=0;
while( Math.abs(x0-x1)>1.0e-8 ){
    counter++;
    x0=x1;
    x1=x0-func(x0)/diff.central(func, x0);
    output.log('Iteration =', counter, ' x=', x1, 'dx =', Math.abs(x0-x1));
}
output.log('x =', x1, '  calc =', Math.sqrt(n));
```
これにビジュアライゼーションを追加したものを実行すると次の絵のようになる

![Peek 2024-03-20 18-23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567691/af56de23-18e9-7df2-bf0d-f2f50321b7ab.gif)

これは[JavaScript実行テストページ---ニュートン法グラフ付](https://t-yasusi.github.io/js-test.html?src=newton_wGraph.js&run)で実行することが出来る。
「timestamp.proto: File not found.」「Import "timestamp.proto" was not found or had errors.」というエラーが出る件

gRPCを実装する際に以下のようなuser.protoファイルを作成しました。そして、protocコマンドを実行したところ、以下のようなエラーが出ました。解決法を紹介します。

```proto:user.proto
syntax = "proto3";

package pb;

import "google/protobuf/timestamp.proto";

option go_package = "./pb";

message User {
    string name = 1;
    google.protobuf.Timestamp updated_at = 2;
    google.protobuf.Timestamp created_at = 3;
}

```
```protoc:エラー文
timestamp.proto: File not found.
user.proto:5:1: Import "timestamp.proto" was not found or had errors.
user.proto:11:5: "google.protobuf.Timestamp" is not defined.
user.proto:12:5: "google.protobuf.Timestamp" is not defined.
```
# 解決法
こちらに解決法が記載されていました。
https://github.com/protocolbuffers/protobuf/issues/5131

具体的には以下のコマンド実行します。
```
apk add protobuf-dev
```
私の場合はDockerを用いて開発を行っていたのでDockerfileに以下の処理を追加しました。
```dockerfile:Dockerfile
・
・
RUN apk add protobuf-dev
・
・
```
Pythonのエラー集

ほぼ自分用のよくあるエラーまとめ

# SyntaxError
- コードの文法が正しくない場合に発生。
- 例：括弧の閉じ忘れ、不正なキーワードの使用、インデントの誤りなど。

# NameError
- 存在しない変数を参照しようとしたときに発生。
- スペルミスとかでありがち。typoがないかしらべる。Formatterがあると理解しやすい

# TypeError
- 定義されたデータ型に対して操作が不適切な場合に発生。
- 例：文字列と数値の足し算など。

# ValueError
- 型は正しいが不適切な値を関数に渡したときに発生。

# IndexError
- リストやタプルなどのシーケンスで、範囲外のインデックスにアクセスしようとした場合に発生。

# KeyError
- 辞書に存在しないキーにアクセスしようとした場合に発生します。

# AttributeError
- 存在しない属性やメソッドをオブジェクトから呼び出そうとした場合に発生します。

# ZeroDivisionError
- 名の通り0で割り算しようすると発生。

# OverflowError
- 算術演算の結果が表現可能な最大値を超えた場合に発生します。

# ImportError
- 指定したモジュールが見つからない場合に発生。
- 未インストールの場合は

# FileNotFoundError
- 指定したファイルが存在しない場合に発生。
- パスやファイル名が誤っているときも同様に起こる
GithubActionsでNext.jsのビルドが環境変数を設定しているのにうまくいかない

# はじめに

地味に気づくのに時間がかかったのでまとめます

# 問題

GithubActions上でビルドをするとエラーがでます

```
   Generating static pages (5/7) 
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11731:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async globalThis.fetch (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/chunks/638.js:1:36484)
    at async d (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/app/page.js:1:4770) {
  cause: Error: getaddrinfo EAI_AGAIN loclahost
      at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
      at GetAddrInfoReqWrap.callbackTrampoline (node:internal/async_hooks:128:17) {
    errno: -3001,
    code: 'EAI_AGAIN',
    syscall: 'getaddrinfo',
    hostname: 'loclahost'
  }
}
TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11731:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async globalThis.fetch (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/chunks/638.js:1:36484)
    at async d (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/app/page.js:1:4770) {
  cause: Error: getaddrinfo EAI_AGAIN loclahost
      at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
      at GetAddrInfoReqWrap.callbackTrampoline (node:internal/async_hooks:128:17) {
    errno: -3001,
    code: 'EAI_AGAIN',
    syscall: 'getaddrinfo',
    hostname: 'loclahost'
  }
}

Error occurred prerendering page "/". Read more: https://nextjs.org/docs/messages/prerender-error

TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11731:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async globalThis.fetch (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/chunks/638.js:1:36484)
    at async d (/home/runner/work/my-tech-blog/my-tech-blog/.next/server/app/page.js:1:4770)

 ✓ Generating static pages (7/7) 

> Export encountered errors on following paths:
	/page: /
Error: Process completed with exit code 1.
```

しかしローカルでやるとうまく行くので`.env`に何かあるのはわかりましたが、全部シークレットで設定していてナゾでした

# 解決方法

API Routeを以下のように叩いているのですが

```
  const articles = await fetch(
    `${process.env.NEXT_PUBLIC_API_URL}/articles?user=Sicut_study&count=20`
  ).then((res) => res.json());
```

ここで使っている環境変数の値に`/api`が含まれていなかったのが原因でした

```
☓ http://localhost:3000
○ http://localhost:3000/api
```

他の環境変数で/apiを外したものもあるのでそれを使っていたようでした

# おわりに

環境変数エラーなのがわかっていたので再度値をコピーし直して登録はたいせつでした
Linuxで特定のサイトにアクセスできなくなった

# はじめに

あるとき特定のサイトにアクセスできなくなって困ったのでまとめます

# 問題

GoogleはアクセスできるがGithubはアクセスできないなどのインターネットの問題が起きました

# 解決方法

問題は`Security Boot`を**オン**にしてしまっていたことでした
たまたま直前でよくわからず設定していました

セキュリティブートをBIOSからオフにすることで解決しました

セキュリティーブートをオンにすると署名などが正しいサイトしか見れなくなるようです

# おわりに

Linux系のエラーは本当に焦るのですぐ解決できてよかったです
人によっては解決できない気がする、、、
動作確認用のシンプルなDockerイメージ

とりあえず何か Docker イメージを動かす必要があるときに使う用。
ECS の動作確認用に使っている。

# Dockerfile
index.html を書き換えることで自分の作ったイメージであることを確認できる。
```Dockerfile:Dockerfile
FROM nginx:latest

RUN echo "<!DOCTYPE html><html><body><h1>Test Page</h1></body></html>" > /usr/share/nginx/html/index.html
```

# ビルド

```sh
docker build -t nginx-test:1.0.1 .
```

# 起動
localhost の 80 番ポートで動作する
```sh
docker run -p 80:80 nginx-test:1.0.1
```

localhost の 8080 番ポートで動作させる場合にはこうすｒ
```sh
docker run -p 8080:80 nginx-test:1.0.1
```
llama-2 で elixir を学ぶ　（その2） 整数の加算

こちらと同じことを、llama-2 で行いました。
[ChatGPT で elixir を学ぶ　（その2） 整数の加算](https://qiita.com/ekzemplaro/items/cc907011657dbceb6249)

## Python のプログラム

```py:sum.py
#! /usr/bin/python
#
import sys
#
sys.stderr.write("*** 開始 ***\n")
aa = int(sys.argv[1])
bb = int(sys.argv[2])
print("aa = %d\tbb = %d" % (aa,bb))
sum = aa + bb
print("sum = %d" % sum)
sys.stderr.write("*** 終了 ***\n")
```

## llama-2 が作成したプログラム

```elixir:ex02.exs
#! /usr/bin/elixir

def main(args) do
  # Print a message to stderr
  System.error("*** 開始 ***\n")

  # Parse command line arguments
  aa = Integer.parse(args[1])
  bb = Integer.parse(args[2])

  # Print some information to stderr
  System.error("aa = #{aa}\tbb = #{bb}")

  # Calculate the sum of the two integers
  sum = aa + bb

  # Print the result to stderr
  System.error("sum = #{sum}")

  # Print a message to stderr indicating that the program has finished
  System.error("*** 終了 ***\n")
end

main([String.to_list(System.get_property("user.home"))])
```

## 実行結果

```text
$ ./ex02.exs  10 20
** (ArgumentError) cannot invoke def/2 outside module
    (elixir 1.14.0) lib/kernel.ex:6373: Kernel.assert_module_scope/3
    (elixir 1.14.0) lib/kernel.ex:5070: Kernel.define/4
    (elixir 1.14.0) expanding macro: Kernel.def/2
    ex02.exs:3: (file)
```

llama-2 に次の質問をしました。

```text
Is System.error() a standard function for Elixir?
```

回答

```text
No, `System.error()` is not a standard function in Elixir. 
It is a function provided by the Erlang VM's `sys` module, 
which is not available in Elixir.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/bc524ddb-6245-a3a6-0962-50ce835c3ef6.png)
llama-2 で elixir を学ぶ　（その1） Hello World

こちらと同じことを [llama-2](https://replicate.com/meta/llama-2-13b-chat) で行いました。

## Python のプログラム

```py:hello.py
#! /usr/bin/python
#
print("こんにちは")
print("今日は良い天気です。")
```

## llama-2 で変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b1e614d5-8b2a-0aa3-b7b5-613ceb032dca.png)

prompt

```text
Can you convert the following python program into elixir?
```

system-prompt

```text
#! /usr/bin/python
#
print("こんにちは")
print("今日は良い天気です。")
```

```elixir:ex01.exs
#! /usr/bin/elixir

IO.puts("こんにちは")
IO.puts("今日は良い天気です。")
```

## 実行結果

```text
$ ./ex01.exs 
こんにちは
今日は良い天気です。
```
GitHub ActionsでのJavaScriptヒープメモリエラーの解決方法


## はじめに
GitHub Actionsでのテスト実行中にJavaScriptヒープメモリエラーが発生した経験を共有します。エラー内容、その原因、そして解決策について詳しく解説します。

## エラー内容
以下が発生したエラーメッセージです。

```
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
```

このエラーは、JavaScriptプログラムが実行中にメモリ制限に達したことを示しています。

## 原因
JavaScriptヒープメモリエラーの原因は、プログラムが使用するメモリ量が多すぎるか、無限ループなどが原因でメモリが不足している可能性があります。

## 解決策
1. ヒープメモリサイズの調整
   GitHub Actionsのワークフローで実行されるNode.jsのプロセスに対して、ヒープメモリのサイズを増やします。
```yaml
     env:
       NODE_OPTIONS: --max-old-space-size=4096
```
## その他の対処法

・コードの最適化
不要な変数やオブジェクトを削除し、メモリ使用量を削減します。

・データ処理の最適化
データの効率的な処理方法を検討し、メモリ使用量を削減します。
クロージャー（Closure）って何？ (Rust)

処理長くなってちょっとまとめたいなって時にないですか？  
でも関数起こすのめんどいなー。  
変数受け渡し用の引数定義するのめんどうだし。。  

そんなときに、関数の中で同じ処理まとめちゃう時に便利なのがクロージャー！  

### クロージャー：関数みたいに処理まとめられてその親スコープの変数も使えちゃうやーつ  

※クロージャーってのは閉じたものみたいな意味で  
関数の中に閉じ込められているからこんな名前になっていると思われる。

こんな感じで使います  
（`shori`関数の中で変数`soto_hensu`を定義しといてクロージャーの中で呼び出す)
```rust
fn shori(){
    let soto_hensu = "処理の外から来た変数だよ";

    //これがクロージャー
    let closure_dayo = |namae| {
        println!("{}さんこんにちは",namae);
        println!("{}",soto_hensu);
    };

    //実際クロージャーを使っているところ
    closure_dayo("たろう");
    closure_dayo("ほげた");
}

fn main() {
    //メインで実行
    shori();
}
```

### 実行結果
```Terminal
たろうさんこんにちは
処理の外から来た変数だよ
ほげたさんこんにちは
処理の外から来た変数だよ
```

### クロージャーのフォーマット
|<引数1>,<引数2>|{<処理>}  

みたいな感じで引数を|（パイプ）で囲んで渡します。
あとは普通の関数と変わらない。

関数と違って自分のスコープじゃない外の変数も使えるので  
ちょっと使いたき時に便利ですね。
空配管に有線LANを入れるのに成功した話

# やりたいこと
空配管に有線LANを通して物理的に離れた位置にあるLANとLANを有線接続する

# 実現方法
空配管にLANケーブルいれて両端に機器を接続

# 手順
1.以下を購入
　LANケーブル(10m)
　RJ45コネクター
　かしめき
　通線ワイヤー
2.LANケーブルの片方のRJ45コネクター付近のケーブルカット※空配管にコネクターがついてるとケーブルが入らなかった
3.通線ワイヤーで空配管にケーブルを通す
4.ケーブルの外皮を向いて銅線をバラして、ストレートT568B配線でRJ45コネクターに挿入
↓参考　ストレートT568B配線
https://community.fs.com/jp/article/t568a-vs-t568b-difference-between-straight-through-and-crossover-cable.html
※配線方法はストレートとクロスがある。購入したケーブルはストレートだったのでストレート配線。コネクター部分が透明じゃないから目視では確認できなかった。
昔は機器の接続方法によってストレートとかクロスケーブル使用しないとだったが最近の機器は気にしなくてよい。
ストレートもAとかBの配線の種類あり。ケーブルの購入ページに記載がなかった。広く使われているのはBの配線だったのでBにした。
5.かしめきでかしめる。※これ知らなくてLANに入らないけどなんで？となった
6.機器にLAN挿入。※LANチェッカーあったほうがいいけど買うのやめた
7.疎通確認。ネット見れてるからok。

# 結果
成功
![IMG_4619.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683457/a90ae9e3-43ad-e210-f179-2d9f32f8a3d9.jpeg)

![IMG_4620.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683457/7d24446c-f8fc-8185-5e39-58ead8a59a10.jpeg)



# NW環境
[PC]----<空配管　LANケーブル>----[RT]

# 設定
## ○A
### ハマったところ
### わからなかったところ

## ○B
### ハマったところ
### わからなかったところ

# その他

# 関連記事
空配管に有線LANを入れるのを諦めた話し


○追記
接続ポート情報みたら100mbbsしか速度出てなかった。ポートはオートネゴシエーションだから問題なし。
lanケーブルか、銅線の配列が悪いか、LANケーブルとrj45の組み合わせがよろしくないのか…
調査めんどいから100mbbsで我慢する。
100mbbsの速度が出てれば1秒間に12.5mbの送受信が可能らしい。
https://wifistore.jp/column/7241#:~:text=bpsの前の「M,ができることになります%E3%80%82
Dr.Sumオンプレ＋MotionBoardで任意に起動できるデータ入替機能をつくる

手順

①Dr.Sumの付属ツール「Excel Extractor」でExcel読込のための設定ファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/ef40dcde-f8e0-6f4a-fdf2-e1f2425da13d.png)

②Dr.Sumの付属ツール「VTB Creator」でインポートExcelとインポート先テーブルを指定
　⇒データ洗い替え設定はここで出来る
https://cs.wingarc.com/manual/drsum/5.7/ja/UUID-ae3b43df-ba7e-376e-49da-5c042eec91b0.html

③②を呼び出すバッチを作成
https://cs.wingarc.com/ja/best_practice/dr_sum/25051?brand=dr_sum&service=6270&scenario=6274

④MotionBoardのサーバープログラムとして③のバッチを登録
https://cs.wingarc.com.cn/manual/mb/6.3/ja/UUID-0eff37d9-52ae-6966-9d8c-3acf2a9f7928.html

⑤MotionBoardでボタンを作成、④のプログラムを呼び出す
https://cs.wingarc.com.cn/manual/mb/6.3/ja/UUID-6e866b29-32a1-a0b3-f38a-c029e0436d97.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/4d2763ef-4a3c-a05d-c2c3-a8efadb08896.png)
aacの再生プログラムを作ってみた

fdk-aacとmpg123のライブラリを使ってaacファイルを再生するプログラムを作ってみました。System233さんのさんのfdk-aacのサンプルコードをベースにしています。引数が1つの時はファイルで3つの時はhttpです。

https://github.com/ZRouter/ZRouter/blob/yamori813_modify/target/usr.bin/ahplay/ahplay.c

ADTSなaacは再生できますがM4Aなaacは再生できません。

```
% file *
jazzspot.aac: MPEG ADTS, AAC, v4 LC, 48 kHz, stereo
jazzspot.m4a: ISO Media, Apple iTunes ALAC/AAC-LC (.M4A) Audio
```

M4AなaacはRAWでデコードする必要があるようなのですが、パラメータがファイルの最後にあり、ファイルをすべて読み込まないと再生できないのかもしれません。
各種言語でCOMオブジェクトを使ってみた

# Windows Script Host
## JScript

```speak.js
// cscript speak.js
var sapi = WScript.CreateObject("SAPI.SpVoice");
sapi.Speak("hello, world");
```

## VBScript

```speak.vbs
' cscript speak.vbs
Set sapi = CreateObject("SAPI.SpVoice")
sapi.Speak "hello, world"
```

# PowerShell

```speak.ps1
# powershell -ExecutionPolicy RemoteSigned ./speak.ps1
$sapi = New-Object -ComObject "SAPI.Spvoice"
[void]$sapi.Speak("hello, world")
```

# .NET Framework

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
prompt $e[33m$p$g$e[m
cmd
```

## C#

```speak.cs
// csc speak.cs
using System;
using System.Runtime.InteropServices;

class Program {
	static void Main() {
		Type t = Type.GetTypeFromProgID("SAPI.SpVoice");
		dynamic sapi = Activator.CreateInstance(t);
		sapi.Speak("hello, world");
		Marshal.ReleaseComObject(sapi);
	}
}
```

https://qiita.com/Stosstruppe/items/909ce8e22091ddc4b916
## Visual Basic

```speak.vb
' vbc speak.vb

Module Program
	Sub Main
		Dim sapi As Object
		sapi = CreateObject("SAPI.SpVoice")
		sapi.Speak("hello, world")
	End Sub
End Module
```

# Visual Studio
## C++

```speak.cpp
// cl /MD /W4 speak.cpp

#include <atlbase.h>

int main(void)
{
	HRESULT hr;
	hr = CoInitialize(nullptr);

	CComPtr<IDispatch> pDisp;
	hr = pDisp.CoCreateInstance(L"SAPI.SpVoice");

	CComVariant varg[2];
	varg[0] = 0;
	varg[1] = L"hello, world";

	CComVariant vResult;
	pDisp.InvokeN(L"Speak", varg, 2, &vResult);

	pDisp = nullptr;	// 無いとプロセスが残る
	CoUninitialize();
}
```

# LibreOffice Basic

```
Sub Main
	sapi = CreateObject("SAPI.SpVoice")
	sapi.Speak "hello, world"
End Sub
```
spotipyを使った開発備忘録 

## はじめに
　何か開発してみようと思い立ったので、その過程を備忘録として記していく。開発経験が乏しい、且つ、それを記事にすることは初めてなので間違っていることや間違った言い回しも多いと思うがお手柔らかにどうぞ。本記事は環境構築からspotipyを使ってなんか動作したぞ～～～～ってところまで。

 ## spotipyとはなんぞや
 　平たく言うとspotifyが出しているAPIをpythonで使いやすいようにまとめたライブラリのようなもの(?)。そもそもspotifyのAPIは楽曲の様々な情報を取得できて、それをほぼ無料で使えるらしい。様々な情報とは、曲のテンポや雰囲気、更にはリスナーのトップソングなど。それを使ってオリジナルサジェスト機能を作ったりできるっぽい。すごい(小並)。
  なのでそんな情報を使ってゆくゆくは機械学習とかにかけられたりしたらいいな～という展望である。(わざわざpythonつかうのもそれを見越していたりいなかったり)

  ## 環境構築
  VSCodeを使って開発したかったため、いくつか記事を見繕って環境構築を行った。まずは、以下の記事を参考にVSCode上でpythonを使えるようにした。

  https://www.python.jp/python_vscode/windows/index.html

  次にVSCode内でspotipy等ライブラリが使えるように仮想環境を作成する。今回はvenvを使用した。主に役立ったのは以下2つのページ。

  https://tech-useit-wealth.com/%e3%80%90python%e3%80%91visual-studio-code%e3%81%a7%e4%bb%ae%e6%83%b3%e7%92%b0%e5%a2%83%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%97%e3%82%88%e3%81%86%ef%bc%81

  https://tech-useit-wealth.com/%E3%80%90%E5%85%A5%E9%96%80%E3%80%91visual-studio-code%E3%81%A7python%E3%81%AE%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%82%88%E3%81%86%EF%BC%81

  仮想環境をコマンドパレットから起動する方法ができなかったが、起動コマンドをターミナルに打ち込めば仮想環境が起動できたので、よしとする。

## spotipyを使ってみる
　さて本題。まずはspotify APIを使えるように諸々の手続きをば。参考は以下ページ。ページ内の画像と現時点でのspotify for developersの画像は変わっているので、そこはご愛敬。

 https://self-development.info/%e3%80%90%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%e3%80%91spotify-api%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ae%e6%96%b9%e6%b3%95/

 次に以下ページの後半を参考にコードを作成した。
 
https://self-development.info/%e3%80%90%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%e3%80%91spotify-api%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ae%e6%96%b9%e6%b3%95/

検索キーワードは東京に変更し、ついでにアーティスト名も出すようにした。
 ```txt:out
 1 東京人壽 Joey Yung
2 Tokyo Leat'eq
3 東京一轉 麗英
4 東京百貨 Stephanie Cheng
5 東京フラッシュ Vaundy
6 東京テディベア -初音ミク「マジカルミライ 2014」Live- Neru
7 東京 Kinokoteikoku
8 東京ラッシュ (2019 Remastering) Haruomi Hosono
9 東京 林 和希
10 東京 B'z
```

## おわりに
　なんかいろいろ出来そう。目標はこんな感じのことをする。

 https://qiita.com/su3aki/items/6cbcb84b5a5f962fa228

 プログラミング関係だからQiitaに書いたけど、けっこう喋り言葉のブログっぽくなってしまったから、はてなブログの方に上げた方がよさげだったかな？今後修正するかも。ではまた。