OmniAICreator/Qiita-1.07M huggingface dataset:
Promiseを複数組み合わせる時の基本パターン（直列、並列、分岐）

ES6形式のPromiseを使うときに頻出する3つのパターン。直列パターン、並列パターン、分岐パターンを説明します。

最近、Promise周りが盛り上がっていて、reduceを使ったほうが良いとか、ライブラリがどうとか・・・いう話を聞くのですが、そもそも「ベタに書いたときにどうするのが基本なのか」という情報が見つからないので書いてみました。

# 直列パターン

一番良く使うのは、複数の処理を直列につなげるパターンでしょう。#1が終わってから、#2、#2が終わってから#3というパターンです。

```js
Promise.resolve()
	.then(function(){
		return new Promise(function(fulfilled, rejected){
			asyncFunc(function(){
				fulfilled();
			});
		})
	})
	.then(function(){
		return new Promise(function(fulfilled, rejected){
			asyncFunc(function(){
				fulfilled();
			});
		})
	})
```

本来、最初のPromise.resolve()は不要で、new Promiseで始めた方がコードは短くなります。しかし、自分はわざわざコーディングルールとして、Promise.resolve()で始めて、.thenで受けるようにしています。なぜでしょうか？それは、コードのパターンを統一するためです。#1, #2, #3と3つの処理が意味的には対等であるにも関わらず、#1だけ書き方が違うと、コードも見づらいし、処理の順番を変更したとき（あるいは、後述するように分岐や並列化を入れる場合）直感的ではないコード修正が必要になります。このため、上のように最初にダミーのPromise.resolve()を入れるようにしています。

# 並列パターン

ここに並列処理（Promise.all)を組みわせる場合、以下のようになります。#1と#2を並列に処理し、両方が終わったら#3を行うというパターンです。

```js

Promise.resolve()
	.then(function(){
		return Promise.all([
			new Promise(function(fulfilled, rejected){
				asyncFunc(function(){
					fulfilled();
				});
			}),
			new Promise(function(fulfilled, rejected){
				asyncFunc(function(){
					fulfilled();
				});
			})
		])
	})
	.then(function(){
		return new Promise(function(fulfilled, rejected){
			asyncFunc(function(){
				fulfilled();
			});
		})
	});
```

## 並列パターン（map使用）

ただし、上のように複数のPromiseをそのまま書くことはあまり多くなく、以下のようにmapを使ってPromiseを生成することが多いです。

```js
Promise.resolve()
	.then(function(){
		return Promise.all(list.map(function(item){
			return new Promise(function(fulfilled, rejected){
				asyncFunc(function(){
					fulfilled();
				});
			}),
		}))
	})
	.then(function(){
		return new Promise(function(fulfilled, rejected){
			asyncFunc(function(){
				fulfilled();
			});
		})
	});
```

# 分岐パターン

直列パターンで、条件によって処理内容を変えたり、処理をスキップしたいというときに使います。

```js
Promise.resolve()
	.then(function(){
		if(condition1){
			// 条件1 単独のPromise
			return new Promise(function(fulfilled, rejected){
				asyncFunc(function(){
					fulfilled();
				});
			})
		}else if(condition2){
			// 条件2 Promise2つを直列化
			return Promise.resolve()
				.then(function(){
					return new Promise(function(fulfilled, rejected){
						asyncFunc(function(){
							fulfilled();
						});
					})
				})
				.then(function(){
					return new Promise(function(fulfilled, rejected){
						asyncFunc(function(){
							fulfilled();
						});
					})
				})
		}else{
			// 条件3 何もしない
		}
	})
	.then(function(){
		return new Promise(function(fulfilled, rejected){
			asyncFunc(function(){
				fulfilled();
			});
		})
	});
```
ポイントは、.thenの中で、分岐しているということです。もちろん、同じことは、new Promiseの中で分岐させてもできます。ただ、new Promise(fulfilled, rejected){}という塊は、できる限りシンプルな非同期処理の単位であるべきなので、フロー制御は外側に追い出すのが良いと思います。Promiseを返すモジュールを利用する場合も、.thenの中で分岐する習慣にしておくと、コードが綺麗になります。

# まとめ

個人的には必ずしも上記のようなパターンを直接使っているわけではなく、モジュール化してもうちょっと便利に使っていたりするのですが、とりあえず直列、並列、分岐という基本パターンは覚えておくべきではないかと思います。
"is never used”,“is never assigned to”のワーニングを消す


MsgPack使っててリフレクションで値を設定するような変数、将来的に用意している定数とかがワーニングで表示されるのは煩わしいので消したい。

参考: http://stackoverflow.com/questions/3820985/suppressing-is-never-used-and-is-never-assigned-to-warnings-in-c-sharp

# "is never used”を消す

```
#pragma warning disable 0169
... field declaration
#pragma warning restore 0169
```

# "is never assigned to”を消す

```
#pragma warning disable 0649
... field declaration
#pragma warning restore 0649
```
Seasar2 サンプル作成 [No.4]

#1. 概要
画面から文字を入力し、「OK」ボタンを押したら次の画面へ遷移して入力された文字が表示されている。という簡素なアプリを作成します。

まずは深く考えずにコードを書き、実行してみます。具体的な内容は最後に記載します。

#2. プログラム
##(1)ディレクトリ構成

```
project / プロジェクトのルートディレクトリ
├ src/
│ ├ main/
│ │ ├ java/
│ │ │ └ root/ルートパッケージ←自分で名付けたパッケージ名
│ │ │ 　　　└ action/アクションクラスを格納(自動作成されるパッケージ) 
│ │ │ 　　　└ form/フォームクラスを格納(自動作成されるパッケージ) 
│ │ └ webapp/
│ │　　　 └ WEB-INF/
│ │ 　　　　　　├view/JSPなどのファイル(自動作成されるパッケージ)
```

##(2)コード
actionパッケージ内に作成する。

```java:SampleAction.java
public class SampleAction {
	/**アクションフォーム*/
	@Resource
	@ActionForm
	protected SampleForm sampleForm;
	/**入力画面の実行メソッド*/
	@Execute(validator=false)
	public String index(){
		return "/SampleView.jsp";
	}
	/**表示画面の実行メソッド*/
	@Execute(validator=false)
	public String next(){
		return "/message.jsp";
	}
}
```
formパッケージ内に作成する。

```java:SampleForm.java
public class SampleForm {
	public String message;
}
```
viewパッケージ内に作成する。

```jsp:SampleView.jsp
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>First Page</title>
</head>
<body>
<s:form method="POST" action="/sample/next">
	メッセージを
	<html:text property="message" />
	<s:submit property="next" value="OK" />
</s:form>
</body>
</html>
```
viewパッケージ内に作成する。

```jsp:message.jsp
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>Second Page</title>
</head>
<body>
	メッセージ: ${f:h(message)}
</body>
</html>
```


#3. 実行
Eclipseのサーバビューからサーバを「**開始**」する
ショートカット ⇒ Ctrl+Alt+R

WebブラウザのURLに,
```
localhost:8080/プロジェクト名/sample
```
と入力する

#4. ルール
##(1)アクションクラス
- クラス名:「XxxAction.java」とActionを付ける
- index()メソッドが自クラスにアクセスされた際に実行されるメソッド

- メソッド名の前には@Executeのアノテーションを付ける
- メソッドには引数、返り値はString(遷移先のURL)
- SampleActionクラスにアクセスされた場合はindex()が実行されるが、他のメソッドを実行させたい場合はURLに.../sample/メソッド名にする
- 使用するformクラスを@Resource,@ActionFormのアノテーションを付けて、宣言する。

##(2)アクションフォームクラス 
- SampleView.jsp内の<html:text property="message" />のmessageと同じ名前のフィールド(String)を作成する

※ビューに関しては他に掲載します。

