OmniAICreator/Qiita-1.07M huggingface dataset:
GrafanaをMySQLと連携してデータの永続化

# 概要
- データ監視のためのgrafanaについて
- 業務で使用するときはkubernetesを使用してgrafanaを使用しているが、デフォルトの設定だとデータが永続化されない（podが再起動するとデータが消える）
- grafanaがデータベースとしてMySQLを使えるというのを見つけたから試してみる！

# 環境
- 今回は個人のMacで
- どんな設定をしたらMySQLと連携できるのかだけ確認する

# 準備
grafanaとMySQLのインストール

```bash
brew install grafana
brew install mysql
```

確認

```bash
brew services list
```
起動と動作確認

- MySQL

```bash
brew services start mysql
mysql -u root
```

- grafana

```bash
brew services start grafana
# http://localhost:3000/にアクセス（デフォルトの管理者ユーザはadmin/admin）
```

## mysqlの設定
- databaseを作成する
- grafanaユーザを作成する
  - mysql8ではmysql_native_passwordを指定する必要がある
  - その他のpluginではgrafanaが対応していない

```
mysql -u root

create database grafana;

create user 'grafana'@'localhost' identified with mysql_native_password by 'grafana';

grant all on grafana.* to 'grafana'@'localhost';
```

## いざ連携！
ここからは[公式ページ](https://grafana.com/docs/installation/mac/)を参考に。。。

設定ファイルは`/usr/local/etc/grafana/grafana.ini`これ

databaseの設定をこんな感じに修正

```ini:grafana.ini
#################################### Database ####################################
[database]
# You can configure the database connection by specifying type, host, name, user and password
# as separate properties or as on string using the url properties.

# Either "mysql", "postgres" or "sqlite3", it's your choice
type = mysql
host = localhost:3306
name = grafana
user = grafana
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = grafana
```

grafanaをリスタート！

```bash
brew services restart grafana
```

動いた！！！

## DBを確認

```
mysql -u grafana -p grafana

mysql> show tables;
+--------------------------+
| Tables_in_grafana        |
+--------------------------+
| alert                    |
| alert_notification       |
| alert_notification_state |
| annotation               |
| annotation_tag           |
| api_key                  |
| cache_data               |
| dashboard                |
| dashboard_acl            |
| dashboard_provisioning   |
| dashboard_snapshot       |
| dashboard_tag            |
| dashboard_version        |
| data_source              |
| login_attempt            |
| migration_log            |
| org                      |
| org_user                 |
| playlist                 |
| playlist_item            |
| plugin_setting           |
| preferences              |
| quota                    |
| sample                   |
| server_lock              |
| session                  |
| star                     |
| tag                      |
| team                     |
| team_member              |
| temp_user                |
| test_data                |
| user                     |
| user_auth                |
| user_auth_token          |
+--------------------------+
35 rows in set (0.00 sec)

```
たくさんテーブル作られてる！
最初プログラミングを学びすすめていくときこんな順番

まだプログラミングを勉強し始めて３か月
こうするとできるようになっていくんだなぁ～をメモしてみました。

＃順番
１．とにかく分からないなりにググってみる
２．初心者向けの本を読んでみる
３．１つの記事だけや1つの本だけだと見えないことが多い
４．とにかく多く参照してみる
５．そのとき分かろうと苦しむのも大事！⇒あとで活きる
６．多くの参照から繋がったとき！あ～こうか！分かった！になる
７．それに関することでアウトプットしてみる（写経やちょいアレンジ）
８．エラーしながらできたとき、うれしい～！(・∀・)ﾆﾔﾆﾔ
９．繰り返す

＃＃感覚的には
見えてきた（じつはちょっとだけ）、見えてきた（少しずつ）、見えてきた（分かった気になってる？）
この一歩一歩が楽しい！
が積み重なっていく

人間、ほしいと思う情報が入ってくる
気にしていないことは入ってこない、ことになっている

躊躇せず検索、読書、動画学習、コードを書いてみる
をコツコツの継続が上達することなんだなぁ～
と思っている今日この頃。
Dart constructors

# Dart constructors
Dart言語のConstrucotrの種類はJavaと比べると記載方法が格段に多いです。
覚えることが多い反面、覚えて書くととてもスマートに書ける箇所です。
個人的にDartの個性が存分に出ている素晴らしい箇所だと感じます。

## Javaライクなオーソドックスな書き方
``` dart
class Constructor {

  int a;
  int b;

  // コンストラクタ
  Constructor(int a, int b) {
    this.a = a;
    this.b = b;
  }
}
```
Javaで見慣れた書き方だと思います。あまり特徴はないです。

## 省略した書き方

``` dart
class Constructor {

  int a;
  int b;

  // コンストラクタ
  Constructor(this.a, this.b);
}
```
コンストラクタに直でthisを書ける方式です。これでインスタンス変数に設定されます。（画期的）

## 名前つきのコンストラクタ

``` dart
class Constructor {

  int a;
  int b;

  // コンストラクタ
  Constructor(this.a, this.b);

  // 名前つきコンストラクタ
  Constructor.origin() {
    a = 0;
    b = 0;
  }
}
```

凄く新しい書き方だと思います。コンストラクで何をやりたいか名前つけて判別できる優しい書き方だと思います。

## リダイレクトコンストラクタ

``` dart
class Constructor {

  int a;
  int b;

  // コンストラクタ
  Constructor(this.a, this.b);

  // 名前つきコンストラクタ
  Constructor.redirect():this(0,0);
}
```
他のコンストラクタの書き方がスマートですよね！{}の記載が不要なので１行で書けます！

他にFactoryやCostantもあります！奥が深い、、、
Eclipse、IntelliJ IDEAの基本操作

IntelliJ IDEAとEclipseはJAVA向けの開発では最も利用されているIDEだと思います。

Eclipseはプラグインなどの利用ですごく強力ですが、反応が遅いという印象でした。
直近最新のEclipseをインストールして操作した感じだとかなり早くなりました。

Eclipse派　VS　IntelliJ IDEA派　という好き嫌いではなく、どちらが自分に対して効率的になるかと思います。

#Eclipse
初期設定は、Workspaceのエンコード（UTF-8）、テキストEditorの行番号の表示、JDKの設定などがあります。
すでに数多くの紹介記事がありますが、最小限の操作仕方を紹介します。
##main関数の作成
mainを入力してCtrl + Space　で補完します。
![main.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/8067c0b6-440e-28db-d449-1c1e3d9eb1ba.gif)

##System.out.println()
sysoを入力してCtrl + Space　で補完します。
![sysout.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/061f86dd-e498-1c3f-2aa7-56a907ab2ed1.gif)

##Ctrl + 1
Ctrl + 1　でやりたいことを推奨されます。
例えばローカル変数にアサインするなど

##パッケージ名 ＋　クラス名　のコピー
先にパッケージ名、その後クラスをコピーして連結ができます。ミスなく作業するのは、
クラス名を選択し、Edit⇒Copy Qualified Name
![className2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/efbd3b27-98aa-781e-464b-852eed959323.gif)

##クラス名探すなど
アイコンを押すか、「Ctrl +　Shift　＋T」を押すことで、ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/11b21c74-45c9-b61d-a328-9d6102764c1d.png)

例えば、Mapを入力すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/bdd2ea4a-b615-8e0b-1b5e-fb12ff8051c8.png)

##インポート整理
不要なインポートの整理、インポートされていないクラスを自動インポートされるのは、
Ctrl + Shift + O

などなど。

#IntelliJ IDEA
補完機能が豊富ですね。

##変数定義
"aa".var

##null判断
"aa".null

##not null判断
"aa".notnul
"aa".nn

##foreach
list.for  

##fori 
list.fori

##forr
list.forr 
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/03168676-e048-d845-199c-73e5b8841562.png)


##psvm
main関数

public static void main(String[] args) {
        
}

##sout
System.out.println();
 
##souf
System.out.printf("");

##soup
System.out.println("args = [" + args + "]");

##soutm
System.out.println("ClassName.main");

##soutv
System.out.println("args = " + args);

##コード候補など
ALT+INSERTでコード生成選択可能です。

などなど

下記のサイトは詳しいです。
https://pleiades.io/help/idea/mastering-keyboard-shortcuts.html

以上
続2 改元対応試案 マイクロソフトが改元に対応ができない理由と各自でファイル名を西暦にすべき理由

#いろいろ考えた結果、あきらめるしかない
マイクロソフトが改元に対応ができない理由と各自でファイル名を西暦にすべき理由
https://qiita.com/Q11Q/items/d0f08a54f29bbb320f12
続 平成31年5月1日問題 マイクロソフトが改元に対応ができない理由と各自でファイル名を西暦にすべき理由
https://qiita.com/Q11Q/items/d0f08a54f29bbb320f12

とりあえず文書で無理に令和を使うとか、入力で令和を使うシステムは当面どういうバグが起きるか全くわからない。以上から

##このままなにもしない

という対応が一番適切であるという結論に到達した。

