OmniAICreator/Qiita-1.07M huggingface dataset:
ABC167 A-D問題を解く

今回のABCは定時参加できなかったので、後日のんびり解きました。

# [A問題](https://atcoder.jp/contests/abc167/tasks/abc167_a)
入力として長さが$|S|=|T|+1$である文字列$S,T$を受け取り、$S$と$T$末尾の1文字を除いた文字列が等しいかそうでないかを出力する問題。

```python:A.py
S = str(input())
T = str(input())
if S == T[:-1]:
    print('Yes')
else:
    print('No')
```

# [B問題](https://atcoder.jp/contests/abc167/tasks/abc167_b)
$ 1,0,-1 $のカードがそれぞれ$ A,B,C $枚あり、その中から$ K $枚を取り出す。その時取りうるカードの和の最大値を求める問題。スコアの高いものから選び、合計を出力する。

```python:B.py
A, B, C, K = map(int, input().split())
if K <= A:
    print(K)
    exit(0)
K -= A
if K <= B:
    print(A)
    exit(0)
print(A-(K-B))
```

# [C問題](https://atcoder.jp/contests/abc167/tasks/abc167_c)
全てのアルゴリズムで$X$以上の理解度をつけるために必要な参考書の購入費を求める問題。条件が達成できない場合は-1を出力する。
考えられる参考書の選び方は$2\^N-1$であり、$0\leq N\leq 12$なのでの最大値は$2^{12}-1=4095$通りと考えられるので、全探索でもきっと間に合う。
全ての選び方について理解度を求め、条件を達成しているかを判定する。条件が達成されていれば、購入費を更新する。

```C++:C.cpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int N, M, X;
    cin >> N >> M >> X;
    vector<vector<int>> A(N, vector<int>(M + 1, 0));
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j <= M; j++)
        {
            cin >> A[i][j];
        }
    }
    int ans = 100000000;
    for (int i = 1; i < (1 << N); i++)
    {
        int score = 0;
        vector<int> x(M, 0);
        for (int j = 0; j < N; j++)
        {
            if ((i >> j) & 1)
            {
                for (int k = 0; k < M; k++)
                {
                    x[k] += A[j][k + 1];
                }
                score += A[j][0];
            }
        }
        bool flag = true;
        for (int j = 0; j < M; j++)
        {
            if (x[j] < X)
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            ans = min(ans, score);
        }
    }
    if (ans == 100000000)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << ans << endl;
    }

    return 0;
}
```

# [D問題](https://atcoder.jp/contests/abc167/tasks/abc167_d)
桃鉄みたいな問題。町1から移動して$K$回移動したときの町番号を求める問題。
$0\leq K\leq 10^{18}$なので、単純に求めるとTLEしてしまう。でも、町の数は$0\leq N\leq 2*10^{5}$なので、どのようにループするかを求めてしまえば剰余を使って求めることができる。そのために、まずどのようにループするかを求める。
$X$で今までに来たことのある町を記録し、$r$で町1からどのように遷移するかを記録する。1つ進むごとに$K$を$-1$して、まだ来たことのない町だったら$X,r$に記録する。もし、来たことのある町だったら、1周したことになり、今いる町よりも後ろにある$r$の要素でループすることになる。その町を$R$に記録して、剰余を用いて求める。

```python:D.py
N, K = map(int, input().split())
A = list(map(int, input().split()))
X = {1}
r = [1]
for i in range(0, N):
    idx = A[r[-1]-1]
    if K == 1:
        print(idx)
        exit(0)
    else:
        if X.isdisjoint({idx}):
            r.append(idx)
            X.add(r[-1])
            K -= 1
        else:
            R = r[r.index(idx):]
            K -= 1
            break
print(R[K % len(R)])
```

D問題はもっといい解法がありそうですね。
select option要素　submit等イベント後に選択肢をselected属性のあるoption要素に（元に）戻す

#行ったこと

- ```select```, ```option```要素の実装、修正

#困ったこと
モーダルの中に、
```input``` 要素で記述式の質問回答欄を、
```select``` ```option```要素で選択肢の回答欄を実装。

回答を記入及び選択肢を選んだ後、```submit```等イベントを実行すると、
（モーダルを閉じるとともに）
```input```欄を空欄にし、```select```要素の表示を元に（選択される前の状態）戻したい。

うまく言語化が出来ておりませんが、コードは以下の通りです。

**HTML**

```
<input id="example" type="text">
<select id="question">
   <option selected>選んでください</option>
   <option value="1">a</option>
   <option value="2">b</option>
   <option value="3">c</option>
   <option value="4">d</option>
</select>
<button id="submitButton" type="submit">送信</button>
```

インプット欄、選択欄、ボタンを実装しました。

ボタンを押すと、インプット欄を空欄に戻し、かつ選択欄を「選んでください」が
表示されるように戻す。

**jQuery**

```
$('#submitButton').on('click', () => {
    $('#example').val("");
    $('#question').val($('#question option[selected]').val());
});
```
Haskellの関数適用($)と関数合成(.)

# 関数適用($)と関数合成(.)
Haskell の関数適用($)と関数合成(.)の操作上の違いを端的に説明

```haskell
ghci> sum . replicate 5 $ max 6.7 8.9
44.5
ghci> sum $ replicate 5 $ max 6.7 8.9
44.5
```

- 演算の優先順位は `.` > `$`
- `.` は右側に関数がくる
- `$` は右側に値がくる

従って以下は上記の例と等価

```haskell
ghci> (sum . replicate 5) $ max 6.7 8.9
44.5
ghci> sum $ (replicate 5 $ max 6.7 8.9)
44.5
```

以下の例は当然エラーになる

```haskell
-- .の右側が値なのでエラー
ghci> sum $ replicate 5 . max 6.7 8.9

<interactive>:132:1: error:
    * Non type-variable argument in the constraint: Foldable ((->) a1)
      (Use FlexibleContexts to permit this)
    * When checking the inferred type
        it :: forall a1 a2.
              (Foldable ((->) a1), Ord (a1 -> a2), Fractional (a1 -> a2),
               Num [a2]) =>
              [a2]

-- $の右側が関数なのでエラー
ghci> (sum $ replicate 5) $ max 6.7 8.9

<interactive>:137:8: error:
    * Couldn't match type `[a0]' with `Double -> t'
      Expected type: a0 -> Double -> t
        Actual type: a0 -> [a0]
    * Possible cause: `replicate' is applied to too many arguments
      In the second argument of `($)', namely `replicate 5'
      In the expression: (sum $ replicate 5)
      In the expression: (sum $ replicate 5) $ max 6.7 8.9
    * Relevant bindings include it :: t (bound at <interactive>:137:1)

-- .の右側が値なのでエラー
ghci> sum . (replicate 5 $ max 6.7 8.9)

<interactive>:133:8: error:
    * Couldn't match expected type `a -> [c]'
                  with actual type `[Double]'
    * In the second argument of `(.)', namely
        `(replicate 5 $ max 6.7 8.9)'
      In the expression: sum . (replicate 5 $ max 6.7 8.9)
      In an equation for `it': it = sum . (replicate 5 $ max 6.7 8.9)
    * Relevant bindings include
        it :: a -> c (bound at <interactive>:133:1)
```

# Thanks!!
- @yuchiki1000yen
[ Mac ] mysqlを5系から8系にバージョンアップする時に発生するエラーの解決

mysqlを `5.?.? → 8.0.19` バージョンにアップデートする時に発生するエラーが厄介すぎる！

`brew uninstall mysql`
でアンインストールしてはそれに関するファイルを全部消して、
`brew install mysql`
で、もう一度再インストールしても `error`



##開発環境


Mac OS X
10.15.4

今回入れる`mysql`は
`Ver 8.0.19 for osx10.15 on x86_64 (Homebrew)`
です

##目標
`mysql.server start`
を実行したときにSUCCESSさせる

##解決策
結論からいうと、
>**5系のmysql(プロセス)が邪魔している**
です
参考:(https://qiita.com/YamKenta/items/a33499a7db7946a43381)


それでは行きます
動いてるプロセスがあるか確認
`ps ax | grep mysql`

ここで、あった場合は選択してkillしてください
例えば、
`777 ~~mysql@5.3`

こんな風に出てたら
`kill 777`
としたら消せます

これで全て5系のプロセスを消したら、もう一度
`mysql.server start`

`SUCCESS`がでたら完了


これでならなければ、
mysqlをuninstallして、
関係するファイルを全て消してください
（ここは割愛します。調べたらすぐ出てくるんで頑張ってください！）

以上です！
【Udemy Python3入門+応用】　57. デコレーター

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■デコレーターの基本
#####◆デコレーターを使わずに書くと
```python:non_decorator
def add_num(a, b):
    return a + b

