OmniAICreator/Qiita-1.07M huggingface dataset:
文字まとめ for JS(正規表現)


正規表現用の文字のホワイトリストをまとめました。

かなり広い範囲でグループ化していますが、使うときは適宜間引いてください。

```js:Define
// [ !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]
var SIGN_CHARS = '\\u0020-\\u002F\\u003A-\\u0041\\u005B-\\u0061\\u007B-\\u007E';

// 半角数字
var DIGIT_CHARS = '0-9';

// 半角英字
var ALPHA_CHARS = 'A-Za-z';

// [ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~]
var ALPHANUMERIC_CHARS_WITH_SIGN = '\\u0020-\\u007E';

// [！＂＃＄％＆＇（）＊＋，－．／：；＜＝＞？＠［＼］＾＿｀｛｜｝～]
var FULLWIDTH_SING_CHARS = '\\uFF01-\\uFF0F\\uFF1A-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF5E';

// [０１２３４５６７８９]
var FULLWIDTH_DIGIT_CHARS = '\\uFF10-\\uFF19';

// [ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ]
var FULLWIDTH_ALPHA_CHARS = '\\uFF21-\\uFF3A\\uFF41-\\uFF5A';

// [！＂＃＄％＆＇（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［＼］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～]
var FULLWIDTH_ALPHANUMERIC_CHARS_WITH_SIGN = '\\uFF01-\\uFF5F';

// [ぁ-ゖゝ-ゟ]
var HIRAGANA_CHARS = '\\u3041-\\u3096\\u309D-\\u309F';

// [ァ-ヺヽ-ヿ]
var KATAKANA_CHARS = '\\u30A1-\\u30FA\\u30FD\\u30FF';

// [゛゜(結合文字含む)ー]
var KANA_COMMON_CAHRS = '\u3099-\u309C\u30FC';

// [　、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰〱〲〳〴〵〶・～]
// ※ 波ダッシュ・全角チルダ問題があるため 全角チルダを含めることとする
// [参考](http://ja.wikipedia.org/wiki/Unicode#.E6.B3.A2.E3.83.80.E3.83.83.E3.82.B7.E3.83.A5.E3.83.BB.E5.85.A8.E8.A7.92.E3.83.81.E3.83.AB.E3.83.80.E5.95.8F.E9.A1.8C)
var JAPANESE_SIGN_CHARS = '\u3000-\u3036\u30FB\\uFF5E';

// [ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ]
var NARROW_KATAKANA_CHARS = '\\uFF66-\\uFF9F';

// [｡｢｣､･]
var NARROW_JAPANESE_SIGN_CHARS = '\\uFF61-\\uFF65';

// スペースとスペースに似た文字
var SPACE_LIKE_CHARS = '\\s\\n\\t\\u0009\\u0020\\u00A0\\u2002-\\u200B\\u3000\\uFEFF';
```

## 使い方

こんな感じで正規表現オブジェクトを生成して使います。

```js:HowTo
var rHiragana = new RegExp('[' + HIRAGANA_CHARS + ']');
rHiragana.test('あいうえお'); // => true

// ブラケットで挟むのが少々手間ですが、否定の時などいろいろ対応できます。
var rNotHiragana = new RegExp('^[^' + HIRAGANA_CHARS + ']+$');
rNotHiragana.test('abc'); // => true
```
Android標準ブラウザだとvolumeやmutedがきかない

# 基本的には動かない…はず

* volume属性
  * http://www.longtailvideo.com/html5/volume/
* muted属性
  * http://www.longtailvideo.com/html5/volume/

# でも動く端末もある

確認できる端末が少ないですが。。

* SC-04E （Android4.2.2）
* SC-03E （Android4.1.1）

だと動きました。

# Chromeだと…

* Chrome(29.0.1547.59)だと動かない
* Chrome Beta(30.0.1599.17)だとP-03E（標準ブラウザやChromeでも動かなかった）でも動く

どういうことだ…

# まとめ

* ミュート機能や音量機能は当分諦めよう！
FuelPHP でリレーションを組んだ孫モデルも一緒にsaveするやり方


ざっと、こんな感じ？というのをメモ。
ソースを見た感じ、key_from と key_to を配列にすれば良いっぽい。
※ドキュメントのどっかに書いてあるかも

```php:モデルたち
<?php
class Model_Parent extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'name',
	);

	protected static $_has_many = array(
		'child' => array(
			'key_from' => 'id',
			'model_to' => 'Model_Child',
			'key_to' => 'pid',
			'cascade_save' => true,
			'cascade_delete' => true,
		),
	);
}

class Model_Child extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'pid',
		'name',
	);

	protected static $_has_many = array(
		'grandchild' => array(
			'key_from' => array('id', 'pid'),
			'model_to' => 'Model_GrandChild',
			'key_to' => array('cid', 'pid'),
			'cascade_save' => true,
			'cascade_delete' => true,
		),
	);
}

class Model_GrandChild extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'cid',
		'pid',
		'name',
	);
}

```

saveするときは、孫を子に、子を親にセットする必要がある。

```php:saveする
<?php
$grandchild = Model_GrandChild::forge();

$child = Model_Child::forge();
$child->grandchild[] = $grandchild;

$parent = Model_Parent::forge();
$parent->child[] = $child;

$parent->save();

```
knife ec2実行時に Excon::Errors::SocketError:が発生した場合の対処方法

```zsh
$ gem list knife-ec2

*** LOCAL GEMS ***

knife-ec2 (0.6.4)
$ knife ec2 server list
ERROR: Excon::Errors::SocketError: Unable to verify certificate, please set `Excon.defaults[:ssl_ca_path] = path_to_certs`, `Excon.defaults[:ssl_ca_file] = path_to_file`, or `Excon.defaults[:ssl_verify_peer] = false` (less secure).
$ gem update excon
Updating installed gems
Updating excon
Fetching: excon-0.25.3.gem (100%)
Successfully installed excon-0.25.3
Done installing documentation for excon (0 sec).
Gems updated: excon
 
$ knife ec2 server list
Instance ID  Name  Public IP  Private IP  Flavor  Image  SSH Key  Security Groups  State
・・省略・・
```
JenkinsでiOSのビルドを行う時にハマるポイントとその解決法・１


とても便利なJenkinsですが、 **たまによくしっかり** ハマるので、その辺のポイントと私なりの解決法を共有します。

XCodeのプロジェクトが他のstatic libraryプロジェクトを含んでいる場合
---------------------------------------------------------------------------------------

まず、普通にXCode GUIを使っていてもこの辺は最初ハマることもあるかと思います。

特に static library側の **Headerファイルが見つからない！** というビルドエラーは結構悩まされます。
しかしこれをXCode GUIで解決するまではFAQのようで、ググると色々出てきます。
例） http://www.cocoanetics.com/2012/01/helping-xcode-find-library-headers/

ポイントは 

* static library 側
	* Header を public にする
	* Public Headers Folder Path を工夫する (Library名とかにするとか)
* 利用する側
	* Header Search Paths に 下記を追加しておく
		* $(CONFIGURATION_BUILD_DIR)
		* "$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"

などでしょうか。
他にも色々あるとは思いますが。

本題は、XCode GUIで Build や Archiveはできるのに、jenkinsなどで xcodebuildするときにもう一度ハマるところです。。

### Jenkinsでビルド(xcodebuild)すると static library プロジェクトの Headerファイルが見つからない！

結論から言うと、ビルドの引数に原因があります。

#### target を使わずに、 workspace と schema を使う
Jenkins の Xcode Pluginを使っていると大抵 フォーム上の「Target」 (xcodebuild オプションの *-target* )を使うことが多いのではないか(?)と思いますが、これだと上手くいかないようです。

Jenkinsフォーム上で「Xcode Workspace File (*-workspace*)」「Xcode Schema File(*-schema*)」を指定して、Targetを **指定しない** ようにすればおそらく解決すると思います。

ここで注意点は、workspaceの指定の仕方で、
ファイルシステム上では `my-app/my-app.xcodeproj/project.xcworkspace` となっている場合、フォーム上では `my-app/my-app.xcodeproj/project`  と **末尾の`.xcworkspace`を削除しないといけない** という点です（勝手に付けるようです）。

#### schemaの定義は 一度 xcodeを起動しないと生成されない？

もう一つ、xcodebuild が schemaを探す時に 
`my-app.xcodeproj/project.xcworkspace/xcuserdata/<username>.xcuserdatad`
をみるようなのですが、それが一度Xcodeを起動しないと生成されない(?)点です。

jenkinsの実行ユーザで一度 Xcodeでそのプロジェクトを起動しておくか、適当に実行ユーザ名でxcuserdatadを作成してリポジトリにCommitしておくかしないと、新規に Cloneした場合などで失敗してしまうでしょう。
私の場合は、リポジトリにCommitしておくようにしました（そう頻繁には変わらないと思うので）。

