OmniAICreator/Qiita-1.07M huggingface dataset:
よく聞くUMLって何？

## この記事をまとめようと思った理由
そもそもUMLについて結構な頻度で言葉として聞くが、実際に私が理解しているとは思えなかったたのでいろいろ調べてみました。

## UMLとは
>Unified Modeling Languageの略称で
Unified(統一された)
Modeling(モデリング)
Language(言語)
ソフトウェアを形式化するための統一されたモデリング言語のこと

分かりにくいので言い換えると
>ソフトウェアの機能や構造を表す「図」の描き方

## UMLの[ダイアグラム](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)

UMLには用途によっていくつかダイアグラムがあります。

### 1 クラス図　(Class Diagram)
あるクラスがどのクラスとどのような関係があるのか、どのような変数を保持しているのかなどを視覚的に理解することができます。
![class.jpg](https://qiita-image-store.s3.amazonaws.com/0/183354/4e44be0a-a11b-334f-2d4f-ba4b0ac258ed.jpeg)



### 2 パッケージ図 (Package Diagram)
パッケージには複数のクラスがまとめられていますが、そのパッケージ間の関係を表現することができます。
![20110828211820.jpg](https://qiita-image-store.s3.amazonaws.com/0/183354/da56c833-d302-0795-82d5-ebb361e0af63.jpeg)
[参考](http://d.hatena.ne.jp/chiharunpo/20110828/1314534479)


### 3 オブジェクト図 (Object Diagram)
インスタンス間の関係を表現することができます。
![uml-object02.jpg](https://qiita-image-store.s3.amazonaws.com/0/183354/b9703081-93bd-ce8a-9621-71c41883d93e.jpeg)
[参考](http://www.itsenka.com/contents/development/uml/object.html)


### 4アクティビティ図(Activity Diagram)
一連の処理における制御の流れを表現できます。フローチャートような感じです。
![アクティビティ図0.jpg](https://qiita-image-store.s3.amazonaws.com/0/183354/bcf4d338-77da-10a9-3fee-f2efab3f9ac7.jpeg)



### 5 ユースケース図(Use Case Diagram)
システムが提供する機能と利用者の関係を表現します。
![useCaseDiagram.jpg](https://qiita-image-store.s3.amazonaws.com/0/183354/fc4f3964-f436-15e7-ce60-171512053b91.jpeg)
[参考](https://www.ogis-ri.co.jp/otc/swec/process/am-res/am/artifacts/useCaseDiagram.html)


### 6 シーケンス図(Sequence Diagram)

オブジェクト間の連携や動作の流れを表現するダイアグラムです。
イベントが起きた時にどのような流れで処理が進むかなどを表現しています。
![uml-sequence02.gif](https://qiita-image-store.s3.amazonaws.com/0/183354/6c2b3cdd-27f4-40b2-913f-b175170ea274.gif)

[参考](http://www.itsenka.com/contents/development/uml/sequence.html)

### 7 コミュニケーション図(Communication Diagram)

インスタンス間の相互作用を構造の中心に表現します。

![uml-communication01.gif](https://qiita-image-store.s3.amazonaws.com/0/183354/cd4098d2-4cc4-b5fa-c86c-31b7ee8a3aab.gif)

[参考](http://www.itsenka.com/contents/development/uml/communication.html)


##まとめ
ここで紹介した７つ以外にも様々なダイアグラムがあります。これからプログラムを学ぶ方にとって
UMLを学ぶことは大きなメリットがあります。
UMLはシステムの構成や動作を俯瞰的に見ることができるようになるので、プログラムだけでなくシステム全体を理解しやすいのです。
また、UMLはシステムの全工程をカバーします。UMLは適用範囲が広いため、実際の開発で使いこなすためには、単に「図」の描き方を覚えるだけでなく、その目的や用途をしっかりと押さえておくことが大切かなと思いました。
Oracle Compute Cloudインスタンスのスナップショット（バックアップ）

# 2種類の方式

* インスタンススナップショット
* ストレージスナップショット

## インスタンススナップショット

* インスタンスを非永続ブートディスクを使用して作成する必要がある
    * インスタンスを停止すると削除される
        * 停止はオーケストレーションの停止でしかおこなえない 
    * ブートディスクの容量が少ない（Windows 2012 R2で27GB）
* 初期構築用や、開発環境用のテンプレートを作成し、同じ環境を多数作成する場合に有用

## ストレージスナップショット

### 2種類の形式

* コロケート
* 非コロケート

#### コロケート

* Copy on Write方式でのスナップショット取得
    * スナップショット取得時は、ポインタを記録するのみ
        * 数秒で終わる
    * データ更新時、更新前データをスナップショット領域に保存する 
* 元のボリュームと同じブロックストレージ内に保存される
    * バックアップには向かない
* テスト時等に有用

#### 非コロケート

* 全てのデータをスナップショット領域に保存する
   * データ量に比例して時間がかかる 
* オブジェクトストレージ(Oracle Storage Cloud Service)内に保存される
* バックアップに有用
* Storage Cloudのジオレプリケーション機能を使えば複数箇所にバックアップできる

### 取得したスナップショットのリストア方法

#### コロケート

* 任意の名前でリストア(=新ボリュームの作成)をおこなう
    * スナップショット元のデータと、スナップショットデータを使っておこなわれる 
* 同じサイト(ゾーン)内にのみリストア可
* インスタンス作成時にリストアしたボリュームを選択する
    * スナップショット元のデータも利用しているため、インスタンス作成後はスナップショット元のデータは削除できない

#### 非コロケート

* 任意の名前でリストア(=新ボリュームの作成)をおこなう
* 別サイト(ゾーン)内にもリストア可
* インスタンス作成時にリストアしたボリュームを選択する

### 注意点

* データの一貫性が必要な場合、インスタンスが停止している状態で取得する
メモ：dockerコンテナ内のjarをクラス指定で起動する

関わっているプロジェクトでdockerを使っているのですが、プロダクト内(scala)に単独実行可能なバッチスクリプトを入れ込んだ際、dockerのコマンド経由でそのバッチだけを起動する方法がわからなくてハマったのでメモ。
バッチのjar起動時にはいつもclasspathの指定で起動していたが、dockerで生成された起動スクリプト(`bin/hoge-app`)の`-main`オプションを指定すれば同じことができるっぽい。
dockerのイメージはsbtのsbt-native-packagerで生成してます。

試しにローカルで実行

```bash
# sbtからdocker imageをビルド
$ sbt docker:stage
$ sbt docker:publishLocal
# プロジェクト内に生成されたdocker imageへ移動
$ cd target/docker/stage/opt/docker
$ bin/hoge-app -main hoge.batch.FugaBatchLauncher # クラスパスを指定
```

サーバ環境側で実行

```bash
# サーバ環境ではGCPのCONTAINER REGISTRYでコンテナを管理しているのでプルしてくる
$ gcloud docker -- pull gcr.io/hoge-app:1.0
# 起動。mysqlと接続のためにlinkを指定。/bin/bashにて起動オプションなどを指定。
$ docker run --rm -p 9000:9000 --link mysqld:mysql-container gcr.io/hoge-app:1.0 /bin/bash -c "bin/hoge-app -Dconfig.resource=application.conf -Dlogback.configurationFile=logback.xml -main hoge.batch.FugaBatchLauncher"
```

あとは上記、起動スクリプトをcronに指定すればバッチ起動できそう
IE11でPolymer 2.0は動かないのか



polymerのステップガイドを元に進めてみましたが
https://github.com/PolymerLabs/polymer-2-first-element

Chromeでは画面が表示されるものの、IE11では画面が真っ白

F12で開発者ツールを開いてみると赤くなってます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/4a90d88a-521c-3770-7fc4-139b3b067cbf.png)

Polymer.LegacyElementMixinメソッドが無いとか表示されてます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/8bb59617-2a0a-6ab2-b110-4722f157f409.png)



しかし、PolymerのHPはIE11でもちゃんと表示されます。
https://www.polymer-project.org
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/27dc56d2-ebe4-e5b1-0c1d-fcdccdd7a37c.png)


ブラウザ対応状況も見つけることが出来ませんでした。

Polymerのバージョンは2.0.0

同じ内容ではないですがGithubにIssuも上がっているようです。
https://github.com/webcomponents/shadydom/issues/117


visual studioで動かしてみるとさらにエラー画面が閉じても閉じても現れました。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/568bc466-719b-68ae-ebd6-5e568e450cd2.png)

最終的には白くなって落ちてしまいました。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/7926d64f-f2a3-5e12-21e0-72f2cd60fd82.png)



IE11でPolymer2を適用するのはもうしばらく様子見なんでしょうか・・・
requireでオブジェクトを受け取る時に、グローバル名前空間を汚さない方法

超ウルトラ小ネタ。

`require`で別ファイルを読み込んで、そこで生成したオブジェクトを受け取る場合があります。
こんな感じですね。

```php:main.php
$config = require './config.php';
```

```php:config.php
$config = new Config();

$config->foo();
$config->bar();

return $config;
```

ただ、これだと`$config`というのがグローバル名前空間を汚染しちゃいます。
そこで無名関数で括っちゃいましょう。

```php:config.php
return (function () {
	$config = new Config();
	
	$config->foo();
	$config->bar();
	
	return $config;
})();
```

一件落着。
おしまい。
PDIからKdb+へ接続する

#はじめに
PentahoのETLツールであるPDIでKdb+へ接続できるかの検証メモです。
Kdb+はカラム型の時系列DBのようです。今回の趣旨はPDIからKdb+へ接続できるかなので、Kdb+がどういったものかは調べてません。
https://en.wikipedia.org/wiki/Kdb%2B

#Kdb+のインストールと起動
##インストール
まず、無料版のKdb+のダウンロードします。
http://kx.com/download
![pdi_kdb_download.png](https://qiita-image-store.s3.amazonaws.com/0/186651/c308bdc3-76cc-a1b3-1788-c863890c0a60.png)
Email、各チェックボックスにチェックを入れて、ページ下部のダウンロードしたいOSをClickします。
Zipファイルがダウンロードできるので、解凍してどこかのディレクトリに置いておきます。
ここでは、Windows版をダウンロードして、C:\test\配下に解凍してできた"q"ディレクトリを置くことにしました。

##環境設定
次に、変数を設定しておきます。コマンドプロンプトを起動して以下のように設定。

```
C:\>setx QHOME "C:\test\q"
C:\>setx PATH "%PATH%;C:\test\q\w32"
C:\>exit
```

##Kdb+の起動
Kdb+を起動します。コマンドプロンプトを起動して"q -p 5000"として実行。

```
C:\> q -p 5000
KDB+ 3.5 2017.05.02 Copyright (C) 1993-2017 Kx Systems
w32/ 2()core 4095MB michi kdbdemo 10.128.0.2 NONEXPIRE

Welcome to kdb+ 32bit edition
For support please see http://groups.google.com/d/forum/personal-kdbplus
Tutorials can be found at http://code.kx.com/wiki/Tutorials
To exit, type \\
To remove this startup msg, edit q.q
q)
```

#テーブルの作成
Kdb+を起動した状態で、テーブルを作成します。

```
q) family:([]name:`John`Mary`David; age:52 49 18; hair:`brown`black`blonde; eyes:`blue`brown`blue)
```

確認。

```
q) family
name  age hair   eyes
----------------------
John  52  brown  blue
Mary  49  black  brown
David 18  blonde blue
q)
q) select name,age from family
name  age
---------
John  52
Mary  49
David 18
q)
```

ブラウザからも確認しておきます。
http://localhost:5000
![pdi_kdb_check.png](https://qiita-image-store.s3.amazonaws.com/0/186651/0e2aea3d-9019-5a3d-25e2-800687bb5bf6.png)

# PDIのダウンロードとインストール
[こちら](http://qiita.com/mik/items/8a36e8efb06367c82b41)を参照に、ダウンロードとインストールをしておきます。

#Kdb+のJDBCドライバーのインストール
以下よりダウンロードします。
https://github.com/KxSystems/kdb/blob/master/c/jdbc.jar

ダウンロードしたjarファイルを以下の場所に配置します。

```
data-integration/lib/配下
```

#PDIからKdb+へ接続
##接続設定
PDI(Spoon)を起動して「テーブル入力(Table Input)」ステップを置いて、ステップをダブルクリックして設定画面を表示します。
![pdi_kdb_tableinput.png](https://qiita-image-store.s3.amazonaws.com/0/186651/6e5d067c-cb05-cf86-80ae-b205b522b6dc.png)

「データソース名」の横の方にある「新規作成」ボタンを押してデータソース接続の設定画面を表示し、設定を行ないます。
![pdi_kdb_conn.png](https://qiita-image-store.s3.amazonaws.com/0/186651/f85cfbb9-8722-f245-c84a-4bb212fefa2e.png)

```
接続名：kdb
接続タイプ：Generic database
カスタム接続URL：jdbc:q:localhost:5000
カスタムドライバークラス名：jdbc
ユーザ名：OSユーザ名
パスワード：OSユーザのパスワード
```

##確認
SQLステートメントを以下のようにしてプレビューで確認します。

```
family
```
![pdi_kdb_table_check1.png](https://qiita-image-store.s3.amazonaws.com/0/186651/acf29b8e-e849-c4d6-e86d-8e27a9e07b66.png)

<BR>
別のクエリでプレビュー確認します。

```
select name,age from family
```

![pdi_kdb_table_check2.png](https://qiita-image-store.s3.amazonaws.com/0/186651/98b8b39b-8878-3e0b-6c6d-333ba88064da.png)

<BR>
以上で、接続できました！

#参考
http://code.kx.com/wiki/Tutorials
https://groups.google.com/d/forum/personal-kdbplus
Amazon API Gateway にカスタムドメインを設定する

## 概要
[Amazon API Gateway](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.html) に独自ドメインを設定しアクセス可能にします。
SSL証明書は [AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/) を利用します。

## 前提条件
この記事の内容を実践する為に必要な前提条件です。

- 公開可能済のAPI Gatewayが存在している事
- 利用可能なドメインを取得している事
- AWS Certificate ManagerでSSL証明書が準備されている事

### 前提条件1 API Gatewayの準備

API Gatewayの準備ですが、[Serverless Framework](https://github.com/serverless/serverless) を使うと簡単に用意出来るのでオススメです。
以前、 [Serverless Frameworkのインストールと初期設定](http://qiita.com/keita-nishimoto/items/879bb8c075db802906df) という記事を書きましたので参考になると幸いです。

### 前提条件2 利用可能なドメインを取得する

Route 53でドメインを購入すると全てがAWSのサービスで管理出来る事になるのでオススメです。
ドメインの購入方法等は下記の記事に載せてありますので参考にして頂けると幸いです。

- [AWSのサービスでドメインを取得しALBでSSLで接続出来るようにする](http://qiita.com/keita-nishimoto/items/4b2db95eae81044a779c)

### 前提条件3 AWS Certificate ManagerでSSL証明書を準備する

手順に関しては難しくありません、 [AWSのサービスでドメインを取得しALBでSSLで接続出来るようにする](http://qiita.com/keita-nishimoto/items/4b2db95eae81044a779c) に取得方法を記載してあります。

1点だけ注意点があります。それは証明書を配置する region は必ず ```us-east-1``` 米国東部（バージニア北部） にする事です。

2017-06-15 現在の時点では AWS Certificate Manager の証明書を利用する為には、証明書が ```us-east-1``` 米国東部（バージニア北部） に配置されている必要があります。

## API Gatewayにカスタムドメインの設定を行う

マネジメントコンソール → Amazon API Gateway → +カスタムドメイン名の作成 より設定を行います。

以下の情報を入力します。

- ドメイン名: 任意のドメイン名を入力します
- ACM 証明書: 作成した証明書を選択します
- ベースマッピング: 作成したどのAPI Gatewayにマッピングさせるかを選択します

![custom-domain1.png](https://qiita-image-store.s3.amazonaws.com/0/71899/e11edc78-10f4-b025-0907-7f995c8785fd.png)

「保存」を押すと作成が開始されます。（かなり時間がかかります）

しばらくすると下記のような形になります。
この「ディストリビューションドメイン名」という箇所をコピーしましょう。

![custom-domain2.png](https://qiita-image-store.s3.amazonaws.com/0/71899/f458e0a2-489c-b947-9531-9ef92ad9b6a9.png)

## ディストリビューションドメイン名をRoute 53に設定する

DNSレコードの設定を行っていきます。

私の場合はAPI Gatewayに設定したドメインは 元々持っていたドメインのサブドメインとして設定を行いました。

その為、元々のHosted zoneにAレコードとして登録を行います。

Name: 設定したドメイン名を入力
Alias Target: 先程コピーしたディストリビューションドメイン名

![CreateRecordSet.png](https://qiita-image-store.s3.amazonaws.com/0/71899/31cac565-f17a-3bb9-f3c1-230c6b9ad420.png)

このあたりの方法に関しては [AWSのサービスでドメインを取得しALBでSSLで接続出来るようにする](http://qiita.com/keita-nishimoto/items/4b2db95eae81044a779c) でも方法を紹介しています。

## 動作確認

最後に動作確認を行います。

```bash:自動で割り当てられるURLで接続
curl -v https://i99999999i.execute-api.ap-northeast-1.amazonaws.com/development/other
```

```bash:設定したカスタムドメインで接続
curl -v https://api-gateway.hoge.org/other
```

両方で同じ内容が返ってくれば成功になります。

以上になります。最後まで読んで頂きありがとうございました。
JavaでUDP通信をしてみた

JavaでUDP通信をする方法を調べました。`DatagramSocket`を使ったやり方は知っていましたが、今回はjava.nioを使ったやり方を調べました。

## 受信する

まずはUDPメッセージが送られてくることがわかっている前提で、受信するコードを書いてみます。

```java
// UDPチャンネルを作成
DatagramChannel channel = DatagramChannel.open();

// 9999番ポート宛のUDPメッセージを受け取るようにする
channel.socket().bind(new InetSocketAddress(9999));

// メッセージを受け取るためのバッファを用意する。
// バッファよりメッセージが大きい場合、入り切らなかったメッセージは破棄される。
ByteBuffer buf = ByteBuffer.allocate(453);
buf.clear();

// メッセージの受信を待機する
channel.receive(buf);

// データをbyte[]に受け取る
buf.flip();
byte[] data = new byte[buf.limit()];
buf.get(data);
```

## 送信する

次に送信する側のコードを書いてみます。

```java
// UDPチャンネルを作成
DatagramChannel channel = DatagramChannel.open();
// 9999番ポートからUDPメッセージを送るようにする
channel.socket().bind(new InetSocketAddress(9999));

// 送信するデータをByteBufferの形にする。
// ここではString->byte[]->ByteBufferと変換している。
String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();

// 送信
int bytesSent = channel.send(buf, new InetSocketAddress("127.0.0.1", 41234));
```

受信する時も送信する時も、`DatagramChannel`を作成してソケットをバインドするところまでは同じです。そして送受信したい内容を`ByteBuffer`に変換してやりとりします。
自分で低レベルなプロトコルを実装したい！という場合でないなら、メッセージの内容をJSON等の方式で文字列化して、`String`->`byte[]`->`ByteBuffer`として送るのが汎用的に使えて良いのではないかと思います。
Javaアプリケーション同士の通信であれば[ObjectInputStream](https://developer.android.com/reference/java/io/ObjectInputStream.html)と[ObjectOutputStream](https://developer.android.com/reference/java/io/ObjectOutputStream.html)を使って任意のオブジェクトを直接やりとりすることも可能です。

注意点としては、UDPではTCPのように相手にメッセージがきちんと届くことは保証されてはいないので、**届かなくてもエラーになりません。**なのでデバッグ中にコードにミスがあっても見つかりにくいことがあります。

## 番外編

ちなみにNode.jsだとUDPの送受信はこんなに簡単です。

```js:受信
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

// 9999番ポートで受信を待機
server.bind(9999);
```

```js:送信
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.send('Hello', 9999, '127.0.0.1', (err, bytes) => {
  console.log(err, bytes)
});
```

JavaアプリケーションのUDPメッセージ送受信部分をデバッグする時には仮のメッセージ送信用にNode.jsでテストプログラムを書くと便利かもしれませんね。
NSLinguisticTaggerで形態素解析してみた

#NSLinguisticTaggerとは？
テキストを形態素解析と品詞分解してくれるクラス

#形態素解析のコードを書いてみる
今回はPlaygroundで

```swift
import UIKit

var text = "伊能忠敬は全国を歩いて測量の旅をしたよ"

// "ja" = 日本語
// "en" = 英語
let tagger = NSLinguisticTagger(tagSchemes: NSLinguisticTagger.availableTagSchemes(forLanguage: "ja"), options: 0)

tagger.string = text

tagger.enumerateTags(in: NSRange(location: 0, length: text.characters.count),
    scheme: NSLinguisticTagSchemeTokenType,
    options: [.omitWhitespace]) { tag, tokenRange, sentenceRange, stop in

    let subString = (text as NSString).substring(with: tokenRange)
    print("\(subString) : \(tag)")
}
```
これを実行すると

<img width="429" alt="スクリーンショット 2017-06-15 18.06.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/c264e8e4-f575-bb51-8226-695a13631a4d.png">
まぁこんな感じ
英語も同じようにやってくれるようです

#品詞分解をやってみる
英語はしっかりと品詞分解までやってくるそうなのでやってみます
日本語は対応してないみたい
>
##コードの変更点
言語は"en"(英語)に変更
schemeを"NSLinguisticTagSchemeLexicalClass"に変更

```swift
import UIKit

var text = "Tadataka Ino traveled the whole country and made a journey of surveying"
// "ja" = 日本語
// "en" = 英語
let tagger = NSLinguisticTagger(tagSchemes: NSLinguisticTagger.availableTagSchemes(forLanguage: "en"), options: 0)

tagger.string = text

tagger.enumerateTags(in: NSRange(location: 0, length: text.characters.count),
    scheme: NSLinguisticTagSchemeLexicalClass,
    options: [.omitWhitespace]) { tag, tokenRange, sentenceRange, stop in

    let subString = (text as NSString).substring(with: tokenRange)
    print("\(subString) : \(tag)")
}
```

実行するとこんな感じ
<img width="453" alt="スクリーンショット 2017-06-15 18.43.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/39298a6e-85e5-f549-53b9-f52af9b35619.png">
if文を使えば名詞(Noun)や動詞(Verb)のみを抽出もできたので参考になれば

```swift
if (tag == "Noun")
```
MacでWindowsPCにリモートアクセスした際のUS配列問題解決法


US配列は慣れてない人からするとイライラの原因
（「"」が「@」になったりとか）

おそらく他のサイトではレジストリーをいじるとか書いてあるけど、自分は下記の方法で簡単になおったので共有

コントロールパネル→地域と言語→キーボードと言語→キーボードの変更
「インストールされているサービス」内にUSがあるはずなので、選択して削除
（下記は削除後なので注意）
リモート先のWinPCを再起動して再度リモートアクセス。
これで治りました。

![Kobito.jAWzwQ.png](https://qiita-image-store.s3.amazonaws.com/0/41877/6524c677-dc50-d1a1-20e8-2c45852bc183.png "Kobito.jAWzwQ.png")
「ディスク一杯でやばい！早く空けて！」と言われた時に急いで対応するLinuxコマンド


超基本的なコマンドですが、普段使ってなくてググりまくったのでメモ。


# まずはともあれdf

```bash
df
```

Linuxのファイルシステム別に容量表示するコマンド。
１秒で「あー、確かに一杯ですね」と得意げに言えます。


# 深さ指定してディレクトリ別に容量表示

```bash
du -h --max-depth 3
```

ざっくりとあたりをつけたいなら、duコマンドがいいです。
３０秒でだいたい分かります。

深さはお好みで。


# 300MB以上のファイルを表示する

duでおおよそのあたりがついたら
ファイル単位で特定する時のコマンド。

時間それなりにかかります。

```bash
find . -size +300M | xargs ls -l | sort -rn
```


# このログ多分いらないけど念のためzipにして置いて！

```bash
zip -r "yyyymmdd.zip" *
```


# 削除コマンド

無事退避やアーカイブがすんだら実施。
タイポ無いか２回くらいチェックしましょう

```bash
rm -r ディレクトリ名
```
mutexとatomic比較

ベンチマーク
--------------------

```go
package atomic_test

import (
	"sync"
	"sync/atomic"
	"testing"
)

func BenchmarkAtomic(b *testing.B) {
	var c uint32 = 0

	for i := 0; i < b.N; i++ {
		atomic.AddUint32(&c, 1)
		atomic.LoadUint32(&c)
	}
}

func BenchmarkMutex(b *testing.B) {
	var c uint32 = 0
	mutex := sync.RWMutex{}

	for i := 0; i < b.N; i++ {
		mutex.Lock()
		c++
		mutex.Unlock()

		mutex.RLock()
		_ = c
		mutex.RUnlock()
	}
}
```

結果
--------------------

```shell-session
$ go test -run NONE -bench . -benchmem
testing: warning: no tests to run
BenchmarkAtomic-4   	100000000	        14.0 ns/op	       0 B/op	       0 allocs/op
BenchmarkMutex-4    	20000000	        60.7 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	none/goexp/atomic	2.729s
```
勉強会レポート - 脱・モール依存！自社EC成功事例セミナー

## 14:30-14:35	開始のごあいさつ	
モール依存ではなく自社ECを成長させよう！

## 14:35-16:05	第1部
自社EC比率を高める『SEO戦略』と『スマホ対策』の具体策および成功事例
モデレータ：株式会社ドリームエナジーコンサルティング 代表取締役 水上 浩一氏
http://www.ecjissenkai.com/index.html

★閑散期の売上の底上げが大切

#### モールと自社ECの違い
モール依存のリスク
・効果測定がしにくい、お金がかかる
　→広告費が『投機的』になっている
・ランキングやビュー数・CPC広告ばかり気にしてしまう
　→接客やサポートがおろそかになる。離脱懸念がある。

売上　＝　アクセス数　×　転換率　×　客単価
　　　　　　　　　　　アクセス数　＝　新規＋リピーター
→各変数の数値をあげることが大切

★自社の顧客リストが大切
★売上より利益が大切
　　売上中毒に要注意

★モールではできない本店での効果的な施策
リスト活用・接客　リピート集客　
スマフォマーケティング　転換率・客単価
コンテンツマーケティング　新規集客・転換率
SEO集客　新規集客
広告の効果測定　新規集客・リピート集客・客単価up

#### リスト活用・接客　リピート集客　
【例】e-花屋さん
3月にギネス級の売上をあげる
＝閑散期の売上＝底上げが大切
接客を重視してメルマガや接客を重点的に行う

繁忙期に売る上げ、ユーザー数をアップ
→そのユーザに対して通年売れるものを閑散期に紹介
接客が大切！！

【津田コスメ】
お試しメール→ステップメールの活用で年間５回ギネス更新。
年間4,000万の売上貢献
３日７日１０日後に送信

#### スマフォマーケティング　転換率・客単価
世の中の転換率　７：３＝SP：PC

【例】ジョッパーズ
買わない要因である不安要素を解消する（サイズがあうか？）
→ブーツお試しキャンペーン
→返品は『経費』でなく『販促費用』として計上
→乗馬クラブ内での口コミを狙う

【例】キューリングKカップ
選べる８箱セットはプルダウンが大変
→３種類から選べるようにした
→売上２００％アップ
★選びやすくした（選びにくいから）

★売れない三大理由
１、商品が選べない
２、リソース分散
３、ターゲット間違え

【例】ワークストリート
型番商品の中のオリジナル商品に注力する
オリジナル商品の開発ストーリーを書いて共感してもらう→安全靴『チャーリー』とは？
→お得感、第三者評価、お客様の不安要素解消（値引き・サイズ交換キャンペーン）
転換率アップ　３．７３　→　５．１８

★スマフォはトップページが大切
★階層が深いほど転換率が下がる

#### コンテンツマーケティング　新規集客・転換率
★コンテンツマーケティングの基本は【共感の創出】
１、人
　共感創出プロフィール
２、商品
　選び方コンテンツ『商品の選び方』　いきなり商品を選べと言われても困る。。。
　【例】京都東山堂　合気道着でSEO１位　※言葉のゆらぎに注意
３、店舗・会社
　【例】エッセンシアライズ
　サポート力でファンを獲得。スタッフが資格を取得。電話対応。
　転換率　PC　０．９→３．２　スマフォ　０．８→３．４
　　　
★コンテンツの質（価値あるコンテンツ）
★コンテンツの量を増やす
　→googleのインデックスを増やす▲の底辺を増やす＝商品を増やす　
　商品がない場合はグログなどでカバーする
Q＆Aをブログでかいてコンテンツを増やす

#### SEO集客　新規集客
モールと本店の導線の違い
・モール
　サーチ起点なので店舗内回遊がない
　楽天サーチは価格コムと同じ　インプレッションが上がっても売上が下がる
・本店
　トップページのセッション数が多い→回遊が起こる

検索エンジンは価格比較されにくい
楽天GOLD７〜８割で集客している店舗がある
→楽天でもSEOで商品が売れる

本店のトップページで必須要素がある　※別表参照

SEOで集客力が高まったあとにクーポンやポイント施策で転換率をあげる

#### 広告の効果測定　新規集客・リピート集客・客単価up

【例】O.C.Farm
広告の効果想定でチューニングしましょう。
ノウハウ化！
お試しセットから大袋バンドル販売
→★商品設計をしっかり行う
リピート率４７％

★『選びやすさ』は転換率UP
★不安要素解消コンテンツはSEOにも効く

## FutureShop2（15分）	EコマースプラットフォームFutureShop2
「自社Eコマース活性化の最新機能３選！」 →４選
・アマゾンログインペイメント
・Line@
・リタゲメール
・？

## 16:30-17:30	第二部
パネルディスカッション（60分）	売上の「自社EC比率」を高め続けているEコマース事業者４名様による
### 株式会社NUTS 代表取締役 沼尾 保秀（ぬまお やすひで）氏
http://nutscollection.jp/hokuotokei/
自社とモールの違い？
　集客が違う。
　楽天は粗利がどんどん減っていく。（わけのわからない課金がいっぱい）
　だから自社ECをやった。
　が、SEOがまったくあがらなかった。（半年）
　→やるべきことをきちんとやれば良い。
　転換率をあげるページを作ってからアクセスを増やす。→楽天でも同じ施策が効く

クーポン
アマゾンログインペイメント　７割の購入者が利用

○○公認専門店と店名を変更する　SEIKOクロック専門店
違うジャンルのお店を同じドメインで扱う

### 株式会社下本商会 専務取締役 野々村 有城（ののむら ゆうき）氏
http://www.work-street.jp/
型番商品で勝負するコツ
　モールは商品詳細ページでよかった。
　本店は無機質になりがちのため人間味をだした。

レジにすすむボタンがでかい！とにかくカートのボタンがでかい！
会員登録の内容と配送情報の内容は同じを強調する→新規会員登録アップ

★型番ECは接客とホスピタリティが重要
店舗名をおぼてもらうような接客をすることが大切

### 株式会社ドクター津田コスメラボ 取締役 津田 麻里絵（つだ まりえ）氏
http://www.tsuda-cosme.com/
銀座シックスで実店舗を経営中

クーポン　８０００円購入で1000円オフ、かつ、１００００円で送料無料。
ステップメール　ブランドコンセプトをサンクスメールに書く　→　津田節子とは

雑誌などブランドを露出する→リピートは本店で獲得する
本店以外の値引きは行わない

## 17:30-17:45	質疑応答（15分）	 


## 17:45-17:50	終わりのあいさつ
最も簡単に、OpenStackトライアル（２：イメージの登録・作成・起動）

[前回（最も簡単に、OpenStackトライアル（１：インストールまで））](http://qiita.com/kouta_hara/items/86688b83828fd0162a2b)に引き続き、イメージの読み込みから作成・起動までのメモを残します。

# イメージの登録
インスタンスを作成するには、予め対応するOSのイメージを登録しておかなければなりません。
様々なOS・ディストリが専用のファイルを公開してくれているので、それを利用しましょう。
今回はFedoraを利用したいと思います。
※.他のOSはダウンロードに時間がかかってしまいそうだったので。
イメージの入手方法については、以下のページでも解説されていますので必要に応じて確認ください。
https://docs.openstack.org/ja/image-guide/obtain-images.html

## Fedoraイメージの入手
以下のページから、
"Cloud Base image for Openstack"（qcow2 イメージ）をDLし、任意のディレクトリへ保存してください。
https://alt.fedoraproject.org/cloud/

## イメージの登録
１．ダッシュボードから[コンピュート>イメージ]を選択し、表示された画面から「イメージの作成」をクリックします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/131348/ef6c23df-72a4-b5a7-910f-912ab0656cd5.png)

２．表示されたダイアログからイメージファイルをアップロード・登録します。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/131348/02d0850e-3902-420a-b135-02818bc95d05.png)

３．キーペアの登録
[コンピュート>キーペア]から、インスタンスへの接続に利用するキーペアを作成します。
キーペア名を入力して「キーペアの作成」をクリックすれば、自動で作成されたキーペアのダウンロードが始まります。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/131348/2450fb85-a1bf-d3ad-e738-83ed70f9660e.png)

４．インスタンスの作成
[コンピュート>インスタンス]から「インスタンスの起動」をクリックすると表示されるダイアログから、インスタンスの登録を行います。
左メニューのそれぞれ"*"のついた項目を設定後、キーペアに<３．キーペアの登録>で作成したキーペアを指定して作「インスタンスの起動」をクリックすれば、インスタンスの作成は完了です。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/131348/298d62df-4a22-0443-1d61-a91f32d2915c.png)
![10.png](https://qiita-image-store.s3.amazonaws.com/0/131348/c3113746-d522-344f-d552-5de4f4fcda87.png)

５．起動確認
[コンピュート>インスタンス]から、<４．インスタンスの作成>で作成したインスタンスの名前をクリックし、表示される画面の「ログ」タブをクリックし、見慣れた表示(****** login:)が表示されていれば、インスタンスは無事起動しています。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/131348/dabfa131-1be6-5e87-b22c-2db3b1dd3993.png)
HUISでhueとps4どちらも操作

HUISを使って、[ps4を操作するアプリ](http://qiita.com/gao_/items/40a41d064afe39326d95)、[hueを操作するアプリ](http://qiita.com/gao_/items/a8079fa2bd163a277eb4)を作ってきたのですが、どちらも操作したい。
と思ったので、アプリを1つにまとめてみました。

アプリを起動しておかないと、HUISの操作が取得できないので、Android端末は常にアプリを起動させて置く必要があります。
自宅で眠っている古いスマホなどを使ってもらえると良いです。


# 使ったもの
[HUIS REMOTE CONTROLLER](http://huis.jp/remote-controller/)


[HUIS BLUETOOTH® CRADLE](http://huis.jp/remote-controller/cradle/)

[Philips Hue(ヒュー) スターターセット](https://www.amazon.co.jp/dp/B01C6S7DDU/ref=cm_sw_r_tw_dp_x_Nq4VybMQH1KND)
※利用したのはv1ですが、今買うならv2のほうがいいかも。

Android端末
Android 4.0.3以上であれば動くと思います。たぶん。

# HueをAndroidアプリで操作する方法
こちらに関しては比較的簡単です。PhilipsがSDKを用意しているのでそれを使いましょう。
[URLはこちらから](https://www.developers.meethue.com/documentation/java-multi-platform-and-android-sdk)
会員登録が必要です。

[APIGuide](https://www.developers.meethue.com/documentation/java-sdk-getting-started)もあるため、そこまで実装に苦労することはないと思います。
実装が知りたい方がいれば公開します。


# HUISの入力を受け付ける 
ここのコードを工夫します。
Androidに用意されている、```dispatchKeyEvent```を使うのは変わりません。
ここで、データベースの中から、押されたボタンの情報を探し出して、hueかps4のどちらを操作したいか取得して、動かします。


```test.java
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        // 押されたとき離れたときの２回取得されないように
        if (e.getAction() == KeyEvent.ACTION_UP) {
            // ここで、ps4かhueかを判別
        }
        return super.dispatchKeyEvent(e);
        
```


# 使い方
ファイルをダウンロードしておきましょう。

[Windows用](https://1drv.ms/u/s!Ao_XybtXsfEPiWtQInhrdy6i3Ell)
[Mac/linux用](https://1drv.ms/u/s!Ao_XybtXsfEPiWzgAXR4hbQyw9lo)

ファイルをダウンロードしたら、展開しておきます。


インストール方法に関しては[こちら](http://qiita.com/gao_/items/40a41d064afe39326d95)の記事に詳しく書いてあります。



アプリ自体の使い方は、[hueを操作するアプリ](http://qiita.com/gao_/items/a8079fa2bd163a277eb4)と変わらないので、こちらを見てください。

ファンクションキーの操作は、ps4専用です。
HUISのファンクションキーに操作が割り振られています。
以下にまとめて書いておきます。

F1 電源OFF
F2 十字キー 上
F3 psボタン
F4 十字キー 左
F5 決定
F6 十字キー 右
F7 backキー
F8 十字キー 下
F9 option



その他のキーをhueの操作に割り当てて使ってください。
HUISでhueを操作する！！

HUISを使っていて思うことは、赤外線以外の機器も操作したい・・・！！！
ということで、作ることにしてみました。


最近Hueを買ったのでまずはHueを操作するところから始めてみたいと思います。
HUIS単独ではネットワークの世界には接続できないので、Android端末を利用します。

アプリを起動しておかないと、HUISの操作が取得できないので、Android端末は常にアプリを起動させて置く必要があります。
自宅で眠っている古いスマホなどを使ってもらえると良いです。

完成したAndroidアプリは最後の方にリンクを置いておくので、使ってみたい人はどうぞ。



# 使ったもの
[HUIS REMOTE CONTROLLER](http://huis.jp/remote-controller/)


[HUIS BLUETOOTH® CRADLE](http://huis.jp/remote-controller/cradle/)

[Philips Hue(ヒュー) スターターセット](https://www.amazon.co.jp/dp/B01C6S7DDU/ref=cm_sw_r_tw_dp_x_Nq4VybMQH1KND)
※利用したのはv1ですが、今買うならv2のほうがいいかも。

Android端末
Android 4.0.3以上であれば動くと思います。たぶん。

# HueをAndroidアプリで操作する方法
こちらに関しては比較的簡単です。PhilipsがSDKを用意しているのでそれを使いましょう。
[URLはこちらから](https://www.developers.meethue.com/documentation/java-multi-platform-and-android-sdk)
会員登録が必要です。

[APIGuide](https://www.developers.meethue.com/documentation/java-sdk-getting-started)もあるため、そこまで実装に苦労することはないと思います。
実装が知りたい方がいれば公開します。

# HUISの入力を受け付ける 
Androidに用意されている、```dispatchKeyEvent```を使いましょう。

以下のようなコードを使うことで、HUISのキーイベントを取得することができます。

```test.java
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        // 押されたとき離れたときの２回取得されないように
        if (e.getAction() == KeyEvent.ACTION_UP) {
            // 行いたい処理を書く
        }
        return super.dispatchKeyEvent(e);
        
```
あとはここに、このキーが来たときに、Hueを光らせるよ！！
みたいな処理を書けば完成です。



#使い方
利用するAndroidとHueは同一ネットワークに接続しておいてください。
HUISとAndroid端末はペアリングをしておきましょう。

アプリを起動すると、以下のような画面が現れます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/86094edc-fe73-1405-d865-39bb05614691.png width=400px>


上のボタンがBridgeと接続するボタンです。

ボタンを押すと、Bridgeの検索が始まります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/f4f0bffb-2ee6-2252-ab70-276a5126232f.png width=400px>


Bridgeが見つかると、Bridgeの真ん中にあるボタンを押す絵が出てきます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/91b34bef-5bfb-e5e9-19b8-eb98f5ce4c80.png width=400px>


それに従ってボタンを押しましょう。
最初の画面に戻ったらペアリング終了です。


次にHUE設定ボタンを押しましょう。

以下の画面が出てきたら、[HUISのKEYを入力]を押してください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/1199c813-fd07-07dd-d526-33a55f775c06.png width=400px>



以下の画面が表示されたら、HUISで操作したいKEYを入力し、戻るをタップしてください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/22a92648-a81a-8a69-e5ee-9d308e954d01.png width=400px>


戻ってきたら、設定項目を設定していきましょう。
この画面では

<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/1199c813-fd07-07dd-d526-33a55f775c06.png width=400px>


ON OFFはそのままで、Hueの電源を入れたいか、消したいか。

Hue Lampと表示されているところでは、hueの名前が出てきます。
設定したいhueの名前を選択しましょう。
色ボタンを押すと、色を選択する画面が出てきます。光らせたい色を選択してください。
明るさをバーで指定してください。右に行くほど明るくなります。

**OFFの設定をする際は、lightIDだけ入力すればOKです。**

すべての要素を設定したら、登録ボタンを押しましょう。

この画面に戻ってきたら、HUISのボタンを押してみてください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/43598/86094edc-fe73-1405-d865-39bb05614691.png width=400px>

登録したとおりに操作ができるはずです。

[apkのダウンロードはこちら](https://1drv.ms/u/s!Ao_XybtXsfEPiWmtQTGitJDqMs1L)
VirtualBoxで仮想コンピュータが反応しなくなった時( = _ = )

##環境
Windows10 / VirtualBox バージョン 5.1.22 r115126 (Qt5.6.2) / Vagrant 1.9.5

##症状

↓まさに、この状態です。
[VirtualBoxで仮想マシンが瞑想中(システムエラー)になったら](http://qiita.com/sotoiwa/items/66a3d7bb8aad38aa8e7f)

ありがたや～　早速！！

```command
PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage.exe controlvm <マシン名> poweroff
VBoxManage.exe: error: The virtual machine is being powered down
VBoxManage.exe: error: Details: code VBOX_E_INVALID_VM_STATE (0x80bb0002), component ConsoleWrap, interface IConsole, callee IUnknown
VBoxManage.exe: error: Context: "PowerDown(progress.asOutParam())" at line 231 of file VBoxManageControlVM.cpp
PS C:\Program Files\Oracle\VirtualBox>
```

( Q A Q ) どうして。。。

[VM in virtualbox is already locked for a session (or being unlocked)](https://stackoverflow.com/questions/35169724/vm-in-virtualbox-is-already-locked-for-a-session-or-being-unlocked)

これだ！

```command
PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage.exe startvm <マシン名> --type emergencystop
```

仮想マシンは停止したのでvagrant up で無事復帰しました。
VSIXをダウンロードするブックマークレット


Visual Studio Code の機能拡張は、サジェストが出て検索で一覧まで出るのに、インストールはカラっきし出来ないというツンデレ仕様なので、企業Proxyに阻まれている我々には辛いものなのですが、機能拡張をダウンロードして手動でインストールしてやればインストールできるので、早速ダウンロードを...


Qiita の [VSCodeにオフラインでExtensionを追加する](http://qiita.com/tosier/items/b3b7d42b2580cb63c9ee) を参考に、それを実行するブックマークレットを作ってみました。

テキストの切り出し方とか、超テキトーなので VSCode のマーケットプレイスの仕様が変わったら動かないと思う。

`javascript:...` なリンクは作れなさぽいのでブックマークの URL に記入する文字を貼っておきます。

ブックマークへの登録は、古典的にテキトーなURLでブックマークを作って、URL を後からコピペで書換える方法でおねがいします。

テキトーな URL でブックマーク作る用に Visual Studio Code Marketplace へのリンク貼っておきます。 → [VSCode Marketplace](https://marketplace.visualstudio.com/vscode)



* 即ダウンロード：

``` 
javascript:(function(jump){var pub="",ext="",ver="",vsix="";[pub,ext]=$(location).attr("href").split("=")[1].split("\.");ver=$("div[data-bind='text: version']")[0].innerText;
vsix="https://"+pub+".gallery.vsassets.io/_apis/public/gallery/publisher/"+pub+"/extension/"+ext+"/"+ver+"/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage";
if(jump){$(location).attr("href",vsix);}else{alert(vsix);}})(1);
```

* Alert表示：

``` 
javascript:(function(jump){var pub="",ext="",ver="",vsix="";[pub,ext]=$(location).attr("href").split("=")[1].split("\.");ver=$("div[data-bind='text: version']")[0].innerText;
vsix="https://"+pub+".gallery.vsassets.io/_apis/public/gallery/publisher/"+pub+"/extension/"+ext+"/"+ver+"/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage";
if(jump){$(location).attr("href",vsix);}else{alert(vsix);}})();
```



保存した extension は拡張子を手動で書換えてください。`.VSIXPackage` → `.VSIX`



----

ソース付けておきます。
なお上記のコンパクションは手動でやってるのでヌルめです。

```
(function(jump){
    var pub="",ext="",ver="",vsix="";
    // URLの後ろから publisher と extensionname をキリトリ
    [pub,ext] = $(location).attr("href").split("=")[1].split("\.");
    // ページ内からバージョン番号取得
    // <div data-bind="text: version">0.0.1</div> みたいになってる
    ver = $("div[data-bind='text: version']")[0].innerText;
    // ダウンロード用のURLを作成
    vsix = "https://" + pub + ".gallery.vsassets.io/_apis/public/gallery/publisher/" + pub + "/extension/" + ext + "/" + ver + "/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage";
    // オプションスイッチにより表示／ダウンロード
    if(jump){ $(location).attr("href", vsix); }
    else { alert(vsix); }
})(false);
```
Cloud Functions for Firebaseをはじめよう

When

2017/06/15

At

[Meguro.es #10 @ ラクスル](https://meguroes.connpass.com/event/55646/)

---

## 自己紹介

ちきさん
(Tomohiro Noguchi)

Twitter/GitHub/Qiita: [@ovrmrw](https://twitter.com/ovrmrw)

ただの ~~SIer~~ Webエンジニア。

Angular Japan User Group (ng-japan)スタッフ。

![3a2512bb-aa72-4515-af42-1f1721252f39.jpg](https://qiita-image-store.s3.amazonaws.com/0/74793/c753b39c-1581-ea1d-87d1-181f37bda60d.jpeg)

---

### ５月からWebエンジニアになりました。 :raised_hands_tone1:

---

## 今日話すこと。

[firebase/functions-samples](https://github.com/firebase/functions-samples) にCloud Functions for Firebaseの実用例がたくさんあるのでいくつかピックアップして話したい。

---

(アドリブ)

---

## Firebaseの代表的チュートリアル、Friendly Chat

[firebase/friendlychat](https://github.com/firebase/friendlychat) 
↑ Cloud Functions for Firebaseを使って [こういうの](https://friendlychat-ng4.firebaseapp.com/) が作れる。

---

### Firebaseともっと遊ぼう。

---

### Thanks :raised_hands_tone1:
Linuxへのcmakeのインストール

## cmakeのバージョン確認
https://cmake.org/download/

２０１７年6月中旬時点では3.8.2

## 導入手順例
適当なディレクトリへ移動(/tmpなど)
↓
`wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz`
↓
`tar xvf cmake-3.8.2.tar.gz`
`cd cmake-3.8.2`
↓
`./bootstrap && make && sudo make install`
(`./bootstrap && make && make install`はエラーとなる場合がある)
Beautiful SoupでHTMLを扱ったのでメモ


Beautiful Soupの基本的な使い方に関しては[PythonとBeautiful Soupでスクレイピング](http://qiita.com/itkr/items/513318a9b5b92bd56185)を見ていただければいいかと思います。

今回はBeautiful SoupをHTMLを扱う機会があったので、その時に使った処理のtipsというかメモというか備忘録というか、まあ、そういうものです。
随時更新する(かも)


### 特定のタグを異なるタグに置き換える

```python
for texttag in content.find_all('text'):
	texttag.name = 'p'
```

全ての`<text>`を`<p>`に置き換えています
<br>
### 特定のタグに囲まれていない要素にタグを追加する

```python
for imgtag in content.find_all('img'):
	if not imgtag.parent.name in ['figure']:
		imgtag.wrap(content.new_tag('figure'))
```

`<figure>`に囲まれていない`<img>`を見つけて、`<figure>`で囲んでいます

もしくは下記の方法でも同様の処理を行えます

```python
for notwrap_a in content.select("p ~ a"):
	notwrap_a.wrap(content.new_tag("p"))
```

`<p>`に囲まれていない`<a>`を見つけて`<p>`で囲んでいます

<br>
### リストから先頭の要素以外を除去

```python
for tag in content.find_all('ul'):
	tag.find('li').unwrap()
	
for unwarp_ul in content.find_all('ul'):
	unwarp_ul.unwrap()

for delete_li in content.find_all('li'):
	delete_li.decompose()
```

まず、最初の処理で`<ul>`を見つけて、`find('li').unwrap`でリストの先頭の要素から`<li>`を外しています。
次に、`<ul>`を外し、最後に残った`<li>`を除去しています。
先頭の要素は`<li>`が外れた状態ですので、新たにタグを付与する場合は、

```python
tag.find('li').unwrap()
```

を

```python
first_li = tag.find('li')
first_li.name = 'p'
```

とかにしてあげると良いと思います
<br>
### 特定の要素の親要素を外す

```python
for p in soup.find_all('p'):
    p.parent.unwrap()
```

`<p>`の親要素を外しています

### 指定した要素の隣の要素も一緒にwrapする
以下のようなhtmlがあるとする

```html
<img src="00001.jp">
<figcaption>caption string1</figcaption>

<img src="00002.jp">

<img src="00003.jp">
<figcaption>caption string3</figcaption>
```

`<img>`のとなりに`<figcaption>`があった場合は、`<figure>`で囲む、ということがしたい場合は以下のようにすればいける

```python
html = "<img src="00001.jp">
<figcaption>caption string1</figcaption>

<img src="00002.jp">

<img src="00003.jp">
<figcaption>caption string3</figcaption>"

content = BeautifulSoup(html)

for img_tag in content.find_all('img'):          
    fig = content.new_tag('figure')
    img_tag.wrap(fig)

    next_node = img_tag.find_next() 
    if next_node and next_node.name == 'figcaption':        
        fig.append(next_node)

print(content)
```

このようにすると、以下のように編集されるっす

```html
<figure>
   <img src="00001.jp"/>
   <figcaption>caption string1</figcaption>
</figure>
<figure><img src="00002.jp"/></figure>
<figure>
   <img src="00003.jp"/>
   <figcaption>caption string3</figcaption>
</figure>
```
LINE Conference 2017メモ

6/15開催のLINEの事業発表会　LINE Conference 2017における、Clovaに関する発表についてメモです。

##Clovaについて

- 音声認識
- Clova インターフェースと、Clova ブレーン
- 会話、レコメンデーションエンジン
- 使えば使うほど学習する　最適化される
- つながるサービスも、デバイスも選ばない
- ウェラブルも対応
- "クラウドAIプラットフォーム"
- Clova inside　最初のデバイス "WAVE"
- スマートホームデバイス、スマートスピーカー
- WAVEは、スマートなjuke box　秘書のような存在　話し相手

参考記事
LINE、クラウドAI連携のスマートスピーカー「WAVE」。新たな基盤「Clova」発表
http://av.watch.impress.co.jp/docs/news/1047270.html

##Clovaの機能など
- バッテリーも内臓
- なんかすごいプロセッサとかノイズキャンセルとか入ってるらしい
- 5m離れていても、会話を認識することができる
- casual conversation
- カジュアルな会話をしてくる　気軽に「Clova！」と話しかけてね
- 質問への回答ができる
- 中核機能はmusic
- 4000万曲聴きホーダイ
- そのときの雰囲気や好みにあった楽曲を推薦してくれる
- LINE NEWSとの連携
- カレンダーやタスク管理もやってくれる
- 例：今日の夕飯の買い物リスト　音声認識メモ
- 例：音声で赤外線コントローラに対応している家電のオンオフ
- 例：テレビのリモコン探さなくても「Clova、テレビ消して」って言ってくれればおk
- LINE のトークメッセージの音声再生にも使える。トークの内容の読み上げ
- 返信等、音声でコントロール可能
- LINE内外のサービスと繋がっていくイメージ　shoppingとかfood delivery
- botプラットフォーム


##WAVEのデモ
- 「特別な場所では、特別な体験を」ということで、WAVEのデモ
- 開発中のWAVE、お披露目！
- （感想）山のような形。男の人なら片手で持てそう（女性でも持てる、と説明あり

デモ内容（一部）
司会「緊張してる？」
WAVE「緊張感は常に忘れないようにしています」（女性の音声）

- ロボットボイス感はさほどなく、なめらか
- 会話が長文になると、文章と文章の隙間がなさすぎて早口だった
- アナウンサー感
- （感想）WAVEの山の形の下の部分が、聴いてるときは緑で、しゃべるとき青に光るように見えた

司会「Clova、今日の気分の曲をかけて」
「私におすすめの曲をかけて」
→音楽が再生される

司会「じゃあまたね」
WAVE「はい、またお会いしましょう」

##WAVEの価格、発売について
- 1万5000円（予定）
- 日本発売は秋（予定）
- 機能を絞った先行販売（体験版）を近日、夏に限定で発売予定！
- 体験版は1万円
- 正式版のタイミングでは、先行版も同じ機能でupdateするので、先行版の方がお得


##Wave以外のプロダクト
- もっと表現力のあるもの、もっと遊び心のあるものも必要だと思っている
- スマートデバイス　スマートスピーカー「CHAMP」（チャンプ）
- CHAMPは外への持ち出しもイメージ
- WAVEは室内（部屋と部屋の移動は可能）
- （CHAMP画像について）LINEのキャラクターのデザインでした
- デザインについては、LINE以外とのコラボも予定

- ディスプレイ付きのものも開発中
- ディスプレイ付き「FACE」
- （FACE画像について）円型に近い、かわいいデザイン
- レシピを読み上げて再生してくれたり、等


##新パートナー発表
- YAMAHA VOCALOID
- 研究開発中
- YAMAHAの新商品へのClova導入も視野
- スマートウェアラブルデバイスとも繋がっていくClova

- ソニーモバイルコミュニケーションズ　耳に装着したハンズフリーコミュニケーション　Xperia Ear
- 新体験を模索中

- Clova サードパーティ向けのSDKも準備中

##Clovaについての構想
- ポスト・スマホ時代　＝　声や画像（テキストやディスプレイではない）
- beyond keyboard,beyond display 
- デバイスに縛られることのない時代へ
- 人とコンピュータとの関係を、もっと自然に

##Clovaの中長期プラン
- 車、Car life
- connected car（TOYOTA）
- トヨタの専務からのお話
- スマホと車を繋げていく　スマートデバイスリンク　SDL
- 運転中は、LINE（スマホ）が見れないので、未読スルーになる、という問題
- 音楽を聴きながら、音声でLINE読み上げてもらって、音声でレスできる。そう、SDLならね
- もちろんオフもできる（恥ずかしい会話とか）
- iOS、Android対応
- OSS　原則アプリを制限しない
- 車側で安全な利用を制限できる　スピードあげているときは中止する、とか
- フォードとSDLコンソーシアム　ほかの自動車メーカーも参画
- パナソニックなどのメーカーも入っている

##ファミマとの提携
- Clovaとファミリーマートの提携
- ファミマ澤田社長、登場
- 澤田社長「なんとかgoと何が違うかわかりますか？」
- 「加盟店が働いている姿がここにはある」
- 「人は宝だと思っている　地域貢献や社会貢献」
- ファミマ・LINE・伊藤忠商事

##next 5 yearsビジョン
<<<<<<< HEAD
-コミュニケーション・ファースト
 1.Everything Connected
 2.Everything Videolized
 3.Everything AI
=======
- コミュニケーション・ファースト
>>>>>>> EDIT_REQUEST
Visual Studio / WPF > binding > RelativeSource={RelativeSource Self} > 複数のコントロールの色をNameで指定する

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

`RelativeSource={RelativeSource Self}`
という書き方にまだ慣れていない。

### 参考

http://d.hatena.ne.jp/hilapon/20130405/1365143758

### 実装

x:Nameに色を指定して、その文字列に基づいて色をつける実装をしてみた。
Implicit Key(x:Key未指定)でStyle指定。

```MainWindow.xaml
<Window x:Class="_170615_t1700_relativeSource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170615_t1700_relativeSource"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="Rectangle">
            <Setter Property="Fill"
                    Value="{Binding Name, RelativeSource={RelativeSource Self}}"/>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Rectangle x:Name="Yellow" Height="50"/>
            <Rectangle x:Name="Red" Height="50"/>
            <Rectangle x:Name="Blue" Height="50"/>
        </StackPanel>
    </Grid>
</Window>
```

![2017-06-15_17h14_02.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7d93ef14-37b8-d84a-be7b-8e5879655cf5.png)

将来、どういう場面で`RelativeSource={RelativeSource Self}`を必要とするかは今のところ不明。
Dockerfile作成のStep by Step

Dockerfileは手順書に近いもので、書くのはすぐに書けますがその内容(=手順)が合っているかを確認するのが結構大変です。
実際作ってみてはまりどころもわかってきたので、その手順を共有しようと思います。

# FROMの選択

Dockerfileは、既にあるDockerfileを継承して書くことができます。この継承に利用するのが、先頭に記述する`FROM`です。
楽をするためには、自分の構築したい環境に近い&オフィシャルなDockerfileをまず見つけることが重要になります。

私の場合Pythonの環境をよく作るので、Python/MinicondaのDockerfileをFROMにより継承することが多いです。

* [Python](https://hub.docker.com/r/library/python/tags/)
  * `FROM python:3`のように(リポジトリ名:タグ)という形式で利用する
* [continuumio/miniconda](https://hub.docker.com/r/continuumio/miniconda/tags/)
  * `conda install`を環境構築で使用する場合に利用する
  * `FROM continuumio/miniconda3`で利用可能。必要に応じてタグを指定するつける

あとは、Dockerfileのサンプルなどを見ながら書いていきます。

# buildのテスト

いざ書きあがったら、それできちんと環境が構築できるかをテストします。このために利用するのが、`docker build`のコマンドです。

[docker build](https://docs.docker.com/engine/reference/commandline/build/)

基本的な使い方は以下のような形になります。

```
docker build --force-rm=true -t my_image .
```

* `--force-rm=true`: ビルド中に作成される中間コンテナを削除するようにします。初回からbuildがうまくいくことは稀なので、失敗時に半端なコンテナを残さないようにしておきます
  * このオプションをつけていない場合、後述の後始末をしっかりと行う必要があります
* `-t`: 作成するimageの名前(タグ)を設定します
* 最後にDockerfileがあるディレクトリ(カレントディレクトリの場合`.`)を指定します。

プロキシがある環境下でビルドをするけれども、本番環境ではプロキシなんてない、という場合は`--build-arg`で環境変数を渡せます。

```
docker build --force-rm=true -t my_image --build-arg http_proxy=http://myproxy:8080 --build-arg https_proxy=http://myproxy:8080 .
```

前述のとおり一発でビルドが通ることは稀なので、その場合は構築に失敗したimageを消しておきます。これを怠ると、ディスクをガリガリ食うほか後で消すのがとても面倒です。

## buildの後始末

* `docker ps -a`で、作成途中のコンテナがないか確認
  * `docker rm`で削除を行います。なお、コンテナの指定は実はIDの頭3文字だけで大丈夫
  * `docker ps`は稼働中(running)のコンテナしか表示しないので、何もないと思ったら背後に大量のコンテナが隠れていたということが往々にしてあります。ご注意を
* `docker images`で、作成に失敗したイメージを確認
  * `docker rmi`で削除を行います

これできれいになりました。以後はbuildの実行・後始末、を繰り返していきます。

# runのテスト

イメージが作成出来たら、実際に稼働させてみてきちんと動作するか確認を行います。イメージからコンテナを作成し、稼働させるには`docker run`を使用します。

[docker run](https://docs.docker.com/engine/reference/commandline/run/)

実際利用する際は以下のような感じになります。

```
docker run -p 8080:8080 --rm my_image
```

* `-p`のオプションにより、コンテナ側のポートとホスト側のポートを紐付けます。Webアプリケーションの動作確認などではよくこのオプションを使用します。
* `--rm`のオプションにより、stopした後自動でコンテナを削除します。このオプションを怠ると、以下の後始末が必要になります。
* コンテナ作成元となるイメージを最後に指定します

## runの後始末

* `docker ps`で稼働中のコンテナのIDを確認
  * `docker stop`で停止
  * `docker rm`でコンテナを削除

注意点として、`docker run`は実行のたびにコンテナをイメージから作成します(イメージからのコンテナの作成と、コンテナの稼働を1コマンドで実行している)。そのため、`docker run`を連打していたらコンテナであふれかえったという事態もしばしば発生します。ディスクがコンテナで占拠されないように、`docker stop`からの`docker rm`を徹底しましょう。

runのテストが完了したら、Dockerfileはきっちり作成できたことになります。お疲れさまでした！
略称がややこしいサービス in AWS

随時更新予定

# 改めて、Elasticって何?

AWSを使ってるとやたらと目にするので改めてElasticの意味を

- 形容詞
  1. 弾力のある、しなやかな
  2. 〈人・感情など〉不幸があってもすぐ立ち直る，容易に屈しない; 屈託のない.
  3.  融通性のある
- 名詞
  1.  ゴムひも，ゴム入り生地.
  2.  可算名詞 《主に米国で用いられる》 輪ゴム.

[Weblio](http://ejje.weblio.jp/content/elastic)より

恐らくAWSとしては「融通性のある」という意味合いで使ってるっぽい

# EC2とECSとECR

## EC2

- 正式名: [Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/)
- 何の変哲もない仮想サーバ
- サーバレス界隈では「EC2を使っていいのは小学生まで」と言われているらしい

## ECS

- 正式名: [EC2 Container Service](https://aws.amazon.com/jp/ecs/)
- 略称であるEC2の頭文字をとるという荒業
- Dockerをよしなに扱えるEC2と思えばだいたい合ってる

## ECR

- 正式名: [EC2 Container Registry](https://aws.amazon.com/jp/ecr/)
- AWS内に作れるプライベートなDockerイメージリポジトリ
- 位置づけ的にはECSの諸々の機能の中にECRが存在する
- なのでAWSコンソールのサービス名検索では現れない

# EBとEBS

## EB

- 正式名: [Elastic Beanstalk](https://aws.amazon.com/jp/elasticbeanstalk/)
- EC2やロードバランサをまとめて管理するツール
- 設定ファイルを使いまわせばすぐに環境を構築できる
- あまり使われてないっぽいけど意外と便利

## EBS

- 正式名: [Elastic Block Store](https://aws.amazon.com/jp/ebs/)
- EC2にマウントするストレージボリューム
- 後から拡張しようとすると地味にめんどくさい

# RDSとRDB

## RDS

- 正式名称: [Relational Database Service](https://aws.amazon.com/jp/rds/)
- （オンプレよりは）運用しやすいデータベース
- とはいえフルマネージドではないのでサーバレス界隈では嫌われている
  - Lambdaからつなぎに行くと同時接続数制限で死ぬのが不評

## RDB

- 正式名称: Relational DataBase
- サービスでなく一般名詞
- RDSと字面も意味もダダ被りなので混ざりやすい
  - しかも言い間違えたりしても問題ない場面が多かったりする

# SQS、SNS、SES、SMS

## SQS

- 正式名称: [Simple Queue Service](https://aws.amazon.com/jp/sqs/)
- キューを放り込むためのもの
- 複数サービス連携しつつ、処理が確実に行われる保証が欲しいってときにお世話になる

## SNS

- 正式名称: [Simple Notification Service](https://aws.amazon.com/jp/sns/)
- なんらかの方法で通知を送るためのサービス
- 「SNS」だけだとSocial Networking Serviceのことだと誤解されるかもしれないので注意
- 「SNSの機能でSMSを使える」とだけ言うとまるでfacebookからメッセージを送れるという話のようだ
  - 翻訳すると「Simple Notification Serviceの機能で携帯電話にショートメッセージを送れる」

## SES

- 正式名称: [Simple Email Service](https://aws.amazon.com/jp/ses/)
- メールの送受信サービス
- 初期状態ではサンドボックスに閉じられてるので、サポートに「がっつり使わせて」という申請が必要です。

## SMS

- 正式名称: [Server Migration Service](https://aws.amazon.com/jp/server-migration-service/)
- オンプレのサーバをAWSに移行するサービス
- ここでもう一度「SNSの機能でSMSを使える」というフレーズを思い出してほしい
  - もはや何を言っているかわからない

# 最近の動向

サービスの種類が増えてきたからか最近は略称を使わない方向に行ってるっぽい
とはいえ、略称を使うことは多いのでちゃんと相手と文脈を共有したうえで適宜補足をしましょう
システム構築手順

![wfc20161109088.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/b582d8e0-a2b5-6feb-746d-51a6cf33a4f9.jpeg)

先ほどはじめて気になったのですが、この画面の右端で、かつ、ログアウトの左横のアイコン。

![wfc20161109089.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/dbb12ff8-b682-5b56-c4a7-a825e45a881f.jpeg)

押すとこのようなポップアップがありました。

「システム構築手順」と言うものがでてきたので、これを押してみると、このような画面に切り替わりました。

![wfc20161109090.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/473026ee-0b19-6ec1-ce22-0b165afea273.jpeg)

いわゆる、マニュアル？

少し読みながら、要点をまとめて行こうと思います。

例えば、帳票作成で「【設計書作成】:設計書をローカルにダウンロードします。」とあるのですが、設計書の作り方とか、ローカルが何かがちょっと分かりません。

順を追って読み勧めないといけないかもしれませんね。
大量アクセスを捌けるシンプルなインフラ構成

# ◎はじめに
・今更ながら大量アクセスを捌けるシンプルなインフラ構成って、なんじゃらほい。
というわけで考えてみました。

# 01. 前提
・モデルは定期的に大量流入があるポータルサイト
・第一にアクセスを捌けること、第二に運用保守のことも(少し)考慮

# 02. 構成図
・それで考えてみた構成がコチラ(※1)
→ 利用ツールは[Cacoo](https://cacoo.com/lang/ja/home)。直感で書くことが出来便利、いつもお世話になっております。
![構成案_20170615.png](https://qiita-image-store.s3.amazonaws.com/0/50310/1b29feea-fc34-c5f6-c9f7-316168c852b0.png)
(※1) 社内にある事例を参考にしておりますmm　また、先輩に相談しながら作成しました。多謝！
→ けれど、この構成に矛盾や不備があれば私の責任ですmm

# 03. 説明
・上記構成図の簡単な補足になります。

## 03-1. CloudFrontってそんなに便利だったんですね。。
・画像や動画などコンテンツの配信はキャッシュサーバでもあるCloudFrontを使うのが定石。
ただITリテラシーの低い私は当初、CFへアクセスを振り分けるためにはHAProxyなどのリバースプロキシーが必要と考えていました。

が、不要でした。
シンプルにCloudFrontのDistributionにDNSを向け、アクセス毎に振り分け先を変更できるマルチオリジン機能があったからです。(※2)
これで画像や動画を指すURI(例: /img/\*、 /\*.mp4 など)を判別し適切なオリジン(今回は用途毎に別けたS3 bucket)へ振り分けてくれるようです。
その判別ルールに該当しなかったリクエストはELBに渡し、web/appサーバ側で処理するようにしています。

▽参考
・AWS Documentation - [Amazon CloudFront](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)

(※2)ははっ、最近実装された機能なんでしょ（汗）と思ったら、[2012/05のAWSブログ](http://aws.typepad.com/aws_japan/2012/05/amazon-cloudfront-support-for-dynamic-content.html)に当該機能の記載がありました。。反省

## 03-2. RDS(見たままです)
・RDSの便利な機能でRead Replicaを参照用として作成。
MasterのDBはMulti-AZにより冗長構成としています。
この構成にはありませんが、DBへの参照が頻繁にある場合は ElastiCache(Redis / Memcached)を構成に組み込むのも手かと思います。

## 03-3. 運用(ログ)
・アクセスログを取得したい場合
本構成ですと、CloudFront、ELB、Webサーバいずれからも取得が可能になります。
今回はELB と 各Webサーバ側でアクセスログを収集し、S3へ集約しています。
この2つとしたのは、
ELB側は固定のフォーマットになるのに対し、Webサーバ側は出力内容やフォーマットをカスタム出来るからです。
Webサーバ側からのログ転送には、[Fluentd](http://www.fluentd.org/)を使っているのをよく見掛けます。

## 03-4. 運用(スケールアウト)
・大量のアクセス流入が予想される場合
この構成ですと対処としてフロントサーバの台数を増やすことが考えられるかと思います。
その際、日々更新されるであろうサーバ内のアプリケーションやファイルをどうするかという問題がありますが、
こちらでは定期backupとは別に、大きな更新が行われた場合などにスケールアウト用のAMIを取得しておき、そちらからスケールアウトすることを想定しています。
ちなみにAuto Scalingを導入している場合は、このAMIを都度ASGに設定しておくといいかと思います。

・断りを入れておきますと、場合によって最適解は変わってくるかと思います。
以下に例を挙げてみます。

- GitHubなどSubversionを利用してソースコードを一元管理、Launch時にそちらから最新のソースを取得する。
→ ソースが大きい場合、Launch/deployに時間が掛かりそうです。該当ソースが小さい場合はいい方法かもしれません。

- コールドスタンバイさせたインスタンスを利用する。
→ 定期的、もしくは起動後にサーバ内を同期処理などによって最新にする必要があるため、時間が掛かりそうです。こちらも更新内容がそれほど無ければいい手段かと思います。

- 最新サーバのコピーから等

## 03-5. 監視/セキュリティ対策
・構成図の隅にちょこんと記載していますが、外部の Datadog と DSaaSを想定しています。
理由は導入が楽だからです。
上述のスケールアウト時には、監視対象のインスタンスに事前に組み込んでおいたAgent主導により、自動で監視対象となります。
どちらも他の監視ソフト同様、設定は難しいですが、一度設定が確立すれば運用が楽になるかと思います。

# ◎おわりに
今回は脳内の想定したものをアウトプットしてみました。
PDCAもしくはTry & Errorが大切だと思いますので、近いうちに実際に手を動かし試し体感してみたいと思います。

以上になります。
Bloccom Windows SetUp

#**Windows SetUp手順**
**Windows版**では、シリアルポートにCOM4というように表示されるため、どれと接続すれば良いかわからない。![Windows版スクショ_170615_0001.png](https://qiita-image-store.s3.amazonaws.com/0/185986/5a6d00b4-5f98-0c6b-485b-fc7dcc494a27.png)

そのため、どのシリアルポートに接続すれば良いか、判断するための手順を説明する。

**はじめに**、ホームボタンから下記のところに "コントロールパネル" と打ち込み、コントロールパネルを開く。![2.png](https://qiita-image-store.s3.amazonaws.com/0/185986/8d545a88-6cd3-ed39-c2f0-1b37aef3ada4.png)

コントロールパネルを開いたら "デバイスマネージャー" を開く、。![3.png](https://qiita-image-store.s3.amazonaws.com/0/185986/12dbcfe6-5e5f-0dea-7ee8-9d293e6ee8eb.png)

その後、ポートのタブを開くとBluetooth リンク経由の標準シリアルのCOM4とCOM5を確認することができる。このとき、COM4とCOM5はUSB接続とは関係ないことがわかるため、残りのシリアルコードがUSB接続のコードだと判断できるが、念のため更新を行う!!
![4.png](https://qiita-image-store.s3.amazonaws.com/0/185986/58910cdb-b8f6-7fc8-916f-4744b5470400.png)

USB Serial Portを右クリック,
プロパティを表示し、ドライバーの更新を選択する。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/185986/920f856a-83a0-d237-b1b2-b5291ebba768.png)

下記のようなタブが表示されたら、"ドライバー ソフトウェアの最新版を自動検索します"を選択する。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/185986/a254be27-66ab-8745-319c-b64236547f19.png)

正常に動作していることを確認したら、OKを押す。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/185986/a9579d4a-5a7d-538a-ba55-39c0942fa99a.png)

先ほどのBluetooth リンク経由の標準シリアルのCOM4とCOM5を確認できたら、Arduinoへ飛ぶ。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/185986/b0af81fa-c560-8f8c-ff79-ccc3fad232d8.png)

COM4とCOM5はUSB接続とは関係ないため、COM6を選択する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/185986/f87d8ffa-03af-8d74-1b6c-4953da90784e.png)

以上でWindows版のシリアルポートの接続は終了!!!

[Chapter1に戻る](http://qiita.com/Bloccom/items/4722dd0f8fac82e9531c)
HttpServletRequestのヘッダをMapで使いやすくする

- クライアントからのリクエストヘッダの名称は`javax.servlet.http.HttpServletRequest#getHeaderNames`で取得できる。
  - ところが戻り値が`Enumeration<String>`なので、Java8の時代には利用し難い。
  - `Stream`を利用して、ヘッダ名をキーに持ち、値をリストで持つ`Map`に変換して使いやすくする。

```java
import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RequestUtils {

    public static Map<String, List<String>> getHeaders(HttpServletRequest request) {
        return Collections.list(request.getHeaderNames()).stream()
                .collect(Collectors.toMap(
                        headerName -> headerName,
                        headerName -> Collections.list(request.getHeaders(headerName))));
    }

}
```
h2oのリダイレクト設定が簡単すぎる件

# 一行でリダイレクト実装

先日h2oのベーシック認証を実装した際、めちゃくちゃ大変だったのですが、常時SSL通信させるためのリダイレクト設定は鬼のように簡単でした。

これがApacheだと、あちこちのコンフィグを弄り回さないとならないですが、h2oはなんと**一行！！**一行ですよ！？　さすがにビビりました

```/etc/h2o/sites-enabled/mydomain.conf
~省略~
hosts:
 "mydomain:80":
   listen:
     port: 80
   paths:
     "/":
      redirect: https://mydomain #この行を追記する
      file.dir: /var/www/html
```

あとは、WordPressを使っているので、```wp-config.php```にあるサイトURLも変更してあげるだけです。

```/var/www/html/wp/wp-config.php
define( 'WP_SITEURL', 'https://mydomain' );
define( 'WP_HOME', 'https://mydomain' );

```

こ、これだけ。。。
もちろんサーバ証明書を事前に取得する必要がありますが、記述内容はこれだけなのはすごい。
これだけでもh2oを使う価値があるレベル。
もちろん速度的な意味でApacheの比じゃないですが、やってて面白いのはこっちかな？
Atom に夢見て、Sublime に戻った理由2(少なっ


Atom はプラグインも豊富でデフォルトでもすんなり使えていいエディタだと思います。
でも、使っていくうちに細かいところが不便に感じ Sublime に戻ってしまいました。っていう話。
## Atom のここがイけてない
環境は OSX 10.12
### 行切り取りの貼り付けができない
Ctrl + k で切り取った行が Ctrl + y で貼り付けられない
なんで Cmd + v を上書きするのだ！

1. Cmd + c -> Cmd + v
1. Ctrl + k -> Ctrl + y

この2つを使い分けしてきた身をとしては不便極まりない

### タブを閉じるとカラムも消える
大きなお世話だ！

2カラムで作業中、ファイルを閉じて表示するファイルが無くなった時、気持ち的にはカラムは空のまま残っていて欲しい。
が、Atom は消えてしまう！

----
（何かオプションで変えられるのかな？）