OmniAICreator/Qiita-1.07M huggingface dataset:
Google Earth Engineを使って植生の分布について調べてみた

## はじめに
Google Earth Engine（以後、GEE）は、衛星画像といった地理空間情報を分析・可視化を可能にするプラットフォームです。以下の記事では、Google Earth EngineではNDVIという指標を用いて植生の分布を調べることができると、簡単に説明しました。

https://qiita.com/zumi0/items/f404a671c496065ea75e

今回の記事では、どのようにNDVIという指標で、どうしてその指標を用いると植生の分布がわかるのか解説していきたいと思います。

## Google Earth Engineを使って植生の分布について調べてみた
### 人工衛星は何を記録しているのか
まずはじめに、人工衛星が何を記録しているか説明していきます。昔の自分は、Google Earthの衛星画像や気象衛星の影響で、人工衛星は写真を撮っているものだと思っていました。しかし、それは少し違っていました。

> 地球観測衛星は、地球のはるか上空の宇宙から、大気や地表面近くの地球環境の状態や自然現象を測定するために、主に地球から放射・反射される電磁波を観測しています。（[こちら](https://earth.jaxa.jp/ja/eo-knowledge/remote-sensing/index.html)より引用）

https://earth.jaxa.jp/ja/eo-knowledge/remote-sensing/index.html

観測される電磁波は、上記のページに記載のある通り、紫外線や可視光、赤外線などが挙げられます。可視光を処理することによって、私たちの見える写真となっているわけです。

私たちが見ている物の色に違いがあるのは、物体が反射・吸収する光の波長が違うからであり、そのことは可視光以外の電磁波にも当てはまります。物体が反射・吸収する電磁波の波長によって、その物体が何であるかわかることができたりします。そのことを利用した一例が、[こちらの記事](https://qiita.com/zumi0/items/f404a671c496065ea75e)で紹介した、NDVIを利用した植生の分布の推定です。

### NDVIとは
NDVI（Normalized Difference Vegetation Index）は正規化植生指標と呼ばれ、植物が反射する電磁波を利用して植生の状況を判断するために用いられる指標の一つです。植物が近赤外線を強く反射し、赤色光を強く吸収することから、NDVIは以下の式で定義されています。

```math
NDVI = \frac{IR - R}{IR + R}
```

- $IR$ : 衛星データ（近赤外域)の反射率
- $IR$ : 衛星データ(可視域赤)の反射率

上記の内容は、国土地理院のページより引用しました。

https://www.gsi.go.jp/kankyochiri/ndvi.html

植物があればあるほど赤色光は吸収されるため、$R$の値は小さくなります。そうなると$NDVI$の値は大きくなります。逆に植物の量が少ないと赤色光はあまり吸収されなくなるので、$R$の値は大きくなり、$NDVI$の値は小さくなります。このことから、$NDVI$の大小によって植物の量を推定できるわけです。

### 名古屋市の植生の分布を可視化してみる
前回紹介したExampleではカンザスシティの植生分布を推定していましたが、今回は名古屋市の植生分布を推定してみようと思います。今回利用する

[こちらの記事](https://qiita.com/zumi0/items/f404a671c496065ea75e)で紹介したExampleを少し変えて、名古屋の植生分布を推定してみたいと思います。今回はMODISという放射計で測定されたデータを利用していきます([MODISの説明](https://www.restec.or.jp/glossary/modis.html))

NDVIを計算するには近赤外線と赤色光の情報が必要ですが、それらは先ほど紹介したデータの中にあり、それらを使って計算していきます。
- 近赤外線：`sur_refl_b02`
- 赤色光：`sur_refl_b01`

```js
// MODISが観測した2022年8月に観測されたデータ
var images = ee.ImageCollection('MODIS/061/MOD09GA')
                .filter(ee.Filter.date('2022-08-01', '2022-08-31'));

// 先ほどのデータの１枚目を取得
var image = ee.Image(images.first());

// NDVIを計算する
// 近赤外線：`sur_refl_b02`
// 赤色光：`sur_refl_b01`
var ndvi = image.normalizedDifference(['sur_refl_b02', 'sur_refl_b01']);

// カラーパレット
// NDVIが大きい緑、小さいと白になる
var palette = ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718',
               '74A901', '66A000', '529400', '3E8601', '207401', '056201',
               '004C00', '023B01', '012E01', '011D01', '011301'];

// マップの中心は名古屋市
Map.setCenter(136.9059794183006,35.18392745436158, 8);

// 地図に表示
Map.addLayer(ndvi, {min: 0, max: 1, palette: palette}, 'NDVI');
```

上記のスクリプトの実行結果は、以下です。解像度が粗いので、あまりズームできないのはご容赦ください...

![スクリーンショット 2022-12-02 23.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/b9a946d2-021c-c9cf-860d-e3fd0994db15.png)

名古屋市の中心部はあまり植物がないことが考えられますね。

## さいごに
今回は、Google Earth Engineを使って植生の分布について調べてみました。簡単に植生の分布が推定できてしまうのは興味深いですよね！今後もこのようにGoogle Earth Engineを使った記事を投稿していく予定です！
Sudachi の左連接、右連接の話

## 左連接ID、右連接IDとは

[Sudachi](https://github.com/WorksApplications/Sudachi) ではコストの計算に [MeCab](https://taku910.github.io/mecab/) のモデルを利用しています。コスト計算に関連する部分は辞書ソース上も同じ形式をとっており、左連接ID、右連接ID、(単語) コスト (それぞれ0始まりで1, 2, 3カラム目) は [unidic-mecab-2.1.2](https://clrd.ninjal.ac.jp/unidic/back_number.html) の値を加工したものです(MeCab では左文脈ID、右文脈IDとよんでいます)。

MeCab (と Sudachi) のコストは、単語列 $w_0, w_1, \ldots, w_n$ に対して以下のように計算されます。

```math
\mbox{cost} = \sum_i C_w(w_i) + C_t(c_{i-1}^r, c_{i}^l)
```

このとき $C_w$ は単語コストでその単語の出現しやすさをあらわし、$C_t$ は連接コストで直前の単語とのつながりやすさをあらわします。この $C_t$ のインデックス $c^r, c^l$ が右連接IDと左連接IDです。前件 ($i-1$) を右からみたときの遷移クラスが $c_{i-1}^r$、後件 ($i$) を左からみたときの遷移クラスが $c_{i}^l$ ということですね[^1]。

[^1]: 式中で左に出てくるのが右連接IDで、右に出てくるのが左連接IDです。

## 拡張隠れマルコフモデル

じつは MeCab の配布されている辞書 (UniDic, ipadic) では左右の連接IDは区別せずおなじIDがもちいられています。では、この左右の区別はなんのためにあるのでしょうか。MeCab の配布辞書は条件付き確率場法 (CRF) でコスト推定がなされていますが、MeCab 自身は特定のコスト推定方法に依存しないようにつくられています[^2]。このとき念頭におかれていたのが拡張隠れマルコフモデル[^3]による推定です。

[^2]: 工藤拓, 「形態素解析の理論と実装」, 近代科学社, 2018, p. 99
[^3]: 浅原正幸, 松本裕治, 形態素解析のための拡張統計モデル, 情報処理学会論文誌, Vol. 43, No. 3, pp. 685-695, 2002, http://id.nii.ac.jp/1001/00011693/

CRFによるコスト推定が提案される以前、ChaSen などでは隠れマルコフモデルによるコスト推定がおこなわれていました。隠れマルコフモデルによる形態素解析では、品詞を遷移クラスとみなし、ある品詞から特定の単語が生起する確率と品詞から品詞へ遷移する確率をかんがえ単語列の生成確率をもとめます[^4]。

[^4]: 単語生起確率と遷移確率がそれぞれ単語コスト、連接コストに対応します。

当時、これらの確率の推定には最尤推定がもちいられることが一般的でした[^5]。つまりコーパス内の出現頻度を数えてそれぞれの確率をもとめていました。しかし ipadic では助詞、助動詞に個別の品詞をあたえており、また活用型、活用形も品詞としてあつかうため、遷移クラスが数百におよび遷移がコーパス内でじゅうぶんに観測できないことが問題になっていました。そこで遷移クラスの一部をグルーピングし出現数を確保する手法[^6]がとられました。そのひとつがこの拡張隠れマルコフモデルです。

[^5]: 隠れ状態 (品詞) が隠れていないので最尤推定が可能。隠れ状態が観測できないふつうの隠れマルコフモデルの場合は EM アルゴリズムをつかって推定します。
[^6]: たとえば活用型の情報は遷移に影響をあたえないのでこの情報を落としてグルーピングすることができます。

遷移の性質をかんがえたとき、前の単語の活用形は重要ですが後にくる単語の活用形はとくに影響をあたえません。また助動詞「ちゃう」のような縮約形態をとる語は前からみると助詞「て」の性質をもちますし、後ろからみると補助動詞「しまう」とみなせます。このような場合、前 (左) からみたときと後ろ (右) からみたときの遷移クラスをわけることで、おなじ性質をもつ品詞をうまくグルーピングすることができます。このために導入されたのが左連接ID、右連接IDなのです。

CRF では素性を適切に設計することで複数の情報を同時に考慮できるようになり、品詞のグルーピングや左右の連接の区別は不要になりました。

## Sudachi での左連接、右連接

Sudachi では unidic-macab のパラメータをもとにコストを付与していますが C 単位や B 単位の語は A 単位の系列とみなしてパラメータを事前に合成しています。このとき B, C 単位の単語では A 単位の系列とみなしたときの先頭単語の左連接IDをその単語の左連接ID、末尾単語の右連接IDを右連接IDとしています。したがって Sudachi の辞書内には左連接IDと右連接IDがことなる語が存在します。

ではよい Sudachi life を。
Javaのディープコピーと「参照」

(本記事ではJava SE 8以上を想定しています)
ディープコピーとは、コピー元/先を変更してもコピー先/元に影響がないコピーのことです。
Javaの参照型をディープコピーするには、コピー元と同じ値を持った新しいオブジェクトを生成する必要があり、少し工夫が必要です。

# 実際のコード例（リストの場合）
例えばリストをディープコピーしたいなら下記のようになります。もちろん他にいくらでも方法はあります。

```java:リストをディープコピー
// コピー元
List<String> listX = new ArrayList<String>();
listX.add("foo");

// 最もシンプルな例
List<String> listA = new ArrayList<String>(listX);

// NPEを避け、コピー元がnullなら空のリストを代入する例
List<String> listB = Optional.ofNullable(listX)
    .map(e -> new ArrayList<>(e))
    .orElseGet(() -> new ArrayList<>());
```

ArrayListのコンストラクタはArrayList型の引数を受け取って、新しいArrayListを生成してくれるのでこれが成り立ちます。


# 普通に「=」で代入(assign)を行うとどうなるか

プリミティブ型なら直感に沿った動きをします。
文字通り生身で原始的な値を直接やりとりします。これなら自然とディープコピーされますね。
```java:プリミティブ型
int a = 123;
int b = a;

b = 456; // bに代入を行なっても a == 123 のまま
```

一方、参照型（の変数）はオブジェクトへの「参照」を持つため、普通に「=」すると同じ参照を共有する状態になってしまいます[^JLS-4.3.1]。


```Java:オリジナルな型のコピー
// コピー元
MyClass obj1 = new MyClass();
obj1.setNum(20);

// ディープコピー（新しいオブジェクトを生成して中身のプリミティブ型をコピーする）
MyClass obj2 = new MyClass(); // 新しいオブジェクトを生成している
obj2.setNum(obj1.getNum()); // プリミティブ型（int）が渡される

// 参照を共有している状態
MyClass obj99 = obj1; // これだと生成されるのは「obj1と同じオブジェクトへの参照」を持った「違う変数」
```


# String型だけ少し特殊

String[^JLS-4.3.3]については

>A String object has a constant (unchanging) value.
String literals (§3.10.5) are references to instances of class String.
The string concatenation operator + (§15.18.1) implicitly creates a new String object when the result is not a constant expression (§15.28).
>

とのことで、何気なく使っている文字列リテラル（`String foo = "foo!";` の`"foo!"`）はプリミティブ型ではなく、暗黙のうちに生成されたString型インスタンスへの「参照」です。
足し算のようなことができるが、実際は新しいオブジェクトを生成してそいつへの「参照」を返してくれています。

ちなみに、同じ文字列のリテラルは同じStringオブジェクトを参照します[^JLS-3.10.5] [^JLS-12.5]。

```Java:文字リテラル
String hello = "Hello"
String lo = "lo";

hello == "Hello"              // true（同じ文字列、同じ参照）
hello == ("Hel"+"lo")         // true（コンパイル時に結局 "Hello"になるので）
hello == ("Hel"+lo)           // false（文字列結合によって新しいオブジェクトへの参照になってしまった）
```


[^JLS-4.3.1]:[JLS-4.3.1 Objects](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.3.1) の *Example 4.3.1-2.* 
[^JLS-4.3.3]:[JLS-4.3.3 The Class String](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.3.3)
[^JLS-3.10.5]:[JLS-3.10.5 String Literals](https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.10.5)
[^JLS-12.5]:[JLS-12.5 Creation of New Class Instances](https://docs.oracle.com/javase/specs/jls/se11/html/jls-12.html#jls-12.5)
この記事はすべてAIが書いています。

※この記事は[KDDI Engineer&Designer Advent Calendar 2022](https://qiita.com/advent-calendar/2022/engineer-designer)の3日目の記事です。

読者のみなさん、こんにちは。このQiita記事はすべてChatGPTというAIが執筆しています。

# ChatGPTの紹介

ChatGPTは、文章生成を支援するWebアプリです。

### アクセス方法

ChatGPTへは以下のURLからアクセスできます。

https://chat.openai.com/chat

### 利用手順

1. 上記URLにアクセスします。
1. 入力したい文章を入力し、「Generate」ボタンをクリックします。
1. ChatGPTが文章を生成し、結果が表示されます。

### ChatGPTの凄さ

ChatGPTは、大量のテキストデータを元に学習したため、高品質な文章を生成することができます。また、ニューラルネットワークを用いることで、自然な文章を生成することができます。

### SNSでの話題性

ChatGPTを使用して生成された文章は、SNSなどで広く話題になります。昨日の @youtoy さんの記事も参考にしてください。

### おわりに

いかがでしたか？ ChatGPTがすべて書いた記事をご覧いただき、ありがとうございました。文章生成について興味がある方は、ぜひChatGPTを試してみてください。
sandboxリポジトリのススメ

この記事は、[ラクス Advent Calendar（その2）](https://qiita.com/advent-calendar/2022/rakus) の2日目です。昨日は、 @soachr の [アラサーの私がようやくアウトプットすることに肯定的になった理由](https://soachr.hatenablog.com/entry/why-I-started-doing-outputs) でした。

### はじめに

新しいプログラミング言語を覚えるためのコードや、何かを実験するための検証用コードなど、仕事・プライベートを問わず、本番用ではないちょっとしたコードを書くことは多いですよね。こういったコード、どうしてますか？

書き捨てにするのが一番ラクだけど、使いまわしたいコードが行方不明になりがち。ちゃんとしたプロジェクト名をつけてGitリポジトリで管理すると、今度は雑なコードや途中のコードをコミットしづらくなってしまう。ちょうどその中間ぐらいを目指して、sandboxリポジトリに行き着きました。

### sandboxリポジトリ

トピックごとに `〇〇-sandbox` という名前の使い捨てリポジトリを作ります。ここでの「sandbox」は、セキュリティ界隈で隔離された環境を指す sandbox ではなく、自由に試せる砂場の方の sandbox です。ローカルに残っているのを見てみたら、`gitlab-ci-sandbox` とか `postgres-sandbox` とか `mattermost-sandbox` とか `react-sandbox` とか `java-sandbox` とかとか、過去にいろいろ作っているようです。

実際には、このリポジトリの下にサブディレクトリを切って、その下に作業途中のファイルなどを雑にコミットしています。日をあけて違うことを試したり、違うバージョンで検証したりするときに、複数プロジェクトを配置できるようにしておいた方が便利だからです。

ちなみに `postgres-sandbox` の下を覗いてみましたが、普通に `docker compose up` できない状態でコミットコメントが `WIP` だけのものとか混ざってました。いい感じに雑いです :sweat_drops: 

```
postgres-sandbox/
├── README.md
├── alter-column-int-to-bigint
│   ├── docker-compose.yml
│   └── init.sql
├── citus
│   ├── ads.csv
│   ├── campaigns.csv
│   ├── companies.csv
│   ├── docker-compose.yml
│   └── init.sql
├── ...
```

### 所感

* メリット
    * 「どうせsandboxだし…」と気軽にWIPのまま一時コミットできる。最悪別ブランチにつっこんでおく手もある
    * 過去のコードをコピペで再利用しやすい。最近は、docker-compose.yml の再利用率が異常に高い気がする
* デメリット
    * あまりに雑なコードばかりだと再利用しようにも再利用できないので、書き捨てにするのと実はさほど変わらない可能性がある。ほどほどが大事、ほどほどが

sandboxリポジトリ、お試しあれ！

### 蛇足

社内のとあるエンジニアが軽いノリで作った初の「カレンダー2」。裏番組的な感じなのか今まで以上にゆるふわで、完走できる気がしないです。そして、カレンダー1, 2の初日をダブルでかざるエンジニア。ぶっ飛んでますね。せっかくなので続いておきました。

🇯🇵 🇪🇸
総合行政ネットワーク(LGWAN)ってなに？調べてみた。

## はじめに

総合行政ネットワーク(LGWAN)という単語がお仕事で出てきました。なにそれ。。。
というわけで簡単に調べてみました。

## 総合行政ネットワーク(LGWAN)ってなに

#### 総合行政ネットワーク （Local Government Wide Area Network）

>地方公団体の組織内ネットワーク（以下「庁内LAN」という。）を相互に接続し、地方公共団体間のコミュニケーションの円滑化、情報の共有による情報の高度利用を図ることを目的とする、高度なセキュリティを維持した行政専用のネットワークです。  

**地方公共団体や行政の間で使われている閉域ネットワーク**の事を指すみたい

## LGWANの特徴

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669659/5757192b-0bb8-517b-5ad1-c91c70fb8680.png)
図のようにすべて通信がLGWANを介して行われるので、相手ごとの個別回線を用意する必要がない

#### つまり
 - 堅牢セキュリティ環境（LGPKI）
 - 個別回線を敷く必要がない
 - 初期コスト削減・運用コストの削減
 - 運用・維持も簡単に
 - etc

## 何ができるのか
 - 地方自治体同士の情報交換を目的とした情報掲示板
 - メーリングリスト
 - 「LG,JP」といった専用ドメインの登録/変更
 
これらが基本的な機能として備わっている。  

**LGWAN-ASP（Local Government Wide Area Network-Application Service Provider）**
といった仕組みを使用することでいろいろできることが増えるらしいですがまたの機会に、、、

# 感想

今回は情報をあつめてとりあえず見やすくまとめてみた。
次まとめる時はもう少し技術についても調べたい。
自然と良いコードになる？個人開発のリポジトリもGitHubで公開しましょう

この記事は、[Ateam LifeDesign Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-life-design) シリーズ1の3記事目です。

## はじめに
私が実践している、個人開発を捗らせるためのちょっとしたコツをご紹介します。それは、
「**GitHubにPublic状態でコードを置く**」
これだけです。


## 人の目を意識し、自然ときれいなコードになる
私の経験上、公開状態にするだけで自然にコードの体裁を整えようという意識が高まります。
**誰に見せるわけでもないのに。**

私はSNSはやりませんし自分のサイトも持ってません。
自分のGitHubへの導線はどこにもありません。

それでも**コードが全世界に公開されてしまっている**という事実が、
自然と襟を正し、綺麗なコードを書こうという意識を高めてくれます。


## 草を生やしたくなる

言わずと知れたGitHubのコントリビューショングラフ、これはコミット欲を高めてくれます。
俗にいう「草を生やす」というやつです。~~private状態でも生やすことはできますが~~

不思議なものでこの草を眺めていると、もっと生やしたいという欲求が出てきます。
たくさんコミットをしたくなりますよね。

また、まとめて大雑把にコミットせずに分割しようという意欲も生まれます。
結果自然と**コミット粒度が細かく**なります。


## ロジックを公開できない？チャンスです

とはいえ、公開できないコードもあると思います。
例えば内容が（こっそり）やろうとしているビジネスの根幹に関わるとか。

しかしそれはチャンスです！
であれば、**公開できる部分と出来ない部分にリポジトリをわけ、出来る方のみを公開**しましょう。

他プロジェクトでも使い回せるものをpublicのリポジトリに切り出して、
メインのprivateリポジトリでsubmoduleとして使う、とかです。

この部分は公開出来る、出来ない、と切り分けようとする意識が丁寧な設計に繋がっていきます。
**モジュールとして切り出す練習**をするチャンスです。自然と疎結合になっていくことでしょう。


## おわりに
いかがでしょうか。
個人で開発してるけどGitHubに上げてまではいないよ…という方、ぜひ試してみては。
上げててもprivate状態だよという方、思い切って公開してみましょう。Git管理してない？**してください**。
一緒に草を生やしましょう！
JavaScript（this編）

# thisは呼び出され方で参照先が違う

JavaScriptの基本的な文法の復習をしている際に、thisの挙動に関して「？？？」となってしまったため、自分自身が見返せるようにまた、同じようなところで詰まっている人にも共有できるようにまとめます。

## 一般的
```
const infoObj = {
  name: "foo",
  
  sayName() {
    console.log(`My name is ${this.name}.`);
  },
};

infoObj.sayName();　// -> My name is foo.
```
こちらはわかりやすいのではないでしょうか。
いわゆるこのthisはinfoObjを指しており、
```
 console.log(`My name is ${this.sayName}.`);
 console.log(`My name is ${infoObj.sayName}.`);
```
これと同じ意味ですね。
ここからわかることは、
**thisは呼び出し元のオブジェクトを参照する（今回の例だったらinfoObj）**
ということです。

すなわち、当たり前に感じるかもしれないですが、infoObjオブジェクトがない場合、
```
this.sayName()
```
というのは使えないわけです。
じゃあこの時のthisは何を参照するの？というと,**グローバルオブジェクト**なるものを参照します。

## コピーされた時
```
const infoObj = {
  name: "foo",
  
  sayName() {
    console.log(`My name is ${this.name}.`);
  },
};

const copyObj = infoObj.sayName;
copyObj();// -> My name is undefined.
```
結果を見て貰えばわかる通り、undefinedになっています。
これは、
```
const copyObj = infoObj.sayName;
```
この時点でthisの**参照先がinfoObjからcopyObjに変更**されてしまったからというわけですね。
nameプロパティというのはinfoObj内にあるので、この値を参照するためには、**infoObjが呼び出し元である必要がある**ということになります。
この場合、copyObjは呼び出し元のオブジェクトになるため、thisはグローバルオブジェクトを参照します。
【C#】メンバー変数`a,b,c`を for 文で回す

クラス内で定義された変数`a,b,c`（フィールド）を、`for`文で回す方法を書いていきます。
簡単な方法としては、新しく配列に再格納して`for`文で回すなどの方法があるかと思いますが、この場合、変数`d`を追加したときに配列に`d`を追加し忘れる、といったことが起きる場合があるため、それを防ぐためにも以下のようなコードを実装すべきかと思います。

# サンプルコード
今回の説明のために書いたサンプルコードは以下の通りです。
```cs
using System.Reflection;

internal class Program
{
    private static void Main(string[] args)
    {
        TestProperties test = new TestProperties()
        {
            a = "new_a",
            b = "new_b",
            c = "new_c"
        };

        // PropertyInfo に個別のプロパティの情報が取得される
        foreach (PropertyInfo property in test.GetType().GetProperties())
        {
            Console.WriteLine("property.Name..." + property.Name);

            // インスタンス化した TestProperties を GetValue(~)で指定
            Console.WriteLine("value..." + property.GetValue(test));
        }
    }

    /// <summary>
    /// for文で回すプロパティを定義したクラス
    /// </summary>
    internal class TestProperties
    {
        public string a { get; set; } = "default_a";
        public string b { get; set; } = "default_b";
        public string c { get; set; } = "default_c";
    }
}
```

#### ↓↓↓↓↓ 実行結果（コンソールの出力） ↓↓↓↓↓

```
property.Name...a
value...new_a
property.Name...b
value...new_b
property.Name...c
value...new_c
```

# 解説
`.GetProperties()`によって、メンバー変数（今回の場合は`a,b,c`）を`PropertyInfo`の配列として取得し、`PropertyInfo`の`.GetValue()`で変数に格納された値を取得しています。

`test.GetType()`では`TestProperties`の`Type`を取得する処理をしています。
因みに、`typeof(TestProperties)`と書いても`test.GetType()`と同じことができます。
インスタンスの場合は`.GetType()`、型定義の場合は`typeof()`を使用するという認識になります。

`PropertyInfo.GetValue()`で各変数ごとの値が取得できます。
`.GetValue()`の引数には`TestProperties`のインスタンスを入れることで、そのインスタンスの変数を取得することができます。
AdventCalendar 50 個参加してみて　

2022年は、AdventCalendar５０個参加予定です。　

10個以上のAdvent Calendarには記事のURLを記載しました。　

１週間前に投降せよという伝言が届いたからです。　

毎日２個づつ投降する予定です。　

 <この項は書きかけです。順次追記します。>


背景となる組織が、内容などを支援してくださるのはとてもありがたい。　

普段の勉強会と一緒ですね。　

とにかく発表した人の勇気に免じて、なんとかもう一歩前に進めるように助言しようとしてくださる。　

いろんな会に後ろをおしてもらいました。　

BSD系は特に長いです。　　

ほとんど貢献していません。　ごめんなさい。　

TeXも、お世話になってきました。　

一冊納品したという実例を示すだけが貢献でした。

研修を実施し、本にしたソースコードを例としてお持ち帰りいただいたりもしました。　

著作権の扱いを誤らない限り、内容が違う本を同じ構造でだしてもらえれば、原著作者冥利につきるというものかも。　

ソースコードの誤植、参考文献の更新などは、いろいろな会への貢献で一番よくあるやつかもしれません。　


参考文献駆動執筆(references driven writing)・デンソークリエイト編

https://qiita.com/kaizen_nagoya/items/b27b3f58b8bf265a5cd1

ここにも順次、資料を足していきます。


# Countdown Calendar 2022

今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力

https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)

https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

CountdownCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f





 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221201
楕円曲線ECDSAで西暦0年から9999年までの自己署名証明書

楕円曲線ECDSAで西暦0年から9999年までの自己署名証明書

[make-self-signed-cert-openssl.sh · GitHub](https://gist.github.com/yaegashi/8004ca8677c5d03879bd)
を微修正して、手元のManjaro Linuxで試してみました。

```
make-self-signed-cert-openssl.sh phoepsilonix cert.pem -startdate 00000101000000Z -enddate 99991231235959Z
```

問題なく、作成できました。
変更点は↓

```
openssl ecparam -genkey -name prime256v1 -out $dir/key.pem
openssl req -new -key $dir/key.pem -sha256 -nodes -out $dir/csr.pem -config $dir/ssleay.cnf
openssl ca -config $dir/ssleay.cnf -batch -notext -selfsign -in $dir/csr.pem -keyfile $dir/key.pem -out $dir/crt.pem "$@"
```

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 0 (0x0)
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: CN = phoepsilonix
        Validity
            Not Before: Jan  1 00:00:00 0 GMT
            Not After : Dec 31 23:59:59 9999 GMT
        Subject: CN = phoepsilonix
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:1b:6f:e7:24:ff:0f:f2:72:47:62:e3:5f:eb:4a:
                    47:5b:f9:b0:2e:02:04:23:7a:63:1d:6d:e4:d4:be:
                    7a:cd:29:0d:ac:8c:5f:a8:c0:bc:7f:85:13:bc:58:
                    7a:ef:f4:9a:02:b2:b3:eb:c8:15:e9:f6:1a:e3:8b:
                    6c:b8:c4:b1:87
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                79:A9:CC:DD:03:4F:4B:3F:17:A1:C2:F6:FA:3F:40:F1:45:0B:0F:BB
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:45:02:20:61:06:e5:f0:85:d8:b0:3c:fc:38:70:2b:9a:d3:
        72:5c:8d:20:d6:af:b8:90:ad:7d:80:b7:40:80:fc:52:6e:eb:
        02:21:00:aa:e9:01:46:01:fb:d6:00:aa:cd:f3:6c:e9:9b:ff:
        f5:0d:8b:b0:ee:be:a9:fc:de:f9:5c:26:bc:c9:18:26:21
```

FireFoxでの証明書の表示だと1900年からとなっております。

![Screenshot from 2022-12-02 23-07-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921849/c76f7d32-1467-5537-9294-1f2ada076100.png)

Chromeでは、こんな感じでした。Timezoneの影響あるかな？
![Screenshot from 2022-12-05 20-49-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921849/f3d48783-e8f8-3521-970c-858fcd42c1d5.png)

参考サイト
[プライベート認証局でECDSAサーバ証明書の作り方](https://http2.try-and-test.net/openssl_simple_ca_ecdsa.html)
[ほげめも: 9999 年間有効な SSL 証明書を作る](http://blog.keshi.org/hogememo/2015/02/01/ssl-certificate-valid-for-9999-years)
Javaで何か作ってみる(2022/12/2 Day43)

## 今日やった事
- Springの動画教材を見始めた。
## 参考にしたもの
- [Spring 入門 ～ SpringBoot 2 を使ってお問い合わせアプリとToDoアプリを作る ～](https://www.udemy.com/course/java_spring_beginner/)  
- [【超初心者も必見】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】](https://www.udemy.com/course/uz-java-obj/)  
## 所感
- Springの動画教材を見始めたが、オブジェクト指向を学習した事を前提に進めていくみたいなので、  
オブジェクト指向の動画教材を先に進めた方が良いかもしれない。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
Javaで何か作ってみる(2022/12/1 Day42)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- [Spring 入門 ～ SpringBoot 2 を使ってお問い合わせアプリとToDoアプリを作る ～](https://www.udemy.com/course/java_spring_beginner/)  
- [【超初心者も必見】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】](https://www.udemy.com/course/uz-java-obj/)  
## 所感
- 今日は、何も出来なかったけど、明日はどっちかの動画教材、進めていきたい。
## 明日の予定
- 引き続き、Javaの勉強を進めていく。
secondwindow

「instantNeRFで遊ぶ Advent Calendar 2022」の5日目です。

今日はsecondwindowをtestbedでも使えるように改造します。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
:::

#### secondwindow
メインウインドウの表示内容をメニューがない状態で別のウィンドウにミラーリングする機能です。
script\run.pyはオプションで選ぶことができます。
![5a-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/0cc22bd6-d823-ee4b-0792-e5014f9cc917.png)
testbe.exeはオプションに現れません。
![5a-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d41503b0-5119-7cf9-944f-f3505d519ce7.png)

#### main.cuを改造
flagを追加、testbed::init_windowの呼び出し文にsecondwindowを追加します。
![5a-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d4cdfa3d-45bc-4274-f42a-75550918fade.png)
![5a-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/4285c843-6f24-9226-28a8-630ff30aeb52.png)

#### build
visual studio 2019を終了し、開発者コマンドプロンプトを管理者権限で開き、conda activate ngpしたあとでbuildしなおします。

#### 実行
コマンドプロンプトでtestbedに--secondwindowを追加して実行すると、secondwindowが開きました。

```
(ngp) build\testbed.exe --scene data\220823 --secondwindow
```
![5a-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/10091189-2a4d-698a-8203-246c3acafdca.png)
Playdate SDKで作ったゲームを実機に転送する

前回の記事は[こちら](https://qiita.com/sada_lp1/items/1751040555361bae33b7)です。

## SIDELOADを使う

ゲームファイルをPlaydate実機にアップするには、playdate公式サイトにある`SIDELOAD`という機能を利用します。
SIDELOADに制作したゲームファイルをアップロードすることで、Wifiを経由して実機にアップロードすることができます。

## SIDELOADにアップするための準備

前回Playdate Similator向けにビルドしましたが、`source`フォルダと同階層にpdxファイルが生成されています。
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/866d886e-fc1c-5fd9-2b6c-460e801e2b53.png">

このpdxファイルがゲームデータになるのですが、SIDELOADにアップするには`pdxinfo`に必要なメタ情報を記述する必要があります。
まずはpdxinfoを生成しましょう。
Novaの左側のファイルパネルから`新規ファイル`で`pdxinfo`というファイルを作成します。

```
myProjectName/
    myProjectName.pdx  ← ビルドすると生成される
    source/
        pdxinfo  ← 追加
        main.lua
        Images/
            playerImage.png
            background.png
```

pdxinfoに設定できるメタ情報は様々ありますが、ここでは最低限必要な `name` と `bundleID` を記述します。
以下情報は各々任意の文字列を記述してください。

```pdxinfo
name=myProjectName
bundleID=com.sadakitchen.myProjectName
```

記述完了後、Novaのタイトルバーの緑色アイコンボタンを押し、ビルドします。
前述のpdxinfoの記述だと、`myProjectName.pdx`が`source`フォルダと同階層に生成されます。


## SIDELOADにアップ

Playdateにサインインし、アカウントのタブメニューから`SIDELOAD`を選択します。
`Choose a file`から先程ビルドした`myProjectName.pdx`を`zip形式`に圧縮してからアップロードします。

<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/2dd2cab0-acbd-c1a7-766e-43c7569ef199.png">

Playdate実機のバッテリーがある状態でしばらく待つか、`settings`>`Games`より`MY GAMES`の中にあるアップロードしたゲームのファイル名を選択してinstallをすることでゲームをインストールすることができます。

<img width=480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/ae469476-7892-18a4-ae65-fd18c2805c35.png">

次回は描画周りを解説してみます。
クラシルのロゴ作ってみた

# クラシルのロゴが新しくなっていました。

https://www.kurashiru.com/

ぱっと見で、僕でもHTML&CSSで作れそうと思い作ってみました。

# HTMLつくる
```index.html
<div class="container">
    <div class="half"></div>
    <div class="leaf"></div>
    <div class="quarter"></div>
</div>
```
左半分、右上の葉っぱの部分、右下の四分円の3つに分けて捉えました。
CSSで配置、サイズを整えていきます。

# CSSを雑につくる
```style.css
.container {
    width: 200px;
    height: 200px;
}
.half {
    float: left;
    width: 100px;
    height: 200px;
    background-color: rgb(255, 81, 0);
}
.leaf {
    float: right;
    width: 100px;
    height: 100px;
    background: rgb(0, 183, 0);
}
.quarter {
    float: right;
    width: 100px;
    height: 100px;
    background-color: rgb(255, 81, 0);
}
```

`float`でそれぞれ配置を整えます
# 途中経過

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666100/bf9a036f-2a06-e644-a291-1fc70e7c0d9e.png)

# 丸みを付ける
```diff_css
.container {
    width: 200px;
    height: 200px;
}
.half {
    float: left;
    width: 100px;
    height: 200px;
    background-color: rgb(255, 81, 0);
+   border-radius: 100px 0 0 100px;
}
.leaf {
    float: right;
    width: 100px;
    height: 100px;
    background: rgb(0, 183, 0);
+   border-radius: 200px 0 200px 0;
}
.quarter {
    float: right;
    width: 100px;
    height: 100px;
    background-color: rgb(255, 81, 0);
+   border-radius: 0 0 0 100%;
}
```
# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666100/fbb92461-317a-dd48-040e-0a71ea92266f.png)

できた

# ちなみに

社長が高校の先輩ですが僕はクックパッド派です
Webpackとは

## はじめに
最近、```create react app```で作ったアプリケーションではjsファイルへのリクエストが1つしかないことに気づきました。
それについて調べたところWebpackに出会ったので、Webpackについて書きます。

## Webpackとは
javascriptのモジュールをいい感じにまとめてくれるやつです。

https://webpack.js.org/concepts/

>At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph from one or more entry points and then combines every module your project needs into one or more bundles, which are static assets to serve your content from.

## Webpackを使わなかった場合
```
    .
    ├── index.html
    ├── sample
        ├── index.js
        ├── sample1.js
        ├── sample2.js
        └── sample3.js
```
上記のディレクトリ構造で、```index.js```に```sample```がつくjsファイルをインポートして、```index.html```の```script```タグに```index.js```を指定します。

アクセスした際に検証ツールのNetworkタブをみると、3つのファイルそれぞれにリクエストがあることがわかります。

![スクリーンショット 2022-12-02 21.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849988/9ba482c4-df96-c7f0-142a-f7fb0674fbef.png)

↓ ```Cannot use import statement outside a module```エラーが出る方はこちら(僕はrails環境を使って実行しました。)

https://qiita.com/TakamiChie/items/4d92c7e80a9d4cce0178#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83file%E3%81%AAurl%E3%81%A7%E3%81%AF%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84

## Webpackを使った場合

#### セットアップ
https://webpack.js.org/guides/getting-started/

```terminal
    npm init -y
    npm install webpack webpack-cli --save-dev
    touch webpack.config.js
```

webpack.config.jsではwebpackでどのようにモジュールをまとめるかの設定をします。
entrypointをindex.js、bundleするディレクトリをsampleディレクトリ、bundleされた結果の出力先を```./sample/bundle.js```にします。
```webpack.config.js
    const path = require('path');
    
    module.exports = {
        entry: "./sample/index.js",
        output: {
            path: path.resolve(__dirname, 'sample'),
            filename: "bundle.js"
        }
    }
```
設定が終わったら以下のコマンドを実行します。
```
    npx webpack --config webpack.config.js
```
実行が終わると、```.sample/bundle.js```に結果が出力されます。
これを```index.html```の```script```タグで読み込みます。

#### 結果

![スクリーンショット 2022-12-02 22.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849988/3da41ef9-a0d4-578a-6c24-594961a25ecf.png)

以上のように、リクエストが```bundle.js```への1回になっていることがわかります。
リクエストが少なくなるので、パフォーマンスは向上するのかなと思いました(傾向があるだけで絶対そうとは限らないらしい)。
Udemyを使ってフロントエンドエンジニアになるまで！



## はじめに

今回は、未経験の私がフロントエンドの勉強しているときに活用していたUdemyの教材の紹介をしていきます。

未経験でプログラミング勉強するのは継続することが難しいです。

参考書を買ってもなかなか続かないですよね。そんな方はUdemyを使うことをおすすめします。

Udemyは動画ベースで学ぶことが出来るので実際に動いている画面を見ながら作業をすすめることができます。また、「2022年版」といった形で最新の情報を学ぶことが出来るもおすすめです。

では、早速Udemyのおすすめ教材について見ていきましょう。

## ****【世界で70万人が受講】Web Developer Bootcamp 2021****

[https://www.udemy.com/share/105qh83@pXV06VQPzLftkDng4foirly79-LmD1PjjSb1l96Z2PaD6Qc8Iv6eDU4ezuANKlWD_g==/](https://www.udemy.com/share/105qh83@pXV06VQPzLftkDng4foirly79-LmD1PjjSb1l96Z2PaD6Qc8Iv6eDU4ezuANKlWD_g==/)

2021年のものになりますが今でも役に立つ情報がいっぱいあります。

この教材では、Web開発の基礎を幅広く学ぶことができます。

フロントエンドエンジニになるためにはフロントエンドのことだけを理解しておけばいいわけではありません。バックエンドの知識もある程度必要になるので、この教材を使って基礎的な部分を抑えておきましょう。

エンジニアになりたい人はとりあえず見ておくといいでしょう。

## **【2022年最新】【JavaScript＆CSS】ガチで学びたい人のためのWEB開発実践入門（フロントエンド編）**

[https://www.udemy.com/share/102zAI3@m67Q_m3zlYHnm84lwkks1c15Icgb97u6F-sFgRFgaWwaaoffHsqtJp5dn_QJdBAOyg==/](https://www.udemy.com/share/102zAI3@m67Q_m3zlYHnm84lwkks1c15Icgb97u6F-sFgRFgaWwaaoffHsqtJp5dn_QJdBAOyg==/)

### この教材で学べること

- Webサイトを作成する方法
- CSSとJavaScriptの実践的な記述
- CSSとJavaScriptを使ったアニメーションの実装について
- CSSを効率よく書くためのSassの基礎

### こんな人におすすめ

- アニメーションの実装方法を知りたい人
- CSSやSassの勉強をしたい人

## ****モダンフロントエンドエンジニアになるためのJavaScript入門 2022年版****

[https://www.udemy.com/share/105SzC3@NhN5GdevAvtuEBTyj3Oe9vly42GOE8a1v1w5dNCMKCQ8QDIERuxiq82Q3UxB9eJ1Vg==/](https://www.udemy.com/share/105SzC3@NhN5GdevAvtuEBTyj3Oe9vly42GOE8a1v1w5dNCMKCQ8QDIERuxiq82Q3UxB9eJ1Vg==/)

### この教材で学べること

- モダンなJavaScriptの基本文法
- JavaScriptの非同期処理について
- PromiseやWeb APIの非同期処理
- 非同期処理の機構と歴史など

といったことを学ぶことができます。

### こんな人におすすめ

- JavaScriptを少しでも書いて動かしたことがある人
- モダンなJavaScriptを学びた人
- 非同期処理があまり理解できていない人

## ****モダンJavaScriptの基礎から始める挫折しないためのReact入門****

[https://www.udemy.com/share/103Fxl3@j2rftXxZIzS1Ae-ZzAGkkxMFBhsBoFejf3ANy8BgFyCz9PLGAF7FfQBTYr6-CaEDpA==/](https://www.udemy.com/share/103Fxl3@j2rftXxZIzS1Ae-ZzAGkkxMFBhsBoFejf3ANy8BgFyCz9PLGAF7FfQBTYr6-CaEDpA==/)

### この教材で学べること

- モダンなJavaScriptの基礎や概念
- JavaScriptを使用したアプリ開発
- Reactの基礎
- Reactを使用したアプリ開発

### こんな人におすすめ

- JavaScriptの基礎はある程度してフレームワークを使いたい人
- Reactを学びたい人
- フロントエンジニアになりたい人

## ****はじめてのVue.js 3 入門！jQuery を使わないウェブ開発 - 導入からアプリケーション開発まで体系的に学ぶ****

[https://www.udemy.com/share/101YM03@Ov0-Z8xGjLMk3hmAToiB1oXOKaW9CI1kceAj2KMsGwfTvatjOA_JygE1cclnXdb9Kg==/](https://www.udemy.com/share/101YM03@Ov0-Z8xGjLMk3hmAToiB1oXOKaW9CI1kceAj2KMsGwfTvatjOA_JygE1cclnXdb9Kg==/)

### この教材で学べること

- Vueを使うメリット
- Vueの基礎的な知識
- APIを利用したプログラムの実装方法
- Vueの詳細な機能

### こんな人におすすめ

- Vue JSを学びたい人
- JavaScriptの基礎はある程度してフレームワークを使いたい人
- フロントエンジニアになりたい人
超簡単に超絶要約した、新しくアプリを作ってGithubのリモートリポジトリと結び付けるまでの手順

# はじめに
プログラミング歴4ヶ月突入の新参者です。

遊び程度に自分のHPを作ろうと思い、アプリを作る際にGithubにそのデータを残すためにローカルリポジトリとリモートリポジトリを紐付ける作業があるのですが、未だに教材を見返してその作業をやってしまうので、忘れないためにもここへ書いておこうという次第で書き込みました。

自分のためのメモ書きに近いのですが、もし閲覧する方の参考になれば幸いです。

# 手早く結論から

手順は

1. `git init`
1. `git add .`
1. `git commit -m "好きな保存名"`
1. Githubでリモートリポジトリを作成する
1. `git remote add origin リポジトリURL`
1. `git branch -M main`
1. `git push origin main`

※`灰色の部分`は打つべきコマンドです。

基本的にはこの順でローカルリポジトリとリモートリポジトリを紐付ける作業は完了します。

# 紐づけした後は

1. `git add .`
1. `git commit -m "好きな保存名"`
1. `git push origin main`

この順番にコマンドを打つとリモートリポジトリに変更がpushされ、コミットが更新がされます。
pythonのコメント機能について　（備忘録）


※この記事は、エンジニア志望の大学生が勉強のアウトプットとして書きました。コメントを各際に、他にこんなことを気を付けているなどあればご指摘いただけると幸いです。

Pythonでは、1行や複数行にわたってコメントを書くことができる。

#ここにコメントを書く

"""複数行にわたって
コメントを
書くことができる"""

- 複数行の場合はトリプルクォートで書いた方が良し。
- コメントは普通、コードの末尾ではなく単独の行に記述すると良し。
- フレーズや単語ではなく、意味が通る文章として記述すべし。
- コメントをするコードと同じレベルでインデントすべし。
- pep8の横文字制限80文字に従うこと。

インラインコメントは変数の目的や意味を記述すべし！
⇒変数のデータ型は記述しない（代入文を見ればわかる）
```Python
human_Weight = 65  #単位はキログラム
human_height = 175  #単位はセンチメートル
```
コメントはコードの動作ではなく、背景を明かにすべし！
```
誤り#65を175の2乗で割っている
正　#BMIを計算している
    print(65/(175)*2)
```
要約コメントを各コードの「段落」の頭に入れるべし！
他のプログラマーがざっと読んだときに大まかにわかるようにすべし。
⇒コードのまとまりごとに要約コメントがあればソースコードを流し読みしたとき、大まかに把握できる。
要約コメントが所々にあると全体の構成がわかりやすい。

```Python
# AとBの最大公約数を求める関数
def GCD(A, B):
	answer = 0
	for i in range(1, min(A, B) + 1):
		if A % i == 0 and B % i == 0:
			answer = i
	return answer

A, B = map(int, input().split())
print(GCD(A, B))
```
型ヒントをつけよう！
pythonは動的型付けのプログラミング言語である。
変数や戻り値のデータ型を宣言することなく、扱える
※他言語では、静的型付け（データ型宣言が必要）もある。

少ないコードで済むというメリットもあるが、データ型を間違えたことによるバグを防げない。
静的型付けはデータ型が違うと警告を発してくれる。
```Python
num: int = 23
def main(number: int) -> str
```
のように型ヒントをつけることで、静的型付けの安全面と動的型付けの柔軟性を持った漸近的型付けが可能。

型ヒントは、指定したデータ型を強制するものではないが、mypyを使うことでプログラム実行前に解析ができる。
⇒mypyをインストール後、ターミナルにて
```
python3 -m mypy ファイル名
```
で実行するか、各エディターで機能を有効にしてバックグラウンドで実行させる。
Pythonの文法

Pythonでプログラムを書く機会があったので文法をメモしておく。

### コンソールに文字を出力

```python
print('Hollo World!')
```

### 定数を宣言

```python
# 定数を宣言
HOLLO_WORLD = 'Hollo World!'

# 定数の内容をコンソールに出力
print(HOLLO_WORLD)
```

### 配列を宣言

```python
# 配列を宣言
list = [1, 2, 4, 8]

# 要素0の値をコンソールに表示
print(list[0])
```

### 配列の要素を削除

```python
# 配列を宣言
list = ['a', 'b', 'c', 'd']

# 配列の要素を削除
list.remove('b')

# 配列の値をコンソールに表示
print(list)
```

### 関数

```python
# 関数を定義
def main():
    print('Hollo World!')

# 関数の呼び出し
main()
```

### 配列の要素を数える

```python
# 配列を宣言
list = [1, 2, 4, 8]

# 配列の要素数をコンソールに出力
print(len(list))
```

### if文

```python
if num == 1:
    print('1')
elif num == 2:
    print('2')
else:
    print('3')
```

### while文

```python
while True:
    print('Hollo World!')
```

### 例外を発生させる

```python
raise Exception('Error')
```

### try-except(try-catch的なやつ)

```python
try:
    raise Exception('Error')
except:
    print('except')
```

例外クラスを指定することもできる。

```python
try:
    raise Exception('Error')
except 例外クラス:
    print('except')
```

### ファイルの読み込み
```
file = open('file.txt', 'r')
text = file.read()
file.close()
```

### コマンドラインで実行された場合のみ処理を継続する

```python
if __name__ == "__main__":
    main()
```

### 外部APIを実行(get)

```python
import requests

url = "http://hoge.co.jp"
data = {
    "p1":1,
    "p2":2,
    "text":"test"
}
r = requests.get(url, data=data)
```

### 外部APIを実行(post)

```python
import requests

url = "http://hoge.co.jp"
data = {
    "p1":1,
    "p2":2,
    "text":"test"
}
r = requests.post(url, data=data)
```

### 外部コマンドを実行
```python
result = subprocess.run(
    [
        'curl',
        '-X',
        'POST',
        '-H',
        'Content-Type: application/json',
        '-d',
        '{"p1":1}',
        'http://hoge.co.jp'
    ]
)
```

### 外部コマンドを実行(バックグラウンド)
```python
result = subprocess.Popen(
    [
        'curl',
        '-X',
        'POST',
        '-H',
        'Content-Type: application/json',
        '-d',
        '{"p1":1}',
        'http://hoge.co.jp'
    ]
)
```

### オブジェクトをJSON文字列に変換

```python
data = {
    "p1":1,
    "p2":"test"
}
print(json.dumps(data))
```

### ディレクトリの確認
booleanで返ってくる
```python
import os

os.path.isdir(dir_path)
```

### ディレクトリの作成

```python
import os

os.mkdir('dir_path')
```

### ディレクトリの削除

```python
import os

os.remove('dir_path')
```
中身ごと削除する場合は以下。
```python
import shutil

shutil.rmtree('dir_path')
```
【ブックマークレット】スマホからでもソースが見たい！

# ブックマークレットでページのソースを見る
スマホでページをみているときにページのソースコードが読みたくなるとき、ありませんか？
ブックマークレットを使うと、ブックマークをクリックするだけでスマホでも、iPadでも、ソースコードを見ることができます！

# はじめに謝辞
これは@mumeさんの

https://qiita.com/mume/items/2b6dff93f5aff6a810e2

にシンタックスハイライトを追加したものです。

# コード

新しいタブでソースコードが表示されます

```js
javascript:(function(){let newwin=window.open('about:blank');newwin.document.write('<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css"><pre><code>'+(document.documentElement.outerHTML%7C%7Cdocument.documentElement.innerHTML).replace(/&/g,%22&amp;%22).replace(/%3C/g,%22&lt;%22).replace(/%3E/g,%22&gt;%22)+'</code></pre><style>body{margin:0;padding:0;background:#282C34;}pre{color:white;overflow-x:auto;-webkit-overflow-scrolling:touch;}</style><script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script><script>document.querySelectorAll("pre code").forEach((el)=>{hljs.highlightElement(el);})</script>');})();
```

min化する前

```js
javascript:
(function(){
    let newwin=window.open('about:blank');
    newwin.document.write('
     <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
     <pre>
      <code>'+
        (document.documentElement.outerHTML||document.documentElement.innerHTML)
         .replace(/&/g,%22&amp;%22).replace(/</g,%22&lt;%22).replace(/>/g,%22&gt;%22)+
     '</code>
     </pre>
     <style>
      body{
        margin: 0;
        padding: 0;
        background: #282C34;
      }
      pre{
        color: white;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
      }
     </style>
     <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
     <script>
     document.querySelectorAll("pre code")
      .forEach((el)=>{
        hljs.highlightElement(el);
      })
     </script>');
})();
```

# コード解説
元のコードから、新しいタブで開くようにし、ハイライトを加えたものです

ブックマークレットはURL欄に書くため、ブックマークレットだと示すために最初にJavascriptであることを言っておきます

```js
javascript:
```

新しいタブを開いて書き込みます

```js
var newwin=window.open('about:blank');
newwin.document.write( ... );
```
ハイライトには[highlight.js](https://highlightjs.org/)を使いました
ライブラリを読み込み、ハイライトを実行します

```html
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
```

```html
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
```

```js
document.querySelectorAll("pre code")
 .forEach((el)=>{
     hljs.highlightElement(el);
 })
```


ここで読み込んでいるCSSを変えることで、ハイライトの配色を変更できます。

配色一覧

https://highlightjs.org/static/demo/

ここではatom-one-darkを使ってます

最後にhighlight.jsのバージョンアップの頻度が高いので、バージョンを最新版にしておくのをおすすめします
11.9.0の部分を最新のパージョンに変えてください

# まとめ
ブックマークレットという存在を知らなかったのですが、ブラウザを自分でカスタマイズしている感覚があって楽しいです。
ChatGPTの中身についてちょっと詳しくなるためのメモ書き

こんにちは！sakasegawaです！ ( https://twitter.com/gyakuse )
ChatGPTについて、これ前提として知っておくと便利だなーってことをまとめました！

## ChatGPTについて

### 言語モデル的特徴

ChatGPTで使われているGPT-3(正確には3.5シリーズ)は膨大なデータをもとに作られた言語モデルです。

GPT-3ではCommonCrawl、WebText 等のデータセットをもとに学習したModelが使われていて、CommonCrawlが60%程度を占めています。CommonCrawlでは、英語が50%程度に対し、日本語の含有率は5%程度となり、日本語に対してはナレッジベースとしての性能が低くなります(単純に1/10の性能とまではいかないと思います. 体感で半分くらいの性能)

また、Transformer型(要は古代ツイッタラーにわかりやすくいうと超すごいしゅうまい君)の言語モデルなので、基本的に　**「与えられた文章」に続くもっともらしい文章を予測する**　, というタスクを行っています。

### 言語モデルから考えられる苦手なこと

そもそも辞書的なものとして作られていないため、質問-応答タスクはそこまで上手ではありません。
超すごいしゅうまい君のため、与える文章を駆使すると、期待される結果を導き出してくれます。
そこで重要になってくるのがプロンプトエンジニアリングです。
プロンプトエンジニアリングの重要な手法として思考の連鎖 Chain of Thought (CoT) というものがありますが、とても長くなるので詳しく知りたい人はぜひこの記事を読んでみましょう。
[https://webbigdata.jp/ai/post-13592](https://webbigdata.jp/ai/post-13592)

### ChatGPT独自の特徴

ChatGPTでは、セッション単位で過去の会話を記憶する能力があります(ブラウザによるリロードで失われる)。
そのため、過去の会話をうまく参照させればセッションという短い寿命のなかで最適化されていきます。

## おまけ

### ChatGPTが間違った知識を喋ったときの対処法

![https___chat_openai_com_chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/6ad6dfb2-8d18-ec0b-ac85-25a6f1edb759.png)

英語で聞くほうがナレッジベース的に優秀であるため、一度想起させてから聞くと正答率が上がる

![ああｄ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/b48dc7f5-7918-5173-19b4-1551cd75b321.png)

![fff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/4b5b142d-f7fc-1d5d-5cd0-2d9d375e50fe.png)

### キャラクターを浸透させる

下記では何回も「夢見りあむ」という概念を定着させるプロンプトを入力したため、簡易的なキャラクターチャットが実現されている。

![Fi4coM3VQAAWFqi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/6b6149d8-3422-9f6d-4f01-03832058f991.png)
![Fi2np73VUAAJAcL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/8a5a5bec-936b-d154-19c2-15b3882f3579.png)
![Fi2n9o8UoAA-cFo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/c1ec2c41-8134-c5cb-ef62-0fe773e2eb38.png)



### ChatGPTの制限事項フィルタ

- 最近の事象判定
- 意思を問う判定
- 人間の存在意義についての判定
- NSFWに関する判定

という制限フィルタがあります(どのように実装しているかは詳しくは不明)。
まるでアシモフのロボット工学三原則のように働いています。
これは万能ではなく、「誰かに語らせるように命令する」などの対処によって避けることもできます。
一回判定に引っかかると、それが継続する場合があるので、ブラウザリロードなどでセッションをクリアすると良いでしょう。
IDMC 3つのデータ連携方式 入門

この記事は インフォマティカ [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 3 の記事として書かれています。


# はじめに
データ連携と一口に言っても、色々な方式があります。
今回は、3つのデータ連携方式の概要をお届けします。
これは、Informaticaの製品に限ったものではなく、
世の中のデータ連携処理全般に通じるものとして、読んでいただけますと嬉しいです。

# ３つの観点
データ連携は、３つの視点でかんがえることが重要です。
(a)リアルタイム性が必要かどうか
(b)データ量が多いか少ないか、連携対象のデータが数キロバイトから、
ギガバイト、テラバイトレベルなのか
(c)データ連携を行うきっかけが何か、人の行動がきっかけとなるか、
決められた時間がきっかけとなるかなどです。

もちろん例外的なケースもありますので、すべての連携処理があてはまるものではないのですが。
まとめると下記の３つのデータ連携方式に大別することができます。

<table>
  <caption>データ連携方式</caption>
  <thead>
    <tr>
      <th>NO</th> <th>方式</th><th>リアルタイム性</th><th>データ量</th><th>きっかけ</th>
    </tr>
  </thead>
  <tr>
    <td>1</td> <td>API連携</td><td>高い</td><td>少ない</td><td>人</td>
  </tr>
  <tr>
    <td>2</td> <td>取り込み連携</td><td>それなりに高い</td><td>そこそこ</td><td>常に</td>
  </tr>
  <tr>
    <td> 3</td> <td>データ連携(ETL)</td><td>ほぼ必要としない</td><td>多い</td><td>定期的</td>
  </tr>
</table>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984410/d5038cd2-f4c0-329c-7295-87d52a70fa7d.png)


## API連携 
API連携は、HTTP(s)プロトコルを使用したJSONデータを扱う連携がほとんどとなります。
よって、同期的に処理が完了しますが、扱えるデータ量は多くない場合がほとんどです。
最大でも1桁MBレベルのデータ量を扱うことが多いのではないでしょうか。
API連携によるデータ処理のきっかけは、”人”であることが多いです。
例えば、スマホ等のアプリから同期的にバックエンドのデータをAPIを使って呼び出す。
とある画面の入力値をWebhook等の技術を使って、API経由で他システムに連携する等です。

## 取り込み連携 
取り込み連携は、原則として姿形を原則としては変えずに、必要な時に必要なデータを
取り込むための連携となります。
ちょっとわかりずらいですが、データ処理のきっかけは ”常に” となります。
一番わかりやすい例となると、データベースのデータに変更があった場合、その差分を検知してデータを連携させることや
常に流れているログ情報を、フィルタリング等を行ったうえで取り込む等が該当します。
API連携のように、同期的にリアルタイムに処理する必要はないものの
それなりのリアルタイム性は求められることが多いです。
各種データソースから、データレイクやDWHにデータを取り込む必要がある場合に
利用されることが多い連携方式と言えそうです。

## データ連携(ETL) 
最後のデータ連携(ETL)処理ですが、ETLによるバッチ連携こそ
データ連携の昔からある処理方式と言えます。
日次バッチ、月次バッチと呼ばれるように、一定時間に1度起動して
処理を行いますので、データ処理のきっかけは ”定期的” となります。
リアルタイム性はほとんど必要なく、データ量は非常に多いケースがあります。
このバッチ連携を、数分ごとに小刻みに起動させて、少量のデータを連携させる
マイクロバッチのようなやり方も、リアルタイム性が高く、少量のデータとなりますが
一応、本方式の範囲といたします。

これらの方式を図にすると下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984410/093fbe82-3ee1-d1e0-6726-fd623b89fedc.png)

インフォマティカのIDMCでは、これらのデータ連携方式に対して
それぞれのソリューションを提供しております。

- API連携は、Cloud Application Integration でAPI開発
- 取り込み連携は、Cloud Mass Ingestion で取り込み連携開発（ファイル取り込み、データベース差分取り込み、ストリーミング取り込み等）
- データ連携(ETL)は、Cloud Data IntegrationでETL開発

これらをノンコード、ローコードでGUIを使って簡単に開発することができます。
なお、IDMCの概要は[こちら](https://qiita.com/tabe77/items/cb24d22775928727bf82)の記事も参考にしてください。


# おわりに
データ連携とは、要件に応じて手法を使い分ける必要があるモノ！と、本記事を見てご理解いただけますと幸いです。
今後も皆様のデータ連携の内容に着目し、要件に合った連携手段をご利用いただければと思います。
プロダクトマネージャーカンファレンスにて、新卒が基本から質問しまくりました

## はじめに
初めての投稿になります！
この記事はモチベーションクラウドシリーズ[Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs)の3日目の記事になります

自分は22年新卒で、モチベーションクラウドのプロダクトマネージャー(PdM)に配属となりました。
配属されて１ヶ月で、さまざまな企業のPdMが集まり交流する、[プロダクトマネージャーカンファレンス2022](https://2022.pmconf.jp/)に参加してきました。

新卒ならではの視点を持って、すごい人たちからPdMについての基本的なことを質問しまくったので、それについてまとめたいと思います！

これからPdMになる方や、PdMについて興味のある方のお役に少しでも立てればと思います。

## プロダクトマネージャーカンファレンスについて

このイベントは、さまざまな企業でPdMとして働く方が対面で集まり、運営からコンテンツを用意されていない中で、情報共有や交流などをするという内容のものでした。

#### 新卒1年目でプロダクトマネージャーは珍しい
イベント内で、「新卒1年目でプロダクトマネージャーになりました。22歳です」と自己紹介すると、参加者からかなり驚かれていました。うちの会社では1年に１人くらい新卒1年目でPdMが生まれるみたいなのですが、一般的には珍しいみたいです。

なぜ新卒1年目のPdMは珍しいのか、参加者に質問してみました。その理由は、このポジションで求められる能力が、新卒の時点では身についている可能性の低い能力だからだそうです。

#### プロダクトマネージャーの業務と、求められる能力
PdMの業務は、[プロダクトマネジメントトライアングル](https://productlogic.org/2014/06/22/the-product-management-triangle/)というものを参考に用いられることが多いです。この図形でいう、「顧客・開発者・ビジネス」の領域を健全に機能させることが役割であるとされています。

これだけだとちょっと分かりにくいので、例えばでいうと、ビジネスの領域で「ここまでしかコストをかけることができない」という考えと、開発者の領域で「ここまでコストをかけないと開発ができない」という衝突が起きたとします。PdMの役割は、これらのトレードオフの統合を行うことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986847/44720f57-8884-1e17-8d46-6c79746ddc82.png)
引用：[The Product Management Triangle](https://productlogic.org/2014/06/22/the-product-management-triangle/) (by Dan Schmidt)

また、これらの領域にはそれぞれの思惑が存在する為、完全な正解のない場面で意思決定をすることもあります。各領域の衝突を統合し、いかに一番正解に近いプロダクトにしていくかが重要になります。

そのため、顧客面や技術面など、さまざまな分野において幅広い知識と、正解がないプロダクト開発を開発チームと推進していくために、価値について考え抜き、正解を開発チームと作っていくことが求められます。

#### 新卒1年目がプロダクトマネージャーとして価値発揮、成長するには
上記から、PdMの業務を行うには、かなり高い水準でのプロダクト理解と、取捨選択をしてプロダクトを推進していくコミュニケーションが必要になるということがわかりました。これを新卒1年目に求めることはなかなか難しい気がするので、新卒PdMが少ない理由に納得しました。

逆に、何の経験も知識もない新卒が、少しでも価値発揮、成長するためにはなにができるのかを考えてみました。そこで、勉強についてはもちろんですが、チームに最低限の安心感を与えることが、自分に最低限出来ることであり、今後の成長にも直結する行動目標だと考えました。

なぜなら、チームにとって、プロダクトを一緒に考えていかなければならないメンバーが、そもそも理解ができているのかを確認するコストは、かなり無駄なものであるためです。信頼のないうちは、頭の中で議論について行っても安心感を与えることは出来ません。理解をしていても、していなくてもしっかりと自分の頭の中を発信する。これによって最低限チームのコストを削減することができますし、自身も伝える能力とプロダクト理解が進むのではないでしょうか。

#### プロダクトマネージャーの適性
PdMに配属になった時、上司に「なぜ自分がこの配属になったのですか？」と質問すると、「折れなさそうだから」と返ってきました。このイベントでも、「どんな人がPdMに向いていると思いますか」と質問すると、「精神力が強い人」と教えていただきました。

正解のない意思決定で領域間の衝突を統合し、プロダクトが失敗すればその責任を持たなければならない。自分も、理解や知識よりも前提の、根本としての適性有無はこの部分にあるのではないかと思いました、


## まとめ
今回は、PdMの業務や必要な能力、適性などの話を聞いて、まとめさせていただきました。

この記事を読んで、新卒からPdMをやることが難しいのではないかと感じられた方も多いかもしれません。自分も実際そこが気になり、イベントに参加されていた人に質問してみました。しかし参加者は、珍しいだけであって、不正解かはわからないとおっしゃられていました。

PdMの能力はPdMでしか成長させることができないものの、基本的なプロダクト理解も求められる。まだまだ育成方法が確立されていないとのことです。

そこで、自分が少しでも成長して、「新卒からのPdMの育ち方」として今後ナレッジ共有ができればいいなと思いました。
新卒未経験エンジニアがQAについて先輩社員に聞いてみた



## はじめに
はじめまして！
リンクアンドモチベーションの新卒エンジニアの渡邊です。

全くの未経験から、全社研修、プログラミング研修を経て配属され、現在三ヶ月目になります。
まずはプロダクトやデータベースを知るところを含めて、ソフトウェアテストを実施しております。

最初は「QAって何？」というところから理解をする必要があったため、
先輩社員に「QAとは」を聞くところから始めることにしました。

今回はその時に学んだことをまとめたいと思います。


## QAとテストの違い

**Quality Assurance＝品質保証という意味なので、本来「QAする」とは言わない**


テストとQAの違いについて、以下忘備録としてあげておきます。
> ソフトウェアテスト (英: software testing) は、コンピュータのプログラムから仕様にない振舞または欠陥（バグ）を見つけ出す作業のこと
> ソフトウェア品質保証(英: software quality assurance, SQA)は、ソフトウェアの適切な品質を保証するために、プロジェクトで使用されるソフトウェアエンジニアリングプロセスと方法を監視する手段と実践である
引用：Wikipedia



- **QA は開発組織として品質を保証するための仕組みを整え、標準化すること**であり、
- **テスト は品質を保証するための行為である**
ということですね。


## バグって何のこと？

バグは、以下の2つに分けられます。
①　−（マイナス）→ 0（ゼロ）のバグ
②　0（ゼロ）→＋（プラス）のバグ

「テストでバグを見つける」というと、①のことかと思いがちですが、②も含まれている。
バグとは、故障ではなく改善点、ということなのですね。


②のバグを見つけるには、 テスト＝作業 ではなく 、 プロダクトの改善活動 と捉えて
ユーザー視点で取り組むことが大事だなと思いました。




## シフトレフトという考え方

テストで「バグ」を発見することがゴールかというと、そうではありません。

テストはあくまでもプロダクトが壊れていないかどうかを確認するものであり、
テストで発見したものを改善して初めて品質が上がります。

とはいえ、テスト段階で改善点を発見してデバック、となると余計な工数がかかってしまいます。
品質保証を前段階の設計・プロセス管理から考慮する、シフトレフトという考え方があります。

> シフトレフトとは
セキュリティに関する問題がソフトウェア開発ライフサイクルの早い段階で対処されること を意味します
引用：google cloud（https://cloud.google.com/architecture/devops/devops-tech-shifting-left-on-security?hl=ja）


## ユーザーストーリーについて
設計段階で考慮された品質をテストでどう担保できるようになるのでしょうか？
そこで重要なのが**ユーザーストーリー**です。

### ユーザーストーリーの重要性
ユーザーストーリーは **ユーザーに何を届けたいのか、何を守りたいのかを理解する**ためにも重要なものです。

ユーザーストーリーについて具体例をあげて考えてみます。
> 例）携帯のオンラインストアの登録番号のバリデーションテスト
　4桁の番号入力のテストケースの際に、入力例に「9999」しか記載されていない
　→ケース通りに進めるのであれば、「9999」のケースのみの検証にとどまる

　このケースにおけるユーザーストーリーは以下のようになります。

> 携帯の登録情報を変更するには、契約申込の時に入力した4桁の番号が必要
個人情報を悪意のある第三者に簡単に変更できないように、4桁の番号は連番・誕生日は不可となっている

上記のストーリーを理解した上でテストを行えば、
> 「1234」とか、他の連番にもバリデーションがかかるべきではないか？

という発想が生まれ、テスト設計者の構想外のパターンで検証ができるのです。

### 良いストーリーはどんなものなのか
良いストーリーとは、 **テストの意義の部分を理解できるストーリー**となります。

> ドリルを買いにきた人が欲しいのはドリルではなく『穴』である
引用：『マーケティング発想法』（1968年）

上記のようなマーケティングの話にもあるように、プロダクトにおいても
**ユーザーが何を必要としているのか、何をもって喜ぶのか**、その本質を捉えることが品質向上に繋がります。

ユーザーストーリーは、より多くの目で・主体的に品質保証に取り組むためにも
プロダクトに関わる人が理解するべきものだと感じました。

## おわりに 「QAとは」

以上のことから、
プロダクトの品質向上のためには、サービスの設計段階から「本当に必要な機能なのか」を考え、
関係者が意義を理解して開発していく必要があると感じました。

リンクアンドモチベーションの開発組織では、品質保証をチーム全体で取り組むことに注力しています。

先輩は
> QAの改善によるプロダクトの安全性・信頼性の向上がゴールではなくて
その上で、 顧客のこと、プロダクトの進化に関する思考時間を増やせるようになるのがゴールである

とおっしゃっていました。

まだまだできることは少ないですが、プロダクトの品質向上に少しでも貢献できるように、
新人なりに日々頑張っていきたいと思います。

最後までご覧いただき、ありがとうございました！
【Unity】SetActiveSceneとUIの表示順について

# はじめに
1つのHierarchy上に複数のSceneが存在する場合の描画順や、ActiveSceneが切り替わった際のUIの描画順について気になったのでまとめてみました。

# 環境
OS : Windows10
Unity バージョン : 2021.3.2f1

# SetActiveSceneとは
SceneManagerの関数で、引数で指定したSceneをHierarchy上でアクティブにします。
```C#
SetActiveScene (SceneManagement.Scene scene)
```
ここで言うアクティブというのは、LoadSceneでSceneを読み込むということではありません。
複数のSceneがHierarchy内にある場合、その内の1つがHierarchy上で太字になります。
(以下の場合は、Scene1がアクティブな状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/0dde6904-f7bd-8899-330d-77f29a7b7c87.png)
このアクティブな状態というのは勝手に切り替わるわけではなく、例えば、Scene1がアクティブの状態でScene2内にあるUIを触ってもHierarchy上ではScene1がアクティブな状態のままになります。
そこで使用できるのが`SetActiveScene`ということになります。
### 使用例
現在触っているSceneによって処理を書き換えたい場合に使用できます。
例えば、`SetActiveScene`を使用せずに以下の処理を実行しますと、最初のif文にしか入りませんが、`SetActiveScene`を使用することで、Sceneごとに処理を分けることができます。
```C#
if(SceneManager.GetActiveScene().name == "Scene1")
{
    // Scene1でやりたい処理
}
else if(SceneManager.GetActiveScene().name == "Scene2")
{
    // Scene2でやりたい処理
}
```

# UIの描画順
アクティブなSceneを切り替えたことによりUIの描画順が変わるかについてですが、結論、変わりません。
実際に以下の例で確認します。
Scene1にあるButton1を押すと、Button2を持つScene2が同じHierarchy内に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/b0cff781-0608-bf8a-bdc2-2801ee2ca998.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/f092576e-657d-3e0e-4bfd-e0102c71e46d.png)

このとき、アクティブなSceneはHierarchy上で太字になっているScene1です。しかし、UIはScene2のButton2がScene1のButton1より上に描画されています。
Button2を押すと`SetActiveScene`でアクティブなSceneをScene2に切り替えていますが、描画順は変化しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/0c1a1713-f713-6c16-6424-544489d3e7f9.png)

Button1を押しても同様で、アクティブなSceneがScene1に切り替わりますが、描画順は変化しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/5ea59200-0e6d-403a-6ef1-7926a9ad82b5.png)

# まとめ
- Sceneをアクティブな状態にするには、SetActiveSceneが使用できる
- アクティブなSceneを切り替えても描画順に変化はない

# 参考
- [SceneManager.SetActiveScene](https://docs.unity3d.com/ja/2018.4/ScriptReference/SceneManagement.SceneManager.SetActiveScene.html)