OmniAICreator/Qiita-1.07M huggingface dataset:
県内のコロナウイルス感染者数が一目で分かるものをM5Stackで作ってみた

#背景
何かと話題のコロナウイルス。
自分が住んでいる石川県でも感染者数が増えてきて、もちろん以前から十分に注意はしていますが、いよいよ日々の情報収集が欠かせない状況になってきています。
で、自分が何をしているかというと、「現状どうかな。。。」って思うたびに、その都度、検索サイトで地元情報を探して、「あぁ、変わってない」ってそっとサイトを閉じる感じ。まぁ、最新情報はニュース記事になることが多いので、本当に最新情報を知りたい場合は今まで通りに調べていれば良いのですが、もう少し状況に変化があったかどうかを手軽に知ることができないかと思ったのが作ろうと思ったきっかけです。
*追記：北陸３県に対応しました（富山県・石川県・福井県）

#作ったもの
* 一目で石川県の感染者数が分かる
* [石川県のホームページ](https://www.pref.ishikawa.lg.jp/kansen/coronakennai.html)から定期的に感染者数を取得している
* 最新のデータ更新時刻が分かる
![2020-04-05_18-30-37_571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/66f172da-6fd4-fc0d-9a5a-97b9181e238e.jpeg)

#構成
ハードウェアは、M5Stackのみです（改造不要）。
ファームウェアが書き込める環境があれば、すぐに使えます。
ソースコードはGithubに公開してます。詳細は[こちら](https://github.com/yukima77/covid-19-ishikawa-m5stack)になります。
＊現状は北陸３県（富山県・石川県・福井県）に対応しています。

#まとめ
とりあえず、まだテスト運用中ですが、一目で変化が分かるので、ちゃんと現在置かれている状況を正しく認識できます。必要以上に恐れる必要もないと思っていますが、正しく状況を把握して、自分の行動を気を付けるのがとても大切だと思っています。
あと、ヤバイヤバイって言ってても子供たちには分かりにくいので、数値で見えるのは良いと思います。これ見て、子供たちが自分で考える環境になってきてるのは良い傾向。
ぼくのiTerm2設定

# はじめに
最近，RustをVimで書いたりしています。
そうなるとターミナルに触れている時間が長くなるので，Macのデフォルトのターミナルから**iTerm2**に乗り換えてみようと思い，iTerm2をはじめて導入してみました。

# 元の環境について
シェルをbashから**fish**に変えており，
`~/.config/fish/functions/fish_prompt.fish`に

```
function fish_prompt --description 'Write out the prompt'
    printf 'papillon@ %s> ' (set_color cyan)(prompt_pwd)
end

function fish_right_prompt 
    date +"%H:%M"
end
```
という設定を書いておいてあります。


# インストール
https://www.iterm2.com/
ここからzipファイルをダウンロードできます。
このzipファイルを展開し，中に入っている`iTerm`というアプリケーションファイルをアプリケーションフォルダに移動させました。

<img width="1440" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/2fb6153c-9b63-309b-7833-3d233d7ad123.png">

ついでにDockにも追加しておきました。

さて，現在のiTermの状態は
<img width="563" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/b8a283cc-f6f0-ddb8-832f-9bb269d46393.png">

こんな感じになっています。

ここから自分好みに色々とカスタマイズしていきます。

# テーマの変更
今の黒い画面はあまり好みじゃないので，新しくテーマを入れたいと思います。
> https://draculatheme.com/iterm/

このリンクからまたzipファイルをダウンロードします。
僕は展開後のフォルダを`Documents`ディレクトリへ移動させました。

そして，iTermの**Preferences**から，
<img width="924" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/a3b33f30-789c-6314-def3-33aad636274a.png">
**Profiles**の**Colors**を選択します。
右下の Color Presets... のスクロールメニューから`Import`を選択し，先程ダウンロードしたDraculaのフォルダから`Dracula.itermcolors`を選択します。
そしてもう一度スクロールメニューを開き，`Dracula`を選択します。

すると現在のiTermはこのようになっているはずです。
<img width="569" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/93cefe05-adab-50d0-372e-419c68c7a1de.png">
いい感じにテーマを変えられました。

# 文字サイズの変更
今のままだと文字が小さいので，設定で文字を大きくします。
またまた**Preferences**で，
<img width="922" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/8f3ee87c-4cdd-c9e4-fb00-3e1dc3618ee2.png">
次のように設定しました。
大きさが`12`から`18`になっています。

<img width="887" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/6ec1dbbc-4a9b-41c5-d75f-4f051284f257.png">

iTerm2が自分好みになりました！

# まとめ
こんかいはTerminalからiTerm2への変更のみだったので，外観のみが変わりました。
`.vimrc`みたいな設定ファイルはまた別でいじっていこうと思います。

# 参考リンク
> https://qiita.com/AkihideEgashira/items/fdb36a45709e82f78bb3
Sassで出来ること【vol.4】継承 

Sass勉強中の為、出来ることを備忘録がてら纏めて書いていきます。

#継承

**scssでは一度使ったセレクタを継承して使用することが出来ます。**
基本的には同じで少しずつ違うスタイルのモジュールを作りたいときに重宝しています！

スタイル要素の追加と変更を行うscssの例です。

```scss:.scss
.hoge {
    margin-right: 15px;
    margin-bottom: 1.5em;
    background: #fff;
}
.huga{
    @extend .hoge;
    margin-right: 30px;
    float: right;
}
```

cssに変換するとこの様になります。

```css:変換後の.css
.hoge, .huga {
  margin-right: 15px;
  margin-bottom: 1.5em;
  background: #fff;
}

/*--以下、追加・変更部分--*/
.huga {
  margin-right: 30px;
  float: right;
}
```
**.hogeセレクタ.hugaセレクタでスタイルが共有されています。
また、.hugaで追加・変更された要素はスタイルの上書きがなされています。**


ただし、継承を行う際の注意点として
**「@ extend  .hoge, .huga;」の様に複数一括指定することは出来ません。**
「@ extend .hoge」
「@ extend .huga」という様に分けて書くことで複数のスタイルを継承することが出来ます。

#リンク
[Sassで出来ること【vol.1】Sassとは？](https://qiita.com/torajiro_u/items/f7b5ba19b51de956cb88)
[Sassで出来ること【vol.2】入れ子(ネスト)・変数](https://qiita.com/torajiro_u/items/2f8370b92eaee17beb61)
[Sassで出来ること【vol.3】関数]
(https://qiita.com/torajiro_u/items/5f9d34206316325f8f95)
Sassで出来ること【vol.4】継承
[Sassで出来ること【vol.5】mixin(ミックスイン)]
(https://qiita.com/torajiro_u/items/96ee60174c1b3e561f3e)
WindowsのVSCodeでclang-formatが効かない時の確認と対処

# TL;DR

* 症状：WindowsのVSCodeでC/C++のファイルを編集時、関連プラグインがインストールされていて、かつ「Format on Save」が有効になっているにも関わらず保存時にフォーマッタが走らない。
* 確認方法：C/C++のファイルを開いた状態で、コマンドパレットから「ドキュメントのフォーマット (Format Document)」を実行すると、右下に「write EPIPE」というエラーが出たらこれ。
* 対応： [ここ](https://releases.llvm.org/download.html)から、「Windows 64 bit」をダウンロードしてLLVMをインストールし、clang-formatにパスを通し、VS Codeを再起動する。
* [関連issue](https://github.com/xaverh/vscode-clang-format-provider/issues/83)

# 詳細

もうTL;DRに書いた通りなんだけれど、WindowsのVSCodeでclang-formatが効かなくなった時の覚書。

VSCodeでC/C++のファイルを編集する際、まずC/C++のプラグインを入れると思う。ついでにClang-Formatプラグインを入れて、保存時にフォーマッタが走るようにする人も多いだろう。しかし、いつのまにかこれが動かなくなった。

具体的には、

* Windows 10
* VSCode 1.43.2
* C/C++ プラグイン 0.27.0
* Clang-Format プラグイン 1.9.0

の組み合わせで、保存時にフォーマッタが走ってくれない。

明示的にフォーマットさせるため、Ctrl+Shift+Pでコマンドパレット出して「format」と入力して「ドキュメントのフォーマット (Format Document)」を選んで実行すると、右下に「write EPIPE」というエラーが出てくる。こんなの。

![epipe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/a695c95e-88b9-3bfe-e8cd-7485048b7992.png)

調べてみると、Clang-Formatのプラグインの[リポジトリ](https://github.com/xaverh/vscode-clang-format-provider)に、同じ問題を報告した[issue](https://github.com/xaverh/vscode-clang-format-provider/issues/83)があった。

そこに書いてあったWorkaroundが

* LLVMを入れる

というものだった。

Clang-Formatプラグインは、clang-formatが見つからないと、VSCodeのC/C++プラグインが持っているclang-formatを使う。それは

`C:\Users\ユーザー名\.vscode\extensions\ms-vscode.cpptools-0.27.0\LLVM\bin\`

にあるのだが、どうもこれとの連携に問題があるらしい。

そこで、 [ここ](https://releases.llvm.org/download.html)から、「Windows 64 bit」をダウンロードしてLLVMをインストールし、clang-formatにパスを通す。LLVMのインストール時に「全員にパスを通す」か「カレントユーザのみにパスを通す」か選べるので、それはお好みで。ただし、ここでパスを通さない場合は、プラグイン側でパスを指定してやる必要がある。

パスを通した場合、適当なターミナル(例えばWindows PowerShell)を起動し、clang-format.exeにパスが通っていることを確認する。

```txt
PS C:\Users\username> clang-format.exe --version
clang-format version 10.0.0
```

この状態でVSCodeを再起動すれば、次からは保存時にclang-formatが走るはず。
ECRにdockerをプッシュする時に、credentialsのエラーが出たときの対処

AWS ECRにdockerをプッシュする時、テンプレートのコピペだと上手くいかないところがあったのでメモ。

## 環境
aws-cli/2.0.6
AWSのプロファイル設定済み

## エラー内容
テンプレートをそのままコピペすると以下のコマンドになります。

```
$ aws ecr get-login-password --region [region] | docker login --username AWS --password-stdin [account].dkr.ecr.[region].amazonaws.com/[repositry name]
```
が、上記のコマンドを実行しても、以下のようなエラーが出てしまいます。

```
Unable to locate credentials. You can configure credentials by running "aws configure".
Error: Cannot perform an interactive login from a non TTY device
```

## 解決方法
AWSのcredentialは設定済みだったのですが、そのプロファイル名を自分で指定してあげる必要がありました。そのためには、コマンド前半の`--region [region]`を`--profile [profile name]`に変更する必要がありました。

```
$ aws ecr get-login-password --profile [profile name] | docker login --username AWS --password-stdin [account].dkr.ecr.[region].amazonaws.com/[repositry name]
```
これで、リポジトリにプッシュできるようになりました。（`[profile name]`には、自分で設定しているプロファイル名を入れます）
Yumのupdateができなかった話

# 自宅のvagrant環境を一新していたら

yumが実行できない状況に陥りました

```
[vagrant@localhost ~]$ sudo yum update
読み込んだプラグイン:fastestmirror
base                                                                                             | 3.6 kB  00:00:00


 One of the configured repositories failed (不明),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Disable the repository, so yum won't use it by default. Yum will then
        just ignore the repository until you permanently enable it again or use
        --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>

     4. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
```

## 対処方法

yumの設定ファイル(/etc/yum.repos.d/epel.repo)のmetalinkが取得できないらしいので、そこをコメントアウトしてbaseリンクをコメント解除しました。

```
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
#metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
#metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
```
[Python] pip3のパッケージを AWS Lambda 上でimportできるようにする

記事の内容はこちらを参照してください。
https://mishimay.github.io/e107b685381cca0493bf/
<!--


AWS Lambda レイヤーにパッケージ用のレイヤーを追加する。


1. パッケージを配置したフォルダを作成

    ```zsh
    pip3 install -t python/lib/python3.7/site-packages <パッケージ名>
    ```
    - `python3.7` の箇所は適宜置き換える

1. `python` フォルダをzipに固める
1. レイヤーにアップロード
1. パッケージを利用したい関数にレイヤーを追加する
1. `import <パッケージ名>` で使えるようになる

## 参考
https://blog.ikedaosushi.com/entry/2018/12/22/231421

## 環境
 
macOS 10.15.4
Python 3.7.7


-->
pandas to_sqlで複数テーブルを一斉に更新

# 方法

pandasでのトランザクションは、SQLAlchemyの`engine.begin()`を使って、以下のように実装できます。

こうすることで、各テーブルの更新に時間が掛かってしまうような場合でも時間差なく同時に更新を反映できますし、失敗時にはロールバックもできます。
`with`を使うことで、自動的にコミットの処理が呼び出されます。(失敗時はロールバック)

```python
from sqlalchemy import create_engine
engine = create_engine(url)

with engine.begin() as conn:
    df1.to_sql('table1', conn, if_exists='append')
    df2.to_sql('table2', conn, if_exists='append')
```

# 注意点

`with`ブロックの中でコミットが走ってしまうようなクエリを流してしまうと、そこでコミットされてしまいます。
参考: [Statements That Cause an Implicit Commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)

例えば、`to_sql` のオプション`if_exists` を'replace'にした場合は、DROP TABLEが走るので、テーブルごとに更新が発生してしまいます。

```python
with engine.begin() as conn:
    df1.to_sql('table1', conn, if_exists='replace')
    df2.to_sql('table2', conn, if_exists='replace')  # DROP TABLEが呼び出されて、table1の更新がコミットされてしまう。
```

テーブルの中身を全部更新する場合は、一度別名でテーブルを作ってRENAME TABLEで入れ替えるのが良いようです。

```python
from sqlalchemy import create_engine
engine = create_engine(url)

df1.to_sql('table1_new', engine, if_exists='replace')
df2.to_sql('table2_new', engine, if_exists='replace') 

engine.execute('''
RENAME TABLE table1 to table1_old, 
             table1_new to table1
             table2 to table2_old,
             table2_tmp to table2;
'''
)
```
PowerShellでSelenium WebDriverを使うための勘所

# はじめに

PowerShellからSeleniumを使ってみてインストールから使いたい機能の調べ方まで分かったことをまとめます。

# 始める

初めて使うならこのサイトがおすすめです。

* [🔰SeleniumをPowershellから触ってみる](https://github.com/senkousya/startSeleniumOnPowershell)

このサイトではSeleniumのライブラリを直接ダウンロードしていますが[nuget](https://www.nuget.org/downloads)を使うとコマンドのみで完結するので楽です。

**ライブラリのダウンロード**

```
nuget install Selenium.WebDriver
nuget install Selenium.Support
nuget install Selenium.WebDriver.ChromeDriver
```

**初期化とchrome起動と終了**

フォルダ名のバージョンはダウンロードしたものを合わせてください。

```powershell
# パス設定
## nugetでダウンロードしたフォルダ
$seleniumHome = '.'
## WebDriver.dllのフルパス
$webDriverDllPath        = Convert-Path (Join-Path $seleniumHome '\Selenium.WebDriver.3.141.0\lib\netstandard2.0\WebDriver.dll')
## WebDriver.Support.dllのフルパス
$webDriverSupportDllPath = Convert-Path (Join-Path $seleniumHome '\Selenium.Support.3.141.0\lib\netstandard2.0\WebDriver.Support.dll')
## chromedriver.exeがあるフォルダのパス
$chromeDriverDirPath     = Convert-Path (Join-Path $seleniumHome '\Selenium.WebDriver.ChromeDriver.80.0.3987.10600\driver\win32')

# dll読み込み
Add-Type -Path $webDriverDllPath
Add-Type -Path $webDriverSupportDllPath

# chrome起動
$chromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($chromeDriverDirPath)

# chrome終了
$chromeDriver.Quit()
```

# 雰囲気が分かってきたら

Seleniumの公式ドキュメントを辿ると機能とそのためのサンプルコードが載っているので参考になります。

* [Seleniumブラウザー自動化プロジェクト](https://www.selenium.dev/documentation/ja/)

特によく使いそうな機能も解説されています。

* [WebDriverをはじめよう > 要素を探す](https://www.selenium.dev/documentation/ja/getting_started_with_webdriver/locating_elements/)
* [WebDriverをはじめよう > AUT* を操作する](https://www.selenium.dev/documentation/ja/getting_started_with_webdriver/performing_actions_on_the_aut/)
* [WebDriver > ブラウザー操作](https://www.selenium.dev/documentation/ja/webdriver/browser_manipulation/)
* [WebDriver > 待機](https://www.selenium.dev/documentation/ja/webdriver/waits/)
* [WebDriver > Web要素](https://www.selenium.dev/documentation/ja/webdriver/web_element/)
* [WebDriver > キーボード](https://www.selenium.dev/documentation/ja/webdriver/keyboard/)

# Selenium PowerShell Module

できる事が分かってくるとPowerShell Moduleを使ってもいいでしょう。これは全部入りなので個別にdllをダウンロードしなくても利用できます。

https://github.com/adamdriscoll/selenium-powershell

**モジュールのインストール**

```powershell
Install-Module -Scope CurrentUser Selenium
```

サンプルは以下のフォルダに用意されています。

https://github.com/adamdriscoll/selenium-powershell/tree/master/Examples

このモジュールでchrome起動と終了は以下のようになります。

```powershell
# Seleniumモジュールをインポート
try {
    Import-Module -Name Selenium -ErrorAction Stop
}
catch {
    Write-Host 'Importing the Selenium module failed. Please install it using the following command: Install-Module Selenium'
    break
}

# chrome起動
$Driver = Start-SeChrome

if (!$Driver) {
    Write-Host "The selenium driver was not running." -ForegroundColor Yellow
    Return
}

# chrome終了
Stop-SeDriver -Driver $Driver
```

# もっと詳しく

使いたいクラスのnamespaceやメソッドを探すときはAPIリファレンスから探すといいでしょう。

* [C# API Reference](https://www.selenium.dev/selenium/docs/api/dotnet/)
素人Python日記③ ～Djangoガールズのチュートリアルをやる（2日目）

# この投稿の目的
日記みたいなものです。
前回同様チュートリアルに従って進めていきますが、問題が発生！
キーボードの「j」が不具合を起こしている！！結構強く押し込まないと認識しないようになってしまいました。

Djangoのチュートリアル上、ディレクトリに「Django」の名前を含んでいるので、「j」入力は頻発。気になる…！！！！


# Djangoガールズ2日目・やったこととわかったことなど

## やったこと
 - 前回デプロイした、ただの「It Works！」を表示するだけのページをブログ化（閲覧・投稿・編集が可能、管理者権限付き）
 - 一応チュートリアルは完遂したことになる
 - 今回はだいたい8時間くらいかかった。くそー。
 
## おぼろげにわかったこと
 - 大文字と小文字をかなり厳密に区別する必要がある（VBEなら勝手に直してくれるのに…これはエディタの問題？）
 - でもクオーテーションはシングルでもダブルでもいいらしい
 - ブログのパーツはデータベースに格納されている
 - パーツはタイトル、日付、内容などで、それぞれ定義することが必要。「モデル」という？
 - viewの中にデータベースを操作するクエリを書く（慣れたSQLとは全然違う）。モデルからひっぱってくる？
 - 動的コンテンツと静的コンテンツの違い。
 - templateはやっぱりHTMLベース。これにpyを読み込むコードを組み込む感じ。変数は「{{変数}}」で出す。
 - テンプレートは拡張することでベースの部分と可変の部分を使い分けることができる。
 - CSSについて。HTMLのタグとCSSはむかーしちょっとだけ遊んだことがあるのですんなり。
 - PythonanywhereではCSSは再読み込みしないと反映してくれない

 
## ほぼわかってないこと
 - モデルのこと全般（とくにviewとの関係）
 - ドットとアンダーラインとあるけどこれなに
 - アンダーライン2回続くことあるけどこれなに
 - Viewの関数の作り方や何が書いてあるのかはまったくわからない
 - renderってなんや
 

# チュートリアルを終えて

最後までやったら、Djangoガールズちゃんから「おめでとうございます。素晴らしいです！よくやりました！本当に大きなことを成し遂げました。」と褒め殺し。あざます。

振り返ってこの記事を書いてみると、分かってないことのほうがリストとしては少なく見えるけど、「なにがわかってないか」がわかってない状態なので、圧倒的に理解度が低いです。
チュートリアルは完走しましたが、繰り返しやる必要がありますね。
自分で作ってみるフェーズには程遠い…

---
＜次の一歩＞
[素人Python日記④ ～Djangoガールズのチュートリアルをもっかいやる（6日ぶり3日目）](https://qiita.com/wahahahagi/items/373acaa269e35f2e2713)

＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](https://qiita.com/wahahahagi/items/9bdb192d8a55a5087dfe)
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
[自宅待機を有効活用する③ ～2020年、ようやくXPをWin10に](https://qiita.com/wahahahagi/items/411b6c0f06d816bac4cc)

＜牛歩的経緯：Djangoと仲良くなる＞
[素人python日記① ～Django導入までの思考回路](https://qiita.com/wahahahagi/items/304229a520f2b0650f03)
[素人Python日記② ～Djangoガールズのチュートリアルをやる（初日）](https://qiita.com/wahahahagi/items/28162eae687c4c793d14)
素人Python日記② ～Djangoガールズのチュートリアルをやる（初日）

# この投稿の目的
日記みたいなものです。

# Djangoガールズにおさわりする
これ（[【Python】でWebアプリをがっつりやるならDjango一択な4つの理由【初心者向け】](https://coinbaby8.com/python-webapplication-django.html)）を読んでいると、
＞特にDjangoジャンゴガールズは、『Django(ジャンゴ)』やっている人は必ずと言っていいほど通る有名なチュートリアルのようです。
とのこと！

ちょっとCCガールズみたいで名前も魅力的だし、やってみよう！ということで、Djangoガールズのチュートリアルをとりあえずやってみることにしました。

（記事には続いて「ガールズって言ってるけど女の子の要素まったくない」と書いてあり、名前の件はぬか喜びに終わることとなりました）

# Djangoガールズ初日にやったこととわかったことなど
「やったこと」といってもチュートリアルに従って進めただけです。
このチュートリアルでは、Djangoの導入からWEB上に管理者機能付きのブログを公開するところまでをやるみたいです。すごい！

## やったこと
 - Djangoのインストールから、デプロイまで（チュートリルのメニューでいうところの「はじめに」から「デプロイ！」まで
 - It Works！という表示が出るWEBページが公開できた（この時点ではブログのブ文字もない）
 - 理解が遅いせいもあるかもしれないが、6時間くらいかかった
 
## おぼろげにわかったこと
 - 仮想環境と本番環境の違い
 - 仮想環境はマシン上で動かしている
 - 仮想環境（ローカルリポジトリ）で作ったコードは、保存（commit）してから、「GitHub」というWEB上の倉庫（リモートリポジトリ）に連携する（PUSH）
 - 本番環境で、GitHubのコードを取り出し（PULL）、デプロイする
 - このチュートリアルでは、本番環境を「Pythonanywhere」で行っている
 - Pythonanywhereは、容量の小さい1つのアプリまでなら無料で運用できる
 - url.pyにはURLを受け取ってどうするか記述するところ
 - views.pyはその後どこを見に行って何を返すか定義するところ
 - templateはその結果をブラウザでどう返すか決めるところ（今日の段階では未登場。HTML？）
 
## ほぼわかってないこと
 - urls.pyをつくったらviews.pyもセットで作る必要がある？めんどくね？
 - そもそもの基本構文（if文とfor文、演算子のチュートリアルはあったものの、なんで「:」を付けるのか、とか、各ファイルの先頭の「from ~ import」が何をしているのか全く分からず
 - manage.pyが何者なのか
 - 「manage.py runserver」とかのコマンドは覚えるしかないの？
 - というかわからないことだらけ（チュートリアルに従っていくとそれは指示通りの結果が出るけど、「なぜこう書くの・こうするの」がわからない）


わからないことだらけですが、まだチュートリアルも途中だし、こういうのは大体一発でわかるもんではないので、あまり焦らずに先に進むことにします。

---
＜次の一歩＞
[素人Python日記③ ～Djangoガールズのチュートリアルをやる（2日目）](https://qiita.com/wahahahagi/items/cfca309d344b616ddeb2)

＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](https://qiita.com/wahahahagi/items/9bdb192d8a55a5087dfe)
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
[自宅待機を有効活用する③ ～2020年、ようやくXPをWin10に](https://qiita.com/wahahahagi/items/411b6c0f06d816bac4cc)

＜牛歩的経緯：Djangoと仲良くなる＞
[素人python日記① ～Django導入までの思考回路](https://qiita.com/wahahahagi/items/304229a520f2b0650f03)
自宅待機を有効活用する③ ～2020年、ようやくXPをWin10に

# この投稿の目的
10年以上前のおんぼろちゃんPCのOSをXPからWin10にした話です。
Win7以上のOSの端末が別途あれば、かなり簡単にできます。
（ない場合は結構ゴリゴリやる必要がありそう？です）

### 対象PC
おんぼろちゃんですが、これでも前回の投稿でSSD化したのでまだまだ戦えます。

- LET'S NOTE CF-W8
- OS : Windows XP Pro
- CPU : Core2Duo U9300 1.2GHz
- メモリ : 3GB
- 容量 : 256GB HDD(空き2GB…)

例えばiTunesなど、OSが古いことを理由に更新版をDLさせてくれないケースがあるのが不満です。今後の作業にこうした支障が出るとイヤなので、OSを最新化しておきます。


# 手順
## 1. 必要なものをそろえる
以下を準備します。
 - 8GB以上の空のUSB ※
 - win7以上が入っているPC（Win10だと最善）→PC②とします

※USBがない場合、DVDでも代替できますが、今回は記載省略します。
※USBは空でなくてもいいですが、後続の作業で勝手にフォーマットされます。

## 2. インストールメディアを作る
PC②で、マイクロソフトのサイトから「メディア作成ツール」をDLします。OSが古いとメディア作成ツールをDLできるページが表示されません。
私はこのおんぼろちゃんしか持っていないので、妻のPCを借りました。

 -[DLサイト](https://www.microsoft.com/ja-jp/software-download/)

ここでの「メディア」とは、要はWindows10のインストール用ソフトのことで、「メディア作成ツール」とは「USB（またはDVD）をインストーラー的にするためのツール」ということです。
昔はOSをインストールするためのCDやDVDを買ってくる必要があったものが、最近はこうなっているんですね。XPで時代が止まっていたのでビックリしました。

## 3. 実行する
メディア作成ツールを実行すると、Win10のイメージファイル（iso）がDLされます。isoは簡単に言うとCDやDVDの中身をまとめたものです。
で、このisoをどうするか聞かれます。PC②をアップデートするのか、USBやDVDをメディアにするのかですが、後者を選択します。
完了したらUSBを外して完了です。PC②はもう使いません。


## 4. Win10をインストールする
インストールしたいPCにUSBを挿した状態でBIOS起動します。
BIOSの起動方法はPCによって異なりますが、LET'S NOTEの場合は起動時のPanasonicロゴでF2押下です。

BIOSの「起動」タブ（BOOTタブと表示されていることも）から、読み込みの優先順位がUSBが1位になるよう設定します。
（後で元に戻すので、デフォルトは一応覚えておきます）

で、あとはそのまま起動すれば、インストーラ化したUSBがガンガン進めてくれるので待つだけです。画面にも「すべてお任せください」と表示されたりします。
途中、言語とかキーボードとか聞かれますが、指示通りにやればOK。
ライセンスはなければ後で購入することを選択しておきます。
割と時間食いますが、インストールはこれで終わりです。

## 5. BIOS設定を戻す
一度PCを再起動して、同じくBIOSを起動します。
前項で変更した起動時の読み込みの優先順位を元に戻し、起動すればすべてが完了！

## 6. XPからWin10にしてみて
CPUの懸念はあったものの、めちゃめちゃ爆速で動いています。複数タブでブラウザ（Chrome）を立ち上げながら別の作業をしていても速度やレスポンスは気になりません。ブラウザ上でyoutube観るくらいなら何の問題もなさそうです。Core2Duoやるやん！
タスクマネージャ上はCPU使用率がコマンド入力時に60～90%、メモリは40%前後で推移していて、結構ウッときますが、サブ的に使うだけなら当面ダイジョブでしょう。

ただ、分かってはいたのですが全てのインストール済みソフトがパーになっています。
OFFICEは無料WEB版が使えるので、それがどこまで耐えられるものなのか。あとは統計解析に使うSASが入っていたのですが、都合により再インストールはできない状態。他のソフトは無料だったりもう使わなかったりと諦めもつくのですが、この2点だけは気がかりです。

しばらく使ってみてやはり必要だとなれば元のHDDを使ってXPに戻すことも視野に入れつつ、とりあえずは当初目的のプログラミングに進んでみます。

---
＜次の一歩＞
[素人python日記① ～Django導入までの思考回路](https://qiita.com/wahahahagi/items/304229a520f2b0650f03)

＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](https://qiita.com/wahahahagi/items/9bdb192d8a55a5087dfe)
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
自宅待機を有効活用する① ～思い立ちからゴール設定まで

# はじめに
新型コロナウイルスの影響で、リモートワーク活用の機運が高まっています。
私の勤める会社では、まだインフラ面の整備が追い付いていませんが、全員がウイルスに感染し業務が完全停止することを避けるため、基本的に「自宅待機」の方針になりました。

リモート環境もなく、会社からの端末貸与もないので、まともに仕事ができる状態ではありません。「自宅勤務」ではなくあくまで「自宅待機」。
待機期間中は仕事の資料のインプットや頭の整理、自己研鑽にハゲメヨとのことです。
これを機にプログラミングを勉強してみよう、と思い立ち、このアカウントを作成するに至りました。

# おことわり
上述の通り、このアカウントは自己研鑽を目的にしています。
私は、プログラミングなど10年前に大学の授業で触ったっきりの完全な素人です。
先達の知恵をお借りするのに最も適切な場と思いQiitaにアカウントを開設しましたが、こちらから有益な情報を発信できることはないかもしれません（Qiitaのポリシーに反していたらすみません）。


# 当面のゴール設定
ひとまず目指すのは、会社で使える蔵書管理ツールの作成です。昨今、部署内で保管している図書が増えており、誰が何を借りているのか管理する必要がありました。

機能としては、以下3点を要件とします。

1. 蔵書検索 : 図書名により在庫をユーザーが検索できる
2. 貸出管理 : 借りる・返すをユーザーが入力できる
3. 本のレビュー投稿 ： 感想をユーザーが投稿できる

また、会社で使うことを想定するため、制約事項もあります。

1. 会社のサーバーには一切接続しない
2. 無料で運用できる
3. 自分が異動しても継続稼働できる

さて、この制約1.がクセモノです。セキュリティ等の都合で、自己所有のデバイスで作ったツールなんか社内に持ち込むのは問題外です。
社内サーバにツールを置いていいなら、EXCELやACCESSでさくっと作ればいいのですが、そうはいきません（かといって専用のスタンドアローンを用意するのも馬鹿馬鹿しいし、紙で運用するのもツマラナイ）。
ということで、社内サーバとは完全に切り離した設計を考えていきます。

### 構想
「皆が持っている・使える」「メンテナンス以外の運用管理がいらない」ことから、LINE上で動くWEBアプリによる実装を目指すことにします。

# 環境構築
といっても、いわゆる開発環境ではありません。
埃にまみれたノートPCのケースを引っ張り出して起動してみたところ、背筋の凍るHDDのガリガリ音…。起動も遅く（電源オンからChrome起動まで10分程度）、まずは自宅環境を整えることが最優先と思われました。

なお、PCの基本スペックは次の通りです。全体的に酷い。
- LET'S NOTE CF-W8
- OS : Windows XP Pro
- CPU : Core2Duo U9300 1.2GHz
- メモリ : 3GB
- 容量 : 256GB HDD(空き2GB…)

次回以降、HDDのSSD換装とWindows10化を行っていきます。

---
＜次の一歩＞
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
Re:ゼロから始めるMITライセンス生活

# はじめに
MITライセンスとは結局何なのか、我々（ぼっち）取材班がその真相に迫ります。

# 取材班（ぼっち）の属性
約14.9歳。Pythonとか言語とかレタリングとか。春から受験生になったが休校中なのでイマイチ実感が湧かない。

# 原文（え、丸パクリじゃん）
[http://opensource.org/licenses/mit-license.php](http://opensource.org/licenses/mit-license.php)

> The MIT License

> Copyright (c) \<year> \<copyright holders>

> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# 拙訳
> このソフトウェアおよび関連するドキュメント（以下、「本ソフトウェア」）のコピーを入手したいかなる人に対しても、使用や複製、変更、併合、公開、分配、再許諾、本ソフトウェアのコピーの販売、および本ソフトウェアを提供する人にそれらを許可する権利を、以下の条件に従って、無制限・無償で許可します。

> 上記にある著作権上の注意とこの許可についての文を、すべてのコピーまたは本ソフトウェアの中の重要な部分に記載すること。

> **本ソフトウェアは明示的であるか暗黙的であるかにかかわらず、いかなる保証[^1]も含まずに「そのまま」提供されます。いかなる場合でも、著作者または著作権者は、契約、不法行為、またはその他の責任を負いません。また、本ソフトウェアまたは本ソフトウェアの使用やその他の取引から生じた、またはそれに関連して生じた、いかなる請求、損害、その他の責任についても責任を負わないものとします。**

# まとめ

1. 👍中身をいじって公開してもいいよ！
2. 🤗再許諾もOK!
2. ✏️でも、このライセンス表示を、プログラムの全部のファイルか、重要な部分に書いてね！
3. 😤何か問題が起きても責任は負いません。

ということです。

# 終わりに
MITライセンスって最高ですね。

[^1]: 保証とは、「商用に適しているかどうか、特定の目的に適合しているか、または不適合かどうか」を含むが、それらに限定されない。
Ｃ言語　ALDS1_4_B　Binary Search

##問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_B&lang=ja

##コード
```c
#include <stdio.h>

int A[1000000],N;

int binary_search(int key){
    int left = 0;
    int right = N;
    int mid;

    while(left < right){
        mid = (left + right) / 2;
        if (key == A[mid])
            return 1;
        if (key > A[mid])
            left = mid + 1;
        else if (key < A[mid])
            right = mid;
    }
    return 0;
}

int main(void)
{
    int i, q, key, count = 0;
    
    scanf("%d", &N);
    for(i = 0; i < N; i++)
        scanf("%d", &A[i]);

    scanf("%d", &q);
    for(i = 0; i < q; i++){
        scanf("%d", &key);
        if (binary_search(key))
            count++;
    }
    printf("%d\n", count);

    return 0;
}
```


##ポイント
- データのキーが整列されているときしか使えない

##所感
- 途中別のことしてた。スクリーンタイム使わないと。

所要時間：30分
【UE4】UFUNCTIONの種類【UnrealEngine】【C++】


UFUNCTIONのブループリント(BP)関係の指定子による挙動一覧表


| 指定子       |BP側で呼び出し可能か　　　|   BPのイベントとして使えるか　　　 |C++で処理を書けるか　　　|
|:-----------------|------------------:|:------------------:|:------------------:|
| BlueprintCallable         |      〇 　　　　|        ×        |　　　〇　　　|
| BlueprintPure             |       〇 　　　　|        ×        |　　　〇　　　|
| BlueprintImplementableEvent|     × 　　　　|       〇       |　　　×　　　|
| BlueprintNativeEvent       |      × 　　　　|        〇        |　　　〇　　　|


BlueprintCallable 
--------------
BP側で呼べるようになる。
関数の後ろにconst を付けると実行ピンを持たないノードになる。
主にC++で書いた処理をBPで呼び出したい時に使う
![Callable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/02513ceb-95c9-1a69-f3bc-8fddabaa797a.png)


BlueprintPure 
--------------
Blueprintからの呼び出しが可能。
実行ピンを持たないノードになる。

BlueprintImplementableEvent
-------------
C++で処理を実装する事は出来ず、BPのイベントとして処理を書ける。
C++側で関数を呼び出すこともできる為、主にBPで作った処理をC++で呼び出したい時に使う。

BlueprintNativeEvent　
-------
BlueprintNativeEventはC++で処理を書きたい場合

	UFUNCTION(BlueprintNativeEvent)
	void CountdownHasFinished(); 
	virtual void CountdownHasFinished_Implementation(); // C++で中身を書くのはこっちだけ

virtual void 〇〇_Implementation();と記述しソースファイルに処理を書きこむ

![C++.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/089f018c-cc44-731c-eea2-bb84bf2e5fcc.gif)
出てきたのもノードで繋げればC++で作った処理も通る

エラーになる書き方
------
BlueprintImplementableEventやBlueprintNativeEventなどイベントとして扱う関数はソースを作成してしまうとエラーになる
安否確認LINEボット【説明編】

![スクリーンショット 2020-04-07 12.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/cadd62da-ad81-dbc1-6f80-6e52554fdc2a.png)


#はじめに
[この記事](https://www.google.co.jp/amp/s/www.jiji.com/amp/article%3fk=2020040400181&g=soc)を読んで、とうとうコロナウイルス感染患者数が東京都の確保した病床数を超えて、自宅療養が増えるみたいなので作りました。

とりあえずテストで公開なのでLINEは一旦無料プランなのですが、利用者が万が一増えたら有料にしようかなと思ってます。
LINEプッシュ代が怖いけれど・・・。

とりあえず[このボット](https://lin.ee/nuBNXt0)をシェア
![775sszex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/38bcccb1-a156-24d1-5502-aa0083c6ed70.png)

今回は簡単な説明

#メニュー

友達追加をするとデフォルトで下のようなメニューがセットされていますので、これの説明を書きます。
![richmenu_1585813023461.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/aab3f729-db71-f6fe-dacb-463199d669f1.jpeg)

- 設定
    このボットの各種設定を行います。詳細はこの次に書きます。
- 説明
    この記事のもっと簡単に書いた説明書的なものを表示します。
- ボットについて
    このボットの概要や作成しようと思ったきっかけ、私についてや寄付のお願いまで書いたものを表示します。

「説明」と「ボットについて」は、上記の通りですが設定だけもう少し詳しく書いていきます。

###設定
メニューの設定を押下するとこのようなメニューを表示します。

![スクリーンショット 2020-04-05 23.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/9bcc700c-8b21-12cc-6e6f-e814eedfb5c7.png)

- 緊急連絡先について(3人まで追加可能)
    - 追加：緊急連絡先を追加します。このボタンを押して表示された登録手順のメッセージを緊急連絡先にする人へ送ってください。このメッセージは一人一人違う為、直近で発行されたメッセージを送ってください。(コードを受け取った人の操作は、「他の人の緊急連絡先として設定」の操作になります。)
    - 一覧表示：現在の緊急連絡先の一覧を表示します。変更などする場合は、この一覧で表示された人の隣にある「削除」ボタンを押して削除した後、追加してください。
- 時間について
    - 確認時間の設定：確認メッセージを送信する時間を設定します。一覧が表示されるので、編集ボタンを押下してください。デフォルトでは07:00と19:30に設定されています。
    - 再確認時間の設定：１度目の確認メッセージを送信した後、ユーザーからのアクションがない場合、再度メッセージを送る時間の間隔を設定します。上記、確認メッセージを送信する時間から30分単位で2時間後まで指定することが出来ます。
- その他の設定
    - 再確認の回数設定：再確認を行う回数を設定します。1回〜3回まで指定することが出来ます。デフォルトでは2回に設定されています。例えば、再確認の回数を2回、確認時間の設定を30分にすると、19:30にメッセージが届いた後に安否確認が取れない場合、20:00、20:30と合計3回のメッセージが届きます。また21:00の時点でも安否確認が取れない場合は緊急連絡先へメッセージが届きます。
    - 通知メッセージの編集：緊急連絡先へメッセージを送る際に添えられるメッセージです。もし家族がいない場合など、自治体やお医者様にご協力頂くことを想定しています。その際はこのメッセージに住所などを書いておくことでメッセージで緊急連絡先に知らせることが出来ます。
    - 他の人の緊急連絡先として設定：他の人の緊急連絡先となる為のボタンです。依頼者から受け取ったメッセージに従って操作していくと依頼者の緊急連絡先として登録されます。
    - 安否確認の一時停止・解除：海外旅行や入院など、携帯電話が使えない状況になることがわかっている場合は、このボタンを押すことでメッセージ送信を一時的に停止することが出来ます。また、緊急連絡先へメッセージが送信された場合も一時停止状態になっていますので、再度ご利用の際はこのボタンを押して一時停止を解除してください。

※ 安否確認メッセージが送信されるのは、緊急連絡先が1つ以上登録されている事が条件になります。

コードの説明は別記事にて。

#最後に
何回かやりとりするシナリオ型の場合は、状態管理が大変でやっぱりIFROみたいなサービス使った方がいいなと思いました。
早くコロナ消えろーーーーー！！！
Python(tensorflow.keras×flask×gunicorn)×Heroku　〜git push heroku masterできない〜

# はじめに
前回作成したPythonアプリをherokuにデプロイしてみようとしたけど、Compiled slug sizeが500MBオーバーでherokuにpushできなかった備忘録

git -> heroku　の方法を試してみた（github -> heroku の方法もあるらしい）

前回作成したPythonアプリ
[Python × Flask × Tensorflow.Keras 猫の品種を予測するWebアプリ２](https://qiita.com/Susasan/items/4c9e81abe5cf5c194a97)

# 環境
macOS
Python3.7.5

# 試した方法
参考：[公式チュートリアル](https://devcenter.heroku.com/start)

### Heroku用の用意
1.gunicornをインストール

```bash
pip install gunicorn
```

2.ファイル用意

```bash:requirements.txt
Flask==1.1.2
tensorflow==2.1.0
numpy==1.18.2
Pillow==7.1.1
gunicorn==20.0.4
```

```bash:Procfile
web: gunicorn app:app --log-file -
```

```bash:runtime.py
python-3.7.5
```

3.gitにデプロイ
モデルは100MB以上あるためBucketeerに入れる予定・・・
参考：[HerokuでTensorFlowのAPIをホストした話](https://cloud.flect.co.jp/entry/2019/12/20/000000)

```
folder
  ｜- app.py #元sever.py
  ｜- image_process.py
  ｜- templates
  ｜　　｜- index.html
  ｜- requirements.py
  ｜- runtime.py
  ｜- Procfile
```


### Heroku Command Line Interface (CLI)をインストール

1.herokuコマンドを使えるようにする

```bash:terminal
$ brew install heroku/brew/heroku
```
2.Pythonアプリをherokuにデプロイする

```bash:terminal
$ heroku login
$ heroku create アプリ名 #herokuにリポジトリを作成する？
$ heroku git:remote -a アプリ名 #gitとherokuのリポジトリ(アプリ名)を紐付ける
```

3.herokuにPythonプログラムをpushする

```bash:terminal
$ git push heroku master
```

😥ここでerrorメッセージが出てしまいpushできませんでした
😥```Compiled slug size: 518M is too large (max is 500M).```を解決しないとダメのようです
😥tensorflowが400M以上を占めているらしい．困った

```bash:errorメッセージ
(略)
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:  !     Compiled slug size: 518M is too large (max is 500M).
remote:  !     See: http://devcenter.heroku.com/articles/slug-size
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !       Push rejected to (アプリ名).
remote: 
To https://git.heroku.com/(アプリ名).git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/(アプリ名).git'
```
【解決方法】Mysql2::Error: Table 'users' already exists

#Mysql2::Error: Table 'users' already existsエラーに遭遇

```
Mysql2::Error: Table 'users' already exists
```
<space>
どうやらusersテーブルが既に存在しているため、マイグレートが実行できない様子
<space>
<space>
解決方法として既に存在するusersテーブルを削除し、再びマイグレートすれば良さそうだ
<space>
<space>



ターミナルで以下のコマンドを実行

```
$ rails db:
```


すると
<space>

```
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 490
Server version: 5.6.47 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

```
 <space>
長々と文章が出てくるが、とりあえず次のコマンドを実行
 <space>

```
mysql> SHOW TABLES；
```
<space>
mysqlのテーブルが表示される
<space>
<space>

```
+---------------------------+
| Tables_in_app_development |
+---------------------------+
| ar_internal_metadata      |
| posts                     |
| schema_migrations         |
| users                     |
+---------------------------+
```

ここからusersテーブルを消すために、次のコマンドを実行

```
mysql> drop table テーブル名;
```

今回はusersテーブルなので

```
mysql> drop table users;
```

```
Query OK, 0 rows affected (0.04 sec)
```

削除完了。　sequelProで中身を確認してところ、無事消えていた。


ターミナル上の操作はなかなか覚えられないが、こうした作業ができるのを知っておくのが大切かなと。
pygame で音楽再生した時、音程が変わってしまう。

#pygameで音楽を再生する。
今回は、Pythonで音を鳴らすために"pygame"のライブラリをインストールした。しかし曲の音程が変わるという問題が発生したので、解決方法を書いておく。

##環境
Python: 3.7.4
pygame: 1.9.6
mutagen: 1.44.0

##最初に実行したコード
```pygame_test.py
import pygame.mixer
import time

def main():                                   
    filename = "test.mp3" #曲のファイル名を指定する。（フルパスを指定したほうが良い）
    pygame.mixer.init(frequency = 44100) #pygameの初期化
    pygame.mixer.music.load(filename) #音楽ファイルを読み込む
    pygame.mixer.music.play(1) #再生回数を指定
    time.sleep(20) #20秒間動作を停止
    pygame.mixer.music.stop() #再生の終了
    pygame.mixer.quit() #pygameを終了

if __name__ == '__main__':
    main()
```
##音程が変わってしまう謎
これを実行すると曲が20秒間再生される。このとき再生するファイルによって音程、テンポが変わってしまう場合があった。何度も条件を変えたりして試行錯誤し、これの原因は__pygame.mixierの初期化__にあることが判明した。pygame.mixierを実行すると指定した__frequency(サンプリング周波数)__で初期化される。しかし曲のサンプリング周波数にあっていないと、正しく再生されない。そのため再生する曲に合わせて初期化する必要がある。また_time.sleep()_も曲の長さに合わせた方が好ましい。よって曲のデータを取得できる__mutagen__をインストールした。

##次に実行したコード
```pygame_test2.py
import pygame.mixer
import time
from mutagen.mp3 import MP3 as mp3

# メイン
def main():                                   
    filename = "test.mp3" #曲のファイル名を指定する。（フルパスを指定したほうが良い）
    pygame.mixer.init(frequency = mp3(filename).info.sample_rate) #曲のサンプリング周波数を取得しその値で初期化する。
    pygame.mixer.music.load(filename) #ファイルの読み込み     
    mp3_length = mp3(filename).info.length #曲の長さを取得
    pygame.mixer.music.play(1) #曲の再生回数             
    time.sleep(mp3_length + 1)        
    pygame.mixer.music.stop() #再生を停止         
    pygame.mixer.quit() #pygameの終了

if __name__ == '__main__':
    main()
```
##問題なく再生された
無事mp3を鳴らすことができるようになった。しかし、もっと簡単なやり方があってもいいと思うが...。

##参考にさせてもらったサイト
【Python】PygameでBGMの再生
https://shizenkarasuzon.hatenablog.com/entry/2019/02/24/090652

PythonでMP3音源を再生する
https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028

pygame.mixerモジュール説明
http://westplain.sakuraweb.com/translate/pygame/Mixer.cgi
pandas形式のfileの読み込み

#0. 本記事の内容
この記事はデータ分析をするための、ファイルを読み込み、出力の方法をメモとして残すものです。


#1．参考サイト

[pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)


#2. jupyther- notebookでのCSV読み込み

```
df = pd.read_csv('train.csv', sep = ',', na_values = '.', header = None)
```

>#Tips　読み込みタイプ
csvファイルの読み込みはread_csv()、tsvファイル（タブ区切り）の読み込みはread_table()


>#Tips　データの区切り
カンマでもタブでもないデータの区切りの場合、引数（sepかdelimiter）で区切り文字の指定が可能。



>#Tips　読み込みデータにheaderがない場合
標準で読み込みデータの1行目はheaderとして扱われる。読み込みデータにheaderがない場合は、`header = None` と指定する。

>#Tips　読み込みデータにheaderがある場合
headerの読み込み位置を `header=2` などで、明示的に指定する。指定個所以前は読み込まれない。

>#Tips 読み込みデータ型
データ読み込み時に、データ型を指定する場合は2通りある。1つ目は `dtype = str`として指定する場合。これは読み込みデータすべてに適応される。2つ目は `dtype={'b': str, 'c': str}`と辞書形式で指定する。

>#Tips 欠損値の扱い
データ読み込み時に欠損値として扱いたい場合は、 `na_values = ["-","."]` と指定することで、欠損値扱いすることができる。



#3. Google ColaboratoryでのCSV読み込み

1．アイコンクリック
2．Mount Drive選択
3．自動でこの部分が追加される（※）

3以降．別画面にてColaboratoryと連携をするアカウントを求められるので、選択。その後IDが発行されるため、IDをコピーしてColaboratoryに貼り付け。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/8c6d90ac-95f5-8598-43de-764d487af719.png)


（※）自動で追加されない場合は以下コマンドを記載

```
from google.colab import drive
drive.mount('/content/drive')
```


`pd.reac_csv()` にて以下の通り、パスを指定をする

```
data_fixed = pd.read_csv("/content/drive/My Drive/ColabNotebooks/XXX.csv")
```

それ以降のCSVファイルの読み込みは `2. jupyther- notebookでのCSV読み込み` と同じ。

#3.2　ローカルからアップロード

以下コマンドにて、ローカルからアップロードをするファイルをせんたｋ

```
from google.colab import files
uploaded = files.upload()

import io
df = pd.read_csv(io.StringIO(uploaded['XXX.csv'].decode('utf-8')))
```
XXX.csvはアップロードをしたCSVファイルです。


#4．Google ColaboratoryへのCSVファイル出力

出力形式は以下の通り。

```
df.to_csv("/content/drive/My Drive/Colab Notebooks/XXX.csv")
```

#5．ブラウザ経由でローカルへダウンロード（Google ColaboratoryとJupyter-notebook共通）

```
df.to_csv('XXX.csv' , index=False)
files.download('XXX.csv')
```

>#Tips indexの省略
データ出力時に `index` 部分が必要ない場合は、 `index = False` と指定する。kaggleでcommitする際に `index` が必要ないケースが多いため個人的には役立つ。 

>#Tips colaboratoryからのダウンロード
colaboratoryからダウンロードする際は以下を読み込む必要がある。

```
from google.colab import files
```
コツコツ学ぶJava　変数

#1.目的
自宅にJAVA開発環境を用意して"Hello World"を出力させたまではよかったのですが、特に作りたいものも思い浮かばずずっと放置していたので、ちょこちょこ触って学習していきたいな～といった勉強目的のメモ代わりに記事を作成しました。


#2.今回やること
変数について軽くおさらいをして、練習問題を解いてみる。

#3.変数の宣言

構文は
型名 変数名;
です。

適当に書いてみます。
型名は intを使って、、
変数名は numを指定します。



```java
	public static void main(String[] args){
		int num;
	}
```

#4.変数の利用
先ほど作った変数名（num）に値を代入します。
構文は
変数名 = 値；
です。

```java

	public static void main(String[] args){
		int num;
		num = 3;
	}
```

#5.代入した値を出力
①int num;では変数numを宣言しています。
②num = 3;は変数numに3を代入しています。
※＝（イコール）はAとBが等しいという意味ではなく、値を代入するという機能を表すものです。
③System.out.println();で（）内に変数を入れることで処理結果画面へ変数numに代入した値を出力します。

```java

	public static void main(String[] args){
		int num;
		num = 3;
		System.out.println("変数numの値は"+num+"です。" );
	}
```

出力結果は以下の通りです。

```java

変数numの値は3です。
```

#6.変数を初期化する
変数の宣言と同時に変数に値を格納することを初期化と呼びます。
構文は
型名 識別子 = 式（値）；
です。

さっき宣言した変数numを例に初期化するコードにすると、、

```java

	public static void main(String[] args){
        /// TODO 自動生成されたメソッド・スタブ
		int num = 3;

		System.out.println("変数numの値は"+num+"です。" );
	}
```
#7.最後に練習問題を解いてみます。
問題：次のように画面に出力するコードを記述してください。
あなたは何歳ですか？
23
あなたは23歳です。

どうやらキーボードからの入力が必要みたいです。
分かんないのでググってみると、、「Scanner」を利用するみたいです。
例文

```java

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
 
        System.out.println("キーボードから入力してください");
 
        Scanner scan = new Scanner(System.in);
 
        String str = scan.next();
 
        System.out.println("入力された文字は「" + str + "」です");
 
    }
 
}
```


というわけで、まるパクリですが

```java

package practice;

import java.util.Scanner;

public class practice {


	public static void main(String[] args){
        /// TODO 自動生成されたメソッド・スタブ
		System.out.println("あなたは何歳ですか？");
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		System.out.println("あなたは" + str + "歳です。");
	}

}
```

```java
あなたは何歳ですか？
23
あなたは23歳です。
```

問題の答えにはなったかな？

問題の解答があったので見てみます。

```java

inport java.io.*;

class SampleP3
{
	public static void main(String[] args) throws IOException
	{
		System.out.println("あなたは何歳ですか");
		
		BufferedReader br = 
		new BufferedReader(new InputStrreamReader(System.in));
		
		String str = br.readLine();
		
		int num = Integer.parseInt(str);
		
		System.out.println("あなたは"+num+"歳です。");
	}
}
```


だいぶ違いますね。練習問題の意図と違う回答をしてしまった気がしますが結果が同じなので良しとします。

#参考文献
・キーボードからの入力
https://www.sejuku.net/blog/63188
Confluenceのインストール nginxによるhttp→httpsへのリダイレクトあり

基本はここに従う
https://qiita.com/gamisan9999/items/26a11bc9efb408c50cf3

【Nginxの設定】
vi /etc/nginx/nginx.conf
98行目以降に以下を追加
location / {
client_max_body_size 100m;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8090;
}
を行うこと
nginx再起動
Dart(Flutter)で正規表現による文字列チェック

# 経緯
Flutterでテキストフィールドの入力チェック処理を作ろうと思ったが、意外と日本語の情報が少なかったのでメモ。

# 書き方
```dart
bool result = new RegExp(r'正規表現').hasMatch(value); // 文字列valueが正規表現と一致する場合、true
```
ちなみに、`r'正規表現'`の`r`はタイプミスじゃなくて、エスケープ(`\`)なしで文字列で記号を扱いたいときに付ける接頭辞らしいです。便利。
(`r`じゃなくて`@`と書いている情報もありましたが、dart2.7では`@`だとコンパイルエラーになりました)

# 使用例
valueが全角カタカナかどうかチェックする場合

```dart
bool result = new RegExp(r'^[ァ-ンヴー]+$').hasMatch(value);
```

# 参考
https://www.woolha.com/tutorials/dart-using-regexp-examples
https://riptutorial.com/ja/dart/example/12472/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E4%BD%BF%E7%94%A8
https://qiita.com/fubarworld2/items/9da655df4d6d69750c06
numpyで綺麗な円を描く

OpenCVのcircleは適当なので、もっと綺麗な円を書きましょう。半径`r`の円の画像は、中心から`r-1`以下の距離では1、`r`以上の距離では0、その間では`r-距離`とすることとします。

```python
import math, cv2, numpy as np
# r must be greater than 0.
def circle(r):
    c = math.ceil(r - 1)
    s = c * 2 + 1
    return np.clip(r - np.sqrt(np.sum((np.stack((
        np.tile(np.arange(s), (s, 1)),
        np.repeat(np.arange(s), s).reshape((-1, s))
    )) - c) ** 2, axis=0)), 0, 1)
# r must be greater than 0. width must be greater than 0 and less than r.
def outline_circle(r, width):
    circ = circle(r)
    icirc = circle(r - width)
    ch, cw = circ.shape
    ich, icw = icirc.shape
    sx = (cw - icw) // 2
    sy = (ch - ich) // 2
    ex = sx + icw
    ey = sy + ich
    circ[sy:ey, sx:ex] = np.amax(np.stack((circ[sy:ey, sx:ex] - icirc, np.zeros((ich, icw)))), axis=0)
    return circ
def save_cv2_circle(file_name, r, thickness = -1):
    s = r * 2 + 1
    cv2.imwrite(file_name, cv2.circle(np.zeros((s, s), dtype=np.uint8), (r, r), r, 255, thickness))
def save_circle(file_name, c):
    im = (np.around(c) * 255).astype(np.uint8)
    cv2.imwrite(file_name, im)
save_circle('/tmp/circle10.jpg', circle(11))
save_cv2_circle('/tmp/cv2_circle10.jpg', 10)
save_circle('/tmp/circle10_outline.jpg', outline_circle(11, 1))
save_cv2_circle('/tmp/cv2_circle10_outline.jpg', 10, 1)

```

`/tmp/circle10.jpg`
![circle10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35437/309398d5-2c92-432a-a16d-4b8ac4ab252c.jpeg)

`/tmp/cv2_circle10.jpg`
![cv2_circle10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35437/dc320099-cd0b-91d5-7044-5a9746042b8d.jpeg)


`/tmp/circle10_outline.jpg`
![circle10_outline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35437/4398fc97-183e-d196-1ffc-3981f76a937e.jpeg)


`/tmp/cv2_circle10_outline.jpg`
![cv2_circle10_outline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35437/ac9ff08d-23fe-bfe2-fe0a-3c77afa0a037.jpeg)

違いは一目瞭然ですね。
ScalaはJVM上で動くんだよ

## JREとJDK
JREは(Java Runtime Environment)　で実行環境
JDKは(Java Development kit)　で開発ツール
のことである。
scalaではJDKを使用する。

コンパイル済みのプログラムを実行するだけであればJREでOK
プログラムをコンパイルする必要があるのならJDKが必要となる
JDKはJREも同梱するのでscalaではJDKをインストールすれば問題ない。

## コマンドの種類
JavaコマンドはJavaアプリケーションを起動するコマンド
Javacコマンドはjavaソースコードをコンパイルするためのコマンド

## scalaがJVM上で動くメリット
・OSの差異などに左右されずポータルな実行プログラムである。

・java標準ライブラリをはじめ、既存のjavaモジュールを呼び出すことができる。
今まで蓄積されたjavaのナレッジの恩恵を受けることができる

・実行時パフォーマンスがある程度高速である。

## JVM上で動くデメリット
メリットがあれば当然デメリットがあるというもの
・サーバアプリケーションなどの常時稼働の用途では問題にならないが、コマンドラインなどから都度実行する用途ではJVM起動時に一定の時間がかかることがネックとなる場合がある。
・Goなどの実行時のメモリフットプリントが小さい言語と比較すると、小規模なアプリケーションでもそれなりにメモリの使用量が大きい。
上記のデメリットがある。

## Scalaのイベント
近年サービス運営企業を中心に利用する企業が増加傾向にある。
アジア地域で最大級のScalaのカンファレンスが毎年東京で開催されている。その名も「Scala Matsuri」
次回の開催時には参加してみたいですね。

##　開発環境
テキストエディタ派とIDE派が存在している。

## 参考書籍
[実践scala入門](https://gihyo.jp/book/2018/978-4-297-10141-1)
git コマンド集

# gitのコマンド集
### gitを勉強しようと思った経緯
作った成果物の管理をgitで行おうとしましたがgitのコマンド自体うる覚えだったので  
本腰入れて勉強しようと決意しました。  
下記の構成で投稿していきます。
・[コマンド一覧](https://qiita.com/atsuk0r0/items/821a65e635eb13b4921f)
・ ローカルリポジトリに関する操作
・ リモートリポジトリに関する操作
・ ブランチとマージを使いこなす方法
・ リベース、スタッシュの操作について
※その都度記事を更新していきます。

## 勉強方法 
udemyの講座で勉強しました。下記が教材です。
[もう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/share/101WYWBkIYc1dWTXg=/)
図解を用いて説明してくださるので理解しやすくて楽しく勉強できました。

## コマンドまとめ
||コマンド|コマンドの概要|
|:--|:--|:--|
|1|git init|ローカルリポジトリの作成|
|2|git add <資源名>|資源をステージにあげる|
|3|git commit|資源をコミットする|
|4|git status|コミット対象の資源の状況を確認|
|5|git diff|資源の差分の確認|
|6|git log|最新のログから参照|
|7|git mv|ファイル名の変更を記録|
|8|git remote add <リモート名> <URL>|リモートリポジトリを新規追加|
|9|git push <リモート名> <ブランチ名>|ローカルリポジトリの内容をリモートリポジトリに送信|
|10|git checkout -- <ファイル名>|変更を取り消す|
|11|git reset HEAD <ファイル名>|ステージからファイルの変更を取り消す|
|12|git fetch <リモート名>|リモートリポジトリから情報取得|
|13|git merge <リモート名> <ブランチ名>|ローカルリポジトリの内容をローカルに反映|
|14|git pull <リモート名> <ブランチ名>|リモートリポジトリから情報取得|
|15|git remote show <リモート名>|リモートの情報を確認|
|16|git remote rename <旧リモート名> <新リモート名>|リモート名変更|
|17|git remote rm <リモート名>|リモートの削除|
|18|git branch <ブランチ名>|ブランチを作成|
|19|git checkout <既存ブランチ名>|ブランチの切り替え|
|20|git branch -m <ブランチ名>|ブランチ名を変更|
|21|git branch -d <ブランチ名>|ブランチを削除|
|22|git commit --amend|直前コミットの取り消し|
|23|git rebase -i <コミットID>|マージする際に履歴を整形|
|24|git tag|タグを表示|
|25|git show <タグ名>|タグのデータを表示|
|26|git tag -a <タグ名>|注釈つきのタグを作成|
|27|git tag <タグ名>|軽量版のタグを作成|
|28|git push <リモート名> <タグ名>|タグをリモートリポジトリに送信|
|28|git stash|作業の一時避難|
|29|git stash list|避難した作業を確認|
|30|git stash apply|最新作業を復元|
|31|git stash apply --index|ステージの状況も復元|
|32|git stash drop|最新の作業を削除|
|33|git stash drop <スタッシュ名>|特定の作業を削除|
|34|git stash clear|全作業を削除|
※ 「**オプション指定せなあかんでっしゃろ！！！**」というのもありますがひとまずメモ書き程度に作りたかっただけなのでお許しください。。。

## 最後に
gitのコマンドを一通り羅列しましたが今後更新していくと思います。
gitのコマンドを体系的に学んでみてgitの仕組みも理解できたので
めちゃくちゃ有意義な時間を過ごせました。
udemyの講師には感謝、感謝です！！！
[Elm]foldr(とfoldl)を勉強してループなしでも再帰で頑張る

# 関数型ではどうしたらいいんだろう?

elmを使ってきて多くのことはmapやfilterなどでなんとかなるのですが、ループで配列やリストを処理するとき手続き型ならこう書けるのにという場面に出くわしました。

foldlは何度か利用したことがあるのですが、foldrはありませんでした。おそらく自分のしたいことはfoldrの利用か、自前のfoldrのようなものになると思いました。

# foldl

```elm:foldl
myFoldl : (a -> b -> b) -> b -> List a -> b
myFoldl func acc list =
    case list of
        [] ->
            acc

        x :: xs ->
            myFoldl func (func x acc) xs
```
`acc`とはaccumulateの略のようで、意味は「蓄積する」です。

```
> myFoldl (::) [] [1,2,3]
1 :: []     => [1]
2 :: [1]    => [2, 1]
3 :: [2, 1] => [3, 2, 1]
[3,2,1] : List number
```

```
> myFoldl (\n str -> str ++ String.fromInt n) "" [1,2,3]
"123" : String
> S.myFoldl (\n str -> (String.fromInt n) ++ str) "" [1,2,3]
"321" : String
```

リスト左の要素からaccに蓄積されていき、最後にaccが結果としてreturnされるイメージです。

(::)は

```
> 1 :: [2]
[1,2] : List number
```
こういった関数です。

# foldr

```elm
myFoldr : (a -> b -> b) -> b -> List a -> b
myFoldr func ini list =
    case list of
        [] ->
            ini

        x :: xs ->
            func x (myFoldr func ini xs)
```
`x :: xs`のxsとはxの複数形らしいです。
型が`List Item`ならば、`case list`,`item :: items`などでもよさそうです。

```
> myFoldr (::) [] [1,2,3]
((::) 1 ((::) 2 ((::) 3 [])))
1 :: (2 :: (3 :: []))
[1,2,3] : List number
```

```
> myFoldr (\n str -> str ++ String.fromInt n) "" [1,2,3]
"321" : String
> myFoldr (\n str -> (String.fromInt n) ++ str) "" [1,2,3]
"123" : String
```

`((::) 1 ((::) 2 ((::) 3 [])))`
`1 :: (2 :: (3 :: []))`
渡す関数が(::)以外であれば、(::)がそれに置き換わるイメージみたいです。

汎用的でないfoldrを自分で作ってみると理解しやすいかもしれません。

# foldrっぽい処理1

```elm
myFoldr2 : List Int -> List Int
myFoldr2 list =
    case list of
        [] ->
            []

        x1 :: x2 :: xs ->
            x1 * 10 :: x2 * 100 :: myFoldr2 xs

        x :: xs ->
            x * 1000 :: myFoldr2 xs
```
```
> myFoldr2 [1, 2, 3]
[10,200,3000] : List Int

> myFoldr2 [1, 2, 3, 4]
[10,200,30,400] : List Int
```

最終的にリストを生成したいのなら、`x :: (myFoldr xs)`のようにつなげて行くことになり、イメージしやすいと思います。
上の例ではxに10をかけて(::)でつなげ、新しいリストを作っている感じです。
# foldrっぽい処理2

```elm
myFoldr5 : List Int -> List Int
myFoldr5 list =
    case list of
        [] ->
            []

        x :: [] ->
            [ x * 100 ]

        x :: xs ->
            x * 10 :: myFoldr5 xs
```
```
> myFoldr5 [1]
[100] : List Int
> myFoldr5 [1, 2]
[10,200] : List Int
> myFoldr5 [1, 2, 3]
[10,20,300] : List Int
```

# foldrっぽい処理3

```elm
myFoldr6 : Bool -> List Int -> List Int
myFoldr6 flag list =
    case list of
        [] ->
            []

        x :: xs ->
            case x of
                5 ->
                    x :: myFoldr6 True xs

                _ ->
                    case flag of
                        True ->
                            x + 5 :: myFoldr6 flag xs

                        False ->
                            x :: myFoldr6 flag xs
```
```
> myFoldr6 False [1, 2, 5, 5, 6, 7]
[1,2,5,5,11,12]
```

# まとめ
foldlは集計のような処理に、foldrは新しいリストを作るときに使いやすそうです。

[参考1](http://taiju.hatenablog.com/entry/20130202/1359773888)
[参考2](https://kazu-yamamoto.hatenablog.jp/entry/20110908/1315473844)