OmniAICreator/Qiita-1.07M huggingface dataset:
MysqlとPostgreSQLのコマンドの比較

#背景

普段の業務ではMysqlで開発することが多いですが、他社で作られたシステムの保守を引き継いだり等で、稀にPostgreSQLを使う機会があります。
その際、毎回「あれ、PostgreSQLのこのコマンド何だったっけ？」と調べる羽目になるので、忘れがちなコマンドをまとめました。


# MysqlとPostgreSQLのコマンドの比較
## データベース一覧

Mysqlの場合

```sql
show databases;
```

PostgreSQLの場合

```sql
\l
```

## テーブル一覧

Mysqlの場合

```sql
show tables;
```

PostgreSQLの場合

```sql
\dt
```

## テーブル定義

Mysqlの場合

```sql
show columns from [table_name];
```

PostgreSQLの場合

```sql
\d [table_name]
```

## インデックス一覧

Mysqlの場合

```sql
show index from [table_name];
```

PostgreSQLの場合

```sql
\d [table_name]
```

# 最後に

他にも両者で違うコマンドは多々あるのですが、比較的業務で使用頻度が高く、かつ忘れがちなコマンドに絞ってまとめました。
こういうの聞かれたら何も見ないでさっと答えられるようになるのが理想なのですが、なかなか難しいものです。
仮想通貨の税率は実質20%? 仮想通貨節税戦略

### 初めに
初めまして、yoshisoと申します。平素より仮想通貨botterとして、mmbotterの皆様には流動性を提供していただき大変お世話になっております。普段はあまり情報を発信することは少ないのですが、せっかくの機会なので個人的に没とした戦略のお焚き上げをできればと思って枠をいただきました。タイトルは盛ってますが、まぁ理論上はというやつです。

### 概要 - 税率アービトラージ戦略 -
この戦略は税率アービトラージ戦略と呼んでいます。端的に話すと、仮想通貨の実現利益をFXの実現利益として建て替えることで税率を20%に下げることで、税率差の35%を収益源とする戦略です。価格時系列がランダムウォークする(願望)ことを利用し、仮想通貨とFXの両建てポジション間で損益を建て替えることによって実現します。

メリット

- **価格変動リスクをほぼとることなく35%のスプレッドを狙いに行ける**
- 仮に損益の建て替えに失敗したとしても、損失が金利+取引コストに限定されること。

デメリット

- 価格がランダムウォークし、最終的に現在価格まで戻ってくることが前提の戦略であり、**現在価格まで戻ってこない場合、建て替えが不可能**なこと(損失が発生する可能性はアリ)
- 金利コスト(特に為替側), 取引コスト(手数料+スリッページ)がかかってくること
- オペレーションがとても複雑です。

注意書きですが、この戦略はある種の思考実験として検証してみた物であり、実環境での執行可能性については検討していませんし保障もしていません。あくまで参考程度にしつつ、ご自身でバックテスト、各口座での規約やコスト面でのリスクを含めて検証・検討をお願いします。

### 戦略説明

もっと効率的な執行方法はあるかと思いますが、シンプルな例を使って説明します。

1. FX口座側で任意の通貨ペアで両建てポジションを構築する
2. 仮想通貨口座側で任意のペアで両建てポジションを構築する
3. 一定以上の値動きが発生したのち、FX口座と仮想通貨口座で同額の±収益額分のポジション量に対して、仮想通貨口座側で損失の出ているポジションをClose&再OpenしFX側口座で利益の出ているポジションをClose&再Open。
4. 両ペアの価格が元の価格に近付いた段階で全ポジションをクローズ。

この一サイクルのオペレーションによって仮想通貨口座にて得た利益が、FX口座側での収益として建て替えられます。軽くバックテストを走らせてみた限り、どれくらいの値幅で建て替えるかにもよりますが~5%程度の取引コストで建て替えられたように記憶しています。２つの価格時系列が同一価格帯に戻ってくることを期待してポジションをとる戦略になるので、条件を満たすのはなかなか大変です。また、同じくランダムウォークを収益源とする戦略としてグリッドトレーディングがありますが、グリッドトレーディングとは異なり価格変動によって生じる損失がほぼ無く、リスクが限定的であるのは好ましい性質ですね。


### 最後に

以上で簡単ではありましたが、税率アービトラージ戦略の説明を終わりたいと思います。私個人に関してですが、この戦略自体は実行していませんのであしからず。リスク面もそうですが、収益性も30%程度とそこまで魅力的ではなく、資金を長時間拘束される戦略なので個人的にはRR見合わないなと見送りました。仮想通貨botterとしては節税ではなく、モデルの性能向上に時間を使いたいということも大きな理由の一つです。(まあこう理由を上げてはいますが、一番の理由は面倒くさいからです。

思考実験としてこういう戦略考えるのは楽しいですし、確かにそんなこともできそうだなーと楽しんで読んでもらえたら何よりです。では。
Windows10 → 11 で変更になったショートカット

#Windows10 から11になって変更されたショートカット
11をインストール後におや?と思ったのでメモ。
新たに発見次第、随時更新予定

##カレンダーを表示
10：Alt ＋ Win + D
11：Win + N

##単語登録画面を表示
10：Ctrl + F7
11：なくなった？

- Ctrl + F10 の後にD
- Ctrl + 変換 の後にD

面倒
ExcelでSHA256ハッシュ関数を使用する

Excelで、たまーにハッシュ関数を使用したい時がある。
デフォルトでは対応していないので独自関数を定義する必要があり、ググれば情報はヒットするのだが、少しハマったので記録しておく。

## 環境
Windows10
Office365 執筆時点バージョン(バージョン 2109 ビルド 16.0.14430.20314) 64 ビット


## 手順
#### 1. マクロ有効ブック(*.xlsm)としてExcelを保存する。
#### 2. [開発]タブから[Visual Basic]を選択する。
#### 3. 表示された画面左ペインで右クリックし、[挿入]->[標準モジュール]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/67d3e6ca-99fb-64f6-19c4-be536708d0df.png)

#### 4. 作成されたModule1に下記コードを貼り付け。

```
Public Function GetSHA256(ハッシュ値算出範囲 As Range) As String

    Const LENGTH_OF_HASH = 32
    Const LENGTH_OF_HASH_AS_STRING = 64
    Set objUTF8 = CreateObject("System.Text.UTF8Encoding")
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")

    Dim str As String

    'Rangeの文字列結合（ワークシート関数のConcatを流用）
    str = Application.WorksheetFunction.Concat(ハッシュ値算出範囲)

    'バイト読み込み
    Dim code() As Byte
    code = objUTF8.GetBytes_4(str)

    'ハッシュ値計算
    Dim hashValue() As Byte
    hashValue = objSHA256.ComputeHash_2(code)

    '16進数へ変換
    Dim description As String * LENGTH_OF_HASH_AS_STRING
    Dim i&
    For i = 0 To LENGTH_OF_HASH - 1
        Mid(description, i * 2 + 1) = Right("0" & Hex(hashValue(i)), 2)
    Next i

    'return
    GetSHA256 = LCase(description)
    
End Function
```

コードは下記リンクで紹介されていたものをほぼそのまま利用させて頂く。

https://arm-lab.blogspot.com/2021/04/sha256.html

これで、`GetSHA256`関数が仕様出来るようになるはずだが関数が動かない。
ここで少しハマった。

#### 5. .Net Framework 3.5の有効化
.Net Framework 3.5が有効でないと`System.Security.Cryptography.SHA256Managed`が効かないらしい。
自分の環境ではデフォルト無効状態だったので、有効化してやる。

「コントロールパネル>プログラム>Windowsの機能の有効化または無効化」と進み、チェック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/49d28da0-7b6a-c808-27e3-bfaeb6c3ae66.png)



#### 6. 動くようになった。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/3a2c3290-4c69-7b6f-2903-11bb267c6d68.png)
【Golang】JSON を Unmarshal すると struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get 【bad syntax】

> Go 言語（以下 `golang`）で JSON データを Unmarshal（Go オブジェクトに<ruby>パース<rt>構文解析して変換</rt></ruby>）する際に、JSON オブジェクトのキー名に日本語が使えないか試したら `bad syntax` エラーが出る。
>
> ```bash:エラー内容
> struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
> struct field tag `json:foo` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
> ```

