OmniAICreator/Qiita-1.07M huggingface dataset:
SQL　基本的なSQL文の例

この記事は基本的な構造をすでに理解した方に向けた、実践的なSQLの例文を乗せています。


SQLの基本構造
![スクリーンショット 2021-03-15 14.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/89ca9e55-a553-8bbb-d1cf-c5819f68d59d.png)


###SQL文　例1） 気象観測###

![スクリーンショット 2021-03-13 20.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/5145940c-ac7a-91f9-6309-aab4da7cc41f.png)
テーブル名：気象観測
＊分かりやすいように列名は日本語のままで記載します。↓
＊SQLは大文字小文字を区別しません


最高気温が３０度以上のデータ

```
select * from 気象観測 where 最高気温 >=30;
```

最低気温が０以下のデータ

```
select * from 気象観測 where 最低気温 <=0;
```

3月5月7月のデータ

```
select * from 気象観測 where 月 in (3,5,7);

/* または、 */

select * from 気象観測 where 月=3 or 月=5 or 月=7;
```

降水量が100以下で湿度が50以下のデータ

```
select * from 気象観測 where 月 in (3,5,7);
```

最低気温が5以下または最高気温が３５以上のデータ

```
select * from 気象観測 where 最低気温 < 5 or 最高気温 > 35;
```

湿度が６０から７９の範囲のデータ

```
select * from 気象観測 where 湿度 between 60 and 79;
```

観測データのない列のある月のデータ

```
select * from 気象観測 where 降水量 is null or 最高気温 is null or 最低気温 is null or 湿度 is null;
```

###例２） 都道府県###
![スクリーンショット 2021-03-13 22.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/ee39443a-cbd5-ae6a-60f4-e53f375af0a8.png)
テーブル名：都道府県


都道府県名が川で終わる都道府県

```
SELECT 都道府県名 FROM 都道府県 WHERE 都道府県名 LIKE '%川';
```

都道府県名が島が含まれる都道府県

```
SELECT 都道府県名 FROM 都道府県 WHERE 都道府県名 LIKE '%島%';
```
都道府県名が愛から始まる都道府県

```
SELECT 都道府県名 FROM 都道府県 WHERE 都道府県名 LIKE '愛%';
```

都道府県と県庁所在地が一致するデータ

```
SELECT 都道府県名 FROM 都道府県 WHERE 都道府県名 = 県庁所在地;
```
都道府県と県庁所在地が一致しないデータ

```
SELECT 都道府県名 FROM 都道府県 WHERE 都道府県名 <> 県庁所在地;
```

###例3） 成績表###
テーブル名：成績表
![スクリーンショット 2021-03-13 23.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/e1e4ece6-ecef-e5cd-2b96-de963137bd29.png)
![スクリーンショット 2021-03-13 23.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/1a025ccf-755c-fabd-9ba1-b85079f0c5ae.png)




登録されているデータを全て取得し、テーブルの内容を確認する

```
SELECT * FROM 成績表;
```

次の表にある学生と科目を追加
![スクリーンショット 2021-03-13 23.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050099/9c9a6c6f-14c3-c2ff-828f-ac8bed3754ef.png)

```
/* 学生1 */
INSERT INTO 成績表 VALUES ('S001', '織田 信長', 77, 55, 80, 75, 93, NULL);
/* 学生2 */
INSERT INTO 成績表 VALUES ('A002', '豊臣 秀吉', 64, 69, 70, 0, 59, NULL);
/* 学生3 */
INSERT INTO 成績表 VALUES ('E003', '徳川 家康', 80, 83, 85, 90, 79, NULL);
```

上記で登録した学籍番号S001の学生の法学を８５、哲学を６７に修正する

```
UPDATE 成績表 SET 法学 = 85, 哲学 = 67 where 学籍番号 = 'S001';
```



【参考資料：スッキリわかるSQL入門　第一部SQLを始めよう　第三章操作する行の絞り込み】
Chocolatey/scoop インストール時のエラー対処

# 概要
インストール時に下記のようなエラーが出たときの対処方法

```:powershell

PS> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
発生場所 行:1 文字:1
+ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.Service ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
このスクリプトには、悪質なコンテンツが含まれているため、ウイルス対策ソフトウェアによりブロックされています。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ScriptContainedMaliciousContent
```

# 手順

