OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する

2017/01/17追記
Herokuのプランが変更されたようです。
詳しくは、[コメント欄](http://qiita.com/akameco/items/39a55635ceb0ba185b7f#comment-657943f85bc20721a313)を参照してください。
追記ここまで

---

みなさん、bot活用していますか？
どんどん便利なスクリプトを追加し、日々の業務や生活になくなてはならない存在になっていると思います。しかしながら、botをどこで運用するかという悩ましい問題があります。少し前ならheroku一択でしたが、herokuのプランが変更され24時間完全に無料で運用することが難しくなりました。

## herokuで運用する問題点
herokuは素晴らしい環境です。が、無料でbotをつくるとなると話は少し変わってきます。

- 30分アクセスしなければスリープ
- 24時間連続で動かすことができない(6時間のスリープ)

hubot-heroku-keepaliveによって30分のスリープの問題はいいですが、24時間稼働できないのはどうしようもありません。まあ、[最悪な方法](http://qiita.com/akameco/items/69fbeb99edad533c3ffa)を使えば24時間運用は可能ですが、バカバカしいですよね。

そこで、IBM Bluemixです。

## Bluemixとは何か。
いわゆるPaaSで、一言で説明するとHerokuみたいなもの、という雑な認識です。Bluemixについて、詳しく知りたい方はググれば素晴らしい記事が見つかるでしょう。とゆうのもbot以外使っていないので、誤解を生んでは申し訳ありませんし、これ以上の言及は避けたいです。逆にいうと、こんな認識でもさくっと使えるということでご容赦ください。herokuからbluemixに移行する所要時間は多くて30分ぐらいを見積もればいいでしょう。

さて、Bluemixには無料枠があります。この無料枠を使ってbotを運用しようというわけです。1ヶ月あたり365GB時間のメモリー,2 パブリック IP アドレス,20 GB 外部ストレージが無料で使えます。詳しくは下のリンクを見てもらえばいいですが、つまるところ、botを無料で運用できるということです。

- [料金 - IBM Bluemix](https://console.ng.bluemix.net/pricing/)

なお、無料で運用できますが、クレジットカードの登録が必要です。Bluemixの無料枠については、詳しいまとめ記事があるので参考にしてください。

- [クラウドサービスIBM Bluemixを無料で使うノウハウまとめ - Qiita](http://qiita.com/zuhito/items/86e7ad47d14937d3e9b6#_reference-a3c8d97a4441b514a91d)

## 登録やインストール

Bluemixの登録については、キャプチャ付きの素晴らしい記事があります。

- [IBM Bluemixフリートライアルアカウント作成手順 - Qiita](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)

hubotをBluemixへの導入するには、以下のhubotのdocsを参照してコマンドを叩いていくだけです。

- [hubot/bluemix.md at master · github/hubot](https://github.com/github/hubot/blob/master/docs/deploying/bluemix.md)

herokuに`heroku toolbelt`があるのと同様`cf`コマンドでコマンドラインから操作できます。
macの人は、brewからインストールできます。

```
$ brew tap cloudfoundry/tap
$ brew install cf-cli
```

helpも日本語にできるので迷うことはないでしょう。

- [cloudfoundry/cli: A CLI for Cloud Foundry written in Go](https://github.com/cloudfoundry/cli)

新規につくるのではなく、すでにあるbotを移行する場合でも、procfileの代わりに`manifest.yml`を追加するだけです。

```manifest.yml
applications:
- buildpack: https://github.com/jthomas/nodejs-v4-buildpack.git
  command: ./bin/hubot --adapter slack
  path: .
  instances: 1
  memory: 256M
```

公式のreadmeままですが、slackのbotの場合、以下のコマンドで稼働できます。herokuと似たようなものですね。細かいコマンドはhelpを参照してください。また、apiに設定するurlはこれと異なるかも知れません。

```
$ cf api https://api.ng.bluemix.net
$ cf login
$ cf push bot名
$ cf set-env bot名 HUBOT_SLACK_TOKEN slackのトークン
```

また、herokuのgithubコネクトと同様にBluemix側にgitのレポジトリを指定すれば、githubにpushからの自動アップデートが実現できます。

## まとめ

IBMを使うと無料でbotが運用できるよという話でした。
それでは、よいbotライフを。

## 参考

- [IBM Bluemixフリートライアルアカウント作成手順 - Qiita](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)
- [hubot/bluemix.md at master · github/hubot](https://github.com/github/hubot/blob/master/docs/deploying/bluemix.md)
- [cloudfoundry/cli: A CLI for Cloud Foundry written in Go](https://github.com/cloudfoundry/cli)
- [料金 - IBM Bluemix](https://console.ng.bluemix.net/pricing/)
- [クラウドサービスIBM Bluemixを無料で使うノウハウまとめ - Qiita](http://qiita.com/zuhito/items/86e7ad47d14937d3e9b6#_reference-a3c8d97a4441b514a91d)
技術英語 > The sport originated in nomadic times / date back to / named after

January 31, 2003

http://loe.org/shows/shows.html?programID=03-P13-00005

> The sport <font color=red>originated</font> in nomadic times

<hr>
関連して思い出したのは

http://www.macmillandictionary.com/dictionary/british/date-back-to

> a large collection of records <font color=red>dating back to</font> the 1950s

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/2dc75f293593fd1bd5ec

> emile.js is <font color=red>named after</font> Emile Cohl
TL/1 でズンドコキヨシ

ここしばらく[ズンドコキヨシ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)のブームが来ているようですが、様々な言語での実装が出そろってきてしまったのでレトロなプログラミング言語 [TL/1](https://ja.wikipedia.org/wiki/TL/I) で書いてみました。

```
VAR ZUN, R
BEGIN
  ZUN := 0
  REPEAT
    R := LSR(RND(4)-1)
    IF R = 0 THEN {
      WRITE(0: "ｽﾞﾝ ")
      IF ZUN < 5 THEN ZUN := ZUN+1
    }
    ELSE {
      WRITE(0: "ﾄﾞｺ ")
      IF ZUN # 4 THEN ZUN := 0
    }
  UNTIL R=1 .AND. ZUN=4
  WRITE(0: "ｷ･ﾖ･ｼ!")
END
```

実行すると以下のように表示されるはず……なんですが、当時の処理系が動く環境を持っていないので本当に動くかわかりません。 資料を基に作った自作処理系で動作することは確かめたんですが。

```
ｽﾞﾝ ﾄﾞｺ ﾄﾞｺ ｽﾞﾝ ｽﾞﾝ ｽﾞﾝ ﾄﾞｺ ﾄﾞｺ ﾄﾞｺ ｽﾞﾝ ｽﾞﾝ ｽﾞﾝ ｽﾞﾝ ﾄﾞｺ ｷ･ﾖ･ｼ!
```
[小ネタ]MacからEC2のWindowsServerにRDPで接続する

初めてだったのでメモ

# 環境

+ 接続元ローカルマシン(Mac OSX 10.11.3)
+ 接続先EC2(Microsoft Windows Server 2012 R2 Base)
+ 接続はRDP(RemoteDesktopProtocol)を使う
+ すでにEC2用のKeyPairは作成済み

# リモートデスクトップ用アプリのインストール

MacでRDPを使うためのアプリをインストールします。

+ AppStore
+ Microsoft Remote Desktop

おそらくRDP対応のアプリは色々あるのかと思うので好きなものを使って良いと思いますが、最初はMSの公式のもので

# EC2の起動

EC2の起動を行います。

+ AMI選択時にWindowsServer2012を選択
+ SecuirtyGroupではRDPプロトコルによる接続を許可します。(TypeでRDPがあるので選択。内容としてはTCPの3389ポート)必要に応じてIPによる絞り込みを行った方が良いと思われます
+ 作成済みのKeyPairを指定

# 接続時のパスワードを取得

RDPによる接続時のパスワードを取得します。

GUIの場合には

対象のインスタンスを選択->右クリック->Get Windows Password

を選択し、指定したKeyPairの秘密鍵(hogefuga.pem)の内容をコピペか、ファイルで選択することでパスワードが表示されます。

CLIから以下でコピ-できるので使うと簡単

```bash
$cat .ssh/hogefuga.pem | pbcopy
```

またAWS CLIをインストールすれば以下のワンライナーで取得できる

```bash
$aws ec2 get-password-data --instance-id i-89dc342d --priv-launch-key ~/.ssh/hogefuga.pem
{
    "InstanceId": "i-89dc342d",
    "Timestamp": "2016-03-18T15:31:04.000Z",
    "PasswordData": "xxxxxx"
}
```

# RDPで接続してみる

リモートデスクトップアプリを起動し、Newより以下を設定

+ PCName->[EC2のPublic DNS名を指定.ec2-xxxx.ap-northeast-1.compute.amazonaws.comなど]
+ UserName->Administrator
+ Password->先ほど取得したパスーワード

これでStartを選択すれば起動できます。

<img width="1247" alt="Screen Shot 2016-03-19 at 6.02.56 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/20193/ce0bf2d5-3ee9-f42f-1055-e7be821ef80a.png">

パスワード以外の設定情報はマネージメントコンソールで対象のインスタンスを選択し、右クリック->Connectによって設定ファイルが取得できるのでこれを利用するもの良いかと思います

# 接続できない場合の確認ポイント

+ SecurityGroupでTCP3389ポート(RDP)の接続を許可しているか
+ ネットワークACLで上記接続を許可しているか
+ 接続先、ユーザー名、パスワードが間違ってないか。入力誤りの可能性もあるので接続できない場合、マネージメントコンソールからダウンロードしたもので接続確認をするのもあり
+ EC2のstop/startしていないか。stop/startするとPublicIPが変わるので接続用のホスト名も変わるので注意
MacbookProの容量整理した時のメモ

# キッカケ

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">brewの整理を行ったら12Gぐらいディスク容量が回復した。<br>キャッシュの量はすごいな。</p>&mdash; nanoeru (@nanoeru7083) <a href="https://twitter.com/nanoeru7083/status/710880376491679744">March 18, 2016</a></blockquote>

`brew cleanup`!! 恥ずかしながら知らなかった

そうか古いパッケージは残ってるのか

@nanoeru さん、ありがとうございます！

# brew cleanup

```bash:cleanup前
$ df -h
Filesystem      Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1     465Gi  263Gi  201Gi    57% 69075065 52764549   57%   /
```

```bash
$ brew cleanup
```

```bash:cleanup後
Filesystem      Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1     465Gi  249Gi  215Gi    54% 65374198 56465416   54%   /
```

僕の環境では16GB空きました！やったぜ！

# ホームディレクトリも整理したくなった

作業は基本的にホームディレクトリ直下なので
とりあえずホームディレクトリは大変なことになってるのではと思ったためです。

まずはどのディレクトリが容量を食ってるのか確認します。

とりあえずギガ単位で食ってるものを確認しました

```bash
$ du -sh ~/* > result
$ du -sh ~/.* >> result
$ cat result | grep G | sort
19G	/Users/kazu/Documents
 30G	/Users/kazu/Library
2.6G	/Users/kazu/Games
2.9G	/Users/kazu/.android
3.1G	/Users/kazu/.docker
3.4G	/Users/kazu/.gradle
3.4G	/Users/kazu/.gvm
4.5G	/Users/kazu/Workspace
5.8G	/Users/kazu/.Genymobile
7.8G	/Users/kazu/Movies
```

とりあえず　消しても問題なさそうなところはサクサクとrm -rf で消していきます。

```bash
$ rm -rf ~/.gvm # Goのバージョンマネージャー　使ってない
$ rm -rf ~/.Genymobile # 最近はエミュレーターが速くなったので使ってない
$ rm -rf ~/Games # ゲーム作ろうとしてテストしてた残骸
```

MovieはiMoveのライブラリが8GB取っていたようです。
動画の編集は最近やらないので消しちゃいます。

nodebrewなども使わずに残っていたバージョンは削除して１G消えました。

# 最終結果

```bash
$ df -h
/dev/disk1     465Gi  229Gi  235Gi    50% 60171780 61667834   49%   /
```

結果３４GBの無駄なファイルを消しされました。

VMとかはどうしても容量食ってしまうのは仕方ありませんが、
定期的に無駄なファイルは消していってcleanな環境を保てるようにしたいですね。

この調子で部屋の掃除もしなければ...
Pythonでズンドコキヨシ(ジェネレータ)

# 概要
[流行っている](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)ようなのでN番煎じとしてPythonでやってみました。

# コード(version1)
```py
# -*- coding: utf-8 -*-
from collections import deque
import random


z = u'ズン'
d = u'ドコ'
zzzzd = (z, z, z, z, d, )
kys = u'キ・ヨ・シ！'


# 無限ズンドコジェネレータ
def zd():
    while True:
        w = random.choice((z, d, ))
        print w
        yield w


def zndkkys():
    q = deque()
    # 絶対に一致しない4文字目まで読み飛ばす
    for i, w in enumerate(zd()):
        q.append(w)
        if i == 3:
            break

    # 5文字目以降は都度チェックしつつ不要な文字は捨てる
    for w in zd():
        q.append(w)
        if all((zzzzd[i] == p for i, p in enumerate(q))):
            print kys
            return
        q.popleft()


if __name__ == '__main__':
    zndkkys()
```

# 特徴
* listを延々伸ばすコードが多かったのであえてdequeで5文字分のみチェック
* 無限ズンドコジェネレータ

## しかし
これジェネレータだけで行けるんじゃね？というのが下のversion2です

# コード(version2)
```py
# -*- coding: utf-8 -*-
from collections import deque
import random


z = u'ズン'
d = u'ドコ'
kys = u'キ・ヨ・シ！'

def zndkkys2():
    state = 0
    while True:
        num = random.choice((0, 1, ))
        # ズンならカウントアップ
        if num:
            yield z
            state += 1
        else:
            yield d
            # ドコの前に4回以上ズンが連続していたらキ・ヨ・シ！
            if state >= 4:
                yield kys
                return
            # ドコの前のズンが3回以下ならカウントを初期化
            else:
                state = 0

if __name__ == '__main__':
    print ''.join(zndkkys2())
```

# 概要
* リストを使わない
* 全部ジェネレータ

# まとめ
* version1は無限ズンドコジェネレータと言いたかっただけのコードだった
* ジェネレータは内部に状態を持てるのでこういう処理をするときには便利
Androidアプリのレイアウトの基本

![linear.png](https://qiita-image-store.s3.amazonaws.com/0/33329/f7a68598-32da-2a4a-3fa1-ffd287941a8f.png)

```activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" android:id="@+id/countText"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/countButton" android:layout_below="@+id/countText" android:layout_centerHorizontal="true"
        android:layout_marginTop="150dp"/>

</RelativeLayout>
```
Androidアプリのレイアウトファイルは初期ではReLativeLayoutになっており、マウスでTextViewやButtonを配置することができます。しかし、これではTextViewからどれだけの位置にあるかで判定しています。そのためとても扱いずらいです。

そこでLinearLayoutを使うことになるのですが、LinearLayoutには二種類の属性が指定できます。VERTICALとHORIZONTALがあります。VERTICALは縦にオブジェクトを配置されていきます。そしてHORIZONTALは横にオブジェクトが配置されていきます。

覚え方はバーっと上に並べるバーティカル。ホーっと驚くくらいの横並びのHORIZONTAL。

基本はこの二つを利用してアプリ開発をしていくことになります。
Schemeでズンドコキヨシ

遅きに失した感もあるけれど、世間では[ズンドコキヨシ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)というのが流行っているらしいので Scheme で書いてみた。処理系は Gauche を仮定しているが、他の R7RS 処理系に移植するのはそれほど難しくないと思う。

コードを書く前に考えてみると、下のような状態機械が思い浮かぶ。

```
          ズン    ズン    ズン    ズン    ドコ
 --> 0 -+-----> 1 ----> 2 ----> 3 ----> 4 ----> ((キ・ヨ・シ！))
     ^  |*      |*      |*      |*      |*
     |  |       |       |       |       |
     +--+-------+-------+-------+-------+
```

末尾呼び出し最適化のある言語の気持ちになると、状態は手続きであり、手続きの末尾呼び出しは状態遷移なので、こんな風に書いてみた。入力はストリームとして受け取るものとした。

```scheme
(use srfi-27)
(use util.stream)

(define zun "ズン")

(define (zun? x)
  (equal? x zun))

(define doko "ドコ")

(define (doko? x)
  (equal? x doko))

(define (init strm)
  (cond ((zun? (stream-car strm))
         (zun1 (stream-cdr strm)))
        (else
         (init (stream-cdr strm)))))

(define (zun1 strm)
  (cond ((zun? (stream-car strm))
         (zun2 (stream-cdr strm)))
        (else
         (init (stream-cdr strm)))))

(define (zun2 strm)
  (cond ((zun? (stream-car strm))
         (zun3 (stream-cdr strm)))
        (else
         (init (stream-cdr strm)))))

(define (zun3 strm)
  (cond ((zun? (stream-car strm))
         (zun4 (stream-cdr strm)))
        (else
         (init (stream-cdr strm)))))

(define (zun4 strm)
  (cond ((doko? (stream-car strm))
         "キ・ヨ・シ！")
        (else
         (init (stream-cdr strm)))))
```

`init` から始めて、受理状態になったら `"キ・ヨ・シ！"` を返して停止することにする。

入力は、乱数生成器を使って、「ズン」と「ドコ」をランダムに並べたストリームを生成する。

```scheme
(define (zundoko rng)
  (let ((rint (random-source-make-integers rng)))
    (stream-tabulate -1
                     (lambda (_)
                       (case (rint 2)
                         ((0) zun)
                         (else doko))))))
```

途中経過も見たいので、入力ストリームに値を表示する手続きを `stream-map` したものを渡しつつ、戻り値を `print` する（Gauche のストリーム、すなわち [SRFI-41](http://srfi.schemers.org/srfi-41/srfi-41.html) のストリームは even ストリームで、 `stream-car` を取ったときに計算が実行されるのでこれでうまく行く）。

```scheme
(define (d x)
  (display x)
  x)

(print (init (stream-map d (zundoko (make-random-source)))))

(exit 0)
```

こんな感じの結果が出力される。

> ドコズンドコドコズンドコドコズンドコズンズンドコズンズンドコドコドコドコドコドコズンドコドコドコドコズンズンドコドコズンズンズンズンズンドコドコドコドコドコドコドコドコズンズンドコズンドコドコドコズンドコドコドコズンズンズンドコズンズンズンドコドコズンズンズンドコズンズンズンドコドコドコドコズンズンドコドコズンズンドコズンズンズンズンドコキ・ヨ・シ！
【Shader Forge】Switchについて

Shader ForgeにはSwitchというノードがあります。
できることは名前の通りで入力された二つの値を切り替えて出力することができます。
こんな感じ。
![3月 19, 2016 01:38.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/30d1b884-cdad-d566-1bed-d178d233b234.gif)
ちょっと便利や
【Shader Forge】コードからshaderのプロパティにアクセスする

コードからShaderのプロパティにアクセスするにはどうすれば良いか悩んだので解決策を書きます。

できたもの
![3月 19, 2016 00:49.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/d03931f9-4a0f-bf3b-9e0f-6109a9c43a30.gif)
Outline Widthに影響しているプロパティを作成し、コードから制御しています。

流れとしては、
1:shaderにプロパティを作成する
2:プロパティ名を確認する
3:コードからプロパティを更新する
になります。

あと大切なマテリアルの取得についても書きます。

##1:shaderにプロパティを作成する
<img width="348" alt="スクリーンショット 2016-03-19 0.59.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/60c512cc-7da4-2ea7-1321-02cd1934494a.png">
まずは、コードから変更するためのプロパティを作成します。
右クリックでメニューを出し、Properties/以下のメニューを選択して、PropertieNodeを作成します。
このとき、どのタイプのプロパティを作成したのかちゃんと確認しておくこと。

<img width="194" alt="スクリーンショット 2016-03-19 1.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/c53fb21a-1609-3964-8d8d-05216e908e25.png">
今回は、Outline widthに使用するプロパティなので、float型のプロパティを作成しました。

<img width="336" alt="スクリーンショット 2016-03-19 0.50.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/e8f54c8b-778d-575b-70bd-3831091ca946.png">
プロパティノードを作成した直後だと、node_****みたいな名前になのでとりあえず _aaa_ に変更しました。
あとは普通にOutline widthに接続しました。

##2:プロパティ名を確認する
<img width="94" alt="スクリーンショット 2016-03-19 0.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/14254c0e-d6c9-1cbf-4d73-2bcce323ab48.png">
Shader Forgeによって作成されたシェーダーをプロジェクトviewで選択し、インスペクターを見ます。

<img width="272" alt="スクリーンショット 2016-03-19 0.50.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/938808a3-727e-db52-cc28-211941801200.png">
 *Properties* という欄があり、そこに
_Color と _aaa というプロパティの存在が確認できます。
ここに記載されているプロパティ名を使ってコードからアクセスしていきます。

##3:コードからプロパティを更新する
```
    public GameObject sphere;
	public Slider slider;

	void Awake ()
	{
		slider.OnValueChangedAsObservable ()
			.Subscribe (value => {
			sphere.GetComponent <Renderer> ().sharedMaterial.SetFloat ("_aaa", value);		
		});
	}

```
めっちゃ適当なのですが、
UniRxを使って、sliderの値が変化したときにシェーダーのプロパティを更新しています。
ようは、
shaderを管理しているマテリアルを取得し、そいつにSetHoge("name",value)してあげることでプロパティを更新することができます。
(Hogeの部分はプロパティの型が入ります。今回はfloat型を使ったのでSetFlot()ですね)


##大切なマテリアルの取得について
マテリアルはRendererクラスが管理しています。
Rendererからマテリアルを取得する方法は、2種類あり、取得の仕方によって動作が大きく変わってしまうので注意が必要です。

###1つめの取り方
```
GetComponent <Renderer> ().sharedMaterial
```
ですね。
sharedMaterialでマテリアルを取得し、シェーダーのプロパティを更新すると、
 **そのシェーダーを使っている全てのオブジェクトに影響が及びます。**
![3月 19, 2016 01:16.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/2dbf26d5-f163-35e5-5f12-96d6ecfbc403.gif)
こんな感じに。
マテリアルが共通で使われているのでstatusの **SetPass callsも4** のままになっています。

###2つめの取り方
```
GetComponent <Renderer> ().material
```
ですね。sharedMaterialがただの*material*になりました。
そのため、1つのmaterialに対しプロパティを更新することができます。
![3月 19, 2016 01:21.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/ee445015-1306-fae0-2b60-ebb176e35687.gif)
こんな感じですね。
しかし、見てください。
statusの **SetPass callsが6** になっています。
今回作成したシェーダーは2だけSetPass callsを増やします。
しかし、GetComponent <Renderer> ().materialで1つのマテリアルを取得し、プロパティを更新すると**全く違うmaterialとしてゲーム世界に存在するので、またSetPass callsが2増えてしまいます。**
SetPass callsの値が大きくなるとゲームパフォーマンスに影響してくるので安易に増やさないようにしましょう。

_といっても僕もよくわからないので今後記事にしていきたいと思います_

ドローコールやSetPass callsについては
http://qiita.com/baba_s/items/5260807ced7fc3c02ca6
これが良い感じにまとまってるのかな・・・？
ズンドコキヨシ with PHP Extension

# C言語で専用関数を作る

- [mpyw/phpext-zundoko-kiyoshi](https://github.com/mpyw/phpext-zundoko-kiyoshi)

![スクリーンショット 2016-03-19 0.27.58.png](https://qiita-image-store.s3.amazonaws.com/0/25060/3ba32532-4c59-04fb-8026-b7def526b081.png)

# C言語で無名再帰を可能にしてPHPでポエムる

- [mpyw/phpext-callee](https://github.com/mpyw/phpext-callee)


```php
<?php
echo (function ($c = '') {
    $v = $c . array_rand(array_flip(['ズン', 'ドコ']));
    return
        preg_match('/(?:ズン){4}ドコ$/', $v)
        ? $v . 'キ・ヨ・シ！'
        : callee()($v)
    ;
})();
```
pip installでいまだにInsecurePlatformWarningが出るけどなんかいろいろと面倒くさくてやってなかった

# pip install -> InsecurePlatformWarning

```
$ python -V
Python 2.7.1
$ pip -V
pip 8.1.1 from /Users/foo/.anyenv/envs/pyenv/versions/2.7.1/lib/python2.7/site-packages (python 2.7)
$ pip install everytime-warning
…
/Users/foo/.anyenv/envs/pyenv/versions/2.7.1/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/Users/foo/.anyenv/envs/pyenv/versions/2.7.1/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
…
```

# 何で怒られているのか

[https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning](https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning)
> Certain Python distributions (specifically, versions of Python earlier than 2.7.9) and older OpenSSLs have restrictions that prevent them from using the SNI (Server Name Indication) extension. This can cause unexpected behaviour when making some HTTPS requests, usually causing the server to present the a TLS certificate that is not valid for the website you’re trying to access.

「2.7.9以前のバージョンでは証明書が正しくないサイトにアクセスしてしまう場合があります」的な

## 証明書が正しくないと何が起こるのか

最悪の場合、

1. 著名なプラグインだから安心だろうと思って`pip install`する（numpyとか）
2. アクセス先がすり替えられて、悪意のあるプラグインをダウンロードする
3. 証明書の検証が正しく行われず、インストールしてしまう

ということになるかもしれない

# pyenv install

## 罠

普通に`pyenv install 2.7.9`しようとしたら、怒られた

```
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```

## anyenvをアップグレード

```
(cd ~/.anyenv && git pull)
exec $SHELL -l
anyenv install pyenv
exec $SHELL -l
pyenv install 2.7.9
pyenv global 2.7.9
pip install secure-and-silent
```

めでたし
月曜日から始まる週番号の計算


その年の何日目かとその日の曜日が分かる状態で、その日が何週目なのかを数える式について。

## 週番号の定義
週番号には色々定義がある。
* 1週間は月曜日〜日曜日または日曜日〜月曜日
* 1月頭や12月末を前年に含めるまたは後年に含める
最初の木曜日が入ってる週が1週目とか色々あるけれど、
今回求めたいのは次を満たすもの。

**・1週間は月曜日〜日曜日**
**・1月1日は1週目、12月31日は53週目**

プログラムで普通に関数用意されてそうなのですが、hiveにはこの条件を満たすものがなかった。多分。

## 例
1月1日が日曜日のとき、1月1日は1週目、1月2~8日は2週目、前年の12月31日は前年の53週目
1月1日が月曜日の時、1月1~7日は1週目、1月8~15日は2週目

みたいな感じ。


## 結論

$D$:その年の何日目か(例：2月3日なら34)
$u$:その日が何曜日か(月=1,...,日=7)
\[x\]:xを超えない最大の整数（ガウス記号）

```math
[\frac{14 + D - ((D - u + 8) \% 7)}{7}] - [\frac{9 - ((u - (D \% 7) + 8) \% 7)}{7}]
```


## hiveQLで書いてみる

```SQL
CAST((
  (
    14
    + from_unixtime(unix_timestamp('2017-03-19 00:00:00','yyyy-MM-dd HH:mm:ss'),'D')
    -
    (
      from_unixtime(unix_timestamp('2017-03-19 00:00:00','yyyy-MM-dd HH:mm:ss'),'D') 
      - from_unixtime(unix_timestamp('2017-03-19 00:00:00','yyyy-MM-dd HH:mm:ss'),'u')
      + 8
    )
    % 7
  )
  / 7
) AS BIGINT)
-
CAST( (9 - from_unixtime(unix_timestamp('2017-01-01 00:00:00','yyyy-MM-dd HH:mm:ss'),'u'))/7  AS BIGINT)

```

最後のところその年の1月1日の曜日を使うことですこし簡潔になります。
treasure dataならTD_DATE_TRUNCとかを使うと年の初日を出せます。
LPAD(CAST~(略)~,2,'0')を使うと1週目は01のように0で埋めれます。('ww'の形式)

もっといろいろ省略できそう。
もしわかったらコメント欄とかで教えて下さい。
%7やってるのに+8してるとか+1でよくない？ってなると思いますが、負になったときちゃんと動いてくれない言語もあるので負にならないようにしました。

なんというかとても汚いので可能ならユーザー定義関数作ってやりたいですね。
Swift2.2で競技プログラミング(AtCoder)

ついにAtCoderにもSwiftが導入される…かな？
http://language-test-201603.contest.atcoder.jp/

実力やいかに。
以下、環境構築や競プロで出番があるかもしれないものをつらつらと。

# AtCoderのSwift

言語: Swift (2.2-SNAPSHOT-2016-02-08-a)
コンパイルオプション: `swiftc -o a.out Main.swift`
実行コマンド: a.out

## 環境構築

簡単

https://github.com/kylef/swiftenv

```bash
swiftenv install 2.2-SNAPSHOT-2016-02-08-a
```

適当なディレクトリで `swiftenv local 2.2-SNAPSHOT-2016-02-08-a` としておくのも良い。

# レッツトライ

## 入力処理

paizaでの競プロSwiftと同様、 `NSFileHandle` からの取得はできない模様。以下だけでCEが出る。

```swift
let standardInput = NSFileHandle.fileHandleWithStandardInput()
```

`readLine()` による1行取得は使える。もちろん戻り値は `Optional<String>` である。

```swift
let a = readLine()!
```

## Stringのsplit

残念ながらSwift2ではStringが `CollectionType` でなくなってしまったため、 `split` を行うことができない。方法としては、 `String` に `CollectionType` を与えて `split` する能力を蘇らせるか、 `String.CharacterView` を経由するか。

```swift
extension String: CollectionType {}
"1 2".split(" ")
```

```swift
"1 2".characters.split(" ")
```

クロージャなどを取る `split` もいて、 `split` を使い分けることにより自由に処理ができる。一応。

## 3.14

`M_PI` は `Foundation` 持ちなので使えない。

## 平方根

`sqrt` は `Foundation` 持ちなので使えない。
自作関数を突っ込む以外に方法があったら教えてください。。

## ソート

またソートの名前が変わっていた……。
副作用を求めていく場合:

```swift
rs.sortInPlace(<)
```

副作用は許さない場合:

```swift
rs.sort(<)
```

# まとめ

さすがにネタ言語よりは上だが他の実用言語に劣る(知ってた)
Emmetで紛らわしいorよく使う省略記法

# 作業環境
OS: ubuntu
Editor: atom

# Emmetの省略記法
Emmetの省略記法を使うときにちょいちょいどう書けばいいのか直観的にわからないことがあるので、ちょっとまとめてみた。

##font-size
font-sizeを期待してfsを展開するとfont-styleになる。

- fs > font-style

font-sizeはfx

- fx > font-size
- fx10 > font-size: 10px;

##box-shadow
box-shadowはbsではなくbxs

- bs > border-style
- bxs > box-shadow

##border
borderはboではなくbd

- bo > background-origin
- bd10 > border: 10px;


ちなみにbd+

- bd+ > border: 1px solid #000

で一発で枠線が引けるので憶えておくと便利かもしれない。

##border-radius
brは

- br => border-rightなので

border-radiusは

- bdrs => border-radius

若干めんどうな形

##list-style:none

自分はほぼ毎回使うlist-style:none

- ln => letter-spacing: normal

list-style: noneは

- lin => list-style:none

これは予想がつくけど、よく使うだけに意識し憶えとかないとついうっかりlnと打ってしまう。

#感想
こういった機能は手軽だからうまくいかなくても直接入力して済んでしまう。そのせいでぼんやり気になってても後回しになってたので一回軽くまとめて調べてみた。
emmetについてまだよく知らないから環境やエディタによって微妙に違ったりすることがあるのかもしれないけど参考までに。
RxJSでズンドコ

ズンドコキヨシについてはこちら ⇒ [ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

おもむろに [RxJS](https://github.com/Reactive-Extensions/RxJS) & ES2015 でやってみました。

```js:
import {Rx} from 'rx';

const subject = new Rx.Subject();

function doZunDoko() {
    while (!subject.isStopped) {
        if (Math.random() > 0.5) {
            subject.onNext('ズン');
        } else {
            subject.onNext('ドコ');
        }
    }
}

const subscription = subject
    .doOnNext((aString) => console.log(aString))
    .bufferWithCount(5, 1)
    .filter((aArray) => aArray.join(',') === 'ズン,ズン,ズン,ズン,ドコ')
    .take(1)
    .subscribe(() => {
        console.log('キ・ヨ・シ！');
        subject.onCompleted();
        subscription.dispose();
    });

doZunDoko();
```

<img width="300" alt="スクリーンショット 2016-03-18 23.40.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/9e0a2ecf-80d5-aab0-fd6c-e78f952ee6ea.png">

実際の挙動はこちらから確認できます（GitHub Pages）。
⇒ http://hkusu.github.io/rxjs-zundoko/

> コンソールを開いてください。

ソースは GitHub に置きました。
⇒ https://github.com/hkusu/rxjs-zundoko
CentOS7にheroku toolbeltをインストール

CentOS7にheroku toolbeltをインストールしました。

```
$ sudo wget -qO- https://toolbelt.heroku.com/install.sh | sh
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> .bash_profile 
$ source .bash_profile 
$ heroku version
$ heroku login
Enter your Heroku credentials.
Email: メールアドレス
Password (typing will be hidden): パスワード
```
char の符号

プログラミング言語 C や C++ では、 `char` という型は符号有りか無しかは処理系定義とされています。 符号が有るか無いかのどちらかではありますが、どちらを選択するかは処理系に任せられていて規格では決めないということです。 また、 `int` と `signed int` (符号付き `int`) は同じ型ですが、 `char` は `signed char` とも `unsigned char` とも違う型です。 このことを知らないと、 C++ のオーバーロードの機能を使うときなどに予想外の結果をもたらすかもしれません。

具体的な事例を見てみましょう。 まずは `int` の場合、以下のコードをコンパイルしようとするとエラーになるはずです。 `int` と `signed int` は同じ型なので定義が重複していることになるからです。

```cpp
#include <iostream>

void foo(int x) {
  std::cout << "int : " << x << std::endl;
}

void foo(signed int x) {
  std::cout << "signed int : " << x << std::endl;
}

int main(void) {
  int bar = 1;
  foo(bar);
  return 0;
}
```

しかし、 `char` の場合は `char` と `signed char` 、そして `unsigned char` は別の型なので以下のようにオーバーロードしても問題なくコンパイルできますし、型に応じてそれぞれが呼び分けられます。

```cpp
#include <iostream>

void foo(char x) {
  std::cout << "char : " << x << std::endl;
}

void foo(signed char x) {
  std::cout << "signed char : " << x << std::endl;
}

void foo(unsigned char x) {
  std::cout << "unsigned char : " << x << std::endl;
}

int main(void) {
  char bar = 'a';
  signed char baz = 'b';
  unsigned char qux = 'c';
  foo(bar);
  foo(baz);
  foo(qux);
  return 0;
}
```

また、 `char` は符号が有りか無しかわからないのですから、負数を扱うときにその挙動が不確定となる場合があります。 たとえば以下のような場合です。

```cpp
#ifdef __cplusplus
#include <cstdio>
using namespace std;
#else
#include <stdio.h>
#endif

int main(void) {
  char x = -1;
  printf("%d\n", x);
  return 0;
}
```

MinGW の、少なくともバージョン 5.3.0 の gcc (または g++) ではこれは `-1` を表示します。 MinGW GCC の `char` はデフォルトでは符号有りなので汎整数昇格で `int` に拡張されるときに符号がそのまま引き継がれて `int` 型の `-1` になるからです。 しかし、 gcc の `char` が符号付きか否かのデフォルトでの解釈はアーキテクチャによって異なるようです。 もし `char` が符号無しと解釈されるなら上のコードは `255` を表示するでしょう。 gcc や clang では オプション `-funsigned-char` `-fsigned-char` で `char` が符号有りか無しかを切替えられるので、それぞれの場合で試してみてください。 (参考:[GCC のドキュメント](https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/C-Dialect-Options.html#C-Dialect-Options))

大小を比較するような場面でも符号の有無が結果を左右することもあります。 このあたりの数値の扱いは暗黙の変換で適当に良いようにしてくれることがあるのですが、一旦問題が発生するとわかり難いバグにもなるので「数値としての `char` 型」が必要なときは `signed char` か `unsigned char` を陽に利用するのが無難です。 更に言えば `int8_t` や `uint8_t` を使うのが近年の風潮です。

歴史的経緯で奇妙な部分を多くかかえている C/C++ ですが、最近の改訂でより良い方法が提供されていることがあるので、特に古い処理系に制約される環境でない限り新しい機能を積極的に活用することで馬鹿げたバグを防げるかもしれません。
Slack連携させたhubotでズンドコキヨシ

# 空前のズンドコキヨシブーム

[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)


# Slackでズンドコキヨシしたい！

超初心者がcoffeeスクリプト書きました。

https://github.com/mitsugogo/slackbot/blob/master/chihaya-bot/scripts/kiyoshi.coffee

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/109466/65cc5afb-3dd5-5270-8e4f-105c466ead9f.png)


# 参考にしました

[Hubot:概要〜インストール〜実用的なモノが作れるまで](http://qiita.com/Kta-M/items/d7e0f371e40b4cefc38a)
複数のRailsプロジェクトで共有しているscssをgem化した話

# 背景
昔々、Bootstrapのようなscssフレームワーク社内で自作し、複数のRailsプロジェクトでフレームワークを共有している会社がありました。

SCSSファイルを生で置いておくと編集されてしまいプロジェクトごとに差分が発生する。CSS化するとScssの変数が使えず不便だし、部分的にインポートするのも大変ということでSCSSの管理が問題になっていました。

# なにやったのか
## gem化しました
複数のリポジトリで管理するのは大変なのでパッケージ化してしまえということでgemでパッケージ化を行いました。
SCSSフレームワークに変更がある度にgemのバージョンを変えていくという方法を採用しています。

なぜgemかというと、bowerやnpmのようなパッケージマネージャーも候補にいれたのですが、rails newでデフォルトで作成されるGemfileに記述出来た方が、プロジェクトを進めやすいと考えたからです。sprocketで行う方法は考えませんでした。

## gemでやってること
- gemの中にScssを突っ込む
- sass_pathを弄る

gemの中でやることは簡単でgemの中にscssファイルを突っ込んであげて、そのディレクトリ(今回はapp/assets/stylesheets)をsassのload_pathsに追加してあげるだけです。
sassのload_pathsに追加してあげることで、scssファイルを読みこんでくれます。

```rb
require "gem_name/version"
require "sass"

module GemName
  Sass.load_paths << File.expand_path("../../app/assets/stylesheets", __FILE__)
end
```

# 恩恵は?
``` gemのディレクトリ構造
gem_name/app/assets/stylesheets/shared_scss/base/_reboot.scss
gem_name/app/assets/stylesheets/shared_scss/component/_button.scss
gem_name/app/assets/stylesheets/shared_scss/component/_form.scss
```
上のようなディレクトリ構成があると```app/assets/stylesheets/```をload_pathsに追加しておくと下のような書き方で読み込むことが可能になります。
プロジェクト内で定義した変数をgemの中のscssで使うことも可能なので、プロジェクトによってテーマ変更も可能です。

```scss:プロジェクト内のscss
$brand-color: #428b09;
@import 'shared_scss/base/reboot';
@import 'shared_scss/component/button', 'shared_scss/component/form';
```
注) shared_scssというディレクトリ名はgemから呼び出したということを明示するためにつけたものです。

# 感想
これから運用してみる予定です。このCSSに関しては変更が少ないので問題は少ないと思いますが、変更の多いCSSに関しては毎回gemのアップデートを行うのは面倒な気がします。
ただ、このようなgemをプロジェクトに使うだけで**フロントエンドがスタートダッシュを決められる**というのは重要なので、このような取り組みを進めていきたいと思います。

今後の展望としてはスタイルガイドもgemの中に突っ込んで「開発環境で見れます」的なことしたいです。

# 試したい方へ
リポジトリ作って置いておきました
https://github.com/mottox2/shared-sass

## 使い方
1. forkして、app/assets/stylesheets内に共有したいGemを置く
2. 使いたいプロジェクトのGemfileに```gem 'shared_sass', github: 'your_name/shared_sass'
```と書いて```bundle install```
3. 適宜scssファイル内でimportする。
Angular2 動的に Directive や Component を切り替える技

例えば、エラーを内容を表示させるページ内でエラー内容に応じて配下のDirectiveを切り替えたい場合があるかもしれない。

下記の様なDirectiveを２つ作成したとする。

```ts:server_error_directive.ts
@Directive({
  selector: 'サーバエラー'
})
@Template({
  inline:
    '<h1>Server Error!"</h1>'
})
class ServerErrorDirective {
  constructor() {
  }
}
```

```ts:auth.error.directive.ts
@Directive({
  selector: '認証エラー'
})
@Template({
  inline:
    '<h1>Auth Error!"</h1>'
})
class AuthErrorDirective {
  constructor() {
  }
}
```

これらを実際に表示したいエラーの種類に応じて表示しわけたいわけである。

技とは書いてみたが何のこともない、ngSwitch を利用するだけである。
これぞ KISS ( Keep It Simple, Stupid!)

```ts:app.component.ts

@Component({
  selector: 'my-app',
  directives: [ServerErrorDirective, AuthErrorDirective],
  template:
    `<div class="error" [ngSwitch]="_err.errorType()">
    <serverError *ngSwitchWhen="'serverError'"></serverError>
    <notFound *ngSwitchWhen="'notFound'"></notFound>
    </div>
    `
})
class AppComponent {
  type: string = 'serverError';
  constructor() {
  }
}
```

たぶんこんな感じで動くはず

参考URL
http://www.codelord.net/2015/05/19/angularjs-dynamically-loading-directives/
while文をforeachに変換する

LINQ信者たるもの、あの処理もこの処理も全部LINQで書きたい！
のですが、たまに古いソースでwhile文でデータソースの
中身を列挙する処理などを見るとなんとなくイヤ〜な気持ちになります。

ありがちな物としてはCSVからオブジェクトを作る処理とか。
こんなの。

```C#
public static void Main()
{
   var fs = new FileStream("test.csv", FileMode.Open, FileAccess.Read);
   var sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));

   while (!sr.EndOfStream)
   {
      string line = sr.ReadLine();
      var item = new Item(line);

      // 何か処理
   }

   sr.Close();
   fs.Close();
}
```

このwhile文を滅ぼしたくて、以下のようなクラスを作って見ました。

```IterUtil.cs
public static class IterUtil
{
   public static IEnumerable<T> Iterate<T>(Func<bool> isEnded, Func<T> getItem)
   {
      if (isEnded())
         yield return getItem();
   }
}
```

これを使えば、こう書けます。

```C#
public static void Main()
{
   var fs = new FileStream("test.csv", FileMode.Open, FileAccess.Read);
   var sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));

   foreach (Item item in IterUtil.Iterate(() => sr.EndOfStream, () => new Item(sr.ReadLine())))
   {
      // 何か処理
   }

   sr.Close();
   fs.Close();
}
```

いやまあ別にちゃんと動いてるならwhile文のままでいいだろって話もあるのですが、
やっぱりLINQ＆foreachの方が「列挙してる」って感じで好きなのです。
nginx locationの評価順序

大雑把に言うと、この表で上にあるものが優先される。
なのでnginx.confに書くときもこの順序で書くとよいと思う。

|プレフィックス|説明|
|----|----|
|=|完全一致。一致したら、前方一致と正規表現を適用しない|
|^~|前方一致。一致したら、正規表現を適用しない|正規表現で代用できるので、ややこしくしたくなければ使わない方がいい？|
|~|正規表現（大文字・小文字を区別する）。一致したら、なしの適用はしない|
|~*|正規表現（大文字・小文字を区別しない）。一致したら、なしの適用はしない|
|なし|前方一致|unicornなど他アプリへのプロキシ|

「なし」とは`location /`のような書き方のこと。
前方一致は、一致する文字列が一番長いもの1個だけが適用される。
正規表現は、設定ファイルに書いた順番で最初に一致したもの1個だけが適用される。
locationはネストできる。

使い分け方としては、

|プレフィックス|用途|
|----|----|
|=|完全に特定のURLだけを対象にしたい場合|
|^~|ディレクトリ丸ごとを対象にしたい場合。アクセス拒否、BASIC認証、unicornへのプロキシなど|
|~|`~ \.php`や`~ /\.ht`のように拡張子で指定する場合など|

`~*`と「なし」はややこしくなるので、どうしても必要でなければ使わない方がいいかもしれない。
git subtree 運用のススメ


コマンドとか基本的な使い方は

http://qiita.com/mikakane/items/487ca8b3acddfa5fdb41

にまとめました。

submodule と違って、subtreeは他のユーザに不便を書けること無く運用が回って非常に便利なのだけど
.submoduleみたいな設定定義ファイルが無いので、モジュール管理を行うオーナにとっては苦痛が多かったりする。

とりあえず個人的に今のところこういう形で回してイますというメモ書きを。

## remote 管理

submoduleの配信先remoteは全てremote登録しておく。

subtreeコマンドを叩く際に 毎回URL引っ張ってくるのは流石に面倒

複数remoteからのfetch は　`git fetch --all` で対応可能


## subtreeの切り出し

個人的にはsubtreeの切り出しはローカルブランチで行いたいので remoteには`.`を指定している。
複数のsubtreeを一括してローカルブランチに切り出せる用のエイリアスコマンドを`.git/config`に記載しておくと便利感ある。

````.git/config
[alias]
	subpush = \
	!git subtree push --prefix subtree/module_a/ . module_a && \
	 git subtree push --prefix subtree/module_b/ . module_b && \
	 git subtree push --prefix subtree/module_b/ . module_c
````

## subtree の進行状況比較

git show-branch で進行状況を確認する。

前述のとおり`fetch --all`で全てのリモートを更新できるので、最新の状態を取得したら、
後はshow-branchで比較するだけ。

利用するリモートブランチに応じて若干記述は異なるが概ね以下の様なコマンドで確認できるはず

````
$ git show-branch module_a module_a/master 
````

ローカルブランチとリモート名を合わせておくと楽

あとは必要に応じてpullしたりpushしたり

更新のリモート反映
````
$ git push module_a module_a:master
````

更新の取り込み
````
$ git pull module_a master:module_a
$ git subtree pull --prefix=subtree/module_a . module_a
````
Windows上 で Ruby を開発していた時の知見

# はじめに

- 昨年の今頃、Windows のインストーラを作る仕事をしていました。
- 正直 Windows をディスる気は無いんですが、やっぱり普段使っているプラットフォームが違うと、中々勝手が違って慣れませんよね。
- 普段 OS X や Linux を使って開発していて、まぁやっぱ慣れなかったなぁ〜、と述懐しつつ、当時メモっていた Qiita::Team からサルベージしてきました。

## コマンド対応表

|Unix|Win|
|:---|:---|
|cd|cd|
|pwd|cd ,|
|ls|dir|
|which|where|

## Rubyのインストールを行う

- [ここ](http://rubyinstaller.org/downloads/)からインストールを行います
- インストール中に。最初に `ruby` を `path` に追加っていうチェックボックスがあるので、忘れずにチェックすること（入れないと `ruby` のパスが通らないです）

## RubyGem を入れる

- 以下のように`could not find gem`言われたら、セキュリティ的な何かなので`gem sources`を実行するようにします
- あと SSL 系は死ぬほど苦労した思い出があります。

```
C:> gem install pry
ERROR:  Could not find a valid gem 'pry' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect retur
ned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (
https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/rhc-1.15.6.gemspec.rz)
ERROR:  Possible alternatives: pry
```

- 以下のように`gem source`を実行します

```
C:>gem sources --remove https://rubygems.org/
C:>gem sources --add http://rubygems.org/
```


### Terminalで sudo 権限で実行する

下の画像の`run as administrator`から実行します。

![run_as_admin.png](https://qiita-image-store.s3.amazonaws.com/1041/46303/73d355ae-e6ab-3571-33c6-6eeb01f7cfb3.png)

## Rubyでソースの中からパスを扱うときの注意点

- プロンプトで出力されるパスとrubyのソースの中から記述するパスは同一のものでは無いので注意しなければならないです
- バックスラッシュはスラッシュに置き換わります

```
C:\Users\IEUser\Desktop> cd ,
C:\Users\IEUser\Desktop
```

```rb
FileUtils.touch('C:/Users/IEUser/Desktop/log')
File.write("C:/Users/IEUser/Desktop/log", hogehoge)
```

# 最後に

- Windows のバージョンによっては結構勝手が違った記憶があります。
- バージョンによって、標準エディタがあったり無かったりで結構苦労した思い出があります。
- この辺あやふやなので、あまりこの記事をあてにしないほうが良いと思います。 ~~じゃあ書くなよ~~
- とはいえ、Modern IE とかの出現により、大分開発環境の整備も楽になってきた今日このごろだなぁ、と思う次第です。
Try SensorBee - No.1


## SensorBee

* オフィシャルサイト：　http://sensorbee.io/
* github：　https://github.com/sensorbee/sensorbee


SensorBeeはPreffered Networksさんが先日発表したStreaming ETL(Extract/Transform/Load)のためのOSSです。

ニュースリリースの中でそのコンセプトを以下の様に説明されています。

https://www.preferred-networks.jp/news/10165

> SensorBeeはネットワークのエッジやフォグで発生する非構造化ストリームデータに対して継続的に機械学習を適用し、その結果を既存のデータベースやデータ分析システムに転送したり、直接ロボットなどにフィードバックして制御を行うために開発されました。機械学習ではChainerをサポートすることにより、deep learningのストリームデータへの適用が可能となっています。またJubatusで使用されているアルゴリズムの一部もサポートされています。

## エッジ側でのストリーム処理を考える

ストリーム処理系は分散化したサーバサイドで処理するフレームワークが最近では色々出ていて、Spark StreamingやApache Storm等はその代表格ですよね。

ただ、ことIoTの場合、データソースから生成される情報量が半端じゃなく多くなります。そうなってくると、例えばセンサ信号レベルに近いレイヤでは、サーバ側ではなくてエッジ側で処理を実行しないと、レイテンシやデータ転送量の問題が発生することもしばしば。エッジ側でストリーム処理したいケースは当然多いわけです。

（データ変換や閾値範囲処理の度に、全部処理をサーバ側に投げられたら、サーバ管理者にタコ殴りにされそうですもんね。）

勿論、たとえIoTであっても大規模な集計や高い負荷がかかる学習演算はサーバサイドで実行した方が良いことは変わりませんし、エッジ側とクラウド側で用途ごとに実装する処理を分散させる様なアーキテクチャを構築することが大切になってくるわけですね。


## SensorBeeの特徴

SensorBeeはそういったユースケースを想定して、エッジ側でのETL、Stream Processingをかなり意識して作られているようです。

公式HPには以下の３つのコンセプトが掲げられています。

### （１）Stateful

* 非構造化データから有用な情報を取り出す場合、機械学習を使いたいケースがしばしば。
* SensorBeeはオンライン機械学習において力を発揮する。
* JubatusやChainer等の複数の機械学習ツールをサポート。
* 更に、SensorBeeが提供するクエリ言語はテンポラリデータのハンドリングが可能。

### （２）Expressive

* SensorBeeのクエリはSQLに似たBQLで実装されている。
* BQLはスキーマレスで、JSONの様な内部データ構造を持つ。
* JSONを簡単に扱うことが可能。

### （３）Lightweight
* 最小フットプリントは30MBで、RaspberryPi等の非力なマシンでも実行可能。
* 将来的にはより小さなチップに組み込んで、BQLを実行できるようにすることを目指している。


普段このあたりで頭を抱えている私、俄然興味が湧いてきました。


## とりあえずインストール

とりあえず、インストールして使ってみます。
かなり簡単なのでこんな記事はいらないかもと思いつつ。。。

### Goの環境を用意しよう

Goの開発環境を用意します。もちろん、既にある場合は必要なし。
Macの場合はhomebrewで楽ちん。

```Bash
$ brew install go
```

ついでに、.bash_profileにGOROOT, GOPATH, PATHの設定を追記。
私の環境では以下の様に設定されていました。（随分前に書いたからよく覚えてない…。）

```Bash
# Go
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

これでGoの環境設定は大丈夫。

### SensorBeeのインストール

よし、ではSensorBeeをインストールするぞ！といっても一行以下を実行するだけです。

```Bash
$ go get gopkg.in/sensorbee/sensorbee.v0/...
```

以下を実行してみましょう。

```Bash
$ sensorbee run
```

うまくいかない時は、多分PATHの設定等がまずいかも。


## Next

次回は以下のチュートリアルを実行しながら、SensorBeeの基本的なコンセプトや使い方を見ていきます。
http://docs.sensorbee.io/en/latest/tutorial.html#getting-started
電子工作 / AD2 > Hum noise reduction > Band Elimination Filter > LTSpiceで計算 | ブレッドボード実測 | ユニーバサル基板実測

http://qiita.com/7of9/items/19a7540b4ea0f43c8215
にてハムノイズが出ている件の続き。


## Band Elimination Filter (BEF)

以下を見つけた。
http://chtgkato3.med.hokudai.ac.jp/kougi/med_engineer/me9.pdf

2５枚目
> 帯域除去フィルタ Band-Elimination Filter 
>
> 商用交流雑音（ハム）が発生する50または60Hzの信号だけ除去するフィルタ

Rx２とCx2, R/2と2Cを用意する。

R,Cの値は fo = 1/2pi CR の計算式から求める。

例として R=100Ωとすると、fo = 60Hzの除去の場合、C=0.00002625 = 26.525 uF程度。

## LTSpice

LTSpiceしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d0902ec1-9462-1641-4dc6-dfae209a1a88.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5ea8c077-1e1a-1200-22eb-91fa543ea69e.png)

20mV 60Hzのノイズが4mV以内に落ちている。

あとはこれに近い値のコンデンサを買えば実測できそうか。

(追記 2016/03/19)
店頭で売っていそうな値としては以下のような組合せになりそうだ。

- R: 120, 51
- C: 22uF, 47uF

上の結果より悪くなっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e5912081-b386-d9db-6476-9223971912b2.png)


## ブレッドボードで実測

ブレッドボードで構成してみた。

- R: 120, 51
- C: 22u, 47u

### v0.1 AD2のコネクタ側でBEF適用 on ブレッドボード

![DSC_0156.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/78f0a640-0813-15b4-fad4-1578c5c1083c.jpeg)

以下はBEFを入れていない状態。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/486709fd-c287-ba0b-adbc-62bf2e318c3b.png)

以下はBEFを入れた状態。
確かにノイズがへったが、まだピークtoピークで100mV程度はある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e537302f-d102-467e-d3ee-36b5dcc569d1.png)


### v0.2 プローブの信号とGND側でBEF適用 on ブレッドボード

BEFをAD2のコネクタ側で適用するのではなく、プローブの先の信号とGND側に適用したらノイズ低減率が上がった。

以下でピークtoピークは16mV程度。

改善したが、プローブの先端でBEFを適用となると、せっかくのプローブが被測定対象をつかまずにBEFを掴み、そのBEFから別途ICクリップなどで被測定対象をつかむ、という構造になるのがひっかかる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/058e90b2-14b9-0e0e-0111-207a261bfc56.png)

### v0.3 AD2のコネクタ側でBEF適用 on ユニーバサル基板

ユニーバサル基板で実装してみた。

R120とC22uFだけを購入すれば良かったと後で気づいたが、R51,C47uFも買ってしまっていた。
[回路図 @ upverter](https://upverter.com/eda/#tool=schematic,designId=d4daa9f1405c93a1)

コンデンサと抵抗が４つずつついている基板が今回実装したもの。
![DSC_0157.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/a4a8921b-e037-4008-1277-1934aa6078fc.jpeg)


やはりプローブの先でBEFを使うと測定時が面倒そうなので、AD2のコネクタ側につけてみた。

ピークtoピーク電圧で16mV程度。ブレッドボードの時より改善している。
ブレッドボードではケーブルが長くなってしまうのが問題なのだろうか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c47b5ebf-da97-50e3-7a24-ffa279c3c828.png)

しかし、ピークtoピーク電圧が16mVなのはまだ大きい。
Ansibleでsuとsudoを併用する

## 概要
Ansibleでは、`become`という仕組みで`su`または`sudo`を実現できるが、`su`または`sudo`のどちらかに統一しておく必要がある。
例えば、`su`でユーザ変更した後の`sudo`が仕様上できない。（`sudo`で統一しておくのが普通。。）
Ansible 2.0より加わった`expect`のモジュールを用いて、対話形式パスワードを乗り越える。

## 例

sshユーザ：aaa
Ansibleタスク実行ユーザ（`become_user`）：bbb（aaa -> `su` -> bbb）
その後、bbbユーザが`sudo`を使ったコマンドを実行する。

## Playbook

```yaml:webservers-playbook.yml
- hosts: webservers
  vars:
    - password: hogehoge
  tasks:
    - name: yum update
      become: yes
      become_user: bbb
      become_method: su
      expect:
        command: sudo yum update -y
        responses:
          password for bbb: "{{password}}"
```

実行時に `--ask-become-pass`を付けて、bbbユーザになるため（`become`）のパスワードを入力

```bash
### 実行
$ ansible-playbook -i webservers webservers-playbook.yml --ask-become-pass
SUDO password: (聞かれるので、bbbユーザのパスワードを入力)
```

## セキュリティ対策
上記のやり方だと、playbookにパスワードが直書きになってしまっているため、暗号化を推奨する。

```bash
### 暗号化
$ ansible-vault encrypt webservers-playbook.yml
New Vault password: (復号用のパスワードが聞かれる)
Confirm New Vault password: (復号用のパスワード(確認)が聞かれる)
Encryption successful

### 暗号化されたことを確認
$ cat webservers-playbook.yml
$ANSIBLE_VAULT;1.1;AES256
65306337623632636662313263376337313837326233643939613331306261386663636132626334
6633663038333836363835313030393064383239666538650a633066346665313536366664363638
34653038653031623062643931353565613166313539326263646539633863353663646634326332
3031623064623533360a393230346331303564303633353830393430656464303266346435306435
34373635386530383561613231393933646139303532323132626164363633646265366565376530
61313037313339336631366237333338366336666436343938373761623565313064393763383637
37613132623665623535373932653465353135343638343630363238386630366637383333626533
38353830373737333130373061303136663836303239303634346635366237356462393930633163
36383961356134326137636564616364393738326338646632623963663330626435363131633464
39346137363038373130623866333036373164633138386133383434383334613437326665313063
31626462353633656564346163656261356133383261333330393239326564343532393639653531
61656563613730373530643966383932393762333562336262373834336434616266373361396438
35643533623337313763653561343735346663346630393837376531393234343366303431656136
34376562633836356330623235303137373463393236363331666639343765306534353363393339
32643435346334383463323661653563623839323665333765313133356563393738633532623531
34323165323639653038323661393437663566393833616337386138393034356435346637623631
65373238333564343663636539656439383761363038633033383164636666633561
```

暗号化されたものを実行する。

```bash
### 暗号化したものを実行
$ ansible-playbook -i webservers webservers-playbook.yml --ask-become-pass --ask-vault-pass
SUDO password: (聞かれるので、bbbのパスワードを入力)
VAULT password: (聞かれるので、復号用のパスワードを入力)
```

## まとめ

もっと良いやり方がありそうな。。ｗ
バイト配列を16進数の文字列に変換する

#byte型配列の記載例

大文字にしたかったので"%02x"じゃなくて"%02X"としています。

```java
        byte[] array = hoge();  // byte配列を返すメソッドのつもり
        StringBuilder sb = new StringBuilder();
        for (byte d　: array) {
            sb.append(String.format("%02X", d));
        }
        String str = sb.toString();
```

#Byte型配列の記載例

ご指摘をいただいたので追記しました。

```java
        Byte[] array = hoge();  // Byte配列を返すメソッドのつもり
        String str = Arrays.stream(array)
                .map(b -> String.format("%02X", b))
                .collect(Collectors.joining());
```
Angular2で階層的DIを使う

Angular2でとっても便利だと思ったのは、DI。コンポーネントの階層に応じて代入することができます。

## サンプル

http://plnkr.co/edit/OqmiaLT5bPwjlQsWQ4mY


## バージョン

Angular2 beta.9

## 使い方

注入されるクラスに `@Injectable()` を設定する

```ts
@Injectable()
export class MyData {
	public title:string = "サンプルテキスト";
}
```


注入したい対象のクラスのアノテーションに `providers: [クラス名]` を記述する


```ts
@Component({
	selector: 'my-foo',
	template: `
		<h2>FooComponent</h2>
		<my-hoge></my-hoge>
		<my-piyo></my-piyo>
	`,
	providers: [MyData],
	directives: [HogeComponent, PiyoComponent]
})
class FooComponent {
	constructor(private myData:MyData) {
	}
}
```



このコンポーネントにぶら下がる子供のコンポーネントは、`providers`を設定しなくても、コンストラクターで受け取ることができます。

```ts
@Component({
	selector: 'my-hoge',
	template: '<p>見出し : {{myData.title}}</p>'
})
class HogeComponent {
	constructor(private myData:MyData) {
	}
}
```

以上。簡単ですね。神機能です！
ドドスコスコスコ with PHP

#「ラズパイ部」略して「ラ部」作ろうぜ

急にそんな声が聞こえてきたので、景気付けにラブ注入することにした


# 要件

- 「ド」と「スコ」をランダムに抽選する
- 「ドドスコスコスコドドスコスコスコドドスコスコスコ」がならんだらラブ注入する

# 実装

```php
<?for(;!preg_match("/(00111){3}/",$s.=rand()%2);)?><?=strtr($s,[ド,スコ])?>ラブ注入
```
<img width="877" alt="スクリーンショット 2016-03-18 21.20.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/109466/ce9df4e9-bf61-ab36-a318-7ad328f10c3e.png">


# どっかでみたことあるような

もしかしなくても：[ズンドコキヨシ with PHP](http://qiita.com/mitsugogo/items/20b466d30a10f92a0b34)
Amazon Linuxと同じオプションでビルドされたPythonを使って安全にLambda functionをデプロイしよう

# Lambda for Pythonのデプロイ環境によって生じる問題
特にC拡張の使われているライブラリを使用する際に多いのですが、ビルド時のオプションの違いによって問題がエラーが起きることがあります。
特に文字コードですね・・・観測した範囲ではCircleCIの環境が`UCS2`を使用しており、Lambda(Amazon Linux)の標準では`UCS4`を使用しているためエラーになることがあります。
他にも色々試行錯誤している時だったのでどんなエラーだったかは覚えていないですが、手元のUbuntu環境に`pyenv`で入れたPythonで動いたコードがLambda上で動かなかった経験があります。

# 問題を解消する方法

## Amazon Linuxを使う
まず、Amazon Linux上のvirtualenvで独立させた環境にpypiライブラリ等をインストールし、デプロイするという方法があります。一番分かりやすくて確実です。ですが、そのためだけに一台EC2を立てておくのも勿体無いですし、Jenkins等を使うことになるでしょうが、運用も面倒です。

## Amazon Linuxと同じオプションでPythonをビルドする
これならどこでも使えます。ですが、既存の環境を汚さないように配慮する等考えると面倒ですし、CI as a Serviceなんかだと毎回捨てられてしまうのでデプロイの度にビルドするのも時間がかかります。Dockerイメージ持ち込み可能なサービスを使ってイメージに焼くという手もありますが、ちょっと大袈裟な感じがします。


## Amazon Linuxと同じオプションでビルド済みのPythonを含むパッケージをインストールする
これが、今回の本命です。Amazon Linuxと同じオプションでビルドされ、独立したPythonランタイムを提供する`rpm`, `deb`等があれば手軽で手早く、かつ安全に使用することができます。

**ということで、はい。作りました。**
http://qiita.com/marcy-terui/items/9b3610bed4e5fcafd9b9
一部システムグローバルなライブラリなどに依存できないために外したオプションなどもありますが、普段使わないものばかりだったので問題ないはずです。

# インストール方法
## yum

①リポジトリを追加

```shell-session
echo "
[bintraybintray-willyworks-rpm]
name=bintray-willyworks-rpm
baseurl=https://dl.bintray.com/willyworks/rpm/centos/\$releaserver/\$basearch/
gpgcheck=0
enabled=1
" | sudo tee -a /etc/yum.repos.d/bintray-willyworks-rpm.repo
```

②インストール

```shell-session
sudo yum install lamvery
```

## apt

①リポジトリを追加

```shell-session
echo "deb https://dl.bintray.com/willyworks/deb trusty main" | sudo tee -a /etc/apt/sources.list
```

②インストール

```shell-session
sudo apt-get update
sudo apt-get install install lamvery
```

# 使用方法
`/opt/lamvery/bin`配下に以下の実行バイナリ（スクリプト）がありますので、必要に応じてPATHを通すなどしてお使いください。

- Python 2.7.9 (2016.03.18現在)
- pip
- virtualenv
- lamvery

参考までにCircleCIで使用する場合の記述例はこちら。

```yaml:circle.yml
---
machine:
  environment:
    PATH: /opt/lamvery/bin:$PATH

dependencies:
  pre:
    - |
      echo "deb https://dl.bintray.com/willyworks/deb trusty main" | sudo tee -a /etc/apt/sources.list
      sudo apt-get update
      sudo apt-get install lamvery
```

# 最後に
`virtualenv`内で`lamvery`を使用すると、とても簡単にLambda for Pythonのfunctionがデプロイできます。
興味があればこちらも参照してみてください。もちろんPythonだけ使うために使ってもOKです。

AWS Lambda向けデプロイ・管理ツール「Lamvery」について
http://qiita.com/marcy-terui/items/1617ab4e20e3339d1930

CircleCI + LamveryによるLambda functionのdeployベストプラクティス
http://qiita.com/marcy-terui/items/900b72efb38f9b26e8f0

以上、ステマでした。
gulpfile.jsの書き方確認。

[**2016.9/10 fileの書き方を更新しました。**](http://qiita.com/hitomi5/items/8e2aa30203017ab95703)

gulpfile.jsの記述、コピペだけで済ましてると何がどうなってるか分からん・・・となったので、私のgulpfileを例に今一度確認します。

sassのコンパイルが出来て、エラーで監視が止まらなくて、デベロッパーでソースマップが出て、
メディアクエリの記述があちこちにバラけてる場合最終的にまとまってくれるタスクです。
↓プラグインはこちら↓
gulp-sass・・・sassのコンパイルをする
gulp-plumber・・・ファイル監視中におかしいとこがあっても監視をストップしない
gulp-sourcemaps・・・スタイルがどこのファイルから当てられてるのか分かるようになる
gulp-combine-media-queries・・・@mediaの記述があちこちに散らばってる場合、後ろの方にまとめてくれる

↓npmで入れられるgulpプラグイン一覧の公式ページ↓
[npm install gulp](https://www.npmjs.com/package/gulp)

↓ちなみにターミナルでプラグインの入れ方はこちら↓
`$ npm install --save-dev プラグイン名`

↓gulpfile.jsの記述↓

```js:gulpfile.js

var gulp = require('gulp');
var sass = require('gulp-sass');
var plumber = require('gulp-plumber');
var sourcemaps = require('gulp-sourcemaps');
var cmq = require('gulp-combine-media-queries');//@media

gulp.task('sass',function(){
    gulp.src('sass/*.scss')
    .pipe(sourcemaps.init())
    .pipe(plumber())
    .pipe(sass({style : 'expanded'})) 
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('css'));
});

gulp.task('cmq', function () {
  gulp.src('css/*.css')
    .pipe(cmq({
      log: false
    }))
    .pipe(gulp.dest('css'));
});

gulp.task('watch', function () {
    gulp.watch('sass/*.scss', ['sass']);
});
gulp.task('default', ['sass','cmq']);
```

- var

最初にvarを使って変数にします。何故？そういうもんなんです。地球が回ってるのと一緒です。

- gulp.task

gulpを使って処理してほしいことを書きます。
`gulp.task('プラグイン名',function(){});`
これで囲って中に色々書いていきます！
`gulp.src('ディレクトリ名')`
実行ファイルの場所を指定して、
`.pipe(プラグイン名())`
で動作。コンパイルなどでファイルが生成される場合は、
`.pipe(gulp.dest('ディレクトリ名'));`
では吐き出し先を指定と。

`.pipe(sass({style : 'expanded'}))`
吐き出しスタイルは指定出来ます！

| 形式種類   　 | 特徴　　　　　　　　　　　　　 　　　　　　|
|:-----------|:------------|
| nested     | ネストされるので階層構造がわかりやすい|
| expanded   |一般的な手書きのCSSに近い |
| compact    |セレクタごとに1行にまとめられる |
| compressed |すべてが1行にまとめられる|


最後、default！
タスクがいっぱいあるとgulp実行時に『defaultを指定してー』と言われます。私は言われました・・・。
その時は一番下に
`gulp.task('default', ['プラグイン名','プラグイン名']);`
のように書いてデフォルト処理を指定すればやってくれます！
最近までこれ分からなくてあーーーーーとなってました・・・。

正直説明見ただけで完璧に理解出来ないので、やってみた方が早いすわ〜。


追記-------------------------------160319

新しいディレクトリ作って上記のプラグイン入れてgulpfile書いてgulp叩いたらエラーになった・・・
<img width="1188" alt="スクリーンショット 2016-03-19 19.42.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/110274/0751659d-ce45-84d2-2992-f4217ce8eff1.png">

記事投稿した後割とすぐだったのでエエエエエエエとなった。
で、エラーの原因はgulp-combine-media-queriesらしかったので、
node_modulesの中のgulp-combine-media-queriesにあるindex.js、152目！

`file.contents = new Buffer(cssJson);`

を//でコメントアウトします。するとエラーは消えました〜よかった・・・
いずれ解決されるらしい？

追記-------------------------------160402

watchについて触れていなかった・・・
見たまんまですが、保存するたびにgulp叩かなくても自動的に更新してくれるいい奴。
sassディレの中を見てて欲しいので、
`gulp.watch('sass/*.scss', ['sass']);`
で場所指定するだけ〜
第一引数に監視したいファイルのパス、 第二引数に実行したいタスク名です。
なぜこの説明を忘れていたのか・・・・・。