OmniAICreator/Qiita-1.07M huggingface dataset:
P5.js 日本語リファレンス(sort)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の sort関数を説明します。

## sort() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

sort() は非推奨であり、p5の将来のバージョンで削除される予定です。代わりにarray.sort() を使用してください。

数値の配列を最小から最大にソートするか、単語の配列をアルファベット順に並べます。元の配列は変更されません。並べ替えられた配列が返されます。 countパラメータはソートする要素の数を示します。たとえば、配列に12個の要素があり count が5に設定されている場合、配列の最初の5個の要素のみが並べ替えられます。

### 構文

sort(list, [count])

### パラメタ

- list  
Array：並べ替える配列

- count  
Number：並べ替える要素の数。先頭0から並べ替えます(オプション)

### 戻り値

Array：ソートされたリスト

### 例1

```javascript
function setup()  {
  let numbers = [2, 6, 1, 5, 14, 9, 8, 12];
  print(numbers); // [2, 6, 1, 5, 14, 9, 8, 12]
  let count = 5; // 配列の長さより短い値を指定

  numbers = sort(numbers, count);
  print(numbers); // [1,2,5,6,14,9,8,12]
}
```

### 例2

```javascript
function setup() {
  let words = ['banana',  'apple',  'pear',  'lime'];
  print(words); // ['banana',  'apple',  'pear',  'lime']
  let count = 4; //配列の長さ

  words = sort(words, count);
  print(words); // ['apple',  'banana',  'lime',  'pear']
}
```



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(shuffle)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の shuffle関数を説明します。

## shuffle() 

### 説明文

配列の要素の順序をランダム化します。[Fisher–Yates シャッフルアルゴリズム](http://bost.ocks.org/mike/shuffle/)を実装します。

### 構文

shuffle(array, [bool])

### パラメタ

- array  
Array：シャッフルする配列

- bool  
Boolean：true のとき渡された配列を変更(オプション)

### 戻り値

Array：シャッフルされた配列

### 例1

```javascript
function setup() {
  let regularArr = ['ABC', 123 , 0];

  //デフォルトでは shuffle() はシャッフルされたコピー配列を返します
  let newArr1 = shuffle(regularArr);

  print(regularArr); // シャッフルされていない
  print(newArr1);    // シャッフルされている

  regularArr = ['ABC', 123 , 0];

  //true を指定すると shuffle() は regulatArr を直接シャッフルします
  shuffle(regularArr, true);

  print(regularArr); // シャッフルされている
  
  regularArr = ['ABC', 123 , 0];

  // false を指定すると shuffle() はシャッフルされたコピー配列を返します
  let newArr2 = shuffle(regularArr, false);
  
  print(regularArr); // シャッフルされていない
  print(newArr2);    // シャッフルされている
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/NAF8d-GYV


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
JavaScriptのDOM取り扱い説明書

#このブログを見る前にこちらの記事をみてください
[DOMの正体とは](https://qiita.com/Nyanmaru-12/items/6d7b7e2d048b3a685182)
この知識前提で執筆しています。

# DOMを扱うって何？
DOM＝階層構造という説明をしましたが実はもっと深い役割があります。
この階層構造があるデータのことをDOMツリーと言います。
**そしてJSを使うとこのDOMツリーを操作**することができます。
HTMLの要素名やid,classと言った属性情報を元にDOMツリーの一部を取得し、
CSSを変更したり、要素を増やしたり、削除したりできます。
では実際にwebページを例に具体的に作業していきます。

# 実際にDOMを扱ってみよう
以下、webページです。
<img width="1217" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/765f5b77-67dc-9b9b-47fb-1b91587d159b.png">
検証画面のエレメントのところにDOMツリーが書かれています。
ここから要素を取り出してみようと思います。
取り出す方法は３つほどあります。
**①document.getElementById("id名");**
**②document.getElementsByClassName("class名");**
**③document.querySelector("セレクタ名");**
①はidを持つデータを取得することができます
②はクラスを持つデータを取得することができます。
③は指定したセレクタに合致するもののうち一番最初に見つかった要素を取得することができます。
それぞれみていきましょう。
<img width="472" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/8ce37401-070e-ff9d-5b12-a81b5331cff1.png">
②の方法で取り出してみた結果です
しっかりdivのクラス名を取得できています。
<img width="424" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/585cd788-4ff6-368b-64dd-e4d7a3d09b34.png">
①の方法で取得した結果です。
指定したid名で取得できていることが分かります。
（ちなみに最後に；をつけ忘れたのですがしっかり取得できていました。
ただ、基本的にはつけておくことをお勧めします。）
<img width="364" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/34eaf06c-2714-89aa-14c4-9f6c892c793b.png">
③の方法で取得した結果です。
指定したセレクタ（p）の1番最初のものが取得できていることがわかります。
ちなみに③の方法ではもっと複雑なものでも取得はできます。
<img width="417" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/fc2d8f80-69e2-1c4a-21f8-2ec698257493.png">
このように条件を複数指定して取得することも可能です。

次回はイベントについて書きます。
ubuntu コードネーム

# ubuntu version

ubuntuのリリースは半年に一回のペースで行われている。

このうち、4回のリリースのうちの1回は、長期サポート版として、リリースされている。

これが「LTS」である。



# ubuntu コードネーム

ubuntuのversionには、それぞれ通称がある。



## ubuntu 16.04 LTS (Xenial Xerus)

Xenial Xerus (ズィーニィア ジリス)



おもてなしの、友好的な

アラゲジリス (Xerus rutilus) 

ジリスは、リスの仲間



## ubutnu 18.04 LTS (Bionic Beaver)

Bionic Beaver (バイオニック ビーバー)



生物工学の、サイボーグの

ビーバー



## ubuntu 20.04 LTS (Focal Fossa)

Focal Fossa  (フォーカル フォッサ)



焦点の

フォッサ (マダガスカルに住んでいる)



# os-release

/etc/os-release

でubuntuに関する情報が得られる。

```bash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
P5.js 日本語リファレンス(shorten)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の shoeten関数を説明します。

## shorten() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

shorten() は非推奨であり、p5の将来のバージョンで削除される予定です。代わりにarray.pop() を使用してください。

配列を1要素だけ減らし、短縮された配列を返します。

### 構文

shorten(list)

### パラメタ

- list  
Array：短縮する配列

### 戻り値

Array：短縮された配列

### 例1

```javascript
function setup() {
  let myArray = ['A',  'B',  'C​​'];
  print(myArray); // ['A',  'B',  'C​​']
  newArray = = short(myArray);
  print(myArray); // ['A',  'B',  'C​​']
  print(newArray); // ['A',  'B']
}
```

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(reverse)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の reverse関数を説明します。

## reverse() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

reverse() は非推奨であり、p5の将来のバージョンで削除される予定です。代わりにarray.reverse() を使用してください。

配列の順序を逆にします。

### 構文

reverse(list)

### パラメタ

- list  
Array：反転する配列

### 戻り値

Array：反転した配列

### 例1

```javascript
function setup() {
  let myArray = ['A',  'B',  'C​​'];
  print(myArray); // ['A',  'B',  'C​​']

  reverse(myArray);
  print(myArray); // ['C',  'B',  'A']
}
```


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(concat)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の concat関数を説明します。

## concat() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

concat() は非推奨であり、p5の将来のバージョンで削除される予定です。代わりにarr1.concat(arr2)を使用してください。

引数で指定した2つの配列を連結します。引数で指定した2つの配列は変更しません。

### 構文

concat(a, b)

### パラメタ

- a  
Array：連結する最初の配列

- b  
Array：連結する2番目の配列

### 戻り値

Array：連結配列

### 例1

```javascript
function setup() {
  let arr1 = ['A',  'B',  'C​​'];
  let arr2 = [1, 2, 3];

  print(arr1); // ['A',  'B',  'C​​']
  print(arr2); // [1,2,3]

  let arr3 = concat(arr1, arr2);

  print(arr1); // ['A',  'B',  'C​​']
  print(arr2); // [1, 2, 3]
  print(arr3); // ['A',  'B',  'C​​', 1, 2, 3]
}
```


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(arrayCopy)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の arrayCopy関数を説明します。

## arrayCopy() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

arrayCopy() は非推奨であり, p5の将来のバージョンでは削除される予定です。

配列(または配列の一部)を別の配列にコピーします。 src 配列は、srcPosition で指定された位置から dstPosition で指定された位置まで、dst 配列にコピーされます。コピーする要素の数は長さ length によって決まります。値をコピーするとコピー先配列の既存の値が上書きされることに注意してください。値を上書きするのではなく追加するには concat() を使用します。

引数が2つだけの arrayCopy(src, dst) は、配列全体を同じサイズの別の配列にコピーします。これは arrayCopy(src, 0, dst, 0, src.length) と同等です。

この関数を使用すると for ループを繰り返して各要素を個別にコピーするよりも、配列データをコピーする方がはるかに効率的です。

### 構文

arrayCopy(src, srcPosition, dst, dstPosition, length)

arrayCopy(src, dst, [length])

### パラメタ

‐ src  
配列：コピー元配列

‐ srcPosition  
Number：コピー元配列の開始位置(先頭は 0 です)

‐ dst  
配列：コピー先配列

‐ dstPosition  
Number：コピー先配列の開始位置(先頭は 0 です)

‐ length  
Number：コピーする配列要素の数

### 例1

```javascript
let src = ['A',  'B',  'C​​'];
let dst = [1, 2, 3];
let srcPosition = 1;
let dstPosition = 0;
let leength = 2;

print(src); // ['A',  'B',  'C​​']
print(dst); // [1, 2, 3]

arrayCopy(src, srcPosition, dst, dstPosition, length);
print(dst); // ['B',  'C​​', 3]
```

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
EclipseでPythonを使う環境構築

##はじめに
 あまりEcripceもPythonもいじったことが無かったので、
実際に触ってみた際のメモになります。
特にpipコマンドを打てるするようにするのにつまずいたので、
もし同じようにとりあえず始めてみようって方の参考になれば嬉しいです。


###1.以下サイトからEclipceをダウンロード
https://mergedoc.osdn.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/b690de6b-2ff6-0aa9-1417-63b781c24a96.png)

Ulimateもしくは、pythonを選ぶことで、pythonエンジンも同時にダウンロードされます。


###2.Eclipseを起動して、設定を確認

ウィンドウ⇒設定⇒PyDev⇒インタープリターでパスがあっていることを確認


参考)ここで困ったこと
  pythonがなぜかロケーションのパスが間違えていて、python not found　になってしまったので、
