OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでPythonのBlackを使用する時に特定のファイルを除外するには"--force-exclude"を使え

[Black](https://black.readthedocs.io/en/stable/index.html)はPythonのコードフォーマットのコマンドラインツールです。

これにより常に同じフォーマットルールを適用できます。

VSCodeで使用する場合、[Black Formatter](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter)プラグインを使用して、ファイル保存時に自動整形すると良いでしょう。


### VSCodeの設定例

```json:setting.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true
    },
    "black-formatter.args": [
        "--skip-string-normalization",
        "--line-length=79",
        "--force-exclude", "src/not_formatted.*\\.py",
    ],
}
```

### VSCode設定で`--exclude`が効かない

- `--force-exclude`を使用しましょう。

特定のファイルのフォーマットを除外したい場合、コマンドラインで一括でフォーマットする場合は、`--exclude`オプションを使用しますが、VSCodeではうまくいきません。
おそらく裏で`black foo.py --exclude foo.py`というコマンドが実行されるためで、フォーマット対象として指定したファイルは除外できないためでしょう。

`--force-exclude`を使用すると強制的に除外され、期待した通りに動作します。
除外対象は正規表現形式の指定となります。

また、`--force-exclude`は複数指定できないようなので、複数のファイルを除外したい場合、１つの正規表現で複数のファイルを指定することになります。

#### 例：
`["--force-exclude", "x\\.py|y\\.py",]`

https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#force-exclude

Happy Coding!
Gemfileに追記せずに、自分だけ使うgemを追加

Railsのプロジェクトで、
peformance測定とか、debugのgemを入れたいとか...
チームの方針で`irb`になっているが、自分はpryを使いたいときとか...

## 方法1. `.pryrc`からinlineで呼び出す

```~/.pryrc
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'awesome_print'
  gem 'pry-doc'
end

AwesomePrint.pry!
```

## 方法2. `Gemfile.local`を作成する方法
1の方法だと、rails serverを立ち上げたときなどは、gemが呼び出されません:cry: 
なので方法2を紹介しますが、ちょっと複雑なので、基本的に方法1をおすすめします

### 1. プロジェクトのルートディレクトリに`Gemfile.local`を作成
```Gemfile.local
gem 'awesome_print'
gem 'pry-doc'

eval_gemfile 'Gemfile'
```

### 2. bundleコマンドを上書き
`Gemfile.local`があった場合、`BUNDLE_GEMFILE=Gemfile.local`の環境変数が追加します
しかし、`Gemfile.local.lock`が作成され、`Gemfile.lock`が管理されなくなります
対策として、`bundle install`時は2回行います
`bundle update`時は、`Gemfile`だけを見に行きます

```~/.zshrc
bundle() {
  if [ -f Gemfile.local ]; then
    if [[ $1 == install || -z $@ ]]; then
      bundle "$@"
      BUNDLE_GEMFILE=Gemfile.local command bundle "$@"
    elif [[ $1 == update ]]; then
      command bundle "$@"
    else
      BUNDLE_GEMFILE=Gemfile.local command bundle "$@"
    fi
  else
    command bundle "$@"
  fi
}
```

### 3. .gitignoreに追加

```~/.config/git/ignore
Gemfile.local
Gemfile.local.lock
```

## 最後に
運用歴浅いので、コメントしてってーーー

## 関連:
https://qiita.com/kyohah/items/6ab9a433eaaf84392041
VScodeでJupyterノートブックをPDFにエクスポートする際の一般的な問題とその解決方法

# はじめに

vscode上ではコマンドパレット（Shift+Command+P）からJupyterノートブックのexport形式を選択することができます。今回、PDFへ変換しようとしたところ、いろいろとエラーが出て困ったので、備忘録的に記録しておきます。

# 1. xelatex のインストール

JupyterノートブックからPDFを生成するためには、LaTeXの一部であるxelatexが必要です。

## MacTexをインストール

Texを使うようなので、インストールしました。5GBのダウンロード＆インストールになるので気をつけてください。

https://tug.org/mactex/mactex-download.html

## MacTexの設定

MacTeXをインストールしてもコマンドが認識されない場合は、次の手順で環境パスを設定する必要があります。

### 環境パスの設定方法

1. **ターミナルを開きます。**
2. **以下のコマンドを実行して、xelatexのパスを.zshrcファイルに追加します。**
   ```bash
   echo 'export PATH="/Library/TeX/texbin:$PATH"' >> ~/.zshrc
   ```
3. **変更を適用するために、以下のコマンドを実行します。**
   ```bash
   source ~/.zshrc
   ```
4. **インストールが成功したことを確認します。**
   ```bash
   which xelatex
   ```

# 2. Pandoc のインストール

PDFへのエクスポートにはPandocも必要です。Pandocがインストールされていない場合、エクスポートプロセス中にエラーが発生します。

## Pandocのインストール方法

1. **Homebrewを使用してPandocをインストールします。**
   ```bash
   brew install pandoc
   ```
2. **インストールが完了したら、次のコマンドでバージョンを確認してインストールを確認します。**
   ```bash
   pandoc --version
   ```

### まとめ

ここまでやってなんとかエクスポートに成功...
しかし、日本語には対応していないようで、結局HTMLへ変換し、そこからPDFにしました...(orz)
ARK: Survival Ascended(ASA)のサーバーのクロスプレイ設定方法

# 1.はじめに
この記事はConohaなどで立てた非公式サーバーのARK: Survival Ascended(以下ASA)をクロスプレイ出来るように設定する方法になります。

Conohaでのサーバーの立て方は以下の記事を参照ください。

:::note info
[ConohaでのASAサーバーの立て方（リンク）](https://qiita.com/HAKOTEN/items/0e7d7f9487fc82d0ee55)
:::

# 2.サービスファイルの設定
TeraTermでサーバーに接続して以下コマンドを実行していきます。


### ①サーバーを停止
```:サーバーを停止する
sudo systemctl stop ark-island
```

### ②サービスファイルの設定を変更
```:サービスのディレクトリに移動
cd /etc/systemd/system
```

viコマンドでサービスファイルの起動設定の引数を追加

```:viコマンド
vi ark-island.service
```

[修正箇所]
ExecStart=/home/steam/.steam/compatibilitytools.d/GE-Proton8-21/proton run ArkAscendedServer.exe TheIsland_WP?listen
?SessionName=XXX(サーバー名)?ServerPassword=XXX（パスワード）?ServerAdminPassword=XXX（管理者パスワード）
-NoBattlEye ***-ServerPlatform=PC+XSX+PS5*** -mods=XXXXXX(modのID),XXXXXX,XXXXXX

```:追加する引数
-ServerPlatform=PC+XSX+PS5
```
PC = パソコン
XSX = Xbox
PS5 = プレイステーション5

※viコマンドは「i」で編集モード、「Escキー」を押してから「:wq」でファイル保存できます。


### ③サービス起動設定の更新
上記のファイルを更新して保存できたら、デーモンをリロードしておきます。

```:デーモンのリロード
sudo systemctl daemon-reload
```


# 3.動作確認
手動でサーバーを起動してPS5などからアクセスできるか動作確認を行ってください。

```:サーバーを起動する
sudo systemctl start ark-island
```

```:サーバーを再起動する
sudo systemctl restart ark-island
```

```:サーバーを停止する
sudo systemctl stop ark-island
```


# 4.免責事項

:::note alert
本記事からのリンクなどで移動したサイトで提供される情報、サービス等について一切の責任を負いません。

また本記事のコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。

本記事に掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
:::
無料DM配信システム「acmailer」をWADAXホスティングサーバに構築する

## はじめに
顧客へ一斉に配信するDM。
メールソフトで地道にBccに宛先追加して～とかやるのもなんだかなぁと思い。
システマチックにやりたいぜ！というのが今回の目的。

### acmailer
無料のDMサービスないかな～と探すも、どこもかしこも有料（まぁ当然といえば当然です）。しかし、ひとつだけ完全無料のものがありました。
その名も**acmailer**。https://www.acmailer.jp/
Linuxサーバを自分で準備する必要がありますが、たいていはホームページとかで使用しているホスティングサーバが使えます。ちなみに私はWADAXのサーバ上で構築しました。

### 構築時のハマりポイント
構築手順自体は簡単なのですが、ところどころでうまく動かずハマったポイントがあったので、そこを抜粋して解説していきます。
公式の構築手順はこちらから→https://www.acmailer.jp/docs/install-manual/download/896.html

#### ①cgiファイルの置き場所
ドキュメントルート直下にフォルダを作成してそこにインストーラ（cgiファイル）を置くのですが、WADAXの場合はドキュメントルートがhttpdocsです。レンタルサーバによって異なってくるので、ご自身の契約されているサーバの仕様を確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/b44fab15-f002-c337-b825-67e78b1d451a.png)


#### ②パーミッションの設定
公式では、フォルダのパーミッションを777にする設定なのですが、プロバイダーによってこの設定が異なってくるようです。WADAXの場合は755です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/85fec760-046d-75c6-4444-505b3fab2797.png)


#### ③.htaccessの作成
これもまたお使いの環境によっているいらないがあるのですが、今回構築した環境では必要でした。参考→https://faq.wadax.ne.jp/s/article/29

