OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity] InActive（非表示）なオブジェクトをエディタスクリプトから操作する


今開発中のもので、デバッグ用のカメラとOculus向けのカメラを交互にオン／オフしてデバッグしていました。
が、意外とこれがめんどくさい。なんとかスクリプトでできないかなーと思っていたところ、Editor Scriptの`MenuItem`を使って達成できそうだということでやってみました。

## サンプルコード

なにはともあれコードを。

```cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

public static class CameraToglle {

	private static string oculusCameraName = "LeapOVRCameraRig";
	private static string clientCameraName = "debugCamera";

	[MenuItem("Tools/CameraToggle")]
	private static void Menu() {
		GameObject oculusCamera = null;
		GameObject debugCamera  = null;
		
		// シーンファイルの拡張子
		string unityExtension = ".unity";
		
		// リソースからすべてのオブジェクトを取得し、その中から該当オブジェクトを探す
		foreach(GameObject obj in Resources.FindObjectsOfTypeAll(typeof(GameObject))) {
			if (obj.name == oculusCameraName) {
				string path = AssetDatabase.GetAssetOrScenePath(obj);
				string ext  = Path.GetExtension(path);
				if (ext == unityExtension) {
					oculusCamera = obj;
				}
			}
			else if (obj.name == clientCameraName) {
				string path = AssetDatabase.GetAssetOrScenePath(obj);
				string ext  = Path.GetExtension(path);
				if (ext == unityExtension) {
					clientCamera = obj;
				}
			}
		}

		// Activeをトグルする
		bool isOculusActive = oculusCamera.activeSelf;
		oculusCamera.SetActive(!isOculusActive);
		clientCamera.SetActive(isOculusActive);
	}
}
```

ちょっとトグルするだけなのにだいぶ冗長な感じです。
が、一度`inactive`にしてしまうと`GameObject.Find`メソッドで検知できなくなってしまいます。
なのでこんな周りくどいことをやっているんですね。


## なにをやっているか

`Resources.FindObjectsOfTypeAll()`を使ってUnityが認識しているリソース全体から該当オブジェクトを探しています。
微妙に分岐が入ってるのは、シーン内のオブジェクトに限らずAssetsディレクトリに配置されているファイルも検索対象だからです。

今回の場合は特に、 **Prefab化したものもマッチして2回検知されてしまう** ためそれを分岐して処理している、というわけです。

`AssetDatabase.GetAssetOrScenePath`から返る文字列は「Assetsディレクトリのどこにあるか」が返されます。
ただしシーン内に配置されているオブジェクトの場合は`****.unity`ファイル内ということになり、そのパスが返されます。
なので`.unity`にマッチしているかを確認しているわけです。

### 余談

ちなみに最初、シンプルな確認用プロジェクトを作って試したところいっこうに`path`に値が入らず「？？？」でした。
が、シーンを保存しておらず、Assetsディレクトリ配下にないために空文字が返されていた、というちょっとマヌケな理由でした。

普通のプロジェクトであればシーンが保存されていないことはまずないと思うのでそういう問題は起きないと思います。


閑話休題。

さて、上記の処理でinacitveな該当オブジェクトを見つけることができるので、あとは普通にスクリプトを書くのと同じように処理を書いてやればOKです。
今回の例ではふたつのオブジェクトの`active`をトグルして入れ替える、というものです。

細かい処理ですが頻繁に切り替えながら開発する場合は意外に重宝します。
PlayFramework 2.3でactivator run時にgulpを起動する

PlayFramework2.3でactivator runしたときにgulpも起動する方法です。

