OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub ActionsからGAEにdeployする際のsecretの扱い

## 概要
この記事の内容としては以下の通り

* GAEのapp.yamlが環境変数を読み取らないので、値をなんとか渡す方法。
* GitHubActionsで認証ファイルを扱う方法。

ユースケースとして、GAEにGitHub Actionsを使ってdeployしたい
GAEのアプリケーションとしてはDBにつないで出力を返すものであるとする。

## 2020-05-28追記
サービスアカウントの部分は以下を見ると参考になる
https://github.com/GoogleCloudPlatform/github-actions/blob/0431cfb4b7b701d0b83c4df8ed9b72fd2c45b79c/example-workflows/gae/.github/workflows/app-engine.yml

## 実際の部分
### GitHub ActionsのSecrets
以下のように入れる
そもそものGitHub ActionsのSecretsってなんだっていうのは [暗号化されたシークレットの作成と保存](https://help.github.com/ja/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets) を参照してください

|名前|説明|
|---|---|
|GAE_DEPLOY_CERT|deployする際のサービスアカウントの認証ファイルの中身|
|DB_USER|DBにつなぐユーザ|
|DB_PASSWORD|DBにつなぐパスワード|

* ポイントとして、GAE_DEPLOY_CERTは入力する際には1行にすること。複数行にすると上手く行かない（shell力が足りない

### GAEのapp.yaml

以下のようにユーザとパスワードを変数としておく

```yaml:app.yaml
runtime: nodejs10

instance_class: F1

env_variables:
  SQL_USER: "$DB_USER"
  SQL_PASSWORD: "$DB_PASSWORD"
```

### GitHub Actionsのworkflow

```yaml:deploy.yml
name: deploy

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: '10'
      - name: npm install, build
        run: |
          npm install
          npm run build
      - name: replace app.yaml
        run: |
          sed -i -e 's/$DB_USER/${{ secrets.DB_USER }}/g' app.yaml
          sed -i -e 's/$DB_PASSWORD/${{ secrets.DB_PASSWORD }}/g' app.yaml
      - name: create certfile
        run: |
          echo '${{ secrets.GAE_DEPLOY_CERT }}' > cert.json
          echo '対象のサービスアカウント' | gcloud auth activate-service-account --key-file cert.json
          rm cert.json
      - name: GAE deploy
        run: gcloud app deploy app.yaml --project 'プロジェクトID' -q
        env:
          CI: true
```

細かい部分は省くが
* app.yamlをsedを使い先程の変数で書き換える
* secretの値をリダイレクトして、certのファイルを作成する
ということをしている

## まとめ
CI/CD上でなんとかする以外思いつかなかったので、こんな感じになった。
サービスアカウントのjsonは消したほうが良いんじゃないかって思って消している
文系SEが考えるストレージとは

サーバとネットワークについて以前書いた記事である程度イメージはできたでしょうか。

[文系SEが考えるサーバとは](https://qiita.com/ok2/items/3561e5b0560dfc106a86)
[文系SEが考えるネットワークとは](https://qiita.com/ok2/items/a5fb9b669b347bde2707)

ネットワークを通じてサーバやPC間でデータのやりとりができるようになりました。

ではやりとりで作成されたデータはどこに保管するのでしょうか。

今回はデータの格納場所である『ストレージ』について、自分用のメモを残します。

#お約束
以下の注意書きをよく読み、用法用量を守って正しくお使いくださいmm

* 文系SEが新入社員やIT業界初心者向けに執筆した記事です。
* 記載されている情報が必ずしも正しいとは限らないので、必ず自分でも調べ直してください。
* 日本生まれ日本育ちですが、日本語が怪しい箇所が多々あります。見つけた場合は、優しくご指摘いただければ幸いです。

#ストレージってなに？
> ストレージとはコンピュータを構成する主な装置の一つで、データの永続的な記憶を目的としています。
出典：https://www.idcf.jp/words/storage.html

コンピュータの装置の1つということは理解できた！←

データの記憶（保存）を目的とした装置だそうです。

##記憶装置とは
>記憶装置とは、コンピュータの構成要素の一つで、データやプログラムの保存・記憶を行うための装置。レジスタやキャッシュメモリなどCPU内部の半導体メモリ、メインメモリ（主記憶装置/RAM）、ストレージ（外部記憶装置/補助記憶装置）などに分類される。
出典：http://e-words.jp/w/%E8%A8%98%E6%86%B6%E8%A3%85%E7%BD%AE.html

なるほど。

コンピュータの記憶装置には『**半導体メモリ**』、『**メインメモリ：主記憶装置**』、『**ストレージ：外部記憶装置**』があると。

難しい言葉はイメージで理解するといいとお婆ty(ry
<img width="1083" alt="スクリーンショット 2020-05-13 16.13.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635116/30d64e10-255b-9217-43d8-d922dd20959f.png">
家を『コンピュータ』とした時、データを保持できる場所は上記のように複数あります。

しかし、**永続的にデータを保管しておけるのは『ストレージ』のみ**らしいです。

記憶装置によって容量が異なるのはイメージ通りだと思います。

処理速度についても、倉庫でプラモデルを組み立てるよりは作業机で組み立てた方が作業しやすい作りになっているためです。

##ストレージの種類
『ストレージ』については上記でイメージできたところで一つ疑問が浮かびます。

『ストレージ』が物置ならいずれいっぱいになってしまうのでは？

その場合は、現実世界同様に物置の増築を行います。

ただ、『コンピュータ』を家と捉えると、家の中における物置の設置数は自ずと有限的になってしまいます。

そこで『コンピュータ』の『ストレージ』を増やす以外で物置を増設する方法を2種類紹介します。

###DAS：Direct Attached Storage
『DAS』とは読んで字の如く、『サーバ』に直接ストレージ機器を接続することです。

『サーバ』に直接ストレージ機器を接続するだけなので、増設方法としては一番簡単な方法です。

ただし、ストレージ機器にアクセスするには接続した『サーバ』からしかアクセスできません。
つまり、接続した『サーバ』でトラブルが起きるとストレージ機器は無事でも使用できなくなってしまいます。

そこで登場したのが次に紹介する『NAS』です。

###NAS：Network Attached Storage
『NAS』もまた読んで字の如く、『ネットワーク』にストレージ機器を接続することです。

『DAS』はサーバとストレージ機器を繋げていましたが、『NAS』は既存の『LAN』に繋げます。

ストレージ機器を『LAN』に繋げるだけなので、『DAS』同様簡単な方法です。

『DAS』と違い『サーバ』とは直接繋がっていないので、複数サーバからのアクセスにも対応できます。

ただし、今度は『LAN』に依存してしまうため、『LAN』に対する負荷が大きくなってしまうデメリットもあります。

上記を解決するために、『SAN：Storage Area Network』という方法が誕生しました。

これはストレージ専用の『ネットワーク』を作ることで『NAS』のデメリットを克服します。

ただし、『SAN』には専用の機器の導入が必要で、コスト的にも技術的にも非常に難易度が高い方法です。

#まとめ

* 『ストレージ』とは、データを長期保管する『コンピュータ』の物置を指します。
* 『コンピュータ』内に搭載できる『ストレージ』には限りがあります。
* 『ストレージ』を『サーバ』に外付けする方法を『DAS』といいます。
* 『ストレージ』を『LAN』に外付けする方法を『NAS』といいます。

#最後に
『サーバ』『ネットワーク』『ストレージ』と記事ができて、ようやく仮想化についての記事が書ける…..orz

本来の目標であるクラウドの記事が書けるのはいつになることやら苦笑

#参考
[DAS、NAS、SANの比較](https://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/beginner/san-nas-das/)
sshでgit pushできないならhttpsにすればいいじゃない!

# この記事の内容

`git push`がしたいだけなのに、謎にsshが接続できなくなった時、の対処法

# この記事で扱わないこと

- sshとhttpsどちらがよいか
- sshが繋がらなくなった場合の直し方など


# 解決策

```bash
$ git push https://github/path/to/repo <branch>
```
のように`https`を明示的に使ってしまおう。
sshが繋がらなくてもhttpsは大抵使えるはず。
うまくいかないときは、gitconfigで

```
[url "github:"]
  insteadOf = "https://github.com/"
```

などしてないか確認しよう!
Jest を使ってテストする

#TypeScript のテストを Jest (ts-jest) でやってみる
https://qiita.com/mangano-ito/items/99dedf88d972e7e631b7

##Facebook 製 JavaScript テストツール Jest を使ってテストする ( Babel, TypeScript のサンプル付き )
https://tech.recruit-mp.co.jp/front-end/post-14752/

##How to read Test Coverage report generated using Jest.
https://medium.com/@krishankantsinghal/how-to-read-test-coverage-report-generated-using-jest-c2d1cb70da8b

##jest typescript property mock does not exist on type
https://stackoverflow.com/questions/52457575/jest-typescript-property-mock-does-not-exist-on-type
black と isort と mypy

# black

```Python
pip install black
```

```Python
black --pyi hoge.py
```

# isort

```Python
pip install isort
```

```Python
isort hoge.py 
```

# mypy

https://qiita.com/mski_iksm/items/85651837bd70427754d6

```Python
pip install mypy
```

```Python
mypy hoge.py
```
あたらしい Pythonで動かして学ぶ！ 機械学習の教科書 伊藤 真 著 numpy/keras注意！

#背景
「あたらしい Pythonで動かして学ぶ！ 機械学習の教科書」 伊藤 真 著 ！
第二版を使用
numpyを最新版1.18.2にupdateしたところ、エラーが発生した。1.18.xはNG
(Google Colaboratoryで動かそうとした時にも1.18.4で発生）。kerasでも有り

使用環境（version）：
>Mac Book 2016 3.3GHz Intel Corei7
Catalina 10.15.4

>Anaconda 1.9.12
**JupyterLab  1.2.6**
**JupyterNotebook 6.0.3**
**Colaboratory** 
Python 3.7.3, 3.6.9(colab) 
**Numpy 1.18.1,2,4 (colab)**
Matplotlab 3.1.3, 3.2.1(colab) 
Tensorflow 2.0.0, 2.2.0rs4(colab)
**Keras 2.3.1**


## 【1】 numpy np.shape(xx0, xn* xn, 1)  ⇒ order="F"  変更必須

#### numpy version 1.18.2以降で発生
version 1.17.2 では問題なし。（1.17.xはOK)

変更が必要な箇所
>変更前：np.reshape(xx1, xn*xn, **1**)
変更後：np.reshape(xx1, xn*xn, **order ="F"**)  :従来より推奨されていた

参考文献
[numpy.reshape version1.18.x : ValueError: Non-string object detected for the array ordering. Please pass in 'C', 'F', 'A', or 'K' instead エラー](https://qiita.com/hiroshim021/items/ed25fe98a6c1463a4c96)

##### 1. リスト 4-5-(3)  142頁（あたり）

```python
#リスト 4-5-(3)

# 等高線表示 --------------------------------
def show_contour_gauss(mu, sig):
    途中略
    xx0, xx1 = np.meshgrid(x0, x1)
    x = np.c_[np.reshape(xx0, xn * xn, order="F"), np.reshape(xx1, xn * xn, order="F")] #変更後
    
# ３D 表示 ----------------------------------
def show3d_gauss(ax, mu, sig):
    途中
    xx0, xx1 = np.meshgrid(x0, x1)
    x = np.c_[np.reshape(xx0, xn * xn, order="F"), np.reshape(xx1, xn * xn, order="F")] #変更後
```

##### 2.リスト 7-1-(10)  274頁（あたり）


##### 3.リスト 7-1-(14)  294頁（あたり）
##### 4.リスト 7-2-(4)  304頁（あたり）
##### 5.リスト 9-2-(6)  364頁（あたり）

## 【2】KeyError: 'acc' and KeyError: 'val_acc' Errors in Keras 2.3.x ⇒accuracyへ


### 参考文献
[Fixing the KeyError: 'acc' and KeyError: 'val_acc' Errors in Keras 2.3.x](https://www.codesofinterest.com/2020/01/fixing-keyerror-acc-valacc-keras.html)

Kerasの2.3.xリリース以降は、metrixsで"accuracy"を使用した場合には、keyとしては"accuracy"を使うとの事です。**val_accuracy**も同様です。

>According to the 2.3.0 Release Notes: 
"Metrics and losses are now reported under the exact name specified by the user (e.g. if you pass metrics=['acc'], your metric will be reported under the string "acc", not "accuracy", and inversely metrics=['accuracy'] will be reported under the string **"accuracy"**."
You can read the official release notes here: https://github.com/keras-team/keras/releases/tag/2.3.0

>What this means is that if you specify metrics=["accuracy"] in the model.compile(), then the history object will have the keys as 'accuracy' and **'val_accuracy'**. While if you specify it as metrics=["acc"] then they will be reported with the keys 'acc' and 'val_acc'.

#### 6.リスト 7-2-(4) 〜303頁
```python
# リスト 7-2-(4)
"""精度表示"""
plt.subplot(1,3,2)
plt.plot(history.history['accuracy'],"k",label="training")
plt.plot(history.history["val_accuracy"],"cornflowerblue",label="test")
plt.legend()
```
200513学習記録：CSSの優先順位

TechAcadmy lesson3 9.CSS

CSSの優先順位で覚えておくこと2つ
①下に書かれたものが優先
②詳細なセレクタが優先

---

**①下に書かれたものが優先**
→これは「green」が表示される。

```
p {
    color: red;
}
p {
    color: green;
}
```

**②詳細なセレクタが優先**
→これは「red」が表示される（もちろんclass指定されているpタグのところで）。

```
p.important {
    color: red;
}
p {
    color: green;
}
```

---
**もうちょっと詳しく言うと**
（CSS３スタンダード・デザインガイド参照）

セレクタごとに↓のa～dの値を算出し、aから順に比較して値が大きい場合は優先順位が高くなる仕組みになっている。

a インラインスタイルシートに記述
b IDの数
c クラス／疑似クラスの数
d 要素名／疑似要素の数

```
#sand{
 background-color:yellow;
 }

div h1{
 background-color:red;
 }

h1{
  background-color:pink;
 }

```
↓値を計算すると

```
#sand　→　bが１
div h1 →　dが２
h1 →　dが１
```

なので優先準備が最も高いのが#sand
200513学習記録：CSSの基本　セレクタ（どこの）／プロパティ（なにを）／値（どのように）

TechAcademyでhtml,cssの復習
Lesson3 9.cssの基本

→これもすごくわかりやすい
https://saruwakakun.com/html-css/reference/selector

◆基本形　「HTML内の○○要素の△△を□□にする」
→〇〇＝セレクタ、△△＝プロパティ、□□＝値

p {
    color: red;
}

→〇〇＝P、△△＝color、□□＝red
P要素の、colorを、redにする。

◆「セレクタ」特記事項　複数セレクタ

このCSS指定だと

```
#global_navi ul li {
    display: inline-block;
    width: 164px;
    text-align: center;
}
```
↓
そのまま左から読んで「#global_navi」の中の「ul」の中の「li」を指定なので、このCSSは
```<li class="current"><a href="kitchen.html">HOME</a></li>```に適用される。

```
  <nav id="global_nabi">
      <ul>
        <li class="current"><a href="kitchen.html">HOME</a></li>
        <li><a href="course.html">講座案内</a></li>
        <li><a href="lesson.html">レッスン</a></li>
        <li><a href="gallery.html">ギャラリー</a></li>
        <li><a href="access.html">アクセス</a></li>
        <li><a href="contact.html">お問い合わせ</a></li>
      </ul>
      </nav>
```

◆「セレクタ」特記事項　疑似クラス
要素の中でもある状態になっている要素を指定することができます。

EX)リンクテキストの色を変える

a:link {
    color: #0000ff;
}
a:hover {
    color: #ff0000;
}
a:visited {
    color: #999999;
}

◆「プロパティ」特記事項
どんなプロパティがあるかはレファレンスを参照する

http://www.htmq.com/style/

◆「値」の特記事項
プロパティとセットで参照する。
このプロパティには、どういう値が使えるのか？という風に。
【忘備録】VMware ESXi関連【雑記】

個人が必要になった資料、調査した内容等を記録する。雑記・メモ類の一つ。


# 1. ESXi シャットダウン・再起動

##DCUI操作
1. ダイレクト コンソール ユーザー インターフェイス (DCUI) 画面から、
  [F12] を押して、ESXi ホストのシャットダウン関連のオプションを表示します。

2-1. [F2] を押してシャットダウンします。

2-2. F11 を押して再起動します。


DCUI側からShell操作を行う場合

F1でShell操作画面への切替
F2でShell画面の終了

# シェル操作
Local Tech Support モードまたは Remote Tech Support モード、
あるいは SSH セッションから、次のいずれかのコマンドを実行します。

## 2.よく使いそうなシェル一覧

→ 新規ページに変更しました。

https://qiita.com/Kairi_Hatoba/items/8f44ee1388d6ae377023


##
vmk0はマネジメント用(固定?)



# 2. VMware 高信頼化(HA)構成
→関連リンクに資料

2.VMware 高信頼化(HA)構成
[【技術者サイト】VMware ESXi クラスタ設定](https://www.unix-power.net/networking/post-467)
[【Qiita】vSphere HAを有効にするときに気を付けたいこと](https://qiita.com/akgo/items/4b4bfd9fe1e273cf885b)
※今後詳細は更新予定

# 3. パス選択ポリシーの設定(ラウンドロビンへの設定変更)

ストレージデバイスの一覧

```esxcil:
[User:ESXi6.7U3~] esxcli storage nmp device list
```

対象デバイスのラウンドロビン変更シェル

```esxcil:
[User:ESXi6.7U3~] esxcli storage nmp device set --device naa.xxxxxxx --psp VMW_PSP_RR
```
#4.vCenter Server Applialanceについて
vCenter Serverの管理コンソールをゲストOS上に作成し
他のリソースの影響を受けることなく操作を行うことができるようにしたもの。
コンソールの使い方は現vCenter Server for Windows と変わらない。
率先して使っていいと思う。

#5.VVOLについて
VVOLは必要なサイズに適切に割り当てていくしくみ。
VVOLがない時代はストレージを必要サイズごとに切り出し、割り当てを行っていたが、
その必要がなくなる。
パーティションはそのつど自動的に切り出される。(拡張が必要になってもゲストOSのディスクサイズを大きくすれば勝手に割り当てられる)

#PowerCLI
PowerSellのESXi拡張パッケージのようなもの。
これを使うと仮想基盤のホスト側の構成情報をバックアップすることができる。
リストアも可能。(らしい

##PowerCLI導入について
vCenterのあるサーバにPowerCLIを導入するにインストールをし、再起動を行う。
再起動後シェルが使用できる。

##ESXiホスト構成のバックアップ


```a:PowerCLI
Connect-VIServer –Server <IP AddressまたはHostName> –User <UserName> –Password <Passw0rd>

Get-VMHostFirmware -VMHost <IP AddressまたはHostName> -BackupConfiguration -DestinationPath <保存先>

```

#Backupについて
##1.ディスクコピーのバックアップ
とってもとらなくてもいいと思う(なんせスナップショットあるし・・・)
しかし、スナップショットに依存しない形でディスクイメージのバックアップがほしいなら必要
ただし、2次バックアップでディスクイメージをそのままとる理由はない。
ゲストOSのディスクの中覗いてファイルをとったほうが効率いい。

#関連リンク
1.ESXi シャットダウン・再起動方法
[【VMware】ESXi/ESX 4.x および ESXi 5.x/6.0 のシャットダウン コマンドと再起動コマンド](https://kb.vmware.com/s/article/1013193?lang=ja)

ESXiホスト構成のバックアップ
- 参考資料：https://kb.vmware.com/s/article/2042141?lang=ja
Phalconのバージョンアップ対応についてざっくりまとめ

## はじめに

筆者はPHP歴1年半、Phalcon歴1ヶ月程度のひよっこです。
記事は調査した上で実際に手を動かして検証した内容にしていますが、もしかしたら誤りがあるかもしれません。
その際は遠慮なくご指摘ください！

## Phalconとは？

PHPの軽量フレームワークで、メジャーなPHPフレームワークでは最速レベルのようです。
理由はフレームワークの本体がC言語 or Zephirで書かれているPHP拡張モジュールだからです。
MVCモデルでフルスタックフレームワークでもありますが、ディレクトリ構造のしばりがゆるくて自由な実装が可能です。
その分玄人向けで、日本語情報も少ないので学習コストは高めのようです。

## 1系～3系と4系以降の違い

バージョンアップ時に大事なのが後方互換性です。
メジャーバージョンが同じである場合は確実な後方互換性があるようです。
メジャーバージョンは変わっていますが、1系～3系は後方互換性が高いです。
4系以降とそれ以前はかなり仕様が変わっていて、1系～3系から4系以降にバージョンアップする場合はある程度大きな改修になることを覚悟したほうが良さそうです。

## Phalconのインストール方法

いくつかインストール方法はありますが、一番楽なのはpeclコマンドを用いた方法です。

```bash
$ pecl channel-update pecl.php.net
$ pecl install phalcon
```
  
peclコマンドだと最新バージョンが指定されるので、バージョンを指定する場合はGit経由でソースを取得してビルドする必要があります。

```bash
$ yum -y install git
$ git clone git://github.com/phalcon/cphalcon.git \
$ cd cphalcon/build \
$ git checkout 3.4.x \
$ ./install
```

## フレームワークの有効化

PHP拡張モジュールなので、他の拡張モジュールと同じ場所に配置されます。
php.ini等で読み込んであげる必要があります。

```ini:phalcon.ini
extension=psr.so
extension=phalcon.so
```

## コードを修正

### 参考資料

1. 公式ドキュメント  
王道ですね。
Phalconは公式が複数言語のドキュメントを提供しており、日本語も対応してます。
が、有志による翻訳作業のようで一部英語だったり、ページよってはほとんど英語の場合も…。
その場合はGoogle翻訳などで頑張りましょう。
公式ページを見る限りVer3.4とVer4.0のドキュメントがありますが、多少バージョン違いでも参考にできると思います。
また、新・旧の変更内容については[リリースノート](https://github.com/phalcon/cphalcon/blob/4.0.x/CHANGELOG.md)が参考になります。
4系への[アップグレードガイド](https://docs.phalcon.io/4.0/ja-jp/upgrade)もあるようです。
   - [Phalcon 3.4 日本語 ドキュメント](https://docs.phalcon.io/3.4/ja-jp/introduction)
   - [Phalcon 4.0 日本語 ドキュメント](https://docs.phalcon.io/4.0/ja-jp/introduction)

2. Google先生
困ったときのGoogle先生ですが、Phalconについては日本語で検索するとあまり情報が出てきません。
まずは公式ドキュメントで関連する箇所の仕様を把握した上で、英語情報も積極的に対象に含めつつ調べたほうが良さそうです。

### 静的解析

多くの場合、PhalconだけでなくPHPのバージョンアップを伴うと思います。
そういった場合は、[PHPStan](https://github.com/phpstan/phpstan)などの静的解析ツールを使用すると修正が必要な箇所を洗い出しできます。
PHPStanを実行するPHPがPhalconのPHP拡張モジュールを読み込んだ状態で実行すれば、フレームワーク部分の処理は認識してくれるみたいです。
※私はオートロードを上手く解決できなかったのでPHPStanでの解析は諦めました…

### デバッグ

強引ですが最終的に確実なのは、アプリケーションを動かしながらエラーを潰していく方法です。
Xdebugを導入したり、PHPのエラー出力（display_errors・error_reportingなどの指定）範囲をできるだけ低くしてみるのが手っ取り早いと思います。
事前に調査・解析して修正しても最終的には動作検証は必要でしょう。
テストコードがちゃんと書かれている場合はもっと楽できるかもしれませんね。

### バージョンアップでエラーになりがちだった箇所

私はPhalcon 1系 → 3系、PHP 5.3 → 7.3へのバージョンアップを行いました。
Phalconの処理でエラー（実際には警告レベルも含む）になった箇所は、非推奨になったメソッドやForm系のクラスの挙動が微妙に変わっててハマったぐらいです。(いまだに細かい仕様は理解できてないですが…)
非推奨になった箇所は代替が全て存在していたので公式ドキュメントを読んで置き換えていくだけでした。

PHP5.3 → PHP 7.3に上がったことによって今まで顕在化しなかったバグの修正のほうがはるかに多かったです…。

## おわり

ざっくりした内容になってしまいましたが参考になれば嬉しいです。
【Laravel】エラー時の入力と検索時のGETパラメータの入力の保持

#やりたいこと
検索機能を持つindex画面がある
数値のみ等制約があるのでバリデーションを行う
検索成功時、検索した内容を保持したい

#やりかた


```html
<input type="text" name="hoge" value="{{ old('hoge', request('hoge')) }}">
```

`old()`は第２引数にデフォルトをとるので、バリデーションエラーがない場合、デフォルトのほうが呼ばれる
`request()`は現在のリクエストインスタンスを返すか、入力アイテムを取得します。何もなければ第二引数のデフォルトの空になるという塩梅です
GR-CITRUSをRX65Nに貼り替える

今回の経緯
---
以前MicroPythonを試すためだけにGR-CITRUSを購入していたのですが、これをRX65N-2MBに貼り替えれば色々遊べるミニボードになると思い自分で貼り替えてみました。

![2020-05-13 16-26-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/fac81de3-bc60-8e5b-964d-57c84a1f7a3e.jpeg)

サンハヤトの表面実装部品はがしセットを使うことで簡単に剥がれ、貼り付けの方もボードのランドの品質が良く問題なく貼ることができました。
写真はシリアル通信を行うサンプルコードの動作を撮影したものです。

IDE for GRを使用する場合の問題点
---
macではe2studioが使えないためIDE for GRを使うことになるのですが、このIDEはコンパイル短縮のためArduino.hを含むライブラリが既にアーカイブ化されていて端子番号の変更を行うことができません。
結構影響の範囲が広いのですが、Arduino IDEにポーティングするとエラーが大量に出るなどするため簡単な解決方法はないようです。
実際Atmel以外のマイコンをピン番号で制御するというシチュエーションは少ないと思いますが、できればアーカイブ化されていない版のIDEも欲しいです。
ハンバーガーメニューの作り方

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635497/357b0e57-e6eb-5fb4-a80a-a74eabb548e0.jpeg)

<!-- ハンバーガー-->
        <div class="navbar__hamberger-icon">
          <div class="navbar__hamberger-icon-icon1"></div>
          <div class="navbar__hamberger-icon-icon1"></div>
          <div class="navbar__hamberger-icon-icon1"></div>
        </div>

htmlでは、<div>要素にclass名を付けるだけ


 // ハンバーガーメニューのボタン(CSS)

  &__hamberger-icon {
    position: absolute;
    top: 50%;
    right: 5%;
    transform: translate(-5%,-50%);
    //ハンバーガーメニューのボタンを構成
    &-icon1 {
      width: 2rem;
      height: .1rem;
      background: #ffffff;
      margin: 5px;
    }
  }
CSSでの要点
①ボタンの位置を調整する
②widthで棒線の長さ
③heightで棒線の高さ
④色、そして棒線の間の広さを決定する
'shift_jis' codec can't encode character '\uff0d' in position 0: illegal multibyte sequence の解決

結論から言うと"－"が原因なので"ー"に

```
somestring.replace("－", "ー")
```

#### 原因となる文字列と置換後の文字列
```
>>> "－".encode("utf-8")
# Errorの原因
b'\xef\xbc\x8d'
>>> "ー".encode("utf-8")
b'\xe3\x83\xbc'
```

ややこしい
background-imgに疑似要素を使う場合

背景画像の上にロゴを載せる場合などに使える
（SCSS使用の場合）

&::after {
content: '';
    background-image: url('../img/background-img/logo-white.png');
    background-size: contain;
    background-position: center;
    height: 50%;
    width: 50%;
    position: absolute;
    top: 25%;
    left: 25%;
}
npm-scriptsでコマンドを並列に実行する

# 準備
[concurrently](https://www.npmjs.com/package/concurrently)をインストールします。

```bash
$ npm install -D concurrently
```

# npm-scriptsを書く
以下サンプルの`build`の行のように、concurrentlyを使ってコマンド実行するように記述します。

- ここでは、シェルスクリプトを実行していますが、他のnpm-scriptsを指定しても構いません。
- `-n`オプションで各コマンドに名前をつけるとこで、標準出力の出力がわかりやすくなります。<BR>以下では、`./build1.sh`に`build1`、`./build2.sh`に`build2`という名前を付けています。

```json:package.json
{
  "name": "poi",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "concurrently -n build1,build2 \"./build1.sh\" \"./build2.sh\""
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "concurrently": "^5.2.0"
  }
}
```

# 実行する
build1.shとbuild2.shを単純に数字を出力するシェルスクリプトとすると(後述)、`build`を実行すると以下の出力例のようになります。

- 出力が並列に実行されていることがわかります。
- `-n`オプションをつけると各コマンドの出力が分かりやすくなっていることがわかります。

```
$ npm run build

> poi@1.0.0 build C:\Users\kazuhiro_otani\Downloads\poi
> concurrently -n build1,build2 "bash ./build1.sh" "bash ./build2.sh" || exit 0

[build2] 6
[build1] 1
[build2] 7
[build2] 8
[build1] 2
[build2] 9
[build2] 10
[build2] bash ./build2.sh exited with code 0
[build1] 3
[build1] 4
[build1] 5
[build1] bash ./build1.sh exited with code 0
```

```bash:build1.sh
for i in {1..5} ; do
    sleep 0.2
    echo ${i}
done
```

```bash:build2.sh
for i in {6..10} ; do
    sleep 0.1
    echo ${i}
done
```
[rails]devise:メールアドレス・パスワード以外がデータベースに保存できない時


◆結論
deviseの初期状態では、メールアドレスとパスワード以外は
データベースへの保存を許可されていないため、下記内容でカラム毎に
追加の許可を出してあげる必要があります。

ストロングパラメーター

```ruby:app/controllers/application_controller.rb
def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :first_name, :first_name_furigana, :tel_number, :last_name, :last_name_furigana, :birthday])
  end
```

以上です。
resourcesメソッド

#ルーティング

ルーティングを省略なしで記述する場合は以下のような記述になります

```routes.rb
  [HTTPメソッド] '[URIパターン]', to: '[コントローラー名]#[アクション名]'
```

ですが、それぞれのアクションに対応したルーティングを上記のように毎回書いていると記述量が多くなり、可読性に欠けます。そのため通常はresourcesメソッドを使用した記述を行います。


resourcesメソッドは上記で指定すべきhttpメソッドとアクションを全て設定してくれます。

```routes.rb
resources :コントローラー名, only: [:アクション名]
```
```routes.rb
resources :コントローラー名, except: [:アクション名]
```

resourcesメソッドはオプションを指定しないと全てのアクションのルーティングが生成され、可読性も下がるため、オプションを使用して、アクションの指定をします。

上記のonlyとexceptがそれに当たります。onlyは指定したアクションのみのルーティングを生成すると言う意味で、exceptは逆に指定したアクションは生成しないと言う意味です。記述量が少なくなる方を使った方が良いです。
Addressables1.8.3のアセットをUnityCloudBuildでビルドする

# 概要

UnityCloudBuild は2019年8月頃から Addressables に対応した。
公式ドキュメントや記事が見つからなかったので、実際に検証して正常に動作が確認された設定内容を共有する。

参考: [FYI: Cloud build supports addressable now. - Unity Forum](https://forum.unity.com/threads/fyi-cloud-build-supports-addressable-now.737339/)

# 設定方法

UnityDashboard -> CloudBuild -> Config から TARGET 設定を開く。
Addressables が含まれているプロジェクトの場合は、画像のように設定項目に `Addressables Asset Options` が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/aee57e62-abd0-337e-e183-006ace2dd64f.png)

`EDIT ADDRESSABLE ASSET OPTIONS` を選択すると、画像のような設定画面が表示される。
(表示されていな項目はチェックを入れると表示される、画像の構成でビルドして正常に動作することを確認した)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/4a4526bc-d416-dbd8-b943-61bf0a073e3e.png)

設定項目のそれぞれの意味は (おそらく) 下記の通り。
(もし間違いがありましたらご指摘頂けますと幸いです🙇‍♂️)

|項目|意味|
|---|---|
|Build Addressables|Addressablesのビルド機能を利用する|
|Fail Build on Addressables Error|Addressablesのビルドでエラーが出たらビルド失敗にする|
|Profile Name|プロファイル名を指定、Unityで設定済みの場合は空でOK|
|Content Only Build|Addressables のみをビルドする|
|Content Update Build|ビルド済みのAddressablesがある場合は上書きする|
|Content State Location Method|どこのcontent_state.binを利用するか (本TARGET or 別TARGET)|
|Path to Content State File|content_state.bin のパスを指定 (`Use a Content State file from Source Control` を選択した場合のみ)|
|Linked Build Target|どの TARGET の content_state.bin を利用するか (`Use a Content State file produced from another build target` を選択した場合のみ、Addressables1.5.1以上)|

SAVE を押して設定が完了すると、画像のように `Build Addressables` が Yes になっている事が確認出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/a830debd-4a52-3981-a808-1daa52917c30.png)

この状態でビルドを行い、成果物をダウンロードするとビルドされた Addressables の Asset がロード出来ることが確認出来た。(Windowsのみ検証)

# まとめ

Addressables は割と発表されたばかりだが、周辺のサービスがどんどん対応していて良い。
もう AssetBundle を使った開発には戻りたくないので、Addressables がもっと広く普及してノウハウが蓄積されたらと思う。
SIR モデルの日本語表示 （その ２）

こちらで作成されるグラフを日本語化してみました。
[感染病の数学予測モデルの紹介　(SIRモデル）](https://qiita.com/kotai2003/items/3078f4095c3e94e5325c)

![sir_may1302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/67fd2ea3-de05-6057-fb92-bf8615262733.png)

```py:sir02.py
#! /usr/bin/python

# ------------------------------------------------------------------
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import	sys

# ------------------------------------------------------------------
def SIR_EQ(v, t, beta, gamma):
    return [-beta*v[0]*v[1], beta * v[0] * v[1] - gamma * v[1], gamma * v[1]]

# ------------------------------------------------------------------
sys.stderr.write("*** start ***\n")
t_max = 160
dt = 0.01

beta_const = 0.2/1000
gamma_const = 0.1


#initial_state
S_0=999
I_0=1
R_0=0
ini_state = [S_0,I_0,R_0] #[S[0], I[0], R[0]]

#numerical integration
times =np.arange(0,t_max, dt)
args  =(beta_const, gamma_const)

#R0
N_total = S_0+I_0+R_0
R0 = N_total*beta_const *(1/gamma_const)
print(R0)
sys.stderr.write("*** ccc ***\n")

#Numerical Solution using scipy.integrate
#Solver SIR model
result = odeint(SIR_EQ, ini_state, times, args)
#
#
plt.rcParams["font.family"] = "TakaoExGothic"
# plt.rcParams["font.family"] = "IPAGothic"

plt.title("基本再生産数 : {}".format(format(R0,".3f")))
plt.xlabel('日数')
plt.ylabel('人数')
plt.plot(times,result)
plt.legend(['未感染者','感染者','回復者'])
plt.show()

sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

フォントの指定は、TakaoExGothic でも IPAGothic でも大丈夫です。

Arch Linux で確認しました。

```text
$ uname -a
Linux iwata 5.6.10-arch1-1 #1 SMP PREEMPT Sat, 02 May 2020 19:11:54 +0000 x86_64 GNU/Linux
$ python --version
Python 3.8.2
```
Ruby on Rails で作成したフォームの一つが内容を取得しない

#バグ発生
「Ruby on Rails で作成したフォームの一つが内容を取得しない」
１、各フォームに入力する。
２、Postを押す。
３、「Posting failed.」で登録できない。
４、Takleのフォームだけ直前に入力した内容を保持してない。

![スクリーンショット 2020-05-13 15.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626160/96d99cb9-c887-02f0-bb13-893423c34a03.png)

#結論
該当のコントローラーのcreateアクションにしている今回だと「fish_params」の中に「:tackle」を忘れてた。
そのため情報を取得できずに「Posting failed.」してた。

```ruby
  def create
    @fish = current_user.fishs.build(fish_params)
    if @fish.save
      flash[:success] = "Successfully posted."
      render :show
    else
      @fishs = current_user.fishs.order(id: :desc).page(params[:page])
      flash.now[:danger] = "Posting failed."
      render :new
    end
  end
```

↓変更前

```ruby

  def fish_params
    params.fetch(:fish, {}).permit(:day, :address, :kind, :number)
  end
```

↓変更後

```ruby

  def fish_params
    params.fetch(:fish, {}).permit(:day, :address, :tackle :kind, :number)
  end
```

#解決方法
pry-byebugを使いceateアクションの中身を確認したところtackleがnilになっていた。
つまりそもそもパラメーターが取得できてないとわかりfish_paramsメソッドを確認したら記載漏れしてた。
Amazon Linux 2 で MeCab + NEologd

Debian 系 (Ubuntu とか) だと apt で簡単に入れれるが、RedHat 系 (Amazon Linux とか) だと yum でイッパツというわけにはいかないので、自分でビルドしたときのメモ。

ググると Groonga のリポジトリを追加して入れようとしている記事がたくさん出てくるけど、Groonga を使うわけじゃないならやめておいた方がいいと思う。

## 最初にやるやつ
ビルドするので Development Tools を入れる。

``` console
$ sudo yum update -y
$ sudo yum groupinstall -y "Development Tools"
```
​
## MeCab インストール
ソースのダウンロード URL は[ここから](https://taku910.github.io/mecab/)。

``` console
$ wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
$ tar xzf mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure
$ make
$ make check
$ sudo make install
$ cd -
$ rm -rf mecab-0.996*
```
​
## NEologd インストール
``` console
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ ./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a -y
$ rm -rf mecab-ipadic-neologd
```

辞書のデフォルトを NEologd に設定する。

``` console
$ sudo sed -i -e "s|^dicdir.*$|dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd|" $(mecab-config --sysconfdir)/mecabrc
```

## 動作確認
``` console
$ echo すもももももももものうち | mecab
すもももももももものうち        名詞,固有名詞,一般,*,*,*,すもももももももものうち,スモモモモモモモモノウチ,スモモモモモモモモノウチ
EOS
```
​
## (ついでに) Python で動かす
``` console
$ sudo yum install -y python3-pip
$ pip3 install mecab-python3
```

```
$ python3
Python 3.7.6 (default, Feb 26 2020, 20:54:15) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mecab
>>> tagger = MeCab.Tagger('-Ochasen -d/usr/local/lib/mecab/dic/mecab-ipadic-neologd')
>>> print(tagger.parse('すもももももももものうち'))
すもももももももものうち        スモモモモモモモモノウチ        すもももももももものうち        名詞-固有名詞-一般
EOS
```
fizzbuzzを噛み砕く

あんま噛み砕けてないわ・・・w
##近況報告
　一歩踏み出すことを助けてくれることば
・思い立った日が吉日，その日以降は凶日（トリコ）
・運命が僕を追いかけるくらいに清潔な衝動に正直でいたい（ポルノグラフィティ）
・本気でそれをなしたいと思えば世界があなたに味方をしてくれる（アルケミスト）
・選択しなかった道は最悪の結末が待っている（ラブホスタッフ上野さん）

やってから考える。死ぬこと以外かすり傷。

# 今日のお題
　while文を用いた演算処理

## 背景
某社のオンラインテストでボコボコにされたので勉強した

## ruby
### 1から１００までの総和

```
i = 1
def calc(i)
  sum = 0
  while i <=100 do
    sum += i
    i += 1
  end
  puts sum
end
calc(i)
```
### fizzfazz（３の倍数と５の倍数で）
```
def fizzFazz(i)
  while i <16 do
    if i%3 == 0 && i%5 == 0
      puts "fizzFazz!"
    elsif i%3 == 0
      puts "fizz"
    elsif i%5 == 0
      puts "buzz"
    else
      puts i
    end
    i += 1
  end
end
fizzFazz(i)
```
###配列から2の倍数だけ抽出

```
count = [1,2,3,4,5,6,7,8,20]
def select2(count)
  count2 = count.select do |x|
  x%2 ==0
  end
  puts count2
end
select2(count)
```

###1から30までの間で7のつく数を抽出し足し合わせる

```
count = 1
 def calc(count)
   sum = 0
   while count < 31
     if count.to_s.include?("7")
       sum += count
     end
     count += 1
   end
   puts sum
 end
calc(count)
```

### 1から３０までの間の７の倍数と７のつく数の総和

```
i = 1
 def calcSeven(i)
  sum = 0
  while i < 31
    if i % 7 == 0 || i.to_s.include?("7")
      sum += i
    end
    i += 1
  end
  puts sum
end
calcSeven(i)
```
数値ではなく「文字列」として認識させてあげる
## Golang
### 1~100までの総和とfizzbuzz

```
package main

import "fmt"

//1~100までの総和
func sum100() {
	sum := 0
	for i := 1; i < 101; i++ {
		sum += i
	}
	fmt.Println(sum)
}

//fizzbuzz
func fizzBuzz() {
	for i := 1; i <= 15; i++ {
		if i%3 == 0 && i%5 == 0 {
			fmt.Println("fizzbuzz!")
		} else if i%3 == 0 {
			fmt.Println("fizz")
		} else if i%5 == 0 {
			fmt.Println("buzz")
		} else {
			fmt.Println(i)
		}
	}
}

func main() {
	sum100()
	fizzBuzz()
}
```

### 終わりに
Goの要素のと取り出し方法はさっぱりわからなかったけど，rubyでやり切れたから良しとする！
わかり次第追記します。
Laravelでフラッシュデータ(直後のHTTPリクエストの間だけセッションに保存されるデータ)を使う

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# フラッシュデータ
Laravelでは直後のHTTPリクエストの間だけセッションにデータを保存し、それ以降は削除されるフラッシュデータという仕組みが提供されています
これまで下記記事で扱ってきました
[Laravelでリクエストデータを取得する](https://qiita.com/toontoon/items/eff426606ce0f194c345)
[Laravelで入力値エラーチェック(validate)を実装する](https://qiita.com/toontoon/items/abf5c52eb0c3fe11003c)
[Laravelでリダイレクトを使う](https://qiita.com/toontoon/items/afc055e8da3e786f7e8f)
いずれの場合もリクエストデータをフラッシュデータとして保存していましたが、今回はリクエストデータではなく、サーバサイドで好きな値をフラッシュデータに格納します

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています


# Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにflashメソッド、flash2メソッドを追記

```
    public function flash(Request $request)
    {
        $request->getSession()->flash('key', 'value1');
        $request->getSession()->flashInput(array_merge($request->input(), ['key' => 'value2']));
        return view('sample.flash');
    }

    public function flash2(Request $request)
    {
        return view('sample.flash2');
    }

```
`$request->getSession()->flash`でフラッシュデータに保存した場合、old関数で取得できません
`$request->getSession()->flashInput`でフラッシュデータに保存した場合、old関数を使って取得します

(2) /sample/routes/web.phpに下記を追記
`Route::get('sample/flash', 'SampleController@flash');`
`Route::get('sample/flash2', 'SampleController@flash2');`

# viewの作成
(1) /sample/resources/views/sample/flash.blade.phpファイル作成

```flash.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <div>{{ session('key') }}</div>
        <div>{{ old('key') }}</div>
    </body>
</html>
```

(2) /sample/resources/views/sample/flash2.blade.php

```flash2.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <div>flash2です</div>
        <div>{{ session('key') }}</div>
        <div>{{ old('key') }}</div>
    </body>
</html>
```

# 動作確認
`http://localhost/laravelSample/sample/flash`


実行結果

```
value1
value2
```

`$request->getSession()->flash`
`$request->getSession()->flashInput`
どちらで保存したフラッシュデータも出力されました

`http://localhost/laravelSample/sample/flash2`


実行結果

```
flash2です
value1
value2
```
続いてflash2にアクセスするとコントローラーで何も処理していないのにフラッシュデータが出力されました
フラッシュデータというのは直後のHTTPリクエストの間だけセッションにデータを保存されるものです
今アクセスしたflash2が直後のHTTPリクエストということです
[Laravelで入力値エラーチェック(validate)を実装する](https://qiita.com/toontoon/items/abf5c52eb0c3fe11003c)でフォームリクエストクラスを使ってエラーチェックをしましたが、エラーチェックに引っかかるとリダイレクトされます。フォームリクエストクラスエラー存在時は、そのリダイレクトが直後のHTTPリクエストということになります

`http://localhost/laravelSample/sample/flash2`


実行結果

```
flash2です
```
続いてもう一度flash2にアクセスすると今度はvalue1、value2が出力されません
もうフラッシュデータを保存した直後のリクエストではないためです
SIR モデルの日本語表示

次のページと同じことを日本語表示で行いました。
[中学生でもわかるSIRモデル](https://qiita.com/TK201_DTB/items/dab042d6ae1251e167d4)

![sir01_may13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fbc134b1-ef1a-75ec-4847-49d684e2b810.png)

```py:sir01.py
#! /usr/bin/python

# ------------------------------------------------------------------
import matplotlib.pyplot as plt
import numpy as np
import	sys

# ------------------------------------------------------------------
def next_state(beta,nu,ss, ii, rr):
    beta_ss_ii = beta * ss * ii
    delta_ss = - beta_ss_ii
    delta_ii = beta_ss_ii - nu * ii
    ss = ss + delta_ss
    ii = ii + delta_ii
    if ss < 0:
        ss = 0
    if 1.0 < ii:
        ii = 1.0
    rr = 1.0 - ss - ii
    return ss, ii, rr
#
# ------------------------------------------------------------------
def main():
    beta = 0.5
    nu = 0.3
    period = 100

    sys.stderr.write("beta = %f\n" % beta)
    sys.stderr.write("nu = %f\n" % nu)

    results = []
    ii = 0.01
    rr = 0
    ss = 1 - ii - rr

    l_s = [ss]
    l_i = [ii]
    l_r = [rr]
    results.append([ss,ii,rr])
    r0 = beta*ss/nu

    print(ss, ii, rr)
    for t in range(period):
        ss, ii, rr = next_state(beta,nu,ss, ii, rr)
        results.append([ss,ii,rr])
        l_s.append(ss)
        l_i.append(ii)
        l_r.append(rr)
    print("R0:{}".format(r0))

    plt.rcParams["font.family"] = "TakaoExGothic"
    # plt.rcParams["font.family"] = "IPAGothic"

    plt.figure()
    plt.title("R0:{}".format(format(r0,".3f")))
    plt.xlabel('時間')
    plt.ylabel('比率')

    x = np.linspace(0, 100, period+1)
    plt.plot(x, l_s, label="未感染者")
    plt.plot(x, l_i, label="感染者")
    plt.plot(x, l_r, label="回復者")
    plt.legend()
    plt.show()
#
# ------------------------------------------------------------------
main()
# ------------------------------------------------------------------
```

フォントの指定は、TakaoExGothic でも IPAGothic でも大丈夫です。

Arch Linux で確認しました。

```text
$ uname -a
Linux iwata 5.6.10-arch1-1 #1 SMP PREEMPT Sat, 02 May 2020 19:11:54 +0000 x86_64 GNU/Linux
$ python --version
Python 3.8.2
```
RailsのDBコマンド

Railsで開発を行う際にターミナルでよく使うコマンドをまとめておきます




```
rails db:create
```

データベースの作成↑

```
rails db:drop
```

データベースの削除↑

```
rails db:reset
```

データベースの削除から作成をまとめて行ってくれる↑


```
rails db:migrate
```

マイグレーションファイルの実行↑


```
rails db:migrate:status
```

マイグレーションファイルがデータベースに適用されているか確認。↑
適用されている時は「up」　　適用されていなければ「down」　と表示される

```
rails db:rollback
```

適用されているマイグレーションファイルを「down」にすることができる。↑
既に適用されたマイグレーションファイルを修正する時は、一度ロールバックしてから、修正し、実行という手順を踏まないと整合性が取れず、修正を反映できません
Visual Studioで管理者権限で動作するアプリを作る

# プロジェクトにマニフェストファイルを追加する
C#のプロジェクトであれば、「全般」の「アプリケーション マニフェスト ファイル（Windows のみ）」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911/40360769-3414-c209-017f-d36f8ee07a4f.png)

# マニフェストファイルの修正
`requestedExecutionLevel`の`level`属性に`requireAdministrator`を指定します。

```xml
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC マニフェスト オプション
             Windows のユーザー アカウント制御のレベルを変更するには、
             requestedExecutionLevel ノードを以下のいずれかで置換します。

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
            アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
            削除します。
        -->
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  ・・・(略)・・・

</assembly>
```
# プロジェクトの設定
ここまでの設定で管理者権限で実行できない場合は、プロジェクト設定の「アプリケーション」－「リソース」が以下の通りとなっていることを確認します。

- 「アイコンとマニフェスト」ラジオボタンにチェックが入っている。
- 「マニフェスト」に、追加したマニフェストファイル名が指定されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911/ef6bce97-fc26-0af3-9214-d17117067cd4.png)
Docker Rails6.0 Mysql8.0.20 でdbコンテナの名前指定

メモです

# 問題だったところ
Dockerを触って３日目。dbコンテナの名前を「db」にしたかったのにやり方がわからなかったので調べたらそのままだった。



```yml

version: '3'
services:
  db:
    image: mysql:8.0.20
    container_name: db # ここで名前の指定をする
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_PASSWORD: pass
      TZ: 'Asia/Tokyo'
    volumes:
      - ./mysql-confd:/etc/mysql/conf.dcollation-server=utf8mb4_ja_0900_as_cs
      - ./tmp/db:/var/lib/postgresql/data
      - ./mysql-confd:/etc/mysql/conf.d
  web:
    build: 
        context: ./
        dockerfile: docker/Dockerfile
    container_name: rails_web
    volumes:
      - .:/usr/src
    ports:
      - "3000:3000"
    environment:
      PORT: 3000
      BINDING: 0.0.0.0
    stdin_open: true
    tty: true
    links:
      - db
    depends_on:
      - db

```
phpmyadminのあれこれ

ゲームのデータをスクレイピングしてgoogle spreadsheet上に読み込んだのはいいものの、mysqlにインポートしようとしたらエラーが何度か出たので自分用の解決メモ

google spreadsheet→tsvファイルとして出力

カラムの区切り記号:
/t
カラム囲み記号:

カラムのエスケープ記号:
/
行の終端記号:

で名前とかに変な記号が含まれててもひとまず無事にインポートできそう？な気がする
名前に"が含まれてたりしてカラムの区切り記号と囲み記号の設定がめんどくさい。
LINE Bot + SpreadSheet + Google Calendar で予約アプリを作る - 1

# LINE Botって？
LINE Botは自治体含め，様々なところで自動応答サービスとして普及しています．
中でもお店の予約にLINE Botを組み込みたい！という要求は多いようで．．．
[こんな](https://www.repittebeauty.cnctor.jp/)サービスが有るくらい，一般的に普及しています．
でももちろん，お金をかけるのは嫌！！ってこともありますよね．．．
そこで無料ツールだけでかんたん予約システムを作ってみました．

## 使うもの
[LINE Messaging API](https://developers.line.biz/ja/services/messaging-api/)
[Google SpreadSheet](https://www.google.com/intl/ja_jp/sheets/about/)
[Google Calendar](https://calendar.google.com/calendar/)
[Google Apps Script](https://developers.google.com/gsuite/aspects/appsscript)

## 開発環境
clasp 2.3.0
Google Drive
Line Bot Designer

予約ということでDBは必須です．
今回はわざわざSQL建てるのも面倒くさいので，Google SpreadSheetをDBとして採用しました．
また，実際の入力情報はGoogle Calendarを使用して可視化します．

## 構成
システムの構成はこんな感じです．

![System.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317621/1ea82693-7466-c77b-9bde-4395ee384285.png)

SpreadSheet + Google Apps Scriptを仲介して，カレンダーとLINE Botがやり取りする感じですね．
保存するデータは[ユーザ情報]と[予約情報]です．
[環境情報]は環境設定みたいな感じですね．トークンとかをここに保存します．

## Google Calendar の作成
はじめに，予約の予定を入れるカレンダーを作成します．
といってもこれは簡単です．
[Google Calendar](https://calendar.google.com/calendar/)を開いて，左にあるボタンからカレンダーを追加するだけ．
<img width="1200" alt="calendar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317621/4f4cc90d-c565-f4e8-1940-9b11f1320f0d.png">

これで専用のカレンダーが出来ました．
専用カレンダーは画面左端の[マイカレンダー]の中に作成されます．
専用カレンダーの[設定と共有]画面を開いて，下の方にある***[カレンダーID]をメモ***しておきます．
この[カレンダーID]はGASからカレンダーにアクセスするのに使用します．

## LINE Botの作成
LINE Botは[LINE Developpers](https://developers.line.biz/en/)から簡単に作成できます．
今回はGASとの連携なので，[Messaging API](https://developers.line.biz/ja/docs/messaging-api/overview/)を有効化します．
LINEとはWebhookでひっかけてやり取りする感じですね．
登録はこんな感じです．
<img width="1710" alt="LINE.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317621/2b0a4abc-b836-9e43-348a-0db831ec6710.png">

登録したら，***Access Tokenが必要なのでここから発行***します．
<img width="774" alt="LINE_Token.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317621/ce5e6015-fe15-8224-3999-90185a515857.png">

GASが出来たらWebhook URLを登録する必要があるのですが，とりあえずやることは終了です．

## SpreadSheetの作成
はじめに，Driveの中にProject用のディレクトリを作成します．
そこにSpreadSheetを作り，以下のようなフォームを作成します．
Configには環境情報を，UsersにはLINEから取得できたUser情報を，Bookingには送られてきた予約情報のRawデータを保存します．
<img width="927" alt="SpreadSheet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317621/78c3b762-1598-e5ac-d345-80969ec8dffd.png">

並行人数は，同じ時間に予約がかぶっても良い人数，カレンダーIDとLINE アクセストークンは前述したとおりです．
これでサーバー側（DB）の設定が終わりました．
これにLINE BotをWebhook経由で繋いでいきます．

## 続く
GASとLINE Botの作成は量が思ったよりも増えてしまったので，次の記事でまとめようと思います．

続きの記事↓
[LINE Bot + SpreadSheet + Google Calendar で予約アプリを作る - 2](https://qiita.com/yodai-hi/items/370402955a70f318ff2c)
[LINE Bot + SpreadSheet + Google Calendarで 予約アプリを作る - 3](https://qiita.com/yodai-hi/items/6aade0009a9230f0649f)
Github初回投稿方法


#初期設定
名前の設定
$ git config --global user.name "name"

メールアドレスの設定
$ git config --global user.email "email@email.com"

設定の確認
$ less ~/.gitconfig

#ファイル作成
ファイル作成
$ mkdir failname

作成したファイルへ移動
$ cd failname

初期化（gitの管理下におく）
$ git init

ファイル作成

#ステージする
ワークツリーの状況確認
$ git status

ステージする
$ git add ファイル名

#コミットする
インデックスの状況確認
$ git status

コミットする
git commit -m "コメント"

コミット履歴確認
git log

#プッシュする

Githubで新規リポジトリつくる

リモートリポジトリの登録
$ git remote add origin 上記で作成した
URL

リモートの状況確認
$ git remote -v

リモートリポジトリへプッシュ
$ git push origin master
CakePHP3+ HTTP_Request2

というか、プラグインのインストールに手こずった。
ポイントは、"/var/www/html/my_app"ディレクトリでインストール作業しなさいってことだった。

# 参考
https://book.cakephp.org/3/ja/plugins.html

# Dockerfile
```
FROM amazonlinux:2

# こんなにインストールいらないかもしれない
RUN yum update -y && \
    yum clean all && \
    amazon-linux-extras install php7.3  && \
    yum install -y wget zip unzip tar httpd && \
    yum install -y php php-gd php-mbstring php-xml php-pecl-zip php-pgsql php-pear php-intl && \
    yum clean all

RUN curl -s http://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer
WORKDIR /var/www/html
RUN composer create-project --prefer-dist --no-dev cakephp/app:3.8.* my_app

# http_request2
WORKDIR /var/www/html/my_app
RUN composer require pear/http_request2:2.3.*

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

EXPOSE 80
```

# 使用
`/var/www/html/my_app/src/Controller/ExampleController.php`

```
<?php
namespace App\Controller;

use App\Controller\AppController;
use HTTP_Request2;

class ExampleController extends AppController {
        /**
         *
         */
        public function test() {
            ・・・
            $req = new HTTP_Request2(・・・);
            ・・・
        }
}
```
ランキング機能で使うメソッド

#実装するランキング機能
ReviewsテーブルとProductsテーブルを持つ映画レビューサイトにて、映画に対するレビュー数が多い順に5件レコードを取得する。

大まかな必要な処理は以下のようです。

1. Reviewsテーブルのレコードをproduct_idごとにまとめて、数の多い5件を取得する
2. 取得した5件のReviewsテーブルのproduct_idを取得する
3. 取得したproduct_id(5件分)と同値のidを持つproductsテーブルのレコードを取得する

```ruby
def ranking
    product_ids = Review.group(:product_id).order('count_product_id DESC').limit(5).count(:product_id).keys
    @ranking = product_ids.map { |id| Product.find(id) }
end
```
#ランキング機能で使用していくメソッド
1. groupメソッド
2. countメソッド
3. orderメソッド
4. keysメソッド
5. mapメソッド

##groupメソッド
groupメソッドは、テーブルのレコードを指定したカラムでまとめた状態で取得します。
以下のように利用します。

```ruby

モデル.group(カラム名)
```
groupメソッドを使うと、指定した絡むでまとめることができますが、出力されるのはまとめられたレコード内の、idが一番小さいレコードだけとなっています。そのため現地点では、レビューがそれぞれ何件あるかわかりません。

そこで、まとめられたレコード数を取得するのが**countメソッド**です。

##countメソッド
countメソッドは配列などの要素数を返すメソッドです。groupメソッドに続けて使うとまとめられたそれぞれのレコードの数が取得できます。実行例は下記の通りです。

```ruby

Review.group(:product_id).count
=> {21=>2, 22=>1, 23=>4}
```
ここでcountメソッドの返り値が**ハッシュ**であることがわかります。

ハッシュのキーはgroupメソッドで指定したカラムの値、ここではproduct_id
ハッシュの値はそれぞれのレビュー数となります。

この状態で、レビュー数が多い順に並び替えをしたい場合は**oderメソッド**を使います。

##orderメソッド

```ruby

Review.group(:product_id).order('count_product_id DESC').count(:product_id)
=> {23=>4, 21=>2, 22=>1}
```
上記のように、**order('count_カラム名').count(カラム名)**と記述することでレビュー数が多い順に並び替えることができました。

今回取得したいのは５件なので、limit(5)を付け加えます。**limitメソッド**はハッシュに対して使うことはできず、**ActiveRecord::Relation**に対して使うことができます。countメソッドを使うことでハッシュになってしまうため、以下の例の通りその直前に付け加えます。

```ruby
Review.group(:product_id).order('count_product_id DESC').limit(5).count(:product_id)
=> {23=>4, 21=>2, 22=>1}
```
##keysメソッド
ハッシュにはkeysメソッドというものがあり、これはハッシュのキーだけを取り出して配列として返すメソッドです。

```ruby

Review.group(:product_id).order('count_product_id DESC').limit(5).count(:product_id).keys
=> [23, 21, 22]
```

以上でレビュー数が多いproduct上位5件のidが順番に並んだ配列を取得できました。
次にproduct_idの配列からidに該当するProductsテーブルのレコードを取得していきます。

##mapメソッド
mapメソッドは配列クラスに定義されているのインスタンスメソッドです。mapメソッドは配列の中身を１つずつ取り出してブロックという構文を繰り返し実行します。そして、ブロックの返り値を集めた新しい配列を作成します。
mapメソッドは配列オブジェクトに対して以下のように使用します。

```ruby

  配列オブジェクト.map {|ele| ブロックの処理}
  # eleには配列の要素が１つずつ代入される
  # ブロックの処理は配列の要素の数だけ繰り返し実行される
```
今回のランキング機能では以下のように使うことができます。

```ruby

product_ids = Review.group(:product_id).order('count_product_id DESC').limit(5).count(:product_id).keys
@ranking = product_ids.map { |id| Product.find(id) }
```
idにはproduct_idsの中身一つ一つ、つまりproductsテーブルのレコードのidが入ります。
これでproducu_idsという配列オブジェクトから順番に、productテーブルからレコードを取得できています。

以上でランキング機能の実装は完了です。
Apple ClangでOpenMPをclionから使う

MacOS上でApple clangでOpenMPを使うコードをコンパイルする方法が以下の記事に書いてある。
[Apple ClangでOpenMPを使う](https://qiita.com/ktgw0316/items/23235dd2533f488be7da)
上記の記事にも書いてある通り、長らくApple clangはopenmpをサポートしておらず、llvm-ompをインストールするといった方法が取られていた。
しかし、2020年時点ではコンパイラをインストールする必要はなく、ランタイムライブラリをインストールすれば使えるようになる。

```shell-session
brew install libomp
```

コンパイルも上記の記事の通り、簡単に実行できる。

```shell-session
clang -Xpreprocessor -fopenmp -lomp myfile.cxx
```

cmakeを使う場合、cmake 3.12以降であれば`find_package(OpenMP)`とするだけで、OpenMPに必要な設定が実行される。

```cmake
cmake_minimum_required(VERSION 3.12)
project(openmptest CXX)

add_executable(sample sample.cpp)

find_package(OpenMP REQUIRED)
target_link_libraries(sample PRIVATE OpenMP::OpenMP_CXX)
```

ここまでは非常に簡単にできる。しかし、これをclionからビルドしようとすると以下のようなエラーが出てしまう。

```
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /Users/murase/work/econo_sim_inoue/Fugaku
-- The CXX compiler identification is AppleClang 11.0.3.11030032
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
Call Stack (most recent call first):
  /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.15/Modules/FindOpenMP.cmake:477 (find_package_handle_standard_args)
  CMakeLists.txt:6 (find_package)
```

詳細な原因はわからないが、clionに同梱されているcmakeを使っていることが原因のようだ。

この問題を回避するにはclionからでも、`/usr/local/bin/cmake`を使うようにすれば良い。(cmakeは事前にhomebrewでインストールしておく）
"Preferences" -> "Build,execution,deployment" -> "Toolchains" と選択し、cmakeのパスを以下のように設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/ed3be318-55bf-32e7-c948-7e8ddd5daa73.png)

その上で、[Tools] -> [CMake] -> [Reste Cache and Reload Project] とすればちゃんとOpenMPを認識してくれるようになる。


参考: 

- https://qiita.com/ktgw0316/items/23235dd2533f488be7da
- https://iscinumpy.gitlab.io/post/omp-on-high-sierra/
Laravel Mixでマッピングの肥大化を防ぐ【Laravel-mix-glob】

#やりたいこと
Laravelでjsやscssを画面ごと作成したりしているとマッピングがすごい量になる


```js:webpack.mix.js
mix
    // JSファイル
    .js('resources/js/gamen1/app.js', 'public/js/gamen1')
    .js('resources/js/gamen2/app.js', 'public/js/gamen2')
    .js('resources/js/gamen3/app.js', 'public/js/gamen3')
    .js('resources/js/gamen4/app.js', 'public/js/gamen4')
    .js('resources/js/gamen5/app.js', 'public/js/gamen5')
///以下続く...
```


#やりかた

ふつうにglobを使っても良いけどせっかく
LaravelMixのエクステンションに`laravel-mix-glob`というのがあるので使う
https://github.com/MohamedLamineAllal/laravel-mix-glob

```bash
npm i laravel-mix-glob --save-dev
```

```js:webpack.mix.js
const mix = require('laravel-mix');
const MixGlob = require('laravel-mix-glob');

const mixGlob = new MixGlob({ mix });

mixGlob
    .js('resources/js/**/*.compile.js', 'public/js', null, {
        base: 'resources/js/'
    })
    .sass('resources/sass/**/*.compile.scss', 'public/css', null, {
        base: 'resources/sass/'
    });

```

あとはコンパイルしたいjsとscssを`.compile`を付け足す
`.compile`つけるのは、インポートするファイルまでコンパイルされるから識別するため

あとは`npm run dev`

ちゃんと出力されたら成功
シンプルなImageEffect　その６。RGB分解

TwitterにアップしたRGB分解ImageEffectのシェーダコードを貼っておきます
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">シンプルなImageEffect。「RGB分解」<br>古い映像(ブラウン管やVHS)の表現や、計器の乱れなどに使用できます。<br><br>昔遊んだSTGで、ダメージの時にUIのRGBがジャッと一瞬ずれる演出がカッコ良いゲームが有ったような？？ <a href="https://t.co/FQGzSHHAnC">pic.twitter.com/FQGzSHHAnC</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1259709314312204288?ref_src=twsrc%5Etfw">May 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

単純にRとBのサンプリング座標をずらして上書きしているだけです。シンプル！

```glsl:DivideRgb.shader
Shader "ScreenPocket/ImageEffect/DevideRgb"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _SizeV ("Size V", Float) = 0
        _SizeH ("Size H", Float) = 0
    }
    
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _SizeV;
            float _SizeH;

            fixed4 frag (v2f i) : SV_Target
            {
                half4 col = tex2D( _MainTex, i.uv );
                col.r = tex2D( _MainTex, i.uv + float2(_SizeH, _SizeV) ).r;
                col.b = tex2D( _MainTex, i.uv - float2(_SizeH, _SizeV) ).b;
                return col;
            }
            ENDCG
        }
    }
}
```
幅を調整したい場合はInspectorから _SizeV, _SizeH を調整してくだい。