OmniAICreator/Qiita-1.07M huggingface dataset:
[入門] ソフトウェアテスト　（メモ）


ブラックボックステスト
1. 記事作成理由、
　・共同開発で初のソフトウェアテスト実施に取り組みにあたり、適切にテストケースを絞り込む必要がある。
　・保守運用向上の一環として、初めてのテスト設計とテスト実施に取り組んでいるため。

2. 参考文献
以下の図書を参考に本記事を作成。
高橋寿一 著、株式会社翔泳社、「知識ゼロから学ぶソフトウェアテスト」、2013年12月
AmazonのURL：https://www.amazon.co.jp/%E7%9F%A5%E8%AD%98%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88-%E3%80%90%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E9%AB%98%E6%A9%8B-%E5%AF%BF%E4%B8%80/dp/4798130605/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1581396780&sr=8-1

3. 内容
3. 1. 目次
参考文献の目次を以下に示す。

１章：はじめに
２章：ソフトウェアテストの基本（ホワイトボックステスト）
３章：エンジニアが最もよく使う手法（ブラックボックステスト）
４章：探索的テスト
５章：機能あらざるもののテスト、最難関のテストに挑む（非機能要求のテスト）
６章：ソフトウェアテスト運用の基本（テスト成功の方程式）
７章：ソフトウェア品質管理の基本（ソフトウェア品質のメトリックス）
８章：テストの自動化という悪魔（なぜ自動化は失敗するのか）
９章：それでもテストがうまくいかない人へ



3. 2. テスト担当者心得
a)バグを全部見つけるのは無理だと心得よ（Cem Kaner）
ソフトウェアは十分複雑な工業製品。

b)バグは特定の部分に偏在している。
一説にはバグの47%は、プログラムの4%に偏在しているという。

c)ソフトウェアで重要なのは、どの部分にバグが出やすいのか、
そこにどのようなテスト手法を適用すれば
十分な品質を得られるかを知ることである。
闇雲にやるのではなく、バグが起きそうな場所を重点的にやる。（２:8の法則）

d)「品質向上のための投資は、投資額が修正にかかる費用を超過するか、『もっとマシなことをすべきだ』と誰か言い出すまで増加し続ける。」
完璧なソフトウェアは作れないが、適切な品質を担保することで「十分な」品質をもつソフトウェアを作る。

e)テストコードを書ききるのは学生でもできるが、テストケースを書き切るのは難しい。
以下のプログラムを例に、テストケースを書き切れるかどうかが重要。

<例題>
「このプログラムでは、ユーザーが三つの整数を入力します。この三つの値は、それぞれ三角形の三辺の長さを表すものとします。
　プログラムは、三角形が
　　不等辺三角形
　　二等辺三角形
　　正三角形
のうちのどれであるかを決めるメッセージを印字する。
このプログラムをテストするのに十分と思われる一連のテストケースを書いて下さい。」

答えは、参考文献を参照ください。

3. 3. ホワイトボックステスト
・プログラムの論理構造が正しいかを解析するテスト
・制御パステストは、カバレッジ率をとるために使われるテストであるため、基本的に実施。
　　ステートメントカバレッジ・・・処理単体のテスト。実施は簡易だが、条件漏れなどに対応しきれない。
　　ブランチカバレッジ・・・分岐をテスト。テストケース数が増えるのが欠点。
・カバレッジ基準を設けて、テスト計画を立てる。目処は以下の通り。
　a) 通常の商用テストならば60~90%。
　b) ヒューレットパッカード社の調査では、高いと80%。低いと20%。

3. 4.　ブラックボックステスト
・ソフトウェアは、以下の四つから構成される。
　a) 入力処理
　b) 出力処理
　c) 計算
　d) データ保存

・同値分割法と境界値分析は、a)入力処理とb)出力処理をチェックできる。
・複雑な入出力のためのテストとして、ディシジョンテーブルテストがある。
　全ての入力の組み合わせを表にし、その入力に対する動作もしくは出力を明記する。

　表には、
　1.状態
　2.ルール（状態の組み合わせ）
　3.動作

・状態繊維テストは、GUI、オブジェクト指向ソフトウェア、通信プロトコルテストに有用。
・テストでのバグの発見率は60%程度が現実。とっとと60%のバグを見つけて、そのほかのバグがなぜ発生したか、そしてどうやって防止するかに時間を費やすのが有用。

3-5.　テストプランの書き方
・テストプランのテンプレートは、「IEEE 829」を使われることが多い。
・テストケースは、再現性が高くないとダメ。ツールを使うと楽。
　ツール例：Zephyr
・テストケース数は、10~15行に一つ程度が多い。（日立ソフト）

3-6. 　テスト自動化
　　・MS-TEST:　自動化というのは、テストの仕事の成果をアピールする上で非常にわかりやすいメリット
　　・ただテスト自動化で何を正解として解を求めるか人間が意思決定するので知識・判断が問われる。

　
3-7. メモ
　　・テスト標準化：ISTQB（International software testing qualifiactions board)
　　・ https://www.istqb.org/
　　・テストプログラム儀淳団体から勉強するとわかりやすかった。


4.まとめ
学生ながらにソフトウェアテストとはどのような取り組みなのか実験的にアクションすることができました。バグにもレベル分けする習慣化やサンプリングテストの手法を習慣的に行うことでソフトウェアテストを意識した開発ができると思いました。まだまだ、慣れないことばかりでわからないので日々失敗し学んでいきたいです。
特徴量エンジンKaskadaの基本構成と２通りの利用方法

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。


# Kaskadaの構成と実行環境


ここでは、Kaskadaを利用する際の構成について説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/c913203b-5d25-cc7b-519c-79f478058b29.png)



## 基本構成

Kaskadaの基本構造は、**マネージャー**、と**エンジン**というサーバープロセスからなります。そのプロセスに対する操作をKaskada　**CLIコマンド**を介して行います。
その際に、テキストファイルに記載されたFenlプログラムを用います。

## コマンドライン利用/システム統合
このような実行時に解釈される独自言語とOSレベルのコマンドとの組み合わせにより、プログラミング言語を問わず、システム統合を行うことが可能になっています。

### ログ

Kaskada エンジンとマネージャーが生成するログ ファイルはユーザーのホーム フォルダーの下の以下の場所にあります：

`~/.cache/kaskada/logs`。

サービス (エンジンとマネージャー) ごとに、起動タイムスタンプが接頭辞として付けられた標準出力ログと標準エラー ログが作成されます。

以下は、エンジンとマネージャーの 2 つの別々の実行の例です。

```
/home/<ユーザー名>/.cache/kaskada/logs
§── 2023-05-03T15-53-45-engine-stderr.log
§── 2023-05-03T15-53-45-engine-stdout.log
§── 2023-05-03T15-53-45-manager-stderr.log
§── 2023-05-03T15-53-45-manager-stdout.log
§── 2023-05-04T12-12-33-engine-stderr.log
§── 2023-05-04T12-12-33-engine-stdout.log
§── 2023-05-04T12-12-33-manager-stderr.log
§── 2023-05-04T12-12-33-manager-stdout.log
```

標準出力ログにはアプリケーションの出力 (情報、警告など) が含まれ、標準エラーログには実行中に発生したエラーが含まれます。



## Python環境

また、システム統合ではなく、Kaskadaの出自である、機械学習をデータサイエンティストが自身の環境で行うようなケースにおいては、Pythonライブラリが提供されています。

この場合、マネージャーや、エンジンの軌道は、暗黙理に背後で行われるため、単にPythonプログラムとして実行可能です。

また、JupyterノートブックのためのFenl言語用のIpythonマジックコマンドが提供されているため、直接Fenlプログラムを実行可能です。

### 実装言語
なお、Kaskada本体は、Rustで実装されています。

### 参考情報


本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/troubleshooting/logs.html
【DeviseTokenAuth】認証トークンの送受信に Cookie を使用する方法【Rails】

## DeviseTokenAuthの設定を変更する

認証トークンの送受信にCookieを使用するために`cookie_enabled`を`true`にします。
`cookie`に関する設定は`cookie_attributes`に記述します。
設定項目については以下を参照してください。

https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

```rb:devise_token_auth.rb
DeviseTokenAuth.setup do |config|
 # ...

  config.cookie_enabled = true

  config.cookie_attributes = {
    http_only: true,
    secure: true,
    same_site: "None"
  }

 # ...
end
```

`cookie_attributes`に`expires`を設定するとサーバー起動時に設定されてしまうため、`set_cookie`の処理を変更してヘッダーの`expiry`の値が設定されるようにする必要があります。

```rb:参考
  def set_cookie(auth_header)
    header_expiry = auth_header["expiry"]
    cookie_options = DeviseTokenAuth.cookie_attributes.merge(
      value: auth_header.to_json,
      expires: Time.zone.at(header_expiry.to_i)
    )
    cookies[DeviseTokenAuth.cookie_name] = cookie_options
  end
```

https://github.com/lynndylanhurley/devise_token_auth/issues/1541

## cookiesを使用可能にする
APIモードでは`cookies`が使用できないため、使用可能にするために`application_controller.rb`に以下を追記します。