#なにもしないためにマニュアルを作る
今回の場合、なにもしないことを前提に対応を決める方が、令和に対応しようとして失敗する可能性よりはるかに低く、コストもかからないと想定されます。
要は会社の内外に、現在マイクロソフトの対応が遅れていることを理由に、平成を使用することをアナウンスする。

##読み替えの告知で対応しよう
なので一般的にはWEBページなどで次のような趣旨の告知する。
　当初5月1日以降令和元年を使用する予定でしたが、当社のシステムのOS自体が新元号への対応が遅れており、新元号に対して十分な当社のシステムの検証ができておりません。このため、書類等の令和表記について十分な対応ができておりません。。
　お客様には大変申し訳ございませんが、当分の間、当社の書類、電子メールにおいて平成を使っている場合がございますが、平成31年4月30日の翌日以降の日付の元号は「令和」に読み替えていただきますようお願いします。

　第一OSが動いてないし、オフィスも動かないのだからムリに令和に変えるとそれ以外の部分で影響がある可能性が大である。

　これで少なくとも平成31年度中は令和を使用することができる。

#日付は今後以下のように対応する
##全般的な注意まとめ
令和元年以内にやること。できれば5月以内。令和以降のファイルとファイル名で区別できるようにする。そのためフォルダ名かファイル名で元号を西暦に変えるか付加する。
データの中身は極力いじらない
令和以降はアルファベットでR01とは表現しない(Rはリリース、リビジョン等を意味する。R18に至っては．．．)
元号だけを使用しない
元年は絶対に使用しない
年、月までは使う(平成か令和か不定になるのを回避)
その場合ピリオドは厳禁。アンダーバーをつける
元号は西暦に変える
ただしルートのフォルダに西暦があるか、西暦に変えた場合は深追いしない。
ファイル名は西暦に変える方法か、西暦をファイル名の前に置く方法を用いる。
##令和以降はアルファベットを使用しない
R01のような表記をしない(西暦と一意に対応しない)
元号だけ入れない(西暦と一意に対応しない)
もしどうしても入れる場合はL01にする

####例
H31文書
H3104文書
H31年4月文書

###元年は絶対に使用しない
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今のローソンATMは過去に振り込めるのか… <a href="https://t.co/SaLNNTZZPR">pic.twitter.com/SaLNNTZZPR</a></p>&mdash; RAO(らお)@けもケI-27 (@RIORAO) <a href="https://twitter.com/RIORAO/status/1122463333695627266?ref_src=twsrc%5Etfw">2019年4月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
これはどうせフェイクだろうけど、こういうことが起きても全く不思議ではない。元号がユニーク性を喪失した以上、こういうことが起きるのが当たり前。元年を使うからこれを何とかしろという人は人間としての知性を備えていない。社会にとって有害なので治療が必要だ。
もともと元号は使用しないべきだが、使用する場合必ず01にする
漢字と数字が混在するとソートも検索も困難になる。
***しかも元年はすべての元号に存在し、特に平成元年があるため重複する可能性がある。***と上記のツィートを見る前にこの行は書いていた。なので不思議ではない。起きて当然で、珍しく思う方がむしろ以上で、およそ頭を使っていないせいさんせいのないクズだとしか思えない。平成31年の方がまだマシで*可読性も高い*であろう。

#今後、Microsoft Officeで文書、ワークシート、プレゼンテーション、データベースを作成するときの注意事項
基本的にすべて西暦で入力し、表示形式等で対応する。
絶対に元号を使わないこと。

##Wordは日付コンテンツコントロールで日付を入力
###短所
日付の数字は全角にならない。しかし仕様なのであきらめる。
###長所
　マイクロソフトがいつかなんとかするだろう。それに日付コンテンツコントロールなら、文字にするときも簡単だから

###Excelは表示形式を使う
gggeeを使う。
この場合なるべく月まで入れる
2019年ではなく2019年4月まで
ただし以下のような小数点表記はやめる
2019.4 OR 2019.01
2019年04月に変える。
そろうことを考えなければ
2019年4月のほうがあとで正規表現を使う場合でも非常によい

###Access,Powerpoint,Publisherは何もしないであきらめる
Accessは元年表記とかできないらしいので放置
pythonでJaccard係数を実装

#はじめに
学校でJaccard係数なるものがでてきたので, 自分で実装してみようと思います. その際, 参考にしたサイトは以下です. 
[参考サイト](https://mieruca-ai.com/ai/jaccard_dice_simpson/)

#Jaccard係数
Jaccard係数は集合同士の類似度を示すものです. 
集合Aと集合BのJaccard係数Jaccard(A,B)は
Jaccard(A,B) = |A∩B|/|A∪B|
と定義されます. 
集合A = [1, 2, 3, 4], 集合B = [2, 3, 5, 7] とすると以下の図のように表現できます. 
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/b79b2ffd-22fd-72ec-ba2f-b181f7e80f6d.png)

JAccard係数は, 2つの集合の要素のうち共通要素がどれくらいの割合占めるかを表す値です. Jaccard係数の値が大きいほど, 2つの集合の類似度が高いことを示す. 

#実装
実際のコードは以下のようになります. 例として集合を3つ作り, それぞれの集合の組み合わせのJaccard係数を求めるようにしています. 

```python
# coding:utf-8
import numpy as np
import itertools
from fractions import Fraction

# Jaccard係数を計算
def jaccard(x,y):
    # 積集合の要素数
    intersection = len(set.intersection(set(x), set(y)))    
    # 和集合の要素数
    union = len(set.union(set(x), set(y)))  
    # 分数表示で返す                 
    return Fraction(intersection , union)

A = np.array([1, 2, 3, 4])
B = np.array([2, 3, 5, 7])
C = np.array([2, 4, 6])
tmp = [A, B, C]
### すべてのリストの組合せ作成
tmp2 = list(itertools.combinations(tmp, 2))
###すべての組合せにjaccard適用
for i in tmp2:
    print(i[0],"&",i[1],":",jaccard(i[0], i[1]))
```
KubernetesでMySQLの文字コードを指定する

