OmniAICreator/Qiita-1.07M huggingface dataset:
CodeIgniterのバリデーションルールで他のPOST値を参照する

CodeIgniterのset_rulesは便利ですが、このような形
```html:日付
<input type="number" name="year">
<input type="number" name="month">
<input type="number" name="day">
```
の入力項目があった場合、set_rulesは基本的に単一のPOST値に対してのバリデーションなので
例えば存在しない日付を入力していないかのチェックは難しいかと思います
(配列のnameにすればいけないこともないですが、、)

その場合はset_rulesで第二引数を利用して、他のPOST値のnameを橋渡しします。

# やり方

第二引数を利用する場合は、ルール名の後に[]を記述し、そこに引数の中身をいれてください
第三引数は設定できませんので、今回はカンマ区切りで疑似的な配列指定をします

```php:callback_check_dateはコントローラー内に記述した独自ルール
$this->form_validation->set_rules('year', '年', 'required|trim|numeric|callback_check_date[month,day]');
$this->form_validation->set_rules('month', '月', 'required|trim|numeric');
$this->form_validation->set_rules('day', '日', 'required|trim|numeric');
```

コールバック関数の中身はこちらになります。
```php:set_rulesを記載したコントローラーと同じところに記述
// MNPの有効期限チェック
function check_date ( $year, $params ) {

  // 月と日のnameが入っている
  @list($month_key, $day_key) = explode(',', $params);
  // 月の日のデータ
  @list($month, $day) = [$this->input->post($month_key) ?? '', $this->input->post($day_key) ?? ''];
  // 空白もしくは入力なしの場合、チェックをスルー
  if( count( array_filter([$year, $month, $day], function ($val) { return empty($val); }) ) != 0 ) {
    return true;
  }
  // 日付形式が間違っている
  if(!@checkdate($month, $day, $year)) {
    $this->set_message('check_date', '日付の形式が間違っています');
    return false;
  }

  return true;
}
```

第二引数でrurlesで指定したmonthとdayのname名を受け取り
POSTの中身を確認。記載されていれば日付チェックを行う形になります。
今回はnameの名前でしたが、変数の値などを引数にいれてチェックなどもできますので
callback内でDBを参照して、入力値の何かしらをチェックなども行えそうです。
AWS CLIでスイッチロールメモ

# 概要

:::note info
* AWS CLIからのAssmeRoleの設定でハマったのでメモ
* 参考記事は下にまとめた。これらでやってもだめだった。
* role_session_nameを追加すると成功するケースだった
* 親アカウントから子アカウントへ、クロスアカウントでスイッチロールする環境
:::

# 詳細

* 公式や記事によくある設定で試したがうまく行かなかった

```
$ aws s3 ls s3://test-public-bucket --profile dev-project
Enter MFA code for arn:aws:iam::987*********:mfa/master-account-my-user: 

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::123*********:user/master-account-my-user is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123*********:role/fullaccess_dev-project
```

```~/.aws/credentials 
[default]
aws_access_key_id = AKIA****************
aws_secret_access_key = XYZ*************************************

[master-account]
aws_access_key_id = AKIA****************
aws_secret_access_key = ZXY*************************************
```

* role_session_nameを追加してみる

```~/.aws/config
[profile master-account]
region = ap-northeast-1
output = json
source_profile = master-account
mfa_serial = arn:aws:iam::987*********:mfa/master-account-my-user
role_arn = arn:aws:iam::987*********:role/fullaccess_admin_master-account
role_session_name = master-account-my-user

[profile dev-project]
region = ap-northeast-1
output = json
source_profile = master-account
role_arn =  arn:aws:iam::123*********:role/fullaccess_admin_dev-project
mfa_serial = arn:aws:iam::987*********:mfa/master-account-my-user
role_session_name = master-account-my-user

[default]
region = ap-northeast-1
output = json
```

* うまくいった


```
$ aws s3 ls --profile=dev-project
Enter MFA code for arn:aws:iam::987*********:mfa/master-account-my-user: 
2022-03-01 17:47:34 prd-public-bucket
2022-03-17 19:31:52 dev-public-bucket
2022-03-18 19:57:47 stg-public-bucket
```

