OmniAICreator/Qiita-1.07M huggingface dataset:
【Phalcon】別ファイル読み込み


# はじめに
現在携わってるプロジェクトがPhalconで、Phalconを構成するvoltファイルについての備忘録。

# 別ファイルの読み込み（include）
```
{% include 'components/header.volt' %}
{% include 'components/footer.volt' %}
```
M1 Mac DockerでDb2を動かす


# はじめに

M1 Mac Docker で無償版Db2を動かそうとしたところ色々詰まる所があったので、メモ書きをしました。途中までなので元気になったら追記していく予定です。

# Docker imageをpull

https://www.ibm.com/docs/ja/db2/11.5?topic=system-macos

まず適当にフォルダを作ります

```bash
mkdir Docker
cd Docker
```

```bash
docker pull icr.io/db2_community/db2 --platform=linux/amd64
```
数分かかります。
M1 Macのせいでここで躓いた。公式Documentはintel Mac想定なので--platformの指定がなくても動くがM1の場合は`--platform=linux/amd64`がないと、以下のようなエラーが出る。

```
$ docker pull icr.io/db2_community/db2                         
Using default tag: latest
latest: Pulling from db2_community/db2
no matching manifest for linux/arm64/v8 in the manifest list entries
```

# 環境変数ファイル作成

次に環境変数ファイル`.env_list`を作成する

```bash:.env_list
LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=testdb
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=false
REPODB=false
IS_OSXFS=true
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=
```

Docker コンテナ起動

以下のコマンドを入力して実行し、Docker コンテナーを起動します
```bash
docker run -h db2server --name db2server --restart=always --detach --privileged=true -p 50000:50000 --env-file .env_list -v /Users/<username>/Docker:/database --platform=linux/amd64 icr.io/db2_community/db2
```
> ここで、
-h は、 db2server という名前を Docker コンテナーに割り当てます。
-p は、使用するポート番号を指定します。
--privileged は、特権モードでコンテナーを開始します。
-v は、 Db2 Docker イメージに使用されるボリュームを定義しています。

# Db2 インスタンスに入る

以下のコマンドを入力して、 Docker コンテナー内の実行中の Db2 インスタンスにアクセスします
```bash
docker exec -ti db2server bash -c "su – db2inst1"
```

https://www.ibm.com/docs/ja/db2/11.5?topic=macos-testing-your-db2-community-edition-docker-image-installation-systemshttps://www.ibm.com/docs/ja/db2/11.5?topic=macos-testing-your-db2-community-edition-docker-image-installation-systems

# 追記予定

# 参考

こちらの記事はより詳細に説明してくださっています

https://qiita.com/kayokok/items/0d23efeece19c4f31e8b
【Phalcon】voltのIFやFOR


# はじめに
現在携わってるプロジェクトがPhalconで、Phalconを構成するvoltファイルで使うIFやFORについての備忘録。

# if文
```
{% if fruit === 'monday' %}
    <p>月曜日</p>
{% endif %}
```
# for文
```
{% for key, date in dates %}
    <p>{{ key }}：{{ date }}</p>
{% endfor %}
```
Macbookでの操作取消ショートカット

# Macbookでの操作取消ショートカット
備忘録です。
windowsでコピー&ペーストした後に操作を取り消したい場合、`ctl + y` で実現できます。しかし、macOSの場合異なる操作が割り当てられています。
→macの操作取り消しは`ctl + shift + z`です。このショートカットキーにより操作を取り消すことが可能です。

https://support.apple.com/ja-jp/HT201236#:~:text=command%20%2B%20Y%EF%BC%9A%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%83%AB%E3%83%83%E3%82%AF%E3%82%92,%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
WindowsでもUS配列のHHKBをmac風に使いたい

# 対象読者
- HHKB(US配列)ユーザー
- 普段はmacをメインで使っていてwindows機を使い始めた

# windowsで実現したいこと
1. 「スペースキーの左右のボタン」で「英数・かな」を切り替え
2. Emacsキーバインドのカーソル移動
3. コピペをmacと同じ運指で実行（たとえばコピーなら「スペースキーの左隣のボタン」＋Cで実行）