## 前提
[DockerHubの公式ドキュメント](https://hub.docker.com/_/mysql)には、`docker run`時の指定方法が記載あります。

```sh
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

## 解決方法
Kubernetesのリソース定義で記載すると以下のようになります。

```mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-root-password
        - name: MYSQL_USER
          valueFrom:
            configMapKeyRef:
              name: mysql-configmap
              key: mysql-user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-password
        - name: TZ
          valueFrom:
            configMapKeyRef:
              name: mysql-configmap
              key: tz
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
```
Leetcode #112: Path Sum

```swift
func hasPathSum(_ root: TreeNode?, _ sum: Int) -> Bool {
    if root == nil {
        return false
    }
    if root!.left == nil && root!.right == nil {
        return root!.val == sum
    }
    if root!.left == nil {
        return hasPathSum(root!.right, sum - root!.val)
    }
    if root!.right == nil {
        return hasPathSum(root!.left, sum - root!.val)
    }
    if hasPathSum(root!.right, sum - root!.val) || hasPathSum(root!.left, sum - root!.val) {
        return true
    }
    return false
}
```
CentOS 7 GNOME最小構成インストール

<img width="912" alt="スクリーンショット 2019-02-10 1.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/bb56b5a2-532a-2676-058e-361efd5734b4.png">
## CentOS 6.x まではあったGNOMEの最小構成インストール

<img width="912" alt="スクリーンショット 2019-02-05 0.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/acaa8289-65ac-b16e-a9ac-2217121842dc.png">


余計なものを入れたくない人は、
最小構成でセットアップ後必要なパッケージを追加すると思う。

CentOS 7.xで GNOMEデスクトップ環境を追加すると

```shell
yum groupinstall "Gnome Desktop"
```
<img width="912" alt="スクリーンショット 2019-02-03 20.28.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/b569625d-359e-575d-e83f-f48cc8cf0b30.png">
とても多くのパッケージがインストールされる。
これを何とか最小限のパッケージにできないものかと調べてみた。

####1. X Window System のインストール

```shell
yum groupinstall "X Window System"
```

####2. GNOME環境をインストール

```
yum install gnome-terminal gnome-desktop3 nautilus gnome-session control-center vlgothic-* liberation-mono-fonts gnome-classic-session
```

<img width="912" alt="スクリーンショット 2019-02-10 1.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/89a70ee7-b6a0-2753-b554-c7463e850728.png">

とてもスッキリして良い

<img width="912" alt="スクリーンショット 2019-02-10 1.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/1f446743-6d30-b956-dd21-954f3a4e403e.png">

####3. 日本語化

```
vim /usr/bin/startx
# 下記を追加
LANG=ja_JP.UTF-8
```
今更ながら Ruby on Rails Tutorial をやってみた (その10)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/51a8dfb043f1244eec06)の続きで第10章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。

## 第10章 ユーザーの更新・表示・削除

この章では今まで未実装だったedit/update/index/destroyアクションを実装してRESTアクションを完成させます。

### 曖昧だったStrong Parametersの理解

> 参考
> Rails4 | 新規・変更機能 | マスアサインメント機能と脆弱性とStrong Parameters
> https://qiita.com/tbpgr/items/63028f5e19a2d1617e40

なんとなくおまじないのように実装していたStrong Parameters。実際どのような脆弱性を対策しているんだろうなーと思っていたのですが、上記の参考サイトでブラウザの開発者ツールを使用して脆弱性を突く方法が解説されていてやっとしっくり来ました。
Ubuntu 18.04にプリインストールされているFirefox(Ver.66.0.3)で実際にやってみようと思います。

まずは、第10章実装完了の状態からワザとStrong Parametersを使用しないようにデグレードしてみます。

```ruby:app/controllers/users_controller.rb
  def create
    @user = User.new(params[:user].to_unsafe_h) # [※1]
    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

```

[※1]
`params[:user]`とだけ記述すると、Railsが`ActiveModel::ForbiddenAttributesError`を発生させます。危ないから使うなよーと注意喚起してくれているのですが、今回は検証なので`to_unsafe_h`メソッドを使用して無理やりエラーが発生しないようにしています。

> 参考
> https://teratail.com/questions/124330

デグレードの修正をしても、特にユーザ登録処理の動作に変わりはありません。

さて、Firefoxのインスペクター機能を起動して、HTMLを書き換えます。
インスペクタータブを開き、入力フォーム近辺のHTMLで右クリック⇒HTMLとして編集を選択します。
そして、パスワードエディットのHTMLを参考にそれっぽくadminフラグを操作するチェックボックスを追加します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/d8074ec5-b13d-8214-2021-52f546f79488.png)

HTMLの編集を終えてブラウザ画面に戻ると、偽装したAdminチェックボックスが増えています。
チェックボックスをチェックありに変更して[Create my account]を押下すると…

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/74643a79-11c3-203d-a073-f697badec879.png)

通常通りユーザ登録ができました。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/8f0774dc-db84-8339-5a84-542f8f0ecf5e.png)

試しにUsersページに遷移すると、admin権限がないと表示されないはずのdeleteリンクが表示されています！

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/95ff871a-0cf8-f1df-3673-f98c901cb9b4.png)

Railsの出力をみると、確かにadmin = 't'としてinsertしていることがわかります。
これはかなりまずいことです。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/5dd6639a-6b8f-f419-f14a-4a5dc1bcc9bd.png)

大急ぎで先ほどデグレードさせた`params[:user].to_unsafe_h`という箇所を`user_params`に戻します。
そして同様にHTMLを編集してAdminチェックボックスを増やし、同様の手順でユーザ登録してみます。
そのときのRailsの出力をみると…

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/24eb9f16-2011-0497-53f5-876b85daa778.png)

`Unpermitted parameter: :admin`という出力が1行増えています。adminは許可されていないので弾いてくれたようです！
事実、admin権限は与えられていませんでした。


実際に脆弱性を突いてみると、対策の意味がより分かるなぁと感じました。


それでは、次回 第11章から再開したいと思います。
Google App Engine + Flask(Python3)で「Hello Flask!!」してみた part1 ~Google Cloud SDKインストール~

# 初めに
Google App EngineでFlaskが動くか試してみたところ動いたので、メモを個人用に書いていきます！雑な部分、間違っている部分あるかもしれません。その時はご指摘をお願いいたします。
本記事では

- Google Cloud SDK(gcloudコマンド)のインストール(part1)
- [Google App EngineでFlask(Python3)で書いた「Hello Flask」をデプロイ(part2)](https://qiita.com/h_okawa0303/items/a3b9c0f829e708a445b1)

以上、二段階の構成で説明します。

なお、本章はcastaneai様が書いた「Google App Engine Webアプリ開発入門」を参考に実装しています。詳しく知りたい方は、以下のサイトで購入しましょう。
>[【DL販売】Google App Engine Webアプリ開発入門 - castaneai - BOOTH](https://castaneai.booth.pm/items/1287245)

# Google App Engineとは
Google App Engine(以下GAE)は、Googleのインフラの上でアプリケーションを作り実行できるようにするPaaSです。App Engine アプリケーションは、作るのもメンテナンスするのも簡単で、トラフィックやデータストレージのニーズの増減にあわせてスケーリングするのも簡単です。App Engine を使えば、自分でメンテナンスしなければならないサーバーはなくなります。単純にアプリケーションをアップロードすれば、それだけで実行できます。
>[Google App Engine とは?  \|  App Engine  |  Google Cloud](https://cloud.google.com/appengine/docs/whatisgoogleappengine?hl=ja)

とりあえず、作ったwebサービスを簡単にデプロイできるものと考えています。

# 開発していく
## 環境
- windows10(macでも同様の手順で進められると思います。多分。)

## 0. 準備

- Googleのアカウント
- クレジットカード

以上！

## 1. Cloud SDKのインストール
以下のサイトからダウンロードします。対話型インストーラで全てデフォルトのままインストールしましょう。
インストールが終わると自動でコンソール画面が開きます。
[Cloud SDK のインストール  \|  Cloud SDK のドキュメント  |  Google Cloud](https://cloud.google.com/sdk/downloads?hl=ja)

## 2. ログインを求められるのでGoogleアカウントでログイン
以下のメッセージが現れるので、'y'を入力。Googleアカウントのログインを求められるのでメールアドレスとパスワードを入力してログインしましょう。

```
You must log in continue. Would you like to log in (Y/N)? y
```

## 3. プロジェクト名を入力
以下のメッセージで現れるので、'y'を入力。自身の考えたプロジェクト名を入力しましょう。

```
This account has no projects.
Would you like to create one? (Y/N)? y
```

## 4. プロジェクトが出来ているか確認
以下のコマンドでプロジェクトが出来ているかを確認します。projectに自分が設定したプロジェクト名が入っていればOKです。

```
$ gcloud config list
[core]
account = xxx@gmail.com
project = [自分が設定したプロジェクト名]
```

## 5. Google Cloud Platformにアクセス
GCPサービスの操作は、gcloudコマンドかCloud Consoleで行う。
Google Cloud Platformにアクセスします。

[Google Cloud Platform](https://search.yahoo.co.jp/wrs/FOR=ay9hYyxV3ijxyPJyomsIfmVRMI5O9Zj84ighcZizdTqjzNm4BDKfwlaOyc4D9sw0TwFCaZlnCeMA0DTO9..PZKj0EzMtO4hMXOsp3EOjAfFAEr2SQoTo58jaOhDJQgcjxyFtCYgLyr8HiGGCwFts4rtiWpyMJS.UVTUhc3Xb55yP34EauMGGUt6G2PCUil4YCEVeZtXR4sRUsbqizS5HY_yRrOhrvgtBnw1dJ.GFWag-/_ylt=A2RAyiMCrcVcWzoAkjODTwx.;_ylu=X3oDMTEycmhzazExBHBvcwMxBHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDAwNDA-/SIG=122fqu86j/EXP=1556559554/**https%3A//console.cloud.google.com/start%3Fhl=ja)
![13-2-console.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/bcad438a-f900-d32a-d64c-24bd7c2f1d5b.jpeg)
左上のロゴの右にプロジェクト名が表示されていればOKです。

あとは、サイドバーのお支払からクレジットカードの登録をすれば完了です。1年間は常時無料なので登録してしましましょう。

# まとめ
以上でGoogle Cloud SDKのインストール完了です。[part2](https://qiita.com/h_okawa0303/items/a3b9c0f829e708a445b1)では、Flaskで「Hello Flask」を実装の後、デプロイしていきます。
Minecraft Skript 入門編 Part.3

#Loopについて・・・
Loopというのは、簡単に説明すればループするという意味ですｗｗ

まあ、さきに例文を書いてみましょう。

```:test.sk
loop all players:
```
これですべてのプレイヤーをLoopします。
とはいえ、これにはイベントがないので動きません。

```:test.sk
on join:
    loop all players:
        send "&e%player%さんがサーバーに来ちゃった・・・ｗ" to loop-player
```
はい。
これで動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/a05da334-85d8-bf55-e42b-8f344c089eca.png)
以前書いたのは`player`に送信でしたが、今回は`loop-player`です。
`loop-player`は、`loop all players:`を書いたときに使います。

先ほどのコードなら`broadcast`と同じ働きをすることになりますので、いちいち書くのは馬鹿らしいですよね・・・

正しい使い方？じゃないというのが事実です。

```:test.sk
on join:
    loop all players:
        loop-player do not have permission "skript.admin"
        send "&e%player% さんがサーバーに来たぞ！！" to loop-player
```
これでそのパーミッションを持っていない人がきたらメッセージを送信、持っていたらなにも起きなくなります。

#カスタムコマンドについて・・・
```:test.sk
command /任意のコマンド:
    description:
    usage:
    permission:
    permission message:
    executable by:
    aliases:
    trigger:
```
まず、`/test`というコマンドが作りたいなら、
１行目は`command /test:`としてください。
２行目の`description:`はMinecraftに元からある`/help`コマンド実行時に表示される説明を書きます。
３行目の`usage:`はコマンドの使い方である`/test`を書きます。
４行目の`permission:`はそのコマンドを使うために必要な権限（パーミッション）を書きます。
５行目の`permission message:`はその権限を持っていないプレイヤーが使った場合に返すメッセージです。
６行目の`executable by:`はコマンドを実行できる環境を書きます。例えば、コンソールとプレイヤーのチャットから実行できるようにするには`executable by: player and console`と書くことになります。
７行目の`aliases:`はコマンドの省略形式を書きます。`/ts`など
そして**もっとも重要**な８行目の`trigger:`ですが・・・・

ここまで説明したが、

```:test.sk
command /test:
    trigger:
```
で、構いません。
あ、これだと一般のプレイヤーも使えるので`permission`だけでも書いてるほうがいいかもしれませんね・・・
※permissionを設定していてもOP権限を持っていると関係なしに使える場合があるので注意

```:test.sk
command /test:
    trigger:
        send "test" to player
```
これでコマンドを実行すると「test」と表示されます。

では鯖に実用的なコマンドを作ってみましょう。

```:test.sk
command /close:
    permission: skript.admin
    trigger:
        execute console command "/whitelist on"
        loop all players:
            loop-player is not an op
            kick the loop-player due to "サーバーが非公開になりました"
        send "サーバーを非公開にしました" to player
```
また、新しいものがいくつか出てきましたね。
まず、１～３行目は記述済みなので４行目から解説していきます。
４行目の`execute console command "/whitelist on"`ですが、これはコンソールで指定したコマンドを実行するというものです。
これでサーバーのホワリスがオンになります。
５行目でこのページの１番最初に書いたLoopが出てきましたね。
６行目の`if loop-player is not an op:`は`loop-player`がOPじゃなかったらという条件になります。
７行目の`kick the loop-player due to "サーバーが非公開になりました"`で`loop-player`をキックできます。また、キックの理由も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/4807786f-5efe-5134-22d8-1b34f76bab76.png)
８行目は・・・わかるねｗ

中には気づいた方もいるかもですが、OP権限者＝permission所持者は成立しても、permission所持者＝OP権限者は成立しないのです。

ということは、これだと実行者がキックされてもおかしくありませんね。

ではその対策を書きましょう。

```:test.sk
command /close:
    permission: skript.admin
    trigger:
        execute console command "/whitelist on"
        loop all players:
            loop-player is not an op
            loop-player is not player
            kick the loop-player due to "サーバーが非公開になりました"
        send "サーバーを非公開にしました" to player
```
`loop-player`の条件に`if loop-player is not player:`を付けたしただけです。
`loop-player`は`player`とは違いまっせてね。

**最後の対策ははっきり言っていりませんｗ**

次は[コチラ](https://qiita.com/meoto2408/items/ca6cee3c48c65a1fd5ea)

前は[コチラ](https://qiita.com/meoto2408/items/f6d856f878f755caa25b)
道場コースクリア

この一週間でHTML&CSSの初級と中級の道場コースをクリアすることができました。

仕様書と見比べながら習った知識を使っていく作業は時間がかかりますが、非常にためになります。

また、難しいと感じた部分は答えと見比べることができるので自分のコードのどこが良くなかったかがよくわかります。

道場コースで忘れてしまっていたのはこの部分です。

<img width="1211" alt="スクリーンショット 2019-04-28 22.56.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/af090d05-07a8-13a3-19ac-67ae5ce220e1.png">

今後も復習を欠かさないようにしたいと思います！

ありがとうございました！
PHPのauto load について


# オートロードとは

ファイルを自動で読み込む仕組み。

PHPではプログラム内で外部ファイルを読み込む場合、通常「require」を使用する。

その結果、「Class」を記述したファイルを複数読み込みたい場合、何度も「require」を記述しなければならない。

例

```
require "Authenticate.php"
require "Session.php"
require "User.php"
```

これを解決するのが、オートロードという機能。

クラスからインスタンスが生成される前のタイミングで、そのクラス名と同じファイルがあればrequire を実行しそれを読み込む。


## spl_autoload_register



```
<?php
function spl_autoload_register( $class ) {
    require_once $class . '.php';
});

