OmniAICreator/Qiita-1.07M huggingface dataset:
[ODC]Consume REST APIのBase URLを実行時に変更する

OutSystems 11の頃に[Consume REST APIのカスタマイズを試してみる](https://qiita.com/jyunji_watanabe/items/f1b0c225b9858e0cf5da)でみた方法で、Consume REST APIの通信にカスタマイズを加えられる。
ここでは、その中でもBase URLの書き換えについて見ていく。

# 環境情報
ODC Studio(Version 1.4.11)

# 実行時にBase URLを書き換える方法
Consume REST APIのOn Before Requestを使う。作成するには、Consume REST APIのOn Before Request右のドロップダウンリストを展開し、「New OnBeforeRequest」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/20e851dd-61eb-d1f7-80b3-4b4f0cdc0d6d.png)

OnBeforeRequest Actionでは、Output ParameterのCustomizedRequestを編集することで、対応するHTTPS通信内容の書き換えを行える。

デフォルトでは、CustomizedRequestにRequestをAssignしてある。後続処理で、CustomizedRequestを書き換えればよい。

書き換えるのは主に以下のAttribute。
- Base URL: 「https://\<ホスト名\>/\<App名\>/rest/\<REST API名\>」が入っている
- URLPath: 「/\<REST API Method\>」

# サンプル実装
ホスト名部分を書き換えるなら、OnBeforeRequestの実装を以下のようにする。
Ifの部分でクエリストリングの特定パラメータをチェックし、特定の値のときだけBase URLを書き換える流れ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7aeb6702-7b06-5631-a927-38fc46c12c4b.png)

ホスト名書き換えには、標準APIの[HTTP/Http_RequestDomain](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/outsystems_language_and_elements/libraries/http/#request_replacedomain)を利用している。第1引数で指定した変換対象URLのホスト部分を第2引数（ここでは私のブログのホスト）で置き換えたものを返す。
なお、ポート番号を含むURLの書き換えにはこのActionは使えず、自分で変換ロジックを書かないといけない点に注意。

# 動作確認
ホスト名書き換えのリクエストを行ったあとで、TracesでConsume REST APIのHTTPリクエストを確認した。以下のように元のリクエストのホスト部分を書き換えたURLにアクセスしている（適当なホストに書き換えているので、該当パスがなくHTTP Statusは404）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1b0b0158-bff7-673d-a2a1-fd476fa88950.png)

# 用途
例えば、接続先のREST APIが同質のものが複数あり、入力条件やSettingに応じて接続先を切り替えたいときに使える。

なお、接続先の数が固定的であれば、この方法よりは、アーキテクチャパターンのTransparency Patternを使ったほうが良いだろう。
システム監視の概論を論じてみよう!!

こちらの記事では、インフラエンジニアとして働く私が、経験や本での勉強を踏まえて、システム監視の基本的な概論をまとめました。

サービスを止まらせず、通常運転させることがインフラエンジニアとしての腕の見せどころ。

そんなインフラエンジニアとして働き始めたペーペーの私ですが、監視についての考え方はまとまり始めました。

そこで「個人的な考え方を整理してやろう」と思い立ち、書いた記事です。

他の方のご意見はすごくありがたいので、何かありましたらコメントお願いします🙇

## 運用は育てるマインド
システム監視の本題に入る前に、運用監視のマインドを定めておきましょう！

【初めから多くは望まず、随時育てる！】

要件定義や現状からわかる範囲でシンプルに定義し、運用しながら徐々に育てていく意識が大切ですね。

「完璧に運用・監視していくぞ」と息巻いても、運用していくうちに課題は見つかるものです。その度に落ち込んでは何も進歩しません。

課題が見つかったら、その課題をどう運用していけば解決に役立てられるか、その都度見つけていこう！というお話です。

## 「監視項目」 + 「正常な結果」で定義
まずはシステムの正常な状態をしっかり定義しておく。

サービスを提供する会社側としては、
+ トラブルで不意に意図せず停止・性能低下することがないようにしたい！
+ もし停止・性能低下した場合には迅速に復旧できるようにして、正常な状態を長く保ちたい！

このように、正常な状態を保つことがシステム監視の目的です。

非機能要件に密接しますが、システムがどうのような状況の時に正常と認めるかを社内で定義しておきましょう。

例えば「ボタンを押して画面を表示するのにかかる時間は3秒以内」などなど。

そうして正常な状態を定義したら、「監視項目」と「閾値」も決めましょう。

閾値の決め方は、要求されている機能要件と非機能要件を満たすこと。

しかし、閾値を低く設定してしまうと、アラートが頻繁に出てしまいます。

アラート発火は極力減らすよう調整したいところ！

いっぱいアラートメールが飛んでしまっては、いざ障害が発生した時に、情報が混乱してしまいます。

誤報や対応不要のアラートは０件に！念の為のアラート発報は厳禁です！

### 確認したい項目は直接確認

システム監視においては、確認したい項目を直接確認するようにしましょう。

たとえば、「ロードアベレージが高くなると応答時間が遅くなる」という知見があったとしても、ロードアベレージを応答時間の目安にすることはやめよう。応答時間を直接監視するようにしよう。ということです！

## 正常な状態じゃなくなった時の対応方法を監視項目ごとに定義

正常じゃない状態とは？

完全にダウンした時は分かりやすいが、たまに応答が遅い時など微妙なことも多いです。

「どんな状況だ？....その状況だとこういうアクションを起こそう」という場合わけが必要になりますね。

なんとも言えない場合について、どんな方針で対応するか決めよう。

例えば下記の通り
+ [正常な状態] ：HTTP応答がステータス 200 である
    + [対応方針] → ステータス 500 になった場合は Apache を再起動
+ [正常な状態] ：ディスク使用量が 80% 以下である
    + [対応方針] → 80% を超えた場合はログの保持時間を短くする

正常な状態であることは、ツールを使って継続的に確認しましょう。

ツールじゃなくても、お手製のシェルスクリプトを cron に仕込むやり方もあります。勉強がてらシェルスクリプトを作ってみるのもいいかもしれないです。

っていうか私はそうしています！

ZabbixとかGrafanaとか使っているのに...w

昔は5分おき、10分おきの監視が主流だったが、今はインターネットの普及やサーバ性能の向上によりシステムのリアルタイム性が増してきたこともあり、1〜3分間隔での監視が主流という考え方が一般的ですね。

## 監視項目を洗い出す

監視には、２つの監視があります。
+ システムの外部接続状況を監視する「外形監視」
+ システムの内部を監視する「内部監視」

外形監視の項目は、設計段階で機能要件として明確になっています。

HTTPのみなのか、HTTPSも利用するのか、メールサーバとして利用するかなどです。

内部監視には「サービス稼働状況監視」と、「システムリソース監視」があります。

稼働するサーバ内部のリソースやプロセスを監視するというイメージですね。

### [定番] 外形監視の項目
ブラウザからWebアプリにアクセスし表示内容やレスポンスのチェックなど、ユーザーと同じ方法でアクセスしシステムが正常に動作しているのかを確認します。

定期的に外形監視を行うことで、ユーザーがストレスを感じずに使えるか、UIに課題がないかも確認できるので、ユーザー視点でのチェックは不可欠です。

主な監視項目は下記の通りかなと。
+ HTTPレスポンスコード・内容・応答時間・サイズ
+ HTTPSレスポンスコード・内容・応答時間・サイズ
+ POP、SMTP、FTP・・・
+ 死活監視
+ メール送受信
+ ファイルPUT・GETなど

### [定番] 内部監視の項目
サーバ内部のリソースを監視します。

主な監視項目は下記の通りです。
+ CPU使用率
+ ロードアベレージ
+ ディスクごとの使用量
+ ディスクごとのI/O要求りょう
+ ディスクごとのレイテンシ
+ NICごとのトラフィック IN/OUT
+ サービスに使うプロセスの監視(apache, nginx, mysqldなど)
+ システムに使うプロセスの監視(ntpd, snmpdなど)

サーバー上のプロセスの稼働状況を監視することを「プロセス監視」といいます。

システムを想定通りに動かすには、様々なプロセスが正常に動作する必要があります。

そのためシステムを支えるプロセスの動作状況に問題がないかを監視し、何かあった際には迅速に対応できるよう備えることが重要です。

## まとめ
いくらきっちりかっちり監視体制を整えたとしても、予想外の障害が起きるものです。

そんな時こそ、インフラエンジニアの出番。

落ち着いて、エラーメールやログを見て、サーバのリソース状況やプロセスなどをくまなく調査し、原因の可能性がありそうな箇所を徹底的に攻める！

調査の時に、見るべきポイントや使えるコマンドなどを頭に入れておけば、スムーズに復旧することもできます。

要するに、普段から備えておこうということですね！
【備忘録】Laravel10でのPHPUnitの使い方

エンジニアとして働きながら個人でLaravel10を触っています。記事を読みながら実装を進めていくとPHPUnitに関する記事がまとまっていない状態でした。そのため備忘録としてQiitaにまとめてみました。

## 環境
Windows10
ubuntu(wsl) 22.04.4 LTS
Laravel 10.48.12
PHP 8.3.7
DB sqlite3

