OmniAICreator/Qiita-1.07M huggingface dataset:
不具合チケットの作成方法

　2000年代よりスマホが普及されはじめ、モバイルとWebの様々なアプリケーションが作られることで人々の生活を楽にしてくれてます。それほどユーザー目線を優先する開発文化が大切にされ、開発とテスト工程ではより充実しているアプリを公開するために「品質向上」を第一の目標としています。
　その中でQAは、バグを見つけ解決するために開発側との円滑なコミュニケーションをすることが大事です。ただチャットで「～機能が動きません」とか「～画面が仕様と異なりますが」のようなメッセージだけには非常に効率ではないしバグを管理することも難しいはずです。そいうことでこの度は、バグチケットの作成についてご説明させていただきます。

＜目標＞ 
- 不具合チケットの作成項目と内容が分かる

## 1. バグチケットの作成項目
#### ① インシデント詳細
　バグの内容を一つの文章にまとめるところです。簡単には下記のような文章の仕組みで作成することができます。一目でどのバグなのか分かるように作成することが大事です。

**"【どの画面にて】【どの操作をした時】【どの事象が発生する】"** という仕組みになります。


#### ② 期待結果と実際結果
　仕様通りであればどの動きが正しいのかについての期待結果と、実際にどんなバグが発生したのかについての実際結果を記入するところになります。


#### ③ エビデンス（画像・動画）
　テキストだけでバグの内容が分かりづらいこともあると思います。そのときはテスト端末やブラウザーのキャプチャー画像とか録画した動画といったエビデンスを添付することでチケットの内容の信頼度を高めることができます。


#### ④ 仕様書URL

　バグが発生した画面のUIとか詳細説明といった記載のある仕様書のURLを貼り付け、期待結果を再度確認します。または仕様を作成していた開発側にとっては、バグ内容に基づいて仕様に記載漏れがあると気づいた場合、仕様を更新するタイミングにもなるかもしれません。

 

#### ⑤ 再現手順（前提条件・手順）
　QA側でどの手順で操作したらこのバグが発生したのかについて作成します。特定な条件で発生することであれば前提条件を記入することが大事です。


#### ⑥ 再現率

　あるバグはいつも発生するわけではないでしょう。再現率が低かったら原因を早めに見つけることは難しくなり一層詳細にコードを確認する必要があるわけです。書き方としてはテストを5回実施して5回全部同じバグが発生したとしたら「5/5」あるいは「100%」と記入します。

 

#### ⑦ 実施端末の情報（OS・バージョン）

　テスト端末のスマホがiOSなのかAndroidなのか、バグ発生有無がOSによることもあります。OSバージョンの違いもそうです。そいうことで、どの機種のスマホでテストを実施したのかについての情報を記入します。



#### ⑧ アプリの環境・バージョン 

　アプリが公開されるまで、開発進捗によって異なる環境のサーバーからリリースされ検証していきます。QA側だとしてもQA環境でテストを実施するわけではありません。Staging環境のみで実行できる機能があれば、開発側がリリースしてくれたStaging環境のアプリをインストールしテストを行うことになります。そういうことでどの環境でテストを実施したのか、このバージョンは何かを記入するところになります。
 

#### ⑨ テスト項目の存在有無

　ほとんどのバグはQA側がテスト項目に基づいてテストを実施しながら見つけることです。あるテストファイルのどの項目に該当されるケースなのかを記入することで、コードが修正されたらこのテスト項目をすぐ開き再確認することができるようにします。たびに該当テスト項目がなくて「無し」に記入することもありますが、これは設計にてテスト観点を決めたとき漏れてしまったテストケースであるかもしれないのと言えます。

## 2. 伝達力を1%上げる
#### ① 実際結果には実際結果を記入しよう

　当たり前の話だと思われるかもしれません。しかし、下の例のように期待結果から一文字だけを変え実際結果だと書くことがありますが、この文章はそんなに伝わらないと感じるかもしれません。

例）
- 期待結果：ログイン画面にて「ログイン」ボタンを押下すると、TOP画面に遷移すること
- 実際結果：ログイン画面にて「ログイン」ボタンを押下すると、TOP画面に遷移しない


　実際結果には「実際にどんな事象があったのか」を記入することが読み手にとっては分かりやすいはずです。

例）
- 実際結果：ログイン画面にて「ログイン」ボタンを押下すると、TOP画面に遷移せずローディング画面が表示し続けてしまう。

 

#### ② 表を活用しよう

　バグの内容が簡単だったら文章だけでチケット作成を完了すればいいのですが、記入すべき要素がたくさんある場合は書き方を迷っちゃうことがあります。この時は、表にまとめるのがより分かりやすく伝わる方法の一つです。

## 3. チケット作成後のバグ管理

　チケット作成が終わりましたら担当者を割り当てします。最終的には開発者になると思いますが、内容確認が必要だとしたらリーダーに割り当て、リーダーからのレビュアーが終わったら担当者を開発側のメンバーに再度変えてコードの修正をお願いすることになります。

　開発者はバグチケットの内容に基づいてどのところのコードを修正しなければならないのか修正範囲を把握することができます。修正した後はまた担当者がQAに変わり、QA側から再確認を行います。あの機能が仕様通り動ければテスト結果をOKに記入することでテストを完了させます。

　チケットの内容に補足が必要の場合、開発者は必要な情報を求めることになりますが、この手間をなくすのがコミュニケーションにおいて大事だと言えます。バグが発生する特殊条件など、読み手が求めている情報を記入することは伝達力を高められる方法だと思います。

　こういうふうにQA側では開発エンジニアとコミュニケーションを通して様々なバグを解決し問題点を改善していくことでサービスを品質を高めていきます。
うちのフロントがvueでテクニカルなツールチップ作ってて、やるぅ〜って思った話

# 概要
いやいや、vueでツールチップ作ろうと思えば簡単に作れるよね。
v-ifとか、detailsとか使えば余裕っすやん。
ってお思いの方は多いはず。

でも、難しいのが、

##### 表示箇所以外をクリックした時に表示が消えるようにする。

そう、これが入ると一筋縄ではいかなくなるんよな。
（でもツールチップといえばこれはいれたい）

まあ、一旦ツールチップのコンポーネントを作っちゃえば、
それ使い回すんけど、そこまではいらないし、簡単に実装できちゃうやつが欲しい。
そんなことを思いながら、日々開発してたら、
うちのフロントエンドが作ってきたツールチップがかなりテクニカルやった。
（どっかで調べて拾ってきたんかな）

ちなみにtailwindとvueのgroup機能使ってる。
とりあえず、コードみてほしい。
（わかる人にはわかると思う）

```vue:.vue

  <div class="group" tabindex="0">
    <span>表示ボタン</span>
    <div class="invisible opacity-0 group-focus:visible group-focus:opacity-100">
    ここは表示させる中身
    </div>
  </div>

```

ワイ、これ見た時は「なんかよくわかんねー！まあいっか動いてるし笑」って思ってた。
しかしよく見ると@clickとかないし、内心どうやってるんやろ。。。とは思いながら、そのまま触れへんかってん。

でも今日、さっき、今、「やっぱツールチップ必要やんここ！」って場面があって、
彼が作ったツールチップの記述を紐解くことにした。

すると色々調べてて完全理解したあとに「なんやこれやべー！」
って感動してしまった。んで今これ書いてる。


# 仕様の説明

結論からいうと、
##### group-focusでフォーカスされてる時の状態で表示・非表示を切り替えてた。

vueのgroupやpeerの機能って、対象の状態によってその対象の子要素とか兄弟要素のcssを噛ませることができんねん。
だから今回のでいうと、class="group"のdivが対象で、
そいつのfocus/focus-outで、group-focusしてるdivの表示・非表示を切り替えてるって仕様。

さらに、ここが一番やるぅー！って思ったところなんやけど、
divとかspanってfocusできへんのよ。
なので、はじめ理解してないから、focusが効かなくて動かない。
そして、子要素のdivを無理やりlabelにしたりして悪いことしてる気分になった。笑

ここがミソでdivにtabindex="0"付けてfocusできるようにしてるねん。
やべー！
tabindexってあんま使わんし、使うとしてもキー操作できるようにする時くらいか。

まあなんにせよ、よく考えたなって思う。深く思う（だいぶ褒めてる）

ちなみにこの記述は装飾cssをあえて省いている説明用のタグなので、
使いたい人はお好みに装飾してください。

今回はtailwindでやったけど、
工夫したらチェックボックスのcheckedで判別して、labelやらfocus-withinやら使ったら
普通のcssでも実装できそうな気がするとかしないとか。
Linode Kubernetes Engine に Firewall を設定する (Akamai)