$user = new Session();
$article = new Article();

```
Azure FunctionsをVisualStudioから発行

#はじめに
　IoTHubに届いたセンサなどのデータをFunctionsで処理してSQLDBに書き込んでみました。
　同様の記事は探すと多々ありますので、詳細はそちらにおまかせというわけですが、ローカルで実行して成功した後ポータルに発行するわけですが、そこではまった点を書いておきます。

#IoTHubからデータを受けるFunctions
　現在はIotHubTriggerのテンプレートもありますが、EventHubTriggerのテンプレでFunctionsをプロジェクトに追加しました。
　このとき、ConnectionStringSettingを求められますが、ここに直接EventHubの接続文字列を書いてはだめです。ここにはキー名称を入れておいて、そのキーに対する値（接続文字列）をlocal.settings.jsonに書きます。
　PathにはEventHub互換名を入れます。
　で、コードを書き、VS上でデバッグ実行。うまくいったらポータルに発行ということになります。

#発行する
　発行時はウイザードで既存のポータルに発行しました。
　すでにAppServiceもFunctionsもポータルに作成済みのため設定自体はほぼ自動的に行われ発行に成功します。そこでポータルに行ってみると、右側にピンク背景のダイアログが表示され、

関数 (eventHubTrigger_function1) エラー: Microsoft.Azure.WebJobs.Host: Error indexing method 'function1'. Microsoft.Azure.WebJobs.EventHubs: Value cannot be null. Parameter name: receiverConnectionString.


と出てきて、動作しません。
　receiverConnectionStringの設定がされていないことはわかるのですが、しばらくその設定をどこで行うのかわかりませんでした。検索してもreceiverConnectionStringがヒットしないし・・・
　しばらく調べてみたところ、以下にその設定カ所を見つけました。

　発行時に出てくる画面に
　　　AzureAppServiceの設定を編集する
　とあります、ここをクリックすると”アプリケーションの設定”ダイアログが表示されます。
　ここにreceiverConnectionStringを設定するところがあります。
　自分の環境では、この欄のリモートの部分がカラでした。とりあえずローカルと同じ内容をコピペして発行してみたところ、エラー表示が出なくなり、ポータル上でも正常にFunctionが動作するようになりました。

#まとめ
　英語がちゃんと読めるようになろう！
Node.js / npmのアップデートを安全に行うために必要だった設定ファイルまとめ

本番環境で動作をしているライブラリのメンテナンスは、どんな言語であっても悩ましい問題です。

Node.jsは、初期に比べてアップデートによる影響が少なくなってきたとはいえ、バージョン管理を怠ると、更新のコストが大きくなったり、予期せぬ不具合が発生する可能性があります。

今回は、業務でNode.js / npmを使い続けた中で必要だった設定ファイルをまとめたいと思います。

前提として、 ExpressなどのサーバーサイドJavaScriptを使用しておらず、JenkinsなどのCIツールで、フロントエンドのJavaScriptをビルドする場合を想定しています。

# TL;DR

1. package-lock.json
2. .npmrc
3. .node-version / .npm-version

この3つがあれば、最低限、バージョンの差異によるトラブルを避けることができます。

# 1. package-lock.json
まずは基本です。通常、インストールしたパッケージはpackage.jsonで管理されていますが、追加したパッケージが依存しているパッケージは、package-lock.jsonで管理しています。

## 無いと何が起こるか
- 新規メンバーがpackage.jsonの入ったリポジトリをcloneし、npm installした際、意図しないバージョンがインストールされ、package.json作成当初に発生していないエラーがでる可能性があります
- 新規で参加したメンバーが、`npm install`を実行してもローカル環境を構築できない可能性があります

## 対応方法
package-lock.jsonに対応したnpm 5.x以上が必要です。
npm installを行うと、自動で生成されます。
yarnを利用している方は、同様のファイルとしてyarn-lock.jsonがあります。

# 2. .npmrc
npmに関する挙動を制御することができます。

## 無いと何が起こるか
- npmの挙動の違いにより、メンバー間でローカル環境に差異ができてしまう可能性があります
- 誰かがnpm installした際に、-Sや-Dオプションを指定し忘れ、package.jsonに必要なパッケージが記録されない可能性があります
- npm isntallした際にバージョンに^が追加され、後から来たメンバーがnpm installした際に、当初と異なるバージョンがインストールされる可能性があります。

## 対応方法
package.jsonと同階層に、ファイルを設置します。
おすすめの設定は下記のとおりです

```
　also=dev
　save-exact=true
```

`also=dev`は、npm installで、オプションを指定しなかった場合、自動でdevDepandencysに追加してくれます。
`save-exact`npm installしたパッケージのバージョンを固定(= ^をつけない)するようにします。

# 3. .node-version / .npm-version
ndenvなどを利用して、Node.jsを複数バージョン管理している場合、
これらのファイルがあると、ファイルがあるディレクトリ以下では、指定したバージョンのNode.js/npmが実行されます。
また、Gitリポジトリに含めることで、使用するNode.jsとnpmのバージョンを強制することができるので、より安全に環境構築が可能となります。

## 無いと何が起こるか
- 開発環境のアップデートが本番環境に影響してしまう可能性があります
- JenkinsのようなCIツールを使用する場合、ビルド用のサーバで必要なファイルを生成し、本番環境を含めた各環境にデプロイするケースがあります。
その場合、開発環境のNode.jsをアップデートしたつもりが、本番環境にも影響が出てしまい、予期せぬエラーに繋がる恐れがあります

## 対応方法
package.jsonと同階層に、各ファイルを設置します。
ファイルの中には`8.11.4`などのバージョンの数値が書かれています。

# まとめ
設定ファイルを活用することで、ドキュメントを用意することなく環境を固定することができるため、精神的な負担が軽くなります。
.node-version / .npm-versionについては、対応しているツールとそうでないツールがあるため、ご注意ください。
Zabbixに格納されているデータをsqlで抽出


#シチュエーション
Zabbixで収集したログを他サービスで再利用したい

 * CPU使用率を他サービスでカスタムグラフで表示
 * zabbixに慣れてないユーザ向けログ検索ページ


#クエリ
MySQL

```sql

