OmniAICreator/Qiita-1.07M huggingface dataset:
javaでM-SOLUTIONS プロコンオープン 2020を解く

M-SOLUTIONS プロコンオープン 2020お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/m-solutions2020)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/msolutions2020)
結果はA-DまでACできました。なんとか4問ACでした、問題Dに苦戦しました・・・

以下簡単に解説します。

##[問題A](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_a)

特定の点数の時に何級という条件を求める問題。
そのままif文でもいいですが、よく見ると200点区切りになっているので、
点数を200で割った余りを10から引くと簡単に求められます。

##[問題B](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_b)

数字が3つ与えられて、数字を倍にする操作をK回以内に
赤の数字＜緑の数字＜青の数字・・・(条件*)
にできるかという問題。

数字が7以下だったので、もう単純に条件*を満たすための操作数をカウントして、Kと比較して回答しました。

##[問題C](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_c)

テストの点数が直近K回の掛け算で与えられ、テストの点が上がったかを判定する問題。
直近K回の掛け算といっても、かけられるK個の数のうちK-1個は共通です。

```math
A × B × C × D \\
B × C × D × E
```

上の図の場合、AとEを比較すればOKです。

##[問題D](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_d)

株価の変動が与えられ、どれくらい儲けられるかという問題。
いまいち解き方には自信がないのですが、これも期間が80ということで、地道に解きました。

- 株価の極小値を求める
- 持っている金額で株価を買う
- 株価の極大値を求める
- 持っている株を全て売り払う

というのをwhile文でループさせました。

あと、これ桁あふれでWAになりましたので、longに変えました。
なかなか桁あふれするって気づかなかったです。

##[問題E](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_e)

正答率低かったので問題も読んでいません、、、

##[問題F](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_f)

200000という制約が無理！
N^2の計算量であれば解けましたが・・・まあ間に合わないでしょう。

----

### 感想

めっちゃ久しぶりに参加できました。。やっぱり楽しいですね。
レーティングは978→967とサボってたツケが回ってきましたかね・・・次回で1000奪還したい:cry:

E問題が難しいのもあって、D問題までのスピードがいまいちだったのも残念、、

最後まで読んでくださり、ありがとうございます！
競技プログラミング練習記 No.54【M-SOLUTIONS プロコンオープン 2020】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[M-SOLUTIONS プロコンオープン 2020](https://atcoder.jp/contests/m-solutions2020)に参加しました。
4完です！

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  2min |-| 4ms|
| B |  3min |貪欲法| 6ms|
| C |  4min |しゃくとり法| 40ms|
| D | 13min |貪欲法| 6ms|

# まとめ
先にまとめを載せます。これ自体は最後に書いてます。

青Performanceを初めてとりました。嬉しい。

その時点での最善手を繰り返すことを貪欲法といいます。
（名前は知っていて使ってもいたのですが、正しい定義を知りませんでした)

C問題
評点についてはひとつ前の学期からの比較ができればいいです。
つまり、実際の値を求める必要はありません。


## A - 	Kyu in AtCoder
```c++
  int x;
  cin >> x;
  cout << 10 - x / 200;
```
級位は200刻みで変わるので、`x`を200で割った切り捨ての値を使うと解けそうですね。
今回はうれしいことに、同じ級位のレーティング内では200で割った切り捨ての値は変わりません。
そのため、そのまま`x / 200`という値を使えます。
（例えば`[400, 599]`という範囲ではなくて`[501, 700]`という範囲だった場合、`(x - 101) / 200`のような調整が必要です。）
8級の時に合わせて`10`から引く調整をして答えになります。


## B - 	Magic 2
``` c++
  int a, b, c, k;
  cin >> a >> b >> c >> k;
  int cnt = 0;
  while(a >= b)
  {
    b *= 2;
    cnt++;
  }
  while(b >= c)
  {
    c *= 2;
    cnt++;
  }
  cout << (cnt <= k ? "Yes" : "No");
```
その時点での最善手を繰り返すことを貪欲法といいます。
`A < B < C` の状態になるように実際に操作して、その時の操作回数を`K`と比較しました。
「真に」大きいとあるので、不等号の書き方に注意です。

## C - 	Marks

``` c++
  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> a[i];
  }

  for(int i = 0; i < n - k; ++i)
  {
    cout << (a[i] < a[i + k] ? "Yes" : "No") << endl;
  }
```
`K+1 <= i <= N` となるすべての`i`を試すと`O(NK)`となり、制約より時間内に解けません。

また、`A_i = [1, 10^9]`なので評点を直接求めようとするととても大きな数字になってしまいます。
最大で`10^(9 * 200000)`程度になってしまいます。
あまり詳しくないのですが、桁に上限がないpythonでもこれは表せないのではないでしょうか。。。

この問題で使うのはしゃくとり法です。(評点を直接は求めないので厳密には違うかもしれません)

評点についてはひとつ前の学期からの比較ができればいいです。つまり、実際の値を求める必要はありません。
学期がひとつ進むと、評点の要素は`i`番目が消えて`i + K + 1`番目が新しく追加されます。
つまり、これまでの評点から「`i`番目の要素」を割って「`i + K + 1`番目の要素」をかけた数が新しい要素になります。
これを比較するには、「`i`番目の要素」と「`i + K + 1`番目の要素」の大小を比較すればいいですね。

こうすることで`n - k`回の比較で済み、実際の評点を求めなくても答えがわかります。

## D - Road to Millionaire
``` c++
  ll n;
  cin >> n;
  vector<ll> a(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> a[i];
  }

  ll val = 1000;
  ll min_val = a[0];
  ll max_val = a[0];
  a.erase(unique(a.begin(), a.end()), a.end());
  for(int i = 1; i < a.size(); ++i)
  {
    if (a[i - 1] > a[i])
    {
      val += (val / min_val) * (max_val - min_val);
      max_val = min_val = a[i];
    }
    max_val = max(max_val, a[i]);
    min_val = min(min_val, a[i]);
  }

  val += (val / min_val) * (max_val - min_val);
  cout << val;
```

株価が安いときに買って高いときに売れば利益が出ます。

株価が単調減少を続けている間は待って、株価が上がる直前に買えば株を安くたくさん買えます。
そして、単調増加を続けている間は待って、株価が下がる直前に売れば売却額は大きくなります。
つまり、株価が下がるまで待って、下がったときに「これまでの最安値」で買って「下がる前の価格」で売ると利益を最大化できます。
その時の買値と売値の差額が利益になります。

表現がおかしいですが、「株価が下がったとき」に買って売るようにします。
買わないほうが良い場合もあるためです。
この方針で貪欲に実装すれば答えが出ます。

以上です。ありがとうございました。
【JavaScript入門】カウントダウンタイマー

## はじめに
ECサイトを作成する際、
・期間限定のセールで残り時間を表示したい
ソーシャルゲームを作成する際、
・限定ガチャやボスが逃げるまでの残り時間を表示したい
と思うことあると思います。
今回は、そんな機能についてご紹介します。

## 方法
今回は、jQueryを使用して作成します。

```html:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
```

カウントダウンタイマー機能を作成します。

```html:JavaScript
<script>
  var timerId;
  // カウントダウンの終了日
  var endDateTime = new Date("2021/07/23 20:00:00");
      
  // カウントダウン機能
  function countDownTimer() {
    var startDateTime = new Date();
    var remaining = endDateTime - startDateTime;
    
    // カウントダウン後、id="contents"の部分の表示を変更 
    if (remaining < 0) {
      $("#contents").html('東京オリンピック開催中です');
      // 繰り返し動作を停止(setIntervalで設定したタイマーをクリア)
      clearInterval(timerId);
      return 
    }
        
    // 1日の秒数
    var daySeconds = 24 * 60 * 60 * 1000;

    // 残り日数
    var remainingDays = Math.floor(remaining / daySeconds);
    // 残り時間
    var remainingHrs = Math.floor((remaining % daySeconds) / (60 * 60 * 1000));
    // 残り分数
    var remainingMin = Math.floor((remaining % daySeconds) / (60 * 1000)) % 60;
    // 残り秒数
    var remainingSec = Math.floor((remaining % daySeconds) / 1000) % 60 % 60;
        
    $("#TimeRemaining").text(remainingDays + '日' + remainingHrs + '時間' + remainingMin + '分' + remainingSec + '秒');
  }
        
  // 一定時間ごとに関数countDownTimer()を呼び出す
  $(function() {
    // 1秒刻みで表示させたいので、1000以下に設定  
    timerId = setInterval('countDownTimer()',1000);
  });
</script>
```