元ネタは[Play Framework で開発用Webサーバと同時に grunt/gulp を起動する - はこべブログ ♨](http://hakobe932.hatenablog.com/entry/2014/04/02/220457)ですが、こちらの記事の方法では、Playの2.3から`play.Project.playScalaSettings`が無くなったので、うまく動きませんでした。

いろいろ調べてみたら、build.sbtで`import play.PlayImport.PlayKeys.playRunHooks`したら動きました。


```scala:build.sbt
name := """new-ui"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  ws,
  "jp.t2v" %% "play2-auth"      % "0.13.2",
  "jp.t2v" %% "play2-auth-test" % "0.13.2" % "test"
)

import play.PlayImport.PlayKeys.playRunHooks

playRunHooks += RunSubProcess("gulp watch")
```

project/RunSubProcess.scalaを作っておきます。

```scala:project/RunSubProcess.scala
import sbt._

import play.PlayRunHook

object RunSubProcess {
  def apply(command: String): PlayRunHook = {

    object RunSubProcessHook extends PlayRunHook {

      var process: Option[Process] = None

      override def beforeStarted(): Unit = {
        process = Some(Process(command).run)
      }

      override def afterStopped(): Unit = {
        process.map(p => p.destroy())
        process = None
      }
    }

    RunSubProcessHook
  }
}
```
真偽値を保持する変数（フラグ）の命名時に気をつけていること

ページ内のある要素の「状態」を管理する際に、真偽値（true or false）を値にとる変数を定義し、フラグとして利用する場合があります。

~~~javascript:JavaScript
// ある要素が「開いている状態かどうか」を管理する変数（初期値をtrueとして定義）
let isOpen = true;

if (isOpen) {
	// ある要素が「開いている状態」の時のみ実行したい処理
}

// ある要素を「開いていない状態」にするための関数
function closeObject() {
	// 何らかの処理

	isOpen = false; // 「開いていない状態」に切り替え
}
~~~

上記の例では、"isOpen" という変数は実質的に2つの状態（「開いている」と「閉じている」）を管理していることになります。

このような、**相反する2つの状態**を管理する変数（フラグ）を定義する場合は、
その変数名として

- より**「正」**の意味をもつ
- より**「肯定的」**な意味を持つ
- より**「ポジティブ」**な意味を持つ

ほうの語句を利用すると、コードの可読性が上がると感じます。

具体例

- 「開いている」と「閉じている」の場合：　◯ isOpen　× isClosed
- 「見えている」と「隠れている」の場合：　◯ isVisible　× isHidden
- 「利用できる」と「利用できない」の場合：　◯ isEnabled　× isDisabled

これらの変数が、if文の条件式として論理否定演算子（!）と共に使われるパターンを見てみましょう。

~~~javascript:JavaScript

if (!isOpen) { // 「開いていない」場合
}

if (!isClosed) { // 「閉じていない」場合？
}

if (!isVisible) { // 「見えていない」場合
}

if (!isHidden) { // 「隠れていない」場合？
}

if (!isEnabled) { // 「利用できない」場合
}

if (!isDisabled) { // 「利用できなくない」場合？
}

~~~

「closed」「hidden」「disabled」のような負の方向性をもつ語句を変数名とした場合、if文の条件式が**「否定の否定」**という状況となるため、コードを読解する際の脳内変換作業が1ステップ増えている感覚があります。

以上の理由から、何か特別な意図がない場合を除き、**「正」「肯定的」「ポジティブ」**な意味をもつ語句を変数名にすることにしています。
cocos2d-x勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在12回）

#予定分
* [2015/6/18【#TechBuzz】6/18 第13回cocos2d-x勉強会【テーマ:retain/releaseって何？〜参照カウンタの仕組みとオーナーシップの考え方〜/cocos2d-xのバグをみつけたら〜下手な英語でも伝われば直してくれるぜ！やったね！〜】](https://atnd.org/events/65466)

#過去分

* [2015/5/21【#TechBuzz】5/21 第12回cocos2d-x勉強会【テーマ:Cocos2d-xでノベルゲームを作ってみる/Cocos2d-xのクラッシュ分析サービス/プリミティブ描画を使いこなしてみる】](https://atnd.org/events/64421)
ansibleでec2インスタンス上にjenkinsを動かしてawsebcliも使えるようにした


```
- name: install python 2.7
  yum: name=python27-devel

- name: use python 2.7
  shell: ln -sf /usr/bin/python27 /usr/bin/python

- name: install pip
  shell: easy_install-2.7 pip

- name: install openjdk
  yum: name=java-1.7.0-openjdk

- name: get jenkins
  shell: wget http://pkg.jenkins-ci.org/redhat/jenkins-1.614-1.1.noarch.rpm -O jenkins.rpm && rpm -ivh jenkins.rpm
  args:
    creates: jenkins.rpm

- name: run jenkins
  shell: service jenkins restart

- name: create directory for aws credential file
  file: path=/var/lib/jenkins/.aws state=directory owner=jenkins group=jenkins mode=0755

- name: copy aws credential file to remote server
  copy: src=credentials dest=/var/lib/jenkins/.aws/credentials mode=0755

- name: copy aws config file to remote server
  copy: src=config dest=/var/lib/jenkins/.aws/config mode=0755

- name: install eb for jenkins
  shell: /usr/local/bin/pip install --upgrade awsebcli
```

新しめのamazon linuxはpython2.7が最初から動くようなので、最初の３つぐらいはいらないかもしれません。

credentials及びconfigファイルは、ansibleのしかるべき場所(roles/hoge/files)に置いてあります。
Swift勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在8回）

#予定分
* [2015/7/22【#techbuzz】7/22 第9回Swift勉強会【テーマ：調整中！】	](https://atnd.org/events/65469)

#過去分

* [2015/5/25【#techbuzz】5/25 第8回Swift勉強会【SwiftのPromiseライブラリを試してみた / はじめてのiOSアプリ開発　Swift対応版】](https://atnd.org/events/64422)
HTML5+JS 勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在13回）

#予定分	
* [2015/7/30【#techbuzz】7/30 第15回 HTML5+JS 勉強会【テーマ：調整中！】](https://atnd.org/events/66218)

* [2015/6/17【#techbuzz】6/17 第14回 HTML5+JS 勉強会【テーマ：Webの品質管理～ソフトウェア品質管理を超えて DevOps体制移行の重要性 / 10年に及ぶUXの定量調査手法】](https://atnd.org/events/65465)

#過去分

* [2015/5/20【#techbuzz】5/20 第13回 HTML5+JS 勉強会【テーマ：JavaScriptで開発するのって大変だよね / NewsPicksにおける可視化】](https://atnd.org/events/64416)
超初心者向けUnityハンズオン勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在8回）

#予定分
* [2015/6/16【#TechBuzz】6/16 第9回 超初心者向けUnityハンズオン勉強会【テーマ：ワンコインで 気軽にはじめる3D VR開発】](https://atnd.org/events/65464)

#過去分

* [2015/5/22【#TechBuzz】5/19 第8回 超初心者向けUnityハンズオン勉強会【テーマ：Live2D for Unityを導入してみよう！（仮）】](https://atnd.org/events/64407)
アプリマーケティング勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在11回）

#予定分
* [2015/7/28 【#TechBuzz】7/28 第13回 アプリマーケティング勉強会【テーマ：新興国ゲーム市場・産業の機会とリスク②産業編】](https://atnd.org/events/65471)

* [2015/5/29【#TechBuzz】5/29 第12回 アプリマーケティング勉強会【テーマ：アジア・中東・南米・アフリカにおけるアプリマーケティング/『意外にしらないスマートフォンアプリ「世界５位」のロシア市場について』】](https://atnd.org/events/64420)

#過去分

* [2015/3/27【#TechBuzz】3/27 第11回 アプリマーケティング勉強会【テーマ：名刺管理アプリEight、マーケティング施策の裏側に迫る！/ 韓国発アフリカTVの生態系について】](https://atnd.org/events/62397)
ノンゲーム系アプリ勉強会「開催予定実績メモ」・「発表資料リンク」（累計開催数：現在6回）

#予定分
* [2015/7/23【#TechBuzz】7/23 第8回ノンゲーム系アプリ勉強会 【テーマ：調整中】](https://atnd.org/events/65470)

* [2015/5/28【#TechBuzz】5/28 第7回ノンゲーム系アプリ勉強会 【テーマ：200ヶ国の人に使われて分かったUX設計の勘所】](https://atnd.org/events/64418)
#過去分

* [2015/5/22【#TechBuzz】3/26 第6回ノンゲーム系アプリ勉強会 【テーマ：主婦向け料理アプリの作り方 / イケメン育成ダイエット 『ふとしの部屋』を"とりあえず出してみて"の1.5年間の生き様】](https://atnd.org/events/62349)

> 資料（２） [発表テーマ：イケメン育成ダイエット 『ふとしの部屋』を"とりあえず出してみて"の1.5年間の生き様](http://www.slideshare.net/ssusercc5bfa/15-46306905)

> 株式会社アクア　デジタルクリエイション事業部　名倉康友さま
WEB・アプリの企画開発を行っている制作会社。
イラスト制作事業も展開しているということもあり、
その強みを生かしたデジタルクリエイティブを追及しています。
なお当日は約20キロのダイエットに成功した開発者が登壇します！
ATOM : 複数のワードで検索する（OR検索）

### １. **ほげ** または **ふが** という文字で検索する

検索ウィンドを表示して **[.*]** をチェックして、正規表現を有効にする

```
(ほげ|ふが)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/53164/f011e5d9-3947-6fd8-80b3-33823fc9f32a.png)

### ２. 検索ワードを増やす

```
(ほげ|ふが|めも)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/53164/e376f77a-bbbc-a97f-b538-b1384cbc1fad.png)

### ３. ～dateという文字を検索する

```
.*date
```

![image](https://qiita-image-store.s3.amazonaws.com/0/53164/a0bc9a5f-8988-37c9-112d-4bf631b050db.png)

### ４. dateという単語を検索する

```
[a-z].*date
```

![image](https://qiita-image-store.s3.amazonaws.com/0/53164/18b5996e-5e12-05c2-7935-ebaf85637b3c.png)

正規表現を使うといろんな検索や置換が可能になる

正規表現を有効にしていると特殊記号を検索できなくなるのでその場合は
正規表現のチェックを外すか、特殊記号の前に \ （バックスラッシュ）をつける

また、ATOMでなく別のエディタでも上記検索は可能です
BracketsでVimキーバインド(Vimderbar)を使ってみた

## 動作確認バージョン
Windows版 Brackets 1.3 ビルド 1.3.0-16022 (release cd0a6aae5)
![brackets1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/fb42764b-5e17-8c4e-d7d3-1eb5f8ee832f.png)

## インストール方法
[ファイル]→[拡張機能マネージャー]
![brackets2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/25dbdf50-dc1f-7998-7c8a-e37a2710d545.png)

検索欄で「vimderbar」と入力しインストールを行う。
![brackets3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7832b161-f7a8-a1c9-d331-a39c85b42628.png)

[表示]→「Enable Vimderbar」にチェックし「vimderbar」を有効化する。
![brackets4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/d9e852fe-9c13-a847-93f9-de409ad88cee.png)

## 個人的に対応しておいてほしい機能
| 機能 | 可否 |
|:--|:--:|
| : [Exコマンド] | ○ |
| / [ファイル内検索] | ○ |
| * [カーソル位置の単語を検索] | ○ |
| 検索時のハイライト | ○ |
| % [カッコなどの始端から終端への移動] | ○ |
| gg [先頭行への移動] | ○ |
| G [最下行への移動] | ○ |
| :w [保存]| ○ |
| :clo [カレントウィンドウを閉じる]| × |
| :q [カレントウィンドウを閉じる]| ○ |
| :qa [アプリケーションを閉じる]| × |
| :vs [横分割] | × |
| :sp [縦分割] | × |
| Ctrl + w + k [上ウィンドウへ移動]| × |
| Ctrl + w + j [下ウィンドウへ移動]| × |
| Ctrl + w + h [左ウィンドウへ移動]| × |
| Ctrl + w + l [右ウィンドウへ移動]| × |
| Ctrl + f [一画面下へ移動]| × |
| Ctrl + b [一画面前へ移動]| × |
| gt [次のタブへ移動]| × |
| gT [前のタブへ移動]| × |
| Shift + v [行単位の範囲選択]| ○ |
| Ctrl + v [単一行の矩形の範囲選択]| × |
| Ctrl + v [複数行の矩形の範囲選択]| × |
| クリップボードレジスタ共有 | × |
| u [アンドゥ] | ○ |
| Ctrl + r [リドゥ] | ○ |
| yi( [指定文字「(」の内側のみコピー] | ○ |
| ya( [指定文字「(」の外側までコピー] | ○ |
| yf( [カーソル位置から指定文字「(」まで含めてコピー] | ○ |
| yt( [カーソル位置から指定文字「(」の1文字手前までコピー] | ○ |
| di( [指定文字「(」の内側のみ削除] | ○ |
| da( [指定文字「(」の外側まで削除] | ○ |
| df( [カーソル位置から指定文字「(」まで含めて削除] | ○ |
| dt( [カーソル位置から指定文字「(」の1文字手前まで削除] | ○ |
| vi( [指定文字「(」の内側のみビジュアルモードで選択] | ○ |
| va( [指定文字「(」の外側までビジュアルモードで選択] | ○ |
| vf( [カーソル位置から指定文字「(」まで含めてビジュアルモードで選択] | ○ |
| vt( [カーソル位置から指定文字「(」の1文字手前までビジュアルモードで選択] | ○ |
| f( [カーソル位置から指定文字「(」までカーソル移動] | ○ |
| t( [カーソル位置から指定文字「(」の一文字手前までカーソル移動] | ○ |
| >> [右へインデント] | ○ |
| << [左へインデント] | ○ |
| = [オートインデント] | × |
配列を { index => 要素 } 形式のハッシュに変換する

## <i class="fa fa-heart fa-fw"></i>概要

```rb
%w(ゆの 宮子 沙英 ヒロ)
```

という配列を

```rb
{ 0 => 'ゆの', 1 => '宮子', 2 => '沙英', 3 => 'ヒロ' }
```

というハッシュに変換したいです。
[ajax-datatables-rails](https://github.com/antillas21/ajax-datatables-rails) という Gem を使っていて[このような形式のハッシュが必要となった](https://github.com/antillas21/ajax-datatables-rails#automatic-addition-of-id)ためです。

しかし Ruby の組み込みクラスや Active Support Core Extensions にはこの要求を直接叶えてくれるようなメソッドが見つからなかったので自作してみました。

## <i class="fa fa-star fa-fw"></i>方法 1

まず考えたのが以下の実装です。

```rb
charactors = %w(ゆの 宮子 沙英 ヒロ)

charactors
  .each_with_object({})
  .with_index { |(name, accumulator), index| accumulator[index] = name }
#=> {0=>"ゆの", 1=>"宮子", 2=>"沙英", 3=>"ヒロ"}
```

ただちょっと長いしイケてない感じがしたので、同僚に相談してみました。

## <i class="fa fa-star fa-fw"></i>方法 2

そこで出てきた案が以下の実装です。

```rb
charactors = %w(ゆの 宮子 沙英 ヒロ)

(0...charactors.size).zip(charactors).to_h
#=> {0=>"ゆの", 1=>"宮子", 2=>"沙英", 3=>"ヒロ"}
```

短い！[Array#zip](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/zip.html) はやはりクールですね。
ちなみに `(0...charactors.size)` は `(0..charactors.size-1)` と同じ意味です。

# <i class="fa fa-smile-o fa-fw"></i>おまけ 1

せっかくなので [Module#refine](http://docs.ruby-lang.org/ja/2.2.0/method/Module/i/refine.html) を使って Array#hash_by として定義してみました。

```rb:extension/array_extension.rb
module Extension::ArrayExtension
  refine(Array) do
    # 配列を { index => 要素 } という形式のハッシュに変換します。
    # 命名は Array#index_by を真似て Array#hash_by にしてみました。
    #
    # %w(ゆの 宮子 沙英 ヒロ).hash_by
    # #=> { 0 => "ゆの", 1 => "宮子", 2 => "沙英", 3 => "ヒロ" }
    def hash_by
      (0...size).zip(self).to_h
    end
  end
end
```

```rb:hidamari.rb
class Hidamari
  using Extension::ArrayExtension
  
  def charactors
    %w(ゆの 宮子 沙英 ヒロ)
  end

  def charactors_hash
    charactors.hash_by
  end
end
```

```rb
hidamari = Hidamari.new
hidamari.charactors_hash
#=> {0=>"ゆの", 1=>"宮子", 2=>"沙英", 3=>"ヒロ"}
```

できた！ ＼＼\\٩( 'ω' )و//／／

# <i class="fa fa-smile-o fa-fw"></i>おまけ 2

それぞれの方法でベンチマークを取ってみました。

```rb
require 'benchmark'

characters = %w(ゆの 宮子 沙英 ヒロ) * 250
n = 10_000

n_times = -> (block) { n.times { block.call } }
way1 = -> { characters.each_with_object({}).with_index { |(name, accum), i| accum[i] = name } }
way2 = -> { (0...characters.size).zip(characters).to_h }

Benchmark.bm(6) do |x|
  x.report('way1 :') { n_times.(way1) }
  x.report('way2 :') { n_times.(way2) }
end
```
```
             user     system      total        real
way1 :   6.750000   0.140000   6.890000 (  7.955925)
way2 :   5.800000   0.130000   5.930000 (  6.832271)
```

方法 2 の方が少し早いですね。…それだけですｗ
class のなかに decorator を書く

[![](http://tiqav.com/2qs.th.jpg)](http://tiqav.com/2qs)
理解したら簡単だけどなにかとむずかしいデコレーター
もうバッチリだぜとおもってクラス内に記述したらちょっと泣いた
`*args` うけとって `args[0]` を渡すといいっぽいです

```py3:yo.py

import functools
import random

class Prot:
    def __init__(self):
        self.yo = ['yo'*i for i in range(10)] 

    def yoyo(f):
        functools.wraps(f)
        def wraps(*args):
            print('yo gacha.')
            result = f(args[0]) #  args[0] = self, result = return value
            print('')
            return result
        return wraps

    @yoyo
    def yo_gacha(self):
        print(self.yo[random.randint(0, 9)])	

if __name__ == '__main__':
    p = Prot()
    for _ in range(2): p.yo_gacha()    
```

```py3
~ %python -m yo
yo gacha.
yoyoyoyo

yo gacha.
yoyoyoyoyoyoyoyoyo

~ %
```
# つづく  
[=> to be continued...](http://qiita.com/trsqxyz/items/f5d5b9e4c01424153a2f)
cakephp2.xにComposerを使ってDebugKitを導入する


今更感あるけど、ggってすぐに出てこなかったので、メモ。
cakeインストール時のcomposer.jsonをそのまま使ってcomposer.phar installすると、debugkitが見つからないよ、というエラーになるので、その対策。



```composer.json（修正前）
  "require": {
    "php": ">=5.2.8",
    "ext-mcrypt": "*",
    "cakephp/debug_kit" : "2.2.*"
  }, 
```

```composer.json（修正後）
  "extra": {
    "installer-paths": {
      "app/Plugin/DebugKit": ["cakephp/debug_kit"]
    }   
  },  
  "require": {
    "php": ">=5.2.8",
    "ext-mcrypt": "*",
    "cakephp/debug_kit" : "2.2.*"
  },
```
LaravelでControllerの作成

コントローラ作成コマンドを実行します。

`php artisan make:controller コントローラ名`

するとプロジェクト/app/controllers/以下に自分でつけた名前のコントローラファイルができているはずです。開いてみると、

```lang:コントローラ名.php
<?php
class コントローラ名 extends \BaseController {

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */

	public function index()
	{
		//
	}

	/**
	 * Show the form for creating a new resource.
	 *
	 * @return Response
	 */
	public function create()
	{
		//
	}
	/**
	 * Store a newly created resource in storage.
	 *
	 * @return Response
	 */
	public function store()
	{
		//
	}


	/**
	 * Display the specified resource.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function show($id)
	{
		//
	}


	/**
	 * Show the form for editing the specified resource.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function edit($id)
	{
		//
	}


	/**
	 * Update the specified resource in storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function update($id)
	{
		//
	}


	/**
	 * Remove the specified resource from storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function destroy($id)
	{
		//
	}
}
```
という中身になっています。

それぞれの関数に目的があり目的によって呼び出すという感じになります。

これだけではControllerをよびだせないので、
routes.phpでつないであげる必要があります。
例えばPostControllerというのがあり
routes.phpで
`Route::resource('post', 'PostController');`
と書きます。

これでPostController内の関数を"post"という名前のURLとして呼び出すことができます。
たとえば、PostController内のindex関数を呼びたいなら~/public/post/indexです。

それではartisanコマンドで確認してみましょう。

`php artisan routes`

これでPostControllerへのパスが通っているのが確認できるはずです。
Dateは地雷原

Dateといっても、異性とするほうじゃなくて~~（そっちも地雷原と化すかもしれませんが）~~、JavaScriptの`Date`オブジェクトの方です。もともと日付計算はややこしいものですが、JavaScriptの`Date`オブジェクトが持っているクセもあって、さらにハマりどころが増えてしまっています。

# 四変化コンストラクタ
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)のページにも`Date`コンストラクタの解説が載っていますが、まず最初の表記からしてあまり見慣れません。

```js:Date-constructor
new Date()
new Date(value)
new Date(dateString)
new Date(year, month, day [, hour, minute, second, millisecond])
```
関数オーバーロードできるC++なら、コンストラクタが複数あっても気に留めるほどではないかもしれません。しかし、ここはJavaScriptの世界ですし、

* `new Date()`は、現在の時刻を表現するDateオブジェクトになる
* `new Date(value)`（引数が数値）は、Unix Timeをミリ秒単位で表現したものとして引数を解釈して、その時間のDateオブジェクトになる
* `new Date(dateString)`（引数が文字列）は、文字列をパースして、その時間になるDateオブジェクトを返す
* 最後のパターンでは、日付の各要素を指定してDateを生成する

とまあ、機能もバラバラです。

# YMD三兄弟
Dateオブジェクトの値を取得・設定するメソッドもいろいろありますが、これまた一筋縄では行きません。

* `getYear()`は、（最近の実装では）年から**1900を引いたもの**を返します。2000年問題丸出しのこんなものは使わず、`getFullYear()`/`setFullYear()`を使いましょう。
* `getMonth()`は、1月が0、2月が1…12月が11と、**1少ない**値を返します。ヨーロッパの言語などで月の名前を配列に入れるシチュエーションではこの方が便利かもしれませんが、算用数字で月を現す日本では引っかかりやすくなっています。なお、コンストラクタや`setMonth()`も同じく0オリジンです。
* `getDay()`は**曜日**を返すメソッドです。日付の操作には`getDate()`/`setDate()`を使いましょう。

# 翌月…って？
`setFullYear()`・`setMonth()`・`setDate()`は、範囲外の値を入れても、勝手に繰り上げてくれる（3月のオブジェクトで`setDate(33)`とすると4月2日になる）のは便利ですし、`getXXX()`系のメソッドと組み合わせれば相対移動も可能ですが、注意点があります。

```js:next_month.js
d=new Date();
d.setMonth(d.getMonth()+1);
m=d.getMonth();
```
このように書くと、大半の場合は問題ないのですが、1月30・31日、3月31日、5月31日などでは、翌月に対応する日がないため、**さらに翌月まで進んでしまいます**。月にしか興味がないシチュエーションであれば、`d,setDate(1)`のように日付を安全なものに変えておきましょう。

# Dateのコピー
`Date`に限ったことではありませんが、JavaScriptではオブジェクトを別な変数へ代入してもコピーが作られず、同じオブジェクトを指し続けます。

```js
foo=new Date();
bar=foo;
foo.setDate(5); //barも同じく変化する
```
`Date`をコピーしたい場合、`bar=new Date(foo.getTime())`[^1]のように、既存の`Date`から時間値を取り出して、それをコンストラクタに投げることで、同じ値を持った新規オブジェクトを作ることができます。

[^1]: `bar=new Date(foo)`のようにも書けます。この形でも、`foo`はいったんプリミティブに変換されて数値となっているので、動作としては同じですし、コピーコンストラクタにも見えるので意味を取りづらいこともないでしょう。

# 関連記事
[JavaScript の Date は罠が多すぎる](http://qiita.com/labocho/items/5fbaa0491b67221419b4)
AndroidWear単体アプリを公開した！


_AndroidWear_単体アプリとは、mobile端末(_Handheld_)を使わずに、Watchのみで遊ぶアプリのことである（正式名称とか有るのかな）。

## まず初めに・・・

私は、株式会社サイバーエージェント アドテク本部 
__ゼミ『スマートデバイス向けアプリのマネタイズ研究と実践開発』__のゼミ長をつとめています。
そのゼミの一貫でAndroidWearで遊んでいます。

### ＜緩募＞下記を使ったサービス、アプリを僕たちに見せてくれる人 / 会社！
「AndroidWear」/「Apple Watch」/「Android TV」/「VR全般」など。
特典：弊社アドテクスタジオブログで紹介します
特典：ジュースご馳走します


以下、本題。

## APKを作成する

_AndroidStudio_でAPKを作成する場合です。
`Build -> Generate Signed APK...` おなじみ？の手順です。

![スクリーンショット 2015-05-26 15.08.20.png](https://qiita-image-store.s3.amazonaws.com/0/4107/4437cf22-5162-40e4-16db-3fd5cf703748.png "スクリーンショット 2015-05-26 15.08.20.png")

AndroidStudioでプロジェクト生成時に_Wear_を選択している場合は
![スクリーンショット 2015-05-26 15.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/4107/00f2392d-ba8a-578e-cc87-61cbaee026c8.png "スクリーンショット 2015-05-26 15.11.57.png")

下記のように_mobile_と_wear_という２つを選択することが出来ます
![スクリーンショット 2015-05-26 15.08.30.png](https://qiita-image-store.s3.amazonaws.com/0/4107/18bfc16b-26a0-0199-1821-aaf829ec9542.png "スクリーンショット 2015-05-26 15.08.30.png")

### 僕がハマったポイント 
#### その１ ストアにあげるのはmobile-release.apk
Wear向けに単体で動くアプリを作成したので、最初は`wear`を選択してAPKを作成しストアへアップロード、リリースしました。

しかし、この場合、使用可能な端末が数少ないAndroidWearのみであり、mobileの方からしかストアへ接続する術が見つからず、困った困った。

`wear`じゃなくて`mobile`を選択した上でAPKを生成すると、`mobile-release.apk`と`wear-release.apk`の両方が生成されるので、`mobile`のAPKをあげてみた。


dependenciesでwearを指定しているから含まれているはずだもんね。

```
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    wearApp project(':wear')
    compile 'com.google.android.gms:play-services:+'
}
```


今度はmobile端末のストアアプリ上で検索したら目的のアプリを見つけられたけど、「 _お使いの端末はこのバージョンに対応していません。_」って表示されて、インストールできない。

#### その２ 審査だと！？

Googleからメールがきた。
そういや最初にストアで箱をつくったときにWearに対する審査がーとか言ってたけど、審査中だったらしい。

__Appleのアプリと異なり審査中でもmobileにアプリをインストールする事が可能で、wearに反映されないだけのようだ。__

```
This is a notification that your app, XXXXXXXXXXX(アプリ名), with package name ri.togu.blacksheep.colortimer, is accepted as an Android Wear app on Google Play.

For additional information on Android Wear design requirements and policies, please refer to the following developer resources: Wear App Quality - Developer Guidelines

The Google Play Team
```

上記メールがきたあとに、mobile側の_Android Wear_ってGoogle公式アプリから、
下記画面を開いて__アプリの再同期__を実施したところ、僕のwearにアプリが表示された。

![device-2015-05-28-104247.png](https://qiita-image-store.s3.amazonaws.com/0/4107/e5fa6d53-964d-65c8-07d5-c501a4ef4002.png "device-2015-05-28-104247.png")


#### 参考リンク
* [Android Wear開発の注意点Tips](http://qiita.com/lamrongol/items/4076e2e8e5dd909c9ce8)



めでたし。めでたし。
ActiveDecoratorでビューからロジックを切り離せ(要約版)


ブログより要約を転載: http://konyu.hatenablog.com/entry/2015/05/26/184153
選定理由とか使い所はブログに記載

## 検証環境

* OS: MacOSX yosemite
* Ruby: 2.2.0
* Rails: Rails4.2.1


## インストール
Gemfileに"active_decorator"を追加し、bundle install

```
gem "active_decorator"
```


## Decoratorを自動生成

既存のモデルに対してDecoratorを生成する

```
> bin/rails g decorator user
create  app/decorators/user_decorator.rb
invoke  rspec
create    spec/decorators/user_decorator_spec.rb
```

## Decoratorの書き方

###　Decoratorファイル

app/decocators/user_decorator.rb


```ruby
module UserDecorator
  # 共通処理を書きたい場合
  # PeopleDecoratorモジュールをインポート
  include PeopleDecorator

  # 文字列だけの場合
  def full_name_with_bracket
    "[ #{first_name} #{last_name} ]"
  end

  # タグで囲んでクラスを付ける場合(1つのタグで囲む場合のみ)
  # こういうのが出力できる<span class="class_name">John Doe</span>
  def full_name_with_tag
    content_tag :span, "#{first_name} #{last_name}", class: "class_name"
  end

  # 分岐もこのようにかける
  def true_false_method
    if first_name.present?
      "I have first name."
    else
      "I don't have first name! Come on Daddy, please give me first name!!"
    end
  end

  # partial パーシャルを表示する場合
  def render_partial
    render partial: "shared/xxxx"
  end
end
```

#### 複数のDecoratorに渡る共通処理

上記でインポートされるDecoratorはの作成、シンプルなモジュールで良い

app/decocators/people_decorator.rb

```ruby
module PeopleDecorator
  # 複数のdecoratorにまたがる共通処理
  def full_name
    "#{first_name} #{last_name}"
  end
end
```


#### 使えるViewHelperについて

他にもActionView::Helpersを使えるそうなので[Railsのビューヘルパー(View Helper)のまとめ](http://ruby-rails.hatenadiary.com/entry/20150113/1421149061)に乗っているものは使えるだろう

###　specファイル

デコレートされたクラスを作成するために
Model名.extend Decoratorクラス名 でデコレートしてあげる
※ Decoratorの自動生成時にできるのでそれを真似ればよい


spec/decorators/user_decorator_spec.rb

```ruby
require "rails_helper"

describe UserDecorator do
  # ここがみそ
  let(:user) { create(:user).extend UserDecorator }
  subject { user }
  it { should be_a User }

  describe "full_name" do
    subject { user.full_name }
    it { is_expected.to eq "#{user.first_name} #{user.last_name}" }
  end
end

```

###　コントローラでの呼び出し

特に何もしなくて良い

###　ビューファイルでの呼び出し方

以下の様な感じで、単純に呼んでやれば良い
Erbだとこんな感じ

```
<%= current_user.full_name_with_bracket %>
<%= current_user.full_name_with_tag %>
<%= current_user.full_name %>
<%= current_user.true_false_method %>
<%= current_user.render_partial %>
```


##### refs:

* [[Rails] RailsCast #286 Draper を active_decorator で書き直してみて得たこと](http://d.hatena.ne.jp/kitokitoki/20120904/p1)

* [active_decorator github](https://github.com/amatsuda/active_decorator)
Editor拡張でAssetの設定を変更する場合

Editor拡張を利用して新規ファイルを作った時は

```
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
```
こうすればProjectウィンドウに新規作成のファイルが表示されるが既にあるファイルに対して更新を行った場合この方法ではメタファイルに保存してくれなかった。

```
AssetDatabase.ImportAsset( パス, ImportAssetOptions.ForceUpdate ); 
```
更新したファイルのインポートを実行してやる必要があるみたい。

リファレンスを見たけどそんなこと書いてなくて苦戦したので忘れないようにメモ



##追記
どうやらこれは設定するのもによって変更する様子
この現象に出会った時は
TextureImporter.spritePackingTag
でスプライトのパッキングタグを設定した時にメタファイルが更新されなかったため
ImportAssetを実行した。

けどれ
AssetImporter.assetBundleName
でアセットバンドル名を設定をしたらImportAssetを実行しなくてもメタファイルが更新されていた。
NSUserDefaultsはセキュアじゃない

という記事がわかりやすかったのでご紹介。

https://www.andyibanez.com/nsuserdefaults-not-for-sensitive-data/

要約すると以下の通り。

- NSUserDefaultsは暗号化もされずにplistで保存してるだけ
- JBされたら閲覧も変更もできてしまう
- JBされてなくても中身は見れちゃう（iOS 8.3以降は出来なくなったかも）
- 購入したアイテムはレシートの方を保存して、あとから復元できるようにした方がいい
- それ以外のデータは以下のいずれかの保存方法が良い
  1. [KeyChainを使う](https://www.andyibanez.com/using-ios-keychain/)
  2. [Secure-NSUserDefaults](https://github.com/matthiasplappert/Secure-NSUserDefaults) などを利用して暗号化してNSUserDefaultsに保存する
RemoteViews から様々な情報を読み取る

## RemoteViews の内部構造

AppWidget や Notification のカスタム View に用いられる RemoteViews は、実際のところ View そのものは内包しておらず、View に関する情報（レイアウトのリソース ID やホストアプリケーションの情報など）と、View の操作を説明する情報を保持しています。

たとえば、RemoteViews を使って TextView に文字列をセットする場合、内部では、「`setText`を指定された引数で呼び出す」という情報が RemoteViews の中に記録されます。この操作に関する情報はリスト形式ですべて RemoteViews の中に記録されており、`RemoteViews#apply()`を呼び出すことでそれらが実行され、View が展開されるという仕組みになっています。

RemoteViews でのイベントハンドリングでは`PendingIntent`を使います。`View`のクリックに反応して`PendingIntent`に指定した`Intent`が発行されるようになっています。

## RemoteViews を活用する

これらを用いることで、他のアプリが今何をしているのか、ヒントを掴むことができるようになります。

ではどのようにそれらの情報を読み取るのかというと、公開された API は存在しないので、リフレクションで読むことになります。

`RemoteViews`の`mActions`には、操作の記録が残ります。リストに含められる情報はすべて`Parcelable`で、`RemoteViews.Action`クラスを継承しています。操作の種類によって実際の具象クラスは異なりますが、概ねどのクラスであっても、どの View に対する操作かを明示するためのリソース ID が入ります。その他、リフレクションでメソッドを呼び出すのに必要な情報を持つクラスがあったり、Drawable のリソース ID を保持するクラスがあったりします。中には、RemoteViews をネストするものがあり、そこからさらに RemoteViews に対するアクションが記録されている、というようなものもあります。

このあたりは[RemoteViews](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/RemoteViews.java)を眺めているとひと通り把握できます。

ここまでの情報で何を読み取るかは、したいこととアプリケーションの動きに依存します。ぜひ色々ログに吐き出したり、デバッガをアタッチして中を覗いてみたりすると良いでしょう。

## 余談：PendingIntent も活用してしまう

PendingIntent もリフレクションを使うことでより多くの情報を得ることが出来ます。`@hide`な API で、PendingIntent から発行される実際の Intent を取り出すメソッドが定義されているので、リフレクションでそのメソッドを呼び出し Intent が得て、いろいろ読み取ることができますね。

他のアプリの情報を読み取る、という点では、AccessibilityService が良く用いられますが、AppWidget や Notification に関して言えば、RemoteViews から読み取るというのも一つの手段です。

という訳で、こういう闇のコードを書く人も居るので、PendingIntent だからといって Intent 情報が読み取れないとたかをくくるのは危険です。気を付けましょう。

## さいごに

情報を読み出すコードが、リフレクションや Parcel から read するのばかりで、可読性とメンテナンス性が第三象限の方まで振り切っているので、まあなんかそのあたりを手伝ってくれる良い子のライブラリを書きました。

https://github.com/KeithYokoma/RemoteViewsReader
UISearchControllerカスタマイズメモ

```lang:
- (void)presentSearchController:(UISearchController *)searchController {
    searchController.searchResultsController.view.hidden = NO;
    [self updateSearchResultsForSearchController:searchController];
}

- (void)willPresentSearchController:(UISearchController *)searchController {
    dispatch_async(dispatch_get_main_queue(), ^{
        searchController.searchResultsController.view.hidden = NO;
    });
}

- (void)didPresentSearchController:(UISearchController *)searchController {
    // do something after the search controller is presented
}

- (void)willDismissSearchController:(UISearchController *)searchController {
    // do something before the search controller is dismissed
}

- (void)didDismissSearchController:(UISearchController *)searchController {
    // do something after the search controller is dismissed
}
#PostgreSQL で指定期間の連続した日付を生成する

## 例:2015年1月1日から今日までの日付を生成する場合  

* 参考: https://siguniang.wordpress.com/2013/03/23/date-arithmetic-in-postgresql/

```sql
SELECT *
FROM generate_series('2015-01-01'::date, CURRENT_DATE, '1 day')
```

* `2015-01-01 00:00:00+09`～`2015-05-26 00:00:00+09`の日付が出来た。

```result
generate_series
2015-01-01 00:00:00+09
2015-01-02 00:00:00+09
：
：
2015-05-25 00:00:00+09
2015-05-26 00:00:00+09
```

## COUNT(*)して無い日は「0」とするような集計に用いた

* 日付ごとにコメントが何件あるか数え、コメントの無い日は「0」とするような場合に用いた。

```sql
SELECT DATE(a.*) AS date, COALESCE(b.cnt, 0)
FROM generate_series('2015-01-01'::date, CURRENT_DATE, '1 day') AS a
LEFT JOIN (
    SELECT DATE(created) AS date, COUNT(*) AS cnt
    FROM comments
    WHERE created >= '2015-01-01 00:00:00'
    GROUP BY date
) AS b ON (a.date = b.date)
```
Capybaraでファイルアップロードのテストを書く


改修するシステムのファイルアップロード部分にテストが無かったので書いてみた。

以下のような、フォーム。
エクセルをアップロードすると一覧が更新されるというようなもの。

~~~erb
<%= form_tag(:action: :create, multipart: true) do %>
  ファイル名: <%= file_field(:upload, 'file') %>
  <%= submit_tag('アップロード') %><br>
<% end %>
~~~

以下のように`feature spec`を書いてみた。

~~~ruby
scenario 'アップロードで更新できる' do
  file_path = Rails.root.join('spec', 'fixtures', 'hoge.xls')
  attach_file('upload_file', file_path)
  click_on 'アップロード'

  expect(page).to have_content 'ほげほげ'
end
~~~

はー、手動テストとかメチャメチャ辛い部分なので自動でやってくれると助かるわー。
`controller`でテストするなら`fixture_file_upload`とかを使うとよいかも。

### 参考

* <https://github.com/jnicklas/capybara/blob/master/lib/capybara/spec/session/attach_file_spec.rb>
* [Module: Capybara::Node::Actions — Documentation for jnicklas/capybara (master)](http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions "Module: Capybara::Node::Actions — Documentation for jnicklas/capybara (master)")
Linuxのgrep（指定文字検索）で該当行の行番号のみ出力する

検索対象ファイルの内容で検索したい文字を含む行の行番号のみを取得する

grep -e "検索文字列" -n 検索対象ファイル名 | sed -e 's/:.*//g'

★検索対象ファイルの中から検索文字列を含む行を取得した後、その検索結果をパイプに通し、「行番号：該当行内容」となっている出力結果をsedコマンドを使用し「：」以降の文字列を空白に全置換することにより行番号のみを取得することができる

以下のquerylog.txtの中から「DELETE」を含む行の行番号のみを取得する

![image1.GIF](https://qiita-image-store.s3.amazonaws.com/0/78305/bbcfa3ec-c2f0-f75e-6735-3e65c8f43d29.gif)

grep -e "DELETE" -n querylog.txt　を実行した時の出力結果。
（8行目と11行目に「DELETE」を含む文字列があるとわかる）

![image2.GIF](https://qiita-image-store.s3.amazonaws.com/0/78305/36b50856-58ca-a044-040f-db2a67fa95b0.gif)


「でも、欲しいのは行番号だけなんだけど(´・ω・｀)」ということありませんか？？


とりあえず私はありました。（ ´_ゝ`）←


なので、パイプを利用して行番号だけ出力するように以下コマンドを実行。

 grep -e "DELETE" -n querylog.txt | sed -e 's/:.*//g'

![image3.GIF](https://qiita-image-store.s3.amazonaws.com/0/78305/8e031454-ddc7-5bd3-e18a-c7886ab7b6ff.gif)

できました♪ヽ(*^^*)ノ
omniauth-twitterが何をやっているかを見てみた

## 概要

[OAuthでomniauth-facebookが何をやっているかを見てみた](http://qiita.com/ogawatti/items/f8d851894cb154f1b413)のtwitter版。

ほぼomniauth-facebookの時と同じ内容になってしまったので、
↑を読んだ方はスルーしてOKだと思います。

## 対象バージョン

* omniauth (1.2.2)
* omniauth-oauth2 (1.0.1)
* omniauth-twitter (1.1.0)

## omniauth-twitter

基本的にomniauth-facebookと同じ。
↑の記事を参照。

#### 継承関係

OmniAuth::Strategies::Twitterの継承関係もomniauth-facebookの時とほぼ同じ。
OmniAuth::StrategyはOmniAuth::Strategies::OAuthにincludeされている。

#### シーケンス

TwitterとのOAuthは1系なのでFacebook(2.0系)とは異なる。
が、大きな流れは同じ。
TwitterとのOAuthは、最初にリクエストトークンを取得して、これを用いて認証・認可をする。

* TwitterへのOAuthリクエスト (下図 2)
 * /users/auth/twitterへのリクエストをフックする
 * consumer_keyを使ってrequest_tokenを取得する
* Twitterでの認証 (下図 3,4)
 * 認証・アプリ認可する
* Callback処理 (下図 5)
 * request_tokenとconsumer_keyを元にアクセストークン取得
 * アクセストークンを使ってユーザ情報取得
 * ユーザ情報からAuthHashを生成してenvに埋める
 * アプリをコールする

![sequence_oauth1.png](https://qiita-image-store.s3.amazonaws.com/0/17647/d3ca75f9-a709-4050-f544-bee94739dd45.png)


AuthHashはアプリケーションで認証情報やユーザ情報を扱うための情報が入ったhash。
詳細は[こちらを参照](https://github.com/mkdynamic/omniauth-facebook#auth-hash)。

#### クラス図

主な登場人物は

* application
* omniauth-twitter (omniauth, omniauth-oauth)
* oauth
* twitter

![class_omniauth-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/17647/4b4680fb-b535-8efd-dc55-079b4e483ab4.png)

omniauth-twitterとtwitterとのやりとりはoauthを通して行われる。
特に通信部分に関しては、OAuth::Consumerを通じてNet::HTTPで行われる。

OAuthの基本的な登場人物 (アクセストークン、Authorization Code等)はOAuthに抽象化されていることが分かる。
この辺りもomniauth-facebookと同じ。
cmakeでビルド時にシェルスクリプトを実行する



cmakeはmakeと違ってシェルスクリプトどうやって走らせればいいか分らない、
そう思っていませんか？

## 他のファイルを生成しない場合

ctagsやdoxygenのように、他のソースのコンパイルに関係ない物を生成するためには
`add_custom_target`を使います:

```cmake
add_custom_target(ctags ALL COMMAND "ctags" "-R" "-f" ".tags" "--languages=C++,python" "--exclude='CMake*'")
add_custom_target(document COMMAND "doxygen" "doc/Doxyfile")
```

COMMAND以下に実行したいシェルスクリプトを記述します。
`ALL`を付けると毎回の`make`で自動的に実行されます。

## ファイルを生成する場合

例えばプロジェクトKSEで使用するProtocol buffersのコードを生成したい場合、
`KSE.pb.cc`と`KSE.pb.h`が生成され、それをコンパイルする必要があります。
この場合は`add_custom_command`を使用します:

```cmake
add_custom_command(
  OUTPUT KSE.pb.cc KSE.pb.h
  DEPENDS KSE.proto
  COMMAND "protoc" "KSE.proto" "--cpp_out=." "--python_out=."
)
```

これによりターゲットに`KSE.pb.cc`, `KSE.pb.h`が追加され

```shell
make KSE.pb.cc
```

で`KSE.pb.cc`が生成されます。
もちろん依存関係は自動で解決されますので、

```cmake
add_library(KSE STATIC
  logger.cpp
  KSE.pb.cc
)
```

のようにある場合は勝手に`KSE.pb.cc`を生成してくれます。
sudoのない生活


ハードウェアをメンテナンスして頂いているだけでも有り難いのに、スパコンの管理者に自分だけが必要とするソフトウェアのインストールやアップデートを要求するなんてそんな傲慢な子に母さんはあなたを育てた覚えはありません。自分でやれ。

今日はみんな大好き[MACS2](https://github.com/taoliu/MACS)をインストールします。インストール先は $HOME/local にしていますけど、好みで変えてもいいです。変えてもいいですけど、PATHが通ってないだけなのに「インストールできてない！」と騒ぐのが許されるのは小学生までです。

MACS2推奨に従ってpythonは2.7.2を入れます。

```
# python local install
cd
mkdir -p $HOME/local/src
wget 'https://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz'
tar zxfv Python-2.7.2.tgz
cd Python-2.7.2
./configure --prefix=$HOME/local
make
make install
# include $HOME/local/bin to path 
echo 'PATH=$HOME/local/bin:$PATH' >> $HOME/.bashrc
which python # check if it is "/home/<user>/local/bin/python"
```

pip入れます。

```
# pip local install
cd $HOME/local/src
wget 'https://bootstrap.pypa.io/get-pip.py'
python get-pip.py --user
# pip forces to install bin to ~/.local/bin 
echo 'PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc
exec $SHELL
which pip # check if it is "/home/<user>/.local/bin/pip"
```

MACS2はnumpyが必要なのでこれもローカルに入れます。

```
# numpy local install
cd $HOME/local/src
wget -O numpy.tar.gz 'http://sourceforge.net/projects/numpy/files/latest/download?source=files'
tar zxfv numpy.tar.gz
cd numpy-1.9.2
python setup.py install --prefix $HOME/local
```

MACS2を入れます。

```
# macs2 local install
pip install MACS2
echo "🍺"
```

なおその他たくさんNGS関連のパッケージやツールをローカルにインスコする必要がある紳士淑女の皆様におかれましては、兵長こと笠原さんが公開してくださっている [Local Package Manager](http://www.kasahara.ws/lpm/) を使うと随分ラクですのでこっちの方が断然おすすめです。
【CakePHP】ファイルダウンロード

ファイルを作成してダウンロードする方法と、ファイルを作成せずにダウンロードする方法がある。

「ファイル作成してダウンロード」は、既に用意されているファイルをダウンロードする場合や、PDFやエクセルなどを一旦編集してダウンロードする場合に適していると思う。

「ファイルを作成せずにダウンロード」は、CSVなどテキスト系のファイルのダウンロードに適していると思う。

※CakePHPのバージョン2.3以降

##ファイルを作成してダウンロード

```php
$this->autoRender = false;

$this->response->file(
  //ファイルパス
  APP.'webroot/files/foo.csv',
  [
    //ダウンロードしたときのファイル名。省略すれば元のファイル名。
    'name'=>'bar.csv',
    //これは必須
    'download'=>true,
  ]
);
```

##ファイルを作成せずにダウンロード（Viewを使う）

```php
//レイアウトを使用しない
$this->layout = false;

//ファイルの種類によってContent-Typeを指定　後述するFirefoxのため。
$this->response->type('csv');

//ダウンロードするファイル名を指定
//downloadメソッドの中で、「Content-Disposition: attachment; filename=ファイル名」を設定している。
$this->response->download('bar.csv');

//Viewでファイル内容をレンダリングする
$this->set(['data'=>$data]);
```

##ファイルを作成せずにダウンロード（Viewを使わない）

```php
//Viewを使用しない
$this->autoRender = false;

//ファイルの種類によってContent-Typeを指定　後述するFirefoxのため。
$this->response->type('csv');

//ダウンロードするファイル名を指定
//downloadメソッドの中で、「Content-Disposition: attachment; filename=ファイル名」を設定している。
$this->response->download('bar.csv');

//レスポンスに設定
$this->response->body('ファイルの内容');
```

##ついでにダウンロードの基礎知識
※**間違いや補足などありましたらご指摘いただけるとありがたいです。**

ブラウザでダウンロードさせたい場合、HTTPヘッダのContent-Dispositionをattachmentとすれば良い。inlineとすれば、画面に表示される。PHPで書くと以下のようになる。

```php:php
header('Content-Disposition: attachment; filename=bar.csv');
```

参考
[既知の MIME タイプに対し [ファイルのダウンロード] ダイアログ ボックスを開く](https://support.microsoft.com/ja-jp/kb/260519/ja)

Chrome、IE、Firefox、Operaの最新版で試したところContent-Dispositionのみでjpgファイルをダウンロードできた。

ただし、IEの過去バージョン（IE 6など）ではContent-Dispositionのみではダウンロードされない場合があるとのこと。
cakeの$this->response->fileの中を読むと、Operaの場合Content-typeに「application/octet-stream」を、IEの場合Content-typeに「application/force-download」を設定している。
もしもブラウザのバージョンによって、「ファイルを作成せずにダウンロード」のやり方でダウンロードされない場合はこのあたりが怪しいかもしれない。

また、Firefoxではダウンロード時に表示も選択することができるが、その際にContent-Typeを参照しているので、Content-Typeも設定したほうが良いかもしれない。そのため、「ファイルを作成せずにダウンロード」ではContent-Typeを設定している。


多くのPHPのダウンロードのサンプルでは、Content-Typeに「application/octet-stream」もしくは、「application/force-download」を設定すればダウンロードされるとあり実際うまくいくが、これはブラウザが想定しないMIMEのためダウンロードされる仕組みを利用したもので、Content-Disposition: attachmentを使うのがいいのではないかと思う。（このあたりは自信ないのでご指摘頂けるとありがたいです。）

###※さらについでにContent-Typeの説明
Content-Type: text/html; charset=UTF-8

Content-Typeはファイルの種類をブラウザに示すもの。
Content-Typeは、サーバ側で設定することも可能。例えばPHPでは以下のようにする。

```php:php
header('Content-Type: image/png');
```

また、Apacheの設定で拡張子を見てContent-Typeを設定することも可能。
例）pdf拡張子の場合、Content-Typeをapplication/pdfにする。

```apache:apache
AddType application/pdf .pdf
```

Content-Typeの代表的なもので以下がある。
text/html（HTMLテキスト）
image/jpeg（jpeg画像）

また、charset=UTF-8で文字コードを表している。
Elasticsearch入門

## インストール

```
$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.5.2.noarch.rpm
# rpm -Uvh elasticsearch-1.5.2.noarch.rpm
# systemctl enable elasticsearch.service
# systemctl start elasticsearch
```

## インデックス一覧

```
curl -XGET 'http://localhost:9200/_aliases?pretty'
```

## インデックスを全検索

/インデックス/_search -d json

```
curl -XGET http://localhost:9200/apache_log-2015.05.26/_search -d '{"query":{"match_all":{}}}'
```


## インデックスのマッピング確認

```
curl -XGET 'http://localhost:9200/apache_log-2015.05.26/_mapping?pretty'
```
Elasticsearch+kibanaでConnection Failedが出た時の対処法

#トラブル
KibanaとElasticsearchを別のサーバで構築したんだけど、kibanaにアクセスした時にConnection Failedというエラーが出る。ググるとすぐに解決法が出てきて、

```bash
vi /etc/elasticsearch/elasticsearch.yml
```

ここに下記を追加しろという感じだった

```bash
http.cors.allow-origin: "/.*/"
http.cors.enabled: true
```

でも、追加してelasticsearchを再起動しても、connection failedの画面のままで、解決しない。上記の解決法がスタンダードっぽくて、他の解決法の検索ノイズになって、全く解決できない感じになっていた。

#解決法

[Kibana 3 and Elasticsearch 1.4 - CORS problem](https://gist.github.com/rmoff/379e6ce46eb128110f38)

上記のコメント欄に書かれていた、これでいけた。

```bash
http.cors.allow-origin: "*"
http.cors.enabled: true
```

この後に再起動

```
# service elasticsearch restart
```

めっちゃハマったので、是非お試しください。
RからS3にアクセスしたい

環境は、AWS上のUbunutuから。

試行錯誤しながらやったので、余分なものも入ってるかも。

[RS3](https://github.com/Gastrograph/RS3)ライブラリを使います。

# OS側

curlとsslライブラリ関連を入れます。必要に応じてbuild-essentialも入れてください。

```bash
$ sudo apt-get install libxml2-dev libcurl3-dev libcurl4-openssl-dev
```

# R側

```R
install.packages("git2r")
install.packages("devtools")
reuqire("devtools")
install_github("Gastrograph/RS3")
```

devtoolsのインストールの時に何故か、git2rでコケたので別途入れていますが、devtoolsだけで、インストールされるはず。

/usr/lib/Rだが、/usr/local/lib/Rだかの権限がないと怒られるので、適当にゴニョる。


# 実行
```r
require("RS3")
S3_connect("アクセスキー","シークレットキー", hostname = "s3-ap-northeast-1.amazonaws.com")
S3_get_object("bucket", "key", filename = "file")
```
これで、ローカルに、s3://bucket/keyが、fileで保存されます。

ポイントは、hostnameを指定してやることでした。
proxy認証環境にてgem install～認証IDに@を含む場合～

同じような投稿があったけど実例まで載ってなかったので備忘録として

proxy認証環境でのgem installは

gem install 'パッケージ名' -r -p http://認証ID:パスワード@プロキシ名:ポート番号

そして実例
gem install nokogiri -r -p http://test%40.co.jp:test00@test.proxy:8080
(@をエスケープして%40と記述)
【Photoshop】アクションで選択範囲からスライスを作る

Photoshopでデザインをもらったときに、一番困るのがフォルダに範囲選択（レイヤーマスク）をしているやつ。
それを簡単にスライスできるアクションが・・・！さすがアライドさんだ。早くググれば良かった
[コーダーが覚えとくと便利なPhotoshop操作 | アライドアーキテクツのクリエイターブログ](http://creator.aainc.co.jp/archives/5812)

が、私の環境が古い（CS5）せいかアクションの一番最後のレイヤー削除でスライスも一緒に消えるので新しいの（消去ではなく、隠すにしたやつ）を作ってみた。
[選択範囲からスライスだよ.atn](https://dl.dropboxusercontent.com/u/6903717/download/%E9%81%B8%E6%8A%9E%E7%AF%84%E5%9B%B2%E3%81%8B%E3%82%89%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%A0%E3%82%88.atn)

ファンクションキーを自分の好きな感じに変更するとなおよしです。
jQueryとAjaxの使い方 2

#XMLの中身をWebページ上に表示させる
Ajaxを使ってXMLで取得した内容を加工し表示させる。
加工しなければHTML上に表示できない。

使用するAjaxコード

```ajax
$.ajax({
    url: '取得するXMLファイル',
    dataType: 'xml',
    success : function(data){
        //取得したファイルに対する処理
    }
})
```

#使用するファイル

##Sample.html
AjaxとjQueryの操作によりXMLのデータを取得しweb上に表示させる。

##Sample.xml
中身のデータをHTMLに表示できるようにに加工する。


#コード解説

```Sample.html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>sample2</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
        $(function(){
           $.ajax({
           url: 'Sample.xml',
           dataType: 'xml',
           success : function(data){
              $("item",data).each(function(){
                $("dl").append("<dt><a    href='"+$("link",this).text()+"'>"+$("title",this).text ()+"</a></dt><dd>"+$("description",this).text()+"                     </dd>");
               })
             }
          })
       })
       </script>
    </head>
    <body>
        <dl></dl>
    </body>
</html>
```


Ajaxで取得したXML内のデータをbodyの中にある＜dl＞内に表示させます。



```Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>ASCII.jp － Web Professional（ウェブ・プロフェッショナル）</title>
        <link>http://ascii.jp/cate/161/</link>
        <pubDate>Sun, 23 Aug 2009 10:08:43 +0900</pubDate>
        <item>
            <title>ママチャリ屋が高級店に　Web展開でトップギア </title>
            <pubDate>Fri, 21 Aug 2009 11:00:00 +0900</pubDate>
            <link>http://ascii.jp/elem/000/000/451/451782/summary.html</link>
            <description><![CDATA[今から12年前、(中略)その舞台裏を追った。]]></description>
        </item>
        <item>
            <title>入門Ext JS：グリッドパネルの使い方をマスター </title>
            <pubDate>Thu, 20 Aug 2009 14:00:00 +0900</pubDate>
            <link>http://ascii.jp/elem/000/000/450/450711/summary.html</link>
            <description><![CDATA[JavaScript(中略)を紹介する。]]></description>
        </item>
        <item>
            <title>サーバー不要！Yahoo! PipesでXML→JSONPに変換 </title>
            <pubDate>Wed, 22 Jul 2009 23:07:25 +0900</pubDate>
            <link>http://ascii.jp/elem/000/000/438/438132/summary.html</link>
            <description><![CDATA[XMLをJSONPに(中略)作れる。]]></description>
        </item>
    </channel>
</rss>
```




XMLのitem要素内にそれぞれ個別の記事の更新情報が記述されており、その子要素には以下のようなデータが記述されています。



```
title
   タイトル

pubDate
   公開日

link
   記事のURL

description
   記事の概要
```


#コード実行結果
![sample1 (2).png](https://qiita-image-store.s3.amazonaws.com/0/59356/504bb01a-41b5-71a3-90b1-a7ec64d8bd4d.png)

取得したXMLデータの加工によりURLやタイトルに
＜title＞や＜a＞などを指定させ表示させています。


#参考にしたサイト
http://ascii.jp/elem/000/000/458/458236/index-3.html
Fluentd入門

## インストール

```
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## 起動

```
# systemctl start td-agent.service
# chkconfig td-agent on
```

## 再起動

```
# systemctl restart td-agent.service
```

## とりあえず、動作テスト

```
# vi /etc/td-agent/td-agent.conf

<source>
  type forward
  port 24224
</source>

<match *.*>
  type stdout
</match>
```
```
$ echo '{"message": "Hello World!"}' | /opt/td-agent/embedded/bin/fluent-cat debug.test
# tail /var/log/td-agent/td-agent.log
```

## apacheのアクセスログを収集するように設定

/etc/td-agent/td-agent.conf

```
<source>
  type tail
  format apache2
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/apache_access.pos
  tag apache.access
</source>
```

#### Permissionが足りないくてapacheのアクセスログが読めない場合

/var/log/td-agent/td-agent.log に

```
Permission denied @ rb_sysopen - /var/log/httpd/access_log
```

のエラーが出たら

```
# vi /etc/init.d/td-agent

- DAEMON_ARGS=${DAEMON_ARGS---user td-agent}
+ DAEMON_ARGS=${DAEMON_ARGS---user root}
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --user root --group td-agent --log /var/log/td-agent/td-agent.log}"
```

## Elasticsearchへ転送する設定

Elasticsearch用プラグインインストール

```
# /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
```

/etc/td-agent/td-agent.conf

```
<match apache.*>
  type elasticsearch
  logstash_format true
  logstash_prefix apache_log
  hosts localhost:9200
  type_name apache-access-log
  buffer_type memory
  buffer_chunk_limit 1m
  buffer_queue_limit 128
  flush_interval 2s
  retry_limit 17
</match>
```

1. タグ「apache.access」がマッチするので、
1. elasticsearchに
1. logstashフォーマットした「apache_log.ymd」のインデックスで、
1. localhost:9200のelasticsearchに
1. タイプ「apache-access-log」で送信する感じ。
【jQuery】正規表現いろいろ

正規表現はフォームのバリデーションなどでよく使うことがありますが、忘れてしまうのでメモ。

# <a href="http://codepen.io/konweb/full/VLmPoe/" target="_brank">DEMO</a>

## 半角数字が含まれる
```
value.match(/\d/);
```

## 半角数字のみ
```
value.match(/^\d+$/);
```

## 英字が含まれる
```
value.match(/[a-zA-Z]/);
```

## 英字のみ
```
value.match(/^[a-zA-Z]+$/);
```

## ひらがなのみ
```
value.match(/^[\u3040-\u309f]+$/);
```

## カタカナのみ
```
value.match(/^[\u30a0-\u30ff]+$/);
```

## 半角カタカナのみ
```
value.match(/^[\uff65-\uff9f]+$/);
```

## 全角のみ
```
value.match(/^[\u3040-\u30ff]+$/);
```

## ASCII文字のみ
ASCII文字は、半角の英数字や記号など。日本語文字や全角の英数字などは含まれない。

```
value.match(/^[\u0020-\u007e]+$/));
```

## 特定の記号が含まれる
例: <、>、&、"、'、\u005c(\)、\u0020(空白)が含まれる場合

```
value.match(/(<|>|&|"|'|\u005c|\u0020)/));
```

## URLかどうか(半角英数字)
```
value.match(/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/)
```

## メールアドレス その1
簡易的な正規表現。全角が含まれず、{1}@{2} のような形式
-._の記号が使用可能

```
value.match(/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/)
```

|Address|Match|
|:---|:---:|
|aa@aa|◯|
|a@aa|◯|
|@aa|×|
|aa@a|×|
|a-a@aa|◯|
|-aa@aa|×|
|aa$@aa|×|

## メールアドレス その2
RFC5322の仕様に基づく。 {1}@{2}.{2} のような形式
こちらから引用 → <a href="http://emailregex.com/" target="_brank">Email Address Regular Expression That 99.99% Works</a>

```
value.match(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i);
```

@前に使用可能記号: -!$%^&*_=+ (.は先頭または@の直前には使用不可)
@後、.◯◯前に使用可能記号: -_.
使用可能メール

- .aero
- .arpa
- .biz
- .com
- .coop
- .edu
- .gov
- .info
- .int
- .mil
- .museum
- .name
- .net
- .org
- .pro
- .travel
- .mobi

|Address|Match|
|:---|:---:|
|aa@aa|×|
|aa@aa.a|×|
|aa@aa.aa|◯|
|!aa@aa.com|◯|
|aaa+aaa@gmail.com|◯|
vagrant-triggerを使ってVagrant+Chef環境で発生するsynced_folderの問題を解決した。


Vagrant + Chefっていう組み合わせの環境を普段から使わせていただいているんですが、よくなんかよくわからないエラーが起きるようになったんですよね。アップデートのスクリプト通そうとすると通らないっていう。
前の記事の最後の方にも書いてたんですけどsynced_folderに原因がある感じ。
[WordPressをVagrant環境にらくらくインストールする。 - VCCW](http://qiita.com/naru0504/items/58011181f2c271808c7f/?fr=vgt)

というか本当に悪の枢軸なんじゃないかってくらい毎日起きてたんですね。
いつも何かしらできるだろうとか思ってたんですけど、自分はぜんぜんVagrantにもChefにも明るくないのでお手上げかなって。

そんなぼくが救世主として見つけたのが
[**vagrant-trigger**](https://github.com/emyl/vagrant-triggers)

![Kobito.kmKbAY.png](https://qiita-image-store.s3.amazonaws.com/0/58800/3cf959ea-4f1d-216f-cbc3-6728df07da51.png "Kobito.kmKbAY.png")


## 原因？と解決策？
原因を探っていくうちに、GitHubのVagrantのISSUE #5199にたどり着きました。
[Problem reloading Chef shared folders #5199](https://github.com/mitchellh/vagrant/issues/5199)

ざっくり内容を3行で書くと。

> synced_folderのキャッシュの問題だわ
  synced_folder消してくれ。
  手動で毎回消すの面倒なやつはvagrant-trigger使ってくれ。

と解釈できる(超訳)
## 設定方法

### vagrant-triggerのインストール
何はともあれここから。

```
vagrant plugin install vagrant-triggers
```

### Vagrantfileにこれを書く。

```
Vagrant.configure("2") do |config|
  config.trigger.after [:reload, :halt], stdout: true do 
    `rm .vagrant/machines/default/virtualbox/synced_folders`
  end
end
```
Vagrantfileにこのコードを書く。ディレクトリ構成は各プロジェクトに合わせてくださいね。

これで`vagrant halt`か`vagrant reload`をトリガーにして、synced_folderを消してくれる。
いちいち自分の手で消さなくて済むのがうれしい。

自分はあんまり`vagrant suspend`しないから書いてないのですが、 トリガーに加えてもいいのかもしれない。

いま携わっているプロジェクトは微妙に構成が違うので、サンプルのコードに変更を加えて導入したのですが、実際に問題は発生しなくなり、かなり便利になりました。

## vagrant-triggerってもしかしてかなり便利じゃない？
なんか超便利そうなんでこういう使い方あるよって教えてください。

## よりよい方法ある？
なお、もっとよい解決策を知っている方いるなら随時募集してます。
教えてください！

## 余談
Vagrant+Ansibleでも似たようなことが発生すると、調べている途中で見た気がしますが、きちんとしたことは知りませんー。
あと余談ですけど、最初はvagrant-triggerでVagrant+Chef環境をもっと快適にとかそういうタイトルにしようと思ったけど、完全に釣りになるからやめました。


**前記事**
[ラクしてLAMPとかの環境を用意したい人のためのScotch Box](http://qiita.com/naru0504/items/a14681b030816135b868?fr=vgt)
Groovyのちょっとしたこと「Grails 3.0.1でSSL->None SSLでのRedirectをうまくやる方法」


リバプロの役割を持ったNginxでSSLして、裏側のApplicationServerはNoneSSL。という構成はよくあると思うのですが、Controllerクラスでredirectメソッドを使うと、url引数で設定しない限りリダイレクト先がNoneSSLなURLになるというよろしくないことが起きます。

いくつか解決方法はあるのですが、サイト全体がSSLである場合に一番てっとり早い方法はGrailsアプリケーションの起動時の引数で
<code>-Dgrails.serverURL=https://yourSiteURL</code>
とやることです。

この設定により、redirectメソッドの基底のURLが設定したものになるため全ての相対パスへのredirectがSSLのURLにリダイレクトされるようになります。
Vimカスタマイズ 自分が今使っているvimrc

とりあえずcontrol + j でノーマルモードに行けるのは嬉しい

色々こぴぺだけど私が今使っているvimrcを紹介します。
ホームディレクトリに「.vimrc」ファイルを作って以下の内容をコピペするとちょっとだけvimが使いやすくなります

```lang:.vimrc
noremap <C-j> <esc>
noremap! <C-j> <esc>
set number
set ruler
set list
set incsearch
set hlsearch
set nowrap
set showmatch
set whichwrap=h,l
set nowrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set helplang=en
```