OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現で1つの文章から重複する単語を削除する方法

# はじめに
* 当記事は下記の環境にて動作を確認しています。  
 1. Python 3.6.2  

* 本記事でやりたいこと
 1. 1つの文章中複数回出てくる単語を検出し、消したい！  
 例:  
 'サンプル：これは例文です。例えば、「これは例文です。」という表現が二回出てきているとします。'  
 ↓  
 'サンプル：これは例文です。例えば、「」という表現が二回出てきているとします。'

---

# 結論
下記のように正規表現を用いて置換する。({3,100}は適宜検出したい単語の長さによって変えること)  
(.{3,100})(.\*?)\1
↓
\1\2

2017/09/29 追記
上記の置換は単語一つ分を置換する処理なので、
置換できなくなるまでループなどで繰り返し実行すること。

scivolaさんから頂いた別解
(.{3,100})(?=.\*\1)
↓
''
こちらは上記の置換と違い、ループ処理の必要がない。
ただし、"最後に残る単語"は"最も後ろの単語"となるため、下記のようになってしまう。  
例:
'サンプル：これは例文です。例えば、「これは例文です。」という表現が二回出てきているとします。'
↓
'サンプル：例えば、「これは例文です。」という表現が二回出てきているとします。'

前に出てきた単語を残したい場合は、予め文字列をreverseしておき、(逆順にしておき、)
置換後に戻す、という処理が必要になる。

---

# サンプルコード

```
python:test.py
# テスト用コード
import re

str = 'サンプル：これは例文です。例えば、「これは例文です。」という表現が二回出てきているとします。'
re.sub(r'(.{3,100})(.*?)\1',r'\1\2',str)
```

---

# サンプルコードの実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/c8e02981-e239-ce47-c034-40809cc16f01.png)

---

# 使用している正規表現パターンの簡単な解説
1. "." : 何らかの文字(1文字)
1. "*" : 直前の文字を0文字以上繰り返す
1. "()" : ()内をひとまとめにする
1. "\1" : ()でまとめた要素と同じものを指す。本記事中では\1なので、()でまとめられた要素のうちの一つ目を示す
1. "?" : 直前の正規表現パターンを最短一致で検索する。(指定しない場合は最長一致となる)

2017/09/29 追記
いただいた別解についての解説も追加
1. "?=" : 先読み。別解においては、(.{3,100})でマッチさせる単語に対して、先読み後のパターン(.\*\1)で絞込をかける

---

# 正規表現を部品ごと日本語にdecode(encode?)
1. (.{3,100}) : 3～100までの文字列
1. (.*?) : できるだけ短い何らかの文字列
1. \1 : 1.でマッチした文字列と同じ文字列

2017/09/29 追記
いただいた別解についての解説も追加
1. (.{3,100}) : 3～100までの文字列
1. (?=.\*\1) : 1. でマッチした文字列後に"何らかの文字列を挟んでもう一度同様の単語が出現しているかどうか"の絞込を追加する

---

# 注意
1. (.\*?)を最短一致にする意味  
2017/09/29 指摘反映により内容変更  
置換対象が異なります。  
頭から重複している単語を調べて次に出てきた重複する単語を置換することになります。  
なお、最短一致にしない場合は、一番後ろの重複する単語を置換します。(最長一致)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/b6e17d07-ca21-b706-9eda-2de8425e67f4.png)


1. {3,100}の部分は適宜検出したい単語の長さによって変えなければなりません。  
  'サンプル：これは例文です。例えば、「これは例文です。」という表現が二回出てきているとします。'という例においては、  
  'これは例文です。'は8文字なので{10,100}とすると置換できなくなります。  
  なお{1,100}にすると同じ文字が出た時点で置換されます。  

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/a487d5b2-6ddd-4934-8ef8-c5865fed14ee.png)

---

# 参考URL

正規表現 HOWTO — Python 3.6.1 ドキュメント
https://docs.python.jp/3/howto/regex.html   


利用可能な正規表現 - Sakura Editor
http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html
Ruby の引数の種類

Ruby の引数の種類について調べてみました。

## 早見表

全部まとめた表です


| キーワード  |                         説明                   |        例      |
|:-----------|:----------------------------------------------:|---------------|
| req        |                  必須の引数                     | func(val)     |
| opt        |    デフォルト値が指定されたオプショナルな引数         | func(val = 3)   |
| rest       |           `*` で指定された残りすべての引数           | func(*val)    |
| block      |            `&` で指定されたブロック引数            | func(&block) |
| key        | デフォルト値が指定されたオプショナルなキーワード引数   |  func(val: 3) |
| keyreq     |              必須のキーワード引数                | func(val:)    |
| keyrest    |     `**` で指定された残りのキーワード引数          | func(**val)   |


## req

一番良く見る定義。引数が与えられていない場合はエラーが出る。

```rb
def func(val)
  p val
end

func(3) #=> 3
func    #=> ArgumentError
```


## opt

引数に対してデフォルト値を設定出来る。メソッド呼び出し時に引数が指定されていない場合はデフォルト値が採用される。

```rb
def func(val = 1)
  p val
end

func(3) #=> 3
func    #=> 1
```

## rest

変数名の前にsplat演算子 `*` を置くことで、渡した引数を配列で全て受け取ることが出来る。

```rb
def func(*val)
  p val
end

func(1, 2, 3) #=> [1, 2, 3]
func          #=> []
```

他の引数が存在している場合は、それらを処理してその後いい感じに残ったやつをうまく受け取ってくれる。

```rb
def func(a, *val)
  p [a, val]
end

func(1, 2, 3)  #=> [1, [2, 3]]
func(1)        #=> [1, []]
```

```rb
def func(a, *val, b)
  p [a, val, b]
end

func(1, 2, 3, 4, 5) #=> [1, [2, 3, 4], 5]
```


## block

メソッド呼び出しの後ろにブロック文を定義することで、その処理を渡すことが出来る。


```rb
def func(&block)
  p block.call(3)
end

func { |x| x * x } #=> 9
```

`yield` でも呼び出すことが出来る。

```rb
def func(&block)
  p yield 3
end

func { |x| x * x } #=> 9
```

block が渡されたかどうかは `block_given?` を使って調べることが出来る。

```rb
def func(&block)
  p block_given?
end

func { |x| x * x } #=> true
func               #=> false
```


## key

2.0 から導入されたキーワード引数。2.0 ではデフォルト値が必要。


```rb
def func(val: 3)
  p val
end

func(val: 1)  #=> 1
func          #=> 3
```


## keyreq

2.1 からデフォルト値をつけなくても定義出来るようになりました。

```rb
def func(val:)
  p val
end

func(val: 1) #=> 1
```



## keyrest

splat演算子 `*` を2つ連続でつなげることで、残りのハッシュを全て受け取ることが出来る。個人的には一番見かける機会が少ない引数。

```rb
def func(a, **hash)
  p [a, hash]
end

func(1, a: 2, b: 3)  #=> [1, {:a=>2, :b=>3}]
```


## 余談

今回は割愛しましたが、ブロックの引数に対しても同じように適用できます。


```rb
def func(&block)
  yield(1, 2, 3)
end

func { |*x| p x } #=> [1, 2, 3]
```

```rb
def func(&block)
  yield('hoge', a: 1,b: 2,c: 3)
end

func { |a, **x| p [a, x] } #=> ["hoge", {:a=>1, :b=>2, :c=>3}]
```


## 参考サイト

https://docs.ruby-lang.org/ja/latest/method/Method/i/parameters.html
IronPython2でexeを作成と、つまづいた点

