OmniAICreator/Qiita-1.07M huggingface dataset:
phantomjsで出るエラーだけ追うスクリプト


phantomjsで某ページのスクリーンショット撮る、ってのがしたかったんですが、
どうも他のブラウザでは出てないけど、phantomでだけエラーが出てる! ということが分かり、
それだけ見つけるためのスクリプト書いてみました。

(書いたというか、examplesつなぎあわせ)

```javascript:errortracker.js
var system = require('system');
var url = system.args[1];

if (!/^https?:\/\//.test(url)) {
    console.error('Pass a url!');
    phantom.exit();
}

phantom.onError = function(msg, trace) {
    var msgStack = ['PHANTOM ERROR: ' + msg];
    if (trace && trace.length) {
        msgStack.push('TRACE:');
        trace.forEach(function(t) {
            msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : ''));
        });
    }
    console.error(msgStack.join('\n'));
    phantom.exit(1);
};

var page = require('webpage').create();
// page.viewportSize = { width: 320, height: 480 };
page.open(url, function (status) {
    if (status !== 'success') {
        console.error('Unable to access the network!');
        phantom.exit(1);
    }
    // phantom.exit();
});

```

こんなかんじで使う。

```
phantomjs errortracker.js http://fnobi.com/
```


まぁ、phantomjsあんまり使い慣れてなかったので、
ちょうどよい慣らしということで。


## 参考
 - https://github.com/ariya/phantomjs/blob/master/examples/arguments.js
 - https://github.com/ariya/phantomjs/blob/master/examples/technews.js
 - https://github.com/ariya/phantomjs/wiki/API-Reference-phantom#onerror
OS XのQtアプリで Alt+¥ でバックスラッシュが打てない……

バグらしい…… → http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeXworks#f4128341

円記号使わなそうだから [KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja "KeyRemap4MacBook") で全部 \ に固定した。
hubコマンドでPull Requestを送るときにセクションタイトルを記述する

[GitHubユーザーのためのhubコマンド](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)を使うとコマンドラインからpull requestを送信でき大変便利なのだけれど，普通のコミットメッセージと同じく`#`から始まる行はコメントと見做されるためセクションタイトルを書けない．と思っていた．

<blockquote class="twitter-tweet"><p><a href="https://twitter.com/yaotti">@yaotti</a> How about &#10;header&#10;=====</p>&mdash; kentaro (@kentaro) <a href="https://twitter.com/kentaro/statuses/388174765501857792">October 10, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

h1とh2はそれぞれ以下のように書けるので，`=`や`-`を使えば良いのでした．thanks @kentaro !

```
h1 header
========

h2 header
--------------
```

h3以上は書けませんが，とりあえずはこれで良さそう．
MathJaxの奇抜なconfig読み込み機能の実装方法

*注意: この記事で紹介している実装を真似すべきでありません。*

## MathJaxとは

[MathJax](http://www.mathjax.org/) というのはブラウザ上でTeXを書けるようにするJavaScriptライブラリです。TeXをJSに移植するようなライブラリはいくつかありますが、業界的にはほぼデファクト・スタンダード的な感じです。

## MathJaxではsrcにconfigファイル名を書く

そのMathJaxにはさまざまな設定項目があるのですが、それらをいちいち書くのが面倒かつ難しいので、よくある設定をまとめたファイルがリポジトリの中に置かれていて、それを読み込むだけでユーザはMathJaxをいい感じに使うことができます。そこまではいいのですが、そのconfigファイルの指定方法がなかなか奇抜です。

```html
<script src="/path/to/MathJax.js?config=TeX-AMS_HTML"></script>
```

なんと、まるでGETリクエストをしているかの如く、configファイル名を指定します。例えば上記の例の場合、こうしておくとMathJaxが自動的にTeX-AMS_HTML.jsという設定ファイルを別途読み込んでくれるのです。

なかなか見かけない設定方法ですね。でもこれ、一体どうやって実装されているのでしょう。というのも、まずMathJax.jsは完全に静的なファイルであって、つまり、普通にしていたら `?config=TeX-AMS_HTML` という指定があることを知りえないのです。

## これぞ力技

MathJax.jsのコードそれ自体が既に（悪い意味で）味わい深く、読み解くのになかなか苦労させられるのですが、この箇所を実装しているのは下記のコードです。

- [MathJax.js#L2867-L2882](https://github.com/mathjax/MathJax/blob/6ba3072b74a02b9f8a43fb6bfacd9ebeb6f12c7f/unpacked/MathJax.js#L2867-L2882)

ぱっと見ても何がなんだか分からないと思うので、簡単に説明すると

1. 全てのscript要素を取ってくる
2. その中でsrc属性が `MathJax.js(\\?.*)?` で終わるものだけを抽出
3. 何か変なオブジェクトに `(\\?.*)` の部分を設定する

つまり、自分がMathJax.jsという名前であるという暗黙の制約を利用して、自分で頑張って解析しているわけです。3で作られたオブジェクトのプロパティに応じて適宜configファイルが改めて別途読み込まれます。

CDNでMathJaxを提供しているので一つのscript要素で全てが完結する方が使う側は嬉しいだろう、という配慮なのでしょうが、はっきり言って有難迷惑だなぁと感じます。
iOS7でUIViewController上のUITableViewが上手く表示されないとき

魔法の呪文

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];

    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
}
```

これでViewがNavigationBarの下に突っ込まなくなる。

参考：
http://stackoverflow.com/questions/18900428/ios-7-uitableview-shows-under-status-bar
Twitter Cards利用申請

以前の記事は仕様を調べたのみ。
実際に申請してみた。

----

# 事前準備
* 申請用twitterアカウント
* サイトオーナー用twitterアカウント (twitter:siteタグを埋めるなら不要)
* Twitter Cards対応したページとそのURL

# 申請手順
1. 申請用アカウントでTwitterにログイン
1. Card Validatorにアクセス
 * https://dev.twitter.com/docs/cards/validation/validator
1. validate & apply タブを選択
1. Enter URL to validateと表示されているテキストボックスにCard対応したページのURLを入力してGo!をクリック
1. OKなら、Request Approvalボタンをクリックして
 * NGならタグを修正したりアクセス許可とかを見てみる
 * validatorがきちんと動いている保障もないので、色々調べる
  * 2013/10/10、Twitter Cardsの仕様ページすらinvalid card typeになっていたので、そんなこともあります
1. 以下の項目を埋めて申請する (デフォルトで埋まらない項目だけ書く)
 * Website Discription : サイトの説明
 * Website Twitter Username : 申請用twitterアカウント (twitter:siteタグあればそれがデフォルトで埋まる)
1. 数分後, Emailで指定されたアドレスにメールが届く (申請者Twitterアカウントのメールアドレス)
1. Twitterに投稿して確認してみる
 * 投稿からCard反映までに時間がかかる場合があるので注意 (申請とは関係なく)

# その他Tips

## 他人のアカウントで申請

* 申請時にデフォルトで埋まっている申請者のアカウント名を書き換える
 * => 申請通る == 誰でも申請可能
  * ツイートでドメインに紐づくアカウントを正しく表示するためtwitter:siteタグがあった方が良い
   * タグが無い場合、申請時のWebsite Twitter Usernameの値が使われる
   * ようは、タグがなければサイトオーナーに **誰でも任意** に指定して申請されてしまう

## 既に申請済のドメインに対して他のCard Typeで再申請

* => 今回の申請者にメールが届く (以前の申請者には届かない)
* => Web Twitter Nameは前に申請した時のものがグレイアウトで表示される(変更できない)
rspec shared_context

# 概要

* 名前の通り、contextを共有できる仕組み。

# 書き方例

```ruby:hoge_controller_spec.rb
require 'spec_helper'

describe HogeController do
  describe "Hoge 'create'" do
    shared_context "HogeController 201 Created", assert: :HogeCreated do
      # letとかbefore{}とか...
      # should eq とか
    end

    describe 'post to hoge' do
      context 'without body', assert: :PostCreated

      context '...' do
        # その他のテスト
      end
    end
  end
end
```

# はまったところ

* shared_contextの名前付けで重複するとrspecから怒られる
 * assertの名前が重複すると、どちらか一方だけが呼ばれる
  * hoge_controller_spec.rbに書いた場合、そのspecだけを実行すればこけない
  * 全体をテストするとこける
```bash
     1 WARNING: Shared example group 'HogeController 201 Created' has been previously defined at:
     2   /home/hoge/hoge/spec/controllers/hoge.rb:19
     3 ...and you are now defining it at: 
     4   /home/hoge/hoge/spec/controllers/fuga_controller_spec.rb:5
