OmniAICreator/Qiita-1.07M huggingface dataset:
IAMの設定

AWSの通常作業(EC2の作成等）については、`root`での操作は好ましくありません。
そこで、IAMにて新規ユーザを作成します。

# IAMの設定
コンソール画面を開き`IAM`と入力して、サイトへ移動します。
![Screen Shot 2019-06-16 at 3.48.56 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/38350676-12de-4107-4ee9-5b982b4d4132.png)

左側の`Users`を選択します。
![Screen Shot 2019-06-16 at 3.52.32 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/b3961bfb-d023-aaff-00fa-4d2a0ce74b65.png)

`Add user`を選択し、下記を入力していきます。
`Programmatic access`と`AWS Management Console access`はチェックを入れておきます。
![Screen Shot 2019-06-16 at 3.56.20 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/4b33a21d-881e-9a16-5639-efdd490a3a4a.png)

権限については、`AdministratorAccess`を選択しておきます。他にもEC2にアクセスする権限のみ与える等の選択肢もありますが、今回は開発環境を作成するため上記の権限にしておきます。
![Screen Shot 2019-06-16 at 4.00.36 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/155727b9-c991-83f0-115d-36302bfc3051.png)

次ページの`tag`についてはあとからでも追加できますので、今回はパスします。
これで、作成は完了です。

# パスワードの設定
`Users`画面に戻ると、作成したユーザが列挙されています。
ログインする際に必要なパスワードを作成するため、`Console password`を選択します。（セキュリティ強化のため、MFA認証も追加することができます。）

![Screen Shot 2019-06-16 at 4.06.52 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/503bd317-23a0-a26a-2ba7-12536a8b4fd7.png)
任意のパスワードを指定します。
![Screen Shot 2019-06-16 at 4.15.50 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/df4a2b50-4f45-ba4c-2ce4-68e44f4da5f9.png)

今後は下記URLからIAMユーザとしてログインすることができます。
![Screen Shot 2019-06-16 at 4.21.33 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/54c5f00c-694b-c992-627b-73d907fcb306.png)
DockerがDocker Desktop is starting...から進まない

# はじめに
環境は以下です。

* MacBookPro 2018
* macOS Mojave 10.14.5
* Docker version 18.09.2, build 6247962

Dockerはbrew caskでインストールしたもの。
.appをクリックして起動してからしばらく経ってもDocker Desktop is runningにならなくて困ってた。
DockerHubのアカウント作ってサインインしてもダメだった。

# どうやって解消したか
preference開いてResetタブのReset to factory defaultsをクリック、restartをした。
以下を参考にしました。
[Developers.IO produced by Classmethod](https://dev.classmethod.jp/tool/docker/macos-sierra-docker-for-mac/)

# 終わりに
なぜなんでしょうね。
今後もとりあえず困ったら初期化したらなんとかなるんだろうか…
Java開発の基本~プログラムの書き方*演習1~

# Java開発の基本~プログラムの書き方*演習~

今までの知識を使って簡単な演習をしてみましょう。

### 必要な知識
* 変数と型
* 条件分岐
* フローチャート  
今までこのページに記載しきた内容だけでは不十分なので適宜ググりながらやってみてください。

### 問題1-1
フローチャートを参考にして「グーしか出さないじゃんけん」を実装して必ず自分が勝つプログラムを実装してください。
じゃんけんの勝ち負けの判定は[このページ](https://qiita.com/mpyw/items/3ffaac0f1b4a7713c869)を参考にしてください。
![じゃんけん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/730cee2b-a1d3-e716-d51d-616437d65326.png)

### 問題1-2
「グーしかださないじゃんけん」をチョキしか出さないじゃんけんに変更してください。  

### 問題1-3
「グーしか出さないじゃんけん」をグー以外も出す普通のじゃんけんに変更してください。  ただし、あいこの場合は繰り返さず「あいこ」を結果として出力してください。

### 問題1-4   
自分の手を外部から値を入力できるようにして、勝負のごとに結果を表示してください。勝つまで終われないじゃんけんプログラムを作成してください。また、勝つまでにかかった回数を最後に表示してください。

------

# 回答
### 問題1-1


```Janken.java
package janken;
public class Gudake {
	public static void main(String[] args) {
		//一回セットしたら変更しない変数は"final"をつけて定数かします。・・・①
		final int GUU=0;
		final int CHOKI=1;
		final int PA=2;
		//自分と敵の手をセット・・・②
		int myHand=PA;
		int enemyHand=CHOKI;
		//条件式
		//この条件式は分けた方がコード的に綺麗か・・・③
		if(((myHand-enemyHand)%3)==2) {
			System.out.println("あなたの勝ちです");
		}else {
			System.out.println("そんなはずはありません");
		}
	}
}
```


解説）
* プログラム全体について
フローチャートにもありますが、今回は勝ち負けのケースしか考えません。この辺常識にとらわれず仕様通りに実装してください。
* ①
グー、チョキ、パーにそれぞれ数字を当てはめます。当てはめなくてもプログラムは動きますが他の人が読んだ時にそれぞれの数字が何を指しているか分からなくなります。意味はあるけど何を指しているか分からない数字は<font color="red">マジックナンバー</font>と言い、この書き方をすると後生文句を言われ続けます。
今回のグー、チョキ、パーの値はそれぞれ変更することはないので型の前に`final`をつけて<b>定数</b>化しましょう。
定数化すると、値を書き換えられなくなります。試しに書き換えてみてください。
定数は変数と異なり、<b>全て大文字</b>で書く決まりです。
* ②
自分の手と敵の手をセットします。変数はラクダ文字（ラクダの背中みたいに大文字小文字を混ぜる）で書きましょう。
今回はソースコードにベタ書きでいいです。

* ③
条件判定をします。if分の中で値を計算していますが、基本的に直接計算式を条件式の中に入れるのはよくないです・・・
ただ、今回は分岐が一回しかない、かつ使い捨てのサンプルコードなので。。。

### 問題1-2

1-1の`enemyHand=GU`を`enemyHand=CHOKI`に変更するだけです。
もし、グー、チョキ、パーを定数化していなかったらどの数がそれぞれどの手に対応するか忘れる終了ですが、今回のように定数化しているとプログラムの修正も容易になります。

### 問題1-3
```Janken.java
package janken;
import java.util.Random;
public class Janken {
	public static void main(String args[]) {
		final int GUU=0;
		final int CHOKI=1;
		final int PA=2;
		int myHand=CHOKI;
		//相手の手をランダムに設定します。・・・①
        Random roundom = new Random(2);
		int enemyHand=roundom.nextInt(3);
		//ifで書く場合・・・②
		//勝敗条件をあらかじめ計算する・・・③
		int winningResult=((myHand-enemyHand)%3);
		if(winningResult==0){
			System.out.println("アイコです");
		}else if (winningResult==1) {
			System.out.println("負けです");
		}else {
			System.out.println("勝ちです");
		}
		//swichで書く場・・・④
		switch((myHand-enemyHand)%3){
			case 0:
				System.out.println("アイコです");
				break;
			case 1:
				System.out.println("負けです");
				break;
			case 2:
				System.out.println("勝ちです");
				break;
		}
	}
}
```
* このプログラムについて
普通のじゃんけんですがあいこの場合に繰り返さないことに注意しましょう。
勝ち、負け、あいこがあり判定には3パターンります。

* ①
ランダムな数を生成する時には`Random roundom = new Random(2);`を使いました。`java ランダム`などで計算するとサンプルプログラムがたくさん出てくるので参考にしましょう。javaにはこのようにやりたいことを一行で実現してくれるパーツがたくさんあるので、適宜検索して使いましょう。
* ②
勝ち、負け、あいこの3パターンの分岐がありますが、javaはyes no問題しか答えられません。yes no問題で3パターン網羅できるようにフローを考えましょう。
* ③
3パターンの分岐をするため、複数回条件判定をしています。別にif分の中に判定式を書いてもいいのですが、もし判定式が誤っている場合修正箇所が増えてしまいます。
プログラムにバグが発生することも考慮して判定式は外に切り出しましょう。
* ④
今回の場合はifを使うよりもswitchを使って書いた方がスッキリするかもしれません。一応switchで分岐させる場合も記載しておきます。

### 問題1-4
フローチャートから書く必要ありそうで、ちょっと大変なので要望あれば追記します。。。
Goで接尾辞配列を用いた記事検索を実装する

Goの標準ライブラリには珍しいことに接尾辞配列([index/suffixarray](https://xn--go-hh0g6u.com/pkg/index/suffixarray/))があります。

これを使って，O(log(n))時間での記事検索を実装してみます。

まず，記事を文字列とします。
接尾辞配列のインデックスを作りますが，
[suffixarray.New](https://xn--go-hh0g6u.com/pkg/index/suffixarray/#New) の引数は []byte なので，
すべての記事をひとつのバイト列にしなければなりません。
記事ごとの間にdelimを入れ，記事を区別できるようにします。
これは，sentinel valueでよく，ここでは，utf8.MaxRuneとしましょう。

```go
const delim = utf8.MaxRune
```

記事 + delim + 記事 + delim + ...
として，一つのバイト列を作ります。
ここで，このバイト列の何番目から記事が入るかを保存するために，Indice []intをつくっておきます。
記事全体と接尾辞配列を納めた型を定義し，インデックス作成メソッドを作ります。

```go
type ArticleIndex struct {
	Articles []string           // 複数記事
	Indice   []int              // バイト列中で，何番目のバイトから記事が始まっているか
	SAIndex  *suffixarray.Index // 接尾辞配列
}

func (ai *ArticleIndex) MakeIndex() {
	var buf bytes.Buffer
	buf.WriteRune(delim)
	for _, t := range ai.Articles {
		buf.WriteString(t)
		buf.WriteRune(delim)
		ai.Indice = append(ai.Indice, buf.Len())
	}
	ai.SAIndex = suffixarray.New(buf.Bytes())
}
```

これで，インデックスを作成できました。
次に，検索部分を作りましょう。最大 n 記事，s を含む記事の記事番号を返します。

```go
func (ai *ArticleIndex) Lookup(s []byte, n int) []int {
	var ret []int
	result := ai.SAIndex.Lookup(s, n)
	for _, x := range result {
		i := sort.SearchInts(ai.Indice, x)
		if i が ret 中になければ {
			ret = append(ret, i)
		}
	}
	return ret
}
```

ここで，Indice に対して [sort.SearchInts](https://go言語.com/pkg/sort/#SearchInts) を使って，接尾辞配列の Lookup の返り値が含まれる記事番号を取得しています。
シンボリックリンクのメモ

# シンボリックリンクのメモ
シンボリックリンクはファイルAへのアクセスをファイルBへのアクセスとしてみなすようにすること

# シンボリックリンクの設定方法
```
$ ln -s -i /home/www/app/public/index.php  ~/home/www
```
~/home/wwwへアクセスした時に、/home/www/app/public/index.phpへアクセスしたとみなす場合のコマンドです。

# シンボリックリンクの確認方法

どれがどれにシンボリックリンクが貼ってあるかを見るには、該当のディレクトリに対してlsコマンドを行うことで確認できます。

```
$ ls -l
```
2変数のニュートン法の実装

うまくいかなかったコード。
自分で見直すように残しておく。


>>> class MultiNewton(object):
...     def __init__(self,f,dx0f,dx1f,grad_f,hesse):
...             self.f=f
...             self.dx0f=dx0f
...             self.dx1f=dx1f
...             self.grad_f=grad_f
...             self.hesse=hesse
...     def _compute_dx(self,bar_x):
...             grad=self.grad_f(bar_x)
...             hesse=self.hesse(bar_x)
...             dx=np.linalg.solve(hesse,-grad)
...             return dx
...     def solve(self,init_x,n_iter,tol,step_width):
...             bar_x=init_x
...             for i in range(n_iter):
...                     dx=self._compute_dx(bar_x)
...                     x=bar_x+dx*step_width
...                     bar_x=x
...                     norm_dx=np.linalg.norm(dx)
...                     if norm_dx<tol:
...                             break
...             return x
... 
>>> multinewton=MultiNewton(f=f,dx0f=dx0f,dx1f=dx1f,grad_f=grad_f,hesse=hesse)
>>> multinewton.solve(init_x=np.array([10.0,8.0]),n_iter=100,tol=0.01,step_width=1.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 16, in solve
  File "<stdin>", line 11, in _compute_dx
TypeError: bad operand type for unary -: 'function'
Qiitaアカウント登録方法

#はじめに

全くの未経験からIT業界に転職して約3年。
業務では主にCisco製品を中心としたネットワークの構築・運用を経験してきました。
自身のキャリアアップのために自主学習に取り組む中で、Qiitaをご利用の皆様に大変お世話になっています。

引き続き自己研鑽を積んでいこうという中で、Qiitaのアカウント登録に踏み切りました。
その主な理由は以下の3点です。

**1.情報のインプット**
　記事の検索だけならアカウントがなくてもできますが、
　アカウント登録をすることで"タグ"や"ストック"の機能を使うことができ、
　より効率的な情報のインプットができる。
**2.情報の整理**
　自分で学習したことを記事としてまとめることで、情報を自分なりに理解することができ、
　後から見返すこともできる。
**3.情報のアウトプット**
　情報をアウトプットすることで自分と同じ状況の人の手助けとなれる。
　~~（あわよくば間違いの指摘やアドバイスをもらえる）~~

ということで、Qiitaのアカウントを登録をしましたので、記事の投稿の練習も兼ねてQiitaのアカウント登録方法をまとめます。

#Qiitaアカウントの登録方法

まず、[Qiita](https://qiita.com/)のTopページへアクセスします。
画面右上に**"ユーザー登録"**ボタンがありますのでこちらをクリックします。

ユーザ登録画面が表示され、以下より登録方法を選択します。

- GitHubアカウントで登録(連携)
- Twitterアカウントで登録(連携)
- Googleアカウントで登録(連携)
- Qiita用アカウントを作成して登録

ご自身の希望する方法を選択し、画面案内に従って登録を進めてください。
私はGitHubのアカウント連携で登録しました。


ちなみにGitHubとはWeb上で利用出来るソフトウェア開発プロジェクト向けのソースコード管理サービスです。
私はこれまでGitHubを使ったことはなく、ソフトウェアのプログラミング知識も全くないのですが、これからクラウドの知識を身に着けていくうえで必要になりそうだったので、このタイミングでGitHubも登録しました。
登録は[GitHub](https://github.co.jp/)のTopページから行えます。

#タグの登録
自身が関心のあるワードをタグとして登録することができます。
タグを登録すると、自身のQiitaページの**"タグフィード"**に、
登録したタグがつけられた記事が投稿されると逐次表示されるようになります。

タグは画面最下部の**"[タグ](https://qiita.com/tags)"**をクリックすると一覧表示されます。
登録したいタグをクリックして、表示された画面の**"フォロー"**をクリックすると登録できます。
上記の一覧表示だと数が多いので、画面上部の**"キーワードを入力"**の検索ボックスで、興味のあるワードを検索すると、画面右に**"関連タグ"**が表示されますので、こちらからでも登録できます。

#ストック
自身が気になった記事をストックとして保存することができます。
ストックしたい記事の最後にある**"ストック"**ボタンをクリックして登録します。
ストックした記事は画面右上の**"ストック一覧"**から確認可能です。


#おわりに
とりあえず練習がてら簡単にまとめてみました。
アカウント登録したばかりなのでいろいろ試してみながら、何かあれば更新していこうかと思います。
VisualStudioCodeでオープンソースライブラリを参照する

NuGetで取ってきたオープンソースライブラリのNPOIをVisualStudioCodeで参照させる方法があまり無かったので備忘録として記述。

## 方法
ItemGroupを記述

```[アプリ名].csproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NPOI">
      <Version>2.4.1</Version>
    </PackageReference>
  </ItemGroup>

</Project>
```

こんな感じに書いたらC#でusing NPOIが書けました。
MySQLでよく使うコマンド

# はじめに
- 個人的に業務でよく使うコマンドについて書いていきます。
- こちらのコマンドについては、随時更新していきます。

# MySQLサーバーへの接続（ログイン）する前に実行するコマンド
MySQLサーバーへの接続（ログイン）する前に実行するコマンドについて書いていきます。
## MySQLサーバーへの接続（ログイン）
```
mysql -u ユーザー名 -p;
```
- `-u` オプションでは MySQL に接続するユーザー名を指定します。
- `-p` オプションはパスワードを送信する場合に指定します。

## MySQLサーバーが起動しているか確認する

```
service mysqld status;
```

# MySQLサーバーへの接続（ログイン）後に実行するコマンド
MySQLサーバーへの接続（ログイン）後に実行するコマンドについて書いていきます。
## MySQLサーバーへの接続を終了（ログアウト）

```
mysql> \q
mysql> quit
```

## データベースのコマンドについて
データベースのコマンドについて書きます。

### データベースの一覧を確認
```
show databases;
```
### データベースの作成

```
create database データベース名;
```

### データベースの削除

```
drop database データベース名;
```

### 接続しているデータベースを確認
```
select database();
```

### 接続するデータベースの選択
```
use データベース名;
```

## テーブルを操作するコマンドについて
テーブルを操作するコマンドについて書きます。

### テーブル一覧を確認

```
show tables;
```

### テーブル設計を確認

```
desc テーブル名;
```

### テーブルの削除

```
drop table テーブル名;
```

## データを取得するコマンドについて
データを取得するコマンドについて書いていきます。

### レコードを取得
```
show カラム名 from テーブル名;
```

### レコードを絞り込む

```
select カラム名 from テーブル名 where 抽出条件;
```
【メモ】djangoのmigrationファイルで任意のsqlを実行する。

任意のsqlをdjangoのマイグレーションファイルで追加する。


```python

# Generated by Django 2.0.3 on 2019-06-16 08:38

import datetime
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('residential', '0005_auto_20190616_1738'),
    ]

    operations = [
        migrations.RunSQL(
            "alter table mst_city add column geom geometry(Point, 4326)",
            "update mst_city set geom=st_SetSrid(st_MakePoint(lat, lng), 4326)"
        )
    ]

```
一番最後のmigrationファイルをdependencyに追加して、operationの配列に記載するだけ。
G検定(ジェネラリスト検定）とは？

##はじめに

こんにちは！

かなり久しぶりの投稿になりますが、今回は**G検定**(ジェネラリスト検定）についての記事です。

2019年7月6日に2019年第2回となるG検定が行われるのですが、今回は僕も受験してみます。

受験するにあたっての勉強法を備忘録的に書いていきますので、興味ある人は覗いていってください。まだ受験申し込みも間に合いますよ！

##G検定とは？

G検定とは、一般社団法人　日本ディープラーニング協会が実施するジェネラリスト育成のための検定です。2017年に第1回が実施され、次回が計5回目となる比較的新しい検定です。

名前からして難しそうですが、簡単にいうと**AIやディープラーニングについてどれくらいの基礎知識を有しているか**を問うものです。

誰でも受験でき、

受験料：12,960円（税込） ／　学生5,400円（税込）

合格率：第１回　約56.8％（受験者：1448人、合格者：823人）
　　　　第２回　約57.1％（受験者：1988人、合格者：1136人)

問題数：225題
制限時間：120分


となっています。

インターネット上で2時間かけて行われるテストなので試験会場に足を運ぶ必要もなく、非常に受験しやすい資格となっています。

合格率が結構高く、対策をしきれていない人も受験していると考えると、きっちり対策できた場合の合格率はもっと高いものになりそうです。

##試験範囲

試験範囲は公式サイトにこのようなものが載っています。

①人工知能（AI）とは（人工知能の定義）
②人工知能をめぐる動向
探索・推論、知識表現、機械学習、深層学習
③人工知能分野の問題
トイプロブレム、フレーム問題、弱いAI、強いAI、身体性、シンボルグラウンディング問題、特徴量設計、チューリングテスト、シンギュラリティ
④機械学習の具体的手法
・代表的な手法、データの扱い、応用
⑤ディープラーニングの概要
ニューラルネットワークとディープラーニング、既存のニューラルネットワークにおける問題、ディープラーニングのアプローチ、CPU と GPU
ディープラーニングにおけるデータ量
⑥ディープラーニングの手法
活性化関数、学習率の最適化、更なるテクニック、CNN、RNN
深層強化学習、深層生成モデル
⑦ディープラーニングの研究分野
画像認識、自然言語処理、音声処理、ロボティクス （強化学習）、マルチモーダル
⑧ディープラーニングの応用に向けて
産業への応用、法律、倫理、現行の議論
⑨応用数学
線形代数
確率・統計
情報理論
⑩機械学習
機械学習の基礎
実用的な方法論
⑪深層学習
順伝播型ネットワーク
深層モデルのための正則化
深層モデルのための最適化
畳み込みネットワーク
回帰結合型ニューラルネットワークと再帰的ネットワーク
生成モデル
強化学習


。。。まあ、そこそこの分量はありますね（汗）

検定なのでやっぱりある程度の対策はしないといけなさそうです。

具体的にどのように対策すればよいかも公式サイトに載っていました！

##対策法

対策法に関しては、公式サイトの「推薦図書」の欄に載っていますが、正直ここまでの量は必要ないと思われます。

AIに関しての知識をつけるにはどれも良書揃いなのですが、検定に合格することにフォーカスした場合に必要なのは以下の3つだと感じます。

**①深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト**
![518zmsdTIVL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/af6008a7-31f0-4a85-a4ed-3a165d745f40.jpeg)

この本は日本ディープラーニング協会が監修している正真正銘の公式テキストになります。

僕も読んだのですが、試験範囲の知識を浅く広く身につけるには最適です。

難しい数式の話は出てこないので、数学が苦手な人もご安心ください。

そもそもG検定に難しい数式について考えさせるような問題は一つも出てこないようなので、文系的な知識のインプットに終始して大丈夫そうです。


**②徹底攻略 ディープラーニングG検定 ジェネラリスト問題集**
![51Ct+64OAXL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/8683364f-fdb8-53a0-e660-1c6233db280e.jpeg)

これは問題集ですが、解説もわかりやすい本となっています。

①を読んだ人がその知識の定着度合いを確かめるのにちょうどよい難易度です。

僕も使っていますが、分量的にも2日あれば終わるぐらいなので短期集中で仕上げてしまうのが良さそうです。

仕上げの予想問題も2回分掲載されているので、実際の試験時間を想定して解けば合格ラインには届くのではないでしょうか？

**[③人工知能勉強会 Study-AI](http://study-ai.com)**

これは予想問題を掲載しているサイトです。

正直本がないとしても、このサイトで勉強すれば最低限の対策はできると思います。

予想問題は実際の問題数と同じ225題あり、120分以内で解けるように時間を計ってくれる機能もついています。
間違えた問題は復習して最終的に全問正解できるようすれば、かなりの実力がつきそうです。

##最後に

いかがでしたか？

まだあまりメジャーな資格ではないですが、2000人ほどの受験者がいることは確かです。

AIを事業に使いたいという会社の社長や管理職級の人も受けているようなので、今後必要になってくる資格かもしれません。

AIについて一通り勉強してみたという方は自分の知識を確かめるのにちょうどいいと思うので、気になったら是非受験してみてはいかがでしょうか？


最後に、医学生である僕が所属しているツカザキ病院眼科AIチームのページも見ていただけたら幸いです！ぜひご覧ください！

[ツカザキ病院眼科AIチーム DeepOculus](https://qiita.com/organizations/deepoculus)

僕が書いた記事もいくつかリンクを貼っておきます。

[10分で分かるAIの歴史](https://qiita.com/cr-fun/items/adf0f7f405eeebc42a50)


[プログラミングやディープラーニングの勉強、何から手をつければ良い！？](https://qiita.com/cr-fun/items/90fa4fa39cf1269e38d9)

では、また次の記事で！
Autodesk CFDのPython APIを使う

# Autodesk CFDについて
Autodesk社のCFD（数値流体力学）ソフトです。学生は3年間無償で利用できます。
Python APIが使えるようだったので試してみました。最終的には空調制御シミュレーションに使いたい。
APIは以下のリンクからダウンロードしました。
[2016 Python API マニュアル CFD Autodesk](https://knowledge.autodesk.com/ja/support/cfd/troubleshooting/caas/downloads/downloads/JPN/content/autodesk-cfd-2016-python-api-documentation.html)

# 結果を取得
まずはチュートリアルのシミュレーションを動かしました。
[チュートリアル: 居住者快適性換気スタディ](https://knowledge.autodesk.com/ja/support/cfd/getting-started/caas/CloudHelp/cloudhelp/2017/JPN/SimCFD-Tutorials/files/GUID-462E0850-0D5C-4C03-9403-B8F7BD66F2FF-htm.html)

シミュレーション結果にPython APIを使ってアクセスします。
コードはGUIの[セットアップ]-->[デザインスタディツール]-->[スクリプトエディタ]に作成

モニターポイントを作成してその座標の値を取得します。
上のリンクのAPIのサンプルコードを参考にしています。

```python:monitorPoint.py
from CFD import Setup
from CFD import Results
from CFD import DSE

def CreateMonitorPoint():
  study = Setup.DesignStudy.Create()
  scenario = study.getActiveScenario() # get active scenario of the study
  results = scenario.results()   # get results from scenario
  if results is None:
    DSE.UI.ShowMessage( "There are no results !" )
    return
  results.activate()  # activate the current results

  mp = Results.MonitorPoint.Create(results, "Point1") # create monitor point
  mp.setCoordinates(-24.8, 86.8, 179) # set coordinates
  vl  =Results.MonitorPoint.value(mp, "Temperature") # get temperature
  print(vl)

 # Call the above function
CreateMonitorPoint()
```

# 境界条件を変更
APIを使って境界条件を変更しながらシミュレーションを実行できます。
チュートリアルのモデルを使って非定常解析をしました。

```python:changeBoundaryCondition.py
def main():
  study = Setup.DesignStudy.Create()
  scenario = study.getActiveScenario() # get active scenario of the study

  ## change scenario
  n_stopTime = 30
  scenario.stopTime = n_stopTime

  ## change boundary condition
  bc = Setup.BoundaryCondition("Temperature")
  bc.setValue(64, "Fahrenheit")
  ents = Setup.EntityIdList()
  ents.append(48)
  scenario.applyBoundaryCondition(bc, ents, Setup.Entity.Surface)
  scenario.run() 

  results = scenario.results()   # get results from scenario
  results.activate()

 # Call the above function
main()
```
データの書き出しと境界条件の変更を組み合わせて色々できそうです。

## メモ
本当はやりたかったこと

- 全ての節点データをAPIを使ってエクスポート
    - APIに相当するコマンドがない。GUIではできるけれど自動化したい。
- Cutplaneを作成
    - CutPlaneクラスのsaveTableを試したところ空のファイルが出力される。これを使いたい...

もう少し使いこなしたいところ
Linux NVMe ドライバの初期化処理

#概要
NVMeドライバの振る舞いを理解するためにLinuxのNVMeドライバのソースコードを読んでいきます。対象はlinux-4.19.4 kernelに含まれるNVMeドライバとなります。本記事では初期化処理を扱います。

#初期化処理
対象ソースコードは[linux-4.19.4/drivers/nvme/host](https://elixir.bootlin.com/linux/v4.19.40/source/drivers/nvme/host/core.c)以下に存在します。今回はPCIeのNVMeデバイスを対象とします。初期化処理に主に関わるソースは`core.c`と`pci.c`となります。`core.c`は共通処理をまとめたもの、`pci.c`はPCIeのNVMeデバイス専用の処理をまとめたソースとなります。モジュールのエントリポイントは`module_init`で指定され`core.c`, `pci.c`それぞれで初期化処理を行っています。`core.c`では`nvme_init_core`関数内で`alloc_workqueue`を用いて`nvme_wq`, `nvme_reset_wq`, `nvme_delete_wq`の3つのワークキューを作成し、スキャン処理などの指示が来るのを待ち受けます。`pci.c`では`pci_register_driver`を用いてPCIデバイス用のドライバとして登録をしています。

##pci.cの初期化処理
`pci.c`では`nvme_init`が初期化処理になります。`pci_register_driver`でpciドライバを登録します。大事なのは`.id_table`と`.probe`エントリです。カーネルはPCIデバイスがロードされたときに`.id_table`で指定されたテーブルを探索します。追加されたPCIデバイスがマッチしたら`.probe`で指定した関数を実行します。NVMeデバイスが追加されたときに`nvme_id_table`にマッチしたら`nvme_probe`を実行します。

```pci.c
static struct pci_driver nvme_driver = {
    .name       = "nvme",
    .id_table   = nvme_id_table,
    .probe      = nvme_probe,
    .remove     = nvme_remove,
    .shutdown   = nvme_shutdown,
    .driver     = {  
        .pm = &nvme_dev_pm_ops,
    },   
    .sriov_configure = pci_sriov_configure_simple,
    .err_handler    = &nvme_err_handler,
};

static int __init nvme_init(void)
{
    return pci_register_driver(&nvme_driver);
}
```

`nvme_probe`ではメモリの割り当てやmutexの初期化などを行います。
初期化処理のメインは`nvme_init_ctrl`となります。この関数は`core.c`側に定義されています。

```pci.c
    result = nvme_init_ctrl(&dev->ctrl, &pdev->dev, &nvme_pci_ctrl_ops,
            quirks);
```

`nvme_init_ctrl`ではワークキューへのハンドラー関数の登録やデバイスの登録などを行っています。

```core.c
    INIT_WORK(&ctrl->scan_work, nvme_scan_work);
    INIT_WORK(&ctrl->async_event_work, nvme_async_event_work);
    INIT_WORK(&ctrl->fw_act_work, nvme_fw_act_work);
    INIT_WORK(&ctrl->delete_work, nvme_delete_ctrl_work);

    INIT_DELAYED_WORK(&ctrl->ka_work, nvme_keep_alive_work);
```

ida_simple_getでnvme0やnvme1の通し番号にあたる数字を取得し、`cdev_device_add`で`/dev/nvme0`といったキャラクタデバイスを登録します。

```
    ret = ida_simple_get(&nvme_instance_ida, 0, 0, GFP_KERNEL);
    if (ret < 0) 
        goto out; 
    ctrl->instance = ret; 
    ret = dev_set_name(ctrl->device, "nvme%d", ctrl->instance);
    ...
    cdev_init(&ctrl->cdev, &nvme_dev_fops);
    ctrl->cdev.owner = ops->module;
    ret = cdev_device_add(&ctrl->cdev, ctrl->device);
```

今度は`pci.c`側に戻り`nvme_async_probe`を実行します。`nvme_async_probe`から`reset_ctrl_sync`経由で`nvme_reset_ctrl`を呼ぶことでnvme controllerの初期化を行います。その後`flush_work(&dev->ctrl.scan_work)`でscan_workの処理を実行させることで接続されているデバイスのスキャンを実施し、namespaceの設定などを行います。

#参考
- [difference between core.c and pci.c in Linux nvme driver](https://stackoverflow.com/questions/49337859/difference-between-core-c-and-pci-c-in-linux-nvme-driver)
- [NVM-express Linux Device Driver 概説](https://gist.github.com/ixiv2015/d1f1697a50d47ea4ee0ebfc0582d6eb3/a92a1ce02184c3d388c7b17b6c57659d322e1be8)
gulp導入（自分用）

###node.js導入済み

###1.gulpのインストール
```
sudo npm install -g gulp
```

ファイル移動後

```
sudo npm install --save-dev gulp
```


```
npm init -y
#package.json作成
```


```
npm install gulp-sass --save-dev
#gulp-sassをインストール
```

###2.gulpfile.jsファイルの作成
プロジェクト直下にgulpfile.js作成

###3.gulpfileでコンパイルできるよう変更
```
'use strict';

var gulp = require('gulp');
var sass = require('gulp-sass');

// sassというタスクを定義していきます。
gulp.task('sass', function(){
  return gulp.src('./src/sass/**/*.scss')
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(gulp.dest('./deploy/css/'));
});
```
###4.watchして変更あれば自動コンパイル
```
'use strict';

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function(){
    return gulp.src('./src/sass/**/*.scss')
      .pipe(sass({outputStyle: 'expanded'}))
      .pipe(gulp.dest('./deploy/css/'));
  });

gulp.task('watch', function(){
    gulp.watch('./src/sass/**/*.scss', gulp.task('sass'));
})


gulp.task('default', gulp.series('sass'),function(){
    gulp.start('watch');
});
```

v3→v4の変更があるので、taskの中身などが違う
https://aimstogeek.hatenablog.com/entry/2018/11/30/192238

sass内でreturn入れるか何かして処理を終わらせないとエラー出る。

参考
http://www.gipservice.com/blog/0915/
http://hitasurajs.hatenablog.jp/entry/2017/06/20/211133
30代エンジニアが簿記3級取得した奮闘記

#はじめに
※2019/2月時点までの勉強方法のため、注意ください。
私が簿記を勉強し始めたきっかけ背景は以下の通りである。
・転職をきっかけに、会計システムに関わることになった。
・過去10年間会計業務に携わったことがない。
・簿記の「ぼ」も分からず仕訳や借方、貸方等用語からわからなかった。
・分からないことだらけで禿げちゃう:older_man_tone2:
上記からアクションを起こさないと仕事にならないと感じたからだ。

#前提知識
理系出身のため、簿記の知識ゼロの状態

#勉強方法
いきなり2級も考えたが、挫折することを一番恐れたため、
まずは3級取得を目指すことにした。
勉強手順については、以下の通り。

１．教科書
まずは、教科書として以下を2週間ほどざっくり読み。
[みんなが欲しかった 簿記の教科書 日商3級 商業簿記](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%8C%E6%AC%B2%E3%81%97%E3%81%8B%E3%81%A3%E3%81%9F-%E7%B0%BF%E8%A8%98%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%97%A5%E5%95%863%E7%B4%9A-%E5%95%86%E6%A5%AD%E7%B0%BF%E8%A8%98-%E3%81%BF%E3%82%93%E3%81%AA%E3%81%8C%E6%AC%B2%E3%81%97%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4813268897/ref=sr_1_4?adgrpid=58767095888&gclid=CjwKCAjw0ZfoBRB4EiwASUMdYQORVJW4_t6G5xmrGYUYga-iZ38TYJ6OhZrJWKmJds6CPrnlNeFKPBoCnfkQAvD_BwE&hvadid=338540667316&hvdev=c&hvlocphy=1028850&hvnetw=g&hvpos=1t1&hvqmt=b&hvrand=4760984164999067312&hvtargid=aud-759242200046%3Akwd-385117435417&hydadcr=26606_10270259&jp-ad-ap=0&keywords=amazon+%E7%B0%BF%E8%A8%98+3+%E7%B4%9A&qid=1560671907&s=gateway&sr=8-4)

２．過去問(高得点設問のみ)
得点割合の多い、「第1問(仕訳)、第3問(試算表)、第5問(精算表/財務諸表)」を解きながら分からなければすぐ答えを見て学習し、理解できない場合は教科書を参照。
[合格するための過去問題集 日商簿記3級](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E6%97%A5%E5%95%86%E7%B0%BF%E8%A8%983%E7%B4%9A-19%E5%B9%B46%E6%9C%88%E6%A4%9C%E5%AE%9A%E5%AF%BE%E7%AD%96-%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E7%B0%BF%E8%A8%98%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-TAC%E7%B0%BF%E8%A8%98%E6%A4%9C%E5%AE%9A%E8%AC%9B%E5%BA%A7/dp/4813277683/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%B0%BF%E8%A8%983%E7%B4%9A+%E9%81%8E%E5%8E%BB%E5%95%8F&qid=1560672307&s=gateway&sr=8-2)

３．過去問(低得点設問のみ)
余力があれば、得点割合の低い、「第2問(補助簿)、第4問(伝票)」を学習。
ここの箇所が全問正解で20(10 + 10)点だけなので優先度は低い。

４．模試
試験時間が2時間のため、集中力と電卓、仕訳の速さを鍛える。

#結果
合格ライン70点。
・2018/12月：不合格(67点)
　→1問あってれば合格だったので、寝込んだ。。
・2019/02月：合格(75点)
　→TACとの自己採点とぴったし75点。自己採点先におすすめ。
　→簡易ミスで仕訳2か所ミスして-10点だったため、仕訳は完璧にすべき

#反省点
・継続が厳しい。
　→平日疲れている中、時間の確保及び、継続して勉強することの大変さを気づかされた。
・手書きが厳しい。
　→普段PCでしか記載ないため
・仕訳の反応速度
　→時間の余裕がないため、仕訳の問題集やるべきかもと思った。
・電卓速度向上
　→時間に加算されるためこれも慣れが必要。2級はここの精度も求められるとか。

#まとめ
率直な感想としては、正直3級なんて余裕と思っていたが、個人的には難しかった。
ただし、得れたものは主に以下の点だ。
・簿記の基礎知識を得たため、最低限の会計用語は理解できるようになった。
・経理担当の人と多少は会話できるようになった。(本格的には2級はいると感じたが)
・IR情報が読めるようになった！(所属会社のIR情報見ると面白い)
・「IT」X「会計」のスキル証明になったと思う。(なんちゃってではあるが)
・若くなくとも継続して勉強できた実績。(自信UP)

今のところ、会計知識を深堀するよりもAI関連の勉強したいため、
2級は一旦受験予定がないが、機会があれば目指そうと思う。

#後日談(2021/07/08追記)
本記事記載から約2年経過して人生が好転しているので、
簿記とは脱線しますが、何かを学習、行動することは大事だと思いましたので、
記載させて頂きます。

### 略歴
- 1社目：10年受託開発SEとして従事
- 2社目：中堅SIerで会計システムに関わる（簿記取得したきっかけ）
    - [G検定取得(AI関連資格)](https://qiita.com/kannoma/items/dd66f5f73a1e5eafc618)
- 3社目：自社開発系のAI関連部署所属
    - 年収100万以上up、月残業10時間以下（一番びっくりしたことです）

同じような志の方がいましたら参考になればと思います。
また、資産運用も始めるにあたり財務3表読めるようになったので、これも簿記学んでよかったなと思いました。会社の健康状態が分かるのは大きいです・・
AWSアカウントのrootユーザーについて

AWSのアカウントを作成すると、登録したメールアドレスとパスワードを入力してログインするかと思います。
このとき、`root`ユーザとしてログインしたことになります。
![Screen Shot 2019-06-16 at 3.10.41 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/e57d1096-a159-52f3-cc98-00a43e241e41.png)

# rootユーザの取り扱いについて
AWSサービスに関する`全ての権限`を所有していますので、通常作業（EC2の作成等）で使用するのは好ましくありません。
また、パスワード情報を流出した場合全ての権限があるがゆえに、大変危険な状況に陥ります。
そこで、MFA（二段階認証）を設定しセキュリティを強化します。

# MFA(二段階認証)とは
ログインの際に通常のパスワード入力後、さらに追加で情報を入力することです。
今回は手持ちのスマホに`Authy`もしくは`Google Authenticator`をインストールして使用することにします。（両者は`Google Play Store`もしくは`App Marketplace`で入手できます。）
`Authy`はスマホデバイスだけでなく、`Google chrome`の拡張機能としても使えますので、万が一スマホを紛失してもPCがあればそちらで確認できます。
<img width="1197" alt="Screen Shot 2019-06-16 at 3.46.09 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/3bf05cb5-9c34-686a-943a-414a6b2cdc71.png">

# 設定
ユーザ名をクリックし、`My Security Credentials`をクリックします。
![Screen Shot 2019-06-16 at 3.23.42 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/cd09397e-5b1f-0f6a-8fac-70ca016613dc.png)

警告画面がでますので、`Continue to Security Credentials`を押して続行します。
![Screen Shot 2019-06-16 at 3.26.45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/8ab7e5e2-be78-ba80-8308-762b3ca148ee.png)
`Active MFA`を選択します。
![Screen Shot 2019-06-16 at 3.29.11 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/20969fa5-dc76-9949-ada3-0a2bdf8e9a6d.png)
`Virtual MFA device`を選択
![Screen Shot 2019-06-16 at 3.30.57 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/9a607e85-afb7-d7b0-39f0-c43bc77e03ca.png)

QRコードを表示し、`Authy`で読み込みます。
出現したワンタイムパスワードを入力`code 1`に入力し、再度生成されたワンタイムパスワードを`code 2`に入力します。
![Screen Shot 2019-06-16 at 3.35.11 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/1e211fce-503c-032e-1e79-7c5abd2d85c3.png)

設定が完了しました。
次回以降のログインでは、MFAのワンタイムパスワードを入力することになります。

![Screen Shot 2019-06-16 at 3.38.44 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/58580be6-bcac-c537-0341-58de4f19234a.png)
Headless Service における kube-dns の更新タイミング

kube-proxy の更新タイミングについては [Kubernetes: 詳解 Pods の終了](https://qiita.com/superbrothers/items/3ac78daba3560ea406b2) などの文献があるが、kube-dns の更新タイミングについては文献がなかったので自分で調査したメモ。

# 調べ方ポイント

kube-dns は通常２台に冗長化されている。

```
$ dig <service_name>.default.svc.cluster.local
```

のように調べると、どちらかの kube-dns に query が飛び、それぞれが保持しているTTLの値が異なるため、digを打つたびにTTLの値が変わったように錯覚を受ける。

```
$ dig <service_name>.default.svc.cluster.local
...
;; ANSWER SECTION:
<service_name>.default.svc.cluster.local. 28 IN A       10.4.9.10

[すぐ打つ]

$ dig <service_name>.default.svc.cluster.local
...
;; ANSWER SECTION:
<service_name>.default.svc.cluster.local. 2 IN A       10.4.9.10

[すぐ打ったのに TTL が 28 から急激に 2 に減ったように見える]
```

片方の kube-dns pod のIPアドレスを調べて

```
$ dig <service_name>.default.svc.cluster.local @<one_kubedns_ip>
```

のように調べると紛れがなくて良い（これに気づかず惑わされた。

# Headless Service における kube-dns の更新タイミング

[Headless Service](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services) はサービス名で名前解決したときに、サービスのVIPではなく、PodのIPアドレスを直接返してくるタイプのサービス。kube-proxy を通さずにクライアントからDNSラウンドロビンしたい場合に使う。

gRPCを使っていて仕方なく Client-Side LBしたい場合などに使う[[1](https://grpc.io/blog/loadbalancing/)]。基本的にはkube-proxyを通さないDNSラウンドロビンは推奨されていない[[2]( https://kubernetes.io/docs/concepts/services-networking/service/#why-not-use-round-robin-dns)]


## kube-dns への追加タイミング

pod が READY (readinessProbe で success)になると kube-dns に追加される。

その後 kube-dns の TTL (30 sec) が過ぎると、クライアント側から見れるようになる。

## kube-dns からの削除タイミング

pod が TERMINATED status になる (完全に終了していなくても良い)と kube-dns から削除される。

その後 kube-dns の TTL (30 sec) が過ぎると、クライアント側から見れなくなる。

PS. つまり、(graceful) shutdown 中の pod に誤ってリクエストを飛ばしてしまうことがあるので gRPC で Client-Side LB している場合などはクライアント側でケアが必要だということ。

# おまけ: Headless でない ClusterIP Service における kube-dns の更新タイミング

Headless でない ClusterIP Service の場合は Service の VIP が kube-dns に登録される。

Podのように運用中にがんがん動的に作成したり削除したりするものではないため、あまり更新タイミングが気になることはないが、一応書いておく。

## kube-dns への追加タイミング

Service 作成のタイミングですぐに kube-dns に登録される。

その後 kube-dns の TTL (30 sec) が過ぎると、クライアント側から見れるようになる。

## kube-dns からの削除タイミング

Service 削除のタイミングですぐに kube-dns から削除される。

その後 kube-dns の TTL (30 sec) が過ぎると、クライアント側から見れなくなる。
コーディング名前付け大全集

# コーディング名前付け大全集（１）

エンジニアであれば一度は悩むクラス名やメソッド名、変数名などの「名前付け」。
この名前付けの問題に関してWEB+DB+ Vol.110 で面白い記事がありましたので簡単に纏めます。

## 名前の重要性
良いコード、つまり**「理解しやすく、変更に強く読みやすい」**コードを書くためには良い名前付けが不可欠です。

## 悪い名前が引き起こす弊害
悪い名前は、以下の様な弊害があります。

- 理解が難しい
- 勘違いが発生
- 変更が難しい
- 読みづらい

## 良い名前とは

**いい名前　＝「適切な名前を選び」「正しく書かれたもの」**

## 適切な名前とは

**適切な名前　＝　名前の意味と挙動が一致しているもの**

名前の意味と挙動が一致するとは、名前から連想される意味とシステム上の挙動が一致する事です。
そしてかつ、シンプルである事がベストとされます。

### 名前の意味と挙動の不一致の3パターン
以下の様なパターンは適切な名前付けを行う上で避けるべきです。

- 名前の意味と挙動がずれている
- 名前の意味が広すぎる（名前から想像される挙動をしない）
- 名前の意味が狭すぎる（挙動が広すぎ、名前から想像される意味に無い挙動までする）

## 正しい名前の書き方
適切な名前を選んだ上で、正しい書き方を心がけます。
具体的には以下のような事に注意します。

- 文法
- スペリング
- 記法

### 記法とは
記法は大きく3流派に分かれます。

#### キャメルケース

```
CamelCase
```

の様に単語の先頭を大文字にする。Java,JavaScriptでよく利用される。

#### スネークケース

```
snake_case
```

の様に、全て小文字で記載し、単語間をアンダースコアで繋ぐ記法。PythonやRubyでよく見られます。

#### ケバブケース

```
kebab-case
```

全て小文字で記載し、単語間をハイフンで繋ぐ記法。CSSでよく利用される。


## 最後に

この記事は、WEB+DB+ Vol.110の特集記事を自分用メモ的な感じで纏めたものです。
この記事だけでは伝わらない部分もあるかと思いますので、より詳しく読みたいと感じられた方は購入されて読まれることをオススメいたします。
Julia パイプ演算子

#はじめに
Genieの勉強していたら、謎の演算子「`|>`」に出会ったので、備忘録的に書き残そうと思います。

#パイプ演算子
結論から言うと、`|>`はパイプ演算子と言うもので、なにかしらの戻り値を直接、関数の引数にできる演算子のようです。

``` Julia
[1,2,3] |> sum
> 6
```

パイプ演算子は複数繋げて記述することができるので、下記のようなこともできます。

``` Julia
[1,2,3] |> sum |> repr |> y -> parse(Int64, y) |> x -> 1:x |> Array
> [1,2,3,4,5,6]
```
ここでは、５つの関数を経て値が出力されています。
sum関数でArrayの合計がIntで返ってくる。
↓
sum関数の戻り値を入力にして、repr関数でIntからStringに変換。
↓
repr関数の戻り値を入力にして、無名関数の中のparse関数でStringをIntに変換。
↓
parse関数の戻り値を入力にして、イテレーターを作る無名関数でイテレーターを返す。
↓
イテレーターを入力に、Array型に変換。

#さいごに
Juliaのパイプ演算子は公式のドキュメントにも詳しい記載がないので、調べるのに苦労しました。
SvelteのSSRについて考えてみる

`React` における `Next` 、 `Vue` における `Nuxt` 、のように `Svelte` にもSSR（サーバーサイドレンダリング）を提供するフレームワークがある。

それが `Sapper` です。



## Sapper is 何？

![Sapper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317946/b7e61341-873b-cad0-25b8-d252dfaff123.png)

:link: [Sapper公式](<https://sapper.svelte.dev/>)



雑に説明すると、

- `Svelte` を搭載したフレームワーク
- SSRをサポートしている
- ルーティングが楽

といった感じです。



あとは、ディレクトリ構成が決まっているため初学者は構成に悩まなくてもいいというメリットもあるかもしれません。
（ ~~実際僕はSvelteのディレクトリ構成に結構悩んだので~~ ）



## インストールから起動まで

```shell
# for Rollup
npx degit "sveltejs/sapper-template#rollup" my-app
# for webpack
npx degit "sveltejs/sapper-template#webpack" my-app
cd my-app

npm install
npm run dev # & open http://localhost:3000
```

これだけで起動します。

![Sapper-great-success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317946/726debb8-4629-98fa-8e5f-9e5f505e4b6f.png)

（ ~~このおじさん誰なんでしょうね？~~ ）

## 生のSvelteとの違い

主にレンダリング面についてです。
フレームワークが違うので細かく言うと違うのですが、なるべく近い構成のアプリケーションにして比較しています。



### Svelte

![performance-svelte.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317946/a9b720cd-a657-7fdd-ac1d-3bc0e82952f6.png)


Svelteアプリケーションの場合、DCL（ `DOMContentLoaded` イベント）が最初に走り、FP（ `First Paint` ）、FCP（ `First Contentful Paint` ）、FMP（ `First Meaningful Paint` ）と続き、最後にL（`Onload` イベント）が実行されます。



### Sapper

![performance-sapper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317946/651cd2a4-ca0e-32ef-8e15-3eab0a1c7cad.png)


Sapperアプリケーションの場合、まずFP、FCP、FMPの描画まわりが走ります。
その後にDCL、Lと続いて実行されます。



### 違い

ユーザーが体感するアプリケーションのパフォーマンスは、ページの読み込み速度に大きく左右されると言われています。
つまり描画が早いほど高パフォーマンスと感じると言うことです。



今回のアプリケーションは小規模すぎて『体感』と言うにはほど遠い差しかありませんが、レンダリングの際に描画が優先されるSapperアプリケーションは **早いアプリを作るための枠組みが出来上がっている** ようです。



## まとめ

最近は「SSRだからいい」みたいなことはなく、開発するアプリの種類や利用するユーザーの求めるもの次第かなーと思います。

Sapperアプリケーションにすれば確かに描画が早くなるかもしれませんが、体感する効果は大きくはないかもしれませんし、 **プロジェクトの構造は肥大化・複雑化** します。

Sapper自体、まだ `version 1.0.` に到達していないですし、これからまだまだ進化していくと思うので、動向を追っていこうと思います。



## おまけ

自分のポートフォリオサイト作成しているんですけど、いまだにSapper使うかどうか悩んでいますー
Kotlin REPLで実験環境を作る


Kotlinの実験環境が欲しいと思いREPL(Read-Eval-Print Loop)を探すのに少し手間取ったのでメモ
Android Studioのインストールが済んでいる前提です。また画面はAndroid Studio 3.4.1、Windows 10のものです

# プロジェクトの作成

**Start a new Android Studio project**を選択して、新規プロジェクトを作成

![コメント 2019-06-16 165235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439076/7664a548-769f-8771-7b1e-c32db6fc910d.png)

![コメント 2019-06-16 164644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439076/c37ce057-6931-117a-fc0a-8f20750daf60.png)

言語は**Kotlin**を選択

![コメント 2019-06-16 164747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439076/87993282-7a80-51c1-9259-ac8b3ef91d5b.png)

#サンプルクラスの作成

今回は電卓に使用予定の計算結果をきれいに表示するクラスのテストを書いた

```kotlin:MainActivity.kt
// 小数点以下が0の場合切り捨てて文字列で返す
class ZeroFloor {
    val dnum: Double
    constructor(arg: Double) {
        this.dnum = arg
    }
    fun conv(): String {
        var temp = this.dnum.toInt()
        if (this.dnum == temp.toDouble()) {
            return temp.toString()
        }else {
            return this.dnum.toString()
        }
    }
}
```

# REPLの起動

Android Studioのメニューから**Tools** -> **Kotlin** -> **Kotlin REPL**を選択

![コメント 2019-06-16 160220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439076/881ec03a-e6fc-449a-0f5a-91250bdc4e60.png)




起動時REPL上に**You’re running the REPL with outdated classes**というメッセージが出たが**Build module 'app' and restart**を押して再ビルドとREPLの再起動をしても表示に変化がなかった。REPLを使う上で問題はなさそう

REPL上にコードを書いて**Ctrl+Enter**で実行

```kotlin
import com.example.repltest.ZeroFloor
ZeroFloor(1.5).conv()
```

```
res1: kotlin.String = 1.5
```
無事に動いた。

また、Kotlin REPL左上の**Build and restart**を押すと再ビルドと再起動を行える。

![コメント 2019-06-16 172115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439076/2b0dc1ff-3dde-8d74-2fab-7008aa4dbcff.png)


#まとめ

今回は実験用にプロジェクトを作成したということでMainActivity.ktにそのまま書いてしまったが、新規にKotlin File/Classを作成すれば同じプロジェクト内で実験が行えるので便利。

以上、Kotlin REPLで実験環境の作り方のメモでした。
CDNを理解しよう！！

# CDNは？？？

CNNじゃないです。
CDNです。
CDNは【Content Delivery Network】や【Content Distribution Network】という意味で、
コンテンツを効率的に伝えるため、複数のノードのネットワークにデータを保存して提供するシステムです。

一つの例で、
アメリカに住んでいる「TOM」が、
中国にあるサーバーから、コンテンツを取得してくると距離が遠いので、速度が遅いし、
国際回線を使用するので、コストも高くなります。

![CDNを理解しよう！！ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/b7826333-c330-a72d-b7ba-507db0cc813e.png)

でも、CDNを使用すると、アメリカのCDNサーバーにコピーをして、
アメリカに住んでいる「TOM」の要求をアメリカCDNに接続します。
その結果、コストやスピードを確保することができます。

![CDNを理解しよう！！ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421654/575f4714-ae94-6422-4ce7-91afb62c5367.png)

もし、アメリカのCDNサーバーに問題があっても、
一番近い、他のCDNサーバーに再接続するので、安定性も保証します。


# CDNキャッシュの種類

## Static Caching

 - ユーザーの要求がなくても、Origin サーバーのコンテンツをオペレータが事前に、Cache サーバーにコピーします。

 - そのため、ユーザーがCache サーバーに接続して、コンテンツを要求すると、無条件にそのコンテンツはCache サーバーにあります。

 - ほとんどの国内CDNでこの方式を使用します。（例えば、動画ストリーミング/ダウンロード、ゲームのファイルダウンロードなど）

## Dynamic Caching

 - 最初のCache サーバーは、コンテンツがないです。

 - ユーザーがコンテンツを要求すると、そのコンテンツがあることを確認し、なければ（Cache Miss）Origin サーバーからダウンロードしてユーザーに伝えてます。

 - 後に、同じコンテンツを要求があれば、保存されたコンテンツをユーザーに伝えます。

 - 各コンテンツは、一定時間が経過すると、Cache サーバーから削除されることができ、あるいはOrigin サーバーを介してContent Freshness確認後、続けている可能性があります

 -  Akamai、AmazonみたいなGlobal CDNプロバイダなどが、この方式を使用します。

# CDNのメリット？

 - 性能
 - 可用性
 - セキュリティ
 - インテリジェンス
HTML勉強　メールなどの送信フォーム

<img width="708" alt="HTMLとCSSを使ってサイトを作成しよう２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378273/7c188105-30b4-d427-ca5c-a32c14f33ed2.png">


あとでやってみないとな
ITエンジニアの、ITエンジニアによる、ITエンジニアの為の英語学習ツール、サイト、書籍のまとめ

#対象読者

エラー文が英語でわからない。
PRで英語の文章を打つのが辛い。
文法がよくわからない。
公式ドキュメント読みたくない。
英語が苦手すぎて、辛い。
英語だけど、なんとか理解して前に進みたい。
モチベーションを上げていきたい。


#前提
ここでは英語の勉強法や一般的なサイト、ツールについては教えません。
あくまで、ITエンジニア向けの英語学習のツール、サイトのまとめを紹介します。
他にも紹介があればコメントで教えていただけると嬉しいです。

#Google先生パワーを使う

##翻訳機能を使う
![英語翻訳.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/c6646735-1305-dcd5-5ac2-86dec09e8dd8.gif)

右クリックで日本語に翻訳できます。
年々翻訳技術の能力が向上しており、
これで何を書いているのはなんとなくわかりますが、
所々文章がおかしいところもあるので鵜呑みにはできません。
最初はこれで物足りるかもしれませんが、後々になると通用しないので、勉強しましょう。

##GoogleChrome拡張機能を使う
###[Mouse Dictionary](https://chrome.google.com/webstore/detail/mouse-dictionary/dnclbikcihnpjohihfcmmldgkjnebgnj)
![拡張機能.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/d421c4e5-1c21-ae90-8416-8f50fc6eae53.gif)
知らない英単語を手軽に調べるときに便利です。
無料版でもかなり翻訳できるのでお勧めです。


###[Grammarly for Chrome](https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen)
![grammary.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/2c2e9220-d278-0111-1c7d-e2867258b240.gif)

英語の文法を自動で修正してくれる優れもの。
間違いがあれば、赤線で指摘され、正しい文章に直してくれます。

###[Language Learning with Netflix](https://chrome.google.com/webstore/detail/language-learning-with-ne/hoombieeljmmljlkjmnheibnpciblicm)
<img width="1673" alt="スクリーンショット 2019-06-16 午後3.27.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/505d6ab6-914e-a202-cac2-9212d14951dd.png">
Netflixがを契約している方なら、この拡張機能はお勧めです。
セリフを日本語と英語を同時に変換してくれます。
気に入ったセリフはメモに残して使えるようにしましょう。
一緒に働いている外人エンジニアと話す機会が増えるかもしれないです。


#オンライン学習サイトで勉強する
##[エンジリッシュ](https://e-lish.io/)
![e-lish.io_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/b899c00d-708a-1916-d07a-53e2d4b74c25.png)

ITエンジニア特化型の英単語や文法をE-LeaeningSystemで勉強できます。
最後まで無料で学習できます。

##[Duolingo](https://ja.duolingo.com/)
![ja.duolingo.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/1a440234-86ba-aa2f-d86d-b01c353f2b70.png)
こちらも最後まで無料で勉強できます。
UIが美しいので学習のモチベーションも高まります。



#書籍で勉強する

- [村上式シンプル英語勉強法 使える英語を、本気で身につける (日経ビジネス人文庫)](https://www.amazon.co.jp/dp/4532198097)
- [ITエンジニアの英語術 最強の教科書](https://www.amazon.co.jp/dp/4046022515 )
- [ITエンジニアのための場面別英会話&キーフレーズ](https://www.amazon.co.jp/dp/4816363556)


#最後に
ITエンジニア向けの英語学習ツール、サイト、書籍のまとめになります。
他にも色々あると思うので、随時更新していきます。
SQLのデータ型まとめ

## 数値型

### 整数型
#### int型
-2,147,483,648(-2^31)以上2,147,483,647(2^31-1)以下の整数型.
#### smallint型
-32,768(-2^15)以上32,767(2^15-1)以下の整数型.
#### bigint型
-9,223,372,036,854,775,808(-2^63)以上9,223,372,036,854,775,807(2^63-1)以下の整数型.
#### bit型
0か1のどちらかの値をとる整数型.

### 浮動小数点型
#### float(n)型
–1.79×10^308以上-2.23×10^(-308)以下, 0, 2.23×10^(-308)以上1.79×10^308以下の範囲の値をとる浮動小数点型. nは有効桁数1〜53で任意に指定できる. 標準では53.
#### real型
–3.40×10^38以上1.18×10^(-38), 0, 1.18×10^(-38)以上3.40×10^38以下の範囲の値をとる浮動小数点型

### 通貨型
#### money型
-922,337,203,685,477.5808以上922,337,203,685,477.5807以下の通貨の単位を持つ値の型

### 日付型
#### date型
YYYY-MM-DDの形をとる日付型. 0001-01-01 ～ 9999-12-31の範囲をとる.
#### time(p)型
HH:MM:SS.SSSSSSSの形で時間を表すデータ型. 00:00:00.0000000 ～ 23:59:59.9999999の範囲をとる. pは秒の小数点以下の有効桁数で0〜7で任意に指定できる. 標準では7.
#### datetime型
1753年1月1日00:00:00 ～ 9999年12月31日23:59:59.997の範囲で日付と時刻を併せ持つデータ型.
#### datetime2(p)型
0001-01-01 00:00:0000000 ～ 9999-12-31 23:59:59.9999999の範囲で日付と時刻を併せ持つデータ型. pは秒の小数点以下の有効桁数で0〜7で任意に指定できる. 標準では7.

### 文字列型(Unicodeでない)
#### char(n)型
固定長の文字列の型. nは桁数.
#### varchar(n|max)型
可変長の文字列の型. varcharは文字列に加えてk桁数をデータとして持つ. nは桁数, maxは最大桁数.
#### text型
可変長の文字列型. 2,147,483,647(2^31-1)バイトまで.

### Unicode 文字型
#### nchar(n)型
固定長の文字列型. nは桁数で1～4000の範囲を任意に取れる.
#### nvarchar(n|max)型
可変長の文字列型. nは桁数で1〜4000の範囲を任意に取れる. maxは最大桁数で2^31-1バイト.
#### ntext型
1,073,741,823(2^30–1)文字以内の可変長の文字列型.

### バイナリ型
#### binary(n)型
固定長のバイナリデータ型. nは桁数で1〜8000を任意に取れる.
#### varbinary(n|max)型
可変長のバイナリデータ型. nは桁数で1～8000を任意に取れる. maxは最大桁数で2^31-1バイト.
#### image型
0以上2,147,483,647(2^31-1)バイトの可変長のバイナリデータ型.
php-master-changes 2019-06-15

今日はテストの修正、不要コードの削除、Azure Pipelines の設定修正があった！

# 2019-06-15
## nikic: Remove file/005_variation.phpt
- https://github.com/php/php-src/commit/7410155dab066a18539459ad1160ec3ef753de45
- [7.4~]
- 30 秒かけて何をチェックしてるわけでもないテストがあったのを削除

## krakjoe: fix flaky socket tests
- https://github.com/php/php-src/commit/afdf7ed5ba35f703130c704442c115be4628c099
- [7.4~]
- ext/sockets で、びみょいテストの修正
- ポート固定指定だし socket_sendto() は失敗時は -1 でなく false 返すしエラー処理もまともでないし、みたいな

## Girgias: Remove dead code in sockets extension [ci skip]
- https://github.com/php/php-src/commit/cfdca109103d4bfd0c66c89336a9b799a2180beb
- [7.4~]
- ext/sockets で、不要コードの削除

## krakjoe: This test is flaky, and some of it doesn't make sense.
- https://github.com/php/php-src/commit/3852a35fdbcb62f2e9248364a89ffdd452097d51
- [7.4~]
- びみょいテストのリファクタリング

## krakjoe: PHP-7.4 branch should not run JIT tests, ever [ci skip]
- https://github.com/php/php-src/commit/91f0ef04af8d64377ca38ba9886e5f6106113b14
- [7.4~]
- Azure Pipelines の設定で、7.4 では JIT のテストを実行しないよう修正

## krakjoe: PHP-8.0 should run JIT tests, always [ci skip]
- https://github.com/php/php-src/commit/e8c6910e5ed7c206ac0ddfdda0a60df8f104114a
- Azure Pipelines の設定で、8.0 では JIT のテストを実行するよう修正
enumとI18nの実装はymlファイルの階層が鍵だった件

enumとI18nとのコンビでハマったので、覚書としてかきます。

##環境
Ruby 2.6.3
Rails 5.2.3

##アプリの概要
タスク管理アプリ。そのタスクに優先度（高・中・低）を実装するのが今回のテーマ。

##enumの定義
```ruby:app/models/task.rb
// 省略
enum priority: [:high, :medium, :low]
// 省略
```
こうかくことで、以下の公式リファレンスにあるとおり、先頭から0、1、2が自動的に割り当てられる。
[enum公式リファレンス](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html)

##I18nの定義
```ruby:config/locales/ja.yml
ja:
  // 省略
  enums:
    task:
      priority:
        high: 高
        medium: 中
        low: 低
  // 省略
```
この階層がのちのち鍵になる。

##実装
```app/views/tasks/index.html.erb
    <% @tasks.each do |task| %>
      <tr>
        // 省略
        <th><%= t("enums.task.priority.#{task.priority}") %></th>
        // 省略
      </tr>
    <% end %>
```
上記のように、**ymlファイルの階層とおりドットで区切る**ことでI18nが反映することになる。

```app/views/tasks/_form.html.erb
<%= form_with(model: @task, local: true ) do |form| %>
// 省略
    <%= form.label :priority %>
    <%= form.select :priority, Task.priorities.keys.map {|k| [t("enums.task.priority.#{k}"), k]} %>
// 省略
<% end %>
```
こちらはmapメソッドを使ってまとめた。
keysメソッドについては[コチラ](https://ref.xaio.jp/ruby/classes/hash/keys)

これにより、タスクの新規登録画面では以下のようなプルダウンメニューが実装できる。
![スクリーンショット 2019-06-16 16.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159704/d796133f-6fd2-583b-b91e-437479bbc876.png)



##enumの利点
そもそもenumはなんのために存在するのか。

- 数値で扱うことができるため、ソート処理が可能になる
  - 「高・中・低」ではソートはできない
- 設定する値に対してバリデーション的な役目を果たす
  - 「最低」や「最高」などは受け付けなくなる


enumでハマったら、ymlファイルの階層をチェックしましょう。
App IDでGrafanaの認証をする

# 目的

Grafanaの認証をIBM CloudのApp IDでやってみます。

# 手順

## 参考

Grafanaの公式ドキュメントにOAuthとの連携方法が書かれています。

> https://grafana.com/docs/auth/overview/

App IDについての記載はありませんが、Generic OAuthが使えそうです。

## App IDの設定

IBM CloudでApp IDをオーダーし、必要な設定をします。今回はIDプロバイダとしてクラウドディレクトリーを使います。この場合、最低限次の設定を行います。

### 余計なIDプロバイダの無効化

必須というわけではないですが、混乱を避けるために、余計なIDプロバイダは無効化しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/7fddca3e-0f83-4f1e-1720-c27b0c8ab2a9.png)


### リダイレクトURLの設定

ログイン画面をApp IDが受け持つことになるので、ログイン後の戻りURLを登録します。URLは、```${GrafanaのFQDN}/login/generic_oauth```になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/159e4d14-069d-c573-1812-ac3d9c224510.png)

### アプリケーションの登録

アプリケーションの登録を行います。おなじみClient IDやSecretがもらえます。ここの値は後で使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/29f1b8fd-7260-8e9f-38f7-ede40a263fbd.png)

### ユーザーの登録

認証するユーザーを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/40c3a053-4f70-9e51-6170-c68c9aff86c2.png)

## Grafanaの設定

grafana.iniや環境変数で設定します。Grafanaに親しんでいる方ならよくご存じのはずです。

### root_urlの設定

Grafana自体はこれをきちんと設定しなくてもなんとなく動きますが、root_urlの値を使ってredirect_uriを生成するため、きちんと設定します。

```
[server]
root_url = https://${GrafanaのFQDN}
```

### OAuth関連の設定

```
[auth.generic_oauth]
enabled = true
name = App ID（任意です）
client_id = ${App IDのclient_id}
client_secret = ${App IDのsecret}
auth_url = ${App IDのoAuthServerUrl}/authorization
token_url = ${App IDのoAuthServerUrl}/token
api_uri = ${App IDのoAuthServerUrl}/userinfo
```

## 動作確認

設定が済んだらGrafanaにアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/74f1de5c-47e5-be0b-c843-5e210dfc3186.png)

いつもの画面の下に「Sign in with App ID」と表示されました。withの後の文字は先ほどのnameの値が使われますので、App IDと表示されています。

ではSign in with AppIdに進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ad0ea8b3-38d6-0aa3-b9d2-090d3ac69a17.png)

はい、App IDが提供するログイン画面が表示されました。作りかけっぽいですが、これはログイン画面を今回カスタマイズしていないからです。実運用の際にはカスタマイズしてみてください。

先ほどクラウドディレクトリーに登録したユーザーのメールアドレスとパスワードを入力しSign inします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/10c8eedc-ed8f-5066-ee5d-01b1dc7e3350.png)

無事ログインできました。

## 権限の調整

初めてOAuthログインしたユーザーはViewerロールだけを持っているようですので、ダッシュボードの表示はできますが、編集はできません。

adminユーザで入り直し、Configuration -> Users から、ロールの変更が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/701c7858-cf07-b9bd-219b-bf29b41c8aee.png)

### ※2020/8/4更新

App IDでGrafanaのロールを指定することに成功しました。下記記事を参照ください。

> [App IdでGrafanaの認証とロールの設定をする](https://qiita.com/teruq/items/89fa10ca608d76e4fada)

以上です。
Windows10使いのJavaエンジニアのMacセットアップ

# TL;DR

Windows10使いのエンジニアです。主にJava、Spring、PaaSをよく使います。

15年くらいWindowsユーザでしたが、最近のWindowsのUXの悪さにギブアップし、今年5月に出たMacBook Proを購入して個人PCを乗り換えました。

今はちょうどホームスクリーンが見えたところです。ここではセットアップを順に晒します。

何か良いものがあればぜひ教えてください。

# 環境設定

まずは最低限、音量を切る。時刻が日本時間か確認。共有をオフにする。

それ以外は必要がでたらやります。

# ブラウザ

標準のSafariでも十分ですがChromeをインストールしました。

dmgをダブルクリックするとポップアップが出てくるのでドラッグ&ドロップします。

<img width="482" alt="スクリーンショット 2019-06-15 22.14.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/15329bd3-61d0-6271-dcac-7e14c4cfd168.png">


# ウイルスソフト


# 開発

Git, GitHub, Java, Nodeが使えることを目標にセットアップします。

## 圧縮ソフト

Macは zipを標準で解凍でき、`tar` コマンドも使えるのでインストール不要でした。

Windowsだとパスが長い場合にソフトを選んだりするのですが、特に問題なさそうです。

## ホスト切り替え

`hosts` ファイルをviで直接修正してもいいですが、このソフトをインストールすると便利です。

http://permanentmarkers.nl/software.html

## ターミナル

よく使うのでdockに入れて、起動確認。

```
$ echo $SHELL
/bin/bash
```

ホスト名に自分の実名が入っておりよろしくなかったので、下記を参考に修正しました。

https://support.apple.com/ja-jp/guide/mac-help/mchlp1177/mac

## Git準備

### SSH鍵

生成した鍵をお使いのGitホスティングサービスに貼り付けておきます。

GitHubの場合は [Personal Settings]-> [SSH and GPG Keys] -> [SSH Keys]です。

```
$ ssh-keygen
(中略)
$ less .ssh/id_rsa.pub
(出力内容を貼り付ける)
```

### Gitクライアント

GitHubを使うので、GitHub Desktopをインストールします。

### Developer Toolsのインストール

Gitでの初回clone時にDeveloper Toolsのインストールのポップアップが出たので従いました。

## 言語類

https://github.com/pivotal/workstation-setup

honebrewの更新、ツールのインストール、IDEなど一式自動化されていて便利です。

Javaは [こちらの記事](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2) と [こちらの記事](https://qiita.com/seri_k/items/e978c1339ce51f13e297) を参考に11と12を使えるようにしました。


## Xcodeのインストール

iOSアプリの勉強がやりたくなったらインストールします。


## シェルのアライアス

お好みで。CentOS使いは `ll` とか登録すると迷いません。

## テキストエディタ

VSCode, Atom, Sublime Textなどお好みで。残念ながらサクラエディタではなくなります。

## IDE

IntellJ Ultimateをインストールします。

# 各種アカウント移行

Gmail, Qiita, Github, Slackなどお使いのものを。ブラウザでログインするだけです。

# データ移行

事務作業系と画像はWindowsマシンでGoogle Driveに格納して移行します。

ソースコードはGithubにpushしておきます。

# 画像編集

当面はMac標準付属で乗り切ります。

# 画面キャプチャ

ショートカットでできるのでインストール不要でした。

# Office

Mac標準付属のPagesがあればWordはなくても困りません。

どうしてもOfficeを開きたい場合、Office for Macを買うか、LibreOfficeを使います。

# 仮想Windows

IEでのレイアウトテストなど、どうしてもMacでできないことがある場合、仮想Windowsがあると便利です。

Mac標準でもBootCampがありますが、パーティション切り替えが面倒なので Paralles Desktopを使っています。

[Parallels Desktopを使ってMac OS CatalinaでMMD制作環境を作る](https://qiita.com/zoosm3/items/4595d6c59822773ed6de)

# まとめ

大概homebrewでインストールできるか、Mac標準付属なので簡単でした。
Laravel 1対多、子レコードの件数をwithCountを利用して数える

## やりたいこと
ユーザが何件のコメントを投稿しているかカウントしたい

## 関係性
### User 1
```php
//UserModel
    public function comments() {
        return $this->hasMany(Comment::class);
    }
```
### Comments 多
```php
// CommentModel
    public function user() {
        return $this->belongsTo(User::class);
    }
```

## withCountを利用して取得
```php
$user = User::withCount('comments')->get();

$user->comments_count;

```

## おまけ
### カウントは取りたくないけど、コメントしているユーザだけを取得したい
```
User::has('comments')->get();
```
Spring bootでjacksonを使った時にcom.fasterxml.jackson.databind.exc.InvalidDefinitionExceptionが出て対処したのでメモ

### 環境
- OS: macOS Mojave
- Spring boot version: 2.1.4.RELEASE

### 例外発生と対処まで

Spring bootでRest Controllerを作成して、ブラウザのアドレスバーにURLを入力してリソースを取得しようとすると以下のような例外が発生しました。

``` terminal
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class <エラーが出たクラス名> and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: <レスポンスのクラス名>["<対象の項目名>"]->java.util.ArrayList[0]-><エラーが出たクラス名>["<エラーが出た項目名>"])
```

エラーが発生したクラスでは、getterを用意していなかったので、これが怪しいと思い、getterを追加したら治りました。考えてみれば当たり前かもしれませんが、外部のクラスから取得できる形にしておかないとJSONに変換する時に変換対象項目を取得できずに例外が発生するみたいですね。