OmniAICreator/Qiita-1.07M huggingface dataset:
TeXのAbstractの日本語表記を「概要」から「抄録」に変更

# 概要
英語論文で言うところの`Abstract`は日本語では`概要`とTeXのデフォルト設定ではなっています。ただ、意味は同じながら表記は違う`抄録`に変更したいという望みを叶える方法について備忘録を残しておこうと思います。

# 設定方法
設定方法は簡単です。以下の1行をプリアンブル部に追加してTeXのソースをビルドするだけです。

```latex
\renewcommand{\abstractname}{抄録}
```

# 実際に実験
まず設定をせずに、以下のデフォルト状態のソースをビルドしてみます。

```latex
\documentclass[a4j, twocolumn, 12pt]{jsarticle}

\title{
    幕府という統治機構の確立とその仕組み
}

\author{
    徳川 家康\thanks{江戸幕府} \and
    足利 尊氏\thanks{室町幕府} \and
    源 頼朝\thanks{鎌倉幕府}
}

\date{}

\begin{document}

\maketitle

\begin{abstract}

\end{abstract}

\end{document}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/347b4ffb-75af-429e-064b-7023d57ba31d.png)

## 設定を追記してビルド
先述のコードをプリアンブル部に追加しビルドしてみます。下図の様に設定が反映されています。この他にも`\renewcommand{}{}`で既存の設定値を変更可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/b89061e1-431b-823d-42d7-e4bb48781c2f.png)


# Reference
https://atatat.hatenablog.com/entry/cloud_latex13_renewcommand
Voltaで特定バージョンのNode.jsをインストールする手順

# 概要
JavaScriptのツールマネージャーであるVoltaを用いて、特定バージョンのNode.jsをインストールする手順です。自分用メモでもあります。

# 手順
1. [Node.js公式サイト](https://nodejs.org/ja)にアクセスして、LTS版や最新版のバージョンを確認(2023/4/30時点ではv18.16.0が最新のLTS版)
1. コマンドプロンプトやGitBashなどを開き、`volta install node@18.16.0`を実行
※とにかくLTSをインストールしたいときは、`volta instal node`でもOK
※とにかく最新バージョンをインストールしたいときは、`volta instal node@latest`でもOK
1. `node --version`でNode.jsのバージョンが切り替わっていることを確認

終了
記録　2023/04/30

### 今日取り組んだ内容
今日の学習内容は、前日勉強した「インストラクタ」の復習、新たに「static」行いました。
インストラクタは復習ということもあり頭に入ってきましたが、新たに学んだstaticは今までとは定義の仕方が若干違く感じたため、なかなか頭に入ってきませんでした。なので、時間をかけてインプットし、現在作成中の家計簿アプリの方でアウトプットしていけたらなと思っています。
Tang-Nano-9K に Gowin EAD Education Edition でビットストリームを書き込む

# はじめに
　今年のG.W.に何をしようかなぁと考えていましたが、前から気になっていたTang-Nano-9Kを使ってFPGAの勉強をしてみることにしました。
　さっそく、秋月電子通商さんに行って購入(https://akizukidenshi.com/catalog/g/gM-17448/) 。数量限定キャンペーンで参考文献\[1\](以下、冊子)がもらえました(2023年4月29日現在)。（バックナンバーを購入するつもりだったので助かりました）

　家に帰って、もらった冊子を読んでみると、開発ツールであるGowin EDAからのビットストリームのフラッシュメモリへの書き込み＆ベリファイが失敗するとのこと。
　とはいえ、ツールのバージョンも冊子よりは進んでいるので修正されているんじゃないかと思って試したところ、フラッシュメモリへの書き込みのみはできたので記事にすることにしました。

:::note
追記：そもそもこちらで、「ベリファイは選ばないように」と書かれていました。(2023年5月4日現在)
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-Doc/questions.html#Download-slowly
<img src="https://wiki.sipeed.com/hardware/zh/tang/assets/questions/never_choose_verify.png">
:::


　なお、各種バージョンは以下のとおりです。
- FPGA: GW1NR-LV9QN88PC6/I5
- EDA: Gowin V1.9.8.09 Education Edition (Windows)
- OS: Windows11

# 準備
　ビットストリームの書き込みまでの環境構築などは他の記事や冊子を参照してください。

　私は冊子の基礎編　第3章「FPGA開発初体験！LED点滅(Lチカ)」の回路を準備しました。

# Gowin EADからの書き込み
　Gowin EADを使った書き込み方法を以下で説明します。ビットストリームの生成までは問題なくできているとします。

## ビットストリームの生成
　ツールバーにある次のアイコンをクリックしてビットストリームを生成します。
![スクリーンショット 2023-04-30 212808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/eae4c969-f7dd-f456-ebcd-7cc859836094.png)
　生成先は`<プロジェクト・ディレクトリ>/impl/pnr/<プロジェクト名>.fs`になります。後ほど、こちらのファイルを指定することになります。

## プログラマーの設定
　以下の作業は**Tang-Nano-9KをPCと接続して**行ってください。まず、ツールバーから次のアイコンをクリックします。
![スクリーンショット 2023-04-30 212842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/8e164669-9295-3e2a-3f54-75117bffd851.png)
　すると次のCable Settingダイアログが開きます。私はデフォルト設定のままで問題ありませんでした。
![スクリーンショット 2023-04-30 213028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/891c7def-da6a-0eeb-74a7-b5c20876639a.png)
　Gowin Programmerが開きます。まずは次のアイコンをクリックしてデバイスを登録します。
![スクリーンショット 2023-04-30 213541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/fd018e0e-e476-015d-82f5-1b9942a2c951.png)
　次のように"Series"と"Device"を適当に選択します。
![スクリーンショット 2023-04-30 213622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/e949fded-8fcd-48b4-0e9d-029a3ec6c70c.png)
　"Operation"列をダブルクリックすると次のDevice Configurationダイアログが開くので"Access Mode"、"Operation"欄を次のように設定します。"File name"には先ほどの`*.fs`ファイルを指定します。
　"Operation"欄で"Verify"込みの設定もありますが、そちらを選択すると冒頭に書いたようにベリファイで失敗してしまいました。
![スクリーンショット 2023-04-30 213311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/3c988160-9f10-b47d-177c-002654101a7c.png)
　全ての設定が終わったらツールバーの次のアイコンをクリックすると書き込まれて実行されます。
![スクリーンショット 2023-04-30 213643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/50dc119d-86d1-8ce4-7e2e-bf5066538e76.png)

# おわりに
　ベリファイに失敗してしまうのは残念ですが、一つのツールで書き込みまで完結するのは快適です。ベリファイもツールのバージョンアップで修正される可能性があるので改めて確認したいです。個人的にはメインでMacを使っているので、Macにも対応した開発ツールが出れば良いなと思っています。

# 参考文献
[1] CQ出版社. 2500円ボードで始めるFPGA開発 Vol.2. Interface. 2022, 12月号, 別冊付録１
TeXで論文を執筆する時に著者の所属を表す注釈の表記を変更する方法

# 概要
TeXで論文を執筆中に複数人の著者それぞれの所属先を記載する方法としてプリアンブル部に`\author{}`で著者名を記載し、`\thanks{}`で所属先を記載する方法が代表的です。この時それぞれの所属先を記号付きで表します。この記号の表示順やそもそも記号では無く数字で表記する場合の設定方法の備忘録を残しておこうと思います。

# まずはデフォルトの具体例
デフォルトの状態ではどうなるのか、以下のTeXのソースをビルドしてみます。

```latex
\documentclass[a4j, 12pt]{jsarticle}

\title{
    幕府という統治機構の確立とその仕組み
}

\author{
    徳川 家康\thanks{江戸幕府} \and
    足利 尊氏\thanks{室町幕府} \and
    源 頼朝\thanks{鎌倉幕府}
}

\date{}

\begin{document}

\maketitle

\end{document}
```

ビルドの結果、下図の様に3種類の記号で所属の注釈表記を記述しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/7d01111a-5afb-dca9-1233-b578a2ad558e.png)

# 数字表記に変更
記号表記ではなく数字表記に変更してみます。以下のコードをプリアンブル部に追加しTeXのソースをビルドします。

```latex:所属名の注釈を数字表記で表示するための設定
\makeatletter
\let\@fnsymbol\@arabic
\makeatother
```

ビルドの結果、下図の様に数字表記に変更出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/088a98c2-81ff-16d6-9ae1-d37f326031a4.png)

# 表記記号の登城順序の変更
記号表記とした場合、一番目に`*`、二番目に`†`、3番目に`‡`表記となります。どうもバランスが悪い上に、`†`は十字架のようで筆者の好みに合いません。よっていっその事、記号の登城順序を変更してみようと思います。以下のコードをプリアンブル部に追加しTeXソースをビルドします。

```latex:所属名の注釈記号の順序を任意の順番に変更する設定
\makeatletter
\def\@fnsymbol#1{\ensuremath{\ifcase#1\or \ddagger\or \ddagger\ddagger\or
            \mathsection\or \mathparagraph\or \|\or **\or \dagger
        \or \dagger\dagger \else\@ctrerr\fi}}

