OmniAICreator/Qiita-1.07M huggingface dataset:
MariaDB を削除して、Mysql をインストール

Ubuntu 22.04 で確認した方法です。
MariaDB の代わりに、MySQL を使う方法です。

## MariaDB の状態
バージョン

```text
MariaDB [city]> select version();
+----------------------------------+
| version()                        |
+----------------------------------+
| 10.6.12-MariaDB-0ubuntu0.22.04.1 |
+----------------------------------+
1 row in set (0.000 sec)
```

sql モード

```text
MariaDB [city]> select @@sql_mode;
+-------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
```

## MariaDB の停止

```bash
sudo systemctl stop mariadb
```

## MariaDB の削除

```bash
sudo apt purge mariadb-server
sudo apt purge mariadb-client
sudo apt purge mariadb-common
```

```bash
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
```

## Mysql のインストール

```bash
sudo apt install mysql-server mysql-client mysql-common
```

## Mysql の起動

```bash
sudo systemctl start mysql
```

## Mysql が動いていることを確認

```bash
sudo systemctl status mysql
```

## Mysql にアクセス

```text
$ sudo mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 70
Server version: 8.0.34 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.34    |
+-----------+
1 row in set (0.01 sec)

mysql>
```

## sql_mode の確認

```text
mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
```
テスト実行リスナー（TestExecutionListeners）をマスターしよう

# TestExecutionListenersとは

TestExecutionListeners（テスト実行リスナー）は、Spring FrameworkおよびJUnitに統合されたテストの拡張機能です。
これを使うと、テストメソッドの実行前後にカスタムコードを挿入したり、テスト実行中に特定のイベントを検出したりできます。これは、テストのセットアップやクリーンアップ、ログ記録、リソース管理など、さまざまなテスト関連のタスクを自動化し、カスタマイズするのに役立ちます。

# 主な用途

## テストセットアップとクリーンアップ
テストメソッドの前後でデータベースのクリーンアップ、テストデータのセットアップ、外部リソースの初期化など、テストに必要な事前処理と事後処理を実行できます。

## ログ記録
テストの実行情報やデバッグ情報をログに記録することができます。テストが成功したか、失敗したかなどの情報を集めるのに役立ちます。

## リソース管理 
テストの実行に必要なリソース（ファイル、ネットワーク接続、一時的なデータなど）の確保と解放を管理できます。

## カスタムエラーハンドリング
テスト中に発生したエラーや例外をキャッチし、特定のアクションを実行できます。たとえば、特定のエラーが発生した場合に特別な処理を行うことができます。

# 実際の使用例
テストクラス内で @TestExecutionListeners アノテーションを使用して、カスタムのテスト実行リスナーを指定します。そのリスナークラスは、テストの前後で実行したいカスタムコードを提供します。

TestExecutionListenersは、テストスイートやテストクラスの特定のメソッド（@BeforeAllや@AfterAll）の前後に実行されるため、テストコードをより柔軟に管理できます。

## 使用例その１：データベーステストのセットアップとクリーンアップ
データベース関連のテストを行う場合、テストデータベースのセットアップとクリーンアップが必要です。TestExecutionListenersを使用して、テストメソッドの前後でこれらのタスクを自動化できます。

```java
@ExtendWith(SpringExtension.class)
@SpringBootTest
@TestExecutionListeners(DatabaseSetupCleanupListener.class)
public class DatabaseTest {

    @Test
    public void testDatabaseOperation() {
        // データベース関連のテストを実行
    }
}
```
__DatabaseSetupCleanupListener__ は、テストメソッドの前でテストデータベースをセットアップし、後でクリーンアップするカスタムリスナーです。これにより、テストの再利用性が向上し、データベースの状態を簡単に管理できます。

## ログ記録とデバッグ

TestExecutionListenersを使用して、テストの実行中にログを記録し、デバッグ情報を収集できます。これは、テストが失敗した場合に問題の特定や解決を助けます。

```java
@ExtendWith(SpringExtension.class)
@SpringBootTest
@TestExecutionListeners(LoggingListener.class)
public class LoggingTest {

    @Test
    public void testWithLogging() {
        // テスト実行中のログを記録
        log.info("テストが開始されました。");
        // テストのロジック
        log.info("テストが完了しました。");
    }
}
```
__LoggingListener__ は、テストの開始と終了時にログを記録するリスナーです。これにより、テストがどのように進行しているかを把握し、問題が発生した場合にデバッグに役立ちます。

## リソース管理

テストの実行にはさまざまなリソースが必要な場合があります。たとえば、ファイルの読み取りや書き込み、外部サービスへの接続、一時的なデータベースなどです。TestExecutionListenersを使用して、これらのリソースを効果的に管理できます。

```java
@ExtendWith(SpringExtension.class)
@SpringBootTest
@TestExecutionListeners(ResourceManagementListener.class)
public class ResourceTest {

    @Test
    public void testWithResourceManagement() {
        // テスト実行中にリソースを確保および解放
        Resource resource = ResourceManagement.acquireResource();
        try {
            // リソースを使用したテストのロジック
        } finally {
            ResourceManagement.releaseResource(resource);
        }
    }
}
```
__ResourceManagementListener__ は、テストメソッドの前でリソースを確保し、後で解放するリスナーです。これにより、リソースの競合やリークを防ぎ、テストの信頼性を確保できます。


これらの具体的な例を通じて、TestExecutionListenersが実務でどのように役立つかを理解できるでしょう。この機能を使用することで、テストスイートを効果的に管理し、テストプロセスをカスタマイズして、高品質なソフトウェアを開発できます。
emmetについて(2023/10/06)

2023/10/6

Webデザインについて
・Adobe XDでのデザインカンプ
→UIはユーザーインターフェース、Webパージやアプリで目にするデザイン
→UXはユーザーエクスペリエンス操作の体感

ワイヤーフレーム = ラフ案
デザインカンプ = 完成イメージ
プロトタイプ = 試作品

・Sketch / Adobe XD / Figma
使い分けるとすれば、作り込むものはSketch、動かすものはXD
ブラウザ上でデザインが出来てチーム作業に向いている「Figma」

Sketch	UIデザイン制作自体の効率化に便利な機能を揃えており
大規模なサービスを運用し、複数のデザイナーで同時に制作しているチーム
Adobe XD	途切れないコミュニケーションのために活用できる機能を揃えており
新機能開発案件が多く「作る→検証する→再考する」を行うことが多いチーム
・emmetについて
・ul>li+div; ul>li^div
+ ^ * (dt+dd)*5
a{click me}
p{お問い合わせは}+a{こちら}+{をクリックしてください}
lorem

CSSを書ける状態にしてからemmetを打ち込む
p {}など
・emmetとはショートカットキーのようなもの
emmet - ラップ変換 - コメント切り替え - イメージサイズ切り替え
- 数式の評価 - 
・emmetのカスタマイズ
snippets.json

{
    "variables": {
        "lang": "ja"
    },
    "html": {
        "snippets" : {
            "list": "ul>li{${1:item}}*3"
        }
    },
    "css" : {
        "snippets": {
            "dark": "background-color #000;\ncolor: #fff;"
        }
    }
}
買い忘れ・買いすぎ防止！写真でストックがどれくらいあるか分かるツールを作ってみた（まだ作成中）

 <img width="30%" [買い物かご.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/885512c3-42dd-7930-cdb9-6d62db7e2bc6.jpeg)>


**スーパーで買い物中、広告の品が目に:open_mouth:
でもこれってまだストックあったかな:expressionless:
そんな時、気軽に確認できるツールを作ってみました！（まだ作成中）**

