OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Stack Hub のコストを集計した際のメモ

## はじめに

EAポータルからダウンロードした利用状況の詳細csvを集計した際のメモ。

EAポータルやAzureポータルの「コストの管理と請求」でも合計金額やリソース別の集計は得られるが、Azure Stack Hub のサブスクリプション別やリソースグループ別など、独自の集計をしたい場合は明細csv（或いはAPI）を使う。


## 主要な項目

（何が主要かは目的によっても変わるだろうが）

##### Date

請求月。
ポータルの請求金額と一致させるには、この年月単位で集計する。

##### Consumed Quantity

使用量。
単位はリソースの課金単位によって異なる。

##### Resource Rate

単価。

##### Extended Cost

金額。
これを集計するとポータルの課金額と一致する。
小数があるので、BIツールなどに取り込む場合は整数とならないよう注意する事（管理用リソースなど金額がゼロの明細も多いので、1行目をサンプルデータとすると整数型が自動で割り当てられる事がある）。

##### Meter Sub Category

製品のサブカテゴリ。
"Windows VM", "Managed Disks", "Block Blob" など。

##### Resource Group

テナントユーザーのリソースグループ。

##### AdditionalInfo.AzureStack.SubscriptionId

テナントユーザーのサブスクリプションID。
サブスクリプション別に集計するにはこれを使う。
JSON 形式で格納されている "AdditionalInfo" 内の項目なので、展開して使用する。


##### AdditionalInfo.AzureStack.Location

Azure Stack Hub リージョン。
JSON 形式で格納されている "AdditionalInfo" 内の項目なので、展開して使用する。


#### Tag

リソースに付与したタグ。
ポリシーで集計用の情報を入力させた上で。


## その他項目

##### Subscription Guid / Subscription Name

Azure に登録されている、Azure Stack Hub 全体のサブスクリプション。Azure Stack Hub テナントユーザーのサブスクリプションでは無い事に注意。

##### Product

使用した製品。「Admin」が含まれていれば管理者用リソースを表す。

##### Meter Category

「Azure Stack Hub」固定。



## おわりに

![2020-04-16_18h07_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/f9ed0f1c-f658-9cb0-cecf-e6a815eda9b8.png)
EAポータルがこんな感じになっているので、これを使うのが真っ当な道なのかも知れない。
特定の文字を入力したときに行全体の背景色を変える方法

行の色を変えたい表全体を選択

ホームタブ⇒条件付き書式⇒新しいルール⇒数式を使用して、書式設定するセルを決定

次の数式を満たす場合に値を書式設定　の欄に以下のように数式入力
=\$H2="done"
(\$H2 ⇒ [特定の文字を入力する対象の列]のセルを1つ指定する。)　
※選択指定すると\$H\$2というように自動入力されるので$H2に修正する。
("done" ⇒ 特定の文字)

[書式]ボタンをクリック
塗りつぶしタブを選択
選択したら[OK]ボタンをクリック
書式ルールの編集画面に戻ったら[OK]ボタンをクリック
Amazon Linux 1のGCCとG++を7.2にアップデートする

## 結論

もちろんAmazon Linux 2にOSを入れ替えるのが最良だが、とりあえずはこれでしのげる。

```
sudo yum install gcc72 gcc72-c++
```

## どうしてそんなことしたの？

Rubyのunicornサーバー（Webサーバー）としてAmazon Linux 1のサーバーを使っていたが、ここにsassc-2.1.0というgemをインストールしようとしてg++が古いためにlibsassのビルドで失敗したため。

```
...
......
compiling ./libsass/src/ast_sel_unify.cpp
compiling ./libsass/src/extend.cpp
linking shared-object sassc/libsass.so
lto1: fatal error: LTO_tags out of range: Range is 0 to 365, value is 2566
compilation terminated.
lto-wrapper: g++ returned 1 exit status
......
...
```

g++をアップデートしようとしたが、AmazonLinux1で、下記のコマンドで入手できる最新のg++は4.8.3だった。

```
sudo yum install gcc gcc-c++
```

## 探し方

```shell
# 検索
yum search "gcc"


# 結果
57 packages excluded due to repository priority protections
============== N/S matched: gcc================
gcc-c++.noarch : C++ support for GCC
gcc-gnat.noarch : Ada 95 support for GCC
gcc44-c++.x86_64 : C++ support for GCC
gcc44-gnat.x86_64 : Ada 95 support for GCC
gcc44-objc.x86_64 : Objective-C support for GCC
gcc44-objc++.x86_64 : Objective-C++ support for GCC
gcc48-c++.x86_64 : C++ support for GCC
gcc48-gnat.x86_64 : Ada 95 support for GCC
gcc48-plugin-devel.x86_64 : Support for compiling GCC plugins
gcc64-c++.x86_64 : C++ support for GCC
gcc64-gdb-plugin.i686 : GCC plugin for GDB
gcc64-gdb-plugin.x86_64 : GCC plugin for GDB
gcc64-plugin-devel.x86_64 : Support for compiling GCC plugins
gcc72-c++.x86_64 : C++ support for GCC
gcc72-gdb-plugin.x86_64 : GCC plugin for GDB
gcc72-plugin-devel.x86_64 : Support for compiling GCC plugins
libgcc44.i686 : GCC version 4.4 shared support library
libgcc44.x86_64 : GCC version 4.4 shared support library
libgcc48.i686 : GCC version 4.8 shared support library
libgcc48.x86_64 : GCC version 4.8 shared support library
libgcc64.i686 : GCC version 6 shared support library
libgcc64.x86_64 : GCC version 6 shared support library
libgcc72.x86_64 : GCC version 7 shared support library
libgccjit.i686 : Library for embedding GCC inside programs and libraries
libgccjit.x86_64 : Library for embedding GCC inside programs and libraries
libgccjit-devel.x86_64 : Support for embedding GCC inside programs and libraries
gcc.noarch : Various compilers (C, C++, Objective-C, ...)
gcc-gfortran.noarch : Fortran support
gcc44.x86_64 : Various compilers (C, C++, Objective-C, ...)
gcc44-gfortran.x86_64 : Fortran support
gcc48.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
gcc48-gfortran.x86_64 : Fortran support
gcc64.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
gcc64-gfortran.x86_64 : Fortran support
gcc72.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
libgomp.i686 : GCC OpenMP v3.0 shared support library
libgomp.x86_64 : GCC OpenMP v4.5 shared support library
libmudflap.i686 : GCC mudflap shared support library
libmudflap.x86_64 : GCC mudflap shared support library
libmudflap44-devel.x86_64 : GCC mudflap support
libquadmath.i686 : GCC __float128 shared support library
libquadmath.x86_64 : GCC __float128 shared support library
```

## 参考

https://stackoverflow.com/questions/38188896/installing-g-5-on-amazon-linux
ターミナルの基礎

#ターミナルとは
ターミナルは、PCに命令をすることができるアプリケーション。
プログラムを記述したファイルを読み込み、プログラムとして実行するにはコマンドラインというツールが必要となる。

#GUI(グラフィカルユーザインターフェース)
グラフィックを用いて操作を行う仕組み。つまり、一般的なPCの操作のこと。
例）クリック、ドラックアンドドロップ、ファイルの生成、削除...

#CLI(コマンドラインインターフェース)
コンピュータに対してキーボードからコマンドという文字を打ち込んで操作を行う仕組み。
ターミナルはCLIに該当するアプリケーションとなる。

#ターミナルの画面
コンピュータ名:~ユーザー名$　ここから入力開始
~　: カレントディレクトリ
$　: プロンプト

#ディレクトリ
ディレクトリとはコンピュータ上で複数のファイルを整理するためのファイルの入れ物のことで、フォルダのことを指す。
PCの実体はディレクトリによる階層構造になっており、ディレクトリの中にさらに多くのディレクトリやファイルが保存されている。
「ルートディレクトリ」「カレントディレクトリ」「ホームディレクトリ」がある。

#ルートディレクトリ
ディレクトリは階層構造になっているので、あるディレクトリは他のディレクトリに属している。
ルートディレクトリはその 階層構造の一番上にあるディレクトリのこと。

#カレントディレクトリ
ターミナルで現在作業中となるディレクトリのことをカレントディレクトリと呼ぶ。
ターミナルではここを基準に、PCに命令を出していく。ターミナルで~と表示する。
ターミナルでは必要に応じて作業するディレクトリを移動しコマンドを実行していく。
移動するたびにカレントディレクトリが指し表すディレクトリは変わる。

#ホームディレクトリ
新規にターミナルを立ち上げた場合に作業中となるディレクトリのこと。
Macでのデフォルトのホームディレクトリは/Users/ユーザ名となり、ターミナルでは~で表される。

#パス
パスとはディレクトリやファイルの所在を示す文字列のこと。
ディレクトリは階層ごとに/(スラッシュ)で区切ります。パスの指定方法は「絶対パス」と「相対パス」の2つがある。