perlの動作が必要な場合は以下のように「.htaccess」ファイルに登録します。
```
Options +ExecCGI
AddHandler cgi-script .pl .cgi
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/194c04f1-eccb-fbee-71c1-ac50771904c7.png)

#### ④送信サーバ設定※ここが一番ハマった！！
最後に送信サーバの設定です。ここでめっちゃハマりました・・・。
会社でMicrosoft365を使っているので、送信サーバを365に設定しようとしたんですが、まぁ何度試しても送信できない。
なんでかなぁと調べていくと、どうやらGUIでSSL/TLSの設定箇所が無いようで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/5e9353fb-bb56-6abf-d534-945205cd4d7a.png)

設定ファイルを編集する必要があるということにネットで調べて辿り着いたんですが、その通りに設定してもうまくいかず。（↓参考にしたサイト）
https://e-garakuta.net/techinfo/doku.php/aws/acmailer
https://techblog.nhn-techorus.com/archives/472

結局、外部サーバは諦めてローカルサーバ（sendmail）を使うことにしました。

が、ローカルサーバは普段使用していないメールサーバなので、DNSレコードを追加してやらないと、受信側のサーバでなりすましメールだと判定されちゃいます。
いわゆるSPFレコードをご自身で契約されているDNSサーバに追加してあげる必要があるのです。
https://faq.wadax.ne.jp/s/article/1911

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/08e60054-6e1e-924d-05bb-046c0b11d2b6.png)


以上！

## おわりに
ハマらずにサクサク進めば数時間で構築できちゃうシステムでした。
顧客管理（CRM）もやりたい！となるとちゃんとしたサービスを使った方がいいですが、イベント出展のお知らせとか簡単なDMであればacmailerで事足りるかと思います。
[AR] Web ARアプリを作成したかった話[雑談]

## はじめに
こんにちは、ゆきおです。
今日はUnityのARFoundation以外のARライブラリを紹介したいと思います。
とある案件でARアプリを作成することになったのですが、試行錯誤を重ねに重ねて
なかなか大変な思いをしたので振り返りということで書いていこうと思います。

## ARアプリで直面した問題
まず大きな問題として、
**・期間が短い**
**・スマホアプリの障壁**
この2つがありました。

2ヶ月くらいでリリースしたいってことだったのですが
ARアプリはつまるところスマホアプリですので、AppStoreなどに申請しなければなりませんので時間がかかります。
さらにはユーザーにとってスマホアプリをわざわざダウンロードするという作業を強制するのは好ましくない。

ということでした。

そこで行き着いたのがWeb上でARアプリを構築するというものでした。
これならばQRコードを読み取ってARコンテンツを楽しむことができます。
スターバックスがAR看板というのを以前やっていて、それをたまたま見かけたのでやってみようと思いました。

そこでまた重たい問題が発生します。

## AR Foundationの欠点
まずはUnityのAR Foudationで作ってみようかなと思ったのですが

### ARFoundationはWebに対応していない

という大問題がありました。前提が覆ります。
最近はニュースで見たのですが、ARコンテンツをWebViewで表示できるとか何とかあるらしいですね？うろ覚えですが…

スマホアプリとしてはリリース出来ない、そんな時間もない。
Webで公開しようとしたらUnity単体では対応していない。

ということで辿り着いたのが「**ZapWorks**」と「**8thWall**」の２つでした。

https://zap.works/

https://www.8thwall.com/

どちらもWebARに特化したサービスです。
ZapWorksに至ってはUnityのSDKが利用できるので願ったり叶ったりでした。

しかも ZapWorksのコンソールからQRコードを生成したり、URLを生成してくれたりとかなり充実したサービスを提供しています。

ということでチュートリアル読んだり公式に問い合わせたりして作って行ったのですが次の問題が発生します。

## 💰高え💰
無料版ももちろんあるのですが、商用利用だったりアプリの容量をグレードアップするにはプランの変更が当然ながら必要でした。

アプリの内容自体も結構なボリュームで、テクスチャの解像度を下げたりだなんだして最適化を図ったのですがそれでもProプランは必須です。

まあまあなお値段しますし、なんて言ってもドルベースなんです…。

XR業界というのは海外がかなり進歩していて、基本的には海外とのやりとりになります。
料金の壁、言葉の壁、様々問題と手間が発生し難航しました。

幸い英語ペラペラな方が会社にいるのでミーティングに通訳として立ち会ってもらいお話ししたのですがやはり料金問題が大きく、厳しい状況でした。

そこで第二案、8thWallについて調査してみました。

## 8thWall
AR業界ではお馴染みのNiantic社が買収した会社です。
NianticはポケモンGOとかモンハンNowとか作った会社ですね。

こちらもZapWorks同様、 QRコードを生成してくれてWeb上にサクッとARアプリを構築できるサービスを展開しています。

が、しかしこちらはUnityのSDKがありませんでした。

８thWallの中に既に開発環境が用意されており、画像の登録からコーディングまで完結するという便利なものでした。

がしかし、**JavaScriptベース**なんですね。

8thWall向けに魔改造されたthree.jsやAR.jsで、結構直感的かつシンプルに記述できます。

とはいえUnityでやっていたようなことが全て出来る保証はなく、案の定３Dモデルの拡張子に指定があって用意してもらったモデルが使えないとか、アニメーションが再生出来ないとか色々難儀しました。

幸い、サンプルプロジェクトが大量にあるのでそれを参考に試行錯誤して何とか実装を進めたのですが最後の最後にトドメの問題発生。

### 容量デカすぎてクラッシュする

スマホがとんでもない熱を帯び発火するんじゃないかっていうくらいでした。

そもそもスマホアプリでやるようなボリュームをWeb上でやろうというのに無理がありました。
画像検知をベースにしていたのですが、動画と３Dモデルを用いたコンテンツ表示が１０個ずつというかなりのボリュームでした。

サンプルアプリなど色々探し回ってもそんなことしてる人がいなかったのでどうにもならず、まさに惨敗でした。

WebARで実現できることって、それこそ「看板の中に空間が広がっている」とか「コーラの缶に動画が流れる」とか、単一コンテンツなんですよね。

## XR業界の今後
この経験を通して思ったことは、とにかくARはまだまだ認知度が低いということです。
検知するためのマーカー1つ取っても、「こういうマーカーじゃないと検知は難しい」ということすら伝えるのに時間がかかりました。

そしてぶっちゃけ「ショボい」というのが正直な感想です。

コンテンツを表示しても「おー！！へえ………で？」で終わります。はい。
自分がユーザーだったらすぐ飽きるし、まあ最近何だか未来的なもの出てきたよねーっていう話のタネくらいな気持ちで見てしまいます。

当時はどちらかというとVRChatやClusterなどVRコンテンツの方が取り上げられていました。

しかし正直VRコンテンツも、メタバースとか言ってるけど結局MMOと何が違うん？？？という思いでした。

アバターを作って仮想世界へ赴き、人と交流する。

それってもうオンラインのゲームでとっくに実現しているし、なんだか新鮮味に欠けているなあと思いました。

今となってはARゴーグルも当たり前に出てきてどんどん普及しています。
昨今のWWDCを見てもVisionOSについての発表や、「空間デザイン」なんて言葉も誕生していて、AR開発者にとってはようやくここまで来たか！というところではないでしょうか。

まだまだ黎明期、これから業界の発展に期待するばかりです。
日本も乗り遅れないよう、頑張っていきたいですね。

ちなみに自動車や医療、建築など産業分野ではUnityもUnrealEngineも既に活用されまくってます。
非常に興味深く、夢のある事例ばかりなので興味のある方は調べてみてください！

いつか我々一般市民に当たり前のように普及する日を夢見て備えましょう。
ではでは、お疲れ様でした。
Windows11のWSL2(Ubuntu)にROSをインストールしようとしてエラーが発生→解決した話

取り急ぎのメモになります。→その後、体裁を整えました
自己研鑽のために行った作業です。

# 要約：
* ROSをWindows11のWLS2(Ubuntu)にインストールしようとしてエラー発生
* 原因はUbuntuバージョン(22.24)が新しく、ROSのバージョン(Noetic)が対応していなかった
* Ubuntuの20.24をインストールした後、再度チュートリアル通りにROSをインストールして成功


# 経緯の詳細
Windows11 HomeのWLS2のUbuntuにてROSのインストールを行う。
チュートリアル（以下URL）を参考に実施。
https://wiki.ros.org/ROS/Tutorials

## エラー発生
以下のインストールのページを見ながら作業を進めるとエラーが発生
https://wiki.ros.org/noetic/Installation/Ubuntu

エラー発生のコマンドは以下になる
~~~
sudo apt update
~~~

コンソールに表示されたエラーの文言を簡単に抜粋
~~~
(省略)
Err:4 http://packages.ros.org/ros/ubuntu jammy Release
  404  Not Found [IP: 64.50.236.52 80]
(省略)
E: The repository 'http://packages.ros.org/ros/ubuntu jammy Release' does not have a Release file.
(省略)
~~~

## 原因(調査含む)と結果
以下に記載されている問題と全く同じだった。
https://answers.ros.org/question/414948/apt-no-release-file-ubuntu-jammy/

上記サイト内の「ubuntu Jammy」の意味が分からなかったので色々なワードで検索。
「ros jammy」と検索していたら以下のサイトに行きつく。
https://stackoverflow.com/questions/78171568/ros-noetic-installation-problem-on-ubuntu

上記サイトに
「Ubuntu 22.04は対応していない、20.04にダウングレードが必要」
もしくは
「ROS2をインストールする」
との記載あり。

なお、Ubuntu 22.04のことをJammy Jellyfishというらしい。
そしてUbuntu 20.04のことはFocal Fossaというらしい。

今回はROSをインストールすることが目的のため、Ubuntu 20.24をインストールすることに。
WSL2でUbuntu 20.24は簡単にインストールできたので詳細は省略。


Ubuntu 20.24にてROSインストールを実施して成功。

# おわりに
以上が今回対応した内容になります。

ちなみにROS2をインストールした際にも、ROS2 Foxyというバージョンだとインストールできないエラーが発生してHumbleというバージョンでインストールしました。
これについては詳細の調査は行っていないので、今後時間があるときに調べていきたいと思います。

WSL2(Ubuntu)もROSも現在学習中の身ですので、アドバイス等あればコメントいただけると幸いです。
【Swift】Label のサイズを画面サイズによって拡大縮小する。

今回は Swift の Label のサイズを
画面サイズによって拡大縮小する方法を
紹介したいと思います。

この方法でサイズを拡大縮小すれば
タブレットで見た時に
文字サイズが小さくなる現象は
緩和されるハズです。

いわゆるレスポンシブ対応です。

ご自身のコードに
少しだけ追記するだけで実装出来ますので
簡単に適用できると思います。
是非実験してみて頂けると嬉しいです。

SwiftUI バージョンも最後に紹介します。

***

始めにサンプルコードを載せて
その使い方を説明します。

```swift:サンプルコード
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        changeAllFontSize()
    }
    
    func changeAllFontSize() {
        let views = getChild(view)
        for i in views {
            if let label = i as? UILabel {
                label.font = UIFont.systemFont(ofSize: pow(UIScreen.main.bounds.width * label.font.pointSize / 30, 0.5))
                //label.font = UIFont(name: "HiraginoSans-W7", size: pow(UIScreen.main.bounds.width * label.font.pointSize / 30, 0.5)) // 特定のフォントを使用したい場合                  
            }
        }
    }
    
    func getChild(_ view: UIView) -> [UIView] {
        var result: [UIView] = []
        
        result += (view.subviews)
        for i in view.subviews {
            result += getChild(i)
        }
        
        return result
    }
}
```

サンプルコードの
changeAllFontSize メソッドと
getChild メソッドを
ご自身のコードに追加して
viewDidLoad メソッドで
changeAllFontSize メソッドを
実行して使用します。

ofSize の部分の計算式を
良い具合の表示になるよう
調整して下さい。

***

以上 Swift で Label の文字サイズを
画面サイズで拡大縮小する方法を紹介しました。

適用するのは難しくないと思いますので
よろしければ実験して頂けると幸いです。

皆さんの開発の助けになれますように。
閲覧ありがとうございました。

***

追記

[こちらのサイト](https://sp-sephiroth.jp/22101001/auto_layout_question)で
Swift でレスポンシブな配置を
する方法を載せています。

よろしければ参考にして頂けると幸いです。

また、この手法を用いた
Swift アプリ作成の練習で使ったデータを
無料配布致します。
よろしければ Swift 習得にご活用下さい。

[https://drive.google.com/file/d/1rkaGgkvRcghH7e5GmBm9e9de8HJyAo9V/view?usp=sharing](https://drive.google.com/file/d/1rkaGgkvRcghH7e5GmBm9e9de8HJyAo9V/view?usp=sharing)

***

追記

SwiftUI で適用したい場合は

```swift:一部抜粋
Text("button")
  .foregroundColor(Color.white)
  .font(.system(size: width / 5)) // width は親要素の横幅
  .fontWeight(.bold)