```
Google Test + Xcode5 / ""testing::internal::EqFailure(char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const

Xcodeのコマンドラインツールのテンプレートで作成したプロジェクトに
Google Testの静的ライブラリをリンクしてビルドすると EXPECT_EQ マクロに起因したエラーが発生する。

展開されたC++コードをコンパイラが解釈できていないのが原因。
Xcode設定で"C++ Standard Livrary"を"Compiler Default"にすると回避できる。

![スクリーンショット 2013-10-10 12.57.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/41675466-a122-9d85-0085-b014a100810f.png)
[rubymotion]Motion-fontawesomeでUIBarButtonItemを作る

Motion-fontawesomeは、FontAwesomeをRubymotionで使えるようにしてくれるモジュールです。

参考: [RubyMotion] Motion-fontawesomeっていうgems作りました
http://pchw.github.io/blog/2012/08/06/fontawesome/

上記のページではLabelでの使用例しかないですが、Buttonにも問題なく使えるみたいです。
今回やりたかったのは、UIBarButtonに使うということなので、そのやり方をメモしときます。

UIButtonを作って、UIBarButtonItemのcustomにそれを指定すればOK。(サンプルの表記はBubbleWrapの略記法)
UIButtonのsetTitleでMotion-fontawesomeのiconメソッドの値をセットしてやると、ちゃんとアイコンが出てくれました。 :D

```rb
   home = make_bar_button_item("home") do
      puts "home!"
    end

  def make_bar_button_item(icon_name, &block)
    button = UIButton.alloc.init
    button.setTitle(FontAwesome.icon(icon_name), forState:UIControlStateNormal)
    button.titleLabel.font = FontAwesome.fontWithSize(25)
    button.setTitleColor("#aaa".uicolor, forState:UIControlStateHighlighted)
    button.setTitleColor("#fff".uicolor, forState:UIControlStateNormal)
    button.sizeToFit
    bar_button = BW::UIBarButtonItem.custom(button, &block)
  end
```

こんな感じで。

![motion_fontawesome_sample.png](https://qiita-image-store.s3.amazonaws.com/0/15538/a1fb7059-8866-7cb0-ed79-cee29a3a5521.png)


ちなみに、MotionAwesome( https://github.com/derailed/motion-awesome ) という類似モジュールもあるのですが、
最新バージョンで試してみたところでは、サンプル通り書いても、MotionMapという依存モジュールがうまくインストールできないみたいで(僕のやり方が問題?)、こちらはコンパイルが通りませんでした。
CentOS6.3 に yum で Git の新しいバージョンを入れる


# yum のリポジトリに RPM Forge を追加する

GPGキーをインポートしておく

```
sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
```

RPM Forge の rpm をダウンロード

```
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```

ダウンロードした rpm をGPGキーで検証

```
rpm -K rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```

rpm をインストール

```
sudo rpm -i rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```

参考：[AdditionalResources/Repositories/RPMForge - CentOS Wiki](http://wiki.centos.org/AdditionalResources/Repositories/RPMForge)

# RPM Forge から Gitをインストールする

/etc/yum.repos.d/rpmforge.repo をエディタで開き`[rpmforge-extras]` セクションの enabled を 1 に変更

```
[rpmforge-extras]
…（省略）…
enabled = 1
```

あとは普通に `sudo yum install git` でインストール完了。

インストールの結果、バージョンは 1.7.11.3 になった。

```
$ git --version
git version 1.7.11.3
```

参考：[CentOS 6.3で、gitのバージョンアップ 一言多いプログラマーの独り言](http://programmer-jobs.blogspot.jp/2013/06/centos-63git.html)
waveファイルをiOSのシステムサウンドとして鳴らす方法


iOSでシステムサウンドとして使用出来るファイルは、以下を満たす必要がある。

* 長さは30秒以内
* フォーマットは、リニアPCM or IMA4(IMA/ADPCM)
* ファイル形式は、".caf" or ".aif" or ".wav"

参考：公式リファレンス [System Sound Services Reference](https://developer.apple.com/library/ios/documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html)

例：sound.wavというファイルを鳴らす場合（※ AudioToolbox.frameworkが必要）

```objc
#import <AudioToolbox/AudioToolbox.h>

SytemSoundID *mBeep;

// システムサウンド生成
NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &mBeep);

// 再生
AudioServicesPlaySystemSound(mBeep);

// 破棄
AudioServicesDisposeSystemSoundID(mBeep);
```
s2mai を利用するときの pom.xml の記述

メモ

```xml:pom.xml-spenit
<dependencies>
	<dependency>
		<groupId>org.seasar.mai</groupId>
		<artifactId>s2mai-tiger</artifactId>
		<version>0.9.7</version>
		<exclusions>
			<exclusion>
				<groupId>ozacc-mail</groupId>
				<artifactId>ozacc-mail</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>jp.sourceforge.spring-ext</groupId>
		<artifactId>ozacc-mail</artifactId>
		<version>1.2.3</version>
		<scope>compile</scope>
	</dependency>
</dependencies>

<repositories>
	<repository>
		<id>org.seasar.maven</id>
		<name>Seasar Framework</name>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
		<url>http://maven.seasar.org/maven2/</url>
	</repository>
	<repository>
		<id>repo1.maven.org</id>
		<name>repo1.maven.org</name>
		<url>http://repo1.maven.org/maven2/</url>
	</repository>
	<repository>
		<id>repo2.maven.org</id>
		<name>repo2.maven.org</name>
		<url>http://repo2.maven.org/maven2/</url>
	</repository>
</repositories>
```
CentOS5にansibleをインストールするメモ

###デフォルトだと、pythonのバージョンが2.4なので、アップデート
```bash
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
```

# vi /etc/yum.repos.d/epel.repo
```ini
[epel]
...
enabled=0
```

```bash
yum -y install python26 --enablerepo=epel
```

###gitが入ってない場合はインストール
```bash
yum install git
```


###ソースをダウンロードしてインストール実行
```bash
cd /usr/local/src
git clone git://github.com/ansible/ansible.git
cd ./ansible
make install
```
シンボリックリンク上のディレクトリから実ディレクトリに移動する

シンボリックリンクのディレクトリ上で作業して、あ、実体のディレクトリに移動したいんだけど、と思うことよくありますよね？私はよくはないですが時たまあります。

そんなときは

```
$ cd -P .
```

で実ディレクトリへと移動することが出来ます。
PHPで意図せずURLにスペースが入る場合

面倒を見ているシステムで、PHPでURLを取得するとなぜかスペースが入ることがあった。
何だろうと思って調べていった結果、URLデコードには二つの関数が存在するということに初めて気づいた。

|　関数名　|　メモ　|
|:----|------|
|urldecode|+をスペースに変換する|
|rawurldecode |+をスペースに変換しない|

確認用コード

```php
<?php

$urlArray = array(
    "url1" => "ai+eo",
    "url2" => "ai%2Beo",
);

echo "urldecode version:\n";
foreach($urlArray as $key => $value) {
	echo "$key($value) = " , urldecode($value), "\n";
}
echo "\n";
echo "rawurldecode version:\n";
foreach($urlArray as $key => $value) {
	echo "$key($value) = " , rawurldecode($value), "\n";
}
```

実行結果

```
[c:php]
$ php -f test.php
urldecode version:
url1(ai+eo) = ai eo
url2(ai%2Beo) = ai+eo

rawurldecode version:
url1(ai+eo) = ai+eo
url2(ai%2Beo) = ai+eo
```

システムの挙動が開発機と本番機で違ったからphp.iniでも動作が変わるかも・・・（未確認）
Groovyでカード分配？アルゴリズム

以下のページを見て、Groovyでなるだけ関数型っぽく書いてみた。
http://qiita.com/hisui@github/items/b47c411437d60440a605

そもそも関数型じゃないのかこれじゃ？

```groovy:cardDistributor.groovy
def spliter(Integer users, List cards) {

    cards?.size() < users ? [] : (0 ..< users).collect {index ->
        def distributionNumber = (cards?.size() / users) as Integer;
        (index ..< distributionNumber*users).step(users).collect{cards.get(it)}
    }
}