```rb:application_controller.rb
class ApplicationController < ActionController::API
  include ActionController::Cookies

# ...
end
```

https://github.com/lynndylanhurley/devise_token_auth/issues/1538

## フロントエンドの`fetch`を変更する

フロントエンドで`fetch`の処理に`credentials: 'include'`を以下のように追加します。
`credentials: 'include'`を設定すると`cookie`が送受信されるようになります。

```js
export async function login({ email, password }) {
  try {
    const res = await fetch(
      `${process.env.NEXT_PUBLIC_API_BASE_URL}/v1/auth/sign_in`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          email,
          password,
        }),
        credentials: 'include',
      }
    )
// ...

```

## CORSの設定を変更する
Railsの`config/initializers/cors.rb`に`credentials: true`を追記して、`origins`に具体的なオリジンを記述します。

```rb:config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "localhost:3000"

    resource "*",
             headers: :any,
             methods: %i[get post put patch delete options head],
             credentials: true
  end
end
```

## 参考

https://github.com/lynndylanhurley/devise_token_auth/issues/1281

https://github.com/lynndylanhurley/devise_token_auth/blob/master/docs/config/initialization.md


https://github.com/lynndylanhurley/devise_token_auth/pull/1453
コード確認観点

コード実装・レビュー確認時にどういった観点で確認するかをまとめてみた。

### 機能編
・　機能要件を満たしているか
・　定数を用いているか
・　将来負債になりそうな箇所はないか
・　他の人が読んだ時にわかりにくい箇所はないか
・　コメントは適切にはいっているか
・　無駄にネストが深くないか
・　早期リターンできる箇所はないか
・　読み物として作成できているか
・　パフォーマンスは検討されているか
・　機能ごとに分割されているか
・　デグレ確認はしているか

### 画面編
・　ユーザ目線でわかりにくい文言はないか
・　pxはデザインと乖離してないか
・　アニメーションの動きはデザイナーと確認しているか
・　画面幅が変わった場合の動作は適切か
・　nullの場合の挙動は問題ないか
・　表示までの時間が長くならないか
・　表示データは整合性がとれているか

### デプロイ編
・　必要なデータは揃っているか
Laravelでコンソールコマンドの作り方

Laravelでコンソールコマンドの作成方法を学んだのでアプトプットのため、記述しました。

# コンソールコマンドの作り方

### 1 コンソールコマンドファイルの作成
```
php artisan make:command TextCommand
```
上記の例ではTextCommandという名前でapp/Console/ディレクトリーに作成されます。

### 2 コンソールコマンドファイルの編集

```
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TextCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    //コマンドを記述
    protected $signature = 'text:make';

    /**
     * The console command description.
     *
     * @var string
     */
    //説明を記述
    protected $description = 'テキストファイルを作成するコマンド';

    /**
     * Execute the console command.
     *
     * @return int
     */
    //実際の処理を記述
    public function handle()
    {
        $filename = 'example.txt';
        $content = '初めてLaravelのconsoleで作成しました。';

        file_put_contents($filename, $content);
        $this->info('できたで', $filename);
        //info()の第一引数にはコンソールに表示させるメッセージを入れる,第二引数にはファイルの名前
    }
}

```
### 3 Kanelファイルに登録
app/Conbsole/Kernel.phpに今、作成したコンソールコマンドファイルを登録します。

```
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{

    protected $commands = [
        //ここ↓
        Commands\TextCommand::class,
    ];
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    //scheduleメゾットにはスケジュールなども設定することができます。
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }
}

```

### 4 コンソールコマンドを実際に実行

```
php artisan text:make;
```

これでexample.txtが一番上の階層に作成されました。


ありがとうございました！
【図解】障害から学ぶ！統計情報取得オプション（ローリング無効化）

OracleDB性能障害。原因の7割は統計情報！（主観）
統計情報取得時の機能「ローリング無効化」（デフォルト有効）も障害の一因。
この機能と回避するための重要オプション「no_invalidate」について紹介します。

# １．事象

![1-1_事象.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491580/507833d8-3388-a8e8-a8d1-4c9f8b672ec5.jpeg)

1. メンテナンスでデータ投入(10件→10,000件)。
1. 更新後はデフォルト設定で統計情報を取得。
1. サービス再開したら性能障害発生！
1. 統計情報は取得した。原因わからない。対応わからない。
あたふたしてたら障害は解消。

## DBの状態
下段はDBの状態です。
①でデータが更新され、②で統計情報が更新されます。
データと統計情報は一致。
問題なさそうですが、重要な要素がもう一つあります。
「実行計画」です。

![1-2_実行計画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491580/f726e45f-8425-deb7-ae02-4e57ac5b2c54.jpeg)


:::note
* SQL実行前に「データ」から「統計情報」を収集しておきます。
* SQLの解析に「統計情報」を利用し「実行計画」を生成します。
* SQLの実行に「実行計画」を利用し「データ」にアクセスします。
:::

実行計画はどのような状態だったのか。
何が問題だったのか。わかりますでしょうか:question:

# ２．問題

:::note alert
問題は統計情報をデフォルトの設定で取得していたこと。
:::
Oracle Database 19c のマニュアルで統計情報取得コマンド（GATHER_TABLE_STATS）を
確認すると、パラメータの中に「no_invalidate」の記載があります。
デフォルトは AUTO。ローリング無効化です。

> 統計が収集されるときの依存カーソルの無効化を制御します。パラメータの値は次のようになります。
　・　TRUE: 依存カーソルは無効化されません。
　・　FALSE: 依存カーソルは即時無効化としてマークされます。
　・　AUTO: これはデフォルト値です。ローリング無効化は、一定期間にわたってすべての依存カーソルを無効化するために使用されます。データベースのパフォーマンスに対する影響は、特に多数のカーソルが無効化される場合に軽減されます。
TRUEに設定されている場合、データベースによって依存カーソルが無効化されることはありません。FALSEに設定されている場合、このプロシージャによって依存カーソルがすぐに無効化されます。


https://docs.oracle.com/cd/F19136_01/arpls/DBMS_STATS.html#GUID-CA6A56B9-0540-45E9-B1D7-D78769B7714C


### ローリング無効化とは

実行計画が即時に無効化されず、「次の実行時から最大５時間のランダムなタイミング」で無効化します。
無効化されたら次の実行時は最新の統計情報に基づいた実行計画が作成されます。（ハードパース）
それまでは統計情報取得前の実行計画が利用されます。（ソフトパース）
統計情報取得後にハードパースの負荷を分散させるための機能です。

詳細は以下 My Oracle Support ナレッジをご確認ください。

https://support.oracle.com/knowledge/Oracle%20Cloud/2402871_1.html


# ３．原因
![1-3_障害事例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491580/b60cff49-bbc5-4b58-1f57-0551dab3beef.png)

1. デフォルト設定で統計情報を取得したため、実行計画が即時に無効化され無かった。
1. データ更新前の実行計画が利用され、実行計画とデータに乖離が発生したため性能障害発生。
　例）　データ更新前：データ量が少ないので、FULL SCAN
　　　　データ更新後：データ量が多いので、 INDES SCAN
　　　　　　　　　　　　　　　　　→　FULL SCAN となり性能障害
1. 最初の実行から５時間以内（ランダム）に実行計画が無効化（ローリング無効化）
1. データ更新後の統計情報で実行計画が作成され事象解消



# ４．正しい対応

統計情報取得時に NO_INVALIDATEオプションをFALSEにしていれば
データ・統計情報・実行計画 が一致して、障害が発生しませんでした。

```
EXEC DBMS_STATS.GATHER_TABLE_STATS ('スキーマ名','表名', NO_INVALIDATE=>FALSE );
```
![1-4_対応.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491580/45dfce58-13ec-f08d-ad2e-e0271741edea.png)



# ５．まとめ
* 特定SQLの性能障害が発生した時には3つの状態を確認しましょう。
　　１. データ量
　　２．統計情報
　　３．実行計画
* 統計情報を取得する際は、no_invalidate = false をつけて実行しましょう。
　　※実行計画を無効化しないことを無効にするので無効になります。:sweat_smile:

デフォルトはfalseの方が幸せになる人が多いと思いますが、
全然ならないですねー。


# 参考リンク
https://docs.oracle.com/cd/F19136_01/arpls/DBMS_STATS.html#GUID-CA6A56B9-0540-45E9-B1D7-D78769B7714C
PHPとLaravelでWebアプリを作る勉強をしています。一緒に学んでくれる人はいませんか？

# はじめに
現在、開発（プログラミング）について、独学ではなく副業として経験を積みたいと思っています。
## 理由
会社に入り、実務経験が積めれば良いですが、なかなか難しいです。
なので、副業で経験が積めればと思っています。

が、一人ではスキルが追い付かず、そこまでいきません。
なので、副業仲間を募集した次第です。
とはいっても、いきなり仕事に入るのはリスキーなので、関係を深めるところから入り、親しくなれればと思っています。