#絶対パス
絶対パスはルートディレクトリから指定するパス。
Macの全ディレクトリにおけるルートディレクトリは/。全てのディレクトリやファイルはここからたどることができる。
そのため、絶対パスで指定するときにはパスの一番最初に/を指定。
例）一番始めの/はルートディレクトリを指し、2番目以降の/は階層の区切りを表している点を混同しないように注意。

```
/Users/ユーザ名/Desktop
```

例）/Users/ユーザ名はホームディレクトリであり、~と表すことができるため、ホームディレクトリより下層にあるディレクトリのパスは以下のような絶対パスで示すこともできる。

```
~/Desktop
```

#絶対パスのメリット
どのディレクトリで作業していても指定した場所に移動できる

#絶対パスのデメリット
パスをルートディレクトリからたどって指定する必要があるため、記述が冗長になる場合がある

#相対パス
カレントディレクトリから指定するパス。
ルートディレクトリから指定しないため、パスの始めに/をつけてはいけない。
カレントディレクトリ直下のディレクトリやファイルであれば、どのようなディレクトリ階層にあるのか指定することなく簡単にパスの指定ができる。
記述をシンプルにパスの指定が可能となるメリットがある。ただし、カレントディレクトリがどこにあるのかによって、指定するパスを変更する必要がある。

例）カレントディレクトリがホームディレクトリの場合にデスクトップの場所を指定

```
Desktop
```
例）カレントディレクトリがホームディレクトリの場合にデスクトップにあるファイルの場所を指定

```
Desktop/メモ.txt
```
Herokuにpython3.7.7のversionは適応していなかった話

Herokuにpython3.7.7の環境でデプロイしたところ失敗したので調べたところHerokuに対応しているpythonのversionは下記です。

 - python-3.8.2
 - python-3.7.6
 - python-3.6.10 
 - python-2.7.17

2020/4/16現在の情報です。
https://devcenter.heroku.com/articles/python-support
こちらのURLに詳しくは書いてます。
初めてのDB論理設計（5分ちょいで読めます）

## mysqlとか触ってたけどそもそもデータベースて何？

そんなの知ってるわ！！！て方は飛ばしてください。
データベースとは、ある**特定の条件に当てはまるデータ**を複数集めて、後から使いやすい形に整理した**情報**のことを表します。
コンピューター以外の身近な所にもデータベースと呼ばれるものもあります。 例としてわかりやすくあげると、学生時代に使っていた**出席簿**や**電話帳**等もデータベースと言えます。
僕たちが開発しているシステムやWebサービス**全てにおいて共通**しているのが、**データベース** を持っていると言うことです。　　
このデータベースにある情報を使うことによって世の中のサービスが運用できてるですね！！

## 実際にDBを設計してみよう
 **今回は論理設計について学びます**

**論理設計の手順一覧**
1. エンティティの抽出  
2. エンティティの定義  
3. 正規化  
4. ER図の作成

#### 1. エンティティの抽出 
いきなり横文字で難しそうですがエンティティとは**ある共通項を持ったデータの集合体**のこと言います。
エンティティ　＝　**ある共通項を持ったデータの集合体**  で覚えときましょう。

エンティティ（データ）を抽出してシステムにどのようなデータ（エンティティ）が必要なのかを洗い出します。これがよく聞く**要件定義**にてやつですね。

**例としてはこんな感じです**
-   (物理的なもの) 顧客、社員、店舗、飛行機、など
-   (概念的なもの) 税金、売り上げ、購買履歴、など

### ここで大事なポイントがあります
**洗い出したエンティティ(データ)は開発するシステムの要件を満たせるか**

これを重要視しましょう！！

### 2. エンティティの定義

このステップでは**抽出したエンティティ**がどのようなデータを持っているかを定義します。  
データベースにおいてエンティティは皆さんお馴染みの**テーブル**という単位で表現されます。  

つまり、**エンティティの定義とはテーブルの定義を行うことと同じ意味です。**  

#### ここで大事なポイントがあります

-   キー(**特定のデータを取り出す**ための列の組み合わせのこと)をなににするか  
-   どのような属性(atribute)を持たせるか

これを重要視しましょう！！

### 3. 正規化

**正規化とは簡単に言うとテーブルを分解し、データの冗長性をなくすことです。**分解の粒度によって呼び方が変わり第1正規形から第5正規形まで存在します。
1~5までありますが第３正規形まで正規化すれば十分です。
#### 第1正規形
**ひとつのセルに1つの値が存在しているテーブル**のことをいいます。
#### 第2正規形
**主キーに対して列が従属しているテーブル**のことをいいます。
#### 第3正規形
**主キーに対して全ての属性が従属であり、かつ推移的関数従属(後述)も存在していないテーブル**のことをいいます。


### 4. ER図の作成
ER図は**エンティティ(テーブル)同士の関係を表現する図のことをいいます。**
このER図の作成で上記のステップで作成された**テーブル同士の関係**を見抜き、紐づける作業を行います。 
ER図の作成方法としては、**主キー**に着目してあげます。 他のテーブルの列にそのキーが含まれているかをチェックします。存在している場合、**テーブル間に関係**があるので線で結びます。

#### ここで大事なポイントがあります

 **あるテーブルの主キーが他のテーブルに列として存在**している場合、それらのテーブルは**関連性が線で結ばれているか**。
1:1という関係のテーブルが存在しないか  
多：多という関係のテーブルが存在しないか  
子に対して親が複数存在していないか  

以上が手順になります！　
ざっくりとした流れの説明をしましたがご参考になれば嬉しいです。

