OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptを使って要素を表示、非表示にする方法

##JavaScriptを使って要素を表示、非表示にする方法

###完成形はこちらです
要素を出す前の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726659/d01b8479-7ca4-7d4a-0a8a-bfa569843648.png)


要素を出した後の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726659/20b55fc2-a7fa-bcdd-91a7-aa68dfadf28e.png)

このような実装をできるようにする為に必要なコードです。
2段階に分けて説明していきます。

```html:header.html
<button id="button">表示 非表示ボタン</button>
<input id="input" placeholder="表示させたい要素">
```

```javascript:header-script
$("#input").toggle();

$("#button").click(function() {
	$("#input").toggle();
});

```

#1.表示させたいボタンと要素を作る

・`button`タグを作り、idを指定する(このidはJavaScriptで使うため指定しておく)
・`input`タグで表示させたい要素を作る、これもidを指定しておく
・`placeholder`は文字や数字を表示することができます

```html:header.html
<button id="button">表示 非表示ボタン</button>
<input id="input" placeholder="表示させたい要素">
```
このように作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726659/0b433a84-06e4-e9d8-8ee9-e94e1f357fc8.png)

#2.要素を表示、非表示にするJavaScriptを書く

```javascript:header-script
$("#input").toggle();

$("#button").click(function() {
	$("#input").toggle();
});

```

・`("#input")`ここには表示、非表示にしたい要素を書く
・`("#button")`どこをクリックした時にイベント処理が始まるかを指定する、idを指定したbuttonを指定する
・`toggle`とは要素がついていれば外す、要素が付いていなければ付けてくれる。`toggle`と書くだけで2つのことをしてくれるのでとても便利です。
・`$("#input").toggle();`1行目にこの1行を足すことで最初の表示を非表示にしてくれます

こちらの記述で実装が完成します。
ボタンを押すと表示、非表示にすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726659/4997dcf7-0a0e-891b-053f-2e7089c44b0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726659/ef49a24b-3090-8ae8-b710-02a03286f92e.png)

#まとめ
toggleを使うことでクリックなどの操作によって、`2つの状態を交互に切り替える`ことができるという仕組みなので、皆さんも是非`toggle`を使ってみてください！
最後に、これからも日々のアウトプットとして投稿していきます。
よろしくお願いします。

#参考にした記事
>
https://techacademy.jp/magazine/9540
https://itsakura.com/jquery-toggle
https://qiita.com/sunnyG/items/faf1821ae09820e30ce8
30分で理解！jQueryのtoggle()と3種のメソッド活用術！
https://www.sejuku.net/blog/40705
>
mindの研究 その22

#概要

mindが謎なので調べてみた。
vistaに入れた。
atcoder、やってみた。

#1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めてください。


```
メインとは
　文字列１は　文字列
　合否は　変数
　数１は　変数
　数２は　変数
　数３は　変数
　数４は　変数
　Iは　変数
　Jは　変数
　Kは　変数
　Lは　変数
　Mは　変数
　Mに　０を　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数１と　合否に　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数２と　合否に　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数３と　合否に　入れ
　数１を　回数指定し
　　Iに　回数を　入れ
　　Iを　１０で　割って　Jに　入れ
　　Iを　１０で　割った余りを　Kに　入れ
　　Jに　Kを　加えて　Lに　入れ
　　Lが　数２　以上　かつ　Lが　数３　以下　ならば
　　　Mに　Iを　加え　Mに　入れ
　　つぎに
　繰り返す
　Mを　数値表示する。

```

以上。
ApacheとTomcat

まとめ備忘録


##ApacheとTomcatについて

---

###そもそもTomcatとは？


---

###そもそもApacheとは？

---

###Apache, Tomcatでのシステム構成

---

####Tomcatのみの構成

- Tomcatの役割は「Webサーバ」と「サーブレットコンテナ」。

---

####Apacheと連携した構成

- Apacheの役割は「Webサーバ」
- Tomcatの役割は「サーブレットコンテナ」

---

##まとめ

---

##参考にした記事（いつもありがとうございます。）