## PHPUnit とは
PHPUnitとはPHP言語の単体テストを行うためのフレームワークです。
変更した箇所で要件を満たしていて、既存の機能に影響がないかを自動で確認することができます。

## PHPUnitのメリット・デメリット
### メリット
- モジュールが結合される前にテストができるため、問題の原因特定が容易
- コードの作成と並行してテストコードを書くため、コード理解が深まる
- PHPUnitを使うことで自動化できる
    →コマンドのみで動作確認が可能

### デメリット
- 開発者の開発負担が高くなる

## UnitとFeature
testsディレクトリ配下にはUnitとFeatureがあります。
|         | 使い分けについての説明           |
|:--------|:--------------------------------|
| Feature | １つのHTTPリクエストの動作テスト |
| Unit    | 1つ1つのメソッドなどの動作検証   |

## UnitとFeatureの使い分け
Feature: Controller
Unit: Model、Service、Repository

上記の使い分けがスタンダードな分け方になるかと思います。

## 作成方法
新しいテストケースを作成するには、`make:test`コマンドを使用します。デフォルトでは、テストは`tests/Feature`ディレクトリへ配置されます。
```bash
php artisan make:test SampleTest
```
`tests/Unit`ディレクトリ内にテストを作成したい場合は、`make:test`コマンドを実行するときに`--unit`オプションを使用します。
```bash
php artisan make:test SampleTest --unit
```
上記のコマンドを実行すると以下のようなPHPファイルが生成されます。

```tests/Feature/SampleTest.php
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class SampleTest extends TestCase
{
    /**
     * A basic feature test example.
     */
    public function test_example(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}
```

```tests/Unit/SampleTest.php
namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class SampleTest extends TestCase
{
    /**
     * A basic unit test example.
     */
    public function test_example(): void
    {
        $this->assertTrue(true);
    }
}
```
上記の内容を適宜修正すれば操作可能です。

## おわりに
Laravelは多くの機能が入っています(MVC、bladeなど)。これらを使ってはじめてLaravelの美味しさを味わえるのだと思います。その足掛かりとしてPHPUnitを勉強していただけたらと思います。