print('start')
r = add_num(10, 20)
print('end')

print(r)
```
```:result
start
end
30
```
`add_num()` を呼び出すだけでなく、その前後などでなにか追加で行いたいとき、「デコレーター」を用いることができる。

#####◆デコレーターを使って書くと
```python:decorator
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

def add_num(a, b):
    return a + b

f = print_info(add_num)
r = f(10, 20)
print(r)
```
```:result
start
end
30
```
`*args` については、[52. 位置引数のタプル化](https://qiita.com/cyrus_qiita/items/da5df61aeb13b0f1faee)
`**kwargs` については[53. キーワード引数の辞書化](https://qiita.com/cyrus_qiita/items/78eb6e3e3de7b60a4ffd) を参照。

#####◆デコレーターの一般的な使い方
上の様に記述すると、デコレーターとして使っているということがわかりにくい。
なので、一般的にデコレーターを用いるときには以下の様に記述する。

```python:decorator
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_info
def add_num(a, b):
    return a + b

r = add_num(10, 20)
print(r)
```
```:result
start
end
30
```
`@` を使ってデコレーターの関数を指定してやることで、その関数を使ってデコレートできる。

##■デコレーターを複数使う場合
#####◆デコレーターをかける順番
もう1つデコレーターの関数を書いて、2つとも使ってみる。

```python:two_decorators
def print_more(func):
    def wrapper(*args, **kwargs):
        print('func: ', func.__name__)
        print('args: ', args)
        print('kwargs: ', kwargs)
        result = func(*args, **kwargs)
        print('result: ', result)
        return result
    return wrapper

def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_info
@print_more
def add_num(a, b):
    return a + b

r = add_num(10, 20)
print(r)
```
```:result
start
func: add_num
args: (10, 20)
kwargs: {}
result: 30
end
30
```
このようにデコレーターを指定した場合、
`print_info` の中に `print_more` が内包されているのがわかる。

今度は2つのデコレーターの順番を入れ替えてみる。

```python:two_decorators
def print_more(func):
    def wrapper(*args, **kwargs):
        print('func: ', func.__name__)
        print('args: ', args)
        print('kwargs: ', kwargs)
        result = func(*args, **kwargs)
        print('result: ', result)
        return result
    return wrapper

def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_more
@print_info
def add_num(a, b):
    return a + b

r = add_num(10, 20)
print(r)
```
```:result
func: add_num
args: (10, 20)
kwargs: {}
start
end
result: 30
30
```
今度は、`print_more` の中に `print_info` が内包されている。
【Laravel Homestead】Homestead.yamlがを修正して、再度Vagran Upで起動したが反映されない？

備忘録として残します。
久しぶりにVagrantを使ってLaravelで遊ぼうとHomesteadをVagrantで構築して、なんやかんや準備が終わり、ホストOSでHomestead.yamlで定義したURL（この時はlaravel.test）にアクセスしたが、、、
あれ？`No input file specified.`と表示される。

どうやら、ゲストOS側のドキュメントルートの設定をミスって他っぽい

初回、Vagrant Upで起動したはいいが、Homestead.yamlが間違っていたことに気が付く。
Vagrant haltで終了して、Homestead.yamlを修正。
再度、Vagrant Upで起動してみたが、設定が反映されていなさそう。
`Homestead.yaml`の記載はおかしくないのになぜ？

とりあえず、vagrantを壊してみたら動いた。
#■対処法
hostOSで（当然だが）下記コマンドを実行。

```shell
Vagrant destory
```
その後 Vagrant upで起動。

無事ホストOSでアクセスできるようになりました。。


#■おわりに
今回はVirtualBoxを6.1の最新で構築したが、Vagrantは一つ前のマイナーバージョン（今回の場合は6.0系）で構築したほうがいいとか、わるいとか。。。。
Dockerで環境変数を設定してPythonに表示してみたよ

# 目標
docker runコマンドの際に設定した環境変数を、コンテナ内のシェルスクリプトで実行したPythonでprintする。

# 想定
お仕事でAmazon ECSで環境変数（SMTPサーバー情報など）付きのdocker runコマンドを定時実行し、Pythonで環境変数を基に渡されたSMTPサーバー情報を基にメール定時送信システムを構築中。そのための自宅でのお試し環境変数いじり。

# 環境
PC:windows 10 home
docker tool-box

```
$ docker version
Client:
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea838
  Built:            Wed Nov 13 07:28:45 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

# とりあえずPythonのコンテナを立てる
```
$ docker run --env-file=env.txt -v /c/Users/.../environment_variable_test/code:/code -it python:3.6 bin/bash
root@82a5c3949b49:/#
```

docker runコマンドの実行はenv.txtのディレクトリで。
--env-file=env.txtで環境変数をしている。
ちなみに、env.txtは、

```env.txt
AAA=asdfgg
BBB=bnmbnm
CCC=cvbnm
```

環境変数はAAA, BBB, CCCの3つ。
せっかくなので別ファイルに分離させてみました。
docker runの環境変数設定はこちらに細かく載ってました↓
https://qiita.com/KEINOS/items/518610bc2fdf5999acf2

asdfgg, bnmbnm, cvbnをpythonで表示させたら勝ち。

-v /c/Users/.../environment_variable_test/code:/codeはディレクトリマウント。
ホスト側とdocker内のディレクトリが同期する。

ちなみにちゃんと環境変数が書き込まれてるが確認
参考：https://www.kabegiwablog.com/entry/2018/07/25/100000

```
root@82a5c3949b49:/# env | grep -e "AAA\|BBB\|CCC"
AAA=asdfgg
BBB=bnmbnm
CCC=cvbnm
root@82a5c3949b49:/#
```

# シェルスクリプトとPythonファイルつくる
/c/Users/.../environment_variable_test/codeに作る。

```test.sh
#!/bin/sh
python test.py $AAA $BBB $CCC
echo "OK"
```
ハマりどころは1行目の#!/bin/sh入れないと.shと認識してくれない
あと、環境変数は$を付ける
test.pyに引数として環境変数たちを渡す。

echo "OK"はシェル上でOKと表示してくれる。おまけ。

```test.py
#!/usr/bin/env python
import sys

args = sys.argv

print("第1引数：" + args[1])
print("第2引数：" + args[2])
print("第3引数：" + args[3])
```
こちらも1行目に#!/usr/bin/env python入れないと.pyと認識してくれない。
Pythonでの引数の操作はこちらを参照して↓
https://qiita.com/orange_u/items/3f0fb6044fd5ee2c3a37

```
root@82a5c3949b49:/code# bash test.sh
第1引数：asdfgg
第2引数：bnmbnm
第3引数：cvbnm
OK
root@82a5c3949b49:/code#
```
よっしゃ！OK！

蛇足ですが、﻿#!/bin/sh: No such file or directoryとか出たら、各ファイルの文字コードを確認しましょう。

```
test.sh: line 1: ﻿#!/bin/sh: No such file or directory
第1引数：asdfgg
第2引数：bnmbnm
第3引数：cvbnm
OK
```
初心者の僕はメモ帳で開いて文字コード直して上書きしました
誤：UTF-8(BOM付き)
正：UTF-8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542515/85a9e4d6-0920-d2ac-cfc2-205ef777086f.png)

# 展望
Dockerfileにもまとめておきたいね。

#今回使ったコードGitHubに載せました（コピペの方が早いけどｗ）
https://github.com/k-ashigaki/DockerStudyFile/tree/master/environment_variable_test
【Python】listの使い方1

