OmniAICreator/Qiita-1.07M huggingface dataset:
ゲームアルゴリズムコレクション for iOS


ゲームソフトを作る場合には、いろいろなキャラクタを動かしながら、操作への反応と、相互関係や画面のスクロールなどを組み合わるプログラムを行います。一般のデータ処理ではなかなか出ないようなキャラクタの衝突とかあるいはキャラクタが揃ったとかという判断とそれに対する画像での反応をプログラムすることになります。
しかし、ゲームではストーリーが違ったり、ゲーム自身の遊び方が違っていたりするものの、定石といえるような処理が沢山あります。
ゲーム専用の開発ツールではこういった部分はある程度ツール側で用意されていたりしますが、そうするとソフトウェアとしてどのような処理をしているかを知らないままになってしまいます。本書はそういった基本的なゲームでの動作のアルゴリズムを集めています。
iOS用のプログラミングなのですが、サンプルはC++ とObjective-C で書かれています。書籍の中ではどのように処理を作り上げて行くかが示されているだけで、詳細の処理ルーチンをいちいち説明されているわけではありません。
従ってプログラムをある程度理解できるレベルでないと何も役に立たないということになります。
詳細には、サイトからサンプルをダウンロードして動かしながら理解していくことが必要でしょう。
![IMG_0341.jpg](https://qiita-image-store.s3.amazonaws.com/0/60473/b4e72ed5-a39c-9303-3ee2-6ec6d41b0c37.jpeg "IMG_0341.jpg")
Engine Yard Cloud の Custom Recipes を設定ファイルから作成するようにする


## 概要

![](https://camo.githubusercontent.com/50f5f087f02959841d5d2cf0ee78f1b059455e7c/68747470733a2f2f692e6779617a6f2e636f6d2f62306138653235316462613362643335656466346133633363323638373662322e706e67) 

Engine Yard Cloudには、Chefにて、デフォルトの環境をカスタマイズする機能があります。
ただ、Berkshelfのような、Bundlerのような仕組みがありません。

元のリポジトリを追うのも、面倒です。

そこで、設定ファイルから、Cookbooksを作成し、自身のattributes(変数）を適応するためのコマンドラインツールを作っていました。

https://github.com/ukitazume/ey-berks


## ey-berks の紹介

仕組みは、設定ファイル(EyBerksfile, TOML形式)を元に、Git repositoryから、各recipesを集めます。
その後、Attributesを適応します。



Attirubtesはすでにあるものを集めて、適応することも可能です。


## コマンド一覧


```
$ ey-berks help
Engine Yard Cloud cookbook tool like Berkshelf

Usage:
    ey-berks config <path>                                               : make a sample configuration file (default path=$PWD, --config=EyBerks)
    ey-berks compile <path> --config=<path to EyBerks>                   : update cahce,  write a main/recipes and gather recipe to the cookbooks directory
    ey-berks update-cache                                                : update cache of remote repositories cookbooks
    ey-berks create-main-recipe <path>                                   : create main recipes from the configration file
    ey-berks copy-recipes <path>                                         : copy recipes from the cache dir to the cookbooks/ directory
    ey-berks clear <path>                                                : remove EyBerksfile and cookbooks directory
    ey-berks gather-attr <path> --from=</path/cookbooks>                 : gather attbiutes from cookbook directory
    ey-berks apply-attr <path> ---from=<attributes directory>            : apply attbiutes for cookbook directory
    ey-berks help                                                        : show this help
    ey-berks version                                                     : show the version
```


### 使い方

コンフィグファイルを生成します。

```
$ey-berks config .
$ls
EyBerkfile
````

コンフィルファイルに自分の必要な、Recipeを追加します。

```
[library]
repo = "engineyard/ey-cloud-recipes"
path = "cookbooks/main/libraries"
name = "main/libraries"

[definition]
repo = "engineyard/ey-cloud-recipes"
path = "cookbooks/main/definitions"
name = "main/definitions"

[[cookbook]]
repo = "engineyard/ey-cloud-recipes"
path = "cookbooks/env_vars"

[[cookbook]]
host = "bitbucket.org"
repo = "engineyard/ey-cloud-recipes"
path = "cookbooks/cutom_nginx"

[[cookbook]]
repo =  "youraccount/cookbooks"
path = "cookbooks/sidekiq"
```

CookBooks Directoryを作成します

```
$ey compile .
$ls
EyBerkfile cookbooks/
```


もともと、Cookbookを持っている場合は、attributesを収集します。

```
$ey recipes download -e your_enviornment_name
$ey-berks gather-attr . --from=/path/to/original/cookbooks
$ls
EyBerkfile cookbooks/ attr-meta/
```

ey-berksで作った、Cookbooksに収集してきたattirbutesを適応します。

```
$ ey-berks apply-attr . --from=./attr-meta
```


後はいつものように、cookbooksをuploadして、適応します。

```
$ey recipes upload -e your_environment_name
$ey recipes apply -e your_environment_name
```

https://github.com/ukitazume/ey-berks
tmux で Prefix key が押されているかどうかを表示する

tmux でペイン分割とかウィンドウ作成するときとかにキーバインドとして使う Prefix key (`C-b` とか `C-t` とか設定されてる) ですが、誤動作を防ぐためにいま Prefix key が押されているのかどうなのか視覚的に確認したいことがあります。

以下のように `.tmux.conf` を書くことで、Prefix key が押された時に Status line の色を下動画のように反転させられます。

```
set-option -g status-left '#[fg=cyan,bg=#303030]#{?client_prefix,#[reverse],} #H[#S] #[default]'
```

![prefix-key.gif](https://qiita-image-store.s3.amazonaws.com/0/17508/1475301a-2211-f581-2d20-391ea8b808f5.gif)

(Prefix key は `C-t` に設定)

重要なのはこれ

```
#{?client_prefix,#[reverse],}
```

`.tmux.conf` では `?<condition>,<true action>,<false action>` の形で三項演算子をかけます。で、`client_prefix` は Prefix key が押されていたら `1 (true)` になるというわけです。
今回は色を変えただけですが、押されている / いないときだけ何かしら文字を表示することももちろん可能です。

注意点があって、例えば Prefix key が押された時だけ黄色背景黒文字 (`fg=black, bg=yellow`) にしようとして

```
#{?client_prefix,#[fg=black,bg=yellow],}
```

と愚直に書くと

![prefix-key-bug.gif](https://qiita-image-store.s3.amazonaws.com/0/17508/ac551256-372a-48c6-0798-0b198f1c9c9f.gif)

のように表示がバグります。`#[fg=black,bg=yellow]` 内のコンマが三項演算子2つめのコンマと解釈されているようです。

こうしたいときは、`#[]` を分割すればよいです。

```
#{?client_prefix,#[fg=black]#[bg=yellow],}
```

![prefix-key-great.gif](https://qiita-image-store.s3.amazonaws.com/0/17508/db764b92-14bc-4a06-93d5-c21d30ec4d1a.gif)

## REF
- [give a hint when press prefix key in tmux - Stack Overflow](http://stackoverflow.com/questions/12003726/give-a-hint-when-press-prefix-key-in-tmux)
- [OpenBSD manual pages (tmux)](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux&sec=1)
タスクランナーをbatファイルから立ち上げ、処理終了しても出力画面を残す


## batファイルの作成
start.batとかでbatファイルを作成し、以下を記述

```
cd /d %~dp0
gulp
```

これだけだと処理を終了すると出力画面が閉じてしまう。

```
cd /d %~dp0
cmd /k gulp
```

`cmd /k`をコマンドの前に挟むと処理を終了しても出力画面を残す事ができる。


>```/K <command>```
>`<command>` で指定した内容を実行します。実行をした後、「このコマンドを実行したcmd.exe」は終了せず、引き続きプロンプトを表示します。Windows上でバッチ ファイルのショートカットを作成する際、cmd.exe /K を使用すると「バッチ ファイルの実行」→「コマンド プロンプト」を連続で行えます。これは、特定の環境(常駐プログラムや環境変数など)でコマンド プロンプトを表示させたい時に便利です。
>[DOSコマンド一覧 | Programming Field](http://pf-j.sakura.ne.jp/program/dos/doscmd/cmd.htm)
プログラミング言語 Ruby 本質とは？？


##オブジェクトとは

```
Rubyは完全なオブジェクト指向言語であり、全ての値は単純な数値リテラルやtrue(真)、false(偽)、nil(nilは値がない事を示す特殊値、Ruby版のnull)、文字列、正規表現、入手力、データベースへの接続、そしてクラス、メソッド、コードブロックすらもオブジェクトとして扱います。
```

##オブジェクトとはつまり何奴？

```
アイデンティティ/内部状態を持ったデータの集まり
```

##オブジェクトの性質とは

```
・アイデンティティを持つ
Rubyではすべてのオブジェクトは何らかのクラスに属していて、そして、オブジェクトは自分自身の所属クラスを知っています。そうする事で自分とそうでないものを区別します。

・メッセージを受け取る
Rubyではオブジェクトはメソッドからメッセージをを受け取る「レシーバ」です。そしてオブジェクトはメッセージを受け取ると対応するメソッドを実行し処理を行います。
このメソッドがオブジェクトにメッセージを送る事を「メソッド呼び出し」と表現します。

メソッド呼び出しの例

object.method() => オブジェクト.メソッド(仮引数)


・内部状態を持つ
オブジェクトは0個以上の内部状態を持ちます。例えば文字列なら長さを内部状態として持ちます。そして内部状態はメソッドの実行によって変化します。
```

##型推論

```
Type Inference => 型推論とは型を省略しても、例えば"ABC"からString型だと推論してくれる機能
動的な言語である為可能であり、型を明示的に記述しなくても良い為コードが短くて済む。
```

##ブロックとイテレータとは

```

イテレータ:iterators イテレータは配列や配列に類似するデータ構造の各要素に対する繰り返し処理を抽象化したメソッド
ブロック:blocks do~end or {~} 中かっこで囲まれた引数をなるためのカタマリをブロックと呼ぶ

コード例
3.times { print "Ruby! " } #=> "Ruby! Ruby! Ruby!"と出力
1.upto(9) {|x| print x }   #=> "123456789"と出力
```

##ハッシュとは

```

ハッシュオブジェクトとは、任意のキーオブジェクトを値オブジェクトに付属(マッピング)する

h = {       #数の名前を数値にマッピングするハッシュ　　　
  :one => 1 #"矢印"はマッピングを示す: Key => value
  :two => 2 #コロンはシンボルリテラル(シンボルを表す記法)を示す
}

h[:one]     #=> 1 キーによって値にアクセス
h[:three] = 3 #ハッシュに新しいキー/値のペアを追加
h.each do |key, value|       #eachメソッドによってキー/値のペアを繰り返し処理
  print "#{value}:#{key}; "  #式展開によって変数を文字列に置き換える
end                         #"1:one; 2:two; 3:three;"と表示
```


##式と演算子とは

```
Rubyの構文は式を重視したものであり、ifなどの制御構造はRubyでは「式」である。そしてRubyの式は通常「値と演算子」から組み立てられる。その為ifなどの制御構造は下記のように単純化できる。

nunimum = if x < y then x else y end

演算子の例

1 + 2 = 3 #加算
1 * 2 = 2 #乗算
1 + 2 == 3 # true; ==は等値かどうかをテストする
2 ** 1024  # 2の1024乗
"Ruby" + "rocks!" #文字連結
"Ruby! " * 3 #文字列の反復
max = x > y ? x : y #条件演算子
```

##メソッドとは

```
メソッドは、defキーワードで定義される。
メソッドの戻り値は、メソッドの本体の中で最後に評価された式の値になる。
メソッドの引数には、デフォルト値を指定できる

def square(x) #一個の引数xを取るsquareというメソッドを定義
  x*x 　　　　　#自乗されたxの値が返される　　　
end           # メソッドの末尾
```

##記号のサフィックス プレフィックス

```
サフィックス/接尾辞
メソッドの末尾のつけられる記号

プレフィックス/接頭辞
変数の先頭名につけられる記号
インスタンス変数 @apple 
クラス変数      @@apple

何が嬉しいの？？
変数のスコープが簡単にわかる => 嬉しい。
```

##スコープとは

```
プログラム中で変数名などのシンボルが参照可能な有効範囲の事
```
Percona xtrabackupでmroongaをバックアップ・リストア


# 背景

MySQL用groongaプラグイン「mroonga」を使っていると、色々厄介な問題に直面する。たとえば、そのままのPercona xtrabackupではデータベースの保存ができない。

本稿は、xtrabackupをmroongaに対応させた時の記録。


# インストール

[こちらの神様](https://github.com/wadap/innobackupex-mroonga-patch)がmroonga対応パッチを書いてくださっているが、随分前のバージョンなので困ったなぁと思っていた。
探してみると、[こちらの仏様](http://journal.teamgedoh.net/index.t.html/i/2727)がXtrabackupの2.2.11用を提供してくださっている。ありがたや。

2015/10/01現在では、決して2.2.11は最新ではないが、古いというわけでもない。今回は楽しよう。

※ 自分で最新化する場合は、`sub backup_files`の中の`closedir(DIR);`の前で、mroongaを対象とする記載を入れていけば良いようだ。

## xtrabackupのインストール

というわけで、xtrabackupを **2.2.11** でインストールする。

パッケージは[ここ](https://www.percona.com/downloads/XtraBackup/LATEST/)からバージョン指定で入手してインストールする。

```bash
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.11/binary/redhat/6/x86_64/percona-xtrabackup-2.2.11-1.el6.x86_64.rpm
$ rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm
```

## patch適用

続いて、mroonga patchを手に入れ、`innobackupex`に適用する。
下記手順でパッチは、(感謝しながら) wgetでホームディレクトリにダウンロードしている。

```bash
$ wget http://www.teamgedoh.net/warehouse/innobackupex-mroonga.patch
```

それでは、適用してみよう。

```bash
$ cd /usr/bin/
$ ls -l innobackupex
-rwxr-xr-x 1 root root 187056 May 25 23:02 innobackupex
$ patch -p1 innobackupex < ~/innobackupex-mroonga.patch
# 以下のように出力される
patching file innobackupex
```

以上で準備OK。

# 実行

xtrabackupのラッパーツールinnobackupexを使用してバックアップを取得する。
参考: http://buta9999.hatenablog.jp/entry/20131120/1384972041

## バックアップ

### 手順

細かい指定がなくても、自動的に`my.cnf`から設定をデータディレクトリの場所を読み込んでくれる。便利。

```bash
$ nohup innobackupex --user=root  /var/tmp/test/ > /tmp/nohup.log &
```

この手順で、`/var/tmp/test`以下に`YYYY-mm-dd_HH-MM-SS`という名前でディレクトリが作成され、バックアップが取得される。

### 実験結果

**約15GBのデータ量で5分** ほどで取得が完了した。


## リストア

### 手順

このバックアップされたファイルをそのまま`/var/lib/mysql`などのデータディレクトリに配置しても良いようだが、コマンドでリストアする例を記載する。

まずログの適用をする。最後にcompleted OKとなることを確認する。

```bash
$ innobackupex --user=root --apply-log /var/tmp/test/2015-09-29_14-20-02/
### 略
150929 14:50:34  innobackupex: completed OK!
```

リストアを実行する。
以下のコマンドで **自動的に元のフォルダの位置にリストア** してくれる。

```bash
$ innobackupex --copy-back /var/tmp/test/2015-09-29_14-20-02
```

### 実験結果

先ほどの15GBほどのデータが **3分ほどで完了！**

### 追加手順

innodbのlog_file系のパラメータがバックアップ/リストア時点で異なる場合は、MySQL起動前にib_logfile*を削除する。
また、 **ファイルの権限が変わっている可能性が高い** ので、以下のようなコマンドで権限を戻しておこう。

```bash
$ chown -R mysql:mysql /var/lib/mysql
```

全て準備出来たらmysqldサービスを起動すればリストア完了。


# 補足

Slaveを複製する用途で使用するときは[オフィシャルドキュメント](https://www.percona.com/doc/percona-xtrabackup/2.2/howtos/setting_up_replication.html)に詳しく書かれている。
デザインの引き算から見る自社サービスのUXの確認

さっき企画の人から聞いたのだけれど、自社Webサービスのホーム画面から、どの要素を消しても大丈夫か？
大丈夫ではない要素を消すと何が壊れるか、という実験をしたらすごく面白かったと。

これを消すとどのUXが壊れるか？を考えるのはとてもいいと思った。まる
レシピをランダムで出すBookmarklet

# はじめに

何も考えずにレシピだけ降臨してくれると楽ですね（？）
ということで今回のコードです

# コード

```js:レシピ
javascript:(function(){url='http://cookpad.com/recipe/'+Math.floor(Math.random()*2170000);open(url,'targetname','height=500,width=500');})();
```

```js:健康レシピ
javascript:(function(){url='https://kenko.cookpad.com/recipes/'+('000'+Math.floor(Math.random()*5744)).slice(-4);open(url,'targetname','height=500,width=500');})();
```

# おわりに

Cookpad にランダムで飛んでるだけですありがとうございました
BOOL を NSLog するときの Format はないらしく３項演算子を使うとすっきり書ける

NSLog で BOOL 値を表示したいときフォーマットに書けるならいいんですができません。
そこで自分で YES or NO を出力してあげる必要があります。
何も考えずに書くとこうなりますが、

```objc
if (boolValue) {
  NSLog(@"YES");
} else {
  NSLog(@"NO");
}
```

複数行書くくらいなら

```objc
NSLog(@"%@", boolValue ? @"YES" : @"NO");
```

のほうがすっきりするよね！
独自で作ってもいいかも、

```objc
// 定義
MKLog(BOOL boolValue) {
  NSLog(@"%@", boolValue ? @"YES" : @"NO");
};

// 使用
MKLog(boolValue);
```
InputSequenceのショートカットが効かない場合（Sublime Text3）


入れてはみたものの、Windows環境でデフォルトショートカットが動作せず、[InputSequence GitHub](https://github.com/kazu1107/InputSequence)のトラブルシューティングでも解決せず。
調べた所ST2の解決策しかなかったので、ST3用の解決方法を書いておきます。


## 導入
package controllには追加されておらず、検索しても出てこないので[InputSequence GitHub](https://github.com/kazu1107/InputSequence)の手順に沿ってインストール。
>Package Control から Add Repository を実行。
ウィンドウ下部にリポジトリパスの入力エリアが出現するので、下記を入力。
>https://github.com/kazu1107/InputSequence.git
>次に Install Package を実行し、InputSequence をインストール。

## ショートカットが効かない場合
`Preferences > Key Bindings - User > Default.sublime-keymap`に以下を追記
`{ "keys": ["任意のショートカット"], "command": "input_sequence"}`
Go言語のflagパッケージより便利というoptargを使ってみる

Go言語にはCLIを作るときに便利なコマンドラインオプションパーサの[flag](https://golang.org/pkg/flag/)パッケージがありますが、サブコマンドを使えない等の制約があったので[optarg](https://github.com/jteeuwen/go-pkg-optarg)ならできるという噂を聞きつけ、使ってみました。

https://github.com/jteeuwen/go-pkg-optarg

早速使ってみます。

``` main.go
package main

import (
	"fmt"
	"github.com/jteeuwen/go-pkg-optarg"
)

func main() {
	//コマンドに必要なフラグを定義
	optarg.Add("s", "source", "この引数は大事です", "")

	//値を保持する変数
	var src string

	//引数をパースします
	for opt := range optarg.Parse() {
		switch opt.ShortName {
		case "s":
			src = opt.String()
		}
	}
	fmt.Printf("sourceに指定された文字列は %s \n\n", src)
}
```

これを実行してみます。

```
$ go run main.go -s hoge
sourceに指定された文字列は hoge

$ go run main.go --source hoge
sourceに指定された文字列は hoge

$ go run main.go --sourc hoge
Unknown option '--sourc' specified.
Usage: go run main.go [options]:
 --source, -s: この引数は大事です
```

このようにオプションフラグが認識され、存在しない場合はUsageが表示されます。

オプションフラグがついてない引数に関しては`optarg.Parse()`を実行した後に`optarg.Remainder`というsliceで取得することができます。

``` main.go
package main

import (
	"fmt"
	"github.com/jteeuwen/go-pkg-optarg"
)

func main() {
	//コマンドに必要なフラグを定義
	optarg.Header("サブコマンド cmdA")
	optarg.Add("s", "source", "cmdAに使用するオプション", "")
	optarg.Header("サブコマンド cmdB")
	optarg.Add("P", "port", "cmdBに使用するオプション", 80)

	//引数をパースします
	ch := optarg.Parse()
	<- ch

	if len(optarg.Remainder) == 1 {
		cmd := optarg.Remainder[0]
		switch cmd {
		case "cmdA":
			cmdA()
		case "cmdB":
			cmdB()
		}
	} else {
		optarg.Usage()
	}
}

func cmdA() {
	var src string
	//引数をパースします
	for opt := range optarg.Parse() {
		switch opt.ShortName {
		case "s":
			src = opt.String()
		}
	}
	fmt.Printf("cmdAのsourceに指定された文字列は %s \n\n", src)
}

func cmdB() {
	var port int
	//引数をパースします
	for opt := range optarg.Parse() {
		switch opt.ShortName {
		case "P":
			port = opt.Int()
		}
	}
	fmt.Printf("cmdBのportに指定された文字列は %d \n\n", port)
}
``` 

これを実行すると

```
$ go run main.go cmdA --source hoge
cmdAのsourceに指定された文字列は hoge

$ go run main.go cmdB --port 90
cmdBのportに指定された文字列は 90

$ go run main.go
Usage: main.go [options]:

[サブコマンド cmdA]
 --source, -s: cmdAに使用するオプション

[サブコマンド cmdB]
   --port, -P: cmdBに使用するオプション (defaults to: 80)
```

このようにサブコマンド毎に挙動を分けることも簡単にできました。
またHelpも綺麗に表示することができて便利ですね。

また今回は試してないですが`-abc`等と複数のオプションフラグを繋げることも可能なようです。
詳しくは公式のREADMEを読んでみてください。

なかなかよいパッケージな気がしますね！
スマホアプリの嫌な感じ


## 資金力がモノを言う
### この一連の流れが嫌だ
特にゲームではゲームの出来や内容は関係ない。
人をどれだけ集めるかが問題であり、そして射幸心や人間の嫌なところをくすぐり継続される感じ。

無料でユーザーを獲得
↓
広告を打つ（有名サイトに広告記事を書かせる。テレビCMでxxx万人突破とか。）
アプリランキングを上げる

__ここが全て、ここで何もかもが決まる__

↓
アプリ内広告で収入を得る
アイテム課金で収入を得る
オプション課金で収入を得る
↓
サービスは適当に長く
サポートは適当にそれなりに
↓
みなさん飽きる
忘れる
↓
新サービス発表
↓
無料でユーザーを獲得
↓
・・・・・・

この流れができるのは膨大な資金力がなければできない。
この流れも実は日本と海外ではちょっと違っていて、海外の場合はゲームの出来が違う。
ちゃんとしたゲームになっている。
apkの署名の書き換え方法

## とりあえずスクリプト

```bash
#!/bin/sh
set -x

apk_path=$1
store_path=$2
store_pass=$3
alias_name=$4
alias_pass=$5

# 署名を削除
zip -d $apk_path 'META-INF*'

# 再署名
jarsigner -verbose \
  -keystore $store_path \
  -storepass $store_pass \
  $apk_path \
  $alias_name \
  -keypass $alias_pass \
  -sigalg SHA1withRSA -digestalg SHA1
```

## いつ使うん？

apkをデバッグビルドするとデバッグ用の **debug.keystore** でビルドされるようになっています。デバッグビルドした上で正規のkeystoreを使ってテストしたい場合（課金機能のテスト等）に使ってます。
備忘録_HTTPヘッダー

#HTTP

##HTTPメッセージ

###HTTPリクエストメッセージ
 ```
 GET /test HTTP/1.1
 HOST: test.jp
 ```

リクエストメッセージの構成は
*リクエストライン
*ヘッダ(メタデータが入る)
*ボディ

 1行目のことをリクエストラインと呼ぶ。

  GET → HTTPメソッド
  /test → リクエストURI
  HTTP/1.1 → プロトコルバージョン

 2行目はHOSTヘッダ。
　※これは絶対URIを使用すると省略可


###HTTPレスポンスメッセージ
 ```
 HTTP/1.1 200 OK
 Content-Type: application/xhtml+xml; charset=utf-8

 <html>
　・・・
 </html>
 ```

レスポンスメッセージの構成は
*ステータスライン
*ヘッダ(メタデータが入る)
*空行
*ボディ

 1行目のことをステータスラインと呼ぶ。

  HTTP/1.1 → プロトコルバージョン
  200 → ステータスコード
  OK → テキストフレーズ



###HTTPメソッド
####大切なCRUD(クラッド)

*GET(取得)
*POST(作成・追加)
*PUT(更新・作成)
*DELETE(削除)

###ヘッダーフィールド

下記参照
http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/header-fields.html
[FuelPHP]意外にハマる！viewmodelを使用した場合のHTMLタグのエスケープ方法

##はじめに

FuelPHPは便利なものでHTMLタグを自動でエスケープしれくれます。
ただ、エスケープしてほしくない場合もありますよね。
（じゃないと、viewで使用するPHP（HTML）の中がPHPのコードだらけになったりする。）

で、いろいろググッて調べたんですが、viewmodelを使用した場合のエスケープの情報がなかなかなくてハマったので、備忘録的に残しておきます。


##viewmodelを使用しない場合

```php:
$this->template->content = View::forge('hoge/index',$hoge,false);
```

##viewmodelを使用する場合

```php:
$this->template->content = View_Hoge::forge('hoge/index')->set('hoge',$params['hoge'],false);
```

##完全に理解出来てないことあり・・
下記のようにset()に値を渡す場合

```php:
$this->template->content = View_Hoge::forge('admin/update')
		->set('hoge',array('hoge' => $hoge),false);

// ->set('なんの名前？',array('なんの名前？' => $hoge),false);
```

っていう疑問点があります。
view側へ渡ったときの変数名というのはわかるのですが、第二引数がなんで配列なのか等わかってないです・・。

誰か詳しい人教えてください・・。
squeelあれこれ

記述力が高いのは魅力的なんだけど書き方悩んだクエリが結構あるのでご紹介。

### between
```ruby
Model.where { date >> (time..time + 1.day) }
```

Rangeの..と...は区別される。
以下のクエリもRangeに合うように範囲を切ってくれる。イカす。


```ruby
Model.where { date >> (time...time + 1.day) }
```

### IN句
これもRangeで表すこともできる。

```ruby
Model.where { date.in(time...time + 1.day) }
```

### RDBの関数
そのまま書くか、バッククォートで呼べる。

```ruby
Model.select { to_char(created_at, 'YYYY-MM-DD').as(created_date) }
```

### 変数とカラム名が被った

RDBの関数と同じく、バッククォートで解決できる。
squeelのクエリはrubyの式として評価されているのでカラム名と同じ名前の引数は使えない。

```ruby
# この書き方はエラー
def get_model_data(user_id)
  Model.select { user_id == user_id }
end
=> RuntimeError: unsupported: TrueClass
```

そこでバッククォートですよ奥さん。

```ruby
def get_model_data(user_id)
  Model.select { `user_id` == user_id }
end
```


### 複雑なSELECT
よくあるselectで*を求めつつ別個加工したカラムを持つ、ってパターン

```ruby
Model.select { [`*`, cast(created_at.as date).as(created_date)] }
```

### Whereの接続
&&で繋げると何故か一番最後の式しか評価してくれない

```ruby
#これは間違い
Model.where { user_id == nil && created_at >= Time.now }
```

それもそのはず、ANDに相応する記号が違うのです。ちなみにカッコは必須。

```ruby
Model.where { (user_id == nil) & (created_at >= Time.now) }
```
ipaのバンドルIDとプロビジョニングプロファイル(署名)の書き換え方法

## まずはスクリプト

```bash
#!/bin/sh

set -x

input=$1
bundle_identifier=$2
provision=$3
codesign="$4"
entitlements=$5
output=`basename ${input%.*}`.ipa
workdir=${output%.*}.payload
rootdir=$(cd `dirname $0` && pwd -P)

rm -rf $workdir
mkdir $workdir

case "$input" in
*\.ipa)
	# ipaを解凍
	cp $input $workdir
	(cd $workdir && unzip -q $output)
	rm $workdir/$output
	;;
*\.app)
	mkdir $workdir/Payload
	cp -r $input $workdir/Payload
	;;
*)
	exit 1
	;;
esac

app=`ls -d $workdir/Payload/*.app`

# 署名を削除
rm -r $app/_CodeSignature
# プロビジョニングプロファイルを上書き
cp $provision $app/embedded.mobileprovision
# プロビジョニングプロファイルに合わせたバンドルIDに変更
plutil -replace CFBundleIdentifier -string $bundle_identifier $app/Info.plist
# 再署名
codesign --force --sign "$codesign" --entitlements $entitlements --timestamp=none $app
# ipaにパッキング
(cd $workdir && zip -qr $output Payload)
```

## entitlements とは

entitlementsファイルはアプリに対する機能の設定であり、下記のフォーマットをベースに **Capabilities** の設定が追記される。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>application-identifier</key>
	<string>$(TEAM_ID).$(BUNDLE_IDENTIFIER)</string>
	<key>com.apple.developer.team-identifier</key>
	<string>$(TEAM_ID)</string>
	<key>keychain-access-groups</key>
	<array>
		<string>$(TEAM_ID).$(BUNDLE_IDENTIFIER)</string>
	</array>
</dict>
</plist>
```

書き換えに利用したいプロビジョニングプロファイルとバンドルIDでプロジェクトを **xcodebuild** でビルドすると、最後のほうで下記のような出力を得られるので、この **\*.app.xcent** を利用するのが楽。

```shell-session
/usr/bin/codesign --force --sign XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --entitlements /Users/takezoh/testapp/build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/shared.app.xcent --timestamp=none /Users/takezoh/testapp/build/Release-iphoneos/shared.app
```

## いつ使うん？

iOSはプロビジョニングプロファイルにより、インストールできるデバイスに制限があるので、貰ったipaを検証するときや、再配布する際に使ってます。
Macで5分でFuel PHPを動作させるまで

# はじめに
最近Fuel PHPにさわっています。

Docker使ったりVagrant使ったり、色々と環境構築の方法はありますが、今回はPHPのビルトインサーバーを使った環境構築です。

* メリット
 * とりあえず手っ取り早く動かしたい方にオススメです。

* デメリット
 * あまり込み入った事は難しいかもしれません。

# 手順
## 1 Fuel PHPのダウンロード

http://www.fuelphp.com/
からダウンロード。

2015/10時点では1.7.3が配布されています。

## 2 ダウンロードしたFuel PHPの展開

今回は
/Users/user_name/fuelphp/
に展開する事にします。

## 3 Asia/Tokyo timezoneの設定
/Users/user_name/fuelphp/fuel/app/config/config.php
にtimezone設定を行います。


ファイルを見たところ

```
return array(
```
の中であれば動くはずですが、念のためtimezoneでファイル内検索したら以下のような設定がコメントアウト状態でありました。

```
// 'default_timezone'   => null,
```

なので、今回はこの設定の下に書く事にします。
このように記述

```
// 'default_timezone'   => null,
'default_timezone'   => 'Asia/Tokyo',
```

## 4 PHPビルトインサーバーの起動

ターミナルでFuelPHPのアプリケーションルートディレクトリに移動

```
cd /Users/user_name/fuelphp/public
```

ビルトインサーバーを以下のコマンドで起動します。

```
php -S localhost:8000
```

今回ポート8000番で起動していますが、これは変更可能です。
ビルトインサーバーの詳細についてはこちらで確認してください。
http://php.net/manual/ja/features.commandline.webserver.php

## 5 動作確認

http://localhost:8000/
にアクセスして、以下のような画面になっていればOKです。

![fuel.png](https://qiita-image-store.s3.amazonaws.com/0/65968/1a30c257-721f-f4cb-2b9f-30abaacab817.png)

# おわりに
まだまだ何が出来るか分からないですが色々さわってみようと思います。
[Rails] ActiveSupport::Concern の存在理由

Railsにおいて共通した処理を切り出すために [ActiveSupport::Concern] (http://api.rubyonrails.org/classes/ActiveSupport/Concern.html) がよく使われています。

しかし、Rubyには元から **mix-in** という処理を切り出す機能があります。
では、`ActiveSupport::Concern` の存在理由は何でしょうか。

## mix-inの複雑な記述を省略できる

Rubyの mix-in は通常以下のようなルールで記述します

- 切り出した機能を `module` として作成
- 共通メソッドを `module` 内に記述
- **クラスメソッドや組み込み先クラスの内部処理を `module` に入れたい場合は特殊なメソッドを使う必要がある**

`ActiveSupport::Concern` はこの3番目にある **特殊なメソッド** の記述を簡単にしてくれます。

具体的にConcernあり/なし の例を見てみましょう。
（具体例コードは [ActiveSupport::Concernの公式解説](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html)より抜粋）

### Concernなし

```rb
module M
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      scope :disabled, -> { where(disabled: true) }
    end
  end

  module ClassMethods
    ...
  end
end
```

### Concernあり

```rb
require 'active_support/concern'

module M
  extend ActiveSupport::Concern

  included do
    scope :disabled, -> { where(disabled: true) }
  end

  class_methods do
    ...
  end
end
```

`def self.included(base) ... ` といった複雑な記述が省略されています。

※なぜこのような記述が必要なのかは少し複雑なのでここでは解説しません。
詳しくは [難しいが強力！ Rubyのメタプログラミング、self、特異クラス／メソッド、オープンクラスとモンキーパッチ](http://www.atmarkit.co.jp/ait/articles/1501/06/news028.html) などのページを読むとわかります。

## 複雑な依存関係を考えずにすむ

`ActiveSupport::Concern` のもう1つの存在理由です。

mix-in するモジュールが他のモジュールに依存する場合、mix-in される側では両方のモジュールをincludeする必要があります。

例えば、`Foo` モジュールを必要とする `Bar` モジュールを `Host` に mix-in したい場合は

```rb
class Host
  include Foo # Barのために先にFooをincludeしないといけない
  include Bar
end
```

しかし、`Host` が欲しいのは `Bar` であって、わざわざ依存する `Foo` まで考えて先に `include` するのは面倒です。

そこで `ActiveSupport::Concern` ではその面倒な記述を省略できます。

### Concernありの場合

```rb
require 'active_support/concern'

module Foo
  extend ActiveSupport::Concern
  ...
end

module Bar
  extend ActiveSupport::Concern
  include Foo
  ...
end

class Host
  include Bar # Barだけをincludeしても動く！
end
```
PHP-Macのターミナル上でエラーログを表示

▪️使用しているアプリ
Mac MAMP PRO Terminal　Apacheサーバー

![ターミナル上でエラーログ表示方法.png](https://qiita-image-store.s3.amazonaws.com/0/95187/9af83a37-a9e5-8056-baf0-67f1bdbaaf9f.png)

▪️ターミナルを起動
Marimo-no-MacBook-Air:/ marimo$ cd Applications
Marimo-no-MacBook-Air:Applications marimo$ cd MAMP
Marimo-no-MacBook-Air:MAMP marimo$ cd logs
Marimo-no-MacBook-Air:logs marimo$ tail -f php_error.log

▪️コマンドの解説
tail ファイルの末尾を表示する
-f ファイルの内容を常に監視し、表示を更新する
Ansible インストールメモ

# インストール
※pythonがインストールされていること
 インストールされていない場合は、以下のコマンドでインストールしておく。
 `yum install python3`

* Ansbileインストール
`sudo pip install ansible`

# 設定
## 設定先サーバーの登録
* Ansibleのhostsファイルにサーバーのホスト名を登録
　※"/etc/hosts"ではないことに注意
`vi ~/hosts`
>[servers]
>target

* 環境変数にAnsibleのhostsファイルを設定
`export ANSIBLE_HOSTS=~/hosts`
※~/.bash_profileに上記内容を記述しておけば、起動時に自動的に設定される。

## playbookの作成
* Ansibleはplaybookに構成内容を記述する
`vi ./xxxxx[任意].yml （ここではtarget.ymlとする）`

>- hosts: servers
>  tasks:
>    - name: httpd install.
>      yum: name=httpd state=installed
>    - name: httpd is running and enable
>      service: name=httpd state=running enabled=yes

## playbookの構文チェック
`ansible-playbook ./target.yml -i hosts --syntax-check`

# 実行
## playbook実行
`ansible-playbook ./target.yml -i hosts --list-tasks`
Windowsな人の為の Google Cloud Platform 超入門

LAMP?なにそれ明るいの？Webサーバって言ったらIISでしょ？
という Windows Native な方向けの Google Cloud Platform でWindows サーバインスタンスを立てるまでの超入門です。
Amazon Web ServicesやWindows Azureと並んで今やGoogle Cloud Platform でもWindowsの仮想マシンを立てることができます。AzureもLinuxインスタンスを立てられるようになってますので、TOP 3 クラウドの差異がますます少なくなってきています。

# Google Cloud Platform の準備
Google Cloud Platformのアカウントをまだ持っていなければ、 

https://cloud.google.com

から「今すぐ試す」ボタンをクリックしてアカウントを作成してください。登録にはメールアドレスとクレジットカードが必須となりますが、新規作成アカウントには60日間使える$300分のクーポンが付いてきますので安心です。

登録が済んだら次のような画面が出てきたと思います。
右上に$300 60日無料と表示されていて安心ですね。右の「アカウントをアップグレード」をクリックすると課金が始まりますので注意。無料試用アカウントのままなら、60日期限が来ても勝手に課金されることはありません。
![スクリーンショット 2015-10-07 13.34.54.png](https://qiita-image-store.s3.amazonaws.com/0/12857/51fbbad6-cea3-913d-463f-41b876a321b0.png)

# プロジェクトの作成
サインアップが終わったら、「プロジェクトの作成」ボタンをクリックしてプロジェクトを作成してください。Google Cloud Platform ではすべて「プロジェクト」という単位で管理され、プロジェクトの下に、仮想マシンインスタンス、クラウドストレージ、Gitプライベートリポジトリ、その他リソースがぶら下がります。
![スクリーンショット 2015-10-07 13.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/12857/0d917dd8-c68d-b5e6-e84c-63e430235f45.png)

プロジェクト名から生成されるプロジェクトIDはWorldWideでユニークなIDとなります。hogeとかfugaとかfoobarは既に誰かがとっているでしょう。プロジェクト名に使える文字は英数字、引用符、ハイフン、スペース、感嘆符、スペースはハイフンに変換されてプロジェクトIDとなります。

# VMの作成

プロジェクトの作成が完了したら、左側ペイン

コンピュート→Compute Engine→VM インスタンス を選択。次の画面で「インスタンスを作成」をクリックしてください。

![スクリーンショット 2015-10-07 13.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/12857/23ffe070-e4c4-14b5-e68d-9b0dfe6aeaf6.png)

インスタンス情報の入力画面では、「ブートディスク」の「変更」をクリックし、
![スクリーンショット 2015-10-07 13.39.27.png](https://qiita-image-store.s3.amazonaws.com/0/12857/e713a0e8-ceec-b3e3-1172-89a8346f8865.png)

ブートディスクイメージ一覧から Windows Server 2012 R2 Datacenter Edition を選んで下さい。

VMが立ち上がるまで5分ほどかかります。
Linuxのインスタンスなら　1分もかからないのですが、Windowsインスタンスの場合は立ち上げ時にsysprepを動かしている為にどうしても時間がかかるようです。

# VM への接続

VMが立ち上がったら、VM一覧の右縦三点リーダーをクリック、「Windows パスワードを作成またはリセット」を選択してRDPログイン用管理者アカウントを用意します。

![スクリーンショット 2015-10-07 14.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/12857/90017e59-64e0-6141-7755-260d97e28589.png)

AWSではキーペアを指定し、自動生成されたパスワードの取得となりますが、Google Cloud Platformでは新規アカウントの作成（または既存アカウントのパスワードリセット）となります。

アカウントを作ったら、後はRDPファイルをダウンロードするなりしていつものリモートデスクトップでいろいろ設定してください。ChromeのRDPプラグインを入れておくと、ワンクリックでRDP接続ができて便利です。

# 最後に

Google Cloud PlatformのWindowsインスタンスは、他のオープンソース系Linuxに比べて割高な単位時間利用料が設定されています。これはAWS同様、Windowsのライセンスが単位時間利用料に含まれている為で、ユーザーはWindowsのライセンスについて気を回す必要がありません。

また、Google 側でWindowsマシンイメージを毎月Windows Updateをあてたものに差し替える、というメンテナンスも行っています。

Windowsインスタンスドキュメント
https://cloud.google.com/compute/docs/instances/windows
gitでコミットしたファイルの一覧を取得



```
$ git log -1 --name-only
```


NodeJSで最新のコミットログから、コミットしたファイルの一覧を取得する

```CoffeeScript:CoffeeScript
exec = require 'exec'

exec 'git log -1 --name-only', (obj, log)->
  lines = log.split('\n')
  commit = lines.shift().replace(/^commit /, '')
  author = lines.shift().replace(/^Author:\s+/, '')
  date = lines.shift().replace(/^Date:\s+/, '')
  lines.shift()

  files = []
  while true
    file = lines.pop()
    if file
      files.unshift(file)
    else 
      break

  comment = lines.join('\n')
  comment = comment.replace(/^\s{4}/g, '')

  item =
    commit: commit
    author: author
    date: new Date(date)
    files: files
    comment: comment

  console.log JSON.stringify(item, null, '  ')
```
備忘録_URI

#URI

##URIの構文(1)

　http://test.abc.jp/test/index.html
　※ダミー

　上記のURIを分割すると下記のようになる。
　 
   http → URIスキーム
   test.sbc.jp → ホスト名
   /test/index.html → パス

ホスト名とパスの組み合わせにより一意のものになる。


##URIの構文(2)

　http://tarou:pass@test.sbc.jp:8080/search?q=test&debug=true#5
　※ダミー

　上記のURIを分割すると下記のようになる。
　 
   http → URIスキーム
   tarou:pass → ユーザー情報(ユーザー名とpassは:で区切る)
   test.sbc.jp → ホスト名
   8080 → ポート番号
   /search → パス
   q=test&debug=true → クエリパラメータ(クエリが複数あるときは&で連結)
    ※クエリパラメータはクライアントから動的にURIを生成したときに利用
     →検索サービスなど
   #5 → URIフラグメント
    ※そのURIが示すリソースの細かい部分の特定に使用(idが5の所のような)


##エンコード

  URIには日本語は使用不可。
　日本語などのASC2以外を使用する場合は%エンコーディングという方式を使用。
備忘録_git

#gitコマンド
##push
 1.git add ファイル名 / ステージングエリアに移動
　※git status でファイルのパスを探すことも可能
 2.git commit -m "変更メッセージ" / コミットの実行
　※git log で履歴の追加の確認
 3.git push リモート名 ブランチ名 / プッシュの実行
　※デフォルトはgit push origin master

##pull
 1.git pull origin master / プルの実行

##branch
 1.git checkout -b ブランチ名 / -bをつけることでブランチの作成とcheckoutを同時に行う
 2.git push origin ブランチ名 / リモートにブランチの作成を伝える

###随時追加予定

設定
git config —global user.name “aaaa”
git config —global user.email “test@gmail.com”

↑は必須。名前とメールを設定する必要があるらしい

便利な設定
git config —global color.ui true

設定を見たい時
git config -l

ヘルプを表示
git config —help

最初の手順

mkdir test　→　testディレクトリの作成
cd test　　  →　testディレクトリに移動
git init　　　→　マジで最初にやること(指定したディレクトリでgitを使用するよという宣言  )

git addでステージングに移動。
git commitでリポジトリにあげる。

git log　で　log　を確認できる。

############################
commit @@@@@@@@@@@@@@@@→コミットIDみたいなやつ
Author →commitした人
Date　→　commitした日時

コミットメッセージが表示される
############################

オプション

git log —oneline　→　コミットIDとメッセのみ見れる

git log -p　→　具体的に変更になったところを見ることができる

git log —stat　→　どのファイルが何箇所変わったかを確認できる

git status　→　現在の状況を確認できる(わからなくなったこれ)

##############################
Changes not staged for commit　→　ステージングもコミットもされていないよ。
git add　もしくは　git checkoutでやり直してと書かれている

	modified →　変更されているよ

##############################

間違いだった時

git checkout — ファイル名　→　先ほどの変更の取り消し

差分の確認

git diff →　差分の確認ができる※今さっき変更してステージングエリアにあげていないものにしか使用できない

ステージングエリアにあげた後に差分を確認するには↓

git diff —cached →　ステージングにあげたファイルの差分の確認

git addの便利使い方

git add .　今のディレクトリよりしたのもの全てをaddしなさいという命令

ステージングやコミットした後にファイルを消す方法

git rm ファイル名　→　削除もしくは移動をさせる
※これしないとgitがファイルがどこに行ったかわからず不具合になる可能性が有る


git管理から外す方法★あとで調べる

vim .gitignore →　作業ファイルを作成する

→この中に『*.log』(拡張子が.logのファイルを管理から外す)
→.gitignoreはステージングに行くが指定したファイルは管理されない
↑と同い階層と下の階層に効果がある

直前のコミットを変更したいとき

git commit —amend　→　:wq 直前のコミットを変更できる(コミットが増えない)

過去に戻ることができる
git log　→　git reset —hard HEAD（直前のコミットに戻れる）

git reset —hard HEAD^　直前のものをHEADという　直前よりも前に戻れる

git rest —hard コミットID(最低前から7桁)　でも問題無い

git reset —hard ORIG_HEAD　基本的にコミットは保存されている
※これ調べる必要あり

ブランチの利用

git branch　→　今あるブランチを確認できる

git branch hoge　→　hogeブランチを作成
※今いるブランチには*が付いている

切り替えはチェックアウトでー

ブランチをマスターにあわせる。

1.ブランチをmasterに移動
2.git merge (マージさせたいブランチ名)

ブランチの削除

git branch -d (削除したいブランチ名)

branchを作成してチェックアウトも同時にする

git checkout -b 新規brranch名

コンフリクトの解決

コンフリクトを修正する。
↓
修正した後にgit add .
↓
git commit -m “メッセージ”

タグを使ってみよう！！！！！！！！

コミットのIDにわかりやすい名前をつけることができる


#####################
直前のコミットにつけたい時
git tag つけたいタグ名

git show つけたタグ名

#####################
前のコミットにタグをつけたい時

git tag つける commitIDをつける

つけたタグを消したい時
git tag -d 消したいタグ名

エイリアスのつけ方

git config — global alias.co checkout

git config —global alias.st status

↑のコマンドのエイリアス設定の確認

git config -


コミットとアドを同時にする場合
git commit -am “メッセージ"
jadeでattributeに変数の値を使う方法


jadeでattributeに変数の値を使いたい時に結構つまったので、解決方法をメモしておきます。

例えばこういうDOMを実現したい場合

```html
<div data-test0="test0">test0</div>
<div data-test1="test1">test1</div>
<div data-test2="test2">test2</div>
...
```

せっかくjadeなので、for文使いたい。。。

何も考えずに書くと以下の様になるかと思います。

```jade
- for (var i = 0; i < 3; i++) {
  div(
    data-test#{i}="test#{i}"
  ) test#{i}
- }
```

でも、このやり方だと、コンパイル後以下のようになります。

```html
<div data-test#{i}="test0">test0</div>
<div data-test#{i}="test1">test1</div>
<div data-test#{i}="test2">test2</div>
```

ご覧のように`data-test#{i}`が展開されていません！orz...
（attributeの値やdivの中身は展開されています。）

attributeに変数使えないんじゃないかと思ったのですが、
安心してください。やり方があったんです！

## &attributes
http://jade-lang.com/reference/attributes/
ここに書いてある`&attributes`を使えば実現できます。
`&attributes`にオブジェクト渡すことで、そのオブジェクトをattributeとして展開することができます。

```jade
- for (var i = 0; i < 3; i++) {
  - p = {} // attribute用オブジェクトを生成
  - key = 'data-test' + i　// key名がattributeになる
  - p[key] = 'test' + i // valueをset
  div&attributes(p) test#{i}
- }
```

実行結果

```html
<div data-test0="test">test</div>
<div data-test1="test">test</div>
<div data-test2="test">test</div>
```

こんな感じで一度オブジェクトに代入してから&attributes()で実行することで、実現できます。
とっても簡単！

困ってたので、実現できてよかったです！
レイヤー管理には便利なsassのindex関数が便利 

横からでてくるパララックス?とか横スクロールメニューとか、
Webで「ちょっと」インタラクティブな表現をしようとすると、お世話になる「z-index」プロパティ。

「ちょっと」で済めばよいが、レイヤーが増えれば増えるほど、その度に管理してるレイヤーの「z-index」プロパティを値を一個一個書き換える必要がでてきて、結構大変。

この辺りのレイヤー管理をsassのindex関数使うと、うんと楽になるので、ご紹介。

## sass の「Lists」

sassには「Lists」という配列みたいなデータ型があります。
このListsの宣言は、こんな感じ

```css:scss
$list:item3, item2, item1;
```
これだけだと、イマイチ使いドコロが分かりづらいのですね。
実はこれ、sassに備わってるindex関数と組み合わせると結構便利なことができちゃうのです！

## sass のindex関数
index関数は、その名のとおり、「Lists」内のindexを返してくれる関数です。

ex)

sassのindex関数で
```css:scss
$list:item3, item2, item1;
index($list, item1)
```
とやると、$listの中に「item1」が何番目にいるかを返してくれます。
この例だと、「3」が帰ってきます。

##「Lists」x index関数

1 レイヤー管理したい要素に任意の名前をつけて(クラス名と一緒にすると分かりやすいかも)、Listsを作ります。
```css:scss
$list:item3, item2, item1;
```
2 次に、各要素のz-indexプロパティをindex関数で定義します。
```css:scss
$list:item3, item2, item1;

.item1 {
  ...
  z-index: index($list, item1);
}
.item2 {
  ...
  z-index: index($list, item2);
}
.item3 {
  ...
  z-index: index($list, item3);
}
```
これをcssにするとこうなります。

```css:scss
.item1 {
  ...
  z-index: 3;
}
.item2 {
  ...
  z-index: 2;
}
.item3 {
  ...
  z-index: 1;
}
```

こうすれば、レイヤーが増えても、各要素のz-indexプロパティを変えることなく、$list内にレイヤーを追加するだけでokなので便利です

[デモ](http://codepen.io/9ooky/pen/ZGMdEP/)
c++ builder XE4, 10.2 Tokyo > form > TPanelの色をコードで変更 > ParentBackGround = falseにする必要あり

```txt:動作確認
C++ Builder XE4 on Windows 7 pro (32bit)
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

TPanelの色を変更しようとしたが変更できなかった。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Panel1->Color = clBlack;
}
```

[SO](http://stackoverflow.com/questions/3778161/delphi-2009-create-a-tpanel-at-runtime-and-change-its-color)

> When you want to have colored panels under a themed OS you have to set ParentBackground to False.

ParentBackgroundをfalseにすると、上記のコードで色を変更できた。
node-ftpでputするときのエラー処理で困った話

# node-ftpのインストール
これがないと始まらない
[node-ftp](https://github.com/mscdex/node-ftp)
``` npm install ftp```

※使用バージョン

* node-ftp : 0.3.10
* node : 0.12.7

# 問題のコード
```
let ftp = new require('ftp')() ;
// -- 中略 --
ftp.put('input/path/file.txt','dstpath.txt',function(err){}) ;
```
これで'input/path/file.txt'が

 * 存在する場合
  + リモート側にふつーに'dstpath.txt'ファイルが作成される。
 * 存在しない場合
  + リモート側に中身が'input/path/file.txt'の'dstpath.txt'ファイルが作成される。

node-ftpの[Readme][nodeftpReadme]に
> put(< mixed >input, < string >destPath, [< boolean >useCompression, ]< function >callback)
> -- 中略 --
> input can be a ReadableStream, a Buffer, or a path to a local file.

こう書いてあるからstringに対応するpathが存在しなかったらエラーにして欲しいのだが…
# なんでこうなるか？
node-ftpのconnection.jsの中身のぞいてみると、
第一引数(input)がstringのとき、statでファイルの存在を確認して

 * 存在する場合
   + ファイルのReadStream作成
 * 存在しない場合
   + stringそのまま送信



# どうするか？

1. とりあえずReadableStreamにして渡してみる  
``` if( typeof input == 'string' ) input=fs.createReadStream(input) ;```  
  ファイルが存在しなくても、この時点ではエラーが出ない。  
  読み込み時（ftp.put()の中）で例外が発生して  
```throw er; // Unhandled 'error' event```  
  これが出てprocess終了。  
  どうやらエラーハンドリングしてくれていないらしい…
1. putの前にinputのReadableStreamの'error'イベントのハンドリングを追加  
```input.on('error',function(err){/* エラー処理 */});```  
```ftp.put('input/path/file.txt','dstpath.txt',function(err){}) ;```  
  エラー処理は出来るようになったけど、ftp.logout()で~~終了しない~~。  
  ６分ほどたってから **正常** 終了した。
1. 終了処理は[Readme][nodeftpReadme]のサンプルではend()で終わる様にかいてるから、それに従う。

# 結果
実際にはPromiseでくるんだりして、ゴニョゴニョしてるんだけど、だいたいこんな流れ。

```
let input = 'input/path/file.txt' ;
let ftp = new require('ftp')() ;
ftp.on('ready',function(){
    if( typeof input == 'string' ) { // 文字のときはReadableStreamに置き換え
        input=fs.createReadStream(input) ;
        input.on('error',function(err){
            // ファイル読み込みのエラー処理
        }) ;
    }
    ftp.put(input,'dstpath.txt',function(err){
//      ftp.logout(function(err){}) ; // end()に変更
        ftp.end() ;
    }) ;
}) ;
ftp.connect(/* {FTPパラメータ} */);
```


[nodeftpReadme]:https://github.com/mscdex/node-ftp/blob/master/README.md
Vagrant で NFS マウント関連のエラーが出たときのメモ

こういうのが出る時の対応。
（NFSで接続してた環境をもとに `vagrant package` して作ったBOXを使うと起きがち→事前にやってあれば大丈夫と思われる）

```zsh
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mount -o 'vers=3,udp' 192.168.44.1:'/Users/xxx/yyy/vagrant' /vagrant

Stdout from the command:

Stderr from the command:

mount.nfs: access denied by server while mounting 192.168.33.10:/Users/xxx/yyy/vagrant
```

一旦、Vagrant にアクセスして、以下を実行。

```zsh:Mac
vagrant ssh
```

```zsh:Vagrant
sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
exit
```

`/etc/exports` から、当該部分を削除。

```zsh:Mac
sudo vi /etc/exports
```

こんなのを削除する

```zsh:/etc/exports
# VAGRANT-BEGIN: 501 xxxxxxxxx-1234-yyyy-zzzz-11111111
"/Users/xxx/yyy/vagrant" 192.168.44.10 -alldirs -mapall=501:20
# VAGRANT-END: 501 xxxxxxxxx-1234-yyyy-zzzz-11111111
```

Vagrant を再起動。

```zsh:Mac
vagrant reload
```

**追記**

チェックする（何も表示されなければOK）

```zsh:Mac
sudo nfsd checkexports
```

ダメな場合編集

```zsh:Mac
sudo vi /etc/exports
```

再起動する

```zsh:Mac
sudo nfsd stop
sudo nfsd start
```

**追記2**

共有フォルダに日本語が使われているときにエラーが出る場合がある様子

**追記3**

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

1. 慌てず、 `vagrant ssh` する
2. `sudo /etc/init.d/vboxadd setup`

ここでさらにエラーが出る場合→[Vagrantのmountエラーを解決しようとしたらvboxのリビルドがこける](http://qiita.com/wakaba260/items/b5c87b7815b710f303a0)
Symfony2の便利なコンソールコマンド一覧（順次更新予定）

## 前置き
別記事でSymfony2関連の記事を書いていたのですが、
書くべきことがあり過ぎて内容が肥大化しいつまで経っても公開できないので、
一部は内容を分割して投下したいと思います^^;

## 実行環境
* Symfony2.7.5

バージョン違いで廃止されたり移行していたりするコマンドがありますので
その点を念頭に置いてご覧ください。

## Symfony2の便利なコンソールコマンド一覧
Symfony2では様々な機能の開発や設定等確認の際に役立つ
便利なコマンド機能を実装しています。以下に一覧をまとめます。
コマンドの実行はSymfony2のルートディレクトリで行います（あたりまえかw）。

### 設定確認系
**router:debug**コマンド
→アプリケーション内に設定されたすべてのルートを一覧で出力

ルートの追加とカスタマイズをする時に、このコマンド実行結果によってルートを視覚化し、
それに関する詳細な情報を取得・参照しておくと便利です。

```bash:コマンド実行結果
$ php app/console router:debug
The use of "router:debug" command is deprecated since version 2.7 and will be removed in 3.0. Use the "debug:router" instead.
[router] Current routes
 Name                             Method   Scheme Host Path                              
 _wdt                             ANY      ANY    ANY  /_wdt/{token}                     
 _profiler_home                   ANY      ANY    ANY  /_profiler/                       
 _profiler_search                 ANY      ANY    ANY  /_profiler/search                 
 _profiler_search_bar             ANY      ANY    ANY  /_profiler/search_bar             
 _profiler_purge                  ANY      ANY    ANY  /_profiler/purge                  
 _profiler_info                   ANY      ANY    ANY  /_profiler/info/{about}           
 _profiler_phpinfo                ANY      ANY    ANY  /_profiler/phpinfo                
 _profiler_search_results         ANY      ANY    ANY  /_profiler/{token}/search/results 
 _profiler                        ANY      ANY    ANY  /_profiler/{token}                
 _profiler_router                 ANY      ANY    ANY  /_profiler/{token}/router         
 _profiler_exception              ANY      ANY    ANY  /_profiler/{token}/exception      
 _profiler_exception_css          ANY      ANY    ANY  /_profiler/{token}/exception.css  
 _configurator_home               ANY      ANY    ANY  /_configurator/                   
 _configurator_step               ANY      ANY    ANY  /_configurator/step/{index}       
 _configurator_final              ANY      ANY    ANY  /_configurator/final              
 _twig_error_test                 ANY      ANY    ANY  /_error/{code}.{_format}          
 AppBundle_homepage               GET      ANY    ANY  /                                 
 AppBundle_sidebar                GET      ANY    ANY  /                                 
 AppBundle_about                  GET      ANY    ANY  /about                            
 AppBundle_contact                GET|POST ANY    ANY  /contact                          
 AppBundle_blog_show              GET      ANY    ANY  /{id}/{slug}                      
 AppBundle_comment_create POST     ANY    ANY  /comment/{blog_id}                

 homepage                         ANY      ANY    ANY  /  
```
...なんかつっこまれちゃってます（笑）。
このコマンドは今回の実行環境であるver_2.7では廃止され
「debug:router」というコマンドに代わっているようです。

利用されるバージョンによって適宜コマンドを使い分けましょう。

## まとめ
今回は時間の関係上、取り急ぎこれだけです（笑）。
順次更新してまいりますのでお許しくださいm(_ _)m
意外と知られていない？EventTriggerとChangePropertyActionの組み合わせ

##概要
XAMLを独自にインタラクティブにしようと思うとInteraction.Triggersの利用は避けて通れません。
EventTriggerを使って、特定のイベントが発生したときに、要素のプロパティを変更しようとして検索をすると、不思議な事に何故かChangePropertyActionに中々辿りつけません。
プロパティを変更したいだけなのに、Storyboardを使用する方法ばかりがヒットします。
ChangePropertyActionは、Blend SDKとして配布されているのが関係しているのかも知れません。
ただ、Blend SDKを忌避する理由も見当たらないので、備忘録として残します。

##サンプル

```
<Window
　　xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
　　xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
　　xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
　　xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
　　x:Class="Sample.MainWindow" x:Name="root"
　　Height="350" Width="525">

    <i:Interaction.Triggers>
　　　　<i:EventTrigger EventName="MouseLeftButtonDown">
　　　　　<ei:ChangePropertyAction 
                      TargetName="root" 
　　　　　　　　　　　　 PropertyName="Background"
　　　　　　　　　　　　 Value="Red">
　　　　　　</ei:ChangePropertyAction>
　　　　　</i:EventTrigger>
    </i:Interaction.Triggers>
</Window>
```
koaでファイルアップロードをやる時に"Error: request entity too large"

# 症状

koaで構築したサーバーにファイルをアップロードしたら、koaが以下のようなエラーを吐いた。

```
Error: request entity too large
```

丁度画像をアップロードする機能を作っていたので、ある意味想定内。

# 調査
調べてみると、express関連のStack Overflowからヒントを得られる。

[Node JS - Express Request entity too large](http://stackoverflow.com/questions/19917401/node-js-express-request-entity-too-large)

> I had the same error recently, and all the solutions I've found did not work.
> After some digging, I found that setting app.use(express.bodyParser({limit: '50mb'})); did set the limit correctly.

bodyParserで設定するrequest bodyの上限値に引っかかっている模様。

今回koaで作っているプロジェクトでは、[koajs/bodyparser](https://github.com/koajs/bodyparser)を使っているので、以下２つのoptionで設定可能。

> **formLimit**: limit of the urlencoded body. If the body ends up being larger than this limit, a 413 error code is returned. Default is 56kb
> **jsonLimit**: limit of the json body. Default is 1mb

# 対応

JSON bodyの上限値は1mbもあれば十分な気がするが、formLimitは画像などの大物を許容するには少ない。そのため、以下のように修正。

```
app.use(bodyParser({
  formLimit: '512kb'
}));
```

以上でエラーは起きなくなった。

koaは多くの点でexpressと互換しているので、トラブルが起きた際も解放がすぐ見つけやすい。
c++ Builder XE4, 10.2 Tokyo > form > フォームの大きさをコードで拡大する > this->ScaleBy(120,100);

```txt:動作確認
C++ Buider XE4
  - Windows 7pro (32bit)
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
  - Windows 10 pro (64bit)
```

フォームの大きさを拡大したい。
解像度が異なるPCへの対応のため。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	this->ScaleBy(120, 100);
}
```

ヘルプによると以下の定義となっている。
`void __fastcall ScaleBy(int M, int D);`

> コントロールを元のサイズの 75% に縮小する場合は，M パラメータを 75，D パラメータを 100 に指定します。どのような値の組み合わせであっても，比率が同一なら効果は同じになります。したがって，M = 3 と D = 4 の組み合わせでも元のサイズの 75% が得られます。 

比率だけ合わせたらいいので、自分の用途としては片方を100としている。

参考
http://mrxray.on.coocan.jp/Delphi/plSamples/020_DisplayResolution.htm
pgrep/pkillを使おう

# 前提
OS X (El capitan)

# `pgrep`

よく起動中のプロセスを検索したくて

```sh
$ ps aux | grep foo
```

とかやっちゃうのですが、これをやると、

```
$ ps aux | grep vagrant
uraura          1916   0.0  0.0  2464336   3328 s001  S+    8:51AM   0:02.69 ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i /Users/uraura/.ssh/private_key
uraura          1915   0.0  0.0 145164392   1452 s001  S+    8:51AM   0:00.04 vagrant ssh
uraura          8225   0.0  0.0  2434836    640 s002  R+   11:54AM   0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn vagrant
```

とかいう感じで、目的のものも見れるけど、余分な`grep`のプロセスまで載ってきたりするんですね。
`grep`にエイリアスが設定されてるともう目もあてられない感じ。

```sh
$ ps aux | grep vagrant | grep -v grep
```

なんてちょっとイケてないしメンドいですね。というわけで

```sh:プロセスID、プロセス名と引数全部を取得
$ pgrep -fl vagrant

1915 vagrant ssh
1916 ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i /Users/uraura/.ssh/private_key
```
で、だいたい`ps〜grep〜`相当のものが取れます。

また、

```sh:起動時の引数まで全部を対象に検索して、プロセスIDだけ取得
$ pgrep -f vagrant

1915
1916
```
であればプロセスIDだけ取得できるので、プロセスを対象に何かしたい場合は使えるかもしれません。

# `pkill`

`pgrep`と`pkill`はセットになっていて、ほぼ同じオプションが使えます。
なので、`pgrep`で対象のプロセスを確認し`pkill`でぶっ殺す、という使い方になると思います。

```sh
# 確認
$ pgrep -f vagrant
# 始末
$ pkill -f vagrant

# シグナルを指定
$ pkill -SIGKILL -f vagrant
```

# おまけ
[CentOS 7にしたらpgrepコマンドの仕様が変わっていた - Qiita](http://qiita.com/bwtakacy/items/238be9cb99cb4ca9d725) 細かいオプションはOS等により変わるようなのでmanを読みましょう。
コンソールでGoogle Bigqueryを扱いたい！(select編)

# 概要
[Google Bigquery](https://cloud.google.com/bigquery/?hl=ja)をコンソール上から扱う時の手順についてまとめる

ちなみに、下記のような時に恩恵が得られる

 * 純粋にブラウザ開くのがめんどくさい時

# 環境
 - Mac OS X 10.10.5

# セットアップ
参考：
 * [Big Queryの使い方を10分で試してみる](http://qiita.com/komeiy/items/4fbdac5cadb9d417b2a19)
 * [BigQuery console api “Cannot start a job without a project id”](http://stackoverflow.com/questions/13913694/bigquery-console-api-cannot-start-a-job-without-a-project-id)
### CLIのセットアップ

```
# curl https://sdk.cloud.google.com | bash
```
とりあえず、流れに身を任せてYを連打もあり。

### Googleアカウントにログイン
```
# gcloud config set account *******@gmail.com

# gcloud auth login
Go to the following link in your browser:
```
いい感じに承認する。

### 初期化する
```
# bq init
```
プロジェクト一覧が出るので選ぶ。


# 実行する
### まずは試しに
```
bq query "select * from [dataset_name.table_name] limit 10"
```

### ファイル書いてその中のsql文を実行したい
```test.sql
select
    *
from
    [dataset_name.table_name]
limit 10
```

```
# --flagfile test.sql
```


### フォーマット指定して、ファイル出力したい

```
# GLOBIGNORE=* && echo `cat test.sql` | bq query --format csv > test.csv && unset GLOBIGNORE
```
ワイルドカード(*)は、展開されてしまうので、GLOBIGNOREで一旦無視。
参考：[glob(グロブ)について](http://qiita.com/ingktds/items/b28792c559d774b76a87)

なお、フォーマットは下記の通り
```
--format: <none|json|prettyjson|csv|sparse|pretty>
```

 * pretty: formatted table output
 * sparse: simpler table output
 * prettyjson: easy-to-read JSON format
 * json: maximally compact JSON
 * csv: csv format with header



### tsvにしたい
現状、tsv出力には対応していないっぽい。
ので、下記のコマンドでtsvに変換してやる

```
# sed -i -E "s/,/    /g" <ファイル名>
```


# 免責・その他
 * この記事執筆時点の情報であること
 * そもそも正しくない事もある
 * 補足情報があればよろしくお願いしますm(_ _)m
 * 大量のデータを取得する際に、途中で切れます。どうすればいいのでしょうか。。。
[メモ]KJ法の作り方

# 手順
* カードを作って
* グループ編成して
* 図解化
* 叙述化

wikiのこれだとわからないな(小並感)

# ミクロとマクロ
全体を俯瞰している視点
特定のコンテクストにおける視点
は別物。

グループ化の時に大分類と小分類を分ける

# カードの分け方
## ユーザーの分け方
ユーザーには属性がある(ex.金持ち、中流、貧乏)
概ね各種資源の多寡と欲求の方向性によって分類できると思う。
エリートサラリーマンは時間がなく金がある。貧乏学生は時間があり金がない。

## コンテクスト
ユーザーはなにかをしたいときにサービスを使う。
その状況では特定のコンテクストが発生し、その中で魅力やストレスが発生する。
特定のコンテクストを共有しない人間には同様の魅力やストレスは発生しない場合もある。

## 魅力やストレスの分け方
魅力やストレスは摩擦と呼ぶ(俺はそう呼ぶ)
属性を共有する人間にとっては発生するが、共有しない人間にとっては発生しないなら属性依存の摩擦
コンテクストを共有する人間にとっては発生するが、コンテクストしない人間にとっては発生しないならコンテクスト依存の摩擦

その摩擦はなに依存のものか？のマッピングが大事。
属性はタテ、コンテクストはヨコだとマッピングしやすい。


# コツ
## カードの枚数を絞れ
３桁とか制御不能になる。
どこまで絞るかがポイントだし、出されるカードを絞るには設問が大事。
よい回答にはよい質問が必要。どんな結論が欲しい？

## わけるな、つなげ
最終的にグループ化が大小でひとかたまりになっているのが望ましい

## カードには簡潔な事実を書き、体験を具体的にイメージする
書いた簡潔な事実だけに振り回されたり、カードにグダグダかいてなにかわからなくなると分類できない

# 参考URL
なぜKJ法は失敗する？
http://gitanez.seesaa.net/article/124077022.html
run_dialog,dialog_applauncherの入手方法について

「pepperプログラミング　基本動作からアプリの企画・演出まで」のP115にInterractiveアクティビティを作成する際にrun_dialog,dialog_applauncherがpepperに必要と記載されていますが、手元のpeperにインストールされていません。
run_dialog,dialog_applauncherの入手方法について教えていただけないでしょうか。