### ipaファイルが作成されない！？

ビルドの後に、ipaファイルを作成することもよくあると思いますが、
こんな感じでエラーになることがあると思います。

```
** BUILD SUCCEEDED **

Cannot remove *.ipa files from a non-existing directory:
 /Users/leon/Work/projects/wearehive/flatstr/build/Flatstr/dev/jenkins/workspace/Snug-debuOLD/build/Debug-iphoneos

 Packaging IPA
 FATAL: null
 java.lang.NullPointerException
```

その場合、下記にもありますが、
http://stackoverflow.com/questions/10738624/trying-to-compile-an-xcode-project-with-a-workspace-on-jenkins-slave

**SYMROOT** に `${workspace}/build/[app name]/Build/Products` などと書いておくと治ります。


##（おまけ）Jenkinsで生成したipaファイルをWebからDLしてInstallする方法

XCodeビルドの後に「 **シェルの実行** 」を追加して、下記のようなスクリプトを貼り付けます。

https://gist.github.com/mokemokechicken/6363430

*PACKAGE_NAME*, *BUNDLE_IDENTIFIER*, *MASTER_JENKINS*, *LOGO_IMG_URL* は適切に設定してください。

最後に、ビルド後の処理で「 **成果物の保存** 」を追加して、`build/**/*.ipa,build/*` と書いておきます。

これで、ビルドが成功したら HTMLとplistとipaが生成され、JENKINSのJOBページの生成したHTMLからDLしてInstallできるようになると思います。


※ ここではProvisioningファイルなどの設定は割愛していますが、もちろん適切にしておく必要があります。
特定の拡張子のファイルをリスト化

例えば、プロジェクトにリソースとしてJPEGファイルをいくつか入れたとして。
JPEGファイルをリスト化して配列でファイル名を返すメソッド。

```objc:
-(NSArray *)getFileList:(NSString *)extension{
	NSMutableArray *array = [[NSMutableArray alloc] init];
	// ファイル一覧を取得
	NSFileManager* fileManager = [[NSFileManager alloc] init];
	NSString *path = [[NSBundle mainBundle] bundlePath];
	for(NSString *content in [fileManager contentsOfDirectoryAtPath:path error:nil]) {
		// 拡張子を抜く
		if ([content hasSuffix:extension]) {
			NSString *content2 = [content stringByDeletingPathExtension];
			//NSLog(@"%@", content2);
			[array addObject:content2];
		}
	}
	return array;
}
```

実行するときはこんなかんじ

```objc:
[self getFileList:@".jpg"];
```
Packerを利用開始するまでのメモ


## 背景
### Why?
インフラの構築作業を自働化したい
### How?
ミドルウェアのレイヤーを対象とし、Chefを利用して実装する
### What?
何度も繰り返し構築と破壊を繰り返せる開発環境を用意する



## 作業環境
| software | version |
|:--|:--|
| Mac OS X | 10.8.4 |
| zsh | 4.3.11 (i386-apple-darwin12.0) |
| git | 1.7.12.4 (Apple Git-37) |
| Homebrew | 0.9.4 |
| VirtualBox | 4.2.16-86992 |
| rbenv | 0.4.0-51-ga2adc61 |
| ruby | 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.1] |
| bundler | 1.3.5 |
| vagrant | 1.2.7 |
| Packer | 0.3.4 |

| rbenv plugins | github |
|:--|:--|
| rbenv-binstubs | https://github.com/ianheggie/rbenv-binstubs.git |
| rbenv-gem-rehash | https://github.com/sstephenson/rbenv-gem-rehash.git |
| rbenv-gemset | https://github.com/jf/rbenv-gemset.git |
| ruby-build | https://github.com/sstephenson/ruby-build.git |

``` .zshrc
# Source User definitions
if [ -d $HOME/.rbenv/bin ]; then
    export PATH="$HOME/.rbenv/bin:./.bundle/bin:$PATH"
    eval "$(rbenv init -)"
fi
```



## 1. VirtualBox のインストール
https://www.virtualbox.org/wiki/Downloads

上記サイトからバイナリパッケージをダウンロードして実行する
- VirtualBox platform packages
- VirtualBox xx.xx.xx Oracle VM VirtualBox Extension Pack ( xx.xx.xx はバージョン )



## 2. vagrant のインストール

``` Gemfile
source "https://rubygems.org"

gem 'vagrant',      :git =>    'https://github.com/mitchellh/vagrant.git',
                    :tag =>    'v1.2.7'
```

```Gemfileの準備ができたら、bundle経由でインストールします
bundle install --path vendor/bundle --binstubs .bundle/bin
source ~/.zshrc
```


## 3. Packer のインストール
http://www.packer.io/intro/getting-started/setup.html

```上記サイトに記載されているように、Homebrew経由でインストールします
brew tap homebrew/binary
brew install packer
```

## 4. Vagrantfile の設定
以降は、これから実際に設定ファイルを書いて試してみた結果を後日記載する
実際に書いてみた設定ファイルは以下を参照（予定）

https://github.com/libero18/practice-packer


## 5. machine.json の設定
CANNON.jsについてのメモ


##CANNON.jsとは？
CANNON.jsは、JavaScript製の軽量な物理エンジンです。
Three.jsにインスパイアされていて、Three.jsの構文に非常に似ています。
物理演算結果は、以下のように簡単にThree.jsのオブジェクトにコピーすることができるようになっています。

```javascript
cannonObj.position.copy(threeObj.position);
cannonObj.quaternion.copy(threeObj.quaternion);
```

##Events

###collide event
なにかの物体にぶつかった際に発生するイベント

```javascript
cannonObj.addEventListener("collide", function(e) {
	alert("The object just collided with the ground!");
	console.log("Collided with body:", e.with);
	console.log("Contact between bodies:", e.contact);
});
```

###sleepy event

オブジェクトの運動が止まった際に発生するイベント

```javascript
cannonObj.addEventListener("sleepy",function(event){
	console.log("The object is sleepy!");
});
```

###sleep event

オブジェクトの運動が停止し、規定の時間過ぎた場合に発生するイベント

```javascript
cannonObj.addEventListener("sleep",function(event){
	console.log("The object sleep!");
});
```

###wakeup event

オブジェクトのsleepが溶けたときに発生するイベント？

```javascript
cannonObj.addEventListener("wakeup",function(event){
	console.log("The sphere woke up!");
});
```

ちなみに、これらの判定を行うには以下の設定を合わせて行う必要がありそう。

```javascript
world.allowSleep = true;
cannonObj.allowSleep = true;
cannonObj.sleepSpeedLimit = 0.1; //velocityの強さ（norm）
cannonObj.sleepTimeLimit = 1; //停止1秒後にsleepイベントが発火するように
```

###wakeUpメソッド

sleepを有効にすると、外部から撃力を与えたりしてもsleep状態が保持されるので、`wakeUp()`メソッドを叩いてsleepを解除する必要があることに注意。
P-03Eでのvideoにposter属性指定すると再生時に上下がぺしゃんこになるバグ

# 確認環境
* P-03E
  * 標準ブラウザ
  * Android4.2
  * ビルド番号：10.0992

# 解決策：
* videoのposter属性を使わずにほかのelementで画像を表示、再生ボタンを押したら非表示にしてvideoタグ挿入がよさそう（youtubeモバイル版がそんな感じ）

## 追記 2013/8/29

* P-03Eだとvideoタグにdisplay:noneが効かない
* 親要素をoverflow:hiddenにしてimgを表示/非表示で対応しようとするとvidoeアイコンが画面端に表示される
* video要素をdivで囲むと上記のバグを回避できる
FuelPHPでインポートのバッチ処理をする（考え方だけ）


**頭の整理のためのメモなので、考え方だけです。**
**実際のコードに関しては、記載しません。**

## 要求

1. 途中で何らかエラーがあったらすべてをロールバック
2. エラー内容はすべて表示

## どういう流れにするか

最初にバリデーションをしてから、最後にsaveをする。

```php:プログラムイメージ
<?php
// この前にはファイルオープンやらなにやら前処理があるはず

foreach ($datas as $i => $data)
{
	try
	{
		$model = Model_Hoge()::forge($data);
		$model->validate();
		$models[] = $model;
	}
	catch (Exception_ValidateError $e)
	{
		$errors[] = $e->show_errors();
	}
}

// エラー時に格納したものがなければ保存
if (count($errors) === 0)
{
	foreach ($models as $model)
	{
		$model->save();
	}
}
```

おそらくこれで要求は満たせる

## 1:Nの関連性があるモデルはどうするか

1:Nの関連性があるモデルがある場合は、どうしたらいいのか。