#はじめに
とみーさんのブログの[Python入門者のための学習ロードマップ](https://obgynai.com/python-roadmap/)に沿ってPython学習を進めています。
今回は[【Python入門】list（リスト）の使い方の総まとめ（前編）](https://obgynai.com/python-list-1/)の前半を扱います。

#対象者
- とみーさんブログで学習中の方
- listの使い方の概要を知りたい方

#環境
Google Colaboratory

#学習内容
1. リストの作り方と参照方法
リストは**シーケンス型でミュータブル**

2. タプル、rangeはイミュータブル。タプル変数をlist()で囲って、新しい変数にできる

3. listにlistも入れられる

##1

```py
list_num = [1,2,3,4]  # 1,2,3,4でlist作って
print(list_num)       # list_num表示で
```

```text:実行結果
[1, 2, 3, 4]
```

##2
シーケンス型にはリスト以外にタプル、rangeなどがあるが、これらはイミュータブルなのでデータ追加できない。（宣言時に代入した値を変更できない）タプル変数をlist()で囲って、新しい変数にする
タプルのリスト型への変換

```py
tuple_samp = (1,2,3,4)
print(tuple_samp)
print(type(tuple_samp))  # 型の確認

list_samp = list(tuple_samp)
print(list_samp)
print(type(list_samp))
```

```text:実行結果
(1, 2, 3, 4)
<class 'tuple'>
[1, 2, 3, 4]
<class 'list'>
```

rangeも同様

```py
range_samp = range(4)
print(range_samp)
print(type(range_samp))
list_samp = list(range_samp)
print(list_samp)
print(type(list_samp))
```

```text:実行結果
range(0, 4)
<class 'range'>
[1, 2, 3, 4]
<class 'list'>
```

##3

```py
list_0 = [1,2,3]
list_1 = [4,5,6]
list_2 = [7,8,9]
list_two_dim = [list_0,list_1,list_2]  # リストをリストにいれる
print(list_two_dim)
```

```text:実行結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```


#参考
[【Python入門】list（リスト）の使い方の総まとめ（前編）](https://obgynai.com/python-list-1/)
MySQL 　データベースを削除するには

## MySQLへ接続

SQLを実行するためにはこちらのコマンドでデータベースに接続します。

```:ターミナル
＄　mysql -u root
```

##データベースの一覧を確認
次に作成したデータベースの一覧を確認します。

```:ターミナル
mysql> show databases;
```

するとこのような一覧が表示されます（データベースの内容は個々で異なります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614772/ae1d4386-9a63-8b2c-82ad-4a32453a0730.png)


##データベースの削除
こちらのコマンドでデータベースを削除できます。

```:ターミナル
mysql> drop database 削除したいデータベース名;

```

##ハイフン（-）付きのデータベース名を削除するにはデータベース名を`(バッククオート)で囲む

例えば　**chat-space_development**　のようなデータベース名のものを削除しようとすると下記のようなエラーが出てしまいます。

```:ターミナル
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'chat-space_development' at line 1
```

なのでデータベース名にハイフン（-）が入っているものには **`(バッククオート)** で囲んで上げる必要があります。

```:ターミナル
mysql> drop database `chat-space_development`;

```
そうすれば下記のように表示されデータベースを削除できます。

```:ターミナル
Query OK, 7 rows affected (0.17 sec)
```
念の為削除できているかデータベースの一覧を確認します。

```:ターミナル
mysql> show databases;
【Objective-C】NSData・NSDictionary・NSStringの相互変換


すぐ忘れるのでここに記しておきます。

#NSData to NSDictionary
```objective_c
//dicはNSDictionary型のオブジェクト
NSData *d = [NSKeyedArchiver archivedDataWithRootObject:dic];
```

#NSDictionary to NSData
```objective_c
//dはNSData型のオブジェクト
NSDictionary *reverse = [NSKeyedUnarchiver unarchiveObjectWithData:d];
```

#NSData to NSString
```objective_c
//dataはNSData型のオブジェクト
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
```

#NSString to NSData
```objective_c
//stringはNSString型
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
```
全国のオンライン診療実施医療機関リストを Mapbox で表示 

まじめな所長＠医療介護データ研究所 [@iryokaigodb](https://twitter.com/iryokaigodb) の方が公開している全国のオンライン診療実施医療機関リストを地図に表示しました。すでに何人の方が地図に表示をしていますが Mapbox を利用した例を紹介したいと思います。

詳細は、以下のはてなブログに詳しく書いてますので参照していただければと思います。
[全国のオンライン診療実施医療機関リストを Mapbox で表示](https://freedom-tech.hatenablog.com/entry/2020/05/10/165252)
How to construct Node.js Express web page on AWS EC2 linux instance

# Introduction

 This document is a weak memorandum for my cheap working job

# connect AWS EC2 instnce

## connect by SSH to Linux instance from ec2-user

+ push [Connect (接続) ] buttom below

<img width="606" alt="スクリーンショット 2020-05-12 0.22.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124810/c361263e-71ef-2f96-321e-cc87f825d77c.png">

## use **EC2 Instance Connect** (browser base SSH conection)

+ select `EC2 Instance Connect` and push [Connect (接続) ]  buttom below

<img width="701" alt="スクリーンショット 2020-05-12 0.23.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124810/3352adb3-0e84-a60f-6609-84bc7dc4a6ad.png">

# install Node.js

## install **nvm** (node version manager) 

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```
## activate **nvm**

```bash
. ~/.nvm/nvm.sh
```
## install recent version of **Node.js**
 
```bash
nvm install node
```
## test for correct Node.js install and execute

```bash
node -e "console.log('Running Node.js ' + process.version)"
```
then display below on terminal

```bash
Running Node.js VERSION
```

# install Express web framework for Node.js

## make service directory and change this directory

```bash
mkdir dev/nodejs/express/app
cd dev/nodejs/express/app
```

## Node.js project initialization

```bash
npm init -y
```

## install Node.js web framework **Express**

```bash
npm install --save express
```
then create `node_modules` folder and setting lock file `package-lock.json`

# install **Express-Generator** that create web application template library for express framework

## install Express-Generator and create a template

```bash
npm install -g express-generator
```
## create web application template that name is **members**

```bash
express --view=ejs members 
```

## move directory for web application template and install

```bash
cd members
npm install
```

## test running express web application

```bash
npm start
```

then display terminal blow

```bash
> members@0.0.0 start /home/ec2-user/dev/nodejs/express/app/members
> node ./bin/www
```

## open inbound port 3000 on AWS EC2 security group

+ click security group link anchor

<img width="818" alt="スクリーンショット 2020-05-12 21.46.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124810/bdfda559-30f1-1214-1a1f-a0bd53d91684.png">

+ then click [edit inbound rule (インバウンドルールの編集)] button
+ add rule below

|type(タイプ)|port area(ポート範囲)|source(ソース)|
|----|---------|------|
|custom TCP|3000|0.0.0.0/0|

<img width="1049" alt="スクリーンショット 2020-05-12 21.21.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124810/de5ae0fd-79df-647b-277d-d3a02ed69a9e.png">

## access web browser to URL

`http://public DNS:3000/`

+ public DNS is about
    + ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com

## then display web browser blow

<img width="483" alt="スクリーンショット 2020-05-12 21.22.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124810/737768a6-b0ea-ca91-d386-21b156e4b9b9.png">
5 月 LeetCode 挑戰, W2D4, Flood Fill (Find Path), in Swift

資料結構與演算法： `Find Path` `Backtracking` `DFS`

- 挑戰頁面 - [Flood Fill](https://leetcode.com/explore/challenge/card/may-leetcoding-challenge/535/week-2-may-8th-may-14th/3326/)
- 原題目頁面 - [733. Flood Fill](https://leetcode.com/problems/flood-fill/)

## 思考方式

大家好 :DDD
這題是很典型的找路徑 (find path) 題目，邏輯概念是 deep first search 和 backtracking 。

### ① 找出 Backtracking 中單一元素的行為

如何走訪就是依循找路徑的走訪方式。

也就是站在一個位置的時候，會找上下左右四個方向是不是等於起點的值。走到其中一個方向之後，等於起點的值的話就在那個位置繼續往他的上下左右四個方向走。

在走訪的過程中，如果當前位置的值等於起點的值的話，就把它換成目標值。

### ② 找出 Backtracking 的停止條件

進行 backtracking 的演算法最重要的事情就是找出如何停止

- 當前的位置已經超出目前二維陣列的範圍
- 當前的值不符合起始位置的值 （這個是題目條件）

### 相似題目以及影片解釋

- [Leetcode 30 天挑戰, Week 3 Day 3, Number of Islands, in Swift](https://qiita.com/vc7/items/e58456f3d08baedf0098)
  - 稍微進階一點的找島題目，找島就跟這題的找相同色是相同的意思。
- [Search A Maze For Any Path - Depth First Search Fundamentals (Similar To "The Maze" on Leetcode)](https://www.youtube.com/watch?v=W9F8fDQj7Ok)
  - 在迷宮內找路徑的逐步解釋

## 程式碼

有加入行內的註解，如果有任何不清楚的地方歡迎討論！

``` swift
class Solution {
    func floodFill(_ image: [[Int]], _ sr: Int, _ sc: Int, _ newColor: Int) -> [[Int]] {
        let start = image[sr][sc]
        // 如果指定的起點和要替換的值一樣的話就直接回傳
        if start == newColor { return image }
        
        // 有不一樣才開始走訪尋找和替換
        var result = image
        fill(&result, start, sr, sc, newColor)
        return result
    }
    
    // Backtracking routine
    func fill(_ image: inout [[Int]], _ start: Int, _ row: Int, _ column: Int, _ newColor: Int) {
        // 結束走訪：超出範圍
        if row >= image.count || column >= image[0].count || row < 0 || column < 0 { return }
        
        let current = image[row][column]
        
        // 結束走訪：當前的數值不符合我們要找的數值就提前結束
        if current != start { return }
        
        // 替換
        image[row][column] = newColor
        
        // 依序上下左右深度走訪
        fill(&image, start, row - 1, column, newColor) // 上
        fill(&image, start, row + 1, column, newColor) // 下
        fill(&image, start, row, column - 1, newColor) // 左
        fill(&image, start, row, column + 1, newColor) // 右
    }
}
```

## 複雜度分析

設 image 為 r * c 的二維陣列。 (r for number of rows, c for number of column)

- 時間複雜度： O(r * c)
  - 最壞會全部走過一次
- 空間複雜度： O(r * c)
  - 傳入的是 immutable (不可變) 2d array ，所以需要把它轉成可變的 array 才可以變更內容。

## 執行結果

``` text
Runtime: 56 ms (beats 100.00%)
Memory Usage: 21.1 MB
```

## 感想

找路徑竟然可以變這麼多題型 ...
Macでtorchvisionをインストールしたらimport torchができなくなった

torchvision(0.6.0)をインストールしたらtorchのバージョンが1.4.0から1.5.0にアップデートされてエラーが出るようになった．


```bash
    import torch
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/torch/__init__.py", line 136, in <module>
    from torch._C import *
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so, 2): Library not loaded: @rpath/libc++.1.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so
  Reason: image not found
```
解決策
libc++.1.dylibは/usr/libの下にあったため，install_name_toolを使って解決する．

```Bash
install_name_tool -add_rpath /usr/lib /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so

```
Ruby と Python で解く AtCoder ARC 059 C 最小二乗法

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder Regular Contets C - いっしょ](https://atcoder.jp/contests/arc059/tasks/arc059_a)*
<font color="brown">Difficulty: 656</font>

今回のテーマ、最小二乗法
# Ruby (全探索)
問題文を読んでもちょっと分かりづらいのですが、出力例の説明を読みますと、*[最小二乗法 -wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)* で傾きが`0`の1次関数をイメージすることが分かります。
まずは、`−100≦a[i]≦100`と計算量が少ないので率直に全探索で解きます。

```ruby.rb
n = gets.to_i
a = gets.split.map(&:to_i)
min = Float::INFINITY
a.min.upto(a.max) do |x|
  b = a.map{|y| (x - y) ** 2}.inject(:+)
  min = b if min > b
end
puts min
```
# Ruby (最小二乗法)
次は、数学的解法です。
1次関数`y = ax + b`で傾き`a = 0`ですので、`y = b`となります。

|入力例3|a[0]|a[1]|a[2]|
|:--:|:--:|:--:|:--:|
|データ|4|2|5|
|誤差の二乗|$$(b - 4)^2$$|$$(b - 2)^2$$|$$(b - 5)^2$$|
$$(誤差の二乗の累計) = 3b^2 - 22b + 45$$
よって、誤差の二乗の累計が最小となる`b`が求まります。
$$b = 22 / 2 / 3$$

```ruby.rb
n = gets.to_i
a = gets.split.map(&:to_i)
b = (a.inject(:+).to_f / n).round
min = a.map{|x| (x - b) ** 2}.inject(:+)
puts min
```
# Ruby (最小二乗法 - 行列)
map を始めとする Enumerable モジュールは一つ一つの要素に逐次演算を行いますが、行列は全ての要素に一気に演算を行います。

```ruby.rb
require 'matrix'

n = gets.to_f
a = Matrix[(gets.split.map(&:to_i))]
b = (a.inject(:+) / n).round
min = a - Matrix[(Array.new(n, b))]
puts (min * min.row_vectors[0])[0]
```
# Python (全探索)
```python.py
import sys

n = int(input())
a = list(map(int, input().split()))
m = sys.maxsize
for x in range(min(a), max(a) + 1):
    b = sum([(x - y) ** 2 for y in a])
    if m > b:
        m = b
print(m)
```
`min`という変数は使用できないようです。
# Python (最小二乗法)
```python.py
n = int(input())
a = list(map(int, input().split()))
b = round(sum(a) / n)
m = sum([(x - b) ** 2 for x in a])
print(m)
```
# Python (最小二乗法 - numpy)
```numpy.py
import numpy as np

n = int(input())
a = np.array([list(map(int, input().split()))], dtype = np.int32)
b = np.around(np.sum(a) / n)
m = a - b
print(int(np.sum(np.power(m, 2))))
```
初歩的な使用方法にとどまっています。

||Ruby(全探索)|Ruby(最小二乗法)|Ruby(行列)|Python(全探索)|Python(最小二乗法)|Python(numpy)|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|コード長|169 Byte|128 Byte|174 Byte|201 Byte|122 Byte|182 Byte|
|実行時間|10 ms|7 ms|17 ms|23 ms|18 ms|151 ms|
|メモリ|1916 KB|1788 KB|4604 KB|2940 KB|2940 KB|12396 KB|
# まとめ
+ ARC 059 C を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった

参照したサイト
*[最小二乗法のアルゴリズムを理解したのでメモ。そしてPythonで書いてみた。](https://qiita.com/ishizakiiii/items/72be4ce16a10f97d6183)*
GitのSSH接続を設定

# 概要
新しいPCに移行する作業で、GitHubにSSH接続するための設定が必要になりました。
一度設定すると忘れてしまうので、SSHで接続するための設定方法を備忘録としてまとめます。

# SSH接続を設定

アプリケーション/ユーティリティディレクトリ内にあるターミナルを起動して、次のコマンドを実行してください。

```
$ ssh-keygen
```
すると、下のような出力が表示されるので、必要な箇所でEnterキーを入力してください。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user_name/.ssh/id_rsa): 
```

```
Created directory '/Users/user_name/.ssh'.
```
パスフレーズを設定しない場合は、パスフレーズの入力では何も入力せずにEnterキーを入力します。

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/user_name/.ssh/id_rsa.
Your public key has been saved in /Users/user_name/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX XXXXXXXX.local
The key's randomart image is:
+--[ RSA 2048]----+
|             .o. |
|             .o  |
|           ... . |
|      . . E.o    |
|       +So.O o . |
|      . ..+ + = +|
|       . . . o = |
|        . . o    |
|                 |
+-----------------+
```
生成したSSH 鍵の公開鍵の内容は次のコマンドを実行すると確認できます。

```
$ cat ~/.ssh/id_rsa.pub
```
生成したSSH 鍵の公開鍵をリモートリポジトリに設定します。
Githubにログインして、Settingsに移動します。
<img width="212" alt="スクリーンショット 2020-05-11 23.53.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/62130a29-d7ea-c5dd-b6eb-e71342f6cb02.png">

GitHubの設定ページから SSH and GPG keys のページを開きます。
New SSH Key ボタンから鍵を追加するページを開きます。
<img width="185" alt="スクリーンショット 2020-05-11 23.53.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/a00bac86-ef67-ff88-b30f-af56ccb8a5a8.png">

先ほど生成した拡張子「.pub」のファイルの中身をコピーして貼り付けます。

# SSH の確認

次のコマンドを実行するとSSH接続をGitHubに対して実行できます。レスポンスがあれば正しく設定されています。

```
ssh -T git@github.com 
```
# 使用する鍵ファイルを指定する設定

下のようにパスワードの入力が毎回必要な場合は、ホストGitHubに接続する際に使用する鍵ファイルを指定する設定を行います。

```
Enter passphrase for key '/Users/user_name/.ssh/id_rsa':
```

SSHの設定ファイル ~/.ssh/config を作成し、以下のように設定してください。

```
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_git_rsa
  User git
```
次のコマンドを実行してください。

```
// SSH鍵をssh-agentに登録
$ ssh-add /Users/user_name/.ssh/id_rsa

// 上記パス（~/.ssh_id_rsa）の場合、下記でも登録可能
$ ssh-add -K

// 登録されていることを確認する
$ ssh-add -l
```

# GitLabとSSH接続
[公式ドキュメント](https://docs.gitlab.com/ee/ssh/README.html)



sshキーを登録したら接続テストを行います。

```
$ ssh -T git@gitlab.com
```
掃き出し法(wolframalphaで)

(参考)[初投稿]質問・python 掃き出し法
https://qiita.com/snq7amf522dvzpjbwshb/items/5c267d8286857eda9a71

#wolframalphaで
[3,1,1,2],[5,5,3,4],[2,0,6,2],[1,3,2,1]
https://ja.wolframalpha.com/input/?i=%5B3%2C1%2C1%2C2%5D%2C%5B5%2C5%2C3%2C4%5D%2C%5B2%2C0%2C6%2C2%5D%2C%5B1%2C3%2C2%2C1%5D
逆数:
1/8(22 | -14 | -2 | 16
1 | -1 | -1 | 4
3 | -3 | 1 | 4
-31 | 23 | 3 | -28)
小数の表記:
(2.75 | -1.75 | -0.25 | 2
0.125 | -0.125 | -0.125 | 0.5
0.375 | -0.375 | 0.125 | 0.5
-3.875 | 2.875 | 0.375 | -3.5)
Vue & Wijmoのquickstartをやってみる。


↓を参考にVue & Wijmoを試してみます。
<a href="https://devlog.grapecity.co.jp/entry/2019/03/12/wijmo-vue-quickstart">Vue & Wijmoクイックスタート【2019年版】</a>　


|  ミドルウェア  |  バージョン  |
| ---- | ---- |
|  Mac OS X | 10.15.4 |
|  nodebrew | 1.0.1 |
|  npm  |  6.14.4  |


```shell
 npm install -g @vue/cli
 vue create quickstart
 cd quickstart
 npm install wijmo
```

```shell
vim src/App.vue 
```

```vuejs
<template>
  <div id="app">
    <wj-flex-grid :itemsSource="gridData">
      <wj-flex-grid-column header="ID" binding="id" :width="60"></wj-flex-grid-column>
      <wj-flex-grid-column header="商品名" binding="product" :width="200"></wj-flex-grid-column>
      <wj-flex-grid-column header="受注日" binding="date" :width="120"></wj-flex-grid-column>
      <wj-flex-grid-column header="金額" binding="amount" :width="100" format="c"></wj-flex-grid-column>
    </wj-flex-grid>
  </div>
</template>

<script>
import 'wijmo/wijmo.vue2.grid';
import 'wijmo/cultures/wijmo.culture.ja.js';
import 'wijmo/styles/wijmo.css';

export default {
  name: 'app',
  data: function () {
    return {
      gridData: [
        { id: 1, product: '商品１', date: '2020/05/11', amount: 100 },
        { id: 2, product: '商品２', date: '2020/05/11', amount: 1000 },
        { id: 3, product: '商品３', date: '2020/05/11', amount: 2000 },
        { id: 4, product: '商品４', date: '2020/05/11', amount: 15000 }
      ]
    }
  },
  components: {
  }
}
</script>
```


```shell
npm run serve
```

<img width="912" alt="スクリーンショット 2020-05-11 23.47.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/f2c97394-8c77-3d57-cee7-7396fe03325e.png">
マイグレーションファイルを作成してDBに反映させる

【開発環境】
macOS Catalina
バージョン 10.15.3
ruby 2.5.1
Rails 5.2.4.2
visual studio code
#マイグレーションファイルを作成してDBに反映させる
マイグレーションについてまとめました。

##マイグレーションファイルとは
マイグレーションファイルは、簡潔にいうとDBの設計図です。
一旦マイグレーションファイルに設計を書いて、それをDBに反映させることで、テーブル、カラムを作成できます。

##マイグレーションファイルも作成

```
$ rails g migrate マイグレーション名
```
こちらのコマンドでマイグレーションファイルを作成できます。
db/migrate下に作成されます。

モデルも一緒に作る場合

```
$ rails generate model モデル名 カラム名:型 カラム名:型 ...
```
こちらのコマンドで作成できます。

例としてpostモデルのマイグレーションファイルをカラム名、型を指定して作ってみます。

```
$ rails g model post title:string content:text
```
こちらのコマンドでこのようなマイグレーションファイルが作成されます。

```[年月日時分秒日付]_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :content
      t.timestamps
    end
  end
end
```

##マイグレーションファイルをDBに反映する
作成したマイグレーションファイルはそのままではDBに反映されないので、反映する必要があります。

```
$ rails db:migrate
```
こちらのコマンドでマイグレーションファイルをDBに反映でき、テーブル、カラムを作成することができます。

##おわりに
今回はマイグレーションファイルについてまとめました。
間違いなどがありましたらご指摘いただければ幸いです。
最後までご覧いただきありがとうございました。
pythonで素数を判定

#Sympyの関数を使う(おすすめ)

```python
from sympy import isprime
isprime(11)
```


```python:実行例
print(isprime(11))
print(isprime(12))
```

```shell:実行結果
True
False
```

ただし，(理由があるのかもしれないが)引数がfloat形式だと常にFalseを返すようになるので，intに変換する必要がある

```python:実行例
print(isprime(11))
print(isprime(11.0))

#引数をint型に変換する
print(isprime(int(11.0)))
```

```python:実行結果
True
False
True
```

#関数を自作する場合


```python
import math

def isprime(x):
    if x == 1:
        return False
    if x == 2:
        return True
    for i in range(2, int(x**0.5) + 1):
        if x % i == 0:
            return False
    return True
```

```python:実行例
print(isprime(11))
print(isprime(12))
```

```shell:実行結果
True
False
```

#雑記
sympyには，素数関連の関数がいろいろある印象がした．
例えば，(a,b)の範囲に何個の素数を含まれるか，や，n番目に大きい素数を求める関数，など．
今後まとめていく予定である．
詳細は[こちら](https://www.geeksforgeeks.org/prime-functions-python-sympy/)
ChromeのCORS回避の自分用メモ

調べてよく出てくる


```
$ google-chrome --args --disable-web-security --user-data-dir
```

ではなぜか効かなかったので自分用メモ

## 使用環境
- Ubuntu 18.04
- Chrome （バージョンメモ忘れ）

## 解決策
```
$ google-chrome  --args --disable-web-security --user-data-dir --disable-site-isolation-trials
```

## 参考
https://qiita.com/KzKousaka/items/27d02c0faddc373256be
git grep警察のチャートシート

# git grepって何？

gitで管理されているファイル内を検索するコマンドです。
エディタでも検索はできますが、gitを管理しているプロジェクトでは、git grepを利用することができます。git grepを使うことによりGithubなどチームでコミュニケーションを円滑にすることができます。

# 文字検索
特定の文字を含んでいるコードを探す時についてまとめます

### 特定の文字を含む
hogeというワードを探したい場合は次のようにします。

```shell
git grep hoge
```

### 特定の文字含まない
「`-v` オプションを追加」すると特定の文字を除いた検索ができます

```shell
git grep -v hoge # hogeの文字を含まない
```

### 複数の文字を含む
#### OR検索
「`-e`オプションを追加」するとOR検索できます。

```shell
git grep -e hoge -e mew # hoge または mew を含む文字を探す
```

#### AND検索
「 `-e` オプションと `--and` オプションを追加」するとAND検索をできます。

```shell
git grep -e hoge -e --and mew # hoge かつ mew を含む文字を探す
```

個人的には `git grep` した値を `grep` することが多いです。

```shell
git grep hoge | grep mew # hoge かつ mew を含む文字を探す
```

### 正規表現をつかう
「`""`(ダブルコーテーション)で囲う」「`-e` オプションを追加」すると正規表現を扱うことができます。

```shell
# 「""(ダブルコーテーション)で囲う」
git grep "Hoge$" # 文末がHogeのものが対象になる
# 「-e コマンドを追加」
git grep -e ^Hoge # 文頭がhogeのものが対象になる
```

### 大文字小文字両方調べる
大文字小文字区別せず検索する場合は「 `-i` オプションを追加」でできます。

```shell
git grep -i hoge # hoge Hoge HOGE が対象になる
```

# ファイル検索
### 特定の文字を含むファイル

「`-l`オプションを追加」すると文字列を含んだファイル名のみを出力することができます。

```shell
git grep -l hoge # hoge を含むファイルを探す
```


### 特定の文字を含まないファイル
「`-L`オプションを追加」すると `-l` オプションとは逆に文字列を含まないファイルを検索できます。

```shell
git grep -L mew # hoge を含まないファイルを探す
```

- [特定の文字列を含まないファイルを検索する](https://qiita.com/ritukiii/items/4945d61df4a99ebe9a4e)

# 参考文系

- [Gitリポジトリ内をgrepする git grep はシンプルで超便利](https://dev.classmethod.jp/articles/useful-git-grep-command/)
kotlin オブジェクトとインターフェースで学んだこと

テキストに載っていたコードに自分なりの解釈を言葉にして付け加えてみた。
最初のcreateBucketの定義のところがちょっとしっくりきていない。
ここは戻り値がBucketなのか。
でもインターフェースBucketが戻り値ってよく意味わからないから、やっぱりBucketを実装しているってことか。
試しにcreateBucketの:Bucketを無くして実行しても同様の答えが得られ、objectの方の:Bucketを省略するとコンパイルエラーになった。
objectとは小さいクラスみたいなものらしくて、だからインターフェースの実装とかインスタンス化で使えるようになるとか、クラスと同じような特徴があるのか。
ただどういう時にクラスとオブジェクトを使い分けるのかが、いまいちまだわからないからまた勉強して、アップしていこう。

今回学んで良かったことは、thatのニュアンスを理解できたこと。
僕なりのしっくりきた解釈
thatとは、、、
「同じ種類のやつやけど、あっちのやつやで」
て感じかな。
下記のサンプルコードで言うと、
fun pourTo(that: Bucket)の「that」はBucketインターフェースを実装するobjectだけど、呼び出しに使ってるやつじゃなくて、別のあっちのオブジェクトってこと。
つまり、同じインターフェースを実装した別のオブジェクトを引数に渡してね！てことでどうでしょうか。

うん。これからもがんばろう！
建設業界の未来のために。

以下、勉強に使ったコードです。


```kotlin
interface Bucket{
    fun fill()
    fun drainAway()
    fun pourTo(that: Bucket)

    fun getCapacity(): Int
    fun getQuantity(): Int
    fun setQuantity(quantity: Int)
}

fun createBucket(capacity: Int): Bucket = object: Bucket{
    //(capacity)を引数にした、インターフェースBucketを実装した関数createBucket?は、
    //インターフェースBucketを実装したobjectである
    var _quantity = 0

    override fun fill() {
        setQuantity(getCapacity())
        //getCapacity()で得た値を引数にセット
    }

    override fun drainAway() {
        setQuantity(0)
        //0をセットする　＝　バケツの中身の水をなくす
    }

    override fun pourTo(that: Bucket) {//
        val thatVacuity = that.getCapacity() - that.getQuantity()
        //thatはバケツオブジェクトを実装するもうひとつのバケツオブジェクト
        //上記の式はもう一つのキャパシティから今入ってる水の量を引いている
        //つまり、もう一つのバケツにはあとどれくらいの水が入るか(余力があるか)を計算している
        if(getQuantity() <= thatVacuity){
            //元のバケツに入っている水の量より余力の方が大きいならば、、、
            //元のバケツの水が全て、もう一つのバケツに入り切るならば、
            that.setQuantity(that.getQuantity() + getQuantity())
            //もう一つのバケツに元のバケツの量を足して、もう一つのバケツにセット
            //つまり、もう一つのバケツに元のバケツに入っている水を足してということ
            drainAway()
            //元のバケツの水は「０」←もう一つのバケツに全部入ったから
        }else{
            //それ以外なら、、
            //つまり、元のバケツの水がもう一つに入りきらないならば、
            that.fill()
            //もう一つのバケツはいっぱいになり、
            setQuantity(getQuantity() - thatVacuity)
            //元のバケツからもう一つのバケツへ入れて残った分の水が、元のバケツに残る
        }
    }

    override fun getCapacity(): Int = capacity
    //バケツのキャパ（容量）をセット

    override fun getQuantity(): Int = _quantity
    //今入っている水の量をゲット（初期値は０）

    override fun setQuantity(quantity: Int) {
        _quantity = quantity
        //バケツに水をいれる
    }
}

fun main(args: Array<String>){
    val bucket1 = createBucket(7)
    //キャパ７のバケツ１を生成
    val bucket2 = createBucket(4)
    //キャパ４のバケツ２を生成
    bucket1.fill()
    //バケツ１を満タンにする。
    bucket1.pourTo(bucket2)
    //バケツ１（キャパ７：満タン）の水をバケツ２（キャパ４：中身０）にいれる
    println("bucket1: " + bucket1.getQuantity())
    //結果 bucket1: 3
    println("bucket2: " +bucket2.getQuantity())
    //結果 bucket2: 4
}
```
Vue.jsで子コンポーネントのイベントを親コンポーネントで実装したい場合

# Vue.jsで子コンポーネントのイベントを親コンポーネントで実装したい場合

各ページの共通ボタン付きのヘッダーをコンポーネント化し、それぞれのページの子コンポーネントとして実装することは多いかと思います。
ただ、同じヘッダーボタンでもページ毎に処理内容を変えたい等、子コンポーネントのボタンイベントを呼び出す親コンポーネント別で実装したかったのですが、どう実装するか探すのに少し苦労したため、ご参考までに。

## 子コンポーネント
```vue:child.vue
<template>
    <div class="header">
        <a @click="save" class="btn-flat-bottom-border">
            <span>save</span>
        </a>
        <a @click="add" cass="btn-flat-bottom-border">
            <span>add</span>
        </a>
        <a @click="del" class="btn-flat-bottom-border">
            <span>del</span>
        </a>
        <a @click="out" class="btn-flat-bottom-border">
            <span>out</span>
        </a>
        <a @click="setting" class="btn-flat-bottom-border">
            <span>setting</span>
        </a>
    </div>
</template>

<script>
export default {
    methods:{
        save:function(){
            this.$emit('saveChild');
        },
        add:function(){
            this.$emit('addChild');
        },
        del:function(){
            this.$emit('delChild');
        },
        out:function(){
            this.$emit('outChild');
        },
        setting:function(){
            this.$emit('settingChild');
        }
    }
}
</script>
```
## 親コンポーネント
```vuejs:parent.vue
<template>
    <div>
        <headerVue @saveChild="saveParent" @addChild="addParent" @delChild="delParent" @outChild="outParent" @settingChild="settingParent"/>
    </div>
</template>

<script>
import headerVue from '../components/header.vue'

export default {
    methods:{
        saveParent:function(){
            alert("saveボタン押下")
        },
        addParent:function(){
            alert("addボタン押下")
        },
        delParent:function(){
            alert("delボタン押下")
        },
        outParent:function(){
            alert("outボタン押下")
        },
        settingParent:function(){
            alert("settingボタン押下")
        }
    }
}
</script>
```

# 参考
https://qiita.com/shosho/items/b9b24a52dc0cc0fc33f5
Macのメニュー操作をキーボードだけで行おう


# はじめに

Macのメニューをキーボードのみで操作する方法をまとめました。
ちょっとした操作のためにマウスに手をのばすのは意外とストレスですよね。
とくに同じ操作をくり返し行うようなときは、ここで紹介した手法をおぼえても損はないと思います。

# Macはアプリのメニューにショートカット割り当てられる。

システム設定の「キーボード」でショートカットの割り当てが行えます。
意外と知られていないかもしれません。

よく使う機能にショートカットがないとき重宝しますよ。
僕の場合、Safariのメニューにショートカット`Command`+`8`を割り当てています。

![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591471/1eaa064b-8e9c-9282-bc2b-f05e479b6c8b.png)

こんなふうに、Safariのメニューにショートカットが追加されています。
（Safariの拡張機能を開発しているときによく使うメニューです）

![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591471/0306889f-064f-d8ef-60aa-d4266e7f7f24.png)

# メニュー操作は、そもそもキーボードだけでできる

そんな風に設計されているんです。

## メニュー検索機能

次のとおり、順番にタイプしてみてください。

- `Shift` + `Command` + `/` 
- メニューの名称を入力
- 絞り込まれたメニューから選択

こんな感じで、メニューの選択を行えます。

![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591471/5a32b07a-48ae-2c44-a99a-120313ec1b58.png)

この操作はMac（もしくはアプリ）の言語設定を英語にした方がやりやすいです。
これだけのためにも、OSは英語に設定すべきというのが僕の主張するところです。

## カーソルでメニュー操作

他にも、メニューにカーソルを当ててから、矢印キーでメニュー項目を選択する方法もあります。

- `Control` + `F2` でメニューにフォーカス
- カーソルキーでメニューを選択

![pic4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591471/4a46ac2c-6c8a-76aa-d82f-a567a6589cd3.gif)

ちなみにですが、「`Control` + `F8`」であれば、ステータス・メニュー(右側のメニュー)を操作することができます。

### 補足：Functionキーを押すのが面倒な場合

Karabiner等のツールを使い、オリジナル・ショートカットで代用するのも手です。
僕は 「`Control` + `8`」のようなショートカットを用意しています。
ツールの使い方は、改めて別記事で紹介しようと思います。
2DRPGドラクエ風の歩き方

#この記事を見るとできること

下の画像のような上下左右に動かす2Dゲームを作る際の歩行の向きのアニメーションを作ることができます。

![スクリーンショット 2020-05-11 23.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c5c5c20a-63d2-13b6-4e18-d10e5e612d1a.png)

#やり方
下の記事を忠実に再現すること

#参考にした記事
ゆみねこブログ
（https://yumineko.com/tkool-move/）
ElectronでMacOSのkeychainにアクセスしようとしてハマったこと

仕事ではWebアプリケーションしか作らない私。
勉強をかねてElectronでデスクトップアプリ開発をしている中でどハマりした部分を記事にしておく。

## やりたいこと
MacOSのkeychainにIDとパスワードを保存して手軽に再ログインできるようにしたい。
node-keytarを使用すれば簡単にできるとのこと
https://github.com/atom/node-keytar

## やったこと
electron-react-boilerplateで開始
https://github.com/electron-react-boilerplate/electron-react-boilerplate

```
git clone --depth 1 --single-branch https://github.com/electron-react-boilerplate/electron-react-boilerplate.git kontamProject
cd kontamProject
```

とりあえずkeytarを導入してyarn install

```
yarn add keytar
yarn install
```

下記をapp/main.dev.tsの先頭に追加して雑に動作確認する

```javascript
import keytar from 'keytar';
keytar.setPassword('kontamService', 'account', 'my-password');
keytar
  .getPassword('kontamService', 'account')
  .then(password => console.log('testing keytar', password));
```
keychainに適当な文字列を入れて、それを取り出してconsole出力できることを試したかった

で、とりあえず起動してみる

```
yarn dev
```

## ハマったこと
そうするとこんなエラーが出る

```
App threw an error during load
Error: Module did not self-register.
    at process.func (electron/js2c/asar.js:140:31)
    at process.func [as dlopen] (electron/js2c/asar.js:140:31)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:922:18)
    at Object.func (electron/js2c/asar.js:140:31)
    at Object.func [as .node] (electron/js2c/asar.js:140:31)
    at Module.load (internal/modules/cjs/loader.js:735:32)
    at Module._load (internal/modules/cjs/loader.js:648:12)
    at Module._load (electron/js2c/asar.js:717:26)
    at Function.Module._load (electron/js2c/asar.js:717:26)
    at Module.require (internal/modules/cjs/loader.js:775:19)
```

Webやっててこんなエラーは見たことがない。
割と汎用的なエラーっぽくてググってもなかなかいい答えが見つからない

## 解決法
electron-rebuildによって解決する　プロジェクトルートでinstall

```
yarn add electron-rebuild
```

そして実行

```
npx electron-rebuild
```
そうするとkeytarがリビルドされるようなメッセージが出るはず

そのあと実行

```
yarn dev
```

そうすると無事boilerplateのアプリが起動した。
コンソールには以下の出力があり、keytarが想定通り動いたことがわかる。

```
testing keytar my-password
```

## 結局何が問題だったのか
Electronのメインプロセス　つまりNode.js上で動作するパッケージはElectronのバージョンに応じてリビルドする必要があるらしい。
electron-rebuildはそういったパッケージをまとめて1コマンドでリビルドしてくれるパッケージとのこと

なかなかググっても解決法が見つからずに長時間ハマったので、この記事が他の誰かの役に立つことを祈る
Pandasなどでよく使うデータ前処理まとめ

# 内容
Pandasなどで、自分がデータ前処理時によく使う処理まとめ
何回もググっていると疲れてくるので、記事でまとめた。
--随時追加中--

# 事前設定

## pandasライブラリの呼び出し(import)
pip install pandasなどで入れておく。

```
import pandas as pd
import pandas_profiling
```

## データファイルの読み込みと書き出し

### CSV

```
df = pd.read_csv('data.csv')
```

### Excel

```
df = pd.read_excel('data.xlsx')
```

### 書き出し(CSV)

```
df.to_csv(output.csv")
```

## (jupyter notebookなどで)カラムを省略表示しない設定
下の場合だと、最大50カラムまで省略せずに表示する。

```
pd.set_option('display.max_columns', 50)
```

# データ確認・処理系


## カラム名の一斉取得

```
df.columns
```

## カラム名の変更
dictionaryで関連づけを行なってから、rename

```
dic = {'氏名':'name','性別':'sex'}
df = df.rename(columns=dic)
```



## one-hot-encoding

```
pd.get_dummies(df,columns=['Sex'])
```

## データ型の確認

```
df.dtypes
```

## データ型の変換
下の例だと、columnAのデータ型をint型に変換している。

```
df['columnA'] = df['columnA'].astype('int64')
```

## ユニークな値の導出
下の例だと、nameカラムのユニークな値を全て出力する

```
df['name'].unique()
```

## ユニークな値とその出現数のカウント
下の例だとnameカラムのユニークな値とその回数を出力する。
データ数が多いとカウントにそれなりに時間がかかるので、さっとユニーク値を確認するだけなら、上記のunique()の方が良い。

```
df["name"].value_counts()
```

## 複数列をカラム名を指定して取得

```
df = df[['ColumnA', 'ColumnB', 'ColumnC']]
```

## カテゴリ変数を任意の数値化

```
df['categoryA'] = df['categoryA'].map({'a':3,'b':2,'c':1,'d':0})
```



## 統計量の算出

```
df.describe()
```

# データ統合

## 縦方向にジョイン
カラムなどが一致しているデータ同士を縦方向にジョインする。

```
out = pd.concat([df1, df2])
```

## 横方向にジョイン
左、右、外部、内部結合などあるが、書き方は同じ、
左外部結合ならleft

```
out = pd.merge(df1,  df2, on='キーとなるカラム名', how='left')
```

## 集計(groupby)
### 集計したいカラム名でカウントしたい場合

```
groupby_ex = data.groupby('[target_column]').size()
```

### 複数のカラムで集計したい場合

```
groupby_ex_multi = data.groupby(['[target1]', '[target2]']).size()
```


# 欠損値系

## 欠損値の確認
これで、各カラムの欠損値が確認できる。

```
df.isnull().sum()
```

逆にきちんとデータが入っている数の確認はこちら

```
df.notnull().sum()
```

## 欠損値が少ないカラムのみ利用する場合
下の例だと欠損値の値が500以下のカラムは採用する。

```
df_new = pd.DataFrame()
for column in df.columns:
    if df[column].isnull().sum() <= 500:
        df_new[column] = df[column]
```

## 欠損値の処理

### NaNの値は全て0埋め

```
df = df.fillna(0)
```

### 列ごとに異なる値で埋める
dictionaryで記載すると、複数の列のNaNをそれぞれ固有の値で埋めることができる。

```
df = df.fillna({'columnA':0, 'columnB':100})
```

### とあるカラムがNaNの時に行ごと消す
下の例だとcolumnAの値がNaNの行ごと消す。

```
df = df.dropna(subset=['columnA'])
```

### とある文字列などが含まれている行を消す
下の例だと、IDというカラムに'U'が含まれている場合にその行を消す。

```
df = df[~df['ID'].str.contains('U')]
```

## 正規表現
### 特定の文字列の間の文字列を抽出して列生成

```
def extract_test(x):
    return re.search('(?<=left_str).*(?=\right_str)', x).group()
df["new_column"] = df["org_column"].apply(extract_test)
```



## 可視化系(matplotlib)
### 日本語ライブラリのインストールと呼び出し

```
# %%bash
# pip install -q japanize-matplotlib

import japanize_matplotlib

```


## 可視化系(seaborn)
### ライブラリのimport

```
import seaborn as sns
```
### ヒートマップの表示(相関関係)

```
sns.heatmap(df.corr())
```
【Day69】積み上げ日記

##学習したポイント
■AutoLayoutの実装方法
■タイマーアプリのマルチデバイス対応実装
■アップルストア公開準備
−スクリーンショット
−エラー確認

##参考記事
■AppStore公開準備>Archive>エラー番号：90717
https://www.it-swarm.dev/ja/ios/%E3%82%A8%E3%83%A9%E3%83%BCitms90717%EF%BC%9A%E3%80%8C%E7%84%A1%E5%8A%B9%E3%81%AAapp-store%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%80%8D/833784541/
Nuxt.js(SPA)、Nginx構成でハマったこと

# はじめに
どうも@chan_kakuです
今回はタイトルにもあるようにNuxt.jsをSPAモードとして利用し、リバースプロキシとしてNginxを利用した場合にハマたことがありましたので、共有しようと思います。
今回のことは英語の記事でも出てこなかったので、皆さんの助けになればと思います。

# どこでハマったのか？
結論から言うと`<nuxt-link>`でのルーティング周りでハマりました。

## 具体的には？
これを観た方はそんなところでハマらんやろと思ったかもしれないです。
そうです。多分ハマらないかもしれません。また、リバースプロキシを使っていない場合もハマらなかったのです。

**問題の記述**

```vuejs:Old.vue
<tempalte>
// ~ 省略 ~
  <nuxt-link to='/'>home</nuxt-link>
  <nuxt-link to='hoge1'>hoge1</nuxt-link>
  <nuxt-link to='hoge2'>hoge2</nuxt-link>
  <nuxt-link to='hoge3'>hoge3</nuxt-link>
// ~ 省略 ~
</template>
```
このような感じで、内部の遷移を定義していました。
直接`https://(baseUrl)/`にアクセスした場合は問題なかったのですが、例えば、直接`https://(baseUrl)/hoge1`にアクセスした後、hoge2リンクを踏むと、`https://(baseUrl)/hoge1/hoge2`となってしまってました。
その際のNginx側の設定は以下のように[Vue RouterのHistory modeでの配信のやり方](https://router.vuejs.org/guide/essentials/history-mode.html#example-server-configurations)を参考にしていました。

```default.conf
location / {
  try_files $uri $uri/ /index.html;
}
```

# 解決方法
`<nuxt-link>`のtoのvalueに`/`を追加しました。

```vuejs:New.vue
<tempalte>
// ~ 省略 ~
  <nuxt-link to='/'>home</nuxt-link>
  <nuxt-link to='/hoge1'>hoge1</nuxt-link>
  <nuxt-link to='/hoge2'>hoge2</nuxt-link>
  <nuxt-link to='/hoge3'>hoge3</nuxt-link>
// ~ 省略 ~
</template>
```
## 何故気づいたのか
調べ方が分からずひたすらNginx側の設定について調べてました。
すると今回とは直接的には関係なかったのですが、Nginxのproxy_passで気になるこのような記事を見つけました。
https://www.xmisao.com/2014/05/09/nginx-proxy-pass.html
また、こちらのNuxtの公式ドキュメントでは`<nuxt-link>`のtoに`/`を入れていたため、試しに修正してみるとうまく行きました。

実際ちゃんとドキュメント通りやっていればハマらなかったところでした、、、

# 最後に
もしかして、Nginx側の設定を変更することで、`/`を追加しなくても期待通りの動作ができたかもしれません。
Nginx詳しい方いらっしゃいましたらコメントいただければと思います。
Material-UIのTextFieldにエンターキー押下時の処理を追加する

Material-UIのTextFieldでエンターキーを押したときに、フォーカスを外したり入力内容をstateに保存するactionをdispatchしたり等、何らかのイベントを発火したいことがあります。が、TextFieldのAPIにはキー押下時のイベントが用意されていないので、自分で追加する必要があります。

[公式ドキュメント](https://reactjs.org/docs/events.html#keyboard-events)によると、Reactにはキー入力に関するイベントは、onKeyDown・onKeyPress・onKeyUpの3つが用意されており、それぞれJavaScriptのonkeydown・onkeypress・onkeyupに対応します。エンターキーの場合はonKeyDownでもonKeyPressでもいいのですが、onKeyPressを使った場合はkeyCodeが取得できないので(常に0になる)、注意が必要です。特別な理由が無い限りはonKeyDownを使う方がいいでしょう。

```Javascript
<TextField
  id="standard-basic"
  onKeyDown={e => {
    if (e.keyCode === 13) {
      // エンターキー押下時の処理
      console.log(e.target.value);
    }
  }}
/>
```

もしくはonKeyPressを使う場合は、

```Javascript
<TextField
  id="standard-basic"
  onKeyPress={e => {
    // e.keyCodeは常に0になる
    if (e.key === 'Enter') {
      // エンターキー押下時の処理
      console.log(e.target.value);
    }
  }}
/>
```

エンターキーが押された時にフォーカスを外す場合は次のコードのようになるでしょうか。

```Javascript
<TextField
  id="standard-basic"
  onKeyDown={e => {
    if (e.keyCode === 13) {
      e.target.blur();
    }
  }}
  onBlur={e => {
    // フォーカスが外れた時の処理
    console.log(e.target.value);
  }}
/>
```
【Day68】積み上げ日記

##今日学んだポイント
■Firebaseの実装方法

■iosアプリのアイコン設定
①画像用意
－正方形
－180ピクセル（60pt * 3)
－png拡張子のみ
②Xcode > Assetsファイル > AppIcon > 60pt * 3　にセット

##参考記事
https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/
Ubuntu2004


# もう日本語版のRemixがUpされていたのでリリースノートを見てみた
[日本語版dl](https://www.ubuntulinux.jp/download/ja-remix)

英語版はリリース直後にVBoxに入れてみたけど、インストールには特に1804から大きな変更は感じなかった

## 気づいたところ

大きな違いはkernelが5.4になったことで対応ドライバが増えていることかな。
→intel UHD630にも1804ではうまく動かなかったのが、対応しているはず（未検証）


Python3がデフォルトになった。
→Python2つかうのが手間になった。パッケージにPython2は含まれてないので、インストールの必要がある

PostgreSQL12になった。
→Updateしてもそれほど問題は起きなさそう。JSON系対応などが少しずつされてきている。

Raspberry Piのほとんどをサポート
→Ver4でUbuntuを使えそう

Vagrantのディスクサイズが10Gから40Gになった。
→VBox使うときのディスクサイズも40Gにした方がいいのかな。

省電力になった
→ほんと？アイドル時の改善のことかもしれない。
【Day67】積み上げ日記

##今日学んだポイント
■パスワードの非表示方法

■Lotieって？
－AIrbnb社が開発したライブラリ
－アニメーション実装時に用いるライブラリ

■アニメーション実装の手順
https://techblog.zozo.com/entry/swift-lottie

・アニメーションの実装は、2つのパターンがある。
①手書きで書く
②JSON形式で継承してそのまま使う　

■デリゲートメソッドについて
https://hiroslog.com/post/282