# はじめに
Akamai が提供する ``Linode Kubernetes Engine (LKE)`` と ``Cloud Firewall`` は組み合わせて使うことができます。本記事では、``Terraform`` を使って、LKE のノードに Cloud Firewall を適用する方法について記載します。
# LKE とは
Linode Kubernetes Engine（LKE）は、Kubernetes 上に構築されたマネージドコンテナオーケストレーションエンジンです。LKE を使用すると、独自の Kubernetes クラスタを構築（および保守）することなく、コンテナ化されたアプリケーションを迅速にデプロイして管理することができます。すべての LKE インスタンスには、追加費用なしでフルマネージドなコントロールプレーンが装備されます。アプリケーションを実行するワーカーノードと、アプリケーションが使用するオプションの NodeBalancers（ロードバランサー）および Block Storage ボリュームは課金対象です。

:::note warn
プロダクション環境では、LKE のコントロールプレーンを HA 構成にしてください。HA 構成オプションは課金されます。
:::

# LKE のネットワークとファイアウォールの情報
LKE クラスタでは、クラスタ内からしかアクセスできないエンティティやサービスもあれば、パブリックにアクセスできる（インターネットから到達可能な）エンティティやサービスもあります。詳細については下記ドキュメントを参照してください。

https://www.linode.com/docs/products/compute/kubernetes/get-started/#general-network-and-firewall-information

このページに書かれている設定を Cloud Firewall で実現すると次のような結果となります。
![create-firewall-rule.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/72754c52-b836-b33c-4dad-0b8aea1a1ce0.jpeg)
設定後は、``192.168.128.0/17``の LKE 内部のネットワークから来る特定ポートへのアクセスのみしか許可しません。

:::note warn
本例では前段に NodeBalancers のようなサービスがあることを前提としています。NodeBalancers ではパブリックのインターネットに TCP 443 ポートを公開します。
:::

上記のルールを Linode インスタンスに適用した後の例です。
![linode-lke-firewall-linode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/57d80af9-4325-17a9-eb51-2e5d36524fe6.jpeg)




# サンプルコードの入手
以下のサイトから terraform script を入手します。

https://github.com/BrandonKang/lke_firewall

``lke-firewall.tf`` を作業ディレクトリに置きます。

```
terraform init
```
.tf ファイル内のトークンを設定をします。


```
terraform plan
```

```
terraform apply
```
実行して成功した例が以下となります。
```
linode_firewall.lke_firewall_sample: Creating...
linode_firewall.lke_firewall_sample: Creation complete after 2s [id=207767]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```

実行後、Cloud Manager から登録されたことを確認します。


![confirm-firewall-rules.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/db25d0a9-990d-f920-efd3-b6d97b9f7f89.jpeg)

Terraform のサンプルは以下のページを参照してください。

https://registry.terraform.io/providers/linode/linode/latest/docs/resources/firewall

前段に配置する NodeBalancers の設定については以下のドキュメントを参照してください。

https://www.linode.com/docs/products/compute/kubernetes/guides/load-balancing/

以下の記事にも NodeBalancers を紹介していますので参考にしてください。

https://qiita.com/isss802/items/8405f8fd26afb7a948be

# まとめ
LKE にはクラスタ内部で行われる通信とパブリックに公開される通信があります。本記事は推奨されたルールを Terraform から作成するサンプルを紹介しました。皆さんのセキュリティポリシーに合わせてカスタマイズしてください。
ModelについてViewModelが行うこと

は、イベントに対する反応と戻り値のないメソッドの呼び出ししかない

# だけではない。

設計による。
MVVMとして決まった方式があるわけではない。

MVCの場合
C=>M=>Vの方向にデータが流れるので
MからCへ戻るデータはない。

MVVMでは VM<=>Mとデータは双方向に流れるので決まりはない。

戻り値を用いてVIewModelで処理をしていけないという決まりもない。


### MVCのMとMVVMのMは違う。


# 戻り値をもらうと依存してしまうという誤解

ViewModelは元からModelに依存しているので戻り値もらっても変わらない。

# 戻り値もらうと密結合になるという誤解

ならない。

# MVVMの単一方向データフローであるという誤解

　V->VM->M

と依存方向が一方向なだけでデータが一方向ではない。データは双方向

# 非同期処理は一方法だけではない

 ・async/await
 ・コールバック
 ・イベント通知
RubyとRubyGemsのバージョン違いで困ったときの解決策

## はじめに
こんにちは！今回はRubyやRubyGemsのバージョンが異なる場合に発生する問題とその解決策について解説します。

## Rubyとは？

Ruby（ルビー）は、オブジェクト指向のプログラミング言語です。Web開発からシステムスクリプトまで幅広く使われています。

## RubyGemsとは？

RubyGemsは、Rubyのライブラリ（Gem）を管理するためのツールです。コマンド一つでライブラリをインストール、アンインストール、アップデートすることができます。

## バージョン違いが問題を引き起こすケース

### シナリオ 1: Gemfileに指定されたRubyのバージョンとシステムのRubyのバージョンが違う

エラーメッセージ例：

```
Your Ruby version is 2.6.10, but your Gemfile specified 3.2.2
```

### シナリオ 2: RubyGemsのバージョンが古い

エラーメッセージ例：

```
Your RubyGems version (3.0.3.1) has a bug...
```

## 対処法

### 対処 1: Rubyのバージョンを揃える

rbenvやRVMを使ってプロジェクトごとにRubyのバージョンを管理できます。

#### rbenvを使う場合：

```bash
# Rubyのバージョンを確認
rbenv install --list

# 指定のバージョンをインストール
rbenv install 3.2.2

# プロジェクトに適用
rbenv local 3.2.2
```

### 対処 2: RubyGemsのバージョンを更新する

```bash
# RubyGemsをアップデート
gem update --system
```

## まとめ

RubyのバージョンとRubyGemsのバージョンをしっかりと管理することで、多くの問題を避けることができます。rbenvやRVM、`gem`コマンドを活用して、快適な開発環境を築きましょう。


## 終わりに

以上がRubyとRubyGemsのバージョン違いとその解決策についての解説です。

この記事がRubyとRubyGemsのバージョン管理についての基本的な理解と対処法に役立つことを願っています。
ReactのPort変更

## はじめに
表題通り、ReactでPORT番号（4000）を変更する

## 対応
```.env
PORT=4000
```
→これでいけます！！

## 試した事
```
  "scripts": {
    "start": "react-scripts start",
    "dev": "react-scripts start --port 4000",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
```
→`yarn dev`で実行。結局、3000番で起動する。packege.jsonの起動方法を変えるだけではうまくいかないようです。
【Golang】Udemy教材でTodoアプリをつくったときにハマった・勉強になったこと

# はじめに

自分のように同じように躓く人が少なからずいると思ったので、アウトプットも兼ねて記事にしました。

学習時のバージョンは `v1.20.7` です。

```
$ go version
go version go1.20.7 darwin/amd64
```

# Go言語を学習しようと思った理由

お盆になって時間ができたので、前から気になっていた Go 言語の勉強をしてみました。

学習する意図としては、これまでバックエンドは Scala しか使ったことがないので、「他のバックエンド言語を知ることで多角的な視点を持つことができるのでは？」と思ったのと、なぜこれほどまでに Go 言語の人気が急上昇しているのか、実際に使いやすさを体験してみたかったからです。

なので、簡単な Todo アプリ開発を通して、言語の特徴や作成背景に興味を持つきっかけになればと思っています。

# 🚨 ハマりポイント

## TODOアプリの config 設定

クッソハマった。

- import するときは go.mod ファイルの module 名を一致させないといけない。

```go: go.mod
module todo_app_mod

go 1.20

require gopkg.in/ini.v1 v1.67.0

require (
	github.com/google/uuid v1.3.0 // indirect
	github.com/mattn/go-sqlite3 v1.14.17 // indirect
	github.com/stretchr/testify v1.8.4 // indirect
)
```

```go: sample.go
package main

import (
	"todo_app_mod/app/user"
)
```

- ini ファイルを利用するのにパッケージの import が必要

https://github.com/go-ini/ini

## インストールが必要だったもの

インストールに関しては、Udemy の教材を順番に取り組んでいけば問題なかったのですが、私の場合、すぐに Todo アプリの開発に取り掛かったため、下記の点でつまづくことがありました。

### 1. uuid

ランダムな一意の文字列を生成するときに使う。
どの言語でもお馴染みの uuid だが、今回の Todo アプリの開発では ユーザーのセッション情報を管理するために利用した。

```
$ go get github.com/google/uuid
```

### 2. go-sqlite3

sql コマンドを利用できるようにする。
ローカルで sql を確認したい時に利用した。

```
$ go install github.com/mattn/go-sqlite3
```

# ✏️ 勉強になったこと

## 関数とメソッドの違い

同じ `func` で関数を作成したとしても、レシーバとして定義されているかどうかで、呼び方が異なる。

**関数**：関数は特定の型に紐づかない。

```golang:function.go
func Add(a, b int) int {
    return a + b
}
```