```php:プログラムイメージ
<?php
// この前にはファイルオープンやらなにやら前処理があるはず

// Model_Hoge (1) -> Model_Fuga (N) という継承とする

foreach ($datas as $data)
{
	try
	{
		// hogeのバリデーション
		$hoge = Model_Hoge::forge($data);
		$hoge->validate();
		
		// fugaのバリデーション
		$fuga = Model_Fuga::forge($data);
		$fuga->validate();
		
		// 問題なければ親のモデルにセット
		$hoge->fuga[] = $fuga;

		// 最後にsaveするので、一旦格納
		$models[] = $hoge;
	}
	catch (Exception_ValidateError $e)
	{
		$errors[] = $e->show_errors();
	}
}

if (count($errors) === 0)
{
	foreach ($models as $model)
	{
		// まとめてsaveする
		$model->save();
	}
}
```

こんな感じでできるんじゃないかなー。

**8/28追記**
以下でも良い。というか以下の方がやりやすかった。

```php:別案
<?php
// この前にはファイルオープンやらなにやら前処理があるはず

// Model_Hoge (1) -> Model_Fuga (N) という継承とする

DB::start_transaction();

foreach ($datas as $data)
{
	try
	{
		// hogeのバリデーション
		$hoge = Model_Hoge::forge($data);
		$hoge->validate();
		
		// fugaのバリデーション
		$fuga = Model_Fuga::forge($data);
		$fuga->validate();
		
		// 問題なければ親のモデルにセット
		$hoge->fuga[] = $fuga;

		$hoge->save();

		// ここでsaveしているので
		// 同じ内容を入れたくない場合は、2週目以降検索すればよい
	}
	catch (Exception_ValidateError $e)
	{
		$errors[] = $e->show_errors();
	}
}

if (count($errors) === 0)
{
	DB::commit_transaction();
}
else
{
	DB::rollback_transaction();
}
```
[日本語ファイル名対応] 簡単にファイルをダウンロードさせられる関数

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在ではブラウザの動作が変化している可能性もありますので，過去の記事として参考程度にご覧ください。**

# 追記

今回参考にさせていただいた記事はこちら。
http://d.hatena.ne.jp/maachang/20110730/1312008966

この内容をもとにPHPで関数化してみました。

```php
function download($input_filename, $output_filename = '') {
    static $pattern = '/Chrome|Firefox|(Opera)|(MSIE|IEMobile)|(Safari)/';
    if (headers_sent() || ($size = @filesize($input_filename)) === false) {
        return false;
    }
    if ((string)$output_filename === '') {
        $output_filename = $input_filename;
    }
    $output_filename = mb_convert_encoding(
        $output_filename,
        'UTF-8',
        'ASCII,JIS,UTF-8,CP51932,SJIS-win'
    );
    switch (true) {
        case !isset($_SERVER['HTTP_USER_AGENT']):
        case !preg_match($pattern, $_SERVER['HTTP_USER_AGENT'], $matches):
        case !isset($matches[1]):
            $enc = '=?utf-8?B?' . base64_encode($output_filename) . '?=';
            header('Content-Disposition: attachment; filename="' . $enc . '"');
            break;
        case !isset($matches[2]):
            $enc = "utf-8'ja'" . urlencode($output_filename);
            header('Content-Disposition: attachment; filename*=' . $enc);
            break;
        case !isset($matches[3]):
            $enc = urlencode($output_filename);
            header('Content-Disposition: attachment; filename="' . $enc . '"');
            break;
        default:
            header('Content-Disposition: attachment; filename="' .$output_filename . '"');
    }
    $finfo = new finfo(FILEINFO_MIME);
    header('Content-Type: ' . $finfo->file($input_filename));
    header('Content-Length: ' . $size);
    return readfile($input_filename);
}
```

*`$input_filename`* はロケールにあったエンコーディングで渡してください。
*`$output_filename`* を省略した場合は *`$input_filename`* がそのまま使われます。
*`$output_filename`* は自動的にUTF-8に変換されます。
成功するとダウンロードさせたファイルのサイズ、失敗すると`FALSE`を返します。

```php:Windowsでの使用例
download(mb_convert_encoding('あいうえお.jpg', 'SJIS-win', 'UTF-8'));
```

IE9以降・Chrome14以降・その他ブラウザの挙動は未確認なので検証していただけましたらご報告いただけると幸いです。
HPサーバーのラックレールの外し方

端の外側に押す箇所があるので指で押しながらグッと引くと外れる。

前面と背面それぞれにあります。

硬くて押せなくなっている場合は、端の真ん中に穴がありますが、
それをマイナスドライバーやラジオペンチでぐっと何度か押してあげると押せるようになります。
コマンドラインでディレクトリを mark & jump 