select clock, from_unixtime(clock)
from history_uint
where itemid = 12345
  and clock < UNIX_TIMESTAMP('2014-01-10 00:00:01')
limit 100
```

#参考
http://alpha-netzilla.blogspot.jp/2014/02/zabbix.html
【Rails】パラメーターがWebページに表示されている時の対処法

下記のようなパラーメーター（Parametors）がWebページに表示されてしまっている時の対処法です。

```
Parameters: {"utf8"=>"✓", 
"authenticity_token"=>"6YAg0qEsGyxdHWJspI1f2sgzrztYo5cZhSkRHGBgLrVEHvMLdo3xBkJznCFlOIc/650K8ZntJVDWIZejLdQd9g==", 
"post"=>{"product_id"=>"1", "title"=>"おいしい", "rate"=>"5", "content"=>"素晴らしい商品"}, 
"commit"=>"投稿する"
```
# ビューファイルを見直す

`<%= %> `内のコードはビューファイルに表示したいコードなのかを確認しましょう。
以下、解説です。

RailsではViewファイル場におけるRubyコードを`<% %>`もしくは`<%= %> `内に定義することになっています。

言わずもがな、用途分けは下記の通り。

 - `<%= %> `Webページに表示したい時（テキストなど）

 - `<% %>`Webページに表示しない時（繰り返し処理など）

意図していないパラメーターがWebページに表示されている時は、Webページに表示する必要のないメソッド、例えば`each do`メソッドなどを`<%= %> `内に定義してしまっている可能性が高いです。

意図しないパラメータ表示はエラーコードが出力されないので、対処に時間がかかってしまいました。
もうすぐ令和なのでGitであたふたしないようにしよう

ITTL勉強会3日目の記事です。
# 登場人物
ぼく 福岡出身。最近Angularを完全に理解した。マカー。
Nさん 素晴らしい先輩。マカー。

# スタバにて
ぼく「Gitまた変なエラーが出たばい」
ぼく「こういう場合は、変更箇所をリセットして…」
N「なんで手でファイル管理をしているんだ？Gitの使い方は理解できているか？」
ぼく「Gitはソースコードの物置ばい！」
N「ばっかもーん！！！」
<img width="1052" alt="スクリーンショット 2019-04-28 20.18.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202664/617330d9-1495-4a6f-7362-ba1ab21c7bf4.png">
# 正しいGitの使い方
Gitは、ファイル（ソースコード含む）の「**差分**」を管理するツールです。
プルやチェックアウトができない場合の原因は大体2パターンです。

## 変更したファイルをコミットしないことによるエラー
ぼく「なんかリモートリポジトリからプルできるって通知が来たからプルしたらエラー起きましたばい！助けてください！」
N「どれどれ見せてみろ…って変更したファイルコミットしてないじゃないか。これじゃエラー出すよ」
ぼく「でもエラー出さない時もあるとよ？」
N「それはリモートリポジトリにプッシュされているものに、触ったファイルの変更がなかっただけだ」
ぼく「はえ〜」

### 対処法
1. 変更したファイルをコミットする
1. 変更したファイルをスタッシュする

手法1から説明していきます。差分がわからずエラーを起こしているのであれば、Gitに差分を理解して貰えば完結です。つまりファイルをコミットしましょう。
手法2は、例えばまだ書きかけ途中のファイルがエラーを起こした場合などに利用します。変更したファイルを一度別領域に退避し、直前までのローカルリポジトリの状態にしておくことで、エラーを解消するというわけです。
<img width="1049" alt="スクリーンショット 2019-04-28 20.21.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202664/25d31993-3d2e-968a-21c2-5f7e9ea092f0.png">

## 変更した行とリモートリポジトリがバージョン管理できず衝突
ぼく「パイセン！スタッシュして、プルして、元に戻したらまたコンフリクトしたっちゃけど！」
**※手法1のコミットしてプルしても起こり得ます**
N「これは本当にコンフリクトしているな」
N「リモートリポジトリとローカルリポジトリのバージョンが解決しない場合、つまり変更した行がリモートが正しいのかローカルが正しいのかわからない状態にいる」
ぼく「どうしたら良かですか？」
N「やり方は3つある」

### 対処法
1. ファイル全てが自分の変更を正とする
2. ファイル全てが相手の変更を正とする
3. 手マージ

1、2は言葉のままで、コンフリクトを起こしているファイルに対し、リモートリポジトリを最新のバージョンとして扱うのか、ローカルリポジトリにコミットしてある差分を最新のバージョンとして扱うのかというだけです。こちらで良い場合はこちらで良いのですが、世の中そんなわけもなく、「この行だけは自分、次の行は相手」や「両方の変更を取り込まなければならない」という場合が多々あります。
その場合は手法3の手でマージを行う必要があります。
マージを行う際に色々ツールがありますが、ここではVisual Studio Code（以下VS Code）を利用し、解説を行います。
VS Codeでコンフリクトが起きているファイルを開いてください。そうするとコンフリクトが起きている箇所に色が付いていると思います。それぞれ対応したいアクションを押下し、色が全て消えるとコンフリクト解消です。
<img width="1022" alt="スクリーンショット 2019-04-28 20.23.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202664/d1be7cbe-80ba-0fb9-b9c4-9597655478af.png">

ぼく「もうこれでコンフリクト怖くないばい」
N「しっかりと使いこなせば、コンフリクトが起きるたびにいちいちディレクトリを見に行かなくてよくなる」
N「VS CodeのGitLensを導入すれば、行を選択したときに誰がいじったのかもGitの情報から表示してくれて便利だ」
ぼく「はえーサンガツ」
ぼく「git commit -m “変更したとよ” 」
N「ばっかもーん！！！」

登場人物は全て架空のものであり、実在する人物、団体、会社等とは全く関係ありません。
【MVCフレームワークについて】


# MVCモデルとは

世の中の多数のプログラミング言語で使用されている考え方。

アプリケーションを「Model」「Controller」「View」の3つに分割して実装を行う。

## Model

アプリケーションのロジック部分を担う。

```
ロジックとは... データベースとの連携部分の処理のこと
```

## View

データを表示する部分のこと。
（ユーザが閲覧している画面の部分）

主にHTMLで構成されることが多い。

## Controller 

Model からViewにデータを橋渡しする役割を担う。
Git Labでマージリクエスト（プルリクエスト）をするまで

今、ご縁で開発を手伝わさせてもらっておりまして（ほとんど見習いですが）、
その中で、開発マネージャーからこんな事を指示されました。

「GitLabのdevelopブランチにプルリクをしておいて」

たぶん、基本的なことなんでしょうが、やってみようと思うとつまづくところだらけでした。。。。
そこで、どこでつまづき、何を参考にして突破していったかを書いていきます！

##概要

今回は、Gitlabで次のことをやっていきます。

1)ssh keyで接続してmasteブランチをcloneする

2)Gitlabのブランチを分けて、リモートにマージリクエストをする

そいじゃ、やっていきましょう！

##1)ブランチをcloneしてローカルで編集

まずは、Gitlabにある任意のブランチをローカルに落としていきましょう。

まずは、アカウントを作成します（ここでは割愛するので、こちらをチェック：[https://qiita.com/CUTBOSS/items/f4f5480b4e5c6d0026eb](https://qiita.com/CUTBOSS/items/f4f5480b4e5c6d0026eb)）

###SSH keyで接続

まずは、こちらの記事通りに書いていきました。
[https://qiita.com/kyamawaki/items/07fb3332cf3c2f47728a](https://qiita.com/kyamawaki/items/07fb3332cf3c2f47728a)

しかし、いざgit clone git@~と打っても動いてくれません！
エラーはこちらの通り

```ruby:ターミナル
fatal: Not a git repository (or any of the parent directories): .git
```
これはググってみると、gitのセットアップができていなかった模様。
なのでこちらを打ってみました。

```ruby:ターミナル
$ git config --global user.name "hogehoge"
$ git config --global user.email "hogehoge@gmail.com"
```

これを設定したら、晴れてcloneできました


##2)Gitlabのブランチを分けて、マージリクエスト

cloneしたあとは、ローカル上でのbranchはmasterになっています。
確認の仕方はgit branchでできます

```
$ git branch
 * master
```

そこで、ここに任意のブランチを作成し、それをローカルに持って来て編集しましょう。
(masterをいじってはいけない事は、素人の僕にもなんとなくわかる、、、)

###ブランチを作成して、ローカルで動かす

まずはブランチを作成しましょう

![スクリーンショット 2019-04-28 21.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/20f45837-62da-e226-3ebe-3feeebba5e31.png)

このプラスボタン押して、new branchを選択したら作成する事ができます。
ただ、それだけではローカルで編集できるようになったわけではありません。

ローカルで選択されているブランチを切り替えるには次のコマンド。

```
$ git checkout [ブランチ名]
```

これでできます。git branchで確認してみましょう。
仮にtestってブランチを作ったとすると


```
$ git branch
   master
 * test
```

ってなってます。masterに変更する際は、また git checkout masterで戻ります。

###ローカルで編集した内容をリモートリポジトリに反映させる

上の作業でローカルで編集する事はできるようになったかと思います。
次は、色々やった編集をリモート先に反映させる作業です。
(addして、commitして、pushする作業ってこと）

たとえば、sample.htmlってファイルを追加した場合は

```
$ git add sample.html
```
って書きます。
（この時は、sample.htmlが格納されているフォルダ内でやること）

色々変更加えた場合は、

```
$ git add .
```

で変更したところを全てaddしてくれます。

＊ちなみに、addとは作業してる場所からコミットするためにファイルを登録してる場所に追加することなんだとか、
ほいで、リモートリポジトリに登録するための場所に追加する事をcommitって言うんだって（参考:[http://kray.jp/blog/git-why-explanation/](http://kray.jp/blog/git-why-explanation/))

そして、

```
$ git commit -m "[ここは何でもいい]"
```

で、コミット完了。そして

```
$ git push origin test //testブランチにプッシュする場合
```

でpush完了ということで変更とリモートへの反映が完了しました。

###マージリクエスト（プルリクエスト）をする

**まず、わかりづらかったのですが、GitHubで言うところのpull requestは、GitLabではmerge requestと言います。**

そして、その「merge request」のやり方を書いていきましょう。（略すと、マジリク？？）
まずは、git labのページにいき

![スクリーンショット 2019-04-28 22.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/e7c60f23-fe42-4e9e-e4fa-e712d901a74d.png)


merge requestのボタンを押します。

![スクリーンショット 2019-04-28 22.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/b3932cdd-fac5-bef8-1043-0f89bdf19a8c.png)

そして、どうゆうリクエストなのかは矢印の場所に記載します。
![スクリーンショット 2019-04-28 22.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/e6a231dc-baf0-37ef-360d-6d19bf4d8552.png)

最後に、どのブランチからどのブランチへマージしてほしいのかを記載します。
submitすればマージリクエスト完了です。

こんな感じで、GitLabでの新規登録から始まり、cloneという名の川を渡り、addという名の山を登り、マージリクエストへと至る旅は終わりました。
GitHubと似たところもあればそうじゃないところもあって、なかなか難しかったです。。。
JavaScriptのprototypeをプロパティで使う上で気をつけること

# そもそもPrototypeとは
>JavaScript には1つだけ、継承が発生する要素があります。オブジェクトです。
どのオブジェクトもプロトタイプと呼ばれる、他のオブジェクトへの内部的な繋がりを持っています。
そのプロトタイプオブジェクトも自身のプロトタイプを持っており、
あるオブジェクトのプロトタイプが null に到達するまでそれが続きます。 null は、定義によれば、
プロトタイプを持たず、プロトタイプチェーンの最終リンクとなります。
[MDN Web Docssから引用](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain)

こいつがないと継承ができない・・・
初期のjsはstaticが使えないからprototypeを使わないで複数インスタンスを作ると
使ってないメソッドとかまでメモリに在中しちゃうからメモリ圧迫しちゃう・・・
そういうときに使おうって感じで今は使ってる

# メソッドや、定数以外のプロパティではPrototypeは使わない
これは配列や、オブジェクトを追加したりする時に"""やばさ"""が分かる

```javascript:js
function func(){}
func.prototype.ary = new Array();
func.prototype.obj = new Object();


let f1 = new func();
let f2 = new func();

f1.obj.o1 = "o1";
f2.obj.o2 = "o2";
f1.ary.push("1");
f2.ary.push("2");

console.log(f1.obj);
console.log(f2.obj);
console.log(f1.ary);
console.log(f2.ary);
```

```:出力結果
{o1: "o1", o2: "o2"}
{o1: "o1", o2: "o2"}
(2) ["1", "2"]
(2) ["1", "2"]
```

これはprototypeで宣言したものはどのインスタンスからも参照できる
という仕様によって引き起こされる

こういう分かりにくいバグを起こさないためにも何も考えずにprototypeで設定するんじゃなく
下記のようにコンストラクタとしてプロパティを設定するのが良い

```javascript:js
function func(){
	this.obj = new Object();
	this.ary = new Array();
}

let f1 = new func();
let f2 = new func();

f1.obj.o1 = "o1";
f2.obj.o2 = "o2";
f1.ary.push("1");
f2.ary.push("2");

console.log(f1.obj);
console.log(f2.obj);
console.log(f1.ary);
console.log(f2.ary);
```

```:出力結果
{o1: "o1"}
{o2: "o2"}
["1"]
["2"]
```

てかこのオブジェクト型をいじるときは気をつけよう！って[前回](https://qiita.com/hu_ka000/items/e1dec520f64115678407)もなんかやったな・・・

# ちょっと気になってること

>あるオブジェクトのプロトタイプが null に到達するまでそれが続きます。 null は、定義によれば、
プロトタイプを持たず、プロトタイプチェーンの最終リンクとなります。

この部分ってprototypeでメソッド指定した場合は、nullになるまで検索を続けるってことだから
頻繁に呼び出すメソッドだったらprototypeに書かないほうが処理が軽そうだけどあんまり気にしなくていい問題なんだろうか
調べても出てこないしあんまり気にしてる人がいなそうな感じだけど
【ロジックとViewの分離について】


# レガシーPHPからの脱却

①「ロジック」と「View」の分離を実現

WEBアプリケーションは以下の2つの役割によって構成されている。

```
ロジック... データベースとの連携（DBのデータの取得、更新、保存）処理の部分。
ビュー  ... 実際にデータを表示する部分  
```

この２つの役割を明確に分けることによって、コードの可読性を上げることを目的とする。
（可読性とは単純に読みやすさのこと）

例えば、PHPの掲示板サービスだと、

ロジック

```

$sql = "SELECT * FROM 'post' ORDER BY created at desc";
$result = $mysqli->query( $sql );
$posts = array();

if ( $result 
     &&  mysqli_num_rows( $result ) ) {
     while( $post = mysqli_fetch_assoc( $result ) )
            $posts[] = $post; 
     }
}