## 参考記事
[LaravelでPHPUnitを使ってテストする手法](https://qiita.com/shindex/items/4f28f8e06ef2d10e8d2b)  
[LaravelビギナーのためのPHPUnitを利用したユニットテスト入門](https://reffect.co.jp/laravel/phpunit-test)  
[LaravelでPHPUnitで自動テストを行う](https://qiita.com/ky-jp16/items/4c7f5313d5d3000c7303)  
[【Laravel】PHPUnitでControllerの自動テストを実装する](https://logical-studio.com/develop/backend/20220826-laravel-phpunit-controller/)
再帰関数でフィボナッチ数列を書いてみる

### 再帰とは
関数の処理の中で同じ関数を呼び出すことで繰り返しを実現すること。
言い換えると、メソッドの中でそのメソッドを再び呼ぶこと。そうすることで、for文やwhile文のように処理が繰り返し実行されます。
では、フィボナッチ数列を使って具体的に見ていきます。

### フィボナッチ数列とは
フィボナッチ数列とは、以下の式を満たす数列です。
0, 1, 2, 3, 5, 8, 13, 21, 34, 55...となっていきますね。
$$
F(n) = 
\begin{cases} 
n & \text{( n = 0, 1 )} \\\\
F(n-1) + F(n-2) & \text{( n > 2 )}
\end{cases}
$$

### 実装
実装例と実行結果はこのようになります。
#### 実装例
```java
class Fibo {
  public static void main(String[] args) {
      // メソッド呼び出し
      System.out.println(fibo(5)); 
  }

  static int fibo(int n) {
      if(n < 2) {
          return n;
      } 

      return fibo(n - 1) + fibo(n - 2);
  }
}
```
#### 実行結果
``` 
5
```
### 解説
fiboメソッドで`return fibo(n-1) + fibo(n-2)`をしているので、以下のようなフロー図で処理を追っていきます。
矢印に書いてある数字は処理順番を示しています。
実線が呼び出す時、波線が戻り値を返す時を示しています。
```mermaid
flowchart TB
    A[fibo（n）] 
    A --1--> B[2. fibo（n - 1）]
    B .-> |2. return xxx| A
    A --3--> C[fibo（n-2）]
    C .-> |4. return xxx| A
```

まず、mainメソッドから`fibo(5)`を実行します。
ここからがfiboメソッドでの再帰処理の動き方です。
1. fibo(5)内で`return fibo(n-1) + fibo(n-2)`の、`fibo(n-1)`部分となるfibo(4)を実行
2. fibo(4)内で`return fibo(n-1) + fibo(n-2)`の、`fibo(n-1)`部分となるfibo(3)を実行
3. fibo(3)内で`return fibo(n-1) + fibo(n-2)`の、`fibo(n-1)`部分となるfibo(2)を実行
4. fibo(2)内で`return fibo(n-1) + fibo(n-2)`の、`fibo(n-1)`部分となるfibo(1)を実行
5. fibo(1)内で`n = 1`なので、`return 1`する
6. fibo(2)内で`return fibo(n-1) + fibo(n-2)`の、`fibo(n-2)`部分となるfibo(0)を実行
7. fibo(0)内で`n = 0`なので、`return 0`する
8. fibo(2)内で全てのメソッドが終了したので`return fibo(n-1) + fibo(n-2)`として、`return 1 + 0`をする

同様に処理を進めていくと、最終的に`fibo(5)`の戻り値として`return 5`されます。

```mermaid
flowchart TB
    Z[mainメソッド]--0--> A
    A .->|29. return 3 + 2| Z
    A[fibo（5）] 
    A --1--> B[fibo（4）]
    B .->|18. return 2 + 1| A
    A --19--> C[fibo（3）]
    C .-> |28. return 1 + 1|A
    B --2--> D[fibo（3）]
    D .->|11. return 1 + 1| B
    B --12--> E[fibo（2）]
    E .->|17. return 1 + 0| B
    D --3--> F[fibo（2）]
    F .->|8. return 1 + 0| D
    D --9--> G[fibo（1）]
    G .->|10. return 1| D
    F --4--> H[fibo（1）]
    H .->|5. return 1|F
    F --6--> I[fibo（0）]
    I .->|7. return 0| F
    E --13--> J[fibo（1）]
    J .->|14. return 1| E
    E --15--> K[fibo（0）]
    K .->|16. return 0| E
    C --20--> L[fibo（2）]
    L .->|25. return 1 + 0| C
    C --26--> M[fibo（1）]
    M .->|27. return 1| C
    L --21--> N[fibo（1）]
    N .->|22. return 1| L
    L --23--> O[fibo（0）]
    O .->|24. return 0| L
```

### まとめ
今回はフィボナッチ数列を例に再帰処理を見ていきました。
イメージしにくく詰まりやすい部分だと思います。
フィボナッチ数列の他にも、階乗や漸化式などでも再帰を使って実装ができます。
手を動かしデバッグをしながら理解を深めてみてください。
また、再帰処理を書く際のポイントも調べると出てくるのでそちらも見てみるといいと思います。

最後まで読んでいただきありがとうございました。
tomcatで登録したサービス名の変更方法

# ■概要
tomcatをインストールした後、サービス名を変更する方法を記載する。

# ■手順概要
①　Tomcatサービスの停止
②　Tomcatサービスの削除
③　tomcatW.exeファイルの名前変更
④　Tomcatサービスの再登録
⑤　サービスの表示名の変更
⑥　サービスの開始

# ■詳細手順
### １．現在稼働しているTomcatサービスを停止
::: note info
コマンドプロンプト、windowsサービスどちらの手順でもOK
（やっていることは同じ）
:::
#### ・cmdを使用する場合
①　コマンドプロンプトを管理者権限で開く
②　net stop [サービス名]　を実行する

```cmd:cmd
例）  net stop Tomcat9
```

#### ・windowsサービスを使用する場合
①　windowsサービスを開く

検索窓でサービスと入力すると表示される

![スクリーンショット 2024-06-01 184646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639142/fa629bb6-9519-bf76-5287-e6fc5acac803.png)

②　停止したいサービスを選択　→　右クリック　→　停止をクリック

![サービス停止.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639142/01a2a24e-c93d-ebaa-7dbb-555f5beb0b97.png)

    
### ２．現在のTomcatサービスを削除
Tomcat\binディレクトリにある、service.batにあるremove機能を使用する。

①　service.batのある、Tomcat\binディレクトリに移動する        
```cmd:cmd
例）  cd D:\apache-tomcat-9.0.54\bin
```

②　service.batのremove機能を使ってTomcatサービスを削除する
service.bat remove [Tomcatサービス名]　を実行
```cmd:cmd
例）  service.bat remove Tomcat9
```
::: note warn
インストール時にサービス名を変更して登録した場合は、service.batの内容を編集しなければならない場合があります。
service.batは基本的にデフォルト設定なので、Tomcat9.exeやTomcat9W.exeといった記載があります。（バージョンにより9や8など末尾の数字は変わります）
service.batをメモ帳などで開き.exe名を変更して使用してください。
:::
    

### ３．tomcatW.exeの名前を変更
①　tomcat\bin に移動。
②　tomcat.exe、tomcatW.exeをそれぞれ変更したい名前に変更する。
### ４．新しいサービスの登録
①　コマンドプロンプトで　service.bat install [新しいサービス名]　を実行する
```cmd:cmd
例）  service.bat install NewTomcatService
```
### ５．サービスの表示名の変更（オプション）
①　コマンドプロンプトで　sc config NewTomcatService DisplayName= "表示したいサービス名"　を実行する
```cmd:cmd
例）  sc config NewTomcatService DisplayName= "My New Tomcat Service"
```
### ６．新しいサービスの開始
#### ・cmdを使用する場合
```cmd:cmd
例）  net start NewTomcatService
```
#### ・windowsサービスを使用する場合
①　windowsサービスを開く
②　開始したいサービスを選択　→　右クリック　→　開始をクリック


<font color="red">**Tomcatが問題なく開始できれば、成功です。**


この手順に従うことで、Tomcatのサービス名を変更することができます。
【初心者向け】さくらサーバのDB自動バックアップ

2024年版です。
仕事で「MYSQLの中に登録したデータを自動バックアップしてほしいな～」と言われました。

ということでWindowsからさくらサーバーへssh接続して、Cronにmysql自動バックアップスクリプトを設定するまでの流れをメモします。

目新しいことは何もないけど、2024年6月1日時点で上手くできた手順をシェアするので、情報の鮮度という観点では読む価値があるかもしれませんね。

OS：Windows11
使用したCL：Powershell
備考：vscodeを開いて、そこから開いたTerminalがPowershell…という背景があります。あと、当然ながらさくらサーバの管理者画面をブラウザから開いてます。

---

# 手順①「Windowsにssh公開鍵認証の設定をする」
※ここはPowershellコマンドなので、手順見つつもひとつずつコマンドの正当性を確かめた方がよい
https://help.sakura.ad.jp/rs/2804/

---

# 手順②「ssh接続する」
※色々と警告が出るかもだけど、とにかくWelcome to FreeBSDと表示されれば成功してる。接続後はLinuxコマンドでの操作になるため、調べながら頑張ること
https://help.sakura.ad.jp/rs/2247/

---

# 手順③「自動バックアップ設定」
※ssh接続はスクリプトの動作確認をするために必要なので不用意にスキップしてはいけない。また、qiitaからコピーするスクリプトは全角スペースが混ざっていることがあるので、エディタ（vscodeやさくらエディタなど）でしっかり確認することが望ましい。大括弧（ [ ] ）については削除して適宜読み替えること
https://qiita.com/Hikery/items/cab0ccb8f23a78db76a8
初学者が体系的に学ぶには工業高校の教科書がおすすめ！

## 概要
コンピューターサイエンスを初めて体系的に学ぶときには、**工業高校の教科書**がおすすめです。

https://www.jikkyo.co.jp/book/detail/23033523

https://www.jikkyo.co.jp/book/detail/14000039

https://www.jikkyo.co.jp/book/detail/23033623

https://www.jikkyo.co.jp/book/detail/24033724

https://www.jikkyo.co.jp/book/detail/24033824

また、他の工学分野（機械・電気）も同様です。

## はじめに

巷には、コンピューターサイエンス初学者向けの本が溢れているといます。

しかしながら、自分に合ったレベルの本を探すのは難しいと思います。

その中で私は、**工業高校の教科書**から入ることを提案します。

私は工業高校出身であり、今振り返って高校の教科書で学べて良かったと感じています。

## 工業高校の教科書をおすすめする理由

### 1. 高校生がわかるように平易に書かれている

高校の教科書ですので、当たり前ですが高校生が理解するように書かれています。

そのため、初心者にはうってつけです。

### 2. 数学のハードルが低い

工業高校生向けなので、数学的なハードルが低く、数学が苦手な方でも理解しやすいと思います。

### 3. 大学生向けの教科書や市販の技術書への架け橋になる

工業高校の教科書で学べるのは、あくまでの基礎知識・技術です。

反対に言えば、工業高校の教科書の内容を理解すれば、市販の技術書の理解への架け橋になります。


## おすすめの教科書

実際に私が読んで良かった本を挙げます。

### 実教出版 プログラミング技術

https://www.jikkyo.co.jp/book/detail/23033523

C言語を題材にプログラミング開発の一連の技術について学ぶことが出来ます。

**おすすめポイント**

* **題材がC言語である**
    * これほどまで簡単にC言語を学べる本はない
    * ポインタの扱いがわかりやすく書いている
* **フローチャートについて詳しく書いている**
    * 初学者は、フローチャートの書く技術が身についていないことが多い

### 実教出版 最新プログラミング オブジェクト指向型言語

https://www.jikkyo.co.jp/book/detail/14000039

JAVA言語を題材にプログラミング開発の一連の技術について学ぶことが出来ます。

実は、この教科書は商業高校用です。ですので、情報システム開発を意識して書かれています。

**おすすめポイント**

* **オブジェクト指向の考え方がわかりやすい**
    * イラストを交えて、わかりやすく書かれている

### 実教出版 ハードウェア技術

https://www.jikkyo.co.jp/book/detail/23033623

コンピュータアーキテクチャの一連の技術について学ぶことが出来ます。

組み込みシステム開発の概要についても学ぶことが出来ます。

**おすすめポイント**

* **進数計算や論理演算の方法についてわかりやすい**
    * 計算過程を省いていない
    * 練習問題を多数収録
* **組込みシステムについて学ぶことができる**
    * わかりやすい初学者向けの教材は少ない

### 実教出版 ソフトウェア技術

https://www.jikkyo.co.jp/book/detail/24033724

OSとセキュリティの基礎及びソフトウェア開発手法について学ぶことが出来ます。

**おすすめポイント**

* **OSについてわかりやすい**
    * わかりやすい初学者向けの教材は少ない

### 実教出版 コンピュータシステム技術

https://www.jikkyo.co.jp/book/detail/24033824

ネットワークとデータベースの基礎及びシステム開発手法について学ぶことが出来ます。

**おすすめポイント**

* **データベースについてわかりやすい**
    * わかりやすい初学者向けの教材は少ない

## おわりに

教科書で学べるのは、あくまでも基礎知識・技術です。

これをステップに知識・技術研鑽を進めましょう！
キャメルケースの重要性

キャメルケースができていなかったから起きたエラーがありまして
springBootのエンティティクラスを作成していてとりあえずhtmlに反映して移そうと思ったら
500aエラーが起きました、途方に暮れエラーの内容がhtmlの文法ミスだと出ていたので見に行くと
文法どころか何も間違えていませんでした
それで何が悪いのか作業に入ってからのコードを一度見直したら
emttityのクラスのgetter,setterをキャメルケースにしていなかったのでキャメルケースにしてみると。
なおりました！
何でか知りたかったのでchat-gptなりに質問してみたところキャメルケースをしていないといけないということなのでこれからはキャメルケースを意識していこうというお話でした
初めてブログ投稿したので口下手ですいません泣
[Linux]オブジェクトに含まれるシンボルの一覧表示

# ライブラリや実行ファイルに含まれるシンボル（関数など）の一覧を表示する
```shell
nm <ライブラリ名>
```
主に、dlopen/dlsym関数を用いた動的ロードを行う場合に、dlsym関数で指定のシンボル（関数）が見つからない場合に`nm`コマンドで内容を確認する目的で使う。

`nm <ライブラリ名> | grep <シンボル名>` など。

例えば、ある実行ファイルに対して`nm`を実行すると以下の実行結果となる。
```shell
# nm main
                 U A
                 U B
0000000000600e08 d _DYNAMIC
0000000000601000 d _GLOBAL_OFFSET_TABLE_
0000000000400740 R _IO_stdin_used
0000000000400888 r __FRAME_END__
0000000000400760 r __GNU_EH_FRAME_HDR
0000000000600e00 d __JCR_END__
0000000000600e00 d __JCR_LIST__
0000000000601048 D __TMC_END__
0000000000601044 B __bss_start
0000000000601040 D __data_start
0000000000400640 t __do_global_dtors_aux
0000000000600df8 t __do_global_dtors_aux_fini_array_entry
0000000000400748 R __dso_handle
0000000000600df0 t __frame_dummy_init_array_entry
                 w __gmon_start__
0000000000600df8 t __init_array_end
0000000000600df0 t __init_array_start
0000000000400730 T __libc_csu_fini
00000000004006c0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000601044 D _edata
0000000000601048 B _end
0000000000400734 T _fini
0000000000400518 T _init
00000000004005a0 T _start
0000000000601044 b completed.6355
0000000000601040 W data_start
00000000004005d0 t deregister_tm_clones
0000000000400660 t frame_dummy
000000000040068d T main
                 U puts@@GLIBC_2.2.5
0000000000400600 t register_tm_clones
```
[Linux]実行ファイルが依存する動的ライブラリを表示

# Linuxの実行ファイルが依存する動的ライブラリの一覧を表示する
```shell
ldd <実行ファイル>
```
実行例
```shell
# ldd main
    linux-vdso.so.1 =>  (0x00007ffd4b9a0000)
    libA.so => not found
    libB.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007f32b5a02000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f32b5dd0000)
```
上記の場合、libA.so, libB.so が必要だが検索パス上に見つからないことを示している。
検索パスとは以下を指す。
・`/lib64`や`/usr/lib`
・環境変数 `LD_LIBRARY_PATH`

動的ライブラリを検索するパスを追加したい場合は環境変数LD_LIBRARY_PATHにパスを追加するのがよし。例えば、カレントディレクトリを検索パスに加えたい場合は以下を実行する。
```shell
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
```
どのディレクトリが容量を食っているかを調査するためのコマンド

ディスクの容量を表示するコマンド。-hオプションをうけることでいい感じの単位にしてくれる。
```bash
df -h
```

ディスク使用量が分かってもどのファイルが容量を食っているか分からない。
そこで、ディレクトリことのディスク使用量を調べるコマンドを使う。同じく-hオプションをつけることでいい感じの単位にしてくれる。
```bash
du -h
```

さらに、直下のディレクトリの容量を調べてソートするコマンドを使うと便利。
```bash
sudo du -h --max-depth=1 <ディレクトリパス> | sort -rh
```

例）ルートディレクトリ直下にあるディレクトリの容量を調べる
```bash
xxx@xxx:~$ sudo du -h --max-depth=1 / | sort -rh
41G     /
26G     /var
7.7G    /large
3.7G    /usr
968M    /snap
843M    /home
299M    /boot
143M    /opt
7.2M    /etc
2.2M    /run
392K    /root
100K    /tmp
16K     /lost+found
4.0K    /srv
4.0K    /mnt
4.0K    /media
4.0K    /fast
0       /sys
0       /proc
0       /dev
```
[Linux]動的ライブラリと実行ファイルの作成

ここでは動的ライブラリとそれを利用する実行ファイルの作り方について説明します。
以下の手順に従ってサンプルの作成例が以下の記事になります。
https://qiita.com/miyo4/items/1211b88083f7af261855

# 動的ライブラリの作成
## コンパイル
```shell
gcc -fPIC -c <ソース(.c)>
or
gcc -fPIC -c <ソース(.c)> -I <ヘッダファイルのディレクトリパス>
```
・`-fPIC`の指定は必須
・`ソースファイル名.o`のファイル名でオブジェクトファイルが生成される
・`/usr/include`以外にあるヘッダを参照する場合は`-I`でディレクトリを指定する

## 動的ライブラリ作成（リンク）
```shell
gcc -shared -o <ライブラリ名(lib**.so)> <オブジェクトファイル(.o)>
```
・オブジェクトファイル(.o) はコンパイルにより生成される
・動的ライブラリのファイル名は`lib<ライブラリ名>.so`と決まっている
・他に静的ライブラリのファイル名は`lib<ライブラリ名>.a`などがあるがここでは使わない


https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/developer_guide/creating-libraries-gcc_creating-dynamic-libraries-gcc#doc-wrapper

# 動的ライブラリを利用する実行ファイルの作成
## コンパイル
```shell
gcc -c <ソース(.c)>
or
gcc -c <ソース(.c)> -I <ヘッダファイルのディレクトリパス>
```
・`/usr/include`以外にあるヘッダを参照する場合は`-I`でディレクトリを指定する

## 実行ファイル作成（リンク）
```shell
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)>
or
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -l <動的ライブラリ名の**部分(lib**.so)>
or
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -L <動的ライブラリのディレクトリパス> -l <動的ライブラリ名の**部分(lib**.so)>
```
・実行ファイルが動的ライブラリ(lib**.so)を参照する場合は`-l`オプションでライブラリ名を指定する。ライブラリ名を指定は`lib<ライブラリ名>.so`の`<ライブラリ名>`の部分なので間違えないように。
・動的ライブラリが`/lib64`フォルダ以外に存在する場合は`-L`オプションでディレクトリを指定したうえで、`-l`オプションでライブラリ名を指定する

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/developer_guide/gcc-using-libraries_using-dynamic-library-gcc

# 動的ライブラリを使った実行ファイルの実行

## 共有ライブラリの検索パスを追加する必要がある場合

動的ライブラリが標準の検索パス上に存在しない場合は、実行時にエラーが出力されます。
その場合は、以下2種類の方法で検索パスを追加することができます。

## 環境変数`LD_LIBRARY_PATH`で指定する方法

動的ライブラリを検索するパスを追加したい場合は環境変数LD_LIBRARY_PATHにパスを追加するのがよし。例えば、カレントディレクトリを検索パスに加えたい場合は以下を実行する。
```shell
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<検索パス>
```
例えば、カレントディレクトリを追加したい場合は以下となる。
```shell
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
```

## リンク時に検索パスを`-Wl,-rpath=`で指定しておく

実行ファイルを作成する時にリンクオプション`-Wl,-rpath=`に検索パスを指定しておくこともできます。この場合は、`LD_LIBRARY_PATH`の編集は不要です。
```shell
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -Wl,-rpath=<検索パス>
```
例えば、カレントディレクトリを追加したい場合は以下となる。
```shell
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -Wl,-rpath=.
```

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/developer_guide/gcc-using-libraries_using-dynamic-library-gcc
WebSpeechAPI活用[削除禁止永久保存版]

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Real-Time Speech Demo</title>
</head>
<body>
    <h1>Real-Time Speech Demo</h1>
    <p>Type in the text box below, select a language, and it will be spoken in real-time.</p>
    <select id="languageSelect">
        <option value="en-US">English</option>
        <option value="ja-JP">日本語</option>
    </select>
    <br><br>
    <input type="text" id="inputText" placeholder="Type your text here" size="50">
    <button id="deleteButton">Delete</button>
    <label for="autoDelete">Auto Delete after Speech</label>
    <input type="checkbox" id="autoDelete">

    <script>
        document.addEventListener('DOMContentLoaded', (event) => {
            const inputText = document.getElementById('inputText');
            const languageSelect = document.getElementById('languageSelect');
            const deleteButton = document.getElementById('deleteButton');
            const autoDeleteCheckbox = document.getElementById('autoDelete');

            inputText.addEventListener('input', () => {
                const text = inputText.value;
                const language = languageSelect.value;

                if (text.trim() === "") {
                    return;  // Ignore empty input
                }

                // Use Web Speech API's SpeechSynthesis
                const utterance = new SpeechSynthesisUtterance(text);
                utterance.lang = language;  // Set the selected language

                // Cancel previous speech and start new one to avoid overlap
                window.speechSynthesis.cancel();
                window.speechSynthesis.speak(utterance);

                // Event listener for when speech ends to delete input text
                utterance.onend = () => {
                    if (autoDeleteCheckbox.checked) {
                        clearInput();
                    }
                };
            });

            // Function to clear input text
            function clearInput() {
                inputText.value = '';
            }

            // Event listener for delete button
            deleteButton.addEventListener('click', clearInput);
        });
    </script>
</body>
</html>
```
線形代数の「背景と概念」をもっとよく分かりたい【数学弱者・凡人のための線形代数入門】


**〜ベクトルにとって、数ベクトルによる成分表示は、あくまで「ある一つの姿」にすぎない〜**

## はじめに　誰のための記事か？

この記事では、対象読者をこのように想定しています。

・線形代数の練習問題はなんとなく解ける。
・線形代数の教科書に出てくる用語はだいたい知ってる。

しかし、まだどこか**線形代数の背景や面白さ**がわかっていない気がする...

そんな心境の人のための記事です。

## この記事が伝えたいこと　「数学概念」を大切にする

線形代数に本当の意味で親しむために、この記事では次のような気持ちを大切にします。

・概念そのものが気になる

・数学概念同士の関係性が気になる

・線形代数の本質が気になる

とくに、**ベクトル空間、線形写像、線形写像の表現**、などのワードは知っているが、それらの関係性がまだ腑に落ちていない、よく分かっていない、という人にはぴったりな内容です。


## 二冊の本を道案内として紹介
私自身、ベクトル空間、線形写像、線形写像の表現などの概念に初めて触れたときは、なんだかよくわからなった記憶があります。ここで理解がスムーズな人は数学に強いのかもですね。だから、私は線形代数に親しむため、いろいろな参考書を読みました。その中でもとくに役立ったのがこの二冊です。

・[なるほど！とわかる線形代数　松野陽一郎](https://amzn.to/3yGTKap)

・[線形という構造へ　志賀浩二](https://amzn.to/3yGUcFD)

数学概念の説明がとても上手な本です。そこで、この二冊の内容でとくに私が気になった点を、この記事では紹介します。ぜひ、内容が染み込むまで繰り返し読んでみてください。

線形代数に慣れていく過程でのよきお供になれたなら幸いです。


## 『なるほど！とわかる線形代数』　要約
### ベクトルとベクトル空間
* ベクトルってなに？ベクトル空間の要素のこと。その具体例の一つが、高校数学で習った幾何ベクトル。
* ベクトルとその成分表示の意味とは。１つの幾何ベクトルと、その成分表示(数ベクトル)は同じではない。一対一に対応付けられるが、その方法はたくさんある。一般のベクトルにとって、数ベクトルによる成分表示はあくまで、「ある一つの姿」にすぎない。

### 次元と基底
* ベクトル空間の基底とは、そこに属するベクトルすべてを過不足なく表すために必要なベクトルの集まり。基底となるベクトルの個数を次元という。


### 線形写像とは
* 線形写像を見た目にわかりやすく表示するツールが行列です。行列は、線形写像をある特定の視角から切り取ったものですが、線形写像の本質を損なうことなく、計算を進めることを可能にしてくれます。ただ数を長方形に並べただけのものが、こんなに豊かな内容を持つのはちょっと不思議です。p９３引用



### 線形写像と行列
* 一般にベクトル空間の基底の選び方はいろいろありますから、それに応じて線形写像を表す行列もさまざまになります。一つの線形写像を表す行列が何通りもある...のでは混乱して困る気がしますが、実はそうではありません。何通りもあると言っても無秩序ではなく、同一の線形写像から生じる行列たちには、全体を貫く特徴があります。そして、むしろ「何通りもある」ことを逆手にとって、そんな行列たちのうち、もっとも「私たちにわかりやすいもの」「見た目で線形写像の特質がつかみやすいもの」を選ぶために、基底の取り方を工夫するのが、線形代数の大切な任務なのです。p138引用





## 『線形という構造へ』 要約
### 線形性とは

* 数学の多くの基本的な概念は、まず＇量＇を数として表わし、次にその線形性に注目することで得られている。p3

* １つの線形写像があらかじめ与えられるとき、それを表現する行列は多様であって、いろいろな行列が存在する。そのなかでできるだけ簡明な行列をとり、線形写像の性質を見ようとすると、固有値問題とよばれる問題が生まれてくる。p5


### 基底と線形写像

* 線形の構造自体は抽象的なものとして取り出されたが、それはもともとはベクトルのような力学的な考察から生まれてきたものだった。p54要約

* ベクトルの演算を考えることは、平面上のベクトルの集合全体に線形構造を与えることになる。この集合は線形空間になるが、ベクトルは「数」とは直接のつながりはない。数と結びつけるためには座標を導入する必要がある。すると、ベクトルの演算は、座標を通して数の演算で表せる。このとき、平面上のベクトル同士の演算と数での演算、どちらも構造としては同じになる。数による表現の仕方は座標軸の取り方によって変わるのだが、線形の構造は変わらない。これは、ベクトルの演算そのものは、座標と無関係に定義されているから。p17要約

* 2つの線形空間のあいだの線形写像とは、線形性を保つ写像のことである。それぞれの空間に基底をとっておくと、線形空間は座標空間となり、線形写像は座標のあいだの線形対応となる。このとき、線形写像は、行列とよばれる数のブロックで表すことができる。p 31

### 行列式

* 行列式は、1次式として多くの文字を含んでいるような数式の処理に有効に使われるが、この1次を線形という言葉に置き換えてみると、行列式は、線形写像の性質を代数を通して理解するブリッジとなることが予想される。実際、いまでは、行列式は線形写像を表わす行列の理論のなかに完全に融けこんでいる。p57

* 代数学は演算の仕組みをとらえて、それを記号化することによって機能化するものであるが、その意味では行列式は代数学が生み出した数学のなかの芸術品といってよいものかもしれない。p75

### 線形写像の合成と行列式の積

* 行列式が線形写像の理論で、効果的にはたらくのは、線形写像の合成においてである。線形写像の積と行列式の積の間に整合性が成り立ち、これによって線形空間と線形写像の理論のなかに、行列式を通して、代数的な方法が適用されることになっていくのである。p80要約

* 線形写像が正則かどうかという定性的な性質は、行列式を計算すればわかるという定量的なことになってきたのである。p83要約



## 関連記事
他にも、いろいろな学問を楽しみための記事を投稿しています。学問や教養を自分のペースでゆったり楽しみたい。ぜひ読んでみてください。
・[知を広げ楽しむ【学問大好き】あらゆるテーマの読書記録・おすすめ本紹介](https://www.buchinuku.work/entry/2024/4/23)
・[【コンピュータは数学者になれるのか】 人工知能は数学できるか？数学の本質とは何か？](https://www.buchinuku.work/entry/2019/11/1)
・[証明＝プログラム!? 【カリーハワード同型対応】 計算と論理の奥深い関係](https://www.buchinuku.work/entry/2019/12/11)
・[【論理の哲学】 論理と数学の関係、論理と哲学の関係に迫る](https://www.buchinuku.work/entry/2019/7/28)
Qiitaを始めてみた

この記事は1mmも得にならないです、ただ筆者がQiitaの仕様を理解するためにQiitaを始めてみたとかいう記事出したかっただけです。
## Qittaを始めてみた
ガキの頃に改造マリオを見て、ゲームを作りたいと思った、そして早20歳、就活に発狂しながら今日も企業に履歴書とポートフォリオを送る毎日、ふと目に入る
___「Qiitaやってますか？」___
今までQiitaは利用する側だった、だが情報のインポートだけではなくエクスポートすることは大事なのではと思った
___そしてQiitaを始めた___

GitHub : https://github.com/Tukinium
X(旧Twitter)：https://x.com/luminium1209
内挿補間(spline補間など)

# 離散データから連続値を得よう！
離散的なデータ$(x_i, y_i)$から$y=f(x)$となるような$f$を作成。
色々な補間方法を一つのクラスから生成できるようにしています。

```python
from scipy import interpolate

class Interpolate():
    def __init__(self, name, xrefs, yrefs):
        self.methods = {"1st": lambda x, y: interpolate.interp1d(x, y, kind=1),
                        "2nd": lambda x, y: interpolate.interp1d(x, y, kind=2),
                        "3rd": lambda x, y: interpolate.interp1d(x, y, kind=3),
                        "Akima": interpolate.Akima1DInterpolator,
                        "PCHIP": interpolate.PchipInterpolator,
                        "nearest": lambda x, y: interpolate.interp1d(x, y, kind="nearest"),
                        "nearest_up": lambda x, y: interpolate.interp1d(x, y, kind="nearest-up"),
                        "previous": lambda x, y: interpolate.interp1d(x, y, kind="previous"),
                        "next": lambda x, y: interpolate.interp1d(x, y, kind="next"),
                        "Lagrange": interpolate.lagrange,
                        "Krogh": interpolate.KroghInterpolator,
                        "Barycentric": interpolate.BarycentricInterpolator
                        }
        
        method = self.methods[name]
        self.fittedcurve = method(xrefs, yrefs)
        
    def __call__(self, x):
        return self.fittedcurve(x)
```

# 使い方
1. 既知データ`xrefs, yrefs`と補間方法を指定して`Interpolate`クラスのインスタンスを作成
1. インスタンスに未知の`x`を代入すると補間された結果が返ってくる

下記コードでは1次のスプライン補間(線形補間)を行っています。
```python
# 既知データ
xrefs = [0.0, 5.0, 10.0]
yrefs = [0.0, 5.0, 10.0]

# 推定したいx
x = [0.0, 2.5, 5.0]

# Interpolateクラスのインスタンス、今回は線形補間
y = Interpolate("1st", xrefs, yrefs)

print(x)
print(y(x))

# [0.0, 2.5, 5.0]
# [0.  2.5 5. ]
```


`nearest`と`nearest_up`の違いは2点間のちょうど中点が指定された際、下側をとるか上側を取るかの違い。
unixbenchを動かす - 比較的最新版

# はじめに

Red Hat系のLinux（具体的にはRocky Linux 9）でunixbenchを動かしてみようかと思ったのですが、私が参照した複数のサイトに書いてある通りにそのままやったのでは動かなかったので、動くようにするまでの記録です。

また、恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

# 詳細
## ソースコード入手
どういう入手方法でもいいですが、まずはソースコードを入手してください。「dnfでバイナリをインストール」というわけにはいかないようですので。
普通は、https://github.com/kdlucas/byte-unixbench からダウンロードすることになるのだと思います。圧縮されたものがダウンロードされますから（自動で展開されないなら）展開してください。
（当然これはどのサイトにも書いてあります）

## 追加のPerlモジュールをインストール
unixbenchだけでは動かなくて、以下のPerlモジュールもインストールしないといけません。（Perlってモジュールと表現するのでしょうか。まあ、Qiitaを読むような皆さんには十分通じると思いますので調べません。）
~~~
dnf install perl-Time-HiRes
dnf install perl-FindBin
~~~
前者は多くのサイトに書いてありましたが、後者は私が見たサイトには書いてありませんでした。（あと、このままやってシステムに「権限が足りない」と怒られても知りません。必要ならsudoを付けるなりしてください。）また、
~~~
dnf install perl-Time-HiRes perl-FindBin
~~~
とまとめてインストールしてもいいと思います。私は実際に最初のように分けてインストールしましたけど。

あ、もちろんCコンパイラなどは既にインストールされている前提です。ベンチマークソフトを動かしてみようなんて考える人の環境には当然インストール済みと思いますので。

## おまけ
「もしかしてMacならHomebrewで似たようなことをやれば、、、」なんて期待はしないでください。MacはMacで[別の理由](https://qiita.com/koizumistr/items/0e638b02c3f384b62733)で動作しません。
リバースエンジニアリングってなんぞ？

メモ書きです。また、ソフトウェアとハードウェア、製造業で意味が異なるので、内容はソフトウェアに絞っています。

# リバースエンジニアリング
リバースエンジニアリングとは、すでに開発されたプロダクトを調査して、設計方法、ソースコード、データ定義などの仕様を明らかにすること。

真逆方向で開発をするので、日本語では「逆行工学」ともいう。

# リバースエンジニアリングの目的
リバースエンジニアリングの目的としては以下のことが挙げられるでしょう。

## 改良や改善のための分析
他人の既存プロダクトをもとに、その構造や動作原理を分析することで、使われている技術やノウハウを学ぶことができる。

## ドキュメント編集
開発から時間が経過していると、ドキュメントが更新されていない場合がある。そのため、リバースエンジニアリングを行い、共有可能なドキュメントを作成する。

## 脆弱性・バグ・技術的負債の発見
プロダクトの挙動や仕組みを把握することで、技術的負債を解消する手助けとなる。
また、レガシーシステムの修正にも役立つ。

# リバースエンジニアリングの方法
主な手法は以下の通り。

## 情報収集
解析対象のソフトウェアがどのようなプラットフォームやアーキテクチャで作られているかを確認する。
そして、公開されているドキュメントがあれば確認し、ソフトウェアの基本的な動作や機能を理解する。

## 静的確認
バイナリファイルの解析や、コードの構造、関数の呼び出し関係、ファイル構造を把握する。

## 動的解析
ソフトウェアを実行し、デバッガを用いて実行中のプロセスを監視する。
Break Point を設定し、特定の関数やコードパスを詳細に解析する。
また、どのようなAPIが呼ばれているかを追跡する。

## ドキュメント化
解析結果を文書化して、発見した内容をまとめる。

# 最後に
間違ってたら優しくコメントか編集リクエストしてください。

# 参考文献

https://monstar-lab.com/dx/technology/about-reverse-engineering/

https://qiita.com/Nekonecode/items/c3e796a38dd8f5fe3125

https://qiita.com/kamesennin/items/f0fba963fb896052ee0a
EC2インスタンスを立てて、web to caseを検証してみる

## 概要
- Web to Caseを検証する必要があるので、せっかくだからEC2を立てて検証してみる
- そもそもEC2立ててやる必要ないだろうという声もあるのですが、IacやSalesforceなどの複数の技術領域を掛け合わせて実現するという目標でやってみたいと思いました。

## やること
- Terraform でネットワークの設定含めてEC2周りをセットアップする
- SFDC Developer Edition を取得する
- recaptcha設定
- Web to Case 設定及び HTML を生成
- EC2 に生成した HTMLを配置
- ルーティングの設定
- 動作検証

#### 最終的な構成は下記の通りとなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/fa5e792a-635a-4b34-dc49-3d1ad9109ff2.png)


#### Terraform でネットワークの設定含めてEC2周りをセットアップする
- ソースコード参照
  - https://github.com/Kyohei-takiyama/ec2-web-to-case/tree/main
- 構成図の紫色枠部分を作成する
- ポイント
  - HTMLを配信する用のWebサーバーはApacheを使用
    - Terraform内でApacheのインストールと起動を実行

#### recaptcha設定
- 下記URLから遷移し、サイト内に記載された手順に従って必要な情報を取得する
- 最後にサイトキーとシークレットキーが提示されるので控えておく。後のWeb to Caseの設定時に使用する
  - https://www.google.com/recaptcha/admin/create

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/24762da1-0df1-09b3-3edf-ea52f0c2afc6.png)



#### Web to Case 設定及び HTML を生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/3a078d72-56bd-3df7-e429-67b4fd5963b7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/ee073a04-e37e-0e82-2839-5df496556a17.png)

- 生成されたHTMLをindex.htmlを保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/6bdfa1cc-309d-4d51-9425-55c5500f507c.png)


#### EC2 に生成した HTMLを配置
- EC2にログイン
    ```sh
    # 権限を適切化
    chmod 400 web-to-case-key.pem
    ssh -i {作成したキーペア].pem ec2-user@{パブリックIPv4アドレス}
    ```

- scpコマンドで生成したHTMLを格納する
    ```sh
    # 格納するディレクトリは好きなもの->/var/www/html/{好きなもの}
    sudo scp -i {作成したキーペア].pem ~/yourhtmlpath/index.html ec2-user@{パブリックIPv4アドレス}:/var/www/html/contact
    ```

#### ルーティングの設定(EC2にログインして行う)
- `httpd.conf`を編集する

    ```sh
    # Amazon Linux 2の場合
    sudo nano /etc/httpd/conf/httpd.conf
    ```

- `httpd.conf`に下記を記載する
    ```/etc/httpd/conf/httpd.conf
    # 他の記述
    
    # URLパスをサーバー上のディレクトリにマッピング
    # ~/contact を /var/www/html/contact ディレクトリにマッピング
    Alias /contact /var/www/html/contact
    
    # 配置したHTMLを公開する設定
    <Directory /var/www/html/contact>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
    </Directory>
    ```

- 設定後にApacheを再起動する
    ```sh
    sudo systemctl restart httpd
    ```

- /contactにフォームが表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/74a013f2-5261-0e3e-72d0-5a9d77d48729.png)

#### 動作検証
  - recaptchaも問題なく動作した
  - EC2から配信されたフォームを送信したところ問題なく作成された
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/d7ab7ef6-da6c-2623-1028-288067c84ec6.png)


## まとめ
- 手間ではあるが、敢えていろいろな技術を織り交ぜてみると、なんか楽しいし、試さなければ気づけないものもあって良かったなと思いました。
- 無駄をもっと楽しんでいきたいと思いました。
VSCode の拡張機能 Flake8 と autopep8 に pyproject.toml を読み込ませる

VSCode の拡張機能 **Flake8**, **autopep8** では`settings.json`で各種設定が可能です

```settings.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.autopep8"
    },
    "autopep8.args": [
        "--aggressive",
        "--indent-size",
        "4",
        "--max-line-length",
        "119",
        "--ignore=E111, E114, E402, E501"
    ]，
    "flake8.args": [
        "--ignore=W293, W504, E111, E114, E402, E501"
    ]
}
```

しかし，Poetry のプロジェクトのような場合には`pyproject.toml`に設定を記載することが多いかと思います
その場合，VSCodeが`pyproject.toml`を読み込むための設定が必要です

今回は次のファイルを読み込んでみます
```pyproject.toml
    (略)
    [tool.flake8]
    max-line-length = 119
    max-complexity = 18
    ignore = "W293, W504, E111, E114, E402, E501,"
    exclude = [".venv"]
    
    [tool.autopep8]
    max-line-length = 119
    indent-size = 4
    ignore = "E111, E114, E402, E501,"
    aggressive = 3
    exclude = ".venv"
```


### autopep8
**autopep8** では`--global-config`で外部の設定を読み込めます
```bash
    autopep8 --global-config <path/to/setting>
```

`.vscode/settings.json`でグローバルの設定を上書きしましょう．`pyproject.toml`はワークスペースのルートディレクトリに配置しているものとします
```settings.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.autopep8",
    },
    "autopep8.args": [
        "--global-config",
        "pyproject.toml"
    ]
}
```

VSCodeの **OUTPUT** タブから **autopep8** を選んで正しく読み込めているか確認できます
```
    2024-06-01 08:49:32.670 [info] /app/.venv/bin/python -m autopep8 --global-config pyproject.toml -
    2024-06-01 08:49:32.670 [info] CWD Server: /app