```

のように
文字サイズを親要素の
横幅を基準に調整して下さい。
【docker】mysqli_connect()に失敗しAccess deniedした時の対処

docker環境下でphpからtableを作成しようと、mysqliを使おうとしたら手こずった備忘録。

環境
・Macbook air 2020 M1
・Docker v25.0.2
・php v8.3.6
・Mysql v8.3
　
<h2>1.Call to undefined function mysqli_connect()はmysqliのインストールで解決</h2>

```% docker-compose exec app php data/dbcreate.php
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /var/www/html/data/dbcreate.php:15
```

mysqli_connectが機能していないと。
なんと、php7.0以降はmysqliが入ってないので、mysqliをDLする必要がある。

phpのモジュールインストール状況を見ると
```
root@465201bc8bff:/var/www/html# php -m | grep mysqli
root@465201bc8bff:/var/www/html# 
```
mysqliは確かに入ってない。
なのでまずapp/Dockerfileにphpの拡張機能としてmysqliをインストールするよう
```
RUN apt update \
    && apt install -y apache2 \
    && docker-php-ext-install mysqli
```
を追記。
※ $ php-mで出力されたモジュールが、拡張機能として追加できるものなので、そのテキストを入力すればインストールできるってわけだ。

コンテナをリビルドしたところ
```
% php -m | grep mysqli
mysqli
```
インストール完了。

メモ：Dockerfileの修正を反映させるだけなら
```
$docker-compose up -d --build
```
でOK。

<h2>2.Access denied for userはボリュームの削除で解決</h2>
何度目の正直か

```% docker-compose exec app php data/dbcreate.php
Fatal error: Uncaught mysqli_sql_exception: Access denied for user 'msr'@'192.168.48.3' (using password: YES) in /var/www/html/data/dbcreate.php:15
```
同じ行で新しいエラー。Access deniedとのこと。

どうやら同名のボリュームが原因のよう。
ボリューム削除を含めてコンテナを停止するには
```
$ docker-compose down -v
```




コンテナを再度立ち上げてDB（msr）ができているか確認

```$ docker-compose exec db mysql -u root -p.
> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| msr                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

できた！

テーブルも確認し
```
> show tables;
+---------------+
| Tables_in_msr |
+---------------+
| category      |
| user          |
+---------------+
```
こうして文章に書き起こすと何てことないですが、正解に辿りつくまで時間かかりますな。

参考：
docker-composeでPHPのLAMP環境作ったけど、apt-getでmysqliがインストールされなくドハマりしたのでメモ
https://qiita.com/4roro4/items/afd501c0a9a27c4dd7ec

立ち上げたMySQLのDockerコンテナでAccess deniedされた時の対処
https://zenn.dev/tojima/articles/32bbfe85dd0022
rails consoleのsandboxオプション、使ってる？


:::note info
1分で読めます
:::

## sandboxオプションの嬉しい点

sandboxオプションのメリットは、コンソール終了時に自動でデータベースへの変更をロールバックできる点です。

「手元で更新とか色々試したいけどデータベース変更したくないよ〜」という場合に便利。

そうでなくても誤って操作する可能性もあるので、とりあえずこのオプションで触っておけば
ローカル環境のデータに影響が出ることはないので嬉しいですね。

## 使用方法

いつものコンソールを起動するコマンドに`--sandbox`でオプションをつけるだけ。

```
rails console --sandbox
```

※`rails c -s`でも可能

## 注意点

ただし本番環境で使う場合は注意をしましょう。
大規模な障害につながる危険性があります。

https://zenn.dev/shuhei_takada/articles/18ba8524049a04
Webアプリとネイティブアプリの違い

こんにちは！
ぼちぼち自分のアウトプットのための記事をいくつか投稿できていますが、今後とも月に1〜2個ほどの記事を投稿し続けようと考えています

## この記事を投稿しようと思った理由
#### →自分が「Webアプリ」のことをよく理解できていなかったから...!

以前まで私はWebアプリのことを、**「プログラミングを用いて開発を行なったもの」** 
であると考えていました。
簡単に言えば、プログラミングを使っていれば、それはもうWebアプリである！と考えていました。。（笑）

はい、全然理解してませんね。この人は、、:relaxed:
と実際にエンジニアとして働いている人から思われてもおかしくないぐらいの誤った考えを持ってしまっています。

このような背景から私のようなプログラミング初心者やプログラミングを始めようと思っている人が、自分と同じような誤った考えを持たないようにするために今回の記事を投稿しました。
もしこの記事を読んで、ほんの少しでも役に立った！と感じてもらえたら、
こんなに嬉しいことはない...！
（大学生である筆者は小さい頃、ガンダムをよく見ていた）

## 私が考えていたWebアプリとは..
#### →ネイティブアプリのことである...！
私はPythonを用いて、簡単なインベーダーゲームを開発したことがあります。
開発が終了したとき、やっと自分で手を動かして完成したWebアプリができた！と思いましたが、これは間違い。
私が開発したインベーダーゲームは、**「ネイティブアプリ」** の特徴に当てはまるものです。

###### ネイティブアプリとは
端末にインストールして動作するアプリのこと。
**外部と情報をやり取りすることはなく、その端末内で全て処理が完結する。**
（具体例：Word、Excel、PowerPointなど）

ネイティブアプリはソフトを買って、パソコンにインストールすれば遊べるもの。
イメージで言えば、ゲームソフトと同じです。好きなソフトを買ってきて、ゲーム機に入れればすぐに遊ぶことができます。
つまり処理が完了すれば、ネットにつながなくても遊ぶことができるのが、ネイティブアプリです。

## Webアプリの定義とは..？
#### →インターネットを通じて情報をやり取りするアプリのこと
「インターネットを通じて」というのはポイントで、端末の中だけで処理は完結せず、インターネットを通じて情報をやり取りしながら、処理を行なっているのが、Webアプリです。
（具体例：AmazonなどのECサイト、X(旧Twitter)やInstagramなどのSNS）