[「`"golang" json unmarshal struct field tag  not compatible with reflect.StructTag.Get`」でググって](https://www.google.com/search?q=%22golang%22+json+unmarshal+struct+field+tag++not+compatible+with+reflect.StructTag.Get)も、日本語の情報がなかったので、自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. **結論：** <font color=darkorange>キー名にマルチバイト文字を使ってもパース（`Unmarshal`）できます</font>。しかし、記述の構文が間違っているため、エラーが出ているだけでした。とほほ ... orz
1. **原因：**「構造体（`struct`）定義の際に `json` の<font color="darkorange">タグ付けの構文が間違っています</font>」
   - エラーの内容:
       - `bad syntax for struct tag value`
           - 訳：「構造体定義時のタグに構文エラーが発生しています」
       - ``struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get``
           - 訳：「構造体の定義でフィールドの `` `json: "ほげ"` `` タグは `reflect.StructTag.Get` と互換がありません」

    ```diff
    type Sample struct {
    -    Hoge string   `json: "ほげ"`
    -    Hoge string   `json:foo`
    -    Hoge string   `json:"ほげ",omitempty`
    +    Hoge string   `json:"ほげ"`
    +    Hoge string   `json:"foo"`
    +    Hoge string   `json:"ほげ,omitempty"`
    }
    ```
    <br>
1. 対策：**<font color="darkorange">`json:` の後にスペースは入れないでください</font>**。`omitempty` も付ける場合はダブルクォーテーション `""` の中に入れます。

- 検証バージョン: Go v1.16、v1.22

## TS; DR

```json:data/sample.json
{
    "ほげ": {
        "ぴよ1": "foo",
        "ぴよ2": [
            "bar",
            "buzz"
        ]
    },
    "ふが": {
        "ぴよ1": "FOO",
        "ぴよ2": [
            "BAR",
            "BUZZ"
        ]
    }
}
```
```go:main.go（Go1.16）
package main

import (
	_ "embed"
	"encoding/json"
	"fmt"
	"log"
)

// JSON データをバイナリに埋め込む
//go:embed data/sample.json
var myEmbeddedJSON []byte

// JSON データの構造体定義

type Samples map[string]Sample

type Sample struct {
	Piyo1 string   `json:"ぴよ1"`
	Piyo2 []string `json:"ぴよ2"`
}

func main() {
	var myData Samples

	if err := json.Unmarshal(myEmbeddedJSON, &myData); err != nil {
		log.Fatal(err)
	}

	key := "ほげ"

	if _, ok := myData[key]; !ok {
		log.Fatalf("%v キーはデータに存在しません", key)
	}

	fmt.Printf("ぴよ1 -> %#v\n", myData[key].Piyo1)
	fmt.Printf("ぴよ2 -> %#v\n", myData[key].Piyo2)
}

// Output:
// ぴよ1 -> "foo"
// ぴよ2 -> []string{"bar", "buzz"}
```

- [オンラインで動作をみる](https://go.dev/play/p/S2x4_0Jm0pI) @ Go Playground

### Golangのスポンサー情報（参考文献）

- [为什么Go json.Marshal拒绝这些struct标签？ json标签的正确语法是什么？](https://mlog.club/article/297746) @ mlog.clud
Power BI で 行レベルセキュリティ（RLS）を実装してみる

# RLS?

R = Row
L = Level
S = Security

データテーブルの中でログインユーザーに応じて見せるデータ（行）を絞り込むことができる。

# 例えば

* 営業担当者本人の売上だけ閲覧できるようにする
* 担当部署の売上だけ確認できるレポート

こういったレポートを作成するときに、RLSを使用しないで実現させようとすると、担当者の数（部署の数）だけワークスペースを切り分ける必要がでてくるが、RLSを使用すればレポート側でユーザー情報に応じてビジュアライズするデータを絞り込んでくれる。

# Let's Try

こんなデータを用意します。
RLS設定前なので全件のデータが見えてしまっています。
担当者がこのレポートを開いたときに、自分の受注実績だけを見せるようにしたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/b9782cfa-8a83-9b1c-ba35-ae00251a58d5.png)

## モデリングタブ→セキュリティ→ロールの管理

ロールの管理をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/3a3971e4-9d7b-96bc-aca6-f4e83868dfd2.png)

## username() または userprincipalname() 

ここで特殊？なDAX関数を使用します。

* username() は DOMAIN\User の形式でユーザーを返す
* userprincipalname() は user@contoso.com の形式でユーザーを返す

今回はメールアドレスを利用して絞り込みたいので、`userprincipalname()` を使用します。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d324daa5-762b-a609-278f-de876d102636.png)

これでほぼ終わりです。簡単ですね！

## 設定がきちんとできているか確認

今度は `表示方法` クリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e4d9f6eb-446e-e9da-17df-5287f44ea2f6.png)

## その他のユーザー

その他のユーザーにチェックをいれ、なりすましたいユーザーのメールアドレスを入力します。
先程作成したRLSの設定にもチェックをいれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/bc821005-e545-ef90-d4a2-7a6c803b2cdd.png)

## できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ca077444-73ee-96b4-0ea3-f16c2509fecb.png)

# Power BI Service にも発行→動作をチェック

Power BI Service へ発行したら、データセットの３点リーダー内の「セキュリティ」をクリック。

RLSの設定及び適用の確認をする画面にいきます。
ここでテストしたい人のメールアドレスを登録しておきます。

そして今度は設定した項目（今回でいうとMailで絞り込み）の横の３点リーダーをクリック。
ロールとしてテストを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9b82f309-4003-9a88-8164-365d85e839c6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8d981618-6f24-e057-a68d-ad6d6d8b934f.png)

## できていますね。

※Power BI Service 上でテストする際には、組織内で有効なメールアドレスでしかチェックできませんでした。ですので、事前にPBDでモデルを作成するときに自分のアドレスを含むように変更しています。
この例だと「小川さよ子」さんに自分のメールアドレスを割り振っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d21acd53-2fee-4127-aaf7-4886218ad1c7.png)

# 応用すると

メールアドレスをkeyとして、ユーザー情報で絞り込みが可能なので、役職のテーブルがあれば、
マネージャー以上ではないと閲覧できないレポートを作成したりすることもできますね。

# 詳しくはドキュメントを。

https://docs.microsoft.com/ja-jp/power-bi/admin/service-admin-rls
💪まいにちN予備写経体操💪 〜前腕反射筋は裏切らない〜

みなさんおはこんばんちわ。”にょろぼん”でございます。
授業_予習復習スレッドに、毎回少しづつ投稿させて頂いています。
(いつも読んでくださっている皆さん->ありがとうございます🙇‍♂️。読んだ事がない方->一度見に来て頂けると嬉しいですhttps://progedu.slack.com/archives/C02851N8SCB　)
アドベントカレンダーの賑やかしに、N予備プログラミングコースを完走してみて思いついた仮説を以下に述べます。

【①仮　説】　一周やりきると確実にITエンジニアになれます(断言！)

【②方法論】　１章から４章までやり通す為にする事(ゴール設定と判定の明確化）

【③例　証】　N予備前”にょ”比で完走後”にょ”の技術レベルが格段に向上しました:rocket:！

①は仮説ですがほぼ間違いないと思います。先生方の証言や、プログラミングスクール紹介サイトによると『N予備校プログラミング入門コース教材の内容は新卒エンジニア3年分の学習量に相当』だそうです。”にょろぼん”は、写経学派（内容理解度はともかく、写経すれば何とかなるよ学派）なのですが、
写経するだけで内容を理解できなくても、"新卒エンジニア3年分の教材の写経をやり切れる人には確実にITエンジニアとしての資質が備わっている"と考えるからです。

②方法論も、色々あげたらキリがなくなるのですが、敢えて一点に絞ると以下です。
"内容が分からなくても写経して描き切る。写経したコードがテキスト通りに動作したら写経完了と判定して次節に進む。"
入門コースは週2回授業があり、必要総学習時間は約200時間です。物理的にやり切る為には、完全に理解できなくてもコード動作可否で区切りを付けて先に進む割り切りと勇気が必要だと考えます。

③これも曖昧かつ手前味噌な例証ですが、間違いなく確実に向上します。開始前と完走後の"にょろぼん"の技術レベルの差は明らかです。ドラクエでいうと、MP：0、呪文：なし　⇒　MP：100、呪文：１０個　くらい違います。
えっ？そんな説明じゃ分からない？
これは、"皆さん自身で実証して効果を確かめて頂く"しかなさそうですね。。
アイコン作成の秘密

アイコンとは、図像という意味だが、パソコンではデスクトップ上にある小さな画像で示されたマークを指す。例えばこれです：
![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/3e37a65f-2c4a-e15c-2ccb-2f42b34cd964.png)
言葉を必要とせず、メッセージを表していることがすぐにわかるような、強力で普遍的なものもあります。アイコンを正しく使えば、ユーザビリティーが向上し、記憶に残りやすく、使用するウェブページやソフトウェアのデザイン性を高めることができるという研究結果があります。

アイコンをウェブサイトやアプリに入れるため、ネットで調べたらほしいアイコンが出てくるかもしれませんが、同じスタイルや同じ色味を見つけるのは相当時間がかかるでしょう。そのため、アイコンを探すより、作る方が実は早くて楽です！

アイコンを作るために、絵をかけなくてもできます。ただ想像力とプランニングが必要です。一般的なアイコンは○△□で作られています。
![IconSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/03b7e303-30f1-c2d6-2d80-14b3470cec93.png)
![IconSample_PC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/1147a428-8b7a-8fda-b9a2-49e9db979fcb.png)
![IconSample_PC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/c3c86fb2-5c70-7473-a2e9-801ebaa210ef.png)

パソコン画面が簡単すぎるかもしれませんので、レベルをアップして、次はショッピングバッグのアイコンを作りましょう。
![IconSample_DeptStore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/23296346-35f5-6cde-a8bb-317cbb8abda9.png)
![IconSample_DeptStore-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/33ee7cc2-4dc3-16a6-63db-33a6f05cd13d.png)


パソコンもショッピングバッグも、オリジナルの□や○の形がまだ見えるので簡単ですが、ゲームコンソールだとどうでしょう？
![IconSample_Game.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/ac55cb9a-e77d-1261-e6ae-abcda4c9eb33.png)
実はショッピングバッグと一緒で、○と□だけで作られます！

![IconSample_Game-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/e336f2fd-6eb5-3801-80cc-f64e44568541.png)
![IconSample_Game-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/a516e15f-1ed8-0ac7-9976-680926eb733a.png)
![IconSample_Game-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/d750b338-00aa-bdee-0b3e-e46d797cbdb6.png)
![IconSample_Game-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/6cb41782-8de9-67c3-881e-16143a522014.png)
![IconSample_Game-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/45bcfa23-b5e2-ee1d-3794-89eff3376f12.png)

アイコン作りの中に書いてある【＋】と【-】とはこれです。
![IconMaking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/6461f358-6521-d58f-024b-2858c62e73a8.png)

ソフトウェアにより形状モードのネーミングも場所も違いますが、基本は一緒です。そして、この形状モード以外、形により編集できる項目も違います。形により特徴を活かしたら、複雑なアイコンも簡単に作れるようになります。
![IconMaking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/1443f7e5-017b-fad5-8ad4-c4db81045854.png)
![IconMaking-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373874/45919d21-3615-fe01-161d-fce34a1bb0b1.png)


アイコンを作るのは実は簡単でしょう！ソフトウェアになれてきたら、どんどんスピードも早くなります。
Power BIのUsage Mertics Reportを定期的に出力する方法

# 利用者の使用状況をきちんと把握したい

Power BIには、誰がどれくらいどのページにアクセスしているかなどの情報をチェックするためのレポートが用意されています。

## 1. Monitor usage metrics in classic workspaces
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/fc8c9c4e-8e59-647c-060b-de7477bd4b05.png)

https://docs.microsoft.com/en-us/power-bi/collaborate-share/service-usage-metrics

## 2. Monitor usage metrics in the new workspace experience
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/65d13721-229c-a955-f7e9-3d45136e615b.png)

