OmniAICreator/Qiita-1.07M huggingface dataset:
Public preview として公開中の AWS Native package について


## Pulumi AWS Native package について

Pulumi 社から AWS Native package が公開され約 4 カ月経過しました。
なぜ AWS Native package が作成されたか等この記事で紹介します。

https://www.pulumi.com/blog/announcing-aws-native/

## AWS Native package が作成された理由

AWS Native package の公開と同時に Amazon Web Services から、AWS のリソースを操作するための新しいインターフェース AWS Cloud Control API が公開されています。

下記記事内に記載されている通り Pulumi と HashiCorp (Terraform) がリリースパートナーとして AWS Cloud Control API と連携しながら各することで、より早く提供されたサービスを Pulumi や HashiCorp (Terraform) から操作することができるようになります。

原文:

https://aws.amazon.com/blogs/aws/announcing-aws-cloud-control-api/

日本語訳:

https://aws.amazon.com/jp/blogs/news/announcing-aws-cloud-control-api/

今までの `pulumi-aws` は AWS Terraform Provider に依存する形で作成されており、いままでは AWS が新しい機能・サービスの追加を行っても Terraform の更新を待つ必要がありました。

(まだプレビューですが) AWS Cloud Control API で リソースを操作する AWS Native package は、特別な事情がない限り AWS Cloud Control API に変更が入った当日に提供されます。
Pulumi や Terraform が対応していないため 別のツールやサービス (CloudFormation) などで管理することもありましたがその可能性が格段と低くなりました。

## AWS Native package はいつプレビュー版でなくなるか

現時点正式バージョンの公開は発表されていません。

## AWS Native package は利用しても良いのか?

> For new projects, we recommend using AWS Native and AWS Classic side-by-side so you can get the speed and correctness benefits of AWS Native where possible. For existing projects, AWS Classic remains fully supported; at this time, we recommend waiting to migrate existing projects to AWS Native.

`pulumi-aws-native` repository の README には以下のように記載されています。

### 新規で作成するプロジェクト

AWS Native と AWS Classic を両方を利用できるように設定
AWS Native が利用できるリソースは AWS Native を利用して構築

### 既存のプロジェクト

AWS Classic は引き続きサポートするため AWS Native に急いで移行することは推奨していない。
ただし、今後移行することを求められることは容易に想像できるため、新規でリソースを作成する場合は AWS Native を利用した方がよいと思います。

## さいごに

今回は、Pulumi の AWS Native package について紹介しました。
AWS Cloud Control API の登場でさらに IaC が進んでいくのではととてもわくわくしています。

## Reference

https://github.com/pulumi/pulumi-aws

https://github.com/pulumi/pulumi-aws-native
[Unity]ゲームオブジェクトのメッシュをobjで保存するスクリプト

# はじめに
なぜかみつからなかったので投稿．書くほどのことか？と思うが誰かの役に立ちそうなのでメモ．
色の保存はvertexColorでテクスチャではない．なおUnityは初期設定ではobjに記載されたvertexColorを反映できないので，保存した.objファイルを他のunityプロジェクトに流用する際はこの方法は向かない．

# 環境
- Unity 2019.4
- Windows 10

# コード
```_.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class [classname] : MonoBehaviour
{  
    //保存対象オブジェクト(unity側で指定してください)
    GameObject model;

    // この関数を実行で保存．ボタンの関数等に設定してください
    public void objSaveButtonFunc(){

        Mesh mesh = model.GetComponent<MeshFilter>().mesh;

        List<Vector3> _vertices = new List<Vector3>(mesh.vertices);
        List<Color> _colors = new List<Color>(mesh.colors);
        List<int> _triangles = new List<int>(mesh.triangles);

        objWriter(_vertices, _colors, _triangles);
    }

    private void objWriter(List<Vector3> list_v, List<Color> list_c, List<int> list_t){
        string path = Application.persistentDataPath + "/test.obj";
        using (var fs = new StreamWriter(path, true, System.Text.Encoding.GetEncoding("UTF-8")))
        {
            print(path);
            // ファイルの文頭から頂点情報を入れると反応しないレンダリングソフトがあるのでコメント挿入
            fs.Write("### created by unity script")
            for(int t = 0; t < list_v.Count; t++){
                // 色つきで保存する場合はこのコメントを外して，下のfs.Writeをコメントアウト
                // fs.Write("v " + list_v[t].x + " " + list_v[t].y + " " + list_v[t].z + 
                //    " " + list_c[t].r + " " + list_c[t].b +" "+ list_c[t].g + "\n");
                fs.Write("v " + list_v[t].x + " " + list_v[t].y + " " + list_v[t].z + "\n");
            }
            for(int t = 0; t < list_t.Count/3; t++){
                string f1 = (list_t[t * 3 + 0] + 1)+"";
                string f2 = (list_t[t * 3 + 1] + 1)+"";
                string f3 = (list_t[t * 3 + 2] + 1) +"";
                
                fs.Write("f "+f1+"//"+f1 +" "+ f2+"//"+f2+" "+f3+"//"+f3+"\n");
            }
            fs.Write("# vertex: "+list_v.Count + " face: "+ list_t.Count);
        }
    }
```

# 解説
- Unityの頂点番号は配列などと同様で0,1,2...n-1と保存されているが，.objのフォーマットでは1,2,3...nと記載するため，1を足している
- MeshLab2020.12 for Windowsでは文頭から頂点情報を書き込むと文頭の１点が無視されることを確認．.objフォーマットの規則なのか文字コードが悪いのかバグなのか不明．詳しい人情報ください．