```

### Flake8
**Flake8** の場合，そもそも`pyproject.toml`に対応していないので`pflake8` (`pyproject-flake8`) を入れる必要があります

```pyproject.toml
    [tool.poetry.group.dev.dependencies]
    autopep8 = "2.0.0"
    pyproject-flake8 = "5.0.4"
```

`pflake8`では`--config`で外部の設定を読み込めます
```bash
    pflake8 --config=<path/to/setting>
```

`.vscode/settings.json`でグローバルの設定を上書きしましょう
```settings.json
{
    (略)
    "flake8.path": [
        "pflake8"
    ],
    "flake8.args": [
        "--config=pyproject.toml"
    ]
}
```

VSCodeの **OUTPUT** タブから **Flake8** を選んで正しく読み込めているか確認できます
```
    2024-06-01 08:46:59.235 [info] [Trace - 8:46:59 AM] Received notification 'window/logMessage'.
    2024-06-01 08:46:59.235 [info] pflake8 --format='%(row)d,%(col)d,%(code).1s,%(code)s:%(text)s' --config=pyproject.toml /app/sample.py
    2024-06-01 08:46:59.235 [info] [Trace - 8:46:59 AM] Received notification 'window/logMessage'.
    2024-06-01 08:46:59.235 [info] CWD Server: /app
    2024-06-01 08:46:59.700 [info] [Trace - 8:46:59 AM] Received notification 'textDocument/publishDiagnostics'.