## 1. 実行ポリシーを変更
```:powershell
PS> Set-ExecutionPolicy Bypass -Scope Process -Force
```
## 2 . インストール スクリプトをダウンロード
- chocolatey<br>
[https://chocolatey.org/install.ps1](https://chocolatey.org/install.ps1)
- scoop<br>
[https://get.scoop.sh](https://get.scoop.sh)


## 3. インストール スクリプトを実行
```:powershell
PS> C:\Users\User\Downloads\install.ps1
```
mindstroms nxt2.0で超音波センサーを動かしてみた

<iframe width="100%" height="500" src="https://www.youtube.com/embed/IT2GeS0zBLo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**ソースコードはこちらからコピーして遊んでみてください。**

```
#pragma config(Sensor, S3,     sonar,          sensorSONAR)

task main()
{
	while(true)
	{
		while(SensorValue (S3) < 30)
		{
			motor[motorA] = 100;
			motor[motorC] = 100;
		}
	}
}

```
OpenSSLで自己認証局を作成しServer証明書を作成する方法（概要編）

OpenSSLで自己認証局を作成しServer証明書を作成するコマンドです。
詳細は「[OpenSSLで自己認証局を作成しServer証明書を作成する方法](https://qiita.com/yasushi-jp/items/91d9fb881e3b69b32935 "OpenSSLで自己認証局を作成しServer証明書を作成する方法")」を見てください。

# コマンド
```bash
# rootCAのディレクトリ作成
mkdir -p /root/pki/rootca

# interCAのディレクトリ作成
mkdir -p /root/pki/interca

# Serverのディレクトリ作成
mkdir -p /root/pki/server

# rootCAに移動
cd /root/pki/rootca

# rootCAの秘密鍵を作成
openssl genrsa -out rootca.key -aes256 2048

# rootCAの秘密鍵の内容を確認
openssl rsa -text -noout -in rootca.key

# rootCAの証明書署名要求の作成
openssl req -new -key rootca.key -out rootca.csr -subj "/C=JP/ST=Kanagawa/L=Yokohama/O=yasushi-jp/CN=My Root CA"

# rootCAのCSRの内容を確認
openssl req -text -noout -in rootca.csr

# 「X509.V3」の設定
cat > /root/pki/rootca/rootca_v3.ext << EOF
basicConstraints       = critical, CA:true
subjectKeyIdentifier   = hash
keyUsage               = critical, keyCertSign, cRLSign
EOF

# rootCAの証明書の作成（rootCAによる自己署名）
openssl x509 -req -in rootca.csr -signkey rootca.key -days 365 -sha256 -extfile rootca_v3.ext -out rootca.crt

# rootCAの証明書の内容を確認
openssl x509 -text -noout -in rootca.crt

# interCAに移動
cd /root/pki/interca

# interCAの秘密鍵を作成
openssl genrsa -out interca.key -aes256 2048

# interCAの秘密鍵の内容を確認
openssl rsa -text -noout -in interca.key

# interCAの証明書署名要求の作成
openssl req -new -key interca.key -out interca.csr -subj "/C=JP/ST=Kanagawa/L=Yokohama/O=yasushi-jp/CN=My Inter CA"

# interCAのCSRの内容を確認
openssl req -text -noout -in interca.csr

# interCAの証明書署名要求（CSR）をrootCAに送信
cp -p interca.csr /root/pki/rootca

# rootCAに移動
cd /root/pki/rootca

# interCAの証明書の作成（rootCAが署名）
openssl x509 -req -in interca.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -days 365 -sha256 -out interca.crt -extfile rootca_v3.ext

# interCAの証明書の内容を確認
openssl x509 -text -noout -in interca.crt

# rootCAが署名したinterCAの証明書をinterCAに送信
cp -p interca.crt /root/pki/interca

# Serverに移動
cd /root/pki/server

# Serverの秘密鍵を作成
openssl genrsa -out server.key -aes256 2048

# Serverの秘密鍵の内容を確認
openssl rsa -text -noout -in server.key

# Serverの証明書署名要求の作成
openssl req -new -key server.key -out server.csr -subj "/C=JP/ST=Kanagawa/L=Yokohama/O=yasushi-jp/CN=yasushi.co.jp"

# ServerのCSRの内容を確認
openssl req -text -noout -in server.csr

# Serverの証明書署名要求（CSR）をinterCAに送信
cp -p server.csr /root/pki/interca

# interCAに移動
cd /root/pki/interca

# 「X509.V3」の設定
cat > /root/pki/interca/server_v3.ext << EOF
authorityKeyIdentifier = critical, keyid, issuer
basicConstraints       = critical, CA:FALSE
keyUsage               = critical, digitalSignature, keyEncipherment
extendedKeyUsage       =serverAuth, clientAuth
subjectAltName         = @alt_names
[alt_names]
DNS.1 = yasushi.co.jp
DNS.2 = *.yasushi.co.jp
EOF

# Serverの証明書の作成（interCAが署名）
openssl x509 -req -in server.csr -CA interca.crt -CAkey interca.key -CAcreateserial -days 365 -sha256 -out server.crt -extfile server_v3.ext

# Serverの証明書の内容を確認
openssl x509 -text -noout -in server.crt

# interCAが署名したServerの証明書をServerに送信
cp -p server.crt /root/pki/server

```

# 参考
[OpenSSLで自己認証局を作成しServer証明書を作成する方法](https://qiita.com/yasushi-jp/items/91d9fb881e3b69b32935 "OpenSSLで自己認証局を作成しServer証明書を作成する方法")

---

以上
Pythonでファイル名の一括変換スクリプトを書いてみる

#きっかけ
突然ですが、みなさんは写真を撮られますか？
私は、i-Phoneで料理や風景を記念に撮ることが多いのですが、撮ったら撮りっぱなしで、まめに整理をするわけでもないので、一方的に写真データが増え続けるだけの状況でした。
先日PCのデータ保存用に外付けのHDDを新調したので、これを機にi-Phone内の写真を整理しようと思ったわけです。
ところがいざ写真ファイルを整理し始めてみると、名前が日付＋時刻でなんの写真なのかわかりません。
まとめて名前を変えたいなと思ったのが事の始まりでした。

#やり方は何個もある
一括変換用のアプリでも入れればよいのですが、調べるのも新たに使用ソフトが増えるのも億劫です。
かといってWindows10のOS機能で名前を変えると「基本のファイル名+(1)」というファイル名が付き、これは何だか嫌でした。
PowerShellやコマンドプロンプトでも同様の処理はできると思いますが、Pythonで遊んでみたかったので作ろうと思った次第です。

#書く前の整理
まずは、Pythonに何をやらせたいのかを整理します。
やりたいことは「任意のフォルダ配下の画像ファイルの名前を一括変換する」ことです。
実際には以下の2つの処理を順番に実施します。
####処理の内容
①：任意のフォルダ配下にある画像ファイルの一覧を取得する
②：取得したファイル一覧の名前を命名規則に則って変換する

####使用できるライブラリ（モジュール）の確認
やることが決まったので、どうやったらできるかを調べます。
具体的にはPythonで「①：ファイルの一覧取得をする方法」と「②：名前の変更をする方法」を調べます。
ググれば簡単に見つかりました。

#####①：ファイルの一覧を取得する
最初に見つけたのは、標準ライブラリに含まれる「os」モジュールの「listdir」関数です。
以下のようなことができるとのことで、機能としては十分です。

```:listdir関数
・ファイル名とフォルダ名の両方の一覧を取得
・ファイル名のみの一覧を取得
・フォルダ名のみの一覧を取得
```

しかし、ここで問題が発生しました。画像ファイルの名前の一覧を取得したいので、jpgやpngといった拡張子のものだけを取得したいのですが、特殊文字の*(ワイルドカード)が使えないというのです。

そこで見つけたのが「os」モジュールの「glob」関数でした。
*(ワイルドカード)の使用や再帰的な処理（今回は不要ですが）が可能とのことです。

#####②：ファイル名を変更する
ファイル名を変更する方法もすぐに見つかりました。
「os」モジュール中の「rename」関数です。

#書いてみる

使用環境は下記となります。
関数も見つかったので、早速書いてみます。

OS：Windows10 Pro 2004
Python：3.7.4

※Python3では明示しない場合は、文字コードが「UTF-8」になる設定とのことですので、
　下記をテキストエディタ等で保存するときは、文字コードを「UTF-8」にしてください。

```:rename.py
#モジュールのインポート
import os, glob

#ファイル名を取得したいファイルの拡張子を設定
#※ここでは「.jpg」
ext = ".jpg"

#ファイル名の一覧取得
#ここではrename.pyと同フォルダ内にある.jpgファイルを取得しています。
files = glob.glob("*" + ext)

#名前に使用する数値のカウンタを初期化
i = 1

#ファイル名の一覧に対して以下を繰り返し実施
#ファイル名一覧から1つを取り出して、変数「old_name」に格納する
for old_name in files:

    #変更後の名前のベースを設定
    #※ここでは「テスト_001」から数値が+1されていくように設定しています
	change_name = "テスト_" + "{0:03d}".format(i)

    #変更後の名称を変数「new_name」に格納する
    #※拡張子を後付けしているのは後で変更したくなった時のためです
	new_name = change_name + ext

    #ファイル名の変更
	os.rename(old_name, new_name)

    #新旧ファイル名の対応を表示
	print(old_name + "->" + new_name)

    #名前に使用する数値カウンタをインクリメント
	i += 1
```

#テストしてみる
早速実行してみます。
変更前(1).jpg～変更前(18)がテスト_001.jpg～テスト_018.jpgとなれば成功です。

実行前のスクリーンショット
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/0fb99997-019a-78c5-9188-1c43782aadd3.png)

コマンドプロンプト
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/8d586388-57b5-d840-7c37-29195d969626.png)

実行後のスクリーンショット
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/28610b94-a3bb-82ee-cb1c-0f55f969b792.png)

無事、一括変更することができましたが、
名前の対応が崩れてしまったようです。。。
※Pythonで変更前のファイル名を名前順でソートすると「コマンドプロンプト」の画像のような順番になるようですね。。。

#終わりに
名前の一括変更をPythonで実施してみました。
無事一括変換できましたが、変更前の名前順がおかしいので、対応が変な感じになってしまいました。
今回は対応とれていなくても影響ないのでそのままで、目的は達成できたので満足です。
※対応取りたい場合は、面倒ですがファイル名を別でソートしないとダメですね（1回分解しないとだめかな）。

#######2021/03/28 問題の修正完了

https://qiita.com/Lynx_Arc18/items/5b93f7cd02cc95cb7343
wordpressの教科書でグローバルメニューの画像が表示されない時

wordpressの教科書でテーマ作成をしていた時にハマった内容なので共有。

＜内容＞
・カスタムメニュー機能を追加
・グローバルメニューを表示させる


＜不具合＞
・ｃｓｓでbackground-image: url(~~~~);
　を使ったがグローバルメニューが表示されない。




＜確認手順＞
1.header.php、及び、nav.cssに記述ミスがないか？
2.教科書内の作業抜けがないか？
3.background-imageのurlに誤りがないか？
4.chormeのキャッシュの削除


今回は、１・２・３は問題なかったので「４」の対処方法を下記に記載(^ ^)






`＜キャッシュの削除手順＞
1. Chrome『×』の下にある『︙』をクリック
2. その他のツール
3. 閲覧履歴の削除
4. キャッシュされた画像とファイルにのみチェック
5. データを削除
`


こんなことで2日ぐらい悩んでしまいました(~_~;)
AWS CloudShell を利用してS3バケット作成、Put・Get

# 初めに
CloudShellを使えば、認証情報やEC2を使わずにS3の操作ができるので便利。

- バケット作成

# バケット作成、フォルダ作成、Put・Get

```
$ aws s3api create-bucket --bucket my-bucket-2021-0313 --region ap-northeast-1
```

- ファイル作成
  - CloudShellでは `vi` コマンドが使える

```
vi sample.txt
```


- 作成したファイルをアップロード

```
$ aws s3 cp sample.txt s3://my-bucket-2021-0313/
```

- フォルダ作成

```
$ aws s3api put-object --bucket my-bucket-2021-0313 --key myfolder/
```

- バケット内のオブジェクト一覧

```
$ aws s3 ls s3://my-bucket-2021-0313
                           PRE myfolder/
2021-03-13 09:09:19         14 sample.txt
```

- オブジェクトの情報を取得
  - `--key sample.txt content.txt` は、sample.txtというオブジェクト名の情報を取得し、sample.txt の中身はcontent.txtに書き込む

```
$ aws s3api get-object --bucket my-bucket-2021-0313 --key sample.txt content.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-03-13T09:09:19+00:00",
    "ContentLength": 14,
    "ETag": "\"25dd5dedf3d565b1ac293eabeb2932da\"",
    "ContentType": "text/plain",
    "Metadata": {}
}
```

- フォルダ内のすべてのファイルを指定したディレクトリにダウンロード

```
$ aws s3 cp s3://my-bucket-2021-0313/myfolder/ ./testdir --recursive
download: s3://my-bucket-2021-0313/myfolder/file2.txt to testdir/file2.txt
download: s3://my-bucket-2021-0313/myfolder/file1.txt to testdir/file1.txt
```

# S3からCloudShellにダウンロードしたファイルをローカルにダウンロード

1.ActionsのDownload fileを選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/2ea11167-d037-1655-8484-9ffdb27f03d5.png)