\makeatother
```

ビルドの結果、下図の様になりました。めでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/fcd8ccda-a5a7-dfa0-6176-fb940bfece4a.png)

# まとめ
TeXの`\author{}`の細かい設定を制御するためのコードについて扱いました。苦労して探し当てたので、記事としてまとめておこうと思い立ち投稿に至りました。サンプルコードの内容はもしこの3人が共著で論文を出すならという妄想が生み出した内容です。悪しからず。

# Reference

https://latex.org/forum/viewtopic.php?t=16568

https://tex.stackexchange.com/questions/455140/customizing-the-symbol-next-to-the-authors-name-in-a-document

http://xyoshiki.web.fc2.com/tex/footnote.html
Voltaをアップデートする手順

# 概要
本手順はWindowsOS向けのVoltaのアップデート手順です。自分メモ用でもあります。
# 手順
1. [VoltaのGitHub](https://github.com/volta-cli/volta/releases)にアクセス
1. 最新の.msiファイルを選択しダウンロード(2023/4/30時点では、v1.1.1が最新)
1. ダウンロードフォルダから、.msiファイルをクリックし、インストーラを起動
1. 「Welcome to the Volta Setup Wizard」ダイアログにてNextを選択
1. 「Change, repair, or remove installaion」ダイアログにて、
Changeを選択

1. 「Custom Setup」というダイアログにて、Nextを選択
1. 「Ready to Change Volta」というダイアログにて、Changeを選択
1. 「Completed the Volta Setup Wizard」というダイアログにて、Finishを選択
1.  コマンドプロンプトやGit Bashなどでターミナルを開き`volta --version`コマンドをうち、インストールしたバージョンが表示されることを確認

終了。
データサイエンスのための線形代数 第21回 行列関数の全射

:::note info
本記事は数学講座[5.5 行列関数の全射](https://www.matongxue.com/lessons/538/parts/693)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# :sunny:[まとめ]全射

全射は、到達域と値域の関係です。（単射は定義域と地域の関係です）

自然な定義域で：
```math
\begin{array}{c|c|c|c}
    \hline
    \quad行列関数\quad&\quad 全射の必要十分条件 \quad\\\hline\\
    \quad \boldsymbol{A}\boldsymbol{x}=\boldsymbol{y} \quad&\quad 行フルランク \iff 全射 \quad\\
    \quad \boldsymbol{x}^\mathrm{T}\boldsymbol{A}=\boldsymbol{y}^\mathrm{T} \quad&\quad 列フルランク \iff 全射\quad\\
    \\
    \hline
\end{array}
```


# 列ベクトル行列関数の全射

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/3780aa6e-11b7-2de3-5117-a217bf87e94b.png)

よって、$rank(colsp(A))=m$、また任意の行列には、**列ランク=行ランク**があるので、

```math 

\left.\begin{aligned}rank\Big(colsp(\boldsymbol{A})\Big)=m\\列ランク=行ランク\end{aligned}\right\}
\implies rank\Big(rowsp(\boldsymbol{A})\Big)=m

```
$A$が$m\times n$の行列、なので：

```math 
rank\Big(rowsp(\boldsymbol{A})\Big)=m\iff \boldsymbol{A}\ 行フルランク\iff \boldsymbol{A}\boldsymbol{x}=\boldsymbol{y}\ が全射
```

:::note info
任意の行列には、**列ランク=行ランク**の証明は[こちら](https://www.matongxue.com/parts/2247/)です。
:::

- 例：全射

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/cfff1bae-08d9-1039-bc9a-5bd0354e63ac.png)

ちなみに、上記は単射ではない(定義域ランク > 値域ランク)です。

- 例：全射ではない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/8c63e3a1-7db6-c383-3042-0622d11b151e.png)

ちなみに、上記は単射(定義域ランク ＝ 値域ランク)です。

# 行ベクトル行列関数の全射
列ベクトル行列関数とほぼ同じですので、省略します。

# 全射の例題

以下の線型方程式系には、解があるか？

```math
\begin{cases}
    2x_1+3x_2=5\\
    3x_1+6x_2=9
\end{cases}
```

解があるかどうか、$b$が値域にあるか、全射で判断することができます。
```math
\begin{cases}
    2x_1+3x_2=5\\
    3x_1+6x_2=9
\end{cases}\implies\underbrace{\begin{pmatrix}2&3\\3&6\end{pmatrix}}_{\Large A}\ \underbrace{\begin{pmatrix}x_1\\x_2\end{pmatrix}}_{\Large\boldsymbol{x}}=\underbrace{\begin{pmatrix}5\\9\end{pmatrix}}_{\Large\boldsymbol{b}}
```

以上のように、(2,3)と(3,6)が線型独立ですので、行フルランクになります。だからこれが全射です。到達域が$R^2$ですので、値域も同じく$R^2$です。$b$が$R^2$にあるので、解があります。

# 参考情報

https://mathlandscape.com/bijection/
【Android】ボタンのダブルタップを検知する方法とHandlerについて少し【kotlin】

# はじめに
今回はボタンのダブルタップ（ダブルクリック）について記事にします。
Androidでは**GestureDetector**を使用することで、タッチイベント系のさまざまな処理を検知できるようですが、今回は（そんなに沢山使いたい訳じゃないし、一つのボタンだけのために・・・）と思って別のやり方にしました。

# ダブルクリック処理

```
var buttonClickCount = 0

