OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel　factoryを使ってテストデータを流し込む

開発において必須のテストデータの流し込みの備忘録です。。。
※データベース、モデル、マイグレーション完了時からのお話です。


##Factoryを作る

`php artisan make:factory [モデル名]Factory`

例）
`php artisan make:factory RecipeFactory`
　　　　　　　　　　　　　　　　↑クラス名は大文字注意


```
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        //
    ];
});
```
こういうのができます。

//のところに入れたいデータを書き込んでいきましょう

```
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Recipe;    ←ここ要書き換え！！
use Faker\Generator as Faker;

$factory->define(Recipe::class, function (Faker $faker) {
    return [　　　　↑ここも要書き換え！！

        'user_id' => $faker->numberBetween($min = 1, $max = 10),
        'name' => $faker->realText($maxNbChars = 10, $indexSize = 1),
        'liqueur' => $faker->numberBetween($min = 1, $max = 10),
        'time' => $faker->numberBetween($min = 1, $max = 10),
        'invention' => $faker->numberBetween($min = 1, $max = 10),
    ];
});
```
ここで気を付けたいのは
use App\Model;
を書き換えること！
矢印で示しておきました。

ここでモデルを指定してあげないと
``InvalidArgumentException  : Unable to locate factory with name [default] [App\Recipe].``

てな感じでエラーが出ちゃいます(＞＜)



##Seederを作る

``$php artisan make:seeder [ファイル名]``

例）
``php artisan make:seeder RecipesTableSeeder``

こんな感じ
デフォルトで入っているUsersTableSeederを参考にしてみてください。

```
<?php

use Illuminate\Database\Seeder;

class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}
```

中身はこんな感じ

function run()の中に、Factoryでダミーデータ何個作るかを記述する。

```
<?php

use Illuminate\Database\Seeder;

class RecipesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(\App\Recipe::class, 10)->create();  
    }
}
```

これで10個データができます


最後に、、、

##DatabaseSeeder.phpの更新

```
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);　　←元から入ってるよ
        $this->call(RecipesTableSeeder::class);　←こいつを追加
    }
}
```

ラスト
``$php artisan db:seed``　で実行

あれなんかおかしいよって人は

``composer dump-autoload``

試してみてください。
Swiftの実機テストする際に出たエラーの解決法

###はじめに
いつもはSimulatorを使ってテストをしているのですが、自分のiPhoneでも試してみたいと思い、実機テストをやってみました。思っていたより梃子摺ったので遭遇したエラーの解決方法をまとめてみました。


###「Signing for "アプリ名" requires a development team.」というエラーが出た場合
Signing & CapabilitiesでTeamを設定する。Apple IDでログインするとTeamという項目で自分のアカウントを選択できるようになるのでそこから設定する。
<img width="889" alt="スクリーンショット 2020-08-01 20.39.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501835/4335fcb2-9ba8-03d1-e014-e7e8e8e43cc1.png">



### 「Could not locate device support files.」というエラーが出た場合
https://github.com/filsv/iPhoneOSDeviceSupport
こちらのサイトから自分のiPhoneのiOSにあったファイルをダウンロードする。
Finderでcommand + shift + gを押すと、パスを指定して移動できるので、下のパスをコピペする。

```
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
```

開いたフォルダに先程Githubからダウンロードしたフォルダを移動させて、Xcodeを再起動する。
（もし13.5.1のようにバージョンが細かい場合は、Githubからダウンロードした13.5のファイル名を13.5.1のように変更すれば良い。）



###「Untrusted Developer」というエラーが出た場合

iPhoneで設定→General→Profile & Device Managementに移動すると、Developer Appという項目があるので、そこにある自分のアプリ名をクリックし、「＜アプリ名＞を信頼する」で「信頼」というボタンを押せば、自分のiPhoneで自作したアプリにアクセスできるようになります。


参考にしたサイト
https://qiita.com/solabito331/items/17ee51d954fb3f87b37c
https://cpoint-lab.co.jp/article/201906/10350/
https://qiita.com/segur/items/bef54efa7764885173bb
Azure Face API で写真から感情判定

https://www.pc-koubou.jp/magazine/27499
を参考にFace APIのキーとエンドポイントを取得

#cognitive_faceのインストール
```
pip install cognitive_face
```

#まずはmacで試してみる
```py
import cognitive_face as CF
import json

KEY = 'XXXXXXXXXX'
ENDPOINT = 'XXXXXXXXXXXXXXXXXXXX(エンドポイント)/face/v1.0'

CF.Key.set(KEY)
CF.BaseUrl.set(ENDPOINT)

img = "XXXXX.jpeg"
faces = CF.face.detect(img, attributes='emotion')
f=json.dumps(faces)
j=json.loads(f)

print(len(j))
for i in range(0,len(j)):
    print(j[i]['faceAttributes']['emotion'])
```


#RaspberryPiで実装
ラズパイのカメラモジュールを使っています。定期的に写真を撮影し、感情を把握

```py
import cognitive_face as CF
import json
import picamera
import time
import cv2 as cv

KEY = 'XXXXXXXXXX'
ENDPOINT = 'XXXXXXXXXXXXXXXXXXXX(エンドポイント)/face/v1.0'

CF.Key.set(KEY)
CF.BaseUrl.set(ENDPOINT)

while True:
    with picamera.PiCamera() as camera:
        camera.resolution = (512,384)
        camera.capture('test.jpg')
        print('capture')
        img = cv.imread('test.jpg')
        grayimg = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        img = "test.jpg"
        faces = CF.face.detect(img, attributes='emotion')
        f=json.dumps(faces)
        j=json.loads(f)

        for i in range(0,len(j)):
            print(j[i]['faceAttributes']['emotion'])
            
        time.sleep(10)
```
初めてのPython　スクスタのMVを連続再生させる

# 初めてのPython
これまでPCの自動化作業には専らUWSCを使ってたため、興味はあれど中々学習の機会がなかったPythonですが、UWSCの現状もありどこかで始めないとと思っていたところ、先日始めたスクスタ（ラブライブの音ソシャゲー）のおかげで同ゲームのMVを自動再生したいという動機が生まれたのでこの機会にPythonを始めてみました。

内容の都合上、ほぼNoxやBluestacksといったAndroidエミュを使ったソシャゲの自動化マクロの話になります。
#環境
Windows10 64bit
Python3.8 64bit
Bluestacks4

AndroidエミュはNoxと迷ったのですが、Noxはリップシンクが10フレほどズレるのでBluestacksを利用しました。
##pyautoguiのインストール
~~~powershell
pip install pyautogui
~~~

Pythonでの自動化には外せないらしい。
##設計
動作はシンプルに下の画面でMVボタンを押し、
![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666328/dc34c932-fe39-c0db-c9ea-cae2069bacbc.jpeg)
画面が遷移した先で再生ボタンを押す。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666328/908f39be-2dbb-8f5d-a268-734683988d46.jpeg)
あとは曲が終わり、また画像1のMVボタンが表示されるまでループさせる。
##コード
定数宣言部

~~~python:pydef.py
MAIN_PATH=".\\MVPlay\\"
FILE_TYPE="*.png"
X:int=0
Y:int=1
~~~
メインコード

~~~python:main.py
# coding:utf-8
import pyautogui
import glob
import time
from pydef import*

def counterModeSerial(i:int,maxcount:int):
    if i>=maxcount:
        return 0
    else:
        return i+1

def main(files:list,loopmode:int,waittime:int):
    i:int=0

    while True:
        loc=pyautogui.locateCenterOnScreen(files[i])
        if not(loc==None):
            time.sleep(waittime)
            pyautogui.click(loc[X],loc[Y])
            i=counterModeSerial(i,len(files)-1)
        time.sleep(waittime)

flist=glob.glob(MAIN_PATH+FILE_TYPE)
main(flist,0,0.5)
~~~
タップさせたいコンポーネントの画像をトリミングしてフォルダに突っ込めばシーケンシャルに実行されるように。
今回のケースではMVとか再生のボタンの画像になります。
MVPlayフォルダを作って中にpngファイルを置けばファイル名でソートされる順番で「認識→タップ→次のファイル→認識...最後の画像を認識したら最初に戻る」を繰り返します。
終了処理を入れてないのでデバッガで起動した場合以外はタスクマネージャーからプロセスをkillする必要があります。