2.ファイルパスを入力


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/296b471e-be57-dc88-42af-362438986ab2.png)


# ローカルからCloudShellにファイルをアップロード

1.ActionsのUpload fileを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/4d7dd823-a61c-5306-cdcd-f09166f8942b.png)

2.ファイルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/db854a58-b60d-0244-bac4-07b19694f221.png)
Access denied for user 'root'@'localhost' (using password: NO) エラーの対処

## 対象
* CentOS 7
* Mysql Ver 8.0.23 for Linux on x86_64

##### 確認方法
```bash
# OS確認
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

# MySQL確認
$ mysql --version
mysql  Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)
```

## エラー内容
```bash
$ mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```

## 'root'@'localhost'のパスを確認してみる

```bash
cat /var/log/mysqld.log | grep root
2021-03-13T10:37:21.641762Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: kjdgxz#G89 
```

最後に表示された文字列がパスワードです。
[CSS]要素のクリック・タップを無効にする[pointer-events]

#概要
特定の条件によって要素のタップを無効にしたくて楽に実装できないかと調べていたら、CSSで制御できるみたいなのでメモします。

#実装

```.css
.hoge{
  pointer-events:none;
}
```

#まとめ
絶対にクリックされたくない場合でなければCSSで制御するのが楽でいいですね。
SwitchBotをHub経由でAPIから操作する

SwitchBotをAPIから操作する方法をまとめておきます。
SwitchBotは、SwitchBot Hubを通してインターネットに接続されているを前提としています。

# 認証用トークンの取得

まずは、API認証用のトークンを取得します。
SwitchBotアプリの `設定 > 開発者向けオプション` から確認可能です。
`開発者向けオプション` は、設定画面の `アプリバージョン` を10回ほどタップすると表示されるようになります。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/c515deb7-482b-52bd-95eb-52d36698692e.jpeg">

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/2309d276-cd98-8a83-805a-7ac7d0bc6748.jpeg">

# SwitchBotの設定

APIから操作するために、SwitchBotの「クラウドサービス」をオンにしてください。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/4c0745b2-5d4c-b389-6c00-098b8adc8f82.jpeg">

# APIから操作する