>使用したツール
・Google Sheets(https://docs.google.com/spreadsheets/u/0)
・Node-RED（https://app.flowforge.com/）
・Teachable Machine（https://teachablemachine.withgoogle.com/）



## １．まずは基本の調味料ををピックアップ ##
まずは無いと困る定番調味料をまとめてみました。![スクリーンショット 2023-10-06 010541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/89284d53-d4f1-5a9c-0184-f9e899c4b231.png)
定番な分だけ値上げが厳しい物だらけです。

## 2.次は**Teachable Machine**を使って画像を学習させます ##

よく使う物をそれぞれ５０枚サンプルを取りました。![スクリーンショット 2023-10-06 020134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/ef6375c9-aa86-3aaf-5760-f0507d576c2a.png)
サンプルは　醤油　味噌　ソース　マヨネーズ　ケチャップ　油　
全部ほぼ毎日使う必需品です:v:　でも値上げが痛い今日この頃です:confounded:

## ３.画像で判別できるかな？ ##
**Node-RED** を使ってケチャップを読み取ってみます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Teachable Machineで学習させたデータをNode-REDを使って、ちゃんと認識できるか確認してみました。<br>お試しでケチャップを読み取ってみました。<br>ちゃんとケチャップで返ってきました。<a href="https://twitter.com/hashtag/%E5%86%8D%E6%8A%95%E7%A8%BF?src=hash&amp;ref_src=twsrc%5Etfw">#再投稿</a>　<a href="https://twitter.com/hashtag/TeachableMachine?src=hash&amp;ref_src=twsrc%5Etfw">#TeachableMachine</a>　<a href="https://twitter.com/hashtag/NodeRED?src=hash&amp;ref_src=twsrc%5Etfw">#NodeRED</a><a href="https://twitter.com/hashtag/%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%AA%AD%E3%81%BF%E5%8F%96%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F?src=hash&amp;ref_src=twsrc%5Etfw">#実際に読み取ってみた</a><a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/hwUrieo8dy">pic.twitter.com/hwUrieo8dy</a></p>&mdash; 市川　公子 (@ichikawa_kimiko) <a href="https://twitter.com/ichikawa_kimiko/status/1711714134335926342?ref_src=twsrc%5Etfw">October 10, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ちゃんとケチャップが読み取れました:relaxed:

## 最後の難問Google Sheetsの在庫数は返ってくるか ##
今回の最終目標はストック量が表示される事。
しかし、画像で判別から先がうまくいかず、あれこれ試行錯誤はしてみたもののまだ完成には至りませんでした。

:::note info
あとがき 
今回の目標としていた「買い忘れ・買いすぎ防止！写真でストックがどれくらいあるか分かるツール」のまだまだ完成には知識が追い付きませんでした。勉強不足でいろんな技術を組み合わせて作るには時間がかかりそうです。でもこのシステムができるようになれば店舗の在庫管理に生かすこともできるので、もっとトライ＆エラーを繰り返して完成をさせたいです。
:::
【React】JSXを使う理由とは？


https://ja.legacy.reactjs.org/docs/hello-world.html

https://ja.legacy.reactjs.org/docs/introducing-jsx.html



業務の中で、しっかり理解できていない部分が徐々に見えてきたので、じっくりドキュメントを読むことを始める。

# Hello World
Reactの一番短い例がこちら。 “Hello, world!” という見出しをページに表示する。

```javascript
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<h1>Hello, world!</h1>);
```

```html
<div id="root">
    <!-- This element's contents will be replaced with your component. -->
</div>
```

# JSXの導入

```jsx
const element = <h1>Hello, world!</h1>;
```
* JSXはJavaScriptの構文の拡張。
* JSXはReact要素を生成する。

### JSXを使う理由
表示のためのロジックは、イベントへの応答や経時的な状態の変化、画面表示のためのデータを準備する方法など、**UIロジックと本質的に結合したもの**。Reactはその事実を受け入れる。

Reactはマークアップとロジックを別々のファイルに書いて人為的に**技術を分離**するのではなく、マークアップとロジックを両方含む疎結合の「コンポーネント」という単位を用いて**関心を分離**する。


### JSXに式を埋め込む
* あらゆる有効なJavaScriptの式を、JSX内で中括弧に囲んで使用できる。
* `2+2`、`user.firstName`、`formatName(user)`など全て有効なJavaScriptの式。

以下の例では、`formatName(user)`という関数の結果を`<h1>`要素内に埋め込んでいる。

```jsx
function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);
```

### JSXもまた式である
* コンパイルの後、JSXの式は普通のJavaScriptの関数呼び出しに変換され。JavaScriptオブジェクトへと評価される。
* そのため以下のようなことが可能。
    * JSXをif文やforループの使用
    * JSXを変数に代入
    * JSXを引数として受け取る
    * JSXを関数から返す


### JSXで子要素を指定する
* タグが空の場合、XMLのように `/>` タグを閉じることができる
```JSX
const element = <img src={user.avatarUrl} />;
```

* JSXのタグは子要素を持つことができる
```JSX
const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);
```

### JSXはインジェクション攻撃を防ぐ
JSXはデフォルトで特定のタイプのインジェクション攻撃、特にクロスサイトスクリプティング (XSS) 攻撃を防ぐためのメカニズムを持っている。

:::note
インジェクション攻撃とは
悪意のあるコードやデータをアプリケーションの入力として送り込むことで、不正な動作を引き起こす攻撃方法です。特に、クロスサイトスクリプティング (XSS) は、ウェブアプリケーションにおいて非常に一般的な攻撃手法であり、攻撃者が悪意のあるスクリプトをウェブページに埋め込むことで、他のユーザーのデータを盗んだり、ユーザーに不正な操作をさせることができる。
:::

* デフォルトでは、React DOMはJSXに埋め込まれた値をレンダー前にエスケープするため、悪意のあるスクリプトが実行されるリスクを低減する。


### JSXはオブジェクトの表現である
Babel は JSX を `React.createElement()` の呼び出しへとコンパイルする。

以下の2つの例は等価
```jsx
const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
```

```jsx
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);
```

React.createElement()は本質的には以下のようなオブジェクトを生成する。
このようなオブジェクトをReact要素と呼び、これらは画面に表示したいものを説明書きとして考えることができる。

React はこれらのオブジェクトを読み取り、DOM を構築して最新に保つ。

続く
牌操作信者のストレスを軽減する方法を考える


## 案1. 牌操作乙ボタンをつける

牌操作をしていると感じたときに牌操作乙ボタンを押してもらう。
ゲーム終了後、牌操作乙ボタンを押したときの状況の「全プレイヤーの対戦履歴から求めた確率」と「プレイヤーの対戦履歴から求めた確率」を表示する。
（何をもって牌操作と感じたのかは分からないので、例えば配牌のシャンテン数、N巡目での放銃確率、追っかけリーチに一発で放銃する確率など複数表示する。）

これにより、その状況が高確率で発生しているのかどうか客観的に見ることができる。

## 案2. 下手な打牌を指摘する

私はプレイヤー自身の雀力が上昇すれば牌操作を感じなくなると思っている。（個人の感想）
そのため、ゲーム終了後、AIが下手な打牌を指摘しプレイヤーの雀力上昇を促すようにする。

## 案3. 上手な打牌を評価する

牌操作は負けたときのポイントの減少からくるストレスにより感じてしまうと思っている。（個人の感想）
正しい打牌、100点満点の打牌をしようが負けるときは負けるのが麻雀だが、問答無用でポイントが減るのは相当なストレスだ。
そのため、AIに打牌を評価してもらい、上手な打牌だった場合はポイントの減少幅を減らすようにし、ストレスの軽減を図る。

## 案4. 君、運がいいねえボタンをつける

案1と似ているが、これは他人に対してのボタンである。
君、運がいいねえボタンを押されたプレイヤーは運がいいと思われたポイントが1プラスされる。
また、押したプレイヤー自身の俺の運悪すぎだろポイントが1プラスされる。

これは常に確認することができ、プレイヤーの俺の運悪すぎだろポイントと運がいいと思われたポイントを比較することで、自分が不幸だと思っていると同じくらい、他人から運がいいと思われていると感じることができる。

## おまけ

https://qiita.com/mogamoga1337/items/c2c1469dba3939fe5c58

https://qiita.com/mogamoga1337/items/983949e93568b17f104d
AWS Codepipeline の Deploy ステージで失敗すると Source ステージの Github コミットハッシュが分からないんだが

デプロイグループを選んで「履歴を表示する」で Source/Build/Deploy の単位でまとまった履歴を見られるようだ

<img width="776" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/04ee39cc-ebe1-49c4-a3da-7d70b96c5973">


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
【VALORANT】 Spreadsheetを用いた エージェント,Map B/Pの整理

## はじめに
こんにちは。VALORANTアナリストのkir1nです。
以前はFENNELやFocus e-Sportsでプロアナリストとして活動していました。

私がプロチームに在籍していた時、業務の一部として試合前に各チームのエージェント使用情報やMapのBan/Pickの統計を取っていました。

その名残か、チームを脱退した今でも情報を前提として試合を観戦することが好きなので
・労力を減らせる
・フラットに情報を整理できる
Spreadsheetを作成しました。


大会で使用されたエージェント、そのチームが好むMap,敬遠しているMapを一覧で管理できます。

::: note warn
MapB/Pに関して
B/Pの先攻後攻(TeamA/B)をダイスで決定するため
一概に確率を出していいのかという問題があります。

しかし、今回はざっくりとチームの概要をつかむことを目的にしているので、
厳密性に関しては無視しています。
:::

## シート説明
以下シートのテンプレートです。
上部タブより**ファイル→コピーを作成**して複製の上ご使用ください。

https://docs.google.com/spreadsheets/d/1N2DhiIWSCuZE8QFUr7MvGGVpIT5KhO9AGMSv7ucNVK8/edit?usp=sharing

**Template**シートを**右クリック→コピーを作成**
シート名をチーム名にすると管理しやすくなります。

## 使用例
現在(2023/10/05)行われている **VCTGame Changers 2023 Japan：Split 2** を題材とした使用例を掲載します。

Twitter(X)にもに掲載しています。 [該当Post](https://x.com/kir1n_ak/status/1710239062483960121?s=20)
シートへのアクセスはこちらからどうぞ。

https://docs.google.com/spreadsheets/d/1MqB1PvlNXgGlqd9yTrIcXgALWP69WAIaWJNI5l8yo0I/edit?usp=sharing

現在全勝中、ZETA DIVISION GCを例とするとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321297/986df59a-28fb-aa97-21f2-3b9668baf300.png)
一目でわかることを理想としているので、
**namelist**内にあるエージェントアイコンを使用しました。
##

現行の公式大会ルール(BO3)では、BAN/PICKフローが以下のようになっています。

>チーム A が 1 つのマップを排除する
 次にチーム B が残りのマップから１つマップを排除する
 チーム A がマップ 1 を残りのマップから選択する
 チーム B が攻めか守りを決定
 チーム B がマップ２を残りのマップから選択する
 チーム A が攻めか守りを決定
 チーム A が残りのマップから１つ排除する
 チーム B が残りのマップから１つ排除する
 チーム A が最後に残ったマップ３の攻めか守りを決定
([Challengers Japan公式ルールブック](https://assets.contentstack.io/v3/assets/bltb730eada072bdbf4/bltdbae4495decf9958/63f070d0af8f313d28988355/VALORANT_Challengers_JAPAN_-Competition-Rules-JPN_1.1.pdf)より引用) 

大抵の大会はこれに則ってB/Pが行われています。
配信試合に関しては、通常[VLR.gg](vlr.gg)上にもB/Pが順に掲載されますので、その順に従って入力します。

※3Map目に関して
2Mapで勝敗が決まり、プレイされなかった場合 **DICIDER**欄は未入力をお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321297/057fce16-80f1-05e3-23a8-86a7711e1340.png)

配信がない場合、B/Pは明かされません。
その場合はA/Bの欄を**入力せずに**行われたMapのみ入力すると集計がうまくいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321297/4ca2aad5-7799-9456-b7d7-836c351e4014.png)

`I4:K10`の範囲には、以下の数式が入っています。

`=(COUNTIFS($I$15:$I,"A",$J$15:$J,$H4)+(COUNTIFS($I$15:$I,"B",$K$15:$K,$H4)))/COUNTA($I$15:$I)`

もしTeamAなら**A-1stBAN**を,TeamBなら**B-1stBAN**の数を数えて、それらを試合数で割るというものです。
Mapローテーションが変わった際は、H列を変えると自動的に集計するMap名も変わります。

Map勝率は今回算出していません。
(追加する予定だったが、そこまで入力するなら[VLR.gg](vlr.gg)見たほうが早いため却下。)

**補足**
必要に応じて日付ソートもできるようになっています。
開始日と終了日の入力フィールドを**I2**,**J2**に作って
`=COUNTIFS($H$15:$H,">="& TEXT($I$2,"YYYY-MM-DD"),$H$15:$H,"<="& TEXT($J$3,"YYYY-MM-DD"))`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321297/511df3be-0881-3836-d8e2-bfea48fe8f2b.png)
この関数をそれぞれの計算フィールドに追加すると作れます
今回はQueryが使用できず、関数の更新において自動化ができなかったことと、
そこまでの試合数がなかったので省きました。
何かいい数式をご存じの方がいましたら教えてください...。