フォルダに画像を突っ込めば画像認識とクリックそして次の状態への遷移をやってくれるので、このままでも2Dソシャゲの周回程度なら十分対応できそうですね。
#雑感
参照や変数宣言を除けばほぼ10行ほどのコードで動くのは流石だと思いました、簡易でパワフルだと言われるだけのことはあると思います。
locateOnScreen関数がマルチディスプレイに対応しておらず、プライマリディスプレイしかチェックしてくれない（作業モニタをセカンダリに入れ替えてなんとかしましたが）画像認識が遅い等の不満点もちらほら見られましたが、総じて使いやすかったです。
ただインデントで入れ子を表現するのだけは少し怖いと思うのはおっさんだからですかね、きれいなインデントが強制されるので可読性が上がると言う利点もあるのでしょうか。

#最後に
取り敢えずの目標は達成されましたが、これだと一曲のみのループしかできない上、ボタン押下時にマウスカーソルとアクティブウィンドウが持って行かれるので、ADB経由でコマンドを送信する等そこら辺も改良していきたいと思います。
深層学習Day3_学習レポート

<h1>1.再帰型ニューラルネットワークの概念</h1>

・RNN(Recurrent Neural Network)
　　時系列データに対応可能な、ニューラルネットワーク

　時系列データとは？
　　時間的順序を追って一定間隔ごとに観察され，
　　相互に統計的依存関係が認められるようなデータの系列

　具体例
　　音声データ
　　テキストデータ

　RNNの特徴
　　時系列モデルを扱うには、初期の状態と過去の時間t-1の状態を保持し、
　　そこから次の時間でのtを再帰的に求める再帰構造が必要になる。

・BPTT
　　RNNにおいてのパラメータ調整方法の一種(誤差逆伝播の一種)

　誤差逆伝搬の復習
　　誤差逆伝搬とは計算結果(=誤差)から微分を逆算することで、
　　不要な再帰的計算を避けて微分を算出する手法である。

・RNNの課題
　　時系列を遡れば遡るほど、勾配が消失していく。
　　→ 長い時系列の学習が困難。

　解決策
　　勾配消失の解決方法とは別で、構造自体を変えて解決したものがLSTM。

・勾配消失問題
　　誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。

・勾配爆発
　　層を逆伝播するごとに勾配が、指数関数的に大きくなっていく

■演習
・simple RNN(初期値)
<img width="895" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/ab45a096-f408-2732-6b33-5ef9340a0a44.png">

・simple RNN(weight_init_stdやlearning_rate, hidden_layer_sizeを変更)
<img width="895" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/ee5a237b-d6a8-ed67-c748-e9e6d4c24b6c.png">

・simple RNN(重みの初期化方法を変更)
<img width="895" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/03a75539-e404-9987-6f29-53d5250b504d.png">

・中間層の活性化関数をReLUに変更
<img width="895" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632017/029d5970-857b-bd70-e6a0-bfa2e393cbfa.png">


<h1>2.LSTM</h1>

・CEC(Constant Error Carousel)
　　勾配消失および勾配爆発の解決方法として、勾配を1にすることで解決する。

　課題
　　入力データについて、時間依存度に関係なく重みが一律になってしまう。
　　→ニューラルネットワークの学習特性が無いということ。

・入力・出力ゲートの役割
　　それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能にする。

・LSTMブロックの課題(忘却ゲート)

　LSTMの現状
　　CECは、過去の情報が全て保管されている。

　課題
　　過去の情報が要らなくなった場合、削除することはできず、保管され続ける。

　解決策
　　過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能が必要。
　　→忘却ゲートが登場する。

・覗き穴結合
　課題
　　CECの保存されている過去の情報を、任意のタイミングで他のノードに伝播させたり、
　　あるいは任意のタイミングで忘却させたい。
　　但し、CEC自身の値は、ゲート制御に影響を与えていない。

　覗き穴結合とは
　　CEC自身の値に、重み行列を介して伝播可能にした構造。


<h1>3.GRU</h1>

・GRU
　　従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。
　　GRUでは、パラメータを大幅に削減し、精度は同等またはそれ以上が望める様になった。
　　→その結果、計算負荷を削減できるようになった。

<h1>4.双方向RNN</h1>

・双方向RNN
　　過去の情報だけでなく未来の情報を加味することで、精度を向上させるためのモデル

　実用例
　　文章の推敲や、機械翻訳等


<h1>5.Seq2seq</h1>
・Seq2seq
　　Encoder-Decoderモデルの一種

　用途
　　機械対話や、機械翻訳など

・Encoder RNN
　　ユーザーがインプットしたテキストデータを、単語等のトークンに区切って渡す構造。

・Decoder RNN
　　システムがアウトプットデータを、単語等のトークンごとに生成する構造。

・HRED
　　過去n-1 個の発話から次の発話を生成する。
　　→Seq2seqでは会話の文脈無視で応答がなされたが、
　　　HREDでは前の単語の流れに即して応答されるためより人間らしい文章が生成される。

　課題
　　RED は確率的な多様性が字面にしかなく、会話の「流れ」のような多様性が無い。

・VHRED
　　HREDの課題を、VAEの潜在変数の概念を追加することで解決した構造。

・オートエンコーダ
　　教師なし学習の一つ。
　
　オートエンコーダ具体例
　　MNISTの場合、28x28の数字の画像を入れて同じ画像を出力する。

・VAE
　　通常のオートエンコーダーの場合、何かしら潜在変数zにデータを押し込めているものの、
　　その構造がどのような状態かわからない。
　　VAEはこの潜在変数zに確率分布z∼N(0,1)を仮定したもの。


<h1>6.word2vec</h1>

・word2vec
　　RNNでは、単語のような可変長の文字列をNNに与えることはできない。
　　固定長形式で単語　を表す必要がある。
　　→word2vecでは学習データからボキャブラリを作成する。

　メリット
　　大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能にした。

<h1>7.Attention Mechanism</h1>

・Attention Mechanism
　　「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み。
Gitで複数アカウントを使い分ける時のリモート接続設定メモ