# 手順
## 1. 「スペースキーの左右のボタン」で「英数・かな」を切り替え
[alt-ime-ahk](https://github.com/karakaram/alt-ime-ahk) を使用
## 2.Emacsキーバインド、mac風コピペ運指の実現
1. HHKBのDIPスイッチを使ってスペースキーの左右をAltにする（オススメはDIPスイッチ1,3,5をonにして2,4,6はoff）
1. [AutoHotkeyのDLページ](https://www.autohotkey.com/download/) からv2のzip版を落として解凍する
1. 2.で解凍したフォルダ内に下記のようなahkファイルを作成（便宜上 `sample.ahk` とする）してAutoHotKeyを使って実行する（`sample.ahk` をダブルクリックして実行するプログラムとして `AutoHotkey64.exe` を指定する）
1. `alt-ime-ahk.exe` と `sample.ahk` をスタートアップに登録する
``` sample.ahk
; Emacsキーバインドカーソル移動
^b::Left
^n::Down
^p::Up
^f::Right
^a::Home
^e::End

; Altキー押下でCtrlキーが押下されたように設定
!c::Send "^c"
!v::Send "^v"
!f::Send "^f"
!a::Send "^a"
!z::Send "^z"

; おまけ。カタカナ変換
^k::F7
```

# 解説
`alt-ime-ahk.exe` と `sample.ahk` の２つを常駐させることになるので見た目は悪いのですがこのやり方が早いと思います
サービスデスクとは

# サービスデスク
**サービスデスクとは、システムの不具合や、技術サポートなどユーザーの問い合わせに対応する窓口のこと**

社内で検知されたアラートへの対応や新しいサービスの情報発信など幅広い業務を担う場合が多い。インシデントの発生からクローズまでの責任を負う。

|名称      |特徴|
|:-----------------|:------------------
|ローカルサービスデスク|ユーザーと同じ、もしくは近い場所(地理的に)にサービスデスクを設ける。
|中央サービスデスク|担当者を同じ場所(地理的)に集めてサービスデスクを設ける。
|バーチャルサービスデスク|担当者は各地に点在しているものの擬似的に同一の組織としてサービスデスク機能を提供。
|フォロー・ザ・サン|時差のある異なる国にサービスデスクの拠点を持ち、24時間365日対応可能。

# ヘルプデスク
製品やサービスの使用方法や故障などについてお客様を助けるトラブルシューティングの役割を担う。

https://www.manageengine.jp/products/ServiceDesk_Plus/service_desk.html
https://www.ashisuto.co.jp/enishi/service_management/service-desk.html
『アイヌの建築と工芸の世界』のuwerankarap

国立近現代建築資料館に『[アイヌの建築と工芸の世界](https://nama.bunka.go.jp/news/20240221/)』を見に来たのだが、カタカナの「ウウェランカラㇷ゚」にローマ字の「uwerankarap」が並記されていたので、文字起こししてみた。

![アイヌの建築と工芸の世界](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/6abec2e3-ddb3-7212-b658-17bb02679ae4.jpeg)

> # ウウェランカラㇷ゚
> イランカラㇷ゚テ
> タン イコㇿ トゥンプ オルン エチアㇻキ ワ チェヤイコプンテㇰ。 イヤイライケレ。
> アヌココㇿ アイヌ イコロマケンル プンカㇻ協働展示『アイヌの建築と工芸の世界 ―チセ、マキリ、アットゥシ―』 セコㇿ チレコ ワ オロ タ エチエカノㇰ。 タネ 国立近現代建築資料館 オッタ アイヌプリ ピㇼカノ エチヌカレ エアㇱカイ。 ホシキノ、 国立近現代建築資料館 ソンノ チコヤイライケ ナ。
> タン トゥンプ オッタ テエタ チセ ノカ ネ ヤ アエヤイラメコテㇷ゚ ネ ヤ イノミ オッタ アエイワンケㇷ゚ ネ ヤ チクニ アニ アカㇻ ウサ オカ イコㇿ チウォエロㇱキ ワ エチヌカレ ルウェ ネ。 ヤウンモシㇼ タ ヘトゥㇰパ ワ アエイワンケ チクニ カ キナ カ エチヌカレ。
> テエタ ワノ チクニ アニ アカㇻ ウサ オカイ ペ アエイワンケ コㇿ オカアン ルウェ ネ。 チセ アナㇰネ オロ タ ヘトゥㇰパアン カ キ オカアン カ キ ネㇷ゚キアン カ キ カムイコイタㇰアン カ キ ウㇱケ ネ ルウェ ネ。 テエタ アイヌ ウタㇻ チセニ アニ チセ カㇻ。 マキリ アニ アイヌ ニ ケウレ ワ ヌイェ ワ イタ ネ ヤ イタンキ ネ ヤ ペラ ネ ヤ アエヤイラメコテㇷ゚ カㇻ ルウェ ネ。 イナウ ネ ヤ イクパスイ ネ ヤ イノミ オッタ アエイワンケㇷ゚ ネ ヤ チクニ アニ アイヌ カㇻ。 ウサ アッ ウサ ニペㇱ アニ アットゥㇱ アミㇷ゚ カㇻ。 チクニ アナㇰネ ラマッ コㇿ ペ ネ ワ カムイ ネ。 ネ ワ アン チクニ アニ アカㇻ ペ アエイワンケ ワ カムイ トゥラノ タネ ネ ヤッカ オカアン ルウェ ネ。
> タン プンカㇻ協働展示 オッタ アナㇰネ ヤウンモシㇼ ウン レ 博物館 トゥラノ アヌココㇿ アイヌ イコロマケンル ウタㇱパノ ウウォウペカレ ワ ウサ オカ アイヌ イコㇿ ウウェカㇻパレ ワ エチヌカレ。 ネ ワ アン 展示 アニ アイヌ プリ イランマカカ エチエラムオカ ワ ウンコレ ヤㇰ ピㇼカ ナンコㇿ。
> イヨッタ イヨㇱノ、 エウカスイ ウタㇻ オピッタ、 ソンノ チコヤイライケ ハウェ ネ ナ。
> 2024パ 3チュプ 1ト
> アヌココㇿ アイヌ イコロマケンル
> サパネクㇽ
> エトゥナンカㇻ
> # uwerankarap
> irankarapte.
> tan ikor tunpu or un eci=arki wa c=eyaykopuntek. iyayraykere.
> an=ukokor aynu ikor oma kenru ‘a cooperative exhibition by the National Ainu Museum's _Punkar_ network, _The World of Ainu Architecture and Crafts ― cise, makiri, attus,_’ sekor ci=reko wa oro ta eci=ekanok. tane ‘National Archives of Modern Architecture’ or ta aynu puri pirkano eci=nukare easkay. hoskino, ‘National Archives of Modern Architecture’ sonno ci=koyayrayke na.
> tan tunpu or ta teeta cise noka ne ya a=eyayramekotep ne ya inomi or ta a=eywankep ne ya cikuni ani a=kar usa oka ikor ci=woeroski wa eci=nukare ruwe ne. yaunmosir ta hetukpa wa a=eywanke cikuni ka kina ka eci=nukare.
> teeta wano cikuni ani a=kar usa okay pe a=eywanke kor oka=an ruwe ne. cise anakne oro ta hetukpa=an ka ki, oka=an ka ki, nepki=an ka ki kamuykoytak=an ka ki uske ne ruwe ne. teeta aynu utar ciseni ani cise kar. makiri ani aynu ni kewre wa nuye wa ita ne ya itanki ne ya pera ne ya a=eyayramekotep kar ruwe ne. inaw ne ya ikupasuy ne ya inomi or ta a=eywankep ne ya cikuni ani aynu kar. usa at usa nipes ani attus amip kar. cikuni anakne ramat kor pe ne wa kamuy ne. ne wa an cikuni ani a=kar pe a=eywanke wa kamuy turano tane ne yakka oka=an ruwe ne.
> tan ‘cooperative exhibition’ or ta anakne yaunmosir un re ‘museum’ turano an=ukokor aynu ikor oma kenru utaspano uwowpekare wa usa oka aynu ikor uwekarpare wa eci=nukare. ne wa an ‘exhibition’ ani aynu puri irammakaka eci=eramuoka wa un=kore yak pirka nankor.
> iyotta iyosno, eukasuy utar opitta, sonno ci=koyayrayke hawe ne na.
> 2024 pa 3 cup 1 to
> an=ukokor aynu ikor oma kenru sapanekur
> etunankar

私(安岡孝一)の語彙力が足りないせいか、「チウォエロㇱキ」(ci=woeroski)という単語がピンとこなかった。「重ね合わせる」に近い響きなのだが、どうも釈然としない。もうちょっと調べてみないとダメかなぁ。
【Laravel入門】レイアウト


# Laravelのレイアウト
Laravelでは**レイアウト**という機能があります。
レイアウトは**ディレクティブ**を使用して作成します。

# ディレクティブとは
ディレクティブはBladeで使用することができる、＠から始まる範囲内で特定の処理を実行することができる記述方法です。
 

## レイアウトファイルを作成する

親であるレイアウトファイルでは、子テンプレートファイルで定義した情報を出力することができます。

```php:views\layouts\layout.blade.app
<!DOCTYPE html>
<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>

        @yield('main')

        @section('list')
        <h2>リスト</h2>
        @show
    </body>
</html>
```

### ＠yield
レイアウトの＠yieldはテンプレートの＠sectionをはめ込んで表示するためのディレクティブです。

```
@yield('title')
```

### @section

```
@section('main')
```

## テンプレートファイルを作成する（子）

```php:\views\sample\index.blade.app

@extends('layouts.main')

@section('title','HOGEHOGE')

@section('main')
ここに追加します。
@endsection

@section('list')
  @parent
  <ul>
    <li>リスト1</li>
    <li>リスト2</li>
  </ul>
@endsection
```

### ＠extends
テンプレートにレイアウトを読み込むディレクティブです。
@extends('★')の★に参照したいレイアウトを指定します。

```
@extends('layouts.main')
```

### ＠section

```
@section('main')
ここに追加します。
@endsection
```
【CSS】共通レイアウトのCSS化


# 共通パーツのCSSが一緒になっていた
現在進行しているプロジェクトで、ヘッダーやフッターなどの共通パーツを各ページ用のCSSで読み込んで使っていた。

例えば下記のような3Pがあったとする。
（）内はそれぞれのページで使用するCSS。
・トップページ（top.css）
・ABOUTページ（about.css）
・CONTACTページ（contact.css）

この各ページのCSSの中に共通パーツのスタイルが入っている。
これだとヘッダーを変える度に各ページのCSSをアップしなければならない。

FTPなどで一括でドラッグするだけでよいのだが、gitで管理している場合、ヘッダーを変えているだけなのに各ページのCSSに変更が走ることになる。

なので、共通パーツはcommon.cssに切り出した。
これでヘッダー修正したらcommon.cssだけアップすればよい。

少し作業が楽になった。
【SwiftUI】Button長押しを検知してButton自身の表示を切り替える

## 作ったもの

長押ししたときにボタンの表示を切り替えたいみたいなことがあった時のメモ
今回は以下のようなものを作る手順を紹介します

![画面収録-2024-03-13-22.03.21.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679599/a740314a-855f-31cd-a65a-82b87754fc70.gif)

通常時は😌&背景が緑、
長押し中は🤢&背景が赤になるようなボタンです

## やり方

下記みたいなButtonがあったとします

```Swift

struct SampleButton: View {
    @State var isPressed: Bool = false
    
    let buttonSize: CGFloat = 76
    
    var body: some View {
        Button {
            // 処理
        } label: {
            ZStack {
                Circle()
                    .frame(width: buttonSize)
                    .foregroundColor(isPressed ? .red : .green)
                    .opacity(0.3)
                Circle()
                    .frame(width: buttonSize - 5)
                    .foregroundColor(.Background)
                Circle()
                    .frame(width: buttonSize - 10)
                    .foregroundColor(isPressed ? .red : .green)
                    .opacity(0.3)
                Text(isPressed ? "🤢" : "😌")
                    .font(.system(size: 26, weight: .light))
                    .foregroundColor(.white)
            }
        }
    }
}
```

見え方はこんな感じです

![画面収録-2024-03-13-22.02.38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679599/f933988d-f46a-a8aa-a81b-3f4016e62814.gif)

長押し中のopacityがボタン全体に重なる上に、Stateを更新する処理を書いていないので当然ですが見た目も変更できていないです。
isPressedはButtonStyleで取得できますが、SampleButton側でも検知できるようにします。

### ButtonStyleを作る

前述の通りSampleButtonのisPressedをButtonStyleに渡して長押しを検知できるようにします。

`configuration.label`はViewプロトコルに準拠した構造体なので、`configuration.isPressed`の変化を検知し、バインドした値を変更するように実装します。

```Swift
private struct SampleButtonStyle: ButtonStyle {
    @Binding var isPressed: Bool
    
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label.onChange(of: configuration.isPressed) { _isPressed in
            isPressed = _isPressed
        }
    }
}
```

### SampleButton側の変更

SampleButtonに先ほどのSampleButtonStyleを適用します。

完成したViewコンポーネントの全体は以下のようになります。
これで、最初に紹介したようにisPressedで長押しを検知して表示を切り替えることが可能になります。

```Swift
struct SampleButton: View {
    @State var isPressed: Bool = false

    let buttonSize: CGFloat = 76

    var body: some View {
        Button {
            // 処理
        } label: {
            ZStack {
                Circle()
                    .frame(width: buttonSize)
                    .foregroundColor(isPressed ? .red : .green)
                    .opacity(0.3)
                Circle()
                    .frame(width: buttonSize - 5)
                    .foregroundColor(.Background)
                Circle()
                    .frame(width: buttonSize - 10)
                    .foregroundColor(isPressed ? .red : .green)
                    .opacity(0.3)
                Text(isPressed ? "🤢" : "😌")
                    .font(.system(size: 26, weight: .light))
                    .foregroundColor(.white)
            }
        }
        .buttonStyle(SampleButtonStyle(isPressed: $isPressed))
    }
}
```
TYTANのサンプルを動かす

## 話題のTYTAN

https://github.com/tytansdk/tytan/

※この記事ではGPUは使いません

### [サンプル1](https://github.com/tytansdk/tytan/?tab=readme-ov-file#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%91)


`サンプルコード１`を`sample1.py`に保存して・・・

```bash
~/tytan$ python3 sample1.py
[{'x': 0, 'y': 1, 'z': 1}, -4.0, 22]
[{'x': 1, 'y': 0, 'z': 1}, -4.0, 25]
[{'x': 1, 'y': 1, 'z': 0}, -4.0, 53]
```

問題なし。

次に、`サンプルコード2`を`sample2.py`に保存して・・・

### [サンプル2](ttps://github.com/tytansdk/tytan/tree/main?tab=readme-ov-file#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%92)

```bash
/tytan$ python3 sample2.py
Traceback (most recent call last):
  File "/home/syasuda/tytan/sample2.py", line 6, in <module>
    q = symbols_list([3, 3])
TypeError: symbols_list() missing 1 required positional argument: 'format_txt'
```

`symbols_list()`のシグニチャが変わっているのに、サンプルが追従していないだけのことで。

![alt text](https://raw.githubusercontent.com/syasuder/qiita_note/main/tytan/image.png)

というか、Copilotが（良い意味で）適当に埋めてくれる程度の問題のようです。

![alt text](https://raw.githubusercontent.com/syasuder/qiita_note/main/tytan/image-3.png)

~~修正すると、あっさり動きます。~~

まだエラーが出ます。（出るようになっています。）

```python
syasuda@DESKTOP-ADBQ9TJ:~/tytan$ python3 sample2.py
Traceback (most recent call last):
  File "/home/syasuda/tytan/sample2.py", line 6, in <module>
    q = symbols_list([3, 3], 'q{}{}')
  File "/home/syasuda/.local/lib/python3.10/site-packages/tytan/symbol.py", line 32, in symbols_list
    raise TytanException("separate {} in format_txt like format_txt=\'q{}_{}\'")
tytan.symbol.TytanException: separate {} in format_txt like format_txt='q{}_{}'
```

必要な修正は以下です。

```diff
- q = symbols_list([3, 3], 'q{}{}')
+ q = symbols_list([3, 3], 'q{}_{}')
```

![alt text](https://raw.githubusercontent.com/syasuder/qiita_note/main/tytan/image-2.png)

```python
~/tytan$ python3 sample2.py
[[q0_0 q0_1 q0_2]
 [q1_0 q1_1 q1_2]
 [q2_0 q2_1 q2_2]]
result
[{'q0_0': 0, 'q0_1': 0, 'q0_2': 1, 'q1_0': 0, 'q1_1': 1, 'q1_2': 0, 'q2_0': 1, 'q2_1': 0, 'q2_2': 0}, -6.0, 12]
[{'q0_0': 0, 'q0_1': 0, 'q0_2': 1, 'q1_0': 1, 'q1_1': 0, 'q1_2': 0, 'q2_0': 0, 'q2_1': 1, 'q2_2': 0}, -6.0, 16]
[{'q0_0': 0, 'q0_1': 1, 'q0_2': 0, 'q1_0': 0, 'q1_1': 0, 'q1_2': 1, 'q2_0': 1, 'q2_1': 0, 'q2_2': 0}, -6.0, 18]
[{'q0_0': 0, 'q0_1': 1, 'q0_2': 0, 'q1_0': 1, 'q1_1': 0, 'q1_2': 0, 'q2_0': 0, 'q2_1': 0, 'q2_2': 1}, -6.0, 27]
[{'q0_0': 1, 'q0_1': 0, 'q0_2': 0, 'q1_0': 0, 'q1_1': 0, 'q1_2': 1, 'q2_0': 0, 'q2_1': 1, 'q2_2': 0}, -6.0, 12]
[{'q0_0': 1, 'q0_1': 0, 'q0_2': 0, 'q1_0': 0, 'q1_1': 1, 'q1_2': 0, 'q2_0': 0, 'q2_1': 0, 'q2_2': 1}, -6.0, 15]
get_ndarray
[[0 0 1]
 [0 1 0]
 [1 0 0]]
[['0', '1', '2'], ['0', '1', '2']]
get_dframe
   0  1  2
0  0  0  1
1  0  1  0
2  1  0  0
get_image
```

だれかfolkしてprを投げてください。（定型文）

## 追記

ドキュメントには、`symbol_list()`の第2引数が省略できない旨の記述がありました。
https://github.com/tytansdk/tytan/blob/main/document%20.md?plain=1#L37

```
文字シンボルを配列に定義する場合、次のようにndarray配列を得ます。
第2引数は省略できません！（2024/02/18修正より）
```

ただ、[チュートリアル](https://github.com/tytansdk/tytan_tutorial?tab=readme-ov-file)を上からたどると、サンプル２が先に来てしまうんですよね。

```
TYTANの基本的な使い方はこちら → TYTANトップページ ★ここにサンプル2がある
TYTANの本格的な使い方はこちら → TYTANドキュメント ★ここに注意書きがある
・・・
```
URDFを定数倍スケールするPythnonコード

URDFを定数倍拡大・縮小するコードを書きました。box,radisu,sphereの寸法や各種jointのxyzを線形倍、質量を3乗倍、慣性モーメントを5乗倍します。Pythonの標準ライブラリであるElementTreeを使っています。

```python
import xml.etree.ElementTree as ET
##ここにサイズ比を書く
mag_rate = 10
##ここに入力ファイル名を書く
input_file = "input.urdf"
##ここに出力ファイル名を書く
output_file = "output.urdf"


#サイズ比の1乗だけ大きくなる要素
elems_and_keys_linear = {"origin":["xyz"],
                         "cylinder":["length","radius"],
                         "box":["size"],
                         "sphere":["radius"]
                         "mesh":["scale"]
                         }
#サイズ比の3乗大きくなる要素
elems_and_keys_cubic = {"mass":["value"]}
#サイズ比の5乗大きくなる要素
elems_and_keys_5pow ={"inertia":["ixx","ixy","ixz","iyy","iyz","izz"]}

tree = ET.parse(input_file)
root = tree.getroot()


# まずは線形要素
for k in elems_and_keys_linear.keys():
    for el in root.findall(".//{}".format(k)):
        for op in elems_and_keys_linear[k]:
            vals = map(float,el.get(op).split())
            el.set(op," ".join([str(val*mag_rate) for val in vals]))

#3乗要素
for k in elems_and_keys_cubic.keys():
    for el in root.findall(".//{}".format(k)):
        for op in elems_and_keys_cubic[k]:
            vals = map(float,el.get(op).split())
            el.set(op," ".join([str(val*(mag_rate**3)) for val in vals]))

#5乗要素
for k in elems_and_keys_5pow.keys():
    for el in root.findall(".//{}".format(k)):
        for op in elems_and_keys_5pow[k]:
            vals = map(float,el.get(op).split())
            el.set(op," ".join([str(val*(mag_rate**5)) for val in vals]))

newtree = ET.ElementTree(root)
newtree.write(output_file)

```
ITILで見るインシデント管理

# はじめに
マネジメントを勉強していく中でプロジェクト中に起こりえるインシデントについてメモとして残します。

# インシデント管理について

## インシデントの認識と本来のインシデント

今までの認識。

インシデント＝プロジェクトにおける機能のバグであったり何らかの不具合という認識でした。

今の認識。

ですが実際のところ、「インシデント」は出来事、事件、事例、事案、事象、出来事といった意味になります。
ここでの事件や出来事の例を挙げると、情報漏洩やシステムにログインできないといったことになります。

インシデントをインシデント管理として管理することで、利用者に対する正常なITサービスの妨げになる事象に対応して、サービス利用を続行できるようにします。

## インシデント管理の流れ

### 1. インシデントの発生(検出)

サービス利用者(ユーザー)からの問い合わせや、管理システムからのアラートを受けて、窓口担当者やアラートの管理者が受付(発生日時や状況の記録)を行います。

### 2.インシデントの分類・優先度の設定

記録したインシデントを分類し、対応の優先順位を決定します。、内容や影響範囲に応じて緊急度や優先度を設定します。それらの要素を踏まえ、適切な担当者に振り分けを行います。

### 3.インシデントの解消

担当者は、自社に蓄積された過去のインシデント事例を参照しながら解決に向けた対応策を決定します。対応に高度な知識が必要であれば、上司や責任者に相談や指示を仰ぐ「エスカレーション」を行います。エスカレーションにより上司や責任者がインシデントの解決にあたります。

### 4.インシデントの回答

インシデント解消の際には、インシデント発生時からの経過時間、調査状況、報告のタイミングなどの進捗を管理することが重要です。
インシデントが解消された後、問い合わせユーザーに回答します。

### 5.インシデントの解決とクローズ

インシデントが解決されたら、関係者に速やかに報告・周知します。
場合によっては解決後のユーザーフォローや経過の確認なども必要。 インシデントの再発や対応する必要がなくなればクローズとなり、自社のナレッジベース(※1)に記録します。

※1 ナレッジベース：「業務に関する知見」を一箇所にまとめたデータベースのこと。
有益な知識やノウハウが集約されたもの。


## まとめ

インシデント管理は、ビジネスへの影響を最小限に抑えるために、可能な限り迅速にサービスを復旧するための一連の活動のことという内容でした。
【随時更新】記事アイデア

## アイデア一覧
- push時（orマージリクエスト時）にapiを使用してQiitaに投稿する
- マイクロサービスまとめ
    - モノリスを分割するには２つの視点で考える
        - 技術的分割
        - ドメイン分割
- git
- docker
- ネットワーク（ローカル、リモート）
- tls
- vpn
- ssh
- http
    - status code
    - header 
    - MIME
    - MTU
    - chunk
- python
    - pytest
    - mock
    - moto
    - decorator
    - closure
    - context maneger
- linuxコマンド
- aws
    - dop
    - security
    - network
    - lambda
        - 冪等性
        - 非同期
    - dynamodb
    - sqs
    - apigateway
- vscode
- neovim
- wsl
-
githubにpushしたファイルを（リモートから）削除したい

# はじめに
Githubに`push`したが，開発を進めるにつれて，何らかの理由により一部のファイルをGithubで管理しないようにしたくなることが良くあります．（個人開発で，場当たり的に進めているのが悪いのですが……）
その度に検索して，自らの状況に当てはまる対処法を模索していたので，いい加減にメモ書き的な記事を書くことにしました．

# 状況
今回考える状況は次のとおりです．

- 追跡から除外したいファイルを`commit`してから，いくつか進んでいる
- 追跡から除外したいファイルを`add`&`commit`した履歴は`push`済み
- 対象のファイルは削除しない
- （ファイルを追跡から除外したことを履歴に残しておきたい）


# 対処
以上の前提における操作手順を順に示していきます．

## Step 1. `.gitignore`の記述（作成）
`.gitignore`ファイルを作成しておきます．これを忘れると，せっかく後の操作をしても再び追跡されてしまいます．

```gitignore: .gitignore
/path/to/tracked_file
```

## Step 2. `git rm`の実行
`.gitignore`だけでは既に追跡されているファイルは除外されません．既に追跡されているファイルをその追跡から除外するために`git rm`を実行します．

```bash: git_rm
~$ git rm --cached /path/to/tracked_file         # 特定のファイルの追跡を除外
~$ git rm -r --cached /path/to/tracked_folder    # 特定のフォルダの追跡を除外
```

:::note alert
`--chached`を忘れると指定したファイルが物理的に削除されてしまいます．万が一，削除してしまっても`git branch`で一応戻せますが，注意して操作するようにしてください．
:::


## Step 3. `git add` & `git commit` & `git push`
これ以前の変更をリモートリポジトリに反映します．

```bash: git_add_commit
~$ git add .
~$ git commit -m "message"
~$ git push
```


# 最後に
大した操作では無いので，価値があるかどうかが怪しいですが，どなたかの助けになれば幸いです．
ターミナルでコマンドを入力中に改行してしまい、プロンプトが > になる現象の対処法

# はじめに
ターミナルでコマンドを入力中に改行してしまい、プロンプトが > になる現象は、シェルが引用符（" や '）や括弧（(, {, [ など）のペアが完了していない、またはコマンドが完了していないと解釈して、入力の続きを求めている状態です。

この状態から抜け出すには、いくつかの方法があります。

# 方法1: 入力を完了させる
引用符や括弧の入力が未完了の場合は、閉じる引用符や括弧を入力してからエンターキーを押します。

コマンドの入力が途中であれば、コマンドを完了させるか、適切にキャンセルできる文字（例えばセミコロン ; など）を入力してエンターキーを押します。

# 方法2: キャンセルして抜け出す
Ctrl + C を押して、現在の入力をキャンセルして通常のプロンプトに戻ります。

この方法が最も簡単で、多くの場合に役立ちます。

# 方法3: エスケープシーケンスの利用
一部のシェルでは、エスケープシーケンス（例：Ctrl + D）を使って、入力を終了させることができます。

これは入力の終了（EOF）を示し、シェルが待機している入力モードを終了させることができます。

# おわりに
大抵の場合、方法2の Ctrl + C でプロンプトが通常状態に戻ります。

これは現在の入力を中断して新たにコマンド入力ができる状態にリセットするための一般的な方法です。
base64でエンコードした画像をデコードした後にlaravel上で正しいMIMEを取得する方法

# 遭遇した事象
クライアントからサーバーに画像ファイルをアップロードするAPIで、クライアントで画像ファイルをbase64にエンコードしてAPIのリクエストとして送信する処理がある
```javascript
const reader = new FileReader();

reader.onload = (e) => {
    let base64 = e.target.result;
    const requestBody = {
        file: base64,
    }

    axios.post("/api/upload", requestBody, {
        headers: {
            "Content-Type": "application/json",
        },
    })
    .then((res) => {
        // 事後処理
    }
}
```
これを受けてバックエンド（laravelで構築）では下記のデコード後にMIMEを調べて画像じゃなかったらエラーを返すという処理をしている
```php
$file = base64_decode($request->file);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_buffer($finfo,$file);

if(strpos($mime,'image/') !== false){
    // ファイルを保存する
}
else{
    // エラー処理
}
```
ところが実際に動かして画像ファイルをアップロードすると、画像と判定されないエラーが出てアップロードができなかった。

# 調査と推測
実際にMIMEがバックエンドでどうなっているのかを調べてみたところ、「application/octet-stream」になっていることがわかった。
また、バックエンドの単体テストでは正しく判定できていため、クライアントサイドに問題があるのではと考えた・

そこで、クライアント側でbase64エンコードした内容をチェックすると、
```
data:image/png;base64,iVBORw0KG・・・
```
となっていたが、バックエンドの単体テストで使ったbase64の文字列を確認すると、
```
iVBORw0KG・・・
```
と、「data:image/png;base64,」の部分が無かった。

# 対処
上記の事から「data:image/png;base64,」を消して送ればいいだろう、ということでクライアント側のコードを下記のように修正した。
```javascript
const reader = new FileReader();

reader.onload = (e) => {
    let base64 = e.target.result;

    // base64,の次の文字から取得して、それ以前を削除した
    const base64Index = base64.indexOf("base64,");
    if (base64Index !== -1) {
        // 「base64,」までで７文字なのでそれ以降を取得する
        base64 = base64.substring(base64Index + 7);
    }
    
    const requestBody = {
        file: base64,
    }

    axios.post("/api/upload", requestBody, {
        headers: {
            "Content-Type": "application/json",
        },
    })
    .then((res) => {
        // 事後処理
    }
}
```
これによって無事にMIMEを判定してアップロードをすることができた。

# 補足
base64エンコードにおいて「data:image/png;base64,」の部分はエンコードされたバイナリデータそのものではなく、エンコードされたバイナリデータのメタ情報を表すものなのでそれを含めてデコードを行い、MIMEを取得すると正しく取得できないことがある、というのが原因のようだった。

今回はクライアンド側でメタ情報を消して送信しているが、サーバサイド側で処理後にエンコードするということもできる。
```php
<?php

// 例として、$request->fileにBase64エンコードされたデータが含まれているとします
$encodedFile = $request->file;

// プレフィックスを除去する
// preg_replaceを使用して、data:image/png;base64, などのプレフィックス部分を空文字に置き換えます
$base64Data = preg_replace('#^data:image/\w+;base64,#i', '', $encodedFile);

// Base64デコードを行う
$decodedFile = base64_decode($base64Data);

// MIMEタイプを調べる
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_buffer($finfo, $decodedFile);
finfo_close($finfo);

// MIMEタイプが画像かどうかをチェック
if (strpos($mime, 'image/') === 0) {
    // ファイルを保存する
} else {
    // エラー処理
}

```
power automate desktopでデスクトップアプリを操作する方法

<h1>経緯</h1>
<div>
これまでRPAツールとしてWinActor、UIPathのみを使ったがあった。
現状はどうなっているかまでは終えていないが、WinActor、UIPathでアプリのUI操作をしようとすると精度のあまり高くない画像認識で要素を探したり、座標で指定したりとあまり安定性の高くない操作方法のみであった。
</div>
<div>
数年前にPower automate desktop（以下Pad）が無料で使用できることは知って触れる機会がこれまでなかったが、今回案件の都合上RPAを交えて自動化する必要があったため、Padを使ってデスクトップアプリの自動化を図った。
</div>

<h1>伝えたいポイント</h1>
<h2>PadにおけるUI操作</h2>
Padではデスクトップで起動しているアプリケーションの要素を構造化して、ブラウザのDOMのように指定して取得することができる。
「UI要素を指定」という操作で、画面上で要素を選択することができ構造的に指定しているため、精度が高い。
<h2>注意点</h2>
「UI要素を指定」で取得できる構造は、htmlのdomと同じく重複する可能性があり、UI要素のみで指定できない場合はkey操作や、別の方法が必要である。
SIerのトンチキスクラムについて (5)

# まだだまだ終わらんよ

ここでスクラムに介入したいなぞのひとたちの視点に立ってみよう。
これがわかってないと単なる喧嘩になるのが明白で・・争いは避けるべし。

* スクラムとは不確定な中の最善解を探すアジャイル的なアプローチで執行者としてのチームが**自律すること**を手段とする
* ウォーターフォールとは物事を全て計画し順序どおりに物事を進める、そのために**全てを管理する**

私は若干アジャイル寄りだけど、どちらの信者でもないからプロジェクトの置かれた状況や要件、不確定さによってどちらを採用するか決めればいいと思う。

船や原子炉作るのにアジャイルは要らんだろうし、半年後どうなってるかもわからん中小SaaSにはアジャイル的なアプローチが適切だってことぐらいは理解している。

この場合来月どうなってるかもわからんプロジェクトで、更に全てを決めきることを最初から放棄しているという背景があり、したがって全て計画することが不可能であることがわかっている。
そのためアジャイルを採用し、更にその推進剤としてスクラムを採用した。

さて、上記の前提がまったくわかってない人たちが何をしたか、とくとご覧あれよ。

## 残業という課題
スクラムでは１日の作業時間とイベントは厳密に決められていて、残業とかないわーって感じです。
できないんだったらできないでなぜできないのかを振り返りますし、その改善策を模索するのが正しいアプローチです。

間に合わない理由にしても、スプリント計画がおかしいのか、能力が足りないのか、外的な要因なのか、環境要因なのか、それをあきらかにして対処するのが筋なんですが。

なんすか、最初から残業しろって？
どうせ残業させることでお金チャリンチャリンしたいんやろ・・
稼ぎに直結するらしく、自由裁量で１時間まで残業を認めるということで手を打ちました。

重ねて言うけどこれ不要な残業であると同時に、効率化と潜在的なプロジェクトの問題を塗りつぶしてわからなくしてるんだよ。

## 早く帰ることによって周囲の部署からの目が厳しい

「あいつら開発やってんのに１９時には全員消えてるわけだが、ほんとに働いてるのか？」

いや、残業してこのさんざんな社内システム作り上げてるお前らがなんか言えたことではないだろう？
社内の基幹システムのAPIを３本調査するのに２人月、２００万円くださいってのがもはや敗北したシステムだと思いますが、そういうの残業して作ったんすね、がんばったね！

むしろ月何十時間も残業することでいろいろ蝕まれてる事実に気づいてないのかなんなのか知らないけど、スクラムにはちゃんと時間内にやるべきことやってイベントこなして帰れって定められているし、そのメリットも滔々と解かれているんですが・・

ああだるい。
これで失敗したら叩かれる材料の一つにされるんだろうなあと思うと鬱ではございますが、だからといってリズムを崩すようなことはさせませんよ。
ちゃんと家に帰りましょう。

## 毎朝毎朝のあら捜し
チームのデイリーは粛々とはじまって粛々と終わる。
時間がかかっていると思ったら立ったままやるとすぐ終わるよね。

そしてスクラムオブスクラムのスクラムマスター＋謎勢力のMTGが毎日紛糾する。
以下にその理不尽な要求の一覧を羅列しておく。

もっとあったと思うけど私はつらいことかなしいことはすぐ忘れる楽観主義者だからあんまり覚えてない。覚えておく価値を見出さなかったのでこういうときに笑えないネタを提供してしまう、カーラさんすまんです。

* 進捗を示せ　→ スプリント計画のノウハウも溜まっていなよちよち歩きのチームのバーンダウンも信用できないのは既知なんですが・・最初の３スプリントでそんなもんわかるわけなーだろ。　バーンダウンが１ミリでも上に向いたらなんでそうなってるのか査察みたいなことしようとするのやめろ。
* ほら進捗出てないじゃないか増員するぞ！　→ チームを壊すもっとも効率的な方法ですねー
* 外部からなぞの有識者（後ほど真名が判明する）を入れて文句を言わせる　→ 敵かな・・！？味方かな・・・・？
* 些末な現象を報告しお客様(プロダクトオーナー)の危機感を煽る　→　スプリントレビューのとき喧嘩するように仕向けたいの？

「こういうのを全部排除するのが私（スクラムマスター）の仕事や」と気付いたとき、人は修羅となる。

単なる嫌がらせであって、ウォーターフォールへの風評被害っぽくなってるけど、根っこにあるのは我々選民が管理しなければ世界は滅ぶといったどこかのAIのような叩き込まれた思想なんだと思う。
それがどっから来ているかは、おぞましくて想像もしたくないです。

まだはじまって最初の月の出来事。
ユーザー操作をテストする【Ruby】

# はじめに

昨日に引き続き、Rspecの記事です！

[rspec入門で知っておけばよさそうなこと #RSpec - Qiita](https://qiita.com/kohki_takatama/items/4088169c0dc726a1b136)

今回はユーザー操作を再現するテストについて。
# capybara

**ユーザー操作を再現するDSL** のようです。
Rspecと組み合わせて使われることが多いですが、別のgemのようです。

DSLとは、プログラミング言語の中でも、特定の機能に特化したものですね。
他に、SQLやHTMLなどがDSLに分類されるはずです。

## 「ユーザー操作を再現する」とは？

例えば、`click_on 'ログイン'`で、「ログイン」というテキストのボタンをクリックできるようです。

CSSのクラスで指定することも可能（`find('.my-class').click`など）

# スペックの種類

（記事としてはあまりにも短かったので）
スペックの種類をChatGPTに書いてもらいました。

|スペックの種類|説明|
|---|---|
|モデルスペック|データモデルの振る舞いをテストします。バリデーション、アソシエーション、カスタムメソッドなどのテストが含まれます。|
|コントローラスペック|コントローラのアクションが期待通りに動作するかをテストします。リクエストを送信し、レスポンスを検証することに焦点を当てます。|
|ビュースペック|ビューテンプレートが正しくレンダリングされるかをテストします。特定の要素が含まれているか、特定のレイアウトが適用されているかなどを検証します。|
|ヘルパースペック|ビューで使用されるヘルパーメソッドのテストです。メソッドが期待通りの出力を返すかどうかを検証します。|
|ルーティングスペック|アプリケーションのルーティングが正しく設定されているかをテストします。特定のURLが期待通りのコントローラとアクションにルーティングされるかを検証します。|
|メールスペック|アプリケーションから送信されるメールのテストです。メールが送信されるトリガー、メールの内容、送信先などを検証します。|
|リクエストスペック|エンドツーエンドでアプリケーションのAPIをテストします。コントローラスペックよりも広範なテストで、複数のコントローラやモデルを跨いだ処理を検証します。|
|システムスペック|エンドツーエンドのブラウザベースのテストで、ユーザーインターフェース全体を通じてアプリケーションが正しく機能するかを検証します。Capabaraを使用して実行されます。|
|フィーチャースペック|システムスペックに近いですが、Capabaraを使用してユーザーの視点からアプリケーションの特定の機能をテストします。RSpec 3.7以前ではよく使用されていました。|
【解決済み】mediapipe で face_meshがエラーになる件

# mediappeのface_meshでエラー発生
python で下記のコードでエラーが出た。
```
import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

with mp_face_mesh.FaceMesh(max_num_faces=1, min_detection_confidence=0.5, static_image_mode=True) as face_mesh:
```

エラー出力
```
    with mp_face_mesh.FaceMesh(max_num_faces=1, min_detection_confidence=0.5, static_image_mode=True) as face_mesh:
  File "/opt/anaconda3/envs/pj_mp_cv/lib/python3.8/site-packages/mediapipe/python/solutions/face_mesh.py", line 95, in __init__
    super().__init__(
  File "/opt/anaconda3/envs/pj_mp_cv/lib/python3.8/site-packages/mediapipe/python/solution_base.py", line 248, in __init__
    self._graph = calculator_graph.CalculatorGraph(
RuntimeError: ValidatedGraphConfig Initialization failed.
ConstantSidePacketCalculator: ; RET_CHECK failure (mediapipe/calculators/core/constant_side_packet_calculator.cc:64) (cc->OutputSidePackets().NumEntries(kPacketTag))==(options.packet_size())Number of output side packets has to be same as number of packets configured in options.
ConstantSidePacketCalculator: ; RET_CHECK failure (mediapipe/calculators/core/constant_side_packet_calculator.cc:64) (cc->OutputSidePackets().NumEntries(kPacketTag))==(options.packet_size())Number of output side packets has to be same as number of packets configured in options.
ImageToTensorCalculator: ; RET_CHECK failure (mediapipe/calculators/tensor/image_to_tensor_calculator.cc:144) ValidateOptionOutputDims(options) returned INTERNAL: ; RET_CHECK failure (./mediapipe/calculators/tensor/image_to_tensor_utils.h:136) options.has_output_tensor_float_range() || options.has_output_tensor_int_range() || options.has_output_tensor_uint_range()Output tensor range is required. 
SplitTensorVectorCalculator: The number of output streams should match the number of ranges specified in the CalculatorOptions.
SplitTensorVectorCalculator: The number of output streams should match the number of ranges specified in the CalculatorOptions.
SplitTensorVectorCalculator: The number of output streams should match the number of ranges specified in the CalculatorOptions.
```

# 環境
### ソフト
macOS 14.3
python 3.8.18 (3.11.8に上げても同じエラーが出た)
mediapipe 0.10.10

### ハード
MacBook Air 2024

# 解決策
いろいろ調べた結果、mediapipeのバージョンを落とすとうまく動いた
エラーが発生するバージョン: 0.10.10, 0.10.11
エラーが発生しないバージョン: 0.10.9

mediapipe のバージョン確認
```
> pip list | grep mediapipe
mediapipe             0.10.11
```

バージョン0.10.9をインストール
```
> pip install mediapipe==0.10.9
```

参考にした記事
https://github.com/google/mediapipe/issues/5168
同じexpressのプロセスでドメインごとに違うページを表示する

# はじめに
- expressでサーバーを起動
- example1.jpとexample2.jpで別のサイトを表示したい
- おなじNodeJSのプロセスで複数ドメインを扱う方法で悩んだ

# 解決策
Routerというもので分岐ができるらしい
ドメインでも分岐できないか？
→使い方が正しいかわからないけど下のコードで解決!

# コード
``` index.js
const express = require("express");
const app = express();

// ドメインごとに読み込む
const domain1 = require("./example1.js");
const domain2 = require("./example2.js");

app.use( (req, res, next) => {
  // アドレスのホスト名(ドメイン)
  var host = req.hostname;
  
  if( host == "example1.jp" ) {
    // routerに飛ばす
    domain1(req, res, next);
  } else if( host == "example2.jp") {
    // 別のrouterに飛ばす
    domain2(req, res, next);
  } else {
    // どれにも対応しない場合
    next();
  }
});

// 404 error
app.use(function(req, res, next){
  res.status(404);
  res.end("404 error");
});

// 3000番ポートで開く
app.listen(3000, function () {
  console.log(`listening on port 3000!`);
});
```
``` example1.js
const express = require("express");

// Routerをつくる
const example1 = express.Router();

example1.get("/", (req, res) => {
  res.send("example1.jp!");
});
example1.get("/hello", (req, res) => {
  res.send("Hello, world! from example1.jp");
});
``` 
<details><summary>example2.js(1とほぼ同じ)</summary>

``` example2.js
const express = require("express");

// Routerをつくる
const example2 = express.Router();

example2.get("/", (req, res) => {
  res.send("example2.jp!");
});
``` 
</details>

# 完成
サンプルをそのままうつすと下のように返ってくるようになります
| アドレス | サイトの表示 |
|:-|:-|
| example1.jp:3000/ | example1.jp! |
| example1.jp:3000/hello  | Hello, world! from example1.jp |
| example2.jp:3000/ | example2.jp! |
| example2.jp:3000/hello  | 404 error |
nuxtでlocalhostをhttpからhttpsにする方法

こんにちは

最近、開発をしていたのですけれどもgoogleがhttpからhttpsへ移行させるために
段階的に規制をしているそうです
## 記事
https://forest.watch.impress.co.jp/docs/news/1234312.html

その結果、iframeでURLを読み込む際、Mixed Content errorという
エラーを吐いて読み込まれないという不具合を最近起こしました

開発環境でわからなかったのかとツッコまれる方もいるとは思うのですが
localhostはhttpで読み込みをしていて、httpで読み込む分にはリンク先に
httpが混ざっていても動くので全く気づきませんでした

段階的な規制をしているというのも全く知りませんでしたので寝耳に水です

調べてみても上手く動かしている人の記事が見当たらなかったので
chatGPT製ではありますが
今回は自分が動かした方法を教えます

## 方法
1:コンソールで以下の呪文を打つ
`openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes`

2:打ち込むと`writing new praivate key to 'server.key'`と出るので
以下の様な書き方をする

Country Name (2 letter code): JP
State or Province Name (full name): Tokyo
Locality Name (eg, city): Minato-ku
Organization Name (eg, company): Example Corp.
Organizational Unit Name (eg, section): IT Department
Common Name (e.g. server FQDN or YOUR name): localhost
Email Address: 適当なメールアドレス

3:`nuxt.config.js`に以下の様な記述をする
　適時それぞれのconfigにあった書き方をするとよいかも
```nuxt.config.js
// Node.jsのファイルシステムモジュール(fs)とパスモジュール(path)をインポート
import fs from 'fs'; //これを入れる
import path from 'path'; //これを入れる

export default {
  // Nuxt.jsサーバーの設定
  // serverから全部
  server: {
    // HTTPS設定
    https: {
      // SSL証明書の秘密鍵を読み込む
      key: fs.readFileSync(path.resolve(__dirname, 'server.key')),
      // SSL証明書を読み込む
      cert: fs.readFileSync(path.resolve(__dirname, 'server.crt'))
    }
  }
}
```
4 `yarn dev`でnuxt起動。この時に3000で起動しているURLがhttpからhttpsになれば成功

で動く

### 動いた。うれしい
中小企業診断士　財務会計　〜損益分岐点分析〜

●損益分岐点売上高
ちょうど利益が0になる売上高。損益分岐点における売上高を意味する。

・損益分岐点売上高
固定費 　÷　(1-変動比率）

(1-変動比率)で固定費率が算出。
売上が200円、変動費が40円だとすると変動比率は20%
固定費率は80%となり、160÷0.8(80%) → 損益分岐点売上高は200円
これは利益が0になる売上高が固定費＋変動費と同じ金額なので利益が0。つまり損益分岐点売上高となる。

●安全余裕率
売上高の安全性を判断する比率。

・安全余裕率
(実際売上高　- 損益分岐点売上高)　÷ 　実際売上高

実際売上高と損益分岐点売上高を引くと利益が出る。
利益が実際売上高のうち、どれだけの割合含まれているか、で安全余裕率が算出できる。
SQLSTATE[HY000]: General error: 1364 Field ‘カラム名’ doesn’t have a default value

完全honaki用
悪しからず

## タイトルのエラーで詰まってた
色々解決策がネットに出てきたが僕のはまじでしょうもないやつだった

## 答え
```BudgetCreateComponent.vue
<template>
    <div class="container">
        <form v-on:submit.prevent="submit">
            <div class="form-group">
                <label for="category-date">期間</label><br>
                //⭐️ここ  <input type="date" id="from_date" v-model="budget.from_date"> ~
                <input type="date" id="to_date" v-model="budget.to_date">
            </div>
            <div>
                <button type="submit" class="btn btn-primary">登録</button>
            </div>
        </form>
    </div>
</template>

```
⭐️がついてる箇所の以下のコードを
```
v-model="budget.from_date"
```
```
v-model="budget.form_date"
```
にしてMySqlのカラム名と異なったものになっていた。
色んな解決策があるけど誤字も要チェック。
【AtCoder】オリジナルの別の楽しみ方「タイムロンガー」

## 自己紹介

AtCoderで日々奮闘している、中学生のwhile-true-ifです。

ちなみに自分は茶コーダー(2024/3/11時点)です。

## この記事の対象者

- AtCoderでヘンなことしてみたい人
- 暇な人

## ルール

「タイムロンガー」という遊び方を考案しました

今から、タイムロンガーのルール説明をします。

- 特定の問題をACすること
- 制限時間に近ければ近いほどよい

この２つのルールさえ守っていれば、何してもいいです。

## テクニック

### ```time.sleep```を使う

[ABC084 A問題](https://atcoder.jp/contests/abc084/tasks/abc084_a)
を使ってみました。

問題は以下の通りです。

> 12 月 30 日の M 時から次の年になるまでは何時間か、求めてください。

基本的には、

```python
print(48-int(input()))
```

というコードを提出するのが、普通です。

しかし、実行結果はACであるものの、時間は9msという速さであるため、タイムロンガーでは、好まれないコードです。

そのため、```time.sleep()```というものを使います。

```python
import time

time.sleep(1.991)
print(48-int(input()))
```

解答例はこんな感じです。

結果はACで2000msぴったりでした。

これはタイムロンガーの上では、ベストコードです。

しかし、これはちょっとチートすぎる気がするので、別のテクニックを使っていきたいと思います。

### ```for文```を使う

これなら少し面白みがあると思います。

さっきの問題で、タイムロンガーにチャレンジします。

```python
n=78000000

for _ in range(n):
  pass

print(48-int(input()))
```

結果はACで1850msでした。ただ、```time.sleep()```と違い、for文は少し、時間が不安定です。そのため、このコードでは、1750ms~1850msとばらつきがあります。これなら、面白みがあると思います。

さらに、踏み込んで、nを80000000にしました。すると、1773ms~1905msとばらつきがありました。

## まとめ

みんなも暇つぶしとしてタイムロンガーをやってみてはどうでしょうか。(自分以外にこんなことをしている人はいるのか?...)

そのほかにも、タイムロンガーで使えるテクニックがあったら、コメントで教えてください。
PySimpleGUI 5を使うためにPySimpleGUI.comに登録する手順

# はじめに

「Python2年生 デスクトップアプリ開発のしくみ」という本を買いました。

https://www.shoeisha.co.jp/book/detail/9784798174990

この中で、`PySimpleGUI` を使うように出てくるのですが、書籍と異なり、最近は登録が必要になったようです。そのあたりをメモにしておきます。

# 情報

以下のサイトを読むと、バージョン5から、個人利用でもサイトへの登録が必要になったようです。

https://fuji-pocketbook.net/pysimplegui/

>PySimpleGUIのライセンスは、バージョン 5から変更になります。
>
>すべてのユーザーはPySimpleGUI.comに登録し、開発者キーの取得が必要になる
>個人利用の範囲ではこれまで通り無料。しかし、商用利用するにはサブスクリプション（99ドル/年）契約

# インストール

普通に`pip`を使うだけ。

`pip install PySimpleGUI`

# 登録しないと

まず、ダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/649e4894-964b-4bc3-7b99-ad546de22137.png)

これをOKすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/000ab891-37b2-7806-9bb6-e95ad78f58e7.png)

個人利用は *NO COST* とのことですが、とりあえず「Free Trial」を選ぶと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/4f83b617-24f6-5a42-a0c0-ba511ad9eb6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/45737a4c-4d1d-1981-bd97-5ba58b189e13.png)

下に赤字で「Sign upしなはれ」という文字が出てきます。

# 登録の仕方

[PySimpleGUI](https://pysimplegui.com/pricing)に飛びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/781e3b27-bff9-f980-60de-0fad6ab1ab3a.png)

「Hobbyist」の方に入ると、名前とメールアドレスを登録するように促されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/4e97fce6-924e-239c-0718-7cab68a04437.png)

GitHub IDは入れても入れなくても良いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/0fc2a150-9384-1126-0ff4-b8c9e7a1b1e8.png)

登録したメールアドレス宛にVerify Codeが送られてるので、入力して、「Validate Code」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/679e0b40-de6b-f6bd-1c25-b447d01cdc0b.png)

ライセンスは一年間のようです。赤枠をクリックして「License key」をコピーします。

# ライセンスキーインストールの方法

これがよくわからない…。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/144f1d04-b957-cb33-23d6-319c3316f230.png)

[FAQ](https://pysimplegui.com/faq)#18のようにコードを書いたら、もう一度ライセンスキーをインストールできる画面が表示されました。（このやり方で合ってるんだろうか…？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/4cad0822-1079-2ecf-1ea4-8a83af2daa7b.png)

ともかく、これでライセンスキーがインストールできたようです。めでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308248/7e5e1979-5663-9a85-db4a-92373097a753.png)

（おわり）
LANの構築に必要な機器

## LANとは
狭い範囲のデバイス同士が接続されたネットワークのこと

## 自宅でLANを構築する際に用意するもの
- ホスト
- ネットワーキングメディア
- NIC
- ネットワーキングデバイス

### ホスト
パソコンなど接続したいデバイスのこと。

### ネットワーキングメディア
LANケーブルなどデバイス同士を繋ぐケーブルのこと

### NIC
- Network Interface Cardの略
- LANに接続するための拡張カード
- マザーボードに差し込む

### ネットワーキングデバイス
複数デバイス間のデータ通信を制御する機器。

## ネットワーキングデバイス
レイヤによって必要な機器がある。

### 物理層
- ハブ
- リピータ

電気信号を増幅させたり分配させる役割がある。

### データリンク層
- スイッチ
- ブリッジ

データの伝達制御をする役割がある。

### ネットワーク層
- ルータ

データの宛先を決める役割がある。

## まとめ
自宅で上記の機器を接続しあうことでLANが作成される。

## 参考リンク
３ Minutes Networking
https://www5e.biglobe.ne.jp/~aji/3min/07.html


## あとがき
ネットワークの学習のために記事を投稿していきます。
英語における基数・序数・N倍・N番目

デザインや実装をする上でprimary,secondaryの続きや、signle,double,tripleの次が何だっけ...となるのでまとめました。

|基数|序数|N倍|N番目|
| -- | -- | -- | -- |
|1|first|single|primary|
|2|second|double|secondary|
|3|third|triple|tertiary|
|4|fourth|quadruple|quaternary|
|5|fifth|quintuple|quinary|
|6|sixth|sextuple|senary|
|7|seventh|septuple|septenary|
|8|eighth|octuple|octonary|
|9|ninth|nonuple|nonary|
|10|tenth|decuple|denary|

参考

https://dcc.dickinson.edu/grammar/latin/cardinal-and-ordinal-numbers

https://www.vocabulary.com/dictionary/primary
Tailwind CSS - テーブルで左二列以上を固定して、その他の列はスクロールさせる (列幅は完全に固定するパターン)

# HTMLの例

- テーブルより外側の要素に `overflow-auto` を指定する
- 固定する列のセルに `sticky` を指定する
- 固定列セルの `left` の指定は、1列ごとに、列の幅分増やして行く ( たとえばすべての列幅が `100px` なら、1列目は `0px` /  2列目は `100px` ... というように )
- 背景色を指定しないと非固定列と固定列が重なった時に文字が透けてかぶってしまうので、固定列のセルには背景色を指定する
- テーブルセルの幅指定は特殊なので `w-` ではなく `min-w-` `max-w-` で指定すると良さそうだ

```html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.tailwindcss.com"></script>
    <style type="text/tailwindcss">
      @layer utilities {
        .content-auto {
          content-visibility: auto;
        }
      }
    </style>
  </head>
  <body>
    <div class="lg:content-auto">
      <div class="overflow-auto">
        <table class="w-full">
          <tr>
            <td class="sticky left-0 min-w-[100px] max-w-[100px] overflow-hidden bg-yellow-200">AAAA</td>
            <td class="sticky left-[100px] min-w-[100px] max-w-[100px] overflow-hidden bg-green-200">BBBB</td>
            <td class="sticky left-[200px] min-w-[100px] max-w-[100px] overflow-hidden bg-blue-200">CCCCCCCCCCCCCCC</td>
            <td class="w-[150px]">DDDDDDDDDDDDDD</td>
            <td class="w-[150px]">EEE</td>
            <td class="w-[150px]">FFFFFFF</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">*********************</td>
            <td class="w-[150px]">XXXXXX</td>
            <td class="w-[150px]">YYYYY</td>
            <td class="w-[150px]">ZZZZZZZZZZZZZZZZZZZZZZ</td>
          </tr>
        </table>
      </div>
    </div>
  </body>
</html>
```

# 失敗例

- 外側、テーブル、セルでそれぞれの幅指定をミスるとうまくいかない場合がある

# 動作例

上述のコード通りではないが、こんなイメージ

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/74f7f1d7-a9ba-4d14-9212-2c89d4b651a9)

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/67f13ce5-c59d-4b60-8cc4-d73c78e807ad)

# 参考

- https://web.runland.co.jp/frontend/post-6084

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
BinanceのEthereum上でのUSDT出金を全部追う

# 趣旨
EtherScanが便利なことを発見し、これを応用すると面白そうなものができると直感的に感じたので忘れないうちにメモしておきます。

以下のコードの中身はドキュメントにあったBinanceからのUSDT出金を追うためのものです。特にパラメータはいじっていませんので、以下の解説がわかりづらい場合はドキュメントを直接参照するのがよいかと思います。

# コマンドラインによる操作
APIはHTTPSリクエストで通信しているだけなのでパラメーターにAPIキーをセットすればcurlでも同じ結果が得られます。コードを書くのが面倒な方はとりあえずcurlで実際に受け取れるデータを確認してもよいかと思います。

```
curl "https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=0xdac17f958d2ee523a2206206994597c13d831ec7&address=0xdfd5293d8e347dfe59e90efd55b2956a1343963d&page=1&offset=100&startblock=0&endblock=99999999&sort=desc&apikey=yourapikey"
```

# Pythonによる操作
PythonにてAPI通信をするときはrequestsライブラリを使えば即コードができあがるので便利です。コマンドラインからsubprocessを利用する方法などもありますけど、多分requestsのためのコードを直接書いたほうが直感的でわかりやすいです。

```python
import requests
from pprint import pprint

url = "https://api.etherscan.io/api"
params = {
    "module": "account",
    "action": "tokentx",
    "contractaddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
    "address": "0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
    "page": 1,
    "offset": 100,
    "startblock": 0,
    "endblock": 99999999,
    "sort": "desc",
    "apikey": "YourActualApiKey"
}

response = requests.get(url, params=params)
data = response.json()
pprint(data)
```

# EtherScanのドキュメント
ドキュメントを見れば他にもいろいろ応用に使えそうなのがいっぱいあるのでぜひ覗いてみてください。

https://docs.etherscan.io/recipes/get-all-usdt-transfers-from-binance
nodejsサーバーをsystemdに登録する!

# はじめに
- linuxにSSHを使って接続中
- コマンドでサーバーの起動・停止をしたい
- 再起動したときにサーバーを自動で起動するようにしたい!
- nodejsのサーバーをコマンドラインで起動していて、再起動するときに毎回`Ctrl+C`→`node index.js`はめんどくさい!

# 1. systemdへの登録
nanoなどで下のファイルを作成して編集します
`sudo nano /etc/systemd/system/myNodeServer.service`

``` sh: /etc/systemd/system/myNodeServer.service
[Unit]
# プログラムの名前
Description= Node.js Server

[Service]
Type=simple
User=username
# nodejsの動いているディレクトリ
WorkingDirectory=/home/username/Desktop/node/
# 起動するためのスクリプトの配置先
ExecStart=/home/username/Desktop/node/start.sh 

# 落ちたら自動で再起動する設定
Restart=always
RestartSec=200

# 出力先(今回は標準のsyslog)
StandardOutput = syslog
StandardError = syslog
# syslogでプログラムを判別するための名前
SyslogIdentifier = myNodeServer

[Install]
WantedBy=multi-user.target
```
その他の細かい設定などはほかの記事を見てください

# 2. 起動用スクリプトを用意
``` /home/username/Desktop/node/start.sh 
#!/bin/bash
cd /home/username/Desktop/node
node index.js
```
環境に合わせて変えてください

# 3. systemdの再読み込み
- `sudo systemctl daemon-reload`
  でファイルを再読み込み
- `sudo systemctl restart myNodeServer.service`
  で再起動

  少し経ったら
- `systemctl status myNodeServer.service`
  で状態を確認してみましょう

```
● myNodeServer.service - Node.js Server
     Loaded: loaded (/etc/systemd/system/myNodeServer.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-03-01 14:48:59 JST; 1 weeks 5 days ago
   Main PID: 23285 (start.sh)
      Tasks: 13 (limit: 2057)
        CPU: 8min 46.411s
     CGroup: ...
```
`myNodeServer.service - Node.js Server` の左が緑色の <font color="green">●</font> になっていて
`Active: active (running)` と出ていれば成功です!

<br>

もしダメだった場合は
`journalctl -u testapp` でログを確認してみましょう
どこが間違っているのか教えてくれます。
あとはGoogle先生に聞いてみましょう

# おわり
`sudo systemctl enable myNodeServer.service`で再起動したときに自動で起動するようになります

状態の確認 `systemctl status myNodeServer.service`
起動 `sudo systemctl start myNodeServer.service`
停止 `sudo systemctl stop myNodeServer.service`
これらが1コマンドでできるようになりました!

---

読んでくれてありがとうございました!
初めての記事なので改善点や間違いなどあるかもしれませんが、見つけたらコメントしていただけると助かります！
ロジスティック回帰の経験がない男、ガチで危機感持った方が良いと思う

今回は、AI初心者でも理解しやすいロジスティック回帰について解説する。

# はじめに
### ロジスティック回帰とは
ロジスティック回帰は、特定の事象が起こる確率を予測するために使用される統計手法です。ロジックとしては、**[単純パーセプトロン][link-1]** の活性化関数に **[シグモイド関数][link-2]** を使用している。

計算グラフで書くと、以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/e166721d-9121-6658-782d-434735b73330.png)

数式は以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/66ab7940-4740-5d6c-390c-16f5b0a2bd59.png)