#5. まとめ
①アクションクラスのメソッドにURLからアクセスして、メソッド内で別のページに遷移する。
②画面側から入力された値はアクションフォームクラスに格納されていて、それをアクションクラス内で使用する。
③命名規則として、アクションクラスの名前は、大文字スタートで「Action」と加える。
{{#each}}のとき、child-componentにindexを渡したい

EmberにおけるComponentは独立したものとして扱われるため、{{#each}}のときに自動でindexが与えられない。だから、明示的にindexを渡してやる必要がある。

```
{{#each item in list}}
  {{child-component
    index=_view.contentIndex
    }}
{{/each}}
````

なお、ember 0.11からブロックパラメータがサポートされるので下記のように書ける。

```
{{#each list as |item index|}}
  {{child-component
    index=index
    }}
{{/each}}
```
php55からphp56へ上げる

AmazonLinux 2015.03 が出てphp56が使えるようになったのでphp55→php56にあげてみた。

# 手順
yum swap でパッケージを一気に入れ替える。

```bash:
packages=($(rpm -qa php55*|sed 's/-[0-9].*//'))
sudo yum swap "${packages[@]}" -- "${packages[@]/php55/php56}"
```

ところでyum swapて最近知ったんだけどremove/installするより依存関係の面倒が無くて便利ね。


# 注意点
- `/etc/httpd/conf.d/php-conf.5.5.conf` は `php-conf.5.6.conf` に置き換わってるので書き換えしてた場合はこちらの内容確認を忘れないよう注意。
    - この中で `php_value` でセッション設定を上書きされててphp.iniの修正が効かねーとか悩む罠とかあるので。
- あと /etc/php.ini や /etc/php.d もphp56用に置き換わってるので、こちらもphp55時に修正や追加をしてた場合は対応すること。
複数のアプリでの共通テーマ

複数のアプリでの共通テーマ

自分用のメモ。

1. workspace を作る
    1. sencha -sdk /path/to/sdk generate workspace .
2. アプリケーションを作る
    1. cd ext
    2. sencha generate app MyApp ../myapp
3. テーマを作る
    1. アプリケーションフォルダに移動
    2. sencha generate theme -e ext-neptune-theme my-theme
4. app.json でテーマを変更
    1. "theme": "my-theme"
5. package.json の namespace 設定

    "sass": {
        "namespace": ""
    }

    こうして空にしてやらないと、アプリにテーマが設定されない
6. 実際の scss ファイルは、scss/var/MyApp/ 下に配置する
擬人化オブジェクト指向 - 第3話「継承と委譲」

![](http://lorempixel.com/640/396/people/?14fgFZqkleLPnqCZ)
フレームワーク「あなた方は人間ですか？」
ケンシロウ「はい」
レイ「はい」
フレームワーク「あなた方は北斗神拳伝承者ですか？」
ケンシロウ「はい」
レイ「いいえ」
フレームワーク「あなた方は南斗聖拳伝承者ですか？」
ケンシロウ「いいえ」
レイ「はい」

----
![](http://lorempixel.com/640/396/sports/?i8iN4gZP13ynnTam)
フレームワーク「この紙を切ってください」
ケンシロウ「できません」
レイ「はい」
フレームワーク「ケンシロウさんはレイさんから南斗聖拳を伝承してもらうことはできますか？」
ケンシロウ「無理です」
レイ「無理です」
フレームワーク「当然そうでしょう」

----
![](http://lorempixel.com/640/396/people/?6aIBxnvrOL02erA5)
フレームワーク「これを持ってください（ハサミを渡す）」
ケンシロウ「はい」
レイ「はい」

----
![](http://lorempixel.com/640/396/technics/?tu9SHEAbZnSNZiue)
フレームワーク「持っている物で紙を切ってください」
ケンシロウ「はい」
レイ「はい」

→ [擬人化オブジェクト指向 - 第4話「多重継承」 - Qiita](http://qiita.com/progre/items/d3cd4ec7255b563f966e)
Install Ubuntu 12.04 LTS on ThinkPad T450 with Windows 8.1


## About

This post describes how to clean-install Ubuntu and Windows on Lenovo ThinkPad T450 Laptop.

## Prepare Install Media

1. [Ubuntu 12.04.5 LTS Desktop](http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/12.04/ubuntu-12.04.5-desktop-amd64.iso)
2. Windows 8.1 Professional JP
3. [refind USB Flash drive image](http://sourceforge.net/projects/refind/files/0.8.7/refind-flashdrive-0.8.7.zip/download)

## Install Ubuntu

0. BIOS Configuration
	- Check your machine boots with "UEFI only"
	- Check boot order, and "boot on USB flash" at first.

1. Install Ubuntu using USB flash install media
	- Check install update on Internet
	- Create new partition table of 500GB HDD like below:

		| File System | Size |
		|--------|--------|
		| EFI       |   500 MB     |
		|  ext4 /     |   300 GB     |
		|   swap     |  1 GB      |
		|   unformated     |   200GB   |

## Install Windows

2. Install Windows using USB flash install media
	- split pertition table as follow:

		| File System | Size |
		|--------|--------|
		| EFI       |   500 MB     |
		|  ext4 /     |   300 GB     |
		|   swap     |  1 GB      |
		|   MSR(reserved)     |   ???(auto)   |
		|   ntfs     |   ≒200GB(auto)   |

## Post-config

3. fix boot loader
	- Now normal GRUB Boot Manager will NOT shows, so we use refind boot manager instead
	- Boot refind using refind usb flash drive image
	- Move cursor to Ubuntu
	- Press 'F2' twice to edit boot command
	- Add ` nomodeset noapic` to the end of line which starts with `ro`
	- Boot with fixed command
4. Install refind boot manager on ubuntu
	- Open a terminal and execute follow commands:

	```bash
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install boot-repair
$ boot-repair
```
	- Select "Advanced options"
	- Show "GRUB location" pane, and check "Separate /boot/efi partition"
	- Press "Apply" button
	- Again back to the terminal, and execute below:

	```bash
$ sudo apt-get install emacs23-nox
$ sudo emacs /etc/default/grub
```
	- Change `GRUB_CMD_LINE_LINUX_DEFAULT="quiet splash"` to `GRUB_CMD_LINE_LINUX_DEFAULT="nomodeset noapic"`
	- Save and exit
	- execute `sudo update-grub2`
4. Install refind boot loader
	- execute commands:

	```bash
$ sudo add-apt-repository ppa:rodsmith/refind
$ sudo apt-get update
$ sudo apt-get install refind
```
5. Boot order configuration
	- Now reboot the computer, and press 'Enter' to enter BIOS settings
	- Change boot order and set "refind" at first

6. Reboot

# Future Work
- left/right-click does not work on Ubuntu
	- need to edit evdev settings?
- Intel Graphics driver does not work on Ubuntu
	- Intel still does not serve latest driver for ubuntu on apt
docker-machineでdigitaloceanにdockerを立ち上げる


* VMの設定

```shell
export DIGITALOCEAN_ACCESS_TOKEN='***'
export DIGITALOCEAN_IMAGE='ubuntu-14-10-x64'
export DIGITALOCEAN_REGION='sgp1'
export DIGITALOCEAN_SIZE='512mb'
```

* 作成

```shell
$ docker-machine create --driver "digitalocean" d1
INFO[0000] Creating SSH key
INFO[0001] Creating Digital Ocean droplet
INFO[0005] Waiting for SSH
INFO[0072] Configuring Machine
INFO[0143] "d1" has been created and is now the active machine.
INFO[0143] To point your Docker client at it, run this in your shell:  $(docker-machine env d1)
```

* 確認

```shell
$ docker-machine ls
NAME   ACTIVE   DRIVER         STATE     URL                          SWARM
d1     *        digitalocean   Running   tcp://XXX.XXX.XXX.XXX:2376
v1              virtualbox     Running   tcp://XXX.XXX.XXX.XXX:2376
```

* registryを立ち上げてみる

```shell
$ eval $(docker-machine env d1)
$ docker run -d --name=registry -p "5000:5000" -v /var/registry:/tmp/registry registry
Unable to find image 'registry:latest' locally
***
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
58251294f349        registry:latest     "docker-registry"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry
$ curl XXX.XXX.XXX.XXX:5000
"\"docker-registry server\""%
```

* ログイン

```shell
ssh root@XXX.XXX.XXX.XXX -i ~/.docker/machine/machines/d1/id_rsa
```
iTunes Connectで古いバージョンの追加情報を確認する方法

備忘録的に。2015年3月現在

# iTunes Connectで古いバージョンの追加情報を見たい
申請してから配信されるまでの期間を調べようと思い、iTunes Connect上で何とか見れないものかと。

画面上は最新バージョンのものしか見れない模様。
ステータス履歴画面のURLの中に"versionString=latest"ってのを見つけて、
versionStringを過去リリースしたバージョン情報(例えば、versionString=1.0.0)に変更すると、
その時の情報がバッチリ見れました。
HTTP/HTTPSもDNSもキャッシュする

以下のいずれかの症状の当てはまる方向け。

* ブラウザのキャッシュ容量でいつも悩む
* とりあえずキャッシュすると気分も高速化する
* 複数のブラウザを使用するが、キャッシュは統一したい
* プロキシが好きでたまらない

# 試した環境

* OSX 10.10.2
* Xcode 6.2 + CommandLineTools
* homebrew 0.9.5
* squid 3.4.0
* nghttp2 0.7.5
* dnsmasq 2.72

# HTTP/HTTPS 通信をキャッシュする

## squid

### インストール

```shell-session
$ brew install squid
```

で、インストール完了。

自動起動させたい場合は、インストール時に表示されるメッセージに従って ```~/Library/LaunchAgent``` に plist を登録してあげると毎回起動する必要が無くなり便利。

### 設定

プロキシの存在を極力隠したければ、 ```/usr/local/etc/squid.conf``` に

```
visible_hostname unkown
forwarded_for off
request_header_access X-FORWARDED-FOR deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
```

を追加。

認証ありなプロキシを使ってる環境な方は、以前書いた
[OSX - squid で認証ありプロキシによるストレスを軽減する](http://qiita.com/scalper/items/e945dd103d356db6eae6)
も参考にどうぞ。

## nghttp2

### インストール

こちらもサクッと

```shell-session
$ brew install nghttp2
```

### 設定

今回はバックエンドに squid を利用する HTTP/2 プロキシとして使うので、

証明書を用意できるのであれば、

```shell-session
$ nghttpx -s -f*,8443 -b127.0.0.1,3128 /path/to/server.key /path/to/server.crt
```

とすると、デフォルトで SSL/TLS を使うセキュアな HTTP/2 + SPDY プロキシとして動作する。

なお、 IPv4 のみにしたければ

```shell-session
$ nghttpx -s -f0.0.0.0,8443 -b127.0.0.1,3128 /path/to/server.key /path/to/server.crt
```

といった具合に * を 0.0.0.0 (or IPアドレス)で起動。

なお、証明書の用意が出来なければ、

```shell-session
$ nghttpx -s --frontend-no-tls -f*,8443 -b127.0.0.1,3128
```

とすると、SSL/TLS 接続が無効になってしまうものの、HTTP/2 プロキシとしては動作する。

※launchd から起動する plist 書いた方いたらください...

## dnsmasq

### インストール

```shell-session
$ brew install dnsmasq
$ cp `brew --prefix dnsmasq`/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
$ sudo cp -fv `brew --prefix dnsmasq`/dnsmasq/*.plist /Library/LaunchDaemons
$ sudo chown root /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

### 設定

循環参照しないよう、 resolv-file だけはしっかりと設定する。

```shell-session
$ emacs -nw /usr/local/etc/dnsmasq.conf

resolv-file=/usr/local/etc/resolv.dnsmasq.conf
```

ここまでやったら、「システム環境設定」→「ネットワーク」から、DNSの設定を ```127.0.0.1``` に書き換え。

### 動作確認

DNSキャッシュをクリアして、名前解決できれば完了。

```shell-session
$ sudo dscacheutil -flushcache
$ sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
$ sudo launchctl load 
/Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
$ dig qiita.com
...
```

# 変更履歴
2015.10.09 plist のコピーを追加。typo 修正。
Atomで分割したパネル（タブ）をリサイズするキーバインドを変更する

#Photoshopライクに
[layout-manager](https://atom.io/packages/layout-manager)をインストールする事でパネルのリサイズが出来るようになりますが、Photoshopでの「拡大/縮小」のように、テンキーの[-][+]キーでの組み合わせが自分としては直感的なのでキーバインドを変更しました。

#キーバインドを無効/変更する
Settings > Keybindings > your keymap file
でkeymap.csonファイルを開く。
以下を追記する。

```coffeescript:keymap.cson
# [layout-manager] パネルサイズの変更のキーバインドを変更
'.editor':
  # キーバインドを無効にする
  'alt-cmd-=': 'unset!'
  # キーバインドを再定義する
  'alt-cmd-+': 'layout-manager:enlarge-active-pane'
```

デザイナーでフルサイズのキーボードを使用している方の参考になれば。
「site-cookbooks」に自作cookbookを置くスタイルはどこから広まったのか

* `site-cookbooks`に自作のcookbookを置く
* `cookbooks`にはサードパーティのcookbookを置く

というスタイル、てっきりChefの公式推奨スタイルかと思っていたのですが、調べてみたらそうではありませんでした。
いったいどこから発祥して広まったのでしょうか？

## Chef本家

https://github.com/chef/chef-repo

とくに`site-cookbooks`について言及していません。

> Cookbooks you download or create.

ということで、自作cookbookを`cookbooks`に置いてもよいようです。

## Berkshelf

http://berkshelf.com/

> The traditional pattern is to place all of your cookbooks in a directory called cookbooks or site-cookbooks within your Chef Repository.

`cookbooks`と`site-cookbook`を同列のようにみなしています。
とくに、どっちをどの用途に、とは書かれていませんでした。

## librarian

https://github.com/applicationsonline/librarian-chef

> Librarian-Chef takes over your cookbooks/ directory and manages it for you based on your Cheffile. Your Cheffile becomes the authoritative source for the cookbooks your infrastructure repository depends on. You should not modify the contents of your cookbooks/ directory when using Librarian-Chef. If you have cookbooks which are, rather than being separate projects, inherently part of your infrastructure repository, then they should go in a separate directory, like your site-cookbooks/ directory, and you do not need to use Librarian-Chef to manage them.

ライブラリは`cookbooks`に、自作のは`site-cookbooks`に置きなさい、と明言されています。
どうやらここが発祥の地のようです。

## Knife-solo

http://matschaffer.github.io/knife-solo/

> A note about the “cookbooks” directory
One common “gotcha” is that you may have Berkshelf or Librarian-Chef installed without knowing it. This will generate a kitchen that is configured to use them which might not have been your intention. Once the configuration file is available, the cookbooks directory will be reserved for cookbooks that are resolved via one of those tools. Any cookbooks that you create there will be removed when you run knife solo cook.

> Please use site-cookbooks for custom cookbooks or (better yet) give them their own git repositories which are then included using Berkshelf or Librarian-Chef.

`cookbooks`はBerkshelf or Librarian-Chefの展開先として使うから、自作のやつは`site-cokbooks`に置きなさいとはっきり書かれています。

## 結論

* `site-cookbooks`に自作cookbookを置くスタイルは、特にChef公式ではない。
* Librarian-Chefから始まって、knife-soloがそれを採用して広めた。
* 日本では既にデファクトスタンダード(?)っぽくなっている。
OpenCV でウォーリーを探す

# OpenCV でウォーリーを探す

## はじめに
<a href="http://www.gizmodo.jp/2015/03/post_16710.html">10秒以内にウォーリーを探す合理的な方法 : ギズモード・ジャパン</a>
## 疑問
こんなキャラクターを探すのに 10 秒もかかってしまうらしい
雑魚だな俺は10秒もかからずに見つけてやるぜ
# コード
[tanjo/where-s-wally](https://github.com/tanjo/where-s-wally)
# Result
![](https://github.com/tanjo/where-s-wally/blob/master/result/found_wally.png?raw=true)

ただのテンプレートマッチングでした
ありがとうございました
メソッドをモデルとコントローラーのどちらに記述するか。

モデルはデータとビジネスロジックを表します。
コントローラーはviewとmodelを制御する。
メソッドは基本的にはコントローラーとモデルに書きます。


コントローラーは、基本的にはクリックした時に発生するメソッドを記述します。
例えば、createもshowもupdateも必ずクリック?します。
自分で作った、favoriteというボタンもクリックするので、コントローラーに記述します。

それに対して、modelにはクリックしないメソッドを記述します。
例えば、viewにおいて、AならばAAを表示、BならばBBを表示という条件分岐を作成したい場合は、メソッドをmodelに記述します。


具体例
view：index.html.erb

```lang:html
<% unless article.follow_or_not(article.user_id,current_user.id)  %>
hello
<%else %>
goodbye
<% end %>
```

model：article.rb

```lang:ruby
  def follow_or_not(followed_id,user_id)
  	if Follow.where("user_id = ? and followed_id = ?", user_id, followed_id).pluck(:user_id,:followed_id).include?([user_id,followed_id])
  	end
  end
```
vagrant upで A VirtualBox machine already exists.とでる解決方法

`vagrant up`でVagrantが
起動できなくなり困りました。その際の解決方法です。

# vagrant up で box already exist
`vagrant up`をしてもboxが存在すると言われて起動できません。

```bash:vagrantの起動が失敗
vagrant up

A VirtualBox machine with the name 'hoge' already exists.
Please use another name or delete the machine with the existing
name, and try again.
```

# vagrant destroy 
単にvagrant destroyを実行すると、その場でdestroyしていいか聞いてきますので`y`を入力して実行するとdestroyを実行できます。

# vagrant destroy で Nameを指定
`vagrant global-status`を実行すると、いまある環境がわかります。そこから`vagrant destroy`でNameをdestroyすると`vagrant up`が走るかもしれません。

```bash:destroyでNameを指定
vagrant destroy local.example.com
```

ただ、ここで以下のようにエラーが出る場合があります。

```
A VirtualBox machine with the name 'local.pugiemonn.com' already exists.
Please use another name or delete the machine with the existing
name, and try again.
```
この場合は`vagrant global-status`でなくオプションを付けてください。

```
vagrant global-status --prune
```
`--prune`はcacheを削除するオプションみたいです。

# vagrant box remove で boxを削除
もしくは`vagrant box remove`でboxを削除すると`vagrant up`が動くかもしれません。
boxの一覧は`vagrant box list`でboxの一覧を確認できます。

```bash:vagrantの起動が失敗
vagrant box remove hoge
Box 'hoge' (v0.1.1) with provider 'virtualbox' appears
to still be in use by at least one Vagrant environment. Removing
the box could corrupt the environment. We recommend destroying
these environments first:

default (ID: 9c5d026830a7a7s91dadb21bbb3f6f34)

Are you sure you want to remove this box? [y/N]
```

# VBoxのディレクトリを削除する
VBoxのディレクトリに書き込めない場合はディレクトリを削除して作りなおすと`vagrant up`が走るかもしれません。

何度か実行しているうちに以下の様エラーがでました。

```
The name of your virtual machine couldn't be set because VirtualBox
is reporting another VM with that name already exists. Most of the
time, this is because of an error with VirtualBox not cleaning up
properly. To fix this, verify that no VMs with that name do exist
(by opening the VirtualBox GUI). If they don't, then look at the
folder in the error message from VirtualBox below and remove it
if there isn't any information you need in there.

VirtualBox error:

VBoxManage: error: Could not rename the directory '/Users/kawasakiosamu/VirtualBox VMs/hoge_1426591193616_11769' to '/Users/kawasakiosamu/VirtualBox VMs/hoge' to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 2788 of file VBoxManageModifyVM.cpp
```
この場合`/Users/kawasakiosamu/VirtualBox VMs/hoge`がVERR_ALREADY_EXISTSということなので消してしまいました。

```bash:ディレクトリを削除
sudo rm -rf /Users/kawasakiosamu/VirtualBox¥ VMs/hoge
```

# VirtualBoxから停止
VitualBoxを起動し、該当のVMを停止するのも有効です。

# /etc/exportsのディレクトリがかぶっている
nfsを使っている場合これがでるかもしれません。

```
remove this file or specify a different file name for outputting.
```
上記のように表示され場合 `/etc/exports`を編集して書き込まれているディレクトリの表記を削除すると起動できます。

# 最終的に
`vagrant up`が走りました。

# 参考
http://stackoverflow.com/questions/24440142/removing-list-of-vms-in-vagrant-cache
MAC環境構築 備忘録

#忘れないようにメモ
 

参考 [Mac の開発環境構築を自動化する (2015 年初旬編)](http://t-wada.hatenablog.jp/entry/mac-provisioning-by-ansible)


##Homebrew

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

brew doctor
brew update
```

##Ansible


```
brew install python
brew install ansible
```

##自動化

```
mkdir .macbook-provisioning
cd .macbook-provisioning/
echo 'localhost' > hosts
```

##playbook
https://github.com/katsumeshi/prepare-env
adminページでrelated fieldにフィルターをかける


メモです。

##Foreign field
```Python
def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "car":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
```

##Meny To Many Field
```Python
class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
```

どちらも、Carの部分がrelated fieldです。

これで、related fieldを選択する時に余計なものを消せます。
Rails4にTwitter BootStrap3を導入する方法

個人的なメモです。

Railsチュートリアルでは「bootstrap-sass(3.0.2.0)」というgemを使っていたけど、
bootstrap3がうまく動いてくれないので「twitter-bootstrap-rails」を使うことにした。

参考にさせていただいた記事
・[Rails4へTwitter BootStrapの適用方法](http://qiita.com/wantata222/items/fba52115ba53eeee59c5)

環境
rails 4.1.7
ruby 2.0.0

１．bootstrap-sassをコメントアウト

```rb:Gemfile
# gem 'bootstrap-sass', '3.0.2.0'
```

２．２つのgemを追加

```rb:Gemfile
# BootStarpで追加。
gem 'therubyracer',  platforms: :ruby
gem 'less-rails'
gem 'twitter-bootstrap-rails'
```

３．bundle installを実行

`bundle install --path vendor/bundle`

４．bootstrapの実行

`$ bundle exec rails generate bootstrap:install less`
`$ bundle exec rails generate bootstrap:install static`
カメラの切り替え

SurfaceViewでカメラのプレビューができている前提です。

なにも指定せずに
camera.open();
とするとデフォルトのカメラ（たいていは背面だと思います）が有効になり、プレビューが開始されます。
自撮りしたいときなどに使う液晶面のフロントカメラに切り替えたい時に、SurfaceViewを継承したクラスで以下のようなメソッドを作っておいて外部から呼び出すようにしました。

```
public void switchCamera() {
    camera.stopPreview();
    camera.release();

    if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
        currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
    }else {
        currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
    }

    camera = Camera.open(currentCameraId);
    //プレビューを縦向きにしたいので回転。
    camera.setDisplayOrientation(90);

    try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        if(camera != null) {
            camera.release();
            camera = null;
        }
        Log.e(TAG,e.getMessage());
    }

    camera.startPreview();
}
```

一旦プレビューを止めてからカメラを再度オープンすればOKです。
Macのメニューバーを非表示にする

展示用などでアプリケーション毎にメニューバーを非表示にする方法
以下はFinderのメニューバーを非表示にする場合。

```Terminal
sudo defaults write /System/Library/CoreServices/Finder.app/Contents/Info LSUIPresentationMode -int 4
sudo chmod 644 /System/Library/CoreServices/Finder.app/Contents/Info.plist
killall Finder
```
QiitaにYouTubeを埋め込む（MarkdownにYouTubeを埋め込む）

自分の探し方が悪いのかQiitaでこのトピックを探しても見つからなかったので書いておく（すでにあったらすみません）。

投稿最下部の参考ページにあるように次のように書くと表示される。

```markdown
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg)](http://www.youtube.com/watch?v=YOUTUBE_VIDEO_ID_HERE)
```

`YOUTUBE_VIDE_ID_HERE`のところにはVIDEOのIDで置き換えてください。例えば、このビデオ["https://youtu.be/XHECZDy_ctg"](https://youtu.be/XHECZDy_ctg)の場合は`id=XHECZDy_ctg`なので、以下のようになります。

```markdown
[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/XHECZDy_ctg/0.jpg)](http://www.youtube.com/watch?v=XHECZDy_ctg)
```

そして、このように表示されます。
[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/XHECZDy_ctg/0.jpg)](http://www.youtube.com/watch?v=XHECZDy_ctg)

追記：埋め込むといっても、リンク付きの画像です。動画が埋め込み枠内で再生されるわけではありません。

### 参考
* [Markdonw Cheat sheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
* [Embedding YouTube Video in GitHub README markdown](https://youtu.be/XHECZDy_ctg)
Emacs のMagitで`git reset --hard <commit id>`を楽にやる

MagitとはEmacsから使えるgitクライアントで、CUIながらグラフィカルなインターフェースを持ち、ショートカットキーを駆使して、少ない手数で色々なことができます。特に、sshでリモートで作業をしていてGUIを開くのが嫌な人などにはおすすめです。また、Emacsユーザーじゃない人にもおすすめです。
[![Magit説明動画（英語）](http://img.youtube.com/vi/zobx3T7hGNA/0.jpg)](http://www.youtube.com/watch?v=zobx3T7hGNA)

追記：@acpleさんより指摘いただき、`c-u x`でできることが判明いたしました。ありがとうございます。

~~さて、Magitには[キーボードショートカット](http://daemianmack.com/magit-cheatsheet.html)が多数割り当てられており、pull, push, branch, checkout, rebase, merge, fetch, などなどのコマンドを楽ちんに行えますが、本投稿の件名にある`git reset --hard <commit id>`のキーが存在しません。いつもEmacsのshellのeshellを開いて、自分でコマンドを打っていました。しかし、コマンドの組み合わせで意外と簡単にやるやり方を見つけたので共有しておきます。~~

~~超簡単な話なのです。magitには、`git reset --soft`のために、`x`が割り当てられており、`git reset --hard HEAD`（コミットしてないワーキングツリーの変更をすべて破棄するコマンド）に対して`X`が割り当てられてます。これらの組み合わせで、まず`x`を入力し、コミット番号を指定して、HEADをコミット番号（soft reset）に移動させます。これだと、今までいたコミットとの差分がステージングされている状態なので、`X`を入力してhard reset する。それだけです（当たり前のやり方です）。ちなみに、僕は`l l`でログを表示して、カーソルを移動したいコミットに移動させて`x`でsoft rest してます。~~
webview-m40r4リリースされたみたいです。

差分は少ない模様。

- r1からのコミットログ

```
$ git log --oneline --no-merges webview-m40_r1..webview-m40_r4
```

520a78a Cherry-pick "[Android WebView] Provide user-initiated provisional load detection"
1cf285d Disable orientation locking support in WebView.
3dbfef3 Fix the battery status API.
7699f2d Back-port: "[Android WebView] Synthesize a fake page loading event on page source modification (Re-land)"
0fa3bbe Cherry-pick "[Android] Cache function templates in GinJavaBridgeObject to avoid memory leak"
bf9291d Revert "Fix problem with accents caused by race condition."
dcf1619 Reland of "[Clank IME] Make keyCode detection sensitive to autocomplete=on|off."
4922e3c Revert of [Clank IME] Make keyCode detection sensitive to autocomplete=on|off.
124072c Revert use of chrome version information in android webview.
262f5c6 Fork: Skip sharing GL_LUMINANCE textures
ae41c9e Cherry-pick: Move detachGLFunctor call before hardware teardown.
8d271d8 Cherry-pick: Define SK_USE_FREETYPE_EMBOLDEN on Android
cff11c9 Cherrypick: Don't send extra text changed AX events on Android
0702753 [WebView] Continue playback when exiting fullscreen video.
【boost::asio buffers】shared_ptrを使うとメモリ管理が楽になる  for C++03

# 今回のお題
boost1_57_0 buffers(C++03)
http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/example/cpp03/buffers/reference_counted.cpp

上記サンプルを CMakeプロジェクトにしたものを
下記リポジトリに置いておきます
https://github.com/MurasameOpen/CPPSample/tree/master/boostSample/boost1_57_0/asio/cpp03/buffers


# 解析

##動作
C++11版と同じく 待ち受けポートをパラメータに 起動し
接続が来たら 現在時刻を返す

一応 telnetで接続してみましょう

```bash:telnet
miyatake_y$ telnet -4 localhost 8080 
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Wed Mar 25 01:29:25 2015
Connection closed by foreign host.
```



## ソース解析

基本的に C++11のサンプルと同じですが
shared_ptr、bind等が 言語仕様に取り込まれていないので
boost:: の名前空間を使っていたり文法が多少違いますが
考え方はだいたい同じです


### ソース

```cpp:server

class server
{
public:
  server(boost::asio::io_service& io_service, short port)
    : io_service_(io_service),
      acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
  {
    session_ptr new_session(new session(io_service_));
    acceptor_.async_accept(new_session->socket(),
        boost::bind(&server::handle_accept, this, new_session,
          boost::asio::placeholders::error));
  }

  void handle_accept(session_ptr new_session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      new_session->start();
    }

    new_session.reset(new session(io_service_));
    acceptor_.async_accept(new_session->socket(),
        boost::bind(&server::handle_accept, this, new_session,
          boost::asio::placeholders::error));
  }

private:
  boost::asio::io_service& io_service_;
  tcp::acceptor acceptor_;
};

```

C++11では ラムダを使って make_sharedでコールバック関数を作成していたのが
boost::bindになり少し記述が増えました
が、やってる事は同じで、shared_ptrで sessionを作成し、startを呼びます


```cpp:session
class session
  : public boost::enable_shared_from_this<session>
{
public:
  session(boost::asio::io_service& io_service)
    : socket_(io_service)
  {
  }

  tcp::socket& socket()
  {
    return socket_;
  }

  void start()
  {
    using namespace std; // For time_t, time and ctime.
    time_t now = time(0);
    shared_const_buffer buffer(ctime(&now));
    boost::asio::async_write(socket_, buffer,
        boost::bind(&session::handle_write, shared_from_this()));
  }

  void handle_write()
  {
  }

private:
  // The socket used to communicate with the client.
  tcp::socket socket_;
};
```

start()　で async_write時に
C++11では ラムダ式で shared_from_this()をキャプチャさせ
自分のshared_ptrをキープしてましたが
ここでは boost::bindでキープに変わりましたが
基本は同じです


# 結論
非同期関数はメモリの管理が少し面倒
C++11ではラムダ式のキャプチャでshared_ptrをキープしていたが
C++03では boost::bindを使うと良さそうだ
C++11の方が、かなりコードが見通しが良くなる
GooglePlayStoreのアップデートを検出する

## 目的：リリースを検出したい
Google Play Storeは公開ボタンをぽちってから反映されるまでに2時間くらいかかるのですが、いつリリースされたか知りたい。
->今は数分でストア反映されるようになりましたね〜！

## アクション：アップデート日付を比較して検出する
[github](https://github.com/matsuokah/store_util)
rspecでFTPテスト


# rspecでFTPテスト

[rspec-ftp](https://github.com/hilolih/rspec-ftp)を作った。

~~~ruby
it "enable to login" do
   expect("server.com").to be_accessible.user("username").pass("password")
end

it "enable to login on active mode" do
   expect("server.com").to be_accessible.user("username").pass("password").active
end

it "enable to login on passive mode" do
   expect("server.com").to be_accessible.user("username").pass("password").passive
end

~~~
Yosemiteでvalgrindを入れる

`brew install valgrind` すると

````
valgrind: OS X Mavericks or older is required.
Error: An unsatisfied requirement failed this build.
````

というエラーになります。

    brew install --HEAD valgrind

でインストールできます。

参考
http://sourceforge.net/p/valgrind/mailman/message/33047840/
command-paletteっぽいUIのプラグインのキーバインドをまとめて設定する

# はじめに
Atomのプラグインは、[command-palette](https://atom.io/packages/command-palette)とか[fuzzy-finder](https://atom.io/packages/fuzzy-finder)とか、「入力した内容で絞り込んでその中から選んで実行する」というUIのものが多いですよね。

![command-palette.png](https://qiita-image-store.s3.amazonaws.com/0/7048/809731a9-65aa-b7b6-e176-6dde540db82f.png)
![fuzzy-finder.png](https://qiita-image-store.s3.amazonaws.com/0/7048/3fcbafe0-0c83-a07c-511d-b55be664f72e.png)

そういった似たようなUIのプラグイン用にキーバインドを設定する場合、それら共通のキーバインドを設定して使い回したいと思うのですが、
それをまとめて設定するkeymapの書き方を紹介します。

# SelectListView用のプラグインを設定する
「入力した内容で絞り込んでその中から選んで実行する」UIを持つプラグインは多くの場合、[SelectListView](https://github.com/atom/atom-space-pen-views/blob/master/src/select-list-view.coffee)を継承することで実現されています。

これを継承したプラグインの多くはこれと共通したビューからなるので、

```coffee:keymap.cson
'.select-list atom-text-editor':
  'ctrl-c': 'core:cancel' # Vimっぽくキャンセル出来るようにしたい
  'ctrl-[': 'core:cancel'
  'tab': 'core:move-down' # Tab, Shift-Tabで順送り、逆送りしたい
  'shift-tab': 'core:move-up'
```
…のように、`.select-list atom-text-editor`のようなセレクタを指定してあげると、まとめて設定することが出来ます。(`atom-text-editor`は付けなくても良い)

# SelectListViewに用意されたコマンド
ちなみに、[SelectListView](https://github.com/atom/atom-space-pen-views/blob/master/src/select-list-view.coffee)では、いくつか選択肢を操作するコマンドが用意されていて、以下のコマンドは共通して次の動作になります。

| コマンド名            | 動作                        |
|:-------------------:|:---------------------------:|
| core:move-up        | 前の(上の)選択肢に移動する      |
| core:move-down      | 次の(下の)選択肢に移動する      |
| core:move-to-top    | 最初の(一番上の)選択肢に移動する |
| core:move-to-bottom | 最後の(一番下の)選択肢に移動する |
| core:confirm        | 決定                         |
| core:cancel         | キャンセル                    |

他にも、SelectListViewの絞り込みの入力欄は縮小版のテキストエディタを使っているのでテキストエディタ(`atom-text-editor`)で有効なコマンドを設定することが出来ます。

他のプラグインでも`core:confirm`, `core:cancel`などは決定、キャンセルの動作になることが多いのでキーバインドを設定する場合は試してみるといいと思います。
心臓の鼓動っぽいモーション

こちらのコードはJavaになりますが、
JS仕様にしてjsdo.itで公開しました。
http://jsdo.it/hp0me_/uBj3

ゲームプログラミングの息抜きにProcessingというのも乙なもの（？）です。
Javaに慣れてない方は、練習にもなります。

##実行イメージ (gif動画)
gifじゃ伝わりにくいですが・・・
![sketch16.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/dda3909f-9c1a-f034-6800-18352085d00f.gif)

##コードのイメージ
フレームが0から20くらいまであるとします。
そのうち17から20フレまではスピードを急激に速くするとこんな感じになります。
##コード

```java:sketch_150324a.pde
//血の粒の数
int cellNumber = 350;

//通常スピードと速いスピード
int speed = 1;
int speedFast = 5;

//通常フレームとどこから速くなるか
int frameMax = 20;
int frameFast = 17;

//粒の大きさにバリエーションをつける
int minRad = 10;
int maxRad = 90;

BloodCell[] _cellArr = {};

void setup(){
  size(800,800);
  background(255);
  smooth();
  generateCells();
}

void draw(){
  background(255);
  for(int i=0; i<_cellArr.length; i++){
    BloodCell cell = _cellArr[i];
    cell.update();
  }
}

void generateCells(){
  //粒を生成
  for(int i=0; i<cellNumber; i++){
    BloodCell cell = new BloodCell();
    cell.genarate();
    _cellArr = (BloodCell[])append(_cellArr,cell);
  }
}

//血の粒をクラス化
class BloodCell {
  float x,y,vx,vy,rad;
  int counter;
  
  BloodCell(){
    x = random(width);
    y = random(height);
    rad = random(minRad,maxRad);
    vx = random(-speed,speed);
    vy = random(-speed,speed);
  }
  
  void genarate(){
    noStroke();
    fill(203,51,51,120);
    ellipse(x,y,rad*2,rad*2);
  }
  
  void update()
  {
    //遅い移動
    if(counter < frameFast){
      vx = random(-speed,speed);
      vy = random(-speed,speed);
    //速い移動
    }else{
      vx = random(-speedFast,speedFast);
      vy = random(-speedFast,speedFast);
    }
    counter++;
    if(counter == frameMax)counter = 0;

    x += vx;
    y += vy;

    //フレーム描画
    genarate();
  }
  
}

```
GitHubのリポジトリをpip install

Pythonで何か新しいパッケージをインストールしたい時は、pipを使うと便利ですね。

```
pip install tweepy
```

こうするとPyPIからパッケージを探してきてインストールしてくれるのですが、すでに開発停止しているパッケージをフォークしてGitHubにあげている場合など、PyPI以外の場所からパッケージを引っ張ってきたい場合があるかと思います。

例として、本家の [tweepy/tweepy](https://github.com/tweepy/tweepy) ではなく、僕のGitHubにある [mktakuya/tweepy](https://github.com/mktakuya/tweepy) からパッケージをインストールする事を想定しましょう。

```
pip install git+https://github.com/mktakuya/tweepy
```

これで行けます。

http://ではなくgit://やssh://を使う場合や、SubversionやMercurialなど他のVCSもサポートしているので、詳しくはドキュメント

[pip install &mdash; pip 6.0.8 documentation](https://pip.pypa.io/en/latest/reference/pip_install.html?highlight=git#vcs-support)

を見てみると良いと思います。

以上、備忘録がてらの投稿でした。
ipaをiTunesライブラリに追加できないときの対処法

Xcode 6.2でAd Hoc(Save for Ad Hoc Deployment)を選択してipaを作成してiTunesにドラッグアンドドロップしたところ、以下のようなエラーがでました。

![iTunes](https://qiita-image-store.s3.amazonaws.com/0/3862/a8afcf19-ad27-237d-c23f-a807aebed070.jpeg)

> 「App"(アプリ名).ipa"は有効な App ではないため iTunes ライブラリに追加できませんでした。」（ipa app could not added to our itunes library, it is not a valid app）

XcodeのBuild SettingsのCode Signing identityやProvisioning Profileなどを何度も確認、変更したりCleanしてもエラー内容は変わらず、悩みました。
ほかのプロジェクトファイルでipaを作成したところ、エラー表示もなく追加することができました。

ipaを解凍してエラーがでるipaとエラーがでないipaを比較してみました。

* エラーがでるipaを解凍すると「Applications」というフォルダがでてきます。このフォルダの中にappがあります。
* エラーがでないipaを解凍するとアプリ名と同じフォルダがでてきます。このフォルダの中に「Payload」があり、appがあります。

appがあるフォルダが違うことに気づきました。
試しに「Applications」を「Payload」にリネームして圧縮、拡張子をzipからipaに変更してiTunesにドラッグアンドドロップしたところ、エラー表示もなく追加することができました。


軽く調べたところ、Xcode 6で古いプロジェクトファイルからipaを作成するとこのような現象になるようです。


追記
---------

Info.plistのApplication requires iPhone environment(LSRequiresIPhoneOS)をYES(true)に変更すると正常に作成することができます。

![xcode.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/16c59ee1-d785-794c-eeff-a08f2715b6a3.jpeg)
StoryboardでLabelのAttributeを設定しつつ、文字をコードで動的に変える

LabelのAttributeはStoryboard見ながら設定したい、でも文字はコードで動的に変えたい！
でも、UILabelのattributedTextはimmutableなのでコード側で文字を変えるのは面倒です。

そんな時はLabelのattributesを取ってきて、それを使って新しくattributedStringを生成するとうまくいきます。

```objc
NSString *text = @"....";
NSDictionary *attributes = [self.label.attributedText attributesAtIndex:0 effectiveRange:nil];
self.label.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];

```
pythonのvirtualenvでbrew installしたopencvのimportでSegmentation fault: 11が出た時のワークアラウンドメモ

参考: [PythonでOpenCVを使う@Mac - Qiita](http://qiita.com/ru_pe129/items/f065f79b1322a82edb1d)

上記に従って自分の virtualenv の `site-packages` 配下に cv.py と cv2.so の
シンボリックリンクを貼ったのだが、`import cv` したら **"Segmentation fault: 11"** が出て落ちた。うう…。

virtualenv 内で、

`brew uninstall opencv` してから、
`brew install opencv` したところ

```console
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getusersitepackages'
```

というエラーが。

正攻法で行ける気がしなかったので、 `~/.bashrc` に、

```bashrc
# python
export PYTHONPATH=/usr/local/lib/python2.7/site-packages:~/.virtualenvs/my_venv/lib/python2.7/site-packages:$PYTHONPATH
```

を足して、もう一度 `brew install opencv` をしたら今度は先述のエラーが出なかった。

`source ~/.bashrc` して python を立ち上げ

```py
import cv
import cv2
```

したところ、セグフォらなくなった。というメモでした。。。

(あと一応、anyenv → pyenv の環境下での話)

## それでもダメな場合

`echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> ~/.pyenv/versions/{virtualenv_name}/lib/python2.7/site-packages/homebrew.pth` してみる (いや、最初からそうしたほうがいいかも)。
Gulp + Browserify + CoffeeScriptで複数エントリーポイントを登録する


標題の環境で、エントリーポイントを複数登録するのに結構ハマりました。とりあえず無理矢理の対応です。
transform辺りについて、もっと熟知すれば効率よく書けるのかも。
	

gulpfile.coffee

```coffeescript
gulp = require 'gulp'
browserify = require 'browserify'
glob = require 'glob'
notify = require 'gulp-notify'
source = require 'vinyl-source-stream'

path =
  source: 'develop/source'
  build: 'develop/build'

gulp.task 'browserify', ->
  # plumberの代替
  handleErrors = ->
    args = Array.prototype.slice.call arguments

    notify.onError
      title: 'Compile Error'
      message: '<%= error %>'
    .apply @, args

    @emit 'end'

  files = glob.sync "./#{path.source}/coffee/*.coffee"

  # エントリーポイントを複数登録するためのループ
  for i in files
    browserify
      entries: i
      extensions: '.coffee'
    .transform 'coffeeify'
    .bundle()
    .on 'error', handleErrors
    .pipe source i.replace(/.+\/(.+)\.coffee/g, '$1') + '.js'
    .pipe gulp.dest "#{path.build}/js/"
fishでsubshellの出力を展開する方法2

Dockerクラスタをローカルマシンのように扱うには
```
$(docker-machine env swarm-master)
```
で環境変数を設定する必要があります。

```
docker-machine env swarm-master
```
の実行結果は
```
set -x DOCKER_TLS_VERIFY yes
set -x DOCKER_CERT_PATH /Users/osamu/.docker/machine/machines/swarm-master
set -x DOCKER_HOST tcp://192.168.99.100:2376
```
です。

fishの場合は以下のコマンドで環境変数を設定できます。

```
(docker-machine env swarm-master)|source -
```
MACでAndroid 開発環境構築メモ


Androidを勉強中です。
で、Androidとかは2.1時代に少しだけ触ったなー・・・・
程度で時代も変わったし1から勉強しなおそうと思ったので、まずは環境構築から始めるとするですます。

## 環境

* MAC OSX Yosemite


## 参考にしたサイト

* [Android再入門 〜Eclipseのことは忘れろ〜 #nds40](http://qiita.com/Nkzn/items/b31829890ba83a7fd618)
* [Genymotion + Android Studio on Mac](http://qiita.com/Sam/items/8d551f575b617fa0be7e)
* [mixi-inc/AndroidTraining](https://github.com/mixi-inc/AndroidTraining)



## 事前準備に必要なもの

* [homebrew](http://brew.sh)
* [homebrew-cask](https://github.com/caskroom/homebrew-cask)

上記が入っていない方は[みんなhomebrew-caskって知ってるか？](http://qiita.com/ryurock/items/1432578d364985f6cb06)を参考にいれてください。

## Android開発に最低限必要なものをインストールする

[homebrew-cask](https://github.com/caskroom/homebrew-cask)でまとめてdone

* java
 * Androidなんで
* [android-studio](http://developer.android.com/sdk/index.html)
 * google公式のIDEなんで
* [genymotion](https://www.genymotion.com/)
 * 「bundleのエミュレーター」はみんな窓から捨ててしまえというもんなんで

```bash
 brew cask install java
 brew cask install android-studio
 brew cask install genymotion
```

## GenyMotion Android Studio 連携をする

[Genymotion + Android Studio on Mac](http://qiita.com/Sam/items/8d551f575b617fa0be7e)を参考にしてください。

## Hello worldを表示する

[mixi-inc/AndroidTraining プロジェクトの作成(Android Studio)](http://mixi-inc.github.io/AndroidTraining/introductions/1.03.create-project-for-android-studio.html)を参考にしてください。

ちょこっとずつ更新していきます。(この記事)
WindowChromeを使用したウィンドウでリサイズグリップを有効にする方法

## 前置き

通常のウィンドウでリサイズグリップを有効にしたい場合、`Window.ResizeMode`プロパティに`CanResizeWithGrip`をセットすると有効になります。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/40121/ac818ebb-15e2-0416-5c48-9647e4f1f530.jpeg)
※例 Visual Studio 2013のリサイズグリップ

しかし、(カッコイイ枠なしウィンドウを作るために)`WhindowChrome`を使っていた場合、ただリサイズグリップが表示されるだけで、ドラッグしてもウィンドウサイズを変更できません。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/40121/a2a85799-bda1-112e-14ea-c100b4b81202.jpeg)
※リサイズできない

## 解決方法

この問題を解消するためには`WindowChrome.ResizeGripDirection`添付プロパティを使います。
素晴らしいことに、このプロパティを添付されたコントロールは **リサイズグリップになってしまうのです！** 
(おまけに最大化状態では無効になるという親切設計)

通常のリサイズグリップを再現するには、右下に配置したコントロールに`WindowChrome.ResizeGripDirection="BottomRight"`を設定すると良いです。

サンプルコードはこんな感じです。

```xml
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStyle="None"
        Title="MainWindow" Height="350" Width="525">
    
    <WindowChrome.WindowChrome>
        <WindowChrome ResizeBorderThickness="1"
                      CaptionHeight="40"/>
    </WindowChrome.WindowChrome>
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <Grid Grid.Row="1"
              Background="LightGray">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            
            <TextBlock Grid.Column="1"
                       WindowChrome.ResizeGripDirection="BottomRight"
                       Background="BlueViolet"
                       Foreground="White"
                       Padding="5"
                       VerticalAlignment="Center"
                       Text="右下"/>
        </Grid>
    </Grid>
</Window>
```

これだけで"右下"と表示されたTextBlockがリサイズグリップとして振舞います。コードビハインドも無くとっても簡単です。
仮にこのTextBlockど真ん中に配置されていても`WindowChrome.ResizeGripDirection="BottomRight"`が設定されていれば右下のグリップハンドルとして振舞います。

これを実行するとこうなります。
![Resize.gif](https://qiita-image-store.s3.amazonaws.com/0/40121/a20a2ec4-46f0-56b7-cbd1-826951f47059.gif)

## 参考

[WindowChrome.ResizeGripDirection アタッチされるプロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.shell.windowchrome.resizegripdirection%28v=vs.110%29.aspx)

[ResizeGripDirection 列挙体](https://msdn.microsoft.com/ja-jp/library/system.windows.shell.resizegripdirection(v=vs.110).aspx)
Gitlabの特定ブランチのpushをトリガにJenkinsをビルドさせる


## ゴール

Gitlabへpushされたブランチによって、Jenkinsでビルドする内容を切り分けること。

* developブランチへのpush → develop-build用のJOBを起動する
* masterブランチへのpush → master-build用のJOBを起動する

#### イメージ
こんな感じ。

　GitlabのWebHook
　 └─> JenkinsのtriggerJOB
　　　　　 ├─> develop-build用JOB
　　　　　 └─> release-build用JOB


Jenkinsで分岐を実現するだけなのでそんなにハマるとは思ってなかったけど、その考えは甘かった。。
結論だけ知りたい人はいきなり「実現する方法まとめ」へ。


## 試したこと１ 

ParameterizedTriggerPluginを使う
https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin


#### イメージ
★でParameterizedTriggerPluginを使って後続のJOBを切り分ける

　GitlabのWebHook
　 └─> JenkinsのtriggerJOB ★
　　　　　 ├─> develop-build用JOB
　　　　　 └─> release-build用JOB

#### 結果：失敗
ParameterizedTriggerPluginは後続JOBに対して、任意パラメータを付加して呼べるだけ。
後続JOB側でパラメータによって動きを変える必要があるが、develop用release用でJOBを別にする想定だったのでそもそもそんな使い方は想定していない。


## 試したこと２

１の構成に加えてどうにかして後続JOB側のビルド実行有無を制御する
「ビルドのパラメータ化」とか使えるのかも？

#### イメージ
triggerJOBがpushされたブランチ名のパラメータを付与して後続JOBを起動し、
★でパラメータが想定するブランチ名だった場合だけビルドを実行する

　GitlabのWebHook
　 └─> JenkinsのtriggerJOB
　　　　　 ├─> ★develop-build用JOB
　　　　　 └─> ★release-build用JOB

#### 結果：失敗
そもそも何が使えるのかよくわからない。
よく考えると後続JOBを起動してから実行制御するのではなくtriggerJOBが後続を起動させないようにするほうがあるべきだと思い、却下。


## 試したこと３

ConditionalBuildStepPluginを使う
https://wiki.jenkins-ci.org/display/JENKINS/Conditional+BuildStep+Plugin


#### イメージ
★の中で、pushされたブランチ名と想定する文字列(develop,master)と比較するシェルスクリプトを実行し、条件に合致する場合は後続JOBを起動する

　GitlabのWebHook
　 └─> JenkinsのtriggerJOB ★
　　　　　 ├─> develop-build用JOB
　　　　　 └─> release-build用JOB

#### 結果：成功
キターーーっ！！



## 実現する方法まとめ

　①GitlabのWebHook
　 └─> ②JenkinsのtriggerJOB
　　　　　 ├─> ③develop-build用JOB
　　　　　 └─> ③release-build用JOB

### ①GitlabのWebHook
Setting -> WebHookでトリガを登録する

URL : http://<JenkinsURL>/job/<②のtriggerJOB名>/build?delay=0sec
Trigger: Push eventsにチェック

URLは試す環境によって他のURLだったりするかも。。
上記で動かない場合は他の記事を参考に。

### ②JenkinsのtriggerJOB

「ソースコード管理」→「git」にGitlabのリポジトリ名を設定する。
「SCMのポーリングをする」にチェックする。

「ビルド手順の追加」から「Conditional step(single)」を選択。（ConditionalBuildStepPlugin）
以下のように設定する。「Project to build」は実行したい③の後続JOB名を指定。


![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/47589/f17c15ad-71cc-d708-f75a-fd066125f5af.png "jenkins.png")


以上。ParameterizedTriggerPluginは結局使わず。


## 補足

pushされたブランチ名を取得するときにgit pluginで取得できる${GIT_BRANCH}を使っていたが、pushされたブランチ名ではなかったorz

結局、以下のようにして取得して、develop/masterを含むかで判断してます。

```
LATEST_BRANCH=`git log --pretty=format:%d -1 --all`
```


## さらに補足 (2015/6/16)

運用していると、上記の方法では以下の様なケースでうまくいかないことがわかりました。

1. Aをcommit
2. 別ブランチでBをcommit
3. Bをpush
4. Aをpush   <- このときgit logだと"B"が最新になる

そのため、コミットされたコミットID${GIT_COMMIT}からpushされたブランチを取得するように変更しました。

```
PUSHED_BRANCH=`git branch -r --contains ${GIT_COMMIT}`
```

重ね重ね修正して申し訳ありません。
EC-CUBE3のメモ - GitHub/Git使い方 -

EC-CUBE3をきっかけに、GitHub/Git使いはじめたけど、なかなか覚えられないのでメモ

# とりあえずFork
とりあえず本家のレポジトリをフォークする

https://github.com/EC-CUBE/ec-cube で、右上のForkボタン押す。

# 次にclone
自分のレポジトリからcloneする
`$ git clone https://github.com/ユーザ名/ec-cube.git`

ブランチの状態を確認してみる
```
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

これでまずはソースコードをローカルに持ってきました

# 本家レポジトリの追従

本家が更新されても追従できるように、本家レポジトリをupstreamとして登録
```
$ git remote add upstream https://github.com/EC-CUBE/ec-cube.git
$ git remote -v
origin  https://github.com/ユーザ名/ec-cube.git (fetch)
origin  https://github.com/ユーザ名/ec-cube.git (push)
upstream        https://github.com/EC-CUBE/ec-cube.git (fetch)
upstream        https://github.com/EC-CUBE/ec-cube.git (push)
```
originには自分のが、upstreamには本家が登録されてるのがわかります。
この状態ではまだupstreamの情報を取得していないので一度fetchしておきます。
`$ git fetch upstream`

# 開発する時の流れ

## ローカルに開発用ブランチを作成
`$ git checkout -b ブランチ名 upstream/master`

## GitHubの自分のレポジトリに反映
`$ git push origin ブランチ名`

## 開発する
.
.
.

## 完了したらコミット
```
$ git add /path/to/file
$ git add /path/to/file
$ git commit -m "コメント"
```

## 本家の変更を確認
`$ git fetch upstream`
何か変更があればとってくる

## 本家の変更をマージ
`$ git rebase upstream/master`
何か変更があれば、マージする

コンフリクトした場合は、解消後、以下でマージを継続
`$ git rebase --continue`

## 自分のレポジトリにpush
`$ git push origin ブランチ名 -f`

# プルリクを送る
GitHubの自分のレポトリから、PullRequestする

# 参考
* http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873
* http://please-sleep.cou929.nu/track-original-at-forked-repo.html
* http://kray.jp/blog/git-pull-rebase/
オブジェクト指向設計原則　GRASP

本記事では有名なオブジェクト指向設計原則であるGRASPを紹介します
各パターンの解釈（見解）については幅がありますので記事本文では触れず、純粋に紹介するに留めます
私自身の見解についてはコメントにて追記していこうと思っています


# GRASPとは
General Responsibility Assignment Software Patterns（汎用的な責務割当のパターン）の略称で、Craig Larman氏が著書である実践UML（和訳はピアソン・エデュケーション）で紹介しています

## Expert（情報エキスパート）パターン
Q. オブジェクト指向設計において、責務を割り当てるときの最も基本的な原則は何か
A. 責務の遂行に必要な情報を持っているクラス、すなわち情報エキスパートに責務を割り当てる

## Creator（生成者）パターン
Q. あるクラスの新しいインスタンスを生成する責務は何が持つべきか
A. 以下のどれかの条件を満たすとき、クラスAのインスタンスを生成する責務をクラスBに割り当てる
・BがAオブジェクトを集約する
・BがAオブジェクトを含む
・BがAオブジェクトのインスタンスを記録する
・BがAオブジェクトを密接に使用する
・Aが生成されるときにAに渡される初期化データをBが持っている（従ってAの生成に関してBはエキスパートである）

## Low Coupling（疎結合）パターン
Q. 依存性を弱め、再利用性を高めるにはどのようにすれば良いか
A. 結合性を疎に保つように責務を割り当てる

## High Cohesion（高凝集性）パターン
Q. 複雑さを管理しやすくするにはどのようにすれば良いか
A. 凝集性を高く維持できるように責務を割り当てる

## Controllerパターン
Q. システムイベントを処理する責務は何が持つべきか
A. 以下のどれかを表すクラスにシステムイベントメッセージを処理する責務を割り当てる
・「システム」全体を表すクラス（ファサードのコントローラ）
・ビジネスまたは組織全体を表すクラス（ファサードのコントローラ）
・タスクに関係する可能性のある、現実世界でアクティブである何か（たとえば人の役割など）を表すクラス（役割のコントローラ）
・通常”＜ユースケース名＞Handler”の名前を持つ、ユースケースのすべてのシステムイベントの人工的なハンドラを表すクラス（ユースケースのコントローラ）


# 結び
CreatorとControllerについては幅が広く抽象的なため、実例無しでは理解が難しいかもしれません
原著である実践UMLはAmazonなどでも買えると思いますので、興味を持たれましたら原著を読んでみることをお勧めします