## 参考記事
[参考1](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html#MFAProtectedAPI-cross-account-delegation)
[参考2](https://dev.classmethod.jp/articles/switch-role-with-awscli/)
[参考3](https://blog.serverworks.co.jp/tech/2018/07/25/cliassumerole/)
[参考4](https://blog.mori-soft.com/entry/2019/12/09/145059)
[参考5](https://zoo200.net/aws-cli-switch-role-restrict-mfa/)
DrawioでHTMLファイル作成しダウンロードリンクを貼る

DrawioではHTMLファイルでの出力が可能であり
リンク先を記載することでファイルをダウンロードが可能となる。

HTMLファイルが図形を書くことで作成されてしまうのが衝撃であった。
これを利用すればちょっとしたページが作成できてしまう。

仕事柄、環境が一律ではないため
その都度リンク集なるものを作成していたがこれで非常に簡単に作成出来るようになる。
※ちなみにHTMLファイルを開いてみたら図形ではないって怒られます。


![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519157/881556f9-25d3-4a2b-eaf2-61ea3dc6a390.png)


## HTMLファイルでチャートを作成し、ファイルのリンクを追加する方法
+ 新規作成。
保存時にHTMLで保存する
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519157/17a7dcae-c6e0-7708-5890-e8d7790d0797.png)

+ ダウンロードファイルのリンクを取得
例としてGoogleDriveのリンクを取得しました。
[右クリック]→[リンクを取得]から取得したURLの末尾を変更する必要があります。
変更：[/edit?usp=sharing]→[/export?format=txt]
　※もっと良いやり方があれば教えてほしいです。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519157/8dcbdbc9-5fd6-d6cc-f53f-3699ef775c74.png)

+ リンクを編集
ブロックを右クリックからリンクの編集でURLを追加します。
適用を押したら保存します。
※新規で作成した場合は[Ctrl+S]を押すとダウンロードされますが、ダウンロードされたファイルを編集することで次回から回避できます。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519157/ccd72d55-66c5-6254-1e51-70221edadbac.png)

+ ダウンロード
HTMLをブラウザで開き、リンクを追加したブロックをクリックするとファイルがダウンロードされます。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519157/e2cdc0ef-e741-2ab4-1d0c-71b6ea1ef6f6.png)
深夜の労働時間を計算する数式

[Answersで回答する時に使う情報のまとめ](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)

いやぁ、Timeフィールドの扱いに困りました。なかなかうまく計算できませんでしたね。
ポイントはstart_time__c と end_time__cの関係によって式を変える必要がありました。

04:00～13:00と22:00～05:00では計算式が違いました。


```
IF( start_time__c <= end_time__c ,

IF( AND(start_time__c >= TIMEVALUE("05:00:00.000") ,end_time__c <= TIMEVALUE("22:00:00.000")),0,
IF( AND(start_time__c < TIMEVALUE("05:00:00.000") ,end_time__c >= TIMEVALUE("22:00:00.000")) , (( TIMEVALUE("05:00:00.000") -start_time__c ) + (end_time__c - TIMEVALUE("22:00:00.000")))/3600000,
IF( AND(start_time__c < TIMEVALUE("05:00:00.000") ,end_time__c < TIMEVALUE("22:00:00.000")) , ( TIMEVALUE("05:00:00.000") -start_time__c )/3600000,
IF( AND(start_time__c >= TIMEVALUE("05:00:00.000") ,end_time__c >= TIMEVALUE("22:00:00.000")),(end_time__c - TIMEVALUE("22:00:00.000"))/3600000,
0)))),

IF( AND(start_time__c >= TIMEVALUE("22:00:00.000") ,end_time__c <= TIMEVALUE("05:00:00.000")),(end_time__c -start_time__c )/3600000 ,
IF( AND(start_time__c < TIMEVALUE("22:00:00.000") ,end_time__c <= TIMEVALUE("05:00:00.000")), (end_time__c - TIMEVALUE("22:00:00.000") )/3600000 ,
IF( AND(start_time__c >= TIMEVALUE("22:00:00.000") ,end_time__c > TIMEVALUE("05:00:00.000")),(TIMEVALUE("05:00:00.000") -start_time__c )/3600000 ,

7)))
```

[時間項目の計算について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FvrJhSAJ)
日付を取得する方法

・日付を取得する方法
コード
```php
<?php
date_default_timezone_set('Asia/Tokyo');
for ($i = 0; $i < 366; $i++) {
    $time = strtotime('+' . $i . ' day');
    $day = date('n/j(D)', $time);
    echo $day . '<br>';
}
```
`strtotime('+' . $i . ' day')`
文字列を`$i`日後の時間に変換

`$day = date('n/j(D)', $time)`
月/日(曜日)の形で`$time`の日付を`$day`に代入
プログラムが恋人です♡、とまではいえない新人がこの１年で取り組んだこと

# はじめに
「開発がめちゃくちゃ好きで、pcはお友達、プログラムはもはや生活の一部です。」
というエンジニアの方、たくさんいらっしゃいますね。
この現場にもたくさんいらっしゃいます。

残念ながらわたしは、そこまで言えるようにはなっていません。
ですが、言えないなりに足掻いた１年だったので、なんとなく振り返ってみました。

# こんな人向けの記事です

プログラムをそこまで好きそうじゃない人が、いったいどんなことを考えているのか、その一例を追っていく記事です。
- 新人だけどプログラム大好きにはなれなそう、と軽く絶望しかかっている方
- プログラムが大好きそうではない同僚の生態が気になる方

には読んでいただくと何か発見があるかもしれません。

- やる気に満ちあふれている方
- 誰が何をしているとかわりと気にしない方

こんな方々は、特に収穫はないと思いますので、いったん記事を閉じてしまいましょう。

# 取り組んでいたことを時系列で
## 4月 簡単なアプリを作ろうとして挫折する
突然思い立ち、Railsで簡単なカレンダーアプリを作りました。カレンダーのgemがうまく動かずノックアウトされ、完成には至りませんでしたが、一人で粛々と開発を進めるのもおもしろかったです。
先月Macが交換になってしまったため、途中で放置されてしまったあのアプリは、メモリの彼方に消えました。

## 5~6月 本の海に沈む
ノックアウトされてしまったわたしは、プライベートでプログラムと向き合うことをいったん諦め、本の海というには冊数が少ないですが、本の水たまりに沈みました。
この頃わたしは[この記事](https://qiita.com/JunyaShibato/items/3aa5f7f3fc991de17f3f)を発見し、とりあえず片っ端から読みあさります。
結果的に、読んだ本の大部分は頭に入っていませんが、「あ、そういえば」と業務で思い返せる場面もいまだにあるため、無駄ではなかったです。

### 読んだ本
- 確かな力が身に付くJavaScript「超」入門　など10冊程度
    
## 7~8月 方針を見失う
上司に、「技術書読むのも大事だけど、仕事にもっと向き合うのも大事だよ（スーパー意訳）」というような趣旨のことを言われ、方針を見失います。
この頃は仕事もだいぶ忙しく、インプットもアウトプットもほぼなかったです。

### 読んだ本
- おうちで学べるサーバのきほん　　など5冊程度

## 9~10月 英語に目覚める
英語にめざめます。
技術書などはほぼ読まず、勉強をしている時間のほとんどは英語の勉強に充てていました。
おかげで、TOEICでは四捨五入すれば900点だよとがんばれば言い張れる点数を取れました。
とはいえ話せるようにはなってませんし、技術系で言ったら１年で最もインプット・アウトプットが少なかったです。
プログラムに関する記事は英語で書かれていることも多いので、ここを経て英語でも情報を取ろうとする意欲が生まれたのがよかったです。

## 11〜12月　CS・Pythonに触れる
これまでの勉強も広義ではCSですが、体系立てたコンピュータ・サイエンスの勉強を始めました。これは現在も続けています。
関連して、プライベートで久しぶりにコードをいじります。
自前のWindow10のパソコンにPythonをインストールして、少しずつ少しずつ写経をしたり、簡単なプログラムを書いたりしました。
ちなみに、地味にRubyの本を読んだりもしました。

### 読んだ本
- 独習Ruby など2冊

## 1月 テック系のニュース・podcastに触れ始める
わたし世の中のテック関連のニュースにだいぶ遅れているよなあ、と思い始めた頃に出会った記事が[こちら](https://qiita.com/tomox1001/items/384e27b6259efdb6064e)。ほうほうと、書かれているままにアプリをセッティングし、podcastを購読し始めました。
読む系は多すぎてスルーしてしまうこともしばしばですが、podcastは何だかんだ聴いてます。

### いまだに聴いているpodcast
- Rebuild など4件

## 2〜3月 Javaに触れ始める
CSに関連して、Javaをいじり始めました。
最初は自前のWindows10にeclipseをインストールしていじっていましたが、おもしろくなってきて、上司の許可をやんわりと得て仕事用MacにVScodeでSpringの環境を作ってしまいました。
また、購読しているpodcastも増えました。
そして今に至ります。

# これから
せっかくSpringの環境を作ったので、簡単なアプリをもう一度、一から作っていこうかなあと考えています。
どれくらい続くのか、続けられるのかはわかりませんが、細々とやっていけたらいきたいです。

# まとめ
タイトルが多少ネガティブな感じはしますが、楽しい時は楽しいし、好きではあるので、仕事自体は意外とポジティブに捉えていたりします。

もちろん、エンジニアとして成長したければ、四六時中プログラムやインフラをいじるのが一番の近道で、この記事で書いたあれこれは遠回りかもしれません。
ですが、成長幅が小さかろうが遠回りだろうが、何かしらの形で歩み続けることも、また大切かなと思っています。

これからもすこしずつですが、前進していきたいです。
物体検出モデルの最適化のお勉強（随時更新）

※この記事は投稿者が物体検出の最適化のお勉強をするための情報をまとめている。
自分なりに解釈した文字が多いのでご了承ください。

# 疑問・知りたいこと
* どういった原理でモデルの最適化ができているのか
* 他にも最適化の手法がないか


# そもそもTensroRTとは
[公式サイト](https://developer.nvidia.com/tensorrt)によると
* CPUのみを使った場合よりも高速な実行が可能。
* モデルの前処理をすることで工場の検出器などに搭載可能
* 量子化を行うことでモデルのlatency(待ち時間)を短縮する
* 量子化はINT8とFP16の2種類を使用している

# INT8とFP16とは
INT8:8 ビット整数
FP16:16 ビット半精度浮動小数点数
以下引用です。
>TensorRT では推論時の演算精度を選択できます。どの GPU も、32 ビット単精度浮動小数点数 である FP32 >という演算精度をサポートしています。GPU によっては、16 ビット半精度浮動小数点数 である FP16、8 ビッ>ト整数である INT8 という演算精度をサポートしています。**多くの場合、FP16 や INT8 を選択すると、FP32 よりもさらに高速に推論できます。**
[サポートされているGPU一覧](https://tech-blog.optim.co.jp/entry/2021/04/23/103000)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167125/b12973cb-5803-c4f1-914c-74256dbc9f97.png)

なら、Jetson nanoで使うならINT8にしてみよう。

# 具体的にどう計算してるの
[公式サイト](https://developer.nvidia.com/blog/accelerating-inference-up-to-6x-faster-in-pytorch-with-torch-tensorrt/)を例にみていく。
* 静的な値を持つノードは定数とされる。
* テンソル計算を記述するノードは、1つまたは複数のTensorRTレイヤーに変換される。
* 残りのノードはTorchScriptのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167125/30ed9320-8e3a-921c-7f11-dfb524406d6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167125/8ac65ecd-9154-0dc0-5888-6a438c6a4d64.png)

# Torch-TensorRTのINT8は
2つの技術を使って実現している
* 訓練後の量子化[PTQ]
* 量子化を想定した訓練[QAT]
[PTQ](https://nvidia.github.io/Torch-TensorRT/tutorials/ptq.html)とは
* ターゲットドメインのサンプルデータでモデルを実行する校正ステップ
* FP32とINT8の推論間の情報損失を最小にするINT8へのマッピングを実行する
[QAT](https://nvidia.github.io/Torch-TensorRT/_notebooks/vgg-qat.html)とは
*
Blenderのカスタムプロパティの使い方

## 概要

下図のように色違いのオブジェクトを作りたいとしましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a926d72f-6b4f-3b0c-c6b2-69f53b700c12.jpeg" width="500">

もちろん、オブジェクトを複製してマテリアルも複製すればできます。
しかし、カスタムプロパティを使ってリンク複製すれば以下のメリットがあります。

- データがコンパクトになる
- 修正を1ヶ所でできる
- 個別設定可能なものがわかりやすくなる
- オブジェクトを使い回ししやすくなる

ここでは、カスタムプロパティを使って、色違いのオブジェクトを作成する方法を説明します。

## オブジェクトとメッシュとマテリアル

まず、オブジェクトとメッシュとマテリアルの関係を説明します。

メッシュで作成したオブジェクトは、メッシュを持っています。
そしてメッシュは、マテリアルを持っています。
オブジェクトを複製するとメッシュも複製されます。
また、オブジェクトの複製で複製されたメッシュは元のマテリアルと同じマテリアルを参照しています。

ここでは、オブジェクトの複製ではなく、**オブジェクトのリンク複製**を行います。
オブジェクトのリンク複製を行った場合、オブジェクト自体は新しく作られますが、メッシュは同じものを参照します。マテリアルはメッシュが持っているので、マテリアルも同じになります。

色はマテリアルで設定されているので、通常、リンク複製で色を変えることはできません。
しかし、カスタムプロパティを使うと、リンク複製したオブジェクトで色を変えることができます。

## カスタムプロパティとは

カスタムプロパティは、オブジェクトで自由に設定できるプロパティです。
メッシュではなくオブジェクトが持っているのでリンク複製したオブジェクトでも別々の値を設定できます。
また、マテリアルのノードから参照することもできます。

## カスタムプロパティの作成

カスタムプロパティは、オブジェクトを選択して表示されるオブジェクトプロパティの一番下にあるカスタムプロパティから作成できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/23aa1503-55a3-bf51-8562-d02d5026bd61.png" width="300">

ここでは、色として使えるカスタムプロパティを作成します。

新規ボタンを押してください。作成されたカスタムプロパティにある歯車のボタンを押して下記のように編集してOKを押してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/341a17d3-2fb9-b81a-4f78-d68dca1e0107.png" width="300">

※ デフォルトではサブタイプが非表示ですが、タイプに`Float配列`を選ぶと表示されます。

作成したカスタムプロパティは、オブジェクトプロパティで設定可能ですが、下図のようにサイドバーのアイテムタブでも可能です。サイドバーの方が使いやすいでしょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/2c1641b5-8dc9-84a5-d49d-46e2ae46effc.png" width="240">

※ サイドバーの項目は、ドラッグで位置を変更できます。デフォルトでは項目プロパティはパネル下部に表示されています。

## マテリアルでカスタムプロパティを使う

マテリアルでカスタムプロパティを使うには、ノードを使う必要があります。
オブジェクトを選択し、shadingワークスペースを開きます。
まだマテリアルを作成していなければ「新規」で作成します。

- `Shift + A`（追加）→入力→属性で属性ノードを追加します。
- タイプをオブジェクトにします。
- カスタムプロパティを表示し、色のところで右クリックし「データパスをコピー」を選びます。
- 属性ノードの名前の欄でペーストします。うまくペーストできなければ、下図のように直接`["color"]`と入力してください。
- 属性ノードのカラーとプリンシプルBSDFのベースカラーをつなぎます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/c0c49a90-7b8e-8e04-3e9f-d39e4a4fe46e.png" width="400">

これで、カスタムプロパティで設定した色が反映されます。

あとは、`Alt + D`（リンク複製）※で作成したオブジェクトのカスタムプロパティを変更して色違いにできます。

※ macOSでは`Option + D`

以上
Reactの超きほん　〜Reactってなに？〜

# React（リアクト）ってなに？
`JavaScript`のフロントエンドのライブラリです。

Facebook社（現在はmeta社）によりオープンソースで開発されました。

元々人気のあるライブラリでしたが、React`16.8`の`React Hooks`という便利な関数群の登場で、人気に拍車がかかりました。

https://ja.reactjs.org/

# Reactの特徴
- `jQuery`よりもコードがぱっと見で理解しやすく、複雑になりがちな見た目（DOM）の操作もシンプルに設計できる

- DOM操作の前に「仮想DOM」で検査して差分のみレンダリングするので、**パフォーマンスが良い**

- コンポーネント指向で部品の再利用やデバックがしやすく、**大規模開発**に向く

## JSX
前述の特徴を実現している要因のひとつは、`JSX`というJavaScriptの拡張構文です。

ざっくり言うと`HTML`と`JavaScript`の機能をあわせもち、
JavaScriptでありながらHTMLのようなタグを出力できます。

JSXを含むファイルの拡張子は`.jsx`となります。（TypeScriptなら`.tsx`）

https://ja.reactjs.org/docs/introducing-jsx.html

# 環境構築
`Node.js`をインストールします。

Macの方はこちらの記事が参考になります。
[MacにNode.jsをインストール（Qiita）](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

# プロジェクトの作成
以下のコマンドで簡単に開発環境を構築できます。
```shell:shell
npx create-react-app APP_NAME

# => Happy hacking! と表示されたら完了
```
`npx`は、`npm5.2`以降から利用できるパッケージランナーツールです。

### create-react-app
よく使うライブラリをまとめてインストールするライブラリ。

https://github.com/facebook/create-react-app#create-react-app--

## ディレクトリ構成
rootディレクトリ内は以下のようになります。

- public
- src
    - App.js
    - index.js
    - App.css
- node_modules
- package.json
- yarn.lock（yarnの場合）
- README.md

### `public`ディレクトリ
`index.html`やファビコン画像などが格納されます。
### `src`ディレクトリ
基本的にこの下にコンポーネントやコードを書いていきます。

**index.js**によって、`index.html`の`id="root"`要素が`App.js`で上書きされ、レンダリングされます。

```javascript:index.js
// ここで外部モジュールを読み込み
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';


// ここで#rootにApp.jsをマウントします
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
```
### import
`JavaScript`の基本的なインポート・エクスポートについてはこちら

https://qiita.com/yutaka_pg/items/d8cfa1b30ba51edd8532

### React.StrictMode
開発環境でエラーが発生した際に、警告を出してくれる機能
[strict モード - React](https://ja.reactjs.org/docs/strict-mode.html)

### マウント
DOMツリーにReactコンポーネント（DOM）を挿入する処理

### レンダリング
react-domからimportしたReactDOM変数を`render()`関数でレンダリングする

```javascript:render関数
ReactDOM.render(reactElement, DOM);
```

# サーバ起動
npmもしくはyarnでサーバを起動します
```shell:shell
npm start
# もしくは
yarn start

# ローカルならhttp://localhost:3000 でアクセス
# startコマンドはpackage.jsonで定義されている
```

# コンポーネントの作成
後日別の記事で紹介します！

# React Hooks
後日別の記事で紹介します！

# 補足
さいごまでお読みいただき、ありがとうございます！

この記事はプログラミング初心者であるわたしが、毎日の学習ログとして書きました。
ご質問やご意見、間違いのご指摘などがあれば、気軽にコメントください。

また、平日にもくもく作業したり質問しあえる仲間も募集しています。
ご興味がある方は[Twitter](https://twitter.com/yutaka_pg)などでご連絡くださいー！

これからもどうぞよろしくお願いします:rabbit:
現在時刻を表示する方法

・現在時刻を表示する方法
①構造化プログラミング
コード
```
date_default_timezone_set('Asia/TOKYO');
echo '現在の時刻は、' . date('G時 i時 s秒') . 'です';
```
現在時刻を取得するにはdate()を使う。
`date_default_timezone_set('Asia/TOKYO')`で日本時間を取得するように設定している。
`echo`で表示するようにして初めて表示される。(`date()`は時間を返すだけ)


②オブジェクト指向
コード
```
$today = new DateTime();
$today->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo '現在の時刻は、' . $today->format('G時 i分 s秒');
```
日本時間の設定方法が異なる。
aptでインストール済のパッケージ数を色々と確認してみる

## 環境
Ubuntu20.4

## やったこと
ローカル環境にインストール済のパッケージの数を数えてみると、1010件あることが分かる。
```
$apt list --installed | wc -l
1010
```

これで検索しても同じ結果だろうと期待してやってみると、なんと1009件。この１件の差は一体なに？
```
$apt list --installed | grep -c "installed"
1009

$apt list --installed | grep installed | wc -l
1009
```

installedが含まれていない文字列だけの行があるのだろう。
コマンドの処理にCPUの負荷がかかった場合、先頭に、**Listing**...の１行が含まれてしまう場合がある。原因は先頭のこの行でした。
```
$apt list --installed | head -n 1
Listing...
```

これで、1009件がヒットされました。
```
$apt list --installed | grep -v Listing | wc -l
1009
```

さらに、このコマンドでも、1009件が検索されるだろうと期待して実行してみると、結果は850件？
```
apt list | grep "installed" | wc -l
850
```

インストール済みのパッケージで、かつ、更新可能なパッケージには、**installed**ではなく、**upgradable**がついているようです。
このようにすると、1009件が表示されました。
```
apt list | grep -E "upgradable|installed" | wc -l
1009
```

upgradableだけを検索すると、159件存在します。
```
apt list | grep -c  "upgradable"
159
```
先ほど検索した、**installed**の検索結果と加算すると、850+159=1009件となり、つじつまが合いました。
「'」や「"」をechoで表示したいとき

・「'」や「"」をechoで表示したいとき

「I'm from Japan.」と表示したいとき、
```
echo 'I'm from Japan.';
```
では、シングルクォーテーション(')とアポストロフィー(')が同じ記号であるためエラーとなる。

これを解決する方法を載せておく。

①文字列をダブルクォーテーション(")で囲む
```
echo "I'm from Japan.";
```

②エスケープシーケンスを使う
```
echo 'I\'m from Japan.';
```
Phaser.jsでCPU対戦ポーカーを作りました

この3連休（2022年3月19日～21日）でPhaser.jsを使用して
CPU対戦ポーカーを作りました。
Phaser.jsはすごく使いやすくて、便利でした。
トランプ系のゲームは、ルールを知っている人が多いので
練習に作るには良いのではないかと思いました。

https://www.new-doumeishi.me/vsPoker/public/
遅いDocker for macを「Mutagen compose」で爆速にする（M1対応）


# Mutagen compose
`Mutagen compose`は、`Mutagen`というローカル環境とリモート環境のディレクトリを高速に同期させることができるオープンソースの開発ツールを`Docker compose`と統合させたツール。
つまり、Docker環境で`ホスト側`と`コンテナー側`のファイル同期を高速で行うのに特化したサードパーティーのツール。

https://mutagen.io/documentation/orchestration/compose


## 事前準備
### mutagen-composeのインストール 
```
$ brew install mutagen-io/mutagen/mutagen-compose
```
※ [GitHub](https://github.com/mutagen-io/mutagen-compose/releases)からバイナリのダウンロードも可能。

**これだけで事前準備は完了です。**

## 試してみる
### プロジェクトで使う docker-compose.yml を用意
```docker-compose.yml
version: "2"

services:       
  web:           
    image: httpd
    volumes:
      - ./code:/code
    ports:
      - 8080:8080
  db:             
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
```

### 上の docker-compose.yml に`Mutagen`を使用するための記述を追記
```docker-compose.yml
version: "2"

services:       
  web:           
    image: httpd
    volumes:
      - mutagen-volume:/code # 追記：　volumeをマウント
    ports:
      - 8080:8080
  db:             
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

# 以下追記
volumes:
  mutagen-volume:

x-mutagen:
  sync:
    mutagen-volume:
      mode: "two-way-resolved" # 同期モード指定（ホスト　↔　コンテナ　双方を同期）
      alpha: "./code" # プロジェクトのパス
      beta: "volume://mutagen-volume" # volumeの指定
```

### mutagen-composeを起動
```shell
$ mutagen-compose up -d
```
`mutagen-compose`は、`docker-compose`と統合されているため、`mutagen`コンテナ以外のコンテナもこの1コマンドで同時に起動される。

### 起動されたかどうか確認
```shell
$ docker-ps # コンテナが起動しているかどうか確認
```
```shell
# Volumeの確認
$ docker volume ls | grep mutagen-volume
local               mutagen-volume
```

起動が確認できたら、ローカル環境にアクセスしたり、ファイルが問題なく同期されるかを試すとデフォルトのDocker for macとの違いを体感できると思います。

# 「Mutagen compose」　VS　「Docker-sync」
Docker環境に適したファイル同期ツールは他に「Dokcer-sync」があり、「Mutagen compose」とどちらのアーキテクチャ採用をするべきかを `レスポンス(速度)`、`同期の安定性`、`導入難易度`の3つの項目で比較していこうと思います。(ベンチマーク結果は[こちら](https://qiita.com/JO95/items/96de4d7047e16b0752fa#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8C%E6%9C%9F%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)にあります)

| | レスポンス(速度) | 同期の安定性 | 導入難易度 |
|:-:|:-:|:-:|:-:|
| Mutagen compose  | ◎ | ○ | ○ | 
| Docker-sync  | ◎ | ✖ | △ |
| Docker for mac(デフォルト)  | ✖ | ○ | - |

**結論、以上の観点で一番優れていた`Mutagen compose`を採用いたしました。**

`Docker-sync`は、最初に試したのですが、rbenv/ruby のインストールが必要だったり、CPUの使用率が跳ね上がる問題やファイルの同期が安定しないなどの問題もあったので、個人的にはあまりおすすめできません。

# まとめ
現状かなり安定して速くなっているので、Docker for macの遅さにイライラしている方は、`mutagen-compose`の導入はおすすめです。
ちなみに、Macの`M1`対応ですが、こちら問題なく動いており、同期も支障なく行われていますので使う分には十分問題ないと思います。

とはいえサードパティーのツールなのでDocker for mac公式でこのマウントが遅い問題を解決されるのが一番良いですね。。



https://github.com/mutagen-io/mutagen-compose

（2022/01/15　v0.13.0　公式リリース）
Vue.js 入門2 v-on:click

v-on:clickの使い方のサンプルになります。
ボタンをクリックするとカウントが1ずつ上がります。


```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>カウントアップ</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>

  <body>
    <div id="app1">
      <p> {{ count }}回クリックしました。</p>
      <button v-on:click="increment">カウントを増やす</button>
    </div>

    <script>
      const App1 = {
        data() {
          return {
            //初期値を定義
            count: 0
          }
        },
        methods: {
          increment: function(){
          //count変数に+1する
          this.count += 1;
          }
        }
      }

      app1 = Vue.createApp(App1)
      app1.mount('#app1')

    </script>
  </body>
</html>

```
jupyterlabとdashは開発の相性が悪い

本当はdashでドロップダウンリストとかを作ってOLAP的なことをしたかったのですが、いろいろやってみて挫折した感じになります、、、。
やり終わった後「誰かに止めてほしかったなぁ」と思ったので記事として公開しておきます。

## 検討していた要件

- Notebookにdashアプリを追加し、ダッシュボードのようにパラメターを変えながら10個ぐらいのグラフの変化を見たい
- 上記のグラフのセットが複数存在する（同時に眺める必要はない）
- Jupyter labはリモートアクセスしたい、セキュリティ要件は以下
    - https
    - sudoできない専用ユーザー
    - 共通パスワードもしくはPAM


## なぜ相性が悪いか

**できないことはないが本質的な作業以外で細かい設定が湧いてきて効率が悪い** というイメージです。

- 開発のUXとして効率が悪い
    - jupyter labでdashのアプリ開発を行ううえで、ソースとinline化したアプリのウィンドウのレイアウト作業が毎回発生
    - dashのコードは結構長い事が多く、Notebookで気持ちよく編集できない
    - Webアプリのような開発スタイルでVSCodeでソースを編集しながら別ウィンドウでdashをテストするのが素直
- jupyter lab に dashを組み込むには修正が必要で、サンプルをコピペしてきた時に毎回書き直しが発生する
    - `from jupyter_dash import JupyterDash` の追加
    - `app = JupyterDash(__name__)` への変更
    - `app.run_server(mode='inline')` への変更
- 複数のセルに複数のdashアプリを配置しようとするのが面倒
    - 複数のdashアプリには複数ポートが必要なため app.run_server()で`port=XXXX` の指定が個別に必要
- jupyter labのextensionのインストール・設定の情報にたどり着くまでが遠い
    - V3系でやり方変わっていたりとかで変な記事見るとハマります
- リモートアクセスする時の設定変更
    - app.run_server()で`host='0.0.0.0'`指定
- リモートアクセスをSSL化した時のdash側のSSL対応（flaskのSSL接続化）←未解決

## 代替策は？

- パラメターの変更をUIで行うことを諦め、普通に変数定義にしてデータの変化を画面上で確認する
- ダッシュボードっぽく見るためにdashのレイアウト機能（html.Div([dcc.Graph...）などは使わず、make_subplotを使用する

## 感想

職業柄、自分で分析した後にデータ分析にあまり詳しくないメンバーにデータを見せることが多いので最初からdashでやってしまえと思ったのですが、dashはdashと割り切ったほうが余計な環境構築とかでエネルギー使わなくて良さそうです、、。ここらへんRだとRstudioでshiny開発まですんなりできるのですが、Pythonはそれぞれの開発元が独立しているのであまり連携させず使っていくのが良いのかもしれませんね。
C＃Wordの脚注と相互参照機能を紹介します

脚注は通常、Word文書ページの下部にあり、解釈、説明、または文書内の特定のコンテンツへの関連する参照を提供するために使用されます。同じ脚注がドキュメント内の2つの場所で参照されている場合、脚注は、2番目の引用の代わりに「相互参照」という機能を使用して、前の引用の場所にのみ挿入する必要があります。この記事では、[Free Spire.Doc](https://www.e-iceblue.com/Download/download-word-for-net-free.html)コンポーネントとC＃を使用して、脚注を挿入し、Wordで相互参照を設定する方法を説明します。

次のコードを使用する前に、Visual StudioでC＃アプリケーションを作成し、Spire.Doc.dllをプロジェクトに参照する必要があります。

## 使用する名前空間：

```
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
```
## 主要なコード

```
//ドキュメントをロードする                      
Document document = new Document();
document.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.docx");

//脚注が必要なテキストと位置している段落を見つける
TextSelection ts = document.FindString("楕円の法則", true, true);
TextRange textrRange = ts.GetAsOneRange();
Paragraph paragraph = textrRange.OwnerParagraph;

//脚注を作成する
Footnote footnote = new Footnote(document);
footnote.FootnoteType = FootnoteType.Footnote;

//脚注のメモテキストを追加し、そのメモ参照マークアップを上付き文字としてフォーマットする
Paragraph footPar = footnote.TextBody.AddParagraph();
footPar.AppendText("ドイツの天文学者ケプラーによって提案された惑星運動の3つの法則の1つです。");
footnote.MarkerCharacterFormat.SubSuperScript = SubSuperScript.SuperScript;

//テキストの後に脚注を挿入する
paragraph.ChildObjects.Insert(paragraph.ChildObjects.IndexOf(textrRange) + 1, footnote);

//ステップ2：相互参照フィールドを作成し、脚注にリンクする

//脚注のテキストの場所にブックマーク「_FootNote1」を追加する
BookmarkStart start = new BookmarkStart(document, "_FootNote1");
BookmarkEnd end = new BookmarkEnd(document, "_FootNote1");
footPar.ChildObjects.Insert(0, start);
footPar.ChildObjects.Insert(footPar.ChildObjects.Count - 1, end);

//相互参照フィールドを作成し、脚注のメモテキストにブックマークする
Field field = new Field(document);
field.Type = FieldType.FieldNoteRef;
field.Code = @" NOTEREF _FootNote1 \f \h  \* MERGEFORMAT ";

//同じ脚注とそれが含まれている段落を参照する必要があるテキストを検索する
textrRange = document.FindString("軌道法", true, false).GetAsOneRange();
paragraph = textrRange.OwnerParagraph;

//テキストの後に相互参照フィールドを挿入する
paragraph.ChildObjects.Insert(paragraph.ChildObjects.IndexOf(textrRange) + 1, field);

//セパレーターを追加する
FieldMark fieldmark = new FieldMark(document, FieldMarkType.FieldSeparator);
paragraph.ChildObjects.Insert(paragraph.ChildObjects.IndexOf(textrRange) + 2, fieldmark);

//テキストの後に上付き文字を追加する   
TextRange tr = new TextRange(document);
tr.Text = "1";
tr.CharacterFormat.SubSuperScript = SubSuperScript.SuperScript;
paragraph.ChildObjects.Insert(paragraph.ChildObjects.IndexOf(textrRange) + 3, tr);

//フィールド終了タグを追加する
FieldMark fieldEnd = new FieldMark(document, FieldMarkType.FieldEnd);
paragraph.ChildObjects.Add(fieldEnd);

//ドキュメントを保存する
document.SaveToFile("脚注.docx", FileFormat.Docx);

脚注のテキストが本文の内容と一致しないと思う場合は、次のコードを使用してフォントの形式と色を設定できます。
TextRange text = footPar.AppendText("ドイツの天文学者ケプラーによって提案された惑星運動の3つの法則の1つです。");
text.CharacterFormat.FontName = "Arial Black";
text.CharacterFormat.FontSize = 10;
text.CharacterFormat.TextColor = Color.DarkGray;
```

結果は以下のようになります：
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d17c6bc4-1133-2c16-49ad-f3df1076d151.png)

今回のWordの脚注と相互参照機能の紹介は以上でした、最後まで読んでいただきありがとうございます。
cscの作法 その54

# 概要
cscの作法、調べてみた。
アイコン作成ツールやってみた。

# 参考にしたページ
https://qiita.com/kob58im/items/7129810d3237e65b424d

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a7c4b76d-db4a-5063-ae08-34983c5ce638.png)


# コンパイル手順

```
>cd csc

>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc /unsafe IconMaker.cs IconUtility.cs

>IconMaker



```

以上。
【マテリアライズクエリ】初期設定のデータベース名とテーブル名を変更してみる

以前の[記事](https://qiita.com/Miki_Yokohata/items/801aa0fb528b1676d153)でマテリアライズクエリを作成しました。
その時、既定のデータベース名とテーブル名にGUIDが使用されていて認識しづらいという事を書きました。
ここでは、そのデータベース名とテーブル名を変更する方法を紹介します。
[Sharperlight](https://sharperlight.jp/)メニューから、**マテリアライズクエリ**を選択します。
![Qiita Common - Menu MQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/732f1f67-f736-1e04-ce91-c7064eae54ba.png)
以前に作成したマテリアライズクエリを選択し、[テーブル編集]ボタンをクリックします。
![2022-03-22 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a17cbc27-915c-372f-5f64-9b88eeeff359.png)
テーブル一覧が表示されるので、ダブルクリックで詳細ダイアログを開きます。
[テーブルの詳細]タブへ移動し、左側のテーブルの階層表示のテーブル名を選択します。テーブルの属性一覧が左側に表示されます。
下図で示した箇所までスクロールダウンします。
データベース名とテーブル名が確認できます。これはデータベースサーバーのデータベース名とテーブル名を表しています。
![2022-03-22 Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ecb5c78b-a940-436e-f757-4186ebb14eb3.png)
## データベース名の変更
Microsoft SQL Server Management Studioで対象となるデータベースサーバーに接続します。
**マテリアライズクエリ**のデータベースを選択し、右クリックメニューから名前の変更を選択します。
:bow_tone1:英語版ですいません。
![2022-03-22 Figure 04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/efa2365f-d705-c81b-7e23-83d86b79847d.png)
**マテリアライズクエリ**用のデータベース名は必ず接頭辞が **SLMQ_** でなければいけません。
ここでは、**SLMQ_Qiita**に変更します。
![2022-03-22 Figure 05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d6c44957-e67e-01f2-20c7-3abb6e9d5308.png)
**マテリアライズクエリ**定義の方も変更します。
![2022-03-22 Figure 06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0aea9c67-19f7-d9f7-8571-19d2f22a0298.png)
変更が終了したら一度保存して、データの更新を実行してみましょう。エラーがなければ大丈夫です。
![2022-03-22 Figure 07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4edd5d71-c57f-87c1-787f-74650966e462.png)
## テーブル名の変更
Microsoft SQL Server Management Studioでテーブル名を先ず変更します。
テーブル名については特別な接頭辞は不要です。ここでは**Qiita_SBO**とします。
![2022-03-22 Figure 08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/60baceca-9231-445f-2439-8d36d17eed5b.png)
テーブルの属性一覧まで戻ります。テーブル名を新しく変更した名前に変更します。
![2022-03-22 Figure 09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0ff98184-4161-d048-4605-e1d5d91ec3fe.png)
変更が終了したら保存します。
## 検証
変更が全て終わったら検証してみます。
![2022-03-22 Figure 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3980302b-237d-65c0-0351-71e33b33d945.png)
![2022-03-22 Figure 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b5a0d5ab-a56f-0289-b6e7-b51e0f8b02f4.png)
:postbox:[Sharperlight](https://sharperlight.jp/)
MySQLの整数型に関して

## 初めに
MySQLの整数型に関して勉強した内容を投稿する。

## 環境
■ MySQLのバージョン
5.7.35

■ 今回使用するテーブル設計

```sql
CREATE TABLE `new_table` (
  `id` tinyint(1) NOT NULL,
  `TINYINT` tinyint(11) DEFAULT NULL,
  `TINYINT_UNSIGNED` tinyint(11) unsigned DEFAULT NULL,
  `TINYINT_ZEROFILL` tinyint(5) unsigned zerofill DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
```

※既にid 1 にレコードを挿入した状態。

## 整数型の種類
MySQLの整数型には「TINYINT型」「SMALLINT型」「MEDIUMINT型」「INT型」「BIGINT型」がある。
それぞれ、ストレージ、最小値、最大値が異なっているので格納する値によって使い分ける必要がある。

詳細は下記を参照。
[MySQL公式](https://dev.mysql.com/doc/refman/5.6/ja/integer-types.html)

### TINYINT型
今回は、例としてTINYINT型を使用する。
TINYINT型のストレージは1バイト、最小値は（-128/0）最大値は（127/255）である。
※値は（符号付き/符号なし）で分けている。


### 最大値を更新
冒頭に記載したテーブルのTINYINT型に、最大値（127/255）を更新してみると、正常に意図した値が格納される。

```sql
UPDATE `test_schema`.`new_table` SET `TINYINT`=	128 WHERE `id`='1';
UPDATE `test_schema`.`new_table` SET `TINYINT_UNSIGNED`= 255 WHERE `id`='1';
```

![SnapCrab_NoName_2022-3-18_12-33-7_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/29747f14-d068-79eb-77e1-3d60cc76fe8f.png)



次に最大値を超える値を更新しようとする。


```sql
UPDATE `test_schema`.`new_table` SET `TINYINT`=	129 WHERE `id`='1';
UPDATE `test_schema`.`new_table` SET `TINYINT_UNSIGNED`= 256 WHERE `id`='1';
```
![SnapCrab_NoName_2022-3-18_12-33-7_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/29747f14-d068-79eb-77e1-3d60cc76fe8f.png)

値が最大値のままになっていることが分かる。
更新前の値が最大値でなくとも、最大値を超えた値を更新しようとすると最大値に更新されるようだ。


TINYINT型以外も同じ挙動を確認した。
また、最小値より小さい値を更新しようとすると、最大値と同じように最小値で更新されることが分かった。


インサート文でも同じように最大値を超えた値を挿入しようとすると、最大値で値が格納されている。
```sql
INSERT INTO `test_schema`.`new_table` (`id`, `TINYINT`, `TINYINT_UNSIGNED`) VALUES ('2', 129, 256);
```

![SnapCrab_NoName_2022-3-22_10-35-24_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/b87392d6-dbc1-7c9f-0fcd-5088661b652c.png)

ただし以下のメッセージが返却される。

```
1 row(s) affected, 2 warning(s): 1264 Out of range value for column 'TINYINT' at row 1 1264 Out of range value for column 'TINYINT_UNSIGNED' at row 1
```

## ()内の桁数に関して
()内の桁数はzerofillを指定した場合に有効となる。
※MySQLでは、zerofillを指定すると、自動的にUNSIGNED 属性を追加する。

冒頭のテーブル設計で記載した「TINYINT_ZEROFILL」カラムを使用する。

1を更新してみる。

```sql
UPDATE `test_schema`.`new_table` SET `TINYINT_ZEROFILL`=1 WHERE `id`='1';
```

()内の数値は5だったため、0が1の前に4つ付与されていることが分かる。

![SnapCrab_NoName_2022-3-18_12-59-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/2f10ab18-7a63-6d81-caf1-25b41358c07e.png)

## 外部キー制約
主キーと外部キーを設定する場合に同じ型でないとエラーができるので注意が必要である。

## まとめ

整数型を使用する際に、基本的には使用するストレージの容量が小さい型から優先的に使用するべきだと考える。
そのため、基本的な優先順位は以下になる。
1．TINYINT型
2．SMALLINT型
3．MEDIUMINT型
4. INT型
5. BIGINT型


また、負の数を使用しないのであれば基本的にunsigned属性を付与して、よりストレージの容量が小さい型を選択すべきだと考えられる。
httpメソッドGETとGETリクエストを操作するコマンドcurlとwgetコマンドについて

# この記事の内容
- httpメソッドGETについて
- Linux環境におけるcurl,wgetコマンドについて

# GETメソッドとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565365/5f136895-375a-0240-d89c-4d4703a0d4bf.png)

画像資料:https://medium-company.com/http-get-post-%E9%81%95%E3%81%84/

　GETメソッドとは、HTTP通信でWebブラウザなどを通してユーザーからWebサーバへリクエストを送る際に利用されるリクエストの種類の一つです。上記の画像でいう、HTTPリクエストの部分にあたります。webサーバーに指定したURLを送信してほしいときにGETメソッドは、使われます。

 また、HTTPレスポンスの確認やURLからリソースをダウンロードするコマンドに、`curl`や`wget`があります。次の章で、概要や使い方を説明します。


# curlコマンドとは？
## `curl`コマンドの基本的な使い方
　`curl`コマンドは、HTTPレスポンスの中身を確認するときに使用するコマンドです。

基本的な使い方は、
```bash
$ curl 指定のURL 
```

Headerのみ表示したい場合は、
```bash
$ curl -I 指定のURL # ヘッダーのみ表示
```
Bodyのみ表示したい場合は、
```bash
$ curl -i 指定のURL #Bodyのみ表示
```
## `curl`コマンドのオプション
|オプション|説明|
|:-:|:-:|
| -d  | POSTリクエストとしてフォームを送信する  |
| -l  | ヘッダ情報のみ表示する  |
| -i  | ボディ情報のみを表示する  |
| -O  | 取得したデータを標準出力ではなくファイルに出力する  |
| -R  | ダウンロードしたファイルのタイムスタンプをサーバー上のタイムスタンプに合わせる。  |
| -L  | 要求したページにリダイレクトが設定されていた場合に追従する。  |

引用:https://envader.plus/course/5/scenario/1026

# wgetコマンドとは?
　`wget`コマンドとは、指定したURLからリソースをダウンロードする際に使用するコマンドです。Linux環境は、基本的にCUIでダウンロードをすることがほとんどなので`wget`を使う必要があります。

　また、`wget`は、Linuxに標準に備わっている機能ではないので、
```bash
$ sudo apt install wget
```
のようにインストールする必要があります。

## `wget`コマンドの基本的な使い方
wget`コマンドの基本的な使い方は、
```bash
$ wget https://指定したURL
```
その後、`chmod`コマンドなどで実行権限を与え、`wget`でとってきたダウンロード
ファイルを実行
```bash
$ ./ダウンロードファイル
```
# まとめ
今回は、
- HTTPリクエストのGETメソッド
- HTTPレスポンスの中身を確認する`curl`コマンド
- 指定したURLからリソースをダウンロードする`wget`コマンド
- 
　　を学びました。web開発やアプリケーションのテストの際は必ず使われるので、覚えておきましょう！

# 実行環境
　オンライン学習サービス[Envader](https://envader.plus/courses)を使いました。
Envaderは、環境構築が不要で簡単にLinux環境が学べるので学習するのにとても便利でした。コースは、
- Linux基礎
- Linux応用
- セキュリティー基礎　などなど

　無料で使えて、初心者には難易度の高い環境構築しなくていいのでおすすめです。（一部有料）
今回学んだことをもっと深く学びたい方や新しい知識を身につけたい方は、ぜひ活用してみてください。

[Envaderコース一覧](https://envader.plus/courses)

# 参考資料
https://envader.plus/course/5/scenario/1026
https://medium-company.com/http-get-post-%E9%81%95%E3%81%84/
SMART Gatewayのススメ

# はじめに

この記事では、ICTインフラの制御・監視ソリューションであるSMART Gatewayについて紹介させていただきます。

　__公式HP:__ https://www.bosco-tech.com/smart-gw/

本投稿では、SMART Gatewayのユースケースの中でもオンプレミスのリソースを利用してハンズオンなどを実施する際に有用な機能を紹介させていただきます。

__前提:__
　　利用リソースとしてオンプレミス環境を有している
　　一定の期間内に上記リソースを利用してもらう（ハンズオン等)

__ハンズオン内容:__ 
　　イベント会場向けNW設備の設定及び監視サーバー構築/設定

__機能紹介:__ 
　　1.利用イメージ
　　2.接続機器選択
　　3.コマンドフィルタ
　　4.ログ収集
　　5.アクションスクリプト

# 利用イメージ
![スクリーンショット 2022-01-13 13.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427914/1eccdad5-2410-c089-dbbf-0e434798f8d9.png)

VPNを利用せずに、ローカル環境のリソースへのアクセス方法を提供します。
基本操作としてはhttpsアクセスによるブラウザ操作により完結しており、各機器へのssh接続もブラウザ上で実施されます。

# 接続機器選択画面
![スクリーンショット 2022-03-22 9.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427914/dc4ff01c-7125-e0aa-2073-b2f48755dfd8.png)

また、アクセスするユーザーのアカウントはSMART Gateway側の設定で利用期間や接続機器へのアクセス期間を定めることができるため、特にテンポラリーで払い出したアカウントを扱い易いといったメリットがあります。

# コマンドフィルタ
![スクリーンショット 2022-03-10 13.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427914/c66efb91-089d-0d3a-68f3-b9a518a3b42e.png)
そしてコマンドフィルタ機能を各ユーザー/グループ単位で正規表現により記述できるため、例えばNW機器の設定情報のみを参照したいなどのケースで利用することが可能です。
実際に今回のハンズオンでは、設定情報のヒントとして設定済み機器の参照を許可していました。(例:NW機器における “configure”コマンドの禁止等)

# ログ画面
![スクリーンショット 2022-03-22 9.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427914/46ade7e0-0e1e-6a1e-4585-dced2bd37c11.png)

各ユーザーが実行したコマンドが収集されており、その情報が閲覧できます。
トラブルシューティング時の作業ログとしても用いることができる便利機能となります。

# アクションスクリプト
![スクリーンショット 2022-03-10 13.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427914/77b9b3f3-b931-fc25-a6e9-cf87432f0dc0.png)
　※OpenStack上にある”mddo-test”ノードのリブート

# まとめ
　上記の接続環境の元に、オンライン上で学生に作業をしてもらいイベントの準備を行っていましたが、学生側の作業進捗具合をコマンドログ等で把握できたため声をかけるタイミングが非常に取り易く、円滑に作業を進めていくことができました。
　（オンラインのみでの実施は、色々と難しいと予想していましたので)

　実際に進捗が滞っている場面でも共有セッション機能を利用することで作業画面を共有しながらアドバイスが実施できる点も非常に良いポイントでした。
　これまで実施してきたハンズオンでは、上記同様の環境を異なるツールで補完して実現していましたが、SMART Gatewayで一括で操作/管理ができる点は運用サイドとしては非常に魅力的です。

　以上、「SMART Gatewayのススメ」の記事となります。

　他にもファイル転送/多要素認証といった機能もあり、セキュリティ面についても配慮されていますので社内リソースをより手軽に利用したい、などの利用シーンには効果的です。

　商用ソフトウェアなので気軽に試すことはできませんが、興味を持たれた方は是非冒頭のURLより提供元であるBOSCO様に問い合わせてみては如何でしょうか？
RedshiftでDROP DATABASEしたらエラー「ERROR: database "hogehoge" is being accessed by other users」

## はじめに

redshiftでDROP DATABASEしたらエラーが出たのでその対処方法を残します。

```
DROP DATABASE "hogehoge";
```
```
ERROR: database "hogehoge" is being accessed by other users 
```

## 調査

ぐぐると、Postgresqlの文献ですが以下が見つかりました。
どうやら誰かのセッションが残っている様子。

https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db

## 対処

セッション一覧を出してprocpid列に出てきた値をメモります。複数件あれば全部メモります。
自分は4件のセッションがありました。

```
SELECT * FROM pg_stat_activity WHERE  datname = 'hogehoge';
```

pg_terminate_backend関数でセッションを切断していきます。複数セッションが残っているのであればその回数分だけこのSQLをたたきます。
```
select pg_terminate_backend(procpidの値) from pg_stat_activity 
where datname = 'hogehoge';
```

自分は、削除できないセッションが1件だけありました。
それはいま自分がつないでいるセッションなので消せないのだと思うんですが詳細調べる前に次に進んでしまいました...

## 結果

(1件だけ削除できないセッションがあったけど)無事にDROPできました。
```
DROP DATABASE "hogehoge";
```

## 文献

とても参考になりました。ありがとうございます。

https://qiita.com/iewori/items/0461f2c0e9e8ce0fd1ee
[Fig]ターミナルでIDEの様な補完機能を実装

# FIg
[Fig](https://fig.io/)とは、
ターミナルでIDEのような補完機能が使えるappです。その他重要な特徴として、
- 既存のターミナルで利用可能 (terminal, iterm2, vscode ...)
- 既存のshellで利用可能 (bash, zsh, fish,...)
- 導入がすごく簡単！
実際に導入できるとこんな感じになります。
fishでは元々簡単な補完機能がありますが、bash, zshを使ってる方にとってはすごく便利に使えそうです。
![0m5lg-rwhts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678850/cef8bd5a-148c-6ab9-0f78-ee4ac4273675.gif)


# 導入方法

こちらの[URL](https://fig.io/)からインストールします、「Download for free」をクリック
あとはインスール処理、セキュリティの設定を指示に従って行えば完了です！
cscの作法 その53

# 概要
cscの作法、調べてみた。
ネコのイラストやってみた。

# 参考にしたページ
https://qiita.com/nkojima/items/20d3e724f23ee29c7ac6

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b9af67dc-18ea-3fc2-42ec-e9905960fa88.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	form1() {
		this.Text = "neko";
		ClientSize = new Size(700, 500);
	}
	protected override void OnPaint(PaintEventArgs e) {
		Graphics g = e.Graphics;
		g.DrawEllipse(new Pen(GetFaceBorderColor(), 5), GetFacePosition());
		g.DrawPolygon(new Pen(GetFaceBorderColor(), 5), GetLeftEarPosition());
		g.DrawPolygon(new Pen(GetFaceBorderColor(), 5), GetRightEarPosition());
		g.FillEllipse(new SolidBrush(GetFaceColor()), GetFacePosition());
		g.FillPolygon(new SolidBrush(GetFaceColor()), GetLeftEarPosition());
		g.FillPolygon(new SolidBrush(GetFaceColor()), GetRightEarPosition());
		g.FillEllipse(Brushes.Black, 190, 200, 15, 50);
		g.FillEllipse(Brushes.Black, 295, 200, 15, 50);
		g.DrawArc(new Pen(Color.Black, 5), new Rectangle(190, 270, 60, 60), 0, 180);
		g.DrawArc(new Pen(Color.Black, 5), new Rectangle(250, 270, 60, 60), 0, 180);
		g.DrawLine(new Pen(Color.Black, 5), new Point(5, 210), new Point(120, 225));
		g.DrawLine(new Pen(Color.Black, 5), new Point(0, 250), new Point(120, 250));
		g.DrawLine(new Pen(Color.Black, 5), new Point(5, 290), new Point(120, 275));
		g.DrawLine(new Pen(Color.Black, 5), new Point(380, 225), new Point(495, 210));
		g.DrawLine(new Pen(Color.Black, 5), new Point(380, 250), new Point(500, 250));
		g.DrawLine(new Pen(Color.Black, 5), new Point(380, 275), new Point(495, 290));
		base.OnPaint(e);
	}
	private Color GetFaceColor() {
		return Color.FromArgb(255, 221, 209, 174);
	}
	private Color GetFaceBorderColor() {
		return Color.FromArgb(255, 182, 156, 78);
	}
	private Rectangle GetFacePosition() {
		return new Rectangle(50, 100, 400, 280);
	}
	private Point[] GetLeftEarPosition() {
		return new Point[] {
			new Point(430, 30),
			new Point(430, 210),
			new Point(300, 110)
		};
	}
	private Point[] GetRightEarPosition() {
		return new Point[] {
			new Point(70, 30),
			new Point(70, 210),
			new Point(200, 110)
		};
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}

```
以上。
【Azure】自社のAzureADを使用してお客さんAWS環境へSSOする

## 概要
お客さんのAWS環境を使用する際、アカウント/パスワード管理の手間をなくしたいという場面は多々あると思います。
自社のAzureADを使ってAWSにフェデレーションログインさせることで、そうした手間が省けます。

## 手順
- 以下手順を元に作業すれば大体できます。
    - [チュートリアル: Azure Active Directory シングル サインオン (SSO) と AWS Single-Account Access の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial#configure-aws-single-account-access-sso)

- AWS側：お客さん側の作業
- Azure側：自社側の作業

## 注意点
- [Azure AD SSOの構成](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial#configure-azure-ad-sso)
    - 手順４で「[基本的な SAML 構成] セクションで、[識別子 (エンティティ ID)] と [応答 URL] の両方を同じ既定値 () に更新します。」という記載があるが、ここには要注意。
    - 他の案件でデフォルトの「(略)signin.aws.amazon.com/saml」という識別子を使用している場合、別の値を命名する必要がある。（識別子はAzureAD内で一意の値である必要があるため。）
    - その際、応答URLはデフォルトのままにすることに留意する。
        - 例）
            - 識別子:(略)signin.aws.amazon.com/saml#test-project
            - 応答URL:(略)signin.aws.amazon.com/saml
- [Azure AD テスト ユーザーの割り当て](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial#assign-the-azure-ad-test-user)
    - ユーザー追加はここの手順で実施するのではなく、[AWS Single-Account Access でロール プロビジョニングを構成する方法](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial#how-to-configure-role-provisioning-in-aws-single-account-access)の手順が完了してから実施する。
    - プロビジョニングが完了していないと、AWS側で作成したロールが取り込めないため、ログインするための適切な権限が割り当てられない模様。
    - AWS側のロールが1つだけだったら手順通りのDefault設定で問題ないかもしれないが、複数ロールが作成されている場合はプロビジョニングが完了してからユーザー追加画面で適切なロールを選択しないとログイン時にエラーが発生した。
    - プロビジョニングが完了すると権限選択の画面でAWS側のロールが表示されるようになる
cscの作法 その52

# 概要

cscの作法、調べてみた。
シェルピンスキーのギャスケットやってみた。

# 参考にしたページ
https://qiita.com/kiuyas/items/4c05cfa5e341e9788b46


# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/385b3ad0-340c-5680-59e4-f893dae3cd72.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	private int maxLevel = 6;
	form1() {
		BackColor = Color.Black;
		this.Text = "シェルピンスキーのギャスケット";
		ClientSize = new Size(700, 500);
	}
	protected override void OnPaint(PaintEventArgs e) {
		DrawSierpinskiGasket(e.Graphics, 319, 40, 30, 430, 609, 430, 0);
		base.OnPaint(e);
	}
	private void DrawSierpinskiGasket(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3, int level) {
		if (level == maxLevel)
		{
			g.DrawLine(Pens.Lime, x1, y1, x2, y2);
			g.DrawLine(Pens.Lime, x2, y2, x3, y3);
			g.DrawLine(Pens.Lime, x3, y3, x1, y1);
		}
		else
		{
			int xx1 = (int)((x1 + x2) / 2.0);
			int yy1 = (int)((y1 + y2) / 2.0);
			int xx2 = (int)((x2 + x3) / 2.0);
			int yy2 = (int)((y2 + y3) / 2.0);
			int xx3 = (int)((x3 + x1) / 2.0);
			int yy3 = (int)((y3 + y1) / 2.0);
			DrawSierpinskiGasket(g, x1, y1, xx1, yy1, xx3, yy3, level + 1);
			DrawSierpinskiGasket(g, x2, y2, xx1, yy1, xx2, yy2, level + 1);
			DrawSierpinskiGasket(g, x3, y3, xx3, yy3, xx2, yy2, level + 1);
		}
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}

```

以上。
【合格体験記】データサイエンス数学ストラテジスト(上級)に合格しました

# 0. はじめに
　データサイエンス数学ストラテジストの上級に合格しました。
　本資格は2021年9月21日にできたばかりの新資格です。今後、資格取得を目指す方が増えると思われます。受かるためにはどのような勉強・対策をすればよいのか、私なりの勉強法を紹介したいと思います。※上級(受験階級)向けに紹介しています。
![スクリーンショット 2022-03-21 202816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/6fbb5029-b301-254a-f675-3ca72ca43cee.png)

# 目次
[0. はじめに](#0-はじめに)
[1. 資格を取得しようと思ったきっかけ](#1-資格を取得しようと思ったきっかけ)
[2. データサイエンス数学ストラテジストとは](#2-データサイエンス数学ストラテジストとは)
[3. 勉強の仕方](#3-勉強の仕方)

# 1. 資格を取得しようと思ったきっかけ
　私は人工知能における機械学習や深層学習の仕組みについて学んでいます。その仕組みを理解するためには解析学をはじめとする数学の知識が必要です。数学の勉強にはゴールがないので具体的なゴールを設定する必要があります。また、独学で数学を勉強する場合はモチベーションを保つことも欠かせません。そこで、資格取得をゴールに設定しました。

# 2. データサイエンス数学ストラテジストとは
　データサイエンス数学ストラテジストには中級と上級があり、IBTでの受験が可能です。下表は受験階級ごとの料金や試験時間をまとめたものです。どの受験階級においても1問につき平均3分で解く必要があるため、時間配分が重要となります。

|受験階級|中級|上級|
|:--:|:--:|:--:|
|料金|7,000円|9,000円|
|試験時間|90分|120分|
|問題数|30問|40問|
|合格基準|60%以上|70%以上|

　より詳しい情報は[公式サイト](https://www.mathdatascience.jp/personal/)で確認できます。

https://www.mathdatascience.jp/personal/

# 3. 勉強の仕方
### 参考書選び
　試験対策として使う参考書は基本的に[『公式問題集』](https://www.amazon.co.jp/dp/4296109898)の一冊があれば十分です。

https://www.amazon.co.jp/dp/4296109898

　注意点として、この参考書は誤植が多いので、次の[正誤表](https://www.su-gaku.biz/book/pdf/book_teisei_mdss_high.pdf)を参照してください。

https://www.su-gaku.biz/book/pdf/book_teisei_mdss_high.pdf

### 参考書の使い方
- 1周目は丁寧に問題を解き、丁寧に解説を読む。
- 2周目からは問題を解く際に計算を省く。
    - 問題文を読み、自分なりの解法をイメージする。
    - 解説を確認し、自分の解法と一致していたら次のページへ進む。間違っていた場合は解説を読み、計算も丁寧に行う。

　この作業を自信が持てるまでひたすら繰り返します。ただし、解説を読んでも理解できないものや自分が苦手としている分野がある場合、公式問題集の他に参考書を用意する必要があります。私の場合は、次に挙げる4冊の参考書を用意することで知識を補いました。

### 別途用意した参考書の一覧(4冊)

- [線形代数](https://www.amazon.co.jp/dp/456300216X
)

https://www.amazon.co.jp/dp/456300216X

- [微分積分](https://www.amazon.co.jp/dp/4563002216/
)

https://www.amazon.co.jp/dp/4563002216/

- [深層学習](https://www.amazon.co.jp/dp/B09LY8F34C/
)

https://www.amazon.co.jp/dp/B09LY8F34C/

- [微分方程式](https://www.amazon.co.jp/dp/4320017501/
)

https://www.amazon.co.jp/dp/4320017501/
【備忘録】プライマリキー(主キー)について

## プライマリキー(主キー)とは
プライマリーキー(主キー)とは作成したテーブルの中の1つまたは複数のカラムの組み合わせに対して設定するもので、
テーブルに格納されているデータを識別するための目印のようなものです。

テーブルには多くのデータが含まれており、 1つ1つのデータには複数のカラムの値が格納されています。
格納されたすべてのデータの中から1つのデータを特定したいときに、 
1つまたは複数のカラムの値を検索してデータを特定しますが、
その時に最も適したカラムに設定されるのがプライマリーキーです。

カラムにプライマリーキー制約を設定すると、
カラムには他のデータの値を重複することのない値しか格納することができなくなります。
また NULL も格納することができません。
その結果、プライマリーキー制約が設定されたカラムの値を検索することで、
テーブルの中でただ一つのデータを特定することができます。

参考:
https://www.dbonline.jp/mysql/table/index8.html#:~:text=%E3%83%97%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%AA%E3%83%BC%E3%82%AD%E3%83%BC(%E4%B8%BB%E3%82%AD%E3%83%BC)%E3%81%A8,%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82
cscの作法 その51

# 概要

cscの作法、調べてみた。
コッホ曲線やってみた。

# 参考にしたページ
https://qiita.com/kiuyas/items/4c05cfa5e341e9788b46


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/45f5651b-0f37-873e-9853-21f547ff53aa.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	private const double PAI = 3.141592653589393238462643383279;
	private const double thetaOf60Degree = 60 * PAI / 180;
	private int maxLevel = 4;
	form1() {
		BackColor = Color.Black;
		this.Text = "コッホ曲線";
		ClientSize = new Size(700, 500);
	}
	protected override void OnPaint(PaintEventArgs e) {
		DrawKochCurve(e.Graphics, 0, 100, 639, 100, 0);
		base.OnPaint(e);
	}
	private void DrawKochCurve(Graphics g, int x1, int y1, int x2, int y2, int level) {
		if (level == maxLevel)
		{
			g.DrawLine(Pens.Yellow, x1, 479 - y1, x2, 479 - y2);
		}
		else
		{
			int vx = (x2 - x1) / 3;
			int vy = (y2 - y1) / 3;
			int xx1 = x1 + vx;
			int yy1 = y1 + vy;
			int[] v1 = rotate(thetaOf60Degree, vx, vy);
			int xx2 = xx1 + v1[0];
			int yy2 = yy1 + v1[1];
			int[] v2 = rotate(-thetaOf60Degree, vx, vy);
			int xx3 = xx2 + v2[0];
			int yy3 = yy2 + v2[1];
			level++;
			DrawKochCurve(g, x1, y1, xx1, yy1, level);
			DrawKochCurve(g, xx1, yy1, xx2, yy2, level);
			DrawKochCurve(g, xx2, yy2, xx3, yy3, level);
			DrawKochCurve(g, xx3, yy3, x2, y2, level);
		}
	}
	private int[] rotate(double theta, int x, int y) {
		double sinTheta = Math.Sin(theta);
		double cosTheta = Math.Cos(theta);
		int x2 = (int)(cosTheta * x - sinTheta * y);
		int y2 = (int)(sinTheta * x + cosTheta * y);
		return new int[] { x2, y2 };
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}






```
以上。
【UiPath】クラウド環境のリージョンや障害発生状況など諸々（備忘）

※ 2022年3月時点の情報に基づいています

# Enterprise版のリージョン
クラウドサービスを利用する際、業務によってはデータの保管国を知っていないといけないケースが多々あります。
Enterprise版の場合、リージョンはユーザによって選択することができます。

https://docs.uipath.com/overview-guide/lang-ja/docs/data-residency-cloud#tenant-and-service-regions

Orchestratorのテナントを追加する際にリージョンを選択します。
![リージョン選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/80284969-bd00-6087-b5ed-f513c6ee8a2b.png)

既存のテナントは「テナント設定」からリージョンを確認できます。リージョンの変更はできません。
![リージョン確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2ba5f1f2-2205-1afc-ef2f-79d88d5fc84d.png)


# Community版のリージョン
Community版の場合、リージョンは選択できません。表示はされませんが、「Europe（欧州）」に限定されます。
![コミュニティ版.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/7de29dfa-58e0-36b0-7693-9b0780d81036.png)


# 障害発生状況やメンテナンス情報
Cloud環境の障害発生状況（稼働状況）やメンテナンス情報は、「UiPath Status」から確認できます（英語のみ）。

https://status.uipath.com/

サービス別に情報を見ることは可能ですが、特定リージョンに情報を絞り込むことはできそうにありません。
日本リージョンを使用している場合、タイトルから「Japan（日本）」や「APAC（アジア太平洋）」を抽出すれば良さそうです。
メール、RSS、Slackなどで更新情報をプッシュできるので、システム管理者はウォッチしておくべきかと思います。

↓TeamsでRSSを受け取る
![RSS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/0d233cd8-8d07-4deb-ce67-54f648cc2791.png)

# ストレージ容量
特にストレージバケットはストレージ容量を食うので、何らかの制限があると思われましたが、公式のドキュメントに明記されていませんでした。今後、ストレージの上限が設定され、有償での追加ストレージの販売になるかもしれません。

# API
クラウドなのでAPIのコール回数に制限があるかなと思ったのですが、公式のドキュメントから見つけられず。今後、負荷を大幅にかけるような使い方を制限するためのルールはできるかもしれません。

# リリース
Community版の1週間後に、Enterprise版のリリースが行われます。なお、Community版のリリースの際、事前予告をするとは書いてないので、予告なしにアップデートされることになると思われます。
となると、Enterprise版を使用している場合は、Community版のリリース時に公開されるリリースノートでアップデート内容を知ることとなり、万が一、本番業務へ影響しそうな箇所があれば、1週間以内に対応しないといけないということになります。
と厳しいことを書きましたが、多くの利用者に影響がある重大な変更（クラシックフォルダ廃止など）は十分な移行期間が取られるはずなので、心配はいらないと思われます。とはいえ、他のクライドサービスと同様、本番業務へ影響があれば大変なミッションをお持ちの方は、リリースノートは必読かと思います。

https://docs.uipath.com/overview-guide/lang-ja/docs/about-feature-availability-for-community-and-enterprise

# 脆弱性診断やペネトレーションテスト
利用ポリシーの第1条(g)に以下のような記載があるため、基本的には禁止されていると思われます。
クラウドサービスを利用する際、何らかのセキュリティ診断をする必要がある方は、事前にUiPath社に相談した方が良さそうです。
> あらゆる種類のセキュリティテスト（ペネトレーションテストを含みます。）を実施するために、本ソフトウェア又は本サービスを使用してはならず、また、第三者をしてかかる使用をさせないものとします。