```html:html
<div id="contents">
  <p>東京オリンピックまで</p>
  <p id="TimeRemaining"></p>
</div>
```
これで機能としては完成です。
あとは、見栄え良くご自身でデザインしましょう。

## 参考
[東京オリンピック](http://tokyo-olympics-2020.com/)
[jQuery](https://techacademy.jp/magazine/9444)
[Math.floor](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/floor)
[Javascriptのタイマー処理　setIntervalとsetTimeout](https://qiita.com/chihiro/items/b105a901bbfd6c5b483c)
Raspberry Pi の OS を最新の安定版にアップデートする（2020年7月版）

このエントリーもいずれ古くなります。可能な限り公式ドキュメント[^1]を直接参照してください。

**「Raspberry Pi アップデート」と検索して上位に表示されるサイトの多くが間違ったことを書いています。**くれぐれもその通りに実行しないでください。これについては後述します。

# アップデート手順

### 1. システムのパッケージリストを更新
```
$ sudo apt update
```

### 2. インストール済みパッケージ全てを最新版にアップグレード
```
$ sudo apt full-upgrade
```

以上で更新は終わりです。カーネルおよびファームウェアは Debian のパッケージとしてインストールされているため、上述の手順に伴い更新されます。

### (オプション) パッケージのキャッシュを削除
```
$ sudo apt clean
```
インストール時にダウンロードされる .deb ファイルのキャッシュが数100 MB に及んでいることがあります。ストレージ容量が不足している場合には削除しておくと安心です。

# 技術系の情報を日本語で検索するリスク
Raspberry Pi をアップデートする方法は検索すればいくらでも出てきます。しかし、その多くが**公式ドキュメントで推奨されていない危険な方法**を紹介しています。

2020年7月時点での「raspberry pi アップデート」によるGoogle検索結果です。ここに表示されている**上位3件のページ全てで**間違った方法を紹介していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154885/7d9ac263-797f-6aec-ec18-2d18dff444d3.png)

間違っている点は複数ありますが、とりわけ危険なのはこれら全てで 
`sudo rpi-update` を手順に含んでいることです。

公式ドキュメント[^2]には以下のように記述されています。

> `rpi-update` is a command line application that will update your Raspberry Pi OS kernel and VideoCore firmware to the latest pre-release versions.

> **WARNING: Pre-release versions of software are not guaranteed to work. You should not use `rpi-update` on any system unless recommended to do so by a Raspberry Pi engineer. It may leave your system unreliable or even completely broken. It should not be used as part of any regular update process.**

`rpi-update`はカーネルとファームウェアを**最新のプレリリース版**にアップデートするコマンドです。プレリリース版は動作保証されておらず、 **Raspberry Pi のエンジニアにより推奨された場合をのぞいて実行すべきでない**と警告されています。

技術系の分野において、一次情報はほとんどの場合英語です。日本語による検索結果はしばしば情報が古かったり、伝言ゲームで間違った情報が記載されていることがあります。

可能な限り、英語の公式ドキュメントを最初に当たりましょう。また、それでも日本語で検索してしまった人のために、このエントリーが上位に表示されるよう、LGTMなどで支援していただけると非常に助かります。

[^1]: [Updating and upgrading Raspberry Pi OS \- Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/computers/os.html#updating-and-upgrading-raspberry-pi-os)

[^2]: [rpi\-update \- Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/computers/os.html#rpi-update)
AtCoder 生活　92日目

[前回](https://qiita.com/flandrescarlet237/items/ac49f1174ce4ed065e93
)

#92日目
今回はM-SOLUTIONS プロコンオープン 2020に参加しました。

![スクリーンショット 2020-07-25 22.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/1ea71383-16b8-cdd7-9829-fbb49a314056.png)



##[M-SOLUTIONS プロコンオープン 2020](https://atcoder.jp/contests/m-solutions2020)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int x;
    cin >> x;
    if(x < 600)cout << 8 << endl;
    else if(x < 800) cout << 7 << endl;
    else if(x < 1000)cout << 6 << endl;
    else if(x < 1200)cout << 5 << endl;
    else if(x < 1400)cout << 4 << endl;
    else if(x < 1600)cout << 3 << endl;
    else if(x < 1800)cout << 2 << endl;
    else cout << 1 << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int a,b,c,k;
    cin >> a >> b >> c >> k;
    int cnt = 0;
    while(a >= b){
        b *= 2;
        cnt++;
    }
    while(b >= c){
        c *= 2;
        cnt++;
    }
    if(cnt <= k)cout << "Yes" << endl;
    else cout << "No" << endl;
}

```

###C

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,k;
    cin >> n >> k;
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    rep(i,n-k){
        if(a[i] < a[i+k])cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

```

###D

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    vector<ll> a(n);
    rep(i,n) cin >> a[i];
    ll mon = 1000LL;
    ll k = 0LL;
    rep(i,n-1){
        if(a[i] < a[i+1]){
            k += mon/a[i];
            mon %= a[i];
        }
        else{
            mon += k*a[i];
            k = 0;
        }
    }
    mon += k*a[n-1];
    cout << mon << endl;
}

```

###最後に
初めてこんなに上の順位に来れたことが嬉しい！
D問題までを40分で解けたことで自分がレベルアップできている気がする。
次のコンテストもこれぐらいいい成績を残したい。
AtCoder M-SOLUTIONS プロコンオープン 2020 参戦記

# AtCoder M-SOLUTIONS プロコンオープン 2020 参戦記

## [m-solutions2020A - Kyu in AtCoder](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_a)

4分で突破. 書くだけ……だったが、4分もかかってしまっていると、さすがに素直に200で割って処理すべきだったと反省.

```python
X = int(input())

if 400 <= X <= 599:
    print(8)
elif 600 <= X <= 799:
    print(7)
elif 800 <= X <= 999:
    print(6)
elif 1000 <= X <= 1199:
    print(5)
elif 1200 <= X <= 1399:
    print(4)
elif 1400 <= X <= 1599:
    print(3)
elif 1600 <= X <= 1799:
    print(2)
elif X >= 1800:
    print(1)
```

## [m-solutions2020B - Magic 2](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_b)

3分で突破. 2倍なら素直にループを回しても大丈夫だろうと、素直に書き下ろした.

```python
A, B, C = map(int, input().split())
K = int(input())

while A >= B:
    K -= 1
    B *= 2

while B >= C:
    K -= 1
    C *= 2

if K >= 0:
    print('Yes')
else:
    print('No')
```

## [m-solutions2020C - Marks](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_c)

13分半で突破. TLE1. 固定窓だと思った私がアホでした. なまじ TLE になるものの計算は出来てしまうのが裏目になってしまう Python だった.

```python
N, K = map(int, input().split())
A = list(map(int, input().split()))

result = []
for i in range(K, N):
    if A[i] > A[i - K]:
        result.append('Yes')
    else:
        result.append('No')
print(*result, sep='\n')
```

## [m-solutions2020D - Road to Millionaire](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_d)

18分半で突破. DP だろうけど、どう DP 回せばいいんだろうなとそこそこ悩んだ. N≤80 なので *O*(<i>N</i><sup>2</sup>) でも大丈夫なので、全ての売り買いパターンの最大値を取ればいいだけだった.

```python
N = int(input())
A = list(map(int, input().split()))

t = [-1] * (N + 1)
t[0] = 1000
for i in range(N):
    k = t[i] // A[i]
    y = t[i] % A[i]
    for j in range(i, N):
        t[j + 1] = max(t[j + 1], k * A[j] + y)
print(t[N])
```

## [m-solutions2020E - M's Solution](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_e)

突破できず. 途中で順位表を見て F の方が簡単なことに途中で気づいたが、気づいた時点では時間的に手遅れ. 正しい答えが出るナイーブなコードは書けたが、そこから計算量を減らせず.
入力されたパスをファイルのリストに展開して出力するWSH(JScript)

# 概要
フォルダのリストからファイルのリストに展開するツールが欲しく、真面目にWSH + JScriptで作ってみた。
標準入出力を使ったコンソール ツールとして、割と普通のがWSHできたので、記載する。

(追記)
WSHがシステム文字コードで動いているせいで、ファイル システム上は使えるけどリスト化出来ないファイル名が多数あり、結局.NET(C#)で作りなおした。そのため、**WSH使えねー・・・** という感想に変わりました。

# スクリプト
~~結構真面目にコメントとかも書いていたら、300行近くになってて驚いた。
長いので後述。~~

(追記) 以下に掲載

* libraplanet / expandf - Bitbucket  
https://bitbucket.org/libraplanet/expandf/

# 使用例
* スクリプト名：**expandf.js**
* オプション：コマンドの引数で指定
* フォルダ リストの入力：標準入力
* ファイルリストの出力：標準出力

## カレント ディレクトリ配下のファイル一覧を出力①
`dir /s /b /A-D` に近い結果。

```sh:command
echo %CD% | cscript.exe /nologo expandf.js
```

## カレント ディレクトリ配下のファイル一覧を出力②
* `-/` ⇒ ディレクトリ セパレーターをスラッシュ(/)に置き換える。
* `-lf` ⇒ 改行コードを `LF` で出力する。
* `> output.txt` ⇒ 出力内容を **output.txt** に出力。

```sh:command
echo . | cscript.exe /nologo expandf.js -/ -lf > output.txt
```
```text:output.txt
./dir0/aaaa.txt
./dir0/bbbb.txt
./dir1/cccc.txt
./dir1/dddd.txt
./eee.txt
```

Linuxとかとの連携で使えそう。

## テキストの内容を展開してファイルの一覧を出力
* `-\` ⇒ ディレクトリ セパレーターをバック スラッシュ(\\)に置き換える。

```sh:command
type input.txt | cscript.exe /nologo expandf.js -\
```

```text:input.txt
./dir0/
./dir1/
```
```text:出力イメージ
.\dir0\aaaa.txt
.\dir0\bbbb.txt
.\dir1\cccc.txt
.\dir1\dddd.txt
```

## EmEditorのコマンドで実行し、一覧を新規ウィンドウで開く (★本命)

* EmEditorの外部ツールに追加
* `-/` ⇒ ディレクトリ セパレーターをスラッシュ(/)に置き換える。
* **[入力]** は **[文書]** もしくは**[選択テキスト]**
* **[EOF(Ctrl+Z、U+001Aまたは1AH)を追加]** にチェック
  ※ 空文書のときに標準入力待ちになってしまう対策
* **[出力]** は **[新規文書作成]**
* **[エンコード]** は **[システム規定]**  
  ※ WSHの仕様
* **[標準エラー]** は **[アウトプット バーとして表示]**  
* **[終了時に閉じる]** はチェックしておくと良い。  
  (エラーがない場合はアウトプット バーが自動で閉じる)

※ Meryも同様の設定で利用できる

![外部ツール - emeditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/6608180d-d0dd-abc8-cd34-600188595fd1.png)
![実行イメージ - emeditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/0761bdc7-aa5b-5702-772f-68df95c4d194.png)

テキスト ファイルの記載順にリスト化するので、dirなどでリスト化した場合の順番などの打ち手にもなる。

# 雑記①
DLNAやandroidで使うプレイリストの定期的なメンテのために、リスト アップ済みのフォルダのリストからファイルのリストを生成するツールが欲しいと思っていて。GUIで何か作るよりも、テキスト エディタとの連携で何か出来ないか、と思って作ってみた。特にディレクトリ セパレータや改行コードは毎回置換・変換が発生していて、何かと辛かったので。。。

『車輪の再発明をするな』の定説に則り、本当に自分に欲しい環境は何かを悩んでみたけど。エディタの外部ツールやWSHには他にも利用用途の可能性はありそうだなぁと思った。

WSHは標準入出力周りが貧弱で痛い目をみたことがあり、少し躊躇するところだったが、それなりものが出来たのは一応良かった。ただ、実行文字コードがOS依存と言う化石的実行形式なのか、UNICODE文字は処理出来ないと言うギャグ的状況は、やっぱり微妙なところ。。。もっとも、今回はあくまでもファイル・フォルダを扱う目的だったので、S-JIS範囲外の文字を使うこともあまりないので、その辺りは一旦割り切って良さそうに思えた。NBSPやZWSPとか普通に処理されても困るし。

もう少し使ってみて、次のブラシアップに繋げたい。

# 雑記② (追記2020/07/27)
結局 .NET(C#) で書き直した。

ファイル名のアクセント記号が使えない運用にすると、**日本語文字もファイル名にはNG** になってしまうため。ルールに一貫性なくなってしまい、あまり都合が宜しくなかった。(コンピューター文化に於いては、欧州文字以上に、ラテン語文化から離れている日本語文字の方が異常。)
また、WAVE DASH問題でWindowsが割当をやらかしているせいで ``WAVE DASH (U+301C)`` がエラーになってしまう。``全角チルダ(U+FF5E)`` なら使えるが、本当にそれで良いのか？？？:thinking:

と悩み始め、**メディア ファイルの整理目的で使うツールではUNICODEでないのは無理がある** と言う結論に至った。

UNICODE化の重要性を改めて痛感した。

# 謝辞
* EmEditor (テキストエディタ) - Windows用テキストエディター
  https://jp.emeditor.com/

* Haijin Boys Online (Meryの作者のサイト)
  https://www.haijin-boys.com/
Excelを一太郎に変換するVBScript

#概要
　Excelを一太郎に変換するというニッチな需要に応えるものです。
　もちろん、お使いのパソコンに一太郎が入っていなければ使えません。

　現在のエクセル拡張子(xlsx,xlsm)は一太郎で開けなくなったので、以前のバージョン(xls)を経由して変換します。
　なので、以前のExcelでサポートされていない部分にエラーが出ます。たとえば、日付が令和なのに平成になったりします。
　右の方の列が省略されてしまうときは、列幅を狭くして実行してみてください。

#スクリプト
```VB:VBScript

Option Explicit
Dim excelFilePath
    If Wscript.arguments.Count = 0 Then
        MsgBox "一太郎に変換したいExcelファイルをドラッグ＆ドロップしてください"
        Wscript.Quit
    Else
        excelFilePath = Wscript.arguments(0)
    End If
Dim excel, excelBook
Set excel = CreateObject("Excel.Application")
excel.Visible = True
Set excelBook = excel.Workbooks.Open(excelFilePath)
        Dim withoutExtensionPath
        withoutExtensionPath = Split(excelFilePath, ".")(0)
    If Split(excelFilePath, ".")(1) <> "xls" Then
        excelBook.SaveAs withoutExtensionPath & ".xls", -4143
    End If
excelBook.Close False
Set excel = Nothing
Dim taro
Set taro = CreateObject("JXW.Application")
taro.TaroLibrary.OpenDocument (withoutExtensionPath & ".xls")
```
NameError in Incomes#index のエラー

家計簿アプリ作成の上で 

**NameError in Incomes#index**　

のエラーが出ました


```index.html.erb
<% @page_title = "収入科目一覧" %>
<h2><%= page_title %></h2>

<% if @incomes.present? %>
<table>
    <thead>
        <tr>
            <th>科目名</th>
            <th>備考</th>
        </tr>
    </thead>
    <tbody>
        <% @incomes.each do |income| %>
            <tr>
                <td><%= income.name %></td>
                <td><%= income.description %></td>
            </tr>
        <% end %>
    </tbody>
</table>

<% else %>
    <p>登録されている科目がありません</p>
<% end %>

```

よく見てみると、、、

2行目のpageの前


**@**


が抜けているではないか。


```index.html.erb

<h2><%= @page_title %></h2>

```


これで無事エラー解消です。
タイプミスとか、少しの抜けとかでエラーになっちゃうから困りますよね、プログラミングというものは。

初心者の私は特に。


エラーと闘いながら、今後も引き続き頑張ります
SQLの実行順番

以下のような順番で実行される。


実行順番| 項目      |       SQL |
|:--|:-----------------|------------------:|
| 1| テーブルの指定      |    FROM  |
| 2| 結合              |            ON / JOIN |
| 3| 取得条件          |              WHERE |
| 4 | グループ化         |                GROUP BY |
| 5| 関数              |             COUNT / SUM / AVG / MIN |
| 6| HAVING           |           HAVING |
| 7| 検索　　　　　　　　|           SELECT / DISTINCT |
| 8| 順序              |           ORDER BY |
| 9| LIMIT            |           LIMIT |

取得するテーブルを形成してから検索をする。
WHEREはグループ化される前のテーブル全体を検索対象にする。
HAVINGはGROUP BYによってグループ化されたデータを検索対象とする。
【Figma】#1 便利コマンドまとめ

##基本操作コマンド
**F** -- フレームの新規作成
**スペースキー** -- 画面上を移動
**⌘+** -- 拡大
**⌘-** -- 縮小
**V** -- 移動
**K** -- スケール（線・テキストの比率を保持して拡大縮小する）
**⌘G** -- グループ作成
**⌘ sift G** -- グループ解除

**フレームはグループより高機能**
・ コンポーネントは基本的にフレームで作成する
・ フレームからはみ出したオブジェクトを表示・非表示にできる
・ レイアウトグリッドが使える

##図形関連コマンド
**R** -- 長方形
**L** -- 線
**↑L** -- アロー線
**O** -- 円
**sift H** -- 左右反転
**sift V** -- 上下反転
**P** -- ペンツール

**パスについて**
・ Figmaは1つのポイントに対して2つ以上のパスをつなげる事ができる
・ ミラーアングル機能がある（パスの左右バーを角度や長さを自由にできる or 均等にする）

##便利コマンド
**T** -- テキスト
**⌘ sift O** -- パスとテキストのアウトライン
**⌘ option G** -- 選択しているオブジェクトをフレーム化

##画像の編集
**⌘ shift K** -- 画像の配置（画像を複数選択もできる）
**⌘ control M** -- マスクの作成 （マスクを使用する場合はグループ化をした上で行うと良い）

**画像の配置効果**
・ **Fill** -- 上下左右100%配置
・ **Fit** -- 上下左右どちらか100%
・ **Crop** -- 自由にトリミングできる
・ **Tile** -- リピート処理
pip installで UnicodeDecodeErrorが出たときの対処方法（python3.7以降）

backtesting.pyをpipでインストールしようとしたところ、下記のような UnicodeDecodeErrorが出てハマったので
対処法を残しておきます。

```
python -m pip install backtesting
(中略)
UnicodeDecodeError: 'cp932' codec can't decode byte 0x94 in position 4437: illegal multibyte sequence
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

Python3.7から導入された環境変数「**PYTHONUTF8**」を1にセットすることで、locale.getpreferredencoding()のデフォルト値ががutf-8に設定されます。（[公式ドキュメント](https://docs.python.org/ja/3/using/windows.html?highlight=utf#utf-8-mode)）。

```
set PYTHONUTF8=1
```
なお、PYTHONUTF8と同じ機能は、過去バージョンにおいては```python -X utf8 xxxx.py```でも実現できているのですが、```python -X utf8 -m pip install ～```はうまくいきませんでした。
InfluxDBを操作する

# InfluxDBとは
オープンソースの時系列データベース

# データベースの操作
基本的に、RestAPIで操作するようです。
[こちら](https://docs.influxdata.com/influxdb/v1.8/tools/api/#influxdb-1-x-http-endpoints)のサイトにドキュメントがあります。これに沿って使ってみます。

## データベースを作る

```bash
$ curl -XPOST 'http://localhost:8086/query' --data-urlencode 'q=CREATE DATABASE "mydb"'
{"results":[{"statement_id":0}]}
```

## データを登録する

InfluxDBのデータベースはポイント(points)という単位で保存します。

ポイントは4つの要素から構成されます。メジャメント(measurement)、タグセット(tagset)、フィールドセット(fieldset)、タイムスタンプ(timestamp)です。

| 用語 | 説明 |
|---|---|
|メジャメント(measurement)|タグセットあるいはフィールドセットが異なる関連するポイントを関連付けるために利用|
|タグ(tag)|フィールドに付与するメタデータ。key=valueで表現される。この場合valueは文字列。タグは複数付与することができる。データの検索はタグでフィルタすることで高速化されるため、複数の有効なタグを持つことは重要|
|タグセット(tagset)|タグの集まり|
|フィールド(field)|key=valueで表される実際のデータ。値は整数・浮動小数点数・文字列・真偽値、のいずれかとなる。|
|フィールドセット(fieldset)|フィールドの集まり|

```bash
$ curl -i -XPOST "http://localhost:8086/write?db=mydb&precision=ms" --data-binary "test,tag=1 key1=1.1,key2=2.5"
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: c8b0c59e-ce78-11ea-8006-0242ac120003
X-Influxdb-Build: OSS
X-Influxdb-Version: 1.8.1
X-Request-Id: c8b0c59e-ce78-11ea-8006-0242ac120003
Date: Sat, 25 Jul 2020 13:14:34 GMT
```

時間を省略すると、その登録した時刻で記録されます。

## 登録したデータを取得する

```bash
$ curl -G http://localhost:8086/query?db=mydb --data-urlencode "q=SELECT * FROM test"
{"results":[{"statement_id":0,"series":[{"name":"test","columns":["time","key1","key2","tag"],"values":[["2020-07-25T13:14:34.664Z",1.1,2.5,"1"]]}]}]}
```

## 検索結果を整形する

```bash
$ curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT * FROM test"
{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "test",
                    "columns": [
                        "time",
                        "key1",
                        "key2",
                        "tag"
                    ],
                    "values": [
                        [
                            "2020-07-25T13:14:34.664Z",
                            1.1,
                            2.5,
                            "1"
                        ],
                        [
                            "2020-07-25T13:15:45.632Z",
                            2.1,
                            3.5,
                            "1"
                        ]
                    ]
                }
            ]
        }
    ]
}
```
Herokuへのデプロイ後、HTTPエラー500が出た

Ruby on Railsで簡単な掲示板アプリを作成し、初めてherokuのデプロイに成功した。

ただ、herokuでsqliteが未対応なことを知らなかったり、フロント周りをslimで初実装した為に、デプロイ前後で少々エラーに苦しんだので、備忘録として解決方法を残す。


#sqliteでherokuデプロイ失敗した時の対処法

恐らくrailsでwebアプリを作成した際、デフォルトではsqliteがDBとして設定されていると思う。
そのままデプロイしようとすると失敗するので、
※[エラー参考記事1](bit.ly/2BycxYo)、[エラー参考記事2](bit.ly/3fYtDO8)、 [herokuデプロイの手順](https://bit.ly/2EkyTh5)

以下を削除

```Gemfile.
gem 'sqlite3'
```

以下を追記

```Gemfile.
group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'rails_12factor' #heroku logsを詳細表示できる便利gem(必須ではないがあると便利)
  gem 'pg' #デプロイ後はpostgresqlを使うように指定
end
```

その後`$git push heroku master`をしたらデプロイは成功した。

#herokuデプロイは成功しているのにアプリが表示できない時の対処法

その後、`$heroku open`でデプロイできたアプリをブラウザで見ようとしたところ、

HTTP500のエラーが出てサイトが表示されないというエラーが出た。

このエラーの原因は、viewにslimを導入しており、slimのgem記述位置がdeveropmentにあったためだった。
なので、以下2つのgemを、group :development doから、全ての環境で適応される場所に記述。

```Gemfile.
gem 'slim-rails'
gem 'html2slim'
```

#we're sorry, but something went wrongのエラーへの対処法

その後、rootパスのURLは表示に成功したが、違うコントローラーのURLが通らない。
we're sorry, but something went wrongという表記が出てしまう。

これは、デプロイ前のエラーの原因sqliteが関係していた。


we're sorry, but something went wrongでgoogle画像検索を実行して出てきた[このサイト](https://bit.ly/30Ko3bM)にある現象と似ていたので、それを実行してみたところエラーが解決した。

`$heroku run rake db:migrate`

※ちなみにrakeコマンドはrails6以降はrailsでできるので、それを走らせればok

#今回のエラーで学んだこと

herokuでデプロイ後なにか表示に問題があった場合は、

###`$heroku logs -t`

でログが確認できる。


###Google画像検索も有効
エラーを検索した時に、SEO的強いにQiitaや質問サイトが上の方に出てくるが、Google画像検索だとSEO的に弱いサイトのサムネなども検索できる。
参考になりそうなサムネをクリックすると解決できるかも..??
WebGLを描写しているcanvasを、canvasの2D Contextのfilterでぼかす

AR的なツールで遊んでいる際に、ツール側はCanvasにWebGLを用いて描写をしており、この場合canvasのfilterは使えない

- canvasには2d、webgl、webgl2、bitmaprendererなどがある模様
  - [https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/getContext](https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/getContext)
- 下記の通りCanvasRenderingContext2Dにはfilterが存在するが、
  - [https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D](https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D)
- webglには存在しない
  - [https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext)

WebGLなんて5年以上前にThree.js触ったとき以来で全く覚えておらず、「ぼかし」を入れたいだけなのにWebGLを学び直す気もしないという感じだったので困っていた。
2Dに転写してからぼかせばよい感じらしい

```html
<canvas id="canvas-webgl" style="display:none"></canvas>
<canvas id="canvas-2d"></canvas>
```

```jsx
const canvas = document.getElementById('canvas-webgl'); // これはツールで指定しててよしなに変更されている
const canvas2d = document.getElementById("canvas-2d"); // これは上で記載しただけで何もしていない
const ctx = canvas2d.getContext('2d');
// const ctx = canvas.getContext('2d'); // これは取れない
// const ctx = canvas.getContext('webgl'); // これなら取れる場合
ctx.filter = 'blur(5px)'; // 数値はテキトー
ctx.shadowBlur = 5;

draw2DCanvas(); // webglの描写前に実行すると動かない
// canvasはVideoが動いているのでよしなに描写し続ける
function draw2DCanvas(){
    ctx.clearRect(0,0, canvas2d.width, canvas2d.height);
    ctx.drawImage(canvas, 0, 0); // ここで転写
    requestAnimationFrame(draw2DCanvas); // videoなので繰り返し描写
}
```
Raspberry Pi Zero W初期設定メモ（その２）モニタ無/マウス無/Wi-Fi接続（Windows母艦）

訳あって、Raspberry Piをインストールし直した。

Raspberry Piの初期設定方法その１は、こちら参照。
https://qiita.com/takashi53/items/7cf6f3487dfd1c0057f9

今回は、モニタ無し、マウス無し、Wi-fi接続で、初期設定に挑戦した。
ちなみに、母艦は、Windows10 PCである。

SDカードに書き込むところまでは、一緒。
Wi-fi接続するためのおまじないが必要。

## bootドライブに「ssh」ファイルを作成する

SDカードを一度抜き差しして、Windowsに認識させて、
bootドライブが見えたら、
「ssh」という拡張子無しの空ファイルを作る。

## Wi-fi設定ファイルを作成する

同じく、bootドライブに、「wpa_supplicant.conf」ファイルを作成する。
メモ帳で開いて、下記をコピペ。
SSIDとパスワードは接続するWi-fiアクセスポイントの情報に書き換える。

```shell-session
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="Wi-fiのSSID"
        psk="Wi-fiのパスワード"
}
```

これでRaspberry Piの電源入れる。

しばらくしたら、SSHを試みる。

Raspberry PiのIPアドレス分からないですよね。
「raspberrypi.local」で接続できます。

![SSH.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299557/a00c3e11-eafd-f589-8d26-057baebba2f7.png)


これで接続成功しました。

初期パスワードは、
id:pi
pass:raspberry
です。


以上。
今回文字だけですが、自分用メモってことで。

初期パスワードの変更忘れずに。

```shell-session
pi@raspberrypi:~ $ passwd
```
SageMakerで利用できるDeepChemのためDockerfile

# SageMakerで利用できるDeepChemのためDockerfile

## TL;DR

![](https://www.inoue-kobo.com/aws/sagemaker-with-deepchem/images/thumbnail.png)

SageMakerでトレーニングのために使用できる[DeepChem](https://www.deepchem.io/)用のDockerfileです。
バージョン依存にするため、取り急ぎ以下のバージョン専用です。

* deepchem-2.3.0
* python-3.6
* tensorflow-1.14.0

Dockerfileにより独自コンテナでSageMaker上でトレーニングする方法は[SageMakerで独自コンテナでトレーニングする方法](https://www.inoue-kobo.com/aws/sagemaker-with-mycontainer/index.html)を参照してください。

## Dockerfile

```Dockerfile
FROM nvidia/cuda:10.0-cudnn7-devel
ENV PATH /opt/conda/bin:$PATH

ENV PYTHON_VERSION 3.6
ENV PATH /usr/local/cuda-10.1/bin:$PATH
ENV LD_LIBRARY_PATH /usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
ENV LD_LIBRARY_PATH /usr/local/cuda10.0/targets/x86_64linux:$LD_LIBRARY_PATH

RUN apt-get update --fix-missing && apt-get install -y wget bzip2 ca-certificates \
    libglib2.0-0 libxext6 libsm6 libxrender1 \
    git mercurial subversion
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

# deepchemはscikit-learnが0.20.1以外だと動作しないため注意が必要です。
RUN conda install scikit-learn==0.20.1
RUN conda install -c deepchem -c rdkit -c conda-forge -c omnia deepchem-gpu=2.3.0 python=3.6 --yes
RUN pip install sagemaker-containers
# deepchemの後にtensorflow-gpuを入れ直します。そうしないとGPUが利用されません。
RUN pip uninstall tensorflow --yes
RUN pip install tensorflow-gpu==1.14.0

# Copies the training code inside the container
COPY code/train.py /opt/ml/code/train.py

# Defines train.py as script entrypoint
ENV SAGEMAKER_PROGRAM train.py
```

### SageMakerが利用するCUDAのバージョンは固定されている

実際に実行すると`10.0`とマイナーバージョンまで指定してライブラリを検索している様です。
このため、`10.1`や`10.2`など必要なライブラリの一部が見つからないとエラーになります。

### scikit-learnは最新だとdeepchemが必要なモジュールを見つけられない

最新のscikit-learnを利用するとdeepchemがscikit-learnに含まれると想定している`joblib`を見つけられずにエラーになります。
また、あまりバージョンを下げすぎると`jaccard_similarity_score`の名前が変わっていて見つけられません。
このため、`0.20.1`を指定しています。

### tensorflow-gpuはdeepchemのインストール後に明示的に再インストールする

deepchemの前に`tensorflow-gpu`をインストールしても`tensorflow`がインストールされていました。
このため、deepchemのインストール後に`tensorflow`をアンインストールして明示的に`tensorflow-gpu`をインストールします。

### GPUを利用していることを確認する方法

```python
from tensorflow.python.client import device_lib

print(device_lib.list_local_devices())
print(f'Use gpu: {tf.test.is_gpu_available()}')
```
HTML入門（自分向けメモ）


!エンターでのHTMLの雛形が自動作成される。

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```
プログラミングスクールを卒業したての大学生が、Railsでポートフォリオを作る！

はじめまして
プログラミングスクール卒業したての文系大学生「しょうた」です

私は2020年7月19日にプログラミングスクールを卒業しました。
学んだ言語は、Rubyです

一通りカリキュラムを終えた私が、新たな目標
「IT企業への長期インターン」
に向けてポートフォリオを作成します。

今後、その過程で躓いたことや、学んだことを記して、成長日記・備忘録代わりに使っていこうと思います。

私の記事がいつか誰かの参考になれば幸いです。
SSH (今更) 

今更ですが、SSH接続の方法を示します。
試行錯誤でかなり頑張りました....(初心者)

まず、SSHはクライアントとサーバーという関係性を理解しなくてはいけません。
これがアレルギーでした....

今話題のリモートで一例を示しましょう。
まずは、同じネットワーク(社内、学内ネットワーク)の場合を示します。
同じ部署で密な環境で仕事したくないから、社内にいるけど休憩場所とかで自分のノートパソコンから会社のデスクトップのLinux PCのターミナル動かしたいな〜なんて場面を想定しましょう。(というかこのぐらいの考えに至る人はすでにSSHしてますかね...)

ここで、クライアントとサーバーを以下のように定義します
クライアント：自分のノートパソコン (My PC)
サーバー：会社のデスクトップパソコン (Main PC)

最終的に自分のノートパソコンさえ持ち歩けば社内のどこからでも自分の机とかにおいてあるMain PCのLinuxのターミナルをいじれるということです。

#クライアント(My PC)の設定
opensshパッケージとopenssh-clientをインストールします。

```ruby:MyPC
$sudo apt-get install openssh openssh-client
```

#サーバー(Main PC)の設定
まず、Main PCの中のユーザーのうち、外にあるMy PCから操作したいユーザーでログインします。
(ちなみにRootユーザーでも特に問題ないですが、リスクを感じる場合はSSHでセキュリティリスクを回避して接続する方法を参照ください)
opensshパッケージとopenssh-serverをインストールします。

```ruby:MainPC
$sudo apt-get install openssh openssh-server
```

はい、準備終了です。以外と簡単でした。
では接続方法です。

次に、サーバー(Main PC)の前に座ったままで
IPアドレスを調べましょう。

```ruby:MainPC
$hostname -I
192.168.1.1
```

上記のようにhostnameコマンドを打つとIPアドレスが出てきます。


次にユーザー名です。え、ユーザー名って...？
という方は、今触っているサーバー(Main PC)をみれば出ています。

```ruby:MainPC
user@ubuntu $hostname -I
192.168.1.1
user@ubuntu $
```

今はこんな感じになっていると思いますが、ユーザー名は@の前のuserです。(人によってuserは違いますね)

さ、次にクライアント(My PC)に移り、以下を打ちます。

```ruby:MyPC
$ ssh user@192.168.1.1
# ssh Main PCのuser名@Main PCのIPアドレス
```
次にパスワードを求められます。いつもログインするときに使うパスワードを入力してください。
はい、これで以下のようになったら完了です。

```ruby:MyPC
user@ubuntu $
```
user以下が緑色の文字に変わったらSSH接続で操作できています。
終わる場合は「exit」と打てSSHは終了です。

後はMain PCで行ってる通り仕事をしましょう。。。。

ちなみにファイルの転送は以下のようにやればできます

```ruby:MyPC(Qiita.txt)→MainPC
scp ~/Qiita.txt　user@192.168.1.1:~/
```

上記でMy PCのQiita.txtがMain PCのユーザーファイルディレクトリ(Documentとかあるところ)に転送されます。Main PCからMy PCもできますよ！

さて、とりあえずSSH接続はできましたね。。。。
次回は[SSHでセキュリティリスクを回避して接続する方法](https://qiita.com/kitarow0309/items/7f587f04fd06717b0080)を書きます。
ああ。。。疲れた.....暑い。
360度サーボモーターに58mmオムニホイールを使う

360度回転対応のサーボモータに使用できるオムニホイールを探していました。

##360度回転対応のシリアルサーボ TS-315
360度回転対応のサーボモータとしてTS-315を以下で紹介しています。
360度回転対応ワンワイヤー（１Wire）シリアルサーボ TS-315を使う
https://qiita.com/usashirou/items/478d971efa1b46ba0bae

##サーボモータでオムニホイールを使うには
サーボモータは、セレーション（ギザギザ）を切ってあり、これに対応するには、セレーションに対応するアダプターが必要です。
例えば、サーボホーンなどがそれにあたります。
対応アダプターを探したところ58mmオムニホイールに対応するアダプターがある事がわかりました。

当初Taobaoで購入する予定でしたがヴィストンに在庫があったのでこちらを使用することとしました。
LEGO(レゴ)用58mm プラスチックオムニホイール (14135)です。
Aliexpressで700~1300円程度、Taobaoだともっと安いですが
ヴィストンの方が早く確実だと思います。

##LEGO(レゴ)用58mmオムニホイール
![DSC_0132 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2e57b026-b922-3c4b-8899-ba7c55bde07b.jpeg)
LEGOと、サーボモータに使用できるアダプターが付属されています。

##オムニホイール組立状態
![DSC_0129 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/216e7beb-0bc6-bbab-47ae-68c1fd317bee.jpeg)
ホイールにアダプターをインサートしますが、かなり硬いです。
アダプターにはセレーションがきってあるので、挿入するだけで使用できるようです。

##完成イメージ
![DSC_0136 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c892de4-ed17-4552-9fd8-ed0a7e63fde8.jpeg)
Macで"The default interactive shell is now zsh."を非表示にする

#The default interactive shell is now zsh.
>The default interactive shell is now zsh.
>To update your account to use zsh, please run `chsh -s /bin/zsh`.
>For more details, please visit https://support.apple.com/kb/HT208050.

シェルを`bash`で使っていると、ターミナルやiTerm2を開くたびに
「デフォルトのインタラクティブシェルはzshになりましたよ。」って
ご丁寧に教えてくれます。

毎回はご勘弁願いたいので、非表示にしちゃいましょう。

##表示を消す
`.bash_profile` に以下の記述をする。

```~/.bash_profile
export BASH_SILENCE_DEPRECATION_WARNING=1
```
---
`.bash_profile` を開くコマンドはこちら。

標準のテキストエディタで。

```
$ open ~/.bash_profile
```

VSCodeで。
事前にPATHを通してください。ここでは割愛します。

```
$ code ~/.bash_profile
```
最初にするLaravelの.envファイルの設定変更

###コードを書く前に.envファイルの編集が必要
編集はVScode。

`.envファイル`をVScodeで開いて編集していきます。
`.envファイル`は作成したプロジェクトのディレクトリに入っています。publicとかappの上のディレクトリですね。

9行目くらいから書かれいるところだけ編集する。

```:.env
APP_NAME=ブログ // アプリ名に編集。初期値はLaravelでした
```


```:.env
DB_CONNECTION=mysql // 編集なし
DB_HOST=127.0.0.1 // 編集なし
DB_PORT=8889 // MAMPでportを確認して編集
DB_DATABASE=blog // phpMyAdminで作成したDB名
DB_USERNAME=root // 編集なし
DB_PASSWORD=root // 編集なし
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock // 追記
```

1. 編集が3箇所
2. 追記が1行
DockerでTypeScript+Reactな環境構築(create-react-app)

## 目標

- Dockerとdocker-composeを用いてcreate-react-appし、Reactアプリケーションの開発を始められる
- かつ、TypeScriptでReactを動かす

## 前提

- Dockerが使用可能である
- docker-composeが使用可能である

## 手順

### 1. 作業ディレクトリの作成

作業するディレクトリを作成しましょう。
プロジェクト名はここでは```sample-app```とします。

```terminal
% mkdir sample-app
% cd sample-app
```

### 2. Dockernize

Dockerfileとdocker-compose.ymlを作成し、中身を追加します。

```terminal
% touch Dockerfile
% touch docker-compose.yml
```
nodeのバージョンは[こちら](https://hub.docker.com/_/node)から新しめのものを選択すればいいと思います。

プロジェクトディレクトリ名が"sample-app"なので、コンテナ名・react-app名は"frontend"とします。

```dockerfile:Dockerfile
FROM node:14.4.0-alpine3.10

ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo

WORKDIR /usr/src/sample-app
```

```yml:docker-compose.yml
version: '3'

services: 
  frontend: 
    build: .
    environment: 
      - NODE_ENV=development
    volumes: 
      - ./:/usr/src/sample-app
    command: sh -c 'cd frontend && yarn start'
    ports: 
      - '3000:3000'
    tty: true
```
- ```volumes```: ```ホスト:コンテナ```間でファイル・ディレクトリを同期(= マウント)する
  - これにより、ホスト側のエディター等で行った編集がコンテナ側にも反映されたり、```docker-compose run コマンド```でコンテナ側に生成されたファイル・ディレクトリがホスト側にも同様に生成されるようになる
- ```sh -c 'cd frontend && yarn start'```: ```docker-compose up```したとき、react-appディレクトリに移動し、devサーバーを起動する
- ```ports```: 公開用のポートを、```'ホスト:コンテナ'```の書式で指定している。
  - ブラウザでローカルホストを開くときはホスト側に指定したポートを参照する(e.g. この場合、ブラウザからは```localhost:3000```で開発環境のアプリケーションにアクセスできる)
- ```tty```: 値をtrueにすることで、```docker-compose up```でコンテナを起動させた際にコンテナがすぐに終了してしまうのを防ぐ

### 3. ビルド

```terminal
% docker-compose build
% docker-compose run --rm frontend sh -c 'npx create-react-app frontend --template typescript'
```
- ```--rm``` : コマンド実行後にこのコンテナ(frontend)を削除する
- ```--template typescript``` : .jsxファイルの代わりに.tsxファイルが生成され、ReactアプリケーションがTypeScriptで動くようになる


正常にビルドが完了した場合、以下のようなディレクトリ構成になります。
TSXファイル等は```src```以下に配置されています。

```terminal
sample-app
├── Dockerfile
├── docker-compose.yml
└── frontend
    ├── node_modules
    ├── public
    ├── src   
    ├── .gitignore
    ├── README.md
    ├── package.json
    ├── tsconfig.json
    └── yarn.lock
```

### 4. アプリケーション起動の確認

下記コマンドでdevサーバーが起動します。

```terminal
% docker-compose up
```
[http://localhost:3000/]()
にアクセスし、```App.tsx```の内容が表示されていれば成功です。
該当ファイルをエディターで編集するとすぐに反映されることも確認できるはずです。

あとは自由に開発を進めていきましょう！

アプリケーションの停止は下記コマンドでできます。

```terminal
% docker-compose down
```

## 参考
- [Reactの開発環境をDockerで整えよう](https://code-ship-blog.wemotion.co.jp/technology/react%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92docker%E3%81%A7%E6%95%B4%E3%81%88%E3%82%88%E3%81%86/)
- [Docker, React, TypeScriptを使用したプロジェクト作成](https://qiita.com/hasehiro0828/items/f4275c9a2175864c82e4)
- [Docker TypeScriptでReact 環境を構築](https://qiita.com/habi16/items/497abe1f80228a2b4ff9)
MAMPからphpMyAdminをブラウザに表示するまで

###MAMPからphpMyAdminを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/29099996-0d00-19b1-08ea-98ba52f538b4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/972dfedc-15bd-2108-ac3a-dc2f868f9410.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/340d92ca-1adc-1515-a4cd-375557a27140.png)

これでphpMyAdminが表示されます。
vscode-proto3でmessageをimportするときの設定

VSCodeでvscode-proto3を使用している場合、別のディレクトリで定義したmessageをimportして使用するとエラー(`<message> is not Defined`)が表示される。

以下の設定でエラーを回避できる。

1. vscode-proto3の設定で `Edit in settings.json`を開く
2. protocの設定で`proto_pathオプションを指定する`以下のようにする

```
    ...
    "protoc": {
        "options": [
            "--proto_path=<proto定義があるディレクトリへのパス>",
        ]
    }
    ...
```

パスが複数ある場合は`--proto_path`を増やせばOK

```
    ...
    "protoc": {
        "options": [
            "--proto_path=<proto定義があるディレクトリへのパス1>",
            "--proto_path=<proto定義があるディレクトリへのパス2>",
        ]
    }
    ...
```
プログラミング初心者向けの学習サイトまとめ

発見しても結構すぐ忘れがちなので、記録用として残しておきます。

###Progate
もはや説明不要のプログラミング入門者向けサイト。
ブラウザで完結するゲームと一緒にハンズオンで学んでいく形式。

サイトUIがシンプルでとても見やすくて、新しい言語を勉強する時や基礎に立ち返って勉強したい時は必ずこのサイトを使う。

個人的には、言語によってわかりやすさに差がある気がする。

あくまで入門なのでさらっと理解したら、すぐにUdemy教材やったりポートフォリオ作ったり自分の頭で考えてプログラムやサイトを作る工程に移った方がいい。
間違っても「(同じコースを)三周しました！」「progateのレベル200超えました！」と言っているツイッタラーを真似してはいけない。と思う。多分。

料金: 980円(税別)/月
(一部無料で見れる教材有)



###ドットインストール
Progateと二大巨頭。3分のショートムービーと一緒にハンズオンで学んでいく形式。
個人的には

・UIが古臭い
・情報が古いものが多い
・単純に講師の話し方があまり好きじゃない

と感じ3ヶ月で解約してしまったが、ハマる人にはハマるみたい。

料金: 1,080円 (税込)/月
(一部無料で見れる教材有)

###paiza

動画で基礎を学んだり、プログラミングのアルゴリズム問題をブラウザ上で解いていくサイト。
動画教材にはプロの声優さんが使われていて、アニメ好きな人は好きだと思う。

人材サービスも行なっており、頑張ってpaizaのスコアを獲得していくと企業からスカウトがくることもある。最高。

料金: 600円〜 (税込)/月
(一部無料で見れる教材有)

###Udemy
海外でも使われているオンライン動画学習サイト最大手。
プログラミング以外にも、マーケティング・語学・マネージメント・ボイトレ・動画制作など様々な分野の教材がある。

日本人だけでなく海外の講師も多数存在するので、英語学習しながらプログラミングの勉強をできたりする(英語わからない人はやめた方がよき)。
エラーなどで詰まったらQ&Aで講師に質問もできるし、購入後30日以内なら返品も可能。
(質問を永遠に返してくれない死亡説のある講師もいるので、そういう人のを買ってしまった時は返品しようね)

頻繁に意味のわからない割引率を誇るセールを開催しており、通常24000円の教材が1200円になったりする。

ただ1200円にしては質が高すぎるのでどう考えても買った方がいい。
評価4.0以上のやつを買えば間違いない。

日本人だと中村祐太さんの講座が好き。


###Linux標準教科書

https://linuc.org/textbooks/linux/form.php

プログラミングの基礎の基礎の部分を学べる。Linuxの知識って後回しにしがちだけど、これならオンライン完結でできるし

### [Vue.jsチュートリアル](https://bit.ly/30OkyCj)

ToDoアプリを作成したり、Vue+Firebaseでアプリを作れたりするっぽい。


###競技プログラミングのサイト「[Atcorder](https://bit.ly/311JEg3)」

リアルタイムで一万人超が参加する競技プログラミングサイト。
問題が6問出てそれを解くプログラムを提出し、都度ランキングが発表される。

Paizaと同様、人材サービスも行なっているので、ランキングを実績に応募もできるみたい。
そこから直接応募しなくても、行きたい企業の面接でAtCorderのランクをアピールすれば好印象を残せる可能性も。
Excel VBAで他のプログラムが出力したMessageBoxの内容を取得する。

AppActivateとSendKeysを使って、Excel VBAで初歩的なRPA的なことをしているひともいるかと思います。
キー送信をするだけなら簡単ですが、難しいのは、メッセージボックスに反応することではないでしょうか？
メッセージボックスの内容を取得する方法を紹介します。
Captionを指定して、指定したCaptionに合致するメッセージボックスのPromptを取得します。

```VisualBasic
Private Declare PtrSafe Function FindWindowW Lib "user32" (ByVal lpClassName As LongPtr, ByVal lpWindowName As LongPtr) As LongPtr
Private Declare PtrSafe Function GetWindowTextLengthW Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetDlgItem Lib "user32" (ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long) As LongPtr
Private Declare PtrSafe Function FindWindowExW Lib "user32" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As LongPtr, ByVal lpsz2 As LongPtr) As LongPtr
Private Declare PtrSafe Function GetWindowTextW Lib "user32" (ByVal hwnd As LongPtr, ByVal lpString As LongPtr, ByVal cch As Long) As Long

Private Function GetPrompt(ByVal Caption As String) As String
    Dim hWndDialog As LongPtr
    Dim hWndMessage As LongPtr
    Dim nLength As Long
    Dim sText As String
    
    hWndDialog = FindWindowW(0, StrPtr(Caption))
    If hWndDialog Then
        hWndMessage = GetDlgItem(hWndDialog, &HFFFF&)
        If hWndMessage Then
            nLength = GetWindowTextLengthW(hWndMessage) + 1
            sText = String(nLength, vbNullChar)
            nLength = GetWindowTextW(hWndMessage, StrPtr(sText), nLength)
            GetPrompt = Mid(sText, 1, nLength)
        End If
    End If
End Function
Sub main()
'実験するには、たとえば次の内容をもつVBSファイルを作っておきます。
'   MsgBox "処理を続行しますか?",vbOKOnly, "Application Error"
'このマクロを実行する前に、作ったVBSファイルを実行して、メッセージを表示状態にします。
'このマクロを実行すると、"Application Error"から逆引きして、"処理を続行しますか?"を取得します。
    Debug.Print GetPrompt("Application Error")
End Sub
```
【Mac】MAMPの導入してlaravel を使えるようにするまで

###はじめに
PHPを動かすのにサーバを立てないといけない。ということで最初はMacに最初から入っているApacheを使用していました。

しかし、複数のアプリを試しに作って動作を確認しようとすると、ドキュメントルートの設定などがめんどいなと。というか不慣れなだけで慣れれば簡単なのかもしれませんが、コードを書くことに集中しようと思うと、環境設定はやっぱり簡単な物から始めることでも良いのかと思い始めました。

Dockerなども考えましたが、いきなり流行りにノリ過ぎるのもどうかということで、とりあえず有名なMAMPを使うことに。

Windowsを使っていたときはXAMMPを使っていましたので、名前を似てるし、同じようなものかと思ってます。

とりあえず、初期設定などは最初しかやらないので、メモしておこうと思います。


###インストール済
1. PHP 7.4.8
2. Laravel Framework 7.21.0


1. インストール済PHPのバージョンの確認方法

```:ターミナル
% php -v
PHP 7.4.8 (cli) (built: Jul  9 2020 23:43:51) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.8, Copyright (c), by Zend Technologies
```

2. インストール済のLaravelのバージョンの確認方法
laravelで作成した、プロジェクト名を付けたフォルダでターミナルを開いて、そのディレクトリ上で次を実行。

```:ターミナル
% php artisan --version
Laravel Framework 7.21.0
```
ちなみに、デスクトップなどで実行すると確認できませんでした。
`% php artisan --version 
Could not open input file: artisan`が表示されました
作成したディレクトリ上で実行しないと`artisan`が使えない。つまり、Laravelが使えないということですね。



###MAMPのダウンロード
https://www.mamp.info/en/mamp/mac/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/4ff34798-3755-a49b-7d4c-06be861e5019.png)
`Free Download`からダウンロード。

ダウンロードして実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/e5f7dea4-39e6-00a3-9bbe-8df30654566b.png)

こんな画面が最初に表示されました。
あとはMAMP PROにアップロードしてねとか、Twitterをfollowしてねっていう広告が出てきました。広告の左上に超絶薄い❌マークがあるので、クリックしたら消えました。


###MAMPのドキュメントルートの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/26fd7820-f1de-8cc5-9f66-fd3a91970ff1.png)

MAMPをクリックすると`Preferences...`があるので、そこから設定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/38304158-2509-d6ad-a0d2-412b730c780c.png)

`Web Server`のタブにドキュメントルートを設定するところが出てきます。

`Select`からディレクトリを選ぶことができます。

###publicをドキュメントルートに設定する

自分はDesktopがわかりやすいので、そこにblogというものを作りました。（勉強用）

MAMPの画面に戻ってこれで
Start Serversを起動
Open WebStart pageをクリックすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/88c295f3-1c51-405b-7428-898724dcb166.png)

URLは以下の方になっていました。
http://localhost:8888/MAMP/?language=English


ちなみに、最後のところが言語の設定になっているので、Japaneseを入力してみたら、ずっとクルクルなって読み込みが終了しませんでした。
余計なことはしない方がいいですねw


###ポートの確認
'Preferences'をひらいてPortsのタブから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/db3ef16f-0620-9ecc-6238-b347564e720d.png)

ApacheのPortが8888になっているので、
`localhost:8888`をブラウザの検索バーに入れるとトップ画面が出てくるはず！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/be366241-d56b-e06f-90cd-a59c9337a305.png)

これが出ていればとりあえずはOKかと。


とりあえずメモメモ。
【こりゃ便利！】Slack便利機能 10選（番外編）待望のカスタムセクション機能

さて今回私がご紹介するのは、前回Qiitaに投稿させていただいた記事<br>[「こりゃ便利！Slack便利機能 10選（その１）」][1]
[1]:https://qiita.com/takeC74/items/d91022d6727bd248b194
に続く（その２）、、、では無くて**（番外編）**です。。。<br>**「10選まだ全部紹介していないのに」（番外編）の投稿**。。。スミマセン。。。<br>でも、**待ちに待っていた便利機能**だったので書かずにはいられませんでした！<br>
※[今年2020年3月のUpdateでリリースされた機能][2]
[2]:https://slackhq.com/intl-ja-jp-simpler-more-organized-slack
のようなのですが、私は本日（その１）編の投稿中に気付きました（汗）<br>なので既にご存知の方は読み飛ばしてください。
※[カスタムセクション機能の公式ヘルプはコチラです。][3]
[3]:https://slack.com/intl/ja-jp/help/articles/360043207674-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%BC%9A%E8%A9%B1%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B
#▼こりゃ便利（番外編）_カスタムセクション
※Slackをしばらく使っていると、登録しているチャンネル数多くなりすぎて、該当チャンネル探すの大変になりませんか？<br>私、今数えてみたら、なんと**85個**のチャンネルを登録していました。たくさんありすぎて、もはや普通の人間の能力では全てのチャンネル名も覚えるのは不可能な数となり、サイドバーをスクロールして85個がズラーっと並んだチャンネル名から「どれだっけ~~？」って探すの大変だし、検索で探すこともままならぬ。。<br>　もはやSlackの便利機能、「スター」（※実はスター機能は『（その２）編』で紹介しようと考えていました（爆））を付けるだけでは全然役に立たない。。<br>解決策としては、人間を止め、驚異的な記憶力（と不老不死）を得る仮面を被るか、Slack運営に解決機能の要望出すかするしか無いかもねって、つい先日会社の雑談で愚痴ってたんですが、ふと本日、前回のQiita投稿のためにSlack画面のスクショを取っていたら、見慣れないメニューが！<br>![pic_カスタムセクション_１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/10a16d23-6d4b-2ec2-1297-0c4aab953736.png)<br>なんだ、コレ？って調べてみると、最近出来たSlackの新しい機能らしい。<br>**すばらしい！！**早速使ってみることに。<br>　<br>　<br>　<br>　<br>　<br>　<br>　<br>　<br>![pic_カスタムセクション_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/62ce99b8-a637-bc46-8082-580a3a1cfaea.png)
　
感動した。。<br>
自分の任意のカテゴリ名を書くことが出来て、わかりやすい絵文字も付けることが出来る。並び順も自由自在。こりゃ便利！<br>

使い方はSlackメニューの「環境設定」＞「サイドバー」＞「サイドバーセクション」から「セクションを作成する」を選択するか、サイドバーのチャンネルを右クリックして「直接」作成することやカスタムセクションから該当チャンネルを外したり移動させたりすることも可能です。

私と同じような悩みを持っていた方で、「知らなかった」、「まだ使ってない」って方は是非お試しください！<br>石仮面被らなくても済みますヨｗ<br>
残りの便利機能「5選」はまた追って[（20/8/7リンク追記）【 こりゃ便利！】SLACK便利機能 10選（その２）](https://qiita.com/takeC74/items/5bd2f6b433c7874146df)でご紹介させていただきたいと思います。


以上、最後までお読みいただきありがとうございました。
＜Swift＞CollectionViewCellに薄い影をつける


```swift:TodolistDetailViewController.swift
    private func todolistCell(indexPath: IndexPath, todo: Todo) -> UICollectionViewCell {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TodolistDetailCollectionViewCell", for: indexPath ) as? TodolistDetailCollectionViewCell{
            cell.update(todoTitle: todo.title, todoExpireDate: todo.expireDate)
            
            // セルの境界からはみ出ているものを見えるようにする
            cell.layer.masksToBounds = false
            // 影をつける
            cell.layer.shadowOffset = CGSize(width: 0, height: 1)
            cell.layer.shadowOpacity = 0.2
            cell.layer.shadowRadius = 1.0
            
            return cell
        }
        return UICollectionViewCell()
    }
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136142/3bc354c6-8f51-f92c-4166-4b754fafeaa7.png" width="300">
How to solve the problem [ tkinter can not work at the environment python 3.7.3]

Environment:
・MacOS Catalina 10.15.6
・pyenv 1.2.18
・Python 3.7.3

The first time I used the Tkinter package to create the GUI of my booklist APP, but there was an error occurred which showed that "No module named '_tkinter'.
<img width="203" alt="スクリーンショット 2020-07-25 19.24.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/cfb50674-f17f-e2f0-4685-8f074b68f709.png">
<img width="720" alt="スクリーンショット 2020-07-25 19.18.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/ffb7f952-9064-709e-2c5b-7a95d7ee8b2c.png">

So weird, because Tk/Tcl has long been an integral part of Python and the Tkinter package is a thin object-oriented layer on top of Tcl/Tk.

I have tried to uninstall python 3.8.1 ( I think maybe I installed the wrong version which can not compatible with the Tkinter) and install the Python 3.7.3, but still can not work. So it must be something else.

If you met the same problem with me, I recommend you read these articles here, they all give you the best way to solve it.

・　https://qiita.com/survivor7777777/items/5a8e23d30822437ae9f9
・　http://kidokorock.com/macos-catalina-pyenv-tkinter/
・https://stackoverflow.com/questions/60469202/unable-to-install-tkinter-with-pyenv-pythons-on-macos

All of the above solutions are derived from https://github.com/pyenv/pyenv/issues/1375

Now, let me briefly explain how I solved this problem.
 Open your terminal:
・uninstall the python 3.7.3 ( pyenv uninstall 3.7.3)
・brew install tcl-tk
・brew info tcl-tk
・edit the python-build script file. The path of this file on my computer is /usr/local/Cellar/pyenv/1.2.13/plugins/python-build/bin/python-build
  <img width="769" alt="スクリーンショット 2020-07-25 20.24.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/d5e16403-b2b3-024b-ae1d-c22b3b370d18.png">

・open this file ( I use Atom), and search for this:
  
CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1

then replace it with this :

CONFIGURE_OPTS --with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
<img width="1226" alt="スクリーンショット 2020-07-25 20.28.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/2d1385ac-4eaf-25b8-0fff-d739080692c1.png">

・install python 3.7.3 ( pyenv install 3.7.3)
・pyenv global 3.7.4
・Restart the terminal and input "python -m tkinter"

Then you'll see this.

<img width="577" alt="スクリーンショット 2020-07-25 19.58.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/e4c584fd-653b-71c2-379b-b99bb7e0ddc5.png">

Back to the editor and run the code again. There's nothing wrong with it！

<img width="812" alt="スクリーンショット 2020-07-25 20.35.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619234/67f1137f-3900-e57f-9827-3ed1fdab01e3.png">