**メソッド**：メソッドは特定の型に関連付けられる。この型をレシーバと呼ぶ。

```golang:methods.go
type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}
```

## GitHub で見る時のインデント補正

Go言語は基本的にタブでインデントを行うと思いますが、GitHub 上だとタブのスペースはインデント深すぎてめちゃくちゃみづらいんですよね。。。
そこで、みやすくなる方法を調べたところ、 `.editorconfig` の `indent_size` を設定すると、インデント幅を設定できるようです。

```
# indicate this is the root of the project
root = true

[*]
charset = utf-8

end_of_line = LF
insert_final_newline = true
trim_trailing_whitespace = true

indent_style = space
indent_size = 2
```

https://zenn.dev/spiegel/articles/20200922-editorconfig

## package の指定方法

Scala では、ディレクトリ階層を package で表現していたが、Go では1つの package 名しか指定しない。
例えば、、、下記のようなイメージ。

### Scala の場合

```scala: Sample.scala
package model.api.test
```

### Go の場合

```go: sample.go
package model
```

Go 言語自体が簡潔な package 名にすることを推奨しているようです。

https://go.dev/doc/effective_go#names

# さいごに

だいぶ駆け足でしたが、実際に手を動かしてみることによって Go の概要をなんとなく把握することができました。
Scala とおなじ静的型付け言語だからか、そこまで抵抗なく開発を進めることができました。

まだ、並行処理など分野には手を出せていないので、Go の学習が必要になったタイミングで、改めて復習していきたいと思います。
ViewModelはModelの影ではない

MVVMアーキテクチャにおいて
ViewModelとModelでどうやり取りするかは何も規定されていない。
ViewModelのプロパティと同じものをModelが持つ決まりもない。

ModelはViewModelの事を知らない。
ModelとViewModelには関係性はない。

Modelはメソッドを実行して戻り値を返して、それがどう使われるかを
しらない。

Modelはデータを公開しても、それがどう使われるかを知らない。


ModelはViewModelに依存していない。



# MVVMの役割分担

# View
表示、入力

# ViewModel
 Viewの表示データ、入力処理
 Modelと通信

# Model
 ソフトウェアの内、View,View以外の全部

それぞれ責務と役割があるだけで
View-ViewModel-Modelに相関関係はない。
Cytoscapeを使ったグラフ構造の描画方法

