OmniAICreator/Qiita-1.07M huggingface dataset:
UniRxのシンプルなサンプルの取扱説明書

# 取扱説明書 #
この記事はUniRxのシンプルなサンプルの取扱説明書です。
サンプルを使うときはひと通り目を通してから使うほうがベターです。

## 記事一覧 ##

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[UniRxのシンプルなサンプル その0(Rx オーバービュー)](http://qiita.com/Marimoiro/items/897209893e78e68244fe)
[UniRxのシンプルなサンプル その1(Subscribe)](http://qiita.com/Marimoiro/items/186ce9215325229a8d8b)
[UniRxのシンプルなサンプル その2(WhereとSelect)](http://qiita.com/Marimoiro/items/5127e34de0f80e6e33fc)
[UniRxのシンプルなサンプル その3(FirstとTake)](http://qiita.com/Marimoiro/items/b24510b0ffd273f69f8a)
[UniRxのシンプルなサンプル その4(SkipとSkipWhile)](http://qiita.com/Marimoiro/items/de9daf28532049b5195b)
[UniRxのシンプルなサンプル その5(Buttonが押されたら動くGameObjet)](http://qiita.com/Marimoiro/items/bba05b7b1e15f0c804a8)
[UniRxのシンプルなサンプル その6(購読の停止)](http://qiita.com/Marimoiro/items/819ddb3e68aab7ee3b95)
[UniRxのシンプルなサンプル その7(完了の通知)]
(http://qiita.com/Marimoiro/items/31cad556e1675c557be3)
[UniRxのシンプルなサンプル その8(ObservableWWW.Get ダウンロード)](http://qiita.com/Marimoiro/items/dbd84ed9c6d5aa129f2a)
[UniRxのシンプルなサンプル その9(TimerとInterval 一定時間後に実行)](http://qiita.com/Marimoiro/items/a72b60315c797c19a27c)
[UniRxのシンプルなサンプル その10(プッシュを遅らせる Delay)](http://qiita.com/Marimoiro/items/a6131e9bde9b0d13b1ba)
[UniRxのシンプルなサンプル その11(シーケンスをつなげる Concat)](http://qiita.com/Marimoiro/items/f49dfd886de4900042c9)
[UniRxのシンプルなサンプル その12(最後のペアを取得する CombineLatest)](http://qiita.com/Marimoiro/items/9252cf7eaefee22a9f76)
[UniRxのシンプルなサンプル その11 (IObservableを作成する Create)](http://qiita.com/Marimoiro/items/440b4dd7e0b2f99d4802)

## サンプルのソースコード ##
[GitHub](https://github.com/Marimoiro/UniRxSimpleSample)
自由にお使いください。UniRxを含んでいないのでAssetStoreから取得してください。(無料です。すばらしい！)
（ただし一切の保証をしません。）

Samplesにそれぞれの回で使ったGameObjectがまとまってプレハブになっています。
Partsにはそれぞれの機能のスクリプトと単体のプレハブが入っています。

# ソースコードの取扱説明書 #
コピペ上等ですがいくつかの注意事項があります。

## オブジェクトの寿命 ##
サンプルはコードに余計な情報を含めないためにそぎ落としています。
これもその一つなのですが、ほとんどのコードでObserverの寿命を考慮したコードになっていません。
くわしくは[UniRxのシンプルなサンプル その6(購読の停止)](http://qiita.com/Marimoiro/items/819ddb3e68aab7ee3b95)を御覧ください。

## メソッドの例について ##
メソッドの例は拡張メソッドであることが多いですが、拡張メソッドでないかのように紹介しているケースが有ります。

## Baseクラス ##
Baseクラスはコードを短くするために使用しているクラスです。

```csharp:Base.cs
using UnityEngine;
using System.Collections;

public class Base : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// (dx,dy)だけ移動する
	public void Move (float dx,float dy) {
        gameObject.transform.position += new Vector3(dx, dy, 0);
	}
}

```

単純にMoveとかいうメソッドがあるだけです。
ただ地味に長くなるのでこのようにしています。

# 記事の方針 #
ソースコードを極力少なくしてクリティカルな部分だけ紹介する。
という方針を取ります。
こうすることで一回で把握しなければいけない動作が少なくなり、
なかなか難しいUniRxを少しでも理解できればいいなぁと思います。

そして基礎から説明するのでなく機能から説明することによっていじくりながら勉強できるような構成にしたいです。
（つまりObserverパターンからの説明だと最初で難しすぎて挫折した）
Xamarin.Android で Material Design を使用する方法 (Android 5.x のみ)

こんにちは。エクセルソフトの田淵です。

Android 5.x では Material Design の Theme が使用できます。Xamarin.Android でも問題なくこの Material Design を使用できますので、その方法を記載します。Android 4.4 以下は Holo.Light などの組み込みテーマが使用されます。

> Android 2.x/4.x でも Material Design を使用したい場合は、[Xamarin.Android で Material Design を v7 AppCompat で使用する方法 (Android 2.x/4.x も含む) - Qiita](http://qiita.com/ytabuchi/items/85a78d405e1ca01850cd) をご参照ください。

# プロジェクトの構成

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150430/20150430001003.png" width="350" />

どのように構成しても問題ないと思いますが、より Android Studio の構成に近くなるように、Xamarin Studio でデフォルトで作成される Android アプリからメニューなどを追加しています。

追加・修正した点は メニュー項目の ``main_menu.xml``, Material 用カラー設定項目の ``colors.xml``, Padding などの設定項目の ``dimens.xml`` と Material Design 用の values, values-v21 以下の ``styles.xml`` です。 

プロジェクトは
[Material Design Sample](https://github.com/ytabuchi/Android/tree/master/MaterialDesignSample) として GitHub にアップしておきましたので宜しければご覧ください。

# 気になった点

### AndroidManifest について

Android 5.x の status bar の色が黒いままの場合があります。それは、AndroidManifest.xml の SDK の targetSdkVersion が 21 になっていないためだと思われます。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150430/20150430001630.png" width="450" />

このように GUI で設定できるのですが、下の方の「ソース」を開いてみると、

```xml
<uses-sdk android:minSdkVersion="15" />
```

と、設定されていないことがあるみたいです。その場合はソースに直接記載してしまいましょう。

```xml
<uses-sdk android:targetSdkVersion="21" android:minSdkVersion="15" />
```


# こんな感じになります。

(何故か XAP が調子悪くてイメージがダウンロード出来ないので x86 エミュレーターで… 悔しいｗ)

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150430/20150430001949.png" width="300" />
4.4 エミュレーター

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150430/20150430002017.png" width="300" />
5.1 エミュレーター

AppCompat を使う方法はこの後アップしますが、結構大変なので、まずは 5.x の Material Design だけでも。という方はこちらの方法をお試しください。

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ythb) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

<a href="http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe">私のはてなブログも購読いただいたりすると嬉しいです。</a>

以上です。
md5とsha256を使ってみた

# はじめに

VirtualBoxとVagrantをインストールするために、パッケージをダウンロードしました。念のため、そのパッケージが改ざんされていないことを確認するために、そのパッケージのmd5とsha256を確認しました。

動作確認はOSX Yosemiteで確認しています。

# md5でハッシュ値を生成してみる

次のコマンドラインでmd5のハッシュ値を生成しました。

```
$ md5 VirtualBox-4.3.26-98988-OSX.dmg 
```

# sha256でハッシュ値を生成してみる

次のコマンドラインでsha256のハッシュ値を生成しました。

```
$ shasum -a 256 vagrant_1.7.2.dmg 
```

# なにと比べるの？

配布元がハッシュ値を公開しています。そのハッシュ値と比べます。

- [Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)
- [Download Vagrant - Vagrant](https://www.vagrantup.com/downloads.html)

確認には、catコマンドとgrepコマンドが便利です。

# まとめ

ハッシュ値を生成して、配布元のハッシュ値と一致することを確認しました。私にはこういう習慣がなかったので、職場の同期が当たり前のようにmd5やsha256を利用していることを知りカルチャーショックでした。
DockerのClientとServerのバージョン違いのエラーを直す


## 現象

	$ docker version
	Client version: 1.6.0
	Client API version: 1.18
	Go version (client): go1.4.2
	Git commit (client): 4749651
	OS/Arch (client): darwin/amd64
	FATA[0000] Error response from daemon: client and server don't have same version (client : 1.18, server: 1.16)

## 対応方法

	$ boot2docker upgrade
	docker is up to date (1.6.0), skipping upgrade...
	boot2docker is up to date (v1.6.0), skipping upgrade...
	Latest release for github.com/boot2docker/boot2docker is v1.6.0
	Downloading boot2docker ISO image...
	Success: downloaded https://github.com/boot2docker/boot2docker/releases/	download/v1.6.0/boot2docker.iso
		to /Users/hina/.boot2docker/boot2docker.iso
	Waiting for VM and Docker daemon to start...
	................ooo
	Started.
	Writing /Users/hina/.boot2docker/certs/boot2docker-vm/ca.pem
	Writing /Users/hina/.boot2docker/certs/boot2docker-vm/cert.pem
	Writing /Users/hina/.boot2docker/certs/boot2docker-vm/key.pem
	Your environment variables are already set correctly.
	

## 確認

	$ docker version
	Client version: 1.6.0
	Client API version: 1.18
	Go version (client): go1.4.2
	Git commit (client): 4749651
	OS/Arch (client): darwin/amd64
	Server version: 1.6.0
	Server API version: 1.18
	Go version (server): go1.4.2
	Git commit (server): 4749651
	OS/Arch (server): linux/amd64
Vagrantのboxの検索と初期化


## 探す

以下から探すことができる。

* [Vagrantbox.es](http://www.vagrantbox.es/)
* [Bento](https://github.com/chef/bento)

## 初期化

### boxの追加

ここでは、Bentoからcentosをダウンロードして使うことにする。

![bento.png](https://qiita-image-store.s3.amazonaws.com/0/33439/7cb43443-64c7-6bc5-c260-2a95c5b0d41f.png "bento.png")

`vagrant box add <name> <url>`で、boxを追加することができる。

```bash
$ vagrant box add opscode-centos-6.6 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.6_chef-provisionerless.box
```

### vagrantの初期化

先ほど追加したダウンロードしたイメージは、以下のコマンドで確認することができる。(*)が追加されたbox。

```bash
$ vagrant box list
coreos-stable      (virtualbox, 633.1.0)
opscode-centos-6.6 (virtualbox, 0) <= (*)
```

初期化する。

```bash
$ vagrant init opscode-centos-6.6
```

このコマンドを実行すると、`Vagrantfile`が、コマンドを実行したディレクトリに作成される。

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

```bash
$ vagrant up
```
IPython + IJulia → Jupyter アップデート覚書

## 前置き

つい先日、Julia の stable v0.3.8 がリリースされた模様。
また2ヶ月ほど前に IPython 3.0 が正式リリースされ気付けば v3.1.0 になっていた模様。

ということでもう IPython 2.x の notebook を使う理由もないかな、と、Jupyter にアップデートしてみたので、その覚書。

### 【2015/06/01 追記】

この記事の続き（補足＋後日談）的な記事を公開しました。→ [Jupyter 環境設定補足 #pythontokai](http://qiita.com/antimon2/items/a8cd98257219773b9ef3 "Jupyter 環境設定補足 #pythontokai - Qiita")

## 環境

+ Mac OSX 10.9.5
+ Homebrew
+ Python 2.7.6 → 2.7.9
+ IPython 2.4.0 → 3.1.0
+ Julia 0.3.7 → 0.3.8

## アップデート

### Python

Homebrew で入れていた Python も少し古かったのでまずはそこから。

```
$ brew update
$ brew upgrade python
$ python --version
Python 2.7.9
```

### 各種 Python パッケージ

IPython 初め諸々 pip で入れていたのでそちらをアップグレード

```
$ pip install -U pip
$ pip list -o
  ; ↑ アップグレード可能なパッケージが一覧で出るので ipython 以外で 必要そうなのを選んで↓
$ pip install XXXXX YYYYY -U
  ; ↑ 結局全部アップグレードしたような気が…
```

### IPython

Jupyter を使いたいので `notebook` で依存関係込みでアップグレード。

```
$ pip install ipython[notebook] -U
$ ipython --version
3.1.0
```

### Julia

0.3.x はバイナリをダウンロードして配置しているだけなので特に難しいことはなく。
（Homebrew では `--HEAD` つけて v0.4.0-dev をインストールしているのでこれとは別で。）

### IJulia

Julia の REPL から以下：

```
julia> Pkg.update()
       # IJulia が最新でなかった場合、ここで最新にアップグレードされると共に 
       # IPython 3.1.0 用にビルド・設定までされる。
       # もし IJulia が最新だったらさらに↓以下を実行
julia> Pkg.build("IJulia")
Found IPython version 3.1.0 ... ok.
Creating julia profile in IPython...
# : 中略
Copying logo-32x32.png to Julia IPython profile.
Copying logo-64x64.png to Julia IPython profile.
```

## 起動・動作確認

IPython 2.x までは notebook 起動時に `--profile julia` をつけないと Julia kernel が使えませんでしたが、Jupyter からは開く note ごとに kernel を指定できる。ので起動は

```
$ ipython notebook
```

これだけ。

![Home.png](https://qiita-image-store.s3.amazonaws.com/0/30400/f18c55cd-b64a-5fcf-1ea4-fc665ce8f077.png)

![iris_plot_sample.png](https://qiita-image-store.s3.amazonaws.com/0/30400/2e001190-767e-bb83-1357-09c91ca96e6d.png)

表示結果→ https://nbviewer.jupyter.org/gist/antimon2/b6cd08965c9b2f743538
モナド変換子をためしてみた時のメモ


基本を押さえておく必要があったため、次のサイトをざっと読んでメモをとった。
[Real World Haskell : Chapter 18. Monad transformers](http://book.realworldhaskell.org/read/monad-transformers.html)

# Monad transformers

## 重要と感じた部分
> Monads provide a powerful way to build computations with effects. Each of the standard monads is specialised to do exactly one thing. In real code, we often need to be able to use several effects at once.

*モナドは強力な文脈を持った計算を提供してくれる。標準的なモナドはそれぞれ、ただ一つのことに特化している。実際のコードでは、我々はしばしば**一度に複数の文脈を用いる必要性が生じる**。*

> When the underlying monad m is an instance of MonadIO, the mtl library provides an instance for ReaderT r m, and also for a number of other typeclasses.

*根底にあるモナドが `MonadIO` インスタンスならば、 そのモナドを包んでいる `ReaderT r m` 変換子 も MonadIO のインスタンスが与えられている。
その他の型クラスについても、同様のインスタンス宣言が行なわれているので、それぞれの文脈を、別のモナドに包んだままでも扱いやすくなっている。*

> As we have already mentioned, when we stack a monad transformer on a normal monad, the result is another monad. This suggests the possibility that we can again stack a monad transformer on top of our combined monad, to give a new monad, and in fact this is a common thing to do.

*普通のモナドの上にモナド変換子を包むと、別のモナドになる。これは、さらにモナド変換子で包むことによって、新しいモナドを作れることを示唆している。実際このやり方は一般的である。*

## 覚えておこうと感じた部分
> we use a WriterT on top of IO because there is no IOT monad transformer. Whenever we use the IO monad with one or more monad transformers, IO will always be at the bottom of the stack.

*IO モナドをスタックの一番上に積むことはできない。IOT monad transformer はない。IO モナドを利用したいなら、常に bottom に配置する。*

> The Reader r monad is an instance of the MonadReader class, as is the ReaderT r m monad transformer.

*これがモナドとモナド変換子との関係性の例。その他のモナドもこの規則に従う。 `WriterT r m` は `MonadWriter r m | m -> r` クラスのインスタンスである。*

## 試してみた
入れ子になっているぞれぞれのモナドアクションを実行することができ、３つの文脈を使うことができた。また、必要に応じて結果を加工できた(下記はそれらを試すだけのコードであり、この関数の定義内容に機能的な意味はない）。


```hs
import Control.Monad.Writer
import Control.Monad.Reader
import Control.Monad.State

type NewMonad = WriterT [String] (State Int)

-- | WriterモナドとStateモナドを合成
testWriterState :: NewMonad Int
testWriterState = do
  tell ["hello"]
  lift $ put 200
  tell ["world"]
  n <- lift $ gets (*3)
  return $ n+40

-- runState (runWriterT testWriterState) 30 -> ((640,["hello","world"]),200)

-- | さらにReaderモナドも合成する
testMultiMonad :: ReaderT String NewMonad Int
testMultiMonad = do
  str <- ask
  writerTell [str]
  stateModify (*5)
  stateGets (+100) -- Stateモナドアクションの結果をWriterの結果に束縛している
  where
    stateModify = lift . lift . modify
    stateGets = lift . lift . gets
    writerTell = lift . tell

val = runState (runWriterT $ runReaderT testMultiMonad "30") 100
-- ((600,["30"]),500)
```
超手っ取り早く SSL サーバ証明書 (自己署名証明書) を作成する


# はじめに
前回の「[Ruby の openssl ライブラリを使って、サーバ証明書やクライアント証明書を作成する](http://qiita.com/k-masaki/items/12b5e8a1874214308912)」で Ruby をつかってサーバ証明書やクライアント証明書を作成する方法を書きましたが、実際には「SSL サーバ証明書を作成するために OpenSSL を使う」という人が大半だと思いますし、Ruby を使ったことがない人も多いと思います。
今回は、Ruby がわからなくても「簡単にサーバ証明書を作成する方法」をつくってみました。(ただし、Ruby はインストールしておく必要があります)

## 準備するもの
- Ruby
- Git (必須ではない)

# リポジトリを clone する

```bash:cmd
$ git clone https://github.com/k-masaki/certification-publisher.git
$ cd certification-publisher
```

Git をインストールしていない場合は、[こちら](https://github.com/k-masaki/certification-publisher/archive/master.zip)からダウンロードしてください。ダウンロード、解凍をしたら、解凍したフォルダにコンソールで移動してください。


# プライベート CA を準備する
`config.yml` を編集することで、証明書の値を変更することができます。 (任意)

```yaml:config.yml
C:  JP
ST: Tokyo
DC: Minato-ku
O:  Example, Inc.
CN: Example CA
```

以下のコマンドを実行して、CA を構築する

```bash:cmd
$ ruby prepare.rb
```

実行が完了すると、`ca` フォルダ配下に `ca_private_key.pem` (CA の秘密鍵) と `ca.pem` (CA の証明書) が作成されています。


# サーバ証明書を作成する
例えば、`example.com` 用の SSL サーバ証明書を作成する場合は、以下のようなコマンドを実行します 

```bash:cmd
$ ruby publish.rb example.com
```
実行が完了すると、`example.com` フォルダ配下に `example.com.key` (サーバの秘密鍵) と `example.com.crt` (サーバ証明書) が作成されています。
あとはそれらを Web サーバに送ってよしなにやってください。

`ca/ca.pem` をクライアント PC (ブラウザ) 側で信頼すると、Web サーバにアクセスしたときに警告画面も出ないので快適です。
これで、ワンコマンドで SSL 証明書が作成できるようになりました！
Unity を Git でバージョン管理する


Unity をいろいろいじっていて何がどうなっているのか自分でわからなくなる前に、
Git でバージョン管理できるようにしておきたいと思います。

でも、Git はコマンドラインでたくさんコマンドを覚えないといけないから大変だな、、
と思っていたところ、こちらの SourceTree の紹介記事を発見しました。

[【連載Git入門目次】ほんとは簡単？SourceTreeでGitを始めよう！](http://naichilab.blogspot.jp/2014/01/gitsourcetreegit.html "【連載Git入門目次】ほんとは簡単？SourceTreeでGitを始めよう！")

これは、解りやすいし、簡単に使えそうということで、Unity プロジェクトのバージョン管理の手順をまとめておきます。
SourceTree の使い方などは上記サイトなどでお調べください。

#### 私の環境

|種類|バージョン|
|:---|:---|
|OS X Yosemite|バージョン 10.10.3|
|Unity|Version 5.0.1f1 Personal|
|SourceTree|バージョン 2.0.5.5 (2.0.5.2)|
|内蔵Git|バージョン 2.2.1|

1. Unity プロジェクトの設定
	
	```
	メニュー「Edit」→「Project Settings」→「Editor」
	Inspectorビューの Editor Settings を設定する
	Version Control の Mode を Visible Meta Files に変更する
	Asset Serialization の Mode を Force Text に変更する
	```
	
	**Unity を保存して終了する**

2. ローカルリポジトリの作成

	```
	SourceTree の「+ 新規リポジトリ」→「ローカルリポジトリを作成」
	「保存先のパス」に Unity プロジェクトのディレクトリを指定し作成する
	ダブルクリックして、リポジトリを開く
	```

3. リポジトリ限定無視リストの編集

	```
	SourceTree のリポジトリの「設定」→「高度な設定」→リポジトリ限定無視リストの「編集」
	.gitignoreファイルに下記の内容をコピペする
	バージョン管理に不要なファイルが除外されたことを確認する
	この状態でコミットする（※必ず Unity が終了していることを確認してからコミットする）
	```

	```:.gitignore(2016/05/26更新)
	/[Ll]ibrary/
	/[Tt]emp/
	/[Oo]bj/
	/[Bb]uild/
	/[Bb]uilds/
	/Assets/AssetStoreTools*
	
	# Autogenerated VS/MD solution and project files
	ExportedObj/
	*.csproj
	*.unityproj
	*.sln
	*.suo
	*.tmp
	*.user
	*.userprefs
	*.pidb
	*.booproj
	*.svd
	
	
	# Unity3D generated meta files
	*.pidb.meta
	
	# Unity3D Generated File On Crash Reports
	sysinfo.txt
	
	# Builds
	*.apk
	*.unitypackage

	# Visual Studio
	.vs
	Release/
	Debug/
	```

4. リモートリポジトリの作成（リモートリポジトリ使用時のみ）

	```
	SourceTree ではリモートリポジトリの作成はうまくできないようです。(2015/05/03)
	Bitbucket の Webサイトでリモートリポジトリを作成する
	SourceTree のリポジトリの「設定」→「リモート」→「追加」
	URL/パスの「地球マーク」をクリック
	リモートリポジトリを選択してOK
	```

5. リモートリポジトリにプッシュする（リモートリポジトリ使用時のみ）

	```
	SourceTree のリポジトリの「プッシュ」→「ブランチ選択」→「OK」
	```

6. リモートリポジトリからクローンを作成する（リモートリポジトリ使用時のみ）

	```
	SourceTree の「リモート」→リポジトリの「クローン」
	保存先のパスを選択して「クローン」
	```

7. Unity で確認する（リモートリポジトリ使用時のみ）

	```
	クローンを Unity で開く
	クローンでも Unity の設定をしておきます
		メニュー「Edit」→「Project Settings」→「Editor」
		Inspectorビューの Editor Settings を設定する
		Version Control の Mode を Visible Meta Files に変更する
		Asset Serialization の Mode を Force Text に変更する
	動作確認する
	```


以上になります。
あとは、ローカルリポジトリで開発しながらコミットしてバージョン管理していきます。
【PHP】文字列の中で定数を展開する

文字列中に変数を混ぜてダブルクォートで囲むと変数を展開することが出来る。
定数はこれができない。

```php:php
$hensu = "へんすう";
define("TEISU","ていすう");
echo "変数を展開→{$hensu}←変数を展開";//実行結果：変数を展開→へんすう←変数を展開
echo "定数を展開→{TEISU}←定数を展開"; //実行結果：定数を展開→{TEISU}←定数を展開
```

展開用のラムダを作ってしまおう。

```php:php
$_ = function($s){return $s;};//展開用
echo "定数を展開→{$_(TEISU)}←定数を展開"; //実行結果：定数を展開→ていすう←定数を展開
```

定数展開できないためにヒアドキュメントをあきらめて、
```.=```でクエリをクチャクチャ連結してるコードが多すぎ。
ダサい。
リポジトリ内のとあるフォルダを別のリポジトリとして独立させるには？

ライブラリソースとアプリケーションのソースを一緒くたに管理していて、あるとき「やっぱり別々にしないとダメだ！」といった状態になったので、検証してみました。

今回は TortoiseGit と Git Bash の2つを使います。

#検証手順
手順は以下のとおりです。

0. 「右クリック > Git クローン」を選択して、元となるリモートリポジトリから新しいリモートリポジトリを作成します。<br>
「URL」には元となるリモートリポジトリのアドレスを、<br>
「ディレクトリ」には新しく作成するリモートリポジトリのパスを指定します。<br>
<br>
また、今回はリモートリポジトリを作成するので、「Bareリポジトリにクローン」にチェックを入れます。<br>
<br>
0. 新しく作成したリモートリポジトリを選択して、「右クリック > Git Bash」を選択します。
0. 以下のコマンドを実行します。<br>
**git filter-branch --subdirectory-filter [分離するディレクトリのパス]**<br>
<br>
このコマンドを実行すると、指定したディレクトリ以外の履歴が綺麗さっぱり消えます。<br>
また、ルートディレクトリも指定したディレクトリになっています。

これで分離できました。

#参考サイト
* Git で複数のリポジトリをまとめたり、逆に切り出したりする
http://qiita.com/uasi/items/77d41698630fef012f82

* gitリポジトリのサブディレクトリを別のリポジトリとして抽出する方法 – 拡張現実ライフ
http://akio0911.net/archives/3421
chpwd_recent_filehandler:29: no such file or directory: /Users/username/.cache/shell/chpwd-recent-dirs     Error: no buffer to work with was available`

# 問題
GitHubで管理しているdotfilesを新しいPCにcloneし、dotfilesLink.shを実行したときに以下のエラーがおきた。

    chpwd_recent_filehandler:29: no such file or directory: /Users/username/.cache/shell/chpwd-recent-dirs
    Error: no buffer to work with was available`


# 対処
`.zshrc`に記述したcdrの設定部分が`/Users/username/.cache/shell/chpwd-recent-dirs`を必要としているので、`/Users/username/.cache/shell`を作っておけばよい。
Electronを半日使ってみました。

## Electronとは
![Electron](http://electron.atom.io/images/electron-logo.svg)

Web技術でデスクトップアプリを開発するフレームワークです。Windows/Mac/Linuxで動くアプリを作ることができます。
[Atom](https://atom.io/) / [Visual Studio Code](https://code.visualstudio.com/)などはこれで開発されている様です。

## 参考資料
- [公式サイト](http://electron.atom.io/)
- [Repository](https://github.com/atom/electron/tree/master/docs)  
- [Electron Starter](https://github.com/atom/electron-starter)

#### 最初に目を通すといいかも
- [QuickStart](https://github.com/atom/electron/blob/master/docs/tutorial/quick-start.md) main process/renderer processの概念説明など。
- [Application Distribution](https://github.com/atom/electron/blob/master/docs/tutorial/application-distribution.md) 配布方法。
- [Synopsis](https://github.com/atom/electron/blob/master/docs/api/synopsis.md) node_modulesを使う方法。

#### mainとrendererで通信するなら
- [ipc(main process)](https://github.com/atom/electron/blob/master/docs/api/ipc-main-process.md)
- [ipc(renderer)](https://github.com/atom/electron/blob/master/docs/api/ipc-renderer.md)
- [remote](https://github.com/atom/electron/blob/master/docs/api/remote.md)

## ハマった点
- 単にwebviewタグを追加しただけでは何も表示されない  
Chromium optimizationのバグっぽい。何かしらのscriptタグを追加すると解決される。 [参考](https://github.com/atom/electron/issues/1117)
- jQueryが使えない？  
BrowserWindowのoptionで```"node-integration":false``` にすると解決される（逆にio.jsのAPIは使えなくなる）。他にも解決方法あるかもしれません。
[参考](https://discuss.atom.io/t/electron-app-to-host-external-site/16390)
[Swift]TwitterやFacebookの様に、日時を「n秒前」や「n日前」で表示するextension


SNSなどの日時表示で使われているアレです。簡易的ではありますが、お役に立てられれば嬉しいです。

※以下の関数をswiftで書き直させていただいたものになります :bow:
[fuzzy_time.php (Gist)](https://gist.github.com/wgkoro/4985763)


## 実行例
現在日時を``2015/5/3 18:00:00``とした場合、

```test.swift
println(NSDate.parse("2015-05-03T18:00:00+09:00").toFuzzy()) // 0秒前
println(NSDate.parse("2015-05-03T17:59:59+09:00").toFuzzy()) // 1秒前
println(NSDate.parse("2015-05-03T17:30:00+09:00").toFuzzy()) // 30分前
println(NSDate.parse("2015-05-01T18:000:00+09:00").toFuzzy()) // 2日前
println(NSDate.parse("2015-01-01T18:000:00+09:00").toFuzzy()) // 1月1日
println(NSDate.parse("2014-05-03T18:000:00+09:00").toFuzzy()) // 2014年5月3日
```

## 仕様
- 1分未満は **n秒前**
- 1時間未満は **n分前**
- 1日未満は **n時間前**
- 31日以内は **n日前**
- 32日以上前の場合は **M月d日**
- 32日以上前で、現在と年が違う場合は **yyyy年M月d日**

## コード
```extension.swift
extension NSDate {
    func toFuzzy() -> String {
        let now = NSDate()
        
        let cal = NSCalendar.currentCalendar()
        let calUnit: NSCalendarUnit = .CalendarUnitSecond | .CalendarUnitMinute | .CalendarUnitHour | .CalendarUnitDay | .CalendarUnitYear
        let components = cal.components(calUnit, fromDate: self, toDate: now, options: nil)

        let diffSec = components.second + components.minute*60 + components.hour*3600 + components.day*86400 + components.year*31536000
        var result = String()
        
        if diffSec < 60 {
            result = "\(diffSec)秒前"
        } else if diffSec < 3600 {
            result = "\(diffSec/60)分前"
        } else if diffSec < 86400 {
            result = "\(diffSec/3600)時間前"
        } else if diffSec < 2764800 {
            result = "\(diffSec/86400)日前"
        } else {
            let dateFormatter = NSDateFormatter()
            
            if components.year > 0 {
                dateFormatter.dateFormat = "yyyy年M月d日"
                result = dateFormatter.stringFromDate(self)
            } else {
                dateFormatter.dateFormat = "M月d日"
                result = dateFormatter.stringFromDate(self)
            }
        }
        
        return result
    }

    class func parse(dateString:String) -> NSDate {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZZZ"
        let d = formatter.dateFromString(dateString)
        return NSDate(timeInterval: 0, sinceDate: d!)
    }
}
```
可視化で理解する中心極限定理 #rstatsj

こういう話がある。

- [【統計学】中心極限定理のイメージをグラフで掴む](http://qiita.com/kenmatsu4/items/351284ef430bcfd2c8ed)

非常に素晴らしいのでアニメーションにしてみた。
下が指数分布からサンプリングしたデータのヒストグラム、上がそのデータの平均値のヒストグラムである。
下図の赤い線はデータの平均値を表している。

![animation.gif](https://qiita-image-store.s3.amazonaws.com/0/2570/847e890d-d064-9f8e-42dd-6a892bc4f7af.gif)

指数分布からサンプリングしたデータの平均値は正規分布に従うことがわかる。

コードは下記。

```r:R
library(animation)
library(ggplot2)
library(gridExtra)

saveGIF( {
  means <- c()
  for(i in 1:100) {
    set.seed(i)
    x <- rexp(100, rate = 0.1)
    means <- c(means, mean(x))
    
    data <- data.frame(x=means)
    p1 <- ggplot(data, aes(x=x, y=..density..)) + 
      geom_histogram(binwidth = 0.5, alpha = 0.5) + 
      geom_density(color="blue", fill="blue", alpha=0.5) +
      scale_y_continuous(labels = function(x) sprintf("%0.2f", x)) + 
      xlim(0, 30) + xlab("指数分布の平均値の分布")
    
    data <- data.frame(x=x)
    p2 <- ggplot(data, aes(x=x, y=..density..)) + 
      geom_histogram(binwidth = 2) + 
      geom_vline(xintercept = mean(data$x), color="red", size=2) +
      xlim(0, 30) + ylim(0,0.15) + xlab("指数分布(平均値=10)")
    
    grid.arrange(p1, p2, heights=5:3)
  }
  for(i in 1:10) {
    grid.arrange(p1, p2, heights=5:3)
  }
}, cmd.fun = system, interval = 0.4, ani.width=600, ani.height=400)
```

Enjoy!

### 関連

- [中心極限定理の可視化 - RPubs](http://rpubs.com/leeswijzer/17514)
- [Demonstration of the Central Limit Theorem - shinyapps.io](https://yzhu.shinyapps.io/ds9devdataprod/)
- [可視化で理解する中心極限定理（ベルヌーイ分布編）](http://d.hatena.ne.jp/teramonagi/20150510/1431262396)
メモ web.xml


# エラーページ


```web.xml
<web-app>
    ...
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.html</location>
    </error-page>
    ...
</web-app>
```

# 改行削除

```web.xml
<web-app>
    ...
    <jsp-config>
        <jsp-property-group>
            <trim-directive-whitespaces>true</trim-directive-whitespaces>
        </jsp-property-group>
    </jsp-config>
    ...
</web-app>
```

# ファイルエンコーディング指定

```web.xml
<web-app>

    <jsp-config>
        <jsp-property-group>
            <page-encoding>utf-8</page-encoding>
        </jsp-property-group>
    </jsp-config>

</web-app>
```

# URLとサーブレットクラスのひもづけ

```web.xml
<web-app>
    ...
    <servlet>
        <servlet-name>testName</servlet-name>
        <servlet-class>my.test.TestClass</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>testName</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
    ...
</web-app>
```

もしくは、web.xmlに書かなくてサーブレットにそのまま

```java
@WebServlet(name="testName",urlPatterns={"/test"})
public class WebServletTest extends HttpServlet {
   ....
}
```

もしくは

```java
@WebServlet("/test")
public class WebServletTest extends HttpServlet {
   ....
}
```

# Springファイルの読み込み

```xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>

    <!-- spring.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/spring.xml</param-value>
    </context-param>

    <!-- Start Spring -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

```

spring用xmlファイルがたくさんある場合はimportしちゃう

```xml:spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<import resource="spring1.xml" />
	<import resource="spring2.xml" />
	<import resource="spring3.xml" />

</beans>
```
Objective-Cでブログの本文抽出するやつ

他の言語のやつを見よう見まねでやってみた。
Objective-Cの正規表現は生で書く気になれなかったのでRegexKitLiteを使ってズルしました(๑˃̵ᴗ˂̵)و

https://github.com/noppefoxwolf/extract-content-objc

一応ちゃんと動いてるように見えるけどちょっと不安。

newでインスタンス生成して呼ぶのカッコ悪いので気が向いたらNSStringの拡張っぽく書けるようにしたい。

いじょ
golang net/http でURL正規化リダイレクトするのを無効化

# はじめに

URL正規化リダイレクト自体は正常な動作で、無効化する事による悪影響もあるので、気をつけて下さい。なんとなく黒魔術っぽい。

# 困った現象

- http://〜/path?param の path に // があると / にマージした URL にリダイレクトされる。

通常は問題ないけど、path 部をパラメータとして使おうという場合、

- http://〜/w=100,h=100/http://〜
にアクセスすると、

- http://〜/w=100,h=100/http:/〜

にリダイレクトされる。尚、URLエンコードしても無駄。

ちなみに、go-thumber の元画像URLにプロトコル部を試しに追加したらこの現象に遭遇しました。

# 原因

- URL は正規化された方に Permanent Redirect される。
- http://<path>?<param> の path の 正規化で // はマージされる

対応するコードは net/http/server.go:cleanPat => path.go:Clean

# 回避方法

- http://stackoverflow.com/questions/16888285/overriding-gos-default-http-sever-redirect-behaviour
- https://gist.github.com/johnboxall/5698940

HandleFunc を使わずに http.ListenAndServe の第二引数でハンドルを指定して、そこから自前で URL ルーティングを行う。

- go-thumber でパラメータに // を使えるようにする改造

```go:listenAndServe.go
type Handler struct{}

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	uri := r.URL.Path
	switch uri {
	case "/server-status":
		statusServer(w, r)
	case "/favicon.ico":
		errorServer(w, r)
	default:
		thumbServer(w, r)
	}
}

func main() {
	flag.Parse()
	if *show_version {
		fmt.Printf("thumberd %s\n", version)
		return
	}

	client.Timeout = time.Duration(*timeout) * time.Second

	var err error

	if *local != "" { // Run as a local web server
		handler := new(Handler)
//		err = http.ListenAndServe(*local, nil)
		err = http.ListenAndServe(*local, handler)
	} else { // Run as FCGI via standard I/O
		err = fcgi.Serve(nil, nil)
	}
	if err != nil {
		log.Fatal(err)
	}
}
```

http.ListenAndServe(*local, nil)
を
http.ListenAndServe(*local, handle)
にして、handle で URI を見て処理をスイッチしてます。

# ハマりどころ

- Permanent Redirect はブラウザが覚えてしまうので、一度アクセスしたURLだとサーバ側で対処してもブラウザ側で勝手にアドレスを書き換えるかもしれない。(なので、当初対処に失敗したと勘違いしてた)
   - Chrome のシークレット・ウィンドウを使えば一時的に忘れてくれるので、動作確認に便利です。

# 使用上の注意

- プロキシー等の経路で勝手に正規化されて無駄かもしれない
- 正規化されない事でキャッシュ率が落ちるかもしれない
(Docker で) PyPI のキャッシュサーバを建ててまた少し幸せになった話

[(Docker で) ローカルに APT のパッケージリポジトリキャッシュサーバ (apt-cacher-ng) を建てたら幸せになった。](http://qiita.com/kitsuyui/items/278663db091334381108)

という記事で APT のキャッシュサーバを建てた。

自分は Python を使う系の人なので、 apt-get install の時だけでなく pip install のダウンロード時間も節約したいと思った。

# devpi-server 

[devpi-server](http://doc.devpi.net/latest/) という素晴らしいパッケージを導入すれば、 PyPI のキャッシュサーバが手軽に建てられるらしい。

これをやはり Dockerfile で記述することにした。

なお、 pip install には [ローカルキャッシュ機構が備わっている](https://pip.pypa.io/en/latest/reference/pip_install.html?highlight=download#caching) ので、この方法は単一のサーバで単一のインストールするだけなら、あまり意味が無いと思われる。

- 複数のサーバインスタンス間で個別にパッケージを取得する場合
- 利用できる回線の帯域が小さい、もしくは限定されている場合

に特に有用。

# Dockerfile

下記が本題の Dockerfile 。

```Dockerfile:Dockerfile
#
# Build:
#     docker build -t devpi-server .
#
# Run:
#     docker run -d -p 3141:3141 --name devpi-server-run devpi-server
#
FROM ubuntu
EXPOSE 3141
VOLUME ["/var/cache/devpi"]

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get install --no-install-recommends -y python3-pip && \
    pip3 install -q -U pip devpi-server

CMD chmod 777 /var/cache/devpi && \
    devpi-server \
        --serverdir /var/cache/devpi \
        --host 0.0.0.0 --port 3141
```

＃ 使い方

```--trusted-host``` でキャッシュサーバのホスト名、 ```--index-url``` で対象のキャッシュサーバの URL を指定する。

```shell-session
$ pip install --trusted-host XXX.XXX.XXX.XXX --index-url http://XXX.XXX.XXX.XXX:3141/root/pypi/ package-name
```

なお、 https://pip.pypa.io/en/latest/user_guide.html#environment-variables にもある通り、
pip install のオプションは環境変数で制御することもできる。
その場合には PIP_を接頭辞として大文字・スネークケースでつなげた、
PIP_TRUSTED_HOST と PIP_INDEX_URL で指定する。


# 比較

time コマンドで計測した。
1 回しか計測していないので、厳密な比較はしていないが充分だと感じた。
ローカルキャッシュを無効化すべく --no-cache-dir を指定している。

```
$ time pip install --no-cache-dir numpy scipy matplotlib pandas ipython
```

## キャッシュなし

```
real	3m29.583s
```

## キャッシュあり

```
real	0m24.950s
```

大きな差がある。
キャッシュなしでは特に scipy と matplotlib のダウンロードに大きく時間を使っていたように感じた。
ObjC to Swift : [NSDateFormatter dateStyle]


Objective-C

```Objective-C
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];

dateFormatter.dateStyle = NSDateFormatterMediumStyle;
```

Swift

```Swift
let dateFormatter = NSDateFormatter()

dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle

or

dateFormatter.dateStyle = .MediumStyle
```
Hubotでbrain使わずにredisにつなぐ


# Goal

* hubotからredisに格納されたデータを利用したい
* hubotには永続化層としてhubot brainが用意されていて、redisを利用できるが、hubot brainではキー名に制限があるのでこれを使わずに実現したい

# Example

hubotのpackage.jsonのdependenciesにredisを追加する.

```json:package.json
  (省略)
  "dependencies": {
    "hubot":         ">= 2.6.0 < 3.0.0",
    "hubot-scripts": ">= 2.5.0 < 3.0.0",
    "hubot-slack": ">= 2.2",
    "redis": "0.8.4"
  },
  (省略)
```

```coffee:scripts/redis_test.coffee
# Description:
#   Redis Test
#
# Dependencies:
#   "redis": "0.8.4"
#
# Commands:
#   hubot redis-get message
#   hubot redis-get message "Hello, World!!"
#
# Authors:
#   metheglin

Redis = require "redis"

module.exports = (robot) ->

  robot.respond /redis-get (.*)$/i, (msg) ->
    redis_key = msg.match[1].trim()
    client = Redis.createClient()
    client.get "#{redis_key}", (err, reply) ->
      if err
        throw err
      else if reply
        result = JSON.parse( reply )
        msg.send result
      else
        msg.send "key: #{redis_key}は見つかりません."

  robot.respond /redis-set ([^\s]*) (.*)$/i, (msg) ->
    redis_key = msg.match[1].trim()
    redis_val = msg.match[2].trim()
    client = Redis.createClient()
    client.set "#{redis_key}", "#{redis_val}", (err, keys_replies) ->
      if err
        throw err
```

やや注意点として、redisのデータget結果をhubotストリームに返したい場合は、get結果を待つ必要がある.
redisの`client.get`は非同期なのでコールバック関数内で`msg.send`する必要がある.

■実行結果

```
Hubot> hubot redis-get "message"
Hubot> key: "message"は見つかりません.
Hubot> hubot redis-get message
Hubot> key: messageは見つかりません.
Hubot> hubot redis-set message "Hello, World!!"
Hubot> hubot redis-get message
Hubot> Hello, World!!
```

# References

* https://github.com/mranney/node_redis
UniRxのシンプルなサンプル その5(Buttonが押されたら動くGameObjet)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(SkipとSkipWhile)](http://qiita.com/Marimoiro/items/de9daf28532049b5195b)
[次(購読の停止)](http://qiita.com/Marimoiro/items/819ddb3e68aab7ee3b95)

# ButtonのonClickに関連付ける #
今まではEveryUpdateが手軽で簡単に内容を見ることができたのでそちらを使っていたのですが、
第一回で強力なイベントとか言ってしまったのでイベントっぽいことについてやっていきます。

EveryUpdateはUniRxの登録先のほんの一箇所というだけです。本来いろんな登録先があるのでそれはドキュメントとか見ればわかります。（ぶんなげ）

## 前準備 ##
今回は今までのただのSpriteのGameObject以外にButtonを作っています。
ClickButtonは最初の一回だけGameObjectが右に移動するボタン
TwoClickButtonは青いGameObjectが右に動くけど最初の1回だけ反応しないボタン
を目指します。
![スクリーンショット 2015-05-03 16.48.06.png](https://qiita-image-store.s3.amazonaws.com/0/77177/7c2c8b65-8779-1d19-5e75-004c03e519ea.png)

## 最初の一回だけGameObjectが右に移動するボタン ##

Button.onClick.AsObservable()でクリックされた時に値をプッシュしてくれる登録先を取得することができます。なのでここにMove(1f,0)を登録して右に動くようにします。

最初の一回だけ押されたらオブジェクトが動くボタンはeventでやると既にクリックされたかどうかのフラグを持たなければいけません。
でも、UniRxならFirstで表現ができます。

というわけでコードは次のようになります。

```csharp:ClickButton
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UniRx;

public class ClickButton : Base {

    public Button Button;
	// Use this for initialization
	void Start () {
        gameObject.transform.position = new Vector2(0, 1f);
        //クリックされた最初の一回だけ値をプッシュ
        Button.onClick.AsObservable().First()
            .Subscribe(l => Move(1f, 0));
	}
}
```

このようにeventでは地味にめんどくさい最初の一回だけとか言うのもUniRxではよゆーです。
あ、Buttonはインスペクターから登録しておいてくださいね。
## 最初の1回だけ反応しないボタン ##

逆にSkipを使えばこちらも問題なし

```csharp:TwoClickButton
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UniRx;

public class TwoClickButton : Base
{

    public Button Button;
    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1.5f);

        //1回目はスキップする
        Button.onClick.AsObservable().Skip(1)
            .Subscribe(u => Move(1f, 0));
    }
}

```

## 実行結果 ##
![スクリーンショット 2015-05-03 17.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/77177/4e27e9af-99cb-1c46-12cc-3121f8f82053.png)

というわけでそれぞれのボタンが出来ました。

ところでですね、ここで実行中に青のスプライトを消してボタンを押すとどうなるでしょう？
![スクリーンショット 2015-05-03 17.06.17.png](https://qiita-image-store.s3.amazonaws.com/0/77177/735d3dcc-4d13-3fce-8eb7-e6149593e6df.png)

MissingReferenceException: The object of type 'TwoClickButton' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

とか出ます。
要するに登録したイベントを実行したらGameObjectが死んでるからエラーなんですね。
勝手に登録解除してくれないんです！
きっと情報メールとかもこんなんでデーモン帰ってきそうだなーとか思います。
と、このへんの話を次でします。

## 閑話休題 ##
全く関係ない話なんですけど公開メンバについて
Unityの標準の命名規則がlowerCamel
C#の命名規則がPascal
なんですよね

僕はC#erなので（いろいろ考えた結果）Pascal採用してるんですけどどっちが多いんでしょう？
ちなみにprivateはlowerCamelです。
Laravelのyieldで読み込んだコンテンツの存在確認

##はじめに

Laravelのbladeテンプレート内で、@yieldを記述することで子テンプレートで定義されたコンテンツを読み込むことができます。
しかし、yieldで指定したコンテンツが存在しない時に、外側のタグのみ表示されてしまいました。

上記の問題を解決するため、外側のタグごと表示しないような制御をしてみます。

## かいてみる

### 問題のあるケース

```php:sample.blade.php
<div class="row">
    <div class="col-md-12">
        @yield("mainvisual")
    </div>
</div>
```

上記の記述をした場合、mainvisualブロックが定義されていない場合に、HTML上は以下の様なタグが出力されてしまいます 

```html:sample
<div class="row">
    <div class="col-md-12">

    </div>
</div>
```
### 対応方法

ViewクラスのhasSectionメソッドでチェックできました。

```php:sample.blade.php
@if (View::hasSection('mainvisual'))
<div class="row">
   <div class="col-md-12">
        @yield("mainvisual")
    </div>
</div>
@endif
```

では、また。
ObjC to Swift : [NSOperationQueue addOperationWithBlock:]


Objective-C (main queue)

```Objective-C
[[NSOperationQueue mainQueue] addOperationWithBlock:
^{
	//  do some UI stuff
}];
```
Objective-C (background queue)

```Objective-C
NSOperationQueue * backgroundQueue = [[NSOperationQueue alloc] init];

[backgroundQueue addOperationWithBlock:
^{
	//  do some heavy stuff in background
}];
```

<br>
Swift (main queue)

```Swift
NSOperationQueue.mainQueue().addOperationWithBlock
{() -> Void in

	//  do some UI stuff
}
```

Swift (background queue)

```Swift
let backgroundQueue = NSOperationQueue()

backgroundQueue.addOperationWithBlock
{() -> Void in

	//  do some heavy stuff in background
}
```
ObjC to Swift : NSDictionary to Swift Dictionary


Objective-C

```Objective-C
NSString * objCString = @"String";
BOOL objCBool = YES;

NSDictionary * dictionary = @{ @"stringKey" : objCString,
                               @"boolKey"   : [NSNumber numberWithBool: objCBool] };

NSString * stringInDictionary = dictionary[@"stringKey"];
BOOL boolInDictionary = [[NSNumber numberWithBool: dictionary[@"boolKey"]] boolValue];
```

Swift

```Swift
let swiftString = "String"
let swiftBool = true

dictionary: Dictionary = [ "stringKey" : swiftString,
                           "boolKey"   : swiftBool ]

let stringInDictionary = dictionary["stringKey"] as! String
let boolInDictionary = dictionary["boolKey"] as! Bool
```
ObjC to Swift : NSNotification with NSDictionary


Objective-C (notification sender)

```Objective-C
NSDictionary * userInfo = @{ @"key0" : object0,
                             @"key1" : object1 };
                               
[[NSNotificationCenter defaultCenter] postNotificationName: @"NotificationName"
                                                    object: userInfo];
```

Objective-C (notification receiver)

```Objective-C
[[NSNotificationCenter defaultCenter] addObserverForName: @"NotificationName"
                                                  object: nil
                                                   queue: nil
                                              usingBlock: ^( NSNotification * notification )
{
	NSDictionary * userInfo = notification.object;
	
	// do some cool stuff
}];
```

<br>
Swift (notification sender)

```Swift
let userInfo: Dictionary = [ "key0" : object0,
                             "key1" : object1 ]

NSNotificationCenter.defaultCenter().postNotificationName( "NotificationName",
                                                   object: userInfo )
```

Swift (notification receiver)

```Swift
NSNotificationCenter.defaultCenter().addObserverForName( "NotificationName",
                                                 object: nil
                                                  queue: nil
                                             usingBlock:
{( notification ) -> Void in

	if let userInfo: Dictionary = notification.object as? Dictionary< String, AnyObject >
	{
		// do some cool stuff
	}
})
```
fatal: write error: No space left on device が出た場合は、不要ファイルを削除する

fuelphpを入れようと、
```
$ git clone git://github.com/fuel/fuel.git 
```
上記コマンドを実行したところ。。。
```
error: file write error (No space left on device)
 fatal: unable to write sha1 file 
 fatal: unpack-objects failed
```

ディスク容量が足りないとのこと。。。

```
df -i
```

で確認したら、確かにログファイルがやたら容量を食っていたので、

```
$ sudo rm -rf /tmp/*
$ sudo rm -rf /var/log/*
```

で、とりあえず、解消できたので、開発環境なだけだし、OKということで。
UniRxのシンプルなサンプル その4(SkipとSkipWhile)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(FirstとTake)](http://qiita.com/Marimoiro/items/b24510b0ffd273f69f8a)
[次(Buttonが押されたら動くGameObjet)](http://qiita.com/Marimoiro/items/bba05b7b1e15f0c804a8)

# 途中まで実行しないメソッド #
今回は途中までプッシュされてきた値をカットするメソッドです。
あるイベントが起こるまでSkipするということができます。

## 前準備 ##
今回もSkip,SkipWhileを作ってそれぞれにSkipSampleとSkipWhileSampleを貼り付けています。
![スクリーンショット 2015-05-03 15.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/77177/824e1585-06d1-00fd-0453-f929b9d448a6.png)

## Skip ##
まずSkipでは最初の100回カットしてその後実行するようなGameObjectを作成します。

```csharp:SkipSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class Skip : Base
{

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1f);

        //Skipで最初の100回カット
        this.UpdateAsObservable().
            Skip(100).
            Subscribe(_ => Move(0.01f, 0));
    }

}

```

Skipは指定された回数だけプッシュした値を握りつぶすわけです。

さて、このメソッド何かに使えるんだろうか…？


## SkipWhile ##
今度はSkipWhileでクリックされるまでSkipします。

```csharp:SkipWhile
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class SkipWhile : Base {

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 0.5f);

        //!Input.GetMouseButton(0)の間スキップ
        this.UpdateAsObservable()
            .SkipWhile(_ => !Input.GetMouseButton(0))
            .Subscribe(_ => Move(0.01f, 0));
    }
}

```

!Input.GetMouseButton(0)がtrueの間値を握りつぶします。
ちなみにですがこの用途だとSkipUntilのほうが良さげです。

そして一度通過させた後はマウスを離しても動作が停止しないことに気をつけてください。
一度条件がととのったら後はざるです。

さて、こちらのSkipWhileメソッドですが、色々使い道がありそうです。
あるイベントが発行されるまでは動作しないっていうのが作れますね。
フラグ回収してねって話です！わお！


## 実行結果 ##
というわけで今回は100フレームまで動かないGameObjectとクリックするまで動かないGameOjectが出来ました！
![スクリーンショット 2015-05-03 15.55.51.png](https://qiita-image-store.s3.amazonaws.com/0/77177/09e92843-2a92-ad6c-8b2c-1c26dbb67b84.png)
Visual Studio 2013で親プロセスと子プロセスを同時にデバッグする方法

# Visual Studio 2013で親プロセスと子プロセスを同時にデバッグする方法について
Visual Studio 2013でデバッグ中のアプリケーションが外部アプリケーションを起動した場合、その外部アプリケーションはデバッグの対象にはなりません。

[Visual Studio での 1 つ以上のプロセスのデバッグ](https://msdn.microsoft.com/ja-jp/library/jj919165.aspx)
>デバッガーは、子プロジェクトが同じソリューション内にある場合でも、デバッグ対象のプロセスによって開始された子プロセスに自動的にアタッチされません。 子プロセスをデバッグするには:
子プロセスが開始された後、そのプロセスにアタッチします。
または
デバッガーの新しいインスタンスで子プロセスが自動的に開始されるように Windows を構成します。

上記のプロセスアタッチ方式及びレジストリ設定方式はデバッグ時の操作が煩雑となりますが、[Microsoft Child Process Debugging Power Tool拡張機能](https://visualstudiogallery.msdn.microsoft.com/a1141bff-463f-465f-9b6d-d29b7b503d7a)を使用すると、複数のプロセスで構成されるシステムのデバッグをシームレスに行うことが出来ます。

# Microsoft Child Process Debugging Power Toolによるデバッグ方法
## 概要
下記構成のプログラムにて親プロセスと子プロセスの同時デバッグを行います。
![構成1.png](https://qiita-image-store.s3.amazonaws.com/0/76826/7254883b-0f76-cd2e-27d8-48b78db2b573.png)

```csharp:MainForm.cs
using System.Diagnostics;
using System.Windows.Forms;

namespace MainForm
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnExecuteSubForm_Click(object sender, System.EventArgs e)
        {
            Process.Start(new ProcessStartInfo("SubForm.exe"));
        }
    }
}
```

```csharp:SubForm.cs
using System.Windows.Forms;

namespace SubForm
{
    public partial class SubForm : Form
    {
        public SubForm()
        {
            InitializeComponent();
        }
    }
}
```

## デバッグ手順
1.  [Microsoft Child Process Debugging Power Tool拡張機能](https://visualstudiogallery.msdn.microsoft.com/a1141bff-463f-465f-9b6d-d29b7b503d7a)をインストールします。
2.  [デバッグ(D)]→[その他のデバッグ ターゲット]→[Child Process Debugging Settings...]メニューを押下し、Microsoft Child Process Debugging Power Toolを有効化します。
![設定2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/f465766f-ed92-7c33-7c0e-c4e3b421f1c5.png)

3.  MainForm及びSubFormのプロジェクトのデバッグ設定「ネイティブ コードデバッグを有効にする(T)」をチェックします。
![設定3.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/0f7a83ab-febb-323b-8473-a86c07b076dd.png)

4.  MainFormクラス及びSubFormクラスのコンストラクタにブレークポイントを設定します。
![ブレークポイント1.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/aa6d20c8-1ddd-770e-482d-1d92d89c8900.png)

5.  F5キーを押下してデバッグ実行を開始し、MainFormクラスのコンストラクタでブレークすることを確認します。
![MainForm11.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/e56646d5-8b7a-4009-93ee-b6de15c5257a.png)

6.  F5キーを押下してデバッグを続行し、SubForm起動ボタンを押下します。
![MainForm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/f47dd755-14a7-7e43-0921-ed8ddc54ac6b.png)

7.  SubForm.exeが起動し、SubFormクラスのコンストラクタでブレークすることを確認します。
![SubForm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/d636f794-8770-3d0b-80dc-1ddc259b1bcd.png)
docker-machine 0.2.0 で vmware fusion に boot2docker 1.6.0 を作る

docker-machine 0.2.0 で vmware fusion に boot2docker を作ると 1.5.0 が作成されてしまいます（[source](https://github.com/docker/machine/blob/v0.2.0/drivers/vmwarefusion/fusion_darwin.go)）。

ですので、vmwarefusion-boot2docker-url を指定して作れば、最新の boot2docker をインストールすることが可能です。

```bash
$ docker-machine create --driver vmwarefusion --vmwarefusion-boot2docker-url="https://github.com/cloudnativeapps/boot2docker/releases/download/v1.6.0-vmw/boot2docker-1.6.0-vmw.iso" boot2docker
```

ていうか、さっさと docker-machine upgrade に対応してもらいたいものです。
Homebrewのインストール

## homebrewのインストール
* 以下を叩いて終了

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

* 確認（以下コマンドを打って表示されればok）

```
brew -v
```

#### 参考
* [http://brew.sh/](http://brew.sh/)
* [homebrewに関してよくまとまっていた](http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
WordPressのバージョンアップを実施した際に回帰テストを行う

## 概要
WordPressで仕事をしている皆さんが必ず直面する問題がコアのバージョンアップ祭り問題です。
WordPressはバージョンアップの頻度が非常に早いのは良い所なのですが、実際にサイトを複数メンテナンスしている側からすれば、毎回のバージョンアップの度に動作テストをするのが非常に大変です。

ところがSelenium WebDriverというツールを使えば毎回自動でブラウザでのテストが実行できるため、動作テストの煩わしさから開放されます。

Selenium WebDriverについては[UIテストの自動化！Node.jsとSeleniumでWebアプリのUIテスト環境構築](http://ics-web.jp/lab/archives/5759)の記事が非常にわかりやすいので、参考にしてみてください。僕も上記の記事を見てローカルに環境を構築しました。

## テストコード
以下がテストコードです。Selenium WebDriverは様々な言語に対応していますが、僕はnode.jsを使って書いています。

```lang:wordpress-test.js
var webdriver = require('selenium-webdriver');
var t = require('selenium-webdriver/testing');
var driver;
var By = webdriver.By;
var setting = require('./setting.json');

t.describe('WordPressバージョンアップ後のテスト', function() {
	t.before(function() {
        driver = new webdriver.Builder().
        usingServer('http://localhost:4444/wd/hub').
        withCapabilities(webdriver.Capabilities.chrome()).
        build();
    });

    t.after(function() {
    	driver.quit();
    });

    t.it('ログイン', function() {
		driver.get(setting.login.url);
		driver.findElement(By.name("log")).sendKeys(setting.login.account_id);
		driver.findElement(By.name("pwd")).sendKeys(setting.login.account_pass);
		driver.findElement(By.name("wp-submit")).click();
		driver.wait(function() {
			return driver.getTitle().then(function(title) {
				return title === 'Dashboard ‹ Welcome to the VCCW — WordPress';
			});
		}, 5000);
	});

});
```


アカウント情報やサイトのURLについては別でjsonファイルを作ってそこで定義しています

```lang:setting.json
{
    "login": {
        "url":"http://wordpress.local/wp-login.php",
        "account_id":"admin",
        "account_pass":"admin"
    }
}
```

## テストの実施
ローカルでターミナルを立ち上げてテストを実行します。タイムアウトの時間は長めにとってます。
`$ mocha wordpress-test.js --timeout 10000000`

すると自動でブラウザが立ち上がってログインのテストが実施されます。
テスト結果は以下の様な形でターミナルに表示されます。
![スクリーンショット 2015-05-03 13.26.49.png](https://qiita-image-store.s3.amazonaws.com/0/65478/e3916451-b371-eb1b-b109-c676a7eac2e4.png)

また、テストの各画面のキャプチャも自動で撮ることも可能なので、テストのエビデンスとして残しておくのもよいでしょう。

## 業務でどう使うか
業務においてバージョンアップ後のテストをどこまで行うのか、という線引は非常に難しいです。
サイトによって仕様もバラバラですし、お客さんのビジネス上のサイト立ち位置によってもチェックが必要なポイントは変わってきます。

ただ、こういった形でバージョンアップ後のテストの内容をコードに落としておくことで何をどこまでテストしたのかを明確にすることが出来ます。また、テストは機械が命令通りにやってくれるため、バージョンアップの度に同じテストを実施しているということが明確できます。サイト仕様における冪等性を毎回正しく確認することが可能となります。

それでは皆さんよいバージョンアップ祭りをお過ごしください！
[Swift]multipartデータでPOSTする方法iOS8.3対応Swift1.2対応版

|環境|
|:--:|
|ios8.3|
|Xcode6.3.1|
|Swift1.2|

今回はjson形式のデータをサーバーにPOSTする方法にハマったのでメモ書きとして残します。

参考サイト:
http://lv4.hateblo.jp/entry/2014/07/30/231634
↑こちらを参考に作成したのですが、ios8.1、ios8.2はOKだったけど、
ios8.3だけ送信できないよ!!って言われたので、改良しました。
原因は多分Content-Lengthを入れてなかったからだと思うけど...。

原因についてこっちに何かそれっぽいこと書いてあるし↓
http://stackoverflow.com/questions/29528293/nsmutableurlrequest-body-malformed-after-ios-8-3-update

使い方はjson形式のデータを引数に以下のメソッドを呼ぶだけ。
まぁ試してないけどjsonに限らず書方変えれば画像とかもいけると思う。

```swift

func pushJsonData(jsonStr: String) {

		let url = NSURL(string: "\(Const.URL)")
		var request = NSMutableURLRequest(URL: url!)
		let strData = jsonStr.dataUsingEncoding(NSUTF8StringEncoding)
		let boundary = String(arc4random() % 10000000)
		let config = NSURLSessionConfiguration.defaultSessionConfiguration()
		// ヘッダー
		request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
		let session = NSURLSession(configuration: config)

		// ボディー
		let post = NSMutableData()
		post.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData("Content-Disposition: form-data;".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData("name=\"fileup\";".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData("filename=\"tmp_file.json\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData("Content-Type: application/json\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData(strData!)
		post.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
		post.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
		
		request.setValue(String(post.length), forHTTPHeaderField: "Content-Length")
		request.HTTPMethod = "POST"
		request.HTTPBody = post
		
		let task: NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: { data, request, error in
			var result = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
			NSLog("<result=\"\(result)\">")
			if error == nil {
				// メインに処理移譲
				dispatch_sync(dispatch_get_main_queue()) {
					let alert = UIAlertView(title: "送信結果", message: "送信完了", delegate: self, cancelButtonTitle: "OK")
					alert.show()
				}
			}
			else {
				// メインに処理移譲
				dispatch_sync(dispatch_get_main_queue()) {
					let alert = UIAlertView(title: "送信結果", message: "送信失敗", delegate: self, cancelButtonTitle: "OK")
					alert.show()
				}
			}
		})
		task.resume()
	}
	

```


## 参考サイト
http://lv4.hateblo.jp/entry/2014/07/30/231634

http://stackoverflow.com/questions/29528293/nsmutableurlrequest-body-malformed-after-ios-8-3-update