binding.button.setOnClickListener {
        myLocationButtonClickCount++
        Handler(Looper.getMainLooper()).postDelayed({

            if (buttonClickCount == 1) {
                // シングルクリック時の処理
            } else if (buttonClickCount == 2) {
                // ダブルクリック時の処理
            }
                myLocationButtonClickCount = 0
            }, 300)
```

Handler(Looper.getMainLooper()).postDelayed({

Handlerの引数にLooperを指定します。
Looperは、UI を管理するスレッドのメインスレッドをバインドします。”Looper.getMainLooper()”

HandlerのpostDelayedを使用することで、遅延を発生させて、その遅延中に行いたい処理を第一引数に。
第二引数に遅延させたい時間をミリ秒で指定します。
　"300"を入れると　0.3秒間に何回クリックされたかを検知できます。
# 参考
https://zenn.dev/takudooon/articles/1c46153bd2c7cd


↓Handlerクラスについて

https://developer.android.com/reference/android/os/Handler

https://qiita.com/DreamHanks/items/a0a85f59e50e2e9308fe

https://re-engines.com/2019/12/19/%E3%80%90java%E3%80%91handler%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/
顔画像を高画質化したいメモ

DreamBooth とかで生成した顔画像を高精細化したい...

* https://github.com/TencentARC/GFPGAN
  * RestoreFormer https://github.com/wzhouxiff/RestoreFormer の推論コードも最近 GFPGAN に入った 
* https://github.com/TencentARC/VQFR

ありがとうございます. どちらも Tencent ARC 製.
React Drag & Drop

https://github.com/atlassian/react-beautiful-dnd


![53614150-efbed780-3c2c-11e9-9204-a5d2e746faca.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/833895ab-4d50-dba0-89f8-52db76e2c90f.gif)

https://react-beautiful-dnd.netlify.app/iframe.html?id=board--simple



https://react-beautiful-dnd.netlify.app/?path=/story/single-horizontal-list--simple
Bool?型でnilをfalseにして反転する方法(Swift)

## はじめに

`Bool?` 型で `nil` を `false` 扱いにして反転する方法を紹介します。

## 環境

- OS：macOS Ventura 13.3.1
- Xcode：14.3 (14E222b)
- Swift：5.8

## 結論

※結論はあくまで私の意見です。

以下のどちらかが簡潔でわかりやすいです。
「 `nil` を `false` 扱いにする」がわかりやすいのは前者で、 `isFoo != false` など条件が変わってもわかりやすいのは後者だと思います。

- `!(isFoo ?? false)`
- `isFoo != true`

## 他の案

- `!(isFoo == true)`
  - `isFoo != true` のほうが簡潔でわかりやすい
- `isFoo ?? false == false`
  - 演算子の優先順位がわかりづらい

## おまけ

そもそも `Bool?` 型のまま扱うとわかりづらいので、アンラップして `Bool` 型にして扱うという意見もあります。

https://twitter.com/noppefoxwolf/status/1651443865713520641

## おわりに

みなさんはどのようにして `Bool?` 型を扱っていますか。
他にいい意見があればコメントなど頂けると嬉しいです :relaxed:

## 参考リンク

- https://twitter.com/the_uhooi/status/1651433957974736897
- https://twitter.com/inamiy/status/1651502554092814337
Table要素をレンダリングする際の「Hydration failed because the initial UI does not match what was rendered on the server」エラーへの対応

以下のコードでの「Hydration failed because the initial UI does not match what was rendered on the server」エラーに、しばし悩まされましたが、
```React
import React from 'react';

function App() {
  return (
    <table>
      <tr>
        <th>Header 1</th>
        <th>Header 2</th>
      </tr>
      <tr>
        <td>Row 1, Cell 1</td>
        <td>Row 1, Cell 2</td>
      </tr>
      <tr>
        <td>Row 2, Cell 1</td>
        <td>Row 2, Cell 2</td>
      </tr>
    </table>
  );
}

export default App;
```
以下のようにthead, tbodyでヘッダ・ボディを明示的にすることでエラーを解消できました。
```React
import React from 'react';

function App() {
  return (
    <table>
      <thead>
        <tr>
          <th>Header 1</th>
          <th>Header 2</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Row 1, Cell 1</td>
          <td>Row 1, Cell 2</td>
        </tr>
        <tr>
          <td>Row 2, Cell 1</td>
          <td>Row 2, Cell 2</td>
        </tr>
      </tbody>
    </table>
  );
}

export default App;
```
このエラーが発生する場合、Reactが想定しないHTMLになっている可能性があるかも知れません。
個人レポートまとめ


# はじめに
過去に作成した個人レポートを一覧としていまとめました．意図として，外部公開することもありますが，クラウドストレージに潜って探してくるよりも閲覧しやすいこともあります．現時点では主要なもの（直近のものや規模の大きいもの）をまとめていますが，短編レポートも多数あり，段階的に増やしていく予定です．

なお，現在，PDFを公開管理できるプラットフォームを探しており移管する可能性もありますのでご容赦ください．


# 衛星通信関連

- 衛星通信の基礎（前半抜粋）
https://www.dropbox.com/s/w35ycza21gcmk4e/20230312_BasicSatCom.pdf?dl=0

- 国内の衛星通信オペレータ（スカパーJSAT）の動向
https://www.dropbox.com/s/8pj613s4hrupg7z/20221030_JSAT.pdf?dl=0

- 低軌道衛星通信の定量化
    - Horizontal Planeによる衛星イベントの定量化
    https://www.dropbox.com/s/0xi8ctlme3rcyru/20230326_LeoSatCom-HP.pdf?dl=0
    - カバレッジの定量化
    https://www.dropbox.com/s/96b9umzcdfekbqo/20230403_LeoSatCom-Coverage.pdf?dl=0


# 無線通信の基礎
- デジタル変復調
https://www.dropbox.com/s/k5jur2jg7pg0rid/20221104_DigitalMod.pdf?dl=0

- 電波伝搬（初心者向け）
https://www.dropbox.com/s/0ye9t8edokhig6n/20221118_RadioProp..pdf?dl=0

- 電磁波工学（初心者向け）
https://www.dropbox.com/s/nino6x9zfbjvfxa/20210529_%E9%9B%BB%E7%A3%81%E6%B3%A2%E5%B7%A5%E5%AD%A6.pdf?dl=0

- デジタル信号処理（前編）
https://www.dropbox.com/s/yh014ois214vknj/20220407_%E4%BF%A1%E5%8F%B7%E5%87%A6%E7%90%86.pdf?dl=0

# 衛星軌道

- 時刻と座標系
https://www.dropbox.com/s/cnt50nv1inuikj1/20200919_%E6%99%82%E5%88%BB%E3%81%A8%E5%BA%A7%E6%A8%99%E7%B3%BB.pdf?dl=0

- 2体問題で始める軌道基礎
https://www.dropbox.com/s/mcukahm66vsqcj0/20221118_SatDynamics.pdf?dl=0
JBoss、GlassfishにデプロイしたWebアプリケーションをリモートからEclipseでデバッグ

JBoss、Glassfishともに、もともとリモートデバッグ用にオプションが用意されている。

### 確認した環境
* Glassfish4.1.2
* JBoss7.4
* Java1.8

### GlassFishの場合
--debugオプションをつけて起動

```shell
asadmin start-domain --debug
```
9009がデバッグ用のポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/b6be1f46-f057-c565-5217-ee3c84f3f0cb.png)

### JBoss(standalone)の場合
standalone.confファイルの以下のコメントをはずす。以下は、address=8787なので8787がデバッグ用のポート。

```shell
# Sample JPDA settings for remote socket debugging
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
```

起動時には、localhost以外からも起動できるようbindアドレスを指定する。
```shell
standalone.sh -b 0.0.0.0
```

### Eclipse側の設定
プログラムを停止したいところで、ブレークポイントを設定したのち、Eclipseのデバッグ設定画面を開き、「Remote Java Application」の設定を行います。以下のEclipse側の設定と同じ。

https://qiita.com/tthogho1/items/601b88bc9b1a2d45b363
Oracle Cloudのボリュームアタッチメントタイプの性能差

# はじめに

:::note warn
注：iSCSIの方が性能が良い、と投稿しましたが改めてデータを取得したところ、無料枠レベルのサイズでは誤差というか違いが判らないレベルでしたので、訂正いたします
:::

Oracle Cloudにおいて、VMインスタンスにアタッチできる [ブロック・ボリュームのアタッチメントタイプは準仮想化タイプとiSCSIタイプの二種類](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/overview.htm#attachtype) あります。
ボリューム・アタッチメントのタイプの説明は以下のようになります。

- 準仮想化: VMで使用可能な仮想化アタッチメント。
- iSCSI: ボリュームとアタッチされたインスタンスとの間の通信に使用されるTCP/IPベースの規格。

また、IOPSパフォーマンスはiSCSIアタッチメントのほうが準仮想化アタッチメントよりも高くなる、という説明があります。具体的にどの程度パフォーマンスが違うのか、確認してみました。
（以前は[パフォーマンスSLA](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/blockvolumeperformance.htm#blockperfsla)の対象にはiSCSIのみ、という記載がありましたが、現時点では削除されており、準仮想化タイプでもSLA対象となるようです）

## ボリュームアタッチメントタイプの違いによる性能差

以下のように、二つのボリュームを同一のインスタンスにアタッチします。
（VPUは両方ともデフォルトの10、サイズは500GB）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/c1e58f39-03f5-c669-847f-5d67c292bb57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/76c89808-21b8-2335-3b06-2c64c5f45e26.png)

fioを用いて、両方のディスクに対して、ブロックサイズを4kB、1MB で負荷をかけた時の性能を測定しました。

- 4kB 固定

|種類|準仮想化<br>IOPS |iSCSI<br>IOPS |準仮想化<br>スループット(MiB/s) |iSCSI<br>スループット(MiB/s) |
|:-:|:-:|:-:|:-:|:-:|
|sequential read|60.7k|60.8k |237|237 |
|sequential write|60.3k |60.3k |235|236 |
|random read|25.4k |25.4k |93.8|99.2 |
|random write|25.3k |25.3k |98.8|98.7 |

- 1MB 固定

|種類|準仮想化<br>IOPS |iSCSI<br>IOPS |準仮想化<br>スループット(MiB/s) |iSCSI<br>スループット(MiB/s) |
|:-:|:-:|:-:|:-:|:-:|
|sequential read|237|237 |237|237 |
|sequential write|234 |235 |235|237 |
|random read|237|237 |237|237 |
|random write|235 |235 |235|236 |

# まとめ
性能に関しては上記の環境ではほぼ違いを確認することはできませんでした。
OCIのブロックボリュームの [パフォーマンスレベル](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/blockvolumeperformance.htm#perf_levels) に記載がありますが、500GBのバランス(VPU10) ブロックボリュームのIOPS上限は次の表になります。

||最大IOPS|最大MBPS|
|:-:|:-:|:-:|
|500GB|30,000|240|

ここで、バランスボリュームのボリューム当たりの最大IOPSは25,000となるため、実質的には 25,000IOPS、240MB/sが上限となり、テスト結果も大体そのような値になってます。
（シーケンシャル読み取り・書き込みで60k超のIOPSが出てますが、マルチブロックでIOが実施されていると想定してます）

インスタンスのコア数やブロックボリュームを高速化していくことで、違いが見えてくるかもしれません。
テストできる環境ができたら、もう少し幅を広げて確認してみたいと考えてます。
VSCodeでC#の.NET Frameworkプロジェクトを作成する

## はじめに
Visual Studio Code (VSCode)でC#の.NET Framework4.8開発環境をセットアップしたときのメモです。

## 前提
下記の条件が前提です。
* Windows PCでVSCodeがインストールされていること

## 環境設定
* VSCodeの設定(拡張機能)
  `Ctrl`+`Shift`+`X`で拡張機能をインストールします。
  * `C#`
    * [C# for Visual Studio Code (powered by OmniSharp)](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
  * Nuget(何れか)
    * [Visual NuGet](https://marketplace.visualstudio.com/items?itemName=FullStackSpider.visual-nuget)
    * [NuGet Package Manager](https://marketplace.visualstudio.com/items?itemName=jmrog.vscode-nuget-package-manager)
* C#ビルド環境([.NET](https://dotnet.microsoft.com/ja-jp/download/dotnet) SDK)
  * [Download .NET 7.0 SDK](https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.203-windows-x64-installer?journey=vs-code)
    * 上記C#拡張の最新版をインストールしてVSCodeでC#のソースを表示すると、インストールの案内が出るので、そこでSDKがインストールしてあればOkです。
* ターゲットのSDK
  [.NET Framework 4.8.1](https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/net481)の開発者パック(SDK)をインストールします。
  * [Download .NET Framework 4.8.1 開発者パック](https://dotnet.microsoft.com/ja-jp/download/dotnet-framework/thank-you/net481-developer-pack-offline-installer)

参考：[VSCodeでC#開発環境整えちゃう（グッバイVisual Studio）](https://ascii.jp/elem/000/004/038/4038170/)


## プロジェクト作成
WPFアプリか、コンソールアプリを選択して、プロジェクトを作成します。
* WPFの場合(例)
`dotnet new wpf --target-framework-override net48 -lang c# -o webcam`
* コンソールアプリの場合(例)
`dotnet new console --target-framework-override net48 -lang c# -o webcam_console`

コマンド実行後に、プロジェクト名のフォルダが作成されるので、エクスプローラーでフォルダを右クリックし、「Codeで開く」で開けば、開発が始められます。

参考：[VSCodeで.NET Frameworkを利用する。－.NET Framework利用のための手続き(コンソールアプリケーションの開発準備)](https://impsbl.hatenablog.jp/entry/VSCodeWithDNFW2#コンソールアプリケーションの開発準備)

## 応用例

https://qiita.com/e4rfx/items/dc3d3788672b3ff782d2
PowerAutomateでTwitter投稿をする

2023年4月のTwitterAPIの仕様変更で、従来の設定でTwitter投稿ができなくなったため、設定変更をおこなった。
注意：Botを作るためには使っていません。APIはあくまで補助として使っています（イーロンマスクに消される）！！

## 前提条件
TwitterのAPIは仕様変更前から登録している状態
今回使うのは新しいAPIのフリー版
※フリー版はAPIを使ったツイートのみができます（月の回数制限あり）

PowerAutomateのTwitterコネクタの公式ドキュメントを読んでおく
※公式ドキュメントマジで大事
https://learn.microsoft.com/ja-jp/connectors/twitter/

## 手順
### Twitter側の設定
まずは、旧APIからプラン変更する
トップページ⇨「Products」⇨「Twitter API v2」⇨「Free」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/d3f3b545-4219-ef08-076c-99a74177887c.png)

プランの詳細の下に「downgrade」のボタンを押す
※画像はdowngradeをしてしまった後なのでボタンがない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/0e5941e8-df30-dddc-622d-f3d9d311ede1.png)

「Projects & Apps」 → 過去に作ったAppsを選択（私の場合はmyAcountTweet）
※Appsを作っていない人は一から作成する
「User authentication settings」のEdit
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/1a6bb5f6-1fc9-f6fa-ddb3-b2ec8e973f7c.png)

必要な権限とタイプを選択する（フリー版だとReadはできないのかな？試していないのでわからん）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/698deaa8-d852-3364-2026-f80f26063d43.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/41f98843-a3cf-60ac-59fe-e6a096007028.png)

App infoのcallbackURIに「https://global.consent.azure-apim.net/redirect
」を入力
※公式ドキュメントに記載してあります
Website URLは自分のTwitterのURLを入力しました（あってるかはわからない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/4453b7ff-86b3-6071-6f7e-0a38e53eb3c7.png)

その後カスタマーキーやトークンなどが表示されるのでメモ帳などにメモしておく

### PowerAutomate　の設定
トップページから「データ」⇨「接続」⇨「＋新しい接続」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/502220bc-742f-1096-cb0a-074f71e82b41.png)

Twitterを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/a8338b13-6373-4729-0178-6bf067593787.png)

