OmniAICreator/Qiita-1.07M huggingface dataset:
LoRaモジュールLRA1のファームウェアを更新する

技適認証済で日本製のLoRaモジュール [LRA1](http://www.i2-ele.co.jp/LoRa.html) のファームウェアを更新(アップデート)してみます

# アップデートツールとファームウェアの入手

LRA1の更新はPC用の専用ツールを使います。ツールとファームウェアは [株式会社 アイ・ツー](http://www.i2-ele.co.jp/LoRa.html) のWebサイトからダウンロードできます

# 更新手順

## 準備

アップデートツールを起動する前にPCとLRA1を繋いだ状態にしておきます。DIP化基板の場合はUSB-UARTのシリアル変換ボードなどを経由して繋ぎます。また、ターミナルが開いていると更新できませんので閉じてください

### 評価ボードの場合

USBケーブルでPCと評価ボードのUSB端子を繋ぎます

### DIP化基板の場合

以下の通りに繋ぎます。シリアル変換ボードにDTR端子があればRESETに繋ぎます(任意)

| シリアル変換ボード | - | LRA1のピン |
|:-----------------|:-:|:-----------|
| Tx | - | Rx(2番ピン) |
| Rx | - | Tx(3番ピン) |
| GND | - | GND (12, 13, 22, 34 のいずれか) |
| DTR | - | RESET (33番ピン) |

## アップデートツールの起動

ダウンロードしたzipファイルを解凍し、 `LRA1_Update_Tool.exe` を起動します

![001.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/1eadd636-ba07-ccf1-bbf2-03000500d807.jpeg)

アップデートツールの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/ddccff8d-068c-0fcd-d309-792ad5487fcb.png)

## 更新

1. LRA1に繋がっているCOMポートを選択します
2. ファームウェアのファイルを選択します
3. [UPDATE] ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/071f89e3-a010-f56d-aaa1-8e5d314a746a.png)

DIP化基板で DTR と RESETピン を繋いでいない場合は、 [UPDATE] をクリックした後に RESETピンとGNDピン を繋いで再起動させるか、電源を入れ直してください

更新が進み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/132bced7-4554-1a9c-397e-a87476010e02.png)

完了するとダイアログが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/c23dfeea-149e-6b78-1e61-8e94bf37d94b.png)

更新は数秒で完了しました。あっという間です

## 確認

ファームウェアが更新されたことを確認します

ターミナルを開いたらバージョンが表示されますのでバージョン番号が増えていることを確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/cb242c30-a425-6682-c5ef-591cf16693cc.png)

バージョンは `VERコマンド` でも確認できます。表示内容はターミナルを開いた時と同じですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/3168ec8c-8603-bb41-0154-0479465f0261.png)

入手した時のバージョンは以下でした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61404/778079ec-3cd4-be71-1442-071523d0d7f4.png)

ちゃんと更新されているようです
V380というネットワーク監視カメラをハックしたい!!


## TL;DR

V380というネットワーク監視カメラを買って、Linuxシステムへのアクセスを試みた記事。
結果うまくいかない。

## streaming test by VLC

user adminはsmartphone toolにて確認
パスワードは未確認

rtsp://ipAddr//live/ch00_1
rtsp://admin:password@ipAddr:554/
rtsp://admin:password@ipAddr:554/camID
rtsp://admin:password@ipAddr/user=admin&password=password&channel=1&stream=0.sdp?
rtsp://admin:password@ipAddr/channel=1&stream=0.sdp?
rtsp://ipAddr/user=admin&password=password&channel=1&stream=0.sdp?
rtsp://ipAddr:password@ipAddr:554/camID
rtsp://ipAddr:554/ch0_0.h264
rtsp://ipAddr:5050/ch0_0.h264


## port scan by nmap

$ nmap 192.168.0.30 -p1-60000

