OmniAICreator/Qiita-1.07M huggingface dataset:
interface{} をソートする

## Slice のソート

シンプルに[型アサーション (Type Assertions)](https://golang.org/ref/spec#Type_assertions) を使います。

```go
type Person struct {
	Name string
	Age  int
}

type People []Person

func (p People) Len() int           { return len(p) }
func (p People) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p People) Less(i, j int) bool { return p[i].Age < p[j].Age }

func Sort(v interface{}) interface{} {
	s, ok := v.(sort.Interface)
	if !ok {
		return v
	}
	sort.Sort(s)
	return s
}

func main() {
	people := People{{"Bob", 31}, {"John", 42}, {"Michael", 17}, {"Jenny", 26}}
	fmt.Println(people)  // [{Bob 31} {John 42} {Michael 17} {Jenny 26}]
	Sort(people)
	fmt.Println(people)  // [{Michael 17} {Jenny 26} {Bob 31} {John 42}]
}
```
<iframe src="https://play.golang.org/p/8bPPF0dBEF" frameborder="0" style="width: 100%; height: 100%"><a href="https://play.golang.org/p/8bPPF0dBEF">see this code in play.golang.org</a></iframe>

`interface{}` が `sort.Interface` を実装した Slice であると期待できる場合、この方法で十分でしょう。

## 入れ子になった Slice のソート

入れ子になった Slice もソートしたい場合は、構造体のフィールドと Slice のインデックスを走査します。

```go
func Sort(v interface{}) {
	switch values := reflect.ValueOf(v); values.Kind() {
	case reflect.Slice:
		for i := 0; i < values.Len(); i++ {
			if values.Index(i).CanSet() {
				Sort(values.Index(i).Interface())
			}
		}
	case reflect.Struct:
		for i := 0; i < values.NumField(); i++ {
			if values.Field(i).CanSet() {
				Sort(values.Field(i).Interface())
			}
		}
	case reflect.Ptr:
		Sort(values.Elem().Interface())
	}
	if s, ok := v.(sort.Interface); ok {
		sort.Sort(s)
		return
	}
	switch s := v.(type) {
	case []int:
		sort.Ints(s)
	case []float64:
		sort.Float64s(s)
	case []string:
		sort.Strings(s)
	}
}
```
<iframe src="https://play.golang.org/p/iZUNwaxR7h" frameborder="0" style="width: 100%; height: 100%"><a href="https://play.golang.org/p/iZUNwaxR7h">see this code in play.golang.org</a></iframe>
`sort.Interface` が実装されていないフィールドが `[]int`, `[]float64`, `[]string` のいずれかだったときは `sort` パッケージに用意されているデフォルト実装でソートを行うようにしています。
iframeタグで読込んだhtmlのDOMをjQueryで扱う


```html:
<iframe id="ifr" src="scripttest_ifr.html"></iframe>
```

で読込んだhtmlに対してjQueryで要素を変更するには
iframeタグの内容をcontents()で取得して
findでその中で対象となる要素を指定すれば，あとは，いつも通り．


```js
  var childDom = $('#ifr').contents()
  childDom.find('p').css("color","red");;
```


scripttest_ifr.html内のpタグの文字が赤くなった


の，はずが（ここまではいろいろな所に書いてあった）


chrome　（バージョン47）で実行すると，
『Failed to read the 'contentDocument'』が出て悩んだ．

（なんでchromeかというと，デバッグ画面が慣れているからで，
　それだけのこと．）

```open hoge.html``` では，safariで開く環境なのだが，
そのときはエラーにならない．

こちら
http://blog.buddying.jp/tips/2015-11-04/404/
に書かれているように，サーバにアップして 
```http://localhost/hoge.html```
としたらchromeでも動作しました．めでたし．




下記が，そのときのchromeでのエラーメッセージ

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match.
Elastic社のTopbeatに入門してみた

# はじめに

Beatsと呼ばれるイベント特化型エージェントをElastic社が開発している。
[Beats | Collect, Parse & Ship](https://www.elastic.co/products/beats)

最近出てきたプロダクトであり、あまり日本語の情報がない。公式のドキュメントにそってインストールしてみたら割りと簡単だったのでここに記すことにした。

# Topbeat概要
TopbeatとはBeatsシリーズの中でもシステムメトリクスを主として収集するエージェントである。なお、現在のGAのバージョンは1.0.1である。

取得できる主な情報は以下の通りである。

* システム全体の統計情報
* プロセス毎の統計情報
* ファイルシステムの統計情報

### システム全体の統計情報
システム全体の統計情報としては以下の情報の取得が可能である。

* ロードアベレージ: 1分、5分、15分の平均のロードの値の取得
* 各種CPU使用率: user, system, idle, IOwaitなど
* メモリー使用率: total, used, freeなど
* スワップ使用率: total, used, freeなど

### プロセス毎の統計情報
プロセス毎の統計情報としては以下の情報の取得が可能である。

* プロセス名
* 親プロセスのPID
* プロセスの状態
* プロセスのPID
* プロセスごとのCPU使用率
* プロセスごとのメモリー使用率

### ファイルシステムの統計情報
ファイルシステムの統計情報としては以下の情報の取得が可能である。

* 利用可能なディスクのリスト
* 各ディスクの名前、タイプ、どこにマウントしているか
* 各ディスクの空き容量


# Topbeat入門
各クライアントにTopbeatをインストールする。当然だが、事前にデータ転送先のElasticsearchクラスターは構築しておく必要がある。

### Topbeatインストール
インストール手順はこの[資料](https://www.elastic.co/guide/en/beats/topbeat/1.0.1/topbeat-getting-started.html)の通りである。

```shell-session:Ubuntu/Debian
$ curl -L -O https://download.elastic.co/beats/topbeat/topbeat_1.0.1_amd64.deb
$ sudo dpkg -i topbeat_1.0.1_amd64.deb
```

```shell-session:RHEL/CentOS
$ curl -L -O https://download.elastic.co/beats/topbeat/topbeat-1.0.1-x86_64.rpm
$ sudo rpm -vi topbeat-1.0.1-x86_64.rpm
```

### Config設定
`/etc/topbeat/topbeat.yml`を編集する。

```shell-session
$ sudo vi /etc/topbeat/topbeat.yml
```

以下の内容を追加するのだが、デフォルトですでに記述されているため編集は不要である。

```
input:
  period: 10
  procs: [".*"]
```

プロセス監視を外すなら、以下の通り書き換える必要がある。

```
input:
  period: 10
  procs: ["^$"]
```

Elasticsearchのクラスターのアドレスを以下の通り記述する。ここでは、`192.168.0.[3-5]`がElasticsearchクラスターだと仮定する。

```
output:
  elasticsearch:
    hosts: ["192.168.0.3:9200","192.168.0.4:9200","192.168.0.5:9200"]
```

### Topbeat起動
Topbeatは以下のコマンドを実行すれば起動する。しばらくするとデータが転送されるのでKibanaからデータが送られていることが確認できる。こちらは`deb/rpm`共通である。

```shell-session
$ sudo /etc/init.d/topbeat start
```

### Kibana確認
Kibanaから以下のスクリーンショットの通り確認できる。デフォルトのIndex名は`topbeat-*`となっている。
![topbeat.png](https://qiita-image-store.s3.amazonaws.com/0/6595/ec1573a3-06f0-0dac-6c5f-ccef7e9114b6.png)

# おわりに
ひとまずインストールして確認するところまで出来た。Topbeatは、今のところフィールド加工やデータストアを変更するようなことはできない。流行るかどうかいまいち分からんが今後に期待した。

ちなみにこのBeatsシリーズはGolangで実装されているらしい。
https://github.com/elastic/beats
Kibana の設定を Import すると「Saved Objects: Could not locate that …」って怒られる


TL;DR
---
* 設定のインポート時に _id が変わっちゃう問題がある。(Kibana ver 4.3.1 でも発生)
* ひとまず保存時の設定名に `+` は使わないようにする。

環境
---
* CentOS 6.7
* Elasticsearch 2.1.1
* Kibana 4.3.1

現象
---
kibana で `My+Search` という名前で検索条件を保存して、それを Visualize で使っていた。

これらの定義を `Export Everything` した JSON ファイルをインポートしたら、 `
Saved Objects: Could not locate that search (id: My Search)` というエラーが発生した。

![1029d32a-c706-4946-a058-89b3445e41b8.jpg](https://qiita-image-store.s3.amazonaws.com/0/48194/81560652-953a-695d-6d41-7b9eff243b3d.jpeg)

原因
---
調べたところ、インポートした `My+Search` の `_id` が変わってしまっていた。

エクスポート時の `My+Search` の `_id` は `My Search` だった。
Visualize 定義もこの `_id` を使っている。

``` json
...
    }, {
      "_index" : ".kibana",
      "_type" : "search",
      "_id" : "My Search",
      "_score" : 1.0,
      "_source":{"title":"My+Search","description":"",
...
```

ところが、インポートした `My+Search` の  `_id` は `My-Search` になっていた。

``` json
...
    }, {
      "_index" : ".kibana",
      "_type" : "search",
      "_id" : "My-Search",
      "_score" : 1.0,
      "_source":{"title":"My+Search","description":""
...
```

これにより、Visualize 定義を読み込む際に `My Search` が見つからなくてエラーが発生したようだ。

他の怪しそうな記号をいくつか (` `, `!`, `$`, `\`, `-`, `_`) 試してみたが、これらは問題なくインポートできた。

対処
---
Kibana の Issue でそれらしいものを見つけられなかったが、恐らくバグだと思われるので、拙い英語で Issue を上げておいた。

とりあえずの回避策は kibana 上でのデータ保存時の名前には `+` を使わないようにするか、エクスポートした export.json を修正してからインポートする…、かな。
BotkitでHubotみたいにscriptsを読み込む


Hubotでは， `scripts/` に置いたJavaScriptやCoffeeScriptを読み込んでくれます．
でも，Botkitにこの機能が無くて，不便に思ってる人も多いかと思います．
(Twitterを見ていると，この機能が欲しいという声が結構ありました．)

そこでHubotのソースコードを基に，Botkitで `scripts/` の読み込みを実装してみました．

## Botkitのディレクトリ構成

Hubotに倣って，このようなディレクトリ構成にしてみました．

```
botkit/
  bin/
    botkit
  node_modules/
  scripts/
    hello.js
  package.json
```

`bin/botkit` が本体で，実行権限の付いたJavaScriptのコードです．
`scripts/hello.js` は，サンプル用のスクリプトです．
`package.json` の中味はこんな感じです．

```json:package.json
{
  "dependencies": {
    "botkit": ">= 0.0.*"
  },
  "engines": {
    "node": ">= 0.12.x",
    "npm": ">= 3.5.x"
  }
}
```

## scriptsの読み込みの実装

Hubotのソースコードを基に，JavaScriptへの変換と処理の簡略化をしてみました．
参考にしたソースコードは，以下の2つです(行のハイライトをしています)．

  - [github/hubot/bin/hubot](https://github.com/github/hubot/blob/9fe938f35362e20f7c0e3da57370a3ec9bc5a490/bin/hubot#L92#L93)
  - [github/hubot/src/robot.coffee](https://github.com/github/hubot/blob/9fe938f35362e20f7c0e3da57370a3ec9bc5a490/src/robot.coffee#L344#L377)

その結果 `bin/botkit` はこのようになりました．
処理内容は `scripts/` 以下のファイルを `require` して，実行しているだけです．
また，読み込んだスクリプトで使えるように `controller` はグローバル変数にしています．

```javascript:bin/botkit
#!/usr/bin/env node

var Botkit = require('botkit');
var Fs = require('fs');
var Path = require('path');

controller = Botkit.slackbot({
  debug: false
});

controller.spawn({
  token: process.env.BOTKIT_SLACK_TOKEN
}).startRTM();

var load = function(path, file) {
  var ext = Path.extname(file);
  var full = Path.join(path, Path.basename(file, ext));
  
  try {
    var script = require(full);
    if (typeof script === 'function') {
      script(this);
    }
  } catch(error) {
    process.exit(1);
  }
};

var path = Path.resolve('.', 'scripts')

Fs.readdirSync(path).sort().forEach(function(file) {
  load(path, file);
});
```

## 実際に使ってみる

今回は `hello.js` というスクリプトを用意しました．
`hello` というメンションに `hello` と返すだけです．

```javascript:scripts/hello.js
controller.hears('hello', ['direct_mention', 'mention'], function(bot, message) {
  bot.reply(message, 'hello');
});
```

`npm install` してから，`bin/botkit` を実行してみます．
Slackでトークンを取得する必要がありますが，Qiitaに投稿されている記事を参考にします．

  - [Slackの新しいフレームワークBotkitを試してみる - Qiita](http://qiita.com/icb54615/items/af08862dfaefbf2bbcbe)

```shell
$ export BOTKIT_SLACK_TOKEN='xoxb-01234567890-abcdefghijklmnopqrstuvwx'
$ bin/botkit
** No persistent storage method specified! Data may be lost when process shuts down.
** Setting up custom handlers for processing Slack messages
** API CALL: https://slack.com/api/rtm.start
** BOT ID:  botkit  ...attempting to connect to RTM!
```

では，実際にSlack上でBotkitに `hello` と話し掛けてみましょう．
こんな感じで `hello` と挨拶を返してくれるはずです．

![botkit.png](https://qiita-image-store.s3.amazonaws.com/0/58742/9a317ede-dac6-e886-4198-70c746527eb1.png "botkit.png")

## まとめ

今回はHubotを参考にして，Botkitで `scripts/` の読み込みを実装してみました．
これで，Botkitでもコマンド毎にファイルを分割できるようになりますね．
(CoffeeScriptも読み込めるようになれば，もっと便利なのですが…．)

Botkitは登場したばかりのフレームワークなので，今後の発展が楽しみです．
hubot-scriptsのようにbotkit-scriptsなどが実現すれば，もっと便利になりそうですね．
現在より過去の日時を、ランダムで取得するクエリ

```sql

SELECT FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP());
```
実行結果

```sql
mysql> SELECT FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP());
+------------------------------------------+
| FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP()) |
+------------------------------------------+
| 2001-03-01 06:30:36                      |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP());
+------------------------------------------+
| FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP()) |
+------------------------------------------+
| 1971-03-12 22:29:16                      |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP());
+------------------------------------------+
| FROM_UNIXTIME(RAND() * UNIX_TIMESTAMP()) |
+------------------------------------------+
| 1974-08-03 01:52:59                      |
+------------------------------------------+
1 row in set (0.00 sec)
```
viewDidLoadを強制的に呼び出す

例えばスワイプする度にUIViewControllerを生成するようなコードの場合、少し引っかかるような動作になることがあります。
これはインスタンスの生成に時間がかかっていると思われることが多いですが、実際ほとんどの場合はviewDidLoadに書かれた同期的なUIの処理に時間がかかっています。
そのため、インスタンス生成後にviewDidLoadを強制的に呼んでスワイプの時点では全て生成・構築された状態にすると良い動きをすることがあります。

```swift
_ = vc.view
```

viewDidLoadを直接呼ぶことはできない（呼んでも意味が無い）ので、viewにアクセスしてviewDidloadを発火させます。
チュートリアルなどで使えるスポットライトっぽいUIを作ってみました

よく、「こんなのできないの？」と聞かれることがあるので、作ってみました。

Github - [yukiasai/Gecco](https://github.com/yukiasai/Gecco)

![Demo](https://cloud.githubusercontent.com/assets/6880730/12470510/2d1cb602-c038-11e5-8095-a2a0d77f99db.gif)

## インストール

Cocoapodsでインストールして下さい

```
pod 'Gecco'
```

## 使い方

ただスポットライトを出すだけのシンプルなコードです。

``` swift
import Gecco