Webアプリには、サーバー、データベースなど様々な技術が協力することで初めて機能することができるものなのです。

## まとめ
#### →プログラミングを用いて開発を行なっても、インターネットを通じていなければ、ネイティブアプリとなり、Webアプリとはならない...!!!

私と同じようなプログラミング初心者の方に伝えたいことはこのポイントです。
つまり何らかの開発をしても、インターネットを通じて処理が行われていなければ、**これWebアプリじゃなくない...？**
人によっては、このようにツッコまれてしまう恐れがあります。

これを回避するためにも、よく初心者がプログラミング学習を行う1番最初として、HTML&CSSやJavaScriptのフロントエンドだけでなく、
+ Node.jsやPHP、Python、Rubyなどのバックエンドの言語、フレームワーク
+ MySQLやデータベース関連の知識

以上に挙げたものや他のツールのことを学ぶことが求められる可能性があり、私も現在MySQLなどのデータベース関連の学習を行なっています。

私もこのことを初めて理解した時に、
今後開発を行う際に、今回の記事に記載した「Webアプリの定義」に当てはまるようにしなければいけないと気をつけるようにしています。

他の初学者の方に少しでも役にたった！と感じてもらえるように、記事を投稿させていただきました。
今後とも、お互いプログラミングの学習を頑張りましょう！！！！
PG_SLEEP, PG_SLEEP_FOR, PG_SLEEP_UNTIL

# 文法

```sql
PG_SLEEP(double precision)
PG_SLEEP_FOR(interval)
PG_SLEEP_UNTIL(timestamp with time zone) 
```

# 使用

PG_SLEEP、PG_SLEEP_FOR、PG_SLEEP_UNTILは、サーバー・プロセスの実行を遅らせるために使用される。

# 例

```sql
SELECT PG_SLEEP(1.5); 
// sleep for 1.5 seconds
SELECT PG_SLEEP_FOR('5 minutes');
// sleep for 5 minutes
SELECT PG_SLEEP_UNTIL('tomorrow 03:00');
// sleep until tomorrow 03:00
```
# 参考

https://www.postgresql.org/docs/9.1/functions-datetime.html
パナソニックLet's noteでiとoとjとkとlとmが数字になる件

パナソニック製のLet's noteでキー入力をしていると、キーが突然数字になるときがある。

理由は、ナンバーロックされてテンキーモードになっているから。

この製品のキー配列が、テンキーとアルファベットが同一キーだからなので、初めて遭遇するとちょっと焦る事象ではある。

解決策は、ナンバーロックを適用すること。「F12」の右隣のキーが「NumLk(numlock)」キーなので
これを入力すれば、適用⇔解除が切り替わる。

これもまた、この端末の特徴で「Fn」がデフォルトで有効になっているときは、FNを押しながら「NumLk(numlock)」キーを押すと、同じく切り替わるはず。
[Docker Desktop for Windows]エンジンが停止している対処

docker デスクトップを起動したものの、「engine stop」となってしまう対処。

まずは、windows updateを行う。
　（備忘録：わすれがちなので）

コマンドプロンプトを管理者権限で起動する。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/88be90a9-fb7d-8ab8-c362-434004d3b349.png)

「wsl --update」⇒「wsl --shutdown」を実行する。

![タイトル1し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/e72c4c1f-7daa-324f-4a4d-81c74dce9cfd.png)


docker デスクトップwinにて、「トラブルショット」⇒「工場出荷にもどす」を実行。
![スクリーンショット 2024-04-17 130332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/6c0ce66d-1766-78d6-1ecb-fa82ce39ddc9.png)


以上。
OCIの2段階認証（MFA認証）で使う端末の追加


OCIの管理画面であるOCIコンソールへのログインはデフォルトで2段階認証が設定されています。
モバイル端末（スマートフォン）にインストールするOracle Mobile Authenticatorを使われている方が多いと思いますが、複数のモバイル端末に入れたいという方もいるかと思います。

今回は複数モバイル端末（スマホ）のOracle Mobile Authenticatorを利用できるようにする方法をご紹介します。

## 作業の流れ
1. 追加したい端末にGoogle PlayやApple StoreからOracle Mobile Authenticatorをインストールしておく
2. 既存のモバイル端末を使ってOCIコンソールにログイン
3. モバイル端末の追加
4. (必要に応じて) デフォルトのモバイル端末の変更

※1項目のアプリはインストールするだけので本記事は2項目以降について紹介します。

## 端末の追加
まず、既に登録されているモバイル端末を使ってOCIコンソールにログインします。
ログインしたら右上の人のアイコンをクリックするとメニューが出てきます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/679fb5b9-7a73-73ce-892c-745ad15d90e8.jpeg)

そのメニューの中の「自分のプロファイル」を選択します。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/2ecc37cb-6288-fa20-6a1e-10f340108cba.jpeg)

自分のプロファイルが開いたら「セキュリティ」を選択します。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/658d73c0-aa05-816e-8ad2-580e3dcbf7b3.jpeg)

セキュリティのページの2段目に「2ステップ検証」という項目があるのでその枠の右上にある「・・・（縦並び）」を選択します。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/951ff1e1-254c-96c3-d908-67bfcd64ef89.jpeg)

展開したメニューの中から「モバイル・アプリケーションの追加」を選択します。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/d102e068-c59a-4d9b-3528-81b973289dd3.jpeg)

するとQRコードが開くのでそれを追加したい端末（スマホ）のOracle Mobile Authenticatorで読み込みます。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/2d74c2c5-00df-3da5-1189-08073a29e678.jpeg)

読み込みが完了すると先ほどのセキュリティのページに新しい端末が追加されているのが確認できると思います。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/713f5d48-27c9-f40d-4c5d-13cbdd56c4aa.jpeg)


これで、2台の端末のどちらでも2段階認証がりようできるようになりました。

## デフォルトの変更
新しい端末が追加された状態ですとデフォルトはこれまで利用していた端末になっています。
この状態ですと、新しく登録した端末を利用したい場合、ログインの度に「かわりのログイン方法を表示」から選択しないと新しい端末でログインできません。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/2fd2d3db-1cde-cb48-b263-ba44bffd2c56.jpeg)


そこで追加した端末をデフォルトにする方法を紹介します。
先ほどのセキュリティの画面の中の「2ステップ検証」の右上の「・・・」を選択してメニューを出します。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/62530547-64f2-f969-0bae-c70d53f1bb57.jpeg)

展開したメニューの中に「デフォルトの変更」という項目があるので選択します。
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3f225eae-7ebf-974a-0abb-82b05dd53ac6.jpeg)

その中からデフォルトにしたいものを選択します。
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/96378655-ec52-6ae8-ca11-f6d623529547.jpeg)

端末ごとに「通知」と「パスコード」とありますが、「通知」はプッシュ通知でOracle Mobile Authenticatorに通知してくれるので「許可」を押下する事で認証が完了します。
「パスコード」の場合、Oracle Mobile Authenticatorにランダムで表示される6桁の数字をログイン画面で入力する事により認証します。

デフォルトにしたいものを選択して「保存」を押下する事により次回のログイン時から選択した方法がデフォルトの認証方法になります。


## かわりのログイン方法

先ほど、少し触れましたがデフォルトの認証方法以外でログインする方法ですが、2段階認証の画面で「かわりのログイン方法」を選択します。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/9b8d6457-ece4-508f-70a5-c197dc11b14f.jpeg)

登録してある認証方法一覧が出てくるので選択する事によりその認証が利用できます。
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/805bddf7-4a54-df55-00bf-4befe02cfc64.jpeg)
gitで勝手に認証されてしまった場合 Your name and email address were configured automatically based on your username and hostname.

# 初めに
gitで勝手に認証されてしまった場合の対処方法を説明します

# エラー文
```
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

```
# 解決策
名前とメールアドレスの情報を書き換えていく
まずは名前
```
git config --global user.name "名前"
```
名前の部分はgitのユーザーネーム
次にメールアドレス
```
git config --global user.email ~
```
~はgitで登録しているメールアドレス

これらを書き換えた後でさらに変更したい場合は

```
git commit --amend --reset-author
```
で情報をリセットしてください。

そこからもう一度登録しなおせば再度登録ができます。
データエンジニア予定が年休消化中にやったこと

## 記事のモチベーション
転職までの年休消化中に準備として学んだことを言語化していきたいと思います。


## 自己紹介
現在42歳でもうすぐ43歳になりますが、いまさらデータエンジニアへ転職がきまって現在年休を消化中になります。データサイエンティスト希望でしたが、データエンジニアの仕事をすることになりそうなので事前準備を年休消化中にやりたいと思っています。

## さいしょにデータエンジニアとは
データエンジニアとは、データを分析する基盤をつくるエンジニアになります。
データ活用するためにデータを整理するための基盤をつくることが役割となります。

データサイエンスとデータエンジニアは違う。


## 必要なスキル

【データエンジニアに求められるスキル】
基本的なプログラミングスキル
　Python、SQL
データベースに関するスキル
　DWH、
インフラやクラウドに関する知識
　Google Cloud、AWS　など

フレームワークに関する知識
　分散処理等はクラウド前提だと、仕組みを理解しておけばいい？

 データ分析、可視化
 　Pyuthon,BIツール、ML等整備したデータがどのように使われるか知っておくことが重要！

  
