OmniAICreator/Qiita-1.07M huggingface dataset:
ERDPlusを使ってみる

#始めに
最近SQLの勉強を始めてます。

正直なところSQLの楽しさがよくわからないですが必要なので勉強しなきゃですね…

とりあえずER図というものがあるらしくそれをERDPlusというソフトで作ってみる

ERDPlusは無料だしインストールとかもいらないので良い:sunny:

#とりあえず

とりあえず

https://erdplus.com

ここにアクセスしてアカウント作って右上のDiagramsを押したらER図の作成ページに移る。

そこで+Newボタンを押してファイルを作成。

下↓のボタンを押せば名前を編集したりできる。


#作るもの

簡単なブログサイトのER図を作る。

とりあえずテーブルはusers,posts,categoriesを使うこととする


+Newを押したらER DiagramとかRelational Schemaとか出てくるがRelational Schemaを使う

![erd.png](https://qiita-image-store.s3.amazonaws.com/0/207921/73ae5103-0f55-9639-5066-f8cf9cf08b2d.png)


こんな感じになった。


これで個人的に戸惑ったのはpostsにuser_idとかを入れないこと

connectでつなぐと勝手に作ってくれるっポイ。

#出来たもの

後で多対多のアソシエーションには中間テーブルが必要であることに気づきCategory_Post_Regという中間テーブルを作った

出来たものがこれ

![erd2.png](https://qiita-image-store.s3.amazonaws.com/0/207921/cefd50e4-425d-1f71-8b62-0decfb3685e6.png)


これだと一対多なのか一対一なのか多対多なのかわからないけどたぶんこれはsqlのデータの作成に使うためのもの？だから良いのかな？

作ったものはExport SQLってのができて作成した図を元にSQLを書いてくれる

それがこれ

```sql

CREATE TABLE Users
(
  User_ID INT NOT NULL,
  name VARCHAR(30) NOT NULL,
  age INT NOT NULL,
  sex VARCHAR(10) NOT NULL,
  mail VARCHAR(100) NOT NULL,
  address VARCHAR(100) NOT NULL,
  PRIMARY KEY (User_ID),
  UNIQUE (mail)
);

CREATE TABLE Posts
(
  Post_ID INT NOT NULL,
  title VARCHAR(100) NOT NULL,
  body VARCHAR(1000) NOT NULL,
  User_ID INT NOT NULL,
  PRIMARY KEY (Post_ID),
  FOREIGN KEY (User_ID) REFERENCES Users(User_ID)
);

CREATE TABLE Categories
(
  Category_ID INT NOT NULL,
  cname VARCHAR(100) NOT NULL,
  PRIMARY KEY (Category_ID)
);

CREATE TABLE Category_Post_Reg
(
  RegID INT NOT NULL,
  Category_ID INT NOT NULL,
  Post_ID INT NOT NULL,
  PRIMARY KEY (RegID),
  FOREIGN KEY (Category_ID) REFERENCES Categories(Category_ID),
  FOREIGN KEY (Post_ID) REFERENCES Posts(Post_ID)
);
```

普通に書こうと思ったらかなり大変だけどこれならすぐ作れるしタイプミスもないから良い


でも結局Railsの場合rails g modelでテーブルを作るからあんま関係ないかな

アソシエーションに関して詳しく書きたい場合は+ NewでER Diagramを選択してER図を作る。

#ER Diagram

さっきのをER Diagramで作るとこんな感じになる

![erd3.png](https://qiita-image-store.s3.amazonaws.com/0/207921/3a4ac0ee-ff9b-521a-b4a0-33d673dfc856.png)


一対多なのか多対多なのかわかるようになった。

これだとExport SQLができないけどRailsの場合いらないからこっちを使ったほうが良いのかも


#終わりに

基本的に英語で書かれているので英語が超苦手な自分としてはよくわからないところが多い。

もっと機能あるだろうしなんかもっと設定できる感じだけどとりあえずはこれで良しとする:fist:
創薬といえばAI創薬、AI創薬といえば

創薬といえばAI創薬、

AI創薬といえばAI（人工知能）、

人工知能といえば機械学習、

機械学習といえば多変量解析、

というわけで、<a href="https://adventar.org/calendars/3041">創薬 Advent Calendar 2018</a> の投稿記事として、多変量解析がらみの記事を紹介したいと思います。すべて某学の講義のために私が準備したものです。AI創薬を理解するための基礎として、まずは多変量解析や機械学習を理解してみましょう！最後には「化学情報学（ケモインフォマティクス）」の入門講座の記事も用意しました。まだ未完成の記事がありますが、それはおいおい加筆していくので楽しみにしててね！

え？誰のことですか？昨年<a href="https://megalodon.jp/2017-1222-0920-50/https://qiita.com:443/maskot1977/items/4ac7d761cb248bb85304">「創薬ダジャレ」</a>とかいう謎の記事を書いた人って？

# Excelで理解するコース

* <a href="https://qiita.com/maskot1977/items/6a2dea23f97dd42a48db">Excel 関数の基本の復習</a>
* <a href="https://qiita.com/maskot1977/items/31046a66c4bdb6b2ec82">Excel を使った線形回帰、4つの方法</a>
* <a href="https://qiita.com/maskot1977/items/3abe57187721258691cc">ロジスティック回帰をExcelで理解する</a>
* <a href="https://qiita.com/maskot1977/items/5871e0b1b6a44f17c327">多層パーセプトロン (Multilayer perceptron, MLP)をExcelで理解する</a>
* <a href="https://qiita.com/maskot1977/items/eb695b516fd320aad495">主成分分析をExcelで理解する</a>
* <a href="https://qiita.com/maskot1977/items/ab6d038d622ecbb0730d">因子分析をExcelで理解する</a>

# Pythonで理解するコース

* <a href="https://qiita.com/maskot1977/items/3f8dfd4f8063c1ea2212">Jupyter Notebook を使った大規模データの可視化と機械学習 １日体験コース</a>
* <a href="https://qiita.com/maskot1977/items/7b3c11fffc3ba436d8be">線形単回帰を Python で理解する</a>
* <a href="https://qiita.com/maskot1977/items/082557fcda78c4cdb41f">主成分分析を Python で理解する</a>
* <a href="https://qiita.com/maskot1977/items/2d409313e52e353e580d">二分法・ニュートン法・勾配降下法をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/d0253e1eab1ff1315dff">多層パーセプトロン (Multilayer perceptron, MLP)をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/8a1cd75b87423f6ea638">連立一次方程式と線形重回帰をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/2a55c087974d0ac5e843">様々な補間法と最小2乗法をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/b4395da5f33f70cd4a09">微分や微分方程式をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/51caa6c8cbf8a2c691db">積分をPythonで理解する</a>
* <a href="https://qiita.com/maskot1977/items/6235aaad28b1ad8f1713">数量化理論をPythonで理解する</a>

# 化学情報学入門

* <a href="https://qiita.com/maskot1977/items/2e98d76a0782a6e89bde">化学情報学にRDKitとScikit-learnで入門する</a>
クロージャ

クロージャが分からなかったのでメモ


```go
package main

import "fmt"

func adder() func(int) int {
	sum := 0
	fmt.Println("sum: ", sum) // 最初に表示される
	return func(x int) int {
		fmt.Println("sumを加算します：", sum) // 3番目に呼び出される
		sum += x
		fmt.Println("sumが加算されました：", sum) // 4番目に呼び出される
		return sum
	}
}

func main() {
	pos := adder()
	fmt.Println("posが設定されました。") // 2番目に表示される
	for i := 0; i < 3; i++ {
		fmt.Println(
			"posを呼び出します", // 5番目に呼び出される
			pos(i),
		)
	}
}
```

```:実行結果
sum:  0
posが設定されました。
sumを加算します： 0
sumが加算されました： 0
posを呼び出します 0
sumを加算します： 0
sumが加算されました： 1
posを呼び出します 1
sumを加算します： 1
sumが加算されました： 3
posを呼び出します 3
```

以下、実行順序（予想）
１．関数を変数にセットする
２．adder()のreturn文以外が実行される？
３．main()に戻る
４．関数がセットされた変数を実行すると、return文が実行される？


実務で利用する場面が想像できない。

クロージャのサンプルにあるフィボナッチ関数

```go
package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
	num1 := 0
	num2 := 1
	return func() int{
		answer := num1
		num1, num2 = num2, num1+num2
		return answer
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
```
Cloud NATでGKEの外部IPを固定する

# はじめに
接続元IP制限のある外部サービスとの連携のため、GKEに固定の外部IPを持たせたいという要件は少なくありません。この要件を実現する簡単な方法は、Cloud NATを利用することです。
この記事では、GKE + Cloud NAT構成をTerraformで構築するときのポイントについて、tfファイルと共に紹介します。

# Cloud NATの構築
Terraformで以下3つのリソースを一度にデプロイします。

- **クラウドルーター**  
ルーターを適用するネットワークとリージョンを設定します。
- **静的アドレス**  
NATゲートウェイで変換する外部IPとして使用します。
- **NATゲートウェイ**  
NATの対象範囲と変換時に使用する静的アドレスを設定し、クラウドルーターに紐付けます。

```go:cloud-nat.tf
resource "google_compute_router" "router" {
  name    = "nat-router"
  region  = "asia-northeast1"
  network = "default"
  bgp {
    asn = 64512
  }
}

resource "google_compute_address" "address" {
  name   = "nat-ip"
  region = "asia-northeast1"
}

resource "google_compute_router_nat" "nat" {
  name                               = "nat-gateway"
  router                             = "${google_compute_router.router.name}"
  region                             = "asia-northeast1"
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = ["${google_compute_address.address.self_link}"]
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}
```

# GKEの構築
Cloud NATによるアドレス変換は、プライベートネットワークに所属するインスタンスが対象です。つまり、外部IPを持たないノードで構成されたクラスタ(=限定公開クラスタ)を作成することになります。
Terraformで限定公開クラスタをデプロイするときのポイントは以下の通りです。

- `private_cluster`を`true`にすることで、限定公開クラスタを有効にします。
- 限定公開クラスタでは、IPエイリアスを有効にします。`ip_allocation_policy`でPodとServiceのアドレス範囲を設定します。
- `master_authorized_networks_config`でマスター承認済みネットワークを追加します。利便性を取って全許可にする場合は、代わりにIAMで管理するようにしましょう。

```go:private-cluster.tf
resource "google_container_cluster" "primary" {
  name                   = "private-cluster"
  zone                   = "asia-northeast1-b"
  initial_node_count     = 2
  subnetwork             = "default"
  private_cluster        = true
  master_ipv4_cidr_block = "172.16.0.0/28"

  ip_allocation_policy {
    cluster_ipv4_cidr_block  = "10.96.0.0/11"
    services_ipv4_cidr_block = "10.94.0.0/18"
  }

  master_authorized_networks_config {
    cidr_blocks = [
      {
        cidr_block   = "0.0.0.0/0"
        display_name = "any"
      }
    ]
  }
}
```

# 確認
限定公開クラスタに適当なPodをデプロイし、自身の外部IPを確認できるWebサービスに向けてcurlを実行します。
構築した環境が正しく動作していれば、Cloud NATで設定した外部IPが返されるはずです。

```bash
$ kubectl exec -it ${pod_name} curl inet-ip.info
35.189.134.231
```

# おわりに
Cloud NATの登場以前、同様のことをするにはNATゲートウェイ用のインスタンスを自前で構築する必要がありました。自家運用は何かと辛いので、マネージドサービスとしてリリースされるのを待ち侘びていた方も多いのでないでしょうか。
Cloud NATに限らずですが、マネージドサービスを活用することで、運用にかかるコストが削減できると良いと思います。
ProxmoxでCloud-Initイメージの仮想マシンを作成する

# ProxmoxでCloud Initイメージの仮想マシンを作成する

## 仮想マシンのテンプレートを作成

Cloud-Initイメージを元に仮想マシンのテンプレートを作成します。

```sh
# Cloud-Initイメージをダウンロードする。
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

# 新しい仮想マシンを作成する。
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0

# ダウンロードしたイメージをディスクとしてインポートする。
qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm

# 新しいディスクを仮想マシンにscsiドライブとして接続する。
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0

# Cloud-Initデータを渡すCDROMドライブを追加する。
qm set 9000 --ide2 local-lvm:cloudinit

# Cloud-Initイメージをブートするために、ブートディスクにscsi0を設定し、ディスクのみ起動させる設定にする。
qm set 9000 --boot c --bootdisk scsi0

# シリアルコンソールを追加する。
qm set 9000 --serial0 socket --vga serial0

# Qemu-Agentを有効にする。
qm set 9000 --agent 1

# テンプレートに変換する。
qm template 9000
```

## 仮想マシンの作成

テンプレートから新しい仮想マシンを作成します。

```sh
# テンプレートから仮想マシンを作成する。
qm clone 9000 123 --name ubuntu2

# SSHの認証に使用する公開鍵を設定する。
qm set 123 --sshkey ~/.ssh/id_rsa.pub

# IPアドレスを設定する。
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

# ディスクサイズを変更する。
qm resize 123 scsi0 32G
```

### 仮想マシンの設定

仮想マシンの初期設定を行います。

```sh
# パッケージのダウンロード先に日本のミラーサイトを設定する。
sudo sed -i -e 's|http://archive.ubuntu.com|http://jp.archive.ubuntu.com|g' /etc/apt/sources.list

# ゲスト用のQemu-Agentをインストールする。
sudo apt update
sudo apt install -y qemu-guest-agent
```

Cloud-Initイメージから作成した仮想マシンで「error: no such device: root.」とメッセージが表示されました。

```txt
Press ESC for boot menu.

Booting from Hard Disk...
error: no such device: root.

Press any key to continue...
```

ブートの設定に問題があるそうなので、「update-grub」でブートの設定を更新します。

```sh
sudo update-grub
```

## 参考文献

* [Cloud-Init Support - Proxmox VE](https://pve.proxmox.com/wiki/Cloud-Init_Support)
* [Proxmox VE 5.2でCloud-Initが使えるようになったので使う話](http://www.ainoniwa.net/pelican/2018/0916a.html)
* [Bug #1726476 “uefi images: “error: no such device: root."" : Bugs : cloud-images](https://bugs.launchpad.net/cloud-images/+bug/1726476)
Kaggle House Prices


#ライブラリのインポート

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline 
from scipy.stats import skew
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
```

#データの読み込み

```python

train = pd.read_csv("train.csv")
```

#外れ値処理

外れ値処理は前回と同様に下図の外れ値とあまりに住宅価格の低いものを処理した。

![figure3.png](https://qiita-image-store.s3.amazonaws.com/0/209205/fc95bb03-1089-74cd-cb21-ed198506fa55.png)

```python

train = train[~((train['GrLivArea'] > 4000) & (train['SalePrice'] < 300000))]
```


#新たな変数の設計

##築年数
前回と同様にこのデータが2011年のものであることから、2011年の時の築年数をあらわす変数を更新した。さらに、改装した場合も改装してからどのくらい経つのかが需要であるので、同様に更新した。

```python

train['YearBuilt'] = 2011 - train['YearBuilt']
train['YearRemodAdd']= 2011- train['YearRemodAdd']

```

さらに、ひと手間加えようと思う。改装した場合、部屋などは新築と同様にきれいになるので、改装した年を築年数の基準の年に更新してもよいだろう。
よって、築年数に上書きする形で一つ変数でまとめようと思う。

```python
train['YearBuilt'][train['YearBuilt']!=train['YearRemodAdd']]
=train['YearRemodAdd']
```

##面積と質
"TotalSF" は前回と同様に導入した。質（Quality）が高く、面積（SF）が大きければ、住宅価格は高くなると思ったので、新たに、"TotalQual"を'OverallQual'と"TotalSF"の積で表すことにした。また、アメリカでは竜巻が起こることから、地下室が充実していることも大事な要素と考えらるので、地下室も同様のやり方で新たに変数"TotalBsmtSFQual"をつくった。

```python
train["TotalSF"] = train["TotalBsmtSF"] + train["1stFlrSF"] + train["2ndFlrSF"] + train['GarageArea']
train["TotalQual"]=train["TotalSF"] *train['OverallQual']
train["TotalBsmtSFQual"]=train["TotalBsmtSF"] *train['BsmtQual']
```
#欠損値処理
今回、オブジェクト型の変数で扱うのは上でも出てきた'BsmtQual'のみである。
欠損値処理前の状態を見てみよう。

array(['Gd', 'TA', 'Ex', nan, 'Fa'], dtype=object)

nanは0として補い、LabelEncorderで全体を補うことにした。

```python
train = train.fillna(0)
from sklearn.preprocessing import LabelEncoder
for i in range(train.shape[1]):
    if train.iloc[:,i].dtypes == object:
        lbl = LabelEncoder()
        lbl.fit(list(train.iloc[:,i].values))
        train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
train["BsmtQual"].unique()
```

欠損値処理後はしたのようになった。

array([3, 4, 1, 0, 2], dtype=int64)


#対数変換
こちらも前回同様の処理であるので、説明は省く。

```python
train = np.log1p(train)
```

#特徴量の重要度

ランダムフォレストを利用して特徴量の重要度を観察してみよう。

![figure10.png](https://qiita-image-store.s3.amazonaws.com/0/209205/5f1686b6-d9c9-4c51-cd81-ee57080a5de4.png)


新たに設計した変数 "TotalQual" がかなり重要度が高いことが分かる。
今回はこの重要度の高い5つを採用することにした。




#"TotalQual"と"SalePrice"

```python
sns.jointplot("TotalQual","SalePrice",data= train)

```






![figure11.png](https://qiita-image-store.s3.amazonaws.com/0/209205/580a92ff-da86-edf5-91b2-a079ede1d747.png)

かなりSalePriceとつよい関係があることが分かる。自分で作った変数がここまできれいな関係があるとうれしい。



#学習
前回と同様にLasso回帰で行った。

```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
las = Lasso(alpha=0.001)
las.fit(X_train, y_train)
print("ラッソ回帰でのRMSE：",np.sqrt(mean_squared_error(las.predict(X_test), y_test)))
```

ラッソ回帰でのRMSE： 0.14472654344982308

#考察
前回より結果は悪かったが、変数を絞り、自分で新たな変数を作ることでデータ分析の難しさと楽しさを感じれた。前回に加えてということもありだいぶ省いたため、26日までに修正を加えたい。
Code-AsterのCUI 実行

去年の11月、オープンCAEシンポジウムの前に4人ほどでもくもく合宿をやった。その際にCode-Asterを実行するかつてのWizardのようなGUIを作った（ https://github.com/mmer547/wizaster-gui ）。最近はメンテンナンスできておらず、忘れかけているので、肝となるCode-Asterの実行部分についてメモを残す。

# Code-Aster実行時のファイル構成

Code-Aster実行時に必要なファイルは最低限以下の三つある。

- medファイル
- commファイル
- exportファイル

medファイルはメッシュ情報が書き込まれたファイルである。
commファイルは条件、物性等を記述するファイルである。
exportファイルは計算実行時のコア数やメモリ制限、入出力ファイルリストを書くファイルで、CUIでCode-Asterを実行する場合のインプットファイルとなる。

# Code-Asterの実行コマンド

Windows版のCode-Asterでの実行はAsterStudy出現前のLinux版と同じである。

```shell:Windows版
C:\sm-2017-w64-0-9\PRODUCTS\code_aster\bin\as_run.bat export
```

Linux版でSalome-MecaのAsterStudyが出現した以降のバージョンではas_runファイルがなくなりsalomeの起動バッチにオプションをつけて実行するようになった。

```shell:Linux版(AsterStudy出現以降)
/home/mmer547/salome_meca/appli_V2017/salome shell --as_run export
```
# GUIでの実装について

GUIではユーザーにコンフィグファイル内の実行パスを書き換えてもらうように丸投げして実装した。
これはHelyxOSを参考にした。
IBM CloudのSuspended Billing(サーバー停止時の課金の停止）を確認して見た

　一部の人のとっては、（私にとっても）待ちに待った機能が最近IBM Cloudの仮想サーバーに追加されました。タイトルにあるSuspended Billing(サーバー停止時の課金の停止）です。クラウドにあるサーバーのパワーをオフ（電源オフ）にすればその時間は課金されないというものです。他のクラウドサービスではあったのでIBM Cloudに追加されてよかったです。検証環境とかでいろんなサーバーにいろんなソフトなどを検証している人にとってはとてもウェルカムな機能かと思います。私もちょっと検証してはテンプレートイメージを作成してサーバーキャンセル、次に検証するときにイメージテンプレートからデプロイしたりしていたので今後たくさん使えそうです。
なおIBMからの発表はこちらです。
https://www.ibm.com/blogs/solutions/jp-ja/virtual-servers-suspended-billing/


とても便利な機能ですがいくつか気を付けておきたいポイントがありますが、上のページには書いていないのですが電源オフするときのポータルサイトですが、旧SoftLayerサイトでは電源オフにしても課金はされるようです。現状IBM Cloudのポータルは３つほどありますが

https://control.softlayer.com/ (旧Softlayerポータル）
https://console.bluemix.net/　　　　(旧Bluemixポータル）　　　Suspend Billing OK
https://cloud.ibm.com/　　　　　(最新の統合ポータル）   Suspend Billing OK
　下の２つで課金の停止を確かめられました。ちなみに個人的には　bluemix.netではサーバー作成時にサーバーの名前が自由に決められなかったりするので cloud.ibm.comの方がいいと思ってます。

それと
-電源オフは上記ポータルから行う。
-ストレージはサーバーを電源オフにしても課金され続ける

という点も気をつけてください。

さて確認方法ですが以下のようにやりました。
まずポータルサイトで仮想サーバーをオーダーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/7173ada0-56b6-cc17-6f13-785ace78e9f3.png)

サーバーがデプロイされたらメニューから管理--> 請求および使用量を選んでください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/1e4e1b0e-a9fb-3855-99ab-6b3319177a35.png)

そこで　Billing Itemを選んでください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/e6b62053-8767-fa6b-776b-ff10641f7fb2.png)

今デプロイしたサーバーの料金が出てきます。この料金は今デプロイしたサーバーを次の締め日まで使った時の料金です。この時点で残り１７日ぐらいだったのですが上のサーバーの時間料金を１７日分するとこれぐらいになります。次にこのサーバーの電源をオフにしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/12c268d0-6ade-b219-2dc4-8ded7aa2197e.png)

もう一度Billing Item をみてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/98558b01-4ebc-39e8-3442-7ff3c6a32ffe.png)

料金が下がりましたね。
しかしオーダーしたサーバーは１時間４.５円、でも出てる料金は全然大きいですね。改めてウェブサイトの条件を見ると。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/59741/4019ce37-2192-5652-79b8-ae5bba901e50.png)

そうですストレージの料金はサーバーを電源オフしても課金されるのですね。
では上記条件に気をつけて使ってみてください。
Qiitaに投稿して良かったな、と思ったこと

#はじめに

　今回、自社のカレンダーに参加していくつかの記事を投稿したのですが、たった数回の投稿にも関わらず、勉強させていただいたことが沢山ありました。本記事では、担当分の投稿が一通り終わって~~燃え尽きた~~落ち着いた私が、この２週間Qiitaに投稿して良かったこと、今後の投稿について考えていることを書いていきます。

#自分の書いたコードにコメントがもらえたぞ！

　これは本当に感謝していることです。実はいくつか前の記事で、自分の書いたプログラムにバグが潜んでいることに気付かず投稿してしまったのですが、そのバグの内容をコメントで分かりやすく教えてくれた方がいらっしゃいました。そのコメントがなければ、私はいつまでもバグが残っていることに気づくことができず、どや顔で記事を晒し続けたに違いありません。また、私が書いたプログラムの中で、もっと分かりやすく簡潔に書く方法をコメントしてくれた方もいらっしゃいました。教えていただいた内容は早速プログラムに活かすことができたため、同じ内容を本で読むよりもずっと理解が深まりました。

　私がJavaの概念（クラス、カプセル化、継承など）についての考え方を書いたときも、コメントでフォローしてくれた方がいらっしゃいました。おかげ様で、記事の内容とは別にインタフェースの考え方についても勉強することができました。解説書を読んでも何が何だか良く分からなかった概念が、私の言葉（記事）に合わせる形でご説明いただけたので、非常に理解しやすかったです。

　要は、Qiitaに投稿したことにより、__諸先輩方がコメントで色々と教えてくれたり、自分の書いたコードを添削してもらえたりした__、ということなのですね。これって、冷静に考えるとすごいことだと思うんです。たとえば、現場の先輩や上司に「ちょっとプログラムを書いてみたんですけど、添削していただけますか」なんて言えないじゃないですか。そんな暇があったら仕事しろ、で一蹴されて終わりですよ（試したことがないので、実際どうなるかは分かりませんが）。

　と言うことで、昔に書いたプログラムがＰＣに眠っているような方は、騙されたと思って投稿してみませんか？ひょっとしたら、今まで良く理解していなかったことを教えてもらえたり、詰まっていたところに突破口を開いてもらえたりするかも知れませんよ！

#あえて失敗を残し、成長記録をつくるぞ！

　我々が何かプログラムを書こうとするとき、大抵は試行錯誤の繰り返しになると思います。初心者なら、なおさらです。ある方法を試したけど上手くいかなくて、次に別の方法を試したら、前よりは良い結果になったけど別の問題も出てきて…………みたいな感じです。で、どうしても行き詰まったら、誰かに相談したり解説書で答を探したりする訳ですが、その答だけでなく、試行錯誤の過程も勉強になると思うんですね。

　ですから私は、__自分がどのように考えてプログラミングしたか__を、できるだけ記事に書くようにしています。そして、自分が書いたコードや文章は、できるだけ__投稿時の内容のまま__残しています。もちろん、内容に誤りがあった場合は読者を混乱させないよう訂正しますが、文章を別のものと入れ替えることは避け、できるだけ追記の形をとるつもりです。こうすることにより、自分にとってはかつての失敗とその解決法をまとめた記録となって、読者にとっては「こんなミスをしないようにしましょう」という反面教師的な記録となっていければ、Qiitaに投稿した意義があるのかな、と考えています。

#新しく勉強したことを、１つの記事に１つ以上！

　今回、カレンダーの投稿日に合わせて記事を書いていたため、正直大分疲れました（もちろん、それ以上に楽しかったですが）。今後は、ややペースを落としつつも投稿を続けていきます。毎回同じような内容だと投稿する意義が薄れると思うので、記事を投稿するときは__自分が勉強した知識を１つ以上入れる__つもりです。たとえば、今までに投稿した記事だと三角関数の利用、カプセル化、継承などですね。そして今後は、インタフェースやサーバの利用など、より難しい内容をどんどん勉強し、記事に反映させていけたらと考えています。ただし、あまりそのルールに縛られすぎて勉強に時間をかけるあまり、記事の投稿頻度が低くなりすぎると本末転倒なので、ほどほどに頑張っていきたいです。

　以上、これまでの記事にコメントで色々教えてくださった方への感謝と、今後の投稿についての所信表明みたいなものを書いてみました。まだまだ修行中の身ではございますが、今後とも何卒よろしくお願いいたします。

　ここまでお読みいただき、誠にありがとうございました。
Visual Studio CodeのF12の「定義は見つかりません」をJSDocで解決

# 問題

Visual Studio Codeでjavascriptのプログラムを見ている時にF12(定義へ移動)を押すと、定義元へ移動する。

しかし、下の`c1.method1()`でF12を押したら、「'method1'の定義は見つかりません」と表示されて移動しなかった。

![q1.png](https://qiita-image-store.s3.amazonaws.com/0/311399/c338f68b-270a-db69-025f-d8c248bd0299.png)


# 原因

`Class1`の`constructor()`の`c2.method2()`でF12を押したら、定義元へ移動する。`const c2=new Class2`を見て、c2の型が`Class2`だと分かっているから。

`c1.method1()`で移動しないのはc1の型が分からないから。

# 解決策

JSDocのコメントを挿入して、c1の型が`Class1`だと示したらF12で移動するようになった。
拡張機能のDocument Thisを使えば、コメントのテンプレートを自動生成して`Class1`と書くだけで簡単。

![q2.png](https://qiita-image-store.s3.amazonaws.com/0/311399/b4ea7848-c3a5-28a2-c141-1b1c0d1ac7af.png)

JSDocでコメントをがしがし書いてみよう。
Node.jsでmysqlに接続

#はじめに
このページは、谷ゼミ Advent Calender 2018 の18日目の投稿です。

vagrantとVirtualBoxを使って仮想環境を構築しており、
そこに作ったMySQLのデータベースに接続するためにNode.jsを使って接続を試みたのでその備忘録を記録しておきます。
ローカル端末がMacなのでそこから仮想環境のデータベースに接続する。

#目次
1 Node.jsとは？
2 構築してある仮想環境について
3 Node.jsを使う準備
4 MySQLに接続
5 終わりに

#Node.jsとは？
Node.jsはサーバサイドで動くJavaScriptである。

ここでJavaScriptは知っているけどNode.jsは知らない人は疑問に思うかもしれない。JavaScriptはブラウザ上で動くために開発されたプログラミング言語なので、サーバサイドで動かすイメージはないかもしれない。

実は、JavaScriptはPHPやJavaなどと同じようにサーバサイドでも動かせる。
サーバサイドJavaScriptと呼ばれるが、それがNode.jsである。

注意しておくが、サーバサイドでも動かせるがPHPなどとはまったく違うので一緒のものというわけではない。

#構築してある仮想環境について
既にvagrantとVirtualBoxで仮想環境を構築しているので今回はそれを使っていく。
仮想環境の構築の仕方、詳しい設定方法などは機会があればまた記事にしたいと思います。

######構築した環境
VirtualBox : 5.2.18
OS : Ubuntu 18.04 LTS
Webserver : Apache2.4.29
PHP : 7.2.10
MySQL : 5.7.24

#Node.jsを使う準備
######nvmとは
nvmとはnode version managerの略で、そのままnodeのバージョン管理(切り替え)を簡単に行うことができる。

gitをインストールしてなかったらインストールする

```
$ brew install git
```

nvmをインストール

```
$ git clone https://github.com/creationix/nvm.git ~/.nvm
```

パスを通す

```
$ source ~/.nvm/nvm.sh
```

nvmのバージョンを確認

```
$ nvm --version
0.33.11
```

インストールできるバージョンを確認

```
$ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
          ...
        v11.1.0
        v11.2.0
        v11.3.0
        v11.4.0
```

インストールする

```
$nvm install v11.0.0
```

バージョン確認


```
$ node -v
v11.0.0
```


.bash_profileにコードを追加

```
if [[-s ~./nvm/nvm.sh]];
then source ~/.nvm/nvm.sh
fi
```

#MySQLに接続
node-mysqlをインストール

```
$ npm install mysql
```

sample.jsを作成
IPアドレス,ユーザー名,パスワード,ポート番号,データベース名,テーブル名は自分が利用したいものを書いてください。

```javascript:sample.js
'use strict';

let mysql = require('mysql');
let connection = mysql.createConnection({
  host : 'IPアドレス',
  user : 'ユーザー名',
  password : 'パスワード',
  port : ポート番号,
  database: 'データベース名'
});

connection.connect();

connection.query('SELECT * from テーブル名 LIMIT 2;', (err, rows, fields) => {
  if (err) throw err;

  console.log(rows);
});

connection.end();
```

対象のSQLサーバーでユーザーにアクセス権限付与しておく必要などもあります。
今回はその設定などは仮想環境構築と同じく省略します。機会があれば・・・。



ということでsample.jsを実際に実行すると

```
$ node sample.js
[ RowDataPacket { id: 1, name: 'テストグラノーラ1', price: 200 },
  RowDataPacket { id: 2, name: 'テストグラノーラ2', price: 300 } ]
```

となり、Macのターミナルから実行することで仮想環境のデータベースに接続し、表示させることができました。

#終わりに
今回はNode.jsでmysql接続を行いました。
Node.jsについての勉強し始めたばかりなので不備などあったら申し訳ありません。これをもとにさらに勉強していきたいと思います。

はじめての投稿でもあるので、お手柔らかにお願いします。

#参考サイト
[初心者向け！3分で理解するNode.jsとは何か?](https://eng-entrance.com/what-is-nodejs)
[Node.js導入->MySQLへ接続](https://qiita.com/manjiroukeigo/items/fc4d036b432e15cefaa5)
OpenFOAMチートシート

OpenFOAMのチートシートというとSourceFluxのやつ（ http://sourceflux.de/blog/openfoam-cheat-sheet ）があるが、個人的にも作ってみた。

![OpenFOAMチートシート2018.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/0674a655-ddfd-ee97-2438-3f896b67a6d2.jpeg)

よく使うやつで言うとpostProcess関係はド忘れするときがあるので、こうやってメモにしておくとすぐ見れてよさそう。

皆さんも自分のチートシートを作ってみたらいかがだろうか。
C11 の _Generic の罠

C言語アドベントカレンダー の 12/18 が空いていたので、あわてて小さな記事を書いてみた。

正直いって、仕事で C11 を使ったことはないし、趣味で書くことも殆どない。
でも、`_Generic` は面白そうだと思っていたので軽く調べてみたら、罠に気づいたので記しておく。

まずはソースコード。

```c:c11
#include <stdio.h>

static inline void
show_int( int x ){  printf( "int: %d\n", x );  }

static inline void
show_str( char const * x ){  printf( "str: %s\n", x );  }

static inline void
show_char( char x ){  printf( "char: %c\n", x );  }

static inline void
show_bool( _Bool x ){  printf( "bool: %s\n", (x ? "true" : "false" ));  }

#define show(X) _Generic((X), \
  int: show_int, \
  char *: show_str, \
  char: show_char )(X)

int main(){
  show( 123 ); //=> int: 123
  show( "foo" ); //=> str: foo (合法？)
  show( 'X' ); //=> int:88 ( 'X' は、char ではなくて int )
  show(  "X"[0] ); //=> char: X ( "X"[0] なら char になる )
  show( 0==0 ); //=> int: 1 ( 0==0 は、_Bool ではなくて int )
  enum{ hoge = 456 };
  show( hoge ); // int: 456 ( 意外と int になる。合法？ )
  struct S{ int i:2; char ch:7 };
  struct S s={1,33};
  show( s.i ); // clang だと「int: 1」。gcc-8 だとエラー
  show( s.ch ); // clang だと「char: !」。gcc-8 だとエラー
  return 0;
}
```

確認は、clang と gcc で行った。バージョンは下表の通り：

|コンパイラ|バージョン|
|:--|:--|
|clang|Apple LLVM version 10.0.0 (clang-1000.11.45.5)|
|gcc|gcc-8 (Homebrew GCC 8.2.0) 8.2.0|

いずれも macOS Mojave 上。

# 文字列

`"foo"` は `char *` ではなく `char[4]` だと思うんだけど、`char *` を選択してくれる。便利だとは思うけど、正しいのかどうかはよくわからない。

詳しくは [コメント]( https://qiita.com/Nabetani/items/b37bc91ef2285f2f08d2#comment-2654a3922f6b9e234a16 )参照。

# 文字

`'X'` は、C言語では `char` ではなく、`int` である。だから `show('X')` は `show_int` を選ぶ。`show_char` にするためには `show((char)'X')` などとする必要がある。

# 比較演算

比較演算の結果は `_Bool` ではなく、`int` になる。だから、`show(0==0)` は、`show_int` を選ぶ。`show_bool` にするためには `show((_Bool)(0==0))` などとする必要がある。

# enum

`enum{ hoge=456 };` の `hoge` を渡すと意外とエラーにならず、 `show_int` が選択される。合法なのかなぁ。

# ビットフィールド

ビットフィールドを渡したときの動作は clang と gcc-8 で異なっている。

clang は `int i:2` で定義されているものは `int` に。 `char ch:7` で定義されているものは `char` に割り振られる。正しそうな感じ。

gcc-8 の場合、`show( s.i )` の行は

```text
'_Generic' selector of type 'signed char:2' is not compatible with any association
```
というエラーに。
`show( s.ch )` の行は

```
'_Generic' selector of type 'signed char:7' is not compatible with any association
```

というエラーになる。
両方とも、いやそんな型書いてないよ、という気分になる。あんまり正しそうな気がしない。clang の勝ちかなぁ。

# そんなわけで

そんなわけで、もう時間もないのでこんなところで。

`_Generic` は割と楽しそうだと思うけど、型に無頓着な言語仕様との相性が微妙に悪くて心配な感じ。二項変換との組み合わせとか、16進数が `int` になるのか `unsigned int` になるのかとか、難しいよね。

多重 `_Generic` とかをキメてへんなライブラリを作りたいような気もするけど、そもそも C11 を書く機会がないんだよなぁ。
Logic AppsワークフローTips集

Logic Appsワークフローを作るとき、ここの動的コンテンツ何指定したっけ？と忘れることが多々あるので、作ったワークフローを書き溜めていきます。
随時更新していきたいと思います。

# SharePointにファイルが作成されたら、Blobストレージにコピーして、元のファイルを削除する

## 全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c8e57da5-6c78-aa55-6175-96216758aee3.png)

## トリガー

* フォルダー内にファイルが作成されたとき  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c31877c7-3245-c6a5-e37d-b18a43d398b9.png)

## アクション

* BLOBの作成  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/be94d1e0-d17e-d0e0-c6e1-eef73d52a64c.png)

* ファイルの削除  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/af94112a-fcb8-7293-3b2e-f9b663145a54.png)

# SharePointのフォルダーを定期的にチェックし、ファイルがあればBlobストレージにコピーして、元のファイルを削除する

## 全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c4caf230-05fb-338d-682b-cb1117dee59c.png)

## トリガー

* スケジュール実行  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d13815cd-55a8-b918-7ef3-c55234111995.png)

## アクション

* フォルダの一覧取得  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b5eeb760-6161-aa23-fe48-5d0b2228ae21.png)

* パスによるファイルコンテンツの取得(フォルダ内の全ファイル分繰り返す)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/25f22e54-2bb2-fd8e-eaf4-de9e6c35cf35.png)

* BLOBの作成(フォルダ内の全ファイル分繰り返す)  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/192d7883-98b1-209b-1648-23688961521a.png)

* ファイルの削除(フォルダ内の全ファイル分繰り返す)  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/27e73e49-e31a-634d-02d4-6ed7cdbcf6b8.png)

# O365 Outlookにメールが届いたら、添付ファイルをBlobストレージにコピーして、メールを返信する

## 全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/34583a58-4f34-1d00-85ad-43799a9fb8da.png)

## トリガー

* 新しいメールが届いたとき(詳細オプションで条件指定する)  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/569ba4a7-fde1-bc19-ae37-813e8a774c81.png)

## アクション

* BLOBの作成
    * BLOB名：[添付ファイル 名前]
    * BLOBコンテンツ：[添付ファイル コンテンツ]  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/78a449af-4113-558f-d3ff-7bc403a1c9af.png)

* メールを返信する  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0d6d1dee-8c6d-cd0f-b4bf-756e266c392b.png)

# BLOBにファイルが作成されたら、SharePointにコピーする

## 全体像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/04ea37c4-223e-7625-a6a8-df4dfce6a10c.png)

## トリガー  

* BLOBが追加または変更されたとき  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ed84d466-7ba4-1d14-5085-3f125fe4d789.png)

## アクション

* BLOBコンテンツの取得
    * BLOB：[ファイルの一覧 パス]  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e40d6159-42fb-c10b-5b93-e3c550b4136a.png)

* ファイルの作成  
    * ファイル名：[ファイルの一覧 Name]
    * ファイルコンテンツ：[ファイルコンテンツ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0ac964d8-a9c5-7fa2-db14-290851a4ad22.png)
消しました。Processingでフラッピーバードをつくろう！(もくじ)

<!--
## この記事について
この記事はプログラミング初心者のための記事です。
変数と基本的な構文を理解するために、フラッピーバードを作ります。

随時公開していきます。

### 更新記録
2019.3.23 スコア機能、リトライ機能をアップしました。

## もくじ
 1. [プレイヤーをつくる](https://qiita.com/nandemoiiyo/items/4bbf3ba979673e8cca02)
  1. 画面をつくる 
  2. 四角形を表示する
  3. 四角形に重力を与える
  4. クリックしたら四角形に浮力を与える
 2. [下の土管をつくる](https://qiita.com/nandemoiiyo/items/0c85c080c6ee247214fc)
  1. 下の土管を表示する
  2. 下の土管を横に動かす
  3. 下の土管を繰り返し出現させる
  4. 出現するときに、土管の高さをランダムにする
 3. [プログラムを別々にする](https://qiita.com/nandemoiiyo/items/0821cfa289f0b0cbb789)
  1. プログラムを一緒にして動かす
  2. 役割ごとに関数でわける
 4. [プレイヤーと下の土管の衝突判定をする](https://qiita.com/nandemoiiyo/items/604bbfea553d3ea54450)
  1. 衝突判定の関数を用意する
  2. 衝突したらプレイヤーが赤くなるようにする
 5. [上の土管もつくる](https://qiita.com/nandemoiiyo/items/ebed57fbabf6513454bf)
  1. 上の土管を描く
  2. 上の土管と衝突したらプレイヤーが赤くなるようにする
 6. [ゲームオーバー処理を作る](https://qiita.com/nandemoiiyo/items/a719b0c1324d500edeef)
  1. 死亡フラグを用意する
  2. 土管に衝突したら死亡フラグを立てる
  3. 死亡フラグが立っていたらゲームをストップさせる
  4. 死亡フラグが立っていたらゲームオーバーの文字を表示させる
 7. [スコア機能をつくる](https://qiita.com/nandemoiiyo/items/f8e876787f1df420aacd)
    1. 難易度の調整をする
    2. スコア保存用の変数を用意する
    3. 土管が画面の端までいったらスコアを増やす
    4. スコアを前面に表示する
 8. [リトライ機能をつくる](https://qiita.com/nandemoiiyo/items/e797438444c1bccd8697)
  1. 初期化する関数を用意する
  2. スペースキーを押したら初期化する
  3. ゲームオーバーのときだけ初期化するようにする
 9. [タイトル画面をつくる](https://qiita.com/nandemoiiyo/items/5407aaf6c667397eb5f7)
  1. タイトルフラグを用意する
  2. タイトルフラグが立っていたらゲームを進行させないようにする
  3. タイトルフラグが立っていたらタイトルとなるテキストを表示する
  4. スペースキーでタイトルフラグをおろす
  5. ゲームオーバー時にタイトルフラグをたてる
 10. [最終回：いろいろ調整](https://qiita.com/nandemoiiyo/items/c11db6ca189c4794905b)
    1. 画面からはみ出した時はゲームオーバーにしよう
    2. 画像を使ってみよう
 
-->
開発を始める前に…「プログラミングは好きぷり？」

# はじめに🍕
この記事は、[プリッカソン Advent Calendar 2018](https://adventar.org/calendars/3172) 18日目の記事になります。

皆さんはプリパラをご存知ですか？
少女向けアイドルアニメと見せかけたカオスギャグアニメの皮を被った熱血王道アイドルアニメです！

プリパラ一話は[こちら](https://nico.ms/1405499565)になりますので、
観たことのない人は、ぜひ観てください。

第一話の中で、アイドルに憧れはあるが自分がライブなんて…とライブの誘いを拒む主人公らぁらに、先輩アイドルであるみれぃは問います。
**「プリパラは好きぷり？」**
「うん！」と即答するらぁらに対し、
**「じゃあ、大丈夫！」**
と、みれぃはアイドルに誘います。

😭🙏✨

プリパラの原点であり全てであると言っても過言ではない名セリフ、名シーンだと思います。

アイドルとなったらぁらは、この後もプリパラが好きだという気持ちを胸に無茶なことにも体当たりでぶつかっていき、解決していきます。


そんなプリパラから、僕は教わりました。

**好きだという気持ちが何よりも強いと。**

# 概要👩‍⚖️
前置きが長くなりましたが、この記事は日常の作業を始める前に、
「自分がプログラミングをするのは、**プログラミングが好きだから**だ」
ということを再認識することでモチベーションを高め、作業効率を高めることを目的としています！

方針としては、作業開始時に立ち上げる `iTerm2`上で、
起動時にユーザーに**「プログラミングは好きぷり？」**という問いを投げたいと思います。

※ iTerm2を使用する為、Macの方向けの記事となります。

# シェルスクリプトを実装 🦞
実際にユーザーに問いを投げかけ、回答を受け付ける為に、シェルスクリプトを書きます。

①文言表示
↓
②入力受付
↓
③入力に応じて
Y or y → 文言を表示、次の入力を受け付けた後、終了
Y以外 → ①にもどる
しかしていません。

``` bash
#!/bin/bash

while :
do
read -p "プログラミングは好きぷり？ (Y/n): " yn
if [[ $yn =~ [yY] ]] ; then
    echo "じゃあ、大丈夫！" ;
    read -p "Enter ↩ "
    exit
fi
done
```

# iTerm2の起動時にシェルスクリプトを実行する 🧸
こちらの素晴らしい記事を参考にさせていただきました。
[MacでiTerm2のArrangements使ったら便利過ぎた](https://www.inodev.jp/entry/2017/05/30/010546)

① 上記のシェルスクリプトを実行する `Profile` を作成
② ①の`Profile`と他の作業用のタブを開いた状態で `Arrangements` を保存（他のタブを用意していないと、シェルスクリプトの終了と同時にiTerm2が終了する）
③ ②の`Arrangements`を `Default`に設定
④ iTerm2の `Preferences` > `General`タブ > `Startup` を `Open Default Window Arrangement`に設定

# iTerm2を起動する 💃
```
プログラミングは好きぷり？ (Y/n): 
```

そう表示されれば、成功です！

`Y` と入力し、高らかにエンターキーをッターン！して作業を開始しましょう！

# ちょっと使ってみた感想🍲
数日軽く使っただけで、
- 3回目くらいから無意識に入力してしまう
- PCを落とさないでスリープのまま運用するので、iTermを起動するタイミングがない

という致命的な欠陥が発見されてしまいました。

とはいえ、バタバタしていると自分が好きでやっているという当たり前のことも見えなくなってしまうので、
この記事の方法ではお粗末ですが、日常の中で自分の気持ちを確認するというのは案外悪くないのかな、と思いました！

# おわりに 🏞
プリパラが好きすぎて、今まで尻込みしていたアドカレに突発的に参加してしまいました。
先にも書きましたが、**好きだという気持ちは強い**ですね。熱量を大事にしていきたいです。

やっつけ感満載の小ネタ記事ではありますが、興味を持っていただいてありがとうございました！
MySQLでクエリをキャンセル


`show processlist;`からの`KILL CONNECTION`


# 実際にやってみる
## 準備

```
$ docker run -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7.24
```

## クエリを流しておく

```
$ docker exec -it [container_id] /bin/bash
# mysql -h localhost -uroot -p
mysql> SELECT SLEEP(300);
```

## 別のコンソールから接続してキャンセル

```
$ docker exec -it [container_id] /bin/bash
# mysql -h localhost -uroot -p
mysql> show processlist;
+----+------+-----------+------+---------+------+------------+-------------------+
| Id | User | Host      | db   | Command | Time | State      | Info              |
+----+------+-----------+------+---------+------+------------+-------------------+
|  2 | root | localhost | NULL | Query   |    9 | User sleep | SELECT SLEEP(300) |
|  4 | root | localhost | NULL | Query   |    0 | starting   | show processlist  |
+----+------+-----------+------+---------+------+------------+-------------------+
2 rows in set (0.01 sec)

mysql>
mysql>
mysql> KILL CONNECTION 2;
Query OK, 0 rows affected (0.00 sec)
```

## KILLの意味とか

[13.7.6.4 KILL Syntax](https://dev.mysql.com/doc/refman/5.7/en/kill.html)
意外と知られていない便利なCSSプロパティ

こんにちは、[ちーず](https://twitter.com/cheez921)です。
OthloTechのアドベントカレンダーも、もう三年目ですね！
私は今のところ皆勤賞ですが、今年最後の参加になるので寂しいです。。。

今回は、意外と知られていない便利なCSSプロパティということで、
私が普段つかっているプロパティや、ブラウザ対応が追いついていないけど便利！今後に期待！なプロパティをばんばん紹介していこうと思います。

## 1.calc()
`calc()`は、プロパティ値を指定する時に単位が違うものでも計算を行うことができるプロパティです。

### 使い方
私がよく使うのは、レスポンシブサイトの横幅の調整で`px`が使いたい！って時に使います。
例えば、`100vw`に対して,サイド`10px`ずつ装飾したからその分を引きたいよーって時に使ったります。

```css

.element {
  width: calc(100% - 40px);
}
```

### ブラウザ対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/142322/f5fb7a9f-ed71-c6e8-d79e-52c867367990.png">

あとOpera Miniだけだ。頑張ってくれ...(切実)


## 2.object-fit / object-position
画像をトリミングすることができるプロパティです。

### 使い方
たった1行`object-fit: cover;`を追加することで、画像の`width`を指定しても画像がびよーんと伸びず、画像のサイズの縦横の小さい方を基準にして拡大・縮小されます。
また、`object-position`の初期値は`50% 50%`です。

```css
.img {
  width: 200px;
  height: 200px;
  object-fit: cover;
  object-position: 0 100%; /*トリミングする位置を指定する場合のみ*/
}
```

詳しくは下記のサイトを参考にしてください！
(参考: [1行追加でOK！CSSだけで画像をトリミングできる「object-fit」プロパティー](https://www.webcreatorbox.com/tech/object-fit))

### ブラウザ対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/142322/48c9b748-89fd-5ab9-f89e-8bb2c8682004.png">
90%以上対応していますが、相変わらずのIEさん...
IEに対応するにはスクリプトを少し書くことで対応することが可能です。
(参考: [IEやEdgeにもobject-fitを対応させる方法](https://01earth.jp/web-create/coding/ie-object-fit/))
`-o-`のプレフィックスを忘れずに使いましょう！

## 3.mask
オブジェクトの一部を隠すための処理のであるマスキングをすることができるプロパティ。

### 使い方

```html
<div class="element">
  <div><img src="image.jpg"></div>
</div>
```

```css
.element {
  mask-image: url(mask.png);
  mask-mode: alpha;
}
```
### ブラウザ対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/142322/b235c1ed-6624-0bd9-118f-16f03761e602.png">
部分的な普及はすすんでいますが、まだまだですね。
`-webkit-`のプレフィックスを忘れずに使いましょう！

## 4.font-feature-settings
OpenTypeフォントの拡張タイポグラフィの特性を制御するプロパティであり、文字詰め(約物の半角スペースを詰める)を設定をすることができます。

### 使い方
デザイナーからしたらこの文字の間隔が...DTPだったらできるのに...って思うことが多いですね。
そんな悩みが解決できます！

```css
text {
  font-feature-settings : "palt";
}
```

### ブラウザ対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/142322/9340b6a2-c964-c63c-9192-4f8932ab5524.png">
思った以上にすすんでました！嬉しい！
`-webkit-`をつけることをわすれずに！

## 5.scroll-behavior
スクロールが発生した時の振る舞いを指定するプロパティ。

### 使い方
今までjs(なんならjQuery)を使ってスムーススクロールを実装していたと思いますが、なんとCSSでできるようになりました！
しかもたった2行追加するだけで可能であるため、jQueryより簡単にかけます。

```html
<nav>
  <a href="#1">1</a>
  <a href="#2">2</a>
  <a href="#3">3</a>
</nav>

<div class="scroll-box">
  <section id="1">いちばん</section>
  <section id="2">にばん</section>
  <section id="3">さんばん</section>
</div>
```

```css
.scroll-box {
  overflow-y: scroll;
  scroll-behavior: smooth;
}
```

### ブラウザ対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/142322/c69bafaf-8f48-8ed4-7366-9df802ac656a.png">

これはまだ使えなさそうですね。
今後の対応に期待していきましょう！

## さいごに
かゆいところに手がとどくプロパティが増えてきているので、ブラウザさんが頑張って欲しいお気持ちでいっぱいになりますね。
CSSのプロパティはどんどん新しいものが登場するので、自分のしてみたいスタイルを言葉にして検索したら、意外と出てきたりしますのでおすすめです！

### 参考資料
* [Can I use](https://caniuse.com/)
Visual Studio CodeでPython3を使ってグラフを描くまで

# はじめに
最近、Python & 機械学習の勉強をしていまして、
こんなに簡単にグラフが書けるのか！と感動したので、
ここに手順をまとめておこうと思います
事実上のqiita初投稿。。。

# Python3をインストール
公式サイトからPython3をインストールします。
https://www.python.org/downloads/windows/
間違えてPython2をインストールしないようにしましょう（経験談）。

# numpyとmatplotlibをインストール
numpy　→　pythonでデータを効率的に操作するためのライブラリ
matplotlib →　pythonでグラフを簡単に書くライブラリ

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

```shell
pip install numpy
pip install matplotlib
```
pipはpythonのパッケージ管理ツールです。
（Node.jsでいうところのnpmという理解）

# Visual Studio Codeのインストール
Visual Studio Code →　最高のエディタ。バイバイAtom。
公式からインストールします。
https://code.visualstudio.com/

# Visual Studio CodeにPythonの拡張機能を追加
以下のPython拡張機能をインストールします。
https://marketplace.visualstudio.com/items?itemName=ms-python.python

ここまでできれば準備完了です!!

# グラフを書いてみる
例えば以下のコードで線形が描けます。

```python
# ライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np

# グラフとして描画するデータ
x = np.array([1,2,3,4])
y = np.array([2,3,4,5])

# グラフを描画
plt.plot(x, y)
plt.show()
```
こんなグラフが表示されるはず。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/240148/139bce28-e33a-07a7-cec5-a57ac9b1abdb.png)

さらに以下のコードで4を底とする指数関数が描けます

```python
# ライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np

# グラフとして描画するデータ
x = np.arange(0, 10, 0.1)
y = 4 ** x

# グラフのタイトル、軸ラベルを編集
plt.title("Exponential function to the base 4")
plt.xlabel("x")
plt.ylabel("y")

# グラフを描画
plt.plot(x, y, lineStyle="dashed") #破線のグラフを書く
plt.show()
```
こんなグラフが表示されれば成功です！
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/240148/8442da83-7c7e-34c5-e53c-ae3e1a06774c.png)

# おわりに
普段はAngularとか使ってWebアプリを作ってる人間なのですが、
こんなに簡単にグラフ描けるのに感動しました！
qiita初投稿ということもあり、間違った認識などございましたら、
ご指摘よろしくお願いいたします！
Goで今月の第4土曜日を計算する

PHPerだったので、これで済んでいた計算をGoに置き換えようとして、ぱっとライブラリが無さそうだったので真面目に実装した。

```php
<?php
echo date_create("fourth saturday of this month")->format("c");
```

使う素材は公式のtimeパッケージのみとする。

* https://godoc.org/time

## 考えたアルゴリズム

1. 今月の1日を取得する
2. 1日の曜日を調べて、土曜日までの日数を出す
3. 最初の土曜日を計算
4. 7日 * 3 = 21日うしろが第4土曜日のはず

```go
package main

import (
	"errors"
	"fmt"
	"time"
)

func main() {
	jst := time.FixedZone("Asia/Tokyo", 9*60*60)
	fmt.Println(NthSaturday(4, jst))
}

func NthSaturday(n int, loc *time.Location) (time.Time, error) {
	now := time.Now().In(loc)

	if n <= 0 || 4 < n {
		return now, errors.New("there is no 5th saturday.")
	}

	year, month, _ := now.Date()
	firstDay := time.Date(year, month, 1, 0, 0, 0, 0, loc)
	firstSaturday := int(time.Saturday-firstDay.Weekday()) + 1
	nthSaturday := firstSaturday + (n-1)*7

	return time.Date(year, month, nthSaturday, 0, 0, 0, 0, loc), nil
}
```

汎用化して、任意の曜日で計算できるようにすると、こんな感じかな。

```go
package main

import (
	"errors"
	"fmt"
	"time"
)

func main() {
	jst := time.FixedZone("Asia/Tokyo", 9*60*60)
	fmt.Println(NthWeekday(4, time.Monday, jst))
}

func NthWeekday(n int, wd time.Weekday, loc *time.Location) (time.Time, error) {
	now := time.Now().In(loc)

	if n <= 0 || 4 < n {
		return now, errors.New("there is no 5th weekday.")
	}

	year, month, _ := now.Date()
	firstDay := time.Date(year, month, 1, 0, 0, 0, 0, loc)
	first := int(wd-firstDay.Weekday()) + 1
	if first <= 0 {
		first += 7
	}
	nth := first + (n-1)*7

	return time.Date(year, month, nth, 0, 0, 0, 0, loc), nil
}
```

第5曜日を計算しようと思ったら、月によっては存在しない可能性があるので、エラーチェックがもう少し必要になる。
スクラムを始める前にふりかえろう



## はじめに
スクラムのセレモニーを始める前に考えてほしい事を出してみました
一応、SCM,SCDと認定資格はとりましたが、自分の経験から思う事をまとめてます。

## 現在のチームの問題を明確化しよう

現状のチームの課題を先に洗い出す事によって
スクラムを導入した時にどのように改善したいのかがはっきりなってくる。　　
またそもそもスクラムに拘らずとも別の対策で解決すると思われるので、改善策を考えてみます。
また部分的に導入する事でも改善に繋がっていきよりよいチームを作れると思ってます。

**スクラムを導入するが目的になってる**を防ぐ為にもぜひ、まずはチームの課題を探してみては？

## レトロスペクティブ(ふりかえり)とは

スクラムやXP, PDCAサイクルでもありますがふりかえり事が一番大事だと思ってます  

ふりかえりの単位は様々あっていいと思ってますが一例をあげます。

 - 作業単位(30分とか1時間30分)でのふりかえり
 - 一日
 - 一週間
 - 一ヶ月
 - 三ヶ月
 - 六ヶ月(半年)
 
単位はそれぞれでいいですし個人、チーム、部署、組織でどれかを使ってると思います。

私の会社の場合は下記がそれに当たると思ってます。
- 一日(チーム) チームはデイリースクラム
- 一週間(チーム)　レトロスペクティブに当たる
- 二週間 (部署) PMの面談
- 三ヶ月、六ヶ月 (部署、組織)　評価面談

個人単位では
- 一日
- 六ヶ月

### まずは自分をふりかえりましょう

いきなりスクラムガイドなどではデイリースクラム、レトロスペクティブとでてきて
そこで初めてふりかえりを経験する事になると思いますがそもそものふりかえりは
ある程度皆さんもやってると思います。  
朝会だったり夕会だったり評価面談もあると思います。
ここで大事なのはまずは他人が与えたフォーマットに乗っかるのではなく
自分をふりかえる事ができて初めてチームや組織もできる事だと思います。

## 私の個人的な日報兼ふりかえり用シート(例)

```
## やった事

### MTG
- 10:10 デイリースクラム
- 13:00 〜〜MTG

### タスク
- T-123 フロントバグ対応
- T-234 loggerの実装

## やる事

### MTG
- スプリントレビュー
- スプリントレトロスペクティブ
- スプリントプランニング

### タスク
- 18:00面談

### 学習(業務外)
nuxt.jsを触る

## 感想
テンション:2
タスク消化:0


## わかり・感想・困った事
5Waysで説明ができなかった。＝＞学ぶ事と教える事は別のスキル。  

### クイズ

ファシリテーションとは?
〇〇〇 => Goalへ

## 業務連絡

```

かなり増えてしまったがはじめは

```
## やった事

## やる事

## 困った事

## 業務連絡

```
この４つでした。

### やった事
デイリースクラム後やった事を書いてます。
MTGやタスクなどは前日のやる事と同じになりそうですが
これがまーよく変わるものです。

### やる事
次のデイリースクラムまでにやること
MTGやタスクなど予定
ここでは明日自分の能力でできる事だけに絞りましょう。
毎日プランニングして自分のプランニング能力を磨く事ができます。  
１日のプランニングすら満足にできないのに一週間や二週間なんて
難しい事はできないです。また妥協点も見つけられると思います。
やる事は絶対にやりきれる事を書いてほしい。やった事は増えてもいいです。
一日でできます！！って期待させて三日かかった結果より
一日これくらいしかできません。だけど、二日分できましたとなった方が
人間やる気がでますしまわりからも安心して仕事を任せられると思います。
どんどんできるようになってきたらやる事を多めにしていけばいいのです。


### 困った事
本日やっていて困った事や改善点などを考える項目です。
もちろん個人用なので対人関係や人に言えない悩みなども書いていいかも。

### 業務連絡
まー好きに使ってと思いますが自分はチームにこのシートで日報を回すようにしてたので
予定休などを書いてもらってました。

## 追加した項目について

### 学習(業務外)
業務外での自分のスキルを磨く事や関心事などを書いてました。  
月と火は定時で業務を終わらせて学習時間に当てるようにしていたので。

### 感想
テンションとタスク消化はデイリーでの達成度などを数値化できないかとした時の名残です
BOTでの集計をしてグラフでもしようかとしたけど今は放置中。
やはりタスク消化ができてる時が高い傾向になるとは思いますが
月曜日は毎回１になるなと思ってます。
ここではよく愚痴なども書いてます。

### クイズ
Learn Betterって本を読んで学習には質問を作ると効果的だと思い
できるだけ知った事を忘れないためにクイズを作って後でBOTで遊べるように
しようとした名残です。
いつかちゃんとBOTにも導入しておきたい。

## ふりかえりで大事なのは困った事！

これも私の視点ですが、大事な事は困ってる事だと思います。  
まずは感情ベースでいいと思いますし不満などを改善する事から初めて見るのは
どうでしょうか？
私自身が馬鹿なのもあり効果測定やKPI,ROIとかそういう事より感情の安定を
探してみるのが有効だと思います。
またチームをより良くしていこうとか高い理想より個人個人の不満を平均的に解決する
改善を見つけるものがよいとも思います。

↑の例であるように毎日明日やる事を自分の最良で決めてまずは個人の能力を高める
事をやった方が全体の生産性（やる気）に繋がると思うので。


## まとめ

私は会社主導でのスクラムには実は反対です。
そこから始まった瞬間からすでにトップダウン型になってると思います。
またこの時に、すでに会社命令でやらされてる状態で自立してるのでしょうか？

スクラムなどで求めてるのは、自立だと思います。
ボトムアップ型がその理想なら、まずは会社などはスクラムなどのフレームワークを
一律に導入するのではなくふりかえる事から始めるべきだと思ってます。
その時に課題を出し改善する。課題の解決方法に様々なアジャイルの手法などを
取り入れていけばいいのではないのでしょうか？

## 私がなりたいスクラムマスターとは
私はスクラムの役割としてのスクラムマスターはやりたくないです。
チームリーダーに近いです。
リーダーとしてメンバーの不満を改善していくサポート（メンバーの奴隷）が
自分の目指してる所です。
またチームが事業に対してROIを高める！！なども持ってないです。
チームでやっていくふりかえりではチームのメンバーがそれなりに納得する
妥協点を模索してものだと思います。
チーム全員が大満足なスクラムなんて・・・いつか作れたらいいですね。
【memo】python3 Tips

pythonプログラミング初心者が調べた個人的メモです。

・入力

```
input_word = input()
```
・出力

```
print(input,end="") ←改行されない
print(*input_list) ←リストの要素が空白有りで連続で1行で出力される
print(f'{output:02}') ←数値を2桁に0埋めして出力
```
・型変換

```
number = int(input_word) ←int型に変換
string = str(number) ←str型に変換
```
・数値操作

```
abs(number) ←絶対値
math.ceil(number) ←切り上げ
math.floor(number) ←切り捨て
```
・文字列の特定箇所を抽出

```
number = input_word[2:5] ←3文字目から5文字目
number = input_word[-2:] ←後ろから2文字
number = input_word[:-2] ←後ろから3文字まで
```
・文字列操作

```
len(input_word) ←文字数を出力
input_word.replace('a', 'b') ←置換
input_word.replace('a', 'b',3) ←置換(最大置換回数指定)
re.sub(r'[a-z]+', 'xxx', input_word) ←置換(正規表現)
re.sub(r'[a-z]+', 'xxx', input_word,3) ←置換(正規表現,最大置換回数指定)
input_word.translate(str.maketrans({'o': 'O', 't': 'T'})) ←長さ1の文字を複数置換
input_word.translate(str.maketrans('abcde', 'ABCDE')) ←置換
input_list = input_word.split(" ") ←空白区切りのリスト化
input_list = list(input_word) ←1文字ずつのリスト化
input_list = [input[i:i+1] for i in range(input_word)] ←上と同じ結果
```
・リスト

```
list = ["" for i in range(5)] ←5要素の空リスト作成
list = [""] * 5 ←上と同じ結果
list = [["" for i in range(5)] for j in range(5)] ←5×5要素の空リスト作成
input_list.append("new") ←要素追加
input_list.remove("new") ←要素削除
input_list.pop() ←最終要素を出力と削除
input_list.index("test") ←特定要素("test")のindex番号出力
max(input_list) ←最大値出力
len(input_list) ←リストの要素数出力
input_list.sort() ←ソート
input_list.sort(key=lambda x:x[0]) ←2次元リストの1要素目を昇順ソート
input_list.sort(key=lambda x:x[1], reverse=True) ←2次元リストの2要素目を降順ソート
input_list.sort(key=itemgetter(1)) ←2次元リストの1要素目を昇順ソート
list(set(input_list)) ←ユニーク化(元のリストの順序を保持しない)
list(dict.fromkeys(input_list)) ←ユニーク化(元のリストの順序を保持)
sorted(set(input_list), key=input_list.index) ←ユニーク化(元のリストの順序を保持)
input_list2 = input_list[:] ←1次元リストのコピー
input_list2 = [x[:] for x in input_list] ←2次元リストのコピー
list(itertools.combinations(input_list,5)) ←組み合わせのリスト出力
```
・辞書型

```
dict1 = {} ←空の辞書型作成
dict1["a"] = 1 ←要素追加
if "a" in dict1: ←要素存在確認
 del dict1["a"] ←要素削除
for value in dict1.values(): ←値の出力
 print(value)
for key,value in dict1.items(): ←キー、値の出力
 print(key,value)
```
・deque

```
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append ←右側に追加
queue.appendleft ←左側に追加
queue.insert(i,x) ←xをi+1番目に挿入
queue.pop() ←右側の要素を削除
queue.popleft() ←左側の値を削除
queue.value(x) ←最初のxを削除
queue.rotate(n) ←nステップ右にローテート
queue.rotate(-n) ←nステップ左にローテート
queue.count("Eric") ←引数と等しい値の個数を出力

```

・if文

```
if a == "a" and b != "b":
  文
elif c <= 1 or "test" not in input_list:
  文
elif re.search("te.t",input): ←正規表現"te.t"がinputに含まれるか
　文
else:
　文
```
・enumerate関数

```
for i, name in enumerate(input_list):
　print(i, name) ←リストのindexと値を出力
for i, name in enumerate(("a","b"),1):
　print(i, name) ←順番と値を出力、第2引数に1番目のindex番号を指定(デフォルトは0)
```

※参考
・組み合わせ
https://qiita.com/junkls/items/10384950963056cc8e08
・ソートHow to
https://docs.python.jp/3.5/howto/sorting.html
【TIPS】Raspberry PiのカメラをNode-REDから使う

Raspberry Piのカメラを、node-red-contrib-cameraを使って
Node-REDから写真を撮ってみます。


# 使用した機材
* Raspberry Pi3 Model B+
* Raspberry Pi Camera V2


# カメラの接続と有効化

Raspberry Piのカメラを接続します。
接続する端子を間違えないようにしてください。

![DSC_1891.jpg](https://qiita-image-store.s3.amazonaws.com/0/60109/ec58b6b8-f980-bd0e-ce76-7c4ccadf5307.jpeg)


Raspberry Piのカメラを有効にします。


![DSC_1883.jpg](https://qiita-image-store.s3.amazonaws.com/0/60109/fcd1b758-e6fb-a7e2-1419-48ff1f9dcc47.jpeg)

![DSC_1885.jpg](https://qiita-image-store.s3.amazonaws.com/0/60109/edcef078-95a1-d185-c88b-b0b41e1a1862.jpeg)

カメラの準備はこれでＯＫです。

# Node-REDの設定

Raspberry PiでNode-REDを起動します。

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/60109/4fdd6eb9-dc50-1b09-de66-a44884afc61b.png)

右上のメニューから「パレットの管理」を選択します。

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/60109/642c4c06-6ead-5157-d42a-d6622dea7348.png)

「ノードを追加」を選んで、「camerapi」と入力すると出てくるノードを追加します。

![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/60109/9456ebe2-cd03-eb77-f4e6-e1bbcd0a212d.png)

「take photo node」が追加されました！！

![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/60109/37f4da74-0576-fad6-8d65-0f9610f0ad9a.png)

今回は写真をとるだけなので、そのまま「inject」ノードと「debug」ノードを繋げました。
debugノードで出力される「msg.payload」は、写真が保存されたパスです。

![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/60109/79efa5cb-42bb-87ab-a828-32dc25e5275b.png)
コールグラフで始めるGoコードリーディング

おはようございます。@mnumaです。
[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake) 20日目の記事です。


[こちら](https://qiita.com/mnuma/items/109458d90ce9dbdde426)の記事でも触れさせて頂きましたが、株式会社マクアケではマイクロサービス化プロジェクトに伴い、バックエンドやツールに**Go言語**を採用することが増えています。というわけで今回もGoに関する記事を書きます。

## go-callvis

![](https://i.imgur.com/D8CSB5A.png)

[**go-callvisは**](https://github.com/TrueFurby/go-callvis)、Goで書かれたプログラムの[コールグラフ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B0%E3%83%A9%E3%83%95)を作成してくれるツールです。
コードレビューで誰かのコードを読む時や、複雑になってきたコードを把握したい時など、何か図形的な補助が欲しくなる事があります。


go-callvisは手軽にビジュアライズされたコールグラフを作成出来ます。今回は、このgo-callvisの使い方についてご紹介したいと思います。


## 使い方

go-callvisのリポジトリにちょうどいいサンプルがあるので、試しに実行してみましょう。
https://github.com/TrueFurby/go-callvis/tree/master/examples/main


中身はこんな感じです。

```console
$ cd $GOPATH/src/github.com/TrueFurby/go-callvis/examples/main
$ tree .

├── main.go
└── mypkg
    └── mypkg.go
```

`main`パッケージがある所で `go-callvis`コマンドを実行してみます。

```
$ go-callvis ./
```


![](https://i.imgur.com/M3xLRg1.png)


`-group`を使うと、パッケージや型でグループ化してくれます。

```
$ go-callvis  -group pkg,type ./
```

![](https://i.imgur.com/TY3Dtzh.png)

パッケージでグループ化すると、各パッケージにフォーカスした画面にジャンプすることも出来ます。

![](https://imgur.com/download/DFXVnKs)


標準ライブラリを除外したい場合は`-nostd`オプションを使います。また、`-nointer`で 非公開関数の除外になります。

```
$ go-callvis -nostd -nointer ./
```

Makefileから呼び出す場合は、こんな感じのタスクを用意しておくといいのかなと思います。

```make
PKGS = $(shell go list ./... | grep `go list`/ | xargs | tr ' ' ,)
go-callvis:
	go-callvis -focus "" -group pkg,type -limit "${PKGS}" `go list`
```


## 最後に

サンプルにはDockerの解析例も紹介されていました。
こういったコードも、俯瞰してみることでなんとなく設計を追うことが出来る気がします。

**Docker**
<img src="https://raw.githubusercontent.com/TrueFurby/go-callvis/master/images/docker.png" width="800px">

go-callvis複雑なコードの把握だけでなく、もちろん身近なプロジェクトの可視化にも利用する事が出来ます。
マクアケではGoを採用したプロジェクトが増えています。そういった中でプロジェクトを把握する方法の1つとしても使えるのではないかと思いました！

最後になりますが、株式会社マクアケでは一緒に働くメンバーを募集しております。💪
ご興味が有りましたらご連絡いただけると幸いです！💦
https://www.wantedly.com/projects/26807

[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake) 明日は @shiro-yamadaさんのマクアケ新オフィス紹介記事です。よろしくお願いします！