# Cytoscapeとは
* CytoscapeはJavaScriptで使えるグラフ描画ライブラリ
* npmやyarnでインストール可能
* reactでcytoscapeを使えるライブラリもある
```sh:ターミナル
yarn add -D cytoscape
yarn add -D react-cytoscapejs
```
* 公式のreferenceは[こちら](https://js.cytoscape.org/#core/initialisation)
# Cytoscapeの使い方
### 基本的な要素
* container：グラフを保持するDOM element
* elements：要素の配列，要素は以下の値を持った連想配列
    * data：ノードやリンクの上位概念であるグラフのプレーンオブジェクト
        * id：データのid
        * name：データの名前
        * label：データのラベル
        * parent：親ノードのid
        * source：リンクの根元にくるノードのid
        * target：リンクの先端にくるノードのid
    * classes：データの種類
* style：ノードやリンクのスタイルを指定する配列，cssみたいなもの
    * selector: スタイルを反映させる要素を指定
        * `node`，`link`による種類の指定や`.any`によるクラスの指定，`#any`によるidの指定が可能
    * style：スタイルの連想配列，styleという配列の中にある連想配列がsytleというkeyを持つ入れ子構造
        * label：要素のラベル
            * `data(label)`を指定すると`label`が描画されるようになる
        * content：要素の中身
            * 使い方はlabelと一緒っぽい
        * shape：要素の形
            * ノードだと`rectangle`や`round-rectangle`などを指定可能
        * text-halign，text-valingn：ラベルやコンテンツの位置(水平方向，垂直方向)
* layout：レイアウトを指定する連想配列
    * name：レイアウトの名前
        * `breadthfirst`と書くと幅優先で描画される？
```js:グラフを表す連想配列の例
{
    container: document.getElementById('cy'),
    elements: [
        {data: {id: '0'}},
        {data: {id: '1'}},
        {data: {
            id: '2',
            source: '0',
            target: '1'
        }}
    ],
    style: [
        {
            selector: 'node',
            style:{label: 'data(id)'}
        }
    ],
    layout: {name: 'random'}
}
```
# 実装方法
### グラフの描画方法
* `cytoscape`の引数に設定情報を書いた連想配列を渡すことでグラフを作成
```js:sample.js
var cy = cytoccape({
    container: document.getElementById('cy'),
    elements: [
        {data: {id: '0'}},
        {data: {id: '1'}},
        {data: {
            id: '2',
            source: '0',
            target: '1'
        }}
    ]
})
```
### グラフにノードを追加する
* `cy.add()`を使ってグラフにノードやリンクを追加可能
MacのプロセッサがARMかIntelかを簡単に確認する方法

## はじめに

こんにちは、今日はMacのプロセッサがARMベースかIntelベースかを確認する方法をご紹介します。この情報は、特定のソフトウェアや開発環境を設定する際に非常に重要です。

## プロセッサとは？

まず初めに、プロセッサとは何かを簡単に説明します。プロセッサはコンピュータの「脳」のようなもので、プログラムの命令を処理する部分です。Macには主に二つの種類のプロセッサが存在します：ARMベースとIntelベース。

- **ARMベース**: Appleが自社で設計したプロセッサ。例えば、Apple M1, M1 Pro, M1 Maxなど。
- **Intelベース**: Intel社が製造したプロセッサ。例えば、Intel Core i5, i7, i9など。

## ターミナルで確認する方法

### ステップ 1: ターミナルを開く

1. Spotlightを開く（Command + Space）
2. "ターミナル"と入力してEnter

### ステップ 2: コマンドを実行

ターミナルが開いたら、以下のコマンドを入力してEnter。

```bash
uname -m
```

- 出力が`arm64`なら、あなたのMacはARMベースです。
- 出力が`x86_64`なら、あなたのMacはIntelベースです。

## 「このMacについて」で確認する方法

### ステップ 1: Appleメニューを開く

画面左上にあるAppleロゴ（）をクリックします。

### ステップ 2: 「このMacについて」を選ぶ

ドロップダウンメニューから「このMacについて」を選びます。

ここで、「プロセッサ」または「チップ」という項目でプロセッサの種類が表示されます。

- `Apple M1`や`Apple M1 Max`などと書かれていれば、ARMベースです。
- `Intel Core i5`や`Intel Core i7`などと書かれていれば、Intelベースです。

## まとめ

以上がMacのプロセッサがARMかIntelかを確認する2つの簡単な方法です。これを確認することで、ソフトウェアの互換性などを事前に知ることができ、トラブルを避ける手助けになります。

※**捕捉事項**
現在はApple Silicon（M1/M2チップ）を搭載したMacでRosetta 2を使用してターミナルを起動すると、そのターミナルセッションはIntel x86_64アーキテクチャをエミュレーションします。その結果、`uname -m`コマンドを実行すると、出力は`x86_64`になります。

Rosettaを使用せずにターミナルを起動した場合は、`uname -m`の出力は`arm64`になるはずです。このようにして、どのアーキテクチャでコマンドを実行しているのか確認できます。
de2000の計算コード

de2000を計算する式は書いてあってもコードは置いてないことが多いので
```python
from math import sin, cos, atan2, exp, radians, degrees
import numpy as np
import cv2
import matplotlib.pyplot as plt

#input
L1 = 50
a1 = 20
b1 = 20
L2 = 50
a2 = 50
b2 = 10
k_L = 1
k_C = 1
k_H = 1

tmp1 = [[[L1/255*100,a1-126,b1-126] for _ in range(50)] for _ in range(50)]
tmp2 = [[[L2/255*100,a2-126,b2-126] for _ in range(50)] for _ in range(50)]
tmp1 = np.array(tmp1).reshape(50,50,3).astype('uint8')
tmp2 = np.array(tmp2).reshape(50,50,3).astype('uint8')
plt.imshow(cv2.cvtColor(tmp1,cv2.COLOR_Lab2RGB))
plt.show()
plt.imshow(cv2.cvtColor(tmp2,cv2.COLOR_Lab2RGB))
plt.show()

#equation
def calcDelta_h(h1,h2):
  if abs(h1-h2) <= 180:
    return h2-h1
  elif (abs(h1-h2) > 180 and h2 <= h1):
    return h2-h1+360
  elif (abs(h1-h2) > 180 and h2 > h1):
    return h2-h1-360
  else:
    return None

def calcH_bar_dash(h1,h2,c1,c2):
  if abs(h1-h2) <= 180:
    if c1 ==0 or c2 == 0:
      return (h1+h2)
    else:
      return (h1+h2)/2
  elif (abs(h1-h2) > 180 and h1 + h2 < 360):
    if c1 ==0 or c2 == 0:
      return (h1+h2+360)
    else:
      return (h1+h2+360)/2
  elif (abs(h1-h2) > 180 and h1+h2 >= 360):
    if c1 ==0 or c2 == 0:
      return (h1+h2-360)
    else:
      return (h1+h2-360)/2
  else:
    return None

def calc_h_dash(a,b):
  if a == 0 or b == 0:
    return 0
  elif atan2(b,a)<0:
    return degrees(atan2(b,a))+360
  else:
    return degrees(atan2(b,a))

delta_L_dash = L2-L1
L_bar = (L1+L2)/2

C1 = (a1**2+b1**2)**0.5
C2 = (a2**2+b2**2)**0.5
C_bar = (C1+C2)/2

a1_dash = a1+a1/2*(1-(C_bar**7/(C_bar**7+25**7))**0.5)
a2_dash = a2+a2/2*(1-(C_bar**7/(C_bar**7+25**7))**0.5)

c1_dash = (a1_dash**2+b1**2)**0.5
c2_dash = (a2_dash**2+b2**2)**0.5

c_bar_dash = (c1_dash+c2_dash)/2
delta_C_dash = c2_dash - c1_dash

h1_dash = calc_h_dash(a1_dash, b1)
h2_dash = calc_h_dash(a2_dash, b2)

if c1_dash == 0 or c2_dash == 0:
  delta_h = 0
else:
  delta_h = calcDelta_h(h1_dash,h2_dash)

delta_H_dash = 2*(c1_dash*c2_dash)**0.5 * sin(radians(delta_h/2))

H_bar_dash = calcH_bar_dash(h1_dash, h2_dash, c1_dash, c2_dash)

T = 1-0.17*cos(radians(H_bar_dash-30))+0.24*cos(radians(2*H_bar_dash))+0.32*cos(radians(3*H_bar_dash+6))-0.20*cos(radians(4*H_bar_dash-63))

S_L = 1+0.015*(L_bar-50)**2/(20+(L_bar-50)**2)**0.5
S_C = 1+0.045*c_bar_dash
S_H = 1+0.015*c_bar_dash*T

R_T = -2*(c_bar_dash**7/(c_bar_dash**7+25**7))**0.5*sin(radians(60*exp(-1*((H_bar_dash-275)/25)**2)))

delta_E00 = ((delta_L_dash/(k_L*S_L))**2+(delta_C_dash/(k_C*S_C))**2+(delta_H_dash/(k_H*S_H))**2+R_T*delta_C_dash*delta_H_dash/(k_C*S_C*k_H*S_H))**0.5

print(delta_E00)

```
Databricks共有クラスターにおけるinitスクリプトの活用

Databricksのクラスターにはいくつかの種類があります。Unity Catalogを活用する際には共有クラスターがお勧めなのですが、initスクリプトが使えないなどの制限がありました。

https://qiita.com/taka_yayoi/items/a1b4977a80ace39c7e81#%E5%85%B1%E6%9C%89%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E6%A9%9F%E8%83%BD%E5%88%B6%E9%99%90

しかし、こちらの記事にありますように、共有クラスターでもinitスクリプトが使えるようになりました！

https://qiita.com/taka_yayoi/items/6e06c457f020896b1418

早速やってみます。

# initスクリプトの作成

こちらで使っているinitスクリプトを使います。

https://qiita.com/taka_yayoi/items/6ac6b521698da47a3c25

```sh:taka_librosa_init.sh
#!/bin/bash
apt-get --yes install libsndfile1
```

ローカルマシンにこちらのシェルスクリプトファイルを保存します。

# ボリュームへのアップロード

Databricksのデータエクスプローラにアクセスして、シェルスクリプトファイルをVol.にアップロードします。シェルスクリプトのファイルのパスをコピーします。
![Screenshot 2023-08-25 at 13.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7b58bec9-715d-e185-9c9e-cfbeaaff27b1.png)

# 許可リストにinitスクリプトを追加

データエクスプローラのタイトルの右にあるギアマークをクリックします。
![Screenshot 2023-08-25 at 13.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d8eda89c-6cd6-f40d-a660-a124d45dfdcd.png)

**Allowed JAR/Init Scripts**タブを開きます。
![Screenshot 2023-08-25 at 13.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5690431d-127e-1942-d74e-a7063a26f136.png)

**追加**をクリックして、タイプは`Init Script`、ソースタイプ`Volume`、ソースに先ほどコピーしたinitスクリプトのパスを指定して許可リストに追加します。
![Screenshot 2023-08-25 at 13.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/079381b5-7719-8403-641e-83058934fe7a.png)
![Screenshot 2023-08-25 at 13.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d3af399-0f29-9352-0ea2-1fa544ed37cd.png)

# クラスターにおけるinitスクリプトの設定

共有クラスターを作成し、ランタイムには13.3以降を選択します。そうしないとinitスクリプトは設定できません。
![Screenshot 2023-08-25 at 13.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4473d2b7-59fb-0666-630a-e0dfcbbcc0ae.png)

**高度なオプション > initスクリプト**で、上で指定したinitスクリプトを指定して追加します。
![Screenshot 2023-08-25 at 13.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c43078fa-f189-3177-9b37-0f21be33c518.png)

# クラスターの起動

クラスターを起動するとinitスクリプトが実行されます。
![Screenshot 2023-08-25 at 14.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/275503b0-b526-4840-78f9-18e1f1267bdc.png)

```py
%pip install librosa
```
```py
# Beat tracking example
import librosa

# 1. Get the file path to an included audio example
filename = librosa.example('nutcracker')

# 2. Load the audio as a waveform `y`
#    Store the sampling rate as `sr`
y, sr = librosa.load(filename)

# 3. Run the default beat tracker
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)

print('Estimated tempo: {:.2f} beats per minute'.format(tempo))

# 4. Convert the frame indices of beat events into timestamps
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
```

```
Estimated tempo: 107.67 beats per minute
```

動きました！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Figmaでワイヤーフレーム作ってみた話


# はじめに

現在私は自社開発に携わっております！
Figmaでワイヤーフレームを作成した話を綴っていきたいと思います。

![figma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/959966ce-69a9-3d24-2d35-7566a7ec5a8d.png)

# 1.Figmaを触ってみる

Figmaはよく聞くツールではありますが、実際に使うのは今回が初めてでした。
そもそもがよく分かってなかったので、まず色々触ってみることにしました。

少し触ってみての感触は、非常に直感的で扱いやすいことが分かりました。
画面上部にあるツールバーをなんとなーーく触ってなんとなーーーく動かしてみるとそれっぽくなります。
この手軽さはやみつきになります。

![修正後キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/cd5963c5-9f39-ba03-49ad-f033f34aff57.png)

# 2.ワイヤーフレーム作成着手 

なんとなく分かったタイミングでワイヤーフレームの作成を行います。
テキストの配置やフォームに見立てた図形を配置していきます。

合計11画面分作成しましたが、苦がならず進めることができました。
やはりこの使いやすさは初心者に優しいです。
（それにしてもデザインが壊滅的。。。今まで個人開発などでもBootstrapに甘えてきた人生。。。）

# 3.HTML出力してみる

作成したワイヤーフレームを画面遷移を含めブラウザで確認したかったので、HTMLに出力します。
Figmaの標準エクスポートは、「PNG,JPG,SVG,PDF」の4つだったのでそのままでは出力できません。
ググった結果HTMLでエクスポートできるプラグインを発見しました。
↓↓

https://www.figma.com/community/plugin/851183094275736358/Figma-to-HTML

使ってみたところ寸分の狂いなく出力というわけではありませんでしたが、相当な精度で出力されました。
非常に役立ちました。
↓Convertを押下することでHTMLで出力。プラグインって楽でいいね。

![FigmatoHTML.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/f5652de0-5d12-bbe0-5019-9d1b43973088.png)

HTML出力だけではなくReactでの出力もありました。今回はHTMLでよかったのでこの機能は使用しませんでしたが、もし何かの機会があれば使ってみたいと思いました。

# 4.終わり
デザインツールを使うのは初めてだったので身を構えましたが、使いやすく苦戦しませんでした。
もう少しデザインの知識があったら楽しかったのかなー。とは思いますね。

# 5.予告
次回は9月8日に投稿予定です！
jetpack composeのLazy系でいつもド忘れすることまとめてみた

# はじめに
今回は普段自分が`jetpack compose`を実装していて`Lazy`系のド忘れしてしまうことを備忘録程度にまとめていこうと思います
### 本文
***contentPadding***
まずは`contentPadding`について、名前的にアイテム間の間隔なのかなって思うけど実は最初と最後に対する`padding`
`LazyRow`を使ってのチップ実装時に最初と最後にだけ余白を開けたいとか`LazyColumn`で最後にだけ余白を開けたい時に使います

***コンテンツ間の間隔***
ではコンテンツ間の間隔はどう開ければいいのかって話ですよね
これについては`Lazy`の`View`に対して`Arrangement = Arrangement.spacedBy(8.dp),`を設定するようにしましょう
`LazyColumn`か`LazyRow`かによって`verticalArrangement`か`horizontalArrangement`かが変わってきます

***最大値の設定***
これに関してはクラッシュに関わるので最重要と言っても過言じゃないです
`Lazy`系は親Viewか本体に対して`Column`なら縦幅`Row`なら横幅の最大値を設定してあげないと無限に広がることができてしまうのでクラッシュします
意外とド忘れします

### 最後に
今回は自分が普段実装していて時々調べないと忘れてしまうようなことを備忘録ようにまとめてみました
どなたかのお役に立てれば幸いです
楽しい量子力学 -1時間目-

# 概要

量子コンピュータへの理解を深めたかったのですが、私は「シュレディンガーの猫」の話の延長線上にある知識くらいしか持っていなかったため量子力学の勉強と簡単な量子回路の作り方を調べてまとめてみました。
1時間目なので今回は、量子の重ね合わせとそれを用いた量子回路のシミュレーションの作成という初歩的な箇所にフォーカスしています。

# 目次
[1. 量子の重ね合わせの基礎](量子の重ね合わせの基礎)
[2. 量子回路の基礎](量子回路の基礎)
[3. Qiskitを用いた量子回路の実装 ](Qiskitを用いた量子回路の実装 )
[4. 感想](感想)
[5. 参考](参考)


# 量子の重ね合わせの基礎

## スーパーポジション

0と1の両方を重ね合わせて持っている状態のこと。
観測することで0と1のどちらかの状態に確定する。

## 量子ビット

1ビットの情報を持つ量子のビットのこと。
これをスーパーポジション状態にしたり観測して確定させたりする。
また、普通のコンピュータで使われるものは**古典ビット**と呼ばれる。

説明だと0となる割合と1となる割合は50%:50%にすることが多いが(シュレディンガーの猫等)、この割合は任意で設定することができる。

## ブロッホ球

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/4fab20b2-c516-f8d4-8855-3751c78d5935.png)