[[備忘] 複数Githubアカウントでssh接続設定(config)を使い分ける手順](https://qiita.com/yampy/items/24638156abd383e08758)
git pushする前にアカウント切り替えたい時どうやるんだっけ…？となり、こちらの方の記事を自分用にアレンジした時のメモです。
上記の方が丁寧なので、基本は上記を読んだ方がよいと思います。

# 事前準備

以下は準備済みの前提で進めます。この記事では説明を省略しています。

- gitリポジトリ
- GitHubなどのアカウント (必要な数だけ)
- ssh鍵の生成およびGitHub等への登録 (必要な数だけ)
- globalのgit設定全般


# ssh設定

今回は、メインのアカウントは(コマンドコピペ時などにそのまま使えるように）通常通り Host: `github.com` とし、サブのアカウントを使うときは Host 末尾に `.sub` と加えることで使い分けるようにします。

```:~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/id_rsa_main
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github.com.sub
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_sub
  TCPKeepAlive yes
  IdentitiesOnly yes
```


# 接続確認

```bash
$ ssh -T git@github.com
$ ssh -T git@github.com.sub
```

設定がうまくできていれば、それぞれのレスポンスでアカウント名部分が変わるはずです。

```
Hi {your-account}! You've successfully authenticated, but GitHub does not provide shell access.
```


# git設定 (subのアカウントの例のみ)

## リポジトリ内のアカウント設定

サブのアカウントに切り替えたいリポジトリ配下で以下を実行。最初のcommitをする前にやっておきたい。

```bash
git config --local user.name {sub-account}
git config --local user.email {sub-email}
```

## リモートリポジトリURLの登録

```bash
$ git remote add origin git@github.com.sub:{your-sub-account}/{repository-name}.git
```

既に `remote.origin.url` に何かしらが入っていると `fatal: remote origin already exists.` と怒られてできないので、その場合は以下コマンドのように `add` ではなく `set-url` とする。


```bash
$ git remote set-url origin git@github.com.sub:{your-sub-account}/{repository-name}.git
```

## 確認

```bash
$ git config remote.origin.url
git@github.com.sub:{your-sub-account}/{repository-name}.git
```

ホスト名部分が `github.com.sub` など、.ssh/config の Host 部分に書いた値と同じにできていればOK。

これで複数アカウントでのcloneやpushが快適にできるようになりました！
photoshop でPNGファイルを開こうとするとNot a PNG fileで開けない。


##環境

・ソフトウェア環境

| 項目              |       情報        | 
|------------------|-------------------|
| photoshop        | 21.2.1            |      

・ハードウェア環境

| 項目              |       情報        | 
|------------------|-------------------|
| OS            | macOS Catalina (10.15.4)|      
| ハードウェア          |MacBook Air (Retina, 13-inch, 2020) |       
| プロセッサ             |1.1 GHz デュアルコアIntel Core i3 |       
| メモリ               |8 GB 3733 MHz LPDDR4|        |
| グラフィックス|Intel Iris Plus Graphics 1536 MB|  


##概要
iconfinderでダウンロードした
PNGファイルをphotoshop でドラッグアンドドロップで開こうとすると下記エラー発生。


![スクリーンショット 2020-08-01 20.20.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680350/371feae4-45fa-2ff4-b137-be38ad81b81b.jpeg)

##対処方法
128pxでダウンロードすると問題なく開けます。256pxはNGです。

<img width="477" alt="スクリーンショット 2020-08-01 20.23.59.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680350/8516e13e-9bff-a094-9b1f-52a7d9e03c7c.jpeg">
[JavaScript]Array.mapとparseIntの組み合わせの落とし穴

どうも、えいやです。

JavaScriptのよくある落とし穴の話をします。

例えば、`'01:24'`のような時刻表示について、時間と分を`int`で取ろうと以下のようなコードを書いたとします。

```js:fig.1.1
'01:24'.split(':').map(parseInt)
```

実はこれは正常に動きません。結果は以下となります。

```js:fig.1.2
> '01:24'.split(':').map(parseInt)
[ 1, NaN ]
```

試しに`:`区切りとなっている文字列で与えられている数値の数を増やすと、以下のようになります。

```bash:fig.2
% node -v && node
v12.16.3
> '01:02:03:04:05:06'.split(':').map(parseInt)
[ 1, NaN, 0, 0, 0, 0 ]
```

さて、何が起きているのか正確にわかりますか？

とりあえず意図通りに動かすには、mapが引数として取る関数に引数を与えて、

```js:fig.3
> '01:02:03:04:05:06'.split(':').map(n=>parseInt(n))
[ 1, 2, 3, 4, 5, 6 ]
```

とします。

引数を設定するかどうかで動作が変わるので、原因は引数です。

特にScalaなどの他の言語をやっていると見落としがちですが、`Array.map`の引数となる関数が取る引数ですが、実は以下のようになっています。

```js:fig.4.1
Array.map((currentValue, index, array)=>...);
```

具体的になにが来ているのかは、こうすると分かりやすいです。

```js:fig.4.2
> '01:02:03:04:05:06'.split(':').map(console.log)
01 0 [ '01', '02', '03', '04', '05', '06' ]
02 1 [ '01', '02', '03', '04', '05', '06' ]
03 2 [ '01', '02', '03', '04', '05', '06' ]
04 3 [ '01', '02', '03', '04', '05', '06' ]
05 4 [ '01', '02', '03', '04', '05', '06' ]
06 5 [ '01', '02', '03', '04', '05', '06' ]
```

`parseInt`は、第2引数に基数をとりますので、先程の例では`index`の値が当てられて順に`0,1,2,3,4,5`進数として文字列を数値変換していたようですね。

それを踏まえて`fig.2`の振る舞いを見てみましょう。引数が0のときはどうやら10進数と解釈されている様子です。で、"1進数"は常に`NaN`。その他の進数では、範囲外の数字が使用されている部分を無視して先頭の`0`だけを解釈しているようです。

JavaScriptを始めとした型の判定が甘い言語では、こうしたうっかりミスを起こしがちなので注意しましょう。
PyTorch Tensor操作の挙動

Tensor操作の詳しい挙動を確認する。



## torch.unsqueeze(input: Tensor, dim: int) → Tensor
* documentはこちら 
[torch.unsqueeze — PyTorch 1.6.0 documentation](https://pytorch.org/docs/stable/generated/torch.unsqueeze.html#torch.unsqueeze)

* inputしたTensorの次元を一つ増やして返す。ただし挿入した次元でのsizeは1であり、要素数と要素の中身はinputと変わらない。増やす次元の場所はdimで指定し、出力のshapeのdim番目が1になるように次元が増える。

``` python
# Pythonインタプリタを使用
>>> import torch
>>> a = torch.tensor([1,2,3])
>>> a
tensor([1, 2, 3])
>>> b = a.unsqueeze(0)
>>> b.shape
# dim=0としたので、0番目の次元のsizeが1
torch.Size([1, 3])
>>> b
tensor([[1, 2, 3]])

>>> c = a.unsqueeze(1)
>>> c.shape
# dim=1としたので、1番目の次元のsizeが1
torch.Size([3, 1])
>>> c
tensor([[1],
        [2],
        [3]])

# dimはマイナスをとることも可能
>>> d = a.unsqueeze(-1) # a.unsqueeze(1) と同じ
>>> d.shape
# dim=-1としたので、-1番目、つまり1番目の次元のsizeが1
torch.Size([3, 1])
>>> d
tensor([[1],
        [2],
        [3]])
```

* unsqueezeなどの関数は `view` と言われていて、同じdataを保持する異なるTensorを返すものである 
 * viewについてのdocument: https://pytorch.org/docs/stable/tensor_view.html

## broadcasting
* NumPyのブロードキャスト(broadcast)をPyTorchのTensorでもサポートしている。
* documentは [Broadcasting semantics — PyTorch 1.6.0 documentation](https://pytorch.org/docs/stable/notes/broadcasting.html)
 * [日本語訳もあり](https://torch.classcat.com/2018/05/23/pytorch-docs-notes-broadcasting/)
* 簡潔にいうと、shape（次元数）が違う二つのTensorでも、ある特定条件を満たせば四則演算などが可能になる機能。
* ポイントは、次元数が異なる場合に末尾の次元のサイズを見ていき、サイズが同じであるか、片方が1であればブロードキャストでき、計算可能となる。

``` python
# Pythonインタプリタを使用
>>> import torch
>>> a = torch.rand(2,3,4)
>>> b = torch.rand(3)
>>> a * b
# 計算不可能
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 2

>>> c = b.expand(2,3)
>>> c.shape
torch.Size([2, 3])
>>> a * c
# aの先頭の2次元とcの先頭の2次元は同じsizeだが、計算不可能
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 2

>>> d = b.unsqueeze(1).expand(3,4)
>>> d.shape
torch.Size([3, 4])
>>> a * d
# 末尾の次元が同じなので計算可能
```
Rubyでキーとバリューを書く

<h3>3種類の参考を元に、keyとvalueの種類について以下にまとめていく。</h3>

<h3>1. hash1 = {"title" => "天気の子"}</h3>

<h3>2. hash2 = {:title => "天気の子"}</h3>

<h3>3. hash３ = {title: => "天気の子"}</h3>

hash1は文字列をキーに使っている。

hash2とhash３はシンボルをキーに使っている。

hash2とhash３は同じ内容であるが、<strong>hash３が最もシンプル</strong>な書き方になる。

ハッシュのキーとして使う場合は、<strong>シンボルの方が実行の速度が早いため</strong>シンボルの使用が推奨されています。
PowerQuery で階層構造のヘッダーを持つテーブルをピボット解除 V2

#はじめに
階層構造のヘッダーを持つテーブルをピボット解除する方法として、以前投稿した[この記事](https://qiita.com/reisyu/items/e121cb9cd9e4c81d105b)よりもシンプルな方法をみつけました

#やりたいこと
ヘッダーがこんな感じで階層構造になっている表に出会いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b3a2b219-d5c0-3f29-e837-62bde458a207.png)
Power Query を使ってこの表をピボット解除してこういう形に持っていきたいと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/51496188-6766-bb2d-23b8-6d987e40af10.png)

#手順
### スタートの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/17e4c031-54b0-e237-47a9-85878e3a25e6.png)

###不要なステップを削除する
下の二つのステップ「昇格されたヘッダー数」「変更された型」を削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/00e9ddc8-5015-670e-a838-a4a0b5495bdf.png)

###行と列とを入れ替え
変換タブの入れ替えで行と列とを入れ替える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/4815536d-c9a3-9e5d-e628-105c2b87aea3.png)

###1行目をヘッダーに昇格させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/ba659d39-c316-f683-ff7d-4df57e32151e.png)

###1列目の列名を氏名に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/9348e6d4-45d1-7756-407e-a92e47979751.png)

###フィル > 下 で空白を埋める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/4ea8d794-2827-3584-cc6c-cd93c6da5476.png)

###その他の列のピボット解除
氏名と月の列を選び**その他の列**のピボット解除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/3a6ec8fe-d1c4-40b0-4820-d53c98393e86.png)

###月の列をピボット
`月` 列をを選択して列のピボットをクリック。値列には `値` を選択してOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/e5a9acb8-b9b9-b3de-392f-9ae1d9b35248.png)

