OmniAICreator/Qiita-1.07M huggingface dataset:
【UnityEditor】ヒエラルキーで空の親GameObjectを作るエディター拡張

この記事のUnityのバージョンは 5.3.5f1 です

#はじめに
ヒエラルキーでGameObjectの親を作ろうとしたとき、

GameObject作成 　＞　オブジェクトをドラッグ＆ドロップ

という手順を踏まなければならず、若干手間です。

<img height = 300 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/dc8d7c46-20c7-6d14-ee44-0b73f9368a3e.gif">
↑ちょっとめんどくさい

そこで、選択しているGameObjectに対して直接、親を作成してやるエディター拡張を作ってみました。

#ソースコード

``` EditorCreateEmptyParent.cs
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class EditorCreateEmptyParent
{
    static bool called = false;

    [MenuItem("GameObject/Create Empty Parent", false, 0)]
    static void CreateEmptyParent()
    {
        // 重複して呼ばれないようにする
        if (called) { return; }
        called = true;

        foreach (var gameObject in Selection.gameObjects)
        {
            // GameObject作成
            GameObject newGameObject = new GameObject("GameObject");
            int si = gameObject.transform.GetSiblingIndex();
            newGameObject.transform.SetParent(gameObject.transform.parent);
            newGameObject.transform.localPosition = Vector3.zero;
            newGameObject.transform.SetSiblingIndex(si);

            Undo.RegisterFullObjectHierarchyUndo(gameObject, "full object hierarchy change");

            // 階層 変更
            gameObject.transform.SetParent(newGameObject.transform);

            Undo.RegisterCreatedObjectUndo(newGameObject, "Create Empty Parent");

            EditorApplication.delayCall += () =>
            {
                // 折りたたみ解除
                Collapse(newGameObject, true);
                called = false;
            };
        }
    }

    [MenuItem("GameObject/Create Empty Parent", true)]
    static bool ChkCreateEmptyParent()
    {
        return Selection.activeGameObject != null;
    }

    static void Collapse(GameObject go, bool collapse)
    {
        // bail out immediately if the go doesn't have children
        if (go.transform.childCount == 0) return;
        // get a reference to the hierarchy window
        var hierarchy = GetFocusedWindow("Hierarchy");
        // select our go
        SelectObject(go);
        // create a new key event (RightArrow for collapsing, LeftArrow for folding)
        var key = new Event { keyCode = collapse ? KeyCode.RightArrow : KeyCode.LeftArrow, type = EventType.keyDown };
        // finally, send the window the event
        hierarchy.SendEvent(key);
    }

    static void SelectObject(Object obj)
    {
        Selection.activeObject = obj;
    }

    static EditorWindow GetFocusedWindow(string window)
    {
        FocusOnWindow(window);
        return EditorWindow.focusedWindow;
    }

    static void FocusOnWindow(string window)
    {
        EditorApplication.ExecuteMenuItem("Window/" + window);
    }
}
#endif // UNITY_EDITOR
```

#結果
![uni.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/54d40cb9-d215-98fa-2dc8-5c6a3f4f0003.gif)

便利かも？

#参考
Fold/unfold gameobject from code - Unity Answers
http://answers.unity3d.com/questions/656869/foldunfold-gameobject-from-code.html
【PHP】Composer入門

#composerのインストール

①curlで取得

```
curl -sS https://getcomposer.org/installer | php
```

②PATHが通っているところへ移動
拡張子消してシンプルにする。
PATHが通っていればどこでもいいが、CentOSの場合は、/usr/local/binがいいかと。

```
mv composer.phar /usr/local/bin/composer
```

パスが通っているか念のため確認

```
which composer
```

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

①composer.jsonを作成する

```json:composer.json
{
    "require": {
        "monolog/monolog": ">=1.0.0"
    }
}
```

もしくは、

```
php composer require "monolog/monolog"
```

②実行

```
php composer install
```
PHPのカンマ演算子で無限ループした

独習PHPしてて無限ループった話。(メモ)

```
for ($i = 1, $j = 1; $result = $i * $j, $i < 6; $i++, $j++) {
    …
}
```

って書くと予定通り動くけど

```
for ($i = 1, $j = 1; $i < 6, $result = $i * $j; $i++, $j++) {
    …
}
```

ってやると無限ループになる。
複数やるときは最後に持ってきた式が条件になるっぽい。
brewでSparkをインストールする

ちょっと試したい時にローカル環境にSpark入れたのでメモ。

```bash
# brew でインストール
brew update
brew install apache-spark

# パスを通す
export SPARK_HOME="/usr/local/Cellar/apache-spark/1.6.2/libexec/"
export PYSPARK_SUBMIT_ARGS="--master local[2]"
```

これだけ。
次回も使うんだったら.bashrcに書いておく。

```
echo 'export SPARK_HOME="/usr/local/Cellar/apache-spark/1.6.2/libexec/"' >> ~/.bashrc
echo 'export PYSPARK_SUBMIT_ARGS="--master local[2]"' >> ~/.bashrc
```

たぶんbrewのSparkのバージョン変わったらパスを通す場所が変わるので、brew infoで確認するとよいらしい。

```
:~ $ brew info apache-spark
apache-spark: stable 1.6.2, HEAD
Engine for large-scale data processing
https://spark.apache.org/
/usr/local/Cellar/apache-spark/1.6.2 (842 files, 300.2M) *
  Built from source on 2016-07-20 at 15:21:29
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/apache-spark.rb
```

少し重いけど、ちょっと試したいだけなら十分だった。
MLlibもちゃんと動いたし。

#参考URL
https://gist.github.com/ololobus/4c221a0891775eaa86b0
rubotyのgemを作るための小ネタ ( local でGEMを作るときにも！ )

## TL;DR
rubotyのgem作成にあたって、覚えておいた方がいいのは下記2点

- RubotyGeneratorでひな形
- 呼び出し元のRubotyでは、bundle configでgemのpath書き換えると捗る


## RubotyGeneratorを使う