量子ビットの状態をベクトルと球を用いて視覚的に図示したもの。
地球に見立てて、0地点を北極、1地点を南極、それらと等距離にある球上の線を赤道と読んだりする。

量子ビットを観測した際に0と1のどちらが観測されやすい状態かというのを北極と南極からの距離を見ることで


# 量子回路の基礎

## 量子回路

量子ビットがスーパーポジション状態のまま演算を行い、出力を観測することで値を確定させる。
この手順は量子ビットの特性上毎回出力が異なるため、繰り返し実行することで出力分布を得る。(モンテカルロ法のような)

## アダマールゲート (Hadamarl Gate)

量子をスーパーポジション状態にするためのゲート

# Qiskitを用いた量子回路の実装 

## 実装コード

```python:sample.py
from qiskit import QuantumCircuit, Aer, transpile, assemble
from qiskit.visualization import plot_histogram

# 1つの量子ビットと1つの古典ビットを持つ回路を作成
qc = QuantumCircuit(1, 1)

# 入力状態を準備
qc.h(0)
qc.t(0)
qc.h(0)

# 測定を行い、結果を古典ビットに格納
qc.measure(0, 0)  # 量子ビット0の結果を古典ビット0に測定

# ローカルシミュレータで実行
simulator = Aer.get_backend('qasm_simulator')
compiled_circuit = transpile(qc, simulator)
job = simulator.run(assemble(compiled_circuit))
result = job.result()
counts = result.get_counts()

# 結果を表示
print("Measurement results:", counts)
plot_histogram(counts)
```

## コード説明

量子回路のコードでの実装はQiskitというライブラリを用いて行いました。
コメントで補足しきれていない重要な箇所だけ説明していきます。

```python:sample.py
# 1つの量子ビットと1つの古典ビットを持つ回路を作成
qc = QuantumCircuit(1, 1)

# 入力状態を準備
qc.h(0)
qc.t(0)
qc.h(0)

# 測定を行い、結果を古典ビットに格納
qc.measure(0, 0)  # 量子ビット0の結果を古典ビット0に測定
```

量子回路を作成して、それぞれのゲートを配置している箇所です。
このコードだと、Hゲート、Tゲート、Hゲートの順に量子ビットを通過させています。
それぞれのゲートの細かい挙動は割愛しますが、この結果下図のような π/8 位相シフトの演算が行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/b9434b04-0124-a792-8ffc-07e36339ce6a.png)

ブロッホ球の北極側にベクトルが向いているため、0を測定しやすい状態になっているということですね。
細かい計算は割愛しますが、大体85%の確率で0が観測されるような重ね合わせ方になっています。

最後の行では量子ビットを観測して、その結果を古典ビットに反映させる作業を行っています。

```python:qiskit.py
# ローカルシミュレータで実行
simulator = Aer.get_backend('qasm_simulator')
compiled_circuit = transpile(qc, simulator)
job = simulator.run(assemble(compiled_circuit))
result = job.result()
counts = result.get_counts()
```

先ほど組んだ回路を用いてシミュレートを行います。
具体的には「3つのゲートを通す → 出力された量子ビットを確認する」の流れを1024回繰り返して結果を見ています。

## 出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/8d25dacd-ec0d-f8d6-7d58-101bf092aed5.png)

1024回の出力結果をグラフにしたものがこちらです。
今回は量子ビットを約85%の確率で0が示す状態にしてそれを観測するという回路なので、予測通りの結果が得られました。

# 感想

今回は量子ビットの理解を深めて簡単な回路を組むところまでの作業を行いました。
もし、2時間目の記事を投稿することになったときは量子のもつれを活用した回路の作成になるかと思います。

# 参考

https://www.slideshare.net/OsSAL-org/ss-198802364
Javaで「まとめてファイルに書き込む」の動作を確認してみた

# 概要
Javaで「まとめてファイルに書き込む」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stream/index6.html

# 実装
以下のファイルを作成しました。
```StreamTest6.java
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

class StreamTest6{
  public static void main(String args[]){
    try{
      File file = new File("test.txt");

      if (checkBeforeWritefile(file)){
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));

        bw.write("こんにちは");
        bw.newLine();
        bw.write("お元気ですか？");
        bw.newLine();

        bw.close();
      }else{
        System.out.println("ファイルに書き込めません");
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }

  private static boolean checkBeforeWritefile(File file){
    if (file.exists()){
      if (file.isFile() && file.canWrite()){
        return true;
      }
    }

    return false;
  }
}
```
以下のコマンドを実行しました。
```
$ javac StreamTest6.java 
$ java StreamTest6 
$ cat test.txt 
こんにちは
お元気ですか？
```

# まとめ
何かの役に立てばと。
構造体のメンバーに値をセットしたいだけなのに

構造体の参照からピンをドラッグすると、SetMembersin<struct>が出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/567d9eb7-6540-71c8-4996-9391bf84157c.png)
出ては来るがメンバーのピンがない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d2f96eff-7731-ffb0-34e0-e8e4a32e5958.png)
さらにノードを右クリックしてRestoreAllStructPinsを押すと出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/db774e3a-4ed5-da51-00bb-f199684ec17c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1ab4d194-5767-340c-aeac-e15782e770bc.png)
なんだかなあ。
BPは＋ボタンでメンバーを増やせたり、
実行結果のtrue/false分岐がフラグになっていたりExecピンになっていたり、
仕様がバラバラなのが散見される気がします。
【Python】pipenvそのものをダウングレードする方法