###列名を月にして完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/9fb05dc0-4cf9-e534-cc3b-3bd71cb3f707.png)

#まとめ
行列の入れ替え > ピボット解除 > ピボット という手順で階層構造のヘッダーを持つテーブルのピボット解除ができました！
ビルドすると「Could not freeze ./.nuxt/router.js: Cannot read property 'hash' of undefined」が出る

## 結論

hardSourceで作成されたキャッシュを消してください。

```
$ rm -rf node_modules/.cache/hard-source/
```

## 解説

ビルドするとこんな感じのエラーが出た

```
ERROR  [hardsource:a105875d] Could not freeze ./.nuxt/router.js: Cannot read property 'hash' of undefined
```

### nuxt.config.jsで指定したキャッシュ設定が原因

```js
export default {
  build: {
    // ビルド高速化の為にキャッシュしてる
    hardSource: true,
  }
}
```

### キャッシュファイルを削除しよう

ただキャッシュファイルを消すだけ

```
$ rm -rf node_modules/.cache/hard-source/
```

よく使うのでpackage.jsonでscript化しておこう

```json
{
    "scripts": {
      "clear-hard-source-cache": "rm -rf node_modules/.cache/hard-source/",
    }
}
```
こんな感じで使う

```
$ yarn clear-hard-source-cache
````

## 参考

https://github.com/mzgoddard/hard-source-webpack-plugin/issues/416
https://blog.mintsu-dev.com/posts/2019-08-22-nuxtjs-build-performance/


## 追記 2020/11/12

### hardSourceは使わない方がいいかも

hardSourceでキャッシュしてローカルビルドを早くするのは、
公式がベータ版と言っている通り不具合が多くやらない方が良いかも知れません。

### もしもローカルのビルド時間が長い場合

- dockerなどを使っていれば与えるメモリ容量を増やす
- dockerなどを使わずにローカルのnodeでビルドする
- バンドルサイズが大きい場合はそもそもの無駄コードを減らす（重複など）
開発でよく使うGITコマンド

### 一連の流れ！
$ git clone < url >
$ git checkout develop
$ git pull
$ git checkout -b < branch name >
$ git status
$ git add < file >
$ git commit -m "< commit message >"
$ git pull --rebase origin develop
　　if conflict then
　　$ git add < fixed file >
　　$ git rebase --continue
$ git push origin < local branch > #ローカルからリモートブランチ作成
" GitHubのWEB-UIでpull request送信 "
$ git checkout develop
$ git pull
$ git branch -d < branch name > #ローカルブランチ削除
$ git push --delete origin < branch name > #リモートブランチ削除

### その他コマンド
$git branch   #ローカルブランチ確認
$git branch -a  #全てのブランチ確認
$git branch -r  #リモートブランチ確認
$git branch -u origin/< branch name >   #現在のブランチが、< branch name >で指定したリモートブランチを追跡
$git checkout -b < local_branch_name > origin/< remote_branch_name > #リモートブランチをローカルにcheckout
$git branch -d -r origin/< branch name > #リモートブランチ削除(ローカル側)
$ git remote prune [リモート名]  #Gitで、リモートリポジトリで削除済みの不要なブランチをローカルから削除する方法
scoopでWindows上の開発環境を作ってみた

# どんな記事？
タイトルの通りですが、スクリプトのテンプレート的なものをGithub上に公開してみたよ、という記事です。
私の備忘録的な位置づけでもあります。
「使ってみたよ」「ここイマイチ」などありましたら、コメントいただけたら幸いです。

# スクリプトの公開場所
会社のWinPCの環境構築をスクリプト化したくて、色々調べてみたら、scoopというものに出会いました。
Qiitaでも公開されている記事を参考にさせていただきました。

Powershellスクリプトとして、テンプレート的なものを作って、Githubにアップしてみました。
もしよかったら、ご利用ください。
https://github.com/o310yusuke/scoop_win_init

# どんなことを書いたか
- VSCodeの良さそうなプラグイン
    - 何をインストールしたか忘れるので、コマンドでインストールできるように記載しています。
- 独自Bucketの作り方
    - 会社で環境構築の自動化という点で提案してみました。
    - 上司から、「利用する際に推奨アプリを集約して、ファイルサーバで公開できないか」と言われました。
    - なので、独自Bucketの作り方のためしてみたので、備忘録として、記載しました。
    - [独自Bucketの作り方](https://github.com/o310yusuke/scoop_win_init/blob/master/HowToCreateMyBucket.md)
Webアプリにおける値を画面遷移間で持ち回る手段集

# はじめに
画面遷移をする際にデータを持ち回る手段にはいくつか手段がありますが、
一度それらを纏めてみたくなったのでメモしてみます。
編集リクエスト大歓迎です！

## GET

```
// 一つのパラメータを送信する
https://hogehoge.test?sample1=123
// 複数のパラメータを送信する
https://hogehoge.test?sample1=123&sample2=456
// 配列のパラメータを送信する
https://hogehoge.test?array[]=123&array[]=456
// 連想配列のパラメータを送信する
https://hogehoge.test?array[key][]=123&array[key][]=456
```
__送信するデータがURLに表示されます。__

## POST

```
https://hogehoge.test
HttpRequestBody
sample1: 123
sample2: ["John", "Pete", "Bob"]
sample3: {key, "value"}
```
__送信するデータがURLに表示されません。__
HttpRequestのBodyに「key, value」の組み合わせで格納されます。

## GETとPOSTの使い分け
GETは検索・ソート条件等見えても構わない、寧ろ__何の条件を渡しているのか明示的にしたい場合__に使用します。
__ログイン機能や登録・更新機能には適しません。__

POSTは第三者の見知らぬ他人が盗み見たら不味いようなデータ送信時に使用します。
パスワード入力欄では「●●●」とマスキングしていたのでURLに表示されてしまったら意味がないですね。。
__ログイン機能や登録・更新機能に適します。__
__※POSTデータはhttps等で暗号化していないと、リクエスト/レスポンスのパケットの中身を解析すれば簡単に確認できてしまうので要注意です。__

## Session
__サーバ側のSessionの領域にデータを保存しておき、CookieのSession IDと紐づくデータを参照することができます。__
「key, value」の組み合わせで格納されます。

ログイン後取得した__ユーザ情報、検索結果リスト等ログアウトするまでの間に保持しておきたい情報を格納するのに適しています。__
Sessionが切断されてしまうと、保持していたデータは参照不可→消失してしまうので、__永続化したいデータはDBやファイルに格納する必要があります。__

大抵のWeb系言語でサポートされていますが、
__ピュアでSessionを取り扱うのはセキュリティ面で考慮すべき点が多数あり面倒です。__
その点、__フレームワークを採用しているならば、優れたSession用のライブラリが入っているのでそれらを採用すべきです。__
ただし、
__・Sessionのタイムアウト設定__
__・Session IDが記述されているCookieの名前変更__
等追加で設定しておくべきポイントはあるので抑えておくべきです。

また、好き勝手にSessionにデータを保存しておくと、エコではないので使用しなくなったデータは直ぐに削除すべきです。

## Cookie/localStorage/sessionStorage
__ブラウザの標準機能__で、
Sessionがデータをサーバに保存するのに対して、
__Cookie/localStorage/sessionStorageはクライアント側にデータを保存します。__
「key, value」の組み合わせで格納されます。
__フロント側で画面の状態を保持したい場合等に適しています。__

また、Cookie/localStorage/sessionStorageの違いは以下の通りです。

__ストレージのサイズ__
Cookie→4KB
localStorage→5MB
sessionStorage→5MB

__有効期限__
Cookie→設定による
localStorage→消さない限り永続的
sessionStorage→Windowかタブを閉じると消える

__アクセス権限__
Cookie→クライアントとサーバどちらからもアクセス可能
localStorage→クライアントからアクセス可能
sessionStorage→クライアントからアクセス可能

各種ブラウザの設定画面から値を確認できてしまいますので、__クレジットカード情報等大事な情報はなるべく保存しないようにすべきです。__
__特にCookieはサーバからもアクセスできてしまいます！！__
どうしても大事な情報を扱う必要がある場合は適時暗号化が不可欠となります。
[参考サイト](https://www.it-swarm.dev/ja/html5/localstorage%E3%80%81sessionstorage%E3%80%81session%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3cookies%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1043061471/)


# 最後に

保存しているデータの見える範囲とセキュリティを意識して使いまわしていきたいですね。
状態とふるまいを持つモデルを実装する (3) - デコレータによる実装例


前回 （[状態とふるまいを持つモデルを実装する (2)](https://qiita.com/torajiro1220/items/5d6ee04dc1b2815bfa78)）は、３つの状態を持つ `StopWatch` を、二つの方法で実装した。今回は `StopWatch` を *decorator* を利用して実装する。

まずは、状態遷移を *decorator* で記述する。状態遷移するメソッドかわかりやすくなる。

```python
from enum import auto