[【社内勉強会】ApacheとTomcat(2017/03/09)
](https://qiita.com/yuji38kwmt/items/267d4ce618e80785f03d)

[「Tomcat」と「Apache」の違い
](https://wa3.i-3-i.info/diff184web.html)

[Tomcatとは？使い方を分かりやすく解説！初心者向けのインストール手順も確認。Apacheと連携するメリットも紹介
](https://agency-star.co.jp/column/tomcat)
Rails 土台作り

個人アプリを作成する際に必要なことをプログラミングノートに纏めていたのでQiitaでも投稿してみようと思います。

OS macOS Catalina バージョン 10.15.7

1 ターミナルにて `cd ~/作成したい場所(フォルダ名)`
2`"rails new"`
3 `"rails db:create"`
4 `"rails s"`

今回は省力形を記載致します。

```
ターミナルにて　
貴方のPC名 ~ % cd ~/作成したい場所(フォルダ名)

rails _5.2.3_ new my_first_app -d mysql
※ macOS Catalina のため頭に"$"は不要です。

rails db:create

rails s
```
#解説
"_5.2.3_"これはrailsのバージョンを指定しています。
my_first_app こちらは好きな名前を決めれますが`
単語と単語の間には"_"(アンダーバー）`を入れて下さい。

 "-d mysql" これはmysqlを作成して下さいと命令を出しています。 
mysqlを作成しないとユーザー登録や投稿内容が保存されないので必ず作りましょう。

"rails db:create" こちらがDBにどの様な物を保存ができるかを指定できます。こちらも必ず必要となります。

最後に"rails s" これで自分のローカルホストに反映されるか確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/83454dda-5632-b7b4-2d50-ba61e9290870.png)

反映が完了したら上記の写真が表示されるか確認しましょう。
AWS CodeCommitをCloud9で使用する

AWS Cloud9からCodeCommitを使用する手順を紹介します。
CodeCommitはsshではなくhttps接続を使用します。https接続だと、当然ですが公開鍵の生成、登録が必要ありませんので、設定はその分容易です。
前提条件としてIAMユーザーに「AWSCodeCommitFullAccess」が割り当てられているものとします。

##1. CodeCommit上でリポジトリの作成
・「リポジトリを作成」からリモートリポジトリを作成
・リポジトリ名を指定して「作成」
![rp1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/54b0205e-3384-316e-ee47-fd79b37fadeb.png)
これでAWS CodeCommit上にリポジトリが作成されました。

##2. Git認証情報の作成
・IAM ダッシュボード→ユーザー→該当ユーザーを選択
・認証情報タブの「AWS CodeCommit の HTTPS Git 認証情報」で「認証情報を生成」
　![rp２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/11d58ea8-8759-c462-f772-021e83f0ed41.png)

Git認証用のユーザー名とパスワードを控えておきます。証明書をダウンロードするとこれらの情報が記載されたCSVファイルがダウンロードされます。

##3. Cloud9上での設定
#### 3-1. ローカルリポジトリの作成

```bash
$ git init
Initialized empty Git repository in /home/ec2-user/environment/.git/
```

#### 3-2. ユーザー設定
「USER_NAME」に「ユーザー名」を指定
「USER_EMAIL」に「メールアドレス」を指定

```bash
$ git config --global user.name USER_NAME
$ git config --global user.email USER_EMAIL
```

#### 3-3A. リモートリポジトリの追加
https以下URLはレポジトリの一覧からhttpsのボタンを押すとコピーされます。

```bash
$ git remote add origin https://git-codecommit.us-west-2.amazonaws.com/v1/repos/tst
```

#### 3-3B. クローンを作成を作成する場合
ディレクトリが作成されてクローンが作成されるのでカレントディレクトリに注意

```bash
$ git clone https://git-codecommit.us-west-2.amazonaws.com/v1/repos/tst
Cloning into 'tst'...
warning: You appear to have cloned an empty repository.
```

####3-4A. ステージに追加（ファイル指定）

```bash
$ git add run.py
```

####3-4B. ステージに追加（カレントフォルダ以下すべて）

```bash
$ git add .
```

#### 3-5. Commitからpush

```bash
$ git commit -m "first commit"
[master (root-commit) 877da2a] first commit
 1 file changed, 6 insertions(+)
 create mode 100644 run.py

$ git push origin master
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 322 bytes | 322.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git-codecommit.us-west-2.amazonaws.com/v1/repos/tst
 * [new branch]      master -> master
```
##4. Source Tree の使用
ファイル　→ 新規 → クローンの作成
URLにレポジトリのURL（3-3A）、保存パスの位置、名前を入力します。
IDとパスワードを聞かれますので、Git認証情報(2)で取得したものを設定します。

以上
brew install mtr macOS10.15

##homebrewでmtrを導入したらパスが通っていなかったメモ
結論だけ知りたい方は、まとめ参照

homebrewでmtrをインストール

```
% brew install mtr
|
|
🍺  /usr/local/Cellar/mtr/0.94
mtr requires root privileges so you will need to run `sudo mtr`.
You should be certain that you trust any software you grant root privileges.
```
8.8.8.8に向けてmtrを実行したが、mtrがないらしい

```
% sudo mtr 8.8.8.8
Password:
sudo: mtr: command not found
```
パスを見てみると、**/usr/local/Cellar/mtr/0.94**らしい。

```
~ % brew link mtr
Warning: Already linked: /usr/local/Cellar/mtr/0.94
To relink:
  brew unlink mtr && brew link mtr
```
中身を見てみると、それっぽいのがない

```
% ls /usr/local/Cellar/mtr/0.94
AUTHORS			INSTALL_RECEIPT.json	README.md		sbin
COPYING			NEWS			TODO			share
```

こっちにあった。

```
% ls /usr/local/Cellar/mtr/0.94/sbin
mtr		mtr-packet
```

リンク作成①

```
% ln /usr/local/Cellar/mtr/0.94/sbin/mtr /usr/local/bin/mtr
```

再度実行すると、**mtr-packet**もいるらしい

```
% sudo mtr 8.8.8.8
mtr: Failure to start mtr-packet: Invalid argument
```

リンク作成②

```
% ln /usr/local/Cellar/mtr/0.94/sbin/mtr-packet /usr/local/bin/mtr-packet
```

もっかい実行、動いた

```
                               My traceroute  [v0.94]
xxxxx-MacBook-Pro.local (172.31.xxx.xxx) -> 8.8.8.8        2020-10-15T23:41:13+0900
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                            Packets               Pings
 Host                                     Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 172.31.xxx.xxx                         0.0%     5    1.7   3.3   1.7   9.4   3.4
 2. 10.255.xxx.xxx                         0.0%     5    2.0   3.2   1.9   8.0   2.7
 3. xxxxxxxxxxxxxxx.ppp-bb.dion.ne.jp      0.0%     5    4.2   3.8   3.4   4.2   0.3
 4. xxxxxxxxxxxx.bb.kddi.ne.jp             0.0%     5    6.4   5.5   5.0   6.4   0.5
 5. xxxxxxxxx.bb.kddi.ne.jp                0.0%     5   16.5   8.3   5.1  16.5   4.7
 6. 27.85.xxx.xx                           0.0%     5    9.3   9.8   7.1  17.1   4.2
 7. 27.85.xxx.xx                           0.0%     5    9.7   8.4   6.2  13.3   3.1
 8. 72.14.xxx.xx                           0.0%     5    7.1   9.5   6.2  13.9   3.5
 9. 209.85.xxx.xx                          0.0%     5    5.7   6.4   5.7   7.7   0.8
10. 72.14.xxx.xxx                          0.0%     4    5.9   8.5   5.9  12.9   3.2
11. dns.google                             0.0%     4    6.3   6.7   5.7   8.0   1.0                                                                                                                                       
```

##まとめ

```
% brew install mtr
% ln /usr/local/Cellar/mtr/0.94/sbin/mtr /usr/local/bin/mtr
% ln /usr/local/Cellar/mtr/0.94/sbin/mtr-packet /usr/local/bin/mtr-packet
```

以上
IBMCloud 通信障害時に必要な情報

##小ネタ
自社の環境、社風によってはちょっとした通信断でも上層部へ報告する必要がある。
クラウド環境においては、普段からこういった小さな障害への備えを<font color="red">ユーザ側で</font>しておかなければ、<font color="red">ベンダ側で原因調査ができない。</font>

* クラウド環境においては、単一顧客の障害のみでは詳細な調査をしてくれない可能性が高い
    * 複数の顧客が同一の障害を受けた場合は、クラウド側が原因と考えられるのでより詳細な調査をする


##障害時に提出したい情報
* 関連するノードのリスト(ネットワーク、サーバなど)
    * ノードのソースIPおよびディスティネーションIPの情報
* 通信断、パケットロス、レイテンシの問題などがあったことを証明できる情報(<font color="red">これが大事</font>)
    * 双方向トレースルート情報
    * 双方向iperf情報
    * 双方向MTR情報(<font color="red">オススメ</font>)
        * 可能な限り全システムで取得すると良い。網羅性がないとクラウド側の責任にできない可能性が高い
        * <font color="red">事象発生時に通信断が起きた証明が必要になるので、常時取得すること</font>
        * [How do you collect MTR data?](https://www.ibm.com/support/pages/how-do-you-collect-mtr-data)
        
参考:[MTRの常時取得のススメ](https://qiita.com/yo24/items/f6febc9e84939f8afc2f)
NoCodeツール「Adalo」でリモートワークをサポートするアプリ「Remote Work Supporter」を作った！

以前から興味があったNoCode(ノーコード)での開発をやってみました！
使ったのは「Adalo」、作ったのは「リモートワークで使いたいアプリ」です。

##■作ったアプリ「Remote Work Supporter」
<img width="600" alt="todoリスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/16d3d3f5-4b7e-8ab1-d3cc-46ceb1141b9e.png">

名前の通り、リモートワークで働く人をサポートするアプリ「Remote Work Supporter」を作りました。

QRコードの読み取り、またはURLから操作を試すことができます！

■アプリ
https://previewer.adalo.com/cb794291-7397-49c3-b16b-435f86944ff5
※右上のアイコンからログアウトして下記アカウントでログインするとデータがある状態のユーザーになります。
**[mail: user@1.com / pass: password]**

下記がアプリの機能です。「リモートワークのときにこんなことをしていたなぁ。」ということを思い出しながら機能を考えました。
###【機能一覧】
■Todoリスト
■タイマー&ストップウォッチ
■BGM

#### ■Todoリスト
<img width="400" alt="todoリスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/f0cf2425-daa8-3d22-31c6-b1063c583511.png">

普段のタスク管理をメモ帳でやっていたので「Todoリスト」をメインの機能として作りました。タスクの一覧表示、作成、内容の編集、完了ステータスの変更、完了タスクの一覧表示、削除ができます。

adaloでの初めての開発だったので、使い方の把握などにより少々時間はかかりましたが、1時間くらいでできたと思います。

#### ■カウントダウンタイマー&ストップウォッチ
<img width="400" alt="タイマー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/a8cfec97-810e-2ba5-9413-e81cf99298b5.png">
仕事をするときはダラダラしないように時間を計りながらやっていたのでカウントダウンタイマーとストップウォッチをつけました。カウントダウンタイマーは「45分仕事して15分休憩」を想定し、時間は45分で設定。画面に遷移すると自動的にカウントダウンが動き出すようにしています。ストップウォッチは一般的なストップウォッチです。

カウントダウンタイマーもストップウォッチも既存の部品として用意してあるので、必要なのはカウントダウンの時間設定、位置や大きさの調整くらいです。実装時間としては30分くらいでした。

#### ■BGM
<img width="400" alt="BGM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/af33ee8f-70d3-3dcc-8c44-2b244928a2fa.png">
いつも音楽を流しながらやっているのでアプリでYoutubeが見れるようにしました。BGMリストの表示、BGM登録、アプリ内でYoutube再生ができます。

Youtubeの再生については既存の部品として用意してあるので画面内に配置するだけです。BGMリストの作成、リンクの登録機能は必要ですがTodoリストの機能とそれほど変わりないので、実装時間としては30分くらいです。

## ■Adaloを使ってみた感想
#####1.これで無料なら十分だと思う
基本的に画面内にボタンやテキストなどを配置してクリックしたときのイベントや画面遷移先を設定するだけなので作るのはかなり簡単でした。プログラミングせずにここまでの見た目のものが作れるので、簡単なものであれば十分使い物になると感じました。

#####2.実機で確認できるのも良い
開発途中のアプリはブラウザ上であればすぐに確認ができますし、実機で確認がしたければQRコードを読み込む、もしくはURLへアクセスすれば確認できます。実際にスマホで動かしたときには、こんなに簡単にアプリができるのか！とちょっと感動します。操作感や画面遷移の確認が実際に近い動きで確認でき、かつブラウザ上で修正できるので開発はサクサク進められます。

#####3.機能が増えれば可能性が広がりそう
<img width="600" alt="BGM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/03f9122a-80b3-be33-0f35-8e926fb18385.png">
使用する機能はインストールすることで増やすことができます。公開されているものはMapやQRコード生成、ランダマイザ―がありました。部品は自分で作ることもできるそうです。これらの機能が増えれば開発の幅も広がりますね。

## ■まとめ：個人的に使うアプリであれば無料でも良さそう
無料で使う場合はDBの容量に制限があったり、iosアプリ/Androidアプリとして提供することはできなかったりと、色々と制限があります。なので、一般公開したい場合は有料プランに加入する、という選択肢になると思います。今回は無料の範囲内で作りましたが、外部APIとの連携やストアへの公開などもやってみたいですね。

それでは！

-----------------------------------------
#### アプリについて
<img width="300" alt="todoリスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/16d3d3f5-4b7e-8ab1-d3cc-46ceb1141b9e.png">

アプリ：Remote Work Supporter
URL：https://previewer.adalo.com/cb794291-7397-49c3-b16b-435f86944ff5
※ログインは下記情報で可能です！
mail: user@1.com / pass: password

-----------------------------------------
mindの研究 その21

#概要

mindが謎なので調べてみた。
vistaに入れた。
atcoder、やってみた。

#500円玉、100円玉、50円玉を使ってXX円を支払う方法が何通りあるかを求める。

```
メインとは
　文字列１は　文字列
　合否は　変数
　数１は　変数
　数２は　変数
　数３は　変数
　数４は　変数
　Iは　変数
　Jは　変数
　Kは　変数
　Lは　変数
　Mは　変数
　Mに　０を　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数１と　合否に　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数２と　合否に　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数３と　合否に　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数４と　合否に　入れ
　数４を　５００で　割り　数１に　入れ
　数４を　１００で　割り　数２に　入れ
　数４を　５０で　割り　数３に　入れ
　数１に　１を　加え　数１に　入れ
　数２に　１を　加え　数２に　入れ
　数３に　１を　加え　数３に　入れ
　数１を　回数指定し
　　Iに　回数を　入れ
　　Iから　１を　引き　Iに　入れ
　　数２を　回数指定し
　　　Jに　回数を　入れ
　　　Jから　１を　引き　Jに　入れ
　　　数３を　回数指定し
　　　　Kに　回数を　入れ
　　　　Kから　１を　引き　Kに　入れ
　　　　Iに　５００を　掛けて　Lに　入れ
　　　　Jに　１００を　掛けて　Lを　加えて　Lに　入れ
　　　　Kに　５０を　掛けて　Lを　加えて　Lに　入れ
　　　　もし　Lが　数４に　等しい　ならば
　　　　　Mに　１を　加えて　Mに　入れ
　　　　つぎに
　　　繰り返す
　　繰り返す
　繰り返す
　Mを　数値表示する。

```

以上。
WSL2 + Docker Desktop for WindowsでMySQLコンテナだけ立ち上がらない


# dockerでMySQLだけ立ち上がらなかった

具体的には**WSL2 + Docker Desktop for Windows (+ Docker Compose)** で諸々のコンテナを`docker-compose up -d`で立ち上げようとしたら**MySQLのコンテナ(5.7の最新版)だけ立ち上がらなかった**

```
# docker-compose ps
            Name                           Command               State            Ports
------------------------------------------------------------------------------------------------
test-_back_1        /wait-for-it.sh mysql-db ...   Up       0.0.0.0:8080->8080/tcp
test-_front_1       /bin/sh -c envsubst '$$TES ...   Up       0.0.0.0:3000->80/tcp
test-_mysql-db_1   docker-entrypoint.sh mysqld      Exit 1
```

# logを見てみる

`docker-compose logs -f`でlogを確認

```:log
mysql-db_1  | 2020-10-17 02:54:50+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
mysql-db_1  | 2020-10-17 02:54:50+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql-db_1  | 2020-10-17 02:54:50+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
mysql-db_1  | 2020-10-17 02:54:50+09:00 [Note] [Entrypoint]: Initializing database files
mysql-db_1  | mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
mysql-db_1  | 2020-10-16T17:54:50.236065Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
mysql-db_1  | 2020-10-16T17:54:50.243510Z 0 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql-db_1  | 2020-10-16T17:54:50.984126Z 0 [Warning] InnoDB: New log files created, LSN=****
mysql-db_1  | 2020-10-16T17:54:51.113491Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
mysql-db_1  | 2020-10-16T17:54:51.128211Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ********
mysql-db_1  | 2020-10-16T17:54:51.133628Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
mysql-db_1  | mysqld: Can't change permissions of the file 'ca-key.pem' (Errcode: 1 - Operation not permitted)
mysql-db_1  | 2020-10-16T17:54:51.184562Z 0 [ERROR] Could not set file permission for ca-key.pem
mysql-db_1  | 2020-10-16T17:54:51.184583Z 0 [ERROR] Aborting
mysql-db_1  |
```

と出ていて最終的には

```
mysql-db_1  | 2020-10-16T17:54:51.184562Z 0 [ERROR] Could not set file permission for ca-key.pem
mysql-db_1  | 2020-10-16T17:54:51.184583Z 0 [ERROR] Aborting
```

でこけてる

# 解決方法

ググると以下のIssueが見つかった

- [[WSL2] Permissions problem with mounted windows volume · Issue #4824 · docker/for-win](https://github.com/docker/for-win/issues/4824)


見てると**`mysql:5.7`**から**`mysql:5.7.16`**へ変更すると動くというレスがあったのでバージョンを変更してみたら動くようになりました。
（自分の場合は`docker-compose.yml`にMySQLのバージョンを書いてたのでそこを変更）

# おわり
- マウントする際の権限云々が関係してる？みたいですが自分的にはローカルでとりあえず動けばいいのでこれで良しとしておきます
Rを使って格子モデルを表示する

【目的】
データファイルから行列を読み取り数値に応じて色分けして二次元格子上に表示する

【使用するもの】
R言語（draw_lattice.r）
データファイル（matrix.dat）

``` matrix.dat
0 0 2 0 0 3
1 0 2 0 0 2
0 3 1 2 1 0 
3 0 0 0 1 0
0 0 3 0 1 3
```


これを二次元格子上に
0 は白、1 は緑、2 は青、3 は赤のように表示したいとします。

【手順】

```R:draw_lattice.r
# ======= # Reading a file named "matrix.dat" =======
x <- read.table("matrix.dat")      
# =================================================== 

N <- 5  # Number of rows
M <- 6  # Number of columns

# ======= Plot axes =======
 plot(0:1, type="n",xlab="Column", ylab="Row",axes=F,xlim=c(0,M),ylim=c(N,0))  
 axis(1, pos = 0,label=F)
 axis(2, pos = 0,label=F)
# ==========================

# ======= Paint eash site =======
for (i in 1:N) {            
	for (j in 1:M) { 	
       if(x[i,j]==0){
       	  rect(j-1,i-1,j,i, col=rgb(1,1,1),border=rgb(0,0,0))  # col="white",border="black"
       }else if(x[i,j]==1){
       	  rect(j-1,i-1,j,i, col=rgb(0,1,0),border=rgb(0,0,0))  # col="green",border="black"
       }else if(x[i,j]==2){
       	  rect(j-1,i-1,j,i, col=rgb(0,0,1),border=rgb(0,0,0))  # col="blue",border="black"
	   }else{
       	  rect(j-1,i-1,j,i, col=rgb(1,0,0),border=rgb(0,0,0))  # col="red",border="black"
       }	  
     }
 }           
# ================================

# ====== Generate a pdf file (if you need) ======
dev.copy(pdf, file="lattice.pdf")
 dev.off()  
# =============================================
```

【実行結果】

![lattice.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755359/05ce234c-527d-2d5f-7c04-e66e632252b2.jpeg)

【参考】
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/51.html
N-Prolog コンパイラ最適化

#はじめに
N-Prologはコンパイラも装備しています。当初、最適化を施していないため、インタプリターに比し40%程度の改善しか見られませんでした。一定の決定性かつ末尾再帰の述語につき最適化をいれました。

#例
下記はQueens問題のコードの一部です。クイーンが利き筋にあるかどうか？を判定するものです。これは最適化が可能です。

```prolog

nodiag([], _, _).
nodiag([N|L], B, D) :-
	D =\= N - B,
	D =\= B - N,
	D1 is D + 1,
	nodiag(L, B, D1).


```


#生成するCコード

```c
int b_nodiag(int arglist, int rest);
int b_nodiag(int arglist, int rest){
int n,head,varD1,varN,varL,varB,varD,var2,var1;
n = Jlength(arglist);
if(n == 3){
loop:
Jinc_proof();
var2 = Jmakevariant();
var1 = Jmakevariant();
head = Jwcons(NIL,Jwcons(var2,Jwcons(var1,NIL)));
if(Jcar(arglist) == NIL && 1) return(Junify(arglist,head));
varN = Jcar(Jcar(arglist));
varL = Jcdr(Jcar(arglist));
varB = Jcar(Jcdr(arglist));
varD = Jcar(Jcdr(Jcdr(arglist)));
{if(!Jnot_numeqp(Jderef(varD),Jminus(Jderef(varN),Jderef(varB)))) return(NO);
if(!Jnot_numeqp(Jderef(varD),Jminus(Jderef(varB),Jderef(varN)))) return(NO);
varD1 = Jplus(Jderef(varD),Jmakeint(1));
arglist = Jwcons(varL,Jwcons(varB,Jwcons(varD1,NIL)));
goto loop;
}}return(NO);
}

```

#ベンチマーク
世界最高速級のSWI-Prologと比較しました。9queensを表示なして１６回連続して実行するものです。

![Screenshot at 2020-10-20 12-50-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/6e838cfc-1e13-0f1d-3b12-005f158e2256.png)

![Screenshot at 2020-10-20 12-51-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/22592c29-a35a-dffc-6dc0-5feaaa65ed75.png)

２２％程度遅くなっています。しかし、歴史のあるswiに比較してまあまあ悪くはない速度を出しています。


#さらに
さらに最適化可能なコードの守備範囲を広げていく予定にしています。




#コンパイラのための独自拡張述語

n_clause_with_arity/3　第1項に述語名、第２項に項数を与え、その要件を満たすすべての節、述語を第３項にunifyする。

n_variable_convert/2　第１項に与えられた節に含まれる変数をvar＊形式してリストとして第２項にunifyする。
n_atom_convert/2 第１項に与えられたアトムをC言語の関数名として使えるように変換する。
今のところ：を＿に変更しているだけ。
n_filename/2　第１項で与えられたファイル名から識別子を取り除いたアトムを第２項にunifyする。
n_arity_count/1　第１項で与えられたアトムを述語名とするすべての節、述語の項数をリストにして第２項にunifyする。
n_reconsult_predicate_list/1　reconsult/1で読みこだファイルのすべての述語、節の述語名と項数を　P/Aの形式にしたリストにして第１項へunifyする。

n_reconsult_predicate/1 reconsult/1 で読み込んだファイルのすべての述語名を第1項に
unifyする。バックトラックする。
n_defined_predicate/1 節の定義を述語ならyes、そうでなければno
n_compiler_variable/1　コンパイラで使用する形式の変数ならyes　そうでなければno（例　varX)
n_generate_variable/2　第１項の節に含まれる変数をvarXのような形式でリストとして第２項にunifyする。
n_generate_all_variable/1　第１項で与えられたアトムを述語名とするすべての述語、節で使用されている変数をvar＊の形式でリストとして第２項にunifyする。
n_compiler_anoymous/1　第１項が　var_　のようにコンパイラ内部形式の無名変数である場合にyes　そうでなければno
n_compiler_variable/1　第1項が　varX　のようにコンパイラ内部形式の変数である場合にはyes　そうでなければno
n_argument_list/2 第一引数の述語の項部分をリストに変換して第二引数にunifyする。
n_decompose/3 第一引数をそれがなんであれ、carとcdrに分解し、第二、第三引数にunifyする。
n_property/2 第一引数に応じて第二引数に次のアトムをunifyする。
組込述語＝builtin、ユーザー述語＝predicate、関数＝function、オペレーション＝operation、コンパイル済み述語＝compiled

n_findatom　第一引数のアトムで第二引数の属性をもつものの実アドレスを第3引数にunifyする。
属性は下記の通り。
組込述語＝builtin、ユーザー述語＝predicate、関数＝function、オペレーション＝operation、コンパイル済み述語＝compiled
スマフォでクリックイベント以外で動画を音あり再生させる（ように見せる）方法

# 結論
`playbackRate` を適切に使う

# 前提（および謝罪）
必ずクリックイベントは必要です（オイっ！）。
ただし音声動画を再生させたいタイミングとクリックのタイミングを **多少** ズレすことができます。

# ユースケース
ガチャ的な演出で

1. スタートボタンを押す（ここではまだ音声動画を再生させたくない）
2. Canvasとかでなにかしら演出を描画
3. 最後に音声付き動画で〆る

# 方法
1. videoタグで動画を配置（playsinline属性をつける）
2. `canplaythrough` イベントを購読
3. load関数を発火（preload属性だとiOS系で canplaythrough までいかないため）
4. `canplaythrough` のコールバックが呼ばれたらスタートボタンを表示
5. スタートボタンの `click` イベントが呼ばれたら、そのスタック範囲内で video の `playbackRate` を `0.1` 、 `volume` を `0` に設定し、 play 関数を発火する
6. 演出中
7. 演出が終わったら video の `playbackRate` と `volume` を `1` に戻す

以上で、あたかも演出終了後に音声動画が自動再生したかのように見せられます。

# 注意点
- 用意する動画の頭に `演出時間 × 0.1秒` の余白が必要
    - クリックと同時（演出と同時）に動画の再生自体は始まっているので、例えば演出が10秒ある場合、上記のステップ７で音あり再生が始まるのは動画の1秒目からになります。
- `playbackRate` を 0.1 より小さくするとブラウザによってエラーが起きるので最小値は0.1（だと思う）。
- IE11とかでは `playbackRate` が動きませんが、IE11だったら動画再生がクリックイベントのスタック内である必要はないので「スマフォはplaybackRate、PCは普通に任意のタイミングでplay」とする
rails joinの使い方

#複数個のテーブルを結合する
```ruby
①モデル(単数).joins(:②モデル(複数))

①はUser
②Schedule
```
##前提条件
* Userは、idを持っている
* Scheduleは、user_idを持っている

#joinは、共通項で結合する
Scheduleのテーブルのuser_idとUserのidが**マッチしているレコードのみ**を取得しています。
結合条件にマッチしないレコードは削除されて１つのテーブルを構成します。

#カラムの取得仕方
```ruby
userのカラムだけ取得
User.joins(:schedules)
```



```ruby
両方のカラムを取得
User.joins(:schedules).select("users.*, schedules.*")
```

##補足
###whereなどのメソッドを使う際
```ruby
where(モデル名(複数形):{カラム:値})
```
Userのモデルか？
あるいは、scheduleのモデルかを指定する必要がある

##注意
selectで取得した値はすべて**文字列**に変更される。
僕の場合は、datetimeが文字列に変更したために、timeメソッドを使えなくなり、time.parseを使用し文字列型からdate型に変更した。

##さいごに
初めての投稿です。分かりづらいところばかりですみませんでした。
少しでも誰かのお役に立てればと思います。
Caddy と nginx の性能軽くしらべてみた


Nginx から Caddy に変更という記事を見つけたので
https://coliss.com/articles/build-websites/operation/work/goodbye-nginx-hello-caddy.html

実際どうなのか軽く(10分程度）調べてみた。。この記事は個人環境で個人メモ用です。

### 環境
- 12 コア OSX
![スクリーンショット 2020-10-20 12.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109145/065904c8-aa82-cc63-7ba3-603dc34a1f62.png)

- Benchmark ツール側 1 コア, 250 コネクション

- index.html 1190 bytes

### caddy (58k / s) - CPU 全コア利用
- version v2.2.1
- `caddy file-server -listen 127.0.0.1:8000 .`

```
Running 10s test @ http://127.0.0.1:8000/
  1 threads and 250 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.65ms    1.29ms  19.97ms   82.94%
    Req/Sec    58.85k     3.32k   69.22k    70.00%
  Latency Distribution
     50%    2.28ms
     75%    2.96ms
     90%    4.34ms
     99%    7.41ms
  587734 requests in 10.05s, 789.75MB read
Requests/sec:  58510.01
Transfer/sec:     78.62MB
```
- Go で書かれたから Go 的な速度です。

### nginx (109k / s) - CPU 全コア利用
- version nginx/1.19.2

```
Running 10s test @ http://127.0.0.1:8000/
  1 threads and 250 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.24ms  216.62us   6.19ms   88.34%
    Req/Sec   110.36k     6.79k  118.28k    89.00%
  Latency Distribution
     50%    2.20ms
     75%    2.29ms
     90%    2.44ms
     99%    3.05ms
  1096858 requests in 10.01s, 1.46GB read
Requests/sec: 109606.61
Transfer/sec:    149.37MB
```

### おまけに自作サーバ (168k / s) - 1コア
```
Running 10s test @ http://127.0.0.1:8000/
  1 threads and 250 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   806.79us  123.52us   2.75ms   92.34%
    Req/Sec   169.68k     7.72k  176.36k    91.00%
  Latency Distribution
     50%  774.00us
     75%  817.00us
     90%    0.90ms
     99%    1.39ms
  1688150 requests in 10.01s, 2.23GB read
Requests/sec: 168675.49
Transfer/sec:    228.10MB
```
- linux なら複数スレッドまたは複数プロセルで動かせば 1M / s 以上でるサーバなので比較対象じゃないが個人用のメモ

### 結論
- Caddy は Go で書かれてるので Go の速度はでる
- Nginx は設定次第でパフォマンスでる
- 自作サーバ最高！
React/Redux初心者が参考にしたい教材集

## はじめに
業務でReact/Reduxを使うことになったものの、キャッチアップコストが高い割りに初心者向けの書籍はあまり世に出てない印象を受けました。
そこで自分が参考にした教材たちを書き残しておきたいと思います。

## 最初の一歩
### progate
安定のprogate先輩。ハマりがちな環境構築もないので、まずはこちらでReactに触れてみるのが良いでしょう。（要課金）
JSに不安のある方は合わせてES2015も合わせてやっておくと吉。
https://prog-8.com/languages/react

### ReactでReduxを使ってみよう Kindle版
Reduxについて初心者向けに1行1行説明してくれておりわかりやすいです。
https://www.amazon.co.jp/dp/B07P7DBLBL/ref=cm_sw_em_r_mt_dp_4nLJFbGJCPMD7

## 慣れてきたら
### 最短で学ぶReactとReduxの基礎から実践まで
ライブラリやAPIを使いながらReact+Reduxで動く物を作れますし、説明もわかりやすいです。ただ、若干古めな教材なので環境構築で少し手こずりました。（JSはほんと移り変わりが早いですね）
https://www.udemy.com/share/101YJ4AEAZdV5TTHkH/

### 【はむ式】フロントエンドエンジニアのための React ・ Redux アプリケーション開発入門
こちらも一通りのものを作れますが、「最短で学ぶReactとReduxの基礎から実践まで」よりはちょっと難しい印象です。
https://www.udemy.com/share/1021hGAEAZdV5TTHkH/
マージ先？マージ元？リベース先？リベース元？

CUIとGUIを併用すると、よく操作を間違えるのでメモ。

## Mergeとは

>〈…を〉〔…に〕溶け込ませる，没入させる; 併合する 〔into〕.
> The companies were all merged into one giant conglomerate. 会社は全部併合されて巨大な複合企業になった.
―― [Weblio辞書](https://ejje.weblio.jp)

「AをBにマージしますか？」
⇒ Aが消えてBが残る。Aがマージする側（**マージ元**）、Bがマージされる側（**マージ先**）。

「現在のブランチに'xxx'をマージしても本当によろしいですか？」
⇒ 'xxx'が消えて現在のブランチが残る。'xxx'が**マージ元**、現在のブランチが**マージ先**。


### Mergeを使って、Featureを取り入れたDevelopをつくる

* Developをメインブランチにして、Featureをマージする
    * 現在のブランチが**マージ先**になる

```sh
% git checkout develop
% git merge feature
```

## Rebaseとは

> 1. 新しいベース［土台・基準レベル］を～に設定する ―― [英辞郎](https://eow.alc.co.jp)

「現在のブランチを'yyy'にリベースしてもよろしいですか？」
⇒ 現在のブランチについて、新しいベースを'yyy'に設定して再構築する

### Rebaseを使って、Developの更新分を組んだFeatureをつくる

* Featureをメインブランチにして、Developでリベースする
    * 現在のブランチが**リベース先**になる

```sh
% git checkout feature
% git rebase develop
```

## 結論
現在のブランチを主役として取り込むイメージ。
GUIツールの文言はしっかり読もう。
dplyr でよく使う表現まとめ

主に自分用のメモです。

### 日付ごとに集計
`lubridate` パッケージを使う

```
 data %>% mutate(date = floor_date(operationdate, "day")) %>% group_by(date)
```

### ログから滞在時間を計算

```
data %>% group_by(userid) %>% 
```

### 条件に合わせて変数を代入

```
mutate(period = if_else(date < date("2020-01-01"), "intervention", "control"))
```

### 日付のゼロ補完

```
nlog_br = nlog_br %>% complete(ds = full_seq(ds, 1)) %>% replace_na(list(y=0))
```

### グループ単位の操作

```
group_by(ssokid) %>% 操作 %>% ungroup(ssokid)
```

### max 

max ではなく pmax を使う

## ggplot 関連

### 特定の期間をハイライトする

```
geom_rect(aes(xmin = ymd(20200302), xmax = ymd(20200415), ymin = 0, ymax = Inf)
```

### x軸を傾ける

```
theme(axis.text.x = element_text(angle = 90, hjust = 1))
```
GitHub for mobileがさらに使いやすく！ Laravel 新メソッド追加！Google Ads API リリース【やっすんのエンジニアニュース 10月3周目】

# はじめに

Hello World!!
Youtuber系エンジニアのやっすんです。

今週もやっすんの独断と偏見で、エンジニア向けニュースをピックアップして紹介していきます！
今回は以下のようなニュースがあります！

- GitHub for mobile アップデート (新機能追加)
- Laravel アップデート (新メソッド追加)
- Google Ads APIリリース
- Nuxt.js バグ修正 (毎週何かしら更新があるみたいですね!)

あと、今回は触れませんが、Webpack 5.0.0もリリースされました！
こちらは別動画・記事にして紹介したいと思います！

[【YouTube動画】 GitHub for mobileがさらに使いやすく！ Laravel 新メソッド追加！Google Ads API リリース](https://youtu.be/W0iWTQB94tg)
[![Collation](https://img.youtube.com/vi/W0iWTQB94tg/0.jpg)](https://www.youtube.com/watch?v=W0iWTQB94tg)

# GitHub for mobileアップデート
GitHub for mobile！ みなさん使ってますか？
GitHubが公式で出すまでは、OpenHubの方を使っていたんですが、GitHub for mobileの方もさくさく動いて大変使いやすいです！

今回のアップデートで、差分のあるファイルを簡単に切り替えできるようになりました！
他にも表示に関する部分 (文字の大きさ変更、行内改行の切り替え) で自由度が上がり、使いやすくなりました。

詳しくは公式ホームページの方で、動画があるので、確認してみてください！
https://github.blog/jp/2020-10-15-even-better-code-review-in-github-for-mobile/

次は定義元にジャンプできる機能や自分のリポジトリを検索できる機能とか実装して欲しいですねー。

# Laravelアップデート
すいません！ Laravel使いじゃないので、詳しくは分かりません！

メール送信の条件分岐 when(), unless()とかデータを一括挿入して更新するupsert()とか面白いですね。
Railsで実装されたら使うかと言われると微妙ですが...。


# Google Ads APIリリース
今までβ版で使われていたものが正式リリースとなりました！
広告代理店が使うサービスで活躍しそうです！




# まとめ
今週のニュースはいかがでしたか？

GitHub for mobileを使うと、外出中でもPRの確認ができるので、便利です！
ぜひ、活用しましょう！！

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
Pythonでメタアナリシス

# はじめに

Pythonには[PythonMeta](https://pypi.org/project/PythonMeta/)というメタ分析を行うパッケージもあるのですが、勉強の意味も兼ねて、今回はpandasでメタアナリシスを実装してみました。

メタアナリシスのモデルには主に **Fixed Effect Model （固定効果モデル）** と **Random Effects Model （変量効果モデル）** の2種類があるので、それぞれ実装してみます。

# サンプルデータ
今回は、以下のデータを使って実験してみます。

```py
import pandas as pd
import numpy as np
data = pd.DataFrame({
    "g": [0.12, 0.23, 0.34, 0.45, 0.42, 0.39, 0.49, 0.65, 0.76, 0.87],
    "V": [0.01, 0.04, 0.03, 0.02, 0.01, 0.02, 0.03, 0.04, 0.02, 0.01]
})
```

ここで g が Hedges'g （＝効果量）、Vが効果量の分散を表しています。

# 固定効果モデル
固定効果モデルではシンプルに効果量の分散の逆数をその項目の重みとします。したがって求める平均効果量はそれぞれの項目の効果量に重みをかけたものを全体の重みで割ったものとして計算されます。計算式は以下の通りです。Pythonでも3行で書けtしまいます。

```py
# 固定効果モデル
data['W'] = 1 / data.V
data['Wg'] = data['g'] * data['W']
result = data['Wg'].sum() / data['W'].sum()
result
>> 0.4776
```

# 変量効果モデル
変量効果モデルでは重みを計算する部分が少し複雑になります。研究間の効果量のばらつきを考慮するために、一旦効果量の平均をとったうえで、それに対する各項目の偏差を重みの計算に組み込みます。計算式は以下の通りです。

```py
g_hat = data.g.mean()
Q = (data.W * (data.g - g_hat)**2).sum()
data['W2'] = data.W ** 2
C = data.W.sum() - (data.W2.sum()/data.W.sum())
d = len(data) - 1
# 研究間分散
if (Q-d) > 0:
    V_between = (Q - d) / C
else:
    V_between = 0
data['V_str'] = data.V + V_between
data['W_str'] = 1 / data.V_str
result = (data.g * data.W_str).sum() / data.W_str.sum()
result
```

# その他
固定効果モデルでも変量効果モデルでも、計算された重みの和から95％信頼区間を計算することができます。

```py
std_err = np.sqrt(1/data.W_str.sum())
lwr = result - 1.96 * std_err
upr = result + 1.96 * std_err
[lwr, upr]
```

# 参考文献
[『メタ分析入門　心理・教育研究の系統的レビューのために』山田剛史・井上俊哉編](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E5%BF%83%E7%90%86%E3%83%BB%E6%95%99%E8%82%B2%E7%A0%94%E7%A9%B6%E3%81%AE%E7%B3%BB%E7%B5%B1%E7%9A%84%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB-%E5%B1%B1%E7%94%B0-%E5%89%9B%E5%8F%B2/dp/4130420720)
Shellscriptを使ってページなどを大量に作成するときcsvから読み込む

# csvファイルの用意
エクセルとかGoogleスプレッドシートとかでクライアントから提出してもらったものや自分でまとめたものをcsvで書き出す。

```
会社概要,company
経営理念,philosophy
沿革,history
そのた,etc
.
.
.

```

# shellscriptの作成
自分のローカル開発環境下ではvccw（古いのですが・・）のwordpressのコアファイル直下にtmpなどのディレクトリを作成しそこへshellscriptを配置。
post typeを変更する場合は"wp post create" のオプションなどを調べると色々指定できるはずです。
https://developer.wordpress.org/cli/commands/post/create/
### 複数指定の場合

```shell
PageSlug=`echo ${line} | cut -d ',' -f 2`
```
の箇所を追加して読み込む列に[+1]する。

```shell


#!/bin/bash
# set -ex
CSV_FILE=title_slug.csv
for line in `cat ${CSV_FILE}`
 do
  PageName=`echo ${line} | cut -d ',' -f 1`
  PageSlug=`echo ${line} | cut -d ',' -f 2`
  PostType=("page") # このpage部分をpostやカスタム投稿に指定
  # echo "${PageName}  ${PageSlug} ${PostType}" # テスト
  vagrant ssh -c "wp post create --post_type=${PostType} --post_author=admin --post_status=publish --post_title=${PageName} --post_name=${PageSlug}"
done
vagrant ssh -c "wp post list --post_type=${PostType}"
```
#shellscriptの実行
csvも同じディレクトリへ配置し実行。

```shell
cd wordpress/tmp #配置したディレクトリへ移動
sh shellscript_filename.sh
```
DockerでRailsの環境構築で出てきたエラーyaml.scanner.ScannerError: while scanning for the next tokenの対処法

Dockerでrails newした際に出てきたエラーです

``` 
yaml.scanner.ScannerError: while scanning for the next token
 ```

docker-compose.ymlファイルではタブを使って改行するとこのエラーが出るみたいです
空白部分をスペースで変えて実行したらできました。
まだ 2>&1 使ってるの? &> を使おう！

# はじめに
友人が使っていたので。
posix準拠で書きます。
# 確認
まず良くやってるであろうリダイレクト

```bash:bash
outtest() {
echo -ne '\e[32mOUT' >&1
echo -ne '\n\e[31mERR' >&2
echo -ne '\n\e[m' >&1
}

outtest > bothout 2>&1
cat bothout
OUT
ERR
```

これは二度手間ですね。
次のように短縮できます。

```bash:bash
outtest &>bothout
# もしくは
outtest >&bothout

## 追記も普通にできる
outtest &>>bothout
# ただしこれは使えない
outtest >>&bothout
```
SPFもDKIMもしっかり設定してるのにウェブサーバーからのメールが届かない！

# 前提
レンタルサーバーは mixhost で、ウェブサーバーとメールサーバーがセットかつ
はじめからDKIMを設定してくれていた。
メールの正規運用は別で管理している（今回はMicrosoft365）。

# 問題
ウェブサイトからお問い合わせがあった際には管理者と問い合わせしてきたユーザーに `noreply@custom-domain.com` という存在しないメアドになりすましてメールを送ります。
このとき、問い合わせてきたユーザーにはしっかりメールが届くのですが管理者 = 同じドメイン（仮に admin@custom-domain.com） にはメールが届きませんでした。
SPFレコードにはしっかりウェブサーバーのIPアドレスを追加し、DKIMもしっかり設定しているし
この手（メール到達率）に厳しいGsuite系にもしっかりメールが届いているのに
なぜか同じドメインには届かない。

# 結論
ウェブサーバーのプログラム上（今回はWordPress）から直接メールを送る場合
デフォルトだとDKIMの署名がされないため、不正規ななりすましメール扱いにされ、到達しなかった。
そこで同サーバー上でメールアカウントを作成、WordPressからのメールをSMTP経由にすることで
送信されるメールにDKIM署名が施され、しっかり届くようになった。

# まとめ
SPFとDKIMが設定してるウェブサーバーから送るメールはすべて無敵（勝手に署名される）！！！と思っていたのが間違いで
認可したサーバーでもDKIM署名したメールとしないメールが送れて、後者では不正規扱いされるということを学びました。
今回は調査・検証できていませんが、WordPress（PHP）上でDKIM署名をすればSMTP経由にする必要もないと思います。

ただ、「DNSでDKIMを設定しているから送信するメールにDKIM署名がないメールは不正規」というのは納得なのですが、それならなぜGsuite系は受信できていたのでしょう。
まだまだ勉強不足です。
[メモ] error: Unexpected console statement (no-console) と言われるとき

Vue.js+Electronでbuildしたときに、console.logで
`error: Unexpected console statement (no-console) at src\components\**.vue`
と叱られるときのメモ。

// eslint-disable-line no-console
をconsole.logの書いてある行に追加すれば解消できる。
ただ、何もしなくてももう一度buildすると問題なく通る。
下のような関数を作って、console.logの代わりに呼んでもよいかもしれない。

```js
function consoleLog(...theArgs) {
  console.log(theArgs); // eslint-disable-line no-console
}
```
もしもコンソールログが配列になるのが気になるなら展開してもよいかもしれない。

```js
function consoleLog(...theArgs) {
  const len = theArgs.length;
  switch (len) {
    case 1:
      console.log(theArgs[0]); // eslint-disable-line no-console
      break;
    case 2:
      console.log(theArgs[0], theArgs[1]); // eslint-disable-line no-console
      break;
    default:
      console.log(theArgs); // eslint-disable-line no-console
      break;
  }
}
```
【Flutter】TextFieldに初期値を設定する

## TextEditingControllerを利用する
TextEditingControllerは、テキスト入力等の様々な制御を行うことができます。
初期値を設定する場合は、initState()で以下の処理を実行するだけです。

```dart
_textEditingController = TextEditingController(text: 'hoge')
```

## サンプルコード

```dart
class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  TextEditingController _textEditingController;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController(text: 'hoge'); // ここに初期値をセットする
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          padding: EdgeInsets.all(12),
          height: 200,
          child: TextField(
            controller: _textEditingController,
          ),
        ),
      ),
    );
  }
}
```

サンプルコードでは`textEditingController`という変数名を付けてますが、対象のTextFieldがわかりやすいように`passwordController`みたいな変数名を付けるのが一般的です。

TextFormFieldには、初期値を設定するための`initialValue`が用意されています。

```dart
TextFormField(
  initialValue: 'hoge',
),
```
macでsshpassをインストールする


個人用メモ

```
# 普通に
brew install sshpass

# ダメでした
# urlから
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
 
#これもダメ

brew install hudochenkov/sshpass/sshpass
# めでたし
```
PowerShell Script　作成日・更新日をそのままにしつつ複数ファイル一括置換

タイトルのまんまです。備忘録。
コマンドで置換するとファイル更新日が更新されるのでそれでは困る人用。

mpword.ps1　を実行すると
↓置換ワードリスト選択(GUI)
↓処理対象フォルダ選択(GUI)
処理終了

#全ソース
```PowerShell:mpword.ps1

# 置換対象リストを基に、作成日・更新日をそのままにしつつ複数ファイル一括置換
# mpword.ps1 -> メイン実行ファイル。セキュリティポリシで実行出来ない場合、
# "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned mpword.ps1" 等として呼び出す
# search_word.csv -> 置換ワードリスト、正規表現使えます。　"検索文字列","置換文字列" 実行時にこのファイル場所を指定する（ヘッダあり） 


# 初期化
Add-Type -Assembly System.Windows.Forms
[string]$dir_path = "" 
[string]$file_creationtime = "" 
[string]$file_lastwritetime = "" 
[string]$searchfile_path = ""
[object]$select = ""
[array]$csv_array = @()
[object]$itemlist = ""

# 置換対象リスト選択
$select = New-Object System.Windows.Forms.OpenFileDialog
$select.Filter = 'CSVファイル(*.csv)|*.csv|全てのファイル(*.*)|*.*'
$select.Title = "置換ワードリストを選択してください"
$select.ShowHelp = $false
if(!$select.ShowDialog() -eq "OK"){ exit }
$searchfile_path = $select.FileName

# CSV読み込み
$csv_array = Import-Csv $searchfile_path -Encoding UTF8

# フォルダ名選択・取得
$shApp = New-Object -com Shell.Application
$dir_path = $shApp.BrowseForFolder(0, "処理対象フォルダを選択してください", 0, ($env:HOMEPATH)).Self.Path
if($dir_path -eq ""){ exit }

$itemlist = Get-ChildItem $dir_path

foreach($item in $itemlist)
{
	# フォルダを除外する
	if(!$item.PSIsContainer)
	{
		# 作成日・更新日取得
		$file_creationtime = (Get-ItemProperty ($dir_path + "\" + $item.Name)).CreationTime
		$file_lastwritetime = (Get-ItemProperty ($dir_path + "\" +  $item.Name)).LastWriteTime
		
		# 置換
		for($i=0; $i -lt $csv_array.length; $i++)
		{
			$data = (Get-Content ($dir_path + "\" + $item.Name)) -replace $csv_array[$i]."検索文字列",$csv_array[$i]."置換文字列"
			$data | Out-File ($dir_path + "\" + $item.Name)
		}

		# 作成日・更新日設定
		Set-ItemProperty ($dir_path + "\" + $item.Name) -name CreationTime -value $file_creationtime
		Set-ItemProperty ($dir_path + "\" + $item.Name) -name LastWriteTime -value $file_lastwritetime
		Write-Host($item.Name + " -> 置換完了")
	}
}

Read-Host "処理完了" 
```



```CSV:replace_word.csv
"検索文字列","置換文字列"
"\d{4}/\d{2}/\d{2},\d{2}:\d{2}:\d{2},.*,",""
```
※↑使用例。ファイル名は起動時指定するのでなんでも良いけどヘッダ名は指定してます。UTF-8推奨



PowerShell便利なんだけど -v みたいな詳細表示オプション欲しい
PHPからPDOを使ってSQLServerのストアドプロシージャを呼び出す際にOUTPUTが効かなくなる現象への対応

ドはまりしてしまったので、後学のためにメモを残します。

# 事象
次のようなスクリプトで、データ投入用のテーブルおよびプロシージャを作成します。

```sql
-- データ投入用のテーブル作成
create table test_table (
  col1 varchar(50),
  col2 int,
);

-- プロシージャ作成
create procedure sample
  @in varchar(50),
  @out int OUTPUT
as
  set @out = 567;
  insert into test_table values (@in, @out);
;
```

PDOから次のようなスクリプトでプロシージャを実行します。

```php
$pdo = new PDO($dsn, $username, $password);
$stmt = $pdo->prepare('{CALL sample (?, ?)}'); // 'EXEC sample ?, ?'でもOK
$in = 'xyz';
$stmt->bindParam(1, $in, PDO::PARAM_STR);
$stmt->bindParam(2, $out, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->execute();
echo $out;
```

プロシージャ内で`set @out = 567`と記述したので$outには567が設定されており、結果として`567`が出力される想定でしたが、結果が異なりました。

プロシージャがうまく動いているかどうか確認するため、作成したテーブルに格納されたデータを取得したところ、想定通りのデータが入っており、特に問題なさそうでした。

```sql
select * from test_table; -- 「'xyz', 567」が取得できる
```

ここで、**プロシージャ内のinsert文をコメントアウトしたところ、想定通りのOUTPUT変数の使い方が出来ました。**

```sql
-- プロシージャ作成
alter procedure sample
  @in varchar(50),
  @out int OUTPUT
as
  set @out = 567;
  -- insert into test_table values (@in, @out);
;
```

```php
$pdo = new PDO($dsn, $username, $password);
$stmt = $pdo->prepare('{CALL sample (?, ?)}'); // 'EXEC sample ?, ?'でもOK
$in = 'xyz';
$stmt->bindParam(1, $in, PDO::PARAM_STR);
$stmt->bindParam(2, $out, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->execute();
echo $out; //「567」が出力される
```

# 解決策
プロシージャ内で **SET NOCOUNT ON** の記述を入れることで、PHP側の変数に値が入るようになります。

```sql
-- プロシージャ作成
alter procedure sample
  @in varchar(50),
  @out int OUTPUT
as
  set @out = 567
  SET NOCOUNT ON
  insert into test_table values (@in, @out)
;
```

```php
$pdo = new PDO($dsn, $username, $password);
$stmt = $pdo->prepare('{CALL sample (?, ?)}'); // 'EXEC sample ?, ?'でもOK
$in = 'xyz';
$stmt->bindParam(1, $in, PDO::PARAM_STR);
$stmt->bindParam(2, $out, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->execute();
echo $out; //「567」が出力される
```

## SET NOCOUNT ONとは
https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-nocount-transact-sql?view=sql-server-ver15
>Transact-SQL ステートメントまたはストアド プロシージャで処理された行数を示すメッセージが結果セットの一部として返されないようにします。


# 参考
この記事のおかげで助かりました。
https://trentrichardson.com/making-sense-of-stored-procedures-with-php-pdo-and-sqlsrv.html
>You also may notice the empty result set at position 0. This is the insert query (not the first select query as it is simply assigning a value). To suppress these you should use "SET NOCOUNT ON" in your stored procedure. At that point insert, update and deletes will not return these empty sets.
【環境構築】Windows10でHyper-VとVirtualBoxは共存できない

# 目次
・概要
・マシン環境
・共存できないわけ
・Hyper-Vとは
・vagrant環境に戻す方法
・それでもvagrantupができない方

## 概要
以前からDockerに興味があり
これから制作してみようと思っているものをDockerで制作してみたいと思っていたので
DockerをインストールしてみたらVirtualBoxが動かなくなった。

## マシン環境
|||
|:-----------|:------------:|
|CPU|Intel Core i5-2500|
|メモリ|8GB|
|VirtualBox|5.2.6|

## 共存できないわけ
Docker for Windowsを使うためにはHyper-Vを有効化しないといけない。
Hyper-Vが有効だとVirtualboxが使えない。
といった感じでした。
なのでHyper-VとVirtualboxが共存できない == Docker for WindowsとVirtualboxが共存できない
ということになりますね

※以前は共存が不可能でしたがVirtualBox v6からは共存が可能になったらしいです。
ソース：[公式](https://www.virtualbox.org/wiki/Changelog-6.0)
私もversionアップしてやってみます。

## Hyper-Vとは

```
Hyper-V（ハイパーV、はいぱーぶい）は、
マイクロソフトが提供するハイパーバイザベースのx64向け仮想化システムで、
1台のコンピュータ（サーバ）で複数の仮想機械を実現する。
```
と[wiki](https://ja.wikipedia.org/wiki/Hyper-V)から引用いたします。

###切り替え方法
[コントロールパネル]⇒[プログラム]⇒[windowsの機能の有効化または無効化]⇒[Hyper-V]のチェックを外したりつけたり

## vagrant環境に戻す方法
### Dockerのアンインストール
[設定]⇒[アプリ]⇒[アプリと機能]⇒Dockerのアンインストール
### Hyper-Vのチェックを外す
[コントロールパネル]⇒[プログラム]⇒[windowsの機能の有効化または無効化]⇒[Hyper-V]のチェックを外す。

## それでもvagrantupができない方
私はこれだけではできませんでした。
vagrant upをしても3000番のポートが衝突していますとエラーが出てしまい
確認しても3000番のポートは起動していない、、、
ということで下記を実行いたしました。

### 完全シャットダウン
1. 画面左下の [Windows マーク]をクリック
2.[電源マーク]をクリック
3. キーボードのシフトキーを押しながら、[シャットダウン]を選択
Wordpress AMP・RSSの投稿者情報を削除する

製品サイトなどに、投稿者情報としてユーザ名が出るのもなぁと思い調査。
Wordpressではテンプレートとされている各ページ（AMP、RSS）の修正点について、下記に整理する。

* WordPress Version: 5.4.2

## AMPページの投稿者情報を削除する

`wordpress/htdocs/wp-content/plugins/amp/templates/meta-author.php`

* chownで編集可権限にしたあと、下記のように該当部分をコメントアウト

```php:meta-author.php
 <?php /*if ( $post_author ) : ?>
 	<div class="amp-wp-meta amp-wp-byline">
 		<?php if ( function_exists( 'get_avatar_url' ) ) : ?>
 			<amp-img src="<?php echo esc_url( get_avatar_url( $post_author->user_email, [ 'size' => 24 ] ) ); ?>" alt="<?php echo esc_attr( $post_author->display_name ); ?>" width="24" height="24" layout="fixed"></amp-img>
 		<?php endif; ?>
 		<span class="amp-wp-author author vcard"><?php echo esc_html( $post_author->display_name ); ?></span>
 	</div>
 <?php endif;*/ ?>
```

* [参考](https://blog.bnikka.com/server/amp-wp.html)


## RSSページの投稿者情報を削除する

`wordpress/htdocs/wp-includes/feed-rss2.php`

* 下記のように該当部分をコメントアウト

```php:feed-rss2.php
 <?php /* <dc:creator><![CDATA[<?php the_author(); ?>]]></dc:creator> */ ?>
```

* [参考](https://www.it-swarm-ja.tech/ja/rss/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E5%86%85%E3%81%AEltdc%EF%BC%9Acreatorgt%E3%82%92%E5%89%8A%E9%99%A4%E3%81%BE%E3%81%9F%E3%81%AF%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%BE%E3%81%99/956809534/)
PHP 多次元配列

初めてのPHPの投稿になります。
今回はPHPの多次元配列を備忘録として投稿させて頂きます。

#多次元配列とは
配列の中に配列を定義することを指します。
また、横と縦に並んでいることをイメージするとよりわかりやすいでしょう。
これを多次元配列」と呼び、よくプログラムコードでも使用される配列の形です。

#考え方
下記にて分かりやすい図がありましたので参照して下さい。
横のHairetu (0) (1) (2)から数えます。
次に縦のHairetu (0) (1) (2) (3)から数えます。
これでどこの要素を取り出したいかを指定できます。

![“スクリーンショット” 2020-10-19 22.15.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/844d77ad-7493-ac52-da6c-d4a1cf7057d7.jpeg)

サンプルコードを掲載します。

```sample.php
こちらの配列は分かりやすい様に記述したものです。
    0   1   2
0[["1","2","3"],
1["A","B","C"],
2["a","b","c"]];

<?php
$member = [["1","2","3"],["A","B","C"],["a","b","c"]];
echo ($member[2][2]);//c
echo ($member[1][1]);//B
echo ($member [0][0])//0
?>
```
多次元配列を最初見たときは何これと思いましたがよくよく考えたら分かりやすかったです。
AWS WAFを導入してみた

## はじめに
WAFを構成する要素として、「Web ACLs」「Rules」「Associated AWS resources」があります。これはIAMの考え方と似ていて、

* Web ACLs = IAM Group
* Rules = IAM Policy
* Associated AWS resources = IAM User

というイメージを持つとわかりやすいでしょう。
つまり「Web ACLs」という箱を作り、そこにアクセスの可否を制御する「Rules」を設定し、そこに対象となるAWSリソース（ALB or CloudFront）を紐付けることになります。

## 作成
それでは実際に作っていきます。
### Web ACLsの作成&リソースの関連付け（Describe web ACL and associate it to AWS resources）

1. AWSのコンソールから、「WAF&Shield」を選択
1. 左サイドバーの「Web ACLs」を選択 > 「Create WebACL」を選択

#### Web ACL details
まずはルールやリソースを関連づけるための箱であるWeb ACLを作成します。
* 「Name」：ACLの名前を記入
* 「Resource type」：関連づけたいリソースの種類を選択（今回はALBなのでそのまま）
* 「Region」：リージョンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/043a05d7-1cc0-0ab7-b225-41929bd3873d.png)

#### Associated AWS resources
続いて、作成したWeb ACLにWAFの監視対象とするリソースを関連づけます。

1. 「Add AWS Resources」を選択
1. WAFを適用させたいリソースを選択して「Add」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/e30f4fec-f584-b8af-ec96-472a96c1dd72.png)
1. 「Next」を選択

### ルールの設定（Add rules and rule groups）
作成したWeb ACLにルールを適用していきましょう。WAFルールには、

* Managed Rule：AWSが提供しているルールセット
* My Own Rule：ユーザーが独自に定義するルール

の二種類あり、イメージとしてはIAM Policyでいうところの「AWS Managed Policy」と「Customer Managed Policy」の関係になります。
各Managed Ruleの詳細は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html)にまとまっているので、ベースはManaged Ruleを使いつつ、追加で設定したいポリシーはMy Own Ruleとして定義するのが良いと思います。
今回はさくっと設定できる「Managed Rule」を設定することにします。

1. 「Add rules」 > 「Add managed rule groups」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/3bb6fd44-99db-f77c-574c-f1d008e5cbc4.png)

1. 適用するルールを選択肢して、「Add rules」を選択
今回は不審なIPからのアクセスをブロックする「Amazon IP reputation list」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/fc0a3cf9-7b5d-85c5-f3ab-add2afcbe8eb.png)

1. 「Default action」は「Allow」のまま「Next」を選択

### ルールの優先度（Set rule priority）
ルールの適用順序を設定する画面ですが、今回はこのまま「Next」を選択します。

### メトリクスの設定（Configure metrics）
cloudwatchのメトリクスを設定する画面ですが、今回はこのまま「Next」を選択します。

### 確認画面（Review and create web ACL）
内容に問題なければこのまま「Create web ACL」を選択します。

## 確認
web ACLのoverviewでアクセスが確認できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/84eb36b2-f8d7-6f33-30f1-6a65f5097e2c.png)

## 注意点
設定するルールによっては本来許可したいリクエストをブロックしてしまう可能性があります。
筆者の場合は一度テスト用のロードバランサを作成し、そこにWAFを紐づけた上で動作確認し、その後本番用のロードバランサへの切り替えを行いました。
node.js+ExpressでGETデータとPOSTデータを取得しよう

## はじめに
node.jsを触り始めて数週間経ちフォームからデータを受け取る方法がなんとなくわかってきたので
自分用の備忘録兼初心者向けの記事として書き留めておきます。

Qiitaの記事を書くのが久しぶりなので誤字や表記ミス等あるかもしれませんご了承ください（コメントで指摘してくださると助かります）

## 環境
- OS
    - windows10
- node.js 
    - v12.18.4
- Express
    - v4.17.1 

### 前提条件
以下コードはすべて下記のコードが既に書かれている前提で説明していきます。

```javascript:app.js
const express = require("express")
const app = express()
app.use(express.urlencoded({extended: true}));
app.set('view engine', 'ejs');
// View engineにEJSを指定していますがなんでもいいです。
//自分が好きな奴使ってください

app.get("/",(req,res)=>{
    res.render("index");
})

```
フォーム用コード

```html:index.ejs
<p>GET用フォーム</p>
<form action="get-check" method="GET">
   <input type="text" name="user_id">
   <button type="submit">送信</button>
</form>
<p>POST用フォーム</p>
<form action="post-check" method="POST">
   <input type="text" name="user_id">
   <button type="submit">送信</button>
</form>
```

## GETで取得
Getでデータを送信した場合は
**req.query."取得したいinputのname"**
で取得ができます。

なので上記フォームからの値を取得したい場合は
**req.query.user_id**
とすれば取得できます。

なお**req.query**で送信された情報を連想配列で一括取得することができます。

ちなみに存在しないnameを指定するとundefinedが返ってきます。

## POSTで取得
POSTでデータを送信した場合は
**req.body."取得したいinputのname"**
で取得できます。

あとはGETと同様にnameを指定しなければ連想配列での一括取得ができますし
存在しないnameを指定するとundefinedが返ってきます。

## まとめ
GETは**req.query**
POSTは**req.body**
でそれぞれデータを取得することができる。
N-PrologのDCG

#はじめに
N-Prologは古のRUN/PROLOG互換を目指しているPrologインタプリタ、コンパイラです。DCGを組み込みにしてあります。その使用方法についてです。

#実装
ISO-Prologで公表されていたDCGのコードを組み込んでいます。起動時にコンパイラとともにDCGが読み込まれています。

#DCGの例

```prolog


s --> np,vp.
np --> det,n.
det -->[a].
n -->[dog].
n -->[postman].
vp --> v,np.
v -->[bites].
```

中島先生のPrologの本にあった例です。

#動作

![bandicam 2020-10-20 10-43-46-786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/5b431b60-3987-7968-6558-3127c70b71d5.jpeg)


#RUN/PROLOGとの互換
ユーザーマニュアルにありますように次の述語が組み込みとなっています。


□ expand_term(Term,Newterm)
DCG：限定節文法の項を等価なProlog項に変換する。


#Github
https://github.com/sasagawa888/nprolog
mindの研究 その20

#概要

mindが謎なので調べてみた。
vistaに入れた。
atcoder、やってみた。

#N個の整数値を受け取り、一度の操作ですべての数を2で割る。割り切れなくなるまで割っていった時、何回割ることが出来るか？


```
メインとは
　文字列１は　文字列
　合否は　変数
　数１は　変数
　数２は　変数
　数３は　変数
　数３に　９９を　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数１と　合否に　入れ
　ここから
　　数１から　１を　引き　数１に　入れ
　　文字列入力し　文字列１に　入れ
　　文字列１を　数値変換し　数２と　合否に　入れ
　　数２を　２で　割り　数２に　入れ
　　もし　数２が　数３より　小さい　ならば
　　　数３に　数２を　入れ
　　つぎに
　　もし　数１が　０に　等しい　ならば
　　　打ち切り
　　つぎに
　繰り返し
　数３を　数値表示する

```

以上。
ストーリーポイント（SP）とは

## SP
- タスクの見積もり
- 実装の難しさ、複雑さを元に算出
- フィボナッチ数（1, 2, 3, 5, 8, 13, 21, 34, 55, ... ）を元にした数列を使う
- 2のべき乗、倍数を使う場合も
- 自由に設定しても良い

---

## 見積もり
- 相対見積もり
- 同程度の難しさ、複雑度のタスクは同じ見積もり
- not 時間
- チーム全体で同じ見積りになるようにする
- 基準は1h=1SP

---

## プランニングポーカー
- 見積もりのズレを少なくする
- あるタスクに「せーの」で想定SPを出し、意見を交わす
- どれぐらいのSPになるか、繰り返し合うまで出し、合ったSPがチームでのSPとなる
- 機会があればどこかで

---
# デイリー
- 昨日やったこと
- 今日やること
- 困っていること