OmniAICreator/Qiita-1.07M huggingface dataset:
CGRectInset(rect, dx,dy)

ちょっと便利

CGRectを中心(center point)を変えずに領域を変更する。

dx,dyの分だけふちがへる。
dx,dyを負にするとふちが膨らむ。

結局
横の長さはdx*2
縦の長さはdy*2
だけ縮まります。

応用例
UItextFieldの文字位置をデフォルトから変えたいときは以下のように調整できます。

```objc:rectInsetEx.m
- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, textOrigin.x, textOrigin.y);
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, textOrigin.x, textOrigin.y);
}
```
スクロールバーをjQueryからスクロールさせるコード


```:html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <script src="./js/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
  $('#leftbutton').click(function(){
    var i = $('#browser').scrollLeft() - 300;
    if (i < 0) {
       i = 0;
     }
     $('#browser').animate({
         scrollLeft : i
     });
  });
  $('#rightbutton').click(function(){
    var i = $('#browser').scrollLeft() + 300;
    var max_value = $('#browser').scrollWidth - $('#browser').clientWidth;
    if (max_value < i) {
       i = max_value;
     }
     $('#browser').animate({
         scrollLeft : i
     });
  });
});
</script>
  </head>
  <body>
      <a href="#" id="leftbutton">left-button</a>
    <div id="browser"  style="width:300px; height:300px; overflow: auto;">
      <div id="content" style="background-color: black;width:900px; height: 300px;">
      </div>
    </div>
      <a href="#" id="rightbutton">right-button</a>
  </body>
</html>


```
実行中のスクリプトが完了したらiPhoneにPush通知する