ここで正しくロケーションを指定してあげる必要があります。
pythonが含まれるパッケージでダウンロードした人は、
jre_yyddmm\pleiades\python\の下にあるはずです。
python.exeのある階層を指定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/32c31044-72dc-3e33-f58d-334d045a924d.png)



###3.ライブラリーを追加
ライブラリーを追加する方法として、容量の都合上Anacondaなどを使うわけにはいかなかったので、
pipを使ってライブラリー追加をしたいと思います。

先ほどの設定画面の中央右のほうに、Manage with pip とあるのでそこをクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/ee7a4f5e-ae76-1cad-c800-8c918079f4bf.png)

この画面が出てきます。
ので使いたいパッケージ名を指定しましょう。

###あれ、、、、反応せずにFinishになってしまう。。。。
(ここで躓きました。。キャプチャは取り忘れました。。。)

以下解消法

コマンドプロンプトを起動し、pipをアップグレード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/019e3b39-8777-e3a9-6662-5aad48f0d2e2.png)


環境変数に入ってない方はexeファイルをフルパスで指定することで動かせます。

すると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538303/3ae0d724-1e36-25dc-1031-d9918ab3c9d9.png)
先ほどの画面に、pipが現れました。

この後は、先ほどのManage with pip　を使うことによって
パッケージをインストールすることが出来ます。


###4.Modelの作成
ここからはいろんなサイトに載っているので割愛ですが、
プロジェクトを作成の際にインタープリターを選ぶところがあるので、
先ほど追加したインタープリターと別のpythonを選ばないように注意してください。
P5.js 日本語リファレンス(append)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の append関数を説明します。

## append() 

### 説明文

**<font color="Red">注意： 非推奨</font>**

append() は非推奨であり、p5の将来のバージョンで削除される予定です。代わりに array.push(value) を使用してください。

配列の最後に値を追加します。配列の長さを1だけ拡張します。

### 構文

append(array, value)

### パラメタ

- array  
Array：追加する配列

- value  
Any：配列に追加する値

### 戻り値

配列：追加された配列

### 例

```javascript
function setup()  {
  let myArray = ['Mango', 'Apple', 'Papaya'];
  print(myArray); // ['Mango', 'Apple', 'Papaya']

  append(myArray, 'Peach');
  print(myArray); // ['Mango', 'Apple', 'Papaya', 'Peach']
}
```

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
GSuiteアカウントを利用してSlackにログインしたら

#GSuiteアカウントを利用してSlackにログインする(シングルサインオン）

Slackにシングルサインオンするにはプランにより方法が異なります。
Slackのスタンダードプランの場合、
GsuiteのアカウントでSlackにログインできるのでその時の状況をメモしました。