mysqli_close();

```

ビュー（画面に表示する部分）

```
if ( count( $posts ) > 0 ) {
     foreach( $posts as $post ) {
            print htmlspecharacter( $post['content'] );
     }
}
```
pythonプログラムのexe作成方法

# 概要

pythonのプログラムをexeにまとめる方法があったので記事にまとめす
これを使うことでちょっとしたツールなどをexeとして配布して業務の効率化などできるかもしれません。
python 3.7 で確認しています

# 導入方法

コマンドプロンプトから以下のコマンドでインストールできます。
`pip install pyinstaller`

ドキュメント等は
https://www.pyinstaller.org/
にあります。

# 使用方法
以下のようにexeにしたいpythonのファイルを指定することでexeを作れます。
`pyinstaller seleniumTestSite2.py --onefile`
今回は例として以前公開したseleniumのテストサイトを操作したときのプログラムを指定しています。
`--onefile`
を除くとビルドをするだけでexeに固めてはくれません。
注意点として実行に少々時間がかかります。
また作成されるexeは容量がそれなりに大きいです。(上記のプログラムで48M程です)
ただ複数のファイルをまたがって作成したプログラムも一つにまとめてくれるのでどのファイルを実行すれば・・・という問題を防げて良さそうです。
作成したexeは[こちら](https://github.com/snowpff14/seleniumSample)にコミットしてあります。

# 応用方法
上記のプログラムは外にだしている設定ファイルやデータファイルを読み込んで入力をしているため、exeと同じディレクトリに設定ファイルのディレクトリとデータファイルのディレクトリを配置すると動かせます。
※ プログラム内でファイルの読み取り箇所を実行環境と同じディレクトリに指定しているからかと思います。絶対パスなどで指定した場合はそちらになってしまうかと・・・

このことから以下のような応用が考えられるかなと

1. seleniumで勤務表入力のプログラムを作成し、各自設定ファイルを編集してもらって勤務表を自動で入力
1. いままでVBAで行っていたことをpythonのプログラムに置き換えてプログラムがわからない人にも実行してもらう (神エクセルや野良VBAが発生しなくなるかも・・・)
Leetcode #111: Minimum Depth of Binary Tree

First try failed at the test case [1,2,3]

```swift
func minDepth(_ root: TreeNode?) -> Int {
    if root == nil {
        return 0
    }
    if root!.left == nil {
        return minDepth(root!.right) + 1
    }
    if root!.right == nil {
        return minDepth(root!.left) + 1
    }
    return min(minDepth(root!.left), minDepth(root!.right)) + 1
}
```
[js]プログラミング学習記録 #1「1!~20!まで、階乗を関数を用いて求めてみた」

#背景
　大学のJavaScriptの授業ででた課題を通じ
「私はこう考えた・こんなコード書いたよ」っていうのをQiitaに書いて
<b>もっと技術力のある方々から知恵を貸していただけたらな！</b>と考えました
とりあえず、書いてみます
同じ悩みを抱える人の参考にでもなれば幸いです

#今回は・・・
　今回はGW課題(？)としてだされた<b>「1!(1 の階乗)から 20!(20 の階乗)までを求める」</b>をこなしていきます

　ちなみに、学校からの課題の詳細はこんな感じ

　1.引数を1つ受け、その階乗を計算し、解を返す関数を作成する。
　2.ループ変数を用意し、1から20までループする。
　3.ループ変数を階乗計算関数に渡す。
　4.なお、この課題において「グローバル変数」を使うことを禁ずる。
　　 ~~グローバル関数ってなんやねん~~

#私が書いたコード
```javascript:submit2.js
function fact(k) { 
    if(k != 0)
    {
        return k*fact(k-1);
    } else {
        return 1;
    }
}