先ほどメモしたConsumer Keyなどを入力
その後Twitterのログインを求められるので処理する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/bfdb662e-2b30-0630-9d3c-22bf3d0e53a7.png)

これでPowerAutomateでTwitterコネクタ（投稿）が使えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/44d6d8d4-22cb-1fc8-ae54-57178e7794fb.png)

TwitterAPIが有料化する話を聞いてもうダメかと思ったが、個人だったらフリー版でもなんとかなるのではと思った。
APIの許可の設定は色んな情報を見たが、どこにもなかったが結局公式ドキュメントに書いてあった（あるある）
eccube4.2 webapiで検索条件を追加する

特定の製品を購入した受注のみをwebapiを介して表示する。
webapiプラグイン上でwhereしているのではなく、プラグインからコアファイルの「getQueryBuilderBySearchDataForAdmin」を呼び出しているので、ここにwhere条件を追加する。


```php:src\Eccube\Repository\OrderRepository.php
 public function getQueryBuilderBySearchDataForAdmin($searchData)
{
//...既存の処理の内容
if (isset($searchData['buy_product_name']) && StringUtil::isNotBlank($searchData['buy_product_name'])) {
            $qb
                ->andWhere('oi.product_name LIKE :buy_product_name')
                ->setParameter('buy_product_name', '%'.$searchData['buy_product_name'].'%');
}

//追加
if (isset($searchData['buy_product_id']) && StringUtil::isNotBlank($searchData['buy_product_id'])) {
            $qb
                ->andWhere('oi.id = :buy_product_id')
                ->setParameter('buy_product_id', $searchData['buy_product_id']);
}
}
```

OrderRepositoryに追加するだけだと処理されないのでtype追加
管理画面に追加はしたくないのでtwigは特にいじらない


```php:src\Eccube\Form\Type\Admin\SearchOrderType.php
 public function buildForm(FormBuilderInterface $builder, array $options)
{
//...既存の処理の内容
->add('buy_product_name', TextType::class, [
'label' => 'admin.order.purchase_product',
'required' => false,
])
//追加
->add('buy_product_id', TextType::class, [
'label' => '製品id',
'required' => false,
])
}
```

コアファイルをいじりましたが「Customize」ディレクトリから追加させたほうが良い
ChatGPT×LINE Pay×Stripeで英会話LINE Botを作ってみた！

# はじめに
初めまして。Bakutaです。Qiitaはいつも見ていますが、今回良い体験をしたので投稿もしてみようと思い、この度初めて投稿します。
自分はPython、PHP、Javascriptなどでいろいろと思いついたアプリを作っている人間です。（もちろんお客様からのご依頼のアプリも作っていますが）

そこで、今回はChatGPTを使ったアプリを作ってみようと思い、チャレンジしてみました。
今回作成したのはCathy先生とLINEボットで英会話ができるアプリです。
![header.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352377/fc4d8d9d-fe72-64cd-f077-595190f5e28c.png)
こちらのリンクから実際に利用できます。
https://liff.line.me/1645278921-kWRPP32q/?accountId=682vdtqi

紹介ページはこちらです。
https://forecast.bakooo.com/liff/guide/index.html


# 機能
- ナチュラルな英会話
 ChatGPTなのでナチュラルに英会話を楽しむことができ、また、適切な表現になるよう訂正もしてくれます。1時間以内に会話履歴があったらその履歴もChatGPTに投げているので、会話履歴も理解して会話してくれます。
![daily_conversation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352377/0f6cc096-3254-26c9-9f69-89db05377c4b.png)

- 問題の出題
 英会話の問題を出題してくれます。問題の出題だけでなく、その問題の解説もしてくれます。
![quiz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352377/b9d39c7e-49cf-7ba9-7c96-c1a47add9f4e.png)

- 料金プラン
　無料でも月10回利用できますが、以下の決済機能もつけました。

- サブスクリプション
　Stripeを利用し、サブスクリプションの登録ができるようにしています。支払方法はクレジットカード決済です。

- 都度払い
　サブスクリプションだけでなく、都度払いもできるようにLINE Pay決済も対応可能にしています。


# システム構成
- モデル：OpenAIのGPT3-Turbo
- デプロイ環境：Conoha Wingのレンタルサーバー、Google Apps Script
- 言語：Javascript、PHP、Python
- 開発時のOS：Windows11

一旦レンタルサーバーとGASという構成にしていますが、アクセス数を見ながらAWSかVPSサーバーに移行していこうと思っております。


# 難しかった点
難しくて時間がかかったのは、Stripeの決済です。
いろいろなブログ記事を見ながらトライしていたのですが、どんなやり方を試してもエラーが出てなかなか前に進めなかったです。
でも、一番頼りになるのはやはり公式のドキュメントですね。かなり手厚いドキュメントがあるのでだいぶ助かりました。

Stripeはテストもしやすいようになっていて、テスト環境から本番環境への移行もだいぶスムーズにできるので、その点はだいぶ開発しやすかったです。

# 今後
今回はQiita初投稿だったので、この辺にしておきますが、今後詳細についても記載していきたいと思っております。

面白そうだと思ってくださった方はぜひ一度使ってみてください！
https://liff.line.me/1645278921-kWRPP32q/?accountId=682vdtqi
RHEL8 での SunRPCサポートの変更

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/developing_c_and_cpp_applications_in_rhel_8/index

メモ。

# RHEL 8 での C および C ++ アプリケーションの開発

## 5.1. コンパイラーおよび開発ツールにおける互換性に影響を与える変更

### Sun RPC インターフェイスおよび NIS インターフェイスが glibc から削除される

glibc ライブラリーは、新しいアプリケーションに Sun RPC および NIS のインターフェイスを提供しなくなりました。このインターフェイスは、レガシーアプリケーションを実行する場合にのみ利用できるようになりました。開発者は、Sun RPC の代わりに libtirpc ライブラリー、そして NIS の代わりに libnsl2 ライブラリーを使用するようにアプリケーションを変更する必要があります。アプリケーションは、置換ライブラリーの IPv6 サポートを利用します。

# glibc に含まれなくなったヘッダファイルのインストール??
よくわからないけど...これでいいのか?

## 1つ目
RHEL8のインストールメディア内
`# yum info libtirpc-devel`