## 書いた動機
1. `Python`での開発環境セットアップ時に、持ち込んだ`Pipfile`どおりに環境が出来なかった
2. どうやら`editable`が無効になってるっぽい
3. 同僚に話したら[こんなissue](https://github.com/pypa/pipenv/issues/5858)を見つけてくれた。バグか・・・
4. `Pipenv`をダウングレードしよう
5. 「pipenv ダウングレード 」[ 検索 ]
6. `pipenv`を用いたモジュールのダウングレード方法がめちゃくちゃHitして`Pipenv`そのもののダウングレード方法が見つからない
7. 自力でやる
8. メモがてら記事にする

## 環境
`Python`: 3.9.13
`pip`: 23.2.1
`pipenv`: 2023.8.23 → 2022.12.19

## 手順
v2023.8.23 から v2022.12.19への移行を例にします
1. [pipenvリポジトリのタグ一覧](https://github.com/pypa/pipenv/tags)へアクセスする
2. 今回の影響が出て無さそうなバージョンを探す(今回は2022.12.19)
3. コマンドラインで`pip install pipenv==v2022.12.19`を打つ
4. `pip list`で`Pipenv`のバージョンが変わってるか確認する

## 余談
「pip ダウングレード」[ 検索 ]でよかった
ちなみにこれで検索するとpip本体のダウングレード方法が一番上に出てくる
Macでメモリ全体の使用率を確認するコマンド

- Macにてメモリ状況を確認するにはGUIでは[アクティビティモニター](https://support.apple.com/ja-jp/guide/activity-monitor/welcome/mac)、CUIでは[topコマンド](https://ss64.com/osx/top.html)等があります。
- 詳細情報を確認するには便利ですが、簡単に全体を知りたい場合があります。
- 今回はMac標準のコマンドを利用して確認する方法を記録いたします。

## 環境
- Mac OS 13.4.1

## 結果

### 未使用率

```shell
memory_pressure -Q | awk 'NR==2{printf "%.2f%%\n", $NF}'

# 出力 : xx.xx%
```

### 使用率

```shell
memory_pressure -Q | awk 'NR==2{printf "%.2f%%\n", 100 - $NF}'

# 出力 : xx.xx%
```

## 内容
- 上記では[memory_pressure](https://opensource.apple.com/source/system_cmds/system_cmds-790/memory_pressure.tproj/)コマンドを利用しています。
- このコマンドはメモリ圧力状態の評価及び管理するためのもので、問題解析やシミュレート等に便利です。
- 引数なしの実行でメモリ状況の詳細を出力してくれますが、`-Q`オプションをつけることで以下の情報のみの出力に抑制してくれます。

```
$ memory_pressure -Q

The system has xxxxxxx (xxxxxx pages with a page size of xxxx).
System-wide memory free percentage: xx%
```

- つまり、この情報の2行目の**System-wide memory free percentage**の割合をawkに渡して**使用率**及び**未使用率**を出力するコマンドとなっております。

## 参考
- [ソースコード](https://opensource.apple.com/source/system_cmds/system_cmds-790/memory_pressure.tproj/)
- [memory_pressureコマンド](https://news.mynavi.jp/article/osxhack-107/)
Deno 使ってみないか？

# Denoとは
 RustとV8エンジンをベースに実装されたJS/TSランタイムです
 作者はNode.jsの開発者でもある Ryan Dahlさん
 Node.jsにおける反省点等を改良するために開発されました

 https://github.com/denoland/deno
 https://deno.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982130/ea1d3353-a7af-ef51-2688-40954912d568.png)

# Topic
* Nodejsと違って標準モジュールが豊富
* モジュール機構がDenoだとESMオンリーになっていて綺麗
* TSを標準サポート！
* Denoの組み込みのテスト機能が充実
* DenoDeployが便利！ 
* 標準のリンター、フォーマッター
* 組み込みKeyValue Store搭載


# Upgrade from Node.js to Deno 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982130/ed3d12ca-3697-4576-e07f-2e13286ac76f.png)


## Nodejs と異なり標準モジュールが充実している
Node.jsには標準モジュールに相当する公式のライブラリという概念はありません。Node.js本体に含まれる機能だけが公式のAPIで、それ以外はすべて3rdパーティという関係です。そのため3rdパーティに頼る比重が必然的に多くなります。

それに対してDenoは、本体のAPIがまずあって、次にカバー範囲の広い標準モジュールがあり、それ以外が3rdパーティという構造になっています。

たとえば、Node.jsではテスト関連の3rdパーティのモジュール群は選択肢が非常に豊富にあります。Denoの場合は本体にbuiltinされたテストランナー（Deno.test）とstd/testingから提供されるアサーションでほとんど事足りてしまうため、選択肢が狭まっていると言えます（選択肢が少ないことをデメリットと取るかメリットと取るか、人や場合によるかもしれませんが⁠）⁠。

https://gihyo.jp/article/2023/01/tfen004-deno

# 標準モジュールが豊富
めっちゃ便利です。

https://gihyo.jp/article/2023/01/deno-standard-modules-01#ghdaDe0qZ9


# TS標準サポート
>Native TypeScript support with zero config
Use bleeding edge JavaScript features
Intellisense and auto-complete in Visual Studio Code
Publish and distribute modules as TypeScript source code

煩わしいOptionの設定などから解放されます！
TSそのままで実行可能
# Deno Deploy

Deno の開発元　Deno Land 社が提供しているホスティングサービス

>Globally distributed
Deploy in seconds
Built-in key/value database
Integrate with GitHub for CI/CD
Run static sites, apps, and edge functions

簡単にデプロイできて、現在Beta版の組み込みのキーバリューDBを使うことができます！
早くFireStoreをわざわざ立ち上げたりしていた時代とおさらばしたい！
Denoで動く新しいWebFrameworkです（今回割愛）

https://fresh.deno.dev/

https://deno.com/kv

# Deno Land Inc.

会社になってまふ🦕
https://deno.com/company

# まとめ

現在はまだ破壊的変更が入ったりしますが、個人開発でちょっとしたプロトタイプを作る際に快適さを味わってみてはどうでしょう…？
Topicsで挙げた項目を網羅できてないですが、残りはまたの機会に・・・
AWS EC2 インスタンスまとめ

# AWS EC2 インスタンスについて

## AWSのEC2インスタンスタイプ
用途に基づいた最適な選択をマトリックス化したものです。

| 用途           | インスタンスタイプの例                                 |
|----------------|------------------------------------------------------|
| テスト/開発    | t2.micro, t3.nano, t3a.micro                           |
| ウェブサーバー  | t3.medium, m5.large, m5a.large, c5.large              |
| データベース    | r5.large, r5a.large, m5.large, m5a.large              |
| コンテナ化     | c5n.large, m5n.large, m5dn.large, r5n.large           |
| ビッグデータ   | r5ad.large, r5d.large, i3.large, m5ad.large           |
| 機械学習       | p3.2xlarge, p2.xlarge, g4dn.xlarge, inf1.xlarge       |
| 高パフォーマンス| c5d.large, i3.large, r5d.large, m5d.large              |
| メモリ集中型   | x1e.xlarge, r5.xlarge, r5a.xlarge, u-6tb1.metal        |
| コンピューティング | c5.large, m5.large, r5.large, t3.large              |

## インスタンスタイプ識別子とその意味

| インスタンスタイプ識別子 | 意味                                             |
|--------------------------|--------------------------------------------------|
| C                        | コンピューティングに特化したインスタンス         |
| R                        | メモリ集中型のインスタンス                       |
| X                        | 最大容量のメモリを持つメモリ集中型のインスタンス |
| M                        | 一般的な汎用のインスタンス                       |
| I                        | ストレージに特化したインスタンス                 |
| D                        | ストレージ最適型のインスタンス                   |
| H                        | ストレージ最適型の大容量ディスクを持つインスタンス |
| T                        | 低コストで柔軟な一時的なタスクに使用されるインスタンス |
| P                        | GPUに特化したインスタンス                       |
| G                        | グラフィックス処理に特化したインスタンス         |
| F                        | FPGA（Field Programmable Gate Array）に特化したインスタンス |
| A                        | ARMベースのプロセッサを持つインスタンス         |
| Z                        | 高性能で低遅延のコンピューティングインスタンス |
| U                        | 高メモリ容量を持つベアメタルインスタンス         |
| Mac                      | macOSを実行するインスタンス                      |
ReactとGenerics

## ReactでGenericsを使う
ReactでGenericsを利用する例を書いていく。

## サンプルコード
```shell:tree
~/develop/generics_react$ tree -I node_modules 
.
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   └── manifest.json
├── src
│   ├── App.css
│   ├── App.tsx
│   ├── components
│   │   ├── Dialog.tsx
│   │   ├── Display.tsx
│   │   └── SelectList.tsx
│   ├── index.tsx
│   └── types
│       └── type.ts
├── tsconfig.json
└── yarn.lock
```

```tsx:App.tsx
import React from 'react';
import './App.css';
import { Dialog, DisplayList } from './components/Display';

function App() {
  const display: JSX.Element = <div>hello</div>;
  const dialog = Dialog();

  return (
    <div className="App">
      <DisplayList content={display} />
      <DisplayList content={dialog} />
      {/* //　これはエラーになる.
    // <DisplayList content=""> */}
    </div>
  );
}

export default App;
```

```ts:type.ts
export type Kitten = {
  id: string;
  cuteName: string;
  cutePic: string;
};

export type Bear = {
  id: string;
  name: string;
  imageUrl: string;
};

export type Animal = Kitten | Bear;

export type Dialog = {
  content: React.ReactNode; // ここで渡されるコンポーネントを受け取る型を指定
};

export type PageLink = {
  content: React.ReactNode; // ここで渡されるコンポーネントを受け取る型を指定
  url: string;
};

```

```tsx:src/components/Display.tsx
export type DisplayProps<T extends JSX.Element> = {
  content: T;
};

export const DisplayList = <T extends JSX.Element>({
  content,
}: DisplayProps<T>) => {
  return content;
};

export const Dialog = () => {
  return (
    <div>
      <dialog open>
        <p>Greetings, one and all!</p>
        <form method="dialog">
          <button>OK</button>
        </form>
      </dialog>
    </div>
  );
};

export const PageLink = () => {
  return (
    <div>
      <nav>
        <ul>
          <li>
            <button>ボタン1</button>
          </li>
          <li>
            <button>ボタン2</button>
          </li>
        </ul>
      </nav>
    </div>
  );
};

```

これで一応動く。

```tsx
export type DisplayProps<T extends JSX.Element> = {
  content: T;
};
```
ここが重要で、`DisplayProps`はJSX.Elementのみ許容する。ここがないと、anyと同じ。
これだけだと、Genericsの恩恵が十分に受けられていないので、次回以降の記事でGenericsについても深く書いてきます。
tp-linkのWi-Fiルーターでプライベート・ビエラを接続するには？

TV部は普通にネットワークに接続できるのに、チューナー部はなぜか接続できませんでしたが、ようやく設定を見つけて接続できるようになりました。

![スクリーンショット 2023-08-25 12.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331144/dccfa2a1-0e94-e9b0-ffcb-2a8f26ba5f67.png)

詳細設定画面(ルーターモード時のみ表示される)の、ネットワーク-IPTVから、IGMPすヌーピングの有効チェックを外して、無効にしないと、チューナー部がWi-Fiルーターに直接接続できませんでした。

マルチキャストが届かなかったのかな？？

参考：

ルーターと有線接続した機器(ブルーレイレコーダー等)が他の機器から認識されない場合は
https://www.tp-link.com/jp/support/faq/3002/

IGMP Snooping
https://www.infraexpert.com/study/multicastz12.html
【Flaskをひとりぼっちな勉強会】＃000 学習ガイドライン

# Flaskについて
> PythonのFlaskフレームワークを使用してWebアプリケーションの開発を学ぶことは、非常に有益なスキルを身につけることができます。Flaskは軽量でシンプルなフレームワークであり、Webアプリケーションの基本的な概念や構造を理解するのに適しています。

# flask学習ガイド
> Python Flaskを学ぶ際に役立つステップとリソースの一般的なガイドラインです。

## 1. **Pythonの基本を確認する** 
Flaskを理解するためには、Pythonの基本的な概念と文法を把握しておく必要があります。関数、クラス、モジュールの理解が役立ちます。

## 2. **Flaskの公式ドキュメントを読む:** 
Flaskの公式ドキュメントは非常に詳細でわかりやすいです。[Flaskの公式ドキュメント](https://flask.palletsprojects.com/en/2.1.x/)を読み始めることをおすすめします。

## 3. **基本的なFlaskアプリケーションを作成する:**
HelloWorldアプリなどの基本的なFlaskアプリケーションから始めてみましょう。ルーティング、テンプレート、スタティックファイルの扱い方を学びます。

## 4. **データベースの統合:** 
 Webアプリケーションではデータベースの使用が一般的です。SQLiteやSQLAlchemyを使用してデータベースを操作する方法を学びましょう。

## 5. **フォームの処理:** 
ユーザーからの入力を受け付けるためにフォームを作成し、データを処理する方法を学びます。WTFormsなどのライブラリを使うことができます。

## 6. **セキュリティを考慮する:** 
Webアプリケーションのセキュリティについて学び、クロスサイトスクリプティング（XSS）やSQLインジェクションなどの攻撃からアプリケーションを保護する方法を理解しましょう。

## 7. **RESTful APIの作成:** 
Flaskを使用してRESTful APIを作成する方法を学びます。APIエンドポイントを設計し、HTTPメソッドを使用してリソースを操作します。

## 8. **セッションと認証:** 
ユーザー認証やセッション管理の実装方法を学びます。Flask-Loginなどのライブラリを活用することができます。

## 9. **テストとデバッグ:** 
十分なテストを行い、アプリケーションのバグを特定し修正するスキルを磨きましょう。

## 10. **拡張機能とデプロイ:** 
Flaskの拡張機能を利用してアプリケーションを拡張し、最終的にはWebサーバーにデプロイする方法を学びます。HerokuやAWSなどのクラウドプラットフォームを使用する方法もあります。
# 頑張って身につけましょう
> 上記のステップを順番に進めることで、Flaskを使用したWebアプリケーション開発について深く理解することができます。途中でわからないことがあれば、ドキュメントやオンラインコミュニティ、チュートリアルを活用して質問してみることをおすすめします。成功を祈っています！お互いに良いアウトプットを目指しましょうね。
# 参考資料

https://flask.palletsprojects.com/en/2.1.x/
【VS Code】macOSにVisual Studio Codeをインストールする方法

プログラミングをする際に使われることが多い（と思われる）、Visual Studio Codeのインストール方法について記載します。VS Codeと略されることも多いです。

なお、正確な情報や詳細な情報は[公式ドキュメント](https://code.visualstudio.com/docs)も参照してください。

## 環境

このページの作業は、以下の環境で確認しました。

- MacBook Air (M1, 2020)
- macOS Ventura

## インストール手順

1. [公式サイト](https://code.visualstudio.com/)からVisual Studio Codeをダウンロードします。

   macOSで使用するので`Download Mac Universal`からダウンロードします。

   ![01_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/60d71ed2-9163-879a-acdd-2834ab35213b.png)

2. ダウンロードしたZIPファイルを展開します。

   ![02_downloaded_zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/4e65a72e-d6a7-cc67-152f-00644969cc8d.png)

3. 展開すると`Visual Studio Code.app`ファイルができるので`アプリケーション`フォルダに移動します。

   ![03_open_zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/e02e4e2e-a294-f4e8-b432-59304e8383e5.png)


4. `アプリケーション`フォルダの`Visual Studio Code.app`をダブルクリックし起動します。

   ![04_moved_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/3b7259e9-f249-a946-c64b-dfb8668fa23a.png)

5. 起動すると、開いてよいか確認されるので開くをクリックします。

   ![05_open_app_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/67483606-0d5a-359d-cee6-79c0e5adbb4e.png)

6. Visual Studio Codeが起動します。'Mark Done'をクリックすると初回設定を完了できます。必要に応じて、日本語の言語パックのインストールなどを行います。

   ![06_open_app_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/0137ec87-4f50-a570-2e39-22e68af45447.png)

7. 初回の設定が完了すると、以下のウェルカムページが表示されます。これでインストールは完了です。

   ![07_open_app_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327708/f40fe5bd-8e27-633b-928d-e5df2c5f0acb.png)
dataclassの初期値を動的に入れる

# とりあえず
dataclassは好きです。型指定あんま役に立たないけど

でも、初期値が面倒です。特に
`dataclasses.field(default_factory・・・`
これ

そんなわけで、なんとかしたいと思います

```python
@dataclasses.dataclass
class Margin:
    top: int
    bottom: int
    left: int
    right: int
    al: list

@dataclasses.dataclass
class Color:
    r: int
    g: int
    b: int
    m: Margin

@dataclasses.dataclass
class Config:
    margin : Margin
    output_margin : Margin
    corner_average : float
    threshold_gray : int
    threshold_color : Color
```
こんなdataclassを作りました。dataclass内で他のdataclassを参照してたりして、色々アレです。

そして、こうです
```python:
DefaultInitializer = {int: 0, float:0.0, str:'', list:[], dict:{}}

def DCinitializer(DataClass: type, initializer: dict = DefaultInitializer, **kwargs):
    arg = {}
    for k, attr in DataClass.__annotations__.items():
        f = False
        for at, dv in initializer.items():
            if attr is at:
                f = True
                arg[k] = dv
        for kw, dv in kwargs.items():
            if kw == k:
                f = True
                arg[k] = dv
        if not f:
            sarg = {}
            for kw, dv in kwargs.items():
                if k == kw[:len(k)]:
                    sarg[kw[len(k)+1:]] = dv
            arg[k] = DCinitializer(attr,**sarg)
    return DataClass(**arg)

a = DCinitializer(Config,margin_top = 5)
print(a)
#結果
#Config(margin=Margin(top=5, bottom=0, left=0, right=0, al=[]),
#     output_margin=Margin(top=0, bottom=0, left=0, right=0, al=[]),
#     corner_average=0.0, threshold_gray=0,
#     threshold_color=Color(r=0, g=0, b=0, 
#     m=Margin(top=0, bottom=0, left=0, right=0, al=[])))
#
```
それぞれの型の初期値は
`DefaultInitializer = {int: 0, float:0.0, str:'', list:[], dict:{}}`
で決めています。dataclassがネストしていても、遡ってそれぞれの値を入れます
クラスの初期値は別の方が良いとかなら
`DefaultInitializer = {int: 0, float:0.0, str:'', list:[], dict:{}}, Margin:(10,10,10,10,['ほげ'])`
とでも入れておけばそのクラスの初期値はそれになります

`a = DCinitializer(Config,margin_top = 5)`
の、margin_top = 5は
クラス指定されているmarginのtopプロパティが対象です
本当は
`a = DCinitializer(Config,margin.top = 5)`
と書きたかったのですが、それだとSyntaxErrorが出てしまうので_にしています。別に_で無くてもPythonで変数と認識してくれるものならなんでもいいです

初期値の引数はキーワード引数で無いといけませんが、素のdataclassのように全部書かなくても必要な部分だけで構いません

とりあえず思いつきで作ったので、あんまり細かい事は考えてませんが、使えるかもしれません

###追記
fix typo by @shiracamus
ご指摘ありがとうございます。

initializerの綴り間違ってた・・・

コメント欄でのご指摘もありがとうございます。短くなって良いですね
レゴブロックで作ったエレベーターの組立図 書いてみた　その5　本体平面編

## 平面編

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/641c92c3-d3b1-8f7f-916d-791902cf1728.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/90a36cb6-b13b-a873-5006-35a389bf3597.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/3ff12019-19de-a556-e462-f17687b4d1fe.png)





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/6a687e7d-fb89-a917-b885-2c08cac95cac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/edcde074-8411-aab8-48f6-80c64f4aa3de.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/0b88642b-2d7d-eef9-658d-253d53b929d9.png)



## コントロールSW

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/dba196c4-fe48-1561-c27e-02e087c6d75d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/a34cd869-114c-3d8a-203c-648529c24be7.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/7c99ed11-ae0d-ea93-d1a6-46f09d2f8eac.png)

## 最後に
部品名等が小さ過ぎるためこの冊子には記載しておりませんが、
「秋葉原ロボット部」のサイトにて公開したいと思います。
詳細はこちら　https://akbrobot.gitlab.io/blockelevator/
レゴブロックで作ったエレベーターの組立図 書いてみた　その6　本体立面編

# 本体立面編

## 全体枠
### 外側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/5cddc00d-e762-0840-298d-6b8837c8a920.png)

### 内側と基盤部
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/f700c810-8435-7fc9-1c20-bc6d62d5ee7a.png)

### 左面内側 布ワイヤーとカゴへの配線部
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/825bc2ae-ed8f-6da5-a3c4-fd617d34c277.png)

### MicroSWとタイルの加工取付
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/12f7219f-7bf8-5de0-2ff4-5ff9a9642e0b.png)


## 外廻り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/82bdb183-1be5-7f7b-d662-58ba2203805c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/1f0bd67c-be6a-3fee-1ac5-fc322324f270.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/ccfc61ca-9f09-a670-1072-9ccd9c214d0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/06318da1-af98-3b87-8174-dbdbf6f60a77.png)




## 各レール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/75a10150-eaba-f3fb-deef-2def692ad384.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/c5372406-2643-c3bd-8650-521f42513721.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/eb973bab-132d-d0d2-b5aa-c18feb0727eb.png)




## 基盤取付部

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/6b9bce1b-a36f-d2db-2924-2ad445311b72.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/a2821b4f-8735-a171-8e98-7d4a4efb0b30.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/c9765607-1c7c-17da-9059-264a502da7e4.png)


## 最後に
部品名等が小さ過ぎるためこの冊子には記載しておりませんが、
「秋葉原ロボット部」のサイトにて公開したいと思います。
詳細はこちら　https://akbrobot.gitlab.io/blockelevator/
【ChatGPT無】7R（簡易プロンプト）を簡単な指示と比較した

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　7Rプロンプトで、
　　　簡易プロンプトを作成して、
　　　　簡単な指示プロンプトと
　　　　　比較します。
***
『7Rプロンプトに
　　関して、書いた記事』

　最初の記事。
[【ChatGPT】野口竜司氏提示、7Rプロンプト](https://qiita.com/kabumira/items/77bcfeac699673d99c09)

　前回の記事。
[【ChatGPT無】深津式→7Rに書き直す](https://qiita.com/kabumira/items/83a6999b21e9484016ea)
***
　まずは、MicrosoftBingさんに
　　7Rプロンプトについて、
　　　聞いてみました。
　　　（単に思い付いただけ）

```Text:Bingさんの答え
7Rプロンプトとは、ChatGPTを使ってAIに依頼するときに使う、プロンプトの書き方の一つです。プロンプトとは、AIに対する入力のことで、AIの出力をより良くするために工夫する必要があります。7Rプロンプトは、以下の7つのRに基づいてプロンプトを作成します。

- Request（依頼）：AIに何をしてほしいかを明確に伝える。
- Role（役割）：AIがどのような立場やキャラクターで話すかを決める。
- Regulation（形式）：AIの出力の形式や長さ、言語などを指定する。
- Rule（ルール）：AIが守るべきルールや制約、禁止事項などを設定する。
- Review & Refine（評価・改善）：AIの出力を評価し、改善点やフィードバックを与える。
- Reference（参照知識・例）：AIが参考にすべき知識や情報、具体的な例などを提供する。
- Run Scenario（実行シナリオ）：AIが出力する内容の流れや目的、状況などを想定する。
```

　思わぬ内容だったので、
　　驚いてしまいました。

　まさか、ここまでの説明が
　　出てくるとは。

　リンクのひとつは、
　　自分の記事でしたけど、
　　　ここまでの説明は
　　　　していません。

　ほかのリンクも確認しましたけど、
　　入会必要サイトがあったので、
　　　そこに野口竜司氏が
　　　　上記の説明を
　　　　　書いたのでは、と
　　　　　　思います。
***
　それはともかく。

　先日、
　　YouTuberかわごんさんの
　　　ところで、7Rプロンプトの
　　　　お勉強会を開いたのですが。

　全員、7Rプロンプトについて、
　　私以外は、誰も知らない状態。
　　　私も各項目を知っている程度。

　とりあえず、
　　上記のBingさん出力の
　　　説明を事前資料として、
　　　　進めました。

　正直、一時間ほどで、
　　勉強できるような内容では
　　　なかったですね。

　とりあえず、
　　今回の簡易プロンプトを
　　　作成して、終了した感じです。
***

　野口氏のYou Tube動画で
　　示された簡易プロンプトは、
　　　以下の三つで構成されます。

　# Request（依頼）
　# Role（役割）
　# Regulation（形式）

　これを指定するだけでも、
　　それなりの結果が
　　　出力される、とのこと。

　まずは、Requestだけを。
```Text:Requestだけとその結果
User
# Request（依頼）
ChatGPTを教えてください。


ChatGPT
もちろんです！ChatGPTは、OpenAIが開発した自然言語処理モデルです。テキスト生成、対話、文章の要約など、さまざまな自然言語処理タスクに使用できます。質問や指示を与えると、それに対して適切なテキストを生成することができます。どのような具体的な情報を知りたいですか？
```
　これを三度、Regenerateしても
　　あまり変わりませんでした。
***
　それで、
　　ほかのふたつを追加します。

```Text:簡易プロンプトとその結果
User
# Request（依頼）
ChatGPTを教えてください。

# Role（役割）
あなたは、プロのAI研究者です。

# Regulation（形式）
箇条書き（説明不要）。


ChatGPT
- ChatGPTは、OpenAIが開発した自然言語処理モデルであり、テキスト生成や対話を行うことができます。
- GPT-3.5アーキテクチャに基づいており、幅広いトピックに関するテキストを生成する能力を持っています。
- ユーザーの質問や入力に対して、文脈に基づいた回答を生成することができます。
- 質問応答、文章生成、要約、翻訳などのタスクに利用されます。
- 訓練データは2021年9月までの情報までを含み、それ以降の出来事には対応していない点に留意が必要です。
```
　こちらも
　　Regenerate三度しました。

　やはり、
　　似たような出力になりました。
***
　結果としては、
　　簡単な指示プロンプトよりも
　　　# Role（役割）と
　　　　# Regulation（形式）が
　　　　　ある方が、
　　　　　　良い結果を得られる。

　まぁ、
　　考えなくても、
　　　わかる結果でしたw
***
　続けて、
　　記事を書きました。
　　　参考にしてください。


『7Rプロンプトに
　　関して、書いた記事』

　最初の記事。
[【ChatGPT】野口竜司氏提示、7Rプロンプト](https://qiita.com/kabumira/items/77bcfeac699673d99c09)

　次の記事。
[【ChatGPT無】深津式→7Rに書き直す](https://qiita.com/kabumira/items/83a6999b21e9484016ea)

　次の記事。（この記事）
[【ChatGPT無】7R（簡易プロンプト）を簡単な指示と比較した](https://qiita.com/kabumira/items/a4cd4ec25a7cefbb95c7)

　次の記事。
[【ChatGPT無】7Rプロンプトで、ワードミキサーPrompt。](https://qiita.com/kabumira/items/67928a476c259de7701a)

　次の記事。
[【ChatGPT無】7R（簡易）で、長話を短くするには、と聞いてみた](https://qiita.com/kabumira/items/8d807cda0ca5ff1dea25)
***