参考にさせていただいた記事　
[4ステップで作成する、DB論理設計の手順とチェックポイントまとめ](https://qiita.com/nishina555/items/a79ece1b54faf7240fac)
[DB論理設計のノウハウ](https://qiita.com/kiyodori/items/5083ad8bbfc232d01827)
[基礎から分かるデータベース入門](https://proengineer.internous.co.jp/content/columnfeature/6411)
C# 基礎プログラミング100本ノック～0本目～

#Hello,World
皆様、初めまして！
私はその辺の学校で適当にプログラミング学習をしている引きこもりです。

最近はコロナウイルスと春休みの影響で1分たりともコーディングしていない、家からも出ていない。やってることは暇を持て余して角煮を作り出す状態なので流石にまずいと思い、100本ノックをやりながら全部記事にして書いていく事にしました。

最初は1日5本目標に打っていくのでお付き合いください。

#言語選定

さて、Python、Java、Swift、JS、PHPと基礎文法は抑えてきましたが次何やろう？
という事でC#を始める事にします。
環境はPythonの時にお世話になったVS2019使っていきますね！
あと内定先企業がC#しか使ってないから基礎文法ぐらい覚えないと...

という事で、初めて行きましょう！

[基礎プロI 100本ノック 基礎編](http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)

#0本目！

>実行するとHello World!と表示するプログラムを作成せよ。
では取り敢えず適当にプロジェクト作ってと

```C#:Program.cs
using System;

namespace Hello_C_Sharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

```
あれ？終わってない？
SQL コマンドたち

#本題
SQLで使えるコマンドを打っていきます。


```sql
SELECT カラム名
FROM テーブル名;
```

```sql
SELECT カラム名
FROM テーブル名
WHERE カラム名;
```
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■重複するデータを取り除く場合

```sql
SELECT DISTINCT カラム名
FROM テーブル名;
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■四則演算子（消費税）

```sql
SELECT DISTINCT カラム名1, カラム名2, カラム名2 * 1.08
FROM テーブル名;
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■合計額

```sql
SELECT SUM(カラム名）
FROM テーブル名
WHERE カラム名 = "指定したいデータ";
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■平均

```sql
SELECT AVG(カラム名）
FROM テーブル名
WHERE カラム名 = "指定したいデータ";
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■保存されているデータの数

```sql
SELECT COUNT(*）
FROM テーブル名
WHERE カラム名 = "指定したいデータ";
```
COUNT（*）
↑で全データ取得できる

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■最大値

```sql
SELECT MAX(カラム名）
FROM テーブル名
WHERE カラム名 = "指定したいデータ";
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■最小値

```sql
SELECT MIN(カラム名）
FROM テーブル名
WHERE カラム名 = "指定したいデータ";
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■グループ化　例)日付ごとの金額の合計

```sql
SELECT SUM(金額のカラム名）,日付のカラム名
FROM テーブル名
GROUP BY 日付のカラム名;
```
※GROUPBYを用いる場合、SELECTで使えるのはGROUPBYに指定しているカラム名と集計関数のみ

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■グループ化されたデータの中から検索 例）1000円より高い金額を日付ごとに抽出

```sql
SELECT SUM(金額のカラム名）,日付のカラム名
FROM テーブル名
GROUP BY 日付のカラム名
HAVING SUM(金額のカラム名） > 1000;
```
試験に出るAWS:SAAでしょう 第２夜

AWSの画面を実際そんなに触ってないのに
本だけで勉強していて身につくんでしょうか？
などという疑問もある中ではありますが、進めてきたいと思います。

ちなみにHBCに見学に行ったときに買った
水曜どうでしょう透明シールを浮かれて家のふすまに貼ってしまったのですが
剥がしたら、ふすまの紙ごとやぶけるのでは？ とビクビクしています！

それから語呂合わせは効率悪い勉強法とのことなので前回でやめました！
*考えるのに時間かかるし*

また効率の良い勉強法は細かく思い出すそうなので
ここでは自分用にテスト形式（さしあたって穴埋め）で書いていこうと思います

# 受験生諸君(自分)!!

[これ↓](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X/ref=sr_1_1?adgrpid=54919691884&dchild=1&gclid=EAIaIQobChMIvaDenJqw6AIVhqmWCh3eZA7YEAAYAiAAEgKc0fD_BwE&hvadid=338533795365&hvdev=c&hvlocphy=1009301&hvnetw=g&hvqmt=b&hvrand=758814098125985146&hvtargid=kwd-475022447197&hydadcr=4072_10899412&jp-ad-ap=0&keywords=aws+%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88&qid=1584953072&sr=8-1)をもとに勉強しています
![51DY+M37OIL._SX352_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/e2f66413-a969-0d5c-f127-69d3cdfb9b9c.jpeg)

# 第２夜はこれを覚えよう！

### CloudFrontとは
- 動画などの大きい容量を配信する　　　　　　　のこと
- 村の受付、関所を通った先にある

### CloudFrontのバックエンドとは
- 　　　　　　　　　　が必要
- 　　や　　を利用する
- 村の力持ちたち

### ディストリビューションとは
- データをダウンロードする　　　　と配信をする　　　　の2つがある
- 村で蓄えている女たち、そして狩りに出て獲物を狙う男たち

### キャッシュルールとは
- ファイルそれぞれの更新頻度によって　　　が変えられる
- 村にある風呂とシャワー、長く洗える風呂とすぐ洗ってまた出ていくシャワー

### Route53とは
- 　　管理と　　機能
- 村の地図と村の田んぼに流れる水路

### ドメイン管理とは
- 　　取得、　　の設定のこと、ドメイン年間利用は自動更新してくれるよ
- 村の大家さん、それぞれの集落の名前が書いてある

### 権威DNSとは
- 　　と、　　を変換することができる情報をもっている
- ただの　　　とは違うから保持してないドメインについては知らないよ
- 村の集落の中のそれぞれの大家さん

[ちなみにここがすごくわかりやすくて助かりました！](https://wa3.i-3-i.info/word12272.html)

### トラフィックルーティングとは
- 　　　　情報を登録するとき、　　　の問い合わせに対して　　つのルーティングポリシーがある
- 要件や構成に応じて適切な　　　　　を指定することで可用性の高いシステムにできるよ
- 村に先祖代々伝わる、オレンジ色に輝く玉、玉の中には数の違う星が埋め込まれている

1. 　　　ルルーティングポリシー（標準的で1対1）
2. 　　　バールーティングポリシー（アクティブ/スタンバイ方式）
3. 　　　情報ルーティングポリシー（日本からのアクセスには日本語のコンテンツ用サーバに接続）
4. 　　　性ルーティングポリシー（必要に応じてリソースを別のトラフィックのある場所に移動）
5. 　　　シールーティングポリシー（複数のサーバから遅延が最小のサーバにリクエストをルーティング）
6. 　　　回答ルーティングポリシー（アクセス分散のため複数のIPアドレスの中からランダムに接続する）
7. 　　　ルーティングポリシー（指定した比率でリソースを振り分ける）

[おせわになっております！ルーティングとは](https://wa3.i-3-i.info/word1498.html)

### トラフィックフローとは
-　　　の設定が複雑になることもある 　　　　の組み合わせをビジュアル的にわかりやすくする
-　村の中の集落の地図


### DNSフェイルオーバーとは
- Route 53がもつ　　　　　　のこと
- 　　　　　　　とはシステム異常を最小にしてくれるすぐれもの
- 一時的に接続先を切り替えたいときなどには　　　　　機能が活躍する
- 村の地図と村の田んぼに流れる水路を制御する板


---

村の例えは面白かったので続けてみます
こうなったらAWSの12章あたりでは現代まで発展するかもしれませんし
やめるかもしれません
もはや水曜どうでしょう風味はタイトルくらいであとはなくなりましたね

**第2夜の答えは第3夜で！！**
Firebase Realtime Data Baseの更新【個人メモ】

【コメントで質問OKです】

ポイント
①データベース名指定
②レコードを指定してupdateする

```
    firebase.initializeApp(firebaseConfig);

    const newPostRef = firebase.database();
    roomInfo = newPostRef.ref("room");   //①データベース名指定
    roomInfo.on('value', (snapshot)=> {
        resolve(snapshot.val())
    });


        for(let i in dbData){
            eventInfo = getEventInfo(dbData[i].room_id);
            console.log(eventInfo);
            console.log(roomInfo.child(i))
            if(eventInfo.event == null){
                console.log("イベンとあり")
            }else{
                roomInfo.child(i).update({//②レコードを指定してupdateする
                    event_name:eventInfo.event.event_name,
                    event_image:eventInfo.event.image,
                    event_url:eventInfo.event.event_url,
                    ended_at:eventInfo.event.ended_at,
                    started_at:eventInfo.event.started_at       
                })
            }
        }
```
【Spring Boot】初めてのREST API開発メモ

Spring BootでREST-APIを開発した時に調べた諸々の覚書。

##■REST-APIプロジェクト作成
Eclipseから下記手順で雛形プロジェクト作成

<1> spring スタータープロジェクト選択
<2> プロジェクト名入力と型の選択（Gradle/Maven）
<3> web/Spring web選択
　　※ここまでで、プロジェクトが自動生成される。
<4> コーディング
　　Rest Controllerを作成（Applicationクラスは自動作成される）。
　　設定ファイル作成（application.yaml）を作成（ipAddress、portNo、contextPath等）。
<5> テスト
　　実行/spring boot アプリケーション で起動。
　　ブラウザからリクエスト実施。
　　※（Eclipseの）Serverを作成しなくてもリクエストに応答する。

##■Spring Boot 設定ファイル作成
application.yamlに設定値を定義する。
※主要な設定値はSpring bootで定義済み。
※Spring bootで定義済みの一般設定値（抜粋）
[Application Properties(Common application properties that can be used to configure your application.)]
(https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties)

DataBeanへの設定ファイルからの読み込み方法は２種類。
個別に読み込み　@value
纏めて読み込み　@ConfigurationProperties


##■REST-API + JSONでの実装方法
Request／ResponseともにJson形式で授受するケースについてのメモ。
基本、@Jason Propertyでエンティティと紐づけを行う。
下記のサイトを参考にさせていただきました。

@YutaKase6さん
[Spring BootとJPAでREST APIを実装する(アプリケーション層編)](https://qiita.com/YutaKase6/items/487edfa9f6e39ac2f939)
@opengl-8080さん
[Jackson使い方メモ](https://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c)
pipでインストールしたものをcondaの環境に移す

pythonの環境を構築する時pipでインストールしたりcondaでインストールしたりなんだか訳がわからなくなる時があるのでまとめておきます。

#Anacondaの仮想環境にline-bot-sdkを配置する方法

Anacondaの仮想環境にline-bot-sdkをインストールしたいけどcondaコマンドでは無理な時、pipコマンドでインストールします。

```
$ pip3 install line-bot-sdk
```

ここで下記コマンドで確認してみてもAnacondaの仮想環境上には入っていません。

```
$ conda list
```

僕の場合 'pip3 install line-bot-sdk' の結果

```
$ /Users/ユーザー名/.pyenv/versions/3.6.5/lib/python3.6/site-packages
```
上記のpathにline-bot-sdkがあると分かりました。
これをAnacondaの仮想環境に移さなければなりません。

次に仮想環境のpathを確認します。

```
$ python
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)

['',
 '/Users/ユーザー名/opt/anaconda3/envs/GetUpEarly/lib/python37.zip',
 '/Users/ユーザー名/opt/anaconda3/envs/GetUpEarly/lib/python3.7',
 '/Users/ユーザー名/opt/anaconda3/envs/GetUpEarly/lib/python3.7/lib-dynload',
 '/Users/ユーザー名/opt/anaconda3/envs/GetUpEarly/lib/python3.7/site-packages']
```

僕の場合この5つ？が有効化されたpathでした。なので今回はpython3.7フォルダの直下にline-bot-sdkファイルを置くことにしました。


最後に確認でline-bot-sdkが入っていることを確認しましょう。

```
$ pip freeze 
```

#まとめ

いまいちまだ環境構築についてよくわかってないので手探り状態です。
こういったやり方であっているのか、間違い等あればご指摘お願いいたします。
APG4bをPythonで解きたい（第4章の4.01と4.04だけ） 

# はじめに
AtCoderに存在するAPG問題をPythonで解いてみます。
こちらPython始めたての初心者なので、「もっといい書き方あるよ！」等がありましたら教えていただけると大変助かります。
また、なぜ4.01と4.04のみかというと、Pythonでできる箇所がこの2つだけだと伺ったためです。C++はいろいろできてすごいなぁ…

# [4.01.includeディレクティブ](https://atcoder.jp/contests/apg4b/tasks/APG4b_af)

Pythonでいう「import」のことだ！
C++でいう`#include <(ファイル名)>`がPythonでいう`import (モジュール名)`ということですね。

C++だと、`#include <bits/stdc++.h>`を入れないと出力動作ができないらしい。Pythonではモジュールを入れなくても`print()`できるよ。

あと、C++では自作のソースファイルをincludeして、別のソースコードで使用することができる。
え、Pythonだと別のファイルのソースってどうやって持ってくるんだろう……調べます。

方法いっしょだ…。inportしたいファイルの「~.py（つまり拡張子）」を抜いたファイル名を`import (拡張子を抜いたファイル名)`という形でもってくるだけ。いつもといっしょ。

【参考】includeディレクティブ

```a.py
import b

print(b.f(10)) #100
```

```b.py
def f(x):
    return x*x #xを2乗するだけ
```

b.pyがimportされたa.pyは下のコードとやっていることが同じ。

```Python
def f(x):
    return x*x

print(f(10)) #100
```

モジュールをimportするときも、「モジュール名.py」っていう色々な関数が書かれているソースファイルから関数を持ってきてるイメージなのか……あまり意識したことがなかった。良い勉強。


# [4.04.イテレータ](https://atcoder.jp/contests/apg4b/tasks/APG4b_ai)

イテレータってなんだ……？
全くわからない。なんかlistみたいなものっぽいけどなんだろうこれ。
`sort()`をするときに使う……？なんで……？元の配列はどうなってるんだ……？

わかった！！！！！！`sort()`って元の配列がソートされるわけじゃなくて、イテレータっていう元の配列のコピーをソートしてますよってことなのでは……？
`sort()`しても元の配列がsortされるわけじゃないもんね。
え、けどイテレータと配列って何が違うんだ？

【**イテレータのいいところ**】

- 配列以外のデータ構造でも同じように扱える・整理できる

なるほど、つまり配列でも辞書型でもイテレータにしてしまえば同じ操作で位置の操作等ができるってことですか……？ちょっと難しいですね……イメージが難しい……

listとdictでイテレータを作ってやってみます…

```Python
#listで作成
list = [1,2,3,4,5,]
iter_list = iter(list)

#dictで作成
dict = {"first":1,"second":2,"third":3,"fourth":4,"fifth":5}
iter_dict = iter(dict)

for i in iter_list:
    print(i) # 1 2 3 4 5

for i in iter_dict:
    print(i) # first second third fourth fifth
```
あれ、dictのほうだとkeyが出力されちゃう。何か間違えたか。あれ。


一旦泥沼にはまりそうなので、とりあえず

- イテレータはlistやdictとかのコンテナ要素をコピーして、同じような扱いにすることができる（要検証）（イテレータをまだよくわかっていない）
- sort()のときとかに使われてるよ。

ちょっと日を改めて読み返します……
Rubyでmysqlの操作

rubyでmysqlの接続、操作をする方法を記載します。
mysqlとgem "mysql2"はすでにインストール済みとして進めていきます。
データベースやテーブルの操作に関してはこちらも参考にしてみてください。
こちらも自分が書きました。
[基本的なmysqlの操作](https://qiita.com/hukuro310/items/49f22632ab36dc80fee4)

## 動作環境
- Windows10(ローカルOS)
- CentOS7(リモートOS)
- Oracle VM VirtualBox 6.1(仮想マシン)
- Ruby 2.7.1p83
- mysql

## データベースの作成
```
CREATE DATABASE データベース名;
```
ここでは`CREATE DATABASE training; `とします。

## テーブルの操作
### テーブルの作成
```
CREATE TABLE テーブル名 (
カラム名1 データ型 オプション,
カラム名2 データ型 オプション,
カラム名3 データ型 オプション,
);
```
今回は

```
CREATE TABLE training.prefectures (
id int,
name varchar(32)
);
```
としてみます。
`training.prefectures`は`データベース名.テーブル名`という意味で、わざわざ`use`でデータベースを選択する必要がありません。

### レコードの挿入
試しに一気に3件挿入します。

```
INSERT INTO training.prefectures VALUES
(1, "tokyo"),
(2, "osaka"),
(3, "kyoto");
```

## Rubyでmysqlの操作
操作するためのrubyファイルを作成。

```
touch ms2_test.rb
```

### データを参照
```ms2_test.rb
require 'mysql2'

client = Mysql2::Client.new(host: "localhost", username: "root", password: "mysqlのパスワード")

query = %q{select * from test.languages}
results = client.query(query)
results.each do |row|
  row.each do |key, value|
    puts "#{key} => #{value}"
  end
　puts "\n"
end
```
**それぞれの説明**

- `client = Mysql2::Client.new(host: "localhost", username: "root", password: "mysqlのパスワード")`
 - これでmysqlに接続できます。
 - `password: "mysqlのパスワード" `は、mysqlに接続するときにパスワードを設定している場合は、そちらを入力してください。
- `query = %q{select * from test.languages}`
 - mysqlに投げるクエリ文です。
 - 難しく考える必要はなくて、mysqlでテーブルの操作をするときのコードをここに書き込めばいいだけです。
- `results = client.query(query)`
 - データベース(client)にクエリ文(query)を投げた結果です。

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/22cf07de-369d-51cb-456f-d8e63ef4e779.png)

### あとは
やりたい操作に応じてクエリ文を変えれば大丈夫です。



## その他参考
[mysql2(github)](https://github.com/brianmario/mysql2)
Rのaggregate関数を使った集約・集計

##aggregate関数による集約やグルーピング

データを集計する際に合計を求めたり、平均値などの基礎統計量を算出することはよくやる作業です。
Rを使用したクラシックなやり方として、aggregate関数を示します。

なお、aggregateは作業時間が比較的かかるため、dplyrなどが推奨されています。


##まずはデータ読み込み

ggplot2ライブラリ内になるdiamondsデータを使用します。

```R:R
library(ggplot2)
data(diamonds)
diamonds

#列名調べる
colnames(diamonds)
 [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"   "x"       "y"       "z"  
```

##早速、集計作業

"cut"の種類別に(group_byのようなもの）価格の平均値を平均・合計を算出します。
~（チルダ記号)を使って、算出の対象と層別の定義をします）

```R:R
#データは第2引数で指定し、第3引数で関数を指定
aggregate(price ~  cut , diamonds, mean)
        cut    price
1      Fair 4358.758
2      Good 3928.864
3 Very Good 3981.760
4   Premium 4584.258
5     Ideal 3457.542

aggregate(price ~  cut , diamonds, sum)
        cut    price
1      Fair  7017600
2      Good 19275009
3 Very Good 48107623
4   Premium 63221498
5     Ideal 74513487

#summaryでざくっと集計
aggregate(price ~  cut , diamonds, summary)

        cut price.Min. price.1st Qu. price.Median price.Mean price.3rd Qu. price.Max.
1      Fair    337.000      2050.250     3282.000   4358.758      5205.500  18574.000
2      Good    327.000      1145.000     3050.500   3928.864      5028.000  18788.000
3 Very Good    336.000       912.000     2648.000   3981.760      5372.750  18818.000
4   Premium    326.000      1046.000     3185.000   4584.258      6296.000  18823.000
5     Ideal    326.000       878.000     1810.000   3457.542      4678.500  18806.000

```

##集計軸の追加

集計軸の追加（グルーピング変数追加）をしてグルーピングする場合は、+記号で変数名を指定

```R:R
aggregate(price ~  cut + color, diamonds, summary)
         cut color price.Min. price.1st Qu. price.Median price.Mean price.3rd Qu. price.Max.
1       Fair     D    536.000      2204.500     3730.000   4291.061      4797.000  16386.000
2       Good     D    361.000       957.250     2728.500   3405.382      4581.000  18468.000
3  Very Good     D    357.000       850.000     2310.000   3470.467      4633.000  18542.000
4    Premium     D    367.000       958.000     2009.000   3631.293      4915.000  18575.000
5      Ideal     D    367.000       854.250     1576.000   2629.095      3102.000  18693.000
6       Fair     E    337.000      1589.500     2956.000   3682.312      4518.250  15584.000
7       Good     E    327.000       969.000     2420.000   3423.644      4535.000  18236.000
8  Very Good     E    352.000       755.000     1989.500   3214.652      4355.000  18731.000
9    Premium     E    326.000       964.000     1928.000   3538.914      4628.000  18477.000
10     Ideal     E    326.000       872.000     1437.000   2597.550      3013.500  18729.000

```R:R

aggregate(price ~  cut + color + depth, diamonds, mean)
          cut color depth     price
1        Fair     G  43.0  3634.000
2       Ideal     J  43.0  4778.000
3        Fair     G  44.0  4032.000
4        Fair     I  50.8  6727.000
5        Fair     E  51.0   945.000

```

##２つの変数を集約する場合は、cbind()などで結合する
```R:R
 aggregate( cbind(price,carat) ~ cut, diamonds, mean)
        cut    price     carat
1      Fair 4358.758 1.0461366
2      Good 3928.864 0.8491847
3 Very Good 3981.760 0.8063814
4   Premium 4584.258 0.8919549
5     Ideal 3457.542 0.7028370
```
CSS レイアウト

# %（パーセント）
親要素のサイズが100%としたとき子要素のサイズを親要素に対して何%で設定するか？を決められる指定方法。
※注意点
%（パーセント）のサイズ指定は親要素に依存する。
親要素であるbody要素はブロックレベル要素のため、高さを厳密に指定していないとボックスとして形を保つことができない。
そのため、height 100%と指定した場合、ブロックが消えてしまう。
対策として%指定が適応されるように、親要素を追加して高さを指定する。

# vh（viewport height）
vh（viewport height）は、viewportの高さ（height）に対する割合のことを指す。
1vhと指定した場合は、ブラウザで表示されているの高さの1%。

# vw（viewport width）
vw（viewport width）は、viewportの幅（width）に対する割合のことを指す。
1vwと指定した場合は、ブラウザで表示されているの幅の1%。

# %とViewportの違い
・%（パーセント）は、親要素に依存する
・viewport（ビューポート）は、ブラウザの表示されている領域に依存する

# %とViewportの使い分け
・要素をページの高さいっぱいに配置する場合は、100vhを使う
・要素のページの横幅いっぱいに配置する場合は、100%を使う

# calc関数
CSSで四則演算（+,-,*,/）を行うことができる。
calc()の括弧内に値を渡すことで計算結果を返してくれる。
例）全体の高さから300px分を引いたサイズを指定

```
.hoge {
    width: calc(100vh - 300px); 
    => 全体の高さが、1000pxだった場合hogeのwidthは700pxになる
}
```
Anacondaで仮想環境を作る流れ

誤りがあればご指摘お願いいたします。


#Anacondaで仮想環境を作る流れ

pythonenvという仮想環境を作成（任意の名前）
versionも任意で指定できます。

```
$ conda create -n pythonenv python=3.8
```

仮想環境の一覧を表示

```
$ conda env list	
```

仮想環境をpythonenvに有効化する

```
$ conda activate pythonenv
```

↑ができない時はこちらを試してみてください。

```
$ source activate pythonenv
```

フレームワーク（flask）をインストール

```
$ conda install flask
```

インストールされているフレームワーク一覧を表示

```
$ conda list
```

現在使用している仮想環境から抜ける

```
$ conda deactivate
```

仮想環境（pythonenv）を消去

```
$ conda remove -n pythonenv --all
```
GithubのコードをGoogle colabで実行する

#何の記事？
GithubのコードをGoogle colabで実行する方法についてのメモです。:raised_hand:
見つけたコードをちょっと試してみたいときに便利です。

#手順
流れとしては、<b>!git clone → 作業フォルダを移動 → ファイルを実行</b>です。
GPUを使いたい場合には上のタブで、「ランタイム」→「ランタイムのタイプを変更」→「GPU」を選択します。

#1.Clone
!git cloneで、リポジトリをクローンします。Google Colab上でLinuxのコマンドを使用するときに、最初に!をつけます。
クローンされたリポジトリは、"/content"フォルダに格納されます。

```
!git clone https://github.com/pytorch/examples.git
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/cd2a1c01-ee8a-7885-fd19-3bbb97b44104.png)


#2.作業ディレクトリの移動
次に、Linuxのコマンドを用いて実行したいファイルがあるところまで作業ディレクトリを移動します。

```
import os
path = '/content/examples/mnist'

#作業ディレクトリをpathに移動する
os.chdir(path)

#作業ディレクトリ直下のファイルを確認
!ls
```

作業ディレクトリ内には、下の3ファイルがあることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/935d98ca-691d-01a7-cf85-f85da715098d.png)

#3.ファイルの実行
作業ファイル内のファイルを実行します。Pythonファイルの場合は、以下のようにして実行します。

```
!python3 main.py
```

#4.Sample code
以上のコードは、以下より試すことができます。:relaxed:
https://github.com/ykitaguchi77/Colab_Scripts/blob/master/Running_Github_codes_in_Colab.ipynb

以上です。
【Rails】partialでeachしたいな

## 初めてのQiita投稿
です。
プログラミング言語はもとより、日本語すら怪しい。
（にほんうまれ、にほんそだち）

だから、なるべく簡単にかいてみるよ。
難しいことはわからないよ。

誠に遺憾なレベルのひとだから、ご指摘など大変喜ぶよ。


## やりたいな
eachで回すのをベタ書きするとすごいごちゃっとするな。
partialで切り取ってスッキリさせたいな。


## どう書くのかな

### partialでスッキリさせたい部分はこう！

```erb:Tops/index.html.erb
<%= render partial: "blog_card", collection: @blogs %>
```
<br/>
#### `partial: "blog_card"`ってなに？

- 雑に翻訳するとこういうことみたいだよ

```
partialだよ：同じディレクトリにある_blog_card.html.erbが対象のpartialだよ
```

<br/>

- 同じディレクトリじゃなくて別のディレクトリ…例えば`app/views/layouts`に`_blog_card.html.erb`を入れてた場合は

```erb:Tops/index.html.erb
<%= render partial: "layouts/blog_card", collection: @blogs %>
```

…って書くと`app/views/layouts/_blog_card.html.erb`をみに行ってくれるよ。

<br/>
#### `collection: @blogs` ってなに？

- 雑に翻訳するとこういうことみたいだよ。

```
eachで回したいコレクションがあるよ：Tops_controller.rbの@blogsが対象のコレクションだよ
```

```ruby:Tops_controller.rb
def index
  @blogs = Blog.all  #ココ
end
```

- 超蛇足だけれど、partialの中にコントローラやアクションの指定がないのに、`collection: @blogs`と書くだけで`Tops_controller.rb`の`indexアクション`の`@blogs`をみてくれるのは、`Tops/index.html.erb`でpartialを書いているからだね。


### partialはこう！

```erb:_blog_card.html.erb
<h5><%= blog_card.title %></h5>
<p><%= blog_card.body %></p>
<%= link_to "もっとみる", "/blog/#{blog_card.id}" %>
```
<br/>
#### `@blogs.each do |blog|`はないの？

- いつもなら↓のように書く。

```erb
<% @blogs.each do |blog| %>
  <h5><%= blog.title %></h5>
  <p><%= blog.body %></p>
  <%= link_to "もっとみる", "/blog/#{blog.id}" %>
<% end %>
```

- だけど、`Tops/index.html.erb`の`render`で、`collection: @blogs`を書いたから、<br/><b>partialの中でeachしなくても、コレクション(`collection:`)の`@blogs`を勝手に１個ずつ取り出して処理してくれる</b>んだって。<br/>Railsってすごいね。

- こんな理由もあるんだって

    - [partialではインスタンス変数を参照しない方がいい](https://qiita.com/mom0tomo/items/e1e3fd29729b2d112a48) 
    - [【パーシャル】インスタンス変数の直接参照ではなく、localsで値を渡す](https://forest-valley17.hatenablog.com/entry/2018/10/15/104936)

<br/>
#### `<%= blog_card.title%>`の`blog_card`ってどこからきた？

- `index.html.erb`の`render`で、`collection: @blogs`を書いたから、<br/>それだけで<b>partialのファイル名が変数名</b>になるんだって。


- 後に続く`<%= blog_card.body %>`も`<%= link_to "もっとみる", "/blog/#{blog_card.id}" %>`もおんなじ。
<br/>
#### ちなみに
- 実際はこれ。もしここにeachを書いたらあと２行ほど増えるから、partialにしちゃってよかったのかも。

```erb:_blog_card.html.erb
<div class="col-12 col-md-6">
  <div class="card mb-4">
    <h5 class="card-header"><%= blog_card.title%></h5>
    <div class="card-body">
      <p class="card-text"><%= blog_card.body %></p>
      <button type="button" class="btn btn-info">
        <%= link_to "/blog/#{blog_card.id}" do %>
          <div class="text-white btm-sm">もっとみる</div>
        <% end %>
      </button>
    </div>
  </div>      
</div>
```

## さいごに
Railsってすごい。もっといろんなことができるようになりたいな。
Ruby on Rails チュートリアル 4日目

##4日目
今日は、2章の途中まで終わりました。しかし、[2.3.3](https://railstutorial.jp/chapters/toy_app?version=5.1#sec-demo_user_has_many_microposts)のリスト2.17にて、チュートリアルの通りに、

```
class User < ApplicationRecord
  has_many :microposts
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
end
```
と書いたら、
![スクリーンショット 2020-04-16 16.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/360239c5-e4b8-052e-b299-ae68fb27ca6d.png)

と出てしまい、どうすればいいかわからなくなってしまいました。
誰かどこをどうすればいいのかを、教えてください


##追記
普通に、FULL_INの所に:nameと、:emailに書き換えればよかっただけでした
これでやっと2章が終わりました。
PocketMine-MPをソースコードから起動～ビルドまで

##環境を整える
- [Git](https://git-scm.com/downloads)
- [Composer](https://getcomposer.org/download/)
- [PHP](https://php.net/) もしくは いわゆるPMMPの[bin](https://github.com/pmmp/php-build-scripts)
- [PocketMine DevTools](https://github.com/pmmp/DevTools/)

各種Pathが通っていることを前提に説明しています
コマンドは環境に応じて置き換えてください。(例えば: composerのManual Download(composer.phar)を使用する場合や使用OSによって)

###使用した環境
Windows10
他のOSであっても、環境が整っていれば問題ないはずです。

##好きなディレクトリを作成して移動
```bat
cd PMMP
cd ./PMMP
```

#ソースコードから起動

##PocketMine-MPのリポジトリからcloneする
```bat
git clone https://github.com/pmmp/PocketMine-MP.git . -b x.y.z --recursive
```
`-b`オプション: ブランチ名もしくはタグ名を指定する。指定が無い場合、デフォルトのブランチから取得されます。(例えば: 3.11.7)
`./`オプション: 現在いる(指定した)ディレクトリにcloneする。
`--recursive`オプション: サブモジュールも再帰的にcloneする。
ちなみに、手動でサブモジュールを入れるのは完全に上級者向けの方法です。
普通にタイトルのようなことをしたいだけであれば、再帰的にcloneするのが得策です。

##composerで依存関係をインストールする
```bat
composer install --no-dev
```
もしくは

```bat
.\bin\php\php .\composer.phar install --no-dev
```
など
`--no-dev`オプション: 開発用のモジュールをインストールしない。

##とりあえずPocketMine-MPを起動してみる
```bat
.\bin\php\php .\src\pocketmine\PocketMine.php --no-wizard
```
`--no-wizard`オプション: インストール時のウィザードを使用しない。
※確認したらもちろん`stop`で閉じる。

#ビルド

###DevToolsのダウンロード
[Jenkins](https://jenkins.pmmp.io/job/PocketMine-MP/)などからビルド済みDevTools.pharがダウンロードできます。

##サーバーをビルドする(DevTools.pharを使用する)
```bat
.\bin\php\php -dphar.readonly=0 .\DevTools.phar --make .\src,.\vendor --relative . --entry .\src\pocketmine\PocketMine.php --out .\PocketMine-MP.phar
```
※長くなるため、オプションの説明は省略します。[README](https://github.com/pmmp/DevTools/blob/master/README.md)を参照してください。

```
Adding files...
Added 1234 files
Done in 12.345s
```
※表示例
通常、`.\PocketMine-MP.phar`にビルドされたPocketMine-MP.pharが出力されます。(`--out`オプションによって指定されたパス)

##~~サーバーをビルドする(DevToolsプラグインを使用する)~~
この機能は、DevTools 1.14で削除されました。[当該コミット](https://github.com/pmmp/DevTools/commit/c819deb237bcf8820c3367c0cf8101a4a9ee2c6a)

```bat
/makeserver
```
サーバーを起動してコマンドを実行する

```
PocketMine-MP x.y.z Phar file has been created on path/to/phar
```
※表示例
通常、`/plugin_data/DevTools/*.phar`にビルドされたPocketMine-MP.pharが出力されます。(詳細はログを参照)

以上
もし間違っている所やこうした方がいいよーなどあれば気軽にコメントなどよろしくお願いします。
Flutter 開発で手を止めないために Placeholder のすすめ

## みなさんはこんな経験ありますか？

アプリ開発をはじめたものの、

- **機能がうまく動かない**
- **UI がイメージ通りにならない**
- **ウィジェットの種類が多すぎてどれ使ったらいいかわかんねぇー**

となってしまい、嫌になってコーディングから遠ざかってしまう……。

<br>

**あると思います！！**

<br>

チームでおこなう開発ならフォローしてもらいつつ進められるかもしれませんが、個人開発ではそうは行きません。
アプリ開発中についつい手が止まってしまう場合に、 `Placeholder` というウィジェットを使って開発のモチベーションを維持できるかもしれないと思ったので紹介させていただきます。



## 対象読者とお断り

基本的には、これから Flutter にふれる開発者や、始めたばかりの方の手助けになるように書いています。
（熟練の Flutter 使いには不要な情報かもしれませんが、ご了承くださいませ）

また、僕自身が学習中の身ですので内容がイマイチな場合もありますが、そこは優しくマサカリしてください！（コメントお待ちしています！）
また、「こんなケースではこういう解決法もあるよー」みたいな意見もいただけると嬉しいです！（コメントお待ちしています！）



## 手が止まってしまうシーン

### 📌 UI はぼんやり決まったけど、どこから手を付けていいか分からない

#### 🌄 どんなシーン？

例えば次のような画面を作るとしましょう。
![placeholder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135956/956d8e84-4257-da03-50bd-fbbfa8d3cdb2.png)


画面内には、

- AppBar
- FloatingActionButton
- 画像（なにやらグラデーションでフィルターがかかっている）
- スライダー

があるのがわかります。

これだけはっきりと UI が決まっていればよいですが、実際はぼんやりと頭にある UI からコーディングしていくわけで、 **闇雲に突き進むと予想以上に時間がかかってしまったり、場合によってはひとつの難しい機能につまずいてアプリ開発そのものが嫌になってしまう** なんてこともあるかもしれません。



#### 🎠 解決案

UI がぼんやりとしているうちは、コーディングもぼんやりでよいと思います。
詳細の機能は後回しにして、とりあえずぼんやりとした UI を実装してみましょう。

具体的には次のような感じです。
![placeholder2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135956/dd5113e9-63fa-df44-d3d9-cab1d24b38db.png)
どうでしょう？

「 **どこに何があるのか、わかりやすい** 」と感じる方が多いと思います。

Flutter には [Placeholder](https://api.flutter.dev/flutter/widgets/Placeholder-class.html) というウィジェットが用意されており、 **「詳細はまだだけど、ここに、このくらいのサイズのウィジェットを配置したいんだよなぁ」という気持ちを叶えてくれる痒いところに手の届くウィジェット** となっています。

`Placeholder` の使い方は、

```dart
@override
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // 省略
      ),
      body: Center(
        child: Wrap(
          direction: Axis.horizontal,
          spacing: 8,
          runSpacing: 4,
          children: <Widget>[
            Center(
              child: Container(
                width: 300,

                // 画像用の Placeholder
                child: const Placeholder(),
              ),
            ),

            // スライダー用の Placeholder
            const Placeholder(
              fallbackHeight: 50,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        // 省略
      ),
    );
}
```

のように普通のウィジットと同じように扱います。

この例だと、『画像』と『スライダー』という 2 つのウィジェットを扱いますので、まずは `Wrap` ウィジェットを定義して、その子ウィジェットに 2 つの `Placeholder` を設定しています。

少し不便なのは `Placeholder` 自身が高さ（ `height` ）や幅（ `width` ）を持たないため、任意に設定したい場合は `Container` でラップしないといけないところですかね :sweat_smile:



#### 👏 なにがよいのか？

「べつに `Placeholder` 使っても変わらなくない？」と思う人もいるかもしれません。
でもそれは頭の中で UI をしっかりと思い描くことができる（そういう能力を持った）人だからだと思います。

それができない人や、そもそもプログラミングに不慣れな人にとっては「どのようにレイアウトできるか？」すらイメージが沸かない可能性もあるので、 **`Placeholder` による視覚化** は大いに役に立つと考えています。

また、 **視覚化されたウィジェットがあることで、機能を実装する際もウィジェット単位で取り組みやすくなります** 。



## まとめ

**慣れないうちのアプリ開発は、試してはググり、ググっては試しの繰り返し** でなかなかうまく行きません。
「何時間も調べてコーディングしたのにうまくいかない」つまり「コミットできない状況」を続けていると、開発することが億劫になってしまいますよね。

ひとつの機能につまづき手を止めるよりは、 **プロトタイプでもいいからとりあえずコミットするという行動を取るほうが精神衛生上よい** と僕は考えています。

`Placeholder` はその手助けをするひとつの手段として最適だと思いますので、「今まで知らなかった」「良さそうだな」と思ってくれた方はぜひ使ってみてください！
Python tesseract ラッパーライブラリについての備忘録

# 概要

単なる備忘録です。

# pyocr

ライセンスはGPL v3+です。pillow依存なので、opencv使用しているといちいち変換が面倒くさい。関数群がそこそこ使い勝手が良い。

- [https://gitlab.gnome.org/World/OpenPaperwork/pyocr](https://gitlab.gnome.org/World/OpenPaperwork/pyocr)

# pytesseract

ライセンスはApache License Version 2.0です。こちらはnumpy配列も使用できるので、opencvとの相性が良い。使い味は悪くないけど、バウンディングボックスについてはpyocrの方が使いやすいです。関数群は必要最低限のみですが、単純に文字認識したい程度であれば機能として必要十分を満たしていると思います。

[https://github.com/madmaze/pytesseract](https://github.com/madmaze/pytesseract)

# tesserocr

ライセンス表記なしです。こちらは一度も使ってないので、特に記述できないです。

[https://github.com/sirfz/tesserocr](https://github.com/sirfz/tesserocr)
herokuで、「! [remote rejected] master -> master (preerror: failed to push some refs to 'https:ts concurrent builds～(以下省略)」というエラーの解決

##起こったこと
 herokuのデプロイ中に中断して、再度プッシュしたら、

```
! [remote rejected] master -> master (preerror: failed to push some refs to 'https:ts concurrent builds～
```
って出てプッシュできなくなった。

ウーン...ウーン...ファ！？ウーン...

##解決方法
●herokuのサイトにいて、ログインして自分のアプリを選択
●「Deploy」タブを選択
●下のほうに、「Deploy Branch」をクリック
●デプロイされると、アプリが初期状態になる
●最初にやろうとしていたプッシュをすると成功して、アプリが戻る

##感想
herokuのデプロイ方法をメモっていたおかげで解決方法が浮かんだ。
今回みたいな、明らかに自分がイレギュラーなことしたことによるエラーだとストレスが少ないので草生える余裕があった
Webサイトを簡単に定期チェックしたいときのワンライナー

# はじめに

Webサイトを10秒ごとにチェックしたいみたいなことがたまにあるのですが、毎回似たようなスクリプトを作っているのでこちらにメモします。コピペで実行できるのがよいところです。

# スクリプト
```
SITE_URL=https://www.yahoo.co.jp/
while :; do DATE=`date '+%Y/%m/%d %T'`; RET=`curl -vs "$SITE_URL" 2>&1 | grep -E 'HTTP/' | grep -E '[0-9]{3}'`; echo $DATE $RET ; sleep 10; done
```

SITE_URLのURLを変えれば他のサイトでも使えます。HTTP 1.1 2対応です

# 実行例
```
$ SITE_URL=https://www.yahoo.co.jp/
$ while :; do DATE=`date '+%Y/%m/%d %T'`; RET=`curl -vs "$SITE_URL" 2>&1 | grep -E 'HTTP' | grep -E '[0-9]{3}'`; echo $DATE $RET ; sleep 10; done
2020/04/16 16:28:34 < HTTP/2 200
2020/04/16 16:28:44 < HTTP/2 200
2020/04/16 16:28:54 < HTTP/2 200
2020/04/16 16:29:04 < HTTP/2 200
```

# メモ

- 集計しやすいように1行にしているが、<とか消す努力はしていない 
- ちゃんとHTTP/1.1とHTTP/2に対応するように1文でgrepはかけるはず

もっと良い方法が絶対あるはずなのですが、これで用が済みましたので完了とします。
Apache+CGIで全てのHTTPリクエストヘッダを出力する

# 1. やりたいこと

Webサーバーが受け取るHTTPリクエストヘッダを確認したいため、全てのHTTPリクエストヘッダを出力するページを作ります。OSはCentOS7、CGIはpythonを使っています。

```
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
```

# 2. Apacheの導入

```
# yum install httpd
# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
```

# 3. /etc/httpd/conf/httpd.confの編集


```shell:Apacheの設定ファイル（/etc/httpd/conf/httpd.conf)の編集

# SriptAliasの確認の確認
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

# /var/www/cgi-bin配下でCGIの実行を許可するように指定
# また、pyを拡張子に持つすべてのファイルを CGI プログラムとしてみなす
<Directory "/var/www/cgi-bin">
     AllowOverride None
     Options +ExecCGI
     Require all granted
     AddHandler cgi-script .py 
</Directory>
```

# 4. CGIスクリプトの配置

- CGIスクリプトは[これ](https://www.tutorialspoint.com/How-to-read-all-HTTP-headers-in-Python-CGI-script)を参考にした。出力が闇雲に並んでいてもわかりにくいので、名前をSortするように微修正している。
- OriginサーバーはCentOS7なのでPython2.7ベースで記述。
- Apacheのmod_cgiはHTTPリクエストヘッダを、環境変数に設定する際に以下の操作を行なっている。そのため、`HTTP_`というprefixを持つものだけを出力している。
    - HTTPヘッダー名を大文字変換する。
    - 「-」を「_」に変換する。
    - 「HTTP_」という接頭辞を付ける。

```perl:/var/www/cgi-bin/test.py
#!/usr/bin/env python

import os
print "Content-Type: text/html"
print "Cache-Control: no-cache"
print

print "<html><body>"
for headername, headervalue in sorted(os.environ.iteritems()):
    if headername.startswith("HTTP_"):
        print "{0} = {1}<br>".format(headername, headervalue)

print "</body></html>"
```

```shell-session:権限変更とApacheの再起動
# chmod 755 /var/www/cgi-bin/test.py
# systemctl restart httpd
```

# 5. 検証

```shell-session:curlでのテスト
# curl http://localhost/cgi-bin/test.py
<html><body>
HTTP_ACCEPT = */*<br>
HTTP_HOST = localhost<br>
HTTP_USER_AGENT = curl/7.29.0<br>
</body></html>
```

ブラウザでのテスト
<img width="906" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4eb264ba-c51c-87a1-fdb6-a63e64d8af69.png">




# 2021/06/25補足
単にHTTPヘッダを出力したいアプリを作りたいだけなら、これで良かったかも。。。

```
# yum install -y httpd
# yum install -y php
# echo "<?php phpinfo(); ?>" > /var/www/html/test.php
# systemctl start httpd
```
Ruby on Rails 突然「http://localhost:3000に接続できなくなった場合の対処法

ある日、いつも通りにサーバーを立ち上げ、(http://localhost:3000)
に接続しようとした際に、突然接続できなくなりました。
その際にコンソール上に出たエラー文はこちら。

```console
PG::ConnectionBad - could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
私はあらゆるサイトを読み漁り、色々と試しました。
1.postgresのアップロード
2.linkファイルの再構築
3.servicesのインストール・起動
いずれを実行するも接続できませんでした。
しかし、とあるサイトで見つけた、

```console
rm /usr/local/var/postgres/postmaster.pid
```
をターミナル上にて、実行してみたところ、見事解決しました！これはどうやら、前回正常にpostgresを終了させなかったことが原因で、本来残るはずがないファイルが残ってしまっていたようでした💧
競プロでprint関数で動作を確認していたらTLEになった

#競プロでprint関数で動作を確認していたらTLEになった

##例題
実際にこのことに気がついたのはAtCoderの以下の問題です。
https://atcoder.jp/contests/abc162/tasks/abc162_c
200*200*200のfor文を回していました。

##問題点
動作確認のため`print関数`で出力をしていたこと。

##問題のコード
時間計測のため、`time`モジュールを使っています。

```python
import time
import math
k=int(input())
stat = time.time()
k+=1
ans=0
for i in range(1,k):
    for j in range(1,k):
        for z in range(1,k):
            print(i,j,k)
            print(math.gcd(math.gcd(i,j),z))
            ans+=math.gcd(math.gcd(i,j),z)
end = time.time()
print(ans)
print(end-stat) 
##k=10  =>  0.0718231201171875(s)
##k=100 => 20.816463232040405(s)
```
##print関数なしのコード

```python
import math
import time
k=int(input())
start = time.time()
k+=1
ans=0
for i in range(1,k):
    for j in range(1,k):
        for z in range(1,k):
            ans+=math.gcd(math.gcd(i,j),z)
end = time.time()
print(ans)
print(end-start)
#k=10  => 0.0009169578552246094(s)
#k=100 => 0.4900369644165039(s)
```

##結論
`print`も重なるととても時間がかかるようです。
最初に少しで`print`しながら試しておいて（今回だとk=10）
時間がかかるオーダーの計算をするときにはコメントアウトしなければいけません。
ajax通信のreturnについて【個人メモ】

【コメントで質問OKです】
.done,.failの外でreturnすること


```js
var getEventInfo = function(roomID){
    console.log(TGVC.sru + "/api/room/event_and_support?room_id=" + roomID)
    $.ajax({type: 'GET',url: TGVC.sru + "/api/room/event_and_support?room_id=" + roomID, async: false})
    .done(function(re) {
        console.log(re);
        eventInfo = re;
    })
    .fail(function() {
        // room_info = null;
    });
    return eventInfo;    //.done,.failの外で実行
}
```
Rでの欠損値処理

##欠損値

RにはNAとNULLの2種類が存在するが、この2種類は異なる挙動を示します。
データで「-」「99」などによって空白が表現される。

#NA

NA( not available )の略で、計測値不明を意味する。 
NAはvectorの要素として使われる。
is.naでvectorの各要素が欠損しているかを確認できる。

```R:R
z<-c(1,2,NA,8,3,NA,3)
z
[1]  1  2 NA  8  3 NA  3

is.na(z)
[1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
 
#欠損(NA)を除く
z1<-na.omit(z)
z1
[1] 1 2 8 3 3
attr(,"na.action")
[1] 3 6
attr(,"class")
[1] "omit"
 
#zの平均値は計算できない
Error: unexpected input in "z\"

mean(z)
[1] NA
 
#na.rmがTRUEの場合、meanは欠落しているデータを削除してから、平均を計算する
mean(z, na.rm=TRUE)
[1] 3.4
 
#sum,min,max,var,sdでも同様
 
sum(z, na.rm=TRUE)
[1] 17
 
var(z, na.rm=TRUE)
[1] 7.3
 
sd(z, na.rm=TRUE)
[1] 2.701851
 
sd(z, na.rm=TRUE)**2
[1] 7.3
```
ちなみに、NAの平均値を計算できないのは、NAは計測値が不明であることを意味しているので、
-∞から∞の値をとる可能性があるので、

1 + NA　→　1　とするのは妥当でないことがわかります。

欠損値をどうするかは統計分析的には非常に重要なテーマで、よく使われるのは多重代入法である
Rでは、mi,mice,Ameliaパッケージで実装されている


##NULL
NULLとは何もないことを意味します。（ドイツ語のNullが語源？）
欠損とは厳密に異なり、何もない、空白であることをあらわします。

NAとNULLの重要な違いは、NULLはvectorの中に存在できません。
もしNULLをvectorに使用しても、消えてしまう。

```R:R 
z<-c(1,NULL,3)
z
[1] 1 3
 
d<- NULL
is.null(d)
[1] TRUE

is.null(7)
[1] FALSE
```

空白となった場合の、取り扱いは調査中です。。。
【備忘録】text_field と text_area 違い

###結論


【text_field】 は入力できる内容が１行のみになります。

【text_area】 は複数行の内容でも入力が可能です。


##あとがき

サイト作成の際に、【text_field】のサイズを変更しようとしたのですが
１行しか入力できないことを知らず、必死にcssを当てたりbootstrapのドキュメントを読んだりして、時間を使ってしまいました。
初学者の方の参考になれば幸いです。
Lightning Web Components で郵便番号から住所を自動入力する

郵便番号から住所を自動入力するフォームの作り方を紹介します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/5168101b-1f29-0c7b-f6f1-d97eefc4fd70.gif" width="450" />

:::note warn
標準の住所項目と同じレイアウトで十分な場合は `<lightning-input-address>` が使用できます。詳しくは[こちらの記事](https://qiita.com/tatsuro-suzuki/items/31792a712634533e80e9)を参照してください。
:::

ノンコーディングが好みの方は、Lightning フローで利用できるようにコンポーネントをパッケージ化しましたので、こちらをお試しください。( [Developer Edition にインストール](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tf4000004ToI6AAK) | [Sandbox にインストール](https://test.salesforce.com/packaging/installPackage.apexp?p0=04tf4000004ToI6AAK) )
<img width="600" alt="flow component" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/a7cf0530-79ed-8857-b874-cbca5d6c09da.png">

## ソースコード
https://github.com/shunkosa/lwc-jp-postcode-address-autocomplete

## 方針
ポピュラーなライブラリである [YubinBango](https://github.com/yubinbango/yubinbango) を使用しますが、これは Locker-safe ではないので、[静的リソースでライブラリを読み込む方法](https://developer.salesforce.com/docs/component-library/documentation/ja-jp/lwc/lwc.js_third_party_library)は使えません。そこで、このライブラリが参照している、郵便番号先頭3桁毎の住所データ (例: [100 始まりの郵便番号データ](https://yubinbango.github.io/yubinbango-data/data/100.js)) を Fetch することにします。

都道府県はコードで返されるため、どこかに[配列を保持](https://github.com/shunkosa/lwc-jp-postcode-address-autocomplete/blob/master/force-app/main/default/lwc/postalCode/postalCode.js#L24)しておきましょう。また、`https://yubinbango.github.io` を [CSP 信頼済みサイト](https://help.salesforce.com/apex/HTViewHelpDoc?id=csp_trusted_sites.htm&language=ja)に設定しておく必要があります。

```exampleForm.html
<lightning-input label="郵便番号" type="text" max-length="7" value={postalCode} onchange={handlePostalCodeChange}></lightning-input>
<lightning-input label="住所" type="text" value={address}></lightning-input>
```

```exampleForm.js
import { LightningElement } from 'lwc';
import Prefectures from 'c/prefecture';

export default class ExampleForm extends LightningElement {
    postalCode;
    address;

    async handlePostalCodeChange(event) {
        this.postalCode = event.target.value;
        if (!this.postalCode || !event.target.checkValidity()) {
            return;
        }
        const response = await fetch(`https://yubinbango.github.io/yubinbango-data/data/${this.postalCode.substring(0,3)}.js`)
        const responseFunctionText = await response.text();
        const addressMap = JSON.parse(result.replace('$yubin(','').replace(');','')); // 余計な文字列を削除
        const addressData = addressMap[this.postalCode]; // e.g., [13,"新宿区","西新宿","２丁目８－１"]
        if (addressData) {
            const prefecture = Prefectures()[addressData[0] - 1];
            // 都道府県と、配列の2番目以降を文字列結合 (項目を分ける場合はここで処理)
            this.address = prefecture + addressData.slice(1).join(''); 
        }
    }
}
```
How to backup and restore an Azure SQL managed instance by using storage account.

1.前提：
.Azure VMが作成済み。さらに中にSSMSがインストール済み。
.AzureにてSQL managed instance 作成済み。
.bakファイル保存のstorage account作成済み。（containerも作成済み）

2.目標
.SQL managed instanceに接続して、databaseのbackupとrestore作業を実施する。

3.作業実施
早速始めましょう。
3.1　MIはAzureVMから接続することです。SQL databaseのようにlocalから接続はできません。
Azure VMに接続することも苦労しました。NetworkingにDenyALLinBoundが設定されているため接続は拒否されました。仕方なく、High priorityでlocalPCのIPを接続できようにinbound ruleを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/4aa96fc6-0754-7ec4-257f-e66761c4accf.png)
これでようやくまずVMに接続できました。

3.2VMから接続。ここは安易に行きました。

3.3databaseには暗号化かけているかどうかを確認します。
SELECT
    db.name,
    db.is_encrypted,
    dm.encryption_state,
    dm.percent_complete,
    dm.key_algorithm,
    dm.key_length
FROM
    sys.databases db
    LEFT OUTER JOIN sys.dm_database_encryption_keys dm
        ON db.database_id = dm.database_id; 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/01447fb8-8ee5-0d6f-9a4b-b6dd9e47857d.png)
encryption_stateは３です、つまり暗号化かけています。

3.4暗号化かけている場合、Backupはできないため、暗号化をOFFする必要があります。
ALTER DATABASE test1 SET ENCRYPTION OFF;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/f88dd333-2962-3ca0-5eb3-a382a50bba4a.png)
確認すると、stateは１なりました。

しかしここではまたBackup作業はできません。なぜなら、暗号Keyをも削除する必要があります。
DROP DATABASE ENCRYPTION KEY;  

3.5　よし、Backup to storage accountをやってみよう。
BACKUP DATABASE test1 TO URL = N'https://tantestbkstorage.blob.core.windows.net/tanbackup/test11.bak' with copy_only, compression;
Oh errorがでました。
Msg 3201, Level 16, State 1, Line 9
Cannot open backup device 'https://tantestbkstorage.blob.core.windows.net/tanbackup/test11.bak'. Operating system error 50(The request is not supported.).
Msg 3013, Level 16, State 1, Line 9
BACKUP DATABASE is terminating abnormally.
忘れました。ここではまずdatabaseからstorageaccountに接続できる資格情報の登録が必要です。
早速Azure portalのStorage accountに行って、SAStokenを取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/eb8ea93e-0c2f-6138-8d4f-7ec9bea9f3ae.png)
そして、DBに下記のSQLで資格情報を登録します。
CREATE CREDENTIAL [https://tantestbkstorage.blob.core.windows.net/tanbackup]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE'
, SECRET = 'sv=2019-02-02&ss=bfqt&srt=sco&sp=rwdlacup&se=2020-04-16T02:50:17Z&st=2020-04-16T02:46:17Z&spr=https&sig=sI5pklF%2B07JTzUsXRaQL5FIaTgyxx9LSL8y8MqUcu%2Bc%3D'

BACKUP DATABASE test1 TO URL = N'https://tantestbkstorage.blob.core.windows.net/tanbackup/test11.bak' with copy_only, compression;

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/72be29c7-3119-cc48-1a1b-65d205afb049.png)
よし、成功しました。

3.6　さっきbackupしたtest11.bakファイルでrestoreをやりました。
RESTORE DATABASE test11 FROM URL = N'https://tantestbkstorage.blob.core.windows.net/tanbackup/test11.bak'

もちろん成功しました。
では暗号化をONに戻しましょう。
ALTER DATABASE test1 SET ENCRYPTION ON;

追加質問：backup作業の場合、暗号化OFFする必要がありますが、restoreする場合、暗号化OFFにする必要もありますか。
=============================
回答は不要です。実機で自分でテストしてみましょうね。

ご清聴、どうもありがとうございました。