OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Transit Gatewayを試す

##はじめに

2018/11/27に発表になったAWS Transit Gatewayを試してみます。
https://aws.amazon.com/jp/blogs/news/new-aws-transit-gateway/

AWS Transit Gatewayを使用すると、VPCピアリングなしにVPC/VPN間を接続し、シンプルなネットワーク構成が実現できます。ローンチ時は、DX未サポートとなります。

##試してみる
AWS Transit Gatewayは、AWSアカウントをまたいだVPC間の接続も可能ですが、今回は以下の様な構成で1つのAWSアカウント内で疎通確認してみます。
Transit1(10.0.0.0/16)とTransit2(10.1.0.0/16)のVPCを作成して、EC2インスタンス間で疎通確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f484c9d4-5eb8-98f0-d50a-d7713fe831b6.png)

###前提
Private SubnetをもつVPCを2つ作成します。(今回はTransit1,Transit2という名前で作成しました)

###Transit Gatewaysを作成する

Create Transit Gatewayをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/96563858-02a2-3e2a-7a66-94d5876f806f.png)

Name Tagを入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/e2200544-a779-29de-9f91-158446f08d36.png)

今回はデフォルト設定のまま作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/8f905faa-ec04-c3d2-e72b-48dba825e530.png)

StatusがAvailableになれば完成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/14966a3a-7c1d-0596-fbca-8855b4724ba4.png)

今回は、Default route table association/propagationを有効にしているため、自動的にTransit Gateway Route Tableが作成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/fcb4f2b6-bfb5-8949-b5c3-f2dbcbd0ad50.png)

###Transit Gateway Attachmentを作成する
作成したTransit Gatewayを既存のVPCにアタッチする

Create Transit Gateway Attachmentをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/95041f3f-5499-bfbc-f4ea-26ea8b0d2d9b.png)

作成したTransit Gatewayを指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/59d60b7f-86f8-1149-b93f-02cc907cc544.png)

サブネットを指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/0af49c6e-c67f-3695-31f4-b1a52e5a2449.png)

VPC Transit2の方も同様に実施する

###VPCのRoute Table設定
Transit1は、Transit2のIPアドレスレンジをDestinationにしてTargetをTransit Gatewayにする
Transit2は、Transit1のIPアドレスレンジをDestinationにしてTargetをTransit Gatewayにする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/96c8dc35-e9ab-7706-ae66-b8b02beb830e.png)

###疎通確認
Transit1とTransit2でEC2インスタンスを作成し疎通を確認する

```
sh-4.2$ ping 10.1.1.187
PING 10.1.1.187 (10.1.1.187) 56(84) bytes of data.
64 bytes from 10.1.1.187: icmp_seq=1 ttl=254 time=0.655 ms
64 bytes from 10.1.1.187: icmp_seq=2 ttl=254 time=0.591 ms
64 bytes from 10.1.1.187: icmp_seq=3 ttl=254 time=0.508 ms
^C
--- 10.1.1.187 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.508/0.584/0.655/0.066 ms
```

今回、SSMを使ってログインをして疎通確認しています。SSMの要件として、SSMエンドポイントにアウトバウンド接続する必要があるため、NAT GatewayかSSMのPrivate Linkが必要になります。

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
AtCoder Beginner Contest 113 C問題をpython3で