[こちらのAPIドキュメント](https://github.com/OpenWonderLabs/SwitchBotAPI#switchbotapi)を確認しながら進めていきます。

### deviceIdの取得

まずは、SwitchBotの `deviceId` を取得します。
`Authorization` には、最初に取得した認証用トークンを指定してください。

``` sh
curl --request GET 'https://api.switch-bot.com/v1.0/devices' \
  --header 'Authorization: 認証用トークン' \
  --header 'Content-Type: application/json; charset=utf8'
```

下記のようなレスポンスが返ってくるので、SwitchBotの `deviceId` を確認してください。

``` json
{
    "statusCode": 100,
    "body": {
        "deviceList": [
            {
                "deviceId": "HubのdeviceId",
                "deviceName": "Hub Plus 2F",
                "deviceType": "Hub Plus",
                "enableCloudService": false,
                "hubDeviceId": "000000000000"
            },
            {
                "deviceId": "SwitchBotのdeviceId",
                "deviceName": "Bot EC",
                "deviceType": "Bot",
                "enableCloudService": true,
                "hubDeviceId": "hogehoge"
            }
        ],
        "infraredRemoteList": []
    },
    "message": "success"
}
```

### SwitchBotの操作

`deviceId` を確認したら、下記のリクエストを送信します。
URLには、SwitchBotの `deviceId` を指定してください。

```sh
curl --request POST 'https://api.switch-bot.com/v1.0/devices/SwitchBotのdeviceId/commands' \
  --header 'Authorization: 認証用トークン' \
  --header 'Content-Type: application/json; charset=utf8' \
  --data-raw '{
    "command": "press",
    "parameter": "default",
    "commandType": "command"
  }'
```

簡単ですね！
その他の操作もドキュメントに記載されているので、色々できそうです。
E資格（2021#1）

2021年2月21日に「E資格（エンジニア資格）2021#1」を受けました。
合格したので記事を書いておきます。
少しでも次受ける方の参考になれば幸いです。

## 受験理由
■１ 機械学習を仕事で使っているため
■２ 機械学習や深層学習に興味があるため

## 感想
■１ 実は2020#1のE資格には落ちており、2回目で受かりました。E資格の問題集が2020年9月4日にインプレスから出版されたので、それを勉強したので今回は受かったと思われます。正直、試験当日までは受かるとは思っていませんでした。
■２ 数式は意味を理解した方がよいですが、時間内に問題を解くことを目的とする場合は、即答できるように暗記した方がよいです。
	
## 学習教材
■１ 徹底攻略ディープラーニングE資格エンジニア問題集 徹底攻略シリーズ（スキルアップAI株式会社 小縣ら, 2020, インプレス）
・・・E資格初の対策本です。認定プログラム以外にこちらをやってもよいかと思います。
■２ 認定プログラムの例題、模擬試験
・・・認定プログラムにもよりますが、こちらも当然やっておきます。

## 学習方法
■１ 落ちた時は認定プログラムを中心に勉強しましたが、今回は学習教材１を中心に勉強しました。
・・・2021年の1月～受験日当日の2月21日まで学習教材1をほぼ毎日解き続けました。特に数式は何度もノートに書いたり、通勤中に頭の中で思い浮かべたりしながら、定着させました。認定プログラムの模擬試験は試験日前日と当日に解きました。

## 試験
■１ 試験時のモニターがかなり横長で文字が少し潰れており、その画面に慣れるのに10-15分ぐらい費やしてしまい焦りました。自分は見直しする時間が5分ほどしかありませんでした。

## 反省点
■１ もう少し早めに勉強しておけばよかったです。前回のE資格に落ちてから完全に放置してしまい。2021年1月から再度勉強したので、時間が足りず、ギリギリ受かるかもと思える心境にまでなったのは試験日当日です。

## 試験前にやっておいてよかったこと等
■１ 試験ぎりぎりまで勉強したこと：前日までは落ちるだろうと思っていたのですが、当日に模擬試験を解いていたら、急にわかるようになってきて、これはいけるかもと思い、その勢いのまま何とか受かりました。
【javascript】リトライループ

#前書き
DOMでの要素取得がうまくいかない時に、この関数を使って何度かリトライして取得してます。

引数1のfuncを処理し、十分な結果を得るかループ回数が上限に達するまで繰り返す。
上限までループしてもダメだった時はnullを返す。

#引数

|引数|変数名|既定値||
|:--:|:--:|:--:|:--|
|1|func||リトライする関数|
|2|argsArr|[]|（配列）上記関数funcに使う引数|
|3|max|5|ループ回数の上限値|
|4|delay|1000|（ミリ秒）リトライの間の待ち時間|


#コード
```javascript:
const retryLoop = (func, argsArr=[], max=5, delay=1000) => {
	if (!func) return null;
	
	//関数funcの返値が十分な結果を得たらtrue
	const isEnough = obj => {
		if ([null,undefined].includes(obj)) return false;
		if (Object.keys(obj).length===0) return false;
		return true;
	};
	
	let cnt = 1;		//カウンター
	let result = null;	//関数funcの返値を格納
	
	//関数funcを実行
	//十分な結果を得るかループ数がMAXに到達したらtrue
	const retry = () => {
		try {result = func(...argsArr)} catch(e) {console.error(cnt, e)}
		return isEnough(result) ? true : (max < ++cnt);
	};
	
	//ループ処理
	//ループ数がMAXに到達したらnullを返す
	const loop = r => {
		const canStop = retry();
		return canStop ? r(result) : setTimeout(() => loop(r), delay);
	};
	return new Promise(loop);
};
```
#追記：コード（再構成）
気になってた部分をまとめた。

```javascript:
const retryLoop = (func, args=[], max=5, delay=1000) => {
	if (!func) return null;
	
	let cnt = 1;
	let result = null;
	
	const isEnough = () => 
		[null,undefined].includes(result) ? (max < ++cnt) : true;
	const loop = r => {
		try {result = func(...args)} catch(e) {console.error(cnt, e)}
		return isEnough() ? r(result) : setTimeout(() => loop(r), delay);
	};
	
	return new Promise(loop);
};
```
#使用例
```javascript
const func = () => {
	//doSomthing
	return elm;		//複数要素を返したい時は、配列・連想配列
};

retryLoop(func, [], 10, 700)
.then(result => {
	console.log(result);
	if (result===null) return;
	// doSomething
});

(async () => {
	const result = await retryLoop(func);
	console.log(result);
	if (result!==null) {
		//doSomething
	}
})();
```

#後書き

何か見落としあるかも？
SCIMを用いたIdP - Salesforce プロビジョニング方法 メモ

* IdP側で更新したユーザー属性情報をSalesforceとプロビジョニングする方法の備忘録記事。
  * プロビジョニングには、SCIMプロトコルを使用する。



## 準備

* Salesforce側の接続アプリケーション設定を行い、`client_id`,`client_secret`,`password`などの認証情報を払い出しておく。



## 想定シーケンス

![SCIM_salesforce_sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/db1ac04c-3850-7af1-af27-b1fafaae35d8.png)




## 各処理

### ①トークンエンドポイントからアクセストークンを取得する

* 以降のAPI実行に必要なアクセストークンを取得する。
* リクエスト例

```HTTP
GET /services/oauth2/token HTTP/1.1
Host: login.salesforce.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8

grant_type=password&client_id=YOUR_CLINET_ID&client_secret=YOUR_CLIENT_SECRET&&username=YOUR_USERNAME&password=YOUR_PASSWORD
```

* レスポンス例
  * 200 OK

```json
{
    "id":"https://login.salesforce.com/id/00Dx0000000BV7z/005x00000012Q9P",
	"issued_at":"1278448832702",
    "instance_url":"https://na1.salesforce.com",
	"signature":"0CmxinZir53Yex7nE0TD+zMpvIWYGb/bdJh6XfOH6EQ=",
	"access_token":"00Dx0000000BV7z!AR8AQAxo9UfVkh8AlV0Gomt9Czx9LjHnSSpwBMmbRcgKFmxOtvxjTrKW19ye6PE3Ds1eQz3z8jr3W7_VbWmEu4Q8TVGSTHxs"
}
```



### ②更新対象ユーザーIDを取得する

* (IdP側がSalesforce側のユーザーIDを持っていない場合、)Salesforce側のユーザーIDを取得する。

* リクエスト例
  * ①で取得したアクセストークンを`Authorization`ヘッダーに指定する。
  * `userName`で検索する場合。

```http
GET /services/scim/v2/Users?filters=userName ... HTTP/1.1
Host: sales_force_org_url
Content-Type: application/json; charset=utf-8
Authorization: Bearer {access_token}
```

* レスポンス例
  * HTTP/1.1 200 OK

```json
{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 1,
    "Resources": [{
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
        "id": "user_id",
        "userName": "...",
        ...
        }]
    }],
    "startIndex": 1,
    "itemsPerPage": 20
}
```



### ③ユーザー属性を更新する

* ②で取得したユーザーIDを指定し、Salesforce側ユーザー属性を更新する。
* リクエスト例
  * ①で取得したアクセストークンを`Authorization`ヘッダーに指定する。

```http
PATCH /services/scim/v2/Users/{user_id} HTTP/1.1
Host: sales_force_org_url
Content-Type: application/json; charset=utf-8
Authorization: Bearer {access_token}

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "emails": [{
        "value": "UpdatedTest@example.com",
        ...
    }]
}
```

* レスポンス例
  * HTTP/1.1 200 OK

```json
{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "5171a35d82074e068ce2",
    ...
    "emails": [{
        "value": "UpdatedTest@example.com",
        ...
    }]
}
```



## 参考情報

* [Manage Salesforce User Identities with SCIM](https://help.salesforce.com/articleView?id=sf.identity_scim_overview.htm&type=5)
* [OAuth Endpoints](https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_endpoints.htm&type=5)
* [ユーザ名パスワード OAuth 認証フローについて](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce1api.meta/salesforce1api/intro_understanding_username_password_oauth_flow.htm)
* [チュートリアル:SCIM エンドポイントのプロビジョニングを開発および計画する](https://docs.microsoft.com/ja-JP/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups)
Symbol関係のリンク集

<b>Symbolエクスプローラー</b>
http://explorer.testnet.symboldev.network/
<b>Symbol Wallet配布場所</b>
https://github.com/nemgrouplimited/symbol-desktop-wallet/releases/
<b>Symbolノード一覧（testnet）</b>
https://symbolnodes.org/nodes_testnet/
<b>Symbolテクニカルドキュメント</b>
https://docs.symbolplatform.com/ja/index.html



#＜　宣　伝　＞

デリゲートハーベスティングには、是非とも以下のノードのご利用を❣

　```000-harvest-symbol.ml```
　```0-0-0-high-performance.harvest-node.com```
　```0-0-high-performance.harvest-node.com```
　```00.high-performance.harvest-node.com```
　```0-speedy-harvest.ml```
　```0-0-1-high-performance.harvest-node.com```
UNIXについて

今回はUNIXについて学習していきます！

#UNIXとは
簡単にいうとOSのことです。OSとはこちらの記事がわかりやすく解説されていましたのでご参照ください👍
▶https://wa3.i-3-i.info/word1962.html
簡単にいうと windows,mac,ios,androidなどの一種です。
パソコンが人間の体としてosは脳みそみたいな役割と考えたらいいかなと思います👍

UNIXには、２種類があります！
それぞれみていきましょう

#①GUI
こちらはmac,windowsなどのマウス本体が行う操作でファイルを作ることができます！
機械操作がわかれば比較的簡単にファイルを作ることができるのがメリットではありますが、デメリットとして自動化ができないのが挙げられます。

#②CUI
こちらはコマンド（ターミナル）でファイルを作ることができます！
ターミナルを立ち上げて行うのが初心者がとっつきにくいですが、なれると自動化ができるのが最大のメリットといえます👍

また、実際にコマンドを開く前に、絶対パスと相対パスについて触れていきます。

#①絶対パス
これは、簡単に言うと、都道府県から番地までのことです。宅急便を頼むとき住所とかかきますよね！
そんな感じですね！
書き方は、
#②相対パス
こちらは、道案内みたいな感じです(^_^;)　自分がいる場所から目的地までの道のりを機械に教えて上げる感じです👌

ちなみにこれらは画像挿入のときにも使っているので大丈夫かなと思います👌

```
絶対パス
/Users/〇〇/Documents/彼氏くん/images/image0.jpeg

相対パス
images/image0.jpeg
```
になります！！

絶対パスは、ユーザー名（〇〇）の中のDocumentsの中の彼氏くんっていうフォルダの中のimagesっていうフォルダの中に写真がありますよ
っていう意味です👍
相対パスはそれを省略した形です👍

余談ですが、VSコードではダブルクリックすると絶対パスと相対パスがコピーできるのでやってみてください😊

では、実際にターミナルを使っていきましょう😎
【SCSS】if文を使って条件分岐する

#プログラミング勉強日記
2021年3月13日

#SCSSとは
　SCSSを説明する前に、Sassを知らないといけない。SassはCSSをより便利かつ効率的に書くことができる。SassにはSASS記法とSCSS記法の2種類の書き方がある。SCSSの拡張子は「.scss」となる。SassのメリットはCSSより記述量を減らすことができ、コードを再利用することができるところである。SCSSでは、変数を使うことができる。

```scss:変数の書き方
$text-color: blue;
```

#if文の書き方
　if文を使うことで条件を満たす場合のみ、そのプロパティが設定される。

```scss:if文の書き方
@if <条件> {
  // 内容
}
```

　if-else文もif文と同じように条件を満たす場合と満たさない場合でそれぞれのプロパティが設定される。

```scss:if-else文の書き方
@if <条件> {
  // 内容
}
@else if <条件> {
  // 内容
}
@else {
  // 内容
}
```

#サンプルプログラム

```html:HTML
<div class="colored">
  sample
</div>
```

```
$color: blue;

.colored {
  @if $color == blue {
    color: white;
    background-color: red;
  }
  @else {
    color: white;
    background-color: blue;
  }
}
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/39e82581-0713-4355-6291-e503d1858191.png)

#参考文献
[SCSSでのif文で条件分岐をする方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/21234)
[Sassで「@if文の使い方」と条件分岐は「どういう時に使う」のか？](https://stand-4u.com/css/sass/sass-if.html)
[OutSystems]Expose REST APIのOnRequestを試す

OutSystemsでREST APIを作って公開するExpose REST APIの機能には、プリプロセスを行えるOnRequest、ポストプロセスを行えるOnResponseというプロパティがあります。

OnRequest（前処理）の動作を確認してみました。
ExposeしたREST APIで、各メソッドの処理を開始する前に動作するActionを作れる機能です。
入力パラメータをText型またはBinary型として受取り、その値を修正して出力パラメータに設定することで前処理できます。

# 確認環境
Personal Environment(Version 11.10.0 (Build 22910))
Service Studio(Version 11.10.13)

# ドキュメント
[REST APIリクエストを前処理する](https://success.outsystems.com/ja-jp/Documentation/11/Extensibility_and_Integration/REST/Expose_REST_APIs/Preprocess_REST_API_Requests)

# 操作対象はBODY
パラメータを渡す方法として、URL（クエリストリング）・Header・Bodyがあります。
OnRequestで操作できるのはリクエストデータの内、BODYの部分だけのようです。OnRequestは各個別メソッドより前に動作するため、メソッドでどういうパラメータを指定しているかは関係ないはずですが、念の為確認してみました。

## URL渡しのパラメータは操作できないのでGETは対象外
HTTP Method=GET、かつ入力パラメータをURLで受け取るメソッドを作って以下のパラメータで動作確認。
<モジュールパス>/rest/SampleExposedAPI/RESTAPIMethod2?Message=%E3%83%86%E3%82%B9%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8&Number=123&dummy=2012

この条件で入力パラメータをデバッガで確認したところ、空文字列でした。よって、GET MethodのAPIにはこのカスタマイズは使えなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d19e7960-e448-fcb3-7184-f1f20f347046.png)

## POSTのAPIに渡したパラメータが、OnRequestでどのように見えるか
Chrome ExtensionのRestManで確認してみます。
用意したメソッドは、HTTP Method=POSTで、Receive In=Bodyの入力パラメータはStructure（Text型のMessageとInteger型のNumber属性を持つ）という構成。

指定したヘッダ（複合型を渡すときはContent-Type:application/jsonを渡す必要がある）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fcd720fa-9134-0a42-a042-f1415764a6bd.png)

指定したリクエストボディ：

```
{
"Message": "メッセージテキスト",
"Number": 123,
"DummyData": "DummyText"
}
```

OnRequestのRequest入力パラメータに渡ってきたデータ（デバッガで確認）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a1f2d7e3-2802-c7b0-08ea-6021ccf2b651.png)

渡したリクエストボディがそのまま、Request.RequestText属性に入っているようですね。
また、ヘッダで渡した値は、やはりRequestには入っていないようです。

# Request.RequestBinaryの正体
OnRequestの入力パラメータRequestには、ここまで見てきたRequestTextの他に、RequestBinaryという属性もあります。
上の項目と同じパラメータを使って、RequestBinaryを確認してみます。

この属性はBinary型なので、OnRequest中で、BinaryDataモジュールのBinaryDataToTextを使ってText型に戻して値を確認してみます。[^1]

Encodingを指定しておきます（ないと、ASCIIとして解釈してしまうので）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/69d536a8-4363-3d9d-fc30-f0e9fdf8e438.png)


変換してみた結果。完全に入力（リクエストボディ）と一致していますね。入力データのバイナリデータ表現ということですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e7898861-bd36-4350-4314-55931899dcd6.png)

## 前処理でパラメータを書き換えてみる
実験として、OnRequest内で受け取った値を変更してみたらどうなるかを確認してみます。

やり方としては、
1. JSON Deserializeする（REST APIメソッドで受け取りに使っている型）
2. 変数の１つを上書き
3. JSON Serializeする
4. 結果をRequest.RequestTextに編集
5. デバッガを使ってREST APIメソッドに渡ってきた値を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a9af3483-f92b-a3b4-ab3d-bdf2999b6bf6.png)

デバッガで確認した画面。想定通り値が変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2b21a472-eb2e-b40c-ee2f-e3d3724eacef.png)


[^1]: 使い方は以前書いた[OutSystemsでShift-JISやEUC-JPのデータを扱う](https://qiita.com/jyunji_watanabe/items/2cf894fec45c3d3b7628)を参照
docker使って，mruby でロボット制御をシミュレーションする(TOPPERS/箱庭)

#概要
[mruby](https://ja.wikipedia.org/wiki/Mruby) は，組み込みシステム向けの軽量なRuby言語処理系ですが，ロボットを動かすこともできます．

一方で，TOPPERSの箱庭WGでは，[単体ロボットシミュレータを](https://toppers.github.io/hakoniwa/prototypes/single-robot/)を提供しており，このシミュレータをmrubyで実行できるようになりましたので，ご紹介します．

なお，本実現にあたっては，[yamanekkoさん](https://qiita.com/yamanekko)，および軽量Rubyフォーラムさんの技術的なご支援が非常に大きく，大変感謝しております．

特に，以下の記事/gitリポジトリのREADMEが下支えになっております．

* [TOPPRES箱庭 単体ロボット向けシミュレータ(V850版)サンプルコードのmruby版](https://github.com/yamanekko/base_practice_1)
* [1時間でできるEV3RTでmruby](https://qiita.com/yamanekko/items/f5f633df005ca7144cca)
* [EV3RT用mrubyサンプルコードの使い方](https://qiita.com/yamanekko/items/c2adb87031bf38bb8a13)

#インストールおよびシミュレーション実行手順
これまで，箱庭/単体ロボットシミュレータは，Unityおよびマイコンシミュレータ Athrill を実行するようにしておりましたが，インストール手順が煩雑化してきましたので，docker化対応を始めています．docker化により，大分手順がシンプルになってきました．今回のmruby版のシミュレーション環境もdocker化しましたので是非おためしください．

インストール手順および実行方法は，以下で公開しております．

https://github.com/toppers/ev3rt-athrill-v850e2m/blob/master/docker/README.md


#mruby の制御プログラム
mruby の制御プログラムはこんな感じです．

```ruby
    count = 0
    flag = true
    while flag
      log("count:#{count}\r\n")
      case count
      when 0..200
        leftMotor.power = 5
        rightMotor.power = 5
      when 201..400
        leftMotor.power = -5
        rightMotor.power = -5
      when 401..600
        leftMotor.stop
        rightMotor.stop
        armMotor.power = 4
      when 601..800
        leftMotor.stop
        rightMotor.stop
        armMotor.power = -4
      else
        flag=false
      end
      count+=1
      EV3RT::Task.sleep(20)
    end
    log("mruby end\r\n")
```
時間経過に従って，ロボット前進⇒後進⇒ロボットアームの上げ下げをやってます．
※ロボットがたったこれだけのコードで制御できてしまうなんて，素敵です．

詳細は，こちらを参照ください．

https://github.com/toppers/ev3rt-athrill-v850e2m/blob/master/sdk/workspace/base_practice_1_mruby/main_task.rb

#デモ
では，実際にmrubyでシミュレーションしたデモをお見せします．

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/83ab9553-6131-48fc-d157-3c5163f8c8ac.gif)
axiosの概要

***axios***
---

**axiosとは**
ブラウザやnode.js上で動くPromiseベースのHTTPクライアント。非同期にHTTP通信を行いたい時容易に実装することができる。

**GET通信**
axios.getメソッドを使用する。
第一引数にURLを指定、then()で通信に成功した際の処理をかく。catch()でエラー時の処理を書く。
response.dataにデータが返る。

**POST通信**
axios.postメソッドを使用する。
POSTデータはaxios.postの第2引数で渡す。

**レスポンスの構造**

```node.js
// レスポンス構造.
axios.get('http://localhost:3000/users').then(function(response) {
    console.log(response.data);        // レスポンスデータ
    console.log(response.status);      // ステータスコード
    console.log(response.statusText);  // ステータステキスト
    console.log(response.headers);     // レスポンスヘッダ
    console.log(response.config);      // コンフィグ
  });
自分用

#クエリ文字列
URLの末尾につけ足す文字列（変数）のこと( https://xxx.com/?data1=data1&data2=data2 )

#http_build_query()関数
http://www.php-ref.com/web/01_http_build_query.html

#Cookie
Cookieとは、ブラウザ側に一時的にデータを保存するための仕組み

#urlencode
URLとして使用できない文字や記号を、使用できる文字の特殊な組み合わせで表すように変換

```
redirectで値を渡す方法
Response::redirect('/system/admin/login/?redirect='.urlencode($this->_redirect_url));

$params = Input::param();
```

	
#array_flip — 配列のキーと値を反転する

```
<?php
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);


#print_r($flipped);

結果
Array
(
    [oranges] => 0
    [apples] => 1
    [pears] => 2
)
?>

```

#reset() 
array の内部ポインタの 先頭の要素 に戻し、配列の 最初の要素の値 を返します。
https://www.php.net/manual/ja/function.reset.php

#key()
配列から、内部ポインタが現在指している配列要素のキーを、取得する
http://alphasis.info/2012/09/php-functions-key/

#pow関数
指定した基数を指定した指数で累乗した値を取得します。

```
php > echo pow(2, 3); //2 x 2 x 2 → 8
8
```
https://webkaru.net/php/function-pow/

#バーチャルホストとは
・一台のサーバーで仮想的に複数のドメインを運用するサーバー技術の一種
・バーチャルホスト機能を利用することで、1つのサーバー上で複数ドメインを同時に運用することができる
バーチャルホスト大きく2種類ある
　・IPベースバーチャルホスト
利用するドメインごとにIPアドレスを設定し、1つのサーバーコンピュータに複数のIPアドレスを割り振るバーチャルホスト。
　・名前ベースバーチャルホスト
利用するドメインすべてに同じIPアドレスを使用。

#RewriteRule
アクセスのあったURLを、正規表現で書き換えてから処理する機能
{RewriteRule 正規表現パターン 置換パターン オプション}
・URLを書き換えるための指示子
・第3引数のオプションは、その後の処理を指定
・オプションのデフォルト値は空ですので、オプションが設定されていない場合は何も処理せずに次の条件に移ります。
複数のオプションを追加する場合には、カンマで区切ります。

#RewriteEngine
Rewrite機能自体のオン・オフを制御

#RewriteCond
サーバ変数を参照して、それが指定した正規表現のパターンと一致していれば、次の条件を引き続き実行

```
下記は、サーバ変数HTTP_USER_AGENTを参照して、"Mozilla"という単語があれば次の行にあるReriteRuleを適用するという意味です。

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*

RewriteRule ^/$ /mozilla.html [L]
```
参考URL
https://rfs.jp/server/apache/02apache/url_rewrite.html
AWS 認定 クラウドプラクティショナー

2021年2月28日にAWS 認定 クラウドプラクティショナーを受けました。
合格したので記事を書いておきます。
少しでも次受ける方の参考になれば幸いです。

## 受験理由
■１ 仕事でAWSを使用しているので、AWSの理解を深めるため
■２ 自分の趣味にAWSを使用するため

## 感想
■１ 仕事で3か月ほどAWSを使用したことがあるのですが、10日ほど勉強すれば受かると思います。
■２ AWSの模擬試験を受けることをお勧めしている方もおりますが、自分は受けなくても問題ありませんでした。ただ、心配な方は受けた方がよいと思われます。
	
## 学習教材
■１ AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー （山下光洋 ＆ 海老原 寛之, 2019, SBクリエイティブ）
・・・これだけで受かるのは難しいですが、基礎となるので読んでおいた方がよいです。
■２ AWSではじめるLinux入門ガイド（山下光洋, 2020, マイナビ出版）
・・・Chapter 10ぐらいまで実際にPC上で実施すれば、AWSのイメージはつくと思います。資格に関わらず、AWSを実際に使って何かしたい初心者の方はこちらを読んだ方がよいです。
■３ AWS認定　クラウドプラクティショナー　模擬問題集（Yoshi Otobe, 2019）
・・・基礎固めにはよいと思いますが、これだけで受かるのは難しいと思います。ただ、通勤時間に手軽に確認できるので、基礎知識の定着用として隙間時間に使っていました。
■４ これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題290問付き）（Udemy）
・・・倍速で聞き流し、通勤時間などに小テストを解きました。
■５ この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）（Udemy）
・・・全部解かなくてよいですが、基礎レベル①、基本レベル②、応用レベル①、応用レベル②を3、4回ほど解き、8～9割ほどとれるようにしておくのがよいです。

## 学習方法
■１ 基本は学習教材5を中心に勉強しました。
・・・1日で学習教材1を読み、2日で学習教材4を終え、残りは学習教材5をやりながら、学習教材2や3を補足的に学習した感じです。試験当日には、学習教材4の小テストと学習教材5の模擬試験をギリギリまで解きました。

## 試験
■１ 日本語が少し変ですが、理解できないレベルではないです。英語の画面も見れるので、気になる方はそちらも見るとよいと思います。試験自体は20-30分ほどで解き終わります。解き終わった後にゆっくりと確認しても30分以上時間があまります。
■2 試験後に合否が出るようですが、自分の時はでませんでした（見落としたのかもしれませんが）。ただ、試験後に認定バッジのメールが来たので、それで合格しているかどうか試験日にわかりました。

## 反省点
■１ 勉強する時間がなかったので、もう少し勉強する時間を確保しておけばよかったです。精神的にきついので。

## 試験前にやっておいてよかったこと等
■１ 試験日にギリギリまでUdemyの模擬試験と小テストを解いたこと。
React:  useState Warning: A component is changing an uncontrolled input to be controlled. コントロールされたコンポーメントを使う

##問題のコード
reactでサインインフォームを作っている時に発生した警告です。
フォームに入力した段階で発生するようです。

```react:
const = signup = () => {
  const classes = useStyles();
  const[username, setUsername] = useState();

return(
  <form className={classes.root}>
      <TextField 
        value={username}
        onChange={(e) => setUsername(e.target.value)}
        fullWidth label='ユーザー名' 
        variant='outlined' 
      />
  </form>

     );
};
```

####警告された文
>index.js:1 Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info


####結論
######useStateの初期値を設定してなかったため発生した。

・初期値を設定してないステート
中身は空になっている。

```
const[username, setUsername] = useState();
 ```


・初期値を設定したステート
初期値はあるが設定はされていない。

```
const[username, setUsername] = useState('');
 ```

初期値を与えないと値を受け渡したときにreactがusenameの物だと判別しづらいのだと思います。
他にstateが増えて複雑になってくるとエラーになってくるのではないでしょうか。

####参考にした記事

https://qiita.com/FumioNonaka/items/0b4771fdce748e0d67ce
【WordPressのサーバー移設】データベースやファイルの移設作業

レンタルサーバーを移設しました。

なのでWordPressなどの移設作業を行いました。

以下やることリストです。

- 旧サーバー
    - WordPressフォルダをダウンロード
    - データベースのエクスポート
- 新サーバー
    - データベース作成
    - 旧データベース情報を新データベースにインポート
    - WordPressフォルダのアップロード
    - wp-config.phpの書き換え
    - ドメイン登録
    - DNS変更


#旧サーバーでやること

- WordPressフォルダをダウンロード

FTPツールなどを用いてWordPressを設置しているフォルダを丸ごとダウンロードします。


- データベースのエクスポート

WordPressを設置しているフォルダ直下にある「wp-config.php」の中身を見ます。
そこでデータベース名やユーザー名を確認し、サーバーのデータベースにアクセスします(phpMyAdminなどサーバー側が提供してくれているはずです)。
そのデータベースの中身をエクスポートします。

#新サーバーでやること

- データベース作成

適当にデータベースを作成します。
データベース名やユーザー名、パスワード、ホスト名などを忘れないよう注意。

- 旧データベース情報を新データベースにインポート

旧サーバーでエクスポートしたデータベースをインポートするのですが、少し編集を加える必要があります。
データベース名が旧サーバーの名前になっていると思うので、その部分を新サーバーのデータベース名に変更してからインポートします。

- WordPressフォルダのアップロード

FTPツールなどを使ってWordPressフォルダをアップします。

- wp-config.phpの書き換え

アップロードしたフォルダ直下にある「wp-config.php」を少し編集します。
以下の内容を新サーバーのデータベース情報に書き換えます。

``define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
define( 'DB_HOST', 'localhost' );``

- ドメイン登録

新サーバーでドメインの設定を行います。

- DNS変更

以上で移設作業が完了したので、DNSの変更をすれば完了です。
「nuxt.js で4月から小学生の息子用に足し算練習webアプリを半日で作成できるか企画」を参考にWolframAlphaでやってみた。

(オリジナルポスト)
https://qiita.com/kaku3/items/209c22a8638b55d99fc0


##WolframAlphaで
1+x=10

https://ja.wolframalpha.com/input/?i=1%2Bx%3D10

####入力:
1+x=10
####解:
x = 9

#どうして、xなのか教えて下さい。

1+⬜=10

https://ja.wolframalpha.com/input/?i=1%2B⬜%3D10

Wolfram|Alphaは，このクエリが理解できません．

#ついでに


2021-3-18
移動しました。

https://qiita.com/mrrclb48z/items/f92a77a9f1163daa2df5
VirtualBoxで始める会社のインフラ環境1（Active Directory）

本ページはインフラエンジニアとして日々適当に触ってきたActive Directoryや
その他のインフラ環境の理解を、「なんとなく」から「やったことある」にすることを目的とします。
あとは、私のメモ書き。

【読者像】
　・インフラエンジニアとして数年業務経験はあるけど、あんまり真剣に勉強しなかった人
　・コロナで暇人になって特にやることなくて、家にWindows10Proとネット環境ある人

##Lesson1 会社にあるインフラ環境を考えてみよう
まずは、会社のインフラ環境を思い出そう。
どんな小さい会社でも、1～3とハブとルーター、ONUくらいはあるはず。。
1.サーバー（Active Directory,File Server,WSUS）
2.PC　　　（Windows10Pro,Mac）
3.複合機　（今はリコーとかが安いのかな）
4.L2,L3,UTM,ルーター、ONU（この辺はネットワーク勉強してないから知らん）

この記事は1を基本扱うけど、やる気起きたら他もやっていこうかな。。

##Lesson2 ドメイン環境（Active Directoryサーバー）とは
ドメインがいる理由は大体下記
・Windows環境でのユーザーの共有フォルダへのアクセス権の管理
・退職者のアカウント無効化

今流行りのゼロトラストではWEB上で認証して使えるサービスやアクセスできる共有フォルダの権限を
管理するというのもあるけど、それらも基本はActive Directoryみたいにユーザー管理してるから。
なので、とりあえずActive Directoryサーバーを構築する。

##Lesson3 必要なものを用意する。
1.PCにVirtualBoxをダウンロード、インストールする。
(https://sukkiri.jp/technologies/virtualizers/virtualbox/virtualbox-win_install.html)

2.Windows Server 2016評価版をダウンロード、インストールする。
(https://inab818.site/oracle-vm-virtualbox/windows-server-2016-download-install-2/)
(https://inab818.site/oracle-vm-virtualbox/windows-server-2016-download-install-2/)
※ファイルが4GBもあるから、NW環境によってダウンロードだけで結構時間かかってうざい。

とりあえず、ここまでやったら休もー
やる気のある人だけ、次やって。

##Lesson4 構築作業
基本的な作業はネットにいっぱいあるけど、あらかじめ決めておくべきことがある。
それは、ドメイン名とドメイン構造、サイト構造だが、ここでは一番簡単なシングルドメインを構築する。

3.Active Directoryをインストール、設定する。
(https://www.rem-system.com/win2016-adsetup/)
[富士通の指南書](https://www.rem-system.com/win2016-adsetup/)

とりあえず、ここまでやったら構築は終了。
ここからがめんどくさい。。

##Lesson5 構築したドメインにPCをドメイン参加させる
参加させるためにまずは、ドメインサーバーとPCでPing疎通ができるようにする。
簡単にやる方法は、お互い静的IP設定をするのがいいが、DHCP環境の場合は下記に注意する。
・DHCPアドレスプールで払い出されるIPを確認して、静的IPを設定する。
・アドレス予約でIPを固定化する。

※それでもPing疎通できない場合
【PC,サーバー両方にあること】
・ファイアウォールの ICMP ポートが閉じている
　(https://www.atmarkit.co.jp/ait/articles/1712/21/news018.html)

・VirtualBoxのネットワーク設定がブリッジになっていない
　(https://qiita.com/pitao/items/0f9475e4c0e230911eb7)

【サーバーにあること】
・ドメイン名の名前解決を確認する
　nslookup <ドメイン名>
　ドメイン名の IP アドレスの値が表示されている場合は、正常に名前解決が行われている。
　IPが出ない場合は
　・参照先 DNS サーバーの IP アドレスが間違っている
　・参照先の Active Directory ドメインのサービスが停止している（ドメインコントローラー）
　・ファイアウォールの 53 番ポートが閉じている（TCP/UDPの53番ポート）
　　PowerShellでTest-NetConnection [ターゲット] -Port [ポート番号]を行って
　　「TcpTestSucceeded」の値が「True」の場合は、指定したポートでの疎通できている

無事疎通が取れたらあとは作成したドメインに参加させるだけ。
お疲れ様でした。

#追憶
VirtualBOXを利用していて感じたのは画面の余白がありすぎて見にくい。
解決策はゲストOSでの追加のインストールと設定
(https://www.gekkoseisaku.com/blog/web-design/2716/)

多少はCPUやメモリを消費するが、かなり見やすくなるし、どのサイズにしてもリサイズされるのでお勧め。
【Ruby on Rails + PostgreSQL】時刻・日付に関する型のまとめ

# この記事で扱うこと

以下の情報について、覚書としてまとめました。

* migrationファイルで日付・時間に関する型を宣言した際、PostgreSQLデータベース上のテーブルの型は何になっているのか。
* PostgreSQLデータベース上でタイムゾーンはどう扱われるのか。

実行バージョンは、PostgreSQL 10.6 と Ruby on Rails 5.2.4です。

# PostgreSQLに用意されている日付・時刻に関する型

PostgreSQLの[ドキュメント](https://www.postgresql.jp/document/10/html/datatype-datetime.html)には、日付・時刻に関する型は6種類あると記載されています。中でも、

* `timestamp without time zone`
* `timestamp with time zone`
* `date`
* `time with time zone`
* `time without time zone`

の5つがmigrationファイルの型と対応していると想像されます。これら5つとmigrationファイルの型の対応関係をまとめました。

# マイグレーションを実行してみる

以下のmigrationファイルを作成し、`rails db:migrate` を実行します。

```ruby

class CreateSchedules < ActiveRecord::Migration[5.2]
  def change
    create_table :schedules do |t|
      t.date :begin_at_by_date_type
      t.time :begin_at_by_time_type
      t.datetime :begin_at_by_datetime_type
      t.timestamp :begin_at_by_timestamp_type
    end
  end
end
```

この時、PostgreSQLデータベースのテーブルのスキーマは以下です。

```
 begin_at_by_date_type                | date                        | 
 begin_at_by_time_type                | time without time zone      | 
 begin_at_by_datetime_type            | timestamp without time zone | 
 begin_at_by_timestamp_type           | timestamp without time zone | 
```

基本的に、タイムゾーンが付かない型としてスキーマが定義されるようですね。

注意すべきなのは、migrationファイルで `time`、`datetime`、`timestamp` 型を定義した場合にはUTCに変換されて保存される一方、**`date` 型に関してはタイムゾーンの変換が行われず、元のタイムゾーンの日付のまま保存される**という点です。

実際に実行して試してみます。例としてJSTのタイムゾーンを指定しました。

```ruby
Schedule.create(
  begin_at_by_date_type: "2020-01-01 06:00:00+09:00",
  begin_at_by_time_type: "2020-01-01 06:00:00+09:00",
  begin_at_by_datetime_type: "2020-01-01 06:00:00+09:00",
  begin_at_by_timestamp_type: "2020-01-01 06:00:00+09:00"
)
```

これをデータベースでみると、

```
| begin_at_by_date_type | begin_at_by_time_type | begin_at_by_datetime_type  | begin_at_by_timestamp_type 
| 2020-01-01            | 21:00:00              | 2019-12-31 21:00:00        | 2019-12-31 21:00:00        | 
```

となっています。`date` 型の場合のみ、JSTのタイムゾーンの日付が保存されていることがわかりますね。

# タイムゾーンの情報を保持するには

設計の良し悪しについては本記事では言及しませんが、データベースに日時の値を値を保存する際はUTCに統一するケースが多いでしょう。しかし、例外的にタイムゾーンの情報も保持したい場合、次のようなmigrationファイルを作成します。

```ruby
class CreateSchedules < ActiveRecord::Migration[5.2]
  def change
    create_table :schedules do |t|
      t.date :begin_at_by_date_type
      t.time :begin_at_by_time_type
      t.datetime :begin_at_by_datetime_type
      t.timestamp :begin_at_by_timestamp_type
      t.column :begin_at_by_timestamp_with_time_zone, 'timestamp with time zone'
    end
  end
end
```

この時、PostgreSQLデータベースのテーブルのスキーマは以下です。

```
 begin_at_by_date_type                | date                        | 
 begin_at_by_time_type                | time without time zone      | 
 begin_at_by_datetime_type            | timestamp without time zone | 
 begin_at_by_timestamp_type           | timestamp without time zone | 
 begin_at_by_timestamp_with_time_zone | timestamp with time zone    | 
```

これで、タイムゾーン付きで日時のデータを保存することができるようになります。
Qiita童貞がマークダウンを習得するために、初心者用にQiita マークダウン解説記事をつくってみた。


Qiitaで記事を書く練習に
「マークダウンで記事を書く説明をするために必要なマークダウンの記法」を説明します。
いわゆる、アウトプットが究極のインプットというスタイルでQiita初投稿します。

目次
[・ページ内リンク](#ページ内リンクの作成方法)
[・見出し](#見出しの書き方)
[・` の打ち方](#バッククォートの打ち方)
[・太字の書き方](#太字の書き方)
[・リンクの作り方](#リンクの作り方)
[・リンクカードの作り方](#リンクカードの作り方)
[・打ち消し線の作り方](#打ち消し線の作り方)
[・本文のマークダウンの使い方を調べたい時](#マークダウンで本文を見る)

##ページ内リンクの作成方法
説明で使ってしまったので１番はじめに書きます。

```Ruby:ページ内リンク

[見出し文](#見出しの本文全体)

でページ内にリンクがとびます。

#目次で使った例です。↓

[・見出し](#見出しの書き方)
[・`の打ち方](#バッククォートの打ち方)
[・太字の書き方](#太字の書き方)
[・リンクの作り方](#リンクの作り方)
[・リンクカードの作り方](#リンクカードの作り方)
[・打ち消し線の作り方](#打ち消し線の作り方)
```

まず、見出しが書きたいため
①見出しの書き方
とその説明をするために
②コードの挿入
方法を学ぶ必要があると考えました。

##見出しの書き方
```html:見出しの書き方
##見出しの書き方
```

```html:コードの挿入方法
'''指定の言語:タイトル

今回のケースは
```html:コードの挿入方法

``` ←開始する時と閉じる時に```が3つ必要
```

いや、ちょっと待て!!  「`」 がわからん、どこにあんねん!! って方へ

##バッククォートの打ち方

下の画像の、「Shift」 + 「@」を
**同時**に押したらでます。
![IMG_4561.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/76b61427-7e67-9309-b3c9-e93116181df4.jpeg)
![IMG_4560.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/1dcb67db-2d20-9953-e3de-314048866ddb.jpeg)


##太字の書き方

```html:太字の書き方
**同時**
**ドラッグ＆ドロップ**
```
写真は**ドラッグ＆ドロップ**すれば、簡単に張れます。
見出し・コード説明・写真添付・太字ができるようになりました!!
できるようになった、感謝をリンクで伝えたい!

##リンクの作り方

[参考にした記事](https://qiita.com/kamorits/items/6f342da395ad57468ae3)

```html:リンクの作り方
[参考にした記事](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
```

##リンクカードの作り方

リンクカードの方がデザインがキレイです

https://qiita.com/kamorits/items/6f342da395ad57468ae3

```html:リンクカードの作り方
(空行)
https://qiita.com/kamorits/items/6f342da395ad57468ae3
(空行)
```
ついでに打ち消し線がつくりたい


##打ち消し線の作り方
~~にんげんだもの、間違えることもあるさ。by ○○お~~

```html:打ち消し線
~~にんげんだもの、間違えることもあるさ。 by ○○お~~
```

##マークダウンで本文を見る

この記事のこの部分の書き方が知りたい！！
そんな時は、左側のfのマークの下の●●●をクリックすると、なんと
**Markdownで本文を見る**と書いてあります。さらにクリックすると
![スクリーンショット 2021-04-04 18.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/10153d2b-a444-bbc0-6479-60fe267a48a9.png)

下のようにどんな記号を使って記事を書いたか、一目瞭然です。
気になるぜひマネしたい記法があれば、ドンドン吸収してしまいましょう。

![スクリーンショット 2021-04-04 18.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/748e2ce1-d799-309d-def1-aa4e0f5c0f4f.png)


##アウトプットが最大のインプット

わかりやすく、記事にまとめようとする過程で必然的に頭を整理することになるため、
あるテーマについてまとめる記事を書くこと、それ自体がとても勉強になります。

攻撃は最大の防御と同じです。（なんか違う気がするぞ）

　本日はここまで　〜TBD~~

　
注釈の作り方を勉強中
 基本は、マークダウンを書く時は1行改行してください [^1]


 [^1]: マークダウンを書く時は1行改行してください。
PowerShellでのcurlコマンド

Invoke-WebRequestを使う。

```powershell
PS C:\> Invoke-WebRequest https://download.microsoft.com/download/4/9/E/49E54E9B-29E3-4664-927C-CD87E693AD60/IntegrationRuntime_5.4.7732.1.msi -OutFile IntegrationRuntime_5.4.7732.1.msi
```

こちらに詳しく載ってます。

- https://qiita.com/zaki-lknr/items/8950f6acea20961a8afc
USB-SSDの使い道（メモ。WinPEブートも関連）

USB-SSDを買ったのですが、その使い道には少し悩みます。
・普通にデータ用（exfat）
・WindowsPE起動可能＋データ用（NTFS）
・WindowsPE起動可能＋データ用（FAT32）

本当はexfatでブートできればいいのですが、基本的にはできないようです。UEFIによっては可能なのとかあるのかもしれませんが、少なくとも私のマシンではできませんでした。かといってあまりシステム以外をNTFSにしたくもないし、大容量ドライブをFAT32にするのもなんかしっくりきません。
そのほかの解決方法も少し考えてみました。
・先頭のパーティーションをFAT32でブート、2番目をexfatでデータ用。
長所は、容量とフォーマット的にはしっくりくること。短所は、１．作り方。一度FAT32で作って、EaseUSとか何か使ってパーティーションを縮めてもう一つパーティーション作る必要がある。２．ドライブが
二つできてしまうので挿したときに2つ開いてしまう。かといってブート側を非表示にするとブート時にも中を見れない（ブート自体はできる）。
ちなみに、複数パーティーションのUSBメモリを読めるのはWin10の1709以降くらい？ですので注意。USB-HDD/SSDの場合はWin7とかでも読めます。

まぁでも面倒であれば普通にexfatでいいとは思いますけどね。ブートは余ったUSBメモリに任せて。

＜番外＞
殻をむいてsataにして、いまだにHDD搭載しているマシンを換装するという手もあるかと思います。もちろん保証外ですが、使われずに捨てるとかよりはマシなのでは。
PHP: Zoom の token を取得

 次のページを参考にしました。
[JWT With Zoom](https://marketplace.zoom.us/docs/guides/auth/jwt)
[Zoomのアプリケーションの作成](https://1507t.xyz/zoom-app-create)

```php:gen_token.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//	gen_token.php
//
//					Mar/13/2021
//
// ------------------------------------------------------------------
function file_write_proc ($string_out,$file_out)
{
	try
		{
		$fp_out=fopen ($file_out,"w");
		fputs ($fp_out,$string_out);
		fclose ($fp_out);
		}
	catch (Exception $ee)
		{
		print("*** error *** file_write_proc ***\n");
		print('Error:'.$ee->getMessage());
		}
}

// ------------------------------------------------------------------
function urlsafe_base64_encode($str){
	return str_replace(array('+','/','='), array('-','_',''), base64_encode($str));
}

// ------------------------------------------------------------------
$API_Key = '*******';
$API_Secret = '********************************';
$expiration = time() + 3600;

$header = urlsafe_base64_encode('{"alg":"HS256","typ":"JWT"}');
$payload = urlsafe_base64_encode('{"iss":"'.$API_Key.'","exp":'.$expiration.'}');
$signature = urlsafe_base64_encode(hash_hmac('sha256', "$header.$payload", $API_Secret, TRUE));
$token = "$header.$payload.$signature";


$unit_aa = array ();
$unit_aa['token'] = $token;

$str_json = json_encode ($unit_aa);

$file_out = "token.json";
file_write_proc ($str_json,$file_out);

// ------------------------------------------------------------------
?>
```

実行すると次のファイルが作成されます。

```json:token.json
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6I1234567890123****NjE1NjM1NTgxfQ.TjM67nGJrtyHJfuaVIlCTOoo"
}
```

次のようなスクリプトで使えます。

```bash
token=`jq .token token.json | sed 's/"//g'`
http "https://api.zoom.us/v2/users?status=active&page_size=30&page_number=1" \
    "Authorization:Bearer ${token}"
```

関連ページ
[Zoom API の使い方](https://qiita.com/ekzemplaro/items/cd90a928c2b73b3eb1c2)