OmniAICreator/Qiita-1.07M huggingface dataset:
車輪の再発明は是非すべきだという持論について


先に**明確な目的**がある場合はその限りではないのだが、基本的に車輪の再発明はしないと **技術の発展は止まる** のではないかという持論を持っている。

UnityやUnreal Engineのリリースにしてもより低レイヤーの理解がないと動作速度の改善など見込みようがないし、**開発言語から何かをビルドする経験**というのは決して無駄にはならない。

こういった、ちょっとズレたコメントが散見されることがあるので異論を呈したい次第

例：

https://qiita.com/kossyprg/items/2b6b10223adf34bce194

＞コメント欄にて
WindowsやLinuxにはtreeコマンドが存在しています。
treeコマンドと比較してあなたが作成したプログラムを利用するメリットは何ですか？


# 車輪の再発明をすべきケース

シンプルなケースで言うと、まず**新しい外観のButtonコントロールやプルダウン型のテキストボックスを用意したい**というのがあったとする。既にあるフレームワークで簡単に実現できるなら、ぜひそうすべきである。

こんなのとか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/ec21277a-66e1-1d0b-f355-2540eae8df6e.png)


しかし、フレームワークの仕様的にこのプロパティを公開していないから設定できないというコントロールもあったりする。WPFではコンボボックスなどがそうだ。Textプロパティがない。



