OmniAICreator/Qiita-1.07M huggingface dataset:
for文内でsetTimeoutを使う場合の変数のスコープ

#期待通りの結果にならない例

```
var array = [1, 2, 3],
    len   = array.length,
    i;

for(i = 0; i < len; i++){
    console.log(i); //0,1,2
    setTimeout(function() {
        console.log(array[i]); //undefined×3  >このコンソールは全てarray[3]にアクセスしている
    }, i * 1000);
};
console.log(i); //3  >条件式で3回インクリされた状態で残る
```

#変数iをクロージャでキープすることで期待通りの結果に

```
var array = [1, 2, 3],
    len   = array.length,
    i;

for(i = 0; i < len; i++){
    console.log(i); //0,1,2
    (function(pram) {
        setTimeout(function() {
            console.log(array[pram]); //1,2,3
        }, pram * 1000);
    })(i);
};
```

#bindを使っても同じ結果が

```
var array = [1, 2, 3],
    len   = array.length,
    i;
for(i = 0; i < len; i++) {
    setTimeout(function(index) {
        console.log(array[index]);
    }.bind(null, i), i * 1000);
}
console.log(i);
```

#Underscore.jsのeachを使っても同じ結果が

```
var array = [1, 2, 3];

_.each(array, function(obj) {
  setTimeout(function() {
    console.log(obj);
  }, obj * 1000);
})
```
gitリポジトリの複製

多分もっとスマートに出来るはずだけど、とりあえず。

* ローカルではなくリモートから `clone` することで、余計なブランチが出来ないように修正。（2015/1/20）

## リポジトリ例
複製元リモート：user@sample.com:group/hoge.git
複製先リモート：user@sample.com:group/hoge-copy.git
複製先ローカル：hoge-copy/.git

## 手順

### 1. リモートリポジトリ作成
### 2. ローカルの複製先ディレクトリに移動
```
$ cd hoge-copy/
```
### 3. 複製元リモートリポジトリから複製
```
$ git clone --mirror user@sample.com:group/hoge.git .git
```
### 4. リモート先を複製先のリモートリポジトリに変更
```
$ git remote set-url origin user@sample.com:group/hoge-copy.git
```
### 5. 複製先のリモートリポジトリに push
```
$ cd .git
$ git push --mirror user@sample.com:group/hoge-copy.git
```
### 6. ローカルに clone
`hoge-copy/` ディレクトリを空にしてからいつも通り clone
Gemfileのバージョン指定で混乱した

Gemfileのバージョン指定で
http://guides.rubygems.org/patterns/#declaring-dependencies
や、識者の話を元に

```
~>
```
の指定で認識が甘かったので、忘れないように残しておく。
　
　
　






```
gem "hoge"
```
というgemがあると仮定して、リリースされているバージョンは、
* 1.0.0
* 1.0.1
* 1.0.2
* 1.1.0
* 1.1.1
* 1.1.2
* 1.2.0
* 1.2.1
* 1.2.2
* 2.0.0
* 2.0.1

とする。
この時、

```
gem "hoge", "~> 1.1.1"
```
と指定されている場合は、

```
gem "hoge", "=> 1.1.1", "< 1.2.0"
```
と同義。
そのため、対象は1.1.1と1.1.2となり、1.1.0は含まれない。

```
gem "hoge", "~> 1.1"
```
と指定されている場合は、

```
gem "hoge", "=> 1.1.0", "< 1.2.0"
```
となるため、対象は1.1.0も含まれる。
Ansibleでホスト名を各ホスト固有の設定にする


世の皆様方は、調べずとも使えていたと思いますが
僕自身が結構ハマってしまったのでメモがてらに。

環境は省略しますが、Ansibleで設定したいノードが2台あるとして
それぞれに固有のホスト名を指定したい場合は下記のようにすればやってくれるようです。

```lang:/etc/hosts

[sample]
my_host ansible_ssh_host=192.168.1.1 # これはノード1
my_host2 ansible_ssh_host=192.168.1.2 # これはノード2

```

```lang:change_hostname.yml

- hosts: sample
  user: hogehoge
  sudo: yes

  tasks:
    - name: change hostname per server
      hostname: name=" {{ inventory_hostname }} "

```


これに2日くらいかかるとは・・・
aws-sdk-v1 で AuthFailure が出る問題


認証用のキーが間違っていないしサーバとの通信自体は問題ないのに、なぜかAuthFailureが出て認証できない問題が発生した。
色々調べた結果、マシンの時刻が700秒程度ずれていることが原因だった。`ntpdate` で時計合わせすることで無事に解決。

結論：ntp大事
AndroidのListViewのFilterは非同期で動作する。sortは同期する

当たり前の事なのかもしれないけど、自分用のメモ

ListViewで、フィルタとソートを実行する時、以下のようなコードを書いたのです。これは正常に動作しません。
フィルタは行われますが、ソートが行われません。

```java
ListView listView = (省略します)
SampleAdapteradapter = (SampleAdapter)listView.getAdapter();

adapter.getFilter().filter("filter文字列");//フィルタ実行
adapter.sort();//ソート処理。引数は省略しています。
```

理由は簡単で、Filterは非同期で動作するためです。
sortを行った後、しばらくたってからfilterが動作します。
android.widget.Filterクラスのfilterメソッドに、Handlerを生成するコードがありました。
しかし、sortのコードはHandlerを使用していないため、同期的に動作します。

従って、filterとsortを実行したければ、以下の2つのパターンになると思います。

1.sortを実行してからfilterを実行する。
2.filterの中にsortも含めてしまう

こんな感じになると思います。

意外に時間をとっちゃったので、メモしておきました。
XAMPPの文字化け回避メモ

# はじめての開発環境作りで初っ端詰まった


PHPとMySQLを使いたいとWindows7に XAMPP ver3.2.1 とやらをインストール。
意気揚々とMySQLに書き込んでみたら、日本語が全部「???」になってしまった。

文字コードがUTF-8で統一されていないのが原因らしい。
ので、PHPの設定とMySQLの設定をひとつずつ修正することにした。

## 解決方法

### 設定が必要なファイルの場所

- XAMPPのコントロールパネルを開いて「Apache」の `Config` ボタン → `<Browse> PHP` → 開いたフォルダの中の `php.ini`
- XAMPPのコントロールパネルを開いて「MySQL」の `Config` ボタン → `<Browse>` → 開いたフォルダの中の `bin` フォルダ → `my.ini`

`my.ini` は昔のXAMPPだと名前が違っていたらしく、随分と詰まった。

### php.ini の設定

- 以下の8つを探して、それぞれ文頭の `;` を外す。

```php.ini
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none
;mbstring.func_overload = 0
```

- `mbstring.internal_encoding = EUC-JP` を `mbstring.internal_encoding = UTF-8` に直す
- `mbstring.http_output = SJIS` を `mbstring.http_output = UTF-8` に直す
- `mbstring.encoding_translation = Off` を `mbstring.encoding_translation = On` に直す
- 以下みたいな感じに仕上がる。（実際はそれぞれの行間に色々入ってるけど）

```php.ini
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0
```

### my.ini の設定

- `## UTF 8 Settings` を探して、その下5行の文頭の `#` を外す。
- `init-connect=\'SET NAMES utf8\'` を `init-connect=SET NAMES utf8` にする。
- 以下みたいな感じに仕上がる。

```my.ini
## UTF 8 Settings
init-connect=SET NAMES utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
character_sets-dir="C:/xampp/mysql/share/charsets"
```

- `[client]` `[mysqldump]` `[mysql]` を探してそれぞれ `default-character-set = utf8` を追加
- 以下みたいな感じに仕上がる。

```my.ini
[client]
# password       = your_password
port            = 3306
socket          = "C:/xampp/mysql/mysql.sock"
default-character-set = utf8
```

```my.ini
[mysqldump]
quick
max_allowed_packet = 16M
default-character-set = utf8
```

```my.ini
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
default-character-set = utf8
```

- その後MySQLを再起動。
- 既に作ってあるテーブルには反映されないみたいなので作りなおす。
- その時のテーブルの文字コードは `utf8-general_ci` などのUTF8の物を選ぶ。

## 参考

ありがとうございました。