ほとんど、作者の方の[ブログ](http://tbpgr.hatenablog.com/entry/2015/12/28/000559)に書かれていますが、
この記事だけで完結するように、簡単にしたものをこちらに記述させて頂きます。

### gem installと設定

```bash
gem install ruboty-generator
ruboty-generator init
vim RubotyGenerator
```

### RubotyGeneratorの中身

```
user_name @github_user_name

gem_class_name "Sample" # rubotyのtask classの名前
gem_name "sample" # gemの名前がruboty-#{gem_name} となる

# rubotyにて利用する環境変数を指定する
env do |e|
  e.name "ENV1"
  e.description "ENV1 desc"
end

# rubotyのコマンドを指定する
command do |c|
  c.name "name"
  c.pattern "pattern\\z"
  c.description "description"
end
```

### gemの雛形作成

```bash
% ruboty-generator generate -a
% tree                                                                       
.
├── CODE_OF_CONDUCT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── lib
│   └── ruboty
│       ├── handlers
│       │   └── sample.rb
│       ├── sample
│       │   ├── actions
│       │   │   └── name.rb
│       │   └── version.rb
│       └── sample.rb
├── ruboty-sample.gemspec
└── spec
    ├── ruboty
    │   └── sample_spec.rb
    └── spec_helper.rb
```

```ruby:lib/ruboty/handlers/sample.rb
module Ruboty
  module Handlers
    class Sample < Base
      on /pattern\z/, name: 'name', description: 'description'
      env :ENV1, "ENV1 desc"

      def name(message)
        Ruboty::Sample::Actions::Name.new(message).call
      end

    end
  end
end

```

## Gemの開発
### ベースとなるrubotyの設定をしておく
[ここ](http://qiita.com/selmertsx/items/6c928c7fc06ff75f227e)を参照.

### ベースとなるRubotyのGemfile設定
方法は2つあるので、お好きな方をお試し下さい。
参考URL: http://bundler.io/git.html#local

#### 1.Gemfileの設定を書き換える
一番簡単ではあるものの、呼び出し元を修正する必要があった場合に、
Commitのたびに元に戻すなど面倒。

```
gem 'ruboty-capistrano', path: '/Users/project/ruboty-capistrano'
```



#### 2. bundler configでgemのpathを上書きする
呼び出し元を一緒に更新するなら一番おすすめ。
修正完了後、元に戻すことを忘れずに。

- pathの上書き方法

```
% bundle config local.ruboty-capistrano /Users/shuhei_morioka/project/morioka/ruboty-capistrano
% bundle show ruboty-capistrano                                              
/Users/shuhei_morioka/project/morioka/ruboty-capistrano
bundle config disable_local_branch_check true #localでの変更をチェックする
```

- 上書きした path を削除する方法

```
% bundle config --delete local.ruboty-capistrano
% bundle show ruboty-capistrano                                              
/Users/shuhei_morioka/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/bundler/gems/ruboty-capistrano-2b4b08d944a7
```

あとは handler なり action なりにコードを記述すればOK!

## 最後に

この方法で作成した rubotyのgemがこちらになります！

ruboty利用者の認可認証を行う
https://github.com/selmertsx/ruboty-authorization

rubotyを使った deploy ができる
https://github.com/selmertsx/ruboty-capistrano
Unity5.2.4からUnity5.3.5に移行した際にAssetBundleの画像が表示されない

## Memory Profilerを使いたい！！
* Memory Profilerとは
 * http://tsubakit1.hateblo.jp/entry/2016/03/22/000113  
* 5.2.4では使えないのか？
 * 方法が無いか調べてみましたが無さそう
    * NUnitは解決出来る
    * Unity5.3系で追加されたMemory関連のクラスが使えない
 
## Unity5.3.5に引っ越そう
### つまづいた点
* AssetBundle周りが変わっていた
 * www.assetBundle.mainAssetを使用していた
 * ↑挙動が不安定？な為にwww.assetBunle.LoadAllAssets<UnityEngine.Object> ()を使う
バインディングコントロールまとめ

## はじめに

LiveBindingでは、多くのバインディングコントロールが用意されている。が、マニュアルを読んでもイマイチ使い道が分かりいくい（気がする）。
なので、個人的所見や感想を添えて、ちょっとまとめてみた。

## クイック バインディング

* TLinkGridToDataSource 
    * TGrid(FMX)、TStringGrid(FMX, VCL)専用
    * グリッドとデータソースのバインドにはこれ使っておけば問題ない
    * データソースのItemIndexの通知も行ってくれる
* TLinkListControlToField
    * TListBox(FMX, VCL)専用
    * リストボックスとデータソースのバインドにはこれ使っておけば問題ない
    * データソースのItemIndexの通知も行ってくれる
* TLinkControlToField 
    * Control -> Sourceの単一方向バンド
    * 入力チェックだなんだを考え出すと、この方向のバインディングが邪魔になるので使うことは稀
* TLinkControlToProperty
    * TLinkControlToFieldと同機能
    * 同様に不要
* TLinkPropertyToField
    * Source -> Controlの単一方向バインド
    * ひとつのコントロールにひとつ用意する
    * LiveBindingで接続を行った場合に自動的に選択される
    * トイプログラムなら問題なく使える
        * 10個を越えたあたりで性能の劣化が感じられる（気がする）
        * 画面に大量のコントロール配置するときは使わない方が無難
* TLinkFillControlToField
    * LiveBindingデザイナでリストボックスとの接続を行った際に自動的に選択される
    * ゴミ
    * TLinkGridToDataSourceやTLinkListControlToFieldで代用可
* TLinkFillControlToProperty 
    * LiveBindingデザイナでグリッドコントロールとの接続を行った際に自動的に選択される
    * ゴミ
    * TLinkGridToDataSourceやTLinkListControlToFieldで代用可

## バインディング式

* TBindExpression 
    * 双方向バインディグ可能
    * ゴミ
    * 双方向のバインドはコードを複雑化するだけのデメリットしかないので不要
* TBindExprItems     
    * 双方向バインディグ可能
    * ゴミ
    * 双方向のバインドはコードを複雑化するだけのデメリットしかないので不要

## リンク 
* TBindLink 
    * Source -> Controlの単一方向バンド
    * TBindGridLinkで代用可能
* TBindListLink 
    * Source -> Controlの単一方向バンド
    * TBindGridLinkがリストボックスにも使えるのでゴミ
* TBindGridLink 
    * Source -> Controlの単一方向バンド
    * マニュアルには「グリッド コントロールが～」と書かれているが、リストボックスでも使用可
    * コントロールとデータソースの接続が確立した最初の一回だけ式をパースする
        * 効率的
        * バインド式がカレント要素を指しているため、コレクションの再表示がうっかり走ると表示がおかしくなるかも
            * カスタムのエディットオブジェクトを使用したときの現象なので、標準コンポーネントでは発生しない（と祈りたい）
* TBindPosition 
    * グリッドやリストボックスの選択行と同期するために使用される
    * TBindLinkと併せて使われる
        * TBindListLinkが内包しているので、使い道なし
* TBindControlValue
    * 使い道不明
    * 素直にTLinkGridToDataSourceやTLinkListControlToField使っとけ
    
## リスト

* TBindList
    * 産廃
    * 粗大ゴミ
    * リストボックスの行数回、式をパースする
        * 遅すぎて使い物にならない
* TBindGridList    
    * 産廃
    * 粗大ゴミ
    * グリッドの要素数回、式をパースする
        * 遅すぎて使い物にならない

## おまけ

* TCustomBindGridListLink
    * TLinkGridToDataSourceやTLinkListControlToFieldの実装の詳細として使用されている
    * コレクションバインディング、ポジションバインディングの両機能を備える
    * TBindGridLinkの上位版
        * TBindGridLinkの懸念点も解消されてた気がする
    * ただしビジュアルコンポーネントが用意されていない
        * LiveBindingデザイナを使用しないのであれば最強（と思ってる）

# まとめ

* TLinkGridToDataSource、TLinkListControlToField、TLinkPropertyToFieldを使っておけば、とりま困らない。
* カスタムのエディットオブジェクト作るなら、TBindGridLinkが便利
* LiveBindingデザイナを使用しないなら、TCustomBindGridListLinkが最強
* あとはゴミ、産廃

## 追記

カスタムのエディットオブジェクト作るなら、TBindGridLinkが便利と書いたが・・・、こいつにはいけてない点がひとつある。

TBindListLink, TBindList、TBindGridListについては、

* TBindListLink, TBindListであれば、Editorプロパティ
* TBindGridListであれば、ListItemStyleプロパティ

で、カスタムのエディットオブジェクトと関連付けが行える。
がしかし、TBindGridLinkは関連付けのためのプロパティは用意されていない。
そのためLiveBindingデザイナでうまくやることができず、コードでなんやかんややりくりする羽目となる（結構メンドイ）。

なんやかんややりくりするくらいなら、はじめからTCustomBindGridListLink使った方がはるかにマシです。
Linux | grep で上下周辺のテキストも表示するオプション ( $ grep -C [行数] )

こういうテキストファイルがある場合。

```stones.txt
Jumpin
Jack
Flash
Its a
gas gas gas!
```

`-C` オプションで、上下もあわせて表示できる。

```bash
$ grep -C 1 Flash stones.txt

Jack
Flash
Its a
```

# 下だけ

`-A` で下だけあわせて表示する。
 
```bash
$ grep -A 1 Flash stones.txt

Flash
Its a
```

# 上だけ

`-B` で下だけあわせて表示する。

```bash
$ grep -B 1 Flash stones.tt

Jack
Flash
```








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JWTの概要とRubyにおける使い方のメモ


ユーザー認証周りのAPIを作っていたのですが、その中でJWTの仕組みを使いました。使い方はシンプルで分かりやすく比較的簡単にセキュリティ向上を見込めると感じたのですが、日本語の資料がまだ少なく敷居が高い印象でした。使ってみたら予想以上に便利だったのでメモを共有します。
間違いなどありましたら指摘お願いします。

## JWT概要
- JWTは「Json Web Token」の略
- JWTはjsonをトークン化する仕組み
- 改ざん出来ないjsonと思ってもらえればOK

### Signed JWT
- JWTがサポートしている署名アルゴリズム
  - HMAC : 共通鍵方式
  - RSA : 公開鍵方式
  - ECDSA : 楕円曲線暗号（あまり使われ得ていない）

### 運用
- 秘密鍵と公開鍵を作っておく
- 送りたいデータを秘密鍵でエンコードし、レスポンスとして返す
- 帰ってきたJWTをセッションに保存
- 受信側は公開鍵を使ってトークンをデコードし、必要なデータを取り出す
- 必要ならばトークンに有効期間を設けておく


### JWTの構造
JWTは３つのパートから成り、全てbase64urlエンコードされている。
この３つのパートをドット(.)で繋げたものがJWTである

#### 各パートについて

Header : このパラメータがJWTであることや、署名アルゴリズムを示す

```Header
{"typ":"JWT", "alg":"HS256"}

エンコード後
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
```

Claim Set : 内容

```Claim
{"iss":"joe",
 "exp":1300819380,
 "http://example.com/is_root":true}

エンコード後
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
```

Signature : 上記のHeaderとClaimを繋げてRSA等で署名したもの

```Signature
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
```

JWTは上記のHeader、Claim Set、Signatureをドット(.)で繋げると出来上がる

```JWT
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
```

## 実際にRubyで使ってみる
- ドキュメントが分かりやすくシンプルであるため、'jwt'というそのままのGemを使用した

```Gemfile
gem 'jwt'
```

```
$ bunde install
```

# 使い方
- RSAの場合

```Ruby
require 'jwt'

# 秘密鍵生成
rsa_private = OpenSSL::PKey::RSA.generate(2048)

# 公開鍵生成
rsa_public = rsa_private.public_key

# sample data
payload = {
  id: 1,
  name: 'tanaka',
  password: 'jau0328ura0jrdsf3'
}

# payload を暗号化 (秘密鍵でしかできない)
token = JWT.encode(payload, rsa_private, 'RS256')

# payload を復号化 (公開鍵でもできる)
JWT.decode(token, rsa_public, true, { algorithm: 'RS256' })

# 秘密鍵で復号化
JWT.decode(token, rsa_private, true, { algorithm: 'RS256' })
```


## 参考URL

- JWT解説 : http://oauth.jp/blog/2012/10/26/json-web-token-jwt/
- JWT draft 日本語版 : http://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html
Ruby on Rails で bundle exec を省略できるようにしてみた


## 何故やるのか

* 毎回打つのメンドいじゃん？

## 概要

* プロジェクトのルートディレクトリに居る時は、プロジェクトの gem を使う
* そうじゃないときは、 `~/.rbenv/shims` の下を使う
* `rails` コマンドのみ例外
    * Rails 4 からか Rails 5 からかは分からんが、 `bundle install --binstubs` で `rails` コマンドを上書きすると怒られるようになったらしい

## 詳細

```.zshrc
# この辺は元々ある $PATH の設定ね
export PATH=/bin:/usr/bin:/usr/local/bin
export PATH=$PATH:/hoge/fuga/piyo

# この下がポイント
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

export PATH=.git/safe/../../bin:.git/safe/../../vendor/bundle/bin:$PATH
```

```bash:事前準備
cd /path/to/project
mkdir -p .git/safe
```

```bash:本題
bundle install --binstubs vendor/bundle/bin
```

* ポイントは `$PATH` の解決順
    * 先勝ちなので、優先したい順に書く
    * `rbenv init -` によって `$PATH` が上書きされるので、その後に書く
* あとは、ダミーディレクトリの作成
    * 別に `.git/safe` じゃなくても良いけど、 [コチラの記事](http://akataworks.hatenadiary.jp/entry/2015/12/25/170527) に倣った
    * このディレクトリがあるプロジェクトの場合、 `./bin/` と `./vendor/bundle/bin/` にパスが通ることになる
* こうしてあげると、 `rails` コマンドは `./bin/rails` を、 gem のコマンドは `./vendor/bundle/bin/***` を参照するようになり、 `rails` コマンドに怒られることもない
    * `rails` コマンドは `bin/` にも `vendor/bundle/bin/` にも存在することになるが、まぁよかろ。
UIScrollViewのAutoLayout設定してみた


# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 7.3.1

# Language
Swift

#  Process
Step 1: Add **Scroll View** and **View** from the object library
![スクリーンショット 2016-07-20 13.56.24（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/22fa7b20-ec5d-c8f6-5305-4f824120eae5.png)

Step 2: Tap to select **Scroll View** and then tap **Pin** where Auto-Layout setting appears. After that, set Auto layout like following figure. 
※Please make sure that remove check mark on **"Constrain to margins"** and border surrounding the white box turns to be red colour. Then, press **"Add 4 Constraints"** to confirm your setting.
![スクリーンショット 2016-07-20 14.04.59（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/2c048d62-ccb8-450d-aa35-d835eb1963ff.png)

Step 3: Exactly do the same setting as Step 2 to **View** under **Scroll View**. Tap to select **View** under **Scroll View** and then tap **Pin** where Auto-Layout setting appears. After that, set Auto layout like following figure. 
※Please make sure that remove check mark on **"Constrain to margins"** and border surrounding the white box turns to be red colour. Then, press **"Add 4 Constraints"** to confirm your setting.
![スクリーンショット 2016-07-20 14.17.37（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/599c77f3-3355-b1de-bd3f-2c25f95b63fc.png)

Step 4: Select **View** under **Scroll View** and press control key and drag to "View". After that, select **Equal Widths** and **Equal Height** like following gif image.
![1gif.gif](https://qiita-image-store.s3.amazonaws.com/0/129117/8a43f1cf-027f-5e0b-41b8-7b676edfcb30.gif)

Step 5: Change the priority of Height from Step 4. Change it from 1000 to 250 like following gif image.
**※If your Scroll View size is not the same as View, warning still appears and you have to go Step 6 to fix. If the size is same, warning will disappear and finally finish setting Auto-Layout of Scroll View. Congrats!**
![スクリーンショット 2016-07-21 10.16.33（2）.png](https://qiita-image-store.s3.amazonaws.com/0/129117/56992009-e538-695c-1a3d-578dad1805f2.png)

(Optional)Step 6: If the size of **Scroll View** is not the same as **View** Size, warning will appear. Tap yellow warning icon to fix constraint like following gif image. Then, done with Auto-Layout of Scroll View.
![3gif.gif](https://qiita-image-store.s3.amazonaws.com/0/129117/92576de0-1fe8-6070-bc20-35784a77e050.gif)

やったー！！！！！！
VScodeでデバッグ ターゲット (spawn node ENOENT) を起動できません。って出て困った時にやったこと

MacOS の VScode 1.3以上からデバッグが出来なくなったって人が日本にも海外にもちらほらいるのですが、いまいちみんなの解決方法がよく分からない・・・というか試してもダメだった

その後、試行錯誤してなんとかデバック出来る様になったので、やり方を書いておきます。

```
> cd /usr/local/bin
> ln -s /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code code
```

これで、codeというコマンドでVScodeが起動出来るようになります。
> VScode上のコマンドパレットで[install code command in PATH]でも同じ結果になります

これをやった後に、コマンドでVScodeを立ち上げたときだけ、デバッグできるようになりました。

```
> code PROJECTPATH
```

まだ良い方法があるかもしれないけど・・・とりあえずこれで凌ぎます。
Rでベクトルに独自のソート順を与えたい時

普通にソートしたら意図した順にならない時は

```r
> sort(c("first", "3rd", "_second"))
[1] "_second" "3rd"     "first"  
```

`ordered = TRUE`オプションを指定して順序つきの因子にするとできる

```r
> vec <- factor(c("first", "3rd", "_second"), levels = c("first", "_second", "3rd"), ordered = TRUE)
> vec
[1] first   3rd     _second
Levels: first < _second < 3rd
> sort(vec)
[1] first   _second 3rd    
Levels: first < _second < 3rd
```

Enjoy!

参考: [因子Tips大全 - RjpWiki](http://www.okadajp.org/RWiki/?%E5%9B%A0%E5%AD%90Tips%E5%A4%A7%E5%85%A8)
ofxTrueTypeFontUC で、stringWidth (stringHeight) で取得したサイズでテキストに図形を重ねるとずれる問題

```
ofxTrueTypeFontUC font;
font.loadFont("Hoge.ttf", 28);

string text = "Eklyi";
int w = font.stringWidth(text);
int h = font.stringHeight(text);

ofSetColor(255,255,255);
font.drawString(text, 0, h);
// 👆ここで positionY に hを入れているのは、
// テキスト一行の場合、テキストの左下が指定したpositionになるので、
// このようにしないと 0, 0に描画されない
ofDrawRectangle(0,0,w,h);
```

こんなコードを書いても、フォントによっては、テキストが四角形からはみ出ることがある。
テキストの頭にある"Y"の左端だったり、お尻の"i"のぽっちだったりがはみ出る。

なぜか。テキストのオフセットが考慮されてないから。

```
font.getStringBoundingBox(text, 0, 0).getLeft();
```

ofxTrueTypeFontUC クラスのメンバ関数で取得したバウンディングボックスのleft positionは、0ではない。
-や+の値になっていることがある。テキストの頭の文字によって、この値が変わり、これの影響で四角がずれる。

---

あとで整理します。とりあえずメモ。
忙しい人の為のDependency Injection(依存性注入)の概念

# はじめに
- 依存性の注入って稀に良く聞くけど何それよく分からん怖いって人(私)向けに書きました。
- DIライブラリの使い方からDIを学ぼうとすると困難だったので、まずはDIとは？についてまとめています。
- DIを行う組み立て役の係```Assembler```が居ること、依存性という単語ではなく```依存オブジェクト```と念頭に置いとくと理解しやすいです。

# Dependency Injection(依存オブジェクト注入)とは
- DIとは、Controllerが使用したい依存オブジェクトを第三者オブジェクトが生成/代入する概念のこと。
- 依存オブジェクトを生成/代入をする第三者オブジェクト```Assembler```を導入する必要がある。
- 前提としてClassの公開済みの振る舞いとしてProtocol/Interface相当で定義する必要がある。
    - Protocol/Interfaceを使用しないスタイルでコーディングしているならば、DIの恩恵は受けられないのでDDDなど設計手法を先に学んだほうが良い。

# 依存オブジェクトとは
```:Swift
class Controller {
  let property: Object = ObjectImpl()    
}
```
の ```ObjectImpl()```

ControllerとしてはObjectを扱いたいが、ObjectImplを使用したいわけではないので、ObjectImplには本質的に関心がない。

  = Objectのみ知っていれば良い

しかし、実際にはObjectImplを元にObjectを生成しているため、ObjectImplに依存してしまっている。

# 依存の問題
- 依存オブジェクトの汚染範囲
    - ObjectImplをObjectImpl2に差し替えたい(例：ToyotaCar→SubaruCarにしたい等)
        - 依存しているControllerの修正も必要
        - ObjectImplを使用しているController数に比例してしまう。

# 解決策
第三者となる```Assembler```がオブジェクト生成し、Constructor/Setterなどで渡せば良い。
それをDependency Injectionと呼ぶ。
具体的な実装方法は色々あるが、代表的なのはConstructor Dependency Injection
※他にSetter Dependency Injection、Interface Dependency Injectionがあるが、推奨はConstructor Dependency Injectionとされている。

## Constructor Dependency Injection
```
class Controller {
  let property: Object

  init(property: Object) {
    self.property = property
  }
}
```
ObjectImplへの依存が無くなり、ObjectImplの修正/ObjectImpl2などへの差し替えが可能に。
しかし、まだ問題がある。

``` :プロパティ数が増えるとコンストラクタが汚くなってしまう
class Controller {
  let property: Object

  init(property: Object, property2: Object, property3: Object) {
    self.property = property
    self.property2 = property2
    self.property3 = property3
  }
}
```

## ライブラリの利用
- 上記のようにライブラリを使用しない場合、手間/コードの見た目上悪化してくるので、ライブラリの導入をすると良い。
- Androidだと[Dagger](http://google.github.io/dagger/)が鉄板
- iOSだと[Swinject](https://github.com/Swinject/Swinject)を周りで使ってるそうな

## 参考
- [Inversion of Control Containers and the Dependency Injection patternの日本語訳](http://kakutani.com/trans/fowler/injection.html)
- 注)こちらの参考記事でも依存性注入ではなく、依存オブジェクト注入と訳されています。
elasticsearch5.0.0 alpha4 kibana5.0.0 alpha4 インストール

qiita初投稿
aws amazon linuxにインストールした。
(インストールして閲覧するだけです。設定の変更と使用方法はまた書きます。)
alpha版なので本番には推奨していない感じです。alpha4今年の6月30日リリース。
公式サイトの[elastic alpha4リリース情報](https://www.elastic.co/jp/blog/elastic-stack-release-5-0-0-alpha-4)



#インストール

#１．ec2のポートセキュリティ
elastic searchでの必要なポートを開けます。

```text:例
SSH	TCP	22	0.0.0.0/0

カスタムTCP	5601	0.0.0.0/0

カスタムTCP	9300	172.31.0.0/16

カスタムTCP	9200	172.31.0.0/16
```

5601はkibanaにアクセスする際の許可するIP：kibanaへのアクセス
9300はインスタンスが所属するサブネットIP：クラスター構成に必要（？）
9200は外部のコミュニケーションに必要なIP：クラスター構成に必要（？）

#2.インスタンスの時間合わせ
sudo su
vi /etc/sysconfig/clock

```text:/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
```
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
reboot
再起動しますので再度sshで接続

#3.インストール
##3-1.elasticsearch をインストールします。
これから先はルートのホームディレクトリで作業します。
sudo su
cd

`rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch`
elasticsearch インストール
`rpm -i https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/5.0.0-alpha4/elasticsearch-5.0.0-alpha4.rpm`
chkconfig elasticsearch on

そのまま、起動するとjavaのバージョン8にあげろ言われますので事前にあげます。
yum install -y java-1.8.0-openjdk

javaのデフォルトが７のままなので変更します。
alternatives --config java　デフォルトがjava8になるように選択。

java -version　でversionが８になっていたらいい。

/etc/init.d/elasticsearch start

##3-2.kibana をインストールします。
▼追記(2016/08/04)-------------------▼
もう一つのインストール方法があったので追記します。追記内の下の2行で終わります。

```
rpm -ivf  https://download.elastic.co/kibana/kibana/kibana-5.0.0-alpha4-x86_64.rpm
/etc/init.d/kibana start
```

▲-----------------------------------▲
（rootのホームディレクトリにkibanaを入れます。）

インストールします
`wget https://download.elastic.co/kibana/kibana/kibana-5.0.0-alpha4-linux-x64.tar.gz`

展開します
tar xfvz kibana-5.0.0-alpha4-linux-x64.tar.gz

名前変更します
mv kibana-5.0.0-alpha4-linux-x64 kibana　

圧縮したものは削除します
rm -f kibana-5.0.0-alpha4-linux-x64.tar.gz

kibanaへのアクセスログをとるためのファイルを作成。
touch /root/kibana/kibana_log

kibanaを起動するためのシェルスクリプトを作成し実行できるようにします。
touch start-kibana.sh
chmod u+x start-kibana.sh
vi start-kibana.sh

```text:start-kibana.sh
#!/bin/bash

#バックグラウンドで実行。ログはkibana_logへ
nohup /root/kibana/bin/kibana > /root/kibana/kibana_log 2>&1 &
```

kibana起動
./start-kibana.sh


#4.kibanaへアクセス
ブラウザを開いて。URLに`http://[インスタンスのグローバルIP]:5601`でアクセス。
グローバルIPがインスタンスについていない場合はsshポートフォワードを使用
ポートフォワードやり方：http://qiita.com/mint_cherry02/items/6b9b4819324b03fa4d87

kibanaへアクセスができます。

---
次は設定をいじってfluentdでelbのログやapacheのログを収集したいと思います。

kibanaの止め方
ps aux | grep kibana
で該当のPIDをkillコマンドで終了させる
kill [PID]

いろいろ教えていただくとうれしいです。
10分でrubotyを動かす方法

## 前提
この導入方法は、rubotyの設置先がec2。
adapterがslackという前提で記述しています。

## 必要な事前設定
- ruby
- bundler
- direnv
- libstdc++

```
# libstdc++のinstall方法
sudo yum install gcc-c++
```

## botの作成
### botの初期設定
```bash
% mkdir ruboty_sample                                                         
% cd ruboty_sample
% touch .envrc
% touch Gemfile
# Gemfileを書き換える
% bundle install
```

```Gemfile
source 'https://rubygems.org'

gem 'ruboty'
gem 'ruboty-slack_rtm'
```

### Slack Adapterの設定
rubotyのslack adapterは下記２点のものが代表的なものです。

- [ruboty-slack](https://github.com/r7kamura/ruboty-slack)
- [ruboty-slack_rtm](https://github.com/rosylilly/ruboty-slack_rtm)

ruboty-slackは slack teemのadmin権限が必要で
色々と面倒だったので、今回は ruboty-slack_rtmを利用しました。
slack integrationでhubotを用意し、そのAPI tokenを環境変数として指定して上げれば
それで完了です。

注意:
ruboty-slackも、ruboty-slack_rtmも、
接続が切れた場合、再接続がされません。
https://github.com/rosylilly/ruboty-slack_rtm/pull/23/files

実運用する場合は、下記記事を読みながら再起動させる仕組みが必要となります。
http://blog.aqutras.com/entry/2016/06/08/210000

## botの実行

### 起動してみる

```bash
% direnv allow
% bundle exec ruboty &
```

### 動かしてみる
![スクリーンショット 2016-07-20 午後2.10.59.png](https://speee.qiita.com/files/8e90b084-3f61-d6d7-1bbe-fceb925550b4.png "スクリーンショット 2016-07-20 午後2.10.59.png")
[Swift] Could not insert new outlet connection が出た時のよさげな解決策


# 悪夢の "Could not insert new outlet connection"

ストーリーボードなどで View を配置して、コード側と関連付けようとするとたまに遭遇するこのエラーメッセージ、ググッてみても完璧な解決策が見つかりません。

![スクリーンショット 2016-07-20 13.41.42.png](https://qiita-image-store.s3.amazonaws.com/0/27210/de0658e0-0a3c-9158-f47b-6a9eb66fdb42.png "スクリーンショット 2016-07-20 13.41.42.png")

だいたい

- Derived Data を削除
- Xcode を再起動
- プロジェクトをクリーン

するとうまくいくようになる、という書き込みを見かけます。ですが試してみてもうまくいったりいかなかったり。

# 手動で接続先となる変数(Outlet)を書いて、その変数と繋げるとうまくいくっぽい

そこで思いついてやってみたらうまくいったぽい解決策がこちら。

## 1. 接続先となる変数を先に定義する

まず手動で変数を用意します。

```
    @IBOutlet weak var noticeLabel: UILabel!
```

## 2. View から接続先の変数へドラッグ＆ドロップ

このあと定義したい View からドラッグ＆ドロップで先ほど定義した変数を接続します。

![スクリーンショット 2016-07-20 13.50.15.png](https://qiita-image-store.s3.amazonaws.com/0/27210/53d781df-56ef-770b-55ce-84f279bf6ce8.png "スクリーンショット 2016-07-20 13.50.15.png")

## 以上。

これでも動作しているので "Could not 〜" に遭遇した際は試してみるといいかもしれません。
Vagrantのrsync時に、Host側に無いFileがVM側から削除されるのを回避する方法

## はじめに

Client系の開発環境を構築しようとVagrantを使ったのですが、Vagrantのrsyncでややハマッた時ので、その解決策をチラ裏しておきます。

## やろうとしたこと

Vagrantを使って下記図みたいなWorkflowで開発をしようと思っていました。 

* Host/VMの双方で、gitから最新のcodeを取得
* VM上でのみnmp/bower installで、必要なmoduleをinstall
* Host上で好きな開発Toolでjsを編集
* Vagrantのrsyncの機能で、編集したjs fileをVM側にcopy
* VM上でgulp watchでfile更新を検出し、appがrestart

![vagrant-rsync.jpg](https://qiita-image-store.s3.amazonaws.com/0/67592/b6b80410-7db2-4ca1-aa8a-bb24e55feb50.jpeg)

ところが、VagrantのrsyncをDefault設定のまま使おうとすると、このようには動きませんよ、と言うお話です。


## ハマるポイント

Vagrantのrsync機能は、**Defaultでは** Host側のFolderの内容とVM側のFolder内容を完全に合わせようとします。ここでのポイントは、VM側のFolderには存在するが、Host側のFolderに存在しないFile達は、rsyncの瞬間VM側で削除される、と言う事です。

そのため、VM側でnpm install等を行い、node_moduleをシコシコinstallしても、Host側で同じfileを用意しておかない限り、rsyncを発動した瞬間に(VM側に無いfileは)VM側から削除されます。当然その状態でVM上でappは動きません。


## 原因と回避方法

この振る舞いの原因は、[公式Documentにもありますが](https://www.vagrantup.com/docs/synced-folders/rsync.html)、VagrantのrsyncのDefaultの引数が`["--verbose", "--archive", "--delete", "-z", "--copy-links"].`になっているからです。

[rsyncの引数](http://qiita.com/bezeklik/items/22e791df7187958d76c1)を見ると解りますが、`--delete`があると、転送元に存在しないファイルはsync時に削除されます。

と言う事で、Vagrantfileに以下の様に書くと、

* Host側に無いFileでもVM側から削除されない
* Host側の更新されたFileがVM側にCopyされる

と言う風にマイルドに動いてくれます。`rsync__args`でrsyncの引数を変えているのがポイントです。

```
config.vm.synced_folder "./shared", "/home/vagrant/shared", type: "rsync", rsync__args: ["--verbose", "--archive", "--compress"], rsync__exclude: ["./shared/.git/"]
```

これで、`vagrant ssh`でVM側に入って`gulp watch`しつつ、Host OS側で`vagrant rsync-auto`を実行した状態にしておくと、Host側で好きなIDE/Editorでjs fileを編集し、その変更が自動でVM側にも反映され、gulp watchでlivereloadされる、というworkflowが実現できます。


## その他Vagrantでハマッた箇所

### **共有folder** について

synced_folderで、(rsyncではなく)Host/VM間で共有folderとして設定する場合、3つほど注意点があります。

* 共有したfolder配下で、(VM側には存在するが)Host側には存在しないFile達は、VM起動時に消されます
* HostがWindows, VMがLinuxだと、共有したfolder配下のLinuxのsymbolic linkが動かない事があります
* folder共有はとてもPerformanceが遅いです

自分はSymbolic Linkでハマりました。

rsyncはHost→VMでfileをsyncしますが、VM→Hostでfileをsyncしたい場合には、[rsync-back](https://github.com/smerrill/vagrant-rsync-back)や[rsync-pull](https://github.com/smerrill/vagrant-rsync-back)と言ったpluginもあります。


### **network設定** について

Vagrantのnetwork設定は、[この記事がとても詳しいですが](http://labs.septeni.co.jp/entry/20140707/1404670069)、大きく以下の3つがあります。port forwardingだと、Host側のFirewall, Virus Soft等の設定に影響されるので注意です。

* private network
  * VMはHostからのみAccess可能です
* port forwarding
  * VMは、Host上ではあるPortをListenしているWeb appとしてAccess可能です
  * 外部からVMにAccessするには、外部からHost上のそのPortにAccessをする必要がありますが、Host側のFirewall/Virus Soft等のPort設定を正しく行う必要があります
* public network
  * VMは、Network的にはHostとは別のDeviceに見えます。Host側のFirewall/Virus Softの影響は受けません

自分は最初、port forwardingにしてハマりました。

### Syncが遅い

Syncの対象folderのfile数が多いと、Syncに時間がかかります。特に`node_modules`以下は大量にfileがあるので、ここをSync対象に含めるととたんにSyncに時間がかかります(私の環境だと1分-2分かかります(泣))。そんなときは、`rsync__exclude`にnode_modulesを含めて上げてください、きっと捗るようになります。

```
config.vm.synced_folder "./shared", "/home/vagrant/shared", type: "rsync", rsync__args: ["--verbose", "--archive", "--compress"], rsync__exclude: ["./shared/.git/", "./shared/your-project/node_modules/"]
```
phpenvを使わないで複数のバージョンのPHPを共存させる方法

## 前提

`Linux`環境上での話。方針としては、PHP複数インスタンス環境作成することで実現。
ただし、PHPの各バージョンを__ソースからインストール__していること。


## ①/etc/sysconfig/httpdファイルの編集

- `httpd`ファイルのコピーを作成

```bash
$ cp /etc/sysconfig/httpd  /etc/sysconfig/httpdtest
```

- コピーファイルの変更

```bash
$ vi /etc/sysconfig/httpdtest
```

変更内容はこんな感じ。

```bash
HTTPD=/usr/sbin/httpd.workertest
OPTIONS="-f /etc/httpd/conf/httpdtest.conf"
PIDFILE=/var/run/httpd/httpdtest.pid
```

- 起動ワーカーをコピー

```bash
$ cp /usr/sbin/httpd /usr/sbin/httpd.workertest
```

## ②/etc/httpd/conf/http.confファイルの編集

- `httpd.conf`のコピーを作成

```bash
$ cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpdtest.conf
```

- コピーファイルの変更

```bash
$ vi /etc/httpd/conf/httpdtest.conf
```

変更内容はこんな感じ。（適宜変更してください）

- Listen 8888
- その他VirtuslHostなど80を8888にする
- 既存の設定ファイルを参照しないようにする
  - `cp -R /etc/httpd/conf.d /etc/httpd/conftest.d`
  - `include conftest.d/*.conf`　

※conftest.d 内のSSLモジュールなど一部の設定ファイルをどこかに移動
※設定ファイル内のログのパス名も既存とは異なる場所にリネーム
※conftest.d/php.conf 内のPHP 設定を書き換える

## ③/etc/init.d/httpdファイルの編集

- `init.d/httpd`のコピーを作成

```bash
$ cp /etc/init.d/httpd /etc/init.d/httpdtest
```

- コピーファイルの変更

```bash
$ vi /etc/init.d/httpdtest
```

変更内容はこんな感じ。

```bash
if [ -f /etc/sysconfig/httpdtest ]; then
    . /etc/sysconfig/httpdtest
fi

pidfile=${PIDFILE-/var/run/httpd/httpdtest.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpdtest}
```

## ④apache別インスタンス起動

```bash
$ /etc/init.d/httpdtest start
```

起動後はhttp://localhost:8888 でテストする。
※停止後はプロセスゴミが残っていないか確認

```bash
$ ps aux | grep /usr/sbin/httpd.workertest
```

## 余談
`phpenv`を使ってやろうとしたのだが何故か上手くいかなく、上記のやり方を教わった。いろいろ工夫してみるものだな。ただ、phpenvが上手くいかない原因は知りたいから、それは追って調べる。
IntentServiceをデバッグする

IntentServiceをデバッグしようと思って、ブレークポイントを貼ったけど何も起こらない…

デバッグしたいコードより前に、以下を記述すればいいらしい。

```java
if (android.os.Debug.isDebuggerConnected()) {
    android.os.Debug.waitForDebugger();
}
```

if文の判定を書かないと、デバッグモードにしない限り延々と待ち続けるので注意。（ハマった）

## 参考

[How do you debug an Android IntentService? - Stack Overflow](http://stackoverflow.com/questions/3024994/how-do-you-debug-an-android-intentservice)
[Debug | Android Developers](https://developer.android.com/reference/android/os/Debug.html#waitForDebugger())
Xojoでメニュー「Select All」のバグ対策

## メニュー「Select All」のバグ
XojoでCocoaビルドしたOS X用デスクトップアプリは、メニュー「Select All」にバグがあります。下図のように、文字列に0面以外の文字が混在していると、メニュー「Select All」で全選択されません。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27806/3cfa2909-c8ec-7f04-946d-7dec1d57a896.png)

内部的なテキストエンコーディングはUTF-16なので、0面以外の文字はサロゲートペアとして文字数をカウントする必要があるのですが、それをしていないようです。分かりやすいバグですね。

開発元へは2013年10月にバグ報告がされています。すぐに開発元で確認済みのステータスになったものの、そこからずっと放置されています。持ちくたびれて「こりゃ直らないな :weary: 」と思ったので、その対策方法をここで紹介します。
## バグ対策
メニュー「Select All」を本物のCocoaMenuItemにする方法で抜本的に解決します。

利用するのはオープンソースの「macoslib」https://github.com/macoslib/macoslib

macoslibはかなり膨大なライブラリ群なので、今回の目的のためだけにすべてインポートするのは避けたいところです。そこで、以下の2つのクラスだけを利用することにします。

- CocoaMenuItem
- CocoaMenuItemSelectAll

しかし、この2つをそのままインポートしてもエラーになります。必要なメソッドを追加したりしないといけません。その手順をここで説明するのもキツいので、こちらからダウンロードしてください。

ダウンロード　[SelectAllSample](https://app.box.com/s/zaxs2he82h35kiekc9vfm4nk13zlmvf8)
使い方はとても簡単。
### 使い方
![002.png](https://qiita-image-store.s3.amazonaws.com/0/27806/bc2672aa-7002-67b3-2276-18113565f95c.png)

「forMenu」フォルダをご自分のプロジェクトファイルにコピペしてください。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/27806/e4f64f8a-968f-f622-853a-c2a38d74b6cb.png)

メニューアイテム「EditSelectAll」のSuperをCocoaMenuItemSelectAllに変更します。

たったこれだけ。0面以外の文字が混在していてもバッチリ全選択されますよ。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/27806/ec964ba6-ce25-a568-18d7-1aab0dad5ce9.png)
Rails5でenum定義したカラムの元の値を取得

自分用メモです。
でも、きっと同じことにぶち当たる人はいるはずｗ

例えば・・・・

```ruby
class User < ActiveRecord::Base
  enum role: { admin: 1, manage: 2, other: 3 }

  ...

```
こんな感じで定義されていたとして、

```
user = User.create(role: 1)
```
そのオブジェクトを作り、`role`に割り当てた`1`という値を取りたい場合、
Rails4までは、

```ruby:rails4
user[:role]
=> 1
```

だったのが、Rails5だと・・・、

```ruby:rails5
user[:role]
=> 'admin'
```

な・・・なんだと・・・！？

Rails5でenumの元の値を取得する場合は、

```ruby:rails5
user.role_before_type_cast
=> 1
```

または、

```
user.class.roles[user.role]
```

または、

```
User.roles[user.role]
```

とするらしい。(コメント頂きました！！)
うーーん、面倒だな・・。他のも方法ありそうなんだけどなぁ・・・
情報求む！！
VirtualBoxゲストでAVX2命令を利用可能にする

「放っておくと紛失不可避」という勝手な理由で今回は単なる受け売りです。

#状況
AVX2命令が利用可能なCPUにおいてVirtualBoxのVMをセットアップすると、/proc/cpuinfoにavx2がない。
手元の環境はi7-6700ですが、恐らく実装されているCPU全部でそうでしょう。

##備考
Windowsホストで確認した内容なので、UNIX系ホストでも発生するかは不明。

#対処
基本的にはいずれ公式にデフォルトサポートされると思われる（現に元記事に言及のあるSSE4.1/4.2はデフォルトで有効）が、すぐ使いたければVBoxManageからゲストにフラグを付けると有効になる。

```
VBoxManage setextradata "仮想マシンの名称" VBoxInternal/CPUM/IsaExts/AVX2 1
```

#参照
[How to enable AVX2 extensions on a Ubuntu guest in VirtualBox 5?](http://askubuntu.com/questions/699077/how-to-enable-avx2-extensions-on-a-ubuntu-guest-in-virtualbox-5)

#余談
VirtualBox5.1でNVMeエミュレーションが実装されましたが、まだ使わない方がいいみたいです。
ついにSATA2ドライバから解放される！と狂喜乱舞してたらどうもデータを書いたそばから化けるらしく、……しなくていい徹夜をしてしまいました。
VMホストの新機能にGentooで突撃はやめましょう。不具合の原因探しで夜が明けてしまいますので←
Dockerで開発環境とCIのテスト環境を構築する戦略


### 基本戦略

アプリの動作に必要なapache, mysql, redisなどのパッケージをインストールしたイメージを用意する。
あとはソースだけを用意する場動作できる状態にする。

コンテナでは環境だけ構築してソースは`docker volume`を使ってDocker hostのソースがあるディレクトリをマウントするようにする。apacheやアプリのログもマウントしておくと便利。

同じようにUnit testなどのレポートもDocer hostで利用できるようにマウントしておく。

### 開発
ソースはhost側にマウントしてあるのでIDEなどで編集した内容はコンテナ内のアプリにも反映される。

Unit testのレポートもhost側で見られるようになるので、コンテナを削除した場合も消えることがない。

### CI
同じイメージをCIのテスト用にすることで、同じ環境でテストを実行することができる。こちらもUnit testなどのレポートがDocker host上に残るのでJenkinsのreport publisherなどで結果を表示することができる。
言語はGolangにしようと思ったので環境構築

#概要
意図通りできなくて、ひとまずLiteIDEで妥協しました。

#PF環境
![image](https://qiita-image-store.s3.amazonaws.com/0/131131/e8f4d9ef-a644-223b-bb5c-d6d764912cdc.png)

 - Docker version 1.11.1, build 5604cbe
 - VirtualBox 5.0.22 r108108

#開発環境の選択
http://qiita.com/spiegel-im-spiegel/items/73ebc684b5807277b7e2
気を付けないといけなそうなことが書いてあった(GOPATH関連とか環境を一定にするのがめんどいっぽい)
http://qiita.com/morisuke/items/ce04479c1b26d83f4fe3
こういう記事素敵
https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/01.4.md
色々紹介してあるけどエディタもIDE扱いしてるのでハードル高そう。emacsの比喩がおもしろい。

Dockerを使ったGolang開発環境
http://unknownplace.org/archives/golang-development-enviroment-with-docker.html
おれの何かが輝き叫ぶのでこれにする。

#いきなり寄り道（エディタ整備）
ここは完全に余談です。
結論：atomやろうとして結局LiteIDE

サンプルレベルでもエディタが対応してないとムカつきますね。わがままでさーせん。
http://qiita.com/m0a/items/c2e9bfbf7794c9dc4ec7

http://qiita.com/135yshr/items/de2b8cc7ec9ae1ce2cd9
このサイトで書いてることはできた。

http://d.hatena.ne.jp/sasaplus1/20130616/1371352276
準備って面倒なんだなあ（泣）最近環境のセットアップばっかりしかできてない。。
git-bashでcurlコマンド（初耳）まで使えた！こりゃ便利
activateしてもコマンドプロンプトに出続けないけど放っておいて進めてみようかな

http://qiita.com/abe00makoto/items/b7b27254a43d50b7aba2
go get code.google.com/p/rog-go/exp/cmd/godef
ができないせいか？
調べてみると、
code.google.comがshutdownしたとかで何やら面倒な感じ。
⇒とりあえずほっとく

atomのポップアップに合わせてWinのコマンドプロンプトで下記をやってみる。
（ログが出なくて不安になるよー。。
とりえあえずdockerと一緒に入れてPath通したgit-bashでやりました。

go get -u golang.org/x/tools/cmd/cover
⇒WindowsでGOPATH設定しているせいか\辺りがおかしなことになっているっぽい
　⇒　setし直してやる。
go get -u github.com/nsf/gocode
やってもatomでgo getしろって言うのが消えない。
し、ボタンで実行してもGo Toolがない。runtime入っているか確認しろって出る。
（go-configをgit-bashに合わせても変わらない。

うん。もうエディタはいいよ。。
何かすでにエディタ的な対応は出来てたりしてーって感じもするし。。
念のためLiteIDEでもインストールしておこう。。
（インストール時にメモリの参照エラー出まくったけど見なかったことにする。（ｷﾘｯ

さて、ようやく本筋の開発環境のセットアップに戻る。。
atomでmain.go
で編集してると割と色々atomのセットアップがうまくいっているっぽい
でもavastが動きまくりでimportの記述の保存もできない(笑)
保存すると無かったことになるってどういうことですか(笑)

LiteIDE入れといてよかったー
うん！補完もかなりいい感じ
囲い入れると閉じも入れてくれるのは嬉しいけどアローキー使う（行末移動）のが
面倒だと改めて感じさせられる。emacs的なキーバインドにしたいなー。

#本筋に戻る
結論：ダメだったので諦めます。

さて元に戻って下記のサイトに従ってやろうとしたら。つまづきました。
http://unknownplace.org/archives/golang-development-enviroment-with-docker.html

![THPとやらがまずいらしい.png](https://qiita-image-store.s3.amazonaws.com/0/131131/97f177be-2162-684f-801b-2790fccf5039.png)

カーネルのTHPとやらがまずいとか書いてありますね。
うーん。。めんどくさそう。。

日付を変えてから再度ググってみると下記のサイトを発見。何かよさげ！
http://qiita.com/macoshita/items/827ae5ac245b94ed4b4c
.ymlだけあればいいとか書いててmain.goも変えないとアカンやんと
心の中でつぶやきながらやったけれども、下記のとおりダメだった。

![Winのせい？.png](https://qiita-image-store.s3.amazonaws.com/0/131131/e88cf381-9383-3d75-20f6-5bcc08744af9.png)

git-bashでやったらdocker-compose runで下記のログが出たのでWindowsのせいなのだろうか？。。
＞Interactive mode is not yet supported on Windows.

とりあえずLiteIDEで何か動くものを作ることを優先しようと思いました。
debugツールがあまりにしょぼかったらまた考えることにする。
GCEでsshするVMや登録済みのconfigをpecoで切り替える

# あらまし
[gcloudでproject移動するのがめんどくさいからなんとかする](http://qiita.com/Sho2010@github/items/c54b72afa1db61f01242)
の記事を元に、もっと楽をしたい気持ちが芽生えたので
sshするVMや登録済みのconfig選択をpecoを使って選択できるようにした。

configの詳細（configとは、登録方法など）に関しては以前まとめてましたので
よろしければあわせてどうぞ。
[gcloud confing configurations コマンドでconfig設定を切り替える](http://qiita.com/kumanoryo/items/1fbd5302fc68a3980b5e)

# 動作確認環境
Mac OS X El Capitan ver:10.11.6

# 必要なパッケージ
- [peco](https://github.com/peco/peco)
- zsh

# 設定
~/.zshrcなどzshの設定ファイルに以下を追記。
## sshするVMをpecoで選択
```zsh
function gssh() {
  vm_data=$(gcloud compute instances list | peco)
  instance_name=$(echo ${vm_data} | awk '{print $1}')
  zone_name=$(echo ${vm_data} | awk '{print $2}')
  if [ -n "${instance_name}" ] && [ -n "${zone_name}" ]; then
    gcloud compute ssh ${instance_name} --zone ${zone_name}
  fi}
```

## 登録済みのconfigをpecoで選択
```zsh
function gcfg() {
  configuration_name=$(gcloud config configurations list | peco | awk '{print $1}')
  if [ -n "${configuration_name}" ]; then
    gcloud config configurations activate "${configuration_name}"
  fi}
```

# 使い方
## gssh
 - 現在configに設定されているgcpのVM一覧が表示される。
 - 選択すれば `gcloud compute ssh` コマンドで選択したVMへのSSH接続を試みる。

## gcfg
 - 現在登録したconfig一覧が表示される。
 - 選択すれば `gcloud config configurations activate` コマンドで選択したconfigへの切り替えを試みる。
Single Board Computer > UDOO Neo

Digikeyのメーリングリストで気になったSingle Board Computer。

[UDOO Neo](http://www.digikey.jp/ja/articles/techzone/2016/jun/udoo-neo-ideal-for-iiot-designs-where-extensive-io-sensors-and-powerful-compute-resources-are-key?WT.v_sub=8447059&WT.mc_id=em_TNL1607A.JP.Send&WT.z_email=7825_TNL1607AI0JP_article2title&mkt_tok=eyJpIjoiWlRObFpURTVNelJtTURnNCIsInQiOiJRb3RQRm1VQlBPZGpneHV0SDdnZnRlc0gyNmgzZGg3NFo5SFF0NGFTZmJYUDRmdmQ5WWtUS3ZRY3ZJUDd2azZvRTNLRjhKenJCQ2t6UVE1XC9leW5pd1JmeE5UaFJSVEVTaWdWSnV5YzFSNjQ9In0%3D)
~~[データシート](http://udoo.org/download/files/datasheets/udoo_neo_datasheet.pdf)~~ (リンク切れ)
[Introduction](http://www.udoo.org/docs-neo/Introduction/Introduction.html)

データシートのうち気になった部分

- 3x UART ports : 他のBoardより多い
- Power Supply > Coin Cell RTC Battery Connector
  - RTC内蔵なのだろうか?
- Integrated Sensors
  - 3-Axis Accelerometer
  - 3-Axis Magnetometer
  - 3-Axis Digital Gyroscope
- Arduino Pinout
  - Arduino互換のなにか
- Analog Input Pins: 6
  - AD取込み用なのか不明
- OS > Android and Linux
  - Android Lollipop
  - UDOObuntu（14.04 LTS）

HDMIはMicro-HDMIポートが用意されている。HDMIを使わない場合でも製品とする場合はHDMI Adaptorのライセンス費用がかかるのだろうか。
Nginxでリクエストを強制的にhttps(TLS)にリダイレクトする


みなさんもちろんhttps使ってますよね？
あらゆるサイトでhttps対応が求められる、っていうか必須な時代になってきました。

Let's Encryptなど無料証明書も出てきましたし、
個人が趣味で作ってるサイトのために証明書買うのは。。なんて言い訳も通用しませんね。
つべこべ言わず面倒くさがらず、個人情報入力ページだけ、なんてケチなことを言わずに全ページで強制的にhttps対応しちゃいましょう。

## httpで来たリクエストをhttpsにリダイレクト
nginxの設定ファイルに以下を追記するだけ

```
server {
    # httpをhttpsにリダイレクト
    listen 80;
    return 301 https://$host$request_uri;
}
```


## SSLv3を無効化してTLSだけを受け入れる
一般にhttpsの時に「SSL」を使うなんて言われますが、SSLv3には脆弱性があるので無効化してしまった方が良いです。
モダンブラウザならまず間違いなくTLSに対応してますので、TLSのみを受け付けるようにしましょう。

```
server {
    listen       443 ssl;
    # SSLを無効化してTLSのみ受け付ける 
    ssl_protocols  TLSv1.2 TLSv1.3;
    server_name  hogehoge.com;
}
```

上記2つの設定を追記したら必ずNginxを再起動します。

```
sudo service nginx restart
```

以上です。

## 参考
以下のサイトにホスト名を入力すると、SSLのバージョンや設定などを診断して、問題がある場合は解決策も提示してくれます。
[https://www.ssllabs.com/ssltest/](https://www.ssllabs.com/ssltest/ "")
[iOS] [Swift] NavigationBarの左にボタンを置くとスワイプで戻れなくなるのを改善する

# 目的
NavigationBarの左にボタンを置くとスワイプで戻れなくなってしまう。
最近は画面の大きい端末が増えてきてるので戻るボタンが押しづらい。
そこで、スワイプで戻れるようにしたい。

# 方法
画面遷移先に以下のコードを書く

```swift:viewController
class viewController: UIViewController: UIGestureRecognizerDelegate {
    override func viewDidLoad() {
        if let popGestureRecognizer = self.navigationController?.interactivePopGestureRecognizer {
            popGestureRecognizer.delegate = self
        }
    }
}
```

スワイプで戻れると気分がいいなあ
gsutil / bq | デフォルトのプロジェクトを変える

こんな感じ。

```bash
$ gcloud config set project [your_project_id]
```

gsutil コマンドとか bq コマンドごとに設定するのではなく、gcloud 本体のコマンドで設定するっぽい。

# 結果

`$ gsutil ls`
`$ bq ls`

などと打っても、どちらも参照するプロジェクトがちゃんと変わっている。

# 参考

- https://cloud.google.com/sdk/gcloud/reference/config/set

# 環境

```
Google Cloud SDK 117.0.0
```








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
シェルで文字列の長さを取得 (ただし、awkその他のプログラミング言語は無しでサクッと）

※自分用の備忘メモです。

```shell-session
[ykt68@MacBook]$ STRING=abcdefghijklmnopqrstuvwxyz
[ykt68@MacBook]$ echo ${#STRING}
26
[ykt68@MacBook]$ expr "$STRING" : '.*'
26
[ykt68@MacBook]$
```

### 補足
後者の expr を使うほうは、STRING が '-' だったり、'+' みたいに
expr に解釈される数値演算子１文字の場合、syntax error　になる。

```shell-session
[ykt68@MacBook]$ STRING='+'
[ykt68@MacBook]$ expr "$STRING" : '.*'
expr: syntax error
[ykt68@MacBook]$
```

なので、${#STRING} を使うのが無難かも。

### 追記

以下、mdstoyさんからのコメントでご教示いただきました wc を使った検証です。

```shell-session
[ykt68@MacBook ~]$ echo $SHELL
/bin/bash
[ykt68@MacBook ~]$ JP_STR='ラーメンたべたい by 矢野顕子'
[ykt68@MacBook ~]$ echo -n ${JP_STR} | wc -m
      16
[ykt68@MacBook ~]$ echo -n ${JP_STR} | wc -c
      40
[ykt68@MacBook ~]$ echo ${#JP_STR}
16
[ykt68@MacBook ~]$ expr "$JP_STR" : '.*'
40
[ykt68@MacBook ~]$ 
```

あれもこれも覚えるのは大変なので、イディオムとしてひとつ
覚えておくとしたら、

シェルで文字列の長さあるいはバイト数を数えるときは、
```wc -m``` と ```wc -c``` を使い分ける

と、-m を-c と関連づけて覚えておくのがよいかも。

あと、```wc -m``` の前の ```echo -n``` の```　-n``` がないと、
改行が入って1文字多くカウントされるので、そこも
注意ポイント
UISearchControllerのobscuresBackgroundDuringPresentationについて

# 結果を自動で表示してくれる`obscuresBackgroundDuringPresentation`
iOS9.1から`UISearchController`には`obscuresBackgroundDuringPresentation`というプロパティがつきました。
これはユーザーが検索バーで文字を入力した時に、すぐに`searchResultsController`をつかって結果を表示してくれるというもの。
（デフォルト値はYESです。Appleは、検索対象のリストと検索結果を表示するリストを同じViewControllerで表示するなら、`NO`にセットしておくべきだと言ってます。）

# iOS8では、このプロパティがないので検索文字入れても表示されない？
自分の場合、`UISearchController`のカスタムクラスをつかったためか、iOS8では結果が表示されませんでした。
(普通に`UISearchController`を使えば結果が表示されます。)
そのため、わざわざ`searchController.active = YES`しないといけませんでした。
なぜでしょう。。。
ViewControllerからContainerのViewControllerにDataを渡す

# はじめに
アプリ開発を始めてからいろいろメモしたいことが増えたので今日からメモをQiitaに投稿していこうと思ってます！基本英語で書きます。。。

# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 7.3.1

# Language
Swift

#  Code
```swift:
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let yourContainer = segue.destinationViewController as? YourContainerViewController where segue.identifier == "identifierName" {
            yourContainer.userID = userID
        }
    }
```
This code explains passing data via segue to destination ViewController which belongs to Container. The delegate method is quite complex for me. I firmly feel that this Code is so simple and easy to understand. Moreover, this method won't mess up your code. Therefore, it is better to use this method than delegate method when you would like to pass the data to Container ViewController from Main ViewController.

**REMINDER: DO NOT FORGET TO CONNECT Segue TO DESTINATION VIEW CONTROLLER IN YOUR STORYBOARD**
iTerm2 Build 3.0.4 で ssh 先毎に画面の色を変更する


画面の色の変更
--

version 3.0　から Applescript による iTerm2 の操作方法が変更になりました．
[新しいバージョンに対応したドキュメント](https://www.iterm2.com/documentation-scripting.html)によると， 以下の Applescript で変更可能になります．

```Applescript
tell application "iTerm2"
  tell current session of current window
    set background color to {$R, $G, $B}
  end tell
end tell
```
ちなみに，`set background color to {$R, $G, $B, $alpha}`　といったように 4番目の引数 $alpha を渡すと透過度を変更できます．

ssh 毎に画面の色を変更する
--

例えば，自分は以下のように設定しています．

```sh
function set_term_bgcolor() {
  local R=${1}*65535/255
  local G=${2}*65535/255
  local B=${3}*65535/255

  /usr/bin/osascript <<EOF
  tell application "iTerm2"
    tell current session of current window
      set background color to {$R, $G, $B}
    end tell
  end tell
EOF
}

function myssh() {
 local R=0
 local G=0
 local B=0
 case $1 in
   "dev" ) R=40 G=0; B=0; shift ;;
   "pro" ) R=0; G=40; B=0; shift ;;
   "warn") R=40 G=40; B=0; shift ;;
   *) R=0; G=0; B=30 ;;
 esac
  set_term_bgcolor $R $G $B
  \ssh $@
  set_term_bgcolor 0 0 0
}

alias ssh='myssh'
```

以下のように使うことができます．

```sh
ssh dev host   # 背景赤
ssh pro host   # 背景緑
ssh warn host  # 背景黄色
ssh host       # 背景青
```

参考
--

[iTermでsshするときに、接続先に応じて背景色を変える方法](http://qiita.com/k_kinukawa/items/3e5665325a4954e33019)
dockerでmysqlコンテナを起動する

```
docker run \
    --detach \
    --name mysql \
    --publish 3306:3306 \
    --volume /mysql:/var/lib/mysql \
    --env MYSQL_ROOT_PASSWORD=root \
    --restart always \
    --log-opt max-size=5m \
    --log-opt max-file=10 \
    mysql:5.7 \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_general_ci \
    --max-allowed-packet=32M
```
dockerのnginx-proxyの起動方法(開発環境用)

```
docker run \
    --detach \
    --name nginx-proxy \
    --publish 80:80 \
    --publish 443:443 \
    --volume /var/run/docker.sock:/tmp/docker.sock:ro \
    --volume /certs:/etc/nginx/certs:ro \
    jwilder/nginx-proxy
```

参考: [VirtualHostをお手軽に実現できるDockerコンテナnginx-proxyの起動方法](https://suin.io/531)
HDPをVirtualBoxで動かしてみる

7月から [Hortonworks](http://hortonworks.com/ "Hortonworks") というHadoopの会社に入社しました。

前職でもHadoopを触っていたり、[HBase徹底入門](https://www.amazon.co.jp/dp/4798138827 "HBase徹底入門")という本を出したりしてましたが、HDPを触っていたわけでもなく、Hortonworksがサポートするプロダクトも結構多いので、勉強がてらそれらを調べたり動かしたりしたことを投稿していこうと思います。

ということで、今回はHDPを動かしてみます。

ちなみに、Hadoopに関わってる方ならご存知の方は多いと思いますが、HDPはHortonworks Data Platformの略で、Hortonworksが提供するHadoopディストリビューションです。その他のHadoopディストリビューションとしては、Clouderaが提供するCDHや、IBMが提供するIBM BigInsights for Apache Hadoopなどがあります。

HDPの詳細については以下をご覧ください。
https://hortonworks.com/products/data-center/hdp/

また、Hortonworksでは、「Hortonworks Sandbox」というHDPを簡単にVMやクラウド上で試すことのできるイメージを提供しています。今回はこれを使ってVirtualBox上でHDPを動かそうと思います。

VirtualBoxは下記からインストールできます。
https://www.virtualbox.org/

# HDPのイメージをダウンロードする

まずは、HDPのイメージをダウンロードしてきます。
今回は現時点(2016/7/20)での最新版のHDP2.4のイメージをダウンロードします。

下記URLの「HDP® 2.4 on Hortonworks Sandbox」の「DOWNLOAD FOR VIRTUALBOX」からダウンロードできます。
http://hortonworks.com/downloads/#data-platform

容量が大きいので結構時間がかかります。

# HDPのイメージを起動する

ダウンロードしたイメージをVirtualBoxでインポートして起動します。
起動が完了すると以下の画面が表示されます。

<img width="722" alt="after_download" src="https://qiita-image-store.s3.amazonaws.com/0/8576/fff0e6cd-f15e-5d26-e81a-466e539f4840.png">

指示通り、http://127.0.0.1:8888/ をブラウザで開くと以下のような画面が出てきます。

<img width="1178" alt="HDP Sandbox" src="https://qiita-image-store.s3.amazonaws.com/0/8576/f434c720-41d7-c288-cbeb-e0565ce58392.png">

[Ambari](http://hortonworks.com/apache/ambari/ "Ambari")のURLやusername、passwordが表示されてます。
それ以外にも、「View Advanced Options」をクリックすると、[Atlas](http://hortonworks.com/apache/atlas/ "Apache Atlas")や[Zeppelin](http://hortonworks.com/apache/zeppelin/ "Zeppelin")等のURLが表示されました。

軽くAmbariを覗いてみたら以下のプロダクトが最初から入っているようです。

* HDFS
* MapReduce2
* YARN
* Tez
* Hive
* HBase
* Pig
* Sqoop
* Oozie
* Zookeeper
* Falcon
* Storm
* Flume
* Ambari Metrics
* Atlas
* Kafka
* Knox
* Ranger
* Slider
* Spark
* Zeppelin Notebook

# まとめ

今回はHortonworks Sandboxを使って、HDPをVirtualBox上で動かしてみました。特にハマリどころもなくすんなり動かすことができました。
CentOS6.5にdockerとdocker-composeをインストール


dockerインストール

```bash
$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum update
$ sudo yum -y install docker-io
```

確認

```bash
$ docker --version
```

docker起動と自動起動

```bash
$ sudo service docker start
$ sudo chkconfig docker on 
```

docker-composeインストール

```bash
$ sudo sh -c "curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
$ sudo chmod +x /usr/local/bin/docker-compose

```

root以外でも操作可能にする

```
$ groupadd docker
$ usermod -a -G docker [user]
```