処理がなかなか終わらないスクリプトを放置しといて、出先で完了したら通知を受け取れないかな〜と思ったらすごく簡単だったのでメモ。
参考：[Prowl+zshで快適お昼寝タイム - a lonely miner](http://conditional.github.io/blog/2013/03/14/take-a-nap-with-prowl/)

コマンド実行が完了したらiPhoneにインストールした[im.kayac](http://im.kayac.com/)へcurlで通知を投げてみます。

```bash:スクリプトが実行完了したらim.kayacで通知
$ sh long_proc.sh && curl -d "message=おわったよ" http://im.kayac.com/api/post/[user_name]
```

スクリプトの後に&&で通知処理を繋げるだけ。

さらにスクリプトの標準出力内容も通知してみる。もうちょいキレイに書く方法ないかな。。

```bash:実行結果を通知
$ result=$(sh long_proc.sh) && curl -d "message=$result" http://im.kayac.com/api/post/[user_name]
```
vagrant-1.2.1@Linuxでbox add出来ない問題の対処

vagrantの1.1以降はgemではなくパッケージインストールの形になったようなのでとりあえず最新の1.2.1をインストールしてみた。

## vagrant box add がエラーになる
早速適当なboxを動かsしてみようと思ったんだが、何故かbox addしようとすると↓のようなエラーが出てbox addが出来ない…。

```
# vagrant box add ce6 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box
Downloading or copying the box...
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

Failed initialization
```

ちなみにMacのvagrant-1.2.1は問題なく動いたのになぁ…。


## 適当パッチ

で色々追ってみたらどうやら curl の起動に失敗しているようだ。PATHがどこでどうなって駄目な感じになったのかは追ってないが、とりあえず以下のように修正したら直った。

```text
# diff -r /opt/vagrant/embedded/gems/gems/vagrant-1.2.1/lib/vagrant/util/downloader.rb.orig  /opt/vagrant/embedded/gems/gems/vagrant-1.2.1/lib/vagrant/util/downloader.rb
122c122
<           Subprocess.execute("curl", *options, &data_proc)
---
>           Subprocess.execute("/usr/bin/curl", *options, &data_proc)
```
第10回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント : http://atnd.org/events/38678
をまたやります。10回目です。
ぬるいイベントです。

これまで同様参考問題を出しました。
http://nabetani.sakura.ne.jp/hena/ord10pokarest/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますので出来ればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
TypeScriptの自分用メモ

# 関数

### 関数オーバーロードのシグネチャは関数宣言の直前に記述する。

```typescript
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a, b) {
    return a + b;
}

console.log(add(1, 2));
console.log(add("foo", "bar"));

// invalid
//console.log(add(1, "hoge"));
```

### 0.9から導入された定数値によるオーバーロード


# 型

### ローカル変数、型、メンバーはそれぞれ別々の名前空間を持つ。
ただし0.9ではコンパイルエラーになる。
```typescript
// valid
interface I {}
export var I = 1;
var I: I = {};

console.log(I); // => 1
```


### 型が宣言できる文はclass, interface, module, enum, importの5つ。

```typescript
class C {
    attr = "class";
}
// valid
var c: C;
var _C = C;

// invalid
//var C: C;

interface I {
    attr: string;
}
// valid
var i: I;
var I: I;

module M {
    var attr = "module";
}
// valid
var m: M;
var _M = M;

// invalid
//var M: M;
```

### 型宣言ができる文はモジュール直下のみで記述できる。

```typescript
// invalid
if(true) {
    //class C {}
    //interface I {}
    //module M {}
}

class D {
    //class C {}
    //interface I {}
    //module M {}
}
```

### 型名にはJavaScriptの予約語に加え、any, number, string, booleanが使えない。

```typescript
// invalid
//class any {}
//interface boolean {}
//module string {}
```

### クラス型のインターフェスの記述例

```typescript
interface I {
    new ();
}

class C {}

// valid
var i: I = C;
```

### 演算子はNumber型とnumber型、String型とstring型などを区別する。

```typescript
// valid
function add_num(a: number, b: number) => a + b
function add_str(a: string, b: string) => a + b

// invalid
//function add_num(a: Number, b: Number) => a + b
//function add_str(a: String, b: String) => a + b
```
# インターフェース

### 
### interfaceとmoduleは、同じモジュール内からはRubyのオープンクラスのように拡張することができる。

```typescript
interface A {
    str: string;
}

interface A {
    num: number;
}

// valid
var a: A = { str: "a" , num: 1};

// invalid
//var a: A = { str: "a" };
//var a: A = { num: 1 };
```


# モジュール

### export文はモジュール直下でのみ記述できる。

```typescript
module M {
    // valid
    export var a = 1;

    if(true) {
        // invalid
        //export var b = 1;
    }
}
```

### モジュールの種類は3つある。

* グローバルモジュール
* ファイル単位のモジュール(External module)
* モジュール文によるモジュール(Internal module)

lib.d.tsで定義されるインターフェースは、グローバルモジュールで定義される。

ソースファイル直下にexport文とimport文がない場合、そのスクリプトはグローバルモジュール上で実行される。

```typescript:foo.ts
// <Global module>
// ┣ "lib.d.ts"
// ┣ interface Object
// ┣ interface Array
// ┣      :
// ┣ "foo.ts"
// ┗ interface Object { foo: string; }

// ビルトイン型のObject型と同じモジュール空間内なので、このinterface文はビルトインObject型を拡張する。
interface Object {
    foo: string;
}

var obj = {};
obj.foo = "foo";
```

ソースファイル直下にexport文やimport文がある場合、そのスクリプトはグローバルモジュール内に作られる、ファイル単位のモジュールでラップされた形で実行される。

```typescript:foo.ts
// <Global module>
//  ┣ "lib.d.ts"
//  ┣ interface Object
//  ┣ interface Array
//  ┣      :
//  ┗ <"foo.ts" module>
//      ┣ export var a = 1;
//      ┗ interface Object { foo: string; }

export var a = 1;

// ここからはビルトイン型のObject型が見えないので、新しくfoo.Objectインターフェースが宣言される。
interface Object {
    foo: string;
}
// valid
var obj: Object = { foo: "foo" };

// invalid
//var obj2 = {};
//obj2.foo = "foo";    // ビルトイン型のObjectにはfooプロパティが宣言されていないのでエラーになる。
```
オブジェクトの実行コンテキスト


モジュールタイプのオブジェクトで、実行コンテキストをthisにするかオブジェクト自身にするか、という話。

#this

モジュールタイプのオブジェクトを書いていて、途中でやっぱクラスにしたい（そもそもそういう設計はまずいのだが）というケースを考えると、コンテキストはthisにしといたほうが移行の手間がなく汎用性が高い。

```javascript:this
var moduleObj = {
	init: function(name){
		this.name = name;
	},
	say: function(){
		console.log(this.name);
	}	
}
```

#オブジェクト自身

thisの場合、イベント登録やクロージャを使う場合はfunction内でthisがwindowオブジェクトになるので、thisをローカル変数に入れたりと手間が増える。(jQueryのproxyやES5のbindを使えば解決するが)
それを考えるとオブジェクト自身のほうが、thisにとらわれることなくコーディングができる。

```javascript:thisの場合
var moduleObj = {
	init: function(elm, name){
		var self = this;
		this.elm = elm;
		this.name = name;
		
		//イベント付与
		this.elm.addEventListener('click', function(e){
			self.clickHandler(e);
		});
	},
	clickHandler: function(e){
		console.log(this.name);
	}
}
```

```javascript:オブジェクト自身の場合
var moduleObj = {
	init: function(elm, name){
		moduleObj.elm = elm;
		moduleObj.name = name;
		
		//イベント付与
		moduleObj.elm.addEventListener('click', moduleObj.clickHandler);
	},
	clickHandler: function(e){
		console.log(moduleObj.name);
	}
}
```

#thatをつかう
個人的な感想として、
オブジェクト自身にすると、エディタでオブジェクト自身に色がつかないのと、オブジェクトの名前が長くなりがちになり、その結果コードが読みにくくなってしまうのがあまり好きではない。
これを解決する方法としてモジュールを表すオブジェクトと共にthatも定義する。
名前はthatで無くてもselfでもmeでも良い。
エディタで色を変えるように設定するとより読みやすくなる。


```javascript:that
var that,
var moduleObj = that = {
	init: function(elm, name){
		that.elm = elm;
		that.name = name;
		
		//イベント付与
		that.elm.addEventListener('click', that.clickHandler);
	},
	clickHandler: function(e){
		console.log(that.name);
	}
}
```


#雑感
個人としてはモジュールタイプのオブジェクトであれば「オブジェクト自身」を使っている。
「that」の方法はthisを意識しなくても良く、コードも見やすくなるとは思う。
ただし1つのファイルに複数のモジュールを書くことができないのと、thatはthisの参照として使われるので人によっては逆にわかりにくく、複数人で開発するには向いていない。
一人で作るならなんでも良いけど、複数人の場合は開発後のメンテナンスを考慮してこの辺も決めて開発したほうが良いと思う。
goでEach, Map, Selectのサンプル

[FAQ - The Go Programming Language](http://golang.org/doc/faq)の [Can I convert a []T to an []interface{}?](http://golang.org/doc/faq#convert_slice_of_interface)にあるように[]intを[]interface{}にキャストはできないので、あまり実用的ではないです。あくまでサンプルということで。

```go:slice.go
package sample

type Slice []interface{}
    
func (s Slice) Each(f func(interface{}, int)) {
    for i, v := range(s) {
        f(v, i)
    }
}   
    
func (s Slice) Map(f func(interface{}, int) interface{}) Slice {
    r := make([]interface{}, len(s))
    for i, v := range(s) {
        r[i] = f(v, i)
    }
    return r
}   

func (s Slice) Select(f func(interface{}, int) bool) Slice {
    r := make([]interface{}, 0)
    for i, v := range(s) {
        if f(v, i) {
            r = append(r, v)
        }
    }
    return r 
} 
```

```go:slice_test.go
package sample

import (
    "fmt"
    "testing"
)   
        
func TestEach(test *testing.T) {
    sum := 0
    values := Slice{1, 2, 3}
    values.Each(func(v interface{}, _ int) {
        sum += v.(int)
    })
    expected := 6
    if sum != expected {
        test.Fatalf("expected:%d, actual:%d", expected, sum)
    }
}

func TestMap(test *testing.T) {
    expected := Slice{2, 3, 4}
    values := Slice{1, 2, 3}
    values = values.Map(func(v interface{}, _ int) interface{} {
        return v.(int) + 1
    })
    for i := 0; i < len(values); i++ {
        if values[i] != expected[i] {
            test.Fatalf("i:%d, expected:%d, actual:%d", i, expected[i], values[i])
        }
    }
}

func TestSelect(test *testing.T) {
    expected := Slice{1, 3}
    values := Slice{1, 2, 3}
    values = values.Select(func(v interface{}, _ int) bool {
        return v.(int) % 2 == 1
    })
    for i := 0; i < len(values); i++ {
        if values[i] != expected[i] {
            test.Fatalf("i:%d, expected:%d, actual:%d", i, expected[i], values[i])
        }
    }
}
```
Arduinoで構造体をつかう

引数が長くなったときに構造体使いたくなったんだけど、公式リファレンスがわかりづらかった && 公式以外にちゃんとした情報がなかったので、がんばった記録を投稿しておく。

```c:struct_sample.ino
#include "types.h"

void setup() {
  Serial.begin(9600);
  RGB color = getBlue();
  Serial.println(color.b);
}

void loop() {
}

RGB getBlue() {
  RGB color = { 0, 0, 255 };
  return color;
}
```

```c:types.h
#include <Arduino.h>

struct RGB {
  byte r;
  byte g;
  byte b;
};

RGB getBlue();
```

IDEの新しいタブから適当な名前のヘッダーファイルを作成して、そこに構造体の定義と構造体を返り値または引数のデータ型に持つ関数の宣言をする。

関数で構造体を使わないのであれば、こうする必要はなかったはず。

なぜこうするのかはまだよくわかっていない。

---

参考

- [Arduino Playground - Struct Resource](http://playground.arduino.cc/Code/Struct)
Q:node.jsを使っている方開発環境を教えてください。

現在、node.js+html5にはまっています。
現在、これらを使ってデバッガを開発しています。
使っているエディタやデバッガなどを教えてください。
ちなみに自分は、Visual Studio +typescript + node.js+node-inspectorです。
足りない機能を補うためにC#のWEBBrowserでhtml5をラップして使っています。

ぜひ、開発の参考のために教えてください。
Forkしたリポジトリの名前が衝突したらサフィックスがつく

GitHub上で他人のリポジトリをforkしようとしたとき、既に自分が同じ名前のリポジトリを持っていたら、「-1」などとサフィックスがつく。

```
foo/bar
```

```
hoge/bar
```


fooさんのbarとhogeさんのbarは別の内容だとして、hogeさんが ```foo/bar``` をforkすると

```
foo/bar
```

```
hoge/bar
hoge/bar-1
```

となる。試してないけどたぶん次は ```hoge/bar-2``` になるんじゃないかな。

Settingsからリネームすることもできるが、当然 ```bar``` という名前にすることはできない。

リポジトリ名を変えるのは非常によろしくないので、ご利用は計画的に。
gitのmerge commitから、automergeが発生しているファイル一覧を出力

# [改良版](http://qiita.com/items/27fa019119cc16f2ccf9)を作成しました。  2013/05/12

----------------

mergeの時にautomergeが発生してたら知りたいよねー　と思って一発で出すコマンドを探していたんですが見つけられませんでした。

gitの標準機能に有りそうな気はしたけど、gitのサブコマンドを作ってみたかったというのもあって、シェルスクリプトで書いてみました。

変数をうまく利用すればファイルに出力しないでもいけそうでしたが、ちょっとその辺なれてないので、`~/tmp/` に何回か書き込んでます。

引数なし、または、コミットのハッシュ値か HEAD ORIG_HEAD 等の入力を一つ受け付けます。

・・・それ以外の引数が入ってきた時の動作は気にしてません(｀・ω・´)

```sh:git-automerged
#! /bin/bash
#引数としてコミットの ハッシュ HEAD HEAD^ 等のmergeコミットを一つ入力
#automergeが起きたファイルを全て表示

#入力されたコミットの親の数を確認
PearentNum=$(echo $(git log $1 -1 --pretty=format:"%P" | wc -w))

#mergedファイルの初期化
echo -n "" > ~/tmp/merged

#merge commitかチェック
if [ $PearentNum -gt 1 ] ; then
	#親が2以上(merge commitの場合)
	#入力されたコミットとその親との差分が存在するファイル名からmergeが行われたファイルを列挙

	#親の数だけループ
	i=1
	for Pearent in $(git log $1 -1 --pretty=format:"%P")
	do
		#一応親のハッシュを出力しておく
		echo "Pearent $i : $Pearent"
		git diff --name-only $1 $Pearent >> ~/tmp/merged
		i=$(expr $i + 1)
	done

	#mergeされたファイルのソート
	sort ~/tmp/merged > ~/tmp/merged-sorted
	
	#重複しているファイルの出力
	uniq ~/tmp/merged-sorted --repeated > ~/tmp/automerged
	cat ~/tmp/automerged

else
	#親が2以上いないなら処理を終了
	echo "$1 is not MergeCommit"
fi
```

パスが通った場所において、こんなかんじでコマンドを打つと

`$ git automerged HEAD`
    Pearent 1 : fb484c0d2939be2830efa24aff3de67c0ee5aff8
    Pearent 2 : 77dbb4993c5ec6302426f7fe28d11763fdfe61ea
    ますたー.txt

こんなかんじでautomergeが発生したファイルを出力します。(~/tmp/automerged にはファイル名の一覧のみのファイルが出力されてます)

書いている途中で、
`いや、やっぱこの機能は標準であるでしょ？`
という気はしましたが、とりあえずgitのサブコマンドを作ってみたかったということもあったので突っ走りました。

**こう書いたほうがいいよ** とか **標準機能であるよ** とかありましたらぜひ教えて下さい
(´・ω・｀)
Ruby クラスに関して


## 親クラスのメソッドを呼ぶ時はメソッド名はいらない

```
def hoge
  super.hoge(aa)
end
```
じゃなくて

```
def hoge
  super(aa)
end
```

にしなければならない。これはPHPやJavaと違う点。

そもそもrubyはオーバーライドしたメソッドからオリジナルは呼べるけど、それ以外の親クラスのメソッドはaliasとかしないと呼べないみたい。
http://d.hatena.ne.jp/hake/20061201/p2
Pathnameってなんじゃらほい


``` ruby:pathname_example.rb
Rails.root
# #<Pathname:/path/to/rails/>

Rails.root.join('hoge')
# #<Pathname:/path/to/rails/hoge>

Rails.root.join('hoge').join('unko')
# #<Pathname:/path/to/rails/hoge/unko>

Rails.root.join('hoge').join('unko').to_s
# "/path/to/rails/hoge/unko"
```

いちいち、`root + '/' + 'app' + '/' + 'filename'` のようにディレクトリ階層を文字列的に繋げずにオブジェクト指向的に書くことができる。

Railsではそのまま引数に与えれば勝手に`to_s`してくれるメソッドも多い。なるほど便利だ。PHPにも欲しいな。

Railsの機能じゃなくて、Rubyの標準ライブラリだったか。
http://doc.ruby-lang.org/ja/1.9.3/class/Pathname.html

`root + 'app' + 'filename'` のように`+`で連結もできる。
`join()`メソッドは複数階層を一度に指定したい場合に有効とのこと。
iOS /tmpと/Cachesディレクトリの違いと運用方法


**/tmp**と**/Caches**ディレクトリ内のファイルは、iTunesのバックアップ対象外でシステムにより自動で削除されます。
何となく使っていたら容量不足でアプリがクラッシュしてしまったので、2つの違いと運用方法について調べてみました。


# パスの取得

```objectivec:Application_Home/tmp/
NSString *path = NSTemporaryDirectory();
```
```objectivec:Application_Home/Library/Caches/
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
```
# 違い
|ディレクトリ|ドキュメント記載の使用例|アクティブ中のシステムによる削除|非アクティブ中のシステムによる削除|
|---|---|:---:|:---:|
|/tmp|次のアプリの起動で保持する必要のないファイル|×|◯|
|/Caches|ダウンロードコンテンツ等|◯|◯|

# 運用方法と注意

## /tmp
- アクティブ中にシステムによる削除を受けたくない一時ファイルに使用する。
- アクティブ中はシステムに削除されないため、ファイル容量に注意して管理しなければならない。

##/Caches
- アクティブ中にシステムが削除してもよい一時ファイルに使用する。
- アクティブ中にシステムによって削除された場合でも不具合が発生しない作りにしなければならない。

# まとめ
今回調べるきっかけになった問題は、画像の一時的な保存に**/tmp**を利用していて、システムによる削除が入るから大丈夫かなーって思って何も考えずにどんどん保存してたら10時間くらい後にアプリ容量が10GBくらいになり(iPhoneの空き容量が0GB)クラッシュしました。(適切な処理をしていればクラッシュしないかもしれません)
あとドキュメントはちゃんと読みましょうということでした。

# ドキュメント
[File System Programming Guide - About the iOS File System](http://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html)
Rails ファイルのダウンロード


## send_file / send_data

send_file を使います。

```ruby:hoge_controller.rb
def download
    filepath = Rails.root.join('app', 'pdfs', 'hoge.pdf')
    stat = File::stat(filepath)
    send_file(filepath, :filename => 'hoge.pdf', :length => stat.size)
end
```

send_data というのもあります。

両者の違いは、メモリ内に展開済みのデータを送信するか、ファイルをそのまま送信するかの違いです。

send_dataの場合、メモリを使いますが、一時ファイルを作成してすぐに削除ができます。

```ruby:hoge_controller.rb
require 'zipruby'

def download_zip

  users_csv = User.generate_csv

  tmp_zip = Rails.root.join('tmp', 'zip', filename).to_s
  Zip::Archive.open(tmp_zip, Zip::CREATE) do |ar|
    ar.add_buffer('users.csv', users_csv)
  end

  # ここでsend_fileだと、後の File.delete で
  # ファイルを削除してから送信するので動作しない
  # send_file(filepath, :filename => 'hoge.zip')

  # メモリ内に展開した
  send_data(File.read(filepath), :filename => 'hoge.zip')

  # 一時ファイルを削除してOK
  File.delete tmp_zip
end
```


## filename を指定しても効かない

日本語だとダメみたいです。エンコードします。

```
file_name = "日本語.txt"
file_name = ERB::Util.url_encode(file_name)
send_file(filepath, :filename => file_name, :length => stat.size)
```
Herokuでルートドメインを使用する

##ルートドメイン（Apex ドメイン）は使えない
*****

Heroku でアプリケーションを作成すると、漏れなく newapp.herokuapp.com というドメインを使用することができます。
独自のドメインを割り当てたい場合は、heroku の設定で、Domains にドメインを登録してあげると良いです。
ただし、ここで通常使えるのはサブドメインがついているタイプのもの。
ルートドメインは（そのままでは）使用できません。

`www.jobhub.jp` というドメインはいいけど、`jobhub.jp` はダメなんです。

http://jobhub.jp ってURLで運営できないってことですね。 
公式でも、ルートドメインを避けるよう解説されています。

[Avoiding Naked Domains and DNS A-records](https://devcenter.heroku.com/articles/avoiding-naked-domains-dns-arecords)

##ANAME を利用してルートドメインを使う
*****

でも、どうしてもルートドメインを使いたい！って場合にはやりようがあります。
ANAME とか Alias Record とか呼ばれる DNS のレコードを使う方法です。
heroku の公式でも言及されていますが、DNS Made Easy や DNSimple といった海外のDNSサービスがこういったレコードに対応しています。

[Custom Domains | Heroku Dev Center](https://devcenter.heroku.com/articles/custom-domains#apex-domains-examplecom)
[Introducing the ALIAS Record | DNSimple](http://blog.dnsimple.com/zone-apex-naked-domain-alias-that-works/)
[ANAME Records | DNS Made Easy](http://www.dnsmadeeasy.com/technology/aname-records/)

ルートドメイン（英語圏ではNaked Domain とか Apex Domain とか呼ばれてます）って必ずAレコードを必要とするので、必ず特定のIPアドレスに結びつく必要があります。
対して ANAME や Alias Record は DNS サービス上で CNAME のように登録できるものの、実際の名前解決では IPアドレスを返してくれるんですね。

この機能を利用して、`jobhub.jp` ドメインを `newapp.herokuapp.com` のエイリアスとしてANAME（あるいはAlias Record）に登録してあげれば万事解決です。
http://jobhub.jp で無事運用できるようになりました。

ただし DNS サービスによっては、利用できるトップレベルドメインに制限があります。
現在は対応しているかもしれませんが、私が以前調査した際には、DNSimple は JP ドメインには対応しておらず、DNS Made Easy を使うしかありませんでした。

##SSL でもルートドメインを使う
*****

なお、SSL を使用したい場合でも基本的に同様の対処で対応可能です。
heroku のアドオンである SSL Endpoint を導入すると ` shiga-***.herokussl.com` といった SSL 用のサブドメインが与えられます。
`jobhub.jp` ドメインを `shiga-***.herokussl.com` のエイリアスとしてANAME（あるいはAlias Record）に登録してあげれば良いです。
無事、https://jobhub.jp で運用できるようになります。
※ *.herokussl.com のサブドメイン部分はアプリごとにバラバラです。日本の比較的著名な市町村名が使われているようです。

##この情報を得るに至った経緯（愚痴）
*****

昔の heroku は独自ドメインを使用するためには Custom Domain という無料のアドオンを使う必要がありました。
このアドオンは 非 SSL であればルートドメインに対応していて、「このIPアドレスをDNSのAレコードに設定してね」と三つほどIPアドレスの情報が公開されていて、↑のようなANAME 対応の DNS サービスなどは特に必要ありませんでした。
SSL を必要とする場合は、IP Based SSL という月100ドルのアドオンが用意されていました。
導入するとこのアドオン用に用意されている IP アドレスが割り当てられるので、これを DNS の Aレコードに設定する、という手順を踏めば追加料金が発生するものの、やはり ANAME などは必要ありませんでした。
サービスのローンチ前にこのような情報を確認できていたため、heroku ＋ SSL でも普通にルートドメイン使えるね、とすっかり安心していたんですよね。

###と・こ・ろ・が。

ローンチ直前くらいのタイミングで、いきなり IP Based SSL が使用不可になったんですよ。もう内外にURLとか告知してるのに。プレスリリースとかも出てるのに。
SSL を使用しない選択はなかったので、これには慌てました。
最悪の場合は `www.jobhub.jp` みたいにサブドメイン付きで運用することにして、`jobhub.jp` はさくら VPS あたりでリダイレクトサーバでも建ててしのぐしかないかな、と考えたりもしていました。
ルートドメインでの運営が気に行っていただけに、心理的にもショックが結構大きかったです。

こんな状況だったので、正直いきなりアドオン使えなくなるとか勘弁してくれって感じでしたが、藁をもつかむ思いで heroku のサポートに聞いてみたんですね。
そしたら DNSimple や DNS Made Easy のことを教えてくれて、今に至る、と。
当時はこれらの情報はまだ Dev Center には書かれていなかったので、聞かないと分からなかったですね。
おかげで助かった訳で恩を感じるものの、窮地に陥ったのもお前のせいじゃ、と感じたりもして少々複雑です。
※ 実際には AWS の Route53 でも行けるよ、と言われましたがこれは無理でした。EC2用に用意されているDNSサービスなのと、JPドメインには対応していないのと。

*****
heroku で動いているらしい [HandMade In Japan Fes 2013](https://hmj-fes.jp/) というサイトもルートドメインですね。dig って見たところ Dozens というサービスを使っているようです。
確認していませんが、ANAME のようなレコードが用意されているのかもしれません。
Sidekiq gem クィックスタート

基本的には Getting Started な情報をまとめたものです。
詳細な情報は下記のページを確認してみると良いと思います。

https://github.com/mperham/sidekiq
http://mperham.github.io/sidekiq/

https://github.com/mperham/sidekiq/wiki

### Setup

特に難しいことはない
Gemfileに gem 'sidekiq' を加えて bundle install

``` Gemfile
gem 'sidekiq'
```

``` sh
$ bundle install
```

### Example

1. Workerを作成

``` app/workers/hard_worker.rb
class HardWorker
  include Sidekiq::Worker

  def perform(name, count)
    puts 'Doing hard work'
  end
end
```

2. rails console からqueuingしてみる

```sh
$ bundle exec rails c
irb(main):001:0> HardWorker.perform_async('bob', 5)
=> "35de7d8207b94280f464b147"
```

3. worker processを起動させる

``` sh
$ bundle exec sidekiq
2013-04-18T09:43:27Z 58787 TID-oxwc6ymt8 HardWorker JID-35de7d8207b94280f464b147 INFO: start
Doing hard work  # わかりづらいけれど、これがputsされた結果
```

もうちょっと詳しい Worker や Worker Process の設定は [ここらへん](https://github.com/mperham/sidekiq/wiki/Advanced-Options)

### Monitoring / 管理画面

``` config/routes.rb
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'
```

devise 使ってて、Admin/AdminUser などのアカウントのログイン認証をかけたい場合はこんな感じ

``` config/routes.rb
require 'sidekiq/web'
authenticate :admin do
  mount Sidekiq::Web => '/admin/sidekiq' 
end
```

他の認証機構の場合は wikiの[monitoring](https://github.com/mperham/sidekiq/wiki/Monitoring) を見ると良い

以下の作業は、2.11.0 以上の Sidekiq では必要ありません。
ja.ymlがgemに含まれるようになりました。
(@ogomr さんコメントありがとうございました)

それと、現時点(2.10.0)では ja の localeファイルが無いっぽいので、管理画面にアクセスしても translation missing error が出る。
そのため、sidekiq gem に含まれるファイルをコピーして使う

```sh
$ cp ./vendor/bundle/gems/sidekiq-x.x.x/web/locales/en.yml ./config/locales/sidekiq.ja.yml
```

``` config/locales/sidekiq.yml
- en:
+ ja:
```
Rubyでゲームを作る


## Rubyの導入
2.0が正式に対応していないので、1.9.3を入れる

````shell:
$ rbenv install 1.9.3-p392
````

ディレクトリを作成し、そのディレクトリ内では、1.9.3を使うように設定

````shell:
$ cd
$ mkdir -p Workspace/Game
$ cd Workspace/Game
$ rbenv local 1.9.3-p392
````

## gosuの導入
gosuは、ゲーム開発用ライブラリ
ゲーム開発を行う際に、便利な機能が提供されている

````shell:
$ cd ~/Workspace/Game
$ gem install gosu
````

これだけで導入完了
例題を動かしてみる

````shell:
$ cd ~/Workspace/Game
$ ln -s ~/.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/gosu-version/examples/ examples
````

gosu-versionの部分などは適当に変更してください

````shell:
$ cd ~/Workspace/Game/examples
$ ruby Tutorial.rb
````

ゲームが起動すれば成功
memo: emscriptenでasm.jsのアレ

とりあえずビルドしてみてFirefox Nightlyで動かしてみるが速度が出ないような？

* https://github.com/ukyo/zlib-asm
* http://jsperf.com/asm-js-zlib-bench/2

---

なんだかjsperfだと上手くいかないらしい(asm.js系のベンチは全部遅くなっている)。odinmonkeyをビルドしてそこから実行したら速度が増したことが確認できた。以下からファイルを取ってきてビルドしてね。

* http://hg.mozilla.org/users/lwagner_mozilla.com/odinmonkey/summary

ベンチはこんな感じで。

```sh
time path/to/js -f path/to/zlib-asm/dest/zlib-asm.js path/to/zlib-asm/bench_asm.js
time path/to/js -f path/to/zlib-asm/dest/zlib-noasm.js path/to/zlib-asm/bench_noasm.js
```

で、こんな感じで出力される。

```
time ./js -f ~/workspace/zlib-asm/dest/zlib-noasm.js ~/workspace/zlib-asm/bench2.js 

real	0m6.945s
user	0m6.900s
sys	0m0.032s

 time ./js -f ~/workspace/zlib-asm/dest/zlib-asm.js ~/workspace/zlib-asm/bench.js
warning: Successfully compiled asm.js code

real	0m1.998s
user	0m1.968s
sys	0m0.020s
```

※odinmonkeyのビルドが時間かかる！
mongoでfind-limitを使った際のcountについて

一瞬「なんで！？」ってなるからメモ。

```mongodb:console
> db.sorich.find({ "admin_user_id" : 2})
{ "_id" : ObjectId("******001"), "hoge_id" : 1, "satousan" : 2 }
{ "_id" : ObjectId("******002"), "hoge_id" : 2, "satousan" : 2 }
{ "_id" : ObjectId("******003"), "hoge_id" : 3, "satousan" : 2 }
> db.sorich.find({ "satousan" : 2}).limit(1)
{ "_id" : ObjectId("******001"), "hoge_id" : 1, "satousan" : 2 }
> db.sorich.find({ "satousan" : 2}).limit(1).count()
3
```
limitで1件に絞ってるのに、countの結果が3件。
つまりlimitしても条件に合致した件数を返すようになっている。
対処はシンプルで

```mongodb:console
> db.sorich.find({ "satousan" : 2}).limit(1).count(true)
1
```
引数に真偽値：trueをおけばOK
tmuxのステータスラインにGuardのエラーを通知する

事情があって別のマシンにsshして仕事をしていて、Guardが回しているテストがこけたときの通知をどうしようかなーと考えていました。

少し調べたら、[nc](http://www.ksknet.net/linux/nc_netcat.html)を使う方法などもあるようですが、tmuxのステータスラインに通知する方法を見つけました。

https://github.com/guard/guard#tmux

Guardfileに以下を書き込むと有効になります。

```ruby:Guardfile
notification :tmux, display_message: true, color_location: "status-left-bg"
```

tmuxのdisplay-messageというコマンドを使っているようです。

過去ログを見たい時は&lt;prefix&gt;~で見ることもできます。便利。
複数カーソルへの複数行ペースト（TextMate と Sublime）

1
2
3

というテキストがクリップボードにあるとする。

A|
B|
C|

のような複数カーソル状態になっているときペーストすると（|がカーソル位置）

A1
B2
C3

となる。

---

エディタによる挙動の違い（設定やプラグインで挙動を変えられるかもしれません）。

##Sublime Text 2 および 3

- カーソル数と行数が一致しないと各カーソルにそれぞれ全文ペーストされる。
- 末尾の改行もカウントされる。なので最後の改行は含まないようにコピーする必要がある。
- カーソルを作った順番は考慮されない。上から順番に埋まる。


##TextMate 2
- カーソル数が多いと、テキスト行をループさせてすべてのカーソルを埋める。カーソル数が少ないと、はみ出したテキストはペーストされない。
- 末尾の改行は無視する（あってもなくてもよい）。
- カーソルを作った順番も記憶していて、上記例でA,C,Bの順にカーソルを作った場合、

A1
B3
C2

となる。
JavaScriptのビットシフト(ビット演算)


ビット演算はある数値の半分、倍のイディオムとして利用される

```javascript
var num = 120
console.log(num >> 0); //120
console.log(num >> 1); //60
console.log(num >> 2); //30
console.log(num << 1); //240
console.log(num << 2); //480
console.log('abc' << 2); //文字列の場合は0が返るみたい
```

また、小数点を切り捨てるイディオムとしても利用される（たぶん）
(小数点以下は切り捨てられ、四捨五入はされない)

```javascript
var num = 12.123
console.log(num >> 0); //12
console.log(num >> 1); //6
console.log(num >> 2); //3
console.log(num << 1); //24
console.log(num << 2); //48
```

※右辺に指定できるの数は0〜31まで
glassfish embedded と BASE64Decoder/BASE64Encoder

glassfish embedded server と glassfish serverではバンドルしてあるライブラリーに差異がありました。
BASE64Decoder/BASE64Encoderはglassfish embedded serverにはバンドルしてありますが実装が権利関係のあやふやなもの？がついています。
なのでglassfish embedded serverとglassfish serverでは使うライブラリをわけないといけなかったです。

なのでメモとして残します。

```maven:pom.xml
    <profile>
        <id>glasfiss-server</id>
:
            <dependencies>
                <dependency>
                    <groupId>javax</groupId>
                    <artifactId>javaee-web-api</artifactId>
                    <version>6.0</version>
                    <scope>provided</scope>
                </dependency>                
                <dependency>
                    <groupId>org.glassfish.security</groupId>
                    <artifactId>realms</artifactId>
                    <version>10.0-b28</version>
                </dependency>                                       
            </dependencies>
    </profile>
:
    <profile>
        <id>arquillian-glassfish-embedded</id>
:
            <dependencies>
                <dependency>
                    <groupId>org.jboss.arquillian.container</groupId>
                    <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
                    <version>1.0.0.CR3</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.glassfish.main.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.2</version>
                    <scope>provided</scope>
                </dependency>
                <!-- Base64Encode,Base64Decodeが原因でrealms-10.0-b28.jarとglassfish-embedded-allが競合するので定義 -->
                <dependency>
                    <groupId>org.glassfish.common</groupId>
                    <artifactId>common-util</artifactId>
                    <version>10.0-b28</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
:
    </profile>
```
herokuで日本語フォントを奇麗に使うには？

herokuでPDFや画像出力する際に、

日本語が文字化けてしまう・・・

ということで、
どういう風に日本語フォントに対応すれば良いか、
調べてみたので共有します。

結論は、
herokuはfontconfig(後述)に対応しているので、
RAILS.rootに/.fontsフォルダを作成して、
その直下にフォントを置く。

※ /.fonts、複数形だよ。
※ BuildPack使う技もあるけどミスるとアプリ壊れるよ。
※ Railsじゃなくても、/.fontsに置けばOK。herokuでは「/」はuser home直下になるのかと。


ちなみにFontconfigって？

以下、Wikipedia抜粋です。

> Fontconfig（または fontconfig）は、システム全体のフォントの設定（代替フォントの設定、フォント置換の設定、レンダリングの設定、など）に関する情報をアプリケーションに提供するためのライブラリである。

で、/.fontsがデフォルトのフォルダとなるため、全てのアプリケーションはここを見に行くというお話です。
capistrano経由でリモート環境でsudo実行する際に躓いた！！


Aサーバ：capistranoを導入して
Bサーバ：デプロイ先の環境

この時、僕のアカウント（仮にshinofara）とすると
そのユーザ名とパスワードを設定に書けばいいのだが

```ruby
set :user,     "shinofara"
set :password, "password"
```

今回行ったケースとしては

```ruby
set :user,     "test"
set :password, ""
```

nopassだった場合。。。
sshで接続してsudo実行するとパスワードきかれちゃうんですよね。。
でも、解決しました。

```ruby
set :use_sudo, false
```
を追加することと

デプロイ先の環境で

```visudo
$ sudo visudo
test ALL=(ALL) NOPASSWD:ALL 
```

こんな感じで、testユーザに対してsudo権限付与＋パスワード認証無しで行けました。！！

※nopassにする場合は、キー認証とかにする方がいいですよ。セキュリティ的に。。。

他に明暗等ありましたら、教えてください。。。
実行するコマンド ラインを表示する

シェル スクリプトで、コマンドの出力だけでなくその出力元であるコマンド ライン自体も表示したいときがあります。そんなときは -x オプションが便利です。

```
set -x
$ date
+ date
Thu Apr 18 12:00:00 JST 2013
$ date +%Y%m%d
+ date +%Y%m%d
20130418
$ set +x
+ set +x
```

解除するときは set +x を実行しますが、```set +x``` まで表示されてしまうのはイマイチ。
そんなときはサブシェル内で set -x すればサブシェル終了とともに解除されます。

```
( set -x ; date ; date +%Y%m%d )
+ date
Thu Apr 18 12:10:00 JST 2013
+ date +%Y%m%d
20130418
```
css CHEAT SHEET

```dkir
.dkirBox {  
    position: relative;  
    z-index: 3;  
    zoom: 1;
}  
.dkir {  
    display: block;  
    text-decoration: none;  
} 
.dkir span {  
    position: relative;  
    z-index: -1;
}  
```

##ぶら下がりインデント
```ぶら下がりインデント
li span {
	text-indent: -1em;
	margin-left: 1em;
}
```
---

#css ハック

---
##二倍バグ
```二倍バグ
.box {
	display: inline;
}
```

##高さ1pxを実現する
```高さ1pxを実現する
span {
	overflow: hidden;
}
```

##ネガティブマージンを付ける
```ネガティブマージンを付ける
.box {
	margin-left: -10px;
	position: relative;
}
```
##ドットボーダー
```border-dotted
/* BORDER */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

.border-dottedを使用する時は直下に.whiteBoxをおいてください。
Example）
<div class="border-dotted">
    <div class="whiteBox">
      <span>イーハトーヴ</span>
    </div>
</div>

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */



div.border-dotted {
  padding: 1px;
  background: url("../imgs/border-dotted.gif") repeat 0 0;
}
div.border-dotted .whiteBox {
  background-color: #FFFFFF;
  padding: 15px 20px;
}


```

##リストの隙間
```リストの隙間
中のaタグにzoom:1;
```
##min-height
```min-height
.foo {
min-height:100px;
height: auto !important;
height: 100px;
}

```

##トランジション
```
-webkit-transition: background 0.3s ease;
-moz-transition: background 0.3s ease;
-o-transition: background 0.3s ease;
transition: background 0.3s ease;

```
C/C++のlibcurl利用サンプル

以前試したコードを無くさないうちにメモ。
C/C++でlibcurlを使ってwww.google.comからGETするサンプルです。

FreeBSD 9.1でclang/clang++を使って試してみました。

まずはC。

```c:libcurl_test.c
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
 
#define MAX_BUF 65535
 
static char wr_buf[MAX_BUF];
static int  wr_index = 0;
 
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
        int segsize = size * nmemb;
 
        if ((wr_index + segsize) > MAX_BUF) {
                *(int *)userp = 1;
                return 0;
        }
 
        memcpy((void *)&wr_buf[wr_index], buffer, (size_t)segsize);
 
        wr_index += segsize;
 
        wr_buf[wr_index] = '\0';
 
        return segsize;
}
 
int main(void)
{
        CURL *curl;
        CURLcode ret;
        int wr_error = 0;
 
        curl = curl_easy_init();
        if (curl == NULL) {
                fprintf(stderr, "curl_easy_init failed.\n");
                return 1;
        }
 
        curl_easy_setopt(curl, CURLOPT_URL, "www.google.co.jp");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&wr_error);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
 
        //
        ret = curl_easy_perform(curl);
 
        printf("ret=%d (write_error=%d)\n", ret, wr_error);
 
        if (ret == 0) {
                printf("%s\n", wr_buf);
        }
 
        curl_easy_cleanup(curl);
 
        return 0;
}
```

続いてC++。

```cpp:libcurl_test.cpp
#include <string> 
#include <iostream> 
#include <curl/curl.h> 
 
using namespace std;
 
size_t callbackWrite(char *ptr, size_t size, size_t nmemb, string *stream)
{
        int dataLength = size * nmemb;
        stream->append(ptr, dataLength);
        return dataLength;
}
 
int main()
{
        CURL *curl;
        CURLcode ret;
 
        curl = curl_easy_init();
        string chunk;
 
        if (curl == NULL) {
                cerr << "curl_easy_init() failed" << endl;
                return 1;
        }
 
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.co.jp/");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callbackWrite);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);
        ret = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
 
        if (ret != CURLE_OK) {
                cerr << "curl_easy_perform() failed." << endl;
                return 1;
        }
 
        cout << chunk << endl;
 
        return 0;
}
```
ある要素を上下左右で中央寄せ

cssで上下左右について中央寄せする方法をメモしときます。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="css/app.css" media="all"></head>
<body>
  <div id="wrapper">
    <div id="content">
      <div>aaaaaaaaaaaaaaaaaa</div>
      <div>bbbbbbbbbbbbbbbbbb</div>
      <div>
        <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQua0NllMioghppch0ZR7ksnoPAQ9R05DTE7_jDCSJdRHFCYeVbVQ"></div>
      <div>cccccccccccccccccc</div>
    </div>
  </div>
</body>
</html>
```

```css:app.css
#wrapper{
  display: table-cell;
  vertical-align: middle;
  text-align:center;
  width: 700px;
  height: 500px;
  border: medium solid #ff00ff;
}

#content{
  display: inline;
}
```

`#wrapper`に対して`#content`を中央寄せする場合は、
`#wrapper`に
  `display: table-cell;
  vertical-align: middle;
  text-align:center;`
を指定し、
`#content`に
`display: inline;`
を指定すればうまく行った。

___

`display: inline;`
だとwidthとかが変更できなくなるので、`display: inline-block;` の方が汎用性があるかもしれない。
Scala で break文

# Scala にも break はある
Scala2.8.0からは break が標準でサポートされています。
JavaやCと違い、Scalaの break は制御構文ではなくて、例外とブロックを使ったライブラリによる実装となっています。

## 使い方
### Breaksをインポートする
```scala:
import scala.util.control.Breaks
```

### Breaksのインスタンスを作成する
これがbreakによる脱出の境界/スコープを定めることになります。

```scala:
val b = new Breaks
```

### インスタンスを明示したbreakの書き方
```scala:
b.breakable {
  for (x <- 1 to 100) {
    println(x)
    if (x == 50) b.break
  }
}
```

### もっと簡潔に書きたい
importを使って省略します。

```scala:
import b.{breakable,break}

breakable {
  ....
  break
}
```

### 脱出するbreakableは明示によって外側のものも選べる
```scala:
val b1 = new Breaks
val b2 = new Breaks

b1.breakable {
  for (x <- 1 to 100) {
    b2.breakable {
      for (y <- 1 to 100) {
        println(y)
        if (y == 10) b1.break
      }
    }
  }
}
```

b2のなかから一気にb1を脱出しています。

## 仕組みと注意点
Breaksのソースはとても分かり易いので、Predef読解に挑んで <:< などで撃沈した人も安心して読めます。

breakは、実際のところ例外(固有のインスタンス)をスローしているだけで、breakableはその例外をキャッチして自分のインスタンスの所有する例外インスタンスかどうかを判断しているだけです。

なので、たとえば以下のコードは意図したように動作しません。

```scala:
  breakable {
    try {
      break
    } catch {
      case a: Throwable => println("caught!")
    }
  }
```

tryから一気にbreakableの外に出たいところですが、この例だと例外がキャッチされてしまい、そのあとの処理も続行してしまいます。

breakに用いられている例外は Throwableの子孫です(Exceptionの子孫ではありません)

## continueはないの?
まあやっていることは同じですが、いらないんじゃないかと。
そもそもbreakは標準ライブラリでも用いられてはいるものの、これもいらないと思います。そんなに見た目きれいになりません。広域脱出のほうが見やすいってことも多いとは思いますので使いようかな？
MinGWでSilver Searcher(ag.exe)をビルドする方法。


下記の手順でビルドした実行ファイルをGithubにあげました。
もし、ビルドするのがめんどくさかったら使ってください。

https://github.com/rbtnn/ag4mingw

====

## 必要なもの

* https://github.com/ggreer/the_silver_searcher
* [pcre-x86-mingw4-8.21-src.tar.bz2](http://sourceforge.jp/projects/sfnet_kde-windows/downloads/pcre/8.21/pcre-x86-mingw4-8.21-src.tar.bz2/)
* [pcre-x86-mingw4-8.21-bin.tar.bz2](http://sourceforge.jp/projects/sfnet_kde-windows/downloads/pcre/8.21/pcre-x86-mingw4-8.21-bin.tar.bz2/)
* [zlib-x86-mingw4-1.2.6-1-lib.tar.bz2](http://sourceforge.jp/projects/sfnet_kde-windows/downloads/zlib/1.2.6-1/zlib-x86-mingw4-1.2.6-1-lib.tar.bz2/)
* [zlib-x86-mingw4-1.2.6-1-bin.tar.bz2](http://sourceforge.jp/projects/sfnet_kde-windows/downloads/zlib/1.2.6-1/zlib-x86-mingw4-1.2.6-1-bin.tar.bz2/)

## 手順

+ ggreer/the_silver_searcherをクローンし、c9c2b5b をcheckoutする。（最近のコミットだとうまくいかないらしい。下のコメント欄参照）

```sh:
git clone git://github.com/ggreer/the_silver_searcher.git
cd the_silver_searcher
git checkout c9c2b5b 
```

+ pcre-x86-mingw4-8.21-src.tar.bz2内の`pcre.h.generic`と`config.h.generic`を.genericを外して`the_silver_searcher/src`内にコピーする。

* zlib-x86-mingw4-1.2.6-1-lib.tar.bz2内の`include/zconf.h`と`include/zlib.h`を`the_silver_searcher/src`内にコピーする。

* pcre-x86-mingw4-8.21-bin.tar.bz2内の`bin/libpcre.dll`を`the_silver_searcher`内にコピーする。

* zlib-x86-mingw4-1.2.6-1-bin.tar.bz2内の`bin/libz.dll`を`the_silver_searcher`内にコピーする。

* the_silver_searcher/Makefile.w32を以下のように書き換える。

```:make
- LIBS = -lz -lpthread -lpcre -lshlwapi
+ LIBS =  ./libz.dll ./libpcre.dll -lpthread  -lshlwapi
```

* the_silver_searcherに移動してコマンドプロンプトからmakeする。

```:shell
C:/Users/rbtnn/Desktop/the_silver_searcher>ls
LICENSE       README.md       doc          the_silver_searcher.spec
Makefile.am   ag.bashcomp.sh  libpcre.dll
Makefile.w32  build.sh        libz.dll
NOTICE        configure.ac    src

C:/Users/rbtnn/Desktop/the_silver_searcher>ls src
config.h      ignore.h  options.c  print.h    search.h  zconf.h
decompress.c  log.c     options.h  scandir.c  uthash.h  zlib.h
decompress.h  log.h     pcre.h     scandir.h  util.c
ignore.c      main.c    print.c    search.c   util.h

C:/Users/rbtnn/Desktop/the_silver_searcher>mingw32-make -f Makefile.w32
gcc -c -O2 -Isrc src/decompress.c -o src/decompress.o
gcc -c -O2 -Isrc src/ignore.c -o src/ignore.o
gcc -c -O2 -Isrc src/log.c -o src/log.o
gcc -c -O2 -Isrc src/main.c -o src/main.o
gcc -c -O2 -Isrc src/options.c -o src/options.o
gcc -c -O2 -Isrc src/print.c -o src/print.o
gcc -c -O2 -Isrc src/scandir.c -o src/scandir.o
gcc -c -O2 -Isrc src/search.c -o src/search.o
gcc -c -O2 -Isrc src/util.c -o src/util.o
gcc -o ag.exe src/decompress.o src/ignore.o src/log.o src/main.o src/options.o s
rc/print.o src/scandir.o src/search.o src/util.o ./libz.dll ./libpcre.dll -lpthr
ead  -lshlwapi

C:/Users/rbtnn/Desktop/the_silver_searcher>ls
LICENSE       README.md       configure.ac  src
Makefile.am   ag.bashcomp.sh  doc           the_silver_searcher.spec
Makefile.w32  ag.exe          libpcre.dll
NOTICE        build.sh        libz.dll

C:/Users/rbtnn/Desktop/the_silver_searcher>
```
textareaのコンテンツを全て印刷する


コンテンツ量可変のtextareaを含むWebページを印刷したときに, textareaのコンテンツ全てを印刷可能にする方法をメモしておきます.　この方法でできることに気づいて試したのは半年くらい前で, 今回
動作確認をせずに書いているのでもしかしたら, 間違っているかも. 動かないなどあれば, 修正します.

## HTML側
``` form.html
<div class="textarea_content">
  <div class="textarea_print" id="hoge_print"><?php echo $hoge; ?></div>
  <textarea id="hoge" data-printdiv="hoge_print"><?php echo $hoge; %></textarea>
</div>
```
対象となるtextareaと並列にdivタグで同じ内容を持つ要素を作成しておき, それらをラップする形の構造です.

## JS側
内側のdivタグとtextareaのコンテンツの中身を同期します. divタグ側が勝手に変わることはないはずなので, textareaのonchangeイベントで, divタグ側にコピーする処理になります. ただ, 下記のコードそのままの場合は, 改行処理がうまくいかないはず.

``` script.js
$(".textarea_content textarea").on("change", function(evt) {
    var target = this.dataset.printdiv;
    var value = this.value;
    document.getElementById(target).innerHTML = value;
});
```

## CSS側
``` screen.css
.textarea_content .textarea_print {
    display: none;
}

.textarea_content textarea {
    display: block;
}
```

``` print.css
.textarea_content .textarea_print {
    display: block;
}
.textarea_content textarea {
    display: none;
}
```
画面表示用CSSでは, divタグ側を非表示にしtextareaを表示状態にします. 逆に印刷用CSSでは, divタグ側を表示状態にしtextareaを非表示にします.

## まとめ
基本的な考え方は分かってもらえたかなと思いますが, 念のため.

- 画面上には, ```textarea```と```div```で, 2つコンテンツを入れる要素を作成する.
- JavaScriptを使って, ```textarea```と```div```内のコンテンツを同期する.
- 画面用CSSでは, ```div```タグを非表示にし```textarea```を表示状態に. 印刷用CSSでは, ```div```タグを表示にし```textarea```を非表示にする.
pull requestを自分がもっている一つのリポジトリだけで試す

# GitHubで自作自演pull request！

## pull requestを送る相手がいないなら　自分に送ればいいじゃない？

他人にpull requestするの怖い・・・
そう思っていた時期が私にもあったというか今でも怖いので、色々自分でさわれるように自分に向かって投げてみました。

[GitHubで一人pull requestを試してみる手順]
(https://github.com/kyanro/github-knowledge/blob/master/%E4%B8%80%E4%BA%BApull-request%E6%89%8B%E9%A0%86.md)

実際に自分から自分へ送ってみたpull requestいくつか
[その一](https://github.com/kyanro/github-knowledge/pull/3)
[その弐:rejectされてみたり](https://github.com/kyanro/github-knowledge/pull/4)
[その参](https://github.com/kyanro/github-knowledge/pull/5)

### 自分でやってみて気になった点
* コメントを書く場所
* rejectされた後にもう一度pull requestを送る場合の作法

### コメントを書く場所について
やっていて思ったのですが、pull requestを送った後にコメントでやり取りする場合って
`コミット上` `pull requestのfiles changed上`のどちらにコメントするのがいいんでしょうか。

#### `pull request上`のメリット
+ discussion上でコメントしたコードの前後が見れてわかりやすい
+ pull request全体に対してコメントができる

#### `コミット上`のメリット
+ discussion上にコメントしたコードの前後が表示される代わりにリンクが表示されるので
コメントの流れに集中できる
+ blameで追いかけるときに、コミット上にコメントが書いてあると吹き出しマークで教えてくれる([こんなかんじ](https://github.com/kyanro/github-knowledge/blame/master/%E4%B8%80%E4%BA%BApull-request%E6%89%8B%E9%A0%86.md))

なんとなく、pull request全体の流れに対するコメント以外はコミット上にやったほうがいいのかなーとも思うのですが、実際のプロジェクトで利用している人たちはどっちにコメントしているのか興味があるのでぜひ教えていただけたらと思います。

### rejectされた後にもう一度pull requestを送る場合の作法について
rejectされた場合はブランチ削除してから同じ名前のブランチでpull request送ってもいいのか？
それとも名前をかえたほうがいいのか(`1stPullRequest → 1stPullRequest2`みたいに。)

なんとなく同じ名前でもよさそうな気はするんですが実際のプロジェクトだとどんな運用がされているのか興味があるのでぜひ教えていただけたらと思います。

### 追伸 自作自演pull requestについて
最初は寂しくて泣きそうでしたが、やってみると意外と頭のなかで綺麗に整理されて良い感じでした。
**もしかしたら一人pull request意外とイケてるかもしれない**
と感じたのでしばらくは続けてみようと思います(｀・ω・´)
新しい twitter gem で proxy を指定する

検索すると古い記事にて `Twitter.config` から指定できるとあるが，少なくとも4.6.2では動作しない．  

```ruby
@t = Twitter::Client.new
@t.connection_options[:proxy] = 'http://proxy:8080'
 ```

とやれば指定できる．自分は定型句として

```yaml:auth.yaml
consumer_key: hoge
consumer_secret: fuga
oauth_token: foo
oauth_token_secret: bar
```

と書いた auth.yaml を用意して

```ruby:base.rb
require 'twitter'
class Base
  def initialize
    config = YAML.load_file("./auth.yaml")
    @t = Twitter::Client.new
    config.each_pair do |k, v|
      @t.send("#{k}=", v)
    end
    @t.connection_options[:proxy] = 'proxy:8080'
  end
end
```

という感じで初期化している．
さくらVPSにzshをインストール

さくらVPSにzshをインストールします。必須ですよね(^^)

### インストール

````
[funya@whogex ~]$ sudo yum install zsh
````

### 今のログインシェルの確認

````
[funya@whogex bin]$ grep funya /etc/passwd
funya:x:500:500::/home/funya:/bin/bash
[funya@whogex bin]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/zsh
````

利用可能なシェルリストにzshが入っているので、ログインシェルを変更します。

````
[funya@whogex bin]$ chsh
funya のシェルを変更します。
パスワード:
新しいシェル [/bin/bash]: /bin/zsh
シェルを変更しました。
````

さて、次にzshをカスタマイズしたいのですが、*.zshrc* というファイルをいじります。だいたい、ホームディレクトリにありますが、最初はないかもしれません。

````
[funya@whogex ~]$ ls -a
.   .bash_history  .bash_profile  .cpan   .mysql_history  .pki  .viminfo
..  .bash_logout   .bashrc        .cpanm  .ssh  latest-ja.zip 
`````

ないですね。

````
[funya@whogex ~]$ vim .zshrc
以下の2行を書き足す。
----
autoload -U compinit
compinit
----
````

再起動したら一旦完了なんですが、、、

````
[funya@whogex ~]$ source .zshrc
-bash: autoload: コマンドが見つかりません
-bash: compinit: コマンドが見つかりません
````

む？
あ、chsh はログインシェルの変更だから、今のシェルを変更しなきゃね。

````
[funya@whogex ~]$ zsh
[funya@whogex ~]$ source .zshrc
````

とりあえず、これで *zsh* が動きます。
カスタマイズはこれから。
.vimrcをいじらずにvimで読み込んだファイルの文字化けを解消する方法

vimをインストールして（ **.vimrc** も定義せず）いざファイル操作となったとき、テキストが文字化けしていることがあったりします。大体が **vim** がエンコードに失敗しているのが原因です。 **Sfhit_JIS** とか **EUC** とかで書かれたテキストがエンコードに失敗したとき *c(`Д´と⌒ｃ)つ彡 ﾔﾀﾞﾔﾀﾞ*

**会社で共用で使っている鯖** なんかだと簡単に **.vimrc** もいじれないので、応急処置？としてこんな手がありました。
エンコードを指定して再読み込みさせようってことです。

````
:e ++enc=shift_jis
````

面倒くさいけど、知っておくと冷静に対応できます(((( ´,,_ゝ｀)))) ﾌﾟﾌﾟｯ ﾌﾟﾙﾌﾟﾙｯ

ref)
- http://blog.dc-d.jp/?p=119
- http://nanasi.jp/articles/howto/file/open-with-format.html
CanCanを使ってリソースと無関係なコントローラの権限チェックする


CanCanを使って権限チェックを実装している場合、以下のように基底のコントローラで権限チェックを行うようになっていると思います。

```ruby:base_controller.rb
class BaseController < ApplicationController
  # 権限チェック
  authorize_resource

  # いろいろな共通ロジック …

end
```

REST の原則に従ってリソース単位でコントローラが定義されていれば、これで問題なく権限チェックが行えます。

しかし、以下のようにリソースと無関係なコントローラを定義したい場合もあると思います。

```ruby:hoge_upload_controller.rb
class HogeUploadController < BaseController
	def index
    end
end
```

しかし、そのようなコントローラを定義したとたん、前述の authorize_resource が存在しないリソースに対して権限チェックしようとして、以下のようなエラーが発生します。

```
Rendering 500 with exception: uninitialized constant HogeUpload
```

この問題を回避するためには、該当コントローラについては authorize_resource を行わないように修正する必要があります。
また、その場合は自前で権限チェックの処理をフィルタなりで実装する必要があります。
たとえば、前述の hoge_upload_controller.rb は以下のように修正します。

```ruby:hoge_upload_controller.rb
class HogeUploadController < BaseController
  # 権限チェックをスキップ
  skip_authorize_resource
  # 自前で権限チェック
  before_filter :check_authorization

  def index
  end

  private
  def check_authorization
     authorize! :manage, :all
  end
end
```

## 参考

Authorizing controller actions
https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions

Non RESTful Controllers
https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers
require.js の require関数が同期的に動く理由

require.jsで、他のモジュールに依存するモジュールを、次の２つのような書き方で定義できる。（他にもある）

```javascript
define(['a'], function(a){
  // モジュールaがコールバックに渡ってくる
});
```

```javascript
define(function(require){
  // モジュールaをロード
  var a = require("a");
})
```

下の書き方はなんとなく前から知ってたんだけど、クライアント側じゃ仕組み的に無理くね？と思ってたから、勘違いだと思ってた。
しかし下の書き方はできるのであった。同期っぽく読み込める。
a.js は非同期で読み込まれてるはずなのに、aに代入されてる。why?

ソースを覗いてみると。。

https://github.com/jrburke/requirejs/blob/master/require.js#L1965

```javascript
...
            if (callback.length) {
                callback
                    .toString()
                    .replace(commentRegExp, '')
                    .replace(cjsRequireRegExp, function (match, dep) {
                        deps.push(dep);
                    });
...
```

わーお、予めdefineが呼ばれた時点で、中身の関数を１度文字列にして、それを解析して読むべきモジュールを予めロードしていた。

というか、 require.jsのサイトにも書いてありましたね。

http://requirejs.org/docs/api.html#cjsmodule

>This wrapper relies on Function.prototype.toString() to give a useful string value of the function contents. This does not work on some devices like the PS3 and some older Opera mobile browsers. Use the optimizer to pull out the dependencies in the array format for use on those devices.

昔のOperaだと動かないらしい。optimizer(r.jsのこと？)をつかえば、配列でフォーマットされる方に変換されるとのこと。

Function.prototype.toString を使ってrequire関数を呼んでる場所を解析している関係で、以下のコードは動かないことに注意

```javascript
define(function(require){
  var superRequire = require;
  var a = superRequire('a');  // モジュールはないと言われる
  require = function(arg){ ... }
  require("abcd");  // 意図せず abcd.js の読み込みが走る
})
```

require関数を使うほうが可読性が高いので、使っていこうと思う。
[ZF1] application.iniにリソースオートローダの設定を記述する

ディレクトリが以下のように構成されている場合、

    application/
        configs/
            application.ini
        controllers/
        models/
            User.php (Model_User)
            User/
                Abstract.php (Model_User_Abstract)
        plugins/
        services/
            User.php (Service_User)

Bootstrapなどで

``` Bootstrap.php
public function _initAutoloader() {
    $autoloader = new Zend_Loader_Autoloader_Resource(
        'basePath'  => APPLICATION_PATH,
        'namespace' => '',
    ));
    $autoloader
        ->addResourceType('Model', 'models/', 'Model')
        ->addResourceType('Service', 'services/', 'Service');
}
```

のようにリソースオートローダを初期化すれば、__models/User.php__と__models/User/Abstract.php__、__services/User.php__をオートロードできる。

これだけでも別にOKだけど、ディレクトリの場所は簡単に変更できるようにしておきたい。

なのでリソースプラグインを利用してapplication.iniから設定を読み込み、リソースオートローダを初期化する。

``` application/plugins/Autoloader.php
<?php

class Plugin_Autoloader extends Zend_Application_Resource_ResourceAbstract {

	public function init() {
		$options = $this->getOptions();

		$autoloader = new Zend_Loader_Autoloader_Resource(array(
			'basePath'  => $options['basePath'],
			'namespace' => $options['namespace'],
		));
		unset($options['basePath']);
		unset($options['namespace']);

		foreach ($options as $prefix => $path) {
			$autoloader->addResourceType($prefix, $path, $prefix);
		}
                return $autoloader;
	}

}
```

``` application/configs/application.ini
pluginPaths.Plugin = APPLICATION_PATH "/plugins"
resources.autoloader.basePath  = APPLICATION_PATH
resources.autoloader.namespace = ""
resources.autoloader.Model     = "models"
resources.autoloader.Service   = "services"
```

ちなみに（Table Data GatewayとかData MapperとかServiceとかの）使い回し可能なインスタンスを一々生成するのは無駄なので、たとえば__Service_User__を呼び出す場合、

```
$autoloader = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("autoloader");
$userService = $autoloader->load('User', 'service');
```

とする（Zend_Loader_Autoloader_ResourceはRegistryおよびFactoryとして動作する）。

記述が長いのでZend_Registryあたりに$autoloaderを保存しとくと楽かも。
PHPの日付処理


公式 http://jp1.php.net/manual/ja/function.date.php

MySQLの日付書式で現在の日付を表示する

```php:
echo date('Y-m-d H:i:s');

2013-04-17 23:01:01 ←こんな感じ
```

1日前とかの計算

```php:
// UNIX timestampで返る
echo strtotime("-1 day");
// 基準日を設定できる
echo strtotime("-1 day", unix_timestamp);

// フォーマットする
echo date("Y-m-d", strtotime("-1 day"));
```
MySQLへの入出力


## 出力

テーブルの内容をファイルへ出力

```sql:
SELECT * INTO OUTFILE 'hoge.txt' FROM 出力元テーブル ;
```

### ダンプ

すべてのテーブルを中身無しでダンプする

```bash:
mysqldump --no-data world > world.sql
```

上記をsedでAUTO_INCREMENT指定を強制除外

```bash:
mysqldump --no-data world | sed -e 's/AUTO_INCREMENT=[0-9]*//' > world.sql
```

## 入力

ファイルを読み込む

```sql:
source hoge.sql
```


ファイルからテーブルへ読込
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html

```sql:
LOAD DATA INFILE 'hoge.txt' INTO TABLE 転送先テーブル;
LOAD DATA INFILE 'hoge.txt' REPLACE INTO TABLE 転送先テーブル;
LOAD DATA INFILE 'hoge.txt' IGNORE INTO TABLE 転送先テーブル;
```
カラム指定で読込

```sql:
LOAD DATA INFILE 'hoge.txt' INTO TABLE 転送先テーブル (column1, column2);
```
文字コード指定で読込(MySQL5.1から)

```sql:
LOAD DATA INFILE 'hoge.txt' INTO TABLE 転送先テーブル CHARACTER SET sjis (column1, column2);
```

LOCALをつけるとクライアントで読込になるので、ファイルがローカルにないとダメ

```sql:
LOAD DATA LOCAL INFILE 'hoge.txt' INTO TABLE 転送先テーブル;
```