https://docs.microsoft.com/en-us/power-bi/collaborate-share/service-modern-usage-metrics

それぞれの内容については各公式Documentから読み解けますが、
利用状況を分析するうえで一つ気になっているので、データの保持期間です。
例えばそれぞれの表示される期間は、

1.だと基本的に**90**日間。
> The classic usage metrics report has 90 days of data, and the "total count" there represents unique reports viewed over 90 days. If reports are deleted after they are viewed, they are not counted by the admin APIs but will be counted in the historical data feeding the usage report.

一方2.では**30**日間。
> The Usage Metrics Report dataset contains usage data for the last 30 days. It can take up to 24 hours for new usage data to be imported. You can't trigger a manual refresh by using the Power BI user interface.

どうしてもそれ以上に長い期間のデータを取得するにはAuditのために用意されているAzureのAPIによって取得できる。

https://docs.microsoft.com/ja-jp/power-bi/admin/service-admin-auditing

https://docs.microsoft.com/en-us/power-bi/admin/service-admin-auditing

# Solution1 : 監査ログ取得のためのAPI(Enterprise環境だと担当者では使用できないことが多い)
ベストではないにせよ監査ログのためのAPIで取得できそうなことがわかったが、自社のITチームに問い合わせるとやはりここは現場の担当者には渡せないとの回答だった。過去は振り返れないがとりあえずこれからの分はある程度記録に残せるような仕組みを入れようと思った。

# Solution2 : Usage Mertics Reportを定期的にExportして保存できるようにする
デフォルトで用意されているUsage Mertics Reportは以下のようにSubscriptionが用意されていないので、一度そのレポートをSave a Copyで作成するとSubscriptionできるようになる。

#### Subscriptionがない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/76f90003-6e8d-dd73-2359-5eec1bff40db.png)

#### Save a Copyする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/cfa3e505-6b46-ec4f-c976-b5402679f01d.png)

ここで一つ注意したいのが、Premium環境の上にCopyしないとSubscribeするときに制限かかってしまう。
というのはレポートをまるまるExportして添付するには、Premium環境にあるものでないと利用できないようなので。

#### CopyしたレポートはSubscribeがちゃんと出てくるので、あとは自分の好きなように宛先や頻度を設定してあげればOk
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/c52412d7-aa56-2fbd-91da-4ae6786b3937.png)

# まとめ
Power BIのUsage Mertics Reportを定期的に出力する方法についてまとめた。
全ログを保持するとそれだけ容量を消費してしまうので、常時Power BIのところで持っておかないっていうのはなんとなく理解できるので、どこかで簡単に過去を振り返れるとよいかなと思った。
もしもっと簡単にこれできるよというのがあれば教えてください。

UIや実際の手順は古い記事のため異なるが、考え方はこちらを参考にした。
https://www.kasperonbi.com/build-your-own-usage-report-with-power-bi/
Raspberry Pi OS 11 (Bullseye) を使うと VNC 接続時に画面の解像度が大きくならない

Raspberry Pi OS 11 (Bullseye) では Menu > Preferences > Raspberry Pi Configuration > Display > Headless Resolution からモニターを接続していない時の解像度を選択できますが例えば 1024x780 を選ぶとこんな感じになってしまいます。

![スクリーンショット 2021-12-12 182312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/cfbc16ca-d6a8-5fa7-2f0b-b684cfef58ae.png)
これは /boot/config.txt を以下の以下の dtoverlay から始まる行に ,nocomposite を追加し Raspberry Pi を再起動することで Headless Resolution の設定が有効になります。

```:変更前
# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
```

```:変更後
# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d,nocomposite
```

参照:

[Bullseye vncserver is very slow without display](https://forums.raspberrypi.com/viewtopic.php?t=323294&start=25)
[Raspberry Pi OS 11 Is Now Available: Here’s What’s New: KMS Video Driver as Standard](https://www.makeuseof.com/raspberry-pi-os-11-released/)
excelショートカット　メモ

ショートカットキーで時短仕事術(4) Excelの表示形式、罫線ショートカットを覚えよう | TECH+ https://news.mynavi.jp/techplus/article/keyboard-shortcuts-4/

なんかメモるっ
Ctrl+1　で　セルの書式設定　探していて見つけました(*^^*)
エンジニアリング・マネージャーとして大切にしている心構え

こんにちは、[Engineering Manager Advent Calender 2021](https://qiita.com/advent-calendar/2021/em)の13日目を担当する[mnmandahalf](https://twitter.com/mnmandahalf)です。
12日目の[dskstさんのブログでご紹介されていたエンジニアリングマネジメントトライアングル](https://steam.place/entry/2019/07/03/083000)では主にTechnology - Team領域のお仕事（People Development, Recruiting, People Evaluation）を中心に、Team - Product領域の業務（Team Design, Resource Management）も少々行っています。
本稿では、私がEMになってから今まで大切にしている心構えについて記載してみたいと思います。

# 自分自身が納得感を持って人に伝えること
大きい組織になると人からの伝聞でコミュニケーションを取らなければならないタイミングがよく発生します。例を挙げると、会社の方針、事業の方針、組織の方針、予算についてなどです。そのような場面では**自分自身が納得感を醸成できるまで質問**し、人に伝えるときは事実と意見を分けて伝えることを意識しています。
しかし**全ての事象に自分がアカウンタビリティを持つ必要はないので、わからないことが出てきたら「わからないので、直接聞いて欲しい/確認します」と正直に伝えたらよく**て、自分の解釈や意見を付け加えるなら「私の解釈/意見では」という枕詞を付けます。
また意外と忘れがちですが**温度感もセットで伝えるとあとあと期待値のズレが発生しづらい**ように思います。人によっては未確定の事項を伝えると混乱してしまう場合や意思決定のプロセスに積極的に関与してもらったほうがいい場合など色々なケースがあるので、情報伝達の方法にもアレンジが必要です。

# フォーカスすべき課題を見極め、細かいところは気にしないこと
これも当たり前のことですが、大切にしているもののうまくできているとは言えず。とても難しいと感じています。プロダクトのRMや予算を達成することは大前提にあるとして、メンバーの興味、技術的課題を把握しどこに取り組むことがレバレッジポイントになるのか考える必要があります。
この辺りは、もちろん私個人でできることではないのでメンバーに相談して課題発見してもらう必要があります。**行動規範や抽象的な課題感の共有**がなされることで自律的に行動する組織が理想だと思い、時にチーム全体で集まって話したり分科会で課題定義したりと、N人N+1脚みたいな感じで試している最中です。また、多少全体から見て優先度があまり高くないと感じられるようなことでも、育成への貢献度が高く長い目で見て必要なことならばやる価値は大きいと感じています。

# セルフコントロールすること
何が起こっても**なるべく感情に影響を及ぼさない**ことがとても大事だと思います。いわゆる中間管理職的な役割を担う場合、どうしても色々な事象の板挟み状態になってしまうためストレスを感じることもあります。が、その状態でメンバーに向き合うと心理的安全性を損ねてしまいます。そして**大変な時ほど少しでも課題解決に向けての行動をするほかありませんし、その行動を積み重ねることで結果的に楽になります**。
[私の先輩の受け売り](https://job-draft.jp/articles/550)になるのですが**セルフコントロールもあくまでスキルのひとつである**ため、この辺りは少し工夫すれば身についていくものかと思いますし非常に大きな武器になるはずです。
同時に、程度によりますがストレスが発生する機構は改善の余地があるので自分の上司やEMの仲間に正直に相談することも忘れてはならないですね。

# まずありのままを受容すること
時には想定外の出来事が発生したり、時には理想から遠い状態から物事に取り組まなければならないこともあるかもしれません。セルフコントロールの話にも似ていますが、**ありのままを受け止め、まずはそこから何ができるか考える**ことが大事だと思います。

# 結局はスキルの問題であると気楽に考えること
EM自身の課題を含め、個人やチームの課題らしきものを紐解いていくと、構造的な問題でなければスキルや経験の問題に収束することが多いかと思います。ここで問題と言っているのは、「スキルがないことが悪」という意味ではなく、**大半のことはスキルさえ身につければ解決に近づく**ということです。
ではどのようにスキルを獲得するのか？ここの解決方法のバリエーションがEMのスキルかもしれません。
EMから直接教えられるようなスキルは限られているかと思います。
適切な業務のアサインをする、前向きな人の肩をちょっとだけ押す、シニアメンバーに相談する、ちょっとだけDeep Diveを促す問いを投げかける、ちょっとだけ新たな点を置くようなインプットをしてみる、理想状態を定義してマイルストンを置く壁打ちをする、そんな行動をここぞというタイミングでやっていくことがEMとしては大事なのではないかと思います。という私自身全然うまくできていないため、EMとしてのスキルは伸び代しかありません。


# 最後に
こうして改めて言語化してみるとどれもEMに限った話ではなく広く大事なことで当たり前のことかもしれませんが、自分なりにEMの経験の中で身につけてきた考え方や行動を内省する良い機会となりました。
これからEMを目指す方の参考になったり、悩めるEMの皆様に少しでも共感いただけるような部分がありましたら幸甚です。
そして以前[Meetyでカジュアル面談のお声掛けをいただいた](https://note.com/hidenorigoto/n/ndf99e93b27f3) & 本アドベントカレンダーを主催されている[Hidenori Gotoさん](https://twitter.com/hidenorigoto)、本カレンダーを紹介してくださった[Taku Unnoさん](https://twitter.com/boscoworks)、このような機会をありがとうございました！
【Harmoware-VIS】python で 3次元可視化

#Harmoware-VIS とは

https://qiita.com/ucl_Harmoware_VIS/items/e861e0f651ffde647b6a

#python で 3次元可視化

「synerex」の３次元可視化ツールである「HarmoVIS_client」で表示したマップをpythonでコントロールするためのpythonライブラリについて説明します。
## 前提
3次元可視化は以下の３つのツールで連携して実現します。
- HarmoVIS_client
- Jupyter Notebook
- synerex_harmovis

###synerexとは
https://www.ucl.nuee.nagoya-u.ac.jp/project

https://github.com/synerex

https://qiita.com/ucl_Harmoware_VIS/items/51fa710a307bdb4930ac

## 準備
必要なツールを準備します。
- HarmoVIS_client
インストール＆起動方法は[こちら](https://s-mobi01.github.io/SynerexHarmVizCli/)
- Jupyter Notebook
    - Pythonのインストールは[こちら](https://www.python.jp/install/install.html)
    - Jupyterのインストールはプロンプトから次のコマンドを実行　`pip install jupyter`
    - Jupyterについての詳細は[こちら](https://jupyter.org/)
- synerex_harmovis
    - synerex_harmovisのインストールはプロンプトから次のコマンドを実行　`pip install synerex_harmovis`

## 使用方法
- HarmoVIS_client
デスクトップアイコン等から起動します。
    - 「Synerex+HarmoVIS」画面の左上の「MapWin」ボタンをクリック
        <div style="text-align: left">
          <img width="240" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/566960fc-a971-4e41-82bb-56429f169b59.png">
        </div>
    - 「Harmoware-VIS Synerex Provider」が起動
        <div style="text-align: left">
         <img width="840" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/306ec00d-1518-4847-8ad7-c3d800a3ec5c.png">
        </div>

- Jupyter Notebook
     - Jupyterの起動はプロンプトでHOMEにしたいディレクトに移動後に次のコマンドを実行　`jupyter notebook`
     - カレントブラウザで「jupyter notebook」が開きます。
        <div style="text-align: left">
         <img width="840" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/756bfbdc-3018-4236-9290-c4807f02e2ad.png">
        </div>

- synerex_harmovis
    - 「jupyter notebook」でNotebookを作成します。
        <div style="text-align: left">
        <img width="240" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/e0a1317f-605a-4ff9-9f18-e40a44bc332f.png">
        </div>
    - 編集画面が開きます。
        <div style="text-align: left">
         <img width="840" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/06b00cc6-62c8-4b60-bdab-b3afb23973d7.png">
        </div>
    - 「[synerex_harmovis](https://qiita.com/ucl_Harmoware_VIS/items/51fa710a307bdb4930ac)」をインポートしコードを記述します。<br>
        synerex_harmovisについては [こちら](https://qiita.com/ucl_Harmoware_VIS/items/51fa710a307bdb4930ac) を参照
        <div style="text-align: left">
         <img width="840" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/8d3bf1aa-008c-46d3-91f7-3d242d9ed1cf.png">
        </div>
    - 実行します。
        <div style="text-align: left">
        <img width="840" src="https://img.esa.io/uploads/production/attachments/8212/2021/04/26/31805/2d938394-f376-49d3-9eec-0b8a0b6177ea.png">
        </div>
ルイズコピペをPythonで曲にする

# ルイズコピペとは？

>あぁああああ…ああ…あっあっー！あぁああああああ！！！ルイズルイズルイズぅううぁわぁああああ！！！
あぁクンカクンカ！クンカクンカ！スーハースーハー！スーハースーハー！いい匂いだなぁ…くんくん
んはぁっ！ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお！クンカクンカ！あぁあ！！
間違えた！モフモフしたいお！モフモフ！モフモフ！髪髪モフモフ！カリカリモフモフ…きゅんきゅんきゅい！！
小説12巻のルイズたんかわいかったよぅ！！あぁぁああ…あああ…あっあぁああああ！！ふぁぁあああんんっ！！
アニメ2期放送されて良かったねルイズたん！あぁあああああ！かわいい！ルイズたん！かわいい！あっああぁああ！
コミック2巻も発売されて嬉し…いやぁああああああ！！！にゃああああああああん！！ぎゃああああああああ！！
ぐあああああああああああ！！！コミックなんて現実じゃない！！！！あ…小説もアニメもよく考えたら…
ル イ ズ ち ゃ ん は 現実 じ ゃ な い？にゃあああああああああああああん！！うぁああああああああああ！！
そんなぁああああああ！！いやぁぁぁあああああああああ！！はぁああああああん！！ハルケギニアぁああああ！！
この！ちきしょー！やめてやる！！現実なんかやめ…て…え！？見…てる？表紙絵のルイズちゃんが僕を見てる？
表紙絵のルイズちゃんが僕を見てるぞ！ルイズちゃんが僕を見てるぞ！挿絵のルイズちゃんが僕を見てるぞ！！
アニメのルイズちゃんが僕に話しかけてるぞ！！！よかった…世の中まだまだ捨てたモンじゃないんだねっ！
いやっほぉおおおおおおお！！！僕にはルイズちゃんがいる！！やったよケティ！！ひとりでできるもん！！！
あ、コミックのルイズちゃああああああああああああああん！！いやぁあああああああああああああああ！！！！
あっあんああっああんあアン様ぁあ！！シ、シエスター！！アンリエッタぁああああああ！！！タバサｧぁあああ！！
ううっうぅうう！！俺の想いよルイズへ届け！！ハルゲニアのルイズへ届け！

## 曲とは？
- 音が鳴っていること

https://www.youtube.com/watch?v=ogKxJxVaRcI

- 音楽とは元来高尚なものではなく、音が鳴っていれば一応曲として扱われる
  - 興味がある場合前衛音楽や電子音楽の先祖と言われるミュジーク・コンクレートで調べるといい

## ルイズコピペを曲にする

```python
import pyttsx3
from pydub import AudioSegment

path = "./temp.wav"
text = """
ルイズ！ルイズ！ルイズ！ルイズぅぅうううわぁああああああああああああああああああああああん！！！
あぁああああ…ああ…あっあっー！あぁああああああ！！！ルイズルイズルイズぅううぁわぁああああ！！！
あぁクンカクンカ！クンカクンカ！スーハースーハー！スーハースーハー！いい匂いだなぁ…くんくん
んはぁっ！ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお！クンカクンカ！あぁあ！！
間違えた！モフモフしたいお！モフモフ！モフモフ！髪髪モフモフ！カリカリモフモフ…きゅんきゅんきゅい！！
小説12巻のルイズたんかわいかったよぅ！！あぁぁああ…あああ…あっあぁああああ！！ふぁぁあああんんっ！！
アニメ2期放送されて良かったねルイズたん！あぁあああああ！かわいい！ルイズたん！かわいい！あっああぁああ！
コミック2巻も発売されて嬉し…いやぁああああああ！！！にゃああああああああん！！ぎゃああああああああ！！
ぐあああああああああああ！！！コミックなんて現実じゃない！！！！あ…小説もアニメもよく考えたら…
ル イ ズ ち ゃ ん は 現実 じ ゃ な い？にゃあああああああああああああん！！うぁああああああああああ！！
そんなぁああああああ！！いやぁぁぁあああああああああ！！はぁああああああん！！ハルケギニアぁああああ！！
この！ちきしょー！やめてやる！！現実なんかやめ…て…え！？見…てる？表紙絵のルイズちゃんが僕を見てる？
表紙絵のルイズちゃんが僕を見てるぞ！ルイズちゃんが僕を見てるぞ！挿絵のルイズちゃんが僕を見てるぞ！！
アニメのルイズちゃんが僕に話しかけてるぞ！！！よかった…世の中まだまだ捨てたモンじゃないんだねっ！
いやっほぉおおおおおおお！！！僕にはルイズちゃんがいる！！やったよケティ！！ひとりでできるもん！！！
あ、コミックのルイズちゃああああああああああああああん！！いやぁあああああああああああああああ！！！！
あっあんああっああんあアン様ぁあ！！シ、シエスター！！アンリエッタぁああああああ！！！タバサｧぁあああ！！
ううっうぅうう！！俺の想いよルイズへ届け！！ハルゲニアのルイズへ届け！"""
engine = pyttsx3.init()
# engine.say(text)
engine.save_to_file(text, path)
engine.runAndWait()

# 音圧を上げてパワーアップ
base_sound = AudioSegment.from_file(path, format="wav")
base_sound = base_sound.apply_gain(1000) #実はo____Oさんの記事のパクりだよ
base_sound = base_sound.speedup(playback_speed=2.0, crossfade=0)
base_sound.export(path, format="wav")
```


# よりジャンクにするヒント

https://qiita.com/o________o/items/d2919c74544c506023d6
Unityの作業効率を上げる系Editor ScriptのTips集

この記事はクラスター [Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cluster) 12日目の記事です。
なんとびっくり13日になってしまいました🙄
一昨日は@Swanmanさんの「[カスタマーサポートがクラッシュの原因を突き止めた話 その2]( https://qiita.com/Swanman/items/8cb0be80fabd47ded709)」でした
カスタマーからの連絡を受け、原因まで突き止めてくれるなんて！驚きのCS担当ですね！！

さて、普段TA（Technical Artist）的なことをしている私はEditorScript書く上で便利なTipsを書いていこうかと思います。

# Editor Scriptとは
そもそもEditor Scriptとは何ぞやというお話ですが、今回お話しするEditor ScriptとはUnityのEditor機能を何らかの形で拡張し、便利にしてくれるScriptのことです。（Unity以外のEditor Scriptについては書きませんので悪しからず…
Runtimeに干渉しない範囲で純粋にUnityでの作業の手間を省いてくれるScriptについてのTipsを書いていきます。

代表的なもので言うと

- [Resource Checker](https://assetstore.unity.com/packages/tools/utilities/resource-checker-3224?locale=ja-JP)
- [QuickToggle](https://github.com/SubjectNerd-Unity/QuickToggle)

といったものですね

Unityで何かしらSceneを構築をしていこうと思ったら、どうしてもDCCツール（いわゆるBlenderとかMayaとか）上の作業だけではなく、Unity上での作業が必要になってきます。どんなにDCCツールの方の工程が効率化されていたとしても、Unity上での作業効率が悪いのでは全体としての効率が落ちてしまいます。そこでEditor Scriptの出番です。Unityを少しでもDCCツールに近付けていきたいわけです。
さらに、Editor Scriptは作業の効率化だけではなく、作業環境を統一することによるミスの削減などにも貢献します。

弊社のCluster Creator KitもUnity上での作業上不便な点がまだまだ多くあります。
例としては

- WarpのTargetからWarpを逆引きできず、視覚的にもどこへワープするのか把握しづらい
- WorldGateの飛び先を把握しづらい
- Cluster Creator KitのバージョンがProjectごとにまちまちになる

などです。実は、社内のイベント制作チームではそういった問題をEditor Scriptによって解決していたりします。

# でどうやって作るの？
Editor Scriptの意義は分かった。でどうやって作るの？という話です。
幸いUnityはEditorWindowクラスを継承するだけでEditorにWindowを追加できたりとDCCツールと比べると、その辺の仕組みは整理されています。（~~EditorにWindowを追加する方法が2種類も3種類もあって、できることも違うどこかのDCCツールと比べると非常に簡便です~~

とりあえず何か作業効率を上げるツールを作ってみたいという方にはUnity公式のこちらのチュートリアルがおすすめです。
UIのチュートリアルですが、Editor Scriptを作ってみるとっかかりには非常に良いチュートリアルだと思います。
https://learn.unity.com/tutorial/uielements-first-steps

# Tips集
でここからが本題です。まぁ大抵の機能は（うんうん悩みながら）問題なく実装できたりするわけですが、たまに面倒な問題に直面することがあります。そんな問題にブチあたったときに解決の糸口になるかもしれないことを書いていきます。

### 1. Editorの初期化実行時に処理を走らせたい
InitializeOnLoad属性を付与しましょう
Static constructorの作成もお忘れずに

### 2. Editorの初期化実行時に走らせたいが最初の一回（起動時）だけでいい！何回も動かないで
InitializeOnLoad属性を付与したクラスの中にInitメソッドを追加しましょう

### 3. Editorの実行中に特定の回数だけ実行されて欲しい！Editorを再起動しない限りこれは絶対だ
ScriptableSingletonというEditor実行中に一貫して値を保持できる便利クラスがあります
あとはInitializeOnLoadと組み合わせましょう

### 4. クラスの外からPublicではないメソッド・変数を読みたい
欲しい情報がある！しかしアクセスできない！このSerializeされた値が欲しいだけなのに！そんな場面はたくさんあると思います
Reflectionを使いましょう

### 5. Scene Viewに文字を表示したりアイコンを表示したりラインを引いたりしたい
OnDrawGizmosメソッドを利用して、ギズモを表示したりラベルを表示したりラインを引いたりできるよ

### 6. EditorでEditモードのときも実行されるMonoBehaviourを
ExecuteInEditMode属性を付与しましょう
（UpdateメソッドはScene内の何かが変わったときにしか呼び出されないので注意

***

以上、ちょっと少なかったですがEditor Scriptを書く上でのはまりポイントをまとめてみました。
Editor Scriptを書く際の手助けになれば幸いです。

今日、次の記事は@YOSHIOKA_Ko57さんの「なんか書く」です。どんな記事が出るのか楽しみですね！！
[py2rb] __init__

# はじめに
移植やってます
# __init__ (Python)
```python
class IteratorContextManager(NoOpBaseReader):
    def __init__(self, *args, **kwargs):
        self._func = kwargs.pop('parser_func')
        self._args = args
        self._kwargs = kwargs
        if type(self) == IteratorContextManager:
            self.reset()
        super(IteratorContextManager, self).__init__(*args, **kwargs)
```
インスタンスを生成されるときに呼び出されます。
しかし、`super.__init__`ってなかなか凄いですね。
# initialize (Ruby)
```ruby
class A
  def initialize(*args)
    puts "A initialize"
    __init__(args)
  end

  def __init__(*args)
    puts "A __init__" + args.to_s
  end
end

class B < A
  def initialize(*args)
    puts "B initialize"
    __init__(args)
  end

  def __init__(*args)
    puts "B __init__" + args.to_s
    super()
    super
  end
end

b = B.new("instance")
b.__init__("method")

# B initialize
# B __init__[["instance"]]
# A __init__[]
# A __init__[["instance"]]
# B __init__["method"]    
# A __init__[]
# A __init__["method"]   
```
`initialize`をprivateからpublicにしようかなとも思いましたが、`__init__`メソッドを用意して呼び出す形にする予定。

```ruby
class IteratorContextManager < NoOpBaseReader
  def initialize(*args, **kwargs)
    __init__(args, kwargs)
  end

  def __init__(*args, **kwargs)
    @_func = kwargs.delete('parser_func')
    @_args = args
    @_kwargs = kwargs
    reset() if self.class == IteratorContextManager
    super
  end
end
```
単一継承かつ引数が同じなので、`super`でよさそう。
# メモ
+ Python の `__init__` を学習した
+ 道のりは遠そう
ゲームQA、ロンチか運用か。やるならどっち！？

15年以上前にコンシューマゲーム業界でキャリアをスタートさせ、そこから多くの時間をゲーム業界で過ごしてきました。

今と昔を比較すると、アプリゲームがゲーム市場の多くを占めるようになり、また、コンシューマゲームもアップデートを重ねていくのがあたりまえになりました。それに伴い、ゲームQAという仕事も、リリースまで頑張って終わり、というわけにはいかなくなり、リリース後の運用フェーズのQAという仕事が生まれたのが、過去のゲームQAと異なる点ではないでしょうか。


個人的には、ロンチのQAも運用QAも、それぞれ長短あると感じてるので、思うところを書いてみようかなと思います。


## 運用のQA
最大のメリットは、「フィードバックが早くて多い」ということです。リリースを繰り返していくため、何が良くて何が悪かったか、という振り返りの機会を多く持てます。

また、フローが良くも悪くも固まっていて、スケジュールと予算がタイトに決められていることが多いため、「どうすれば、限られたリソースで、効果的に品質をあげられるか」ということに頭を使う必要があり、QAとしての地力がアップします(まぁ、なんでもかんでも折衝力(≒スケジュールとテスターの数の調整)でやっつけようとする人もいますが)。
 

デメリットは、一つのタイトルに関わり続けることで、マンネリ化に陥りやすく、1年も経過すると成長速度が止まりがち、ということです。
マンネリ化してきたな、と感じたタイミングで、チームを異動できればいいのですが、長期間関わるとチームに欠かせない人材となってることも多く、異動に想像以上に労力がかかります。

 
## ロンチのQA
メリットは長期間(数ヶ月)の大規模なQAを経験できるということでしょう。テスト設計に1ヶ月というのも珍しくありません。
チームやフローやツールも、ある程度、自分好みにできるので、働きやすい環境が作れるかもしれません。
また、リリース後には大きな達成感を得ることもできます。

 

デメリットは、フィードバックが少ないということが挙げられます。QA期間中はQAはひたすらテストの消化に追われ、開発チームも追い込みで切羽詰まってるため、振り返っている暇がないためです。

リリース後にフィードバックが得られればいいですが、長い期間を経た割には、少ないフィードバックになりがちです。それどころか、開発が中止になった場合は最悪で、フィードバックすら得られないかもしれません。

また、なにかしら課題に直面しても、残業か増員かスケジュール延長で対応しがちです(まぁ運用にも言えますが…)。ガッツと折衝力はつくかもしれませんが、工夫をする力が身につきにくいかもしれません。

 

## まとめ
ということで、それぞれ、メリット・デメリットあるので、自分自身のキャリアプランや成長プランに応じて、所属するチームを検討しましょう。私見を述べると、QAとしての最初の3～5年くらいは「基本は運用、1～2回は新規」というのが良いのではないかな、と思ってます！

それでは！
来年度にむけた、コーヒーデータベースの考案

<h2>はじめに</h2>

コーヒーをハンドドリップで淹れる方法は、様々である。お湯をかけたときの豆の反応を見て
他のことは何も考えずに淹れる方法。しっかりと抽出レシピを考え、そのオペレーション通りに淹れる方法。その人のコーヒーに対する接し方によって変わる。私は、毎日淹れる一杯に対して、温度や抽出方法を変えながら味の検証を趣味でやっている。2021年も終わろうとしている今、来年から一年間コーヒー抽出を数値化してそれぞれの豆に対する最適なオペレーションを機械学習によって決めてもらう取り組みを始めることにした。来年度末の目標は、私にとっての最適なコーヒーを導き出してくれるプログラムを作成すること。将来的には、データベース入力を一般公開して、コーヒーの味を体系化することを目標とする。
まずは来年度末にしっかりとプログラムが機能するように、今回はその基盤となるデータベースをどうするかを考察する。

<h2>目的</h2>
“機械学習によって”できる、美味しいコーヒーを目指す。手法は現時点では決定しない。

<h2>オペレーションをどうするか</h2>
コーヒー抽出のオペレーションは様々存在するが、再現度が高いかつ、よりシンプルな淹れ方を採用する。
よって、今回は5回に分けた抽出方法にする。
これは、[WBRC2016において優勝した粕谷さんのメソッド](https://youtu.be/8o7huqzruTE)に基づくものである。

<dl>
<dt>味を決める要素には、</dt>
<dd>-豆の種類</dd>
<dd>-豆の焙煎度合い</dd>
<dd>-抽出時の温度</dd>
<dd>-オペレーションのやり方</dd>
<dd>-抽出器具</dd>
<dd>-蒸らし時間</dd>
などがある。今回はこれらの要素を変えていきながら、データを収集する。
</dl>


<h3>方法</h3>
<dl>
  <dt>抽出器具</dt>  
  <dd>ドリップポッド: Kalita 銅ポッド 0.7L</dd>
  <dd>コーヒーミル: TIMEMORE C2</dd>
  <dd>ドリッパー: Hario V60(2-4人用)</dd>
  <dd>フィルター: 三洋産業 アバカフィルター白</dd>
</dl>

<font color="Red">豆のグラム数は必ず18gとする。</font> 
基本、お湯の量は300gにする。
5回に分けた抽出方法とする。
同じドリッパーとフィルターを想定するため、抽出する時間は考慮しない。

<h2>何をもって美味しいとするか</h2>
一番むずかしい問題である。
そこでBrix(糖度)とTDS(コーヒーの可溶性固形分濃度％)を用いて、味を数値化する。
また、個人的なスコアを10段階で定める。

<h2>データベースの提案</h2>
ここまでを踏まえて、測定するものを以下に示す。
　- 日付
　- ドリッパー(V60)
　- コーヒーミル(TIMEMORE C2)
　- ミルのクリック数(挽く度合い)
　- 豆の種類
　- 豆の焙煎度合い(5段階)
　- 豆のｇ数
　- お湯の温度
　- お湯の量
　- 最終的な抽出量
　- 蒸らし時間
　- 1回目の量
　- 2回目の量
　- 3回目の量
　- 4回目の量
　- 5回目の量
　- Brix
　- TDS
　- 感じた味(カッピングのときのようなキーワード形式: ナッツ、ベリーなど)
　- 個人的な美味しさのスコア(10段階)

<h2>基準</h2>
基準はその豆から初めてコーヒーを抽出するときに作る。
そして基準の数値はそれぞれ
 - 温度 = 90度
 - 豆 = 18g
 - クリック数 = 15回
 - 蒸らし = 60g
 - 蒸らし時間 = 30秒
 - お湯の量 = 60g-60g-60g-60g
 - スコア = 5
としてそれぞれの豆に対して基準を作る。

<h2>おわりに</h2>
ここまで、来年度末にむけてのコーヒーのデータベースの考案をした。
以下のスプレッドシートに適時、計測結果を示していくので、興味がある方は
参照していただきたい。
[スプレッドシート](https://docs.google.com/spreadsheets/d/1MQhh_TzIzAxLiJE4XYHR9hZR0ZxaF2FlMA477-F6oC0/edit?usp=sharing)
キーボードとマウスとコーヒーと2021

以前から色々と更新がかかっています
在宅業務起因が主です

# 職場
## キーボード1

* Mistel MD770RGB  
  https://archisite.co.jp/products/mistel/barocco-md770/
  https://www.mistelkeyboard.com/products/d11cf7a73da49468e2a530b4cf18e76c
* USB A-C
* ピンク軸(静音赤軸)
* 英語US配列 / 85キー

## キーボード2
* 23キー小型キーボード  
  https://www.amazon.co.jp/dp/B07RM2GFTY/?th=1
* USB A-C
* ブラック 赤軸 RGBライト

|キー割り当て||||||
|--|--|--|--|--|--|
|Home|PgUp|Del|7|8|9|
|End|PgDn|Backspace|4|5|6|
|Fn|Full Screen PrintPic<br>(Win+PrtSc)|NumLock|1|2|3|
|N|Window PrintPic<br>(Win+Alt+PrtSc)|PrtPc<br>(Win+Alt+S)|0||Enter|

Fn内は秘匿

## キーボード3
* 9キー小型キーボード  
  https://www.amazon.co.jp/dp/B07RPYP32X/?th=1
* USB A-C
* ブラック 赤軸 RGBライト

キー割り当て
その時々で切り替え
今は別PCでスクリーンショットボタン機と化している

## マウス

* logicool M720  
  M720がM720rにマイナーチェンジ(ロゴ変更)時に安く売られてたやつ
* USB Unifying
* 光学レーザー
* 5ボタン
* 常時高速スクロール

3台 Bluetooth マルチペアリングなのでたまにスマホとも繋いだりする

無線に変えたけどやはり電池切れ時の危険が危ない
結局予備電池をおいておく手段とする
リチウムイオンUSB充電の単三電池でもアリかなあとは思うが…

エネループのUSB充電器もありかもなあ

## 配置

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/cc4ecfb8-0aff-1556-1142-6bf759557a34.png)

センターマウス配置

## デスクマット
* ダイソーの330円のやつ  
  https://jp.daisonet.com/products/4549892381232

コスパはとても良い

マウスは机直置きしてたが結構マウスソールに傷が付き消耗しやすかったため
マウスパッドにしようとしたが
センターマウスで丁度いいサイズとなるとキーボード含めて敷いてしまったほうがいいと思ったので
手頃なやつを敷いた

# 家用
## キーボード

* Mistel MD770  
  https://archisite.co.jp/products/mistel/barocco-md770/  
  https://www.mistelkeyboard.com/products/d11cf7a73da49468e2a530b4cf18e76c
* USB A-C
* ピンク軸(静音赤軸)
* 英語US配列 / 85キー

職場でRGB
自宅でRGB無し

正直なところ買うならRGBの方が断然いい
理由はマクロ登録時にわかる

## マウス
* G502 LIGHTSPEED WIRELESS GAMING MOUSE  
  https://gaming.logicool.co.jp/ja-jp/products/gaming-mice/g502-lightspeed-wireless-gaming-mouse.910-005572.html
* USB 無線
* 光学レーザー
* 常時高速スクロール

自宅でも
M720を使っていたがゲーミングの方が動きの正確性は高かったので変更

## 配置

自宅もセンターマウス


## デスクマット
* ダイソーの330円のやつ  
  https://jp.daisonet.com/products/4549892381232

コスパはとても良い


# コーヒー
## 会社
主に

* CRAFT BOSS  
  コールド

Amazon定期で買ってたりする


## 家
* マイルドカルディ  
  KALDI

とか色々
買うときの気分次第

箱でCRAFT BOSSがあるのでそれを飲むことも
BigQueryの分析関数についてまとめた、をまとめる

# はじめに
最近、BigQueryを使う非エンジニアの方から、分析関数の書き方も使う理由もよく理解できないというご意見をいただきましたので、分析関数について公式ドキュメントとUdemyのBigQuery講習のみの知識をまとめたいと思います。

# 分析関数とは
- [公式ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts)の説明

>分析関数は、行のグループに対して値を計算し、各行に対して 1 つの結果を返します。これは、行のグループに対して 1 つの結果を返す集計関数とは異なります。

- Udemy講座([BigQuery で学ぶ非エンジニアのための SQL データ分析入門](https://www.udemy.com/course/bigquerysql/))の説明

> グループ化されつつ集計しない括りについては、パーティションと呼ばれ、パーティションを使った関数を分析関数と言います。行のグループに対して単一の結果を返すGROUP BY(集計関数)とは異なり、行のグループの値を計算し行ごとに一つの結果を返します。

上記をまとめると、カテゴリごとに複数のレコードをまとめた計算をする集計関数に対して、カテゴリごとに分けつつも返す結果は元のテーブルと同じレコード数だけ返す関数を分析関数と言います。

例えば、以下のテーブル"sample.purchases"を題材に考えます。

| id | category | sales_amount | 
|:-:|:-:|-:|
|  1 |  野菜 |  3000|
|  2 |  肉 |   2000| 
|  3 |  肉 |   6000|
|  4 |  野菜 |  1500| 
|  5 |  肉 |  2500|

このテーブルに対し、カテゴリごとの総売上を計算する場合には、集計関数(group by)を使って以下のように記述できます。

```sql
SELECT 
  category,
  SUM(sales_amount) AS total_sales
FROM sample.purchases
GROUP BY category
```

これを実行すると、元のテーブルが5行あるのに対して、結果をまとめた2行のみとなります。

| category| total_sales |
|:-:|-:|
|  野菜 | 4500  |
|  肉 |  10500 |

一方、カテゴリごとに売上を時系列順に並べて「その行までの累計売上はどれくらいか」を知りたい場合には、分析関数(over partition by)を使って以下のように記述できます。

```sql
SELECT
  id,
  category,
  sales_amount,
  SUM(sales_amount) 
    OVER (  -- OVER句を伴うことで、分析関数であることが明示的になる
      PARTITION BY category  -- PARTITON BY句: 指定したカラム名でパーティションを作成する
      ORDER BY id            -- ORDER BY句: パーティションの中で並び替えを行う
      ROWS BETWEEN unbounded preceding AND current row  -- WINDOW FRAME句: パーティションの中でどのレコードを計算対象のフレームとするか宣言する
  ) AS cumulative_sales
FROM sample.purchases
ORDER BY category, id
```

これを実行すると、元のテーブルと同じ5行の結果が返ってきます。

| id | category | sales_amount | cumulative_sales |
|:-:|:-:|-:|-:|
|  1 |  野菜 | 3000  | 3000  |
|  4 |  野菜 | 1500  | 4500  |
|  2 |  肉 |  2000 | 2000  |
|  3 |  肉 |  6000 | 8000  |
|  5 |  肉 |  2500 | 10500  |

この結果の返す意味は、以下の通りです。
1. categoryごとに結果が整理されているが、一つのcategoryに対して複数の結果が表示される。
2. 特定のcategoryの中では、id順になっている。
3. cumulative_salesでは、同じカテゴリに対してのsales_amountを現在の行まで累積するように計算されている。


### WINDOW FRAME句について
最初に指定するのはrowsです。
次にフレーム(分析関数で計算させる対象範囲)を指定する方法として、基本的にbetween句が利用されます。
すなわち、

```sql
ROWS BETWEEN [フレーム開始行設定] AND [フレーム終了行設定]
```
となります。

フレーム開始行設定、フレーム終了行設定に使えるキーワードは以下の通りです。

| フレーム開始行/終了行設定キーワード | 説明 |
|:-|:-|
| unbounded preceding |  パーティションで定義された境界の、最も上の行 |
| unbounded following |  パーティションで定義された境界の、最も下の行 |
| current row  |  現在の行 |
| [正の整数] preceding | 現在の行から[正の整数行]だけ上の行 |
| [正の整数] following | 現在の行から[正の整数行]だけ下の行  |

# まとめ
集計関数: カテゴリごとにまとめて統計値を出したい場合に使う
分析関数: カテゴリごとに区切って統計値を出したい場合に使う

集計関数に対してカテゴリごとに異なるレコードを持つ結果を返したい場合に使う分析関数は、柔軟性に優れているといえます。


# 参考
https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts
BigQuery で学ぶ非エンジニアのための SQL データ分析入門(https://www.udemy.com/course/bigquerysql/)
[Unity2020]Admobテスト用設定

どうも、GAIです。
自分でAdmobつかいながらアプリつくってていつも忘れるので
テスト用のAdmobIDを書いておきます。

●Google Mobile Ads App ID
 Android　ca-app-pub-3940256099942544~3347511713
 iOS　ca-app-pub-3940256099942544~3347511713

●リワード広告
　Android　ca-app-pub-3940256099942544/5224354917
　iOS  ca-app-pub-3940256099942544/1712485313

●バナー広告
　Android　ca-app-pub-3940256099942544/6300978111
　iOS　ca-app-pub-3940256099942544/2934735716


インタースティシャルとかはまた使うときに・・・・

それではまた
Fargate AWSCLIでサービス作成/削除

ネットワークリソースとロードバランサーの指定が若干面倒だったのでメモ

# サービス作成

リファレンス
https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html

コマンド例

```
service=xxxxxxxx
aws ecs create-service \
    --cluster CLUSTER \
    --task-definition TASKDEF \
    --service-name $service \
    --desired-count 1 \
    --launch-type FARGATE \
    --network-configuration "awsvpcConfiguration={subnets=[subnet-XXXXXXXX,subnet-XXXXXXXX],securityGroups=[SG-XXXXXXXX],assignPublicIp=ENABLED}" \
    --load-balancers "targetGroupArn="arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:targetgroup/TargetGroup/xxxxxxxx",containerName=CONTAINER,containerPort=80" \
    --enable-execute-command > /dev/null
```

説明

- サービス名だけ変数指定(検証時に連続で作り直すとき、サービスの削除に時間がかかる間、同じサービス名でサービスを作成しようとすると待たされるので、都度違うサービス名を指定できるよう)
- タスクを起動するサブネットを2つ指定する
- プライベートサブネット指定でもassignPublicIp=ENABLEDにしている
- ターゲットグループARNとロードバランサ名```--load-balancers```のどちらかを指定するんだけど、ロードバランサ名の方で指定すると以下エラーがでるのはなんでだろ。ここではターゲットグループARNで指定
    - ```An error occurred (InvalidParameterException) when calling the CreateService operation: Classic Load Balancers are not supported with Fargate.```
    - ちなみに両方指定すると以下エラー
        - ```An error occurred (InvalidParameterException) when calling the CreateService operation: loadBalancerName and targetGroupArn cannot both be specified. You must specify either a loadBalancerName or a targetGroupArn.```
- ECS Exec有効
- 正常実行後に自動的にJSONがページャで開かれるのがいらないので、標準出力を/dev/nullに送ってすぐプロンプトが戻るようにする

# サービス削除
先にdesired-countを0にしてから、サービスを削除する。
どちらも実行後に自動的にJSONをページャで開くのがいらないので標準出力を/dev/nullに送る

```
aws ecs update-service --cluster CLUSTER --service $service --desired-count 0 > /dev/null
aws ecs delete-service --cluster CLUSTER --service $service > /dev/null
```
[Flutter] Android端末で、Bluetoothペアリング済みの端末の情報を取得する方法

# はじめに
Flutterアプリで、Android端末とペアリング済みの端末の情報(端末名、macアドレス)を取得する方法について調べていたのですが、
MethodChannelを利用して、Kotlin側から取得する方法が楽に実装できそうだったので、その際の手順を残そうと思います。

※iOSでの実装は今回触れません。

# 実装
まずはDart側から実装していきます。
MethodChannelを使い任意のタイミングでKotlin側のプログラムを呼び出します。

```main.dart
  Future<dynamic> getPairingDeviceInfo() {
    var res = MethodChannel('com.sample_project/bluetooth')
          .invokeMethod('get_pairing_device_info', {});
    return res;
  }
```

続いてKotlin側で、Dart側から呼び出されるMethodChannelを作成していきます。
Bluetoothペアリング済みの端末情報を取得し、Dart側に返します。

```MainActivity.kt
class MainActivity : FlutterActivity() {

    private lateinit var channel: EventChannel

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        var channelBrother = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.sample_project/bluetooth") // dart側で設定したチャンネル名と同じにする。
        channelBrother.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
            when (methodCall.method) {
                "get_pairing_device_info" -> {
                    val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter();
                    val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
                    val deviceName = pairedDevices?.first()?.name // デバイス名
                    val deviceHardwareAddress = pairedDevices?.first()?.address // macアドレス
                    result.success(deviceName.toString())
                }
            }
        }
    }
```

# 採用に関して
弊社では、現在、エンジニアを募集しております。
物流に興味・関心がある方はもちろん、
Flutterやモバイル開発に強みがある方、心よりお待ちしております！

https://www.wantedly.com/companies/company_3244501/projects
StepFunctions から AWS Batchの呼び出しでJSON Stringを使う

[Wano Group Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group)の記事です。

AWS Step Functions から AWS Batchに動的な命令を与えたい時、よくやるパターンのTIPSを記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85375/c627160a-67e3-8cff-ca2c-dfbb2f2928a2.png)

AWS Batchに命令を与えるには、

* Parameters
* 環境変数

なりに命令を突っ込んで使う必要があります。
ここに命令としてJSONを使いたい時があるのですが、オブジェクトのままでなくシリアライズして渡す必要があります。


例えば、こういうJSONを命令として与えたい時どうするでしょうか。

```json
{
  "call_type" : "create_image",
  "data" : {
    "bucket" : "xxxx",
    "key" : "xxxx"
  }
}
```


## 問題: States.JsonToString内で動的構築
  
ASLには ``` States.JsonToString ``` オペレータがあるのですが、これをAWS Batchの命令でそのまま使うには若干問題があります。

  
```json
...
"batch:CreateAndSaveImages": {
  "Type": "Task",
  "Next" : "End"
  "Resource": "arn:aws:states:::batch:submitJob.sync",
  "Parameters": {
    "JobName": "xxxxxxxx",
    "JobDefinition": "xxxxx",
    "JobQueue": "xxxxx",
    "ContainerOverrides": {
      "ResourceRequirements": [
        {
          "Type": "VCPU",
          "Value": "1"
        },
        {
          "Type": "MEMORY",
          "Value": "2048"
        }
      ],
      "Environment": [
        {
          "Name": "ACTIVITY_TASK_TOKEN",
          "Value.$": "$$.Task.Token"
        },
        {
          "Name": "BATCH_INPUT_JSON",
          "Value.$": "States.JsonToString({ \"call_type\" : \"create_image\" , \"data\" : {\"bucket\" : "$.bucket", \"key\" : \"$.obj\"}  })"
        }
      ]
    }
  }
},
...

```

上記では、BATCH_INPUT_JSON環境変数に直接オブジェクトを動的構築/シリアライズしようとしているのですが、2021年12月現在、こういう複雑なテンプレート構築は``` States.JsonToString ``` ではできないようです。




## 解決策: いったんPass Stateで任意の場所に格納する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85375/48dea409-f908-5024-3dac-df48dd3087c1.png)


解決策としては、**Pass Stateをデータ加工専用のプロセスとして用い**、``` ResultPath  ``` などで好きな場所に変数を格納します。
そのうえで、命令オブジェクトをシリアライズする ```States.JsonToString ```では変数が格納されている場所だけを指定します。


```json
...
  "pass:CreateImageEncodePayload": {
    "Type": "Pass",
    "Next": "batch:CreateAndSaveImages",
    "ResultPath": "$.result.CreateImageEncodePayload",
    "Parameters": {
      "call_type" : "create_image",
      "data" : {
        "bucket.$": "$.bucket",
        "key.$": "$.bucket"
      }
    }
  },
  "batch:CreateAndSaveImages": {
    "Type": "Task",
    "Resource": "arn:aws:states:::batch:submitJob.sync",
    "Parameters": {
      "JobName": "xxxxxxxx",
      "JobDefinition": "xxxxx",
      "JobQueue": "xxxxxx",
      "ContainerOverrides": {
        "ResourceRequirements": [
          {
            "Type": "VCPU",
            "Value": "1"
          },
          {
            "Type": "MEMORY",
            "Value": "2048"
          }
        ],
        "Environment": [
          {
            "Name": "ACTIVITY_TASK_TOKEN",
            "Value.$": "$$.Task.Token"
          },
          {
            "Name": "BATCH_INPUT_JSON",
            "Value.$": "States.JsonToString($.result.CreateImageEncodePayload)"
          }
        ]
      }
    },
    "End": true
  }
...


```

毎度 AWS Batch利用の前に ``` Pass State ```が出てきてしまう難点があり、ちょっとかっこ悪いですが、これで動的に変わる JSON Objectを命令として扱うことができるようになりました。
【Salesforce】SingleEmailMessageの使用状況をWorkbenchで確認する

#SingleEmailMessageの使用回数について
SingleEmailMessageの使用回数は組織につき24時間あたり5000通までとなっています。
SingleEmailMessageの使用状況はWorkbenchにて確認すること出来ます。

#Workbenchへログイン
以下にアクセスします。
https://workbench.developerforce.com/login.php

以下の画面でログインする環境を選択し、APIバージョンを選択します。
「I agree to the terms of service」にチェックを付け、ログインボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/dfccf293-46a7-255d-fc20-98eb5ebed3bc.png)

#SingleEmailMessageの使用状況確認
「Jump to」選択リストで「REST Explorer」を選択し、「Select」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/43712627-ec48-35da-5b29-e7e1e822b590.png)

APIパス入力エリアに「/services/data/vXX.0/limits」と入力し、「Execute」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/7246aafb-1f63-381b-42c8-c7b9781355cc.png)

表示されたフォルダ一覧から「SingleEmail」を選択すると、現在のSingleEmailMessageの使用状況が確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/780d1527-a62a-895f-b772-814240175606.png)
OpenChain Security Assurance Reference Guideの翻訳について

### 挨拶
こんにちは。
木田と申します。
今日は昨日に引き続きOpenChain Security Assurance Reference Guideについての話題です。
今回は翻訳プロジェクトについて紹介します。
### セキュリティ関係ドキュメント翻訳プロジェクトについて
2021年夏に[OpenChain Security Assurance Reference Guide](https://www.openchainproject.org/featured/2021/08/12/openchain-iso-5230-security-assurance-reference-guide-now-available)が公開されました。
また、[JPWGが策定したSPDX Liteを含むSPDX2.2がISO化](https://prtimes.jp/main/html/rd/p/000000154.000042042.html)されました。 
これらはOSSのサプライチェーンマネジメントがコンプライアンスだけではなくセキュリティ等、様々な面で重要になってきていることの証左です。
日本でもこのような取組を加速していくため、これらのドキュメントを和訳するプロジェクトが立ち上がりました。
### Security Assurane Reference Guideとは
2021年8月にOpenchainのSpecification WGがリリースした組織がOSSのセキュリティを確保するためのガイドラインです。
このこのガイドラインはISOとなっているOpenChainの仕様に含まれるものではありませんが、そのプロセスを活用してライセンスコンプライアンスだけでなくセキュリティ関連業務にも進められるようにするための指針となるものです。
詳細は[12月14日のアドベントカレンダー](https://qiita.com/MasatoENDO/private/e11bd9e7aa7961ab9659)でENDOさんが記載してくれているのでそちらを参照してください。
### 翻訳プロジェクトに参加した経緯
私が所属している企業では、日ごろの開発でOSSを活用しておりOSSの恩恵を受けています。
私は業務の中でOSS利用プロセスの検討やコンプライアンス監査なども担当しており、よりOSSに関わる機会が多いためよりOSSの恩恵を感じる立場にいますが、ほとんどOSSのコミュニティに対する貢献ができていないいわゆるフリーライダーの状況でした。
そのため、いつも「何かしらの形でOSSコミュニティに貢献したい」と感じていましたが、 
* 知らないコミュニティにいきなり飛び込むのが怖い
* コミュニティは超人の集まりだからプログラミングでは貢献できそうにない
* OSSコミュニティの活動ってなんか敷居が高い
* そもそも仕事が忙しい
などの理由でずっと何もすることができずにいました。
そんな中で、OpenChainのSlackの中で新規プロジェクト(今回のセキュリティ関係ドキュメント翻訳プロジェクト)のメンバー募集があったため、
* 新規プロジェクトなら参加しやすい
* 最初の[翻訳対象](https://github.com/OpenChain-Project/SecurityAssuranceGuide/tree/main/Guide/1.0)の文章のボリュームが少ない(これなら英語苦手でも頑張ればなんとかなりそうだと感じた)
* ソースコードを書かなくてもいい(これならプログラミングに自信がなくても参加できる)
と言ったところから勇気を出して参加しました。
その際、一人で参加する勇気はなかったので会社の同僚の宇野さんを誘い二人で参加しています。
この記事も宇野さんと二人で分担しながら執筆しています。
### 翻訳の手順
翻訳プロジェクトの流れを説明します。
#### 1.プロジェクト開始・参加者募集・担当割り振り  
あるドキュメントの日本語化を行おうという話になれば、SWGの定例会やSlack上などで参加者が募られます。
今回は早いもの勝ちでやりたい章を選ぶ形式でした。
#### 2.翻訳作業
各自担当分の翻訳を行います。
最近はAIベースの機械翻訳が優秀なので参考になりますが、特有の文言が正しく訳されなかったり、文書内や他文書との用語の統一を取るのは難しかったりするので、注意して翻訳する必要があります。（とは言え最近は本当に優秀なので、各ソフトの結果を比較してみるのも面白いですが。）
本projectでは、基本的に[Linux Foundationでも使用](https://www.nict.go.jp/press/2020/12/02-1.html)されている[みんなの自動翻訳](https://mt-auto-minhon-mlt.ucri.jgn-x.jp/)を参考にする形にしています。
※一部の機械翻訳サービスの翻訳は利用規約により、翻訳結果をOSSに取り込むことができないものがありますので注意。
#### 3.レビュー 　
用語の統一等にも留意して、オンラインレビューやTV会議を駆使してレビューを行います。
#### 4.公開
指摘反映した結果にバージョン付与してgitリポジトリに公開します。
### 翻訳結果
翻訳したドキュメントは以下で公開しています。
是非一度目を通して頂けると嬉しいです。
https://github.com/OpenChain-Project/OpenChain-JWG/tree/master/subgroups/promotion/outcomes/securityguideline
### 翻訳ドキュメント参照の際の注意点
この日本語訳はあくまで参考です。
ドキュメントの起草者によって発表されたものではありません。
必要に応じて原文も確認してください。
### 翻訳プロジェクトの感想
#### 木田の感想
ずっとぼんやりと「OSSコミュニティに貢献したい」と思っていた中で、比較的参加しやすいプロジェクトが立ち上がったので参加しました。
一緒に参加して頂いた宇野さん、色々フォローして頂いたOpenChain JWGの皆さんありがとうございました。
色々勉強になりましたし、ほんの少しだけコミュニティに貢献することもできたと思いますので非常にやりがいのある活動でした。
今後も積極的に自分が役に立てるところを探してコミュニティ活動に参加していこうと思います。
#### 宇野さんの感想
翻訳等はOpenChainのようなコミュニティの活動の中では比較的とっつきやすい活動でありながら、知識のインプットや貢献の自己満足度も得られる良い機会でした。
読んでくれた方の中で「コミュニティ活動ってなんとなく敷居高いな」と思っている方にはぜひお勧めです！
### English Summary
OpenChain Security Assurance Reference Guide was released in this August.
We translated it into Japanese, so please check it.
https://github.com/OpenChain-Project/OpenChain-JWG/tree/master/subgroups/promotion/outcomes/securityguideline