## 注意事項
**個人利用,チーム利用に関して**
ご自由にどうぞ。コメントや[Twitter](http://twitter.com/kir1n_ak)のDMなどでフィードバックを頂けると喜びます。

**改変・引用等での再配布に関して**
事前の連絡は不要です。いろいろカスタマイズして使いやすくしてください。
SNS上に掲載する際は、メンション等を用いて作者の目に入るようお願い致します。
[Haskell] GHCup における各ツールのバージョン情報を WEB 上で確認する

GHCup が対応している Haskell の各ツールのバージョン情報は公式サイト上でも確認できますが、更新までのタイムラグがあります。

参考「[Supported tools - Installation - GHCup](https://www.haskell.org/ghcup/install/#supported-tools)」

GHCup が各ツールのバージョンを確認するとき、以下の場所に記述される URL から情報を取得します。

参考「[L37 - ghcup-hs/lib/GHCup/Version.hs at v0.1.19.4 · haskell/ghcup-hs](https://github.com/haskell/ghcup-hs/blob/v0.1.19.4/lib/GHCup/Version.hs#L37)」

2023-10-06 現在は以下の URL になっています。

参考「[https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-0.0.7.yaml](https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-0.0.7.yaml)」

GitHub 上でこのファイルを見れば変更履歴も確認できます。

参考「[ghcup-metadata/ghcup-0.0.7.yaml at develop · haskell/ghcup-metadata](https://github.com/haskell/ghcup-metadata/blob/develop/ghcup-0.0.7.yaml)」
参考「[History for ghcup-0.0.7.yaml - haskell/ghcup-metadata](https://github.com/haskell/ghcup-metadata/commits/develop/ghcup-0.0.7.yaml)」

`latest` や `recommended` の情報もファイル内で文字列検索すれば見つけられます。
Djangoをインストールしてみました。

Djangoについてはこちら
https://ja.wikipedia.org/wiki/Django

Djangoをインストールしてみたのでメモ代わりに手順を残しました。

１．VENVE（仮想環境）を作成しておきます。
　　仮想環境とは、、、説明はこちら
　　https://www.sejuku.net/blog/68423

　　コマンドプロンプトを立ち上げて以下のコマンドを打ち、仮想環境を作成します。
　　python -m venv 仮想環境名
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/e15f29c8-7810-cebd-036a-83d946707fdf.jpeg)
　ここでいうと仮想環境は「python-test」となります。

結果を確認してみましょう。今作成した「python-test」のディレクトリの中を覗いてみます
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/f0e95ecd-78c8-4e17-bfe3-33ad76e8125a.jpeg)
上手くできていますね。
Scriptsというディレクトリに移動します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/38823792-b798-979b-fbe7-328517988053.jpeg)

２．仮想環境をアクティベイトします。
　　activate と入力し実行します。![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/6c3079db-6142-2ff1-8fff-56c484cb54c6.jpeg)
頭に仮想環境名が表示されていれば成功です。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/5b69ced1-97c0-d7ec-9ab9-ba223629442e.jpeg)


３．Djangoをインストールします。
　　pip install django と入力し実行します。
　　うまくできました。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/e76fc5cd-587d-45ee-0db1-aa0929589bcb.jpeg)

４．activeteを解除するコマンドは deactivateと入力し実行します。
　　仮想環境が終了します。

５．pythonを終了するのは
　　exit()と入力し実行すると終了します。
TIN データを STL 形式に変換する簡単な方法

1. `tin2stl` をインストール

```sh
cargo install tin2stl
```

もしくは https://github.com/usagi/tin2stl/releases から `tin2stl-windows-x64.7z` をダウンロードして手作業でお好みの場所へ配置します。

