OmniAICreator/Qiita-1.07M huggingface dataset:
[GAS] スプレッドシートに記載されている日付をMoment.jsでいじる

[Spreadsheets/Excel Advent Calendar 2019](https://adventar.org/calendars/4085)の8日目でございます。

## 前提
Google Apps Scriptでは、Moment.jsが使える。
これは、とっても便利ちゃん。

[日付＆時刻の便利ライブラリ「Moment.js」をGoogle Apps Scriptで使う方法](https://tonari-it.com/gas-moment-js-moment/)

## やりたいこと
下記、テーブルがあって、これを
`2018-07-18(水) 15:09`
みたいな書式にして出力したい。

| タイムスタンプ | メールアドレス |
| --- | --- |
| 2018/07/18 15:09:03 | maeshow@gmail.com |

## え、シートに書いてあるまんまじゃん? って
### やってみる
``` show_data.js
function show_date() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  Logger.log(values[1][0]); //えーいままよ!
}
```

```result.txt
Wed Jul 18 15:12:02 GMT+09:00 2018
```

### え・・・なんで?
javascriptのdateオブジェクトになるらしい。
困った～。
というのも、JSのDateオブジェクトは扱いが厄介だから。
**少なくとも、私は苦しんだ。二度と、そのまま触るまいと心に決めている。**

## Momentで扱いたい!!
Momentオブジェクトという日付の扱いをめちゃめちゃ簡単にしてくれるものが存在している。

### Unixタイムスタンプに変換してしまおう
Dateオブジェクト → Momentオブジェクトの変換は、もっとスマートなやり方があるのかもしれないけれど、とりあえずUnixタイムスタンプ経由させればいけるぜ! 
というわけで、`Moment.moment.unic(<unix_time_stamp>)`を使いたい。
魔法の呪文のご紹介～。
`Math.round( <date>.getTime() / 1000 )`

```translate_by_Moment.js
function show_date() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( date.getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm); //オブジェクトが表示されるはず
}
```

### 書式をつけてあげよう
`<moment object>.format('hoge')` という感じ。
`2018-07-18(水) 15:09`こうなるように頑張る。

```show_date.js
function myFunction() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( values[1][0].getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm.format('YYYY-MM-DD(ddd) HH:mm'));
}
```
```result.text
2018-07-18(wed) 15:09
```

はい、残念～という気持ち。

### 日本語表記にしてあげよう
```show_date_with_Japanes.js
// Momentを日本語設定に
Moment.moment.lang('ja', {
        weekdays: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
        weekdaysShort: ["日","月","火","水","木","金","土"]});

function show_date_with_Japanes() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( values[1][0].getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm.format('YYYY-MM-DD(ddd) HH:mm'));
}
```

```result.text
2018-07-18(水) 15:09
```

## まとめ
Moment超便利、絶対覚えよう。
(GASという茨の道をいくなら。)
WindowsPEについて書いてみる

はじめまして、
とりあえず登録してみたので、投稿してみます。

～～～～～～～～～～～～～～～～～～～～～～

Win10になってから(?)はWindowsが起動できないトラブルもあまり聞かないし遭遇もしないですね、いいことです。しかしながら、根絶されたわけでもないのでUbuntuやWinPE等の外部メディア（DVDやUSBメモリ）ブートも必要なわけでして。

# WindowsPEとは何か
ググってもらえばいくらでも情報はあると思うので簡単に書きましょう。DVDやUSBメモリなどから起動するWindowsです。MSが公式に出しているものですが、PEそのものは基本的には自分で作る必要があります。
XP時代はOEMのみで一般には公開されていませんでしたが、非公式で同様の物を作るBartPEが一部で流行りました。Vista/7時代はPE2.x/3.xで、ここから一般公開されています。Win8時代はPE4.x/5.x。Win10になってからはPEのバージョンも10に合わせられたはずです。もちろんビルドが新しくなると同時にPEもマイナーアップデートされていますが、1909は1903とほぼ変わらないのでPEのアップデートは行われませんでした。

### ～～～作り方～～～
#### A.WindowsのインストールDVDやUSB
おなじみのWindowsインストールディスク、あれも実はWindowsPEです。最もインストーラーしか起動しないのであまり自由に使えないイメージはありますけどね。（Shift+F10でコマンドプロンプトが開くのはありますが）

#### B.各種メーカーのツールにより作成
パーティーションバックアップ、ウイルス対策ソフトなど一部のソフトでもWinPEを作れるものはあります。とは言っても、大概はその対象のソフトしか起動しないのですけどね。その中でも、AOMEI PE Builderは珍しくファイラーなど他のソフトも入れられます。なお、WindowsADKのダウンロード、インストールを要求されることが多いです。

#### C.WindowsADKをインストールしてコマンド打って作成
↑で出てきた、WindowsADKをダウンロード、インストールして作成するという方法。Qiitaで出てくる記事はほぼすべてこれですね。MS公式の方法だけありますが、
〇 パッケージの適用が問題なくできる
反面、
× 作成するのにいちいちコマンド打つ必要があり、初心者には敷居が高い
× 作成したPEを起動しても、コマンドプロンプトが出るだけ
× そのままだと隠しファイルも表示されない(↑a,bもそう)
× ダウンロードするファイルのサイズが大きいし所要時間も長い
といった欠点があることも書いておきます。問題になるかどうかはその人次第。

#### D.WinPtchXを使用して作成する
非公式PE作成ツール。DLして解凍して、作成するPEを選択するだけで、WinADKをインストールすることなく（ファイルの一部は裏で自動的にDLしている）比較的高速に作成できる。既存のISOやboot.wimファイルを改造することもできる。良くも悪くも、一般の人が使いやすいように作られている。
ん？ステマだって？いえ、ダイマです(笑)

#### E.Win10PESEやWin10XPEを使用して作成する
WinPtchXの上を行く、機能面では間違いなく最強の非公式ツール。海外製。ソフト名はWinBuilderで、その設定ファイル郡がWin10PESEやWin10XPEとして公開されている。各種ツールの導入はもちろんのこと、WOW64も入れられるのでそこは魅力。ただ、作成が少し面倒くさいのが欠点。

### ～～～用途～～～
#### １．Windowsのインストール時/修復環境
先に述べた通り、Windowsのインストールや修復で使用。

#### ２．バックアップディスクやリカバリディスク、ウイルス対策で使用(Linuxベースのことも多い)
起動中のWindowsをリストアすることはできないため、必然的にバックアップソフトの復元はメディア起動のLinuxやPE上から行うことになりますね。主なメーカー↓
バックアップ/パーティーション/ディスクコピー：Acronis AOMEI EaseUS Minitools Paragon Macriumなど
ウイルス対策：各社。ESETは出してたはず。他のメーカーもたぶんあります。
WinPtchXやWin10PESE/XPEでも一部のツールを導入できます（もちろん非公式なのでうまくいくとは限りらないことには注意、ただし複数のツールを1枚に収められるという公式にはないメリットもある）。

#### ３．Windowsが起動しない時に備えて作成し、必要な時に起動
その通り、起動しないマシンのファイルを退避するために使用する。ファイルのコピーができればいいのでどの作り方をしても良いのですが、コマンドに不慣れな方ならファイラーがあるといいでしょう。

#### ４．同じ環境を多くの台数にクローンするときに使用
私は詳しくはわからないのでパスさせてください。

## それぞれに合った作り方を
必要なパッケージを導入する必要があるならADKをコマンド打って作る。ファイル救出のためならWinPtchXで作る、すでにあるインストールDVDからメモ帳等を起動してそこから何とかする、WOW64が必要などこだわるならWin10PESEなどを使う。
決定木

# はじめに

回帰とニューラルネットワークについては、イメージがつくが、決定木については、中々イメージが付かないので、整理してみた。

## 決定木とは
- 決定木とは、ある簡単な基準に基づいてデータの分割を繰り返し、木のような構造を作り出すアルゴリズム。
- 分類・回帰問題の両方に適用可能。
- 「CART」と「C4.5(C5.0)」と呼ばれる2つの代表的なアルゴリズムが存在する。

### 不純度
基準となる特徴量やしきい値はどう決めるのか?

(分割前の不純度) - (分割後の不純度)

が最大になるように、分割の基準を決定する。つまり、(分割後の不純度)が最小になるような分割を行う。
「不純度」とは、簡単にいうと、どれだけいろいろなクラスの観測値が混じり合っているかを表す指標。
分類問題の場合は、1つのノードに1つのクラスの観測値のみがあるのが理想(不純度=0)。

数式で考えると

Nm個の観測値を持つ領域Rｍにおけるクラスｋの観測値の割合を次のように書く。

$$\hat{P}mk =1/N_m\sum_{x_i\in R_i}I(y_i = k)$$

### 不純度を表す関数
- ジニ指数（微分可能）


$$1 -\sum_{k=1}^K\hat{P}_mk^2$$


- 交差エントロピー（微分可能）

$$- \sum_{k+1}^K\hat{P}mk\log\hat{P}_mk$$

### irisデータセットの場合（ジニ指数）
左:
gini = 0.168,
samples = 54,
value [0, 49, 5],
class = versicolor

右:
gini = 0.043,
samples = 46,
value = [0, 1, 45],
class = virgica


左　

$$1- \Biggl(\frac{0}{54}\Biggr)^2
- \Biggl(\frac{49}{54}\Biggr)^2
- \Biggl(\frac{49}{54}\Biggr)^2
\approx 0.168
$$

右　

$$1- \Biggl(\frac{0}{46}\Biggr)^2
- \Biggl(\frac{1}{46}\Biggr)^2
- \Biggl(\frac{45}{46}\Biggr)^2
\approx 0.043
$$

よって、全体の不純度は、

$$\frac{54}{100}\times0.168 + \frac{46}{100}\times0.043 \approx 0.111$$

### 決定木のメリットとデメリット
メリット
1. 理解が容易である(ホワイトボックス)。
1. 分類・回帰のいずれにも適用できる。
1. あらゆる問題に広く適用できる。

デメリット
1. 分散が大きい(外れ値の影響を受けやすい)。
2. 過学習しやすい(ノンパラメトリックモデル)。
3. 予測面が滑らかではない。

### 過学習を防止するためには、
- パラメータの調整が大切。
- 木の深さの上限(max-depth)や、1つのノードが最低持たなければならない観測値の数
(min_samples_leaf)などを
適切に設定する。

## 回帰問題への適用
回帰問題の場合、コスト関数を以下のように定義する。

$$\hat{c}mk =1/N_m\sum_{x_i\in R_i}y_i$$


$$Q_m(T) =1/N_m\sum_{x_i\in R_i}(y_i - \hat{c}_m)^2$$


$\hat{c}_m$はその領域に含まれる観測値の平均を表している。よって、このコスト関数は平均2乗誤差である。2つに分割したそれぞれの領域の平均2乗誤差の重み付き和が最小になるように分割を行う。

# 最後に
決定木は、勾配ブースティングに使われる学習器。また、分類だけでなく、回帰にも使えるて万能。理論は理解したので、実装方法を身につけたい。
#VsCode などのエディタで文字で図を描いて、画像をスクリーンショットでキャプチャすればツールは必要ないのでは？ プログラミングに必須の図面作成を簡単に。


![image](https://user-images.githubusercontent.com/13635059/70360080-d5531200-18c0-11ea-97ad-d4f8f44477c3.png)


```


Alice -> Bob -> Carol


|----------- Term ------------|

    |----------- Term -------------|



```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2820








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
How to draw diagram for  programming easiest way? Type characters with Editor  e.g Vs Code and take Screen shot capture image.


![image](https://user-images.githubusercontent.com/13635059/70360080-d5531200-18c0-11ea-97ad-d4f8f44477c3.png)


```


Alice -> Bob -> Carol


|----------- Term ------------|

    |----------- Term -------------|



```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2819








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アンサンブル学習

#はじめに
決定木の基本的な概念を理解できた。ポイントは、分割する際に発生する「不純度」の評価。
評価関数として、「ジニ指数」、「交差エントロピー」があり、その評価関数を使い、「不純度」がゼロに近づくように分類する。

Nm個の観測値を持つ領域Rｍにおけるクラスｋの観測値の割合を次のように書く。

$$\hat{P}mk =1/N_m\sum_{x_i\in R_i}I(y_i = k)$$

- ジニ指数（微分可能）


$$1 -\sum_{k=1}^K\hat{P}_mk^2$$


- 交差エントロピー（微分可能）

$$- \sum_{k+1}^K\hat{P}mk\log\hat{P}mk$$



また、決定木は、分類の他に回帰問題にも使え、その適応は次の式となる。
回帰問題の場合、コスト関数を以下のように定義する。

$$\hat{c}mk =1/N_m\sum_{x_i\in R_i}y_i$$

$$Q_m(T) =1/N_m\sum_{x_i\in R_i}(y_i - \hat{c}_m)^2$$

簡単に、言うとコストの平均と予測値の最小二乗を取り、それが最小になるようにする。

## アンサンブル学習とは?

複数の学習器を組み合わせ、より良い予測を得ようとするテークニック。単一のモデルを単独で使うよりもたいていの場合良い結果が得られる。具体的には、複数の予測器の予測値の「平均を取る」、もしくは「多数決をとる」などの処理で組み合わせる。近年、データ分析の現場で注目されている「ブースティング」「ランダムフォレスト」などもアンサンブル学習の一種。

### バギング(ブートストラップ集約)
「複数の学習器(予測器)を組み合わせる」と言っても、同じデータを使って同じアルゴリズムで学習を行ったモデルを組み合わせても意味はない。とは言え、普通データは1つしか存在しない。そこで、「ブートストラップ」と呼ばれるテクニックを使う。訓練データからランダムに(重複ありで)n個のデータをサンプリングする。

###バンピング
複数の予測器の中から最も当てはまりの良いモデルを探すための手法。ブートストラップデータ集合を使ってN個のモデルを生成し、それらをもとの訓練データに当てはめ、予測誤差を最小にするモデルを最良のモデルとして選ぶ。バギング、スタッキングに比べ、一見メリットのないような手法だが、質の悪いデータを用いて望ましくない解が得られてしまった時、それらのデータを除いたブートストラップデータ集合によって、より良い解が得られることがある。

### ランダムフォレスト
ランダムフォレストは、前述の「バギング」のベース学習器として「決定木」を用いた手法。具体的なアルゴリズムは以下の通り、
1. 訓練データからN個のブートストラップデータ集合を取り出す
2. これらのデータを使ってN個の木 T を生成する.このときp個の特徴量からm個だけをランダムに選ぶ。
3. 回帰の場合は平均を、分類の場合は多数決を取って最終的な予測値とする。

***なぜベース学習器に決定木を用いるのか?***
バギングの基本的な考え方は、分散大・バイアス小のモデルを複数組み合わせて誤差を減らすこと。
- 分散大・バイアスト → 複雑なモデル (ex. 決定木、最近傍法)
- 分散小・バイアス大 → 単純なモデル (ex. 線形回帰)

決定木は、バギングのベース学習器としては理想的な分散大・バイアス小のモデル。その他、「高速である」、「変数のデータ型を問わない」、「スケーリングに対して不変」などのメリットがある。

***なぜ一部の特徴量だけしか使わないのか?***
アンサンブル学習においては、モデル間の相関が低ければ低いほど最終的な予測値の精度は高まる。同じようなモデルをいくつも集めても意味はなく、異なったデータで学習したモデルを組み合わせたほうが性能が高い。ブートストラップに加え、それぞれのモデルで学習に使う変数を変えることでモデル間の相関を低くする。

### ブースティングとは?
「ブースティング」は、アンサンブル学習の手法の1つ。ベース学習器を逐次的に訓練する。

### AdaBoost(アダブースト)
各学習器の訓練で、重み付けられたデータ集合が利用される。前の学習器が誤分類したデータ点により大きな重みを与える。最初は全てに均等な重みを与える。それらのベース学習器の予測値を最後に結合して最終的な予測値とする。

### 勾配ブースティング
残差を使ったモデル。決定木は、over fitしてしまうので、前の結果の残差の勾配（微分）がゼロになるように、学習させて行く。（まだ、完全に理解できていない。）

Kaggle Masterが勾配ブースティングを解説する
https://qiita.com/woody_egg/items/232e982094cd3c80b3ee

Gradient Boostingについて調べたのでまとめる
https://www.st-hakky-blog.com/entry/2017/08/08/092031


# 最後に
決定木に関して、ググってみました。かなり理解が深まりましたので、今度はコードに起こして、さらに理解を深めたいと思います。

参考
機械学習】アンサンブル学習（前編）| バギング・スタッキング・バンピング、ランダムフォレスト
https://www.youtube.com/watch?v=0WcrBe017-w&list=PLS0ga_-CwEAryL5_Saiit6CIU1oZS7S4j&index=11
Pythonで数独を解く

#はじめに
hello😇初めてのアドベントカレンダーですがいつも通り書いていきます。今回はpythonで数独を解いていこうと思います。
※コードは[こちら](https://github.com/Tiger59/sudoku)に挙げておくので主要なコードのみ説明します。

#数独のルール
1. あいているマスには1から9までの数字が必ず1つ入る。
* 縦9マスに1から9までの数字が1つずつ入る。(重複はしない)
* 横9マスに1から9までの数字が1つずつ入る。(重複はしない)
* 太線で囲まれた3×3のブロックのどれにも1から9までの数字が1つずつ入る。(重複はしない)

(例)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267562/0419d580-d3b0-bba3-646b-3d982ee92c3f.png)


#実装


今回は最適化問題でよく使われる[mypulp](https://pypi.org/project/mypulp/)モジュールを使います。データはエクセルに格納し[openpyxl](https://pypi.org/project/openpyxl/)を使い扱います。必要なモジュールはrequirements.txtに格納しておいたので下記コードをコマンドラインで実行してください。

```bash
pip install -r requirements.txt
```

## データ作成
まず数独のデータを保管するリストを用意します。

```python

N = [i for i in range(1,10)]    #行番号，列番号，数
C = [(3*i+2, 3*j+2) for i in range(3) for j in range(3)]   #ブロックの中心位置の集合
D = [(i-1, j-1) for i in range(3) for j in range(3)]       #周囲8マス＋そのマスの相対的な位置の集合

```
そしてエクセルからヒントの数を読み込みます。


```python

n = {}
for i in N:
    for j in N:
        n[i, j] = sheet.cell(row=i+1, column=j+3).value
```
## 制約条件
制約条件は主に四つ挙げられます。
① 何かしらの数字が入る(ヒントの数字含む)

```python
for i in N:
    for j in N:
        if type(n[i, j]) is int and 1 <= n[i, j] <= 9:
            model.addConstr(x[i,j,n[i, j]]==1)#ヒントの数字
        else:
            model.addConstr(quicksum(x[i,j,k] for k in N)==1)#それ以外
```
② 行に各数字が1つずつ入る

```python
for i in N:
    for k in N:
        model.addConstr(quicksum(x[i,j,k] for j in N)==1)
```
③ 列に各数字が1つずつ入る

```python
for j in N:
    for k in N:
        model.addConstr(quicksum(x[i,j,k] for i in N)==1)
```
④ ブロックに各数字が1つずつ入る

```python
for (ci, cj) in C:
    for k in N:
        model.addConstr(quicksum(x[ci+di, cj+dj, k] for (di, dj) in D)==1)
```

## 目的変数
通常最適化問題では何らかの数値を最大、最小にすることが多いですが今回は特にありません。

## 実行
今回はsudoku_ans.xlsxという別のファイルに書き込むようになっています。

```python 
model.optimize()
# 出力
if model.Status == GRB.Status.OPTIMAL:
    print('解が見つかりました。')
    for i in N:
        for j in N:
            for k in N:
                if x[i, j, k].X > 0.01:
                    font = copy(sheet.cell(row=i+1, column=j+13).font)
                    if type(n[i, j]) is int:
                        font.color = styles.colors.Color(rgb='ffff0000')     #ヒントの数
                    else:
                        font.color = styles.colors.Color(rgb='ff000000')   #求めた数
                    sheet.cell(row=i+1, column=j+13).font = font
                    sheet.cell(row=i+1, column=j+13).value = k                    
    book.save('sudoku_ans.xlsx')
else:
    print('解が見つかりませんでした。')

```
最後にsudoku_ans.xlsxを確認ししっかり数が入っていれば成功です。

## まとめ
今回は数独を解きましたが、数学パズルゲーム全般解けるのでいろいろ試してみたいですね。それでは😇
CI で electron-packager の spawn wine64 ENOENT

CircleCI の Linux VM 上で `circleci/node:12` イメージにて electron-packager を使って 3 プラットフォーム用のバイナリをビルドしていた。

electron-packager のバージョンを 14.1.0 から 14.1.1 に上げようとしたら Windows バイナリのビルドが壊れた。

パッチアップデートなのに CI が落ちてびっくりしたので記事に残している。

```sh
$ electron-packager (略) --platform win32 --arch x64
```

というコマンドでビルドするために今までは

```yml
command: |
  sudo dpkg --add-architecture i386
  sudo apt update
  sudo apt install -y wine32
```

と前準備をすればビルドできていたのだが、これをエラーメッセージの雰囲気から

```yml
command: |
  sudo apt update
  sudo apt install -y wine
```

と変更すれば動いた。
MySQL データベース作成入門

# やること
MySQLでデータベース作成する際に行う

- ユーザー作成
- データベース作成
- テーブル作成

この3つのやり方について

# 環境
- Linux mint 19.2
- MySQL 5.7

# ユーザー作成

## １．rootでMySQLを実行する
最初はrootしかユーザーがいないため、新しくユーザーを作成して権限の付与などを行います。

まずはrootでmysqlを実行します。

```sh
$ sudo mysql -u root -p 
Enter password: rootパスワード
```

## ２．ユーザー作成

管理者権限を持ったユーザーを作成します。

```sql
GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'localhost' IDENTIFIED BY 'test_pass' WITH GRANT OPTION;
```

今回は`ON *.* TO 'test_user'`で全てのデータベースに対して全ての権限設定をONにしています。

※権限について詳しい情報は公式サイトを参考
[MySQL 公式サイト](https://dev.mysql.com/doc/refman/5.7/en/grant.html)

ユーザー作成出来ているか確認します。

```sh
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| test_user        | localhost |
+------------------+-----------+
```

rootの下にtest_userが表示されれば作成成功です。

権限を確認します。

```sh
mysql> SHOW GRANTS FOR 'test_user'@'localhost';
+--------------------------------------------------------------------------+
| Grants for test_user@localhost                                           |
+--------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------------------+
```

ここまで確認出来てたら一度`exit`で抜けて、作成した`test_user`でMySQLを実行します。

```sh
mysql> exit

$ sudo mysql -u test_user -p
Enter password: test_pass
```

#データベース作成

次はデータベースの作成をします

```sql
CREATE DATABASE mydb;
```

作成出来ているか確認します。

```sh
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

#テーブル作成

最後にテーブルを作成します。
まず、先ほど作成したデータベースを使います。

```sh
mysql> USE mydb;
Database changed
```

テーブルの作成をします。
ここではよく使うであろうユーザー情報のテーブルを作成します。

```sql
CREATE TABLE user (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
password VARCHAR(256) NOT NULL,
mailaddress VARCHAR(256) NOT NULL UNIQUE);
```

テーブルが作成出来ているか確認します。

```sh
mysql> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| user           |
+----------------+
```

カラムの設定を確認します。

```Sh
mysql> DESC user;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(64)  | NO   |     | NULL    |                |
| password    | varchar(256) | NO   |     | NULL    |                |
| mailaddress | varchar(256) | NO   | UNI | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
```


ここまで作成すれば基本的なことは終了したと思います。
後は実際に使うデータを挿入したり、WEBアプリやサイトからアクセスしてデータを使用したりすればOK

以上です。

#参考サイト
https://www.dbonline.jp/mysql/
Javascriptのletとconstについて

何気なく使ってしまっていますが、改めて基礎を勉強します！

## let ＝　再代入が可能
``` js
let a = 'test1'; //この時点では　a　＝　'test1'

a = 'test2'
console.log(a); // 再代入OKなので、ここでは　'test2' 
```

**確認**
![スクリーンショット 2019-12-08 5.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/35eda19c-9e81-b072-4dc3-da17d08ab801.png)

## const = 再代入不可

```js 
const a = 'test1'; 
a = 'test2'; //errorになる
```
**確認**
![スクリーンショット 2019-12-08 5.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/fdfe93d6-3fcc-0472-e0d4-65f52c67f708.png)

**var**もあります。
### var = 再宣言、再代入が可能
``` js
var a = 'test1'; //まず宣言、初期値代入
a = 'test2'; //　再代入
var a = 'test3'; // 再宣言
```
**やってみた**
![スクリーンショット 2019-12-08 5.27.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/ae642ab2-73fa-f698-b49f-511fb7621db8.png)

**基本的にはconstを使うことがおすすめです。**
理由は再代入を繰り返すと今なんの値が入っているのかわかりにくいので、デバッグに時間がかかります。

##注意
constを使っていてもこのようなオブジェクト操作は出来てしまうので注意する必要があります。

**arrayにpushする場合**

``` js
const a = []; 
a.push(1); 
a.push(2); //追加で代入することができる 
```
**やってみた**
![スクリーンショット 2019-12-08 5.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/497be6ab-a815-0cc5-1143-e0d53bba2e97.png)


**objectにプロパティーを追加**
![スクリーンショット 2019-12-08 5.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/538b0c82-ee32-9d3f-7b2b-3ead53e6d519.png)
Vuetifyのバリデーションルールの設定


```js:data
email: '',
emailConfirm: '',
rules: {
  required: value => !!value || '必須項目です',
  email: value => {
    const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return pattern.test(value) || 'メールアドレスが間違っています'
  },
  emailMatch: value => value === this.email || 'メールアドレスが一致しません',
},
```

```:確認用のinputのrulesプロパティ
:rules="[rules.required, rules.emailMatch]"
```

これでうまくいけば良いけど、
コンポーネントの構造の問題なのかアロー関数の`this`絡みのエラーが起きるケースがあった

```
Error in beforeMount hook: "TypeError: Cannot read property 'email' of undefined"
```

`this`を使っているものをアローをやめて`methods`に移動すると解決

```js:methods
emailMatchRule (value) {
  return value === this.email || 'メールアドレスが一致しません';
}
```

```:確認用のinputのrulesプロパティ
:rules="[rules.required, emailMatchRule]"
```
高階関数

高階関数とは関数を引数、戻り値として扱う関数
…よくわからないので、とりあえずやってみました！

``` js
const test= (text1) => (text2) => console.log(`${text1} ${text2}`)
test(111)(222); // 111222
```
（↑可読性の観点からあまりおすすめしない）

**やってみた**
![スクリーンショット 2019-12-08 4.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/8fe409e3-ec4f-6337-a999-0c312a178117.png)

引数を一個ずつ入れる書き方

``` js
const test4 = test(11111); 

test4(22222); //11111 22222
```

**やってみた**
![スクリーンショット 2019-12-08 4.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/a050f861-b9e8-ff4a-1cdd-b35cd2c2c27f.png)

基礎を勉強中なので基本に戻って…
**アロー関数の書き方を使わないでやってみた**

``` js
function test(a, b) {
 console.log(`${a}と${b}`)
}
test(1, 2); // 1と２
```
![スクリーンショット 2019-12-08 4.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/e4926243-0e77-5a52-6fcf-606158e9ca38.png)

もっと基礎に戻って書くと

``` js
function test(text1) {
    return function (text2) {
        console.log(`${text1}と${text2}`);
    }
}
```
**やってみた**
![スクリーンショット 2019-12-08 4.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/b3575638-16b3-ac6f-7ba6-9e84beb0c567.png)


引数同士で計算もできる!

``` js
function test(a, b) {
 console.log(a + b);
}
// a + b の結果が返ってくる
```
![スクリーンショット 2019-12-08 4.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/91ad522b-58fa-6853-81c3-9779bb90f7e0.png)
自分の前職ではRPAは必要でした


#概要#
未経験でこの業界に入り、そろそろ半年になります。
日々落ち込むようなこと(一番最近は社内の総務向けに作ったデビュー作Botが使われなくなっていた事:sob:)もありますが、
実力不足であり、できることもあるなと感じているのでその辺りの事は書きません！

自分が前職で地方の飲食の職に就き日々心身ともに余裕が無くなるくらい働いていました。


今ならその時もしRPAを知っていたなら絶対に導入していたと思います。


全部が当てはまるかはわからない、ツッコミどころもあるかもしれませんが
こういった経験があるので自分はRPAの職に就きました。



少しでもみなさんの参考になれたら幸いです。


##当時働いていた自分の会社の現状##
自分は大学を卒業してから広島の創業から約20年、7～8店舗構えるレストランチェーングループで店舗のマネージャーをしていました。


年末年始のみ定休であとはランチもディナーも営業しています。ありがたいことに長年御贔屓にしてくださっているお客様で毎日忙しくしていました。


自分の働いていた会社は会計にはPOSレジを使っていて、そのデータが事務用PCに残るようにしてあります。
発注にはインフォマート(業界ではとても有名は発注管理システムです)を使っており、勤怠管理にはFoodingWorks(東芝の勤怠管理クラウドサービス)などを使っていました。それぞれ本部が管理しやすいように別々のPCが使われています。


導入する前よりはそれぞれの業務に割く時間は削減されているのですが便利なものを入れたが故に
**事務用PCでシフトを作り、できたシフトと日々の売り上げを勤怠管理システム用PCに入力し、それで割り出された人件費率、人時生産を日報入力用PCに入力し、それで割り出された仕入れ比率や利益額などを元に発注用PCで発注作業を行う。**


こんな事を閉店後に毎日のように行っていました。どんなに早くやっても30分くらいはかかります。
閉店片付け後のこの事務作業は、閑散期はまだいいですが繁忙期には精神的に辛いです。


そのような形で**その業界ならではのシステムが仕事の随所に存在し、それらを使い会社独自の管理の仕方で統一されていました。**


今思えば無駄のところは山ほどあるのですが内側にいると気づかないんですよ…
当たり前のようにやっていました。





こんなに複雑になってしまったから本部の経理部はいつもピリピリしています。



支店から送られてきたデータと支店で発行されたジャーナルや納品書、入力されているシフトに間違い、不備がないかを毎日確認しています。
(年末年始の二日しか休みがない企業だったのでこんな事を毎日確認していると考えると仕事量凄まじいですよね)



なので少し不備があるとすぐ電話がかかってきて怒られます。(ホントきつかった…)


年々人手不足が深刻になっていき、ゆとりができるほど社員がいなくなり社員一人一人の負担は増していっていました。



ただ、**この会社の人手不足を正確に言えば会社が提示する給与で来てくれる人材がいない。**


**人材など更なるコストに費やす事のできる金額は限られている**のが現状でした。
また**複数システムを利用しているので毎月利用料が発生している**ので

**一元管理できるような新しいシステムがでてきても全社規模で切り替える導入コストが現状ではない。**


そのような状態でした。


##心の余裕が無くなる仕事がRPAで無くすことができるのではないか##


その時々で便利なツールを導入し、それで社内のシステムを作ってきました。


その結果、
**その時は効率化されていたことが、人手不足で負担になってしまい、
複数のシステムで業務ができているので身動きが取れず改善ができない。**


**社員はただデータをコピペするよな仕事が増え、尚且つ間違いがないかの確認作業が増え体力、心労が増えている。**


飲食をやめ(いろいろ理由がありとても続けることができませんでした。)RPAの職に就いたのは
**RPAなら複雑になってしまった会社のシステムでも自動化でき社員の体力負担、心労が減り余裕を作ることができる。
そして仕事に前向きに取り組んでもらえ、今よりも価値ある仕事に取り組んでもらうことができる。**


RPAを知った時にこんな大義が実現できると思い、飛びつくように会社にやりたいと申し出ました。


でも実力不足で全然実現できていないのが現状ですが…


##自分が思う中小企業向けのRPA##
**業務自動化と言われてもよくわからないのでRPAツールはなかなか導入されづらい**と思います。

ITに疎かった当時の自分なら金額でスルーしています。
自分の店舗に金額に見合う、費用対効果の得られる自動化業務がすぐにはないですから…


なので
**「最初は業務、システムの整理を行わずともできる自動化を始める。」**
**「そこから少しずつ社員の負担が軽減させ、理解を得ながら拡大させていく。」**



そこに対応できるRPAツールが求められると思います。


**最近小額から始められる、簡単な作業のみ行うRPAツールがどんどん出始めていますが
そうしないと導入しようとしない、できない企業があり
その人達向けにツールを作るくらいこのような現状の中小企業が存在すると思います。**


私はその企業の現状にあったRPAツールを提案できる、RPAでその企業の社員を幸せにできるエンジニアに
いち早くなるために頑張ります！！
Google Cloud PlatformにCloud SQL インスタンスを作成する

みなさん、こんにちは。

何か新しい事に挑戦しようと思い、nuxt.jsとfirebaseからのGoogle Cloud Platformを勉強し始めました。

nuxt.js + firebaseの環境構成は初め見たときかなり斬新で楽しいのですが、Firestore + Cloud Functionsの組み合わせが自分にはちょっと難易度高すぎてバックエンドはlaravel + SQLがやっぱり良いなと。

・・・というわけで、今回はGoogle Cloud Platform（以下、GCP）のCloud SQLインスタンスの作成にチャレンジしてみました。

本当は、ほぼこの話（アドベントカレンダー）のためにフロントnuxt.js環境、バックエンドlaravel + firebase + Cloud SQLで作ったので実際に今回作成したデータベースに接続するところまで記載したかったのですが、久しぶりに調べながら記事を書いていたら時間がかかり過ぎて、到底終わらない量になってしまいました。

内容的にご存知の方には全く面白く無い内容に仕上がってる気がしますが、「Google Cloud PlatformにCloud SQLインスタンスを作成するのって、意外と楽なんだな。今度やってみようかな。」みたいに思ってくれる人がいると良いなと思い書いたのでよかったら最後までお付き合いくださいませ。

## 前提条件

前提条件としてGCPのアカウントの作成、Cloud SDKのインストールは完了しているものとします。

また、GCPのCloud SQL インスタンスは無料枠が存在しないようなので、今回はGCPアカウントを初回作成した際に割り当てられる無償クレジットを使っています。

## Cloud SQL インスタンスを作成する

GCP管理画面からSQLを選択すると、Cloud SQLインスタンス作成画面が開きます。
「インスタンスを作成」を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/49b65064-9658-99a5-094a-136a08c59407.png)

## データベースエンジンの選択

現在GCPではMySQL、PostgreSQL、SQL Serverの３種類が選択出来ます。
[この辺](https://medium.com/web-developer/mysql-vs-postgresql-performance-test-with-laravel-api-for-simple-eloquent-queries-on-1-million-6e0e6f1005b8)を見た感じ、単純なWEBアプリケーションならMySQLのパフォーマンスが良さげだったので今回はMySQLを選択して進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/1edfb523-f75e-3223-e3e8-204bbf9d2779.png)

## DBインスタンスの詳細を設定

作成するインスタンスのマシンタイプやストレージ容量はここで指定する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/d6756560-3246-b06b-6f9d-e971cebf74bf.png)

マシンタイプはデフォルト`db-n1-standard-1`という本番運用可能なものが指定されています。
とりあえず使ってみたい課金額が気になる人はここで最小構成の物を選んでみると良いと思います。（最小構成で課金が始まったら月額およそ８００円くらい？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/ff695554-aefe-5693-6185-433b5dff2044.png)

### パブリックIPの設定

パブリックネットワークから接続する場合はここでネットワークを指定する必要があるようです。
ただ、GCP内から接続する場合は特に何も設定なしで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/2b79b49d-be66-9fe6-0326-60dd8e3bc6bb.png)

作成するとGCP管理画面上ではこんな感じで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/e2491112-ef93-d5e6-40d8-c0a2a0cb6bc0.png)

## データベースを作成してみる

作成したインスタンスを参照し、データベースタブから新規データベースが作成出来ます。
試しにテストデータベースを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/0b3b23c1-823b-01b8-a10d-c1a387d22c7f.png)

データベース名を適当に決めて、あとはデフォルトのままで良さそうなので「作成」しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/b98e72fb-6f94-469e-39ec-b96bbcfc7db8.png)

### データベースに接続する

作成したデータベースに接続してみます。
接続はGCPのWEB画面上にあるgcloud CLIから接続出来ます。
gcloud CLIを起動したら（画面右上のコンソールアイコンをクリックして起動）以下のコマンドで接続出来ます。

`gcloud sql connect <データベース名> --user=root`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198321/0f034a93-fa91-8d08-beca-c41adc5c3c3f.png)


無事、データベースに接続する事ができました！！

その他の話については、また機会があれば・・・そうですね、来年のクリスマス頃にまた！！
ブランチを切って最初の空commitまでするalias



## そもそもなぜ最初の空commitが必要なのか

最初のcommitは戻りづらいからである。

commitを戻したり、取り消したりする方法は `git rebase` や `git reset` などがあるが、
最初のcommitはこれでは戻れない。
なぜなら、rebase・reset元の親commitが存在しないからですね。


### 最初のcommitを元に戻したい場合（これは余談なので飛ばしてもよいです）

```zsh
git update-ref -d HEAD
```
というコマンドで元に戻せます。

gitは、最後のcommitをSHA-1ハッシュ値で覚えています。
これを参照する、参照(refs)と呼ばれるものがあり、
.gitの中を見てみると、以下のような構成になっています。
これらのファイルの中身がSHA-1ハッシュ値です。

```zsh
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
```

そして、ブランチが切られたとき、gitは `HEAD` というファイルで最後のcommitを参照します。
中身を見てみると、以下のように現在の作業ブランチの最後のcommitのSHA-1ハッシュ値を参照しています。

``````zsh
$ cat .git/HEAD             
ref: refs/heads/master
``````

なので、
最初のcommitを戻すということは、
現在の作業ブランチを切った最後の状態に戻すということになりますので、
`update-ref` というコマンドを使って、現在の参照を削除して、１つ前に戻してあげるということです。



### なので、最初に空commitをしたほうがよいですよということです。

そのために差分のない状態でもcommitできる `--allow-empry` オプションがありますね。

がしかし、毎回するのは面倒だなぁ、というのがあるので、aliasを使ってみました ^o^/


## 本題のalias

gitのaliasの書き方については、[【Git】エイリアス晒す＆書き方まとめ](https://qiita.com/YamEiR/items/d98ba009d2925e7eb305)にまとまっていました^^


私は基本的にブランチを切って最初のcommitをするまでに
私は以下の手順を行います。

``````zsh
git checkout -b <ブランチ名>
git commit --allow-empty '<ブランチ名> init'
``````

この手順を一つで行うaliasです。


``````zsh:.zaliases
alias gcb="git checkout-b-empty-commit"
``````

``````zsh:.gitconfig
[alias]
  checkout-b-empty-commit="!sh -c 'git checkout -b $1 && git commit --allow-empty -m /"$1 init/"' -"
``````

引数を使用したかったため `.gitconfig` の方に中身のcommandを記述しました。
（zshのaliasには引数を使用できないので関数にしないといけない）

2箇所で設定したくない場合は、関数でするのもありかと思います。


私は `.zaliases` や `.gitconfig` などはdotfilesで管理していて、設定ファイルが散らばりにくくなっているので 
`.zaliases` `.gitconfig` で作成しました＾＾



毎回行う手順などは、aliasにしておくとやはり便利ですね！！
Jupyterの簡単なラッパーカーネルを動かしてみよう

# Jupyterのカーネルはどうすれば作れる？

- Jupyterのカーネルを作ってみたい。
- でもどうしたらいいかわからない。

という方がいらっしゃるのではないかと思います。
ここではそこから前に進むために，最も簡単なカーネル(ラッパーカーネルと呼ばれるもの)の作成例を示します。
(https://jupyter-client.readthedocs.io/en/stable/wrapperkernels.html のまんまではあるのですが環境構築が初めての人にはわからないかと思い。)

ラッパーカーネルとは何かとかすっ飛ばしてとにかく動作例を体感しようという趣旨な感じです。

# まずは環境準備

ほとんどの方がcondaを使って開発に必要なpackageをインストールしているかと思います。
ここでもcondaでラッパーカーネル作成のための環境を作ります。
prompt_toolkitのバージョンとJupyterコンソールの相性があるのでcondaを使っといた方が無難っぽいです。
とりあえずjupyterのコンソールが要ります。前述の相性がありますんでバージョンに気をつけてください。

```
conda install jupyter_console=6.0.0
```

次に名付けるカーネル名でフォルダー(ディレクトリ)を作ります。
ここでは`echo`としてます。

```
mkdir echo
```

`echo` フォルダーの下に下記の`echokernel.py`と`kernel.json`を作ります。
https://jupyter-client.readthedocs.io/en/stable/wrapperkernels.html のまんまです。

```{python}
from ipykernel.kernelbase import Kernel

class EchoKernel(Kernel):
    implementation = 'Echo'
    implementation_version = '1.0'
    language = 'no-op'
    language_version = '0.1'
    language_info = {
        'name': 'Any text',
        'mimetype': 'text/plain',
        'file_extension': '.txt',
    }
    banner = "Echo kernel - as useful as a parrot"

    def do_execute(self, code, silent, store_history=True, user_expressions=None,
                   allow_stdin=False):
        if not silent:
            stream_content = {'name': 'stdout', 'text': code}
            self.send_response(self.iopub_socket, 'stream', stream_content)

        return {'status': 'ok',
                # The base class increments the execution count
                'execution_count': self.execution_count,
                'payload': [],
                'user_expressions': {},
               }

if __name__ == '__main__':
    from ipykernel.kernelapp import IPKernelApp
    IPKernelApp.launch_instance(kernel_class=EchoKernel)
```

```
{"argv":["python","-m","echokernel", "-f", "{connection_file}"],
 "display_name":"Echo"
}
```

これで環境準備というかファイル作成は終わりです。

# カーネルをインストールし，動作を確認しよう

それではカーネルをインストールしてみましょう。

```
jupyter kernelspec install さっきのカーネル名フォルダーのパス(==echokernel.py, kernel.jsonがあるところ。相対パスでOKです)
```

これでインストールができるはずです。
ではいよいよカーネルの動作確認を行います。

```
cd さっきのカーネル名フォルダーのパス(==echokernel.py, kernel.jsonがあるところ)
jupyter console --kernel echo
```

すると

打った文字が出力されるだけのREPLが得られるかと思います。

これで一通りJupyterのカーネルを自分で作り，動かせたことになります。

# この先は?

pexpectというPythonパッケージを使用してttyでREPLを制御できる言語(例えばRuby)のラッパーカーネルを作れたりするようです。
余裕があれば残りのjupyter notebook Advent Calendar 2019でそのあたりもやってみようと思います。

以上。
c++で仮想関数テーブルを扱う

# 概要
初めまして、初投稿となります。
普段は仕事でゲームプログラマをしており、家では趣味でゲームエンジン(ライブラリ)を制作したりしています。
今まで面倒臭がって発信などあまりしていませんでしたが、自身のスキルアップのためにもこれからは色々投稿していこうと思います。
大体はゲームに関する記事になると思います。

はてなブログもやっているのですがそちらにも同じような記事を投稿をするかもしれません。

あまり文章を書かない人生を送ってきたので拙いものになると思いますがよろしくお願いします。

1.仮想関数テーブルとは
2.仮想関数テーブルを取得してみる
3.取得したところで何に使うのか
4.あとがき

# 1.仮想関数テーブルとは
仮想関数テーブルとは↓
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB

ポリモーフィズムを実現するために作られた関数のアドレスを持つ配列のことです
メンバ関数にvirtual修飾子を付けるとテーブルに関数アドレスが追加され、呼び出す際にそれを参照することで実現しています。

# 2.仮想関数テーブルを取得してみる

(私の環境はwin/msvcなので異なる環境だと上手くいかないかもしれません)

```cpp:main.cpp
class Base
{
public:
virtual void Func1(){}
virtual void Func2(){}
};

class Child : public Base
{
public:
virtual void Func2()override{}
};

int main()
{
Child* object = new Child();
const void* const* vTable = *reinterpret_cast<const void** const*>(object );

return 0;
}
```

vTableの中身
![vTable.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385318/6bf97d3a-2d21-3fc4-7038-263c58369774.png)

vTable[0]にはBase::Func1のアドレス
1にはChild::Func2へのアドレス
2は末端なのでnullアドレス
が格納されています
デストラクタも継承していれば同じように格納されます。

# 3.取得したところで何に使うのか
仮想関数テーブルを取得することで関数を継承しているかどうかや、unityのSendMessgeみたいな文字列で関数を呼び出したりすることもできます。(仮想関数しか呼び出せませんが)

後者のメリットは個人的にあまり感じませんが、前者の継承しているかどうか知れることはかなりメリットだと思います。

例えばunityのbehaviorクラスでは仮想関数としてstart, update, lateUpdateなどが定義されています。中身は空なのでサブクラスが継承しない限り呼び出す必要がありません。
startはまだいいですが、updateなど毎フレーム呼ばれる関数はオーバーヘッドがかかり、継承していない場合中身がないのに呼び出すのは無駄です。

ちなみに私が作成しているエンジンではBehavior登録時に継承関係をチェックし、継承していない関数は呼び出さないようにしています。

継承関係はテーブルの関数アドレスが基底クラスの関数アドレスを指しているかどうかで知ることができます。

実際やるにはまだ必要な事がありますが今回はここまでにしておこうと思います。
また機会があれば書きます。

# 4.あとがき
初投稿にしてあまり需要があるのかどうかよくわからないものになりました
というかゲームと関係ないですね
でも付けるタグがないので付けます

ゲームエンジンを作成している同志の方がいれば参考にしていただけたら幸いです


自分はあまり知識があるほうではないですが、これから頑張っていきたいと思います

それでは！
Pythonで3次メッシュコードをWKTに変換する

備忘録レベルですが、pythonで3次メッシュコードをWKTに変換する関数を作成いたしました。
地味ですが、いざ必要なときに計算できなくなってしまいがちです...

```python

def toWKTfromMeshCode3(mcode3: 'mesh code(str)'):-> 'wkt(str)'
  south = (int(mcode3[0:2]) * 80 + int(mcode3[4:5]) * 10 + (int(mcode3[6:7]))) * 30 / 3600
  west = (int(mcode3[2:4]) * 80 + int(mcode3[5:6]) * 10 + (int(mcode3[7:8]))) * 45 / 3600 + 100
  north = south + 30 / 3600
  east = west + 45 / 3600
  wkt = 'POLYGON(({e} {n},{w} {n},{w} {s},{e} {s},{e} {n}))'.format(s=south, w=west, n=north, e=east)
  return wkt

```
なんかターミナルでbut the gem is not loaded.Add` gem' sqlite3'` to your Gemfileって言われた

#症状
dbでも作ろうかと思い、rails g modelができなかった。

#原因
バージョンを指定せずにbundle installを行ったため最新のバージョンのsqlite3がインストールされていたため。v1.4.0はActiveRecordに未対応らしいです。

#処置
gemファイルを編集してsqlite3のバージョンを変更する。

```ruby:Gemfile
gem 'sqlite3'
```
↓

```ruby:Gemfile
gem 'sqlite3', '~> 1.3.6'
```

#まとめ
そもそもmysqlしか使ったことが無かったためsqlite3とはなんぞや？から始まりました。db指定とバージョン指定忘れがち。
Themebetaでchromeテーマを作った

Figmaで背景画像を作成し、Themebetaを使ってchromeテーマを作成してみました〜。

ダークモードが好きで使っていたのですが、ブックマークバー結構見えにくいので、
他のテーマ探しましたがしっくり来ず、作りました^^

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263845/304e1fbf-bb75-27c8-2549-6e086aee32bc.png" width=70% >

## 使ったのもの
- [Themebeta](https://www.themebeta.com/chrome-theme-creator-online.html)
- [Figma](https://www.figma.com/)

## Themebetaとは
[ThemeBeta - Google Chrome Themes and Theme Creator, Windows Themes and Theme Creator online](https://www.themebeta.com/)
こちらです。

> ThemeBeta.com is a web site for Theme Designers to create and share Chrome Themes online.
> (訳)ThemeBeta.comは、テーマデザイナーがChromeテーマをオンラインで作成および共有するためのWebサイトです。

とても簡単にchromeテーマが作れます〜◎＾０＾◎


## 作り方
1. ThemeBeta.com にアクセスしたら「**THEME CREATOR**」をクリック。作成画面に行きます。
2. 「**1. Upload an Image**」をクリックし、好きな画像をアップロード。<br>
  画面のサイズに合わせて背景画像を作成する、もしくはどこかからダウンロードすると良さそうです。
3. 画面プレビューしたの「**Background Image**」でポチポチして背景画像のお好みの指定をしてください。
4. 次にカラーの設定です。
「**2. Generate Colors**」を押すと背景画像に会うカラーを自動で設定してくれて、カスタムしたい部分だけ、タブの「**Images**」「**Colors**」から設定できます。
すべて自分で設定したいたいからは、画像を設定してそのまま「Images」「Colors」タブで設定すれば良いと思います＾＾。
5. 「**3. Pack and Install**」保存します。

![Group 1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263845/063679ac-5e3b-236f-1690-973a2ca78307.png)


## 設定方法
Google chromeの設定画面に行き[拡張機能の設定](chrome://extensions/)に移動します。
そこにダウンロードしたテーマファイルをドラッグ・アンド・ドロップします。

これで設定が完了です！🎉

googleのアカウントごとにテーマが変えられるので、
自分は、一つは自作のテーマ、もう一つは [Daily 2.0 - Source for Busy Developers](https://chrome.google.com/webstore/detail/daily-20-source-for-busy/jlmpjdjjbgclbocgajdjefcidcncaied) という拡張機能を使ったりしています^^


## 余談
### 作成したテーマファイルの中身

- /images
- manifest.json

imagesには背景画像に使った画像や、toolbar用の単色の画像がいくつかはいっており、
その他の設定はすべてmanifest.jsonに書いてあります。 chrome extentionsでも必須になるファイルです。

manifest.jsonの設定項目の一覧は[こちら](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json)です。

これらの設定を自動でやってくれているのが Themebetaのようですね！
なので一から自分で作ることも可能そうです＾＾

### 背景画像について
1. まず元画像を作成しました

　![Group 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263845/96d39851-e74a-298e-fd5f-4cfcaae7522b.png)
検索窓上部の「Google」の文字とごちゃらないように、文字は45°傾けています。

2. 画像を並べて背景っぽくします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263845/d03a609c-cacc-7027-21c3-bb14ebc614a7.png" width="60%">

3. Googleのロゴと検索窓付近を見やすくするために背景を追加しておわり🍫

　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263845/d8bdeabb-8618-b3c2-41e3-9af6862de9ca.png" width="60%">



---
_参考：_
[GoogleChromeのテーマを作ってみる！ - Qiita](https://qiita.com/Nattouumai1075/items/779c4246d7c7bed96b5c)
Container Insightsの料金

# これは何

EKSでのContainer Insightsの料金を試算したりしたので、そのまとめを残したもの。
基本的には**[ここ](https://aws.amazon.com/jp/cloudwatch/pricing/)の例7**を読んで試算する。

間違えてたら教えてください。

# 前提

* EKSで考える
* EKS自体の料金は含まない

# 料金

## 観点

* メトリクス
    * Container Insightsを有効化すると、自動的に必要なメトリクスが多数作成される。
    * これはCloudWatchのカスタムメトリクスで作られる。
    * **1メトリクスにつき月額0.30 USDとし、カスタムメトリクスの数で料金が決まる。**

* ログ
    * 1メトリクスあたり、1時間で38KBのログが取り込まれる。
    * **取り込んだログの容量1GBにつき0.50 USDとし、料金が決まる。**

## 試算

### メトリクス
例として、**Cluster数:1/Node数:4/Namespace数:6/Service数:20/Pod数:40**としてみる。

| 要素 | 要素1つに対して自動的に設定されるメトリクス数 | 例で定義した要素の数 | メトリクス数 |
|:-----|:----------------------------------------------|:----------------------|:-------------|
| Cluster    | 24 | 1  | 24  |
| Node       | 8  | 4  | 32  |
| Namespace  | 6  | 6  | 36  |
| Service    | 6  | 20 | 120 |
| Pod        | 9  | 40 | 360 |

合計で572メトリクスあるため、
572 * 0.30 = 171.6
**月額171.6 USD**が課金される。

### ログ
1メトリクスの1時間のログ容量と、1GBあたりの料金は決まっている。そのため、メトリクス数が決まれば自動的に決定する。
メトリクス数 * 38KB * 720時間 / 1024 / 1024 * 0.50 USD
とすれば1か月のログの料金を求められる。

572 * 38 * 720 / 1024 / 1024 * 0.50 = 7.5
**月額7.5 USD**が課金される。

### 合計

この例の場合は
**171.6 + 7.5 = 179.1 USD**
がContainer Insightsの月額の料金となる。

# 試算してみての備考

* 変動要素となるのはCluster/Node/Namespace/Service/Podのそれぞれの数のみ
* 課金要素はメトリクスとログの2種類だが、ログの金額は割合としてはとても小さい。Container Insightsの料金の肝はメトリクス数
* 特にService、Podによる部分が大半を占める
    * OSSとかで自動的にたくさんのPodが作成されたりするものは注意が必要かもしれない
* Nodeが増えても、あまり金額は一気に増えたりしない(EC2インスタンスの費用は考えず、あくまでContainer Insightsとしては)
* 導入すると自動的に多数のカスタムメトリクスが作成されるが、**料金を削減したいからといってこのカスタムメトリクス数を減らすのは現状では不可能(サポートより回答あり)**
IoTLT Fukuokaを(1年ぶりくらいに)開催しました！

IoTLT　Fukuokaを開催しました！
## こういう会をひらきましたよと
[【祝復活】福岡版IoT縛りの勉強会IoTLT vol.7 - connpass](https://iotlt.connpass.com/event/142739/)
![S__47939603.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/86e38eac-3ba7-35cf-0115-ba372dad058f.jpeg)

東京では超盛り上がって開催する度に満員御礼になっている我らがIoTLTですが
私のホームグランドである福岡ではなんと....1年ほど休眠状態になっていたところ

主催ののびさんよりLINEのOpenChatがリリースされIoTLTスレを作ったおりに
<img width="375" alt="S__47947778.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/f5060eb5-017a-b1cc-3d2d-cd1bee6ab1b7.jpeg">

### 「福岡やらないんすか？」
と言われ。
### 「あ、じゃあやります。」
と二つ返事で受けてしまったばっかりに初めてのIoTLT参加が主催になってしまうという
暴挙が発生してしまいました。
（今見たら1分で決めていた。）
なのでかなーりぐだぐだになってしまったと思うんですが記憶を頼りに書いていきます。

ということで

### 福岡 IoTLTの報告をしようと思います。

とりあえず一連の流れで簡単に紹介します。

## LT1: Raspberry piとSORACOM SIM 、 AWSを用いた、会議室管理システム
bombaniraさんが発表してくれたやつ
九州工業大学の超優秀な学生で現在インターン中だという学生ペアが発表してくれた
インターン先で作ってみたという会議室管理システム。
画像認識とか使ってました。
Slackチャットボットを駆使してインターン先で大活躍の模様。
![S__47939599.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/9b0c4eaf-f321-f2b6-c7a0-999d7787f62d.jpeg)


### 小学生並みの感想：
画像認識とか使って遊んでみたいなと思いました。


## LT2: 親方空から女の子がをする

宮田さんがやってくれた奴。

もうタイトルからして意味が分からない。
想像できた人はいたのであろうか？

![S__47939602.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/ae670e74-1f13-42a5-0ea8-aec7b16be02f.jpeg)


しくみとしてはVUIで起動したら画像認識で顔が落ちて？きたら認識して
警報が鳴るというとてもよく分からないカオスなものを作ってくれました。
超好き。
もはや落ちるとはなにか？というところからツッコミ満載で
実際は落ちるのは無理だから横からただ近づいていくだけだったが
ちゃんと動いた。
パトランプが顔認識を阻害していたようでなかなか認識しなかったが
ちゃんと警告がけたたましく鳴っていた。

### 小学生並みの感想：
ちゃんとハロウィン要素も入れてくれていて全体的に訳が分からなかった。
好き。


## LT3: REST API管理あれこれ

leather_soleさんのLT

次が自分のLTだったので写真を撮り忘れてしまった。。。
申し訳ないです。。。。

#### つよつよエンジニアの発表で
僕レベルのエンジニアリング力ではまだまだ勉強不足感否めなかった。

RESTAPIは最近は誰しも使っている（知らずにも）ものだとおもうが
Swaggerとか最近は便利なものがでているのでそういうのもちゃんと使って行きたいと思う。

### 小学生並みの感想：
もっと勉強しないといけないと思いました。



## LT4: ESP32使って釣りを快適にしてみる。

僕がLTしたやつ
写真はない。
誰か撮ってないのか？

みんな釣り好きという体で喋った。

ESP３２にジャイロセンサーを付けて当たりがあったら（釣れたっぽい感じ）
LINENotifyへ通知が行くというやつを作ってみた。

みんな釣り好きだったのだろうか？

### 小学生並みの感想：
福岡主催としてもっとIoTしたかった。
強くなりたい！



## LT5: なんかのりで喋る

上野さんのLT

![S__47939620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/a6ac8beb-0613-c331-a1bf-44d98a410a10.jpeg)


普段は基盤設計とかファームウェアとか書いてる
フリーのハードエンジニアをしている方ですが

最近？はやった「あなたの番です。」に出てきた
AI奈々ちゃんを作りたいそう。

あと東京でやっていた大人のIoTLTやりたいと言っていた。
これは僕も大賛成。
みんな「大人の」好きですよね！

### 小学生並みの感想：
大人のIoTLT開催したい。


## LT6: AR吉永さん

福岡でARといえば吉永さん！！
飛び入りでLTをして貰いました。

![S__47939624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336684/1233aa17-88c3-23c8-c90e-8ee7247c584c.jpeg)


ほんと技術の進歩ってすげぇって漢字で
機材が小型で高性能なのがどんどん出て
この先どういう未来になっていくのか本当にわくわくしました。

偶然？キャリーケースでAR機材を沢山持ってきていたので
体験会も最後に行い楽しませて頂きました。

### 小学生並みの感想：
HoloLensほしい。


## ということで1年ぶりくらいの福岡IoTLTを無事？に開催しました。
無事に開催できたかは分かりませんが
定期的に福岡でも開催したいと思うのでもし東京からIoTLTの方が福岡に来るときあれば
福岡の坂根に行って下さい！その日程に合わせてIoTLTするのも良いかなと思っています。

いやーほんとに人が集まらなかったらどうしようかと思いましたが
福岡で20名以上も集まるのはやはりIoTLTパワーですね！

それにしても写真がおんなじ様なのしか無い。。。
個人的お気に入りの Chrome プラグイン

[福岡若手Sier_bc Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fukuoka-sier_young_bc) 7日目の記事です。
※ 12/07 中に投稿間に合わなくて申し訳ない ！！

## はじめに
みなさんお気に入りのブラウザがあると思いますが、僕は Google Chrome　派です。
Windows PC の時も基本的には Chrome です。
(昨年やっていた PJ がいまどき、IE8 対応の案件で超絶苦戦したため IE には憎しみが深い)
個人的にお気に入りの便利プラグイン (有名所ではなく、マイナー所) を 2 つだけ紹介します。

## [LinkMemo](https://chrome.google.com/webstore/detail/linkmemo/ldjlfegijibnmliabfelcjpkbklicbhi?hl=ja)
これは、Chrome で第二のブックマーク機能を提供するものです。
「このページ後でも見たいけど、ブックマークする程でもないんだよな...」
という時にこのプラグインが役立ちます。
操作は簡単で、プラグインのアイコンをクリックして **+** をクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/fe3ec001-a196-2ac4-8842-e122c9fbeeb8.png)

## [Hacker Tab](https://chrome.google.com/webstore/detail/hacker-tab/ibomigipadcieapbemkegkmadbbanbgm)
これは、Chrome で新しいタブを開いた時に GitHub のトレンドリポジトリの情報をランダムで見せてくれるものです。
わざわざ [Trending repositories on GitHub today](https://github.com/trending) の
ページを確認するのはめんどくさいですが、このプラグインを入れると新しいタブを開くとトレンドが見れるため、
日々の情報収集にピッタリです。
こんな感じに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/b6b52fd3-2c65-f42b-e699-3b46385de8e8.png)


## おまけ
Hacker Tab で昨日見つけたちょっと面白いリポジトリの紹介。
[sherlock-project/sherlock](https://github.com/sherlock-project/sherlock)
これは、GitHub や Twitter、Instagram などの各種 SNS サービスに指定したアカウント名のユーザが
登録されているか検索できるツールです。
例えば、役立つ情報を発信しているエンジニアの Twitter アカウントを見つけたら、その ID で検索をかけることで、
GitHub のリポジトリを発見できたりします。
> このツール、使い方によってはなかなか変態的なため注意

### 準備

```
# clone the repo
$ git clone https://github.com/sherlock-project/sherlock.git

# change the working directory to sherlock
$ cd sherlock

# install python3 and python3-pip if they are not installed

# install the requirements
$ python3 -m pip install -r requirements.txt
```

### 検索
`hogehoge` ID で検索する場合

```
$ python3 sherlock.py hogehoge

[*] Checking username hogehoge on:
[-] ResearchGate: Illegal Username Format For This Site!
[-] 2Dimensions: Not Found!
[+] 500px: https://500px.com/hogehoge
[-] 7Cups: Not Found!
[-] 9GAG: Not Found!
[-] About.me: Not Found!
[+] Academia.edu: https://independent.academia.edu/hogehoge
[-] Alik.cz: Not Found!
[-] Anobii: Not Found!
[-] Aptoide: Not Found!
[+] Archive.org: https://archive.org/details/@hogehoge
[+] AskFM: https://ask.fm/hogehoge
[-] Avízo.cz: Not Found!
[-] BLIP.fm: Not Found!
[-] Badoo: Not Found!
[-] Bandcamp: Not Found!
[+] Basecamp: https://hogehoge.basecamphq.com
[-] Bazar.cz: Not Found!
[-] Behance: Not Found!
[-] BitBucket: Not Found!
[-] BitCoinForum: Not Found!
/// 以下略
```
結構いっぱいヒットしてびっくり
golangでDIを行ってみた

# 背景
初めてGo言語を使ってAPIを作っており、テストを書くことに。
以前、Javaを使った開発をしていたので、そのノリでテストを書こうとしたのですが...
書いてみると、mockが上手く使えない...
そこで、Googleさんに色々聞いていたら、どうやらDIというものがあるらしいってなった次第です。

なお、ここに書いてることは自分なりの解釈なので、間違い等ありましたらコメントにてご指摘をお願いします！

# DIとは
参考：
[猿でも分かる! Dependency Injection: 依存性の注入](https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f)
[やはりあなた方のDependency Injectionはまちがっている。](http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/)

## Dependency Injection=依存性の注入
どうやらDIとは、Dependency Injectionの略のようで、日本語では「依存性の注入」と訳されるらしい。
しかし、依存性の注入とはよく分からない単語だ。

## 「依存性」と「注入」
以下、自分なりの「依存性」と「注入」の理解になります。

* 依存性  
依存性とは、あるインスタンス内で他のインスタンスを利用している状態のこと。
* 注入  
インスタンス内で利用する部品をインスタンス化する段階で渡してあげること。

## つまり
う〜ん？要は、インスタンス化するときにそのインスタンス内で使うものを渡してあげれば良い？

# Example
今回は簡単に、フレームワークのginを利用してHelloWorldページを実装してみます。


``` go:service.go
package action

// ServiceImp is an implimentation of service
type ServiceImp struct {
}

// HelloService return a hello message
func (s ServiceImp) HelloService() string {
	return "Hello World!!"
}
```

こちらが、サービスのロジックを実装したStructになります。
今回は、Hello World!!と返すだけです。

``` go:env.go
package action

import "github.com/gin-gonic/gin"

// ServiceIF is the interface
type ServiceIF interface {
	HelloService() string
}

// Env is service environment
type Env struct {
	Service ServiceIF
}

// NewEnv Constractor for Env
func NewEnv(service ServiceIF) *Env {
	env := Env{Service: service}
	return &env
}

// HelloWorld is the function to display a message
func (e *Env) HelloWorld(c *gin.Context) {
	c.JSON(200, gin.H{"msg": e.Service.HelloService()})
}
```

そして、他に、`ServiceImp`を受け取れるインターフェースを持った`Env`を定義します。

``` go:main.go
package main

import (
	"sample/action"

	"github.com/gin-gonic/gin"
)

func main() {
	var service action.ServiceImp
	env := action.NewEnv(service)
	r := gin.Default()
	r.GET("/", env.HelloWorld)
	r.Run()
}
```
上記2つのstructをmain関数の中でインスタンス化します。
このときに、`Env`のインスタンスである`env`には`ServiceImp`のインスタンスである`service`を渡します。
これで、`http://localhost:8080`にアクセスすると、無事に”Hello World!!”が表示されました。

# 利点
こうすることで何が良いかというと。。。
例えば、次のような`ServiceImp`のモックを作ったとします。

``` go:service_mock.go
package action

// ServiceImpMock is an implimentation of service
type ServiceImpMock struct {
}

// HelloService return a hello message
func (s ServiceImpMock) HelloService() string {
	return "This is test..."
}
```
ここでは、`Hello world!!`の代わりに`This is test...`と返すように`HelloSrvice`の中身が変わっています。
そして、以下のようにmain関数で`env`に渡すインスタンスをモックに変えます。

``` go:main.go(2)
package main

import (
	"sample/action"

	"github.com/gin-gonic/gin"
)

func main() {
	var service action.ServiceImpMock
	env := action.NewEnv(service)
	r := gin.Default()
	r.GET("/", env.HelloWorld)
	r.Run()
}
```
これで、画面に表示される文字が、”This is test...”へと変わりました。
このように、`Env`の中で呼び出されるインスタンを外から渡すようにすることで、挙動を変更することができます。
これを使えばテストを書く際などに、モックを作ってあげることで、インスタンス内で呼び出している他の部品の実装に依存しないテストを作成することができるようになります。

# まとめ
DIとは、インスタンス内で使用している他のインスタンスをハードコーディングせずに、外部から渡せるようにすること。
これにより、モックを使うことができるようになり、他の部分の実装に依存しないテストが行えるようになります。
ゲーム自主制作初心者のためのアイデア捻出法

　
#挨拶は基本
お初にお目にかかりまする。
某、togoといふ者にて候。

この度は、部活 (NITKitコンピュータ研究部) のアドベントカレンダーに気まぐれで参加してしまったために、Qita記事を初投稿している次第です。

ブログもそうですが、在学年数に対して保有している技術力も極めて低いため、拙い点が多々見られると思いますが、ご了承ください。
　

#本題
##概要
さて、今回稚拙な技術力で何を偉そうに語るのかと申しますと、ずばり **ゲーム制作** に関する小話をさせて頂きます。

私は将来の進路希望のためにも、 **ゲームプログラミング** に最も力を入れております。
なのでゲーム制作に関してはそれなりの知識を有しているつもりです。

また、今回はその中でも特に自信のある **アイデア力(りょく)** に関する話をしたいと思いました。

ただ、あまり下手な大口を叩けないので、今回はあくまで **初心者向けの超基本的内容を3つ** だけお話します。

それでは、お付き合いのほどよろしくお願いします。
　

##①自己欲求を満たす
難易度にもよりますが、ほとんどのゲーム制作は **大量の時間** を用します。

RPGのレベル上げのように、長時間作業を行うことは、自身の **モチベーションを徐々に下げる効果** があります。(「飽きる」、「だれる」といった現象です。)

そのため **モチベーションの維持** というのは、ゲーム制作において、ある種 **最大の課題** とも言えます。

「今流行りのもの」や「評価の高いもの」を意識して制作しても、 **自分が好きでなければ** 、開発意欲は長続きしません。

　
その解決策として最も有力な方法が、 **「自己欲求を満たすこと」** であります。
　

先ずは **「自分はこのゲームを遊びたい！」** と思える1本を作りましょう。

そういったゲームは、 **作っている最中も楽しい** ですし、 **完成が待ち遠しくなる** ため、モチベーションを維持し、 **完成させやすくなる** と思います。

一度 **完成を経験** すれば、要領を押さえ、モチベーションの維持もしやすくなり、様々な種類のゲーム制作を、スムーズに行えるようになるはずです。

##②ゲーム以外の知識も重宝する
ゲーム制作のアイデア出しでよく用いられる手法が、「すでにあるゲームからアイデアを得る」方法であります。

ゲームを作るのだからゲームを参考にすることは当たり前だと思いますが、これでは既存のゲームと似たり寄ったりなゲーム性になってしまい、 **独創性に欠けた作品** になってしまいます。（個人的に、これは現在のソーシャルゲーム界隈で実際に起こっていると思います。）

　
そんなときは、 **「ゲーム以外の観点からアイデアを引っ張ってみる」** ことを推奨します。
　

例えば、僕はカラオケの採点で高い点数を取る方法を心得ております。
こんな、いかにもゲームと関係なさそうな知識でも、

・音程バーに合わせるように上下に移動する
・きれいな抑揚がつくように声量を調節する
・歌い終わりに上下に往復し、ビブラートを作る

というふうに、いかにも **ゲームっぽい操作で捉える** ことができ、これを基に **1本のゲームを作る** ことができる気さえします。

このように、 **ゲームとは無関係なところからアイデアを出す** ことは可能であり、それは **高い独創性を保有している** 確率が高いです。

**幅広い視野** を持つこともまた、ゲーム制作者にとって、大切なスキルなのです。
　

##③システム設計はアルゴリズムから
ゲームシステムの設計は、大変に頭を使うものです。

「6×5のマスに敷き詰められた、色の違う球の1つを持って、場所を交換しながら移動し、持つのをやめたとき、3つ以上同じ色の球が並んでいたら、それを消して、スコアを加算する」

といった、どこか見たことあるゲームシステムも、プレイする側は単純に見えますが、作る側の立場で見てみると、どういう処理を行っているのか、  **1文ではいまいちつかみにくい** ものです。

　
こういうときは、 **「1つ1つの動作」** をしっかり見つめてあげましょう。
(以下順を追って先のシステムの設計を行います。)
　

1. 例えば色の種類が3色だった場合、それぞれの色を数字の「0,1,2」とします。

2. 次に6×5 (「横 x × 縦 y 」とします。) の、中に0～2の数字を入れられる表を作り、それぞれのマスを0～5の x と0～4の y の座標で考えます。(( x , y )=( 0 , 0 )の時、一番左上を表し、数が増えるごとに、右と下に移動するものとします。)

3. 初期状態としてそれぞれのマスの中に0～2の数字をランダムに入れますが、この時数字を入れているマスの左2つまでと、上2つまでのマスに入っている数字と、等しく3つ並ばないように入れます。(2つより前は確認済みになるため、含みません。)

4. プレイヤーが1つの球を持った際に、その持っている球の座標を取得します。

5. プレイヤーが球を動かした際に、動かした方向の座標の数字と位置交換します。(移動したことを判定する方法は、かなり複雑な内容になるため、割愛します。)

6. 5を繰り返した後、プレイヤーが持つのをやめたところで、マスの数字を左上から順番に、右と下に3つ以上同じ数字が並んでいるかを判定します。

7. 並んでいない場合は次のマス (右か下かは任意とします。) に移動し、並んでいた場合は、相応のスコアを加算した後、並んでいたすべての数字を0～2以外の数字に書き換え、最も手前のまだ判定できていないマスから再判定を始めます。

8. 判定している座標が、最後の1つ前に到達した時点で、判定を終了します。(最後の1つ前の時点で、以降3つ並ぶことはないので、判定を終了します。)

　
このようにして、先ほどのシステムを **処理的に細分化** し、一つ一つの動作を **プログラムにできそうな形** にしていきます。

まさしくこれを **「アルゴリズム(手順)」** と呼び、ゲーム制作をする上で **欠かせない考え方** となります。

　
#あとがき的な何か
以上で私の話は終わりとなります。

もともとそんなにたくさん書くつもりはありませんでしたが、納期ギリギリに書いてしまったがために、もっと希薄な内容となってしまって、申し訳ありません。

私の願いとしては、当然私自身が面白いゲームを作れるクリエイターになることもありますが、 **世の中に面白いゲームクリエイターがもっと増え、プレイヤーを楽しませられる方が増えてくれる** こともまた、私にとっては幸せなことであります。

~~内容が薄いのにあとがきが長々としていても仕方がないので、~~これにて閉幕とさせていただきます。
ここまでお付き合いいただき、ありがとうございました。

NITKtコンピュータ研究部　togo