### 何ができるのか？
**ロジスティック回帰は、ある因子から結果を予測するため、または既に出ている結果を説明するために用いられる。** 例えば、顧客が商品を購入するかどうかや、病気の発症有無など、結果が2つのカテゴリーに分けられる場合に適している。

使いどころとしては、マーケティングでの応用が多く、顧客がキャンペーンにどのように反応するかを予測したり、特定の商品を購入するかどうかを分析するのに利用される。また、医療分野では、患者の検査値から病気の発生率を予測するために使われたり、金融での信用リスク評価にも応用される。

具体的な例としては、以下のような感じ。
****・ある病院が患者のデータ（年齢、体重、血圧など）を用いて、特定の病気にかかるリスクを予測する**** 

****・顧客の過去の購買履歴や反応データから、キャンペーンに対する反応を予測し、より効果的なマーケティング戦略を立てる。**** 

このように、ロジスティック回帰は多岐にわたる分野で有用なツールとして活用されています。実際のデータを用いた分析を通じて、より精度の高い予測や意思決定を行うことができるのです。

### 多クラスロジスティック回帰
通常のロジスティック回帰は2値分類しかできないが、うまく応用すれば多クラスの分類もできる。それが多クラスロジスティック回帰です。

計算グラフとしては、以下のようになっている。
活性化関数でソフトマックス関数を用いるのがポイント。