## 参考に
私は現在techpitやPaizaなどでPHPとLaravelを勉強しています。
ごく簡単なWebアプリを作りたいと思っています。（頭にあるのは計算機アプリ）
興味がある方はコメントください。

# 最後のあいさつ
もし、参加してくれる人がいれば、コメントください。よろしくお願いいたします。

ありがとうございました。
【Rails Nuxt.js】RailsでNuxtアプリ作成中にVSCodeのソース管理で”10K”と表示された時の対処メモ

RailsでNuxtアプリ作成中にVSCodeのソース管理で”10K”と表示された時の対処方法を記録しておきます。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者

## 結論
masterブランチのgitignoreファイルにnode_modulesフォルダを追加することで改善した。

## 詳細
10Kが表示される前の作業内容は以下の通り。

作業ブランチ内で、ルートディレクトリ直下に、frontフォルダを作成し、その中にnuxtアプリを作成し、
1. git add .
2. git commit 
3. git hub側でプルリクエストをmerge
4. ターミナルに戻り、masterブランチに戻るため、git checkout masterを実行したところ、ソース管理で10Kと表示された。

10Kの対象となっているフォルダはnode_modulesフォルダとなっていた。


## 対処方法
masterブランチのgitignoreファイルにfront/node_modules/を追記し、VSCodeを再起動することで10Kは表示されなくなった。

```.gitignore
front/node_modules/
```

## 原因
作業ブランチ内でnuxtアプリを作成していたので、masterブランチ側のgitignoreファイルにnode_modulesフォルダが無かったことが原因でした。


## おわりに
node_modulesなどはgitにcommit、pushする必要はありません。
誰かの参考になりますように。

## 参考記事
[https://qiita.com/growsic/items/b2965c0ba3b0aaae1ff8](https://qiita.com/growsic/items/b2965c0ba3b0aaae1ff8)
Tensorって何なの？

深層学習を勉強する時、私はTensorFlowを使ってモデル構築するのですが、よく考えたらTensorって何なのか言葉で説明できません。

この記事ではTensorの概略を説明できることを目的とします。

# Tensorとは
結論から言うと、Tensorとは**多次元配列**のことです。

私たちはよくデータを扱う時、スカラーやベクトル、配列を使います。要はこれらをまとめて管理するためにTensorという枠組みを用意しているだけなのです。

ここでTensorでは階という単位を用いて、

スカラー　：　０階のTensor
ベクトル　：　１階のTensor
行列　　　：　２階のTensor
三次元配列：　３階のTensor
・・・

という風に表します。メリットは〇階のTensorと言うことでデータの形をイメージできることですね。しかし二次元配列ならともかく、多次元配列なんてイメージすら出来ないですよね。そこで数式的に見てみましょう。

まず、０階のTensorの式は

~~~math
x
~~~

のみです。これはただ任意の数字があるだけですね。次に１階のtensorを見ると、

~~~math
x_i
~~~

となり、添え字の$i$が付き、何番目の成分か取り出せるようになりました。さらに２階のTensorでは

~~~math
x_{ij}
~~~

と記述できます。そもそも1階のTensorを$j$個並べたものなので、$j$個目の１階Tensorの$i$番目の成分だと理解できます。３階、４階のTensorでも同様に添え字が増えていくだけなのですが、ここで大事なのは

**D階のTensorであれば、D個の添え字をつければ表現可能である**

ちなみに添え字が後ろの方にあるほど、高次のTensorを示していることになります。（例外もあると思いますが、一般的にはそのような認識で大丈夫だと思います）

# データもTensorで表せれる
例えばグレースケールの画像を考えてみましょう。28×28ピクセルの画像であれば、

~~~math
x_{ij} (i, j = 1, ..., 28)
~~~

と表せます。各$i, j$にピクセルの黒さの値が入ってます。グレースケールの動画であれば

~~~math
x_{ijt}(t=1, 2, ...)
~~~

とでも表せます。この場合３階のTensorとなり、tはフレームです。他にもセンサーデータや音声などもTensorで表現可能であり、だからこそTensorは有用なのですね。

また、データの流れも添え字から見えてくると感じています。例えば畳み込みニューラルネットワークでグレースケール画像$s_{ij}$にn個フィルタ$f$を通す時、フィルタに添え字kを与えると、フィルタを通った後の画像は

~~~math
y_{ijk} = f_k(x_{ij})(k=1, ..., n) 
~~~

と表せます。今まで$y_{ijk}$だけ見てもよく分からなかったのですが、添え字の順番に注目するだけでも理解が進みます。

# 数学的なTensor
上記だけでも概要は理解できましたが、深層学習でもテンソル積という計算が使われることがあり違いが分かりません。そこでより数学的なTensorにも触れてみたいと思います。
※私は数学は専門外なので、概念の理解が出来ればOKとします。

そもそもテンソルには

1. 代数学における「ベクトル空間のテンソル積」
1. 物理や微分幾何における「テンソル場」
1. その他，数の高次元配列としてのテンソルなど

といった複数の意味があります。記事の初めに定義したテンソルは３番目の意味ですね。この章では1番目のテンソルについて調べてみます。

この文脈においてテンソル積とは

**２つのベクトル空間$V, W$に対して定まる新しいベクトル空間$V \otimes W$**

と定義されます。
んーこれだけだと何をしたいのか全く分かりませんね。

時間がかかりすぎるので詳細な証明は参考サイトに載せている高校数学の美しい物語さんの記事をみていただくとして、テンソル積がやりたいことは、

**ベクトルの内積を線形写像として扱いたいが、そのような特性は持たない。なので理想的な計算ができるようなベクトル空間$V \otimes W$を作り、内積を線形写像とみれるようにする**

これがテンソル積の目的なのですね。線形写像の定義を確認すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703789/b769f18d-d007-7ec7-3e4f-1e35d0c74cef.png)
[引用]https://mathlandscape.com/linear-map/

とあります。

確かに線形写像として扱えるなら計算がとても楽になりそうですね。

# まとめ
Tensorという抽象的なことについて、より具体的な説明ができるようになりました。
しかしテンソル積の目的などはまだハッキリと分かっておらず、線形代数を習い直さないとなーと感じました。


# 参考サイト
https://manabitimes.jp/math/1845

https://www.hellocybernetics.tech/entry/2016/12/01/223834
＠Builder

## @Builder とは

:::note
**Javaのライブラリで提供されているアノテーションの一つ**
:::

### @Builderアノテーションをクラスに付ける

ビルダーパターンを自動的に実装するためのコードを生成できる

### ビルダーパターンとは
オブジェクトのインスタンス化と初期化を容易にするためのデザインパターン

#### 複数のコンストラクタパラメータを持つクラスのインスタンスを作成する場合
コンストラクタのパラメータを1つずつ指定する必要がある

#### パラメータが多い場合や一部のパラメータがオプションである場合
コンストラクタの呼び出しは冗長で複雑になる


## @Builderアノテーションを使用すると自動生成されるビルドパターン

- **ビルダークラスが生成される**
オブジェクトのインスタンス化と初期化のためのメソッドを提供

- **ビルダークラスの各フィールドに対応するメソッドが生成される**
フィールドの値を設定するためのチェーンメソッドを使用してオブジェクトを構築できる

- **ビルダークラスのbuild()メソッドが生成される**
最終的なオブジェクトのインスタンスがリターンされる

## @Builderアノテーション使用例

```java
import lombok.Builder;

@Builder
public class Person {
    private String name;
    private int age;
    private String address;
}

// 使用例
Person person = Person.builder()
                      .name("Alice")
                      .age(25)
                      .address("Tokyo")
                      .build();
```


**@BuilderアノテーションがPersonクラスにつけられている
↓
Personクラスのビルダーパターンが自動的に生成
↓
Person.builder()メソッドを呼び出す
↓
ビルダーオブジェクトを取得
↓
チェーンメソッドを使用してフィールドの値を設定
↓
最終的にbuild()メソッドを呼び出すことでPersonオブジェクトを構築**
蓄電池のメリットデメリット

デメリット
・高額な初期費用がかかる
・寿命がある
・貯められる電気容量に制限がある
・売電価格が下がる可能性もある

メリット
・電気代が安くなる
・停電・災害時に電気が使える
・太陽光発電で作った電気を貯められる

詳しく読みたい方はこちら
https://no-wall.co.jp/media/
ドメイン駆動設計(DDD)・オニオンアーキテクチャとは？

# はじめに
後輩から「調べたのですが、dddがよくわからなくて、、、」と相談を受けました。が、、、

**「やばい、自分詳しく説明できない」**

と思ったので、自分なりにわかりやすくまとめていこうと思います。

# ドメインとは
ソフトウェア開発におけるドメインは、**「プログラムを適用する対象となる領域」** を指します。
物流システムを例に出すと、トラックや、倉庫、輸送手段などがドメインに含まれます。またそれにあたる**専門知識等** を指したりします。

# ドメイン駆動設計とは
以下、Chatgptから引用