window.onload = function () {
    let i;

    for (i = 1; i < 21; i++) {
        document.write(i + "! = " + fact(i) + "<br />" );
    }
}
```
　関数部分で階乗を求めて、本文(？)では１〜２０までの数字を求め
　その値が出るたびに関数に代入して書き出し
っていうつもりでいろいろと試しながらコードを書いたのですが、合っているでしょうか
いちおう、出力すると欲しかった結果を出すことができたからいいかなとは考えているのですが……

#今日のまとめ
　前々から書いてみたかったけど、全然書くこと思いつかないし書き方わからないしで敬遠していましたが、ここへの書き方ってこれって大丈夫ですよね……？笑
　あと、javascriptとC#を現在勉強しているのですが、関数とかの処理の流れがいまいち自分の認識で合っているのか不安なところが多々ありますが、これからよろしくお願いします！
~~にしても、グローバル関数って……~~
Python:ロギング設定ファイルに記載されている`ext://sys.stdout`の`ext`の意味

# 環境
* Python3.6.6
    * logging v0.5.1.2

# 背景
ロギング設定ファイルのサンプルコードに`ext://sys.stdout`という文字列がありました。
この`ext`の意味をGoogleでけんさくが分からなかったので、調べてまとめました。


# 補足
`"ext://sys.stdout"`でGoogle検索しましたが見つからなかった（2019/04/28実施）ので、`ext`の意味がすぐに分かりませんでした。
どのような検索方法にすればよかったのでしょうか。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/4142caf7-bc63-03bc-9ae5-d9ef51478fbe.png)






```yaml
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  simpleExample:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]
```

https://docs.python.org/ja/3.6/howto/logging.html#configuring-logging


# `ext`スキーマは外部オブジェクトへのアクセスを意味します

>テキストファイルでは、sys.stderr をリテラル文字列 'sys.stderr' と区別する標準の方法がありません。この区別を容易にするため、環境設定システムは、文字列中の特定の特殊接頭辞を見つけ、それらを特殊に扱います。例えば、リテラル文字列 'ext://sys.stderr' が設定中の値として与えられたら、この ext:// は剥ぎ取られ、この値の残りが普通のインポート機構で処理されます。

https://docs.python.org/ja/3.6/library/logging.config.html#access-to-external-objects

`ext`はたぶん`external`の略ですね。

ちなみに内部オブジェクトにアクセスする場合は、`cfg`スキーマを使うとのことです。`cfg`はたぶん`configuration`の略ですね。
https://docs.python.org/ja/3.6/library/logging.config.html#access-to-internal-objects
Windowsのコピペ

パソコン生活にてコピー＆ペースト（コピペ）は最も使う操作でしょう。
特にコーディングの方はコピペがないと生きられないぐらいですかね。

#コピペの問題
コピーする（Ctrl + C）⇒ペーストする(Ctrl + V)　というセットで操作するとなります。
コピーする回数が多いと、コピー元とコピー先のウインドウ切り替え、マウス移動処理が必要で、時間がかかってしまいます。


コピー回数が多い場合は、コピー元に連続コピーして、コピー先に連続ペーストするニーズがあります。

#連続コピペ：ツールの利用
いくつかの連続コピー、連続ペーストできるツールがあります。
例えば、
・CLCL:https://www.nakka.com/soft/index_eng.html
画像データやファイルデータも扱えるクリップボード履歴ソフトです。

・Clipboard History：https://blank-note.sakura.ne.jp/
高度なテキスト処理が可能なクリップボード履歴＆定型文ツールです。

#連続コピペ：Windowsの機能利用
直近のWindowsでは、設定のクリップボードの「クリップボードの履歴」にオンにすると、
連続コピペができるようになりました。
コピーする（Ctrl + C） + ペーストする（Windowsキー + V）で連続ペーストできます。
Ctrl　＋　Vは既存通り、直前コピーした内容をペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/e685ccba-9706-43b2-f1d4-98d1426c1069.png)

テキストはもちろん、画像データもコピーできますので、便利ですね。

Windowsの設定を変更してスマホとのコピー内容の共有もできます。
設定のクリップボードの「他デバイスとの同期」にオンする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/cbed55ae-9633-f93f-c3f2-cf24f5c851d0.png)

#ファイルパスのコピー
ファイルの絶対パスをコピーしたい場合もあります。
先にフォルダーをコピーしてから、ファイル名をコピーして連結する操作があると思います。


実は、パスコピーに下記の２つやり方にすると、簡単になります。
##その１：Shift　＋　右クリック
①、ファイル、フォルダーにShiftを押しながら右クリック
②、「パスのコピー」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/360798c1-c56f-6c4d-6ef2-53e837f509af.png)


##その２：ファイルを選択してコピペ
①、コピーしたいファイル、フォルダーを選択し、Ctrl　＋　C　でコピー
②、テキストファイルにペースト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/00442c13-3fad-e914-a963-b800d6f8d525.png)

この方法は、ファイル、フォルダーが複数の場合は便利です。

コピペの話でした。

以上
Babel+TypeScriptで絶対パスimportをする2019

## Babel + TypeScript

Babel@7からTypeScriptサポートが入ったので、TypeScriptでコードを書いてbabelを用いてトランスパイルをしている人も多いと思います。
するとそのうち増えてきたimport文が大変になってくると思います。

```ts
import foo from '../../foo'
import bar from '../../bar'
```

というような相対パスでのimportが増えてくると絶対パスでimportしたくなってきます。

## まずはbabel