Starting Nmap 7.01 ( https://nmap.org ) at 2019-11-25 02:36 JST
Nmap scan report for 192.168.0.30
Host is up (0.015s latency).
Not shown: 59998 closed ports
PORT     STATE SERVICE
8800/tcp open  sunwebadmin
9800/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 19.02 seconds

## ONVIF Device Tool
https://www.lingodigit.com/onvif_nvc.html

ONVIF Device Tool is an ONVIF NVC software on Linux . ONVIF NVC(Network Video Client) is network clients (e.g., NVR) which can manage ONVIF NVT (Network Video Transmitters) devices (IP cameras and video servers). 

$ onvif-device-tool 
onvif-device-tool: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
(base) tadashi@ted ~/Downloads 
$ openssl version
OpenSSL 1.1.1d  10 Sep 2019
$ find /usr -name "libssl.so"
/usr/lib/x86_64-linux-gnu/libssl.so

## V380 SDk

https://github.com/brusdev/V380-SDK
GitHub PagesとJekyllを使ってポートフォリオページを作ろう②Jekyll構築編

前回
[GitHub PagesとJekyllを使ってポートフォリオページを作ろう①GitHub Pages構築編](https://qiita.com/H_Ny/items/07f6594ce33c1c547888)

今回はJekyllの環境構築編です。

参考にしている良記事様
- [GitHubPages + Jekyll 無料でWebページを作ってみた](https://qiita.com/koyo-miyamura/items/5ec89ac9689be49a55f6)
- [jekyllインストール](https://dev-yakuza.github.io/jekyll/installation/)


# Jekyllって？
**Webサイトを構成するHTMLファイル一式を出力する**ツールです。
特徴としては
・Rubyベースで動作する
・テーマを簡単に取得できる
・**MarkDownで書ける**
・**GitHubPagesが公式サポート**
といった感じです。MarkDownで書いたものをHTML出力してくれるみたいです。便利ですね。

# Jekyllの環境構築

## ①まずはRuby
（Mac前提）
JekyllはRubyベースなのでまずはRubyをインストールします。これについては良い記事がたくさんあるので割愛させていただきます。
こちらの記事を参考にしてください。(投げやり)
`homebrew`→`rbenv`→`ruby`の順番でインストールする感じです。
https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb

## ②Jekyllをインストール
`ruby -v`あるいは`rbenv versions`でrubyの生存確認とバージョンをチェックしておきましょう。
確認ができたら`gem install bundler jekyll`でJekyllをインストールします。
>※gemとはライブラリのことです。gemをインストール→ライブラリをインストールです。pip的なやつ。
>※Bundlerはgem管理のライブラリです。詳細は[こちら](https://qiita.com/3no3_tw/items/8c1e3e95c75edae1036d)


Jekyllの生存確認もしておきましょう。
`jekyll -v`

# Jekyll 使ってみよう
## ①Jekyllのプロジェクト作成
`jekyll new [プロジェクト名]`でプロジェクトを作成できます。
GitHub Pagesのリポジトリ名に合わせると良いでしょう。(\*\*\*.github.io)
カレントディレクトリにフォルダが作成されるので、あらかじめJekyll用のディレクトリを作ることをお勧めします。
**※リポジトリをクローンしても大丈夫です**
## ②Jekyllスタート
作成したプロジェクトディレクトリに移動し
`bundle exec jekyll serve`でJekyllを起動します。
起動したら`http://127.0.0.1:4000/`にアクセスします。
**Welcome to Jekyll!**と表示されたページにアクセスできれば成功です。




# 構築完了
これでJekyll構築は終了です。次回以降、実際にJekyllを使用してページを編集してみようと思います。
ありがとうございました。

前回→[GitHub PagesとJekyllを使ってポートフォリオページを作ろう①GitHub Pages構築編](https://qiita.com/H_Ny/items/07f6594ce33c1c547888)
次回→[]()
Dockerのインストール

#1. はじめに
　Dockerをインストールするにあたり、インターネットに接続できる環境での説明をします。

#2. 動作環境
CentOS7.7
　ベース環境　　　　　　　：サーバー（GUI使用）
　選択した環境のアドオン　：開発ツール
Docker　　　　　　　　　 ：19.03.8　Community Edition　2020/3/26 時点の最新版


#3.古いDockerがインストールされていないことを確認する

以下のコマンドで、dockderがインストールされていないことを確認します。

```bash
# yum list installed | grep docekr
```
※下記のいずれかが見つかれば、削除します。
　docker 
　docker-client
　docker-client-latest
　docker-common
　docker-latest
　docker-latest-logrotate
　docker-logrotate
　docker-engine

```bash
# yum remove (削除するモジュール名) ....
```

#4.Dockerのリポジトリを登録する

Dockerのインストール元のリポジトリを登録します。

```bash
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

#5.Dockerのインストール

下記のコマンドでDockerをインストールします。

```bash
# yum install docker-ce
```

上記により、同時に以下もインストールされます。
containerd.io
docker-ce-cli

また、dockerのものではありませんが、container-selinux　がインストールされていなければ、インストールされます。



#6.動作テスト

バージョン確認をします。

```bash


Dockerを起動します。

```bash
# systemctl start docker
```

インストールバージョンを確認します。

```bash
# docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:04 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:25:42 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```



hello world を実行します。
初回の実行は、hello-worldがローカルにいないため、ダウンロードしてきます。（2～6行目）
7行目の　Hello from Docker! 以降が表示されれば、正常に動作しています。

```text
# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

Dockerを停止します。

```bash
# systemctl stop docker
```


以上でDockerのインストールと動作テストが完了しました。


　参考：https://docs.docker.com/install/linux/docker-ce/centos/
EXCEL VBA 高速化クラス作成

## はじめに
前回にExcel VBAの高速化の記事を書きました。
[https://qiita.com/loach/items/3ae9100034ecf2d804ce](https://qiita.com/loach/items/3ae9100034ecf2d804ce)

今回は記事内で紹介している画面更新の設定のクラス化を書きます.
画面更新の停止をコンストラクタに書くことで、クラスをインスタンス化した時点で画面の更新を止めて高速化し、更新を有効化をデストラクタに書くことによってオブジェクトが開放された時点で自動的に更新を有効化することが出来ます。

前回の記事では通常のプロシージャでしたが今回はクラスという事でインスタンス化するためほんの少し処理負荷が大きくなりますが、本当に些細な差であり処理の最初に一回だけ実行するものである為、問題になることはないでしょう。
また、通常のプロシージャの場合、早期リターン等で終了条件が複数ある場合、そのたびに更新の有効化を明示的に書く必要がありましたがクラスのデストラクタの場合はその必要がありません。

※エラー等で処理が止まってしまった場合はデストラクタが実行されませんので注意してください.

## 高速化クラス作成
クラスモジュールを作成して以下コードを記入してください。
今回はクラス名は`Accelerator`としています。

```VB:Accelerator
Private Sub Class_Initialize()
    '画面の更新を停止
	With Application
        .ScreenUpdating = False
        .Calculation = xlCalclationManual
        .EnableEvents = False
        .Cursor = xlWait
    End With
End Sub

Private Sub Class_Terminate()
    '画面の更新を有効化
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalclationAutomatic
        .EnableEvents = True
        .Cursor = xlDefault
    End With
End Sub

Public Sub Init()
	' 宣言時にNewをした場合コンストラクタが走らないためこのプロシージャを使用する
End Sub
```

## 使用方法
処理の先頭でインスタンス化して下さい。

```VB:
Dim Ac As Accelerator
Set Ac = New Accelerator
```
宣言時に`New`をする場合は以下のように`Init`を使用してください

```VB:
Dim Ac As New Accelerator
Ac.Init
```

処理が終わりオブジェクトが開放された時点で画面の更新は有効化されます。
## 終わりに
以上がExcel VBA高速化クラスの作成方法です。
この記事を読んでくださりありがとうございます。

## 関連記事

- [Excel VBAの高速化](https://qiita.com/loach/items/3ae9100034ecf2d804ce?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)
- [VBAでよく使うプロシージャ(FileSystemObject)](https://qiita.com/loach/items/fcf3ffb4e445d1e89927?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
Pythonでクォータニオンをz-y-x系オイラー角に変換するコード書いてみた

# Pythonでクォータニオンをz-y-x系オイラー角に変換するコード書いてみた

クォータニオンからz-y-x系オイラー角の計算をしなければならなくなりました。

しかも、Python2.7で書かなければいけない案件なので、`scipy.spatial.transform.Rotation` みたいな便利なやつ使えません。



公式を調べてみたら、WikipediaにC++のサンプルコードが載っていました。

[Wikipedia / Quaternion to Euler Angles Conversion](https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_Code_2)



## Pythonで書いてみた

Wikipediaのサンプルコードを参考にして、Python2.7のコードを書いてみました。

```python
import math
import numpy as np
from pyquaternion import Quaternion

def quaternion_to_euler_zyx(q):
    """
    クォータニオンをz-y-x系オイラー角に変換する。

    Parameters
    ----------
    q : Quaternion
        クォータニオン(pyquaternion形式)

    Returns
    -------
    np.array
        z-y-x系オイラー角
    """

    # roll : x軸回転
    sinr_cosp = 2 * (q[0] * q[1] + q[2] * q[3])
    cosr_cosp = 1 - 2 * (q[1] * q[1] + q[2] * q[2])
    roll = math.atan2(sinr_cosp, cosr_cosp)

    # pitch : y軸回転
    sinp = 2 * (q[0] * q[2] - q[3] * q[1])
    if math.fabs(sinp) >= 1:
        pitch = math.copysign(math.pi / 2, sinp)
    else:
        pitch = math.asin(sinp)

    # yaw : z軸回転
    siny_cosp = 2 * (q[0] * q[3] + q[1] * q[2])
    cosy_cosp = 1 - 2 * (q[2] * q[2] + q[3] * q[3])
    yaw = math.atan2(siny_cosp, cosy_cosp)
    
    # オイラー角
    retrun np.array([
        math.degrees(roll), 
        math.degrees(pitch), 
        math.degrees(yaw)
    ])
```



## 依存ライブラリ

### numpy 1.16.6

ベクトル計算とかに使うやつです。1.16.6がPython2.7対応の中では最新っぽいです。



### pyquaternion 0.9.5

Quaternionの計算に `pyquaternion` 使ってます。

`numpy-quaternion` の方がnumpyと相性はよさそうなのですが、Python2.7環境だとインストールできませんでした。



## Python3以降ならscipy.spatial.transform.Rotationが楽

`scipy.spatial.transform.Rotation` を使えば、もっとシンプルに書けそうです。

```python
import numpy as np
from pyquaternion import Quaternion
from scipy.spatial.transform import Rotation as R

def quaternion_to_euler_zyx(q):
	r = R.from_quat([q[0], q[1], q[2], q[3]])
	return r.as_euler('zyx', degrees=True)
```

ただ、 `scipy.spatial.transform.Rotation` はPython2.7には対応してないみたいです。残念。



# さいごに

普段はUnityのz-x-y系オイラー角ばかり触ってるので、z-y-x系はかなり混乱しました。
本記事作成にあたり、以下の記事を参考にさせていただきました。ありがとうございました！

- [Wikipedia / Quaternion to Euler Angles Conversion](https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_Code_2)
- [かみのメモ / Python scipyのRotationモジュールで三次元回転を扱う](https://kamino.hatenablog.com/entry/scipy_rotation)
- [scipy.spatial.transform.Rotation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html)
(2)-2 カメラ回転実験 Quaternion.AngleAxis

##1. transform.Rotate()の続き

以前の記事は、取得したけどQuaternion全然使っていない事に気づきました。
Quaternionって軸で回すくらいの知識しか持ち合わせていないので実験してみたいと思いました。


###で、どういう事を実現したいのか？
###①Quaternionを宣言・取得したい
→現在の角度を手に入れるには、
`Quaternion myQuaternion = this.transform.rotation;`
👆左側、、、変数名（こだわり）はmyQuaternionに。
👆右側、、、アタッチしているオブジェクトの回転情報（transform.rotation）を入れてよと。

###②Quaternionを更新したい
####・マウスを加味して更新したいです。
　右に動かすとっての自身最大の武器GetAxisを使わずに。。

####・マウスを加味してってのは
`if (Input.GetKey(KeyCode.W))`
👆キーボードのWボタンを押したらで実装します。

####・AngleAxis関数の登場
`Quaternion rot = Quaternion.AngleAxis(2, Vector3.right);`
更新するのにいる「更新要素」みたいなものと理解しました。
👆左側、、、変数名rotに。
👆右側、、、毎秒2度dで、x軸を軸にして回転させる
ここで疑問が出た。x軸を軸にってVector3（1,0,0）をかけるって事？
いやこれオイラー角やん。。。こーゆうとこ蓋して進む。。。

####・そして最後に合成
`this.transform.rotation = myQuaternion * rot;`
👆左側、、、自分に
👆右側、、、自分に「更新要素」のrot変数をかけて代入してくれ。

####、、、感動、、、
![01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/17bf1ab1-efa5-b1b6-9119-959456a2e1f4.jpeg)
![02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/88dcf5b5-8f3c-dd4d-3157-957f92c5e8e5.jpeg)

動かせました。ちょっとだけ。。

####・そして最後に
`Quaternion rot = Quaternion.AngleAxis(2, Vector3.right);`
の末尾のrightを変えると違う方向に回転してくれます。
right、left、up、downは使う感じあるけど
他は入れてみると挙動に驚く仕上がりに。。。

Vector3.zero; →　Vector3(0,0,0) 不動
Vector3.right; →　Vector3(1,0,0) 上回転
Vector3.left; →　Vector3(-1,0,0) 下回転
Vector3.up; →　Vector3(0,1,0)　右回転
Vector3.down; →　Vector3(0,-1,0) 左回転
Vector3.forward; →　Vector3(0,0,1)　右回転、地球が
Vector3.back; →　Vector3(0,0,-1)　左回転、地球が
Vector3.one; →　　Vector3(1,1,1)　んー、なんともいえない右回転、

```csharp

    void Update()
    {
        if (Input.GetKey(KeyCode.W))
        {
//Quaternionで回転するとこ
            Quaternion myQuaternion = this.transform.rotation;
            Quaternion rot = Quaternion.AngleAxis(2, Vector3.zero);
            this.transform.rotation = myQuaternion * rot;

//オイラー角をDebug.Logで。　
            float quat_x = myQuaternion.eulerAngles.x;
            float quat_y = myQuaternion.eulerAngles.y;
            float quat_z = myQuaternion.eulerAngles.z;
            Debug.Log("X=" + quat_x);
            Debug.Log("Y=" + quat_y);
            Debug.Log("Z=" + quat_z);
        }
    }
}
```


##参考にさせて頂いたサイトです；感動をありがとうございました。
[【Unity】Quaternionでオブジェクトを回転させる方法]
(https://xr-hub.com/archives/11515)
[【Unity】Vector3の使い方とオブジェクトの移動や回転を表現する方法]
(https://xr-hub.com/archives/12115)
Raspberry Pi4 (Raspbian Buster)をWPA2エンタープライズのWi-Fiにつなげてみた

#はじめに
Raspberry Pi３（Raspbian Stretch）をWPA2エンタープライズに繋げる方法は多くの方が紹介されておりますが、Raspberry Pi４（Raspbian Buster）における方法を見かけなかったので備忘録として投稿します。

#環境
デバイス：Raspberry Pi4 ModelB 2GB
OS：Raspbian Buster
アクセスポイント：Cisco Meraki MR33
※自前RADIUSサーバーが無いため、「Meraki Cloud Authentication」を使用。

#設定その１（wpa_supplicant.confの編集）
sudo nano(またはお好きなエディタ) /etc/wpa_supplicant/wpa_supplicant.conf　でファイルを編集します。

```ruby:wpa_supplicant.conf編集後
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
	ssid="<接続したいSSID名>"
	proto=RSN
	key_mgmt=WPA-EAP
	pairwise=CCMP
	auth_alg=OPEN
	eap=PEAP
	identity="<接続するためのユーザー名>"
	password="<パスワード>"
	phase1="peaplabel=0"
	phase2="auth=MSCHAPV2"
	priority=1
}
```
最初の３行はデフォルトで入っていると思いますので、「network=」の行から追記します。
また、パスワードは平文で入力しています。セキュリティ面で不安な方はhash化するなどしてください。

OSがRaspbian Stretchですと、上記の様にwpa_supplicant.confを編集することでWPA2エンタープライズのWi-Fiに繋げられました。
しかしRaspberry Pi４（Raspbian Buster）で実施したところ、接続→切断→接続...を繰り返し、しまいにはDHCPで割当たるはずのIPも「169.254.xx.xx」と失敗してしまいました。
ググっていたところ、フォーラムでも同じ事象に出くわしている方がおり、記事に書かれていた対処法（後述）を実施したところうまく接続できました。

*Raspbian Buster - WiFi WPA2 enterprise broken?*
https://www.raspberrypi.org/forums/viewtopic.php?t=247310
 
#設定その２（dhcpcd.confの編集）
**フォーラムに記載されていた対処法になります。**
sudo nano(またはお好きなエディタ) /etc/dhcpcd.conf　でファイルを編集します。

```ruby:dhcpcd.conf編集後
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

~中略~

interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=8.8.8.8
static domain_search=
noipv6

interface wlan0
env ifwireless=1
env wpa_supplicant_driver=wext,nl80211

```
**末尾３行の部分を追記してください。**
家の環境では有線NICのアドレスを固定で使用していますので、eth0の設定情報も書かれています。

wlan0部分を追記した後、Raspberry Piの再起動をしたところ自動的にWPA2エンタープライズのWi-Fiにつながるようになりました:relaxed:

#参考
以前、Raspberry Pi ZeroをWPA2エンタープライズのWi-Fiにつなげた際に参考にさせていただいた記事です。今回のRaspberry Pi４でも同様の方法となります。
*Raspberry Pi3でWPA2-EAP(PEAP)なWi-Fiに接続する*
https://qiita.com/YasuhiroABE/items/1c8ac9e5636b28565c4b


家のMerakiでWPA2エンタープライズのWi-Fi環境を作った際は以下のサイトを参考にしました。
*Configuring WPA2-Enterprise with Meraki Authentication*
https://documentation.meraki.com/MR/Encryption_and_Authentication/Configuring__WPA2-Enterprise_with_Meraki_Authentication
RailsをDockerを使って始める

これ以降，`app_name`は任意のプロジェクトの名前に置き換えること．
# 最初の準備
app_name/の下に以下の5つのファイルを用意する
- Gemfile
- Gemfile.lock
- entrypoint.sh
- Dockerfile
- docker-compose.yml

```ruby:Gemfile
source 'https://rubygems.org'

ruby '2.5.1'

gem 'rails', '~> 5.2.3'
```

```ruby:Gemfile.lock
(空でいい)
```

```bash:entrypoint.sh
#!/bin/bash

set -e

rm -f ./tmp/pids/server.pid

exec "$@"
```

```dockerfile:Dockerfile
FROM ruby:2.5.1
ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends \
    build-essential \
    libpq-dev \
    nodejs     

ENV APP_DIR /app_name
RUN mkdir -p APP_DIR
WORKDIR $APP_DIR

COPY Gemfile $APP_DIR
COPY Gemfile.lock $APP_DIR

RUN gem install bundler && bundle install
COPY . $APP_DIR

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
```

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - sql-data:/var/lib/mysql
  web:
    build: .
    tty: true
    stdin_open: true
    ports:
      - "3000:3000"
    volumes:
      - .:/app_name
      - gem-data:/usr/local/bundle
    depends_on:
      - db
volumes:
  gem-data:
  sql-data:
```

# プロジェクトを起動する
app_name/の下で以下の作業をする

1, プロジェクトを作成：

```
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```

2, passwordの設定：

```
$ grep -l 'password:' config/database.yml | xargs sed -i.bak -e 's/password:/password: password/g'
```

3, host名の置き換え：

```
$ grep -l 'host: localhost' config/database.yml | xargs sed -i.bak -e 's/host: localhost/host: db/g'
```

4, コンテナをビルド：

```
$ docker-compose build
```

5, コンテナ内のbundle install：

```
$ docker-compose run web bundle install  
```

6, DBを作成

```
docker-compose run web rails db:create
```

7, コンテナの起動：

```
$ docker-compose up
```

localhost:3000でアクセス

<img width="1361" alt="Screen Shot 2020-03-26 at 21.19.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435539/f9c8a3db-8f19-e07f-4f65-c292991ba1d9.png">
文系未経験1年目の新卒が1年を振り返る。

<h1>概要</h1>
19卒の文系未経験SESエンジニアが1年間を振り返って感じた諸々を記録に残しておこうのコーナーです。備忘録として書いていますが、主に未経験の方が対象の記事です。
以下の前提をご念頭に、何かの参考までに流し見でもしていただければと思っています。

**【筆者入社時の初期ステータス】**
・ガチンコで何も知らなかった(PC=モニターと思ってた、ネットサーフィンがギリできる有様)。
・研修は3ヶ月間あったので、現場には夏ごろから参画。でも中身はほぼほぼ素人状態。
・毎日どうにか追い付こうと頑張るも、まず何が分からないのか分からず毎回頭がショートして結果何も進まず。

完全に詰んでました。研修も現場も含め、入社半年は死んでいたも同然状態でしたね。
そういう人間が書いているので、もし似たような境遇の人がいらっしゃれば参考にしてください。これから現場に出るという新人さんや未経験の方も是非！

<h1>研修時期(4～6月)</h1>
3ヶ月程度の研修がある会社さんなら大体はこのスケジュールにおさまっていることでしょう。
正直この期間はかなりきつかったです。というのも、圧倒的な**専門用語の知識不足**で都度、思考がストップしていたのです。

要は、
**①説明を受けたとき、知らない単語に遭遇。**
**②その知らない単語に脳が引っ張られ続ける。頭の中でずっと「それどういう意味？」状態のまま後の説明が入ってこず。**
**③あとで何回も聞きなおしてしまい、「さっき説明したよね」と言われる始末。**

この負のスパイラルが約2ヶ月ちょい続いていたような感じでした。知らないことを知らないと発信するのも大変重要なのですが、前提として「知らない単語」を限界まで減らす努力が大切です。

筆者は毎日研修が終わった後はひたすら復習や勉強をしていました。おそらく2割も理解できていませんでしたが苦笑

ちなみに、当時(というか今も)未知の用語と遭遇した際、こちらのサイトで大変お世話になっていました。

**●「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典**
**・https://wa3.i-3-i.info/**

こういう、業界の人でなくとも理解しやすい入門サイトがこれからもどんどん増えてくればいいなと思っています。というか、自分がそういうコンテンツを生み出せるようにがんばろう()
<br>
また、自分が苦手だったというのもあるのですが、この時期はDB(SQL)を中心に学習をしていました。
DBってなんか得体の知れない何かだったんですよね…今になってやっててよかったって思えるんですが笑
とはいえ、内容は何でもいいんですが、**とりあえず、何か一つ「これならわかる！」みたいな分野をつくっておく**としんどい時、心の拠り所になります。精神衛生を一定に保つ意味でも効果ありです。かなりオススメ。
<br>
~~**丸腰で立ち向かう我々初心者に世間は甘くないと心得て頑張りましょう()**~~
<h1>いざ現場へ(夏頃～翌3月末)</h1>
研修もなんとかこなしてようやく現場入りです。

期間としては約8ヶ月といったところで、主な業務は所謂**テスト**と呼ばれるものでした。
Excelにスクショを張りつけてシステム運用や保守の方、お客さんに提示できるようにするための証跡集めをするアレですね。

業界内部(特にWeb系とか)では「Excel職人」とか大変揶揄されがちなお仕事ですが、個人的に学びは多かったと感じています。

確かにスキル的な面で身に付くものはほとんどないですし、単純作業をひたすらに続けるので、頭がおかしくなりかける時もたくさんありました笑

ですが、ものすごい重要なお仕事なんです。テスト。(これが言いたかっただけ)
<br>
閑話休題()()()
ここで学んだのはテストがどうこうというより、**「最初だからこそ業界内での視野を広く持とう」**ということでした。

私自身、担当フェーズは違えど、このお仕事の共通のゴールは**「質の高いシステムをお客さんに納品して、課題解決のために使って役立ててもらうこと」**だと思っています。
そのために要件定義も設計も開発もテストも運用も保守も存在しているわけです。無駄な~~作業はあれど~~お仕事などないのです。

技術ファーストも大変結構ですが、**「お客さんの課題解決のための最適解は何なのか」**といったビジネス目線で自分の業務を見つめると、見える景色が少しずつ変化してくると思います。
<br>
なぜ、事務的な作業が多いのか。
なぜ、大規模システムではアジャイル的な開発手法を取れないのか。
なぜ、炎上や技術的負債/知識の属人化が生じるのか。
なぜ、海外諸国とは違って日本では「外注」が当たり前なのかetc.
<br>
勉強は技術に限りません。
業界の仕組みや資金の流れなどを体系的に、構造的に捉えて考察しながら業務を行うこともエンジニアの大切な教養になっていきます。

この期間はそういう視点を持って業務に取り組んでいました。そのため、単純作業もただの作業で終わることはなかったです。

今、こうして記事に残せているのでそれだけでも価値はあったかなと思っています。
きっと、あらゆる場面から生じる様々な問いに対して、答えは無数に存在していることでしょう。
しかし、その一つ一つ理解しながら業務を進めていけたら仕事もグッと充実してくるのではないでしょうか。

~~**え？そもそも勉強自体したくない？そうかあ、じゃあ仕方ないなあ…**~~
<br>
その他の雑多な所感としては、
・思った以上に自由が多い
・技術は自分から進んで身につけるべし
・かなりの経験年数ゲー etc.
主にこんなところです。

急に中身が薄くなり恐縮です()

しかし、私が現場を通じて体感したことは既に先人たちも須らく経験しており、それぞれに自分たちなりの回答をもっています。

業務的な学びと並行して、色々な先輩エンジニアの方々と意見を交わしてみましょう。
ものっっっそい楽しいです笑

<h1>1年で変わったエンジニアのイメージ</h1>
**【学生時のエンジニア像】**
・プログラミングずっとしてる
・超絶むすいことしてるから一部の賢い層しかできないワーキングスタイル
・残業に次ぐ残業+薄給で、どブラック
・突然客先社員から(物理的に)ボコボコにされる←ほぼ被害妄想
<br>
とまあこんなイメージしかなかったのですが、
<br>
**【現在のエンジニア像】**
・開発工程は全体のほんの一部らしい
・超絶むずいことは既に先人たちがやってくれてるから誰でもできる仕事もたくさんある
・今そんな過激な労働強いたら監査入ってアウトになる(まだそういうヤバい会社は多いでしょうが)
・私たちビジネスパートナーには基本優しい
<br>
こんな風に変わりました。そして色々な実情を知りました。

エンジニアのお仕事はとっても素敵で楽しいものです。
そして、勉強はテクノロジーにとどまりません。

文系卒で経験が非常に浅い私ですら、これほどワクワクする世界です。

お客さん目線/ビジネス目線を忘れずに「もたらす」思考のエンジニアを目指して今後もがんばりたいと思います。

長文・乱文失礼しました。これまでお付き合いいただきありがとうございます。m(_ _)m
laravelでseedを使っていてIntegrity constraint violation:1452エラーが表示された時

表題の件、今日だけで２回つまづいたので自分のためにも残しておきます！
laravelのseedを使っていて下記のエラーが出てしまった時は、<b>外部キー元のテーブルに当該キーのデータがあるか</b>確認しておきましょう。
無いとエラーになります。
灯台下暗しでした汗

```
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 
```
TypeScript で any や as を使わなくても型チェックをすり抜けてしまう話(Optional Propertyの危険性)

## 要約

作られた場所がはっきりしない値の Optional Property にアクセスするときは、 undefined でないことのチェックではなく、積極的な型チェックが必要。

## 実例

```typescript
type A = {
  b: boolean;
  n: number;
  s: string;
}

type B = {
  b: boolean;
  n: number;
}

type C = {
  b: boolean;
  n: number;
  s?: number;
}

const a: A = { b: true, n: 10, s: 'text' }; // OK
const b: B = a; // A は {b: boolean, n: number} を満たすのでOK
const c: C = b; // おや……？ TypeScript の様子が……

if (c.s !== undefined) { // number|undefined -> number に絞り込み
  console.log(c.s.toFixed(10)); // 実体は string なので実行時エラー
}
```

## 結論

Optional Property にアクセスするときは、消極的な non-undefined チェックによる絞り込みではなく、積極的な型チェックをしましょう。

```typescript
const a: A = { b: true, n: 10, s: 'text' }; // OK
const b: B = a; // A は {b: boolean, n: number} を満たすのでOK
const c: C = b; // おや……？ TypeScript の様子が……

if (typeof c.s === 'number') { // 積極的チェックで安心
  console.log(c.s.toFixed(10)); // 通らない
}
```

## 補足

オーバーロードも単なるアサーションなので気を付けましょう。

```typescript
function foo(s: string): string;
function foo(n: number): number;
function foo(v: string | number): string | number {
  // オーバーロードの定義とは逆の型の値を返せちゃう。
  return typeof v === 'string' ? Number(v) : String(v);
}

console.log(foo(5).toFixed(10)); // 実行時エラー
```

## 実際に起こりそうなパターン

```typescript
type A = {
  n: number;
  s: string;
};

const trans = (b: { n: number; s?: number }): void => {
  b.s = 5;
};
const trans2 = (a: { n: number }): void => {
  trans(a);
};

const a: A = { n: 5, s: 'text' };

trans2(a); // A の部分型を期待する関数にaを投げたら……

console.log(a.s.toUpperCase()); // 実行時エラー, 型が壊れていた
```
AWS CDKのスタックをGitHubからCodePipeline連携で自動更新する

LambdaをGitHubの1つのリポジトリでまとめて管理する時などに、AWS CDKで管理して、
CodePipeline連携で自動更新できると便利だと思ったので作成しました。

##環境
CDK CLI: 1.27.0

## コード
CDKリポジトリの`lib`ディレクトリ内に以下のtsファイルを作成します。

```cdk-pipeline-stack.ts

import * as cdk from '@aws-cdk/core';
import * as codebuild from '@aws-cdk/aws-codebuild'
import * as codepipeline from '@aws-cdk/aws-codepipeline'
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions'
import * as iam from '@aws-cdk/aws-iam'

export class CdkPipelineStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const build = new codebuild.PipelineProject(this,'testBuild',{
      buildSpec: codebuild.BuildSpec.fromObject({
        version: '0.2',
        phases: {
          install: {
            commands: [
              'npm install -g aws-cdk@1.27.0',
              'npm install -g typescript'
            ]
          },
          pre_build: {
            commands: 'npm i'
          },
          post_build: {
            commands: [
              'cdk deploy --require-approval never'
            ]
          },
        },
      }),
      projectName: 'cdk-deploy'
    })
    build.addToRolePolicy(new iam.PolicyStatement({
      resources: ['*'],
      actions: ['*']
    }))
    const sourceOutput = new codepipeline.Artifact()
    const repositoryName = '管理したいGitHubのリポジトリ名'
    const owner = 'リポジトリの所有者名'
    const oauthToken = 'GitHubのトークン'
    const branch = 'master'

    const sourceAction = new codepipeline_actions.GitHubSourceAction ({
        actionName: 'Github_Source',
        owner: owner,
        repo: repositoryName,
        branch: branch,
        oauthToken: cdk.SecretValue.plainText(oauthToken),
        trigger: codepipeline_actions.GitHubTrigger.WEBHOOK,
        output: sourceOutput
    })

    const buildOutput = new codepipeline.Artifact()
    const buildAction = new codepipeline_actions.CodeBuildAction({
      actionName: 'CodeBuild',
      project: build,
      input: sourceOutput,
      outputs: [buildOutput]
    })

    new codepipeline.Pipeline(this, 'pipeline', {
      pipelineName: 'cdk-deploy-pipeline',
      stages: [
        {
          stageName: 'Source',
          actions: [
            sourceAction
          ],
        },
        {
          stageName: 'Build',
          actions: [
            buildAction
          ],
        }
      ]
    })
  }
}

```
このスタックをデプロイすると、CodePipelineが作成されます。
対象となるGitHubのリポジトリのmasterブランチの更新を契機に、
`cdk deploy`が実行されて、対象リポジトリのスタックが更新されます。
Google Chromeとウィルスバスターの組み合わせで一部サイト表示が著しく遅くなっていた

2020年3月に入ってからGoogle Chromeでネットサーフィンしていると一部サイトの表示が著しく遅い。

体感的にはJavaScriptで非同期読み込みするサイトやストリーミング配信をしているサイトが遅いことが多かったように思う。

# 事象

WEBブラウザが一時的にフリーズしたりするのは稀にある話だが、
2020年3月以降、ネットサーフィンに支障が出るくらいにはその現象が多発していた。

それもちょっとページレンダリングが遅いなんてものではなかった。
一部のサイトに至ってはアクセスしてから5分以上ページレンダリングされなかった。

SPAサイトではページの読み込みが中途半端に止まってしまうなんてこともあった。

# 結論

ウィルスバスターがGoogle Chromeに干渉していたのが原因と思われる。
明確な原因は分からないがウィルスバスターを

先ほど見つけたサイトではウィルスバスターの再インストールで改善されると書かれていた。
ライセンス料は払っているのでとりあえず再インストールでウィルスバスターとGoogle Chromeが共存できる状態になったのでしばらく様子を見る。

https://blognote01.com/virusbuster-omoi

* 2020年3月27日追記

    再インストール後、端末を再起動するまでは問題が再現しなかったが、再起動後再発するようになった。

    ウィルスバスターを停止してWindows Defenderで使用をすることにする。

    ウィルスバスターはインストールされているとWindows Defenderによる保護が出来ないため、
    アンインストールした。再びインストールするかは不明。

# 傾向と対策終わり

結論と事象は先に書いた通り。

同じ問題に遭遇した人で問題解決の糸口を探してこの投稿にたどり着いたのであれば、
これ以上は有益情報が無いのでブラウザバックを推奨します。

# 切り分け

事象が発生するサイトの傾向からJavaScriptによるAjax通信など、
ページアクセス後にも外部と通信するような時に調子が悪くなるので
何かが干渉しているとあたりをつけて原因の調査を開始。

とりあえずページ表示が遅いサイトでデベロッパーツール開いてパフォーマンスを確認してみると、
ネットワークからのリソース取得はすぐに終わっている。

レンダリング周りの処理が始まったあたりから時間がかかっているようだった。

## 拡張機能の無効化

有効化と無効化を気軽にできるところから手を伸ばす。

拡張機能を片っ端から無効化していくが効果なし。

##　シークレットモード

状況変わらず。事象は再現する。

## キャッシュデータの削除

Chromeの拡張機能で終了時にキャッシュデータはあらかた削除されるようにしているが、
一部のサイトのためにCookieは削除対象外にしていた。

念のため消してみようと思い、Chromeの設定画面から「閲覧履歴データの削除」から全期間のデータを削除しようとすると
「Cookieと他のサイトデータ」が5,000件を超えている。

ちょっと多くないかと思いながらも削除を開始したが、10分以上経過しても終わる気配がない。

15分程度経過したところで設定画面を開きすと、「Cookieと他のサイトデータ」は10数件しか減っていない。

流石におかしい、Chromeが壊れた可能性を考える。
しかし、データリセットや再インストールでユーザーデータや拡張機能を揃えなおすのは面倒なので避けたいというのが本音だった。

## 別のブラウザ

とりあえず別のブラウザでも同じような現象が発生するか確認する。

使っているWindows 10 OSの端末にはChromeを除くとChromeベースのEdgeしかない。

新しいブラウザインストールするほどの事も無いと考えEdgeでストリーミング配信サイトで配信動画を視聴する。

ページ表示はちょっと遅いと感じたが普段Edge使っていないので速度感が分からない。

動画視聴続けていると1分経過したあたりから音声は流れているが動画がフリーズするという状況が定期的に発生するようになる。

とりあえずChromiumベースだと駄目かもしれないと判断してWEBブラウザ以外を落としていくことにする。

## アンチウィルスソフト

Windows 10ならWindows Defenderで十分という話をよく聞くが、
ライセンス期間が残っていたので引き続き端末で稼働を続けている。

アプリケーションで問題が発生し、その内部で原因が見つからなかったとき、
とりあえず停止して様子を見るべき存在なので、真っ先に停止した。

今まで時間がかかっていたWEBサイトの閲覧が快適になる。

今回の事象の原因になる。

# 現状

とりあえず停止したままだとノーガードでネットに接続し続けることになる。

Windows Defenderはずっと停止し続けていたので、切り替えるにしてもアップデートなどがいるのか調べようとしたところ
結論に書いたサイトに行き当たる。

ウィルスバスターの再インストールを実施すると事象が再現しなくなったので、取り合えずもうしばらく様子見をする。

また動作が怪しくなったら時間を取ってWindows Defenderに移行しようと思う。
Kaggle  COVID19 Global Forecasting

Kaggle で公開されているデータ・セットで日本の情報を得る方法です。

[COVID19 Global Forecasting (Week 2)](https://www.kaggle.com/c/covid19-global-forecasting-week-2)

データの読み込み

```text
data = pd.read_csv('../input/covid19-global-forecasting-week-2/train.csv')
```


今までの日本の感染者数の表示 (３月２５日で 1307 人)

```text
data.loc[data['Country_Region'] == 'Japan']
```

![kaggle_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/60f2c76b-5cae-ded3-557d-1a5d9cf6837d.png)

今後の感染者数の表示　（ある方が作成したモデルを使った場合）

```text
test_data[test_data['Country_Region']=='Japan']
```
![kaggle_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0814f263-b285-becb-5824-35ea93b6cfe5.png)
音声録音ツールにおける利用環境構築

# 音声録音ツールにおける利用環境構築



## 利用するソフトウェア・機器について

- マイクとオーディオインターフェース（Yamaha Steinberg）





## マイクとオーディオインターフェース（Yamaha Steinberg）

### 注意事項

特になし



### 環境構築

1. Steinbergの[ダウンロード](https://japan.steinberg.net/jp/support/downloads/yamaha_steinberg_usb_driver.html)より最新版のドライバーをダウンロードし、インストールします。
![image-20200324214741591.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3e93e581-d8f3-13b6-d18b-552c84e862c6.png)



2. マイクにケーブルを接続します。
![image-20200324221317892.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5a687f09-744a-0b8b-bceb-682a107aa349.png)




3. オーディオインターフェースの表面にある、「1」にマイクに接続したケーブルの反対側を接続します。
![image-20200324221331479.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/83977576-cbec-d04f-bacf-c109c56c4406.png)




4. オーディオインターフェースの裏面にある「USB 2.0」に、USBケーブルを接続します。
![image-20200324221421217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8ad5ea80-71bb-578e-f2b0-7faba565a8eb.png)

5. PCにオーディオインターフェースへ接続したUSBケーブルの反対側を接続します。
![image-20200324221626167.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4840f25e-7fb4-5668-9fee-f9fe5708e0ed.png)


6. 検索チャーム（Windowsボタン+Q）を表示して、「サウンドの設定」と入力し、「サウンドの設定」をクリックします。
![image-20200324220226432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8f3e3a9d-9465-1b09-1328-56037c85b59f.png)




7. 「出力デバイスを選択してください」および、「入力デバイスを選択してください」の項目を選択し、Steinbergのドライバーに設定します。
![image-20200324220247151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7cd7a0bf-5ab6-6d4a-744c-13da33d0690d.png)



8. 「入力」領域にある、デバイスのプロパティを選択します。
![image-20200324220315894.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/730f6b86-b3c1-0a5a-6c7c-b21a7bc194b5.png)



9. 「追加のデバイスのプロパティ」を選択します。
![image-20200324220653486.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/690a2c74-7c74-3095-ae32-3b6c8833d7ed.png)




10. 「聴く」タブを選択後、「このデバイスを聴く」にチェックを入れて、「このデバイスを仕様して再生する」の項目にて音声を出力したいデバイスを選択し、「適用」をクリックします。今回の例では、スピーカーで出力したいため、「スピーカー」を選択します。
![image-20200324220737264.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4f0f100c-cb60-0c17-cf62-3f2333394fb2.png)



### 基本操作

1. スピーカーにて出力できることを確認するため、「このデバイスを仕様して再生する」にて「スピーカー」に設定し、「適用」をクリックします。その後、マイクに話した内容がスピーカーにて出力されることを確認します。
![image-20200324221008332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/45915a19-35f6-71c8-293e-321576a8027f.png)

### エラー時の対応

特になし



以上
デスクトップ画面メモ記載機能における利用環境構築

# デスクトップ画面メモ記載機能における利用環境構築

## 利用するソフトウェア・機器について

- gInk（無料）
- Epic Pen（有料）


下記の利用を検討しましたが、上記ソフトウェアで代替できるため、利用対象としないこととしました。

- [ZoomIt](https://docs.microsoft.com/ja-jp/sysinternals/downloads/zoomit)



## gInk

### 注意事項

特になし



### 環境構築

1. Git Hub上の[geovens/gInk/releases](https://github.com/geovens/gInk/releases/)より最新版のZIPファイルをダウンロードし、所定のフォルダにZIPファイルを解凍します。
![image-20200324182003518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a66ef376-1204-d8ef-95eb-d443526deb97.png)


2. 解凍したフォルダにある`gInk.exe`を実行します。
![image-20200324184427326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/aeeb0fe3-f966-a5c1-7f24-0c2747182cac.png)




3. 「WindowsによってPCが保護されました」と表示された場合、「詳細情報」をクリックします。
![image-20200324184618477.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/154bd963-075a-9660-dc2b-6e5103506fa2.png)



4. 「実行」をクリックします。
![image-20200324184648113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2f04dc70-0bff-7f0c-5332-f27419be48fe.png)



5. gInkアプリケーションは常駐アプリケーションソフトとして実行されます。タスクバーのインジケーターにある「gInk」をクリックします。
![image-20200324184733788.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f228ab75-fab0-5bce-05c7-aad15f463007.png)




6. デスクトップ下部に、gInkの操作画面が表示されていることを確認します。
![image-20200324185527765.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7eccd308-3677-cb78-f0c8-7a1c9513f19a.png)



### 基本操作

1. [リンクの記事](https://freesoft-100.com/review/gink.html)を参考に、画面上にメモを記述できることを確認します。	
![image-20200324185058100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4a33af6d-57c3-8feb-1fc5-f8611a41f49e.png)
![image-20200324193412896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/246eddbb-09af-ea85-1bab-3ce464712e78.png)



### エラー時の対応

特になし

## Epic Pen
### 注意事項

商用利用をおこなうためには、Epic Penの[DOWNLOAD & LICENSE OPTIONS](https://epic-pen.com/#download)ページより、有料ライセンスの購入が必要となります。
![image-20200324192236181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/843ecea4-b322-5748-fcbd-be454a5bcf2a.png)



### 環境構築

1. Epic Penの[DOWNLOAD & LICENSE OPTIONS](https://epic-pen.com/#download)よりファイルをダウンロードし、インストールします。
![image-20200324192236181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c24240f5-e680-954d-1837-56c37ee44188.png)



2. Epic Penのアプリにある「menu -> setting」を選択します。
![image-20200324192924522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b3634309-7e01-408c-b7a6-9de9f0649761.png)



3. 「Language」にて、「Japanese」を選択します。
![image-20200324192951486.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7297f517-84ed-eab0-067d-7443308dc1a0.png)



### 基本操作

1. [リンクの記事](https://himeb.com/epicpen/)を参考に、画面上にメモを記述できることを確認します。	

![image-20200324193133417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3aabb488-cc9d-5514-c04e-abafc97ef13b.png)
![image-20200324193412896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ba43f134-104d-f0fb-8d78-f991f96ee6fb.png)



### エラー時の対応

特になし



以上
液晶ペンタブレットにおける利用環境構築

# 液晶ペンタブレットにおける利用環境構築

## 利用するソフトウェア・機器について

- Huion Kamvas GT-191 V2



## Huion Kamvas GT-191 V2

### 注意事項

特になし



### 環境構築

1. Huion社の[Driver & Manual](https://www.huion.com/index.php?m=content&c=index&a=lists&catid=16&myform=1&down_title=GT-191+V2)ページより、使用するPCに対応したOSのドライバーをダウンロードし、インストールを実施します。
![image-20200324175257745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/25bb3abf-5c4c-35e7-46e8-c3c0275ee1e6.png)






2. HDMIケーブルとUSBケーブルを、KamvasとPCに接続します。
![image-20200324181204401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dd6e0d54-6ab6-10fb-4b97-3bfe231d8542.png)




3. Kamvasのディスプレイに、デスクトップ画面が表示されていることを確認します。
![image-20200324181306653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0bc5d86a-5444-9cb1-a970-fd77c68c507a.png)





### 基本操作

1. Huion Tabletアプリケーションを起動し、サイドバーの「作業領域」を選択します。次に、上部にある「この画面を選択」からHuion Tabletのスクリーンを選択し、「適用」ボタンをクリックします。
![image-20200324181600771.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e012c4cc-6474-a429-6c6d-86a7190ee42f.png)



1. PC標準の描画アプリ（例:Windows ペイント）を起動し、Kamvas専用のペンにてディスプレイに描画できることを確認します。
![image-20200324181600772.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6da376ac-5c9f-2c59-d000-af38c3fcf3c1.png)



### エラー時の対応

特になし



以上
MySQLへの接続、SQL文の実行

今日は、**MySQLへの接続**と**SQL文の実行**コマンドを紹介していきます！
ターミナルでコマンドを実行してみましょう＾＾

###mysqlへ接続する

```
mysql -u root
```
ターミナルに以下のように表示されていれば、正常に接続できています

```
mysql>
```

###データベース一覧を表示する

```
SHOW DATABASES;
```
**＊SQL文は必ず、終わりにセミコロンをつける必要があります！**
もし；(セミコロン)を忘れて入力してしまった場合は、以下のようになります

```
mysql> SHOW DATABASES
         -> 
```
セミコロンを忘れて実行すると、SQLがまだ続くとみなされてしまいます
こうなった場合は、**セミコロンのみを入力してエンターキー**を押すと、正常に実行されます＾＾

実行後は、これまで作ってきたデータベースが一覧になって表示されます！

```
mysql> SHOW DATABASEs;
+-------------------------------------+
| Database                            |
+-------------------------------------+
| information_schema                  |
| DataBaseDesignSample_development    |
| DataBaseDesignSample_test           |
| chat-space_development              |
| chat-space_test                     |
| comment-box_development             |
| comment-box_test                    |
| drill_app_development               |
| drill_app_test                      |
| effective_model_sample_development  |
| effective_model_sample_test         |
| exception_sample_development        |
| exception_sample_test               |
| exp-exam-pictweet_development       |
| exp-exam-pictweet_test              |
| exp-html-exam_development           |
| exp-html-exam_test                  |
| freemarket_sample_68a_development   |
| freemarket_sample_68a_test          |
| git-app_development                 |
| git-app_test                        |
| mini_sns_development                |
| mini_sns_test                       |
| mysql                               |
| our_blog_development                |
| our_blog_test                       |
| ourblog_exam1_development           |
| ourblog_exam1_test                  |
| ourblog_exam3_development           |
| ourblog_exam3_test                  |
| performance_schema                  |
| pictweet4_development               |
| pictweet4_test                      |
| pictweet_development                |
| pictweet_exam1_development          |
| pictweet_exam1_test                 |
| pictweet_exam2_development          |
| pictweet_exem_retest_development    |
| pictweet_exem_retest_test           |
| pictweet_test                       |
| pictweet_workshop_exam_development  |
| pictweet_workshop_exam_test         |
| practice-exam-pictweet2_development |
| practice-exam-pictweet2_test        |
| reverse-app_development             |
| reverse-app_test                    |
| search_pictweet_development         |
| search_pictweet_test                |
| sql_curriculum_development          |
| sql_curriculum_test                 |
| sqltest                             |
| test                                |
| todo_app_development                |
| todo_app_test                       |
| view_drill_development              |
| view_drill_test                     |
+-------------------------------------+
56 rows in set (0.03 sec)
```

これでどんなデータベースがあるのか確認することができましたね！
次回は、**データベースを作成する**ためのコマンドを紹介したいと思います＾＾
AWS(MySQL)

##Railsとデータベース
今回はRailsからアクセスされるデータベース関連のデータベースを作成します。
Ruby on RailsのようなWebアプリケーションフレームワークにとって、データベースはセットで考えます。例えばTwitterで考えてみると、データベースがなければ、ユーザーの情報も、ユーザーが呟いた内容も、保存しておくことができません。
##データベースの種類
階層型データベース
ネットワーク型データベース
リレーショナルデータベース
があります。
この中で最も利用されているのが、リレーショナルデータベースです。
エクセルの表のような形で情報を整理し、管理することができます。そして、このリレーショナルデータベースを管理するソフトウェアはリレーショナル・データ・ベース・マネジメント・システム(RDBMS)と呼ばれます。
そんなRDBMSの中でも代表的なものの一つが、MySQLです。
##MySQL
Oracle社が開発・提供をしているRDBMSです。データベースの作成、編集、削除などを行うことができます。オープンソースソフトウェアとして公開されており、誰でも無償で利用することができます。
[Oracle社のMySQL紹介ページ](https://www.oracle.com/mysql/)
[MySQL公式ページ](https://www.mysql.com/)
MySQLをインストールします。
Amazon Linuxを利用している場合、MySQLは yum コマンドからインストールすることができます。
ターミナル（サーバー）は[ec2-userです。普通のターミナルはターミナル（ローカル）とします。
ターミナル（ローカル）

```
$ cd  .ssh/

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```
これでターミナル（サーバー）に入れたと思います。
ターミナル（サーバー）

```
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install mysql56-server mysql56-devel mysql56
```
これは、MySQLのバージョン5.6をインストールすることを意味します。
MySQLを起動するためにserviceコマンドを利用します。これは、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツールです。
ターミナル（サーバー）

```
[ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld start
```
mysqlではなく**mysqld**であることに注意しましょう。「d」はLinuxの用語で「サーバ」を意味する「デーモン(daemon)」の頭文字です。
起動できたか確認するときは
ターミナル（サーバー）

```
[ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld status
mysqld (pid  15692) is running...
```
「running」と表示されれば、MySQLの起動は成功です。
##MySQLのrootパスワードの設定
yumでインストールしたMySQLには、デフォルトでrootというユーザーでアクセス出来るようになっていますが、パスワードは設定されていません。
そこで、パスワードを設定します。'設定したいパスワード'の部分については、例えばpassword0000という文字列を設定するとしたら、 'password0000'と記載しましょう。
０から始まるpasswordは読み込んでくれないケースが多いので、避けましょう.
（例えば、’0123password’など）
ターミナル（サーバー）

```
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'ここを設定したいパスワードに変更してからコマンドを実行してください'
```
このパスワードは、後ほどRailsからアクセスする時にも利用するので記憶しておいてください。
この時、Warning: Using a password on the command line interface can be insecure.と警告がでることがありますが、ここでは無視していただいて問題ありません。
##MySQLへの接続確認
設定したパスワードが使えるか確認の仕方です。
ターミナル（サーバー）

```
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p
```
Enter password: とパスワードを入力するように表示されるので、設定したパスワードを入力して、Enterしてください。以下のように表示されれば、MySQLの設定は終了です。
ターミナル（サーバー）

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.33 MySQL Community Server (GPL)

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

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

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

mysql>
```
laravel6で既存のDB(MySQL)からmigrationファイルを作成する

サイトをリニューアルするにあたり、既存のDBをそのまま引き継ぐという案件の対応で、migrationファイルをサクッと作ったときのメモ。

「DBからmigrationファイル作成したい」ということでググると、上位にヒットするページが解説するには、以下のジェネレーターで作れるとのこと。

Xethron/migrations-generator
https://github.com/Xethron/migrations-generator

で、実際に試してみたところ、どうやらLaravel6ではエラーになった。
まぁ、最終更新日が3年前だし当たり前だよね。。。

issue でも報告はされているけど、今後も対応されない雰囲気。

https://github.com/Xethron/migrations-generator/issues/191

コメントを見ると Laravel6 の場合は以下を使うといけるみたい。

oscarafdev/migrations-generator
https://github.com/oscarafdev/migrations-generator

インストール等は、github上に書いてあるので省略。

インストール後、以下のコマンドでOK。

```sh
php artisan migrate:generate
```

以上、メモ終わり。



無事、私の環境でもmigrationファイルが簡単に作成できました。

※補足

migrationファイルは問題なく作成できたんですが、作成したmigrationファイルでテーブルを再作成しようとすると以下のエラーが発生

```sh

$ php artisan migrate:refresh --seed

~省略~

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes

  at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|

  Exception trace:

  1   Doctrine\DBAL\Driver\PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes")
      /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:123

  2   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes")
      /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:121

  Please use the argument -v to see more details.
```

調べると Laravel6 の問題ではなく MySQLのバージョンに依存するものらしい。

https://readouble.com/laravel/6.x/ja/migrations.html
> Laravelはデータベース中への「絵文字」保存をサポートするため、デフォルトでutf8mb4文字セットを使っています。バージョン5.7.7より古いMySQLや、バージョン10.2.2より古いMariaDBを使用している場合、マイグレーションにより生成されるデフォルトのインデックス用文字列長を明示的に設定する必要があります。AppServiceProvider中でSchema::defaultStringLengthを呼び出してください。

というわけで、以下を追加することで再作成成功。

```php
public function boot()
{
    \Illuminate\Support\Facades\Schema::defaultStringLength(191);
}
```
入門ViewPager2 Part1

## ViewPager2の導入
自分がViewPager2の導入につまづいたことがあるため、ハマりどころなどを挙げながら導入するまでをひと通りやってみます。




## ViewPager2とViewPagerが存在する
そもそもハマってしまった問題として、「ViewPager」と「ViewPager2」が存在します。紛らわしいので注意してください。

## ライブラリの追加

以下のライブラリを追加します。

```kotlin
// ViewPager2
implementation "androidx.viewpager2:viewpager2:1.0.0"、
implementation "com.google.android.material:material:1.2.0-alpha05"
```

##　レイアウトファイルの変更
ここでも注意なのがパレットに用意されているViewPagerはViewPager２とは異なる物なので、XMLファイルをテキストで編集して仮に、

```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PagerFragment">

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

```

とします。

レイアウトファイルは準備完了です。

## ViewPager2のアダプター作成

続いて、ViewPager2のためのアダプターを作成します。

```kotlin

class PageAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    companion object {
        const val NUM_PAGES = 3
    }

    override fun getItemCount(): Int = NUM_PAGES // Pagerの画面数

    // ページを切り替えた時、表示するページの設定
    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> Page1Fragment()
            1 -> Page2Fragment()
            2 -> Page3Fragment()
            else -> SliderPage1Fragment()
        }
    }
}

```

あとはフラグメントに、作成したアダプターをセットします。

```kotlin
override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        activity?.let { fa ->
            pager.adapter = PagerAdapter(fa)
        }
    }
```

以上で完了です。左右スワイプでページの切り替えが出来ます。


<img width="315" alt="スクリーンショット 2020-03-27 2.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479957/02c419a5-636e-9b4f-0256-334bfd4068b0.png">


## まとめ

とにかくViewPager2とViewPagerが紛らわしく、パレットにもViewPager2が無いことがややこしくなる原因だと思います。