>ドメイン駆動設計（Domain-Driven Design、略称：DDD）は、ソフトウェアの設計手法の一つであり、複雑なビジネスドメインを効果的にモデリングするための手法です。DDDは、ドメインの理解とモデリングを中心に据え、ビジネスドメインの要件を反映させた柔軟で保守性の高いソフトウェアを開発することを目指します。


以下、wikipediaから引用
>ドメイン駆動設計（英語: domain-driven design、DDD）とは、ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である[1][2]。オブジェクト指向プログラミングに関しては、ソースコード（クラス名・クラスメソッド・クラス変数）の構造と名称がビジネスドメインと一致させる必要があることを意味する。

端的にまとめると、ドメイン（対象となるビジネス領域の知識等）を把握した上で、その知識を基にドメインモデルを構成し、そのモデルを動くソフトウェアに落とし込むことだと思います。

# オニオンアーキテクチャとは
オニオンアーキテクチャは、ドメイン駆動設計（Domain-Driven Design, DDD）に基づいたソフトウェアアーキテクチャの一種です。オニオンアーキテクチャは、ソフトウェアの内部構造を円環状に分割し、ビジネスドメインのコアロジックを中心に配置することを特徴としています。
![スクリーンショット 2023-07-10 8.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696017/abf777d5-ddf9-f82b-0e84-b234910d2da8.png)
[参考](https://qiita.com/cocoa-maemae/items/e3f2eabbe0877c2af8d0)

# 前提
オニオンアーキテクチャを理解する上で、前提となる知識をあげます。

## その他のアーキテクチャ
dddでは下記4つのアーキテクチャが主流になっています

- レイヤードアーキテクチャ
- ヘキサゴナルアーキテクチャ
- オニオンアーキテクチャ
- クリーンアーキテクチャ


## オブジェクト指向
オニオンアーキテクチャは、オブジェクト指向を前提としたアーキテクチャです。

## 依存関係逆転の法則
オニオンアーキテクチャでは、依存関係逆転の法則が利用されています。(SOLIDの五原則の1つ)

依存関係逆転の法則とは、高レベルのモジュールが低レベルのモジュールに依存するのではなく、抽象化に依存すべきであるという考え方です。

- 高レベルモジュール（上位レベル）：注文処理モジュール
- 低レベルモジュール（下位レベル）：データベースアクセスモジュール

注文処理モジュールをデータベースアクセスでなく、抽象化に依存するのようにすることで、データベースへのアクセスの方法(使用するDBの変更等)の切り替えなどが容易になります。(つまりこういう情報があればいいよ〜と広義にすることで、アクセス方法等に依存しなくなる)
**依存関係逆転の法則を適用することで、高レベルのモジュールは低レベルの詳細に依存せず、抽象化に依存することで、柔軟性と保守性を向上させることができます。**


# 各層の役割
以下に図で出てきた、各層の役割について説明します。

## ドメインモデル層
- ビジネスドメインのコアロジックやビジネスルールを表現する。
- ドメインモデルはエンティティ、バリューオブジェクトなどで構成され、ビジネスオブジェクトとその振る舞いを表現する。

E.g.`ドメイン層`

## ドメインサービス層
- ドメインモデルが持つ責務の一部を凝集させている
- ドメインモデルに直接関連する操作や、複数のドメインオブジェクトにまたがる操作を提供
- ドメインサービスは、ビジネスルールやビジネスロジックの実装を含む場合があり、ドメインモデルの一部として表現されることもある

E.g. `ドメインサービス層`

## アプリケーションサービス層
- アプリケーションの振る舞いを実装
- ユーザーインターフェースや外部APIとのやり取りを処理し、ビジネスロジックの組み立てやドメインモデルへの操作を行う
- アプリケーションサービスは、ドメインモデルの操作の組み合わせによってユースケースを実現する。
- トランザクションの管理やエラーハンドリングも担当

E.g. `サービス層・アクション層・インターフェース層`

## インフラストラクチャ層
- データベース、キャッシング、外部サービス、ログ出力、メッセージングなど、外部要素とのやり取りを担当
- データの永続化や取得、外部サービスへのリクエストなど、ドメインモデルやアプリケーションサービスの要求を満たす役割

E.g.`リポジトリ層`

# ドメイン駆動設計を用いることのメリット
## 1. ビジネスドメインの明確な理解
ビジネスのルールや概念をモデル化し、ドメインモデルを作成することで、開発者はビジネスドメインに対する理解を深めることができます。これにより、ソフトウェア開発とビジネスのコミュニケーションや協力がスムーズになります。(エンジニア以外の方でも理解できることを目指す設計方針でもあります)

## 2. 高い柔軟性と保守性
ドメインモデルを中心に各層の責務を明確化しているため、ソフトウェアの柔軟性が向上し、変更に対しても強くなります。また、ビジネスの要件の変更に対しても迅速に対応できるため、保守性が高くなります。

## 3. テスト容易性
ビジネスドメインのルールや振る舞いをモデル化するため、ユニットテストや統合テストの作成が容易です。ドメインモデルやドメインサービスは、ビジネスロジックを集約しているため、それらを単体テストすることで、ビジネスの要件を確実に満たしていることを検証できます。

# 参考文献
- [[DDD]ドメイン駆動 + オニオンアーキテクチャ概略](https://qiita.com/little_hand_s/items/2040fba15d90b93fc124)
- [オニオンアーキテクチャとは何か](https://qiita.com/cocoa-maemae/items/e3f2eabbe0877c2af8d0)
- [依存性の逆転のいちばんわかりやすい説明](https://zenn.dev/naas/articles/c743a3d046fa78)
- [【SOLID】依存関係逆転の原則を完全に理解したい](https://qiita.com/k2491p/items/686ee5dd72b4baf9a81a)
DockerのMySQLで日本語を使う方法

DockerでFastAPI + MySQLでAPIの開発中に実際のDBを見てみようとselectしてみたら

```
mysql> SELECT * FROM TASKS;
+----+--------------+
| id | title        |
+----+--------------+
|  1 | ???????????? |
|  2 | ???????????? |
|  3 | ???????????? |
+----+--------------+
3 rows in set (0.01 sec)
```

デフォルトのままだと文字コードがutf8mb4に設定されていなく、かつ今回やった方法をピンポイントで紹介している記事がなかったので書きます。

## やり方(結論)
docker-compose.ymlがあるディレクトリにdb用ディレクトリを切り、my.cnfを配置してコンテナ内にマウントする、これだけです。

## 手順
### 1. my.cnfを作成する
```
(project root)
├── Dockerfile
├── docker-compose.yaml
├── poetry.lock
├── pyproject.toml
├── api
│   ├── __init__.py
│   └── ...
└── db
    └── my.cnf ←追加する
```
自分の場合は新しくディレクトリを切って`/db/my.cnf`を追加しました

### 2. my.cnf内に必要な設定を記述する
```my.cnf
[mysqld]
character_set_server = utf8mb4
collation-server=utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
```

### 3. コンテナにマウントしてdocker-compose up

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    platform: linux/x86_64
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: 'demo'
      TZ: 'Asia/Tokyo'
    volumes:
      - mysql_data:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf #日本語化対応
    command: --default-authentication-plugin=mysql_native_password  
    ports:
      - 33306:3306
volumes:
  mysql_data:
```
dbのvolumesに`/db/my.cnf:/etc/mysql/conf.d/my.cnf`を追加します。
こちらを追記した後、`docker-compse up`します


### 4. 動作確認
```
mysql> select * from tasks;
+----+--------------------------------------+
| id | title                                |
+----+--------------------------------------+
|  1 | クリーニングを取りに行く             |
|  3 | クリーニングを取りに行く             |
|  4 | クリーニングを取りに行く             |
+----+--------------------------------------+
3 rows in set (0.01 sec)
```
無事日本語化対応できました。

一応文字コードの設定も見ておきます
```
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.06 sec)
```

## 参考にさせて頂いた記事
[基礎MySQL ~その２~ my.cnf (設定ファイル)
](https://www.wakuwakubank.com/posts/412-mysql-char/)
[文字コードの確認と設定方法
](https://www.wakuwakubank.com/posts/412-mysql-char/)
NFCを使ったNFTとの使い方

# キャッチコピーは”持ち運べるNFT”
NFCの機能を使って、あたかもNFTを持ち運びできるようなツールをサンプルで作りました。

## 実装動画
NFCの中に対象のウォレットアドレスを入れておいて、NFCを読み取れる端末を使ってウォレットアドレスを取得します。
その後は取得したウォレットアドレスに対して処理をするツールを作ればOK！

https://twitter.com/dtomida/status/1675714422927663106


## フローイメージ
### 現行存在するNFCの使い方
![no1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/f520b7ee-e8b4-d058-31fa-e6fdeff2c00f.png)
１．サービス提供者がNFCを用意する。
２．NFCの中にはURLを書き込みしておく。
３．利用者がNFCを読み込む。
４．サイトが表示される。
５．サイトでアクションする（ウォレット接続等）
６．認証したウォレットアドレスを基に、NFTの表示やNFTのトランスファー

### 提案するNFCの使い方
![no2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/5d6827c5-f2fd-24e5-56c1-221a3a77aa09.png)
１．サービス提供者または利用者がNFCを用意する。
２．NFCの中にはウォレットアドレスを書き込みしておく。
３．サービス提供者がNFCを読み込む。
４．認証したウォレットアドレスを基に、NFTの表示やNFTのトランスファー

### 比較表

|内容|現行のNFC利用|提案するNFC利用|
|:-|:-|:-|
|NFCの中身|URL等|ウォレットアドレス|
|ウォレット接続|必要|不要|
|NFC読込|サービス利用者|サービス提供者|
|メリット|NFCが読める端末があればOK<br>ウォレットアドレスの個人認証ができる|１枚のNFCでいろんなサービスを利用できる<br>個人でも簡単にNFCカードが作れる|
|デメリット|ウォレット認証が必要<br>１枚のNFCカードで１つのサービスが対象|なりすましができる|

## まとめ
ブロックチェーンや仮想通貨を意識しない方法でNFTが触れるようになれば、もっと世間に広まっていくのではないでしょうか。


## 開発言語
WebサイトはPythonのFlask、Javascriptのウェブ NFC APIを利用
今回のWebサイトの場合は、Androidのみ対応となっていますが、アプリ化等することにより、サービスの幅は広がるかと思います。

https://developer.mozilla.org/ja/docs/Web/API/Web_NFC_API
Chromium 系 Browser の Version 109 のリリースが継続されていた理由

# それなりに重要な追記 (2023/11/30)：本記事について
2023/10/10 を以て、Windows Server 2012 が EOS を迎えたため、
最新情報としては本記事に価値はありません。
(タイトルも "継続されている" から "継続されていた" に変更済み)

ご留意ください。 (なお、ESU への Edge サポートはされません)

# これは何？
Chromium のライフサイクルは最新バージョンを含めた三世代です。
2023/7/10 時点では最新のバージョンは 114 系統ですが、Windows に関しては EOL 済みの Version 109 の修正が継続リリースされています。
この理由です。

# 結論
Windows Server 2012 系統は、最終対応バージョンが 109 であるため、 OS のサポート終了まで対応するための対処です。
OS の EOL までこの対応は継続されます。

# 証左
・Chrome
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/17e08af4-145e-d28a-5456-f5b384109364.png)

・Microsoft Edge
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/7e3ae849-0bc0-c29f-4c5d-492de0e4f699.png)

# 補足
この対応はあくまでセキュリティに関する重大な問題に対してのみのリリースであり、Version 110 以降の機能が実装されることはありません。

# 背景の補足
[Microsoft Edge and WebView2 ending support for Windows 7 and Windows 8/8.1; Windows Server 2012 and Windows Server 2012 R2 support extends to October 2023](https://blogs.windows.com/msedgedev/2022/12/09/microsoft-edge-and-webview2-ending-support-for-windows-7-and-windows-8-8-1/)
をどうぞ。

# 出典
・[Chrome ブラウザのシステム要件](https://support.google.com/chrome/a/answer/7100626)
・[Microsoft Edge でサポートされているオペレーティング システム #Windows Server](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-supported-operating-systems#windows-server)
商談フェーズ→取引先責任者に反映させる


# 全体

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/02c40f6c-d855-8cdf-c5a4-2f66a0ee213a.png)

# レコード　変数 contact_single

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fb28a4c3-52da-6659-eb99-3cdc8c18ce8d.png)

# レコード　コレクション変数 Contacts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8c36cce9-388d-1878-2afa-448a2f68a713.png)


# 開始を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5f992f9a-83f6-062e-9815-0167b960309f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ce4e124b-4e13-3444-bd11-78297ad2e22c.png)


```
OR(
ISNEW(),
ISCHANGED({!$Record.StageName})
)
```



# updateAccount

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0e906f04-a809-6b5e-72fb-346027511f05.png)


# getContacts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/95116601-b169-4f9e-0b57-2897cc2e6df5.png)

# LoopContact

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/378a1fb7-c081-5b64-10e4-26b10c0009ff.png)

# set_contact_single

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/12754759-fc63-e6a9-e3f7-f15843e07c22.png)

# add_contact

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f0255136-6d4e-b654-8a8f-bf40dce98236.png)


# updateContcts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a893a210-c433-983e-66d7-135ff93102a9.png)
カスタムDockerイメージを、リアルタイムで変更する方法

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/1c73e475-3161-786c-6dd8-2b50293e14c0.png)



```Dockerfile:Dockerfile
    
    FROM node:lts-alpine3.18
    
    WORKDIR /usr/src/app
    
    COPY . /usr/src/app/
    
    RUN npm install
    
    ENV PORT=3000
    
    EXPOSE 3000
    
    CMD [ "npm", "run", "dev" ]
        
```

```terminal:terminal

    docker build -t "image-name" .

    docker run -d -v ${pwd}:/usr/src/app:ro -p 3000:3000 --name "container-name" "image-name" 

    docker exec -it "container-name" sh

    docker rm "container-name"

    docker rmi "image-name"
```
[Rails初学者] RailsConsoleでDBにレコードを追加したり削除したりする

## はじめに
railsでバックエンドを開発していて、DBにすでに値がある場合や、元々存在しない場合の二つの動きを検証したくて、rails consoleを触っていたところ、DBをいじることができないかと思ったので調べてみました。

#### 実行したコマンド

```
$ bundle exec rails c
```


## レコードを追加する

```
$ pry(main)> テーブル名.create(カラム名："カラムの値")
```
今回、Hogeというテーブルのidというカラムとnameというカラムに値を入れて追加したいと思っています。
なので、以下を
rails consoleで実行します。

```
$ pry(main)> Hoge.create(id： 1, name: "hogehoge")
```

#### 結果

```
 id: 1,
 name: "hogehoge",
 created_at: 0000000000000000000000000000000 JST +09:00,
 updated_at: 0000000000000000000000000000000 JST +09:00>

```
いけた。

## レコードを削除する
上で追加したレコードを削除するために以下を実行します。

```
$ Hoge.find(id).destroy
```
上で追加したid=1のレコードを削除するので、(id)の箇所に1を入れます。

```
Hoge.find(1).destroy
```

#### 結果

```
Hoge Destroy (1.8ms)  DELETE FROM `hoge` WHERE `hoge`.`id` = 1
TRANSACTION (5.2ms)  COMMIT
```

いけた。

destroyメソッドを使うと関連するデータも削除されてしまうので、注意が必要です。
そんな時はdeleteメソッドを使用します。
ChatGPTにArduino IDEにおける loop()関数について質問してみた。(備忘録)

# ことの顛末
自分がソフトウェア開発を仕事でするようになり、既に40年を超えており、当初はOSなんかないマイコンのプログラムをゼロから作っていました。
いまは様々な開発環境が存在し、その中でも初心者でも入門しやすい
Arduino IDE が存在します。
ここ数年、この開発環境でプログラムを書くことが増えてきており、本当に便利になったと思っています。
でも、開発を続ける中で
「これ、なにか別のプログラムがどこかで動いているんじゃないか？」
と感じることが出てきています。
実際、マイコンプログラムの場合は、最初に様々な初期設定プログラムを書いてマイコンの状態を準備させ、その後に print("hello wold")みたいなプログラムが実行できます。
だから、容易に「めんどくさいことはみんなArduino IDEがやってくれるんだな」と思っていました。
これまでリアルタイム処理は自分でタイマー割り込み使って、イベントを監視し、イベント条件が発生した時、対応するプログラムを処理するという感じでプログラムを作ってきました。
今回、Arduino UNO R4 を購入したことで、FreeRTOS を使ってみようと考えました。
で、サンプルプログラムを読んで、え？これどうなってるん？と最初に感じたのは
loop()関数です。
ここに書くプログラムって ``for( ; ; )`` や ``do{}while();`` 等の無限ループという記述はしないんですよね。
つまり、見た目は一回処理したら抜けるプログラムなんです。
で、loop()の最後の命令と、最初の命令の間に、なにかやっているんじゃないか？と考え
他に聞く人もいないのでChatGPT先生に聞いてみました😁
# ChatGPT先生への質問
Arduino IDE における　loop() について、通常の関数の記述であれば、繰り返さないプログラムであっても loop関数であれば無限に実行されます。この場合、処理の最後の命令後、関数内の先頭の命令に処理が移動する間に、なにかシステムでプログラムが実行されていたりしますか？

との問に、ChatGPT先生は次の様に返してくれました。
# ChatGPT先生の回答
Arduino IDEの`loop()`関数は、Arduinoボード上で実行されるメインループです。この関数は無限に実行され、処理の最後に到達すると、次のループの開始時に再度実行されます。

`loop()`関数が最後の命令を実行し、関数の先頭に戻るまでの間に、Arduinoボード上でさまざまなシステムタスクや処理が実行されます。これには以下のようなことが含まれます：

1. 割り込み処理: Arduinoボードは、割り込みを処理するためのハードウェアを備えています。割り込みは、外部からの信号やタイマーなどのイベントに応答するために使用されます。`loop()`関数の実行中に割り込みが発生した場合、Arduinoは割り込み処理を実行し、適切な割り込みハンドラを呼び出します。割り込み処理が終了すると、`loop()`関数が再開されます。

2. タイマーイベントの処理: Arduinoボード上のタイマーは、一定の間隔でイベントを発生させることができます。これらのイベントは、`loop()`関数の実行中に発生する可能性があります。タイマーイベントが発生した場合、関連するタイマー割り込みハンドラが実行されることがあります。

3. シリアル通信の処理: Arduinoボードは、シリアルポートを介してコンピュータや他のデバイスとの通信を行うことができます。`loop()`関数の実行中にシリアル通信が発生した場合、受信データの処理や送信データのバッファリングなどが行われることがあります。

4. タスクスケジューリング: Arduinoボード上でマルチスレッドやタスクベースの処理を実行する場合、`loop()`関数の実行中に他のタスクがスケジュールされる可能性があります。タスクスケジューリングにより、異なるタスク間で処理時間が共有されます。

これらのシステムタスクや処理は、`loop()`関数の実行と並行して実行されるため、Arduinoボード上でのさまざまな動作を維持します。`loop()`関数の実行が速すぎて他の処理を妨げる場合、`delay()`関数を使用して適切な待機時間を設定するなどの方法で調整することができます。

ただし、Arduino IDEの`loop()`関数は、単一のスレッドで実行されるため、マルチスレッドプログラミングの利点や制御フローを提供するわけではありません。したがって、プログラムが`loop()`関数を実行中である限り、他のタスクが並行して実行されるわけではありません。

ということでした。
そして更に、続けて次の質問を投げてみました
# ChatGPT先生への続いての質問
FreeRTOS実装時は、FreeRTOSの処理に必要なプログラムがその時に実行されると考えてよいですか？

この問に関して
# ChatGPT先生の回答
はい、FreeRTOSを使用する場合、FreeRTOSのタスクスケジューラと関連する処理が実行されます。FreeRTOSはリアルタイムオペレーティングシステムであり、タスクのスケジューリングやコンテキストの切り替え、割り込み処理などを管理するフレームワークです。

FreeRTOSのタスクスケジューラは、`vTaskStartScheduler()`が呼び出された時点で開始され、タスクの優先度と実行時間を制御します。各タスクはスケジューラによって割り当てられ、タスク間で実行が切り替わります。

`loop()`関数は通常、FreeRTOSのタスクの1つとして実装されます。この場合、FreeRTOSのスケジューラによって`loop()`タスクが割り当てられ、他のタスクとの間で実行が切り替わります。各タスクは割り当てられた優先度に従って順番に実行されます。

FreeRTOSでは、`loop()`関数以外にも複数のタスクを作成できます。各タスクは異なる処理を担当し、スケジューラによって実行される順序が管理されます。

したがって、FreeRTOSを使用する場合、FreeRTOSのタスクスケジューラによってタスクが実行され、各タスクの実行が切り替わると考えることができます。このように、FreeRTOSは複数のタスクを並行して実行することで、リアルタイム処理やタスクの優先順位を管理します。

でした。

# まとめ
やはり、なにかやってました😁
割り込み等の処理をやっている様ですね。
とても勉強になりました😀
それにしても、質問文、ちょっとむずかしいかな？と思ったのですが
しっかりと回答してくれる ChatGPT先生は凄いです！
更に関連質問を続けてすると、その前の回答を踏まえた回答をしてくれるわけです。
普通に人と会話しているのと変わりません！
これまで分からないことがあると、色々な言葉でググって回答を探したものですが
ChatGPT先生なら即座に欲しい回答してくれるので本当に助かってます👍
OS再起動したらiSCSIターゲットが自動でマウントされずにハマった話

NASをターゲット、Debianをイニシエーターとして設定し、問題なくログインやマウントが行えていました。
ある日OSを再起動したらその領域がマウントされておらず「あれ？Ubuntuだと同じ手順で自動にマウントされていたような・・」と思いながら調査開始。

どうやら`node.startup`が`automatic`に設定されている必要がありそう。

現在の設定値を確認してみる。（iqn.xxxxxxxxはターゲット名）
```
# /sbin/iscsiadm -m node -T iqn.xxxxxxxx -o show | grep node.startup
node.startup = manual
```
しっかり`manual`になっていました😅

と、いうことで設定変更を実施。
```
# /sbin/iscsiadm -m node -T iqn.xxxxxxxx -o update -n node.startup -v automatic
```

変更されたことを確認。
```
# /sbin/iscsiadm -m node -T iqn.xxxxxxxx -o show | grep node.startup
node.startup = automatic
```

実際にOSを再起動してみて、iSCSIのログインとマウント処理まで問題なく出来ていることが確認できました！🙌
Linux上でのファイルサイズの取得

# Linux上でのファイルサイズの取得
ファイルサイズの取得方法は複数あります．今回は，4つのコマンドを紹介します．
## ls
1つ目は，lsコマンドです．ファイル名やパーミッション，所有者などのメタデータを表示するために使用されますが，
```
ls -l test.txt | awk '{print $5}'
```
などでファイルサイズのみを取得できます．

## du
2つ目は，duコマンドです．これはディスク使用量を確認するためのコマンドで，特定のディレクトリまたはファイルのサイズを表示します．
```
du -ch test | grep total$ | cut -f 1
```
などでファイルサイズを取得できます．

## wc
3つ目はwcコマンドです．これは，指定されたファイルまたは標準入力からの文字数、単語数、行数をカウントするためのコマンドです．
```
wc -c test.txt | awk '{print $1}'
```
などでファイルサイズを取得できます．

## stat
4つ目はstatコマンドです．これはファイルの詳細な情報を表示するためのコマンドで，ファイルのサイズだけでなく，作成日時や変更日時，所有者などの情報も表示できます。
```
stat test.txt | grep Size | cut -b 8-10
```
などでファイルサイズを取得できます．
ns-3.32にquicのモジュールをインストールした時のメモ

QUICのモジュールををns-3 App Store(https://apps.nsnam.org/app/quic/) からインストールしても、そのままでは動かなかったので、テストプログラムが動くようになるまでにしたことをまとめておきます。

## wscriptへのコードの追加
デフォルトだとquic-application下のmodelとhelperのコードが追加されないので、contrib/quic/wscriptに次のコードを加えることで解決します。
```
'model/quic-client.cc',
'model/quic-server.cc',
'model/quic-echo-client.cc',
'model/quic-echo-server.cc',
'helper/quic-echo-helper.cc',
'helper/quic-client-server-helper.cc'
```

```
'model/quic-client.h',
'model/quic-server.h',
'model/quic-echo-client.h',
'model/quic-echo-server.h',
'helper/quic-echo-helper.h',
'helper/quic-client-server-helper.h'
```
次にサンプルプログラムが、デフォルトだとquic-variants-comparison-bulksend.cc しかコンパイルされないのでcontrib/quic/exsample/wscript に以下のコードを追加します。
```
obj = bld.create_ns3_program('quic-tester-streams', ['quic'])
obj.source = 'quic-tester-streams.cc'
obj = bld.create_ns3_program('quic-tester', ['quic'])
obj.source = 'quic-tester.cc'
```

## ソースファイルの追加
contib/quic/model と contib/quic/helper に、 contrib/quic/quic-application/model と contrib/quic/quic-application/helper のファイルを追加します。

## ヘッダーファイルの追加
公式のgithubなどでは、上記の手順で進めれば実行できると書いてあります。自分の環境では、ヘッダーファイルが見つからないなどのエラーが出てしまったので、ヘッダーファイルを適当な場所に追加してあげます。

自分は　contrib/quic/helper, model, quic-applications　内のヘッダーファイルを全て　ns-3.32/build/ns3　にコピーしました。

さらに、サンプルプログラムの一つである quic-tester.cc のコンパイル時に seq-ts-header.h と packet-loss-counter.h が見つからないというエラーが出ました。
src/applications/model からcontrib/quic/model に該当ファイルを追加したところ、エラーが解消されました。

テストプログラムのquic-tester.ccを実行してみます。
```
./waf --run quic-tester.cc
```
実行した結果です。
![スクリーンショット 2023-06-19 13.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468021/2674adc7-0fd8-d007-f286-71c8314ba055.png)
【ふりかえり】IAM

# IAMについて
「Identity Access Manager」の略。

AWSには、2種類のアカウントが存在する。
* ルートユーザー
全てのサービスを操作できるため、リスク高
通常利用は避ける
* IAMユーザー
どのサービスをどの程度操作できるか、アクセス範囲を決めることができる

IAMを使うことで
「誰が」=**認証**「どのサービスにアクセスできるか(アクセス権限)」=**認可**　を決め、
`ユーザがアクセスできるAWSリソースのアクセス許可を管理する`ことができる。

## 3つの機能

* IAMユーザ
**外部の人、リソースに付与する**
「ユーザ名」と「パスワード」が割り当てられる
1つのAWSアカウントの中に複数作成OK
デフォルト状態ではアクセス許可が割り当てられていない

* IAMポリシー
「アクセス権限」を記述したもの
IAMユーザやIAMロールに割り当てることで、誰がどの権限を持つかを決める

* IAMロール
AWSの**リソースに付与する**もの
必要なアクセス権限を一時的に付与するときに使う

# IAM用語
よく使われるIAM用語たち
* IAMリソース
IAMに保存されているユーザー・グループ・ロール・ポリシー・IDプロバイダーを指す。
* IAMアイデンティティ
識別・グループ化するために使うリソースオブジェクト。
* IAMエンティティ
認証に利用されるIAMリソースオブジェクト。
* プリンシパル
ルートユーザー・IAMユーザー・IAMロールを利用してサインインしてAWSにリクエストを行う人・アプリケーションを指す。
* ワークロード
アプリケーション・バックエンドプロセスなどのビジネス価値を提供するリソース・コードの集合体のことを指す。

# ポリシーとユーザー
IAMユーザーは、アクセス許可を付与されるまで、どのリソースにもアクセスできない。
アクセス許可を付与するには、アイデンティティベースのポリシーを作成し、ユーザ・グループにアタッチする。

## 例
`dynamodb:*` リージョン内の `Books` アカウント
`123456789012` テーブルに対し**すべての Amazon DynamoDB アクション** (us-east-2) を実行することをユーザーに許可する。
```
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "dynamodb:*",
    "Resource": "arn:aws:dynamodb:us-east-2:xxxxxxxx:table/Books"
  }
}
```
# IAMロール
特定のアクセス権限をもつIAMエンティティ

## IAMユーザとの違い
* ロールを必要とする人に割り当て可能
→IAMユーザーの場合、1人の特定の人に一意に関連付け
* ロールセッション用の「一時的なセキュリティ認証情報」が提供される
→IAMユーザーの場合、標準の長期認証情報が付与される（パスワード・アクセスキー）

## 信頼ポリシー
[JSONポリシードキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_grammar.html)で、ロールを引き受けるための「信頼できるプリンシパル」を定義する。 

## シナリオ
[ロールの一般的なシナリオ: ユーザー、アプリケーション、およびサービス
](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_common-scenarios.html)
* アクセス権を第三者に付与する時
信頼ポリシーを用い、ロールを引き受けることができるユーザを指定する。
* インスタンス停止時のアクセス権限
最小権限の原則に則ったアクション
気密性の高い環境を誤って変更・削除されることを防ぐ

# IAMの一時的な認証情報
[IAM の一時的な認証情報
](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html)

AWS STS(Security Token Service)を用い、リソースへのアクセスを制御する「一時的なセキュリティ認証情報」をもつ信頼されたユーザを作成できる。
## 長期的なセキュリティ認証情報との違い
* 有効期限は数分から数時間に設定できる
* ユーザのリクエストに応じて自動的に生成される
* 失効した場合、新しい認証情報をリクエスト可能（その時点で権限がある場合）
## メリット
* 長期のセキュリティ認証情報を配布しないので、セキュリティリスク低
* ユーザーに対して、AWS IDを定義せずリソースへのアクセス制御が可能
* 有効期限が限られているので、明示的に認証を取り消す必要がない

（STSについては後日、別記事で調べてまとめてみる）

# 参考
[ポリシー・ロールの理解](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html)
cscの作法 その397

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
aforgeでスクリーンをキャプチャしてaviファイルを作成せよ。

# サンプルコード

```


using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.VFW;

class Program {
	[STAThread]
	static void Main(string[] args) {
		System.Threading.Thread.Sleep(1000);
		Console.WriteLine("ok0");
		AVIWriter writer = new AVIWriter("DIB ");
		writer.FrameRate = 10;
		writer.Open("scs0.avi", Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
		ScreenCaptureStream streamVideo = new ScreenCaptureStream(Screen.PrimaryScreen.WorkingArea);
		int i = 0;
		streamVideo.NewFrame += new NewFrameEventHandler((sender, eventArgs) => {
			Console.WriteLine(i);
			writer.AddFrame(eventArgs.Frame);
			i++;
			if (i > 24)
			{
				Console.WriteLine("stop");
				streamVideo.Stop();
				writer.Close();
			}
		});
		streamVideo.Start();
		Console.WriteLine("ok2");
	}
}


```

以上。
Elixir Image でノイズ除去

## はじめに

Elixir Image に 0.35.0 で追加されたノイズ除去を Livebook で実行、視覚化してみます

https://github.com/elixir-image/image

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/reduce_noise.livemd

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install([
  {:image, "~> 0.35"},
  {:kino, "~> 0.9"}
])
```

- [Image](https://github.com/elixir-image/image): 画像処理 
- [Kino](https://github.com/livebook-dev/kino): Livebook の UI/UX

## 画像の準備

"/home/livebook/vix/noise.jpg" のパスに以下の画像が保存されているものとします

![noise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/17858b44-4b6a-d9e2-fc13-cdac4bd34d5b.png)

この画像を `Image.open` で開きます

```elixir
noise_image = Image.open!("/home/livebook/vix/noise.png")
```

## ノイズ除去

`Image.reduce_noise` で中央値フィルタによりノイズ除去を実行します

第2引数 `window_size` でノイズ除去の強さを制御します（デフォルト 3）

```elixir
[
  noise_image,
  Image.reduce_noise!(noise_image, 10)
]
|> Kino.Layout.grid(columns: 2)
```

![スクリーンショット 2023-07-10 13.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8057d472-f7f3-ad75-b95a-e5bc2f817268.png)

左が元画像、右がノイズ除去後です

小さい点々がなくなっています

## まとめ

かなり簡単にノイズ除去が実装できました
まりかの【近未来ブログ】DXのすこし先へ

![23932296.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509666/46cb140b-c2d8-117d-094e-81e073b2b851.jpeg)


まりかの【近未来】ブログです。大きく世界が変わっていく中、新しいテクノロジーが溢れかえっています。そうした、情報の渦の中から、私の経験などを活かして、「すぐに為になる」内容の記事を更新していきます。テーマは・Web3.0・ブロックチェーン・NFT・仮想通貨・暗号資産・投資・AI・EV、などなどです。少しでもお役に立てると嬉しいです。

【著者名】"まりか"
神奈川県横浜市出身。慶應義塾大学経済学部卒業。外資系大手証券会社で、アナリストとして海外情勢やブロックチェーン技術についての調査・コンサルタント業務に従事。5年間の業務の後に、AI・ブロックチェーンのベンチャー企業に「マーケティング責任者（CMO）」として参画。Web3.0、仮想通貨、AI活用などのマーケティング業務を行う。2年前に独立・起業。現在は、在宅で中小企業向け「DXコンサルタント」をしながら、黒猫とのんびり暮らしています。

まりかの【近未来ブログ】DXのすこし先へ

https://maricablog.com/


運営者：海辺の部屋
https://www.umibe.art/

STAND WAVE web site：@可児波起 - ラッパー - 歌い手 - 作詞家 - 作曲家
https://standwave.jp/
Next.js + tauri でページ間でデータを渡したい

## localStorageを使うことにした

ページコンポーネントに引数を渡すことは不可そうなので、どうしたものか考えていました。

**localStorage**は５MBくらい保存できますし、**tauri**のローカルアプリという閉じた環境内での使用には適した選択肢だと思います。


```tsx:データを送るページ
export default function Page1() {
    ...
    const saveData() => {
        if (document === undefined) return;
        localStrage.setItem("data": data);
    }
    ...
}
```

```tsx:データを受けるページ
export default function Page2() {
    ...
    const saveData() => {
        if (document === undefined) return;
        const data = localStrage.getItem("data");
    }
    ...
}
```

`if (document === undefined) return;`については[こちら](https://qiita.com/jedinakahira/items/8eafd592d915be1cccfd)に少し書きました

## 備考

なお、**remix**なら`useActionData`を使うかなと思います。（tauriはremixに対応していない）
ros1のbagファイルをros2で使えるようにする!!

・まずは，rosbagsをインストールする
```
$pip3 install rosbags
```
上記のコマンドを打ち込み，下記のエラーが出力されるかもしれない．
megken@megken-System-Product-Name:~$ pip3 install rosbags
Command 'pip3' not found, but can be installed with:
エラーが発生したら次のコマンドを打ち込んでください
```
$sudo apt update
$sudo apt install python3-pip
```
・次に，bagファイルをros2用にするために
```
$rosbags-convert --src /home/megken/0_data/higashiyama_tunnel/bag/2023-10-18_run1.bag --dst /home/megken/0_data/higashiyama_tunnel/converted_bag/
$rosbags-convert --src <input_bag> --dst <output_folder>
```
```
$export PATH=$PATH:~/.local/bin
```

⇑rosbags-convertコマンドがないと言われたら打つ

変換後，以下のようなフォルダが作成される．その中に，db3とyamlが入っていれば成功

・実際に動かしてみる
```
$ros2 bag play　'変換後のファイルを挿入'
```
仮想マシン(Ubuntu)がインターネットにつながらない


### 環境
- ホスト
Windows11 Pro
- 仮想化
VMware Workstation 17 Player
Ubuntu 22.04

---

### 参考サイト
ネットワークアダプタのstate
[ipコマンドとifconfigコマンドで LANケーブル抜けとかを見る](https://iww.hateblo.jp/entry/20200812/LOWER_UP)
ネットワーク構成
[VMware Playerでネットワークを学ぶ～①仮想ネットワーク～](https://qiita.com/flets708/items/1aa6ffe578d7a93a7e7f)

---

### 状況
VMware Workstation 17 PlayerでUbuntuを使用しています。
ホストマシンの不調に伴いマザーボードの交換やBIOSの設定変更、アップデート等を行った結果、ゲストOSからインターネットに接続できなくなりました。

```
$ ping google.com
ping: google.com: 名前解決に一時的に失敗しました
$ ping 8.8.8.8
ping: connect: ネットワークに届きません
```


ホストマシン自体のインターネット接続は問題ありません。

ゲストOS側の問題だと思い、まずはネットワーク構成がどうなっているか確認したところ、ゲストOSのネットワークアダプタが「NO-CARRIER」の状態になっていました。

```
$ ip address show
2: ens33: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 00:0c:29:28:9d:fd brd ff:ff:ff:ff:ff:ff
    altname enp2s1
```

「NO-CARRIER」＝動作不能のようです。

---
### 原因
ゲストOSのネットワークアダプタをNAT→ブリッジに変更しても、ホストマシンのネットワーク設定がらみ(VMware Bridge Protocol)を変更しても現象は変わりませんでした。

というのも、ホストマシンの不調に伴って行った**端末設定変更**が原因だったからです。
VMwareで使用する機能を停止していました。

---
### 対応
1. 「Windowsマーク」＋「R」でファイル名を指定して実行 機能を立ち上げる。
1. 「msconfig」と入力する。
1.  サービスタブの下記項目が停止状態の場合、チェックを入れ、端末の再起動を行う。
    - VMware DHCP Service
    - VMware NAR Service
    - VMware Authorization Service
   
ネットワークにつながるようになりました。
```
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=11.5 ms
```

「NO-CARRIER」から「UP」に変わりました。
```
$ ip address show
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:28:9d:fd brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet
    :
```
CH32V003J4M6 の基板をつくってみたよ

## CH32V003J4M6用 Lチカ基板
### 回路図
手持ちのLEDが高輝度タイプですので電流制限抵抗は1kΩを使用しています。
基板単体でLチカができるコンセプト。
ブレッドボードにも取り付けられるようにもなっています。
![スクリーンショット 2023-07-10 8.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/5a4fb4d8-29ff-7f5c-8d8d-195b5d4a3d18.png)
### 基板設計
無理なく実装ができる部品間隔で部品を配置した結果、18mm x 24mm の大きさになりました。
SOP8->DIP8にはらならず、SOP8->DIP変換基板です。
![スクリーンショット 2023-07-10 8.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/e4844d96-bcdd-af8e-d54f-7a5c82f0a66f.png)
### 基板レイアウト
両面シルクという贅沢仕様
部品は2012(0805inch)サイズを使用、ハンダ付けしやすいようにPADはちょっと大きめ。
無駄に両面ベタGND
![スクリーンショット 2023-07-10 8.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/9da5c8bd-f9e7-e6cf-1e39-d445dd348716.png)
![スクリーンショット 2023-07-10 8.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/2454702b-35e2-b371-5e98-b76c3a085993.png)
### 3D実装図
![スクリーンショット 2023-07-10 8.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/faccdd34-156f-26b4-f03b-a09f33da797c.png)

## CH32V003J4M6用 DCC DECODER基板
### 回路図
![スクリーンショット 2023-07-10 9.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/f199d5c9-face-a520-3cc5-d254164f8a9d.png)
### 基板設計
![スクリーンショット 2023-07-10 9.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/ca061a44-3bc6-4a32-d4a0-861eb88872d8.png)
### 基板レイアウト
![スクリーンショット 2023-07-10 9.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/eaabdf3f-eb3f-6e4a-c061-9fd502bebda1.png)
![スクリーンショット 2023-07-10 9.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/2c281643-7f54-8264-b251-2eb1eea5d2fa.png)
### 3D実装図
![スクリーンショット 2023-07-10 9.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/6ad6e098-ee7e-2a01-1b5c-f7a6af0526ef.png)
![スクリーンショット 2023-07-10 9.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/8500050f-90b9-0152-a3e2-ba0543d289ab.png)

## Elecrowに基板発注
elecrow
https://www.elecrow.com/pcb-manufacturing.html
キャンペーンなのか1枚目$1でした。
![スクリーンショット 2023-07-10 14.32.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/45a619ed-ec58-f54a-b431-5ee41a9e7760.png)
![スクリーンショット 2023-07-10 14.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/c62e554d-cf5c-90e8-01d6-b8e51a59514e.png)
## Kitの配布
ヤフオクとメルカリで出品中。
CH32Vで検索してみてください。
![IMG_5195.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/3113d1b8-b81e-62e7-7301-301cc8623337.jpeg)
![IMG_5196.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/abc56843-c18c-5b8f-68ab-72c68479ca27.jpeg)
![IMG_5198.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/dbeec247-cec9-b996-f6e9-e891e4fca290.jpeg)
ChatGPTモバイルアプリのインストール方法iOSとAndroidに対応 

# 1.まずは最初に、スマートフォンにショートカット管理アプリ「ショートカット」をインストールします。
# iOS

https://apps.apple.com/jp/app/shortcuts/id915249334

# Android

https://play.google.com/store/apps/details?id=any.shortcut

# 2.スマートフォンでChatGPTのアイコンをダウンロードします
![chatgpt-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/014922cb-17f1-0391-e7d4-373f21af977b.png)

# 3.以下の回避策を追加します：Make app from URL
```
https://www.icloud.com/shortcuts/a8d6943813db4fe7a2c17eb7cd50a100
```
# 4.ChatGPTのログインリンクを入力します
```
https://chat.openai.com/auth/login
```
:::note warn
注意：リンクにスペースが含まれていると、白画面や黒画面が表示される可能性があります
:::
AWS CLIで、リフレッシュトークンを使ってAmazon Cognitoのアクセストークン・IDトークンを再取得したい

# Whats'？

AWS CLI（v2）で、Amazon Cognitoからリフレッシュトークンを使ってアクセストークン、IDトークンを再取得するコマンドをメモ、ということで。

認証のコマンド例はよく見つかるのですが、こちらはなかなか見当たらないな、と思いまして。

# --auth-flow REFRESH_TOKEN_AUTH

ヒントは、こちらに書かれています。

> ユーザープール API により新しい ID とアクセストークンを取得する際に、更新トークンを使用するには、API オペレーションの AdminInitiateAuth または InitiateAuth を使用します。AuthFlow パラメータの REFRESH_TOKEN_AUTH を渡します。認証パラメータの AuthParameters は、キーが "REFRESH_TOKEN" であり、値が実際の更新トークンであるキーバリューマップです。

[更新トークンの使用 / 新しい更新トークン（API）を開始](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html#amazon-cognito-user-pools-using-the-refresh-token_initiate-token)

AWS CLI v2の`cognito-idp`コマンド、`admin-initiate-auth`サブコマンドを使用することになります。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cognito-idp/admin-initiate-auth.html

`--auth-flow`には`REFRESH_TOKEN_AUTH`を指定し、`--auth-parameters`として`REFRESH_TOKEN`にリフレッシュトークンを指定すればよい、となりますね。

# 環境

確認環境はこちら。

```shell
$ aws --version
aws-cli/2.13.0 Python/3.11.4 Linux/5.15.0-76-generic exe/x86_64.ubuntu.22 prompt/off
```

# 確認

以下のコマンドを実行します。

```shell
$ aws cognito-idp admin-initiate-auth --user-pool-id [ユーザープールid] --client-id [クライアントID] --auth-flow REFRESH_TOKEN_AUTH --auth-parameters REFRESH_TOKEN=[リフレッシュトークン] --query 'AuthenticationResult.IdToken' --output text
```

実行結果はこちら。

```json
{
    "ChallengeParameters": {},
    "AuthenticationResult": {
        "AccessToken": "[アクセストークン]",
        "ExpiresIn": [有効期限],
        "TokenType": "[トークンタイプ]",
        "IdToken": "[IDトークン]"
    }
}
```

特定の項目だけ抽出する場合。たとえば、`--query 'AuthenticationResult.IdToken'`。

```shell
$ aws cognito-idp admin-initiate-auth --user-pool-id [ユーザープールid] --client-id [クライアントID] --auth-flow REFRESH_TOKEN_AUTH --auth-parameters REFRESH_TOKEN=[リフレッシュトークン] --query 'AuthenticationResult.IdToken'
```

変数に格納したい場合。`--output text`で。

```shell
$ ID_TOKEN=$(aws cognito-idp admin-initiate-auth --user-pool-id [ユーザープールid] --client-id [クライアントID] --auth-flow REFRESH_TOKEN_AUTH --auth-parameters REFRESH_TOKEN=[リフレッシュトークン] --query 'AuthenticationResult.IdToken' --output text)
```