class ViewController: UIViewController {
  func showSpotlight() {
    let spotlightViewController = SpotlightViewController()
    spotlightViewController.spotlight = Spotlight.Oval(center: CGPointMake(100, 100), width: 100)
    presentViewController(spotlightViewController, animated: true, completion: nil)
  }
}
```

もし動画のように、注釈を出したい場合は`SpotlightViewController`を継承してカスタマイズします。

``` swift
import Gecco

class AnnotationViewController: SpotlightViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    // ... カスタムの処理などなど
  }
}
```

動画の実装は [GeccoExample](https://github.com/yukiasai/Gecco/tree/master/GeccoExample) に記載されています。

## スポットライトの形

以下の形状をサポートしています。

* 円
* 長方形
* 角丸長方形

``` swift
public enum Spotlight {
  case Oval(center: CGPoint, width: CGFloat)
  case Rect(center: CGPoint, size: CGSize)
  case RoundedRect(center: CGPoint, size: CGSize, radius: CGFloat)
    // ...
}
```

## 最後に

是非使ってみてください！
Laravel(5.1)のMacローカル環境での 'SQLSTATE[HY000] [2002] No such file or directory'エラー対処

初投稿&PHP,Laravel初心者です

LaravelのMacローカル環境でマイグレーションを行った際以下のエラーが発生しました。

>
  [PDOException]
  SQLSTATE[HY000] [2002] No such file or directory

どうやらMySQLとの接続エラーらしいのですが、`database.php`と`.env`の設定は一通り終わらせていました。

どうやら`database.php`で'unix_socket'を設定しなければいけないようです。

unix_socketはMySQLから

`show variables like '%sock%'`

すると

`+-----------------------------------------+-----------------+
| Variable_name                           | Value           |
+-----------------------------------------+-----------------+
| performance_schema_max_socket_classes   | 10              |
| performance_schema_max_socket_instances | -1              |
| socket                                  | /tmp/mysql.sock |
+-----------------------------------------+-----------------+`

このような画面が出てくるのでこの中の'/tmp/mysql.sock'をdatabase.phpに記述します。

```php:database.php
'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'sample',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ), 
```

もし`show variables like '%sock%'`でエラーが出た際はMySQLをアップグレードした上で再起動すると解決できると思います
Kibana の設定を Export Everything しても取得できない


TL;DR
---
* Kibana ver 4.3.0 だとバグッてて Export Everything が使えない。
* `index.max_result_window` の設定値を変更すれば使えるようになる。

**この問題は kibana  v4.3.1 の Pull Request 5586 で修正されていた。**
[kibana 4.3.1 Release Notes](https://www.elastic.co/guide/en/kibana/4.3/releasenotes.html#_kibana_4_3_1_release_notes)

環境
---
* CentOS 6.7
* Elasticsearch ver 2.1.1
* Kibana ver 4.3.0

現象
---
構築した Kibana の検索条件やダッシュボードの設定をバックアップしたり、そのまま他の環境の kibana にも適用したくて、`settings > Objects` で `Export Everything` したけど何も起きない。

![スクリーンショット_012116_122413_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/48194/9793b1c7-ae2c-28cc-eaa7-e1a3eab86b28.jpeg)

原因
---
Kibana のログを見てみると下記エラーログが出ていた。
なにやら `index.max_result_window` って制限値が小さいんだけど、設定変更できるよって言ってる。

``` plain
RemoteTransportException[[coesse-es-01][127.0.0.1:9300][indices:data/read/search[phase/query+fetch]]]; nested: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [2147483647]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.];
Caused by: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [2147483647]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.]
```

### `index.max_result_window` って？

下記リンク先にちょっと書いてあった。

> [Search changes - from + size limits](https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_21_search_changes.html)

`max_result_window` は、動的に変更可能なパラメータで、デフォルトはほぼ全てのクラスタで安全に使える 10,000 にしてるよ。高い値にしちゃうとヒープを大量に消費しちゃうからね、みたいな感じ。
`from + size` がどういう値なのかよく分からないけど…、設定名からして検索結果に応じたサイズなのだろう。


対処
---
本件は Issue になっていて、上記メッセージと同じく設定の変更を暫定対処としてコメントされていた。

> [Kibana 4.3 "Export Everything" exception · Issue #5524 · elastic/kibana](https://github.com/elastic/kibana/issues/5524#issuecomment-160994149)

じゃあ、早速。

``` bash
$ curl -X PUT localhost:9200/.kibana/_settings -d '{ "index": { "max_result_window": 2147483647 }}'
{"acknowledged":true}
```

改めて `Export Everything` してみたところ、以下の通り export.json として出力されるようになった。

![スクリーンショット_012116_125111_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/48194/7fa97c5b-c840-eb55-e6f3-0389e4b28a25.jpeg)
ReplayKitでアプリの動画を簡単に撮ろう

iOS 9 から導入された`ReplayKit`では，アプリの動作の様子を簡単に録画することもできます．また，設定によって同時にマイクから録音させることもできます．日本語の記事が見つからないので書いてみました．

ゲーム実況用のAPIのようですが，通常のUIKitで実装したアプリでも綺麗に録画することができます．アプリのプロモーション用動画を撮る際に，Macと接続しQuickTimeで録画したり，iOS Simulatorを録画したりという方法がありますが，ReplayKitでは，コードで録画開始と終了を指定できるので，確実に，綺麗に録画することができます．

また，実際にユーザーテストでアプリを使ってもらう際にも，ログとして確実に保存できます．Macとの接続も要りません．

ということで使い方ですが簡単です．

まず録画の開始です．


```objc
@import ReplayKit;
...