[tleunen/babel-plugin-module-resolver: Custom module resolver plugin for Babel](https://github.com/tleunen/babel-plugin-module-resolver)
を使いましょう。

```babel.config.js
...
[
  'module-resolver',
  {
    alias: {
      foo: './foo',
      bar: './bar'
    },
    extensions: ['.js', '.ts', '.tsx']
  }
]
...
```

上記のような記述をbabelのconfigにpluginとして追加しましょう。
aliasの部分が絶対パスとして解決されるようになる名前です。お好きなように書き換えて下さい。

これでbabel側から絶対パスを解決できるようになりました。

## つぎにTypeScript

なにもやることはありません。
`tsconfig.json`のpathsにaliasを書く必要もありません。

#### 追記(2019/4/30)
Next.jsベースのプロジェクトで使っていたときは何も書かなくてもうまくいっていたのですが、普通にwebpackでゼロからやったらTypeScript側でエラーになってました。ビルドはbabel側が解決できるので成功するが型チェックはエラーで落ちる状態になりました。

```tsconfig.json
{
  "baseUrl": ".",
  "paths": {
    "foo*": ["src/foo*"]
  }    
}
```

やはり上のような記述は必要なようです。

Next.jsではディレクトリルートに配置しているディレクトリをaliasしてたので`baseUrl`から解決されてたからエラーにならなかったのかな...？
この記事を書いたときに使っていたプロジェクトはtsconfig.jsonでpathsは書いてないけどbaseUrlは書いてあったためbaseUrlからのパスはTypeScript側でも認識されてたみたいです。
[Module Resolution · TypeScript](https://www.typescriptlang.org/docs/handbook/module-resolution.html)

## ESLintもほしい

[benmosher/eslint-plugin-import: ESLint plugin with rules that help validate proper imports.](https://github.com/benmosher/eslint-plugin-import)
を使っているlint環境が前提となります。

[tleunen/eslint-import-resolver-babel-module: Custom eslint resolve for babel-plugin-module-resolver](https://github.com/tleunen/eslint-import-resolver-babel-module)
を導入しましょう。

```json
{
  "settings": {
    "import/parsers": {
      "@typescript-eslint/parser": [".ts", ".tsx"]
    },
    "import/resolver": {
      "babel-module": {}
    }
  }
}
```

上記の内容を追加しましょう！
`eslint-plugin-import`から`ts`や`tsx`をparseできるようにしてあげます。
さらにresolverとして`eslint-import-resolver-babel-module`を使うように指定します。
これでbabelのconfigのaliasの中身をみてくれるようになります。

`babel.config.js`の`extensions`は`eslint-import-resolver-babel-module`がこれを指定していないと`.ts`や`.tsx`を対象にしてくれずエラーになるため必要でした。

## まとめ

かなり簡単に実現できるようになったのではないでしょうか。
babelに寄せたことでwebpackまわりに触ることも不要ですし、TypeScriptも完全に言語として利用するだけなのでシンプルに設定できてよいのではと思っています。

もしもっと良い環境があればご教示下さい！

## あとがき

むかし、[babel-plugin-module-resolverでimportを快適にする(eslint-plugin-import + flow + path-autocomplete)](https://qiita.com/ymkz/items/8f09326382ed7ebcd061) というようなものを書きましたが、最近はTypeScriptでしょ！ということで書き直しました。
エディタの連携はVSCodeなら特になにもしなくても補完にでてくると思います！もしだめだったら上のリンクを参考に`path-autocomplete`を使うと良いかもしれません。
Leetcode #110: Balanced Binary Tree

First try failed at the test case [1,2,2,3,null,null,3,4,null,null,4]

```swift
func isBalanced(_ root: TreeNode?) -> Bool {
    if root == nil {
        return true
    }
    return abs(height(root!.left) - height(root!.right)) <= 1
}

func height(_ node: TreeNode?) -> Int {
    if node == nil {
        return 0
    }
    return max(height(node!.left), height(node!.right)) + 1
}
```
データベースの基礎知識について紹介！

# データベースとは
- クライアントからの要求に対して、データの保存、更新、検索、削除を行うシステムです。
- データーベースの型の種類は色々ありますが、「リレーショナル型データベース管理システム（RDBMS）」が主流になっています。


# リレーショナル型データベース管理システム（RDBMS）とは
- テーブル同士の関係を関連付け（リレーション）することができるもの。
- カラム（列）とレコード（行）を持つテーブルで構成されて管理するもの（エクセルやスプレッドシートの表のようなイメージ）
- リレーショナルデータベース管理システム（RDBMS）のサービスとして「MySQL」が世界で最も使われています。

## テーブルとは
- カラム（列）とレコード（行）で構成される表（テーブル）です。
![スクリーンショット 2019-04-28 20.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/465b0036-0f79-ca81-777b-135c84148501.png)

## データーベースとテーブルの全体像を図解
- データベースは作成したいアプリケーションにつき、1つのデータベースを作ります。
- データベースの中にはテーブルというデータを保存するための表のようなものを作成します。この中にデータを格納していきます。
- テーブルはデータベースの中にいくつでもつくることができます。

（例）ECサイトを作る場合を想定しています
![スクリーンショット 2019-04-28 20.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/6fae10ce-6cce-9030-7101-a6d0ebc36323.png)


## リレーショナル型データベース管理システム（RDBMS）の役割

- テーブル同士が関連付けられていることにより、一方を更新すると、もう一方を自動で更新できるようになります。また、2つのテーブルを結び付けて必要な情報を取得することができます。
- 次の図では、userテーブルの[id]とorder_itemsテーブルの[user_id]を関連付けています。これにより一つのテーブルから他のテーブルのデータを参照することが簡単にできます。

![スクリーンショット 2019-04-28 21.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/c7b5381b-e550-3959-0783-0d1417bbb225.png)
Ubuntu 16.04 で無線子機(BUFFALO WI-U2-433DHP)を使う

###ソースをダウンロード
```
$ git clone https://github.com/msharov/rtl8812au.git
```

###ソースにデバイスIDを追加
ダウンロードしたソースがWI-U2-433DHPに対応していなかった。
WI-U2-433DHPのデバイスIDを調べる。
WI-U2-433DHPを挿した状態で

```
$ lsusb
Bus 002 Device 003: ID 056e:6018 Elecom Co., Ltd 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0458:004b KYE Systems Corp. (Mouse Systems) 
Bus 001 Device 009: ID 0411:029b BUFFALO INC. (formerly MelCo., Inc.)
```
BUFFALO INC.となっているものが目的のデバイスで、IDは0411:029bの部分である。

 **/os_dep/linux/usb_intf.c** を開く。
 ```#ifdef CONFIG_RTL8821A``` の中に ```{USB_DEVICE(0x0411, 0x029B),.driver_info = RTL8821}, /* Buffalo - WI-U2-433DHP */``` を追加する
0x0411と0x029Bは先ほど調べたIDである。

```
#ifdef CONFIG_RTL8821A
        /*=== Realtek demoboard ===*/
　　　.......................................
　　　.......................................
　　　.......................................
	{USB_DEVICE(0x3823, 0x6249),.driver_info = RTL8821}, /* Obihai - OBiWiFi */
	{USB_DEVICE(0x0411, 0x029B),.driver_info = RTL8821}, /* Buffalo - WI-U2-433DHP */
#endif
```

###ビルド

```
$ make
$ sudo insmod 8812au.ko
```

モジュールがロードされたことを確認する。

```
$ lsmod
```
表示されたリストに8812auがあればOK
WI-U2-433DHPを挿して確認する。


起動時にロードされるようにしておく

```
$ sudo cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
$ sudo depmod -a
$ sudo bash -c 'echo 8812au >> /etc/modules-load.d/modules.conf'
```
えっ…HerokuでMySQL使えるの…？

<h1>はじめに</h1>
駆け出しエンジニアの私が、railsでCDをリマインドするサービスを作成中にちょこっと詰まって勉強になったことを共有します。

<h1>きっかけ</h1>
開発でMySQLを使っていたのですが、Herokuを使用してデプロイ〜と思ったら構文エラー…
→あれ？HerokuってMySQLじゃなくてPostgreSQLなんだ
→MySQLとPostgreSQLって日付から文字列へ変換する構文違うのかい

```sql:MySQL
date_format(curernt_date,'%Y年%m月%d日')
```

```sql:PostgreSQL
to_char(curernt_date,'%Y年%m月%d日')
```

じゃあHerokuをMySQLにしちゃおうっていうのがきっかけ

<h1>手順</h1>

<h3>1.Heroku公式サイトでクレジットカード情報登録</h3>
Heroku公式サイトでログイン→Account settings→Billing
※freeプランにすれば無料です

<h3>2.creardbアドオンを追加</h3>

```
$ heroku addons:add cleardb
```

<h3>3.cleatdb_database_urlをコピー</h3>

```
$ heroku config

=== cdremind-ydkk Config Vars
CLEARDB_DATABASE_URL:mysql://b6186433d6983a:148e917b@us-cdbr-iron-east-02.cleardb.net/heroku_e8d3935e943f973?reconnect=true
```

<h3>4.先程のmysqlをmysql2に変えてペースト</h3>

```
$ heroku config:set DATABASE_URL='mysql2://b6186433d6983a:148e917b@us-cdbr-iron-east-02.cleardb.net/heroku_e8d3935e943f973?reconnect=true'
```


多分上記の手順だけで行けるはずですが、私の場合既にデプロイしていたので
add-onsにpostgreの情報が残っていたためうまくできませんでした。
そこで下記を行うことで解決しました。
<h3>4.アドオンの削除</h3>

```
$ heroku addons:destroy アプリ名
```

これで先程の手順2,3,4を行えば問題なく設定できているはずです。

<h1>参考</h1>
https://qiita.com/senou/items/108ef1d94dcb5b227b4f
VSCodeにオススメの拡張機能

こんにちは、アキトです。

本日は、VSCodeの利便性を上げるための拡張機能をご紹介します。

##　全部で5つあります

**Japanese Language Pack for Visual Studio Code**
→ VSCodeはデフォルト英語ですが、日本語表記に変換されます

**Ruby**
→ Rubyの構文を確認し、間違っているところを指摘してくれる

**HTML Snippets**
→ HTMLタグ、CSSタグを補完してくれる

**zenkaku**
→ 全角スペースを知らせてくれる

**vscode-icons**
→ 言語ごとにファイルのアイコンが変わる




上記5つの拡張機能を入れておくことで利便性が増すのでオススメです。
プログラミング学習記録71〜ちょっとずつ〜

##今日やったこと
- Progate JavaScript4そのまま復習

クラス、インスタンス、コンストラクタ、メソッドに関する部分を復習しました。

コンストラクタとは、インスタンスが生成された直後に呼び出される関数です。
メソッドとは、クラスの中で定義される関数のようなものです。

この辺は結構忘れていたので、一度リセット復習をした方がいいと思いました。

1回理解したら簡単なんですけど、コンストラクタのオーバーライドがちょっと複雑ですね。

ほんのちょっとですが、ちょっとずつプログラミングに対するモチベーションが回復してきました。
今の自分じゃだめだというポジティブな自己否定がどれだけできるかにかかっている気がします。

また明日からも頑張ります。

おわり