2. `tin2stl` で変換

```sh
tin2stl source.tin
```

または `tin2stl.exe` 実行バイナリーファイルへ `source.tin` ファイルをドロップします。

成功すると `source.tin.stl` ファイルが生成される。

## 参考

- https://github.com/usagi/tin2stl
- https://crates.io/crates/tin2stl
- https://en.wikipedia.org/wiki/Tin
- https://en.wikipedia.org/wiki/STL_(file_format)
GemFire for KubernetesのメトリクスをPrometheusで可視化する

以前、[こちら](https://qiita.com/ipppppei/items/a99da94be15b3b2aef62)でVMware GemFire for Kubernetesを構築してAria Operations for Applications(以下AOA)で可視化するところまで確認した。
AOAでの連携は非常に簡単だったが、Kubernetesの監視だとPrometheusを使うことも多いので、今回は前回の続きとしてPrometheusでメトリクスを見るところを確認する。
なお、前回の続きのため、GemFire Clusterは構築済みとして進める。

最初にPrometheusを構築するためにHelmのChartリポジトリを追加する。
```sh
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
```
Prometheusをインストールする。外部からアクセスしたかったのでPrometheusとGrafanaそれぞれで`type: LoadBalancer`を設定した。
```sh
helm install prometheus prometheus-community/kube-prometheus-stack -n prometheus --create-namespace --set grafana.service.type=LoadBalancer --set prometheus.service.type=LoadBalancer
```

次にGemFireのEndpointを伝えるために`kind: ServiceMonitor`を作るが、その前にPrometheusの検出ルールを確認する。
```sh
$ kubectl get prometheus -o yaml prometheus-kube-prometheus-prometheus -n prometheus
：（省略）
  serviceMonitorSelector:
    matchLabels:
      release: prometheus
：（省略）
```
Labelに`release: prometheus`があればいいので、これを含む`ServiceMonitor`のManifestを作成し、applyする。
```yaml
cat << EOF > ./gemfire-svcmonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: gemfire-svcmonitor
  namespace: gemfire-dev
  labels:
    release: prometheus
spec:
  endpoints:
  - interval: 10s
    port: locator-metrics
    scheme: http
    path: /
  - interval: 10s
    port: server-metrics
    scheme: http
    path: /
  selector:
    matchLabels:
      app.kubernetes.io/name: gemfire
  namespaceSelector:
    matchNames:
    - gemfire-dev
EOF
kubectl apply -f gemfire-svcmonitor.yaml
```
GemFireはメトリクスを`/metics`ではなく`/`で公開しているため、パスを変更している。
また、`targetPort`でLocatorとServerのEndpointを纏めて指定できないか試してみたが、上手く動かなかったので`port`でport名をそれぞれ指定している。
問題なければ、Podの再起動とかはせずに少し待てばPrometheus側で以下のようにService Discoveryに表示される。
![1696583394019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/0f6d3e0d-618a-497e-3d9d-1a8a732e5eb0.png)
メトリクスも問題なく取れているようだ。
![1696585503328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/6d1f580f-a9d4-4af3-f232-538a02186069.png)
Linux TerminalにGitのBranch名を表示

# はじめに
Terminalのコマンドラインに現在のGitのブランチ名を表示するように環境設定する方法です。

# 設定方法

① 「~/.bashrc」または「~/.bash_profile」に、以下のGithub GistのURLを参考してコードを追記してください。
色などの変更は自由にすれば良いです。

https://gist.github.com/danielalvarenga/2df8cabbd6f3041c2378

私の場合は、以下のように少しコードをカスタムして、「~/.bashrc」に追記しました。

```bash:~/.bashrc
function parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
 
RED="\[\033[01;31m\]"
YELLOW="\[\033[01;33m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
NO_COLOR="\[\033[00m\]"
PS1="$GREEN\u@\h$NO_COLOR:$BLUE\w $RED\$(parse_git_branch)$NO_COLOR\$ "
```
 
② sourceコマンドを使用して修正した「~/.bashrc」または「~/.bash_profile」を適用してください。

```console
$ source ~/.bashrc
```
 
③ Gitを使用できるパスに、ブランチ名が表示されます。

```console:例
USER@HOST:~/test/test-repository (main)$
```
Vitestで非同期関数の検証方法一覧

## はじめに

Vitestで非同期を検証する場合、書き方がいくつかあるためご紹介します。VitestはJest互換なため、Jestでも同様の書き方ができます。

## 非同期関数の検証方法

以下の検証はすべて成功します。

```typescript
import { test, expect, describe } from 'vitest'

// 成功する非同期関数
export const fetchDataResolve = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('tarosuke')
    }, 10)
  })
}

// 失敗する非同期関数
export const fetchDataReject = () => {
  return new Promise((_, reject) => {
    setTimeout(() => {
      reject('error')
    }, 10)
  })
}

describe('非同期の成功を検証', () => {
  test('検証１', () => {
    return fetchDataResolve().then((data) => {
      expect(data).toBe('tarosuke')
    })
  })

  test('検証２', () => {
    return expect(fetchDataResolve()).resolves.toBe('tarosuke')
  })

  test('検証３', async () => {
    await expect(fetchDataResolve()).resolves.toBe('tarosuke')
  })

  test('検証４', async () => {
    expect(await fetchDataResolve()).toBe('tarosuke')
  })
})

describe('非同期の失敗を検証', () => {
  test('検証１', () => {
    return fetchDataReject().catch((data) => {
      expect(data).toBe('error')
    })
  })

  test('検証２', () => {
    return expect(fetchDataReject()).rejects.toBe('error')
  })

  test('検証３', async () => {
    await expect(fetchDataReject()).rejects.toBe('error')
  })

  test('検証４', async () => {
    /*
    アサーションが１回呼ばれることを確認
    （非同期関数が成功した場合、catch処理が実行されずに検証が成功の扱いになるため、記述することをおすすめする）
    */
    expect.assertions(1)

    try {
      await fetchDataReject()
    } catch (error) {
      expect(error).toBe('error')
    }
  })
})
```

## まとめ

Vitestで非同期を検証する場合の書き方をご紹介しました。どの書き方でも良いですが、`async/await`を書き忘れたり、`try...catch`で`expect.assertions()`を書き忘れた場合、想定している検証が正しく行われないことがあるため、注意が必要です。


## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=5b01666cff5134f821bd
Peachtree City Roofing Services by RoofAmerica

RoofAmerica is your premier source for high-quality roofing services in  <b><a href="https://www.goroofamerica.com/location/georgia/roofing-company-peachtree-city">peachtree city roofing</a></b> needs, you're choosing quality, reliability, and peace of mind. Contact us today to schedule an inspection or consultation, and let us protect and enhance your home with our top-quality roofing services. Your satisfaction is our guarantee.
SQLの基本その１

# 前提
下記のような通常のselect文（超基礎）が理解できる状態である。
この次に何を覚えればよいかを片っ端から書いていく。
```sql
select * from students where id = 2;
```

# order句
表示順を指定する。limit や offset はあまり使われない印象。
```Sql
select * from students order by id;      --ID順（昇順）に並べ替え
select * from students order by id desc; --ID順（降順）に並び替え
select * from students order by name desc, height; --名前順（降順）→身長順（昇順）に並び替え
select * from students order by id limit 2;  --並び替え後、先頭の２件を表示 
select * from students order by id offset 3; --並び替え後、先頭の３件をスキップして残りを表示
select * from students order by id limit 2 offset 1; --並び替え後、先頭の１行をスキップして、先頭の２件を表示
```

# group句
select句の対象に集約関数（sum, avg, max, min, countなど）を使用できる。
例えば数学のテストの平均値を男女で比較したい、といった場合は「性別」をグループ化して、国語の点数カラムの値を見る。
```sql
select avg(math) from students group by gender; 
--性別でグループ化して、平均値をみる集約関数を使用
select max(math), min(math), sum(math), count(*), to_char(avg(math), '99.9')
from students group by gender; 
--最大値、最小値、合計値、レコード数、平均値を[xx.x]形式に変換した文字列、を性別ごとに集計
```
## group句の注意点：select対象
group句の場合、select句の対象に選択できるカラムに制限がかかる。
例えばstudentsテーブルに対して「gender」でグループ化しているとき、「id」や「name」カラムなど、group句の対象でも集約関数でもないものは出力できない。
実行結果は「gender」に集約されているので、ここでいうと「男性」「女性」の２行しか出力されない状態である。
そこで「name」を表示しようとしても一体誰の名前を表示すればいいのか？と考えれば納得できる。
```sql
select avg(math), name from students group by gender; --構文エラーになる
```

## group句の対象は「式」である
列名での集約はイメージしやすいが、関数を用いた式もgroup句の対象に指定できる。
そもそも列名は「式」に分類されるものなので、group句の対象には「式」を指定できる、と理解するとよい。
```sql
select * from students group by length(name);
```


# having句
グループ化したデータに対して絞り込みをする場合、having句を使用する。
動作のイメージは where句に近い。
```sql
select avg(math) from students group by gender having avg(math) >= 60;
--性別ごとの数学の平均点を求めて、平均点が60以上ではない場合はその性別のデータを表示しない。
--例：男子の平均点が50、女子の平均点が70の場合、男子のデータは表示されない。切ないね。
```
# SQLの実行順序という意識
<font color="Red"><strong>この節は不確定情報が多いので不備があれば指摘いただけると助かります！</strong></Font>
例えば「数学のテストが平均点以上の生徒の名前を知りたい」という場合、こんなSQLをイメージするが、実行できない。
```sql
select name from students where math >= avg(math);
```
SQL文の実行順序のイメージは、select句を除いて上から順番に from句→where句→group句…と実行していき、select句を最後に実行する、というもの。
avgは平均値を求める集約関数であり、テーブルのデータを集約してから算出される。
つまりgroup句以降（select句を含む）でなければavg関数を使用できないので、where句で集約関数を参照することはできない（本稿では触れないが、サブクエリを使用すれば解決する）。
また select句が実行されるときはテーブルのデータが集約された後なので、そもそもname列がデータに存在していない状態になる。
PowerShellの比較演算子が意味不明すぎて覚えられないので由来を調べてみた

PowerShellは比較演算子によくある`==`や`>`を使っていないため、書く時に調べがち。暗記しようとしてもどうせ忘れるので、なぜこの略称なのかを調べる。

# 比較演算子の対応表
|一般的な言語|PowerShell|略称の由来|
|---|---|---|
|==|-eq|equals|
|!=|-ne|not equals|
|>|-gt|greater than|
|>=|-ge|greater than or equal|
|<|-lt|less than|
|<=|-le|less than or equal|

元の英語を見てしまえば普通にわかりやすい略称ではある。

# おわりに
「tはPowerShellだと含まないやつで～」なんて覚えるよりも「thanのtね」って1回知ってしまえば、もう次書く時は直感的にいけるようになるので、やはり根本を調べることは大切だと思った。

調べてて気づいたけど、PowerShell以外の言語でも公式ドキュメント原文（英語）で読めば`greater than`みたいなフレーズで比較演算子の説明してるじゃん…。

公式ドキュメント読むクセをつけよう。

# 参考
[about_Comparison_Operators - PowerShell Documentation](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.3#long-description)
Arduino実験

#### LCD Keypad Shield HW-555
|Arduino側|LCD基板|Shield基板|
|:-:|:-:|:-:|
||V0|VR-Center|
|SCL1|||
|SDA1|||
|AREF|||
|GND|VSS,RW||
|D13||右上穴最左|
|D12||右上穴|
|D11||右上穴|
|D10||
|D9|E||
|D8|RS|
|D7|D7|
|D6|D6|
|D5|D5|
|D4|D4|
|D3||右上穴|
|D2||右上穴|
|D1||右上穴|
|D0||右上穴最右|
|+5V|VDD,A||
#### モニタを使いたい
ntshell
https://blog.boochow.com/article/442245440.html
#### ロードセルで力を測りたい
4bitパラレルで16x2LCDに表示する
https://blog.proglus.jp/5069/
https://burariweb.info/electronic-work/arduino-learning/arduino-lcd-module-display.html
https://miraiworks.org/?p=6183
ロードセルRead
https://github.com/bogde/HX711
https://stemship.com/arduino-basic-loadcell/
https://www.denshi.club/cookbook/sensor/g/1-2.html
https://a-tomi.hatenablog.com/entry/2021/10/09/113645
https://tom2rd.sakura.ne.jp/wp/2022/06/07/post-12735/
https://denshikit.main.jp/topf/technology84.html
https://bcn.xsrv.jp/%E3%83%AD%E3%83%BC%E3%83%89%E3%82%BB%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%B0%A1%E6%98%93%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%E8%A3%BD%E4%BD%9C/
springでファイルをstringプロパティとして読み込む

プロパティじゃなくて単に変数読み込みだけな方法も混じってはいる。



```@Value```で```file:..```や```classpath:..```を指定し```Resource```としてinjectionしてあとは好みの方法で読み込む。以下では```Files.readString```を使用しているがここは状況に応じた方法で良い。

```java
import java.io.IOException;
import java.nio.file.Files;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

@Service
public class FileToStringService {
  @Value("file:sample.txt")
  Resource resource;

  public void sample() throws IOException {
    String str = Files.readString(resource.getFile().toPath());
    System.out.println(str);
  }
}

```

```ResourceLoader```を使う方法。

```java
import java.io.IOException;
import java.nio.file.Files;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

@Service
public class FileToStringService {
  // コンストラクタ省略
  ResourceLoader loader;
  
  public void sample() throws IOException {
    String str = Files.readString(loader.getResource("file:sample.txt").getFile().toPath());
    System.out.println(str);
  }
}
```

```ResourceUtils```を使用する方法。

```java
import org.springframework.util.ResourceUtils;

String str = Files.readString(ResourceUtils.getFile("file:sample.txt").toPath());
```

ファイルの中身を色んなところで使いたいならbeanにしても良い。

```java
  @Bean
  @Qualifier("sampleStr1")
  public String sample1(ResourceLoader loader) throws IOException {
    return Files.readString(loader.getResource("file:sample.txt").getFile().toPath());
  }
```

```java
@Service
public class FileToStringService { 
  String sampleStr;
  public FileToStringService(@Qualifier("sampleStr") String sampleStr) {
    this.sampleStr = sampleStr;
  }
}
```

SqELだけでも書けるがトリッキー感がある。
参考：https://stackoverflow.com/questions/14639209/spring-expression-read-file-content

```java
  @Value("""
    #{T(java.nio.file.Files)
       .readString(T(org.springframework.util.ResourceUtils)
         .getFile('file:sample.txt'))}
    """)
  String str;
```

springの記法（```file:..```とか）は使えないがJavaのAPIだけでならこうも書ける。

```java
@Value("#{T(java.nio.file.Files).readString(T(java.nio.file.Path).of('sample.txt'))}")
String str;
```

適当なファイル読み込みstaticメソッドを一つ作成してそれをSqELから呼び出せば多少は読みやすくなる。

```java
public class FileToStringUtil {
  public static String readString(String location) throws IOException {
    return Files.readString(ResourceUtils.getFile(location).toPath());
  }
}

@Value("#{T(kagamihoge.FileToStringUtil).readString('file:sample.txt')}")
String str;
```
【SQL】ユーザーが指定した期間より以前のデータを削除する動的SQLクエリ(プリペアドステートメント)

# 概要
MySQLデータベースにて、指定した期間より前のデータを全て削除するストアドプロシージャを作成しました。
本記事ではそのクエリの解説をします。

# SQLクエリ
`sample-db`データベース内の`sample_table`というテーブルにて、プロシージャ実行時に指定した期間より以前のデータを削除するストプロを作成しました。プロシージャ名は`ManualDeleteProcedure`としたので、実行する際は、以下のように叩きます。

```
CALL sample-db.ManualDeleteProcedure('2023-08-31');
```

以下がSQLクエリです。

```sql
CREATE DEFINER=`root`@`%` PROCEDURE `sample-db`.`ManualDeleteProcedure`(IN input_your_date DATETIME)
BEGIN
  DECLARE end_date DATETIME;
  DECLARE current_datetime DATETIME;
  DECLARE ThirtyDaysAgo DATE;

  -- XX年XX月XX日23:59:59よりも前のデータを消すプロシージャ  
  
  -- 現在の日付を取得
  SET current_datetime = NOW();
 
  -- 削除対象の期間を計算
  SET end_date = input_your_date;
  
  -- 30日前の日付よりも古い日付が選択された場合、エラーメッセージを出力してプロシージャを終了
  SET ThirtyDaysAgo = DATE_SUB(current_datetime, INTERVAL 30 DAY);
  IF end_date > ThirtyDaysAgo THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '入力された日付は30日以内の日付です';
  END IF;

 -- 削除クエリを生成し、実行
  SET @sql_query_sample_table = CONCAT(
    'DELETE FROM sample-db.sample_table WHERE sample_table.create_date <= "', DATE_FORMAT(end_date, '%Y-%m-%d 23:59:59'), '";'
    );
  PREPARE stmt FROM @sql_query_sample_table;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END
```

## 30日以内の期間が指定された場合...
また、今回は「30日以内の期間」が指定された場合には、カスタムエラーメッセージが表示されるように実装しました。
2023/10/3に実施した場合は以下の様になります。

```
CALL sample-db.ManualDeleteProcedure('2023-09-04');
```

↓

```
SQLエラー [1644] [45000]: 選択された日付は30日以内の日付です
```

### `SIGNAL SQLSTATE '45000'`とは？
`SIGNAL SQLSTATE`ステートメントは、MySQLでカスタムエラーメッセージを発生させるために使用されるもの。
`'45000'`は一般的なユーザー定義エラーコードとして使われることがあります。
上記エラーメッセージの通り、`45000`と表示されるのでユーザー定義のものだとわかりますね。

公式ドキュメントはこちら
[13.6.7.5 SIGNAL ステートメント](https://dev.mysql.com/doc/refman/8.0/ja/signal.html)

> 一般的な SQLSTATE 値を通知するには、'45000' を使用します。これは、「未処理のユーザー定義の例外」を示します。

### `PREPARE`, `EXECUTE`, `DEALLOCATE`とは？

続いて、以下について。

```sql
  PREPARE stmt FROM @sql_query_sample_table;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
```

簡単にいうと、
「`PREPARE`でSQL文を事前に準備し、`EXECUTE`で実行し、`DEALLOCATE`でメモリリソースを解放」しています。

今回は、ユーザーが日付を指定するので、ユーザーからの入力値をパラメータとしてクエリに組み込む必要があります。そのため、動的SQLとして`PREPARE`, `EXECUTE`, `DEALLOCATE`を使用しています。これにより、ユーザーからの入力を適切に処理し、SQLインジェクションなどのセキュリティリスクを回避できます。

・`PREPARE`ステートメント：指定された文字列（この場合、`@sql_query_sample_table`変数に格納されているSQL文）を事前に準備し、プリペアドステートメント（プリペアドクエリ）として保存。ユーザーからの入力を含む動的なSQLクエリを事前に準備します。

・`EXECUTE`ステートメント：`PREPARE`ステートメントで事前に準備されたプリペアドステートメント（ここでは`stmt`という名前で指定）を実行。プリペアドステートメントを実行してデータベース操作を行うために使用。

・`DEALLOCATE`ステートメントは、不要になったプリペアドステートメントを解放（解除）するために使用。プリペアドステートメントは一度使用したら解放しなければならず、メモリリソースを解放する必要があるため。

公式ドキュメントはこちら。
[13.5 プリペアドステートメント](https://dev.mysql.com/doc/refman/8.0/ja/sql-prepared-statements.html)

> 準備済みステートメントのための SQL 構文は、次の 3 つの SQL ステートメントに基づいています。
>
> PREPARE は、ステートメントを実行のために準備します (セクション13.5.1「PREPARE ステートメント」を参照してください)。
> EXECUTE は、準備済みステートメントを実行します (セクション13.5.2「EXECUTE ステートメント」を参照してください)。
> DEALLOCATE PREPARE は、準備済みステートメントを解放します (セクション13.5.3「DEALLOCATE PREPARE ステートメント」を参照してください)。
containerd migration from docker (especially on Debian 11)

## Prepare nerdctl

from https://github.com/containerd/nerdctl/releases .

You are encouraged to make aliases like:

```bash
alias n='sudo `which nerdctl` --namespace moby'
```

## Enable containerd image store

https://docs.docker.com/storage/containerd/

```
{
  "features": {
    "containerd-snapshotter": true
  }
}
```

Note that you need to clear docker images for complete migration.

## Install containernetworking-plugins

It is straightforward in Debian 12, but on Debian 11 you need to build https://packages.debian.org/source/bookworm/golang-github-containernetworking-plugins from source code (by apt-src), which requires:

- https://packages.debian.org/bookworm/golang-github-appc-cni-dev
- https://packages.debian.org/bookworm/golang-github-vishvananda-netlink-dev
- https://packages.debian.org/bookworm/golang-github-networkplumbing-go-nft-dev

## Start buildkitd as systemd

- https://github.com/cielavenir/buildkit_deb_builder
- posted https://github.com/moby/buildkit/issues/1794#issuecomment-1751880367

## Issues

### docker cannot load tar.gz

https://github.com/moby/moby/issues/46600

### (intermediate images) namespace has to be buildkit

https://github.com/containerd/nerdctl/issues/2550
Mac os X 向けappを公証（ノータリゼーション）をする方法。

※この記事は、ios向けの記事ではありません。
Mac os x app開発における公証についてまとめた記事になります。
記事の後半に、PyinstallerでinstallしたPython appを公証する方法も載せてます。

# 公証をしないと？
公証をしないと、Gatekeeperによって怪しい警告文が表示されたり、
そもそもアプリが起動しなかったり。
macOS Mojave以降で実行するAppに必要ぽい。
ユーザーの信頼を高めることが可能なので、やった方がいいらしい。
https://developer.apple.com/jp/developer-id/

# 公証のやり方は？
Xcodeで簡単に出来ます。
メニューバーから、Product -> Archive を選択。
Archive終了後、リストからArchiveしたappを選択し、Distribute app を選択。
Developer ID -> Upload　.. その後は基本的にNext 
その後時計アイコンが表示されるviewになるので、
その後は☑️マークがつくまで待機するという形になります。

⭐️注意
公証を受ける前に、Hardend Runtimeを有効にする必要があります。
こちらをしないと、公証を受けることができません。
Signing & Capabilities　から 右上の+ボタンを押下し、Hardend Runtimeを追加するだけで基本的にOK。
↑Pythonやその他の子プロセスを導入している場合は、さらに追加の設定が必要です。


# 公証にかかる時間は？
数分程度で終わります。
意外と早いです。

# 公証済みかどうか確認する方法は？
Apparency というアプリを使用して簡単に確認することができます。
https://mothersruin.com/software/Apparency/

# 子プロセスに対して、HardendRuntimeはどう有効にする？
筆者が遭遇した問題になります。
着手したプロジェクトは、Mac向けappが大枠としてあり、
その中に子プロセス(Python)が組み込んであるという構造でした。

この作りでどこが問題になるかというと、
先述したHardend Runtimeを子プロセスで有効にするにはどうやんの？
という壁にぶつかりました。
PyinstallerでinstallしたPythonをどう公証するか。ということですね。

# どうやった？
コード署名と、Hardend Runtimeを有効にする必要があります。
そのためには、

1.entitlements.plistを作成する。
2.証明書のDeveloperIDを控えておく。
3.そのplistと、証明書をappに対して当ててやる。

※1.entitlements.plistの追記内容
entitlements.plistはXcodeから作成することが可能です。
Xcodeから作ってやらないとエラーが発生することがあるみたいです。。

```
<plist version="1.0">
  <dict>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
  </dict>
</plist>
```


※2　証明書確認
実行結果の"Apple Development"の箇所をコピー
```
security find-identity -p basic -v
```

※3 実行コマンド
```
codesign --deep --force --options=runtime --entitlements "あなたのentitlements.plistのパス" --sign 
"Apple Development: hoge tarou (XXXXXXXXX)" --timestamp "あなたのpython appのパス"
```

entitlements.plistがめちゃ重要なようで、
これを作らないとPythonが全く動かなる現象にあい、どん詰まりしました。
初心者がプログラミング入門学習で失敗したこと3選（体験談）

## プログラミング入門の学習方法
プログラミング入門の学習はProgaeを使って学習しました。
Progateとは初心者向けのプログラミング学習サイトです。
無料で多くの言語が学習でき、ゲーム感覚でプログラミングを学習することが出来ます。


## 学習した内容
Progate無料版のHTML,CSS,Javascriptを主に学習しました。
プログラミングは難しいというイメージがありましたが、私でも理解しやすく楽しく学習できました。
Progateはプログラミングについて全く何も分からない私にとって最高のアプリでした。

## 入門学習後の学習内容
とりあえずHTML,CSS,Javascriptを終えたので次に何を学習しようかと悩みました。
新しい言語を学ぶのも選択肢にありましたが、まず今の学習した内容で何が作れるのかを試してみました。

<strong>試したものは模写コーディングです。</strong>

色々なサイトを参考にして、自分でホームページの見た目を作成してみようと思い模写コーディングをやってみました。

<strong>実際に模写コーディングをしてみて、自分の入門学習方法について少し失敗したなという点を列挙します。</strong>

## 入門学習の仕方で失敗した経験2選

### ①スマホで学習したこと
学習時間の確保が難しく、通勤時間に電車の中でプログラミング入門を学習していました。
結果的に、スマホで学習することになりPCでタイピングしてプログラミングすることは少なかったです。

#### 何が失敗だったか
模写コーディングをして体感したのが、プログラミングは実際に書いてみて覚えられるものだと気付きました。
スマホで学習していた私は、書いて学ぶというより見て暗記しようとしていたと思います。
学習するならできれば、PCで書くことをお勧めします。

### ②丸暗記しようとしていたこと
全ての内容を丸暗記して理解しようとしていました。
そして、内容を忘れたら最初に戻って「もう一度暗記し直す」という作業を何度も繰り返していました。

#### 何が失敗だったか
模写コーディングをして気づいたのですが、プログラミングは全てを丸暗記する必要はないということです。
基礎的な内容はググれば、すぐに調べられるからです。
そもそも丸暗記は量が膨大すぎて難しいです。
大まかな概要だけ覚えておけば、あとは調べれば出てくるので丸暗記する必要はありませんでした。

###
Playwright の前処理と後処理

:::note info
メモレベルの記事ですが、ご容赦ください。
:::

## Playwright の前処理と後処理

Playwright でテスト実行する際の前処理 (setup) と後処理 (teardown) を実装する方法には、調べた限り以下の4つがある。

- Hooks
- Project Dependencies
- Configure globalSetup and globalTeardown
- Fixture

以下ではそれぞれの特徴を簡単にまとめる。

### hooks

- API ドキュメント
  - [`test.beforeEach()`](https://playwright.dev/docs/api/class-test#test-before-each-2)
  - [`test.beforeAll()`](https://playwright.dev/docs/api/class-test#test-before-all-2)
  - [`test.afterEach()`](https://playwright.dev/docs/api/class-test#test-after-each-2)
  - [`test.afterAll()`](https://playwright.dev/docs/api/class-test#test-after-all-2)
- ユースケース
  - 公式ドキュメントの[Best Practices](https://playwright.dev/docs/best-practices#make-tests-as-isolated-as-possible)のように、テストケースごとに毎回ログインするなどの操作を行う場合に使用する。
- メモ
  - `test.beforeEach` と `test.afterEach` は、テストケースごとに実行される。
  - `test.beforeAll` と `test.afterAll` は並列実行時に注意が必要。[playwrightの`beforeAll()`, `beforeEach()`について解説](https://qiita.com/YusukeTagawa/items/f89fb61e1b304700b40a)が参考になる。

### Project Dependencies

- 公式ドキュメント
  - Global setup and teardown の [Project Dependencies](https://playwright.dev/docs/test-global-setup-teardown#project-dependencies) のセクション
- メモ
  - 全テストケースの実行前/実行後に一度だけ実行できる (Global Setup/Teardown)
- ユースケース
  - 公式ドキュメントの[Authentication](https://playwright.dev/docs/auth) のように認証情報を持った Cookie の保存する。

### Configure globalSetup and globalTeardown

- 公式ドキュメント
  - Global setup and teardown の [Configure globalSetup and globalTeardown](https://playwright.dev/docs/test-global-setup-teardown#project-dependencies) のセクション
- メモ
  - `playwright.config.ts` で `globalSetup` と `globalTeardown` のプロパティを設定することで、全テストケースの実行前/実行後に一度だけ実行できる (Global Setup/Teardown)

### Fixture

- 公式ドキュメント
  - Fixtures の [Execution order](https://playwright.dev/docs/next/test-fixtures#execution-order) のセクションが実行順序の参考になる。
- メモ
  - `await use()` の前後がそれぞれ前処理と後処理になる。
  - `Fixture` が test と hooks に呼び出された場合にのみに実行される。
  - `Fixture` を `string[]` などとすると `test()` 内で変数を追加して、後処理でその値を参照することができる。以下実装例。

    ```typescript
    import { test, expect } from "@playwright/test";

    type MyTestFixture = {
      sample: string[];
    };

    test.describe("Teardown with the Fixture", () => {
      test.use({
        sample: async(use) => {
          const sample: string[] = [];
          await use(sample);
          console.log(sample);
          // ["foo", "bar"]
        }
      })

      test("push value to the fixture", async ({ sample }) => {
        sample.push("foo");
        sample.push("bar");
      });
    });
    ```

<!-- zenn article id: bc1a96a3656a59 -->
Javaで「指定範囲の部分文字列を削除する」の動作を確認してみた

# 概要

Javaで「指定範囲の部分文字列を削除する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stringbuilder/index5.html

# 実装

以下のファイルを作成しました。
```JSample5_1.java
class JSample5_1{
  public static void main(String[] args){
    StringBuilder sb = new StringBuilder();

    sb.append("ABCdefGHI");
    System.out.println(sb.toString());

    sb.delete(3, 6);
    System.out.println(sb.toString());

    sb.delete(0, sb.length());
    System.out.println(sb.toString());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample5_1.java 
$ java JSample5_1 
ABCdefGHI
ABCGHI

```

# まとめ

何かの役に立てばと。
【TCA】TCAFeatureActionが使用されていない時はSwiftLintで警告を出す

# はじめに
TCAFeatureActionについては以下の記事を見てください

https://github.com/pointfreeco/swift-composable-architecture/discussions/1440

https://zenn.dev/kalupas226/articles/e214cf384a7b84

簡単にいうとActionを種類別に分けて、見やすさを向上させよう的なことです

# SwiftLintの設定
https://qiita.com/SNQ-2001/items/e202893e37898bb0c721

https://qiita.com/SNQ-2001/items/8a4920a464b0cc3203fa

https://qiita.com/SNQ-2001/items/3bd22c9444910aa60fe7

# 実装
`.swiftlint.yml`に`custom_rules`という項目を追加します
```.swiftlint.yml
disabled_rules:
...

opt_in_rules:
...

analyzer_rules:
...

custom_rules:
  check_tca_feature_action_conformance:
    include: ".swift"
    name: "Check TCAFeatureAction Conformance"
    regex: "\\s+enum\\s+Action\\s*:\\s*Equatable\\s*\\{[^\\}]*\\}"
    message: "Action enum should conform to TCAFeatureAction"
    severity: warning
```

# おわり
SwiftLintマジで便利ですね
GCPでYou cannot perform this action because the Google Cloud CLI component manager  is disabled for this installationエラーが出る

# はじめに

新人が来たのでgcloudの設定をしていたのですが、つまづいたのでまとめます

# 問題

以下のコマンドを実行したところ

```
$ gcloud components install anthos-auth
```

このようなエラーが出ました

```
ERROR: (gcloud.components.install) 
You cannot perform this action because the Google Cloud CLI component manager 
is disabled for this installation. You can run the following command 
to achieve the same result for this installation: 

sudo apt-get install google-cloud-sdk-anthos-auth
```

そこで以下をインストールしました

```
$ sudo apt-get install apt-transport-https ca-certificates gnupg
```

そして再度同じコマンドを実行すると同じエラーが出ました

```
ERROR: (gcloud.components.install) 
You cannot perform this action because the Google Cloud CLI component manager 
is disabled for this installation. You can run the following command 
to achieve the same result for this installation: 

sudo apt-get install google-cloud-sdk-anthos-auth
```

# 解決方法

英語を読めばわかります。
意訳すると

>componentは使われなくなったのでその代わりに以下のコマンドでインストールすれば同じ結果が得られるよ

なので`apt-get install`すれば終わりでした

# おわりに

とりあえず英語呼んでエラーが何をいっているのか確認すべきでした
Djangoでアプリ開発〜超絶初級編〜

## Django使える人かっこいい

ということでお勉強。
まずは開発できる環境を作りたい。

### 開発用サーバーを立ち上げる

以下の魔法の言葉をターミナルに書き込む。
```django
django-admin startproject フォルダー名
```
これにより今いるディレクトリ下に任意のフォルダーを作ることができる。今回はやるべきゲームが溜まりすぎているのでそれを管理するアプリでも作りたいなと考えている。
中身は以下のようになっている。便利だね。
```
todo_game/
├── manage.py
└── todo_game
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
```

続いて言語とタイムゾーンを日本にする。

```django
LANGUAGE_CODE = "ja"

TIME_ZONE = "Asia/Tokyo"
```


マイグレーションファイルをデータベースに適用するための操作を行う。デフォルトはSQLiteらしい。SQL全然わからないのでとりあえずこのまま始めた。

```
% python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
```

準備は完了したはず。アプリケーションが動くかどうか試すために以下のコマンドを入力。
```
python manage.py runserver
```
すると、、、
```
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 06, 2023 - 08:19:53
Django version 4.2.2, using settings 'todo_game.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

いい感じじゃん！出力されたURLを押すと以下のサイトに飛んだ。開発用サーバがしっかり立ち上がったのでここからコードを書いてアプリを作っていくぜ。ちなみにポート番号はデフォルトで8000らしい。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444528/29f8d7b3-acc0-e8bd-5c73-679a7612ed6c.png)
JavaScript超初心者　これから参考にする教材一覧


##  はじめに
未経験からフロントエンドエンジニア目指してます25歳女です。
今日からJSの基礎文法を学び始めたばかりです。
JavaScript超初心者が使用する予定の教材を載せます。

こういうのは、終わってから振り返るのが多いかもですが、自分の記録用として自分のために書きます。

同じようにJavaScriptの学習を始めようと情報を集められている方の参考になれば幸いです。

※使用教材が多く、ツヨつよエンジニアの皆様は遠回りだと感じられるかもしれないですが、見守ってくださると嬉しいです。（何かアドバイスやおすすめ書籍の情報あればコメントくださると嬉しいです。）

もう10月ですが、年内までにしょぼくてもいい（できればモダン技術を使用した）ポートフォリオをなんとかして作成します。ほんまに焦ってます！！！

がんばるます！！！！



#### 使用予定の教材

##### 教材

paizaラーニング
(https://paiza.jp/works/js/primer/beginner-js1/12001/1)

基礎が定着しやすい。


[JavaScriptをとことんやってみよう【超初心者から脱初心者へレベルアップ】【わかりやすさ重視】](https://www.udemy.com/course/js-beginner/?utm_source=adwords&utm_medium=udemyads&utm_campaign=LongTail_la.JA_cc.JP&utm_content=deal4584&utm_term=_._ag_107181210924_._ad_452531407125_._kw__._de_c_._dm__._pl__._ti_dsa-930814700879_._li_9053347_._pd__._&matchtype=&gclid=CjwKCAjw4P6oBhBsEiwAKYVkq8G5dAcgbCbOghVRMyGvga7r9KRvR-2CW_RLO_xSQ3wF-F9vNwBIIRoCTfQQAvD_BwE)

こちらの動画でJavaScriptの基礎を学ぶ。動画なので頭に入ってきやすい。


[JavaScript Primer](https://jsprimer.net/intro/)

より深く理解するためにこちらにざっと目を通して読む。教科書のように使う。



[現代の JavaScript チュートリアル](https://ja.javascript.info/)

https://ja.javascript.info/




[確かな力が身につくJavaScript「超」入門 第2版]
(https://books.rakuten.co.jp/rb/16014712/)

こちら実践的な学習ができそうなのでアウトプット用に使用いたします。


#### その後
Todoアプリなど作ってみる。
カレンダーやミニゲームを作る
動きのあるホームページを調べながら実装する

##### プログラミング学習の際に気を付けること、心がまえ

完璧に暗記、理解しようとしない。
暗記するくらい反復するのはやめる。
アウトプットする時に辞書のように使えば良い。
学習はアウトプットを意識する。
全てを理解しようとしない。

参考:[【爆速で成長できる】正しいプログラミング勉強法](https://youtu.be/A2Ca0crC9wM?si=eivk9KETRudj-wIu)

##### コードを書くときにそういえばあんなことが本に書いてあったなと思い出せばおっけ。
[vue.js3]非同期処理を理解するにはpromiseの使い方を理解する

## 初めに
非同期処理は慣れるまで時間がかかるものです。
私が後輩に非同期処理について説明するときに、スムーズに伝えることができなかったのでメモすることにしました。

## 非同期処理のコード例

```js
const executeApi = async (
  currentPath = null,
  method = "GET",
  body = null,
  tokenKey = cookieIdTokenKey
) => {
  const options = {
    method,
    headers: getAuthHeaders(tokenKey),
  };
  if (body) {
    options.body = JSON.stringify(body);
  }

  return new Promise((resolve, reject) => {
    fetch("hoge", options)
      .then((response) => {
        if (!response.ok) {
          if (response.status === 401) {
            deleteAuthToken();
            return response.json().then((error) => {
              reject(error.message);

              router.push({
                path: "/login",
                query: currentPath ? { redirect: currentPath } : {},
              });
            });
          }
          return response.json().then((error) => reject(error.message));
        }

        response.json().then((responseJson) => resolve(responseJson));
      })
      .catch((error) => {
        reject(errorMessages.networkError);
      });
  });
};
```

・```async```は、async前の関数はpromiseを返すことを宣言している

・```fetch```自体が```promise```を返すので、```fetch```の```primise```が```resolve```を返せば```.then```の処理が走り、```reject```を返せば```.catch```が走る。

・fetchの.thenか.catchの中で、resolveやrejectは、```return new Promise((resolve, reject)```で受け取る

#### promiseがどこで返されるのか理解できれば追うのは容易です。

## 使用例
同ファイル内で昨日ごとに引数を設定してexecuteApiをインスタンス化し、別ファイルで使えるようにexportしておく

```js
const login = (body) => executeApi("login", null, "POST", body);

export default {login}
```

別ファイルで使いたい時は以下のようにする
```js
const login = async () => {
  const data = {
    email: email.value,
    password: password.value,
  };
  loading.value = true;
  api
    .login(data)
    .then((response) => {
      if (response === "Aborted") {
        return;
      }

      const redirectPath = route.query.redirect;
      router.push(redirectPath || "/");
    })
    .catch((errorMessage) => alert(errorMessage))
    .finally(() => (loading.value = false));
};
```
api.login(data)はpromiseを返すので、resolveなら.thenでrejectなら.catchが走る
Ruby  「？」と「：」を使った条件演算子

スクールのテキストの中の問題で
```
score = 50
battle = score < 70 ? "勝ち" : "負け"
p battle
```
の結果を考えましょう、というのがあった。

何これ、「？」とか「：」とか、知らん知らん知らん。。。


調べてみると、伊藤淳一さんの本にバッチリ同じようなものが載っていた！

### [　式 ？ 真だった場合の処理 : 偽だった場合の処理 ]
とのこと。
なので、上記コードでbattle部分への代入箇所を除くと、下記コードのようにも書き換えられる、とのこと。
```
score = 50
if score < 70
 "勝ち"
else
　"負け"
end
```
おぉーそうなんだ、なるほど！

なので、今回は、50＜70、は正しく、true、で真だった場合の処理にあたるので、
```
score < 70 ? "勝ち" : "負け"
```
は、「勝ち」となり、
変数battleには、「勝ち」が代入される！！


ちなみに、ifを用いた書き方とどちらを使用した方が良いかの判断は、コードの可読性を考慮してその時々によって使い分けると良いそうです！！

以上！！
今日も、少しづつ学んで成長できました〜！！