[[RPScreenRecorder sharedRecorder] startRecordingWithMicrophoneEnabled:NO handler:^(NSError * _Nullable error) {
    if (error) {
        NSLog(@"failed to start recording, %@", [error localizedDescription]);
    }
}];

```

続いて終了です．

```objc

[[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {
    if (error) {
        NSLog(@"failed to stop recording, %@", error);
    } else if (previewViewController != nil){
        // 録画した動画をトリム・プレビューするRPPReviewViewControllerを表示
        [self presentViewController:previewViewController animated:YES completion:nil];
    }
```

たったこれだけ！

録画開始のときに，ユーザーへのアラートが自動で表示されます．ユーザーの許可なしには録画できません．
またプログラム側で勝手に保存することもできません．ユーザーによる`RPPreviewController`からシェアあるいはカメラロールに保存のみです．安心ですね．
シェルスクリプト　その４

今回はファイルディスクリプタについてのメモです。
ファイルディスクリプタとはプロセスが対象のファイルへアクセスするときに使われている物で０番から９番まで番号が割り振られています。

・０番は標準入力、１番は標準出力、２番は標準エラーと指定されていますが他の番号は自由に使っても良いみたいです。

・"リダイレクション"とは端末上以外のところへ出力や入力の操作を行うこと。

・ファイルの標準出力の書き込みは">"で行うが正確には"1>"で標準出力の書き込み、"2>"で標準エラーの書き込みとなる。

・">>"で追加の書き込みがでる。

・標準入力は"<"もしくわ"0<"。

・"<<word"で標準入力をヒアドキュメントから読み込む。

・ヒアドキュメントはよくわからないが端末で入力を複数書くことができるような物っぽい。入力後"word"で終了。ただし"word"は例であり任意の単語を使える。

・">filename"で左の文字列をファイルに書き込み。

・">>filename"で左の文字列をファイルに追加書き込み。

・">&n"で左の文字列をｎ番目のファイルディスクリプタに書き込み。

・">>&n"で左の文字列をｎ番目のファイルディスクリプタに追加書き込み。

・">&-"で標準出力をクローズ。

・"<filename"で左の文字列をファイルから読み込み。

・"<&n"で左の文字列をｎ番目のファイルディスクリプタから読み込み。

・"<&-"で標準入力をクローズ。

・制御構造分では完全にクローズしたところでリダイレクトし、全体を１つのコマンドのように扱うため、すべてをひとまとめに渡される。

・execコマンドに引数を与えずリダイレクトすることで現行の処理にリダイレクト処理を行わせる。

・コマンドの入出力を捨てたいときは"/dev/null"(ゴミ箱)へリダイレクトすればよい。

・シェルスクリプトでは"vi"のヴィジュアル部分を省いたコマンドで"ed"や"ex"がある。

おまけ：PATH変数の設定
　　　　PATH=$PATH:/home/name/something/.....
　　　　export PATH
で追加できます。ただしCシェルではexportコマンドはつかえない、たしかsetenv。環境によりシェル立ち上げ時にPATHがリセットされることがあります。その場合は./bashrcのファイルへコマンドを書き込んでおけば毎度シェルの立ち上げ時にPATHを通してくれます。

参考資料：入門UNIXシェルプログラミング　改訂第２版　第４，５章（発行所：SBクリエーティブ株式会社）

[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その２](http://qiita.com/woolon/items/c69482474ba1564d5057)
[シェルスクリプト　その３](http://qiita.com/woolon/items/59c26dcb040adefae0f3)
[シェルスクリプト　その５](http://qiita.com/woolon/items/6366dd6dac12387d84b7)
[シェルスクリプト　その６](http://qiita.com/woolon/items/6e89c67220b9095a6414)
[シェルスクリプト　その７](http://qiita.com/woolon/items/4e3c986587f428742b79)
gulp(npm)に引数を渡したい！


「 **ファイルを指定して、gulpを実行したい！** 」となったので、
gulpでファイル名を引数でわたせばいいんじゃないの？と思い、対応していったんですがその時のメモです。


# gulpに引数を渡す
基本的に引数は渡せなそうだったので、
[minimist](https://github.com/substack/minimist)を使用することにしました。
こちらは、引数をオブジェクトとして渡してくれる機能になります。

##minimistの使い方

```javascript:gulpfile.js
var gulp = require('gulp'),
    minimist = require('minimist');
var argv = minimist(process.argv.slice(2));
gulp.task('check', function() {
  console.dir(argv);
});
```

####確認方法

```bash:gulp
$ gulp check -f HOGE
```

これで引数を受け取ることができました。

# npm run script に引数を渡す

npmは標準で「--」の後ろに引数を渡せます
https://docs.npmjs.com/cli/run-script
こちらを参考に、以下のように修正して `$ npm run` します。

```javascript:package.json
// 省略
"scripts": {
  "check": "bundle exec gulp check -f"
},
// 省略
```

```javascript:gulpfile.js
var gulp = require('gulp'),
    minimist = require('minimist');
var argv = minimist(process.argv.slice(2));
gulp.task('check', function() {
  console.dir(argv);
});
```

```javascript
$ npm run check -- HOGE // 「HOGE」を渡します
[19:15:10] Starting 'check'...
{ _: [ 'check' ], f: 'HOGE' }
[19:15:10] Finished 'check' after 2.27 ms
```

fにHOGEが入っているのは、
package.jsonのscriptsにあるcheck箇所に固定で
`"bundle exec gulp check -f"`
と記述してあるからです。

# 応用

`$ npm run check -- target` で `$ gulp check -f target` 
を実行したいので下記のように編集していきます。


```javascript:gulpfile.js
var gulp = require('gulp'),
    process = require('process'), 
    minimist = require('minimist');
var argv = minimist(process.argv.slice(2));

gulp.task('check', function() {
  // argv['f']の値がないときはboolean型のtrueを返すので文字列(引数があったら)だったら処理をすすめるようにします。
  if(argv['f'] === true) { 
    console.log('$ npm run watch -- [filename] // 拡張子無し');
    process.exit(0);
  }
  gulp.watch(['sass/' + argv['f'] + '.scss'], ['sass']);
});
// sassタスクは別途書く
```

```
$ npm run check -- style // style.scssを、sassタスク実行します。
```

これで引数に渡した値によって、タスク内で処理する対象や処理を変更することができました！
AWS_ACCESS_KEY_IDからどのIAMユーザのものか確認する

AWS_ACCESS_KEY_IDが環境変数とか設定ファイルとかに埋まってて、これどのIAMユーザのキーだろう？みたいなことがたまにあります。

AWSコンソールから１つずつユーザ設定を見てくのダルいので、AWS-CLIからできないかなーと思って調べたら、 `aws iam get-access-key-last-used` でアクセスキーIDを指定してユーザ名を逆引きできることに気付いたので、コマンドのメモ。

```bash
$ aws iam get-access-key-last-used --access-key-id 'XXXXXXXXXX'
{
    "UserName": "YYYYYYYYYYY",
    "AccessKeyLastUsed": {
        "Region": "N/A",
        "ServiceName": "s3",
        "LastUsedDate": "2016-01-21T03:05:00Z"
    }
} 
```
iOSでSwiftからwebviewに値を渡す

[iOSガワネイティブでSwiftから値を受け取る](http://qiita.com/tyfkda/items/5c82a4c28ae21c7c758d)

上記の記事を参考に実装したのだが、webview側で値が取れない・・・
いろいろ調べたら、戻すときのheaderに

+ Access-Control-Allow-Origin
+ Access-Control-Allow-Headers

が必要だったようです。(多分)



```swift:sample.swift
    private func sendBackPlainText(str: String, status_code:Int) {
        
        if let data: NSData = str.dataUsingEncoding(NSUTF8StringEncoding) {
            let headers = [
                "Content-Type": "text/plain",
                "Content-Length": "\(data.length)",
                "Content-Encoding": "UTF-8",
                "Access-Control-Allow-Origin" : "*", //ここ
                "Access-Control-Allow-Headers" : "*" //ここ
            ]
            
            let response = NSHTTPURLResponse(URL: self.request.URL!,
                statusCode: status_code,
                HTTPVersion: "1.1",
                headerFields: headers)
            self.client?.URLProtocol(self,
                didReceiveResponse: response!,
                cacheStoragePolicy: NSURLCacheStoragePolicy.AllowedInMemoryOnly)
            self.client?.URLProtocol(self, didLoadData: data)
            self.client?.URLProtocolDidFinishLoading(self)
        }
    }
```
Swift2での型変換

Swift入門時に簡単にサンプルをいじって動かそうとしたのですが、まさかの型変換（キャスト）で詰まったのでメモ

@Braianさんの記事（http://qiita.com/Braian/items/ba8a19f84a830f229e1b ）を参考にしていたのですが、「String → Int」と「String → Double」だけ動作しませんでした。

最初詰まっていたのですが、そもそもSwiftのバージョンが違うよねってことで調べたら
String.toInt() と atof がremove されていたってオチ。

なのでそれぞれのバージョンでの変換方法は以下です。
それ以外は上記の@Braianさんの記事を参照してください。

# String → Intの変換

## Swift 1.x
```swift
let myString: String = "256"
let myInt: Int? = myString.toInt()
```
## Swift 2.x
```swift
let myString: String = "256"
let myInt: Int? = Int(myString)
```

# String → Double の変換
## Swift 1.x
```swift
var myString: String = "10.5"
var myDouble: Double = atof(myString)
```
## Swift 2.x
```swift
let myString: String = "10.5"
let myDouble: Double? = Double(myString)
```
# 参考
 - http://qiita.com/Braian/items/ba8a19f84a830f229e1b
 - http://stackoverflow.com/questions/30739460/toint-removed-in-swift-2
Jil で enum を含むオブジェクトを Deserialize する

# Jil で enum を含むオブジェクトを Deserialize する

enum 型を含むオブジェクトを Jil でデシリアライズすると失敗します。
この対処を示します。

情報源は次です。
[Deserialisation w/ CamelCase exception #167](https://github.com/kevin-montrose/Jil/issues/167)

確認したコード

```csharp
public enum RoundMethod
{
    Unknown,
    なし,
    切り上げ,
    切り捨て,
    四捨五入,
}

public class Unit
{
    public string Name { get; set; }
    public RoundMethod Round { get; set; }
}

class Jil9
{
    static void Main()
    {
        var json = "{\"業務\":{\"Round\":2,\"Name\":\"kg\"}}";

        IDictionary<string, Unit> dic;
        try
        {
            dic = Jil.JSON.Deserialize<IDictionary<string, Unit>>(json);

            foreach (var d in dic)
                Console.WriteLine($"{d.Key}: {d.Value.Name}, {d.Value.Round}");
        }
        catch (DeserializationException e)
        {
            var logmessage = $"Message: {e.Message}, SnippetAfterError: {e.SnippetAfterError}, Source: {json}\n";
            Console.WriteLine(logmessage);
        }

        Console.ReadKey();
    }
}
```

上記の Deserialize は失敗し、例外 e は次のように出力されます。

    Message: Expected character: '"', SnippetAfterError: ,"Name":"kg"}}, Unit: {"業務":{"Round":2,"Name":"kg"}}

この問題は、型定義に `JilDirective` 属性をつけることで、期待どおり enum RoundMethod 型の要素としてデシリアライズしてるようになりました。

```csharp
public class Unit
{
    public string Name { get; set; }

    [JilDirective(TreatEnumerationAs=typeof(int))]
    public RoundMethod Round { get; set; }
}
```

次の出力を得ます。

    業務: kg, 切り上げ


確認した環境

- Windows 10 Home 64 ビット
- Visual Studio Community 2015 Update 1
- Jil 2.12.1
森崎くんだからVirtualBox on MacがVERR_SUPLIB_OWNER_NOT_ROOTでvagrant upできない場合の対処方法

# 背景
![i320.jpg](https://qiita-image-store.s3.amazonaws.com/0/38292/af1d273a-a9b5-e8d2-acfc-83a9be119498.jpeg)

あるときvagrant upしたらこんなんになってどのvmも起動しなくなった(´；ω；｀)ﾌﾞﾜｯ


## バージョン

```mac:command
tokifujp:cent7-apache tokifujp$ vboxmanage -v                                                                                                                            
5.0.14r105127
tokifujp:cent7-apache tokifujp$ vagrant -v
Vagrant 1.8.1
```

## vagrant upするとこんなんなる

vu = vagrant up デス

```mac:command
tokifujp:cent7-apache tokifujp$ vu
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 8888 (guest) => 8888 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.
```

# vagrantじゃなくてvirtualboxから起動してみると

あ、あかんヤツやこれ→"VERR_SUPLIB_OWNER_NOT_ROOT"でググろう
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/38292/a849e19f-f838-c202-bb9c-e0e218c9f10c.png)


# 原因は/Applications ディレクトリの権限だった

なんやねんApple。

```Mac:command
tokifujp:~ tokifujp$ ll /
:
drwxrwxr-x+  49 tokifujp  admin     1666 Jan 21 13:58 Applications
:
```

# 解決方法
![Morisaki02.jpg](https://qiita-image-store.s3.amazonaws.com/0/38292/6079a839-b3f6-04e3-ffc6-cb26e3061eb7.jpeg)

`sudo chown root /Applications`したら治った。
ElasticBeanstalkのebextentionを使ってSSM Agentをインストール


```.ebextensions/99_ssm_agent.config
container_commands:
  01-install_ssm_agent:
    command: bash .ebextensions/scripts/install_ssm_agent.sh

files:
  "/etc/sudoers.d/root-ignore-tty":
    mode: "000644"
    owner: "root"
    group: "root"
    content: |
      Defaults:root !requiretty
```

```.ebextensions/scripts/install_ssm_agent.sh
#!/bin/bash
mkdir /tmp/ssm
curl https://amazon-ssm-ap-northeast-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/ssm/amazon-ssm-agent.rpm
sudo rpm -i /tmp/ssm/amazon-ssm-agent.rpm
```
Ruby/SinatraでQRコードを作成して画像で表示するシンプルな方法



## 手順
基本この記事を参考にさせてもらいました。
[Rubyで簡単にQRコード画像を生成する方法](http://qiita.com/ryosy383/items/c753103c93fa177e4466)


画像表示は一時ファイル作って読み込んだりもできますが、
一番シンプルにdata_urlに変換してsrcに突っ込みました。簡単！


### Gem追加

```ruby:Gemfile
gem 'rqrcode_png'
```

### Controllerの処理

```ruby:main.rb
require 'rqrcode'
require 'rqrcode_png'
require 'chunky_png'
require 'base64'

get '/' do
  @url = "http://hogehoge.com"
  # QRコード画像作成
  qr = RQRCode::QRCode.new( @url, :size => 5, :level => :h )
  @qr_path = qr.to_img.resize(200,200).to_data_url

  haml :index
end
```

### Viewで表示

```ruby:index.haml
%img(src="#{@qr_path}")
```


これだけ。



## ハマったところ

### 本番デプロイすると謎のエラー
ローカルでは動いてたのに、Herokuにデプロイするとこんなエラーを吐きました。

    RQRCode::QRCodeRunTimeError - code length overflow. (260>208). (Try a larger size!):


どうやら指定してるサイズが小さいらしい。
[RQRCode::QRCodeRunTimeError: code length overflow. (372>288) #15](https://github.com/whomwah/rqrcode/issues/15)

ローカルで動かしてるときよりURLが長くなったので、
QRコードにする情報量が増えて、size:3では表現しきれんくなったのかと。

なので言われたとおりsizeを大きくしてあげたら無事解決。
（短めのURLなので5にしたら十分でした。適宜調整してください）


### ローカルテスト時にLINEで読み取れずに焦る
![qr.png](https://qiita-image-store.s3.amazonaws.com/0/11704/b21c2fb0-d529-c79f-e880-102ea5e44690.png)


LINEのQRコード読み取りはおそらくURL前提らしく、
ブラウザで開けないようなデータを読み取ろうとしてもエラーになります。

localhost:5000/xxxとかをQRコード化しても、
LINEだと「読み取れない形式です」とかって言われちゃう。

これに気づかず出力方法がおかしいのかとしばらくハマりましたが、
単純に有効なURLじゃなかっただけでした。

ローカルでのテスト中は他のQRコード読み取りアプリを使って、
正しく情報が読み取れることを確認するのが正しいアプローチ。



## まとめ
というわけで、URLをQRコードで共有する機能を実装して
スマホde百人一首がますます便利になりました。

[スマホde百人一首](http://karta.notsobad.jp/)

まだお正月気分が抜けてない人はぜひ遊んでみてくださいませ。



おしまい。
railsでAmazon-ecsがAmazon::RequestError (HTTP Response: 503 Service Unavailable)となるとき

#症状
railsにamazon-acsをrequireして商品情報検索してるのに

```ruby:hoge_controller.rb
class HogehogeController < ApplicationController
  def hoge
    @res = Amazon::Ecs.item_search('9784797372274',
             :search_index   => 'Books',
             :response_group => 'Medium',
             :country        => 'jp'
           )
  end
end
```

viewでインスタンス参照すると

``` erg:hoge.html.erb
<%= @res.first_item.get('ItemAttributes/Title') %>
<img src="<%= @res.first_item.get('MediumImage/URL') %>" />

```

```
Amazon::RequestError (HTTP Response: 503 Service Unavailable)
```

となってうまくいかない


#原因
リクエストの間隔が短いのがいけないらしい
今回の場合controllerとviewでそれぞれリクエスト送っているので間隔を開ければ良い

```ruby:hoge_controller.rb
class HogehogeController < ApplicationController
  def hoge
    @res = Amazon::Ecs.item_search('9784797372274',
             :search_index   => 'Books',
             :response_group => 'Medium',
             :country        => 'jp'
           )
    sleep(1) #これを追加,最適な秒数はよくわかりません
  end
end
```

#追記
よく考えたら普通にcontroller内でリクエストの内容をインスタンス変数に代入すればそもそもviewでリクエストする必要ない

#お世話になったサイト
http://blog.kosk.me/2013/10/22/get-dvds-cover-pics-2/
Realm+ObjectMapperで異なるAPIレスポンスをいい感じに適用して保存する

#Realm+ObjectMapperの問題点

たとえばAのAPIで

```swift
User[
 id:1
 name:"miko"
 is_my_cat: true
]
```

が返ってきて、BのAPIで

```swift
User[
 id:1
 name:"miko"
]
```

が返ってくるとします。

クラスは普通に以下の用に実装します。

```swift
import Foundation
import ObjectMapper
import RealmSwift

final class Cat:Object,Mappable{
  required convenience init?(_ map: Map) {
    self.init()
    mapping(map)
  }
  func mapping(map: Map) {
    id <- map["id"]
    name <- map["name"]
    isMyCat <- map["is_my_cat"]
  }
  dynamic var id:Int = 0
  dynamic var name:String = ""
  dynamic var isMyCat:Bool = false
  override class func primaryKey() -> String {
    return "id"
  }
}
```

この時に、AのAPIでマッピングしてRealmで保存した後にBでマッピングしてRealmに保存するとどうなるでしょうか…？

BのAPIにはis_my_catが無い為、マッピング時にisMyCatのマッピングは行われずに宣言時に指定された**false**が適用されます。

AとBのAPIを同じモデルで管理したい場合は、工夫が必要になります。

#解決策

```swift

  func loadLocalData(){
    guard let primaryKey = objectSchema.primaryKeyProperty?.name else {return}
    guard let primaryValue = valueForKey(primaryKey) else {return}
    guard let object = try! Realm().dynamicObjectForPrimaryKey(objectSchema.className, key: primaryValue) else {return}
    for property in objectSchema.properties {
      let key   = property.name
      let value = object.valueForKey(key)
      setValue(value, forKey: key)
    }
  }
```

loadLocalData()は、Realmのデータベースから同じプライマリーキーのデータを取得して全てのプロパティに適用させる関数です。

これをマッピングの前に呼ぶことでプロパティの初期値を同一プライマリーキー値の値で上書きさせてObjectMapperが適用されなかったプロパティの値を最新の状態に保つ事ができます。

上記のコードはobjectSchema等のクラス依存の無い形で書かれている為、Objectを継承させたBaseObject等に実装すればどのRealmのObjectからも
super.loadLocalData()で適用させることができます。

super.loadLocalData()はmapping関数の先頭で呼ぶと良いです。（initに書いても階層マッピングの時には呼ばれないことがある）
野良ビルド管理 porg のメモ。

**porg** は野良ビルドのパッケージ管理用ツールです。以前は [paco](http://paco.sourceforge.net/) として開発されていたもので、現在は [porg](http://porg.sourceforge.net/) として開発が継続されています。

野良ビルドをインストールする時、専用コマンドを噛ませることでインストール内容を追跡記録してくれて、アンインストールを半自動化できるようになります。通常の `make install` だけでなく、`gem`, `pip`, `pear` などを含め、ありとあらゆるインストール作業の追跡が可能です。

残念ながら FreeBSD や Mac OS X では機能しないので、Linux 専用です。

# ダウンロード

 * [porg - a source code package organizer](http://porg.sourceforge.net/)

管理者権限で実行します。

```
curl -L http://jaist.dl.sourceforge.net/project/porg/porg-0.10.tar.gz | tar zxf - -C /usr/local/src
```

# インストール

管理者権限で実行します。GUI はいらないので `--disable-grop` パラメータを付けます。

```
./configure --prefix=/usr/local --disable-grop
make && make install
```

# アンインストール

管理者権限で実行します。porg 自身のコマンドで `porg` というパッケージ名で記録された自らを削除します。

```
porg -r porg
```

# パッケージ管理

基本的にすべての作業は管理者権限での操作を想定しています。

## パッケージのインストール

```
porg -lD make install
porg -lp <package_name> make install
```

野良ビルドのインストールコマンド `make install` の頭に `porg` を指定する事で、そのインストール作業を追跡できます。 

- `-lD` インストールを追跡し、カレントディレクトリ名をパッケージ名として記録します。
- `-lp <package_name>` インストールを追跡し、`<package_name>` をパッケージ名として記録します。

例:

```
porg -lD python setup.py install  # カレントディレクトリ名をパッケージ名として記録
porg -lp pep8 easy_install pep8  # pep8 をパッケージ名として記録
```

上記のように `make install` 以外でもトラッキング可能です。

## パッケージ一覧の確認

インストール済みの全パッケージを一覧表示:

```
porg -a
```

## パッケージの確認

パッケージのメタ情報を確認:

```
porg -i <package_name>
```

パッケージの全ファイルを表示:

```
porg -f <package_name>
```

アンインストール時はこれらのファイル群が削除されます。

## パッケージの削除

```
porg -r <package_name>
```

以上です。

この他に `paco2porg` というコマンドもインストールすると付いてくるので、paco からの移行もコマンド一発です。`porg_bash_completion` という Bash 用の入力補完スクリプトも付いてるみたいです。
Railsでenviromentの追加

Railsでstaging環境を追加した時のメモ。

## 1. database.ymlの設定

productionをコピーして、キーをstagingに変更

## 2. secrets.ymlの設定

productionをコピーして、キーをstagingに変更。シークレットキーを環境変数から取得する部分は同じ。


## 3. 自前で追加したモジュールのymlの設定

自分たちの環境では、elasticsearch.yml, redis.ymlを修正。

## 4. staging.rbの作成

config/environments/production.rbをコピーしてstaging.rbを作成。
基本はproduction.rbと同じ構成。action_mailerの設定がここにあるので、staging環境に合わせて変更。

## 6. thin.yml

Railsアプリケーションはthinで起動しているので、thinの設定ファイルを修正。
gulp のTips


今更感はある。

## 依存タスクの記述

第二引数に配列で記述する。

````
gulp.task('mytask', ['array', 'of', 'task', 'names'], function(done) {
  // Do stuff
});
````

同様に第三引数を無くして、タスクのグループ化が可能

````
gulp.task('build', ['array', 'of', 'task', 'names']);
````

依存タスクがタスクの引数`done`をコールすると、メインのタスクが呼ばれない模様？

## パイプ経由で出力ファイル名の変更

````
var rename = require("gulp-rename");
gulp.task('scss', function() {
  return gulp.src('scss/')
    .pipe(scss())
    .pipe(rename('common.min.css'))
    .pipe(gulp.dest('public/css'));
});
````

## 削除する

````
var del = require( 'del' );

gulp.task( 'clean', function() {
  del( config.dest );
} );
````

## 直列に実行する

gulp向けに用意された`run-sequence`というものがあるので利用すると楽

````
var runSequence = require( 'run-sequence' );

gulp.task( 'release', function( done ) {
  return runSequence(
    'clean',
    [ 'js', 'css' ],
    "deploy"
    done
  );
});
````

参考:
http://qiita.com/naoiwata/items/4c82140a5fb5d7bdb3f8


## 別のgulpfileから起動する

`--gulpfile <gulpfile path>`でファイルを指定できる。CWDも自動的にgulpfileに合わせてセットされる。

## コマンドの実行

````
var exec = require('child_process').exec;

exec('echo hoge',function(error, stdout, stderr) {
  // callback
});
````

コールバックは省略可能

## gulp load plugin

`gulp-load-plugins`を利用すると、諸々の`gulp-`系パッケージのrequire記述を簡略化することが出来る。

````
var gulp = require("gulp");
var $ = require("gulp-load-plugins")();

gulp.task('lint', function() {
    return gulp.src('./lib/*.js')
        .pipe($.jshint())
        .pipe($.jshint.reporter());
});
````

`$ = require("gulp-load-plugins")()`と記述する事で`$`のメソドとして`package.json`に記載された諸々のgulp系プラグインが利用可能になる。

package.jsonを毎回見に行ってくれるので、`--save`の漏れなどに事前に気づけて安心だったりする。

gulp系のプラグイン以外ではもちろん使えない。

http://qiita.com/superbrothers/items/a342f3580b8acb5b9b06
AWS KMS を awscli から利用してみる

# KMS

そのまま置いておきたくないデータを暗号化するとして、その暗号化に使う鍵をどうするかという問題がありますが、AWSがそれを持ってくれるというサービスです。

AWSが管理するキー（カスタマーマスターキー）はエクスポートすることが出来ないようになっていて、安全性が確保されています。
よって、暗号化、復号にはAWS KMS経由でやりとりすることが必須となります。この手順をawscliで試してみます。

暗号化する対象はデータサイズ制限があり、またさほど速度も出ないので処理ごとに暗号化/復号したりや大きなデータを対象とする場合には

1. カスタマーマスターキーから、暗号化されたデータキーと平文のデータキーをもらう
2. 平文のデータキーを使って任意の方法で暗号化したら平文のデータキーは即座に廃棄する
3. 復号が必要になったら、暗号化されたデータキーから平文のデータキーを得て復号する。平文のデータキーはなるべく早く破棄する

といった手順になっています。

しかし、今回の目的はアプリケーションで使うパスワードやAPIキーの類を暗号化することなので、`aws kms encrypt`を使って平文をカスタマーマスターキーから直接暗号化していくことにします。

# Requirements

1. awscli
  * `pip install awscli`
2. awsのcredential。awsのインスタンスであればroleを割り当てるかIAMユーザのACCESS_KEYとSECRET_ACCESS_KEYを`aws configure`で設定済みであること

# カスタマーマスターキー

cliからだとポリシーが面倒なのでWebのコンソールから作成しちゃいます。
IAMの「暗号化キー」から「キーの作成」です。
管理アクセスユーザと使用アクセスユーザは適切に割り当てましょう。
割り当てたユーザ側にも、使用するための権限が必要です。

# `aws kms encrypt`
`key-alias`に鍵を作った時のエイリアスを入れます。
暗号化の対象を`--plaintext`で渡せますが、ファイルなどで渡すこともできるので詳しくは`aws kms encrypt help`を参照してください。

```bash:
aws kms encrypt --key-id alias/key-alias --plaintext "apikey" --query CiphertextBlob --output text
```
これで暗号化された文字列を受け取ることが出来ました。

他に`--encryption-context`を指定して暗号化することで対象の整合性を確認することができます。


# `aws kms decrypt`

decryptの際にはkey-idは不要です。暗号化されたものに含まれているからです。

```bash:
 aws kms decrypt --ciphertext-blob fileb://<(echo 'さっき受け取った文字列'|base64 -d) | jq .Plaintext --raw-output |base64 -d
```

これでapikeyという文字列が出てくるはずです。
Apacheのログで日本語の文字化けを直す

直すという表現はあまり正確では無いかも知れないですが、Apacheのログに日本語などのマルチバイトの文字列を表示すると文字化けをしていた見れないということがよくあると思います。

```
[Thu Jan 21 12:35:07 2016] [error] [client xxx.xxx.xxx.xxx] \xe6\x96\x87\xe5\xad\x97\xe5\x8c\x96\xe3\x81\x91\xe5\x8a\xa9\xe3\x81\x91\xe3\x81\xa6
```

tailコマンドでよく確認することが多いですが、その時に以下のようなコマンドで表示をすると文字化けが解消されます。

```
tail -f error.log | perl -nle 's/\?\\([a-f\d]{3})/chr($1)/ieg;s/\\x([a-f\d]{2})/pack("C", hex($1))/ieg;print $_;'
```

実行すると

```
[Thu Jan 21 12:35:07 2016] [error] [client xxx.xxx.xxx.xxx] 文字化け助けて
```

素晴らしい。

参考記事

>http://raharu0425.hatenablog.com/entry/20121126/1353911491
solver > Excelのソルバー > GRG非線形 / LPシンプレックス / 進化的


[support.office.com](https://support.office.com/ja-jp/article/%E3%82%BD%E3%83%AB%E3%83%90%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%95%8F%E9%A1%8C%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%80%81%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B-9ed03c9f-7caf-4d99-bb6d-078f96d1652c#bm4)

> ソルバーで使用される解決メソッド

- Generalized Reduced Gradient (GRG) 非線形    平滑非線形の問題に使用されます。
- LP シンプレックス    線形の問題に使用されます。
- 進化的    非平滑の問題に使用されます。

> これらのメソッドの詳細については、以下の連絡先にお問い合わせください。
>
Frontline Systems, Inc.
P.O. Box 4288
Incline Village, NV 89450-4288
(775) 831-0300
Web サイト : http://www.solver.com
電子メール アドレス : info@solver.com
solver > Link > Numerical Receipes in C 

リンクがあった。
http://www.it.uom.gr/teaching/linearalgebra/NumericalRecipiesInC/

Cambridge University Pressからpermissionが出ているとのこと。

このアルゴリズムはよくないという意見も聞いたが、自分の勉強としてはいいだろう。
PhpStormでファイル名をつけずにファイルを作成するには「New Scratch File」

PhpStormの場合、通常のエディタソフトと違って、新しいファイルを作成するときに必ずファイル名から入力する必要があります。

また、プロジェクトなどを開いていると、必ずプロジェクトフォルダに保存されることになります。ただ、エディタとして一時的にファイルを編集したいだけだったり、Emmetなどをさくっと使いたいだけみたいなケースも多々あります。

そんな時は、「Tools→New Scratch File」機能で作成することができます。ショートカットは Windowsなら「Ctrl+Alt+Shift+Insert」。
PhpStormでの、同じ要素選択（Sublime Textの Ctrl+D（Cmd+D））は、Alt+J

Sublime Textで非常に便利な機能の1つが、ある要素と同じ要素をどんどん選択できる機能。ショートカットでいうと、Ctrl+Dまたは、Cmd+Dです。

PhpStormでは、同じ機能が「Alt+J（Windows）」または「Control + G（OS X）」に割り当たっています。

ちなみに、選びすぎてしまったときは「Shift+Alt+J」で選択を一個解除できます。
IoT縛りの勉強会! IoTLT vol.11に参加した

# 勉強会の基本情報

* 【日　時】2016/01/14(木) 19:00 〜 22:00
* 【会　場】日本マイクロソフト
* 【参加費】無料
* 【主　催】リレーションズ株式会社 土屋敬 と 株式会社LIG 菅原のびすけ
* 【申し込み】http://eventdots.jp/event/577066

# 概要

* 何回にIoTLTに参加したが、今回もいろいろな小さいネタ
* いろいろなアイディアが紹介された
* インスピレーションもある

# 内容

## IoTだらけのスマートハウスを作ってみてわかった課題

### 発表者
* 木村 氏@ リノベる

### 内容
* 課題
 * IoTデバイスとアプリが1対1の場合は、複数のデバイスが入ると便利さが一気に低下
* 対策案1
 * そもそもアプリとか必要ないようにする
 * 音声制御
 * 自動制御
* 対策案2
 * 家のあらゆるものが管理できるアプリを作る
 * 家電制御
 * リモートから状態確認
 * etc

### 私の感想
* 音声制御のインスピレーションが面白い
* 「開けゴマ」と呼ばれると、ドアが自動的に開けることが、素晴らしい


## こんなIoTはいやだ-セキュリティの無いIoT

### 発表者
* Lumin Hacker 氏

### 内容
* 物がインターネットと繋がると、いろいろなセキュリティ問題がある
* example-1
    * ドローン
    * wifiでスマホと繋がるが、パスワードがなし
    * telnetしてみると、root権限をもらってしまう
* example-2
    * OBD2アダプター
    * パスワードが4位のみ
* example-3
    * PBX

### 私の感想
* パスワードなしで、ドローンに繋がることができることに、吃驚した
* root権限が簡単にもらってしまうことも、いやと思う
* ドローンに関する開発作業であれば、気をつけないといけない


## IoTで台所をHackする

### 発表者
* 篠原 氏

### 内容
* 課題
    * 料理とIoT、何かできるそう
    * 料理で困ること：　材料買ってきたけど、調味料がない
* 対策案
    * arduino + johnny-five + nodejs + 重量センサー
    * 醤油が少なくなるときに、twitterで通知する



## esp8266が便利すぎて開発ボードを作ってみた

### 発表者
* @wamisnet氏

### 内容
* esp8266とは？
    * wifiモジュール
    * 500円くらい
    * プログラム可能
    * わりと小さい
    * Arduinoのライブラリが使える
* esp8266でできること
    * milkcocoaと連動して、リモートで操作できる
    * milkcocoaと連動して、温度データを集めてみた
    * webサーバーが建てられる
    * ハードウェア制御できる

### その他
* 調査して、esp8266のgithub
    * https://github.com/esp8266
* ArduinoIDEを使ってIoT開発できる
    * http://qiita.com/azusa9/items/264165005aefaa3e8d7d
* Qiitaに、投稿件数が100以上
    * http://qiita.com/tags/esp8266
RailsでアプリをHerokuにあげる時のエラー各種

RailsでアプリをHerokuにあげるたびに何かしらのエラーに悩まされてはググってるので、今まで出会ってきたHerokuプッシュ時のエラーについて逐次ここに載せていきます。自分用メモ。

`git push heroku master`
は簡単なおまじないだけど、素人にはエラーの宝庫なんです。

Railsアップの準備は[ここ](http://www.workabroad.jp/posts/1164)とかを参考にしてください。

## 注意

以下に書いてある`+`とか`-`は差分のことで、`+`の後ろに続く文字列を追加してくださいね！って事です。そのままコピペはしないように。


## 出会ったエラー達

### `Failed to install gems via Bundler`

本番環境でもSQLite3が設定してあるとこういったエラーが出ます。
`rails new` で普通に作ると初期状態でSQLite3に設定してあるけれど、Herokuは SQLite3 に対応していないので、あげる際は PostgreSQL(pg) に設定してあげる。

```Gemfile:Gemfile
- gem 'sqlite3'

group :development do
+  gem 'sqlite3'
end
group :production do
+  gem 'pg'
end
```

```yaml:config/database.yml
production:
+  adapter: pg
+  database: db/production.pg
-  <<: *default
-  database: db/production.sqlite3
```

こんな感じに本番環境をpgにしてあげれば動くと思います。(自分はこれでokだった)

### `Precompiling assets failed.`

`git push`したときに`rake assets:precompile`が失敗したとのことなのでこれを追加。

```rb:config/application.rb
+ config.assets.initialize_on_precompile = false
```

### `NoMethodError: undefined method `[]' for nil:NilClass`

`rake assets:precomiple`中にこんなエラーが起きて毎度お馴染みの`rake aborted!`って怒られた。調べてみると、[StackOverflow](http://stackoverflow.com/questions/32939496/nomethoderror-undefined-method-for-nilnilclass-when-pushing-to-heroku)さんに答えがあって

`application.css`を`application.css.scss`にリネームすれば解決した。



## WARNING

### `You have not declared a Ruby version in your Gemfile.`

これはGemfileでrubyのバージョンを指定してないと出る忠告。gemfileにrubyのバージョンを追加するだけで消える。

```bash
$ ruby -v
ruby 2.2.3p173
```

バージョンは適宜変えてください。

```gemfile:Gemfile
+ ruby '2.2.3'
```

### `No Procfile detected, using the default web server (webrick)`

エラーに比べると断然読みやすくて優しい。procfileがないよーって言ってるので追加してあげる。

```bash:Procfile
web: bundle exec rails server -p $PORT  # rails 起動($PORTは5000がデフォ)
```

## Internal Server Error

`git push heroku master`して`heroku run rake db:migrate`して`heroku open`してもこいつが出てくる。。

`Internal Server Error(´･ω･`)`

### `Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`

[Rails4.1でherokuへのデプロイに失敗(Missing `secret_key_base`)](http://jangajan.com/blog/2014/10/05/secrets-dot-yml-on-heroku-in-rails4-dot-1/)
このサイトがとても分かり易かった！

.gitignoreにconfig/secrets.ymlがあればコメントアウトする。

```rb:.gitignore
# config/secrets.yml
```

次に環境変数に設定する値を以下のコマンドで出力させる。

```bash
$ bundle exec rake secret RAILS_ENV=production
# => xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

上記のコマンドで出てきた値(xxxxxx)をheroku上の環境変数(SECRET_KEY_BASE)に格納する。

```bash
heroku config:add SECRET_KEY_BASE=xxxxxxx
```
xxxxxには上記で出力された値をそのままコピペしてください。
使用されているPort番号を使っているサービスを確認する


例えば80番ポートを使っているサービスを確認したい場合

```bash
lsof -i -n -P | grep 80
```

入っていなければインストール

```bash
yum install lsof 
```

追記 コメントで教えて貰いました。これが素直なやり方ですね

```bash
lsof -i :443
```
LAN内の他端末からvagrantの仮想マシンにsshする

# Vagrantfile

* public_network を設定するだけでOK

```
config.vm.network :public_network
```

* ブリッジするインターフェースを指定する場合
    * 指定がないと`vagrant up`時に聞かれる

```
config.vm.network :public_network, bridge: "en0: Wi-Fi (AirPort)"
```

* IP指定する場合
    * DHCPなら指定しない（`vagrant up`後に確認する）

```
config.vm.network :public_network, ip: "192.168.0.110", bridge: "en0: Wi-Fi (AirPort)"
```

# ssh

* 別マシンからssh

```
$ ssh vagrant@192.168.0.110
vagrant@192.168.0.110`s password: (パスワードは vagrant )
```
RSpecでアクション名に左右されるhelperのテストを行う


表題の通り、Rspec内でaction名に左右されるメソッドをテストする場合、下記の様にmockオブジェクトでaction_nameの返却値を設定してやることで実施できます。

```ruby:sample_helper.rb
module SampleHelper
  def get
    action_name
  end
end
```
```ruby:sample_helper_spec.rb
require 'spec_helper'

describe SampleHelper do
  describe '#get' do
    context 'アクション=showの場合' do
      before do
        allow(helper).to receive(:action_name).and_return('show')
      end
      it 'show　が返却される' do
        actual = helper.get
        expected = 'show'
        expect(actual).to eq(expected)
      end
    end
  end
end
```
MeCab の出力を学校文法に適合する方法

MeCab の出力を学校文法（橋本文法）に適合する iOSアプリを <a href="https://itunes.apple.com/jp/app/pin-cimasuta/id1071188532?mt=8">AppStore</a>/<a href="https://github.com/tmatsugaki/iPhone-libmecab">GitHub</a> で公開しています。
MeCab の出力結果の学校文法に関連した情報を用いてマージ(※)すれば単語登録などしなくてもそれなりの結果が得られますが、MeCab の結果が望ましくないケースでは個別に適合処理をしています。
※)当然ですが、MeCab の出力の方がアトミックですから...
<img width="375" alt="IMG_3903.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/110193/1d08a850-3d69-931f-2e64-27f8161c8a2c.jpeg">
時折、不毛な事をしているのではないかと不安になります。
ローカル環境のアプリケーションプールをすべてリサイクルする

自分向け備忘録

```bat:recycle_all.bat
@set APPCMD=C:\Windows\System32\inetsrv\appcmd.exe
@FOR /F "usebackq" %%r IN (`%APPCMD% list APPPOOL /text:name`) DO %APPCMD% recycle apppool /apppool.name:%%r
```
Arrayの中のDictionaryの中のValueでのSort

# Swift2.1 での Arrayの中にDictionary([[String:String]])の中のValueでのSort

Swift2.1 で Sort系がかなり便利になっていたのを今更ながら実感したので備忘録的に。(自分用が主w)

    let family : [[String: String]] = [
    ["surname":"Simpson", "given":"Homer", "title": "Mr"],
    ["surname":"Simpson", "given":"Marge", "title": "Mrs"],
    ["surname":"Simpson", "given":"Bart", "title": "Mr"],
    ["surname":"Simpson", "given":"Lisa", "title": "Miss"],
    ["surname":"Simpson", "given":"Maggie", "title": "Miss"],
    ["surname":"Flanders", "given":"Ned", "title": "Mr"]
     ]

    let orderdfamiry = family.sort() {
        $0["given"] < $1["given"]
    }

    print(orderdfamily)
    > [["surname": "Simpson", "title": "Mr", "given": "Bart"],
     ["surname": "Simpson", "title": "Mr", "given": "Homer"],
     ["surname": "Simpson", "title": "Miss", "given": "Lisa"],
     ["surname": "Simpson", "title": "Miss", "given": "Maggie"],
     ["surname": "Simpson", "title": "Mrs", "given": "Marge"],
     ["surname": "Flanders", "title": "Mr", "given": "Ned"]]


こんな感じで。
sort周り混乱というかいろんな書き方あったけど、ようやくまとまってきたのかな?
lambdaのソース管理をflcutからserverlessに切り替えて嬉しかったこと

## **概要**

とあるプロジェクトで、<a href="https://github.com/fluct/fluct" target="_blank">fluct</a>を使ってコード管理していたものを、<a href="https://github.com/serverless/serverless" target="_blank">serverless(旧JAWS)</a>に切り替えた。その際、良いなと思ったことをメモしておく。



## **lambdaのコード管理**

fluctやserverlessは、平たくいうと、Amazon API GatewayとAmazon Lambdaでつくるサーバーレスなアプリケーションの管理を簡単にするものである。詳細はReadmeを見るのが早い。

* <a href="https://github.com/fluct/fluct" target="_blank">fluct</a>
* <a href="https://github.com/serverless/serverless" target="_blank">serverless</a>



## **嬉しかったこと**

### component、module、functionというプロジェクト構成

`actions`ディレクトリしかないfluctに比べて、少し複雑に見えるが、規模が大きくなっても耐えうる構成になっている。

* <a href="http://docs.serverless.com/docs/project-structure" target="_blank">Project Structure</a>

### Stage管理ができる

serverlessだと、development, productionなどのStage管理ができる。開発中はdevelopment stageのAPI GatewayとLambdaのみにデプロイして確認ができ、より実践導入が考慮されているといえる。

* <a href="http://docs.serverless.com/docs/stage-create" target="_blank">Stage Create</a>

#### API Gatewayのステージ

![スクリーンショット 2016-01-21 9.10.06.png](https://qiita-image-store.s3.amazonaws.com/0/22875/e400318d-b099-a0be-e68d-9f63e192e610.png)

#### Lambdaのステージ

![](https://qiita-image-store.s3.amazonaws.com/0/22875/7e0dd7d6-166d-00bc-dd83-fce6d9b2abcd.png)


### ローカル環境での簡易テストが可能

<a href="http://docs.serverless.com/docs/function-run" target="_blank">Function Run</a>を使うと、ローカル環境で関数を走らせることが可能である。`event.json`に実行時のイベントを定義できる。

```bash
± serverless function run path/to/func
Serverless: Running path/to/func...
Serverless: -----------------
Serverless: Success! - This Response Was Returned:
Serverless: {"status":200,"message":"OK"}
```

### 様々なプラグインがある

serverlessは<a href="http://docs.serverless.com/docs/installing-plugins" target="_blank">Plugins</a>を用意に導入できる。便利なものとしては、CORS対応用の設定を追加してくれる<a href="https://github.com/joostfarla/serverless-cors-plugin" target="_blank">serverless-cors-plugin</a>、localhostでエンドポイントを立ち上げてくれる<a href="https://github.com/Nopik/serverless-serve" target="_blank">serverless-serve</a>などがある。





## **まとめ**

serverlessを使うと、API Gateway+Lambdaなアーキテクチャをより実践に導入しやすくなると思った。今後も使いドコロを見て試してゆきたい。