OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder 生活　85日目

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

#85日目
今回は茶色diffの問題を3問解きました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC094|D|◯|64分25秒|
|CODE FESTIVAL 2014 決勝|C|✕|95分8秒|
|AGC034|A|✕|50分57秒|


##[ABC158_D](https://atcoder.jp/contests/abc158/tasks/abc158_d)

```c++

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

const int INF = 2e9;

int main(){
    string s;
    cin >> s;
    int q;
    cin >> q;
    bool ok = false;
    rep(x,q){
        int a;
        cin >> a;
        if(a == 1){
            if(ok) ok = false;
            else ok = true;
        }
        else{
            int b;
            char c;
            cin >> b >> c;
            if(b == 1){
                if(ok) s += c;
                else s = c + s;
            }
            else{
                if(ok) s = c + s;
                else s += c;
            }
        }
    }
    if(ok) reverse(s.begin(),s.end());
    cout << s << endl;
}

```

解くのにかかった時間：64分25秒


##[CODE FESTIVAL 2014 決勝_C](https://atcoder.jp/contests/code-festival-2014-final/tasks/code_festival_final_c)

```c++

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

const int INF = 2e9;

ll f(ll k){
    ll ret = 0;
    ll pow = 1;
    ll k2 = k;
    while(k2 > 0){
        ret += k2 % 10 * pow;
        pow *= k;
        k2 /= 10;
    }
    return ret;
}

int main(){
    ll a;
    cin >> a;
    for(ll k = 10;k <= 10000;k++){
        if(f(k) == a){
            cout << k << endl;
            return 0;
        }
    }
    cout << -1 << endl;
}

```

解くのにかかった時間：95分8秒
感想：N進法のかたちにするのに慣れてない。このぐらいは素早く解けるようにしたい


##[AGC034_A](https://atcoder.jp/contests/agc034/tasks/agc034_a)

```c++

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

const int INF = 2e9;

int main(){
    int n,a,b,c,d;
    cin >> n >> a >> b >> c >> d;
    string s;
    cin >> s;
    int p = 0;
    for(int i = a;i < max(c,d);i++){
        if(s[i] == '#' && s[i-1] == '#'){
            p++;
            break;
        }
    }
    if(d < c){
        p++;
        for(int i = b;i <= d;i++){
            if(s[i] == '.' && s[i-1] == '.' && s[i-2] == '.'){
                p--;
                break;
            }
        }
    }
    if(p == 0) cout << "Yes" << endl;
    else cout << "No" << endl;
}

```

解くのにかかった時間：50分57秒
感想：AGCがなかなか解けない


###最後に
ABCでない茶色diffも解けるようになりたい

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|C|64分25秒|2問中1問|
raspberryPiでPIRモーションセンサを使う

# 概要