IronPython3が[まだ微妙](https://github.com/IronLanguages/ironpython3/wiki/IronPython-3.x-status-and-feature-overview)に感じたのでIronPython2を使ってみることにした。

LIB\〜.pyを含められない(？)ため
[TH-wbRadStudio で php7.1をexe化 (python3.6も可) - Qiita](https://qiita.com/tukiyo3/items/661b80d3ce25ce2b6187)の方が使いやすい気がする。

## Download

https://github.com/IronLanguages/main/releases
から `ipy-2.7.7`ではなく`ipy-2.7.6.3` をダウンロード。
今回はmsiではなく、zipの方をダウンロードした。

## .exe作成テスト (.dllも作成されます。)

```python:a.py
print 'hello'
```

```c:exe作成
ipy "Tools\Scripts\pyc.py" /target:exe /main:a.py a.py 
```

```c:exe作成(スタンドアロン版)
ipy "Tools\Scripts\pyc.py" /standalone /target:exe /main:a.py a.py 
```

IronPython2直下にあるdll群も一緒に置くと`a.exe`が動きました。

![dlls.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d7d8a374-0bca-9a9d-7283-6a526da99c2d.png)

(メモ) /standalone オプションを追加した時の出力
![スクリーンショット_2017-09-29_07-04-26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/58a07207-b69a-7b88-cb03-8e82d4b7358e.png)

## 失敗例


ipy.exe がある箇所以外で実行しようとすると以下エラーになった。

a.dllも一緒に配布することが必要でした。

![clash.png](https://qiita-image-store.s3.amazonaws.com/0/25728/139b2712-a6f0-e6a1-bc44-fd22edbaa1b8.png)

## 最新の ipy-2.7.7 だとpycでエラーとなった。

```text:日本語の場合
ipy.exe" "C:\IronPython 2.7\Tools\Scripts\pyc.py" /target:exe /main:Test1.py
..(略)
Compiling...
Traceback (most recent call last):
 File "C:\IronPython 2.7\Tools\Scripts\pyc.py", line 332, in <module>
 File "C:\IronPython 2.7\Tools\Scripts\pyc.py", line 327, in Main
 File "C:\IronPython 2.7\Tools\Scripts\pyc.py", line 181, in GenerateExe

SystemError: あいまいな一致が見つかりました。 
```

```text:英語の場合
Traceback (most recent call last):
  File "pyc.py", line 332, in <module>
  File "pyc.py", line 327, in Main
  File "pyc.py", line 181, in GenerateExe
SystemError: Ambiguous match found.
```

## 文字コードに難あり

[IronPythonでShift JISのテキストファイルを取り扱う場合の注意点 | OPC Diary](https://opcdiary.net/?p=5624)によると

> IronPythonではテキストデータはあらかじめutf-8にしておく方が無難。
> どうしてもshift_jisを使うならコーデックとしてmbcsを指定する。

```py:
import sys
sys.path.append(r'..\LIB')

func set_encoding():
    import sys
    import codecs
    charset = 'mbcs'
    sys.stdin  = codecs.getreader(charset)(sys.stdin)
    sys.stdout = codecs.getwriter(charset)(sys.stdout)

set_encoding()
```
WindowsでVPN接続時に自動ルーティングする

# はじめに

Windowsの標準VPNクライアントでPPTPを使っているとルーティングの問題が悩ましいです。
デフォルトゲートにすると全通信がVPNを通ってしまい遅くなりますし、客先VPNだったりすると「何やってんの」と怒られます。。

デフォルトゲートのチェックは外しつつ、必要なルーティングを接続時に得る方法はいくつかあります。

# Connection Manager で接続情報を作成

MS謹製のツール [Connection Manager](https://technet.microsoft.com/library/cc752995.aspx) で接続情報を事前に作成します。
http://www.experts-exchange.com/articles/11931/Automatic-VPN-routes-configuration-for-PPTP-in-Windows-7-8.html

このツールでプロファイル作成すると接続時に自動実行するプログラムを指定できます。
バッチファイルを指定することでルーティングコマンドが叩けます。

...叩けますが、作成したプロファイルの配布が手間だったり、x64バージョンがWindows7向けに見つからなかったりと意外に制約が多いです。

# PowerShellで接続管理

PowerShellスクリプトを登録することで接続時にフックできます。
https://technet.microsoft.com/ja-jp/library/JJ613766.aspx

できますがサンプルを見てわかるように相応の手間がかかります。
VPN (PPTP) ごときに、と言うのも何ですがここまで労力をかけてプログラム組むのは見合いません。

・・・と、どちらの方法も帯に短し襷に長し。
そこでオススメしたいのがタスクスケジューラを使った下記の方法です。

# タスクスケジューラにイベントトリガーを設定

1. タスクスケジューラで新規タスクを作成

    全般タブで「最上位の特権で実行」にチェックを入れておきます。
    　

2. トリガー

    トリガーから、`イベント時 ＞ カスタム ＞ イベントフィルター ＞ XML` と進んで `手動で編集する` にチェックを入れ、以下の内容を書き込みます。

    ```xml
    <QueryList>

      <Query Id="0" Path="Application">

        <Select Path="Application">*[System[Provider[@Name='RasClient'] and (Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='ここにVPN接続名を入力']]</Select>

      </Query>

    </QueryList>
    ```

    次に

    > ここにVPN接続名を入力

    の文字列を、検知したいVPN接続名と置き換えます。
これで指定のVPN接続が確立した際にフックをかけることが出来ます。

    ※ **EventID=20226** と指定すれば切断も検知可能です。
    　

3. 操作タブ

    操作タブから `新規 ＞ プログラムの開始` で実行したいプログラムを指定します。
route add コマンドを列挙したバッチファイルでもいいのですが、おすすめは netsh コマンドです。

    ```bash
    netsh.exe -f "実行したいnetshスクリプトファイルのパス"
    ```

    で柔軟に指定できます。
netsh スクリプトファイルの中身はこのようになります。

    ```bash
    interface ipv4

    add route prefix=1.2.3.0/24 interface="ここにVPN接続名を入力" store=active

    （以下、必要なだけ繰り返し）

    exit
    ```

    ※ interfaceはID番号でも指定可能ですが、VPNが複数ある場合に一意とならないのでお勧めしません。
    　

4. 実行

    対象のVPN接続を実行し、接続後に `route print` して指定のルーティングが追加されていることを確認します。VPN接続時に一瞬コマンドプロンプトが表示されますが気にしないでください。
vimでER図

# TL;DL
ふとER図が必要になったので、簡単にいい感じに作成できるもの。
またvimでできると便利と思ったので、その記録。
※最低限を目指します

## tools
- vim
- NeoBundle
- plantuml
- brew

## Let's Try!
### まずは準備から

**plantumlをinstallします**

```
brew install plantuml
```

**make実行時のscript**

```:plantuml
#!/bin/sh
plantuml -tpng $@
open ${@%%.*}.png
```
※好きな場所に置いてください

**実行権限あげる**

```
sudo chmod 755 ~/file/path/plantuml
```

**vimのpluginをinstall**

```
NeoBundle "aklt/plantuml-syntax"
let g:plantuml_executable_script = "~/file/path/plantuml"
```
※.vimrcに追記し、再度開いてinstallしてください

### ER図を書いてみる

```.test.uml
@startuml

class Users {
  id
  email
  user_name
}

class Image {
  id
  url
  type
  user_id
}

Users ----o| Image

@enduml
```
適当な場所でfileを作成し、 vimのコマンドモードで `:make` を実行する
[![https://gyazo.com/9ecc06df4e633fc967881b88720d0058](https://i.gyazo.com/9ecc06df4e633fc967881b88720d0058.png)](https://gyazo.com/9ecc06df4e633fc967881b88720d0058)

---

簡単！便利！
古いプロジェクトのLocalizable.strings がUTF-16で作られていたので UTF-8に変更した

### 👼
あるプロジェクトの改修をしていて出くわしたのですが、
Localizable.stringsがutf-16で作られていました。
gitではutf-16で作られたファイルの差分が見ることができないので、
複数のタスクを同時に進めると毎回コンフリクトし管理が大変でした。

👇こうすることで解決できます。
<img width="785" alt="スクリーンショット 2017-09-29 2.09.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/10238/5503b654-c480-1081-47f8-1008b7a459a0.png">


### Appleもutf-8をおすすめしてます
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/LoadingResources/Strings/Strings.html

>Note: It is recommended that you save strings files using the UTF-8 encoding, which is the default encoding for standard strings files. Xcode automatically transcodes strings files from UTF-8 to UTF-16 when they’re copied into the product. For more information about the standard strings file format, see Creating Strings Resource Files. For more information about Unicode and its text encodings, go to http://www.unicode.org/ or http://en.wikipedia.org/wiki/Unicode.
Central Dogmaを試してみる（途中）

# 概要

[LINE DEVELOPER DAY 2017](https://engineering.linecorp.com/ja/blog/detail/196)で紹介されていた[Central Dogma](https://line.github.io/centraldogma/)が気になったので、そもそも何なのかというところからちょっと触ってみるところまで。

# Central Dogmaとは？？

各種設定値を中央集権的に管理するリポジトリのこと。
可用性が高く、設定値の変更はバージョン管理される。

設定値の管理にはJSONやYAMLやXML等の様々なフォーマットのファイルが利用でき、その設定値を取得するためのRESTful APIが提供されている。
（クライアントとしては今のところJavaのライブラリとコマンドラインツールがあるよう）

バージョン管理にはGitを使用しているので、設定値の変更の際はレビューのフローを通すことができ、誤った設定変更を事前に防ぐことができる。

# どんなことに利用できるの？？

とりあえず以下のようなことはできる。汎用的に使えそう。

## アプリケーション起動時に設定値を取得する

そのまんま。これは当然のようにできる。
アプリケーションの起動時に必要な設定値を例えばYAMLファイルから読み込んだりすることはよくあると思うが、それと同じことができる。
唯一違うのは、設定値をファイルから読み込むのではなく、API経由で取得するということ。

## アプリケーション実行時に設定値を取得する

もちろん、アプリケーション実行時でも設定値の取得は可能。
Central Dogmaで管理されている設定値が更新された場合は、それを通知することで、アプリケーションの再起動無しに設定を反映させることができる。

設定値が更新された際にはアプリケーションは通知が受け取れるので、例えば、

* A/Bテストのパラメータの動的な変更
* ユーザやIPアドレスのブラックリストのリアルタイム更新

なんかに使えたりする。

# 用語

## Project

Central Dogmaのストレージモデルにおけるトップレベルの要素。
Projectは少なくとも2つのRepository、`main`と`meta`を持つ。（3つ以上あってもOK）

GitHubにおけるorganizationと似たような存在。

## Repository

設定ファイルが格納される場所のこと。
Repositoryにある設定ファイルは、誰が・いつ・どんな変更をしたかの履歴が残される。

### Main Repository

Project内で`main`と名付けられたRepositoryのこと。
設定ファイルの主要な格納先として使用されるが、ユーザが別なRepositoryを作成することも可能。

Project作成時には`main` repositoryにはサンプルファイルが格納されているが、これは削除してもOK。

### Meta Repository

Project内で`meta`と名付けられたRepositoryのこと。
Projectの依存関係のメタデータを格納する専用のRepositoryとして使用される。

## Commit

Repositoryに加えられた変更のこと。
各CommitにはRevisionが割り振られる。

## Revision（あるいはRevision Number）

Repositoryの変更履歴を表す整数値のこと。
Repository作成時にはRevisionが`1`のCommitから始まる。

Commitが増える毎にRevisionも1、2、3と`+1`ずつされていく。

Central DogmaはVCSとしてGitを利用しているが、おなじみのSHA1ベースのIDは使用しないらしい。
また、ブランチもサポートしていないとのこと。

Revisionは負数で表現されることもある。
例えば`-1`は最新のRevisionを表し、これはRepositoryの`HEAD`と呼ばれる。
`-2`なら`HEAD`の1つ前のRevisionのこと、など。

ちなみに、正数のRevisionを`absolute revision`（絶対Revision）、負数のRevisionを`relative revision`（相対Revision）と言う。

# 動かしてみる

[インストールして使う](https://line.github.io/centraldogma/setup-installation.html)こともできるが、今回はDockerで起動する。

```
$ sudo docker run --name centraldogma -p 36462:36462 line/centraldogma
```

↓のログが出て無事起動したっぽい。

```
Environment variables:
======================
APP_BIN_DIR:     /opt/centraldogma/bin
APP_HOME:        /opt/centraldogma
APP_LIB_DIR:     /opt/centraldogma/lib
APP_LOG_DIR:     /opt/centraldogma/log
APP_MAIN:        com.linecorp.centraldogma.server.Main
APP_NAME:        centraldogma
APP_OPTS:        
APP_PID_FILE:    /opt/centraldogma/centraldogma.pid
APP_STDOUT_FILE: /opt/centraldogma/log/centraldogma.stdout
APP_STDERR_FILE: /opt/centraldogma/log/centraldogma.stderr
JAVA_HOME:       /usr/lib/jvm/java-8-openjdk-amd64/
JAVA_OPTS:       -nodetach
JSVC_BIN:        /opt/centraldogma/bin/jsvc.linux-x86_64

Starting up centraldogma ..
```

# 設定

後で見る。
https://line.github.io/centraldogma/setup-configuration.html

# コマンドラインからいじってみる

[ここ](https://line.github.io/centraldogma/client-cli.html)によれば`dogma`というコマンドが利用できるらしいが、今はDockerで起動しているので少なくともローカルにはインストールされていない。
一応コンテナ内に入ってないか見てみたが、↓のとおり無いっぽい。

```
$ sudo docker exec -it centraldogma /bin/bash
root@e9be741f4834:/# which dogma
root@e9be741f4834:/# 
```

続く……
Django + mod_wsgi +  Apache で複数Djangoプロジェクトを公開する

# なぜいまこの話題なのか
ググって出てくる内容が、全体的にvirtualhostを利用する手法ばかりだったのですが、私の環境では、DNSでの名前解決ができる環境でないためvirtualhostが利用ませんでした。その他の方法を探しました。ありました。

# 結論
WSGIDaemonProcess + WSGIScriptAlias + WSGIProcessGroup を使おう
参照：[python - Multiple mod_wsgi apps on one virtual host directing to wrong app - Stack Overflow](https://stackoverflow.com/questions/6590587/multiple-mod-wsgi-apps-on-one-virtual-host-directing-to-wrong-app)

# 回答訳
> 私は複数のWSGIアプリを1つのApacheで実行していました。そして、複数のプロセスグループを作成することが、一番簡単な方法であることに気が付きました。
しかしその欠点は、複数のアプリを実行しているのに対し、実体は1つのプロセスであることです。それは、他の方法を利用するよりも少し多くの常駐メモリを使用する恐れがあります。
しかし、それはアプリ同士をうまく分離し、混乱を避けることができるし、メモリ使用量が少し増えるかもしれないことはあなたにとってどうでも良いことかもしれません。

> (それはどちらも悪くないかもしれない。憶測ですが、それらは多くのテキストページを共有することができるかもしれないし。私の環境はメモリ的な問題がないので、特にこの問題を解決しようとはしていません)

> 私のhttpd.confは以下のとおりです。

```
WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi
<Location /khdx>
WSGIProcessGroup khdx_wsgi
</Location>

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi
<Location /sauron>
WSGIProcessGroup sauron_wsgi
</Location>
```
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル2

# 関連
> モデリングと実装との間の相互作用は、オブジェクト間の関連を見た時に、特に油断ならないものとなる。(第二部第五章より)

現実を見たとき、大体の関連が多対多であり、双方向ですよね。

例えば、「注文」と「商品」の関連を考えた時、
"注文にどんな商品が含まれているか"で考えれば[注文]->[商品]ですが、逆に"この商品はどんな注文がされているか”で考えれば[商品]->[注文]です。

このように現実に即して双方向や多対多に関連づけてしまうことに対し、

> 一般的な関連は、そこにある関係の性質について、ほとんど何も伝えない(第二部第五章より)

とEvansは言っています。

実装面でみても双方向の関連や多対多の関連は複雑で管理がしずらくなります。
なので、関連をできるだけ制限する方向で考えましょう。
そのやり方は
> 1. 関連を辿る方向を強制する。
> 2. 限定子を付加して、多重度を効果的に減らす
> 3. 本質的ではない関連を除去する

まず、アプリケーションの要件が双方向に辿ることを求めないなら、一方向でいいわけです。

> ドメインを理解することで、本来はどちらの方向性が重要であるかが、明らかになる場合がある。(第二部第五章より)

先ほどの「注文」と「商品」の関連で言えば、
"注文にどんな商品が含まれているか"は重用なドメインの要件で[注文]->[商品]の関連は必要となりますが、"この商品はどんな注文がされているか”は商品をキーとして、注文のリストが抽出できればよいわけで、そもそも関連づける必要がないわけです。

こうして、関連の方向を強制したり、除去したりで、関連を整理して容易な設計にしていきます。

２の限定子については、書籍の例がわかりやすいです。(実用的な例かどうかは別として・・・)

国と大統領の関係の例ですが、1つの国に複数の大統領がいるため[国]1->*[大統領]ですが、ある期間には一人の大統領しかいませんので、在任期間の限定子を付与することで、1対1にすることができます。

明日はどう実装と関連のモデルを結びつけるかを読んでみます。
Javaのお勉強#4(条件分岐・if文)

# 条件分岐と繰り返し
## **制御構造**（制御フロー）・・・文を実行させる順番の事
**順次**・**分岐**・**繰り返し**の三種類

- **順次**-単純に次の文を実行すること。ここまで使用してきたのは順次
- **分岐**-条件によって、違う文を実行する(例；Yes/No文)
- **繰り返し**-条件が満たされるまで同じ文を繰り返す。(～ができるまで)

**構造化定理**-(上記3つを組み合わせればどんなに複雑なプログラムでも作成することが可能)

- 少し組み合わせた例文を作ると・・・

```java
boolean tenki = true;
if (tenki == true) {
    System.out.println("洗濯をします");
    System.out.println("散歩に行きます");
} else {
    System.out.println("家で映画を見ます");
}
```

この文では、tenki（天気）がtrue(晴れ)ならtenki==trueの処理を、false(雨)ならelseの処理を行います。

## **if文**
- if　を使えば”分岐”を行うことができる
- ifの()には、条件分岐を書く。
- 変数tenkiがtrueかどうかのチェックを行うには"=="を使う。
- elseには、falseの処理を書く。

## 今日はここまで・・・
忙しかったことはさておき、お酒を飲みすぎました！進捗ダメです！おやすみなさい(;_;)
(明日は繰り返しをやっていきます・・・予定！)
[GAE][GO][SAKURA SSL][独自ドメイン]GAE/GO＋ラピッドSSL+独自ドメイン

# 備忘録
サクラの格安SSL（ラピッドSSL　1620円/年）を
GAE/GOへインストールするまでの流れ。

## 事前知識　ラピッドSSLのデメリット
- サイトシールが無い
- 認証方法：ドメイン認証

デメリットは理解しつつ使い倒しましょう。

#GAE/GO


#独自ドメイン購入
お名前ドットコムで年間１００円のドメインを購入。
*.site が安くて見栄えも良いのでお得。

#ドメインとIPの紐づけ

# GAEコンソール＞設定からカスタムドメインを設定

# 公開証明書の作成by Open SSL
## ドメインを間違えないように・・・

# サクラにてラピッドSSLを契約

## SSL証明書発行用のサイトHTMLをダウンロード
## GAE/GO yamlにHTMLを定義してアップロード
## サクラ側で証明されたらサーバ証明書ダウンロード可能になる
## 中間証明書をサーバ証明書へ追記
　[ここにある](https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate_sha2.html#b)
## GAEコンソール＞設定からサーバ証明書をアップロード
## ローカルに作成していた秘密鍵証明書をアップロード

# サイトへアクセスし、SSLかつ独自ドメインでアクセス出来ることを確認。
protocol CustomDebugStringConvertible とは



```swift
struct Point {
  let x: Int, y: Int
}

let point = Point(x: 1, y: 2)
```

これをprintで出力すると

```
print(String(reflecting: point)) // => Point(x: 1, y: 2)
```

と表示される。

これの出力形式を変えたい時、CustomDebugStringConvertibleプロトコルを準拠させる

```swift
extension Point: CustomDebugStringConvertible {
  var debugDescription: String{ return "x = \(x), y = \(y)" }
}
```

とすれば

```
let point2 = Point(x: 2, y: 3)
print(String(reflecting: point2)) // => x = 2, y = 3
```

と出力される
Djangoで環境変数？ならdjango-environを使おうか。

バックエンドを開発していると、秘密にしたい値がどうしてもでてきますよね。
AWSのシークレットキー・APIキー・DBの接続情報等…
ただ、それをsettings.pyでハードコードしてGitで管理というのは楽ですが正直セキュリティ的によろしくありません。

となると、「環境変数で管理しよう」となってくる事が多いと思いますが、
単純に環境変数にすると開発環境での管理が面倒になる場合もあります。

# とりあえず環境変数にした場合の罠

開発環境はMac。
IDEはPythonista御用達のPyCharmを使います。

## 環境変数設定ファイルを作成

```:.env
# MySQL
DB_NAME=db_name
DB_PASSWORD=hogepass
DB_USER=hogehoge
DB_HOST=127.0.0.1
DB_PORT=3306
DB_ENGINE=django.db.backends.mysql

# AWS Settings
DJANGO_AWS_S3_BUCKET_NAME=huga-storage
DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx
```

## settings.pyを編集

```py:settings.py
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

・・・

AWS_S3_BUCKET_NAME=os.environ['DJANGO_AWS_S3_BUCKET_NAME']
AWS_ACCESS_KEY=os.environ['DJANGO_AWS_ACCESS_KEY']
AWS_SECRET_KEY=os.environ['DJANGO_AWS_SECRET_KEY']

DATABASES = {
    'default': {
        'ENGINE': os.environ['POSTGRES_ENGINE'],
        'NAME': os.environ['POSTGRES_NAME'],
        'USER': os.environ['POSTGRES_USER'],
        'PASSWORD': os.environ['POSTGRES_PASSWORD'],
        'HOST': os.environ['POSTGRES_HOST'],
        'PORT': os.environ['POSTGRES_PORT'],
    }
}

・・・
```
と、こんな感じでしょうか。

## 問題点

* コマンドラインから行う時はMacの環境変数にセットしなければならない。
* Macの環境変数にセットしてなかったらPycharm`Run/Debug Configrations`で環境変数をいちいち指定しないといけない。

たかが2点されど2点。
まずLinux運用想定で.envを作成したとしても、Macだと`export`しないと環境変数に登録できないし…
↓のようなシェルスクリプト作成して環境変数修正するたびに実行してなんてしたくない。

```bash:env.sh
#!/bin/sh
# ファイルを1行ずつ読み込んで表示

TESTFILE=./.env
while read line; do
    export $line
done < $TESTFILE
```

という事で、こんな無駄をなくしましょう。

# django-environを使用する

Github
https://github.com/joke2k/django-environ
ありがたや(-人-)

## 導入

```
$ pip install django-environ
```

## 環境変数設定ファイルを修正

```:.env
# MySQL
DATABASE_URL=mysql://hogehoge:hogepass@127.0.0.1:3306/db_name

# AWS Settings
DJANGO_AWS_S3_BUCKET_NAME=huga-storage
DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx
```

## settings.pyを改善

```py:settings.py
import environ

# settings.pyの位置を起点として３つ上の親ディレクトリを参照。
BASE_DIR = environ.Path(__file__) - 3

env = environ.Env()

# 環境変数でDJANGO_READ_ENV_FILEをTrueにしておくと.envを読んでくれる。
READ_ENV_FILE = env.bool('DJANGO_READ_ENV_FILE', default=False)
if READ_ENV_FILE:
    env_file = str(BASE_DIR.path('.env'))
    env.read_env(env_file)

・・・

AWS_S3_BUCKET_NAME=env('DJANGO_AWS_S3_BUCKET_NAME')
AWS_ACCESS_KEY=env('DJANGO_AWS_ACCESS_KEY')
AWS_SECRET_KEY=env('DJANGO_AWS_SECRET_KEY')

DATABASES = {
    'default': env.db() # デフォルトでDATABASE_URLの環境変数を分解してくれる
}

・・・
```

## ポイント
* Macに環境変数を設定しなくても、1つ環境変数をTrueにしておけば `.env` を読んでくれる。
* DATABASE_URLという環境変数で一行書くことでDBの定義ができる
* ディレクトリのベースディレクトリ定義などがスッキリする。

ちなみに、DB以外にもキャッシュとかもワンラインで定義できます。
`DJANGO_READ_ENV_FILE`をTrueにしておけば`.env`を修正しても毎回読み直してくれるのでかなり便利です。

# まとめ

使用したメソッドは一例ですが、これだけでもスッキリしたコードになりました。
環境変数にする事によりセキュリティ対策にもなるし、開発と本番とかでsettingsファイルを切り替える必要もなくなります。
OSSは日に日に追加・改善等が進められているので、いつのまにか痒い所に手が届くライブラリが作成されているという事が無いようにしていく事が大切ですね。
そして人様が開発したライブラリに頼りきるのではなく、自らも積極的にOSSに貢献していきましょう！

**Let's OSS Life!!!**
Macでgifを作る方法


よくtwitterや2ちゃんねるのまとめでgif見ませんか？

今回は自分でgifファイルを作る方法の記事です！

# そもそもgifって？

読み方はいろいろ言われているのですが私は「ジフ」と読んでいます。
![gif-sample.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136533/023203ea-0e8a-ccf1-ee5d-0492f1ee6f8e.gif "gif-sample.mov.gif")

こんなやつです。


# 作成方法

1. 動画を用意します！
2. Giftedというアプリにドラッグアンドドロップ！
3. 出力されたファイルを貼り付ける！


これだけなんですね。簡単！

では詳しく説明していきます。

# 自分のPCの画面を動画にしたいと言う方

QuickTime Playerを起動してください！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137393531302f39666464373261612d636361322d666131642d303232662d3730623764623434656263302e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/136533/ff1c7081-b8b0-7221-5cf5-715f64c12e1b.png "68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137393531302f39666464373261612d636361322d666131642d303232662d3730623764623434656263302e706e67.png")


起動したらファイル -> 新規画面収録をクリック
![スクリーンショット 2017-09-28 11.57.54-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/5feb55ca-deab-02ea-53c6-039699364844.png "スクリーンショット 2017-09-28 11.57.54-min.png")


次に赤いボタンをクリック！
![スクリーンショット 2017-09-28 11.59.31-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/b447a044-ceda-eb6a-ca75-9ebbca229a8c.png "スクリーンショット 2017-09-28 11.59.31-min.png")



次にクリックしながら撮影範囲を指定します！
![スクリーンショット 2017-09-28 12.00.58-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/d9d634a3-867e-2727-e65e-50bd6aeacae1.png "スクリーンショット 2017-09-28 12.00.58-min.png")



撮影を開始をクリック！

Command + Control + esc キーを同時に押すことで撮影を終了！

以上の手順で自身のPCの画面を撮影できます。

# 動画をGIFに変換する

Giftedを起動します。


Drop a movie or click here to pick oneに動画をドラッグ&ドロップしてStartをクリック！
![スクリーンショット 2017-09-28 13.27.12-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/6c01d494-62f6-1f43-3d35-8e6c9e17b9bb.png "スクリーンショット 2017-09-28 13.27.12-min.png")


gifファイルの完成です！

早い！簡単！すごい！

というわけで手順は以上になります。

あとはお好きなところにgifをアップロードしましょう。

ちなみに

Wordpressで使用時に気をつけないといけないことがあります！
![スクリーンショット 2017-09-28 13.36.35-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/fb645260-68a6-f745-a080-661f244d7c12.png "スクリーンショット 2017-09-28 13.36.35-min.png")



フルサイズにしないと静止画になってしまいますのでご注意！

最後までご覧いただきありがとうございます！
spwdというパスワード管理ツールを作った

たまには Qiita にも。元の blog は↓

[spwdというパスワード管理ツールを作った \| tail \-f pinzo\.log](https://pinzolo.github.io/2017/09/28/spwd-is-secret-file-based-password-manager.html)

## はじめに

みなさんパスワード管理どうしてますか？  
Webサービスのアカウントならブラウザや LastPass のようなサービスが利用できるけど、まだまだパスワードでログインしなければいけないサーバがあったり `psql` や `mysql` コマンドでパスワード入力したりしなければならなかったりしませんか？

全部が秘密鍵で済むような環境になればいいけど、少なくとも自分を取り巻く環境はそうなっていません。意味のある文字列ならまだしも、ランダムな英数字とか覚えておくにも限界があるし、いざ入力するときも手間がかかる。

まだまだ僕たちはパスワード管理から自由になれないようです。ならせめてセキュアにパスワード管理できて、入力補助的なことができるとうれしい。

## というわけで

[pinzolo/spwd: Secret file based password management tool](https://github.com/pinzolo/spwd) というものを作ってみた。

![Screenshot](https://pinzolo.github.io/assets/img/20170928_spwd-sample.gif)

こんな感じで利用します。

## 何やってるのか？

`spwd new` で対話形式でパスワードをデータファイルに保存します。このとき、特定のファイル（以下キーファイル）のハッシュをキーにして暗号化しています。  
キーファイルはデフォルトでは `~/.ssh/id_rsa` を使用しますが、これは **このツールを使うような人はたいてい持っていて** かつ **本人しか知り得ないはずのもの** だから都合がよかったからで、
SSHの秘密鍵を利用されるのは気持ち悪いという人は `~/.config/spwd/config.yml` に設定を書けば別のファイルをキーにすることができます。ついでにデータファイルの場所も変更できます。（デフォルトは `~/.local/share/spwd/data.dat`）  
ファイルのハッシュを利用しているのでキーファイルの中身は別にRSA形式じゃなくてもOKです。ぶっちゃけなんでもOKです。

## そのほかつらつらと

* キーファイルさえ流出しなければ、データファイルは Dropbox とかで同期しても大丈夫だよね。
* キーファイルは自分さえ知り得ない長めの文字列なんかを各環境でファイルに保存すればネットワーク介さなくてもいいから安全だよね。
* キーファイル配置先のパーミッションはちゃんとやろうね。SSH と同じだよ。
* 万が一キーファイルが漏れたりしたら、新しいキーファイルを用意して `spwd migrate /path/to/new/key/file` とすればカレントディレクトリに新しいデータファイルを生成するよ。（上書きするわけではない）
* `spwd new` の時に同じ Name を指定すれば、上書きするかどうかを聞いてくるので Description の更新もこっちでやってね。
* はじめはパスワードだけ暗号化していたけどやめた。Name や Description をエディタで更新できるメリットよりも、それらがヒントになってしまうデメリットのほうが高い気がする。

そんなわけで、興味があれば慎重に使ってみてください。
.NET(C#)とJavaScriptでは、有効でない日付を指定した際の処理が異なる

#きっかけ
.NET(C#)で書かれたコードを、JavaScriptで書き直す機会がありました。
指定日の一か月後、一か月前を計算する処理があったのですが、日付によっては.NET版とJavaScript版で結果が異なることがありました。
調査の結果、有効でない日付を指定した際の処理が異なることがわかりました。
#.NET
**有効でない日付を指定した場合、最後の有効日が使用される。**
例）
3月31日の一か月後
↓
4月31日（有効でない）
↓
4月30日（最後の有効日）

```csharp:cs
DateTime date1 = new DateTime(2017, 3, 31);
Console.WriteLine(date1);                // 3/31/2017 12:00:00 AM

Console.WriteLine(date1.AddMonths(1));   // 4/30/2017 12:00:00 AM

// DateTime date2 = new DateTime(2017, 4, 31);  // これはエラー
// [System.ArgumentOutOfRangeException: Year, Month, and Day parameters describe an un-representable DateTime.]
```

#JavaScript
**有効でない日付を指定した場合、月を繰り上げて有効な日付を再計算する。**
例）
3月31日の一か月後
↓
4月31日（有効でない）
↓
5月1日（月を繰り上げて再計算した有効日）

```js:js
// JavaScript の month は0(1月)～11(12月)なので、-1しています。

let date1 = new Date(2017, 3 - 1, 31);
console.log(date1);     // Fri Mar 31 2017 00:00:00 GMT+0900 (東京 (標準時))

date1.setMonth(date1.getMonth() + 1);
console.log(date1);     // Mon May 01 2017 00:00:00 GMT+0900 (東京 (標準時))

let date2 = new Date(2017, 4 - 1, 31);  // これも設定可能
console.log(date2);     // Mon May 01 2017 00:00:00 GMT+0900 (東京 (標準時))
```

#参考
.NET
https://msdn.microsoft.com/ja-jp/library/system.datetime.addmonths(v=vs.110).aspx
JavaScript
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate
CPUの処理速度を表す単位をなんとなく理解する

基本情報処理試験の勉強をしていると、
CPUの処理速度を表す単位の計算問題がいろいろ出てきて、よく分からなくなりました。
そこで自分の中でなんとなく整理しました。
本来の仕組みがうんぬんよりも、イメージで理解しようとしています。


#クロック周波数
##クロック周波数とは
>パソコンの内部で、CPUなどに、動作のタイミングを指定するために、電圧の高・低を繰り返すクロック信号を与えます。
電圧の高・低でCPU内部の部品同士やメモリとのタイミングを同期させたクロック信号は、「1秒間に何回」というクロック周波数で速度が表現されます。

>一般にクロック周波数が高いほど処理速度は高くなります。



クロック周波数は、BGMのようなものかなと思いました。
PCの中ではBGMが流れていて、そのテンポを刻むものをクロック周波数と表すことができます。

例えば私はハイテンポな音楽が好きなので、そういう音楽を聴くとテンションが上がります。
テンションが上がるとなんとなくやる気が出ます。
すると、作業のスピードも上がります。

CPUも同じで、
つまり、テンポの速いBGMを流すことができるCPU（クロック周波数の高いCPU)は、処理速度が高くなります。

反対に、私はクラシックを優雅に楽しむ環境で育たなかったため、
クラシックを聴くととても眠くなってしまいます。
眠い中むりやり仕事をしようとしても、なかなか作業が進まないです。

それをCPUでいうならば、
テンポのゆっくりしたBGMしか流すことができないCPU（クロック周波数の低いCPU)は、処理速度が低くなってしまいます。

1秒間にどのくらいのテンポのBGMが流れているのか・・という具体的な数値で表したものが、"クロック周波数"です。

あくまでクラシックが苦手な人の感覚になってしまいますが、私のイメージはこんな感じです。

#MIPS
##MIPSとは
>コンピュータが1秒間に何百万回命令を実行できるか（処理速度）を示す単位。
1MIPSのコンピュータは、1秒間に100万回の命令を処理できます。



これは上の文章そのままの理解・・
クロック周波数とMIPS何が違うの！と思っていたけれど、
MIPSの方がより具体的な数値なのかなと思いました。



#CPI
>CPUの処理速度を表す単位。
>CPIとは、クロック周波数とMIPSを結びつけたもので、1命令の実行に要する平均クロック数を表します。


こちらの単語は知らなかったけど、知らないのうちに基本情報の計算問題に出ているかもと思いました。
1つの命令をAメロ流れている間に終えることができるCPUと、Bメロになってから終えるCPUだと前者の方が速いよねという感じなのかなと思いました。


#基本情報処理試験の問題を解く
上を踏まえて、基本情報処理試験の問題を解いてみました

##基本情報技術者 平成19年秋期 午前問19


>1GHzで動作するCPUがある。このCPUは，機械語の1命令を平均0.8クロックで実行できることが分かっている。このCPUは1秒間に約何万命令実行できるか。


1秒間に1 * 1000(K) * 1000(M) * 1000(G)のクロック周波数が流れるCPUがあります。
このCPUは、機械語の1命令を平均0.8クロックで実行できるとのことなので、

1秒間の中に0.8クロックを何回流すことができるか考えると、
1,000,000,000 / 0.8 を計算すると1,250,000,000

問題文は「約何万命令」かと問われているので単位を合わせて、
答えは**125,000**万命令になります。


※こうしていちいち"0"をつけて計算していると、
桁数間違い。。ということがよくあるのですが、なかなか単位を合わせるのが難しくて結局このような解き方をしています。。。


##基本情報技術者 平成21年春期 午前問9
>平均命令実行時間が20ナノ秒のコンピュータがある。このコンピュータの性能は何MIPSか。


1秒間 に ？百万回 命令を実行できたら ？MIPS かという問題なので、
※ 1秒間 に 100万回 命令を実行できたら 1MIPS

まずは何百万回命令を実行できるのかを計算します。
平均命令実行時間が20ナノ秒なので、1秒間に20ナノ秒が何個あるのか計算します。
1 / 20ナノ秒をすると、
※ 20ナノ秒は、20 / (1000*1000*1000)

上記の答えは50,000,000
つまり、このコンピュータは1秒間に50百万回の命令を実行できます。
つまり、答えは**50MIPS**になります。


**別の計算の仕方**
いつもお世話になっている[基本情報ドットコムさん](http://www.fe-siken.com/kakomon/21_haru/q9.html)の解き方がスマートなので載せておきます。
>MIPSは、1秒間に実行可能な命令数を百万単位で表したものです。言い換えると「1マイクロ秒(10-6秒)あたり何命令が実行可能か」ということです。

>1つの命令を実行数するのに平均20ナノ秒(1ナノ秒＝10-9秒)かかるので、1マイクロ秒間に実行可能な命令数は、

>1000(ナノ秒)÷20(ナノ秒)＝50（回）

>と計算して、50MIPSという正解にたどりつくことができます。


こういう風に単位を合わせるのが苦手。。
けどこうすると計算ミスを防ぐことができるし、解く時間の短縮にもなるのでできるだけこちらの方法で解けるようになりたいと思います。
SRE本まとめ（3章 リスクの受容）

自分の理解を深めるためにまとめてみました。[2章](https://qiita.com/bassbone/items/38eb4793366b1e11a610)の続きです。

## 3章 リスクの受容

### リスクについて
信頼性を高めることは重要ではあるが、必要以上に高めることはすべきではない。信頼性を高めるにつれてコストもあがるため、信頼性とコストのバランスを常に意識する必要がある。信頼性を計測する際は「サービスの可用性」に着目するとよい。可用性の計算として2パターンあり、稼働時間をベースにするパターンとリクエスト数の成否をベースにするパターンがある。この可用性はSREだけで決めるのではなく、プロダクトマネージャーと連携して決める必要がある。Googleの中でも当然サービスによって求められる可用性のレベルは異なっている。例えば「G Suite」の場合は対外的な目標値と内部的な目標値をそれぞれもち、対外的＜内部的という関係としている。（顧客との契約で対外的な目標を約束している。）
エラーバジェットを導入することでSREと開発チームとの間でリスクコントロールが可能となる。エラーバジェットに余裕がある場合は多少リスクがあってもローンチを優先する方向となり、逆にエラーバジェットがほとんど尽きている場合はリスクを取らずにローンチのスピードを落とす方向となる。

（[4章](https://qiita.com/bassbone/items/fd5b1e4fc257043318f7)に続く）
C# / Unity2D 学んだこと #2

# C\# 

## 構造体

- 値型、つまりスタックに積まれるタイプのクラス的なやつ
- デフォルトコンストラクタ、デストラクタを開発者が定義することは出来ない
- 変数宣言、もしくはnewによるインスタンスの生成で作ることが出来る
- 構造体のメンバに参照型のフィールドがある場合は、newで作成しないとエラーになる、とあるがwandboxで試した感じ、エラーにならなかった…
    - *構造体に参照型がメンバーとして含まれている場合は、メンバーの既定のコンストラクターを明示的に呼び出す必要があります。そうしないと、メンバーは未割り当てのままになり、構造体は使用できません (結果として、コンパイル エラー CS0171 が発生します)。* by https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/using-structs

```csharp
using System;

struct Boge
{
  public Hoge hoge; 
}

class Hoge
{  
  public static void Main(string[] args)
  {
    Boge boge;
    var hoge = boge.hoge;
  }
}
```

## 色々な初期化子

- Javaに比べて色々な初期化子が用意されているのはすごく良い…
- https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers
- まずはオートプロパティを初期化するやつ

```csharp
using System;

struct Boge
{
  public int Count { get; set; }
}

class Hoge
{  
  public static void Main(string[] args)
  {
    var boge = new Boge { Count = 10 };
    Console.WriteLine(boge.Count);
  }
}
```

- リストとかディクショナリのようなコレクション
- *コレクションがインデックス作成をサポートしている場合は、インデックス付きの要素を指定することができます。* by https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers
    - つまるところ、IEnumerableを継承して、indexerが定義されていれば、次のdictの初期化がどのクラスでも使えるということだろうか…そのうち検証したい

```csharp
using System;
using System.Collections.Generic;

class Hoge
{  
  public static void Main(string[] args)
  {
    var list = new List<int> { 1, 2, 3 };
    Console.WriteLine(list[2]);
    
    var dict = new Dictionary<string, int> { ["test"] = 3, ["test2"] = 2 };
    Console.WriteLine(dict["test"]);
  }
}
```

## ジェネリクス

- 魔物がひそむところだ
- erasableではない！(つまり実行時にリフレクションで型情報を得ることが出来る)
    - Javaは実行時に消えてしまう…
- in/outについては、まだ理解が及ばない

# Unity2D

## Unityのソースコード

- Unityは基本クローズドソース
    - 大手企業なら提供されて読めるのだろうか？
- なので、Android開発でよくやる、プラットフォームが提供しているクラスのソースコードを読んでパクったりちょっといじるのは難しそう
- ただ、ググるとデコンパイルしたソースコードをGithubにあげている御方がいらっしゃる
- https://github.com/MattRix/UnityDecompiled
- READMEを見る限り、Unityの中の人に許可は取ったよ！という感じらしい
知っておくと作業が捗るTableau操作TIPSまとめ

# 意外と知られていない？けど覚えておくと便利なTableauの機能6個

## ドラッグ&ドロップでデータを開く
- Tableauにファイルをドラッグ&ドロップすればデータを開くことができる
- 「接続」からディレクトリを辿るのは地味にメンドウなので便利

## コピー&ペーストでデータを開く
- データをコピーした状態でTableau上でペーストすれば開くことができる
- ちょっとだけ使いたいときなどわざわざファイル保存しなくてよいので便利
- 参考　https://onlinehelp.tableau.com/current/pro/desktop/ja-jp/clipboard_datasource.html

## 右クリックドラッグ&ドロップで集計方法を選択する
- 右クリックでフィールドを行や列にドラッグ&ドロップすると集計方法を選択できる
- 左クリックだと基本的に合計で集計されるので別の計算（平均など）を指定したいときはこちらを使う

## 直接入力した計算式をドラッグ&ドロップでフィールドに
- 行や列に直接入力した計算式をフィールドの並ぶエリアにドラッグ&ドロップすると自動で計算フィールドにしてくれる

## 計算フィールドにコメントを書く
- `//`（スラッシュ2個）で計算フィールドにソースコメントを書くことができる
- 込み入った計算式などでコメントを残しておくと、あとあと助かる

## ディメンションとメジャーをドラッグ&ドロップで変換する
- メジャーをディメンションにドラッグ&ドロップするとメジャーをディメンションに変換してくれる
- コード値などディメンションであるべき数値がメジャーに入ってしまった場合など、フィールドを整理するときに役立つ
- もちろんディメンションをメジャーに変更することも可能
そんなに”私ソフトウェアエンジニアです”って言いたいですか？

はい。言いたいです！

これ１時間以内で書けたらエンジニアでーす✌︎って言ってもええらしいすー！
http://www.shiftedup.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour

ってことで、Rubyで一つずつやってみる。
英語得意ちゃうんで間違ってたら訂正してください🙇

## １. 数字の入った配列の合計求めてみ

```rb
nums = [1,2,3,4,5]
nums.sum # => 15

# sum使うなとか言われそう。

nums.inject { |sum, num| sum + num } # => 15

# もっとエレガントなのありそう
# あった！

nums.inject(:+) # => 15

# How Elegance　！！
```

## 2. ２つの配列の値を交互に格納した配列作ってみ

```rb
arr1 = [1,2,3]
arr2 = ['a', 'b', 'c']
arr1.zip(arr2).flatten # => [1, 'a', 2, 'b', 3, 'c']
```

## 3. フィボナッチ数列って聞いただけ拒絶反応起こしました。

フィ、フィ、フィボナッチ！？

```rb

(0..100).inject([0, 1]) {|fib, i| fib << fib[i] + fib[i+1] }

```
らしいです。。。
http://blog.toshimaru.net/ruby-inject/


## 4. 配列に入ってる数字で最大値作ってみーや

```rb
arr = [50, 2, 1, 9]
asc = arr.join().split('').sort {|a, b| b <=> a} # => ["9", "5", "2", "1", "0"]
asc.join() # => "95210"

修正：50を５と0に分割してはいけないので、正しくは下のようになります。
input = [50, 2, 1, 9]
output = input.map(&:to_s).sort{|a, b| b + a <=> a + b}.join().to_i
```

## 5. １〜９の間にプラスかマイナス入れて必ず１００になるようなの作ってみーや

```rb
# 順番は固定、数字と数字の間に（+、−）を入れる。もしくは数字を結合して、結果が１００になる式を作るんやて。
# しかも全パターン出力してみなはれ。やて。
# 1,2,3,4,5,6,7,8,9

# 例えばこんな感じ： 1 + 2 + 34 – 5 + 67 – 8 + 9 = 100.

# ちょっと何言ってるかわからないです。はい。
```

てことで、出直してきます。
普段何してるんですか？って聞かれたら、ニートです！って言います。

他の言語でも良いので、エレガントなコード教えてくださると喜びます🙇
abseilのサンプルコードをビルドする（abseil-cppのabsl::StrJoin()を試す）

# Setup

```bash
sudo apt-get install clang
sudo apt-get install git
git clone https://github.com/abseil/abseil-cpp.git
```
# Sample Source Code

```cpp:join.cpp
// from https://abseil.io/docs/cpp/quickstart

#include <iostream>
#include <string>
#include <vector>
#include "absl/strings/str_join.h"

int main()
{
  std::vector<std::string> v = {"失礼", "熱盛と", "出てしまいました"};
  std::string s = absl::StrJoin(v, "、");

  std::cout << "Joined string: " << s << "\n";

  return(0);
}

```
# Build and Run

```bash
ROOT=.
clang++ -Wall -Wextra -std=c++11 -I "${ROOT}/abseil-cpp" join.cpp
./a.out
```

# Output

```bash
Joined string: 失礼、熱盛と、出てしまいました
```

# References

- [GitHub Repository](https://github.com/abseil/abseil-cpp)
- [Quick Start](https://abseil.io/docs/cpp/quickstart)
- [Release Note](https://opensource.googleblog.com/2017/09/introducing-abseil-new-common-libraries.html)
- [Googleの公開したAbseilライブラリの価値がわからない](https://cpplover.blogspot.jp/2017/09/googleabseil.html)

# Thumbnail

![join_thumb.png](https://qiita-image-store.s3.amazonaws.com/0/34601/b687565d-b410-fd35-08d1-8b33d1213f5b.png)
<ul>タグできれいに番号付き箇条書きをする方法

自分メモ

#ulタグできれいに番号付き箇条書きをする方法
番号付き箇条書きをする時に、最初は`<ol>`タグを使っていたのですが、それだと番号だけ左端のラインの外に揃わずに飛び出してしまうので、その問題を解消するためにググってみたところ`<ul>`タグを使って番号付き箇条書きをする方法を発見したので覚書のために記載しておきます（オリジナル情報のウェブサイトはページ下に記載してあります）。

##かっこのない番号付き箇条書きの場合
###1.　HTMLファイルに番号をつけた状態で箇条書きをする
```sample.html
<ul class="number">
  <li>
    1. じゅげむじゅげむ　ごこうのすりきれ　かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ　くうねるところにすむところ　やぶらこうじのぶらこうじ　ぱいぽぱいぽぱいぽのしゅーりんがん　しゅーりんがんのぐーりんだい　ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
   </li>
   <li>
     2. じゅげむじゅげむ　ごこうのすりきれ　かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ　くうねるところにすむところ　やぶらこうじのぶらこうじ　ぱいぽぱいぽぱいぽのしゅーりんがん　しゅーりんがんのぐーりんだい　ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
   </li>
</ul>
```
###2.　CSSファイルにスタイルを追加する
```sample.css
ul.number li {
	list-style:none;
	text-indent: -1.2em;
	padding-left: 1.2em;
	}
```
##かっこのある番号付き箇条書きの場合
###1.　HTMLファイルに番号をつけた状態で箇条書きをする
```sample.html
<ul class="paren">
  <li>
    （1）じゅげむじゅげむ　ごこうのすりきれ　かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ　くうねるところにすむところ　やぶらこうじのぶらこうじ　ぱいぽぱいぽぱいぽのしゅーりんがん　しゅーりんがんのぐーりんだい　ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
   </li>
   <li>
    （2）じゅげむじゅげむ　ごこうのすりきれ　かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ　くうねるところにすむところ　やぶらこうじのぶらこうじ　ぱいぽぱいぽぱいぽのしゅーりんがん　しゅーりんがんのぐーりんだい　ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
   </li>
</ul>
```
###2.　CSSファイルにスタイルを追加する
```sample.css
ul.paren li {
	list-style:none;
	text-indent: -2.5em;
	padding-left: 2.5em;
	}
```
###まとめ
これだと数字だけ左端のラインから飛び出すことなく箇条書きができます。また箇条書きのなかにさらに箇条書きが入っているような場合も簡単にできます。

###ポイント
かっこなしと、かっこありはCSSの`text-indent`と`padding-left`の値が若干違います。もし字下げがうまく合わない時はこの数字を調節してみてください。

###参照ウェブサイト
http://control.shado.jp/2012/0715175207.html

ありがとうございました。
コードで理解するRubyのputsは値を返さない

putsすると、コンソールに出力されるんですけど、値を返さないのご注意を！
どういうことかと言うと

```rb
arr = [1, 2, 3]

result = arr.map {|b| b}

# => result = [1, 2, 3]

result = arr.map {|b| puts b}

# => result = [nil, nil, nil]
```
RaspberryPiでsshした後に画面が真っ暗になって困ったこと

RappberryPi(ラズペリーパイ)でsshした後に画面が真っ暗になって困ったので、そのメモ。
ちなみにsshじゃなくて直接ログインしても同じ現象になりました。何をしたかったのか覚えていないのですが、次の日にきたらsshができなくなっていました。

##環境
RappberryPi 3

##原因
bash_profileを変更して、それがおかしくなっていた模様です。

##対応策
FileZillaなどのFTPのツールを使って、ラズパイに接続しbash_profileを修正して解決
https://ja.osdn.net/projects/filezilla/

##まとめ
bash_profileやbashrcなどを修正するときは気を付けよう。
sshでコマンドを実行する時はプロセスの状況とシグナルの流れに注意する

`ssh+command`はプロクシとして使う時に非常に便利。
`ssh ... nc ...`とか。
ところが不適切な設定でこのコマンドを多様するとリモートに大量のプロセスやsshセッションが残る事がある。

例えば、`CTRL+C`でsshにシグナルを流して殺してもリモートのプロセスにはシグナルは飛ばないので、リモートのプロセスは走り続ける。
この場合何らかの方法で自発的にリモートプロセスに死んでもらう必要がある。`nc -q`とか。

`ssh -t`でttyセッションを開いた場合、`CTRL+C`すると`Connection to ... Closed.`と表示される。
リモートのシェルを通してリモートのプロセスにシグナルが飛び、子プロセスが死んだのでリモート側からsshセッションを閉じるため。
この場合、逆にキー入力でローカルのプロセスにシグナルを送る事ができない。

何がしたいかによって対処の仕方は変わるので、sshでコマンドを実行する時はプロセスがどこで走っているのか、親子関係、シグナルの流れに注意する事が大事。
Microsoft Solver Foundationを使ってみる

# 概要

　以前、GNUのMIPソルバー「GLPK」についての解説記事を作成しました。
　　[GLPK for C#/CLIで遊ぼう！](https://qiita.com/YSRKEN/items/408c0aac09bbb8034eb2)
　　[GLPKを手頃に扱えるラッパークラスを作成しました](https://qiita.com/YSRKEN/items/b18fc10c3fb66961a394)

　ですが、これ以外にもタダで使えるソルバーライブラリの1つとして、「Microsoft Solver Foundation」というソルバーライブラリがあることを知りました。以下、簡単な使い方を解説します。

# 導入方法

　Nugetから簡単にダウンロードできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/e6fa60eb-7e9f-ce04-47a6-602fbf96ade6.png)

# 使用方法

　いつものサンプル問題を定式化してみました。

- 最大化する目的関数：$Z=5X+4Y$
- 制約式1：$1.5X+3Y\leq13.5$
- 制約式2：$3X+Y\leq10$
- 制約式3：$X+2Y\geq7$
- 変数の範囲：$X\geq0$,　$Y\geq0$
- その他：$X,Y\in\mathbb{N}$

![サンプル問題](https://qiita-image-store.s3.amazonaws.com/0/29802/7e6d84ae-a7ec-ec0b-de24-d61c6104298e.png)

```csharp
using System;
using System.Linq;
using Microsoft.SolverFoundation.Solvers;

namespace ConsoleApp2 {
	class Program {
		static void Main(string[] args) {
			// 解く問題を初期化(IDisposableではない)
			var solver = new SimplexSolver();
			// 使用する変数のID・制約式のID・目的関数のIDを宣言する
			int x, y, z = 0, e1, e2, e3;
			// 最適化の方向を設定する
			// AddGoal(目的関数の数値が代入される変数のID, (不明), 最大化するならfalse・最小化するならtrue)
			solver.AddRow("目的関数値", out z);
			solver.AddGoal(z, 1, false);
			// 制約式の数・名前・範囲
			solver.AddRow("条件1", out e1);
			solver.AddRow("条件2", out e2);
			solver.AddRow("条件3", out e3);
			solver.SetBounds(e1, double.NegativeInfinity, 13.5);
			solver.SetBounds(e2, double.NegativeInfinity, 10.0);
			solver.SetBounds(e3, 7.0, double.PositiveInfinity);
			// 変数の数・名前・範囲
			// SetIntegralityメソッドで整数条件を付与できることがポイント
			solver.AddVariable("X", out x);
			solver.AddVariable("Y", out y);
			solver.SetBounds(x, 0.0, double.PositiveInfinity);
			solver.SetBounds(y, 0.0, double.PositiveInfinity);
			solver.SetIntegrality(x, true);
			solver.SetIntegrality(y, true);
			// 目的関数の係数
			solver.SetCoefficient(z, x, 5);
			solver.SetCoefficient(z, y, 4);
			// 制約式の係数
			solver.SetCoefficient(e1, x, 1.5);
			solver.SetCoefficient(e1, y, 3);
			solver.SetCoefficient(e2, x, 3);
			solver.SetCoefficient(e2, y, 1);
			solver.SetCoefficient(e3, x, 1);
			solver.SetCoefficient(e3, y, 2);
			// 最適化
			solver.Solve(new SimplexSolverParams());
			// 結果表示
			// GetValueメソッドの返り値はRational型……要するに分数なので、
			// ToDouble()メソッドでdouble型にすると分かりやすい
			Console.WriteLine($"Z = {solver.GetValue(z).ToDouble()}");
			for (int i = 0; i < solver.VariableCount; ++i) {
				int valueId = solver.VariableIndices.ElementAt(i);
				string valueName = (string)solver.VariableKeys.ElementAt(i);
				Console.WriteLine($"{valueName} = {solver.GetValue(valueId).ToDouble()}");
			}
		}
	}
}
```

　GLPKの奴よりは自然なインターフェースな気がします。変数・目的関数値・制約式それぞれに整数の「ID」を割り当てるのだ、ということが分かれば読み解くのは容易いでしょう。また、ソルバーでの計算結果の返り値が`double`ではなく`Rational`型なのも(計算精度的な意味で)興味深いところです。

　……ただ、[計算速度が遅い](https://twitter.com/ruhiel_murrue/status/913351716233396224)といった報告があるのがソルバーとして致命的な気もしますorz

# 参考資料
[Microsoft Solver Foundationで最適化問題を解く | tocsworld](https://tocsworld.wordpress.com/2014/04/29/microsoft-solver-foundation%E3%81%A7%E6%9C%80%E9%81%A9%E5%8C%96%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/)
Vue.js でバリデーションしてメッセージを日本語化する

## 前提
[vee-validate](https://github.com/baianat/vee-validate) を使う。
他にもバリデーションのプラグインは [vue-validator](https://github.com/kazupon/vue-validator) や [vuelidate](https://github.com/monterail/vuelidate) などあるが、今回は Github のスターが多いかつ頻繁に更新されてそうな vee-validate にした。

## バージョン
Vue.js： 2.4.3
Vee-Validate： 2.0.0-rc.18

## サンプル
https://jsfiddle.net/aue29bss/6/
![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/57002/4c35a80c-a116-c4e2-6438-769f703894c8.gif)

## 日本語化
メッセージを日本語化（ローカライズ）するにはローカライズするファイルを読み込む。
日本語（ja）ファイルは予め用意されている。
また、メッセージ内容自体をカスタムしたい場合は、以下のように要素とメッセージを追加すればできる。

```.js
import ja from 'vee-validate/dist/locale/ja';

Vue.use(VeeValidate, {
  locale: 'ja',
  dictionary: {
    ja: {
      custom: {
        password: {
          regex: 'パスワードは半角英数字をそれぞれ1種類以上含む8文字以上100文字以下で入力してください',
        },
      },
    },
  }
});

```
splitの使い方【A/Bテスト】

LP作成ツールには様々なものがありますが、もしRailsを使用してLPを作成しているのであればsplitという便利なgemを使ってみましょう。

#導入
splitを使用するためにはredisのインストールが必要です。

```
$ brew install redis
$ redis-server
```

split gemを入れます。

```:gemfile
gem 'split'
```

ABテスト結果ページのルートを指定します。

```route.rb
mount Split::Dashboard, :at => 'split'
```

ABテストの箇所に以下のように文字を挿入します。

```index.html.erb
<% ab_test('create_user', 'hoge', 'fuga') do |text| %>
  <%= link_to text, new_user_path %> 
<% end %>
```
テスト結果ページは/splitで見られます。
AndroidStudioでcannot resolve symbolが出てはまった

#今回のcannot resolve symbol
cannot resolve symbolで悩まされてる開発者は多いと思うが、今回はeclipseでjarを作ってAndroidStudioに追加してハマったというケース。

解決策の１つとして誰かの役に立てば幸い。（結局自分の単純なミスだったが）

#原因
eclipseのパッケージがdefaultパッケージになってた

#解決策
ちゃんとパッケージを作って、defaultパッケージ内に入っているクラスファイルを移した。それだけ。
TerraformでEC2のインスタンスプロファイルを生成する

# TerraformでEC2のインスタンスプロファイルを生成する

## 解説
- [参考1](https://www.terraform.io/docs/configuration/data-sources.html)
　
- [参考2](https://www.terraform.io/docs/providers/aws/d/iam_policy_document.html)
　

まずData Sourceを用いてIAMのロールを生成します。

```
data "aws_iam_policy_document" "ec2-role" {

  statement {
  	effect = "Allow"

    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}
```

上記を元に実際に生成されたロールは下記のようになります。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      }
    }
  ]
}
```

同じくData Sourceを用いてポリシーを作成します。

```
data "aws_iam_policy_document" "ec2-role_policy" {
  statement {
  	effect = "Allow"
    actions = [
        "autoscaling:Describe*",
        "cloudwatch:*",
        "logs:*",
        "sns:*",
    ]

    resources = [
      "*",
    ]
  }
}
```

上記を元に実際に生成されたポリシーは下記のようになります。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Action": [
        "sns:*",
        "logs:*",
        "cloudwatch:*",
        "autoscaling:Describe*"
      ],
      "Resource": "*"
    }
  ]
}
```

次に、生成されたJSONデータをロール、ポリシーに割り当てます。

```
# Role
resource "aws_iam_role" "ec2-role" {
  name               = "${var.general_name}-ec2-role"
  assume_role_policy = "${data.aws_iam_policy_document.ec2-role.json}"
}
# Role END

# Role-Policy
resource "aws_iam_role_policy" "ec2-role_policy" {
  name   = "${var.general_name}-ec2-role-policy"
  role   = "${aws_iam_role.ec2-role.id}"
  policy = "${data.aws_iam_policy_document.ec2-role_policy.json}"
}
# Role-Policy END
```

下記のようにすることで、生成されたJOSNデータを割り当てることができます。
 
 `assume_role_policy = "${data.aws_iam_policy_document.ec2-role.json}"`

`policy = "${data.aws_iam_policy_document.ec2-role_policy.json}"`



## まとめるとこんな感じ

```iam.tf
# IAM Role for EC2
data "aws_iam_policy_document" "ec2-role" {

  statement {
  	effect = "Allow"

    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}
# IAM Role for EC2 END

# IAM Role Policy for EC2
data "aws_iam_policy_document" "ec2-role_policy" {
  statement {
  	effect = "Allow"
    actions = [
        "autoscaling:Describe*",
        "cloudwatch:*",
        "logs:*",
        "sns:*",
    ]

    resources = [
      "*",
    ]
  }
}
# IAM Role Policy for EC2 END

# IAM Instance Profile
resource "aws_iam_instance_profile" "ec2-profile" {
  name  = "ec2-profile"
  roles = ["${aws_iam_role.ec2-role.name}"]
}
# IAM Instance Profile END

# Role
resource "aws_iam_role" "ec2-role" {
  name               = "${var.general_name}-ec2-role"
  assume_role_policy = "${data.aws_iam_policy_document.ec2-role.json}"
}
# Role END

# Role-Policy
resource "aws_iam_role_policy" "ec2-role_policy" {
  name   = "${var.general_name}-ec2-role-policy"
  role   = "${aws_iam_role.ec2-role.id}"
  policy = "${data.aws_iam_policy_document.ec2-role_policy.json}"
}
# Role-Policy END
```
【LINE DEV DAY 2017】クラウド型AIプラットフォーム「Clova（クローバ) 」について #linedevday

LINE DEVELOPER DAY 2017に参加してきました。
LINEのクラウドAIプラットフォーム「Clova（クローバ) 」のテクノロジーについてのセッションを聞きながらまとめました。
※写真追加しました

# The Technologies in Clova
## 概要
* LINEの新たなプラットフォーム戦略として、クラウド型AIプラットフォーム「Clova」について
* AIプラットフォームであるClovaやスマートスピーカーWAVEについて
* ビジョン、アーキテクチャについて

## 提携企業
![P_20170928_105138_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/f995db56-96e1-b444-8d05-0d31e0994f17.jpeg)

## History
2016年の開始から、これまでほぼ1年で開発されている。
第一弾のデバイスとして、WAVE, Smart Speaker!!
音声認識できるスピーカーで、テレビCMで発表された。
電気をつけたり消したり、音楽をかけたり、LINEのメッセージを送信したり、読み上げたりといった機能があるようだ。
![P_20170928_105202_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/25899840-dc80-5ad8-6f8f-20a53febd450.jpeg)
![P_20170928_101512_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/976db3c0-2e81-8d5f-540f-2f1587ce1959.jpeg)

### WAVE
![P_20170928_145520_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/7afabf80-1760-fc97-bbaf-80cc103aba4c.jpeg)

### CHAMP SALLY
![P_20170928_145512_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/9730bba3-ce65-c6e7-af34-7bedb54cb32a.jpeg)

### CHAMP BROWN
![P_20170928_145533_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/2acd9812-ed61-b374-e133-40c7f887ee09.jpeg)


## Clovaの構成
Client - Brain - Skillの3つで構成される
![P_20170928_112029_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/d17a71a7-653a-9b4d-df80-07de0a3811fb.jpeg)

### Clientの役割
Devices
Apps
などからのユーザインターフェース

### Brainの役割
自然言語理解
音声合成
テキスト生成
など

### Skillの役割
音楽再生
ニュース読み上げ
LINE送信
テレビや電気をつける
など

#### CIC(clova interface connect)
クライアントからの入力をClova Platformへ送信する
SDKとAPIで構成される。
認証認可の仕組み

#### CEK(clova extention kit)
既存のアプリなどにもAPIを提供してもらえればClovaからデータを提供することができる

## Clova使用例
### Exapmle 1「秋に合う音楽をかけて」
#### 解析のながれについて
- 認証やClovaへの接続(CIC)
- 音声テキスト変換(SR)
- テキスト解析　ユーザの意図を判断する(NLU)
- 音楽の決定(CEK-Music)
- 音楽のストリーミング配信(CEK-CIC-Wave)

### Example 2「この曲は何？」
- 現在再生中のタイトル、メタ情報を取得(NLU-CEK-Music)
- 文章生成(SS) Synthesize voice from reply

## HARD PROBLEMS..
### ぶち当たった壁について
独特の言い回し　数字の読み方の解析、理解が難しい。
![P_20170928_112942_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/afe2a0cb-da17-4044-088f-8c953feed1aa.jpeg)


### 日本語の問題
#### 文字種が多い
Stop -> Topと誤認識
止めて -> 込めてと誤認識
日本語では、T K Hはあまり発音されない。

#### 同音異義語
かけて->掛けて、欠けて
二時->虹、二次

#### 発音の問題
晴一時雨 ハレイチジアメをセイ イチジ ウと読んだり。


## SKILLS
![P_20170928_113716_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/29712bc3-ca4f-afda-3480-1727405b66c1.jpeg)


### 現在Clovaで出来ること
Music
Weather
Chat
Fortune
Alarm
など

## FUTURE OF Clova
### Clovaの未来について
重要視するキーワード ： GROWTH

#### 今秋発売
WAVE, Smart Speajejr
New Devices CHAMP, Smart Speaker。LINEのサリー、ブラウンのかわいい系のスピーカー

### 強化したいポイント
#### 話者認識
家族には、こんにちは
たまたまやってきた友達は、はじめまして
 
#### 日時時間の認識
おはよう、こんばんはの使い分け
Happy New Yearなど
 
#### Clova x Gatebox コラボレーション
午後のセッションにて詳細
 
## 最後に、もっと大事なこと
エンジニアの皆様の力
2018年には開発できる環境を提供する予定。

会場の方、抽選で50人にWAVEをプレゼント！
CircleCI2.0で「error: unknown switch `B'」エラー

circleci2.0ではまったのでメモ。
環境は、CentOS6系をDockerで固めてCircleCIで使っている。

自前のDockerでテストをしようとした時に、
step:内のcheckoutの段階で「error: unknown switch `B'」というエラーがでてしまう。
ローカルではそんなエラーはでないんだけど。

原因はDocker内のGitのバージョンが低いことだった。
調べたらver1.7だった。古い..。
Gitを2系に上げてあげることで無事ビルド通った。

ここでもうひとつハマリポイント。
Docker内でGitのソースを落としてtarで解凍してアップデートのだが、
これがまた以下のエラーを引き起こしてしまった。

```
CircleCI was unable to start the container because of a userns remapping failure in Docker.
This typically means the image contains files with UID/GID values that are higher than Docker and CircleCI can use.
```

rootでtar解凍をしたコンテナを固めて使うと、
UIDがDockerの限界を超えることが有り、
そうなっちゃったら今回のようなエラーになるようだ。
なので、別な方法でアップデートする

TarをつかわないGitのアップデート
http://blog.a1yama.com/entry/2016/10/14/191706tar


これでやっとグリーン！
CircleCI 2.0は速くていいですね。