OmniAICreator/Qiita-1.07M huggingface dataset:
[メモ] Raspberry Pi : VNCサーバ設定(raspbian 2016-09-23～)

## 概要
- Raspbian 2016-09-23 から RealVNCがデフォルトになった。
    - 以前、[[メモ] Raspberry Pi : VNCサーバ設定(自動起動)](http://qiita.com/mt08/items/ae6fa258710579651a8f) というのを書いたが、もっと簡単になった。
- MinecraftもVNC経由でできるよ(`direct capture method`というのを有効にする)
- [Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/) > remote-access > vnc<br>[VNC (Virtual Network Computing)](https://www.raspberrypi.org/documentation/remote-access/vnc/)
- `direct capture method`を有効にすると、`/boot/config.txt`で、フレームバッファの設定変更とかしてると、おかしくなる？(マウスポインタの位置とか)
    - HDMIのモードを直接せっていすれば、いい？

    ```txt:/boot/config.txt
...
disable_overscan=1 # コメントはずす.

    ## https://www.raspberrypi.org/documentation/configuration/config-txt.md
## HDMI_MODEのあたりを参考に.
hdmi_force_hotplug=1 # HDMIが刺さってなくても、ささってるような動作をさせる。
...
hdmi_group=1
hdmi_mode=4  # 720p 60Hz - 1280x720 @60fps
#hdmi_mode=16  # 1080p 60Hz - 1920x1080 @60fps
...
```


## 環境
- Raspberry Pi 2B
- Raspbian Jessie with PIXEL : `2016-09-23-raspbian-jessie.img`
- VNCクライアント側
    - Windows 7 64ビット
    - RealVNCの[VNC Viewer](https://www.realvnc.com/download/viewer/windows/)<br>> `VNC-Viewer-6.0.0-Windows-64bit`

## 手順
1. いつもの
    - RaspbianをSDに焼く
    - `sudo apt update; sudo apt upgrade -y`
    - `sudo reboot` # 再起動
2. RealVNCの有効化
    - `sudo raspi-config`
    - (古いやつ?)<del>`7 Advanced Options` <br>> `A5 VNC - Enable/Disable graphical remote access to your Pi using RealVNC`<br>>> `<Yes>`にて有効化</del>
    - (2017-01-11更新)`5 Interfacing Options  Configure connections to peripherals` <br>> `P3 VNC         Enable/Disable graphical remote access to your Pi using RealVNC`<br>>> `<Yes>`にて有効化

3. Windowsで、VNCViewerを起動して、ラズパイのIPアドレスを入れて、[Enter]おして接続。
ユーザ名/パスワードを入れる。(pi/raspberry ??)
![RPiRealVNC01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/bfe7fa71-1525-5ee7-2282-ba4f12a1fe49.png)

4. `direct capture mode`を有効にする
    1. 上の VNCアイコンを右クリックして、Options...を選ぶ
![RPiRealVNC02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0abf84b5-4fbf-66a7-65f6-6b86b45e1b40.png)
    2. Troubleshootingから、[v]`Enable experimental direct capture mode`にチェックを入れて、[OK]
![RPiRealVNC04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/588ff49c-3c32-32ea-a5b7-5d2db9cf023e.png)


5. `minecraft`起動
![RPiRealVNC05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1a00c4a2-c63f-edf1-6bdf-1bb73f30c5f3.png)
Swift で Socket.IO を試す


## Socket.IO-Client-Swift とは

「[Socket.IO-Client-Swift](https://github.com/socketio/socket.io-client-swift)」とは、[Socket.IO](http://socket.io) 公式の Swift 用ライブラリのようです。

## クライアント側のプロジェクトを作成

### プロジェクトの雛形を作成

Swift Package Manager を使います。

```bash
$ mkdir client
$ cd client

$ swift package init --type executable
Creating executable package: client
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/
```

### Package.swift を修正

dependencies 部分を追加して、Socket.IO-Client-Swift を使えるようにします。

```swift:Package.swift
import PackageDescription

let package = Package(
    name: "client",
    dependencies: [
       	.Package(url: "https://github.com/socketio/socket.io-client-swift", majorVersion: 8)
    ]
)
```

### ライブラリの取得とビルド

```bash
$ swift build
Cloning https://github.com/socketio/socket.io-client-swift
HEAD is now at 163a770 bump version
Resolved version: 8.1.2
Compile Swift Module 'SocketIO' (24 sources)
Compile Swift Module 'client' (1 sources)
Linking ./.build/debug/client
```

## テスト用ソース

### クライアント側

```swift:main.swift
import Foundation
import SocketIO

let socket = SocketIOClient(socketURL: URL(string: "http://localhost:3000")!, config: [.forceWebsockets(true)])

socket.on("connect") { data, ack in
    print("socket connected")

    print("send message")
    socket.emit("from_client", "Hello")
}

socket.on("from_server") { data, ack in
    if let msg = data[0] as? String {
        print("receive: " + msg)
    }
}

socket.connect()

CFRunLoopRun()
```

### サーバ側

Node.js を使います。

```javascript:server.js
var server = require("http").createServer(function(req, res) {
    res.write("Hello World!!");
    res.end();
});
var io = require('socket.io')(server);

io.on('connection', function(socket) {
    console.log("client connected")

    socket.on('disconnect', function() {
        console.log("client disconnected")
    });

    socket.on("from_client", function(msg){
        console.log("receive: " + msg);
        
        console.log("send message");
        socket.emit("from_server", "welcome");
    });
});

server.listen(3000);
```

## 実行

### サーバ側実行

まずはサーバ側を実行しておきます。

```bash
$ node server.js
```

### クライアント側ビルド & 実行 & 結果表示

クライアント側を実行と表示内容です。

```bash
$ swift build
Compile Swift Module 'client' (1 sources)
Linking ./.build/debug/client

$ .build/debug/client
socket connected
send message
receive: welcome
^C
```

### サーバ側結果表示

サーバ側の表示内容です。

```bash
$ node server.js
client connected
receive: Hello
send message
client disconnected
```
Tornado で「HelloWorld」(HTTP) サーバを作る


## はじめに

[Tornado](http://www.tornadoweb.org/en/stable/) は Python での Web フレームワーク/ネットワークライブラリです。

## インストール

```bash
$ pip install tornado --user
Collecting tornado
Collecting singledispatch (from tornado)
  Using cached singledispatch-3.4.0.3-py2.py3-none-any.whl
Collecting certifi (from tornado)
  Using cached certifi-2016.9.26-py2.py3-none-any.whl
Collecting backports-abc>=0.4 (from tornado)
  Using cached backports_abc-0.5-py2.py3-none-any.whl
Requirement already satisfied: six in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from singledispatch->tornado)
Installing collected packages: singledispatch, certifi, backports-abc, tornado
Successfully installed backports-abc-0.5 certifi-2016.9.26 singledispatch-3.4.0.3 tornado-4.4.2
```

## 「Hello World」(HTTP) サーバ

/ に GET アクセスで「Hello World」を返す Web サーバです。

```python:server.py
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello World\n");

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler)
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```

## サーバを起動

```bash
$ python server.py
```

## クライアントからアクセス

```bash
$ wget -q -O - http://localhost:8888/
Hello World
```

## 感想

- おk
pythonのdataframe カラム毎にまるごと型変換

# dataframeの型変換を考える

それ程、需要は多くないと思いますが、、、、、、。
環境はanacondaで動かすことを想定しています。
pythonでdataframeにcsv等をインポートした際に型を変更したい場合があると思います。
値をひとつづつ取り出して型を変換して入れ直すという手もありますがそれでは大変です。
できればカラム毎まとめて変換したいと思います。
例えば下記のテーブルがあるとしてこのcsvデータを取り込んだと仮定します。

|name|age|birthday|
|:-----------|------------:|:------------:|
|johan|        21 |     1999-01-01     |
|maria|        22 |     1999-01-02     |
|johan|        23 |     1999-01-03     |

# 数字 → 文字列に変換
あまり需要はないと思いますが数字から文字列に変換してみたいと思います。

```
import pandas as pd
import datetime

test_data = pd.read_csv("test.csv")
type(test_data['age'][0])
test_data['age'] = test_data['age'].astype('str')
age = test_data['age'][0]
type(ages[0])

```
データフレームではキャストしてくれていてageのカラムはint型になっていると思います。
その後にastypeを使って列ごとキャスト型を変換しています。
これだけだと正直あんまり使いみちが無いなと思います。

# 日付のデータをタイムスタンプにする
先ほどのデータの日付のデータを見てみます。
文字列型になってしまっていると思います。
これだとデータとして扱いにくいと思うのでタイムスタンプに変換して見ます。

```
type(test_data['birthday'][0])
test_data['birthday'] = pd.to_datetime(test_data['birthday'])
type(test_data['birthday'][0])
```

# 最後に
データフレームのカラムごと型を変換して見たいと思い調べたまとめでした。
Androidで暗号化のための秘密鍵を（なるべく）安全に保持する

## Androidにおける機密情報の保持

ログイン機能のあるアプリを作成すると機密情報（個人情報やアクセストークン）を端末内に保持することがよくあると思います。
その場合データの暗号化を行いますが、Androidアプリにおいて悩みの種なのがその暗号化のための秘密鍵（共通鍵）の置き場所です。

Android（Java）はリバースエンジニアリングが容易なため、アプリ内に暗号化のための鍵をハードコーディングしておくのは色々とヤバいです。
定数で持っておく以上難読化しても意味をなさないため、複雑なロジックを介して鍵を取り出したりCのコードに埋め込んだりして読み取られにくくする手法がよく取られます。

~~が、必要十分なセキュリティが担保されてるか判断つかないしぶっちゃけめんどくさい~~

## Android 4.3以降なら[Android Keystore System](http://developer.android.com/intl/ja/training/articles/keystore.html)使えるよ

Android4.3以降限定ですが、[Android Keystore System](http://developer.android.com/intl/ja/training/articles/keystore.html)という機能が追加され端末内の安全な領域（Credential Storage）に鍵を生成、保存することが出来るようになりました。
iOSのキーチェーンみたいなやつです。
アプリの署名に使うKeystoreと名前が被ってややこしいですが別物です。

暗号化
1. Keystoreで鍵生成、保存
2. 鍵を取り出してそれをキーに生データを暗号化
3. 暗号化したデータをDBやPreferenceへ保存

復号化
1. Keystoreから暗号化に使った鍵取得
2. DBやPreferenceから暗号化データを取得
3. 暗号化データを鍵を使って復号化

という手順を踏むことで安全にデータを保存できます

## 課題
- Root化された端末では無力

Root化された端末においてはCredential Storageを覗く事も可能なため万能ではないですが、少なくともadb backupでアプリとデータをぶっこ抜かれて解析される心配はなくなるはずです。

- Androidのバージョンの制限が厳しい

Android 4.3以上でないとそもそも動作せず、さらにAndroid 6.0未満だとRSAしか使えないという残念仕様（[参考](https://developer.android.com/training/articles/keystore.html?hl=ja#SupportedCiphers)）。Keystore使うなら当分はRSAオンリーになりそう。

- 秘密鍵作るときなんか重い

下記のGithubのサンプルコードを動作させてみればわかりますが初回の鍵生成処理が重く、UIスレッドで行うと一瞬固まります。
必要に応じて非同期処理で処理させたほうがいいかもしれません。

- 公式ドキュメント読んだけどよくわからない。。。6.0向けの記述しかないし

ので、サンプルを兼ねて暗号化と鍵保存の処理ををまとめたラッパークラス作ってみました。
文字列の暗号化を前提としています。
モジュール分割してあるので（一応）外部ライブラリとしても動作します。使い方は以下の通り。

## Cryptore

**[2017/03/26追記]ライブラリ化しました。くわしくは[こちらの記事](http://qiita.com/kazakago/items/ec1a609feb6d10286e19)を参照下さい**

https://github.com/KazaKago/Cryptore

```java:
private Cryptore getCryptore() throws Exception {
    Cryptore.Builder builder = new Cryptore.Builder();
    builder.type(CipherAlgorithm.RSA);
    // builder.blockMode(CipherProperties.BLOCK_MODE_ECB); // If Needed.
    // builder.encryptionPadding(CipherProperties.ENCRYPTION_PADDING_RSA_PKCS1); // If Needed.
    builder.context(this); // Need Only RSA on below API Lv22.
    builder.alias("ALIAS");
    return builder.build();
}
```
BuilderパターンでCryptoreインスタンスを取得します。今回はRSA暗号を指定しています。
パラメータは何も指定していなければECB Block Mode + PKCS1Paddingが適用されます。
上記の`"ALIAS"`というのが鍵取得のための引換券みたいなものなので、暗号化と復号化の際は同様の文字列を指定して下さい。（`"ALIAS"`自体は機密情報じゃないです）

```java:
private String encrypt(String originalStr) {
    String encryptedStr = null;
    try {
        Cryptore cryptore = getCryptore();
        encryptedStr = cryptore.encryptString(originalStr);
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
    }
    return encryptedStr;
}
```
`Cryptore#encryptString()`で暗号化を行います。エラーハンドリングは必要に応じて適当にやって下さい。復号化は`Cryptore#decryptString()`です。

暗号化のアルゴリズムや暗号化ブロックモード、パディングはBuilderで制御できるようにあるのでプロダクトの性質に合わせて変更して下さい。
あと簡略化のためライブラリ側で決め打ちしてしまっているパラメータも一部あるのでそこも必要に応じて直に変更して下さい。

## 参考
こちらの記事を参考にさせていただきました。
[Android 4.3 で Android Keystore を使う](http://qiita.com/Koganes/items/e8253f13ecb534ca11a1)
複数のGoogleカレンダーをマージする

はじめに
========================================

Googleカレンダーを複数使い分けている場合に、１つのカレンダーへ予定をマージしたいという需要って結構あると思います。検索してもあまりドンピシャなものが無かったので、GoogleAppsScriptで作ってみました。

GitHub
----------------------------------------
ソースは **GitHub** で公開しています。
[Google Calendar Marger](https://github.com/ryskiwt/gcal-merger)

画面サンプル
----------------------------------------
https://ryskiwt.github.io/gcal-merger/

<img width="771" alt="スクリーンショット 2016-11-27 8.44.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/6f30261a-b0f8-3cd9-65d8-0046044f4aec.png">
期間を指定して、単発でマージを実施したり、マージ先のカレンダーのイベントを削除したりできます。

<img width="759" alt="スクリーンショット 2016-11-27 8.44.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/3f1d85c7-ab39-f4b8-e713-28ae0d309985.png">
GASの時間ベーストリガーで、定期的にマージを実行させることができます。マージする期間やチェックのタイミングを設定します。

使い方
----------------------------------------

導入方法や使い方の詳細は、[GitHubのREADME](https://github.com/ryskiwt/gcal-merger)をご参照ください。

詰まった点とか、工夫とか
========================================
- イベントの識別や更新の検出に、Googleカレンダーイベントのカスタムタグを使用しています
- GASでページを返す、返したページからGASの関数を呼ぶ
- モバイル向けのmetaタグ（viewport）が効かない点に対する対処
- 外部ライブラリ（Moment.js）を導入する方法

**2016/11/27追記** 下記にまとめました。
[GoogleAppsScript で SinglePageApplication を作るTips](http://qiita.com/ryskiwt/items/dd1dddf3bdf008fa8b2f)

残課題（アイデア募集中）
========================================
繰り返しイベントのEventIDは、繰り返す全イベントで共通になるようで、そのまま使うと各イベントを識別できません。今は共通のEventID＋日付で代替していますが、応急処置感が否めないので、何か良いアイデアを募集中です。

**2016/11/27追記** Auto Merge を disable にすると、Calendar to merge も非活性になって、ワンショット実行もできなくなってしまうという致命的なバグがありました…時期を見て直します…
macOS Sierraで修飾キーの設定が有効にならない問題の解決方法

# はじめに

macOSには伝統的にCtrlやOptionなどの修飾キーを他の修飾キーと入れかえる機能があるものの、macOS Sierraにしたところこの機能が動作しなくなった。しかもIMEをGoogle IMEやAquaSKKなどサードパーティーのものにしているときだけこの問題が発生する。この記事では、僕が発見した暫定的な対処方法を紹介したい。

# 環境

- MacBook Pro（13-inch, Late 2016）macOS Sierra

# 対処方法

下記の方法で修飾キーの設定が動作するようになる。ただしKarabiner-Elementsを動作させると動作しなくなる。

1. 「システム環境設定」を開く
  <img width="218" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10815/dc91daa7-3a08-b61f-b191-3f83c02ede5d.png">
2. 「セキュリティとプライバシー」を押す
  <img width="666" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10815/8ea08cc0-d0ed-fc83-a890-d692816fb0a2.png">
3. 「プライバシー」タブの「アクセシビリティ」を開く
<img width="660" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10815/d9d3f5a5-1275-a4a6-d43d-c66e657fdcf0.png">
4. 左下にある鍵マークを押し、パスワードを入力する
  <img width="574" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10815/d577a6bf-5aee-012f-a81a-30f7fba98623.png">
5. 「+」マークを押し、`/Library/Input Methods/`にあるIMEを選択し、「開く」を押す（画像はAquaSKKの場合）
  <img width="984" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10815/556e9f5c-48d8-089b-5d68-ea600d696b2d.png">

# まとめ

このようにすることで、サードパーティーのIMEでも修飾キーの設定ができるようになった。AquaSKKについては次のissueで報告ずみである。

https://github.com/codefirst/aquaskk/issues/69
Node.jsからSignalRサーバへ接続する

#概要
[Node.jsのSignalRクライアント](https://www.npmjs.com/package/signalr-client)を利用してサーバへ接続しにいく手順を、.NETのSignalRクライアントと比較します。

#参照

```C#:C#
using Microsoft.AspNet.SignalR.Client;
```

```js:Node.js
var signalR = require('signalr-client')
```

#クライアント作成

```C#:C#
var connection = new HubConnection("http://xxxx.xx.xx/");
var proxy = connection.CreateHubProxy("MyHub");
```

```js:Node.js
var client = new signalR.client("http://xxxx.xx.xx/signalR", ['MyHub'])
```

コネクション→プロキシ　と生成するか　クライアントを生成するか。という点と、
サーバサイドを置いているURL指定時にsignalRが入る点が違います。

#起動

```C#:C#
proxy.Invoke("MyMethod")
```

```js:Node.js
result = client.invoke('MyHub', 'MyMethod')
```

Node.jsは再度Hubの名称を指定します。
Pandas API メモ

使ったPandasのAPIをまとめます。

以下、dfはpandas.DataFrameとします。

```python:unique系
#特定のカラムの特徴量の種類を返します
df['day'].unique()
'''
array(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], dtype=object)
'''

#特定のカラムの特徴量の種類数を返します
df['day'].nunique()
'''
7
'''

#列を選択
df.loc[:,['day']]
'''
   day
1  Sun
2  Wed
3  Thu
4  Mon
5  Tue
6  Tue
'''
```

```python:get_dummies
cat = pd.DataFrame([["A","B","C"],[100,10,200],["Sun","Fri","Wed"]]).T
'''
   0    1    2
0  A  100  Sun
1  B   10  Fri
2  C  200  Wed
'''

#ダミー変数化
dum = pd.get_dummies(cat[0])
'''
   A  B  C
0  1  0  0
1  0  1  0
2  0  0  1
'''

#0列を削除
cat2 = cat.drop(0,axis = 1)

#横方向に連結
cat2 = pd.concat((cat2,dum),axis = 1)
'''
     1    2  A  B  C
0  100  Sun  1  0  0
1   10  Fri  0  1  0
2  200  Wed  0  0  1
'''
```

```python:set_option
#行数が大きいDataFrameを折り返しなしで表示させる
pd.set_option('max_rows',200)
```

```python:astype
>>> df = pd.DataFrame([[1,2,3],[0,0,0],['AA','S','D']]).T
>>> df.columns = ['int1','int2','obj']    #カラム名を指定
>>> df.dtypes
int1    object     #int型の値を入れたつもりが'object'になっている
int2    object     #同上
obj     object
>>> #'int1'と'int2'カラムのデータのdtypeをobjectからintに変更
>>> df.loc[:,'int1':'int2'] = df.loc[:,'int1':'int2'].astype(int)
>>> df.dtypes
int1    int64      #intになった!!
int2    int64      #intになった!!
dtype: object
```
RippleEffectのXML書くのめんどくさい人へ

小ネタです。割と知らない人いるかも

RippleEffectつけてますか？Android 5.0以降でぽわ～んって波紋でるやつです。
Material Design的には重要な要素ですが色どうすればいいんだ！とか悩みますよね。
~~デザイナーさんもあんま指定しないし勝手に色決めてる人多いのでは？ｗ~~

##実は標準で用意されてる
実はAndroid標準で用意されていて、Android 4.x系でも非RippleEffectながらタップ色が変わるエフェクトがちゃんと動作します。

やり方はSupport Libraryをインポートして↓をViewに指定するだけ。簡単ですね。

```xml:activity.xml
<LinearLayout
    android:background="?attr/selectableItemBackground"/>
```
ちなみに`CardView`の時は`android:foreground`に指定すればオッケーです。

また、以下の`Borderless`を指定すれば親レイアウト（この場合だとLinearLayout）の境界をはみ出してある程度のサイズまでRippleEffectが広がります。

```xml:activity.xml
<LinearLayout
    android:background="?attr/selectableItemBackgroundBorderless"/>
```

以下のようなボーダーレスなボタンを置く時が使いドコロですかね
![components_menus_usage4a.png](https://qiita-image-store.s3.amazonaws.com/0/129872/a24a329b-538f-2462-0cbc-9df5bb083839.png)
GAE/GO で Hello Worldさえハマる

諸事情によりWindows(10)環境でやったのがイケなかったのか goapp serve すら動かなかった記録

こんな環境

```
> goapp version
go version go1.6.3 (appengine-1.9.46) windows/amd64
```

`goapp serve` の結果

```
> goapp serve
INFO     2016-11-21 23:20:25,867 devappserver2.py:756] Skipping SDK update check.
INFO     2016-11-21 23:20:25,911 api_server.py:205] Starting API server at: http://localhost:58691
INFO     2016-11-21 23:20:25,913 api_server.py:637] Applying all pending transactions and saving the datastore
INFO     2016-11-21 23:20:25,913 api_server.py:640] Saving search indexes
Traceback (most recent call last):
  File "c:\go_appengine\\dev_appserver.py", line 94, in <module>
    _run_file(__file__, globals())
  File "c:\go_appengine\\dev_appserver.py", line 90, in _run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "c:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 1027, in <module>
    main()
  File "c:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 1015, in main
    dev_server.start(options)
  File "c:\go_appengine\google\appengine\tools\devappserver2\devappserver2.py", line 811, in start
    self._dispatcher.start(options.api_host, apis.port, request_data)
  File "c:\go_appengine\google\appengine\tools\devappserver2\dispatcher.py", line 193, in start
    _module, port = self._create_module(module_configuration, port)
  File "c:\go_appengine\google\appengine\tools\devappserver2\dispatcher.py", line 278, in _create_module
    threadsafe_override=threadsafe_override)
  File "c:\go_appengine\google\appengine\tools\devappserver2\module.py", line 1162, in __init__
    super(AutoScalingModule, self).__init__(**kwargs)
  File "c:\go_appengine\google\appengine\tools\devappserver2\module.py", line 549, in __init__
    self._watcher.set_skip_files_re(self._module_configuration.skip_files)
  File "c:\go_appengine\google\appengine\tools\devappserver2\file_watcher.py", line 54, in set_skip_files_re
    watcher.set_skip_files_re(skip_files_re)
AttributeError: 'Win32FileWatcher' object has no attribute 'set_skip_files_re'
error while running dev_appserver.py: exit status 1
```

下記リンクにある通り

* file_watcher.py L53,53 をコメントアウト

でとりあえず動いた…

https://code.google.com/p/googleappengine/issues/detail?id=13399

bugfix待ちですね(´・ω・`)
ElectronのMenuのカスタマイズ

# 概要
Electron の Menu のカスタマイズ方法

# Menu のカスタマイズ
Electron の設定を書いているファイルに以下を記述

```js:app.jsの一部
// Electron
const {app, Menu, BrowserWindow} = require('electron');

// ElectronのMenuの設定
const templateMenu = [
    {
        label: 'Edit',
        submenu: [
            {
                role: 'undo',
            },
            {
                role: 'redo',
            },
        ]
    },
    {
        label: 'View',
        submenu: [
            {
                label: 'Reload',
                accelerator: 'CmdOrCtrl+R',
                click(item, focusedWindow){
                    if(focusedWindow) focusedWindow.reload()
                },
            },
            {
                type: 'separator',
            },
            {
                role: 'resetzoom',
            },
            {
                role: 'zoomin',
            },
            {
                role: 'zoomout',
            },
            {
                type: 'separator',
            },
            {
                role: 'togglefullscreen',
            }
        ]
    }
];

const menu = Menu.buildFromTemplate(templateMenu);
Menu.setApplicationMenu(menu);
```

`label` が 表示名です。最初の階層の `label` では、Menu 部分に表示されます。また、`submenu` は表示されている Menu の Dropdown 部分です。
予め用意されている `role` もあるみたいですが、個人的に追加したいものは、`click` とかで追記すれば良さそう。

実行結果としてはこんな感じ。

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/116983/3c1b5813-e5ed-e531-b897-7b9d9dbd7aa7.png)

## role の種類
Macはよく分からないので、調べて何となくわかったものだけ書いてます。しかし、role はこんなに種類あるみたいです。基本的なものを用意してくれているのでうれしいですね。

| role名 | 意味 | 備考 |
|:-:|:-:|:-:|
| undo | 戻る ||
| redo | 進む ||
| cut | 切り取り ||
| copy | コピー ||
| paste | 貼り付け ||
| pasteandmatchstyle | ? ||
| selectall | すべて選択 ||
| delete | 削除 ||
| minimize | 最小化(タスクバーに逃げるやつ) ||
| close | ウィンドウを閉じる ||
| quit | ウィンドウを閉じる ||
| togglefullscreen | フルスクリーンにする ||
| resetzoom | 拡大縮小の解除 ||
| zoomin | 拡大 ||
| zoomout | 縮小 ||
| about | Aboutパネルを出すらしい | MacOSのみ |
| hide |  | MacOSのみ |
| hideothers |  | MacOSのみ |
| unhide |  | MacOSのみ |
| startspeaking |  | MacOSのみ |
| stopspeaking |  | MacOSのみ |
| front |  | MacOSのみ |
| zoom | たぶん拡大 | MacOSのみ |
| window |  | MacOSのみ |
| help |  | MacOSのみ |
| services |  | MacOSのみ |
nasneの容量をシェルスクリプトでSlackに通知する

日常生活でつかえるコマンド例を探していたのですが、「自分の日常＝アニメを見る生活」なのでnasneの容量を確認するシェルスクリプトの作り方をさらします。意識低くて申し訳ない。

## SlackのWebhookのURLを取得

まずはSlackのWebhookのURLを取得します。取得の仕方はどこにでも書いてあるのですが、自分はついつい忘れてしまいます。なのでこういう記事に残しておくと後で便利です。

[SlackのWebhook URL取得手順](http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)

上のリンクはいつもお世話になっています。

## コマンドでnasneから容量を取得出来るかチェック

同じネットワーク内にあればnasneのAPIを叩いて容量を取得することが出来ます。nasneのAPIについては以下のページに詳しく書かれています。

[【nasne】APIを調べてみた。ディスク容量が知りたい、他](http://pocketstudio.jp/log3/2014/12/07/nasune_api/)

ほかにもいろいろなことが出来そうな感じです。とりあえず今回必要なのは容量を得ることなので以下のようなコマンドで取得できそうです。

```bash
curl -s "http://IPアドレス:64210/status/HDDInfoGet?id=0" | jq -M '.HDD.freeVolumeSize / 1000 / 1000 / 1000'
```

JSONが返ってくるのでjqで操作しています。jqって本当に便利ですね。単位はバイトで返ってくるのでギガバイトに直しています。頭の悪いスクリプトで本当に申し訳ない。

## 出来たシェルスクリプト

出来たシェルスクリプトは以下のような感じ

```bash

#!/bin/sh

WEBHOOKURL="webhookのURL"
MESSAGE=`curl -s "http://IPアドレス:64210/status/HDDInfoGet?id=0" | jq -M '.HDD.freeVolumeSize / 1000 / 1000 / 1000'`

curl -s -S -X POST --data-urlencode "payload={\"channel\": \"general\", \"username\": \"Nasne\", \"icon_emoji\": \":eggplant:\", \"text\": \"残り容量：${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null

```

実行するとこんな感じで出力されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/11510/7e35fded-fba2-1e38-05bf-0cbc2490e71a.png)

もっと工夫できると思いますが、これで十分といえば十分でしょう。あとはこれをcronで叩くようにすればいつ何時容量が少なくなったとしても気づくというものです。
Eclipseを使ったgeb環境構築 その２　前編

今回はbuild.gradleを編集して、サンプルプログラムが実行できるところまで書こうと思ったけど
テスト実行に失敗してしまったので前編、後編に分けて書こうかと思います。


##build.gradleの編集

前回eclipseでGradle Projectを新規作成してみました。

その時出来上がったbuild.gradleがこちら

```properties:build.gradle
apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.21'
    testCompile 'junit:junit:4.12'
}
```

まずはgroovy環境に修正〜。

```properties:build.gradle

//デフォルトだとjavaになっているのでgroovyに修正
apply plugin: 'groovy'

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.1'
    testCompile 'junit:junit:4.12'
}
```


っでspock用に書き直したのが下記。
いちよう先にseleniumのドライバも入れておきます。

```properties:build.gradle

//デフォルトだとjavaになっているのでgroovyに修正
apply plugin: 'groovy'

repositories {
    jcenter()
}

//デフォルトエンコーディングはUTF-8指定で。
def defaultEncoding = 'UTF-8'
compileJava {
	options.encoding = defaultEncoding
}
compileTestJava {
	options.encoding = defaultEncoding
}
compileGroovy {
	groovyOptions.encoding = defaultEncoding
	options.encoding = defaultEncoding
}
compileTestGroovy {
	groovyOptions.encoding = defaultEncoding
	options.encoding = defaultEncoding
}


dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.1'

    testCompile "org.gebish:geb-spock:0.12.2"
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
    testCompile "org.seleniumhq.selenium:selenium-chrome-driver:2.37.1"
    testRuntime "org.seleniumhq.selenium:selenium-support:2.37.1"

}
```

##テストの実行

さっそくテストしてみたいと思います。
ちなみにサンプルコードはeclipseでプロジェクト作成した時に自動的にサンプルコードが作成されるので、それを使ってみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/53143/87271055-a324-c777-1be1-eea2fab49a35.png)


かんたんなテストコードをgroovyで作成してRunしてみます。
「src/test/groovy」ディレクトリを作成しテストコードを書きます。
※ビルドパスの設定を忘れずに！

![image](https://qiita-image-store.s3.amazonaws.com/0/53143/26db6212-be3e-8cbc-227f-9a101cf5b27e.png)

まずはjunitから実行してみましょう。

ん！！なんだこのエラー・・・。

```
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.4.1 and you are trying to load version 2.4.7
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl$DefaultModuleListener.onModule(MetaClassRegistryImpl.java:509)
	at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanExtensionModuleFromProperties(ExtensionModuleScanner.java:77)
	at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanExtensionModuleFromMetaInf(ExtensionModuleScanner.java:71)
	at org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner.scanClasspathModules(ExtensionModuleScanner.java:53)
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:110)
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:71)
	at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:33)
	... 19 more
```

ん〜。なんかバージョンの競合が発生している模様。。。

また時間があるときに調査・記事更新します！！
IMEを使う（Windows: TSF編）

# Text Services Framework (TSF) とは
TSFはIMEとアプリケーションの間の層で、IMMの後継のようなものです。
IMMと大きく異なるのは、未確定文字列の描画の義務がアプリケーションにあるということです。
（IMMではIMMにいい感じに未確定文字列を表示してもらうことが可能でした）

TSFに対応したアプリケーションでは以下の内容を実装するこのになります。

- TSF-awareなアプリケーションだという宣言
- IMEからのテキストの取得
- IMEからのテキストの変更
- IMEからの選択範囲の取得
- IMEからの選択範囲の変更
- テキストの範囲からディスプレイ上の座標範囲の取得
- ディスプレイ上の座標からテキスト座標の取得
- IME側にテキスト、選択範囲、レイアウトの変更等を通知する

コード的に言えば、以下のような内容にあたります。

- `ITextStoreACP`を継承したクラスの用意
    - ACP = Application Character Positionです
        - 編集中の文字列のインデックスだと思えば大丈夫です
        - インデックスベースでテキストを編集するインタフェースということです
    - `ITextStoreACP2`も同様のインタフェースです
        - こちらはWindows Store Appsでも使用可能です
    - `ITextStoreAnchor`というより抽象度の高いインタフェースもある
        - これは通常のアプリケーションには解放されていないようです（残念無念）
- `ITextStoreACPSink`への通知の実装
    - テキストの変更で呼ぶ
    - 選択範囲の変更で呼ぶ
    - レイアウトの変更で呼ぶ
    - テキストの状態・属性・ロック変更で呼ぶ
- 色々な初期化
    - COM周りの処理が大変

## `ITextStoreACP`の実装
ここがTSF対応の要になります。
基本的に以下の変数を管理するものです。

- 編集中の文字列
- 選択中の文字列のインデックス

TSFではIMMとは違って、未確定文字列と編集中の文字列の間に大きな扱いの違いはありません。
積極的に区別しない限り、同一のものとして扱うことになります。
（TATEditorでは編集履歴の都合上、積極的に区別している）

IMMでは確定された文字列を受け取って現在の選択範囲に挿入するだけでもよかった処理も、TSFでは未確定文字列の時点からテキストへ挿入して随時編集可能にする必要があります。
より具体的なIMEからの要求を並べるとだいたい以下のようなものになります。

1. IME側が現在の選択範囲を取得する
2. IME側が現在の選択範囲を未確定文字列で置換する
    - IME側からは未確定文字列もテキストの一部として見える状態になる
3. IME側が現在の未確定文字列のディスプレイ上での描画位置を取得
    - 未確定文字列の周辺に変換候補や予測変換が出せる
5. 未確定文字列をテキスト上で編集していく
    - このとき未確定文字列の装飾情報はアプリケーション側から取得しにいく必要がある
5. 未確定文字列を確定する

さてこうしたことに対応するために、`ITextStoreACP`で主に実装しなければいけない関数が次の通りです。

- GetEndACP
    - 編集中の文字列の長さを返します
- GetSelection
    - 現在選択中の文字列の始点と終点のACPを返します
    - 複数の選択に対応しており、TATEditorでも複数の選択を返せるのですが、要求された記憶がありません（誰か複数選択に対応したIMEを作りましょう）
- SetSelection
    - IME側からテキストが選択されます
- GetText
    - 指定された範囲の文字列を返します
- SetText
    - 指定された範囲の文字列を指定された文字列で置換します
- GetACPFromPoint
    - ディスプレイ上の座標に対応するACP（文字列のインデックス）を返します
- GetTextExt
    - 指定されたテキスト範囲がディスプレイ上のどこにあるかを返します

このほかにも、テキストの編集ロックや文字列の属性を返す関数などがあります。
IMMに比べると実装の量が段違いで増えています。
もちろん、これに対応するだけの価値は十分あります。例えば、

- 選択中のテキストの再変換
    - MS-IMEだとデフォルトでスペースキーを押せば再変換ができます（便利）
- IMEが前後の文脈に沿った変換を提供可能
    - もちろんこれはIMEが自由にテキストにアクセスできるからです
    - ちなみに、256文字ずつ全テキストを取得しようとして重くなるIMEとかも存在します
- より高度なテキスト操作もIMEから可能ですが、あまりフル活用している例は見ませんね
    - [tsf-vim](https://github.com/deton/tsf-vim)とかは面白そうでした
    - 私には日本語入力の知識がないので誰か教えて欲しい

## `ITextStoreACPSink`への対応
IME以外からのテキストの変更、選択範囲の変更、レイアウトの変更（文字列の配置やウィンドウの位置の変更など）時に呼びます。
特筆すべき点はありません。

## 初期化
初期化の手順がかなり面倒で、`CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr)`とかから始めるのですがまとめる時間がなかったのでまたの機会に……。
基本は https://msdn.microsoft.com/library/ms629043.aspx です。

## その他
さらに、細かい挙動に対応するためにはより多くのインタフェースを実装する必要があります。
例えば現時点のTATEditorでは以下に対応しています。

- `ITfContextOwnerCompositionSink`
    - 未確定文字列の状態の更新を通知してくれます
    - このタイミングで未確定文字列の装飾情報を取得しています

詳しくは[Reference](https://msdn.microsoft.com/library/ms629038.aspx)をどうぞ。

# おわりに
いつものように中途半端な内容となってしまい申し訳在りません。
明日はまだまだ続くよWindowsのIME API！`Windows.UI.Text.Core`編です。
Node-RED Version 0.14から追加されたSplit / Joinノードの使い方

Node-RED Version 0.14から新しくSplitノードとJoinノードが追加されました。

これは配列メッセージの各要素を分解して1つのメッセージとして流すSplitノードと、分解されたメッセージを配列/文字列/オブジェクトなど多様な型として結合するJoinノードのことで、これらを使いこなすことでループするフローを作成する必要がほとんどなくなります。

## Splitノード

### 配列をSplit

Splitノードは何も設定せず配列データを渡すだけで動作が解ります。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/0826ae70-ab04-9083-8fd3-5783ab7b39c4.png)

### 文字列をSplit

配列だけではなく文字列とオブジェクトも分解できるようです。以下は`;`で分けてみました（デフォルトの例は改行コード）

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/6c4ed0dd-175d-d6c4-fc3c-d6209869a4b8.png)

`1:2:3:4:5`という文字列を渡すと先ほどと同様、各要素のメッセージに分割されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/213998b0-2076-c828-d963-f4c383aabd4d.png)

### オブジェクトをSplit

続いてオブジェクトです。Injectノードに以下のようなJSONを渡します。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/c2871fea-ad94-a6b2-da40-786d646abb2b.png)

これだけでメッセージが分割されます。簡単ですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/0df9657e-8a08-ff28-a2e7-63b0a4e5b768.png)

## Joinノード

### 配列をSplitして配列でJoin

まず、配列をSplitして配列としてJoinします。これは何もしないでJoinノードを置くだけです。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/cb00c6f4-a8f3-779c-786d-6511050751d5.png)

### 配列をSplitして文字列でJoin

次に配列 -> 文字列です。Joinノードの設定を開いて以下のように設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/10b375e4-fdde-4ac5-3016-c62a07462516.png)

これで配列 -> 文字列になりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/6d6ae71f-c970-ad39-3c6e-3fc1c6a7864c.png)

### 配列をSplitしてオブジェクトでJoin

次に配列 -> オブジェクトです。オブジェクトにするためには`key`が必要です。それはSplitされた後に`msg.parts.key`など（任意で他のプロパティでも良い）で指定します。

以下のようにSplitノードの後にChangeノードを配置します。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/77cfb047-b2e4-7240-de82-3d481e4472fe.png)

Changeノードは以下のように設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/aaa5293f-cd81-ad21-b128-703f8e173869.png)

ただし、このままではすべての値の`key`が`val`になってしまうので以下のようにChangeノードの後にTemplateノードを置きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/343fc704-efee-f783-ad7b-5772f7db4de9.png)

Templateノードは以下のように設定します。`msg.parts.key`は先ほどChangeノードで設定した`val`がSetされていて、`msg.parts.index`にはSplitされたタイミングで配列の要素番号がSetされています。これを連結するわけですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/531a0c1e-ad82-2524-c7e1-5f9b1d455a5c.png)

最後にJoinノードを以下のように設定します（要素数は入力時と同様に5つにする場合でも明示的に`5`と入力する必要があります）

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/0f4753d0-9b2c-b34c-69fa-0b6511626d9b.png)

以下のような結果になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/6245273f-cc14-b63c-01c5-cec27ab6a7fe.png)
PHPでStrategyパターンを実装

## PHPでStrategyパターンの実装サンプル
* xml/json のサンプルはあるが、mail/sms/pushのような実装サンプルはなかったので試してみた
* Userクラスの注入箇所が結構悩んだ末に具象クラスのコンストラクタへ
    * 何か他に良い方法があれば、コメントを頂きたい
* 実際のsend()やvalidate()は未実装

```php
<?php

// 送信対象のUserクラス
class User {
    private $name;
    private $mail;
    private $tel;

    // 仮に利用するpropertyを定義
    public function __construct($name, $mail, $tel) {
        $this->name = $name;
        $this->mail = $mail;
        $this->tel  = $tel;
    }

    // 仮に名前だけ出力するためにgetter設置
    public function getName() {
        return $this->name;
    }

}

// 抽象クラス
abstract class MessageStrategy {
    protected $user;
    public abstract function send();
    public abstract function __construct(User $user);
}

// コンテキストクラス
class MessageContext {
    private $strategy;

    public function __construct(MessageStrategy $message) {
        $this->strategy = $message;

    }

    public function send() {
        $this->strategy->send();
    }
}

// 具象クラス(Mail)
class ConcreteMailMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // mailに関する前処理
        // ...
    }

    public function send() {
        echo 'mail->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

// 具象クラス(SMS)
class ConcreteSMSMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // smsに関する前処理
        // ...
    }

    public function send() {
        echo 'sms->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

// 具象クラス(PushNotification)
class ConcretePushNotificationMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // Push通知に関する前処理
        // ...
    }

    public function send() {
        echo 'push->to('.$this->user->getName(). ')'. PHP_EOL;
    }
}

// 送信対象のテストUserインスタンス
$user = new User('Pさん', 'test@example.com', '090xxxxyyyy');

// Mail送信
$strategy = new ConcreteMailMessage($user);

// $strategyにどのクラスを代入するかでMail / SMS / PushNotification とsend()の振る舞いを変える
// SMS送信
// $strategy = new ConcreteSMSMessage($user);

// Push通知
// $strategy = new ConcretePushNotificationMessage($user);

// Contextクラスにstrategyクラスを注入
$contextMessage = new MessageContext($strategy);

// 送信処理 注入されたオブジェクトのsend()メソッドをcall
$contextMessage->send();

// mail->to(Pさん) と出力される

```
Rancherでpacketのマシンドライバーを利用してホストを追加する

Rancherのマネージャーサーバからマシンドライバーを利用してホストを追加する手順を記載します。

Rancherバージョン：V1.2.0
言語：日本語

packetについては、@kkitaseさんの「[ソフトバンクが出資する2014年設立のクラウドプロバイダー「Packet」とは](http://qiita.com/kkitase/items/6ac3acd43c5f731df368)」で概要が分かります！

# 1.環境の追加

GUIの管理コンソールにログインをして、「環境を追加」ボタンを押下します。

![rancher01.png](https://qiita-image-store.s3.amazonaws.com/0/61606/7f7a147c-4dcd-810e-5d94-86eff2260cd1.png)

「名前」に任意の名称を入力し、cattle、kubernetes、Mesos、Swarmから一つの環境テンプレートを選択して、「作成」ボタンを押下します。

![paket5.png](https://qiita-image-store.s3.amazonaws.com/0/61606/171f891c-54ac-8542-ffac-f4290e52cfc8.png)


# 2.ホストの追加

上部メニューから「インフラストラクチャ」-「ホスト」を選択します。

![rancher03.png](https://qiita-image-store.s3.amazonaws.com/0/61606/93793d5b-cc33-28be-0eb4-18281c12cc6a.png)

「ホストを追加」ボタンを押下します。

![rancher04.png](https://qiita-image-store.s3.amazonaws.com/0/61606/4358b05f-251e-3be1-83da-7c109f10c24f.png)

マシンドライバ選択で「packet」を選択します。

![paket1.png](https://qiita-image-store.s3.amazonaws.com/0/61606/dc52ae26-d32e-b575-ab23-40ebdc06dc1b.png)

以下の内容を入力します。

|項目               |入力概要             |
|:-----------------|:-----------------|
|名前             |任意の名称を入力します。             |
|数             |必要な仮想マシン数を入力します。            |
|プロジェクト             |packetのGUI管理コンソールから左メニュー「Manage」を選択して、対象となるプロジェクトを選択して、「Settings」タブ内のInfoに表示されるProject IDを入力します。             |
|APIキー             |packetのGUI管理コンソールの左メニュー「API Keys」で表示される対象のTOKENを入力します。APIキーが無い場合は作成します。            |
|イメージ             |利用するOSを選択します。            |
|サイズ             |packetでデプロイしたいサーバタイプを選択します。タイプは[こちら](https://www.packet.net/bare-metal/)になります。            |
|リージョン             |利用するリージョンを選択します。            |

![paket3.png](https://qiita-image-store.s3.amazonaws.com/0/61606/c9d891cf-26cc-dcea-07a2-edae0dc3761c.png)

ラベル及び拡張オプションについては、必要な場合は設定しますが、必須ではないのでここではデフォルトとします。

「作成」ボタンを押下します。

しばらくするとホストが追加されて、Rancherサーバの管理配下となります。

![paket4.png](https://qiita-image-store.s3.amazonaws.com/0/61606/74192c05-0220-49ad-9c07-97d2e4c487e4.png)

***
以上で、「Rancherでpacketのマシンドライバーを利用してホストを追加する」は完了となります。

Rancherには以下のマシンドライバーがあります。
※2016年12月現在v1.2.0

![rancher09.png](https://qiita-image-store.s3.amazonaws.com/0/61606/e5f80e48-bbe6-9db9-03b6-53b0cec83e41.png)

マシンドライバーは追加もできるので、他のクラウドとAPI連携させることも可能です。
Siv3Dでカメラアプリを作る

#Siv3Dでカメラアプリを作る
みなさんは自撮りしますか？僕はしません。
最近、自撮りをするときに顔を熊にしてくれるアプリがあるそうです。（SN〇W
今回はそれをSiv3Dで作りたいと思います。

##1.カメラを起動

まず、カメラを起動します。

Siv3Dでカメラを使うには、Webcamクラスを使います

```ruby:カメラ起動
#include<Siv3D.hpp>
void Main()
{
	Webcam webc;
	if (!webc.open(0, Size(640, 480)))
	{
		return;
	}
	if (!webc.start())
	{
		return;
	}

	Image image;
	DynamicTexture cameraTexture;
	
	while (System::Update())
	{
		if (webc.hasNewFrame())
		{
			webc.getFrame(image);
			cameraTexture.fill(image);
		}
		cameraTexture.draw();
	}
}
```
これでWebカメラから画像を取得できます。

##2.顔を取得
続いて、カメラからとった画像から顔の個数、大きさ、座標を取得します。


```ruby:顔を取得する関数
Imaging::DetectFaces(image);
```
Imageing::DetectFacesにWebカメラでとった画像をいれると顔の座標、顔の大きさのArray\<Rect\>を返します。

これを使って、まず、顔の部分を塗りつぶしてみましょう。
とはいっても、Array\<Rect\>を全部drawするだけです。

```ruby:顔を塗りつぶす
# include <Siv3D.hpp>

void Main()
{
	Webcam webc;
	if (!webc.open(0, Size(640, 480)))
	{
		return;
	}
	if (!webc.start())
	{
		return;
	}
	Image image;
	DynamicTexture cameraTexture;
	Array<Rect> faces = {};

	while (System::Update())
	{
		if (webc.hasNewFrame())
		{
			webc.getFrame(image);
			faces = Imaging::DetectFaces(image);
			cameraTexture.fill(image);
		}
		cameraTexture.draw();
		for (auto face : faces)
		{
			face.draw(Palette::Red);
		}
	}
}
```

これでこんな感じになります。
![スクリーンショット 2016-12-11 23.12.21.png](https://qiita-image-store.s3.amazonaws.com/0/151080/e15ecd79-6d56-754e-b88d-11efec1cab1b.png)

##3.画像を表示する
あとは、さっきのArray\<Rect\>の座標と大きさに画像を表示するだけです。

```ruby:顔の位置に画像を表示
for (auto face : faces)
{
	if (face.area() > 15000)
	{
		faceTexture.resize(face.w, face.h).draw(face.x, face.y);
	}
}
```

こんな感じの奴を2.でやったソースコードのdrawするところと入れ換えれば

```ruby:完成！
# include <Siv3D.hpp>

void Main()
{
	Webcam webc;
	if (!webc.open(0, Size(640, 480)))
	{
		return;
	}

	if (!webc.start())
	{
		return;
	}

	Image image;
	DynamicTexture cameraTexture;
	Texture faceTexture = Texture(L"sample.png");
	Array<Rect> faces = {};

	while (System::Update())
	{
		

		if (webc.hasNewFrame())
		{
			webc.getFrame(image);
			faces = Imaging::DetectFaces(image);
			cameraTexture.fill(image);
		}

		cameraTexture.draw();

		for (auto face : faces)
		{
			if (face.area() > 15000)
			{
				faceTexture.resize(face.w, face.h).draw(face.x, face.y);
			}
		}
	}
}
```

画像に合わせて大きさなどに調整を加えればこんな感じです！
![スクリーンショット 2016-12-11 23.26.08.png](https://qiita-image-store.s3.amazonaws.com/0/151080/3526796b-2e45-17bc-80a5-6625a739e8e7.png)

##いかがだったでしょうか
実は自分はSiv3Dを触って半年しか経っていない（C++すら触ったことがなかった）ので、簡単な記事になってしまいました。
しかし、Siv3Dを使えば、わずか半年でもこのくらいのものを自分で作れるようになるというのはとても簡単だと感じました。
いつか、Siv3Dがスマホで使えるようになって、いろんな人が自分で作ったカメラアプリで自撮りしてたらおもしろいですよね。
ESP-WROOM-02(ESP8266)ファームウェアのアップデート手順

#はじめに
ESP8266のファームウェアアップデート手順はググれば出てくるんですが、私の環境ではどれもすんなり行かなかったので、ここでは「私はこれでうまく出来ました」という手順を残しておきます。

**一部書き込みのアドレスが誤っているとご指摘頂いたので修正しました。**
**あと改行位置がおかしくてとても読みにくかったですね。。**

#ESP-WROOM-02が反応しなくなった
ArduinoをWifiでつなぐんだ、と思って入手したESP-WROOM-02(が載ったESPr Developer）。
Macと直接接続してATコマンドを打って色々と試していると、何かイケないコマンドを入力してしまったのか、うんともすんとも言わなくなりました。
とにかく違うバージョンのファームウェアを書き込めば直るらしい、とgoogle先生に教えてもらったのでアップデートすることにしました。

#フラッシュライターを入手する
ESP8266向けにフラッシュライターを含むユーティリティーセットがGithubにあるのでgit cloneしてきます。pipでのインストールも出来るのでお好みで。

[espressif/esptool](https://github.com/espressif/esptool)
からの
```
python setup.py install
```
で。
pipの場合は
```
pip install esptool
```

#ファームウェアを入手する
アップデートするファームウェアを入手します。

[ESP8266EX Resources](http://espressif.com/en/products/hardware/esp8266ex/resources)

"ESP8266 NONOS SDK VX.X.X"というものを落としてきます。
パッチじゃないやつです。

落としきたファイルを解凍して
「ESP8266_NONOS_SDK/bin/at」の下に「README.md」（古いverだとtxt)があるので、それをお好みのエディタで開きます。
必要なのは以下の部分です。

```README.md
# NON-BOOT MODE
## download
    eagle.flash.bin              0x00000
    eagle.irom0text.bin          0x10000
    blank.bin
        Flash size 8Mbit:        0x7e000 & 0xfe000
        Flash size 16Mbit:       0x7e000 & 0x1fe000
        Flash size 16Mbit-C1:    0xfe000 & 0x1fe000
        Flash size 32Mbit:       0x7e000 & 0x3fe000
        Flash size 32Mbit-C1:    0xfe000 & 0x3fe000
    esp_init_data_default.bin (optional)    
        Flash size 8Mbit:        0xfc000
        Flash size 16Mbit:       0x1fc000
        Flash size 16Mbit-C1:    0x1fc000
        Flash size 32Mbit:       0x3fc000
        Flash size 32Mbit-C1:    0x3fc000
```

ファイル途中にある「NON-BOOT」の箇所を参照してください。
また、Flash sizeは8Mbitの箇所を参照します。

#書き込む
ターミナルから以下のように実行してファームウェアを書き込みます(全て１行）。
書き込むとき、ESPr Developerはモード書き換えボタンを推したままリセットボタンを推してリセットしてから書き込みます。

```
./esptool.py -p /dev/XXXXX write_flash
 0x000000 ~/esp_iot_sdk_v1/esp_iot_sdk_v1.5.0/bin/at/noboot/eagle.flash.bin
 0x10000 ~/esp_iot_sdk_v1/esp_iot_sdk_v1.5.0/bin/at/noboot/eagle.irom0text.bin
 0xfc000 ~/esp_iot_sdk_v1/esp_iot_sdk_v1.5.0/bin/esp_init_data_default.bin
 0x7e000 ~/esp_iot_sdk_v1/esp_iot_sdk_v1.5.0/bin/blank.bin 
 0xfe000 ~/esp_iot_sdk_v1/esp_iot_sdk_v1.5.0/bin/blank.bin
```

ディレクトリは適宜読み替えてください。
また、「/dev/XXXXX」の箇所はArduino IDEにESPr DeveloperをUSB接続した状態で「ツール-シリアルポート」で表示されるポート名に置き換えてください。

これでリセットしてからシリアルモニタを見て「Ready」と出れば無事アップデート完了です。
【iOS10】ATSのおさらい


この記事は「[iOS その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ios2)」10日目の記事です。
テーマは、 **2016年中** にiOSにおけるATSをおさらいしよう！ です。

# 自己紹介
私は、株式会社サイバーエージェント **CA ProFit-X** という広告プロダクトで、メディア様の収益を最大化することを目標にエンジニアをやってます。</br>
**CA ProFit-X** は、モバイル向けネイティブ広告（主にインフィード広告）専業のSSP事業者なのです！

# お題
モバイルアプリ/モバイルウェブサービス上で広告運用時に気にしておきたい **ATS** について、今回は最新OSである **iOS10** にターゲットを絞り、お話ししたいと思います。

# ATSとは？
ATSは、App Transport Securityの略で、2015年にiOS9がリリースされた際に導入されたセキュリティ仕様です。<br/>詳しい仕様は [コチラ（Apple Developer Library）](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW35)です。<br/>

簡単に言うと、アプリとWEBサービス間の接続のプライバシーと、データの整合性を向上を目的に、セキュリティ仕様に準拠していない接続は認めないってことです。<br/>例えば下記とか。

## サーバー証明書に関する要件
- パブリック認証局が発行していること
- 証明書鍵長について
- 署名アルゴリズムについて

## Webサーバーに関する要件
- HTTPSについて
- SSL/TLS のバージョンについて
- Forward Secrecy に対応している暗号化スイートについて

# 2017年からは対応が必須になる
原則対応が必須になります。新規アプリ／既存アプリ問わずApp Storeに提出するには **ATS有効化が必須条件** です。

## 対象
まぁ、ほとんど全部ですね。

- iOS9.0以上
- WKWebView
- UIWebView
- NSURLSession
- NSURLConnection

## ATSを無効化するには？
基本的に、セキュリティ仕様に準拠しとけば良いのですが、いちおう。<br/>細かいキーの仕様については[コチラ](https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33)です。

### NSAllowsArbitraryLoads
- デフォ値は `No`
- `Yes` に設定した場合
 - `NSExceptionDomains（オプション）で設定したドメイン以外のネットワーク接続が全てATS無効となる

文章に突っ込む時にもう少し分かりやすくしないとなー。
 - App Storeへアプリを提出する際にAppleに対する説明が必要になる
 - （後述する）NSAllowsArbitraryLoadsInWebContentが `Yes` の場合、このキーは無効になる

### NSAllowsArbitraryLoadsInWebContent
- デフォ値は `No`
- `Yes` に設定した場合
	- 下記のネットワーク接続がATS無効化される
		- WKWebView
		- UIWebView
	- つまり、NSURLSession/NSURLConnection接続はATS有効のまま、WebViewのみATS無効となる
- iOS10以上が対象、iOS9以下については本キーを `Yes` にした上で、`NSAllowsArbitraryLoads` も設定する

<br/>
(´ε｀；)ｳｰﾝ…
<br/>


# まとめ
iOS10なら、WebViewでATSを無視できるっちゃできるのね。<br/>
でも、これはAppleの独断とかではなく、セキュリティ的に安全な配信をしていこうぜって大きな流れの1つなわけで。<br/>Googleも[HTTPSサイコー！](https://webmaster-ja.googleblog.com/2015/12/indexing-https-pages-by-default.html)って言ってるわけだし。<br/><br/>ATS対応ができねーとかケチくさいこと言わずに、堂々とやってやりましょうよ！
Elasticsearch with RoRで色んな検索をしてみる。その2

[Elasticsearch with RoRで色んな検索をしてみる。その1](http://qiita.com/nekakoshi/items/eb1d5992411969851997)の続きです。

今回は自分がハマった部分をサクサクっとご紹介します。
ちなみに体系的に記述する時間がないのと、現在Golangをやっている理由から
記述内容が微妙に異なる可能性がありますので
あらかじめご了承ください。

## はじめに

せっかく全文検索エンジンをRailsで操作できるのに、
単なる全文検索だと楽にならない。。。
と思ったので、
分類分け方法をご紹介します。
ちなみに私がハマったのは、Elasticsearchの機能をRailsで書いた時の
構文エラーが主なものです。

## 前提

前回に引き続き以下のようなmodelを利用します。

```
$ cat ./app/models/concerns/xxx.rb
class Xxx < ApplicationRecord

  include Elasticsearch::Model

  index_name "es_#{Rails.env}"
  document_type 'test'

  [snip]

  def self.search(params = {})

    # ここに書いてく感じのやつです。

    # 検索クエリをなげて結果を表示
    __elasticsearch__.search(search_definition)
  end
```

### 一般的なグルーピング

元は[こちら](https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations.html)です。

xxx.levelというのがあるとして
こちらをGropingします。

```
### model
aggregation :level do
  terms field: 'level'
end

### view (haml)
= Xxx.Search.aggregations.level.buckets ### ハッシュが表示される。
```

### リレーション先の値を表示する。

xxxに対して yyy がリレーションされている場合です。

```
### model
aggregation :yyy_group do
  terms field: 'yyy.group'
end

### view (haml)
= Xxx.Search.aggregations.yyy_group.buckets ### ハッシュが表示される。
```


### ネストしてみる

xxx.levelに yyy.groupを配列的にくっつけます。
例えば、 level = [1,2,3]で yyy.group = ["group1", "group2"]と仮定した場合
出力結果が

```
{
 1 => {"group1" => 1, "group2" => 2},
 2 => {"group1" => 5, "group2" => 3},
 3 => {"group1" => 0, "group2" => 9},
}
```
のように表示されます。

```
aggregation :level do
  terms field: 'xxx.level' do
    aggregation :yyy_group do
      terms field: 'yyy.group'
    end
  end
end
### view (haml)
- Xxx.Search.aggregations.level.buckets do | level |
  level.aggregations.yyy_group.buckets ### ハッシュが表示される。
```

### Stepしてみる。

ある値ごとにカテゴリーを作成したい場合は以下のような形でできます。



```
### model
price_step = 100
aggregation :price do
  range field: 'rates_from', ranges: [ { to:  price_step }, {  from:  price_step , to: price_step * 2}, {  from: price_step * 2, to: price_step * 4}, {from: price_step * 4 }]
end

### view
= Xxx.Search.aggregations.price.buckets
```

他にも色んな分け方ができますが、
長くだらだら記述しそうなので、一旦ここまでにします。
ToDoに必要なこと。(設計)

####新規登録(メニューから)。
####右にスワイプしきる。
終了してリストから削除。終了ページに登録。
####Finishボタン。
終了してリストから削除。終了ページに登録。
####Openボタン。
1ページに表示して編集可能にする。更新する。

###必要なこと。
####リストページをもうひとつ作る。
タイトルで遷移する。遷移は左右。
####タイトルを表示する。
タイトルはジャンルごとにする。タイトルで遷移する。遷移は左右。
####Openボタンで表示する。
表示は、メインページ。
####ToDoをTodo.lyに一括登録する。
####Todoで読む。
asyncAfterをキャンセルする

`DispatchWorkItem.cancel()`を呼び出すことで、キュー内のまだ実行されていないアイテムの実行を中止できる。

## コード
```swift
import Cocoa
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true


let workItem = DispatchWorkItem() { Swift.print("not executed") }
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: workItem)
workItem.cancel()

DispatchQueue.main.asyncAfter(deadline: .now() + 1) { Swift.print("executed") }
```

## 結果
```swift
executed
```

## 注意
`DispatchWorkItem.cancel()`は実行中のアイテムを中断しない。
[grand central dispatch - How to stop a DispatchWorkItem in GCD? - Stack Overflow](http://stackoverflow.com/questions/38370035/how-to-stop-a-dispatchworkitem-in-gcd)
DispatchQueueは強参照を保持しない


## コード (Playground)
```swift
import Cocoa
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

weak var workItem: DispatchWorkItem?
if true {
    let item = DispatchWorkItem() { Swift.print("delayed job") }
    DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: item)
    workItem = item
}
Swift.debugPrint(workItem as Any)
```

## 結果
```
nil
delayed job
```

## 対策
DispatchWorkItemを強参照で保持する。
または、ブロックを使用する。

```swift
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { Swift.print("delayed job") }
```
エンジニアとデザイナーの寄り添い方

#自己紹介

カノジョできてるエンジニア Advent Calendar 2016の12日目。
HAL大阪2回生の河野と申します。

大阪でフロントエンドエンジニアとして活動しています。

詳細はWantedlyを見ていただければと思います。
[河野純也](https://www.wantedly.com/users/17778562)

1年前に、彼女の誕生日を祝うサイトを作りました。

[Milkcocoaを使って、誕生日サイトを作った話](http://qiita.com/konojunya/items/2fda9cf6d9e6e5b7c430)

![スクリーンショット 2016-12-11 23.31.25.png](https://qiita-image-store.s3.amazonaws.com/0/90347/034f44d0-fac2-5f25-d35c-fa3e689dfe13.png)


[サイトを見る](https://konojunya.com/contents/sayaBirthday/view.html)

# 彼女紹介
彼女は同じHAL大阪のCG学科に通うデザイナーです。

最近では**[チャリティー年賀状 学生デザインコンテスト](http://blog.hal.ac.jp/osaka/5315.html)**に入賞していたり(グランプリ？は買われた枚数が多いものになるらしいです。)

作品はこちら

![](http://blog.hal.ac.jp/osaka/wp-content/uploads/2016/12/charity_11.jpg)

# エンジニアとデザイナーのコミュニケーション問題

よく職場で聞くのが、デザイナーさんからだと

- エンジニアの考えていることがわからない。
- 話が合わない。

などが挙げられるでしょうか。逆にエンジニアからしても同じような感じになっているのではないでしょうか。

営業と技術者の差は、営業陣の理解がないと埋まりづらいのはあると思いますが、エンジニアとデザイナーはもっと密接にコミュニケーションを取れば大丈夫だと考えています。

デザイナーの彼女を持っている経験からいくつかそのコミュニケーションをとる方法を提案出来ればと思います。

# デザイナーの特徴

エンジニアの目線で書いています。

*デザイナーといっても、まだ学校で勉強している卵ですが学科ではいい成績なようなのでデザイナーとして扱いたいと思います。*

## 自分を持っている

デザイナーの方は特にだと思いますが、自分の意見をしっかり持っていて、その根拠もあります。

なにか自分の経験から物を言っている場合が多いです。

しっかり相手の意見を聞いて、エンジニアの経験としての意見があるならそこで議論しましょう。


## 他の趣味を持っていることが多い

特にキャラクターなどを書くことが出来るようなグラフィック系のデザイナーさんだと漫画とかアニメにも詳しかったりします。

エンジニアとも共通の話が多いのではないでしょうか。

特に可愛い女の子が出てくるアニメは要チェックしましょう。デザイナーが見てる率高いです。

## いい感じには1番嫌い

エンジニアもそうだと思いますが、*「良い感じにデザインしておいて！」*が1番困ります。

テーマやコンセプトから、ビジュアル化するのが役割なのでコンセプトをしっかり伝えることが重要です。


# 最後に

基本的にはコミュニケーション不足なだけで、お互いがしっかり一つのものを作ろうとすれば大丈夫だとおもいます。

是非上記のことに気をつけながら、明日はデザイナーの方へ話しかけて見ましょう！！！
必須ではない非同期処理を行う場合のTips

例えば次のような処理です。

```
// ログイン処理

// データ検索処理
```

ログイン処理の結果によらずデータ検索処理は行うものとします。ただしログイン処理は非同期処理です。

こんな感じのコードが思いつきますが、同じ処理があるのはよくありません。

```
if (login) {
User.login.execute()
  .then(function() {
    Data.Search.execute();
  })
} else {
  Data.Search.execute();
}
```

そこでPromiseを使います。

```
function loginFunction() {
  return new Promise(funciton(res, rej) {
    if (login) {
      User.login.execute()
        .then(function() {
          res();
        })
    }else{
      res();
    }
  })
}

loginFunction()
  .then(function() {
    Data.Search.execute();
  })
```

Promise = 非同期処理で有効ですが、非同期じゃない場合も含めてラッピングできるのが便利です。
アジャイルについてつらつら　その１

こんにちは。


# アジャイル


アジャイルといえば、「アジャイルソフトウェア開発宣言」ですね。
[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)

ここの、「プロセスやツールよりも個人と対話を」の部分が特にすきです。
そう、それがやりたいの！とよく思う。でも中々うまくいかない。

ちなみに、アジャイル開発はやったことがない。夢物語です。

どこかの勉強会に行った時に、
「アジャイルということばに夢をみて、アジャイルをやることを動機にするのはよくない」
「Doじゃない、Beだ！」
と言っているのを聞き、ぐっときました。

ことばに恋しちゃだめですね、何をしたいかを明確にし、こころにきめ
アジャイルが目的になってはならないんだな、ということをとても強く感じました。


さてさて
アジャイル開発には以下のような特徴があります。※諸説あります

* 実際に動作するプログラムを短いサイクルでリリースする
* 完全なドキュメントよりも動くプログラムを優先する
* 持続的、継続的な保守を前提とする
* 利用者の要求を随時取り入れる

短い開発期間で計画・設計・実装・テストを回しそれらを反復(イテレーション)することでリスクを最小化することを目的として提唱されてた手法です。

アジャイル開発の方法論としてはXP(エクストリームプログラミング)やスクラム開発などが挙げられます。

では、具体的に開発工程のサイクルは、以下のような感じ。

<img width="1166" alt="アジャイル.png" src="https://qiita-image-store.s3.amazonaws.com/0/150624/7bae2c4a-41a3-5f21-5317-9e7e98c279b9.png">


ぐーるぐーるまわっていきます。
やったことはありません。はー、やってみたい。

　　
次回のその２では、この絵のつづきからやっていきます。

アウトプットして、ちしき固めていくぞ〜。