出力層の各ノードは、各クラスに対応している。
y1,y2,y3・・・ykは、各々のクラスに当てはまる確率を表している。
たとえば、「y1 = 0.9の場合は、90%の確率でクラス1に分類される」みたいな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/cfd85033-b350-9a05-0c24-d4710b60c978.png)



# ソースコード例
以下のソースコードでは、**アイリスデータセットを使用してロジスティック回帰モデルをトレーニングし、テストデータでモデルの精度を評価している。** 

scikit-learnは機械学習のための非常に便利なライブラリで、多くのアルゴリズムと便利なツールが含まれている。この例では、データセットをトレーニングセットとテストセットに分割し、モデルをトレーニングセットにフィットさせ、テストセットでモデルの精度を評価している。
```Python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# アイリスデータセットをロード
iris = load_iris()
X, y = iris.data, iris.target

# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ロジスティック回帰モデルを初期化
model = LogisticRegression()

# モデルをトレーニングデータにフィットさせる
model.fit(X_train, y_train)

# テストデータで予測
predictions = model.predict(X_test)

# 精度を計算
accuracy = accuracy_score(y_test, predictions)
print(f'Accuracy: {accuracy}')

```


# 実行結果
「Accuracy: 1.0」ということは、予測が完璧にできたってことですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/5c23d201-d2db-d89f-4ce6-9ce288cff999.png)