良く移動するディレクトリをマークしてジャンプするためのtips。`.bashrc`に追加して使用
[autojump](https://github.com/joelthelion/autojump)や[z](https://github.com/rupa/z)みたいな感じのやつですかね。使った事無いですが。


```bash:.bashrc
export MARKPATH=$HOME/.marks
function jump {
    cd -P $MARKPATH/$1 2>/dev/null || echo "No such mark: $1"
}
function mark {
    mkdir -p $MARKPATH; ln -s $(pwd) $MARKPATH/$1
}
function unmark {
    rm -i $MARKPATH/$1
}
function marks {
    ls -l $MARKPATH
}
```

マーキングしたいディレクトリで

    mark

名前付けたい時は

    mark huge

マークした一覧表示は

    marks

マークしたディレクトリに移動は

    jump huge

マークの削除は

    unmark huge


元ソースはこちらとかとか
[Quickly navigate your filesystem from the command-line](http://jeroenjanssens.com/2013/08/16/quickly-navigate-your-filesystem-from-the-command-line.html)
<https://news.ycombinator.com/item?id=6229001>
<https://github.com/robbyrussell/oh-my-zsh/pull/2045>


自分が使いやすく書き直したりしてるのでそれぞれの好みで変更してくだされ。


`bash_completion`を使っている人は`$HOME/.bash_completion`に以下を記述すればコマンドの補完が可能

```bash:.bash_completion
function _completemarks() {
    local keys word

    word=${COMP_WORDS[COMP_CWORD]}
    keys=$(echo $MARKPATH/* | for f in $(xargs) ; do basename $f ; done | xargs)

    if [ ${#keys[*]} -gt 0 ]; then
        COMPREPLY=($(compgen -W "${keys[@]}" $word))
    fi

    return 0
}

complete -F _completemarks jump
complete -F _completemarks unmark
```
GrowthForecastをDebianにインストールしたい

GrowthForecastをDebian上にインストールしたい。

## 1. growthforecastユーザをつくる

`growthforecast`ユーザを作って`/home/growthforecast`にGrowthForecast関連のファイルを置くことにした。

```
harukasan$ sudo useradd -r -m -s /bin/bash growthforecast
```

## 2. Perl 5をインストールする

GrowthForecastではsystemのPerlではなく別にインストールすることを推奨している。
Perlのインストールにはperlbrewを使ってみることに。

```
harukasan$ sudo su - growthforecast
growthforecast$ \wget -O - http://install.perlbrew.pl | bash
growthforecast$ source perl5/perlbrew/etc/bashrc
growthforecast$ echo "source /home/growthforecast/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
```

で、perlbrewを使ってPerl 5をインストールする。
はじめにPerl 5.19.3をいれようとしたらテストでこけて、よくわからなかったのでPerl 5.18.1をインストールした。Perl力低い。

> Perl 5.19は開発版なので5.18が正解とのこと。

```
growthforecast$ perlbrew install perl-5.18.1
```

時間がかかるのでまったりお昼ご飯でも食べてこよう。

## 3. Cpanmをインストールする

お昼を食べ終わったらPerlのインストールが完了しているかと思うので、cpanmをインストールする。

```
growthforecast$ perlbrew switch perl-5.18.1
growthforecast$ perlbrew install-cpanm
```

## 4. GrowthForecastをインストールする

そのままインストールしようとするとエラーが出るので、必要なパッケージをインストールしておこう。
必要なパッケージはエラーログから推測できる。

```
harukasan$ sudo aptitude install  libcairo2-dev libpango1.0-dev libxml2-dev
```

```
growthforecast$ cpanm -n GrowthForecast
```

## 5. 起動してみる

`growthforecast.pl`コマンドで起動してみる。

```
$ growthforecast.pl --data-dir /home/growthforecast/data &
```

起動できたら`http://localhost:5125/`にアクセスしてみることで確認できる。
デーモン化するためにはinit.dスクリプトを用意したりしないといけないが、長くなったので別の機会に。
DockerによるChefのCookbooks開発

Chefのcookbookをちょっと実行したい時、みなさんどうしているのでしょうか。
Amazon S3上に、手元のMacbookのVirtualbox(Vagrant)で、さくらのVPSで、XenサーバのDomUで。。。などなど色々だと思います。
仮想環境だとまっさらなOSを立ち上げるのにいちいち時間がかかる。

みなさん
###Docker使いませんか？

私はUbuntuサーバにDockerをインストールした環境を用意して
その上でCentOSでも, UbuntuでもDockerで文字通り __ドカドカ__ 作って消してChefのレシピを開発しています。
Docker上のOSはLinux Containerなので仮想環境よりもCreate/Destroyが早くできます。

そして、そのDockerを使ってChefのCookbookを開発するのに便利なkitchen-dockerの使い方を紹介します。
※今回はDockerに関する記事は割愛します。

kitchen-dockerはdockerコンテナをkitchenでコントロールする便利なプラグインです。

##【インストール】
※Dockerが起動する環境に入れましょう。test-kitchenも一緒にインストールされます。

```command
gem install kitchen-docker
``` 

##【Option】
* kitchen init ... 設定ファイル等環境を構築します。(kitchen-vagrantの設定ファイルができますので書き換えます)
* kitchen create ... .kitchen.yml(or kitchen.local.yml)で指定したdockerのOSコンテナを立ち上げます。その後、OSコンテナでsshdも立ち上げてくれます。
* kitchen setup ... 立ち上げたdocker上のOSコンテナにChef-soloをインストールします。その後、手元にあるchefのcookbookをアップロードしてChef-soloで.kichen.yml(.kichen.local.yml)で指定したレシピ or Roleを実行してくれます。
* kitchen converge ... cookbookを再度アップロードしてChef-soloを実行してくれます。
* kitchen destroy ... 作ったDocker上のOSコンテナを消してくれます。 
などなど他にもあります。

##【使い方】
###1. 環境設定

```command
# cd /var/chef
# kitchen init
```

###2. 設定ファイルの編集
YMLファイルなのでスペース(' ')に注意してください
* driver_plugin: docker ... dockerプラグインを利用します
* name: ... 何でもOK。
* image: "centos" ... コンテナを作成するときのdockerイメージ名を指定します。
* run_list: ... role, recipe等指定できます
* attributes: ... attributes等指定できます。

```command
# .kitchen.yml
---
driver_plugin: docker
driver_config:
  require_chef_omnibus: true

platforms:
- name: centos-docker-test
  driver_config:
    image: "centos"
    platform: "rhel"
  run_list:
    recipe[httpd]

suites:
- name: default
  run_list: []
  attributes: {}
```

##【demo】
あとはデモをどうぞ
![](http://www.1mg.org/img/kitchen_setup_create.gif "DEMO")
Quickpost to Drupal via prepopulate module


Here's a handy bookmarklet for posting to Drupal from a bookmarklet:


```javascript
javascript:var nodeaddpath="http://www.example.com/node/add/article",d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=e?e():k?k():x?x.createRange().text:0,l=d.location,e=encodeURIComponent,title=""+d.title+"",body="> "+s+"\n\nFrom ["+d.title+"]("+d.location+")",url=nodeaddpath+"?edit[title]="+e(title)+"&edit[body][und][0][value]="+e(body);nourl=function(){w.location=nodeaddpath};a=function(){w.open(url,"quickpost","toolbar=0,resizable=1,scrollbars=1,status=1,width=424,height=570")||(l.href=url)};/Firefox/.test(navigator.userAgent)?"about:blank"==l?setTimeout(nourl,0):setTimeout(a,0):"about:blank"==l?nourl():a();;void(0);
```
Knockout.js プリミティブ型の配列でTemplateを使用する

Knockout.jsのTemplateに書いてあるサンプルは、オブジェクトの配列であることを前提にしている。
http://knockoutjs.com/documentation/template-binding.html  

[ 1 , 2, ,3 , 4] みたいなプリミティブ型の配列は単純バインドの例しかなく、これだと配列内の要素を利用してDOMエレメントを作ったりできない。
http://knockoutjs.com/examples/simpleList.html

そんな時は、 **$data**を使用する。プリミティブ型配列の場合$dataは配列内の値そのものになるため、下記のように使用可能。

```js:
<script type="text/html" id="tmp-array">
    <div data-bind="text:$data" class="tmp"></div>
</script>
```

JSFIDDLEのサンプルはこちら。
http://jsfiddle.net/icoxfog417/YVceu/7/
gitでリモートのブランチにローカルを強制一致させたい時

なんか作業内容が妙になってしまった時に
「ええーいリモートが合ってるんだからアイツに合わせたいんだよ！」
とイライラしたら下記。

```bash:
git fetch origin
git reset --hard origin/master
```

以下参考。
http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
gitのブランチリストを鮮度順に表示する


>この記事を書いた2013年当初の`git`(version 1.8)から月日は流れ、いまどきの`git` (version 2.7以降) は、`--sort` オプションがあるのでそれを使うのがよいでしょう。というわけでこれを追記しておきます。

## git branch --sort=\<key\>

- `--sort`オプションの`key`を指定するだけになりました。 (version 2.7.0以降)
- 使える`key` は git-for-each-ref のそれと同じなので、日付順にソートしたいときには、`authordate`,`committerdate` などが指定可能です。
- 同じようにタグのリストも `git tag --sort=taggerdate` のようにタグ付け日時順に並び替えられます。

`--sort`オプションや`key`の詳細については以下を参照してください。

- [Git \- git\-branch Documentation](https://git-scm.com/docs/git-branch/)
- [Git \- git\-for\-each\-ref Documentation](https://git-scm.com/docs/git-for-each-ref)


追記はここまで 2017/3/22

以下は 2013/08/28 の記事 (git version 1.8.2 で検証)

---

gitのブランチ一覧といえば

* `git branch` ローカルブランチ一覧
* `git branch -r` リモートブランチ一覧
* `git branch -a` ローカルとリモートのブランチ一覧

とするのですが、アルファベット順にソートされて表示されてしまいます。

ちょっとした作業でテキトーに作ってしまったブランチがいつ頃作られたり使われたりしたのか知りたくなることがあります。
ブランチ名に日付や時間でもつけていればよいのでが、まあテキトーに作ってるときはそんなことも忘れてhogehogeとか適当に済ませてしまうのはよくあることです。ここでは主にローカル作業中に量産してしまった謎ブランチをなんとなく鮮度順に並べてみる方法について書いてみます。

## git reflog

`git reflog`を使えばチェックアウトやマージの変遷がざっとわかります。
どのブランチからどのブランチへチェックアウトしたかもわかるので、記憶を辿るのにも役に立つでしょう。

`git log -g --abbrev-commit --pretty=oneline`

と同等です。

## git for-each-ref

`git for-each-ref`というコマンドはobjectsize, authordate, committerdate, taggerdateなどでソートすることができます。ソートのキーには複数指定できますし、出力フォーマットもある程度カスタマイズできます。

例えばローカルブランチをcommiterdateの新しい順に上から表示するには

```
git for-each-ref --sort='-*committerdate' --format="%(refname:short)" refs/heads/
```

さらに詳しくは`git help for-each-ref`参照してください。

### ls .git/refs/head

単に`git branch hogehoge`みたく作りっぱなしのまま、何もコミットしなかったブランチについていつ頃のものだったか知りたいときに`git reflog`や`git for-each-ref`ではちょっとうまくいきません。
そんなときは

```
ls -t .git/refs/heads
```

`-t`オプションで更新時間順にソート。`ls -lt`とかオプションはお好きなように。
コミットされたりするとブランチディレクトリのタイムスタンプが変わってしまうのでブランチ作成日ではないことに注意です。
リモートブランチのことについてはわかりませんし、また、`git gc`すると.git/refs/heads以下が綺麗に掃除されてしまうので`ls`しても何も出てきません。そのときはきっぱり諦めることです。

「ブランチ作成日時」はgitの関知するところではないので、どうしてもそれを管理したいという場合にはブランチ名にタイムスタンプをつける運用にするのがよさそうですが、それはそれで厄介事が増える（メインの作業ブランチと日付の新しさが必ずしも一致しない等による混乱）ものです。

結局コマンド調べまわってるうちに日が暮れたり夜が明けてしまったりしていて、自分は一体何を開発しているのか、人生とは一体何なのかと思い悩んでしまい、一体自分はここに何を書いているのかもわからなくなります。
鮮度順に並べることよりも、楽ちんなブランチ運用の方法を考えるのがマジオススメです。
最近の(2013/8/28時点の)vagrantとberkshelfの書き方

vagrantとberkshelfで超捗る、みたいな記事は一杯あるんですが、その先のちょっと弄りたいってなった時に一瞬悩む。

コミュニティcookbookのattributesとかカスタムしたい。
自分で作ったcookbookのレシピも追加したい。

で、色々調べてみたんですが、run_listで呼ぶよりも、そのプロヴィジョニングしたい環境の名前のcookbookを新しく作って、依存対象となるコミュニティcookbookをmetadataに書き、include_recipeする方が良いんじゃないかと思いました。

既に、BerksfileとVagrantfileがあるものとします。
`vagrant plugin install vagrant-berkshelf`も完了済みと想定。

```bash:
bundle exec berks cookbook ENV_NAME     # ENV_NAMEは各自読み替え
```

でcookbookを作ります。

BerksfileとVagrantfileはこんな感じに。

```rb:Berksfile
site :opscode

cookbook 'ENV_NAME', path: 'ENV_NAME'
```

```rb:Vagrantfile
  config.berkshelf.enabled = true

  config.vm.provision :chef_solo do |chef|
    chef.run_list = [
      "recipe[ENV_NAME]",
    ]
  end
```

で、`ENV_NAME`のcookbookのmetadata.rbに依存するcookbookを書く。
場合によってはcookbookのバージョンも指定する。

```rb:metadata.rb
name             'ENV_NAME'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures createdb'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'

depends          'mysql'
depends          'database'
depends          'redisio'
depends          'imagemagick'
```

そして、`ENV_NAME`のレシピを書く。

```rb:recipe/default.rb
include_recipe 'mysql::server'
include_recipe 'redisio::install'
include_recipe 'redisio::enable'
include_recipe 'imagemagick::devel'
include_recipe 'database::mysql'

mysql_connection_info = {
  host: 'localhost',
  username: 'root',
  password: node['mysql']['server_root_password'],
}

mysql_database 'development_db' do
  connection mysql_connection_info
  action :create
end
```

こんな感じ。
こうしておけば、コミュニティcookbookの値を使って、追加のレシピ作るのが楽になる。
この例だとattributesを書けば、ちゃんとmysql関連のパスワード設定も上書きできる。

実際、コミュニティcookbookを半端に使って中身を弄ると後からハイパー面倒になるので、
それはそのまま使って、必要な追加処理だけこうやって書くのが分かりやすいし管理もしやすいかなーと思いました。

そもそも、本当に本番環境のインフラとして使う場合は、コミュニティcookbookは余りお呼びでない事もあって、そういう場合は一部を除いてスクラッチで書いた方が良い気がします。

私のように開発者向けのテスト環境をVMでサクっと立てたい、という目的でとりあえずアプリが動く構成を作る場合には便利です。
Specs2 2.0 でTODOリストを書いたらいつの間にか仕様書になってた編

Specs2 2.0 でTODOリストを書いたらいつの間にか仕様書になってた編
===============================

Specs2 2.0 使ってますか？s2記法という新しい書き方が個人的に大ヒットだったので、それに纏わる記事を書いてみます。今回は、TODOリストを書いてたつもりがいつの間にか、ちゃんとした仕様書になっていたという体でいきたいと思います。

[Scala - Specs2 2.0 で手抜きテストを行う - Qiita [キータ]](http://qiita.com/erukiti/items/c7a3c0465ef771f21d1d) という記事の続編的なものです。

```
  o Hoge オブジェクト
    + Hoge.hoge でほげーという文字列を返す
    + Hoge.fuga でふがーという文字列を返す
```

例えばこんなTODOリストを作成したとします。今から実装する Hoge オブジェクトについてのTODO です。

```scala
import org.specs2._
import specification._

class HogeSpec extends script.Specification with Grouped {
  def is = s2"""
  o Hoge オブジェクト
    + Hoge.hoge でほげーという文字列を返す
    + Hoge.fuga でふがーという文字列を返す
"""

  "Hoge オブジェクト" - new group {
  }
}
```

前の記事に比べてだいぶん呪文が増えてきましたが、s2記法に先ほどのTODOリストを食わせてみました。これを実行すると、

```
[info] HogeSpec
[info]   o Hoge オブジェクト
[info]     * Hoge.hoge でほげーという文字列を返す  - PENDING - g1.e1
[info]     * Hoge.fuga でふがーという文字列を返す  - PENDING - g1.e2
[info] Total for specification HogeSpec
[info] Finished in 18 ms
[info] 2 examples, 0 failure, 0 error, 2 pending
```

こんな感じで、ペンディングされたテスト項目が二つ表示されています。s2 記法の中に + で始まる行を書くとテストとして認識されるようです。

Specification が script.Specification になったのは、この + で始まる行をテストとして認識させる為のものです。

Grouped trait によって、テストのグループ化に対応します。(僕は残念ながらグループを使わずにこれのテストを走らせる方法がわからなかったので今回グループの説明も加えました。)

さて、テストはどう書けばいいのでしょうか。

```scala
  "Hoge オブジェクト" - new group {
    eg := Hoge.hoge === "ほげー"
  }
```

こういう記法になります。これによってペンディングされていた一つ目のテストが実行される事になります。同様に二つ目の eg := <マッチャー文> を書く事で現存するテストは二つとも実行されます。

「TODOリスト」は自由なインデントが可能です。+ のある行は必ず先頭に空白文字を入れる必要がありますがそれ以外の制限はない(はず)です。自由にTODOリストを作成した上で、それをs2記法に食わせれば、TODOの管理も簡単になり、いつの間にか仕様書として形になってることでしょう。
npm update -gでこんなエラーが出たら…

```zsh:
npm ERR! cb() never called!
npm ERR! not ok code 0
```

長いことupdateしてなかったら，こんなエラー出た．

```zsh:
npm cache clean
```

したら直る模様．

via: http://stackoverflow.com/questions/15393821/npm-err-cb-never-called
Specs2 2.0 で手抜きテストを行う

Specs2 2.0 で手抜きテストを行う
===============================

Specs2 2.0 使ってますか？s2記法という新しい書き方が個人的に大ヒットだったので、それに纏わる記事を書いてみます。今回は、手抜きな使い方編です

s2記法とは
----------

* [A++ [Eric Torreborre's Blog]: Specs2 2.0 - Interpolated](http://etorreborre.blogspot.jp/2013/05/the-latest-release-of-specs2-2.html)
* [Specs2のString Interpolationを使った新しいDSL - scalaとか・・・](http://d.hatena.ne.jp/xuwei/20130614/1371182008)

```scala
package hoge

import org.specs2._

class HogeSpec extends Specification {
  def is = s2"""
ほげー $a
"""

  val hoge = "ほげー"

  def a = {
    hoge === "ほげー"
  }
}
```

こんな感じの書き方です。

手抜きなテストのやり方
----------------------

僕はテストドリブンで書きつつも、仕様書・ユニットテストとしてのテストではなく、コードを書き始める為のエンジンとしてテストを書きたい場合、テストを半ば書き捨てにしてでもがーっと書き始めるというやり方をする事があります。それにあった書き方が s2記法では可能です。

```scala
  def is = s2"""
  ${hoge === "ほげー"}
  ${1 === 1}
  ${true must beTrue}
"""

  val hoge = "ほげー"
```

こういうお手軽な書き方でテストが書けてしまいます。BDDにこだわらずにがーっと書きたい時にはこういう書き方するのもありなんじゃないでしょうか？
DocPadのファイルをGitHub PagesでDeployする方法

DocPadで作ったファイルをGitHub PagesでDeployするには「docpad-plugin-ghpages」という公式のプラグインがあるので、それを使えば楽に /out/フォルダ内のファイルをgh-pagesブランチへpushしてDeployすることができる。

[docpad-plugin-ghpages](https://github.com/docpad/docpad-plugin-ghpages)

## インストール

terminal.appを立ち上げて下記コマンドを入力する。

```bash
$ docpad install ghpages
```

これでインストール完了。

## 使い方

Deployコマンドを入力する前に、DocPadプロジェクトのフォルダ内で下記のコマンド入力する。

```bash
$ git add .
$ git commit -m "commit message"
$ git remote add origin [GitHub clone URL]
$ git fetch origin
```

最後に

```bash
$ docpad deploy-ghpages
```

でDeploy完了。
/out/をgh-pagesブランチにアップしてくれるので良い。
複数ファイル一括置換

ソースファイルなどで後からシンボル名を置換するのかなり面倒くさいので、そのようなケースで利用できるスクリプトです。シェルに置換前文字列と置換後文字列が書かれたcsvファイルを引数で渡し、カンレントディレクトリにあるファイルに対してsedで文字列の置換処理を行っています。

```bash:replase_string.sh

#!/bin/bash

input_file=$1
if [ $# -ne 1 ]; then
	echo "使い方"
	echo "$0 <置換前文字列、置換後文字列を記載したcsvファイル>"
	exit 1
fi

echo "replasing start..."

while read line
do
	comment=`echo ${line} | cut -b1`
	[ $comment == "#" ] && continue

	str1=`echo ${line} | cut -d , -f 1`
	str2=`echo ${line} | cut -d , -f 2`

	echo "${str1} -> ${str2}  now changing!!!"
	find . -type f |\
		grep -v .svn |\
		xargs sed -i "s/${str1}/${str2}/g"

done < ${input_file}

echo "replasing end..."

```

```text:sample.csv

##############
# 第1フィールド:置換前文字列
# 第2フィールド:置換後文字列
りんご,リンゴ
みかん,ミカン
もも,モモ

```
あとでもっかい試す用 - Ruby on Rails 4.0 チュートリアル - 第二章


[Ruby on Rails チュートリアル 実例を使ってRailsを学ぼう / Michael Hartl (マイケル・ハートル)](http://railstutorial.jp/chapters/beginning?version=4.0#top) を見ながらやったことを、あとでもう一度できるようにまとめます！！二章！！

# 第二章の説明

>第2章では、Rails アプリケーションの基本的な仕組みを体験してもらうために、新たなプロジェクトを作成します。手っ取り早く動かしたいので、このデモアプリ (demo_app) では、scaffold (コラム 1.2) を使ってコードを自動生成します。
ただし、scaffold で自動生成されたコードは、複雑であまり美しくありません。このため、第2章では、自動生成されたコードを解説するのではなく、生成された URI (ウェブブラウザで言う URL1) がどのように動くのか、ウェブブラウザを使って確かめることに焦点を当てます。

# プロジェクト作成 & 設定

## プロジェクト作成

	$ cd ~/workspace/ruby/rails
	$ rails new demo_app
	$ cd demo_app

## プロジェクト設定

Gemfileを修正

````
$ subl Gemfile

source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.0'

group :development do
  gem 'sqlite3', '1.3.7'
end

gem 'sass-rails', '4.0.0'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.0'
gem 'jquery-rails', '2.2.1'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
end
````
bundle インストール

	$ bundle install --without production
	$ bundle update
	$ bundle install

## Git設定

	$ git init
	$ git add .
	$ git commit -m "Initial commit"

## Github設定

	$ git remote add origin https://github.com/yujiroarai/demo_app.git
	$ git push -u origin master

# Usersリソース・Micropostsリソースを作成

	$ rails generate scaffold User name:string email:string
	$ rails generate scaffold Micropost content:string user_id:integer
	$ bundle exec rake db:migrate

	# 確認
	$ rails s

# モデルを修正

## マイクロポストをマイクロにする

````
$ subl app/models/micropost.rb
 class Micropost < ActiveRecord::Base
+       validates :content, length: { maximum: 140 }
 end
````

## ユーザーとマイクロポストをhas_manyで関連づける

````
$ subl app/models/user.rb 
 class User < ActiveRecord::Base
+       has_many :microposts
 end
````
````
$ subl app/models/micropost.rb 
 class Micropost < ActiveRecord::Base
+       belongs_to :user
+       validates :content, length: { maximum: 140 }
 end
````
# 確認

## rails consoleでActiveRecordの動きを確認

````
$ rails console
Loading development environment (Rails 4.0.0)

# 一番最初に取得できるUserを変数first_userに入れる
irb(main):001:0> first_user = User.first
  User Load (0.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
=> #<User id: 1, name: "Yujiro Arai", email: "example@example.com", created_at: "2013-08-27 12:55:33", updated_at: "2013-08-27 12:55:33">

# first_userに紐づくmicropostsを取り出す
irb(main):002:0> first_user.microposts
  Micropost Load (1.3ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ?  [["user_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, content: "Post!!!", user_id: 1, created_at: "2013-08-27 13:12:12", updated_at: "2013-08-27 13:12:12">, #<Micropost id: 2, content: "POST22!!!", user_id: 1, created_at: "2013-08-27 13:23:09", updated_at: "2013-08-27 13:23:09">]>
````
# デプロイ

	# Githubにpush
	$ git add .
	$ git commit -m "Finish demo app"
	$ git push
	
	# herokuにデプロイ
	$ heroku create
	$ git push heroku master
	$ heroku run rake db:migrate
chatworkから特定の人の発言だけ抜き出す。



現在開いているチャットの内、画面に描画されている範囲のみ。
developer toolsなどで以下を実行。

```js:
(function(user_name){var class_name = $('#_timeLine').find('._speakerName span').filter(function(i,x){ return x.innerText == user_name;})[0].className;
var timeline =  $('#_timeLine').find('.chatTimeLineMessageArea');
var array = timeline.map( function(i,x){ var c= $(x).find('._speakerName span')[0]; return c ? c.className : "" } );
$.each( array, function(i,x){if(x == ""){array[i] = array[i-1];}} )
timeline.map(function(i,el){if( array[i] == class_name) {
console.log( new Date($(el).closest('.chatTimeLineMessageInner').find('._timeStamp').data('tm')*1000 ).toLocaleString()+'\n'+ $(el).find('pre').text()  );
} })})("抜き出す人の氏名");
```

結果

```

2013/8/26 12:00:00
こんにちは
2013/8/27 18:00:00
こんばんは
```
チャット全てのログから抜き出したい場合は、頑張ってスクロールした後に実行するか、
または、秋に出るらしいAPIを待ちましょう。

http://blog-ja.chatwork.com/2013/05/update-schedule.html
phpenvとphp-buildでPHPのバージョンを切り替えられるようにする


## phpenvのインストール

``` sh
$ brew install phpenv
```

.bashrcに追加

``` sh
export PATH=$PATH:$HOME/.phpenv/bin

# bashの場合
eval "$(phpenv init -)"

# zshの場合
eval "$(phpenv init - zsh)"
```

## php-buildのインストール

2013/08/27時点では、Homebrewのphp-buildが、Githubのリポジトリの0.9.0のタグから取得するようになっているので、PHPのバージョンが少し古かった。
今回はPHP5.5をインストールしたかったので、Formulaを少し修正して、masterブランチから取得してインストールできるようにした。

/usr/local/Library/Formula/php-build.rb の url の部分を以下のように修正してから、インストールする。
	
``` ruby
url 'https://github.com/CHH/php-build.git', :branch => 'master'
```

``` sh
$ brew install php-build
```


### 使い方

インストール可能なPHPのバージョンを確認できる。

``` sh
$ php-build --definitions
```

インストールする場合は、phpenvのディレクトリにインストールする。

phpenv rehash はインストール後必ず実行する必要があるみたい。

``` sh
$ php-build {version} ~/.phpenv/versions/{version}
$ phpenv rehash
```

### Apacheモジュールを生成する場合

Apacheモジュールを生成するには、configureパラメータを追加する必要がある

``` sh
$ vi /usr/local/share/php-build/definitions/{version}
```

以下を一行を追加してから、php-buildコマンドでインストールすること。

```
configure_option "--with-apxs2" "/usr/sbin/apxs"
```

## バージョンを切り替える

バージョンの切替は以下のコマンドで切り替える。

``` sh
$ phpenv global {version}
```

## Apacheモジュールを切り替える

phpenv-apache-versionというphpenvのプラグインを利用する。

[phpenv-apache-version](https://github.com/garamon/phpenv-apache-version/)

リポジトリをphpenvのpluginsディレクトリに置く。

``` sh
$ git clone https://github.com/garamon/phpenv-apache-version ~/.phpenv/plugins/phpenv-apache-version
```

### 使い方

必ずlibphp5.soが、 $HOME/.phpenv/versions/{version}直下にある必要があるので、php-buildでインストール後にコピーしておく必要がある

``` sh
$ cp $HOME/.phpenv/versions/{version}/libexec/apache2/libphp5.so $HOME/.phpenv/versions/{version}/
```

libphp5.soをコピー後、以下のコマンドを実行するとlibphp5.soを入れ替えてApacheが再起動される。

``` sh
$ phpevn apache-version {version}
```

### MacでデフォルトのApacheを利用している場合

MacでデフォルトのApacheを利用している場合は動かないので少し手を加える。
.bashrcや.zshrcにPHPENV_APACHE_MODULE_PATHの環境変数を追加して、Apacheモジュールの置き場所を指定する。

``` sh
export PHPENV_APACHE_MODULE_PATH=/path/to/directory
```

で、httpd.confのlibphp.soの指定場所をPHPENV_APACHE_MODULE_PATHにする。

``` httpd.conf
LoadModule php5_module    /path/to/directory
```
UrbanairshipでAPN送るときにInactive Device Tokensだと言われた時


Urbanairship便利だよ。便利。

リリース後、テストのためにアプリ消して入れたりって繰り返す。
そうすると、アンインストールしたよってAppleからUrbanairshipにフィードバックがいって、tokenがInactiveだって言われる。

Inactive Device Tokens < Support Center
https://support.urbanairship.com/customer/portal/articles/60560-inactive-device-tokens

しゃーないので、API直接叩いて、一度消して、登録しなおす。

Device Registration APIs
http://docs.urbanairship.com/reference/api/v1/registration.html

自分だけ急にAPN来なくなってたりするから、いろいろと不便。
Urbanairshipのドキュメントには起動のたびにdevice_token登録しなおせってかいてある。
degitalOceanはWebAPIでサーバをいじれるのでコマンドラインラッパーを作ってみました。


##DegitalOceanとは
[SimpleCloudHosting for Developper](https://www.digitalocean.com/?refcode=58b04120b7b2)

VPSっす。
AWSとかだと料金体系がめんどくさいですが、
最低スペックで、5$/月のみ。シンプルでわかりやすいです。

これで20GB SSD Diskと1TB/monthの帯域がついてきます。
個人的に遊ぶ分には十分なサーバです。

##WebAPIが提供されています。
開発者向けと銘打つだけあり、WebAPIが提供されています。
今回、そのラッパーをPHPで書いてみました。
コマンドライン上からサーバを停止してスナップショットをとる。
とかができるようになります。

##oceanを導入

```bash:
wget https://raw.github.com/abe00makoto/ocean/master/ocean
chmod +x ocean

vim ~/.bash_profile

export OCEAN_API_KEY=xxxxxxxx
export OCEAN_CLIENT_ID=xxxxxxxx
```
OCEAN_API_KEYとOCEAN_CLIENT_IDはDegitalOceanのコンパネから見に行ってください。

##使い方


###サーバ再起動

```bash:
ocean droplets server01 reboot
```
###サーバ構築
(構築時にはimageは自分のとったsnapshotも指定できます)

```bash:
ocean droplets new droplet_name=abe05 size_id=512MB image_id='CentOS 6.4 x32' region_id='Amsterdam 1' ssh_key_id1=abe00makoto
```
###ミスタイプしたら名前解決して一覧に出してくれます

```bash:
ocean droplets new droplet_name=abe05 size_id=512MB image_id='CentOS 6.4 x32' region_id=??? ssh_key_id1=abe00makoto

name resolution error:region_id:[???]
please select from
[Amsterdam 1] 
[San Francisco 1] 
[New York 2] 


```

```bash:コマンド一覧
usage:
	ocean droplets
	ocean droplets new droplet_name=<droplet_name> size_id=<size_id> image_id=<image_id> region_id=<region_id>
	ocean droplets new droplet_name=<droplet_name> size_id=<size_id> image_id=<image_id> region_id=<region_id> ssh_key_id1=<ssh_key_id1>
	ocean droplets new droplet_name=<droplet_name> size_id=<size_id> image_id=<image_id> region_id=<region_id> ssh_key_id1=<ssh_key_id1> ssh_key_id2=<ssh_key_id2>
	ocean droplets <droplet_id>
	ocean droplets <droplet_id> reboot
	ocean droplets <droplet_id> power_cycle
	ocean droplets <droplet_id> shutdown
	ocean droplets <droplet_id> power_off
	ocean droplets <droplet_id> power_on
	ocean droplets <droplet_id> password_reset
	ocean droplets <droplet_id> resize size_id=<size_id>
	ocean droplets <droplet_id> snapshot snapshot_name=<snapshot_name>
	ocean droplets <droplet_id> restore image_id=<image_id>
	ocean droplets <droplet_id> rebuild image_id=<image_id>
	ocean droplets <droplet_id> enable_backups
	ocean droplets <droplet_id> disable_backups
	ocean droplets <droplet_id> rename name=<name>
	ocean droplets <droplet_id> destroy
	ocean regions
	ocean images
	ocean images <image_id>
	ocean images <image_id> transfer region_id=<region_id>
	ocean ssh_keys
	ocean ssh_keys new ssh_key_name=<ssh_key_name> ssh_public_key=<ssh_public_key>
	ocean ssh_keys <ssh_key_id>
	ocean ssh_keys <ssh_key_id> edit
	ocean ssh_keys <ssh_key_id> destroy
	ocean sizes
	ocean domains
	ocean domains new domain=<domain> ip_address=<ip_address>
	ocean domains <domain_id>
	ocean domains <domain_id> destroy
	ocean domains <domain_id> records
	ocean domains <domain_id> records new record_type=<record_type> data=<data>
	ocean domains <domain_id> records <record_id>
	ocean domains <domain_id> records <record_id> edit
	ocean domains <domain_id> records <record_id> destroy
```
lambdaを使う例

lambdaって便利っぽいけどイマイチ使いどころが分からんばい
と思ってた駄プログラマだけど、この使い方は結構便利かなと思ったのでメモ。

[Pythonの無名関数（lambda）の使い方 - Life with Python](http://www.lifewithpython.com/2013/01/python-anonymous-function-lambda.html "Pythonの無名関数（lambda）の使い方 - Life with Python")

```py:
# リストを適当に定義
l = [ "abcde", "bcdef", "cdefg" ]

import re
# 一致するデータだけ取り出す
print filter( lambda x: re.search("bc", x), l )
# ['abcde', 'bcdef']
```

mapとかでもこんな感じで応用可能。これはベネ。
iOS基本的なアプリケーションライフサイクルサンプル

初心者の自分向けにアプリケーションのlifecycleのサンプルを作ってみました。
あくまでも自分用ですが、参考になる人がいたら作ったかいがあります、、、  

基本的にはAppDelegateのcycleArrayという配列に呼び出されたメソッドのメソッド名とメソッドの内容を順番につっこんでいるだけです。  

   
```objc:
- (void)viewWillDisappear:(BOOL)animated  
{  
    [super viewWillDisappear:YES];   
    [app.cycleArray addObject:[NSString stringWithFormat:@"%s\n%@",__func__,@"ビューが非表示にされる前にこの処理が呼ばれる。"]];   
}  
```    

下記のgithubリンクよりダウンロードしてお試しください。

#ScreenShot

![IMG_0821.png](https://qiita-image-store.s3.amazonaws.com/0/14749/6f51efba-9263-719e-f437-df064886b7cc.png)![IMG_0824.png](https://qiita-image-store.s3.amazonaws.com/0/14749/2f173b76-d453-d7a6-00d2-d7ff5619acba.png)![IMG_0822.png](https://qiita-image-store.s3.amazonaws.com/0/14749/484c8aca-4cd1-3f88-5bb9-4c6fd4a1c723.png)

#Demo youtube
[AppLifeCycle](http://youtu.be/qB8nCJn7ihw)

#DownLoad

 [github AppLifeCycle](https://github.com/KentarOuKannO/AppLifeCycle)
![applifecycleyoutube1.png](https://qiita-image-store.s3.amazonaws.com/0/14749/4ba4758d-7d6e-71c1-a2f9-dfb6a45c586c.png)
Gitlab5.3をリバースプロキシで動作させる

# だって一つのサーバでGitlabとウェブサイトほしいじゃん？

gitlab.example.com で Gitlab
example.com はウェブサイト
なんでGitlab6じゃないのかって？
（インストールに転けるんだもん…6はもうちょっと情報が出てから…）

# CentOS6にGitlab5.3 をさくっとインストール

5.3のインストールはさくっと行ける．
詳しい情報はこちら
http://blog.akagi.jp/archives/3235.html

Gitlab5.3のインストーラだって！すてきだね！
環境はCentOS6のみ（かな？）
とりあえず真っ白なさくらVPSで．

### ただし
本家 gitlab-installer さまのgitlab起動スクリプトのリンク先がgitlab6でリンク切れを起こしているので，フォークしてそこだけ修正しましたので，こちらをお使いください．
https://github.com/Kuchinashi/gitlab-installer

### 実行
```bash:centos6.sh
hostname gitlab.example.com
curl https://raw.github.com/Kuchinashi/gitlab-installer/master/centos6.sh | sudo bash
```

インストール終わって，http://gitlab.example.com/ なり http://localhost/ なりでGitlabが表示されればOK

# リバースプロキシ導入

## nginxの不要なconfファイル削除

```bash:
cd /etc/nginx/conf.d/
rm default.conf example_ssl.conf
```

## Gitlabのポート変更

```bash:
vi /etc/nginx/conf.d/gitlab.conf
```

> listen *:80; －＞ listen *:8080;

```bash:
service nginx restart
```

http://localhost:8080/ にアクセスできればOK

## Apacheインストール

```bash:
yum -y install httpd httpd-devel
chkconfig httpd on
service httpd start
```

### httpd.conf編集
```bash:
vi /etc/httpd/conf/httpd.conf
```

> NameVirtualHost:80 のコメントアウトを外す

### default.confの作成

```bash:
vi /etc/httpd/conf.d/default.conf
```

```bash:default.conf（Apache（example.com）で表示するドキュメントルート）
<VirtualHost *:80>
        ServerName example.com
        ServerAlias example.com
        DocumentRoot /var/www/html
</VirtualHost>
```

### gitlab.confの作成

```bash:
vi /etc/httpd/conf.d/gitlab.conf
```

```bash:gitlab.conf（Gitlabの動作してるnginxへ）
<VirtualHost *:80>
        ServerName gitlab.example.com
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
</VirtualHost>
```

```bash:
service httpd restart
```

# 動作確認

http://gitlab.example.com/
でGitlab
http://example.com/
でApacheのテストページ

それぞれ表示されればOK．
JSONを綺麗に表示したいよ




jqを使うよ
http://stedolan.github.io/jq/


さっきコーヒーアイコンのお兄さんに教えてもらったんだよ

さっそくcurlするよ

```
curl https://coffeeyoshida.com/api/v1/ikemens/coffee | jq '.'
```


綺麗に表示されるよ

```
{
  "name": "CoffeeYoshida",
  "work": "Jedi",
}
```

されたよ
brewでインストールしたrbenvをupgradeしてruby2.0.0をインストールする


brewを最新に更新
	
	$ brew update

ruby-buildをupgrade

	$ brew upgrade ruby-build


rbenvのインストールできるrubyのリストを確認

	$ rbenv install --list
	Available versions:
	~~~~~~~~ 省略 ~~~~~~~~~~~~~~
 	  2.0.0-p195
	  2.0.0-p247 # <= 増えてる！！
	  2.0.0-preview1
	~~~~~~~~ 省略 ~~~~~~~~~~~~~~

ruby 2.0.0-p247をインストール

	$ rbenv install 2.0.0-p247
	$ rbenv versions # インストールを確認
	$ 1.9.3-p194 (set by /Users/yujiroarai/.rbenv/version)
	  2.0.0-p247 # <= OK!!!


普段使用するrubyを2.0.0-p247にする

	$ rbenv global 2.0.0-p247
	$ ruby -v
	ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0] # OK!!!
sinatraでredcarpetのオプションを設定する


- GitHub:[vmg/redcarpet](https://github.com/vmg/redcarpet)

Excelからmarkdown出力したけど、セル内で改行してた場合、表示されると改行されなくて困った。
具体的には`hard_wrap: true`を指定したい。
どうやら下記の方法で設定できる模様。


## render_optionsの場合
```ruby
get '/' do
  renderer = Redcarpet::Render::HTML.new(no_links: true, hard_wrap: true)
  markdown :test, renderer: renderer
end
```

## extensionsの場合
```ruby
get '/' do
  markdown :test, underline: true, fenced_code_blocks: true
end
```

## 両方
```ruby
get '/' do
  renderer = Redcarpet::Render::HTML.new(:no_links => true, :hard_wrap => true)
  markdown :test, underline: true, fenced_code_blocks: true, renderer: renderer
end
```
AndroidのLayout関連で躓いたところ

# その１ getDemensionさん問題
## 前提知識
* androidのResources(xxxx.xml)ではstringはもちろん、integerなどが指定できる。
* この中にdimenというものが存在する。
* これはサイズを指定するときに使用するものであり、float型と単位を指定することが出来る。
  * 例としてこんなかんじ

```XML
<dimen name="sampleSP">10sp</dimen>
```

* これをLayoutで使用する場合は全く問題ない。

```XML
<TextView android:textSize="@dimen/sampleSP"/>
```
* TextSizeに10spが入るので、直接Layoutに10spを指定する場合とおなじになる。

## 問題
* dimenで指定したサイズを使って、動的にLayoutを作成しようとした時に問題が起こった。

```JAVA
TextView textView = (TextView) findViewById(R.id.sampleText);
textView.setTextSize(this.getResource.getDimmension(R.dimen.sampleSP));
```
* 上記のように記述すると、表示されるテキストのサイズがだいぶ大きく表示されてしまった。
* getDimmensionで取得できる値をダンプした結果、2倍の値になっていた。

## なぜ？
* getDimmensionで取得できる値はspではなく、pxの値が取得できる。
* また、AndroidManifest.xmlでanyDensityをtrueにしていた場合、端末の解像度に合わせてpxを算出してくれる。
  * 使用していた端末がGalaxyNexus(xhdpi)の為、mdpi -> xhdpiは2倍なので、2倍の値が取れていた。

## 参考
* [Google Groups](https://groups.google.com/forum/#!msg/android-group-japan/5cwKMWIoTH8/NuHMUjZcAT8J)


# その２ shadowXさん問題
## 問題
* XMLのdimenを覚えてヒャッハー、dimen便利だぜーと調子ぶっこいていて以下のコードを書きました。

```XML
<dimen name="shadowX">3.0dp</dimen>
```
```XML
<TextView android:shadowX="@dimen/shadowX"/>
```

* 結果は
  * Caused by: java.lang.NumberFormatException: Invalid float: "3.0dip"
* 落ちました。

## 対策
* しょうがないにゃあ・・・

``` XML
<string name="shadowX">3.0</string>
```

```XML
<TExtView android:shadowX="@string/shadowX" />
```

## その他
* shadowXの指定単位がわからない。公式に単位の記述がないんだよね。
* 一応、dp指定らしいけど。
Ansible で RPM を扱う

**[2013-08-28 追記]**

なんと，yum module で，RPM パッケージを指定してインストールすることができるそうです。
なので，下記の hack は必要ありません。
yamazaki-masahide さん，ご指摘ありがとうございました。

具体的な使用方法は，[yamazaki-masahide さんのコメント](#comment-432dafb5ecd3283e97d1)を見ていただくか
本家ドキュメントの yum module の examples をご覧ください。

---

RPM を扱う module がなさそうだったので，書きました (書き捨てだけど)。

https://gist.github.com/dayflower/6350248#file-rpm

プロジェクトディレクトリの `library/` ディレクトリ以下に `rpm` という名前でおいておけば，自動的に読み込んでくれます([Bundling Ansible Modules With Playbooks | Best Practices | AnsibleWorks](http://www.ansibleworks.com/docs/bestpractices.html#bundling-ansible-modules-with-playbooks))。

使い方は，以下のような感じです。

```yaml:
---
- tasks:
    - rpm: state=installed file=foo.rpm
    - rpm: state=removed file=foo.rpm
    - rpm: state=removed name=foo
    - rpm: state=installed name=failed_if_not_installed
```

RPM パッケージは，事前にリモート (target host) においてある必要があります。
(たぶん third-party Ansible module だと，ほぼこうせざるをえないと思う)

`name` ベースで存在チェック (やアンインストール) をする場合は，RPM パッケージをおいておく必要はありません。(例示の後者2つ)

実はすでにいい module あるよ，とか，
こうするほうが定石だよ，とか，
こう書くのはおかしい，とか，
情報があれば，お待ちしています。
Gistでホストしているファイルを外部から参照する際のTips

raw URLのコミットIDを削ると編集してコミットIDが変っても最新版のポインタになっているらしい。

```
https://gist.github.com/wireframe/7516/raw/43b431df3bf49a1a3a0eccd579efdaf949d251bf/delicious-ubiquity-command.js
https://gist.github.com/wireframe/7516/raw/delicious-ubiquity-command.js
```

* [【メモ】 Gistの最新版へのリンク | mutter](http://nplll.com/archives/2011/06/_gist.php "【メモ】 Gistの最新版へのリンク | mutter")
* [http://gist.github.com/5165 というpageのraw fileの最新版は http://gist.github.com/5165.txt という url で入手可能 - twwp](http://d.hatena.ne.jp/taizooo/20080902/1220332162 "http://gist.github.com/5165 というpageのraw fileの最新版は http://gist.github.com/5165.txt という url で入手可能 - twwp")
QUnitで WebWorker#onerror でハマった

worker.js で 投じられたError を処理するテストを（QUnit で書いてて）ハマったのでメモ

```js
asyncTest('worker.jsから渡されるエラーを処理する', function () {
    var worker = new Worker('path/to/worker.js')
    worker.onerror = function (err) {
        ok(err, err.message)
        start()
    }

    worker.postMessage('data')
})
```

QUnit（qunit-tap使ってコンソールにテスト結果を出力してます）でテストすると

```
# test worker.jsから渡されるエラーを処理する
ok 1 - Error: hoge error
not ok 2 - Error: hoge error, test: ...
```

エラーが伝播してしまうので __error.preventDefault()__ する

```js
worker.onerror = function (err) {
    ok(err)
    err.preventDefault()
    start()
}
```

結果

```
# test worker.jsから渡されるエラーを処理する
ok 1 - Error: hoge error
```
^

ブロック構文
つまりラムダ式



```
// C#
delegate int del(int i);

del hoge = x => x * x;
printf("%d",hoge(10));
```

↓

```
// Objective-C

int (^hoge)(int) = ^(int x) {
    return x * x;
};
 
NSLog(@"%d", hoge(10));
```

こういうこと？