【これからのデータエンジニアに求められるスキル】
データエンジニアリングの世界にも、LLMの波がきているそうです。Data Engineering Study #22を聞いて、身が引き締まる思いです。具体的には、BigQueryをたたくのも、AIがプログラミングしてくれる時代、データ分析も、プロンプトエンジニアリングでできるような時代になってきている。

といいつつ自分も最近はコードはChatGPTに書いてもらっているのでそらそうだなとは思います。

下記のようなことが必要だと、言われていました。

・データ分析のスキルを伸ばす。（論文を書けるレベル）
・特定の産業、文約に特化する。（ドメイン知識で差別化）
・上流の「ビジネス/プロダクト」の策定（コンサル的な動き）
・AI化する側に回る。（LLMのパイプライン化ができるとか）

これは、データエンジニア、データサイエンスができる、おじさんになればいいのかなと思いました。


## 結論
これからのデータエンジニアに求められるスキルを意識しつつも、まずは、データエンジニアの基礎を習得をこの2か月で目指します。

## やっていること・やったこと・おもったこと（随時更新）

・データエンジニアに関する全体的な知識の取得
１．Data Engineering StudyのYouTube　　　　　　　　視聴中です。
　#22　これからのデータの関係のエンジニアに求められることを意識しておくことが大切
２．TROCCOのアーカイブ　　　　　　　　視聴中です。
 
・基本的なプログラミングスキル
　SQLのコードを基本的なものをかけるようにしたい
 
・データベースに関するスキル
　「Google Cloudではじめるデータエンジニアリング入門」勉強中
 　Google Cloudの無料枠でBigQueryをトライ中
   TROCCOの無料アカウントでトライ中
　 データレイクモダナイゼーション（オンプレからクラウドへのデータ移行も調査）

・インフラやクラウドに関する知識
　「AWSの仕組みと技術がしっかりわかる教科書」

・フレームワークに関する知識
　「ビックデータのシステム開発がしっかりわかる教科書」

・データ分析、可視化
・データ分析のスキルを伸ばす。（論文を書けるレベル）
・特定の産業、文約に特化する。（ドメイン知識で差別化）
　＜製造業＞
 「中小企業が始める！生産現場のIoT」　勉強中
 　
・上流の「ビジネス/プロダクト」の策定（コンサル的な動き）
・AI化する側に回る。（LLMのパイプライン化ができるとか）

# あとでもう一回トライしたいこと

・データベースに関するスキル
　「Google Cloudではじめるデータエンジニアリング入門」の各ELT,ETLを自分のデータでやってみる。


 # 忘記録
 Google Cloudの各種ETL、ELTの使い分けを少し掘り下げて記事にする。
 Google CloudのCloud Composer、Data Cloud Fusionとdbtの違いってなに？
fatal: detected dubious ownership in repository at 'ディレクトリ名'  ~

# 初めに
gitを使っていて遭遇したエラーの解決方法を紹介します。

# エラー文

```
fatal: detected dubious ownership in repository at 'ディレクトリのパス'
To add an exception for this directory, call:
```
# 解決方法
```
git config --global --add safe.directory ~
```
で解決できる

~はディレクトリのパス
【Ruby on Rails】paramsを使ってURLの値を参照してDBのデータを表示させる方法

## 今回の目標
URLが`localhost:3000/tests/1`の時は`testsDBのid:1`のデータを表示
URLが`localhost:3000/tests/2`の時は`testsDBのid:2`のデータを表示
...
といった形にする。

**基本条件**
・rutes.rb
・tests_controller.rb
・show.html.erb
・Testモデルtestsテーブル
それらが存在している

### やること
:::note info
①ルーティングの設定を追加
②コントローラーを作成
　params変数を学ぶ
③確認
:::
<br>

## ①ルーティングの設定
１つずつルーティングを設定していくとした場合
```routes.rb
get "tests/1" => "tests#show" 
get "tetss/2" => "tests#show"
get "tests/3" => "tests#show"

#それぞれのURLに対してtestsコントローラーのshowアクションを実行する
```
これでも問題ないが、DBに対応という部分を考えると記載する量が莫大になってしまう。

ひとまとめにして記載することができる
```routes.rb
get "tests/:id" => "tests#show"
```
`tests/:id` と書くと `tests/〇〇` が全て該当する
<br>
**ここで注意点**

:::note alert
間違った記載例
```rutes.rb
get "tests/:id" => "tests#show"
get "tests/index" => "tests#index"
```
ルーティングは上から処理されるため、上のような記載方法だと"localhost3000:tests/index"のURLにアクセスしたときでもtestsコントローラーのshowアクションが実行されてしまう
:::
:::note info
正しい記載方法
```routes.rb
get "tests/index" => "tests#index"
get "tests/:id" => "tests#show"
```
/:idのような万能なルーティングは一番最後に記載することで誤動作を防ぐ

:::
<br>

## ②コントローラーを作成
ルーティングの設定ができたので次は、コントローラー内の処理を設定していく。
tests_controllerの現状
```tests_controller.rb
def show
end
```

URLとDBを紐づけるために必要なこととして、
* URL末尾のidごとに取得するデータを変更する
=> URL末尾のidを取得する必要がある

### paramsとは
そういった時に助けてくれるのがparamsメソッドらしい
**役割：パラメータを取得する**
つまり、今回でいうところの**URL末尾のidを取得**してくれるということだ。
paramsでパラメータを取得する方法はいくつかあるようだが、今回はルートパラメータとしてパラメータを取得するのでその方法に絞ってしっていく。

 先ほどルーティングの中で`tests/:id`と記載した`/:id`の部分がパラメータの役割を果たしている。
 URLの文字列内にコロンがついた部分は文字列としては扱われずに一種の変数として扱われる。
 今回ではルーティングで指定した`"tests/:id" => "tests#show"`によってshowアクションに`:id`のデータが渡されてページ遷移が行われるといった感じになる。

```tests_controller.rb
def show
 @test = Test.find_by(id: params[:id]) #ここでは、:idで示されたパラメータの値が@idに代入される
end
```

こうすることで、`testsテーブル内のid:x`のデータを取得し`@test`に代入された状態になる

```show.html.erb
<%= @test.contet %> #urlで指定されたidのデータを表示
<%= @test.created_at %> #urlで指定されたidのデータ生成情報を表示

```
後は取得したデータが格納されている`@test`をhtmlに差し込めば無事情報が表示されると言った流れである。
<br>

## ③確認
URL:`localhost:3000/tests/1`

```routes.rb
#ルーティング
get "tests/:id" => "tests#show"
```
```tests_controller.rb
#コントローラー
def show
 @test = Test.find_by(id: params[:id])
```
```show.html.erb
<%= @test.content %> 
<%= @test.created_at %> 

```
**表示されるページ**

「１」のデータが表示されているよ
2024/04/17 14:24

<br>
こんな感じで表示ができると思います！
Xとか掲示板とかで表示されているのをクリックしたらその投稿単独のビューに行ったりするけどそういう時に使われていたりするのでしょうか。分かりませんが、今回はURLとDBのデータを紐づけて表示する方法を知ることができました。


## 参考にさせていただいた記事
https://qiita.com/sleepy_cat/items/c8eecfc5c486b0f7f2b8

感謝です。ありがとうございます。
ローカルLLMを体験するDiscordBotを作成してみた

# はじめに

最近ハマっているローカルLLMをDiscordBotにしましたので、その作成過程を共有します。

# 必要なライブラリ

以下のPythonライブラリが必要です。

- `discord.py`: Discord APIとのインターフェースを提供します。
- `llama_cpp`: ローカルで実行可能なLLMを提供します。

ない人は以下のようにインストールしてください。

```bash
pip install discord.py llama_cpp
```

# Discord Botの設定

まず、Discordの開発者ポータルで新しいアプリケーションを作成し、そのアプリケーションにBotを追加します。そして、Botに適切な権限を設定し、生成されたトークンを安全な場所に保存します。

# コードの解説

解説を省いているところは以下の記事を参考にしてみてください。

https://qiita.com/sugimochi_1019/items/b2700dfde10b52711e00

## LlamaAdapterクラス

このクラスはLLMのラッパーとして機能し、ユーザーからのプロンプトに基づいてテキストの生成を行います。

```python
class LlamaAdapter:
    def __init__(self):
        # モデルを初期化
        self.llm = Llama(model_path='./japanese-stablelm-3b-4e1t-instruct-q4_K_M.gguf')

    def infer(self, prompt):
        """返答を生成する"""
        output = self.llm(prompt, max_tokens=64)["choices"][0]["text"]
        return output
```

## MyBotクラス

`discord.Client` を継承したこのクラスでは、Botの動作を定義しています。`on_ready` メソッドと `on_message` メソッドをオーバーライドして、Botのログインとメッセージ応答を制御します。

```python
class MyBot(discord.Client):
    async def on_ready(self):
        print(f'Logged on as {self.user}!')

    async def on_message(self, message):
        if message.author == self.user:
            return
        if message.content.startswith('/llm'):
            prompt = message.content.replace('/llm ', '')
            response = self.llama_adapter.infer(prompt)
            await message.channel.send(response)
```

## トークンの取り扱いとBotの起動

安全のため、Botのトークンはファイルから読み込みます。そして、Botを起動します。

```python
with open('token.json') as f:
    data = json.load(f)
    TOKEN = data['bot_token']

client = MyBot(intents=intents)
client.run(TOKEN)
```

# まとめ