# 参考にさせてもらったページ
https://zero2one.jp/learningblog/r-lang-logistic-regression/

https://zero2one.jp/ai-word/simple-perceptron-3/

https://zero2one.jp/ai-word/sigmoid-function/

http://sumikitch.com/blog/2019/02/12/multi-logistic-regression1/

<!--- --->
[link-1]:https://zero2one.jp/ai-word/simple-perceptron-3/
[link-2]:https://zero2one.jp/ai-word/sigmoid-function/
Pythonで「文字列のいずれかの位置でパターンとマッチするか調べる(Pattern.search)」の動作を確認してみた

# 概要

Pythonで「文字列のいずれかの位置でパターンとマッチするか調べる(Pattern.search)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index3.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

msg = 'lemon, apple, peach'
pattern = re.compile(r'apple')

result = pattern.search(msg)
if result :
    print('Matched')
else :
    print('Don\'t matched')

import re

def checkMatch(msg, pattern):
    result = pattern.search(msg)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

pattern = re.compile(r'apple')

checkMatch('lemon, apple, peach', pattern)
checkMatch('grapes, cherry', pattern)

import re

def checkMatch(msg, pattern, start, end):
    result = pattern.search(msg, start, end)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

msg = '東京都港区赤坂'
pattern = re.compile(r'東京')

checkMatch(msg, pattern, 0, 7)
checkMatch(msg, pattern, 1, 4)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Matched
apple
Don't matched
東京
Don't matched
```

# まとめ

何かの役に立てばと。