OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkinsのプラグイン「Build Flow Plugin」が超便利だった

### はじめに
* Build Flow Plugin
 * https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin
* 以下のケースでは有効に使えます！
 * １つのジョブをトリガとして複数のジョブを実行して、結果は呼び出し元のジョブで管理したい場合
 * 失敗したらもう一度という風にリトライをさせたい場合
 * 例外処理として別のジョブを実行させたい場合

### プラグインのインストール
* プラグインマネージャーから「CloudBees Build Flow Plugin」をインストール

### ジョブの作成
* 「新規ジョブの作成」から「Build Flow」を選択する
* 「ビルド・トリガ」の「Define build flow using flow DSL」にスケジュールを書いていく
* 基本的には[プラグインの公式ページ](https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin)を見てDSLを書くのがいいと思われる
 * 以下は私が自分の担当している業務で使った例
 * 3つのジョブをパラメータ付きで並行実行かつリトライ3回

```
parallel(
  { retry 3, { build("JOB_A", BRANCHNAME: params["BRANCHNAME"], AUTHOR: params["AUTHOR"]) }},
  { retry 3, { build("JOB_B", BRANCHNAME: params["BRANCHNAME"], AUTHOR: params["AUTHOR"]) }},
  { retry 3, { build("JOB_C", BRANCHNAME: params["BRANCHNAME"], AUTHOR: params["AUTHOR"]) }}
)
```

### 注意する点
* プラグインのバージョンで若干差があったので共有を
* 0.10では発生しない。0.12で発生
* 後続ビルドの設定をしていても一向に実行されないことが...
 * 対応は至ってシンプルで「Flow run needs a workspace」にチェックを入れる必要がある

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
yum update かけると起動しなくなるのを回避する @ Parallels Desktop 9 for mac