→/usr/include/**tirpc**/rpc にヘッダファイルがインストールされる
→IncludePathが変わっているので注意（gccで追加のパス設定が必要）
（/usr/include/**tirpc**/rpcsvc 配下はないので2つ目）

## 2つ目
こちらはインストールメディアに含まれていないようなので RHELのサイト よりダウンロード
https://www.redhat.com/
→ログイン
→`カスタマーポータル` をクリック
→`ダウンロード` をクリック
→`RPMパッケージ検索` をクリック
→検索ウィンドウに `rpcsvc` を入力して検索
→一覧よりパッケージ `rpcsvc-proto-devel` を探してアーキテクチャ`x86_64` をクリック
→一覧よりパッケージ `rpcsvc-proto-devel-1.4-9.el9.x86_64.rpm` をダウンロードする

RHEL8にrpmファイルを転送してrpmインストールを実行する
`# rpm -ivh rpcsvc-proto-devel-1.4-9.el9.x86_64.rpm`

→これで /usr/include/rpc/rpcsvc にヘッダファイルがインストールされる
（こちらは**tirpc**ではないようです）
flutterの初期セットアップ(windows)


### インストール
公式からダウンロード。任意のフォルダに解凍。
https://docs.flutter.dev/get-started/install
あとでパス（環境変数）を通すので、一度展開したら動かさない場所が良い。
（例えばc:/Program Files/や、独自にc:/apps/などのディレクトリを作るなど）

インストールはここのチュートリアルもおすすめ。
https://www.flutter-study.dev/introduction/about-flutter


### CLIからflutter doctor
このとき、エラー箇所はエラー文で検索すれば解決する。リファレンス多い。
```console:console
flutter doctor
```

### パスを通す
flutter\bin をシステム環境変数に登録。

### 作業ディレクトリを作成
好きなば場所に、以降のプロジェクトファイルを格納するディレクトリを用意。
（例えば c:/dev/sample_app/ など。）

### プロジェクトの作成
後で変更するのが大変なので、プロジェクト名は初めからちゃんとしたものを付けておくと良い。
とりあえず練習ということなら何でもいい。
```console:console
flutter create プロジェクト名
```

### Androidエミュレータの設定
Android Studioをインストール。
下記にしたがって好きなバージョンのAndroid OSをエミュレータとしてセットアップ。
https://blog.css-net.co.jp/entry/2022/06/06/112045

Android実機をUSB接続して使っても良い。その場合、Andoroid端末の方で、開発者モードを有効化し、USBデバッグモードをONにしておく。
※USBデバッグモードをONにしていると日頃使っているアプリが起動しなくなるケースもあるので、開発が終わったらOFFにしておく。

エミュレータや実機を含む、利用可能なデバイスの一覧は下記で確認。
※ちなみにiOSはWindowsで起動できない。基本的にWin環境でiOS開発はできないと思っていて良い。「そんなことない」と思える人は上級者なので、自分で調べて環境構築してください。

```console:console
flutter devices
```

### プロジェクトの実行

```console:console
flutter run
```
VS Code等、Andoroid Studio以外を使っている方は、デフォルトのエミュレータをAndoroidにしておくのをお忘れなく。
VS Codeの場合は画面右下に「No Device」とか「Windows」などと書いてある箇所から変更可能。
ここも参照；
https://blog.css-net.co.jp/entry/2022/06/06/112045


うまく立ち上がればセットアップは完了。
Gitの超基本コマンドと開発の流れ

<h1>リポジトリの作成</h1>
github（ブラウザ上）で、リポジトリを作成する。
今回Readmeとgitignoreにチェックを入れた。

![ripozitori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/b9f2d55d-0f92-88aa-10d1-9072f7231ce7.png)


<h1>リポジトリをクローンする</h1>
事前に「tool」というディレクトリ（フォルダ）を作っておく。
ターミナルで上記のディレクトリに移動する。
そこでリポジトリをクローンする。

コマンドは以下。
git clone [リポジトリのページにあるcodeの中の"SSH"のURL]

![クローン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/555e07e7-7386-a8e5-14cd-6262f01d938d.png)

toolフォルダの中に「tool」というフォルダがクローンされた


<h1>ブランチを切る</h1>
ターミナルでクローンした「tool」フォルダへ移動し。
以下のコマンドでブランチを切り、作成したブランチになってることを確認する

ブランチを切るコマンド（　”1st”という名前のブランチを作成）
git checkout -b 1st

ブランチを確認するコマンド
git branch -a

![ブランチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/ebbba9e3-0d86-bbd0-505f-f1d8eaaacd86.png)

✴︎がついているブランチが現在のブランチ


<h1>コミットする</h1>
フォルダやファイルを作成し、クローンした「tool」フォルダに入れたら、以下のコマンドでコミットする。

git add .
git commit -m "任意のコミットメッセージを入力"

<h1>プッシュする</h1>

以下のコマンドでプッシュする
git push origin 1st（ブランチ名）

github（ブラウザ）を確認する。
![プッシュ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/65f93abf-0c65-b796-721f-8022c0144a54.png)
というメッセージが出ていればO K。


<h1>”1st”プランチをPR（プルリクエスト）してマージする</h1>
github（ブラウザ上）で、プッシュされた"1st"ブランチをPR（プルリクエスト）出す（作成する）。
作ったPRをマージする。
（マージすることで"1st"ブランチの状態が"main"ブランチに反映され、"1st"ブランチと"main"ブランチが同じになる。


<h1>”1st”ブランチから"main"ブランチに切り替える</h1>

以下のコマンドでブランチを切り替えるする。

git checkout main　（これでブランチが"main"に切り替わる）
git branch -a　（ブランチが切り替わっているか確認する）
![スクリーンショット 2023-04-06 17.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/fde937e5-3c62-8949-f857-cb755332093b.png)
※この段階ではPCのターミナルで"main"ブランチにしたが、ブラウザのgithub上の"main"ブランチとは異なる。（ブラウザ上のgithubでは"1st"ブランチを"main"に対してPR→マージしている為）
そこで、ブラウザ上でgithubでマージした最新の"main"ブランチをPCに取り入れる。

以下のコマンドで実行する。

ls -la　（今のディレクトリの内容を確認する）
git pull　（プルする。githubの最新の"main"ブランチの状態をPCに反映させる。）
ls -la　（プルする前のディレクトリの状態と見比べるため内容を確認する）
![スクリーンショット 2023-04-06 17.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/17d76137-7233-6f9c-adb0-f101b9daaf79.png)


<h1>ブランチを切る</h1>

以下のコマンドでブランチを切理、作成したブランチになってることを確認する

ブランチを切るコマンド（　”2st”という名前のブランチを作成）
git checkout -b 2st
git branch -a
![スクリーンショット 2023-04-06 18.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/70741700-887f-e8de-fc39-855283faa2d0.png)
Oracleで初心者がつまずきそうな箇所をまとめた

<h1>はじめに</h1>
私自身、文系大学→会社での技術研修（DBはpostgres）<br>
を経たSEということもあり、初心者がつまずきそうな部分をまとめました。

<h1>tnsnames.ora</h1>
　おそらく、oracleにしかない概念<br>
　クライアントを経由して、DB接続する際に<br>
　経由地点としての情報を記載する。<br>
　ネットでドキュメントをあさっても、チンプンカンプン<br>
　研修上がりのoracle初心者にとっては、<br>
　かなり初見殺しに感じると思う。<br><br>

　以下の形で、接続情報が登録される
```
　①mydb =
　　(DESCRIPTION =
　　　(ADDRESS = (PROTOCOL = TCP)(HOST = ②host)(PORT = 1521))
　　　(CONNECT_DATA =
　　　　(SERVER = DEDICATED)
　　　　(SERVICE_NAME = ③XE)
　　　)
　　)
```
　①・・・接続識別子と呼ばれるもの
　sqlplusでも、アプリ側での接続でも、これを指定して接続する。

　②・・・接続先のサーバ名（ipアドレスでも可）

　③・・・DB名
　厳密には、"SERVICE_NAME"で指定する場合と、"SID"で指定する
　パターンがあるが、"SID"は古い書き方らしく、"SERVICE_NAME"で
　目にすることが多い。

　つまり、②（サーバ）内にある③（DB）を①（接続識別子）で指定することで、
　クライアント経由でDB接続することができる。

<h1>スキーマ</h1>
　DBとスキーマの関係は、1対多<br>
　postgresも一つのDB内に複数スキーマを持てるが、<br>
　MySQLとかは、1DBにつき1スキーマみたい<br>
　基本的には、「テーブルを所有するユーザ」みたいなイメージ<br>

　sqlplusでログインする際は、"sqlplus ID/PASS@mydb"
　という形で接続することになるが、"ID","PASS"がそれぞれ
　ログインするスキーマのID、パスになる。

　アプリ側で接続する際は、tnsnames.oraの接続識別子だけでは、
　接続するホストとDB名までしか特定できない。
　なので、大体アプリ側の設定ファイル（iniとかconf）内で
　ログインスキーマのID,パスが記載されている場合が多い。


参考url：https://www.shift-the-oracle.com/oracle-net/tnsnames.html
Seleniumのヘッドレスモードの設定が変更されます

## 元記事

公式記事のざっくり日本語記載です。