def transit(state):
    def decorator(func):
        def inner(self, *args, **kwargs):
            self.start_stop, self.reset = self._TRANSIT[state]
            func(self, *args, **kwargs)
        return inner
    return decorator


class StopWatch:
    WAIT, PAUSE, MEASURE = auto(), auto(), auto()

    def __init__(self):
        self._TRANSIT = {StopWatch.WAIT: (self.start, lambda *args: None),
                         StopWatch.PAUSE: (self.start, self.reset_time),
                         StopWatch.MEASURE: (self.pause, lambda *args: None)}
        self._TRANSIT_REVERSED = {v: k for k, v in self._TRANSIT.items()}
        self.start_stop, self.reset = self._TRANSIT[StopWatch.WAIT]

    @property
    def state(self):
        return self._TRANSIT_REVERSED[self.start_stop, self.reset]

    @transit(MEASURE)
    def start(self):
        pass

    @transit(PAUSE)
    def pause(self):
        pass

    @transit(WAIT)
    def reset_time(self):
        pass
```

さらに状態遷移表をデコレータで切り出してみる。`behavior` デコレータはある状態のときのふるまいを表す。

```python
from enum import auto
from state_machine import behavior, transit


class StopWatch:
    WAIT, MEASURE, PAUSE = auto(), auto(), auto()

    def __init__(self):
        self.state = StopWatch.WAIT

    @behavior(WAIT, "start")
    @behavior(MEASURE, "pause")
    @behavior(PAUSE, "start")
    def start_stop(self):
        pass

    @behavior(PAUSE, "reset_time")
    def reset(self):
        pass

    @transit(MEASURE)
    def start(self):
        pass

    @transit(PAUSE)
    def pause(self):
        pass

    @transit(WAIT)
    def reset_time(self):
        pass
```

```python:state_machine.py
from functools import wraps


def transit(state):
    def decorator(func):
        @wraps(func)
        def inner(self, *args, **kwargs):
            self.state = state
            func(self, *args, **kwargs)
        return inner
    return decorator


def behavior(state, function):
    def decorator(func):
        @wraps(func)
        def inner(self, *args, **kwargs):
            if self.state == state:
                getattr(self, function)(*args, **kwargs)
            else:
                func(self, *args, **kwargs)
        return inner
    return decorator
```
状態を self.state に保持する前提ではあるが、他のモデルでも同じ *decorator* が使用できるため、モジュール`state_machine`として切り出した。

デコレータを処理するタイミングでは、まだ関数がアンバウンドなので、ふるまいを文字列で与えている。関数の`__name__` を利用して実行時にバウンドメソッドを呼ぶこともできる。（該当箇所のみ以下に示す。）
なお、`functools.wrap()` を使用しない *decorator* があると想定とおり動作しない。（`functools.wrap()` を使用すると *decorator* が関数の `__name__` を書き換えない。）

```python:state_machine.py
def behavior(state, function):
...
            if self.state == state:
                getattr(self, function.__name__)(*args, **kwargs)
...
```

```python
...
    @behavior(PAUSE, reset_time)
    def reset(self):
        pass
...
```
[PLCメモリマップ作成] ユーザー定義を利用して文字列を数字として扱う

#メモリマップを効率よく作る
シーケンサやPLCのデバイスメモリマップを作成するのにエクセルを使用する場合が多いと思います。今回はDxxxx,Mxxxxといった文字をはじめにつけた数字の入力方法を紹介いたします。

マップ作成にはExcelを開きます．
![20190712164826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/054af938-70c0-ce16-1462-f8a80ab22013.png)

普通のエクセルシートです．

エクセルの初歩の初歩ですが，1ずつ加算された値を順に並べていくときは図のようにするか，セル右下を下にドラッグしますよね．
![20190712164915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/30a695c4-4fc8-5b49-b6da-aef94431a9d3.png)
![20190712165126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/3dcc90c5-e383-1616-34da-c0b5501a77cf.png)

ここまでは当たり前の話です． では次のような値を同様にするとどうなるでしょうか． データレジスタのD0です．
![20190712165211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/e08d5b1a-007d-9d8c-2cbe-41df6ca8f7e5.png)
正解は以下のようになります．
![20190712165341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/30992e0a-e92c-3edd-a5eb-be723b297996.png)
D1になってほしいところですが，残念ながらD0は文字列として認識されているため算術的に加算することができません． かといっていちいちD1 ,D2...と打っていくのは賢明ではありません．

#解決策
D0のセルを右クリック→セルの書式設定→ユーザー定義

![20190712165828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/ccfdc667-0836-a9d9-9fb8-8a1abad2f99a.png)

押してみるとこのようになっていると思います． この種類を以下のように変更して下さい。

![20190712165904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/125fee56-4d8a-68ab-f247-4964132945b0.png)

この時の0000は表示できる桁数を示します． ""で囲った部分は自由に変更可能です．内部リレーならばMにしてください． 書き換えられたらOKを押してください．
そして先ほどのセルに「0」といれてみてください．

![20190712170019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/f82d2b9c-8222-175d-c288-87cf7559973c.png)
![20190712170218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/a01ef8c8-e5e0-1d79-012e-538a0d7b4808.png)
エラーがなくなりました．

![20190712170258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/5814c420-32df-a574-22ea-b15902cb6886.png)
後は数字として使うことができます。
ブランチについて

##ブランチの変更削除
*が現在使用しているブランチを示しています。
Git branch

* master

ブランチを新しく作成

$ Git branch feature-A

feature-Aブランチに切り替える
以下Switched表示が出ればOK

$ Git checkout feature-A
Switched to branch 'feature-A'

ブランチの一覧表示を行い
feature-Aに切り替わっていることを確認してください
Git branch

* feature-A
  master

A.jsにconsole.log('feature-A ブランチで追加')

 git add a.js

Git diff HEAD 以下確認

+console.log('feature-A ブランチで追加'

$ git commit -m "update to feature-A"

[feature-A 36b349c] update to feature-A
 1 file changed, 1 insertion(+)


ブランチをmasterに変更
$ Git checkout master
Switched to branch 'master'
下記コマンドでマージされる

```
Git marge —no-ff feature-A

