OmniAICreator/Qiita-1.07M huggingface dataset:
dotnet8でjwt認証に失敗する件について

# dotnet8のwebapiアプリでjwt認証に失敗する

このパッケージを追加したら解決しました
[Microsoft.IdentityModel.JsonWebTokens 7.5.1](https://www.nuget.org/packages/Microsoft.IdentityModel.JsonWebTokens/7.5.1)

## 以下、調査記録

### トークン検証エラーが、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/ccd63d72-9c1b-c6d4-5202-88c3196283a5.png)

### ログ確認
AppSettings.jsonのログレベル変更してみる
- Microsoft.*をLogLevelに追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/00545d7e-53d8-0dc2-7848-3aefbcfcc4fe.png)

- IDX14100のエラーが、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/1fef7d6d-8441-adbc-f66a-4184022ef143.png)
※ JWTはきちんと"."で区切られた文字列でした

### ぐぐる

以下のIssueにたどり着く
[.NET 8 behaves differently for JwtBearerOptions in AddJwtBearer](https://github.com/dotnet/aspnetcore/issues/52075)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/0089f374-9583-2fe6-2edd-c52edbda4cf0.png)

> 皆さんこんにちは。追加して問題を修正しました
> `<PacageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.4.1" />`

Issueによるとdotnet8で破壊的変更が加わったとのこと

### ついでに破壊的変更の内容をみてみる

ありがたいことに以下の日本語公式ページがありました
「その中にセキュリティトークンイベントがJsonWebTokenを返す」の記載が
[.NET 8 の破壊的変更](https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/8.0#aspnet-core)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/f8f6b96a-0d45-50a2-4644-4b413a07b6fd.png)

[セキュリティ トークン イベントが JsonWebToken を返す](https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/aspnet-core/8.0/securitytoken-events)

> TokenValidatedContext.SecurityToken の既定の実際の実装が JwtSecurityToken から JsonWebToken に変更されました。

JsonWebTokenのdllがないからトークンの解析に失敗してたんでしょうか、、
actでGitHub Actionsをローカル実行する

### 環境

* Windows 11
* winget v1.7.10861
* act 0.2.62

### インストール

```bash
$ winget install act
$ act --version
act version 0.2.62
```

### 使い方

#### 全ワークフローを実行

```
$ act
```

#### dry-run

```
$ act -n
```

#### ワークフローファイルを指定する

```
$ act -W /path/to/workflow
```

#### ジョブを指定する

```
$ act -j job_name
```



## 参考資料

* [nektos/act](https://github.com/nektos/act)
* [act - User Guide](https://nektosact.com/)
GitHubのIssueをJavascriptから作る方法

# はじめに
JavascriptでGitHubのIssueを作成したい！
そんな事よくあると思います()
それを調べるのにかなり苦労したので、
備忘録として書くことにしました。

# トークンの取得
GitHubをJavascript側から操作する為、
GitHubへのアクセストークンを取得する必要があります。
アクセストークンには様々な権限を付与する事ができますが、
詳しくは他の記事などを参照してくださいな....

## アクセストークンの作成
GitHubアカウントを持っている。
ログインしている事が前提になります。

まず最初はSettingsに移動しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/fb50d865-7ab6-2dcc-ce16-e25a9047e890.png" width=250>

少し下がった所にあるDeveloper settingsに移動しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/63c80e21-9658-da52-6fd2-ed5e9c5020f9.png" width=250>

Personal access tokensの下にあるFine-grained tokensに移動します。
トークンを作成した時は画像の様にリストとして表示されます。
Generate new tokenをクリックして作成開始です！
![Fine-grained tokens.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/a8915ad9-d923-608e-2622-94a202341a1c.png)

これが作成画面です。
![Personal access tokens.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/ff8b70f4-4cfa-86d6-ebac-235f6828265e.png)
### 各パラメータの説明
- Token name
  - 作成するトークンの名前入力します
- Expiration
  - このトークンの期限を入力します
  - 期限は1週間, 1ヵ月, 2ヵ月, 3ヵ月, カスタムを選択できます
  - 初めての場合は1週間でいいでしょう
- Description
  - このトークンの説明を入力します
  - 入力しなくてもOK
- Resource owner
  - このトークンのオーナーを設定できます
  - 基本的に変えなくてOK
:::note
Token nameは日本語も入力できるみたいですが、
念のため英語で決めた方がよさそうです。
:::
### 権限の設定
- Repository access
  - リポジトリへのアクセス権を設定できます
  - 今回は"All repositories"か"Only select repositories"にします
  - "Only select repositories"にした場合は、リポジトリも指定しましょう
- Permissions
  - Repository permissions
    - Repository accessを変更した時に表示されます
    - ここで権限を設定する事ができます
    - Issueを作るにはIssuesと書かれた権限を、
      "Read and write"にする必要があります

以上を変更してOverviewが以下の様になったらOK
![Overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/6d095c15-6277-b467-329c-4d77c417a5bf.png)

Generate tokenを押し、トークン作成完了です！
押した後に表示されるトークンIdはちゃんと保管しましょう。
調べてないのでわからないですが、再発行できない可能性があります。

## JavascriptでIssueを作る！
さてIssueを作成していきましょう。
```js:GitHubCreateIssue.js
const user = 'GitHubユーザー名';
const repo = 'リポジトリ名';
const token = 'トークンId';

async function CreateIssue(title, body, labels) {
    const data = {
        title: title,
        body: body,
        labels: labels,
    };
    try {
        const response = await fetch(`https://api.github.com/repos/${user}/${repo}/issues`, {
            method: 'POST',
            body: JSON.stringify(data),
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${token}`
            }
        });
        
        if (response.status === 201) console.log('Issue created successfully!');
        else console.error(`Error creating issue: ${response.status} - ${await response.text()}`);
    }
    catch (error) {
        console.error('Error creating issue:', error);
    }
}
```
### コードのテスト
コードのテストをしてみましょう！
以下のコードを実行してみると....
```js:Test.js
CreateIssue("Test issue", "これはテストで作成しているよ!", []);
```
![Test issue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783700/07944ec0-930c-7ddf-70f6-f86adee4b227.png)
成功です！
Issueを作成できました！

# 最後に
初めて記事を作り勢いだけで書いたので、
拙い部分や読みにくい部分があるかと思います。
ご了承ください。
最後まで閲覧いただきありがとうございました！
プロメテオス言語入門：次世代の手続き型プログラミング

## 目次
1. [概要](#概要)
2. [プログラミングパラダイムと構文](#プログラミングパラダイムと構文)
3. [主な機能と利点](#主な機能と利点)
4. [環境構築とツール](#環境構築とツール)
5. [実践例：高度な分散システム](#実践例：高度な分散システム)
6. [処理フローチャートの詳細解析](#処理フローチャートの詳細解析)
7. [コミュニティとサポート](#コミュニティとサポート)
8. [そして](#そして)

## 概要
プロメテオスは、AIと量子コンピューティングの融合を実現する新しい手続き型プログラミング言語です。そのパワフルな機能セットにより、開発者は未来の技術を先取りして利用することができます。

## プログラミングパラダイムと構文
プロメテオスは、厳格な手続き型アプローチに基づいて設計されており、明瞭で効率的なコード作成を促進します。その構文はC言語と類似していますが、より現代的な機能とシンタックスシュガーが追加されています。

### 基本構文の例

```prometheus
module Main

import IO

procedure Start() {
    IO.Print("Hello, World!")
}
```

## 主な機能と利点
1. **自己最適化コード**:
   自動的にパフォーマンスを分析し、実行時に最適化を行います。

2. **量子コンピューティングの統合**:
   量子アルゴリズムを簡単に実装し、クラシックコードとの間でシームレスに連携します。

3. **AI駆動開発**:
   AIがコードの改善提案を行い、バグをリアルタイムで検出します。

## 環境構築とツール
プロメテオスの開発環境は以下のコマンドでセットアップできます：

```bash
$ curl -sL https://prometheus-lang.org/install | bash
$ prometheus config --global setup.env=true
```

開発者は統合開発環境(IDE)のサポートも利用でき、リアルタイムでのコード分析やデバッグが可能です。

## 実践例：高度な分散システム
以下のコードは、非同期タスクキューとイベントドリブンのHTTPサーバーをプロメテオスで実装する方法を示しています：

```prometheus
module Network

import HTTP
import Concurrent

procedure HandleTask(request HTTP.Request) -> HTTP.Response {
    task := Concurrent.Dispatch(request.Body)
    return HTTP.Response(200, task.Result)
}

procedure Main() {
    server := HTTP.Server(HandleTask)
    server.Listen(8080)
}
```

## 処理フローチャートの詳細解析
プロメテオス言語による非同期サーバーの処理フローは以下の通りです：

以下は、Mermaidで記述されたフローチャートです。これはサーバーのリクエスト処理フローを示しており、リクエストが有効かどうかに応じて異なるアクションを実行します。

```mermaid
flowchart TD
    Start --> Initialize_Server[Initialize Server]
    Initialize_Server --> Wait_for_Request[Wait for Request]
    Wait_for_Request --> Is_Request_Valid{Is Request Valid?}
    Is_Request_Valid -- Yes --> Dispatch_Task[Dispatch Task]
    Dispatch_Task --> Execute_Concurrently[Execute Concurrently]
    Execute_Concurrently --> Return_Result[Return Result]
    Return_Result --> End
    Is_Request_Valid -- No --> Return_Error[Return Error]
    Return_Error --> Close_Connection[Close Connection]
    Close_Connection --> End
```

このフローチャートは、プログラムのロジックフローを明確にし、開発者が理解しやすい形で設計されています。

## コミュニティとサポート
プロメテオスはオープンソースプロジェクトで、世界中の開発者が貢献しています。公式フォーラム、GitHub、Stack Overflowでの活発な議論が行われています。

## そして
プロメテオス言語は、プログラミングの未来を象徴するものですが、現実には存在しません。この記事は読者に新しい視点を提供し、技術の限界を押し広げる可能性を探るためのものです。未来のテクノロジーに対する理解を深め、創造的な思考を促進することが目的です。
[JaveScript]エラー処理について

## はじめに
JavaScriptのエラー処理について学習したことをまとめていきます。

## エラーハンドリングとは
例外が発生した時、そのエラーや例外を適切に処理するプロセスや手法のこと(**例外処理**と呼ぶこともある)。
エラーハンドリングが組み込まれていないと、例外が起きた場合に予期せぬ動作をしたり、クラッシュしてしまう。


## エラー処理の基本
エラー処理の書き方は3つ
1. try...catch
1. throw
1. エラーオブジェクト

## try...catch
`tryブロック内`で例外が発生した時に、その例外を`catchブロック`で受け取ることができる
※例外が発生しなかったらcatchは行われない
`finallyブロック`は例外が発生した・しないに関わらず最終的に必ず実行されるブロック
```JavaScript:try...catch
try {
// 実行される処理
} catch(error) {
//例外が発生した場合に実行される処理
} finally {
 //必ず実行される処理
}
```
**注意点**
この処理には必要最低限1つ以上の`catchブロック`か`finallyブロック`が必要になるため、以下のバターンがある
・`try...catch`
・`try...finally`
・`try...catch...finally`

## throw
例外を発生させるもの。これを`catch`ブロックがキャッチしてくれる。
```javascript:throw
throw 例外の式;
```

**注意点**
`catch`ブロックがないとプログラムが終了してしまうため用意する必要がある

throw文の例外の式部分には以下の様に、プリミティブ型やオブジェクト型(後述する Error オブジェクトなど)を入れることができる
```JavaScript:throw
throw "例外発生";
throw 400;
throw new Error("例外発生！");
```
しかし、エラー処理を行う場合はエラーオブジェクトを生成して例外を投げることが推奨されている

**文字列のthrow**
スタックトレースを取得できず、問題の発生箇所を特定できないため文字列を直接`throw`してはいけない
以下のように`Error`オブジェクトを使用する
```JavaScript:Errorオブジェクト
throw new Error('エラー')
```


## エラーオブジェクト
処理を実行中にエラーが発生した時に生成される
```JavaScript:エラ-

try {
  // funcメソッドは存在しない->エラー発生
  func();
} catch (error) {
  // errorにエラーオブジェクトが渡る
  console.error(error);
}
```
結果としてエラーが返ってくる。
エラーオブジェクトを自作し`throw`文で例外として投げることもできる
```JavaScript:エラーオブジェクトの作成
try {
//エラーオブジェクトを生成しthrowする
throw new Error('エラーが発生')
} catch(error) {
//throwで投げられたErrorをキャッチ
console.error(error)
}
```

### エラーの種類
エラーの種類にはいくつかあり、詳細は[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Error#error_types)
・`ReferenceError`：不正な参照から参照先の値を取得した時に発生するエラーを表す
・`SyntaxError`：構文エラーを表す
ex)タイプミス、予約語を不適切な場所で使用した
・`TypeError`：変数または引数の型が有効でない場合に発生する
ex)constに再代入しようとした時、存在しない要素を指定した時


## 非同期処理でのエラー処理
非同期処理では、基本的に`try...catch`してもエラーハンドリングできない
例えば、Promiseを使った非同期処理の例外
```JavaScript:例外処理
fetch('hoge/hoge').then((result) => {
  console.log(result)
}).catch((e) => {
  console.log(e)
}).finally(() => {
  console.log('done')
})
```
`then`と`catch`で繋ぐ
構造としては`try...catch`と同じで処理に問題がなければ`then`の部分を実行、エラーが発生した場合は`catch`を`finally`は必ず実行される。

**注意点**
`async/await`を使用した場合は普通に`try...catch`が使用できる
```javaScript:async/await
try{
  // 例外が発生し得る処理
  await fetch('/hoge/foo')
}catch(e){
  // エラー時に実行される処理
  console.log(e)
}
```
## 参考
[【JavaScript】エラー処理 完全ガイド](https://zenn.dev/yukiota/articles/cb53ea21d7cf3994861a#%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86)
[【JavaScript】エラー処理の基本的なところを理解する](https://zenn.dev/arei/articles/6f3d0e9a617272)
[初級編]6.Tableau Desktopの利用方法(シート/ダッシュボード/ワークブックの作成)	

# シートの作成
初めに、画像はTableau Publicのものですが、
Tableau Desktopもほぼ同じですのでご容赦ください。

それでは手順をご説明します。
まずTableau Desktopを起動します。
下記画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/214e6a5d-8a0b-e04f-55ee-84db819fe30a.png)


分析するデータを選択します。
今回はExcelデータを使用しますので、Microsoft Excelを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/decf2ff7-34d8-e5e0-f649-5f2fc9567155.png)

「サンプル - スーパーストア.xls」を選択し「開く」をクリックすると、
下記画面が表示されます。		
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/1eab05be-2b74-a564-0903-960bf81cfb9e.png)

下の図のようにキャンバスにデータを配置します。
![ds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/f8c46f16-0170-c012-2a5d-b3f260aec63c.png)

# 
ちなみに...
https://help.tableau.com/current/pro/desktop/ja-jp/environment_datasource_page.htm
のサイトに画面の名称についての説明が記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/52549407-ff5b-2620-05ab-f82c1bd26998.png)
A. 左側のペイン - 接続されたデータ ソースとデータに関する他の詳細を表示します。
B. キャンバス: 論理レイヤー - キャンバスを開くと論理レイヤーが表示されるので、ここで論理テーブル間の関係を作成できます。
C. キャンバス: 物理レイヤー - 論理レイヤー内のテーブルをダブルクリックしてキャンバスの物理レイヤーに移動すると、テーブル間の結合とユニオンを追加できます。
D. データ グリッド - Tableau データ ソースに含まれているデータの最初の 1,000 行を表示します。
E. メタデータ グリッド - データ ソースに含まれるフィールドが行で表示されます。
#

次にシート1(シートタブ)をクリックして表示し、
例えば都道府県毎の売上グラフを表示したい場合、
![sheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/8e9425ce-aba8-5563-2a07-bde86b3763d0.png)
のように「都道府県」、「合計(売上)」を列/行に配置します。
これが超簡単なTableau Desktopの使用方法です。
※ 画像はTableau Publicです。ご容赦ください(m´・ω・｀)m ｺﾞﾒﾝ…

後は列/行へ何を配置するか等を考えて好みのシート(ビュー)を作成します。
シートの作成については下記サイトにも記載がごございます。
https://help.tableau.com/current/guides/get-started-tutorial/ja-jp/get-started-tutorial-connect.htm

# ダッシュボードの作成
ダッシュボードは、簡単に言えばシートを組み合わせたものです。

例えば、
都道府県毎の売上を地図で表したもの、棒グラフ形式で表したものを1つの画面で表現したい場合、ダッシュボードを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/b81261dd-eecd-1e4a-bea8-1adcc41d41d1.png)
のようなシート(シート2)を作り、ダッシュボードタブをクリックし、
![db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/e949385a-49d6-3bce-48b6-72bef6d97f1c.png)

ダッシュボードシートにて、シート1、シート2をドラッグ&ドロップします。	
※ 配置は適当です。
![db2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/575b6f49-44d3-cb0e-3809-73576e9b3884.png)
これでダッシュボードの完成です。簡単ですよね。

# ワークブックの作成
ワークブックはシートやダッシュボードを含む1つのファイルです。

左上の「ファイル→パッケージドワークブックのエクスポート」をクリックすると
所定の場所に保存できます。

XXX.twbxという拡張子のついたファイルが保存されたと思います。
これがワークブックです。

拡張子twbxのファイルは厳密には
#### 「パッケージドワークブック」
###
と言います。

パッケージドワークブックは、ワークブック内にデータを含むワークブックのことです。
※今回の場合であればサンプル - スーパーストア.exlx を含むワークブックです。

その他、ワークブックには.twbという拡張子のワークブックもあります。
これはワークブック内にデータを含まないワークブックです。
※今回の場合であればサンプル - スーパーストア.exlx を含まないワークブックです。

「ファイル→名前を付けて保存」からXXX.twbとして保存します。	
実際にそれぞれのファイルを保存して比べてみると、ファイルサイズが違うと思います。
これはデータが含まれているか否かの違いです。


### twbxとtwbのそれぞれのメリット
twbxだと、ファイルサイズは大きくなってしまいますが、元のexcelファイルにアクセス権の無い		Tableau Desktopユーザーでもワークブックを参照する事が出来ます。	
ファイルにデータが含まれていますから、元のexcelファイルにアクセス出来なくても関係無いですよね。

twbだと、ワークブックを共有する際にファイルサイズが小さくて済みます。
メール等で共有する場合は便利ですよね。しかし、元のexcelファイルにアクセス権が無いとtwbだけ貰ってもワークブックを参照出来ません。どちらも一長一短ですね。



以上です
[初級編]5.Tableau Desktopの利用方法(インストールとライセンス認証)

# Tableau Desktopのインストール
Tableau Desktopを利用するにあたり、まずインストールを行いますが、
インストール要件がありますのでご注意ください。
具体的には下記サイトのとおりです。
https://www.tableau.com/ja-jp/products/techspecs#desktop
Microsoft Windows 8/8.1、Windows 10 (x64)、Windows 11
2 GB メモリ
・・・
といった記載がありますのでご確認ください。
まぁ普通のPCならインストール出来るとお考えください。

製品のダウンロードですが、

製品のダウンロードとリリース ノート
https://www.tableau.com/ja-jp/support/releases
または
カスタマーポータル
http://customer.tableau.com/
からダウンロードします。

今回は「製品のダウンロードとリリース ノート」からダウンロードしてみましょう。

例えば、2024.1.2を利用する場合、2024.1.2をクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/a8df8086-386c-5011-131b-e62f7cc62360.png)

TableauDesktop-64bit-2024-1-2.exe (600 MB)をクリックしダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/81131a48-b9ac-f534-e053-b201c794e74b.png)

自分のPCに保存されたTableauDesktop-64bit-2024-1-2.exe をクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/1f287536-f5bf-f18f-487c-8455f0b8d959.png)
指示に従ってインストールします。

インストール手順にいては下記サイトにも記載があるので参考にしてみてください
https://help.tableau.com/current/desktopdeploy/ja-jp/desktop_deploy_download_and_install.htm


インストールが完了するとデスクトップにアイコンが生成されていると思います。	
![TD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/52e7fd04-25b8-6370-08d7-c6d753e62bc9.png)

# Tableau Desktopのライセンス認証
インストールが完了したら、次はライセンス認証です。

アイコンをダブルクリックしてTableau Desktopを起動します。
ライセンス認証を実施していない場合、Tableau登録画面が表示されますので必要事項を入力してください。↓のサイトにある			
https://help.tableau.com/current/desktopdeploy/ja-jp/desktop_deploy_activate_license.htm
↓のような画面です。			
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/3fe69531-bf6a-2554-1722-2465f4de4a65.png)

必要事項を入力後、[Tableau のライセンス認証] をクリックします。
次の画面で	
#### [プロダクト キーによってライセンス認証する]
#### [サーバーへのサインインによってライセンス認証する]
の選択肢が表示されますので、何れかを選択してください。
それぞれの選択肢の意味は下記のとおりです。

#### [プロダクト キーによってライセンス認証する]
TCから始まる20桁のキーをお持ちの場合に利用出来ます。
TCXX-XXXX-XXXX-XXXX -XXXX
※以前に発行されていたTDから始まるキーをお持ちの場合も利用出来ます

#### [サーバーへのサインインによってライセンス認証する]
Tableau Server、またはTableau Cloudへログインする事でTableau Desktopのライセンスを有効化する仕組みです。
つまり、Tableau ServerまたはTableau Cloudが利用出来る状態である必要があります。

####
####
[プロダクト キーによってライセンス認証する]、または[サーバーへのサインインによってライセンス認証する]のライセンス認証手順は下記サイトにも掲載されております。			
https://help.tableau.com/current/desktopdeploy/ja-jp/desktop_deploy_activate_license.htm

以上です
[初級編]4.プロダクトキー(ライセンスキー)

##	プロダクトキー(ライセンスキー)	とは何か
Tableau Creator、Tableau Explorer、Tableau Viewerの何れかを購入しますと、製品でライセンスを有効化するためのプロダクトキーが発行されます。

各製品でライセンスを有効化すると製品が利用可能となります。
### ※プロダクトキーをライセンスキーと言ったりする人もいますが、同じ意味です。

プロダクトキーについては下記サイトに記載されておりますとおり、3種類あります。			
https://help.tableau.com/current/server/ja-jp/license_product_keys.htm

簡単に申し上げれば下記のとおりです。
#### TCから始まるキー
Tableau DesktopとTableau Prep Builderでライセンスを有効にするキーです。ライセンスが有効になると製品を利用出来ます。
#### TDから始まるキー
Tableau Desktopのみライセンスを有効にするキーです。今はもう販売しておりません。	
#### TSから始まるキー
Tableau Serverでライセンスを有効にするキーです。ライセンスが有効になると製品を利用出来ます。

[補足]
TSから始まるキーは、Tableau Desktopのライセンスを有効にするキーでもあります。
Tableau ServerでTSから始まるキーでライセンスを有効化した後、
Tableau Desktopにて[サーバーへのサインインによってライセンス認証する]を選択し、
TSから始まるキーを有効化したTableau Serverにログインする事で、
Tableau Desktopのライセンスを有効化できます。


# プロダクトキーとライセンス数の確認方法
購入したキーはカスタマーポータルというサイトにて確認出来ます。
https://help.salesforce.com/s/articleView?id=001457996&type=1
のサイトにある
「3. Within the Deployment Detail view, navigate to the Deployment Assets to identify your Tableau product key(s) to be used in this single Deployment.」 
の配下にある画像のような画面でプロダクトキーが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/e4aaa70d-529e-1b30-8347-2825ca3a70ac.png)

プロダクトキー(画像だとTSZZ・・・)をクリックしますと、

「From your Deployment view (See "View all License Keys for a Deployment"), navigate to the Deployment Asset page and identify your Tableau Server product key(s).  Select the Server product key to view the License Detail page.・・・」
の配下にある画像のようなページに遷移し、購入したライセンス数を確認出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/6f71fa7b-e3c0-6c54-a4c5-224924fd48f6.png)

例えば、Tableau Creatorを3つ購入した場合は、Creator License Countが3になっていると思います。	もう少し申し上げると、Tableau ServertでTSZZ・・・をTableau Serverでライセンス認証すると、Tableau ServerとTableau Desktop/Tableau Prep Builderを3人の方が利用出来る という事です。

# [補足]Tableauで用意されているWebサイトの種類
「ライセンスはカスタマーポータルというサイトにて確認出来ます」と申し上げましたが、Tableau ではログインが必要なWebサイトが6個あります。
下記サイトにまとめられております。
https://www.tableau.com/ja-jp/tableau-login-hub

![tableauサイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/41e238a2-7e73-e884-edd4-2a28b2a79c2d.png)

簡単にご説明しますと、
#### Tableau.com
トライアル版(14日間無償)を使用したり、インストーラーをダウンロードしたりするサイトです。ライセンスを購入していなくてもアカウント登録が可能ですので、メールアドレス等必要な情報を入力してアカウント登録してみてください。	

#### Tableau Cloud
Tableau社が提供クラウド型のサービスです。実態はTableau Serverですが、Tableau Serverとは異なりインストール作業が不要です。ライセンスを購入後、所定のURLにアクセスしてログインするとTableau Serverと同等の機能が利用出来ます。有償です。

#### カスタマーポータル
カスタマーポータルはライセンスを購入すると利用出来るサイトです。主にインストーラーのダウンロードやプロダクトキーの確認などで使用します。カスタマーポータルについては下記サイトにも説明があります。
カスタマー ポータルの概要
https://help.salesforce.com/s/articleView?id=001498740&type=1

#### Tableau Public
Tableau Publicのアプリ(Tableau Desktopの機能限定版のイメージ)で作成したビューをアップロードするサイトです。	ライセンスを購入していなくてもアカウント登録が可能ですので、メールアドレス等必要な情報を入力してアカウント登録してみてください。

#### Tableauコミュニティ
全世界のTableau利用者が困っている事を共有したり、アイデアを投稿するサイトです。閲覧だけでしたらアカウント登録無しで利用可能です。何か投稿する場合はアカウント登録が必要です。無償です。

#### Tableau eLearning
Tableau学習サイトです。有償です。

以上です
[初級編]3.Tableauを利用するための費用（ライセンスの種類）

# ライセンスは3種類あります
以前の記事でTableau Desktop、Tableau Server、Tableau Prep Builder、Tableau Cloudは有償と記載しましたが、利用するためにはライセンスを購入する必要があります。
まずライセンスには3種類あります。						
#### Tableau Creator、Tableau Explorer、Tableau Viewer
です。

### Tableau Creator	ライセンス
Tableau Desktop、Tableau Prep Builder、Tableau CloudまたはTableau Serverが利用出来るライセンスです。

### Tableau Explorer ライセンス
Tableau CloudまたはTableau Serverが利用出来るライセンスです。Tableau CloudまたはTableau Serverが利用出来る、つまりビューやワークブックの作成が可能ですが、予め用意されたデータをもとに作成する事になるなど、Tableau Creatorと比較すると利用出来る機能が制限されます。						

### Tableau Viewer ライセンス
Tableau CloudまたはTableau Serverが利用出来るライセンスです。ただし、ビューやワークブックの参照しか出来ません。

Tableau のライセンスタイプについては下記サイトにも記載されています。
https://help.tableau.com/current/blueprint/ja-jp/bp_license_types.htm

# 費用
それぞれのライセンスの費用ですが、下記サイトに記載されております。
https://www.tableau.com/ja-jp/pricing/teams-orgs
Tableau Creatorで約9000円/月ですね。

# 購入方法と注意事項
購入する場合は、
https://www.tableau.com/ja-jp/pricing/teams-orgs
の最下部にある「TABLEAUを今すぐ購入」から手続きするか、あるいはSalesforce社の営業をご存知なら連絡してみてください。

注意点としては、利用者1人につき1ライセンスが必要ですので注意してください。	
具体例で言えば、「1ライセンスだけ購入して、複数人で1つのTableau Desktopを利用する」はNGです。

Tableau Serverも「1ライセンスだけ購入して、ログインアカウントを共有して複数人で利用する」はNGです。

以上です
【備忘録】Javaの変数宣言と同時に初期化、ストリームAPIでソート

:::note warn
備忘録
:::

```java:TEST.java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class TEST {
    private record Point(String no1, String no2, String value) {
    }

    public static void main(String[] args) {
        // 初期化
        var btree = new TreeMap<String, String>() {
            {
                put("2011-2", "1");
                put("2011-1", "1");
                put("2012-2", "1");
                put("2012-1", "1");
                put("2024-2", "1");
                put("2024-1", "1");
            }
        };
        for (var m : btree.entrySet()) {
            System.out.println(m.getKey() + ", " + m.getValue());
        }

        // 初期化
        var input = new ArrayList<Point>() {
            {
                add(new Point("2011", "2", "1"));
                add(new Point("2011", "1", "1"));
                add(new Point("2012", "2", "1"));
                add(new Point("2012", "1", "1"));
                add(new Point("2024", "2", "1"));
                add(new Point("2024", "1", "1"));
            }
        };
        var sorted = input
                .stream()
                .sorted(Comparator.comparing(Point::no1).thenComparing(Point::no2))
                .collect(Collectors.toList());

        for (var m : sorted) {
            System.out.println(m.no1() + ", " + m.no2() + ", " + m.value());
        }
    }
}
```

:::note info
2011-1, 1
2011-2, 1
2012-1, 1
2012-2, 1
2024-1, 1
2024-2, 1
2011, 1, 1
2011, 2, 1
2012, 1, 1
2012, 2, 1
2024, 1, 1
2024, 2, 1
:::
[初級編]1.Tableauとは何かを超簡単に説明

# Tableauとは何か → データの持つ意味を伝えるツールです

Tableauはデータをグラフなど別の形にして、データの持つ意味を伝えるツールです。(だと思っています。。)
例えば

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/1a9fd25c-76e5-1a00-837b-ae6d0b28e739.jpeg">

といったデータがあった場合、

　
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/f15b3037-1e10-3c68-ca02-abda114a8c26.jpeg">

↑の図のように
グラフなど別の形でデータを表現して、
「あ、大谷さんのScoreが一番高いんだね！」
と分かりやすくデータの持つ意味を伝えるという事です。



# Excelとの違い
正直、簡単なデータでグラフを作成する場合はExcelでも良いと思います。
こんな(↓)感じで、Excelでも同等のグラフは作成できます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/83b2298d-e0e9-0c10-2596-70ee891d0f10.jpeg">

ただ、地図を使って何かデータの意味を伝える場合や、少々複雑なグラフの場合は
Tableauの方が簡単だと思います。


例えば、↓は令和二年の国勢調査の結果（都道府県別の人口）です。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/6f3919ef-1527-e4b1-30ba-a4d04c3d01c5.png">
 
下記サイトから取得したデータを加工しています。

https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001136464&cycle=0&tclass1=000001136466&tclass2val=0


この場合、Tableauだと簡単に地図を使ったビューが作成できます。
※ビューはTableauで作成するグラフなどのことです

![人口_tableau.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758622/f805a812-dc94-e23c-34e3-a462045cba32.png)

色が濃いところほど人口が多い地域です。

Excelだと、このようなビューはそう簡単に作成できないと思います。

まぁ東京の人口が多い事は皆さん周知の事実ですから、

「こんなの地図にしなくても分かるわ！」と思われるかもしれませんが、

今回は分かりやすく"Tableauとは何か"をお伝えすべく

こちらを例にしました。

参考になりましたら幸いです。

### Tableauとは何か

が伝わりましたでしょうか。

以上です。
[React] JSXとは

# まとめ
JSXとは、JavaScriptの構文拡張であり、React.jsのコンポーネントを記述するために使用されます。**HTMLのような構文を使用してUIを記述できる**ため、React.jsでの開発がより直感的になります。

# 目次
- [参考ソースコード](#参考ソースコード)
- [JSXの利点](#JSXの利点)
- [JSXの基本構文](#JSXの基本構文)
- [JSXのコンパイル](#JSXのコンパイル)

# 参考ソースコード

~~~jsx:index.js
<!DOCTYPE html>
<html>
  <head>
    <script src="../../../../libs/react.development.js"></script>
    <script src="../../../../libs/react-dom.development.js"></script>
    <script src="../../../../libs/babel-standalone.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/babel">
      // POINT ReactをHTMLにマウントする書き方
      const appEl = document.querySelector("#app");
      const root = ReactDOM.createRoot(appEl);
      root.render(<h1>こんにちは</h1>);
      
      // POINT React18以前の書き方
      // ReactDOM.render(<h1>こんにちは</h1>, appEl)
      
    </script>
  </body>
</html>
~~~

[【2024年最新】React(v18)完全入門ガイド｜Hooks、Next14、Redux、TypeScript](https://www.udemy.com/)

# JSXを使用するメリット
- UIコンポーネントの作成がより簡潔で読みやすくなります。
- JavaScriptとの統合が容易になり、動的なコンテンツのレンダリングや条件付きレンダリングが容易になります。

# JSXの基本構文
- JSXはHTMLとJavaScriptを組み合わせたような構文を持っています。
- HTML要素や属性を記述する際は通常のHTMLと同様に記述します。
~~~jsx:index.js
    <div id="app"></div>
    <script type="text/babel">
~~~

- JavaScriptの式を埋め込むこともできます。（React18以前と以降で記載方法が異なる）
~~~jsx:index.js
      // POINT ReactをHTMLにマウントする書き方
      const appEl = document.querySelector("#app");
      const root = ReactDOM.createRoot(appEl);
      root.render(<h1>こんにちは</h1>);
~~~
~~~jsx:index.js
      // POINT React18以前の書き方
      const appEl = document.querySelector("#app");
      ReactDOM.render(<h1>こんにちは</h1>, appEl)
~~~

# JSXのコンパイル
ブラウザはJSXを直接理解できないため、JSXをJavaScriptに変換する必要があります。Babelなどのツールを使用することで、JSXを通常のJavaScriptに変換することができます。
※以下はBabelのソフトを読み込む際に必要なコード例
~~~jsx:index.js
<!DOCTYPE html>
<html>
  <head>
    <script src="../../../../libs/babel-standalone.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/babel">
      const appEl = document.querySelector("#app");
      const root = ReactDOM.createRoot(appEl);
      root.render(<h1>こんにちは</h1>);      
    </script>
  </body>
</html>
~~~

# 参考リンク
- [Reactで使用するJSXの基本をわかりやすく解説](https://kinsta.com/jp/knowledgebase/what-is-jsx/)
モデリングの世界に再入門

# はじめに

プロジェクトでは、ソフトウェアの設計やドキュメントにシーケンス図やステートマシン図を頻繁に利用しています。  
しかし、作成者によってモデルの粒度やスタイルがバラバラであることで、以下のような課題があると感じています。  

* 図の記述ルールが統一されていない
* モデル化の対象範囲や抽象度にばらつきがある
* 適切な図の選択基準が明確でない

その結果、関係者間の認識共有が十分に行えていないケースが多くあります。

数年前に一度UML学んだことがありますが、実務で上手く活用できていないのが実情です。  
そこで、UMLの基礎からしっかりと学び直し、プロジェクトで役立つ形にアウトプットしていきたいと考えました。
自分自身の理解を深めるとともに、同じような課題を感じている方々の一助となれば嬉しいです。

# UMLとは

## 概要

Unified Modeling Language(UML)とは、ソフトウェアシステムを視覚的にモデル化するための統一された記法です。  
様々な種類の図や図式を用いて、ソフトウェアの構造や振る舞いを表現することができます。

UMLには以下のような特徴があります。

* 使用する図記号とその意味合いが厳密に規定されている
* ソフトウェア開発プロセス全体をカバーできる図の種類が揃っている
* ビジネスモデリングからコード生成まで、幅広い用途に対応している
* 汎用性が高く、様々なプログラミング言語やプラットフォームで利用可能

## 表現できること

UMLには様々な種類の図が用意されており、ソフトウェアの構造や振る舞いを多角的に表現することができます。  
主な図の種類と表現できる内容は以下の通りです。

| カテゴリ | 図の種類 | 表現できる内容 |
|:--|:--|:--|
| 静的モデル | クラス図 | クラスの構造、属性、操作、関係性 |
|  | オブジェクト図 | インスタンス化されたオブジェクトの構造 |
|  | コンポーネント図 | ソフトウェアコンポーネントの構造と依存関係 |
|  | パッケージ図 | 論理的なグループ分けと階層構造 |
| 動的モデル | ユースケース図 | システムの機能と利用者の役割 |
|  | シーケンス図 | オブジェクト間のメッセージの流れ(時系列) |
|  | コミュニケーション図 | オブジェクト間の関係と相互作用 |
|  | ステートマシン図 | オブジェクトの状態遷移と内部振る舞い |
|  | アクティビティ図 | ビジネスロジックの制御フロー |
| その他 | デプロイメント図 | 物理的な配置構成とネットワーク構成 |

このような多様な図から表したい内容に応じて最適な図を選択する必要があります。  

## メリット

### 1. 関係者間での共通理解が促進される

UMLのモデルは視覚的である点が最大の強みです。  
図を共有・確認することで、関係者間で同じ認識を持ちやすいです。  

### 2. 要件の漏れやモデルの矛盾を発見しやすくなる

モデル化を通じてシステムを多角的に検討することで、要件の洗い出しや設計の確認が行いやすくなります。  
要件の漏れや、モデル間の矛盾を発見しやすくなります。  
また、文書でも見落としがちなバグの可能性にも早期に気づけます。

### 3. 設計品質の向上と生産性の向上が期待できる

適切なモデリングを行うことで設計品質が向上します。  
その結果、実装工数の削減やバグの減少など、生産性の向上が見込めます。  
また、モデルを繰り返し改善することで、設計力そのものの底上げにもつながります。

### 4. ドキュメントの一元化と再利用が可能

UMLのモデルはそのままソフトウェアのドキュメントとして機能します。  
図を中心にシステムの仕様を一元的に残すことができ、コード化した際のトレーサビリティも保たれます。  
また、モデルは再利用も可能で、類似システムの開発時に活用できます。

### 5. 記述に迷うことなく設計内容に集中できる

設計図を書くときに、どのように表現すればわかりやすいのかを考え何度も書き直していると無駄に時間がかかります。  
UMLを使うことで表現方法が固定されるので、表現方法に迷うことなく、設計内容に集中することができます。

# さいごに

UMLは開発の様々な場面で役に立つツールの1つです。  
様々な図の用途を理解し、表現したい内容に合わせた図を使うことが大切です。  
次回以降、具体的な図の種類と書き方をまとめていきます。
究極のIT技術：未来を変える「シンクエンジン」

## 目次
1. [概要](#概要)
2. [特徴](#特徴)
3. [技術構成](#技術構成)
4. [理論的背景](#理論的背景)
5. [実装例](#実装例)
6. [実験結果](#実験結果)
7. [将来性](#将来性)
8. [そして](#そして)

## 概要
シンクエンジンは、思考を形にする革命的な技術です。この技術により、あなたの考えや創造力が直接デジタル形式で現実化されるのです。プログラミングやアプリ開発が直感的かつ効率的になることで、全人類の創造性が飛躍的に向上します。

## 特徴
1. **直感操作**:
   - 思考を直接コードに変換
   - プログラミング言語の知識不要

2. **環境構築自動化**:
   - あらゆるプラットフォームに即座に対応
   - 煩わしい設定や更新を自動で管理

3. **ユニバーサル互換性**:
   - どのデバイスでも利用可能
   - OSやハードウェアの制限を排除

4. **セキュリティとプライバシー保護**:
   - 先進的な暗号化でデータを保護
   - ユーザーのプライバシーを最優先

## 技術構成
- **思考解析機**: ユーザーの脳波を解析し、意図をコードに変換
- **AI駆動エンジン**: 効率的なコード生成と最適化を行うAI
- **クラウドベースプラットフォーム**: 全ての計算処理とデータストレージをクラウドで管理

## 理論的背景
シンクエンジンは量子コンピューティングとニューロサイエンスの最新研究に基づいています。ユーザーの脳波パターンをリアルタイムで解析し、そのデータを基にAIが直感的なコーディングを実現します。

## 実装例
ユーザーが考えた「天気アプリ」の機能が、数秒でコード化される例を想像してみてください。天気データを取得し、ユーザーフレンドリーなインターフェースで表示するアプリが、あなたの一つの思考から生まれます。

## 実験結果
| 実験参加者 | 実験前スキルレベル | 実験後プロジェクト完成率 | 改善率 |
|------------|------------------|--------------------------|-------|
| Aさん      | 初心者           | 90%                      | 40%   |
| Bさん      | 中級者           | 95%                      | 20%   |
| Cさん      | 上級者           | 99%                      | 5%    |

上記の表から、シンクエンジンが特に初心者や中級者のプロジェクト完成率を大幅に向上させることがわかります。

## 将来性
シンクエンジンの開発が進むにつれて、プログラミングだけでなく、教育や医療、エンターテインメントなど多岐にわたる分野での応用が期待されています。

## そして
シンクエンジンは、IT業界における最大のブレークスルーとされています。しかし、この技術はまだ存在しません。想像の産物であり、現在の技術では実現不可能です。しかし、夢を見ることで新しい発見が生まれるかもしれません。未来は未知数です。
Vueのref()についてクイックに解説


### refについての概要

Vue.js公式には以下の通りにあります。

--引用--

>テンプレート内で ref を使用し、後から ref の値を変更した場合、Vue は自動的にその変更を検出し、それに応じて DOM を更新します。これは、依存関係追跡ベースのリアクティビティーシステムによって実現されています。コンポーネントが初めてレンダリングされるとき、Vue はレンダリング中に使用されたすべての ref を追跡します。その後 ref が変更されると、それを追跡しているコンポーネントの再レンダリングがトリガーされます。

https://ja.vuejs.org/guide/essentials/reactivity-fundamentals.html#ref

つまり、jsの変数の変化はDOMが感知できないわけです。そこでref()関数の登場というわけですね。
refで定義した変数に変更があれば、実際のDOMに即時反映します。

### 例1:refを使わない場合

下記は、vue内で定義した変数をtemplateに埋め込んでいる例です。change stateボタンを押すと、変数の値である"太郎"が"花子"に変わりますが、画面には反映されません。

```vue
<script setup>

let name = "太郎";
const changeState = () =>{
    name = "花子";
}
</script>
<template>

<span>
    {{ name }}
</span>

<button @click="changeState">change state</button>
</template>
```

### refを使用する場合

変数をrefで定義します。定義した変数の型はref オブジェクトです。
実際の値はrefオブジェクト内にラップされているため、scriptタグ内ではvalueでアクセスする必要がありますが、<template>タグ内では自動でアンラップしてくれるためvalueによるアクセスは不要です。

以下のコードで実行すると、change stateボタンを押下すると{{ name }}の中身である"太郎"が、"花子"に即時変更されます。

```vue
<script setup>
import {ref} from 'vue';
let name = ref("太郎");
const changeState = () =>{
    name.value = "花子";
}
</script>
<template>
<span>
    {{ name }}
</span>
<button @click="changeState">change state</button>
</template>

```

### 終わりに

refはデータをリアクティブに反映させるため必要という内容でした。
他にも子コンポーネントの値に反映させたり、refで定義した値を使用した関数も、変更があったら再計算してくれたりと、便利です。
GCPにDjangoの環境を整えていく_目次

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

この記事は自分が連載(?)している『GCPにDjango環境を様々なAWSサービスを使ってデプロイする』という記事をまとめた記事となります。

AWS環境でも似たことをやってますので、参考までに・・・

https://qiita.com/ohtsuka-shota/items/4b80538569b81f8c19a6

# 目次
## 1）GCPにDjangoの環境を整えていく01(VPC/subnet/Internet Gateway/FW/VM)
### 記事

https://qiita.com/ohtsuka-shota/items/4fa7cd52421ee5887295

### 関連
Deployment Manager用のyamlは以下のGitHubにあります。

https://github.com/ohtsuka-shota/gcp-django/blob/main/django01_all.yaml

## 2）GCPにDjangoの環境を整えていく02(Cloud SQL)
### 記事

https://qiita.com/ohtsuka-shota/items/2a144832e5fc5a8f1ed9

### 関連

GitHub作成予定

## 3）GCPにDjangoの環境を整えていく03(GCLB)
### 記事

https://qiita.com/ohtsuka-shota/items/99fa4cf44899c141fc9b

### 関連

GitHub作成予定

## その他）GCPにDjangoの環境を整えていく_Deployment Manager編

https://qiita.com/ohtsuka-shota/items/ab12f2d76474ddc2920c

---

今後も更新予定！
MVC(MVVM)の構造を動的ウェブサイトを例にまとめる。

# 初めに

- MVCの抽象的をまとめる
- MVCを動的Webを例に具体的にまとめる


### MVCを用いる利点
修正・作業する対象のファイルがわかりやすい


### MVCについての説明
**model** DBからデータを整理して受け取る役目
**service** データや情報の処理を制御する役目
**viewmodel**　対象のViewに渡すデータを管理する役目
**view**　Webページの見た目と動作を制御する役目

:::note info
Contorl　=　service　＋　viewModelとする
:::
### ASP.NET MVCとASP.NET Core MVCの比較

|　| ASP.NET MVC | ASP.NET Core MVC |
|:---|:---|:---|
|プラットフォーム | Windows Server | Windows Linux Mac |
|新機能の開発| 終了 | 継続 |
|ホスト先| llS| llS Apache Nginx |
|開発環境| Visual Studio | Visual Studio  Visual Studio Code |

### ASP.NET Coreの利点
時間当たりのリクエスト処理量が高い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951099/913beb39-c1cf-58c6-015e-8249370a071a.png)
icir

[
  {
    "IC Kurtosis": -0.11279587868224583,
    "IC Mean": -0.004497166686211212, // abs > 0.03
    "IC Skew": -0.11307242491618594,
    "IC Std.": 0.20910991312570465,
    "IR": -0.0215062338221516, // abs > 0.5
    "Risk-Adjusted IC": -0.0215062338221516,
    "p-value(IC)": 0.37988611442357534,
    "period": "1D",
    "t-stat(IC)": -0.8783394443376551
  }
]
Storybookで`@`のエイリアス使ったらエラーが出て困ったこと

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Next.jsで開発中にStorybookで`@`のエイリアス使ったらエラーが出て困ったことについて備忘録として記載します。

# 結論

以下のように`.storybook/main.ts`を修正したら治りました。

```ts:.storybook/main.ts

import type { StorybookConfig } from '@storybook/nextjs';
import path from 'path'; // ← 追加

const config: StorybookConfig = {
  "stories": [
    "../src/**/*.mdx",
    "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/addon-onboarding",
    "@storybook/addon-interactions"
  ],
  "framework": {
    "name": "@storybook/nextjs",
    "options": {}
  },
  "docs": {
    "autodocs": "tag"
  },
  // ↓↓↓↓↓↓追加↓↓↓↓↓↓
  "webpackFinal": async (config) => {
    if (config.resolve) {
      config.resolve.alias = {
        ...config.resolve.alias,
        '@': path.resolve(__dirname, '../src'),
      };
    }
    return config;
  },
  // ↑↑↑↑↑↑追加↑↑↑↑↑↑
};
export default config;
```

### 参考URL

https://qiita.com/nkn-ms/items/fe99187897de45122fd8

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
【Next.js】Server ComponentとClient Componentの使い方

## はじめに
nextjsを触り始めて、どうやらServer ComponentとClient Componentの２つのコンポーネントをうまく使い分けることでパフォーマンス、SEO、柔軟性あたりが向上するらしいので備忘録として残しておく。
※調べた感じの個人的な解釈で書いてます

## Server ComponentとClient Componentの違い
Server ComponentとClient Componentは、コンポーネントをサーバーサイドでレンダリングするか、クライアントサイドでレンダリングするかを制御するための方法みたいだ。

めちゃ簡単に言うと、
Server Componentはデータ操作やビジネスロジック等のユーザー操作が基本的に介入しないコンポーネントで
Client Componentはユーザーの操作が及ぶコンポーネントみたいに思っておけば良さそう。

## Server Component
上記記載の通り、データ操作やビジネスロジック等のユーザー操作が基本的に介入しないコンポーネントとして作成する感じになりそう。データベースのアクセスや APIアクセス、セキュリティ認証系もサーバーコンポーネントで実装した方が良さそうな感じがした。完全な静的ページはサーバー側でレンダリングにしてしまっても良さそう。

## Client Component
上記記載の通り、ユーザーの操作が及ぶコンポーネントを主に実装していくのが良さそう。主にユーザーが入力するようなForm系のボタンやインプットやテキストボックス等のユーザーにより、動的に変わっていくコンポーネントはClient Componentで作成していった方が良さそうな感じがした。

流れ的にはClient Componentで入力したものをServer Componentで処理するみたいな流れになりそう。

注意点としてはClient Componentの子コンポーネントとして読み込んだ場合はServer ComponentであったとしてもClient Componentとして解釈されること。

Client Componentで読み込む子コンポーネントは全てClient Componentとして読み込まれてしまうそう。もちろんそういったケースもあるため、回避記載方法もある。

## 終わりに
フレームワークなだけあって便利に作られているなぁ。
事例から学ぶ、chatGPTの使用に伴う危険性

# はじめに
chatGPTはプログラミングに限らず、執筆やメール文、議論や相談にも活用されるツールになっています。
幅広く使われるツールですが、危険性もあります。

この記事では、chatGPTの使用に伴う危険性を、事例をもとに考えていきます。

# 目次
* 事例：著作権を有するコードが学習に使われてしまった
* 事例から考えられる危険性
* 対策
    * 対策①：オプトアウト手続きを行う
    * 対策②：法人向けサービスの利用を考える
    * 対策③：データの一部を書き換えて入力する
* まとめ
* おわりに


# 事例：著作権を有するコードが学習に使われてしまった
### ■参考文献
[サムスン、ChatGPTの社内使用禁止　機密コードの流出受け（2023.05.03）](https://forbesjapan.com/articles/detail/62905)

### ■概要
>あるエンジニアが社内機密のソースコードをChatGPTにアップロードし、誤って流出させたことが発覚。これを受けサムスンは先週、「生成AI」ツールの使用禁止を社内に通知した。

# 事例から考えられる危険性
**１．<font color="red">**chatGPTの学習方法**</font>**
chatGPTは高度な応答を可能にするため、利用者が入力した情報を学習データとして使用する可能性がある。
これにより、例えば社外秘コードが、誰かの質問への回答に使用されるといったことが起こりえる。

**２．<font color="red">**サーバーのセキュリティ**</font>**
入力情報に気を付けていたとしても、入力情報が<font color="red">**ハッキングや不正アクセス**</font>によって漏洩してしまう危険性もある。
ChatGPTに入力した情報は、OpenAIのサーバーに一時的に保存される。しかし、それが必ずしも万全のセキュリティ環境であるとは限らない。

# 対策
情報漏洩を防ぐ対策をそれぞれ記述します。

## 対策①：オプトアウト手続きを行う
**オプトアウト**：許諾しない意思を示す行為

### ■ 概要
ChatGPTで入出力したデータはAIモデルの学習に利用されますが、ユーザーがオプトアウトの手続きを行うことで、データを学習させない設定を行うことができます。
※デフォルトだとオプトアウト設定をしていないので、入力情報は学習に使われます。

[データ管理FAQ（Open AI）](https://help.openai.com/en/articles/7730893-data-controls-faq)

### ■ 設定方法
[チャット履歴をオフにする設定（SCSK）](https://www.scskserviceware.co.jp/topics/primedesk/633.html#4-4)
![スクリーンショット 2024-05-03 152758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3497194/e8b2f3b8-9e4d-6e9d-8a76-6cce5f97e91b.png)

## 対策②：法人向けサービスの利用を考える
### 概要
会社員が使用する場合は、法人向けのGPTを使用する

### ■例
**[法人GAI](https://gomana.ai/product/hojin-gai/)**

* OpenAIのAPIを使用しているため、入力情報が学習に使用されない
    * chatGPTの使用の場合はデフォルトだと学習に利用される
* 入力情報を送る前に個人情報や機密情報のマスキング処理を行う機能が実装されている

## 対策③：データの一部を書き換えて入力する
### 概要
例えば、会社の情報やAPI Keyの情報は別の値に変更する
このテクニックをしても質問内容が変わるわけではないため、積極的に活用するべき

# まとめ
chatGPTはオプトアウト設定をしないと学習に使われてしまうため、安易に機密情報を入力すると情報漏洩につながってしまう。また入力情報がサーバーに保存される際、ハッキングの恐れもある。

この2つの危険性から情報漏洩を防ぐには、

**1. <font color="red">**オプトアウト設定を活用する**</font>**
**2. <font color="red">**個人情報を始めから入力しない**</font>**

この２点で対応できる

# おわりに
「デフォルトだとオプトアウト設定をしていないので、入力情報は学習に使われる」というのは知りませんでした。ただ学習に使われるかもしれない恐怖感はあったので、個人情報を入れない工夫はしていました（危なかった...）。

自分が使用するツールのリスクを前もって理解するのって、大事なことですね。
Raspberry pi 3 B+ setup メモ

##Removable Medium is inserted メッセージウィンドウを無効化
    Exploler > Edit > Preferences
    Uncheck Show available options for removable media when they are inserted

##SDCard 上でのSwap使用の停止

##MyApp.pyのデスクトップアイコン作成
[Desktop Entry]
Name=MyApp
Exec=/usr/bin/python3 /path/to/your/MyApp.py
Icon=/path/to/your/icon.png
Terminal=false
Type=Application
AZ-400学習メモ

## はじめに
AZ-400取ったので、苦手な部分を復習がてら記事化。

https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/az-400

## DevOpsとは
開発と運用が連携して開発する手法。開発と運用がそれぞれサイロ化しちゃっていると「新しいものを取り入れたいvs既存のルールに照らすと取り入れられない」になってしまい、新しいもの作り出せない状態になりがち->それなら連携してスピーディーにやっていこう！
……という流れだと理解している。定義はベンダや人によって全く同じにはならないけど、開発と運用が連携する、はベースにあるはず。

アジャイルやCI/CDはDevOpsを実現する方法の一部。組織文化の変革もDevOpsの実現には重要だけど、Azure試験の文脈だとリリースサイクルを短縮したりガバナンスを早い段階で利かせる(シフトレフト)ためにAzureのどんな機能を使えばいいか、というのが重要。

Azureの文脈のDevOps

https://learn.microsoft.com/ja-jp/devops/what-is-devops

## Azure DevOps
DevOpsに関するサービス群

### Azure Pipelines
CI/CD機能を提供するサービス。Node.js, .Net,など様々な言語に対応しており、PowerShellスクリプトを実行することもできる。Azure Pipelinesを使うにはAzure DevOps上でorganizationを作成する必要がある。

https://learn.microsoft.com/ja-jp/azure/devops/organizations/accounts/create-organization?view=azure-devops

#### flaky test
コードや実行環境が同じなのに合格したり失敗したりとテスト結果が不安定なテストのこと。Azure Pipelinesではシステム検出またはカスタム検出が利用できる。システム検出はテストを再実行することで検出し、カスタム検出は自前の検出メカニズムをAzure Pipelinesと統合して検出する。
flakyとしてマークされているテストは手動でマーク解除も可能。

### リポジトリ
Azure DevOpsシリーズにはAzure Reposがあるけど、GitHubと組み合わせることも可能。Azure ReposにはAzure Repos GitとAzure Repos TFVCがあるが、TFVCはクラシックパイプラインでのみサポートされる。

GitHubを使う場合、認証はGitHub App, OAUth, 個人用アクセストークン(PAT)の3種類が利用できる。

GitHub App…AzurePipelines IDで認証する。利用にはリポジトリに対してGitHub Appのインストールが必要インストールにはGitHub組織の所有者orリポジトリ管理者権限が必要。
OAuth…個人用GitHub IDで認証する。Checksなど一部の機能は利用できない。(利用したい場合はGitHub Appを使う)
PAT…個人用GitHub IDで認証する。OAuthとは異なり、Azure Pipelinesのアクセス許可を制御できる。

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/repos/github?view=azure-devops&tabs=yaml

#### ブランチポリシー
修正や新機能の開発を行いつつメインブランチの品質を保つには、変更を加える際にはメインブランチから分離させて作業を行ったり、マージ前にソースコードの品質を確認したりすることが必要。
ブランチポリシーでプルリク時にレビュー担当者の承認を必須にする、マージの種類を限定する、といった項目を設定することで、ルールに沿っていないソースコードのマージを防ぐことができる。

https://learn.microsoft.com/ja-jp/azure/devops/repos/git/branch-policies-overview?view=azure-devops

#### 機能ブランチ
新機能の開発やバグ修正作業をする際、ユーザごとにメインブランチをフォーク、ローカルで作業、コードをメインブランチにマージする……こともできなくはないが、他のユーザがどんな作業をしているか分かりづらい。
機能ごと(または修正するバグごと)にブランチを作成すると何やってるか確認しやすい。開発してみてやっぱやーめた、ってなったらマージしなければいいだけなので実験的な取り組みにも手を出しやすい。

https://learn.microsoft.com/ja-jp/azure/devops/repos/git/forks?view=azure-devops&tabs=visual-studio

ブランチ戦略をより詳しく知りたい場合は以下の記事がおすすめ。

https://accu.org/journals/overload/22/121/oldwood_1920/

## おわりに(学習した所感)
今まで受けたAzure試験(AZ-104, 204など)は試験範囲のAzureサービスがあって、それはこういうときに使います、こんな設定項目があります、というのを整理したら太刀打ちできたという印象。一方AZ-400は品質と速さを両立させるためのグッドプラクティス、グッドプラクティスが生まれる前のバッドプラクティスを踏まえてないと頭に入れづらかった。(自分の専門がAZ-104, 305寄りなのもあるかもしれない)

AZ-400はAZ-104, 305と比較すると教材も少ないので、いかにMSのドキュメントを読みこめるか、ラーニングパスからリンクされていないドキュメントや、ときにMS以外のサイトのDevOpsプラクティスのドキュメントにあたれるかは重要だと思う。
SoftEther VPN ServerとnginxでTCP 443ポートを共有する

# はじめに
SoftEther VPN Serverと、nginxのHTTPSでTCP 443ポートを共有するためのメモです。
構築後のイメージは、以下のようになります。

                       [Client]
                           |
                        TCP 443
                           |
                       [haproxy]
                           |
                           |
            --------------------------------
            |                             |
        TCP 5555                      TCP 10443
            |                             |
    [SoftEther VPN Server]               [nginx]
 

# 環境
Ubuntu 22.04 LTS

# 前提
* SoftEther VPN Serverへの接続はSoftEther VPN ClinetとSSTPを利用することを想定しています。
* SoftEther VPN Serverへの接続と、nginxへの接続を判別するため、TLSのSNI(Server Name Indication)を利用します。
そのためSoftEther VPN Server用のFQDNと、nginx用のFQDNは別々にする必要があります。以下の記載はSoftEther VPN Server用(vpn.example.com)、nginx用(www.example.com)として記載しています。
* SoftEther VPN Serverとnginxは同一マシンにインストールされている想定です。
* haproxyでTCP 443を利用するため、SoftEther VPN ServerおよびnginxでTCP 443ポートは事前に明け渡す必要があります。
  * SoftEther VPN ServerはTCP 443ポートを停止し、TCP 5555ポートで待ち受けるようにしておきます。
  * nginxはTCP 443ポートをTCP 10443ポートに変更しておきます。

# haproxyの構築
SoftEther VPN Serverへの通信と、nginxへの通信を振り分けるために、haproxyを利用します。

1.haproxyのインストール
```console
$ sudo apt install haproxy
$ sudo systemctl start haproxy
$ sudo systemctl enable haproxy
```

2.haproxyの設定ファイルを作成
```console
$ sudo vi /etc/haproxy/haproxy.cfg
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
        
frontend https
        bind    *:443 # 443ポートで待ち受け
        mode    tcp  # tcpモード(L4モード)
        option  tcplog
        log     global
        timeout client  30000
        tcp-request inspect-delay       5s
        acl     SoftetherACL    req.ssl_sni -i vpn.example.com # SoftEther向けFQDN
        acl     WebserverACL    req.ssl_sni -i www.example.com # nginx向けFQDN
        tcp-request content accept if { req.ssl_hello_type 1 }
        use_backend SoftetherVPN_ipvANY if      SoftetherACL
        use_backend Webserver_ipvANY    if      WebserverACL

backend SoftetherVPN_ipvANY
        mode    tcp
        id      100
        log     global
        timeout connect 30000
        timeout server  30000
        retries 3
        server  SoftEtherVPN localhost:5555 id 101 # SoftEtherのTCP 5555ポートに転送

backend Webserver_ipvANY
        mode    tcp
        id      102
        log     global
        timeout connect 30000
        timeout server  30000
        retries 3
        server  Webserver localhost:10443 id 103 # nginxの10443ポートに転送
```
3.haproxyの再起動
```console
$ sudo systemctl restart haproxy
```

## 動作確認
* SoftEther Clientから接続する際は、クライアントの設定で「UDP高速化機能を無効にする」を有効にして接続する必要があります。
* SSTPは特にクライアントの設定変更は不要です。
【ether.js + Alchemy】推定ガス代を計算するために必要なデータの取得方法



## ガス代（Transaction Fee）の計算方法
※個人的には日本語でも英語通り　「Transaction Fee」　という呼び名に統一してほしい。混乱する。

<br>
<B>A. ガス代（Transaction Fee）　 
= （C.ベースフィー + D.プライオリティフィー）　x B.ガス使用量</B>

（Etherscanより）
[![Image from Gyazo](https://i.gyazo.com/16c4fb59eb736d4bdb3a5ef75ea013ce.png)](https://gyazo.com/16c4fb59eb736d4bdb3a5ef75ea013ce)



## 環境
- Node.js v20.0.0
- スマートコントラクト：Alchemyで作成
- テストネット：　sepolia

<br>
（参考）

https://qiita.com/tatsuya1970/items/2381d21399a19f349e57


## 手順　・コード

node.js のプロジェクトを作成し、
Ethereumブロックチェーンのライブラリ ethers.js をインストールします。

```
$ npm init
$ npm install --save ethers
```

コードは以下
```index.js
const { ethers } = require("ethers");

ALCHEMY_API_KEY ="<ALCHEMY_API_KEY>"
const provider = new ethers.AlchemyProvider('sepolia', ALCHEMY_API_KEY)

async function getBaseFee() {
    const block = await provider.getBlock('latest'); // 最新のブロック情報を取得
    return block.baseFeePerGas; 
}

async function getGasdata() {
    const result = await provider.getFeeData();
    return result;
}

getBaseFee().then(baseFee => {
    console.log('BaseFee:', baseFee); 
});

getGasdata().then(result => {
    console.log(result); 
});


```
<br>
実行すると

```
BaseFee: 8123134207n
FeeData {
  gasPrice: 9123134207n,
  maxFeePerGas: 17246268414n,
  maxPriorityFeePerGas: 1000000000n
}
```

<br>
再び、ガス代の計算式<br>
<b>ガス代（Transaction Fee）　 <br>
= （ベースフィー + プライオリティフィー）　x ガス使用量<b>

そのうち、ベースフィーとプライオリティフィーは取得できました。
- ベースフィー --- BaseFee: 8123134207n
- プライオリティフィー --- maxPriorityFeePerGas: 1000000000n

なお、ガス使用量は複雑なので、ここでは触れません。

また、gasPriceは旧式のガス料金システムにおける単位ガスあたりの料金なので使いません。


以上です。
【用語】AdaGrad、RMSProp、Adam

E資格用語の備忘録
シラバス2024 3.深層学習の基礎 (2)深層モデルのための最適化 ⅲ.適応的な学習率を持つアルゴリズム

# AdaGrad
各パラメータに対して学習率を適応的に調整することで、スパースな勾配更新問題に対処。
過去の勾配の二乗和の平方根で学習率を割ることで、頻繁に更新されるパラメータの学習率を小さくし、稀に更新されるパラメータの学習率を大きくする。
```python
import numpy as np


# 最適化手法 : AdaGrad
class AdaGrad:
    # 学習率を0.01で初期化
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None  # 二乗和を保持する変数

    # パラメータの更新、パラメータと勾配を受け取る
    def update(self, params, grads):
        # 初回、過去の二乗和が無い状態
        if self.h is None:
            # 空の辞書を代入
            self.h = {}
            # 各パラメータのキーと値を順に取得、.items()は辞書のすべてのキーと値のペアを返すメソッド
            for key, val in params.items():
                # valと同じ形状のゼロ配列を生成
                self.h[key] = np.zeros_like(val)

        # パラメータの各キーを順に取得、.keys()は辞書のすべてのキーを返すメソッド
        for key in params.keys():
            # 二乗和
            self.h[key] += grads[key] * grads[key]
            # 学習率をhの平方根を用いてパラメータを更新
            # 1e-7はルートの中か外か、どちらでもよい
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
```
# RMSProp
AdaGradの問題点として、学習が進むにつれて学習率が急激に減少する傾向があるが、RMSPropは過去の勾配の二乗和の指数移動平均を用いて学習率を現在のデータをより重視するよう調整し、より安定した学習が可能となった。
更新が頻繁なパラメータは小さく更新され、更新が滅多に無いパラメータは大きく更新される。
# Adam
モーメンタムとRMSPropを組み合わせた手法。
勾配の一次モーメント（平均）と二次モーメント（分散）の指数移動平均を計算し、それぞれのパラメータの学習率を調整する。イテレーションが進むにつれバイアス補正は小さくなる。
【用語】L1正則化、スパース表現、L2正則化、weight decay

E資格用語の備忘録
シラバス2024 3.深層学習 (3)深層学習のための正則化 i.パラメータノルムペナルティ

# L1正則化（Lasso回帰）
モデルの学習過程において、パラメータ（重み）の絶対値の和に基づくペナルティ項を追加する。
一部のパラメータが0になり、結果的に特徴量選択の効果がある。
L1正則化は不要な特徴量を自動的に取り除くことができる。

# スパース表現
データの多くの要素が0または非常に小さい値である表現で、データの次元削減やノイズ除去、特徴選択などに有用。L1正則化はスパース表現を促進する効果がある。

# L2正則化（Ridge回帰）
モデルの学習過程において、パラメータ（重み）の二乗和に基づくペナルティ項を追加する。
全てのパラメータがある程度小さく保たれ、過学習を防ぐ効果がある。
特徴量間の多重共線性を緩和する効果もある。
### 特徴量間の多重共線性
複数の説明変数（特徴量）が強く相関している状況を指す。（一部の説明変数が他の説明変数の線形組み合わせとして表現できる）

# weight decay
ニューラルネットワークの学習において、重みパラメータが大きくなりすぎるのを防ぐ。
損失関数に重みの二乗和（L2ノルム）に基づくペナルティ項を追加する。（実質的にL2正則化と同等の効果）
Weight decayを適用すると、モデルの過学習を防ぎ、汎化性能を向上させる。
論文に載せる図のためのMatplotlibのテンプレート(JupyterNotebook想定)！

# 結論
次のコードをpython notebookの最初のセルで実行
→図を作る際は，default_ax関数にaxを渡すだけ．
```python
import matplotlib.pyplot as plt

%config InlineBackend.figure_format = 'retina'   # 図の解像度を上げる

plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定
plt.rcParams['mathtext.fontset'] = 'stix' # math fontの設定
plt.rcParams["legend.fancybox"] = False # 丸角
plt.rcParams["legend.framealpha"] = 1 # 透明度の指定、0で塗りつぶしなし
plt.rcParams["legend.edgecolor"] = 'black' # edgeの色を変更
plt.rcParams["legend.handlelength"] = 1.3 # 凡例の線の長さを調節
plt.rcParams["legend.labelspacing"] = 0.05 # 垂直方向（縦）の距離の各凡例の距離
plt.rcParams["legend.handletextpad"] = 0.3 # 凡例の線と文字の距離の長さ
plt.rcParams["legend.markerscale"] = 1 # 点がある場合のmarker scale


def default_ax(ax):
    spines = 2
    #軸の太さの調整。方向を辞書のキーとして渡し、set_linewidthで大きさを微調整できる
    ax.spines["top"].set_linewidth(spines)
    ax.spines["left"].set_linewidth(spines)
    ax.spines["bottom"].set_linewidth(spines)
    ax.spines["right"].set_linewidth(spines)

    ax.tick_params(axis='x', direction="in", length=7, width=2, top=True, right=True, left=True, bottom=True, pad=7, labelsize=30, which='major')
    ax.tick_params(axis='y', direction="in", length=7, width=2, top=True, right=True, left=True, bottom=True, pad=4, labelsize=30, which='major')
    ax.tick_params(axis='y', direction="in", length=5, width=2, top=True, right=True, left=True, bottom=True, which='minor')
    ax.tick_params(axis='x', direction="in", length=5, width=2, top=True, right=True, left=True, bottom=True, which='minor')
    return ax
```

# 使い方
```python
import numpy as np

x = np.linspace(-7, 7, 100)
y = np.sinc(x)

# axを渡す
ax = default_ax(plt.figure().add_subplot())

ax.set_xlabel("x", fontsize=30, labelpad=-3)
ax.set_ylabel("y", fontsize=30)

ax.plot(x, y, c="blue", lw=3, label="sinc(x)")
ax.legend(fontsize=20)    # legendの枠の太さは，.get_frame().set_linewidth(太さ)を使って調節できる
```

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714489/57b20221-e8ba-ef35-46e0-221bc4b948ea.png)


# 補足
Matplotlibのデフォルト設定の図は次の様になります．
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714489/848b0038-3b37-4ea7-f7f0-7d9042f0feab.png)
悪くはないのですが，論文に載せるにはメモリの数字が小さかったり，解像度が物足りません．

default_axの中で設定されている数値はお好みの様に変えてください！

# ごめんなさい
このコードを作成するにあたって様々な記事をこれまで参考にさせていただいております．
コピペした部分もあると思うのですが，どなたの記事をどの部分で参考にしたか覚えていないため，参考文献に引用することが出来ません．
みんなありがとう！
Pythonで浮動小数点を出力してみる

```
% python
Python 3.9.9
>>> print(0.1 + 0.2)
0.30000000000000004
>>> print(0.1 * 0.2)
0.020000000000000004
>>> print(0.3 / 0.1)
2.9999999999999996
>>> print(0.3 / 0.1 * 0.01)
0.029999999999999995
>>> print(0.3 / 0.1 * 0.00001)
2.9999999999999997e-05
>>> print(0.3 / 0.1)
2.9999999999999996
>>> print(0.3 / 0.1 * 0.1)
0.3
>>> print(0.3 / 0.1 * 0.01)
0.029999999999999995
>>> print(0.3 / 0.1 * 0.001)
0.0029999999999999996
>>> print(0.3 / 0.1 * 0.0001)
0.0003
>>> print(0.3 / 0.1 * 0.00001)
2.9999999999999997e-05
>>> print(0.3 / 0.1 * 0.000001)
2.9999999999999992e-06
```