# 参考
[hiramine氏ブログ-objフォーマット-](https://www.hiramine.com/programming/3dmodelfileformat/objfileformat.html)
[Wikipedia -Wavefront_.obj-](https://ja.wikipedia.org/wiki/Wavefront_.obj%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
Python_ __name__, __main__

# 実行スクリプト上での`__name__`は`__main__`になる
```my_module.py
def print_name():
    print(__name__)


print_name()
```

```実行
$ python my_module.py
__main__
```

# moduleとして呼び出した時の`__name__`はmodule名になる
moduleをimportしたときにmoduleを全て一度実行するので、my_moduleが3回printされている。

```main.py
import my_module

my_module.print_name()
print(my_module.__name__)
print(__name__)
```

```
$ python main.py
my_module
my_module
my_module
__main__
```

# moduleをimportして使用するときに実行したくない処理は`if __name__ == "__main__":`の中に入れる


```my_module.py
def print_name():
    print(__name__)


if __name__ == "__main__"
    print_name()
```


```main.py
import my_module

my_module.print_name()
print(my_module.__name__)
print(__name__)
```

```
$python my_module.py
__main__

$ python main.py
my_module
my_module
__main__
```

# 公式ドキュメント
https://docs.python.org/ja/3/reference/import.html?highlight=__name__#name__
https://docs.python.org/ja/3/library/__main__.html
続OSSスキル標準について　Open Source Skill Standard

*Please scroll down for the English Summary.

こんにちは！
昨日に続いて登場の遠藤です。

本日は、[昨年](https://qiita.com/tech_nomad_/items/b0a6a0606067dd4137e9)も紹介したOSSスキル標準に関する紹介を再度させてください。

昨日も紹介した通り、コンプライアンスやセキュリティの観点からもOSS管理の重要性が日増しに増大しており、企業の取り組み内容を共有しようという動きもひろがっています。
また、OpenChainにおいても企業が適切にOSSを管理するためのプロセスの標準の普及や、
教育資料の作成、プラクティスの共有なども進んでいます。

#OSSスキル標準の必要性と新たな展開
一方で、OSS管理の業務はソフトウエア開発部門、セキュリティ部門、法務・知財部門など様々な部門が
関わる複雑な業務であり、比較的新しい業務であるため、
各業務を誰(またはどの部署)が担当するべきか、各担当者をどのように育成していくべきかの指針が
必要とされていました。

もう一つのトレンドとして、ここでも「セキュリティ・ツールWeek」が開催されているように、
コンプライアンス業務やセキュリティ業務の共通部分が多いことから、
スキル標準もコンプライアンスに限らずOSSマネジメント全般を取り扱おうということになりました。
また、スキル標準の策定経験がある業界団体等の皆さんとの連携も模索しています。

![スキル標準の.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/58ae41ba-2fa5-c7a3-6686-dd8ba13b3548.png)
表：OSSマネジメントスキル標準のカバー業務

#カバー業務に関する意見を募集中です！
12月16日に行われれたOpen Compliance Summitで上記のカバー業務について発表させていただき、
グローバルに意見募集をはじめました。
資料は下記のGitHubに格納しています。
コメントは日本語でも全く問題ありませんので、ご意見あれば資料中に記載のメールアドレスまでよろしくお願いします！

https://github.com/OpenChain-Project/OpenChain-JWG/tree/master/subgroups/promotion/skillstandards

#仕切り直しにあたって
そこでスキル標準策定チームでは、標準の規模の拡大に対応するために新たなメンバーを募集しています。
先ほども記載しましたように、OSS管理は様々な部門の方に必要とされているので、どんなバックグラウンドの方でも大歓迎ですし、これを機にOSSのことを勉強したいというかたも是非ご参加いただきたいと考えています。
活動は毎週月曜日の夜に2時間程度ウェブ会議を行っている他は、各自が宿題をやったり、
たまに関係する皆様と打ち合わせを行うようなイメージです。
これもオープンソースコミュニティ活動なので基本的には全てがオープン、且つ、無償の活動になります。

もし、参加されたいという方がいらっしゃる場合は、ここのコメント欄に記入頂くか、
OpenChainのML/Slack等で遠藤までご連絡頂ければと思います！

![今後の予定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/900ac1df-1785-2fb4-1a93-e562097fa05b.png)

#English Summary

Hi!
Today I’d like to introduce the latest situation of “[OSS Skill Standard](https://qiita.com/tech_nomad_/items/b0a6a0606067dd4137e9)”.
As I introduced yesterday, the importance of OSS management is increasing day by day from the perspective of compliance and security.
OSS management operations are carried out by various departments such as software development department, security department, legal and intellectual property department, etc.
Because it is a complicated operation involved and it is a relatively new operation guidance on who should be in charge of each task and how to train each person in charge is needed.
Please check our document at GitHub, and give us your feed back.

https://github.com/OpenChain-Project/OpenChain-JWG/tree/master/subgroups/promotion/skillstandards

Because there are many common parts in compliance work and security work, recently, we decided to handle OSS-related matters in general from limited to compliance.
Therefore, the skill standard development team is looking for new members to respond to the expansion of the standard

Any background is welcome. If you would like to study OSS, please join us.
The activity is a web conference for about 2 hours every Monday night.
This is also an open source community activity, so basically everything is open and free of charge.

If anyone wants to participate, please fill in the comments here or
Please contact me via OpenChain's ML or Slack!
【ラズパイ4】起動時、ディスプレイにホーム画面が表示されない

# 現象
Raspberry Pi 4 を起動時、ディスプレイに"No Signal"が表示され、ホーム画面が表示されない

# 考えられる原因
上記現象発生には、以下の2つの原因が考えられた。
**【原因1】Raspberry Pi 4 側のHDMI端子が奥まで差し込めていなかったことによる接続不良**
　ラズパイケースに入っているRaspberry Pi 4 本体に対して何度HDMI端子を差し直してもディスプレイには"No Signal"が表示された

**【原因2】Raspberry Pi 4 を画面からシャットダウンさせずに電源スイッチを切ったことによるシステムエラー**
　正常にシャットダウンさせずに電源スイッチを切ると、microSD内の不整合により2回目～何回目かの確率でシステム破損するらしい

# 解決方法
**1.Raspberry Pi 4 をケースから取り出し、HDMI端子を奥まで差し込む（まずはこちらを先に確認）**
　＃私の場合はこれで正常に画面表示されたので、ラズパイケースとRaspberry Pi 4 本体の間に目視では分からないほどの若干の隙間があったのかもしれない

**2.上記1.でも解決しない場合、【原因2】が原因の可能性がある。その場合は下記を試してみる**
参照：https://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=M-14778
> 【質問】	起動できません。解決策を教えて下さい。
[2019/11/29 13:49:38]
【回答】	下記の2点をご確認ください。ラズベリーパイ財団の英語資料をご案内いたしますが、google(ブラウザ)の翻訳機能によって日本語化できます(原文と対比しながらお読みください)。
① OSイメージがmicroSDカードに正しく書き込まれていない場合。
⇒ この Webページ を参考にmicroSDカードをセットアップしてください。
② 基板上のSPI EEPROM(ブートローダー)が不具合を起こしている場合。
⇒ 確認方法: 給電を切断してmicroSDカードを取り外してから、給電を再開します。緑色のLED(ACT)が点滅しない場合は、EEPROMを 再プログラム(Recovery) します。
ブートローダーはRaspberry Pi 4 Modele Bから新たに導入された機能です。 詳しくは、この Webページ をご参照ください。


上記②の方から先に確認する。
**緑色のLEDが点滅しない場合はEEPROMを再プログラム・ダウンロードする**
EEPROMを再プログラム・ダウンロードする方法は下記を参照
https://mikolabo.net/index.php/2020/07/13/rasp4-trouble/
『アップデート中に電源が落ちるなどして、EEPROMの書き込みが不完全に終わり、ブートコードが破壊される危険がある』
**緑色のLEDが点滅する場合はmicroSDカードをセットアップする**
microSDカードをセットアップする方法は下記を参照
https://dev.classmethod.jp/articles/restore-the-raspberry-pi-4-model-b-os-destroyed-by-a-biginner/
『対処、解決』章
atcoder abc229 D問題のpython実装例としてしゃくとり法を実装してみたら面白かった

以下問題の解説がc++のみという事もあり、回答方針を参考にさせて頂きpythonで実装を試みた例

https://atcoder.jp/contests/abc229/editorial/2956

## 問題

![スクリーンショット 2021-11-28 23.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/d7576cee-cc8f-3a00-a140-3abd74f9677a.png)


## 実装方針

しゃくとり法

> [しゃくとり法 (尺取り法) の解説と、それを用いる問題のまとめ](https://qiita.com/drken/items/ecd1a472d3a0e7db8dce)

![Image from iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/4360a232-db90-d498-f3cc-c97af4661d68.jpeg)

## pythonで実装を試みた例


```python:test.py
#!/bin/python3

def print_max_num():
    S = input()
    K = int(input())
    length_S = len(S)
    #print(S)
    #print(K)
    #print(length_S)
    #print("---")

    # 累積和
    DotSum = 0
    DotSum_S = [0] * length_S
    for i in range(length_S) :
        if S[i] == '.':
            DotSum += 1
        DotSum_S[i] = DotSum

    #for i in range(length_S) :
    #    print(DotSum_S[i])

    # 探索(しゃくとり法)
    answer = 0
    for i in range(length_S) :
        Xcnt = 0
        Dotcnt = 0
        DotNum = 0
        for j in range(length_S) :
            idx = i+j
            # idxが配列の最大値を超えてる場合は探索終了
            if idx >= length_S:
                break

            # Dotの出現数を取得する(累積和の差分を利用)
            # DotNumの出現数が最大値Kを超えてる場合は探索終了
            if i == 0:
                DotNum = DotSum_S[idx]
            else:
                DotNum = DotSum_S[idx] - DotSum_S[i-1]
            if DotNum > K:
                break
            Xcnt += 1
        answer = max(answer, Xcnt)

    print(answer)

# main
print_max_num()
```

### 入力例１

```text:input.txt 
XX...X.X.X.
2
```

入力例１の出力

```
$ cat input.txt | time python3 test.py
5
```

### 入力例２

```
$ cat input2.txt | time python3 test.py
4
```

入力例２の出力

```text:input2.txt 
XXXX
200000
```

### 実行時間

`0.04sec`ほど..

```
$ cat input.txt | time python3 test.py
5
        0.04 real         0.03 user         0.00 sys
```

# 感想
もっといい書き方がある気がしてなりません

# 参考
https://atcoder.jp/contests/abc229/editorial/2956

https://www.akiradeveloper.com/post/syakutori/
経産省のOSS管理手法事例集について　About METI's Case Study of Open Source Management Methods

*Please scroll down for the English Summary.

こんにちは！
2回目の登場の遠藤です。

#本日からセキュリティ・ツールWeekです！
本日から「セキュリティ・ツールWeek」と称して7日間、OpenChainのセキュリティ関連の取組の紹介や、
OSSコンプラのツール関係トピックを取り上げていきます。

OpenChainは元々、ライセンスコンプライアンスにフォーカスを当てたプロジェクトですが、
サプライチェーン内でのソフトウエア透過性の向上や自社が使用しているOSSの見える化などの課題は
セキュリティ対応の課題と共通することから、セキュリティ関連の取組も拡大してきています。

#事例集策定の経緯と内容について
本日は、2021年4月21日に経済産業省からリリースされた
「[オープンソースソフトウェアの利活用及びそのセキュリティ確保に向けた管理手法に関する事例集](https://www.meti.go.jp/press/2021/04/20210421001/20210421001.html)」について紹介させてください。
この事例集は[サイバー・フィジカル・セキュリティ確保に向けたソフトウェア管理手法等検討タスクフォース](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_seido/wg_bunyaodan/software/index.html)によってリリースされたもので、企業におけるOSS管理の参考にして頂くために、様々な企業の取組事例が紹介されています。
このタスクフォースはソフトウエアの透過性を担保（自社の使っているソフトの中身を明確化）するために
SBOM（ソフトウエア部品表）に着目し、企業がSBOMを適切に取りまわすことを支援する活動を行っています。
これはライセンスコンプライアンスと共通の課題のため、セキュリティに関する事例集ではありますが、OpenChainやSPDXに関する記載も多くみられます。
ソニーや日立製作所などOpenChainのプラチナメンバーの事例の他、デンソー、NTT、サイボウズなど様々な会社の事例が紹介されています。

私も微力ながらこの事例集の作成に協力させて頂いた関係で、[Linux Foundationからインタビュー](https://www.linuxfoundation.org/blog/interview-with-masato-endo-openchain-project-japan/)を受けました。

![METI1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/00a22e5c-e702-817e-cdee-8c2ad14c03de.png)
出典：https://www.meti.go.jp/press/2021/04/20210421001/20210421001.html

#その後の展開
この事例集は秋に[英語版もリリース](https://www.meti.go.jp/policy/netsecurity/wg1/CollectionOfUseCaseExamplesForUtilizingOSS.pdf)され、
これからも事例がどんどん追加されていく予定ですので、
他社のOSS管理の状況を知りたいという方は是非是非チェックしてみてください！！
![METI2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/dcc06b13-baf5-d607-7f93-4b3ac7366b33.png)
出典：https://www.meti.go.jp/press/2021/04/20210421001/20210421001-1.pdf

#English Summary

Hi! I’m Masato ENDO.

From today, “Security and Tool week” is started. 
OpenChain focuses on open source license compliance at first.
Because issues are similar to license compliance, OpenChain activities are expanding to security related activities also.
In this April, Ministry of Economy, Trade and Industry in Japan released　“[Collection of Use Case Examples Regarding Management Methods for Utilizing Open Source Software and Ensuring Its Security](https://www.meti.go.jp/policy/netsecurity/wg1/CollectionOfUseCaseExamplesForUtilizingOSS.pdf)”


This document show 15 companies’ OSS management practices. And, many companies mentioned to OpenChain and SPDX.
Because I also supported this document, I took [an interview from The Linux Foundation](https://www.meti.go.jp/policy/netsecurity/wg1/CollectionOfUseCaseExamplesForUtilizingOSS.pdf ).
Please check it!
【AtCoder】初学者，TLEに心を折られる

### はじめに
PythonでAtCoderにチャレンジしているのですが，TLEで挫折することが多々あります．
今回もそんな感じになったので，初記事を書いてみます．ちなみに，PythonもAtCoderもともにぺーぺーです．

### 発生している問題・エラー
例えば，タイムリーなこの問題（AtCoder Regular Contest 130 B- Colorful Lines）．後工程から見ていく方法でトライしました．

https://atcoder.jp/contests/arc130/tasks/arc130_b

以下の通り回答しましたが．TLEが22/35となりました．平均**2206ms**かかっている．
$Q ≤ 3×10^5$　でしたが，おそらくN, Mを毎ループ探してしまうのがダメなのか…しかしそれをしないやり方はあるのか…．

```py
import sys
input = sys.stdin.readline

H, W, C, Q = map(int, input().split())
t = [0] * Q
n = [0] * Q
c = [0] * Q
for i in range(Q):
  t[i], n[i], c[i] = map(int, input().split())

N = []
M = []
ans = [0] * C
for i in range(Q)[::-1]:
  if t[i] == 1 and n[i] not in N:
    ans[c[i]-1] += W - len(M)
    N.append(n[i])  
  elif t[i] == 2 and n[i] not in M:
    ans[c[i]-1] += H - len(N)
    M.append(n[i])
  elif len(N) == H and len(M) == W:
    break

print(*ans)
```

### 自分で試したこと
此方を参考に，何度かトライをしました．

https://qiita.com/netyo715/items/3336053b12ff1b75438b

- PypyとPythonを行き来．
- input を sys.stdin.readline にすることで読込時間を1/10程度に短縮（できてる？せいぜい2ms程度しか縮まらなかった．）
- すべてのマスが埋まったらbreak（悪あがき）

whileではなくforを使っているし，あと変えられるところは…
という間に，やる気を失い，この記事の下書きを始めてしまいました．

### 答え合わせ
コンテスト終了後に公式解説を確認．全く同じ解き方で一安心．だが何が違うんだ．

https://atcoder.jp/contests/arc130/editorial/2975

一番効いていたのは，読込ではなく，**埋まっている行・列（探索対象）をlistではなくset(集合)**にすることでした．
これで計算時間は1/3～1/4程度に．

```py
import sys
input = sys.stdin.readline

H, W, C, Q = map(int, input().split())
t = [0] * Q
n = [0] * Q
c = [0] * Q
for i in range(Q):
  t[i], n[i], c[i] = map(int, input().split())

# set(集合)をセット．
N = set()
M = set()
ans = [0] * C

for i in range(Q)[::-1]:
  if t[i] == 1 and n[i] not in N:
    ans[c[i]-1] += W - len(M)
    N.add(n[i]) # appendではなくadd．
  elif t[i] == 2 and n[i] not in M:
    ans[c[i]-1] += H - len(N)
    M.add(n[i])
  elif len(N) == H and len(M) == W:
    break

print(*ans)
```

基本的なことですが，**setをもっと使おう**と思います．

### 追記
- setがtupleになっていたものを修正しました．
- 参考になる記事を@snhrhdtさんに共有いただきました．**「知らないと恥ずかしい」…**

https://qiita.com/Hironsan/items/68161ee16b1c9d7b25fb
Hierarchyにあるオブジェクトのパスを取得する

アニメーションをエディターから作ろうとした時に、
あれ・・・？これってパスの取得できなくね・・・？
っておもったので、プログラミング初心者がパスを取得できるようにしてみました
[VRC用の拡張Editorを作ってみよう](https://qiita.com/Milcia/items/c967253233a20a028b62)の方で使いたいので、ここに軽く説明を残しておこうと思います
無駄なことをやってるかもしれないので、安定したコードを探しているのであれば、今回のコードの使用はお勧めできません
お勧めはできませんが、その場しのぎにはなると思います

##作ったコード

```c#
private static string GetHierarchyPath(GameObject targetObj)
{
    List<GameObject> objPath = new List<GameObject>();
    objPath.Add(targetObj);
    for (int i = 0; objPath[i].transform.parent != null; i++)
        objPath.Add(objPath[i].transform.parent.gameObject);
    string path = objPath[objPath.Count - 1].gameObject.name;
    for (int i = objPath.Count - 2; i >= 0; i--)
        path += "/" + objPath[i].gameObject.name;

    return path;
}
```

##メソッドの呼び出し

```c#
string path = GetHierarchyPath(GameObject);
```

##コードの説明
最初にListで変数を作り、ターゲットのゲームオブジェクトを入れます
リストができたら、for文を使って、オブジェクトの親がある時はループするようにします
最初のオブジェクトは、一番最初に入れたターゲットのゲームオブジェクトで、
一度ループすると、ターゲットの親が次のターゲットのゲームオブジェクトになります
また、ループする度にゲームオブジェクトをリストに追加します
次にStringで変数を作り、リストに入れたオブジェクトを[.Count - 1]で、一番後ろに入っているゲームオブジェクトの名前を追加します
string変数ができたら、for文を使って、今さっき追加したリストを、逆からstring変数に追加していきます
ループが終わり、値を返してあげればできあがり！！って感じです
「QAなのでユーザー視点でテストできる」のもう一つの解釈

#1. はじめに
今から3か月ほど前ですが、

>「QAなのでユーザー視点でテストできる」と言ったりするときの「ユーザー視点」の要素分解をしたい。（※私自身は、この言葉は言わないがよく聞く言葉）<br><br>「開発者はユーザー視点で見れないのか？」はNo（見れる）と思っていて、そこには結局「ユーザー視点」という単語で隠れている部分があると思う。
&mdash; broccoli (@nihonbuson) <a href="https://twitter.com/nihonbuson/status/1433090337644298250">September 1, 2021</a>

というbroccoli氏のツイートが話題になっていました。また、Kazu SUZUKI氏が「[「ユーザ視点」とは何か](https://www.kzsuzuki.com/entry/2021/09/25/135442)」という記事を書かれています。

『「ユーザー視点」の要素分解をしたい』ということでいずれも「ユーザー視点」に着目されていますが、本稿では「QAなので」に着目するとこういう解釈ができるのではというのを書いてみたいと思います。


##2. もう一つの解釈
件のツイートを拝見して思ったのは、実は「QAなのでユーザー視点でテストできる」はいろいろ端折られていて、

「QAなので<b>プロセスを見直して工程にベータテストを組み込んでユーザーにテストしていただけるようにしたので</b>ユーザー<b>自身が彼らの</b>視点でテスト<b>した結果を開発者にフィードバック</b>できる」

なら分からなくもないなぁ、というものです。

QAの役割の一つにQMS(Quality Management System)の構築や改善があり、この記事をご覧になっているQAの中にはプロセスや規程の改訂をされている方もいるのではないでしょうか[^1]。また、ユーザーのことはユーザーに教わる[^2]のも方法の一つと思います。

「QAなので」に着目してQAの取り組みを補ったことで一応は意味が通るようになったと思います。


##3. おわりに
プロダクトの品質にQAが貢献する方法として、テスターやテストエンジニアとして手を動かすだけでなくプロセスに手を入れる方法もあるよね、というお話でした。


[^1]: QAがSEPGの機能も備えるのか分担するのかは組織次第ですがここではQAがSEPGも担うとします。参考：[品質保証部最前線 ～オジサンたちも悩んでいる～](https://www.juse.or.jp/sqip/community/bucyo/1/file/grp3.pdf) p.6
[^2]: ユーザーの言うことを鵜呑みにするという意味ではありません。
統計検定2級

2021年11月28日に統計検定2級を受験しました。
合格したので記事を書いておきます。

## 受験理由
■１ 統計に関しての理解を深めるため。

## 感想
■１ 実は2020年に1度受けて落ちました。今回は2度目の受験です。2度受けて感じるのは、CBTの問題の傾向は2011-2015年の過去問に近い気がします。実際にそうなのかは謎ですが。
■２ 電卓の使い方を覚えると（使い方に慣れると）、サクッと問題が解けるので、問題の解き方はわかるけど時間が足りない方は電卓の使い方を覚えた方が良いと思います。

	
## 学習教材
■１ 改訂版 日本統計学会公式認定 統計検定4級対応 データの活用 第1刷（日本統計学会 (編), 2019, 東京図書株式会社）
■２ 改訂版 日本統計学会公式認定 統計検定3級対応 データの分析 第2刷（日本統計学会 (編), 2020,  東京図書株式会社）
■３ 改訂版 日本統計学会公式認定 統計検定2級対応 統計学基礎 第9刷（日本統計学会 (編), 2019,  東京図書株式会社）
■４ [統計WEB 統計学の時間 基礎編](https://bellcurve.jp/statistics/course/)
■５ 日本統計学会公式認定 統計検定 2級 公式問題集[2011〜2013年] POD版発行（日本統計学会 (編), 2018,  実務教育出版）
■６ 日本統計学会公式認定 統計検定 2級 公式問題集[2014〜2015年] 修正（日本統計学会 (編), 2019,  実務教育出版）
■７ 日本統計学会公式認定 統計検定 2級 公式問題集[2016〜2018年] 初版 第1刷（日本統計学会 (編), 2019,  実務教育出版）

## 学習方法
■１ 学習教材1-4
・・・2021年10月上旬-11月中旬の1カ月半ほどで読み終える。
■２ 学習教材5-7
・・・2021年11月中旬から10日ほど、過去問を１周実施（※2011-2015年分は苦手な問題だけを２周実施）。

## 反省点
■１ 過去問を１周しかできなかったこと。

## 試験前にやっておいてよかったこと等
■１ 電卓の使い方の勉強。
■２ 苦手な問題（過去問）の復習。
■３ Qiita（限定共有）に2級の内容を自分でまとめたこと。
東京都オープンソース公開ガイドラインについて　About Tokyo OSS Guideline

*Please scroll down for the English Summary.

こんにちは！
このOpenChain Japan Advent Calendarを企画しているPromotion SGの遠藤です。

本日はオープンソースが企業だけではなく、よりパブリックな世界にも拡大していることや
OSSの管理だけでなく、組織がコミュニティの貢献を加速するための仕組み作りも進んでいることを示す事例を紹介させて頂きたいと思います。

2021年10月東京都から「[東京都オープンソース公開ガイドライン](https://github.com/Tokyo-Metro-Gov/tokyo-oss-guideline)」のβ版が公開になりました。
OpenChain JWGからも小保田さん、大崎さん、私の3名でβ版の編集にご協力させて頂きました。

#なぜ策定された？
本ガイドラインの作成の経緯の詳細は東京都のフェローとしてレビューに参加された
関さんの[note記事](https://note.com/hal_sk/n/n712e3781cdd0)をご参照頂ければと思いますが、
「[東京都新型コロナウイルス対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)」のOSS化がきっかけとなったということです。
このサイトへ台湾のオードリータン氏をはじめ多くの方がコントリビューションし、
またこのサイトのコードを利用して様々な自治体が対策サイトを立ち上げていったことは、
まさにオープンソースのメカニズムが体現されており、
今後もこのような活動を行うための指針としてこのガイドラインが策定されたのです。

![readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/d9afb196-0a27-a4aa-b3f2-647fb062b727.png)
出典：https://github.com/Tokyo-Metro-Gov/tokyo-oss-guideline/blob/main/README.md

#どんな内容？
本ガイドラインは、オープンソースとして公開するときの役割分担、ルールやプロセスといった事項だけではなく、
なぜOSS化を行うべきかということや、ライセンスについても包括的にまとめられており、
組織がコミュニティへの貢献を行うために必要な知識を学ぶためにも非常に有用なドキュメントとなっています。
最近はコミュニティ貢献を含めたオープンソース利活用を進めるために企業等では世界的に社内専門組織であるOSPO(Open Source Program Office)の設置が進んでおり、
OpenChain標準でもコントリビューションポリシーやプロセスの策定についての項目もあります。
オープンソースの利用と貢献は表裏一体のものであり、車の両輪のようなものです。
そのような意味でも今回の東京都の取組は非常に興味深いものです。
企業や自治体においてもこのような動きが拡大していくことが期待されます。

![guide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/19ef01e1-ddb4-bcec-9f95-2e947e102bbf.png)

出典：https://github.com/Tokyo-Metro-Gov/tokyo-oss-guideline/blob/main/pdf/東京都オープンソース公開ガイドライン.pdf

#明日は？
明日は、私が本件に協力させて頂くきっかけとなったイベントの主催者である高須さんの登場です。
高須さんは中国のオープンソースコミュニティで活躍されており、他にはない経験をお持ちの方でですので
非常に興味深い記事になると思いますので、お楽しみに！


#English Summary

Hi!
I’m Masato ENDO who is the leader of OpenChain Japan WG Promotion SG which is planning this Advent Calendar.

Today I’d like to introduce a case showing that opensource is spreading public sector also in Japan.
In October 2021, Tokyo Metropolitan government released beta version of “[TOKYO OSS Guidline](https://github.com/Tokyo-Metro-Gov/tokyo-oss-guideline) ”which is the guide for contribution by Tokyo Metropolitan government.
Some OpenChain members supported to review this document.

[Tokyo’s COVID-19 Information Website](https://stopcovid19.metro.tokyo.lg.jp/en) became  very famous OSS model case of government in Japan.  So, they discussed the guideline to accelerate contributed.
The background of release the document is explained at [Seki-san’s Note](https://note.com/hal_sk/n/n712e3781cdd0).

This document is useful for all people would like to contribute open source community.
So, please check it!
小ネタ／Flutter で share_plus を使って共有機能を実装する

以前は **[`share`](https://pub.dev/packages/share)** プラグインで実装していた（と思われる）文章・画像ファイルなどの共有機能（Twitter・Slack・Google ドライブなどへの共有）ですが、現在は **[`share_plus`](https://pub.dev/packages/share_plus)** で置き換えられているようですので、メモとして残しておきます。

# 試したバージョン

 - Flutter 2.5.3
 - share_plus 3.0.4
 - Android 10
 - iOS 14.8.1

# 準備

 - `pubspec.yaml`（関連部分）

```yaml:pubspec.yaml
  share_plus: ^3.0.4
```

---

**2022/11/3 追記：**
バージョン 5.0.0 以降では Web 対応のアプリとして作成しない場合でも`share_plus_web`が必要なようです（同時に読み込まないとエラーに）。

 - `pubspec.yaml`（関連部分）

```yaml:pubspec.yaml
  share_plus: ^6.2.0
  share_plus_web: ^3.1.0
```

---

# コード例

**[Example](https://pub.dev/packages/share_plus/example)** そのままです。

なお、実際にはこちらの個人開発＆個人利用アプリの中で使っています。

 - **[hmatsu47 / maptool](https://github.com/hmatsu47/maptool)（GitHub）**

```dart:インポート
import 'package:share_plus/share_plus.dart';
```

## 文章のみ共有する場合

```dart:文章のみ
  void _shareText(String text, String subject) async {
    await Share.share(text,
        subject: subject);
  }
```

`subject`はメールを送信する場合に標題として使われるようです（オプション）。

なお、iPad で利用する場合のみ、`sharePositionOrigin`オプションを指定して表示することができます。

```dart:文章のみ（iPad）
  void _shareText(BuildContext context, String text, String subject) async {
    final box = context.findRenderObject() as RenderBox?;
    await Share.share(text,
        subject: subject,
        sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size);
  }
```

## 画像ファイルを添付・共有する場合

画像ファイルのパスを`String`の`List`で指定します（複数添付可）。

```dart:画像ファイル付き
  void _shareImages(List<String> imagePaths, String text, String subject) async {
    await Share.shareFiles(imagePaths, text: text, subject: subject);
  }
```

こちらのケースでは`text`・`subject`ともオプションです。また、iPad のみ`sharePositionOrigin`オプションを指定することができます（例示は省略）。

---

**2022/11/3 追記：**
バージョン 4.5.0 以降では`shareFiles()`が非推奨になり、代わりに`shareXFiles()`が導入されました。

最初の引数は画像ファイルのパス（`String`）ではなく`XFile`の`List`で指定する形に変わりました。

```dart:画像ファイル付き
  void _shareImages(List<XFile> files, String text, String subject) async {
    await Share.shareFiles(files, text: text, subject: subject);
  }
```

---

# 画面表示例

## Android の場合

こんな感じで共有先の選択画面が表示されます。

![Screenshot (2021_11_28 22_30_36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/cf35038c-cfb4-9317-ebd3-ec03b2ab7339.png)

## iOS の場合

見た目は異なりますが、共有先の選択画面が表示されます。

![IMG_0367.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/dc3ea3d9-c0bf-71d8-33d3-951ea8418c2d.png)

Twitter を選択するとこのようになります。

![IMG_0368.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/4a1091ef-ba27-2f19-2372-51b64419e104.png)

# 注意点

**[Readme](https://pub.dev/packages/share_plus#mobile-platforms-android-and-ios)** に記載がありますが、モバイル（Android・iOS）では Facebook への共有ができないようです。
ゲストハウス支配人からエンジニアになってみて

####はじめに
ゲストハウススタッフからエンジニアになってみて、というテーマでお話しさせていただきます。

####前職について
エンジニア転職する前は、都内のゲストハウスの支配人として勤務をしておりました。
ゲストハウスとはドミトリーと呼ばれる相部屋の部屋がメインの宿泊施設です。
宿泊代がホテルに比べると安く、また1階がカフェ・バーになっており初めてのお客様同士でも話しやすい雰囲気のため、世界中から来る宿泊客で賑わっていました。...コロナ前までは（苦笑）。

####エンジニアになろうと思ったきっかけ
元々私は文系の大学出身でしたし、エンジニアになるなんて微塵も考えたことはありませんでした。
しかしゲストハウスの運営をしていると、パソコンひとつ持って世界中を旅しながら仕事をしている人に出会うことも多く、彼らの話を聞いていると大抵エンジニアだったりデザイナーとして働いているとのことでした。ただそれでも羨ましいと思いつつも自分には出来ないことだと思っていました。

少し話は飛びますが、長年勤めているとトラブルや施設の故障などに度々出くわします。
私の勤めていたゲストハウスは大手でもなく当然修繕資金等も潤沢にあるわけではないので、今あるものでなんとか解決するということが必要な場面が多く、だんだんと大抵のことはちょっと調べればある程度は出来るという自信がついてきていました。

そんな日常の中である時宿泊客と雑談していたのですが、ゲストハウスの宿泊管理システムが使いづらいという愚痴を溢していると、たまたまそのお客様がエンジニアで「そんなの自分で作っちゃえばいいじゃん。」という風に軽く言われました。
その言葉が自分にとって衝撃的でしたが、そういえば最近大抵のことはある程度出来るよな〜と感じていたことからすごく納得し、いっちょエンジニアになって世界中を旅しながら仕事してやろう、と思ったのがエンジニアになろうとしたきっかけでした。

####エンジニアとして働いてみた感想（前職と比べてどう変わったか）
現在はRailsエンジニアとして、とある会社様の販売管理システムを作っています。
やはり大きく変わったこととしては、フルリモートで出社する必要がないところです。
前職では一日中動き回っていましたが、現在は良くも悪くもほぼパソコンの前から動くことはありません。
そのため身体は楽ではありますが、劣っていくのが手に取るようにわかるので適度な運動は必須ですね。
また以前は勤務時間が不規則で家族との時間を取りにくかったりしたのですが、家の事も気にしながら仕事が出来るのはかなり有難いです。

その他にもこれまでは自主的に勉強をすることが少なかったのですが、エンジニア転職を目指してからは勉強が習慣化したこともあり、さらにいろいろなことに興味が湧いて、プログラミング以外も少しずつ勉強を始めて自分の幅を広げることが出来ていると思います。

####今後はどんなエンジニアを目指したいか
社内の開発部員が少ないこともあり、要件定義から開発、保守まで少しずつ触れさせてもらっているのですが、やはりただプログラムが書けるだけでは将来的には全然意味がないという風に感じています。
「お客様の課題を解決するにはこういうものが必要で、それを利用してこうしていきましょう！」みたいな感じで物事を大きく捉え、プログラミングはあくまで手段として使ってお客様の課題解決に導く、しかも予算ややりたいことによって何パターンか提案出来たりする上司を見てめちゃくちゃかっこいいなと思ったので、そうなれることを目標に頑張ります。
とはいえまだまだこんなに簡単そうな事も出来ないなんて....と日々壁にぶつかっているので、毎日少しずつ乗り越えていきたいと思います。
WP Offload Media Lite for Amazon S3でS３に画像が保存されない場合に確認するべきポイント

# はじめに
WP Offload Media Lite for Amazon S3を使用した際にはまったポイントをまとめました。
一番のポイントは１で、私はここでハマってまいました。
画像付きで記事を作成しましたので、イメージしやすくなればと思います。


:::note info
■WP Offload Media Liteとは
WordPressの記事作成で画像などをアップロードした際にサーバ上ではなくS3上にファイルをアップロードするWordPressのプラグイン
:::
# 確認ポイントと解消方法
## 1.必要なPHP関連パッケージがインストールされているか？

そもそもPHPが入っていないとWP Offload Media Liteは動作しないのですが、加えてphp-gd（画像を生成するためのPHPライブラリ）が入っていいないと正常に動作しませんでした。
最終的に以下の状態で私は正常に動作しました。

【正常動作時のphp関連パッケージ】
`yum list installed | grep php`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/422bc3e2-3773-2791-a79b-265e37488510.png)

【php関連パッケージのインストールのコマンドと途中経過】
■初期状態
`yum list installed | grep php`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/230b5486-cf37-3081-759a-7af9fb3e88ff.png)

■php7.2のインストールとその確認
`sudo amazon-linux-extras install -y php7.2`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/c0d8205d-f0fe-a77e-5085-32bc9e8f472c.png)
`yum list installed | grep php`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/9b32b7b1-86c1-8d69-899c-8a5342992cda.png)

■php-mbstringのインストールとその確認
`sudo yum install -y php php-mbstring`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/a8ed6c50-c8f8-cf5e-370e-a2b56ff3cc89.png)
`yum list installed | grep php`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/85ccbfba-5322-8f31-d5ee-1ee277db3ef3.png)


■php-gdのインストールとその確認
`sudo yum install -y php-gd`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/f4c9c084-8bf6-1ca8-9ba6-7a0932bbdf9d.png)
`yum list installed | grep php`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/cb79b5ae-f539-6302-c4ab-0a2f4ef7c432.png)

■apachのサービスを再起動
sudo systemctl restart httpd.service

## 2.Offload Media Lite自体の設定はあっているか？
設定「Copy Files to Bucket」がONになっていないとS3にデータはコピーされません。
（When a file is uploaded to the Media Library, copy it to the bucket. ＜ファイルがメディアライブラリにアップロードされたら、バケットにコピーします。＞）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/42bfc1c2-b648-1205-1511-3c740146fec7.png)


## 3.S3バケットの設定で、「ブロックパブリックアクセス」がオフになっているか？

S3バケットを作成時にapachからアクセスするために以下設定で作成する必要があります。
■S3バケット作成時のブロックアクセス設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/55a8dbca-ba1a-9485-1c31-860984411553.png)



## 4.接続ユーザのアクセス件はあっているか？
IAMで接続ユーザにS3へのアクセス権を付与してある必要があります。（AmazonS3FullAccessなど）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/5a545609-7321-46b7-96ef-e6935631791d.png)

# 最後に
AWSの勉強を進めている中でググってもなかなか解決方法が見つからなかったので本記事を作成してみました。
他にもポイントがあれば追記できたらと思います。
TypeScriptで命令型と宣言型を書き比べてみる

## 概要

せっかくJavaScriptがマルチパラダイムな言語なので書き比べてみます。
ずっと命令型なスタイルで開発していたので、宣言型なスタイルは慣れないんですよね。
実行するべき関数を組み立ててくみたいな考え方の切り替えに苦戦しています。

## 命令型

```ts
class Person
{
  private name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public sameAgePersons(persons: Person[]): Person[] {
    return persons.filter((person: Person) => this.age === person.age);
  }
}

const p1 = new Person('一郎', 20);
const p2 = new Person('二郎', 19);
const p3 = new Person('三郎', 20);

console.log(p1.sameAgePersons([p2, p3]));
```

## 宣言型
```ts
type Person = { name: string, age: number };

const p1: Person = {name: '一郎', age: 20};
const p2: Person = {name: '二郎', age: 19};
const p3: Person = {name: '三郎', age: 20};

const selectorSameAge = (age: number) => (person: Person) => age === person.age;
const findPersonsBySelector = (persons: Person[], selector: (person: Person) => boolean) => persons.filter(selector);
console.log(findPersonsBySelector([p2, p3], selectorSameAge(p1.age)));
```
Python_デコレーター

# デコレーターの書き方

```py
from functools import wraps

def デコレーター名(func):
    @wraps(func) # なくても動くがある方よい
    def wrapper(*args, **kwargs): # どんな引数をとってもいいようにすると良い
        # デコレーターとしての機能を記述
        return func(*args, **kwargs) # funcの実行結果を返す
    return wrapper
```

# デコレーターの使い方

```py
@デコレーター名
def デコレーターを使用する関数():
   処理を書く


# 実行
デコレーターを使用する関数()

```

# 実行時間を計測するデコレーター例


```py
import time
from functools import wraps

def stop_watch(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"実行時間(sec)：{time.time()-start:2f}")
        return result
    return wrapper


@stop_watch
def my_sleep(sec):
    time.sleep(sec)
    print(f"{sec}秒待ちました")


my_sleep(10)
```
>10秒待ちました
実行時間(sec)：10.016692
SwiftUIから自身のUIHostringViewControllerをdismissする

iOS15から、EnvironmentValuesにdismissが追加されました。
これまでUIKitのアプリ内からSwiftUIのモーダルを表示してから閉じるにはハックが必要でしたが、これによって簡単に閉じられるようになります。

https://developer.apple.com/documentation/swiftui/environmentvalues/dismiss

```swift
struct ContentView: View {
  @Environment(\.dismiss) var dismiss
                
  var body: some View {
    Button {
      dismiss()
    } label: {
      Text("dismiss")
    }
  }
}
```

UIKitベースのアプリの中に1画面だけSwiftUIにすることがこれで簡単に行えるようになりました。
[Mac] UnityのスクリプトをVisual Studio Codeで開く

Macの手順はWindowの手順と微妙に違ったのでメモします。

## 1. [Unity] → [Preferences]

![スクリーンショット 2021-11-28 23.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/5b873cf1-e802-31ee-9305-8ae611f3beb7.png)

## 2. [External Tools] を選び、図のドロップダウンからVisual Studio Codeを選ぶ。

![スクリーンショット 2021-11-28 23.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/a538cab9-d86f-c9ba-57cb-4982ed349e1b.png)

以上です。


## 確認環境
- Unity 2019.4.31f1 Personal
- MacBook Pro (16-inch 2019)
- macOS Monterey 12.0.1

## 参考文献

UnityでVisual Studio Codeを使用できるようにするまでの手順
https://qiita.com/riekure/items/c45868f37a187f8e1d69

Unity Editor のスクリプトファイルを VSCode で開く方法
https://qiita.com/Futo_Horio/items/c7874e7afaaf12b28d6f
ティラノスクリプトのタグコード解析

## はじめに
ティラノスクリプトのコードからタグの詳細な処理を解析します。

## メッセージ
### [cm]
NextImg、全てのメッセージレイヤーの文字、フリーレイヤーをクリアする。

```
this.kag.ftag.hideNextImg();
this.kag.layer.clearMessageInnerLayerAll();
this.kag.layer.getFreeLayer().html("").hide();
```

### [er]
NextImg、カレントのメッセージレイヤーの文字をクリアする。

```
this.kag.ftag.hideNextImg();
this.kag.getMessageInnerLayer().html("");
```

### [l]
NextImgを表示し、クリック待ちする。

```
// スキップ、オートの場合はif文で次の処理に進む。
this.kag.ftag.showNextImg();
```

### [p]
クリック待ち＋改ページ。
[l][cm]との違いは不明（コードは異なる）。

```
this.kag.stat.flag_ref_page = true;
this.kag.ftag.showNextImg();
```

### [r]
改行（< br />）を追加する。

```
var j_inner_message = this.kag.getMessageInnerLayer();
var txt = j_inner_message.find("p").find(".current_span").html() + "<br />";
j_inner_message.find("p").find(".current_span").html(txt);        
```
仮想環境でDjangoを動かすンゴ

# この記事で書くこと
1. 使用するPythonバージョンを切り分ける（pyenv）
1. Pythonをインストールする
1. 仮想環境を作成する（venv）
1. Djangoをインストールする

### 使用環境
OS：macOS Big Sur ver11.0.1
使用するシェル：bash

pyenv：2.2.2
python：3.10.0
Django：3.2.9

※homebrewを使用しますが、ここでは解説しないので良い感じにアップデート推奨です。

## 1. 使用するPythonバージョンを切り分ける（pyenv）
pyenvを使って、使いたいPythonバージョンを用意します。
今使ってるpythonバージョンで問題ない場合は不要です。

### pyenvをインストールする
```bash
brew install pyenv
```
インストール後、もろもろの設定をします。
自分の場合、Mac ✖️ bashを使用しているため、以下の設定を行いました。

```bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
echo 'if [ -n "$PS1" -a -n "$BASH_VERSION" ]; then source ~/.bashrc; fi' >> ~/.bash_profile

echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```
上記の設定については詳しくはこちらに記載されています。
https://github.com/pyenv/pyenv#basic-github-checkout

設定したらbash_profileを更新します

```bash
source ~/.bash_profile
```

## 2. Pythonをインストールする
pyenvで使用できるpythonバージョン一覧を確認します

```bash
pyenv install -l
```

バージョンを指定しインストールを行います。

```bash
pyenv install 3.10.0
```

終わったら、インストールされたpythonバージョン一覧を確認します

```bash
pyenv versions
```
使用したいpythonバージョンを設定します（ローカル設定もできるけどここではグローバル設定で）

```bash
pyenv global 3.10.0
```

python --verison で指定バージョンに切り替わっていればOKです。
切り替わらない場合はpyenvインストール後の設定が何かおかしいかもしれません。
（※最近のMacOSだとデフォルトのシェルがbashからzshになってたり。）

## 3. 仮想環境を作成する（venv）
任意の場所に仮想環境を作ります。
「env1」の部分は今回作る仮装環境の名前です。

```bash
python -m venv <任意の場所>/env1
```

作成した仮想環境を有効化します。

```bash
source <任意の場所>/env1/bin/activate
```
※ユーザ名の前に(env1) がついたら仮想環境が有効になった状態です。

## 4. Djangoをインストールする
Djangoをインストールします

```bash
pip install pip install Django==3.2.9
```

インストールされたかを確認します

```bash
python

>>> import django
>>> print(django.get_version())
```
インストールしたDjangoのバージョンが表示されていればOKです。
【jbuilder】部分テンプレートのオプション

##環境
Ruby 3.0.2
Rails 6.1.4.1

##部分テンプレート

部分テンプレート内で呼び出し方を```as```で指定
2つとも同じように取れる

```app/views/users/index.json.jbuilder 
json.partial! 'users/user', collection: @users, as: :user

#or

json.array! @users, partial: 'users/user', as: :user
```


```app/views/users/_user.json.jbuilder 
json.extract! user, :id, :name, :age
```

##参考

https://github.com/rails/jbuilder
Cypress 認証情報を保持して自動化へ Cognito編〜

# はじめに
現在、SESとして自社開発に携わっているエンジニア一年生です。e2eテストを初めて作成するにあたって、ユーザー認証（今回は、AWS`Cognito`）を考慮することに少し手こずったので備忘録としての記事です。また、もし同じ内容につまづいた方へ参考程度になればいいなと思っております。

## AWS-amplifyの利用

今回はAWSの`Cognito`を使用したユーザー認証を行なっているので、アクセスするために以下の`aws-amplify`を使用して認証情報を取得します。

```
npm install --save aws-amplify
```

## Cognitoを利用した認証自動化

Cypressでオリジナルのメソッドを生成するにあたって、`Cypress.Commands.add()`で新しく作成することができるので今回は使用時に、`login(username,password)`となるように作成していく。

AWSの`Cognito`を使用しているので、リージョンやプールIDなどを設定する。
そして、`aws-amplify`内の`signIn()`を使用して認証情報を取得する。

```typescript:/support/commnads.ts
import Amplify, { Auth } from 'aws-amplify';

Amplify.configure({
  Auth: {
    mandatorySignIn: true,
    region: **********,
    userPoolId: **********,
    identityPoolId: **********,
    userPoolWebClientId: **********,
  },
});

Cypress.Commands.add('login', (username, password) => {
  return Auth.signIn(username, password)
    .then((user) => {
      console.log('===> user', user);
      const session = Auth.currentSession();
      console.log('===> session', session);
    })
    .catch((err) => console.log('===> err', err));
});

```

そして、カスタムメソッドの型定義を入力していく。

```typescript:/support/index.d.ts
/// <reference types="cypress" />

declare namespace Cypress {
  interface Chainable<Subject> {
    login(username: string, password: string): Chainable<any>;
  }
}

```

Cognito内で保存してあるユーザー情報を指定することで認証情報を取得することで、ログイン状態を保持してテストを走らせることができる。

```typescript:/integration/ぱす
import '../support/commnads';

  it('cognito settion on', () => {
    cy.login(ユーザーID, パスワード);
    cy.visit('/');
  });

```

## ちなみに今回のCypressについて

簡単にまとめている記事があったので以下を参考にしました。
[https://blog.microcms.io/cypress-react-e2e/](https://blog.microcms.io/cypress-react-e2e/)

## 参考記事
https://stackoverflow.com/questions/62179859/cypress-aws-cognito-intergrations

## 感想・まとめ
初現場で０⇨１でE2Eテストをしていく中でユーザー情報を保持するサイトが多い中こういった工夫が必要だと思いました。また、CSSフレームワークを使用しているとテストしたいタグを指定するのにデベロッパーツールで確認するとマテリアルコンポーネントだと、指定場所が変わってくるので確認に手間がかかりました。
AWS Certified Data Analytics - Specialty 合格記

# 背景

MLS（Machine Learning Specialty）を取得して、Data Analyticsもセットだよな、と思って勉強を始めました。
ただ、勉強してからはちょっと勘違いしていた事に気づきました。関係する部分はもちろんあれど、このData Analitycs Specialtyは連続したデータ処理、大量のデータを扱う機能の資格だと思い直しました。

# 受験前スペック

CLF、SAA、DVA、SOA、SAP、MLSは取得済み。
業務でAWSを使っているけど、すべてのサービスを使った事がある訳ではないです。特に今回は使った事のあるサービスが少なく、かつ値段の面で個人AWSアカウントでは試すのがためらわれる内容です。

# 使用した教材

## AWS公式

### [サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-analytics-specialty/AWS-Certified-Data-Analytics-Specialty_Sample-Questions.pdf)

実際の試験問題の傾向を知れる貴重な情報なので見逃す事なくやっておいた方が良いです。

### [模擬試験](https://explore.skillbuilder.aws/learn/)

今までは2000円や他の試験に合格した時の無料クーポンで受験出来た模擬試験が無料になりました。
ログイン後、「AWS Certification Official Practice Question Sets」で検索すると出てくると思います。
また別の学習サイト（AWS BenchPrep）に移動しての受験になって面倒ですが、前述サンプル問題と共に実際の試験問題の傾向が知れる貴重な情報です。先の模擬試験は各問題の正誤や解説は無いですが、こちらは各選択肢毎に正誤の理由の解説も見れるので、試験のポイントを知る上でも重要です。

## Udemy

日本語の教材が見つからなかったので英語コースを受講しました。

### 講座：[AWS Certified Data Analytics Specialty 2021 - Hands On!](https://www.udemy.com/course/aws-data-analytics/)

一通りの知識を仕入れる事が出来ます。各セクションでは小テストがあり、最後に65問の模擬試験も用意されています。模擬試験一回分も含まれてると思うとお得な講座だと思います。標準価格はお高めなので、いつものセールの時に購入しましょう。

### 模擬試験：[AWS Certified Data Analytics Specialty Practice Exams ](https://www.udemy.com/course/aws-certified-data-analytics-specialty-practice-exams-amazon/)

模擬試験です。65問のフルセット試験が１つ、数問の分野毎試験が５つ程。もちろん全部こなせるようにしましょう。
こちらを購入すると、製作元の[TUTORIAL Dojo](https://portal.tutorialsdojo.com/courses/aws-certified-database-specialty-practice-exams/)の講座の期間限定クーポンももらえます。Udemyページに届いているメッセージは見逃さず確認しましょう。ちなみにこの製作元ページの模擬試験はほぼUdemyの問題とかぶっていました。ただ、かぶってない問題も少し出ていた気がします。見直す意味でも製作元の模擬試験も受けておいた方が良いと思います。

# 受けてみて

前述教材では出てこない（と思った）サービスも出題されていたと思います。とはいえ、自分が合格できた事からも解りますが、前述教材をちゃんと勉強していれば合格に必要な点数は取れると思います。模擬試験は90%以上の正解率が取れるようになるまでちゃんと復習した方がいいと思います。問題の文章と答えを覚えても、本番ではそのままでは出てこないと思って良いので模擬試験の問題ではなく、その問題のポイントを覚えるようにしましょう。

# 最後に

あまり特別なポイントはなく、王道の勉強方法で受験して合格したという感じです。

今年の目標は達成する事が出来ました。今年はこれぐらいで終わりにする予定でしたが、AWSのDevDayを視聴する事で、DevOps Engineer Professional受験半額バウチャーをゲットしてしまい、その受験期限が今年中なので、もったいないので受験する事にしました。また合格報告出来る事を目指しています。
GoogleCloudMonitoringのAlartingとPagerDutyの連携(PagerDuty Services)

GCPのCloudMonitoringとPagerDutyの連携方法について紹介します。PagerDutyとの連携方法としてCloudMonitoring では `PagerDuty Services` と `PagerDuty Sync` の二種類がありますが本記事ではPagerDuty Servicesについて紹介します。CloudMonitoringとPagerDutyで同じKeyなのに名前が違うという問題があったため参考になればと思います。

# 連携手順
- PagerDutyのService Keyを生成
- CloudMontoringのalertingの設定にて `PagerDuty Services` にトークンを設定
- Alartingの通知チャネルに作成したPagerDuty宛のチャネルを紐付け

## PagerDutyのService Keyを生成
まず最初に、PagerDutyの連携したいServiceのIntegrationから `Event API v2` を追加します。

![Add_Integrations_-_PagerDuty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/2867cd15-2f0c-23ce-995e-ae87e22af4b7.png)

追加できたら、追加した `Event API v2` の詳細を確認し、Integration Keyをコピーしておきます。これがCloudMonitoringで指定するService Keyいなります。

![zozo-ma-alert_-_PagerDuty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/5fcc4065-b9e4-a0f6-494a-da0af9312c3f.png)



## CloudMontoringのAlertingの設定にて `PagerDuty Services` にトークンを設定
次にGCPにて、 `CloudMonitoring` > `Alaring` > `EDIT NOTIFICATOIN CHANNEL` から `PagerDuty Services` の `Add` を選択します。

![Notification_channels_–_Monitoring_–_lfm-production_–_Google_Cloud_Platform-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/02f2e2c4-434c-cb5a-8828-0e7756b62581.png)

そして、 `Service Key` に先程作成したPagerDutyの `Integration Key` を設定すれば連携は完了です。

![Notification_channels_–_Monitoring_–_lfm-production_–_Google_Cloud_Platform-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/45fa9e99-9a41-2acc-50c5-47d0b6f901c9.png)

保存前に、 `TEST CONNECTION` で通知のテストを行うことができます。

## Alartingの通知チャネルに作成したPagerDuty宛のチャネルを紐付け
あとは、Alartingの設定にて、通知先に作成したPagerDutyのチャネルを設定したらアラート発生時にPagerDutyに通知されます。

![Edit_alerting_policy_–_Monitoring_–_lfm-production_–_Google_Cloud_Platform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/9580b859-76d6-8095-4c55-fde7608341f0.png)

# 連携の注意点
`PagerDuty Services` を利用して連携を行った場合、CloudMonitoring側でアラートがresolveされると勝手にPagerDuty側のページャもクローズされてしまいます。このため、例えば一時的なエラーが発生していて、エラーが発生しなくなりアラートがresolveされたが実はそのタイミングで根本対応しなければ行けなかったみたいな場合に困ってしまいます。

その場合は、以下の `` のチェックを外すと、CloudMonitoring側でのresolve時にPagerDutyに通知されなくなります。また、このときSlack等別のチャネルとも連携している場合にはそちらにも通知されなくなるため注意が必要です。

![Edit_alerting_policy_–_Monitoring_–_lfm-production_–_Google_Cloud_Platform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/4905c161-dacc-461b-1f25-52c5c8eacb45.png)

# まとめ
本記事ではGCPのCloudMonitoringとPagerDutyの連携方法のうち `PagerDuty Services` を利用する方法を紹介しました。 `PagerDuty Sync` というものもあるため、使い心地の違いなど知見が有りましたら教えて下さい。
絶縁DCDCコンバータのノイズ対策

# 概要

ソフトウェアが正しく動くためには健全なハードウェアが必要である。
時に、電源ノイズにより誤作動を引き起こすこともあるため、ソフトウェアデバッグの知識として必要になる場合もある。

ここでは、有名は絶縁DCDCコンバータ [MINMAX MAU103](https://akizukidenshi.com/catalog/g/gM-12176/) でのノイズ対策対処の実測を載せてみる。


出展元:

https://recom-power.com/ja/rec-n-very-low-noise-filter-for-isolated-dc!sdc-converters-46.html?0


# 計測条件

- ノイズを計測用の基板を作成し実施。
- 負荷は 100Ω抵抗 (9v 出力のため、90mAの負荷になる)
- 出力部からBNCケーブルを引き出し、直接オシロスコープへ入力 (x1 動作)

- 治具の様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/2dbe65fb-b9fa-c347-8474-bd581001d67b.png)

- 回路図

※回路図は全パーツを載せた状態で書いています。実験では、インダクタ(L1)やコモンモードフィルタ(FL1, FL2)は0Ω抵抗でバイパス、他パーツは未実装の状態からパーツを追加実装していき特性変化を計測します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/ff174e27-0d55-6dc1-e39e-87e94d6a6361.png)


## 使用するパーツ

- 絶縁DCDC コンバータ MINMAX MAU103
    - https://akizukidenshi.com/catalog/g/gM-12176/

- 100uF 電解コンデンサ
    - https://akizukidenshi.com/catalog/g/gP-06855/

- 10uF 積層セラミックコンデンサ
    - https://akizukidenshi.com/catalog/g/gP-16113/ 

- コモンモードノイズフィルタ
    - https://akizukidenshi.com/catalog/g/gP-15303/

## 問題波形の拡大図

約120MHz となっている模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/5eefc6ec-4956-f581-ab01-57e5224e5e81.png)

# 対策結果

## (1) 何もなし(負荷のみ接続) : 238.00 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/15ba32b2-1fae-3850-f20f-9b52376e0a26.png)

## (2) 100uF のみ : 82.40 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/e1d2172b-5afc-8219-08db-ce05a24a4f1e.png)

## (3-a) 100uF + 10uF x4 : 87.20 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/56217d56-9afb-dd1e-caea-554b04c464a1.png)

## (3-b) 100uF + C3に1000pF : 15.20 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/1471b728-17cd-a025-25a0-cb17d085fe3f.png)

C3~C6 それぞれの位置での効果は以下の通り。
MAU103ではC3の位置がベストという結果に。

|実装位置|スパイクノイズ|
|:--|--:|
|C3|17.80 mV|
|C4|32.60 mV|
|C5|21.40 mV|
|C6|24.20 mV|

## (3-c) 100uF + コモンモードフィルタ : 10.80 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/4955eaab-8a83-6867-817e-78ea916218d2.png)

## (4-ab) 100uF + 10uF x4 + C3に1000pF : 8.72 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/765ebfd7-c209-2fa6-7fdd-831e3952275e.png)

## (4-ac) 100uF + 10uF x4 + コモンモードフィルタ : 10.40 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/9b1c14e6-2b24-6ec9-dc9d-b438530fbc7f.png)

## (4-bc) 100uF + C3に1000pF + コモンモードフィルタ : 5.24 mV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/dbaa67d2-d179-336d-45a1-b1b8cf84f072.png)

## (5) 100uF + 10uF x4 + C3に1000pF + コモンモードフィルタ : 観測限界以下

※中央のスパイクは環境ノイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/a864f302-ce58-90df-0e21-feddc24e1c6f.png)



# まとめ

- スペースが許すなら、コモンモードフィルタは入れて設計するべき。スペースがない場合は、C3 を最優先に入力/出力側にMLCC を入れる。当然、今回のヤツを全部入れられるなら入れると良い。
- コモンモードフィルタは、かなり効いた。
- C3, C4, C5, C6 は、C3 での効果が大きかった。最適な箇所は、使用する絶縁DCDCコンバータにより変わるらしい。
- L1のフェライトビーズを入れてみたが、今回の周波数では優位に作用しなかった。
Amazonの検索結果を「Amazonが販売・発送する商品」のみに絞り込むブックマークレット

Amazonのブラックフライデーセールで話題になっていたこのツイート。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Amazonのブラックフライデーセールが始まりましたが、Amazonでお買い物する時に損しないためにこれだけは絶対やって欲しい3つのことをまとめました <a href="https://t.co/pplejPIt06">pic.twitter.com/pplejPIt06</a></p>&mdash; じゅじゅ (@jujulife7) <a href="https://twitter.com/jujulife7/status/1464066261252337669?ref_src=twsrc%5Etfw">November 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この3つ目のパラメータ追加検索がすごく便利だったので、簡単ですがブックマークレットにしました。
それがこちら。

```
javascript:(function(){window.location.href=document.URL+"&emi=AN1VRQENFRJN5";})();
```

ブックマークレットの登録方法についてはここでは記載しません。検索すればすぐ出てきます。

このブックマークレットの機能はすごく単純で、開いているページのURL末尾にパラメータを追加して開き直すだけです。
そのため、使用時には検索結果ページでは商品の絞り込みが行われ、それ以外のページではただの再読み込みになります。
また、検索結果ページでも使用後のURLには残らず、hiddenパラメータとして機能するようなので、使用後のURLにパラメータが残っていなくても心配いりません。

毎回URLにコピペするよりは楽だと思うので、よければ使ってみてください。


追記
Amazon以外のサイトで間違って押してしまうとどうなるかわからないので、URLにamazonを含むページのみで動作するようにしました。

```
javascript:(function(){var u=document.URL;if(u.match(/amazon/)){window.location.href=document.URL+"&emi=AN1VRQENFRJN5";}})();
```
【Rails】IN句の書き方

IN句の書き方いろいろ


```ruby
User.where(id: [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN ('1', '3', '6')
```

```ruby
ids = [1, 3, 6]
User.where('id IN (?)', ids)
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
```

```ruby
User.where('id IN (?)', [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
```

```ruby
User.where('id IN (1, 3, 6)')
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
```
Android Studio Gradleのセッティング

Could not install gradle distribution from XXXが表示された場合の対処法をマイ忘備録として記載します。

こちらも参考
https://note.com/yvonne8823/n/n80214762a8d4

file>close projectでいったん編集中のプロジェクトを閉じる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312214/a37e3f35-585b-a756-d9f1-77be1572a4ab.png)


カスタマイズから、All settings...を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312214/8e029eef-48f2-8a17-b947-a7e3c7afa362.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312214/c3836dfe-38a0-b35b-afc9-5c5d4948dc6e.png)
WSL2(Ubuntu)にWindows側の.sshフォルダへのシンボリックリンクを作成する

# 概要

タイトルの通り、WSL2上で動作しているUbuntuにWindows側の%USERPROFILE%\\.sshフォルダへのシンボリックリンクを作成する方法について記載する。

# 環境

- Windows 11 Pro (OSビルド: 22000.348)
- Ubuntu 20.04.3 LTS

# 前提

- 既にWindows側の%USERPROFILE%\\.sshが存在すること。
- WSL2導入済みなこと。(WSL1では未確認のため)

# 結論

**行頭の[Ubuntu] or [Windows]はコマンドを実行する環境。**

1. [Ubuntu] `/etc/wsl.conf`を以下の内容で作成する。既に存在する場合は追記する。

    ```
    [automount]
    options = "metadata"
    ```

1. [Windows] WSLを再起動する

    ```PowerShell
    wsl --shutdown
    ```


1. [Ubuntu] シンボリックリンクを作成する

    ```bash
    # [USERNAME]は環境に合わせて書き換えてください
    ln -s /mnt/c/Users/[USERNAME]/.ssh ~/.ssh
    ```

1. [Ubuntu] .sshフォルダのパーミッションを変更する

    ```bash
    # [USERNAME]は環境に合わせて書き換えてください
    chmod 0700 /mnt/c/Users/[USERNAME]/.ssh
    chmod 0600 /mnt/c/Users/[USERNAME]/.ssh/*
    ```

1. 終わり

## 注意点

上記の1と2の作業をし忘れると、パーミッションを変更できず、**秘密鍵を利用する際に怒られる**ので注意。

# 何故シンボリックリンクを作成するのか

Windows上で管理している秘密鍵を使って、WSL2のUbuntuからGitHubへssh接続したいため。
以前はWindowsからUbuntuにコピーして運用していたが、`config`ファイルの変更をUbuntu側に反映させ忘れたりとオペレーションミス的なことが頻発していてストレスだった。
ならシンボリックリンク作ればいいじゃん!!という至極当然のお話。