前回Cの問題が解けなかったので，毎日C問題の過去問を解いていく．
今日は[ABC113-C](https://beta.atcoder.jp/contests/abc113/tasks/abc113_c)．
普通に分からなくて泣きながら他の人の回答をガン見して，コメントを打ちながら咀嚼．

```python:Main.py
N, M = map(int, input().split())
D = [[] for i in range(N)]

for i in range(M):
  p, y = map(int, input().split())
  D[p-1].append((y, i)) #市ごとにリストに入れる．この時，元の順番をタプルの1番目の要素として入れておく
    
ans = [None]*M

for i, d in enumerate(D): #enumerateは要素の中身とインデックス番号を持ってこれる．print(i, d)で確認
  d.sort()
  for k, (y, j) in enumerate(d): #こちらも同様．(y, j)となっているため，yには年数が，jには元の順番の情報が入る
    ans[j] = str(i+1).zfill(6) + str(k+1).zfill(6) #ans[j]に12桁の認識番号を挿入

print(*ans, sep = '\n') 
#普通にprint(ans)とするとリストが出力される
#print(*ans)とすると，リストの要素がスペース区切りで出力される
#printのオプションsepで，文字の区切りをスペース出なく，改行に指定
```
最後のprintで，*ansと書くとリストが外れる理由がよく分からない．
Laravelの言語ファイルを自動生成するライブラリ見つけた

Laravelで多言語化用に__ヘルパー関数使って、"resources/lang/"以下にjsonファイルを作ることが多々あります。
毎回、そのjsonファイルを作るのが面倒だったので、ヘルパー関数を調べてjsonファイルを作ってくれるライブラリがないか探したところありました。

こちらです。
[kkomelin/laravel-translatable-string-exporter](https://github.com/kkomelin/laravel-translatable-string-exporter)

## 利用方法
至極簡単です。
対象プロジェクト直下でcomposerで導入。
生成したい言語名を引数にコマンド実行で生成してくれます。

### 1. インストール

```
composer require kkomelin/laravel-translatable-string-exporter
```

### 2.生成

```bash
php artisan translatable:export <lang>
```

```bash
php artisan translatable:export es
php artisan translatable:export es,bg,de
```

## 生成されるファイル
```php artisan make:auth```&```php artisan migrate``` 後に自動生成した言語ファイルです。

```php
{
    "Login": "Login",
    "E-Mail Address": "E-Mail Address",
    "Password": "Password",
    "Remember Me": "Remember Me",
    "Forgot Your Password?": "Forgot Your Password?",
    "Reset Password": "Reset Password",
    "Send Password Reset Link": "Send Password Reset Link",
    "Confirm Password": "Confirm Password",
    "Register": "Register",
    "Name": "Name",
    "Verify Your Email Address": "Verify Your Email Address",
    "A fresh verification link has been sent to your email address.": "A fresh verification link has been sent to your email address.",
    "Before proceeding, please check your email for a verification link.": "Before proceeding, please check your email for a verification link.",
    "If you did not receive the email": "If you did not receive the email",
    "click here to request another": "click here to request another",
    "Toggle navigation": "Toggle navigation",
    "Logout": "Logout"
}
```

## 実行環境
```bash
root@cd7df3ed8fc8:/var/www # php artisan -V
Laravel Framework 5.7.15
root@cd7df3ed8fc8:/var/www # php -v
PHP 7.2.4-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Apr  5 2018 08:53:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.4-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
```
Web Speech API を 利用して 英単語の音声確認をするアプリを作る

最近音声認識や音声入力に興味があり、いろいろと調べています。

今回は Web Speech API に含まれる、音声合成APIを利用して、簡単なアプリを作ってみました。

## やること

英単語などの発音を教えてくれるアプリ
フォームから英語を入力しボタンを押すと、ブラウザが英語の音声で発音を教えてくれる
Web Speech APIを利用

## Web Speech API とは

[W3C Community Final Specification Agreement（FSA）](https://www.w3.org/community/about/agreements/final/)の下、[Speech API Community](https://www.w3.org/community/speech-api/)により策定されている、JavaScript のAPI。

音声認識と、音声合成の2つの機能を持つ。

Speech API Community が公開している仕様文章はこちら。
https://w3c.github.io/speech-api

MDNのリファレンスはこちら。
https://developer.mozilla.org/ja/docs/Web/API/Web_Speech_API

音声合成のAPIは [Web Speech Synhtesis API](https://w3c.github.io/speech-api/#tts-section) を利用する。


## Web Speech Synthesis APIの記述とサンプルコード

[SpeechSynthesisUtterance](https://developer.mozilla.org/ja/docs/Web/API/SpeechSynthesisUtterance) オブジェクトで発声させたい単語・文章を定義できる。

```
SpeechSynthesisUtterance.text
```
で、発声させたい単語を定義

```
SpeechSynthesisUtterance.lang
```
で、発声する言語を指定


```
SpeechSynthesisUtterance.lang = 'ja'
```
なら日本語で発声

```
SpeechSynthesisUtterance.lang = 'en-US'
``` 
なら英語で発声


[SpeechSynthesis.speak()](https://developer.mozilla.org/ja/docs/Web/API/SpeechSynthesis/speak) メソッドで音声の発生を行う。



https://w3c.github.io/speech-api/#examples-synthesis にサンプルコードがある。下記はサンプルの一つ。

```javascript
<script type="text/javascript">
  speechSynthesis.speak(new SpeechSynthesisUtterance('Hello World'));
</script>
```
## フォームに入力した英語の発音をチェックするアプリ

W3Cのサンプルを見ながら、簡単なアプリを作成してみました。
フォームに英単語を入力後、ボタンをクリックすると、英単語の発音が確認できます。


```html

<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Web Speech API サンプル 2</title>
</head>
<body>
  <h1>英語の音声確認アプリ</h1>

  <div>
    <p>音声を確認したい単語を入力してください。</p>
    <input type="text" id="word"></form>
    <button id="button" onclick="pronounce()">発音を確認</button>
  </div>

<script type="text/javascript">

  'use strict'

  function pronounce() {
 
    let word = document.getElementById('word').value;
    let u = new SpeechSynthesisUtterance();
    u.lang = 'en-US';
    u.text = word;
    speechSynthesis.speak(u);

  }

</script>

</body>
</html>

```

実際に動くサンプルは下記です。

https://nick-smallworld.github.io/WebSpeechAPIPractice/sample-2.html
どうでもいいからささっとGoでCLIつくりたいとき

体裁はどうでもいいからちゃちゃっとCLIツールをGoで作りたいときにどうしているかというお話。

この記事は[パーソルキャリア Advent Calendar](https://qiita.com/advent-calendar/2018/pca) 2018の6日目です。

CLIのフレームワークは [spf13/cobra](https://github.com/spf13/cobra) を使います。
数年前からあってそれなりにメンテナンスされていて、デファクトスタンダード化しつつあるし楽なので

# ディレクトリ構成

パッケージのディレクトリ構成はこんな感じです。
git-ltsがかつて用いていた構成を参考にされてもらってます。
実行ファイルと実際のコマンドを分けています。
これはビルドせずに`go run`で実行したときに、`main.go`だけ指定すればいいようにするためです

```bash:構成
.
├── main.go
└── commands
    ├── commands.go
    └── commands_xxx.go
```

# ファイル構成

## main.go

コマンドを実行する処理を呼んでいるだけです。定形。

```golang:main.go
package main

import "github.com/yourname/package_name/commands"

func main() {
	commands.Run()
}
```

## commands.go

コマンドのメイン処理になります。
`foobar` が、コマンド名になるので、適当な名称に差し替えてください。
それ以外はこのままで使えます。

`Exit`は、`os.Exit`をwrapした処理です。
`os.Exit`を使う場合、`os.Exit`はエラーメッセージを標準出力できないので、`os.Exit`の前に`fmt`や`log`を使って出力する必要があります。
`log.Fatal`を使う手もあるのですが、`log.Fatal`はエラーコードが1固定なので、指定したいときに問題です。

```golang:commands.go
package commands

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
)

var (
	// RootCmd defines root command
	RootCmd = &cobra.Command{
		Use: "foobar",
		Run: func(cmd *cobra.Command, args []string) {
			cmd.Usage()
		},
	}
)

// Run runs command.
func Run() {
	RootCmd.Execute()
}

// Exit finishes a runnning action.
func Exit(err error, codes ...int) {
	var code int
	if len(codes) > 0 {
		code = codes[0]
	} else {
		code = 2
	}
	if err != nil {
		fmt.Println(err)
	}
	os.Exit(code)
}
```

## commands_xxx.go

ファイル名とコード内の`xxx`はサブコマンド名です。適当な名称に差し替えてください。
サブコマンドはコマンド単位でファイルを切ります。
コマンドの役割と、内容を明確にするためです。
varとinit()で自動的にサブコマンドがコマンドに登録されるようにしています。
実際の実行は`xxxCommand`が、
処理内容は`xxxAction`が
担保するようにします。
これによって、テストを書きたいときに`xxxAction`が、きちんとテストできていれば問題ないようにします。
また`xxxAction`の内容を`xxxCommand`で書いてしまうと、`xxxCommand`はエラー時にos.Exitを返さないければいけないので、テスト時に複雑性が上がります。

`xxxCommand`でエラーコードを指定したい場合は、
エラー毎に定義をして、switch-case文でふりわけるか、`xxxAction`でエラーコードもあわせて返すようにします。

```golang:commands_xxx.go
package commands

import (
	"github.com/spf13/cobra"
)

var (
	xxxCmd = &cobra.Command{
		Use: "xxx",
		Run: xxxCommand,
	}
)

func xxxCommand(cmd *cobra.Command, args []string) {
	if err := xxxAction(); err != nil {
		Exit(err, 1)
	}
}

func xxxAction() (err error) {
	// 実行したい内容
}

func init() {
	RootCmd.AddCommand(xxxCmd)
}
```
React Pixi Fiber使ってみた

この記事は [@HibikineCode 1人 Advent Calendar 2018](https://adventar.org/calendars/3251) の6日目の記事です。

![game.png](https://qiita-image-store.s3.amazonaws.com/0/152713/20d9fcec-c1bc-9727-eaa3-a91d5d07d47b.png)

# おいー！　Reactでpixi.js動かそうぜー！
React は主にDOMのレンダリングに使われるJavaScriptのViewのライブラリです。が、中でやってることは更新を検知して差分だけ変更するってことだけです。ということは、**[DOM](https://www.npmjs.com/package/react-dom) だろうが [ネイティブ](https://facebook.github.io/react-native/) だろうが [Canvas](https://github.com/Flipboard/react-canvas) だろうが**、レンダリング先を変えているだけで同じ仕組みで出来るはずです。

だったら React でゲームエンジン [pixi.js](http://www.pixijs.com/) のコンポーネントを操作するなんてわけないはずです。さらに好都合なことに、 pixi.js のコンポーネントはツリー構造です。もう React との相性は**抜群**なわけです。

[React で pixi.js を動かそうとした先人](https://github.com/Izzimach/react-pixi)がいます。が、React v16 のFiber化による内部仕様変更には対応しなかったため、v16以降で動く[react-pixi-fiber](https://github.com/michalochman/react-pixi-fiber)を使います。

ちなみに3月に生まれたばかりで急成長中の [@inlet/react-pixi](https://github.com/inlet/react-pixi/) もあります。あとで使ってみよ。

# 作ったもの

某スマホゲームのパクリを作りました。私の絵描きの方で使ってる代理キャラを飛ばす「りこぴょん」です。

https://hibikinekage.github.io/flappy-rico

そのうちPWAにします。12月の貴重な時間を無駄に溶かしてください。

ソースコードはこちら。

https://github.com/HibikineKage/flappy-rico

# 雑感

作った時に感じたことをつらつらと。

## メリット👍

* コンポーネントのデバッグが楽
* stateが変に分散していないので次の状態を書くのが楽

とにかく各コンポーネントのデバッグが楽なのがいいです。

## デメリット👎

* 結構パフォーマンスに影響がある
* unmount忘れるとガンガンメモリリークする
* ルートに状態が集中する
* アニメーションつらい

アニメーションやろうと思うたびに新しく状態変数追加しなきゃいけないのちょっとめんどくさい……。
クラスベースだと該当するクラスに委譲するだけでいいのに対し、Reactではルートに置かないと他から参照できなくなるので、どこに状態を置くべきか悩ましいです。

# まとめ

* React でゲーム作るのは楽しいぞ
* 片方向バインディング最高
* 状態管理が増えるとめんどくさい

ちょっとでかいゲームは作るの大変そうですが、中・小規模なゲームならアリだと思いました。

最後まで見ていただきありがとうございました。
[初心者向け]docker-composeのタイプを減らしたい

## 概要
●設定を書き込むファイルは.bashrc
　※理由は[本当に正しい .bashrc と .bash_profile の使ひ分け](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)を参照
●.bashrcの設定を反映すると設定したエイリアスが使えるようになる

###① .bashrcを作成する
ここで、
OSXはデフォルトで.bashrcを読み込まない。というか、そもそも.bashrcがないハズ。。。
というわけで、まず.bashrcを作成。
（作成場所は~/以下）

↓結果的にはいらない作業だけど。とりあえず。

```:Terminal
touch ~/.bashrc
```

###② .bashrcを使用するための設定をする
以下を.bash_profileに記入

```:.bash_profile
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
```

以前の私のように「え？.bash_profileって何？どこにあんの？」って人は以下実行。
.bash_profileをviで編集する場合は以下を打てばOK

```:Terminal
vi ~/.bash_profile
```
このコマンド打って、上記のif文をコピペ→保存すればOK
（当たり前ですが、保存は[esc]キー打って、「:wq」入力→[return]キー）

###③ .bashrcにdocker-composeのaliasを入力する
本題のdocker-composeのエイリアスを作りたいので
vi(もしくはvim)で.bashrcの編集をする

```:Terminal
vi ~/.bashrc
```

以下を.bashrcにコピペ

```:.bashrc
alias dc="docker-compose"
```

###④ .bashrcを反映させる

```:Terminal
source ~/.bashrc
```
以上で設定は完了。のハズ。

###⑤ 確認

docker-compose up -d は

```:Terminal
dc up -d
```

docker-compose down は

```:Terminal
dc down
```
で実行できる。
Xcode使うなら入れておいた方がいいもの、便利な機能

# Xcode使うなら入れておいた方がいいもの、便利な機能
iOSの開発を始めて3年程経ちそうなので、今までに出会った便利なアプリやツール、機能を紹介します。

## アプリ/ツール

- CocoaPods
言わずもがなですがライブラリ管理ツール。
CocoaPodsまたはCarthageは入れておきましょう。  
[iOSライブラリ管理ツール「CocoaPods」の使用方法](https://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)

- Bundler
複数人で開発をしていてライブラリをGit管理していないとライブラリをインストールしたバージョンが同じでもCocoaPodsのバージョンによって動かないということが起こることがあるらしいので、CocoaPodsを同じバージョンに揃えるためのツール。  
[iOS複数人で開発する時にこれだけはやっておけ](https://qiita.com/daisuke0131/items/52d5d8d3298c950ea613)

- RealmBrowser
データベースの中身を閲覧、編集できるアプリ。
CoreDataではなくRealmを使う場合はRealmBrowserも入れましょう。  
[Mac App Store (Realm Browser)](https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12)

- SimPholders
シミュレーターを色々できるアプリ。
UserDefaultを見れたりアプリのデータをリセットすることもできたり前述のRealmBrowserを開いたりもできる。
インストール後10日までのトライアルですが頑張れば延長できる。  
[SimPholders HP](https://simpholders.com/)
[SimPholdersの使い方](https://qiita.com/k-k-c/items/4b6f00b6c83908ce1bfb)

- Charles
通信内容を見たり書き換えたりできるアプリ。  
[通信系のデバッグには Charles が便利](https://qiita.com/usagimaru/items/d340e87da98e62f99b60)

- Network Link Conditioner
通信環境を意図的に悪くしたい場合に使うツール。シミュレーターで使用する際にはMacも同時に悪くなってしまうので注意が必要です。  
[[iOS][OS X] 「Network Link Conditioner」を使って iOS 端末または Mac の通信速度をシミュレートする](https://dev.classmethod.jp/smartphone/iphone/network-link-conditioner/)

## 機能

- TimeProfiler
データベースの中身を閲覧、編集できるアプリ。
あれ、何かここの動作重くね？って時にどの処理に時間がかかっているかを調べる時に使う機能。  
[XcodeのInstrumentsのTime Profilerを使って重たい処理を調べる](https://qiita.com/takusan_009/items/7c6962640435bc884b29)

- ブレークポイント
Xcodeのブレークポイントはただ止めて値などを見るだけでなく値を変えたり止めずにログを出したり色々できる。
またAutoLayoutのデバッグもできる。  
[知っておくと便利なXcodeのブレークポイントデバッグ術](https://qiita.com/caesar_cat/items/f03e37c543d3059e8776)
[Xcodeでデバッグ実行中にクラッシュした時に捗るブレークポイント設定](https://qiita.com/mono0926/items/bf70c7ef15db046ee163)
[AutoLayoutのデバッグをする（1）](https://qiita.com/akatsuki174/items/6935bb6ff64f4df51c5a)

- View UI Hierarchy
Viewを追加したはずなのに表示されてない！などの場合に。
Viewの階層やサイズ等色々見ることができる機能。  
[iOS AutoLayoutのデバッグテクニック(Xcode 7で導入されたIdentifierなど)](https://qiita.com/akatsuki174/items/45d4bd7cb150defbf116)

## 番外編

- Clipy  
クリップボード拡張アプリ。  
AndroidStudioだと`command + shift + V`で5つ前までの履歴からペーストができるのですがXcodeにはなく、スニペット等からもペーストできるのでXcode以外でも大活躍。  
[クリップボード拡張Macアプリ「Clipy」を公開しました](https://qiita.com/econa77/items/1848bf3fdfb7127ca9b8)

 
#### 最後に
とてもありきたりな記事になってしまいました。これもあった方がいいとか、こんな便利な機能もあるの知ってるよって方はコメントも待っています。
Amazon QuickSight ML Insightsについてざっくり調べてみた


この記事は株式会社ナレッジコミュニケーションが運営する Amazon AI by ナレコム Advent Calendar 2018 の6日目の記事になります。

#はじめに

今回は、先日開催されたre:Invent2018にてアップデート発表がされたAmazon QuickSight ML Insightsについてまだプレビュー申請中なので、わかる範囲で自分なりにまとめてみました。

#概要　
Amazon QuickSight ML Insightsは、これまで可視化だけだったAmazon QuickSight（以下、QuickSight）に機械学習のアプローチをかけられるようになる機能になります。「Amazon」で培ってきた機械学習技術を用いて、すべてのデータを継続的に分析し、様々なアクションを起こすことできます。次からは、具体的にどんなことができるのかをご紹介します。

#なにができるの？
具体的には、機械学習のアプローチをかけることでどんなことができるのでしょうか。
ざっくり分けると3パターンあるようです。その3パターンは以下のようになります。

異常検知：自動的に異常値を発見し、メールにてアラート発報
数値予測：過去のデータから将来の数値を予測
自動ナラティブ：ダッシュボード上に分かりやすい説明文を表示し、お客様がデータを理解する事をサポート

3パターンそれぞれでどんなことができそうか妄想してみました。

###異常検知のユースケース
M2Mのストリームデータを収集し、データを格納した際に収集したデータの中で異常な数値を発見した場合に
メールにてアラート発報を受信し、受信した作業員がすぐにデバイスのメンテナンスができたり、メール発報の前後の時間で異常を確認することができると想定されます。これまでは、こういった仕組みは、様々なサービスを組み合わせて、実現しておりました。今回の機能を使うことで、一部の流れまですぐに実装までいけるのではないかと思います。

###数値予測のユースケース
店舗ごとの売り上げを集計し、来月の売り上げを予測する際に、これまでは売上集計、データの見える化までのプロセスと予測の部分でフェーズが分かれることが多かったと思いますが、今回の機能であれば、集計から予測までをQuickSightに集約させることができるのではないかと思います。

###自動ナラティブのユースケース
これまでは、属人的なデータの説明になりがちになっていたためデータに対しての共通認識を組織内で構築するのは困難な部分があったのではと思いますが、この自動ナラティブは、機械学習がデータに基づきわかりやすい説明文を記載してくれるので、データに対して共通認識を組織内で持つことができるのではないかと思います。

#おいくら？
これまで紹介してきた機能を使えるようになったQuickSightですが、新機能は、どのぐらいの費用感で利用ができるのでしょうか。ここでは、料金についての説明をしたいと思います。

今回の新機能は、メトリクスがどのぐらい処理されたかで料金が変わってきます。
以下は、メトリクスごとの料金表になります。
![表.png](https://qiita-image-store.s3.amazonaws.com/0/321357/ad5b94f9-b92b-fc1a-a779-61b587931d64.png)
※メトリクス：測定基準、尺度、計量、距離などを意味する名詞

価格設定の例：
毎日20の異なる地域で提供している1000種類の製品の注文に関する異常を継続的に分析した場合。指定した月に処理されるメトリクスの合計数は、次のように計算されます。
1,000製品+ 20地域+（1000製品* 20地域）= 21,020メトリクス
*月間30,000回= 1月あたり630,600回（21020メトリクス*30000回）のメトリクスが処理されます。
630,600メトリクス/ 1000 *メトリクス処理あたりの1,000 * 0.50 = 1か月あたり315.3ドル。

いかがだったでしょうか。
今回は、re:Invent 2018にて発表があったQuickSightに機械学習のインサイト機能が追加されたことをざっくりですがまとめてみました。今回調べてみて早く触ってみたいと率直に思えました。
現在、プレビュー申請を行なっているので、プレビューが通りましたら、改めて、画面など紹介していければと思います。

プレビューは、以下のURLから行えます。プレビュー版は無料で利用できるみたいので、是非申請してみてく
ださい。
※プレビュー申請ページ
https://pages.awscloud.com/QuickSight-ML-Insights-Preview.html

最後まで読んでいただきありがとうございました。
それでは、また次回。

参考URL：https://aws.amazon.com/jp/blogs/news/amazon-quicksight-announces-ml-insights-in-preview/
Safari 12でサポートされたWebGL Shader Debuggingについて

#はじめに
Safari 12からWebGL Shader Debugging という機能が追加されたようです

[公式ページ](https://developer.apple.com/safari/whats-new/)を下に進むと....
![ 2018-12-05 20.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/199455/1dd41729-6293-acba-9c35-1ecdc1ec3ce2.png)
このように書いてありました

#とりあえず使ってみる

Developper Toolsを開くと，Canvasタブというのがあります
![ 2018-12-05 20.51.04.png](https://qiita-image-store.s3.amazonaws.com/0/199455/b15e62e6-eb86-995b-8aac-aec311a85ccf.png)
これをクリックすれば使えるようです

## Shadertoy見てみた

![ 2018-12-05 20.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/199455/85d34041-6875-4ab0-3860-170e589c8c29.png)

こんな感じになってます(右)
この画像でのCanvas 2がメインのCanvasで，他はテクスチャ表示するCanvasですね
これです
![ 2018-12-05 20.59.34.png](https://qiita-image-store.s3.amazonaws.com/0/199455/6617ee81-2f92-1019-00a9-86901015b3cb.png)

とりあえずcanvas 2をクリックします
するとこんな感じになります
![ 2018-12-05 21.01.20.png](https://qiita-image-store.s3.amazonaws.com/0/199455/bbedee82-f16b-9c8e-4575-5d3a3170ada5.png)
左がWebGLContextにリンクされたプログラムですね
右では使用メモリとか属性のonoff,使用している拡張機能が見れるようです

左のプログラムクリックしてみます
![ 2018-12-05 21.16.44.png](https://qiita-image-store.s3.amazonaws.com/0/199455/61ac92b2-ddab-5938-e2b5-2f5a3fb46bbf.png)
glslのコード見れるっぽいです
実際ShaderToyって最終的にこういう形で実行しているんだなあと
![output.gif](https://qiita-image-store.s3.amazonaws.com/0/199455/ac049fcb-89db-84e7-bdda-e44738b57431.gif)
コードいじるとリアルタイムに描画結果も変わります
ライブプログラミングできる
すごい

左上の赤丸をクリックしますと，

![output2.gif](https://qiita-image-store.s3.amazonaws.com/0/199455/d9a0c4f0-1604-b3c7-4c9b-94311b26c5a9.gif)

何やら録画のようなことが行われます

![ 2018-12-05 21.55.18.png](https://qiita-image-store.s3.amazonaws.com/0/199455/656327f9-b073-81ec-22ae-cf1be92736ec.png)

処理が終わるとこのような状態になり，1フレームごとの画像が見れるらしいです
そして例えばフレーム1をクリックすると

![ 2018-12-05 21.56.50.png](https://qiita-image-store.s3.amazonaws.com/0/199455/af46938b-c8e5-5db7-7915-19a131aa5163.png)

こうなります
つまり，そのフレームの時に何がどういう順番で実行されていて，glsl側に具体的にどんな値が送られているか見れるんですね

#所感
WebGLのデバッグツールって今まで使ってこずに開発してたけど，ブラウザの標準で提供されるのめっちゃいいですね，使っていこうと思います
Jenkins上で開いたdoxygenのHTMLでインデックスメニューが表示されない問題の解決策

## 結論

Jenkinsをインストールしたフォルダにある`jenkins.xml`を編集して、起動オプションを追加します。
私自身の備忘のため記事にさせていただきます。

```sh
-Dhudson.model.DirectoryBrowserSupport.CSP=""
```

```xml:jenkins.xml（追記前）
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
```

```xml:jenkins.xml（修正前）
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dhudson.model.DirectoryBrowserSupport.CSP="" -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
```

## 具体的に

doxygenのHTMLでインデックスメニュー（上部タイトル下に表示されるメニュー）が表示されないのは、ブラウザ上でjavascriptが実行されていない？のが原因みたいでした。
以下の2つの記事を参考に、Jenkins上でjavascriptの実行が抑制されないよう起動オプションを設定するという方法にたどり着きました。
ちなみにこの方法でもJenkinsを`http://localhot:8080/`で実行しているとうまく表示されず、IPアドレスだと大丈夫でした。

私の理解が間違っているところもあると思いますのでご指摘等あればぜひお待ちしております。

## 参考

- [JenkinsのHTML Publisher pluginで \`Blocked script execution in <URL>. because the document's frame is sandboxed and the 'allow-scripts' permission is not set`となって、画面の一部が表示されない場合の対応方法](https://qiita.com/koara-local/items/f487bea89e56d49c6066)
- [Windows に Jenkins さんをインストールした](http://kawachodev.hatenablog.jp/entry/2013/07/20/151659)
floatとdouble, intとlong

64bit整数型が遅い理由
https://teratail.com/questions/105014

という記事を拝見した。

C/C++で記述する際に、型を何にするか、
型の変換を途中でするかどうかを検討。

#検討事項1

from a_saitoh
「
・足し算引き算はintが最速。他のビット長はintと同じか遅い。
・かけ算はintが最速かどうかはCPU次第。
・整数の割り算はビット長が長いほど手間がかかる
」

#検討事項2

from asm
「インテル® 64 アーキテクチャーおよび IA-32 アーキテクチャー最適化リファレンス・マニュアル(の参考訳)によると

アセンブリー/コンパイラー・コーディング規則 63 (影響 H、一般性 M): 64 ビット・モードでは、64 ビット・データや追加レジスターへのアクセスに 64 ビット版の命令が必要な場合を除き、32 ビット版の命令を使うことでコードサイズを削減します。」


https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-optimization-reference-manual
"page 10-1
Assembly/Compiler Coding Rule 63. (H impact, M generality) Use the 32-bit versions of instructions in 64-bit mode to reduce code size unless the 64-bit version is necessary to access 64-bit data or additional registers."

Intel Assemble/Compiler Coding Rule 英日対訳比較検討(まだ途中まで)
https://qiita.com/kaizen_nagoya/items/eb04b998224047a32ef1

#検討事項3 alignment
型の大きさがちがうと、alignmentをかんがえておかないと、
読み書きが遅くなる可能性がある。


#検討事項4 cache
キャッシュをOn/OFFするかどうか、
一次キャッシュ、二次キャッシュなどの設定状況。

#検討事項5 型変換
整数型、浮動小数点型との間の変換を含める。

#文書履歴
ver. 0.10 初稿 20181206午前
ver. 0.11 追記 20181206午後
JDLAのG検定試験のコツと所感

#背景
AI関連の業務をすることが多くなり、知識を整理するとともに抜けている知識がないか確認したいため、G検定を受験することにした。第三回試験を受けてみたところ合格したので、学習と試験のコツと所感を書く。

G検定とはなんぞやという方は[こちら](https://www.jdla.org/business/certificate/)

-----------

#著者の状況
- web/アプリ系のエンジニア、最近AI(画像解析周り)を業務で行っている
- 理学部卒、大学レベルの数学であれば予習不要
- AIの歴史や法律などは興味の範囲で把握している程度

-----------
# 教材
- ディープラーニングG検定公式テキスト
 - がっつり読み込む
- AI白書2017
 - 流し読み
- 深層学習(青本)
 - 不使用
- 人工知能は人間を超えるか-ディープラーニングの先にあるもの
 - 不使用(発売間も無く読んでいた）

過去問も特に利用せず。

-----------

#学習内容
- G検定公式テキストを中心に学習(ほぼこれだけ)
- 目次をスプレッドシートに写し、理解度と要点をメモ。
- 電車の通勤時間（片道45分くらい)を述べ１週間くらいダラダラと流し読み。
- テキストを全項目100パーセント理解するまで繰り返す。(2周速読+3周精読)
- 知識の補強のため、AI白書2017を流し読み (3周速読)
 - 公式テキストでは足りないアルゴリズム/ビジネス事例を中心に補強

-----------
#内容理解とコツ
公式テキストによると、内容は８章に分類され、大まかに分類すると以下のようになる

1.DL概要(1章、2章、3章)
2.DL以前の手法(4章)
3.DL(5章、6章、7章)
4.DLと社会(8章)

1.と4.は暗記科目と割り切って覚えてしまう。テキストを周回すれば記憶できるが、人名や学会名が紛らわしい場合はwikipedia等で深掘りして詳しく知ることで記憶を定着させる。

2と3については、手法が進化しながら課題を克服していく過程を理解することがコツ、時代の流れとともにストーリーとして把握する

- 手法の名称とその由来(略称なら正式名)
- その手法が新たに解決する課題
- その手法が課題を克服するために採用したメカニズム
- その手法が新たに提起する課題

-----------

# 試験とコツ
- web試験なので持ち込み可なので、いつでも調べられるようにしておくと良い。Kindleの公式テキストは検索できて良い。
- 問題数が多く全て調べながらでは間に合わなくなるので、暗記量を多くして即答できる問題数を増やしていき、調べるのに時間がかかる問題は思い切って捨てる
- 回答のペースを意識しながら時間切れを回避する

-----------

# 所感
- 団体の出自的に、大学の教養科目を一般に開放したような内容なので教養にはなるが実務とは乖離がある
- AIジェネラリストに期待されるのは、通常のソフトウェア開発とAI開発との企画/推進する上での差分を理解していることだと思われる。その意味ではG検定は物足りない。
- データ取得やクレンジング、アノテーション作成、納品条件の設定方法などはAI開発は通常のソフトウェア開発とギャップがありプロジェクトへの影響が大きいので、これらの項目にもっとウェイトがあったほうが良い
- また、ビジネス事例集も、単に列挙するだけでなく、企画する上でのポイント、DeepLearningを使うべき/べきでないの区別や、適応先の見つけ方などがよりわかりやすいと良い
- G検定で実務に役に立ちそうなのは、アルゴリズムの理解は深まるのでエンジニアから説明を受けた際に手法の狙いやメリデメを把握できること
- エンジニアには簡単だが、ビジネスマンにはメリットを感じにくくモチベーションを保ちにくい試験だと思う。
- 試験料は試験内容の割に高いと思う。5000円くらいにしたら受験者も増えるのでは。
CircleCI でRuboCopがError: Unsupported Ruby versionとかおっしゃる

#CircleCIでRuboCopが動かん
CircleCIでRuboCopを動かそうとすると下記エラーが出力されて動いてくれませんでした。
ローカルでRubocop走らせたら正常にチェックしてくれました。

```
#!/bin/bash -eo pipefail
bundle exec rubocop
Error: Unsupported Ruby version 2.1 found in `TargetRubyVersion` parameter (in vendor/bundle/ruby/2.5.0/gems/rainbow-3.0.0/.rubocop.yml). 2.1-compatible analysis was dropped after version 0.58.
Supported versions: 2.2, 2.3, 2.4, 2.5, 2.6
Exited with code 2
```

0.58以降のRuboCopはRubyのバージョン2.2, 2.3, 2.4, 2.5, 2.6しか対応してませんよ、ということらしいです。

#バージョンちゃんと指定してんじゃん
とはいえ、CircleCIのコンフィグでちゃんとバージョンを2.5.1に設定しとるんですよ。

```circleci/config.yml
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
       - image: circleci/ruby:2.5.1-node-browsers 　# <-ほら

```

#こうやったらええよ
結果としてRuboCopのコンフィグを編集することで解決できました。

```.rubocop.yml
AllCops:
  TargetRubyVersion: 2.5.1
  Exclude:
    - 'vendor/**/*'
```

#なんでそうなるの
CircleCIの仕様上、gemたちはvendor/bundle配下にインストールされるそうです。
で、その中にRuboCopがつかっているrainbowとかいうGEMがあります。
rainbowは使うRubyのバージョンを独自で定義しているみたいで、そのバージョンがRubocopの対象外
ということみたいです。確かにエラーメッセージにも`in vendor/bundle/ruby/2.5.0/gems/rainbow-3.0.0/.rubocop.yml`て書いてありますしね。
だから、と記載して、Rubocopの`TargetRubyVersion:`でRubyのバージョンを指定し、`- 'vendor/**/*'`でvendorディレクトリ配下のチェックをスキップするようにしたら解決したのですね。めんどくさいですね。

しかしそれならrainbowがローカルでも悪さをしてRubocop失敗しないのかな。。という不思議。
ワンライナーでldapsearchの結果表示をいい感じに日本語表示(base64デコード)する

#前提
・CentOS7系のOpenLDAPを使用

#コマンド
以下内容でldapsearchを実行すると、通常base64でエンコードされている内容がきれいにデコードされた状態となります。
※ldapsearchコマンドの各オプションは適宜編集してください。

~~~
ldapsearch -x -D "cn=Directory Manager,dc=hoge,dc=local" -h localhost -w hogehoge -b dc=hoge,dc=local uid=hoge | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print'
~~~
C++ Builder | Rad Studio > IDEのバージョンとサポート期限

IDEのバージョンとサポート終了期限

http://support.embarcadero.com/article/37740
表に記載の日時に関する説明がないが、Active, Passive, De-Supportedになる日付と思われる。

例としてXE8の場合

- Active: 2015年4月に終わり
- Passive: 2015年9月に終わり
- De-Supported: 2017年3月に終わる

Rioについての記載はまだない (2018-12-06現在)。

Passiveなどの意味については下記に記載。
http://support.embarcadero.com/article/39919

Tokyoに関しては2018年12月31日になんたら、という情報はここには記載ない。
文書の最終更新日の記載もない。
QGISとかその辺に関するチャットへのお誘い

# はじめに
はじめに、というかいきなり結論ですが、みんな大好きなQGISに関する雑談などを行う場としてdiscordサーバーを立てました。
↓参加者募集中ですので以下のURLからぜひご参加ください！↓
https://discord.gg/J8TAwv8

# 経緯とか
- [QGIS初心者質問グループ](https://groups.google.com/forum/#!forum/qgisshitumon01)というサイトがあります（QGISユーザーの方なら一度は見たことがあるはず・・・！）。
私も頻繁にお世話になっているのですが、こちらで質問したりたまに回答したりしているうちに、「質問以外の情報交換とかちょっとしたネタとかで雑談できたら楽しそうだなー」と思い、グループに「チャットって需要ありますかね？」と投げたところ、賛同してくださった方たちがいらっしゃったため始めてみた、という格好です。
- 11/4に立ち上げて以降、現時点で25名が参加しています！

# あらためて参加のお願いなど
QGISだけでなく、ジオ系の話題なら何でもOKのチャットです。
もちろんスキルも問いません。
参加者が多ければ多いほど面白くなると思いますので、興味のある方はぜひ参加してみてください！
 
↓参加は以下のURLから！ぜひお願いします！↓
https://discord.gg/J8TAwv8
JMeterでBeanShellを使ったときのメモ

JMeterでテストを作成していると、痒いところに手は届くがその指先には爪がない、のような、絶妙なソフトタッチに驚かされることがある。褒めてない。

JMeterには定数をあらかじめ設定しておける機能があり、定数の扱いは比較的簡単である。
しかしせっかくのテストで複雑なパラメータを作成したくなるのは世の常であり、Jmeterも当然プログラム処理を行った結果を変数として扱う方法が用意されている。そのひとつ、**BeanShell PreProcessor**にも何度か驚かされることがあった。

JMeterは5.0です。

### 使用例
~~~Java
String a = vars.get("A");
vars.put("B", a + "B");
~~~

例えばあらかじめAという変数を設定しておくと、その値をハッシュ的に`vars.get()`で取得できる。
`vars.put()`での置き換えや、他の変数を作成することも可能。

---

### スレッド番号の取得
定数なら`${__threadNum}`で宣言できるところだが、スクリプト上での取得はどうすればよいのか。
やれやれ。僕は検索した。

**[Jmeter. BeanShell PostProcessor](https://stackoverflow.com/questions/24999312/jmeter-beanshell-postprocessor)**

~~~Java
int threadNum = ctx.getThreadNum();
~~~

BeanShellではこう書けばよろしい。0始まりだったので注意。

---

### 文字列の数値変換
文字列だって数値置換したい。

~~~Java
String hoge = "100";
Integer.parseInt(hoge);
~~~
とやるとエラーになってしまった。やれやれ。

**[Beanshell Integer.parseInt() errors](https://stackoverflow.com/questions/24457500/beanshell-integer-parseint-errors)**

~~~Java
String hoge = "100";
Integer.valueOf(hoge).intValue();
~~~

よくわからんが、まあよい。

---

### 数値の0パディング
~~~Java
String hoge = "100";
String.format("06%d", hoge);
~~~
とやるとエラーになってしまった。
……。

**[Generating sequence number in Beanshell scripting](https://stackoverflow.com/questions/20400103/generating-sequence-number-in-beanshell-scripting)**

~~~Java
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("000000");
String hoge = "100";
df.format(hoge);
~~~

上記だと000100が得られた。

---

といった塩梅で、比較的手軽なツールなうえに色々と細かいことも設定可能なのは非常にありがたいものの、いざ手を入れ始めるとしょうもないところにトラップがあったりして、別の箇所でむず痒さを覚えてしまうこともしばしば。それでも慣れたら楽ですが。
10年物システムの裏側

この記事は[リクルートライフスタイル Advent Calendar 2018](https://qiita.com/advent-calendar/2018/recruitlifestyle)の6日目の記事です。

@tunanosuke です。今年リクルートに入社し、今はホットペッパービューティーの開発をしています。
ホットペッパービューティーはサービスリリースされてから10年以上たつプロダクトです。ビジネスとしては大きな成功をしている一方で、技術的には負債だらけです。これまで社内のエンジニアが少ない中プロダクトの成長を優先してきたという背景もありますが、少しずつ整備をしている段階です。そんな10年物システムが今こうなってるんだという裏側と今どう整備しているかを少しご紹介します。

## 現状

### テーブル、カラム名がローマ字

結構な頻度で出てくるローマ字。そしてたまに省略されている。たとえば `予約` というワードに対して

- `YOYAKU`
- `YYK`

といったような表現方法が存在していて、さらにアプリまでそのまま返されてるとかある。
ローマ字ならまだ理解できるから許容？できても省略はなかなか厳しい。
ただ、もうここを変えるのは大きなコストとリスクを伴うので、変えられるものと変えられないものを切り分けて、変えられないものについてはできるだけ近いところで塞き止めすることが大事ですね。今そのように整備しています。

### 1テーブルのカラムの数がすごい

横に長い、とにかく長い、、
ただ、RDB考える時まずは横にどう持つかってことから考えることが多いと思うので気持ちはわかる。機能を継ぎ足し継ぎ足しで拡張してきた成果が見えます。
フラグがたくさんあり、1つのテーブルでいくつもの状態を管理しているので、それに引きづられてアプリケーションコードも複雑になっている状態です。一方で「えっ? ここは正規化するんだ」ってのもあり、いろいろ意図を推測しながらやっています。

結構この推測できることには救われることは多くて、細かい視点でツッコミどころはあるにせよ、なんでそうしたんだろうとか、なんでそうなったんだろうとか、なんとなーく意図は読み取れます。もちろん当時の設計者やドキュメントがあればそれに越したことはありませんが、これまで社員にエンジニアがいない、少ない中やってきたのでそれはできないです。なので、「まぁそうしたくなるよね」って感じられる状態なのはまだ救いだなと感じてます。

### サブクエリ ジョイン ジョイン サブクエリ ジョイン ユニオン

縦に長い、とにかく長い、、そりゃ1回で取れたら楽、やるやる
ホットペッパービューティーは様々な方々が関わってきて機能が拡張されてきました。結果、場当たり的な設計になってしまっていて統一性がありません。そのため、O/Rマッパー使ってマッピングして ok ってなるようなデータ構造ではないし、かと言って SQL 1回で取るにもなかなか無理がある状態です。結果スロークエリとして1つの負債になっています。
おとなしく SQL 分割してアプリケーション側で自分達に合った構造にマッピングしてあげるレイヤーをアプリケーションに持たせることが今のプロダクトには適切で、ここも1つ1つ整備しているところです。

### 大量のバッチ

バッチチームがあります。つまりそれくらいあります。
バッチ大好き!

もうできてしまったのは仕方ないとして、一番難しいのはどのバッチがどのデータに影響あるのか把握すること。参照ならまだ良いにしろ、なにをトリガーにどのデータに対して更新があるかは見えにくい状態です。更新処理の走るバッチが Master DB のテーブルをしばらくロックしてしまうなんてことも、、んっ?

### API 設計

まず前提としてホットペッパービューティーは大きく2つのサービスからなっています。

- ヘアサロン
    - 美容室の検索や予約ができる
- キレイサロン
    - エステやリラクゼーション、まつげなどのサロンの検索や予約ができる

このヘアとキレイは性質が異なっていてドメインが全く違います。それを1つのサービスとして展開しています。
それに引きずられるように API のエンドポイントもヘアとキレイが区別されていないことが多いです。性質が違うので必要なデータやレスポンスデータもヘアとキレイで異なるので、アプリケーション内には多くとヘアキレイ分岐があります。美容のサロンという意味では同じ属性も多く存在しますが、異なるドメインを1つで表現することは今後を見据えたときに厳しいですね、、
今はここを明確に分離するように設計をしている段階です。

### リソース取得時に POST メソッド

:thinking: 

リプレイスなど過去の負債を解消するためには、プロダクトの歴史やそうなった経緯など把握することはとても大切ですしそれをしないと改善はできませんが、ときには敢えて深追いしないという判断をすることも必要だったり。これはそういったケース。

## 今後の展望を少しだけ

![sda replace.png](https://qiita-image-store.s3.amazonaws.com/0/28571/76eaabe4-fac7-1d7f-569e-6ef5cace5d1d.png)
これまでのモノシリックなアーキテクチャから BFF - Backend 構成にリプレイスを進めています。Backend はこれまで通り Java、BFF は Kotlin を採用しています。
Backend に変えられない負債をできるだけ閉じ込めて各プロダクトからシンプルに見えるようにすることが肝です。
このあたりの詳細については今後弊社エンジニアブログでも発信していこうと思います。

## まとめ

ここに挙げたのはほんの一部です。こういったことがたくさんあります。一方でプロダクトととしてものすごい成長を遂げてきたのはすばらしいですし、それに感謝しつつ今後を見据えたアーキテクチャに変化させていこうと思います。
作業用BGMでも優秀なAmazonMusicUnlimited

適当にプレイリスト聴いていたら、
オススメ曲の精度が向上したような。

プレイリストはシェアできるので、好みの曲が入ってるリストは
おのずと好みの曲になってしまします。

いまは作業用にAmazonMusicUnlimitedつかってます
アレクサとの相性もいいですね

どうでもいいですが、いいなと思ったので
https://straightedgestyle.com/amazon-music-unlimited/
Angularのコンポーネント間データ授受の種類


コンポーネントやテンプレート間でどうやってデータをやりとりするかのクイック・リファレンスをまとめました。
すでにAngularを理解している人向けです。


##コンポーネントからテンプレートへ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/e657cf59-f38d-2635-:point_up_tone5:543e-338f0680a36c.png)

##テンプレートからコンポーネント

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/b740b398-bf9e-daca-fe91-5b9281d6174d.png)

##子コンポーネントからテンプレートへ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/a151e6b2-ebd0-916a-d625-b5d0bd0ede4b.png)


##子コンポーネントから親コンポーネントへ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/ddb45714-8e93-bbb6-96ba-8bf5ed0df4ca.png)

##テンプレートから子コンポーネントへ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/b30229a9-d5a2-1afd-6d7e-5d369688d63e.png)

##親子関係以外のコンポーネント間

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/031931ca-2745-c719-f5d3-8054687a3746.png)

##親コンポーネントから子コンポーネント参照

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/11d130f5-d331-49ac-9afc-f6a5c3f10a55.png)

##テンプレート内コンポーネント参照

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/b392f258-fa7b-c494-fabc-c8844af5a295.png)

##テンプレート内要素参照

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/88e3c8d3-34f4-7539-8a97-0544489dc188.png)

##親コンポーネントから子テンプレート参照

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/a156e724-0218-624e-ce56-223d22082968.png)
Choregraphe 2.8.3.54の日本語表示について

はじめまして。
NAO V6用のChoregraphe 2.8.3.54をダウンロードしたのですが、
英語表示から変更できずにいます。
Edit>Preferences>Languageを日本語に変更し、Choregraphe 2.8.3.54を再起動したのですが、
英語のままです。
どなたか、対応方法をご教示ください。
WIN8.1です。
Cognos リストの結果行数が少ない場合にリスト自体を表示しない

#レポートの実行動作

リストにCognosのサンプルから「製品ライン」「年」「数量」を置いています。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/53694f71-63fa-5088-bda9-1b0c741aabea.jpeg)

レポート実行時にプロンプトで、製品ライン全てを選択すると
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/96cfe2d9-af84-c725-4b06-8595f6155419.jpeg)

行数は、19行で全てが表示されます。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/dbbbc317-c2fa-8294-4f66-c7cf56cae89f.jpeg)

プロンプトを「アウトドア用保護用品」に選択して実行すると、結果は4行が返ってくるはずですが、
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/433d5357-bf57-a79f-81fb-282cae23851d.jpeg)

リストそのものが表示されません。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e2e60108-254e-ef0a-c2f4-24fc6fc0ef10.jpeg)

#レポートの実装

リストのクエリーの中で、行数を取得するために、以下の計算式でデータアイテム(行数)を作成しています。
total(count([製品ライン]) for report)

![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7f30787d-b919-e0ce-73a6-395f92ce5bb9.jpeg)

リストのプロパティの「データ」→「プロパティ」で、「行数」にチェックを入れます。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ba71ada7-5ec0-0da5-9e0f-7cc8f815cebb.jpeg)

リストの「条件付きスタイル」で、条件として[クエリー1].[行数] < 閾値、スタイルの「ボックスのタイプ」を「なし」に設定する事で、行数が閾値以下の場合リスト自体を非表示とする事ができます。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/6e81577a-7268-6c42-938f-f07fa3b7f72c.jpeg)
シェルスクリプト関数の変数に初期値を設定する

メモ

## やりたいこと

シェルスクリプトで関数を作成して引数を設定する場合以下のようにする


## 変数に初期値を設定する

変数に初期値を設定すること自体はごく簡単

```sh
hoge1 () {
  str=""
  echo ${str:-hello}
}

hoge2 () {
  str="foo"
  echo ${str:-hello}
}
```

これで以下のように実行する

```
$ hoge1
// 結果：hello

$ hoge2 foo
// 結果: foo
```

## やりたいこと

実行時の引数の`$1`に初期値を設定させたい

以下のようにすると実行出来る

```
hoge () {
  echo ${"${1}":-hello}
}
```

実行する

```
$ hoge
// 結果：hello

$ hoge sunsun
// 結果：sunsun
```
PHPのrequireが僕の思った動作ではなかったお話

同僚にPHPの質問をされて、あれって思って調べてみたら僕の思った`require`の動作とは違ったので、それを記事にして皆さんにお伝えします。

# まず、以下のコードが実行できない。

- test.php
- req1.php
- req2.php

という3つのPHPファイルがあります。

```test.php
<?php

ini_set('display_errors', "On");

require 'req1.php';
require 'req2.php';

echo 'hello<br>';
echo sayHello();
echo sayHello2();
```

```php:req1.php
<?php

require 'req2.php';

function sayHello() {
    return "called sayHello<br>" . sayHello2();
}
```

```php:req2.php
<?php

function sayHello2() {
    return "called sayHello2!<br>";
}
```

ここで重要なのは、`req2.php`を`require`しているのは`test.php`と`req1.php`の2つのPHPファイルだということです。

これを実行してみると、以下のエラーが出ます。

```
Fatal error: Cannot redeclare sayHello2() (previously declared in /xxxxxx/test.php:4) in /xxxxxx/req2.php on line 5
```

どうやら、`sayHello2`が複数回宣言されているためエラーしているようです。ですが、複数回`sayHello2`を宣言した覚えはありません！

# 原因は、requireにあった

まず、`test.php`は`req1.php`と`req2.php`をrequireすることで、以下のように変換されるはずです。

```php:test.php
<?php

ini_set('display_errors', "On");

//require 'req1.php';
require 'req2.php';

function sayHello() {
    return "called sayHello<br>" . sayHello2();
}

//require 'req2.php';
function sayHello2() {
    return "called sayHello2!<br>";
}

echo 'hello<br>';
echo sayHello();
echo sayHello2();
```

この状態ではまだ`require 'req2.php';`が残っているので、それもrequireすると、

```php:test.php
<?php

ini_set('display_errors', "On");

//require 'req1.php';
//require 'req2.php';
function sayHello2() {
    return "called sayHello2!<br>";
}

function sayHello() {
    return "called sayHello<br>" . sayHello2();
}


//require 'req2.php';
function sayHello2() {
    return "called sayHello2!<br>";
}

echo 'hello<br>';
echo sayHello();
echo sayHello2();
```

といった状態になるはずです。こうしてみると、`test.php`内に`sayHello2`関数が2つも宣言されていますね。これではエラーするのも当然です。

# require_onceを使えば解決

ではどうやってこの問題を解決すればいいかと言いますと、[require_once](http://php.net/manual/ja/function.require-once.php)を使って一度だけしかPHPファイルを読み込めないようにします。

```php:test.php
<?php

ini_set('display_errors', "On");

require_once 'req1.php';
require_once 'req2.php';

echo 'hello<br>';
echo sayHello();

echo sayHello2();
```

```php:req1.php
<?php

require_once 'req2.php';

function sayHello() {
    return "called sayHello<br>" . sayHello2();
}
```

```php:req2.php
<?php

function sayHello2() {
    return "called sayHello2!<br>";
}
```

として`test.php`を実行してみるとエラーなく実行されて、以下のように表示されます。

```
hello
called sayHello
called sayHello2!
called sayHello2!
```

## require_onceがうまくいく理由

先ほどのように、require_onceした時にPHPの文がどのように展開されるかを見れば理解できると思います。

まず、`test.php`は`req1.php`と`req2.php`をrequireします。

```php:test.php
<?php

ini_set('display_errors', "On");

//require_once 'req1.php';
require_once 'req2.php';

function sayHello() {
    return "called sayHello<br>" . sayHello2();
}

//require_once 'req2.php';
function sayHello2() {
    return "called sayHello2!<br>";
}

echo 'hello<br>';
echo sayHello();
echo sayHello2();
```

で、この次に`require_once 'req2.php';`が実行されると思いきや、既に`req2.php`は`require`済みなので再度読み込みはしません。

よって、`sayHello2`関数は一回だけしか宣言されないのでこのプログラムは正しく実行できます！

# 結論

`require_once`を使いましょう！

# 参考

[require(公式ドキュメント)](http://php.net/manual/ja/function.require.php)
[require_once（公式ドキュメント）](http://php.net/manual/ja/function.require-once.php)
現役大学生がpython3エンジニア認定基礎試験を受験した感想

#Python 3 エンジニア認定基礎試験とは？
Pythonエンジニア育成推進協会によって実施されている民間資格です。
概要：文法基礎を問う試験
受験料金：1万円（外税）　学割5千円（外税）
問題数：40問（すべて選択問題）
合格ライン：正答率70％
大学生は学割があり半額になるということなんで早速受けてきました。
#結果
925点(40門中37問正解)とまずまずな結果。
![gokaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/267562/a0c74594-3e0f-d2fa-9487-8e6381c817cf.jpeg)
データ構造・入出力・仮想環境とパッケージで各一問ずつ間違えてしまったようです
しかしどの問題で間違えたのかわからないので今でも少しもやもやしています。
#勉強法
合計時間は約10時間ほどだったと思います。
とりあえず受験1週間前に教材である「pythonチュートリアル第3版」を購入し1周パラパラと読み進めました。
そこで分からなかった単語などを調べ知識の整理と内容の把握を行いました。
私はclassのセクションが苦手だったためチュートリアルのコードを打ち動作を確かめました
また[Dive into Code](https://diver.diveintocode.jp/exam)にて模擬試験が公開されています。この模擬試験を三回ほど受けました。
この模擬試験は実試験にとても近いので一番役に立ったと思います。
#受験当日
私は10時に試験開始でした。行きの電車の中で教材をパラパラと読み最終チェックを行い20分前に試験会場につきました。
試験会場につくと受付の方から説明があり準備をしパソコンの置いてある部屋に案内されました。
大体15分程度で試験は終わりました。その場で合否が分かるのでとても安心しました。
#感想
難易度的には少し簡単すぎでは?というレベルでしたが改めて基礎を勉強できたので良い経験となりました。
気が向けばいつでも受験ができ,学生は学割もあるので興味を持たれた方はぜひ受けてみてはいかがでしょうか。
また2019年公開予定である「python3エンジニア認定データ解析試験」も楽しみにしています
Front-endで組み立てる、マイクロサービスでのVuexを使ったデータリレーション管理

もともと想定していなかった使い方ではあったけれど、[Vuex](https://github.com/vuejs/vuex)、そしてVuexのプラグインである[Vuex ORM](https://github.com/vuex-orm/vuex-orm)を使って、マイクロサービスなアプリにおけるデータの面白いリレーション管理ができた。

一体全体どういうことなのかというのを書いてみる。何かの参考になれば幸いだ。

## マイクロサービスの構成

マイクロサービスというと、システムやアプリが必要とする機能（サービス）を、細かく分けて構築する、例えば認証を担当するサービス、記事を管理するサービス、通知を管理するサービス、といった具合に。もちろん、一口にマイクロサービスといっても定義はまちまちだし、特に構成となると千差万別だが、少なくとも大まかなコンセプトはこういうことで大きく間違ってはいないはず。

まずは、今回僕が作った構成を説明する。繰り返しになるが、これが「あるべきマイクロサービスの姿」などと言うつもりは全くない。あくまで今回作ったのがこうだった、と言うだけだ。

1. **Front-end** – [Nuxt](https://nuxtjs.org/) で作られたフロントエンド。
2. **Auth / Proxy Service** – 認証、およびAPI Gateway。
3. **Resources Service** – 記事などを管理するサービス。
4. **Form Service** – 投稿などを管理するサービス。
5. etc.

といった具合だ。基本的に、Front-endは(2)のAuth / Proxyサーバに向かってリクエストを投げると、認証を行なった後、そのリクエストに対応したサービスへとディスパッチされる。認証機能とAPI Gatewayを分ける構成もよく見られるが、ここでは特に影響もないので1つにした。

また、各サービスは言語・フレームワークが異なってもよく、サービスごとに別のDBを持っている。重要なのはこのサービス毎に別のDBを持っていると言う点だ。

例えば、Authサービスは`users`や`roles`テーブルを持っている。Resourcesサービスは`posts`や`tags`を持っている。それぞれ別々のコンポーネントなので、Resourcesサービスはユーザ情報などにアクセスできない状態だ。

とはいえ、記事には著者が存在するため、APIとしては、Postの情報と、そのPostにひもづくユーザ情報を返す、という形になるかと思う。と言うことは、API Gatewayがその「結合」作業を行うのか、はたまた別のところでやるのかはさておき、ともかくそう言う事が必要になる。

## リレーションをFront-endで組み立てる

さて、今回Front-endでVuex ORMを採用したが、このライブラリはリレーションを持ったデータを分解（Normalize）してVuexのStoreに保存し、Vuex Gettersを使って再度組み立てたり、フィルターしたりするものだ。Pluginの詳細は[こちらの記事](https://qiita.com/kiaking/items/bcd5360fb3106cf22a81)を参照。

これを使うと、ちょっと面白い事ができる。ここではシンプルにResourcesサービスから記事を取得して、表示するという状況を考える。

まず、Resourcesサービスは、自身のDBに記事と、その記事に紐づくユーザのIDだけを保持している。APIからのレスポンスはこんな感じだ。

```js
[
  { id: 1, user_id: 1, title: '...' },
  { id: 2, user_id: 1, title: '...' },
  { id: 3, user_id: 2, title: '...' }
]
```

さて、画面にはユーザ（記事の著者）の名前も表示したい。ので、普通に考えるとこういうレスポンスが欲しい。

```js
[
  { id: 1, user_id: 1, title: '...', user: { name: 'John Doe' } },
  { id: 2, user_id: 1, title: '...', user: { name: 'John Doe' } },
  { id: 3, user_id: 2, title: '...', user: { name: 'Jane Doe' } }
]
```

今回のマイクロサービスだと、誰がこのユーザ情報を記事に紐づけるのか？ という問題がある。ところが、今回Vuex ORMを利用しているため、このリレーション管理をFront-endで行う事ができる。コードで書くとこんな感じだ。

```js
// Back-endからデータを取得。
const users = await Api.get('/api/users')
const posts = await Api.get('/api/posts')

// Vuex ORMを使ってデータをVuexに保存。
store.dispatch('entities/users/insert', { data: users })
store.dispatch('entities/posts/insert', { data: posts })

// Vuex ORMを使ってリレーションを組み立てた状態でデータを取得。
const postsWithUsers = store.getters['entities/posts']().with('users').get()

/*
  [
    { id: 1, user_id: 1, title: '...', user: { name: 'John Doe' } },
    { id: 2, user_id: 1, title: '...', user: { name: 'John Doe' } },
    { id: 3, user_id: 2, title: '...', user: { name: 'Jane Doe' } }
  ]
*/
```

もともとこういう事がしたくて作っていたわけではないのだが、意識せずやってたらこんな事ができていた。やりやすいなと感じたのは、バックエンドは本当に自分のサービスのデータにだけ集中できる、という点だ。複数のレスポンスをいい具合に組み合わせる新たなBack-endのサービスも必要ない。

もっとも、あらゆるシステムにおいてこれが最善とは思わない。例えばユーザが100人程度いるだけで、全ユーザを予め取得してなんてやっていくのもおかしい。Front-endから投げるリクエストも2回に増えるという話もある。今回僕が作ったものではこれで良かったというだけで、全てのサービスをこうするべきという話ではない。

## 最後に

Vuex ORMはマイクロサービスのために作られた、という訳でもないけれど、こういう使い方もできるんだなという事が知っていただければ幸いだ。データ構造によってはちょっとしたものをこういう風にFront-endで組み立てるというのはなかなか爽快な場面もある。もし興味があれば試してみて欲しい。
Amazon LightsailにLet's Encryptを導入してSSL化する

[前回の記事](https://qiita.com/yshishido/items/83ddae0baa5759a2fcd2)で構築したLightsailににLet's Encryptを導入してみる。

今回は、テスト環境なのでELBを利用したSSL化ではなく、Let's EncryptをLightsailに導入する方法に。
certbotを利用したサイトが結構あったのですが、うまく行かなかったので[Bitnami公式のドキュメント](https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/)に沿って導入。

Webサーバーは**Apache**を利用。

特につまづく事もなかったのですが、導入方法を調べるのに少し苦労したので記載しておく。

基本的には、ドキュメントの通りで。

# Lego Clientのインストール

```shell
cd /tmp
curl -s https://api.github.com/repositories/37038121/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -
tar xf lego_{ダウンロードしたバージョン}_linux_amd64.tar.gz
sudo mv lego /usr/local/bin/lego
```

# 証明書の発行

## Bitnamiのサービスを止める

```shell
sudo /opt/bitnami/ctlscript.sh stop
```

## 証明書の発行

```shell
sudo lego --email="{メールアドレス}" --domains="{ドメイン}" --path="/etc/lego" --tls run
```

試していはいないが、```--domains```オプションで複数のドメインの指定が可能。指定した複数のドメインに対して1つの証明書が発行されるらしい。例えば、www有りと無しでドメインを指定すれば、www付きとwww無しの2つで1つの証明書が発行される。

```
Do you accept the TOS? Y/n
```

と聞かれるので、```Y```を入力

# Webサーバーに証明書を導入

## Apacheに導入

今回はApacheなので、Apacheに導入する

```shell
sudo mv /opt/bitnami/apache2/conf/server.crt /opt/bitnami/apache2/conf/server.crt.old
sudo mv /opt/bitnami/apache2/conf/server.key /opt/bitnami/apache2/conf/server.key.old
sudo mv /opt/bitnami/apache2/conf/server.csr /opt/bitnami/apache2/conf/server.csr.old
sudo ln -s /etc/lego/certificates/{ドメイン名}.key /opt/bitnami/apache2/conf/server.key
sudo ln -s /etc/lego/certificates/{ドメイン名}.crt /opt/bitnami/apache2/conf/server.crt
sudo chown root:root /opt/bitnami/apache2/conf/server*
sudo chmod 600 /opt/bitnami/apache2/conf/server*
```

## Bitnamiのサービス再起動

```
sudo /opt/bitnami/ctlscript.sh start
```

# 確認

対象のドメインにブラウザでアクセスして証明書が反映されていればOK
<img width="463" alt="スクリーンショット 2018-12-06 11.44.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/847dd12a-694c-406b-24e8-88763a21a2c3.png">

# 証明書の更新とCronの設定

証明書の有効期限は90日なので、有効期限が切れる前に更新する必要がある。

## 証明書の更新

基本的には、Bitnamiのサービスを止めて、証明書を更新してサービスの再開で可能。

```shell
sudo /opt/bitnami/ctlscript.sh stop
sudo lego --email="{メールアドレス}" --domains="{ドメイン名}" --path="/etc/lego" renew
sudo /opt/bitnami/ctlscript.sh start
```

## Cronの設定

上記内容をshellスクリプトにして、cronに設定をしてあげる。

## スクリプトの作成

```shell
sudo vim /etc/lego/renew-certificate.sh
```

```/etc/lego/renew-certificate.sh
#!/bin/bash

sudo /opt/bitnami/ctlscript.sh stop
sudo lego --email="{メールアドレス}" --domains="{ドメイン名}" --path="/etc/lego" renew
sudo /opt/bitnami/ctlscript.sh start
```

## アクセス権の変更

```shell
sudo chmod +x /etc/lego/renew-certificate.sh
```

## Cronの設定

```shell
sudo crontab -e
```

```crontab
# 毎月0時更新
0 0 1 * * /etc/lego/renew-certificate.sh 2> /dev/null
```

***
参考サイト

* [Generate and Install a Let&#39;s Encrypt SSL Certificate for a Bitnami Application](https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/)
Kubernetesの基本用語

Kubernetesの基本用語について図も使用してまとめます。
記載内容は基礎中の基礎になる部分です。

# 前提
Dockerの使用経験あり、又はどのようなものなのか基本部分は分かっていること。

# Kubernetesとは
Kubernetesは、多数のコンテナに対する運用管理作業（コンテナオーケストレーション）を自動化するシステム。
運用管理とは、例えば１つのコンテナにアクセスが集中しないように複数コンテナにアクセスを分配するなど。

# Kubernetesの基本概要図
以降、以下の図を元に基本用語を解説します。

![kube.png](https://qiita-image-store.s3.amazonaws.com/0/279050/4b4122c0-749e-46b2-c85e-872dc0b97a29.png)

# 基本用語
### Cluster
ClusterはKubernetesのリソースを管理する集合体のこと。
リソースとは、図にあるようなNodeやPodのことです。

その中のリソースで一番大きな概念がNodeになります。
Clusterは**１つのMaster Node**と**複数のNode**から構成されます。

### Node
Nodeとはホストのことです。ホストとは、GCPであればCompute Engineのインスタンス、AWSであればEC２のインスタンスになります。

上記の通り、NodeにはMaster NodeとNodeがあります。

Master NodeはKubernetesを管理する以下の管理コンポーネントで構成されています。

- Kube apierver：KubernetesのAPIを公開する。kubectl(※１)からの操作を受け付ける役割があります。
- etcd：分散KVS。クラスタのバッキングストアとして使用される。
- Kube scheduler：コンテナを配置する最適なNodeを選択する。
- Kube controller manager：リソースを制御する。

尚、GCPのKubernetes(GKE)を使用する場合は、Master Nodeを意識する必要はないです。

Nodeはコンテナ化されたアプリケーションなどを実際に実行するホストになります。

※１ kubectl：クラスタ内のリソースの情報を取得したり操作したりするコマンドラインツール。例えば、クラスタ内のNodeの一覧を取得したりできる。

### Pod
Podはコンテナの集合体です。
PodはNodeの中で動作し、１つ以上のコンテナを持っています。
Kubernetesにデプロイする場合は、Pod単位に行います。

### Container
Dockerコンテナのことです。

### ReplicaSet
図にはないですが、押さえておくべき用語です。

ReplicaSetとは、同一仕様のPodを複数生成する仕組みです。
図で言えば、コンテナA、Bが動作するPodを必要な数（レプリカ数）生成して管理します。

### Service
これも図にはないです。

Serviceは、Podにアクセスするための経路を定義します。
Serviceにはいくつか種類があり、以下のようなものがあります。LoadBalancerなんかは有名ですよね。

- ClusterIP：クラスタ内の内部IPアドレスでServiceを公開可能にする。Pod間のアクセスをServiceを介して可能にする。
- NodePort：基本はClusterIPと同じ。但し、グローバルにポートを開放する。
- LoadBalancer：各クラウドで提供されているロードバランサーと連携する。
- ExternalName：クラスタ内から外部ホストに接続する時の名前解決を可能にする。

### Deployment
最後にDeployment。こちらも図にはないです。

DeploymentはReplicaSetの上位リソースになり、ReplicaSetを管理します。
ReplicaSetがPodを管理・操作するのと同様に、ReplicaSetはDeploymentに管理・操作されます。

関係としては以下のようになります。
Deployment　→　ReplicaSet　→　Pod

DeploymentはReplicaSetの新しいバージョンのリリースを可能とし、世代管理も可能にします。
世代管理しているので、前のバージョンに戻すことができます（ロールバック）。
この仕組があるので、リリースしたものの問題があったため、元に戻したい場合に簡単に戻せるようになります。

# まとめ
まだまだ知っておくべき用語はあるのですが、最低限押さえておくべき用語について説明を書きました。
私自身もKubernetesは触り始めたばかりなので、必要に応じて追記して行けたらと考えています。
docker コマンドチートシート


#image関連

###Docker Hubサイト
https://hub.docker.com/

###Docker Hubでimageの検索
```shell
$ docker search <IMAGE>
```

###Docker Hubからimageの取得
```shell
$ docker pull <IMAGE>[:TAG]
```
TAGのデフォルトは`latest`

###保存済みimageの一覧
```shell
$ docker images
``` 

###imageの削除
```shell
$ docker rmi <IMAGE>
``` 


#コンテナ作成、起動、停止、削除

###コンテナを作成、起動、接続
```shell
$ docker run -it <IMAGE> bash
```
\<IMAGE\>はpullしてきているものでも、pullしてきていないものでも可。

以下、オプション。

| オプション | 説明 |
|:--|:--|
| --name \<CONTAINER> | コンテナ名の指定。 |
| --volume <ホストの絶対パス>:<コンテナの絶対パス> | ボリュームの指定。`-v`でも可。 |
| --workdir <ワーキングディレクトリのパス> | ワーキングディレクトリの指定(デフォルトは`/`)。`-w`でも可。 |
| -p <ホストのPort>:<コンテナのPort> | 公開するポートの指定。 |
| -p \<IP>:<ホストのPort>:<コンテナのPort> | 公開するポートの指定。送信元のIPも制限できる。 |
| --detach | バックグラウンドで起動。`-d`でも可。 |
| --expose <コンテナのPort> | コンテナのポートを露出する。ホストには公開しない。 |
| --net=<ネットワーク> | ネットワークに参加させる |

###コンテナの起動
```shell
$ docker start <CONTAINER>
```

###コンテナの停止
```shell
$ docker stop <CONTAINER>
```

###コンテナの削除
```shell
$ docker rm <CONTAINER>
```
`--force`：実行中のコンテナを強制的に削除。`-f`でも可。


#コンテナに接続

###起動しているコンテナに接続 (rootユーザーでログイン)
```shell
$ docker exec -it <CONTAINER> bash
```

###起動しているコンテナに接続 (ユーザーを指定してログイン)
```shell
$ docker exec --user <USER> -it <CONTAINER> bash
```
`--user`：ログインユーザーを指定。`-u`でも可。


###コンテナからログアウト
```shell
$ exit
```

#その他

###コンテナ情報をみる
```shell
$ docker inspect <CONTAINER>
```
`CONTAINER` を `IMAGE`にすることで、imageの情報を見ることもできる。

###コンテナのログを取得する
```shell
$ docker logs <CONTAINER>
```
`--tail=10`：末尾から10行表示する
`-f`：出力を表示し続ける。

###コンテナ名変更
```shell
$ docker rename <OLD_NAME> <NEW_NAME>
```

###コンテナとホスト間でファイルやフォルダのコピー
```shell
# コンテナからホストへコピー
$ docker cp <CONTAINER>:<コンテナのパス> <保存するホストのパス>

# ホストからコンテナへコピー
$ docker cp <ホストのパス> <CONTAINER>:<保存するコンテナのパス>
```

###ネットワークの作成
```shell
$ docker network create <ネットワーク名>
```
tableではみ出した文字を…にする方法

知らなかったのでメモ

```css
table{
  table-layout: fixed;
}
table td{
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
```

これで、セルのwidthを指定することなく、table独自の可変が起きても、表示しているエリアに合わせて…にしてくれる。
アジャイル開発チームで心理的安全性を作る前段階のフラッシュアイディア

# 自分が苦手なことを話し合ってメンバー理解を深めよう会議 (心理的安全性にブリッジしたい)

「苦手なこと」「気になること」「HPが削れること」とかざっくりと、自分のキャラ属性的なものを共有してみたい

↓ 心理面とかいきなり書くのハードルが高い気もしたので、まずは軽く言いやすいことから共有してみる

稲浦

- 音が気になるタイプ、音環境に弱い、集中力がすごく乱される場合がある、ただし日による
- 気温にすごく影響されるので、スタジオが暑いと生産性が300倍落ちる
- 帰ろうと思った時間に帰れないとHPが激しく削られる
- 自分が発言するチャンスのない会議でじっと座っているのがとにかく苦手

# なぜこのやり方？

- 自分が一番苦手なことを知っているのは自分
- 言わないと分からない
- じゃあ言おう

# 結果は？

- 乞うご期待(別記事を書くかも)

[yumainaura心理的安全性 - Google Search](https://www.google.co.jp/search?q=yumainaura%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7&oq=yumainaura%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7&aqs=chrome..69i57.3237j1j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->