[G Suite シングルサインオンスラックのヘルプページ](https://slack.com/intl/ja-jp/help/articles/204078066-G-Suite-シングルサインオン)
##前提
①Slackのスタンダードプラン
②Gsuiteはビジネスプラン
③**グーグルはすべてログアウトした状態で作業すること**

## SlackでG Suite Auth を設定する（管理者）
ここは↓の方法でOK
最初は緊張したけれど、あっという間におわりました。
設定を保存を押すと、いつもの見慣れたグーグルのログイン画面が表示され、そこでログインすればOKです。
[G Suite シングルサインオンスラックのヘルプページ](https://slack.com/intl/ja-jp/help/articles/204078066-G-Suite-シングルサインオン)

認証方法がSSOにかわりました
![認証がSSOになった.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/97558895-7264-a7e1-b3c9-f1c11448035a.jpeg)


###ログインしてみた
①ワークスペース入力後画面遷移すると、Googleでサインインの画面が表示されました。
![ワークスペース入力直後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/7a2367d9-a16c-aba1-3672-210aec0a788b.jpeg)

②　Googleでサインインのボタンを押すと、グーグルアカウントを選択する場面がでてきます。
先ほど設定したときのアカウントを選択し、パスワードを入力すると、Slackにログインできます。
![ワークスペース入力直後2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/83f44d67-e8d0-92b3-f85b-9e0004288ba5.jpeg)

## SlackでG Suite Auth を設定する（一般人）
では管理者がGSuiteのシングルサイインオンを設定したら一般人はどうなるのでしょうか

①メールがきました（英語）
差出人は　Slack <no-reply@slack.com>
件名は　[Slack] Single sign-on enabled
本文は
>Single sign-on enabled
Your Workspace Administrator at iwasaki has enabled Single sign-on (SSO for short!) for your workspace.
Authenticate your account

>What does this mean for you?
1. You'll no longer need to remember a separate Slack email address and password to sign in.
2. Now when you sign in to iwasaki, you can do so using your SSO account. 
All you need to do is connect your Slack account to your SSO account. Please do that within 72 hours by clicking this link:ここに認証用リンク 
Thanks,
The team at Slack 

②認証用URLを押してみました
SSOでのサインインを促す画面が表示されました。

![URLクリック直後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/35055c61-e1b9-b346-77a5-caa607e5c5dc.jpeg)

③「googleで認証する」ボタンを押します。
グーグルアカウントを選択する画面が表示されます
![ワークスペース入力直後2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/83f44d67-e8d0-92b3-f85b-9e0004288ba5.jpeg)

ここで正しく入力しくIDとパスワードを入力した場合、めでたくSlackにログインできます。

##誤ってグーグルアカウントを入力したり、選択した場合
例えば　
別の人のメールアドレスを間違えて選択した場合などはアカウントの関連付けを確認するようなメッセージ画面が表示されます。

![間違えた.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/bb1c6b69-72af-ef39-2556-fb7a208d7178.jpeg)

Gsuiteでないグーグルアカウントを選択した場合利用規約が表示され、そのまま進むと新たなSlackユーザーとして登録されていました。
![利用規約.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/00ee649f-a882-66ca-a1fe-f219dd2476eb.jpeg)


###まとめ
①Gsuiteアカウントを利用してSlackにログインする設定自体はかんたん。
ただし、一歩間違うと面倒なことになりそうです。
②手続き前に、Googleからログアウトすることを義務付けること
③自分のGsuiteアカウントが何かを周知すること（通常のグーグルアカウントと混ざってる人はたくさんいそうです）


そうなった場合は
[slackのアカウントの重複を修正する](
https://slack.com/intl/ja-jp/help/articles/360002069588-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E9%87%8D%E8%A4%87%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B)
で修正することになりそうですが、そうならないように
**メール受信→URLで認証は管理者と一緒にするのがよさそうです。きちんとすればあっという間におわるから**
CP2KをWSLでインストールする

WSL（Ubuntu18.04 LTS）を新規に使用し始めてから、CP2Kの最新版（ver. 7.1）を使用できるようになるまでにしたことをメモします。公式のインストール方法（[How to compile the CP2K code](https://www.cp2k.org/howto:compile)）に従って行いました。CP2Kのソースに含まれるtoolchain scriptを利用してほぼ自動でビルドできました。ただ、少しだけエラーなどがあって、うまくビルドできない点があったので、やったことをまとめておくことにしました。

# CP2Kをビルドするために必要なツール類
WSLを使用できるようになったうえで以下のツール類をインストールしました。

+ build-essential (gcc 7.5, make 4.1)
+ gfortran 7.5.0
+ cmake-3.15.1
+ python2.7以上

gccのバージョンについては、[こちらに](https://www.cp2k.org/dev:compiler_support)ビルド成功が確認されたバージョン一覧があります。7.5はOKでした。make, gccについは、build-essentialをインストールすれば一緒にはいります。また、 gfortran, pythonは`apt install`で入手できるもので問題ありませんでした。

cmakeについては、`apt`で入手できるバージョン（3.10.2）では古かったので、ソースからmakeしてインストールしました。

# CP2Kに必要なその他のパッケージ
その他のパッケージとして以下をインストールしました。すべて`apt install`で入手できました。

+ mpich（エラー出るのでopenmpiにした）
+ libopenmpi-dev
+ libopenblas-dev
+ pkg-config

最初mpichをインストールしてCP2Kをビルドしようとしたところ、エラーが出て進めなかったので、openmpiに変更しました。openmpiだと問題なく進みました。

また、toolchainによる自動ビルド中pkg-configのインストールが要求されたので、インストールしました。

openblasはtoolchain中に自動で作成することもできます。ここでは先にパッケージとしてインストールしてしまっていました。

# toolchainによるビルド・インストール
CP2Kのサイトを参考に、toolchainによってCP2Kをビルドしました。

GitHubのリポジトリからソースコードをクローンして入手します。（gitは上記の必要なツール類をインストールすると、すでに入っています。）

```
> git clone --recursive https://github.com/cp2k/cp2k.git cp2k
```
上記で作成したcp2kに移動して、toolchainを実行します。

```
> cd tools/toolchain/
```

スクリプトのオプションを設定しました。基本的に、デフォルトのままでよさそうです。必要そうなオプションはON、パッケージはインストールする設定になっており、スクリプトが自動でソースコードをダウンロードし、buildフォルダ内にライブラリを作成、installフォルダ内にインストールしてくれます。必要ないと思うオプションは`--enable-FEATURE=no`や`--with-PKG=no`でOFFにできます。また、すでにシステムにインストール済みのものを使用する場合は`--with-PKG=system`を設定します。

```
> ./install_cp2k_toolchain.sh --with-libxsmm=install --with-openblas=system \
         --with-reflapack=no --enable-omp
```
以下のパッケージが自動でインストールされました。

+ fftw: FFTW3ライブラリ
+ SpFFT: siriusパッケージで使用されるFFTライブラリ
+ libint: ハイブリッド汎関数の計算に必要
+ libxc: 交換相関汎関数のライブラリ
+ libxsmm: x86_64アーキテクチャの場合使用可能。行列積の計算ライブラリ
+ scalapack: 並列線形代数ライブラリ。並列計算用CP2Kをビルドするには必要。
+ cosma: scalapackの一部を置き換えて高速化するライブラリ
+ gsl: gnu scientific library
+ spglib: 結晶の対称性を扱うライブラリ
+ hdf5: siriusパッケージで使用
+ libvdwxc: Van der Waals力をsiriusで扱うためのライブラリ
+ sirius: 平面波基底で計算するためのライブラリ

最終的に、./archにlocal.ssmpなどのconfigurationファイルが生成します。これらをすべてcp2k/archにコピーします。

```
> cd arch
> cp * ~/cp2k/arch
```

そのうえで、cp2kに移動し、makeします。makeのARCHオプションに作成したlocalを指定し、作成したいバージョンにconfiguration fileの拡張子local.\*\*\*の\*\*\*を指定します。-jオプションで並列ビルドができます。

```
> make -j N ARCH=local VERSION="sopt popt ssmp psmp"
```
configurationファイルに、先程インストールした種々のライブラリに対するリンクに必要な情報もすべて記載されており、Makefileなどを修正する必要はありませんでした。これでcp2k/exe/local/にcp2k.soptなどの実行ファイルができました。

# Regtest
これをテスト（Regtest）します。最初、作成したバージョンすべてを指定して以下のように実行しました。

```
> make -j N test ARCH=local VERSION="sopt popt ssmp psmp"
```

しかし、こうするとテスト中にSegmentation Faultなどのエラーが発生して多くのテストが失敗に終わってしまいました。

```
> make -j N test ARCH=local VERSION="sopt"
```

バージョン一つづつを指定すると、このようなエラーは発生せず、全てのテスト項目がOKとなって完了しました。これでWSL上からCP2Kが利用できるようになりました。
Visual Studio Code で Git Commit 時に Signed-off-by: を commit message に入れるには?

「設定」の「拡張機能」の「Git」で「Always Sign Off」にチェックを入れると良い。

![Screenshot from 2020-05-24 13-26-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19974/d1aabe77-bd30-0d1e-7792-95ada8fafe34.png)
P5.js 日本語リファレンス(p5.NumberDict)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の p5.NumberDict クラスを説明します。

## p5.NumberDict

### 説明文

Numbers の単純な Dictionary クラス。p5.TypedDict を継承・拡張します。

### 構文

new p5.NumberDict() 

### メソッド

- add()  
指定されたキーに現在格納されている値に、指定された数値を追加します。結果は以前にディクショナリに保存された値を置き換えます。

- sub()  
指定されたキーに現在格納されている値から、指定された数値を減算します。結果は差分は以前にディクショナリに格納された値を置き換えます。

- mult()  
指定されたキーに現在格納されている値に、指定された値を掛けます。結果は以前にディクショナリに保管された値を置き換えます。

- div()  
指定されたキーに現在格納されている値に、指定された値で割ります。結果は、商は以前にディクショナリに保存された値を置き換えます。

- minValue()  
辞書に現在格納されている最小の数を返します。

- maxValue()  
辞書に現在保存されている最大の数を返します。

- minKey()  
辞書で現在使用されている最も低いキーを返します。

- maxKey()  
辞書で現在使用されている最も高いキーを返します。

### 例

```javascript
function setup() {

  // キー 100 に 1 を設定して、p5.NumberDict のオブジェクトを生成
  let myDict = createNumberDict(100, 1);
  
  myDict.add(100, 2);  // キー 100 に 2 を加算
  print(myDict.get(100));  // キー 100 の値をコンソールに表示

  myDict.set(101, 4);  // キー 101 に 4 を保存

  print(myDict.maxValue()); // コンソールに最大値である 4 を表示
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/TfeOCKb8m


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Rustまとめメモ(1)

# はじめに
 Rustの基本的な構文とかをまとめる記事が少ないなー（当社比）と感じたのでメモも兼ねてまとめておこうかと
# インストール
<a herf="https://rustup.rs/">rustupのサイト</a>のコマンド打つだけ簡単
(実践Rust入門読む限りwindowsはインストーラがあるらしい）

```bash

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
rustc cargo rustupの3つがインストールされる
#パッケージの作成
 cargoコマンドでパッケージが作られる．

```bash
cargo new pakagename
```

引数に--libを指定するとライブラリが作れるそうな

rustのコードをただコンパイルするだけならrustcコマンドで良い気もする．

```bash

rustc filename.rs
```

#実行
```bash
cargo run
```
ビルドするだけなら

``` bash
crago build
```

#基本的な構文
cargoでパッケージを作った場合，生成されたディレクトリの中のsrcの中にmain.rsがある．
## main関数
いわゆるおまじない．エントリポイントとなる関数

```rust

fn main(){
//コードを記述
}
```

## 標準出力

```rust
println!("Hello, world!");

```
実行結果

```bash
Hello, world!
```

ちなみにこれは関数ではなくマクロ
データを出力する場合は

```rust
println!("Hello, {}!", "SIGMA");
```

実行結果

```bash
Hello, SIGMA!
```

## コメント

```rust
// 一行コメント

/* 複数行の
   コメント */
```

## 変数

```rust
//イミュータブル（不可変)な変数
let hoge = 5;
let pi:f64 = 3.14; //型を明示する場合

//ミュータブル(可変)な変数
let mut fuga; //mutをつける
let mut foo:u32 = 1; //型の明示
```

## 型
文字型   -> char
ブーリアン -> bool
### 整数型

```
(u or i) + ビット長
```

uは符号なし，iは符号付きを意味する．サイズは8, 16, 32, 64, sizeがあり，例えば符号あり32ビット整数型ならi32となる．また，sizeは実行するマシンのポインタのサイズに依存する．これも，符号なしとありでusizeとisizeがある．

### 浮動小数点型
f32 -> 単精度
f64 -> 倍精度
Javaのデータ型（特にプリミティブ型）とリテラルについて

Oracle Java Programmer,Silver SE11認定資格取得に向けて学習を開始しました。
その中で出てきたデータ型に関するまとめを行いたいと思います。
間違っている等、指摘事項あればご教示いただけると幸いです。

#プリミティブ型
|型|分類||
|---------|----------------------|--------------|
|boolean|論理型|True/False|
|char|文字型|16ビットUnicode,¥u0000~¥uFFFF|
|byte|整数型|8ビット整数,-128~127|
|short|整数型|16ビット整数,-32768～32767|
|int|整数型|32ビット整数,-2147483648～2147483647|
|long|整数型|64ビット整数,-9223372036854775808～9223372036854775807|
|float|浮動小数点型|32ビット単精度浮動小数点型|
|float|浮動小数点型|64ビット倍精度浮動小数点型|

#参照型
参照型にはクラス型、インターフェース型、配列型と言ったものがあります。

#プリミティブ型のリテラル
リテラルとは、ソースコードに記述する値の事です。
Javaのリテラルは、デフォルトでは整数はint型、浮動小数点数値はdouble型、真偽値であればboolean型、文字であればchar型です。
##データ型を明示したいとき（整数、浮動小数点数値）
データ型を明示したい時は値の最後につける接尾辞や値の先頭につける接頭辞を使います。

- long型・・・値の後ろにLまたはlをつける。
- float型・・・値の後ろにFまたはfをつける。

型というよりは表記の方法ですが…

- 2進数で記述する・・・値の先頭に0bをつける。
- 8進数で記述する・・・値の先頭に0をつける。
- 16進数で記述する・・・値の先頭に0xをつける。

byte型やshort型にはありません。

##アンダースコア（_）を使った数値表記
Java SE7から導入されたようです。あくまで見やすさ向上のためです。
ただし、

-リテラルの先頭と末尾には記述できない
-記号の前後には記述できない



リテラルの先頭と末尾には記述できない
記号の前後には記述できない

具体例

```Java:Main.java

    double a = 123_4567.89;
    System.out.println(a);
```
とやると、1234567.89と表示されます。3桁区切りでなくても全然オッケーらしいです。

```Java:Main.java

    double a = 123_4567_.89;
    System.out.println(a);
```


とやるとエラーになります。

##文字リテラル
char型は文字1文字を表すデータ型で、'a'のようにシングルクォーテーションで囲わないといけません。
ちなみに文字列は"neko"のようにダブルクォーテーションで囲わないといけません。

Unicodeによる表記では\uの接頭辞の後に16進数4桁で表記します。

```Java:Main.java
    char a = '\u1111';
    System.out.println(a);
```

ᄑ

と出力されました。読めないw

#あれ？そういえばString型は？
java.langパッケージに所属するjava.lang.Stringクラスを使用している形です。
特例としてnew演算子を利用しなくても" "で囲めばStringインスタンスを利用できます。

#参考文献
スッキリわかるJava入門
徹底攻略Java SE11 Silver問題集
【swift 5】 dateFormat の多言語対応

アプリを多言語対応する時に、年月日の表示を国別に変える必要があります。
日本人が使う時は、2020年5月24日
アメリカ人が使う時は、May 24, 2020
と表示させるには以下のようにします。

```swift
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "ydMMM", options: 0, locale: .autoupdatingCurrent)
```
locale: .autoupdatingCurrent とすることでユーザーが選んだ「使用する言語の優先順序」第一位の言語が選択されます。
Visual Studio Code で Git Commit 時に GPG署名するには?

「設定」で拡張機能「Git」の「Enable Commit Signing」にチェックを入れれば良い。
![Screenshot from 2020-05-24 13-10-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19974/d8bee028-e3b6-bdf6-fa10-10f2180af678.png)
拘束条件のある運動方程式を解きたい(伸びないヒモに繋がれた質点の運動)1次元

[物理学の見つけ方 振り子の運動方程式](https://physics-htfi.github.io/classical_mechanics/006.html) の式について、丁寧に見ていきます。

#振り子の1次元とは

伸びないヒモに吊るされた質点に下方向の力だけ加わるという状態。
下方向への運動は無いので、質点の位置$x$は常に$0$という答えがすでにわかっている問題

ここで何が問題かというと、外力が加わった時反発力として内部に残さなければならないが、これが凡人がいくら考えても出てこない。
古代の大天才が見つけ出した素晴らしい方法を知ったのでここに記録として残す。
式の展開は限りなく丁寧にし、変数についてはできるだけ単位をつける。

#式(1) 質点の運動方程式

```math
m \ddot x=f+f^c
```

$m$:質点の質量[kg]
$x$:質点の位置[m]
$\dot x$:質点の位置の時間による1階微分=速度[m/s]
$\ddot x$:質点の位置の時間による2階微分=速度の1階微分=加速度[m/$s^2$]
$f$:外力[N=kg m/s62]
$f^c$:拘束力[N=kg m/s^2] 添字のcはconstraintやと思う、

左辺の$m\ddot x$は物理の教科書の１ページ目に書いてあるニュートンの$F=ma$を意味する。

#式(2) 拘束条件

```math
G(x)= |x|-l=0
```
この式は、$x$と原点との距離は常に$l$ということを示している。

$|x|$はベクトルの場合の絶対値で、2次元の場合は、$\sqrt{x^2+y^2}$を意味する（ヒモの根本は原点とした時）。
3次元の場合は$ \sqrt{x^2+y^2+z^2} $となる。

```math
abs(x)-l=0
```



#式(3) 拘束条件の微分(時間)

```math
\dot G_t=0
```

導出 拘束条件は時間変化することを明記する

```math
G(x(t))= |x(t)|-l=0
```

$\dot G_t$は拘束条件を時間$t$を微分したものを表す。
$l$は時間的に変化しないので、ただの定数なので、微分すると$0$になる。

##拘束条件の1次元verの微分

```math
G(x(t))=|x(t)|-l=x(t)-l=0 \\
\\
\dot G(x(t)) = \dot x(t)-0 =0 \\
\dot G(x(t)) = \dot x(t)=0
```

拘束条件の一階微分の意味する所は、時刻が変化しても速度がゼロなので、運動しないことを示す。


#式(4) 拘束条件その2

```math
\dot G(x) \equiv ( \nabla G)^{\mathrm{T}}\dot x
```

$\nabla$Gとは？ 3次元ver Gをその座標系で微分したもの

```math
\nabla G= \left( 
\begin{array}{ccc}
\frac{\partial G}{\partial x} \\
\frac{\partial G}{\partial y}  \\
\frac{\partial G}{\partial z} \\
\end{array}   \right) \\
  \\

```

今回は1次元なので、

```math
(\nabla \dot  G)^{\mathrm{T}}\dot x = \left( \frac{\partial G}{\partial x} \right)   \dot x =0　\\
```

$\left( \frac{\partial G}{\partial x} \right)$は、拘束条件$G$を$x$で微分するため、時間(t)で微分した式(3)とは異なる。

```math
\left( \frac{\partial G}{\partial x} \right)   \dot x =0
```

それぞれの項をみると、

```math
G\left( x \right)=x-l \\
\left( \frac{\partial G}{\partial x} \right)  =1-0=1 \\
```

というわけで、

```math
(\nabla \dot  G)^{\mathrm{T}}\dot x =1 \times  \dot  x = \dot x = 0
```

なので、動かないってことを表してる。




途中まで書いてて、1次元で動きが拘束されてると、

```math
f_c = f
```
となって、外力が全部拘束力になるだけになった。
Rails API をGKEにデプロイして動作確認する

今回Rails6 APIをGoogle Kubernetes Engineにデプロイしたので手順のみメモ
ちょっとやり方は特殊かもしれません

# 構成 (一部のみ)

```
├── .docker
│   ├── dev
│   │   ├── .bashrc
│   │   ├── Aptfile
│   │   └── Dockerfile
│   └── prod
│        ├── .bashrc
│        ├── Aptfile
│        └── Dockerfile
│   
├── dip.yml
├── docker-compose.development.yml
└── docker-compose.production.yml
```

# 手順
## rails 導入
[Rails 6: Docker/docker-compose/dipで`rails new`力を取り戻す](https://techracho.bpsinc.jp/hachi8833/2020_02_27/88699)を参考にdipを使ってrails new します。

## Dockerfileとdocker-composeの作成
構成に従ってDockerfileとdocker-compose.production.ymlを作成。
今後dev環境は`dip`を、production環境は`docker-compose -f docker-compose.production.yml`を使っています(今後はproduction環境をもっとシンプルなものにしたい)。

## build

```
$ docker-compose -f docker-compose.production.yml build
```

ローカルでの確認

```
$ docker-compose -f docker-compose.production.yml up
```

localhostで確認


## push

```
$ docker-compose -f docker-compose.production.yml push
```
 
## GKEにデプロイ
GCPからKubernetes Engineに移動
5.1 クラスタを作成
5.2 ワークロードからデプロイを選択
5.3 既存のコンテナイメージのイメージパスから「選択」→たった今となっているイメージを選択
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104887/f68ec1d2-6a5d-f4ff-dac9-26132d4e13bf.png)

## 公開
1. デプロイ後のボタンから公開を選択
　すでに同様のimageを公開などして表示されない場合などはServicesのサービスを削除する
2. ポート番号を指定して公開
　例えばポート番号を`3000`に設定している場合は既存の`80→3000`に変更します
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104887/4830c2d1-aedf-c5b3-c0b1-1a9f39845cff.png)

3. エンドポイントを選択かURLにエンドポイントを入力して動作を確認
 Railsの初期画面が表示されます。
　![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104887/0013405b-340d-08e5-e49c-88345c9e3441.png)

以上
Diff＋Historyコマンド＝hifferで快適なターミナル作業しようぜ


まず、こういう記事がありまして。

[テストに対する考え方「Testing Manifesto」を翻訳したので紹介します](https://nihonbuson.hatenadiary.jp/entry/TestingManifesto)

で、モヤっと
「俺らSIerは何で**全部設定してから最後にまとめてテスト**やるんだろう？
途中で設定崩れたり、最後一回きりの確認じゃ見過ごしも起こるよな。
もっと、**テスト駆動**っぽく作業すれば良いのに」

とか思って、

```
シェルをラップして一回設定したら、
その値が崩れないように裏でチェックして
お知らせしてくれるツール作ったら
臨時の手動設定/運用作業がすこぶる捗るな。
```

こういう事をピコーンと思いついてツイートしたわけです。
続いて

```
今度作ってみよう。
```

と書いてしまったのでニーズはわからんが、似たようなもの無いし、有言実行！

### 作ってみた。

## どんなのですかー

シェルをラップして、コマンドを実行したらその出力をハッシュで
記録しHistoryコマンドみたいにリストで持っておきます。
テストは自動的にもう一度実行して差分があれば表示してくれます。

![hiffer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/933817e1-15f5-9a33-c5de-2199378cf2db.gif)

(*Alter Linux*は見栄えが良いですね。)

# だから何に使うんだってばよ

普通にいつもの設定作業して、ちょこまかテスト回して差が出ないかを見れば
テスト回数がリニアに上がって品質爆上げになりますよ！~~(たぶん)~~

![windows.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/0ff1dd69-4857-e2d6-d466-a71d128c742b.png)

Linuxだけじゃなくて、Windows版もクロスプラットフォームであります。[バイナリも作っておきましたので拾ってくださいな](https://github.com/yasutakatou/hiffer/releases)。

![completer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/3fddea85-b5fb-4a3a-655b-e6993708186e.gif)

シェルのラップとして使いものになるようにファイル名の自動補完も付けました。

# どこにあるんだい？

[ここにおいときますんで、詳しくはリポジトリ側を見てくださいな。](https://github.com/yasutakatou/hiffer)

# あとがき

どっかのコミュニティでOSSを見てくれるトコがあったらこれ見てもらいたいので是非教えてもらえると非常に嬉しいです。

### よろしくお願いします！！


あ、テストツールなのになんでテストコード無いって話ですか！？
動かしたいって声一個もらえたらの低モチベーションでして・・

# FYI

[Goで標準出力をキャプチャする](https://journal.lampetty.net/entry/capturing-stdout-in-golang)

[Go言語で文字コード変換](https://qiita.com/uchiko/items/1810ddacd23fd4d3c934)

[A Golang port of the UNIX Less utility](https://github.com/notduncansmith/go-less)
【jQuery】$(this)の挙動がおかしいと思ったら

$(this)の動きが想像と違うと思ったら参考にしてください。

##対象読者
・$(this)、thisが原因で躓いている
・JavaScript(ES6)を利用している
・progateのJavaScript、jQueryを理解している

##問題のあったコード
```javascript
$('.ok').click(()=>{
  const className=$(this).attr('class');
  console.log(className);
});
```
期待した出力結果：ok
実際の出力結果：undifined

##改善したコード
```javascript
$('.ok').click(function(){
  const className=$(this).attr('class');
  console.log(className);
});
```
出力結果：ok

##結論
「アロー関数」ではなく、「関数」を使ったらうまく行きました。
アロー関数と関数の違いは、下の記事が参考になります。
[アロー関数と関数の違いとthisの評価のされ方](https://qiita.com/shoichiimamura/items/aec874fc5cf55cde7fa1)
【Angular】SharedModuleを作る

AngularMaterial使ってると
app.moduleにMaterialのモジュールのimportが沢山あってごちゃごちゃしてくるので
別モジュールに分けて読み込んでapp.moduleをスッキリさせたい

整理する前のapp.module.ts

```typescript
import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";
import { ReactiveFormsModule, FormsModule } from "@angular/forms";
import { AppComponent } from "./app.component";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { MatInputModule } from "@angular/material/input";
import { MatButtonModule } from "@angular/material/button";
import { MatDatepickerModule } from "@angular/material/datepicker";
import { MatNativeDateModule } from "@angular/material/core";

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    ReactiveFormsModule,
    FormsModule,
    BrowserAnimationsModule,
    MatInputModule,
    MatButtonModule,
    MatDatepickerModule,
    MatNativeDateModule,
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

```

コマンドを使ってモジュールを作るよ

```typescript
ng g module shared --module=app
```
--module=appを書くとapp.module.tsにsharedモジュールの設定を勝手に追加してくれる。

```typescript
import { NgModule } from "@angular/core";
import { CommonModule } from "@angular/common";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { BrowserModule } from "@angular/platform-browser";
import { ReactiveFormsModule, FormsModule } from "@angular/forms";

import { MatInputModule } from "@angular/material/input";
import { MatButtonModule } from "@angular/material/button";
import { MatDatepickerModule } from "@angular/material/datepicker";
import { MatNativeDateModule } from "@angular/material/core";

@NgModule({
  declarations: [],
  imports: [],
  exports: [
    BrowserAnimationsModule,
    BrowserModule,
    CommonModule,
    FormsModule,
    MatButtonModule,
    MatDatepickerModule,
    MatInputModule,
    MatNativeDateModule,
    ReactiveFormsModule,
  ],
})
export class SharedModule {}

```
全てのコンポーネントで共通して使いたいモジュールをshared.moduleに書き写します
書き写したものはapp.moduleから削除してOK
ポイントはimportsではなくexportsに書くこと。

整理した後のapp.module

```typescript
import { NgModule } from "@angular/core";
import { AppComponent } from "./app.component";
import { SharedModule } from "./shared/shared.module";
@NgModule({
  declarations: [AppComponent],
  imports: [SharedModule],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}
```

とってもスッキリ。

importとかexportについてはここ
[NgModuleのFAQ](https://angular.jp/guide/ngmodule-faq)
BAT使いのためのPowerShellメモ

PowerShellが強そうなのはわかったがとりあえずBAT使い向けにメモが欲しいと思ったので、主なコマンドを書いてみました。

AliasはBATと同様な表記が可能な場合に○しています。ただしオプション等は異なる場合がほとんどです。

## 早見表

|処理|BAT|Alias|PowerShell|
|----|----|----|----|
|ディレクトリリスト|DIR [path]|○|Get-ChildItem [path]|
|ディレクトリ変更|CD [path]|○|Set-Location [path]|
|ディレクトリ作成|MKDIR [path]||New-Item [path] -itemType Directory|
|ディレクトリ削除|RMDIR [path]|○|Remove-Item [path] |
|ファイルコピー|COPY A.txt B.txt|○|Copy-Item A.txt B.txt|
|ファイル変名|REN A.txt B.txt|○|Rename-Item A.txt B.txt|
|ファイル表示|TYPE A.txt|○|Get-Content A.txt|
|SUBST|SUBST D: [path]||New-PSDrive D filesystem [path]]||メッセージ表示|ECHO HELLO|○|Write-Outut HELLO|
|環境変数設定|SET A=1||$A=1|
|環境変数参照|%A%||$A|
|引数参照|%1||$Args[0]|
|システム日付(8桁)|%DATE:~0,4%(以下略)||(Get-Date).ToString("yyyyMMdd")|
|システム時刻|%TIME%||(Get-Date).ToString("hhmmss")|
|成否確認|%ERRORLEVEL%||$? (True/False)|
|IF|IF %A% EQU "1" THEN ～ ||if ($a -eq "1"){}|
|終了|EXIT 0|○|exit 0|
|ヘルプ|TYPE /?||type -?|

PowerShellの終了コードを確認する場合は$LastExitCode

## 比較演算
||演算子|例|
|----|-----|----|
|ワイルドカード|-like| "adress" -like "adr*"|
|正規表現|-match|"power" -match "po.+"|
|包含|-contains|"shell" -contains "hell"|

否定型は -notlike,-notmatch,-notcontains

## おわり
とにかく多機能、Class定義までできますし。
FOR文はまとめられそうだったら・・・。
開発環境としてはVSCodeがメインになるようですね。
Dockerのインストールでつまずいたのでメモ

暇だったのでDockerでも構築してみるか～
と軽い気持ちでやったら初手インストールでつまずいたのでメモ

【環境】
Windows10 HOME

#経緯（基本Twitterで上げたもののコピペ）
Docker Desktop Installer.exeをPCへダウンロード
https://www.docker.com/get-started
↓
ダウンロードしたDocker Desktop Installer.exeを実行。
↓
インストール失敗。
OSのバージョンを上げろ、と言われる
↓
OSを最新の状態にする
↓
再度、実行。
↓
バージョンを上げろと言われる
（確かにDockerのエラーメッセージ内のビルド番号がPCのビルド番号より上である。。。
でもOSは最新の状態だし・・・）
↓
解決策をググる
↓
どうやらDocker Toolboxなるものを使ってDocker環境構築できる記事を見つける（光が見える）
↓
Docker Toolboxでの構築法をググる
↓
現在、Docker Toolboxはダウンロードできないという記事を見つける（希望が途絶え暗闇にぶっこまれる）
↓
根本に立ち返る
↓
最新の状態にしたPC以上のビルド番号を求めてくるということは自身のOSは最新に見えて、実は最新じゃない！？と仮定を建てる
↓
調べていくとどうやらWindows Insider Programに登録すれば一般公開前の最新ビルドをインストールできるらしい
↓
Windows Insider Programに登録
↓
設定の「システム」から最新のバージョンがないか検索をかけてみると見事にヒット！！
↓
アップグレードして、ビルド番号がDockerが求めているもの以上である事を確認
↓
Docker Desktop Installerを再度実行、無事インストール完了

##参考にした記事
https://po-what.com/docker-install-for-win10#i-3

#補足
・Docker Toolboxについて
公式見たけど、普通にインストールできるっぽい。ただし、Docker Toolboxはレガシーであり、システム要件を満たせない古いMacやWindowsシステム向けとのこと

【補足２】
Windows Insider Programについて
Windows 10 の次のレベルアップを目指すプログラム。
参加すればいろいろ特典があるらしい
https://insider.windows.com/ja-jp/about-windows-insider-program/
[VRChat][cluster] VRChatワールドからclusterにワールドを変換してアップロード

VRChatワールドをclusterに上げた話。

# 対象者
- VRChatでのワールド作成経験者

# 事前準備
- VRChatワールド
- UnityHubで2019.2.21fをインストール
  - 以下のモジュールも加える
  - Android Build Support
  - iOS Build Support
  - Mac Build Support
  - Windows Build Support
  - モジュールに漏れがあると「なぜかアップロードFailになる」事象が起こる
- Creator Kitをダウンロードし、Creator Kitのインポートと、レンダー設定を変更
  - https://clustervr.gitbook.io/creatorkit/installation/install-creatorkit

# 手順
- VRChatのUnityプロジェクトフォルダをコピーしリネーム
- そのリネームしたフォルダ内のAssetsフォルダの下の「VRCSDK」のフォルダ、「Library」フォルダを削除する
- UnityHubから「2019.2.21f（clusterで使えるバージョン）」で開く
- clusterで必要な最低限の設定を入れる
  - Despawn Height: この高さよりも下に落ちたらRespawnする高さの設定
  - Spawn Point: VRChatのSpawn場所相当（Entrance）
  - Main Camera: 消す
- メニューの「cluster」⇒「ワールドアップロード」からワールドをアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93702/93959b67-ac06-0c01-41e2-78d78ee9fa60.png)
  - 「新規作成」
  - 「NewVenue」のタブが下にできるのでそれを選択し「画像の選択」からワールドのイメージ画像を設定し、「ワールド名」を入力し、アップロードする
    - ★ここでエラーがあれば修正を求められるので修正する
  - アップロードに成功すると、画像の通りSuccessが並ぶ
    - ★なぞのFailの場合、いわゆるUnityの機嫌が悪い状態なので、Unityのエラーメッセージなどを参照がんばって対応するしかない…
  - なおこの段階ではワールドは公開されない、Webの管理画面から「公開する」を選択して初めて誰でも入場可能な状態になる

# コンバートしたワールド
- VRChat
  - https://www.vrchat.com/home/launch?worldId=wrld_9eb8bf71-ed53-455f-ad2d-f495a4feb265
- cluster
  - https://cluster.mu/w/ff4be0a6-eb4e-4fe3-bd01-db0a2fa2ffec

# ちなみに以下のワールドでもConvert成功(2020.9)
- オリジナル= NeosVRで作成
- NeosVRからexportしたデータをVRChatへ移植
- VRChatへ移植したものをclusterへ移植（ここでこの記事の内容を活用）
  - https://cluster.mu/w/d1c042a8-b48a-41b8-9271-033b798168a8

# その他
- 30MB程度のワールドでもうちのPCだとビルドに30分くらいかかります
- VRChatでそこそこ複雑な仕組みにしているとうまくアップロードできないようです
P5.js 日本語リファレンス(p5.TypedDict)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の p5.TypedDict クラスを説明します。

## p5.TypedDict

### 説明文

すべての p5.Dictionary タイプの基底クラス。具体的に型指定された Dictionary クラスは、このクラスを継承します。

### 構文

new p5.TypedDict() 

### メソッド

- size  
辞書に現在保存されているキーと値のペアの数を返します。

- hasKey()  
指定したキーがディクショナリに存在する場合はtrueを返し、それ以外の場合はfalseを返します。

- get()  
指定されたキーに格納されている値を返します。

- set()  
指定されたキーに関連付けられている値が辞書にすでに存在する場合はその値を更新します。それ以外の場合は、新しいキーと値のペアが追加されます。

- create()  
辞書に新しいキーと値のペアを作成します。

- clear()  
以前に保存されたすべてのキーと値のペアをディクショナリから削除します。

- remove()  
指定されたキーに格納されているキーと値のペアをディクショナリから削除します。

- print()  
辞書に現在保存されているアイテムのセットをコンソールに記録します。

- saveTable()  
辞書をローカルダウンロード用のCSVファイルに変換します。

- saveJSON()  
辞書をローカルダウンロード用のJSONファイルに変換します。

### 例

```javascript
function setup() {

  // キー 100 に 1 を設定して、p5.NumberDict のオブジェクトを生成
  let myDict = createNumberDict(100, 1);
//  let myDict = createStringDict("100", "1");
  
  // キー 100 と値 1 はクリアする
  myDict.clear();
  myDict.set("101", 2);  // キー 101 に 2 を保存
  myDict.set("102", 4);  // キー 102 に 4 を保存

  myDict.print(); // すべてのキーと値を表示する
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/jTIAiCdvh


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
絶対配置で中央寄せにする方法

絶対配置の場合、margin 0 auto では、中央揃えにならないので、
どうすれば良いか、試行錯誤していたら、やっと中央揃えができたので、
備忘録として、記録しておく。

```haml
  <section class="modal"></section>

```

```CSS
.modal {
 position: absolute;
  top: 40px;
  left: 0;
  right: 0;
  margin: 0 auto;
}

```

left rightとそれぞれ0にする
P5.js 日本語リファレンス(createNumberDict)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) のcreateNumberDict 関数を説明します。

## createNumberDict() 

### 説明文

指定したキーと値のペアまたはオブジェクトを使用して p5.NumberDict の新しいオブジェクトを作成します。

### 構文

createNumberDict(key, value)

createNumberDict(object)

### パラメタ

- key  
Number：キー名

- value  
Number：値

- object  
Object：オブジェクト

### 戻り値

p5.NumberDict：

### 例

```javascript
function setup() {

  // キー 100 に 42 を設定して、p5.NumberDict のオブジェクトを生成
  let myDict = createNumberDict(100, 42);
  
  // .hashkey() を使用してキー 100 の存在を確認します
  // (存在するとき true をコンソールに表示)
  // なお、.hashkey() は p5.TypedDict で定義されています
  print(myDict.hasKey(100));
  
  // キー 100 の値をコンソールに表示
  // .get() は p5.TypedDict で定義されています
  print(myDict.get(100));
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/lgkUkwncf


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
WioTerminalのBCM20とBCM21の定義が間違っている件

# どんな内容か？
WioTerminalのGPIO定義に間違いがあることに気づいた話です。（Arduino IDE環境）
多分、すぐ修正されると思いますがもし同じハマりに遭遇しないために簡単にまとめておきます。
~~※ BCM20, BCM21のvariant.hの定義がまちがっていると思う。~~
<font color="Red">2020/06/14 本件は、Version 1.7.6で修正されていました。</font>

<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/5c64d922-0354-b8a6-e640-50e960762efc.png">

<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/f102b8c8-a05d-04b9-f10a-dc7799029380.png">
※画像は　https://www.seeedstudio.com/Wio-Terminal-p-4509.html

# 現象
下記のようなプログラムをArduino IDEで記述しました。
BCM20を入力端子として利用し、LOの間は、シリアルでONを出力するコードです。

```c 
void setup() {
  pinMode(BCM20, INPUT_PULLUP);  
  Serial.begin(115200);
}

void loop() {
  if ( 0 == digitalRead(BCM20) )
  {
    Serial.println("on");
  }
}
```

そして、GNDとPCM20をショートするが、何も出力されない！

<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/2a810968-b3ba-4211-90f4-b05d740aee07.png">

# 解析結果
WioTerminalのBCM20とBCM21の定義が逆のようです。
具体的には、variant.hに、

```c 
variant.h
#define BCM20 (53ul)
#define BCM21 (54ul)
```

とありますが、同じ端子に割り当てられたI2Sの番号定義は、下記のように定義されていますのでどうやらBCM20とBCM21の番号が逆のようです。

```c 
#define I2S_SDOUT (53ul)
#define I2S_SDIN (54ul)
```
# 対処方法

現時点（2020/05/24）では、BCM20とBCM21の定義は利用せずに、I2S_SDOUT、I2S_SDINを利用していた方が良さそうです。

```c 
void setup() {
  pinMode(I2S_SDIN, INPUT_PULLUP);  
  Serial.begin(115200);
}

void loop() {
  if ( 0 == digitalRead(I2S_SDIN) )
  {
    Serial.println("on");
  }
}
```

# その他

単純な間違いではあるのですが、焦りました。基板を発注した直後でしたので修正依頼のメールを出して、解析作業したらこんな結果でしたのでひとまず安心しました。新しいおもちゃを利用するときは要注意ですね。
attempted relative import beyond top-level packageと怒られたときに解決する方法

## はじめに
Pythonの相対importで今までよく考えずUnitTestで使っていたり，ディレクトリを掘ってわけることを怖がっていたのですが，そろそろ本腰を入れて解決しようと思いいたり，調べたのち解決できたので記録として残しておきます．
 
## attempted relative import beyond top-level packageを再現しよう
以下のようなディレクトリ構成で

```
/package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
```

```moduleZ.py``` が ```moduleX.py``` をimportしているとき，つまり ```moduleZ.py``` ファイル内で

```python
from ..subpackage1 import moduleX
```

と書いて

```bash
$ pwd 
/package
$ cd subpackage2
$ python moduleZ.py
ValueError: attempted relative import beyond top-level package

## or
$ python subpackage2/moduleZ.py
ValueError: attempted relative import beyond top-level package
```

と無事再現できます．

## 解決するためには
[ここの2つのリューション](https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time/14132912#14132912)[1]がとても良い解決策を提示していたので使用しました．
今回は
``` moduleZ.py``` のimportを

```python
from subpackage1 import moduleX
```

と書き換えて

```bash
$ pwd
/package
$ python -m subpackage2.moduleZ
``` 

で解決する方法をとります．
```-m``` はライブラリモジュールとしてpythonスクリプトとして実行します．なので，```/package``` をrootディレクトリ(```__main__```) として```subpackage2/moduleZ.py``` を実行しているため，```subpackage1/moduleX.py``` をimportして実行することができます．

## Pythonのimportに対する考え方
Pythonは[Packageの考え方](https://www.python.org/doc/essays/packages/)[2]は```python ~~~.py```を実行した場所を```root```として認識しroot以下に存在する```~~~.py```をモジュール(```~~~.py```)として認識しています．このrootとして認識される```~~~.py```スクリプトは1つだけです．さらに，```python ~~~.py```とスクリプトを実行するとPythonの[```__main__```がimportの特殊ケース](https://docs.python.org/ja/3/reference/import.html#special-considerations-for-main)[3]によってモジュール名が強制的に```__main__```となります．したがって，どのPythonスクリプトをroot(```__main__```)に実行しているのか実行ディレクトリの場所が大切になります．
今回の失敗例では以下のようにroot(```__main__```)は```moduleZ.py```の場所(今回は```subpackage2```)となってしまいます．

```bash
$ pwd 
/package
$ cd subpackage2
$ python moduleZ.py
## or
python subpackage2/moduleZ.py
```

その結果，相対importで(```subpackage1```)をimportする際，root(```subpackage2```)の上(```/pacakge```)を参照しようとして```ValueError: attempted relative import beyond top-level package```と怒られPythonスクリプトは実行できません．
ちなみに```python```で始まるREPLはカレントディレクトリが```__main__```となってるのでrootディレクトリで実行するとimportができます．
逆にどこかのパッケージ(ディレクトリ)内で実行してしてしまうとimportできない場合があります．

## 最後に
Pythonのimportはわかったようなわからないような不思議な感覚で使っていたので割と整理できて愛着がわきました．身近なものだとPythonのUnitTestで```python -m```を使っている方は多いのではないでしょうか？調べ不足で私の誤認やタイプミスがありましたら，コメントに記載していただけると幸いです．また，この記事でPythonインポート正直理解できないと思われる方はぜひ参考資料も見ていただけると嬉しいです．


## 参考資料

[1] [Relative imports for the billionth time](https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time/14132912#14132912)
[2] [Built-in Package Support in Python 1.5](https://www.python.org/doc/essays/packages/)
[3] [5.8. __main__ に対する特別な考慮](https://docs.python.org/ja/3/reference/import.html#special-considerations-for-main)
[Flutter][Cloud Functions] Cloud Functionsでリージョンを'asia-northeast1'にした時のFlutterでの呼び出し方法

## 記述コード
サンプルに従って以下を記述していたが、Exceptionが発生した。

```dart:
final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
  functionName: 'FUNCTION NAME',
);
dynamic result = await callable.call();
```

## エラー内容
<img width="1080" alt="スクリーンショット 2020-05-24 12.29.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143861/1da08d08-3646-d37b-54e0-3d06b90c90ae.png">

* エラーコード  
 3840
* エラーメッセージ  
 データのフォーマットが正しくないため、読み込めませんでした。

## 解決策
CloudFunctions生成時にregionを指定してあげる

```dart:
CloudFunctions cloudFunctions = CloudFunctions(region: 'asia-northeast1');
HttpsCallable callable = cloudFunctions.getHttpsCallable(functionName: 'FUNCTION NAME');
HttpsCallableResult result = await callable.call();
```
AWS SAA資格取得~ElastiCache編~

##はじめに
ElastiCache個別のまとめになってしまいますが、まとめていきます。
AWSWEB問題集を解いていて、まだまだ理解が足りないリソース、サービスになるので、
理解を深めていきます。

##ElastiCacheとは
キーバリュー型のNoSQLデータベースサービス。
マネージド型のインメモリデータベース（MemcachedやRedisをデータストアとして利用することができる。）
メモリ上で処理を実行するため、高スループットかつ低レイテンシーな処理を実現できる。

※ElastiCacheでは最小の構成単位を「ノード」と呼びます。
EC2で言うところのインスタンスに相当するものです。
ノードを組み合わせた集合体を「クラスター」という。

※スループットとはコンピュータやネットワーク機器が単位時間あたりに処理できるデータ量のこと。
※レイテンシとはデータ転送における指標のひとつで、転送要求を出してから実際にデータが送られてくるまでに生じる、通信の遅延時間のことをいいます。

「EC2」⇨「ElastiCache」⇨「RDS」
①EC2インスタンスからリクエストされたクエリ結果がElastiCacheに存在すれば、
ElasticCaheからEC2インスタンスに結果を返す。
②①に結果が存在しなければRDSに対してクエリを実行し、結果を取得する。

##データストアの特徴と選択基準
####Memcached特徴
・一時的なデータのキャッシュ用として利用
・ノード間の複製は行われない。
・データベースを別途用意

####選択基準
・シンプルなデータ構造が必要
・複数のコアまたはスレッドを持つ大きなノードを実行する必要がある。
・スケールアウトおよびスケールイン機能が必要となる
・データベースなどのオブジェクトをキャッシュする必要がある。



####Redis特徴
・マスター、スレーブ型の構成
・データストアとしても利用可能

####選択基準
・ハッシュ型やリスト型などの複雑なデータ構造を用いる
・マスターノードに障害が発生した際に自動的にフェイルオーバーが行われる必要がある。
・読み取るデータ量が多いので、マスターノードから複数のリードレプリカに複製する。
・永続性が必要


##ElastiCacheのユースケース
一般的にRDBのパフォーマンス向上のために利用される。
RDBでは、データ量の増加や、アクセス集中によりレスポンスが遅くなる可能性があるため、
クエリの結果をElastiCacheに保存しておき、同じクエリが実行された場合はクエリ結果を
ElastiCacheからクエリ結果を返すことでRDBの負荷低減とシステムのレスポンスの向上に繋がる
Webアプリケーションのセッション情報を格納したり、
データベースに対して頻繁にアクセスするSQLを格納したりする。

##以上
よっしゃ地道に頑張るかぁ〜〜〜〜
Oanda API with curl

# アカウント情報の取得
curl -H "Authorization: Bearer ...access token..." https://api-fxtrade.oanda.com/v3/accounts

- api-fxtradeは本番アカウント用、api-fxpracticeはデモアカウント用です。
- 本番アカウントのtokenはpracticeでは使用できませんpracticeで本番用のtokenを使うと下記のようなエラーになります

> {"errorMessage":"Insufficient authorization to perform request."}

参考 [https://stackoverflow.com/questions/41443556/sending-an-order-to-oanda ](https://stackoverflow.com/questions/41443556/sending-an-order-to-oanda)

# to be continued
P5.js 日本語リファレンス(createStringDict)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の createStringDict関数を説明します。

## createStringDict() 

### 説明文

指定したキーと値のペアまたはオブジェクトを使用して p5.StringDict の新しいオブジェクトを作成します。

### 構文

createStringDict(key, value)

createStringDict(object)

### パラメタ

- key  
String：キー名

- value  
String：値

- object  
Object：オブジェクト

### 戻り値

p5.StringDict：

### 例

```javascript
function setup() {

  // キー "val" に "abcde" を設定して、p5.StringrDict のオブジェクトを生成
  let myDict = createStringDict("val", "abcde");

  // .hashkey() を使用してキー "val" の存在を確認します
  // (存在するとき true をコンソールに表示)
  // なお、.hashkey() は p5.TypedDict で定義されています
  print(myDict.hasKey("val"));

  // キー "val" の値をコンソールに表示
  // .get() は p5.TypedDict で定義されています
  print(myDict.get("val"));
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/i6asrBvGe


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Rails Tutorial　第1章やりました

# はじめに

Rails Tutorialを始めましたので、記録として残します。
同じところでつまずかないように、つまずいたところや気が付いたところだけ書くことにします。

前段で、ドットインストールの「Ruby on Rails 5入門」を4月にやりました。その中の後半は動かせても理解できないところがありました。

# 2020/4/27 1.5時間
環境構築でつまずきました。Vagrantを使った環境構築をやってみたのですが、PuttyでSSHできなかったです。証明書がなんたらのエラーで、接続しようとしても切れてしまいました。

なので1.5時間粘って断念。
# 2020/5/1　1時間
ドットインストールで作ったローカル開発環境を使えばいいのではと思い、環境を替えました。

1.3 章でgitを自分が理解していないことから、紹介されていた
Gitの基本
https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E5%9F%BA%E6%9C%AC
を読むことにしました。

# 2020/5/2 　1時間
Gitの基本　読む途中で、ドットインストールのgit入門で「#16マージの衝突を解決してみよう (2)」が以前やったときに未完了だったようなので、やりました。

vimがCentOSにインストールされていなかったのでインストールしました。

```
sudo yum install vim
```

# 2020/5/3 　1.5時間
Gitの基本　2.4まで読みました。

# 2020/5/4 　2時間
Gitの基本　3.3の途中まで読みました。

# 2020/5/5 　2時間
Gitの基本　5.2まで読みました。

# 2020/5/6 　2時間
Gitの基本　6.3まで読みました。
5/7,8は会社なのでこの勉強はお休みです。

# 2020/5/9 　1.5時間
Gitの基本　6.6でGitはいったん完了としました。
Rails Tutorialに戻りました。

1.4.3 Bitbucketにユーザー登録をしました。

公開鍵なるものを初めて作りました。キーフレーズは一般的には「あり」がお勧めのようで迷いました。tutorialの他の方のブログをいくつか見たところ、「なし」がお勧めされていたので、「なし」にしました。

# 2020/5/10  2時間
heroku CLI のインストールでエラーになりました。
tarボールのインストールも試しましたが、エラーで結局断念しました。

ローカル開発環境を諦め、クラウドIDEにすることにしました。

エラーですが、heroku CLIをcentos6にインストール時 GLIBCXX not found のエラーが出て、どうもCentOS7以上でないと難しいみたいです。

自分でググっても全然分からず、Teratailというサイトを見つけ、質問してみたら翌日には回答をいただけました。
https://teratail.com/questions/262016?nli=5ebf7243-0f20-499c-aff7-410a0a28030f#reply-376137

5/11-15は会社なのでこの勉強はお休みです。

# 2020/5/16 3時間
Cloud9にユーザー登録しました。AWSは初めて使うので新鮮です。

時間がかかったのは、無料枠で行けるのかさんざんググったためです。行けると分かり決断してからは、すいすい行きました。

ルートユーザだと問題がありそうな画面が出てくるのですが、他の方のブログで問題ないとのことでルートユーザーのままです。

同様に、サーバの種類はAmazonでなく、「Ubuntu Server 18.04 LTS」を選びました。

# 2020/5/17 2時間
railsのインストールなど、ローカル開発環境でやったことをもう一度Cloud9でやりました。1.3でHello Worldが出るまで、2回目なのですいすい行きました。

5/18-22は会社なのでこの勉強はお休みです。

# 2020/5/23 2時間
前回から一週間空いたため、前回の状態に頭が戻るまで30分くらいかかりました。Cloud9を使うのが初めてだからか、IDEを開けない理由が分からなかったです。AWSをいったんログアウトしてログインし直したらあっさりIDEのボタンが押せるようになりました。

ローカル開発環境でうまくいかなかったHeroku CLIは、一発でインストールできデプロイも迷わずできました。

# 2020/5/24 1時間
演習でソースを修正、gitでコミット、Herokuにpushの一連の流れができました。

演習1-3-1

```ruby:applicationController.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello 
    render html: "こんにちわ"
  end
 
    
  def goodbye
    render html: "さようなら"
  end
end
```

これで無事1章を完了です。

所要時間は22.5時間です。
時間がかかったのは環境作りです。最初からcloud9にしておけばもっと速かったと思います。
小分けで少しずつ進めたので、前回までを思い出すのに時間がかかっているのもあります。