```


以上です
【javascript】【jquery】ローカルストレージで取得した配列をjson形式にしたい

ローカルストレージで取得
```javascript
 var data = localStorage.getItem('local_data');
```
ローカルストレージの中身
```javascript
var data = {"chara":["34","37","39"],"dragon":["6","8","32"],"skill":{"chara_34":4,"chara_37":3,"chara_39":4,"dragon_6":4}}

```

のような配列

そのままでは使えない

```javascript
data = JSON.parse(data);
```

で使えるようにする

```javascript
console.log(data.skill)
```
結果
```javascript
{"chara_34":4,"chara_37":3,"chara_39":4,"dragon_6":4}
```


参考
https://www.digitalocean.com/community/tutorials/js-json-parse-stringify-ja
物体検知モデルSSDの学習エラー解決備忘録

## 概要
ネットに落ちてたSSDの実装ではまってしまい、それの解決方法を備忘録として残します。
私と同じようにSSDではまってしまった方の力になれれば幸いです。

## 動かしたいコード
githubに公開されていたSSDのリポジトリ
https://github.com/YutaroOgawa/pytorch_advanced/tree/master/2_objectdetection
これを.ipynbから.pyの形式に変更して学習および物体検知の実行したい
特にこの中の2_7_ssd_training.ipynb(.py)がエラーとなり実行できなかった


## ざっくり動作環境
- python 3.12
- pytorch 2.3
- numpy 1.26


## エラー箇所
エラーメッセージは記録していなかったが、2_7_training.pyの実行時にデータ拡張プログラム(utils内のdata_augumentation.py)が呼び出され、その中のnumpy.random.choice()の部分でエラーとなっていた。

考えられる原因の１つは
numpy.random.choice()の引数でndarrayやint配列以外のオブジェクトが渡されたからだと思われる。おそらく関数が呼び出される以前のどこかの関数が仕様変更され結果的にndarrayやint配列以外のオブジェクトを返していた？

もしくは単純にnumpy.random.choiceの仕様がバージョン変更によって変わっていた？でも公式ドキュメント見てもそんなこと書いてないように見える…

## コード修正
utile/data_augumentation.py内246行目付近
こいつが原因なのでコメントアウトもしくは削除
```python
mode = random.choice(self.sample_options)  # 削除
```
以下のコードを追加
```python
    from random import choice
    mode = choice(self.sample_options)
