OmniAICreator/Qiita-1.07M huggingface dataset:
[Prisma] チートシート

## 概要
Prismaを使ったプロジェクトを半年くらい担当していたが、そのプロジェクト離れることになったのでまた使う時のためのメモ

**公式ドキュメント**

[prisma-client](https://www.prisma.io/docs/concepts/components/prisma-client)
[Prisma Client API reference](https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#model-queries)

https://www.prisma.io/



## CRUD

|メソッド | アクション  |メモ  |
|---|---|---|
| create  |作成 |   |
|createMany  |一括作成  | bulk insert |
|findUnique  |取得  | 一意の識別子またはIDを指定する必要がある |
|findFirst  |取得  | 条件に一致する最初のレコードを取得 |
| findMany  |複数件取得  | 条件に一致する全てのレコードを取得 |
| update  |更新 | 1.条件に一致するレコードを更新 <br>2.一意の識別子またはIDを指定する必要がある |
| updateMany  |複数件更新 | 条件に一致する全てのレコードを更新 |
| upsert   |作成・更新 | 条件に一致するレコードが存在していれば更新、していなければ作成する |
| delete   |削除 | 条件に一致するレコードを削除する |
| deleteMany   |複数件削除 | 条件に一致する全てのレコードを削除する |

```ts:example
// ageが20のuserを取得
prisma.user.findMany({
  where: {
    age: 20,
  },
})

// idが22のuser名を'taro'に変更
prisma.user.update({
  where: {
    id: 22,
  },
  data: {
    name: 'taro'
  }
})
```

#### query options
| 名前 | 内容 | ノート |
|---|---|---|
| select  |レコードのフィールドを指定 ||
| include  |  レコードに含めるリレーションの先を指定 ||
| where  | 任意のプロパティでフィルタリング  ||
| orderBy  | レコードのリストを並べ替える  ||
| skip  | 任意の数レコードをスキップする  ||
| take  | 指定したレコード数を取得する  ||
| cursor  | レコードの取得位置を指定  |IDまたは別の一意の値を指定します |





#### Filter conditions and operators

演算子とそれぞれの条件

|演算子 | 条件 | ノート |
|---|---|---|
| equals  | 値が等しいか | |
| not  | 値が等しくないか  |  |
| in  | リストに存在するか  |  |
| notIn  | リストに存在しないか   | nullのフィールドのものは所得できない |
| lt  | n未満  | 数値や日付など |
| lte  | n以下 | 数値や日付など |
| gt  | nより大きい | 数値や日付など |
| gte   | n以上 | 数値や日付など |
| contains   | 含んでいるか |  |
| startsWith   | xから始まるか | 前方一致 |
| endsWith   | xで終わるか| 後方一致 |
| AND   | 複数の条件に一致するか | リストで指定する |
| OR   | 1つ以上の条件に一致するか | リストで指定する　|
| NOT   |複数の条件に一致しないか |リストで指定する |

#### Relation filters

|演算子 | 条件 | メモ |
|---|---|---|
| some  | いくつかのフィルタ条件に一致するか | |
| every  | 全てのフィルタ条件に一致するか  |  |
| none  | 全てのフィルタ条件に一致しないか  |  |
| is  | フィルタ条件に一致するか |  |
| isNot  | フィルタ条件に一致しないか |  |

```ts:example
// ageが20以上のuserを取得
prisma.user.findMany({
  where: {
    age: {
      gte: 20
    },
  },
})

// idが22のuser名を'taro'に変更
prisma.user.update({
  where: {
    id: 22,
  },
  data: {
    name: 'taro'
  }
})

// jobがTeacherかEngineerのuserを取得
prisma.user.findMany({
  where: {
    job: {
      some: {
        in: ['Teacher', 'Engineer']
      }
    },
  }
})
```

## 感想
Prismaはプレビューの機能があったりまだまだ発展途上のORMだと感じましたが、すごく直感的に操作ができて使いやすかったです。
他の機能も使用する機会があれば追加していきます。

## 最後に
アルサーガパートナーズ Advent Calendar 2021 12日目は @1zushun さんのターンです。:tada:
ブロックデバイスからqcow2を作る

qemu-imgではddのサブコマンドが使えます
以下のコマンドで/dev/sdaからoutput.qcow2を作ります

```Bash
qemu-img dd -f raw -O qcow2 bs=16m if=/dev/sda of=output.qcow2
```

## オプション説明
```Bash
-f raw #入力フォーマット指定(ブロックデバイスのためRaw)
-O qcow2 #出力フォーマット指定(今回はqcow2)
-bs #一度に読み書きするブロックサイズ指定(ある程度まとまった単位の方が高速に読み書き出来る)
```

## 参考
https://qemu.readthedocs.io/en/latest/tools/qemu-img.html
Java学習初日 

通常プログラムを実行する時には、最終的に各プラットフォームに対応したネイティブコードに変換されて実行されるが、このネイティブコードが各プラットホームごとに違うため、あるプラットホームで動いていたプログラムが、別のプラットホームでは動かない。

この問題をJavaはJava仮想マシンと呼ばれるソフトウェアを使うことで、見事に解決した。Javaのソースコードはコンパイルすると、バイトコードと呼ばれる中間コードに変換されます。バイトコードが書かれたファイルをクラスファイルといい、Javaのプログラムはクラスファイルの状態で配布されます。
コードレビューの負担を減らすためにマジリク（プルリク）を分割してみた

この記事はエイチーム引越し侍/エイチームコネクトの社員による、Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021 14日目の記事です。

どうも。エイチームコネクトのエンジニア、@mfuzです。今一番欲しいものはエンボディチェアです。

皆さんはコードレビューを投げてもなかなか帰ってこないなと思ったことはないでしょうか。
それはもしかすると、マージリクエスト（プルリクエスト）の内容があまりよろしくなかったのかもしれません。

そこで、コードレビューの負担を減らすためにマジリク（プルリク）を分割してみたので、そのことについて書いていきたいと思います。

# Diffがごちゃごちゃしてつらい
施策には複数の機能の組み合わせでなりたっていると思います。
これまでは施策単位でブランチが作られているため、
Diffに複数の機能が散りばめられ、レビューの際に処理を追うのが辛くなっていました。
そこで、いっそブランチを機能別に分けてみようと思いました。

コミットで整理する手もあるかと思いますが、
レビュー後に追加が発生した際に、そこだけが切り離された状態になってしまいます。

# 機能別にブランチを分けてみる
## cherry-pickでもってくる
機能別にファイルが分割されていればこの方法だけでできます。
機能別にブランチを作り、大本の作業をしているブランチからそれぞれで`cherry-pick`します。
ですが、同一ファイルを編集していると`cherry-pick`する際にコンフリクトが発生してしまいます。

## 共通branchつくる
別々の機能で同じファイルを参照する必要があるビューのファイルや設定ファイルなどは、
それらのファイルのみのブランチなどのわけてあげると良いです。
そのブランチから各機能のブランチをつくるとコンフリクトは発生しづらくなります。

# やってみて感じたメリット・デメリット
## メリット
極力コンフリクトを避けるような方針で設計をするので、コードとファイルが整理された気がしました。

## デメリット
慣れるまで時間がかかります。

# さいごに
コードレビューの負担を減らすためにマジリク（プルリク）を分割してみた。いかがでしょうか？
まだまだ試行錯誤中ですので、他に良い案があれば教えていただけるとありがたいです。

明日は@tanimoto-hikariさんが担当します。お楽しみに！
toioリモコンアプリをUnity SDK v1.4.0に対応した話

[toio Advent Calendar 2021](https://qiita.com/advent-calendar/2021/toiotomo) 14日目です。

[toio SDK for Unity](https://github.com/morikatron/toio-sdk-for-unity/)の学習用に、簡単なリモコンアプリを作っていまして。
それをSDK v1.4.0リリースに合わせて更新した話をします。

![image_001_0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/8ebb195c-12bc-2f12-1c2e-b07d3fb6ef35.png)

https://morikatron.com/t4u/2021/11/30/toio-sdk-for-unity-ver1-4-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/

モーター制御と、取得できるセンサー情報はひととおり画面に表示しています。

SDK v1.4.0で、念願の[BLEプロトコルバージョン v2.3.0](https://toio.github.io/toio-spec/docs/how_to_update_cube#20210421)に対応されまして、具体的にはローカルネーム表示、磁力センサー、姿勢角検出（今回アドベントカレンダーでみんな書いてるから食傷気味…）に追加対応しました。

やっていることはSDKのサンプルと大して変わらないのですが、自分の学習目的と、あとはウチの小さい子でも理解して触れるインターフェースというのを心がけています。
まぁ子供に姿勢角のオイラーとかクォータニオンとかわからないでしょうけども！ :stuck_out_tongue_winking_eye:

# SDKバージョンアップ手順
意外とやり方忘れがちなので、自分の備忘も兼ねて書いておきます。

1. プロジェクトのtoio-sdk, ble-plugin-unity, WebGLTemplatesフォルダを削除
2. https://github.com/morikatron/toio-sdk-for-unity/blob/main/docs/download_sdk.md#sdk-%E3%81%AE%E8%BF%BD%E5%8A%A0 のとおりunitypackageを入れる
3. Macから直接リアルキューブに接続する場合はhttps://github.com/morikatron/toio-sdk-for-unity/blob/main/docs/usage_macble.md も実施。
あるいは、1.でここで入れるbundleだけは削除しない

# 他、今回更新したところ
## RequestSensorリネーム
モーションセンサーの更新を要求する`RequestSensor`（v1.2.1でワシがPRした :grin: ）が`RequestMotionSensor`にリネームされています。
追加された磁気センサー要求`RequestMagneticSensor`、姿勢角検出要求`RequestAttitudeSensor`に合わせた形かなと思います。

> 'Cube.RequestSensor(Cube.ORDER_TYPE)' is obsolete: 'RequestSensor is deprecated. Use RequestMotionSensor instead.'

## 開発時にInspectorでシミュレータ接続、リアルキューブ接続を切り替えやすくする

詳しくはこちらに。

https://qiita.com/zurachu/items/334f1e0d1b7cee98f32e#gui%E3%81%A7%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

# Android版

https://play.google.com/store/apps/details?id=com.zurachu.toioremote

iOS版は…Apple税を払うのが面倒なのでリリースしていません :sweat_smile: 

# リポジトリ

https://github.com/zurachu/toio-remote
職業訓練通い始めるまでの道のり

<h1>はじめに</h1>

投稿がすごく飛んでしましたが先月職業訓練校を卒業しました!!
これからプログラムを学びたい方やどこのプログラミングスクールしようかとお悩みの方に少しでもお役に立てれば幸いです。<hr>

<h1>職業訓練校に入る前の手続き</h1>

1.<b>ハローワークに登録</b>

職業訓練校は、厚生労働省が運営を行なっているのでハローワークへの登録が必要です

2.<b>ハローワークにて職業訓練校の検索・応募</b>

ハローワークにて職業訓練校は結構、種類があり、開講時期や訓練期間の長さも違いがあります。また近隣の他府県の訓練校も受講も可能なので早めに検索を行なって、希望の訓練に参加できるように予定を組むことをお勧めします！

https://www.hellowork.mhlw.go.jp/kensaku/GECA150010.do?action=initDisp&screenId=GECA150010

2.<b>職業訓練校での面接</b>

近年、職業訓練校の認知度も高まってきたみたいで毎年、倍率が上がってきているみたいです。ちなみに私の訓練校は15人の枠に対して40人以上の応募があったみたいです。
(面接内容はまた別の記事にする予定です）

3.<b>面接合格後</b>

特にやることはないのですが、事前学習はしといておいた方がいいかもしれません。私もそうでしたが、事前学習していない分野はわからないと言うよりも何がわからないかわからないと言う状況に陥ります。笑
よって質問したくても何を質問したらいいかわからず質問すらできません。事前に授業のカリキュラムは、わかると思うので予習をお勧めします。
[React]ループ表示でkeyにindexを使うのをやめよう

## なぜkeyにindexを使っってはいけないか

まず、`key`に`index` を使うことはできてしまいます。エラーとなることはなく、
コンソールに**ワーニング**が出ます。
こちらは無視することはできますが、それはいけません。
なぜなら、`React`の特徴でもある **差分更新**ができなくなってしまうからです。
`index`というのは表示する順番に依存するため、その度に意図せず変更されてしまいます。
そのため、例えばリストの真ん中に新規のデータを挿入したい時でもその部分だけ更新するのが期待値ですが、
そうはならず、リスト全体が更新されてしまいます。
データが多いリストであればこれはパフォーマンスにも影響を与えてしまうので、無視することはやめましょう。

##keyにはユニークな値を使う
この表題のルールを守るだけで、より良いパフォーマンスになり正しい差分更新ができます。
一般的には、DBと接続しているシステムであれば`id`を利用することが多いかと思います。
他では値そのものが被る可能性がなければ、それも良いかもしれないです。
大切なことは`ユニーク`な値を使うことです。

##　リストそれぞれユニークであれば良い
こちらはそれぞれのリスト表示でユニークであれば良いので、他のリストを考慮しなくて大丈夫です。
そのループ内でのみ適用されます。


##　最後に
レビューの際など、`key`に`index`を使っている方がいたら指摘しましょう！


ありがとうございました。
個人的なモバイル向けのアイコン対応

# 前提
- 色んな記事あるけど、個人的にこれでいいやといった内容を整理
- リリース時にしか対応しないので、しばらくやらないと忘れるので半分以上自分用

# 手始めに
1. まずは1024x1024でアイコン素材を作成（ココは自力で頑張る）
    2. iOSは矩形（勝手に丸みを帯びてくれる）  
    ![icon_ios.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/45ec7c8d-0382-18e9-ecb4-5e4787b6e9df.png)
    3. Androidは角に丸み（勝手に丸みを帯びてくれない）
        - （個人的にphotoshop的にradius:200px）   
    ![icon_android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/bc60e78e-670d-2286-c3d1-e75d50977628.png)

2. 各種アイコン作成は便利サービスを利用させていただき、必要な全サイズのアイコンを生成：[App Icon Resizer](https://resizeappicon.com/)

## AdaptiveIcon
- AndroidでプルプルするAdaptiveIconというものがあるので、それ用のものを以下のサイトを参考に作成
    - [AdaptiveIcons](https://adapticon.mariusclaret.com/)


# Player Setting周り
## Android
コチラとても参考にさせていただきましたmm（感謝
[Unityで制作したゲームを公開するために必要な設定「Player Settings」を徹底解説（Android版）](http://unitynightowlgames.hatenablog.com/entry/2016/10/12/175140)


# 参考
- [3分で分かる？Android OのAdaptive Iconに対応しよう](https://qiita.com/takahirom/items/696fb5ecaa230fa8f755)
.gitignoreファイルによる除外方法

gitignoreファイルによるファイル・ディレクトリの除外方法がわからなかったので、忘れないうちに記載しようと思います。

#概要
gitignoreファイルは、ワークツリーの任意の場所に.gitignoreというテキストファイルを作り、
特定の構文を.gitignoreファイルに記載することで、ファイル・フォルダをGitの追跡対象から除外する事ができる。
結果、git add の実行時に、インデックスに追加されないようになる。

#例）ディレクトリ構成
```
親フォルダ
|
|---.gitignore
|
|---file（ファイル）　
|
|---directory1（フォルダ）
|      |
|      |-----file（ファイル）
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル）
```


#書き方
#①ファイル・ディレクトリ名のみ（file、directory 等）

.gitignoreファイルを配置したフォルダ（親フォルダ）以下の全ての※サブディレクトリを対象に、同名のファイルorディレクトリを除外する。

　例）

```
　#.gitignoreファイル記載項目
file
```

```
//除外対象　★
親フォルダ
|
|---.gitignore
|
|---file（ファイル）　←　★
|
|---directory1（フォルダ）
|      |
|      |-----file（ファイル）←　★
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル）←　★
```


#②末尾に「/」＋ディレクトリ名を指定（directory1/　等）

.gitignoreファイルを配置したフォルダ（親フォルダ）以下における全ての※サブディレクトリを対象に,同名フォルダを除外。
※正確には、ファイルを配置したフォルダ（親フォルダ）以下における全ての同名フォルダ内にあるファイルを除外する。
末尾の「/」は、「ディレクトリとその配下の除外」を意味する記号となる。仮に同じ名前のファイルが存在しても除外対象にならない。

　例）

```
　#.gitignoreファイル記載項目
directory１/
```

```
//除外対象　★
親フォルダ
|
|---.gitignore
|
|---file（ファイル）　
|
|---directory1（フォルダ）←　★
|      |
|      |-----file（ファイル）←　★
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）←　★
              |
              |-----file（ファイル）←　★
```


#③先頭に「/」＋ファイル・ディレクトリ名（/file、/directory１/file 等）

.gitignoreファイルを配置したフォルダ（親フォルダ）をカレントディレクトリとし、相対パスで指定する同名ファイルorフォルダを除外する。

　例）

```
　#.gitignoreファイル記載項目
/file
```

```
//除外対象　★
親フォルダ　←カレントディレクトリ
|
|---.gitignore
|
|---file（ファイル）　←　★
|
|---directory1（フォルダ）
|      |
|      |-----file（ファイル）
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル）
```


#④末尾と末尾以外に「/」＋ファイル・ディレクトリ名（/directory１/ 等）

.gitignoreファイルを配置したフォルダ（親フォルダ）をカレントディレクトリとし、
相対パスで指定する同名ファイルorフォルダを全て除外する。

　例）

```
　#.gitignoreファイル記載項目
/directory１/
```

```
//除外対象　★
親フォルダ　←カレントディレクトリ
|
|---.gitignore
|
|---file（ファイル）　
|
|---directory1（フォルダ）←　★
|      |
|      |-----file（ファイル）←　★
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル）
```


#⑤先頭に「！」＋ファイル・ディレクトリ名（!file　等）
これまで記述した指定から例外的に除外対象から外す。

例）

```
　#.gitignoreファイル記載項目
file
!/file
```

```
//除外対象　★
親フォルダ　←カレントディレクトリ
|
|---.gitignore
|
|---file（ファイル）　←　▲（除外対象外　Gitの追跡対象になる）
|
|---directory1（フォルダ）
|      |
|      |-----file（ファイル）←　★
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル）←　★
```


#⑥「*」　ワイルドカード（.txt　等）
指定した拡張子をまとめて除外対象にできる。

例）

```
　#.gitignoreファイル記載項目
*.txt
```

```
//除外対象　★
親フォルダ　←カレントディレクトリ
|
|---.gitignore
|
|---file（ファイル　拡張子.txt）　←　★
|
|---directory1（フォルダ）
|      |
|      |-----file（ファイル　拡張子.pdf）
|
|
|---directory2（フォルダ）
       |
       |---directory1（フォルダ）
              |
              |-----file（ファイル　拡張子.txt）←　★
```



【参考サイト】
サブディレクトリについて
https://wa3.i-3-i.info/word14116.html

gitignoreについて
https://www-creators.com/archives/1662
https://qiita.com/anqooqie/items/110957797b3d5280c44f
https://comsco.co.jp/technic/git02_gitignore.php
DoubleDescentを知る

# はじめに
<!-- 発端や概要を記載 -->
 近年話題になったDoubleDescentについて興味を持ち、調査していくと[こちら](https://arxiv.org/pdf/1912.02292.pdf)の論文に行きつきました。
自身の理解を深めるためにも、日本語で要約したいと~~考え、この記事を書きました。~~思っていたのですが著作権的にアウトなので簡単な紹介だけしようと書きました。
[数日前に投降したResNet18についての記事](https://qiita.com/teacat/items/d6b24fb5353872f6b3a3)はこの論文内の実験に少しだけ関係あるものなので気が向いたらそちらも読んでいただければ嬉しいです。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Double Descentとは](#Double Descentとは)
1. [論文概要](#論文概要)
1. [終わりに](#終わりに)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
# Double Descentとは
古典的な統計的学習理論によればbias-variance trade-offによってモデルは大きすぎても過適合となり汎化性能は低下するというという考えが一般的でした。
しかし、経験則的にはそのような現象は起こらず、大きいモデルのほうが良い性能を発揮することが多くありました。
あれれ～おかしいぞ～
となりましたが実は前者の理論(曰くlarger models are worse)に従う領域と後者の理論(曰くlarger models are better)に従う領域があり、二つの考えは実は相反しないことがわかりました。これに従って、モデルが大きくなるにつれて汎化性能が上がる(言い換えればtest errorが小さくなっていく)が一定より大きくなると汎化性能が下がる(言い換えればtest errorが大きくなっていく)が、また一定の大きさを超えると汎化性能が上がるという現象が観察でき、この現象はBelkin氏らによって“Double Descent”と呼ばれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338148/f87fb45b-e176-aea2-c0c4-5ffd12b91094.png)
> Deep Double Descent: Where Bigger Models and More Data Hurt より引用

引用した画像ではResNet18を用いていますが、“Double Descent”を日本語で訳せば二重降下であるように、横軸でモデルが大きくなるにつれて二度Test Errorが降下しています。この画像の実験ではモデルの大きさを変えるにあたり、各層の出力チャネル数を[1*k,2*k,4*k,8*k]にしていてk=64のとき一般的なResNet18と同等です。
出力チャネル数がわからない場合[数日前に投降した記事](https://qiita.com/teacat/items/d6b24fb5353872f6b3a3)が役に立つかもしれません(ダイマ)
# 論文概要
書誌情報は以下のようになっています

 - タイトル
    - Deep Double Descent: Where Bigger Models and More Data Hurt
 - 著者
    - Preetum Nakkiran, Gal Kaplun, Yamini Bansal, Tristan Yang, Boaz Barak, Ilya Sutskever
 -  学会
    - ICLR2020
 - URL
    - https://arxiv.org/pdf/1912.02292.pdf

この論文はHarvardの学生だったNakkiran氏がインターン時に書いたそうです。(何を食べればインターン先で論文が出せるのでしょうか...)
この論文の新規性?をざっくりとまとめると

 - “Double Descent”に対して統一的な指標を作り一般化を試みた
    - 統一的な指標:データの分布、モデルの複雑さや学習手法をまとめてEMC(Effective Model Complexity)を定義
    - EMCを基に仮説を提唱
 - モデルの大きさの他に学習の進みでもDouble Descentが起こることを示した(Epoch-wise Double Descent)
 - 以下を様々に組み合わせてDouble Descentを実証
    - アーキテクチャ(ResNet18, CNN etc)
    - データセット(CIFAR-10, CIFAR100 etc)
    - 最適化関数(SGD, Adam)

となっています。
言い換えれば、EMCの値の変化によってDouble Descentの動きが起こると仮説を立てている。また、このEMCから学習の進みに対してもDouble Descentが起こる。そしてなによりモデルの大きさ、学習の進みそれぞれの対してDouble Descentが起こるかどうかを先ほど引用したグラフの実験を筆頭に、様々な実験条件で試した。というのがこの論文のざっくりとした内容です。
ちなみに、論文内ではlebel noise という正解ラベルを一定確率で別なものに変える操作をしたときにDouble Descentを顕著に観察できている。しかし、Label NoiseがDouble Descentの直接の要因ではなくモデルの誤判定によるものであり、Label Noiseはあくまでデータセットの分布を難しくし、モデルの誤判定を増加させているだけと論文内で述べられています。
# 終わりに
間違っているところがあれば気軽にマサカリ投げてもらえると嬉しいです。
この記事はアドベントカレンダー前日にお酒を飲んで死んでいるため後日更新があります。

2021/12/31 更新済み。年内滑り込みセーフ。よいお年を。
# 参考文献
- [Deep Double Descent: Where Bigger Models and More Data Hurt](https://arxiv.org/pdf/1912.02292.pdf)
- [Reconciling modern machine learning practice and the bias-variance trade-off](https://arxiv.org/pdf/1812.11118.pdf)
Githubをただのバックアップストレージとして使うバッチファイル【悪用厳禁】（Windows）

#きっかけ
https://qiita.com/taptappun/items/e499dfa937cd8f04d74d

こちらの記事を読んで自分でもやってみたくなった。
記事ではNode.jsを用いてスクリプトを作られているが、バッチファイルでもできそうだなーと思ったので、今回はバッチでやってみた。

#Githubの仕様
100MB以上のファイルはプッシュできないらしい。検証すると50MB以上のファイルでも警告が出た。

#作ったもの

今回作ったバッチは二つ。
①ファイルをバイナリ単位で分割してgit pushするバッチファイル（push.bat)
ファイルの容量が50MBでも警告が出たので、とりあえず40MBごとに分割するようにした。
分割されたファイルの部分たちは「target」ディレクトリ内の「ファイル名_File」というディレクトリに格納されてpushされることになる。

②分割されたファイルを結合するバッチファイル（connect.bat)
先ほどの①の逆の動作をするバッチファイル。git cloneの機能は面倒だったので省いた。
「ファイル名_File」ディレクトリ内のファイルを結合する。

#コード

```bat:push.bat
mkdir target
for %%i in (*) do (
copy %%i .\target
)
cd .\target
for %%i in (*) do (
split -b 41943040 %%i %%i.copy.
mkdir %%i_File
for %%j in (%%i.copy.*) do (
move %%j .\%%i_File
)
del %%i
)
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin %1
git push -u origin main
```

```bat:connect.bat
setlocal enabledelayedexpansion

for /d %%i in (*_File) do (
set dirname= %%i
cd !dirname!
copy /b * !dirname:~0,-5!
move !dirname:~0,-5! ..\
cd ..\
rd /s /q !dirname!
)
```

やってることは超単純。

#使い方
push.bat
①githubで適当にリポジトリを作る。
ここは理解している前提。URLも取得しておく
②適当にディレクトリを作る。
ディレクトリ内のすべてのファイルを分割してpushする仕様なので、例えばデスクトップで実行しないよう注意。
③コマンドプロンプトを起動して、②のディレクトリに移動する
④分割&pushしたいファイルをすべて②のディレクトリにコピーする。
仕様上、ディレクトリの分割は不可であり、ファイルの分割&pushしか対応していない。
ファイルだけ移動させること。再帰的なコードを書けばいいんだけど、めんどくさかったー。
⑤第二引数に①で取得したURLを指定して、push.batを実行する。
うまくいけばgit pushされるはず

connect.bat
①git cloneでバックアップしたデータを取得する
②ディレクトリに移動し、connect.batを実行する

#注意。最後に言うのもなんだけど
・先ほども言ったが、ディレクトリの分割&pushには対応していない。ファイルならいくつ並べてもいいけどディレクトリは不可。
例えば写真をアップロードしたいならpush.batを実行するディレクトリにそのままドラッグ＆ドロップしてほしい。
・規約違反ではないらしいけど、ぶっちゃけモラル的によくない使い方。やるなら自己責任で。やらないほうが良いかも。
ていうか、そもそも実用性はほぼない。あくまで実験である。

気が向いたらディレクトリのpushにも対応したバージョンを書こうと思います。
Mapbox GL JS で グローエフェクトを実現

#グローエフェクト描いてみた
[Mapbox ブログ](https://blog.mapbox.jp/n/n631895b30a5f)で紹介されている、グローエフェクト。
とても表現がかっこいいので、ブログにあるMapboxスタジオでの実現方法を真似して、Mapbox GL JSで描いてみた。

## グローエフェクトとは
>「グロー(発光)エフェクト」とは、John M. Nelson氏が開発したカートグラフィー(地図製作)の手法のひとつで、マッピングしたデータを発光しているかのように表現するテクニックです。 （# Mapboxブログより引用）

ぼかした円をいくつか重ねた上で、中央に白いポイントを置いてあげることで（これがポイント）、光り輝くような表現を実現します（しているようです）。

## 結果
かっこいい。
![mapbox_glow_effect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311291/f82610ab-4fb1-9063-8de6-29ba91c9bb51.png)

## コード（グローエフェクト部分）
[コード全文はこちら](https://jsfiddle.net/uq1zvhns/)

```js
// データは手抜きで、turf.jsによる、randomPoint
const points = turf.randomPoint(10000, {bbox: [138.5, 35.6, 140.5, 37]}) 

// データを addSource
map.addSource('points', {type: 'geojson', data: points})

// 大きめの円をぼかして描画
map.addLayer({
  id: 'Glowy things 1',
  source: 'points',
  type: 'circle',
  paint: {
    'circle-color': '#6ff77c',
    'circle-radius': 10,
    'circle-blur': 3,
    'circle-opacity': 0.4
  }
})

// 少し小さめの円をより鮮やかな色で描画
map.addLayer({
  id: 'Glowy things 2',
  source: 'points',
  type: 'circle',
  paint: {
    'circle-color': '#00ff37',
    'circle-radius': 5,
    'circle-blur': 3,
    'circle-opacity': 0.4
  }
})

// 最後に、真っ白な円を1pxで描画 （ここがポイント）
map.addLayer({
  id: 'Glowy things 3',
  source: 'points',
  type: 'circle',
  paint: {
    'circle-color': '#ffffff',
    'circle-radius': 1,
    'circle-blur': 0,
    'circle-opacity': 1
  }
})
```


# 参考
https://blog.mapbox.jp/n/n631895b30a5f
Googleスプレッドシートで様々な通貨を日本円に換算する

GOOGLEFINANCE関数では、米ドル、ユーロ、豪ドルなどの様々な通貨を日本円に換算することができます。
現在の為替レートを自動取得するので、為替レートを手入力する必要はありません。
上記機能を使えば、例えば米国株の時価評価額を日本円に換算して表示する、ということも可能です。
![20211211_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2377902/ab4f8441-4ef1-3c50-eb11-d63b0d3c5c55.png)


# 為替レートを取得する
為替レートは以下のように取得します。

| 為替    | 関数（画像のC列に入力）             |
|:-------:|:---------------------------------:|
| USD/JPY | =GOOGLEFINANCE("CURRENCY:USDJPY") |
| EUR/JPY | =GOOGLEFINANCE("CURRENCY:EURJPY") |
| AUD/JPY | =GOOGLEFINANCE("CURRENCY:AUDJPY") |
| HKD/JPY | =GOOGLEFINANCE("CURRENCY:HKDJPY") |
| ZAR/JPY | =GOOGLEFINANCE("CURRENCY:ZARJPY") |

# 日本円に換算する
日本円への換算は対象通貨の「保有額」と「為替レート」を掛け算します。
画像にある USD (米ドル) を例にすると以下のようになります。

```
$123.00(保有額) × 113.40(為替レート) ＝ 13,948円
```
そのため、D2セルの中身は<code>=B2*C2</code>となります。

# 米国株の時価評価額を日本円に換算する
上記の「保有額」の値を米国株の時価評価額(USD)に置き換えれば、米国株の時価評価額が日本円に換算されます。
米国株の株価を取得する方法については関連記事をご参照頂ければ幸いです。

# 関連記事
* [Googleスプレッドシートで米国株の株価を取得する](https://qiita.com/WhimsicalTheo/items/6811bd81ab4e814c8d1f)
* [Googleスプレッドシートで米国株の株価推移をSPARKLINEで表示する](https://qiita.com/WhimsicalTheo/items/c8c01ecf3ad063b507f4)
* [Googleスプレッドシートで米国株の配当利回りを取得する](https://qiita.com/WhimsicalTheo/items/401790003a20253eed08)

以上、最後まで読んでいただき、ありがとうございました。
PHPで変数名に変数を使用する

＃ PHPで変数名に変数を使用するには
変数名にキー値を付けたい場合は<b>可変変数</b>を使用する。

```
$image_sub_0_hoge
$image_sub_1_hoge
$image_sub_2_hoge としたい場合
```

変数宣言でエラーになる

```php
for($i=0; $i < 3; $i++){
  $image_sub_$i_hoge = $i; //ここでエラー
  echo $image_sub_1_hoge;
}
```

## 可変変数で書いて解決

```php
for($i=0; $i < 3; $i++){
    ${"image_sub_".$i."_hoge"} = $i;
}
echo $image_sub_0_hoge; //=>0
echo $image_sub_1_hoge; //=>1
echo $image_sub_2_hoge; //=>2
```

https://www.php.net/manual/ja/language.variables.variable.php
MySQL環境構築【macOS / homebrew】

# やりたいこと
ローカルで、homebrewを使用してMySQLの環境構築を行う。
# 環境
MacOS Catalina 10.15.5
Homebrew 3.3.7

# 手順
homebrewでMySQLをインストールします。

```zsh
$ brew install mysql@5.7
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/e0b8fde5-13d3-d7b2-02b9-52fd32400398.png)


パスを通します。

```zsh
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```

バージョンが表示出来たので無事インストールできたようです。

```zsh
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.36, for osx10.15 (x86_64) using  EditLine wrapper
```

MySQLを起動します。

```zsh
$ brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
```

パスワードの設定を行います。パスワード設定後の各種設定はEnterでスキップしてます。

```zsh
$ mysql_secure_installation
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/0f4d26bc-505e-beee-f351-fbe2f7683115.png)

色々スキップすると「`... skipping. All done!`」と出るので、これで設定は終了です。

MySQLにログインしてみます。
先程MySQLを起動したので、そのままログインできます。

rootユーザでログインしてみます。

```zsh
$ mysql --user=root --password
```
パスワードを求められるので先程設定したパスワードを入力すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/e50b60eb-177e-b5e7-8641-b793239d43c8.png)


問題なくログインできました。

ログアウトは

```zsh
mysql> exit;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/baa76c25-1c90-2952-de5b-4ffec5006821.png)


MySQLの停止は

```zsh
$ brew services stop mysql@5.7
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/cc4ef2c1-e277-d05d-9d8e-41d22c47e8ed.png)

となります。

起動しているMySQLサーバがあるか確認するときは

```zsh
$ mysqladmin ping -u root -p
```

を実行すると、
起動しているサーバが存在するときは以下のように「mysqkid is alive」と表示され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/a0ce1c38-7e68-d2a0-86c9-b5b271ab2aff.png)

起動しているサーバが存在しないときは以下エラーとなります。

```zsh
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!
```


# 参考サイト
[progate MySQLの開発環境を用意しよう](https://prog-8.com/docs/mysql-env)
[MySQL逆引きリファレンス　MySQL サーバが起動中であるかを確認する](http://mysql.javarou.com/dat/000409.html)
OpenChain Security Assurance Reference Guide

こんにちは！
3日連続で登場のENDOです。

今週はセキュリティやツールに関するトピックスをご紹介していますが、
本日はOpenChainが今年の夏に[リリース](https://www.openchainproject.org/featured/2021/08/12/openchain-iso-5230-security-assurance-reference-guide-now-available)したSecurity Assurance Reference Guideについて紹介させて頂きます。

#Security Assurance Reference Guideって？
2021年8月にOpenchainのSpecification WGが[リリース](https://github.com/OpenChain-Project/SecurityAssuranceGuide/tree/main/Guide/1.0)した組織がOSSのセキュリティを確保するためのガイドラインです。
このガイドラインはISOとなっているOpenChainの標準そのものに含まれるものではありませんが、
そのプロセスを活用してライセンスコンプライアンスだけでなくセキュリティ関連業務も進められるようにするための指針となるものです。
策定の経緯や位置付けの詳細についてShaneからコメントを頂きましたので、以下に掲載します。

![Security Guideline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/2889dc06-1cdd-c80f-a0a8-b8e89de88ac8.png)

#Shaneからのメッセージ
「Security Assurance Reference Guide」は、組織がOpenChain ISO / IEC 5230：2020を使用して、製品およびサービスのセキュリティプロセス管理をサポートする方法を示しています。
このガイドは、直接的な市場の需要に基づいて作成されました。
多くの組織はすでにコンプライアンスのためにOpenChainISO / IEC 5230：2020を使用しており、セキュリティの周りでそれを使用し始めました。
私たちは彼らの経験を取り入れて、より広いコミュニティと共有したいと思いました。
サプライチェーンのすべての部分、すべてのタイプのコンプライアンスを向上させるためにプロセス知識へのアクセスを可能にします。 
OpenChainプロジェクトは、これを実現するための一部となることを光栄に思います。

#日本語版がいよいよ明日公開です！
OpenChain Japan WG Promotion SGでは、Security Assurance Reference Guideの日本語化作業をこの秋から進行させ、
いよいよ明日公開できることになりました。
明日のアドベントカレンダーで詳細を公開予定ですのでお楽しみに！

#English Summary
OpenChain Security Assurance Reference Guide was [released](https://www.openchainproject.org/featured/2021/08/12/openchain-iso-5230-security-assurance-reference-guide-now-available) in this August.
You can download it at [Github.](https://github.com/OpenChain-Project/SecurityAssuranceGuide/tree/main/Guide/1.0)
And, Japanese translation of this document will release tomorrow.
Please check it!!

#Message from Shane
The 'OpenChain Security Assurance Reference Guide’ shows how organizations can use OpenChain ISO/IEC 5230:2020 to support security processes management for products and services. We created this guide based on direct market demand. Many organizations were already using OpenChain ISO/IEC 5230:2020 for compliance and began using it around security. We wanted to take their experience and share it with the wider community. Every part of the supply chain deserves access to process knowledge for improved compliance of all types. The OpenChain Project is honored to be part of making this happen.
The Rust Programming Language 日本語版 メモ

## 戻り値とスコープ

```rust
fn main() {
  let s1 = gives_ownership();

  print!("{}", s1); // hello

  let s2 = String::from("hello");

  let s3 = takes_and_gives_back(s2);
  print!("{}", s3); // hello

  // error[E0382]: borrow of moved value: `s2`
  print!("{}", s2);
}

fn gives_ownership() -> String {
  let some_string = String::from("hello");
  some_string
}

fn takes_and_gives_back(a_string: String) -> String {
  a_string
}
```


```rust
fn main() {
    let s1 = String::from("hello");

    let (s2, len) = calculate_length(s1);

    // The length of 'hello' is 5.
    println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, usize) {
    let length = s.len();

    (s, length)
}
```

```rust
fn main() {
  let s1 = String::from("hello");

  // error[E0308]: mismatched types
  let len = calculate_length(s1);

  println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize {
  s.len()
}
```

```rust
fn main() {
    let s1 = String::from("hello");

    let len = calculate_length(&s1);

    // The length of 'hello' is 5.
    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}
```
リモートワークで会社バリューを体現する時に気をつけている事

#はじめに
[前回のikkitangのめでたくてためになる話](https://www.ikkitang1211.site/entry/stafes-9)でウキウキの[ukshinpei](https://qiita.com/ukshinpei)です。

# バリューとは
会社バリューとは、会社の一員として、価値観や行動指針に沿った行動をすると言う意味です。

スターフェスティバル株式会社の企業理念は、 __ごちそうで 人々を より 幸せに__ です。
ビジョンは __新たな食文化を創造する__ です。

この企業理念・ビジョンを体現するため、３つのバリューが設定されています。

+ Be a Leader - 手を挙げ挑戦せよ -
+ WOW! - 最速で最高をめざせ -
+ Go All Out - やってやれんことはない -

詳しくは https://stafes.co.jp/company/philosophy に記載がありますので覗いてみてください。

# リモートワークで体現する重要性
リモートワークをしていると、お互いの顔が見えない事が多いです。
特に、エンジニアは集中してコーディングしている時はこのビジョンを忘れがちになってしまいます。
バリューは一時的に意識するものではなく、無意識に出来るのが理想だと思いますが、リモートワークだからこそ余計に意識したい。

なぜなら、会社のバリューを無視して行動すると取り止めのない組織になってしまうと考えるからです。
成熟した組織とは一人一人がバリューを意識しているように思います。マネージメントをしている人だけではなく。

むしろ、リモートワークになったからこそ、バリューを体現できている人がより鮮明に見えてきました。
他の行動できている仲間を見ながら、自分もやっていこうと思って気をつけている事です。

# 弊社の場合
### Be a Leader - 手を挙げ挑戦せよ -
これはリーダーシップを出して行こうと言う意味で自分は考えています。
リーダーシップとは人を巻き込む力だけではなく、他の人のリーダーシップを引き出す面もあると思います。

例えば、急なアラートが上がってきた時にん、指示を待つ人間になるのではなく、解決に向けて各々が動く人間にならなければなりません。
インフラ系のアラートだと自分が自信持って対応出来ない場合もあると思います。何をやればいいかわからない事もあると思います。
でも、だからと言って__見て見ぬふり__をしてしまっていては無責任なエンジニアになってしまいます。
たとえわからなくても

+ Slackで呼びかけ
+ 音声チャンネルの開設
+ お客様へ影響調査
+ 関係者の周知・収集

など、できる事は必ずあるはず。自分に関係ないけど社内のピンチには自分事として対応する。

その時に、「自分はこれをやります！！」と言ってから行動する。事が大事だと思います。
出遅れた時は俯瞰して状況を把握する。把握して手を挙げる。
手を出せそうにないなら「自分手が空いているので手伝って欲しい事あれば言ってください！」と手を挙げる。

ここで黙ってやらない事ってすごく大事。当たり前に出来ている人を見習って最近では気をつけてやっています。

### WOW! - 最速で最高をめざせ -
最速で最高を目指せ。エンジニアであれば当たり前でありながら難しい。
昔の自分のコードを見直すと、あの時は最高だと思ったけど全然ダメじゃん。って思う事が多いです。

とはいえ、最高を目指しすぎて全然何も出来なくなってしまっては意味がありません。
私たちの仕事は、プロダクトを世に出す事で始まるものだと思います。
エンジニア一人一人生産能力に違いはあるし、上も下も比べたらキリがない。
その時の最高を最速でリリースするを心がける必要があると思います。

その為に、チケットの粒度やテストの記載など気を付ける事は多いです。
方法論になってしまうので省きますが、良く言うリーダーブルなコードやテスタブルなコードを書く技術を身につけないといけないと思っています。

またチーム内やPJ内の活発なコミュニケーションも必要だと思います。
最速を目指す為に我を殺す事も大事だし、妥協する事もあると思います。

最速で最高とは、今作ってるものだけでないと思います。
未来に残ったコードや未来の自分から見た時に最高になるか、負債の先送りにしているだけで最速なのは一時だけではないか？
自問する事が多いです。

これは自分が悩んだ時の指針になっています。

### Go All Out - やってやれんことはない -
やってやれない事はない。と言うと無理して働けって意味にも見えるのですが、そんな意味ではありません。
やれない理由を探すのではなく、困難な事も臆せずやって行こうって意味です。

自分が触った事のないプログラミング言語だからといって、毛嫌いするなって話だとわかりやすいかと思います。

かといって何でもかんでもやるって言うのはキャパオーバーになってしまうので違います。
またやはりやる事には意味がないといけないと思います。
新しいプログラミング言語を使いたいからって理由で言語を採用するのも違います。
当たり前の話ですが、

+ なぜやるのか
+ 何をやるのか
+ どうやるのか

の説明ができないといけません。それがあるにもかかわらず、できない理由を並べるのをしないのがやってやれんことはない。
だと思っています。

リモートワークになって一人で考える事が多くなりました。
やれば出来る。を自分一人が頑張らなければいけない事だと思って無理する事もあります。
だけどそうではなく、チームで・PJで考えるべきだと思います。
それもどうやって実現させるのか前向きに相談できるのが仲間だと思います。

最近では相談することが増えました。悩んだ時、自分の中でしっくりしない時に相談して進める。
Go All Out(全力を尽くす)と言うのは、一人で頑張らない事が大事だと思います。

リモートワークでやりがちな一人で悩むと、断る・やらない理由を探し始めてしまいます。
そうなる前に、しっかり相談し、前向きに課題に向き合うようになりました。

# 最後に
色々気をつけて行動しているように思ってたのですが、書いてみると当たり前を並べているだけでした(笑)。
様々な会社で様々なバリューがあると思いますが、多分それも当たり前じゃないかなって思います。
指針に沿って行動するためのバリューですが、人間として当たり前のことがバリューになってるのかなって思います。

こんなバリューですが、弊社ではほとんどのエンジニアがバリューに沿って行動できています！

弊社では仲間を募集しています！よろしくお願いします！
https://stafes.notion.site/stafes/d0996a00d77d418280982797c7e16001
Houdini 19.0 版 バリエーションコピー　~Merge Packedの使用~

# はじめに
この記事は　HoudiniApprenticeAdventCalendar2021　16日目の記事です。
Houdini Indie 19.0.383 を使用しています。

この記事は去年の HoudiniApprenticeAdventCalendar の記事、「[Houdini18.5 新ノードを使った作例！～従来の方法と一緒に～](https://qiita.com/okada_takuya/items/0243bc0ef38f2761eef3)」の バリエーションコピーの章の続きになります。


hipファイルは[こちら](https://www.dropbox.com/s/aoizignyr4z4czu/VariantCopyH19.0.hiplc?dl=0)

# これまでのバリエーションコピーのおさらい

従来の方法１　CopyStamp を使用した方法
　↓
従来の方法２　For-Each を使用した方法
　↓
Houdini 18.0　Variant Attribute を使用した方法
　↓
Houdini 18.5　Scatter and Align, Attribute from Pieces　を使用した方法

というように、扱いやすく高速に処理できるよう進化してきました。
※それぞれの詳細は「[Houdini18.5 新ノードを使った作例！～従来の方法と一緒に～](https://qiita.com/okada_takuya/items/0243bc0ef38f2761eef3)」をご覧ください。

前回の最終形、18.5のネットワークの状態はこんな感じです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/32c59869-2a2e-6c12-683b-9a907913a767.png)





さて、新バージョンの Houdini 19.0 では何が変わったのでしょうか？？

# Houdini 19.0 版 バリエントコピー　~Merge Packedの使用~
Houdini 19.0 では入力をそれぞれ Pack し、アトリビュートを付与してくれる Merge Packed という新しい Merge ノードが追加されました。
18.5では Merge 前にそれぞれ Pack し、Merge 後に Enumerate SOP で variant アトリビュートを与えていましたが、その工程がまるっと１つのノードでできます。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/3dafba38-a9f8-f7d9-b499-09c6ea612ccc.png)
　↓
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/ddf8d082-2e6c-1874-e0bf-a00a59abda87.png)
かなりすっきりしましたね！


Merge Packed はデフォルトで Name Primitive Attribute のパラメーターがオンになっていて、
入力ノードの名前を name アトリビュートとして付与する設定になっています。
今回はそれをオフにして、代わりに Index Parimitive Attribute をオンにして「variant」と入力しています。
これで variant アトリビュートに整数値が付与されます。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/53650e06-f2cd-03d2-fb02-9f59ec482ecb.png)


ちなみにですが、デフォルトの name アトリビュートでも Attribute from Pieces、Copy to Points の各パラメータを「name」
に設定すれば同様にバリアントコピーしてくれます。
name アトリビュートは kineFX や Solaris でも使われていて、堅牢なネットワークが作れるというのもあり、もしかしたら今後はなるべく name アトリビュートを積極的に使用するのがいいかもと個人的に思っています。
そのグローバルプロダクトはGDPR対応してますか

[HULFT Square](https://www.hulft.com/hulft_square)はSaaSとしてお客様にご利用いただくよう開発を進めています。
お客様がSaaSに求めるものはマネージドです。そして、安心、安全の上で動いていることは必要条件でしょう。

安心、安全は言葉で表すことは難しいですね。しかし、すでに世の中にはいくつもそれを担保するための標準や、法律、規則があります。
本投稿ではGDPR（General Data Protection Regulation｜一般データ保護規則)をターゲットとして、これに対応するサービスはどのような検討が必要になるかを簡潔に記載します。
このあたりをビジネスと開発・運用組織が押さえておけば、サービス開発で大きく外すことはないと思います。やるか、やらないか検討しているソフトウェアチームの一助になれば幸いです。

## 大きなポイント
- 日本は十分性認定の対象国である（アメリカは違う)
- 個人情報の定義と配置する場所こそが一番大事
- サービスとユーザーの接点は同意、請求、開示
- 管理者（コントローラ）と処理者はあなた次第

## それぞれの簡単なポイント

### 日本は十分性認定の対象国である
ズバリ、日本にあるサーバにGDPRにおける個人情報として指定されるデータを保持してOKです。 **USは認定対象外です** 。もし、現在のサービスをマルチリージョンで考えるのであれば、ここは十分検討してください。
BCPなどを実現するアーキテクチャを米国リージョン含めて構成している場合は、検討が必要です。（絶対ダメというわけではないです）

### 個人情報の定義と配置する場所こそが一番大事
GDPR対応の一丁目一番地です、まずサービスにおけるGDPRとしての個人情報の特定、そしてその配置場所の特定が初めに必要です。
最近のサービスはAWSやAzure、もしくはその他のサービスの上や横連携を前提にアーキテクチャが検討されるでしょう。いわゆる巨人の肩に乗って、遠くへ早く進む戦略です。これはコア、ノンコアのフォーカス戦略からも非常に重要です。

ただ、GDPRはこれでハマる部分可能性があります。 **GDPR対応のSaaSアプリケーションを作る場合は連携対象SaaSがGDPR基準に対応しているものを選んでください** 。そうでないと、その１つのサービスのおかげで、次の「開示」で詰みます。 **なお、HULFT SquareはGDPR準拠を予定しています**

### サービスとユーザーの接点は同意、請求、開示
GDPRはユーザーを保護するものです。エンジニアがシステムを作って終わりではありません。
まず、最初に「同意」のイベントを軽やかに超える必要があります。細やかなルールは多少ありますが、まずは、同意を記録する、そして同意を取り消せること。これを実現可能としてください。
「請求」はオンラインであることが必要です。（必須ではないが、とある約束事に触れる可能性があります）
「開示」はシステムと組織両方のシナジーが問われる部分です。また、次で触れるコントローラの決定方法により、要件を重くも軽くもできます。

### 管理者（コントローラ）と処理者はあなた次第
SaaSの種類によりコントローラは利用ユーザー自身になります。何を言っているんだというと、BtoB SaaSの場合は実際の利用者は企業の社員です。つまり、SaaSの利用企業はそのSaaSを社員に使わせているから管理者なのです。GDPRとして管理者の役割はいくつかあります。
これを契約の中で定義することで、いくつかの非常に繊細なテーマを委譲することができます。

## 最後に
GDPR対応アプリケーションは費用と時間と有識者と運用する真摯な組織があれば対応できます。そして、GDPRに対応していれば、グローバルなプロダクトを目指せます。対応していなければ無理でしょう。
最後にGDPR対応サービスはそんなに難しくありません。これができればCCPA対応もほぼほぼできたようなものです。
まず、以下のような全体がわかる本をサラッと全部読んでいただければ、やってみようと思えるはずです。
GDPRは恐るに足らずです。

[図解入門ビジネス最新GDPRの仕組みと対策がよーくわかる本](https://amzn.to/3EP75eU)
[概説GDPR](https://amzn.to/3dLW16k)
[欧州GDPR全解明](https://amzn.to/31PcfZR)

がんばりましょう
LSDj あれこれ

LSDjとはゲームボーイで曲が作れるソフト
有料だったがいつの間にか無料になってた

>LSDjはLittle Sound Djの略称でゲームボーイ用のシーケンサー、つまり簡単に言うと作曲ソフトです。いわゆるレトロゲームのピコピコ音楽「チップチューン」をゲームボーイそのもので作って、鳴らすことが出来るというそれだけで面白そうですよね。

[出典 : yoshidaallarchives](https://yoshives.com/gameboy-lsdj/)
そういう事です

#必要なもの
ゲームボーイ
LSDjのROM
ROM入れるカートリッジ

GBのエミュでも動くからそれでもいいよ
カートリッジは基本海外から輸入することになる
ただ自分が使ってるのはたまに読み込み出来なかったり挙動が不安定
[CUBIC STYLE](https://cubic-style.jp)さんという同人サークルがLSDj用のカートリッジを頒布しているので
通販開始したら試してみたい
![image0 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/8fa33e2a-8d7e-d563-cb62-11f4ffe2cbf2.jpeg)
カートリッジに書き込みするリーダーはここのを使っている
パッケージが初代ゲームボーイソフトのパッケを模していて可愛い。良いサイズ感

![image2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/20d5bebd-acef-4acc-7393-7d732e18ce1f.jpeg)
![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/0934c691-e0d3-7bc8-366e-11a9c031efae.jpeg)
液晶部分とスピーカーを改造してもらい、IPS化、バックライト、バカでかい音が鳴るようになったGBC
でかすぎて最大まで上げると音割れする


[結局どのGBを使えばいいんですか問題](https://note.com/scythe/n/nabdc2384cd79)

かなり詳しく書いてあるのでここ見たら解決
自分はゲームボーイカラー使ってる
>ただ問題としてCPU-03以前の基板は使ってはいけないという話が
あります。これはCPUの0、A、Bが多く使われており、特定の
コマンド(PとかV)を読ませるとノートが発音中の音が止まるバグを
持っている為です。カラーを使うときはCPU-04以降の基板を
選ぶようにしましょう。
(電池蓋を外すと左下の穴から2桁の数字が見えるので04以降を選ぶ)

![image3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/adc503fa-eec9-a779-1522-7a733f120800.jpeg)
奥の方に数字が見えるけどそれ
自分のは04

#LSDjで曲作るには
頑張るしかない
ピアノロールとかじゃなくてトラッカーというタイプのやつなので慣れるまで大変かもしれない。
自分もよくわかってない
https://twitter.com/internet_nature/status/1469597138275684354
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/nORxKeMvQV">pic.twitter.com/nORxKeMvQV</a></p>&mdash; internet_nicenature (@internet_nature) <a href="https://twitter.com/internet_nature/status/1469597138275684354?ref_src=twsrc%5Etfw">December 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
こんな感じになる
自分が触れてきたハードから音が鳴るのは地味に感動する

#まとまっていないまとめ
チップチューン作りたくて実機にこだわりない人はPCでゲームボーイのサウンドフォントとか入れた方が楽かも
↓
[■](http://asialunar.info/gbsf.html)

ちなみにファミコンだと[Magical 8bit Plug](https://ymck.net/app/magical-8bit-plug)っていうYMCKのメンバーが作ったプラグインが有名

後はやる気次第
【React Router v6】Attempted import error: 'Switch' is not exported from 'react-router' というエラーの解消法


## 結論

特に変なことはしていないのにエラーが出ている場合、もしかしたらあなたのReact Routerのバージョンの影響かも？
まずはReact Routerのバージョンを確認。
v6であればv5の時と記述法が変わったので、React Router v6の書き方でRoute設定をする。


## v5までの記法

```Router.jsx
import { BrowserRouter, Route, Switch } from "react-router-dom";
import { Top } from "../components/pages/Top";
import { Users } from "../components/pages/Users";

export const Router = () => {
    return (
        <BrowserRouter>
            <Switch>
                <Route exact path="/" >
                    <Top />
                </Route>
                <Route path="/users" >
                    <Users />
                </Route>
            </Switch>
        </BrowserRouter>
    );
};
```

## v6の記法
上記v5の記法との違いとしては下記の2点です。

- import文のSwitchがなくなり、代わりにRoutesにしてあげる。
- Routeコンポーネントの中にelementを定義し、pathにマッチした時にどのコンポーネントをレンダリングするかを指定する。

```Router.jsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { Top } from "../components/pages/Top";
import { Users } from "../components/pages/Users";

export const Router = () => {
    return (
        <BrowserRouter>
            <Routes>
                <Route path="/" element={<Top />} />
                <Route path="/users" element={<Users />} />
            </Routes>
        </BrowserRouter>
    );
};
```

v5からの改善点としては、下記があげられるようです。

- 階層構造のパスが直感的に設定出来るようになった
- Routeが設定の順番に左右されなくなった(現在のURLに最適なRouteを自動的に選択)
- コード分割が容易になり、遅延ロードも書きやすくなった
- 今までのReact Routerよりもコードがコンパクトになりやすい
- バンドルサイズが減少する

確かに分かりやすくなった気がする❄️

##参考
[React Router v6がリリースされたので端的にまとめます](https://coders-shelf.com/react-router-v6-intro/)
CircleCIでAWS NAT Gatewayの起動・停止を実現してみた

# はじめに
こちらは[CircleCI Advent Calendar 2021](https://qiita.com/advent-calendar/2021/circleci)の第12日目の記事です。
前日は[inokappa](https://qiita.com/inokappa)さんの[CircleCI でワークフロージョブの処理時間を可視化する試み](https://inokara.hateblo.jp/entry/2021/12/09/234926)でした。

昨年はデプロイパイプラインの話をしました。今年はスケジューラーを使ってみようと思います。

https://qiita.com/juve_534/items/244ddff045ede56cedd4

# 概要
検証環境の費用削減として、下記を参考にAWS LambdaでAWS NAT Gatewayの削減をやってみました。  

https://www.ntt-tx.co.jp/column/dojo_aws_blog/20180411/

しかし、AWS CloudFormationやTerraformなどを利用して構成管理していると、AWS Lambdaで削除するやり方では差分が発生してしまいます。
そこで、差分が出ないように構成管理を維持した状態で起動・停止を実現してみようと思います。

# 本文
## テンプレート準備
まずはAWS CloudFormationのテンプレートを用意しておきましょう。
今回のテンプレートはAWS NAT Gatewayだけを管理するようにします。

```yml:natGateway.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: Nat Gateway

# 流用する際は、デフォルト値にパラメータを設定するか、CIで渡すようにしましょう
Parameters:
  SubnetPublic:
    Description: Subnet Public.
    Type: String
  EIP:
    Description: Elastic IP ADDR
    Type: String

Resources:
  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !Ref EIP
      SubnetId: !Ref SubnetPublic
```

## スケジューラー設定
スケジューラーは[ワークフローを使用したジョブのスケジュール - CircleCI](https://circleci.com/docs/ja/2.0/workflows/)を参考にしていきます。
Contextの設定方法が書いていないので苦戦しましたが、他と同様にJobに設定すればよかったです。

```yaml:.circleci/config.yml
version: 2.1

orbs:
  aws-cli: circleci/aws-cli@2.0

jobs:
  create:
    executor: aws-cli/default
    working_directory: ~/work
    steps:
      - checkout
      - aws-cli/setup:
          profile-name: default
      - run:
          name: create AWS NAT Gateway
          command: |
             aws cloudformation deploy --template-file ./natGateway.yaml --stack-name firstNATGateway --no-fail-on-empty-changeset
  destroy:
    executor: aws-cli/default
    working_directory: ~/work
    steps:
      - checkout
      - aws-cli/setup:
          profile-name: default
      - run:
          name: destroy AWS NAT Gateway
          command: |
             aws cloudformation delete-stack --stack-name firstNATGateway

workflows:
  version: 2
  create-work:
    triggers:
      - schedule:
          cron: "0 23 * * 0-4"
          filters:
            branches:
              only: main
    jobs:
      - create:
          context: aws
  destroy-work:
    triggers:
      - schedule:
          cron: "0 12 * * 1-5"
          filters:
            branches:
              only: main
    jobs:
      - destroy:
          context: aws
```

# まとめ
CircleCIを使うことで構成管理をしているリソースのコスト削減ができました。
アドベントカレンダーはまだまだ続きます。

https://qiita.com/advent-calendar/2021/circleci

以上、最後まで読んでいただきありがとうございました。

# 余談
今まで下記のように `default` 配下に記載していました。今回の実装で `default` と同一階層に記載できることが知ることができ、他の実装で役に立てることができました。

```yaml
workflows:
  version: 2
  default:
    jobs:
      - hoge:
```

# 参考資料
* [サーバレスでNAT Gatewayの起動・停止を管理してみた【押忍！ソフト道場】 \| NTTテクノクロスブログ](https://www.ntt-tx.co.jp/column/dojo_aws_blog/20180411/)
* [ワークフローを使用したジョブのスケジュール - CircleCI](https://circleci.com/docs/ja/2.0/workflows/)
Webの勉強はじめてみた その12 ～仮想環境を整える Windows編～

N予備校「プログラミング入門 Webアプリ」を進めています。
今回から第2章に入ります。
今日は第2章1節と2節を受講しました。

正直疲れました。

<h2>実行環境</h2>
:::note
Windows10 Pro 21H2 
CPU: Intel Core i7-7700
RAM: 16GB
:::

<h2>仮想環境構築の前に</h2>
Windows に仮想環境を入れる前に、「仮想化」を有効にしておかないといけない。

https://www.tekwind.co.jp/ASU/faq/entry_134.php

BIOSから
`Advanced > CPU Configuration > Intel VirtualizationTechnology` の項目を`Enable`にしておく。

<h2>環境構築</h2>
<h3>インストール手順</h3>
:::note
1. パッケージマネージャのインストール(Chocolatey)
2. VirtualBox のインストール
3. Vagrant のインストール
4. Linuxディストリビューションのインストール(Ubuntu)
5. SSHクライアントのインストール(RLogin)
:::

<h3>Chocolatey</h3>
Powershell上で公式のコマンドを実行

https://chocolatey.org/install

<h3>VirtualBoxとVagrantのインストール</h3>
Chocolatey のコマンドを利用してVirtualBoxの準備をします。
`cinst virtualbox -Version 6.0.16 -y`
Vagrantのインストール
`cinst vagrant -Version 2.2.13 -y`

:::note warn
Vagrantのインストールが途中で止まる場合がある。
:::
Powershellを再起動して再度実行しても既にインストールされているといわれ、`vagrant`コマンドを実行するも存在しないと怒られる。
なので、強制的に再インストール。
`cinst vagrant -Version 2.2.13 --force -y`


<h3>Ubuntuのインストール</h3>
ディレクトリ作成
`mkdir ~\vagrant\ubuntu64_18`
`cd ~\vagrant\ubuntu64_18 `

Ubuntuをダウンロード、仮想環境にインストール
`vagrant box add ubuntu/bionic64 --box-version 20200130.1.0`

設定ファイル vagrantfileを作成
`vagrant init ubuntu/bionic64`


<h3>起動と終了</h3>
起動
`vagrant up`
終了する場合は
`vagrant halt`

<h3>SSHクライアント</h3>
RLoginのインストール
`cinst rlogin -y`
RLoginの起動
`rlogin`

SSH接続に必要な情報を取得する
`vagrant ssh-config`


<h2>まとめ</h2>
Vagrantインストールが止まったときは焦った。
コマンド実行がうまくいかないときは表示されてる情報をよく読んだほうがいいことを学んだ。
Azureのインスタンスがデストロイされた話

この記事は [本番環境でやらかしちゃった人 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yarakashi-production) 12日目の記事です。
## はじめに
私は情報系の大学に通っている4年生です。
高校生の時に開発したバス時刻表アプリのサーバが**うっかり**デストロイされてしまった話をします。

バス時刻表アプリは以下のような環境で稼働していました。
本番サーバ:Azure Virtual Machines(1台)
アクティブユーザー:500人前後
契約形態:AzureStudents
※AzureStudentsは学生が加入できるプランで、100ドルのクレジットが貰えて、12ヶ月間Azureのサービスを利用することが出来ます。
# 事件は2021年6月15日に起きた
6月15日 ユーザーから「アプリが使えない」という連絡が来ました。
私は、障害の原因を確かめるために、サーバにSSH接続を試みましたがSSH接続が出来ませんでした。
恐らくSSH接続先のIPアドレスが間違っているのだろうと思い、インスタンスのIPアドレスを確認するためにAzureのページにアクセスしました。

# インスタンスがない＼(^o^)／
Azureのインスタンス一覧にインスタンスがないのです。
インスタンスが無くなるなんて有り得ないから、Azureに障害が起きているのかな？

# Azureの障害に違いない。そう思ってメールを確認してみた
![destroy1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145857/d1677a5e-6a29-c4b7-24ea-c4167246b465.png)

マジ？？？？
嘘でしょ？
嘘であってほしい。
22年間生きてきましたが、こんな恐ろしいメールは見たことがありません。
たった1台の本番サーバがデストロイされてしまい、サービスが完全に停止してしまったのです。

# 死物狂いで復旧作業
サーバがデストロイされてしまいましたが、感傷に浸っている場合ではありません。
こうしている間にもサービスを利用できずに困っている人がいるのです。
平日はアクティブユーザーが多いため、1秒でも早く復旧する必要がありました。

当時の復旧作業の時系列はこんな感じです
13:00ごろ 全ユーザにプッシュ通知で障害発生の報告と謝罪を送信
13:05 AWSでEC2のインスタンスを作成
13:07 インスタンスのIPアドレスをDNSに設定(浸透させるために最優先で設定した)
13:10 **サーバ構築** Nginx,SSLの設定などを行う
13:50 サービスのデータをサーバに転送
13:54 サービスの動作確認が完了
13:57 全ユーザにプッシュ通知で復旧の報告と謝罪を送信

このような感じで、1時間ほどでサービスを復旧させることができました。
過去最大の惨劇ではありましたが、最小限の被害に抑えられたと思っています。

# 惨劇はなぜ起こってしまったのか
- **Azureが1ヶ月前に警告メールを送ってきてくれていたのに、ちゃんと見ていなかった**

Azureは2021年6月15日に突然削除したわけではなく、1ヶ月前にこのようなメールを送ってくれていました。
![destroy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145857/8829fb59-8e86-00b3-a035-2d3ddd52709a.png)
こんな丁寧なメールを事前に送ってくれていたにも関わらず、しっかり確認していなかったので、100%私が悪いと思ってます(反省)
この時点で、サーバの移行をしていれば今回のデストロイ事件は起きていなかったはずです。

- **サーバの移行を後回しにしていた**

サーバをAWSかGCPに移行しようと思っていましたが、「まだ大丈夫だろう」と後回しにしていました。

- **流石にデータは消されないだろうと過信していた**

AzureStudentsが終了してもインスタンスが停止されるだけで、一定期間内であれば課金すればすぐに再開できると思っていました。
**現実はそんなに甘くなかった**

# 二度と惨劇を起こさないためにどうしたのか
- **AzureStudentsなど特殊なプランで契約している場合は、契約の満了時期や内容についてきちんと把握しておく**

- **VPSからのメールは必ず確認すること**

- **ドキュメントを残しておく**
サーバの構築方法などは全て文書化しておくことを強く推奨します。
Nginxの設定やPostgreSQLのインストール、SSL証明書の設定などあらゆるコマンドを全て文書化することで、サーバ構築を素早く安全に行えます。
さらに、ドキュメントを作ることで、自分の習熟が深まりますし、サーバをうっかり吹き飛ばしてもすぐに復旧できるという利点もあります。


# 最後に
サーバを吹き飛ばさないように行っている対策などがあればコメントなどで教えていただけると嬉しいです！
ローカルでEC-CUBEの環境構築

##はじめに
EC-CUBEをローカルで立ち上げる手順をまとめました。
Dockerを使う方法もあるのですが、今回はコマンドラインからインストールしました。

phpのバージョンはやっててうまくいかない時に参考にしてみてください

```terminal
$ php -v
PHP 7.4.26 (cli)
```

#環境構築
###任意のディレクトリに移動

```
cd ディレクトリのアドレス指定（もしくはディレクトリをドラック＆ドロップ）
```

###githubからクローン

```
https://github.com/EC-CUBE/ec-cube.git
```

[EC-CUBE 4.1](https://github.com/EC-CUBE/ec-cube.git)

###ディレクトリを移動

```
cd ec-cube
```

###移動先でcomposer.pharファイルを生成

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

###composer.phar のバージョンをEC-CUBE 4.1の対応しているバージョン（1.x）に変更

```
php composer.phar selfupdate --1
```

###コマンドを実行
```
php composer.phar create-project --no-scripts ec-cube/ec-cube ec-cube "4.0.x-dev" --keep-vcs
```

###ec-cubeディレクトリが作成されるので移動
```
cd ec-cube
```

###サーバーを立ち上げる
```
bin/console server:run
```

###ブラウザにアクセス
[http://127.0.0.1:8000/](http://127.0.0.1:8000/)へアクセス

EC-CUBEのインストール画面が立ち上がるので、指示にしたがってインストールを進めましょう

Dockerで環境構築をする場合は[こちら](https://doc4.ec-cube.net/quickstart/install)を参考してみて下さい

##追記

２回目以降のビルドインサーバーの立ち上げで`bin/console server:run`をすると下記のようなエラーが出ます

```
There are no commands defined in the "server" namespaces
```

これを解消するには`.env`ファイル内の`APP_ENV`の値を`prod`から`dev`に変更して下さい
【Uipath】ユーザー操作が必要なアクティビティを並列アクティビティで自動操作する

#はじめに
この投稿は、RPAツール「UiPath」での 実装例 について記事です。
今回は、GSuite アプリケーションスコープの認証を並列アクティビティで自動操作する方法を紹介します。

UiPath Advent Calendar 2021/12/12 の投稿です。

https://qiita.com/advent-calendar/2021/uipath

#GSuite アプリケーションスコープの自動認証
GSuiteアプリの自動化にはまずGoogle側のAPI許可、認証等の設定を行う必要があります。

https://www.uipath.com/ja/blog/developer/google-g-suite-activity

UiPath.GSuite.Activitiesパッケージをインストールし、GSuiteApplicationScopeアクティビティの中にFindFilesアクティビティを置いてドライブ上のファイルを検索をします。
<img width="400" alt="アクティビティ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250086/50bff7ae-63e6-0225-e6e7-049124ce3658.png">
実行すると認証画面が表示されます。
認証が許可された後は次に認証が切れるまで認証画面が表示されない場合があります。
本来この操作は手動で行う必要がありますが、Parallelアクティビティを使って自動化します。
<img width="400" alt="認証画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250086/37b439a4-b73e-3ef8-97e5-04fea7dc5947.png">
Parallelアクティビティのプロパティを設定します。
`条件=True`の場合は、含められたアクティビティの内、一つでも完了すれば次のアクティビティに遷移します。
`条件=False`の場合は、含められたアクティビティの全てが完了した後に次のアクティビティに遷移します。
<img width="300" alt="プロパティ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250086/ae234a55-c92b-d59c-4d5f-9f2d7d2abe28.png">
Parallelアクティビティの中にGSuiteApplicationScopeアクティビティを置き、隣には認証画面を操作するフローを入れます。
ここでは認証画面の操作を別のワークフローファイル(Gsuite認証.xaml)に記載して呼び出しています。
Parallelアクティビティのプロパティで`条件=True`を選択した場合は、Gsuiteアプリの操作が完了するまで、「Gsuite認証.xaml」ファイル内で待機する必要があります。
Parallelアクティビティのプロパティで`条件=False`を選択した場合は、「Gsuite認証.xaml」ファイル内で処理が止まらないようにする必要があります。
<img width="700" alt="アクティビティ2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250086/121e3719-57ba-33b1-9113-8ac9ad16be01.png">
これでGSuite アプリケーションスコープの自動認証が完了です。
#おわりに
如何でしたでしょうか。
本記事が役に立てれば幸いです。
閲覧頂き有難う御座いました。
【帳票】Stimilsoft Reports.jsの日本語化について

# １．はじめに
[【帳票ツール】JavaScriptをベースとしたStimulsoft Reports.JSをとにかく試してみる](https://qiita.com/REQWARE/items/45bf915bfc8e3f1b06e7)では、すぐにStimulsoftをはじめる方法について書きましたが、日本語化に対応する時の方法ついて解説します。

Stimulsofft製品の日本語ローカライゼーション作業は、日本総代理店の[REQWARE社](https://reqware.jp/)が実施しています。

# ２．前提

Stimulsoft Reports.js（Javascript帳票ライブラリー）

# ３．利用方法

「UI言語の選択」メニューに新しい言語を追加します。
言語が選択されると、ファイルがクライアントにアップロードされます。

```JavaScript
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localizations/ja.xml", false, "日本語");
```

「UI言語の選択」メニューに新しい言語を追加し、ファイルをクライアントにアップロードします。

```JavaScript
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localizations/ja.xml", true);
```
「UI言語の選択」メニューに新しい言語を追加し、それを現在の言語として設定します。

```JavaScript
Stimulsoft.Base.Localization.StiLocalization.setLocalizationFile("localizations/ja.xml");
```
「UI言語の選択」メニューからすべての言語を削除し、クライアントにアップロードして、現在の言語として設定します。

```JavaScript
Stimulsoft.Base.Localization.StiLocalization.setLocalizationFile("localizations/ja.xml", true);
```
JavaScriptコードでローカライゼーションを設定します。

```JavaScript
var localizationJa = '<？xml version = "1.0" encoding = "utf-8" Standal = "yes"?> ........ </ xml>';
Stimulsoft.Base.Localization.StiLocalization.setLocalization(localizationJa);
```


# ４．実装例
上記のコマンドはすべて、ビューアを作成する前に記述する必要があります。

```html
<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Create report viewer and show it immediately</title>

    <!-- Report viewer Office2013 style -->
    <link href="../css/stimulsoft.viewer.office2013.whiteblue.css" rel="stylesheet">

    <!-- Stimusloft Reports.JS -->
    <script src="../scripts/stimulsoft.reports.js" type="text/javascript"></script>
    <script src="../scripts/stimulsoft.viewer.js" type="text/javascript"></script>
</head>

<body>
    Create report viewer and show it immediately
    <br><br>

    <script type="text/javascript">     
        //　Viwerの前に記述する必要があります。
        Stimulsoft.Base.Localization.StiLocalization.setLocalizationFile("localizations/ja.xml");
        //　デフォルトの日付表示順などを日本語形式にする場合。
        Stimulsoft.Base.Localization.StiLocalization.cultureName = "ja";
        // デフォルトのオプションを使用してレポートビューアを作成し、この場所に表示します。
        var viewer = new Stimulsoft.Viewer.StiViewer();
        // 新しいレポートインスタンスを作成します。
		var report = new Stimulsoft.Report.StiReport();
		// URLからレポートを読み込みます。
		report.loadFile("../reports/SimpleList.mrt");
		// レポートをビューアに割り当てます。ビューアをレンダリングした後、レポートが自動的に作成されます。
		viewer.report = report;
    </script>
</body>

</html>
```

# ５．まとめ
以上が、Stimulsoft Report.jsでの日本語化対応の方法についての紹介になります。
次回は、日本語の文字化け問題の対処方法について解説してみようと思います。

[【帳票】stimulsoft report.jsのPDF日本語化問題について](https://qiita.com/REQWARE/items/aefbc8d5790a9c0350e2)