Figma(https://www.figma.com/ja-jp/) というフレームワーク等あるんで、そういうものの扱いを学ぶのもいいけど。


こういう**低レベルで根本的な振る舞いを定義したいケース**では、車輪の再発明をしてその根本レベルの動作を学ばないと、そこから発展させることは困難だ。



自分のアイディアが**既存のライブラリやフレームワークで実現できない場合**は是非車輪の再発明を試みよう。


# 車輪の再発明をすべきでないケース（時間の無駄という意味で）

・単純にゲームを作りたいだけとか、仕組みを学びたいだけならソースコードを見るだけで十分で、あとは豊富なライブラリを使えばよい

### **単純な学習目的での再発明**
・プログラミングの写経は**最も非効率的な学習方法**でもある。
ワーキングメモリなどの不足ははっきり言って些細な事で、PC内のドキュメント類を整理すれば済む話である。

最近、フォーンアイルなるゲームと作者にまつわる逸話を知ったのですが、**才能に欠ける人ほど避けるべき学習方法**だと私は思います。



# いろいろなソフトウェアや業界の動向を知ろう
そもそもの話、最新のフレームワークやツール類を使えば出来てしまう事もけっこうあったりするので（回り道が悪いとは言わないが）、こうした見聞を深めておくのはメリットも大きいです。

それらを知った上でその発展形を作りだすのを目的にしているなら、**車輪の再発明はむしろ出来ないと話にならないのではないか**というのが持論です。

ゲームの基本的な振る舞いだとか、ファイルの操作関連だとか、そういったものはライブラリ化、クラス化が施されてGUIでの統合開発環境（IDE）や言語内で自分で組めるわけですが、やはり低レベルで発展形を作ろうとすると**そう容易ではない**ということです。　
それはGrapeCityの高額な有償コントロールがある事からも明らかでしょう。



# 現行でよく使われるフリーソフトの大半が古いままという現実について

中には、古いソフトを最新のWindows11環境で動かそうとすると不具合が出るものもあります。こういったものを最新の言語で再実装するのは結構有用なのではないかと考えています。
CSharp、C++、FSharpにRustやGoなどいろいろあるんで、そういったものの再実装に挑戦してみてはいかがでしょうか。

例：現在手掛けてる「Twitter用に動画変換するやつ」の再実装（と魔改造）


https://github.com/Sheephuman/HaruaConvert

ちなみにffmpegのライセンスの関係でソースコードの非公開は諦めました(笑)明らかに不便になりそうなので
Logic Designer 開発でのライフハック - ログ出力やデバッグのテクニック

Logic Designerにはログを出力する方法が用意されていますが、Logic Designerのログ出力タスクは system.log に出力されるのでAPサーバにログインしないとログが確認できないという問題があります（適当に作った環境だとログフォルダ参照権限設定してなかったり）

そういった場合、ストレージファイルにログを出力するフローを作成しておくと便利です

![00フロー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/502d1ac4-5f29-b38d-4e48-2cdd71c51d10.png)

####  入出力設定
![in_out.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/4bf0df5b-3b4c-f29b-26cc-b5c8a6332689.png)

####  変数定義
![variable.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/61e8b33a-8cae-469f-2da2-be27a63ee755.png)


####  定数

| 定数ID | 定数値 | 説明 |
|:-|:-|:-|
| DATA_REP1_DATETIME  | \<DATETIME>  |  ログ出力 置換文字１	 |
| DATA_REP2_HEADER  | \<HEADER>  | ログ出力 置換文字２  |
| DATA_REP3_DATA  | \<DATA>  | ログ出力 置換文字３  |
| DATA_TEMPLATE  | \<DATETIME> \<HEADER>：\<DATA>  | ログ出力フォーマット ※末尾改行すること  |
| LOG_FILE_NAME  | debug.log  | ログのファイル名  |
| LOG_OUT_PATH  | /00_test_data/log/  | ログの出力先  |
| TIME_FORMAT  | yyyy/MM/dd HH:m m:ss  | ※mmの間のスペースは絵文字:mm:回避なのでいらないです  |

#### 出力先パス設定（変数操作）タスク
![01_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/48c7bafc-9c5f-1635-bd49-26e0a0f4249b.png)

#### 現在時刻取得（変数操作）タスク
![01_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/e95dfc93-cc9e-c8da-9f42-8b6f2b222312.png)

#### パブリックストレージ取得 タスク
![02_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/ce2abe60-3ffe-9369-8609-2f284d5f8911.png)

#### ストレージ追記（文字列） タスク

ログ出力フォーマットの置換文字を対応する変数で置換してストレージに書き込んでいます。
![02_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/f72ae0a0-b296-e164-a729-3dd7a9f84266.png)


## 使い方
入力引数の headerStr に特定用の文字列、dataJsonStr に(String型の)変数指定すればストレージ上の指定した（ログの出力先＋ログのファイル名）場所にファイルが出力されますのでintra-martのテナント管理 - ファイル操作 などから参照してください。
また、このフローは各種フローの最初で呼び出すと便利です。

こんな雑な感じで
![sample_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/f0287828-159a-c3f7-72ff-1daa962ebb02.png)

セッション情報の flowId を headerStr に
入力\<object>を toJSON して dataJsonStr に設定
![sample_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375174/b515eb16-b823-faac-6845-a67be4337c2b.png)

しておくと、個別でフローをデバッグしたいときにログから対象のフローIDでログを検索して **JSON部分を取得するとそのままデバッグのJSON入力に利用できる** ので便利です。

※日付型とかは そのままJSON入力として利用できないみたいなのでnullとかに修正してみてください。
WindowsにMinGW-w64をインストールする 2025年版

# はじめに
おじさん、普段C++言語でプログラムをするときは、VisualStudio Communityを使っています。
個人は無料で使えますし、やっぱりF9キーでブレイクポイントを設定できたり、F5キーを押すと自動でビルドして実行できるのがとてもよいです。
非常に便利かつ強力なIDEのVisual Studio Communityですが、商用でみんなで利用するには有料のライセンスがいります。
このためおじさんのように、どうしても無料で商用のプログラムを作成したい場合、MinGW-w64とcmakeとVisual Studio Codeを使ってVisual Studio Communityの代わりにします。

このMinGW-w64ですが、ちょくちょくインストール方法が変わるので、今回僕が試した方法を備忘録として書きたいと思います。

# ダウンロード

MinGW-w64は以下のサイトからダウンロードします。
[https://www.mingw-w64.org](https://www.mingw-w64.org)

![q002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/41ab7314-78ae-0206-e64a-495e80684032.png)


いろいろなサイトからダウンロードできますが、w64devkitのサイトのものが最新でかつインストールしやすいので、今回はこちらを利用します。

![q003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/142dfe5a-723e-a79e-c2c3-8d19e762ce75.png)

w64devkitをクリックするとgithubのサイトに飛ぶようです。

[https://github.com/skeeto/w64devkit](https://github.com/skeeto/w64devkit)

![q004png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/8d5eb2a9-6a2f-3be5-7fa9-2ea5163d5f21.png)

右下にある、releaseのところからダウンロードができます。

![q005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/d8e596db-795e-d63d-7770-1a5887900801.png)

今回は2.0のところにある、w64devkit-x64-2.0.0.exeをダウンロードします。

# インストール

ダウンロードしてインストーラーを起動するとインストール先を聞かれるので、インストールしたいフォルダ名を入力します。

![q007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/ddcb991e-6e31-b55c-f47f-0097af48e396.png)

今回の例では「C:\prog\w64devkit」にMinGW-w64がインストールされました。

# 環境変数のパスの追加

このままでは「コマンドプロンプト」からc++のコンパイルができないので、環境変数のパスにMinGW-w64のディレクトリを追加します。

「Windowsボタン」「設定」「システム」「詳細情報」「システムの詳細設定」をクリックし、「システムのプロパティ」を開きます。

![q008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/1d8c32bb-3b31-08dd-4c8d-b5279c4598fc.png)

続けて、「環境変数」を押して、「システム環境」の「Path」を選択し、「編集」ボタンを押します。

![q009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/f33342b5-84f4-0243-ba8d-5a9b48ad333e.png)


「C:\prog\w64devkit」にMinGW-w64をインストールをした場合、パスは「C:\prog\w64devkit\bin」に設定します。「環境変数名の編集」で「新規」ボタンを押し、新規にパスを追加します。

![q010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/b0ae7ec1-2ca6-abe2-b688-682835efd162.png)

# コンパイルできるか確認

「コマンドプロンプト」を開いて適当なディレクトリに「hello.cpp」のファイルを作成します。

```c++
#include<cstdio>
int main()
{
	printf("Hello MinGW-w64\n");
	return 0;
}
```
コマンドプロンプトから「x86_64-w64-mingw32-g++ hello.cpp」のように入力し、コンパイルができれば、正しくパスが設定されています。

![q011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914335/6a47394a-0bd6-6e09-9fd9-05629bdfb62d.png)

以上でMinGW-w64のインストールは完了です。

# おまけ

Visual Studio Codeなどを追加でインストールし、C++の設定をすれば、WindowsでIDEを使った高度なデバッグを行うこともできます。
F9キーでブレイクポイントなども設定できるので、Visual Studio Communityと同じように使うことができます。

VSCodeでC++のcmakeビルド環境構築
[https://qiita.com/JuvenileTalk9/items/fbb09d43051995bb5350](https://qiita.com/JuvenileTalk9/items/fbb09d43051995bb5350)
初心者向けPyTorch篇: 1.PyTorchのインストール


# PyTorchのインストールガイド

PyTorchは、機械学習研究やアプリケーション開発に広く使用される強力なオープンソースの機械学習ライブラリです。ここでは、Pythonが既にインストールされている前提で、PyTorchをインストールする手順を解説します。

## 前提条件

- Pythonがインストール済みであること。未インストールの場合は、[Python公式サイト](https://www.python.org/downloads/)からダウンロードしてインストールしてください。

## PyTorchのインストール手順

1. **PyTorchの公式サイトにアクセス**  
   PyTorchのインストールは、[公式サイト](https://pytorch.org/)から行います。

2. **環境の選択**  
   - **Stableバージョン**を選択します。
   - **OS**（例: Windows, macOS, Linux）を選びます。
   - **Language**は`Python`を選択します。
   - **CUDA**のサポートが必要な場合（NVIDIA GPUを持っている場合）は、適切なCUDAバージョンを選択します。GPUがない場合は`CPU`を選択します。

3. **コマンドのコピーと実行**  
   サイトに表示されるコマンドをコピーし、Pythonがインストールされているコンピュータのコマンドラインまたはターミナルに貼り付けて実行します。

### 例：WindowsでCPUのみの場合のインストールコマンド

```bash
pip install torch torchvision torchaudio
```

### 例：WindowsでCUDA 12.4を利用する場合のインストールコマンド

```bash
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
```

## インストール後の確認

インストールが完了したら、Python環境で以下のコマンドを実行してPytorchが正しくインストールされているかを確認します。

```python
import torch
print(torch.__version__)
print("CUDA Available:", torch.cuda.is_available())
```
- CPUのバージョンCUDA Available出力: False
- GPUのバージョンCUDA Available出力: True
上記で出力が確認できたらPytorchのインストールは完了です。
win11 24H2 でQuick Launch クイックランチ

まずexplorer pacher をアンインストールしないと Win11 24H2 のupdateが途中で止まるようです。
でアンインストールしました。24H2のインストールが完了すると、quick launchが消えています。
マジでms UI変えるの犯罪だってば、人の財産権の侵害だって

というわけで、quick launch復活の手順
以下の手順には省略できるところがあるかもですが、、
exploere pacher をインストールする。
https://github.com/valinet/ExplorerPatcher/releases/tag/22621.3880.66.6_92fce8c
にある ep_setup.exe をダウンロードしてインストールする。
同ページにあるように関係フォルダをdefenderの対象から除外する。
私はpowershellスクリプトでうまくいかなかった気がするので、ひとつづず手で追加しました。
設定/プライバシーとセキュリティ/windowsセキュリティ/ウイルスと脅威の防止/
ウィルスと脅威の防止の設定の下にある｢設定の管理｣を開く
一番下の除外 の下にある　｢除外の追加｣

除外フォルダとして以下を追加  **** 部はユーザ名
C:\Program Files\ExplorerPatcher
c:\users\****\APPDATA\roaming\ExplorerPatcher
C:\Windows\SystemApps\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy
C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy
除外ファイルとして以下を追加
Add-MpPreference -ExclusionPath "C:\Windows\dxgi.dll"

その上で、ファイル名を指定して実行でexplorer pacherのプロパティダイアログを開く
C:\Windows\System32\rundll32.exe "C:\Program Files\ExplorerPatcher\ep_gui.dll",ZZGUI

で、次がポイントで
プロパティのタスクバーのスタイル　多分windows10になっていで　ダメなんですよ、、なんて
感じのことが書かれているので、クリックすると以下のDropDownListが出てくる。
　windows11(規定)
　windows10
　windows10(ExplorerPacher) 

  windows10(ExplorerPacher) を選んで、
  同ダイアログ左下にある、エクスプローラを再起動　をクリック。

  するとタスクバー右クリックで ツールバーメニューが出てくるようになります。

  そのあとは以前と同じですが書いておきますと、
  新規ツールバー　メニュークリック　出てきたダイアログのフォルダに以下を入れると、
  %SystemDrive%\Users\%username%\AppData\Roaming\Microsoft\Internet Explorer
  以下のようなダイアログが開く。
  ![ql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107685/3c3598f7-0eee-53f0-12f2-f789981a35b9.png)

中央ペインにQuick Launch が現れるので
Quick Launch フォルダをダブルクリックして開いてからフォルダの選択をクリック

です。ふぅ大変だった。
【TryHackMe】Junior Security Analyst Intro：Walkthrough

# 概要

TryHackMe「Junior Security Analyst Intro」のWalkthroughです。

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

# Task1

## **Q1**.*What will be your role as a Junior Security Analyst?*

**A**.**Triage Specialist**

# Task3

## **Q2**.*What was the malicious IP address in the alerts?*

**Hint**.*What alert message shows an unauthorized connection attempt?*

SSH認証に失敗したログが怪しいです。

![q2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/2b51b7f7-2065-1185-22ea-7486e5f522f8.jpeg)

![malicias.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/806e1d35-088b-b5f8-1610-51ea2b1f87a0.jpeg)

**A**.**221.181.185.159**

## **Q3**.*To whom did you escalate the event associated with the malicious IP address?*

`SOC Team Lead`にエスカレーションします。

![q3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/2f7e2df4-6fcc-811f-502d-93227ee4c027.jpeg)

**A**.**Will Griffin**

## **Q4**.*After blocking the malicious IP address on the firewall, what message did the malicious actor leave for you?*

ブロックリストにIPアドレスを追記します。

![block.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9bbf3e75-114f-3b94-b102-7cdde794236c.jpeg)

フラグを入手できます。

![flag.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4f0b2354-b749-2307-3878-b3ebbc08757f.jpeg)

**A**.**THM{UNTIL-WE-MEET-AGAIN}**
eclipse vm引数の設定が、なぜか保存されなかった

# 経緯
eclipseにて、クライアント側のjspのページで、IPアドレスを取得して、それをサーバーに送ろうとしていました。
そのIPアドレスを取得するコードが以下。
```java
String ipAddress = request.getRemoteAddr();
```
  
これで実行したところ、取得したIPアドレスの形がipv6に...
![スクリーンショット 2024-10-19 171040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/43546dae-ea64-707c-6cfb-462f020997fd.png)

この問題を解決するため、調べたところ、vm引数に以下の文字列を追加すればいい、ということが分かりました。
```
-Djava.net.preferIPv4Stack=true
```
なので、vm引数の設定方法で、調べて出てきた、以下の手順で設定を行ってみました。

# 最初に試した方法
1. 使用しているサーバーを右クリックし、「開く」。
![スクリーンショット 2024-10-19 171358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/6fb585f4-9424-d4b5-5b49-f2cd12e9a809.png)

2. 一般情報の欄にある、「起動構成を開く」をクリック。
![スクリーンショット 2024-10-19 171423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/f7e45c6a-95e1-87e7-7f70-73e6b8f54a37.png)

3. 「引数」タブの「VM引数」の最後の行に、追加する。
![スクリーンショット 2024-10-19 171507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/8b163db2-47e0-d7c8-08ec-f47cce1ac18e.png)

あとは、適用して、再実行するだけでしたが、
![スクリーンショット 2024-10-19 171040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/43546dae-ea64-707c-6cfb-462f020997fd.png)
変わっていなかった。
（ちゃんと変わったときもあったが、eclipseの再起動？サーバーの再起動？で元に戻っていた。）

再度、設定を確認してみると、
![スクリーンショット 2024-10-19 172324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/018ecb9f-a6ef-73c3-b369-048e1222b5a7.png)
追記したはずの、設定が消えていた。
  
この方法だと、なぜか設定が保存されず、うまくいかなかったので、その後も調べてみたところ、新たに2つの方法が見つかりました。
そのうちの一つは、eclisepの設定から、tomcatのJVM設定を触る方法なのですが、
なぜか自分のeclipseには、tomcatの選択肢がなかったので、とりあえず、もう一つの方法で動かすことにしました。

# 解決できた別の設定方法
1. 「ウィンドウ」から「設定」をクリック。
![スクリーンショット 2024-10-19 164610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/8e2fda47-aab6-3a55-c901-984a62484fc7.png)

2. 「Java」の「インストール済みのJRE」から、使用しているJREを選択して「編集」ボタンをクリック。
![スクリーンショット 2024-10-19 173909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/66091805-9e7b-2b4b-6ab4-c725a2567da3.png)

3. 「デフォルトのVM引数」に、入れたい引数を追記し、適用する。
![スクリーンショット 2024-10-19 174103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/1ea416e1-5f83-2903-ede8-fce3282c2eea.png)
  
これでようやく、IPアドレスを、ipv4で取得することができました。
![スクリーンショット 2024-10-19 174259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/95fd773a-c7d2-675a-44a4-cae6d2a49726.png)

# おわりに
今回、解決した方法は、見つけるのに少し時間がかかったので、自分でもまとめてみました。
参考にしたサイトのURL：https://write-remember.com/archives/4883/

以上です。
【Android】WebViewのRestore方法まとめ

# はじめに
WebViewは一歩踏み込んだことをしようとすると非常に手間のかかるUIである印象なのですが、画面の回転などをサポートしている画面でWebViewを使うと状態を保持しておかないと初期化されてしまうなんてことになりますよね。
そこで今回は、WebViewのRestore方法を備忘録的にまとめておこうと思います。

# Restore方法
状態の保持、復元方法はそれほど複雑な処理は必要ありません。
それぞれの関数で状態の保持、復元するだけになります。

```main.kt
override fun onViewStateRestored(savedInstanceState: Bundle?) {
   super.onViewStateRestored(savedInstanceState)
   savedInstanceState?.let {
      binding.webView.restoreState(it)
   }
}

override fun onSaveInstanceState(outState: Bundle) {
   super.onSaveInstanceState(outState)
   binding.webView.saveState(outState)
}

```
基本的にonViewStateRestoredで復元、onSaveInstanceStateで状態保持というのは他のUIと同等ですが、WebViewの場合はそれぞれ復元、状態保持用の関数が用意されているので、そちらにBundleを渡してあげる形になります。
これでRestoreの設定は以上になります。

# さいごに
ようやく弊社のオフィス移転作業が落ち着いてきました、やはり新しい環境というのは気持ちが良いものですね。
Raspberry piで自動起動項目を設定する（2024/10/19時点）

Raspberry piの自動起動、いつもいつもいつもいつもやるたびに仕様が変わっていて
古いやり方で動かないを繰り返している。

どうもlxsessionに入れる方のautostartが使えなくなったらしく色々調べてたら動いた。

ターミナルでsudo raspi-configする
6 Advanced Options
A6 Wayland
で、w1 X11を選べば上に書いたlxsessionの中に記述する方法が使える。
通常はw2 Wayfireになっているっぽい。こっちの方が起動が早いとかなんとか。

Wayfireでやる方法
nano ~/.config/wayfire.ini
一番下に
[autostart]
適当な名前 = 実行するコマンド

でセーブして再起動。これだけ。
プログラミング言語の学習で知りたい内容をChatGPTにまとめさせるテンプレート

先日、[プログラミング言語やフレームワークの学び方](https://qiita.com/ktat/items/c5e22a7cc47e41fd4b95)を書いたので、せっかくだから、「ポイントをまとめてChatGPTに投げたらまぁまぁまともなドキュメントを作ってくれるんではないか？」という淡い期待を持ったので、やってみました。

## テンプレート

プログラミング言語〇〇についての解説を、初心者向けに書いてください。
解説内容として、以下の観点をすべて考慮した上で公式のドキュメントを情報源として記載してください。また、各解説の最後に参照したURLを、リンクせずにURL自体を記載してください。

- 言語の慣例や作法
  - 変数の命名
  - 標準的なファイル構成
  - コメントの書き方
  - その他の慣例や作法があれば追記する
- 基本的なコマンドの使い方
  - 実行方法
  - コンパイル方法
  - ドキュメントを読む方法
  - その他よく使われるものがあれば追記する
- 基本的な文法
    - 定数、変数宣言と基本的な型
    - slice, map 等のすべてのコレクション
        - すべてのコレクションについて、代入、追加、削除などの操作方法
    - 環境変数の取得、セット
    - 文字操作
      - 追加、部分切り取りなど
    - キャスト
    - ループ処理
         - すべてのループ処理方法
         - break, continue, label等があれば、そのサンプルも
    - 条件分岐
    - 変数の比較方法および優先順位があれば
    - 真偽値の取り扱い
    - 正規表現
    - エラーハンドリング
    - ファイル操作
    - 標準入力操作
    - 標準エラー出力
    - 関数の作り方
    - 型の作り方
    - クラス・メソッドの書き方
    - 非同期処理
    - その言語に固有な文法(例: Goであれば、interface, generics, channel, groutine、Rustであれば、Option/Result, trate など)
- 以下の仕様のサンプルコードを生成してください。制約として標準的な機能及び標準モジュールのみを使用してください。非同期処理が不可能な場合は、同期処理で実現してください。無理な場合は、「Hello World」を出力するコードでも良いです
    1. 標準入力から、英数字混じりの文字20桁を受け取る
    1. 英語の大文字小文字数字の3種類が含まれているかどうかを正規表現を利用してチェックする
         1. 含まれていなければエラーを表示してexit code 1で終了する
    1. 英語の連続と数字の連続をカンマ区切りでわけて配列に入れる
    1. 配列をの中に重複したものが含まれていれば、その数を計算する
    1. 先程計算したユニークな配列の要素と数を2列のCSVとして複数ファイルに並行処理で書き出す
         1. ファイル名は各要素の先頭文字.csv とする
    1. すべての処理が完了するまで待つ
    1. 処理が完了したことを標準出力に表示する
    1. exit code 0 で終了する

## 結果

選んだ言語は思いつきなので、特に思うところはありません。内容の正確性は確認しておりません(テンプレは若干変えてる場合があります)。

- [Rust](https://chatgpt.com/share/67135747-35b8-800b-af92-3335bd0d3e3b)
- [Go](https://chatgpt.com/share/67135ce9-bc50-800b-bc9c-5ea1441709a8)
- [Java](https://chatgpt.com/share/67136120-b0fc-800b-aa19-66dc398178b7)
- [Python](https://chatgpt.com/share/67135e59-6334-800b-86b9-b84d7e232fb6)
- [Perl](https://chatgpt.com/share/67136fce-e2cc-800b-a943-0b2827403c9e)
- [Ruby](https://chatgpt.com/share/67137049-3878-800b-a1c6-1887c79c466e)
- [TypeScript](https://chatgpt.com/share/6713710a-d4d4-800b-81fb-1d7c23d287d3)
- [Lua](https://chatgpt.com/share/6711b493-9a04-800b-bde3-69d38edba366)
- [C](https://chatgpt.com/share/67136dd9-193c-800b-a960-653416bd7278)
- [Scheme](https://chatgpt.com/share/67136f08-5a78-800b-8e72-498495b14487)
- [Prolog](https://chatgpt.com/share/67135ddc-8ae0-800b-93f5-9fd84ea78385)
- [COBOL](https://chatgpt.com/share/67135d6c-0ee8-800b-a5c9-afab5757188b)
- [なでしこ](https://chatgpt.com/share/67136d28-8aac-800b-a7e0-86243ffa76ff)
- [N88 BASIC](https://chatgpt.com/share/67135ed2-4c94-800b-ad40-0eb92fd4ed74)
- [BrainFuck](https://chatgpt.com/share/6713700e-b188-800b-8bda-1476137ac8ae)

## 終わり

クオリティはイマイチですが、ざっくり知りたいだけなら良いかもしれません。
docker compose でMySQL

## docker-compose でMySQLを立ち上げ、ポート番号を変更してみる

### インストール（例）
~~~
dnf -y remove podman runc
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
dnf --enablerepo=docker-ce-stable -y install docker-ce
systemctl enable --now docker


wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64

chmod +x /usr/local/bin/docker-compose
~~~

### ディレクトリ構成（例）
~~~
├ db
│   ├ conf.d （/etc/mysql/conf.d）
│   │  └ my.cnf
│   └ mysql_data （/var/lib/mysql）
└ docker-compose.yml
~~~

### docker-compose.yml の内容
~~~
	services:
	  mysql:
	    image: mysql:8.0.18
	    ports:
	      - "13306:3306"
	    environment:
	      MYSQL_ROOT_PASSWORD: PassWord1234
	      MYSQL_DATABASE: mysqldb
	      TZ: "Asia/Tokyo"
	    restart: always
	    volumes:
	      - ./db/mysql_data:/var/lib/mysql
	      - ./db/conf.d:/etc/mysql/conf.d
~~~

image： 8.0.18のバージョンを指定
ports： 13306は外側のポート番号。ここにクライアント側から接続する
MYSQL_ROOT_PASSWORD： rootのパスワード
MYSQL_DATABASE： データベース名
TZ： タイムゾーンの指定
volumes： 右側のディレクトリが、実体のどこになるかという風に記載する
　./db/mysql_data:/var/lib/mysql　：MySQLのデータが入る場所
　./db/conf.d:/etc/mysql/conf.d　：コンフィグファイルの置き場所

### 起動
~~~
docker-compose up -d mysql
~~~

### 接続例
~~~
mysql -u root -p -h 127.0.0.1 --port 13306
~~~
注：-h localhostだとうまくつながりません。（ネットワーク経由にならない模様）


### 停止
~~~
docker-compose down
~~~
FoltiaAnimeLockerでのTOKYO MXマルチ編成対策

## TOKYO MX のサブチャンネル分離処理失敗を無くしたい
普段のテレビ録画にFoltiaAnimeLockerを使っていますが、自分の環境の問題なのかここ数日(2024年10月4日あたりから)TOKYO MXの放送を録画したファイルのMP4エンコード処理が映像はMX1、音声はMX2のような状態になってしまい、手動でエンコードを回したりでしたが、エンコードスクリプトに手を加えることで一応なんとか収束したので、誰かのお役にたてればと記事にまとめておきます。

## やったこと
TOKYO MXの録画ファイルだけ通常の変換処理の前に「下ごしらえ」をしたものに差し替えて既存の処理に流してしまい、処理が終わったところで差し替えたものを元に戻すというシンプルかつ強引な手法で対応しました。

/home/foltia/Perl/ipodtranscode.pl 内の変数 ${filenamebody に値が入ってから ffmpeg の処理が始まるまでの間の部分に次のコードを挿入します。
~~~Perl:/home/foltia/perl/ipodtranscode.pl
# 対象のソースがTOKYOMX (ファイル名 *-20.m2t) であれば TOKYOMX2 削除
# MX処理退避ファイル戻し処理（前回途中終了時の処理）
 my @mxfile = glob("$recfolderpath/*_MX.m2t");
 foreach my $mxfile (@mxfile) {
   (my $orgfile = $mxfile) =~ s/_MX\.m2t$/\.m2t/;
   rename("$mxfile","$orgfile");
 }#endforreach
# TsSplit
  if ($inputmpeg2 =~ /-20\.m2t$/){
  if(-e "$toolpath/perl/tool/TsSplitter.exe"){
    # 一致した場合、TsSplitter.exe -CS23608 を実行
    &writelog("ipodtranscode TOKYOMX $inputmpeg2");
    system("wine $toolpath/perl/tool/TsSplitter.exe -SD -1SEG -CS23608 $inputmpeg2");
    if(-e "${filenamebody}_CS1(23608).m2t") {
      rename("${filenamebody}.m2t","${filenamebody}_MX.m2t");
      rename("${filenamebody}_CS1(23608).m2t","${filenamebody}.m2t");
      }#endif -e ${filenamebody}_CS1(23608).m2t
 }#endif TsSplitter.exe
 }#endif $inputmpeg2 =~ /-20\.m2t$/
~~~

同じスクリプト内のCMカット処理が終わってEXITする直前の部分に次のコードを挿入します。
~~~Perl:/home/foltia/perl/ipodtranscode.pl
# MX処理退避ファイル戻し処理（後処理）
 my @mxfile = glob("$recfolderpath/*_MX.m2t");
 foreach my $mxfile (@mxfile) {
   (my $orgfile = $mxfile) =~ s/_MX\.m2t$/\.m2t/;
   rename("$mxfile","$orgfile");
 }#endforreach
 ~~~

とりあえず動いているので何かの参考になればと思います。
paiza.ioでc# その10

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
切り上げ、切り下げ、四捨五入せよ。

# サンプルコード

```

using System;

public class Hello {
    public static void Main() {
        float value = 2.5f;
        double value2 = 2.5;
        Console.WriteLine(value);
        //切り上げ
        value = (float) Math.Ceiling(value2);
        Console.WriteLine(value);
        //切り下げ
        value = (float) Math.Floor(value2);
        Console.WriteLine(value);
        value = (float) Math.Truncate(value2);
        Console.WriteLine(value);
        //四捨五入
        value = (float) Math.Round(value2, MidpointRounding.AwayFromZero);
        Console.WriteLine(value);
        System.Console.WriteLine("Hello C#");
    }
}




```

# 実行結果

```
2.5
3
2
2
3
Hello C#
```

# 成果物

https://paiza.io/projects/guggAFHrNyGQVrMlNQgepw

以上
ハーフトーンシェーダー

**追記:** [アセットストア](https://assetstore.unity.com/packages/vfx/shaders/ezhalftone-full-screen-comic-shader-300621)で販売を始めました。
フルスクリーンのハーフトーンシェーダー、ディザシェーダ―等も含まれています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/WYxqMi1YvCE?si=AykgLB8LFaDr3RIk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/57bdf60e-ef6d-8044-84d3-0b806b1132c5.png)
テクスチャに対してハーフトーンを適用するシェーダーです。
URPおよびBuiltinで使用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2de16e14-64f1-40c5-01ea-9ec5c19216d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d57e4244-0f13-6a18-2972-dbe286a7880f.png)

こちらを参考にさせていただきました。
ハーフトーンにボロノイを使うのは目からウロコでした…。
<iframe width="560" height="315" src="https://www.youtube.com/embed/3iZrZrEWQuA?si=YwzDGs4H7OuuZq1I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
UIコンポーネントライブラリの使用にあたる注意点

UIライブラリは、Bootstrapなどのフレームワークのような大規模なものでない限り、結構な確率でメンテが打ち切られる。
なぜならメンテするモチベーションがなくなるため。
そのため、自前でも割と簡単に実装できるものに関しては特に、採用に関しては慎重になったほうがいい。
react-componentのように、例外的に息が長いものもある。
そういうものの場合は採用してもいいかもしれない。
自前で実装できそうなものはライブラリの一部を取り入れるなどして、自前で実装してしまうのがいいかもしれない。
第七章 文档管理功能开发

## 1.文档表设计与代码生成
#### ①在DBeaver中生成文档表doc
#### ②在代码生成器generator-config中：
```java
<table tableName="doc"/>
```
启动:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/938a6cff-0cc8-dc05-bb0f-9918681f21d1.png)
自动生成四个类√
## 2.完成文档表基本增删改查功能
#### 按照分类管理，复制出一套文档管理的代码
后端⑤：controller层   service层   req   SaveReq   Resp
前端：admin-doc  router路由  电子书中写入口
## 3.使用树形选择组件选择父节点
#### 编辑表单中的父文档选择框改为树形选择组件，完成编辑功能
## 4.Vue页面参数传递完成新增文档功能
## 5.增加删除文档功能
【Oracle認定Java最上位資格】Java Gold（Oracle Certified Java Programmer, Gold SE 11）の概要と勉強方法について

はじめに
Softbankのテックブログで記事を書いたので紹介します！

本記事では、私が2024年1月に取得したJava Gold（Oracle Certified Java Programmer, Gold SE 11）について試験概要と勉強方法について紹介しました！
Java Silverに合格して、レベルアップするか検討中の方には特におすすめの記事です！

https://www.softbank.jp/biz/blog/cloud-technology/articles/202409/java-gold/

ぜひ読んでみてください！
【学習】deviseフラッシュメッセージ表示方法+新規登録失敗時、フラッシュメッセージ表示させたい

`devise`をはじめて利用して認証機能を実装しています。フラッシュメッセージの表示方法で少し「？」だったことが無事に解決したので記事に残しておきたいと思います。

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



## わからなかったこと
ログインに失敗した時`devise.views.ja.yml`ファイルの`ja:devise:failure`の`invalid: "%{authentication_keys}またはパスワードが違います。"`が呼び出されてフラッシュメッセージが表示されている

新規登録に失敗したとき、同じようにしたく`ja:devise:registrations`に     `failure: アカウントの登録に失敗しました。入力内容を確認してください`を配置したがフラッシュmessageが表示されない。成功したときの`signed_up: アカウント登録が完了しました。`は表示されている。
何が原因なのか？失敗は自分でカスタマイズしたものだから？deviseが自動的に処理していないのか？


## 考えられる原因
新規登録時のフラッシュメッセージが表示されない原因は、Deviseが自動的に処理していないため。
ログイン時の失敗メッセージは、Deviseが内部で定義された方法で自動的に設定されている。
しかし、新規登録の失敗時は、Deviseのデフォルトの動作ではフラッシュメッセージが設定されない


### **Deviseの動作について**

- **ログイン失敗時**: Deviseは自動的に `flash[:alert]` に失敗メッセージを設定します。このメッセージは、`ja:devise:failure` で定義された内容が表示されます。
- **新規登録失敗時**: 新規登録が失敗した場合、Deviseは `flash[:alert]` を設定しません。そのため、カスタマイズした `ja:devise:registrations` に「failure」メッセージを追加しても、表示されないのです。


### **新規登録のフラッシュメッセージを表示させる方法**

新規登録が失敗したときにフラッシュメッセージを表示させるためには、以下のように独自のコントローラーを作成して、フラッシュメッセージを設定する必要があります。

### ステップ 1: コントローラーの作成

まず、`app/controllers/registrations_controller.rb` に新しいコントローラーを作成します。Deviseの `RegistrationsController` を継承して、新規登録の作成メソッドをオーバーライドします。

```
class RegistrationsController < Devise::RegistrationsController
  def create
    super do |resource|
      if resource.errors.any? # もしエラーがあれば
        flash[:alert] = I18n.t("devise.registrations.failure") # カスタムメッセージを設定
      end
    end
  end
end
```

### ステップ 2: ルーティングの設定

`config/routes.rb` を開いて、Deviseがこのコントローラーを使用するように設定します。
```
devise_for :users, controllers: { registrations: 'registrations' }
```
### ステップ3. **翻訳ファイルの設定**

`devise.views.ja.yml` に以下のように設定を加えます。
```
ja:
  devise:
    registrations:
      signed_up: 'アカウント登録が完了しました。'
      failure: 'アカウントの登録に失敗しました。入力内容を確認してください。'
```


[![Image from Gyazo](https://i.gyazo.com/125766eacbd9529f4a03eaf21210e1db.png)](https://gyazo.com/125766eacbd9529f4a03eaf21210e1db)

やった:laughing:


## ついでにおまけ
- Devise は通常、コントローラーに明示的に`flash[:notice]` や `flash[:alert]` を設定しなくても自動的にメッセージを管理している。つまり自分でコードを書かなくてもOK
- どこの内容をエラーメッセージとして引っ張ってきているのか確認は必要
- 上記の新規登録時のメッセージ表示を実装する前に下記項目は行う事！

## フラッシュmessage表示の共通化
`app/views/layouts/application.html.erb` で `app/views/shared/_flash_message.html.erb `を呼び出す記述をすることで、どのページでも `flash` にキーバリューが渡されるとフラッシュメッセージが表示されるようになる

この部分はdeviseもsorceryも同じ

```
$ touch app/views/shared/_flash_message.html.erb

# app/views/shared/_flash_message.html.erb
<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>">
    <%= message %>
  </div>
<% end %>
```
```
# app/views/layouts/application.html.erbのbody部分に追加
<%= render 'shared/flash_message' %>
```


https://autovice.jp/articles/da5ce1e9d4df6a43

👆記事のメッセージ表示方法で`application.html.erb`が関係していることを知り、はっ！！となり、カリキュラム改めて確認したら、、そういう事か。
deviseがどこまで自動的に処理してくれているのか少し把握することができてよかったです。
今回の記事が何か参考になれば幸いです。
保留中)M5NanoC6、スレーブI2Cで「46」を返して遊ぶ。(M5NanoC6は、よみだしモードに対応してなさそう?


工事中


いろいろ
I2C系をakb48の歌のようにヘビーローテーションする予定
ついて、来れるかな
もしかしたら、M5NanoC6は、よみだしモードに対応してなさそう?
(UNO3 I2Cホスト　READモード)←→(StampS3 I2Cスレーブ　)は、いった


たぶんうごかない


```c++



//I2C_Slave_A_M5NanoC6_1


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


//初期化処理
void setup() {

  //i2cの初期化
  Wire.begin( (0x80)>>1 );      //I2Cスレーブアドレスの設定
  Wire.onRequest(requestEvent);

}//setup


//メインループ
void loop() {
  delay(1); //ダミー
}//loop


//I2Cの読み取り関数
void requestEvent() {

  //値の送信
  Wire.write( 'A' );

}//requestEvent


```

```c++




//I2C_MAIN_A_M5StampS3_1


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


//初期化
void setup()
{

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

} //setup


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

  // I2Cスレーブにデータを要求する
  Wire.requestFrom( (0x80)>>1 , 1);

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

  if(ii != 0 ){
    Serial.print( data_read[0] ); //受信した文字を表示する
  }else{
    Serial.print( "[ERR]" );
  }
  delay(1000); //1秒待つ

} //loop


```
【ほぼ自分用】Qiitaでmermaidを使用してダイアグラムを出力する

# mermaidって？
プログラミングや開発などを行うにあたって、データの構造や流れをUMLで表したり、データベースの構造をER図で記述することがあると思います。

mermaidはテキストベースでダイアグラムを生成できるツールで、シンプルな構文を用いてクラス図やフローチャート、シーケンス図、ER図などの様々なダイアグラムを簡単に作成し図示することが可能です。
mermaidのルールに従ってコードを記述するだけで作成したダイアグラムをビジュアル化して生成でき、それをQiitaなどの記事上に手軽に挿入できる点が魅力です。

#　簡単な書き方
Mermaidでダイアグラムを作成する際の基本ルールを以下にまとめます。

## 1. クラス図（Class Diagram）
classDiagramと記述して開始します。
class クラス名 {}でクラスを定義し、内部にフィールドやメソッドを定義します。
クラス間の関係は、次のような記号で表現します:
```
-->：依存関係
--|>：継承関係
*--：コンポジション（全体と部分）
o--：集約（部分は全体の一部だが、全体が消滅しても部分は存在可能）
```

```
classDiagram
  class User {
    +String name
    +String email
    +login()
    +logout()
  }
  class Post {
    +String title
    +String content
    +publish()
    +delete()
  }
  User --> Post : creates
```

```mermaid
classDiagram
  class User {
    +String name
    +String email
    +login()
    +logout()
  }
  class Post {
    +String title
    +String content
    +publish()
    +delete()
  }
  User --> Post : creates

```

## 2. シーケンス図（Sequence Diagram）
sequenceDiagramと記述して開始します。
participant 名称で各オブジェクトを定義します。
矢印でオブジェクト間のメッセージを記述します:

```
->>：同期メッセージ
-->>：非同期メッセージ
```

```
sequenceDiagram
  participant User
  participant Server
  participant Database

  User->>Server: Login request
  Server->>Database: Check credentials
  Database-->>Server: Valid credentials
  Server-->>User: Login successful
```
```mermaid
sequenceDiagram
  participant User
  participant Server
  participant Database

  User->>Server: Login request
  Server->>Database: Check credentials
  Database-->>Server: Valid credentials
  Server-->>User: Login successful

```

## 3. ER図（Entity Relationship Diagram）
erDiagramと記述して開始します。
テーブルはテーブル名 {}で定義し、内部にカラムを記述します。
テーブル間の関係は以下の記号で定義します:

```
||--||：1対1の関係
||--o{：1対多の関係
o{--o{：多対多の関係
```

```
erDiagram
  USERS {
    INT id
    VARCHAR name
    VARCHAR email
  }
  POSTS {
    INT id
    VARCHAR title
    TEXT content
    INT user_id
  }
  USERS ||--o{ POSTS: "has"
```

```mermaid
erDiagram
  USERS {
    INT id
    VARCHAR name
    VARCHAR email
  }
  POSTS {
    INT id
    VARCHAR title
    TEXT content
    INT user_id
  }
  USERS ||--o{ POSTS: "has"
```

Qiitaなどのマークダウンで記述する際は「```mermaid」と記述することのよりビジュアル化されます。
これらのルールを守ることで、Mermaidを使って簡単にダイアグラムを作成できます。
【Jenkins】GitHubリポジトリのScan Repository Nowに時間がかかる

# GitHubリポジトリのリポジトリスキャンに時間がかかる
GitHubリポジトリに対して`Scan Repository Now`を実行すると以下ログが表示されてスキャンが終わらない問題に遭遇した。
ログ内容としてはGitHubAPIのレート制限に引っかかっているかららしい
```
15:55:22 Connecting to https://api.github.com with no credentials, anonymous access
15:55:23 Jenkins-Imposed API Limiter: Current quota for Github API usage has 52 remaining (1 over budget). Next quota of 60 in 59 分. Sleeping for 5 分 12 秒.
15:55:23 Jenkins is attempting to evenly distribute GitHub API requests. To configure a different rate limiting strategy, such as having Jenkins restrict GitHub API requests only when near or above the GitHub rate limit, go to "GitHub API usage" under "Configure System" in the Jenkins settings.
15:58:24 Jenkins-Imposed API Limiter: Still sleeping, now only 2 分 10 秒 remaining.
16:00:36 Jenkins-Imposed API Limiter: Current quota for Github API usage has 49 remaining (1 over budget). Next quota of 60 in 54 分. Sleeping for 4 分 36 秒.
16:00:36 Jenkins is attempting to evenly distribute GitHub API requests. To configure a different rate limiting strategy, such as having Jenkins restrict GitHub API requests only when near or above the GitHub rate limit, go to "GitHub API usage" under "Configure System" in the Jenkins settings.
```

# 解決方法
**JenkinsにGitHubの`Personal access tokens`を登録して、GitHubの認証を通す。**

1. [GitHubの`Personal access tokens`を作成する](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#personal-access-token-classic-%E3%81%AE%E4%BD%9C%E6%88%90)
2. 作成した`Personal access tokens`をJenkinsに認証情報を登録する。
    - 登録画面の場所
 ダッシュボード→Jenkinsの管理→認証情報→(global)→Add Credentials
    - 以下情報を登録画面に入力する。
    - 種類 ユーザー名とパスワード
    - ユーザー名 GitHubのユーザー名
    - パスワード 作成した`Personal access tokens`
    - ID 登録情報を識別できる好きな名前にする。
3. ジョブに認証情報を使うように設定する。
    - 設定画面の場所
    ダッシュボード→My-Pipeline→Configuration

`Credentials`項目で認証情報を登録したGitHubのユーザー名を選択する(例: `username/*****`)
pathlibでパスを指定する

# はじめに
PythonVtuberサプーさんのpython練習動画で問題を読んでいるとき、フォルダやパス、ディレクトリにかかわる問題に出くわしました。

https://www.youtube.com/watch?v=U-_43dmdV_I

# 現状
パスの問題で、どうしても処理が実行されない。

特にエラーも起きることなく、コンソールにも何も表示されない。おそらく、パスが上手く指定できていないのが問題かなと思いました。

# 対応策
パスを修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953952/4185ad47-b286-2e5f-21cc-0dd75cd7e088.png)

ファイル構成が以上のようになっているので、

プログラムが起動したファイルの位置の、親の親という風に指定すると、処理が上手く実行されました。

```python
current_dir = Path(__file__).resolve().parent.parent
```
Path(__file__)　→　実行中のPythonファイル名を取得
resolve()　→　絶対パスを相対パスに変換
parent　→　親ディレクトリに移動



もっと良い書き方があると思いますが、とりあえず今回はこれでクローズしようと思います...:relieved:

パスを指定するときは、自身が扱うファイルやフォルダがどこにあるのかよく確認するべきだと学びました...
World Form Tokyo (2024.10.15-16) に参加したので印象に残ったことをいくつか[ServiceNow]

# 参加レポート
World Form (2024.10.15-16 プリンスパークタワー東京) に参加したので印象に残ったことをいくつか。


## ■ ServiceNow側ブース
### 業界別ソリューション

通信業界と金融業界のソリューションが興味深かった。適切な売り込み方をすれば成功の可能性がある。
- 通信業界: SPM、CMDB、ITOM、ITSM、CSMを組み合わせた総合的なソリューション。長期的なロードマップの提示が必要だが、アプローチは良いと感じた。
- 金融業界: 実現可能性を感じた。定型業務のコスト削減の可能性はあるか。

業界横断的な共通ソリューションの真剣な検討は価値があるので、引き続き注視と、こちらも事例化に導いていきたい。

### AIソリューション

- 350個のアップデートは印象的。実務に適用可能なAIへの期待感・現実感が高まっていると感じた。
- Copilotは日本語対応と独自RAG機能が自然にできるため、AI導入の主要な障壁を克服できると思った。
- 一方、比較的安価なOpenAI（ChatGPT）のAPIとの競争が課題。
→NowAssistには見切りをつけて、独自RAGへ接続させている勢力も散見するが、そちらとの動向が注目。

### その他のソリューション

- LSD: 法務部門のペーパーレス化に有効。大企業、特にM&A検討企業に適している。NECのプレスリリース内容が具体化になった。
- ServiceNow Vault: 予想外の使用例も紹介され、興味深かった。基本機能の多様性を再認識。ログインユーザーやログ監視？に有効性あるもの多かった。
- Risk Compliance: 理解が深まった。SecOpsのSBOM含め、規制・ガバナンス関連ソリューションの価値提案方法に課題感。OOTB原則と、現実的な企業活動のビジネスフローの整合には企業努力以上のCoEやソリューションとしてのガバナンスの目線は絶対に必要だよね。日本もSBOMの規制ないかな？努力義務かな。


## ■ 企業ブース

- 富士通: 画像検出技術での手作業ミス検出デモが非常に印象的。一番面白かった。
- アクセンチュア: パワーポイント資料の質が高かった。ソリューションを紙芝居や動画にしており、共通化の取り組みが優れていた。ダンスしてた。
- 野村総研: S2Pソリューションの推進が非常に興味深い領域だった。ここの領域はなかなかきかないため。
- Tanium：連携側で参加しているのが印象的だった。今年はプレスも多く、ITOM-Taniumは相談レベルでも多いため、わかるといえばわかる。こういった企業の参加も増えてくると楽しいかも。
- アオラナウ：黄色だった。結構ブースに勢いあった。
- DXC：紫だった

## ■ 総括
初参加はNow at work2019だけども気づけば2024までになっていた。（参加は今回で2回目だけど）
かつては物好きなエンジニアのわかるやつのためのものって感じだったのが、
踊ってたり、若い人多かったり、参加者がユーザー企業側のヒトも多かったりと、参加層の拡大・拡張を感じた。
CSA取得者も気づけば3500人も取得者いるよう。資格なしの方も含めれば開発サイドは5000人ほど？
元々開発サイドは５００人とかの規模感と思ってたが、少しずつだが人も世界もふえていってる印象をもった。
主軸のITSMはさておき、法務、コンプライアンス、製造業、金融業、モバイルデバイスと活動領域もひろがり、さても真面目にDXだなぁと思ったりなど。
あとは結局CTAってなんなのだろうか。希少価値はあるが、実務的なバリューとしてはどこにあるのか。まぁレアキャラかな。
来年も期待。
Markdown コードブロックをそのまま表示させる方法

# 👍️ いいねのお願い
いつでも見返せるようにいいねをお願いします🙇

# 方法
```` ``` ````よりおおい数で囲む

`````
````
```python
def hello():  
    print("Hello, World!")  
```
````
`````

# 結果
````
```python
def hello():  
    print("Hello, World!")  
```
````
準委任契約と請負契約の違い（ＩＴ開発）

ほかの人の資料を見つつ、自分なりの意見を言っておきたい。

# 業務委託契約

IT会社へシステムを発注するにあたりよく使われる方法は以下。
|種類|内容|
|--|--|
|請負契約|業務を依頼し、その成果物に対して報酬を支払う契約。|
|準委任契約(SES)|	委任契約に準じるが、法律行為を伴わない業務を遂行する契約。|

## 請負契約
IT開発をするにあたり、IT会社へ発注し、その業務のほとんどをIT会社で行う手段。
最終納品物が成果物として納品される。
基本的に最終納品物しか見られないため、どのような時間で働いたとしても受注金額は同様。

## 準委任契約(SES)
よく巷でSESと言われているのはこっち。人月で判断されるため、基本的に働いた時間に応じて清算をしていく。、
フリーランス等と契約を結ぶときに清算時間だけを見るので、基本的に成果は見られない。

## 請負契約と準委任契約(SES)のどっちがいい。
準委任契約(SES)で有給をとると基本的に金額は発生しない。しかし、あくまでエンジニアと企業でSES契約を結ぶときであって、企業同士がSES契約を結ぶ場合において有給を使ったとしても雇われている企業側が手出しで有給の費用を補填するので、必ずしもSES契約のすべてが悪いわけではない。さらにいえば成果は二の次なので、定時で帰りますは基本的に通用する。（企業間同士のSES契約は破棄等は別問題ではあるが）。
逆に請負契約になると納期までにどうにかしないといけないが、納期さえ守れれば基本的にどんなに長くてもどうでもいい契約ではある。なので、ある意味ではさぼり放題にもなりえる場合もあるといえばあるが、まあ、そんな契約がほいほい来る場合は少ない。むしろ、リリース時期がカツカツということは珍しくもなく、契約金額も「この金額でここまでやってほしい」という契約でそこまでの納品ができなければ意味がない。そのため、赤字覚悟での人員の大量投入などをする場合も。

# 参考文献
https://qiita.com/satoshi256kbyte/items/795e9137b5728a9e8989
Gitブランチ管理の誤りを修正する：リモートブランチに誤ってコミットしてしまった場合


Gitの日常使用において、時に厄介な状況に遭遇することがあります。今回は、よくある間違いについて議論します：「新しいローカルブランチを作成するつもりが、誤ってリモートブランチに直接コミットしてプッシュしてしまう問題です。」

この問題は一見単純ですが、適切に処理しないとチームの協力とプロジェクトの進行に影響を与える可能性があります。この記事では、この問題の発生原因と、いくつかの効果的な解決策を詳しく紹介します。


# 問題の発生源：Gitコマンドの誤用

この問題はよく`git checkout`を使用しているときに、このような問題が起こりやすいために、以下のタスクとコマンドを一緒に検証しましょう。

今、[origin/develop-feature-master-minor]をベースに、新しいローカルブランチを作成しようとして、以下のようなコマンドを使用するかもしれません：

```bash
git checkout -b project/develop-feature-master-minor origin/develop-feature-master-minor
```

一見正しいように見えますが、実際にはコマンドが確かに新しいローカルブランチを作成しますが、同時に指定されたリモートブランチを追跡するように設定します。

# 問題説明

単にコマンドから見ると、どちらが正しいものだけど、実際にはコマンド１が確かに新しいローカルブランチを作成しますが、同時に指定されたリモートブランチを追跡するように設定します。

何が起こったのか説明しましょう：
1. `-b project/develop-feature-master-minor`が新しいローカルブランチを作成します。
1. `origin/develop-feature-master-minor`は新しいブランチのベースとなるリモートブランチを指定します。
1. リモートブランチを直接ベースとして指定したため、Gitはデフォルトで新しく作成されたローカルブランチがそのリモートブランチを追跡するように設定します。

これがあなたが説明した状況を引き起こしました：新しいローカルブランチを作成するつもりだったのに、結果的にリモートブランチに直接関連付けられ、あなたのコミットとプッシュが対象のリモートブランチに直接影響を与えてしまいました。

# 問題解決策

通常、この問題に気づくのは最初のコミットとプッシュの後かもしれません。慌てる必要はありません。この誤りを修正するためのいくつかの方法があります。

## 解決策１git revertを使用してコミットを取り消す
これは比較的安全な方法で、`git revert`の使用です。

`git revert`コマンドは、以前の一つまたは複数のコミットの変更を取り消す新しいコミットを作成します。この方法の利点は、履歴を変更せずに、変更を取り消す新しいコミットを履歴に追加することです。

以下が`git revert`を使用する手順です；
1. 取り消したいコミットのハッシュ値を特定する。
2. revertコマンドを実行する。
3. 変更をリモートにプッシュする。

```bash
# 1. コミット履歴を確認
git log
# 2. 指定したコミットを取り消す（複数可）
git revert <commit-hash1> <commit-hash2> ...
# 3. 変更をリモートにプッシュ
git push origin <current-branch-name>
```

この方法の仕組みは以下の通りです；
- `git revert`は新しいコミットを作成し、このコミットの変更は取り消されるコミットとちょうど逆になります。
- ことは誤った変更が取り消されることを意味しますが、コミット履歴には取り消しの記録が残ります。

# 予防策

この状況を避けるには、以下のようにすることができます：

1. リモートブランチを追跡しないローカルブランチを作成します：

```bash
git checkout -b project/develop-feature-master-minor origin/develop-feature-master-minor --no-track
```
`--no-track` オプションはGitが自動的に追跡関係を設定するのを防ぎます。

# 結語
今回は、gitに関するコマンドを使用して、誤り状況の発生、解決策、予防を説明しました。リモートブランチに影響を与える可能性のある操作を実行する前に、データの安全性を確保するためにバックアップブランチを作成することをお勧めします。

この記事がGitブランチ管理の問題をより適切に扱うのに役立つことを願っています。質問や他のGit使用のコツを共有したい場合は、コメント欄にお気軽に書き込んでください！
【Unity】角度制限のある Quaternion.FromToRotation を実装してみた

# 概要

```Quaternion.FromToRotation()``` に角度制限が欲しかったので関数を作りました。

下図は 45 度の制限をかけてみた例です。

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/68429eba-6653-2bc5-9197-66dedf5f8fd2.gif)

真ん中は、右の角度に対してその方向へ45度まで向くようにしています。

# コード

お手持ちの QuaternionUtil クラスに追加してご利用ください。

``` QuaternionUtil.cs
using UnityEngine;

public static class QuaternionUtil
{
    public static Quaternion FromToRotationLimit(Vector3 from, Vector3 to, float max)
    {
        var tangent = Vector3.Cross(from, to);
        var angle = Vector3.SignedAngle(from, to, tangent);
        return Quaternion.AngleAxis(Mathf.Min(angle, max), tangent);
    }
}
```
間違いや改善点がありましたらコメントをいただけると助かります。
【コピペ用】Markdownチートシート


# 📝 Markdownチートシート
```md
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

**太字** or __太字__  
*斜体* or _斜体_  
~~打ち消し~~  

- アイテム1
- アイテム2
  - サブアイテム

1. アイテム1
2. アイテム1

> 引用

>> 更に引用

`コード`

```python
def hello():  
    print("Hello, World!")  
```                                                         ,

---
***
___

[リンクテキスト](URL)

![代替テキスト](画像URL)

| 列1 | 列2 | 列3 |
| --- | --- | --- |
| 行1 | 行1 | 行1 |
| `行2` | `行2` | `行2` |

- [ ] 未完了のタスク
- [x] 完了したタスク

\*これは強調されません\*

$$
E = mc^2
$$

これはテキストです[^1]。

[^1]: これは注釈の内容です。

<u>これは下線付きのテキストです。</u>

<span style="font-size:24px;">大きなテキスト</span>

<span style="background-color:yellow;">背景色を黄色にしたテキスト</span>

<span style="color:red; font-weight:bold;">赤色の太字テキスト</span>

<img src="画像URL" alt="代替テキスト" width="300" height="200" />

<div style="border: 1px solid #ccc; padding: 10px;">
  これはボックス内のテキストです。
</div>

<p style="text-align:center;">
  中央寄せ
</p>

```
管理者権限不要！UbuntuでのOllamaローカルインストール手順

こんにちは。今回は、管理者権限がなくてもOllamaを使用する方法をご紹介します。特に、会社や学校のPCで制限がある方、またはSSH経由でリモートサーバーにアクセスしている方に役立つ内容となっています。

## はじめに

Ollamaとは、ローカル環境で大規模言語モデル（LLM）を簡単に動作させることができるツールです。「sudo権限がないためインストールできない」という課題を抱えている方も多いのではないでしょうか。本記事では、そのような制約を克服する方法をステップバイステップでご説明します。

https://ollama.com/

## 前提条件

- Ubuntu環境（ターミナルアクセス可能）
- インターネット接続
- 基本的なコマンドライン操作の知識

## 手順1: Ollamaのダウンロード

まずは、Ollamaのバイナリファイルをダウンロードします。ターミナルを開き、以下のコマンドを実行してください。

https://github.com/ollama/ollama/blob/main/docs/linux.md

```bash
curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama.tgz
```

このコマンドにより、現在のディレクトリにOllamaのアーカイブファイルがダウンロードされます。

## 手順2: ファイルの展開

ダウンロードしたアーカイブファイルを展開します。

```bash
tar -xzf ollama.tgz
```

## 手順3: Ollamaファイルの確認と実行権限の付与

展開されたOllamaファイルを確認し、実行権限を付与します。

```bash
ls -l ./bin/ollama
chmod +x ./bin/ollama
```

## 手順4: Ollamaの実行

準備が整いましたので、Ollamaを起動しましょう。

```bash
./bin/ollama serve
```
**別のターミナルウィンドウを開き**、Ollamaが正常に動作しているか確認します。

```bash
./bin/ollama --version
```

バージョン情報が表示されれば、正常に動作しています。

```bash
./bin/ollama
```
ターミナルに`ollama`のみを実行すると、利用可能なコマンド一覧が表示されます。

```
Available Commands:
  serve       Start ollama
  create      Create a model from a Modelfile
  show        Show information for a model
  run         Run a model
  stop        Stop a running model
  pull        Pull a model from a registry
  push        Push a model to a registry
  list        List models
  ps          List running models
  cp          Copy a model
  rm          Remove a model
  help        Help about any command
```

## 手順5: モデルのダウンロードと実行

それでは、実際にLLMを動かしてみましょう。ここでは例として、Llama 2モデルを使用します。

```bash
./bin/ollama run llama2
```

初回実行時はモデルのダウンロードが開始されます。完了後、プロンプトが表示されますので、お好きな質問を入力してみてください。

## 便利な使用方法：エイリアスの設定

`./bin/`の入力を省略したい場合は、.bashrcファイルにエイリアスを追加する方法が便利です。

```bash
echo "alias ollama='$HOME/bin/ollama'" >> ~/.bashrc
source ~/.bashrc
```

これにより、単に`ollama`と入力するだけでコマンドを実行できるようになります。

## SSH経由での使用

リモートサーバーでOllamaを使用する場合、以下の手順で接続します。

1. SSHでサーバーに接続：
   ```bash
   ssh ユーザー名@サーバーアドレス
   ```

2. 接続後、上記の手順1から5を実行します

3. Ollamaをバックグラウンドで起動する場合：
   ```bash
   nohup ./bin/ollama serve &
   ```

4. 別のSSHセッションを開いて、Ollamaと対話することができます

## まとめ

以上で、管理者権限なしでOllamaを使用する方法をご紹介いたしました。この方法により、様々な環境でローカルLLMの力を体験することができます。

次のステップとして、カスタムモデルの作成や、PythonからOllamaを利用する方法など、より高度な使い方にチャレンジしてみるのはいかがでしょうか。Ollamaの可能性は無限大です。

皆様のOllama活用が、より一層充実したものになりますことを願っております。
【Discord】ニックネーム、アイコンを透明に設定する

こんにちは、りょうです。
修学旅行→風邪引いたままテストでこっち書けてませんでした(ーー;)
今回はニックネームおよびアイコンを透明にし、見えないようにする方法の紹介です。

## ニックネーム隠し(透明化)

:::note warn
**注意**
この方法はユーザーに`ニックネームの変更`権限があるサーバーでしかできません。
また、通常の表示名の設定ではできません
:::

まずユーザー設定→プロフィール→サーバープロフィールに移動します。
ニックネームを透明で表示したいサーバーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/351cff80-2c73-16df-ba9f-dd187dd87630.png)

次に[このサイト](https://0g0.org/unicode/17B5/)に移動します。
**文字をクリップボードにコピー** を押します(特に表示はでませんができてます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/6cf3e88a-908f-22f3-ec69-97252b296114.png)

コピーできたら先程の設定ページに戻って**サーバーニックネーム** の部分に入れて設定します。
そうするとこのように名前が非表示のような状態になります。
ユーザープロフィールでのこの文字の設定はできないので注意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/7235781d-6e56-adcc-3a61-0a1af36c028b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/110899dd-660d-9dc8-b7f9-f1bf7bfba3fc.png)

## 透明アイコンの設定
こちらはニックネームと違って普通に設定できます。
まず[ここ](https://ul.h3z.jp/2bW6QyEZ.png)に移動します。
透明アイコン用の画像をアップロードしています。
移動するとこのようになっていると思うので表示されている真ん中の画像をダウンロードします。
(`ctrl+S`で簡単にできます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/1a631e26-097a-ca9f-48a1-b76c47ff768f.png)

次にユーザー設定に戻りアイコンの画像を先ほどDLしたものに設定します。
するとこのように透明な画像を設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/34696f4e-c08f-6fa0-3aca-c95913697cbe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/469447ee-e146-5c05-3c21-2f866afc9845.png)

## まとめ
今回は透明なユーザー名やアイコンの設定方法を解説しました
面白いのでやってみてください(？)

わからないことあったら書いてくれれば答えていきます。

**Discordにいる荒らしの情報や対策方法の共有をしている自鯖です**
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
NDCG (Normalized Discounted Cumulative Gain) を理解する

# まとめ

1. NDCGは、scoreの大小は関係なく、スコアの順番に並べたときの順序を評価するもの
1. CG (Cumulative Gain): Relevancyを足してく (Relevancyの計算は色々ある. 例のような単純なtarget 0/1の場合は単純に relevance score の足し算)
1. Discount: Rankが下がるにつれて足してくDiscountしていく (高いランクよりも低いランクの正解をたかく評価する)
1. Normalized: Ideal DCGでの割って 0~1に収める


以下の記事がわかりやすい！

https://www.evidentlyai.com/ranking-metrics/ndcg-metric

# 計算

## Pythonのライブラリ準備

`sklearn.metrics.ndcg_score`をimport

```py
>>> from sklearn.metrics import ndcg_score
>>> import numpy as np
```

## Relevance scoreを定める

Relevance Scoreは、ランキングの評価をクリックされたかどうかでは、判定する場合には、Clickを1、それ以外を0などに設定する。ことができる。

が、以下のように、重み付けをしたスコアにすることも可能。今回は、 itemを4つでそれぞれのスコアは、1,0.1,0,0としておく。

```py
>>> relevancy = np.asarray([[1, 0.1, 0, 0]])
```

Relevancyを決めると任意の順序に対して一つのスコアを算出できるようになる。

## 例1. 完璧なケース

完璧なケースはつまりrelevance score 順に並んでいるもの。

例えば、item0~3に3,2,1,0という点数をつけるランキングシステムがあったとすると、Relevance score通りに並んでいるのでndcgは1となる。

```
>>> score = np.asarray([[3, 2, 1, 0]]) # perfect rank (Relevancyが高いスコア順に並んでいる)
>>> ndcg_score(relevancy, score)
np.float64(1.0)
```

scoreのところに、直接relevancyを入れても同様に1となる。

```py
ndcg_score(relevancy, relevancy)
np.float64(1.0)
```

:::note info
scoreの大小は関係なく、スコアの順番に並べたときの順序を評価するものである。
:::


## 例2. 2位と3位が逆になっているランキングの場合

item1よりもitem2の方がscoreを高く評価するランキングがあったとする。

```
>>> score = np.asarray([[3, 1, 2, 0]]) # 2nd and 3rd places are wrongly ranked
>>> ndcg_score(relevancy, score)
np.float64(0.987684073114351)
```

この場合は、NDCGは0.9876と1より少し落ちるがそこまで大きく落ちてはいない。

愚直に計算すると以下のように logで割引率をかけて足し算をするので、今回減った分は `0.1 * np.log(2+1)` の値分だけで、relevance scoreがそもそも低い部分に対して外しただけなので、最終的なNDCGは高いままだった。

```
>>> (1 / np.log(1+1) + 0 / np.log(2+1) + 0.1 / np.log(3+1) + 0) / (1 / np.log(1+1) + 0.1 / np.log(2+1) + 0 + 0)
np.float64(0.987684073114351)
```

## 例3. 1位と2位を逆にしてしまったランキングの場合

item0のスコアの方がitem1より低くしてしまうランキングがあったとする。

```
>>> score = np.asarray([[2, 3, 1, 0]]) # 1st and 2nd places are wrongly ranked
>>> ndcg_score(relevancy, score)
np.float64(0.6875501677789769)
```

するとNDCGは、0.68とかなり下がってしまう。

愚直に計算すると、以下のようになる。

```
>>> (0.1 / np.log(1+1) + 1 / np.log(2+1) + 0 + 0) / (1 / np.log(1+1) + 0.1 / np.log(2+1) + 0 + 0)
np.float64(0.687550167778977)
```

繰り返しにはなるが、ランキングに使うスコア自体の大きさは最終的なNDCGスコアには影響しない。

```
>>> score = np.asarray([[200, 300, 1, 0]]) # prediction score, which is used for ranking, is irrelevant to the final score
>>> ndcg_score(relevancy, score)
np.float64(0.6875501677789769)
```
【OCI】ADBでSELECT AIを利用する上でつまずいた点

## はじめに
Autonomous DatabaseのSelect AIを利用することで、SQLを書く代わりに自然言語でデータを問い合わせることが可能になります。
今回は、OCIチュートリアルの「[111: SELECT AIを試してみよう引用](https://docs.oracle.com/cd/F79139_01/getting-started/install.html)」を実際にやってみて、つまずいた点を紹介します。

## Database ActionsやAPEXではSELECT AIは使えない
>Database Actions内のSQLやAPEXではSELECT AI文を直接実行することをサポートしていないため、DBMS_CLOUD_AIパッケージのGENERATEファンクションを使用する必要があります。

チュートリアルの説明にもあるように、設定のときにりようしていたDatabase Actionsは使えなくなるので、**SQL Developer**を利用するか、**DBMS_CLOUD_AIパッケージのGENERATEファンクション**を使用する必要があります。

これは、OCIの公式のドキュメントにも以下のように記載があります。
>Usage Notes
・Select AI is not supported in Database Actions or APEX Service. You can use only DBMS_CLOUD_AI.GENERATE function.

引用：[Use Select AI to Generate SQL from Natural Language Prompts](https://docs.oracle.com/en-us/iaas/autonomous-database/doc/use-select-ai-generate-sql-natural-language-prompts.html)

## プロンプトのエラー
[111: SELECT AIを試してみよう引用](https://docs.oracle.com/cd/F79139_01/getting-started/install.html)で、SELECT AIを実行した際に以下のように出力され、続く文章にデータベースではなく、LLMだけの結果を出力される場合があります。

```
Sorry, unfortunately a valid SELECT statement could not be generated for your natural language prompt. Here is some more information to help you further: ...
```
これはプロンプトエンジニアリングの問題で、プロンプトを書き換えることで解決されるケースが多いです。

例えば、以下のようなプロンプトでSELECT AIを実行したとします。

```SQL
SELECT AI マンハッタン市内に高校は全部で何校ありますか;
```
この出力が上記のようなエラー出力だった場合、以下のように少し書き直すだけで問題が改善されるケースもあります。
```SQL
SELECT AI マンハッタンに高校は全部で何校ありますか;
```
LLM (大規模言語モデル)の特性上、こういったプロンプトを少し変えるだけでも出力結果に影響を及ぼす可能性もあることは認識しておいた方がいいかもしれません。


## おわりに
今回は、Autonomous DatabaseのSelect AIの「[チュートリアル](https://docs.oracle.com/cd/F79139_01/getting-started/install.html)」を実際にやってみて、つまずいた点を紹介しました。
Tomcatのjava.lang.OutOfMemoryError: Java heap space

## TomcatでOutOfMemoryErrorになった場合の対象方法

エラーメッセージ例
~~~
java.lang.OutOfMemoryError: Java heap space
~~~

### 対処：catalina.shを以下のように変更
~~~
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Xms2048m -Xmx4096m"
~~~

-Xms：ヒープ領域の初期サイズ
-Xmx：ヒープ領域の最大サイズ