RaspberryPi2 と [PIRモーションセンサ](https://www.switch-science.com/catalog/2145/)  から動態を検知した/していないをプログラムで取得します。

# 前提

- raspberryPiのモデルはraspberryPi2 modelB v1.1
- モーションセンサーは[PIRモーションセンサ](https://www.switch-science.com/catalog/2145/) 
- 使う言語はpython3
- RaspberryOS

```text
Raspberry Pi OS (32-bit) Lite
Minimal image based on Debian Buster  
Version:May 2020  
Release date:2020-05-27  
Kernel version:4.19
```

- raspberryPiが起動する状態である。
- 常に検知範囲に動体があるので、動体が無いことが異常とする。
常にセンサーが動体を検知していることが前提で、
検知しなくなった(対象物が止まっている)ことを検知するプログラムです。
`e.g. 常に動作しているファンの停止を検知する。`

- センサーは動体を検知し続ける事はできない。
センサーの検知タイミングなのか何なのか、
動体があっても検知しないケースがあるようです。
なので一定回数以上動体を検知しないときに何かアクションをすることを想定しています。
`e.g. 動体が無いことを20回以上検知する。`


# 準備

## pip3のインストール

```bash
sudo apt install python3-distutils
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
```

## RPi.GPIOのインストール

```
sudo apt install python3-dev
pip3 install RPi.GPIO
```

## センサーとraspberryPiの接続

以下の [公式から取得したGPIOのPINアサイン](https://www.raspberrypi.org/documentation/usage/gpio/) を参考にして
ジャンパワイヤで以下のように接続する。
<img width="569" alt="スクリーンショット 2020-06-28 21.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/e3abacc1-5031-92a6-5f98-dd297cc00c06.png">

- raspberryPiの2番 5V power と センサーのVCC
- raspberryPiの6番 ground と センサーのGRD
- raspberryPiの12番 GPIO 18 と センサーのout

センサー側
![IMG_20200628_213324.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/8b4a977f-5951-a565-892c-c53756e1b690.jpeg)

rasqberryPi側
![IMG_20200628_213316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/25a6f0e1-7c7f-49c0-52cd-1a856e9fbfc0.jpeg)

# センサーで値を取得する


```python
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

# GPIOの18を指定
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

count = 0
while True:
    sleep(1)

    # センサーが動体を検知すると1が返ってくる。
    if GPIO.input(18) == 1:
        count = 0
        print("yes")
    
    # 1が返ってこない場合が20回を超えるとyabeeeeeを出力する。
    else:
        count += 1
        print("no good")
        if count > 20:
            print("yabeeeee")
        else:
            pass
```
Google ColaboratoryでHTML・PDFに変換する

レポート作成などに便利なGoogle Colaboratoryですが，pdf出力・HTML出力等が出来ません。
わざわざローカルにjupyterNotebookの環境構築をするのもめんどくさいので，Colab上でHTMLに変換しちゃいます。

https://colab.research.google.com/drive/10OX-YoiHPxHBMYXtxFWGQhkZxNEm2eVL?usp=sharing

```python
from google.colab import files
import re

uploaded = files.upload()

for fn in uploaded.keys():
  fn_s = re.escape(fn)
  output_fn = fn.split('.', 1)[0]+'.html'
  output_fn_s = re.escape(output_fn)
  !jupyter nbconvert --to html $fn_s
  files.download(output_fn)
  !rm $fn_s
```

PDFへの変換はめんどくさいので，HTMLに出力しブラウザの印刷機能をつかってPDFに出力するとレイアウトが整っておすすめです。
VBA シートモジュールにプロパティを設定

#Excel VBS のシートモジュールにプロパティを設定する時のメモ
##各モジュールへの記述
シートモジュールにプロパティを設定することは可能。
特にクラスモジュールや標準モジュールへの記述と変わらない。

##他のモジュールからアクセスする時
下記のようにシートモジュールのオブジェクト名を使用してプロパティにアクセスすれば、インテリセンスも働くし問題はない。

```
Msgbox WorksheetCodeName.PropertyGetName
```
上の例では、
WorksheetCodeName がシートモジュールのオブジェクト名。
PropertyGetName がプロパティ取得プロシージャ名。


##ワークシートを引数とする時

ワークシートのオブジェクト名が使えない場合、例えば対象のワークシートが定まっておらず、ワークシートを引数として、他のモジュールに渡したい場合。
当然、引数として渡すには引数の型を指定する必要がある。
###Worksheetオブジェクトとした場合
この時、Worksheetオブジェクトとして渡そうとすると以下のような記述になる。

```
Public Sub Procedure(Byref vWorksheet as Worksheet)
```

このようにして受け取ったvWorksheetオブジェクトを用いて、プロパティにアクセスしようと下記のように記述してもエラーになる。

```
Msgbox vWorksheet.PropertyGetName
```
ワークシート型として扱われるので、ワークシート型に定義されていないPropertyGetNameプロパティにはアクセスできない。

###独自オブジェクトとした場合
Worksheetオブジェクトは、それぞれを **オブジェクト名=オブジェクト型**　として使用できる。
上記の例の場合ワークシートのオブジェクト名をWorksheetCodeNameとしているので
WorksheetCodeName型が使用できる。

そこで　Worksheet型ではなく　WorksheetCodeName型として受け取れば下記のように記述できる。

```
Public Sub Procedure(Byref vWorksheet as WorksheetCodeName)
    Msgbox vWorksheet.PropertyGetName
End sub
```
これであれば、インテリセンスも使えるし、期待どおりに動く。

ただ、これではWorksheetCodeName型しか受け取れないので、オブジェクト名からの記述と変わらない。当然だが他のワークシートはそれぞれ各オブジェクト名型であり、WorksheetCodeName型ではない。これでは引数にしている意味がない。


##インテリセンスを使用できなくても良いならば・・・

VBAにはObject型というオブジェクトならなんでも入れられる型がある。
便利に見えるが、インテリセンスが働かないのでコーディングの効率的には避けたい。
特にWorksheetオブジェクトは多くのメンバを持っているので、何とか使いたいところ。

解決策というには妥協点が多いが、現状下記を利用中。

```
Public Sub Procedure(Byref vWorksheet as Object)
    Dim mTargetSheet as Worksheet
    Set mTargetSheet =vWorksheet
    Msgbox vWorksheet.PropertyGetName
End sub 
```
引数はObject型として受けとり、それをワークシート型で定義した変数に代入する。
こうすると、mTargetSheetはワークシート型として扱えるので、ワークシートのメンバはインテリセンスが働く。
vWorksheetはオブジェクト型として扱われるので、このオブジェクトからメンバのPropertyGetNameにアクセスも可能だ。
ただし、オブジェクト型のため、こちらのインテリセンスは働かない。

###ツッコミどころ

・同じオブジェクトなのに、対象のメンバによってオブジェクト名を使い分けるってどうなの？
→意外と気にならなかった。そんなにカスタムしたメンバが多くないからかも。
・カスタムしたメンバのインテリセンスが働かないって意味なくない？
→これは思う。カスタムしたメンバが多くないから成り立っているかも。それよりデフォルトのワークシートメンバのインテリセンスが働くことの利点が大きい。
データローダの使用とCSVファイルの作成についての便利ワザ・注意点

データローダの利用や、CSVファイルの作成や編集などに関しての便利なテクニックや、注意したい点などの備忘録です。

#目次
１．CSVファイルを表示するとき
２．CSVファイルを作成するとき
３．データローダに関する注意点

#１．CSVファイルを表示するとき
###0落ちしてしまう
CSVファイルをダブルクリックするなどしてExcelでそのまま開くと、「0」から始まる数値は0が勝手に除去されてしまうので以下の方法で開いて対処する

####・CSVファイル全体をそのまま使う場合
「データ」＞外部データの取り込み＞テキストファイル＞テキストファイルウィザード
①データのファイル形式（カンマ区切りor固定長フィールド）
②区切り文字の種類、文字列の引用符
③列のデータ形式（日付、文字列etc）
→0を除去されたくない列は「文字列」を指定してインポートする

####・CSVファイルの一部を使う場合
サクラエディタなどのテキストエディタでCSVファイルを開く＞使いたい部分を選択してコピー＞Excelのシートにペースト＞貼り付け先セルの右下「貼り付けのオプション」＞テキストファイルウィザード
（以下の手順は同上）

###列や行によって幅が違うなど見にくい
全セルを選択（A1セル左上の三角形をクリックか、Ctrl+A）＞「ホーム」＞「配置」＞「折り返して全体を表示する」を2回クリックする
→すべて同じ幅に調節される

#２．CSVファイルを作成するとき

###保存時の注意
ExcelでCSVファイルとして保存するとき、該当のシート1枚しか保存されないので、VLOOKUPなどでシートを複数使用している場合などはデータを意図せず消去してしまうことがあるので注意
→一度Excelファイルを保存したあと、コピーを作成してCSVファイルにするなど

###Excelを利用してカンマ区切りを作成する方法
（他にも"で囲むときなど、同一文字を利用する作業で使える）
①セルにデータを入力
②直下のセルにカンマを入力
③さらにその下のセルに文字結合の数式を入力（「＝（①のセルを選択）＆（②のセルを選択）」でEnterキー）
④②のセルの右下にカーソルを合わせて（黒い十字になる）クリックしたまま、必要なところまでドラッグして離す
⑤③のセルの右下にカーソルを合わせて（黒い十字になる）クリックしたまま、必要なところまでドラッグして離す
⑥数式なので⑤の該当部分をExcel上の他の場所にそのままコピペするとエラーになるので
コピー＞貼り付けたい先のセルを選択＞右クリック＞「貼り付けのオプション」＞「値」を選択


###便利なショートカットキー
Ctrl+方向キー：その方向のデータのある一番先のセルまで移動
Ctrl+Shift＋方向キー：その方向のデータのある一番先のセルまでの全セルを選択する
F2：セル内を直接編集できるようにする
Ctrl+F：「検索と置換」の検索
Ctrl+H：「検索と置換」の置換（区切り文字をまとめて置換するなど）
※「オプション」で対象の場所を「シート」か「ブック」か選択できる
Ctrl+;：今日の日付（ex.2020/6/28）を入力
Ctrl+:：現在時刻（ex.18:00:00）を入力

###合わせ技
「書式のコピー」と「Ctrl+Shift+方向キー」
ホウキマークをダブルクリック＞Ctrl+Shift+方向キー
まとめて書式をコピーできる

####書式設定のユーザ定義を利用する
#####Salesforceの日付時間項目の書式フォーマットで入力する
「セルの書式設定」＞「表示形式」＞「ユーザ定義」＞「種類」＞「yyyy-mm-ddThh:mm :ss.ssZ」と入力して登録
ex.）「Ctrl+;」（スペース）「Ctrl+:」＞上のユーザ定義を適用
#####0埋め（桁数の変更）
右クリック＞「セルの書式設定」＞「表示形式」＞「ユーザ定義」＞「種類」（デフォルトで「G/標準」となっている）に直接桁数分の0を入力

###書式のコピー/貼り付け
書式をコピーしたい元のセルを選択
＞ホーム＞クリップボード＞ホウキのマーク
あるいは
＞右クリック＞ホウキのマーク
＞コピーしたい先のセルを選択

#３．データローダに関する注意点
###CSV作成時の注意点
・オブジェクトの必須項目を必ず入れる
・ヘッダー行に項目名を入れる
・重複レコードを含めない

###Bulk API
Bulk APIを利用するとデフォルトのSOAPベースAPIよりも速く多くのレコードを読み込み、または削除できる
大量のデータを利用するときは基本的にBulk APIを利用する

使い方
settings＞settings＞Use Bulk APIにチェックを入れる

###Bulk API使用時の注意点
・カンマ以外の区切り文字は使用不可
・値にカンマ、改行、二重引用符（"）などが含まれるときは二重引用符で囲んでエスケープする必要がある
・項目の値が空のときレコードの更新時にはその項目は無視される（settingsのInsert null valuesにはチェックをつけられない）
→値をnullに設定したいときは項目値「#N/A」を使用する

###データローダのよくあるエラー
####Error:Row is larger than header：ヘッダがない項目にデータがある
データが意図せず残ってしまっている場合などがあるので、
ヘッダの無い列をすべて選択（ヘッダのない一番左の列のアルファベットを選択＞Ctrl+Shift+右キー）＞右クリック＞削除
で削除しておくとよい

####ヘッダ行がデータのある行よりも多い（データのないヘッダがある）
「initializing salesforce object and csv file」というウィンドウが表示されたまま固まってしまうバグ
→該当のヘッダを削除する
Qiitaで目次のリンクが上手く機能しない場合

##原因
見出しに対する**\<span id="hoge">**の値が、見出しそのものと異なることがあるため、単純に見出しの文字列をアンカーに設定しても上手く飛べない場合がある。

\[見出し](#アンカー)

##解決策
以下を参照
[Qiitaでページ内リンクがうまくいかない場合](https://qiita.com/rrryutaro/items/a4bfe85a8602ce682354)

**毎回手で直すのも面倒なので、直してくれるスクリプトをそのうち作ります（勉強がてら）**
Pythonスクリプトの実行

#目次

[1. シバン行](#1-シバン行)
[2. WindowsでPythonスクリプトを実行する](#2-windowsでpythonスクリプトを実行する)
[3. MacやLinuxでPythonスクリプトを実行する](#3-macやlinuxでpythonスクリプトを実行する)


##1. シバン行
このスクリプトを実行するのはPythonであることをコンピュータに伝える働きをする。
**※シバン行がなくてもIDLEからスクリプトを実行することは可能だが、コマンドラインから実行するにはシバン行が必要**

```Windows.ver
#! python3
```

```Mac.ver
#! /usr/bin/env python3
```

```Linux.ver
#! /usr/bin/python3
```

##2. WindowsでPythonスクリプトを実行する

Windowsでは、Pythonのインタプリタは、

- C:\\Python36\python.exe

- %HOMEPATH%\AppData\Local\Programs\Python\Python36-32\python.exe

- %HOMEPATH%\Anaconda3\python.exe

にある。

あるいは、.pyファイルの先頭のシバン行を読み込んで、適切なバージョンのPythonインタプリタを実行してくれるpy.exeがある。

**Pythonスクリプトの実行を簡単にするには、py.exeでスクリプトを実行するバッチファイル（拡張子は.bat）を作る。**

バッチファイルには、次のような１行を書く。

```hoge.bat
@py.exe C:\MyPythonScripts\pythonScript.py %*
```

※パスは実際のスクリプトの絶対パスを指定する

ファイルは**pythonScript.bat**のように、拡張子.batを付けて保存する。このバッチを使えば、スクリプトの絶対パスを毎回指定する手間が省ける。

バッチファイルと.pyファイルは、C:\MyPythonScriptsやC:\Users\YourName\PythonScriptsなどの、一つのフォルダに保存しておくのがおすすめ。

Windowsの環境変数PATHに、これらのフォルダを追加しておくことで、**スタートメニューの「ファイル名を指定して実行」（Win-R）にスクリプト名を入力するだけで実行できるようになる。**

例えば、pythonScript.pyを実行するには、pythonScript.batを実行する。このバッチファイルには

```pythonScript.bat
@py.exe C:\MyPythonScripts\pythonScript.py
```

と書いておく。

##3. MacやLinuxでPythonスクリプトを実行する

Pythonスクリプトを実行するには、.pyファイルを保存し、パーミッション変更により実行権限を付与する。

```
chmod +x pythonScript.py
```

実行権限を付与しておくことで、

```
./pythonScript.py
```

のようにスクリプトを実行できる。
スクリプトのシバン行により、Pythonのインタプリタの場所をOSに伝える。
Self-Attention GAN / Big GAN

#Self-attentionをざっくりいうと
論文は[こちら](https://arxiv.org/pdf/1805.08318.pdf)

モチベーション：GANの性能の向上
何をやっているか：画像の大域的な依存関係を抽出している
成果：ImageNetのデータセットに対してIS:36.8→52.2、FID:27.62→18.65にスコアを伸ばした。

#具体的な話

CNNは局所的な受容域を持つため、大域的な依存関係を学習するためには層を重ねる必要性が出てくる。しかし、層を重ねるにはコストがかかる。
またCNNの局所的な受容域が原因で奇妙な画像が生成されるといった問題も発生する。
（ex. 馬の写真を学習し生成するGANを訓練したときに、CNNの局所的な受容域が影響で、画像の全体的な頭の数が数えられず、頭が複数あるような馬の画像を生成してしまうような問題が発生している。）

そこで、画像全体の大局的な特徴量を加味しよう！

#計算式を順に追っていこう
<img width="1212" alt="スクリーンショット 2020-06-28 20.05.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/ff67c0cd-a0c7-0baf-fb95-52b3e70d172d.png">
↑こちらがself-attention機構の全体図
そして、attention map（上の図の白黒の図）までの計算式が以下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/bc2f673f-82b3-3da1-2d1d-17581f327345.png)
ここまでの計算をわかりやすく行列の図に表しました。
↓self-attention mapまでの行列計算を図で表すとは以下

![S__11919363.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/d5a22b1f-bd9a-3b88-aaa0-e45b368862e7.jpeg)

上の行列計算によって生成されたattention mapを可視化すると↓下の図のようになる。
写真内のある点に着目した時に、その点の色に近い領域が強く反応している。
（例えば、写真の赤い点に着目した時、その赤い点部分のいろと同じような色を持つ領域がattention mapにおいて白く反応している）
<img width="986" alt="スクリーンショット 2020-06-28 20.43.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/1640642a-5826-c2d4-c68f-8a8e6cb73874.png">

さらに、attention mapからself-attention feature mapを算出する式は以下
<img width="614" alt="スクリーンショット 2020-06-28 20.18.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/e3e396af-17d2-98b1-1434-0f0cf0a33265.png">
図で表すと、下のようになる。
![S__11919365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/7eff8cc2-1117-a638-ab60-4d28e0f26236.jpeg)

最後に、算出されたself-attention feature mapにパラメータγを掛け合わせて、入力xに加えてあげる。
<img width="191" alt="スクリーンショット 2020-06-28 20.18.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/ebb67988-472d-283b-0445-972f24ac7bc8.png">
これがself-attention機構の全貌である。

#bigGAN

このself-attention GANやスペクトル正規化を用いることで、BigGANは512×512の非常にリアルな画像の生成を、ImageNetの１０００クラス全てに対して可能にした。

このBigGANで遊んで見たい方は、こちらの[Artbreeder](https://artbreeder.com/browse)というサイトを試してみてください。潜在空間のベクトルを連続的に変化させることで、ある画像が違う画像に徐々に推移していく様子を楽しめます。

#参考文献
・http://urusulambda.com/2018/07/15/saganself-attention-generative-adversarial-network%E3%81%AEself-attention%E6%A9%9F%E6%A7%8B%E3%82%92%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F/
・https://arxiv.org/pdf/1805.08318.pdf
PHP: $HTTP_GET_VARS [非推奨]の書き換え

[$HTTP_GET_VARS](https://www.php.net/manual/ja/reserved.variables.get.php)は非推奨になっています。

しかし、古いプログラムでは使われています。
例えば、

```php:test_args.php
<?php
// -----------------------------------------------------------------
echo "<html>";
echo '<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />';
echo "<body>";
echo "test_args.php<p />";
echo "<h2>テスト</h2>";
$in_vars = "";
while (list($key, $val) = each($HTTP_GET_VARS)) {
	$in_vars	.= $key."=".$val. "<p />";
}
echo $in_vars;
echo "Jun/28/2020<p />";
echo "</body>";
echo "</html>";
// -----------------------------------------------------------------
?>
```

このプログラムを走らせると、次のようなログが出ます。

```text:/var/log/apache2/error.log
[Sun Jun 28 20:40:57.834991 2020] [php7:warn] [pid 8012] [client 127.0.0.1:41472] PHP Warning:  Variable passed to each() is not an array or object in /home/uchida/html/data_base_language/test_dir/php/test_args.php on line 10, referer: http://localhost/html/data_base/test_dir/php/
```

次のように修正すれば、正常に動きます。

```php:
<?php
// -----------------------------------------------------------------
echo "<html>";
echo '<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />';
echo "<body>";
echo "test_args.php<p />";
echo "<h2>テスト</h2>";
$in_vars = "";

// while (list($key, $val) = each($HTTP_GET_VARS)) {
while (list($key, $val) = each($_GET)) {
	$in_vars	.= $key."=".$val. "<p />";
}
echo $in_vars;
echo "Jun/28/2020<p />";
echo "</body>";
echo "</html>";
// -----------------------------------------------------------------
?>
```

次のように引数を与えて実行した結果です。
test_args.php?aa=12&bb=34&cc=56

![test_args_jun28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4388d53e-0b43-bd47-4b73-320dbd27aac2.png)
ネストしたレコードの更新

```elm
maz = { name = "mazohho", point = { x = 10, y = 20 } }
```

この point を素朴に更新しようとしてもコンパイルエラーとなってしまう。

```elm
-- これはできない
new_maz = { maz | point = { maz.point | y = 2 }}
```

一度 let で一時変数に受けておくと問題ない。

```elm
-- これは大丈夫
new_maz = 
  let maz_point = maz.point
  in  { maz | point = { maz_point | y = 2 }}

-- こういう手もあるがわかりやすいとは言えない
new_maz = { maz | point = maz.point |> (\n -> { n | x = 2})}
```
PowerShell への移行を始めたメモ

# サマリー

* Windows Terminal いれた
* PowerShell 7 系にした
* VSCode の Shell を pwsh にした

## 良かったこと

* いい加減 cmd.exe 使うなの時勢
* ハイライトなど、表示が綺麗
* / でも補間が効く（\\に書き換えてくれる）
* grep 感覚で sls (Select-String) が使える
* デメリットが特にない

## Windows Terminal いれた

タブが使えたり、cmd.exe や PowerShell などの切り替えが出来るターミナル。これだけでも入れた方がいい。

Store アプリから [Windows Terminal](https://www.microsoft.com/store/productId/9N0DX20HK701) を検索して、preview じゃない方を入れる。（[Windows Terminal (v0.7 ～ v1.0) メモ](Windows Terminal (v0.7 ～ v1.0) メモ) によると preview の方は開発版の位置づけっぽい。）

設定は最後に。

## PowerShell Core 7 系 を入れる

[github の Releases](https://github.com/PowerShell/powershell/releases) から落とす。インストーラはお好みので良いと思う。

## VSCode の PowerShell 拡張を入れる

VSCode で `powershell` で検索すると一番上に出てくる。

拡張を入れてから CTRL+@ でターミナルを出して、`1: pwsh` みたいにシェルを切り替えるところで、既定のシェルを **PowerShell** を選ぶ（*Windows PowerShell* は元々入ってる古いバージョンなので、**pwsh.exe** の方を選ぶこと)。

## PowerShell の設定

設定は cmd.exe とにた感じで可能。フォントなどは覚えてくれる。

[白源(HackGen）の HackGen Console](https://github.com/yuru7/HackGen) を使わせていただいてる。

### Profile に sudo っぽい oneliner だけ追加した

デフォルト環境が好ましいのですが、どうしても管理者権限が要求される場面があるので、[今すぐalias登録すべきPowerShellワンライナー](https://qiita.com/mu_sette/items/3954759daee8ae9ad26f) を参考にワンライナーを追加した。

デフォルトでは、PowerShell スクリプトが実行できないポリシーなので、管理者権限でPowerShellを起動して、ポリシーを緩める。
詳細は [PowerShellのExecutionPolicyのスコープとかについて詳しく](https://qiita.com/kikuchi/items/59f219eae2a172880ba6) などを参照。

```powershell
Set-ExecutionPolicy RemoteSigned
```

プロファイルを用意して、編集する。.bashrc みたいなファイル。VSCode を入れてないなら `code` を `notepad` などで。ハイライトは Qiita だからつくのではなくて、PowerShell でも実際に付く。

```powershell
New-Item -type file -force $profile
code $profile
```

必要なら profile にワンライナーを追加しておく。覚えるべきだが、覚えられない…。

```powershell
function CustomSudo {Start-Process pwsh.exe -Verb runas}
Set-Alias sudo CustomSudo
```

## Windows Terminal の設定

タブの横のドロップダウンメニューから設定を開く。すると、VSCode なりが起動して json を編集して設定しろと（無言で）言われる。
端折って載せておくと、`defaultProfile` で `PowerShell Core` の `guid` を指定して、フォントのデフォルトを `"HackGen Console"`, `14`pt に指定。

```settings.json
{
  "$schema": "https://aka.ms/terminal-profiles-schema",

  "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",

  "profiles": {
    "defaults": {
      "fontFace": "HackGen Console",
      "fontSize": 14
    },
    "list": [
      {
        "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
        "name": "cmd",
        "commandline": "cmd.exe",
        "hidden": false
      },
      {
        "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
        "hidden": false,
        "name": "PowerShell",
        "source": "Windows.Terminal.PowershellCore"
      }
    ]
  },
  "schemes": [],
  "keybindings": []
}
```
アウトプットの方程式　職場の活性化への気づき

##どんな組織や業界にも通じる方程式があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/b00276c7-e43f-901a-74d4-be285d7b0d29.png)
OUTPUTは品質・利益・等すべてに当てはまります。
この方程式は、どんなに人間的に素晴らしく、能力が高い人を集めたチームとしても、各自のモチベーションがマイナスであれば、OUTPUTがマイナスになることを表しています。
この方程式はトヨタ流の教科書に載っています。
AgileやDevOpsのプラクティスだけ真似ても、このモチベーションには効いていきません。
仕事や作業を通じてモチベーションが上がるシーンとマイナスになるシーンを想像してみてください。
その想像と現実のギャップは何でしょうか？
それが改善しなければならない課題です。
この課題に挑戦し改善する行動は組織風土改革・Agile開発そしてDevOpsの成功の土台を作ってくれます。
AtCoder beginner Contest 172


##[A - Calc](https://atcoder.jp/contests/abc172/tasks/abc172_a)

```Python:PYthon
A = int(input())
print(A+A**2+A**3)
```

##[B - Minor Change](https://atcoder.jp/contests/abc172/tasks/abc172_b)

```Python:PYthon
S = input()
T = input()

c=0
for i in range(len(S)):
    if S[i] != T[i]:
        c+=1

print(c)
```

##[C - Tsundoku](https://atcoder.jp/contests/abc172/tasks/abc172_c)

- 一番最初に考えるのが、貪欲法のAとBの一番上の本の読書時間を比較し小さい方を計測していく。

しかし、
4 3 200
80 1 1 1 
70 70 70
みたいな入力だとWAになります。

- 累積和を使用します。
- しかし、O(N*Q)では間に合いません。
- O(N * NlogM)にするために累積和と二分探索を使用します。


```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>

#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384

using namespace std;
using ll =long long;
using P = pair<int,int>;

#define MAX_N 200001
#define MAX_M 200001

int N, M;
ll K = 0;
int res = 0;

ll A[MAX_N];
ll B[MAX_M];

int main(int argc, const char * argv[]) {
 
    cin >> N >> M >> K;
    
    rep(i, N){
        int a;
        cin >> a;
        A[i+1] = A[i] + a;
    }
    
    rep(i, M){
        int b;
        cin >> b;
        B[i+1] = B[i] + b;
    }
    
    for(int i=0; i<N+1; i++){
        int l = 0;
        int r = M+1;
        while(r-l > 1){
            int mid = (l+r) / 2;
            if(B[mid]<=K-A[i]) l=mid;
            else r=mid;
        }
        
        if(A[i]+B[l]<=K) res = max(res, i + l);
    }
    
    cout << res << endl;
    
    return 0;
}
```
【devise】rails メモ　基本設定　初期設定


##【ゴール】
devise　初期、基本設定まとめ
意外と、ごちゃっとなってしまうので、、、

##【メリット】
■　作業効率UP
■　devise理解度向上


##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【コマンド】
####deviseを初期化
```
$ rails g devise:install

※エラーが出れば、
$ bundle exec spring stop
```

####modelを作成
```
$ rails g devise:アプリ名
```
####各viewを作成
```
$ rails g devise views アプリ名
```

####各controller作成
```
$ rails g controllers devise:アプリ名
```

####メール承認機能作成の場合
※Confirmableのコメントアウト外す

```db/migrate/devise_creat_アプリ名.rb
## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable
```

####APIのログイン機能作成の場合
※Trackableのコメントアウト外す

```db/migrate/devise_creat_アプリ名.rb
## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip
```
以上

##【合わせて読みたい】
■ 【環境変数】 rails 環境変数とは
https://qiita.com/tanaka-yu3/items/7bf03fee906b80367be9

■ 最速 rails mail devise ウェルカムメール送信機能実装 action mailer不要 一番簡単
https://qiita.com/tanaka-yu3/items/2def7760fd67fe73091a

■ 【devise】　管理者　ユーザー　ログイン、ログアウト分ける
https://qiita.com/tanaka-yu3/items/046bf30e08e48fbc42ca
[Microsoft] 3. 機能コンポーネントを作成する - Angularチュートリアル Tour of Heroes を Blazor で再実装する

# 機能コンポーネントを作成する

[作成したHeroesコンポーネント](https://qiita.com/sengoku/items/0c5a1d62a73c2c7c91dc)を、一覧部分と詳細部分に分けます。

----

# HeroDetailコンポーネントを作成する

dotnet cliで作成します。

```console
dotnet new razorcomponent --output BlazorTourOfHeroes/Shared --name HeroDetail
```


## テンプレート部分を作成する

HeroDetailコンポーネントのテンプレート部分を作成します。

```razor:Shared/HeroDetail.razor
@if (Hero != null)
{
    <h2>@Hero.Name.ToUpper() Details</h2>
    <div><span>Id: </span>@Hero.Id</div>
    <div>
    <label>Name:
        <input @bind="Hero.Name" placeholder="name"/>
    </label>
    </div>
}
```

## `[Parameter]`アノテーションをつける

外部からHeroオブジェクトを受け取るために、`[Parameter]`アノテーションをつけた`Hero`プロパティを作成します。

```razor:Shared/HeroDetail.razor
    [Parameter]
    public Hero Hero { get; set; }
```

# HeroDetailコンポーネントを表示する

Heroesコンポーネントにある詳細表示部分をHeroDetailコンポーネントに置き換えます。

## Heroコンポーネントを変更する

詳細表示部分をHeroDetailコンポーネントに置き換えます。

```razor:Shared/Heroes.razor
<HeroDetail Hero="selectedHero"></HeroDetail>
```

テンプレート全体はこのようになります。

```razor:Shared/Heroes.razor
<h2>My Heroes</h2>
<ul class="heroes">
    @foreach (var hero in heroes)
    {
        <li @onclick="@(_ => OnSelect(hero))"
            class="@(selectedHero == hero ? "selected" : "")"
            ><span class="badge">@hero.Id</span> @hero.Name
        </li>    
    }
</ul>

<HeroDetail Hero="selectedHero"></HeroDetail>
```


# なにが変わった？

一覧表示をHeroesコンポーネント、詳細表示をHeroDetailコンポーネントとして分けたことで、メンテナンス性が良くなりました。


# こんなんできました

```razor:Shared/Heroes.razor
@using BlazorTourOfHeroes.Model

<h2>My Heroes</h2>
<ul class="heroes">
    @foreach (var hero in heroes)
    {
        <li @onclick="@(_ => OnSelect(hero))"
            class="@(selectedHero == hero ? "selected" : "")"
            ><span class="badge">@hero.Id</span> @hero.Name
        </li>    
    }
</ul>

<HeroDetail Hero="selectedHero"></HeroDetail>

@code {
    private List<Hero> heroes = MockHeroes.Create();
    private Hero selectedHero = null;

    private void OnSelect(Hero hero)
    {
        selectedHero = hero;
    }
}
```

```razor:Shared/HeroDetail.razor
@using BlazorTourOfHeroes.Model

@if (Hero != null)
{
    <h2>@Hero.Name.ToUpper() Details</h2>
    <div><span>Id: </span>@Hero.Id</div>
    <div>
    <label>Name:
        <input @bind="Hero.Name" placeholder="name"/>
    </label>
    </div>
}

@code {
    [Parameter]
    public Hero Hero { get; set; }
}
```
computedPropaty(計算型プロパティ）について

# computed propaty（計算型）について


### getter

```swift
 var isHoge: String = "1"
    
    var hoge: String {
        get {
            if isHoge == "1" {
                return "1だよ"
            } else {
                return "1以外だよ"
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 値を参照しているだけなのでgetMethodが呼ばれる
        print(self.hoge)
    }
```

- プロパティを参照した場合はgetメソッドが呼ばれる
- 基本的に他のプロパティに依存する

### setter
```swift
    var isHoge: String = "1"
    
    var hoge: String {
        get {
            if isHoge == "1" {
                return "1だよ"
            } else {
                return "1以外だよ"
            }
        } set {
            isHoge = newValue + self.isHoge
            print(isHoge)
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 値を参照しているだけなのでgetMethodが呼ばれる
        print(self.hoge)
        
        // 値をセットしているのでsetMethodが呼ばれる
        self.hoge = "set入ります"
        
        // 参照しgetにお入るが上記で値をセットしなおしたのでfalseに入る
        print(self.hoge)
    }
```
**self.hoge = "set入ります"**
ここでhogeに値をセットしているタイミングでsetterに入る。
setterに入って**isHoge**の値が変更される。

再度、**print(self.hoge)**を参照するとgetterに入るが先ほど、参照したことによって値が変わっているのでfalseに入る

#まとめ
- 例えばAPIのレスポンスによって値を変えるとしたらgetterは有効
- 基本的には他のプロパティに依存するやり方が多い
- gettrのみであれば**getter**は省略できる
【MEMO】Gem の雛形を生成するワンショットコンテナ


- 参考URL
  - [Docker run リファレンス — Docker\-docs\-ja 17\.06 ドキュメント](http://docs.docker.jp/engine/reference/run.html#d)
  - [Docker run/createコマンド](http://www.tohoho-web.com/docker/docker_run.html)


# Dockerfile

```docker:./docker/Dockerfile
ARG RUBY_VERSION
FROM ruby:$RUBY_VERSION

ENV LANG C.UTF-8

ENV BASE_PACKAGES="alpine-sdk build-base tzdata" \
    FAVORITE_PACKAGE="less"
RUN apk update && \
    apk upgrade && \
    apk --update --no-cache add \
        ${BASE_PACKAGES} \
        ${FAVORITE_PACKAGE}

ARG BUNDLER_VERSION
RUN gem update --system && \
    gem install bundler:$BUNDLER_VERSION

WORKDIR /app
```


# 雛形生成

```bash
# IMAGE_TAG_NAME: 例「masayuki-0319/one_shot_container:latest」
# GEM_NAME: 例「sample_decorator」

$ docker build -t ${IMAGE_TAG_NAME} \
               --build-arg RUBY_VERSION=2.7.1-alpine3.11 \
               --build-arg BUNDLER_VERSION=2 \
               --no-cache ./docker/
  # `-t`: IMAGE_ID に名前を付与して識別を容易にする
  # `-build-age`: Dockerfile 中の変数に格納


$ docker run --rm -it -v $(pwd):/app ${IMAGE_TAG_NAME} \
             bundle gem ${GEM_NAME} --test=rspec
  # `--rm`: コンテナ起動してコマンド終了時に即削除
  # 以下の設定を聞かれるため，全て Yes で問題なし
    # `https://choosealicense.com/licenses/mit. y/(n):`: MIT ライセンスの設定有無
    # `https://bit.ly/coc-enforcement. y/(n):` Cord of Contact の設定有無
```

# 覚書: docker コマンド
```bash
# イメージ生成
$ docker build -t ${IMAGE_TAG_NAME} \
               --build-arg RUBY_VERSION=${任意の ruby image} \
               --build-arg BUNDLER_VERSION=${任意のバージョン} \
               --no-cache ./docker/

# コンテナ作成及び起動
## 作成と起動
$ docker run -d -it --name ${CONTAINER_NAME} -v $(pwd):/app ${IMAGE_TAG_NAME}
  # - `-d`: デタッチドモード ( 無いと Dockerfile の CMD が起動 )
  # - `-it`: コンテナプロセスが bash 等の標準入出力を対象とするプロセスの場合に付与し，httpd などのソケット等を対象とするプロセスの場合は不要
  # - `-v`: ホストとコンテナ間における共有ディレクトリ
## 作成のみ
$ docker create -d -it --name ${CONTAINER_NAME} -v $(pwd):/app ${IMAGE_TAG_NAME}

# コンテナにアクセス
$ docker exec -it ${CONTAINER_NAME} ash

# コンテナ停止
$ docker stop ${CONTAINER_NAME}

# コンテナを起動及び再起動
$ docker start ${CONTAINER_NAME}
$ docker restart ${CONTAINER_NAME}

# コンテナ削除と強制削除
$ docker rm ${CONTAINER_NAME}
$ docker rm -f ${CONTAINER_NAME}

# イメージ削除
$ docker rmi ${IMAGE_ID or REPOSITORY}

# その他コマンド
## 起動済みコンテナ一覧表示
$ docker ps
$ docker container ps
$ docker container ls

## アタッチモード
$ docker attach ${CONTAINER_NAME}
```
ElmでSPAを作る際にリンククリック以外でURLの遷移を発生させる

微妙にハマっていた。明日の自分も忘れそうなのでメモしておく。

```elm

-- program

main : Program () Model Msg
main =
    Browser.application
        { init = init
        , view = view
        , update = update
        , subscriptions = subscriptions
        , onUrlRequest = UrlRequested
        , onUrlChange = UrlChanged
        }


-- update


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        UrlRequested urlRequest ->
            case urlRequest of
                Browser.Internal url ->
                    ( model, Nav.pushUrl model.key (Url.toString url) )

                Browser.External href ->
                    ( model, Nav.load href )

        UrlChanged url ->
            transition model url

```

よくあるボイラープレートそのままで、こういう状態になっているとして、

```elm
view model =
    let
        currentUrl =
            model.url
    in
    { title = "Application Title"
    , body =
        [ button 
           [ onClick ({ currentUrl | path = "/blog" } |> Internal |> UrlRequested) ] 
           [ text "go blog" ]
        ]
    }
```

こうするのが一番自然だった。

`Url.Url` 意外に生成するのが面倒くさくて、`Url.fromString` が `Maybe Url` なのが気持ち悪かったのだけど、よく考えたらもともと現在の Url 値は手に入っているわけで、 `Url.Url`　はただのレコードなので `path` だけ書き換えてあげればいいでしょうっていう話題ではあった。（この記述だと fragment とか query は残るので、そこは必要に応じてリセットしたりするとよい） 

例えば、ブログのエントリへの移動を発生させようと思ったら以下のような関数を作るとよさそうである。

```elm
requestUrlBlogItem : Url.Url -> String -> Msg
requestUrlBlogItem url str =
    { url | path = "/blog/" ++ str } |> Internal |> UrlRequested
```

まだ慣れが足りない。

参考:

- https://package.elm-lang.org/packages/elm/url/latest/Url
Pythonでログ解析したい

各サーバーやプログラムのログを解析/集計する時に使用する関数の備蓄録です。
「Pythonでログを解析してみたい！」という方は是非参考にしてください！

# 1行を空白で区切る
splitを使用します。
splitの使用法は大きく分けて

- ```str.split()```の様に区切り文字を指定せず、文字列strが空白区切りにされたリストを返してもらう
- ```str.split('区切り文字')```の様に区切り文字を指定し、文字列strを指定した区切り文字で区切ったリストを返してもらう

この2つの使用法があります。
前者の```str.split()```を使用します。
ログはタブや1文字分の空白で区切られていることが多いです。
ログの中で区切り文字が統一されていれば区切り文字を指定するのも良いのですが、残念ながら、タブと1文字分の空白の両方が混同されていることもあります。
```str.split()```であればタブも1文字分の空白も同じ「空白」として区切ってくれるのです。
もちろん、カンマなどで区切られている時は、```str.split('区切り文字')```を採用します。

# カウントする
アクセス数を集計する際、

``` count.py
# カウントする関数
def count( targets):
    cnt = {}
    for target in targets:
        if target in cnt.keys():
            cnt[target] += 1
        else:
            cnt[target] = 1
    return cnt

# このリスト内の文字列の出現回数を調べたい...
targets = ['aaa','bbb','ccc','aaa','bbb','aaa']
# カウントする関数を呼び出す
result = count( targets)
# カウント結果の閲覧
for key in result.keys():
    print(key + ':' + result[key]) 
```

この様な関数を実装し、呼び出しても良いのですが、Python3系の標準パッケージに含まれているCollectionsの中にインスタンスを作成するだけでカウントしてくれる```collections.Counter```ククラスがあるので、それを使いましょう。

上に書いたcount.pyを```collections.Counter```クラスを使用して書き換えるとこうなります。

``` count.py
import collections

# このリスト内の文字列の出現回数を調べたい...
targets = ['aaa','bbb','ccc','aaa','bbb','aaa']
# カウントする関数を呼び出す
result = collections.Counter( targets)
# カウント結果の閲覧
for key in result.keys():
    print(key + ':' + result[key]) 
```

カウント結果の閲覧方法はどちらも変わりません。
であれば、カウントするだけでなく他のこともできる```collections.Counter```クラスを利用する方がお得ですね！

#
【Laravel】idごとの情報を表示する

ユーザーのマイページのような、特定のidの情報を表示する方法のメモ。

#Route
```web.php
Route::group(
    ['prefix' => 'contacts', 'middleware' => 'auth'],
    function () {
        Route::get('index', 'ContactFormController@index')->name('contacts.index');
        Route::get('create', 'ContactFormController@create')->name('contacts.create');
        Route::post('store', 'ContactFormController@store')->name('contacts.store');
        Route::get('show/{id}', 'ContactFormController@show')->name('contacts.show');
        Route::get('edit/{id}', 'ContactFormController@edit')->name('contacts.edit');
        Route::post('update/{id}', 'ContactFormController@update')->name('contacts.update');
        Route::post('destroy/{id}', 'ContactFormController@destroy')->name('contacts.destroy');
    }
);
```

#Controller
```****Controller.php
use App\Service\CheckFormData;

public function show($id)
    {
        $contact = ContactForm::find($id);
        //genderはapp/service/CheckFormData.phpを作りまとめて処理
        $gender = CheckFormData::checkGender($contact);

        return view('contacts/show', compact('contact', 'gender'));
    }
```
```CheckFormData.php
class CheckFormData
{
    public static function checkGender($data)
    {
        if ($data->gender === 0) {
            $gender = '男性';
        } elseif ($data->gender === 1) {
            $gender = '女性';
        }
        return $gender;
    }
}
```

条件分岐する必要がある場合は、Controller内で処理させてその変数をcompactの引数に入れる。

#View
```show.blade.php
<div>
    {{$contact->name}}
    {{$gender}}  //Controllerでcompactの引数にセットしているので変数がそのまま使える。
</div>
```

表示できてたらおk。

#おまけ
indexページからshowに飛ばす時のボタン。

```index.blade.php
<button onclick="location.href='{{route('*****.show',['id' => $*****->id])}}'">詳細</button>
```
EV3RT - C++テンプレート

# 概要

　EV3RTプログラムを、C++でプログラミングするテンプレートファイルです。これはクラス利用を目的としたテンプレートファイルです。
　C++ファイルを利用することで、C言語にはないクラスの概念を利用することができます。ライブラリはC言語のAPIを使用し、クラスはC++の構文を使用します。

[GitHub | EV3RT_CPP_Template](https://github.com/freezeeyes/EV3RT_CPP_Template)

## ファイル構造

```
cpp_template
  |- app.cpp
  |- app.h
  |- app.cfg
  |- Makefile.inc
  |- parameters.h
```


## プログラム(必須)

`Makefile.inc`は、自動化の設定ファイルです。

```Makefile.inc
APPL_COBJS += 

APPL_CXXOBJS +=

SRCLANG := c++

```

`APPL_COBJS`は、C言語のライブラリを指定します。
`APPL_CXXOBJS`は、C++のライブラリを指定します。


### 通常タスク

`app.cpp`は、EV3RTプログラムのメインファイルです。

```app.cpp
#include "ev3api.h"
#include "app.h"
#include "parameters.h"

void main_task(intptr_t unused) {
}

```

`app.h`は、EV3RTプログラムのヘッダーファイルです。

```app.h
#ifdef __cplusplus
extern "C" {
#endif

#include "target_test.h"

#ifndef STACK_SIZE
#define STACK_SIZE 4096
#endif

#ifndef TOPPERS_MACRO_ONLY
extern void main_task(intptr_t exinf);
#endif

#ifdef __cplusplus
}
#endif

```

`app.cfg`は、プログラムの実行単位であるタスクを生成するためのファイルです。

```app.cfg
INCLUDE("app_common.cfg");

#include "app.h"

DOMAIN(TDOM_APP) {
CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, TMIN_APP_TPRI, STACK_SIZE, NULL });
}

ATT_MOD("app.o");

```

### 周期タスク

追加予定


## プログラム(任意)

`parameters.h`は、EV3RTのパラメータをマクロ定義したヘッダーファイルです。

```parameters.h
//  ポート設定
#ifndef PORT_PARAMETERS_H
//  TODO: モータのポートを指定する
#define tail_motor EV3_PORT_A
#define right_motor EV3_PORT_B
#define left_motor EV3_PORT_C
//  TODO: センサのポートを指定する
#define touch_sensor EV3_PORT_1
#define sonic_sensor EV3_PORT_2
#define color_sensor EV3_PORT_3
#define gyro_sensor EV3_PORT_4
#endif

```
銘柄のVolatilityの計算方法

#1 目的
ある銘柄について、一定期間のVolatilityを計算する。


#2 内容
#2-1 Volatilityの計算式
ある株式銘柄の価格について、任意の日の銘柄価格を$S_{i}$とするとき、前日との変化率$c_{i}$を下記のとおり定義する。

```math
c_{i} = \biggl({\frac{S_i}{S_{i-1}}} \biggl)
```

このとき開始日からn営業日後までの株式銘柄のVolatilityを下記数式で定義する。


```math
vol_{n} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} {(c_{i}-\bar{c})}^{2}} ×\sqrt{256}
```
Volatility(年率換算)は、標準偏差×$\sqrt{256}$で算出されます。$\sqrt{256}$を乗算する理由は、年率換算(日にちベース)を行うためです。週ベースで年率換算を行う場合は$\sqrt{52}$を乗算します。

#2-2 Volatilityを計算するソースコード例

```python:test.py
#volatirityを計算する関数。
def volatility(DF):
    df = DF.copy()
    df["daily_ret"] = DF["Close"].pct_change()
    vol = df["daily_ret"].std() * np.sqrt(256)
    return vol
```
管理者権限がないwindowsアカウントでUS配列のキーボードを使う方法（win10）

# US配列のキーボードを使いたい
私の会社ではwindows10が使われており、キーボードはJIS配列で、配布されたノートPCのキーボードもJIS配列です。一方就職するまでの二年ほど私はUS配列のキーボードを使ってきました。そのためJIS配列のキーボードは使いづらく感じます。ブラインドタッチが厳しいです。JIS配列に慣れるという選択肢もないわけではないですが、世界的に見ればUS配列の方が多く使われているでしょうから将来のことも考えると得策とは思えません（どっちも使いこなす器用さはありません）。

# 管理者権限がないとキーボードレイアウトを変更できないらしい
ググるとwin10でUS配列キーボードを使う方法はすぐに出てきますが、管理者権限がないとできないっぽいです。

# 管理者権限なしでUS配列キーボードを使う方法
設定　→　時刻と言語　→　言語　→　言語を追加する
で`English (United States)`を選択して追加するとEnglishモード時はキーボードをUS配列で使うことができました！
言語の切り替えは`alt+shift`でできました。
ただしEnglishモード時は日本語を打てません。まあJIS配列とUS配列で配置が異なってるのは主に記号で、記号をたくさん使うのは主にコーディング時で、コーディングでは日本語をそんな打たないので問題ないでしょう。
Bootstrapで row-col- などが効かない時

公式の[公式ドキュメント](https://getbootstrap.com/docs/4.5/layout/grid/)の通りに記載しても一部のCSSしか適用されないときは、バージョンが最新か疑うべし。

`row-col-3`のような記述は v4.3.1 では効かなかったので v4.5.0 にしたらあっさり効いたよ。
もうわけからないぃぃ

webpackとかふつうに使っていると
一つのファイルにしてくれるけど
ローカルでの挙動とサーバーでの挙動が激的に変化するときがあって
そのときは、もう手におえない状態になるのだ。。

なにせ、まとめたファイル(ここでは/dist/bundle.jsとでもしとこう)を
解析しようにも、そもそもごったまぜのスープになっており
どこのパッケージのどこのバージョンが。。とか基本は、省かれてる。

なんとなくならわかるけど、じゃあどう対処するんだよーｗってなる。。

そもそも、webpackとかって、いままで、ふつうにルートディレクトリーに
htmlファイルを置いとけば、ぜったい404とかでないのだが、
webpackの場合は、そうゆう形式でもないし。
基本react系ので、routerとかで、振り分けているのだし。。

で、それっぽいキーワードで、ググっても、的を得ない回答しかでてこないしｗ

firebase系のjsもimportしてるのだが、最近はそれを疑っているありさま。ｗ

もうここまでくるとカルト宗教化してるぜ
テストについて

Ruby on Railsの開発においてのプログラムは想定していなかった動きを
見つけるためのテストについて簡潔にまとめたので
こちらでご紹介。

# RSpecを使う
Rubyを元に作成されたテストに特化した言語。
「rspec-rails」をGemfileに追加すると使える。

# テストの種類
主に単体テストと統合テストという2種類に分類される。

## 単体テスト
１個のプログラムとしてのまとまりが正常に動くか確認するもの。
モデル1つずつ。やコントローラー1つそれぞれにテストする感じ。

## 統合テスト
複数のプログラムを組み合わせた処理が意図した通りに動くか確認するもの。
登録機能の場合、DBに保存されるところまでをテストします。
Django メモ

[https://docs.docker.com/compose/django](https://docs.docker.com/compose/django)を参考にDocker環境を構築する。途中で`composeexample/settings.py`を編集する箇所があるので、予め`settings.py`をカレントディレクトリに置いておくと良い。

```{run.sh}
docker ps -a | grep django | awk '{print $1}' | xargs docker stop
docker ps -a | grep django | awk '{print $1}' | xargs docker rm

rm -rf composeexample manage.py

docker-compose run web django-admin startproject composeexample .
cp settings.py composeexample
docker-compose up -d
open http://localhost:8000
```

Djang起動後の各アプリの作成方法は、[最速Djangoアプリの作り方 - Youtube](https://www.youtube.com/watch?v=XDYyb1PdRCk)を参照。
【Laravel基礎】DBにデータを保存・保存内容を表示

LaravelでDBにデータを保存する方法と、保存した内容を表示する方法のメモ。

#前提
resourceでControllerを作っています。

####注意
コード部分の「****」「＆＆＆＆」みたいなのは代替文字です。

#DBに保存
Controller,Route,Viewのそれぞれに書いていきます。

##Route
```web.php
Route::group(
    ['prefix' => 'contacts', 'middleware' => 'auth'],
    function () {
        Route::get('index', 'ContactFormController@index')->name('contacts.index');
        Route::get('create', 'ContactFormController@create')->name('contacts.create');
        Route::post('store', 'ContactFormController@store')->name('contacts.store');
        Route::get('show/{id}', 'ContactFormController@show')->name('contacts.show');
        Route::get('edit/{id}', 'ContactFormController@edit')->name('contacts.edit');
        Route::post('update/{id}', 'ContactFormController@update')->name('contacts.update');
        Route::post('destroy/{id}', 'ContactFormController@destroy')->name('contacts.destroy');
    }
);
```
postでviewで入力されたパラメータを受け取る。

##View
```create.blade.php
<form method="POST" action="{{route('contacts.store')}}">
    @csrf
    <input class="input-group" type="text" name="name" placeholder="Name">
    <input class="input-group" type="text" name="email" placeholder="Mail">
    男性：<input type="radio" name="gender" value="0">
    女性：<input type="radio" name="gender" value="1">
    <input class="input-group" type="text" name="title" placeholder="Title">
    <textarea class="input-group" name="contact" placeholder="Contact"></textarea>
    <input class="btn btn-primary" type="submit" value="Submit">
</form>
```
methodをpostに設定してパラメータをstoreに送信する。

##Controller
```ContactFormController.php

use App\Models\ContactForm;

public function store(Request $request)
    {
        //上記でModelを呼び出し
        //インスタンス化
        $contact = new ContactForm;

        $contact->name = $request->input('name');
        $contact->email = $request->input('email');
        $contact->title = $request->input('title');
        $contact->gender = $request->input('gender');
        $contact->contact = $request->input('contact');

        $contact->save();

        return redirect('contacts/index');  //indexページにリダイレクト
    }
```
Modelファイルを利用して送られてきたパラメータをDBに保存します。

保存できてるかどうか一度DBで確認してください。
できてたらおk。

#Viewに表示
Controller,Viewのそれぞれに書いていきます。

##Controller
```ContactFormController.php
use Illuminate\Support\Facades\DB;  //クエリビルダを利用

public function index()
    {
        // クエリビルダ
        $contacts = DB::table('contact_forms')
            ->select('id', 'name')
            ->get();

        // compactでindexに$contactsを表示する
        return view('contacts/index', compact('contacts'));
    }
```
必要なデータだけ欲しい時はクエリビルダを使った方が処理速度が遅くならなくて済む。

##View
```index.blade.php
@foreach($contacts as $contact)
    <div>{{$contact->id}}</div>
    <div>{{$contact->name}}</div>
    <button onclick="location.href='{{route('contacts.show',['id' => $contact->id])}}'"
            type="button"
            class="btn btn-info">
        詳細
    </button>
@endforeach
```
データをforeachで回してあげる。
カラム名を指定して必要な情報を表示する。

Viewで表示できてるのが確認できたらおk。

#まとめ
基本的にはController,View,Routeをいじればできます。

本当に基礎の基礎なので多分もっと良い書き方とか他にあるかと思いますが、基礎学習中の人間のメモなのでご容赦を。
windowsでiverilog その36

#概要

windowsでiverilogやってみた。
oneshot書いてみる。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3100b816-9e60-fcba-e04a-c460ee58fbf5.png)



#サンプルコード


```


module oneshot(input clk, input rst, input in, output reg out);
	reg prev = 0;
	always @(posedge clk)
	begin
		if (in ^ prev)
			out <= in;
		else
			out <= 0;
		prev <= in;
	end
endmodule

module test;
	reg clk,
		in;
	oneshot u(.clk(clk), .in(in), .out(out));
	initial
	begin
		clk = 0;
		in = 0;
		#2
			in = 1;
		#6
			in = 0;
		#2
			in = 1;
		#6
			in = 0;
		#20
			$finish;
	end
	always
	begin
		#1
			clk = ~clk;
	end
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, u);
	end
endmodule




```


以上。
「Cannot extend an interface 'NodeJS.EventEmitter'.…」の解決方法メモ(vue-cli4+TypeScript+Electron)

# はじめに
vue-cli 4とElectronでデスクトップアプリケーションを開発しようとした際に、@types/nodeのEventEmitterに関するエラーが発生した。無事解決できたのでメモとしてまとめる。

# 環境・バージョン
Vue：2.6.11
Vue CLI：4.4.6
@types/node：(14.0.14)→12.6.9(本記事の解決策)
Electron：9.0.0

# 発生した事象
["vue-cli3 + TypeScript + Electronでアプリを開発する"](https://qiita.com/paragaki/items/e7d3a43b50233af96424)を参考に(ほぼコマンドや設定そのままで設定)プロジェクトを作成すると、最後のアプリケーションビルドの段階で以下のようなエラーが発生した。

```
$ npm run electron:build
~~~省略~~~
ERROR  Failed to compile with 19 errors
~~~省略~~~
ERROR in C:(作業ディレクトリ)/node_modules/electron/electron.d.ts(1659,31):
1659:31 Cannot extend an interface 'NodeJS.EventEmitter'. Did you mean 'implements'?
    1657 |   }
    1658 | 
  > 1659 |   class BrowserWindow extends NodeJS.EventEmitter {
         |                               ^
    1660 | 
    1661 |     // Docs: http://electronjs.org/docs/api/browser-window
    1662 | 
~~~省略~~~
```

どうやらinterfaceは継承できないと怒られているらしい。

# 調査・解決
ググってみると同じ内容のエラーに関するissueがGithubに立てられていた。
[electron.d.ts does not work with @types/node v13.1.0 · Issue #21612 · electron/electron · GitHub](https://github.com/electron/electron/issues/21612)
どうやら@types/nodeの12系→13系のバージョンアップの際に、EventEmitterがclassからinterfaceに変更されたことが原因らしい。

ということで、12系の@types/nodeをインストールする。

```
$ npm install -S @types/node@12.6.9
```

そして、もう一度ビルドを試す。

```
$ npm run electron:build
~~~省略~~~
DONE  Build complete!
```

できた！ビルドしたアプリもちゃんと開ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206537/4ecde745-9056-d00a-4afd-68d676c224b1.png)

# 備考
現時点でpackage-lock.jsonを見てみると、Electronの@types/nodeの要求バージョンは12.0.12となっているので、そちらのバージョンを入れたほうが安心かもしれない。
ユーティリティバーからAuraコンポーネントを 呼び出そうとして困ったこと

#はじめに
レコードページからユーティリティバーのボタンを押し、
そのレコードに関連するレコード一覧をAuraコンポーネントを介して
表示させようとしたときに困ったことがあったのでまとめてみました。

#1 initイベントでレコードIDを取得できない

レコードIDを取得する方法は通常、
以下の方法で行うと思います。

```test.cmp
<aura:component implements="force:hasRecordId,force:lightningQuickAction,flexipage:availableForAllPageTypes" >
<aura:handler name="init" action="{!c.doInit}" value="{!this}"/>

</aura:component>
```

```testController.js
({
	doInit: function(component, helper, event){
	        var recordId = component.get("v.recordId"); 
	        alert("initで:" + recordId); 
	}
})
```



しかし、ユーティリティバーからAuraコンポーネントを呼び出した場合、
initメソッド内でcomponent.get("v.recordId")を使用しても
レコードIDを取得できません。
<img width="281" alt="aura1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218192/011a27ba-4f36-393b-2d32-36c19222ff58.png">
しかし、cmp側で{!v.recordId}を指定するとちゃんとレコードIDが表示されるのです。

```test.cmp
<p>The current recordId is {!v.recordId}.</p>			// 表示される
<ui:outputText aura:id="recId" value="{!v.recordId}"/>	// こっちも表示される
```

どちらもレコードIDが画面上に表示されます。
<img width="336" alt="aura3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218192/cb230997-c6c3-0b36-3be5-a4d185e40798.png">

ならばとoutputTextにIdを設定してfindメソッド使えば取れるんじゃないかと試しました。

```testController.js
var recordId = component.find('recId').get("v.value");
alert("findで":recordId);
```

しかしこちらも不発。
<img width="248" alt="aura2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218192/fcb3d611-86dc-1d17-38c1-88039e3e8692.png">

さてどうしたものか、とさらにググってみると…

#2 解決方法
公式ドキュメントで解決方法が記載されていました。
ユーティリティバー API でのページコンテキストの使用:
https://developer.salesforce.com/docs/atlas.ja-jp.api_console.meta/api_console/sforce_api_console_js_lightning_utility_bar_page_context.htm

ドキュメントによれば、initイベントを使用するのでなく
changeイベントを使用するとよいとのこと。
試してみます。

```test.cmp
<aura:component implements="force:hasRecordId,force:lightningQuickAction,flexipage:availableForAllPageTypes" >
<aura:handler name="change" value="{!v.recordId}" action="{!c.onRecordIdChange}"/>

</aura:componnt>
```
```testController.js
({ 
    onRecordIdChange : function(component, event, helper) {
        var recordId = component.get("v.recordId");
        alert("onchangeで:" + recordId);
    }
})
```
無事取得できました。
<img width="247" alt="aura4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218192/d23652f5-62c1-a3c8-3e2e-d8043e12e3e4.png">

#3 Auraコンポーネントで呼びだしたフローをリセットできない
※こちらはまだ未解決の問題です。

取得したレコードIDを使ってさらにフローで処理できないか相談を受けたので
調査しました。
結論から言えば、flowに取得したIDをフロー渡して処理を行えます。
詳しくはこちら：https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/components_using_flow.htm

ただひとつ問題が。
**別のレコードページに移動しても、最初にユーティリティバーで起動した
レコードIDを使ったままなのです。**
changeイベントを使用しているので、見るレコードが変わるたびにイベントを呼び、実際にレコードIDも新しいものを取得できているのにも関わらずにです。

以下のことを試してみましたがフローの内容がリセットされませんでした。

- cmp側でforce:refleshViewイベントを宣言してみる
- コントローラで$A.get('e.force:refreshView').fire()を行う

こちらについては引き続き調べてみたいと思います。
【MySQL】連番挿入を楽にする【AUTO_INCREMENT】の連番状態をリセット（初期化）する方法

ここにズレた連番があるじゃろ？
( ＾ω＾)
⊃NOT連番⊂

```
mysql> select * from shops;
+----------+-----------------------+---------+
| shops_id | shops_name            | parking |
+----------+-----------------------+---------+
|      001 | pizzeria SERICO       | Y       |
|      002 | JAKSON CURRY & COFFEE | N       |
|      004 | Le•ciel               | Y       |
+----------+-----------------------+---------+
```
これをこうして…
( ＾ω＾)
≡⊃⊂≡

```
/* 番号にズレがある箇所のレコードを消去 */
mysql> delete from shops where shops_id = 4;

/* AUTO_INCREMENTの状態リセット(初期化) */
mysql> ALTER TABLE shops AUTO_INCREMENT = 2;

/* 改めてレコード追加 */
mysql> INSERT INTO shops(shops_name, parking)
    -> VALUES ('Le•ciel', 'Y');
```
こうじゃ
( ＾ω＾)
⊃YES連番⊂

```
mysql> select * from shops;
+----------+-----------------------+---------+
| shops_id | shops_name            | parking |
+----------+-----------------------+---------+
|      001 | pizzeria SERICO       | Y       |
|      002 | JAKSON CURRY & COFFEE | N       |
|      003 | Le•ciel               | Y       |
+----------+-----------------------+---------+
```

<h2>連番のズレが発生した経緯</h2>
```
/* shops_id'003'にINSERTするべきデータを間違えた */
mysql> INSERT INTO shops(shops_name, parking)
    -> VALUES ('Cafe Flore', 'N');

mysql> select * from shops; 
+----------+-----------------------+---------+
| shops_id | shops_name            | parking |
+----------+-----------------------+---------+
|      001 | pizzeria SERICO       | Y       |
|      002 | JAKSON CURRY & COFFEE | N       |
|      003 | Cafe Flore            | N       |
+----------+-----------------------+---------+

/* 削除して */
mysql> delete from shops
    -> where shops_id = 3;

/* 再度正しいデータをINSERT */
mysql> INSERT INTO shops(shops_name, parking)
    -> VALUES ('Le•ciel', 'Y');

/* 番号がズレてることに気づく */
mysql> select * from shops;
+----------+-----------------------+---------+
| shops_id | shops_name            | parking |
+----------+-----------------------+---------+
|      001 | pizzeria SERICO       | Y       |
|      002 | JAKSON CURRY & COFFEE | N       |
|      004 | Le•ciel               | Y       |
+----------+-----------------------+---------+
```
<h2>補足</h2>
今回のように一度挿入したレコードを削除してもAUTO_INCREMENTの値は増えます。
<b>例えエラーでレコードが挿入できなくても、AUTO_INCREMENTの値は挿入しようとしたレコードの分だけ増え続けます。</b>そして、次にレコードを挿入した時には欠番が発生することになります。

AUTO_INCREMENTはALTER TABLE文で定義を変えられることを知っていれば問題ないです。

```
mysql> ALTER TABLE 'TABLE名' AUTO_INCREMENT = 1;
```


・参考
MySQLのAUTO_INCREMENTについて色々と調べてみた。
https://qiita.com/sakuraya/items/0dd0bb4114e56f42556d