https://www.selenium.dev/blog/2023/headless-is-going-away/

## 概要

Chromium ベースのブラウザーには、2 つのヘッドレスモードがあります。
古いモードと新しいモードです。

新しいモードは2022年に追加されたもので、詳細については [公式 Chrome ブログ](https://developer.chrome.com/articles/new-headless/) をご覧ください。

通常、Seleniumでは新しいモードのほうがよりよく動きます。

古いモードは順次非推奨/削除します。

## 新しいヘッドレスモードの指定方法

ブログ内の [How can I set headless mode from now on?](https://www.selenium.dev/blog/2023/headless-is-going-away/#how-can-i-set-headless-mode-from-now-on) 内に各言語の例が書かれています。

Ruby の例を以下に書きます。オプション引数に `'--headless=new'` を渡します。

```ruby
options = Selenium::WebDriver::Options.chrome(args: ['--headless=new'])
driver = Selenium::WebDriver.for :chrome, options: options
driver.get('https://selenium.dev')
driver.quit
```

記事内容は以上です。

## 余談: 使ってみた

[公式 Chrome ブログ](https://developer.chrome.com/articles/new-headless/) を見ると、headlessとheadfullのコードを統一したとある。

新規のスクレイピングスクリプト作成で使ってみたところ、headlessでもheadfullでもたしかに動作が変わらないように見えた。

過去は以下のようにオプションでJSの有効化など試行錯誤していたのを削減できたので、その負担が減りそう。

```ruby
options = Selenium::WebDriver::Options.chrome
# 新しいヘッドレスモード指定
options.add_argument('--headless=new')
# 過去のヘッドレスモード指定
# options.add_argument('--headless')
# options.add_argument("--nogpu")
# options.add_argument('--disable-gpu')
# options.add_argument('--no-sandbox')
# options.add_argument("--enable-javascript")
# window-size はサイトによっては必要そう
# options.add_argument('--window-size=1920,1080')
```
メモ：SQLでユーザごとのコメント投稿回数を取得

以下のテーブル、commentsがあるとする（コメント投稿日時を保持）。

| article_id | user_name | post_date_time |
|:-:|:-:|:-:|
| 11781  |コットン。   |  2010/1/26 14:51 |
|  11785 |  TAMO2 | 2005/1/23 11:58  |
| 11790  |官   | 2005/1/2 11:52  |
| 11796  |  GGGGGG | 2005/1/21 4:09  |
| 11796  | FFFFFF  | 2009/1/10 9:26  |
| 11796  |  FFFFFF | 2010/1/26 0:41  |
| 11771  | CCCCCC  | 2005/1/21 12:56  |
| 11773  | CCCCCC  | 2005/1/21 12:24  |
| 11774  |  CCCCCC | 2005/1/21 12:02  |
| 11776  | CCCCCC  | 2005/1/21 12:37  |
|  11776 | CCCCCC  | 2005/1/21 13:02  |
|  11796 | DDDDDD  | 2010/1/26 8:48  |
| 11796  |  コットン。 | 2010/1/26 15:12  |
| 11797  | AAAAAA  | 2011/1/9 13:13  |
| 11797  | ＫＹ  | 2022/1/20 2:12  |
| 11799  |BBBBBB   | 2019/1/29 16:40  |
|  11799 | EEEEEE  | 2019/1/29 20:33  |

ユーザごとのコメント投稿回数を取得するには以下。

```sql
select user_name, count(*) from comments group by user_name;
```

さらに、コメント投稿回数の降順に取得するなら以下。

```sql
select user_name, count(*) from comments group by user_name order by count desc;
```

| user_name | count |
|:-:|:-:|
|CCCCCC   |5   |
|FFFFFF   | 2  |
| コットン。  |  2 |
| DDDDDD  | 1  |
| GGGGGG  | 1  |
| 官  | 1  |
|  TAMO2 |  1 |
|AAAAAA   |1   |
| BBBBBB  |  1 |
|ＫＹ   | 1  |
| EEEEEE  | 1  |
【個人開発】3日間でChatGPTを使ったAI占いアプリ「占い気分」をリリースした話

## 開発したアプリ
![占い気分 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581885/2d5d85ba-aac7-57cd-d56e-96c4fb990ed5.png)

会員登録不要&完全無料で使えるAI占いアプリです。

https://fortune.suugge.com

## 少し技術のお話

言語: Ruby
フレームワーク: Rails
DB: PostgreSQL
サーバー: Heroku
その他インフラ: AWS(S3)

今回はなるべくスピードを重視して開発したかったので、インフラにはHerokuを使っています。Herokuは無料プランが無くなったので人気が落ちたと思いますが定額で10ドルぐらいなので従量課金の不安感を感じないのはやはり魅力的です。

https://github.com/alexrudall/ruby-openai

Rubyなのでruby-openaiという素晴らしいGemを使おうと思いましたが、なぜかタイムアウトの設定がうまく出来なかったので、RubyのプロジェクトでAPIを叩くなら使われるであろうfaradayを利用しました。

https://github.com/lostisland/faraday

## なぜAI占いアプリを作ろうと思ったか

とにかくChatGPTが話題でOpenAIのAPIを使って個人開発でアプリをリリースしたいなと思ったのが始まりです。
それと占いの市場規模を何となく調べてみた時に「1兆円」もあったのでワクワクしたので作ってみようと思いました。

## ChatGPTはすごいというお話

ChatGPTがどのようにすごいかはここ数日のAIの進化などから知っている人も多くいらっしゃるかと思います。
OpenAIのAPIを活用したアプリ開発ではとにかくデータをあまり用意することなく、アプリケーションを作成することがメリットかなと思っています。

### 具体的に

- 前世動物占い
- 前世職業占い
- 生年月日占い
- 戦国武将占い
- 守護神占い
- 食べ物占い
- 星座占い

今現在、占い気分では上記の7個の占いをご用意しています。占いなどの診断系のアプリケーションは機能的にはそこまで複雑ではなく簡単に作ることができますが、どのようなコンテンツを用意するか？と言う問題が重要かつ難しいです。
間違いなくアプリケーションを実装する時間よりも占い結果を用意する部分が一番大変だと思います。

ただ、生成系AIを活用することでプロンプト(呪文)を用意するだけでボトルネックになる占い結果を生成してくれます。
なので、提供したい占いのタイトルを用意するだけで占い結果はAIに丸投げすることができます。

## AIと開発のお話とまとめ

ChatGPTなど生成系AIの登場でこれまでの開発のやり方はかなり変わるなぁと実感しました。
webアプリで重要になるデータを集めるという面倒な作業を端折ることでとにかく作りたい機能に集中できるのでこれまで以上に高速にアプリケーションを開発できるようになるのでワクワクしています！

https://suugge.com

今回はAI気分というアプリケーションをリリースしたお話を書かせていただきましたが、今月の最初にも「スッゲェ！」というOpenAIのAPIを活用したアプリケーションをリリースしています。
これからもAIを利用したアプリケーションをガンガン開発していこうと思います！！

個人開発のネタなどを呟いていますので、良ければTwitterのフォローもお願いします！！
paizaラーニング問題集「大きな数値を 3 けたごとにカンマ区切りで」Python3編

表示だけならformat文を使えば一発だけど、アルゴリズムの勉強と思って自力で組みました。
これで100点取れました。
（現在のランク：C）

実は正解提出前にお手つき1回してます（50点）。

```Python
# coding: utf-8

def add_comma(s):
  temp = list(reversed(s))
  dgt = []
  for i in range(len(temp)):
    if (i % 3 == 0) and (i != 0):
      dgt.append(",")
    dgt.append(temp[i])
  new_list = list(reversed(dgt))
  result = "".join(new_list)
  return(result)

big_num_str = input()

num_list = list(big_num_str)
new_number = add_comma(num_list)
print(new_number)
```
Android 端末時間を取得して好きなフォーマットに変換する方法

忘れた頃に時間を取得することをしたりするので、忘れても大丈夫なように残しておこうと思います。


```　NowTime.kt
val date = ZonedDateTime.now()
val formatter = DateTimeFormatter.ofPattern("HH:mm:ss")
val nuwTime = date.format(formatter)
```

``"HH:mm:ss"``こちらを自分の取得したいフォーマットにすれば好きな形で取得できます。
検証環境のRDS(Aurora MySQL) から開発環境へdumpする

# 背景

開発環境にはseedでデータを書き込むのが一般的かと思いますが、今回自由研究としてRDSから開発環境にデータを持ってくることをやってみましたw（セキュリティ的によろしくないので、実務ではちゃんとseed使おうね）


CLIだけで頑張ろうとすると、インスタンスへdumpファイルを落とす→scpを使ってローカルへ持ってくる手順が一般的ですかね？そうすると容量問題があったりすると思います。

（当たり前ですが）無理やりlocalパスをつけたところでインスタンス内のディレクトリを探しちゃうので無理っぽいです。。（もしCLIだけでできる方法知ってたら教えてほしいです）
```
$ sudo mysqldump -h XXXXXXX.ap-northeast-1.rds.amazonaws.com -u [username] -p [dbname] --set-gtid-purged=OFF > /Path/to/local
-bash: /Path/to/local: No such file or directory
```


# 手順
## MySQL Workbenchのインストール

今回は`MySQL Workbench` を使って実現しました。

[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)をダウンロードしてインストールしてください。ちなみにお使いのOSのバージョンによっては起動できないのでOSに適正なバージョンのMySQL Workbenchをお使いください。（どのバージョンがいいかはChatGPTに聞くといいと思います。）
※Monterey12.6.3だと、最新は立ち上げられなかったのでv8.0.28にしました。

## RDSへのConnection設定

立ち上げたらConnectionを設定しましょう。
以下の赤枠の「＋」ボタンをクリックします。
![Screen Shot 2023-04-30 at 11.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161057/181dc353-731f-4a8f-9f86-2577cdf3cb95.png)


以下の画面に設定していきます。
まずはRDSへの接続を作っていきましょう。（画像は初期値）
![Screen Shot 2023-04-30 at 11.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161057/2ecca757-ddb9-3bf1-37a1-68cabab019ad.png)

|項目名|値|
|---|---|
|Connection Name|任意の名前でOK|
|Connection Method|Standard TCP/IP over SSH|
|SSH Hostname|EC2とか踏み台サーバーのホスト名（Elastic IP:port）|
|SSH Username|デフォだとec2-user|
|SSH Password|設定されているpassword|
|SSH Key File|pem fileのパス|
|MySQL Hostname|XXXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com|
|MySQL Server Port|3306|
|Username|MySQLのusername|
|Password|MySQLのpassword|

Test Connectionで試してみましょう。
成功すれば「Successfully」って感じのワードが出てきます。
そしたら「OK」をクリックして完了です。

## RDSデータのExport
![Screen Shot 2023-04-30 at 19.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161057/f7775052-84ab-75e3-453f-f6a26c294f5e.png)

作ったConnectionをクリックして、Administrationタブの`Data Export`より、DumpしたいSchemaを選択し、Export先も指定して、右下の`Start Export`をクリックで吐き出されます。


## localのMySQLへのConnection設定

次にローカル（今回はDockerコンテナ）の登録です。（画像は初期値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161057/b0e8f4b7-e393-8c81-0080-760dc21c9ddc.png)

|項目名|値|
|---|---|
|Connection Name|任意の名前でOK|
|Connection Method|Standard TCP/IP|
|Hostname|localhost|
|Port|3306|
|Username|MySQLのusername(docker-compose.ymlとかに書いているはず)|
|Password|MySQLのpassword(docker-compose.ymlとかに書いているはず)|

RDSへの接続と同じようにTest Connectionで試してみましょう。
成功すれば「Successfully」って感じのワードが出てきます。
そしたら「OK」をクリックして完了です。

## localへのImport
![Screen Shot 2023-04-30 at 20.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161057/e6ea432f-2563-22b0-9cc6-6402dbef3a78.png)

Administrationタブの`Data Import/Restore`を開く。
右側の`..`ボタンよりさっきExportしたファイルを選択する。
そうすると勝手にImport対象のSchemaを選択してくれるのでそのあとは`Start Import`をクリックして少し待てば完了！
簡単だね！

# まとめ
基本的にはSeedが用意されていると思うのでこんなことはしなくていいと思うけど、こんな手段もあったので紹介してみました。

いつかどこかでだれかの役に立ったらいいなあ

# 参考記事
- https://repost.aws/ja/knowledge-center/connect-rds-mysql-workbench
- https://dev.classmethod.jp/articles/mysql-workbench-rds/
【Git】git reset --hard HEADで消してしまったコミット時点まで戻る

## はじめに
`git reset --hard HEAD`でコミット地点まで戻った時、そのコミット以降のコミットが全て削除されていて焦りました。
そのため削除してしまったコミット地点まで戻る方法を書き残します。

### 方法

`git reflog`コマンドで全ての変更ログを出力します。
```
$ git reflog

03a4dbb HEAD@{1}: reset: moving to 03a4dbbfd50be3d6ba98f1e652398298f35bc348
03a4dbb HEAD@{2}: reset: moving to 03a4dbbfd50be3d6ba98f1e652398298f35bc348
097ebfb HEAD@{3}: checkout: moving from master to task-title-memory
```
上記のHEAD@{2}でコミットをリセットしています。リセット前まで戻るにはその一つ前の変更地点の識別子でリセットします。
```
$ git reset --hard 097ebfb
```
これで元に戻せました。

## 参考
https://qiita.com/ChaaaBooo/items/459d5417ff4cf815abce
【SwiftUI】searchableがフォーカスされていることを知る

# はじめに
`isSearching`という環境値を取得することでsearchableがフォーカスされているかを判定することができます。
ドキュメントのまんまですが、意外と知られてなさそうなので記録しておきます。

https://developer.apple.com/documentation/swiftui/environmentvalues/issearching#discussion

# 動画
![Simulator Screen Recording - iPhone 14 Pro - 2023-04-30 at 20.19.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ce30e774-33b9-f986-0c1b-e9683bb83e9c.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var searchText = ""
    var body: some View {
        NavigationStack {
            SearchedView()
                .searchable(text: $searchText)
        }
    }
}

struct SearchedView: View {
    @Environment(\.isSearching) private var isSearching

    var body: some View {
        Text(isSearching ? "Searching!" : "Not searching.")
    }
}
```

# おわり
環境値周りは知らないものが多いのでどんどん試して記事に記録していこうと思います。
[AWS Q&A 365][SES]AWSのよくある問題の毎日5選 #44

# 1. Amazon SESはどのようなセキュリティ対策を実施して、ユーザーデータを保護していますか？
回答：Amazon SESは、データの暗号化、ネットワーク分離、アクセス制御、定期的なセキュリティ監査やテストなど、さまざまなセキュリティ対策を実施して、ユーザーデータを保護しています。

# 2. Amazon SESは安全に電子メールを送信するために使用できますか？
回答：はい、Amazon SESはTransport Layer Security（TLS）暗号化を使用して安全な電子メール送信をサポートしており、メールメッセージのプライバシーと整合性を保護するのに役立ちます。

# 3. Amazon SESは、電子メールスパムや乱用を防止するためにどのような手順を講じていますか？
回答：Amazon SESは、電子メールアドレスとドメインの検証、送信者認証、コンテンツフィルタリング、フィードバックループを使用して、電子メールスパムや乱用を防止するためのさまざまな手順を講じています。

# 4. Amazon SESは、電子メールセキュリティの監視と管理のためのツールを提供していますか？
回答：はい、Amazon SESは、評判メトリック、イベントパブリッシング、CloudWatchアラームなどのさまざまなツールを提供して、セキュリティの問題を検出して対応するための監視と管理をサポートしています。

# 5. Amazon SESは、セキュリティインシデントや侵害にどのように対処しますか？
回答：セキュリティインシデントや侵害が発生した場合、Amazon SESは包括的なインシデント対応プロセスを実行し、調査、封じ込め、是正、影響を受けた顧客および規制当局への報告などを行います。
[AWS Q&A 365][SES]Daily Five Common Questions #44

# 1. What security measures does Amazon SES have in place to protect user data? 
Answer: Amazon SES implements various security measures to protect user data, including encryption of data at rest and in transit, network isolation, access controls, and regular security audits and testing. 

# 2. Can Amazon SES be used to send emails securely? 
Answer: Yes, Amazon SES supports secure email sending using Transport Layer Security (TLS) encryption, which helps to protect the privacy and integrity of email messages in transit. 

# 3. What steps does Amazon SES take to prevent email spam and abuse? 
Answer: Amazon SES employs various measures to prevent email spam and abuse, including email address and domain verification, sender authentication, content filtering, and feedback loops to identify and block spam. 

# 4. Does Amazon SES provide any tools for monitoring and managing email security? 
Answer: Yes, Amazon SES provides various tools for monitoring and managing email security, including reputation metrics, event publishing, and CloudWatch alarms for detecting and responding to security issues. 

# 5. How does Amazon SES handle security incidents and breaches? 
Answer: In the event of a security incident or breach, Amazon SES follows a comprehensive incident response process, which includes investigation, containment, remediation, and reporting to affected customers and regulatory authorities.
Mantineの推しUIコンポーネント5選

## Mantineとは

豊富なコンポーネント + Hooksを提供してくれる強力なReact UI Component ライブラリで、
綺麗で、統一感のあるデザインが作れるという特徴があります。

似たようなライブラリとしてChakra UI や MUIといったサービスが挙げられます。
Chakra UI や MUIはなじみのある方が多いのではないでしょうか。

今回は社内でも導入したMantineの便利なUIコンポーネントを **厳選** してお伝えできればと思います。
(Chakra UI や MUIとの比較にもお役立ていただければと・・)



## 1 CopyButton

1つ目はCopyButton
**🍀【推しポイント】とにかく実装が簡単**

https://mantine.dev/core/copy-button/

簡単にコピーボタンができるというのが特徴。
よくあるのが、左側にコピー対象のテキストがあって右側にコピーボタンを配置されている構図。

![スクリーンショット 2023-04-30 123618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952868/520cd284-8485-5cf3-bf4f-6e8942d000d7.png)

こんな感じで配置できます。
もちろん、hooksなどを使ってコピー対象を指定する必要がありますが、かなり便利。

HTMLとJavascriptを組み合わせて作るのが面倒な方におすすめです。

## 2 Modal

2つ目はModal
**🍀【推しポイント】モーダルを開いたときの動きが好き** 

https://mantine.dev/core/modal/

Modalコンポーネントにモーダル用のコンポーネントをラップする。
後はシンプルに、hooks等を使ってモーダルの開閉をおこなうロジックを入れるだけです。
個人的にはモーダルを開いたとき、閉じたときのすんなりと動く感じがお気に入りです！（伝われ）

```react:sample.tsx
    <Modal opened={opened} onClose={close} title="Authentication" centered>
        {/* Modal content */}
      </Modal>
```


## 3 PinInput

3つ目はPinInput
**🍀【推しポイント】タブキー、エンターキー要らずの使用感** 

https://mantine.dev/core/pin-input/

PinInputはPINコード入力を実装時に役立つコンポーネントです。
タブキーやエンターキーを利用者に押させずとも入力させることができるのが良いですね。

あとは、Propsも多く取り揃えており、自由度も比較的高いコンポーネントなのではと思っております。
```react:sample.tsx
 <Group>
   <PinInput />
 </Group>
```

## 4 Notification

4つ目はNotification
**🍀【推しポイント】とても素晴らしい** 

https://mantine.dev/core/notification/

画面の左上や右上あたりによく見かける（？）「ほぞんしました」みたいなあれです。
実装コストが低く、色んなパターンに対応できるのが良いですね。
また、色味やアイコンも自由に変更可能なので、カスタマイズして配置するのがおすすめです。


![スクリーンショット 2023-04-30 194826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952868/882bd6cd-e521-0d02-5e60-ae1d1d90f7d1.png)


## 5 Rating

5つ目はRating
**🍀【推しポイント】UIが一番のお気に入り** 

https://mantine.dev/core/rating/

はじめてみたときに思わず「すんげー」と。
これが一行のコードで簡単に実装できるのは控えめに言ってやばいですね。
MUIでも同様のコンポーネントが存在するのですが、見た目、触ってみる感じMantineの方が好きです。



![スクリーンショット 2023-04-30 195507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952868/79de97f0-b95d-c46d-60d9-d0e108cd5107.png)


```react:sample.tsx
<Rating defaultValue={3} />
```

## おわりに

MantineはこのほかにもたくさんのUIコンポーネントが存在し、全部紹介しきれないので5選とさせていただきました。
また今度、Mantine FormやMantine Hooksとかの紹介もしていければと思います。


では🤞
【pip】 Python3をアップデートしたら詰まった話


# Introduction

GW に突入しましたが、皆様はいかがお過ごしでしょうか？
私は無事 9 連休を勝ち取り、業務で使い込んでいるにもかかわらず意図的に避けてきた`Python`の記事を書こうかなと準備しておりました。
折角なので`Python`もアップデートして臨もうと。
なお業務では`anaconda`、自宅では`pip`で管理しており、業務中は`pip`=腫れ物です。
にもかかわらず大して調べず深夜のノリでやって更新に失敗......解決に苦労しました。
調べても`pip`下での`Python`アップデートはあまり出てこなかったので、手順と対処法を共有します。

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04
Python3.10(アップデート前)
Python3.11(アップデート後)

## 設定ファイルのエクスポート

アップデート後の`Python`にパッケージを一括インストールするために、現在の設定をエクスポートします。
`anaconda`では`環境名.yaml`に書き出すのが一般的という認識ですが、`pip`では`requirements.txt`に書き出します。

```bash:
pip freeze > requirements.txt
```

## Python のアップデート

最新版の`Python`は以下のサイトからダウンロードしました。
非公式とありますが、提供元は`Python Japan`様で安心です。

https://pythonlinks.python.jp/ja/index.html

インストール方法は以下の記事が分かりやすかったです。

https://self-development.info/ubuntu%e3%81%ab%e6%9c%80%e6%96%b0%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%aepython%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b/

記事の通り、アップデート後に`Python`のバージョンが上がっていることを確認します。

```bash:
python3 -V
```

## 設定ファイルのインポート

`requirements.txt`をアップデート後の`Python`にインポートします。

```bash
pip install -r requirements.txt
```

## トラブル発生

確認のため`numpy`等を import してみると、お馴染みのエラーが発生。

```python
ModuleNotFoundError: No module named 'numpy'
```

`Python`のディレクトリがどこにあるかわからなかったので、`pip`インストールしたパッケージの格納先を調べました。
`Location`に出力されます。覚えておくと何かと便利です。

```bash
pip show numpy
```

`Python`のディレクトリを確認。消した筈の`Python3.10`が共存しています。
![Screenshot from 2023-04-30 01-48-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292052/8a55e4f3-e029-403c-59e3-0e3c7122ac64.png)
ちなみに、`pip install`した package は`Python`配下の`site-packages`に格納されますので各ディレクトリ確認しました。
するとインポート結果はすべて`Python3.10`の方に入っていました。
`Python3.10`を消して再度インポートを試すと、消した筈の`Python3.10`が復活します。

## 対処法

`pip`がインストールされている`Python`のバージョンを確認します。

```bash:
pip -V
```

`Python3.10`の方が返ってきました。
ここまでで頓珍漢な試行錯誤を繰り返していたこともあり、パスが`Python3.10`に通っていることは予測できました。
パスを`Python3.11`に通せば正常にインポートできそうなので、`.bashrc`に 1 行追記します。

```bash:~/.bashrc
export PATH=/home/<ユーザーネーム>/.local/lib/python3.11/site-packages:$PATH
```

[設定ファイルのインポート](#設定ファイルのインポート)を再実行すると、無事`Python3.11`にパッケージがインポートされました。
`site-packages`や`Python`ファイルの実行も試し、正常に使用できるようになりました。

## おまけ

余談ですが、最近画像編集フリーソフトの`GIMP`を使う機会が多くありました。
除去しきれなかった背景の除去や加工、合成、座標確認など行えることと操作性のバランスが良く、特に検証レベルでは何かと役に立つのでおすすめします。
(アプリケーションが豊富なので他の選択肢もありそうですが)`Windows`も対応しています。

https://www.gimp.org/

## 最後に

紆余曲折ありながらも無事`Python3.11`にアップデート完了しました。
速度改善など個人的に試したいことが盛り沢山です。
ただアップデートにより、実装に使う予定だった背景除去の`Rembg`がバージョン問題で現状使えなさそうで少し困っています......
業務では`OpenCV`で背景除去スクリプトを書いていますが、工数の割に精度は難ありだったので代替案を検討中です。
元も子もないですが、部分的には`Python`で書いて、スクリプト全体は`Google Colab`で流せるようにするのもありかなと考えています......
最後まで閲覧頂きありがとうございました。
備忘録の側面もありますが、本記事がお役に立てば幸いです！
確実にGazeboを殺す方法

# 概要

ROS/ROS2でGazebo を使っていて、Ctrl + C を押してもうまく終了してくれないときがある

確実にすっきりGazeboを終了させる方法のメモ

# 1. Ctrl + \ で終了させる

Ctrl + C の代わりにターミナル上でコントロールキーとバックスラッシュキーを同時に押してプロセスを終了する
これが最も簡単

# 2. kill コマンドで終了

Gazebo のプロセスである「gzserver」と「gzclient」をkill コマンドで直接終了する

```bash
killall -9 gzserver gzclient
```


# 3. ROS のコマンドで終了

ROS1 のみ

```bash
rosnode kill /gazebo
```
SwiftUIの@Stateについてまとめるべし

# SwiftUIの@Stateについて

### まずは@Stateの要点をまとめます

・@StateはSwiftUIの変数宣言に使用される
・値が更新されるたびに自動的にViewが再描画される機能を提供
・struct内で通常変更できない値を変更できるようになる
・変数にprivateをつけることで、アクセス範囲を限定しセキュリティを向上させる
・再描画が自動で行われるため、UIの更新が容易になる
・@StateはそのViewとその配下のViewにのみアクセス可能
・privateをつけることは、鍵をかけるようなイメージで理解できる
・@Stateを使うことで、データの変更とViewの更新が効率的に行われる

１、変数の宣言:
SwiftUIのView内で、状態を管理したい変数を宣言する際に、@State属性を付けます。また、アクセス範囲を限定するためにprivateを追加することが推奨されます。

例:
```swift
@State private var text = "Hello, world!"
```


２、Viewの構築:
bodyプロパティの中で、状態変数を使用してViewを構築します。状態変数が変更されると、Viewが自動的に再描画されます。

例:
```swift
var body: some View {
    VStack {
        Text(text)
            .padding()
        Button("ボタン") {
            text = "こんにちは、世界"
        }
    }
}
```

ここではボタンをタップするするとtextに「こんにちは」という文字列が入ります。
ユーザー操作やイベントに応じて、状態変数の値を変更します。@Stateが付与された変数は、struct内で変更可能です。値が変更されると、関連するViewが自動的に再描画されます。

この部分ですね。
```swift
Button("ボタン") {
    text = "こんにちは、世界"
}
```

このように、@Stateを使うことで、状態変数の値が変更されると自動的に関連するViewが再描画され、UIの更新が容易になります。また、privateを使ってアクセス範囲を制限することで、コードの安全性も向上します。