OmniAICreator/Qiita-1.07M huggingface dataset:
vee-validate3最低限

vee-validate3.06

3系の記事がないと判断し、記載。
最低限、動かします。

### 見たほうが早い
[公式サンプル](https://codesandbox.io/s/veevalidate-30-manually-setting-errors-k05rn?from-embed)

- `ValidationObserver`で`ValidationProvider`を囲みます。 
- ボタンクリックでバリデーション、どうやるの？
 - `ValidationObserver`の`v-slot`でvalidateを定義します。
 - `buttonのclick関数`に`validate`を渡し、`validate()`とします。
 - `validate`は`Promise`を返すので`then`でつなげられます。
- エラーについて
 - `ValidationProvider`のerrorsに入っています。
 - エラー判定は、`errors.length > 0`でいいはず。
 - `v-bind:class="{ error: errors.length > 0 }"` 
- 注意点
 - 同一コンポーネント内で`ValidationProvider`の`name`は別にする。

### ちなみに
[バリデーション拡張](https://logaretm.github.io/vee-validate/guide/advanced-validation.html#dynamic-messages)の`field`は`ValidationProvider`の`name`です。

### 3系でなくなったもの(たぶん)
- this.$validatorで書けない。
- validateAll


### 詳しくは
[3系について(英語記事)](https://www.baianat.com/labs/code/veevalidate-3-0)
[公式その他サンプル](https://logaretm.github.io/vee-validate/examples/)
minikube起動時に「Waiting for host to start...」でふんずまって起動しない

## 環境

- Windows10 Pro
- Hyper-V

## エラーメッセージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/61b63787-80d7-2ed8-2198-68f3cc6a4ff3.png)

## 起動コマンド

```
minikube start --vm-driver=hyperv --hyperv-virtual-switch="minikube" --alsologtostderr --v=3
```

## 原因
自宅ではドックにつないでいて、外だとワイヤレスなので、毎度有効なネットワークが違ってたから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/9b211b2e-3388-71bf-8dd9-2f8308b80eaa.png)
argparseを使ってgrep的なことをpythonで実行する

#概要

時々、pythonでキーワード検索したい時がある。
以下のコードをgrep.pyとして保存して、
python3 grep.py --text hoge.txt --keyword hoge とか入力すると、
UNIXのgrepと全く同様なことができるし、
--keywordを入れないでやれば、cat hoge.txt的な表示をする。
結構便利なのでメモ。


```grep.py
import argparse

parser = argparse.ArgumentParser(description="This program extracts "
                                             "a keyword you want "
                                             "in a text file.")

parser.add_argument("--text", "-txt", dest="txt_path",
                    default="tmp", type=str,
                    help="Input the text file you want.")

parser.add_argument("--keyword", "-kw", dest="key_word",
                    default="none", type=str,
                    help="Input a keyword you want to extract.")

args = parser.parse_args()

with open(args.txt_path, "r") as tp:
    lines = tp.read()
    for l in lines.split("\n"):
        if f"{args.key_word}" in l:
            print(l)
        if f"{args.key_word}" == "none":
            print(l)
```

#実行例

```hoge.txt
Na4 Cl4
1.0
5.691694 0.000000 0.000000
0.000000 5.691694 0.000000
0.000000 0.000000 5.691694
Na Cl
4 4
direct
0.000000 0.000000 0.000000 Na
0.500000 0.500000 0.000000 Na
0.500000 0.000000 0.500000 Na
0.000000 0.500000 0.500000 Na
0.000000 0.000000 0.500000 Cl
0.500000 0.000000 0.000000 Cl
0.000000 0.500000 0.000000 Cl
0.500000 0.500000 0.500000 Cl
```

```
In [0]: python grep.py -txt hoge.txt -kw Na

Na4 Cl4
Na Cl
0.000000 0.000000 0.000000 Na
0.500000 0.500000 0.000000 Na
0.500000 0.000000 0.500000 Na
0.000000 0.500000 0.500000 Na

In [1]: python grep.py -txt hoge.txt -kw 5.6

5.691694 0.000000 0.000000
0.000000 5.691694 0.000000
0.000000 0.000000 5.691694

In [2]: python grep.py -txt hoge.txt

Na4 Cl4
1.0
5.691694 0.000000 0.000000
0.000000 5.691694 0.000000
0.000000 0.000000 5.691694
Na Cl
4 4
direct
0.000000 0.000000 0.000000 Na
0.500000 0.500000 0.000000 Na
0.500000 0.000000 0.500000 Na
0.000000 0.500000 0.500000 Na
0.000000 0.000000 0.500000 Cl
0.500000 0.000000 0.000000 Cl
0.000000 0.500000 0.000000 Cl
0.500000 0.500000 0.500000 Cl

```
iTerm2にHotKey設定してすぐrangerが立ち上がるようにすると神になります

<img width="926" alt="Screen Shot 2019-09-19 at 2.17.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96804/be698e5c-df0a-5fe0-e1fc-6af2601c6d98.png">

`Preference > Keys`の左下にある`Create a Dedicated Hotkey Window...`を押すとホットキーにて呼び出すターミナル用プロファイルを作成する画面が開きます。
<kbd>⌥+F</kbd>や<kbd>⌥+D</kbd>なんか押しやすくていいんじゃないでしょうか。

<img width="926" alt="Screen Shot 2019-09-19 at 2.16.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96804/eb387faa-47d8-9499-13fc-1507b41c7a4d.png">

作成されたプロファイルをいじって、ウィンドウの設定をお好みの感じにしましょう。

<img width="926" alt="Screen Shot 2019-09-19 at 2.16.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96804/2de362c8-2e35-b7e0-6930-a6bb6d3e2196.png">

さいごにCommand `/usr/local/bin/ranger`（一例）を設定すれば完成。
（一度iTerm2の再起動がいるかも。いらないかも）

<img width="863" alt="Screen Shot 2019-09-19 at 2.28.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96804/cdbc89fd-fa22-1a3f-125b-4565aff51455.png">

はい神！！！！！！
Docker imageにビルド時に使った値を環境変数として埋め込みたい

git とかでつけたタグかコミットIDをイメージの環境変数に埋め込んでおくことで、ビルド時に使ったり、実行時で表示させたりして、そのイメージとGit上のコミットを一致させるような使い方ができないかなーと思って試した。

そんなことしなくてもイメージに付けるタグとGitのタグを合わせて管理すれば良いのだけど、動いているイメージを別の方法で特定するにはこういうのもありなのかな？と思って書いた。


Dockerfile例
-----------------

実質的にはDockerfileに2行書くだけ。

``` Dockerfile
FROM python:3.7

# pipとか環境変数を使わないものはここに書く

### ここから
ARG BUILD_VERSION=${BUILD_VERSION:-dev}
ENV BUILD_VERSION ${BUILD_VERSION}
### ここまで

# 環境変数を使いたいものはここに書く

# 確認のため実行時の環境変数を表示するサンプル
CMD ["python", "-c", "import os; print(os.getenv('BUILD_VERSION', 'NO VERSION'))"]
```


`docker build`時に`--build-arg`を与えると`ARGのBUILD_VERSION`にその値が、省略時は`dev`が入り、`ENVのBUILD_VERSION`で`ARGのBUILD_VERSION`で設定した値を`イメージの環境変数BUILD_VERSION`として埋め込む、という感じです。

（1行にまとめて`ENV BUILD_VERSION ${BUILD_VERSION:-dev}` と書くことは出来ず、ARGかENVで定義した変数で渡す必要があるっぽい。）

### 実行

```
$ docker run $(docker build -q . )
dev
$ docker run $(docker build -q . --build-arg BUILD_VERSION=v0.0.1)
v0.0.1
```

`docker build`に`-q`をつけるとビルド成功時にImageIDが得られるので、それをそのまま`docker run [ImageID]`で実行している

### 使用例


```
docker build . --build-arg "BUILD_VERSION=$(git describe --tags HEAD 2>/dev/null || git log -n 1 --pretty=format:%h HEAD)"
```

`git describe --tags HEAD 2>/dev/null || git log -n 1 '--pretty=format:%h' HEAD` はHEADのコミットに対してタグがあればタグ名、そうでなければコミットID(短め)を出力する。
交通量データの処理

#扱うデータの説明
[全国道路・街路交通情勢調査](http://www.mlit.go.jp/road/census/h27/index.html)
このデータの東京の分を扱う。

一般交通量とは
・道路状況調査
・交通量調査
・旅行速度調査
の三つからなる。

###道路状況調査
路線を道路状況調査単位区間に分割し、この区間ごとに調査を行った。
###交通量調査
対象路線を交通量調査単位区間に分割し、区間を代表するの地点を通過する秋季の平日の方向別 2 車種別（小型車・大型車別）12 時間交通量または 24 時間交通量の調査を行った。
重要地点のみを実測し、その他の区間は統計処理で推定している。
###旅行速度調査
対象路線を旅行速度調査単位区間に分割し、秋季の平日の方向別旅行速度（混雑時及び昼間非混雑時）の調査を行った。

###対象路線とは
高速自動車国道、都市高速道路、一般国道、主要地方道である都道府県道及び指定市の市道、一般都道府県道、指定市の一部の一般市道を調査の対象とした。
つまり市町村道は計測していないということ
####車種も記録してる
###箇所別基本表
| カラム名       |   説明 |   
|:-----------------:|:------------------:|
|交通調査基本区間番号|「都道府県（2 桁）」＋「道路種別（1 桁）」＋「路線番号（4 桁）」＋「順番号（4 桁）」からなる 11 桁の番号で、路線の起点から終点に向けて昇順|
|世代管理番号:十の位||
|世代管理番号:一の位||
|道路種別|高速自動車国道:1、都市高速道路:2、一般国道:3、主要地方道（都道府県道）:4、主要地方道（指定市市道）:5、一般都道府県道:6、指定市の一般市道:7|
|路線番号||
|路線名||
|接続区分||
|基本区間番号||
|世代管理番号　十の位||
|路線名||
|現道旧道区分|現道:1、旧道:2、新道:3、旧道集約:4|
|管理区分|国土交通大臣:1、都道府県知事又は都道府県:2、指定市の長又は指定市:3、東日本・中日本・西日本高速道路株式会社:4、首都高速道路株式会社:5、阪神高速道路株式会社:6、本州四国連絡高速道路株式会社:7、地方道路公社等:8、その他:9 |
|市区町村コード|平成 27 年 4 月 1 日時点に定める標準コード。指定市につい
ては、指定市の標準コードではなく、区毎に定める標準コード|
|自動車専用道路の別|自動車専用道路の区間:1、自動車専用道路以外の区間:0 |
|区間種別|通常区間:0、上下線分離区間:1、複断面区間:2、上下線分離かつ複断面区間:3、交通不能区間:6、循環区間:7、部分供用区間:8 |
|分離区分||
|区間延長||
|高規格道路の別||
|一般国道指定区間|一般国道（指定区間）:1、一般国道（指定区間外）:2、一般国道以外の道路:0 |
|一方通行フラグ|なし:0、一方通行（起点から終点方向に通行可能）:1、一方通行（終点から起点方向に通行可能）:2 |
|平成22年度の基本区間番号||
|都道府県指定市コード||
|調査単位区間番号|高速自動車国道:00010〜、都市高速道路:05010〜、一般国道:40010〜、一般都道府県道:60010〜、指定市の一般市道:80010〜|
|基本区間番号交通調査観測地点|交通量調査単位区間において、交通量観測地点を設定した交通調査基本区間番号|
|交通量観測地点地名||
|交通量観測・非観測の別|観測:1、非観測（推定値）:2、データなし（推定不能）:空白|
|個別調査観測値活用の例||
|12・24時間観測の別|12 時間観測地点:1、24 時間観測地点:2、調査対象区間外（非観測）:0 |
|交通量観測年月日||
|昼間12時間自動車類交通量（上下合計）|午前 7 時～午後 7 時まで|
|24時間自動車類交通量（上下合計）|午前 7 時～翌日午前 7 時または午前 0 時～翌日午前 0 時までに|
|昼夜率|24時間自動車類交通量/昼間12時間自動車類交通量|
|昼間12時間ピーク比率|(ピーク時間自動車類交通量/昼間12時間自動車類交通量)×100|
|昼間12時間大型車混入率|(大型交通量/前者交通量)×100|
|混雑度|交通量/交通容量|



###時間別交通量

| カラム名       |   説明 |   
|:-----------------:|:------------------:|
|都道府県指定市コード|||
|交通量調査単位区間番号|「都道府県（2 桁）」＋「道路種別（1 桁）」＋「路線番号（4 桁）」＋「順番号（4 桁）」からなる 11 桁の番号で路線の起点から終点に向けて昇順|
|道路種別|高速自動車国道:1、都市高速道路:2、一般国道:3、主要地方道（都道府県道）:4、主要地方道（指定市市道）:5、一般都道府県道:6、指定市の一般市道:7 |
|路線番号||
|交通量観測・非観測の別||
|個別調査観測値活用の別||
|12・24時間観測の別||
|交通量間年月日||
|天候| 晴:1、曇:2、雨:3、霧:4、雪:5、不明:6 |
|上り・下りの別|上り:1、下り:2|
|車種区分|小型車:1、大型車:2|
|時間帯別自動車交通量||
|昼間12時間自動車交通量|午前 7 時台～午後 6 時台までの時間帯別交通量の合計|
|24時間自動車交通量|全時間帯別交通量の合計|
【日本語変数名で学ぶ】 Vue.jsの状態の切り分け方

ここしばらくReactとTypeScriptでお仕事をしていたので、
Vue.jsの再学習という意味でメモを残していきます。


## tl;dr
フォームの編集状態と送信するリクエストの状態に差分があるときは状態を1つにして、考慮するべき入力状態を1つに保つようにしよう。
https://codesandbox.io/s/form-itmqy

## 課題感
よく感じる課題感
サーバーから取得した状態を変更してサーバーへ送り返す際に、
日付のフォーマットが違うようなケースが**稀によくある**。

例えば、以下のような状態があったとする。
1. 日付を入力するフォームがある
2. 送信ボタンを押すとAPIを叩いて日付を登録する

今回はこの2つの手順だけに絞ったフォームを作る

### 1. 日付を入力するフォームがある

イメージしてもらうにはこんな感じのをみてもらえばいいと思う。

input type="date" の 日付フォーマットは YYYY-MM-DD なので、
入力すると 例えば 1234-10-03 と表示されればOK。

```vuejs

<template>
  <div id="app">
    <h1>see App.vue</h1>
    <input type="date" :value="入力された日付" @input="入力された内容で日付を更新する">
    <p>{{入力された日付}}</p>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      入力された日付: ""
    };
  },
  methods: {
    入力された内容で日付を更新する(ev) {
      console.log(ev.target.value);
      this.入力された日付 = ev.target.value;
    }
  }
};
</script>

```

### 2. 送信ボタンを押すとAPIを叩いて日付を登録する

送信ボタンを押したときにリクエストを送る(ような)実装をしていく。
手順としては以下のような実装の順序になる
(1) 送信ボタン用のmethodを作る
(2) 送信ボタンのHTMLを書いて(1)で作ったmethodを@click にわたす
(3) 押されたときに実行したい処理を書く APIのIFに沿うように入力された日付をフォーマット
(4) フォーマットされた文字をリクエスト


```vuejs
<template>
  <div id="app">
    <input type="date" :value="入力された日付" @input="updateDate"> 
    <p>{{入力された日付}}</p>
    <!-- (2) 送信ボタンのHTMLを書いて(1)で作ったmethodを@click にわたす -->
    <button @click="postDate">send</button>
  </div>
</template>

<script>

// (3) 押されたときに実行したい処理を書く APIのIFに沿うように入力された日付をフォーマット
import moment from "moment";
const 日付をフォーマット = 渡した日付 => {
  const date = moment(渡した日付, "YYYY-MM-DD");
  return date.isValid() ? date.format("YYYY/MM/DD") : "";
};

const ajax = {
  post(data) {
    console.log("リクエスト内容は", data);
  }
};
export default {
  name: "App",
  data: function() {
    return {
      入力された日付: ""
    };
  },
  methods: {
    updateDate(ev) {
      console.log(ev.target.value);
      this.入力された日付 = ev.target.value;
    },
    postDate() { // (1) 送信ボタン用のmethodを作る
      // (4) フォーマットされた文字をリクエスト
      const フォーマットされた日付 = 日付をフォーマット(this.入力された日付);
      if (!フォーマットされた日付) {
        return;
      }

      ajax.post({
        date: フォーマットされた日付
      });
    }
  }
};
</script>

```

実際にフォームがさくっとできました。
今回書いたコードは こちらに上がっています => https://codesandbox.io/s/form-itmqy

### まとめ

今回、Vue.jsの状態とサーバーへリクエストするときの状態が異なるフォーマットにしたときに複数の状態を保持するのではなく、
変更する状態は一つに、サーバーへリクエストするときに初めてフォーマットすると、
考慮するべき状態が少なく済むので複雑なロジックを組むときもシンプルに実装を保つことができます。
guakeターミナルをubuntuにおいてapt installじゃなくてgit cloneでコードから入れて自分でbuildして入れる


guakeターミナル、F12で出せて便利ですよね。僕も大好きなんですけどubuntuのメインストリームである18.04LSTのリポジトリに入ってるバージョンは各種バグを内包しておりexitでハングしたりすることがあります。　


```bash
git clone https://github.com/Guake/guake.git -b 3.6.3
cd ./guake/scripts
 ./bootstrap-dev-debian.sh 
cd ..
make
sudo make install
cd ~
```

現時点では3.6.3が最新バージョンなので3.6.3のブランチをcloneしてます。
Javaのclassについて

##クラス

クラスとは、プログラミングを実行するための処理をまとめたオブジェクトで、クラスの処理の中にはメンバ変数や処理を実行するためのメソッドがあります。

ちなみに、メンバ変数とはクラス内で使用する変数の事で、メソッドとはメンバ変数などを使って行う処理をひと塊りにまとめたものです。

クラスは以下のように記述します。

```java.
class クラス名 {
実行処理,,,
}
```

##クラスとは

javaのプログラミングを書いた事のある方は見たことあるとは思いますが、プログラミングの一番外に書かれているものです。

classには（publicクラス）　（privateクラス）が存在します。
上記のような宣言を修飾子と言います。
そのあとにある（sample）はクラスの名前です。
(public)と(private)の違いは利用できる場所の違いです。
(public)は外部から利用できる場所の事で、(private)とついている場所は外部からの利用ができない範囲です
【Swift】構造体

#構造体とは？
構造体とは値型の一種で、ストアドプロパティの組み合わせによって１つの値を表すことができるものの事を言います。
簡単に言うと、これは継承不可のクラスのようなものであり以下のような特徴を持っています。

**・複数の値を一個の構造体で管理できる（ストアドプロパティの組み合わせによって一つの値を表す）
・辞書とは違い、同じ構造のオブジェクトを複数生成可能
・クラスと違い参照不可
・クラスは参照型に対し、構造体は値型
・イニシャライザも関数も使用可能**

このような構造体の用途は多くあり、例えば画面上の幅と高さは２つのプロパティをもつ構造体で表すことができ、統一して管理したい複数のプロパティを使用する際に便利です。

#定義方法
下記のように定義は非常にシンプルで、structの後に構造体名を記述、そして{}の中にプロパティなどを定義すればOKです。

```swift
struct 構造体名 {
  構造体の定義
}
```

**サンプルコード**
実装コード例は以下のようになります。
初期値なしのストアドプロパティに対してイニシャライザで、引数からの値を与え、実行時に値を返すようなプログラムになっています。

```swift
//構造体定義
struct Article {
  //ストアドプロパティ定義（初期値なし）
  let id: Int
  let title: String
  let body: String

  //initを使用することでイニシャライザ定義
  init(id: Int, title: String, body: String) {
    self.id = id
    self.title = title
    self.body = body
  }

  func printBody() {
    print(body)
  }
}

//インスタンス化時に引数に値を置くことで、イニシャライザで初期値を与える
let article = Article(id: 1, title: "title", body: "body")
article.printBody()

//実行結果
body
```

##インスタンス化時の定数への注意
以下のコードを見ると、最初のインスタンス化（初期化）時には変数に構造体を代入し、コンパイル成功。２回目の時は定数に構造体を代入し、コンパイルエラーが発生しています。つまり以下の例のように、インスタンス化時に定数に代入した場合、それ以降値の変更はできなくなるので注意してください。

```swift
struct SomeStruct {
  var id: Int

  init(id: Int) {
    self.id = id
  }
}

var variable = SomeStruct(id: 1)
//コンパイル成功
variable.id = 2

let constant = SomeStruct(id: 1)
//コンパイルエラー
constant.id = 2
```

##メソッド内でのストアドプロパティの変更
構造体内で定義したメソッド内でストアドプロパティの値を変更する場合、**mutating**の使用が必要になります。
以下のコードのようにイニシャライザで引数を参照して代入する時は必要ありませんが、メソッドで代入する時はmutatingの記述が必要で、もし記述がなくメソッドだけの場合はコンパイルエラーになるので注意してください。

```swift
struct SomeStruct {
  var id: Int
  
  init(id: Int) {
    self.id = id
  }

  mutating func someMethod() {
    id = 4
  }
}

var a = SomeStruct(id: 1)
a.someMethod()
a.id

//実行結果
4
```

##メンバーワイズイニシャライザ
メンバーワイズイニシャライザとは構造体にデフォルトで用意されているイニシャライザのことです。
構造体では独自にイニシャライザと定義しない場合、このメンバーワイズイニシャライザが自動的に定義され型が持っている各ストアドプロパティと同名の引数を割り当ててくれます。
そのため以下のコードのように、コメントアウトされているイニシャライザが記述しなくても暗黙的に初期化を行ってくれます。

```swift
struct Article{
  let id: Int
  let title: String
  let body: String

  //以下のイニシャライザが自動的に定義されている
  //init(id: Int, title: String, body: String) {
  //  self.id = id
  //  self.title = title
  //  self.body = body
  //}
}

let article = Article(id: 1, title: "Hello", body: "...")
article.id 
article.title
article.body

//実行結果
1
Hello
...
```
コンストラクタとは

##コンストラクタとは
クラスのインスタンス生成時に実行されるメソッドで、主にそのクラスのメンバ変数を初期化するときに使用します。

コンストラクタはインスタンス生成時に呼び出される特別なメソッドで、通常のメソッド同様に引数を指定することも可能です。

コンストラクタの呼び出しは、以下のように記述します。

```java
public class メインクラス名 {
public static void main(String[] args) {

//インスタンの生成
クラス名　変数名　= new クラス名();
 }
}

class クラス名{

//コンストラクタ (インスタンス生成時に実行される)
public クラス名(){
初期化処理など
 }
}
```

コンストラクタはnew演算子をしようして、インスタンス生成時に同名のクラス名を持つメソッドが一度だけ実行されます。

##コンストラクタとは

コンストラクタとは、クラスのインスタンスを作成する時に実行される処理のことです。

例えばSampleClassというクラスのインスタンスを作成したい時は下記のようにコーディングしますが

```java
SampleClass instanceA = new SampleClass();
```

この構文の中でnewの後ろに書かれている、SampleClass()で呼び出されているのがコンストラクタです
文字の変換〜translate()関数

#translate()関数を使用し、文字変換をさせる
python3で、translate()を使用し、"money"表記を一文字変え、"honey"表記に換えてみる

##コード例
```py
text = "money"
x = {"m":"h"}

y = text.translate(str.maketrans(x))
print(y)
```

##解釈
`text = 'money'`
変数に"money"を代入。


`x = {'m':'h'}`
辞書型で、keyとしての"m"と、valueとしての"n"を変数に代入。

`y = text.translate(str.maketrans(x))`
"maketrans()"で、translate()関数で使用できる、変換テーブルを作成。
"translate()"関数で、文字列の変換。

#最後に
文字の置換は、実業務でも頻繁に使いますね。様々な書き方をマスターしたいです。
golangにおけるDateバリデーションヅラ

## その1. `regexp`による正規表現を使ったバリデーション
```reg.go
validater := regexp.MustCompile(`\d{4}(/\d{2}){2} \d{2}(:\d{2}){2}`)
fmt.Println(validater.MatchString("2012/12/10 12:30:45"))
// true

fmt.Println(validater.MatchString("Mon, 02 Jan 2012 12:30:45"))
// false

```

## その2. `time`による文字列一致を使ったバリデーション

```time.go
layout := "2006/01/02 15:04:05"
_, err := time.Parse(layout, "2012/12/10 12:30:45")
// err == nil にてokを確認
```
※ `layout`の指定方式は ~~[magical date](https://en.wikipedia.org/wiki/Magical_Date)~~ [magical reference date](https://programming.guide/go/format-parse-string-time-date-example.html) を参照。
　他言語と指定形式が異なるため注意が必要ヅラ(YYYY/MM/DD等でなく指定の実値にて設定)

## 互いのBenchmark比較
```validation_test.go
func BenchmarkRegexpPack(b *testing.B) {
	validater := regexp.MustCompile(`\d{4}(/\d{2}){2} \d{2}(:\d{2}){2}`)
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		validater.MatchString("2012/12/10 12:30:45")
	}
}

func BenchmarkTimePack(b *testing.B) {
	layout := "2006/01/02 15:04:05"
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		time.Parse(layout, "2012/12/10 12:30:45")
	}
}

// > $ go test -bench . -benchmem -benchtime 3s
// BenchmarkRegexpPack-12    20000000    286 ns/op    0 B/op    0 allocs/op
// BenchmarkTimePack-12      30000000    145 ns/op    0 B/op    0 allocs/op
```
Win10のホットスポット機能を利用して、ラズパイをお外でいじる

##この記事の目標
- ノートPCが接続してるWiFiに、ノートPC経由でラズパイをつなぐ
- いちいちラズパイのWiFi設定する必要がなくなる

##記事を書いた動機
- 外出先でラズパイいじりたかったけど、いい方法見つからんかったので。
- 同じように困っている方がいたらご参考までに。
- もっといい方法だれか知ってたら教えてほしです。

##環境
- Let's note (CF-AX3)
- Win10 Pro
- Raspberry Pi 3 Model B+
    - Raspbian

##手順
1. ラズパイSDカードのbootドライブに、以下の２つのファイルを作成.
[※大変わかりやすく説明してくださっている記事](https://qiita.com/mascii/items/0d1a280ac58ed8f6f999)

    1. wpa_supplicant.conf
        2. この時モバイルホットスポットのssidとpskを入力しておく
    2. ssh

2.  winのモバイルホットスポットをOnにする
3.  Winの設定からモバイルホットスポットで接続されているデバイスのIPを確認する
<img width="960" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498912/c90cfde2-4e5f-f6f2-19c6-678c7a0edbd8.png">

4.  [VNC Viewerをダウンロードする。](https://www.realvnc.com/en/connect/download/viewer/)
5.  さっき確認したアドレスをVNC Viewerに打ち込む。
6.  ラズパイのUsernameとpassword打ち込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498912/a353c3fc-9b9b-80a9-5a71-fe20949664e5.png)

7. つながる。
TeraTermで踏み台サーバ→別サーバへのssh接続を一発で。

#訳あって一発でssh接続できない場合がよくある
- セキュリティ的な理由だったりユーザ管理的な理由だったり。
- 接続先を指定したショートカットは作れるけど、踏み台経由ってどうやるの！という人向け。
    - [【手順】teratermのショートカット作成方法](https://qiita.com/takahashi-kazuki/items/1bf502497461bc6f285b)

# ttlというマクロファイルを作る
- `hoge.ttl`という形式でテキストファイルを新規作成。
- ファイルを右クリック -> プロパティから`変更`でTera Term Macro Interpriterを選択
    - 多分C:\Program Files (x86)\teratermあたりにある。
    

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240336/87c2409a-80e6-7726-01d4-c59a37055d60.png" width=240>


# ttlファイルの中身
接続先情報を記述して、それに沿ってコマンドを作るだけ！

```ruby
;=====================================================================
; 踏み台接続情報
HOSTADDR = 'fumidai-server.com'	; <- 踏み台サーバのアドレス
USERNAME = 'my_user_name'	; <- 踏み台サーバのusername
PASSWORD = 'password_hogehoge'	; <- usernameに対するパスワード

; 目的サーバ接続情報
HOSTADDR2 = 'target-server.co.jp'	; <- 目的サーバのアドレス
USERNAME2 = 'target_user_name'	; <- 目的サーバのusername
PASSWORD2 = 'password_hugahuga'	; <- usernameに対するパスワード
;=====================================================================

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

; 接続
connect COMMAND

; プロンプトを待つ
wait "$"

; 目的サーバへ接続
COMMAND = 'ssh '
strconcat COMMAND USERNAME2
strconcat COMMAND '@'
strconcat COMMAND HOSTADDR2
sendln COMMAND

wait 'password:'
sendln PASSWORD2

end
```

あとはこのttlファイルをダブルクリックすればつながる！！
Redis-Clusterで「Can't open nodes.conf in order to acquire a lock: Permission denied」が発生


## はじめに
redis-clusterを有効にした状態で、下記のエラーが発生した場合の対象方法について記載。

```
Can't open nodes.conf in order to acquire a lock: Permission denied
```

## 原因

nodes.confの所有者が、redis → rootに変更されていたので、パーミッションエラーが発生。

nodes.confはデフォルトの場合は、/var/lib/redis配下に作成される

```
ls -ltir /var/lib/redis/nodes.conf
9218 -rw-r--r-- 1 root root Aug 1 04:05 /var/lib/redis/nodes.conf
```

## 対策

所有権を元に戻す。

```
chown "redis:redis" /var/lib/redis/nodes.conf
```

---
influxdbメモ

# スキーマ

スキーマデザインについては本家の資料を読むのが良さそう。
https://docs.influxdata.com/influxdb/v1.7/concepts/schema_and_data_layout/

- タグはインデクス化される
- タグに多様な値を入れるな
    - UUID, ランダム文字列, ハッシュなどを入れるな
    - タグ値のカーディナリティ（一意性）が高いとメモリをたくさん消費する
- タグに符号化されたデータを埋め込むな
    - だめ
        - location=plot-1.north
        - location=plot-2.midwest
    - よい
        - plot=1,region=north
        - plot=2,region=midwest
- メジャメントに符号化されたデータを埋め込むな
    - だめ
        - blueberries.plot-1.north
        - blueberries.plot-1.midwest
    - よい
        - weather_sensor,crop=blueberries,plot=1,region=north
        - weather_sensor,crop=blueberries,plot=2,region=midwest

# クエリ
## INSERT
メジャメント名 + タグ、 値、 タイムスタンプを順に渡す。それぞれの間はホワイトスペースで区切る。

タイムスタンプを省略すると現在時刻で記録される。

```console
> INSERT environment humidity=28.7
> INSERT environment humidity=60.7
```

## SELECT
SQLと似た構文で問い合わせる。

```
> SELECT * FROM environment
name: environment
time                         humidity
----                         --------
2019-09-18T14:48:27.3243244Z 26.8
2019-09-18T14:49:46.5689408Z 60.7
```

influxdbの特徴でもある時刻のグループ処理。

10秒毎にグループして平均値を取る。値のない部分は線形補間する（ `FILL()` は `linear` の他に、 `previous` , `none` , `null` を取る）。 `WHERE` 句で対象を絞り込まないと、現在時刻まで集計してしまうので注意。

```console
> SELECT MEAN("humidity") FROM environment WHERE time < '2019-09-18T14:49:47Z' GROUP BY time(10s) FILL(linear)
name: environment
time                 mean
----                 ----
2019-09-18T14:48:20Z 26.8
2019-09-18T14:48:30Z 31.0375
2019-09-18T14:48:40Z 35.275000000000006
2019-09-18T14:48:50Z 39.5125
2019-09-18T14:49:00Z 43.75
2019-09-18T14:49:10Z 47.987500000000004
2019-09-18T14:49:20Z 52.22500000000001
2019-09-18T14:49:30Z 56.462500000000006
2019-09-18T14:49:40Z 60.7
```

## DELETE

SQLのように削除できる。時刻フォーマットが文字列の場合には `'` でくくる（ `"` ではない）。

```console
> DELETE FROM environment WHERE time='2019-09-18T14:49:46.5689408Z'
> SELECT * FROM environment
name: environment
time                         humidity
----                         --------
2019-09-18T14:48:27.3243244Z 26.8
```

# 時刻フォーマットの切り替え
`influx` コマンドの起動時に `-precision` オプションによって切り替える。

```console
$ influx -port 18086 -precision rfc3339
> SELECT * FROM environment
name: environment
time                           humidity
----                           --------
2019-08-21T01:12:26.313999872Z 52.95
```

# システム問い合わせ

MySQL風のクエリでシステムに問い合わせできる。

## データベース一覧

```console
> SHOW DATABASES
name: databases
name
----
db0
_internal
```

## メジャメント一覧

```console
> SHOW MEASUREMENTS
name: measurements
name
----
environment
```
Dockerを使ってみよう-2

今回は[前の記事](https://qiita.com/cottencandy15/items/9a88f5b1019d4ec325c5)で作ったDocker imageをAWSのECRにプッシュします。
自分用なのでところどろこ抜けてます…

#初めに
EC2 インスタンスの上にDocker imageがある
ECR Repository

#pipをインストール

``` 
# curl -O https://bootstrap.pypa.io/get-pip.py
# python get-pip.py
```

#IAMのアクセスキー作成
AWSでIAM Servicesに行きます。左のパネルに`User`をクリックし自分のアカウントを見つけたら、`Security Credentials`のタブを開きます。
`Create Access Key`を押してアクセスキーを作ります。
**アクセスキーIDとシークレットはちゃんと保存してくださいね、特にシークレットはこれ以降出てきません**

#Push!
ec2インスタンス 上で回収したIDとシークレットを使います

```ruby
$aws config

AWS ACCESS KEY id [NONE]:　コピペ
AWS SECRET ACCESS Key [NONE]:　コピペ
Default region name [NONE]: リージョンを入れてください
Default output format [NONE]: エンターキー


```

`ECRのURI`をゲット

```ruby
docker push 5001504xxxxx.dkr.ecr.us-west-1.amazonaws.com/repo_name
```
ターミナルにコピペすれば完了！
PHPの文字列と配列は実行可能？！？！

## 文字列は実行可能！！！
```php
function example_func() {
  echo 'example_func was called';
}

'example_func'();
// example_func was called
```

## 配列も実行可能！！！
```php
class ExampleClass
{
    public static function example()
    {
        echo 'ExampleClass::example was called';
    }
}

['ExampleClass', 'example']();
// ExampleClass::example was called
```


## なにこれ！！！
どちらも[コールバック / Callable](https://www.php.net/manual/ja/language.types.callable.php)でタイプヒンティングされた引数に渡せる形式。

`callable`は`is_callable`関数で`true`と評価されるような、呼び出し可能な引数を定義する際に使います

```php
function call_callback(callable $callback) {
    $callback();
}

// callableでタイプヒンティングされた引数に渡せる形式は3つあります

function example_func() {
  echo 'example_func was called';
}

class ExampleClass
{
    public static function example1()
    {
        echo 'ExampleClass::example1 was called';
    }

    public function example2()
    {
        echo 'ExampleClass::example2 was called';
    }

    public function __invoke()
    {
        echo 'ExampleClass was called';
    }
}

// 1.文字列
// 関数名
call_callback('example_func');
// example_func was called

// 静的メソッド
call_callback('ExampleClass::example1');
// ExampleClass::example1 was called


// 2.配列
// メソッド
call_callback([new ExampleClass, 'example2']);
// ExampleClass::example2 was called

// 静的メソッド
call_callback(['ExampleClass', 'example2']);
// ExampleClass::example1 was called


// 3.__invokeマジックメソッドを実装したオブジェクト
// オブジェクト
call_callback(new ExampleClass);
// ExampleClass was called

// 無名関数
call_callback(function () {
    echo 'closure was called';
});
// closure was called
```

## うーん
callable引数に渡すとき以外使い場所はない
ましてや文字列や配列を直接呼び出すことはないですね
【AWS認定資格】クラウドプラクティショナー合格体験記

#はじめに
2019年9月14日にAWS認定クラウドプラクティショナーに合格しました。勉強期間は約３週間くらいでした。
この記事では合格までに行った勉強方をお伝えできればと思います。

#筆者のスペック
・Sier勤務3年目。
・主に業務システムの開発と保守運用を担当。
・業務でAWSを使用したことがない（受験前まではEC2すら知らなかった…）。

#スコア
受験後の５営業日以内に以下のような合格証が見れるようになります。筆者は受験の翌日に見れるようになりました。ちなみに合否の結果のみ受験終了後に画面に表示されるのでスコアは後追いで知る感じになります。

<img width="785" alt="スクリーンショット 2019-09-16 10.53.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249566/9eb16f7e-9ce9-1727-7afa-183975be5d3f.png">

#試験勉強でやったこと
本題の試験勉強についてです。試験勉強として行ったことは主に以下の3つです。

1.手を動かしながら様々なサービスの使い方を理解する。
2.試験対策本を２周読み、傾向と対策を掴む。
3.模試を受験し、本番の問題に慣れる。

#1.手を動かしながら様々なサービスの使い方を理解する
AWSの各サービスの使い方のイメージができていない状態から勉強をスタートしたため、実際に手を動かしながらサービスを組み合わせてクラウドアーキテクチャを作ってみるという勉強法を選択しました。

その際に使用した教材は、udemyの[手を動かしながら2週間で学ぶ AWS 基本から応用まで](https://www.udemy.com/draft/1706378/)です。

最初から最後までを約１週間くらいかけて行いました。EC2、VPC、RDS、ELB、IAMなどよく使うサービスの基礎を学ぶことができました。

#2.試験対策本を２周読み、傾向と対策を掴む
基本的なサービスの使い方をイメージできたので参考書で試験の傾向を掴む勉強に移りました。

その際に使用した教材は[AWS認定資格試験テキスト　AWS認定クラウドプラクティショナー](https://www.sbcr.jp/product/4797397406/)です。

この参考書は１.で挙げた主要なサービスの説明やAWSの責任共有モデル、セキュリティポリシー、料金管理などの要点がわかりやすくまとめられており、参考書の中で書かれていたことがそのまま試験に出題されていたりもしました。また各章の最後に練習問題が付いていて、解説を読む→問題を解くという進め方で着実に知識を定着できたような気がしています。

筆者は参考書の解説部分をノートへ書き写しながら覚え、問題を解いて定着度を確認するという進め方をしていました。約２週間ほどかけて参考書を２周ほど読み込みました。

#3.模試を受験し、本番の問題に慣れる
AWS公式の模試があるので受験しました。模試は料金が2000円、問題数が２５問、試験時間が30分でした。
試験に近い問題を解くことができるだけでなく、解けなかった問題から苦手な分野を知ることができるいい機会になりました。点数は８割弱ぐらい取ることができたので本試験へ進むことにしました。
ちなみに採点結果は、
1.0　Cloud Concepts: 〇〇%
2.0  Security: 〇〇%
3.0  Technology: 〇〇%
4.0  Billing and Pricing: 〇〇%
総合スコア:  〇〇%
のような形で、分野ごとの正答率とトータルの正答率が表示されます。


**動画ベースの教材で全体像をイメージできるようなる→文字ベースの参考書で細かな知識を補完し、各サービスの特徴や使い方を言語化できるようになる→実践的な問題を解いて試験の傾向をつかむというサイクルで勉強を進められたことで、合格に繋がったのではないかと思います。**

#勉強する際に気をつけること
#####出題範囲は意外と広い
テクノロジー分野では主要なサービスからの出題が多い印象でしたが、中には参考書では出てこなかったサービスも出題されていました。その際は消去法で解くか、飛ばして他の問題を解くなどするといいと思います。

#####サービスの概要だけでなく、実際にどのように使うかを問われる問題もある
例えば、「EC2を〇〇のような使い方をする際にどのような料金体系を選べば良いか」など実際に使用する際の状況に即した問題が多く出題されます。各サービスの概要を勉強するだけだと解けない問題もあるので気をつけましょう。

#おわりに
今後はソリューションアーキテクトアソシエイトの資格取得を目標に勉強を進めていく予定です。またアソシエイトの資格は全て取れるように頑張りたいと思います。
この記事がクラウドプラクティショナーを受験される方の一助になれば幸いです。
ことはじめ(非プログラミング)

注：技術的な話題ではなく、ただの決意表明的なやつです。

# ことはじめ
今までの人生でブログ等もやることもなく、
情報発信のしないIT関連者として枯れた技術とお仕事で向き合ってきました。

そろそろ何かしら変革を求めねば・・・
と思い書き初めます。

面白い事や技術的に躓いたことの自分なりの解決策等々を主に書いていきます。
(文章能力の向上も狙ってます。何しろ不器用なので。)

## 技術領域について。
1：Linux(主にUbuntu系)
2：ネットワーク(ネスぺ勉強中のため)
3：C#、Python
4：気になった技術領域を津々浦々

# その他
Qiitaの運営会社のincrements株式会社。
親会社がエイチームだったんですね。
昔、麻雀雷神でお世話になってました。
~~最近は天鳳ばかりです。~~

### こんな感じですが、
### お暇なときにお付き合いいただければ幸いです。
CentOS7.6にServerSpecをインストール ( Rubyコンパイル形式 )

## はじめに

CentOS7.6にServerSpecをインストール手順を記載する。
Rubyはバージョンが新しいもの(2.6.4)をインストールしたいので、yumを使わず、公式サイトのソースコードをコンパイルして、インストールする。

## 開発用のパッケージのインストール

コンパイル時などに必要となる諸々のパッケージをインストール。

```
yum -y install wget gcc zlib zlib-devel openssl openssl-devel
```

---

## rubyのコンパイル

```
cd /usr/local/src
wget https://cache.ruby-lang.org/pub/ruby/ruby-2.6.4.tar.xz
tar xvf ruby-2.6.4.tar.xz

cd /usr/local/src/ruby-2.6.4
./configure
make; make instal

cd /usr/local/src/ruby-2.6.4
cd ./ext/openssl
ruby extconf.rb

vim Makefile
    ※ 下記の内容をファイルに追記する
    > top_srcdir = /usr/local/src/ruby-2.6.4

make; make instal

cd /usr/local/src/ruby-2.6.4
cd ./ext/zlib
ruby extconf.rb
vim Makefile
    > top_srcdir = /usr/local/src/ruby-2.6.4

make; make instal
```

## serverspecのインストール

gemを使用して、以下をインストール。

* serverspec : 本体
* rake : Rubyのビルドプログラム(Ruby版のmakeみたいなもの)

* highline : 標準出力に色を付けるgem

```
gem install serverspec rake highline
gem list serverspec
```

---

## テスト環境の作成

```
mkdir -p /usr/local/src/test
cd /usr/local/src/test
serverspec-init
```

---

## テストの実行

```
rake spec
```

---

## 参考


* https://www.setouchino.cloud/blogs/38

* [ServerSpec入門スライド](https://www.slideshare.net/TatsunoriSaito1/itamaeserverspec)

* [AnsibleとServerSpecの成功・失敗例](https://www.ospn.jp/osc2017-nagoya/pdf/OSC2017_Nagoya_tis.pdf)

* [ITインフラ自動化スライド](https://www.obci.jp/wp-content/uploads/2016/09/160901_OSC.Enterprise_TIS.pdf)

* [ServerSpecの例](http://www.atmarkit.co.jp/ait/articles/1608/02/news104.html)


* [chefとAnsibleの違い](https://www.ossnews.jp/compare/Ansible/Chef)

* https://dev.classmethod.jp/server-side/ansible/testing/

* [AnsibleとServerSpecの使い方](https://sekai-it.com/archives/4963)
https://github.com/devops-book
Donkey car(3.1.0)でColab上でCoral Edge TPU(2.0)向けモデル作成＆自動走行

#環境
- Raspberry Pi
 - OS : Raspbian Buster
 - TensorFlow Version : 1.14.1
 - Donkey Version : 3.1.0
 - with Coral USB Accelerator

- Google Colab
 - TensorFlow Version : 1.14.1
 - Donkey Version : 3.1.0
 - Edge TPU Compiler Version 2.0.258810407
 
- Host PC
 - MacBookPro Ver 10.14.4 (macOS Mojave)

#Buster,Donkeycarインストール&環境構築
Donkey Car v3.1.0 on Buster
https://docs.robocarstore.com/guide/robot_sbc/setup_raspberry_pi/

#pi(env)のtensorflowを1.14にバージョンアップ
参考　[PINTO0309/Tensorflow-bin](https://github.com/PINTO0309/Tensorflow-bin)

~~~shell
(env) pi@donkeypi:~$　sudo apt-get install -y libhdf5-dev libc-ares-dev libeigen3-dev
(env) pi@donkeypi:~$ pip3 install keras_applications==1.0.7 --no-deps
(env) pi@donkeypi:~$ pip3 install keras_preprocessing==1.0.9 --no-deps
(env) pi@donkeypi:~$ pip3 install h5py==2.9.0
(env) pi@donkeypi:~$ sudo apt-get install -y openmpi-bin libopenmpi-dev
(env) pi@donkeypi:~$ sudo apt-get install -y libatlas-base-dev
(env) pi@donkeypi:~$ pip3 install -U --user six wheel mock
(env) pi@donkeypi:~$ pip3 uninstall tensorflow
(env) pi@donkeypi:~$ wget https://github.com/PINTO0309/Tensorflow-bin/raw/master/tensorflow-1.14.0-cp37-cp37m-linux_armv7l.whl
(env) pi@donkeypi:~$ pip3 install tensorflow-1.14.0-cp37-cp37m-linux_armv7l.whl
~~~

#pi(env) donkeycarでデータ取得
~~~shell
(env) pi@donkeypi:~$ python3 manage.py drive --js
~~~

#pi→HostPC(Mac)へデータ転送してZIP化
~~~shell
$ rsync -r pi@192.168.100.193:/home/pi/mycar/data/tub_24_19-09-18 ~/donkeyprojects/mycar/data/
$ zip datas.zip tub_24_19-09-18/
~~~

#ColabにDonkey環境構築&HostPC（Mac）からデータ転送＆学習&コンパイル

参考 https://faboplatform.github.io/DonkeyDocs/1.DonkeyCar3%E3%81%AE%E6%A7%8B%E7%AF%89/09.train_colab/
Laravelでアプリケーションの環境によって条件分岐したいとき

表題の件についてです。基本的には、ドキュメントに書かれている内容です :ok: 


### APPファサードのenvironmentメソッドを使う
- ドキュメント https://readouble.com/laravel/5.8/ja/configuration.html

```php
if (App::environment('local')) {
    // 環境はlocal
}

if (App::environment(['local', 'staging'])) {
    // 環境はlocalかstaging
}
```

### このことを知った背景

- 以下のようなコードを書いていて、これだとキャッシュされてる場合、値を取れなくなる問題があると教えていただいた :pray: 

```php
if (env('APP_ENV') === 'local' || env('APP_ENV') === 'staging'){

}
```

- ドキュメント https://readouble.com/laravel/5.8/ja/helpers.html#method-env

> Note: 開発期間中にconfig:cacheコマンドを実行する場合は、設定ファイルの中で必ずenv関数だけを使用してください。設定ファイルがキャッシュされると、.envファイルはロードされなくなり、env関数の呼び出しは全てnullを返します
#SpringBoot 複数のデータソースを扱うときにハマったこと

# 何にハマったの？
こんな感じで設定して、複数のデータソースを扱おうと思ったの。
（設定クラスで `@ConfigurationProperties(prefix = "spring.datasource.develop")` って指定しつつ、みたいな）

```apprication.properties
spring.datasource.develop.url=jdbc:mysql://develop.com:3306
spring.datasource.develop.username=user
spring.datasource.develop.password=user
spring.datasource.develop.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.product.url=jdbc:mysql://product.com:3306
spring.datasource.product.username=user
spring.datasource.product.password=user
spring.datasource.product.driver-class-name=com.mysql.cj.jdbc.Driver
```

でも怒られちゃった。

```
Caused by: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
```

`url` 指定してるじゃんんん！

# どうやって解決したの？
結論、こんな感じ。

```application.properties
spring.datasource.develop.jdbcUrl=jdbc:mysql://develop.com:3306
```

`url` を `jdbcUrl` に置き換えただけ。これで問題なくアプリケーションを起動できた。

# 何がダメだった？
今回、コネクションプールライブラリは `HikariCP` を利用。
springの標準の `url` プロパティをコネクションプールの `jdbcURL` にマッピングできなかったがゆえに怒られてた。
（`spring.datasource.url` の `datasource` と `url` の間にデータソース名を入れたためにマッピングに失敗しちゃってた）

単体のデータソースを扱う場合は、`develop` とかを入れたカスタムフィールドにしないから自動マッピングでいい感じにしてくれてたけど、
今回はカスタムしちゃったから自動マッピングしてくれず。
`@CofigurationProperties` アノテーションで手動マッピング（という表現が正しいかは置いといて）だったからこそ `jdbcUrl` って明示的に指定してあげなきゃいけなかったぽい。
Xcodeを入れてみよう

# はじめに
サポーターズCoLabさんにて登壇にあたってXcodeの環境構築に関する記事を書きます。
登壇イベント：https://supporterzcolab.com/event/943/

![e9b976a30d1747166d29461c9f7d8a50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/0469094e-3eed-3920-667c-f2e2e9e835bd.png)


まずは、Xcodeをインストールして開発スタートするまで体感しましょう！
この記事を見て無事に環境セットアップ出来たら「いいね」押してくださいね！

今回はmacユーザ向けのTutorialです。windowsは複雑なので注意。
windowsユーザ参考：https://style.potepan.com/articles/9097.html#XcodeWindows

# STEP 1：Xcodeをインストールしよう！ 
まずは下記のURLを開きます！
https://apps.apple.com/jp/app/xcode/id497799835?mt=12

こんな感じでインストール待ちましょう！

<img width="1292" alt="スクリーンショット 2019-09-18 23.26.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/654c8c41-ea08-160a-6ea0-c3810b011114.png">

無事インストール完了！

# STEP 2：Xcodeを立ち上げてみよう！

<img width="848" alt="スクリーンショット 2019-09-18 23.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/e39d7f22-367f-c4a1-51cf-1c0b4be4b149.png">

Create a new Xcode project でプロジェクトを起動します。

<img width="1440" alt="スクリーンショット 2019-09-18 23.58.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/f88be49f-454c-41b6-2f10-1bfd91491311.png">

- Display Name にサービス名を記入
- Bundle Identifier も記入
- AppleID を登録

この3点で準備完了です！

# STEP 3：たったこれだけで開発の一歩完了

さぁ、開発を始めましょう！！！
![0ec20a255166217df684c529f4ec5c73_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/beb4e9ca-d478-ff84-ac74-f2bbcc96167f.jpeg)


# 参考
- 他のサイト：https://techacademy.jp/magazine/1409
- Bundle Identifier：https://qiita.com/miyamotok0105/items/f24a4e10a2877ae70bc4
【俺得】【ApacheとTomcat連携】　エラードキュメントをApacheで表示させてみた。

#設定箇所
***httpd.confにて設定***
基本的な設計としてクライアントからきたアクセスをTomcatへ全て流す設計だが、
404エラーが発生した場合に限り、
Apache側で静的コンテンツを表示できる様にProxyPass /error/error.html !で除外設定をしている。


```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

ErrorDocument 404 /error/error.html
DocumentRoot /var/www/html

ProxyPass /error/error.html !
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/



```
[git] 間違えてしまったユーザー名/PW(資格情報)を消す方法

**もくじ**
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
gitのリポジトリをクローンする際ユーザー名とパスワードを聞かれるが、そのときにユーザー名orパスワードを間違えて入力してしまった。

もう一度やり直そうとすると、その間違えたユーザー名orパスワードを覚えてしまっているらしく、何度やってもAccess deniedとか言われ、クローンできない。

間違えてしまったユーザー名とパスワードの情報を消して、クローンを済ませたい。

# やり方
Windowsの「資格情報マネージャー」を使う。

# 手順
- [コントロールパネル] > [資格情報マネージャー] を開く。

- 「Windows資格情報」を開く
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/3566fb1c-41b7-4a46-d632-8494bd432037.png)
- 下の方に「汎用資格情報」という欄があり、その中に`git:http//〇〇・・・`というのがある。そこれを開いて「削除」する。

これで、間違えてしまった資格情報が削除される。
もう一度gitでクローンすると、改めてユーザー名とパスワードを聞かれるので、正しいものを入力すればOK。
「終 制作・著作 ⓃⒽⓀ」のロゴをCSSで作ってみた

# やってみたかった
下記のような使い方をするもので、Twitter等で流行っているヤツである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/3c923605-5b6d-d8e3-0201-d0d1e0508cfc.png)
 
たまご型の〇とか、棒線の角丸とかやりたいので、ちゃんとCSSを勉強しようと思う。

　　終
制作・著作
━━━━━
　ⓃⒽⓀ

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="sapporo_east_k" data-slug-hash="rNBqzzz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="終">
  <span>See the Pen <a href="https://codepen.io/sapporo_east_k/pen/rNBqzzz/">
  終</a> by かんちゃん (<a href="https://codepen.io/sapporo_east_k">@sapporo_east_k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

スマホで見るとつぶれてるので、WindowsのChromeで見てください〜


# 追記。神降臨

ロゴのデザインを大幅改良してくださりました！本当に嬉しいです、ありがとうございます！
CSSやりこんでる人のクオリティはやばいですね（語彙力）

https://ebifry.jp/css/nhk-css/
ツールまとめ


よく使うツールをまとめました。

## 1. [iTerm2](https://www.iterm2.com)

- 使う理由
  - 見た目がきれい
  - 多機能

### キー設定変更

  - メニューの [iTerm2] -> [Preferences] -> [Keys] で +(プラスボタン)を押して以下を追加

    |Key Combination  |Action  |
    |---|---|---|
    |command + h  | Move Tab Left  |
    |command + l  | Move Tab Right  |

## 1.1 Finderから iTerm2 を開けるようにする

1. cdto をダウンロード
  https://github.com/jbtule/cdto/releases/tag/2_6_0
2. インストール・設定

   1.  `cd to` を アプリケーション フォルダに移動
   1.  **command**キーを押しながら `cd to` を Finder の上の方へドラッグアンドドロップ
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44953/9256e279-6a5c-0492-e180-a12c2c8012f0.png)
   1. これでFinderパスでiTerm2を開くことができる

## 1.2 Mac のスクリーンショットを ダウンロードフォルダに格納されるようにする

- 以下のコマンドで **shift + command + 3** や **shift + commnad + 4** などでスクリーンショットを保存する先のパスを ~/Downloads に変更する

  ```
  $ defaults write com.apple.screencapture location ~/Downloads/
  $ killall SystemUIServer
  ```

## 2. メモ管理ツール

- 有料
  - [MWeb](https://apps.apple.com/jp/app/mweb/id1403919533?mt=12)（今使っているやつ）
  - [Quiver](https://apps.apple.com/jp/app/quiver-take-better-notes/id866773894?mt=12)
  - [esa](https://esa.io)（webサービス）
- 無料
  - [Boostnote](https://boostnote.io)

## 3. GitのGUI
  - [SourceTree](https://www.sourcetreeapp.com)
  - [Fork](https://git-fork.com)


## 4. メーラー(Gmailを使用している場合)
  - Mac標準メーラーを使用しGmailと連携（今使っているやつ）
  - [Biscuit](https://eatbiscuit.com/ja) で Gmail閲覧
  - Chromeで Gmail閲覧（シンプル）

## 5. クラウドストレージ
  - Dropbox
  - OneDrive

## 6. スクリーンショット撮影
  - [Skitch](https://apps.apple.com/jp/app/skitch-%E6%92%AE%E3%82%8B-%E6%8F%8F%E3%81%8D%E8%BE%BC%E3%82%80-%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/id425955336?mt=12)
    - **shift + command + 5** で範囲スクリーンショットを撮れる
    - 環境設定
      - 「Skich 終了後も、Skitch Helper をバックグラウンドで起動したままにする」にチェック
      - 「コンピュータのログイン時に Skitch Helper を起動する」にチェック

## 7. スクリーンショット撮影（gifアニメ）
  - [licecap](https://www.cockos.com/licecap/)


## 8. デザインツール（画面設計などで使用）
  - [Sketch](https://www.sketch.com/)


## 9. マインドマップ作成
  - [MindNode6](https://apps.apple.com/app/mindnode-6/id1289197285?ct=web&l=en&mt=12)

## 10. API ドキュメントツール
  - [Dash](https://kapeli.com/dash)

## 11. アプリのアンインストールツール
  - [AppCleaner](http://freemacsoft.net/appcleaner/)

## 12. [BetterTouchTool](https://folivora.ai/downloads)
簡単に言うと、キーボードやトラックパッドにショートカットを追加するツール。
私の場合、これがないと仕事できないレベルで多用している。

### 12.1 設定例

|ドリガー名  |割り当てられたアクション  |補足  |
|---|---|---|
|shift + option + command + ↑  |ウィンドウを最大化  |   |
|shift + option + command + →  |ウィンドウを次のモニターに移動する  |外付けディスプレイにウィンドウを移動|
|option + tab  |command + F1 | 同一アプリでウィンドウ切り替え |
|option + L  |スリープ表示 |  |
|option + F  |ファインダーを開く |  |
|option + T  |起動 iTerm.app |  |
|option + P  |起動 Digital Color Meter.app | **shift + command + C** で色をクリップボードへコピーできる  |
|option + A  |起動 Launchpad.app |   |
|option + J  |起動 Dictionary.app | 辞書は便利  |
|option + C  |起動 Google Chrome.app |   |
|option + D  |起動 Dash.app |   |
|option + M  |起動 MWeb.app |   |
|option + N  |起動 Notes.app |   |
|option + S  |起動 Fork.app |   |
Bootstrap4  トグルスイッチの値をaddEventListener clickで取得する →うまくいかない。→解決


会社の受付フォームを趣味でごりごり作成しております。図のようにトグルスイッチを用いて「溶接区分」の「半自動溶接のボタン」を押すと、「addEventListener 'click'」でイベントを発火させ、種目funcで「溶接区分」の「半自動溶接(id_wc_0.checked)」、「ステンレス鋼溶接(id_wc_1.checked)」、「手溶接（アーク）(id_wc_2.checked)」の押されたのを取得して、処理するようなプログラムを作成したいのですが、「溶接区分」の「半自動溶接(id_wc_0.checked)」をクリックしても「if==id_wc_1.checked」が「True」に変わらず「False」のままです。。。もう一度クリックすると、「if==id_wc_1.checked」 が「True」に変わります。どなた様かご教授お願いいたします。ちなみに「addEventListener 'click'」を「addEventListener 'change'」にするとイベントも発火しませんでした。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433444/117c16a6-04ae-a793-d0ed-53c6757d7845.png)

```form.html
<td>
 <div id="溶接区分" class="btn-group btn-group-toggle" 
data-toggle="buttons">
  <label class=" btn btn-primary"><label for="id_wc_0"> 
  <input type="radio" name="wc" value="1" id="id_wc_0">
 半自動溶接</label></label>               
  <label class=" btn btn-primary"><label for="id_wc_1"> 
  <input type="radio" name="wc" value="2" id="id_wc_1">
 ステンレス鋼溶接</label></label>                
  <label class=" btn btn-primary"><label for="id_wc_2"> 
  <input type="radio" name="wc" value="3" id="id_wc_2">
 手溶接(ア－ク)</label></label>                
</div>
</td>
```

```main.js
document.getElementById('溶接区分').addEventListener('click', 種目func, false);


function 種目func() {
console.log(id_wc_0.checked);
console.log(id_wc_1.checked);
console.log(id_wc_2.checked);
if (id_wc_0.checked == true) {			//半自動溶接
//（コード）
}else if (id_wc_1.checked == true) {	//ステンレス鋼溶接
//（コード）
} else if (id_wc_2.checked == true) {	//手溶接
//（コード）
}
```
Kotlinと図で学んでみるデザインパターン -4章 Factoryパターン-

# Factoryパターン
作り方をスーパークラスで定義し、インスタンスの作成をサブクラスに任せる
![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187392/faaa7486-d545-9be1-3d5f-5bad6d203da6.png)

### 抽象クラス群
```kotlin
package framework

abstract class Product {
    abstract fun use()
}

abstract class Factory {
    fun create(owner: String): Product {
        val p = createProduct(owner)
        registerProduct(p)
        return p
    }
    protected abstract fun createProduct(owner: String): Product
    protected abstract fun registerProduct(product: Product)
}

```

### 具体クラス群
```kotlin
package idcard
import framework.*

class IdCard(private val owner: String) : Product() {

    init {
        println("{$owner}のカードを作ります")
    }

    override fun use() {
        println("{$owner}のカードを使います")
    }

    fun getOwner(): String {
        return owner
    }
}

class IdCardFactory() : Factory() {

    private val owners: MutableList<String> = mutableListOf()

    override fun createProduct(owner: String): Product {
        return IdCard(owner)
    }

    override fun registerProduct(product: Product) {
        val idCard : IdCard = product as? IdCard ?: return
        owners.add(idCard.getOwner())
    }

    fun getOwners() : List<String>{
        return owners
    }
}
```

### 実行

```kotlin
fun main(){
    val factory = IdCardFactory()
    val card1 = factory.create("Tsutou")
    val card2 = factory.create("Hanako")
    val card3 = factory.create("Taro")

    card1.use()
    card2.use()
    card3.use()
}
```
※ Java 言語で学ぶデザインパターン入門をKotlinと図で理解しようとしている学習用アウトプットです。UML書式に沿ってはいません。
mysql2 gemがインストールできない時の対策 全部のせ

`mysql2 gem`は色々な理由でインストールできなくなることが多々ある。その全ての対策を書いておく。

## 事前にやっておくべきこと

### Command Line Toolsのインストール

既にインストールしていたとしても、Xcodeのバージョンアップ、OSのバージョンアップ、などで再インストールが必要になることがある。

`mysql2 gem`のインストール（とそれに関連するコンパイル）でトラブルが起きたときは、とりあえず下記のコマンドを実行しておくとよい。仮に何度もやったからといって、何かが壊れることはない。

```sh
xcode-select --install
```

[Xcode - install Command Line Tools](https://stackoverflow.com/questions/9329243/xcode-install-command-line-tools)

### Command Line Toolsをpkgファイルでインストールする

**この手順は、Command Line Toolsがコマンドラインからインストールできなかった人向けです。**

Command Line Toolsは、OSのバージョンによってはコマンドラインからインストールできないことがある。その場合は、Mac OSとXcodeの両方のバージョンの組み合わせに一致するpkgファイルで直接Command Line Toolsをインストールする必要がある。

pkgファイルは[Apple公式サイト](https://developer.apple.com/download/more/)で「command line tools」を検索すれば見つけることができる。

<img width="746" alt="スクリーンショット 2019-09-18 23.06.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/71b46a38-d767-4192-acd8-6fe74f0490cb.png">

↑ 2019年9月時点で最新の環境の場合、`Command Line Tools (macOS 10.14) for Xcode 10.3.dmg`をダウンロードすることになる。

[xcode-select --installに失敗した](http://pokuwagata.hatenablog.com/entry/2018/11/04/210256)
[More Downloads for Apple Developers](https://developer.apple.com/download/more/)

### Cのヘッダーファイルをインストールする

Mac OS Mojaveにアップデートすることで、Cのヘッダーファイルが読み込めなくなることがある。その場合は、Command Line Toolsをインストールした時にコピーされるpkgファイルから、Cのヘッダーファイルのみインストールする必要がある。

```sh
sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
```

Command Line Toolsが正しくインストールされていれば、上記のコマンドを実行して、インストーラーの指示に従うだけでよい。

[macOS MojaveにアプデしたらCのヘッダーファイルが読み込まれなくなった件](http://kane-please.hatenablog.com/entry/2018/11/07/001823)

### MySQLをインストールする

MySQLをインストールすることで用意されるCのヘッダーファイルもあるため、忘れずにインストールしておくこと。

```sh
brew install mysql
```

## mysql2 gemのインストール

### コンパイルオプションを何も指定しない場合

上記の事前準備を全て済ませた上で、まずはこのコマンドを試してみる。これで完了してくれればとても嬉しい。

```sh
bundle install --path .bundle
```

※ `mysql2 gem`がインストール失敗した際に、`You have to install development tools first.`と表示されることがありますが、事前準備が正しく完了しているなら、このエラーメッセージはなんの関係もありません。

### コンパイルオプションを指定する場合

上記のシンプルなコマンドでインストールできなかった場合は、bundlerにコンパイルオプションを指定してみる。

```sh
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

bundle install --path .bundle
```

上記のbundle configコマンドは、下記のコマンドと同じ意味になります。

```sh
gem install mysql2 -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include
```

2020/04/10 さらに追加。opensslのバージョンによってはこの設定が必要。

```
bundle config --local build.mysql2 --with-opt-dir="$(brew --prefix openssl)"
```

ここまでの手順で、`mysql2 gem`はインストールできているはず…！ もしできなかった人がいたら、コメント欄で教えてもらえるとありがたいです。
Angularで始めるモダンWeb開発セミナー受講メモ(2019/09/12)

## 参加の目的
[業務システム開発のための開発言語／フレームワーク情報収集(2019年版)](https://qiita.com/yet103/items/d5c8c90b40ef6b518d33)の一環。

## ハンズオンセミナ概要
[Angularで始めるモダンWeb開発セミナー](https://connpass.com/event/140089/) 2019/09/12開催分

- 主な内容
　- Angularのこれまでの歴史やその使いどころ
  - 現在の周辺環境からサポート状況確認
  - Angularを構成する主な要素をAngular CLIをベースにしたデモを交えて解説、およびハンズオン
  - Angular専用 UI ライブラリIgnite UI for Angular について解説
  - Angular + Ignite UI for Angularをベースとしたアプリケーション開発をハンズオン形式で体験

## 学べたこと
- 感想として、Anglarで全てをスクラッチ開発するのは厳しい(難易度が高い)と感じた。
- セミナーで紹介していただいた商用UI製品(Ignite)などを活用することが必要そう。
- Ignite UIはAnglarに限定せずにWebシステムに導入できそうなので、今後評価／検討をしてみたい。

## はまったこと
- プロキシ問題
    - 自分のNW環境では作業だったため、プロキシ(認証あり)の設定が必要でしたが、事前に以下の案内をいただいていたので設定できました。
[参考リンク：[Node.js] npm の proxy と registry 設定](https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)

```bash
$ npm -g config set proxy http://username:password@prox.example.com:8080
$ npm -g config set https-proxy http://username:password@prox.example.com:8080
$ npm -g config set registry http://registry.npmjs.org/
$ npm config list
```

- `ng new my-app`時に、gitコマンド実行個所がエラー → GitのPATHを通して再実行

---

## セミナーの目的
SPAやAngularの概要・特徴をおさえる

- 最良な開発プラットフォームの選択ができる状態になる
- 最低限のAngularアーキテクチャをおさえる

## SPAの構成と特徴(従来のWebアプリと比較して)

1.サーバーレンダリング
　　ASP.NET,JSP

2.クライアントレンダリング
　　MVC,Spring,json,xml,Silverlightなど

3.Single Page Application
　JavaScriptベースでアプリを構築

## SPAの利点
- サーバとクライアントの分離
- JavaScriptアプリの将来的な転用
- UIの柔軟性
- オフライン対応(Service Worker)をはじめとしたPWA 
- Webコンポーネントとしての部品再利用性

## SPA向き／不向き
- マルチデバイス／マルチブラウザ対応 → 〇
- 静的コンテンツ、Blogなど → ×
- SEO対策 → ×
- RIA(Flash,Silverlight)からの移行 → 〇 (来年でEOS。非常に多い) 
- 開発後、〇年塩漬けしたい → × (WebブラウザVUP対応など必要。Angularのリリースサイクルにも追従必要)

## スムーズなアップデートのために
- 常に最新のブラウザやFrameworkの動向をキャッチアップ
- テスト自動化は必須。スクリーンショットの差異のテストなども実現可能
- Frameworkのバージョンアップを阻害しない( 特定バージョンに依存するライブラリを使わない。メンテナンス頻度や依存ライブラリなどを確認する)
- ロジックは可能な限りAngular非依存で書く

## Angularの歴史と現状
2009年、AngularJS、Googleと個人や企業のコミュニティによって開発。
その後変遷があり、現在はAngularへと変わっており、互換性は無くなっている。

## 開発イメージ
- Components → TypeScriptのclass (= JavaScriptのClass)
    - 日付入力部品、情報入力部品など。再利用性のあるものを任意に構成できる
- Metadata
    - メタデータ
- Template
    - View(見た目)の定義
- Data binding
    - 処理とDOMをつなげる
        - Interpolation
        - Property binding
        - Event binding
        - Two-way binding ---> 双方向
- Service
    - アプリケーション内における共通的な処理
    - (例：ログ、認証、通信、その他共通的なロジック)
- Dependency Injection(依存性注入)
    - コンポーネントにクラスのインスタンスを提供
    - 自動的にインスタンス生成
    - シングルトン

## 実演
- ngコマンドでプロジェクト作成
- node_modules ---> かなりの数のライブラリ群。npmでインターネット経由で取得
- srcフォルダ ---> ソースを書いていく
- (`code`コマンドでVS Codeを起動)

## その他
[Stack Blitz](https://stackblitz.com/)
オンラインの VS Code。Angularのデモ環境を簡易に作成可能。