OmniAICreator/Qiita-1.07M huggingface dataset:
【Neuroimaging】画像ファイル形式の種類

# 目的
脳画像解析をする上で、よく用いる画像フォーマットを知る。

# 目次
1. 目的
2. 画像ファイル形式
2.1. DICOM（拡張子: .dcm）
2.2. ANALYZE（拡張子: .hdr/.img）
2.3. NIfTI（拡張子: .nii）
2.4. MIF形式（拡張子：.mif）
2.5. MGZ形式（拡張子：.mgz）
2.6. GZ形式（拡張子：.gz）

詳しい解説とコードは、「[画像ファイル形式の種類](https://www.nemotos.net/?p=3852)」をご覧ください。
【Route53 + CloudFront + S3構成】Vue.jsをホスティングする


今回はRoute53 + CloudFront + S3構成でVue.jsをホスティングしたのでメモ的な感じで記録しておきます。

## ドメインの取得

以下のサイトから無料のドメインを取得することができます。

https://www.freenom.com/ja/index.html

詳しい取得方法は以下のサイトを参考にしました。

https://note.com/dafujii/n/n406f385651e2

## Route53・CloudFront・S3の設定

以下のサイトを参考にしました。

https://zenn.dev/wakkunn/articles/66a6e8372611dc

# つまずいたところ

## カスタムエラーレスポンス

TOPページ以外にアクセスすることができないようになった。これはVue.jsのSPAの仕様の問題です。CloudFrontから以下のようにカスタムエラーレスポンスを設定しておきましょう。

![スクリーンショット 2021-12-17 16.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/bb1457ca-6e28-9ef2-2d1c-3a139eaa6d7e.png)

## キャッシュの削除

次回デプロイした時はキャッシュを削除しましょう。

![スクリーンショット 2021-12-17 19.59.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/64e576a0-e8e4-c5a8-7089-ae4697607c5d.png)

![スクリーンショット 2021-12-17 20.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/446f48b9-cbaf-1e74-df13-b090af77ab06.png)
【Neuroimaging】脳画像解析のためのMRIの概要

# 目的
脳画像解析に、必要なMRI知識を簡単に理解する。

# 目次
1. 目的
2. MRI理論
3. 構造的画像（structural MRI: sMRI）
4. 機能的画像（functional MRI: fMRI）
5. 拡散画像（diffusion MRI: dMRI）
6. 参考文献

詳しい解説とコードは、「[脳画像解析のためのMRIの概要](https://www.nemotos.net/?p=4177)」をご覧ください。
zemax っぽい hexapolar サンプリングパターン生成のメモ

zemax では hexapolar(六極)でサンプリング点を生成するモードがあります.

https://community.zemax.com/got-a-question-7/spot-diagram-ray-density-447

zemax 使ったことがないので正確かどうかは不明ですが, ring が増えるごとに,

0, 1 (中心は 1 点)
1, 6
2, 12
3, 18
...

と 6 点ずつ増やしていくようなパターンです.

https://www.raymak.com/wp/user-guide/arrays/

こんな感じでしょうか.

batoid に参考となるコードがあります.

https://github.com/jmeyers314/batoid/blob/9149a5af766fb9a9cd7ebfe6f3f18de0eb8b2e89/batoid/rayVector.py#L411

ただ, batoid の `asPolar` 関数では, 必ずしも任意の ring(naz)で点の数が 6 の倍数にはなりませんでした...

強制的に 6 の倍数にするように修正してみました.

```python
import numpy as np
import matplotlib.pyplot as plt

def asPolar(outer: float, inner: float, nrad: int, naz: int, nrandom = None):

    if nrandom is None:
        nphis = []
        
        rhos = np.linspace(outer, inner, nrad)

        #print(rhos)
        #for rho in rhos:
        #    nphi = int((naz*rho/outer)//6)*6
        #    if nphi == 0:
        #        nphi = 6
        #    nphis.append(nphi)
        #if inner == 0.0:
        #    nphis[-1] = 1

        for i in range(nrad):
            nphi = 6 * (nrad - i - 1)
            nphis.append(nphi)
        
        nphis[-1] = 1

        print(nphis)

        reversed_nphis = list(reversed(nphis))
        print(reversed_nphis)

        # test
        for i in range(len(reversed_nphis)):
            if i == 0:
                assert reversed_nphis[i] == 1
            else:
                assert reversed_nphis[i] == i * 6

        th = np.empty(np.sum(nphis))
        rr = np.empty(np.sum(nphis))
        idx = 0
        for rho, nphi in zip(rhos, nphis):
            rr[idx:idx+nphi] = rho
            th[idx:idx+nphi] = np.linspace(0, 2*np.pi, nphi, endpoint=False)
            idx += nphi
        if inner == 0.0:
            rr[-1] = 0.0
            th[-1] = 0.0
    else:
        rr = np.sqrt(np.random.uniform(inner**2, outer**2, size=nrandom))
        th = np.random.uniform(0, 2*np.pi, size=nrandom)

    r = np.empty((len(rr), 3), order='F')
    x = r[:, 0]
    y = r[:, 1]
    z = r[:, 2]
    x[:] = rr*np.cos(th)
    y[:] = rr*np.sin(th)
    del rr, th

    print(len(x))

    return x, y


def main():
    outer = 1.0
    inner = 0.0

    for n in range(1, 32):
        nrad = n

        naz = nrad * 6 # nrad * 6 = zemax config(1, 6, 12, 18, 24, 30, ...)
        nrandom = None # Uniform sampling

        x, y = asPolar(outer=outer, inner=inner, nrad=nrad, naz=naz, nrandom=nrandom)

        plt.plot(x, y, 'o')
        plt.show()


main()
```

![Screenshot from 2021-12-17 19-39-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/6ea591f1-763f-1cf6-da13-34ae867710a5.png)

Voila!

円内にそこそこ面積一様でサンプル点を作るのによさそうでしょうか? :thinking:
【Neuroimaging】脳画像解析の概要

# 目的

脳画像解析の基礎について理解する。

# 目次

1. 脳画像解析とは
2. 脳画像解析の種類と特徴
3. 画像解析一連の流れ
3.1. DICOMを脳画像解析用のファイル形式に変換（例: DICOM→NIfTI）
3.2. 画像に問題がないかチェック
3.3. 前処理
3.4. 統計解析

詳しい解説とコードは、「[脳画像解析の概要](https://www.nemotos.net/?p=3830)」をご覧ください。
Go: stripe API 使い方 (List all customers)

こちらのページの続きです。
[stripe API 使い方 (List all customers)](https://qiita.com/ekzemplaro/items/ed152ef41f1e81811519)

#Go http でカスタマーの一覧を取得#

必要なライブラリーのインストール

```bash
go get github.com/joho/godotenv
```

```bash
go mod init get_customers_http
go mod tidy
```

```go:get_customers_http.go
// ---------------------------------------------------------------
//	get_customers_http.go
//
//					Dec/17/2021
// ---------------------------------------------------------------

package main

import (
	"os"
	"fmt"
	"io/ioutil"
	"net/http"
	"github.com/joho/godotenv"
	"encoding/json"
)

// ---------------------------------------------------------------
func main() {
	fmt.Printf ("*** 開始 ***\n")
	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
		}

	secret_key := os.Getenv("SECRET_KEY")

	url_target := "https://api.stripe.com/v1/customers"
	req, _ := http.NewRequest("GET", url_target, nil)
	req.Header.Set("Authorization", "Bearer " + secret_key)
	client := new(http.Client)
	res, err := client.Do(req)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}

	str_json := string(body)
	var dict_aa map[string]interface{}
	json.Unmarshal ([]byte(str_json), &dict_aa )

	slice_aa := dict_aa["data"].([]interface{})
        nn := len(slice_aa)
        fmt.Printf("nn = %d\n", nn)

	for it := 0; it < nn; it++ {
		unit := dict_aa["data"].([]interface{})[it]
		fmt.Println(unit.(map[string]interface{})["id"])
	}

	fmt.Printf ("*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

実行結果

```text
$ go run get_customers_http.go
*** 開始 ***
nn = 4
cus_KmrIU4hzWqYt7R
cus_KmoG4k1wiKxSDc
cus_KmnqmJhBAvPGMq
cus_KmnpiRFjm8he97
*** 終了 ***
```

#Go sdk でカスタマーの一覧を取得#

sdk のインストール

```bash
go get github.com/stripe/stripe-go/v72
```

```bash
go mod init get_customers_sdk
go mod tidy
```

```go:get_customers_sdk.go
// ---------------------------------------------------------------
//	get_customers_sdk.go
//
//					Dec/17/2021
// ---------------------------------------------------------------

package main

import (
	"os"
	"fmt"
	"github.com/stripe/stripe-go/v72"
	"github.com/stripe/stripe-go/v72/customer"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func main () {

err := godotenv.Load(".env")
    if err != nil {
        panic(err)
    }

stripe.Key = os.Getenv("SECRET_KEY")

params := &stripe.CustomerListParams{}
params.Filters.AddFilter("limit", "", "10")
ii := customer.List(params)
for ii.Next() {
	cc := ii.Customer()
	fmt.Println(cc.ID)
	}

}

// ---------------------------------------------------------------
```

実行結果

```text
$ go run get_customers_sdk.go
cus_KmrIU4hzWqYt7R
cus_KmoG4k1wiKxSDc
cus_KmnqmJhBAvPGMq
cus_KmnpiRFjm8he97
```
[Flutter] Flutter WebでPageViewのスクロールができない。

Flutter WebでPageViewを使ったが、
なんかスクロールが出来なかったです。

## 解決した方法。


```scroll_behavior.dart
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => { 
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}
```


```main.dart
// Set ScrollBehavior for an entire application.
MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);
```

## 参考

- https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag
neosでlogix その27

#概要

niosでlogixやってみる。
tweenノードを使ってみた。

#写真

![2021-12-17 09.50.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fffff470-a72d-50a8-7e9e-d11091f951e9.jpeg)


#Tween

```
Inputs
 	Impulse	Tween
 	Object	To
 	Object	From
 	Float	Duration
 	CurvePreset	CurvePreset
Outputs
 	IField`1	Target
 	Impulse	OnStarted
 	Impulse	OnDone
```

以上
paiza ダンジョンのデッドロック 3 未完

https://paiza.jp/works/mondai/steinsgate/moving_deadlock_step3

※いくつかのテストケースでタイムオーバーとなり解けませんでした。
どうも実力不足のようなので分かり次第修正します。


```python
N,M = input().split()
M = int(M)
ini,pend,ans,seq = [],[],[],[]
flg = 0

for i in range(M):
    ini.append(input().split())
    
for i in range(M):
    ini[i].insert(0,str(i+1))
    
seq = ini[0]
end = ini[-1]

while flg == 0:    
    for idx,elem in enumerate(ini):
        if seq[1] == seq[2]:
            pend.append(seq)
            flg = 1
            break

        if seq[2] == elem[1] and seq != elem:
            pend.append(seq)
            seq = elem
            break

        if end == elem:
            pend.append(seq)
            flg =1
               
for pend_elem in pend[::-1]:
    ans.append(int(pend_elem[0]))
    
print(*ans)
```
Ubuntu + Xen 仮想マシン環境上の FreeBSD のデスクトップ環境の設定

[Ubuntu + Xen 仮想マシン環境に FreeBSD をインストールする](https://qiita.com/masatonasou/items/5c29252934a39663178f)でインストールした FreeBSD へのデスクトップ環境の設定手順を説明します。

細かい説明は省きます。詳しくは、[デスクトップ環境の設定](https://freebsd.seirios.org/doku.php?id=install:%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E3%81%AE%E8%A8%AD%E5%AE%9A) をご覧ください。

FreeBSD のインストールで作成したユーザー (例では yamada) でログインしてから、下記のコマンドを実行して、必要なパッケージをインストールします。
* デスクトップ環境には、Xfce をインストールします。
* Web ブラウザーは、Firefox をインストールします。

ユーザー (例: yamada) でログインしたら、以下のコマンドを実行して .xsession ファイルに設定を記述します。
* 以下の例では cat コマンドを使用していますが、vi などのファイル編集用のコマンドを使用しても構いません。

```
$ cat > .xsession
export LC_ALL=ja_JP.UTF-8
export LANGUAGE=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
#
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=xim
export XMODIFIERS=@im=fcitx
/usr/local/bin/mozc start
/usr/local/bin/fcitx -r -d
#
#/usr/local/bin/setxkbmap -layout jp
#
exec /usr/local/bin/xfce4-session
Ctrl-D
$ 
```
* 最後の「Ctrl-D」は、「Control」キーと「D」キーを同時に押下し、cat コマンドを終了します。

su コマンドでスーパーユーザーになり以下のコマンドを実行します。

```
$ su
Password: root のパスワードを入力する
# pkg install xorg xfce japanese/font-std ja-fcitx-mozc firefox xdm
# sysrc dbus_enable="YES"
# service dbus start
# sysrc xdm_enable="YES"
# service xdm start
```
* 最後の「service xdm start」コマンドを実行すると、コンソールに下記のログイン画面が表示されます。
![virt-viewer-101-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/3af7f441-d7ab-04eb-23d3-811f4803524b.png)
* Login: username + Enter キー
* Password: password + Enter キー

を入力すると、下記のデスクトップ画面が表示されます。
* 最初に作成した .xsession ファイルのファイル名を間違えていたりファイルの内容に誤りがあると、デスクトップ画面が表示されずにログイン画面の表示に戻ってしまいます。　

![virt-viewer-102-desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/ed758e8b-c408-9d20-ef53-0b95d97a7873.png)
左上の「アプリケーション」メニューを押下して「ウェブブラウザー」を選択すると、下記のように Firefox の画面が表示されます。
![virt-viewer-103-firefox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/962d34b0-8ff3-e222-7aa7-2a1d9ea38935.png)
* ログイン画面からデスクトップ画面が表示されるまでに、多少時間がかかります。
* youtube.com で動画の再生もできますが、非常に動作が遅いです。

とりあえず Ubuntu + Xen 上の仮想マシンでデスクトップ環境を使用できますが、どうも Xen の性能の影響のためか、ウェブブラウザーなどは非常に動作が緩慢としています。
Unityの教科書chapter2を用いて，Unityでスクリプトを書けるようになろう

#はじめに
この記事は，研究室の後輩向けの，[「Unityの教科書」](https://www.sbcr.jp/product/4815611347/)を用いてOculusとUnityを用いて実験するためのアプリケーションを作れるようになろう講座です．今回は，Unityの教科書chapter2を用いて実際にUnityでソースコードを書いたあと，忘れているだろうプログラミングの知識をつけてUnityでプログラミングができるようになることが目的です．
#追加学習項目

* オブジェクト指向
* クラスとメソッド
* staticとpublic

#オブジェクト指向
オブジェクト指向とは，プログラムをクラスというものに分割し，それらを組み合わせてプログラムを作成しようという考え方です．これにより，C言語ではstdio.hというクラスを用いて，printfといった機能を，呼び出していました．これだけで，文字を表示できるという簡単なシステムにしてくれるのです．この機能においてC#では分割されたものを，クラス，機能をメソッドといいます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2142992/fd78e386-2edc-9a6a-f13b-be6796526bb0.png)

また，C言語では，includeを持ちいてクラスをインポートしていました．一方，C#では，Usingを用いてインポートします．ここでインポートしたクラスを使えるというわけです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2142992/5f64ab5f-d1b6-2f42-6b64-76dc9dd61e07.png)
みなさんは，基本オブジェクト指向を意識する必要があるプログラミングを組んでこなかった人が多いと思います．しかし，Unityおよび，VRをやるとなると必要なクラスをインポートして必要なクラスを呼ばないと大変なことが多いので慣れてみましょう．

#staticとpublic
実は，プログラミングの世界には「静的」（static）と「動的」（public）という考え方があります．静的とは，プログラミング実行中に値がかわらないものをいいます．動的はその逆です．宣言をするとき，何も言わなければ基本静的に宣言されます．しかし，動的に宣言することで便利に使用することがあります．
（Unityの教科書の中では，アクセス修飾子と説明されています．）

利点の一つに，異なるソースコードからその関数なり，変数にアクセスできることです．動的にすることで，Unityだと，オブジェクトを指定して，ソースコードを指定して，関数や変数を指定すると，その中身をいじることができます．これができると，実験データ管理用スクリプトと動作用スクリプトを分け，動作スクリプトから実験データ管理用スクリプトにアクセスし，実験結果を保存することができるようになります．これをすることで，ソースコードを分割して開発でき，簡潔で効率的なプログラムを書くことができます．

もう一つとしては，inspectorからアクセスできるようになります．publicで宣言された変数は，inspectorに入力欄が現われ値を入力できるようになります．他にもinspectorからアクセスする方法があるのですが，それはまた今度．

注意点としては，動的な宣言をした変数は「逆に」アクセスして書き換えられる点です．書き換えたくない変数を動的に宣言したり，間違えて書き換えないよう気を付けてください．

#最後に
うちの学科は，プログラミングが苦手な人が多い印象を受けます．大学の授業が理論的で実用的でなくつまらないからではないでしょうか．Unityの学習はプログラミングしたことが何を目的にプログラムされ，どのように動くのか簡単に追うことができます．ぜひいろいろ調べてみてください．
アセンブリ早見表（ごく一部）

[う　え　き　ぷ　に　き　あ　く　ん　笑 Advent Calendar 2021](https://adventar.org/calendars/6939 "うえきです") 17日目です

##この記事について
本記事は、（半分自分用の）アセンブリの命令の一部分の早見表となっています。
src, dest, argという表記は、それぞれsorce, destination, argumentを表します。
記法については、Intel記法を用いています。
32bit環境を想定しています。つまり、RAXやRDXなどではなく、EAXやEDXなどを説明に使用します。

##演算命令
###加算
```
add dest, src 
```
destにsrcを足す

###減算
```
sub dest, src
```
destからsrcを引く

###乗算
```
mull src
```
EAXレジスタの値をsrcで掛け、演算結果の上位4バイトをEDXレジスタ、下位4バイトをEAXレジスタに格納する

###除算
```
div src
```
EDXレジスタとEAXレジスタをつなげたもの（EDX:EAXとします）をsrcで割り、商をEAXレジスタ、余りをEDXレジスタに格納する

###インクリメント, デクリメント
```
inc dest
dec dest
```
destに対してインクリメント, デクリメントを行う

###減算（条件分岐用）
```
cmp dest, src
```
subと同じ演算を行うが、結果は保持されず、破棄される
フラグレジスタの変更が主な目的

##データ転送命令
###値の代入
```
mov dest, src
```
destにsrcの値を代入する

###値の代入（アドレスから）
```
lea dest, src
```
まずsrcのアドレスを計算し、その結果をdestに格納する

###値の交換
```
xchg arg1, arg2
```
arg1とarg2の値を交換する

##スタックの操作命令
###値の追加
```
push arg
```
ESPレジスタの値を4バイト減算し、argの値をESPレジスタが指すスタックの場所に格納する

###値の取り出し
```
pop dest
```
ESPレジスタが指すスタックの場所の値をdestに格納し、ESPレジスタを4バイト加算する

##bit演算
###シフト
```
shl dest, count
shr dest, count
```
shlは左に、shrは右に、destをcount分シフトする

###ローテート
```
rol dest, count
ror dest, count
```
rolは左に、rorは右に、destをcount分ローテートする

###論理和
```
or dest, arg
```
destとargの論理和を計算し、結果をdestに格納する

###論理積
```
and dest, arg
```
destとargの論理積を計算し、結果をdestに格納する

###排他的論理和
```
xor dest, arg
```
destとargの排他的論理和を計算し、結果をdestに格納する
同じレジスタ同士のxor（例えば、xor eax, eaxなど）を行い、レジスタを0で初期化することがある

##分岐
###ジャンプ
```
jmp arg
```
argの値が指すアドレスをEIPレジスタに格納することで、処理を分岐させる
ジャンプ命令には、jz（ゼロフラグ=1のときジャンプ）, jae（桁溢れのフラグ=0のときジャンプ）など、様々な種類がある
jmpは無条件で分岐

###コール
```
call arg
```
jmpと同じように分岐するが、分岐した先で後述するretを行うと元の実行位置に戻ってくることができるよう、EIPレジスタの値をスタックにpushするという動作も行う

###リターン
```
ret
```
callで分岐した処理の最後に用いられ、スタックからEIPレジスタへ復帰アドレスをpopする

##最後に
いかがでしたか？こうして見ると、意外とアセンブリの命令は見やすい（当社比）ことが分かりますね！
今後は、本記事では省略したレジスタの説明や、呼出規約、スタックについてなどを書ければな、と思います。

明日の記事は！うえきさん！よしなにです〜
Request Highlighterを使って目を労ろう

これはシーエー・アドバンス Advent Calendar 2021 18日目の記事です。
17日目の記事は @fukushi_yoshikazu さんの [エンジニアが詐欺サイトに引っかかるまで](https://qiita.com/fukushi_yoshikazu/items/547453b07924a5bd2a90) でした。
明日の記事は @arakawa_moriyuki さんです。


こんにちは！
シーエー・アドバンス（CAAD）技術統括本部セキュリティチームの @inahuku_shingo です。
昨日の @fukushi_yoshikazu さんの記事は、誰もがうっかり引っかかってしまいそうな出来事を注意喚起させてくれるいい記事でしたね！
まだ読んでいない方はぜひ読んでみてください！

# 目がつらい…
さっそくですが、みなさん脆弱性診断でつらいことはなにかご存知ですか？

それは目の疲れです。

今回はそれをちょっと軽減できる（かもしれない）Tipsをご紹介します。
脆弱性診断を開始してまずやることの一つは、BurpSuiteというツールを使って診断対象の通信（リクエストとレスポンス）を拾っていく作業です。

# BurpSuiteの履歴画面
BurpSuiteに通信が流れてくるように適切に設定すると、ツールの履歴画面に大量のログが表示されます。
脆弱性診断では、そこから診断対象となるURLを探し出す必要があります。

例えば、Qiitaにログインしていない状態でトップ画面にアクセスすると、これくらいのログが履歴画面に表示されます。

|![image-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141077/a8bbbdc4-46cc-298f-de94-eb69c63fd3f9.png)|
|:-:|



備え付けのフィルター機能を使えば、確認したいドメインや特定の文字列で絞り込むことはできますが、サイトにアクセスしたときの通信全体の流れを把握することが難しくなります。
そのため、フィルターをかけずに確認することになるのですが、ログをずっと追っていくと目がどんどん疲れていきます…。

そこで、BurpSuiteの拡張機能「Request Highlighter」を使います！
https://portswigger.net/bappstore/11729a617d8d4d3b87c82e34b71885c3

これは、設定した文字列が含まれるリクエストを自動で色付けしてくれるため、ひと目で把握しやすくなります。
例えば、先程の画面で設定するとこうなります。

|![image-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141077/87733c6b-983f-be3c-931e-e6649b766977.png)|
|:-:|

色がついてわかりやすい！しかも自動で付けてくれます！
トップ画面にアクセスしたあと、どういう通信が発生しているかとてもわかりやすいですね。
BurpSuiteを使っていて、ログを追うために目を酷使している方は使ってみてはいかがでしょうか…！

# 他の効能
この拡張機能を設定しておくと、
・診断対象のURLの見落としを防ぐ
・対象外URLを間違えて診断してしまうことを防ぐ
・複数ドメインをまたぐ処理の流れを把握しやすい
といった効能もあるのでオススメです！

それでは、ハッピーな脆弱性診断ライフを:thumbsup_tone3::thumbsup_tone3:
AWSのPersonal Health DashboardからSlackへ通知を受け取る方法

##概要
AWSのPersonal Health DashboardをトリガーとしてSlackへ通知を促す構成を考える。
方法は以下のパターン
トリガー  →  Amazon eventbridge  →  AWS SNS  →  AWS Chatbot  →  Slack
AWS SNSの代わりにLambdaを採用することもでき、
柔軟なメッセージのカスタマイズができるが料金がすこし高くなる想定

料金

・EventBridge 
https://aws.amazon.com/jp/eventbridge/pricing/
AWS のサービスによって発行されたすべての状態変更イベントは無料

・SNS
毎月最初の 100 万 Amazon SNS リクエストは無料
この上限を超えた後の料金は 100 万 リクエストごとに 0.50USD
https://aws.amazon.com/jp/sns/pricing/

・Chatbot
https://aws.amazon.com/jp/chatbot/pricing/
無料

##構成図
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878032/48267805-9f02-4f69-11ac-c59ff330384d.png)


##構築方法
リージョンをバージニア北部に選択する

Amazon SNSより「トピックの作成」をクリック
タイプをスタンダードに選択
名前と表示名を適当なものに
暗号化の有効化にチェックを付ける
あとの設定項目はデフォルトで作成


Amazon EventBridgeより「ルールを作成」をクリック
名前を適当なものに
イベントパターンにチェックを付け
サービスごとの事前定義パターンにチェック、サービスプロバイダーにAWS、サービス名にhealth、イベントタイプにすべてのイベントを選択
ターゲットに作成したSNSを選択し
機能に作成したSNSの名前を選択する
あとの設定項目はデフォルトで作成


AWS Chatbotより「新しいクライアントを設定」をクリック
Slackを選択し、認証ページより認証する
設定済みクライアントより「Slack ワークスペース: 【クライアント名】」をクリックし新しいチャネルを作成をクリックする
設定名を適当なものに
Slack チャネルより通知したいチャネル名を選択
アクセス許可にてロール名を入力する
Channelガードレールのポリシー名には「CloudWatchReadOnlyAccess」ポリシーを選択する
通知 - オプションのSNS トピックより作成したSNSがあるリージョンを選択し、トピックより作成したSNSを選択する
あとの設定項目はデフォルトで作成


##説明
>リージョンをバージニア北部に選択する

https://docs.aws.amazon.com/ja_jp/health/latest/ug/cloudwatch-events-health.html
グローバルサービスからのイベント(Statusが-のもの)を受信するためには、
米国東部 (バージニア北部) リージョンのルールを作成する必要がある。
東京リージョンなどのイベントを受信したい場合は、東京リージョンにEventBridgeとSNSのみ追加で作成する。

>タイプをスタンダードに選択

FIFOはSQSのみサポートされているのでFIFOにしようとすると下記のようなエラーが出る
FIFO SNS Topics are not supported (arn:aws:sns:ap-northeast-1:414400812947:test.fifo)

>暗号化の有効化にチェックを付ける

とりあえず有効化

>Channelガードレールのポリシー名には「CloudWatchReadOnlyAccess」ポリシーを選択する

https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-chatbot-management-resources-slack/
ガードレールポリシーはSlack チャネルから直接 AWS リソースを管理する際のアクセス許可のための機能
通知しかしないのであれば特に権限を持たせる必要なしで適当につけているだけ

##テスト
Personal Health Dashboardに通知を出すことはできないため、気長に通知が来るのを確認するしかないです。。。
ですが上記構築方法に従って実装すれば問題ありません！！
hubコマンドをインストールした後、設定したトークンを変更したいとき

hub使ったことなく、設定したとき調べたことの備忘録。

```
$ brew install hub
$ hub
github.com username:
github.com password:
```
インストール後このような入力を求められるが、MFA (多要素認証) を有効化している場合は、password の部分に personal access tokenを入力する必要があります。

のちほどトークンを変更したくなった場合、 `~/.config/hub` を開けば、設定したものが記録されているので、コマンドでもテキストエディタでもいいので書き換えれば完了!

![貼り付けた画像_2021_12_17_18_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47240/c669f8fc-bf3f-1eb7-e2eb-d36cac4a2960.png)
Firestoreで集計したい

# この記事について

[株式会社Diverse Advent Calendar2021](https://qiita.com/advent-calendar/2021/diverse) 20日目の記事になります！

Firestoreは投げられないQueryというのが存在してます。
その一つが集計関数であるGroupByです。

使用できないがサービスを組み合わせて同じように
表現することは可能だと考えてまして今回はこの内容について触れようと思います。

# アプローチ内容
集計ができるデータストアを利用することです。

全体の内容としては以下です。
1. 集計対象のCollectionにFirebaseExtension([Stream Collections to BigQuery](https://firebase.google.com/products/extensions/firebase-firestore-bigquery-export?hl=ja))を設定しBigQueryへデータが流れるようにする。
2. Cloud Schedulerで集計タイミングを設定しておく
3. Cloud FunctionsでBigQueryへ集計Queryを投げ結果をFirestoreに入れる
 
![スクリーンショット 2021-12-17 16.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/14115110-e30a-a6dd-ea1e-1975a0a27c98.png)

# ユースケース
## 例
やりたいこと: 直近30日間の商品の購入ランキングトップ10をユーザに表示したい

### Firestoreのデータ構造

path: orders/{order_id}
<img width="200"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/bb949845-d2a4-2154-61a0-4d6e049714b6.png">

### BigQueryのデータ構造
Stream Collections to BigQueryを使用した場合対象のDocument内容はdataカラムにjson形式で入ります。
![スクリーンショット 2021-12-17 16.40.11（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/77779a58-d06a-1e97-46cb-b4ea0d9aafdb.png)

```json
{"product_id": 1,"createdAt": {"_seconds":1639720090,"_nanoseconds":181000000}}
```

### Code

```typescript

import { BigQuery } from '@google-cloud/bigquery';

interface SellRankingTableSchema {
    product: string;
}

export const createSellRanking = functions
    .region('asia-northeast1')
    .pubsub.schedule('0 0 * * *')
    .timeZone('Asia/Tokyo')
    .onRun(async () => {
        const bigQuery = new BigQuery();
        const dataSetId = 'firestore_export';
        const tableId = 'orders_raw_latest';
        const column =
            "JSON_EXTRACT_SCALAR(data, '$.product_id') AS product";
        const currentDate = new Date();
        currentDate.setDate(currentDate.getDate() - 30);
        const before30DaysUnixTime = Math.floor(currentDate.getTime() / 1000);
        const condition = `CAST(JSON_EXTRACT_SCALAR(data, '$.createdAt._seconds') as INT64) >= ${before30DaysUnixTime} GROUP BY product ORDER BY COUNT(*) DESC LIMIT 10`;

        const [rows] = await bigQuery.query(
            `select ${column} from ${dataSetId}.${tableId} where ${condition}`
        );
        const sellRanking: string[] = rows.map(function(row) {
            return (row as SellRankingTableSchema).product;
        });

        await admin
            .firestore()
            .doc('sellRanking')
            .update({
                products: sellRanking,
                aggregateDate: admin.firestore.FieldValue.serverTimestamp(),
            });
    });
```

## 注意点
商品が購入されるたびに集計しない。(Createトリガー起点
BigQueryではQuery実行のたび費用が発生するため。

# 最後に

やろうと思えばBigQueryを使用せずCloud Functionsのロジックでカバーすることは可能です。
ただ、正直めんどくさい匂いは感じます。
なので簡単に実現できる方法であればBigQueryからデータを取得、整形し参照する　FirestoreのDocumentにデータを入れることも実現手段の一つとして検討してみてはいかがでしょうか？
VRChatプレイヤーによるParticle System解説 ～Velocity over Lifetime Module編～

:::note warn
この記事はUnity 2019.4.29f1の記事です
:::
[Shape Module編](https://qiita.com/abcde_kind/items/e47a8f0c0f1077b314e6) <<  ここ  >> [Limit Velocity over Lifetime / Inherit Velocity Module編](https://qiita.com/abcde_kind/items/e502ab41ae26341545b9)
# はじめに
この記事は**ちょっとParticle System触れるようになったけどまだまだ知らないパラメーターだらけで抵抗感がある人向け**にじゃあ全項目解説しようという記事です。

**パーティクル？シェーダー？憧れるけどよくわかんない…**という人は最近は[VRCUnity勉強会][link-1]などで初歩の初歩から解説してくれる講座などが解説されているのでそこに参加してみたりするといいでしょう。
[link-1]:https://discord.gg/mtvTTyM
その他にこの記事はアドベントカレンダーにしてParticle Systemの記事を増やしてパーティクルへの抵抗感を減らしてやろうという企みもあります。

##Velocity over Lifetime Moduleってどこ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/e6ecb243-8f25-428a-de8a-c1880f7ed24b.png)
これ
##本題
###Linear
デフォルト (0,0,0)
単位 m/s
**パーティクルの生存中のスピードを制御するパラメーター(直線)**
Start Speedとは足し算される
###Space
デフォルト Local
**このModule中でのスピードの制御の基準座標を決めるパラメーター**
WorldにするとこのParticle Systemの動きに左右されない
###Orbital
デフォルト (0,0,0)
**パーティクルの生存中のスピードを制御するパラメーター(旋回)**
下のOffsetとセットで使う事が多い
文面だと分かりにくいが実際に使ってみると分かりやすい、あと面白い
###Offset
デフォルト (0,0,0)
単位 m
**このModuleの動きの中心をずらすためのパラメーター**
###Radial
デフォルト 0 (-3.402823e+38~3.402823e+38)
単位 m
**パーティクルを中心に向かって若しくは中心から離れる動きをさせるためのパラメーター**
###Speed
デフォルト 1 (-3.402823e+38~3.402823e+38)
単位 倍
**パーティクルのスピードにかかる倍率**
あくまでスピードにかかる倍率で<font color=red>動きにかかる倍率ではない</font>
#おわり
というわけでVelocity over Lifetime Moduleの解説でした
短い
もっと短い項目もあるのでそういうのはまとめて解説しようと思います
次はLimit Velocity over Lifetime Moduleの解説です
****
[Shape Module編](https://qiita.com/abcde_kind/items/e47a8f0c0f1077b314e6) <<  ここ  >> [Limit Velocity over Lifetime / Inherit Velocity Module編](https://qiita.com/abcde_kind/items/e502ab41ae26341545b9)
久々に開いたファイルで yarn.start したらハマった



#エラー内容

久々に開くプロジェクトをGit cloneしてスタートしようとしたら、突然怒られました。
1年も放置してたので多少環境メンテは必要と思っていましたが、意味不明だったので、私が解決できた方法を残しておきます。
（それぞれの解決法はネット検索で出てきた結果です。先人たちのおかげで生きてる。）

### 環境


```
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
    at new NodeError (node:internal/errors:371:5)
    at validateString (node:internal/validators:119:11)
    at Object.join (node:path:429:7)
    at noopServiceWorkerMiddleware (C:\Develop\awesome_webapp\node_modules\react-dev-utils\noopServiceWorkerMiddleware.js:14:26)
    at Layer.handle [as handle_request] (C:\Develop\awesome_webapp\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Develop\awesome_webapp\node_modules\express\lib\router\index.js:323:13)
    at C:\Develop\awesome_webapp\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Develop\awesome_webapp\node_modules\express\lib\router\index.js:341:12)
    at next (C:\Develop\awesome_webapp\node_modules\express\lib\router\index.js:275:10)
    at launchEditorMiddleware (C:\Develop\awesome_webapp\node_modules\react-dev-utils\errorOverlayMiddleware.js:20:7)
```

見た感じ、react-dev-utilsとかに問題がありそうですね。そんな感じかなと思って調べ始めたせいで墓穴を掘りました。
念のため、私には効果がなかった解決法も、調べた順番で記載しておきます。

## 解決法1:：react-scriptsのバージョンアップ

まず、react-scriptがpackage.jsonに含まれていない人は、この解決法は関係ないかもです。

`npm info react-scripts version`　で最新バージョンを調べます。

package.jsonで下記の部分を探します。

```
  "dependencies": {
    ....
    "react-scripts": "x.x.x", 
    ....
```
バージョンが異なっていたら、最新のバージョンにあげましょう。
package.jsonでバージョンを書き換えて、下記を実行します。

```
rm -rf node_modules
yarn install
yarn start
```

## 解決法2： react-dev-utilsのダウングレード

package.jsonで、`react-dev-utils`を探します。
バージョンが、 10.x.xと、10.0.0以上であれば、上記と同じ方法でpackage.jsonを書き換えて、インストールしなおします。

```
  "dependencies": {
    ....
    "rreact-dev-utilss": "10.0.0", 
    ....
```


```
rm -rf node_modules
yarn install
yarn start
```



## 解決法 3 /webpackDevServer.config.js を修正

 ./config/webpackDevServer.config.js　を確認します。

`app.use(noopServiceWorkerMiddleware());`
を
`app.use(noopServiceWorkerMiddleware('/'));`
に変更し、再度`yarn start`します。



私は解決法3をやっていなかったらずっとnpm installをやり直す沼にハマっていたことでしょう…

どなたかの参考になれば幸いです。



参考元
https://kenjimorita.jp/typeerror-err_invalid_arg_type-the-path-argument-must-be-of-type-string-received-undefined/
データ基盤の保守・運用はデータに怯えることから始まる(戦記①）

# 記事の作成背景
- データエンジニアリングができるデータサイエンティストになりたいと思い、現在、データエンジニアリングの勉強中
- 今回は**「データ活用基盤の保守・運用」のデータ集計**との戦いについて書きます

# データ活用基盤の構成
ここで紹介したいデータ活用基盤の構成の簡略したものを以下に示す。
<img width="数値" alt="代替テキスト" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2319295/56699aa4-21c1-ad34-6ce8-cd722d115b5b.png>
### 
-  データがAWSのS3に配置される
-  AWSのGlueのジョブ実行すると以下の処理が行われる
    1. AWSのS3に配置されたデータを取得
    - Snowflake にデータをロード
    - ロードしたデータをもとにデータを加工・集計
- TableauでSnowflakeのデータベースを参照し、データを可視化

# 今回はデータ集計の話
- 今回はあるデータ基盤の保守・運用の引き継ぎを受け、最初にぶち当たった壁の話をします
- データ集計の処理の仕組みについての例を簡単にまとめた図がこちら↓
<img width="数値" alt="代替テキスト" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2319295/2610eddb-4f6c-64c6-9d45-1969d12c363a.png>

#
実際は、上記のようなジョブが25~30個近くある。
可視化したいデータがあり、可視化のために必要なテーブルがない場合は、現状の仕組みでは、集計ロジックの追加開発を行いデータを再集計する必要がある。データの再集計時にはこれらジョブを手動で実行する必要がある。

#データ集計に必要なこと
1. いかに再集計に要する期間を短縮できるか
2. テーブル同士の依存関係を理解する(集計クエリを理解する）
3. ジョブの中身を理解する
上記について順に紹介

### 1. いかに再集計に要する期間を短縮できるか
新しい情報をTableau画面に表示するような開発は、データを再集計して対象のデータが表示される状態で納品をする。そのため、早くその情報が見たい場合に再集計の期間をできるだけ抑えることを考える。開発だけではなく、データに不備が発覚した場合は早くデータを正常な状態にリカバリする必要がある。このような場合において、どのジョブをどの順番で実行すべきか、実行の必要がないジョブはどれか、などを考慮しなければならない。
##### 集計を早める方法としては、主に以下の２択
- 効率よくジョブを実行する
- 集計を実行するSnowflakeに課金をして処理を早くしてもらう （次の記事でここふかぼる）

集計を早める方法として、最初に後者の課金を選択するのは賢くない
データエンジニアなら前者を考えて、できるだけベストを尽くす方が真っ当だし、スキルも上がる。
ただし、そのためには恐ろしく大変な次の２つをする必要がある。

### 2. テーブル同士の依存関係を理解する(集計クエリを理解する）
引き継ぎを受けたとき、理解するまっでに一番苦労したところです。
ドキュメントが特に整理されていたわけではないので、クエリを読んでテーブル同士の関係を読み解いて理解するしかない。
（鬼畜だと思ったけれど実はこれが一番自分のSQLのスキルを爆上げしてくれた）
データ集計に不備があった際に、これを理解していなければ、どこが原因箇所なのか見当すらつけることができない

##### 「テーブル同士の依存関係を理解する」は、データ基盤の保守・運用の心理的ストレスを減らす方法の一つだ！
テーブルについて質問があったとき、引継ぎ当初の私は答えられない自分にとても落ち込み、質問されるのがとても怖くなってしまったことがありました。データの不備がわかった時は、誰かに押し付けたくなるほど、このプロジェクトに恐怖感を抱いていました。**解決方法は「わからないところを理解する」ことに向き合うの一択**でした。

それに努めた結果、「全部理解するぞー！」と思う心理状態に変わりました。

### 3. ジョブの中身を理解する
ジョブの中身を理解することは、テーブル同士の依存関係を理解することとは少し異なります。
#
- テーブルがそもそもS３、Snowflakeのどちらにあるのか、Athna、Snowflakeどちらで集計を実行しているのかを理解する
- ジョブ内で実行されるクエリはどれかを理解する

「2. テーブル同士の依存関係を理解する(集計クエリを理解する）」ができていれば、これはお手の物ですね。


####  「仕事に怯えずに、仕事を楽しくやるために、いろんな意味での成長を得るために、やるしかないのです。」 

# まとめ
**データ基盤の保守・運用はデータに怯えることから始まる(戦記①）**どうでしたか。
急ぎ足で書いた記事ですが、データ基盤の保守・運用で闘う世界の皆にエールをこの記事から送るぞぉお！！


# 補足
- なぜAWSGlueのツールの一つ「ワークフロー」を使わない？
    - データの過去分を再集計する場面では、期間にもよるが、ワークフローを使用せず手動でジョブを動かした方が集計に必要な期間を短縮することができるため
    -　デメリット：ジョブを見張る必要がある、
    -　メリット：追加開発で取得したい目的のデータが得られているかを確認しながら集計ができる

## 次回は以下の3本だて
- 「AWS CLIからジョブを監視する方法：　ブラウザからのポチポチ、ブラウザとの睨めっこはやめないかい？　」の巻
- 「Snowflakeのクレジット溶は、スキル成長が大前提」の巻
- 「再集計範囲を最小限に抑える方法: Viewを使え！」の巻
C#で楽しいゲーム作り講座　シーン編

シーン。聞いたことありますよね。Unityで,SIV3Dで。仕組みは単純です。いろいろ構成を変えてお気に入りの、自分だけのシーンを作っちゃいましょう！

#シーンとは

タイトル画面、設定画面、ゲーム画面などを切り替えるためのクラス。ただそれだけ。しかし、アルトナイトじゃ大違い！
hyojimanとかinputinは以前の講座でやってますのでそちらを参照くださいまし。

#シーンには何が必要？

そんなものはシーンなしで作った奴から移植するだけです。フレーム毎の処理（画面表示とかインプットとか）だけあればいいと思いますね。それとシーンを切り替えるためもクラスが必要ですね。そいつはどうすればいいかというと。

```C#:SC

class SC
{
 Scene s;//力技だけどここを切り替えるといい感じにシーン変更ができる。
}

class Scene
{
SC sc;
hyojiman hyo;
public Scene(SC sscc)
{
 sc=sscc;

}

protected void kirikae()
{
sc.s=new Scene(sc);
}
public void frame(inputin i)
{
 hyo.hyoji();
 if(i.ok(Keys.Escape,itype.down))kirikae();
}
}

//~~~~Formの方では
public void ticked(Eventargs e)//タイマーがティックしたときのイベント
{
sc.s.frame(input);//フレーム処理を行う
}
```

sc.sにシーンを格納し、それを切り替えることによってSceneを転換できます。ただそれだけです。切り替えにエフェクトが欲しいならkirikae();のところで書いたりするのがいいと思います。
ちなみに、もっといい方法があるかもしれませんので僕はこうやってるよって話で。

#どんなシーンがある？
タイトル、設定、キャラセレクトなどのインフラに加えてストーリーと言うかお話を表示するためのシーン(ポーズに流用できたり)、ゲーム本体のシーンとそれをつなぐためのシーンがあったりします。
コンストラクタはだいたいSCだけですが、ポーズ画面を出す場合なんかは背景にゲーム画面の静止画を映しておきたいので表示するためのクラスをコンストラクタで渡していたりします。

#その他
ステージを生成するとか、背景を生成するとかそういう使いまわすようなメソッドはstaticでつくるか、protectedにして子クラスで使用できるようにしておくと便利ですねぇ。
VSCodeにおけるLaTex環境構築(mac)

## 概要

mac上のVSCodeでlatexを使えるようになるまでの手順を紹介する．

https://github.com/James-Yu/LaTeX-Workshop/wiki/Install

## 1. Tex Liveのインストール

Mac用の`Tex Live (MacTex)`は次のリンクからダウンロードできる．

https://www.tug.org/mactex/mactex-download.html

ダウンロードが終わったら，インストーラにしたがってインストールを行う．

ダウンロードとインストールには１時間以上かかる．

## 2. LaTeX Workshopのインストール

VSCodeの拡張機能である`LaTeX Workshop`をインストールする．


## 3. settings.jsonに設定を追加する

settings.jsonの開き方は以下を参照．

https://qiita.com/y-w/items/614843b259c04bb91495

settings.jsonに次を追加することで，保存時に自動的にpdfを生成してくれるようになる．

```jsonc

  // latex settings
  "latex-workshop.latex.tools": [
    {
      "name": "Step 1: ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-interaction=nonstopmode",
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOCFILE%.tex"
      ]
    },
    {
      "name": "Step 2: pbibtex",
      "command": "pbibtex",
      "args": [
        "%DOCFILE%",
        "-kanji=utf8"
      ]
    },
    {
      "name": "Step 3: ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-interaction=nonstopmode",
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOCFILE%.tex"
      ]
    },
    {
      "name": "Step 4: ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-interaction=nonstopmode",
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOCFILE%.tex"
      ]
    },
    {
      "name": "ptex2pdf",
      "command": "ptex2pdf",
      "args": [
        "-interaction=nonstopmode",
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOC%",
      ]
    }
  ],
  "latex-workshop.latex.recipes": [
    {
      "name": "make_ptex2pdf",
      "tools": [
        "ptex2pdf"
      ]
    }
    // {
    //     "name": "toolchain",
    //     "tools": [
    //         "Step 1: ptex2pdf",
    //         "Step 2: pbibtex",
    //         "Step 3: ptex2pdf",
    //         "Step 4: ptex2pdf"
    //     ]
    // },
  ],
  "latex-workshop.view.pdf.viewer": "tab",
  "latex-workshop.latex.autoClean.run": "onFailed",

```

bibを含めてpdf化したい場合は，`make_ptex2pdf`ではなく，`toolchain`の方を用いる．

https://gist.github.com/Ikuyadeu/204d06fffd912f441b383eb02463e29b

## 4. latexindentのインストール

```shell
brew install perl
brew install cpanm
cpanm Log::Log4perl Log::Dispatch::File YAML::Tiny File::HomeDir Unicode::GCString
```

https://zenn.dev/ganariya/articles/vscode-latex-indent
Auth0認証を組み込む方法を考える

## Auth0

最近はIDaaSと呼ばれる、アプリケーションに必要な認証周りを提供してくれるSaaSがでてきており、大変便利な世の中になりました。一番気を使う認証部分を丸投げできるのはホントと助かります。


**Auth0** は、IDaaSの中でもWebアプリケーションに組み込みやすく、カスタムの幅が広いのが特徴です。

今回はAuth0の導入について取り上げたいと思います。

ただAuth0導入すると言っても、アプリケーションの状況によって、**考えるべき視点**がありますので、それらの視点と、**パターン別にどう考えられるか**をまとめてみます。

## 考えるべき視点
大きく３つ挙げてみました。

####ユーザーデータベース
 → ユーザーを認証をするためには、認証で参照する**データベースが必要**です。それを**どこで管理するか**を検討します。

####アプリケーションとの連携
→ ユーザーを認証した後、その認証情報をアプリケーション側で扱う際に、**Auth0側およびアプリ側で、それぞれどんな情報を持つべきか**を検討します。

####ログインセッション
→ 認証されたユーザーが、現在もログインしているかどうか = **ログインセッションの管理手法**について検討します。

上記視点について、ありそうなパターンで考えてみました。


##新規アプリケーションに１からAuth0を導入する場合
このパターンが、Auth0を導入する際に一番考えることが少なくなるでしょう。全部Auth0に任せてしまいましょう。

####ユーザーデータベース
Auth0側で**デフォルトで存在するデータベースが用意されている**ので、それを利用することができます。Auth0提供のWeb管理画面で、登録から削除まで操作可能です。各種APIも用意されていますので、アプリケーション側からでも操作可能です。

また認証以外の、**名前や会社名など任意の拡張情報**も、json形式で `user_metadata` に保持できます。
権限など書き換えられては困る情報については、`app_metadata` に保持することができます。

####アプリケーションとの連携
Auth0側の**ユーザー識別子**( `user_id` )は、 auth0| で始まる、16進数での文字列になっています。アプリケーション側では、その `user_id` に紐づくデータ設計にする必要があります。

####ログインセッション
Auth0側でログイン状態を確認できるSDKが用意されていますので、アプリケーション側は、Auth0側で用意されたSDKやAPIを利用するのがよいでしょう。

##既存アプリケーションにAuth0を組み込む／リプレイスする場合
**既に認証が存在する既存アプリケーションにAuth0を導入する場合**は、既存の認証に何らかの理由があってでしょうから、**Auth0側に何をしてもらうのか**を定義する必要があるでしょう。

例えば、既存のアプリケーションA、アプリケーションBで、それぞれのユーザーデータベースで認証しているものを、**全てAuth0に統合一本化する ＝ SSOを実現したい**、なんてパターンを想像して考えてみましょう。

####ユーザーデータベース
AとBではそれぞれ独自のユーザーデータベースが存在するので、認証を一本化するにあたり、どちらのユーザーデータを引き継ぐのか、両方マージするのか、SSOとして新しいIDを発行し使用するのか等、十分に検討しましょう。

Auth0では、**独自のデータベースへ接続して認証する手段**（javascript）もありますし、Auth0のデータベースへインポートする手段もありますので、**既存アプリケーションの認証情報を引き継ぐ**事もできます。

####アプリケーションとの連携
ABどちらも一本化した認証を使う場合、認証された情報から、ABそれぞれの**アプリケーション独自のユーザー識別情報を取得できるようにする**必要があるでしょう。一番の肝ですね。

Auth0で用意されるユーザーデータベースでは、ユーザー毎に `app_metadata` にユーザー識別情報を保存することができます。 

Auth0の`Rules`を使用することで、`app_metadata`に対して、アプリケーション毎にアクセスできる情報を制限する等も可能です。

####ログインセッション
既存アプリケーションのログインセッション管理をリプレイスすることは、影響範囲も大きく、恐ろしく骨が折れます。

ですのでアプローチとしては、**認証のみAuth0で行い**、認証成功したら既存アプリケーション側で**対応するユーザーのログインセッションを生成**、あとは既存アプリケーションの仕組みをそのまま利用する形が現実的ではないかと思います。これはSSOとしても一般的なやり方ですね。

##まとめ

今回はAuth0を導入検討するにあたり、考えなければいけない触りを記載しました。実際に考えなければならないことは、アプリケーションの数だけバリエーションがあるでしょう。

そして今回は省いていますが、コスト面も考えなければなりません・・・。それなりに利用者がいるとかなりかかります。

Auth0はとても優秀でおすすめできますが、導入前に考えることの参考になれば幸いです。
Jetpack Composeの学習にBloomはどう？

今年の7月にJetpack Composeが正式リリース（1.0）となり、本格的にプロダクトに利用されるようになってきました。
がっつり使っているよ！という方も、これから勉強していくよ！という方もいると思います。
Jetpack Composeの勉強にとても役立った課題について書かせていただきます。

## Bloom is :thumbsup:

[Android Dev Challenge: Week 3 - Speed round](https://android-developers.googleblog.com/2021/03/android-dev-challenge-3.html)のAPAC向け課題が**Bloom**というアプリを時間内に作成するというものでした。
この課題の良かった点を上げていこうとおもいます。

### Android Dev Challenge - Jetpack Compose 
2021年の5月におこなわれたAndroid Dev Challengeは、Jetpack Composeを利用し限られた時間内に課題にそったアプリを作成し提出するという開発者向けチャレンジ（全4回）です。
商品もあったので、私も結構楽しんで参加していました。（もう募集期間は終わってますよ。）

https://developer.android.com/events/dev-challenge

## デザイン資料が良い:slight_smile:
Bloomのアプリにはデザイン資料が用意されています。
このデザイン資料には、アプリ内で使う色（Light / Dark）、Font、Assets、Flow（画面遷移）、コンポーネント配置、といったアプリの実装に必要なデザインが一通り用意されています。
この情報を元に、アプリの実装を進めていく事で、Styleの設定方法や、各コンポーネントの使い方を理解する事ができます。

そして、Material Design が意識されたデザイン資料が嬉しかったりもします:blush:

![bloom-design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/2a456dbc-d0d9-bfba-1f2e-0f495f9ac807.png)


https://github.com/android/android-dev-challenge-compose/blob/assets/Bloom.zip


## アプリのロジック処理について学べる

画面遷移や、ボタン押下処理、縦リスト表示、横リスト表示など、Jetpack Composeで学ぶ必要のある仕様がたくさん含まれています。
ダークテーマやライトテーマといった、今後のアプリ実装には取り入れていきたい部分もあるので、一つ一つ実装していくととても勉強になります。


## お手本がたくさんある

Githubには、Android Dev Challengeに参加したかたのリポジトリがたくさん公開されています。

同じ課題で作られたアプリもたくさんあるので、実装に行き詰まったときには、他の方の実装を参考にしてみてください。

https://github.com/search?p=2&q=Android+Dev+Challenge%3A+Week+3&type=Repositories

私のつくったBloomも公開していますので、興味のあるかたは参考にしてみてください。

https://github.com/sokume/Bloom

## 〆

Advent calendarが終わると、年末になり、時間がちょっと多く使える方もいるとおもいますので、Bloomに取り組むのはいかがでしょうか？
Jetpack Composeを学ぶ良い課題ですので、興味のある方は取り組んでみてください。

Bloomを題材に、オンラインのハンズオン会とかも良いんじゃないかと思っている今日この頃です:thinking:
興味のある方は[@sokume](https://twitter.com/sokume)に声かけていただければと:dog:

では、良いプログラミングライフを:dancers:
Docker PHPコンテナのタイムゾーンをAsia/Tokyoに設定する 個人メモ

# 目的

- DockerのPHPコンテナのタイムゾーンをAsia/Tokyoに設定する方法をメモ的にまとめる

# 方法

- 下記の一行をPHPのDockerfileに記載する。

    ```Dockerfile
    ENV TZ=Asia/Tokyo
    ```

- `$ docker-compose up -d --build`コマンドなどでビルドし直すと反映される。
実務でよく使うPHP8系 文法

PHP8がリリースされてから
なんだかんだ実務でよく使う新文法を羅列しました

# 名前付き引数
```php
    function funcA(
        int $hoge = 0,
        int $fuga = 0,
        int $foo = 0,
        int $bar = 0,
        int $buzz = 0
    ) {
    }

    $this->funcA(foo: 20, fuga:3);
```
https://www.php.net/releases/8.0/en.php#constructor-property-promotion

# コンストラクタでの、プロパティのプロモーション
```php
    public function __construct(
        protected Staff $staff,
        protected Customer $customer
    ) {
    }

    // これだけで下記を書いたことになる
    // $this->staff = $staff;
    // $this->customer = $customer;
```
https://www.php.net/releases/8.0/en.php#constructor-property-promotion

# Nullsafe 演算子
下記はLaravelの場合です

```php
$user = User::whereNotNull('name')
->get()
?->toArray()

// Laravelのクエリビルダーに生えるget()は
// 検索にヒットすればEloquentCollection
// 検索にヒットしなかった場合nullを返してくるので
// 検索結果に依存してtoArray()が実行できるか変わってくる。

// nullのチェックのifを書くのも面倒なので、
// Nullsafe 演算子をtoArray()に付けることで
// $userがnull or 配列かを得ることができる
```

https://www.php.net/releases/8.0/en.php#saner-string-to-number-comparisons


# 最後に
PHP8.1の機能を使えてないなーと思ったりしてます。
せっかくの新機能なので使わないともったいない!
そこはチャレンジでバンバン使っていきたい気持ちです！
GoogleCloudでできる環境問題対策 - 脱炭素のススメ -

#はじめに

はじめまして、SE1年目のりんご娘（仮名）です。温かい目で読んでいただけたら幸いです。
また、本記事は[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp)の19日目として執筆したものです。
よろしければ合わせてご覧ください。

#脱炭素とは？
脱炭素、という言葉を耳にしたことがない方はいないのではないでしょうか。
脱炭素問題は昨今特に話題になっている環境問題の1つであり、地球温暖化に貢献してしまう二酸化炭素等の温室効果ガスの排出をなくそう、という世界的な取り組みです。
日本でも政府によって2050年に温室効果ガス排出を実質ゼロにする目標が掲げられています。
これに伴い民間企業や自治体もさまざまな取組みを進めています。

#クラウド化で実現できる脱炭素
では、ITの観点で脱炭素化に貢献できることはないでしょうか?
もちろんあります。
本記事で紹介する方法は、クラウドサービスの活用です。

クラウドサービス利用によって脱炭素化が叶うポイントは大きく分けて3点です。

1. **必要な時に必要なリソースを使用できる**
2. **データセンターの電源使用効率が非常によい**
3. **クリーンな電力を使用**

今回はサク読みしていただくために詳細は割愛いたしますが、詳しくは[NI+C Technical Blog あなたの「脱炭素」、クラウドで実践してみませんか](https://www.niandc.co.jp/sol/tech/date20211118_2107.php)に記載してるのでぜひご一読ください！


#脱炭素化にGoogle Cloudがおすすめな理由
Googleは他の代表的なIT企業と比較しても、環境問題対策に積極的です。
例えばGoogleでは2017年以降、電力の100%を再生可能エネルギーでまかなっています。
世界中で使われているサービスがクリーンな電力によって動いているなんてすごいですよね。
([参考：100% 再生可能エネルギーを 4 年連続で達成](https://cloud.google.com/blog/ja/products/infrastructure/google-achieves-four-consecutive-years-of-100-percent-renewable-energy))

また、Google Cloudの大規模データセンターはGoogle得意の機械学習により、2021年に**PUE＝1.1**を達成しており、PUEのさらなる改善が図られています。
PUEとはデータセンターの電力効率を示す指標です。国内のデータセンターのPUE平均＝1.7に比較しても小さい値であり、電力効率の良さが示されています。


さらに実際にGoogle Cloudでプロジェクトを管理する際にも、脱炭素を意識した選択ができます。
[Google Cloud Region Picker](https://googlecloudplatform.github.io/region-picker/)というサービスでは、「CO₂排出」、「コスト」、「ネットワークレイテンシ」の3つの指標を選択することで、プロジェクト作成時に最適なリージョンを表示してくれます。
![Google Cloud Region Picker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392918/7bab9db7-33a5-b8ec-4e85-f3f792059e08.png)


#おわりに
いかがだったでしょうか。簡単にではありますが、Google Cloudで脱炭素化に貢献できるということをご紹介させていただきました。
オンプレミス環境からクラウドサービスに移行すると物理的にモノを減らして炭素を削減できるだけでなく、日々の使用エネルギーの観点からも脱炭素を実現できます。そんなクラウドサービスの中でもGoogle Cloudは優秀であり、日々アップデートされています。
ぜひGoogle Cloudを導入し企業としての脱炭素化をスタート、加速させてみてはいかがでしょうか。

最後までご覧いただきありがとうございました。
[devise][sorcery]ActionCable内でcurrent_userを使えるようにする方法

簡単に認証機能を実装できる`devise`, `sorcery`それぞれの`current_user`メソッドをActionCableにて使えるようにする方法を記載します。

## 前提

1:1のチャット機能を想定しております。

ActionCableの導入や説明などは割愛させて頂きます。

それぞれ`app/channels/application_cable/connection.rb`に記述していきます。

## devise

```rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      reject_unauthorized_connection unless find_verified_user
    end

    private

      def find_verified_user
        self.current_user = env['warden'].user
      end
  end
end
```

`identified_by`...クライアントとサーバーとの関係を成立させる基礎であるコネクションを識別するためのキー

## sorcery

```rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verfied_user
    end

    protected

    def find_verfied_user
      if current_user = User.find_by_id(request.session[:user_id])
        current_user
      else
        reject_unauthorized_connection
      end
    end
  end
end
```
Chromeのデベロッパーツールを使ってデバックする（基本）

※本記事はざっくりとした説明ですので、詳細は参考に掲載した公式ドキュメントに載っているのでそちらをご覧ください。
## はじめに
デバックの流れとしては、ブレイクポイントの設定 -> 実行 となっている。

まずはデバックを行うためにデベロッパーツール > sourceを開く。ここでブレイクポイント設定や実行を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/0c6ffb96-2286-10bf-b1c9-a5a5e19f6d41.png)

## ブレイクポイントの設定
ブレイクポイントの指定方法としてはいくつか方法がある。今回は基本なのでイベントと、ソースの2種類を紹介する。

1. イベント
上図内の右パネルでEvent Listener Brakepointsを設定することで
指定したイベントが発生したときに処理を一時停止させるブレイクポイントを置くことができる。
ex.クリックイベントをブレイクポイントとして指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/f013f2ec-0400-9488-96c5-84f0ca11df84.png)

2. ソース
上図内の左パネルから目的のファイルを開いて、真ん中のパネルで止めたい行をクリックすることで
指定した行の処理が走るときに一時停止させるブレイクポイントを置くことができる。
ex.32行目をブレイクポイントとして指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/7301c61f-48cc-7d79-07a5-8cbebcdcfb0e.png)
 
## 実行
ブレイクポイントが設定できたら、デバックしたいイベントや処理を実行する。
ブレイクポイントで処理が一時停止し、パネルは以下のようになる（32行目で一時停止）。
右パネルのScopeには入っている変数の値を見ることができ、想定した値どおりかが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/8ff42e7f-c834-3fc9-9851-793b26d0a19f.png)

addend1 + addend2 = sum について1+2=3にしたいのに1+2=12になっていたので直したい！というように修正したい場合は
コードをその場で書き換えて本来欲しい値が取れるようになったかを確かめることができる。（黄色マーカーが書き換えたところ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/c088c1d1-53b6-eea4-b51f-fda041746103.png)


## 参考

https://developer.chrome.com/docs/devtools/javascript/
GASで最終行を取得するメモ


よく使うのにいつも忘れるのでメモ。

## 最終行と書いてますが、データが入っている最終行です。

```js
function myFunction() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');

  const maxRng = sheet.getRange(sheet.getMaxRows(), 1);
  const lastRng = maxRng.getNextDataCell(SpreadsheetApp.Direction.UP);
  const lastRow = lastRng.getRow(); //データが入っている最終行
  
  console.log(lastRow);
}
```


（厳密な最終行、デフォルト1000件的なのを取得したいニーズってどれくらいあるんだろうか）

## リテールでもスプレッドシート使いますよね？

ということでカレンダーに入れてみました。

## 参考

何回もこの記事にお世話になってる気がする。

[【GAS】1行で書ける！特定列の最終行・特定行の最終列を取得する方法](https://moripro.net/gas-get-specified-lastcol-lastrow/)
元箸屋が教育担当になって気づいたゲームテスト研修での進め方・伝え方について

#まずはじめに…この記事について

AIQVE ONE株式会社で教育担当をしております、りこりうすと申します。
今回は<strong>【研修をあまり知らずに教育担当になった】</strong>私の
主に新入社員の研修やゲームテストの研修を行ってきた中で気づいた進め方、
伝え方の記事となります。


##自己紹介
私はこの業界に入る前は、箸屋で接客をしておりました。
※前職は入社した際、研修がほとんどありませんでした。

AIQVE ONEに入ってからは、テスターを経験して教育担当になりました。
今は新入社員に対する研修や、ゲームテストをどのように行っていくかを日々伝えています。
その中で学んだことはとても多く、今も勉強の途中なところもあります。


####研修を進める中で気づいたこと

私が担当している研修は様々ありますが、
テストを実行する研修の際には下記の手順でお話をしています。


・テストを消化する際に使う物の説明（仕様書、テストケース、実機等）
・テストを消化する上での順序（仕様把握、テストケースを消化、バグ等が見つかれば起票等）
・テストケースの記載説明（入力方法を説明）
・実際に作成した物を確認したり、過去にあったテストケースを消化した際の話を紹介


また、私が担当している研修の参加者には、
この業界に何年もいらっしゃる方や、未経験の方、様々な経歴の方が一緒に受ける研修もあります。
中には、今まであまりPCを使ったことがない方もいらっしゃいます。

そのような様々な研修を担当していき、お伝えしていく中で、
研修に限らず、人へ何かを伝える上で重要だと感じたことは、

####「無知の可能性を考えながら話や内容を進める」
ということでした。


実は、箸の持ち方説明をする際や、何かを行う上での計画にも、同様のことがあるのですが、
どんな簡単なことでも、「相手はきっと知っている」という自己の認識から説明等を始めてしまうと
認識違い等のトラブルの恐れがあると感じたのです。


####例えば…

例えば、誰かに箸の持ち方を説明をするときにこのような説明をすることがあります。

<strong>「1本は親指と薬指で支えながら挟み、もう1本は鉛筆の持ち方をする」</strong>


しかし、これだと1つ問題が発生してしまいます。それは、
<strong><font color="red">「鉛筆の持ち方が人によって変わってしまう可能性があること」</font></strong>です。
持ち方を教えている方は、正しい鉛筆の持ち方を知らない可能性があるため、
それに通じて箸の持ち方を正しく伝えられない恐れがあるためです。







以前勤務していた時にこの問題に直面し、考えた結果

<strong>「1本は親指の付け根の間に挟みながら薬指で支え、もう1本は親指、人差し指、中指の3本で持つ」</strong>
と、実際に箸を使って持ち方を説明することになりました。





これは、実は<font color="red">ゲームテスト</font>の中でも、同様に言えることがあります。
※あくまで極端な例です。

初めてゲームテストをする人達が、テストケースの項目で、

<strong>`「画面をスワイプさせて【ホーム】の表示を見る」`</strong>

という記載や説明を見たとします。

ここで、「スワイプ」という言葉がわかる方は、意味を理解し、
ホームの表示がどのようになっていくかを確認すると思います。

しかし、ここで「スワイプ」という言葉がわからない人は
「スワイプ」というものがどのような物なのかを理解してから表示を確認します。
恐らくは、リーダーや周りの方に確認を取ってからホームの表示を見ることになると思います。


ここでわかることは、
<strong>「同じゲームテストをしたことがない人によっても、ゲームテストを行う、行わないの前提で
つまずいてしまう人もいるかもしれない」</strong>ということです。
つまり最初にお伝えする説明や、研修の段取りも同様に、
<strong><font color="red">「経験、未経験関係なく、何も知らない人にもわかる説明をすること」</strong></font>が、鍵になってくるのです。



##まとめ
十人十色という言葉があるように、人によって経験してきたことも、考えていることも変わります。
そのため、自分自身は内容を理解していたとしても、
伝えるときにわかりにくい進め方や伝え方になることもあります。


この記事が、人に何かを伝える立場にある人や、これから誰かに伝える機会が増える人の
お役に立てれば幸いです。
ヤフー・データソリューションのデータをMotionBoardで可視化する

MotionBoardを開発しているウイングアーク１ｓｔ株式会社の高橋です。
開発では主にデータの取得や加工に関する機能を担当しています。

今回は[ヤフー・データソリューションのDS.API](https://ds.yahoo.co.jp/) を利用してMotionBoardで可視化する方法をご紹介します。
接続の構成は次の図のとおりです。
内部で [Yahoo! JAPAN DATA SOLUTION JDBC Driver](https://www.cdata.com/jp/drivers/yahoods/) を利用しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/3998cec1-c2c7-6d47-4035-c173291e92cd.png" width="90%">

MotionBoardはCData社のDriverを組み込んで外部連携を強化しています。
Driverは"アダプター"と呼ばれるプラグインとして提供しており、Yahoo! JAPAN DATA SOLUTION アダプター は昨日公開したばかりの新しいアダプターとなっています。
(注) 投稿時点ではオンプレ版限定となります。クラウドでご利用になりたい場合はお問い合わせください。

## 接続手順 

では、早速MotionBoardからYahoo! JAPAN DATA SOLUTIONのデータを可視化してみたいと思います。
まずは公開されている[Yahoo! JAPAN DATA SOLUTION アダプター] (https://cs.wingarc.com/ja/system_requirement/000021603?__CAMCID=INIMfQhNyH-133&__CAMI=3.3.0.1.ccPQffGfOiEe.kp8zUUyxXk51Xmaa-58&__CAMSID=kp8zUUyxXk51Xmaa-58&__CAMVID=ccPQffGfOiEe&_c_d=1&_ct=1639724956721)をダウンロードして、MotionBoardに組み込みます。
所定の位置に配置してMotionBoardを再起動すると、以下のように外部接続設定にYahoo! JAPAN DATA SOLUTIONを新規接続先として利用できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/5fa48b43-a268-9f0f-5046-30be74e542c7.png" width="40%" >
詳しくはダウンロードしたファイルに同梱されている readme.txt をご参照ください。

接続設定の画面です。
基本的にはアプリケーションIDを入力するだけで利用できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/c2b80f1f-6c6f-7293-e4fa-f4441bcfaa56.png" width="60%">

## 可視化の例

接続先の設定ができれば、あとはMotionBoardで可視化するのは簡単です。
以下はデータソースを指定する画面です。APIのエンドポイントがデータベースのテーブルリストのように表示されます。
画面は SearchTrend を選択した状態です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/2f0522bf-d070-4851-2137-07e256ed6664.png" width="60%">

いくつかのパターンでデータ取得して可視化してみます。
まずはSearchRankingを使って2020年に良く検索されたキーワードを性別や年代別に可視化してみたボードです。
APIにいくつかの条件を渡すことでデータが取得できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/a766e44b-3d49-fdb8-0c76-880a30ee737b.png" width="80%">
やはり「新型コロナウイルス感染症(COVID-19)」に関連するワードが多く検索されていたことがわかります。


そこでさらに深堀りして「新型コロナウイルス感染症(COVID-19)」の感染者数と検索の推移を時系列で確認してみたいと思います。
感染者数のデータは厚生労働省の[オープンデータ] (https://www.mhlw.go.jp/stf/covid-19/open-data.html) 、検索の推移はDS.API の SearchVolumeを使います。
感染者数"と関連しそうないくつかのキーワードをそれぞれグラフ化してみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/de2a29ae-82e5-2841-6523-5aa785e868e6.png" width="80%">
波形として比べることができるようになりましたが、波形同士の関係が直感的に捉えにくいのが難点です。

MotionBoardではレイヤーチャート機能を使うことで、グラフ同士を重ねて合わせて表示することができます。ここでは試しに"感染者数"と"テイクアウト"を重ねてみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288304/5ddd3f3b-f470-5edc-067d-ac059892a1ad.gif" width="80%">
いかがでしょうか。感染者数の増加から少し遅れてテイクアウトの検索が増えてきているのが見てわかります。
このように MotionBoard を使うことで、DS.APIのビッグデータと他のデータの関係性を容易に確認することができました。

## まとめ

MotionBoardは色々なデータベースやサービスのデータを結合して可視化する事ができる製品です。
表現方法はグラフは当然のことながら、地図や３Ｄもあります。
是非一度お試しいただけますと幸いです。
もし標準版に組み込まれていない接続先がありましたら、カスタムアダプターも作る事は可能ですので、ぜひお問い合わせください。