こんな感じで比較的簡単にBot作成できました。
もっといろんなモデルで試したいですね。
Power Automate Desktopを使用して、Webページ上でaria-label属性が特定の値に一致するUI要素のセレクターを取得する方法

### Web ブラウザを開く
最初に、**「Web ブラウザを開く」** アクションを使用して、操作したいWebサイトを開きます。

###  UI要素を識別する
Webページ上の特定の`aria-label`を持つ要素を識別するには、**「UI要素を識別」** アクションを使用します。このアクションを使って、特定の属性を持つ要素を正確に指定することができます。

#### 設定方法:
1. **「UI要素を識別」** アクションをフローに追加します。
2. ブラウザを操作して、目的の要素を選択します。
3. アクション設定で、**カスタム属性**を選択し、属性名に`aria-label`、属性値に一致させたい値を指定します。

###  セレクター情報の取得
要素が正確に識別できたら、その要素のセレクター情報を取得するために、**「UI要素の詳細を取得」** アクションを使用します。このアクションは、識別されたUI要素の属性やセレクターなどの情報を提供します。

#### 設定方法:
1. **「UI要素の詳細を取得」** アクションを設定します。
2. 入力として、**「UI要素を識別」** アクションからの出力（識別されたUI要素）を指定します。
3. 出力パラメータとしてセレクターやその他必要な情報を選択します。
【備忘録】エンジニアの基礎知識まとめ

## 前書
エンジニアとして、自分が勉強したエンジニアの基礎知識を備忘録として本記事に取りまとめます。あくまで自分の備忘録という扱いなので、不定期に更新します。

## 1. 変数
簡単に言うと、``変数はデータを保持するためのストレージ``です。
リスト、オブジェクトな諸データ方を変数に保持することができます。
そしてプログラミングの過程でその変数を使うことができます。

### 例1：

```python
# quantityという変数を作り、その中に1という値を保持する
quantity = 1

# nameという変数を作り、その中にappleという値を保持する
name     = "apple"

変数を使用して計算も行える
quantitys = quatity + 1

# 変数の結果を出力する
print(name) # "apple" を表示
print(quantitys) # 2を表示
```

## 2. 関数
簡単にいうと、関数は``特定のタスクを実行するためのコードブロック``です。
関数は入力されたパラメータ（通常は変数）を取り、それに基づいて計算を行い、結果を返す処理をしています。

### 例1:
```python
# helloという関数を定義し、名前をパラメータとして受け取る
def hello(name):
    prinln("Hello," + name + "!")

# 関数を呼び出す
hello("hogehoge") # "Hello,hogehoge!"を表示します
```

### 例2:
```python
# caculateという関数を定義し、商品名と値段をパラメータとして受け取る
def caculate(name, price):
    print(name + "の値段は" + str(price) + "円です。")  # priceをstr()で文字列に変換し、"円"を追加して明確にします。

# 関数を呼び出す
caculate("apple", 100)
```


## 3. 変数と関数の違い
上記1と2を理解すれば、違いを要約すると、``変数はデータを保持し、関数は操作を実行する``という違いになります。

## 4. allOf, anyOf, not
結論から言うと：
1. `allOf`:いわばAND条件。すべての指定された条件がtrueの場合に、trueを返す。つまり、与えられたすべての条件が満たされた場合にトリガーされる
1. `anyOf`:いわばOR条件。指定された条件のいずれかがtrueの場合に、trueを返す。つまり、与えられた条件のいずれかが満たされた場合にトリガーされる
1. `not`:指定された上演がfalseの場合にtrueを返す。つまり、与えられた条件が満たされない場合にビルドトリガーされる

## 5. item.source.each {...}
Groovyにおけるループ構造で、item.sourceの各要素に対しての操作を行う。
たとえば[GitSCMSource](https://javadoc.jenkins.io/plugin/git/jenkins/plugins/git/GitSCMSource.html)を例：

```groovy
item.source.each [
  if (it instanceof GitSCMSource) [
  // GitSCMSourceのインスタンスに対する操作
  ]
]
```

## 6. instanceof
groovyの一種演算子、あるオブジェクトが特定のクラスのインスタンスであるかどうかをチェックします。

## 7. allItems.each [ item -> ... ]
Groovyにおけるループの一種となります。`allItems`のコレクションの各要素に対して一連の操作を実施します。
`item -> `の部分はループを使用して、itemという変数を定義し、その変数を使って一連の操作を実施します。
ゼロから始める内製開発～練習編～

# はじめに
我々ポーラオルビスホールディングスでは2023年より内製開発に挑戦しております:muscle:
今回は、内製開発チームのデビュー作のプロダクトについてご紹介させていただきます:beginner::seedling:


# 練習とは
開発チーム発足時、本当に自分たちの手で開発できるのか・・・:fearful:という不安もありました:droplet:
そこで、事業に必要なプロダクト開発を行う前に開発体制の検証としてPoC開発を行いました。

目的は下記の通りです:writing_hand_tone1:
:one:PoC開発を通じて、システム開発を遂行できる体制が構築できているか検証する
:two:PoC開発においてうまく機能しなかった点は今後の開発に向けての改善策を策定する

# PoC評価基準
目的:one:の開発体制構築ができているかを評価するため、評価軸を設定しました:white_check_mark:
評価軸は結構細かく設定したので詳細は割愛しますが、概要は下記の通りです:grinning:

:triangular_flag_on_post:各自の役割を果たすことができるか
　我々のアジャイルスクラムチームにおけるPO、SM、エンジニア、ブリッジの役割定義を行い、定義された通りの行動を取れたかを評価します。

:triangular_flag_on_post:策定した開発ルールを理解し遂行できるか
　スクラムイベントの実施や開発を行うためのルールを策定し、ルールを守ることができたかを評価します。

:triangular_flag_on_post:開発に必要な環境が整えられているか
　開発に使用する環境や各個人のアカウント、コミュニケーションを取るためのツール等、開発に必要なものを洗い出し、使用可能になっているかを評価します。
 

# PoC案件の選定基準
PoC開発は「プロダクト開発に挑戦して経験を積みたいけどできるか不安がある」状態での開発なので、案件は下記を基準に選定しました:star2:
:round_pushpin:フロントエンド、バックエンドの構築が必要
:round_pushpin:業務上必要とされているがシステムトラブルがあっても業務影響が少ない
:round_pushpin:複雑な要件はない

他チームの方にも呼び掛けて対象となりそうな案件を募集して選定した結果、勤怠管理ができるWEBアプリを構築することになりました:confetti_ball::sparkles:


# 開発したプロダクト
弊社はコロナ禍を経て在宅と出社のハイブリッドワークを行っております。
各々が業務状況や家庭事情により勤務場所を選択しているため、出社しているのか、在宅勤務なのか、またはお休みをしているのかをチームに共有するために、エクセルファイルに勤務場所を記載してSlackでその内容を連絡するという運用を行っていました:sweat_drops:
エクセルの記入がしにくく運用も煩雑だったため、登録したら自動でSlackにも通知される機能がほしいと思い勤怠管理システムを構築しました:bulb:
このシステム利用者の想定は、我々が所属するグループデジタルソリューションセンター(GDSC)の中でも一部のメンバーです:two_men_holding_hands:

勤怠管理システムとして当初構築した機能は下記の通りです:hammer_pick:
・自分の勤務場所を登録する
・自分の勤怠情報を確認する
・他メンバーの勤怠情報を確認する
・登録された勤怠情報をSlackで通知する

これらの機能をMVPとして構築し、無事に運用を開始することができました:smile::sunny:
実際に開発した勤怠管理システムの画面の一部をお見せします:eyes:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739961/b2c428e2-50b0-b3e9-328b-ecd6296bdf50.png)

元々はGDSCの一部のメンバーのみで利用するために構築したプロダクトでしたが、その後、GDSC全体に展開することになり、様々な機能アップデートも加えております:thumbsup_tone1::arrow_heading_up:
この勤怠管理システムは現在も絶賛稼働中ですので、価値のあるプロダクトを構築できた！と思っております:raised_hands_tone1:


# PoC評価

PoC開発実施前に設定していた評価軸について評価を行いました！
評価の結果として上がった課題と改善策について一部だけご紹介します:point_up:

:white_check_mark:1週間スプリントで実施していたが、期間が短く1スプリントで価値創出することが難しかったため2週間スプリントで実施する
:white_check_mark:自分からタスクを取りに行くスクラムスタイルの動きができず遂行されないタスクが発生してしまったため、スプリントプランニングの際に役割を明確に決定する
(本来のスクラムの姿とは異なりますが、アジャイルスクラム未経験のメンバーが多くいきなり理想の動き方を実現するのは難しかったので一旦は役割分担を決める形にしました)

上記のようにPoC開発において発生した課題に対しては改善策を検討し、次のプロダクトの開発に活かしています:runner_tone1:


# さいごに

PoC開発に関してはあくまで体制の検証の立ち位置だったのでさらっと述べるつもりだったのですが、デビュー作ということもあり思い入れが強いため、ついつい長くなってしまいました:fire:
PoC開発の後に開発した、練習ではないプロダクトについてはまた次回投稿いたします:bow_tone1:
nginxとは？

# 経緯
nginxはよく聞くwebサーバーだけど、webサーバとしか思ってなかったから、どんなものなのかを調べてみました

# webサーバーとしてのnginx
nginxの目標は、webサーバーのパフォーマンスを向上させ、最速のwebサーバーを生み出すことです。