[以前の記事](http://qiita.com/ogwmtnr/items/06c819cc5ea657ec0518)で
・`yum update`かけたら起動しなくなったからまだやるな！
としていましたが、外部サーバーで同じ経験をしたら対処できるか？という不安もあるので、どうすれば起動するようになるのかを調べる事にした。



##環境
ゲスト: CentOS 6.2
ホスト: MacBookAir MacOS 10.8
VM: Parallels Desktop 9 for mac



##スナップショットを作っておく
まずはとにかく、今の正常な状態を保持するため Parallels Desktop の機能でスナップショットを撮っておきましょう。
これで何があっても今の状態に戻れます。安心安全無料。



##普通に`sudo yum update`してみる
しばらく待つ。
Complete! 表示されたので、再起動。
すると前回と同じく、真っ黒の画面下にゲージがあり、それが伸びきって右側に CentOS 6.2 の表記が白くされたタイミングで、止まった。
待てども待てども画面変わらず。



##検索と調査
CentOS 起動しない などなどのワードでググってみたところ、2つの対策を見いだしたので、試す。



##kernel*系パッケージを無視する
[yumでシステムのアップデート](http://www.8wave.net/yum.html)や、[Parallels Tools support for Fedora 17 and 18?](http://forum.parallels.com/printthread.php?t=281638&pp=40)（Fedoraだけども）によると、カーネルの更新は肝を冷やす場合があるというのがわかった。
なので`yum update`時に無視するよう設定（方法は下記にあります）して、`sudo yum update`してみる。
しばらく待つ。
Complete! 表示されたので、再起動。
止まった。S.H.I.T!
だが先人達の教えの通り、この設定は残しておく。



##xorg*系パッケージを無視する
[Linuxをインストールしたのに画面が黒いままで起動しないときの対処例](http://www.garunimo.com/program/linux/corumn-linux3.xhtml)や、[xorg-serverとかati-driversをアップデートするとXが起動しなくなった話。](http://l1048576.blogspot.jp/2012/07/xorg-serverati-driversx.html)によると、GUIの起動で失敗してるよ！との事。
「白い文字がババっと出てきて、その後の黒い画面で止まる」というのが今回の事例と似ているので、有力そう。
一度xorg*系のパッケージのみ更新をかけて

```bash:
$ sudo yum update xorg*
```

OS再起動したら、確かに同じ現象が発生した。
しかし、ログを見て xorg.conf を触れど触れど起動しなかったので、「だったらこの部分だけ更新無視すれば、`yum update`しても起動するんじゃね？」と思い、xorg.*系パッケージも無視してもらう事にした。



##yum.conf を編集する
[特定のパッケージをyumのアップデート対象から外す](http://qiita.com/kataring/items/609fd4a55f4495a94b7d)を参考に、`yum update`時にパッケージを無視してもらうよう、設定します。

```bash:
$ sudo vi /etc/yum.conf
```

で、文末に

```bash:/etc/yum.conf
（略）
# for Parallels Desktop 9
exclude=kernel* xorg*
```

を追記して保存し、

【追記】`--skip-broken`を付けて！と表示されたので、オプションを付けて実行しました。

```bash:
$ sudo yum update --skip-broken
```

して、しばらく待つ。
Complete! 表示されたので、再起動。



##CentOS 6.2 起動確認
コングラッチュレーション…！



##感謝
参考にさせていただいたサイト管理人の皆様、誠にありがとうございました。
CSSの擬似要素のデバッグ

### ※Canaryで確認。Stableはまだ (2013/11/08)

Chrome(Canary)のDevToolsでCSSの`::before`とか`::after`とかの擬似要素がElementsパネルに表示されるようになった。

以前はElementsパネルに表示されず、Stylesのとこを見るしかなかった

![stable.png](https://qiita-image-store.s3.amazonaws.com/0/17969/ab71acb7-1dcf-6f8d-b27c-bc42b3cc5bd1.png)

それがElementsパネルに直接表示されるようになって、どこに擬似要素が挿入されてるかひと目でわかるようになった。
クリックすれば擬似要素がハイライトされるようにもなってる。

![canary.png](https://qiita-image-store.s3.amazonaws.com/0/17969/222f89cc-0062-2f5d-b6a3-b7debc6f028c.png)

パッと見でわかる＋選択できるようになったことで作業しやすくなった。

Chromeサイコー
自分でhelmコマンドを作るために必要な引数などを調べた

helm、便利ですよね。あまりに便利なのでちょくちょく自分でオリジナルのhelmコマンドを作りたくなるのですが、引数に何を渡せばよいかすぐ忘れてしまう上にあまりまとまった情報が無かったのでメモしておきます。

# 基本

helmコマンドで表示する候補やキーマップをカスタマイズするには、必要な情報をプロパティリスト(:keyword1 value1 :keyword2 value2 ....)形式で渡します。(プロパティリストではなく通常の引数を渡す形式もありますが、わかりづらいので割愛)

## 例：単純な文字列の候補から選択する

```el
(helm :sources '((name . "Helm Sample")
                 (candidates . ("AAA" "BBB" "CCC"))
                 (action . kill-new)))
```

![helm-sample.png](https://qiita-image-store.s3.amazonaws.com/0/14347/3b5566fa-6f03-66f9-30c4-e1bedfce851c.png)

# helmコマンドの主な引数

|キーワード|説明|デフォルト値|
|:---------|:---|:-----------|
|:sources|helmバッファに表示する候補情報(以下、情報源)のリスト。詳細は後述。|(未確認)|
|:input|候補を絞り込むパターンの初期値。何らかの値を指定すると、helmバッファにあらかじめこの値で絞り込まれた候補一覧が表示される。|""|
|:prompt|ミニバッファに表示されるプロンプト。| "pattern: "|
|:buffer|候補を表示されるバッファ名。バッファ名を分けておくと他のhelmコマンドを実行しても候補バッファが上書きされないので、C-u M-x helm-resumeでhelmセッションを再開できる。|"*helm*"|
|:default|デフォルトの絞り込み条件。ミニバッファには表示されないが何か入力するまでこの値で絞り込まれた状態となる。|thing-at-pointの結果|
|:keymap|ミニバッファで使用するキーマップ。|helm-map|
|:allow-nest|他のhelmセッションからのネスト呼び出しを許可するか。|nil|

## :sourcesで指定する情報源

:sourcesの中身はhelmバッファに表示する情報源のリストです。個々の情報源は以下のようなキーと値を持つ連想配列の形式で表現されます。

情報源の基本的な定義

|キー|説明|
|:-----|:----|
|name|情報源の名前(先述の例の図で"Helm Sample"と表示されている箇所に入る文字列)|
|init|初期化処理を行う関数|
|candidates|候補となる文字列リスト|
|action|選択した候補に対して実行する関数(またはそのリスト)|

# バッファの中身を候補にする

helmバッファに表示される候補の基本は情報源のcandidatesとして定義されたリストの中身ですが、特定のバッファの各行を候補とすることもできます。文字列リストをcandidatesに指定するよりも、バッファ内の文字列を候補にした方が速度面でだいぶ有利らしいです。

## 例：lsコマンドの結果をバッファに挿入し、helmの候補とする

```el
(helm :sources '((name . "Helm Sample")
                (candidates-in-buffer)
                (init . (lambda () (helm-init-candidates-in-buffer 'global (shell-command-to-string "ls -1"))))
                (action . find-file)))
```

candidates-in-buffer属性を指定することで、lsコマンドの結果を格納したバッファの内容を候補として表示しています。候補となる文字列を格納したバッファは、init属性で指定した関数によって初期化されます。

## プラグイン

上記の例で挙げたcandidates-in-buffer属性は、実行時に内部でcandidates属性に変換され、候補用バッファの各行の内容が候補として渡されるという仕組みになっています。このように、ある属性を実行時に既存の属性に変換する仕組みをhelmでは _プラグイン_ と呼んでおり、組み込みの `(candidates-in-buffer)` や `(candidates-file)` 等のプラグインがある他、ユーザが自分で定義することもできます。

# おわりに

ここまでに述べた内容に従えば、最低限自分で使うhelmコマンドを作ることはできると思います。 ただしhelmコマンドの引数や:sourcesの中身については、上記に挙げたものが全てではありません。より実践的な知識を得たい方は、既存のhelmコマンドのソースや、helm自体のソースを読むなどして、より理解を深めていくと良いと思います。

## 参考

* [Emacs Lisp テクニックバイブル](http://www.amazon.co.jp/Emacs-Lispテクニックバイブル-るびきち/dp/4774148970)
13章にhelmの前身であるanything.elの解説が載っています。anythingの話ですがほとんどhelmにも通じる内容で参考になります。
* M-x describe-function RET helm
* M-x describe-function RET helm-candidates-in-buffer

他にどこかに情報まとまっているのを見かけた方いれば、ぜひ教えていただけるとうれしいです。
MavericksでDockからEmacs.appを起動するとカレントディレクトリが"/"になってしまう件への対応（現在では不要）


[MavericksでDockからEmacs.appを起動するとカレントディレクトリが"/"になってしまうということからシェルスクリプトをアプリケーションバンドルにする方法を調べてしまったのですが](http://qiita.com/h12o@github/items/1410707dd9e7135d207a)、一方、MavericksでDockからEmacs.appを起動するとカレントディレクトリが"/"になってしまう件への対応はというと、`~/.emacs.d/init.el`に以下のコードを追加して対処しました。単純に`(cd "~")`するだけでは、一部のバッファのカレントディレクトリが`/`のままだったのです…（実はこれでもスプラッシュである`*GNU Emacs*`バッファはカレントディレクトリが`/`のままで、仕方なく`(setq inhibit-splash-screen t)`を入れてそもそもスプラッシュを出さないようにしました…）

```el:~/.emacs.d/init.el
(setq inhibit-splash-screen t)
(defun cd-to-homedir-all-buffers ()
  "Change every current directory of all buffers to the home directory."
  (mapc
   (lambda (buf) (set-buffer buf) (cd (expand-file-name "~"))) (buffer-list)))
(add-hook 'after-init-hook 'cd-to-homedir-all-buffers)
```

そして、[@_jyaneさんから「気になるので楽しみにしています!」](https://twitter.com/_jyane/status/397963181298946048)とコメントをいただいたので以上のコードをアップロードしようと思ったら、[znzさんのpull requestが「fix default-directory on Cocoa and 10.9」として取り込まれていた](https://github.com/mxcl/homebrew/commit/7f94d650f2d6cb38bb0ae405c6098b3400a0edd6)という…
ゲーム制作計画3日目！

#cocos2d-html5について
先日試そうと思ったのはcocos2dの別のもの（iosなどで動かせるタイプ）
だということを教えていただいたので、改めてcocos2d-html5を試してみようと思います。
cocos2d-html5エンジンが凄い件（http://d.hatena.ne.jp/tsugehara/20130725/1374767680）を参考に実行してみます。
上記のサイトではサンプルプログラムの紹介を行っています。
自分でダウンロードしたフォルダのサンプルはなぜか動作しなかった（要研究）のですが、
既にネット上にあるものは動作しました。
いろいろなことができるようですね。
夢が広がります。
タイルの感じからパズルゲームや横スクロール系も作りやすそうですし、
エフェクトもパーティクルを使用して作れそうです。

プログラムについてはとりあえず【JS/Cocos2D-html5】HelloWorldサンプルをいじる【設定ファイルらへん】（http://kotazi.com/archives/565）を参考に眺めてみます。
cocos2d-html5はjsで記述するようです。
htmlもjsもわからない私には厳しいところ。

まずサンプルが動かないのをなんとかしたいところです。
chromeでもIEでも動きませんでした。
xamppを入れてみたのですが変化はありませんでした。
今日のところはあきらめて改めてもう少し調べなおしたいと思います。

#unity
unityを使ってからかなり時間が空いてしまったので勘をとりもどしたい（もともとないかも）と思います。
とりあえず簡単なボーリングを作ってみました。
まんまです。
![ボーリング01.png](https://qiita-image-store.s3.amazonaws.com/0/32926/de5b73e5-6ef4-8ba5-9810-a70f6a93736d.png)
ここまでまだ一文字もコードを書いてません。
さすがの優秀さです。
実は今のところカメラの背後に滑り台が置いてあるだけなので、
発射位置や強さ、方向、回転の調整はできるようにしたいですね。
今日はここまでにしたいと思います。
おやすみなさい。
Chocolateyでエラー「The schema version of ...」が出たので再インストールしたという話

　Windows向けのパッケージ マネージャである「Chocolatey」を使っていたときの出来事についてです。つまらない解決のしかたをしたので参考までです。

##エラーでcinstもupdateもできない
　最近、Chocolateyを更新しようとコマンドを打ったところ、次のようにエラーが返ってきてしまいました。（ちなみに、chocolatey searchはエラーが出ずにちゃんと動きました）
![choco.png](https://qiita-image-store.s3.amazonaws.com/0/32800/ec72276a-30a2-5d85-d059-fa2a67f2772d.png)

　エラー曰く、NuGetをアップデートしてね、という感じのはずなので、さっそくアップデートしてみたのですが、同じコマンドで同じエラーを返されてしまいました。

##仕方ないので再インストール
　こんなことで時間を取られたくないし、しかたがないので今回はChocolateyを再インストールすることにしました。再インストールの手順は簡単で、[Chocolateyのページ](http://chocolatey.org/ "Chocolatey")に書いてあるインストール用コマンドを、コマンドライン（PowerShellではない）上で実行するだけです（つまり普通にインストールするときの手順）。

　エラー自体の原因は分からなかったし、再インストールで解決というのも情けないですが、以上でとりあえずまた元気に走り回るChocolateyの姿を取り戻しました。
TypeScriptを使ってみたが

altJSは必要だろう、ということでTypeScriptを触ってみた。

が、moduleを使ったコードが動かないということが分かり、2013/11/27時点での導入は時期尚早という結論を得た。

以下、やったこと。

```TypeScript:Jabara.ts
export module Jabara {
    export class Animal {
        constructor(private name: string) {
        }
        cry() {
            console.log(this.name);
        }
    }
    export class Dog extends Animal {
        cry() {
            super.cry();
            console.log("Bow!");
        }
        cryLazily() {
            setTimeout(() => {
                this.cry();
            }, 3000);
        }
    }
}

module B {}
```

```TypeScript:main.ts
import m = require('Jabara');
new m.Jabara.Dog('アロー').cryLazily();
```

moduleを含むTypeScriptソースはcommonjsとamdの２つの方式（？）でコンパイル出来るのだけど、その両方で試してみて動かない。

commonjsの場合、```require```関数がないので動かない。

amdの場合```define```関数がないので動かない。

困った。
CoffeeScriptは静的な型がない点で、あまり使うのに気が進まない。どうしたものか・・・

## さっそく追記
現時点でmoduleをうまく使う方法がQiitaにて紹介されていました。

[これさえやれば大丈夫! TypeScriptのImportが取っ付きにくい人向け](http://qiita.com/armorik83/items/d93fb9c80c489f0fabcf)

これを読んで、次のようにコードを修正したら動きました。

```TypeScript:Jabara.ts
module Jabara {
    export class Animal {
        constructor(private name: string) {
        }
        cry() {
            console.log(this.name);
        }
    }
    export class Dog extends Animal {
        cry() {
            super.cry();
            console.log("Bow!");
        }
        cryLazily() {
            setTimeout(() => {
                this.cry();
            }, 3000);
        }
    }
}

module B {}
```

```TypeScript:main.ts
/// <reference path="Jabara.ts" />
new Jabara.Dog('アロー').cryLazily();
```

はまりポイントあり。
Jabaraモジュールをエクスポートしたかったので、当初は

```TypeScript
export module Jabara {
```

と書いていたら、これがまずかった。exportを省いて

```TypeScript
module Jabara {
```

と書けばOK。うーん、分かりにくい。
Mathematicaでウォーリーを探すには？

Stack Overflowで見かけたちょっと変わった質問とその回答。

質問：[How do I find Waldo with Mathematica?](http://stackoverflow.com/questions/8479058/)

回答：[見つけた！](http://stackoverflow.com/questions/8479058/8479757#8479757)
なんでデータベースって"シリンダー(筒)"で表記するの？

Stack Overflowで見かけたちょっと変わった質問とその回答。

質問：[Why is a database always represented with a cylinder?](http://stackoverflow.com/questions/2822650/)

回答：かつて記憶装置は [ドラムメモリ](http://stackoverflow.com/questions/2822650/2822750#2822750) と呼ばれていました。
なんで3つのコンパイラともこのC++プログラムを受け入れてくれないのさ？

Stack Overflowで見かけたおかしな質問とその回答。

質問：[Why is this program erroneously rejected by three C++ compilers?](http://stackoverflow.com/questions/5508110/)

回答：[まじめな答え](http://stackoverflow.com/questions/5508110/5508168#5508168) 
回答：アクロバティックな答え [その１](http://stackoverflow.com/questions/5508110/5509538#5509538) とか [その２](http://stackoverflow.com/questions/5508110/5513853#5513853) （これ以外にも色々あります）
さくらVPS導入時の参考ブログ

さくらVPS導入のときに参考にしたブログ
初心者向けのさくらVPSマニュアルサイト
http://www.xn--vps-073b3a72a.com/
Macならさらに
http://www.sawadaru.com/blog/?p=188
あとはおこのみでGitも入れれば快適かと
Unity4.2でterrainのHeightmapのI/Oが移動してた


terrainの`Inspector`の1番右にあるギアアイコンを選択して、

1番下に`Import Raw...`と`Export Raw...`ボタンを確認。

![2013-11-27 21-42-10 cap 2013-11-27 21.38.11.png.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/92344be2-c5e6-f9e7-b63f-baeaedbdd915.jpeg "2013-11-27 21-42-10 cap 2013-11-27 21.38.11.png.jpg")

メチャ探してしまった。

4.3は触ってないので、わかりません。
JavaFX TreeViewのカスタマイズ - その1：TreeItemのデータクラスの作成

TreeViewというウィジェットはJavaFXに限らず、制御が面倒です。TreeViewを操作するユーザにとっては、アイテムの編集、アイテムのDrag and Dropによるコピーや移動、アイテムの追加/削除などの機能は、ごく当たり前です。しかし、もともとTreeViewにはこれらの機能が備わっていないため、プログラマが自前でゴリゴリ作る必要があるのです。

![TreeView.gif](https://qiita-image-store.s3.amazonaws.com/0/33023/44aedb4b-b7d7-7246-a9c9-bb14eeeb29c2.gif)

TreeViewは、大きく4つの部品で構成します。GUI部品としてのTreeViewとTreeCell、モデルとしてのTreeItemとそのデータです。複数個のTreeItemを親子関係になるようにつなぎ合わせることにより、木構造を表現します。

TreeItemのルート（一番上の親）をTreeViewに渡すと、その木構造に合わせてTreeView上にTreeCellが貼り付けられます。個々のTreeItemにはデータがあり、そのデータのtoString()が返す文字列がTreeCell上でラベルとして表示されます。つまり、TreeCell、TreeItem、データは、1対1対1の関係にあります。

今回はTreeItemに紐付ける汎用的なデータとして、TreeItemDataクラスを作ります。

```java:TreeItemData.java
package jfxtreeview;

/**
 *{@link javafx.scene.control.TreeItem}用のデータです。
 */
public class TreeItemData {
	private final String name;	//名前
	private final Type type;	//種類(グループ/アイテム)

	/**
	 *コンストラクタです。
	 *@param name 名前
	 */
	public TreeItemData(String name) {
		this(name, Type.ITEM);
	}

	/**
	 *コンストラクタです。
	 *@param name 名前
	 *@param type 種類
	 */
	public TreeItemData(String name, Type type) {
		this.name = name;
		this.type = type;
	}

	/**
	 *名前を取得します。
	 *@return 名前
	 */
	public String getName(){
		return this.name;
	}

	/**
	 *種類を取得します。
	 *@return 種類
	 */
	public Type getType(){
		return this.type;
	}

	/**
	 *文字列表現を返します。
	 *{@link #getName()}と同じ文字列を返します。
	 *@see #getName()
	 */
	@Override
	public String toString(){
		return this.getName();
	}

	/**
	 *TreeItemの種類です。
	 */
	public enum Type {
		/**グループです。*/
		GROUP,
		/**アイテムです。*/
		ITEM,
	}
}
```

TreeItemDataのプロパティは、「名前」と「種類」の2つだけです。また、内部クラスとしてenum型のTypeもあります。

TreeItemDataはtoString()が「名前」を返すようになっていて、それがTreeCell上でラベルとして表示されます。「種類」は、TreeCell上で「フォルダ」と「ファイル」のアイコンを表示させるためにあり、Type.GROUPまたはType.ITEMを指定します。GROUPなら「フォルダ」のアイコン、ITEMなら「ファイル」のアイコンが表示されるようにします。

このTreeItemDataを、TreeItemのsetValue()で設定したりgetValue()で取得したりするわけです。

今回はここまでです。次回はTreeCellについて触れる予定です。
Javascriptメモ：連想配列とオブジェクト

### この二つって何が違うの？ ###

と前々から思っていたのだが、どうやら連想配列はオブジェクトの一種だと考えていいみたい。
それにしても書き方が一つでないから、正直ちょっとややこしい。

##### 作成するとき #####
```js

var pattern1 = new Object({key:"value",key:"value"});
var pattern2 = {key:"value",key:"value"};
//いずれも中身を'key':"value"としても同じ
```

##### 参照するとき #####
```js
var pattern1 = obj.key;
var pattern2 = obj['key'];
```

ちなみに

```js
new Array({key:"value"});
```

はたぶん無理。
連想配列って呼び方がよくないのでは？と思う。

参考ページ：http://js.tank.jp/javascript/post.html
ダウンロードしたファイルを ls したときの @ マークを消す


.app ファイルとかなら、一度 GUI 上で実行すると「ダウンロードしたファイルだけど本当に実行するかい？」ってダイアログが出て了解するとこのマークは消えるんだけど、ダウンロードしたものをコマンドラインから実行ができないとかいうときに困ることになる。

そもそも何なのかとか、以下を参考にした。

* [Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。 - kanonjiの日記](http://d.hatena.ne.jp/kanonji/20100912/1284292517)

Mac OS X Tiger で導入された EA（Extended Attributes）というファイルのメタ情報が付いていると表示されるらしい。
`xattr` コマンドでどんな EA が付いてるかを見たり、消したりの操作ができる。

```bash
$ ls -la hoge.file
-rm-r--r--@  1 tmd45 staff   32 11 27 20:56 hoge.file

# 属性を確認
$ xattr hoge.file
com.apple.quarantine
# 属性を削除
$ xattr -d com.apple.quarantine hoge.file

$ ls -la hoge.file
-rm-r--r--   1 tmd45 staff   32 11 27 20:56 hoge.file

```

参考記事では `xattr`  のマニュアルが無いとなっていたけど、いまは有る様子で `man xattr` で情報も見れる（長いので割愛）。 "display and manipulate extended attributes" コマンドらしい。

```sh:xattrコマンドのヘルプ
$ xattr -h
usage: xattr [-l] [-r] [-s] [-v] [-x] file [file ...]
       xattr -p [-l] [-r] [-s] [-v] [-x] attr_name file [file ...]
       xattr -w [-r] [-s] [-x] attr_name attr_value file [file ...]
       xattr -d [-r] [-s] attr_name file [file ...]
       xattr -c [-r] [-s] file [file ...]

The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to the string attr_value.
The fourth form (-d) deletes the xattr attr_name.
The fifth form (-c) deletes (clears) all xattrs.

options:
  -h: print this help
  -l: print long format (attr_name: attr_value and hex output has offsets and
      ascii representation)
  -r: act recursively
  -s: act on the symbolic link itself rather than what the link points to
  -v: also print filename (automatic with -r and with multiple files)
  -x: attr_value is represented as a hex string for input and output
```

デフォルトでこれを付かなくする設定とか無いのかな？
セキュリティに関わる部分っぽいし一律 OFF にするのもいかがなものかとも思うけど。
シェルスクリプトでコマンドが叩けなかったら〜するやつ

# gruntの場合
```bash
if which grunt >/dev/null 2>&1; then
    echo 'gruntがインストールされている'
else
    echo 'gruntがインストールされてない'
fi
```
# 追記 : こっちのがいいっぽい
```bash
which grunt >/dev/null 2>&1
if [ "$?" -eq 0 ] ; then
    echo 'gruntがインストールされている'
else
    echo 'gruntがインストールされてない'
fi
```

ちなみに```>/dev/null 2>&1```は標準出力しないような設定らしい。
確かに出なかった。

# 参考リンク
http://www.usupi.org/sysad/120.html
http://shellscript.sunone.me/
http://stackoverflow.com/questions/8886065/bash-script-error-catching
http://stackoverflow.com/questions/1298066/check-if-a-package-is-installed-and-then-install-it-if-its-not
AdvancedCustomFieldsのget_fieldをforeachで使うときの注意点


## AdvancedCustomFieldsとは？

WordPressのカスタムフィールドを便利にしてくれるAdvancedCustomFieldsというプラグインがあります。

- [ACF { Advanced Custom Fields Plugin for WordPress](http://www.advancedcustomfields.com/)
- [【WordPress】Advanced Custom Fieldsでカスタムフィールドを自在に操る方法 ｜ KLUTCHE](http://klutche.org/archives/1395/)
- [僕がAdvanced Custom Fields（アドバンスドカスタムフィールズ）を選んだ理由 ｜ ホームページ制作,群馬,アーチWeb制作室](http://www.arch-web.jp/wordpress/1211/)

フィルターもたくさん用意されており、カスタマイズもかなり細かいとこまでできちゃいます。

- [ACF { Filters Archives](http://www.advancedcustomfields.com/resources/resource-category/filters/)
- [WordPress Advanced Custom Fields プラグインで不要なフィールドを削除する](http://ounziw.com/2013/11/06/advanced-custom-fields-remove-fields/)

非常に強力でいつもお世話になっているプラグインなのですが、一点だけ問題があります。

それはカスタムフィールドの値をするための専用の関数、`get_field()`についてです。

## get_field()の返り値でハマる

例えば以下のコード。

```php
<?php echo get_field('hoge'); ?>
```

カスタムフィールド`hoge`の値を取得して表示する単純なコードです。
`hoge`に登録されている値が１つなら正常に表示されます。

しかし、WordPressのカスタムフィールドは同じキー名で複数の値が登録できます。
`hoge`という名前で２つ以上の値が表示されていた場合、上記のコードは`Array`と出力されます。

これは便利は便利なのですが、同一キー名で **１つ以上** の値を登録して、 **foreach()** を使って表示するときに問題が起きます。

例えば以下のコードです。

```php
<?php
  foreach(get_field('hoge') as $field) :
    echo $field;
  endforeach;
?>
```

上記のコードは、`hoge`に登録されている値が１つであろうと、０であろうと１万であろうと、一応問題なく動作します。

しかしサーバーの環境によっては、`hoge`に登録されている値が１つのとき、以下のようなエラーが出力されます。

```
Warning: Invalid argument supplied for foreach() in 〜〜〜〜〜
```

これはエラーというか正確には警告で、配列で渡すはずの第一引数が文字列になっているために出力されるされるようです。

- [Warning: Invalid argument supplied | PHPのQ&A【OKWave】](http://okwave.jp/qa/q6075040.html)

## 付け焼き刃での解決策

これは警告なので、基本的には無視しても問題ありません。
`.htaccess`や`functions.php`で出力しないよう設定すれば一応解決します。

```.htaccess
php_flag display_errors Off
```

```functions.php
# 以下２つ、どちらでもOK
error_reporting(0);
ini_set('display_errors', '0');
```

- [PHP: error_reporting - Manual](http://php.net//manual/ja/function.error-reporting.php)
- [PHP: ini_set - Manual](http://php.net//manual/ja/function.ini-set.php)

しかし上記の方法だと、他のエラーや警告も全部出力されなくなるので、それはそれで問題となります。

## 根本的な解決策

なんとかならんかなーと考えた結果が以下のコードです。
（前述したリンクに同じことが書いてあります。）

- [Warning: Invalid argument supplied | PHPのQ&A【OKWave】](http://okwave.jp/qa/q6075040.html)

```php
<?php
  foreach((array)get_field('hoge') as $field) :
    echo $field;
  endforeach;
?>
```

`get_field()`の前に`(array)`を付けて、文字列だろうと無理やり配列に型変換しています。

フィルターを使って`get_field()`の返り値を配列で固定してしまうことも考えたのですが、問題となるのは`get_field()`を`foreach()`で使った場合だけなので、これで統一することにしました。

これからAdvancedCustomFieldsを使う人の助けになればこれ幸いであります(・ω・)ﾉ
暇すぎるけど意識高めたい時に名言を聞き続けるコマンド

mac限定！

    alias saying='while (true) do f=$(fortune); echo "$f"; echo ""; say "$f"; sleep 10; done'

あらかじめ`fortune`コマンドをインストールしておきまうs

    brew install fortune

あとはプロンプトでコマンドを打ち込むだけで意識高まる

    saying
コマンドを数秒間隔で実行し続けるエイリアス作っておくと便利


    loop () { while (true) do $@ ; sleep 2; done;}

`watch`コマンド使えよって話ですがある程度の変化していく間隔のログを見たい時ですね。
コマンドライン上にログを吐き続けていってサラッと読めるようなの。

    loop ps aux | grep [s]3cmd

とかやれば`s3cmd`のプロセスの使用メモリとか時間とか出て来て見返せる
T型のシーケンスを、任意サイズの配列のシーケンスに変える

タイトルから内容が分かりにくいですが、次のようなことをします。

```vbnet
For Each a In Enumerable.Range(1, 10).Buffer(5)
    For Each b In a
        Console.Write("{0} ", b)
    Next
    Console.WriteLine()
Next
```

を実行すると

> 1 2 3 4 5
> 6 7 8 9 10

と表示されます。で、タイトルの内容を処理するのが `Buffer()` です。
IEnumerable(Of T) に拡張メソッドを追加しています。
ソースコードを次に示します。

```vbnet:Buffer.vb

Module EnumerableExBuffer

    <Extension>
    Public Function Buffer(Of T)(
            ByVal source As IEnumerable(Of T),
            ByVal count As Integer
            ) As IEnumerable(Of T())

        If source Is Nothing Then Throw New ArgumentNullException("source")
        If count < 1 Then Throw New ArgumentOutOfRangeException("count")

        Return Buffer_(source, count)
    End Function

    Private Iterator Function Buffer_(Of T)(
            ByVal source As IEnumerable(Of T),
            ByVal count As Integer
            ) As IEnumerable(Of T())

        Dim list = New List(Of T)(count)
        For Each item In source
            list.Add(item)
            If list.Count = count Then
                Yield list.ToArray()
                list.Clear()
            End If
        Next
        If list.Count > 0 Then
            Yield list.ToArray()
        End If
    End Function

End Module

```

実際にはどんな使い方があるかというと、一例で、文字列"414243444546"を"ABCDEF"に変換するときに

```vbnet
Dim s = Encoding.ASCII.GetString(
    "414243444546"
    .Buffer(2)
    .Select(Function(a) New String(a))
    .Select(Function(a) Convert.ToByte(a, 16))
    .ToArray())
```

と書ける。文字列は `IEnumerable(Of Char)` に変換できるので、`.Buffer(2)` で 2文字の配列のシーケンスにします。その後、Char の配列から文字列を作成し、Convert.ToByte で16進文字列をバイトに変換し、最後にバイト配列にしています。作成されたバイト配列を ASCII でデコードすれば目的の文字列が得られます。
Unzip from StringIO, Using Rubyzip

Requires Rubyzip 1.1.0+

Given a `data` of Zip file that is read from an IO, extract that data into a Hash.

```ruby
def unzip(data)
  fin = StringIO.new(data)

  entries = {}

  ::Zip::InputStream.open(fin) do |fzip|
    while entry = fzip.get_next_entry
      entries[entry.name] = fzip.read
    end
  end

  entries
end
```

Example:

```ruby
entries = unzip(open("http://example.com/archive.zip").read)
entries["file.txt"] #=> "Hello World\n" (File Content)
```
Genymotion2.0のGCMなどGoogle Apps周りの問題を解決する


## 問題
GoogleApps系のライブラリをGenyMotion2.0から持たなくなってしまったようです。

なのでGenyMotion上でGCMなんかを使っているアプリを動かすと、以下のエラーを吐いてクラッシュしていました。

```
java.lang.UnsupportedOperationException: Device does not have package com.google.android.gsf
```

一応、GenyMotionチームが解決に向けて鋭意開発を進めているようなのですが、まだGoogleApps系は搭載されていない模様。

これがないとGCMだけでなく、PlayStoreや課金周りの対応もできない模様。

というわけで、公式で解決されるまでの対症療法的解決策について。

## 対策
参考ページにあったとおり、
http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2
から、必要なバージョン向けのGoogleAppsパッケージのzipファイルをダウンロード。
あとはzipファイルをGenyMotionのVMに対してドラッグアンドドロップすると、パッケージのインストールが始まります。
完了したらVMを再起動してください。
以上でGenyMotion内にてGoogleApps系のパッケージが利用可能になります。

ちなみに上のGoogleAppsパッケージはGoogle公式などではなく、もともとCyanogenModなど向けのパッケージの模様です。

## 参考
http://www.webupd8.org/2013/11/android-x86-emulator-genymotion-20.html

http://blog.zeezonline.com/2013/11/install-google-play-on-genymotion-2-0/
Rails4でTwitterStreamingAPIを使う その1


Ruby2.0，Rails4で確認

tweetstream gemを使用してTwitterStreamingAPIでデータ取得を試してみました。

今回は

### 目標：ハッシュタグがyoutubeとなっているtweetを取得してlogに表示する

という所までやってみたいと思います。

[長くなってしまったので詳細に関してはブログにまとめました。](http://blog.hello-world.jp.net/?p=830)

### 初期設定

* Gemfileにtweetstreamを追加。

```Gemfile
gem 'tweetstream'
```

* initializerにtweetstream設定を追加

```config/initializers/tweetstream.rb
TweetStream.configure do |config|
  config.consumer_key       = 'YOUR KEY'
  config.consumer_secret    = 'YOUR SECRET'
  config.oauth_token        = 'YOUR ACCESS TOKEN'
  config.oauth_token_secret = 'YOUR SECRET TOKEN'
  config.auth_method        = :oauth
end
```

### tweet収集の部分をdaemon化

* script/twitter_streaming.rbを作成

```script/twitter_streaming.rb
ENV["RAILS_ENV"] ||= "development"

root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
require File.join(root, "config", "environment")

daemon = TweetStream::Daemon.new('twitter_streaming', :log_output => true)
daemon.on_inited do
  ActiveRecord::Base.connection.disconnect!
  daemon_logger = Logger.new(File.join(Rails.root, "log", "stream.log"))
  Rails.logger = ActiveRecord::Base.logger = daemon_logger
  Rails.logger.debug "Listening..."
end
daemon.on_error do |message|
  Rails.logger.error message
end
daemon.track('#youtube') do |tweet|
  Rails.logger.debug tweet.text
end
```

* daemonを起動

```
RAILS_ENV=development ./bin/rails runner script/twitter_streaming.rb start
```

* ログを確認すると#youtubeを含むtweetが記録されていきます

```
tail -f log/stream.log
```

次回は取得したtweetをMongoDBに保存するようにしてみたいと思います。

### 参考
* [Rails4でTwitterStreamingAPIを使う その1](http://blog.hello-world.jp.net/?p=830)
* [tweetstream / tweetstream](https://github.com/tweetstream/tweetstream)
* [The Streaming APIs](https://dev.twitter.com/docs/streaming-apis)
* [Streaming API keyword matching](https://dev.twitter.com/docs/streaming-apis/keyword-matching)
* [第3回Twitter API勉強会 - ストリーミングAPI #twtr_hack](http://www.slideshare.net/yusukey/3twitter-api-api)
【iOS】UITableViewCellに設置したUIImageViewに非同期に画像を読込む


Instagramとかの写真共有アプリでやってるやつです。

最初はGCDを使っていたのですが、どうも上手く行きませんでした。
別スレッドで実行している間にUITableViewがスクロールされてしまうと
同一インスタンスのUITableViewCellに対して、複数のスレッドが同時に実行されてしまってうまくいきませんでした。

もちろんちゃんと制御すれば、GCDでも出来るのでしょうが諦めてしまいました。

で、使ったのが **NSBlockOperation** です。
NSBlockOperationならスレッドのキャンセルもできるので、うまくいくんじゃないだろうか、と。

以下の、`setPost`関数はUITableViewCellを継承した自作クラスのPublic関数です。
UITableViewを管理しているUIViewController内の`cellForRowAtIndexPath`内で呼んでいます。

```objc
- (void)setPost{
    _photoImageView.image = nil;
    
    [self setPhotoImage];
    
    [self setNeedsLayout];
}
```
`setPost:`関数内の`[self setPhotoImage]`関数内でイメージの取得処理を行っています。

```objc
- (void)setPhotoImage
{
	//Queueを作成
    if (!_queue){
        _queue = [[NSOperationQueue alloc] init];
    }

	//既に実行されているスレッドがある場合はキャンセルする
    [_queue cancelAllOperations];
    
    //既にキャッシュされている画像なら表示して終了
    UIImage* image = //①画像のキャッシュ管理クラスから画像を取得
    if( image ){
        [_photoImageView setImage:image];
        return;
    }
    
    //まだキャッシュされていない画像は別スレッドで取得する
    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    __weak NSBlockOperation *weakOperation = operation; // 循環参照を避ける
    __weak PostCell* weakSelf = self;
    [operation addExecutionBlock:^{
        
		NSData* imageData = //②Web上からNSDataを取得
        
		UIImage* image = [UIImage imageWithData: imageData];
        
		//③取得した画像をキャッシュする
		//hogehoge

		//メインスレッドでUIImageViewにイメージをセットする
		[[NSOperationQueue mainQueue] addOperationWithBlock:^{

			//Queueがキャンセルされていたら画像を設定せずに終了
			if (weakOperation.isCancelled) return;

			//UIImageViewに画像をセット
			[_photoImageView setImage:image];
            
			[weakSelf setNeedsLayout];
		}];
    }];
    
    [_queue addOperation:operation];
}
```

`setPhotoImage`関数内では以下のことを行っています。
１．NSOperationQueueを生成

２．スレッドのキャンセル

３．既に画像をキャッシュしていれば、キャッシュからイメージを取り出してUIImageViewにセットする。(キャッシュがあればここで終了)

４．画像を取得するNSBlockOperationを作成
４−１．Web上から画像データ(ここではNSData)を取得する
４−２．NSDataからUIimageに変換する
４−３．`[NSOperationQueue mainQueue]`を使って、メインスレッドのBlockを作成する
４−３−１．Queueがキャンセルされている場合は、イメージをセットしないで終了
４−３−２．Queueがキャンセルされていなければ、UIImageViewにイメージをセットする

５．４で作成したNSBlockOperationをQueueに追加する

Instagramみたいなことをやろうとしていたので
実際のコードには他にも色々と書いていますが色々と省略してしまっています。

このやり方が正しいのかは分かりませんが、とりあえずやりたいことは実現できました。
RSpecでpartialのrenderをテストする

# `render partial: 'partial_name'`をテストする
多分`gem 'webrat'`が必要です。

```rb
require 'spec_helper'

describe SampleController do
  render_views

  context 'GET show' do
    it 'renders patial with given name' do
      get :show, id: 1
      expect(response).to render_template(partial: '_partial_name')
    end
  end
end
```

ポイントは`render_views`と`render_template(patial: '_partial_name')`の部分。
`render_views`を記述しないとviewのコンテキスト以下は無視するっぽいです。
`_`がファイル名に入っている場合は記述する必要があります。
rails devise emailではなくてusernameでログインしたい

#rails devise emailではなくてユーザー名(username)でログインしたい

ex)https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address
http://d.hatena.ne.jp/CortYuming/20120705/p1


すでにrailsでdeviseが動いている状態

####ユーザー名カラムの追加
```bash
$rails g migration AddUsernameToUsers username:string
$rake db:migrate
```

####userモデルの修正
```rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
            :authentication_keys => [:login]

  # Setup accessible (or protected) attributes for your model
  attr_accessible :username, :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body

    attr_accessor :login
    attr_accessible :login

    def self.find_first_by_auth_conditions(warden_conditions)
        conditions = warden_conditions.dup
        if login = conditions.delete(:login)
            where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
        else
            where(conditions).first
        end
    end
end
```

####devise の viewを作成

```bash
$rails g devise:views
```

####devise の viewを編集

```bash
app/views/session/new.html.erb
$ diff new.html.erb new.html.erb.org
4,5c4,5
<   <div><%= f.label :login %><br />
<   <%= f.text_field :login, :autofocus => true %></div>
---
>   <div><%= f.label :email %><br />
>   <%= f.email_field :email, :autofocus => true %></div>
```

```bash
app/views/devise/registrations
new.html.erb
$ diff new.html.erb new.html.erb.org
6,8d5
<   <div><%= f.label :username %><br />
<   <%= f.text_field :username, :autofocus => true %></div>

edit.html.erb
$ diff edit.html.erb edit.html.erb.org
6,8d5
<   <div><%= f.label :username %><br />
<   <%= f.email_field :username, :autofocus => true %></div>
```

####確認
```bash
$vi application.html.erb
<% if notice %>
      <p class="notice alert"><%= notice %></p>
    <% end %>
    <% if alert %>
      <p class="alert alert-error"><%= alert %></p>
    <% end %>

    <% if user_signed_in?%>
      <p><%= current_user.email %></p>
      <p class="btn"><%= link_to "Sign out", destroy_user_session_path, :method => :delete %></p>
    <% else %>
      <p class="btn"><%= link_to "Sign up", new_user_registration_path %></p>
      <p class="btn"><%= link_to "Sign in", new_user_session_path %></p>
<% end %>
```

ブラウザで確認
usernameでログインできた。

OK
IE8でjqueryでxmlパースしてもうまく行かないときの対処（うろおぼえ）

## 想定状況

###### jquery（バージョン不明）を用いてajaxでxmlを取得する

## 問題点と解決方法

### 問題：IE8で確認するとxmlのパース処理がうまくいかない

### 解決方法

stackoverflowにずばりの回答がありました。
[XML not parsing in IE8](http://stackoverflow.com/questions/13792529/xml-not-parsing-in-ie8)

```js

$.ajax({
  url:url,
  dataType:'text',
  success:function(response){
    var $xml = $($.parseXML(response));
  }
});
```

jQuery.parseXML() API仕様
[jQuery.parseXML()](http://api.jquery.com/jQuery.parseXML/)
Terminal and other tips

### mkdir & cd
	$ mkdir /somedir/filename && cd $_


### less with ls

```terminal
$ ls -C | less

$ ls -C --color=always | less -R
```

```~./bash_aliases
alias lsp="ls -ah --color=always | less -R"
```

### Go back to the previous directory

```terminal
$ cd -
```
### Find gem path

```terminal
$ gem environment 
```

### grep in spec.rb

```terminal
# move to gem
# for rbenv
cd /Users/myname/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems
# for rvm
$ cd ~/.rvm/gems/ruby-1.9.3-p327/gems
$ find */spec -type f -name '*_spec.rb' | xargs grep -ho│ 'it .* do' | sort | uniq | less
```

### Scroll down and up after `ls -C | less`

- Type Ctrl-f and Ctrl-b to scroll down and up.

- Ctrl-d and Ctrl-u will scroll half window.


## Copy

Copy all files including hidden files to other dir.

```terminla
cp -a /source/. /dest/
# if you are inside the dir and copy all to other
cp -a . /dest/

```
capistrano3.0で非railsを配置してみる

capistrano 3.0.1使って非railsアプリをサーバ上に配置してみた。
capistrano2でやってみた記事はこちら [capistrano2で非railsを配置してみる - Qiita [キータ]](http://qiita.com/mechamogera/items/76cb4631f27eeac17fa1)

## 試してみた手順

* capistrano初期化
 * [capistrano/README.md at master · capistrano/capistrano](https://github.com/capistrano/capistrano/blob/master/README.md)参照

```bash
$ mkdir test
$ cd test

$ bundle init
$ echo 'gem "capistrano"' >> Gemfile
$ bundle install --path vendor/bundle

$ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified

$ tree -L 3
.
├── Capfile
├── Gemfile
├── Gemfile.lock
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
├── lib
│   └── capistrano
│       └── tasks
└── vendor
    └── bundle
        └── ruby
```

 * config/deploy/staging.rbで接続サーバを設定
  * コメントアウトしてあるところを参照

 * config/deploy.rbを設定
  * 一部コメントアウトを外して設定

```rb
set :application, 'MyTips'                                                                                          
set :repo_url, 'https://github.com/mechamogera/MyTips'
set :scm, :git

set :deploy_to, '/var/www/my_app'
set :keep_releases, 5
...
```

 * EC2(AmazonLinux)を作成
  * 以下のように初期設定

```bash
# EC2上
$ sudo yum install git httpd -y
$ sudo mkdir /var/www/my_app
$ sudo chown ec2-user:ec2-user /var/www/my_app
```
 * capistrano実行

```bash
$ bundle exec cap staging deploy
```
 * EC2側確認
  * current：現在のリリースへのシンボルリンク
  * releases/[日時]：リリース毎にリポジトリーのミラーから作成されるgit archiveの解凍ディレクトリ
  * repo：リポジトリのミラー(ディレクトリなければclone --mirror、あればgit remote updateかな)
  * share：各リリース間で共通なファイルが配置され各リリースにリンクされるはず

```bash
$ tree -L 2 /var/www/my_app/
/var/www/my_app/
├── current -> /var/www/my_app/releases/20131127025659 
├── releases
│   └── 20131127025659
├── repo
│   ├── branches
│   ├── config
│   ├── description
│   ├── FETCH_HEAD
│   ├── HEAD
│   ├── hooks
│   ├── info
│   ├── objects
│   ├── packed-refs
│   └── refs
├── revisions.log
└── shared
```

### capistranoのフローメモ
 * [Flow - Capistrano](http://www.capistranorb.com/documentation/getting-started/flow/)
  * 複数サーバーを指定した場合各フロー毎に各サーバーに処理を実施
  * 1つでも処理に失敗すると即停止

 1. deploy:starting 初期化
 1. deploy:started started hook
 1. deploy:updating releaseを取得して配置
 1. deploy:updated  updated hook
 1. deploy:publishing  currentのシンボルリンクを更新
 1. deploy:published  published hook
 1. deploy:finishing  余分なreleaseを削除
 1. deploy:finished  finished hook
rails devise 設定　備忘録

rails 認証機能　設定の備忘録

ex)http://railsgirls.jp/devise/

Rails 3.2.13
CentOS release 5.7 (Final)

###Gemfileにdeviseを追加とインストール

```bash
$vi Gemfile
$diff Gemfile Gemfile.org
40d39
< gem 'devise'
$bundle install
```

###devise セットアップ

```bash
$rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

  5. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================
```

###環境設定

```bash
$vi config/environments/development.rb
$diff development.rb development.rb.org
37,38d36
<
<   config.action_mailer.default_url_options = { :host => 'localhost:3000'}
```

```bash
$vi app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
を追加
```

###Model をセットアップ

```bash
$rails g devise user
$rake db:migrate
```

###ログイン画面

url:http://localhost/user/sigin_in

ログインできる
OK
Go用テストツールGoConveyの紹介

[GoConvey](https://github.com/smartystreets/goconvey)というGo用テストツールがあります。
特徴は下記7点だそうです。

1. Brilliant Web UI
2. Gracefully examine failing tests
3. Resolve panics and build failures
4. HTML5 desktop notifications
5. Readable terminal output
6. Responsive design for limited screen space
7. Test code generator

個人的には、下記の点が気に入っています。

1. ブラウザ上でテスト結果が表示される
2. ソース保存時にテストが実行される
3. テストが書きやすい

インストール方法は、いつものようにgo getでインストールすればOKです。

```shell-session
$ go get github.com/smartystreets/goconvey
```

実行方法は下記の通り。

```shell-session
$ $GOPATH/bin/goconvey
```

実行後、ブラウザを起動して下記URLにアクセスしてください。

```shell-session
http://localhost:8080
```

下記のような画面が表示されれば準備完了です。
![スクリーンショット_112713_023926_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/672f2b00-fd39-b56f-a71b-66890d45a91f.jpeg)


レスポンシブな画面なので、細くして表示するのも良いです。
![スクリーンショット_112713_024003_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/4995e502-ce6f-1772-80dc-662dad89a1fb.jpeg)

今はテストがないので、 0/0 assertions と表示されています。

早速テストを書くことにしますが、折角なのでテストコード生成機能を使ってみます。
画面上部の鉛筆アイコンをクリックすれば、テストコードの生成画面が出てきます。
インデントしない文字列はテスト関数名、インデントした部分はテストのスコープを意味するそうです。
とりあえず、うるう年計算プログラムのテストとなるスコープを書いてみました。

![スクリーンショット_112713_024909_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/1a05059b-8c49-81df-2a8d-c5d9569f1b6a.jpeg)

生成されたソースをコピペし、必要なimport文を書いて、テストコードのテンプレートが出来上がりです。

```go:leap_year_test.go
package main

import (
	. "github.com/smartystreets/goconvey/convey"
	"testing"
)

func TestLeapYear(t *testing.T) {
	Convey("西暦が400で割り切れる年はうるう年である", t, nil)
	Convey("400で割り切れない場合、西暦が100で割り切れる年はうるう年ではない", t, nil)
	Convey("100で割り切れない場合、西暦が4で割り切れる年はうるう年である", t, nil)
	Convey("4で割り切れない場合、うるう年ではない", t, nil)
}
```

保存した直後にGoConveyの画面が勝手にテストを実行します。
Convey関数の第3引数にテストを書くことになるのですが、ここではnilが入っているのでスキップ扱いになります。

![スクリーンショット_112713_025808_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/d479f5bb-8784-aa5f-b8e0-382785faa548.jpeg)

テストコードと実装を書いて保存した結果、仮実装に問題があってFAILと出ました(当たり前)
![スクリーンショット_112713_031149_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19943/0d4a23b5-8964-e4ac-7661-680aa47b563f.jpeg)

アサーションの書き方は、[Assertions · smartystreets/goconvey Wiki](https://github.com/smartystreets/goconvey/wiki/Assertions)をご参照ください。
よく使うものはGeneral Equalityに書かれている下記になるかと思います。
第1引数がactual, 第2引数がassertionの内容、あれば第3引数がexpectedになります。

* So(thing1, ShouldEqual, thing2)
* So(thing1, ShouldNotEqual, thing2)
* So(thing1, ShouldResemble, thing2)      // a deep equals for arrays and structs
* So(thing1, ShouldNotResemble, thing2)
* So(thing1, ShouldPointTo, thing2)
* So(thing1, ShouldNotPointTo, thing2)
* So(thing1, ShouldBeNil)
* So(thing1, ShouldNotBeNil)
* So(thing1, ShouldBeTrue)
* So(thing1, ShouldBeFalse)
* So(thing1, ShouldBeZeroValue)


また、 画面上部のベルをクリックして白から濃いグレーに変更すると、Chrome / SafariなどでDesktop Notificationが有効になります。ビルドの結果を、ブラウザを見ずに結果の通知を見ることができるわけです。

本テストは、いつものコマンドラインからのgo testでも実行することが出来ます。
結果も見やすいですし、アサーションも書きやすいですので、普段からGoConveyを使うのがオススメです。

本記事でGoConveyに興味が出ましたら、是非GoConveyをお試しください。
CentOS 5.6にAWS-CLIを入れた話

意外とすんなり入りました。

## Python 2.6を入れる

```shell-session
$ sudo yum install python26
$ python26 --version
# 入ってたらバージョン番号が表示される
```

パッケージが見つからなければ適当にepelとか追加するといいと思う。

## AWS-CLIを入れる（bundled installを利用）

<http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html#install-bundle-other-os>を参考に、AWS-CLIを入れますが、ちょっとだけ弄る必要があります。

```shell-session
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ cd awscli-bundle
```

installスクリプトを弄るのですが、編集内容は先頭一行を書き換えるだけ。

```shell-session
#!/usr/bin/env python26
```

（もともとは #!/usr/bin/env python となってた）

で、インストールを実行

```shell-session
$ ./install -i /usr/local/aws -b /usr/local/bin/aws
# なにやらゴニョゴニョされる

$ aws --version
# 入ってたらバージョン番号が表示される

$ aws configure
$ aws s3 ls
# バケット一覧が表示される
```

やったね！

今どきCentOS 5とかぷすす～　というのは置いといて、それでも入れなきゃいけない時はどうぞ。
Squeel



Squeelをためしてみたら、かなりうれしかった。
###さて、２週間前の日付以降のArtcle全部を検索するクエリー
以下の２つ、どちらがよみやすいか？
(ちなみに2.weeks.agoは、今日から数えて２週間前の日付を返すrubyのネイティブメソッドです）

Rails3の通常の記述によると

```
Article.where ['created_at >= ?', 2.weeks.ago]
```
...Squeeで書くと以下の通り

```
Article.where{created_at >= 2.weeks.ago}
```

私には、Squeelが肌にあいます。ちょっとした違いなんですけどね。

#ちなみに、これをnamed_scope定義して
app/model/artcle.rb にて

```
def self.written_since(date)
    Article.scoped.where{created_at >= date}
end
```

すると

```
Article.written_since(2.weeks.ago)
```
って書けて、より直感的?

参考URL
[#354 Squeel - RailsCasts](http://railscasts.com/episodes/354-squeel?language=ja&view=asciicast "#354 Squeel - RailsCasts")

[MetaWhere & MetaSearch - RailsCasts](http://railscasts.com/episodes/251-metawhere-metasearch?language=ja&view=asciicast "MetaWhere & MetaSearch - RailsCasts")

[ActiveRecord 3を使う(4) 比較演算が簡単になるMetaWhere](http://blog.ruedap.com/2011/04/19/ruby-sinatra-active-record-3-meta-where "ActiveRecord 3を使う(4) 比較演算が簡単になるMetaWhere")
【JavaScript】【解決】メソッドの作成

こんにちは。
今回はメソッドの作成を学習していました。

まずはこちら。
ドットインストールで学習しながら書いたコードです。
http://dotinstall.com/lessons/omikuji_js

```js
function getOmikuji(){
	var omikuji = ["大吉","中吉","小吉","凶"] ;
	var result = Math.floor(Math.random() * omikuji.length) ;
	//alert(omikuji[result]) ;
	document.getElementById('result').innerHTML = omikuji[result] ;
}
```

ここからは自分なりに。
外部ファイルから読み込むことにしたので、
HTMLのinputタグの中に onclick="getOmikuji()"と記載。
結果もHTML上で表示させたいので、こう。

```html
<h1>おみくじ</h1>
<p>あなたの運勢は・・・<span id="result"></span></p>
<input type="button" value="うんせいは？" onclick="getOmikuji() ;">
```

ここまではOKで普通に表示も可能。
現在悩んでいるのはうまくいかないこのコード

```js
function randumNum(){
	var num ;
	for(var i = 0; i < 10; i++){
		num = Math.random() ;
		document.getElementById(num).innerHTML ;
	}

}
```
```html
<h1>乱数</h1>
<p>こんかいは・・・<span id="num"></span></p>
<input type="button" value="数値の表示" onclick="randumNum() ;">
```

これがどうもうまくいかない。

JSの部分

```js
document.getElementById(num).innerHTML ;
```
を

```js
alert(num) ;
```

にすると10回表示されるのだが、上だとボタン押しても何も反応を示さず。
未解決メモ。
とりあえずひきつづき調査。

Qiitaは質問とかしてもいいんでしょうかね。
ブログだから別の質問サイトにするべきか。

それでは、これからもこんな駆け出しPGをよろしくお願いいたします。
（自己学習につながるので読むのも書くのもはまってきてしまいました）
Rubyの正規表現リテラルは左辺においたほうがいいんじゃないの？　って話

# なんで？
正規表現で使われる`=~`の実態は`Regexp#=~`なんですが、この時 **右辺に使えるのは`String`だけ** です。
ついでに、`String#=~`は`Regexp#=~`のシンタックスシュガーで、これによって辺を交換しても動作します。
（参照： http://osdir.com/ml/lang.ruby.japanese/2007-05/msg00058.html ）

世間（というか自分の周り）では、`"Hello" =~ /e/`と書くほうが圧倒的に多く、
それどころか`/e/ =~ "Hello"`と書けるのかどうか自信ない、なんて人もいました。

ところで、`Object#=~`があるのもあって、一応`5 =~ /5/`なんて書くこともできます。 **結果はnilです。**
これは`"5" =~ /5/`あるいは`5.to_s =~ /5/`と書けば意図通りです。
もちろん`/5/ =~ 5`とは **書けません**。前述のとおり、`Regexp#=~`は`String`しか受け付けないので。

でもこれ、危険ですよね？　to_sし忘れたらエラー出ない上に意図通り動かないんですよ？
自分は危険だと思います。ていうかこれでちょっとハマりました。

# だから
意図通り動かないならいっそ動きを止めちゃってもいいと思うの私。
動きを止めるか止めないかの違いなだけで、意図通りでないことは間違いないわけですし。
このあたりはポリシーの違いかもしれませんね。

人（プロジェクト）によっては、とりあえず例外吐くことだけは避ける方針のこともあるでしょう。
Javaでリテラルを左辺に書くのは、`NullPointerException`を避けるためでもありますしね。
\# Nullチェックをしなくてもいい、なんて理由ももちろんありますが。

でも、繰り返しになりますけど、意図通りに動かないなら動きを止めようが止めまいがバグには違いないわけで。
だったら察知しやすいほうが断然いいと思うんです。

# なので
コーディングルールで決まってない限りは正規表現リテラルを左辺に使うようにしたいなあ、なんて思います。

思うのですが、それともリテラルを右辺に置く実装上の理由があるのでしょうか？
このあたりを周りに聞いても「そういう慣習だから」とかそんな風にしか言われず、なんだかもやもやしてます。

# 追記
コメントや他もろもろで、「左辺にリテラル置くくらいなら`Regexp#match`使えば？」と指摘もらいました。その通りですorz

# 追記その２
`/5/ =~ 5`と書くぐらいなら`/5/.match(5)`と書いたほうがいい、と確かに思いました。
\# ワンラインで書いたことに大した意味はないです。
これだと、「メソッドの呼び出し」以上の印象を与えないので、コメントで指摘もらったような「気持ち悪さ」はあまり感じないように思います。

ただ、よくよく考えると、これって「左辺に書くか右辺に書くか」とはあんまり関係ない話なんですよね。

自分の主張は「右辺に書くと察知できないバグも左辺に書けば察知可能なんだから、左辺に書いたほうがよい」です。
どうあれ左辺に書くべきだ、までは思ってないのですけど、入力されるパラメータの型（と表現しておきます）が断定できないのであれば、より安全に、よりバグを察知しやすいように左辺に書くほうがいいのではないかな、と思います。
Windows でツールを使わず Node.js の複数バージョンを共存させる

Windows で複数バージョンの node を使うためのツールとして[nvmw](https://github.com/hakobera/nvmw) とか [nodist](https://github.com/marcelklehr/nodist) とかありますが、それらを使わずに複数バージョンを共存させる方法。

# メリット

 * 意図しない node のバージョンが走ることを防げる

# デメリット

 * デフォルトで node にパスが通っていない状態になるので起動が面倒になる

# やりかた

まず、普通にインストーラを落としてきて起動します。インストール先を聞かれる段階になったら、下の画像のようにインストール先にバージョン番号を含めます。パスが短いほうが嬉しい人は、`C:\node\v0.10.22` とかにしても構いません。

![node01.jpg](https://qiita-image-store.s3.amazonaws.com/0/6870/fa0ebe34-416e-a3a6-d67c-6233079d3b70.jpeg)

次に、インストールするコンポーネントを聞かれるので、Add to PATH だけ外します。これによって、意図せずに何らかのバージョンの node にパスが通った状態を防げます。

![node02.jpg](https://qiita-image-store.s3.amazonaws.com/0/6870/d5131368-0f2e-4a74-5017-5bbf7bd1513c.jpeg)

このままインストールを進めると、バージョン別の場所に node をインストールできます。node を起動する時はフルパスで指定して下さい。

grunt-cli とか yo とかを npm install -g でコマンドをインストールすると、`%APPDATA%\npm` にインストールされます。なので、grunt とかについても必要に応じてフルパスで実行するなりパスを通すなりする必要があります。

# 余談：どうしてそんなことするの？

自分のワークフローとして、Windows でコマンドプロンプト開く時にまず `cmd-[プロジェクト名].bat` を叩くところから始めるようにしてます。そのバッチファイルの中で、PATH に `"C:\Program Files\nodejs-v0.10.22"` やら `C:\Ruby200\bin` やらを足してバージョンを指定してます。このワークフローだとツールを使う必要がないので、こういったやりかたをしてます。

単純にコマンドプロンプトを起動しただけでは node にパスが通っていないので、それが不便だと思う場合はこの方法はオススメしません。

grunt-express-server が叩く node が、nodist で指定したものと違ったものになる（ことがある？）といった事案を聞いて、そういったツールを使わない方法も書いといたほうがいいかと思ったので書いた次第です。
NetCommons2でテンプレートの変更を自動で適用する方法。


XOOPSでモジュール開発してたときもテンプレート自動アップデートの仕組みを利用して、モジュールアップデート無しでテンプレート編集結果を適用してたので、それと同じ事をNetCommons2で行う方法です。

webapp/config/maple.inc.php line55

```
define('SMARTY_FORCE_COMPILE',     false);
```

この false を true に変更すれば常にテンプレート変更結果が反映されます。
10.9でhomebrewのインストール時にエラーがでる

marvericsにhomebrew入れようとしたらエラー出た

```shell-session
$ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
-e:4: syntax error, unexpected '<'
<!DOCTYPE html>
 ^
-e:5: syntax error, unexpected '<'
<html>
 ^
-e:7: syntax error, unexpected '<'
    <meta charset='utf-8'>
     ^
-e:8: syntax error, unexpected '<'
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
     ^
-e:8: syntax error, unexpected tIDENTIFIER, expecting end-of-input
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
                                              ^
```

[Homebrew公式ページ](http://brew.sh/index_ja.html)を確認したら微妙に引数のURLが変更になっているっぽい

```shell-session
$ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

Xcodeのcommand line toolsのインストール方法が変わってるから新規に10.9を始める人はhomebrewインストール前に下記のコマンドで前準備をしておきましょう

```shell-session
xcode-select --install
```

以上でhomebrewを利用する準備ができました＼(＞ヮ＜)／おしまい♪