```
numpyのrandom.choiceではなく、python標準搭載のrandomモジュールのchoice関数を使用することでエラーを回避できた。

## np.random.choiceと標準搭載random.choiceの違い
両関数は引数として与えられたデータからランダムな要素を選択して返すという点では一緒である。
しかし以下のような相違点がある
- numpy.random.choice()
    - 引数としてndarray（numpy配列）もしくはint型配列を受け付ける
    - ndarrayに最適化されているため処理は早い

- random.choice()
    - 引数としてリストやタプル、文字列などのシーケンスに加えてndarrayもサポートされておりインデックスで要素を指定してくれるオブジェクトを受け付ける
    - つまり自由度が高い関数といえる

## おまけ
今回私はローカルのanaconda下で.pyの形式で実行した。.pyとjupyter形式の.ipynbも若干のコード変更が必要なのでそれも記載する。jupyter形式での実行を前提としている方はここでは対象外である。

まずjupyter形式(google colab含む)だとmatplotlibで作図する際、基本的にはplt.show()は不要である。しかし.py形式で一括実行する際はplt.show()は必須である。
そのためリポジトリ内の物体検知実行プログラム2_8_ssd_inference.pyを実行してもエラーは出ないが検出画像も表示されない。
なのでutils/ssd_predict_show.py内、class SSDPredictShowの vis_bbox()で一番最後(163行目あたり)に、plt.show()を加える。
```python
class SSDPredictShow():
    ・・・
    def vis_bbox(self, rgb_img, bbox, label_index, scores, label_names):
        ・・・
        plt.show()  # <-追加