- [my.iniファイルの確認と修正](http://www.adminweb.jp/xampp/mysql/index4.html)
- [XAMPP | PHP・MySQLで文字化け](http://ortk.main.jp/blog/?p=67)
- [XAMPPのmy.cnfが無くなった？](http://yuubiseiharukana.blog.shinobi.jp/Entry/159/)
MacOS X 10.9 環境あれこれ

```bash
httpd
> httpd -v
Server version: Apache/2.2.26 (Unix)
Server built:   Dec 10 2013 22:09:38

> which apachectl
/usr/sbin/apachectl

httpd.conf
> /etc/apache2
> /etc/apache2/extra

DocumentRoot
> /Library/WebServer/Documents

access_log, error_log
> /private/var/log/apache2/*_log


```

```bash
postFix

which postFix
> /usr/sbin/postFix

which postconf
> /usr/sbin/postconf

> postconf | grep mail_version
mail_version = 2.9.4

config
> /etc/postfix/

log
> /var/log/mail.log
invalid metadata: The `name' at tribute is required in cookbook metadata でエラーになる

## 経緯

以前作成していたcookbookを実行したら、

```sh
ERROR: Cookbook loaded at path(s) [/tmp/vagrant-chef-3/chef-solo-1/cookbooks/ack] has invalid metadata: The `name' at
tribute is required in cookbook metadata
==> default: [2015-01-20T02:49:01+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.
```

とエラーが発生。

## 原因

Chef12 から metadata.rbにname attributeが必要になったぽい。

https://github.com/opscode/chef/pull/1790

## 解決

* cookbookを修正する
  - name attribute を設定する
  - metadata.rbをcookbook に置かない(または削除する)

* 古いバージョンのchef-clientを利用する
  - ```knife solo HOST --bootstrap-version 11.16.4-1``` とかで古いバージョンのchefを使えば回避できる。
共通化でモチベーションと効率が低下した話


自分は普段ソーシャルゲームの開発に関わっていますが、群雄割拠のグリモバ全盛期にその開発を効率化するために社内ではいろいろな取り組みがなされました。そのひとつにアプリ別ではなく機能別のチームを作るということがありました。結果としてそれは失敗だったと言えるのでそのことについて書いていきます。

## 背景

当時のソーシャルゲームの主流はカードゲームで、クエスト・レイドをこなしつつガチャで引いたカードを合成して強化していくスタイルが一般的でした。そしてその多くがシステムはほとんど同じで見た目だけを変えた「柄替え」アプリでした。

その中で行われたのが二つの共通化です。

### コードの共通化

今までのアプリでは元のアプリのソースからフォークするなどして別のプロジェクトとして独立させそれに対して各チームが開発を行うと言う感じでしたが、今回の共通化ではゲームのコアとなるロジック部分をサブモジュールとして分離し、各アプリでは画像やテンプレートを管理しつつロジック部分は共通モジュールを参照するようにしました。これによってサブモジュール一回の更新で多くのアプリにその更新が反映できるようになるという目論みです。

### チームメンバー(プログラマー)の共通化

コードを共通化したことにより少ないメンバーでアプリの開発が出来るという見込みから複数のアプリのメンバーが統合し、これまでアプリA・アプリBという編成だったチームが、ガチャ・イベントといった機能別のチームになりました。

## 結果は失敗だった

結論を言ってしまえばこのやり方は明らかに失敗でした。

### プログラマーのモチベーション低下

これまでのやり方では各アプリごとのチーム[^1]であったため自分の開発するアプリをやり込みながら意見を言い合って技術者も企画出しに参加していましたが、対応しなければいけないアプリが増えてひとつのアプリに愛着を持ってやり込むということが難しくなり、仕様を理解する程度にしかプレイしなくなりました。そうすると自己肯定的に開発をするのではなく単に時間を切り売りして作業をするという感覚になり技術者のモチベーションは低下しがちになりました。

### 開発効率の低下

ゲームロジックをサブモジュール化するというアイディアは似たようなアプリを運営する上で効率的なようにも見えましたが、実際に運用すると柄替えとはいえ細かな仕様の違いがあったりアプリごとのイベント開発もあるためだんだんと無理が出てきて、結果的にひとつのアプリの修正が他のアプリに影響してしまうため簡単に更新をすることが出来ず開発が硬直してしまうこともありました。また、グリモバのカードゲーム時代もそれほど長く続かないことは明らかだったので共通化すること自体が不可能になっていきました。

## 教訓

これらの失敗から再確認できたことは以下のようなことです。

### 人間は機械ではない

一見効率的なように見える管理手法も人間の感情やモチベーションを考慮していない場合があります。仕事をする人のモチベーションがあがらなければ大抵のプロジェクトは失敗するか開発期間が長くなります。

### 無理に共通化しようとしてはいけない

プログラミングに関わる人は共通化することで後の開発が楽になったりコードがかっこ良くなったりということを目論んで共通化を考えますが、それは今回の失敗の様に逆に開発効率を下げることもあります。また、共通化がプロジェクトの意図からかけ離れた技術者のエゴでないかを考えることも必要かもしれません。

# おわりに

今回は共通化の失敗について書きましたが、現在は各アプリごとのチーム編成になり、このときに作った本当に共通化するべきモジュールは技術支援チームというアプリを横断的に開発をするチームがメンテナンスをして現在も使われているので完全な失敗ということではありません。

プロジェクトには今回の失敗ようなこともあるということを頭の片隅に入れておくといいと思って投稿してみました。


[^1]: これまでも技術基盤チームやインフラチームなどアプリを横断的に見るチームはあったし、デザイナーも他アプリのヘルプなどで横断的に見る人もいた。
SublimeText3で差分表示＆マージ Sublimerge Pro

# Sublimergeの使い方
備忘録程度のもの

## インストール
コマンドパレット（Ctrl+shift+p）から
Sublimerge Pro
をインストールします。

## Sublimergeの使い方
### 基本コマンド
コマンドパレット（Ctrl+shift+p）から
Sublimerge Compare to View
Sublimerge Compare to Clipboard
もしくは
右クリックから
Sublimerge>>Sublimerge Compare to View
Sublimerge>>Sublimerge Compare to Clipboard
のどちらかを選択します。
そうすると別ウィンドウにマージ専用ウィンドウが開きます。

差分がない場合警告が出てマージ専用ウィンドウは開きません。

#### 開いているファイルが1つだけの場合
クリップボードとの比較のみできます。

#### 開いているファイルが2つの場合
Compare to Viewを選択するとマージ専用ウィンドウが開きます。

#### 開いているファイルが3つ以上の場合
Compare to Viewを選ぶと現在開いているファイルと、その他の開いているファイルから選択した1つでマージ専用ウィンドウが開きます。

## 左のフォルダツリーからは
shift+左クリックで現在のファイルとその上か下のファイルをえらび右クリックメニューからSublimerge>>Compare Selected Files
もしくは、
ctlr+左クリックで２つファイルを選択し、右クリックメニューからSublimerge>>Compare Selected Files

## ショートカットキー
現在開かれてるファイルとの比較をおこないます。
[ctrl]+[alt]+[d]

#### 開いているファイルが2つの場合
Compare to (ファイル名)を選択します。

#### 開いているファイルが3つ以上の場合
Compare to view...を選択して
候補のファイルが表示されるので比較するファイルを選択します。


## マージ専用ウィンドウでの（デフォルト）コマンド

/
差分の場所を選択し移動する。

ctrl+enter
ナビゲーター表示、非表示
ナビゲーターを非表示にすると編集可能。

↑キー
dff部分単位でカーソルを上へ移動

↓キー
dff部分単位でカーソルを下へ移動

→キー
現在選択しているdiff部分を右側ファイルにマージする。

←キー
現在選択しているdiff部分を左側ファイルにマージする。

shift+→キー
全diff部分を右側ファイルにマージする。

shift+←キー
全diff部分を左側ファイルにマージする。

## やり直す場合
マージ専用ウィンドウを保存せず閉じる。

保存した後やり直したい場合
（よくわからない、snapshot、Revertを使うようだ。）

## その他
5回に1回課金を求めてくる。（コマンド単位？）
bash の 環境變數の 操作

たとへば

~~~bash
export HOGE=hoge.gif
~~~

なるとき この 環境變數 $HOGE より hoge.png (hoge.gif に非ず) を 得たき ときは 演算子 '%' を 用ゐて 次の ごとく記す。

~~~bash
${HOGE%.gif}.png
~~~

* '%' は 變數の 値の 末尾より 指定されたる wildcard に 一致すべき 最も 短き 文字列を 除きし もの。
* '%%' は 變數の 値の 末尾より 指定されたる wildcard に 一致すべき 最も 長き 文字列を 除きし もの。
* '#' は 變數の 値の 先頭より 指定されたる wildcard に 一致すべき 最も 短き 文字列を 除きし もの。
* '##' は 變數の 値の 先頭より 指定されたる wildcard に 一致すべき 最も 長き 文字列を 除きし もの。
正規表現 便利ページ集

良いのが見つかったら随時書き足していきます。

# ルールの確認

正規表現のルールをまとめているページです。

http://qiita.com/merrill/items/8af95dd3cb3977a89636


# 実行・確認

正規表現を実行して確認することができます。

http://scriptular.com/

# ルールの可視化

正規表現を図で表示してくれます。
複雑な正規表現を読み解く際に非常に役立ちます。

http://regexper.com/
openFrameworksのAddon、ofxCvの導入メモ


openFrameworks 配下の addons ディレクトリで git clone する。

```
$ cd openFrameworks/addons/
$ git clone https://github.com/kylemcdonald/ofxCv.git
```

または、https://github.com/kylemcdonald/ofxCv からダウンロードして、addons に置いても可

projectGenerator でプロジェクトを作成する。
Addonsで __ofxOpenCv__ と __ofxCv__ の両方を設定するのを忘れない。
![ProjectGenerator-Addon.png](https://qiita-image-store.s3.amazonaws.com/0/20773/3120e217-ff13-3541-4805-eb70f7475cbd.png "ProjectGenerator-Addon.png")
_ofxCv だけ読み込んでて10分くらい悩んでた_

生成されたプロジェクトの Project.xcconfig の HEADER_SEARCH_PATHS を修正する。

```
HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) "../../../addons/ofxOpenCv/libs/opencv/include/" "../../../addons/ofxCv/libs/ofxCv/include/"
```
composer.json、composer.lockって何なの？という人向けのまとめ

## composer.jsonとは
依存するパッケージを定義するためのファイル。
自分で作成するか、composer initで対話的に作成できる。

iniコマンドでは、Public RepositoryであるPackagistから依存パッケージを検索・選択することが出来る。

## Packagistとは
composerの中央公開リポジトリ。だれでもパッケージを公開できる。
facebookのsdkやphpunitなど様々なパッケージが公開されてます。

https://packagist.org/

## composer.jsonの中身

```composer.json
{ 
    "require" : {
        "facebook/php-sdk" : "4.0.*"
    },

    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}
```

### requireについて
* 依存をパッケージ名:バージョンで指定する
* バージョンは"1.0.*"のようなワイルドカードなどが使える

### require-devについて
* 開発時のみに依存するパッケージを書く

## 依存するパッケージをインストールする
composer installを実行する

* composer.jsonを元に依存解決し、パッケージのダウンロードを行いvendor/に配置される
* composer.lockというファイルが同階層にない場合はダウンロードしたパッケージのバージョン情報を書き出す。

composer.lockを更新したい場合は`composer update`を使う

## composer.lockについて
* installコマンド実行時に、composer.lockファイルが存在する場合はcomposer.lockに書きだされているバージョンをダウンロードする。
* チーム間で同じバージョンをダウンロードするためなので、composer.lockも一緒にコミットをすること。

## 2015年11月17日追記
### 特定のパッケージのみ更新したい場合
* composer.jsonの値を更新したいバージョンに書き換える
* `composer update [更新したいパッケージ名]`を実行
* 更新後のライブラリがインストールされ、composer.lockが最新に上書きされる
Rメモ：encodeString() 関数 #rstatsj

たまに必要になるけど関数名を忘れてしまうのでメモ。

```r:R
x <- "ab\bc\ndef"
print(x)
cat(x) # interprets escapes
cat(encodeString(x), "\n", sep = "") # similar to print()
```

```:結果
[1] "ab\bc\ndef"

ac
def

ab\bc\ndef
```

```r:R
x <- c("a", "ab", "abcde")
encodeString(x, width = NA) # left justification
encodeString(x, width = NA, justify = "c")
encodeString(x, width = NA, justify = "r")
encodeString(x, width = NA, quote = "'", justify = "r")
```

```:結果
[1] "a    " "ab   " "abcde"
[1] "  a  " " ab  " "abcde"
[1] "    a" "   ab" "abcde"
[1] "    'a'" "   'ab'" "'abcde'"
```

justify 便利です。
CLIでRabbitMQからのメッセージを取得する

rabbitmq_managementプラグインでQueueの中身もExchangeもConsumerも見ることができて、しかも割と出来がいいのは確かなのだが、CLIでできないものかと探してみた。PayloadがJSONだと、CLIでは`jq`が使えるので心に優しい。

```bash
$ sudo dnf install librabbtmq-tools
```

以下のコマンドが使えるようになる

```bash
$ amqp-
amqp-consume        amqp-declare-queue  amqp-delete-queue   amqp-get            amqp-publish
```

OpenStackだとnotifications.infoというイベント通知キューがあるので、試しにここから取り出してみる。

```bash
$ sudo rabbitmqctl list_queues | grep notifications.info
notifications.info      69
$ amqp-get --queue notifications.info | jq .
```

取り出したメッセージはQueueから消えてしまうので注意。rabbitmq_managementプラグインを使えば、Queueから取り出したあと、自動でもとのQueueにメッセージを戻してくれたりもする。
To convert otf into ttf


font file の OpenType file をば TrueType file へ 變ふるに [fontforge](http://fontforge.org/ "fontforge") を 以てせむ。

fontforge の script を こしらふ。

```sh:otf2ttf.sh
#!/usr/local/bin/fontforge

Print("Opening " + $1);
Open($1);
Print("Saving " + $1:r + ".ttf");
Generate($1:r + ".ttf");
Quit(0);
```

その後 これを 動かす。

```sh:console
$ ./otf2ttf.sh HOGE.otf
```

或いは

```sh:console
$ fontforge -script otf2ttf.sh HOGE.otf
```
bash の 端末にて 動きたる CUI program を 止めずに 端末を 終ふ


あらかじめ 端末を 途中にて 終ふるを 知るとき

```bash:console
$ nohup HOGE &
```

などゝ す。 これを 想定せずに いきなり 終ふる ときは

* Ctrl-Z にて HOGE を 停止せしむ。
* jobs にて HOGE の job number を 確認す。
* bg %1 にて background にて 再開せしむ。
* disown %1 と す。

こゝに jobs, bg, disown などは ともども bash の sub-command なり。
Hubot を Slack で正式な？ bot として使えるようにする


去年の Slack の blog にこんなエントリがありました。

http://slackhq.com/post/104688116560/rtm-api

この新 API の導入により、やっとオリジナルの bot が作れるようになりました。でも、既に hubot を使っていた人はめんどくさいはず。

そんな人のために、Hubot Integration がアップデートされ、hubot-slack もメジャーバージョンアップして、簡単に bot として認識されるようになりました。

やりかたはとても簡単で、hubot-slack の README に書いてあるとおりです。

https://github.com/slackhq/hubot-slack#upgrading-from-earlier-versions-of-hubot

簡単にまとめておきます。

## 手順

1. hubot-slack のバージョンを 3.0.0 以上にアップデートする
2. 新しく Hubot Integration を作成する(設定画面が新しくなっている) -> https://my.slack.com/services/new/hubot
3. 新しい Hubot Integration では、必要な環境変数が HUBOT_SLACK_TOKEN のみになるので、これを設定しておく
4. ローカルで動かしてみる: HUBOT_SLACK_TOKEN=xoxb-1234-5678-91011-00e4dd ./bin/hubot --adapter slack
5. 動いたらデプロイする。Heroku だったら HUBOT_SLACK_TOKEN を heroku config:set で更新してから git push する。
6. 動作確認できたら、HUBOT_SLACK_TOKEN 以外の環境変数は不要になるので消す。また、古い Integration も消す。

## 注意点

まだ、バグがあります。

自作 bot スクリプトで、Robot#messageRoom() を使っている場合、room にチャンネルのプレフィックスである `#` を付けているとこけます。

以下の node-slack-client の PR が取り込まれたバージョンがリリースされれば解消するっぽいです。

https://github.com/slackhq/node-slack-client/pull/9

それまでは、`#` なしにする必要があります。
VagrantとDockerでお手軽にDBを用意したい

開発時に複数DB用意したいとか、異なるバージョンのアプリを同時に起動しておきたいとか、理由はいろいろあるんですが、そういうときのために。

Vagrantfileはこちら。
https://github.com/mystelynx/osx-docker/blob/master/Vagrantfile

落としてきて、

```sh
vagrant up
```

で、`postgres-5432`, `postgres-5433` というコンテナが立ちあがります。

## ポイント

### Vagrantfileを1つにまとめた

ホストとなるVirtualBox用のVagrantfileと、Dockerコンテナ用のVagrantfileを分けてる例がたくさんあったのだけど、1つにまとめてみた。  
理由はホストVMに設定するポートフォワーディングの設定と、Dockerコンテナに設定するポートの設定が別ファイルになってしまうため見辛かったから。  

```rb
        d.vagrant_vagrantfile = "./Vagrantfile"
        d.vagrant_machine = "base"
```

あと、別にファイルを分けなくても```vagrant_machine```を設定しとけばホストマシンを指定できることに気付いたから。

### Vagrantfile内のVM定義順序

必ず上からホストVM→Dockerコンテナの順で定義しないとダメ。  
逆にしてしまうと、
1. Dockerコンテナを起動させようとする
2. Docker Provider内の```vagrant_vagrantfile```の指定によりホストVMを起動してくれる
3. Dockerコンテナが全て起動する
4. ```config.vm.define```によりホストVMを直接起動しようとする

ので、ホストVMが2個起動する上に、ポートフォワードの設定で **Already Used** とか言われエラーで爆死します。。。

### postgresqlの公式イメージを使用するように

最初は[paintedfox/postgresql](https://registry.hub.docker.com/u/paintedfox/postgresql/)でやってたんですが、動きはしたんですがよくわからんエラー出たり、dockerサービスのオプションを追加してやらなきゃいけなかったりと大変だったので移行。

### `vagrant status`
で、ホストVM、コンテナが一緒に並んでくれるので、わざわざ``vagrant global-status`をやんなくていい。

---

### 弱点

ホストVMを使いまわせないので、1つのホストVMだけで済ませたいという要望は満たせない。そういうときは大人しくVagrantfileを分割して、ホストVM用のVagrantfileをDockerコンテナ定義から参照しましょう。
Rails4.2をVagrantで動かしてはまったこと


まず、Rackの変更により、`rails server`コマンドを実行した際のデフォルトのホストが0.0.0.0からlocalhostに変更されたみたいです。なので、ホストのポートをフォワードしていると接続できなくなってしまいました。

Railsを起動するのにのに-bオプションをつけて起動する必要がありました。

```bash
$ bundle exec rails server -b 0.0.0.0
```

あと、4.2からweb-consoleというgemが標準でついてくるようになり、これを試してみたノですが、localhostからのアクセスでしかデフォルトでは使えないようになっているようです。

`config/application.rb`に接続元のIPを追加して`rails server`を再起動しました。

```ruby
config.web_console.whitelisted_ips = %w( 127.0.0.1 192.168.0.100 10.0.2.2 )
```
エミュレータだけでAndroid wearの開発環境を構築する

# エミュレータだけでAndroid wearの開発環境を構築する

めっちゃそれなりにハマったのでメモ

http://lastshooting.blogspot.jp/2014/08/android-wear.html

こちらを参考に作ろうとしていって、つまずいた所をメモ

## 1. GenymotionのAndroid Wearアプリでエミュレータに接続しようとしてつまずく
めっちゃはまった。。。

#### `Google Galaxy Nexus - 4.3 - API 18 - 720x1280`でエミュレータ接続のボタンのメニューが出なかった

- GenymotionにPlayストアをインストール済
- PlayストアからAndroid Wearアプリをインストール出来た


Android Wearアプリを起動した後、この画面から進まなくなってしまった。


![Genymotion_for_personal_use_-_Google_Galaxy_Nexus_-_4_3_-_API_18_-_720x1280__720x1280__320dpi__-_192_168_57_100.jpg](https://qiita-image-store.s3.amazonaws.com/0/6878/c4b52b3c-c1aa-13f9-1b35-c0d3396e3426.jpeg)



参考サイトではメニューボタンを押すと、`エミュレータをペア設定`とうメニューが出て次の画面に行くのだが、全く反応せず。。。

手元の実機で確認すると、BluetoothがONになって、次の画面に行くとエミュレータをペア設定のメニューが出るようになっていた。


GenymotionではBluetoothをONにする事が出来ない為、次の画面に行かないのだと思われる。。。これでめっちゃハマった。。。メニューボタンを無駄に連打とかしてしまった。。。

#### `Google Nexus 5 - 4.4.4 - API 19 - 1080x1920`でPlayストアからAndroid Wearがインストール出来なくてハマる。

4.4.3で出来なかったから、じゃあ次は4.4.4だろうと言うことで試してみたがダメだった。


Playストアで検索しても、URL直打ちでやっても、`お使いの端末はこのバージョンに対応していません`と表示されてインストール出来なかった。。。。

## 解決方法

http://aircolor.hatenablog.com/entry/2013/10/19/171324

ここを参考にして、apkファイルを直接入れた。

google playでAndroid Wearのアプリを検索してURLをコピー

https://play.google.com/store/apps/details?id=com.google.android.wearable.app&hl=ja


http://apps.evozi.com/apk-downloader/
ここに、コピーしてURLを入れて、apkファイルを取得する。

そして、Genymotionにapkファイルをドラッグ＆ドロップしてインストール（もしPlayストアからインストールしていると、一度アンインストールしてからじゃないとエラーが出ます。）

これで、4.3, 4.4.4, 5.0のどのバージョンでも`エミュレータをペア設定`という画面が出て設定出来るようになった。



## 2. Android、AndroidWear両方のエミュレータを立ち上げると、AndroidWearのエミュレータが動かなくなる

- CPU/ABIが`x86`のもののエミュレータを使っている。

以下のようなエラーが出ていた。

```
HAX is working and emulator runs in fast virt mode
emulator: Failed to sync vcpu reg
emulator: Failed to sync HAX vcpu context
```

いろいろググってみると、`Intel HAXM x86 emulator`関連のエラーっぽい事だけはわかった。


なので、試しに、AndroidWearのエミュレータをCPU/ABIを`arm`で作りなおして起動すると、上手く行った！

根本的な解決にはなっていないのだけど、まぁ、動くからいいかー。遅いけど。

## 所感
エミュレータだけでの環境構築、さくっと終わるもんだと思ったら全然終わらなかった。。。org

もっと良さげな解決方法があれば誰か教えてください。。。
Turf が JSTS 独立となるに至った設計判断について

https://github.com/Turfjs/turf/issues/88 のポイント
justification
==
- JSTS はかなり巨大なプロジェクトであり、独自の用語を使い内部フォーマットがある。
- browserify したバージョンで jsts は 512.8kB、つまり大きい。
- デバッグがかなり難しい。
- サイズが大きすぎてクライアントサイド利用の障害になる。
how
==
- JSTS 独立となるために実装しなければならない機能は buffer, union, difference, intersect のみであろう
- JSTS はかなり 'enterprisey' なスタイルで書かれているので、jsclipper 等他のライブラリからもヒントを借りる
- jsclipper を node に移植した結果、93kBとなった
- jsclipper ベースとしたことで、他にはないほど多くの buffer オプションを得たし、高速になった。但し内部形式変換を伴っている
- turf は内部的によく decoupled になっているので、モジュールを分離して部品使いすることもできる
- JSTS からもコードを取り出して JSTS 独立を達成
git-ftp で submodule が同期されないバグの対応法


## git-ftp がうまく動かない。

いつも通り ```git ftp push``` したら submodule のあるプロジェクトでエラーが発生。
```fatal: Could not upload files., exiting...``` とか言われる。

- [git ftp - Could not upload files error in GitFTP - Stack Overflow](http://stackoverflow.com/questions/20533394/could-not-upload-files-error-in-gitftp)

まさに上記リンク先の状態。
先日までできてたのにいきなり出来なくなって焦る。

submodule を入れてないプロジェクトでは普通にうまく動いており、色々試すも解決せず。
なんか面倒になってきた。

## バージョンを 0.9.0 に下げれば良い。

原因の特定を諦め、強攻策に出る。
バージョンを下げてみよう。

```bash:Terminal
$ git ftp version
git-ftp version 1.0.0
$ brew uninstall git-ftp
$ brew doctor
$ brew tap homebrew/boneyard
$ brew versions git-ftp
Warning: brew-versions is unsupported and will be removed soon.
You should use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions

1.0.2    git checkout cef35dd /usr/local/Library/Formula/git-ftp.rb
1.0.1    git checkout 4c6d729 /usr/local/Library/Formula/git-ftp.rb
1.0.0    git checkout 84171b1 /usr/local/Library/Formula/git-ftp.rb
0.9.0    git checkout e8a43d8 /usr/local/Library/Formula/git-ftp.rb
0.8.4    git checkout 0c05a6a /usr/local/Library/Formula/git-ftp.rb
0.8.1    git checkout 174acd6 /usr/local/Library/Formula/git-ftp.rb
0.8.0    git checkout 2e9aeb9 /usr/local/Library/Formula/git-ftp.rb
0.7.5    git checkout a5759f4 /usr/local/Library/Formula/git-ftp.rb
0.7.4    git checkout 3590598 /usr/local/Library/Formula/git-ftp.rb
0.7.3    git checkout fc7d3b5 /usr/local/Library/Formula/git-ftp.rb
0.7.2    git checkout c914321 /usr/local/Library/Formula/git-ftp.rb
0.7.1    git checkout 61fb163 /usr/local/Library/Formula/git-ftp.rb
0.6.0    git checkout 8f1b568 /usr/local/Library/Formula/git-ftp.rb
$ cd /usr/local
$ git checkout e8a43d8 /usr/local/Library/Formula/git-ftp.rb
$ brew install git-ftp
$ brew doctor
$ git ftp version
git-ftp version 0.9.0
```

これで解決した。

気が向いたら issue に上げておこう。。

- [Issues · git-ftp/git-ftp](https://github.com/git-ftp/git-ftp/issues)


## 参考にしたリンク集

- [Homebrewメモ - Qiita](http://qiita.com/saba1024/items/0f397b3f59d28e0ef527)
- [Mac - homebrewでバージョンを指定してインストールする - Qiita](http://qiita.com/semind/items/f8f647e757842f08b9ec)
- [Homebrewで古いバージョンのアプリケーションをインストールする - Qiita](http://qiita.com/ryam/items/066818fd149e68a98797)
C言語でMariaDBを使う

#概要
公式から出ているCのドライバを使って
MariaDBにアクセスするサンプルを作りましたので、そのソースと手順などを共有したいと思います。


#環境構築
CentOSを想定しています。

```bash:centos7
yum install -y update
yum install -y vim gcc mariadb-server mariadb-devel # 色々インストール
systemctl enable mysqld.service                     # 自動起動
systemctl start mysqld.service                      # 起動
```

##データベースの設定
[mysql](http://qiita.com/Ki4mTaria/items/778ff9186bb4958bb667)と全く同じでした。

#MariaDBにアクセス
[mysql](http://qiita.com/Ki4mTaria/items/778ff9186bb4958bb667)と全く同じでした。

#コンパイル、実行
[mysql](http://qiita.com/Ki4mTaria/items/778ff9186bb4958bb667)と全く同じでした。
fluent-plugin-stdinで手軽にローカルのファイルを転送する


[logstash を使って手元にあるファイルを elasticsearch に取り込む](http://qiita.com/buzztaiki/items/a2d0d92a1ce070b89a37)を読んで，確かに標準入力から読み込めるとちょっと便利だなぁと思ったので標準入力からログを受け取る`stdin`プラグインを書いた．

- [repeatedly/fluent-plugin-stdin](https://github.com/repeatedly/fluent-plugin-stdin)

fluentdには`in_tail`があるので，複数ファイルを一気に転送とかだとそっちの方が楽だけど，1ファイルだけこまめに転送したいとか，テストでファイルを使いたい，みたいな場合に毎回設定ファイルを変更するのも面倒なので，そういう時にはこっちの方が便利．

## インストール

```sh
$ fluent-gem install fluent-plugin-stdin --no-document
```

## 使い方

上記の記事のLTSVの読み込みと同じようなことをする設定は以下(useragentフィルターが何やっているか分からなかったのでそこはスキップ)．

```aconf
# stdin.conf
<source>
  type stdin
  format ltsv
  types status:integer,size:integer # 任意のフィールドを数値に変換．ここではstatusとsize
</source>

<match stdin.**>
  type stdout
</match>
```

これに対して，以下のように実行してLTSVを流し込むと，標準出力に結果が出力される．

```sh
% cat ltsv.log | fluentd -c stdin.conf -q --no-supervisor
2015-01-01 12:00:00 +0900 stdin.events: {"host":"192.168.0.1","ident":"-","user":"-","req":"GET /index.html HTTP/1.1","status":200,"size":342,"refer":"http://www.example.com/","ua":"Mozilla/4.08 [en] (Win98; I ;Nav)"}
```

EOFに到達するとバッファをフラッシュしてストップするという少しトリッキーなプラグインになっている(`stop_at_finished`を`false`にすれば何もしない)．
`stdout`を`elasticsearch`にすれば，Elasticsearchにローカルのファイルをどんどん転送出来て，バルクロードっぽいことが簡単に実現できる．

コアにあってもいいかな？と思ったけど，まぁそんなにユースケースはないので，とりあえず3rd partyのプラグインとして公開した．

## バルクロードとFluentd

Fluentd(に限らずscribe, flume, logstashなどのログ収集ミドルウェア)は，ストリーミング的にデータを流すことを目標にしているので，バルクロードには向きません．もちろんそれっぽいことは出来ますが，パフォーマンスやトランザクションを含めた堅牢性などを考慮すると，相性が悪いです．実際`stdin`プラグインを書きましたが，バルクロードするのにこれを使うのは個人的にはオススメしません．
ということでそこを埋めるために，バルクロードに特化したツールEmbulkをOSSで近々公開します．1月27日にあるイベントで発表・公開するので，もう少しお待ちください．

- [データ転送ミドルウェア勉強会](http://eventdots.jp/event/312015)
- [データ転送ミドルウェア勉強会 - Blog by Sadayuki Furuhashi](http://frsyuki.hatenablog.com/entry/2015/01/19/100631)

Fluentd/Embulkのペアで，データ収集・転送の敷居をもっともっと下げて行きたいと思っているので．是非フィードバックを頂ければと思います :)
C言語でSQLiteを使う

#概要
SQLiteのCドライバを使って
SQLiteにアクセスするサンプルを作りましたので、そのソースと手順などを共有したいと思います。

#環境構築
CentOSを想定してます。

```bash
yum install -y update
yum install -y vim gcc sqlite sqlite-devel
```

###データベースの設定
テスト用のデータを入力します。

```bash
sqlite3 db_test.sqlite3                       # データベースファイル作成
create table tb_test(id integer,name text);   # テーブル作成
# testデータ投入
insert into tb_test(id,name) values(1,'aaa');
insert into tb_test(id,name) values(2,'bbb');
insert into tb_test(id,name) values(3,'ccc');
.quit                                         # 終了　
```

#SQLiteにアクセス
詳細な指定をしたい場合、sqlite3_open()よりもsqlite3_open_v2()、
sqlite3_exec()よりもsqlite3_open_v2()を使った方が良いです。

```c:sqlite.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
int print_resp( void * , int , char ** , char ** );

int main( void ){
  int ret       = 0;
  sqlite3 *conn = NULL;
  char *err_msg = NULL;
  char sql_str[255];
  memset( &sql_str[0] , 0x00 , sizeof(sql_str) );
  
  // アクセス
  ret = sqlite3_open(
          "./db_test.sqlite3" , // DBファイル名
          &conn                 // DBコネクション
        );
  if( SQLITE_OK != ret ){
    // error
    exit(-1);
  }
  
  // SQL文発行
  snprintf( &sql_str[0] , sizeof(sql_str)-1 , "select * from tb_test" );
  ret = sqlite3_exec(
          conn        , // DBコネクション
          &sql_str[0] , // SQL文
          print_resp  , // コールバック関数
          NULL        , // CB関数に渡す引数
          &err_msg      // エラーメッセージ
        );
  if( SQLITE_OK != ret ){
    // error
    sqlite3_close( conn );
    sqlite3_free( err_msg );
    exit(-1);
  }
  
  // 後片づけ
  ret = sqlite3_close( conn );
  if( SQLITE_OK != ret ){
    // error
    exit(-1);
  }  
  return 0;
}

int print_resp(
      void *get_prm   , // sqlite3_exec()の第4引数
      int col_cnt     , // 列数
      char **row_txt  , // 行内容
      char **col_name   // 列名
    ){
  printf( "%s : %s\n" , row_txt[0] , row_txt[1] );
  return 0;
}
```

##コンパイル、実行

-Lはlibsqlite3.soの場所を、-Iはsqlite3.hが配置されているディレクトリを指定します。

```bash
gcc -Wall -o sqlite sqlite.c -lsqlite3 -L/usr/lib64/ -I/usr/include/
./sqlite
1 : aaa
2 : bbb
3 : ccc
```
stringer を使う場合は import に注意


Go 1.4 が出て go generate コマンドが登場しました。 go generate コマンドの代表的な利用例として紹介されているのが stringer です。 新しもの好きな人は定数にどんどん stringer をかけていってることでしょう。

そんな stringer ですが、次のようなケースでちょっとハマりました。

```go:src/pkg/aaa.go
package pkg

import "pkg/sub"

//go:generate stringer -type=aaa
type aaa byte

const (
	a aaa = iota
	b
	c
	d
)

func Xyzzy(a aaa, b sub.bbb) {
}
```

```go:src/pkg/sub/bbb.go
package sub

func Hello() {}
```

```console
$ GOPATH=`pwd` go generate pkg
stringer: checking package: aaa.go:3:8: could not import pkg/sub (can't find import: pkg/sub)
src/pkg/aaa.go:5: running "stringer": exit status 1
```

## 原因

stringer がコード生成する際に、単に AST を作るだけじゃなくて型チェックなどまで行っていて、その中の import チェックでこけています。
GOPATH が通ってるのに import がコケてるのは、 `golang.org/x/tools/gcimporter` が `$GOPATH/pkg/` 配下から `$GOPATH/pkg/pkg.a` などのファイルを探していて、 Go のソースファイルは探していないせいです。

憶測ですが、Go のパッケージ名は慣習的にディレクトリ名と同じになっていますが、実際には package 文にはディレクトリ名以外の名前を指定することもできるため、コンパイラを呼び出さずに高速に解析するための制限なのかもしれません。

## 解決策1: go install する

上の例で言えば、 `go generate pkg` の前に `go install pkg/sub` しておけば sub.a が生成され、 import エラーが無くなります。

個人的にはビルド手順が増えてしまうのが嫌なのですが、ビルド高速化のためなどにプロジェクト全体ではなくパッケージ単位でビルドしている場合は自然にこの方法でエラーが回避できているかもしれません。

## 解決策2: ファイルを分割し、 stringer にファイル名を指定する

stringer のフラグ以外の引数は通常省略して、カレントディレクトリをパッケージとして解析させます。
通常は go generate が stringer を実行するときにカレントディレクトリを移動するのでこれでいいのですが、これではパッケージ全体から `-type` に指定した型を検索することになり、そのパッケージ内に1つでも install されてないパッケージの import があるとエラーになってしまいます。

そこで [stringer のドキュメント](https://godoc.org/golang.org/x/tools/cmd/stringer) を読んでみると、引数の説明は次のようになっています。

> With no arguments, it processes the package in the current directory. Otherwise, the arguments must name a single directory holding a Go package or a set of Go source files that represent a single Go package.

最後に "a set of Go source files that represent a single Go package" とありますが、 `-type` で指定した型の定義が読み込まれつつ静解析を通りさえすれば、本当のパッケージのソースコード全体を指定する必要はありません。

stringer をかけたい定数だけを集めたソースコードを切り分けておけば、そのソースコードは外部のモジュールを一切 import せず、かつ同一パッケージ内の他のファイルの定義も参照しないので、１ファイルでパッケージとしてコンパイルすることが可能になります。

上の例で言えば、次のようにファイルを分割することで、無事 go generate が成功します。

```go:src/pkg/aaa.go
package pkg

//go:generate stringer -type=aaa aaa.go
type aaa byte

const (
	a aaa = iota
	b
	c
	d
)
```

```go:src/pkg/xyz.go
package pkg

import "pkg/sub"

func Xyzzy(a aaa, b sub.bbb) {
}
```

個人的にはこの方法を一番おすすめします。

## 解決策3: package を分ける

go の const を enum 代わりに使う場合、 C# などに比べると型がenum値の名前空間にならない (`aaa.a` ではなく単なる `a` になる) ので、名前が衝突して困ることがあります。

go の標準ライブラリなどは慣習的にパッケージの粒度が比較的大きく、定数セットは prefix を付けて区別しているのですが、プライベートなプロジェクトでは enum ごとに型名と同じパッケージを作ってしまうのもいいかもしれません。

(その場合、値は `aaa.a` のようになる代わりに、型は `aaa.aaa` になってしまうのがあまりきれいではないですが。)
PhpStormを使うときにしておきたい初期設定メモ

【注意】PhpStorm8.0.2の環境で行っております。他バージョンと操作が違うかもしれませんのでご了承ください。

##カラースキームを変えよう
* [View]-[Quick Switch Scheme]-[Color Scheme]-[Monokai]

##行番号の表示
* [file]-[Settings]-[Editor]-[General]-[Appearance]
Show line numbers にチェック

###メモ
> Settings を表示するときのショートカットキー
> ctrl＋alt＋s

##Surround selection on typing quote or brace を有効にする
選択中にシングルクォートやダブルクォートをタイプすると選択領域をタイプした文字で囲むことができる

* [file]-[Settings]-[Editor]-[Smart Keys]

##Markdownを使えるようにする
* [file]-[Settings]-[Plugins]
Browse reposities　からMarkdownを選んでダウンロード/インストール

##Zen Coding・Live Templates
ul>li*3
Zen Codingは↑などと打ってTabキーを押せば変換。
Live Templatesもスニペットキーを入力してTabキーを押せば変換される。
> CD

↓

> <![CDATA[
]]>

##文字エンコーディングの変更
調査中

##ショートカットの変更
bluewindとショートカットがかぶっているためショートカットの変更。
* [file]-[Settings]-[Appearance & Behavior]-[Keymap]
ツリー部分から、[Main menu]-[code]-[completion]-[Basic]のショートカットを変更する。または（検索窓で【code】にて検索をする。）
僕の場合は Shift＋スペース に割り当てた。

#関連記事
http://qiita.com/knt45/items/356416f758502023b3e6
Eris Package Manager on golang.

# [Eris Package Manager(EPM)](https://epm.io/)?
The Smart Contract Package Managerとのこと。

# 念のため、gvmを入れておく。
[install-golang-on-ubuntu](http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/)を頼りにgvm入れる。
＃cf.[GVMを使って複数バージョンのGoを便利に切り替える](http://qiita.com/reoring/items/7344399ca6db99d2746f)

> $ gvm version
> Go Version Manager v1.0.22 installed at /home/kmry/.gvm
> $ gvm install go1.4
> Downloading Go source...
> Installing go1.4...
>  * Compiling...
>$ gvm list
>gvm gos (installed)
>  go1.4
> $ gvm use go1.4
>Now using version go1.4

# go install!

[ここ](https://github.com/eris-ltd/epm-go)のinstallに従ってインストールできる。

確認。
> $ epm -init
> $ cd elm_ex
> $ cat hello.elm
>main = plainText "hello"

さて、IoT時代のスマートコントラクトへの長い旅が始まります！？

```
The Eris Package Manager (EPM) is the first smart contract package manager. EPM allows developers to easily and simply compile, deploy, and test suites of smart contracts in a cohesive manner.
```
See,
https://epm.io/
ここいらでSublimeText導入についてまとめとく

# SublimeText導入時に忘れがちなことをまとめておく。
毎回毎回何かある度にググって探しているので、自分のアクセスしやすいところにまとめとくことにした。

## そもそもSublimeTextのダウンロード
これは書く必要ないかもしれないけど。
[公式]　http://www.sublimetext.com/

## 何は無くともパッケージコントロール
これはネットの記事に書いてある内容だとコードが古くなってたりして上手くいかない場合があるから本家サイトのリンクを。
https://packagecontrol.io/installation

この記事書いた時点でのSublimeText3のパッケージコントロール用のコード
```
import urllib.request,os,hashlib; h = '2deb499853c4371624f5a07e27c334aa' + 'bf8c4e67d14fb0525ba4f89698a6d7e1'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```

これを
```
Ctrl + `
```
のショートカットでコンソールウィンドウを出して、そこにコピペで、はい！

これで「insta」とか打つとパッケージのインストールが出来るようになる。

## お好みでパッケージを追加。
個人的にとりあえずこれだけは入れておきたいパッケージ。

- Emmet
- Hayaku
- LiveStyle
    - 開発者ツールからCSSがいじった内容がSublimeTextに反映されるやつ。
    - http://liginc.co.jp/web/tool/46648
- jQuery
- Sublimerge Pro
- View In Browser
- IMESupport
- ConvertToUTF8
    - Shift-JISとかのファイルを編集時にSublimeTextで扱えるようにUTF-8に変換して、保存するときにまたShift-JISで保存してくれるやつ。
- Goto-CSS-Declaration
    - HTMLのクラスからそのクラスのスタイルを書いてるCSSの該当部分までジャンプしてくれるやつ。これも重宝する。（でもショートカット忘れがち。
- GoToDocumentation
    - 組み込み関数とかを選択状態でF1押すとブラウザが開いて公式ドキュメントでの検索ページに遷移する。これはめっちゃ重宝する。
    - PHPならphp.netでの検索結果。JSならMDN。
    - ちなみにjQueryでやったときはgoogle検索の結果になった。たしか。


## テーマ

- ITG.FLAT
    - http://itsthatguy.com/post/70191573560/sublime-text-theme-itg-flat
    - 個人的にはこれが一番カッコいいと思う。色も2パターン選べるし。これ以外必要な気がしない。
- その他
    - http://liginc.co.jp/web/tool/other-tool/72241
    - こういうのはもうLIGさんにおまかせ。

## テーマの設定とフォントサイズ

```
Ctrl + Shift + P
```
でいつものあれを呼び出して
「user」とか入力すると「Preferences: Settings - User」というのが出てくるからそれを選択。

出てきたファイルにこう書けば

```
{
	"font_size": 13.0
}
```

フォントサイズが13になるし、こう書けば

```
{
	"font_size": 13.0,
	"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
	"itg_sidebar_tree_xlarge": true,
	"itg_small_tabs": true,
	"theme": "itg.flat.dark.sublime-theme"
}

```
ITG.FLATが設定できる。
とりあえずはこれでコードが書けるようになった。

## 何はともあれ詳細はまた今度。
パッケージとかショートカットとかテーマとか色々まとめときたいけど
今はとりあえずこのくらいにしとこう。（めんどくさくなtt
必要に応じて後で追記。
文字列日付からDate型への変換

Javaで文字列で渡された日付形式をDate型に変換する。

Webシステムにおいて、入力値にある日付の妥当性チェック等を行う
時に使う際のメモ。

```Java:ConvertDateFromString
public class ConvertDateFromString {

	public static void main(String[] args) throws ParseException {
		
		// 変換対象の日付文字列
		String dateStr = "20140101 00:00:00";
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		
		// Date型変換
		Date formatDate = sdf.parse(dateStr);

	}

}
C#のプロパティ

C#はメンバ変数の代わりにプロパティを定義しやすくするために、プロパティの自動実装機能が追加されているので、publicメンバ変数は定義するべきではなく、独自のget関数やset関数を用意することもよくないらしい。

書き方

```csharp
private int hoge;
public int Hoge
{
    get { return hoge; }
    set { hoge = value; }
}
```

privateメンバ変数を省いた形

```csharp
public int Hoge{get;set;}
```

関数扱いらしいので仮想関数にもできる

```csharp
public virtual int Hoge{get;set;}
```

片方だけアクセス修飾子をかえたりもできる

```csharp
public int Hoge{
    get;
    protected set;
}
```
Unityで回転したかったお話


Unityでオブジェクトを指定した角度分回転したかっただけ…なのだけど結構時間をかけてしまったので残しておく…。
結果的には回転させる方法よりも角度を比較する方法が大事だったってお話。


##ただ回転させたいだけならRotate
```Transform.Rotate
transform.Rotate(new Vector3(0f,90f,0f)); // y軸を軸として90°回転
```

- この方法だと一瞬でその方向に回転する。
- なめらかな回転がしたかったので他の方法を考えることに。



##オブジェクトの角度情報を持つメンバ
- transform.rotation だと Quaternion 型で得られる。
- transform.eulerAngles だと Vector3 型で得られる。



##試行錯誤
###eulerAnglesに直接加算する
```
if (Mathf.Abs (leftRotation - 90f) > 0.1f) {
  leftRotation += 5f;
  transform.eulerAngles += new Vector3 (0f, -5f, 0f);
}
```
- eulerAngleで取ってきたオブジェクトに直接値を足して行く方法。
- ちゃんと滑らかに動く。
- でも今どこまで変化したか覚える変数がなんかダメな感じしたので消したくて却下。
	- 後になって考えたら条件を直せば消せた。

###Quaternion.Slerpを使う
```
transform.rotation = Quaternion.Slerp(transform.rotation,newRotation,Time.deltaTime);
```
- unity 回転 滑らか で検索するとコレを使う方法が多く引っかかった。
- 向きは同じでも newRotation と transform.rotation の値に違いが出ることがあり、回転終了の検出が難しく断念

###LeapAngleを使う

```LeapAngle()
if　(Mathf.Abs((transform.eulerAngles.y - fixAngleY(newAngle).y)) > 0.1f){
  transform.eulerAngles = new Vector3(0f,Mathf.LerpAngle(transform.eulerAngles.y,newAngle.y,Time.deltaTime),0f);
}
```
- LerpAngleはLeapの角度に対応したバージョンみたいなもの。これだと0と270を与えた時に0から270ではなく、0から-90(近い方に回転するように値が変化する)ようになる。
- 動作的にはコレでもいけたけれど回転終了に向かうに連れて回転速度が落ちるのが気に入らなかったので却下。

- DeltaAngleは与えた二つの角度の差を-180°〜180°の範囲内で返してくれる。
	- 例えば100と360を与えたら-100が返る。



##結局以下のようにした
```
if　(Mathf.DeltaAngle(transform.eulerAngles.y,newAngle.y) < -0.1f){
  transform.Rotate (new Vector3 (0f, -5f, 0f));
}
```

- 角度の比較が正しく行えるようになったので指定した角度に辿り着くまでちょっとずつRotate()
- 直接加算する方法と結局は同じ…だと思う。
- 比較部分について
	- DeltaAngleは与えた二つの角度の差を-180°〜180°の範囲内で返してくれる。
		- 例えば100と360を与えたら-100が返る。
	- 今回の場合、右回転の必要があれば正、左回転の必要があれば負、回転する必要がなければ0が帰ってくるのでそれでどう回転するかを判断する。
		- 実際には小数の演算誤差があるので0.1の猶予を与えている。

-----

最初に言ったように回転させる方法よりも回転終了の検知を行うための向きの比較に手こずっていた感じでした。はじめから回転方法じゃなくて向きの比較方法に注目していれば時間はかからなかったかもしれません…。


本当はこう書くのが良いという意見があれば教えていただければ幸いです。
プログラマになること#8


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#教え子1
初年度の出来るPGコースの学生さん。
私と関係者が紹介する「超優良企業」への紹介を断り続けます。
不思議でした？わからんぞ…
彼がある日言いました。
「僕は出来の悪い子のことが良く分かるんです。」
「そういう子たちの味方でありたいと思っています。」
「先生たちの紹介はありがいけど、オタクの代表として自分で選びます。」
これには感動しました。
「分かった。意思を貫こうぜ。」

#教え子2
グラフィックデザインのコースの女の子
彼女の事情は省略。
とにかく、Webで就職。良かったね。
なんとびっくり、結婚してました。おーい！

#報告
血はつながってないが、息子と娘の娘が生まれました。
可愛すぎる。私が生きてるうちに見せにきてね。
厳しく教えた甲斐があったなぁ。
ありがとう。

＃総括
彼も彼女も決して、裕福では無い環境で育っています。
でも、頑張って、頑張って、幸せを見せてくれました。
コンピュータって、本当に平等なのです。
みんな、てきとーに頑張ろう。
過労死はいかんぞ。
Atomのatom-beautifyでRubyのソースコードを半角スペースでインデントする方法

Rubyのソースコードを半角スペース２つでインデントしたいのですが [Ruby beautification support #25](https://github.com/Glavin001/atom-beautify/issues/25) にあるように現在の`atom-beautify`では対応していないようです。なのでラッパースクリプトで対処しようという作戦です。

以下要点です。

- `atom-beautify`はRubyのソースコードの整形に`rbeautify`を使っている。
- `rbeautify`はコマンドラインオプションでタブやスペースは字下げ数を設定できる。
- でも`atom-beautify`ではコマンドラインオプションの指定をサポートしていない。
- でも`rbeautify`のパスは指定できる。
- なので「オプションを追加して`rbeautify`を実行するRubyスクリプト」を一段かませれば良いんでね？

というわけで以下のRubyのソースコードを用意する。

```/Users/masayuki/.bin/rbeautify
ARGV = %w(--spaces --indent_count 2) + ARGV
load '/Users/masayuki/.gem/ruby/2.2.0/bin/rbeautify'
```

そいでAtomの設定画面を開いて`Ruby beautify path`に上記スクリプトのパス`/Users/masayuki/.bin/rbeautify`を指定すればOKですた。
Kinoma Create に Grove モジュールをつなぐ

# Grove とはなにか？
Grove System は、特定のコネクタをもった電子部品をケーブルでつなぐことにより、簡単に電子工作ができるようにしたものです。はんだづけやブレッドボードでの配線が必要ないので、簡単に電子工作が楽しめます。いわゆる学研電子ブロックのようなものです。（ケーブルでつなぐとこは違いますが。。。）
単にコネクタの形状とピンの配置(4ピン)を規定しているだけなので、Arduinoをはじめ、いろいろなマイコンにシールドを介して繋ぐことができます。

現在、センサーモジュール、通信モジュール、ユーザーインタフェースモジュールなどの様々なモジュールが入手できます。
http://www.seeedstudio.com/wiki/index.php?title=GROVE_System

* [shu233さんのGroveの説明](http://qiita.com/shu223/items/0fe5a932ea52aa7a2c94)
* [SwitchScienceさんで購入できます](https://www.switch-science.com/catalog/list/145/)

# Grove + Kinoma Create
前におもしろいなと思って、[GROVE - スターターキットV3](https://www.switch-science.com/catalog/1812/)を入手したのですが、Groveで簡単になったとはいえ、試すのが結構大変なんですよ。Arduinoシールドが梱包されていて、サンプルプログラムもダウンロードできるのだけど、動作確認は結構大変です。

一方、Kinoma Create に付属のサンプルプログラムのなかにある [analog-graph](http://kinoma.com/create/samples/analog-graph/)をつかえば、大抵のアナログセンサーは動作確認できます。Arduinoでも同様なことは、少しプログラムすればできるとは思うけど。。。すぐに使えるってすごく重要だと思う。

というわけで、Groveモジュールと Kinoma Create を繋ぐ方法ですが、
[GROVE - 4ピン-ジャンパメスケーブル](https://www.switch-science.com/catalog/1048/)があるといいのだがないので、GROVE - スターターキットV3についてきた[Grove - ベースシールド](http://www.seeedstudio.com/wiki/Base_shield_v2)を使う。大きいけどね。
メリットは、電源が来てるとちゃんとLEDが光るところです。
ベースシールドの裏面の配置に従い、3.3V電源を赤い線、GNDを黒い線、Analog 0 を黄色い線で繋ぎます。

##ボタンスイッチ
スイッチを押すと 0 になります。普通逆じゃないかな。
![grove1.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/a91737a0-5bcc-35b6-6e7b-6de54be27ae1.jpeg)

##光センサー
[サンプルプログラム](http://kinoma.com/create/samples/analog-graph/)と同じことができます。光を手で遮って暗くすると暗いほど１に近づきます。これも普通逆だよな。
![grove2.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/21f11646-eda9-cf4d-40ed-14c1d05a6668.jpeg)

##サウンドセンサー
叫ぶと、波形があらわれます。
![grove3.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/eed19297-dbf5-0578-d48b-78ad53702cbb.jpeg)

##回転角度センサー
つまみになっていて、回転角度によって、値が変化します。
![grove4.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/9c7dc0be-00d2-7a28-2057-42a538fe2803.jpeg)

##タッチセンサー
LEDはいつも光っています。指でタッチすると、0になります。これも逆じゃないかな？
![grove5.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/0110a510-4161-e6f4-5155-c40fb2245847.jpeg)

##PIRモーションセンサー
これは、スターターキットについてきたわけでなく、別途入手したものです。120度の範囲で、人が動くと、1になるそうですが、逆だな。。。動くと0になるからなぁ。

このアプリはアナログの値を逆に表示してるのかなぁ。

http://www.seeedstudio.com/wiki/Grove_-_PIR_Motion_Sensor
Measuring Range: 3m by default (support 0.1 - 6m)
Holding Time: 1 - 25s
Working Wave Length: 7 - 14um
Detecting Angle: 120 degree
![grove6.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/bbf77e2d-6edd-de99-17f4-813f5eaece6c.jpeg)

# おわりに
アナログ出力のGroveセンサーを Kinoma Create につなげてみました。
すごく簡単に動作確認できました。センサーごとにプログラムを用意しなくてもチェックできるのはいいですねぇ。

Grove のように簡単に電子工作ができるようなキットは、以下のようなものがあります。ケーブルが必要ないので、Groveよりも簡単かもしれないです。できたら試してみたいです。

* [Tessel](https://tessel.io/)
* [littlebits](http://jp.littlebits.com/)
* [Mesh](http://meshprj.com/)
Vagrant+Docker してホストOSのWinでもSyncしたい

# 何がやりたいのか

boot2docker使わないで、vagrant でゲストOSに

* Apache
* PHP
* MySQL

とか盛り込んだdockerコンテナを立てて動かす、かつ
vagrant のゲストOS内でたてたコンテナでデータをマウント、かつ
そのマウントしたデータをホストOS(Win)とsyncする。

そんな多段的なことする必要あるのかはわからない。

## 環境

* Win7
* VirtualBox
* Vagrant
* ゲストOS：CoreOS

## CoreOSという選択

docker がすぐ使えるから。

```bash
$ git clone https://github.com/coreos/coreos-vagrant.git
```

### vagrant up 前にやっておきたいこと

少しVagrantfile編集しておく。

#### ネットワーク周りを調整

```ruby:Vagranfile
ip = "172.17.8.#{i+100}"
config.vm.network :private_network, type: "dhcp", ip: ip
config.vm.network :public_network, type: "dhcp"
```

`i`っていうのは今は考えない。インスタンス増えた時にマッピングできる何か。

#### ホスト、ゲスト間のトポートフォワーディング

```ruby:Vagrantfile
config.vm.network "forwarded_port", guest: 80, host:8080
```

#### ホスト、ゲスト間でsyncするディレクトリ

```ruby:Vagrantfile
config.vm.synced_folder "./app", "/app", type: "rsync"
config.vm.synced_folder "./data", "/data", type: "rsync"
```

（※ mac の人は `type: "nfs"` とか使えていいですね！
http://2no.hatenablog.com/entry/2014/10/23/033125
いろいろ調べたけど、結局Winでnfs使えなかった。）

の後に、

```bash
$ cd coreos-vagrant
$ vagrnt up
```

## docker で起動したかったWebアプリ

joomlaです。

https://github.com/dell-cloud-marketplace/docker-joomla

```bash
$ vagrant ssh
ここからゲストOS
core@core-01 $ docker run -d \
    -p 80:80 \
    -p 443:443 \
    -p 3306:3306 \
    -v /app:/var/www/html \
    -v /data/mysql:/var/lib/mysql \
    -e MYSQL_PASS="password"  \
    --name joomla \
    dell/joomla
```

一度runしたら、あとは`docker start joomla`とかでいいです。

この時点で、ゲストOSのディレクトリをマウントしてるんだけど、ホストOSには存在してないから、scpとかでコピーしてた。

```bash
$ scp -r -i ~/vagrant.d/insecure_private_key core@core-01:/app ./
```

とかですかね。mysqlのデータとかscp出来なかったら、chmodで変えてコピーしたりしてた。あんまりかっこ良くない。


## アクセス

おそらく、http://172.17.8.101 でアクセスできるはず。
ネットワーク上のipのときは http://x.x.x.x:8080 とか。

このままだとホストOS側と同期しないので、ホスト側で

```bash
$ vagrant rsync-auto
```

でもこれ結局ホスト->ゲストの一方向なので。
ゲスト側での変更もホスト側に同期しなきゃって時は

```bash
$ vagrant plugin install vagrant-rsync-back
$ vagrant rsync-back
```

してください。残念、autoではない。

本日は以上です。
BonjourでHello World

# はじめに

Bonjourは米アップルが開発したゼロ・コンフィギュレーション技術の実装で、主にLANにおいて何の設定も行わず機器を利用可能にすることができます。

Bonjourは、「サービスを発行する」と「サービスを検索する」に分かれています。
OS X/iOSは、どちらの役割にもなることができOS X同士、iOS同士、OS XとiOSの組み合わせが可能です。


今回は、OS Xがサービスを発行しiOSがサービスを検索したいと思います。

# OS X(サービスを発行する)

```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController, NSNetServiceDelegate {
	let service = NSNetService(domain: "", type: "_test._tcp", name: "Hello World", port: 1900)
	
	override func viewDidLoad() {
		super.viewDidLoad()

		// Do any additional setup after loading the view.		
		self.service.delegate = self
		self.service.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
		self.service.publish()
	}

	override var representedObject: AnyObject? {
		didSet {
		// Update the view, if already loaded.
		}
	}

	func netServiceDidPublish(sender: NSNetService) {
		println(sender.description)
	}
}
```

NSNetServiceでサービスを作成します。
domainは空文字を指定するとローカル全体になります。
typeには任意の文字列を指定可能で、`_文字列._プロトコル`という形式が一般的のようです。


# iOS(サービスを検索する)


```swift:ViewController.swift
mport UIKit

class ViewController: UIViewController, NSNetServiceBrowserDelegate {
	let browser = NSNetServiceBrowser()
	
	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
		
		self.browser.delegate = self
		self.browser.searchForServicesOfType("_test._tcp", inDomain: "")
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}

	func netServiceBrowser(aNetServiceBrowser: NSNetServiceBrowser, didFindService aNetService: NSNetService, moreComing: Bool) {
		
		println(aNetService.name)
	}

}
```
NSNetServiceBrowserを作成します。
typeとinDomainにはOS Xで指定したものと同じものを指定します。

# 実行

OS Xのアプリケーションを起動してからiOSのアプリケーションを実行します。
iOSのアプリケーションに`Hello World`と表示されれば成功です。

# 次回

次回は、iOSアプリケーションから見つけたOS Xに簡単なメッセージを送信したいと思います。
Windowsのコマンドプロンプトでファイルを取得するには？

# 概要
Linuxの`curl`やwgetを使うように、コマンド・プロンプトやバッチ中にファイルを取得したい場合、`bitsadmin.exe`を用いると、追加のアプリケーションをダウンロードせず、Windows 標準の機能で利用できるため、作業時間を短縮できる。

動作確認は Windows7 (64bit)

# 書式

```
> bitsadmin.exe /TRANSFER <ジョブ名> <リモートURL> <ダウンロード先>
```
例
* ジョブ名: htmlget ※任意
* リモートURL: http://pocketstudio.jp/index.html
* ダウンロード先: C:\temp\index.html ※記述はフルパスの必要性ありかつ、ディレクトリは実在していること。

```
> C:\>bitsadmin.exe /TRANSFER htmlget http://pocketstudio.jp/index.html c:\temp\index.html

```
![bitsadmin-img02.png](https://qiita-image-store.s3.amazonaws.com/0/13002/758ac773-cd78-6f9c-eb44-2eb56e53bacb.png)

画面に `Transfer complete.` が出ればダウンロード完了。



## 参考

> bitsadmin.exe help
ファイル中で指定しているカラーコードを把握する #進捗を支える技術

どうもシリアルパッケージクリエイター見習いです。

呪文のような**カラーコード（`#000000`, `#FFFFFF`の違いすら曖昧）を覚えることができない**ので、ファイルを見返してカラーコードを確認することがあります。しかし、そんなこともいちいちやっていると面倒なので、簡単にファイル中のカラーコードを把握したい、というもの。

## color_picker: そんな関数

> より正確にカラーコードを取得するよう、なおかつコードの可読性を高めるために@hoxo_mさんがコメントしてくれました。感謝。


```r
# 関数の定義
color_picker <- function(file, show = TRUE, ...) {
  col <- readLines(file, warn = FALSE) %>%
  stringr::str_match_all("[\"\'](#[0-9a-fA-F]{6})[\"\']") %>% 
  Filter(function(x) length(x) != 0, .) %>%
  Map(function(x) x[,2], .) %>% 
  unlist %>%
  unique %>%
  print
  
  if(show == TRUE) {
    colortools::pizza(col)
    } else {
      NA
    print(col)
    }
}
```

要 `magrittr`, `stringr`, `colortools`

```r
# 使い方
# test.Rというファイル内で指定されているカラーコードを返します
# show = TRUEにするとpizzaができあがります（笑
color_picker("test.R", show = FALSE)
# [1] "#000000" "#FFFFFF" "#9E9E9E" "#87CEEB" "#32CD32"
```

**色名とかは無理**。シャープではじまるカラーコードにのみ対応。上手くいかないこともあるから気をつけてください...。

`colortools`パッケージの`pizza関数`を使わせてもらって、プロットもしちゃいます。pizzaの代案としては`popbio`パッケージの`colorguide関数`がありましたが、そこはお好みで。

## 宣伝

まだ全然機能がないですが、R使いのためのデザインツールパッケージ（[uribo/designer](https://github.com/uribo/designer)）を開発中です...

```r
devtools::install_github("uribo/designer")
```

**男の価値は作ったパッケージの数で決まる**、ということなのでじゃんじゃん~~無駄な~~パッケージを作っていきたい所存です。
[Swift]型の違う値を同じ配列に入れる

[“Swift 型　Array”あたりでググっても](https://www.google.co.jp/?gws_rd=ssl#newwindow=1&q=Swift%20%E5%9E%8B%20Array)、日本語での解決策記事が見当たらないので、発表時点からSwiftを触っている上級者ならいざ知らず、私のようなiOS開発初心者がいきなりSwiftから触るケースに関しては、上記のようなタイトルで記事があったほうが良いかな？と思い共有します。
![スクリーンショット 2015-01-19 22.50.33.png](https://qiita-image-store.s3.amazonaws.com/0/10766/c85178d2-afbb-a71a-c2ed-79d7540231cb.png)


#解決策

```
var arrayWithAnyType :[Any] = [/* You can insert here any initial values  */]
```

です。
##核心は```:[Any]```にあります。下記は[こちら](http://qiita.com/worthmine/items/40bfdd8f1f75bfe3463a#comment-05e6d66929660054f1a2)からの引用です。
>>単にSwiftのArrayを拡張しただけなので、型の混在する配列は作れません

>とありますが、これはswiftの仕様により「黙示的Any」が認められないためです。
明示的にAnyと書けば通ると思います。

>```
var a :Array = ["String", "String2", "String3" ]
var b :Array = [4, 7, 8 ]
var c: [Any] = [a, b, 0]
c.shift() // -> ["String", "String2", "String3"]
```

>ちなみに import Cocoa を書いてしまうと (黙示的なAnyが認められないのは同じですが) 自動的にNSArrayとして処理されてしまい、エクステンションが存在しないということでエラーとなるようです。

##では検証していきましょう。

```
class Foo {}
let aClass :Foo = Foo()
let anArray :Array = [0, 1, 2]
let anInt :Int = 0

// 普通にArray型であると明示的に示すと
var array :Array = ["String" ]
array.append(aClass)    // Error "'Foo' is not convertible to 'String'"
array.append(anArray)   // Error "'[Int]' is not convertible to 'String'"
array.append(anInt)     // Error "'Int' is not convertible to 'String'"
// 上記全て怒られます
array.append("Another") // ->["String","Another"] //唯一怒られません
```

これは```var array :Array<String> = ["String” ]```と明示的に書いたものの省略形とみなされるからです。初期値に文字列型を代入しているため、その時点でこれは文字列を扱うための配列だとみなされるのです。

##```:[Any]```で宣言してみましょう。

```
var arrayWithAnyType :[Any] = ["String"]
arrayWithAnyType.append(aClass)     // -> ["String", Foo]
arrayWithAnyType.append(anArray)    // -> ["String", Foo, [0, 1, 2]]
arrayWithAnyType.append(anInt)      // -> ["String", Foo]
arrayWithAnyType.count              // -> 4 // 3要素追加できてます
```
省略しない記述は```var arrayWithAnyType :Array<Any> = ["String”]```です。

##こんなの何に使うんだ？
と思われる方は多いと思いますが、私はここ一週間一生懸命[こういうの](http://qiita.com/worthmine/items/40bfdd8f1f75bfe3463a)を書いていました。