assert spliter(2, (1..10)) == [[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]
assert spliter(2, (1..9)) == [[1, 3, 5, 7], [2, 4, 6, 8]]
assert spliter(3, (1..5)) == [[1], [2], [3]]
assert spliter(5, (1..3)) == []
assert spliter(5, null) == []

// これを何とかスマートに解決できないだろうか・・・
// 現状のままだとNullPointerException
//assert spliter(null, (1..3)) == []
//assert spliter(null,null) == []
```
さくらVPSにGit 1.8.4入れた時のメモ


// ------ 1.  yumでインストールしたgitのアンインストール。

```bash
yum erase perl-Git
```

// ------ 2.  最新版のGitのURLを確認

・ Gitの最新版
https://www.kernel.org/pub/software/scm/git/
 -> リンクアドレスをコピー

 -> 実行&解凍

```bash
wget https://www.kernel.org/pub/software/scm/git/git-1.8.4.tar.bz2
tar -jxf git-1.8.4.tar.bz2
```

// ------ 3.  解凍されたフォルダに移動してチェック

```bash 
cd git-1.8.4
./configure --prefix=~/local/git-1.8.4 
```


// ------ 4.  makeする（けどエラー吐く）

```bash
make

### 下記エラーの部分
SUBDIR git-gui
GITGUI_VERSION = 0.14.0
    * new locations or Tcl/Tk interpreter
    GEN git-gui
    INDEX lib/
    * tclsh failed; using unoptimized loading
    MSGFMT    po/de.msg make[1]: *** [po/de.msg] Error 127
make: *** [all] Error 2
### /FINISH
```

// ------ 5.  足りない実行ファイルはyumでインストール

```bash
sudo yum install perl-ExtUtils-MakeMaker
```

// ------ 6.  make & make install

```bash
make
### コンパイル通った！

sudo make install
### インストールできた！

```

// ------ 7. パスを通す


```bash
vim /etc/profile

### 終端行に下記追加
export $PATH=/usr/local/bin

```

・ パスを通す
http://d.hatena.ne.jp/Akineko/20090825/1251187210



// ----------------- 参考URL

・ Gitの最新版
https://www.kernel.org/pub/software/scm/git/
・ configureの設定を変更してみる
http://www.atmarkit.co.jp/ait/articles/1107/01/news139.html
・ パスを通す
http://d.hatena.ne.jp/Akineko/20090825/1251187210
・ node.jsインストールメモ（CentOS 5.5）
http://manablog.eek.jp/linux/install_nodejs_to_centos/


// ----------------- 残る疑問
Markdown記法の番号付きリストがちゃんと表示されない。on Kobito
関数メンバについて

```
public showMessage(): void {
  alert(this.message);
}
```
voidは戻り値の型

##インターフェース

```typescript
interface IEngine {
  maxSpeed: number;
  move(speed: number): { message: string; }; //関数メンバ
}
```
上記関数メンバの型注釈は、オブジェクトリテラル(string型のmessageメンバを持つオブジェクトを返す
関数
iTerm2 + zshで時間のかかる処理が終わったらGrowlに通知したりアラートダイアログ出したり音出したりする方法

# 背景
最近時間のかかるコマンドをよく使ってて、放置して忘れちゃうことが多かったので、処理が終わったら通知する仕組みが欲しくて考えた。

# やりかた
色んなことが出来ますが、とりあえずGrowlに通知してみる。
やり方は
1: どれくらい処理に時間がかかったら通知するか決める
2: `.zshrc` に、以下の記述をして再読み込みする（代入してる値は1.で決めた秒数）

```
REPORTTIME=1
```

3: iTermのPreferences -> Profiles -> Advanced -> Triggers -> Edit で以下の記述をする。
![スクリーンショット 2013-10-10 1.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/94/1b472ddf-81fe-fbde-85df-287c9ffbf172.png)

```:コピペ用
# Regular Expression
^.* cpu [0-9.:]+ total

# Parameters
DONE!!!\n\0
```
 
4: おわり！

# 結果
試しに時間かかりそうなコマンドを打ってみる

```
$ find . -type f -maxdepth 8 -print > /dev/null
```

これが終わるとこうなる。

![スクリーンショット 2013-10-10 1.25.44.png](https://qiita-image-store.s3.amazonaws.com/0/94/25c02ae5-5ef0-36eb-8e0f-48cfc69d6918.png)

便利！

# 解説
まずにzshrcに書いた `REPORTTIME=1` は、[この秒数を超える処理があると実行時間を表示する機能をzshが持ってる](http://qiita.com/yaotti/items/b72373f7e4bc79b13568)。
そんでもって、[iTerm2には画面の出力を監視して設定した正規表現にヒットすると何かしらアクションを起こす機能がある](http://qiita.com/yaotti/items/3764572ea1e1972ba928)ので、zshが上記の実行時間表示をしたかどうかを監視して、ヒットしたらGrowlの通知を出した、という感じ。

# 発展
タイトルどおり、Growlに通知する以外にもiTerm2に設定したところのActionとParametersを変えることによって色々出来る。
例えばRegular Expressionは上述の通りにして

* ActionにRing Bellをセットすると音が出る。
* ActionにBounce Dock Iconをセットするとドックアイコンがバウンドする
* ActionにShow Alert、ParametersをGrowlと同じにすると↓こうなる

![スクリーンショット 2013-10-10 1.56.37.png](https://qiita-image-store.s3.amazonaws.com/0/94/546763d2-7ad1-7fb8-9161-a22e05f3bd94.png)

という感じ。任意のコマンドを走らせる事もできるので、ターミナルで出来ることはほぼなんでもできちゃいます。

# 追記

* 設定しても反映されなければ、iTerm2を再起動すると反映されるかも。
* tmux/screen使ってたら、この文字列が入ってる画面を切り替えるたびに反応して使い物にならなかった(´・ω・｀)

# 参考

* [実行時間が長いコマンドが終わったら、zshが勝手にGrowl通知してくる (Mac/Linux/SSH接続先) - Qiita [キータ]](http://qiita.com/hayamiz/items/d64730b61b7918fbb970)
* [ Mac - iTerm2で特定文字列をハイライトやGrowl通知する - Qiita [キータ]](http://qiita.com/yaotti/items/3764572ea1e1972ba928)
* [iTerm2のTriggerの正規表現で後方参照 - Qiita [キータ]](http://qiita.com/yuku_t/items/91945e5482c692f6b5d9)
* [Zsh - コマンド実行に一定時間以上かかった場合処理時間を表示する - Qiita [キータ]](http://qiita.com/yaotti/items/b72373f7e4bc79b13568)
* `man zshparam`の`REPORTTIME`や`TIMEFMT`項目
iOSアプリのUIテストツール候補

iOSアプリのUIテストを取り入れようと思いまして調査中です。
まだ触ってもいないのですが、とりあえずググって出てきた候補を挙げておきます。

#Appium

AppiumでiOSを自動で受け入れテスト Rspecでテストできるよ！
http://konyu.hatenablog.com/entry/2013/06/08/011118


#Calabash-iOS
UIテストフレームワークCalabash-iOSを試す〜ターミナルから遠隔操作！〜
http://dev.classmethod.jp/smartphone/iphone/calabash-ios-2/

iOSの究極テストツール:Calabash-iOSを使いこなすぞ！(1)
http://tech.voyagegroup.com/archives/6993550.html

iOSの究極テストツール:Calabash-iOSを使いこなすぞ！(2)
http://tech.voyagegroup.com/archives/6993860.html


#Tuneup JS+Travis CI
Tuneup JS+Travis CIによるiPhoneアプリ自動UIテストまとめ
http://giginet.hateblo.jp/entry/2013/09/18/002458

 Travis CI 使ってみた
http://d.hatena.ne.jp/wakabatan/20120408/1333878824


#KIF
kif-framework/KIF
https://github.com/kif-framework/KIF

mixi-inc/iOSTraining 11.4 KIFを用いた結合テスト
 https://github.com/mixi-inc/iOSTraining/wiki/11.4-KIF%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88

次世代のKIF(2.0.0)が良さそう
http://blog.ishkawa.org/blog/2013/08/31/kif-next/

KIF を使った iOS Integration Test
http://blog.jarinosuke.com/entry/ios_integration_test

Google+モバイルアプリ開発チームのテスト戦略
http://d.hatena.ne.jp/laiso+iphone/20130831/1377928265

Kifの紹介
http://www.slideshare.net/keitaotsuka21/kif

Tag Archive for KIF
http://www.savinoordine.com/tag/kif/

自動テスティングフレームワーク "KIF"
http://cocoadays-info.blogspot.jp/2012/01/kif.html

継続的インテグレーションに。iOSを自動操作してテスト「KIF」
http://www.moongift.jp/2012/01/20120118-3/

#UIAutomation
UIAutomation のテストコードの自動作成
http://tamotamago.com/?p=462

Xcode プロジェクトの自動ビルドと自動 UIAutomation
http://tamotamago.com/?p=506

[iOS] InstrumentsでAutomationを実行しながらメモリ使用状況を監視したい
http://dev.classmethod.jp/smartphone/iphone/ios-instruments-automation/

#Jenkinsとの連携
Automated Testing with GHUnit and KIF
http://michele.io/blog/automated-testing
homebrewで最新のvim7.4をインストールする方法

なんで更新したいかというと、neocomplete.vimを使いたいため
”It requires Vim 7.3.885 or above and "if_lua" enabled Vim”

$brew install lua
$which vim
=>/usr/bin/vim

$brew install vim --devel --with-lua
これで入るが、デフォルトでは使えない
今回入れたvimは
/usr/local/bin/vimに入っているので
PATHでこちらのvimを使うようにする

私はzshなので
~/.zshrcにPATHの設定を書く
export PATH=/usr/local/bin:/usr/bin

その後、読み込む
$source ~/.zshrc

$which vim
=> usr/local/bin/vim

完了！
ng-srcにData URLやBlob URLを渡す

## 2013/12/11 修正

`data:*`, `blob:*`では動かなくなっていたので修正しました。

## 事象

```javascript
$scope.url = "WebRTCとかFile APIから取得したURL";
```
```html
<video ng-src="{{ url }}"></video>
```

上記のようにFile APIやWebRTCから取得したData URLやBlob URLをng-srcに渡すとエラーが出てうまくいかない。

```javascript
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {{ 渡したURL }}
```

## 原因

- Angularはng-bind等でテンプレートに値を割り当てる時にその値が信頼出来るものか検証してる。
	- [Strict Contextual Escaping](http://docs.angularjs.org/api/ng.$sce)
- 1.2系よりデフォルトでSCEが有効となる

## 対処

- `$sceDelegateProvider.resourceUrlWhitelist`を使ってData URLとBlob URLをSCEのホワイトリストに登録する
- `resourceUrlWhitelist`は追加ではなく**上書き**なので、デフォルトの`self`を忘れずに追加すること！

```javascript
angular.module('yourModule', [])
  .config(function ($sceDelegateProvider) {
    $sceDelegateProvider.resourceUrlWhitelis([
      'self',
      , 'blob:**'
      , 'data:**'
    ]);
  });
```

- WhiteListやBlackListに指定可能な値は下記のとおりです。
  - 'self'
  - 文字列
    - `*`と`**`が使える
      - `*`は`:`, `/`, `.`, `?`, `&`,`;`を除くの0文字以上の文字とマッチ
      - `**`は0文字以上の文字とマッチ
  - RegExp
      - RegExpのインスタンス
      - 先頭を示す`^`と末尾を示す`$`を含めないといけない。（含めないと勝手に保管されて意図したマッチングにならない）
- なので、DataURLで厳密なファイルタイプ等で制限したい場合、`data:image/*,base64;**`のように書くことができる
- ちなみに、`$sceDelegateProvider.resourceUrlBlacklist`を使うとブラックリストを作れるよ。
iOS 7から追加されたDynamic Type機能を使ってみる

iOS 7から設定画面に「文字サイズを変更」が追加されました。

![6946da98e326fcaabf121b8694a9665d.jpeg](https://qiita-image-store.s3.amazonaws.com/0/8292/9030cfb0-b3e5-6f76-33c2-a3f72e31b353.jpeg)

「Dynamic Type機能をサポートしているAppでは、下のスライダで指定したサイズでテキストが表示されます」とあります。では、Dynamic Type機能をサポートするにはどうしたら良いでしょうか。

# わかったこと

これまでは、フォントの **サイズ** を直接数値で指定していましたが、Dynamic Typeでは **スタイル** を指定するようです。

具体的には、

```objc
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize;
```

などのメソッドを用いて直接サイズ指定していたところを

```objc
+ (UIFont *)preferredFontForTextStyle:(NSString *)style
```
メソッドを用いてスタイルを指定します。（他にもスタイルを指定する方法がありますが、ここでは解説しません）

スタイルには次の値を指定できます。

* UIFontTextStyleHeadline
* UIFontTextStyleBody
* UIFontTextStyleSubheadline
* UIFontTextStyleFootnote
* UIFontTextStyleCaption1
* UIFontTextStyleCaption2

画面に表示されるフォントサイズは、指定したスタイルによって自動的に決定するようです。

![dynamic.jpeg](https://qiita-image-store.s3.amazonaws.com/0/8292/dedac867-a2af-1ba8-5e00-faa9c5dc499f.jpeg)

# フォントサイズの設定変更を監視する

このままだと設定画面からフォントサイズを変更しても何も起こりません。フォントサイズの変更を監視するには、 **NSNotificationCenter** に **UIContentSizeCategoryDidChangeNotification** を追加します。

```objc
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredContentSizeChanged:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
```

こうすることにより、アプリ起動時にフォントサイズ設定が変わっていた場合、preferredContentSizeChanged が呼ばれるようになります。この中でテキストを再描画してあげれば良いでしょう。

# 実行結果

とりあえず、設定画面の文字サイズが反映されるようになりました。

![min.png](https://qiita-image-store.s3.amazonaws.com/0/8292/ce3fe778-baf4-1783-f5ce-310cdd250c08.png)![mid2.png](https://qiita-image-store.s3.amazonaws.com/0/8292/ed6824b4-ecb6-ba52-1ec7-73e76dcee2ab.png)![max.png](https://qiita-image-store.s3.amazonaws.com/0/8292/59b4ef39-9222-01c5-6583-679e17afdc87.png)

まだまだ調査段階なのでツッコミ、訂正など歓迎です！m(_ _)m

# リンク

* [iOS 7: Dynamic Typeに対応したUITableViewを作ってみた](http://koogawa.hateblo.jp/entry/2013/09/23/011223)
* [Using Fonts with Text Kit](https://developer.apple.com/wwdc/videos/)
何でWordpressは自身のURLを示す関数に `home_url` とか `site_url()` とか bloginfo('url')とかいっぱいあんの？

Wordpressで自身のURLが欲しい時に調べてみたらいっぱい出てきた。

```
site_url()
home_url()
bloginfo('url')
bloginfo('wpurl')
bloginfo('siteurl')
bloginfo('home')
```

なんでやねん。何でそんなに多いねん。一個でいいですやん。

## 調べてみた

それぞれの違いとか使い方を調べてみました。

`site_url()`
General Settings の WordPress Address (URL) の項目の値

`home_url()`
General Settings の Site Address (URL) の項目の値

`site_url()` は plugins_url などの wp-admin 配下のアドレスも追跡できるけど、`home_url()` はできないらしい。


bloginfo()はget_option()のwrapperでしかないので

bloginfo('wpurl') は site_url() を参照して
bloginfo('url') は home_url() を参照してるだけ。

あと bloginfo('home'),bloginfo('siteurl') は 2.2 から deprecated 扱い。


## 参考

Function Reference/bloginfo « WordPress Codex
http://codex.wordpress.org/Function_Reference/bloginfo

functions - What's the difference between home_url() and site_url() - WordPress Answers
http://wordpress.stackexchange.com/questions/20294/whats-the-difference-between-home-url-and-site-url
tmlib-rpg メニューを作成

こんなに頻繁に書くのは最初のうちだけだと思うけど…

手当たり次第に作成ってことで、まずは基本のメニューウィンドウ
WindowMenu クラス

```coffeescript:WindowMenuサンプル
window1 = rpg.WindowMenu
		menus: [
			{name:'ほえほえ', fn:@hoehoe.bind(@)}
			{name:'menu2', fn:@menu2.bind(@)}
		]
```

![ss20131009a.png](https://qiita-image-store.s3.amazonaws.com/0/30417/b9cb8a2b-db75-4af6-d0d5-dfecefded704.png)

（むむ、Qiitaって月毎にアップロードサイズきまってるんだ…）

カスタマイズするパラメータとしては、位置とサイズもあるけど、カラム数と行数に、ページの対応もしないと。
イベント関連も作成して、実装したのでまたその辺のことを書いておきたい。（心覚え）

メニューが選択できない、グレーアウトの対応とかも必要だわ。
virtualenvごとにPYTHONPATHを切り替える

Python環境をvirtualenvを使って管理している場合に、環境変数PYTHONPATHをvirtualenvごとに切り替える方法です。

`virtualenv_home/your_env/bin/activate`に以下の2行を追加します。

```bash:activate
export OLD_PYTHONPATH=$PYTHONPATH
export PYTHONPATH="/path/to/you/want"
```

`virtualenv_home/your_env/bin/postdeactivate`に以下の2行を追加します。

```bash:postdeactivate
export PYTHONPATH=$OLD_PYTHONPATH
unset OLD_PYTHONPATH
```
teeコマンドの使い方

「コマンドの結果をファイルに出力したいけど、標準出力でも出力を見たい！」、という欲張りな要望に答えてくれる意外と頼もしいコマンド。

ちなみにサンプルが vagrant コマンドとか使ってますが、あくまで例の一つ。 rsync とかダラーッと出力されるもののほうが良かったかもしれない。

## 簡単な使い方

### ファイルを上書きする

```bash
vagrant ssh-config --host 192.168.33.20 | tee result.txt
```

### ファイルに追記する

`-a` オプションをつける。

```bash
vagrant ssh-config --host 192.168.33.20 | tee -a result.txt
```

### sudo でファイルに書き込みできるようにする

リダイレクト先に書き込むときに特権が必要な場合、そのままではうまく書き込みできません。
以下は swappiness を変更する場合の例です。

```
$ cat /proc/sys/vm/swappiness 
60
$ sudo echo 0 >/proc/sys/vm/swappiness 
-bash: /proc/sys/vm/swappiness: 許可がありません
```

そこで tee コマンドを使います。

```
$ echo 0 | sudo tee /proc/sys/vm/swappiness 
0
$ cat /proc/sys/vm/swappiness 
0
```

いい感じにオンザフライで変更できました。

#### swappiness の蛇足

ちなみに蛇足ですが swappiness の設定で 0 を設定するのは Kernel 2.x 系では物理メモリを使い果たしてからスワップアウトするという意味になりますが、
Kernel 3.5 以上になると 0 の取扱いが変わって、物理メモリがなくなるとスワップアウトせずに OOMKiller が発動します。
なのでKernel 3.5 以上では 1 が適当です。

- [Swappiness - Wikipedia](https://en.wikipedia.org/wiki/Swappiness)
- [スワップされて困っちゃうのでswappinessを設定する - Qiita](http://qiita.com/ikuwow/items/f0b4d1f509a0b83b5d7e)
- [vm.swappiness=0は重要 | Ore no homepage](https://hiroakis.com/blog/2012/06/13/vm-swappiness0%E3%81%AF%E9%87%8D%E8%A6%81/)

#### 標準入力から突っ込んだテキストを sudo 権限で保存したい

```shell-session
# cat >hello.txt
world
# Ctrl+D で入力を終了
# cat hello.txt
world
```

これは下記のように書き換えられます。

```shell-session
$ sudo tee hello.txt >/dev/null
world
# Ctrl+D で入力を終了
$ cat hello.txt
world
```

tee でエコーバックされる内容はうざいので `/dev/null` に捨てています。

## 標準エラー出力もファイルに保存する

リダイレクトを使う。これをやらないと標準エラー出力だけファイルにロギングされないという事態になってしまう。

```bash
ping 9999 2>&1 | tee result.txt
```

## 参考サイト

- [UNIXの部屋 コマンド検索:tee (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?tee)
- [Linuxコマンド集 - 【 tee 】 標準入力を標準出力とファイルに出力する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230898/)
- [UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8)
Bashとコマンドの基本的なこと

zsh使えるようになりたい。

## リダイレクト

### 標準出力と標準エラー出力を一緒にファイルに書き出す

**順番注意。**
以下は **「2の出力先を1と同じものにする」**  という意味。

* 作成

```bash
echo "aaa" >result.txt 2>&1
```

* 追記

```bash
echo "aaa" >>result.txt 2>&1
```

## Tips

### cutコマンド

```bash
$ ls -Fl
total 0
drwxr-xr-x  3 noguchiwataru  staff  102 10 10 00:39 cookbooks/
drwxr-xr-x  3 noguchiwataru  staff  102 10 10 00:39 data_bags/
drwxr-xr-x  3 noguchiwataru  staff  102 10 10 00:39 nodes/
drwxr-xr-x  3 noguchiwataru  staff  102 10 10 00:39 roles/
drwxr-xr-x  4 noguchiwataru  staff  136 10 10 23:47 site-cookbooks/
```
次の例はどうなるか。

```bash
$ ls -Fl | cut -f14 -d " "
```

* 区切りをホワイトスペース ` ` として2つ連続する空白は1つのフィールドとして扱われる。`-d` でデリミタとして指定する。
* `-f` オプションで読み出すフィールド番号を指定する。インデックスは1番から始まります。ここでは12番目のフィールドを読み出し。

結果、以下のように表示される。

```

cookbooks/
data_bags/
nodes/
roles/
site-cookbooks/
```

### クリップボード操作

xclipコマンドが便利。

#### インストール

* Ubuntu

```
sudo apt-get -y install xclip
```

##### 使い方

`-sel clip` としないとうまくクリップボードにコピーされないようなので注意。

```bash
ls -la / | xclip -sel clip
```

## 参考サイト

- [UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8)
- [echoの出力を標準エラーに出力する方法 - 備忘録](http://d.hatena.ne.jp/mnkz51/20090218/1234940846)
- [echoの出力を標準エラーに出力する方法 - 備忘録](http://d.hatena.ne.jp/mnkz51/20090218/1234940846)

### xclip

- [Linux - コンソールからクリップボードを使えるxclipちょうべんり - Qiita キータ](http://qiita.com/esehara@github/items/823a2c2d50081e692f3d)
- [xclip problem](http://ubuntuforums.org/showthread.php?t=1984061)
Wordpressのpage.php で if ( have_posts() ) した後に while ( have_posts() ) する理由

Wordpressの記事表示部分が非常に気持ち悪かったので聞いたり調べたりしてみました。

```php
      <?php 
      if (have_posts()) :
		     while (have_posts()) :
				       the_post();
      ?>
      <h1 class="page_ttl"><?php the_title(); ?></h1>
      <?php the_content(); ?>
      <?php 
      endwhile;
      endif;
      ?>
```

気になった点は while(have_posts()) がそもそも真偽値チェックをしてるのに何で `if(have_posts())` が必要なのかという点です。「二度手間じゃねえか。」と思うわけです。

実際に調べてみたところこの書き方なら if 部分は要りません。下記のように `if ~ else ~ endif` を使う場合にのみ必要なようです。

```php
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
```

ただこれだと無駄なネストがあるので

```php
<?php if ( !have_posts()) : ?>
<p>Postが一つもないですよ〜。エラーですよ〜。</p>
<?php endif; ?>

<?php while ( have_posts()) : the_post(); ?>
ここ本文を書きましょう。
<?php endwhile; ?>
```

の方が絶対に良いと思うんです。ネストも減るし何をしてるかわかりやすいですから。
何でこうなってないんでしょう？

ちなみに「404.php があれば `else`はいらないよ、大体の場合は。」なアドバイスももらったんですが正直良くわかっていません。

あと Wordpress Codex の The Loop の項目では if 文付きの方法が紹介されていましたが、
http://codex.wordpress.org/The_Loop

デフォルトテーマのTwentyTwelveとTwentyThirteenでは while 文だけが使われていてif文はないようでした。
…と思ったらpage.phpにはないけど、他のファイルにはif文もあるようです。

```
./archive.php:		<?php if ( have_posts() ) : ?>
./archive.php:			<?php while ( have_posts() ) : the_post(); ?>
./author.php:		<?php if ( have_posts() ) : ?>
./author.php:			<?php while ( have_posts() ) : the_post(); ?>
./category.php:		<?php if ( have_posts() ) : ?>
./category.php:			<?php while ( have_posts() ) : the_post(); ?>
./index.php:		<?php if ( have_posts() ) : ?>
./index.php:			<?php while ( have_posts() ) : the_post(); ?>
./page.php:			<?php while ( have_posts() ) : the_post(); ?>
./search.php:		<?php if ( have_posts() ) : ?>
./search.php:			<?php while ( have_posts() ) : the_post(); ?>
./single.php:			<?php while ( have_posts() ) : the_post(); ?>
./tag.php:		<?php if ( have_posts() ) : ?>
./tag.php:			<?php while ( have_posts() ) : the_post(); ?>
./taxonomy-post_format.php:		<?php if ( have_posts() ) : ?>
./taxonomy-post_format.php:			<?php while ( have_posts() ) : the_post(); ?>
```

以上のファイルの該当部分をすべて確認した結果
if 文と while 文の間に header を入れるか、 else 文を使用していました。やはり不必要なようですね。
header 入れるにしても無駄にネストを増やすのは非常に気持ち悪いです。始めたばっかりですが早速Wordpressが嫌いになりそうで困りました。

stackexchange での熟練者な方の話と食い違いますが、いくら考えても自分のほうが正しいと思うので俺が何かを言えるぐらいの経験を積んでからもう一度読んでみることにします。

## 自分なりの結論

else 使うなら先にエラー処理をする
header を付けたい時も先に処理をする。
WordpressのCodexのプログラミングの作法が気に食わない。
Twentythirtyとかのデフォルトのテンプレートの記述の作法も気に食わない。
でもやっぱりそれでもWordpressはめちゃくちゃ便利なので女騎士&オーク的なノリで使うことにする。

## 参考

loop - Why should I put `if(have_posts())`? while(have_posts()) is not enough? - WordPress Answers
http://wordpress.stackexchange.com/questions/117219/why-should-i-put-ifhave-posts-whilehave-posts-is-not-enough
WatirでFacebookの仕様を監視(取得)する

# やりたいこと

* Facebookの仕様が変わったら知りたい
* 以前の仕様がどんなだったかを見れるようにしておきたい

# 技術課題

* Facebookの仕様が書いてあるdevelopersには、ブラウザからでないとアクセスできない => **watir使う**
 * wgetしたらブラウザインストールを促されるページが返ってきた
* 裏側で勝手にやってくれるようにしたい => **headless使う**
* proxyを越える必要がある => **Firefox AddonのAutoAuth使う**

# 処理概要

* 取得するページURLはconfig/url_list.txtに書いておく
* ブラウザはfirefoxを使う
 * AutoAuth読み込みは別記事に記載予定
* 取得したページの保存
* ページはspecification/ 以下に日付でディレクトリを作成し、その下にパスに応じたディレクトリ・名前で保存する
 * / -> developers.html
 * /docs/ -> developers/docs.html
 * /docs/facebook-login/ -> developers/docs/facebook-login.html
 * /blog/archive -> developers/blog/archive.html

# コード

```rb:facebook_developers.rb
require 'watir-webdriver'
require 'headless'
require 'yaml'
require 'uri'

# Facebook User
facebook_user = YAML.load_file("config/facebook_user.yml")

#URL List Setting
url_list = []
File.open("config/url_list.txt") do |f|
  f.each do |line|
    url_list << line.chomp
  end
end

#Firefox Setting
headless = Headless.new
headless.start
config = YAML.load_file("config/firefox.yml")
profile = Selenium::WebDriver::Firefox::Profile.from_name(config["profile"])
profile.add_extension config["extension_path"]
begin
  browser = Watir::Browser.new(:firefox, :profile => profile)
rescue Selenium::WebDriver::Error::WebDriverError => e
  puts "Please unset system proxy setting"
end

begin
  browser.goto "https://www.facebook.com/"
  browser.text_field(:name, "email").set(facebook_user["email"])
  browser.text_field(:name, "pass").set(facebook_user["password"])
  browser.input(:value => "ログイン").click

  url_list.each do |url|
    date = Time.now.to_s.split.first.gsub("-", "")
    dir_path = "./specification/#{date}"
    uri_path = URI.parse(url).path
    if uri_path == "/"
      file_name = "developers.html"
      dir_name  = dir_path
    else
      ary = uri_path.split("/")
      file_name = ary.last + ".html"
      ary.pop
      dir_name  = dir_path + ary.join("/")
    end

    browser.goto url
    FileUtils.mkdir_p dir_name unless Dir.exist? dir_name
    File.open(File.join(dir_name, file_name), "w") do |file|
      file.write(browser.html)
    end
  end

ensure
  browser.close
  headless.destroy
end
```
aws-sdkでELBにEC2を紐付ける

# やりたいこと

* EC2をELBに紐付けるのを自動化
* In ServiceになるまでManagement Consoleから更新ボタンをポチポチしなくていいようにする

# 処理概要

1. 引数はTrollopで処理
 * EC2はInstance IDベースで処理する
 * ELB はName指定
 * ELBへの紐付けに時間がかかることがあるのでTimeoutを設定
1. ELBへの登録
 * elb.availability_zones.enableしないとエラーが発生することがある(後述)
1. ELBへの紐付け後、EC2のステータスがIn Serviceになるまで待つ
 * 紐付け中、EC2が起動中、EC2上のアプリが起動中の場合は15秒待って再度ステータスチェック
 * その他の場合はEC2のステータスとその説明を表示して終了する

# コード

```rb:register_elb.rb
require 'aws-sdk'
require 'trollop'

# 引数チェック
ec2 = AWS::EC2.new
regions = ec2.regions.map{ |regions| regions.name }
opts = Trollop::options do
  opt :region,       "aws region (#{regions.join(", ")})",      :type => :string,  :default => "us-east-1"
  opt :instance_ids, "ec2 instance id",                         :type => :strings, :required => true
  opt :elb_name,     "elb name",                                :type => :string,  :required => true
  opt :timeout,      "wait time from in service (default:300)", :type => :integer, :default => 300
end
Trollop::die :region, "aws region are eu-west-1, sa-east-1, ... " unless regions.include?(opts[:region])

# ELBにEC2を登録
elb = AWS::ELB.new(:region => opts[:region]).load_balancers[opts[:elb_name]]
opts[:instance_ids].each do |instance_id|
  ec2 = AWS::EC2.new(:region => opts[:region]).instances[instance_id]
  elb.availability_zones.enable(ec2.availability_zone)
  elb.instances.register(ec2)
end

# EC2がIn Serviceになるまで待つ
opts[:instance_ids].each do |instance_id|
  puts "EC2 instance registered elb : #{opts[:elb_name]}."
  puts "Please wait for EC2 instances state is in service."
  ec2 = elb.instances[instance_id]
  timeout(opts[:timeout]){
    while ec2.elb_health.state != "InService"
      case ec2.elb_health[:description]
      when /in progress/, /in pending state/, /failed at least the UnhealthyThreshold number/
        puts "  [#{instance_id}] #{ec2.elb_health[:description]}"
        sleep 15
      else
        puts "  [#{instance_id}] #{ec2.elb_health.state}"
        puts "  [#{instance_id}] #{ec2.elb_health[:description]}"
        exit
      end
      STDOUT.flush
    end
  }
  puts "EC2 instance (#{instance_id}) state is #{ec2.elb_health.state}"
end
puts "Completed"
```

#  elb.availability_zones.enable でエラー
T.B.D
シェルスクリプトを Shebang に書く

普通にはシェルスクリプトを Shebang （シェバング？ シバン？）に書くことはできません。

```bash:/tmp/a.sh
#!/bin/bash
echo "my name is a"
echo "args is $@"
```

```bash:/tmp/b.sh
#!/tmp/a.sh
echo "my name is b"
echo "args is $@"
```

b.sh の Shebang に `/tmp/a.sh` と書いているので a.sh が実行されることを期待していますが、実際には b.sh が `/bin/bash` で実行されます。

```console
$ chmod +x a.sh b.sh

$ /tmp/b.sh 1 2 3
my name is b
args is 1 2 3
```

b.sh の Shebang を `/usr/bin/env /tmp/a.sh` などとしてやればOKです。

```bash:/tmp/b.sh
#!/usr/bin/env /tmp/a.sh
echo "my name is b"
echo "args is $@"
```

```console
$ chmod +x a.sh b.sh

$ /tmp/b.sh 1 2 3
my name is a
args is /tmp/b.sh 1 2 3
```

最近よく見る `/usr/bin/env ruby` のような記述は単にインタプリタのインストール先が PATH さえ通っていればどこでも良いようにするためのものかと思っていましたが、こういう効果もあるんですね。
Trollop基本的な使い方

# Trollop備忘録

* 引数を簡単に扱えるgem
* 簡単なチェックが必要なくなる
* ちょっとしたスクリプトで使うには便利

# 基本的な使い方

```ruby:argument.rb
require "trollop"

opts = Trollop::options do
  opt :number,  "number",    :type => :integer
  opt :name,    "name",      :type => :string,  :required => true
  opt :tags,    "tags",      :type => :strings
  opt :timeout, "wait time", :type => :integer, :default => 300 
end

Trollop::die :number, "required" unless opts[:number]

p opts
p opts[:number]
p opts[:name]
p opts[:tags]
p opts[:timeout]
```

* プログラム実行時、引数に"_"は使えない。代わりに"-"で指定する
 * プログラム内ではシンボルで指定するため
* 複数の引数を持たせたいときはtypeの指定を複数形にする
 * string(単数形) -> strings(複数形)

# 実行例

* 最初にrequire指定した引数があるかどうかがチェックされる

```bash
$ ruby argument.rb 
Error: option --name must be specified.
Try --help for help.
```

* Trollop::dieで例外を起こせる

```bash
$ ruby argument.rb --name ogawatti
Error: argument --number required.
Try --help for help.
```

* 型のチェックも勝手にやってくれる

```bash
$ ruby argument.rb --name ogawatti --number abc
Error: option '--number' needs an integer.
Try --help for help.
```

* Trollop::optionsで受け取ったoptsに引数チェックの結果等が入っている
* defaultを指定すると初期値を入力可

```bash
$ ruby argument.rb --name ogawatti --number 2
{:number=>2, :name=>"ogawatti", :tags=>nil, :help=>false, :name_given=>true, :number_given=>true}
2
"ogawatti"
nil
300
```

* 引数にhelpを指定すると使い方を表示してくれる

```bash
$ ruby argument.rb --help
Options:
   --number, -n <i>:   number
     --name, -a 
:   name
    --tags, -t <s+>:   tags
  --timeout, -i <i>:   wait time (default: 300)
         --help, -h:   Show this message
```

* helpで表示した通り、短縮系が使える
 * 定義した順に、頭文字一文字、既に使われている場合は二文字目を使う

```bash
$ ruby argument.rb -a ogawatti -n 2 -i 60
{:number=>2, :name=>"ogawatti", :tags=>nil, :timeout=>60, :help=>false, :name_given=>true, :number_given=>true, :timeout_given=>true}
2
"ogawatti"
nil
60
```

* 複数形で指定した引数は配列に格納される

```bash
$ ruby argument.rb -a ogawatti -n 2 -t hoge fuga
{:number=>2, :name=>"ogawatti", :tags=>["hoge", "fuga"], :help=>false, :name_given=>true, :number_given=>true, :tags_given=>true}
2
"ogawatti"
["hoge", "fuga"]
300
```
Fileの読み書きをブロック処理にすると

Fileの扱いについてメモ。

例えば`テキストファイル`を`オープン`して処理する場合。

## 普通に書いた場合
```
file = File.open("sample.txt", "r:utf-8")
　処理
file.close
```

## ブロック処理で書いた場合
```
File.open("sample.txt", "r:utf-8") do |file|
　処理
end
```

ブロック処理で書くと
closeメソッドを使わなくても自動でファイルを閉じてくれる。
覚えておこう。
Vagrant basics

##概要
仮想環境（VirtualBoxなど）上への仮想マシンの立ち上げ、操作が可能。

##用語

###プロバイダ
仮想環境
eg.VirtualBoxやVM Ware、EC2など


###プロビジョニング
ミドルウェアの設定やインストールを行うツール
eg.シェルスクリプト、Chef（chef-solo, chef-client）、Puppetなど

###Boxファイル
仮想マシン起動の際にベースとなるイメージファイルのこと。
仮想環境ごとに必要。
通常はOSイメージから作成する。
Vagrant利用の上で最低限必要な設定（Vagrantユーザの作成、sshdの起動、プロビジョニングツールのインストール）のみを行っておくのが普通。

###Vagrantfile
構築する仮装マシンのスペックやプロビジョニングツールの指定など、仮想マシンの構成を記述する。
Rubyベース。
基本的に、本ファイルとプロビジョニングツールの設定ファイルの2つがあれば、どこでも同じ環境を再現できる。


##コマンド

###基本

```
# バージョン確認
$ vagrant -v

# ヘルプ
$ vagrant -h
```

###仮想環境のベースとなるBoxファイルを準備

```
$ vagrant box add NAME URL
```
```sample
# sample
$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
（Vagrantfileのconfig.vm.boxディレクトリで指定する。）
```

BoxファイルはVeeweeで作成することも出来る。
http://www.ryuzee.com/contents/blog/6614

###Box一覧の確認

```
$ vagrant box list
```

###Vagrantfileの作成

```
$ vagrant init BOX_NAME
```

```
# sample
$ vagrant init centos64
```

###Vagrantfileの設定

```sample.rb
$ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
	config.vm.box="centos64"

	//ネットワークの設定
	config.vm.network :private_network, ip:"192.168.33.10"

	//GUIモードの設定
	config.vm.provider :virtualbox do |vb|
		vb.gui = true
	end
end
```

※ホストオンリーネットワーク
　→ホストOSとゲストOS間でのみ通信できるネットワーク。
　　上記では、ゲスト側に192.168.33.10（任意）を割り当てている。

以下は古い書き方。

```
誤）config.vm.network :hostonly, "192.168.33.10"
```
```
正）config.vm.network :private_network, ip:"192.168.33.10"
```


###仮想マシンの起動

```
$ vagrant up
```
※Vagrantfileと同じディレクトリで実行する

GUIモードにしているとVirtualBoxが起動するので、id/passともに"vagrant"でログイン

###sshでログイン

```
$ vagrant ssh
```
※仮想マシンにてsshdが起動している必要あり。

###通常の方法でssh出来るようにする。

Chef Soloをknife-soloで動かすことを見越して、通常のsshアクセス、つまり

```
$ ssh 192.168.33.10
```
でsshできるようにする。

```
# ~/.ssh/config
Host 192.168.33.*
IdentityFile ~/.vagrant.d/insecure_private_key
User vagrant
```
もしくは

```
$ vagrant ssh-config --host melody
```
で仮想サーバへのssh設定を吐き出してくれるため、

```
$ vagrant ssh-config --host melody >> ~/.ssh/config
```
とすることで

```
$ ssh melody
```
でログインできるようになる。


###sshログイン時の設定確認
```
$ vagrant ssh-config
```


###status確認
```
$ vagrant status
```
```
Current machine states:
default                   running (virtualbox)
（仮想マシン名）　　（status）
```

###仮想マシンの停止
```
$ vagrant halt
```

###仮想マシンの削除
```
$ vagrant destroy
```

###仮想マシンのエクスポート
```
$ vagrant package
```
→package.boxという名前のBoxファイルが生成される。
それを配布し、受け取った側は

```
$ vagrant box add new_box package.box
```
で利用できる。


## vagrantをより便利に

### sahara

saharaを用いると、簡単に仮想マシンの状態保存・ロールバックが出来ます。

saharaでVagrantの状態管理
http://qiita.com/kidachi_/items/ba365905b2a770c72be1




### chef関連

サーバ構成管理ツールといえばchef。

Chefの基本
http://qiita.com/kidachi_/items/9d569b8673e70ef93f0e

knife-soloによるChefの実行
http://qiita.com/kidachi_/items/b222fb2892e6108c46d5
RailsAdminで特定の表示項目を自由に変更する


たとえばPhotoモデル中にあるurlを、RailsAdminの詳細画面で表示するとただのテキストで表示されますが、これをリンクで表示させられれば便利です。
実現しようとして調べました。

wiki
https://github.com/sferik/rails_admin/wiki/Railsadmin-DSL
を見ても formatted_value などを使った方法ぐらいしか載ってなくてイマイチだったのですが、issuesのほうに目的に合ったものが載っていました。
https://github.com/sferik/rails_admin/issues/1608

pretty_value を使って以下のように書くと良いかんじです。
（以下では url の画像のサムネイルとリンクを表示するのと、page_url のリンクを表示している）

```ruby:config/initializers/rails_admin.rb
  config.model Photo do
    # ...
    show do
      field :url do
        pretty_value do
          %{<a href="#{value}" target="_blank">#{value}</a><br /><img src="#{value}" width="100" height="100">}.html_safe
        end
      end
      field :page_url do
        label "写真ページURL"
        pretty_value do
          %{<a href="#{value}" target="_blank">#{value}</a>}.html_safe
        end
      end
      # …
    end
    # ...
```
Objective-CでLTSV形式の文字列のパース

ライブラリにしようかと思ったら単純なフォーマットだったのでスニペットにした。

```objc:main.m
- (NSArray *)objectsWithString:(NSString *)string
{
  NSMutableArray* result = [NSMutableArray array];
  [string enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
    NSMutableDictionary* record = [NSMutableDictionary dictionary];
    for (NSString* block in [line componentsSeparatedByString:@"\t"]) {
      NSRange range = [block rangeOfString:@":"];
      if(range.location != NSNotFound){
        [record setObject:[block substringFromIndex:range.location+range.length] forKey:[block substringToIndex:range.location]];
      }
    }
    if(record.allKeys.count > 0){
      [result addObject:record];
    }
  }];
  return result;
}

```

テストもあるでよ

```objc:Tests.m
- (void)testResultCountObjCImpl
{
  NSArray* objects = [self objectsWithString:[self stringSourceFixture]];
  XCTAssertEqual(objects.count, (NSUInteger)3);
}

- (void)testResultKeysCountObjCImpl
{
  NSDictionary* record = [[self objectsWithString:[self stringSourceFixture]] lastObject];
  XCTAssertEqual(record.allKeys.count, [[self labelsFixture] count]);
}

- (void)testResultObjCImpl
{
  NSArray* objects = [self objectsWithString:[self stringSourceFixture]];
  NSDictionary* record = [objects objectAtIndex:0];
  [[self labelsFixture] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    BOOL ret = [[record allKeys] containsObject:obj];
    XCTAssertTrue(ret);
  }];
}

- (void)testEmptyString
{
  NSArray* objects = [self objectsWithString:@""];
  XCTAssertEqual(objects.count, (NSUInteger)0);
}

- (void)testInvalidString
{
  NSArray* objects = [self objectsWithString:@"abc-?!bcc"];
  XCTAssertEqual(objects.count, (NSUInteger)0);
}


#pragma mark - Helpers

- (NSString *)stringSourceFixture
{
  //http://d.hatena.ne.jp/naoya/20130209/1360381374
  return @""
  "host:127.0.0.1\tident:-\tuser:frank\ttime:[12/Oct/2000:13:55:36 -0700]\treq:GET /apache_pb.gif HTTP/1.0\tstatus:200\tsize:2326\treferer:http://www.example.com/start.html\tua:Mozilla/4.08 [en] (Win98; I ;Nav)\n"
  "host:127.0.0.1\tident:-\tuser:frank\ttime:[11/Oct/2000:13:55:36 -0700]\treq:GET /apache_pb.gif HTTP/1.0\tstatus:200\tsize:2326\treferer:http://www.example.com/start.html\tua:Mozilla/4.08 [en] (Win98; I ;Nav)\n"
  "host:127.0.0.1\tident:-\tuser:frank\ttime:[10/Oct/2000:13:55:36 -0700]\treq:GET /apache_pb.gif HTTP/1.0\tstatus:200\tsize:2326\treferer:http://www.example.com/start.html\tua:Mozilla/4.08 [en] (Win98; I ;Nav)\n";
}

- (NSArray *)labelsFixture
{
  return @[@"host", @"referer",@"ua", @"user", @"ident", @"time", @"req", @"status", @"size"];
}

- (NSArray *)valuesFixture
{
  return @[@"127.0.0.1",  @"http://www.example.com/start.html",  @"Mozilla/4.08 [en] (Win98; I ;Nav)",  @"frank", @"-",  @"[12/Oct/2000:13:55:36 -0700]",  @"GET /apache_pb.gif HTTP/1.0",  @"200",  @"2326"];
}
```
シュンペーター 創造的破壊と新結合 のメモ

# 今回の勉強会の目的

## イノベーション論
* 定義分析
* 生成開発
* 普及

今回は普及のお話

# 普及

## ペネトレーション戦略

豊富な資金をがっつり使う戦略。一気にキャズムを超えに行く。

## イノベーションのきっかけ

* 再現性がない
* ばらつきがある
* 合理的でない
* 論理的におかしい
* 市場が変わってしまった
* 世の中が変わってしまった

## 生産要素の新結合

下記５つの要素の組み合わせでイノベーションを起こす

* 財貨の生産
* 生産方法の導入
* 販路の開拓
* 供給源
* 組織の実現

## 企業家

* 景気を変えるほどの影響を持つ
* 創意、権威、先見性を併せ持つ
* 夢想と意志

## イノベーションするために必要なアクション

* シュンペーターは新結合の遂行に重点を置く。発見や発明には力点は置いていない。
CakePHPで独自に定義した親クラスでのComponentとHelperのマージ

CakePHPで独自に定義した親クラスでのComponentとHelperのマージ

環境：
CakePHP2.3系

CakePHPでは、親コントローラ(AppController.php)と各コントローラのComponentとHelperの定義を自動でマージしてくれます。
そのため、AppController.phpでは共通の設定を、各コントローラでは必要なものだけを読み込む事ができます。

ただ、独自で実装したコントローラについてはマージしてくれません。
例えば、AppControllerを継承したAPI用のApiAppController.php、管理画面用のAdminAppController.phpとかです。

解決方法は方法は二つあります。

サンプルとして、下記を用意します。
コントローラ：AppController -> ApiAppController -> SampleController
コンポーネント：Sample1Component,Sample2Component,Sample3Component



#### 1,各親クラスで動的にロード
ApiAppControllerのbeforeFilter()でコンポーネントをロードします。

```php
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $components = array('Sample1');
}
```

```php
<?php
App::uses('AppController', 'Controller');
class ApiAppController extends AppController {
    public $components = array('Sample2'); // 読み込まれない

	public function beforeFilter() {
	    parent::beforeFilter();
	    $this->Sample2 = $this->Components->load('Sample2'); // 読み込まれる
	}
}
```

```php
<?php
App::uses('ApiAppController', 'Controller');
class SampleController extends ApiAppController {
    public $components = array('Sample3');
}
```




#### 2,マージする親クラスの変更
これをすると、AppControllerの定義がマージされないので注意してください。

```php
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $components = array('Sample1'); // 読み込まれない
}
```

```php
<?php
App::uses('AppController', 'Controller');
class ApiAppController extends AppController {
    public $components = array('Sample2'); // 読み込まれる

    // マージする親クラスを変更
	protected $_mergeParent = 'ApiAppController';
}
```

```php
<?php
App::uses('ApiAppController', 'Controller');
class SampleController extends ApiAppController {
    public $components = array('Sample3');
}
`````



個人的には後者の方が好みです。
Closure Compiler で定数置換

[Closure Compiler](https://developers.google.com/closure/compiler/?hl=ja) の[定数の置換](https://developers.google.com/closure/compiler/docs/js-for-compiler?hl=ja#tag-define)が便利だったのでメモ。

```js
/** @define {string} */
var HOGE = 'hoge';
```

こんなソースを

```shell-session
java -jar compiler.jar --define "HOGE='moge'" --js src.js
```

と実行すると

```js
var HOGE="moge";
```

定数の値を上書きして出力してくれる。
API KEY とかを環境で切り分ける時に便利かもしれない。

ついでに Grunt で使う時は

```js
config =  {
    js: src.js,
    options: {
        define: [
            "HOGE=\\'moge\\'"
        ]
    }
};
```

と指定する。
Google ChromeでSPDYを無効にする方法


Google ChromeでSPDYを無効にさせたいときには以下の起動オプションを使う

```
--use-spdy=off
```

Macで実際に起動オプションを使って起動するには

```
open /Applications/Google\ Chrome.app/ --args --use-spdy=off
```



## 参考
http://stackoverflow.com/questions/12264568/how-to-disable-spdy-in-google-chrome
Vimで0埋めされた数値をインクリメントしたい

下のようなリスト結構ありますよね。

```
001 hoge
002 fuga
...
007 piyo
```

で、これをマクロで一番下の行をコピーして、インクリメントしたいこととか結構ありますよね。で、`007`の上で`C-a`を押すと`010`になってびっくりするわけですよ。

```
...
007 piyo
010 piyo
```

こうなる。何故こうなるかというと8進数として扱われるからなんですが、これを防ぐには、nfを空にすれば良いとのことです。

```vim
set nf=
```

すると、ちゃんと下のようになります。

```
...
007 piyo
008 piyo
```
CentOS5 で yum updateしたら404で返ってきた

CentOS5 で yum updateしたら404で返ってきた

~~~
yum update
http://ftp.riken.jp/Linux/caos/centos/5/os/i386/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
~~~

ので、baseurlを修正。

~~~
vi /etc/yum.repos.d/CentOS-Base.repo
~~~

~~~
# baseurl=http://ftp.riken.jp/Linux/caos/centos/$releasever/os/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
~~~

ぐぐっても↑の方のURLばかりがひっかかるのはなんでだろうか...