```



## 参考
https://github.com/YutaroOgawa/pytorch_advanced/tree/master/2_objectdetection
PIC18F27Q43　ｽｰﾌｧﾐｺﾝﾄﾛｰﾗﾄﾞﾗｲﾊﾞｰ

![IMG_4764.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/9caa3d44-5ddd-9888-e135-49d53847f6b3.jpeg)


https://youtube.com/shorts/ff6vNy2Pvbc?si=2_chfqgSMNfz2QNW


ヘッダーファイルで、PS、CLK、DATA線の割り付けピンのdefine定義を変更すれば、Q43以外にも使えます。
|ライン名|18F27Q43ピン|
|:---:|:---:|
|PS| LATA5|
|CLK| LAT6 |
|DATA| RA7|

# ボタン押下状況の取得コード

```C:famicon.h
#ifndef FAMICON_H
#define	FAMICON_H

#ifdef	__cplusplus
extern "C" {
#endif

#include <xc.h>
    
#define PS LATAbits.LATA5
#define CLK LATAbits.LATA6
#define DATA1 PORTAbits.RA7

extern uint16_t famiconButtonState;
extern  void famiconInit(void);    
extern  uint16_t getButton(void);
    
   
#ifdef	__cplusplus
}
#endif

#endif	/* FAMICON_H */
```

```C:famicon.c
#include "famicon.h"
#include "I2C_LCD.h"

uint16_t famiconButtonState;
///@brief コントローラーの初期化
void famiconInit(void)
{
    TRISAbits.TRISA7=1;//Data線
}

///@brief ボタン押下状況取得関数
///return ボタン押下16ビットデータ
uint16_t getButton(void)
{
    uint16_t w_val;
    uint8_t cnt;
    w_val=0x0000;
        cnt=0;
        
        //最初の1ビット
        PS=1;
        CLK=1;
        __delay_us(10);
        PS=0;
        CLK=0;
        __delay_us(10);
        
        w_val|=DATA1;
        w_val<<=1;
        cnt++;
        //残り15ビットの取得
        do{
            CLK=1;
            __delay_us(10);
            CLK=0;
           // __delay_us(5);
            w_val|=DATA1;
            if(cnt!=15)
            {
                w_val<<=1;
            }
            cnt++;
        }while(cnt!=16);
        //受信完了    
        w_val&=0xFFF0;//ボタンデータのみを、抽出
        if(w_val!=0xFFF0)    
        {
            if((w_val&0x8000)==0x0)
            {
                printf("B ");
            }
            
            if((w_val&0x4000)==0x0)
            {
                printf("Y ");
            }
            
            if((w_val&0x2000)==0x0)
            {
                printf("SELECT ");
            }
            
            if((w_val&0x1000)==0x0)
            {
                printf("START ");
            }
            
            if((w_val&0x0800)==0x0)
            {
                printf("UP ");             
            }
                        
            if((w_val&0x0400)==0x0)
            {
                printf("DOWN ");
            }
            
            if((w_val&0x0200)==0x0)
            {
                printf("LEFT ");
            }
            
            if((w_val&0x0100)==0x0)
            {
                printf("RIGHT ");
            }
            
            if((w_val&0x0080)==0x0)
            {
                printf("A ");
            }
            
            if((w_val&0x0040)==0x0)
            {
                printf("X ");
            }
            
            if((w_val&0x0020)==0x0)
            {
                printf("L ");
            }
            
            if((w_val&0x0010)==0x0)
            {
                printf("R ");
            }
            printf("%04x\r",w_val);
        }
        return w_val;
}