```
終了できなくなった

エディターがデフォルトになっていたので変更
$ git config --global core.editor 'vim -c "set fenc=utf-8"'

エディターがvimになっているか確認する。

```

$ less ~/.gitconfig
[core]
        editor = vim -c \"set fenc=utf-8\"

```

```
$ git checkout master
```

```
git merge --no-ff feature-A
```

feature-Bを発生させる

$ git checkout -b feature-B

feature-Bにブランチが切替っていることを確認。
$ git branch
  feature-A
* feature-B
  master

a.jsにconsole.log('BBB');を追加してファイルを保存します
Vue.jsのドキュメントを少しだけ読んでみた

# Vue.jsとは？
フロントエンドのフレームワーク。
'はじめに'の部分を自分なりに噛み砕いてみた

# 特徴

## コンポーネントの概念

vue.jsでは画面部品単位でvueインスタンスを作成し、それらを組み合わせることでページを組み立てていく。

>コンポーネントシステムは Vue.js におけるもうひとつの重要な抽象概念です。「小さく、自己完結的で、（多くの場合）再利用可能なコンポーネント」を組み合わせることで、大規模アプリケーションを構築することが可能になります。アプリケーションのインターフェイスについて考えてみると、ほぼすべてのタイプのインターフェイスはコンポーネントツリーとして抽象化することができます:
![components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393930/2e18a3c2-ac69-af9a-18d4-bca350707689.png)
(引用：https://jp.vuejs.org/v2/guide/index.html)


### この小さな例で説明していきます

`<div id="app-7">`の中に`<todo-item>`というタグがあるのがわかると思います。これがコンポーネントというもので`<コンポーネント名>`タグとしてtemplate内に「部品」を埋め込む事ができます。

<img width="1130" alt="スクリーンショット 2020-08-01 18.40.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393930/036c6562-4144-3c8f-2162-aaed2954aa93.png">


### 子コンポーネントへの値渡し

v-bindを用いてtodoプロパティへ変数を渡しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393930/18225cd9-f6a9-8eb6-b18b-0169644a6652.png)


## 宣言的レンダリング
vueのコアでは、template構文という文法でコンパクトにhtmlに変数を描画できる。

### 変数の描画
template内{{}}にdataで定義した変数を埋め込める

```vue:index.html
<div id="app">
  {{ message }}
</div>

<script>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
</script>
```


### リアクティブ
data:内の変数が更新されるとテンプレートがそれに「反応」して更新が反映される。
テンプレート構文内のバスケット{{}}内の変数名とVueインスタンスのdataプロパティに格納されている変数がリンクしている。

<img width="1042" alt="スクリーンショット 2020-08-01 18.07.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393930/0efb7d7a-4767-906a-3263-bf3302fbc8d3.png">

### ディレクティブ
Vue.jsで用意されたhtmlタグの属性のこと。

(例)v-bindディレクティブ
属性のvalueをバインドできる（下記の例はtitle属性をバインドしている）


```vue:index.html
<div id="app-2">
  <span v-bind:title="message">
    Hover your mouse over me for a few seconds to see my dynamically bound
    title!
  </span>
</div>

<script>
   ar app2 = new Vue({
    el: "#app-2",
    data: {
      message: "You loaded this page on " + new Date().toLocaleString()
    }
  });