単純なhtmlを配信するだけでなく、websocket、HTTP/2や複数の動画フォーマット等、様々なコンテンツ配信にも対応しています。

nginxはオープンソースで誰でも無料で使用できます。また、Linux、windows、macOSでも動かすことができます。

# webサーバー以外の機能
大量の接続を処理できるnginxは、リバースプロキシやロードバランサーの役割も担うことができます。

一般的にNode.jsやPHPで構成された動的なサイトでは、コンテンツキャッシュやリバースプロキシとしてnginxを使用することで、アプリケーションの負荷を軽減することができます。

## リバースプロキシとは

外部インターネットからサーバーへサクセスされる通信を中継する仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/76da2801-1331-211b-a3c6-ae0be7379d79.png)



リバースプロキシのメリット
- リクエスト内容に応じたサーバーの選択
一つのURLの下で複数のサーバーを統合し、その内容に応じてリクエストを振り分けられます。

- 負荷分散
リバースプロキシの背後に同じ処理を行う複数のサーバーを用意しておけば、大量のアクセスが集まった場合でも各サーバーにアクセスを振り分けて分散できます。(ロードバランサーの役割)

- セキュリティ
悪意のある攻撃者がwebサーバーへ直接アクセスできなくなるため、webサイトの内容が改ざんされるリスクが低減されます。
また、リバースプロキシと認証サーバーを連携させることで、複数のアプリケーションへの認証・許可を行うシングルサインオンが実現できます。
ただ、一般的にDMZに設置されることが多いため、サイバー攻撃の対象となり危険性が高まりやすいので、定期的に設定やパッチを確認し、最新の状態に保つ必要があります。


# Apacheとの比較

こちらの記事によくまとめられていました。
PHPやwordpressを用いる場合はApacheの方がいいみたいですね。

https://hnavi.co.jp/knowledge/blog/nginx/

![スクリーンショット 2024-04-17 11.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/d8b70e85-e87a-3c17-80d5-a4e909cf6671.png)


# 参考文献

https://www.nginx.co.jp/resources/glossary/nginx/

https://hnavi.co.jp/knowledge/blog/nginx/

https://eset-info.canon-its.jp/malware_info/special/detail/201021.html
お問合せフォームとかちゃんと理解してないやつが独自で作ったらスパマーに狙われ放題

# 独自実装のお問合せフォームは狙われる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84965/7a10dc77-2bb9-9d18-01ab-4e950f72edc8.png)


AWSのSESを使ってサービスを構築していたら、スパムメールが大量に届くという苦情がきました。このままだとサービス停止するという内容です。
怖いですね。AWSから脅迫されているようですｗ

サービスが複数立ち上がっているので、それぞれソースコードを見てみると、うん、これは狙われるね、っていうコーディングでした。
FormタグのActionにURLが指定されていました。
なぜ、Actionが指定されているとだめなのか、この理由がわからない人は、要注意です。


## スパム送信者の気持ちになる

スパムメールの送信者の気持ちになって考える必要があります。敵を知る、ですね。



## AWS SESを使った構築においての注意点
※SESに限ったことではありません

AWS SES（Amazon Simple Email Service）を使ってメール送信サービスを構築する際には、特にフォームのセキュリティに注意が必要です。フォームタグのaction属性にURLが指定されている場合、スパムメールの問題が発生する背景には、いくつかの理由が考えられます。これを理解するためには、スパム送信者の視点から考えることが有効です。

## スパム送信者の動機とターゲットの選び方

 ### 自動化とスケーリング  
 スパム送信者は、できるだけ多くのメールを短時間で送信しようとします。彼らは自動化されたツールを用いて、インターネット上で公開されているフォームを探索します。フォームのaction属性に外部のURL（スパム送信者がコントロールするサーバーのURLなど）が指定されていると、そのフォームを利用してスパムやフィッシング攻撃を仕掛けてきます。


### 脆弱性の悪用
一部のフォームは、送信されたデータの検証を十分に行っていない場合があります。スパム送信者はこれを利用して、スクリプトを埋め込むことでクロスサイトスクリプティング（XSS）攻撃を行ったり、SQLインジェクションを通じてデータベースに不正アクセスを試みたりします。

### 信用の悪用
合法的なサービスのフォームを模倣することで、ユーザーが信用して情報を入力することを狙います。この方法で、個人情報やクレジットカード情報などの重要なデータを不正に収集することが目的です。

# 解決策

**検証とフィルタリング**
フォームに入力されたデータはサーバーサイドで必ず検証し、不正な入力やスクリプトが含まれていないかチェックする必要があります。
**CAPTCHAの利用**
フォーム送信時にCAPTCHAを使用することで、自動化ツールによる悪意ある利用を阻止できます。
**HTTPSの強制**
フォームデータの送信はHTTPSを通じて行うことで、中間者攻撃によるデータの盗聴を防ぐことができます。
以上のように、フォームのaction属性に外部URLを設定することがスパムやフィッシングに悪用されることは十分考えられるため、これを防ぐための対策が重要です。




### そもそもわからなかったら独自実装しない
wordpressのプラグインでお問い合わせフォームは、contact form 7 が有名です。こういう有名なのを使っていれば心配ない（というのは、作者がしっかり対応してくれる）。

https://ja.wordpress.org/plugins/contact-form-7/


# スパム対策 jquery氏による

スパム対策として、jqueryを使って作ってみます。

``` html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォーム送信例</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<form id="myForm">
    <input type="text" name="username" placeholder="ユーザー名">
    <input type="password" name="password" placeholder="パスワード">
    <button type="submit" id="submitButton">送信</button>
</form>

<script>
$(document).ready(function() {
    $('#submitButton').click(function(event) {
        event.preventDefault(); // 通常のフォーム送信をキャンセル
        var form = $('#myForm');
        form.attr('action', 'https://yourserver.com/submit'); // ここに正しいアクションを設定
        form.submit(); // フォームをプログラム的に送信
    });
});
</script>
</body>
</html>
```

### 解説
この例では、フォームのaction属性は初めに設定されていません。
ユーザーが「**送信**」ボタンをクリックすると、jQueryスクリプトがaction属性を動的に設定してからフォームを送信します。
**event.preventDefault()** を使用して、ボタンクリックによる通常のフォーム送信をキャンセルしています。これにより、JavaScriptが無効な場合にはフォームは送信されません。

この方法は、ページロード時にaction属性が明らかでないため、自動的なスクリプトによる悪意あるフォームの送信を防ぐのに役立ちます。
【ChatGPT＋DALL-E3】Select機能での削除だけど……。


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

　今回は、Select機能での削除についてです。ちょっと状況が変わってきているのかな？

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

　まずは、
　　本題前にちょっとだけ。

[【OpenAI Japan始動】と関連情報。](https://qiita.com/kabumira/items/fab541c480c6ef17633d)
　　は、見てもらえましたか？

　読んでくださった方の
　　数が少なかったのは、
　　　まぁ、仕方ないんですけどね。

　でも
　　ChatGPTの操作に関しても
　　　書いたので、気になったら
　　　　チェックしてください。

　UIが少し
　　変わっただけですけどねw
***
　さて、
　　次は、画面上の変化です。
　　　操作などには変更なしです。

　ChatGPT Web版の
　　ChatGPT側のアイコンが
　　　変わりました。

　今までは、
　　紫バックの白だった。
　　　（Plusの話）

　しかし、今は
　　背景色バックの
　　　反転色になってる。

　つまり、
　　背景が白なら
　　　アイコンの図柄は黒くなる。

　　背景が黒なら
　　　アイコンの図柄は白くなる。

　この変更は
　　体験版、無料版、Plusで
　　　同様であることを
　　　　確認してあります。
***
　さて、
　　今日の本題です。

　今日の元画像は
　　こちらです。
![1713317660571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/12baf529-0e13-974f-65a7-de1a7d259210.jpeg)

　Select機能で
　　画像のとある部分を
　　　消す際に、塗りつぶして送信する
　　　　という方法がある、と
　　　　　少し前に書きました。

　今、それはダメです。
　　こんなメッセージが出ます。
>It looks like your message was empty. If you were trying to request something or provide feedback, could you please try sending your message again?

　DeepL翻訳
「メッセージが空だったようです。 もし何かをリクエストしたり、フィードバックを提供しようとしていたのであれば、もう一度メッセージを送信してみてください。」

　プロンプトを入れるしかない。
　　そこで“削除して”と送信。
>It seems there might have been a misunderstanding; I cannot delete or modify images already generated. If you have another request or need a different image, feel free to let me know how I can assist you!

　DeepL翻訳
「すでに生成された画像を削除したり修正したりすることはできません。 もし別のご要望があったり、別の画像が必要な場合は、どのようにお手伝いできるか、遠慮なくお知らせください！」
　　あかんやん！

　今度は、
　　“背景にして”と送信。

　ようやく描画に
　　入りました。

　出てきたのは
　　同じ器に
　　　唐揚げっぽいもの。

　さらに
　　“背景と同化して”。

　今度は、かき揚げ。

　さらにさらに
　　“消して”
　　　→意味不明な器が。

　“この器を消して”
　　→玉子焼きに

　ふたつの器を
　　塗りつぶして
　　　“ここをきれいにして”
　　　　→新しい料理に。
***
　ここまでは
　　元画像に変更を掛けてきましたが
　　　最後の画像を使ってみます。

　範囲を広げて
　　“これはいらない”
　　　→後ろの料理が消えた。
　　　　　前は別の料理に。

　その画像で
　　前の料理を塗りつぶして
　　　“これはいらない”で送信。
　　　　→ようやく消えました。
![1713317677471.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/405e6b61-5483-474f-a453-b09e367678bb.jpeg)
***
　元画像よりも
　　反応がいいですねぇ😅

　新しい画像に対して
　　塗りつぶして、
　　　“これはいらない”を
　　　　繰り返していくのが
　　　　　一番の方法なのかも。

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

　今回は、ここまで。
Springbootで特定のエンドポイントが実行されたらセッションを更新しないような実装をしてみる

# 概要
一定時間ごとにAPIを実行してセッションが有効かどうかの判定がしたかった。
Filterを実装しセッション有効判定エンドポイント以外がアクセスされた場合はsetAttributeに現在の時間をセッションに設定しセッション有効判定エンドポイントがアクセスされた場合はセッションタイムアウトのチェックとセッションの無効化をおこなうようにしてみた。

```java
@Component
public class SessionTimeoutFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpSession session = httpRequest.getSession();

        if (httpRequest.getRequestURI().endsWith("/session-timeout")) {
            // セッションタイムアウトのチェックとセッションの無効化
            checkAndInvalidateSession(session);
        } else {
            // 現在の時間をセッションに設定
            session.setAttribute("sessiontimeout", System.currentTimeMillis());
        }
        chain.doFilter(request, response);
    }

    private void checkAndInvalidateSession(HttpSession session) {
        long lastAccessTime = (long) session.getAttribute("sessiontimeout");
        if (lastAccessTime + 100000L <= System.currentTimeMillis()) {
            // 時間が来たらセッションを無効
            session.invalidate();
        }
    }
}

```
picoCTF 2021 writeup mod 26

### mod 26 (Cryptography)

Cryptography can be easy, do you know what ROT13 is? cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_nSkgmDJE}