```
オープンソースの優位性

# はじめに

先月OSS-DB Silverの認定をいただきました。OSS-DBはオープンソースのデータベースであるPostgreSQLの知識と技術力を証明する認定試験です。
このPostgreSQLについて、オープンソースではないデータベースとの違いをライセンスの観点で簡単にまとめました。

# PostgreSQLのライセンスと商用データベースの比較

PostgreSQLは、柔軟で強力なオープンソースのリレーショナルデータベースとして広く利用されています。
その魅力の一つは、ライセンス形態にあります。
ここでは、PostgreSQLのライセンスが商用データベースのライセンスとどのように異なるかについて説明します。

# PostgreSQLのライセンス

PostgreSQLは、PostgreSQL Licenseのもとで提供されています。
このライセンスは、OSI（Open Source Initiative）によって認定されたオープンソースライセンスの一つです。
以下に、PostgreSQL Licenseの主な特徴をまとめます。

1. **無料利用可能**
   PostgreSQLは完全に無料で利用できます。ダウンロード、インストール、実行、修正、再配布に関して、一切の制約がありません。

2. **商用利用可能**
   PostgreSQLは商用利用にも適しています。企業はPostgreSQLを使って商用製品を開発し、販売することができます。

3. **自由なカスタマイズ**
   ソースコードは公開されており、ユーザーは必要に応じてソースコードを修正し、カスタマイズすることができます。

4. **ライセンスの簡潔さ**
   PostgreSQL Licenseは非常にシンプルで、オープンソースライセンスとして一般的に知られているMITライセンスやBSDライセンスに似ているため、法的な理解が容易です。

# 商用データベースのライセンス

一方、オープンソースではない商用データベース（例：Oracle、Microsoft SQL Server）のライセンスは以下のような特徴があります。

1. **高額なライセンス費用**
   商用データベースには通常、初期導入費用に加え、年間のサポート費用やライセンス更新費用がかかります。これらの費用は、小規模ビジネスにとってかなりの負担となることがあります。

2. **利用の制限**
   商用データベースのライセンスには、インスタンス数やユーザー数などに関する制限が設けられている場合があります。また、特定の機能については追加のライセンスが必要となることがあります。

3. **カスタマイズの制約**
   商用データベースのソースコードは基本的に非公開であり、ユーザーが直接修正することはできません。一定のカスタマイズは可能ですが、大きな変更はサポート契約に依存します。

4. **法的および契約の複雑さ**
   商用ライセンスは複雑で、法的な専門知識を必要とする場合があります。契約書の内容を詳細に理解するためには、法的な助言が不可欠です。

# まとめ

PostgreSQLのオープンソースライセンスは、ユーザーに多くの自由と柔軟性を与えている一方で、商用データベースは高いコストと制約が伴います。
ビジネスのニーズに応じて、どちらのライセンス形態が適しているかを慎重に検討することが重要です。

# さいごに

PostgreSQLは標準SQLに準拠していて、信頼性も高く、コミュニティの活動も活発です。この知識、技術力を証明できる認定試験OSS-DBについて詳しくは以下のリンクを参照してください。

https://oss-db.jp/
[初級] C++: 継承

クラス継承の基本的なこと
継承、単一継承

:::note info
本記事の前提条件は以下の通りです。
* 初心者向け
* とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
* ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
* Visual Studio 2013 くらい～
* Windowsプログラム (CUI, GUI)
* コードの検証
    * 開発環境: Visual Studio 2022, x64, Release ビルド
    * 実行環境: Windows 10
:::

:::note info
* 本記事は上から順番に読む前提となっている
:::

:::note info
* 「Visual Studio 2013 くらい～」と書いてあるが、本記事の内容だと現在過去未来のどのバージョンでもほぼ同じ
* 「Windowsプログラム (CUI, GUI)」と書いてあるが、本記事の内容だとどの OS でもほぼ同じ
:::

:::note info
前提知識として必要と思われる情報
* [[初級] C++: クラスの基本 - 拙著](https://qiita.com/yasu62347/items/f544e486ea2cc1965c95)
* [[初級] C++: 機能の拡張とは - 拙著](https://qiita.com/yasu62347/items/54e8bbc63fb6a996ff88)
:::

# 単一継承のクラスを作成

基本料理クラス
```cpp
class Cook
{
public:
    void Wash();    // 洗う
    void Cut();     // 切る
    void Grill();   // 焼く
};
```

基本料理クラスを継承した拡張料理クラス
```cpp
class CookEx : public Cook
{
public:
    void Stew();    // 煮る
    void Steam();   // 蒸す
    void Mix();     // 混ぜる
};
```

拡張料理クラスを継承したお菓子作成クラス
```cpp
class Baking : public CookEx
{
public:
    void Sift();    // ふるいにかける
    void Whisk();   // 泡立てる
};
```

拡張料理クラスを継承した魚料理クラス
```cpp
class CookFish : public CookEx
{
public:
    void Bleed();        // 血抜きをする
    void RemoveScales(); // 鱗をとる
};
```

```mermaid
classDiagram
Cook <|-- CookEx
CookEx <|-- Baking
CookEx <|-- CookFish
class Cook {
    +Wash()
    +Cut()
    +Grill()
}
class CookEx {
    +Stew()
    +Steam()
    +Mix()
}
class Baking {
    +Sift()
    +Whisk()
}
class CookFish {
    +Bleed()
    +RemoveScales()
}
```

:::note info
それぞれの関数名を標準出力するよう実装した。
:::

# 使ってみる

```cpp
Baking baking;          // お菓子作成クラス
baking.Wash();          // 洗う
baking.Cut();           // 切る
baking.Sift();          // ふるいにかける
baking.Mix();           // 混ぜる
baking.Whisk();         // 泡立てる
baking.Grill();         // 焼く

// -> Wash, Cut, Sift, Mix, Whisk, Bake

CookFish cookFish;      // 魚料理クラス
cookFish.Bleed();       // 血抜きをする
cookFish.RemoveScales();// 鱗をとる
cookFish.Wash();        // 洗う
cookFish.Cut();         // 切る
cookFish.Stew();        // 煮る

// -> Bleed, RemoveScales, Wash, Cut, Stew
```

基本機能 (Wash, Cut, Grill)、拡張機能 (Stew, Steam, Mix) が使えている。また、それぞれの派生クラスで独自実装した機能も使えていることがわかる。

以上。
標準入力問題を解いてみる

# はじめに
５月末に某プラグラミングスクールでの学習課程が終了したので、
心機一転、自己学習の振り返りと記録を目的とし、本日の学びを毎日Qiitaブログに公開していきます。

早速本日から、Paizaのプログラミング問題集を使い学習を始めたのでメモ。

前提
使用言語はRubyです。

## 自己紹介 Ruby編
https://paiza.jp/works/mondai/self_introduction/self_introduction__1

自分の回答
```ruby:qiita.rb
puts "name: 太郎"
puts "language: Ruby"
puts "hitokoto: よろしくお願いいたします"
```

## 1つのデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_1

自分の回答
```ruby:qiita.rb
input = gets.chomp
puts input
```
- chomp
文字列末尾に入っている改行コードを削除するメソッド

## 3行のデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_3_line

自分の回答
```ruby:qiita.rb
n = gets.chomp
puts n
n = gets.chomp
puts n
n = gets.chomp
puts n
```

## N行のデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_n_line

思いつかなかったので解答例
```ruby:qiita.rb
n = gets.to_i

input_strings = []
n.times { input_strings << gets.chomp }

input_strings.each do |str|
  puts str
end
```
- n = gets.to_i
getsメソッドで入力値を整数で取得し、nに代入

- input_strings = []
入力された文字列を格納するための空配列を用意

-  n.times { input_strings << gets.chomp }
n回の繰り返しを行い、各繰り返しで受け取った入力値をinput_stringsに格納
chompメソッドで改行コードを削除

- input_strings.each do |str| ... end
input_stringの中の要素を繰り返し出力

## 3つのデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_3

自分の回答
```ruby:qiita.rb
n = gets.chomp.split
puts n
```
- split
文字列を分割するメソッド
引数を渡さなければ、空白文字で区切られる


## N個のデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_n

思いつかなかったため解答例
```ruby:qiita.rb
n = gets.to_i

input_strings = gets.split

input_strings.each do |str|
  puts str
end
```
## カンマ区切りの3つのデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_comma_3

自分の回答
```ruby:qiita.rb
input = gets.split(",")
puts input
```
初めて何も参照せずに解けた！
簡単な問題だけど地味に嬉しい

## カンマ区切りのN個のデータの入力 Ruby編
https://paiza.jp/works/mondai/stdin/stdin_comma_n

```ruby:qiita.rb
n = gets.to_i

input_string = gets.split(",")

input_string.each do |str|
  puts str
end
```
これも...！

スクールの学習課程終了後、どうやって学習を進めれば良いか悩んでいたのですが、
とりあえずハンズオンで学びながら解けるようになろうと思い、
Paizaの問題集を使い、いろんな方の回答などを参考に解き進めてみました。
最終２問はこれまでの記述などを踏まえて自分ですらすら書けたのが嬉しかったです。
echo $-, $0, $PS1

# The commands to inspect the state of the current shell environment
You wouldn't need to know such stuff for daily use of your PC, but it excites me so much and I don't wanna forget about this, so I will leave a record for it here. This articled has been made by GPT mainly, and that's why this is written in English. 

```bash
echo $-
hBs

echo $0
/bin/bash

echo $PS1
(nothing got printed)
```

### Bash in 100 Seconds
In case, you forgot what bash means and what it is doing, check out this video.

https://www.youtube.com/watch?v=I4EWvMFj37g

## Command: echo $-
- Output: hBs

Explanation: This command prints the current shell options that are enabled. Each letter corresponds to a specific shell option:
- h: Hash all commands in the path
- B: The shell is running in POSIX mode
- s: Commands are being read from standard input (indicating an interactive shell session)

:::note alert
Hash refers to the internal hash table used by the shell to store the locations of commands to speed up their execution.
:::

:::note info
POSIX (Portable Operating System Interface) mode refers to a standardized mode of operation for Unix-like operating systems and shells. When a shell runs in POSIX mode, it aims to conform to the POSIX standard, which ensures compatibility and portability across different Unix-like systems
:::

## Command: echo $0
- Output: /bin/bash

Explanation: This prints the name of the shell or shell script currently being executed. In this case, it indicates that you are using the bash shell, and it was invoked as /bin/bash.
## Command: echo $PS1

- Output: (nothing got printed)

Explanation: This prints the value of the primary prompt string (PS1). If nothing is printed, it means that PS1 is either unset or set to an empty value. The PS1 variable typically defines the appearance of the command prompt in the shell. A typical default value for PS1 might be something like `\u@\h:\w\$` , which displays the username, hostname, and current working directory.

# Summary of What This Means
Shell Options ($-): You are in an interactive bash shell with certain options enabled (h, B, s).

Current Shell ($0): The current shell is bash, and it was invoked directly from /bin/bash.

Prompt String ($PS1): The primary prompt string (PS1) is not set or is empty. This could result in a minimal or default prompt appearance, or the shell might be using a different variable or method for the prompt if PS1 is unset.