</script>
```

# 参考
>[Vue.js公式ドキュメント](https://jp.vuejs.org/v2/guide/index.html)
cakephp 4 開発開始メモ

# ユーザー認証方法

AuthComponentではなく、authentication plugin を使うことになったらしい。

詳しくは
[シンプルな認証と認可のアプリケーション](https://book.cakephp.org/4/ja/tutorials-and-examples/blog-auth-example/auth.html)

# 別テーブルを使う場合

```
public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
{
    $authenticationService = new AuthenticationService([
        'unauthenticatedRedirect' => '/users/login',
        'queryParam' => 'redirect',
    ]);

    // 識別子をロードして、電子メールとパスワードのフィールドを確認します
    $authenticationService->loadIdentifier('Authentication.Password', [
        'fields' => [
            'username' => 'email',
            'password' => 'password',
        ]
    ]);
```

↓追加

```
public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
{
    $authenticationService = new AuthenticationService([
        'unauthenticatedRedirect' => '/users/login',
        'queryParam' => 'redirect',
    ]);

    // 識別子をロードして、電子メールとパスワードのフィールドを確認します
    $authenticationService->loadIdentifier('Authentication.Password', [
        'resolver'=>[
             'className' => 'Authentication.Orm',
             'userModel' => '[ユーザーテーブル]'
        ],
        'fields' => [
            'username' => 'email',
            'password' => 'password',
        ]
    ]);

```

参考
[CakePHP4のミドルウエアを使った認証で別テーブルを参照（authentication）](https://mitsuba-system.co.jp/info/?p=446)
display: table-rowをすっかり忘れていた話。

#flexやgridばかり使ってた
IE11以降、そして、autoprefixerを使っていると、あまりブラウザの差異を考えずに、
flexやgridを多用していて、display:tableなんて使わなくなっていたけど、
久しぶりに汎用的なcssスタイリングをするにあたり、
項目名と値のテーブル的なレイアウトのものが来た時に、
項目名の幅を揃えたいけど、mobile(SP)表示ではテーブルレイアウトじゃなくしたいなんて、
デザイナーが言うもんだから、困った。

#[display:table] > [display:table-cell]ばかりだと思ってた。
どこでどう間違えたか、[display:table]直下には[display:table-cell]か、くらいかと思ってた。

#[display:table-row]が存在してた。
すっかり忘れた。

#でも、そもそも、セマンティックな考えなら、tableタグ使えばよくない？
そうなんだけどね。
でも、デザイナーの中にはhtmlやcssの概念をいまいちちゃんと理解できない人がいるから、項目と値の関係性が崩れたデザインをdesktopとmoblieで分けてくることがある。

#教訓
迷ったら、使い慣れたcssプロパティの値を再確認しよう。

これは自戒である。
【初心者記事】jQuery のある機能が動かない時にチェックする項目


ちょっと勉強して、大体、jQuery読めるようになったし、なんか作ってみるかという矢先に全く、jQueryが反応しなくなったので、備忘録として残しておく。

【事象】
BootstrapとjQueryで開発で簡単なWEBサイトを作成していた時に、
Sliding Methodsを使ったが全く反応しなかった。

【原因】
jQueryのCDNが間違っていた。

【勘違いポイント】
jQueryのCDNって一つしかないと思ってた（恥かしい、、、）

Bootstrap4.5が用いているCDN

```:Bootstrap4.5

<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>

```
それでやりたかった方で必要だったCDN

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

調べてみると、jQueryって、圧縮バージョンと非圧縮バージョンがあるのね。
https://www.w3schools.com/jquery/jquery_get_started.asp
このサイトにもそう書いている。
取り扱い説明書はあまり読まないタイプであるが、時間のある時にこういうサイト読もうっと、、、
（英語がやっぱりしんどい）

参考文献：https://blog.mudatobunka.org/entry/2016/09/04/023121
nuxtのaxios apiの設定で、同じIPアドレス/ホスト名を使いつつポート番号だけ変えたい（ただし、IP/ホストは可変とする）

## .envファイルを使えばいいのですが。。。

サーバーの環境の理由で、アクセスしてきたホストのIPアドレスをそのまま使いたかったんです。
ステージング環境にローカルからも外部IPからもアクセスしたいという要望のため。。。
同じホスト内で、3000番でAPIサーバーが動いています。

例：
ローカルアクセス

ホスト 127.0.0.1:80
API   127.0.0.1:3000/api

外部からのアクセス

ホスト xxx.xxx.xxx.xxx:80
API   xxx.xxx.xxx.xxx:3000/api

これを、.envファイルを使わずに、「同じホスト名のポートだけ違う向き先のAPIアクセスを実現する方法」を考える必要がありました。。。

### .envを使うと

.envを使えば、これは簡単に実現できます。
しかし、上記のローカルアクセスと外部アクセスを同時に生かしておきたい場合、
実行環境が2つ必要なのでちょっとめんどくさかったんです。


```nuxt.config.js

plugins: ['@/plugins/axios.js']

```

```axios.js

$axios.setBaseURL('http://' + location.hostname + ':3000/api')

```

これで、アクセスしているブラウザのホスト名を動的に使った同じホスト名別ポートのAPIのアクセス先が設定できます。

動作確認を外部IPからに限定すればいいんじゃないかって？その通りです。
外部IPにアクセス制限がかかっていて、見れる人と見れない人がいる環境だったんですわ・・・
【チーム開発にて】他メンバーのブランチに移動して、rails sした時のエラー【Rails】

#参考対象者
- チーム開発初心者
- Railsでのアプリ開発にて、データベース関連のエラーで困ってる方
- Git初心者


#環境

```
$ rails -v
Rails 6.0.3.1
```
```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

```
$ git --version
git version 2.27.0
```

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
```

#状況

- 他メンバーのブランチに移動し、レビューするために挙動確認したかったが、サーバーを立ち上げるときにエラーが出た。
- どうやら、データベース関連のエラーらしい。


#ActiveRecord::PendingMigrationError

>https://qiita.com/KONTA2019/items/0444ae3b8c8936a56ee0

上記を参考に、解決する。
ちなみに私は、

```
$ rails db:migrate
```

で解決。

でも、その後次のようなエラーが。。。

#Multiple migrations have the name ~~~.

結論から言うと、~~~には、**マイグレーションファイル名**が入ります。

私の場合は、

```
Multiple migrations have the name CreateUsers.
```

となって、自分のマイグレーションファイルを確認してみると、

```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200618162841  Create tweetposts
   up     20200620004226  Change tweetposts to tweets
  down    20200621075518  Create posts
  down    20200623102444  Change posts to chats
  down    20200627042358  Create users
   up     20200627080839  Create users
   up     20200627083356  Add column to users
  down    20200627220915  Change datatype content of chats
   up     20200703201452  ********** NO FILE **********
  down    20200710035709  Add user id to tweets
```

ありましたね、CreateUsersファイル。

察しの良い方はお分かりだと思いますが、エラー文の内容から「**同名のマイグレーションファイルか存在しているから、どちらを参考にデータベース構築をしたら良いかわからないよ**」という状況と推測できます。


なので、
`down 20200627042358  Create users`
こちらのファイルを削除し、

```
$ rails db:migrate
$ bundle exec rails s
```

これにて、サーバーを起動することができました！

#ちなみに、、、

マイグレーションファイルの、
```up     20200703201452  ********** NO FILE **********```

気になりますよね？？

これ、ないファイルを参考にデータベースを構築してるという不可思議な現象なので、削除してしまいたいですね。

これの原因は、マイグレーションをdownさせる前に、マイグレーションファイルを削除してしまったため起こるものなのですが、解決方法は下記をどうぞ。

>https://qiita.com/beanbeenzou/items/e8886071ab1e1cf7a9c0
献立プログラムを作成した


```menu.rb
def search(menus)
  puts "検索する材料をひらがな入力してください"
  keyword = gets.chomp
  puts "-------------------------------"
  puts "検索材料:#{keyword}"

  result_array = menus.select { |menu| menu[:title].include?(keyword) || menu[:ingredients].include?(keyword) }
  if !result_array.empty?
    show_results(result_array)
  else
    puts "指定のキーワードでは見つかりませんでした\n\n"
  end
end


def show_results(results)
  puts "\n#{results.count}件見つかりました"
  results.each do |result|
    puts "-------------------------------"
    puts "メニュー: #{result[:title]}"
    puts "材料: #{result[:ingredients]}"
  end
  puts "-------------------------------\n\n"
end




def feeling(menus)
  puts "いまの気分はこれ！\n\n"
  num = rand(0..menus.length - 1)
  results = menus[num]
  puts "     ▼ ▼ ▼     \n\n"


  results.each do |result|
    puts result[1]
  end 
  puts "\n\n"
end


menus = []

  # 和風
  menu = {title:"肉じゃが",ingredients:"じゃがいも、たまねぎ、にんじん、ぶたにく"}
  menus << menu
  menu = {title:"ぶり大根",ingredients:"ぶり、だいこん"}
  menus << menu
  menu = {title:"TKG",ingredients:"たまご、ごはん、しろだし、しょうゆ"}
  menus << menu
  menu = {title:"あさりうどん",ingredients:"うどん、ねぎ、あさり"}
  menus << menu
  menu = {title:"あさりとキャベツの酒蒸し",ingredients:"あさり、ねぎ、きゃべつ"}
  menus << menu
  menu = {title:"豚肉のしょうが焼き",ingredients:"しょうが、ぶたにく、たまねぎ"}
  menus << menu
  menu = {title:"さばのアラ汁",ingredients:"みそ、しろだし、さばかん、ねぎ"}
  menus << menu
  menu = {title:"釜玉うどん",ingredients:"うどん、たまご、しろだし"}
  menus << menu
  # 洋風
  menu = {title:"カレー",ingredients:"たまねぎ、にんじん、ぶたにく、じゃがいも、かれーるー"}
  menus << menu
  menu = {title:"ハンバーグ",ingredients:"たまご、ひきにく、たまねぎ"}
  menus << menu
  menu = {title:"ポトフ",ingredients:"たまねぎ、にんじん、じゃがいも、ぶろっくべーこん、こんそめ"}
  menus << menu
  menu = {title:"ジャーマンポテト",ingredients:"じゃがいも、べーこん、にんにく"}
  menus << menu
  menu = {title:"オムライス",ingredients:"たまご、とりにく、とまと、たまねぎ"}
  menus << menu
  menu = {title:"グラタン",ingredients:"ばたー、こむぎこ、たまねぎ、まかろに、とりに、ちーず、ぎゅうにゅう"}
  menus << menu
  # 中華
  menu = {title:"スーラータンメン",ingredients:"たまご、にら、らーめん"}
  menus << menu
  menu = {title:"チャーハン",ingredients:"ぶたにく、ごはん、たまご、ねぎ"}
  menus << menu
  menu = {title:"回鍋肉",ingredients:"ぶたにく、きゃべつ、ぴーまん、こちゅじゃん、てんめんじゃん"}
  menus << menu
  menu = {title:"スープチャーハン",ingredients:"ぶたにく、たまご、ごはん、ねぎ、とりがら"}
  menus << menu
  menu = {title:"マーボー豆腐",ingredients:"とうふ、ごはん、ねぎ、ごまあぶら、まーぼーのもと"}
  menus << menu
  





bar = "-------------------------------"


while true do
  puts bar
  puts "\nあなたの「何作って食べよう……」を解決！！"
  puts "メニューを選択してください。\n\n"
  puts "0:材料からメニュー検索"
  puts "1:気分でメニュー検索"
  puts "2:登録一覧を表示"
  puts "3:終了します。\n\n"
  puts bar

  case gets.to_i
  when 0
    puts "0:材料からメニュー検索"
    search(menus)
  when 1
    puts "1:気分でメニュー検索"
    feeling(menus)
  when 2
    puts "2:登録一覧を表示"
    puts menus
  when 3
    puts "3:終了します。"
    exit

  else
    puts"無効な入力です。"
    puts bar
  end
end
```

#what
・献立支援アプリ

#why
・ポートフォリオの一つとして作成。
・調理の際に何を作ろうか長考することが多かったため

#issue
・１を選択しランダム出力する際、和・洋・中のいずれかを選択させ、その中から出力する。
・レシピの作成手順も記載する
・レシピ一覧のコードをリファクタしたい
iPhone&iPad 画面サイズ早見表

*Xcode version 11.5*で動作するiPhoneとiPadの画面サイズの早見表です。  
デザインを考えるときに使っていただけると幸いです。

## 画面サイズ取得方法
```php:ViewController.swift
import UIKit
class ViewController: UIViewController {
    let width = UIScreen.main.bounds.size.width   //画面の横幅を取得
    let height = UIScreen.main.bounds.size.height //画面の縦幅を取得
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print(width)
        print(height)
    }
}
```

## iPhoneシリーズ
|        |  SE | 11ProMax | 11Pro |  11 | 8Plus |   8 |
| ------ | ---:| --------:| -----:| ---:| -----:| ---:|
| width  | 375 |      414 |   375 | 414 |   414 | 375 |
| height | 667 |      896 |   812 | 896 |   736 | 667 |

## iPadシリーズ
|        | Pro 12.9-in. | Pro 11-in. | Pro 9.7-in. |  Air | 7th 無印 |
| ------ | ------------:| ----------:| -----------:| ----:| --------:|
| width  |         1024 |        834 |         768 |  834 |      810 |
| height |         1136 |       1194 |        1024 | 1112 |     1080 |



## 参考文献
https://www.yukiiworks.com/archives/118
zsh環境でpoetryのインストール(エラー対処)方法

# 前提
MacOSがCatalinaからターミナルのデフォルトがzshになり、poetryを追加するだけではエラーになってしまいます。
~/.zshrcにパス追記することで対応できましたので参考にしてください。

# poetryのインストール
```zsh
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
```

zsh環境ではこの状態でpoetryコマンドを実行するとエラーになります

```zsh
poetry --version
> zsh: command not found: poetry
```

# .zshrcにパスを追記

```zsh
vim ~/.zshrc
```

```vim
export PATH="$HOME/.poetry/bin:$PATH"
```


ターミナルを再起動

```zsh
poetry --version
> Poetry version 1.0.10
poetry self update
> You are using the latest version
```

お疲れさまでした。
（自分用メモ）Visual Studio Codeコードで使用している拡張の一覧

## 共通

- Auto Close Tag
- Auto Rename Tag
- Bracket Pair Colorizer
- Encode Decode
- EvilInspector
- Feather
- Japanese Language Pack for Visual Studio Code
- JSON Tools
- Markdown All in One
- Path Intellisense
- Prettify JSON
- vscode-icons
- Rainbow CSV
- URL Encode
- Trailing Spaces
- TODO Highlight
- Todo Tree
- Regex Previewer


## Git関連

- GitLens
- Git History

## JavaScript関連

- REST Client
- ESLint
- Color Picker
- Prettier
- IntelliCode
- Live Server
- Debugger for Chrome

## Java関連

- Java Extension Pack
- Language Support for Apache Camel by Red Hat

## Python関連

- Python
Metricbeat(Elastic Stack)でPostgreSQLのメトリクスを収集する

# はじめに

Metricbeat(Elastic Stack)を用いてPostgreSQLのメトリクスを収集し、Kibanaのダッシュボードで確認します。


# 環境

以下の環境で試しています。

- CentOS 7.5
- Elasticsearch 7.8
- Kibana 7.8
- Metricbeat 7.8

ElasticsearchとKibanaは以下の投稿で構築した環境を利用しています。

- [JavaアプリケーションをElastic APMで計測してみる](https://qiita.com/mkyz08/items/dfcb4785f9444b04a574)


# Metricbeatのインストール

Metricbeatのインストールは以下の公式ドキュメントを参考に実施します。

- https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-installation.html

まずはRPMをダウンロードし、インストールします。

```
# curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.8.1-x86_64.rpm
# rpm -vi metricbeat-7.8.1-x86_64.rpm
```

PostgreSQLからメトリクスを収集するモジュールを有効にします。デフォルトで、この他にシステムメトリクスが収集されます。

```
# metricbeat modules enable postgresql
Enabled postgresql
```

PostgreSQLのモジュールを登録した後は、設定を見直します。
今回は以下のように設定しました。

```
# vi /etc/metricbeat/modules.d/postgresql.yml 


- module: postgresql
  metricsets:
    - database
    - bgwriter
    - activity
    - statement
  period: 10s
  hosts: ["postgres://localhost:5432?sslmode=disable"]
  username: postgres
  password: postgres
```

statementメトリクスを利用するためには、pg_stat_statements拡張をPostgreSQLにインストールしておく必要があります。
以下のコマンドでインストールし、postgresql.confでモジュールを読み込むように設定します。

```
# CREATE EXTENSION pg_stat_statements;
```

```
#postgresql.conf
shared_preload_libraries = 'pg_stat_statements' 
```

次にElasticsearchとKibanaのエンドポイントを設定します。
Kibanaのエンドポイントを設定すると、サンプルKibanaダッシュボードを使用することができます。
Elasticsearchへのインデックステンプレートの登録は自動で実行されます。

```
# vi /etc/metricbeat/metricbeat.yml 

setup.kibana:
  host: "localhost:5601"
output.elasticsearch:
  hosts: ["localhost:9200"]
```

Metricbeatには、サンプルのKibanaダッシュボードがパッケージされており、以下のコマンドで作成することができます。

```
metricbeat setup --dashboards
```

最後にMetricbeatを自動起動に設定し、起動します。

```
# systemctl enable metricbeat
# systemctl start metricbeat
```

Metricbeatのログは以下に出力されます。

```
/var/log/metricbeat/metricbeat
```


# Kibanaのダッシュボードでメトリクスを確認

自動でダッシュボードが登録されており、[Metricbeat PostgreSQL] Database Overviewを選択すると以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/68c00f9f-e895-97cd-36bb-2c81eabea8eb.png)

表示されているグラフになります。

- Rows Fetched/Returned
- Database Transactrions
- Query Latency
- Top Queries
- Fileblock IO
- Rows Inserted/Deleted/Updated
- Conflict/Deadlock Rates
- Local block cache stats
- Shared block cache stats

なお、システムメトリクスは以下のダッシュボードで表示することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/e92ae120-3b19-a29f-d3ad-c724ea9cb33b.png)
学習機能付き赤外線リモートコントローラの設計ー午後

応用情報技術者令和元年秋期 午後問7

ファイル：2019r01a_ap_pm_qs.pdf　午後問7

赤外線リモコンの信号の例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/38ae2995-c032-9ed6-672a-f4eccacb2475.png)

解析機能で使用するハードウェア：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/35663165-7e29-d7cd-60f9-6845c50a610b.png)


設問１：
一つの制御パターンにおいて、ON状態の数とOFF状態の数の合計は最大何個とするか

当該質問が簡単で、制御パターンの長さ（６０ミリ秒）　÷　ON/OFF状態の最短時間（３５０マイクロ秒）＝171.4xxx 少数は捨てて、１７１ですね。

注意点：OF/OFFがセットではないと、無効な信号としますが、
　　　　ここは最大は何個を聞かれて、有効な信号として、最大何個を聞かれないですね。

・赤外線センサにおいて、３８～４０ｋHｚの信号成分を取り出すものはどれか
これは難しいですね。

１）、
バンドパスフィルタ（英語: Band-pass filter: BPF）とは、特定の周波数帯の物理現象を抽出するフィルタの一種。


２）、
ローパスフィルタ（英語: Low-pass filter: LPF、低域通過濾波器）とは、フィルタの一種で、なんらかの信号のうち、遮断周波数より低い周波数の成分はほとんど減衰させず、遮断周波数より高い周波数の成分を逓減させるフィルタである。ハイカットフィルタ等と呼ぶ場合もある。電気回路・電子回路では、フィルタ回路の一種である。

３）、
ハイパスフィルタ（英語: High-pass filter: HPF）とは、フィルタの一種で、なんらかの信号のうち、遮断周波数より高い周波数の成分はほとんど減衰させず、遮断周波数より低い周波数の成分を逓減させるフィルタである。


設問３：
カウント値が６５,535に達すると、０に戻る
→
カウント値が０に戻ったとき

６５，５３５―前回値＋今回値
→
T[N]に６５，５３６を加算する


参考：
ローパスフィルタ
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF

バンドパスフィルタ
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%B3%E3%83%89%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF#:~:text=%E3%83%90%E3%83%B3%E3%83%89%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%EF%BC%88%E8%8B%B1%E8%AA%9E%3A%20Band,%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%AE%E4%B8%80%E7%A8%AE%E3%80%82

ハイパスフィルタ
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF#:~:text=%E3%83%8F%E3%82%A4%E3%83%91%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%EF%BC%88%E8%8B%B1%E8%AA%9E%3A%20High%2D,%E5%9B%9E%E8%B7%AF%E3%81%AE%E4%B8%80%E7%A8%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82