問題文よりROT13による暗号化であると仮定する。
ROT13で暗号化されたものは、もう一度ROT13で暗号化すると復号できる。cyberchef(https://gchq.github.io/CyberChef/) を使って暗号化すると、flagが得られた。

`picoCTF{next_time_I'll_try_2_rounds_of_rot13_aFxtzQWR}`
pythonのunittestモジュールでテスト対象コード上のprint文を標準出力する

unittestを書いているときもprintデバッグしたいときありますよね。私はあります。
そんなときのプラクティス

```python
import io
import sys

class Case(unittest.TestCase):
    def setUp(self):
        # 標準出力退避
        self.original_stdout = sys.stdout
        # 標準出力をキャプチャするためのストリームをセットアップ
        sys.stdout = io.StringIO()

    def tearDown(self):
        # 標準出力を元に戻す
        output = sys.stdout.getvalue()
        sys.stdout = self.original_stdout
        # プリント
        print(output)
```
[Oracle] SQL*PlusでのCSV出力、まだ || ',' || つなげてますか？

## やりたいこと
(Oracle) SQL*Plus で データをCSV形式で出力したい

### 環境
Oracle Database 11g R2 以降
（確認できたバージョンです。もっと古いバージョンでも使えるかもしれません

## やりかた
方法はこれ！

:::note info
SQL*Plusコマンド　「 set markup csv on quote off 」
:::


＜デフォルト表示＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/e1cd79db-c102-d31b-7dfa-6021e284dcb2.png)


＜設定後の表示＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/5ec43f55-a051-28c9-c769-f7d91481cbdd.png)

どうでしょうか。
「 set markup csv on quote off 」コマンドを実行してから
SELECT文を実行するだけでCSV形式になりました。
これは便利ですね。


他にもオプションで、区切り文字を変えたり、できますのでマニュアルをチェックしてください。
またCSVだけではなく、HTMLの表形式（タグ）でも出力できますよ

https://docs.oracle.com/cd/F19136_01/sqpug/generating-HTML-reports-from-SQL-Plus.html#GUID-BCC83F09-A432-4A6F-A8BA-1A099A5830BF
sphinxでドキュメント作成（WIN10）

### 使用背景
プロジェクトでメンバーに情報共有用に「sphinx」が便利そうだので使ってみました。
OSはWindows10を使用

---
### 参考記事と公式サイト
https://qiita.com/kinpira/items/505bccacb2fba89c0ff0

https://www.sphinx-doc.org/ja/master/index.html

---
### PowerShell を起動し、sphinxをInstall
```
pip install sphinx
```
Successfully installed と表示されればOK

### プロジェクトフォルダを作成し、プロジェクトフォルダに移動する
```
mkdir test
cd test
```
### プロジェクトの作成
```
sphinx-quickstart
```
yを入力して進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/337eefb2-84bc-edce-5ed3-40c8fef27875.png)

色々聞いてくるので入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/60dae30b-981b-ea57-3b56-5ca26aa359c0.png)

フォルダ内のファイル構成を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/a67398b9-bf03-3595-49d1-12bd913ca6df.png)

#### 補足情報
make コマンドでhtmlを叩くとエラーが出ました。
原因はWindowsでmakeを使う場合ChocolateyかMinGWやCygwinのインストールが必要らしいです。

以下、ChatGPTのコメント
```
makeは、主にソフトウェアのビルドプロセスを自動化するために使用されるツールで、UNIX系の
オペレーティングシステムで一般的に利用されますが、Windowsでは標準では提供されていません。
```
自分はChocolateyをインストールしました。
PowerShellを管理者権限で起動する。
```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```
インストールが完了したらPowerShellを再起動し、再度管理者権限で起動する。
#### インストールの確認してmakeコマンドをインストールする。
```
choco
```

```
choco install make
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/7245cc2b-7cda-9fb3-f852-d8e4f9be783e.png)

### プロジェクトにhtmlを作成する
```
make html
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/77435e5b-4d05-a49d-a655-d908cd997d1a.png)
ビルドが成功したらbuild直下にhtmlフォルダが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/26b4825a-13c4-7796-dc1d-865fabf147c1.png)

htmlフォルダに移動しindex.htmlを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/f809ecab-f935-680b-fe96-27bbefa78ee3.png)

### テーマを変更する
conf.pyはsource直下にあります。
デフォルトのテーマは"alabaster"でした。
今回はbizstyleを使用した。
```
html_theme = 'bizstyle'
```
### ページの作成
デザインが変わらないときはmake htmlを叩く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/95678767-2142-2aca-30a1-deda21472f18.png)
### ページを追加していく
ドキュメント構成に関しては、下記記事がわかりやすかったです。

https://zenn.dev/y_mrok/books/sphinx-no-tsukaikata/viewer/chapter9

一先ずはドキュメント作成まで出来ました。
これ以降は記述方法を学びながらドキュメントを追加していきます。
ビジネスインテリジェンスの未来

[Narrative BI](https://www.narrative.bi/) へようこそ。ここでは、ストーリーテリングの芸術を通じてビジネス インテリジェンスの未来が展開されます。 私たちは、データが対話となり、データの専門家だけでなく組織内の全員が洞察にアクセスできる世界を構想しています。

**私たちのビジョン:**

データは現代世界を推進していますが、選ばれた少数の人だけがアクセスできる複雑なシステムに閉じ込められたままになっていることがあまりにも多いのです。 Narrative BI では、この現状に挑戦します。 私たちの使命はシンプルです。ナラティブ主導の分析を通じて、データを普遍的に理解し、実用的なものにすることです。

**チャレンジ：**

従来、ビジネス インテリジェンス (BI) は、高密度のダッシュボードと不可解なグラフによって行き詰まり、専門家以外が有意義な洞察を得ることが困難でした。 この制限により、意思決定がデータ アナリストと IT 専門家の少数のグループに限定され、組織内で膨大な可能性が活用されないままになります。

**当社のソリューション:**

Narrative BI は、生データを魅力的でわかりやすいストーリーに変換します。 私たちは、BI の未来はより複雑なデータにあるのではなく、よりシンプルで誰もが理解できる、よりアクセスしやすい物語にあると信じています。 当社のプラットフォームは、データの言語を日常の業務運営の言語に翻訳し、すべてのチームメンバーが情報に基づいて迅速かつ自信を持って意思決定できるようにします。

**ナラティブ主導型分析への移行:**

より包括的なデータ文化に移行するにつれて、ナラティブ分析の役割はますます重要になります。 Narrative BI は、複雑なデータセットを説得力のあるストーリーに変換することで、リアルタイムでデータを操作し反応するすべての人の能力を強化する運動の最前線に立っています。

**これがあなたのビジネスにとって何を意味するか:**

マーケティングから財務、人事までのあらゆる部門が、データ サイエンティストと同じ熟練度でデータ主導の洞察を活用するシナリオを想像してみてください。 Narrative BI はこれを可能にし、かつてはデータを突破できないように思われていた障壁を打ち破ります。

**BI の将来:**

ビジネス インテリジェンスの状況を再定義するこの旅に参加してください。 データがただ見るだけでなく理解される未来を受け入れましょう。 分析するだけでなく、感じて行動する。 Narrative BI を使用して、包括的でナラティブ主導の意思決定の新時代に足を踏み入れましょう。

[Narrative BI](https://www.narrative.bi/) では、単にソフトウェアを開発しているだけではありません。 私たちはビジネス インテリジェンスの未来を創造しています。 データがストーリーを語り、あらゆるストーリーが行動を促す未来。 ビジネス インテリジェンスの新しい物語へようこそ。